[jbpm-commits] JBoss JBPM SVN: r6165 - in jbpm3/branches/jbpm-3.2-soa/modules/core/src: main/java/org/jbpm/graph/exe and 5 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri Feb 5 12:59:03 EST 2010
Author: alex.guizar at jboss.com
Date: 2010-02-05 12:59:02 -0500 (Fri, 05 Feb 2010)
New Revision: 6165
Modified:
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/Action.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/Node.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/exe/Token.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/node/Join.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/resources/org/jbpm/graph/exe/Token.hbm.xml
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2375/JBPM2375Test.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/mock/EsbActionHandler.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2094/processdefinition.xml
Log:
JBPM-2787: cascade lock to parent token,
plus updates made reviewing process instances stuck in fork
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/Action.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/Action.java 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/Action.java 2010-02-05 17:59:02 UTC (rev 6165)
@@ -89,7 +89,8 @@
+ actionElement.getPath());
}
- String acceptPropagatedEvents = actionElement.attributeValue("accept-propagated-events");
+ String acceptPropagatedEvents =
+ actionElement.attributeValue("accept-propagated-events");
if ("false".equalsIgnoreCase(acceptPropagatedEvents)
|| "no".equalsIgnoreCase(acceptPropagatedEvents)
|| "off".equalsIgnoreCase(acceptPropagatedEvents)) {
@@ -113,13 +114,14 @@
}
public void execute(ExecutionContext executionContext) throws Exception {
- ClassLoader surroundingClassLoader = Thread.currentThread()
- .getContextClassLoader();
+ Thread currentThread = Thread.currentThread();
+ ClassLoader contextClassLoader = currentThread.getContextClassLoader();
try {
// set context class loader correctly for delegation class
// (https://jira.jboss.org/jira/browse/JBPM-1448)
- ClassLoader classLoader = JbpmConfiguration.getProcessClassLoader(executionContext.getProcessDefinition());
- Thread.currentThread().setContextClassLoader(classLoader);
+ ClassLoader processClassLoader =
+ JbpmConfiguration.getProcessClassLoader(executionContext.getProcessDefinition());
+ currentThread.setContextClassLoader(processClassLoader);
if (referencedAction != null) {
referencedAction.execute(executionContext);
@@ -128,12 +130,13 @@
JbpmExpressionEvaluator.evaluate(actionExpression, executionContext);
}
else if (actionDelegation != null) {
- ActionHandler actionHandler = (ActionHandler) actionDelegation.getInstance();
+ ActionHandler actionHandler =
+ (ActionHandler) actionDelegation.getInstance();
actionHandler.execute(executionContext);
}
}
finally {
- Thread.currentThread().setContextClassLoader(surroundingClassLoader);
+ currentThread.setContextClassLoader(contextClassLoader);
}
}
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java 2010-02-05 17:59:02 UTC (rev 6165)
@@ -46,7 +46,6 @@
import org.jbpm.persistence.db.DbPersistenceService;
import org.jbpm.signal.EventService;
import org.jbpm.svc.Service;
-import org.jbpm.svc.Services;
import org.jbpm.util.ClassUtil;
public abstract class GraphElement implements Identifiable, Serializable {
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/Node.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/Node.java 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/def/Node.java 2010-02-05 17:59:02 UTC (rev 6165)
@@ -45,7 +45,6 @@
import org.jbpm.jpdl.xml.JpdlXmlReader;
import org.jbpm.jpdl.xml.Parsable;
import org.jbpm.msg.MessageService;
-import org.jbpm.svc.Services;
import org.jbpm.util.Clock;
public class Node extends GraphElement implements Parsable {
@@ -176,7 +175,7 @@
*/
public Transition addLeavingTransition(Transition leavingTransition) {
if (leavingTransition == null)
- throw new IllegalArgumentException("can't add a null leaving transition to an node");
+ throw new IllegalArgumentException("leaving transition is null");
if (leavingTransitions == null) leavingTransitions = new ArrayList();
leavingTransition.from = this;
@@ -192,7 +191,7 @@
*/
public void removeLeavingTransition(Transition leavingTransition) {
if (leavingTransition == null)
- throw new IllegalArgumentException("can't remove a null leavingTransition from an node");
+ throw new IllegalArgumentException("leaving transition is null");
if (leavingTransitions != null && leavingTransitions.remove(leavingTransition)) {
leavingTransition.from = null;
@@ -307,7 +306,7 @@
*/
public Transition addArrivingTransition(Transition arrivingTransition) {
if (arrivingTransition == null)
- throw new IllegalArgumentException("can't add a null arrivingTransition to a node");
+ throw new IllegalArgumentException("arriving transition is null");
if (arrivingTransitions == null) arrivingTransitions = new HashSet();
arrivingTransition.to = this;
@@ -322,7 +321,7 @@
*/
public void removeArrivingTransition(Transition arrivingTransition) {
if (arrivingTransition == null)
- throw new IllegalArgumentException("can't remove a null arrivingTransition from a node");
+ throw new IllegalArgumentException("arriving transition is null");
if (arrivingTransitions != null && arrivingTransitions.remove(arrivingTransition)) {
arrivingTransition.to = null;
@@ -367,7 +366,7 @@
// execute the node
if (isAsync) {
ExecuteNodeJob job = createAsyncContinuationJob(token);
- MessageService messageService = (MessageService) Services.getCurrentService(Services.SERVICENAME_MESSAGE);
+ MessageService messageService = executionContext.getJbpmContext().getServices().getMessageService();
messageService.send(job);
token.lock(job.toString());
}
@@ -421,7 +420,7 @@
public void leave(ExecutionContext executionContext, String transitionName) {
Transition transition = getLeavingTransition(transitionName);
if (transition == null)
- throw new JbpmException("'" + transitionName + "' is not a leaving transition of " + this);
+ throw new JbpmException("no such transition: " + transitionName);
leave(executionContext, transition);
}
@@ -431,7 +430,7 @@
*/
public void leave(ExecutionContext executionContext, Transition transition) {
if (transition == null)
- throw new JbpmException("cannot leave " + this + " without leaving transition");
+ throw new JbpmException("transition is null");
Token token = executionContext.getToken();
token.setNode(this);
@@ -476,7 +475,7 @@
this +
" to '" +
name +
- "' - parent superstate has another child node with the same name");
+ "'; superstate has a child node with the same name");
}
Map nodes = superState.getNodesMap();
nodes.remove(oldName);
@@ -488,7 +487,7 @@
this +
" to '" +
name +
- "' - process definition has another child node with the same name");
+ "'; process definition has a child node with the same name");
}
Map nodeMap = processDefinition.getNodesMap();
nodeMap.remove(oldName);
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/exe/Token.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/exe/Token.java 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/exe/Token.java 2010-02-05 17:59:02 UTC (rev 6165)
@@ -186,8 +186,7 @@
void signal(Transition transition, ExecutionContext executionContext) {
if (transition == null) {
- throw new JbpmException(
- "couldn't signal without specifying a leaving transition : transition is null");
+ throw new JbpmException("transition is null");
}
if (executionContext == null) {
throw new JbpmException("execution context is null");
@@ -243,8 +242,7 @@
Set availableTransitions) {
List leavingTransitions = currentNode.getLeavingTransitions();
if (leavingTransitions != null) {
- Iterator iter = leavingTransitions.iterator();
- while (iter.hasNext()) {
+ for (Iterator iter = leavingTransitions.iterator(); iter.hasNext();) {
Transition transition = (Transition) iter.next();
String conditionExpression = transition.getCondition();
if (conditionExpression != null) {
@@ -286,22 +284,18 @@
public void end(boolean verifyParentTermination) {
// if not already ended
if (end == null) {
-
// ended tokens cannot reactivate parents
isAbleToReactivateParent = false;
// set the end date
- // the end date is also the flag that indicates that this token has ended.
+ // the end date also indicates that this token has ended
this.end = Clock.getCurrentTime();
// end all this token's children
if (children != null) {
- Iterator iter = children.values().iterator();
- while (iter.hasNext()) {
+ for (Iterator iter = children.values().iterator(); iter.hasNext();) {
Token child = (Token) iter.next();
- if (!child.hasEnded()) {
- child.end();
- }
+ if (!child.hasEnded()) child.end();
}
}
@@ -309,20 +303,16 @@
subProcessInstance.end();
}
- // only log child-token ends. process instance logs replace root token
- // logs.
+ // only log child-token ends
+ // process instance logs replace root token logs
if (parent != null) {
- // add a log
parent.addLog(new TokenEndLog(this));
}
- // if there are tasks associated to this token, remove signaling
- // capabilities
- TaskMgmtInstance taskMgmtInstance = (processInstance != null ? processInstance.getTaskMgmtInstance()
- : null);
- if (taskMgmtInstance != null) {
- taskMgmtInstance.removeSignalling(this);
- }
+ // if there are tasks associated to this token,
+ // remove signaling capabilities
+ TaskMgmtInstance taskMgmtInstance = processInstance.getTaskMgmtInstance();
+ if (taskMgmtInstance != null) taskMgmtInstance.removeSignalling(this);
if (verifyParentTermination) {
// if this is the last active token of the parent,
@@ -366,19 +356,14 @@
* tells if this token has child tokens that have not yet ended.
*/
public boolean hasActiveChildren() {
- boolean foundActiveChildToken = false;
- // try and find at least one child token that is
- // still active (= not ended)
+ // try and find at least one child token that is still active (not ended)
if (children != null) {
- Iterator iter = children.values().iterator();
- while ((iter.hasNext()) && (!foundActiveChildToken)) {
+ for (Iterator iter = children.values().iterator(); iter.hasNext();) {
Token child = (Token) iter.next();
- if (!child.hasEnded()) {
- foundActiveChildToken = true;
- }
+ if (!child.hasEnded()) return true;
}
}
- return foundActiveChildToken;
+ return false;
}
// log convenience methods //////////////////////////////////////////////////
@@ -387,7 +372,8 @@
* convenience method for adding a process log.
*/
public void addLog(ProcessLog processLog) {
- LoggingInstance li = (LoggingInstance) processInstance.getInstance(LoggingInstance.class);
+ LoggingInstance li =
+ (LoggingInstance) processInstance.getInstance(LoggingInstance.class);
if (li != null) {
processLog.setToken(this);
li.addLog(processLog);
@@ -399,7 +385,8 @@
* logs, make sure you put the {@link #endCompositeLog()} in a finally block.
*/
public void startCompositeLog(CompositeLog compositeLog) {
- LoggingInstance li = (LoggingInstance) processInstance.getInstance(LoggingInstance.class);
+ LoggingInstance li =
+ (LoggingInstance) processInstance.getInstance(LoggingInstance.class);
if (li != null) {
compositeLog.setToken(this);
li.startCompositeLog(compositeLog);
@@ -411,7 +398,8 @@
* finally block.
*/
public void endCompositeLog() {
- LoggingInstance li = (LoggingInstance) processInstance.getInstance(LoggingInstance.class);
+ LoggingInstance li =
+ (LoggingInstance) processInstance.getInstance(LoggingInstance.class);
if (li != null) {
li.endCompositeLog();
}
@@ -432,15 +420,11 @@
}
public boolean hasChild(String name) {
- return (children != null ? children.containsKey(name) : false);
+ return children != null ? children.containsKey(name) : false;
}
public Token getChild(String name) {
- Token child = null;
- if (children != null) {
- child = (Token) children.get(name);
- }
- return child;
+ return children != null ? (Token) children.get(name) : null;
}
public String getFullName() {
@@ -469,8 +453,7 @@
public void collectChildrenRecursively(List tokens) {
if (children != null) {
- Iterator iter = children.values().iterator();
- while (iter.hasNext()) {
+ for (Iterator iter = children.values().iterator(); iter.hasNext();) {
Token child = (Token) iter.next();
tokens.add(child);
child.collectChildrenRecursively(tokens);
@@ -516,8 +499,7 @@
public Map getActiveChildren() {
Map activeChildren = new HashMap();
if (children != null) {
- Iterator iter = children.entrySet().iterator();
- while (iter.hasNext()) {
+ for (Iterator iter = children.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
Token child = (Token) entry.getValue();
if (!child.hasEnded()) {
@@ -532,10 +514,7 @@
public void checkImplicitTermination() {
if (isTerminationImplicit && node.hasNoLeavingTransitions()) {
end();
-
- if (processInstance.isTerminatedImplicitly()) {
- processInstance.end();
- }
+ if (processInstance.isTerminatedImplicitly()) processInstance.end();
}
}
@@ -543,18 +522,15 @@
if (end != null) return true;
Map leavingTransitions = node.getLeavingTransitionsMap();
- if ((leavingTransitions != null) && (leavingTransitions.size() > 0)) {
+ if (leavingTransitions != null && !leavingTransitions.isEmpty()) {
// ok: found a non-terminated token
return false;
}
// loop over all active child tokens
- Iterator iter = getActiveChildren().values().iterator();
- while (iter.hasNext()) {
+ for (Iterator iter = getActiveChildren().values().iterator(); iter.hasNext();) {
Token child = (Token) iter.next();
- if (!child.isTerminatedImplicitly()) {
- return false;
- }
+ if (!child.isTerminatedImplicitly()) return false;
}
// if none of the above, this token is terminated implicitly
return true;
@@ -575,8 +551,7 @@
// propagate to child tokens
if (children != null) {
- Iterator iter = children.values().iterator();
- while (iter.hasNext()) {
+ for (Iterator iter = children.values().iterator(); iter.hasNext();) {
Token child = (Token) iter.next();
child.suspend();
}
@@ -585,19 +560,15 @@
void suspendJobs() {
JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
- JobSession jobSession = jbpmContext != null ? jbpmContext.getJobSession()
- : null;
- if (jobSession != null) {
- jobSession.suspendJobs(this);
+ if (jbpmContext != null) {
+ JobSession jobSession = jbpmContext.getJobSession();
+ if (jobSession != null) jobSession.suspendJobs(this);
}
}
void suspendTaskInstances() {
- TaskMgmtInstance taskMgmtInstance = (processInstance != null ? processInstance.getTaskMgmtInstance()
- : null);
- if (taskMgmtInstance != null) {
- taskMgmtInstance.suspend(this);
- }
+ TaskMgmtInstance taskMgmtInstance = processInstance.getTaskMgmtInstance();
+ if (taskMgmtInstance != null) taskMgmtInstance.suspend(this);
}
/**
@@ -611,8 +582,7 @@
// propagate to child tokens
if (children != null) {
- Iterator iter = children.values().iterator();
- while (iter.hasNext()) {
+ for (Iterator iter = children.values().iterator(); iter.hasNext();) {
Token child = (Token) iter.next();
child.resume();
}
@@ -621,19 +591,15 @@
void resumeJobs() {
JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
- JobSession jobSession = jbpmContext != null ? jbpmContext.getJobSession()
- : null;
- if (jobSession != null) {
- jobSession.resumeJobs(this);
+ if (jbpmContext != null) {
+ JobSession jobSession = jbpmContext.getJobSession();
+ if (jobSession != null) jobSession.resumeJobs(this);
}
}
void resumeTaskInstances() {
- TaskMgmtInstance taskMgmtInstance = (processInstance != null ? processInstance.getTaskMgmtInstance()
- : null);
- if (taskMgmtInstance != null) {
- taskMgmtInstance.resume(this);
- }
+ TaskMgmtInstance taskMgmtInstance = processInstance.getTaskMgmtInstance();
+ if (taskMgmtInstance != null) taskMgmtInstance.resume(this);
}
// equals ///////////////////////////////////////////////////////////////////
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/node/Join.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/node/Join.java 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/graph/node/Join.java 2010-02-05 17:59:02 UTC (rev 6165)
@@ -52,17 +52,17 @@
* specifies if this join is a discriminator. a descriminator reactivates the parent when the
* first concurrent token enters the join.
*/
- boolean isDiscriminator = false;
+ boolean isDiscriminator;
/**
* a fixed set of concurrent tokens.
*/
- Collection tokenNames = null;
+ Collection tokenNames;
/**
* a script that calculates concurrent tokens at runtime.
*/
- Script script = null;
+ Script script;
/**
* reactivate the parent if the n-th token arrives in the join.
@@ -113,7 +113,7 @@
JbpmContext jbpmContext = executionContext.getJbpmContext();
Session session;
if (jbpmContext != null && (session = jbpmContext.getSession()) != null) {
- // lock for update by default (LockMode.UPGRADE)
+ // obtain update lock by default (LockMode.UPGRADE)
LockMode lockMode = parentLockMode != null ? LockMode.parse(parentLockMode)
: LockMode.UPGRADE;
// load() hits the database as required, no need to flush() here
@@ -147,16 +147,16 @@
}
// if the result is a collection
if (result instanceof Collection) {
- // it must be a collection of tokenNames
+ // interpret as a collection of token names
Collection runtimeTokenNames = (Collection) result;
reactivateParent = mustParentBeReactivated(parentToken, runtimeTokenNames.iterator());
}
- // if it's a boolean...
+ // if it is a boolean...
else if (result instanceof Boolean) {
// the boolean specifies if the parent needs to be reactivated
reactivateParent = ((Boolean) result).booleanValue();
}
- // otherwise
+ // any other object
else {
// non-null result means the parent needs to be reactivated
reactivateParent = result != null;
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/resources/org/jbpm/graph/exe/Token.hbm.xml
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/resources/org/jbpm/graph/exe/Token.hbm.xml 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/resources/org/jbpm/graph/exe/Token.hbm.xml 2010-02-05 17:59:02 UTC (rev 6165)
@@ -28,7 +28,8 @@
foreign-key="FK_TOKEN_PROCINST"
index="IDX_TOKEN_PROCIN"/>
<many-to-one name="parent"
- column="PARENT_"
+ column="PARENT_"
+ cascade="lock"
foreign-key="FK_TOKEN_PARENT"
index="IDX_TOKEN_PARENT" />
<many-to-one name="subProcessInstance"
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2375/JBPM2375Test.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2375/JBPM2375Test.java 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2375/JBPM2375Test.java 2010-02-05 17:59:02 UTC (rev 6165)
@@ -9,7 +9,7 @@
/**
* Test if the JobExecutorThread recovers from an Error
*
- * @see <a href="https://jira.jboss.org/jira/browse/JBPM-2357">JBPM-2357</a>
+ * @see <a href="https://jira.jboss.org/jira/browse/JBPM-2375">JBPM-2375</a>
* @author mputz at redhat.com
* @since 30-Jun-2009
*/
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/mock/EsbActionHandler.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/mock/EsbActionHandler.java 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/mock/EsbActionHandler.java 2010-02-05 17:59:02 UTC (rev 6165)
@@ -30,6 +30,7 @@
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
+import org.jbpm.persistence.db.DbPersistenceService;
/**
* @author Alejandro Guizar
@@ -46,7 +47,7 @@
private static final Log log = LogFactory.getLog(EsbActionHandler.class);
public void execute(ExecutionContext executionContext) {
- log.debug("'invoking' " + esbCategoryName + "::" + esbServiceName);
+ log.debug("invoking " + esbCategoryName + "::" + esbServiceName);
try {
for (Iterator i = bpmToEsbVars.elementIterator(); i.hasNext();) {
Element bpmToEsbVar = (Element) i.next();
@@ -66,6 +67,8 @@
executionContext.leaveNode();
}
catch (RuntimeException e) {
+ if (DbPersistenceService.isPersistenceException(e)) throw e;
+ log.debug("possibly recoverable exception in esb action", e);
executionContext.leaveNode(exceptionTransition);
}
}
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2094/processdefinition.xml
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2094/processdefinition.xml 2010-02-05 10:50:17 UTC (rev 6164)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2094/processdefinition.xml 2010-02-05 17:59:02 UTC (rev 6165)
@@ -54,7 +54,7 @@
<transition to="join1"/>
</node>
- <node name="Dallas WHSE">
+ <node async="true" name="Dallas WHSE">
<action class="org.jbpm.mock.EsbActionHandler">
<esbCategoryName>BPM_Orchestration2_Service6</esbCategoryName>
<esbServiceName>Service6</esbServiceName>
@@ -82,7 +82,7 @@
<transition to="join1"/>
</node>
- <join name="join1">
+ <join async="true" name="join1">
<transition to="Shipment Notice"/>
</join>
More information about the jbpm-commits
mailing list