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

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Aug 11 12:55:55 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-08-11 12:55:55 -0400 (Mon, 11 Aug 2008)
New Revision: 1867

Modified:
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/ExecutionManager.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/EventBuilder.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/Signal.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowScheduler.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/RuntimeProcess.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/model/internal/ActivityImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EventBuilderImpl.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/FlowSchedulerImpl.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/ProcessImpl.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/RuntimeProcessImpl.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/runtime/internal/TokenImpl.java
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/exclusive/ExclusiveMergeTest.java
Log:
WIP

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/ExecutionManager.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/ExecutionManager.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/ExecutionManager.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -23,75 +23,73 @@
 
 // $Id$
 
-import org.jboss.bpm.model.FlowObject;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.ObjectName;
+
 import org.jboss.bpm.model.Process;
 import org.jboss.bpm.runtime.Attachments;
-import org.jboss.bpm.runtime.ExecutionHandler;
-import org.jboss.bpm.runtime.FlowHandler;
-import org.jboss.bpm.runtime.HandlerSupport;
-import org.jboss.bpm.runtime.SignalHandler;
+import org.jboss.bpm.runtime.RuntimeProcess;
 
 /**
- * The ExecutionManager executes processes 
+ * The ExecutionManager executes processes
  * 
  * @author thomas.diesler at jboss.com
  * @since 18-Jun-2008
  */
 public abstract class ExecutionManager
 {
+  // The map of active runtime processes
+  private Map<ObjectName, RuntimeProcess> runtimeProcesses = new HashMap<ObjectName, RuntimeProcess>();
+  
   // Hide public constructor
   protected ExecutionManager()
   {
   }
 
-  /** 
+  /**
    * Get the ProcessEngine
    */
   public ProcessEngine getProcessEngine()
   {
     return ProcessEngineLocator.locateProcessEngine();
   }
+
+  /**
+   * Locate the ExecutionManager
+   */
+  public static ExecutionManager locateExecutionManager()
+  {
+    ProcessEngine engine = ProcessEngineLocator.locateProcessEngine();
+    return engine.getExecutionManager();
+  }
   
   /**
    * Start the Process and return a Future
+   * 
    * @param proc The Process to start
    * @param att The Attachments in the ExecutionContext
    */
   public abstract void startProcess(Process proc, Attachments att);
   
-  protected ExecutionHandler getExecutionHandler(FlowObject target)
+  /**
+   * Get a {@link RuntimeProcess} for a given processID
+   * @return null if there is no such process
+   */
+  public RuntimeProcess getRuntimeProcess(ObjectName procID)
   {
-    HandlerSupport exfo = getHandlerSupport(target);
-    ExecutionHandler handler = exfo.getExecutionHandler();
-    if (handler == null)
-      throw new IllegalStateException("Cannot obtain execution handler from: " + target);
-    return handler;
+    return runtimeProcesses.get(procID);
   }
-
-  protected SignalHandler getSignalHandler(FlowObject target)
+  
+  protected void addRuntimeProcess(RuntimeProcess rtProc)
   {
-    HandlerSupport exfo = getHandlerSupport(target);
-    SignalHandler handler = exfo.getSignalHandler();
-    if (handler == null)
-      throw new IllegalStateException("Cannot obtain signal handler from: " + target);
-    
-    return handler;
+    ObjectName procID = rtProc.getProcess().getID();
+    runtimeProcesses.put(procID, rtProc);
   }
-
-  protected FlowHandler getFlowHandler(FlowObject target)
+  
+  protected void removeRuntimeProcess(ObjectName procID)
   {
-    HandlerSupport exfo = getHandlerSupport(target);
-    FlowHandler handler = exfo.getFlowHandler();
-    if (handler == null)
-      throw new IllegalStateException("Cannot obtain flow handler from: " + target);
-    
-    return handler;
+    runtimeProcesses.remove(procID);
   }
-
-  private HandlerSupport getHandlerSupport(FlowObject fo)
-  {
-    if (fo instanceof HandlerSupport == false)
-      throw new IllegalStateException("Flow object is not executable: " + fo);
-    return (HandlerSupport)fo;
-  }
-}
\ No newline at end of file
+}

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/EventBuilder.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/EventBuilder.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/EventBuilder.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -36,5 +36,5 @@
   /**
    * Add a signal trigger to the last added {@link Event}
    */
-  EventBuilder addSignalTrigger(String fromRef, SignalType signalType, String signalMessage);
+  EventBuilder addSignalTrigger(SignalType signalType, String signalMessage);
 }
\ No newline at end of file

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/Signal.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/Signal.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/Signal.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -21,6 +21,8 @@
  */
 package org.jboss.bpm.model;
 
+import java.io.Serializable;
+
 //$Id$
 
 /**
@@ -29,8 +31,10 @@
  * @author Thomas.Diesler at jboss.com
  * @since 08-Jul-2008
  */
-public class Signal
+public class Signal implements Serializable
 {
+  private static final long serialVersionUID = 1L;
+
   /**
    * Defines the types of supported Signals
    */

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowScheduler.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowScheduler.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowScheduler.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -26,8 +26,8 @@
 import org.jboss.bpm.model.ConnectingObject;
 
 /**
- * The {@link FlowHandler} invokes the FlowScheduler to schedule 
- * {@link ConnectingObject} objects together with their associated {@link Token}.
+ * The {@link FlowHandler} invokes the FlowScheduler to schedule {@link Token}s
+ * together with their associated {@link ConnectingObject}.
  * 
  * @author thomas.diesler at jboss.com
  * @since 08-Jul-2008
@@ -35,8 +35,12 @@
 public interface FlowScheduler
 {
   /**
-   * Schedule the given {@link ConnectingObject} and {@link Token}
-   * @param flow TODO
+   * Start a given {@link Token} along a {@link ConnectingObject}.
    */
-  void scheduleTuple(ConnectingObject flow, Token token);
+  void startToken(ConnectingObject flow, Token token);
+  
+  /**
+   * Continue a given {@link Token} along a {@link ConnectingObject}.
+   */
+  void continueToken(ConnectingObject flow, Token token);
 }

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/RuntimeProcess.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/RuntimeProcess.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/RuntimeProcess.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -42,5 +42,5 @@
   /**
    * Get the {@link FlowScheduler} for this {@link Process}
    */
-  MutableFlowScheduler getFlowScheduler();
+  FlowScheduler getFlowScheduler();
 }
\ No newline at end of file

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-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -25,6 +25,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.jboss.bpm.InvalidProcessException;
 import org.jboss.bpm.client.ExecutionManager;
 import org.jboss.bpm.client.SignalManager;
 import org.jboss.bpm.model.ConnectingObject;
@@ -34,12 +35,14 @@
 import org.jboss.bpm.model.StartEvent;
 import org.jboss.bpm.model.Process.Status;
 import org.jboss.bpm.model.Signal.SignalType;
+import org.jboss.bpm.model.internal.FlowSchedulerImpl;
 import org.jboss.bpm.model.internal.ProcessImpl;
 import org.jboss.bpm.model.internal.RuntimeProcessImpl;
 import org.jboss.bpm.model.internal.SequenceFlowImpl;
 import org.jboss.bpm.runtime.Attachments;
 import org.jboss.bpm.runtime.Executable;
 import org.jboss.bpm.runtime.FlowHandler;
+import org.jboss.bpm.runtime.HandlerSupport;
 import org.jboss.bpm.runtime.MutableFlowScheduler;
 import org.jboss.bpm.runtime.RuntimeProcess;
 import org.jboss.bpm.runtime.SignalHandler;
@@ -60,29 +63,40 @@
   @Override
   public void startProcess(Process proc, Attachments att)
   {
-    ProcessImpl procImpl = (ProcessImpl)proc;
-    procImpl.setStatus(Status.Active);
+    ((ProcessImpl)proc).setStatus(Status.Active);
 
-    // Run the process in a thread
-    // TODO: one thread per process is not scalable
-    ProcessRunner runner = new ProcessRunner(procImpl, att);
-    new Thread(runner).start();
+    RuntimeProcessImpl rtProc = new RuntimeProcessImpl(proc);
+    final ProcessRunner runner = new ProcessRunner(rtProc, att);
+    FlowSchedulerImpl.StartCallback callback = new FlowSchedulerImpl.StartCallback()
+    {
+      public void start(Token token)
+      {
+        new Thread(runner).start();
+      }
+    };
+    FlowSchedulerImpl flowScheduler = new FlowSchedulerImpl(callback);
+    rtProc.setScheduler(flowScheduler);
+    addRuntimeProcess(rtProc);
+    
+    StartEvent start = getStartEvent(proc);
+    if (start != null)
+    {
+      Token initalToken = new TokenImpl(att);
+      flowScheduler.startToken(new InitialFlow(start), initalToken);
+    }
   }
 
-  private void startProcessInternal(ProcessImpl proc, Attachments att)
+  private void startProcessInternal(RuntimeProcess rtProc, Attachments att)
   {
-    RuntimeProcess rtProc = new RuntimeProcessImpl(proc);
+    ProcessImpl proc = (ProcessImpl)rtProc.getProcess();
     String procName = proc.getName();
 
     SignalManager signalManager = getProcessEngine().getSignalManager();
     signalManager.throwSignal(procName, new Signal(procName, SignalType.ENTER_PROCESS));
-    MutableFlowScheduler flowScheduler = rtProc.getFlowScheduler();
+    MutableFlowScheduler flowScheduler = (MutableFlowScheduler)rtProc.getFlowScheduler();
+    
     try
     {
-      Token initalToken = new TokenImpl(att);
-      StartEvent start = proc.getStartEvent();
-      flowScheduler.scheduleTuple(new InitialFlow(start), initalToken);
-
       while (flowScheduler.peekHeadTuple() != null)
       {
         // Peek the head flow
@@ -123,6 +137,7 @@
     finally
     {
       signalManager.throwSignal(procName, new Signal(procName, Signal.SignalType.EXIT_PROCESS));
+      removeRuntimeProcess(proc.getID());
     }
   }
 
@@ -130,10 +145,52 @@
   {
     if (target instanceof Executable == false)
       throw new IllegalStateException("Flow Object is not executable: " + target);
-    
+
     return (Executable)target;
   }
 
+  private StartEvent getStartEvent(Process proc)
+  {
+    StartEvent start = null;
+    for (StartEvent aux : proc.getFlowObjects(StartEvent.class))
+    {
+      if (aux.getTrigger().size() == 0)
+      {
+        if (start != null)
+          throw new InvalidProcessException("Process cannot have multiple start events with no trigger");
+        start = aux;
+      }
+    }
+    return start;
+  }
+
+  private SignalHandler getSignalHandler(FlowObject target)
+  {
+    HandlerSupport handlerSupport = getHandlerSupport(target);
+    SignalHandler handler = handlerSupport.getSignalHandler();
+    if (handler == null)
+      throw new IllegalStateException("Cannot obtain signal handler from: " + target);
+    
+    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)
+      throw new IllegalStateException("Flow object does not implement handler support: " + fo);
+    return (HandlerSupport)fo;
+  }
+  
   /**
    * The initial flow 'to' the StartEvent
    */
@@ -142,25 +199,25 @@
   {
     InitialFlow(StartEvent start)
     {
-      super("start");
+      super(start.getName());
       setTargetRef(start);
     }
   }
 
   class ProcessRunner implements Runnable
   {
-    ProcessImpl proc;
+    RuntimeProcess rtProc;
     Attachments att;
 
-    public ProcessRunner(ProcessImpl proc, Attachments att)
+    public ProcessRunner(RuntimeProcess rtProc, Attachments att)
     {
-      this.proc = proc;
+      this.rtProc = rtProc;
       this.att = att;
     }
 
     public void run()
     {
-      startProcessInternal(proc, att);
+      startProcessInternal(rtProc, att);
     }
   }
 }
\ No newline at end of file

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-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -309,7 +309,7 @@
       {
         public void execute(FlowScheduler scheduler, Token token)
         {
-          scheduler.scheduleTuple(outFlow, token);
+          scheduler.continueToken(outFlow, token);
         }
       };
     }

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EventBuilderImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EventBuilderImpl.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EventBuilderImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -43,13 +43,13 @@
     super(proc, flowObject);
   }
 
-  public EventBuilder addSignalTrigger(String fromRef, SignalType signalType, String message)
+  public EventBuilder addSignalTrigger(SignalType signalType, String message)
   {
     EventImpl event = getEvent();
     if (event instanceof StartEvent)
     {
       StartEventImpl start = (StartEventImpl)event;
-      Signal signal = new Signal(fromRef, signalType, message);
+      Signal signal = new Signal(event.getName(), signalType, message);
       start.addTrigger(new SignalEventDetailImpl(signal));
     }
     else

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-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -54,7 +54,7 @@
 {
   // provide logging
   private static final Log log = LogFactory.getLog(ExclusiveGatewayImpl.class);
-  
+
   public ExclusiveGatewayImpl(String name)
   {
     super(name);
@@ -81,19 +81,19 @@
       {
         public void execute(FlowScheduler scheduler, Token token)
         {
-          // Schedule the first token that arrives 
+          // Schedule the first token that arrives
           if (receivedTokens.size() == 1)
           {
             Gate selectedGate = getSelectedGate(token);
             SequenceFlow outFlow = selectedGate.getOutgoingSequenceFlow();
-            scheduler.scheduleTuple(outFlow, token);
+            scheduler.continueToken(outFlow, token);
           }
-          // Ignore all other tokens 
+          // Ignore all other tokens
           else
           {
             log.debug("Ignore token: " + token);
           }
-          
+
           // Reset the gateway
           if (expectedFlows.size() == 0)
           {
@@ -142,8 +142,8 @@
         }
       }
     }
-    
-    // Fallback to the default gate if there is one
+
+    // Use to the default gate if there is one
     if (selectedGate == null)
     {
       for (Gate auxGate : getGates())
@@ -156,13 +156,24 @@
         }
       }
     }
-    
+
+    // Fallback to the single outgoing gate that is not conditional
+    if (selectedGate == null && getGates().size() == 1)
+    {
+      Gate auxGate = getGates().get(0);
+      SequenceFlow seqFlow = auxGate.getOutgoingSequenceFlow();
+      if (seqFlow.getConditionType() == ConditionType.None)
+      {
+        selectedGate = auxGate;
+      }
+    }
+
     if (selectedGate == null)
       throw new IllegalStateException("Cannot select applicable gate in: " + this);
-    
+
     return selectedGate;
   }
-  
+
   public String toString()
   {
     return "ExclusiveGateway[" + getName() + "]";

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowSchedulerImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowSchedulerImpl.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowSchedulerImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -42,11 +42,27 @@
 public class FlowSchedulerImpl implements MutableFlowScheduler
 {
   private Queue<Token> flowQueue = new ConcurrentLinkedQueue<Token>();
+  private StartCallback startCallback;
 
-  public void scheduleTuple(ConnectingObject flow, Token token)
+  public FlowSchedulerImpl(StartCallback startCallback)
   {
+    this.startCallback = startCallback;
+  }
+
+  public void startToken(ConnectingObject flow, Token token)
+  {
     TokenImpl tokenImpl = (TokenImpl)token;
     tokenImpl.setFlow(flow);
+    flowQueue.add(tokenImpl);
+    
+    if (startCallback != null)
+      startCallback.start(token);
+  }
+  
+  public void continueToken(ConnectingObject flow, Token token)
+  {
+    TokenImpl tokenImpl = (TokenImpl)token;
+    tokenImpl.setFlow(flow);
     flowQueue.add(tokenImpl); 
   }
   
@@ -59,4 +75,9 @@
   {
    return flowQueue.remove();
   }
+  
+  public interface StartCallback
+  {
+    void start(Token token);
+  }
 }
\ No newline at end of file

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-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -101,7 +101,7 @@
       {
         public void execute(FlowScheduler scheduler, Token token)
         {
-          scheduler.scheduleTuple(getOutFlow(), token);
+          scheduler.continueToken(getOutFlow(), token);
         }
       };
     }

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-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -110,7 +110,7 @@
             if (outstandingFlows.size() == 0)
             {
               Token mergedToken = mergeTokens(token);
-              scheduler.scheduleTuple(outFlow, mergedToken);
+              scheduler.continueToken(outFlow, mergedToken);
               outstandingFlows = null;
               mergeTokens = null;
             }
@@ -131,7 +131,7 @@
           }
           else
           {
-            scheduler.scheduleTuple(outFlow, token);
+            scheduler.continueToken(outFlow, token);
           }
         }
       };
@@ -145,7 +145,7 @@
           for(Gate gate : getGates())
           {
             SequenceFlow outFlow = gate.getOutgoingSequenceFlow();
-            scheduler.scheduleTuple(outFlow, token.copyToken());
+            scheduler.startToken(outFlow, token.copyToken());
           }
         }
       };

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-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -38,7 +38,6 @@
 import org.jboss.bpm.client.ProcessManager;
 import org.jboss.bpm.client.internal.ProcessManagerImpl;
 import org.jboss.bpm.model.EndEvent;
-import org.jboss.bpm.model.EventDetail;
 import org.jboss.bpm.model.FlowObject;
 import org.jboss.bpm.model.InputSet;
 import org.jboss.bpm.model.Message;
@@ -158,57 +157,6 @@
     this.runtimeException = rte;
   }
 
-  public StartEvent getStartEvent()
-  {
-    StartEvent start = null;
-    for (FlowObject aux : flowObjects)
-    {
-      if (aux instanceof StartEvent)
-      {
-        StartEvent tmpStart = (StartEvent)aux;
-        List<EventDetail> triggers = tmpStart.getTrigger();
-        if (triggers.size() == 0)
-        {
-          if (start != null)
-            throw new InvalidProcessException("Process cannot have multiple start events with no trigger");
-          start = tmpStart;
-        }
-      }
-    }
-    return start;
-  }
-
-  public StartEvent getStartEvent(String name)
-  {
-    FlowObject fo = getFlowObject(name);
-    if (fo instanceof StartEvent == false)
-      throw new IllegalArgumentException("Is not a start event: " + fo);
-    
-    return (StartEvent)fo;
-  }
-
-  public List<EndEvent> getEndEvents()
-  {
-    List<EndEvent> ends = new ArrayList<EndEvent>();
-    for (FlowObject aux : flowObjects)
-    {
-      if (aux instanceof EndEvent)
-      {
-        ends.add((EndEvent)aux);
-      }
-    }
-    return Collections.unmodifiableList(ends);
-  }
-
-  public EndEvent getEndEvent(String name)
-  {
-    FlowObject fo = getFlowObject(name);
-    if (fo instanceof EndEvent == false)
-      throw new IllegalArgumentException("Is not an end event: " + fo);
-    
-    return (EndEvent)fo;
-  }
-
   public List<FlowObject> getFlowObjects()
   {
 

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/RuntimeProcessImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/RuntimeProcessImpl.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/RuntimeProcessImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -24,7 +24,7 @@
 //$Id$
 
 import org.jboss.bpm.model.Process;
-import org.jboss.bpm.runtime.MutableFlowScheduler;
+import org.jboss.bpm.runtime.FlowScheduler;
 import org.jboss.bpm.runtime.RuntimeProcess;
 
 /**
@@ -36,7 +36,7 @@
 public class RuntimeProcessImpl implements RuntimeProcess
 {
   private Process process;
-  private MutableFlowScheduler scheduler = new FlowSchedulerImpl();
+  private FlowScheduler scheduler;
 
   public RuntimeProcessImpl(Process process)
   {
@@ -48,8 +48,13 @@
     return process;
   }
 
-  public MutableFlowScheduler getFlowScheduler()
+  public FlowScheduler getFlowScheduler()
   {
     return scheduler;
   }
+
+  public void setScheduler(FlowScheduler scheduler)
+  {
+    this.scheduler = scheduler;
+  }
 }
\ No newline at end of file

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-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -29,15 +29,22 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.jboss.bpm.client.ExecutionManager;
+import org.jboss.bpm.client.SignalListener;
+import org.jboss.bpm.client.SignalManager;
 import org.jboss.bpm.model.ConnectingObject;
 import org.jboss.bpm.model.EventDetail;
+import org.jboss.bpm.model.Process;
 import org.jboss.bpm.model.Signal;
+import org.jboss.bpm.model.SignalEventDetail;
 import org.jboss.bpm.model.StartEvent;
 import org.jboss.bpm.runtime.ExecutionHandler;
 import org.jboss.bpm.runtime.FlowHandler;
 import org.jboss.bpm.runtime.FlowScheduler;
+import org.jboss.bpm.runtime.RuntimeProcess;
 import org.jboss.bpm.runtime.SignalHandler;
 import org.jboss.bpm.runtime.Token;
+import org.jboss.bpm.runtime.internal.TokenImpl;
 
 /**
  * A Start Event indicates where a particular Process will start. In terms of Sequence Flow, the Start Event starts the
@@ -55,6 +62,7 @@
 
   private ConnectingObject outFlow;
   private List<EventDetail> triggers = new ArrayList<EventDetail>();
+  private Signal startSignal;
 
   public StartEventImpl(String name)
   {
@@ -69,6 +77,12 @@
   public void addTrigger(EventDetail eventDetail)
   {
     triggers.add(eventDetail);
+    
+    if (eventDetail instanceof SignalEventDetail)
+    {
+      SignalEventDetail signalDetail = (SignalEventDetail)eventDetail;
+      startSignal = signalDetail.getSignalRef();
+    }
   }
 
   public ConnectingObject getOutFlow()
@@ -106,7 +120,7 @@
       {
         public void execute(FlowScheduler scheduler, Token token)
         {
-          scheduler.scheduleTuple(outFlow, token);
+          scheduler.continueToken(outFlow, token);
         }
       };
     }
@@ -134,6 +148,40 @@
     return handler;
   }
 
+  @Override
+  protected void initialize(Process proc)
+  {
+    super.initialize(proc);
+    
+    // Setup the start signal handler
+    if (startSignal != null)
+    {
+      final StartEvent start = this;
+      SignalListener listener = new SignalListener()
+      {
+        public void catchSignal(Signal signal)
+        {
+          if (startSignal.getType() == signal.getType() && startSignal.getMessage().equals(signal.getMessage()))
+          {
+            log.debug("Start process from signal: " + signal);
+            
+            Token initalToken = new TokenImpl(null);
+            SequenceFlowImpl seqFlow = new SequenceFlowImpl(start.getName());
+            seqFlow.setTargetRef(start);
+            
+            ExecutionManager exManager = ExecutionManager.locateExecutionManager();
+            RuntimeProcess rtProc = exManager.getRuntimeProcess(start.getProcess().getID());
+            FlowScheduler flowScheduler = rtProc.getFlowScheduler();
+            flowScheduler.startToken(seqFlow, initalToken);
+          }
+        }
+      };
+      SignalManager signalManager = SignalManager.locateSignalManager();
+      signalManager.addSignalListener(getProcess().getName(), listener);
+    }
+  }
+
+  
   public String toString()
   {
     return "StartEvent[]";

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/runtime/internal/TokenImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/runtime/internal/TokenImpl.java	2008-08-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/runtime/internal/TokenImpl.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -27,7 +27,6 @@
 import org.jboss.bpm.model.FlowObject;
 import org.jboss.bpm.model.InputSet;
 import org.jboss.bpm.model.OutputSet;
-import org.jboss.bpm.model.Process;
 import org.jboss.bpm.runtime.Attachments;
 import org.jboss.bpm.runtime.BasicAttachments;
 import org.jboss.bpm.runtime.ExecutionContext;
@@ -56,7 +55,7 @@
   private OutputSet outputSet;
 
   /**
-   * Construct a Token with a given {@link Process} and {@link Attachments}
+   * Construct a Token with given {@link Attachments}
    */
   public TokenImpl(Attachments att)
   {

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-11 12:30:14 UTC (rev 1866)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/exclusive/ExclusiveMergeTest.java	2008-08-11 16:55:55 UTC (rev 1867)
@@ -23,8 +23,6 @@
 
 // $Id$
 
-import java.util.List;
-
 import org.jboss.bpm.client.SignalManager;
 import org.jboss.bpm.model.EventBuilder;
 import org.jboss.bpm.model.Process;
@@ -33,7 +31,6 @@
 import org.jboss.bpm.model.Signal;
 import org.jboss.bpm.model.Gateway.GatewayType;
 import org.jboss.bpm.model.Signal.SignalType;
-import org.jboss.bpm.runtime.BasicAttachments;
 import org.jboss.bpm.test.DefaultEngineTestCase;
 
 /**
@@ -60,35 +57,23 @@
     proc.startProcess();
     
     SignalManager signalManager = SignalManager.locateSignalManager();
+    Signal signal = new Signal(getName(), SignalType.START_TRIGGER, "A");
+    signalManager.throwSignal(proc.getName(), signal);
     
     proc.waitForEnd();
-
-    List<Signal> endSignals = getSignals(Signal.SignalType.EXIT_END_EVENT);
-    assertEquals(1, endSignals.size());
-    assertEquals("EndA", endSignals.get(0).getFromRef());
   }
 
   public void testGateB() throws Exception
   {
-    Process proc = getProcess();
-
-    BasicAttachments att = new BasicAttachments();
-    att.addAttachment("foo", "15");
-    proc.startProcess(att);
-    proc.waitForEnd();
-
-    List<Signal> endSignals = getSignals(Signal.SignalType.EXIT_END_EVENT);
-    assertEquals(1, endSignals.size());
-    assertEquals("EndB", endSignals.get(0).getFromRef());
   }
 
   private Process getProcess()
   {
     ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
     EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA");
-    eventBuilder.addSignalTrigger(getName(), SignalType.START_TRIGGER, "A").addSequenceFlow("Merge");
+    eventBuilder.addSignalTrigger(SignalType.START_TRIGGER, "A").addSequenceFlow("Merge");
     eventBuilder = procBuilder.addStartEvent("StartB");
-    eventBuilder.addSignalTrigger(getName(), SignalType.START_TRIGGER, "B").addSequenceFlow("Merge");
+    eventBuilder.addSignalTrigger(SignalType.START_TRIGGER, "B").addSequenceFlow("Merge");
     procBuilder.addGateway("Merge", GatewayType.Exclusive);
     procBuilder.addSequenceFlow("End").addEndEvent("End");
     Process proc = procBuilder.getProcess();




More information about the jbpm-commits mailing list