[jbpm-commits] JBoss JBPM SVN: r1881 - in jbossbpm/spec/trunk/modules: ri/src/main/java/org/jboss/bpm/model/internal and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Aug 13 09:59:53 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-08-13 09:59:52 -0400 (Wed, 13 Aug 2008)
New Revision: 1881

Modified:
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ProcessManagerImpl.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/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/GatewayImpl.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/ProcessImpl.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/exclusive/ExclusiveMergeTest.java
Log:
Add FlowObject.reset()

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ProcessManagerImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ProcessManagerImpl.java	2008-08-13 13:22:03 UTC (rev 1880)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ProcessManagerImpl.java	2008-08-13 13:59:52 UTC (rev 1881)
@@ -29,6 +29,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.jboss.bpm.BPMException;
 import org.jboss.bpm.ProcessTimeoutException;
 import org.jboss.bpm.client.DialectHandler;
 import org.jboss.bpm.client.DialectRegistry;
@@ -69,11 +70,7 @@
 
   public void startProcess(ObjectName procID, Attachments att)
   {
-    Process proc = getProcessByID(procID);
-    if (proc == null)
-      throw new IllegalStateException("Cannot obtain process: " + procID);
-    
-    // Start the process in a thread
+    Process proc = getProcessStrict(procID);
     ExecutionManager exm = ExecutionManager.locateExecutionManager();
     exm.startProcess(proc, att);
   }
@@ -81,7 +78,7 @@
   @Override
   public ProcessStatus waitForEnd(ObjectName procID, long timeout)
   {
-    Process proc = getProcessByID(procID);
+    Process proc = getProcessStrict(procID);
     ProcessImpl procImpl = (ProcessImpl)proc;
     ProcessStatus status = proc.getProcessStatus();
 
@@ -107,7 +104,7 @@
           if (rte == null)
             return status;
           else
-            throw rte;
+            throw new BPMException("Process aborted", rte);
         }
         Thread.sleep(100);
         now = System.currentTimeMillis();
@@ -121,4 +118,12 @@
     // Throw timeout exception if it took too long
     throw new ProcessTimeoutException("Process timeout for: " + procID);
   }
+
+  private Process getProcessStrict(ObjectName procID)
+  {
+    Process proc = getProcessByID(procID);
+    if (proc == null)
+      throw new IllegalStateException("Cannot obtain process: " + procID);
+    return proc;
+  }
 }

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-13 13:22:03 UTC (rev 1880)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java	2008-08-13 13:59:52 UTC (rev 1881)
@@ -91,19 +91,25 @@
         // Synchronize execution of the target and the flow handler
         synchronized (rtProc)
         {
-          // Execute the FlowObject
           try
           {
+            // Execute the FlowObject
             signalManager.throwSignal(procImpl.getName(), sigHandler.getEnterSignal());
             target.execute(token);
+            
+            // Transfer the token to the FlowHandler
+            flowHandler.execute(scheduler, token);
           }
+          catch(RuntimeException rte)
+          {
+            target.reset();
+            throw rte;
+          }
           finally
           {
             signalManager.throwSignal(procImpl.getName(), sigHandler.getExitSignal());
           }
 
-          // Transfer the token to the FlowHandler
-          flowHandler.execute(scheduler, token);
         }
 
         tokStatus = token.getTokenStatus();

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-13 13:22:03 UTC (rev 1880)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java	2008-08-13 13:59:52 UTC (rev 1881)
@@ -120,7 +120,7 @@
           // Reset the gateway
           if (outstandingFlows.size() == 0)
           {
-            resetGateway();
+            reset();
           }
         }
       };
@@ -129,9 +129,9 @@
   }
 
   @Override
-  protected void resetGateway()
+  public void reset()
   {
-    super.resetGateway();
+    super.reset();
     outstandingFlows = null;
   }
 

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-13 13:22:03 UTC (rev 1880)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java	2008-08-13 13:59:52 UTC (rev 1881)
@@ -109,6 +109,11 @@
   {
     // noting to do
   }
+
+  public void reset()
+  {
+    // noting to do
+  }
   
   @Override
   protected void initialize(Process proc)

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/GatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/GatewayImpl.java	2008-08-13 13:22:03 UTC (rev 1880)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/GatewayImpl.java	2008-08-13 13:59:52 UTC (rev 1881)
@@ -133,9 +133,10 @@
     receivedTokens.add(token);
   }
 
-  // Reset the gateway
-  protected void resetGateway()
+  @Override
+  public void reset()
   {
+    super.reset();
     expectedFlows = null;
     receivedTokens = null;
   }

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-13 13:22:03 UTC (rev 1880)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java	2008-08-13 13:59:52 UTC (rev 1881)
@@ -150,7 +150,7 @@
             }
             
             // Reset the gateway
-            resetGateway();
+            reset();
           }
         }
       };
@@ -159,9 +159,9 @@
   }
 
   @Override
-  protected void resetGateway()
+  public void reset()
   {
-    super.resetGateway();
+    super.reset();
     outstandingFlows = null;
     mergeTokens = null;
   }

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-13 13:22:03 UTC (rev 1880)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java	2008-08-13 13:59:52 UTC (rev 1881)
@@ -33,6 +33,8 @@
 
 import javax.management.ObjectName;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.jboss.bpm.InvalidProcessException;
 import org.jboss.bpm.NotImplementedException;
 import org.jboss.bpm.client.ProcessManager;
@@ -58,6 +60,9 @@
 @SuppressWarnings("serial")
 public class ProcessImpl extends SupportingElementImpl implements Process, MutablePropertySupport
 {
+  // provide logging
+  private static final Log log = LogFactory.getLog(ProcessImpl.class);
+  
   // The required process name
   private String name;
   // The list of associated flow objects
@@ -197,9 +202,12 @@
   {
     ProcessManager pm = ProcessManager.locateProcessManager();
     
-    if (getProcessStatus() != ProcessStatus.Ready)
-      throw new IllegalStateException("Cannot start process in state: " + getProcessStatus());
+    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)
     {
@@ -211,6 +219,18 @@
     return getID();
   }
 
+  private void resetProcess()
+  {
+    log.debug("Reset process: " + this);
+    for (FlowObject fo : flowObjects)
+    {
+      FlowObjectImpl foImpl = (FlowObjectImpl)fo;
+      foImpl.reset();
+    }
+    status = ProcessStatus.Ready;
+    runtimeException = null;
+  }
+
   public void waitForEnd()
   {
     ProcessManager pm = ProcessManager.locateProcessManager();
@@ -310,10 +330,11 @@
     if (getFlowObjects(EndEvent.class).size() == 0)
       throw new InvalidProcessException("Process does not have end events");
 
-    // Set the associated process
-    for (FlowObject aux : flowObjects)
+    // Initialize the flow objects
+    for (FlowObject fo : flowObjects)
     {
-      ((FlowObjectImpl)aux).initialize(this);
+      FlowObjectImpl foImpl = (FlowObjectImpl)fo;
+      foImpl.initialize(this);
     }
 
     status = ProcessStatus.Ready;

Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/exclusive/ExclusiveMergeTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/exclusive/ExclusiveMergeTest.java	2008-08-13 13:22:03 UTC (rev 1880)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/exclusive/ExclusiveMergeTest.java	2008-08-13 13:59:52 UTC (rev 1881)
@@ -51,18 +51,18 @@
   {
     Process proc = getProcess();
     proc.startProcess();
-    
-    // Add a signal listener that sends the other start trigger signal 
+
+    // Add a signal listener that sends the other start trigger signal
     SignalManager signalManager = SignalManager.locateSignalManager();
     Signal startTrigger = new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "B");
     signalManager.addSignalListener(getName(), new MergeListener(getName(), startTrigger));
-    
-    // Send start trigger signal 
+
+    // Send start trigger signal
     signalManager.throwSignal(proc.getName(), new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "A"));
-    
+
     // Wait for the process to end
     proc.waitForEnd();
-    
+
     // Verify the result
     assertEquals("TaskA", TaskC.taskValue);
   }
@@ -71,22 +71,62 @@
   {
     Process proc = getProcess();
     proc.startProcess();
-    
-    // Add a signal listener that sends the other start trigger signal 
+
+    // Add a signal listener that sends the other start trigger signal
     SignalManager signalManager = SignalManager.locateSignalManager();
     Signal startTrigger = new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "A");
     signalManager.addSignalListener(getName(), new MergeListener(getName(), startTrigger));
-    
-    // Send start trigger signal 
+
+    // Send start trigger signal
     signalManager.throwSignal(proc.getName(), new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "B"));
-    
+
     // Wait for the process to end
     proc.waitForEnd();
-    
+
     // Verify the result
     assertEquals("TaskB", TaskC.taskValue);
   }
 
+  public void testInvalidToken() throws Exception
+  {
+    Process proc = getProcess();
+    proc.startProcess();
+
+    // Add a signal listener that sends the other start trigger signal
+    SignalManager signalManager = SignalManager.locateSignalManager();
+    Signal startTrigger = new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "A");
+    signalManager.addSignalListener(getName(), new MergeListener(getName(), startTrigger));
+
+    // Send start trigger signal
+    signalManager.throwSignal(proc.getName(), new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "A"));
+
+    try
+    {
+      proc.waitForEnd();
+      fail("Expected: Unexpected token from: SequenceFlow[TaskA->Merge]");
+    }
+    catch (RuntimeException rte)
+    {
+      // expected
+    }
+
+    // Restart the process
+    proc.startProcess();
+    
+    // Add a signal listener that sends the other start trigger signal
+    startTrigger = new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "B");
+    signalManager.addSignalListener(getName(), new MergeListener(getName(), startTrigger));
+
+    // Send start trigger signal
+    signalManager.throwSignal(proc.getName(), new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "A"));
+
+    // Wait for the process to end
+    proc.waitForEnd();
+
+    // Verify the result
+    assertEquals("TaskA", TaskC.taskValue);
+  }
+
   private Process getProcess()
   {
     ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
@@ -107,7 +147,7 @@
   {
     private String fromRef;
     private Signal nextSignal;
-    
+
     public MergeListener(String fromRef, Signal nextSignal)
     {
       this.fromRef = fromRef;
@@ -127,7 +167,7 @@
       }
     }
   }
-  
+
   @SuppressWarnings("serial")
   public static class TaskA implements ExecutionHandler
   {
@@ -137,7 +177,7 @@
       exContext.addAttachment("taskValue", "TaskA");
     }
   }
-  
+
   @SuppressWarnings("serial")
   public static class TaskB implements ExecutionHandler
   {
@@ -147,11 +187,12 @@
       exContext.addAttachment("taskValue", "TaskB");
     }
   }
-  
+
   @SuppressWarnings("serial")
   public static class TaskC implements ExecutionHandler
   {
     public static Object taskValue;
+
     public void execute(Token token)
     {
       ExecutionContext exContext = token.getExecutionContext();




More information about the jbpm-commits mailing list