[jbpm-commits] JBoss JBPM SVN: r1883 - in jbossbpm/spec/trunk/modules: testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Wed Aug 13 11:45:31 EDT 2008
Author: thomas.diesler at jboss.com
Date: 2008-08-13 11:45:31 -0400 (Wed, 13 Aug 2008)
New Revision: 1883
Modified:
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/GateImpl.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/ParallelGatewayImpl.java
jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java
jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveMergeTest.java
jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveSplitTest.java
Log:
InclusiveGateway ok
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/GateImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/GateImpl.java 2008-08-13 15:07:57 UTC (rev 1882)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/GateImpl.java 2008-08-13 15:45:31 UTC (rev 1883)
@@ -63,4 +63,10 @@
{
throw new NotImplementedException();
}
+
+ public String toString()
+ {
+ String flowStr = seqFlow.toString();
+ return "Gate" + flowStr.substring(flowStr.indexOf('['));
+ }
}
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-13 15:07:57 UTC (rev 1882)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/InclusiveGatewayImpl.java 2008-08-13 15:45:31 UTC (rev 1883)
@@ -23,14 +23,31 @@
//$Id$
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.bpm.model.Expression;
+import org.jboss.bpm.model.Gate;
+import org.jboss.bpm.model.GraphicalElement;
import org.jboss.bpm.model.InclusiveGateway;
+import org.jboss.bpm.model.SequenceFlow;
+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;
+import org.mvel.MVEL;
-
-
/**
- * This Decision represents a branching point where Alternatives are based on conditional expressions contained within outgoing Sequence Flow.
- * However, in this case, the True evaluation of one condition expression does not exclude the evaluation of other condition expressions.
- * All Sequence Flow with a True evaluation will be traversed by a Token.
+ * This Decision represents a branching point where Alternatives are based on conditional expressions contained within
+ * outgoing Sequence Flow. However, in this case, the True evaluation of one condition expression does not exclude the
+ * evaluation of other condition expressions. All Sequence Flow with a True evaluation will be traversed by a Token.
*
* @author thomas.diesler at jboss.com
* @since 08-Jul-2008
@@ -38,6 +55,9 @@
@SuppressWarnings("serial")
public class InclusiveGatewayImpl extends GatewayImpl implements InclusiveGateway
{
+ // provide logging
+ private static final Log log = LogFactory.getLog(InclusiveGatewayImpl.class);
+
public InclusiveGatewayImpl(String name)
{
super(name);
@@ -48,6 +68,114 @@
return GatewayType.Inclusive;
}
+ @Override
+ public FlowHandler getFlowHandler()
+ {
+ FlowHandler handler = super.getFlowHandler();
+ if (handler == null)
+ {
+ handler = new FlowHandler()
+ {
+ public void execute(TokenExecutor scheduler, 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)
+ scheduler.destroy(token);
+
+ for (Gate aux : applicableGates)
+ {
+ SequenceFlow outFlow = aux.getOutgoingSequenceFlow();
+ if (applicableGates.size() == 1)
+ {
+ scheduler.move(token, outFlow);
+ }
+ else
+ {
+ Token outToken = token.copyToken();
+ scheduler.create(outToken, outFlow);
+ scheduler.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
+ private List<Gate> getApplicableGates(Token token)
+ {
+ List<Gate> applicableGates = new ArrayList<Gate>();
+ 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)
+ {
+ applicableGates.add(auxGate);
+ }
+ }
+ else
+ {
+ throw new IllegalStateException("Unsupported expression language: " + expr.getExpressionLanguage());
+ }
+ }
+ }
+
+ // Use to the default gate if there is one
+ if (applicableGates.size() == 0)
+ {
+ for (Gate auxGate : getGates())
+ {
+ SequenceFlow seqFlow = auxGate.getOutgoingSequenceFlow();
+ if (seqFlow.getConditionType() == ConditionType.Default)
+ {
+ applicableGates.add(auxGate);
+ }
+ }
+ }
+
+ // Fallback to the single outgoing gate that is not conditional
+ if (applicableGates.size() == 0 && getGates().size() == 1)
+ {
+ Gate auxGate = getGates().get(0);
+ SequenceFlow seqFlow = auxGate.getOutgoingSequenceFlow();
+ if (seqFlow.getConditionType() == ConditionType.None)
+ {
+ applicableGates.add(auxGate);
+ }
+ }
+
+ if (applicableGates.size() == 0)
+ throw new IllegalStateException("Cannot select applicable gate in: " + this);
+
+ return applicableGates;
+ }
+
public String toString()
{
return "InclusiveGateway[" + getName() + "]";
Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java 2008-08-13 15:07:57 UTC (rev 1882)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ParallelGatewayImpl.java 2008-08-13 15:45:31 UTC (rev 1883)
@@ -92,13 +92,13 @@
{
public void execute(TokenExecutor scheduler, Token token)
{
- // In any case the in token is not propagated
+ // In any case, the incomming token is not propagated
scheduler.suspend(token);
- // If the gateway has a single incomming flow the out token is the in token
+ // If the gateway has a single incomming flow the outgoing token is the incomming token
Token outToken = (getInFlows().size() == 1 ? token : null);
- // The out token is the merge of all in tokens
+ // The outgoing token is the merge of all incomming tokens
if (outToken == null)
{
// If there are no more outstanding flows
@@ -115,10 +115,10 @@
}
}
- // Schedule the out token
+ // Schedule the outgoing token
if (outToken != null)
{
- // Start a copy of the out token for every gate
+ // Start a copy of the outgoing token for every gate
for(Gate gate : getGates())
{
SequenceFlow outFlow = gate.getOutgoingSequenceFlow();
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-13 15:07:57 UTC (rev 1882)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/StartEventImpl.java 2008-08-13 15:45:31 UTC (rev 1883)
@@ -172,6 +172,6 @@
public String toString()
{
- return "StartEvent[]";
+ return "StartEvent[" + getName() + "]";
}
}
\ No newline at end of file
Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveMergeTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveMergeTest.java 2008-08-13 15:07:57 UTC (rev 1882)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveMergeTest.java 2008-08-13 15:45:31 UTC (rev 1883)
@@ -23,6 +23,16 @@
// $Id$
+import java.util.List;
+
+import org.jboss.bpm.client.SignalManager;
+import org.jboss.bpm.model.EventBuilder;
+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.Gateway.GatewayType;
+import org.jboss.bpm.model.Signal.SignalType;
import org.jboss.bpm.test.DefaultEngineTestCase;
/**
@@ -37,6 +47,31 @@
{
public void testGateA() throws Exception
{
- System.out.println("FIXME: InclusiveMergeTest");
+ Process proc = getProcess();
+ proc.startProcess();
+
+ // Send start trigger signals
+ SignalManager signalManager = SignalManager.locateSignalManager();
+ signalManager.throwSignal(proc.getName(), new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "A"));
+ signalManager.throwSignal(proc.getName(), new Signal(getName(), SignalType.SYSTEM_START_TRIGGER, "B"));
+
+ // Wait for the process to end
+ proc.waitForEnd();
+
+ List<Signal> endSignals = getSignals(Signal.SignalType.SYSTEM_END_EVENT_EXIT);
+ assertEquals(2, endSignals.size());
}
+
+ private Process getProcess()
+ {
+ ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+ EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA");
+ eventBuilder.addSignalTrigger(SignalType.SYSTEM_START_TRIGGER, "A").addSequenceFlow("Merge");
+ eventBuilder = procBuilder.addStartEvent("StartB");
+ eventBuilder.addSignalTrigger(SignalType.SYSTEM_START_TRIGGER, "B").addSequenceFlow("Merge");
+ procBuilder.addGateway("Merge", GatewayType.Inclusive).addSequenceFlow("End");
+ procBuilder.addEndEvent("End");
+ Process proc = procBuilder.getProcess();
+ return proc;
+ }
}
Modified: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveSplitTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveSplitTest.java 2008-08-13 15:07:57 UTC (rev 1882)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/gateway/inclusive/InclusiveSplitTest.java 2008-08-13 15:45:31 UTC (rev 1883)
@@ -23,6 +23,16 @@
// $Id$
+import java.util.List;
+
+import org.jboss.bpm.model.GatewayBuilder;
+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.Expression.ExpressionLanguage;
+import org.jboss.bpm.model.Gateway.GatewayType;
+import org.jboss.bpm.runtime.BasicAttachments;
import org.jboss.bpm.test.DefaultEngineTestCase;
/**
@@ -36,6 +46,40 @@
{
public void testGateA() throws Exception
{
- System.out.println("FIXME: InclusiveSplitTest");
+ Process proc = getProcess();
+
+ BasicAttachments att = new BasicAttachments();
+ att.addAttachment("foo", "5");
+ proc.startProcess(att);
+ proc.waitForEnd();
+
+ List<Signal> endSignals = getSignals(Signal.SignalType.SYSTEM_END_EVENT_EXIT);
+ assertEquals(2, endSignals.size());
}
-}
+
+ public void testGateB() throws Exception
+ {
+ Process proc = getProcess();
+
+ BasicAttachments att = new BasicAttachments();
+ att.addAttachment("foo", "15");
+ proc.startProcess(att);
+ proc.waitForEnd();
+
+ List<Signal> endSignals = getSignals(Signal.SignalType.SYSTEM_END_EVENT_EXIT);
+ assertEquals(1, endSignals.size());
+ assertEquals("EndB", endSignals.get(0).getFromRef());
+ }
+
+ private Process getProcess()
+ {
+ ProcessBuilder procBuilder = ProcessBuilderFactory.newInstance().newProcessBuilder();
+ procBuilder.addProcess(getName()).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");
+ procBuilder.addEndEvent("EndA").addEndEvent("EndB");
+ Process proc = procBuilder.getProcess();
+ return proc;
+ }
+}
\ No newline at end of file
More information about the jbpm-commits
mailing list