[jbpm-commits] JBoss JBPM SVN: r1911 - in jbossbpm/spec/trunk/modules: api/src/main/java/org/jboss/bpm/runtime and 8 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Sun Aug 17 12:18:38 EDT 2008
Author: thomas.diesler at jboss.com
Date: 2008-08-17 12:18:36 -0400 (Sun, 17 Aug 2008)
New Revision: 1911
Added:
jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketTest.java
jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/ReceiveTaskTest.java
jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/SendTaskTest.java
Removed:
jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AbstractAirticketTest.java
jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java
jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java
Modified:
jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/MessageManager.java
jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java
jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowHandler.java
jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/TokenExecutor.java
jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ComplexGatewayImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EndEventImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessBuilderImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ReceiveTaskImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/TokenExecutorImpl.java
jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketAPIDescriptorTest.java
jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketSTPDescriptorTest.java
jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveGatewaySplitTest.java
jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/multichoice/MultiChoiceTest.java
jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/synchronization/SynchronizationTest.java
Log:
Add token activate
Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/MessageManager.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/MessageManager.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/MessageManager.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -38,9 +38,7 @@
import org.jboss.bpm.model.Task;
/**
- * The ProcessEngine sends mesages through the MessageManager.
- * <p/>
- * A {@link Message} has an ID and is targeted to a
+ * The ProcessEngine sends mesages through the MessageManager. <p/> A {@link Message} has an ID and is targeted to a
* specific {@link Participant}. A component can register a {@link MessageListener} with the MessageManager.
*
* @author thomas.diesler at jboss.com
@@ -62,7 +60,7 @@
ProcessEngine engine = ProcessEngine.locateProcessEngine();
return engine.getMessageManager();
}
-
+
/**
* Add a MessageListener
*/
@@ -70,13 +68,14 @@
{
if (hasMessageListener(listener.getID()))
throw new IllegalStateException("Listener already registered: " + listener.getID());
-
- log.debug("addMessageListener: " + listener);
+
+ log.debug("addMessageListener: " + listener.getID());
listeners.put(listener.getID(), listener);
}
/**
* Get a MessageListener for a given ID
+ *
* @return null if there is none
*/
public MessageListener getMessageListener(ObjectName listenerID)
@@ -108,6 +107,9 @@
{
ProcessManager pm = ProcessManager.locateProcessManager();
Process proc = pm.getProcessByID(procID);
+ if (proc == null)
+ throw new IllegalStateException("Cannot obtain registered process: " + procID);
+
FlowObject target = proc.getFlowObject(targetName);
if (target == null)
throw new IllegalArgumentException("Cannot find message target: " + targetName);
Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -33,10 +33,8 @@
import org.jboss.bpm.model.Signal;
/**
- * The ProcessEngine sends signals through the SignalManager
- * <p/>
- * A {@link Signal} is like an undirected flare shot up into the air.
- * A component can register a {@link SignalListener} with the SignalManager.
+ * The ProcessEngine sends signals through the SignalManager <p/> A {@link Signal} is like an undirected flare shot up
+ * into the air. A component can register a {@link SignalListener} with the SignalManager.
*
* @author thomas.diesler at jboss.com
* @since 18-Jun-2008
@@ -45,10 +43,10 @@
{
// provide logging
private static final Log log = LogFactory.getLog(SignalManager.class);
-
+
// The map of registered signal listeners
private Map<String, Set<SignalListener>> listeners = new HashMap<String, Set<SignalListener>>();
-
+
/**
* Locate the SignalManager
*/
@@ -57,11 +55,11 @@
ProcessEngine engine = ProcessEngine.locateProcessEngine();
return engine.getSignalManager();
}
-
+
/**
* Add a SignalListener for a given process
*/
- public void addSignalListener(String procName, SignalListener listener)
+ public synchronized void addSignalListener(String procName, SignalListener listener)
{
log.debug("addSignalListener: " + procName + "=" + listener);
Set<SignalListener> set = listeners.get(procName);
@@ -76,7 +74,7 @@
/**
* Remove an SignalListener for a given process
*/
- public void removeSignalListener(String procName, SignalListener listener)
+ public synchronized void removeSignalListener(String procName, SignalListener listener)
{
log.debug("removeSignalListener: " + procName + "=" + listener);
Set<SignalListener> set = listeners.get(procName);
@@ -86,40 +84,52 @@
}
}
- /**
- * Remove all SignalListener for a given process
+ /**
+ * Remove all SignalListener for a given process
*/
- public void removeSignalListeners(String procName)
+ public synchronized void removeSignalListeners(String procName)
{
log.debug("removeSignalListeners: " + procName);
listeners.remove(procName);
}
- /**
- * Throw a signal to all registered listeners
+ /**
+ * Throw a signal to all registered listeners
*/
public void throwSignal(String procName, Signal signal)
{
log.debug("throwSignal: " + procName + "=" + signal);
-
+
// Throw Signal to listeners associated with the process
- Set<SignalListener> set = listeners.get(procName);
- if (set != null)
+ Set<SignalListener> procListeners = listeners.get(procName);
+ if (procListeners != null)
{
- for (SignalListener listener : set)
+ for (SignalListener listener : procListeners)
{
- listener.catchSignal(signal);
+ failsafeThrow(listener, signal);
}
}
-
+
// Throw Signal to listeners not associated with any process
- set = listeners.get(null);
- if (set != null)
+ Set<SignalListener> allProcListeners = listeners.get(null);
+ if (allProcListeners != null)
{
- for (SignalListener listener : set)
+ for (SignalListener listener : allProcListeners)
{
- listener.catchSignal(signal);
+ failsafeThrow(listener, signal);
}
}
}
+
+ private void failsafeThrow(SignalListener listener, Signal signal)
+ {
+ try
+ {
+ listener.catchSignal(signal);
+ }
+ catch (RuntimeException rte)
+ {
+ log.error("Signal processing error", rte);
+ }
+ }
}
\ No newline at end of file
Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowHandler.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowHandler.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/FlowHandler.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -25,7 +25,6 @@
import org.jboss.bpm.client.ProcessEngine;
import org.jboss.bpm.model.FlowObject;
-import org.jboss.bpm.model.SequenceFlow;
/**
* The {@link ProcessEngine} invokes the FlowHandler on an {@link HandlerSupport}
@@ -37,11 +36,11 @@
public interface FlowHandler extends Handler
{
/**
- * Execute the the FlowHandler.
+ * Execute the FlowHandler.
* <p/>
- * The FlowHandler will add the active outgoing {@link SequenceFlow}s to
- * the the {@link TokenExecutor} for the {@link ProcessEngine} to execute.
+ * The FlowHandler typically invoves one of the {@link TokenExecutor}
+ * methods to move the {@link Token} to the next {@link FlowObject}.
*/
- void execute(TokenExecutor scheduler, Token token);
+ void execute(TokenExecutor tokenExecutor, Token token);
}
\ No newline at end of file
Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/TokenExecutor.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/TokenExecutor.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/runtime/TokenExecutor.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -39,12 +39,12 @@
/**
* Get the set of active tokens
*/
- Set<Token> getActiveTokens();
+ Set<Token> getRunnableTokens();
/**
* True if there are active tokens
*/
- boolean hasActiveTokens();
+ boolean hasRunnableTokens();
/**
* Create a {@link Token} with an initial flow
Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -78,14 +78,14 @@
{
super.setUp();
log.debug("setUp: " + getClass().getName() + "." + getName());
-
+
deployer = new EmbeddedBeansDeployer();
-
+
// Setup the SignalListener
SignalManager signalManager = SignalManager.locateSignalManager();
signalManager.addSignalListener(null, getSignalListener());
signals.clear();
-
+
// Setup the MessageListener
MessageManager messageManager = MessageManager.locateMessageManager();
messageManager.addMessageListener(getMessageListener());
@@ -95,16 +95,16 @@
protected void tearDown() throws Exception
{
log.debug("tearDown: " + getClass().getName() + "." + getName());
-
+
// Tear down the SignalListener
SignalManager signalManager = SignalManager.locateSignalManager();
signalManager.removeSignalListeners(null);
-
+
// Tear down the MessageListener
MessageManager messageManager = MessageManager.locateMessageManager();
messageManager.removeMessageListener(getMessageListenerID());
-
- // Check that there are no registered processes left
+
+ // Check that there are no registered processes left
ProcessManager procManager = ProcessManager.locateProcessManager();
Set<Process> procs = procManager.getProcesses();
if (procs.size() > 0)
@@ -113,7 +113,7 @@
System.out.println(logMsg);
log.warn(logMsg);
}
-
+
super.tearDown();
}
@@ -161,6 +161,11 @@
{
signals.add(signal);
}
+
+ public String toString()
+ {
+ return "SignalListener[" + getShortName() + "]";
+ }
};
}
return signalListener;
@@ -168,18 +173,26 @@
public List<Signal> getSignals()
{
- return Collections.unmodifiableList(signals);
+ SignalManager signalManager = SignalManager.locateSignalManager();
+ synchronized (signalManager)
+ {
+ return Collections.unmodifiableList(signals);
+ }
}
public List<Signal> getSignals(Signal.SignalType type)
{
- List<Signal> retSignals = new ArrayList<Signal>();
- for (Signal sig : signals)
+ SignalManager signalManager = SignalManager.locateSignalManager();
+ synchronized (signalManager)
{
- if (sig.getSignalType() == type)
- retSignals.add(sig);
+ List<Signal> retSignals = new ArrayList<Signal>();
+ for (Signal sig : signals)
+ {
+ if (sig.getSignalType() == type)
+ retSignals.add(sig);
+ }
+ return Collections.unmodifiableList(retSignals);
}
- return Collections.unmodifiableList(retSignals);
}
public MessageListener getMessageListener()
@@ -192,11 +205,14 @@
{
return getMessageListenerID();
}
-
+
public void catchMessage(Message message)
{
- log.debug("catchMessage: " + message);
- messages.add(message);
+ synchronized (messages)
+ {
+ log.debug("catchMessage: " + message);
+ messages.add(message);
+ }
}
};
}
@@ -205,21 +221,23 @@
public ObjectName getMessageListenerID()
{
- String className = getClass().getName();
- className = className.substring(className.lastIndexOf(".") + 1);
- return ObjectNameFactory.create(BPMNElement.ID_DOMAIN, "msgListener", className);
+ return ObjectNameFactory.create(BPMNElement.ID_DOMAIN, "msgListener", getShortName());
}
-
+
public List<Message> getMessages()
{
- return Collections.unmodifiableList(messages);
+ synchronized (messages)
+ {
+ return Collections.unmodifiableList(messages);
+ }
}
-
+
/**
* Marshall the given process
+ *
* @param out if null, the proces is marshalled to a file
*/
- public String _marshallProcess(Process proc, Writer out)
+ public String marshallProcess(Process proc, Writer out)
{
try
{
@@ -229,11 +247,11 @@
out = new FileWriter(file);
System.out.println("Marshall process to: " + file.getCanonicalPath());
}
-
+
String procXML = marshallProcess(proc);
out.write(procXML);
out.close();
-
+
return procXML;
}
catch (IOException ex)
@@ -249,9 +267,18 @@
{
ProcessManager pm = ProcessManager.locateProcessManager();
DialectHandler dhapi = pm.getDialectHandler(DialectHandler.DEFAULT_NAMESPACE_URI);
-
+
StringWriter strwr = new StringWriter();
dhapi.marshallProcess(proc, strwr);
return strwr.toString();
}
+
+ /**
+ * Get the test short name, which is the class name without the package
+ */
+ protected String getShortName()
+ {
+ String shortName = getClass().getName();
+ return shortName.substring(shortName.lastIndexOf(".") + 1);
+ }
}
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/ExecutionManagerImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -161,7 +161,7 @@
String procName = proc.getName();
ProcessStatus procStatus = proc.getProcessStatus();
- boolean hasActiveTokens = tokenExecutor.hasActiveTokens();
+ boolean hasActiveTokens = tokenExecutor.hasRunnableTokens();
try
{
synchronized (proc)
@@ -177,9 +177,9 @@
log.error("Executor thread interrupted");
}
procStatus = proc.getProcessStatus();
- hasActiveTokens = tokenExecutor.hasActiveTokens();
+ hasActiveTokens = tokenExecutor.hasRunnableTokens();
}
- log.debug("End execution thread [status=" + procStatus + ",tokens=" + tokenExecutor.getActiveTokens() + "]");
+ log.debug("End execution thread [status=" + procStatus + ",tokens=" + tokenExecutor.getRunnableTokens() + "]");
}
}
finally
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/client/internal/RunnableToken.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -30,7 +30,6 @@
import org.jboss.bpm.model.Process.ProcessStatus;
import org.jboss.bpm.model.internal.FlowObjectImpl;
import org.jboss.bpm.model.internal.ProcessImpl;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.HandlerSupport;
import org.jboss.bpm.runtime.RuntimeProcess;
import org.jboss.bpm.runtime.SignalHandler;
@@ -69,8 +68,6 @@
{
TokenExecutor tokenExecutor = rtProc.getTokenExecutor();
ProcessImpl procImpl = (ProcessImpl)rtProc.getProcess();
-
- token.setTokenStatus(TokenStatus.Started);
try
{
ConnectingObject flow = token.getFlow();
@@ -86,10 +83,9 @@
// Get the target and its handlers
FlowObjectImpl targetFlowObject = (FlowObjectImpl)flow.getTargetRef();
SignalHandler sigHandler = getSignalHandler(targetFlowObject);
- FlowHandler flowHandler = getFlowHandler(targetFlowObject);
- // Synchronize execution of the target and the flow handler
- synchronized (rtProc)
+ // Synchronize execution on the target FlowObject
+ synchronized (procImpl)
{
try
{
@@ -97,13 +93,13 @@
sigHandler.throwEnterSignal();
// Create a Token that includes properties from the current Activity
- DelegatingToken delegatingToken = new DelegatingToken(token);
+ DelegatingToken delToken = new DelegatingToken(token);
// Execute the target FlowObject
- targetFlowObject.execute(delegatingToken);
+ targetFlowObject.execute(delToken);
// Transfer the token to the FlowHandler
- flowHandler.execute(tokenExecutor, delegatingToken);
+ targetFlowObject.executeFlowHandler(tokenExecutor, delToken);
}
catch (RuntimeException rte)
{
@@ -119,11 +115,6 @@
tokStatus = token.getTokenStatus();
procStatus = procImpl.getProcessStatus();
-
- // Make sure the next flow is different from the previous one
- ConnectingObject nextFlow = token.getFlow();
- if (tokStatus == TokenStatus.Started && nextFlow == flow)
- throw new IllegalStateException("Flow handler did not move the token: " + targetFlowObject);
}
}
catch (RuntimeException rte)
@@ -134,11 +125,12 @@
}
finally
{
-
- token.setTokenStatus(TokenStatus.Destroyed);
- // Notify the ExecutionManager when a token terminates
+ if (token.getTokenStatus() != TokenStatus.Suspended)
+ token.setTokenStatus(TokenStatus.Destroyed);
+
synchronized (procImpl)
{
+ // Notify the ExecutionManager when a token terminates
procImpl.notifyAll();
}
}
@@ -154,16 +146,6 @@
return handler;
}
- private FlowHandler getFlowHandler(FlowObject target)
- {
- HandlerSupport handlerSupport = getHandlerSupport(target);
- FlowHandler handler = handlerSupport.getFlowHandler();
- if (handler == null)
- throw new IllegalStateException("Cannot obtain flow handler from: " + target);
-
- return handler;
- }
-
private HandlerSupport getHandlerSupport(FlowObject fo)
{
if (fo instanceof HandlerSupport == false)
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ActivityImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -38,7 +38,6 @@
import org.jboss.bpm.model.Property;
import org.jboss.bpm.model.SequenceFlow;
import org.jboss.bpm.runtime.ExecutionContext;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.MutablePropertySupport;
import org.jboss.bpm.runtime.Token;
import org.jboss.bpm.runtime.TokenExecutor;
@@ -265,7 +264,8 @@
{
Property outProp = outputSet.getProperty(prop.getName());
if (outProp == null)
- throw new IllegalStateException("Cannot find outputSet property '" + prop.getName() + "' in Activity: " + getName());
+ throw new IllegalStateException("Cannot find outputSet property '" + prop.getName() + "' in Activity: "
+ + getName());
String name = outProp.getName();
String value = outProp.getValue();
@@ -287,20 +287,10 @@
// }
}
- public FlowHandler getFlowHandler()
+ @Override
+ protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
{
- FlowHandler handler = super.getFlowHandler();
- if (handler == null)
- {
- handler = new FlowHandler()
- {
- public void execute(TokenExecutor tokenExecutor, Token token)
- {
- tokenExecutor.move(token, outFlow);
- }
- };
- }
- return handler;
+ tokenExecutor.move(token, getOutFlow());
}
@Override
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ComplexGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ComplexGatewayImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ComplexGatewayImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -26,6 +26,8 @@
import org.jboss.bpm.NotImplementedException;
import org.jboss.bpm.model.ComplexGateway;
import org.jboss.bpm.model.Expression;
+import org.jboss.bpm.runtime.Token;
+import org.jboss.bpm.runtime.TokenExecutor;
/**
* A Complex Gateway handles situations that are not easily handled through the other types of Gateways. Complex
@@ -58,6 +60,12 @@
throw new NotImplementedException("JBPM-1637", "ComplexGateway outgoing condition");
}
+ @Override
+ protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
+ {
+ throw new NotImplementedException("JBPM-1637", "ComplexGateway outgoing condition");
+ }
+
public String toString()
{
return "ComplexGateway[" + getName() + "]";
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EndEventImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EndEventImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/EndEventImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -37,7 +37,6 @@
import org.jboss.bpm.model.SequenceFlow;
import org.jboss.bpm.model.Signal;
import org.jboss.bpm.model.EventDetail.EventDetailType;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.SignalHandler;
import org.jboss.bpm.runtime.Token;
import org.jboss.bpm.runtime.TokenExecutor;
@@ -104,21 +103,11 @@
}
}
- public FlowHandler getFlowHandler()
+ @Override
+ protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
{
- FlowHandler handler = super.getFlowHandler();
- if (handler == null)
- {
- handler = new FlowHandler()
- {
- public void execute(TokenExecutor tokenExecutor, Token token)
- {
- log.debug("End reached in: " + getName());
- tokenExecutor.destroy(token);
- }
- };
- }
- return handler;
+ log.debug("End reached in: " + getName());
+ tokenExecutor.destroy(token);
}
public SignalHandler getSignalHandler()
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -31,11 +31,10 @@
import org.jboss.bpm.model.ConnectingObject;
import org.jboss.bpm.model.ExclusiveGateway;
import org.jboss.bpm.model.Expression;
+import org.jboss.bpm.model.FlowObject;
import org.jboss.bpm.model.Gate;
-import org.jboss.bpm.model.GraphicalElement;
import org.jboss.bpm.model.SequenceFlow;
import org.jboss.bpm.model.SequenceFlow.ConditionType;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.Token;
import org.jboss.bpm.runtime.TokenExecutor;
@@ -85,41 +84,30 @@
}
@Override
- public FlowHandler getFlowHandler()
+ protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
{
- FlowHandler handler = super.getFlowHandler();
- if (handler == null)
+ FlowObject sourceRef = token.getFlow().getSourceRef();
+
+ // Schedule the first token that arrives
+ if (token == receivedTokens.get(0))
{
- handler = new FlowHandler()
- {
- public void execute(TokenExecutor tokenExecutor, Token token)
- {
- GraphicalElement sourceRef = token.getFlow().getSourceRef();
-
- // Schedule the first token that arrives
- if (token == receivedTokens.get(0))
- {
- log.debug("Propagate token comming from: " + sourceRef);
- Gate selectedGate = getSelectedGate(token);
- SequenceFlow outFlow = selectedGate.getOutgoingSequenceFlow();
- tokenExecutor.move(token, outFlow);
- }
- // Ignore all other tokens
- else
- {
- log.debug("Ignore token comming from: " + sourceRef);
- tokenExecutor.destroy(token);
- }
+ log.debug("Propagate token comming from: " + sourceRef);
+ Gate selectedGate = getSelectedGate(token);
+ SequenceFlow outFlow = selectedGate.getOutgoingSequenceFlow();
+ tokenExecutor.move(token, outFlow);
+ }
+ // Ignore all other tokens
+ else
+ {
+ log.debug("Ignore token comming from: " + sourceRef);
+ tokenExecutor.destroy(token);
+ }
- // Reset the gateway
- if (outstandingFlows.size() == 0)
- {
- reset();
- }
- }
- };
+ // Reset the gateway
+ if (outstandingFlows.size() == 0)
+ {
+ reset();
}
- return handler;
}
@Override
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/FlowObjectImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -44,6 +44,7 @@
import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.SignalHandler;
import org.jboss.bpm.runtime.Token;
+import org.jboss.bpm.runtime.TokenExecutor;
//$Id$
@@ -128,27 +129,25 @@
*/
public void execute(Token token)
{
- // Evaluate the Start time assignments
+ // Start Time Assignments
for (Assignment ass : getAssignments())
{
if (ass.getAssignTime() == AssignTime.Start)
processAssignment(ass, token);
}
- // Call the user provided execution handler
+ // Call the ExecutionHandler
ExecutionHandler exHandler = getExecutionHandler();
if (exHandler != null)
{
exHandler.execute(token);
}
-
- // Fall back to the default execution
else
{
defaultExecution(token);
}
- // Evaluate the End time assignments
+ // End Time Assignments
for (Assignment ass : getAssignments())
{
if (ass.getAssignTime() == AssignTime.End)
@@ -166,11 +165,39 @@
exContext.addAttachment(propName, result);
}
+ /**
+ * Execute the FlowHandler. Keep final, it should not be necessary to override this.
+ */
+ public final void executeFlowHandler(TokenExecutor tokenExecutor, Token token)
+ {
+ // Call the ExecutionHandler
+ FlowHandler flowHandler = getFlowHandler();
+ if (flowHandler != null)
+ {
+ flowHandler.execute(tokenExecutor, token);
+ }
+ else
+ {
+ defaultFlowHandler(tokenExecutor, token);
+ }
+ }
+
+ /**
+ * Overwrite to provide an implementation
+ */
protected void defaultExecution(Token token)
{
// noting to do
}
+ /**
+ * Overwrite to provide an implementation
+ */
+ protected abstract void defaultFlowHandler(TokenExecutor tokenExecutor, Token token);
+
+ /**
+ * Reset the FlowObject's state
+ */
public void reset()
{
// noting to do
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -38,7 +38,6 @@
import org.jboss.bpm.model.Expression.ExpressionLanguage;
import org.jboss.bpm.model.SequenceFlow.ConditionType;
import org.jboss.bpm.runtime.ExecutionContext;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.Token;
import org.jboss.bpm.runtime.TokenExecutor;
import org.jboss.bpm.runtime.Attachments.Key;
@@ -69,47 +68,36 @@
}
@Override
- public FlowHandler getFlowHandler()
+ protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
{
- FlowHandler handler = super.getFlowHandler();
- if (handler == null)
+ GraphicalElement sourceRef = token.getFlow().getSourceRef();
+ log.debug("Propagate token comming from: " + sourceRef);
+
+ // Get the applicable gates
+ List<Gate> applicableGates = getApplicableGates(token);
+ log.debug("applicableGates: " + applicableGates);
+
+ // Destroy the incomming token if there are
+ // more than one applicable gates
+ if (applicableGates.size() > 1)
+ tokenExecutor.destroy(token);
+
+ for (Gate aux : applicableGates)
{
- handler = new FlowHandler()
+ SequenceFlow outFlow = aux.getOutgoingSequenceFlow();
+ if (applicableGates.size() == 1)
{
- public void execute(TokenExecutor tokenExecutor, Token token)
- {
- GraphicalElement sourceRef = token.getFlow().getSourceRef();
- log.debug("Propagate token comming from: " + sourceRef);
-
- // Get the applicable gates
- List<Gate> applicableGates = getApplicableGates(token);
- log.debug("applicableGates: " + applicableGates);
-
- // Destroy the incomming token if there are
- // more than one applicable gates
- if (applicableGates.size() > 1)
- tokenExecutor.destroy(token);
-
- for (Gate aux : applicableGates)
- {
- SequenceFlow outFlow = aux.getOutgoingSequenceFlow();
- if (applicableGates.size() == 1)
- {
- tokenExecutor.move(token, outFlow);
- }
- else
- {
- Token outToken = token.copyToken();
- tokenExecutor.create(outToken, outFlow);
- tokenExecutor.start(outToken);
- }
- }
- }
- };
+ tokenExecutor.move(token, outFlow);
+ }
+ else
+ {
+ Token outToken = token.copyToken();
+ tokenExecutor.create(outToken, outFlow);
+ tokenExecutor.start(outToken);
+ }
}
- return handler;
}
-
+
// Get applicable gates which' condition evaluates to TRUE
// Fall back to the default gate if there is one
// Choke if there is no applicable gate
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/IntermediateEventImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -33,7 +33,6 @@
import org.jboss.bpm.model.IntermediateEvent;
import org.jboss.bpm.model.SequenceFlow;
import org.jboss.bpm.model.Signal;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.SignalHandler;
import org.jboss.bpm.runtime.Token;
import org.jboss.bpm.runtime.TokenExecutor;
@@ -88,20 +87,10 @@
triggers.add(eventDetail);
}
- public FlowHandler getFlowHandler()
+ @Override
+ protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
{
- FlowHandler handler = super.getFlowHandler();
- if (handler == null)
- {
- handler = new FlowHandler()
- {
- public void execute(TokenExecutor tokenExecutor, Token token)
- {
- tokenExecutor.move(token, getOutFlow());
- }
- };
- }
- return handler;
+ tokenExecutor.move(token, getOutFlow());
}
public SignalHandler getSignalHandler()
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -30,10 +30,8 @@
import org.apache.commons.logging.LogFactory;
import org.jboss.bpm.model.ConnectingObject;
import org.jboss.bpm.model.Gate;
-import org.jboss.bpm.model.Gateway;
import org.jboss.bpm.model.ParallelGateway;
import org.jboss.bpm.model.SequenceFlow;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.Token;
import org.jboss.bpm.runtime.TokenExecutor;
import org.jboss.bpm.runtime.internal.TokenImpl;
@@ -81,67 +79,55 @@
mergeTokens.add(token);
}
- public FlowHandler getFlowHandler()
+ @Override
+ protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
{
- FlowHandler handler = super.getFlowHandler();
- if (handler == null)
+ // In any case, the incomming token is not propagated
+ tokenExecutor.suspend(token);
+
+ // If the gateway has a single incomming flow the outgoing token is the incomming token
+ Token outToken = (getInFlows().size() == 1 ? token : null);
+
+ // The outgoing token is the merge of all incomming tokens
+ if (outToken == null)
{
- final Gateway gateway = this;
-
- handler = new FlowHandler()
+ // If there are no more outstanding flows
+ if (outstandingFlows.size() == 0)
{
- public void execute(TokenExecutor tokenExecutor, Token token)
- {
- // In any case, the incomming token is not propagated
- tokenExecutor.suspend(token);
-
- // If the gateway has a single incomming flow the outgoing token is the incomming token
- Token outToken = (getInFlows().size() == 1 ? token : null);
-
- // The outgoing token is the merge of all incomming tokens
- if (outToken == null)
- {
- // If there are no more outstanding flows
- if (outstandingFlows.size() == 0)
- {
- // Merge the tokens together and submit the merged tokens
- outToken = getMergedTokens();
- }
+ // Merge the tokens together and submit the merged tokens
+ outToken = getMergedTokens();
+ }
- // There are outstanding flows
- else if (outstandingFlows.size() > 0)
- {
- log.debug("Waiting for " + outstandingFlows + " in gateway: " + gateway);
- }
- }
-
- // Schedule the outgoing token
- if (outToken != null)
- {
- // Start a copy of the outgoing token for every gate
- for(Gate gate : getGates())
- {
- SequenceFlow outFlow = gate.getOutgoingSequenceFlow();
- Token copyToken = outToken.copyToken();
- tokenExecutor.create(copyToken, outFlow);
- tokenExecutor.start(copyToken);
- }
-
- // Destroy the received tokens
- for (Token auxToken : receivedTokens)
- {
- tokenExecutor.destroy(auxToken);
- }
-
- // Reset the gateway
- reset();
- }
- }
- };
+ // There are outstanding flows
+ else if (outstandingFlows.size() > 0)
+ {
+ log.debug("Waiting for " + outstandingFlows + " in gateway: " + this);
+ }
}
- return handler;
+
+ // Schedule the outgoing token
+ if (outToken != null)
+ {
+ // Start a copy of the outgoing token for every gate
+ for(Gate gate : getGates())
+ {
+ SequenceFlow outFlow = gate.getOutgoingSequenceFlow();
+ Token copyToken = outToken.copyToken();
+ tokenExecutor.create(copyToken, outFlow);
+ tokenExecutor.start(copyToken);
+ }
+
+ // Destroy the received tokens
+ for (Token auxToken : receivedTokens)
+ {
+ tokenExecutor.destroy(auxToken);
+ }
+
+ // Reset the gateway
+ reset();
+ }
}
-
+
@Override
public void reset()
{
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessBuilderImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessBuilderImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessBuilderImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -73,28 +73,28 @@
{
for(Message msg : addProc.getMessages())
{
- proc.addMessage(msg);
+ getProcessInternal().addMessage(msg);
}
for(FlowObject fo : addProc.getFlowObjects())
{
- proc.addFlowObject(fo);
+ getProcessInternal().addFlowObject(fo);
}
return this;
}
public Process getProcess()
{
- if (proc == null)
+ if (getProcessInternal() == null)
throw new IllegalStateException("No process has been added");
- proc.initialize();
- return proc;
+ getProcessInternal().initialize();
+ return getProcessInternal();
}
public Process getProcessForInclude()
{
- if (proc == null)
+ if (getProcessInternal() == null)
throw new IllegalStateException("No process has been added");
- return proc;
+ return getProcessInternal();
}
public ProcessBuilder addSequenceFlow(String targetName)
@@ -111,7 +111,7 @@
}
else if (flowObject instanceof Gateway)
{
- GatewayBuilder gwBuilder = new GatewayBuilderImpl(proc, flowObject);
+ GatewayBuilder gwBuilder = new GatewayBuilderImpl(getProcessInternal(), flowObject);
gwBuilder.addGate(targetName);
}
else
@@ -129,23 +129,23 @@
public EventBuilder addStartEvent(String name)
{
flowObject = addFlowObject(new StartEventImpl(name));
- return new EventBuilderImpl(proc, flowObject);
+ return new EventBuilderImpl(getProcessInternal(), flowObject);
}
public EventBuilder addEvent(String name)
{
- flowObject = (FlowObjectImpl)proc.getFlowObject(name);
+ flowObject = (FlowObjectImpl)getProcessInternal().getFlowObject(name);
if (flowObject == null)
flowObject = addFlowObject(new IntermediateEventImpl(name));
- return new EventBuilderImpl(proc, flowObject);
+ return new EventBuilderImpl(getProcessInternal(), flowObject);
}
public EventBuilder addEndEvent(String name)
{
- flowObject = (FlowObjectImpl)proc.getFlowObject(name);
+ flowObject = (FlowObjectImpl)getProcessInternal().getFlowObject(name);
if (flowObject == null)
flowObject = addFlowObject(new EndEventImpl(name));
- return new EventBuilderImpl(proc, flowObject);
+ return new EventBuilderImpl(getProcessInternal(), flowObject);
}
public TaskBuilder addTask(String name)
@@ -155,7 +155,7 @@
public TaskBuilder addTask(String name, TaskType type)
{
- flowObject = (FlowObjectImpl)proc.getFlowObject(name);
+ flowObject = (FlowObjectImpl)getProcessInternal().getFlowObject(name);
if (flowObject == null)
{
if (type == TaskType.None || type == null)
@@ -196,12 +196,12 @@
}
addFlowObject(flowObject);
}
- return new TaskBuilderImpl(proc, flowObject);
+ return new TaskBuilderImpl(getProcessInternal(), flowObject);
}
public GatewayBuilder addGateway(String name, GatewayType type)
{
- flowObject = (FlowObjectImpl)proc.getFlowObject(name);
+ flowObject = (FlowObjectImpl)getProcessInternal().getFlowObject(name);
if (flowObject == null)
{
if (GatewayType.Exclusive == type)
@@ -222,20 +222,20 @@
}
addFlowObject(flowObject);
}
- return new GatewayBuilderImpl(proc, flowObject);
+ return new GatewayBuilderImpl(getProcessInternal(), flowObject);
}
public MessageBuilder addMessage(String name)
{
MessageBuilder msgBuilder = new MessageBuilderImpl().newMessage(name);
- proc.addMessage(msgBuilder.getMessage());
+ getProcessInternal().addMessage(msgBuilder.getMessage());
return msgBuilder;
}
-
+
public ProcessBuilder addProperty(String name, String value)
{
Property prop = new PropertyImpl(name, new ExpressionImpl(value));
- proc.addProperty(prop);
+ getProcessInternal().addProperty(prop);
return this;
}
@@ -247,7 +247,7 @@
if (flowObject != null)
flowObject.addAssignment(assignment);
else
- proc.addAssignment(assignment);
+ getProcessInternal().addAssignment(assignment);
return this;
}
@@ -300,10 +300,16 @@
private FlowObjectImpl addFlowObject(FlowObjectImpl fo)
{
+ getProcessInternal().addFlowObject(fo);
+ return fo;
+ }
+
+ private ProcessImpl getProcessInternal()
+ {
if (proc == null)
- throw new IllegalStateException("No process has been added");
+ throw new IllegalStateException("No process available");
- proc.addFlowObject(fo);
- return fo;
+ return proc;
}
+
}
\ No newline at end of file
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -94,14 +94,14 @@
public List<Assignment> getAssignments()
{
- return Collections.unmodifiableList(assignments);
+ return Collections.unmodifiableList(assignments);
}
public void addAssignment(AssignmentImpl assignment)
{
this.assignments.add(assignment);
}
-
+
public List<InputSet> getInputSets()
{
throw new NotImplementedException("JBPM-1644", "Process InputSets");
@@ -286,8 +286,7 @@
// Throw timeout exception if it took too long
if (status != ProcessStatus.Cancelled && status != ProcessStatus.Completed && status != ProcessStatus.Aborted)
{
- ProcessTimeoutException rte = new ProcessTimeoutException("Process timeout after " + timeout + "ms for: "
- + getID());
+ RuntimeException rte = new ProcessTimeoutException("Process timeout after " + timeout + "ms for: " + getID());
log.error(rte);
log.error("Interrupt executor thread");
@@ -302,9 +301,10 @@
}
finally
{
- // Destroy the process
+ // Unregister the process
ProcessManager procManager = ProcessManager.locateProcessManager();
- procManager.unregisterProcess(this);
+ if (procManager.getProcessByID(getID()) != null)
+ procManager.unregisterProcess(this);
}
}
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ReceiveTaskImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ReceiveTaskImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ReceiveTaskImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -28,7 +28,6 @@
import org.apache.commons.logging.LogFactory;
import org.jboss.bpm.InvalidProcessException;
import org.jboss.bpm.NotImplementedException;
-import org.jboss.bpm.ProcessTimeoutException;
import org.jboss.bpm.client.MessageListener;
import org.jboss.bpm.model.Message;
import org.jboss.bpm.model.Process;
@@ -37,6 +36,7 @@
import org.jboss.bpm.model.Message.Implementation;
import org.jboss.bpm.runtime.ExecutionContext;
import org.jboss.bpm.runtime.Token;
+import org.jboss.bpm.runtime.TokenExecutor;
//$Id$
@@ -49,16 +49,16 @@
@SuppressWarnings("serial")
public class ReceiveTaskImpl extends TaskImpl implements ReceiveTask, MessageListener
{
- private static final int RECEIVE_TIMEOUT = 30000;
-
// provide logging
private static final Log log = LogFactory.getLog(ReceiveTaskImpl.class);
// A Web service is the default technology
private Implementation implementation = Implementation.WebService;
private Message messageRef;
- private List<Message> messages = new ArrayList<Message>();
+ private List<Message> receivedMessages = new ArrayList<Message>();
+ private List<Token> suspendedTokens = new ArrayList<Token>();
+
public ReceiveTaskImpl(String name)
{
super(name);
@@ -90,7 +90,7 @@
throw new NotImplementedException("JBPM-1648", "ReceiveTask Instantiate");
}
- public void catchMessage(Message message)
+ public synchronized void catchMessage(Message message)
{
String msgName = message.getName();
if (messageRef.getName().equals(msgName))
@@ -102,7 +102,19 @@
if (message.getProperty(name) == null)
throw new IllegalArgumentException("Received message does not contain expected property: " + name);
}
- messages.add(message);
+ receivedMessages.add(message);
+
+ if (suspendedTokens.size() == 0)
+ {
+ log.debug("Suspend message: " + message);
+ }
+ else
+ {
+ Token token = suspendedTokens.remove(0);
+ ExecutionContext exContext = token.getExecutionContext();
+ TokenExecutor tokenExecutor = exContext.removeAttachment(TokenExecutor.class);
+ tokenExecutor.activate(token.getTokenID());
+ }
}
else
{
@@ -111,41 +123,41 @@
}
@Override
- public void defaultExecution(Token token)
+ public synchronized void defaultExecution(Token token)
{
- // Wait for the message to arrive
- long now = System.currentTimeMillis();
- long until = now + RECEIVE_TIMEOUT;
- while (messages.size() == 0 && now < until)
+ if (receivedMessages.size() > 0)
{
- try
+ // Copy the expected properties from the
+ // received message to the execution context
+ Message msg = receivedMessages.get(0);
+ ExecutionContext exContext = token.getExecutionContext();
+ for (Property prop : messageRef.getProperties())
{
- Thread.sleep(500);
- now = System.currentTimeMillis();
+ String key = prop.getName();
+ String value = msg.getPropertyValue(key);
+ exContext.addAttachment(key, value);
}
- catch (InterruptedException ex)
- {
- log.error("ReceiveTask interrupted" + ex.toString());
- }
+
+ // Call default execute
+ super.defaultExecution(token);
}
+ }
- // Timeout if the message did not arrive
- if (messages.size() == 0)
- throw new ProcessTimeoutException("Message receive timeout in: " + this);
-
- // Copy the expected properties from the
- // received message to the execution context
- Message msg = messages.remove(0);
- ExecutionContext exContext = token.getExecutionContext();
- for (Property prop : messageRef.getProperties())
+ @Override
+ protected synchronized void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
+ {
+ if (receivedMessages.size() > 0)
{
- String key = prop.getName();
- String value = msg.getPropertyValue(key);
- exContext.addAttachment(key, value);
+ receivedMessages.remove(0);
+ tokenExecutor.move(token, getOutFlow());
}
-
- // Call default execute
- super.defaultExecution(token);
+ else
+ {
+ tokenExecutor.suspend(token);
+ ExecutionContext exContext = token.getExecutionContext();
+ exContext.addAttachment(TokenExecutor.class, tokenExecutor);
+ suspendedTokens.add(token);
+ }
}
@Override
@@ -155,7 +167,7 @@
if (messageRef == null)
throw new InvalidProcessException("A Message for the MessageRef attribute MUST be entered");
-
+
ProcessImpl procImpl = (ProcessImpl)proc;
procImpl.initializeMessageRef(messageRef);
}
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -39,7 +39,6 @@
import org.jboss.bpm.model.SignalEventDetail;
import org.jboss.bpm.model.StartEvent;
import org.jboss.bpm.model.Process.ProcessStatus;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.RuntimeProcess;
import org.jboss.bpm.runtime.SignalHandler;
import org.jboss.bpm.runtime.Token;
@@ -88,20 +87,10 @@
this.outFlow = flow;
}
- public FlowHandler getFlowHandler()
+ @Override
+ protected void defaultFlowHandler(TokenExecutor tokenExecutor, Token token)
{
- FlowHandler handler = super.getFlowHandler();
- if (handler == null)
- {
- handler = new FlowHandler()
- {
- public void execute(TokenExecutor tokenExecutor, Token token)
- {
- tokenExecutor.move(token, outFlow);
- }
- };
- }
- return handler;
+ tokenExecutor.move(token, getOutFlow());
}
public SignalHandler getSignalHandler()
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/TokenExecutorImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/TokenExecutorImpl.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/TokenExecutorImpl.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -31,7 +31,8 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import org.jboss.bpm.NotImplementedException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.jboss.bpm.client.internal.RunnableToken;
import org.jboss.bpm.model.ConnectingObject;
import org.jboss.bpm.model.Process;
@@ -53,6 +54,9 @@
*/
public class TokenExecutorImpl implements TokenExecutor
{
+ // provide logging
+ private static final Log log = LogFactory.getLog(TokenExecutorImpl.class);
+
public interface StartCallback
{
void start(Token token);
@@ -60,7 +64,7 @@
private RuntimeProcess rtProc;
private ExecutorService executor = Executors.newCachedThreadPool();
- private Map<String, RunnableToken> activeTokens = new HashMap<String, RunnableToken>();
+ private Map<String, RunnableToken> runnableTokens = new HashMap<String, RunnableToken>();
private StartCallback startCallback;
public TokenExecutorImpl(RuntimeProcess rtProc, StartCallback startCallback)
@@ -69,18 +73,18 @@
this.startCallback = startCallback;
}
- public Set<Token> getActiveTokens()
+ public Set<Token> getRunnableTokens()
{
- Set<Token> tokens = new HashSet<Token>();
- for (RunnableToken rt : activeTokens.values())
- tokens.add(rt.getToken());
+ Set<Token> tokenSet = new HashSet<Token>();
+ for (RunnableToken rt : runnableTokens.values())
+ tokenSet.add(rt.getToken());
- return Collections.unmodifiableSet(tokens);
+ return Collections.unmodifiableSet(tokenSet);
}
- public boolean hasActiveTokens()
+ public boolean hasRunnableTokens()
{
- return activeTokens.size() > 0;
+ return runnableTokens.size() > 0;
}
public void create(Token token, SequenceFlow initialFlow)
@@ -88,7 +92,7 @@
MutableToken mutableToken = (MutableToken)token;
mutableToken.setFlow(initialFlow);
RunnableToken rtToken = new RunnableToken(rtProc, mutableToken);
- activeTokens.put(token.getTokenID(), rtToken);
+ runnableTokens.put(token.getTokenID(), rtToken);
}
public void start(Token token)
@@ -97,6 +101,7 @@
if (proc.getProcessStatus() != ProcessStatus.Active)
throw new IllegalStateException("Cannot start token to process in state: " + proc.getProcessStatus());
+ log.debug("Start Token: " + token);
MutableToken mutableToken = (MutableToken)token;
mutableToken.setTokenStatus(TokenStatus.Started);
@@ -106,7 +111,7 @@
startCallback = null;
}
- RunnableToken rtToken = activeTokens.get(token.getTokenID());
+ RunnableToken rtToken = runnableTokens.get(token.getTokenID());
executor.submit(rtToken);
}
@@ -121,19 +126,22 @@
public void stop(Token token)
{
+ log.debug("Stop Token: " + token);
MutableToken mutableToken = (MutableToken)token;
mutableToken.setTokenStatus(TokenStatus.Stoped);
}
public void destroy(Token token)
{
+ log.debug("Destroy Token: " + token);
MutableToken mutableToken = (MutableToken)token;
mutableToken.setTokenStatus(TokenStatus.Destroyed);
- activeTokens.remove(token.getTokenID());
+ runnableTokens.remove(token.getTokenID());
}
public String suspend(Token token)
{
+ log.debug("Suspend Token: " + token);
MutableToken mutableToken = (MutableToken)token;
mutableToken.setTokenStatus(TokenStatus.Suspended);
return token.getTokenID();
@@ -141,6 +149,19 @@
public Token activate(String tokenID)
{
- throw new NotImplementedException("JBPM-1649", "Token Activate");
+ RunnableToken rtToken = runnableTokens.get(tokenID);
+ if (rtToken == null)
+ throw new IllegalStateException("Not a runnable token: " + tokenID);
+
+ Token token = rtToken.getToken();
+ if (token.getTokenStatus() != TokenStatus.Suspended)
+ throw new IllegalStateException("Activate token in state: " + token.getTokenStatus());
+
+ log.debug("Activate Token: " + token);
+ MutableToken mutableToken = (MutableToken)token;
+ mutableToken.setTokenStatus(TokenStatus.Started);
+
+ executor.submit(rtToken);
+ return token;
}
}
\ No newline at end of file
Deleted: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AbstractAirticketTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AbstractAirticketTest.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AbstractAirticketTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -1,162 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.samples.airticket;
-
-// $Id$
-
-import javax.management.ObjectName;
-
-import org.jboss.bpm.client.MessageListener;
-import org.jboss.bpm.client.MessageManager;
-import org.jboss.bpm.client.ObjectNameFactory;
-import org.jboss.bpm.model.Message;
-import org.jboss.bpm.model.MessageBuilder;
-import org.jboss.bpm.model.MessageBuilderFactory;
-import org.jboss.bpm.model.Process;
-import org.jboss.bpm.test.DefaultEngineTestCase;
-
-/**
- * Test the Airticket sample application
- *
- * @author thomas.diesler at jboss.com
- * @since 03-Jul-2008
- */
-public abstract class AbstractAirticketTest extends DefaultEngineTestCase
-{
- private MessageManager messageManager = MessageManager.locateMessageManager();
- private AirticketMessageListener msgListener;
-
- @Override
- public ObjectName getMessageListenerID()
- {
- return ObjectNameFactory.create("jboss.bpm:client=AirticketTest");
- }
-
- @Override
- public MessageListener getMessageListener()
- {
- msgListener = new AirticketMessageListener(getMessageListenerID());
- return msgListener;
- }
-
- @Override
- protected void tearDown() throws Exception
- {
- messageManager.removeMessageListener(getMessageListenerID());
- super.tearDown();
- }
-
- protected void runProcessInvalidData(Process proc)
- {
- messageManager.sendMessage(proc.getID(), AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getInvalidRequestMessage());
- proc.waitForEnd();
-
- Message confirmMessage = msgListener.getConfirmMessage();
- assertNotNull("Expected confirm message", confirmMessage);
- String price = confirmMessage.getPropertyValue(AirticketProcessBuilder.PROPERTY_PRICE);
- assertEquals("222", price);
- }
-
- protected void runProcessValidData(Process proc)
- {
- messageManager.sendMessage(proc.getID(), AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getValidRequestMessage());
- proc.waitForEnd();
-
- Message confirmMessage = msgListener.getConfirmMessage();
- assertNotNull("Expected confirm message", confirmMessage);
- String price = confirmMessage.getPropertyValue(AirticketProcessBuilder.PROPERTY_PRICE);
- assertEquals("222", price);
- }
-
- private Message getValidRequestMessage()
- {
- MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
- MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
- Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_REQ_DATA).
- addProperty(AirticketProcessBuilder.PROPERTY_NAME, "Kermit").
- addProperty(AirticketProcessBuilder.PROPERTY_FROM, "MUC").
- addProperty(AirticketProcessBuilder.PROPERTY_TO, "NYC").
- addProperty(AirticketProcessBuilder.PROPERTY_DATE, "25-Jul-2008").
- addProperty(AirticketProcessBuilder.PROPERTY_SEATS, "2").getMessage();
- return msg;
- }
-
- private Message getInvalidRequestMessage()
- {
- MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
- MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
- Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_REQ_DATA).
- addProperty(AirticketProcessBuilder.PROPERTY_NAME, "Kermit").
- addProperty(AirticketProcessBuilder.PROPERTY_FROM, "MUC").
- addProperty(AirticketProcessBuilder.PROPERTY_TO, "NYC").
- addProperty(AirticketProcessBuilder.PROPERTY_DATE, "25-Jul-2008").
- addProperty(AirticketProcessBuilder.PROPERTY_SEATS, "0"). // Invalid number of seats
- getMessage();
- return msg;
- }
-
- private Message getAcceptOfferMessage()
- {
- MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
- MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
- Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_ACCEPT_OFFER).
- addProperty(AirticketProcessBuilder.PROPERTY_CREDIT_CARD, "1234-1234-1234-1234").
- addProperty(AirticketProcessBuilder.PROPERTY_EXPIRE, "25-Jul-2012").
- addProperty(AirticketProcessBuilder.PROPERTY_IS_OFFER_ACCEPTED, "true").
- getMessage();
- return msg;
- }
-
- class AirticketMessageListener implements MessageListener
- {
- private ObjectName listenerID;
- private Message confirmMessage;
-
- private AirticketMessageListener(ObjectName listenerID)
- {
- this.listenerID = listenerID;
- }
-
- public Message getConfirmMessage()
- {
- return confirmMessage;
- }
-
- public void catchMessage(Message msg)
- {
- log.debug("catchMessage: " + msg);
- ObjectName procID = msg.getFrom().getProcess().getID();
- MessageManager mm = MessageManager.locateMessageManager();
- if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_INVALID_DATA))
- mm.sendMessage(procID, AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getValidRequestMessage());
- else if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_OFFER))
- mm.sendMessage(procID, AirticketProcessBuilder.TASK_RECEIVE_ORDER, getAcceptOfferMessage());
- else if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_CONFIRM))
- confirmMessage = msg;
- }
-
- public ObjectName getID()
- {
- return listenerID;
- }
- }
-}
\ No newline at end of file
Modified: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketAPIDescriptorTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketAPIDescriptorTest.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketAPIDescriptorTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -23,6 +23,7 @@
// $Id$
+import java.io.IOException;
import java.net.URL;
import org.jboss.bpm.client.ProcessManager;
@@ -34,23 +35,13 @@
* @author thomas.diesler at jboss.com
* @since 03-Jul-2008
*/
-public class AirticketAPIDescriptorTest extends AbstractAirticketTest
+public class AirticketAPIDescriptorTest extends AirticketTest
{
- public void testValidData() throws Exception
+ @Override
+ protected Process getProcess() throws IOException
{
URL expURL = getResourceURL("samples/airticket/airticket-api10.xml");
ProcessManager pm = ProcessManager.locateProcessManager();
- Process proc = pm.createProcess(expURL);
- proc.startProcess();
- runProcessValidData(proc);
+ return pm.createProcess(expURL);
}
-
- public void testInvalidData() throws Exception
- {
- URL expURL = getResourceURL("samples/airticket/airticket-api10.xml");
- ProcessManager pm = ProcessManager.locateProcessManager();
- Process proc = pm.createProcess(expURL);
- proc.startProcess();
- runProcessInvalidData(proc);
- }
}
\ No newline at end of file
Deleted: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -1,51 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.samples.airticket;
-
-// $Id$
-
-import org.jboss.bpm.model.Process;
-
-/**
- * Test the Airticket sample application
- *
- * @author thomas.diesler at jboss.com
- * @since 03-Jul-2008
- */
-public class AirticketProcBuilderTest extends AbstractAirticketTest
-{
- public void testValidData() throws Exception
- {
- AirticketProcessBuilder builder = new AirticketProcessBuilder(getMessageListenerID());
- Process proc = builder.buildProcess();
- proc.startProcess();
- runProcessValidData(proc);
- }
-
- public void testInvalidData() throws Exception
- {
- AirticketProcessBuilder builder = new AirticketProcessBuilder(getMessageListenerID());
- Process proc = builder.buildProcess();
- proc.startProcess();
- runProcessInvalidData(proc);
- }
-}
\ No newline at end of file
Modified: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketSTPDescriptorTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketSTPDescriptorTest.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketSTPDescriptorTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -23,10 +23,9 @@
// $Id$
-import java.io.StringWriter;
+import java.io.IOException;
import java.net.URL;
-import org.jboss.bpm.client.DialectHandler;
import org.jboss.bpm.client.ProcessManager;
import org.jboss.bpm.model.Process;
@@ -36,30 +35,13 @@
* @author thomas.diesler at jboss.com
* @since 03-Jul-2008
*/
-public class AirticketSTPDescriptorTest extends AbstractAirticketTest
+public class AirticketSTPDescriptorTest extends AirticketTest
{
- public void testValidData() throws Exception
+ @Override
+ protected Process getProcess() throws IOException
{
URL expURL = getResourceURL("samples/airticket/airticket-stp-api10.xml");
ProcessManager pm = ProcessManager.locateProcessManager();
- Process proc = pm.createProcess(expURL);
-
- // Debug the effective process
- StringWriter strwr = new StringWriter();
- DialectHandler dhapi = pm.getDialectHandler(DialectHandler.DEFAULT_NAMESPACE_URI);
- dhapi.marshallProcess(proc, strwr);
- //System.out.println(strwr);
-
- proc.startProcess();
- runProcessValidData(proc);
+ return pm.createProcess(expURL);
}
-
- public void testInvalidData() throws Exception
- {
- URL expURL = getResourceURL("samples/airticket/airticket-stp-api10.xml");
- ProcessManager pm = ProcessManager.locateProcessManager();
- Process proc = pm.createProcess(expURL);
- proc.startProcess();
- runProcessInvalidData(proc);
- }
}
\ No newline at end of file
Copied: jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketTest.java (from rev 1908, jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketProcBuilderTest.java)
===================================================================
--- jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketTest.java (rev 0)
+++ jbossbpm/spec/trunk/modules/samples/airticket/server/src/test/java/org/jboss/bpm/samples/airticket/AirticketTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -0,0 +1,177 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.samples.airticket;
+
+// $Id$
+
+import java.io.IOException;
+
+import javax.management.ObjectName;
+
+import org.jboss.bpm.client.MessageListener;
+import org.jboss.bpm.client.MessageManager;
+import org.jboss.bpm.client.ObjectNameFactory;
+import org.jboss.bpm.model.Message;
+import org.jboss.bpm.model.MessageBuilder;
+import org.jboss.bpm.model.MessageBuilderFactory;
+import org.jboss.bpm.model.Process;
+import org.jboss.bpm.test.DefaultEngineTestCase;
+
+/**
+ * Test the Airticket sample application
+ *
+ * @author thomas.diesler at jboss.com
+ * @since 03-Jul-2008
+ */
+public class AirticketTest extends DefaultEngineTestCase
+{
+ private MessageManager messageManager = MessageManager.locateMessageManager();
+ private AirticketMessageListener msgListener;
+
+ public void testValidData() throws Exception
+ {
+ Process proc = getProcess();
+ proc.startProcess();
+
+ messageManager.sendMessage(proc.getID(), AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getValidRequestMessage());
+ proc.waitForEnd();
+
+ Message confirmMessage = msgListener.getConfirmMessage();
+ assertNotNull("Expected confirm message", confirmMessage);
+ String price = confirmMessage.getPropertyValue(AirticketProcessBuilder.PROPERTY_PRICE);
+ assertEquals("222", price);
+ }
+
+ public void testInvalidData() throws Exception
+ {
+ Process proc = getProcess();
+ proc.startProcess();
+
+ messageManager.sendMessage(proc.getID(), AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getInvalidRequestMessage());
+ proc.waitForEnd();
+
+ Message confirmMessage = msgListener.getConfirmMessage();
+ assertNotNull("Expected confirm message", confirmMessage);
+ String price = confirmMessage.getPropertyValue(AirticketProcessBuilder.PROPERTY_PRICE);
+ assertEquals("222", price);
+ }
+
+ @Override
+ public ObjectName getMessageListenerID()
+ {
+ return ObjectNameFactory.create("jboss.bpm:client=AirticketTest");
+ }
+
+ @Override
+ public MessageListener getMessageListener()
+ {
+ msgListener = new AirticketMessageListener(getMessageListenerID());
+ return msgListener;
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ messageManager.removeMessageListener(getMessageListenerID());
+ super.tearDown();
+ }
+
+ private Message getValidRequestMessage()
+ {
+ MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
+ MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
+ Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_REQ_DATA).
+ addProperty(AirticketProcessBuilder.PROPERTY_NAME, "Kermit").
+ addProperty(AirticketProcessBuilder.PROPERTY_FROM, "MUC").
+ addProperty(AirticketProcessBuilder.PROPERTY_TO, "NYC").
+ addProperty(AirticketProcessBuilder.PROPERTY_DATE, "25-Jul-2008").
+ addProperty(AirticketProcessBuilder.PROPERTY_SEATS, "2").getMessage();
+ return msg;
+ }
+
+ private Message getInvalidRequestMessage()
+ {
+ MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
+ MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
+ Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_REQ_DATA).
+ addProperty(AirticketProcessBuilder.PROPERTY_NAME, "Kermit").
+ addProperty(AirticketProcessBuilder.PROPERTY_FROM, "MUC").
+ addProperty(AirticketProcessBuilder.PROPERTY_TO, "NYC").
+ addProperty(AirticketProcessBuilder.PROPERTY_DATE, "25-Jul-2008").
+ addProperty(AirticketProcessBuilder.PROPERTY_SEATS, "0"). // Invalid number of seats
+ getMessage();
+ return msg;
+ }
+
+ private Message getAcceptOfferMessage()
+ {
+ MessageBuilderFactory msgFactory = MessageBuilderFactory.newInstance();
+ MessageBuilder msgBuilder = msgFactory.newMessageBuilder();
+ Message msg = msgBuilder.newMessage(AirticketProcessBuilder.MESSAGE_ACCEPT_OFFER).
+ addProperty(AirticketProcessBuilder.PROPERTY_CREDIT_CARD, "1234-1234-1234-1234").
+ addProperty(AirticketProcessBuilder.PROPERTY_EXPIRE, "25-Jul-2012").
+ addProperty(AirticketProcessBuilder.PROPERTY_IS_OFFER_ACCEPTED, "true").
+ getMessage();
+ return msg;
+ }
+
+
+ protected Process getProcess() throws IOException
+ {
+ AirticketProcessBuilder builder = new AirticketProcessBuilder(getMessageListenerID());
+ return builder.buildProcess();
+ }
+
+ class AirticketMessageListener implements MessageListener
+ {
+ private ObjectName listenerID;
+ private Message confirmMessage;
+
+ private AirticketMessageListener(ObjectName listenerID)
+ {
+ this.listenerID = listenerID;
+ }
+
+ public Message getConfirmMessage()
+ {
+ return confirmMessage;
+ }
+
+ public void catchMessage(Message msg)
+ {
+ log.debug("catchMessage: " + msg);
+ ObjectName procID = msg.getFrom().getProcess().getID();
+ MessageManager mm = MessageManager.locateMessageManager();
+ if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_INVALID_DATA))
+ mm.sendMessage(procID, AirticketProcessBuilder.TASK_RECEIVE_REQUEST, getValidRequestMessage());
+ else if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_OFFER))
+ mm.sendMessage(procID, AirticketProcessBuilder.TASK_RECEIVE_ORDER, getAcceptOfferMessage());
+ else if (msg.getName().equals(AirticketProcessBuilder.MESSAGE_CONFIRM))
+ confirmMessage = msg;
+ }
+
+ public ObjectName getID()
+ {
+ return listenerID;
+ }
+ }
+}
\ No newline at end of file
Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveGatewaySplitTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveGatewaySplitTest.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveGatewaySplitTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -75,7 +75,7 @@
public Process getProcess() throws IOException
{
ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
- procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Split");
+ procBuilder.addProcess("InclusiveGatewaySplitTest").addStartEvent("Start").addSequenceFlow("Split");
GatewayBuilder gatewayBuilder = procBuilder.addGateway("Split", GatewayType.Inclusive);
gatewayBuilder.addConditionalGate("EndA", ExpressionLanguage.MVEL, "foo < 10");
gatewayBuilder.addConditionalGate("EndB", ExpressionLanguage.MVEL, "foo < 20");
Copied: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/ReceiveTaskTest.java (from rev 1908, jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java)
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/ReceiveTaskTest.java (rev 0)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/ReceiveTaskTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -0,0 +1,153 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.cts.task;
+
+// $Id$
+
+import org.jboss.bpm.InvalidProcessException;
+import org.jboss.bpm.client.MessageManager;
+import org.jboss.bpm.client.ProcessManager;
+import org.jboss.bpm.client.SignalListener;
+import org.jboss.bpm.client.SignalManager;
+import org.jboss.bpm.model.EventBuilder;
+import org.jboss.bpm.model.Message;
+import org.jboss.bpm.model.MessageBuilder;
+import org.jboss.bpm.model.MessageBuilderFactory;
+import org.jboss.bpm.model.Process;
+import org.jboss.bpm.model.ProcessBuilder;
+import org.jboss.bpm.model.ProcessBuilderFactory;
+import org.jboss.bpm.model.Signal;
+import org.jboss.bpm.model.EventDetail.EventDetailType;
+import org.jboss.bpm.model.Signal.SignalType;
+import org.jboss.bpm.model.Task.TaskType;
+import org.jboss.bpm.test.DefaultEngineTestCase;
+
+/**
+ * Test process messages
+ *
+ * @author thomas.diesler at jboss.com
+ * @since 03-Jul-2008
+ */
+public class ReceiveTaskTest extends DefaultEngineTestCase
+{
+ public void testReceiveTaskWithNoMessage() throws Exception
+ {
+ ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+ procBuilder.addProcess("ReceiveTaskTest").addStartEvent("Start").addSequenceFlow("TaskA");
+ procBuilder.addTask("TaskA", TaskType.Receive).addSequenceFlow("End").addEndEvent("End");
+ try
+ {
+ procBuilder.getProcess();
+ fail("A Message for the MessageRef attribute MUST be entered");
+ }
+ catch (InvalidProcessException ex)
+ {
+ // expected
+ }
+ }
+
+ public void testUnregisteredProcess() throws Exception
+ {
+ Process proc = getProcess();
+
+ MessageManager msgManager = MessageManager.locateMessageManager();
+ try
+ {
+ msgManager.sendMessage(proc.getID(), "TaskA", getMessage());
+ fail("Send to an unregistered process is expected to fail");
+ }
+ catch (RuntimeException ex)
+ {
+ // expected
+ }
+ }
+
+ public void testSuspendedMessage() throws Exception
+ {
+ Process proc = getProcess();
+ ProcessManager procManager = ProcessManager.locateProcessManager();
+ procManager.registerProcess(proc);
+
+ // Send the message before the process is started
+ MessageManager msgManager = MessageManager.locateMessageManager();
+ msgManager.sendMessage(proc.getID(), "TaskA", getMessage());
+
+ proc.startProcess();
+ proc.waitForEnd();
+
+ Message endMsg = getMessages().get(0);
+ assertNotNull("End message expected", endMsg);
+ assertEquals("bar", endMsg.getPropertyValue("foo"));
+ }
+
+ public void testSuspendedToken() throws Exception
+ {
+ final Process proc = getProcess();
+ SignalListener signalListener = new SignalListener()
+ {
+ private boolean sendMessage = true;
+ public void catchSignal(Signal signal)
+ {
+ // Send the message after the process reached the receive task
+ if (signal.getSignalType() == SignalType.SYSTEM_TASK_EXIT)
+ {
+ if (sendMessage == true)
+ {
+ sendMessage = false;
+ MessageManager msgManager = MessageManager.locateMessageManager();
+ msgManager.sendMessage(proc.getID(), "TaskA", getMessage());
+ }
+ }
+ }
+ };
+ SignalManager sigManager = SignalManager.locateSignalManager();
+ sigManager.addSignalListener(proc.getName(), signalListener);
+
+ proc.startProcess();
+ proc.waitForEnd();
+
+ Message endMsg = getMessages().get(0);
+ assertNotNull("End message expected", endMsg);
+ assertEquals("bar", endMsg.getPropertyValue("foo"));
+ }
+
+ private Message getMessage()
+ {
+ MessageBuilder procBuilder = MessageBuilderFactory.newInstance().newMessageBuilder();
+ Message msg = procBuilder.newMessage("ReceiveTaskMessage").addProperty("foo", "bar", true).getMessage();
+ return msg;
+ }
+
+ private Process getProcess()
+ {
+ ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+ MessageBuilder msgBuilder = procBuilder.addProcess("ReceiveTaskTest").addMessage("ReceiveTaskMessage");
+ msgBuilder.addProperty("foo", null, true);
+ msgBuilder = procBuilder.addMessage("EndEventMessage");
+ msgBuilder.addToRef(getMessageListenerID()).addProperty("foo", null, true);
+ procBuilder.addStartEvent("Start").addSequenceFlow("TaskA");
+ procBuilder.addTask("TaskA", TaskType.Receive).addMessageRef("ReceiveTaskMessage");
+ EventBuilder eventBuilder = procBuilder.addSequenceFlow("End").addEndEvent("End");
+ eventBuilder.addEventDetail(EventDetailType.Message).addMessageRef("EndEventMessage");
+ return procBuilder.getProcess();
+ }
+}
Copied: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/SendTaskTest.java (from rev 1908, jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java)
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/SendTaskTest.java (rev 0)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/SendTaskTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -0,0 +1,55 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.cts.task;
+
+// $Id$
+
+import org.jboss.bpm.InvalidProcessException;
+import org.jboss.bpm.model.ProcessBuilder;
+import org.jboss.bpm.model.ProcessBuilderFactory;
+import org.jboss.bpm.model.Task.TaskType;
+import org.jboss.bpm.test.DefaultEngineTestCase;
+
+/**
+ * Test process messages
+ *
+ * @author thomas.diesler at jboss.com
+ * @since 03-Jul-2008
+ */
+public class SendTaskTest extends DefaultEngineTestCase
+{
+ public void testSendTaskWithNoMessage() throws Exception
+ {
+ ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+ procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("TaskA");
+ procBuilder.addTask("TaskA", TaskType.Send).addSequenceFlow("End").addEndEvent("End");
+ try
+ {
+ procBuilder.getProcess();
+ fail("A Message for the MessageRef attribute MUST be entered");
+ }
+ catch (InvalidProcessException ex)
+ {
+ // expected
+ }
+ }
+}
Deleted: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/task/TaskMessageTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -1,71 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.cts.task;
-
-// $Id$
-
-import org.jboss.bpm.InvalidProcessException;
-import org.jboss.bpm.model.ProcessBuilder;
-import org.jboss.bpm.model.ProcessBuilderFactory;
-import org.jboss.bpm.model.Task.TaskType;
-import org.jboss.bpm.test.DefaultEngineTestCase;
-
-/**
- * Test process messages
- *
- * @author thomas.diesler at jboss.com
- * @since 03-Jul-2008
- */
-public class TaskMessageTest extends DefaultEngineTestCase
-{
- public void testReceiveTaskWithNoMessage() throws Exception
- {
- ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
- procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("A");
- procBuilder.addTask("A", TaskType.Receive).addSequenceFlow("End").addEndEvent("End");
- try
- {
- procBuilder.getProcess();
- fail("A Message for the MessageRef attribute MUST be entered");
- }
- catch (InvalidProcessException ex)
- {
- // expected
- }
- }
-
- public void testSendTaskWithNoMessage() throws Exception
- {
- ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
- procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("A");
- procBuilder.addTask("A", TaskType.Send).addSequenceFlow("End").addEndEvent("End");
- try
- {
- procBuilder.getProcess();
- fail("A Message for the MessageRef attribute MUST be entered");
- }
- catch (InvalidProcessException ex)
- {
- // expected
- }
- }
-}
Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/multichoice/MultiChoiceTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/multichoice/MultiChoiceTest.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/multichoice/MultiChoiceTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -75,7 +75,7 @@
public Process getProcess() throws IOException
{
ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
- procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Split");
+ procBuilder.addProcess("MultiChoiceTest").addStartEvent("Start").addSequenceFlow("Split");
GatewayBuilder gatewayBuilder = procBuilder.addGateway("Split", GatewayType.Inclusive);
gatewayBuilder.addConditionalGate("EndA", ExpressionLanguage.MVEL, "foo < 10");
gatewayBuilder.addConditionalGate("EndB", ExpressionLanguage.MVEL, "foo < 20");
Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/synchronization/SynchronizationTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/synchronization/SynchronizationTest.java 2008-08-17 10:16:05 UTC (rev 1910)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/pattern/control/synchronization/SynchronizationTest.java 2008-08-17 16:18:36 UTC (rev 1911)
@@ -70,7 +70,7 @@
assertEquals("TaskA:TaskB", TaskC.taskValue);
}
- public void _testSynchronizationTimeout() throws Exception
+ public void testSynchronizationTimeout() throws Exception
{
Process proc = getProcess();
proc.startProcess();
@@ -91,7 +91,7 @@
}
}
- public void _testSynchronizationInvalidToken() throws Exception
+ public void testSynchronizationInvalidToken() throws Exception
{
Process proc = getProcess();
proc.startProcess();
More information about the jbpm-commits
mailing list