[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