package rocks.inspectit.server.diagnosis.engine.session; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Set; import org.apache.commons.pool.BasePoolableObjectFactory; import rocks.inspectit.server.diagnosis.engine.DiagnosisEngine; import rocks.inspectit.server.diagnosis.engine.DiagnosisEngineConfiguration; import rocks.inspectit.server.diagnosis.engine.DiagnosisEngineException; import rocks.inspectit.server.diagnosis.engine.rule.RuleDefinition; import rocks.inspectit.server.diagnosis.engine.rule.exception.RuleDefinitionException; import rocks.inspectit.server.diagnosis.engine.rule.factory.Rules; import rocks.inspectit.server.diagnosis.engine.util.ReflectionUtils; /** * BasePoolableObjectFactory implementation to create poolable {@link Session} instances. * SessionFactory is used by {@link SessionPool}. * * @param <I> * The session input type * @param <R> * The expected output type * @author Claudio Waldvogel, Alexander Wert * @see BasePoolableObjectFactory * @see SessionPool */ public class SessionFactory<I, R> extends BasePoolableObjectFactory<Session<I, R>> { /** * The top-level {@link DiagnosisEngineConfiguration} configuration. Ths configuration might be * used to configuration the factory. * * @see DiagnosisEngineConfiguration * @see DiagnosisEngine */ private final DiagnosisEngineConfiguration<I, R> configuration; /** * All {@link RuleDefinition} to be passed to the {@link Session}s. The definitions are * extracted from {@link DiagnosisEngineConfiguration#ruleClasses}. */ private final Set<RuleDefinition> ruleDefinitions; /** * Default constructor to create new {@link SessionFactory}s. * * @param configuration * The {@link DiagnosisEngineConfiguration} * @throws DiagnosisEngineException * If {@link DiagnosisEngineConfiguration} is invalid. */ public SessionFactory(DiagnosisEngineConfiguration<I, R> configuration) throws DiagnosisEngineException { this.configuration = checkNotNull(configuration, "Diagnosis engine configuration must not be null."); this.ruleDefinitions = prepareRuleDefinitions(configuration.getRuleClasses()); } // ------------------------------------------------------------- // Interface Implementation: BasePoolableObjectFactory // ------------------------------------------------------------- @Override public Session<I, R> makeObject() throws Exception { return new Session<>(ruleDefinitions, configuration.getResultCollector(), ReflectionUtils.tryInstantiate(configuration.getStorageClass())); } @Override public void passivateObject(Session<I, R> session) throws Exception { session.passivate(); } @Override public void destroyObject(Session<I, R> session) throws Exception { session.destroy(); } // ------------------------------------------------------------- // Methods: Internals // ------------------------------------------------------------- /** * Internal method to transform classes implementing a rule into {@link RuleDefinition}s. * * @param ruleClasses * The classes to be transformed. * @return Set of {@link RuleDefinition}s. * @throws RuleDefinitionException * If any {@link RuleDefinition} is invalid. */ private Set<RuleDefinition> prepareRuleDefinitions(Set<Class<?>> ruleClasses) throws RuleDefinitionException { return Rules.define(ruleClasses); } }