protected void handleSignalNode( final Node node, final Element element, final String uri, final String localName, final ExtensibleXmlParser parser) throws SAXException { super.handleNode(node, element, uri, localName, parser); EventNode eventNode = (EventNode) node; org.w3c.dom.Node xmlNode = element.getFirstChild(); while (xmlNode != null) { String nodeName = xmlNode.getNodeName(); if ("dataOutputAssociation".equals(nodeName)) { readDataOutputAssociation(xmlNode, eventNode); } else if ("signalEventDefinition".equals(nodeName)) { String type = ((Element) xmlNode).getAttribute("signalRef"); if (type != null && type.trim().length() > 0) { List<EventFilter> eventFilters = new ArrayList<EventFilter>(); EventTypeFilter eventFilter = new EventTypeFilter(); eventFilter.setType(type); eventFilters.add(eventFilter); eventNode.setEventFilters(eventFilters); eventNode.setScope("external"); } } xmlNode = xmlNode.getNextSibling(); } }
protected void readDataOutputAssociation(org.w3c.dom.Node xmlNode, EventNode eventNode) { // sourceRef org.w3c.dom.Node subNode = xmlNode.getFirstChild(); // targetRef subNode = subNode.getNextSibling(); String to = subNode.getTextContent(); eventNode.setVariableName(to); }
@SuppressWarnings("unchecked") protected void handleMessageNode( final Node node, final Element element, final String uri, final String localName, final ExtensibleXmlParser parser) throws SAXException { super.handleNode(node, element, uri, localName, parser); EventNode eventNode = (EventNode) node; org.w3c.dom.Node xmlNode = element.getFirstChild(); while (xmlNode != null) { String nodeName = xmlNode.getNodeName(); if ("dataOutputAssociation".equals(nodeName)) { readDataOutputAssociation(xmlNode, eventNode); } else if ("messageEventDefinition".equals(nodeName)) { String messageRef = ((Element) xmlNode).getAttribute("messageRef"); Map<String, Message> messages = (Map<String, Message>) ((ProcessBuildData) parser.getData()).getMetaData("Messages"); if (messages == null) { throw new IllegalArgumentException("No messages found"); } Message message = messages.get(messageRef); if (message == null) { throw new IllegalArgumentException("Could not find message " + messageRef); } eventNode.setMetaData("MessageType", message.getType()); List<EventFilter> eventFilters = new ArrayList<EventFilter>(); EventTypeFilter eventFilter = new EventTypeFilter(); eventFilter.setType("Message-" + messageRef); eventFilters.add(eventFilter); eventNode.setEventFilters(eventFilters); } xmlNode = xmlNode.getNextSibling(); } }
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 testProcessEventListenerWithEvent() 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); EventNode eventNode = new EventNode(); eventNode.setName("Event"); eventNode.setId(3); List<EventFilter> filters = new ArrayList<EventFilter>(); EventTypeFilter filter = new EventTypeFilter(); filter.setType("signal"); filters.add(filter); eventNode.setEventFilters(filters); process.addNode(eventNode); new ConnectionImpl( actionNode, Node.CONNECTION_DEFAULT_TYPE, eventNode, Node.CONNECTION_DEFAULT_TYPE); EndNode endNode = new EndNode(); endNode.setName("End"); endNode.setId(4); process.addNode(endNode); new ConnectionImpl( eventNode, 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 ProcessInstance pi = session.startProcess("org.drools.core.process.event"); pi.signalEvent("signal", null); assertEquals(20, 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( "Event", ((ProcessNodeTriggeredEvent) processEventList.get(5)).getNodeInstance().getNodeName()); assertEquals( "Event", ((ProcessNodeTriggeredEvent) processEventList.get(6)).getNodeInstance().getNodeName()); assertEquals( "Print", ((ProcessNodeLeftEvent) processEventList.get(7)).getNodeInstance().getNodeName()); assertEquals( "Print", ((ProcessNodeTriggeredEvent) processEventList.get(8)).getNodeInstance().getNodeName()); assertEquals( "Start", ((ProcessNodeLeftEvent) processEventList.get(9)).getNodeInstance().getNodeName()); assertEquals( "Start", ((ProcessNodeTriggeredEvent) processEventList.get(10)).getNodeInstance().getNodeName()); assertEquals( "org.drools.core.process.event", ((ProcessStartedEvent) processEventList.get(11)).getProcessInstance().getProcessId()); assertEquals( "Event", ((ProcessNodeLeftEvent) processEventList.get(12)).getNodeInstance().getNodeName()); assertEquals( "End", ((ProcessNodeTriggeredEvent) processEventList.get(13)).getNodeInstance().getNodeName()); assertEquals( "End", ((ProcessNodeLeftEvent) processEventList.get(14)).getNodeInstance().getNodeName()); assertEquals( "org.drools.core.process.event", ((ProcessCompletedEvent) processEventList.get(15)).getProcessInstance().getProcessId()); assertEquals( "org.drools.core.process.event", ((ProcessCompletedEvent) processEventList.get(16)).getProcessInstance().getProcessId()); assertEquals( "End", ((ProcessNodeLeftEvent) processEventList.get(17)).getNodeInstance().getNodeName()); assertEquals( "Event", ((ProcessNodeLeftEvent) processEventList.get(19)).getNodeInstance().getNodeName()); assertEquals( "End", ((ProcessNodeTriggeredEvent) processEventList.get(18)).getNodeInstance().getNodeName()); }
public void testPersistenceOfFullNodes() throws Exception { RuleFlowProcess process = new RuleFlowProcess() { private static final long serialVersionUID = 510l; int id = 0; public void addNode(org.kie.definition.process.Node node) { ((Node) node).setId(++id); super.addNode(node); } }; process.setMetaData("routerLayout", 1); List<String> imports = new ArrayList<String>(); imports.add("import1"); imports.add("import2"); process.setImports(imports); Map<String, String> globals = new HashMap<String, String>(); globals.put("name1", "type1"); globals.put("name2", "type2"); process.setGlobals(globals); List<Variable> variables = new ArrayList<Variable>(); Variable variable = new Variable(); variable.setName("variable1"); variable.setType(new StringDataType()); variable.setValue("value"); variables.add(variable); variable = new Variable(); variable.setName("variable2"); variable.setType(new IntegerDataType()); variable.setValue(2); variables.add(variable); variable = new Variable(); variable.setName("variable3"); variable.setType(new ObjectDataType("org.jbpm.Person")); Person person = new Person(); person.setName("John"); variable.setValue(person); variables.add(variable); variable = new Variable(); variable.setName("variable4"); ListDataType listDataType = new ListDataType(); listDataType.setType(new ObjectDataType("java.lang.Integer")); variable.setType(listDataType); List<Integer> list = new ArrayList<Integer>(); list.add(10); list.add(20); variable.setValue(list); variables.add(variable); process.getVariableScope().setVariables(variables); Swimlane swimlane = new Swimlane(); swimlane.setName("actor1"); process.getSwimlaneContext().addSwimlane(swimlane); swimlane = new Swimlane(); swimlane.setName("actor2"); process.getSwimlaneContext().addSwimlane(swimlane); ActionExceptionHandler exceptionHandler = new ActionExceptionHandler(); exceptionHandler.setFaultVariable("faultVariable"); DroolsConsequenceAction action = new DroolsConsequenceAction("dialect", "consequence"); exceptionHandler.setAction(action); process.getExceptionScope().setExceptionHandler("myFault", exceptionHandler); exceptionHandler = new ActionExceptionHandler(); exceptionHandler.setFaultVariable("faultVariable2"); action = new DroolsConsequenceAction("dialect2", "consequence2"); exceptionHandler.setAction(action); process.getExceptionScope().setExceptionHandler("myFault2", exceptionHandler); StartNode startNode = new StartNode(); startNode.setName("start"); startNode.setMetaData("x", 1); startNode.setMetaData("y", 2); startNode.setMetaData("width", 3); startNode.setMetaData("height", 4); startNode.setMetaData("meta1", "someValue"); startNode.setMetaData("meta2", "someOtherValue"); ConstraintTrigger constraintTrigger = new ConstraintTrigger(); constraintTrigger.setConstraint("constraint"); Map<String, String> inMapping = new HashMap<String, String>(); inMapping.put("key", "value"); inMapping.put("key2", "value2"); constraintTrigger.setInMappings(inMapping); startNode.addTrigger(constraintTrigger); EventTrigger eventTrigger = new EventTrigger(); EventTypeFilter eventTypeFilter = new EventTypeFilter(); eventTypeFilter.setType("eventType"); eventTrigger.addEventFilter(eventTypeFilter); inMapping = new HashMap<String, String>(); inMapping.put("key", "value"); inMapping.put("key2", "value2"); eventTrigger.setInMappings(inMapping); startNode.addTrigger(eventTrigger); process.addNode(startNode); ActionNode actionNode = new ActionNode(); actionNode.setName("action"); actionNode.setMetaData("x", 1); actionNode.setMetaData("y", 2); actionNode.setMetaData("width", 3); actionNode.setMetaData("height", 4); action = new DroolsConsequenceAction("dialect", "consequence"); actionNode.setAction(action); process.addNode(actionNode); RuleSetNode ruleSetNode = new RuleSetNode(); ruleSetNode.setName("action"); ruleSetNode.setMetaData("x", 1); ruleSetNode.setMetaData("y", 2); ruleSetNode.setMetaData("width", 3); ruleSetNode.setMetaData("height", 4); ruleSetNode.setRuleFlowGroup("ruleFlowGroup"); Timer timer = new Timer(); timer.setDelay("100"); timer.setPeriod("100"); action = new DroolsConsequenceAction("dialect", "consequence"); ruleSetNode.addTimer(timer, action); timer = new Timer(); timer.setDelay("200"); timer.setPeriod("200"); action = new DroolsConsequenceAction("dialect", "consequence"); ruleSetNode.addTimer(timer, action); process.addNode(ruleSetNode); FaultNode faultNode = new FaultNode(); faultNode.setName("action"); faultNode.setMetaData("x", 1); faultNode.setMetaData("y", 2); faultNode.setMetaData("width", 3); faultNode.setMetaData("height", 4); faultNode.setFaultName("faultName"); faultNode.setFaultVariable("faultVariable"); process.addNode(faultNode); Split split = new Split(); split.setName("split"); split.setMetaData("x", 1); split.setMetaData("y", 2); split.setMetaData("width", 3); split.setMetaData("height", 4); split.setType(Split.TYPE_XOR); Connection connection = new ConnectionImpl( split, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE); Constraint constraint = new ConstraintImpl(); constraint.setName("constraint1 ><&&"); constraint.setPriority(1); constraint.setDialect("dialect1"); constraint.setType("type1"); constraint.setConstraint("constraint-text1"); split.setConstraint(connection, constraint); connection = new ConnectionImpl( split, Node.CONNECTION_DEFAULT_TYPE, ruleSetNode, Node.CONNECTION_DEFAULT_TYPE); constraint = new ConstraintImpl(); constraint.setName("constraint2"); constraint.setPriority(2); constraint.setDialect("dialect2"); constraint.setType("type2"); constraint.setConstraint("constraint-text2"); split.setConstraint(connection, constraint); process.addNode(split); new ConnectionImpl( startNode, Node.CONNECTION_DEFAULT_TYPE, split, Node.CONNECTION_DEFAULT_TYPE); EventNode eventNode = new EventNode(); eventNode.setName("action"); eventNode.setMetaData("x", 1); eventNode.setMetaData("y", 2); eventNode.setMetaData("width", 3); eventNode.setMetaData("height", 4); eventNode.setVariableName("eventVariable"); EventTypeFilter eventFilter = new EventTypeFilter(); eventFilter.setType("eventType"); eventNode.addEventFilter(eventFilter); process.addNode(eventNode); Join join = new Join(); join.setName("join"); join.setMetaData("x", 1); join.setMetaData("y", 2); join.setMetaData("width", 3); join.setMetaData("height", 4); join.setType(Join.TYPE_N_OF_M); join.setN("#{var1}"); process.addNode(join); new ConnectionImpl( actionNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE); new ConnectionImpl( ruleSetNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE); new ConnectionImpl(eventNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE); MilestoneNode milestone = new MilestoneNode(); milestone.setName("milestone"); milestone.setMetaData("x", 1); milestone.setMetaData("y", 2); milestone.setMetaData("width", 3); milestone.setMetaData("height", 4); milestone.setConstraint("constraint"); timer = new Timer(); timer.setDelay("100"); timer.setPeriod("100"); action = new DroolsConsequenceAction("dialect", "consequence"); milestone.addTimer(timer, action); timer = new Timer(); timer.setDelay("200"); timer.setPeriod("200"); action = new DroolsConsequenceAction("dialect", "consequence"); milestone.addTimer(timer, action); List<DroolsAction> actions = new ArrayList<DroolsAction>(); DroolsAction action1 = new DroolsConsequenceAction("java", "System.out.println(\"action1\");"); actions.add(action1); DroolsAction action2 = new DroolsConsequenceAction("java", "System.out.println(\"action2\");"); actions.add(action2); milestone.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions); milestone.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions); process.addNode(milestone); connection = new ConnectionImpl( join, Node.CONNECTION_DEFAULT_TYPE, milestone, Node.CONNECTION_DEFAULT_TYPE); connection.setMetaData("bendpoints", "[10,10;20,20]"); SubProcessNode subProcess = new SubProcessNode(); subProcess.setName("subProcess"); subProcess.setMetaData("x", 1); subProcess.setMetaData("y", 2); subProcess.setMetaData("width", 3); subProcess.setMetaData("height", 4); subProcess.setProcessId("processId"); subProcess.setWaitForCompletion(false); subProcess.setIndependent(false); subProcess.addInMapping("subvar1", "var1"); subProcess.addOutMapping("subvar2", "var2"); timer = new Timer(); timer.setDelay("100"); timer.setPeriod("100"); action = new DroolsConsequenceAction("dialect", "consequence"); subProcess.addTimer(timer, action); timer = new Timer(); timer.setDelay("200"); timer.setPeriod("200"); action = new DroolsConsequenceAction("dialect", "consequence"); subProcess.addTimer(timer, action); subProcess.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions); subProcess.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions); process.addNode(subProcess); connection = new ConnectionImpl( milestone, Node.CONNECTION_DEFAULT_TYPE, subProcess, Node.CONNECTION_DEFAULT_TYPE); connection.setMetaData("bendpoints", "[10,10]"); WorkItemNode workItemNode = new WorkItemNode(); workItemNode.setName("WorkItem"); Work work = new WorkImpl(); work.setName("workname"); Set<ParameterDefinition> parameterDefinitions = new HashSet<ParameterDefinition>(); ParameterDefinition parameterDefinition = new ParameterDefinitionImpl("param1", new StringDataType()); parameterDefinitions.add(parameterDefinition); parameterDefinition = new ParameterDefinitionImpl("param2", new IntegerDataType()); parameterDefinitions.add(parameterDefinition); work.setParameterDefinitions(parameterDefinitions); work.setParameter("param1", "value1"); work.setParameter("param2", 1); workItemNode.setWork(work); workItemNode.setWaitForCompletion(false); workItemNode.addInMapping("param1", "var1"); workItemNode.addOutMapping("param2", "var2"); timer = new Timer(); timer.setDelay("100"); timer.setPeriod("100"); action = new DroolsConsequenceAction("dialect", "consequence"); workItemNode.addTimer(timer, action); timer = new Timer(); timer.setDelay("200"); timer.setPeriod("200"); action = new DroolsConsequenceAction("dialect", "consequence"); workItemNode.addTimer(timer, action); workItemNode.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions); workItemNode.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions); process.addNode(workItemNode); connection = new ConnectionImpl( subProcess, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE); connection.setMetaData("bendpoints", "[]"); HumanTaskNode humanTaskNode = new HumanTaskNode(); humanTaskNode.setName("Human Task"); work = humanTaskNode.getWork(); parameterDefinitions = new HashSet<ParameterDefinition>(); parameterDefinition = new ParameterDefinitionImpl("TaskName", new StringDataType()); parameterDefinitions.add(parameterDefinition); parameterDefinition = new ParameterDefinitionImpl("ActorId", new StringDataType()); parameterDefinitions.add(parameterDefinition); parameterDefinition = new ParameterDefinitionImpl("Priority", new StringDataType()); parameterDefinitions.add(parameterDefinition); parameterDefinition = new ParameterDefinitionImpl("Comment", new StringDataType()); parameterDefinitions.add(parameterDefinition); work.setParameterDefinitions(parameterDefinitions); work.setParameter("TaskName", "Do something"); work.setParameter("ActorId", "John Doe"); humanTaskNode.setWaitForCompletion(false); humanTaskNode.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions); humanTaskNode.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions); process.addNode(humanTaskNode); connection = new ConnectionImpl( workItemNode, Node.CONNECTION_DEFAULT_TYPE, humanTaskNode, Node.CONNECTION_DEFAULT_TYPE); TimerNode timerNode = new TimerNode(); timerNode.setName("timer"); timerNode.setMetaData("x", 1); timerNode.setMetaData("y", 2); timerNode.setMetaData("width", 3); timerNode.setMetaData("height", 4); timer = new Timer(); timer.setDelay("1000"); timer.setPeriod("1000"); timerNode.setTimer(timer); process.addNode(timerNode); new ConnectionImpl( humanTaskNode, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE); ForEachNode forEachNode = new ForEachNode(); forEachNode.setName("ForEach"); forEachNode.setCollectionExpression("collection"); forEachNode.setVariable("variableName", new ObjectDataType()); forEachNode.setWaitForCompletion(false); ActionNode subActionNode1 = new ActionNode(); forEachNode.getCompositeNode().addNode(subActionNode1); ActionNode subActionNode2 = new ActionNode(); forEachNode.getCompositeNode().addNode(subActionNode2); new ConnectionImpl( subActionNode1, Node.CONNECTION_DEFAULT_TYPE, subActionNode2, Node.CONNECTION_DEFAULT_TYPE); forEachNode .getCompositeNode() .linkIncomingConnections( Node.CONNECTION_DEFAULT_TYPE, subActionNode1.getId(), Node.CONNECTION_DEFAULT_TYPE); forEachNode .getCompositeNode() .linkOutgoingConnections( subActionNode2.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE); process.addNode(forEachNode); new ConnectionImpl( timerNode, Node.CONNECTION_DEFAULT_TYPE, forEachNode, Node.CONNECTION_DEFAULT_TYPE); CompositeContextNode compositeNode = new CompositeContextNode(); compositeNode.setName("Composite"); VariableScope variableScope = new VariableScope(); compositeNode.addContext(variableScope); compositeNode.setDefaultContext(variableScope); variableScope.setVariables(variables); ExceptionScope exceptionScope = new ExceptionScope(); compositeNode.addContext(exceptionScope); compositeNode.setDefaultContext(exceptionScope); exceptionHandler = new ActionExceptionHandler(); exceptionHandler.setFaultVariable("faultVariable"); action = new DroolsConsequenceAction("dialect", "consequence"); exceptionHandler.setAction(action); exceptionScope.setExceptionHandler("MyFault", exceptionHandler); exceptionHandler = new ActionExceptionHandler(); exceptionHandler.setFaultVariable("faultVariable2"); action = new DroolsConsequenceAction("dialect2", "consequence2"); exceptionHandler.setAction(action); exceptionScope.setExceptionHandler("MyFault2", exceptionHandler); subActionNode1 = new ActionNode(); compositeNode.addNode(subActionNode1); subActionNode2 = new ActionNode(); compositeNode.addNode(subActionNode2); new ConnectionImpl( subActionNode1, Node.CONNECTION_DEFAULT_TYPE, subActionNode2, Node.CONNECTION_DEFAULT_TYPE); compositeNode.linkIncomingConnections( Node.CONNECTION_DEFAULT_TYPE, subActionNode1.getId(), Node.CONNECTION_DEFAULT_TYPE); compositeNode.linkOutgoingConnections( subActionNode2.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE); process.addNode(compositeNode); new ConnectionImpl( forEachNode, Node.CONNECTION_DEFAULT_TYPE, compositeNode, Node.CONNECTION_DEFAULT_TYPE); EndNode endNode = new EndNode(); endNode.setName("end"); endNode.setTerminate(false); endNode.setMetaData("x", 1); endNode.setMetaData("y", 2); endNode.setMetaData("width", 3); endNode.setMetaData("height", 4); process.addNode(endNode); StateNode stateNode = new StateNode(); stateNode.setName("state"); stateNode.setMetaData("x", 1); stateNode.setMetaData("y", 2); stateNode.setMetaData("width", 3); stateNode.setMetaData("height", 4); timer = new Timer(); timer.setDelay("100"); timer.setPeriod("100"); action = new DroolsConsequenceAction("dialect", "consequence"); stateNode.addTimer(timer, action); timer = new Timer(); timer.setDelay("200"); timer.setPeriod("200"); action = new DroolsConsequenceAction("dialect", "consequence"); stateNode.addTimer(timer, action); actions = new ArrayList<DroolsAction>(); action1 = new DroolsConsequenceAction("java", "System.out.println(\"action1\");"); actions.add(action1); action2 = new DroolsConsequenceAction("java", "System.out.println(\"action2\");"); actions.add(action2); stateNode.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions); stateNode.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions); new ConnectionImpl( compositeNode, Node.CONNECTION_DEFAULT_TYPE, stateNode, Node.CONNECTION_DEFAULT_TYPE); connection = new ConnectionImpl( stateNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE); constraint = new ConstraintImpl(); constraint.setName("constraint1 ><&&"); constraint.setPriority(1); constraint.setDialect("dialect1"); constraint.setType("type1"); constraint.setConstraint("constraint-text1 %&<>"); stateNode.setConstraint(connection, constraint); connection = new ConnectionImpl( stateNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE); constraint = new ConstraintImpl(); constraint.setName("constraint2"); constraint.setPriority(2); constraint.setDialect("dialect2"); constraint.setType("type2"); constraint.setConstraint("constraint-text2"); stateNode.setConstraint(connection, constraint); process.addNode(stateNode); String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, true); if (xml == null) { throw new IllegalArgumentException("Failed to persist full nodes!"); } System.out.println(xml); SemanticModules modules = new SemanticModules(); modules.addSemanticModule(new ProcessSemanticModule()); XmlProcessReader reader = new XmlProcessReader(modules, getClass().getClassLoader()); List<Process> processes = reader.read(new StringReader(xml)); assertNotNull(processes); process = (RuleFlowProcess) processes.get(0); if (process == null) { throw new IllegalArgumentException("Failed to reload process!"); } assertEquals(16, process.getNodes().length); assertEquals(2, process.getImports().size()); assertEquals(2, process.getGlobals().size()); assertEquals(4, process.getVariableScope().getVariables().size()); assertEquals(2, process.getSwimlaneContext().getSwimlanes().size()); assertEquals(2, process.getExceptionScope().getExceptionHandlers().size()); System.out.println("************************************"); String xml2 = XmlRuleFlowProcessDumper.INSTANCE.dump(process, true); if (xml2 == null) { throw new IllegalArgumentException("Failed to persist empty nodes!"); } System.out.println(xml2); assertEquals(xml, xml2); // test serialization of process elements new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(process); }