public void testEvent1() { RuleFlowProcess process = new RuleFlowProcess(); process.setId("org.drools.process.event"); process.setName("Event Process"); List<Variable> variables = new ArrayList<Variable>(); Variable variable = new Variable(); variable.setName("event"); ObjectDataType personDataType = new ObjectDataType(); personDataType.setClassName("org.drools.Person"); variable.setType(personDataType); variables.add(variable); process.getVariableScope().setVariables(variables); StartNode startNode = new StartNode(); startNode.setName("Start"); startNode.setId(1); process.addNode(startNode); MilestoneNode milestoneNode = new MilestoneNode(); milestoneNode.setName("Milestone"); milestoneNode.setConstraint("eval(false)"); milestoneNode.setId(2); process.addNode(milestoneNode); new ConnectionImpl( startNode, Node.CONNECTION_DEFAULT_TYPE, milestoneNode, Node.CONNECTION_DEFAULT_TYPE); EventNode eventNode = new EventNode(); EventTypeFilter eventFilter = new EventTypeFilter(); eventFilter.setType("myEvent"); eventNode.addEventFilter(eventFilter); eventNode.setVariableName("event"); eventNode.setId(3); process.addNode(eventNode); final List<String> myList = new ArrayList<String>(); ActionNode actionNode = new ActionNode(); actionNode.setName("Print"); DroolsAction action = new DroolsConsequenceAction("java", null); action.setMetaData( "Action", new Action() { public void execute(ProcessContext context) throws Exception { System.out.println( "Detected event for person " + ((Person) context.getVariable("event")).getName()); myList.add("Executed action"); } }); actionNode.setAction(action); actionNode.setId(4); process.addNode(actionNode); new ConnectionImpl( eventNode, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE); Join join = new Join(); join.setName("XOR Join"); join.setType(Join.TYPE_XOR); join.setId(5); process.addNode(join); new ConnectionImpl( milestoneNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE); new ConnectionImpl( actionNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE); EndNode endNode = new EndNode(); endNode.setName("EndNode"); endNode.setId(6); process.addNode(endNode); new ConnectionImpl( join, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()).addProcess(process); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ProcessInstance processInstance = ksession.startProcess("org.drools.process.event"); assertEquals(0, myList.size()); Person jack = new Person(); jack.setName("Jack"); processInstance.signalEvent("myEvent", jack); assertEquals(1, myList.size()); assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState()); }
@Test public void testProcessEventListener() throws Exception { KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); // create a simple package with one process to test the events final InternalKnowledgePackage pkg = new KnowledgePackageImpl("org.drools.test"); RuleFlowProcess process = new RuleFlowProcess(); process.setId("org.drools.core.process.event"); process.setName("Event Process"); StartNode startNode = new StartNode(); startNode.setName("Start"); startNode.setId(1); process.addNode(startNode); ActionNode actionNode = new ActionNode(); actionNode.setName("Print"); DroolsAction action = new DroolsConsequenceAction("java", null); action.setMetaData( "Action", new Action() { public void execute(ProcessContext context) throws Exception { logger.info("Executed action"); } }); actionNode.setAction(action); actionNode.setId(2); process.addNode(actionNode); new ConnectionImpl( startNode, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE); EndNode endNode = new EndNode(); endNode.setName("End"); endNode.setId(3); process.addNode(endNode); new ConnectionImpl( actionNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE); pkg.addProcess(process); List<KnowledgePackage> pkgs = new ArrayList<KnowledgePackage>(); pkgs.add(pkg); kbase.addKnowledgePackages(pkgs); StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(); final List<ProcessEvent> processEventList = new ArrayList<ProcessEvent>(); final ProcessEventListener processEventListener = new ProcessEventListener() { public void afterNodeLeft(ProcessNodeLeftEvent event) { processEventList.add(event); } public void afterNodeTriggered(ProcessNodeTriggeredEvent event) { processEventList.add(event); } public void afterProcessCompleted(ProcessCompletedEvent event) { processEventList.add(event); } public void afterProcessStarted(ProcessStartedEvent event) { processEventList.add(event); } public void beforeNodeLeft(ProcessNodeLeftEvent event) { processEventList.add(event); } public void beforeNodeTriggered(ProcessNodeTriggeredEvent event) { processEventList.add(event); } public void beforeProcessCompleted(ProcessCompletedEvent event) { processEventList.add(event); } public void beforeProcessStarted(ProcessStartedEvent event) { processEventList.add(event); } public void beforeVariableChanged(ProcessVariableChangedEvent event) { processEventList.add(event); } public void afterVariableChanged(ProcessVariableChangedEvent event) { processEventList.add(event); } }; session.addEventListener(processEventListener); // execute the process session.startProcess("org.drools.core.process.event"); assertEquals(16, processEventList.size()); assertEquals( "org.drools.core.process.event", ((ProcessStartedEvent) processEventList.get(0)).getProcessInstance().getProcessId()); assertEquals( "Start", ((ProcessNodeTriggeredEvent) processEventList.get(1)).getNodeInstance().getNodeName()); assertEquals( "Start", ((ProcessNodeLeftEvent) processEventList.get(2)).getNodeInstance().getNodeName()); assertEquals( "Print", ((ProcessNodeTriggeredEvent) processEventList.get(3)).getNodeInstance().getNodeName()); assertEquals( "Print", ((ProcessNodeLeftEvent) processEventList.get(4)).getNodeInstance().getNodeName()); assertEquals( "End", ((ProcessNodeTriggeredEvent) processEventList.get(5)).getNodeInstance().getNodeName()); assertEquals( "End", ((ProcessNodeLeftEvent) processEventList.get(6)).getNodeInstance().getNodeName()); assertEquals( "org.drools.core.process.event", ((ProcessCompletedEvent) processEventList.get(7)).getProcessInstance().getProcessId()); assertEquals( "org.drools.core.process.event", ((ProcessCompletedEvent) processEventList.get(8)).getProcessInstance().getProcessId()); assertEquals( "End", ((ProcessNodeLeftEvent) processEventList.get(9)).getNodeInstance().getNodeName()); assertEquals( "End", ((ProcessNodeTriggeredEvent) processEventList.get(10)).getNodeInstance().getNodeName()); assertEquals( "Print", ((ProcessNodeLeftEvent) processEventList.get(11)).getNodeInstance().getNodeName()); assertEquals( "Print", ((ProcessNodeTriggeredEvent) processEventList.get(12)).getNodeInstance().getNodeName()); assertEquals( "Start", ((ProcessNodeLeftEvent) processEventList.get(13)).getNodeInstance().getNodeName()); assertEquals( "Start", ((ProcessNodeTriggeredEvent) processEventList.get(14)).getNodeInstance().getNodeName()); assertEquals( "org.drools.core.process.event", ((ProcessStartedEvent) processEventList.get(15)).getProcessInstance().getProcessId()); }