[jbpm-commits] JBoss JBPM SVN: r1946 - in jbossbpm/spec/trunk/modules: dialects/api10/src/test/resources/include and 5 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Aug 20 18:09:13 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-08-20 18:09:12 -0400 (Wed, 20 Aug 2008)
New Revision: 1946

Modified:
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/ProcessManager.java
   jbossbpm/spec/trunk/modules/dialects/api10/src/test/resources/include/proc-api10.xml
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/client/ExecutionManagerImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/ProcessImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/RuntimeProcessImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/SequenceFlowImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/TokenExecutorImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/runtime/TokenImpl.java
   jbossbpm/spec/trunk/modules/ri/src/test/java/org/jboss/bpm/runtime/ExecutionManagerTest.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/engine/EngineShutdownTest.java
Log:
Fix sync issues

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/ProcessManager.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/ProcessManager.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/ProcessManager.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -41,7 +41,6 @@
 import org.apache.commons.logging.LogFactory;
 import org.jboss.bpm.EngineShutdownException;
 import org.jboss.bpm.model.Process;
-import org.jboss.bpm.runtime.Attachments;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -157,31 +156,6 @@
     procs.remove(proc.getID());
   }
 
-  /**
-   * Start a Process with a given process id.
-   */
-  public void startProcess(ObjectName procID, Attachments att)
-  {
-    if (ProcessEngine.locateProcessEngine().isPrepareForShutdown())
-      throw new EngineShutdownException("Cannot start a process while engine is shutting down");
-    
-    Process proc = getProcessStrict(procID);
-    ExecutionManager exm = ExecutionManager.locateExecutionManager();
-    exm.startProcess(proc, att);
-  }
-
-  private Process getProcessStrict(ObjectName procID)
-  {
-    Process proc = getProcessByID(procID);
-    if (proc == null)
-    {
-      IllegalStateException rte = new IllegalStateException("Cannot obtain process: " + procID);
-      log.error(rte);
-      throw rte;
-    }
-    return proc;
-  }
-
   private String getNamespaceURI(InputStream inStream)
   {
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

Modified: jbossbpm/spec/trunk/modules/dialects/api10/src/test/resources/include/proc-api10.xml
===================================================================
--- jbossbpm/spec/trunk/modules/dialects/api10/src/test/resources/include/proc-api10.xml	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/dialects/api10/src/test/resources/include/proc-api10.xml	2008-08-20 22:09:12 UTC (rev 1946)
@@ -1,4 +1,4 @@
-<ns2:process name="testReceiveTaskWithMessageRef" xmlns:ns2="urn:bpm.jboss:pdl-0.1">
+<ns2:process name="ProcessIncludeTest" xmlns:ns2="urn:bpm.jboss:pdl-0.1">
   <include namespace="urn:bpm.jboss:pdl-0.1" location="include/proc-include-api10.xml"/>
   <start>
     <seqflow to="A" />

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/client/ExecutionManagerImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/client/ExecutionManagerImpl.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/client/ExecutionManagerImpl.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -48,7 +48,6 @@
 import org.jboss.bpm.ri.model.impl.ProcessImpl;
 import org.jboss.bpm.ri.model.impl.RuntimeProcessImpl;
 import org.jboss.bpm.ri.model.impl.SequenceFlowImpl;
-import org.jboss.bpm.ri.model.impl.TokenExecutorImpl;
 import org.jboss.bpm.ri.runtime.DelegatingToken;
 import org.jboss.bpm.ri.runtime.MutableToken;
 import org.jboss.bpm.ri.runtime.RuntimeProcess;
@@ -77,7 +76,9 @@
   {
     // Get the None Start Event if there is one and start the initial flow
     StartEvent start = getNoneStartEvent(proc);
-    if (start != null)
+    if (start == null)
+      startProcessPrepare(proc);
+    else
       startProcessInternal(start, att);
   }
 
@@ -100,27 +101,21 @@
     }
     
     Process proc = start.getProcess();
-    ProcessImpl procImpl = (ProcessImpl)proc;
     RuntimeProcess rtProc = getRuntimeProcess(proc, false);
     boolean startProcessThread = (rtProc == null); 
+
+    // Prepare for start
+    startProcessPrepare(proc);
     
-    // Reset the process if already terminated
-    if (isProcessTerminated(proc))
-      procImpl.resetProcess();
+    // Create initial Token
+    TokenImpl initialToken = new TokenImpl(att);
+    InitialFlow initialFlow = new InitialFlow(start);
+    initialToken.setFlow(initialFlow);
     
-    ProcessStatus procStatus = proc.getProcessStatus();
-    if (procStatus != ProcessStatus.Ready)
-      throw new IllegalStateException("Cannot start process in state: " + procStatus);
-
-    // Register the process if needed
-    ProcessManager pm = ProcessManager.locateProcessManager();
-    if (pm.getProcessByID(proc.getID()) == null)
-      pm.registerProcess(proc);
-    
+    // Register the initial Token 
     rtProc = getRuntimeProcess(proc, true);
     TokenExecutor tokenExecutor = rtProc.getTokenExecutor();
-    TokenImpl initialToken = new TokenImpl(att);
-    tokenExecutor.create(initialToken, new InitialFlow(start));
+    tokenExecutor.create(initialToken, initialFlow);
     
     // Start a new process thread
     if (startProcessThread)
@@ -152,6 +147,23 @@
     tokenExecutor.start(initialToken);
   }
 
+  private void startProcessPrepare(Process proc)
+  {
+    // Reset the process if already terminated
+    ProcessImpl procImpl = (ProcessImpl)proc;
+    if (isProcessTerminated(proc))
+      procImpl.resetProcess();
+    
+    ProcessStatus procStatus = proc.getProcessStatus();
+    if (procStatus != ProcessStatus.Ready && procStatus != ProcessStatus.Active)
+      throw new IllegalStateException("Cannot start process in state: " + procStatus);
+
+    // Register the process if needed
+    ProcessManager pm = ProcessManager.locateProcessManager();
+    if (pm.getProcessByID(proc.getID()) == null)
+      pm.registerProcess(proc);
+  }
+
   public ProcessStatus waitForEnd(Process proc)
   {
     return waitForEndInternal(proc, 0);
@@ -219,6 +231,16 @@
     {
       log.warn(ex);
     }
+    finally
+    {
+      // Unregister the process if not done already
+      // this could happen when the Process never received a start signal
+      // and then we get here because of a ProcessTimeoutException
+      ProcessManager procManager = ProcessManager.locateProcessManager();
+      if (procManager.getProcessByID(proc.getID()) != null)
+        procManager.unregisterProcess(proc);
+    }
+
     
     status = proc.getProcessStatus();
     return status;
@@ -253,8 +275,7 @@
       rtProcess = runtimeProcesses.get(proc.getID());
       if (rtProcess == null && createNew)
       {
-        TokenExecutorImpl tokenExecutor = new TokenExecutorImpl();
-        rtProcess = new RuntimeProcessImpl(proc, tokenExecutor);
+        rtProcess = new RuntimeProcessImpl(proc);
         runtimeProcesses.put(proc.getID(), rtProcess);
       }
     }
@@ -333,7 +354,9 @@
           }
           
           log.debug("End execution thread [proc=" + procName + ",status=" + proc.getProcessStatus() + "]");
-          procImpl.setProcessStatus(ProcessStatus.Completed);
+          
+          if (proc.getProcessStatus() == ProcessStatus.Active)
+            procImpl.setProcessStatus(ProcessStatus.Completed);
         }
       }
       finally
@@ -342,13 +365,13 @@
 
         synchronized (proc)
         {
+          ProcessManager procManager = ProcessManager.locateProcessManager();
+          procManager.unregisterProcess(proc);
+          runtimeProcesses.remove(procID);
+          
           // Notify that the process has now ended
           log.debug("Notify: " + proc);
           proc.notifyAll();
-          
-          ProcessManager procManager = ProcessManager.locateProcessManager();
-          procManager.unregisterProcess(proc);
-          runtimeProcesses.remove(procID);
         }
       }
     }

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/ProcessImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/ProcessImpl.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/ProcessImpl.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -31,10 +31,9 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.jboss.bpm.BPMException;
 import org.jboss.bpm.InvalidProcessException;
 import org.jboss.bpm.NotImplementedException;
-import org.jboss.bpm.ProcessTimeoutException;
+import org.jboss.bpm.client.ExecutionManager;
 import org.jboss.bpm.client.ProcessManager;
 import org.jboss.bpm.model.Assignment;
 import org.jboss.bpm.model.Constants;
@@ -48,7 +47,6 @@
 import org.jboss.bpm.model.Process;
 import org.jboss.bpm.model.Property;
 import org.jboss.bpm.model.StartEvent;
-import org.jboss.bpm.ri.client.ProcessManagerImpl;
 import org.jboss.bpm.runtime.Attachments;
 import org.jboss.util.id.UID;
 
@@ -199,30 +197,21 @@
 
   public ObjectName startProcess()
   {
-    return startProcess(null);
+    return startProcessInternal(null);
   }
 
   public ObjectName startProcess(Attachments att)
   {
-    ProcessManager pm = ProcessManager.locateProcessManager();
+    return startProcessInternal(att);
+  }
 
-    if (status == ProcessStatus.Aborted || status == ProcessStatus.Completed)
-      resetProcess();
-
-    if (status != ProcessStatus.Ready)
-      throw new IllegalStateException("Cannot start process in state: " + status);
-
-    // Register the process if needed
-    if (pm.getProcessByID(getID()) == null)
-    {
-      ProcessManagerImpl pmImpl = (ProcessManagerImpl)pm;
-      pmImpl.registerProcess(this);
-    }
-
-    pm.startProcess(getID(), att);
+  private ObjectName startProcessInternal(Attachments att)
+  {
+    ExecutionManager em = ExecutionManager.locateExecutionManager();
+    em.startProcess(this, att);
     return getID();
   }
-
+  
   public void resetProcess()
   {
     log.debug("Reset process: " + this);
@@ -252,69 +241,10 @@
    */
   private ProcessStatus waitForEndInternal(long timeout)
   {
-    if (status != ProcessStatus.Ready && status != ProcessStatus.Active)
-      throw new IllegalStateException("Cannot wait for process in state: " + status);
-
-    // Wait a little for the process to end
-    boolean forever = (timeout < 1);
-    long now = System.currentTimeMillis();
-    long until = now + timeout;
-    try
-    {
-      while (forever || now < until)
-      {
-        synchronized (this)
-        {
-          if (isProcessTerminated())
-          {
-            if (runtimeException != null)
-            {
-              throw new BPMException("Process aborted", runtimeException);
-            }
-            else
-            {
-              break;
-            }
-          }
-          
-          // Start waiting to get notified
-          long waitTimeout = forever ? 0 : until - now;
-          log.debug("Start Waiting: " + waitTimeout + "ms");
-          wait(waitTimeout);
-          log.debug("Stop Waiting");
-        }
-        now = System.currentTimeMillis();
-      }
-      
-      // Throw timeout exception if it took too long
-      if (isProcessTerminated() == false)
-      {
-        RuntimeException rte = new ProcessTimeoutException("Process timeout after " + timeout + "ms for: " + getID());
-        setRuntimeException(rte);
-        log.error(rte);
-        throw rte;
-      }
-    }
-    catch (InterruptedException ex)
-    {
-      log.warn(ex);
-    }
-    finally
-    {
-      // Unregister the process
-      ProcessManager procManager = ProcessManager.locateProcessManager();
-      if (procManager.getProcessByID(getID()) != null)
-        procManager.unregisterProcess(this);
-    }
-
-    return status;
+    ExecutionManager em = ExecutionManager.locateExecutionManager();
+    return em.waitForEnd(this, timeout);
   }
 
-  private synchronized boolean isProcessTerminated()
-  {
-    return status == ProcessStatus.Cancelled || status == ProcessStatus.Completed || status == ProcessStatus.Aborted;
-  }
-
   public FlowObject getFlowObject(String name)
   {
     if (name == null)
@@ -461,6 +391,6 @@
 
   public String toString()
   {
-    return "Process[" + getName() + ",status=" + status + "]";
+    return "Process[" + getName() + ",status=" + getProcessStatus() + "]";
   }
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/RuntimeProcessImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/RuntimeProcessImpl.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/RuntimeProcessImpl.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -35,22 +35,27 @@
  */
 public class RuntimeProcessImpl implements RuntimeProcess
 {
-  private Process process;
+  private Process proc;
   private TokenExecutor tokenExecutor;
 
-  public RuntimeProcessImpl(Process process, TokenExecutor tokenExecutor)
+  public RuntimeProcessImpl(Process proc)
   {
-    this.process = process;
-    this.tokenExecutor = tokenExecutor;
+    this.proc = proc;
+    this.tokenExecutor = new TokenExecutorImpl(this);
   }
 
   public Process getProcess()
   {
-    return process;
+    return proc;
   }
 
   public TokenExecutor getTokenExecutor()
   {
     return tokenExecutor;
   }
+  
+  public String toString()
+  {
+    return "RuntimeProcess[" + proc.getName() + ",status=" + proc.getProcessStatus() + "]";
+  }
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/SequenceFlowImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/SequenceFlowImpl.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/SequenceFlowImpl.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -66,8 +66,15 @@
   {
     FlowObject sourceRef = getSourceRef();
     FlowObject targetRef = getTargetRef();
-    String srcName = (sourceRef.getName() != null ? sourceRef.getName() : sourceRef.getID().getCanonicalName());
-    String tarName = (targetRef.getName() != null ? targetRef.getName() : targetRef.getID().getCanonicalName());
+    
+    String srcName = null;
+    if (sourceRef != null)
+      srcName = (sourceRef.getName() != null ? sourceRef.getName() : sourceRef.getID().getCanonicalName());
+    
+    String tarName = null;
+    if (targetRef != null)
+      tarName = (targetRef.getName() != null ? targetRef.getName() : targetRef.getID().getCanonicalName());
+    
     return "SequenceFlow[" + srcName + "->" + tarName + "]";
   }
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/TokenExecutorImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/TokenExecutorImpl.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/model/impl/TokenExecutorImpl.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -60,14 +60,15 @@
   // provide logging
   private static final Log log = LogFactory.getLog(TokenExecutorImpl.class);
 
-  public interface StartCallback
-  {
-    void start(Token token);
-  }
-  
+  private RuntimeProcess rtProc;
   private ExecutorService executor = Executors.newCachedThreadPool();
   private Map<String, RunnableToken> runnableTokens = new HashMap<String, RunnableToken>();
 
+  public TokenExecutorImpl(RuntimeProcess rtProc)
+  {
+    this.rtProc = rtProc;
+  }
+
   public Set<Token> getRunnableTokens()
   {
     synchronized (runnableTokens)
@@ -93,9 +94,11 @@
     synchronized (runnableTokens)
     {
       MutableToken mutableToken = (MutableToken)token;
+      mutableToken.setTokenStatus(TokenStatus.Created);
       mutableToken.setFlow(initialFlow);
-      Process proc = initialFlow.getTargetRef().getProcess();
-      RuntimeProcess rtProc = new RuntimeProcessImpl(proc, this);
+
+      log.debug("Create Token: " + token);
+      
       RunnableToken rtToken = new RunnableToken(rtProc, mutableToken);
       runnableTokens.put(token.getTokenID(), rtToken);
     }
@@ -109,6 +112,10 @@
       if (procStatus != ProcessStatus.Ready && procStatus != ProcessStatus.Active)
         throw new IllegalStateException("Cannot start token to process in state: " + procStatus);
 
+      log.debug("Sart Token: " + token);
+      MutableToken mutableToken = (MutableToken)token;
+      mutableToken.setTokenStatus(TokenStatus.Started);
+
       RunnableToken rtToken = runnableTokens.get(token.getTokenID());
       executor.submit(rtToken);
     }
@@ -190,10 +197,12 @@
   class RunnableToken implements Runnable
   {
     private RuntimeProcess rtProc;
+    private TokenExecutor tokenExecutor;
     private MutableToken token;
 
     public RunnableToken(RuntimeProcess rtProc, MutableToken token)
     {
+      this.tokenExecutor = rtProc.getTokenExecutor();
       this.rtProc = rtProc;
       this.token = token;
     }
@@ -206,7 +215,6 @@
     public void run()
     {
       Process proc = rtProc.getProcess();
-      TokenExecutor tokenExecutor = rtProc.getTokenExecutor();
       try
       {
         ConnectingObject flow = token.getFlow();
@@ -244,24 +252,45 @@
             procStatus = proc.getProcessStatus();
           }
         }
-        
+
         // Notify Process on token termination
-        terminateToken(proc, tokenExecutor);
+        terminateToken(proc, false);
       }
       catch (RuntimeException rte)
       {
         log.error("Process aborted: " + proc, rte);
         ((ProcessImpl)proc).setRuntimeException(rte);
-        
+
         // Notify Process on token termination
-        terminateToken(proc, tokenExecutor);
+        terminateToken(proc, true);
       }
     }
 
-    // Remove the token from the list of runnable tokens then notify the process
-    private void terminateToken(Process proc, TokenExecutor tokenExecutor)
+    private void terminateToken(Process proc, boolean allTokens)
     {
-      tokenExecutor.destroy(token);
+      // Destroy the token if not already done
+      synchronized (runnableTokens)
+      {
+        if (allTokens)
+        {
+          log.debug("Terminate all tokens: " + runnableTokens);
+          Set<String> keySet = new HashSet<String>(runnableTokens.keySet());
+          for (String tokID : keySet)
+          {
+            RunnableToken rtTok = runnableTokens.get(tokID);
+            Token auxToken = rtTok.getToken();
+            tokenExecutor.destroy(auxToken);
+          }
+        }
+        else
+        {
+          TokenStatus status = token.getTokenStatus();
+          if (status != TokenStatus.Suspended && status != TokenStatus.Destroyed)
+            tokenExecutor.destroy(token);
+        }
+      }
+
+      // Notify the runtime process
       synchronized (rtProc)
       {
         log.debug("Notify: " + rtProc);
@@ -285,5 +314,11 @@
         throw new IllegalStateException("Flow object does not implement handler support: " + fo);
       return (HandlerSupport)fo;
     }
+
+    @Override
+    public String toString()
+    {
+      return token.toString();
+    }
   }
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/runtime/TokenImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/runtime/TokenImpl.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/ri/runtime/TokenImpl.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -23,7 +23,6 @@
 
 //$Id$
 
-import org.jboss.bpm.model.FlowObject;
 import org.jboss.bpm.model.InputSet;
 import org.jboss.bpm.model.OutputSet;
 import org.jboss.bpm.model.SequenceFlow;
@@ -143,7 +142,6 @@
   
   public String toString()
   {
-    FlowObject fo = getFlow().getTargetRef();
-    return "[fo=" + fo + ",ctx=" + getExecutionContext() + "]";
+    return "[sf=" + getFlow() + ",status=" + getTokenStatus() + ",ctx=" + getExecutionContext() + "]";
   }
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/ri/src/test/java/org/jboss/bpm/runtime/ExecutionManagerTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/test/java/org/jboss/bpm/runtime/ExecutionManagerTest.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/ri/src/test/java/org/jboss/bpm/runtime/ExecutionManagerTest.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -23,11 +23,18 @@
 
 // $Id$
 
+import org.jboss.bpm.ProcessTimeoutException;
 import org.jboss.bpm.client.ExecutionManager;
+import org.jboss.bpm.client.ProcessManager;
+import org.jboss.bpm.client.SignalManager;
+import org.jboss.bpm.model.EventBuilder;
 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.Process.ProcessStatus;
+import org.jboss.bpm.model.Signal.SignalType;
 import org.jboss.bpm.test.DefaultEngineTestCase;
 
 /**
@@ -47,11 +54,14 @@
 
     ExecutionManager em = ExecutionManager.locateExecutionManager();
     em.startProcess(proc, null);
-    
+
     ProcessStatus status = em.waitForEnd(proc);
     assertEquals(ProcessStatus.Completed, status);
+    
+    ProcessManager pm = ProcessManager.locateProcessManager();
+    assertNull("Process should be unregistered", pm.getProcessByID(proc.getID()));
   }
-  
+
   public void testRestartSequenceFlow() throws Exception
   {
     ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
@@ -61,13 +71,101 @@
 
     ExecutionManager em = ExecutionManager.locateExecutionManager();
     em.startProcess(proc, null);
-    
+
     ProcessStatus status = em.waitForEnd(proc);
     assertEquals(ProcessStatus.Completed, status);
+
+    em.startProcess(proc, null);
+
+    status = em.waitForEnd(proc);
+    assertEquals(ProcessStatus.Completed, status);
     
+    ProcessManager pm = ProcessManager.locateProcessManager();
+    assertNull("Process should be unregistered", pm.getProcessByID(proc.getID()));
+  }
+
+  public void testTaskRuntimeException() throws Exception
+  {
+    ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+    procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Task");
+    procBuilder.addTask("Task").addExecutionHandler(TaskHandler.class).addSequenceFlow("End").addEndEvent("End");
+    Process proc = procBuilder.getProcess();
+
+    ExecutionManager em = ExecutionManager.locateExecutionManager();
     em.startProcess(proc, null);
+
+    try
+    {
+      em.waitForEnd(proc);
+      fail("RuntimeException expected");
+    }
+    catch (RuntimeException rte)
+    {
+      // expected
+    }
+
+    ProcessStatus status = proc.getProcessStatus();
+    assertEquals(ProcessStatus.Aborted, status);
     
-    status = em.waitForEnd(proc);
+    ProcessManager pm = ProcessManager.locateProcessManager();
+    assertNull("Process should be unregistered", pm.getProcessByID(proc.getID()));
+  }
+
+  public void testStartSignal() throws Exception
+  {
+    ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("Start");
+    eventBuilder.addEventDetail(EventDetailType.Signal).addSignalRef(SignalType.USER_SIGNAL, "A");
+    procBuilder.addSequenceFlow("Task").addTask("Task").addSequenceFlow("End").addEndEvent("End");
+    Process proc = procBuilder.getProcess();
+
+    ExecutionManager em = ExecutionManager.locateExecutionManager();
+    em.startProcess(proc, null);
+
+    SignalManager sm = SignalManager.locateSignalManager();
+    sm.throwSignal(getName(), new Signal(getName(), SignalType.USER_SIGNAL, "A"));
+
+    ProcessStatus status = em.waitForEnd(proc);
     assertEquals(ProcessStatus.Completed, status);
+    
+    ProcessManager pm = ProcessManager.locateProcessManager();
+    assertNull("Process should be unregistered", pm.getProcessByID(proc.getID()));
   }
+
+  public void testStartSignalTimeout() throws Exception
+  {
+    ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+    EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("Start");
+    eventBuilder.addEventDetail(EventDetailType.Signal).addSignalRef(SignalType.USER_SIGNAL, "A");
+    procBuilder.addSequenceFlow("Task").addTask("Task").addSequenceFlow("End").addEndEvent("End");
+    Process proc = procBuilder.getProcess();
+
+    ExecutionManager em = ExecutionManager.locateExecutionManager();
+    em.startProcess(proc, null);
+
+    try
+    {
+      em.waitForEnd(proc, 500);
+      fail("ProcessTimeoutException expected");
+    }
+    catch (ProcessTimeoutException rte)
+    {
+      // expected
+    }
+
+    ProcessStatus status = proc.getProcessStatus();
+    assertEquals(ProcessStatus.Aborted, status);
+    
+    ProcessManager pm = ProcessManager.locateProcessManager();
+    assertNull("Process should be unregistered", pm.getProcessByID(proc.getID()));
+  }
+
+  @SuppressWarnings("serial")
+  public static class TaskHandler implements ExecutionHandler
+  {
+    public void execute(Token token)
+    {
+      throw new RuntimeException("test");
+    }
+  };
 }

Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/engine/EngineShutdownTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/engine/EngineShutdownTest.java	2008-08-20 19:39:22 UTC (rev 1945)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/engine/EngineShutdownTest.java	2008-08-20 22:09:12 UTC (rev 1946)
@@ -99,11 +99,11 @@
     Process proc = pm.createProcess(procXML);
     assertNotNull("Process expected", proc);
     
-    // Try to create a Process during shutdown
+    // Try to start a Process during shutdown
     try
     {
       engine.prepareForShutdown();
-      pm.startProcess(proc.getID(), null);
+      proc.startProcess(null);
       fail("EngineShutdownException expected");
     }
     catch (EngineShutdownException ex)




More information about the jbpm-commits mailing list