[jbpm-commits] JBoss JBPM SVN: r6081 - in jbpm4/trunk/modules: jpdl/src/main/java/org/jbpm/jpdl/internal/activity and 4 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Jan 14 10:27:31 EST 2010


Author: jbarrez
Date: 2010-01-14 10:27:31 -0500 (Thu, 14 Jan 2010)
New Revision: 6081

Modified:
   jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/BpmnActivity.java
   jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/ForkActivity.java
   jbpm4/trunk/modules/test-base/src/main/java/org/jbpm/test/assertion/CollectionAssertions.java
   jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/ParallelGatewayTest.java
   jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/gateway/ParallelGatewayMergeTest.java
   jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/forkjoin/MultipleForksTest.java
Log:
JBPM-2754: fix for nested forks usage

Modified: jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/BpmnActivity.java
===================================================================
--- jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/BpmnActivity.java	2010-01-14 09:29:02 UTC (rev 6080)
+++ jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/BpmnActivity.java	2010-01-14 15:27:31 UTC (rev 6081)
@@ -22,7 +22,9 @@
 package org.jbpm.bpmn.flownodes;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.jbpm.api.Execution;
 import org.jbpm.api.activity.ActivityBehaviour;
@@ -85,15 +87,23 @@
         execution.setActivity(null);
       } else if (Execution.STATE_ACTIVE_CONCURRENT.equals(execution.getState())) {
         concurrentRoot = execution.getParent();
+        execution.end();
       }
 
+      Map<Transition, ExecutionImpl> childExecutionsMap = new HashMap<Transition, ExecutionImpl>();
       for (Transition transition : transitions) {
         // launch a concurrent path of execution
         String childExecutionName = transition.getName();
         ExecutionImpl concurrentExecution = concurrentRoot.createExecution(childExecutionName);
         concurrentExecution.setActivity(activity);
         concurrentExecution.setState(Execution.STATE_ACTIVE_CONCURRENT);
-        concurrentExecution.take(transition);
+        childExecutionsMap.put(transition, concurrentExecution);
+      }
+      
+      // For a correct functionality, the child executions must all exist before the actual
+      // transitions are taken.
+      for (Transition transition : childExecutionsMap.keySet()) {
+        childExecutionsMap.get(transition).take(transition);
 
         if (concurrentRoot.isEnded()) {
           break;

Modified: jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/ForkActivity.java
===================================================================
--- jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/ForkActivity.java	2010-01-14 09:29:02 UTC (rev 6080)
+++ jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/ForkActivity.java	2010-01-14 15:27:31 UTC (rev 6081)
@@ -22,7 +22,9 @@
 package org.jbpm.jpdl.internal.activity;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.jbpm.api.Execution;
 import org.jbpm.api.activity.ActivityExecution;
@@ -79,14 +81,19 @@
         execution.end();
       }
 
-      for (Transition transition: forkingTransitions) {
+      Map<Transition, ExecutionImpl> childExecutionsMap = new HashMap<Transition, ExecutionImpl>();
+      for (Transition transition : forkingTransitions) {
         // launch a concurrent path of execution
         String childExecutionName = transition.getName();
         ExecutionImpl concurrentExecution = concurrentRoot.createExecution(childExecutionName);
         concurrentExecution.setActivity(activity);
         concurrentExecution.setState(Execution.STATE_ACTIVE_CONCURRENT);
-        concurrentExecution.take(transition);
-        
+        childExecutionsMap.put(transition, concurrentExecution);
+      }
+      
+      for (Transition transition : childExecutionsMap.keySet()) {
+        childExecutionsMap.get(transition).take(transition);
+
         if (concurrentRoot.isEnded()) {
           break;
         }

Modified: jbpm4/trunk/modules/test-base/src/main/java/org/jbpm/test/assertion/CollectionAssertions.java
===================================================================
--- jbpm4/trunk/modules/test-base/src/main/java/org/jbpm/test/assertion/CollectionAssertions.java	2010-01-14 09:29:02 UTC (rev 6080)
+++ jbpm4/trunk/modules/test-base/src/main/java/org/jbpm/test/assertion/CollectionAssertions.java	2010-01-14 15:27:31 UTC (rev 6081)
@@ -78,7 +78,9 @@
     while (it.hasNext()) {
       strb.append("'" + it.next() + "', ");
     }
-    strb.delete(strb.length() - 2, strb.length());
+    if (strb.length() > 2) {
+      strb.delete(strb.length() - 2, strb.length());
+    }
     return strb.toString();
   }
 

Modified: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/ParallelGatewayTest.java
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/ParallelGatewayTest.java	2010-01-14 09:29:02 UTC (rev 6080)
+++ jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/ParallelGatewayTest.java	2010-01-14 15:27:31 UTC (rev 6081)
@@ -21,6 +21,7 @@
  */
 package org.jbpm.bpmn;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.jbpm.api.ProcessInstance;
@@ -29,6 +30,7 @@
 import org.jbpm.bpmn.parser.BpmnParser;
 import org.jbpm.pvm.internal.xml.Problem;
 import org.jbpm.test.JbpmTestCase;
+import org.jbpm.test.assertion.CollectionAssertions;
 
 /**
  * @author Ronald van Kuijk (kukeltje)
@@ -66,8 +68,8 @@
         List<Task> allTasks = taskQuery.list();
 
         assertEquals(2, allTasks.size());
-        assertEquals("UserTaskLeg1", allTasks.get(0).getActivityName());
-        assertEquals("UserTaskLeg2", allTasks.get(1).getActivityName());
+        CollectionAssertions.assertElementsEqual(Arrays.asList("UserTaskLeg1", "UserTaskLeg2"), 
+                Arrays.asList(allTasks.get(0).getActivityName(), allTasks.get(1).getActivityName()));
         
         // specifying a transition is unnecessary, BPMN has outgoing AND semantic!
         // TODO: fix

Modified: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/gateway/ParallelGatewayMergeTest.java
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/gateway/ParallelGatewayMergeTest.java	2010-01-14 09:29:02 UTC (rev 6080)
+++ jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/gateway/ParallelGatewayMergeTest.java	2010-01-14 15:27:31 UTC (rev 6081)
@@ -66,9 +66,9 @@
     "    <startEvent id='theStart' />" +
     "    <sequenceFlow id='flow1' sourceRef='theStart' targetRef='outerFork' />" +
     "    <parallelGateway id='outerFork' />" +
-    "    <sequenceFlow id='flow2' sourceRef='outerFork' targetRef='wait1' />" +
+    "    <sequenceFlow id='flow2' sourceRef='outerFork' targetRef='innerJoin' />" +
     "    <sequenceFlow id='flow3' sourceRef='outerFork' targetRef='innerJoin' />" +
-    "    <sequenceFlow id='flow4' sourceRef='outerFork' targetRef='innerJoin' />" +
+    "    <sequenceFlow id='flow4' sourceRef='outerFork' targetRef='wait1' />" +
     "    <receiveTask id='wait1' />" +
     "    <sequenceFlow id='flow5' sourceRef='wait1' targetRef='outerJoin' />" +
     "    <parallelGateway id='innerJoin' />" +
@@ -129,12 +129,12 @@
   
   public void testNestedParallelMerge2() {
     deployBpmn2XmlString(TEST_NESTED_MERGE_PROCESS_2);
-    /*
+    
     ProcessInstance pi = executionService.startProcessInstanceByKey("nestedMerge2");
     CollectionAssertions.assertElementsEqual(pi.findActiveActivityNames(), Arrays.asList("wait"));
     executionService.signalExecutionById(pi.findActiveExecutionIn("wait").getId());
     assertProcessInstanceEnded(pi);
-    */
+    
   }
 
 }

Modified: jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/forkjoin/MultipleForksTest.java
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/forkjoin/MultipleForksTest.java	2010-01-14 09:29:02 UTC (rev 6080)
+++ jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/activity/forkjoin/MultipleForksTest.java	2010-01-14 15:27:31 UTC (rev 6081)
@@ -21,11 +21,13 @@
  */
 package org.jbpm.test.activity.forkjoin;
 
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
 import org.jbpm.api.ProcessInstance;
 import org.jbpm.test.JbpmTestCase;
+import org.jbpm.test.assertion.CollectionAssertions;
 
 
 /**
@@ -40,8 +42,8 @@
       "    <transition to='fork'/>" +
       "  </start>" +
       "  <fork name='fork'>" +
+      "    <transition to='fork2' />" +
       "    <transition to='send invoice' />" +
-      "    <transition to='fork2' />" +
       "  </fork>" +
       "  <fork name='fork2'>" +
       "    <transition to='load truck'/>" +
@@ -114,5 +116,55 @@
 
     assertNull("execution "+pid+" should not exist", executionService.findExecutionById(pid));
   }
+  
+  // Test for JBPM-2754
+  public void testNestedForks() {
+    deployJpdlXmlString(
+      "<process name='nestedForks'>" +
+      "  <start>" +
+      "    <transition to='outerFork' />" +
+      "  </start>" +
+      "  <fork name='outerFork'>" +
+      "    <transition to='passthrough1' />" +
+      "    <transition to='passthrough2' />" +
+      "    <transition to='wait' />" +
+      "  </fork>" +
+      "  <state name='wait'>" +
+      "    <transition to='outerJoin' />" +
+      "  </state>" +
+      "  <passthrough name='passthrough1'>" +
+      "    <transition to='innerJoin' />" +
+      "  </passthrough>" +
+      "  <passthrough name='passthrough2'>" +
+      "    <transition to='innerJoin' />" +
+      "  </passthrough>" +
+      "  <join name='innerJoin'>" +
+      "    <transition to='innerFork' />" +
+      "  </join>" +
+      "  <fork name='innerFork' >" +
+      "    <transition to='passthrough3'/>" +
+      "    <transition to='passthrough4'/>" +
+      "    <transition to='passthrough5'/>" +
+      "  </fork>" +
+      "  <passthrough name='passthrough3'>" +
+      "    <transition to='outerJoin' />" +
+      "  </passthrough>" +
+      "  <passthrough name='passthrough4'>" +
+      "    <transition to='outerJoin' />" +
+      "  </passthrough>" +
+      "  <passthrough name='passthrough5'>" +
+      "    <transition to='outerJoin' />" +
+      "  </passthrough>" +
+      "  <join name='outerJoin'>" +
+      "    <transition to='theEnd' />" +
+      "  </join>" +
+      "  <end name='theEnd' />" + 
+      "</process>");
+    
+    ProcessInstance pi = executionService.startProcessInstanceByKey("nestedForks");
+    CollectionAssertions.assertElementsEqual(pi.findActiveActivityNames(), Arrays.asList("wait"));
+    executionService.signalExecutionById(pi.findActiveExecutionIn("wait").getId());
+    assertProcessInstanceEnded(pi);
+  }
 
 }



More information about the jbpm-commits mailing list