001    package com.hammurapi.review;
002    
003    import java.util.logging.Logger;
004    
005    import org.apache.commons.pool.impl.StackKeyedObjectPool;
006    
007    import com.hammurapi.config.bootstrap.ConfigurationException;
008    import com.hammurapi.config.runtime.FactoryConfig;
009    import com.hammurapi.flow.Flow;
010    import com.hammurapi.reasoning.ForwardReasoningSessionFactory;
011    import com.hammurapi.reasoning.ReasoningException;
012    import com.hammurapi.reasoning.impl.ForwardReasoningSessionFactoryImpl;
013    import com.hammurapi.reasoning.impl.PoolingForwardReasoningSessionFactory;
014    import com.hammurapi.review.util.InspectorSetCompiler;
015    import com.hammurapi.util.SingletonChainingContext;
016    
017    public class SessionPoolingReviewDriver extends ReviewDriverBase {
018            
019            private static final Logger logger = Logger.getLogger(SessionPoolingReviewDriver.class.getName());
020            
021            private int sessionPoolSize;
022    
023            public SessionPoolingReviewDriver(int sessionPoolSize) {
024                    this.sessionPoolSize = sessionPoolSize;
025            }
026    
027            @Override
028            protected ForwardReasoningSessionFactory<Object> createInspectorSetSessionFactory(InspectorSet inspectorSet, FactoryConfig moduleFactoryConfig) throws ConfigurationException, ReasoningException {
029                    logger.fine("Creating a pooling session factory of size "+sessionPoolSize+" for inspector set "+inspectorSet.getName());
030                    StackKeyedObjectPool pool = new StackKeyedObjectPool(sessionPoolSize);
031                    InspectorSetCompiler inspectorSetCompiler = new InspectorSetCompiler();
032                    Flow compiledInspectorSet = inspectorSetCompiler.compile(inspectorSet, moduleFactoryConfig); 
033                    FactoryConfig inspectorSetConfig;
034                    try {
035                            inspectorSetConfig = (FactoryConfig) moduleFactoryConfig.clone();
036                    } catch (CloneNotSupportedException e) {
037                            throw new ConfigurationException(e);
038                    }
039                    inspectorSetConfig.setContext(new SingletonChainingContext<InspectorSet>(InspectorSet.class, inspectorSet, moduleFactoryConfig.getContext()));
040                    ForwardReasoningSessionFactory<Object> master = new ForwardReasoningSessionFactoryImpl<Object>(compiledInspectorSet, inspectorSetConfig);
041                    return new PoolingForwardReasoningSessionFactory<Object>(master, pool);
042            }
043    }