[jboss-svn-commits] JBL Code SVN: r21310 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/base/mvel and 12 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Jul 31 07:16:10 EDT 2008
Author: KrisVerlaenen
Date: 2008-07-31 07:16:10 -0400 (Thu, 31 Jul 2008)
New Revision: 21310
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventTransformer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELExit.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELIf.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRepeatUntil.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/BPELExitInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELIfInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELRepeatUntilInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XMLDataType.java
Removed:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ActionContext.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.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/BPELSwitchInstance.java
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Action.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReturnValueEvaluator.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/ExtendedNodeInstanceImpl.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ReturnValueConstraintEvaluator.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/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-core/src/test/java/org/drools/process/ForEachTest.java
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/BPELEmpty.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.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/BPELFlowInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELLinkManager.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/BPELReceiveInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSequenceInstance.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
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf
labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCompilerTest.java
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/BPELTestUtil.java
Log:
Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel 2008-07-31 11:16:10 UTC (rev 21310)
@@ -423,7 +423,7 @@
{
private static final long serialVersionUID = 400L;
- public Object evaluate(org.drools.WorkingMemory workingMemory) throws Exception {
+ public Object evaluate(org.drools.WorkingMemory workingMemory, org.drools.spi.ProcessContext) throws Exception {
@foreach{type : globalTypes, identifier : globals} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
@end{}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -10,7 +10,7 @@
import org.drools.rule.MVELDialectRuntimeData;
import org.drools.rule.Package;
import org.drools.spi.Action;
-import org.drools.spi.ActionContext;
+import org.drools.spi.ProcessContext;
import org.drools.spi.KnowledgeHelper;
import org.mvel.MVEL;
import org.mvel.compiler.CompiledExpression;
@@ -49,7 +49,7 @@
return "mvel";
}
- public void execute(final KnowledgeHelper knowledgeHelper, final WorkingMemory workingMemory, ActionContext context) throws Exception {
+ public void execute(final KnowledgeHelper knowledgeHelper, final WorkingMemory workingMemory, ProcessContext context) throws Exception {
// must clone to avoid concurrency problems
DroolsMVELFactory factory = (DroolsMVELFactory) this.prototype.clone();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -1,19 +1,20 @@
package org.drools.base.mvel;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+
import org.drools.WorkingMemory;
import org.drools.rule.MVELDialectRuntimeData;
import org.drools.rule.Package;
+import org.drools.spi.ProcessContext;
import org.drools.spi.ReturnValueEvaluator;
import org.mvel.MVEL;
import org.mvel.compiler.CompiledExpression;
import org.mvel.debug.DebugTools;
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serializable;
-
public class MVELReturnValueEvaluator
implements
ReturnValueEvaluator,
@@ -49,7 +50,7 @@
return this.id;
}
- public Object evaluate(final WorkingMemory workingMemory) throws Exception {
+ public Object evaluate(final WorkingMemory workingMemory, ProcessContext context) throws Exception {
DroolsMVELFactory factory = (DroolsMVELFactory) this.prototype.clone();
factory.setContext( null,
null,
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventTransformer.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,7 @@
+package org.drools.process.core.event;
+
+public interface EventTransformer {
+
+ Object transformEvent(Object event);
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Action.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Action.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Action.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -4,6 +4,6 @@
public interface Action {
- void execute(final KnowledgeHelper knowledgeHelper, final WorkingMemory workingMemory, ActionContext context) throws Exception;
+ void execute(final KnowledgeHelper knowledgeHelper, final WorkingMemory workingMemory, ProcessContext context) throws Exception;
}
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ActionContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ActionContext.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ActionContext.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -1,27 +0,0 @@
-package org.drools.spi;
-
-import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.context.variable.VariableScopeInstance;
-import org.drools.workflow.instance.NodeInstance;
-
-public class ActionContext {
-
- private NodeInstance nodeInstance;
-
- public NodeInstance getNodeInstance() {
- return nodeInstance;
- }
-
- public void setNodeInstance(NodeInstance nodeInstance) {
- this.nodeInstance = nodeInstance;
- }
-
- public Object getVariable(String variableName) {
- VariableScopeInstance variableScope = (VariableScopeInstance) nodeInstance.resolveContextInstance(VariableScope.VARIABLE_SCOPE, variableName);
- if (variableScope == null) {
- return null;
- }
- return variableScope.getVariable(variableName);
- }
-
-}
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java (from rev 21255, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ActionContext.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,27 @@
+package org.drools.spi;
+
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.workflow.instance.NodeInstance;
+
+public class ProcessContext {
+
+ private NodeInstance nodeInstance;
+
+ public NodeInstance getNodeInstance() {
+ return nodeInstance;
+ }
+
+ public void setNodeInstance(NodeInstance nodeInstance) {
+ this.nodeInstance = nodeInstance;
+ }
+
+ public Object getVariable(String variableName) {
+ VariableScopeInstance variableScope = (VariableScopeInstance) nodeInstance.resolveContextInstance(VariableScope.VARIABLE_SCOPE, variableName);
+ if (variableScope == null) {
+ return null;
+ }
+ return variableScope.getVariable(variableName);
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReturnValueEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReturnValueEvaluator.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReturnValueEvaluator.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -4,5 +4,5 @@
public interface ReturnValueEvaluator {
- public Object evaluate(WorkingMemory workingMemory) throws Exception;
+ public Object evaluate(WorkingMemory workingMemory, ProcessContext processContext) throws Exception;
}
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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -4,6 +4,7 @@
import java.util.List;
import org.drools.process.core.event.EventFilter;
+import org.drools.process.core.event.EventTransformer;
import org.drools.workflow.core.Connection;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.impl.NodeImpl;
@@ -13,6 +14,7 @@
private static final long serialVersionUID = 4L;
private List<EventFilter> filters = new ArrayList<EventFilter>();
+ private EventTransformer transformer;
private String variableName;
public String getVariableName() {
@@ -48,16 +50,19 @@
return true;
}
+ public void setEventTransformer(EventTransformer transformer) {
+ this.transformer = transformer;
+ }
+
+ public EventTransformer getEventTransformer() {
+ return transformer;
+ }
+
public void validateAddIncomingConnection(final String type, final Connection connection) {
throw new UnsupportedOperationException(
"An event node does not have an incoming connection!");
}
- public void validateRemoveIncomingConnection(final String type, final Connection connection) {
- throw new UnsupportedOperationException(
- "An event node does not have an incoming connection!");
- }
-
public void validateAddOutgoingConnection(final String type, final Connection connection) {
super.validateAddOutgoingConnection(type, connection);
if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
Modified: 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 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ExtendedNodeInstanceImpl.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -9,7 +9,7 @@
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.ActionContext;
+import org.drools.spi.ProcessContext;
import org.drools.spi.KnowledgeHelper;
import org.drools.workflow.core.DroolsAction;
import org.drools.workflow.core.impl.ExtendedNodeImpl;
@@ -42,7 +42,7 @@
}
for (DroolsAction droolsAction: actions) {
Action action = (Action) droolsAction.getMetaData("Action");
- ActionContext context = new ActionContext();
+ ProcessContext context = new ProcessContext();
context.setNodeInstance(this);
try {
action.execute(knowledgeHelper, workingMemory, context);
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ReturnValueConstraintEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ReturnValueConstraintEvaluator.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ReturnValueConstraintEvaluator.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -18,6 +18,7 @@
import java.io.Serializable;
+import org.drools.spi.ProcessContext;
import org.drools.spi.ReturnValueEvaluator;
import org.drools.workflow.core.Connection;
import org.drools.workflow.core.Constraint;
@@ -94,7 +95,10 @@
Constraint constraint) {
Object value;
try {
- value = this.evaluator.evaluate( instance.getProcessInstance().getWorkingMemory() );
+ ProcessContext context = new ProcessContext();
+ context.setNodeInstance(instance);
+ value = this.evaluator.evaluate(
+ instance.getProcessInstance().getWorkingMemory(), context );
} catch ( Exception e ) {
throw new RuntimeException("unable to execute ReturnValueEvaluator", e);
}
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-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ActionNodeInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -21,7 +21,7 @@
import org.drools.base.SequentialKnowledgeHelper;
import org.drools.common.InternalRuleBase;
import org.drools.spi.Action;
-import org.drools.spi.ActionContext;
+import org.drools.spi.ProcessContext;
import org.drools.spi.KnowledgeHelper;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.node.ActionNode;
@@ -49,7 +49,7 @@
Action action = (Action) getActionNode().getAction().getMetaData("Action");
try {
KnowledgeHelper knowledgeHelper = createKnowledgeHelper();
- ActionContext context = new ActionContext();
+ ProcessContext context = new ProcessContext();
context.setNodeInstance(this);
action.execute(knowledgeHelper, getProcessInstance().getWorkingMemory(), context);
} catch (Exception e) {
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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -60,7 +60,8 @@
for (Iterator<Connection> iterator = connections.iterator(); iterator.hasNext(); ) {
Connection connection = iterator.next();
if ((connection.getFrom() instanceof CompositeNode.CompositeNodeStart) &&
- ((CompositeNode.CompositeNodeStart) connection.getFrom()).getInNode().getId() == from.getNodeId()) {
+ (from == null ||
+ ((CompositeNode.CompositeNodeStart) connection.getFrom()).getInNode().getId() == from.getNodeId())) {
NodeInstance nodeInstance = getNodeInstance(connection.getFrom());
nodeInstance.trigger(null, nodeAndType.getType());
return;
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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -17,6 +17,7 @@
*/
import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.core.event.EventTransformer;
import org.drools.process.instance.context.variable.VariableScopeInstance;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.node.EventNode;
@@ -41,6 +42,10 @@
throw new IllegalArgumentException(
"Could not find variable for event node: " + variableName);
}
+ EventTransformer transformer = getEventNode().getEventTransformer();
+ if (transformer != null) {
+ event = transformer.transformEvent(event);
+ }
variableScopeInstance.setVariable(variableName, event);
}
trigger(null, null);
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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -17,7 +17,7 @@
import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.ruleflow.core.RuleFlowProcess;
import org.drools.spi.Action;
-import org.drools.spi.ActionContext;
+import org.drools.spi.ProcessContext;
import org.drools.spi.KnowledgeHelper;
import org.drools.workflow.core.DroolsAction;
import org.drools.workflow.core.Node;
@@ -75,7 +75,7 @@
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 {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
myList.add("Executed action");
}
@@ -174,7 +174,7 @@
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 {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
myList.add("Executed action");
}
@@ -244,7 +244,7 @@
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 {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
myList.add("Executed action");
}
@@ -269,7 +269,7 @@
actionNode2.setName("Print");
action = new DroolsConsequenceAction("java", null);
action.setMetaData("Action", new Action() {
- public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
System.out.println("Detected other event for person " + ((Person) context.getVariable("event")).getName());
myList.add("Executed action");
}
@@ -360,7 +360,7 @@
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 {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
myList.add("Executed action");
}
});
@@ -383,7 +383,7 @@
actionNode2.setName("Print");
action = new DroolsConsequenceAction("java", null);
action.setMetaData("Action", new Action() {
- public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
myList.add("Executed action");
}
});
@@ -478,7 +478,7 @@
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 {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
myList.add("Executed action");
}
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-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -18,7 +18,7 @@
import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.ruleflow.core.RuleFlowProcess;
import org.drools.spi.Action;
-import org.drools.spi.ActionContext;
+import org.drools.spi.ProcessContext;
import org.drools.spi.KnowledgeHelper;
import org.drools.workflow.core.DroolsAction;
import org.drools.workflow.core.Node;
@@ -76,7 +76,7 @@
actionNode.setName("Print child");
DroolsAction action = new DroolsConsequenceAction("java", null);
action.setMetaData("Action", new Action() {
- public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
System.out.println("Executed action for child " + ((Person) context.getVariable("child")).getName());
myList.add("Executed action");
}
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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -13,6 +13,7 @@
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.IfActivity;
import org.apache.ode.bpel.compiler.bom.InvokeActivity;
import org.apache.ode.bpel.compiler.bom.Link;
import org.apache.ode.bpel.compiler.bom.LinkSource;
@@ -22,34 +23,40 @@
import org.apache.ode.bpel.compiler.bom.PickActivity;
import org.apache.ode.bpel.compiler.bom.Process;
import org.apache.ode.bpel.compiler.bom.ReceiveActivity;
+import org.apache.ode.bpel.compiler.bom.RepeatUntilActivity;
import org.apache.ode.bpel.compiler.bom.ReplyActivity;
import org.apache.ode.bpel.compiler.bom.ScopeActivity;
import org.apache.ode.bpel.compiler.bom.SequenceActivity;
import org.apache.ode.bpel.compiler.bom.SwitchActivity;
+import org.apache.ode.bpel.compiler.bom.TerminateActivity;
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.DOMUtils;
import org.apache.ode.utils.StreamUtils;
import org.drools.RuleBase;
import org.drools.bpel.core.BPELActivity;
import org.drools.bpel.core.BPELAssign;
import org.drools.bpel.core.BPELEmpty;
+import org.drools.bpel.core.BPELExit;
import org.drools.bpel.core.BPELFaultHandler;
import org.drools.bpel.core.BPELFlow;
+import org.drools.bpel.core.BPELIf;
import org.drools.bpel.core.BPELInvoke;
import org.drools.bpel.core.BPELPick;
import org.drools.bpel.core.BPELProcess;
import org.drools.bpel.core.BPELReceive;
+import org.drools.bpel.core.BPELRepeatUntil;
import org.drools.bpel.core.BPELReply;
import org.drools.bpel.core.BPELScope;
import org.drools.bpel.core.BPELSequence;
-import org.drools.bpel.core.BPELSwitch;
import org.drools.bpel.core.BPELThrow;
import org.drools.bpel.core.BPELWait;
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.XMLDataType;
import org.drools.bpel.xpath.XPathDialectConfiguration;
import org.drools.common.AbstractRuleBase;
import org.drools.compiler.DroolsError;
@@ -58,7 +65,7 @@
import org.drools.compiler.ProcessBuilder;
import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.core.datatype.impl.type.StringDataType;
+import org.drools.process.core.datatype.DataType;
import org.xml.sax.InputSource;
public class BPELCompiler {
@@ -97,6 +104,7 @@
result.setId(process.getTargetNamespace());
result.setPackageName("org.drools.bpel");
result.setVersion("1.0");
+ result.setNamespaceContext(process.getNamespaceContext());
BPELActivity activity = compileActivity(process.getRootActivity());
result.setActivity(activity);
// variables
@@ -105,7 +113,7 @@
for (org.apache.ode.bpel.compiler.bom.Variable variable: process.getVariables()) {
Variable bpelVariable = new Variable();
bpelVariable.setName(variable.getName());
- bpelVariable.setType(new StringDataType());
+ bpelVariable.setType(getDataType(variable.getTypeName().toString()));
variables.add(bpelVariable);
}
variableScope.setVariables(variables);
@@ -130,9 +138,10 @@
ReceiveActivity receiveActivity = (ReceiveActivity) activity;
BPELReceive receive = new BPELReceive();
receive.setCreateInstance(receiveActivity.isCreateInstance());
- receive.setPartnerLink(receiveActivity.getPartnerLink());
- receive.setPortType(receiveActivity.getPortType().toString());
- receive.setOperation(receiveActivity.getOperation());
+ receive.setOperation(
+ receiveActivity.getPartnerLink(),
+ receiveActivity.getPortType().toString(),
+ receiveActivity.getOperation());
receive.setVariable(receiveActivity.getVariable());
result = receive;
} else if (activity instanceof ReplyActivity) {
@@ -191,15 +200,20 @@
if (from.isVariableVal()) {
BPELAssign.VariablePart bpelFrom = assign.new VariablePart(
from.getAsVariableVal().getVariable(),
- from.getAsVariableVal().getNamespaceContext().toString() + ":" + from.getAsVariableVal().getPart());
+ from.getAsVariableVal().getPart());
bpelCopy.setFrom(bpelFrom);
+ } else if (from.isLiteralVal()) {
+ BPELAssign.LiteralValue bpelFrom = assign.new LiteralValue(
+ DOMUtils.domToString(from.getAsLiteralVal().getLiteral().getFirstChild()));
+ bpelCopy.setFrom(bpelFrom);
} else {
- throw new UnsupportedOperationException("Assign from does not yet support non-variable values");
+ BPELAssign.Expression bpelFrom = assign.new Expression(from.getAsExpression().toString());
+ bpelCopy.setFrom(bpelFrom);
}
if (to.isVariableVal()) {
BPELAssign.VariablePart bpelTo = assign.new VariablePart(
to.getAsVariableVal().getVariable(),
- to.getAsVariableVal().getNamespaceContext().toString() + ":" + to.getAsVariableVal().getPart());
+ to.getAsVariableVal().getPart());
bpelCopy.setTo(bpelTo);
} else {
throw new UnsupportedOperationException("Assign to does not yet support non-variable values");
@@ -247,7 +261,7 @@
for (org.apache.ode.bpel.compiler.bom.Variable variable: scopeActivity.getScope().getVariables()) {
Variable bpelVariable = new Variable();
bpelVariable.setName(variable.getName());
- bpelVariable.setType(new StringDataType());
+ bpelVariable.setType(getDataType(variable.getTypeName().toString()));
variables.add(bpelVariable);
}
variableScope.setVariables(variables);
@@ -264,11 +278,21 @@
result = scope;
} else if (activity instanceof SwitchActivity) {
SwitchActivity switchActivity = (SwitchActivity) activity;
- BPELSwitch bpelSwitch = new BPELSwitch();
+ BPELIf bpelSwitch = new BPELIf();
for (SwitchActivity.Case bpelCase: switchActivity.getCases()) {
bpelSwitch.addCase(bpelCase.getCondition().toString(), compileActivity(bpelCase.getActivity()));
}
result = bpelSwitch;
+ } else if (activity instanceof IfActivity) {
+ IfActivity ifActivity = (IfActivity) activity;
+ BPELIf bpelSwitch = new BPELIf();
+ bpelSwitch.addCase(ifActivity.getCondition().toString(), compileActivity(ifActivity.getActivity()));
+ for (IfActivity.Case bpelCase: ifActivity.getCases()) {
+ bpelSwitch.addCase(
+ bpelCase.getCondition() == null ? null : bpelCase.getCondition().toString(),
+ compileActivity(bpelCase.getActivity()));
+ }
+ result = bpelSwitch;
} else if (activity instanceof WaitActivity) {
WaitActivity waitActivity = (WaitActivity) activity;
BPELWait wait = new BPELWait();
@@ -286,10 +310,17 @@
whileActivity.getCondition().toString(),
compileActivity(whileActivity.getActivity()));
result = bpelWhile;
+ } else if (activity instanceof RepeatUntilActivity) {
+ RepeatUntilActivity repeatUntilActivity = (RepeatUntilActivity) activity;
+ BPELRepeatUntil bpelRepeatUntil = new BPELRepeatUntil();
+ bpelRepeatUntil.setActivity(compileActivity(repeatUntilActivity.getActivity()));
+ bpelRepeatUntil.setCondition(repeatUntilActivity.getCondition().toString());
+ result = bpelRepeatUntil;
+ } else if (activity instanceof TerminateActivity) {
+ result = new BPELExit();
} else {
// TODO: compensate
- // TODO: exit
- // BPEL2.0: If, RepeatUntil, CompensateScope, Rethrow, Validate
+ // BPEL2.0: ForEach, CompensateScope, Rethrow, Validate
throw new IllegalArgumentException("Unknown activity type " + activity.getClass());
}
result.setName(activity.getName());
@@ -315,5 +346,11 @@
}
return result;
}
+
+ private DataType getDataType(String typeName) {
+ XMLDataType result = new XMLDataType();
+ result.setTypeDefinition(typeName);
+ 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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -72,28 +72,34 @@
public class Copy {
- private VariablePart from;
- private VariablePart to;
+ private From from;
+ private To to;
- public VariablePart getFrom() {
+ public From getFrom() {
return from;
}
- public void setFrom(VariablePart from) {
+ public void setFrom(From from) {
this.from = from;
}
- public VariablePart getTo() {
+ public To getTo() {
return to;
}
- public void setTo(VariablePart to) {
+ public void setTo(To to) {
this.to = to;
}
}
- public class VariablePart {
+ public interface From {
+ }
+
+ public interface To {
+ }
+
+ public class VariablePart implements From, To {
private String variable;
private String part;
@@ -112,5 +118,33 @@
}
}
+
+ public class LiteralValue implements From {
+
+ private String value;
+
+ public LiteralValue(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ }
+ public class Expression implements From {
+
+ private String expression;
+
+ public Expression(String expression) {
+ this.expression = expression;
+ }
+
+ public String getExpression() {
+ return expression;
+ }
+
+ }
+
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELEmpty.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELEmpty.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELEmpty.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -15,7 +15,7 @@
private TargetLink[] targetLinks;
public BPELEmpty() {
- this.setAction(new DroolsConsequenceAction("java", ""));
+ this.setAction(new DroolsConsequenceAction("mvel", ""));
}
public SourceLink[] getSourceLinks() {
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELExit.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELExit.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELExit.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,28 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.node.EndNode;
+
+public class BPELExit extends EndNode implements BPELActivity {
+
+ private static final long serialVersionUID = 4L;
+
+ private SourceLink[] sourceLinks;
+ private TargetLink[] targetLinks;
+
+ public SourceLink[] getSourceLinks() {
+ return sourceLinks;
+ }
+
+ public void setSourceLinks(SourceLink[] sourceLinks) {
+ this.sourceLinks = sourceLinks;
+ }
+
+ public TargetLink[] getTargetLinks() {
+ return targetLinks;
+ }
+
+ public void setTargetLinks(TargetLink[] targetLinks) {
+ this.targetLinks = targetLinks;
+ }
+
+}
Copied: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELIf.java (from rev 21241, labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.java)
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELIf.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELIf.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,83 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.ConstraintImpl;
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELIf extends CompositeNode implements BPELActivity {
+
+ private static final long serialVersionUID = 400L;
+
+ private Split split;
+ private Join join;
+ private SourceLink[] sourceLinks;
+ private TargetLink[] targetLinks;
+
+ public BPELIf() {
+ split = new Split();
+ split.setType(Split.TYPE_XOR);
+ split.setMetaData("hidden", true);
+ addNode(split);
+ join = new Join();
+ join.setType(Join.TYPE_XOR);
+ join.setMetaData("hidden", true);
+ addNode(join);
+ linkIncomingConnections(
+ Node.CONNECTION_DEFAULT_TYPE,
+ new CompositeNode.NodeAndType(
+ split, Node.CONNECTION_DEFAULT_TYPE));
+ linkOutgoingConnections(
+ new CompositeNode.NodeAndType(
+ join, Node.CONNECTION_DEFAULT_TYPE),
+ Node.CONNECTION_DEFAULT_TYPE);
+ ConnectionImpl connection = new ConnectionImpl(
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE);
+ ConstraintImpl constraint = new ConstraintImpl();
+ constraint.setConstraint("true");
+ constraint.setType("code");
+ constraint.setDialect("mvel");
+ constraint.setPriority(Integer.MAX_VALUE - 1);
+ split.setConstraint(connection, constraint);
+ }
+
+ public void addCase(String expression, BPELActivity activity) {
+ addNode(activity);
+ ConnectionImpl connection = new ConnectionImpl(
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ activity, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ activity, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE);
+ ConstraintImpl constraint = new ConstraintImpl();
+ constraint.setConstraint(expression == null ? "true" : expression);
+ constraint.setType("code");
+ constraint.setDialect(expression == null ? "mvel" : "XPath2.0");
+ constraint.setPriority(getNodes().length - 2);
+ split.setConstraint(connection, constraint);
+ }
+
+ public SourceLink[] getSourceLinks() {
+ return sourceLinks;
+ }
+
+ public void setSourceLinks(SourceLink[] sourceLinks) {
+ this.sourceLinks = sourceLinks;
+ }
+
+ public TargetLink[] getTargetLinks() {
+ return targetLinks;
+ }
+
+ public void setTargetLinks(TargetLink[] targetLinks) {
+ this.targetLinks = targetLinks;
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -2,12 +2,15 @@
import java.util.List;
+import javax.xml.namespace.NamespaceContext;
+
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.impl.ConnectionImpl;
import org.drools.workflow.core.impl.WorkflowProcessImpl;
import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.StartNode;
/**
@@ -21,6 +24,7 @@
public static final String BPEL_TYPE = "BPEL";
private BPELActivity activity;
+ private NamespaceContext namespaceContext;
public BPELProcess() {
setType(BPEL_TYPE);
@@ -45,8 +49,15 @@
this.activity = activity;
activity.setId(1);
addNode(activity);
+ StartNode start = new StartNode();
+ start.setMetaData("hidden", true);
+ start.setId(2);
+ addNode(start);
+ new ConnectionImpl(
+ start, Node.CONNECTION_DEFAULT_TYPE,
+ activity, Node.CONNECTION_DEFAULT_TYPE);
EndNode end = new EndNode();
- end.setId(2);
+ end.setId(3);
end.setMetaData("hidden", true);
addNode(end);
new ConnectionImpl(
@@ -70,5 +81,13 @@
}
// TODO: process should end once fault handler has been executed
}
+
+ public NamespaceContext getNamespaceContext() {
+ return namespaceContext;
+ }
+
+ public void setNamespaceContext(NamespaceContext namespaceContext) {
+ this.namespaceContext = namespaceContext;
+ }
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -5,12 +5,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.node.EventNodeInterface;
/**
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class BPELReceive extends NodeImpl implements BPELActivity {
+public class BPELReceive extends NodeImpl implements BPELActivity, EventNodeInterface {
private static final long serialVersionUID = 400L;
@@ -23,38 +24,20 @@
private TargetLink[] targetLinks;
private BPELCorrelation[] correlations;
- public String getPartnerLink() {
- return partnerLink;
+ public void setOperation(String partnerLink, String portType, String operation) {
+ this.partnerLink = partnerLink;
+ this.portType = portType;
+ this.operation = operation;
}
-
- public void setPartnerLink(String partnerLink) {
- this.partnerLink = partnerLink;
+
+ public void setVariable(String variable) {
+ this.variable = variable;
}
-
- public String getPortType() {
- return portType;
- }
-
- public void setPortType(String portType) {
- this.portType = portType;
- }
-
- public String getOperation() {
- return operation;
- }
-
- public void setOperation(String operation) {
- this.operation = operation;
- }
-
+
public String getVariable() {
- return variable;
+ return variable;
}
- public void setVariable(String variable) {
- this.variable = variable;
- }
-
public boolean isCreateInstance() {
return createInstance;
}
@@ -96,4 +79,12 @@
this.correlations = correlations;
}
+ public boolean acceptsEvent(String type, Object event) {
+ if ("message".equals(type)) {
+ String[] message = (String[]) event;
+ return partnerLink.equals(message[0]) && portType.equals(message[1]) && operation.equals(message[2]);
+ }
+ return false;
+ }
+
}
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRepeatUntil.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRepeatUntil.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRepeatUntil.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,92 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.ConstraintImpl;
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELRepeatUntil extends CompositeNode implements BPELActivity {
+
+ private static final long serialVersionUID = 400L;
+
+ private Join join;
+ private Split split;
+ private SourceLink[] sourceLinks;
+ private TargetLink[] targetLinks;
+
+ public BPELRepeatUntil() {
+ join = new Join();
+ join.setType(Join.TYPE_XOR);
+ join.setMetaData("hidden", true);
+ addNode(join);
+ split = new Split();
+ split.setType(Split.TYPE_XOR);
+ split.setMetaData("hidden", true);
+ addNode(split);
+ linkIncomingConnections(
+ Node.CONNECTION_DEFAULT_TYPE,
+ new CompositeNode.NodeAndType(
+ join, Node.CONNECTION_DEFAULT_TYPE));
+ }
+
+ public void setCondition(String condition) {
+ BPELEmpty empty = new BPELEmpty();
+ empty.setMetaData("hidden", true);
+ addNode(empty);
+ linkOutgoingConnections(
+ new CompositeNode.NodeAndType(
+ empty, Node.CONNECTION_DEFAULT_TYPE),
+ Node.CONNECTION_DEFAULT_TYPE);
+ ConnectionImpl connection = new ConnectionImpl(
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ empty, Node.CONNECTION_DEFAULT_TYPE);
+ ConstraintImpl constraint = new ConstraintImpl();
+ constraint.setConstraint("true");
+ constraint.setType("code");
+ constraint.setDialect("mvel");
+ constraint.setPriority(Integer.MAX_VALUE - 1);
+ split.setConstraint(connection, constraint);
+ connection = new ConnectionImpl(
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE);
+ constraint = new ConstraintImpl();
+ constraint.setConstraint(condition);
+ constraint.setType("code");
+ constraint.setDialect("XPath2.0");
+ constraint.setPriority(getNodes().length - 2);
+ split.setConstraint(connection, constraint);
+ }
+
+ public void setActivity(BPELActivity activity) {
+ addNode(activity);
+ new ConnectionImpl(
+ join, Node.CONNECTION_DEFAULT_TYPE,
+ activity, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ activity, Node.CONNECTION_DEFAULT_TYPE,
+ split, Node.CONNECTION_DEFAULT_TYPE);
+ }
+
+ public SourceLink[] getSourceLinks() {
+ return sourceLinks;
+ }
+
+ public void setSourceLinks(SourceLink[] sourceLinks) {
+ this.sourceLinks = sourceLinks;
+ }
+
+ public TargetLink[] getTargetLinks() {
+ return targetLinks;
+ }
+
+ public void setTargetLinks(TargetLink[] targetLinks) {
+ this.targetLinks = targetLinks;
+ }
+
+}
Deleted: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -1,74 +0,0 @@
-package org.drools.bpel.core;
-
-import org.drools.workflow.core.Node;
-import org.drools.workflow.core.impl.ConnectionImpl;
-import org.drools.workflow.core.impl.ConstraintImpl;
-import org.drools.workflow.core.node.CompositeNode;
-import org.drools.workflow.core.node.Join;
-import org.drools.workflow.core.node.Split;
-
-/**
- *
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public class BPELSwitch extends CompositeNode implements BPELActivity {
-
- private static final long serialVersionUID = 400L;
-
- private Split split;
- private Join join;
- private SourceLink[] sourceLinks;
- private TargetLink[] targetLinks;
-
- public BPELSwitch() {
- split = new Split();
- split.setType(Split.TYPE_XOR);
- split.setMetaData("hidden", true);
- addNode(split);
- join = new Join();
- join.setType(Join.TYPE_XOR);
- join.setMetaData("hidden", true);
- addNode(join);
- linkIncomingConnections(
- Node.CONNECTION_DEFAULT_TYPE,
- new CompositeNode.NodeAndType(
- split, Node.CONNECTION_DEFAULT_TYPE));
- linkOutgoingConnections(
- new CompositeNode.NodeAndType(
- join, Node.CONNECTION_DEFAULT_TYPE),
- Node.CONNECTION_DEFAULT_TYPE);
- }
-
- public void addCase(String expression, BPELActivity activity) {
- addNode(activity);
- ConnectionImpl connection = new ConnectionImpl(
- split, Node.CONNECTION_DEFAULT_TYPE,
- activity, Node.CONNECTION_DEFAULT_TYPE);
- new ConnectionImpl(
- activity, Node.CONNECTION_DEFAULT_TYPE,
- join, Node.CONNECTION_DEFAULT_TYPE);
- ConstraintImpl constraint = new ConstraintImpl();
- constraint.setConstraint(expression);
- constraint.setType("code");
- constraint.setDialect("XPath");
- constraint.setPriority(getNodes().length - 2);
- split.setConstraint(connection, constraint);
- }
-
- public SourceLink[] getSourceLinks() {
- return sourceLinks;
- }
-
- public void setSourceLinks(SourceLink[] sourceLinks) {
- this.sourceLinks = sourceLinks;
- }
-
- public TargetLink[] getTargetLinks() {
- return targetLinks;
- }
-
- public void setTargetLinks(TargetLink[] targetLinks) {
- this.targetLinks = targetLinks;
- }
-
-}
Deleted: 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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -1,90 +0,0 @@
-package org.drools.bpel.core;
-
-import org.drools.workflow.core.Node;
-import org.drools.workflow.core.impl.ConnectionImpl;
-import org.drools.workflow.core.impl.ConstraintImpl;
-import org.drools.workflow.core.node.CompositeNode;
-import org.drools.workflow.core.node.Join;
-import org.drools.workflow.core.node.Split;
-
-/**
- *
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public class BPELWhile extends CompositeNode implements BPELActivity {
-
- private static final long serialVersionUID = 400L;
-
- private Join join;
- private Split split;
- private SourceLink[] sourceLinks;
- private TargetLink[] targetLinks;
-
- public BPELWhile() {
- join = new Join();
- join.setType(Join.TYPE_XOR);
- join.setMetaData("hidden", true);
- addNode(join);
- split = new Split();
- split.setType(Split.TYPE_XOR);
- split.setMetaData("hidden", true);
- addNode(split);
- BPELEmpty empty = new BPELEmpty();
- empty.setMetaData("hidden", true);
- addNode(empty);
- linkIncomingConnections(
- Node.CONNECTION_DEFAULT_TYPE,
- new CompositeNode.NodeAndType(
- join, Node.CONNECTION_DEFAULT_TYPE));
- linkOutgoingConnections(
- new CompositeNode.NodeAndType(
- empty, Node.CONNECTION_DEFAULT_TYPE),
- Node.CONNECTION_DEFAULT_TYPE);
- new ConnectionImpl(
- join, Node.CONNECTION_DEFAULT_TYPE,
- split, Node.CONNECTION_DEFAULT_TYPE);
- ConnectionImpl connection = new ConnectionImpl(
- split, Node.CONNECTION_DEFAULT_TYPE,
- empty, Node.CONNECTION_DEFAULT_TYPE);
- ConstraintImpl constraint = new ConstraintImpl();
- constraint.setConstraint("true");
- constraint.setType("code");
- constraint.setDialect("mvel");
- constraint.setPriority(Integer.MAX_VALUE - 1);
- split.setConstraint(connection, constraint);
- }
-
- public void setActivity(String condition, BPELActivity activity) {
- addNode(activity);
- ConnectionImpl connection = new ConnectionImpl(
- split, Node.CONNECTION_DEFAULT_TYPE,
- activity, Node.CONNECTION_DEFAULT_TYPE);
- new ConnectionImpl(
- activity, Node.CONNECTION_DEFAULT_TYPE,
- join, Node.CONNECTION_DEFAULT_TYPE);
- ConstraintImpl constraint = new ConstraintImpl();
- // TODO While constraint dialect
- constraint.setConstraint(condition);
- constraint.setType("code");
- constraint.setDialect("XPath2.0");
- constraint.setPriority(getNodes().length - 2);
- split.setConstraint(connection, constraint);
- }
-
- public SourceLink[] getSourceLinks() {
- return sourceLinks;
- }
-
- public void setSourceLinks(SourceLink[] sourceLinks) {
- this.sourceLinks = sourceLinks;
- }
-
- public TargetLink[] getTargetLinks() {
- return targetLinks;
- }
-
- public void setTargetLinks(TargetLink[] targetLinks) {
- this.targetLinks = targetLinks;
- }
-
-}
Added: 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 (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,89 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.ConstraintImpl;
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELWhile extends CompositeNode implements BPELActivity {
+
+ private static final long serialVersionUID = 400L;
+
+ private Join join;
+ private Split split;
+ private SourceLink[] sourceLinks;
+ private TargetLink[] targetLinks;
+
+ public BPELWhile() {
+ join = new Join();
+ join.setType(Join.TYPE_XOR);
+ join.setMetaData("hidden", true);
+ addNode(join);
+ split = new Split();
+ split.setType(Split.TYPE_XOR);
+ split.setMetaData("hidden", true);
+ addNode(split);
+ BPELEmpty empty = new BPELEmpty();
+ empty.setMetaData("hidden", true);
+ addNode(empty);
+ linkIncomingConnections(
+ Node.CONNECTION_DEFAULT_TYPE,
+ new CompositeNode.NodeAndType(
+ join, Node.CONNECTION_DEFAULT_TYPE));
+ linkOutgoingConnections(
+ new CompositeNode.NodeAndType(
+ empty, Node.CONNECTION_DEFAULT_TYPE),
+ Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ join, Node.CONNECTION_DEFAULT_TYPE,
+ split, Node.CONNECTION_DEFAULT_TYPE);
+ ConnectionImpl connection = new ConnectionImpl(
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ empty, Node.CONNECTION_DEFAULT_TYPE);
+ ConstraintImpl constraint = new ConstraintImpl();
+ constraint.setConstraint("true");
+ constraint.setType("code");
+ constraint.setDialect("mvel");
+ constraint.setPriority(Integer.MAX_VALUE - 1);
+ split.setConstraint(connection, constraint);
+ }
+
+ public void setActivity(String condition, BPELActivity activity) {
+ addNode(activity);
+ ConnectionImpl connection = new ConnectionImpl(
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ activity, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ activity, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE);
+ ConstraintImpl constraint = new ConstraintImpl();
+ constraint.setConstraint(condition);
+ constraint.setType("code");
+ constraint.setDialect("XPath2.0");
+ constraint.setPriority(getNodes().length - 2);
+ split.setConstraint(connection, constraint);
+ }
+
+ public SourceLink[] getSourceLinks() {
+ return sourceLinks;
+ }
+
+ public void setSourceLinks(SourceLink[] sourceLinks) {
+ this.sourceLinks = sourceLinks;
+ }
+
+ public TargetLink[] getTargetLinks() {
+ return targetLinks;
+ }
+
+ public void setTargetLinks(TargetLink[] targetLinks) {
+ this.targetLinks = targetLinks;
+ }
+
+}
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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -4,13 +4,21 @@
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPathConstants;
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.Expression;
+import org.drools.bpel.core.BPELAssign.From;
+import org.drools.bpel.core.BPELAssign.LiteralValue;
import org.drools.bpel.core.BPELAssign.VariablePart;
+import org.drools.bpel.xpath.XMLDataType;
+import org.drools.bpel.xpath.XPathReturnValueEvaluator;
import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.core.datatype.DataType;
import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.spi.ProcessContext;
import org.drools.workflow.core.Node;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.impl.NodeInstanceImpl;
@@ -36,39 +44,97 @@
if (BPELLinkManager.checkActivityEnabled(this)) {
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());
+ From fromPart = copy.getFrom();
+ VariablePart toPart = (VariablePart) copy.getTo();
+ Object fromValue = getValue(fromPart);
+ if (toPart.getPart() == null) {
+ setVariableValue(toPart.getVariable(), fromValue);
+ } else {
+ String toValue = getVariableValue(toPart.getVariable());
+ if (toValue == null) {
+ toValue = initializeVariable(toPart.getVariable());
+ }
+ toValue = copy(fromValue, toValue, toPart.getPart());
+ setVariableValue(toPart.getVariable(), toValue);
}
- toValue = copy(fromValue, fromPart.getPart(), toValue, toPart.getPart());
- setVariableValue(toPart.getVariable(), toValue);
}
triggerCompleted(Node.CONNECTION_DEFAULT_TYPE, true);
}
}
- private String copy(String fromValue, String fromPart, String toValue, String toPart) {
+ private Object getValue(From from) {
+ if (from instanceof VariablePart) {
+ VariablePart fromPart = (VariablePart) from;
+ String fromValue = getVariableValue(fromPart.getVariable());
+ if (fromPart.getPart() == null) {
+ return fromValue;
+ }
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document fromDocument = factory.newDocumentBuilder().parse(new ByteArrayInputStream(fromValue.getBytes()));
+ return DOMUtils.findChildByName((Element) fromDocument.getDocumentElement(), new QName(fromPart.getPart()));
+ } catch (Throwable t) {
+ throw new IllegalArgumentException("Could not get value", t);
+ }
+ } else if (from instanceof LiteralValue) {
+ return ((LiteralValue) from).getValue();
+ } else if (from instanceof Expression) {
+ String expression = ((Expression) from).getExpression();
+ try {
+ XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(expression.getBytes()));
+ org.w3c.dom.Node node = document.getFirstChild().getFirstChild();
+ if (node == null) {
+ throw new IllegalStateException();
+ }
+ if (node.getNodeType() != org.w3c.dom.Node.TEXT_NODE) {
+ throw new IllegalArgumentException("Unexpected node type for XPath");
+ }
+ String xpathString = node.getNodeValue();
+ evaluator.setExpression(xpathString);
+ ProcessContext processContext = new ProcessContext();
+ processContext.setNodeInstance(this);
+ return (String) evaluator.evaluate(getProcessInstance().getWorkingMemory(), processContext, XPathConstants.STRING);
+ } catch (Throwable t) {
+ throw new IllegalArgumentException("Could not evaluate expression " + expression, t);
+ }
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ private String copy(Object fromValue, 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);
+ if (fromValue instanceof Element) {
+ Element from = (Element) fromValue;
+ 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));
+ }
+ }
+ if (to == null) {
+ toDocument.getDocumentElement().appendChild(replacement);
+ } else {
+ to.getParentNode().replaceChild(replacement, to);
+ }
+ } else {
+ Element replacement = toDocument.createElementNS(null, toPart);
+ replacement.setTextContent((String) fromValue);
+ if (to == null) {
+ toDocument.getDocumentElement().appendChild(replacement);
+ } else {
+ to.getParentNode().replaceChild(replacement, to);
+ }
+ }
return DOMUtils.domToString(toDocument.getDocumentElement());
} catch (Throwable t) {
throw new IllegalArgumentException("Could not copy value", t);
@@ -76,8 +142,17 @@
}
private String initializeVariable(String variable) {
- // TODO
- return "<shippingRequestMessage><customerInfo></customerInfo></shippingRequestMessage>";
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
+ if (variableScopeInstance != null) {
+ DataType dataType = ((VariableScope) variableScopeInstance.getContext()).findVariable(variable).getType();
+ if (dataType instanceof XMLDataType) {
+ String type = ((XMLDataType) dataType).getTypeDefinition();
+ type = type.substring(type.lastIndexOf("}") + 1);
+ return "<" + type + "></" + type + ">";
+ }
+ }
+ return "";
}
private String getVariableValue(String variable) {
@@ -93,7 +168,7 @@
return null;
}
- private void setVariableValue(String variable, String value) {
+ private void setVariableValue(String variable, Object value) {
VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
if (variableScopeInstance != null) {
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExitInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExitInstance.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExitInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,16 @@
+package org.drools.bpel.instance;
+
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.EndNodeInstance;
+
+public class BPELExitInstance extends EndNodeInstance {
+
+ private static final long serialVersionUID = 1L;
+
+ public void internalTrigger(NodeInstance from, String type) {
+ if (BPELLinkManager.checkActivityEnabled(this)) {
+ super.internalTrigger(from, type);
+ }
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFlowInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFlowInstance.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFlowInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -6,6 +6,8 @@
import java.util.Map;
import org.drools.bpel.core.BPELFlow;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeNode;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.node.CompositeNodeInstance;
@@ -28,7 +30,7 @@
activatedLinks.add(linkName);
NodeInstance waitingActivityInstance = waitingActivityInstances.get(linkName);
if (waitingActivityInstance != null) {
- waitingActivityInstance.trigger(null, null);
+ waitingActivityInstance.trigger(null, Node.CONNECTION_DEFAULT_TYPE);
}
}
@@ -46,6 +48,13 @@
}
}
+ public void triggerEvent(String type, Object event) {
+ super.triggerEvent(type, event);
+ CompositeNode.NodeAndType nodeAndType = getCompositeNode().internalGetLinkedIncomingNode(Node.CONNECTION_DEFAULT_TYPE);
+ NodeInstance nodeInstance = getNodeInstance(nodeAndType.getNode());
+ nodeInstance.trigger(null, nodeAndType.getType());
+ }
+
public void triggerCompleted(String outType) {
super.triggerCompleted(outType);
BPELLinkManager.activateTargetLinks(this);
Copied: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELIfInstance.java (from rev 21226, labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSwitchInstance.java)
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELIfInstance.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELIfInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,24 @@
+package org.drools.bpel.instance;
+
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.CompositeNodeInstance;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELIfInstance extends CompositeNodeInstance {
+
+ private static final long serialVersionUID = 400L;
+
+ public void internalTrigger(NodeInstance from, String type) {
+ if (BPELLinkManager.checkActivityEnabled(this)) {
+ super.internalTrigger(from, type);
+ }
+ }
+
+ public void triggerCompleted(String outType) {
+ super.triggerCompleted(outType);
+ BPELLinkManager.activateTargetLinks(this);
+ }
+}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELLinkManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELLinkManager.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELLinkManager.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -3,6 +3,8 @@
import org.drools.bpel.core.BPELActivity;
import org.drools.bpel.core.BPELActivity.SourceLink;
import org.drools.bpel.core.BPELActivity.TargetLink;
+import org.drools.bpel.xpath.XPathReturnValueEvaluator;
+import org.drools.spi.ProcessContext;
import org.drools.util.ArrayUtils;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.NodeInstanceContainer;
@@ -50,7 +52,7 @@
for (int i = 0; i < outgoingLinks.length; i++) {
BPELFlowInstance flowInstance = getFlowInstance(activityInstance, outgoingLinks[i].getLinkName());
String transitionCondition = outgoingLinks[i].getTransitionCondition();
- if (transitionCondition == null || evaluateTransitionCondition(transitionCondition)) {
+ if (transitionCondition == null || evaluateTransitionCondition(transitionCondition, activityInstance)) {
flowInstance.activateLink(outgoingLinks[i].getLinkName());
}
}
@@ -66,9 +68,16 @@
return (BPELFlowInstance) parent;
}
- private static boolean evaluateTransitionCondition(String transitionCondition) {
- // TODO SourceLink transitionCondition
- return true;
+ private static boolean evaluateTransitionCondition(String transitionCondition, NodeInstance activityInstance) {
+ try {
+ XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
+ evaluator.setExpression(transitionCondition);
+ ProcessContext processContext = new ProcessContext();
+ processContext.setNodeInstance(activityInstance);
+ return (Boolean) evaluator.evaluate(activityInstance.getProcessInstance().getWorkingMemory(), processContext);
+ } catch (Throwable t) {
+ throw new IllegalArgumentException("Could not evaluate transition condition " + transitionCondition, t);
+ }
}
}
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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -28,65 +28,65 @@
}
// TODO: unification with signalEvent
- public void acceptMessage(String partnerLink, String portType, String operation, String message) {
- if (getState() == STATE_PENDING) {
- setState(STATE_ACTIVE);
- }
- BPELReceive receive = findBPELReceive(partnerLink, portType, operation);
- if (receive == null) {
- throw new IllegalArgumentException(
- "Could not find BPELReceive for " + partnerLink + ", " + portType + ", " + operation);
- }
- BPELActivity activity = receive;
- List<BPELActivity> parents = new ArrayList<BPELActivity>();
- while (!activity.getNodeContainer().equals(getBPELProcess())) {
- activity = (BPELActivity) activity.getNodeContainer();
- parents.add(0, activity);
- }
- NodeInstanceContainer nodeInstanceContainer = this;
- for (Iterator<BPELActivity> iterator = parents.iterator(); iterator.hasNext(); ) {
- BPELActivity parent = iterator.next();
- NodeInstance nodeInstance = nodeInstanceContainer.getFirstNodeInstance(parent.getId());
- if (nodeInstance != null) {
- nodeInstanceContainer = (NodeInstanceContainer) nodeInstance;
- } else if (receive.isCreateInstance()) {
- nodeInstanceContainer = (NodeInstanceContainer) nodeInstanceContainer.getNodeInstance(parent);
- } else {
- // TODO: store message in cache of accepted messages
- return;
- }
- }
- BPELReceiveInstance bpelReceiveInstance = (BPELReceiveInstance) nodeInstanceContainer.getNodeInstance(receive);
- ((EventSupport) getWorkingMemory()).getRuleFlowEventSupport().fireBeforeRuleFlowNodeTriggered(bpelReceiveInstance, (InternalWorkingMemory) getWorkingMemory());
- bpelReceiveInstance.triggerCompleted(message);
- ((EventSupport) getWorkingMemory()).getRuleFlowEventSupport().fireAfterRuleFlowNodeTriggered(bpelReceiveInstance, (InternalWorkingMemory) getWorkingMemory());
- }
-
- private BPELReceive findBPELReceive(String partnerLink, String portType, String operation) {
- return findBPELReceive(partnerLink, portType, operation, getBPELProcess().getActivity());
- }
-
- private BPELReceive findBPELReceive(String partnerLink, String portType, String operation, Node node) {
- if (node instanceof BPELReceive) {
- BPELReceive receive = (BPELReceive) node;
- if (receive.getPartnerLink().equals(partnerLink)
- && receive.getPortType().equals(portType)
- && receive.getOperation().equals(operation)) {
- return receive;
- }
- return null;
- }
- if (node instanceof NodeContainer) {
- Node[] nodes = ((NodeContainer) node).getNodes();
- for (int i = 0; i < nodes.length; i++) {
- BPELReceive result = findBPELReceive(partnerLink, portType, operation, nodes[i]);
- if (result != null) {
- return result;
- }
- }
- }
- return null;
- }
+// public void acceptMessage(String partnerLink, String portType, String operation, String message) {
+// if (getState() == STATE_PENDING) {
+// setState(STATE_ACTIVE);
+// }
+// BPELReceive receive = findBPELReceive(partnerLink, portType, operation);
+// if (receive == null) {
+// throw new IllegalArgumentException(
+// "Could not find BPELReceive for " + partnerLink + ", " + portType + ", " + operation);
+// }
+// BPELActivity activity = receive;
+// List<BPELActivity> parents = new ArrayList<BPELActivity>();
+// while (!activity.getNodeContainer().equals(getBPELProcess())) {
+// activity = (BPELActivity) activity.getNodeContainer();
+// parents.add(0, activity);
+// }
+// NodeInstanceContainer nodeInstanceContainer = this;
+// for (Iterator<BPELActivity> iterator = parents.iterator(); iterator.hasNext(); ) {
+// BPELActivity parent = iterator.next();
+// NodeInstance nodeInstance = nodeInstanceContainer.getFirstNodeInstance(parent.getId());
+// if (nodeInstance != null) {
+// nodeInstanceContainer = (NodeInstanceContainer) nodeInstance;
+// } else if (receive.isCreateInstance()) {
+// nodeInstanceContainer = (NodeInstanceContainer) nodeInstanceContainer.getNodeInstance(parent);
+// } else {
+// // TODO: store message in cache of accepted messages
+// return;
+// }
+// }
+// BPELReceiveInstance bpelReceiveInstance = (BPELReceiveInstance) nodeInstanceContainer.getNodeInstance(receive);
+// ((EventSupport) getWorkingMemory()).getRuleFlowEventSupport().fireBeforeRuleFlowNodeTriggered(bpelReceiveInstance, (InternalWorkingMemory) getWorkingMemory());
+// bpelReceiveInstance.triggerCompleted(message);
+// ((EventSupport) getWorkingMemory()).getRuleFlowEventSupport().fireAfterRuleFlowNodeTriggered(bpelReceiveInstance, (InternalWorkingMemory) getWorkingMemory());
+// }
+//
+// private BPELReceive findBPELReceive(String partnerLink, String portType, String operation) {
+// return findBPELReceive(partnerLink, portType, operation, getBPELProcess().getActivity());
+// }
+//
+// private BPELReceive findBPELReceive(String partnerLink, String portType, String operation, Node node) {
+// if (node instanceof BPELReceive) {
+// BPELReceive receive = (BPELReceive) node;
+// if (receive.getPartnerLink().equals(partnerLink)
+// && receive.getPortType().equals(portType)
+// && receive.getOperation().equals(operation)) {
+// return receive;
+// }
+// return null;
+// }
+// if (node instanceof NodeContainer) {
+// Node[] nodes = ((NodeContainer) node).getNodes();
+// for (int i = 0; i < nodes.length; i++) {
+// BPELReceive result = findBPELReceive(partnerLink, portType, operation, nodes[i]);
+// if (result != null) {
+// return result;
+// }
+// }
+// }
+// return null;
+// }
@Override
protected void internalStart() {
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -3,30 +3,37 @@
import org.drools.bpel.core.BPELReceive;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.process.instance.context.variable.VariableScopeInstance;
-import org.drools.workflow.core.Connection;
import org.drools.workflow.core.Node;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.drools.workflow.instance.node.EventNodeInstanceInterface;
/**
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class BPELReceiveInstance extends NodeInstanceImpl {
+public class BPELReceiveInstance extends NodeInstanceImpl implements EventNodeInstanceInterface {
private static final long serialVersionUID = 400L;
+ private boolean triggered = false;
+ private boolean event = false;
+ private String message;
+
public BPELReceive getBPELReceive() {
return (BPELReceive) getNode();
}
public void internalTrigger(NodeInstance from, String type) {
if (BPELLinkManager.checkActivityEnabled(this)) {
- // TODO look in cache of already receive messages
+ triggered = true;
+ if (triggered && event) {
+ triggerCompleted();
+ }
}
}
- public void triggerCompleted(String message) {
+ public void triggerCompleted() {
String variable = getBPELReceive().getVariable();
if (variable != null) {
VariableScopeInstance variableScope = (VariableScopeInstance) resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
@@ -36,9 +43,16 @@
}
variableScope.setVariable(variable, message);
}
- Connection to = getBPELReceive().getTo();
triggerCompleted(Node.CONNECTION_DEFAULT_TYPE, true);
BPELLinkManager.activateTargetLinks(this);
}
+ public void triggerEvent(String type, Object event) {
+ this.event = true;
+ message = ((String[]) event)[3];
+ if (this.event && triggered) {
+ triggerCompleted();
+ }
+ }
+
}
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELRepeatUntilInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELRepeatUntilInstance.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELRepeatUntilInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,24 @@
+package org.drools.bpel.instance;
+
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.CompositeNodeInstance;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELRepeatUntilInstance extends CompositeNodeInstance {
+
+ private static final long serialVersionUID = 400L;
+
+ public void internalTrigger(NodeInstance from, String type) {
+ if (BPELLinkManager.checkActivityEnabled(this)) {
+ super.internalTrigger(from, type);
+ }
+ }
+
+ public void triggerCompleted(String outType) {
+ super.triggerCompleted(outType);
+ BPELLinkManager.activateTargetLinks(this);
+ }
+}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSequenceInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSequenceInstance.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSequenceInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -1,5 +1,7 @@
package org.drools.bpel.instance;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeNode;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.node.CompositeNodeInstance;
@@ -17,7 +19,7 @@
}
}
- public void triggerCompleted(String outType) {
+ public void triggerCompleted(String outType) {
super.triggerCompleted(outType);
BPELLinkManager.activateTargetLinks(this);
}
Deleted: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSwitchInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSwitchInstance.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSwitchInstance.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -1,24 +0,0 @@
-package org.drools.bpel.instance;
-
-import org.drools.workflow.instance.NodeInstance;
-import org.drools.workflow.instance.node.CompositeNodeInstance;
-
-/**
- *
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public class BPELSwitchInstance extends CompositeNodeInstance {
-
- private static final long serialVersionUID = 400L;
-
- public void internalTrigger(NodeInstance from, String type) {
- if (BPELLinkManager.checkActivityEnabled(this)) {
- super.internalTrigger(from, type);
- }
- }
-
- public void triggerCompleted(String outType) {
- super.triggerCompleted(outType);
- BPELLinkManager.activateTargetLinks(this);
- }
-}
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XMLDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XMLDataType.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XMLDataType.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -0,0 +1,33 @@
+package org.drools.bpel.xpath;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.process.core.datatype.DataType;
+
+public class XMLDataType implements DataType {
+
+ private String typeDefinition;
+
+ public boolean verifyDataType(Object value) {
+ return value instanceof String;
+ }
+
+ public String getTypeDefinition() {
+ return typeDefinition;
+ }
+
+ public void setTypeDefinition(String typeDefinition) {
+ this.typeDefinition = typeDefinition;
+ }
+
+ public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
+ typeDefinition = input.readUTF();
+ }
+
+ public void writeExternal(ObjectOutput output) throws IOException {
+ output.writeUTF(typeDefinition);
+ }
+
+}
Modified: 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 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -1,22 +1,108 @@
package org.drools.bpel.xpath;
+import java.io.ByteArrayInputStream;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.XPathFunction;
+import javax.xml.xpath.XPathFunctionException;
+import javax.xml.xpath.XPathFunctionResolver;
+import javax.xml.xpath.XPathVariableResolver;
+import net.sf.saxon.om.NamespaceConstant;
+import net.sf.saxon.xpath.XPathEvaluator;
+
+import org.apache.ode.bpel.elang.xpath20.compiler.Constants;
import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.Namespaces;
import org.drools.WorkingMemory;
+import org.drools.bpel.core.BPELProcess;
+import org.drools.spi.ProcessContext;
import org.drools.spi.ReturnValueEvaluator;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
public class XPathReturnValueEvaluator implements ReturnValueEvaluator {
- private XPathExpression expression;
+ private String expression;
- public void setExpression(XPathExpression expression) {
+ public void setExpression(String expression) {
this.expression = expression;
}
- public Object evaluate(WorkingMemory workingMemory) throws Exception {
- return expression.evaluate(DOMUtils.newDocument(), XPathConstants.BOOLEAN);
+ public Object evaluate(WorkingMemory workingMemory, final ProcessContext processContext) throws Exception {
+ return evaluate(workingMemory, processContext, XPathConstants.BOOLEAN);
}
+
+ public Object evaluate(WorkingMemory workingMemory, final ProcessContext processContext, QName type) throws Exception {
+ XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
+ xpf.setXPathFunctionResolver(new XPathFunctionResolver() {
+ public XPathFunction resolveFunction(QName functionName, int arity) {
+ if (functionName.getNamespaceURI() == null) {
+ throw new IllegalArgumentException("Undeclared namespace for " + functionName);
+ } else if (functionName.getNamespaceURI().equals(Namespaces.WSBPEL2_0_FINAL_EXEC)) {
+ String localName = functionName.getLocalPart();
+ if (Constants.EXT_FUNCTION_GETVARIABLEPROPRTY.equals(localName)) {
+ return new GetVariableProperty(processContext);
+ } else {
+ //TODO: DoXSLTransform, GetLinkStatus, GetVariableData
+ throw new IllegalArgumentException(
+ "Unknown Bpel function " + functionName.getLocalPart());
+ }
+ }
+ return null;
+ }
+ });
+ xpf.setXPathVariableResolver(new XPathVariableResolver() {
+ public Object resolveVariable(QName name) {
+ return processContext.getVariable(name.getLocalPart());
+ }
+ });
+ XPathEvaluator xpe = (XPathEvaluator) xpf.newXPath();
+ xpe.setNamespaceContext(((BPELProcess) processContext.getNodeInstance()
+ .getProcessInstance().getProcess()).getNamespaceContext());
+ XPathExpression xpathExpression = xpe.compile(expression);
+ return xpathExpression.evaluate(DOMUtils.newDocument(), type);
+ }
+
+ public class GetVariableProperty implements XPathFunction {
+
+ private ProcessContext processContext;
+
+ public GetVariableProperty(ProcessContext processContext) {
+ this.processContext = processContext;
+ }
+
+ public Object evaluate(List params) throws XPathFunctionException {
+ if (params.size() != 2) {
+ throw new IllegalArgumentException(
+ "Invalid number of arguments for the getVariable function");
+ }
+ String variableName = (String) params.get(0);
+ String propertyName = (String) params.get(1);
+ String variableValue = (String) processContext.getVariable(variableName);
+ if (variableValue == null) {
+ throw new IllegalArgumentException(
+ "Could not find variable " + variableName);
+ }
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(
+ new ByteArrayInputStream(variableValue.getBytes()));
+ Element element = DOMUtils.findChildByName(
+ (Element) document.getDocumentElement(), new QName(propertyName));
+ return DOMUtils.domToString(element.getFirstChild());
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not parse variable value " + variableValue, t);
+ }
+ }
+ }
+
+
}
Modified: 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 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -1,16 +1,25 @@
package org.drools.bpel.xpath;
import java.io.ByteArrayInputStream;
+import java.util.List;
+import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.XPathFunction;
+import javax.xml.xpath.XPathFunctionException;
+import javax.xml.xpath.XPathFunctionResolver;
+import javax.xml.xpath.XPathVariableResolver;
import net.sf.saxon.om.NamespaceConstant;
import net.sf.saxon.xpath.XPathEvaluator;
+import org.apache.ode.bpel.elang.xpath20.compiler.Constants;
+import org.apache.ode.utils.Namespaces;
+import org.drools.bpel.core.BPELProcess;
import org.drools.compiler.ReturnValueDescr;
import org.drools.rule.builder.PackageBuildContext;
+import org.drools.rule.builder.ProcessBuildContext;
import org.drools.rule.builder.ReturnValueEvaluatorBuilder;
import org.drools.workflow.instance.impl.ReturnValueConstraintEvaluator;
import org.w3c.dom.Document;
@@ -34,34 +43,48 @@
}
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;
-// }
-// });
+ xpf.setXPathFunctionResolver(new XPathFunctionResolver() {
+ public XPathFunction resolveFunction(QName functionName, int arity) {
+ if (functionName.getNamespaceURI() == null) {
+ throw new IllegalArgumentException("Undeclared namespace for " + functionName);
+ } else if (functionName.getNamespaceURI().equals(Namespaces.WSBPEL2_0_FINAL_EXEC)) {
+ String localName = functionName.getLocalPart();
+ if (Constants.EXT_FUNCTION_GETVARIABLEPROPRTY.equals(localName)) {
+ return new GetVariableProperty();
+ } else {
+ //TODO: DoXSLTransform, GetLinkStatus, GetVariableData
+ throw new IllegalArgumentException(
+ "Unknown Bpel function " + functionName.getLocalPart());
+ }
+ }
+ return null;
+ }
+ });
+ xpf.setXPathVariableResolver(new XPathVariableResolver() {
+ public Object resolveVariable(QName arg0) {
+ return "";
+ }
+ });
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);
+ xpe.setNamespaceContext(
+ ((BPELProcess) ((ProcessBuildContext) context).getProcess()).getNamespaceContext());
+ xpe.compile(xpathString);
+ evaluator.setExpression(xpathString);
returnValueConstraintEvaluator.setEvaluator(evaluator);
} catch (Throwable t) {
throw new IllegalArgumentException("Could not compile XPath expression " + returnValueDescr.getText(), t);
}
}
+
+ public class GetVariableProperty implements XPathFunction {
+
+ public Object evaluate(List params) throws XPathFunctionException {
+ if (params.size() != 2) {
+ throw new IllegalArgumentException(
+ "Invalid number of arguments for the getVariable function");
+ }
+ return "";
+ }
+ }
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf 2008-07-31 11:16:10 UTC (rev 21310)
@@ -8,10 +8,12 @@
import org.drools.bpel.core.BPELSequence;
import org.drools.bpel.core.BPELEmpty;
import org.drools.bpel.core.BPELPick;
-import org.drools.bpel.core.BPELSwitch;
+import org.drools.bpel.core.BPELIf;
import org.drools.bpel.core.BPELThrow;
import org.drools.bpel.core.BPELWait;
import org.drools.bpel.core.BPELWhile;
+import org.drools.bpel.core.BPELRepeatUntil;
+import org.drools.bpel.core.BPELExit;
import org.drools.bpel.instance.BPELAssignInstance;
import org.drools.bpel.instance.BPELFlowInstance;
import org.drools.bpel.instance.BPELInvokeInstance;
@@ -21,24 +23,28 @@
import org.drools.bpel.instance.BPELSequenceInstance;
import org.drools.bpel.instance.BPELEmptyInstance;
import org.drools.bpel.instance.BPELPickInstance;
-import org.drools.bpel.instance.BPELSwitchInstance;
+import org.drools.bpel.instance.BPELIfInstance;
import org.drools.bpel.instance.BPELThrowInstance;
import org.drools.bpel.instance.BPELWaitInstance;
import org.drools.bpel.instance.BPELWhileInstance;
-import org.drools.workflow.instance.impl.factory.CreateNewNodeFactory;
+import org.drools.bpel.instance.BPELRepeatUntilInstance;
+import org.drools.bpel.instance.BPELExitInstance;
+import org.drools.workflow.instance.impl.factory.ReuseNodeFactory;
[
- BPELAssign : new CreateNewNodeFactory( BPELAssignInstance ),
- BPELFlow : new CreateNewNodeFactory( BPELFlowInstance ),
- BPELInvoke : new CreateNewNodeFactory( BPELInvokeInstance ),
- BPELReceive : new CreateNewNodeFactory( BPELReceiveInstance ),
- BPELReply : new CreateNewNodeFactory( BPELReplyInstance ),
- BPELScope : new CreateNewNodeFactory( BPELScopeInstance ),
- BPELSequence : new CreateNewNodeFactory( BPELSequenceInstance ),
- BPELEmpty : new CreateNewNodeFactory( BPELEmptyInstance ),
- BPELPick : new CreateNewNodeFactory( BPELPickInstance ),
- BPELSwitch : new CreateNewNodeFactory( BPELSwitchInstance ),
- BPELThrow : new CreateNewNodeFactory( BPELThrowInstance ),
- BPELWait : new CreateNewNodeFactory( BPELWaitInstance ),
- BPELWhile : new CreateNewNodeFactory( BPELWhileInstance ),
+ BPELAssign : new ReuseNodeFactory( BPELAssignInstance ),
+ BPELFlow : new ReuseNodeFactory( BPELFlowInstance ),
+ BPELInvoke : new ReuseNodeFactory( BPELInvokeInstance ),
+ BPELReceive : new ReuseNodeFactory( BPELReceiveInstance ),
+ BPELReply : new ReuseNodeFactory( BPELReplyInstance ),
+ BPELScope : new ReuseNodeFactory( BPELScopeInstance ),
+ BPELSequence : new ReuseNodeFactory( BPELSequenceInstance ),
+ BPELEmpty : new ReuseNodeFactory( BPELEmptyInstance ),
+ BPELPick : new ReuseNodeFactory( BPELPickInstance ),
+ BPELIf : new ReuseNodeFactory( BPELIfInstance ),
+ BPELThrow : new ReuseNodeFactory( BPELThrowInstance ),
+ BPELWait : new ReuseNodeFactory( BPELWaitInstance ),
+ BPELWhile : new ReuseNodeFactory( BPELWhileInstance ),
+ BPELRepeatUntil : new ReuseNodeFactory( BPELRepeatUntilInstance ),
+ BPELExit : new ReuseNodeFactory( BPELExitInstance ),
]
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCompilerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCompilerTest.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCompilerTest.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -46,7 +46,8 @@
workingMemory.startProcess("http://drools.jboss.org/example/bpel/purchase");
// start process
- BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
+ BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder",
+ "<POMessage><customerInfo>Jack</customerInfo><purchaseOrder>PURCHASE_ORDER</purchaseOrder></POMessage>");
// reply to web service invocations
WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "{http://manufacturing.org/wsdl/purchase}schedulingPT", "requestProductionScheduling");
@@ -56,19 +57,19 @@
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "{http://manufacturing.org/wsdl/purchase}shippingPT", "requestShipping");
- BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "SHIPPING");
+ BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "<shippingInfoMessage><shippingInfo>SHIPPING_INFO</shippingInfo></shippingInfoMessage>");
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "{http://manufacturing.org/wsdl/purchase}computePricePT", "sendShippingPrice");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
// invoke web service callbacks
- BPELTestUtil.webServiceInvocation(processInstance, "shipping", "{http://manufacturing.org/wsdl/purchase}shippingCallbackPT", "sendSchedule", "SCHEDULE");
- BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "{http://manufacturing.org/wsdl/purchase}invoiceCallbackPT", "sendInvoice", "INVOICE");
+ BPELTestUtil.webServiceInvocation(processInstance, "shipping", "{http://manufacturing.org/wsdl/purchase}shippingCallbackPT", "sendSchedule", "<scheduleMessage><schedule>SCHEDULE</schedule></scheduleMessage>");
+ BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "{http://manufacturing.org/wsdl/purchase}invoiceCallbackPT", "sendInvoice", "<InvMessage><IVC>INVOICE</IVC></InvMessage>");
// reply to web service invocation
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "{http://manufacturing.org/wsdl/purchase}schedulingPT", "sendShippingSchedule");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
-
+
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
@@ -82,7 +83,8 @@
workingMemory.startProcess("http://drools.jboss.org/example/bpel/purchase");
// start process
- BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
+ BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder",
+ "<POMessage><customerInfo>Jack</customerInfo><purchaseOrder>PURCHASE_ORDER</purchaseOrder></POMessage>");
// reply to web service invocations
WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "{http://manufacturing.org/wsdl/purchase}schedulingPT", "requestProductionScheduling");
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-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -4,9 +4,10 @@
import java.util.List;
import java.util.Properties;
+import junit.framework.TestCase;
+
import org.drools.RuleBaseConfiguration;
import org.drools.RuleBaseFactory;
-import org.drools.audit.WorkingMemoryFileLogger;
import org.drools.bpel.core.BPELActivity;
import org.drools.bpel.core.BPELAssign;
import org.drools.bpel.core.BPELFaultHandler;
@@ -28,11 +29,12 @@
import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.process.core.datatype.impl.type.StringDataType;
+import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.WorkItem;
import org.drools.process.instance.WorkItemHandler;
import org.drools.reteoo.ReteooWorkingMemory;
-public class BPELCoreTest {
+public class BPELCoreTest extends TestCase {
public static BPELProcess getProcess() {
BPELProcess process = new BPELProcess();
@@ -74,7 +76,7 @@
// faultHandler
List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
BPELFaultHandler faultHandler = new BPELFaultHandler();
- faultHandler.setFaultName("cannotCompleteOrder");
+ faultHandler.setFaultName("lns:cannotCompleteOrder");
faultHandler.setFaultVariable("POFault");
BPELReply reply = new BPELReply();
reply.setId(++nodeId);
@@ -97,9 +99,7 @@
BPELReceive receive = new BPELReceive();
receive.setId(++nodeId);
receive.setName("Receive Purchase Order");
- receive.setPartnerLink("purchasing");
- receive.setPortType("lns:purchaseOrderPT");
- receive.setOperation("sendPurchaseOrder");
+ receive.setOperation("purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder");
receive.setVariable("PO");
receive.setCreateInstance(true);
sequenceActivities.add(receive);
@@ -142,9 +142,7 @@
BPELReceive receive1 = new BPELReceive();
receive1.setId(++nodeId);
receive1.setName("Arrange Logistics");
- receive1.setPartnerLink("shipping");
- receive1.setPortType("lns:shippingCallbackPT");
- receive1.setOperation("sendSchedule");
+ receive1.setOperation("shipping", "lns:shippingCallbackPT", "sendSchedule");
receive1.setVariable("shippingSchedule");
receive1.setCreateInstance(false);
receive1.setSourceLinks(new SourceLink[] { new SourceLink("ship-to-scheduling") });
@@ -184,9 +182,7 @@
BPELReceive receive2 = new BPELReceive();
receive2.setId(++nodeId);
receive2.setName("Receive Invoice");
- receive2.setPartnerLink("invoicing");
- receive2.setPortType("lns:invoiceCallbackPT");
- receive2.setOperation("sendInvoice");
+ receive2.setOperation("invoicing", "lns:invoiceCallbackPT", "sendInvoice");
receive2.setVariable("Invoice");
receive2.setCreateInstance(false);
sequence2Activities.add(receive2);
@@ -250,7 +246,7 @@
}
// normal execution
- public static void main(String[] args) {
+ public void testPurchaseOrderProcessNormalFlow() {
BPELProcess process = getProcess();
// execute
Properties properties = new Properties();
@@ -263,7 +259,6 @@
InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
WorkItemHandler handler = new WebServiceInvocationHandler();
workingMemory.getWorkItemManager().registerWorkItemHandler("WebServiceInvocation", handler);
- WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(workingMemory);
BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
// start process
@@ -291,11 +286,14 @@
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "sendShippingSchedule");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
- logger.writeToDisk();
+ workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder");
+ BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
}
// shipping returns fault
- public static void main1(String[] args) {
+ public static void testPurchaseOrderProcessFault() {
BPELProcess process = getProcess();
// execute
Properties properties = new Properties();
@@ -308,11 +306,11 @@
InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
WorkItemHandler handler = new WebServiceInvocationHandler();
workingMemory.getWorkItemManager().registerWorkItemHandler("WebServiceInvocation", handler);
- WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(workingMemory);
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");
@@ -322,9 +320,9 @@
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
- BPELTestUtil.replyWebServiceInvocationFault(workingMemory, workItem, "cannotCompleteOrder", "SHIPPING FAULT");
+ BPELTestUtil.replyWebServiceInvocationFault(workingMemory, workItem, "lns:cannotCompleteOrder", "SHIPPING FAULT");
- logger.writeToDisk();
+ assertEquals(ProcessInstance.STATE_ABORTED, processInstance.getState());
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTestUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTestUtil.java 2008-07-31 10:26:13 UTC (rev 21309)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTestUtil.java 2008-07-31 11:16:10 UTC (rev 21310)
@@ -62,7 +62,7 @@
+ portType + " "
+ operation + ": "
+ result);
- processInstance.acceptMessage(partnerLink, portType, operation, result);
+ processInstance.signalEvent("message", new String[] { partnerLink, portType, operation, result } );
}
public static class WebServiceInvocationHandler implements WorkItemHandler {
More information about the jboss-svn-commits
mailing list