[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