[jbpm-commits] JBoss JBPM SVN: r1911 - in jbossbpm/spec/trunk/modules: api/src/main/java/org/jboss/bpm/runtime and 8 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Sun Aug 17 12:18:38 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-08-17 12:18:36 -0400 (Sun, 17 Aug 2008)
New Revision: 1911

Added:
   jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketTest.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/ReceiveTaskTest.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/SendTaskTest.java
Removed:
   jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AbstractAirticketTest.java
   jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java
Modified:
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/MessageManager.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowHandler.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/TokenExecutor.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ComplexGatewayImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EndEventImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessBuilderImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ReceiveTaskImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/TokenExecutorImpl.java
   jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketAPIDescriptorTest.java
   jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketSTPDescriptorTest.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveGatewaySplitTest.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/multichoice/MultiChoiceTest.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/synchronization/SynchronizationTest.java
Log:
Add token activate

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/MessageManager.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/MessageManager.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/MessageManager.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -38,9 +38,7 @@
 import org.jboss.bpm.model.Task;
 
 /**
- * The ProcessEngine sends mesages through the MessageManager. 
- * <p/> 
- * A {@link Message} has an ID and is targeted to a
+ * The ProcessEngine sends mesages through the MessageManager. <p/> A {@link Message} has an ID and is targeted to a
  * specific {@link Participant}. A component can register a {@link MessageListener} with the MessageManager.
  * 
  * @author thomas.diesler at jboss.com
@@ -62,7 +60,7 @@
     ProcessEngine engine = ProcessEngine.locateProcessEngine();
     return engine.getMessageManager();
   }
-  
+
   /**
    * Add a MessageListener
    */
@@ -70,13 +68,14 @@
   {
     if (hasMessageListener(listener.getID()))
       throw new IllegalStateException("Listener already registered: " + listener.getID());
-    
-    log.debug("addMessageListener: " + listener);
+
+    log.debug("addMessageListener: " + listener.getID());
     listeners.put(listener.getID(), listener);
   }
 
   /**
    * Get a MessageListener for a given ID
+   * 
    * @return null if there is none
    */
   public MessageListener getMessageListener(ObjectName listenerID)
@@ -108,6 +107,9 @@
   {
     ProcessManager pm = ProcessManager.locateProcessManager();
     Process proc = pm.getProcessByID(procID);
+    if (proc == null)
+      throw new IllegalStateException("Cannot obtain registered process: " + procID);
+
     FlowObject target = proc.getFlowObject(targetName);
     if (target == null)
       throw new IllegalArgumentException("Cannot find message target: " + targetName);

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -33,10 +33,8 @@
 import org.jboss.bpm.model.Signal;
 
 /**
- * The ProcessEngine sends signals through the SignalManager
- * <p/>
- * A {@link Signal} is like an undirected flare shot up into the air. 
- * A component can register a {@link SignalListener} with the SignalManager.
+ * The ProcessEngine sends signals through the SignalManager <p/> A {@link Signal} is like an undirected flare shot up
+ * into the air. A component can register a {@link SignalListener} with the SignalManager.
  * 
  * @author thomas.diesler at jboss.com
  * @since 18-Jun-2008
@@ -45,10 +43,10 @@
 {
   // provide logging
   private static final Log log = LogFactory.getLog(SignalManager.class);
-  
+
   // The map of registered signal listeners
   private Map<String, Set<SignalListener>> listeners = new HashMap<String, Set<SignalListener>>();
-  
+
   /**
    * Locate the SignalManager
    */
@@ -57,11 +55,11 @@
     ProcessEngine engine = ProcessEngine.locateProcessEngine();
     return engine.getSignalManager();
   }
-  
+
   /**
    * Add a SignalListener for a given process
    */
-  public void addSignalListener(String procName, SignalListener listener)
+  public synchronized void addSignalListener(String procName, SignalListener listener)
   {
     log.debug("addSignalListener: " + procName + "=" + listener);
     Set<SignalListener> set = listeners.get(procName);
@@ -76,7 +74,7 @@
   /**
    * Remove an SignalListener for a given process
    */
-  public void removeSignalListener(String procName, SignalListener listener)
+  public synchronized void removeSignalListener(String procName, SignalListener listener)
   {
     log.debug("removeSignalListener: " + procName + "=" + listener);
     Set<SignalListener> set = listeners.get(procName);
@@ -86,40 +84,52 @@
     }
   }
 
-  /** 
-   * Remove all SignalListener for a given process 
+  /**
+   * Remove all SignalListener for a given process
    */
-  public void removeSignalListeners(String procName)
+  public synchronized void removeSignalListeners(String procName)
   {
     log.debug("removeSignalListeners: " + procName);
     listeners.remove(procName);
   }
 
-  /** 
-   * Throw a signal to all registered listeners 
+  /**
+   * Throw a signal to all registered listeners
    */
   public void throwSignal(String procName, Signal signal)
   {
     log.debug("throwSignal: " + procName + "=" + signal);
-    
+
     // Throw Signal to listeners associated with the process
-    Set<SignalListener> set = listeners.get(procName);
-    if (set != null)
+    Set<SignalListener> procListeners = listeners.get(procName);
+    if (procListeners != null)
     {
-      for (SignalListener listener : set)
+      for (SignalListener listener : procListeners)
       {
-        listener.catchSignal(signal);
+        failsafeThrow(listener, signal);
       }
     }
-    
+
     // Throw Signal to listeners not associated with any process
-    set = listeners.get(null);
-    if (set != null)
+    Set<SignalListener> allProcListeners = listeners.get(null);
+    if (allProcListeners != null)
     {
-      for (SignalListener listener : set)
+      for (SignalListener listener : allProcListeners)
       {
-        listener.catchSignal(signal);
+        failsafeThrow(listener, signal);
       }
     }
   }
+
+  private void failsafeThrow(SignalListener listener, Signal signal)
+  {
+    try
+    {
+      listener.catchSignal(signal);
+    }
+    catch (RuntimeException rte)
+    {
+      log.error("Signal processing error", rte);
+    }
+  }
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowHandler.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowHandler.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowHandler.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -25,7 +25,6 @@
 
 import org.jboss.bpm.client.ProcessEngine;
 import org.jboss.bpm.model.FlowObject;
-import org.jboss.bpm.model.SequenceFlow;
 
 /**
  * The {@link ProcessEngine} invokes the FlowHandler on an {@link HandlerSupport} 
@@ -37,11 +36,11 @@
 public interface FlowHandler extends Handler
 {
   /**
-   * Execute the the FlowHandler.
+   * Execute the FlowHandler.
    * <p/>
-   * The FlowHandler will add the active outgoing {@link SequenceFlow}s to
-   * the the {@link TokenExecutor} for the {@link ProcessEngine} to execute.    
+   * The FlowHandler typically invoves one of the {@link TokenExecutor} 
+   * methods to move the {@link Token} to the next {@link FlowObject}.    
    */
-  void execute(TokenExecutor scheduler, Token token);
+  void execute(TokenExecutor tokenExecutor, Token token);
 
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/TokenExecutor.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/TokenExecutor.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/TokenExecutor.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -39,12 +39,12 @@
   /**
    * Get the set of active tokens
    */
-  Set<Token> getActiveTokens();
+  Set<Token> getRunnableTokens();
   
   /**
    * True if there are active tokens
    */
-  boolean hasActiveTokens();
+  boolean hasRunnableTokens();
   
   /**
    * Create a {@link Token} with an initial flow

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -78,14 +78,14 @@
   {
     super.setUp();
     log.debug("setUp: " + getClass().getName() + "." + getName());
-    
+
     deployer = new EmbeddedBeansDeployer();
-    
+
     // Setup the SignalListener
     SignalManager signalManager = SignalManager.locateSignalManager();
     signalManager.addSignalListener(null, getSignalListener());
     signals.clear();
-    
+
     // Setup the MessageListener
     MessageManager messageManager = MessageManager.locateMessageManager();
     messageManager.addMessageListener(getMessageListener());
@@ -95,16 +95,16 @@
   protected void tearDown() throws Exception
   {
     log.debug("tearDown: " + getClass().getName() + "." + getName());
-    
+
     // Tear down the SignalListener
     SignalManager signalManager = SignalManager.locateSignalManager();
     signalManager.removeSignalListeners(null);
-    
+
     // Tear down the MessageListener
     MessageManager messageManager = MessageManager.locateMessageManager();
     messageManager.removeMessageListener(getMessageListenerID());
-    
-    // Check that there are no registered processes left 
+
+    // Check that there are no registered processes left
     ProcessManager procManager = ProcessManager.locateProcessManager();
     Set<Process> procs = procManager.getProcesses();
     if (procs.size() > 0)
@@ -113,7 +113,7 @@
       System.out.println(logMsg);
       log.warn(logMsg);
     }
-    
+
     super.tearDown();
   }
 
@@ -161,6 +161,11 @@
         {
           signals.add(signal);
         }
+
+        public String toString()
+        {
+          return "SignalListener[" + getShortName() + "]";
+        }
       };
     }
     return signalListener;
@@ -168,18 +173,26 @@
 
   public List<Signal> getSignals()
   {
-    return Collections.unmodifiableList(signals);
+    SignalManager signalManager = SignalManager.locateSignalManager();
+    synchronized (signalManager)
+    {
+      return Collections.unmodifiableList(signals);
+    }
   }
 
   public List<Signal> getSignals(Signal.SignalType type)
   {
-    List<Signal> retSignals = new ArrayList<Signal>();
-    for (Signal sig : signals)
+    SignalManager signalManager = SignalManager.locateSignalManager();
+    synchronized (signalManager)
     {
-      if (sig.getSignalType() == type)
-        retSignals.add(sig); 
+      List<Signal> retSignals = new ArrayList<Signal>();
+      for (Signal sig : signals)
+      {
+        if (sig.getSignalType() == type)
+          retSignals.add(sig);
+      }
+      return Collections.unmodifiableList(retSignals);
     }
-    return Collections.unmodifiableList(retSignals);
   }
 
   public MessageListener getMessageListener()
@@ -192,11 +205,14 @@
         {
           return getMessageListenerID();
         }
-        
+
         public void catchMessage(Message message)
         {
-          log.debug("catchMessage: " + message);
-          messages.add(message);
+          synchronized (messages)
+          {
+            log.debug("catchMessage: " + message);
+            messages.add(message);
+          }
         }
       };
     }
@@ -205,21 +221,23 @@
 
   public ObjectName getMessageListenerID()
   {
-    String className = getClass().getName();
-    className = className.substring(className.lastIndexOf(".") + 1);
-    return ObjectNameFactory.create(BPMNElement.ID_DOMAIN, "msgListener", className);
+    return ObjectNameFactory.create(BPMNElement.ID_DOMAIN, "msgListener", getShortName());
   }
-  
+
   public List<Message> getMessages()
   {
-    return Collections.unmodifiableList(messages);
+    synchronized (messages)
+    {
+      return Collections.unmodifiableList(messages);
+    }
   }
-  
+
   /**
    * Marshall the given process
+   * 
    * @param out if null, the proces is marshalled to a file
    */
-  public String _marshallProcess(Process proc, Writer out) 
+  public String marshallProcess(Process proc, Writer out)
   {
     try
     {
@@ -229,11 +247,11 @@
         out = new FileWriter(file);
         System.out.println("Marshall process to: " + file.getCanonicalPath());
       }
-      
+
       String procXML = marshallProcess(proc);
       out.write(procXML);
       out.close();
-      
+
       return procXML;
     }
     catch (IOException ex)
@@ -249,9 +267,18 @@
   {
     ProcessManager pm = ProcessManager.locateProcessManager();
     DialectHandler dhapi = pm.getDialectHandler(DialectHandler.DEFAULT_NAMESPACE_URI);
-    
+
     StringWriter strwr = new StringWriter();
     dhapi.marshallProcess(proc, strwr);
     return strwr.toString();
   }
+
+  /**
+   * Get the test short name, which is the class name without the package
+   */
+  protected String getShortName()
+  {
+    String shortName = getClass().getName();
+    return shortName.substring(shortName.lastIndexOf(".") + 1);
+  }
 }

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -161,7 +161,7 @@
       
       String procName = proc.getName();
       ProcessStatus procStatus = proc.getProcessStatus();
-      boolean hasActiveTokens = tokenExecutor.hasActiveTokens();
+      boolean hasActiveTokens = tokenExecutor.hasRunnableTokens();
       try
       {
         synchronized (proc)
@@ -177,9 +177,9 @@
               log.error("Executor thread interrupted");
             }
             procStatus = proc.getProcessStatus();
-            hasActiveTokens = tokenExecutor.hasActiveTokens();
+            hasActiveTokens = tokenExecutor.hasRunnableTokens();
           }
-          log.debug("End execution thread [status=" + procStatus + ",tokens=" + tokenExecutor.getActiveTokens() + "]");
+          log.debug("End execution thread [status=" + procStatus + ",tokens=" + tokenExecutor.getRunnableTokens() + "]");
         }
       }
       finally

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -30,7 +30,6 @@
 import org.jboss.bpm.model.Process.ProcessStatus;
 import org.jboss.bpm.model.internal.FlowObjectImpl;
 import org.jboss.bpm.model.internal.ProcessImpl;
-import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.HandlerSupport;
 import org.jboss.bpm.runtime.RuntimeProcess;
 import org.jboss.bpm.runtime.SignalHandler;
@@ -69,8 +68,6 @@
   {
     TokenExecutor tokenExecutor = rtProc.getTokenExecutor();
     ProcessImpl procImpl = (ProcessImpl)rtProc.getProcess();
-
-    token.setTokenStatus(TokenStatus.Started);
     try
     {
       ConnectingObject flow = token.getFlow();
@@ -86,10 +83,9 @@
         // Get the target and its handlers
         FlowObjectImpl targetFlowObject = (FlowObjectImpl)flow.getTargetRef();
         SignalHandler sigHandler = getSignalHandler(targetFlowObject);
-        FlowHandler flowHandler = getFlowHandler(targetFlowObject);
 
-        // Synchronize execution of the target and the flow handler
-        synchronized (rtProc)
+        // Synchronize execution on the target FlowObject
+        synchronized (procImpl)
         {
           try
           {
@@ -97,13 +93,13 @@
             sigHandler.throwEnterSignal();
 
             // Create a Token that includes properties from the current Activity
-            DelegatingToken delegatingToken = new DelegatingToken(token);
+            DelegatingToken delToken = new DelegatingToken(token);
 
             // Execute the target FlowObject
-            targetFlowObject.execute(delegatingToken);
+            targetFlowObject.execute(delToken);
 
             // Transfer the token to the FlowHandler
-            flowHandler.execute(tokenExecutor, delegatingToken);
+            targetFlowObject.executeFlowHandler(tokenExecutor, delToken);
           }
           catch (RuntimeException rte)
           {
@@ -119,11 +115,6 @@
 
         tokStatus = token.getTokenStatus();
         procStatus = procImpl.getProcessStatus();
-
-        // Make sure the next flow is different from the previous one
-        ConnectingObject nextFlow = token.getFlow();
-        if (tokStatus == TokenStatus.Started && nextFlow == flow)
-          throw new IllegalStateException("Flow handler did not move the token: " + targetFlowObject);
       }
     }
     catch (RuntimeException rte)
@@ -134,11 +125,12 @@
     }
     finally
     {
-
-      token.setTokenStatus(TokenStatus.Destroyed);
-      // Notify the ExecutionManager when a token terminates
+      if (token.getTokenStatus() != TokenStatus.Suspended)
+        token.setTokenStatus(TokenStatus.Destroyed);
+      
       synchronized (procImpl)
       {
+        // Notify the ExecutionManager when a token terminates
         procImpl.notifyAll();
       }
     }
@@ -154,16 +146,6 @@
     return handler;
   }
 
-  private FlowHandler getFlowHandler(FlowObject target)
-  {
-    HandlerSupport handlerSupport = getHandlerSupport(target);
-    FlowHandler handler = handlerSupport.getFlowHandler();
-    if (handler == null)
-      throw new IllegalStateException("Cannot obtain flow handler from: " + target);
-
-    return handler;
-  }
-
   private HandlerSupport getHandlerSupport(FlowObject fo)
   {
     if (fo instanceof HandlerSupport == false)

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -38,7 +38,6 @@
 import org.jboss.bpm.model.Property;
 import org.jboss.bpm.model.SequenceFlow;
 import org.jboss.bpm.runtime.ExecutionContext;
-import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.MutablePropertySupport;
 import org.jboss.bpm.runtime.Token;
 import org.jboss.bpm.runtime.TokenExecutor;
@@ -265,7 +264,8 @@
     {
       Property outProp = outputSet.getProperty(prop.getName());
       if (outProp == null)
-        throw new IllegalStateException("Cannot find outputSet property '" + prop.getName() + "' in Activity: " + getName());
+        throw new IllegalStateException("Cannot find outputSet property '" + prop.getName() + "' in Activity: "
+            + getName());
 
       String name = outProp.getName();
       String value = outProp.getValue();
@@ -287,20 +287,10 @@
     // }
   }
 
-  public FlowHandler getFlowHandler()
+  @Override
+  protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
   {
-    FlowHandler handler = super.getFlowHandler();
-    if (handler == null)
-    {
-      handler = new FlowHandler()
-      {
-        public void execute(TokenExecutor tokenExecutor, Token token)
-        {
-          tokenExecutor.move(token, outFlow);
-        }
-      };
-    }
-    return handler;
+    tokenExecutor.move(token, getOutFlow());
   }
 
   @Override

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ComplexGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ComplexGatewayImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ComplexGatewayImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -26,6 +26,8 @@
 import org.jboss.bpm.NotImplementedException;
 import org.jboss.bpm.model.ComplexGateway;
 import org.jboss.bpm.model.Expression;
+import org.jboss.bpm.runtime.Token;
+import org.jboss.bpm.runtime.TokenExecutor;
 
 /**
  * A Complex Gateway handles situations that are not easily handled through the other types of Gateways. Complex
@@ -58,6 +60,12 @@
     throw new NotImplementedException("JBPM-1637", "ComplexGateway outgoing condition");
   }
 
+  @Override
+  protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
+  {
+    throw new NotImplementedException("JBPM-1637", "ComplexGateway outgoing condition");
+  }
+
   public String toString()
   {
     return "ComplexGateway[" + getName() + "]";

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EndEventImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EndEventImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EndEventImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -37,7 +37,6 @@
 import org.jboss.bpm.model.SequenceFlow;
 import org.jboss.bpm.model.Signal;
 import org.jboss.bpm.model.EventDetail.EventDetailType;
-import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.SignalHandler;
 import org.jboss.bpm.runtime.Token;
 import org.jboss.bpm.runtime.TokenExecutor;
@@ -104,21 +103,11 @@
     }
   }
 
-  public FlowHandler getFlowHandler()
+  @Override
+  protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
   {
-    FlowHandler handler = super.getFlowHandler();
-    if (handler == null)
-    {
-      handler = new FlowHandler()
-      {
-        public void execute(TokenExecutor tokenExecutor, Token token)
-        {
-          log.debug("End reached in: " + getName());
-          tokenExecutor.destroy(token);
-        }
-      };
-    }
-    return handler;
+    log.debug("End reached in: " + getName());
+    tokenExecutor.destroy(token);
   }
 
   public SignalHandler getSignalHandler()

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -31,11 +31,10 @@
 import org.jboss.bpm.model.ConnectingObject;
 import org.jboss.bpm.model.ExclusiveGateway;
 import org.jboss.bpm.model.Expression;
+import org.jboss.bpm.model.FlowObject;
 import org.jboss.bpm.model.Gate;
-import org.jboss.bpm.model.GraphicalElement;
 import org.jboss.bpm.model.SequenceFlow;
 import org.jboss.bpm.model.SequenceFlow.ConditionType;
-import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.Token;
 import org.jboss.bpm.runtime.TokenExecutor;
 
@@ -85,41 +84,30 @@
   }
 
   @Override
-  public FlowHandler getFlowHandler()
+  protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
   {
-    FlowHandler handler = super.getFlowHandler();
-    if (handler == null)
+    FlowObject sourceRef = token.getFlow().getSourceRef();
+    
+    // Schedule the first token that arrives
+    if (token == receivedTokens.get(0))
     {
-      handler = new FlowHandler()
-      {
-        public void execute(TokenExecutor tokenExecutor, Token token)
-        {
-          GraphicalElement sourceRef = token.getFlow().getSourceRef();
-          
-          // Schedule the first token that arrives
-          if (token == receivedTokens.get(0))
-          {
-            log.debug("Propagate token comming from: " + sourceRef);
-            Gate selectedGate = getSelectedGate(token);
-            SequenceFlow outFlow = selectedGate.getOutgoingSequenceFlow();
-            tokenExecutor.move(token, outFlow);
-          }
-          // Ignore all other tokens
-          else
-          {
-            log.debug("Ignore token comming from: " + sourceRef);
-            tokenExecutor.destroy(token);
-          }
+      log.debug("Propagate token comming from: " + sourceRef);
+      Gate selectedGate = getSelectedGate(token);
+      SequenceFlow outFlow = selectedGate.getOutgoingSequenceFlow();
+      tokenExecutor.move(token, outFlow);
+    }
+    // Ignore all other tokens
+    else
+    {
+      log.debug("Ignore token comming from: " + sourceRef);
+      tokenExecutor.destroy(token);
+    }
 
-          // Reset the gateway
-          if (outstandingFlows.size() == 0)
-          {
-            reset();
-          }
-        }
-      };
+    // Reset the gateway
+    if (outstandingFlows.size() == 0)
+    {
+      reset();
     }
-    return handler;
   }
 
   @Override

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -44,6 +44,7 @@
 import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.SignalHandler;
 import org.jboss.bpm.runtime.Token;
+import org.jboss.bpm.runtime.TokenExecutor;
 
 //$Id$
 
@@ -128,27 +129,25 @@
    */
   public void execute(Token token)
   {
-    // Evaluate the Start time assignments
+    // Start Time Assignments
     for (Assignment ass : getAssignments())
     {
       if (ass.getAssignTime() == AssignTime.Start)
         processAssignment(ass, token);
     }
 
-    // Call the user provided execution handler
+    // Call the ExecutionHandler
     ExecutionHandler exHandler = getExecutionHandler();
     if (exHandler != null)
     {
       exHandler.execute(token);
     }
-    
-    // Fall back to the default execution
     else
     {
       defaultExecution(token);
     }
 
-    // Evaluate the End time assignments
+    // End Time Assignments
     for (Assignment ass : getAssignments())
     {
       if (ass.getAssignTime() == AssignTime.End)
@@ -166,11 +165,39 @@
     exContext.addAttachment(propName, result);
   }
 
+  /**
+   * Execute the FlowHandler. Keep final, it should not be necessary to override this.
+   */
+  public final void executeFlowHandler(TokenExecutor tokenExecutor, Token token)
+  {
+    // Call the ExecutionHandler
+    FlowHandler flowHandler = getFlowHandler();
+    if (flowHandler != null)
+    {
+      flowHandler.execute(tokenExecutor, token);
+    }
+    else
+    {
+      defaultFlowHandler(tokenExecutor, token);
+    }
+  }
+
+  /**
+   * Overwrite to provide an implementation
+   */
   protected void defaultExecution(Token token)
   {
     // noting to do
   }
 
+  /**
+   * Overwrite to provide an implementation
+   */
+  protected abstract void defaultFlowHandler(TokenExecutor tokenExecutor, Token token);
+
+  /**
+   * Reset the FlowObject's state
+   */
   public void reset()
   {
     // noting to do

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -38,7 +38,6 @@
 import org.jboss.bpm.model.Expression.ExpressionLanguage;
 import org.jboss.bpm.model.SequenceFlow.ConditionType;
 import org.jboss.bpm.runtime.ExecutionContext;
-import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.Token;
 import org.jboss.bpm.runtime.TokenExecutor;
 import org.jboss.bpm.runtime.Attachments.Key;
@@ -69,47 +68,36 @@
   }
 
   @Override
-  public FlowHandler getFlowHandler()
+  protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
   {
-    FlowHandler handler = super.getFlowHandler();
-    if (handler == null)
+    GraphicalElement sourceRef = token.getFlow().getSourceRef();
+    log.debug("Propagate token comming from: " + sourceRef);
+    
+    // Get the applicable gates
+    List<Gate> applicableGates = getApplicableGates(token);
+    log.debug("applicableGates: " + applicableGates);
+    
+    // Destroy the incomming token if there are 
+    // more than one applicable gates
+    if (applicableGates.size() > 1)
+      tokenExecutor.destroy(token);
+    
+    for (Gate aux : applicableGates)
     {
-      handler = new FlowHandler()
+      SequenceFlow outFlow = aux.getOutgoingSequenceFlow();
+      if (applicableGates.size() == 1)
       {
-        public void execute(TokenExecutor tokenExecutor, Token token)
-        {
-          GraphicalElement sourceRef = token.getFlow().getSourceRef();
-          log.debug("Propagate token comming from: " + sourceRef);
-          
-          // Get the applicable gates
-          List<Gate> applicableGates = getApplicableGates(token);
-          log.debug("applicableGates: " + applicableGates);
-          
-          // Destroy the incomming token if there are 
-          // more than one applicable gates
-          if (applicableGates.size() > 1)
-            tokenExecutor.destroy(token);
-          
-          for (Gate aux : applicableGates)
-          {
-            SequenceFlow outFlow = aux.getOutgoingSequenceFlow();
-            if (applicableGates.size() == 1)
-            {
-              tokenExecutor.move(token, outFlow);
-            }
-            else
-            {
-              Token outToken = token.copyToken();
-              tokenExecutor.create(outToken, outFlow);
-              tokenExecutor.start(outToken);
-            }
-          }
-        }
-      };
+        tokenExecutor.move(token, outFlow);
+      }
+      else
+      {
+        Token outToken = token.copyToken();
+        tokenExecutor.create(outToken, outFlow);
+        tokenExecutor.start(outToken);
+      }
     }
-    return handler;
   }
-
+  
   // Get applicable gates which' condition evaluates to TRUE
   // Fall back to the default gate if there is one
   // Choke if there is no applicable gate

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -33,7 +33,6 @@
 import org.jboss.bpm.model.IntermediateEvent;
 import org.jboss.bpm.model.SequenceFlow;
 import org.jboss.bpm.model.Signal;
-import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.SignalHandler;
 import org.jboss.bpm.runtime.Token;
 import org.jboss.bpm.runtime.TokenExecutor;
@@ -88,20 +87,10 @@
     triggers.add(eventDetail);
   }
   
-  public FlowHandler getFlowHandler()
+  @Override
+  protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
   {
-    FlowHandler handler = super.getFlowHandler();
-    if (handler == null)
-    {
-      handler = new FlowHandler()
-      {
-        public void execute(TokenExecutor tokenExecutor, Token token)
-        {
-          tokenExecutor.move(token, getOutFlow());
-        }
-      };
-    }
-    return handler;
+    tokenExecutor.move(token, getOutFlow());
   }
 
   public SignalHandler getSignalHandler()

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -30,10 +30,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.jboss.bpm.model.ConnectingObject;
 import org.jboss.bpm.model.Gate;
-import org.jboss.bpm.model.Gateway;
 import org.jboss.bpm.model.ParallelGateway;
 import org.jboss.bpm.model.SequenceFlow;
-import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.Token;
 import org.jboss.bpm.runtime.TokenExecutor;
 import org.jboss.bpm.runtime.internal.TokenImpl;
@@ -81,67 +79,55 @@
     mergeTokens.add(token);
   }
 
-  public FlowHandler getFlowHandler()
+  @Override
+  protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
   {
-    FlowHandler handler = super.getFlowHandler();
-    if (handler == null)
+    // In any case, the incomming token is not propagated
+    tokenExecutor.suspend(token);
+    
+    // If the gateway has a single incomming flow the outgoing token is the incomming token 
+    Token outToken = (getInFlows().size() == 1 ? token : null);
+    
+    // The outgoing token is the merge of all incomming tokens
+    if (outToken == null)
     {
-      final Gateway gateway = this;
-
-      handler = new FlowHandler()
+      // If there are no more outstanding flows
+      if (outstandingFlows.size() == 0)
       {
-        public void execute(TokenExecutor tokenExecutor, Token token)
-        {
-          // In any case, the incomming token is not propagated
-          tokenExecutor.suspend(token);
-          
-          // If the gateway has a single incomming flow the outgoing token is the incomming token 
-          Token outToken = (getInFlows().size() == 1 ? token : null);
-          
-          // The outgoing token is the merge of all incomming tokens
-          if (outToken == null)
-          {
-            // If there are no more outstanding flows
-            if (outstandingFlows.size() == 0)
-            {
-              // Merge the tokens together and submit the merged tokens
-              outToken = getMergedTokens();
-            }
+        // Merge the tokens together and submit the merged tokens
+        outToken = getMergedTokens();
+      }
 
-            // There are outstanding flows
-            else if (outstandingFlows.size() > 0)
-            {
-              log.debug("Waiting for " + outstandingFlows + " in gateway: " + gateway);
-            }
-          }
-          
-          // Schedule the outgoing token
-          if (outToken != null)
-          {
-            // Start a copy of the outgoing token for every gate
-            for(Gate gate : getGates())
-            {
-              SequenceFlow outFlow = gate.getOutgoingSequenceFlow();
-              Token copyToken = outToken.copyToken();
-              tokenExecutor.create(copyToken, outFlow);
-              tokenExecutor.start(copyToken);
-            }
-            
-            // Destroy the received tokens
-            for (Token auxToken : receivedTokens)
-            {
-              tokenExecutor.destroy(auxToken);
-            }
-            
-            // Reset the gateway
-            reset();
-          }
-        }
-      };
+      // There are outstanding flows
+      else if (outstandingFlows.size() > 0)
+      {
+        log.debug("Waiting for " + outstandingFlows + " in gateway: " + this);
+      }
     }
-    return handler;
+    
+    // Schedule the outgoing token
+    if (outToken != null)
+    {
+      // Start a copy of the outgoing token for every gate
+      for(Gate gate : getGates())
+      {
+        SequenceFlow outFlow = gate.getOutgoingSequenceFlow();
+        Token copyToken = outToken.copyToken();
+        tokenExecutor.create(copyToken, outFlow);
+        tokenExecutor.start(copyToken);
+      }
+      
+      // Destroy the received tokens
+      for (Token auxToken : receivedTokens)
+      {
+        tokenExecutor.destroy(auxToken);
+      }
+      
+      // Reset the gateway
+      reset();
+    }
   }
-
+  
   @Override
   public void reset()
   {

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessBuilderImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessBuilderImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessBuilderImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -73,28 +73,28 @@
   {
     for(Message msg : addProc.getMessages())
     {
-      proc.addMessage(msg);
+      getProcessInternal().addMessage(msg);
     }
     for(FlowObject fo : addProc.getFlowObjects())
     {
-      proc.addFlowObject(fo);
+      getProcessInternal().addFlowObject(fo);
     }
     return this;
   }
 
   public Process getProcess()
   {
-    if (proc == null)
+    if (getProcessInternal() == null)
       throw new IllegalStateException("No process has been added");
-    proc.initialize();
-    return proc;
+    getProcessInternal().initialize();
+    return getProcessInternal();
   }
 
   public Process getProcessForInclude()
   {
-    if (proc == null)
+    if (getProcessInternal() == null)
       throw new IllegalStateException("No process has been added");
-    return proc;
+    return getProcessInternal();
   }
 
   public ProcessBuilder addSequenceFlow(String targetName)
@@ -111,7 +111,7 @@
     }
     else if (flowObject instanceof Gateway)
     {
-      GatewayBuilder gwBuilder = new GatewayBuilderImpl(proc, flowObject);
+      GatewayBuilder gwBuilder = new GatewayBuilderImpl(getProcessInternal(), flowObject);
       gwBuilder.addGate(targetName);
     }
     else
@@ -129,23 +129,23 @@
   public EventBuilder addStartEvent(String name)
   {
     flowObject = addFlowObject(new StartEventImpl(name));
-    return new EventBuilderImpl(proc, flowObject);
+    return new EventBuilderImpl(getProcessInternal(), flowObject);
   }
 
   public EventBuilder addEvent(String name)
   {
-    flowObject = (FlowObjectImpl)proc.getFlowObject(name);
+    flowObject = (FlowObjectImpl)getProcessInternal().getFlowObject(name);
     if (flowObject == null)
       flowObject = addFlowObject(new IntermediateEventImpl(name));
-    return new EventBuilderImpl(proc, flowObject);
+    return new EventBuilderImpl(getProcessInternal(), flowObject);
   }
 
   public EventBuilder addEndEvent(String name)
   {
-    flowObject = (FlowObjectImpl)proc.getFlowObject(name);
+    flowObject = (FlowObjectImpl)getProcessInternal().getFlowObject(name);
     if (flowObject == null)
       flowObject = addFlowObject(new EndEventImpl(name));
-    return new EventBuilderImpl(proc, flowObject);
+    return new EventBuilderImpl(getProcessInternal(), flowObject);
   }
 
   public TaskBuilder addTask(String name)
@@ -155,7 +155,7 @@
   
   public TaskBuilder addTask(String name, TaskType type)
   {
-    flowObject = (FlowObjectImpl)proc.getFlowObject(name);
+    flowObject = (FlowObjectImpl)getProcessInternal().getFlowObject(name);
     if (flowObject == null)
     {
       if (type == TaskType.None || type == null)
@@ -196,12 +196,12 @@
       }
       addFlowObject(flowObject);
     }
-    return new TaskBuilderImpl(proc, flowObject);
+    return new TaskBuilderImpl(getProcessInternal(), flowObject);
   }
 
   public GatewayBuilder addGateway(String name, GatewayType type)
   {
-    flowObject = (FlowObjectImpl)proc.getFlowObject(name);
+    flowObject = (FlowObjectImpl)getProcessInternal().getFlowObject(name);
     if (flowObject == null)
     {
       if (GatewayType.Exclusive == type)
@@ -222,20 +222,20 @@
       }
       addFlowObject(flowObject);
     }
-    return new GatewayBuilderImpl(proc, flowObject);
+    return new GatewayBuilderImpl(getProcessInternal(), flowObject);
   }
   
   public MessageBuilder addMessage(String name)
   {
     MessageBuilder msgBuilder = new MessageBuilderImpl().newMessage(name);
-    proc.addMessage(msgBuilder.getMessage());
+    getProcessInternal().addMessage(msgBuilder.getMessage());
     return msgBuilder;
   }
-  
+
   public ProcessBuilder addProperty(String name, String value)
   {
     Property prop = new PropertyImpl(name, new ExpressionImpl(value));
-    proc.addProperty(prop);
+    getProcessInternal().addProperty(prop);
     return this;
   }
   
@@ -247,7 +247,7 @@
     if (flowObject != null)
       flowObject.addAssignment(assignment);
     else
-      proc.addAssignment(assignment);
+      getProcessInternal().addAssignment(assignment);
     return this;
   }
 
@@ -300,10 +300,16 @@
   
   private FlowObjectImpl addFlowObject(FlowObjectImpl fo)
   {
+    getProcessInternal().addFlowObject(fo);
+    return fo;
+  }
+  
+  private ProcessImpl getProcessInternal()
+  {
     if (proc == null)
-      throw new IllegalStateException("No process has been added");
+      throw new IllegalStateException("No process available");
     
-    proc.addFlowObject(fo);
-    return fo;
+    return proc;
   }
+  
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -94,14 +94,14 @@
 
   public List<Assignment> getAssignments()
   {
-    return Collections.unmodifiableList(assignments); 
+    return Collections.unmodifiableList(assignments);
   }
 
   public void addAssignment(AssignmentImpl assignment)
   {
     this.assignments.add(assignment);
   }
-  
+
   public List<InputSet> getInputSets()
   {
     throw new NotImplementedException("JBPM-1644", "Process InputSets");
@@ -286,8 +286,7 @@
       // Throw timeout exception if it took too long
       if (status != ProcessStatus.Cancelled && status != ProcessStatus.Completed && status != ProcessStatus.Aborted)
       {
-        ProcessTimeoutException rte = new ProcessTimeoutException("Process timeout after " + timeout + "ms for: "
-            + getID());
+        RuntimeException rte = new ProcessTimeoutException("Process timeout after " + timeout + "ms for: " + getID());
         log.error(rte);
 
         log.error("Interrupt executor thread");
@@ -302,9 +301,10 @@
     }
     finally
     {
-      // Destroy the process
+      // Unregister the process
       ProcessManager procManager = ProcessManager.locateProcessManager();
-      procManager.unregisterProcess(this);
+      if (procManager.getProcessByID(getID()) != null)
+        procManager.unregisterProcess(this);
     }
   }
 

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ReceiveTaskImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ReceiveTaskImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ReceiveTaskImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -28,7 +28,6 @@
 import org.apache.commons.logging.LogFactory;
 import org.jboss.bpm.InvalidProcessException;
 import org.jboss.bpm.NotImplementedException;
-import org.jboss.bpm.ProcessTimeoutException;
 import org.jboss.bpm.client.MessageListener;
 import org.jboss.bpm.model.Message;
 import org.jboss.bpm.model.Process;
@@ -37,6 +36,7 @@
 import org.jboss.bpm.model.Message.Implementation;
 import org.jboss.bpm.runtime.ExecutionContext;
 import org.jboss.bpm.runtime.Token;
+import org.jboss.bpm.runtime.TokenExecutor;
 
 //$Id$
 
@@ -49,16 +49,16 @@
 @SuppressWarnings("serial")
 public class ReceiveTaskImpl extends TaskImpl implements ReceiveTask, MessageListener
 {
-  private static final int RECEIVE_TIMEOUT = 30000;
-
   // provide logging
   private static final Log log = LogFactory.getLog(ReceiveTaskImpl.class);
 
   // A Web service is the default technology
   private Implementation implementation = Implementation.WebService;
   private Message messageRef;
-  private List<Message> messages = new ArrayList<Message>();
 
+  private List<Message> receivedMessages = new ArrayList<Message>();
+  private List<Token> suspendedTokens = new ArrayList<Token>();
+
   public ReceiveTaskImpl(String name)
   {
     super(name);
@@ -90,7 +90,7 @@
     throw new NotImplementedException("JBPM-1648", "ReceiveTask Instantiate");
   }
 
-  public void catchMessage(Message message)
+  public synchronized void catchMessage(Message message)
   {
     String msgName = message.getName();
     if (messageRef.getName().equals(msgName))
@@ -102,7 +102,19 @@
         if (message.getProperty(name) == null)
           throw new IllegalArgumentException("Received message does not contain expected property: " + name);
       }
-      messages.add(message);
+      receivedMessages.add(message);
+      
+      if (suspendedTokens.size() == 0)
+      {
+        log.debug("Suspend message: " + message);
+      }
+      else
+      {
+        Token token = suspendedTokens.remove(0);
+        ExecutionContext exContext = token.getExecutionContext();
+        TokenExecutor tokenExecutor = exContext.removeAttachment(TokenExecutor.class);
+        tokenExecutor.activate(token.getTokenID());
+      }
     }
     else
     {
@@ -111,41 +123,41 @@
   }
 
   @Override
-  public void defaultExecution(Token token)
+  public synchronized void defaultExecution(Token token)
   {
-    // Wait for the message to arrive
-    long now = System.currentTimeMillis();
-    long until = now + RECEIVE_TIMEOUT;
-    while (messages.size() == 0 && now < until)
+    if (receivedMessages.size() > 0)
     {
-      try
+      // Copy the expected properties from the
+      // received message to the execution context
+      Message msg = receivedMessages.get(0);
+      ExecutionContext exContext = token.getExecutionContext();
+      for (Property prop : messageRef.getProperties())
       {
-        Thread.sleep(500);
-        now = System.currentTimeMillis();
+        String key = prop.getName();
+        String value = msg.getPropertyValue(key);
+        exContext.addAttachment(key, value);
       }
-      catch (InterruptedException ex)
-      {
-        log.error("ReceiveTask interrupted" + ex.toString());
-      }
+
+      // Call default execute
+      super.defaultExecution(token);
     }
+  }
 
-    // Timeout if the message did not arrive
-    if (messages.size() == 0)
-      throw new ProcessTimeoutException("Message receive timeout in: " + this);
-
-    // Copy the expected properties from the
-    // received message to the execution context
-    Message msg = messages.remove(0);
-    ExecutionContext exContext = token.getExecutionContext();
-    for (Property prop : messageRef.getProperties())
+  @Override
+  protected synchronized void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
+  {
+    if (receivedMessages.size() > 0)
     {
-      String key = prop.getName();
-      String value = msg.getPropertyValue(key);
-      exContext.addAttachment(key, value);
+      receivedMessages.remove(0);
+      tokenExecutor.move(token, getOutFlow());
     }
-
-    // Call default execute
-    super.defaultExecution(token);
+    else
+    {
+      tokenExecutor.suspend(token);
+      ExecutionContext exContext = token.getExecutionContext();
+      exContext.addAttachment(TokenExecutor.class, tokenExecutor);
+      suspendedTokens.add(token);
+    }
   }
 
   @Override
@@ -155,7 +167,7 @@
 
     if (messageRef == null)
       throw new InvalidProcessException("A Message for the MessageRef attribute MUST be entered");
-    
+
     ProcessImpl procImpl = (ProcessImpl)proc;
     procImpl.initializeMessageRef(messageRef);
   }

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -39,7 +39,6 @@
 import org.jboss.bpm.model.SignalEventDetail;
 import org.jboss.bpm.model.StartEvent;
 import org.jboss.bpm.model.Process.ProcessStatus;
-import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.RuntimeProcess;
 import org.jboss.bpm.runtime.SignalHandler;
 import org.jboss.bpm.runtime.Token;
@@ -88,20 +87,10 @@
     this.outFlow = flow;
   }
 
-  public FlowHandler getFlowHandler()
+  @Override
+  protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
   {
-    FlowHandler handler = super.getFlowHandler();
-    if (handler == null)
-    {
-      handler = new FlowHandler()
-      {
-        public void execute(TokenExecutor tokenExecutor, Token token)
-        {
-          tokenExecutor.move(token, outFlow);
-        }
-      };
-    }
-    return handler;
+    tokenExecutor.move(token, getOutFlow());
   }
 
   public SignalHandler getSignalHandler()

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/TokenExecutorImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/TokenExecutorImpl.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/TokenExecutorImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -31,7 +31,8 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
-import org.jboss.bpm.NotImplementedException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.jboss.bpm.client.internal.RunnableToken;
 import org.jboss.bpm.model.ConnectingObject;
 import org.jboss.bpm.model.Process;
@@ -53,6 +54,9 @@
  */
 public class TokenExecutorImpl implements TokenExecutor
 {
+  // provide logging
+  private static final Log log = LogFactory.getLog(TokenExecutorImpl.class);
+  
   public interface StartCallback
   {
     void start(Token token);
@@ -60,7 +64,7 @@
 
   private RuntimeProcess rtProc;
   private ExecutorService executor = Executors.newCachedThreadPool();
-  private Map<String, RunnableToken> activeTokens = new HashMap<String, RunnableToken>();
+  private Map<String, RunnableToken> runnableTokens = new HashMap<String, RunnableToken>();
   private StartCallback startCallback;
 
   public TokenExecutorImpl(RuntimeProcess rtProc, StartCallback startCallback)
@@ -69,18 +73,18 @@
     this.startCallback = startCallback;
   }
 
-  public Set<Token> getActiveTokens()
+  public Set<Token> getRunnableTokens()
   {
-    Set<Token> tokens = new HashSet<Token>();
-    for (RunnableToken rt : activeTokens.values())
-      tokens.add(rt.getToken());
+    Set<Token> tokenSet = new HashSet<Token>();
+    for (RunnableToken rt : runnableTokens.values())
+      tokenSet.add(rt.getToken());
     
-    return Collections.unmodifiableSet(tokens);
+    return Collections.unmodifiableSet(tokenSet);
   }
 
-  public boolean hasActiveTokens()
+  public boolean hasRunnableTokens()
   {
-    return activeTokens.size() > 0;
+    return runnableTokens.size() > 0;
   }
   
   public void create(Token token, SequenceFlow initialFlow)
@@ -88,7 +92,7 @@
     MutableToken mutableToken = (MutableToken)token;
     mutableToken.setFlow(initialFlow);
     RunnableToken rtToken = new RunnableToken(rtProc, mutableToken);
-    activeTokens.put(token.getTokenID(), rtToken);
+    runnableTokens.put(token.getTokenID(), rtToken);
   }
   
   public void start(Token token)
@@ -97,6 +101,7 @@
     if (proc.getProcessStatus() != ProcessStatus.Active)
       throw new IllegalStateException("Cannot start token to process in state: " + proc.getProcessStatus());
     
+    log.debug("Start Token: " + token);
     MutableToken mutableToken = (MutableToken)token;
     mutableToken.setTokenStatus(TokenStatus.Started);
     
@@ -106,7 +111,7 @@
       startCallback = null;
     }
     
-    RunnableToken rtToken = activeTokens.get(token.getTokenID());
+    RunnableToken rtToken = runnableTokens.get(token.getTokenID());
     executor.submit(rtToken);
   }
 
@@ -121,19 +126,22 @@
 
   public void stop(Token token)
   {
+    log.debug("Stop Token: " + token);
     MutableToken mutableToken = (MutableToken)token;
     mutableToken.setTokenStatus(TokenStatus.Stoped);
   }
 
   public void destroy(Token token)
   {
+    log.debug("Destroy Token: " + token);
     MutableToken mutableToken = (MutableToken)token;
     mutableToken.setTokenStatus(TokenStatus.Destroyed);
-    activeTokens.remove(token.getTokenID());
+    runnableTokens.remove(token.getTokenID());
   }
 
   public String suspend(Token token)
   {
+    log.debug("Suspend Token: " + token);
     MutableToken mutableToken = (MutableToken)token;
     mutableToken.setTokenStatus(TokenStatus.Suspended);
     return token.getTokenID();
@@ -141,6 +149,19 @@
 
   public Token activate(String tokenID)
   {
-    throw new NotImplementedException("JBPM-1649", "Token Activate");
+    RunnableToken rtToken = runnableTokens.get(tokenID);
+    if (rtToken == null)
+      throw new IllegalStateException("Not a runnable token: " + tokenID);
+    
+    Token token = rtToken.getToken();
+    if (token.getTokenStatus() != TokenStatus.Suspended)
+      throw new IllegalStateException("Activate token in state: " + token.getTokenStatus());
+      
+    log.debug("Activate Token: " + token);
+    MutableToken mutableToken = (MutableToken)token;
+    mutableToken.setTokenStatus(TokenStatus.Started);
+    
+    executor.submit(rtToken);
+    return token;
   }
 }
\ No newline at end of file

Deleted: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AbstractAirticketTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AbstractAirticketTest.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AbstractAirticketTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -1,162 +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.jboss.bpm.samples.airticket;
-
-// $Id$
-
-import javax.management.ObjectName;
-
-import org.jboss.bpm.client.MessageListener;
-import org.jboss.bpm.client.MessageManager;
-import org.jboss.bpm.client.ObjectNameFactory;
-import org.jboss.bpm.model.Message;
-import org.jboss.bpm.model.MessageBuilder;
-import org.jboss.bpm.model.MessageBuilderFactory;
-import org.jboss.bpm.model.Process;
-import org.jboss.bpm.test.DefaultEngineTestCase;
-
-/**
- * Test the Airticket sample application
- * 
- * @author thomas.diesler at jboss.com
- * @since 03-Jul-2008
- */
-public abstract class AbstractAirticketTest extends DefaultEngineTestCase
-{
-  private MessageManager messageManager = MessageManager.locateMessageManager();
-  private AirticketMessageListener msgListener;
-  
-  @Override
-  public ObjectName getMessageListenerID()
-  {
-    return ObjectNameFactory.create("jboss.bpm:client=AirticketTest");
-  }
-  
-  @Override
-  public MessageListener getMessageListener()
-  {
-    msgListener = new AirticketMessageListener(getMessageListenerID());
-    return msgListener;
-  }
-
-  @Override
-  protected void tearDown() throws Exception
-  {
-    messageManager.removeMessageListener(getMessageListenerID());
-    super.tearDown();
-  }
-
-  protected void runProcessInvalidData(Process proc)
-  {
-    messageManager.sendMessage(proc.getID(), AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getInvalidRequestMessage());
-    proc.waitForEnd();
-
-    Message confirmMessage = msgListener.getConfirmMessage();
-    assertNotNull("Expected confirm message", confirmMessage);
-    String price = confirmMessage.getPropertyValue(AirticketProcessBuilder.PROPERTY_PRICE);
-    assertEquals("222", price);
-  }
-
-  protected void runProcessValidData(Process proc)
-  {
-    messageManager.sendMessage(proc.getID(), AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getValidRequestMessage());
-    proc.waitForEnd();
-
-    Message confirmMessage = msgListener.getConfirmMessage();
-    assertNotNull("Expected confirm message", confirmMessage);
-    String price = confirmMessage.getPropertyValue(AirticketProcessBuilder.PROPERTY_PRICE);
-    assertEquals("222", price);
-  }
-
-  private Message getValidRequestMessage()
-  {
-    MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
-    MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
-    Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_REQ_DATA).
-    addProperty(AirticketProcessBuilder.PROPERTY_NAME, "Kermit").
-    addProperty(AirticketProcessBuilder.PROPERTY_FROM, "MUC").
-    addProperty(AirticketProcessBuilder.PROPERTY_TO, "NYC").
-    addProperty(AirticketProcessBuilder.PROPERTY_DATE, "25-Jul-2008").
-    addProperty(AirticketProcessBuilder.PROPERTY_SEATS, "2").getMessage();
-    return msg;
-  }
-
-  private Message getInvalidRequestMessage()
-  {
-    MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
-    MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
-    Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_REQ_DATA).
-    addProperty(AirticketProcessBuilder.PROPERTY_NAME, "Kermit").
-    addProperty(AirticketProcessBuilder.PROPERTY_FROM, "MUC").
-    addProperty(AirticketProcessBuilder.PROPERTY_TO, "NYC").
-    addProperty(AirticketProcessBuilder.PROPERTY_DATE, "25-Jul-2008").
-    addProperty(AirticketProcessBuilder.PROPERTY_SEATS, "0"). // Invalid number of seats
-    getMessage();
-    return msg;
-  }
-
-  private Message getAcceptOfferMessage()
-  {
-    MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
-    MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
-    Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_ACCEPT_OFFER).
-    addProperty(AirticketProcessBuilder.PROPERTY_CREDIT_CARD, "1234-1234-1234-1234").
-    addProperty(AirticketProcessBuilder.PROPERTY_EXPIRE, "25-Jul-2012").
-    addProperty(AirticketProcessBuilder.PROPERTY_IS_OFFER_ACCEPTED, "true").
-    getMessage();
-    return msg;
-  }
-
-  class AirticketMessageListener implements MessageListener
-  {
-    private ObjectName listenerID;
-    private Message confirmMessage;
-
-    private AirticketMessageListener(ObjectName listenerID)
-    {
-      this.listenerID = listenerID;
-    }
-
-    public Message getConfirmMessage()
-    {
-      return confirmMessage;
-    }
-
-    public void catchMessage(Message msg)
-    {
-      log.debug("catchMessage: " + msg);
-      ObjectName procID = msg.getFrom().getProcess().getID();
-      MessageManager mm = MessageManager.locateMessageManager();
-      if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_INVALID_DATA))
-        mm.sendMessage(procID, AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getValidRequestMessage());
-      else if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_OFFER))
-        mm.sendMessage(procID, AirticketProcessBuilder.TASK_RECEIVE_ORDER, getAcceptOfferMessage());
-      else if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_CONFIRM))
-        confirmMessage = msg;
-    }
-
-    public ObjectName getID()
-    {
-      return listenerID;
-    }
-  }
-}
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketAPIDescriptorTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketAPIDescriptorTest.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketAPIDescriptorTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -23,6 +23,7 @@
 
 // $Id$
 
+import java.io.IOException;
 import java.net.URL;
 
 import org.jboss.bpm.client.ProcessManager;
@@ -34,23 +35,13 @@
  * @author thomas.diesler at jboss.com
  * @since 03-Jul-2008
  */
-public class AirticketAPIDescriptorTest extends AbstractAirticketTest
+public class AirticketAPIDescriptorTest extends AirticketTest
 {
-  public void testValidData() throws Exception
+  @Override
+  protected Process getProcess() throws IOException
   {
     URL expURL = getResourceURL("samples/airticket/airticket-api10.xml");
     ProcessManager pm = ProcessManager.locateProcessManager();
-    Process proc = pm.createProcess(expURL);
-    proc.startProcess();
-    runProcessValidData(proc);
+    return pm.createProcess(expURL);
   }
-
-  public void testInvalidData() throws Exception
-  {
-    URL expURL = getResourceURL("samples/airticket/airticket-api10.xml");
-    ProcessManager pm = ProcessManager.locateProcessManager();
-    Process proc = pm.createProcess(expURL);
-    proc.startProcess();
-    runProcessInvalidData(proc);
-  }
 }
\ No newline at end of file

Deleted: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -1,51 +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.jboss.bpm.samples.airticket;
-
-// $Id$
-
-import org.jboss.bpm.model.Process;
-
-/**
- * Test the Airticket sample application
- * 
- * @author thomas.diesler at jboss.com
- * @since 03-Jul-2008
- */
-public class AirticketProcBuilderTest extends AbstractAirticketTest
-{
-  public void testValidData() throws Exception
-  {
-    AirticketProcessBuilder builder = new AirticketProcessBuilder(getMessageListenerID());
-    Process proc = builder.buildProcess();
-    proc.startProcess();
-    runProcessValidData(proc);
-  }
-
-  public void testInvalidData() throws Exception
-  {
-    AirticketProcessBuilder builder = new AirticketProcessBuilder(getMessageListenerID());
-    Process proc = builder.buildProcess();
-    proc.startProcess();
-    runProcessInvalidData(proc);
-  }
-}
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketSTPDescriptorTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketSTPDescriptorTest.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketSTPDescriptorTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -23,10 +23,9 @@
 
 // $Id$
 
-import java.io.StringWriter;
+import java.io.IOException;
 import java.net.URL;
 
-import org.jboss.bpm.client.DialectHandler;
 import org.jboss.bpm.client.ProcessManager;
 import org.jboss.bpm.model.Process;
 
@@ -36,30 +35,13 @@
  * @author thomas.diesler at jboss.com
  * @since 03-Jul-2008
  */
-public class AirticketSTPDescriptorTest extends AbstractAirticketTest
+public class AirticketSTPDescriptorTest extends AirticketTest
 {
-  public void testValidData() throws Exception
+  @Override
+  protected Process getProcess() throws IOException
   {
     URL expURL = getResourceURL("samples/airticket/airticket-stp-api10.xml");
     ProcessManager pm = ProcessManager.locateProcessManager();
-    Process proc = pm.createProcess(expURL);
-    
-    // Debug the effective process
-    StringWriter strwr = new StringWriter();
-    DialectHandler dhapi = pm.getDialectHandler(DialectHandler.DEFAULT_NAMESPACE_URI);
-    dhapi.marshallProcess(proc, strwr);
-    //System.out.println(strwr);
-    
-    proc.startProcess();
-    runProcessValidData(proc);
+    return pm.createProcess(expURL);
   }
-
-  public void testInvalidData() throws Exception
-  {
-    URL expURL = getResourceURL("samples/airticket/airticket-stp-api10.xml");
-    ProcessManager pm = ProcessManager.locateProcessManager();
-    Process proc = pm.createProcess(expURL);
-    proc.startProcess();
-    runProcessInvalidData(proc);
-  }
 }
\ No newline at end of file

Copied: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketTest.java (from rev 1908, jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java)
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketTest.java	                        (rev 0)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -0,0 +1,177 @@
+/*
+ * 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.jboss.bpm.samples.airticket;
+
+// $Id$
+
+import java.io.IOException;
+
+import javax.management.ObjectName;
+
+import org.jboss.bpm.client.MessageListener;
+import org.jboss.bpm.client.MessageManager;
+import org.jboss.bpm.client.ObjectNameFactory;
+import org.jboss.bpm.model.Message;
+import org.jboss.bpm.model.MessageBuilder;
+import org.jboss.bpm.model.MessageBuilderFactory;
+import org.jboss.bpm.model.Process;
+import org.jboss.bpm.test.DefaultEngineTestCase;
+
+/**
+ * Test the Airticket sample application
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 03-Jul-2008
+ */
+public class AirticketTest extends DefaultEngineTestCase
+{
+  private MessageManager messageManager = MessageManager.locateMessageManager();
+  private AirticketMessageListener msgListener;
+  
+  public void testValidData() throws Exception
+  {
+    Process proc = getProcess();
+    proc.startProcess();
+    
+    messageManager.sendMessage(proc.getID(), AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getValidRequestMessage());
+    proc.waitForEnd();
+
+    Message confirmMessage = msgListener.getConfirmMessage();
+    assertNotNull("Expected confirm message", confirmMessage);
+    String price = confirmMessage.getPropertyValue(AirticketProcessBuilder.PROPERTY_PRICE);
+    assertEquals("222", price);
+  }
+
+  public void testInvalidData() throws Exception
+  {
+    Process proc = getProcess();
+    proc.startProcess();
+    
+    messageManager.sendMessage(proc.getID(), AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getInvalidRequestMessage());
+    proc.waitForEnd();
+
+    Message confirmMessage = msgListener.getConfirmMessage();
+    assertNotNull("Expected confirm message", confirmMessage);
+    String price = confirmMessage.getPropertyValue(AirticketProcessBuilder.PROPERTY_PRICE);
+    assertEquals("222", price);
+  }
+  
+  @Override
+  public ObjectName getMessageListenerID()
+  {
+    return ObjectNameFactory.create("jboss.bpm:client=AirticketTest");
+  }
+  
+  @Override
+  public MessageListener getMessageListener()
+  {
+    msgListener = new AirticketMessageListener(getMessageListenerID());
+    return msgListener;
+  }
+
+  @Override
+  protected void tearDown() throws Exception
+  {
+    messageManager.removeMessageListener(getMessageListenerID());
+    super.tearDown();
+  }
+
+  private Message getValidRequestMessage()
+  {
+    MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
+    MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
+    Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_REQ_DATA).
+    addProperty(AirticketProcessBuilder.PROPERTY_NAME, "Kermit").
+    addProperty(AirticketProcessBuilder.PROPERTY_FROM, "MUC").
+    addProperty(AirticketProcessBuilder.PROPERTY_TO, "NYC").
+    addProperty(AirticketProcessBuilder.PROPERTY_DATE, "25-Jul-2008").
+    addProperty(AirticketProcessBuilder.PROPERTY_SEATS, "2").getMessage();
+    return msg;
+  }
+
+  private Message getInvalidRequestMessage()
+  {
+    MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
+    MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
+    Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_REQ_DATA).
+    addProperty(AirticketProcessBuilder.PROPERTY_NAME, "Kermit").
+    addProperty(AirticketProcessBuilder.PROPERTY_FROM, "MUC").
+    addProperty(AirticketProcessBuilder.PROPERTY_TO, "NYC").
+    addProperty(AirticketProcessBuilder.PROPERTY_DATE, "25-Jul-2008").
+    addProperty(AirticketProcessBuilder.PROPERTY_SEATS, "0"). // Invalid number of seats
+    getMessage();
+    return msg;
+  }
+
+  private Message getAcceptOfferMessage()
+  {
+    MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
+    MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
+    Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_ACCEPT_OFFER).
+    addProperty(AirticketProcessBuilder.PROPERTY_CREDIT_CARD, "1234-1234-1234-1234").
+    addProperty(AirticketProcessBuilder.PROPERTY_EXPIRE, "25-Jul-2012").
+    addProperty(AirticketProcessBuilder.PROPERTY_IS_OFFER_ACCEPTED, "true").
+    getMessage();
+    return msg;
+  }
+
+  
+  protected Process getProcess() throws IOException
+  {
+    AirticketProcessBuilder builder = new AirticketProcessBuilder(getMessageListenerID());
+    return builder.buildProcess();
+  }
+  
+  class AirticketMessageListener implements MessageListener
+  {
+    private ObjectName listenerID;
+    private Message confirmMessage;
+
+    private AirticketMessageListener(ObjectName listenerID)
+    {
+      this.listenerID = listenerID;
+    }
+
+    public Message getConfirmMessage()
+    {
+      return confirmMessage;
+    }
+
+    public void catchMessage(Message msg)
+    {
+      log.debug("catchMessage: " + msg);
+      ObjectName procID = msg.getFrom().getProcess().getID();
+      MessageManager mm = MessageManager.locateMessageManager();
+      if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_INVALID_DATA))
+        mm.sendMessage(procID, AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getValidRequestMessage());
+      else if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_OFFER))
+        mm.sendMessage(procID, AirticketProcessBuilder.TASK_RECEIVE_ORDER, getAcceptOfferMessage());
+      else if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_CONFIRM))
+        confirmMessage = msg;
+    }
+
+    public ObjectName getID()
+    {
+      return listenerID;
+    }
+  }
+}
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveGatewaySplitTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveGatewaySplitTest.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveGatewaySplitTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -75,7 +75,7 @@
   public Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
-    procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Split");
+    procBuilder.addProcess("InclusiveGatewaySplitTest").addStartEvent("Start").addSequenceFlow("Split");
     GatewayBuilder gatewayBuilder = procBuilder.addGateway("Split", GatewayType.Inclusive);
     gatewayBuilder.addConditionalGate("EndA", ExpressionLanguage.MVEL, "foo < 10");
     gatewayBuilder.addConditionalGate("EndB", ExpressionLanguage.MVEL, "foo < 20");

Copied: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/ReceiveTaskTest.java (from rev 1908, jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java)
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/ReceiveTaskTest.java	                        (rev 0)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/ReceiveTaskTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -0,0 +1,153 @@
+/*
+ * 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.jboss.bpm.cts.task;
+
+// $Id$
+
+import org.jboss.bpm.InvalidProcessException;
+import org.jboss.bpm.client.MessageManager;
+import org.jboss.bpm.client.ProcessManager;
+import org.jboss.bpm.client.SignalListener;
+import org.jboss.bpm.client.SignalManager;
+import org.jboss.bpm.model.EventBuilder;
+import org.jboss.bpm.model.Message;
+import org.jboss.bpm.model.MessageBuilder;
+import org.jboss.bpm.model.MessageBuilderFactory;
+import org.jboss.bpm.model.Process;
+import org.jboss.bpm.model.ProcessBuilder;
+import org.jboss.bpm.model.ProcessBuilderFactory;
+import org.jboss.bpm.model.Signal;
+import org.jboss.bpm.model.EventDetail.EventDetailType;
+import org.jboss.bpm.model.Signal.SignalType;
+import org.jboss.bpm.model.Task.TaskType;
+import org.jboss.bpm.test.DefaultEngineTestCase;
+
+/**
+ * Test process messages
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 03-Jul-2008
+ */
+public class ReceiveTaskTest extends DefaultEngineTestCase
+{
+  public void testReceiveTaskWithNoMessage() throws Exception
+  {
+    ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+    procBuilder.addProcess("ReceiveTaskTest").addStartEvent("Start").addSequenceFlow("TaskA");
+    procBuilder.addTask("TaskA", TaskType.Receive).addSequenceFlow("End").addEndEvent("End");
+    try
+    {
+      procBuilder.getProcess();
+      fail("A Message for the MessageRef attribute MUST be entered");
+    }
+    catch (InvalidProcessException ex)
+    {
+      // expected
+    }
+  }
+  
+  public void testUnregisteredProcess() throws Exception
+  {
+    Process proc = getProcess();
+    
+    MessageManager msgManager = MessageManager.locateMessageManager();
+    try
+    {
+      msgManager.sendMessage(proc.getID(), "TaskA", getMessage());
+      fail("Send to an unregistered process is expected to fail");
+    }
+    catch (RuntimeException ex)
+    {
+      // expected
+    }
+  }
+
+  public void testSuspendedMessage() throws Exception
+  {
+    Process proc = getProcess();
+    ProcessManager procManager = ProcessManager.locateProcessManager();
+    procManager.registerProcess(proc);
+
+    // Send the message before the process is started
+    MessageManager msgManager = MessageManager.locateMessageManager();
+    msgManager.sendMessage(proc.getID(), "TaskA", getMessage());
+    
+    proc.startProcess();
+    proc.waitForEnd();
+    
+    Message endMsg = getMessages().get(0);
+    assertNotNull("End message expected", endMsg);
+    assertEquals("bar", endMsg.getPropertyValue("foo"));
+  }
+
+  public void testSuspendedToken() throws Exception
+  {
+    final Process proc = getProcess();
+    SignalListener signalListener = new SignalListener()
+    {
+      private boolean sendMessage = true;
+      public void catchSignal(Signal signal)
+      {
+        // Send the message after the process reached the receive task
+        if (signal.getSignalType() == SignalType.SYSTEM_TASK_EXIT)
+        {
+          if (sendMessage == true)
+          {
+            sendMessage = false;
+            MessageManager msgManager = MessageManager.locateMessageManager();
+            msgManager.sendMessage(proc.getID(), "TaskA", getMessage());
+          }
+        }
+      }
+    };
+    SignalManager sigManager = SignalManager.locateSignalManager();
+    sigManager.addSignalListener(proc.getName(), signalListener);
+    
+    proc.startProcess();
+    proc.waitForEnd();
+    
+    Message endMsg = getMessages().get(0);
+    assertNotNull("End message expected", endMsg);
+    assertEquals("bar", endMsg.getPropertyValue("foo"));
+  }
+
+  private Message getMessage()
+  {
+    MessageBuilder procBuilder = MessageBuilderFactory.newInstance().newMessageBuilder();
+    Message msg = procBuilder.newMessage("ReceiveTaskMessage").addProperty("foo", "bar", true).getMessage();
+    return msg;
+  }
+  
+  private Process getProcess()
+  {
+    ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+    MessageBuilder msgBuilder = procBuilder.addProcess("ReceiveTaskTest").addMessage("ReceiveTaskMessage");
+    msgBuilder.addProperty("foo", null, true);
+    msgBuilder = procBuilder.addMessage("EndEventMessage");
+    msgBuilder.addToRef(getMessageListenerID()).addProperty("foo", null, true);
+    procBuilder.addStartEvent("Start").addSequenceFlow("TaskA");
+    procBuilder.addTask("TaskA", TaskType.Receive).addMessageRef("ReceiveTaskMessage");
+    EventBuilder eventBuilder = procBuilder.addSequenceFlow("End").addEndEvent("End");
+    eventBuilder.addEventDetail(EventDetailType.Message).addMessageRef("EndEventMessage");
+    return procBuilder.getProcess();
+  }
+}

Copied: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/SendTaskTest.java (from rev 1908, jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java)
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/SendTaskTest.java	                        (rev 0)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/SendTaskTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -0,0 +1,55 @@
+/*
+ * 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.jboss.bpm.cts.task;
+
+// $Id$
+
+import org.jboss.bpm.InvalidProcessException;
+import org.jboss.bpm.model.ProcessBuilder;
+import org.jboss.bpm.model.ProcessBuilderFactory;
+import org.jboss.bpm.model.Task.TaskType;
+import org.jboss.bpm.test.DefaultEngineTestCase;
+
+/**
+ * Test process messages
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 03-Jul-2008
+ */
+public class SendTaskTest extends DefaultEngineTestCase
+{
+  public void testSendTaskWithNoMessage() throws Exception
+  {
+    ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+    procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("TaskA");
+    procBuilder.addTask("TaskA", TaskType.Send).addSequenceFlow("End").addEndEvent("End");
+    try
+    {
+      procBuilder.getProcess();
+      fail("A Message for the MessageRef attribute MUST be entered");
+    }
+    catch (InvalidProcessException ex)
+    {
+      // expected
+    }
+  }
+}

Deleted: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -1,71 +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.jboss.bpm.cts.task;
-
-// $Id$
-
-import org.jboss.bpm.InvalidProcessException;
-import org.jboss.bpm.model.ProcessBuilder;
-import org.jboss.bpm.model.ProcessBuilderFactory;
-import org.jboss.bpm.model.Task.TaskType;
-import org.jboss.bpm.test.DefaultEngineTestCase;
-
-/**
- * Test process messages
- * 
- * @author thomas.diesler at jboss.com
- * @since 03-Jul-2008
- */
-public class TaskMessageTest extends DefaultEngineTestCase
-{
-  public void testReceiveTaskWithNoMessage() throws Exception
-  {
-    ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
-    procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("A");
-    procBuilder.addTask("A", TaskType.Receive).addSequenceFlow("End").addEndEvent("End");
-    try
-    {
-      procBuilder.getProcess();
-      fail("A Message for the MessageRef attribute MUST be entered");
-    }
-    catch (InvalidProcessException ex)
-    {
-      // expected
-    }
-  }
-  
-  public void testSendTaskWithNoMessage() throws Exception
-  {
-    ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
-    procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("A");
-    procBuilder.addTask("A", TaskType.Send).addSequenceFlow("End").addEndEvent("End");
-    try
-    {
-      procBuilder.getProcess();
-      fail("A Message for the MessageRef attribute MUST be entered");
-    }
-    catch (InvalidProcessException ex)
-    {
-      // expected
-    }
-  }
-}

Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/multichoice/MultiChoiceTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/multichoice/MultiChoiceTest.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/multichoice/MultiChoiceTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -75,7 +75,7 @@
   public Process getProcess() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
-    procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Split");
+    procBuilder.addProcess("MultiChoiceTest").addStartEvent("Start").addSequenceFlow("Split");
     GatewayBuilder gatewayBuilder = procBuilder.addGateway("Split", GatewayType.Inclusive);
     gatewayBuilder.addConditionalGate("EndA", ExpressionLanguage.MVEL, "foo < 10");
     gatewayBuilder.addConditionalGate("EndB", ExpressionLanguage.MVEL, "foo < 20");

Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/synchronization/SynchronizationTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/synchronization/SynchronizationTest.java	2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/synchronization/SynchronizationTest.java	2008-08-17 16:18:36 UTC (rev 1911)
@@ -70,7 +70,7 @@
     assertEquals("TaskA:TaskB", TaskC.taskValue);
   }
 
-  public void _testSynchronizationTimeout() throws Exception
+  public void testSynchronizationTimeout() throws Exception
   {
     Process proc = getProcess();
     proc.startProcess();
@@ -91,7 +91,7 @@
     }
   }
 
-  public void _testSynchronizationInvalidToken() throws Exception
+  public void testSynchronizationInvalidToken() throws Exception
   {
     Process proc = getProcess();
     proc.startProcess();




More information about the jbpm-commits mailing list