package rocks.inspectit.server.diagnosis.engine.session; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Map; import org.apache.commons.pool.impl.GenericObjectPool; import rocks.inspectit.server.diagnosis.engine.DiagnosisEngineConfiguration; import rocks.inspectit.server.diagnosis.engine.DiagnosisEngineException; /** * Extends GenericObjectPool to enable a parametrized activation of pooled objects. * * @param <I> * The session input type * @param <R> * The expected output type * @author Claudio Waldvogel, Alexander Wert */ public class SessionPool<I, R> extends GenericObjectPool<Session<I, R>> { /** * Default constructor to create a new <code>SessionPool</code>. * * @param engineConfiguration * The top-level {@link DiagnosisEngineConfiguration}. Must not be null! * @throws DiagnosisEngineException * If {@link DiagnosisEngineConfiguration} is invalid. * @see DiagnosisEngineConfiguration */ public SessionPool(DiagnosisEngineConfiguration<I, R> engineConfiguration) throws DiagnosisEngineException { this(engineConfiguration, defaultConfig(engineConfiguration)); } /** * Constructor to create a <code>SessionPool</code> with an additional GenericObjectPool.Config. * * @param engineConfiguration * The DiagnosisEngineConfiguration. Must not be null! * @param poolConfiguration * The GenericObjectPool.Config. Must not be null! * @throws DiagnosisEngineException * If {@link DiagnosisEngineConfiguration} is invalid. * @see DiagnosisEngineConfiguration * @see GenericObjectPool.Config */ public SessionPool(DiagnosisEngineConfiguration<I, R> engineConfiguration, GenericObjectPool.Config poolConfiguration) throws DiagnosisEngineException { super(new SessionFactory<>(checkNotNull(engineConfiguration)), checkNotNull(poolConfiguration)); } // ------------------------------------------------------------- // Methods: Session access // ------------------------------------------------------------- /** * Since we want to activate our Session objects with parameters we need to add an additional * borrowObject method. This method used internally the GenericObjectPool#borrowObject method, * but invokes the parametrized {@link Session#activate(Object, Map<String, ?>)} method to * ensure a proper activation of the {@link Session}. * * @param input * The input object to analyzed * @param variables * The session variables valid for this session execution. * @return An activated and ready to use {@link Session} instance. * @see Session * @see GenericObjectPool * @throws Exception * in case of borrowing the session fails. */ public Session<I, R> borrowObject(I input, Map<String, ?> variables) throws Exception { try { return super.borrowObject().activate(input, variables); } catch (Exception e) { throw new RuntimeException("Failed to borrow object from SessionPool.", e); } } // ------------------------------------------------------------- // Methods: Internals // ------------------------------------------------------------- /** * Utility method to create a default GenericObjectPool.Config with configuration values from * DiagnosisEngineConfiguration. * * @param configuration * The top-level DiagnosisEngineConfiguration * @return A new {@link GenericObjectPool.Config} instance. */ private static GenericObjectPool.Config defaultConfig(DiagnosisEngineConfiguration<?, ?> configuration) { GenericObjectPool.Config config = new GenericObjectPool.Config(); config.whenExhaustedAction = GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION; config.maxActive = configuration.getNumSessionWorkers(); return config; } }