PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/jbpm-bpmn2/src/test/java/org/jbpm/bpmn2/persistence/DynamicProcessTest.java

https://github.com/mariofusco/jbpm
Java | 143 lines | 125 code | 12 blank | 6 comment | 8 complexity | 47be705291ef0d3699d8ff79d9bcfc1c MD5 | raw file
  1. package org.jbpm.bpmn2.persistence;
  2. import org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession;
  3. import org.drools.core.command.impl.GenericCommand;
  4. import org.drools.core.command.impl.KnowledgeCommandContext;
  5. import org.jbpm.bpmn2.JbpmBpmn2TestCase;
  6. import org.jbpm.compiler.xml.XmlRuleFlowProcessDumper;
  7. import org.jbpm.persistence.session.objects.TestWorkItemHandler;
  8. import org.jbpm.process.instance.impl.ProcessInstanceImpl;
  9. import org.jbpm.ruleflow.core.RuleFlowProcess;
  10. import org.jbpm.ruleflow.core.RuleFlowProcessFactory;
  11. import org.jbpm.workflow.core.impl.ConnectionImpl;
  12. import org.jbpm.workflow.core.impl.NodeImpl;
  13. import org.jbpm.workflow.core.node.HumanTaskNode;
  14. import org.junit.BeforeClass;
  15. import org.junit.Test;
  16. import org.kie.api.KieBase;
  17. import org.kie.api.definition.process.Connection;
  18. import org.kie.api.event.process.ProcessCompletedEvent;
  19. import org.kie.api.event.process.ProcessEventListener;
  20. import org.kie.api.event.process.ProcessNodeLeftEvent;
  21. import org.kie.api.event.process.ProcessNodeTriggeredEvent;
  22. import org.kie.api.event.process.ProcessStartedEvent;
  23. import org.kie.api.event.process.ProcessVariableChangedEvent;
  24. import org.kie.api.io.Resource;
  25. import org.kie.internal.command.Context;
  26. import org.kie.internal.io.ResourceFactory;
  27. import org.kie.internal.runtime.StatefulKnowledgeSession;
  28. import org.slf4j.Logger;
  29. import org.slf4j.LoggerFactory;
  30. /**
  31. * This is a sample file to launch a process.
  32. */
  33. public class DynamicProcessTest extends JbpmBpmn2TestCase {
  34. private static final Logger logger = LoggerFactory.getLogger(DynamicProcessTest.class);
  35. @BeforeClass
  36. public static void setup() throws Exception {
  37. if (PERSISTENCE) {
  38. setUpDataSource();
  39. }
  40. }
  41. @Test
  42. public void testDynamicProcess() throws Exception {
  43. RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.jbpm.HelloWorld");
  44. factory
  45. // Header
  46. .name("HelloWorldProcess")
  47. .version("1.0")
  48. .packageName("org.jbpm")
  49. // Nodes
  50. .startNode(1).name("Start").done()
  51. .humanTaskNode(2).name("Task1").actorId("krisv").taskName("MyTask").done()
  52. .endNode(3).name("End").done()
  53. // Connections
  54. .connection(1, 2)
  55. .connection(2, 3);
  56. final RuleFlowProcess process = factory.validate().getProcess();
  57. Resource resource = ResourceFactory
  58. .newByteArrayResource(XmlRuleFlowProcessDumper.INSTANCE.dump(
  59. process).getBytes());
  60. resource.setSourcePath("/tmp/dynamicProcess.bpmn2"); // source path or target path must be set to be added into kbase
  61. KieBase kbase = createKnowledgeBaseFromResources(resource);
  62. StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
  63. TestWorkItemHandler testHandler = new TestWorkItemHandler();
  64. ksession.getWorkItemManager().registerWorkItemHandler("Human Task", testHandler);
  65. ksession.addEventListener(new ProcessEventListener() {
  66. public void beforeVariableChanged(ProcessVariableChangedEvent arg0) {
  67. }
  68. public void beforeProcessStarted(ProcessStartedEvent arg0) {
  69. logger.info("{}", arg0);
  70. }
  71. public void beforeProcessCompleted(ProcessCompletedEvent arg0) {
  72. logger.info("{}", arg0);
  73. }
  74. public void beforeNodeTriggered(ProcessNodeTriggeredEvent arg0) {
  75. logger.info("{}", arg0);
  76. }
  77. public void beforeNodeLeft(ProcessNodeLeftEvent arg0) {
  78. logger.info("{}", arg0);
  79. }
  80. public void afterVariableChanged(ProcessVariableChangedEvent arg0) {
  81. }
  82. public void afterProcessStarted(ProcessStartedEvent arg0) {
  83. }
  84. public void afterProcessCompleted(ProcessCompletedEvent arg0) {
  85. }
  86. public void afterNodeTriggered(ProcessNodeTriggeredEvent arg0) {
  87. }
  88. public void afterNodeLeft(ProcessNodeLeftEvent arg0) {
  89. }
  90. });
  91. final ProcessInstanceImpl processInstance = (ProcessInstanceImpl)
  92. ksession.startProcess("org.jbpm.HelloWorld");
  93. HumanTaskNode node = new HumanTaskNode();
  94. node.setName("Task2");
  95. node.setId(4);
  96. insertNodeInBetween(process, 2, 3, node);
  97. ((CommandBasedStatefulKnowledgeSession) ksession).getCommandService().execute(new GenericCommand<Void>() {
  98. public Void execute(Context context) {
  99. StatefulKnowledgeSession ksession = (StatefulKnowledgeSession) ((KnowledgeCommandContext) context).getKieSession();
  100. ((ProcessInstanceImpl) ksession.getProcessInstance(processInstance.getId())).updateProcess(process);
  101. return null;
  102. }
  103. });
  104. assertProcessInstanceActive(processInstance);
  105. ksession.getWorkItemManager().completeWorkItem(testHandler.getWorkItem().getId(), null);
  106. assertProcessInstanceActive(processInstance);
  107. ksession.getWorkItemManager().completeWorkItem(testHandler.getWorkItem().getId(), null);
  108. assertProcessInstanceFinished(processInstance, ksession);
  109. ksession.dispose();
  110. }
  111. private static void insertNodeInBetween(RuleFlowProcess process, long startNodeId, long endNodeId, NodeImpl node) {
  112. if (process == null) {
  113. throw new IllegalArgumentException("Process may not be null");
  114. }
  115. NodeImpl selectedNode = (NodeImpl) process.getNode(startNodeId);
  116. if (selectedNode == null) {
  117. throw new IllegalArgumentException("Node " + startNodeId + " not found in process " + process.getId());
  118. }
  119. for (Connection connection: selectedNode.getDefaultOutgoingConnections()) {
  120. if (connection.getTo().getId() == endNodeId) {
  121. process.addNode(node);
  122. NodeImpl endNode = (NodeImpl) connection.getTo();
  123. ((ConnectionImpl) connection).terminate();
  124. new ConnectionImpl(selectedNode, NodeImpl.CONNECTION_DEFAULT_TYPE, node, NodeImpl.CONNECTION_DEFAULT_TYPE);
  125. new ConnectionImpl(node, NodeImpl.CONNECTION_DEFAULT_TYPE, endNode, NodeImpl.CONNECTION_DEFAULT_TYPE);
  126. return;
  127. }
  128. }
  129. throw new IllegalArgumentException("Connection to node " + endNodeId + " not found in process " + process.getId());
  130. }
  131. }