[jboss-svn-commits] JBL Code SVN: r20808 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/workflow/core and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jun 26 11:06:11 EDT 2008


Author: KrisVerlaenen
Date: 2008-06-26 11:06:11 -0400 (Thu, 26 Jun 2008)
New Revision: 20808

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/DroolsAction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ExtendedNodeImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ExtendedNodeInstanceImpl.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/JavaDialectRuntimeData.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ActionNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SequenceNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ActionNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java
Log:
JBRULES-1658: Generalize action framework

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/JavaDialectRuntimeData.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/JavaDialectRuntimeData.java	2008-06-26 14:12:18 UTC (rev 20807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/JavaDialectRuntimeData.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -40,7 +40,7 @@
 import org.drools.spi.ReturnValueEvaluator;
 import org.drools.spi.ReturnValueExpression;
 import org.drools.util.StringUtils;
-import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.DroolsAction;
 import org.drools.workflow.instance.impl.ReturnValueConstraintEvaluator;
 
 public class JavaDialectRuntimeData
@@ -333,8 +333,8 @@
                 ((Rule) invoker).setConsequence( (Consequence) clazz.newInstance() );
             } else if ( invoker instanceof JavaAccumulatorFunctionExecutor ) {
                 ((JavaAccumulatorFunctionExecutor) invoker).setExpression( (ReturnValueExpression) clazz.newInstance() );
-            } else if ( invoker instanceof ActionNode ) {
-                ((ActionNode) invoker).setAction( clazz.newInstance() );
+            } else if ( invoker instanceof DroolsAction ) {
+            	((DroolsAction) invoker).setMetaData( "Action", clazz.newInstance() );
             } else if ( invoker instanceof ReturnValueConstraintEvaluator ) {
                 ((ReturnValueConstraintEvaluator) invoker).setEvaluator( (ReturnValueEvaluator) clazz.newInstance() );
             }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/DroolsAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/DroolsAction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/DroolsAction.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -0,0 +1,30 @@
+package org.drools.workflow.core;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+public class DroolsAction implements Serializable {
+	
+	private static final long serialVersionUID = 1L;
+	
+	private String name;
+    private Map<String, Object> metaData = new HashMap<String, Object>();
+
+    public void setMetaData(String name, Object value) {
+        this.metaData.put(name, value);
+    }
+    
+    public Object getMetaData(String name) {
+        return this.metaData.get(name);
+    }
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+    
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java	2008-06-26 14:12:18 UTC (rev 20807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -2,7 +2,9 @@
 
 import java.io.Serializable;
 
-public class DroolsConsequenceAction implements Serializable {
+import org.drools.workflow.core.DroolsAction;
+
+public class DroolsConsequenceAction extends DroolsAction implements Serializable {
 	
     private static final long serialVersionUID = 400L;
     

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ExtendedNodeImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ExtendedNodeImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ExtendedNodeImpl.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -0,0 +1,34 @@
+package org.drools.workflow.core.impl;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.workflow.core.DroolsAction;
+
+public class ExtendedNodeImpl extends NodeImpl {
+
+	public static final String EVENT_NODE_ENTER = "onEntry";
+	public static final String EVENT_NODE_EXIT = "onExit";
+	
+	private static final String[] EVENT_TYPES =
+		new String[] { EVENT_NODE_ENTER, EVENT_NODE_EXIT };
+	
+	private static final long serialVersionUID = 4L;
+	
+	private Map<String, List<DroolsAction>> actions =
+		new HashMap<String, List<DroolsAction>>();
+	
+	public void setActions(String type, List<DroolsAction> actions) {
+		this.actions.put(type, actions);
+	}
+	
+	public List<DroolsAction> getActions(String type) {
+		return this.actions.get(type);
+	}
+	
+	public String[] getActionTypes() {
+		return EVENT_TYPES;
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ActionNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ActionNode.java	2008-06-26 14:12:18 UTC (rev 20807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ActionNode.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -1,5 +1,7 @@
 package org.drools.workflow.core.node;
 
+import org.drools.workflow.core.DroolsAction;
+
 /*
  * Copyright 2005 JBoss Inc
  * 
@@ -26,13 +28,13 @@
 
 	private static final long serialVersionUID = 400L;
 	
-	private Object action;
+	private DroolsAction action;
 
-	public Object getAction() {
+	public DroolsAction getAction() {
 		return action;
 	}
 
-	public void setAction(Object action) {
+	public void setAction(DroolsAction action) {
 		this.action = action;
 	}
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SequenceNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SequenceNode.java	2008-06-26 14:12:18 UTC (rev 20807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SequenceNode.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -4,13 +4,13 @@
 
 import org.drools.workflow.core.Connection;
 import org.drools.workflow.core.Node;
-import org.drools.workflow.core.impl.NodeImpl;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 
 /**
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public abstract class SequenceNode extends NodeImpl {
+public abstract class SequenceNode extends ExtendedNodeImpl {
 
     public Connection getFrom() {
         final List<Connection> list =

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ExtendedNodeInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ExtendedNodeInstanceImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ExtendedNodeInstanceImpl.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -0,0 +1,61 @@
+package org.drools.workflow.instance.impl;
+
+import java.util.List;
+
+import org.drools.WorkingMemory;
+import org.drools.base.DefaultKnowledgeHelper;
+import org.drools.base.SequentialKnowledgeHelper;
+import org.drools.common.InternalRuleBase;
+import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.process.instance.context.exception.ExceptionScopeInstance;
+import org.drools.spi.Action;
+import org.drools.spi.KnowledgeHelper;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
+import org.drools.workflow.instance.NodeInstance;
+
+public abstract class ExtendedNodeInstanceImpl extends NodeInstanceImpl {
+
+	public ExtendedNodeImpl getExtendedNode() {
+		return (ExtendedNodeImpl) getNode();
+	}
+	
+	public void internalTrigger(NodeInstance from, String type) {
+		triggerEvent(ExtendedNodeImpl.EVENT_NODE_ENTER);
+	}
+	
+	protected void triggerCompleted(String type, boolean remove) {
+		triggerEvent(ExtendedNodeImpl.EVENT_NODE_EXIT);
+		super.triggerCompleted(type, remove);
+	}
+	
+	protected void triggerEvent(String type) {
+		List<DroolsAction> actions = getExtendedNode().getActions(type);
+		if (actions != null) {
+			WorkingMemory workingMemory = getProcessInstance().getWorkingMemory();
+			KnowledgeHelper knowledgeHelper = null;
+			if (((InternalRuleBase) workingMemory.getRuleBase()).getConfiguration().isSequential()) {
+				knowledgeHelper = new SequentialKnowledgeHelper(workingMemory);
+	        } else {
+	        	knowledgeHelper = new DefaultKnowledgeHelper(workingMemory);
+	        }
+			for (DroolsAction droolsAction: actions) {
+				Action action = (Action) droolsAction.getMetaData("Action");
+				try {
+					action.execute(knowledgeHelper, workingMemory);
+				} catch (Exception exception) {
+					String exceptionName = exception.getClass().getName();
+					ExceptionScopeInstance exceptionScopeInstance = (ExceptionScopeInstance)
+						resolveContextInstance(ExceptionScope.EXCEPTION_SCOPE, exceptionName);
+					if (exceptionScopeInstance == null) {
+						exception.printStackTrace();
+						throw new IllegalArgumentException(
+							"Could not find exception handler for " + exceptionName + " while executing node " + getNodeId());
+					}
+					exceptionScopeInstance.handleException(exceptionName, exception);
+				}
+			}
+		}
+	}
+	
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ActionNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ActionNodeInstance.java	2008-06-26 14:12:18 UTC (rev 20807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ActionNodeInstance.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -45,10 +45,9 @@
             throw new IllegalArgumentException(
                 "An ActionNode only accepts default incoming connections!");
         }
-		Action action = (Action) getActionNode().getAction();
+		Action action = (Action) getActionNode().getAction().getMetaData("Action");
 		try {
 		    KnowledgeHelper knowledgeHelper = createKnowledgeHelper();
-		    
 	        action.execute( knowledgeHelper, getProcessInstance().getWorkingMemory() );		    
 		} catch (Exception e) {
 		    throw new RuntimeException("unable to execute Action", e);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java	2008-06-26 14:12:18 UTC (rev 20807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -2,9 +2,9 @@
 
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.EventNode;
-import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.drools.workflow.instance.impl.ExtendedNodeInstanceImpl;
 
-public abstract class EventNodeInstance extends NodeInstanceImpl {
+public abstract class EventNodeInstance extends ExtendedNodeInstanceImpl {
 
     public EventNode getEventNode() {
         return (EventNode) getNode();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2008-06-26 14:12:18 UTC (rev 20807)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -19,6 +19,8 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.drools.WorkingMemory;
 import org.drools.common.InternalRuleBase;
@@ -32,13 +34,14 @@
 import org.drools.workflow.instance.NodeInstance;
 
 /**
- * Runtime counterpart of a task node.
+ * Runtime counterpart of a work item node.
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
 public class WorkItemNodeInstance extends EventNodeInstance implements WorkItemListener {
 
     private static final long serialVersionUID = 400L;
+    private static final Pattern PARAMETER_MATCHER = Pattern.compile("#\\{(\\S+)\\}", Pattern.DOTALL);
     
     private long workItemId = -1;
     private transient WorkItemImpl workItem;
@@ -68,6 +71,7 @@
     }
 
     public void internalTrigger(final NodeInstance from, String type) {
+    	super.internalTrigger(from, type);
         // TODO this should be included for ruleflow only, not for BPEL
 //        if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
 //            throw new IllegalArgumentException(
@@ -108,6 +112,32 @@
                 System.err.println("Continuing without setting parameter.");
             }
         }
+        for (Map.Entry<String, Object> entry: workItem.getParameters().entrySet()) {
+        	if (entry.getValue() instanceof String) {
+        		String s = (String) entry.getValue();
+        		Map<String, String> replacements = new HashMap<String, String>();
+        		Matcher matcher = PARAMETER_MATCHER.matcher(s);
+                while (matcher.find()) {
+                	String paramName = matcher.group(1);
+                	if (replacements.get(paramName) == null) {
+		            	VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+		                	resolveContextInstance(VariableScope.VARIABLE_SCOPE, paramName);
+		                if (variableScopeInstance != null) {
+		                	String variableValue = (String) variableScopeInstance.getVariable(paramName);
+			                replacements.put(paramName, variableValue);
+		                } else {
+		                    System.err.println("Could not find variable scope for variable " + paramName);
+		                    System.err.println("when trying to replace variable in string for Work Item " + work.getName());
+		                    System.err.println("Continuing without setting parameter.");
+		                }
+                	}
+                }
+                for (Map.Entry<String, String> replacement: replacements.entrySet()) {
+                	s = s.replace("#{" + replacement.getKey() + "}", replacement.getValue());
+                }
+                workItem.setParameter(entry.getKey(), s);
+        	}
+        }
         return workItem;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java	2008-06-26 14:12:18 UTC (rev 20807)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java	2008-06-26 15:06:11 UTC (rev 20808)
@@ -19,8 +19,10 @@
 import org.drools.ruleflow.core.RuleFlowProcess;
 import org.drools.spi.Action;
 import org.drools.spi.KnowledgeHelper;
+import org.drools.workflow.core.DroolsAction;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.workflow.core.node.EndNode;
 import org.drools.workflow.core.node.ForEachNode;
@@ -71,11 +73,13 @@
         final List<String> myList = new ArrayList<String>();
         ActionNode actionNode = new ActionNode();
         actionNode.setName("Print child");
-        actionNode.setAction(new Action() {
+        DroolsAction action = new DroolsConsequenceAction("java", null);
+        action.setMetaData("Action", new Action() {
             public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory) throws Exception {
                 myList.add("Executed action");
             }
         });
+        actionNode.setAction(action);
         forEachNode.getCompositeNode().addNode(actionNode);
         forEachNode.getCompositeNode().linkIncomingConnections(
             Node.CONNECTION_DEFAULT_TYPE,




More information about the jboss-svn-commits mailing list