[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