[jboss-svn-commits] JBL Code SVN: r21264 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/workflow/core/node and 11 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Jul 28 19:21:18 EDT 2008
Author: KrisVerlaenen
Date: 2008-07-28 19:21:18 -0400 (Mon, 28 Jul 2008)
New Revision: 21264
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNodeInterface.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialect.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialectConfiguration.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeContextNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java
labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf
labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java
Log:
JBRULES-1696: Extends WS-BPEL support
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -50,14 +50,12 @@
ruleConstraint.setDialect( constraint.getDialect() );
ruleConstraint.setName( constraint.getName() );
ruleConstraint.setPriority( constraint.getPriority() );
- ruleConstraint.setPriority( constraint.getPriority() );
splitNode.setConstraint( outgoingConnection, ruleConstraint );
} else if ( "code".equals( constraint.getType() ) ) {
ReturnValueConstraintEvaluator returnValueConstraint = new ReturnValueConstraintEvaluator();
returnValueConstraint.setDialect( constraint.getDialect() );
returnValueConstraint.setName( constraint.getName() );
returnValueConstraint.setPriority( constraint.getPriority() );
- returnValueConstraint.setPriority( constraint.getPriority() );
splitNode.setConstraint( outgoingConnection, returnValueConstraint );
ReturnValueDescr returnValueDescr = new ReturnValueDescr();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeContextNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeContextNode.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeContextNode.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -38,9 +38,11 @@
public Context resolveContext(String contextId, Object param) {
Context context = getDefaultContext(contextId);
- context = context.resolveContext(param);
if (context != null) {
- return context;
+ context = context.resolveContext(param);
+ if (context != null) {
+ return context;
+ }
}
return super.resolveContext(contextId, param);
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -16,7 +16,7 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class CompositeNode extends NodeImpl implements NodeContainer {
+public class CompositeNode extends NodeImpl implements NodeContainer, EventNodeInterface {
private static final long serialVersionUID = 400L;
@@ -73,6 +73,17 @@
node.setNodeContainer(null);
}
+ public boolean acceptsEvent(String type, Object event) {
+ for (Node node: getNodes()) {
+ if (node instanceof EventNodeInterface) {
+ if (((EventNodeInterface) node).acceptsEvent(type, event)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
public void linkIncomingConnections(String inType, long inNodeId, String inNodeType) {
linkIncomingConnections(inType, new NodeAndType(inNodeId, inNodeType));
}
@@ -389,5 +400,5 @@
}
}
-
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -8,7 +8,7 @@
import org.drools.workflow.core.Node;
import org.drools.workflow.core.impl.NodeImpl;
-public class EventNode extends NodeImpl {
+public class EventNode extends NodeImpl implements EventNodeInterface {
private static final long serialVersionUID = 4L;
@@ -39,7 +39,16 @@
this.filters = filters;
}
- public void validateAddIncomingConnection(final String type, final Connection connection) {
+ public boolean acceptsEvent(String type, Object event) {
+ for (EventFilter filter: filters) {
+ if (!filter.acceptsEvent(type, event)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public void validateAddIncomingConnection(final String type, final Connection connection) {
throw new UnsupportedOperationException(
"An event node does not have an incoming connection!");
}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNodeInterface.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNodeInterface.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNodeInterface.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,7 @@
+package org.drools.workflow.core.node;
+
+public interface EventNodeInterface {
+
+ boolean acceptsEvent(String type, Object event);
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -29,19 +29,18 @@
import org.drools.common.EventSupport;
import org.drools.common.InternalRuleBase;
import org.drools.common.InternalWorkingMemory;
-import org.drools.process.core.event.EventFilter;
import org.drools.process.instance.EventListener;
import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.impl.ProcessInstanceImpl;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.NodeContainer;
import org.drools.workflow.core.WorkflowProcess;
-import org.drools.workflow.core.node.EventNode;
+import org.drools.workflow.core.node.EventNodeInterface;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.NodeInstanceContainer;
import org.drools.workflow.instance.WorkflowProcessInstance;
import org.drools.workflow.instance.node.EventBasedNodeInstance;
-import org.drools.workflow.instance.node.EventNodeInstance;
+import org.drools.workflow.instance.node.EventNodeInstanceInterface;
/**
* Default implementation of a RuleFlow process instance.
@@ -194,26 +193,15 @@
}
} else {
for (Node node: getWorkflowProcess().getNodes()) {
- if (node instanceof EventNode) {
- if (acceptsEvent((EventNode) node, type, event)) {
- EventNodeInstance eventNodeInstance = (EventNodeInstance) getNodeInstance(node);
- eventNodeInstance.setEvent(type, event);
- eventNodeInstance.trigger(null, null);
+ if (node instanceof EventNodeInterface) {
+ if (((EventNodeInterface) node).acceptsEvent(type, event)) {
+ EventNodeInstanceInterface eventNodeInstance = (EventNodeInstanceInterface) getNodeInstance(node);
+ eventNodeInstance.triggerEvent(type, event);
}
}
}
}
}
-
- public boolean acceptsEvent(EventNode eventNode, String type, Object event) {
- List<EventFilter> eventFilters = eventNode.getEventFilters();
- for (EventFilter filter: eventFilters) {
- if (!filter.acceptsEvent(type, event)) {
- return false;
- }
- }
- return true;
- }
public void addEventListener(String type, EventListener listener) {
List<EventListener> listeners = eventListeners.get(type);
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -27,6 +27,7 @@
import org.drools.workflow.core.Node;
import org.drools.workflow.core.NodeContainer;
import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.EventNodeInterface;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.NodeInstanceContainer;
import org.drools.workflow.instance.impl.NodeInstanceFactory;
@@ -38,7 +39,7 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class CompositeNodeInstance extends NodeInstanceImpl implements NodeInstanceContainer {
+public class CompositeNodeInstance extends NodeInstanceImpl implements NodeInstanceContainer, EventNodeInstanceInterface {
private static final long serialVersionUID = 400L;
@@ -148,6 +149,17 @@
return nodeInstance;
}
+ public void triggerEvent(String type, Object event) {
+ for (Node node: getCompositeNode().getNodes()) {
+ if (node instanceof EventNodeInterface) {
+ if (((EventNodeInterface) node).acceptsEvent(type, event)) {
+ EventNodeInstanceInterface eventNodeInstance = (EventNodeInstanceInterface) getNodeInstance(node);
+ eventNodeInstance.triggerEvent(type, event);
+ }
+ }
+ }
+ }
+
public class CompositeNodeStartInstance extends NodeInstanceImpl {
private static final long serialVersionUID = 400L;
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-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -28,11 +28,11 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class EventNodeInstance extends NodeInstanceImpl {
+public class EventNodeInstance extends NodeInstanceImpl implements EventNodeInstanceInterface {
private static final long serialVersionUID = 400L;
- public void setEvent(String type, Object event) {
+ public void triggerEvent(String type, Object event) {
String variableName = getEventNode().getVariableName();
if (variableName != null) {
VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
@@ -43,6 +43,7 @@
}
variableScopeInstance.setVariable(variableName, event);
}
+ trigger(null, null);
}
public void internalTrigger(final NodeInstance from, String type) {
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,6 @@
+package org.drools.workflow.instance.node;
+
+public interface EventNodeInstanceInterface {
+
+ void triggerEvent(String type, Object event);
+}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -24,6 +24,7 @@
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.CompositeNode;
import org.drools.workflow.core.node.EndNode;
import org.drools.workflow.core.node.EventNode;
import org.drools.workflow.core.node.Join;
@@ -431,4 +432,97 @@
assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
}
+ public void testEvent5() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("org.drools.process.event");
+ process.setName("Event Process");
+
+ List<Variable> variables = new ArrayList<Variable>();
+ Variable variable = new Variable();
+ variable.setName("event");
+ ObjectDataType personDataType = new ObjectDataType();
+ personDataType.setClassName("org.drools.Person");
+ variable.setType(personDataType);
+ variables.add(variable);
+ process.getVariableScope().setVariables(variables);
+
+ StartNode startNode = new StartNode();
+ startNode.setName("Start");
+ startNode.setId(1);
+ process.addNode(startNode);
+
+ CompositeNode compositeNode = new CompositeNode();
+ compositeNode.setName("CompositeNode");
+ compositeNode.setId(2);
+ process.addNode(compositeNode);
+ new ConnectionImpl(
+ startNode, Node.CONNECTION_DEFAULT_TYPE,
+ compositeNode, Node.CONNECTION_DEFAULT_TYPE
+ );
+
+ MilestoneNode milestoneNode = new MilestoneNode();
+ milestoneNode.setName("Milestone");
+ milestoneNode.setConstraint("eval(false)");
+ compositeNode.addNode(milestoneNode);
+ compositeNode.linkIncomingConnections(Node.CONNECTION_DEFAULT_TYPE, milestoneNode.getId(), Node.CONNECTION_DEFAULT_TYPE);
+
+ EventNode eventNode = new EventNode();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ eventFilter.setType("myEvent");
+ eventNode.addEventFilter(eventFilter);
+ eventNode.setVariableName("event");
+ compositeNode.addNode(eventNode);
+
+ final List<String> myList = new ArrayList<String>();
+ ActionNode actionNode = new ActionNode();
+ actionNode.setName("Print");
+ DroolsAction action = new DroolsConsequenceAction("java", null);
+ action.setMetaData("Action", new Action() {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+ System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
+ myList.add("Executed action");
+ }
+ });
+ actionNode.setAction(action);
+ compositeNode.addNode(actionNode);
+ new ConnectionImpl(
+ eventNode, Node.CONNECTION_DEFAULT_TYPE,
+ actionNode, Node.CONNECTION_DEFAULT_TYPE
+ );
+
+ Join join = new Join();
+ join.setName("XOR Join");
+ join.setType(Join.TYPE_XOR);
+ compositeNode.addNode(join);
+ new ConnectionImpl(
+ milestoneNode, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE
+ );
+ new ConnectionImpl(
+ actionNode, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE
+ );
+ compositeNode.linkOutgoingConnections(join.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE);
+
+ EndNode endNode = new EndNode();
+ endNode.setName("EndNode");
+ endNode.setId(3);
+ process.addNode(endNode);
+ new ConnectionImpl(
+ compositeNode, Node.CONNECTION_DEFAULT_TYPE,
+ endNode, Node.CONNECTION_DEFAULT_TYPE
+ );
+
+ AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase();
+ ruleBase.addProcess(process);
+ InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+ ProcessInstance processInstance = workingMemory.startProcess("org.drools.process.event");
+ assertEquals(0, myList.size());
+ Person jack = new Person();
+ jack.setName("Jack");
+ processInstance.signalEvent("myEvent", jack);
+ assertEquals(1, myList.size());
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+ }
+
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/.classpath 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/.classpath 2008-07-28 23:21:18 UTC (rev 21264)
@@ -9,6 +9,9 @@
<classpathentry combineaccessrules="false" kind="src" path="/drools-core"/>
<classpathentry kind="lib" path="lib/ode-bpel-compiler.jar"/>
<classpathentry kind="lib" path="lib/commons-logging-1.1.jar"/>
+ <classpathentry kind="lib" path="lib/saxon-xpath-8.7.jar"/>
+ <classpathentry kind="lib" path="lib/saxon-8.7.jar"/>
+ <classpathentry kind="lib" path="lib/saxon-dom-8.7.jar"/>
<classpathentry kind="lib" path="lib/wsdl4j-1.6.1.jar"/>
<classpathentry kind="lib" path="lib/ode-utils.jar"/>
<classpathentry kind="lib" path="lib/xercesImpl-2.9.0.jar"/>
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -9,8 +9,10 @@
import org.apache.ode.bpel.compiler.bom.AssignActivity;
import org.apache.ode.bpel.compiler.bom.BpelObjectFactory;
import org.apache.ode.bpel.compiler.bom.Catch;
+import org.apache.ode.bpel.compiler.bom.Copy;
import org.apache.ode.bpel.compiler.bom.EmptyActivity;
import org.apache.ode.bpel.compiler.bom.FlowActivity;
+import org.apache.ode.bpel.compiler.bom.From;
import org.apache.ode.bpel.compiler.bom.InvokeActivity;
import org.apache.ode.bpel.compiler.bom.Link;
import org.apache.ode.bpel.compiler.bom.LinkSource;
@@ -25,6 +27,7 @@
import org.apache.ode.bpel.compiler.bom.SequenceActivity;
import org.apache.ode.bpel.compiler.bom.SwitchActivity;
import org.apache.ode.bpel.compiler.bom.ThrowActivity;
+import org.apache.ode.bpel.compiler.bom.To;
import org.apache.ode.bpel.compiler.bom.WaitActivity;
import org.apache.ode.bpel.compiler.bom.WhileActivity;
import org.apache.ode.utils.StreamUtils;
@@ -47,9 +50,11 @@
import org.drools.bpel.core.BPELWhile;
import org.drools.bpel.core.BPELActivity.SourceLink;
import org.drools.bpel.core.BPELActivity.TargetLink;
+import org.drools.bpel.xpath.XPathDialectConfiguration;
import org.drools.common.AbstractRuleBase;
import org.drools.compiler.DroolsError;
import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilderConfiguration;
import org.drools.compiler.ProcessBuilder;
import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
@@ -63,7 +68,9 @@
BPELCompiler compiler = new BPELCompiler();
BPELProcess process = compiler.compileProcess(
BPELCompiler.class.getResource(fileName));
- PackageBuilder packageBuilder = new PackageBuilder();
+ PackageBuilderConfiguration configuration = new PackageBuilderConfiguration();
+ configuration.addDialect("XPath2.0", new XPathDialectConfiguration());
+ PackageBuilder packageBuilder = new PackageBuilder(configuration);
ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
processBuilder.buildProcess(process);
if (!processBuilder.getErrors().isEmpty()) {
@@ -177,8 +184,28 @@
} else if (activity instanceof AssignActivity) {
AssignActivity assignActivity = (AssignActivity) activity;
BPELAssign assign = new BPELAssign();
- // TODO assign copy
- assign.setAction("");
+ for (Copy copy: assignActivity.getCopies()) {
+ BPELAssign.Copy bpelCopy = assign.new Copy();
+ From from = copy.getFrom();
+ To to = copy.getTo();
+ if (from.isVariableVal()) {
+ BPELAssign.VariablePart bpelFrom = assign.new VariablePart(
+ from.getAsVariableVal().getVariable(),
+ from.getAsVariableVal().getNamespaceContext().toString() + ":" + from.getAsVariableVal().getPart());
+ bpelCopy.setFrom(bpelFrom);
+ } else {
+ throw new UnsupportedOperationException("Assign from does not yet support non-variable values");
+ }
+ if (to.isVariableVal()) {
+ BPELAssign.VariablePart bpelTo = assign.new VariablePart(
+ to.getAsVariableVal().getVariable(),
+ to.getAsVariableVal().getNamespaceContext().toString() + ":" + to.getAsVariableVal().getPart());
+ bpelCopy.setTo(bpelTo);
+ } else {
+ throw new UnsupportedOperationException("Assign to does not yet support non-variable values");
+ }
+ assign.addCopy(bpelCopy);
+ }
result = assign;
} else if (activity instanceof EmptyActivity) {
result = new BPELEmpty();
@@ -217,14 +244,23 @@
BPELScope scope = new BPELScope();
VariableScope variableScope = scope.getVariableScope();
List<Variable> variables = new ArrayList<Variable>();
- // TODO
-// for (org.apache.ode.bpel.compiler.bom.Variable variable: scopeActivity.getVariables()) {
-// Variable bpelVariable = new Variable();
-// bpelVariable.setName(variable.getName());
-// bpelVariable.setType(new StringDataType());
-// variables.add(bpelVariable);
-// }
+ for (org.apache.ode.bpel.compiler.bom.Variable variable: scopeActivity.getScope().getVariables()) {
+ Variable bpelVariable = new Variable();
+ bpelVariable.setName(variable.getName());
+ bpelVariable.setType(new StringDataType());
+ variables.add(bpelVariable);
+ }
variableScope.setVariables(variables);
+ List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
+ for (Catch catcher: scopeActivity.getScope().getFaultHandler().getCatches()) {
+ BPELFaultHandler faultHandler = new BPELFaultHandler();
+ faultHandler.setFaultName(catcher.getFaultName().toString());
+ faultHandler.setFaultVariable(catcher.getFaultVariable());
+ faultHandler.setActivity(compileActivity(catcher.getActivity()));
+ faultHandlers.add(faultHandler);
+ }
+ scope.setFaultHandlers(faultHandlers);
+ scope.setActivity(compileActivity(scopeActivity.getChildActivity()));
result = scope;
} else if (activity instanceof SwitchActivity) {
SwitchActivity switchActivity = (SwitchActivity) activity;
@@ -251,6 +287,9 @@
compileActivity(whileActivity.getActivity()));
result = bpelWhile;
} else {
+ // TODO: compensate
+ // TODO: exit
+ // BPEL2.0: If, RepeatUntil, CompensateScope, Rethrow, Validate
throw new IllegalArgumentException("Unknown activity type " + activity.getClass());
}
result.setName(activity.getName());
@@ -263,13 +302,17 @@
}
i++;
}
- result.setSourceLinks(sourceLinks);
+ if (sourceLinks.length > 0) {
+ result.setSourceLinks(sourceLinks);
+ }
TargetLink[] targetLinks = new TargetLink[activity.getLinkTargets().size()];
i = 0;
for (LinkTarget linkTarget: activity.getLinkTargets()) {
targetLinks[i++] = new TargetLink(linkTarget.getLinkName());
}
- result.setTargetLinks(targetLinks);
+ if (targetLinks.length > 0) {
+ result.setTargetLinks(targetLinks);
+ }
return result;
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,23 +1,31 @@
package org.drools.bpel.core;
-import org.drools.workflow.core.impl.DroolsConsequenceAction;
-import org.drools.workflow.core.node.ActionNode;
+import java.util.ArrayList;
+import java.util.List;
+import org.drools.workflow.core.Connection;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.NodeImpl;
/**
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class BPELAssign extends ActionNode implements BPELActivity {
+public class BPELAssign extends NodeImpl implements BPELActivity {
private static final long serialVersionUID = 400L;
+ private List<Copy> copies = new ArrayList<Copy>();
private SourceLink[] sourceLinks;
private TargetLink[] targetLinks;
- public void setAction(String assign) {
- setAction(new DroolsConsequenceAction("mvel", assign));
+ public void addCopy(Copy copy) {
+ copies.add(copy);
}
+
+ public List<Copy> getCopies() {
+ return copies;
+ }
public SourceLink[] getSourceLinks() {
return sourceLinks;
@@ -34,5 +42,75 @@
public void setTargetLinks(TargetLink[] targetLinks) {
this.targetLinks = targetLinks;
}
+
+ public void validateAddIncomingConnection(final String type,
+ final Connection connection) {
+ super.validateAddIncomingConnection(type, connection);
+ if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+ throw new IllegalArgumentException(
+ "This type of node only accepts default incoming connection type!");
+ }
+ if (getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE) != null
+ && !getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE).isEmpty()) {
+ throw new IllegalArgumentException(
+ "This type of node cannot have more than one incoming connection!");
+ }
+ }
+ public void validateAddOutgoingConnection(final String type, final Connection connection) {
+ super.validateAddOutgoingConnection(type, connection);
+ if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+ throw new IllegalArgumentException(
+ "This type of node only accepts default outgoing connection type!");
+ }
+ if (getOutgoingConnections(Node.CONNECTION_DEFAULT_TYPE) != null
+ && !getOutgoingConnections(Node.CONNECTION_DEFAULT_TYPE).isEmpty()) {
+ throw new IllegalArgumentException(
+ "This type of node cannot have more than one outgoing connection!");
+ }
+ }
+
+ public class Copy {
+
+ private VariablePart from;
+ private VariablePart to;
+
+ public VariablePart getFrom() {
+ return from;
+ }
+
+ public void setFrom(VariablePart from) {
+ this.from = from;
+ }
+
+ public VariablePart getTo() {
+ return to;
+ }
+
+ public void setTo(VariablePart to) {
+ this.to = to;
+ }
+
+ }
+
+ public class VariablePart {
+
+ private String variable;
+ private String part;
+
+ public VariablePart(String variable, String part) {
+ this.variable = variable;
+ this.part = part;
+ }
+
+ public String getVariable() {
+ return variable;
+ }
+
+ public String getPart() {
+ return part;
+ }
+
+ }
+
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -27,6 +27,7 @@
EndNode end = new EndNode();
end.setTerminate(false);
end.setMetaData("hidden", true);
+ addNode(end);
join = new Join();
join.setType(Join.TYPE_XOR);
join.setMetaData("hidden", true);
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,5 +1,8 @@
package org.drools.bpel.core;
+import java.util.List;
+
+import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.node.CompositeContextNode;
@@ -13,6 +16,9 @@
private static final long serialVersionUID = 400L;
+ private SourceLink[] sourceLinks;
+ private TargetLink[] targetLinks;
+
public BPELScope() {
VariableScope variableScope = new VariableScope();
addContext(variableScope);
@@ -35,20 +41,30 @@
Node.CONNECTION_DEFAULT_TYPE);
}
+ public void setFaultHandlers(List<BPELFaultHandler> faultHandlers) {
+ ExceptionScope exceptionScope = new ExceptionScope();
+ addContext(exceptionScope);
+ setDefaultContext(exceptionScope);
+ for (BPELFaultHandler faultHandler: faultHandlers) {
+ addNode(faultHandler.getActivity());
+ exceptionScope.setExceptionHandler(faultHandler.getFaultName(), faultHandler);
+ }
+ }
+
public SourceLink[] getSourceLinks() {
- throw new IllegalArgumentException("A scope does not support links!");
+ return sourceLinks;
}
- public TargetLink[] getTargetLinks() {
- throw new IllegalArgumentException("A scope does not support links!");
+ public void setSourceLinks(SourceLink[] sourceLinks) {
+ this.sourceLinks = sourceLinks;
}
- public void setSourceLinks(SourceLink[] sourceLinks) {
- throw new IllegalArgumentException("A scope does not support links!");
+ public TargetLink[] getTargetLinks() {
+ return targetLinks;
}
public void setTargetLinks(TargetLink[] targetLinks) {
- throw new IllegalArgumentException("A scope does not support links!");
+ this.targetLinks = targetLinks;
}
-
+
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -66,7 +66,7 @@
// TODO While constraint dialect
constraint.setConstraint(condition);
constraint.setType("code");
- constraint.setDialect("mvel");
+ constraint.setDialect("XPath2.0");
constraint.setPriority(getNodes().length - 2);
split.setConstraint(connection, constraint);
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,24 +1,112 @@
package org.drools.bpel.instance;
+import java.io.ByteArrayInputStream;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.ode.utils.DOMUtils;
+import org.drools.bpel.core.BPELAssign;
+import org.drools.bpel.core.BPELAssign.Copy;
+import org.drools.bpel.core.BPELAssign.VariablePart;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.workflow.core.Node;
import org.drools.workflow.instance.NodeInstance;
-import org.drools.workflow.instance.node.ActionNodeInstance;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.NodeList;
/**
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class BPELAssignInstance extends ActionNodeInstance {
+public class BPELAssignInstance extends NodeInstanceImpl {
private static final long serialVersionUID = 400L;
+ public BPELAssign getBPELAssign() {
+ return (BPELAssign) getNode();
+ }
+
public void internalTrigger(NodeInstance from, String type) {
if (BPELLinkManager.checkActivityEnabled(this)) {
- super.internalTrigger(from, type);
+ BPELAssign assign = getBPELAssign();
+ for (Copy copy: assign.getCopies()) {
+ VariablePart fromPart = copy.getFrom();
+ VariablePart toPart = copy.getTo();
+ String fromValue = getVariableValue(fromPart.getVariable());
+ String toValue = getVariableValue(toPart.getVariable());
+ if (toValue == null) {
+ toValue = initializeVariable(toPart.getVariable());
+ }
+ toValue = copy(fromValue, fromPart.getPart(), toValue, toPart.getPart());
+ setVariableValue(toPart.getVariable(), toValue);
+ }
+ triggerCompleted(Node.CONNECTION_DEFAULT_TYPE, true);
}
}
- public void triggerCompleted() {
- super.triggerCompleted();
+ private String copy(String fromValue, String fromPart, String toValue, String toPart) {
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document fromDocument = factory.newDocumentBuilder().parse(new ByteArrayInputStream(fromValue.getBytes()));
+ Element from = DOMUtils.findChildByName((Element) fromDocument.getDocumentElement(), new QName(fromPart));
+ Document toDocument = factory.newDocumentBuilder().parse(new ByteArrayInputStream(toValue.getBytes()));
+ Element to = DOMUtils.findChildByName((Element) toDocument.getDocumentElement(), new QName(toPart));
+
+ Element replacement = toDocument.createElementNS(from.getNamespaceURI(), from.getNodeName());
+ NodeList nl = from.getChildNodes();
+ for (int i = 0; i < nl.getLength(); ++i)
+ replacement.appendChild(toDocument.importNode(nl.item(i), true));
+ NamedNodeMap attrs = from.getAttributes();
+ for (int i = 0; i < attrs.getLength(); ++i) {
+ if (!((Attr)attrs.item(i)).getName().startsWith("xmlns")) {
+ replacement.setAttributeNodeNS((Attr) toDocument.importNode(attrs.item(i), true));
+ }
+ }
+ to.getParentNode().replaceChild(replacement, to);
+ return DOMUtils.domToString(toDocument.getDocumentElement());
+ } catch (Throwable t) {
+ throw new IllegalArgumentException("Could not copy value", t);
+ }
+ }
+
+ private String initializeVariable(String variable) {
+ // TODO
+ return "<shippingRequestMessage><customerInfo></customerInfo></shippingRequestMessage>";
+ }
+
+ private String getVariableValue(String variable) {
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
+ if (variableScopeInstance != null) {
+ return (String) variableScopeInstance.getVariable(variable);
+ } else {
+ System.err.println("Could not find variable scope for variable " + variable);
+ System.err.println("when trying assign");
+ System.err.println("Continuing without setting variable.");
+ }
+ return null;
+ }
+
+ private void setVariableValue(String variable, String value) {
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
+ if (variableScopeInstance != null) {
+ variableScopeInstance.setVariable(variable, value);
+ } else {
+ System.err.println("Could not find variable scope for variable " + variable);
+ System.err.println("when trying assign");
+ System.err.println("Continuing without setting variable.");
+ }
+ }
+
+ public void triggerCompleted(String type, boolean remove) {
+ super.triggerCompleted(type, remove);
BPELLinkManager.activateTargetLinks(this);
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -55,7 +55,7 @@
System.err.println("Continuing without setting variable.");
}
}
- nodeInstance.trigger(null, null);
+ nodeInstance.trigger(null, Node.CONNECTION_DEFAULT_TYPE);
if (nodeInstanceContainer instanceof BPELProcessInstance) {
((BPELProcessInstance) nodeInstanceContainer).setState(ProcessInstance.STATE_ABORTED);
} else {
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -27,6 +27,7 @@
return (BPELProcess) getProcess();
}
+ // TODO: unification with signalEvent
public void acceptMessage(String partnerLink, String portType, String operation, String message) {
if (getState() == STATE_PENDING) {
setState(STATE_ACTIVE);
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,13 +1,13 @@
package org.drools.bpel.instance;
import org.drools.workflow.instance.NodeInstance;
-import org.drools.workflow.instance.node.CompositeNodeInstance;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
/**
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class BPELScopeInstance extends CompositeNodeInstance {
+public class BPELScopeInstance extends CompositeContextNodeInstance {
private static final long serialVersionUID = 400L;
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialect.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialect.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,162 @@
+package org.drools.bpel.xpath;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.TypeResolver;
+import org.drools.compiler.Dialect;
+import org.drools.lang.descr.BaseDescr;
+import org.drools.lang.descr.FunctionDescr;
+import org.drools.lang.descr.ProcessDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.builder.AccumulateBuilder;
+import org.drools.rule.builder.ActionBuilder;
+import org.drools.rule.builder.ConsequenceBuilder;
+import org.drools.rule.builder.EntryPointBuilder;
+import org.drools.rule.builder.FromBuilder;
+import org.drools.rule.builder.PackageBuildContext;
+import org.drools.rule.builder.PatternBuilder;
+import org.drools.rule.builder.PredicateBuilder;
+import org.drools.rule.builder.ProcessBuildContext;
+import org.drools.rule.builder.ProcessClassBuilder;
+import org.drools.rule.builder.QueryBuilder;
+import org.drools.rule.builder.ReturnValueBuilder;
+import org.drools.rule.builder.ReturnValueEvaluatorBuilder;
+import org.drools.rule.builder.RuleBuildContext;
+import org.drools.rule.builder.RuleClassBuilder;
+import org.drools.rule.builder.RuleConditionBuilder;
+import org.drools.rule.builder.SalienceBuilder;
+
+public class XPathDialect implements Dialect {
+
+ private static final XPathReturnValueEvaluatorBuilder RETURN_VALUE_EVALUATOR_BUILDER = new XPathReturnValueEvaluatorBuilder();
+
+ public String getId() {
+ return "XPath2.0";
+ }
+
+ public String getExpressionDialectName() {
+ return "XPath2.0";
+ }
+
+ public ReturnValueEvaluatorBuilder getReturnValueEvaluatorBuilder() {
+ return RETURN_VALUE_EVALUATOR_BUILDER;
+ }
+
+ public ActionBuilder getActionBuilder() {
+ return null;
+ }
+
+ public void addFunction(FunctionDescr functionDescr, TypeResolver typeResolver) {
+ }
+
+ public void addImport(String importEntry) {
+ }
+
+ public void addProcess(ProcessBuildContext context) {
+ }
+
+ public void addRule(RuleBuildContext context) {
+ }
+
+ public void addStaticImport(String importEntry) {
+ }
+
+ public AnalysisResult analyzeBlock(PackageBuildContext context,
+ BaseDescr descr, String text, Set[] availableIdentifiers) {
+ return null;
+ }
+
+ public AnalysisResult analyzeExpression(PackageBuildContext context,
+ BaseDescr descr, Object content, Set[] availableIdentifiers) {
+ return null;
+ }
+
+ public void compileAll() {
+ }
+
+ public AccumulateBuilder getAccumulateBuilder() {
+ return null;
+ }
+
+ public RuleConditionBuilder getBuilder(Class clazz) {
+ return null;
+ }
+
+ public Map getBuilders() {
+ return null;
+ }
+
+ public ClassFieldAccessorCache getClassFieldExtractorCache() {
+ return null;
+ }
+
+ public ConsequenceBuilder getConsequenceBuilder() {
+ return null;
+ }
+
+ public EntryPointBuilder getEntryPointBuilder() {
+ return null;
+ }
+
+ public RuleConditionBuilder getEvalBuilder() {
+ return null;
+ }
+
+ public FromBuilder getFromBuilder() {
+ return null;
+ }
+
+ public PatternBuilder getPatternBuilder() {
+ return null;
+ }
+
+ public PredicateBuilder getPredicateBuilder() {
+ return null;
+ }
+
+ public ProcessClassBuilder getProcessClassBuilder() {
+ return null;
+ }
+
+ public QueryBuilder getQueryBuilder() {
+ return null;
+ }
+
+ public List getResults() {
+ return null;
+ }
+
+ public ReturnValueBuilder getReturnValueBuilder() {
+ return null;
+ }
+
+ public RuleClassBuilder getRuleClassBuilder() {
+ return null;
+ }
+
+ public SalienceBuilder getSalienceBuilder() {
+ return null;
+ }
+
+ public TypeResolver getTypeResolver() {
+ return null;
+ }
+
+ public void init(RuleDescr ruleDescr) {
+ }
+
+ public void init(ProcessDescr processDescr) {
+ }
+
+ public void postCompileAddFunction(FunctionDescr functionDescr,
+ TypeResolver typeResolver) {
+ }
+
+ public void preCompileAddFunction(FunctionDescr functionDescr,
+ TypeResolver typeResolver) {
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialectConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialectConfiguration.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialectConfiguration.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,26 @@
+package org.drools.bpel.xpath;
+
+import org.drools.compiler.Dialect;
+import org.drools.compiler.DialectConfiguration;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.compiler.PackageRegistry;
+import org.drools.rule.Package;
+
+public class XPathDialectConfiguration implements DialectConfiguration {
+
+ private PackageBuilderConfiguration packageBuilderConfiguration;
+
+ public PackageBuilderConfiguration getPackageBuilderConfiguration() {
+ return packageBuilderConfiguration;
+ }
+
+ public void init(PackageBuilderConfiguration configuration) {
+ this.packageBuilderConfiguration = configuration;
+ }
+
+ public Dialect newDialect(PackageBuilder packageBuilder, PackageRegistry pkgRegistry, Package pkg) {
+ return new XPathDialect();
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,22 @@
+package org.drools.bpel.xpath;
+
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+
+import org.apache.ode.utils.DOMUtils;
+import org.drools.WorkingMemory;
+import org.drools.spi.ReturnValueEvaluator;
+
+public class XPathReturnValueEvaluator implements ReturnValueEvaluator {
+
+ private XPathExpression expression;
+
+ public void setExpression(XPathExpression expression) {
+ this.expression = expression;
+ }
+
+ public Object evaluate(WorkingMemory workingMemory) throws Exception {
+ return expression.evaluate(DOMUtils.newDocument(), XPathConstants.BOOLEAN);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,67 @@
+package org.drools.bpel.xpath;
+
+import java.io.ByteArrayInputStream;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathFactory;
+
+import net.sf.saxon.om.NamespaceConstant;
+import net.sf.saxon.xpath.XPathEvaluator;
+
+import org.drools.compiler.ReturnValueDescr;
+import org.drools.rule.builder.PackageBuildContext;
+import org.drools.rule.builder.ReturnValueEvaluatorBuilder;
+import org.drools.workflow.instance.impl.ReturnValueConstraintEvaluator;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public class XPathReturnValueEvaluatorBuilder implements ReturnValueEvaluatorBuilder {
+
+ public void build(PackageBuildContext context,
+ ReturnValueConstraintEvaluator returnValueConstraintEvaluator,
+ ReturnValueDescr returnValueDescr) {
+ try {
+ XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(returnValueDescr.getText().getBytes()));
+ Node node = document.getFirstChild().getFirstChild();
+ if (node == null) {
+ throw new IllegalStateException();
+ }
+ if (node.getNodeType() != Node.TEXT_NODE) {
+ throw new IllegalArgumentException("Unexpected node type for XPath");
+ }
+ String xpathString = node.getNodeValue();
+ XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
+// xpf.setXPathFunctionResolver(new XPathFunctionResolver() {
+// public XPathFunction resolveFunction(QName arg0, int arg1) {
+// return null;
+// }
+// });
+// xpf.setXPathVariableResolver(new XPathVariableResolver() {
+// public Object resolveVariable(QName arg0) {
+// return null;
+// }
+// });
+ XPathEvaluator xpe = (XPathEvaluator) xpf.newXPath();
+// xpe.setNamespaceContext(new NamespaceContext() {
+// public String getNamespaceURI(String arg0) {
+// return null;
+// }
+// public String getPrefix(String arg0) {
+// return null;
+// }
+// public Iterator getPrefixes(String arg0) {
+// return null;
+// }
+// });
+ XPathExpression expression = xpe.compile(xpathString);
+ evaluator.setExpression(expression);
+ returnValueConstraintEvaluator.setEvaluator(evaluator);
+ } catch (Throwable t) {
+ throw new IllegalArgumentException("Could not compile XPath expression " + returnValueDescr.getText(), t);
+ }
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf 2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,11 +1,7 @@
// we use MVEL to configure our nodes, simply populate a map, which will be added to the main registry
-import org.drools.workflow.core.node.Split;
-import org.drools.bpel.core.BPELAssign;
import org.drools.bpel.core.BPELEmpty;
import org.drools.process.builder.ActionNodeBuilder;
-import org.drools.process.builder.SplitNodeBuilder;
[
- BPELAssign : new ActionNodeBuilder(),
BPELEmpty : new ActionNodeBuilder(),
]
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java 2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java 2008-07-28 23:21:18 UTC (rev 21264)
@@ -120,8 +120,10 @@
// assign1
BPELAssign assign1 = new BPELAssign();
assign1.setId(++nodeId);
- // $shippingRequest.customerInfo <- $PO.customerInfo
- assign1.setAction("");
+ BPELAssign.Copy copy = assign1.new Copy();
+ copy.setFrom(assign1.new VariablePart("PO", "customerInfo"));
+ copy.setTo(assign1.new VariablePart("shippingRequest", "customerInfo"));
+ assign1.addCopy(copy);
sequence1Activities.add(assign1);
// invoke1
@@ -265,7 +267,8 @@
BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
// start process
- BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
+ BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder",
+ "<POMessage><customerInfo>Jack</customerInfo><purchaseOrder>PURCHASE_ORDER</purchaseOrder></POMessage>");
// reply to web service invocations
WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "requestProductionScheduling");
@@ -275,14 +278,14 @@
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
- BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "SHIPPING");
+ BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "<shippingInfoMessage><shippingInfo>SHIPPING_INFO</shippingInfo></shippingInfoMessage>");
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "sendShippingPrice");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
// invoke web service callbacks
- BPELTestUtil.webServiceInvocation(processInstance, "shipping", "lns:shippingCallbackPT", "sendSchedule", "SCHEDULE");
- BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "lns:invoiceCallbackPT", "sendInvoice", "INVOICE");
+ BPELTestUtil.webServiceInvocation(processInstance, "shipping", "lns:shippingCallbackPT", "sendSchedule", "<scheduleMessage><schedule>SCHEDULE</schedule></scheduleMessage>");
+ BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "lns:invoiceCallbackPT", "sendInvoice", "<InvMessage><IVC>INVOICE</IVC></InvMessage>");
// reply to web service invocation
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "sendShippingSchedule");
More information about the jboss-svn-commits
mailing list