[jbpm-commits] JBoss JBPM SVN: r1863 - jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal.
do-not-reply at jboss.org
do-not-reply at jboss.org
Mon Aug 11 06:47:14 EDT 2008
Author: thomas.diesler at jboss.com
Date: 2008-08-11 06:47:13 -0400 (Mon, 11 Aug 2008)
New Revision: 1863
Modified:
jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java
jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/GatewayImpl.java
jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/SequenceFlowImpl.java
Log:
WIP
Modified: jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java
===================================================================
--- jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java 2008-08-11 10:31:46 UTC (rev 1862)
+++ jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/ExclusiveGatewayImpl.java 2008-08-11 10:47:13 UTC (rev 1863)
@@ -26,11 +26,12 @@
import java.util.HashMap;
import java.util.Map;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.jboss.bpm.model.ConnectingObject;
import org.jboss.bpm.model.ExclusiveGateway;
import org.jboss.bpm.model.Expression;
import org.jboss.bpm.model.Gate;
-import org.jboss.bpm.model.Gateway;
import org.jboss.bpm.model.SequenceFlow;
import org.jboss.bpm.model.Expression.ExpressionLanguage;
import org.jboss.bpm.model.SequenceFlow.ConditionType;
@@ -51,6 +52,9 @@
@SuppressWarnings("serial")
public abstract class ExclusiveGatewayImpl extends GatewayImpl implements ExclusiveGateway
{
+ // provide logging
+ private static final Log log = LogFactory.getLog(ExclusiveGatewayImpl.class);
+
public ExclusiveGatewayImpl(String name)
{
super(name);
@@ -70,71 +74,95 @@
@Override
public FlowHandler getFlowHandler()
{
- final Gateway gateway = this;
FlowHandler handler = super.getFlowHandler();
- if (handler == null && getGates().size() > 1)
+ if (handler == null)
{
handler = new FlowHandler()
{
public void execute(FlowScheduler scheduler, Token token)
{
- Gate selectedGate = null;
- for (Gate auxGate : getGates())
+ // Schedule the first token that arrives
+ if (receivedTokens.size() == 1)
{
- SequenceFlow seqFlow = auxGate.getOutgoingSequenceFlow();
- if (seqFlow.getConditionType() == ConditionType.Expression)
- {
- Expression expr = seqFlow.getConditionExpression();
- if (expr.getExpressionLanguage() == ExpressionLanguage.MVEL)
- {
- String mvel = expr.getExpressionBody();
- ExecutionContext exContext = token.getExecutionContext();
- Map<String, Object> vars = new HashMap<String, Object>();
- for (Key key : exContext.getAttachmentKeys())
- {
- String name = key.getNamePart();
- Object value = exContext.getAttachment(name);
- vars.put(name, value);
- }
- Boolean result = (Boolean)MVEL.eval(mvel, vars);
- if (result == true)
- {
- selectedGate = auxGate;
- break;
- }
- }
- else
- {
- throw new IllegalStateException("Unsupported expression language: " + expr.getExpressionLanguage());
- }
- }
+ Gate selectedGate = getSelectedGate(token);
+ SequenceFlow outFlow = selectedGate.getOutgoingSequenceFlow();
+ scheduler.scheduleTuple(outFlow, token);
}
-
- // Fallback to the default gate if there is one
- if (selectedGate == null)
+ // Ignore all other tokens
+ else
{
- for (Gate auxGate : getGates())
- {
- SequenceFlow seqFlow = auxGate.getOutgoingSequenceFlow();
- if (seqFlow.getConditionType() == ConditionType.Default)
- {
- selectedGate = auxGate;
- break;
- }
- }
+ log.debug("Ignore token: " + token);
}
- if (selectedGate == null)
- throw new IllegalStateException("Cannot select applicable gate in: " + gateway);
-
- SequenceFlow outFlow = selectedGate.getOutgoingSequenceFlow();
- scheduler.scheduleTuple(outFlow, token);
+ // Reset the gateway
+ if (expectedFlows.size() == 0)
+ {
+ expectedFlows.addAll(inFlows);
+ receivedTokens.clear();
+ }
}
};
}
return handler;
}
+ // Get a single selected gate which' condition evaluates to TRUE
+ // Fall back to the default gate if there is one
+ // Choke if there is no selected gate
+ private Gate getSelectedGate(Token token)
+ {
+ Gate selectedGate = null;
+ for (Gate auxGate : getGates())
+ {
+ SequenceFlow seqFlow = auxGate.getOutgoingSequenceFlow();
+ if (seqFlow.getConditionType() == ConditionType.Expression)
+ {
+ Expression expr = seqFlow.getConditionExpression();
+ if (expr.getExpressionLanguage() == ExpressionLanguage.MVEL)
+ {
+ String mvel = expr.getExpressionBody();
+ ExecutionContext exContext = token.getExecutionContext();
+ Map<String, Object> vars = new HashMap<String, Object>();
+ for (Key key : exContext.getAttachmentKeys())
+ {
+ String name = key.getNamePart();
+ Object value = exContext.getAttachment(name);
+ vars.put(name, value);
+ }
+ Boolean result = (Boolean)MVEL.eval(mvel, vars);
+ if (result == true)
+ {
+ selectedGate = auxGate;
+ break;
+ }
+ }
+ else
+ {
+ throw new IllegalStateException("Unsupported expression language: " + expr.getExpressionLanguage());
+ }
+ }
+ }
+
+ // Fallback to the default gate if there is one
+ if (selectedGate == null)
+ {
+ for (Gate auxGate : getGates())
+ {
+ SequenceFlow seqFlow = auxGate.getOutgoingSequenceFlow();
+ if (seqFlow.getConditionType() == ConditionType.Default)
+ {
+ selectedGate = auxGate;
+ break;
+ }
+ }
+ }
+
+ if (selectedGate == null)
+ throw new IllegalStateException("Cannot select applicable gate in: " + this);
+
+ return selectedGate;
+ }
+
public String toString()
{
return "ExclusiveGateway[" + getName() + "]";
Modified: jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/GatewayImpl.java
===================================================================
--- jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/GatewayImpl.java 2008-08-11 10:31:46 UTC (rev 1862)
+++ jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/GatewayImpl.java 2008-08-11 10:47:13 UTC (rev 1863)
@@ -31,15 +31,14 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.jboss.bpm.NotImplementedException;
import org.jboss.bpm.model.ConnectingObject;
import org.jboss.bpm.model.Gate;
import org.jboss.bpm.model.Gateway;
+import org.jboss.bpm.model.Process;
import org.jboss.bpm.model.SequenceFlow;
import org.jboss.bpm.model.Signal;
import org.jboss.bpm.model.SequenceFlow.ConditionType;
import org.jboss.bpm.runtime.ExecutionHandler;
-import org.jboss.bpm.runtime.FlowHandler;
import org.jboss.bpm.runtime.SignalHandler;
import org.jboss.bpm.runtime.Token;
@@ -56,8 +55,14 @@
// provide logging
private static final Log log = LogFactory.getLog(GatewayImpl.class);
+ // The list of incomming flows
protected List<ConnectingObject> inFlows = new ArrayList<ConnectingObject>();
+ // The list of outgoing gates
private Map<String, Gate> gates = new LinkedHashMap<String, Gate>();
+ // The list of flows from which a token is expected
+ protected List<ConnectingObject> expectedFlows;
+ // The list of received tokens
+ protected List<Token> receivedTokens;
public GatewayImpl(String name)
{
@@ -109,7 +114,27 @@
@Override
public void execute(Token token)
{
- throw new NotImplementedException("Overwrite to implemente gateway behaviour");
+ // Initialize the gateway
+ if (expectedFlows == null)
+ {
+ expectedFlows = new ArrayList<ConnectingObject>(inFlows);
+ receivedTokens = new ArrayList<Token>();
+ }
+
+ // Check that token from flow is valid
+ ConnectingObject flow = token.getFlow();
+ if (expectedFlows.contains(flow) == false)
+ throw new IllegalStateException("Unexpected token from: " + flow);
+
+ // Call execution handler
+ ExecutionHandler exHandler = getExecutionHandler();
+ exHandler.execute(token);
+
+ // Remove the flow from the expected list
+ expectedFlows.remove(flow);
+
+ // Store the received token for processing in the FlowHandler
+ receivedTokens.add(token);
}
public ExecutionHandler getExecutionHandler()
@@ -128,11 +153,6 @@
return handler;
}
- public FlowHandler getFlowHandler()
- {
- throw new NotImplementedException("Overwrite to implemente gateway behaviour");
- }
-
public SignalHandler getSignalHandler()
{
SignalHandler handler = super.getSignalHandler();
Modified: jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/SequenceFlowImpl.java
===================================================================
--- jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/SequenceFlowImpl.java 2008-08-11 10:31:46 UTC (rev 1862)
+++ jbossbpm/spec/branches/tdiesler/modules/ri/src/main/java/org/jboss/bpm/model/internal/SequenceFlowImpl.java 2008-08-11 10:47:13 UTC (rev 1863)
@@ -24,6 +24,8 @@
//$Id$
import org.jboss.bpm.model.Expression;
+import org.jboss.bpm.model.GraphicalElement;
+import org.jboss.bpm.model.NameSupport;
import org.jboss.bpm.model.SequenceFlow;
/**
@@ -60,4 +62,13 @@
{
return conditionExpression;
}
+
+ public String toString()
+ {
+ GraphicalElement sourceRef = getSourceRef();
+ GraphicalElement targetRef = getTargetRef();
+ String srcName = (sourceRef instanceof NameSupport ? ((NameSupport)sourceRef).getName() : sourceRef.getID().getCanonicalName());
+ String tarName = (targetRef instanceof NameSupport ? ((NameSupport)targetRef).getName() : targetRef.getID().getCanonicalName());
+ return "SequenceFlow[" + srcName + "->" + tarName + "]";
+ }
}
\ No newline at end of file
More information about the jbpm-commits
mailing list