From 0e8fb56199a9a0d6538dab53a1edbb6f800ffd13 Mon Sep 17 00:00:00 2001 From: Mario Fusco Date: Mon, 15 Jun 2015 18:50:00 +0200 Subject: [PATCH] [DROOLS-818] register declared listeners on StatelessKieSession --- .../kie/builder/impl/KieContainerImpl.java | 5 +- .../drools/compiler/kie/util/CDIHelper.java | 76 ++++++++++++++----- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieContainerImpl.java b/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieContainerImpl.java index 033a34808c3..24b24aa0bbe 100644 --- a/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieContainerImpl.java +++ b/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieContainerImpl.java @@ -574,11 +574,10 @@ public KieSession newKieSession(String kSessionName, Environment environment, Ki log.error("Unknown KieBase name: " + kSessionModel.getKieBaseModel().getName()); return null; } + KieSession kSession = kBase.newKieSession( conf != null ? conf : getKnowledgeSessionConfiguration(kSessionModel), environment ); wireListnersAndWIHs(kSessionModel, kSession); - registerLoggers(kSessionModel, kSession); - kSessions.put(kSessionName, kSession); return kSession; } @@ -616,7 +615,9 @@ public StatelessKieSession newStatelessKieSession(String kSessionName, KieSessio log.error("Unknown KieBase name: " + kSessionModel.getKieBaseModel().getName()); return null; } + StatelessKieSession statelessKieSession = kBase.newStatelessKieSession( conf != null ? conf : getKnowledgeSessionConfiguration(kSessionModel) ); + wireListnersAndWIHs(kSessionModel, statelessKieSession); registerLoggers(kSessionModel, statelessKieSession); statelessKSessions.put(kSessionName, statelessKieSession); return statelessKieSession; diff --git a/drools-compiler/src/main/java/org/drools/compiler/kie/util/CDIHelper.java b/drools-compiler/src/main/java/org/drools/compiler/kie/util/CDIHelper.java index f69031e2dc0..e2ea652720e 100644 --- a/drools-compiler/src/main/java/org/drools/compiler/kie/util/CDIHelper.java +++ b/drools-compiler/src/main/java/org/drools/compiler/kie/util/CDIHelper.java @@ -1,14 +1,5 @@ package org.drools.compiler.kie.util; -import java.lang.annotation.Annotation; -import java.util.Map; -import java.util.Set; - -import javax.enterprise.inject.spi.Bean; -import javax.enterprise.inject.spi.BeanManager; -import javax.naming.InitialContext; -import javax.naming.NamingException; - import org.drools.core.impl.InternalKnowledgeBase; import org.drools.core.util.MVELSafeHelper; import org.kie.api.builder.model.KieSessionModel; @@ -19,11 +10,20 @@ import org.kie.api.event.rule.AgendaEventListener; import org.kie.api.event.rule.RuleRuntimeEventListener; import org.kie.api.runtime.KieSession; +import org.kie.api.runtime.StatelessKieSession; import org.kie.api.runtime.process.WorkItemHandler; import org.mvel2.MVEL; import org.mvel2.ParserConfiguration; import org.mvel2.ParserContext; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import java.lang.annotation.Annotation; +import java.util.Map; +import java.util.Set; + public class CDIHelper { public static void wireListnersAndWIHs(KieSessionModel model, KieSession kSession) { @@ -43,17 +43,7 @@ private static void wireListnersAndWIHs(BeanCreator beanCreator, KieSessionModel ClassLoader cl = ((InternalKnowledgeBase)kSession.getKieBase()).getRootClassLoader(); for (ListenerModel listenerModel : model.getListenerModels()) { - Object listener; - try { - listener = beanCreator.createBean(cl, listenerModel.getType(), listenerModel.getQualifierModel()); - } catch (Exception e) { - try { - listener = fallbackBeanCreator.createBean(cl, listenerModel.getType(), listenerModel.getQualifierModel()); - } catch (Exception ex) { - throw new RuntimeException("Cannot instance listener " + listenerModel.getType(), e); - } - - } + Object listener = createListener( beanCreator, fallbackBeanCreator, cl, listenerModel ); switch(listenerModel.getKind()) { case AGENDA_EVENT_LISTENER: kSession.addEventListener((AgendaEventListener)listener); @@ -79,7 +69,53 @@ private static void wireListnersAndWIHs(BeanCreator beanCreator, KieSessionModel } kSession.getWorkItemManager().registerWorkItemHandler(wihModel.getName(), wih ); } + } + + public static void wireListnersAndWIHs(KieSessionModel model, StatelessKieSession kSession) { + wireListnersAndWIHs(BeanCreatorHolder.beanCreator, model, kSession); + } + + public static void wireListnersAndWIHs(BeanManager beanManager, KieSessionModel model, StatelessKieSession kSession) { + wireListnersAndWIHs(new CDIBeanCreator(beanManager), model, kSession); + } + + public static void wireListnersAndWIHs(KieSessionModel model, StatelessKieSession kSession, Map parameters) { + wireListnersAndWIHs(new MVELBeanCreator(parameters), model, kSession); + } + + private static void wireListnersAndWIHs(BeanCreator beanCreator, KieSessionModel model, StatelessKieSession kSession) { + BeanCreator fallbackBeanCreator = new ReflectionBeanCreator(); + ClassLoader cl = ((InternalKnowledgeBase)kSession.getKieBase()).getRootClassLoader(); + + for (ListenerModel listenerModel : model.getListenerModels()) { + Object listener = createListener( beanCreator, fallbackBeanCreator, cl, listenerModel ); + switch(listenerModel.getKind()) { + case AGENDA_EVENT_LISTENER: + kSession.addEventListener((AgendaEventListener)listener); + break; + case RULE_RUNTIME_EVENT_LISTENER: + kSession.addEventListener((RuleRuntimeEventListener)listener); + break; + case PROCESS_EVENT_LISTENER: + kSession.addEventListener((ProcessEventListener)listener); + break; + } + } + } + private static Object createListener( BeanCreator beanCreator, BeanCreator fallbackBeanCreator, ClassLoader cl, ListenerModel listenerModel ) { + Object listener; + try { + listener = beanCreator.createBean(cl, listenerModel.getType(), listenerModel.getQualifierModel()); + } catch (Exception e) { + try { + listener = fallbackBeanCreator.createBean(cl, listenerModel.getType(), listenerModel.getQualifierModel()); + } catch (Exception ex) { + throw new RuntimeException("Cannot instance listener " + listenerModel.getType(), e); + } + + } + return listener; } private static class BeanCreatorHolder {