Author: tom.baeyens(a)jboss.com
Date: 2009-05-18 16:36:04 -0400 (Mon, 18 May 2009)
New Revision: 4837
Removed:
jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventPropagationTest.java
Modified:
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/activity/ActivityExecution.java
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/builder/ActivityBuilder.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TransitionImpl.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/MoveToChildActivity.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/MoveToParentActivity.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/TransitionStartActivity.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycleParser.java
jbpm4/trunk/modules/pvm/src/main/resources/jbpm.execution.hbm.xml
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/async/AsyncBasicsTest.java
Log:
JBPM-2256 JBPM-2264 making execution.transition persistent for async continuations and
removed the previous methods
Modified:
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/activity/ActivityExecution.java
===================================================================
---
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/activity/ActivityExecution.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/activity/ActivityExecution.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -183,28 +183,8 @@
* an integer and not the named value.*/
void setPriority(int priority);
+ // history methods //////////////////////////////////////////////////////////
- // previous methods /////////////////////////////////////////////////////////
-
- // TODO evaluate the previous methods (JBPM-)
- // these methods are kind of performance optimisations. a sequence and
- // some other specific control flow implementations can be optimised if they
- // have access to the previous activity or transition.
- // Those activities could also be implemented by letting the activities store
- // the contextual information in process variables or some other execution
- // context. But with the previous properties as done now, these control flow
- // activities can be implemented without storing an extra record. It's only a
property
- // that is only updated when the activity configuration indicates that it's
needed.
- // (see also Activity.isPreviousNeeded())
-
- /** returns the previously executed activity only if {@link
Activity#isPreviousNeeded()}
- * is set to true. */
- Activity getPreviousActivity();
-
- /** returns the previously taken transition only if {@link
Activity#isPreviousNeeded()}
- * is set to true. */
- Transition getPreviousTransition();
-
/** record history event that specifies for a decision activity which transition
* has been taken. */
void historyDecision(String transitionName);
Modified: jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java
===================================================================
--- jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java 2009-05-18
19:10:55 UTC (rev 4836)
+++ jbpm4/trunk/modules/api/src/main/java/org/jbpm/api/model/Activity.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -113,14 +113,6 @@
* <a
href="package-summary.html#asynchronouscontinuations">asynchronously</a>.
*/
boolean isAsync();
- /** indicates if this activity behaviour needs to know
- * {@link Execution#getPreviousActivity() the previous activity} or
- * {@link Execution#getPreviousTransition() previous transition}.
- * If this property is set to true, the properties {@link
Execution#getPreviousActivity()}
- * and {@link Execution#getPreviousTransition()} will be available to the
- * activity behaviour when it is executed or signalled. */
- boolean isPreviousNeeded();
-
/** the type of this activity which corresponds to the xml tag */
String getType();
}
\ No newline at end of file
Modified:
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java
===================================================================
---
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/jpdl/src/main/java/org/jbpm/jpdl/internal/activity/JpdlBinding.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -81,7 +81,8 @@
}
}
- TransitionImpl transition = activity.createOutgoingTransition(transitionName);
+ TransitionImpl transition = activity.createOutgoingTransition();
+ transition.setName(transitionName);
unresolvedTransitions.add(transition, transitionElement);
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/builder/ActivityBuilder.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/builder/ActivityBuilder.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/builder/ActivityBuilder.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -104,9 +104,4 @@
protected void addUnresolvedFlow(UnresolvedFlow unresolvedFlow) {
compositeBuilder.addUnresolvedFlow(unresolvedFlow);
}
-
- public ActivityBuilder needsPrevious() {
- activity.setPreviousNeeded(true);
- return this;
- }
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ActivityImpl.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -47,7 +47,6 @@
protected String type;
protected boolean isAsync;
- protected boolean isPreviousNeeded;
protected ActivityCoordinatesImpl coordinates;
@@ -79,7 +78,7 @@
return super.findActivity(activityName);
}
- // leaving transitions //////////////////////////////////////////////////////
+ // outgoing transitions //////////////////////////////////////////////////////
/** creates an outgoing transition from this activity. */
public TransitionImpl createOutgoingTransition() {
@@ -98,39 +97,6 @@
return transition;
}
-
- // TODO remove
- public Transition createOutgoingTransition(ActivityImpl destination) {
- return createOutgoingTransition(destination, null);
- }
-
- // TODO remove
- public TransitionImpl createOutgoingTransition(ActivityImpl destination, String
transitionName) {
- TransitionImpl transition = createOutgoingTransition(transitionName);
- if (destination!=null) {
- destination.addIncomingTransition(transition);
- }
- return transition;
- }
-
- // TODO remove
- public TransitionImpl createOutgoingTransition(String transitionName) {
- // create a new transition
- TransitionImpl transition = new TransitionImpl();
- transition.setName(transitionName);
-
- // wire it between the source and destination
- addOutgoingTransition(transition);
-
- // if there is no default transition yet
- if (defaultOutgoingTransition==null) {
- // make this the default outgoing transition
- defaultOutgoingTransition = transition;
- }
-
- return transition;
- }
-
/**
* adds the given transition as a leaving transition to this activity.
* Also the source of the transition is set to this activity.
@@ -140,18 +106,18 @@
* @throws NullPointerException if transition is null.
*/
public Transition addOutgoingTransition(TransitionImpl transition) {
- transition.setSource(this);
-
if (outgoingTransitions==null) {
outgoingTransitions = new ArrayList<TransitionImpl>();
}
if (! outgoingTransitions.contains(transition)) {
+ transition.setSource(this);
+ transition.setSourceIndex(outgoingTransitions.size());
outgoingTransitions.add(transition);
+ clearOutgoingTransitionsMap();
}
- outgoingTransitionsMap = null;
return transition;
}
-
+
/**
* removes the given transition from the leaving transitions.
* Also the transition's source will be nulled.
@@ -175,7 +141,7 @@
if (outgoingTransitions.isEmpty()) {
outgoingTransitions = null;
}
- outgoingTransitionsMap = null;
+ clearOutgoingTransitionsMap();
}
return isRemoved;
}
@@ -241,34 +207,22 @@
*/
public void setOutgoingTransitions(List<TransitionImpl> outgoingTransitions) {
if (this.outgoingTransitions!=null) {
- for (TransitionImpl removedTransition: this.outgoingTransitions) {
- removedTransition.setSource(null);
+ List<TransitionImpl> removedTransitions = new
ArrayList<TransitionImpl>(outgoingTransitions);
+ for (TransitionImpl removedTransition: removedTransitions) {
+ removeOutgoingTransition(removedTransition);
}
}
if (outgoingTransitions!=null) {
- this.outgoingTransitions = new
ArrayList<TransitionImpl>(outgoingTransitions);
+ this.outgoingTransitions = new ArrayList<TransitionImpl>();
for (TransitionImpl addedTransition: outgoingTransitions) {
- addedTransition.setSource(this);
+ addOutgoingTransition(addedTransition);
}
} else {
this.outgoingTransitions = null;
}
- this.outgoingTransitionsMap = null;
+ clearOutgoingTransitionsMap();
}
- /** the leaving transitions, keyed by transition name. If a transition with
- * the same name occurs mutltiple times, the first one is returned.
- * Leaving transitions with a null value for their name are not included
- * in the map.
- * Beware: the actual member is returned. No copy is made.
- */
- public Map<String, Transition> getOutgoingTransitionsMap() {
- if(outgoingTransitionsMap == null){
- this.outgoingTransitionsMap = getTransitionsMap(outgoingTransitions);
- }
- return (Map) outgoingTransitionsMap;
- }
-
// arriving transitions /////////////////////////////////////////////////////
/**
@@ -380,21 +334,33 @@
return behaviour;
}
- // various helper methods ///////////////////////////////////////////////////
-
- private static Map<String, TransitionImpl>
getTransitionsMap(List<TransitionImpl> transitions) {
- Map<String, TransitionImpl> map = null;
- if (transitions!=null) {
- map = new HashMap<String, TransitionImpl>();
- for (TransitionImpl transition: transitions) {
- if (! map.containsKey(transition.getName())) {
- map.put(transition.getName(), transition);
+ /** the leaving transitions, keyed by transition name. If a transition with
+ * the same name occurs mutltiple times, the first one is returned.
+ * Leaving transitions with a null value for their name are not included
+ * in the map.
+ * Beware: the actual member is returned. No copy is made.
+ */
+ public Map<String, Transition> getOutgoingTransitionsMap() {
+ if(outgoingTransitionsMap == null){
+ this.outgoingTransitionsMap = new HashMap<String, TransitionImpl>();
+ if (outgoingTransitions!=null) {
+ for (TransitionImpl transition: outgoingTransitions) {
+ if (! this.outgoingTransitionsMap.containsKey(transition.getName())) {
+ this.outgoingTransitionsMap.put(transition.getName(), transition);
+ }
}
}
}
- return map;
+ return (Map) outgoingTransitionsMap;
}
+
+ void clearOutgoingTransitionsMap() {
+ outgoingTransitionsMap = null;
+ }
+
+ // various helper methods ///////////////////////////////////////////////////
+
static Map<String, ActivityImpl> getActivitiesMap(List<ActivityImpl>
activities) {
Map<String, ActivityImpl> map = null;
if (activities!=null) {
@@ -459,12 +425,6 @@
public void setAsync(boolean isExecutionAsync) {
this.isAsync = isExecutionAsync;
}
- public boolean isPreviousNeeded() {
- return isPreviousNeeded;
- }
- public void setPreviousNeeded(boolean isPreviousNeeded) {
- this.isPreviousNeeded = isPreviousNeeded;
- }
public String getType() {
return type;
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/ExecutionImpl.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -145,11 +145,12 @@
/** transition is not to be made persistable by default */
protected TransitionImpl transition;
+ protected Integer transitionSourceIndex;
/** the activity from which the transition was taken. This can be different from
- * the transition source in case a transition of an eclosing activity was taken.
- * transitionOrigin is not to be made persistable by default */
- protected ActivityImpl transitionOrigin;
+ * the transition source in case a transition of an eclosing activity was taken. */
+ protected ActivityImpl transitionSource;
+ protected String transitionSourceName;
protected EventImpl event;
protected ObservableElementImpl eventSource;
@@ -169,9 +170,6 @@
}
protected Propagation propagation = null;
- protected Activity previousActivity;
- protected Transition previousTransition;
-
// construction /////////////////////////////////////////////////////////////
public void initializeProcessInstance(ProcessDefinitionImpl processDefinition, String
key) {
@@ -244,9 +242,6 @@
child.setActivity(getActivity());
child.setTransition(getTransition());
child.setPropagation(getPropagation());
- child.setTransitionOrigin(getTransitionOrigin());
- child.setPreviousTransition(getPreviousTransition());
- child.setPreviousActivity(getPreviousActivity());
child.initializeVariables(scope, this);
child.initializeTimers(scope);
@@ -261,9 +256,6 @@
parent.setActivity(getActivity());
parent.setTransition(getTransition());
parent.setPropagation(getPropagation());
- parent.setTransitionOrigin(getTransitionOrigin());
- parent.setPreviousTransition(getPreviousTransition());
- parent.setPreviousActivity(getPreviousActivity());
ExecutionImpl parentsParent = parent.getParent();
if ( (parentsParent!=null)
@@ -439,10 +431,6 @@
setPropagation(Propagation.EXPLICIT);
setTransition((TransitionImpl) transition);
- // copy the current activity as the transition origin. the origin can be different
from
- // the transition source in case a transition is taken from an enclosing activity
- setTransitionOrigin(getActivity());
- setPreviousTransition(null);
performAtomicOperation(TRANSITION_END_ACTIVITY);
}
@@ -525,19 +513,10 @@
// execution : internal methods /////////////////////////////////////////////
public void moveTo(ActivityImpl destination) {
- // if the parent activity needs to know the previous activity
- if (destination.isPreviousNeeded()) {
- setPreviousActivity(getActivity());
- setPreviousTransition(getTransition());
- } else {
- this.previousActivity = null;
- this.previousTransition = null;
- }
-
// move the execution to the destination
setActivity(destination);
transition = null;
- transitionOrigin = null;
+ transitionSource = null;
}
public ExecutionImpl startActivity(ActivityImpl activity) {
@@ -1018,8 +997,34 @@
return EqualsUtil.equals(this, o);
}
- // special getters and setters /////////////////////////////////////////////////
+ // process definition getter and setter /////////////////////////////////////
+ // this getter and setter is special because persistence is based on the //
+ // process definition id. //
+ /////////////////////////////////////////////////////////////////////////////
+
+ public ProcessDefinitionImpl getProcessDefinition() {
+ if ( (processDefinition==null)
+ && (processDefinitionId!=null)
+ ) {
+ RepositorySession repositorySession =
Environment.getFromCurrent(RepositorySession.class);
+ processDefinition = (ProcessDefinitionImpl)
repositorySession.findProcessDefinitionById(processDefinitionId);
+ if (processDefinition==null) {
+ throw new JbpmException("couldn't find process definition
"+processDefinitionId+" in the repository");
+ }
+ }
+ return processDefinition;
+ }
+ public void setProcessDefinition(ProcessDefinitionImpl processDefinition) {
+ this.processDefinition = processDefinition;
+ this.processDefinitionId = processDefinition.getId();
+ }
+
+ // activity getter and setter ///////////////////////////////////////////////
+ // this getter and setter is special because persistence is based on the //
+ // activity name. //
+ /////////////////////////////////////////////////////////////////////////////
+
public ActivityImpl getActivity() {
if ( (activity==null)
&& (activityName!=null)
@@ -1042,25 +1047,47 @@
return activityName;
}
- public ProcessDefinitionImpl getProcessDefinition() {
- if ( (processDefinition==null)
- && (processDefinitionId!=null)
+ // transition getter and setter /////////////////////////////////////////////
+ // this getter and setter is special because persistence is based on the //
+ // transition index of the current activity. //
+ /////////////////////////////////////////////////////////////////////////////
+
+ public void setTransition(TransitionImpl transition) {
+ this.transition = transition;
+ if (transition==null) {
+ this.transitionSource = null;
+ this.transitionSourceName = null;
+ this.transitionSourceIndex = null;
+ } else {
+ this.transitionSource = transition.getSource();
+ this.transitionSourceName = transitionSource.getName();
+ this.transitionSourceIndex = transition.getSourceIndex();
+ }
+ }
+
+ public TransitionImpl getTransition() {
+ if ( (transition==null)
+ && (transitionSourceIndex!=null)
) {
- RepositorySession repositorySession =
Environment.getFromCurrent(RepositorySession.class);
- processDefinition = (ProcessDefinitionImpl)
repositorySession.findProcessDefinitionById(processDefinitionId);
- if (processDefinition==null) {
- throw new JbpmException("couldn't find process definition
"+processDefinitionId+" in the repository");
- }
+ transition = (TransitionImpl)
getTransitionSource().getOutgoingTransitions().get(transitionSourceIndex);
}
- return processDefinition;
+ return transition;
}
- public void setProcessDefinition(ProcessDefinitionImpl processDefinition) {
- this.processDefinition = processDefinition;
- this.processDefinitionId = processDefinition.getId();
+
+ public ActivityImpl getTransitionSource() {
+ if ( (transitionSource==null)
+ && (transitionSourceName!=null)
+ ) {
+ transitionSource = getProcessDefinition().findActivity(transitionSourceName);
+ }
+ return transitionSource;
}
+
+
// getters and setters /////////////////////////////////////////////////////////
+
public boolean isProcessInstance() {
return parent==null;
}
@@ -1090,9 +1117,6 @@
public int getPriority() {
return priority;
}
- public TransitionImpl getTransition() {
- return transition;
- }
public void setEvent(EventImpl event) {
this.event = event;
}
@@ -1102,15 +1126,6 @@
public void setPriority(int priority) {
this.priority = priority;
}
- public void setTransition(TransitionImpl transition) {
- this.transition = transition;
- }
- public Activity getPreviousActivity() {
- return previousActivity;
- }
- public Transition getPreviousTransition() {
- return previousTransition;
- }
public ExecutionImpl getProcessInstance() {
return processInstance;
}
@@ -1120,12 +1135,6 @@
public void setComments(Set<CommentImpl> comments) {
this.comments = comments;
}
- public ActivityImpl getTransitionOrigin() {
- return transitionOrigin;
- }
- public void setTransitionOrigin(ActivityImpl transitionOrigin) {
- this.transitionOrigin = transitionOrigin;
- }
public String getKey() {
return key;
}
@@ -1144,12 +1153,6 @@
public void setParent(ExecutionImpl parent) {
this.parent = parent;
}
- public void setPreviousActivity(Activity previousActivity) {
- this.previousActivity = previousActivity;
- }
- public void setPreviousTransition(Transition previousTransition) {
- this.previousTransition = previousTransition;
- }
public ExecutionImpl getSuperProcessExecution() {
return superProcessExecution;
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TransitionImpl.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TransitionImpl.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/TransitionImpl.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -38,6 +38,7 @@
private static final long serialVersionUID = 1L;
protected ActivityImpl source;
+ protected Integer sourceIndex;
protected ActivityImpl destination;
protected Descriptor conditionDescriptor;
protected Descriptor waitConditionDescriptor;
@@ -106,20 +107,9 @@
// getters and setters //////////////////////////////////////////////////////
public void setName(String name) {
- // if there is no source activity associated with this transition
- if (source==null) {
- // it s just a setter
- this.name = name;
-
- } else { // otherwise
- // make sure the source activity's leavingTransitionsMap remains up to date
- if (this.name!=null) {
- source.removeOutgoingTransition(this);
- }
- this.name = name;
- if (name!=null) {
- source.addOutgoingTransition(this);
- }
+ this.name = name;
+ if (source!=null) {
+ source.clearOutgoingTransitionsMap();
}
}
@@ -165,4 +155,10 @@
public void setWaitConditionDescriptor(Descriptor waitConditionDescriptor) {
this.waitConditionDescriptor = waitConditionDescriptor;
}
+ public Integer getSourceIndex() {
+ return sourceIndex;
+ }
+ public void setSourceIndex(Integer sourceIndex) {
+ this.sourceIndex = sourceIndex;
+ }
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/MoveToChildActivity.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/MoveToChildActivity.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/MoveToChildActivity.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -38,7 +38,7 @@
}
public void perform(ExecutionImpl execution) {
- execution.moveTo(activity);
+ execution.setActivity(activity);
ExecutionImpl propagatingExecution = execution.startActivity(activity);
propagatingExecution.performAtomicOperation(ExecutionImpl.EXECUTE_ACTIVITY);
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/MoveToParentActivity.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/MoveToParentActivity.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/MoveToParentActivity.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -35,10 +35,7 @@
ActivityImpl parentActivity = activity.getParentActivity();
ExecutionImpl propagatingExecution = execution.endActivity(activity);
- // Restore original source activity
- // (so that the call to moveTo updates the previous activity)
- propagatingExecution.setActivity(activity);
- propagatingExecution.moveTo(parentActivity);
+ propagatingExecution.setActivity(parentActivity);
propagatingExecution.performAtomicOperation(new Signal(null, null, parentActivity));
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/TransitionStartActivity.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/TransitionStartActivity.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/model/op/TransitionStartActivity.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -41,17 +41,15 @@
public void perform(ExecutionImpl execution) {
ActivityImpl destination = execution.getTransition().getDestination();
execution.setActivity(destination);
- List<ActivityImpl> enteredActivities =
getActivitiesEntered(execution.getTransitionOrigin(), destination);
+ List<ActivityImpl> enteredActivities =
getActivitiesEntered(execution.getTransitionSource(), destination);
ExecutionImpl propagatingExecution = execution;
for (ActivityImpl enteredActivity : enteredActivities) {
propagatingExecution = propagatingExecution.startActivity(enteredActivity);
}
- // Restore original transition source activity
- // (so that the call to moveTo updates the previous activity)
- propagatingExecution.setActivity(execution.getTransitionOrigin());
- propagatingExecution.moveTo(destination);
+ propagatingExecution.setActivity(destination);
+ propagatingExecution.setTransition(null);
propagatingExecution.performAtomicOperation(ExecutionImpl.EXECUTE_ACTIVITY);
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycleParser.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycleParser.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/task/LifeCycleParser.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -25,6 +25,7 @@
import org.jbpm.pvm.internal.model.ActivityImpl;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
+import org.jbpm.pvm.internal.model.TransitionImpl;
import org.jbpm.pvm.internal.util.XmlUtil;
import org.jbpm.pvm.internal.xml.Parse;
import org.jbpm.pvm.internal.xml.Parser;
@@ -88,7 +89,9 @@
String destinationName = element.getAttribute("to");
ActivityImpl destination = (ActivityImpl)
state.getProcessDefinition().getActivity(destinationName);
if (destination!=null) {
- state.createOutgoingTransition(destination, transitionName);
+ TransitionImpl transition = state.createOutgoingTransition();
+ transition.setDestination(destination);
+ transition.setName(transitionName);
} else {
parse.addProblem("destination "+destinationName+" of
"+transitionName+" is unknown");
}
Modified: jbpm4/trunk/modules/pvm/src/main/resources/jbpm.execution.hbm.xml
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/resources/jbpm.execution.hbm.xml 2009-05-18 19:10:55
UTC (rev 4836)
+++ jbpm4/trunk/modules/pvm/src/main/resources/jbpm.execution.hbm.xml 2009-05-18 20:36:04
UTC (rev 4837)
@@ -30,6 +30,8 @@
<property name="activityName" column="ACTIVITYNAME_" />
<property name="processDefinitionId" column="PROCDEFID_"
/>
+ <property name="transitionSourceName" column="TRANSRC_" />
+ <property name="transitionSourceIndex" column="TRANSRCIDX_"
/>
<property name="hasVariables" column="HASVARS_" />
<map name="variables"
Modified:
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/async/AsyncBasicsTest.java
===================================================================
---
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/async/AsyncBasicsTest.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/test/async/AsyncBasicsTest.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -105,62 +105,60 @@
assertNull(processInstance);
}
-// public void testAsyncTransitions() {
-// deployJpdlXmlString(
-// "<process name='TwoAsyncStates'>" +
-// " <start>" +
-// " <transition to='a' />" +
-// " </start>" +
-// " <java name='a'
class='"+Do.class.getName()+"' method='something'>" +
-// " <transition async='true' to='b' />" +
-// " </java>" +
-// " <java name='b'
class='"+Do.class.getName()+"' method='something'>" +
-// " <transition async='true' to='end' />" +
-// " </java>" +
-// " <end name='end' />" +
-// "</process>"
-// );
-//
-// ProcessInstance processInstance =
executionService.startProcessInstanceByKey("TwoAsyncStates");
-// assertEquals("a", processInstance.getActivityName());
-// assertEquals(Execution.STATE_ASYNC, processInstance.getState());
-//
-// assertTrue(doneSomething);
-// doneSomething = false;
-//
-// List<Job> jobs = managementService
-// .createJobQuery()
-// .processInstanceId(processInstance.getId())
-// .list();
-//
-// assertEquals(1, jobs.size());
-//
-// Job job = jobs.get(0);
-//
-// managementService.executeJob(job.getDbid());
-//
-// assertTrue(doneSomething);
-//
-// processInstance =
executionService.findProcessInstanceById(processInstance.getId());
-// assertEquals("b", processInstance.getActivityName());
-// assertEquals(Execution.STATE_ASYNC, processInstance.getState());
-//
-// jobs = managementService
-// .createJobQuery()
-// .processInstanceId(processInstance.getId())
-// .list();
-//
-// assertEquals(1, jobs.size());
-//
-// job = jobs.get(0);
-//
-// managementService.executeJob(job.getDbid());
-//
-// processInstance =
executionService.findProcessInstanceById(processInstance.getId());
-// assertNull(processInstance);
-// }
+ public void testAsyncTransitions() {
+ deployJpdlXmlString(
+ "<process name='TwoAsyncStates'>" +
+ " <start>" +
+ " <transition to='a' />" +
+ " </start>" +
+ " <java name='a' class='"+Do.class.getName()+"'
method='something'>" +
+ " <transition async='true' to='b' />" +
+ " </java>" +
+ " <java name='b' class='"+Do.class.getName()+"'
method='something'>" +
+ " <transition async='true' to='end' />" +
+ " </java>" +
+ " <end name='end' />" +
+ "</process>"
+ );
+
+ ProcessInstance processInstance =
executionService.startProcessInstanceByKey("TwoAsyncStates");
+ assertEquals(Execution.STATE_ASYNC, processInstance.getState());
+ assertTrue(doneSomething);
+ doneSomething = false;
+ List<Job> jobs = managementService
+ .createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .list();
+
+ assertEquals(1, jobs.size());
+
+ Job job = jobs.get(0);
+
+ managementService.executeJob(job.getDbid());
+
+ assertTrue(doneSomething);
+
+ processInstance = executionService.findProcessInstanceById(processInstance.getId());
+ assertEquals(Execution.STATE_ASYNC, processInstance.getState());
+
+ jobs = managementService
+ .createJobQuery()
+ .processInstanceId(processInstance.getId())
+ .list();
+
+ assertEquals(1, jobs.size());
+
+ job = jobs.get(0);
+
+ managementService.executeJob(job.getDbid());
+
+ processInstance = executionService.findProcessInstanceById(processInstance.getId());
+ assertNull(processInstance);
+ }
+
+
public void testExecutionBlockedDuringAsync() {
deployJpdlXmlString(
"<process name='AsyncState'>" +
Deleted:
jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventPropagationTest.java
===================================================================
---
jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventPropagationTest.java 2009-05-18
19:10:55 UTC (rev 4836)
+++
jbpm4/trunk/modules/test-pojo/src/main/java/org/jbpm/test/activities/EventPropagationTest.java 2009-05-18
20:36:04 UTC (rev 4837)
@@ -1,405 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.jbpm.test.activities;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.jbpm.api.activity.ActivityExecution;
-import org.jbpm.api.activity.ExternalActivityBehaviour;
-import org.jbpm.api.client.ClientExecution;
-import org.jbpm.api.client.ClientProcessDefinition;
-import org.jbpm.api.listener.EventListener;
-import org.jbpm.api.listener.EventListenerExecution;
-import org.jbpm.api.model.Activity;
-import org.jbpm.api.model.Event;
-import org.jbpm.api.model.ObservableElement;
-import org.jbpm.pvm.internal.builder.ProcessDefinitionBuilder;
-import org.jbpm.test.BaseJbpmTestCase;
-
-/**
- * @author Tom Baeyens
- */
-public class EventPropagationTest extends BaseJbpmTestCase {
-
- public class Recorder implements EventListener {
- private static final long serialVersionUID = 1L;
- public List<Object> events = new ArrayList<Object>();
- public void notify(EventListenerExecution execution) {
- ObservableElement eventSource = execution.getEventSource();
- events.add(execution.getEvent()+" on "+eventSource);
- }
- }
-
- public static class FireableState implements ExternalActivityBehaviour {
- private static final long serialVersionUID = 1L;
- public void execute(ActivityExecution execution) {
- execution.waitForSignal();
- }
- public void signal(ActivityExecution execution, String signalName, Map<String,
Object> parameters) {
- execution.fire(signalName, execution.getActivity());
- }
- }
-
- public void testListenToActivityLeaveOnProcessForProcessActivities(){
- Recorder recorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent(Event.END)
- .listener(recorder, true)
- .endEvent()
- .startActivity("initial", new WaitState())
- .initial()
- .transition("end")
- .endActivity()
- .startActivity("end", new WaitState())
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
- execution.signal();
-
- assertEquals("event(end) on activity(initial)", recorder.events.get(0));
- assertEquals(1, recorder.events.size());
- }
-
- public void testListenToActivityEnterOnProcessForProcessActivities(){
- Recorder recorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent(Event.START)
- .listener(recorder, true)
- .endEvent()
- .startActivity("initial", new WaitState())
- .initial()
- .transition("end")
- .endActivity()
- .startActivity("end", new WaitState())
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
- execution.signal();
-
- assertEquals("event(start) on process(propagate)",
recorder.events.get(0));
- assertEquals("event(start) on activity(end)", recorder.events.get(1));
- assertEquals(2, recorder.events.size());
- }
-
- public void testListenToTransitionOnProcessForTransitionBetweenProcessActivities(){
- Recorder recorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent(Event.TAKE)
- .listener(recorder, true)
- .endEvent()
- .startActivity("initial", new WaitState())
- .initial()
- .transition("end", "go")
- .endActivity()
- .startActivity("end", new WaitState())
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
- execution.signal();
-
- assertEquals("event(take) on (initial)--go-->(end)",
recorder.events.get(0));
- assertEquals(1, recorder.events.size());
- }
-
- // propagation of process elements in composite activities ///////////////////////
-
- public static class Sequence implements ExternalActivityBehaviour {
- private static final long serialVersionUID = 1L;
- public void execute(ActivityExecution execution) {
- List<Activity> activities = execution.getActivity().getActivities();
- if ( (activities!=null)
- && (!activities.isEmpty())
- ) {
- execution.execute(activities.get(0));
- }
- }
- public void signal(ActivityExecution execution, String signal, Map<String,
Object> parameters) {
- Activity previous = execution.getPreviousActivity();
- List<Activity> activities = execution.getActivity().getActivities();
- int index = activities.indexOf(previous);
- index++;
- if (index < activities.size()) {
- Activity next = activities.get(index);
- execution.execute(next);
- }
- }
- }
-
-
- public void testListenToActivityLeaveOnProcessForSequenceChildActivities(){
- Recorder recorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent(Event.END)
- .listener(recorder, true)
- .endEvent()
- .startActivity("sequence", new Sequence())
- .initial()
- .needsPrevious()
- .startActivity("one", new WaitState())
- .endActivity()
- .startActivity("two", new WaitState())
- .endActivity()
- .startActivity("three", new WaitState())
- .endActivity()
- .endActivity()
- .startActivity("end", new WaitState())
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
- assertEquals(0, recorder.events.size());
- execution.signal();
- assertEquals("event(end) on activity(one)", recorder.events.get(0));
- assertEquals(1, recorder.events.size());
- execution.signal();
- assertEquals("event(end) on activity(two)", recorder.events.get(1));
- assertEquals(2, recorder.events.size());
- execution.signal();
- assertEquals("event(end) on activity(three)", recorder.events.get(2));
- assertEquals("event(end) on process(propagate)", recorder.events.get(3));
- assertEquals(recorder.events.toString(), 4, recorder.events.size());
- }
-
- public void
testListenToActivityLeaveOnProcessForTransitionBetweenSequenceChildActivities(){
- Recorder recorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent(Event.END)
- .listener(recorder, true)
- .endEvent()
- .startActivity("sequence", new Sequence())
- .initial()
- .startActivity("one", new WaitState())
- .transition("two")
- .endActivity()
- .startActivity("two", new WaitState())
- .endActivity()
- .endActivity()
- .startActivity("end", new WaitState())
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
-
- assertEquals(0, recorder.events.size());
- execution.signal();
- assertEquals("event(end) on activity(one)", recorder.events.get(0));
- assertEquals(1, recorder.events.size());
- execution.signal();
- assertEquals("event(end) on activity(two)", recorder.events.get(1));
- assertEquals(2, recorder.events.size());
- }
-
-
- public void testListenToActivityEnterOnProcessForSequenceChildActivities(){
- Recorder recorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent(Event.START)
- .listener(recorder, true)
- .endEvent()
- .startActivity("sequence", new Sequence())
- .initial()
- .needsPrevious()
- .startActivity("one", new WaitState())
- .endActivity()
- .startActivity("two", new WaitState())
- .endActivity()
- .startActivity("three", new WaitState())
- .endActivity()
- .endActivity()
- .startActivity("end", new WaitState())
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
-
- List<Object> expectedEvents = new ArrayList<Object>();
- expectedEvents.add("event(start) on process(propagate)");
- expectedEvents.add("event(start) on activity(one)");
- assertEquals(expectedEvents, recorder.events);
-
- execution.signal();
-
- expectedEvents.add("event(start) on activity(two)");
- assertEquals(expectedEvents, recorder.events);
-
- execution.signal();
-
- expectedEvents.add("event(start) on activity(three)");
- assertEquals(expectedEvents, recorder.events);
- }
-
- public void
testListenToTransitionTakeOnProcessForTransitionBetweenSequenceChildActivities(){
- Recorder recorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent(Event.TAKE)
- .listener(recorder, true)
- .endEvent()
- .startActivity("sequence", new Sequence())
- .initial()
- .startActivity("one", new WaitState())
- .transition("two", "increment")
- .endActivity()
- .startActivity("two", new WaitState())
- .endActivity()
- .endActivity()
- .startActivity("end", new WaitState())
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
-
- assertEquals(0, recorder.events.size());
- execution.signal();
- assertEquals("event(take) on (one)--increment-->(two)",
recorder.events.get(0));
- assertEquals(1, recorder.events.size());
- }
-
- public void testDeeplyNestedCustomEvent(){
- Recorder processRecorder = new Recorder();
- Recorder outerRecorder = new Recorder();
- Recorder middelRecorder = new Recorder();
- Recorder innerRecorder = new Recorder();
- Recorder nestedStateRecorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent("hello")
- .listener(processRecorder, true)
- .endEvent()
- .startActivity("outer", new Sequence())
- .initial()
- .startEvent("hello")
- .listener(outerRecorder, true)
- .endEvent()
- .startActivity("middel", new Sequence())
- .startEvent("hello")
- .listener(middelRecorder, true)
- .endEvent()
- .startActivity("inner", new Sequence())
- .startEvent("hello")
- .listener(innerRecorder, true)
- .endEvent()
- .startActivity("nested state", new FireableState())
- .startEvent("hello")
- .listener(nestedStateRecorder, true)
- .endEvent()
- .endActivity()
- .endActivity()
- .endActivity()
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
-
- assertEquals(0, processRecorder.events.size());
- execution.signal("hello");
-
- assertEquals("event(hello) on activity(nested state)",
processRecorder.events.get(0));
- assertEquals(1, processRecorder.events.size());
-
- assertEquals("event(hello) on activity(nested state)",
outerRecorder.events.get(0));
- assertEquals(1, outerRecorder.events.size());
-
- assertEquals("event(hello) on activity(nested state)",
middelRecorder.events.get(0));
- assertEquals(1, middelRecorder.events.size());
-
- assertEquals("event(hello) on activity(nested state)",
innerRecorder.events.get(0));
- assertEquals(1, innerRecorder.events.size());
-
- assertEquals("event(hello) on activity(nested state)",
nestedStateRecorder.events.get(0));
- assertEquals(1, nestedStateRecorder.events.size());
- }
-
- public void testPropagatedEventsDisabled(){
- Recorder processRecorder = new Recorder();
- Recorder outerRecorder = new Recorder();
- Recorder middleRecorder = new Recorder();
- Recorder innerRecorder = new Recorder();
- Recorder nestedStateRecorder = new Recorder();
-
- ClientProcessDefinition processDefinition = ProcessDefinitionBuilder
- .startProcess("propagate")
- .startEvent("hello")
- .listener(processRecorder, true)
- .endEvent()
- .startActivity("outer", new Sequence())
- .initial()
- .startEvent("hello")
- .listener(outerRecorder, true)
- .endEvent()
- .startActivity("middle", new Sequence())
- .startEvent("hello")
- .listener(middleRecorder)
- .endEvent()
- .startActivity("inner", new Sequence())
- .startEvent("hello")
- .listener(innerRecorder, true)
- .endEvent()
- .startActivity("nested state", new FireableState())
- .startEvent("hello")
- .listener(nestedStateRecorder)
- .endEvent()
- .endActivity()
- .endActivity()
- .endActivity()
- .endActivity()
- .endProcess();
-
- ClientExecution execution = processDefinition.startProcessInstance();
-
- // the middle action should not be executed for an event that was propagated from the
nested state
- execution.signal("hello");
-
- assertEquals("event(hello) on activity(nested state)",
processRecorder.events.get(0));
- assertEquals(1, processRecorder.events.size());
-
- assertEquals("event(hello) on activity(nested state)",
outerRecorder.events.get(0));
- assertEquals(1, outerRecorder.events.size());
-
- assertEquals(0, middleRecorder.events.size());
-
- assertEquals("event(hello) on activity(nested state)",
innerRecorder.events.get(0));
- assertEquals(1, innerRecorder.events.size());
-
- assertEquals("event(hello) on activity(nested state)",
nestedStateRecorder.events.get(0));
- assertEquals(1, nestedStateRecorder.events.size());
- }
-}