package com.sample; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.process.core.datatype.impl.type.ObjectDataType; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.process.ProcessContext; import org.jbpm.bpmn2.xml.XmlBPMNProcessSerializer; import org.jbpm.process.instance.impl.Action; import org.jbpm.ruleflow.core.RuleFlowProcess; import org.jbpm.ruleflow.core.RuleFlowProcessFactory; import org.jbpm.workflow.core.WorkflowProcess; import org.jbpm.workflow.core.node.Split; public class SplitnodeTest { KnowledgeBase m_kbase; KnowledgeBuilder m_builder; StatefulKnowledgeSession m_ksession; static final String TEST_PROCESS = "splitnode.test.process"; void registerProcess(WorkflowProcess process) { // ((AbstractRuleBase) ((InternalKnowledgeBase) m_kbase).getRuleBase()) // .addProcess(process); m_builder.add(ResourceFactory.newByteArrayResource( XmlBPMNProcessSerializer.INSTANCE.dump(process, true).getBytes()), ResourceType.BPMN2); m_ksession.getKnowledgeBase().addKnowledgePackages(m_builder.getKnowledgePackages()); } void init() { m_kbase = KnowledgeBaseFactory.newKnowledgeBase(); m_ksession = m_kbase.newStatefulKnowledgeSession(); m_builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); } private static RuleFlowProcess getDeployProcess() { final RuleFlowProcessFactory factory = RuleFlowProcessFactory .createProcess(TEST_PROCESS); factory // header .name(TEST_PROCESS) .packageName(TEST_PROCESS) // Process-scope variables .variable("isTrue", new ObjectDataType(Boolean.class.getCanonicalName())) // start and other nodes .startNode(1) .name("Starting...") .done() // check if we should do manifest activate // ... .actionNode(1000) .name("isTrueActionNode") .action( "java", "System.out.println(\"Test XOR splitnode. Set variable isTrue to false to go to false branch...\");"+ "context.setVariable(\"isTrue\", Boolean.FALSE);" /** new Action() { @Override public void execute(ProcessContext context) throws Exception { System.out .println("Test splitnode on XOR. Intentionally set it to false to go the false branch, " + "but it doesn't seem to work."); context.setVariable("isTrue", Boolean.FALSE); System.out.println("isTrue is "+ (context.getVariable("isTrue") == Boolean.TRUE ? "true" : "false")); } }**/ ) .done() // should activate? .splitNode(1010) .type(Split.TYPE_XOR) .name("splitOnIsTrue") .constraint(305, "is True?", "code", "java", "(Boolean)(context.getVariable(\"isTrue\")) == Boolean.TRUE") .constraint(2000, "Not true", "code", "java", "(Boolean)(context.getVariable(\"isTrue\")) == Boolean.FALSE") .done() // call manifest activate process .actionNode(305) .name("Happy path") .action(new Action() { @Override public void execute(ProcessContext context) throws Exception { System.out.println("We are on happy path branch..."); } }) .done() .joinNode(2000) .type(Split.TYPE_XOR) .done() .endNode(40).name("End").terminate(false).done() // split node connection // split on true - continue in the loop .connection(1010, 305) .connection(305, 2000) .connection(1, 1000) .connection(1000, 1010) // split on false - skip over .connection(1010, 2000) .connection(2000, 40); return toProcess(factory); } private void run() { m_ksession.startProcess(TEST_PROCESS); } private static RuleFlowProcess toProcess(RuleFlowProcessFactory f) { RuleFlowProcess process = f.validate().getProcess(); process.setAutoComplete(true); String xml = XmlBPMNProcessSerializer.INSTANCE.dump(process, true); System.out.println(xml); return process; } public static void main(String[] argv) { SplitnodeTest test = new SplitnodeTest(); test.init(); test.registerProcess(getDeployProcess()); test.run(); } }