/** * Adds new Classes to {@link #ruleClasses}. * * @param ruleClasses * New values for {@link #ruleClasses} * @return DiagnosisEngineConfiguration itself */ public DiagnosisEngineConfiguration<I, R> addRuleClasses(Class<?>... ruleClasses) { addRuleClasses(Arrays.asList(checkNotNull(ruleClasses, "Array of rule classes must not be null."))); return this; }
/** * Adds a list of new {@link ISessionCallback}s {@link #callbacks}. * * @param sessionCallbacks * New entries for {@link #callbacks} * @return DiagnosisEngineConfiguration itself */ public DiagnosisEngineConfiguration<I, R> addSessionCallbacks(List<ISessionCallback<R>> sessionCallbacks) { for (ISessionCallback<R> callback : sessionCallbacks) { addSessionCallback(callback); } return this; }
@Override public Session<I, R> makeObject() throws Exception { return new Session<>(ruleDefinitions, configuration.getResultCollector(), ReflectionUtils.tryInstantiate(configuration.getStorageClass())); }
/** * Default constructor to create a new DiagnosisEngine instance. * * @param configuration * The {@link DiagnosisEngineConfiguration} to be used. Must not be null. * @throws DiagnosisEngineException * If the provided configuration is not valid. */ public DiagnosisEngine(DiagnosisEngineConfiguration<I, R> configuration) throws DiagnosisEngineException { this.configuration = checkNotNull(configuration, "The configuration must not be null."); this.configuration.validate(); this.sessionPool = new SessionPool<>(configuration); // Wrap in listing executor this.sessionExecutor = MoreExecutors.listeningDecorator(configuration.getExecutorService()); }
@Test public void testwithError() throws DiagnosisEngineException { final List<DefaultSessionResult<String>> results = new ArrayList<>(); final List<Throwable> exceptions = new ArrayList<>(); DiagnosisEngineConfiguration<String, DefaultSessionResult<String>> configuration = new DiagnosisEngineConfiguration<String, DefaultSessionResult<String>>().setNumSessionWorkers(1) .addRuleClasses(RuleA.class, RuleB.class, RuleC.class, RuleE.class, RuleD.class).setStorageClass(DefaultRuleOutputStorage.class) .setResultCollector(new DefaultSessionResultCollector<String>()).addSessionCallback(new ISessionCallback<DefaultSessionResult<String>>() { @Override public void onSuccess(DefaultSessionResult<String> result) { results.add(result); } @Override public void onFailure(Throwable t) { exceptions.add(t); } }); configuration.setShutdownTimeout(6000); DiagnosisEngine<String, DefaultSessionResult<String>> diagnosisEngine = new DiagnosisEngine<>(configuration); String input = "Trace"; diagnosisEngine.analyze(input); diagnosisEngine.shutdown(true); assertThat(exceptions, hasSize(1)); } }
@Test(expectedExceptions = { IllegalArgumentException.class }) public void nullRules() throws Exception { when(config.getRuleClasses()).thenReturn(null); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); sessionFactory.makeObject(); }
DiagnosisEngineConfiguration<InvocationSequenceData, List<ProblemOccurrence>> configuration = new DiagnosisEngineConfiguration<InvocationSequenceData, List<ProblemOccurrence>>(); configuration.setNumSessionWorkers(numberOfSessionWorker); configuration.addRuleClasses(ruleClasses); configuration.setResultCollector(new ProblemOccurrenceResultCollector()); configuration.addSessionCallback(new DelegatingResultHandler());
/** * 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()); }
/** * Adds new Classes to {@link #ruleClasses}. * * @param ruleClasses * New values for {@link #ruleClasses} * @return DiagnosisEngineConfiguration itself */ public DiagnosisEngineConfiguration<I, R> addRuleClasses(Collection<Class<?>> ruleClasses) { checkNotNull(ruleClasses, "Set of rule classes must not be null."); for (Class<?> ruleClass : ruleClasses) { addRuleClass(ruleClass); } return this; }
@Test public void testEngine() throws DiagnosisEngineException { final List<DefaultSessionResult<String>> results = new ArrayList<>(); final List<Throwable> exceptions = new ArrayList<>(); DiagnosisEngineConfiguration<String, DefaultSessionResult<String>> configuration = new DiagnosisEngineConfiguration<String, DefaultSessionResult<String>>().setNumSessionWorkers(1) .addRuleClasses(RuleA.class, RuleB.class, RuleC.class, RuleE.class).setStorageClass(DefaultRuleOutputStorage.class).setResultCollector(new DefaultSessionResultCollector<String>()) .addSessionCallback(new ISessionCallback<DefaultSessionResult<String>>() { @Override public void onSuccess(DefaultSessionResult<String> result) { results.add(result); } @Override public void onFailure(Throwable t) { exceptions.add(t); } }); configuration.setShutdownTimeout(6000); DiagnosisEngine<String, DefaultSessionResult<String>> diagnosisEngine = new DiagnosisEngine<>(configuration); String input = "Trace"; diagnosisEngine.analyze(input); diagnosisEngine.shutdown(true); assertThat(exceptions, empty()); assertThat(results.get(0).getEndTags().get("C"), hasSize(1)); assertThat(results.get(0).getEndTags().get("C").iterator().next().getValue(), equalTo((Object) ((input + input).length() + 2))); assertThat(results.get(0).getEndTags().get("E"), hasSize(1)); assertThat(results.get(0).getEndTags().get("E").iterator().next().getValue(), equalTo((Object) (input + "E"))); }
@Test(expectedExceptions = { IllegalArgumentException.class }) public void missingRules() throws Exception { when(config.getRuleClasses()).thenReturn(Collections.<Class<?>> emptySet()); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); sessionFactory.makeObject(); }
@Test(expectedExceptions = { NullPointerException.class }) public void nullStorage() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(null); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return null; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); sessionFactory.makeObject(); } }
@Test(expectedExceptions = { NullPointerException.class }) public void nullResultCollector() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(null); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); sessionFactory.makeObject(); }
@Test public void test() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); Session<String, DefaultSessionResult<String>> session = sessionFactory.makeObject(); session.activate("", Collections.<String, Object> emptyMap()); sessionFactory.passivateObject(session); assertThat(session.getState(), equalTo(State.PASSIVATED)); } }
@Test public void test() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); Session<String, DefaultSessionResult<String>> session = sessionFactory.makeObject(); session.activate("", Collections.<String, Object> emptyMap()); sessionFactory.destroyObject(session); assertThat(session.getState(), equalTo(State.DESTROYED)); } }
@Test public void makeValid() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); Session<String, DefaultSessionResult<String>> session = sessionFactory.makeObject(); assertThat(session.getState(), equalTo(State.NEW)); assertThat(session.getSessionContext().getRuleSet(), empty()); session.activate("input", Collections.<String, Object> emptyMap()); assertThat(session.getState(), equalTo(State.ACTIVATED)); assertThat(session.getSessionContext().getRuleSet(), containsInAnyOrder(Rules.define(RuleA.class, RuleB.class, RuleC.class).toArray())); }