[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