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);
+ }
}