001    package org.apache.tapestry.services.impl;
002    
003    import ognl.ClassResolver;
004    import ognl.Ognl;
005    import ognl.OgnlContext;
006    import ognl.TypeConverter;
007    import org.apache.commons.pool.BasePoolableObjectFactory;
008    
009    /**
010     * Used by {@link ExpressionEvaluatorImpl} to pool {@link ognl.OgnlContext} objects.
011     */
012    public class PoolableOgnlContextFactory extends BasePoolableObjectFactory {
013    
014        private final ClassResolver _resolver;
015    
016        private TypeConverter _typeConverter;
017    
018        public PoolableOgnlContextFactory(ClassResolver resolver, TypeConverter typeConverter)
019        {
020            _resolver = resolver;
021            _typeConverter = typeConverter;
022        }
023    
024        public Object makeObject()
025            throws Exception
026        {
027            return Ognl.createDefaultContext(null, _resolver, _typeConverter);
028        }
029    
030        public void activateObject(Object obj)
031        throws Exception
032        {
033            OgnlContext context = (OgnlContext)obj;
034            
035            if (context.getRoot() != null || context.getValues().size() > 0) {
036                context.clear();
037                context.setRoot(null);
038            }
039        }
040    }