[jbpm-commits] JBoss JBPM SVN: r4837 - in jbpm4/trunk/modules: api/src/main/java/org/jbpm/api/model and 8 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon May 18 16:36:04 EDT 2009


Author: tom.baeyens at 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());
-  }
-}




More information about the jbpm-commits mailing list