[jboss-svn-commits] JBL Code SVN: r21374 - in labs/jbossrules/trunk: drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java and 10 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Aug 5 18:42:06 EDT 2008
Author: KrisVerlaenen
Date: 2008-08-05 18:42:05 -0400 (Tue, 05 Aug 2008)
New Revision: 21374
Added:
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRethrow.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELRethrowInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/CopyOfBPELAssignInstance.java
Modified:
labs/jbossrules/trunk/drools-compiler/.classpath
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/process/instance/timer/TimerManager.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceImpl.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/FaultNodeInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.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/BPELFlow.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.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/BPELScope.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSequence.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWait.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFlowInstance.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/BPELSequenceInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELThrowInstance.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java
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/XPathReturnValueEvaluator.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:
JBRULES-1696: Extends WS-BPEL support
Modified: labs/jbossrules/trunk/drools-compiler/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-compiler/.classpath 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-compiler/.classpath 2008-08-05 22:42:05 UTC (rev 21374)
@@ -1,16 +1,18 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
-</classpath>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+ <classpathentry excluding="**/*.java" kind="src" output="target/test-classes" path="src/test/resources"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/gunit/1.0.1/gunit-1.0.1.jar"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel 2008-08-05 22:42:05 UTC (rev 21374)
@@ -423,7 +423,7 @@
{
private static final long serialVersionUID = 400L;
- public Object evaluate(org.drools.WorkingMemory workingMemory, org.drools.spi.ProcessContext) throws Exception {
+ public Object evaluate(org.drools.WorkingMemory workingMemory, org.drools.spi.ProcessContext 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/process/instance/timer/TimerManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -4,6 +4,8 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
import org.drools.WorkingMemory;
import org.drools.process.core.timer.Timer;
@@ -19,6 +21,7 @@
private WorkingMemory workingMemory;
private TimerService timerService;
+ private Map<Long, Timer> timers = new HashMap<Long, Timer>();
public TimerManager(WorkingMemory workingMemory, TimerService timerService) {
this.workingMemory = workingMemory;
@@ -38,10 +41,14 @@
new TimerTrigger( timer.getDelay(),
timer.getPeriod() ) );
timer.setJobHandle( jobHandle );
+ timers.put(timerId, timer);
}
- public void cancelTimer(Timer timer) {
- timerService.removeJob( timer.getJobHandle() );
+ public void cancelTimer(long timerId) {
+ Timer timer = timers.get(timerId);
+ if (timer != null) {
+ timerService.removeJob( timer.getJobHandle() );
+ }
}
public TimerService getTimerService() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceImpl.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceImpl.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -21,6 +21,7 @@
import org.drools.common.EventSupport;
import org.drools.common.InternalWorkingMemory;
import org.drools.process.core.Context;
+import org.drools.process.core.ContextContainer;
import org.drools.process.instance.ContextInstance;
import org.drools.process.instance.ContextInstanceContainer;
import org.drools.workflow.core.Connection;
@@ -128,32 +129,44 @@
if (context == null) {
return null;
}
- // TODO: find right context instance container and get context instance
- // TODO: currently, only the process instance acts as a context instance container
- ContextInstanceContainer contextInstanceContainer = null;
- if (this instanceof ContextInstanceContainer) {
- contextInstanceContainer = (ContextInstanceContainer) this;
- } else {
- NodeInstanceContainer nodeInstanceContainer = this.getNodeInstanceContainer();
- while (contextInstanceContainer == null) {
- if (nodeInstanceContainer instanceof ContextInstanceContainer) {
- ContextInstanceContainer container = (ContextInstanceContainer) nodeInstanceContainer;
- if (container.getContextContainer() == context.getContextContainer()) {
- contextInstanceContainer = container;
- break;
- }
- }
- if (nodeInstanceContainer instanceof NodeInstance) {
- nodeInstanceContainer = ((NodeInstance) nodeInstanceContainer).getNodeInstanceContainer();
- } else {
- break;
- }
- }
- }
+ ContextInstanceContainer contextInstanceContainer
+ = getContextInstanceContainer(context.getContextContainer());
if (contextInstanceContainer == null) {
- contextInstanceContainer = getProcessInstance();
+ throw new IllegalArgumentException(
+ "Could not find context instance container for context");
}
return contextInstanceContainer.getContextInstance(context);
}
+ private ContextInstanceContainer getContextInstanceContainer(ContextContainer contextContainer) {
+ ContextInstanceContainer contextInstanceContainer = null;
+ if (this instanceof ContextInstanceContainer) {
+ contextInstanceContainer = (ContextInstanceContainer) this;
+ } else {
+ contextInstanceContainer = getEnclosingContextInstanceContainer(this);
+ }
+ while (contextInstanceContainer != null) {
+ if (contextInstanceContainer.getContextContainer() == contextContainer) {
+ return contextInstanceContainer;
+ }
+ contextInstanceContainer = getEnclosingContextInstanceContainer(
+ (NodeInstance) contextInstanceContainer);
+ }
+ return null;
+ }
+
+ private ContextInstanceContainer getEnclosingContextInstanceContainer(NodeInstance nodeInstance) {
+ NodeInstanceContainer nodeInstanceContainer = nodeInstance.getNodeInstanceContainer();
+ while (true) {
+ if (nodeInstanceContainer instanceof ContextInstanceContainer) {
+ return (ContextInstanceContainer) nodeInstanceContainer;
+ }
+ if (nodeInstanceContainer instanceof NodeInstance) {
+ nodeInstanceContainer = ((NodeInstance) nodeInstanceContainer).getNodeInstanceContainer();
+ } else {
+ return null;
+ }
+ }
+ }
+
}
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -73,6 +73,10 @@
public void triggerCompleted(String outType) {
triggerCompleted(outType, true);
+ while (!nodeInstances.isEmpty()) {
+ NodeInstance nodeInstance = (NodeInstance) nodeInstances.get(0);
+ nodeInstance.cancel();
+ }
}
public void cancel() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/FaultNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/FaultNodeInstance.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/FaultNodeInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -44,17 +44,25 @@
throw new IllegalArgumentException(
"A FaultNode only accepts default incoming connections!");
}
- FaultNode faultNode = getFaultNode();
- ExceptionScopeInstance exceptionScopeInstance = (ExceptionScopeInstance)
- resolveContextInstance(ExceptionScope.EXCEPTION_SCOPE, faultNode.getFaultName());
+ String faultName = getFaultName();
+ ExceptionScopeInstance exceptionScopeInstance = getExceptionScopeInstance(faultName);
if (exceptionScopeInstance != null) {
- handleException(exceptionScopeInstance);
+ handleException(faultName, exceptionScopeInstance);
} else {
getProcessInstance().setState(ProcessInstance.STATE_ABORTED);
}
}
- protected void handleException(ExceptionScopeInstance exceptionScopeInstance) {
+ protected ExceptionScopeInstance getExceptionScopeInstance(String faultName) {
+ return (ExceptionScopeInstance)
+ resolveContextInstance(ExceptionScope.EXCEPTION_SCOPE, faultName);
+ }
+
+ protected String getFaultName() {
+ return getFaultNode().getFaultName();
+ }
+
+ protected Object getFaultData() {
Object value = null;
String faultVariable = getFaultNode().getFaultVariable();
if (faultVariable != null) {
@@ -68,7 +76,11 @@
System.err.println("Continuing without setting value.");
}
}
- exceptionScopeInstance.handleException(getFaultNode().getFaultName(), value);
+ return value;
}
+
+ protected void handleException(String faultName, ExceptionScopeInstance exceptionScopeInstance) {
+ exceptionScopeInstance.handleException(faultName, getFaultData());
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -58,8 +58,7 @@
}
public void cancel() {
- getProcessInstance().getWorkingMemory().getTimerManager()
- .cancelTimer(getTimerNode().getTimer());
+ getProcessInstance().getWorkingMemory().getTimerManager().cancelTimer(timerId);
super.cancel();
}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -71,7 +71,7 @@
// we can't know exactly how many times this will fire as timers are not precise, but should be atleast 4
assertTrue( counter >= 4 );
- timerManager.cancelTimer(timer);
+ timerManager.cancelTimer(timer.getId());
int lastCount = counter;
try {
Thread.sleep(1000);
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -5,6 +5,8 @@
import java.util.ArrayList;
import java.util.List;
+import javax.xml.parsers.DocumentBuilderFactory;
+
import org.apache.ode.bpel.compiler.bom.Activity;
import org.apache.ode.bpel.compiler.bom.AssignActivity;
import org.apache.ode.bpel.compiler.bom.BpelObjectFactory;
@@ -25,6 +27,7 @@
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.RethrowActivity;
import org.apache.ode.bpel.compiler.bom.ScopeActivity;
import org.apache.ode.bpel.compiler.bom.SequenceActivity;
import org.apache.ode.bpel.compiler.bom.SwitchActivity;
@@ -49,6 +52,7 @@
import org.drools.bpel.core.BPELReceive;
import org.drools.bpel.core.BPELRepeatUntil;
import org.drools.bpel.core.BPELReply;
+import org.drools.bpel.core.BPELRethrow;
import org.drools.bpel.core.BPELScope;
import org.drools.bpel.core.BPELSequence;
import org.drools.bpel.core.BPELThrow;
@@ -66,6 +70,8 @@
import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.process.core.datatype.DataType;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
import org.xml.sax.InputSource;
public class BPELCompiler {
@@ -122,7 +128,8 @@
List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
for (Catch catcher: process.getFaultHandler().getCatches()) {
BPELFaultHandler faultHandler = new BPELFaultHandler();
- faultHandler.setFaultName(catcher.getFaultName().toString());
+ faultHandler.setFaultName(
+ catcher.getFaultName() == null ? null : catcher.getFaultName().toString());
faultHandler.setFaultVariable(catcher.getFaultVariable());
faultHandler.setActivity(compileActivity(catcher.getActivity()));
faultHandlers.add(faultHandler);
@@ -198,25 +205,54 @@
From from = copy.getFrom();
To to = copy.getTo();
if (from.isVariableVal()) {
- BPELAssign.VariablePart bpelFrom = assign.new VariablePart(
+ BPELAssign.VariableRef bpelFrom = assign.new VariableRef(
from.getAsVariableVal().getVariable(),
- from.getAsVariableVal().getPart());
+ from.getAsVariableVal().getPart(),
+ from.getAsVariableVal().getHeader(),
+ from.getAsVariableVal().getLocation() == null ? null : from.getAsVariableVal().getLocation().toString());
bpelCopy.setFrom(bpelFrom);
} else if (from.isLiteralVal()) {
- BPELAssign.LiteralValue bpelFrom = assign.new LiteralValue(
- DOMUtils.domToString(from.getAsLiteralVal().getLiteral().getFirstChild()));
+ Element literal = from.getAsLiteralVal().getLiteral();
+ org.w3c.dom.Node child = literal.getFirstChild();
+ short type;
+ if (child.getNodeType() == org.w3c.dom.Node.TEXT_NODE && "".equals(child.getTextContent().trim())) {
+ child = child.getNextSibling();
+ }
+ BPELAssign.Literal bpelFrom = assign.new Literal(DOMUtils.domToString(child));
bpelCopy.setFrom(bpelFrom);
} else {
BPELAssign.Expression bpelFrom = assign.new Expression(from.getAsExpression().toString());
bpelCopy.setFrom(bpelFrom);
}
if (to.isVariableVal()) {
- BPELAssign.VariablePart bpelTo = assign.new VariablePart(
+ BPELAssign.VariableRef bpelTo = assign.new VariableRef(
to.getAsVariableVal().getVariable(),
- to.getAsVariableVal().getPart());
+ to.getAsVariableVal().getPart(),
+ to.getAsVariableVal().getHeader(),
+ to.getAsVariableVal().getLocation() == null ? null : to.getAsVariableVal().getLocation().toString());
bpelCopy.setTo(bpelTo);
} else {
- throw new UnsupportedOperationException("Assign to does not yet support non-variable values");
+ String expression = to.getAsExpression().toString();
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(expression.getBytes()));
+ expression = DOMUtils.domToString(document.getFirstChild().getFirstChild());
+ String varName;
+ String partName;
+ int dotloc = expression.indexOf('.');
+ if (dotloc == -1) {
+ varName = expression;
+ partName = null;
+ } else {
+ varName = expression.substring(1, dotloc);
+ partName = expression.substring(dotloc + 1);
+ }
+ BPELAssign.VariableRef bpelTo = assign.new VariableRef(varName, partName, null, null);
+ bpelCopy.setTo(bpelTo);
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not parse expression " + expression, t);
+ }
}
assign.addCopy(bpelCopy);
}
@@ -229,6 +265,8 @@
bpelThrow.setFaultName(throwActivity.getFaultName().toString());
bpelThrow.setFaultVariable(throwActivity.getFaultVariable());
result = bpelThrow;
+ } else if (activity instanceof RethrowActivity) {
+ result = new BPELRethrow();
} else if (activity instanceof PickActivity) {
PickActivity pickActivity = (PickActivity) activity;
BPELPick pick = new BPELPick();
@@ -245,11 +283,28 @@
for (OnAlarm onAlarm: pickActivity.getOnAlarms()) {
BPELPick.OnAlarm bpelOnAlarm = pick.new OnAlarm();
if (onAlarm.getFor() != null) {
- bpelOnAlarm.setForExpression(onAlarm.getFor().toString());
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(onAlarm.getFor().toString().getBytes()));
+ String expression = DOMUtils.domToString(document.getFirstChild().getFirstChild());
+ bpelOnAlarm.setForExpression(expression);
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not parse for expression", t);
+ }
}
if (onAlarm.getUntil() != null) {
- bpelOnAlarm.setUntilExpression(onAlarm.getUntil().toString());
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(onAlarm.getUntil().toString().getBytes()));
+ String expression = DOMUtils.domToString(document.getFirstChild().getFirstChild());
+ bpelOnAlarm.setUntilExpression(expression);
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not parse for expression", t);
+ }
}
+ bpelOnAlarm.setActivity(compileActivity(onAlarm.getActivity()));
pick.addOnAlarm(bpelOnAlarm);
}
result = pick;
@@ -266,14 +321,17 @@
}
variableScope.setVariables(variables);
List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
- for (Catch catcher: scopeActivity.getScope().getFaultHandler().getCatches()) {
- BPELFaultHandler faultHandler = new BPELFaultHandler();
- faultHandler.setFaultName(catcher.getFaultName().toString());
- faultHandler.setFaultVariable(catcher.getFaultVariable());
- faultHandler.setActivity(compileActivity(catcher.getActivity()));
- faultHandlers.add(faultHandler);
- }
- scope.setFaultHandlers(faultHandlers);
+ if (scopeActivity.getScope().getFaultHandler() != null) {
+ for (Catch catcher: scopeActivity.getScope().getFaultHandler().getCatches()) {
+ BPELFaultHandler faultHandler = new BPELFaultHandler();
+ faultHandler.setFaultName(
+ catcher.getFaultName() == null ? null : catcher.getFaultName().toString());
+ faultHandler.setFaultVariable(catcher.getFaultVariable());
+ faultHandler.setActivity(compileActivity(catcher.getActivity()));
+ faultHandlers.add(faultHandler);
+ }
+ scope.setFaultHandlers(faultHandlers);
+ }
scope.setActivity(compileActivity(scopeActivity.getChildActivity()));
result = scope;
} else if (activity instanceof SwitchActivity) {
@@ -297,10 +355,26 @@
WaitActivity waitActivity = (WaitActivity) activity;
BPELWait wait = new BPELWait();
if (waitActivity.getFor() != null) {
- wait.setForExpression(waitActivity.getFor().toString());
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(waitActivity.getFor().toString().getBytes()));
+ String expression = DOMUtils.domToString(document.getFirstChild().getFirstChild());
+ wait.setForExpression(expression);
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not parse for expression", t);
+ }
}
if (waitActivity.getUntil() != null) {
- wait.setUntilExpression(waitActivity.getUntil().toString());
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(waitActivity.getUntil().toString().getBytes()));
+ String expression = DOMUtils.domToString(document.getFirstChild().getFirstChild());
+ wait.setUntilExpression(expression);
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not parse for expression", t);
+ }
}
result = wait;
} else if (activity instanceof WhileActivity) {
@@ -348,9 +422,7 @@
}
private DataType getDataType(String typeName) {
- XMLDataType result = new XMLDataType();
- result.setTypeDefinition(typeName);
- return result;
+ return new XMLDataType(typeName);
}
}
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -72,6 +72,7 @@
public class Copy {
+ private boolean keepSrcElementName;
private From from;
private To to;
@@ -90,6 +91,14 @@
public void setTo(To to) {
this.to = to;
}
+
+ public boolean isKeepSrcElementName() {
+ return keepSrcElementName;
+ }
+
+ public void setKeepSrcElementName(boolean keepSrcElementName) {
+ this.keepSrcElementName = keepSrcElementName;
+ }
}
@@ -97,16 +106,23 @@
}
public interface To {
+
+ String getVariable();
+
}
- public class VariablePart implements From, To {
+ public class VariableRef implements From, To {
private String variable;
private String part;
+ private String headerPart;
+ private String location;
- public VariablePart(String variable, String part) {
+ public VariableRef(String variable, String part, String headerPart, String location) {
this.variable = variable;
this.part = part;
+ this.headerPart = headerPart;
+ this.location = location;
}
public String getVariable() {
@@ -117,13 +133,21 @@
return part;
}
+ public String getHeaderPart() {
+ return headerPart;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
}
- public class LiteralValue implements From {
+ public class Literal implements From {
private String value;
-
- public LiteralValue(String value) {
+
+ public Literal(String value) {
this.value = value;
}
@@ -133,7 +157,7 @@
}
- public class Expression implements From {
+ public class Expression implements From, To {
private String expression;
@@ -144,7 +168,67 @@
public String getExpression() {
return expression;
}
+
+ public String getVariable() {
+ return null;
+ }
}
+
+ public class DirectRef implements To {
+ private String variable;
+
+ public DirectRef(String variable) {
+ this.variable = variable;
+ }
+
+ public String getVariable() {
+ return variable;
+ }
+
+ }
+
+ public class PropertyRef implements To {
+
+ private String variable;
+
+ public PropertyRef(String variable) {
+ this.variable = variable;
+ }
+
+ public String getVariable() {
+ return variable;
+ }
+
+ }
+
+ public class LValueExpression implements To {
+
+ private String variable;
+
+ public LValueExpression(String variable) {
+ this.variable = variable;
+ }
+
+ public String getVariable() {
+ return variable;
+ }
+
+ }
+
+ public class PartnerLinkRef implements From, To {
+
+ private String variable;
+
+ public PartnerLinkRef(String variable) {
+ this.variable = variable;
+ }
+
+ public String getVariable() {
+ return variable;
+ }
+
+ }
+
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFlow.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFlow.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFlow.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -43,9 +43,9 @@
}
public void setActivities(List<BPELActivity> activities) {
- if (activities == null || activities.size() < 2) {
+ if (activities == null || activities.size() < 1) {
throw new IllegalArgumentException(
- "A BPEL flow must contain at least two sub activities!");
+ "A BPEL flow must contain at least one activity!");
}
for (Iterator<BPELActivity> iterator = activities.iterator(); iterator.hasNext(); ) {
addActivity(iterator.next());
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -1,14 +1,10 @@
package org.drools.bpel.core;
-import org.drools.process.core.event.EventFilter;
-import org.drools.process.core.timer.Timer;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.impl.ConnectionImpl;
import org.drools.workflow.core.node.CompositeNode;
-import org.drools.workflow.core.node.EndNode;
-import org.drools.workflow.core.node.EventNode;
import org.drools.workflow.core.node.Join;
-import org.drools.workflow.core.node.TimerNode;
+import org.drools.workflow.core.node.Split;
/**
*
@@ -19,23 +15,24 @@
private static final long serialVersionUID = 400L;
private boolean createInstance;
+ private Split split;
private Join join;
private SourceLink[] sourceLinks;
private TargetLink[] targetLinks;
public BPELPick() {
- EndNode end = new EndNode();
- end.setTerminate(false);
- end.setMetaData("hidden", true);
- addNode(end);
- join = new Join();
+ split = new Split();
+ split.setType(Split.TYPE_AND);
+ 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(
- end, Node.CONNECTION_DEFAULT_TYPE));
+ split, Node.CONNECTION_DEFAULT_TYPE));
linkOutgoingConnections(
new CompositeNode.NodeAndType(
join, Node.CONNECTION_DEFAULT_TYPE),
@@ -51,14 +48,17 @@
}
public void addOnMessage(OnMessage onMessage) {
- EventNode eventNode = new EventNode();
- eventNode.addEventFilter(new OnMessageEventFilter(
- onMessage.getPartnerLink(), onMessage.getPortType(), onMessage.getOperation()));
- eventNode.setMetaData("hidden", true);
- addNode(eventNode);
+ BPELReceive receive = new BPELReceive();
+ receive.setOperation(onMessage.getPartnerLink(), onMessage.getPortType(), onMessage.getOperation());
+ receive.setMetaData("hidden", true);
+ receive.setVariable(onMessage.getVariable());
+ addNode(receive);
addNode(onMessage.getActivity());
new ConnectionImpl(
- eventNode, Node.CONNECTION_DEFAULT_TYPE,
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ receive, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ receive, Node.CONNECTION_DEFAULT_TYPE,
onMessage.getActivity(), Node.CONNECTION_DEFAULT_TYPE);
new ConnectionImpl(
onMessage.getActivity(), Node.CONNECTION_DEFAULT_TYPE,
@@ -66,34 +66,23 @@
}
public void addOnAlarm(OnAlarm onAlarm) {
- TimerNode timerNode = new TimerNode();
- Timer timer = new Timer();
- if (onAlarm.getForExpression() != null) {
- timer.setDelay(getDelayFor(onAlarm.getForExpression()));
- } else {
- timer.setDelay(getDelayUntil(onAlarm.getUntilExpression()));
- }
- timerNode.setTimer(timer);
- addNode(timerNode);
+ BPELWait waitNode = new BPELWait();
+ waitNode.setForExpression(onAlarm.getForExpression());
+ waitNode.setUntilExpression(onAlarm.getUntilExpression());
+ waitNode.setMetaData("hidden", true);
+ addNode(waitNode);
addNode(onAlarm.getActivity());
new ConnectionImpl(
- timerNode, Node.CONNECTION_DEFAULT_TYPE,
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ waitNode, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ waitNode, Node.CONNECTION_DEFAULT_TYPE,
onAlarm.getActivity(), Node.CONNECTION_DEFAULT_TYPE);
new ConnectionImpl(
onAlarm.getActivity(), Node.CONNECTION_DEFAULT_TYPE,
join, Node.CONNECTION_DEFAULT_TYPE);
}
- private int getDelayFor(String forExpression) {
- // TODO: BPELPick timer delay
- return 1000;
- }
-
- private int getDelayUntil(String untilExpression) {
- // TODO: BPELPick timer until
- return 1000;
- }
-
public SourceLink[] getSourceLinks() {
return sourceLinks;
}
@@ -169,28 +158,6 @@
}
- private class OnMessageEventFilter implements EventFilter {
-
- private String partnerLink;
- private String portType;
- private String operation;
-
- public OnMessageEventFilter(String partnerLink, String portType, String operation) {
- this.partnerLink = partnerLink;
- this.portType = portType;
- this.operation = operation;
- }
-
- 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;
- }
-
- }
-
public class OnAlarm {
private String forExpression;
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -10,6 +10,8 @@
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.Join;
+import org.drools.workflow.core.node.Split;
import org.drools.workflow.core.node.StartNode;
@@ -73,13 +75,32 @@
ExceptionScope exceptionScope = new ExceptionScope();
addContext(exceptionScope);
setDefaultContext(exceptionScope);
- int i = 3;
+ int i = 4;
+ Split split = new Split();
+ split.setId(i++);
+ addNode(split);
+ Join join = new Join();
+ join.setId(i++);
+ join.setType(Join.TYPE_XOR);
+ addNode(join);
+ EndNode endNode = new EndNode();
+ endNode.setId(i++);
+ addNode(endNode);
+ new ConnectionImpl(
+ join, Node.CONNECTION_DEFAULT_TYPE,
+ endNode, Node.CONNECTION_DEFAULT_TYPE);
for (BPELFaultHandler faultHandler: faultHandlers) {
- faultHandler.getActivity().setId(i++);
- addNode(faultHandler.getActivity());
+ Node activity = faultHandler.getActivity();
+ activity.setId(i++);
+ addNode(activity);
exceptionScope.setExceptionHandler(faultHandler.getFaultName(), faultHandler);
+ new ConnectionImpl(
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ activity, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ activity, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE);
}
- // TODO: process should end once fault handler has been executed
}
public NamespaceContext getNamespaceContext() {
Modified: 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 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRepeatUntil.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -47,19 +47,19 @@
split, Node.CONNECTION_DEFAULT_TYPE,
empty, Node.CONNECTION_DEFAULT_TYPE);
ConstraintImpl constraint = new ConstraintImpl();
- constraint.setConstraint("true");
+ constraint.setConstraint(condition);
constraint.setType("code");
- constraint.setDialect("mvel");
- constraint.setPriority(Integer.MAX_VALUE - 1);
+ constraint.setDialect("XPath2.0");
+ constraint.setPriority(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.setConstraint("true");
constraint.setType("code");
- constraint.setDialect("XPath2.0");
- constraint.setPriority(getNodes().length - 2);
+ constraint.setDialect("mvel");
+ constraint.setPriority(2);
split.setConstraint(connection, constraint);
}
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRethrow.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRethrow.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELRethrow.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -0,0 +1,32 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.node.FaultNode;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELRethrow extends FaultNode 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;
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -1,12 +1,18 @@
package org.drools.bpel.core;
+import java.util.ArrayList;
import java.util.List;
import org.drools.process.core.context.exception.ExceptionScope;
+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.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
import org.drools.workflow.core.node.CompositeContextNode;
import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
/**
*
@@ -14,16 +20,23 @@
*/
public class BPELScope extends CompositeContextNode implements BPELActivity, BPELFaultHandlerContainer {
+ public static final String INTERNAL_FAULT_DATA_VARIABLE = "DroolsInternalFaultDataVariable";
+ public static final String INTERNAL_FAULT_NAME_VARIABLE = "DroolsInternalFaultNameVariable";
private static final long serialVersionUID = 400L;
private SourceLink[] sourceLinks;
private TargetLink[] targetLinks;
+ private Join join;
public BPELScope() {
VariableScope variableScope = new VariableScope();
addContext(variableScope);
setDefaultContext(variableScope);
- }
+ join = new Join();
+ join.setType(Join.TYPE_XOR);
+ join.setMetaData("hidden", true);
+ addNode(join);
+ linkOutgoingConnections(join.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE); }
public VariableScope getVariableScope() {
return (VariableScope) getDefaultContext(VariableScope.VARIABLE_SCOPE);
@@ -35,19 +48,33 @@
Node.CONNECTION_DEFAULT_TYPE,
new CompositeNode.NodeAndType(
activity, Node.CONNECTION_DEFAULT_TYPE));
- linkOutgoingConnections(
- new CompositeNode.NodeAndType(
- activity, Node.CONNECTION_DEFAULT_TYPE),
- Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ activity, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE);
}
public void setFaultHandlers(List<BPELFaultHandler> faultHandlers) {
ExceptionScope exceptionScope = new ExceptionScope();
addContext(exceptionScope);
setDefaultContext(exceptionScope);
+ Split split = new Split();
+ addNode(split);
for (BPELFaultHandler faultHandler: faultHandlers) {
- addNode(faultHandler.getActivity());
+ BPELFaultHandlerScope faultHandlerScope = new BPELFaultHandlerScope();
+ addNode(faultHandlerScope);
+ Node activity = faultHandler.getActivity();
+ faultHandlerScope.addNode(activity);
+ faultHandlerScope.linkIncomingConnections(
+ Node.CONNECTION_DEFAULT_TYPE, activity.getId(), Node.CONNECTION_DEFAULT_TYPE);
+ faultHandlerScope.linkOutgoingConnections(
+ activity.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE);
exceptionScope.setExceptionHandler(faultHandler.getFaultName(), faultHandler);
+ new ConnectionImpl(
+ split, Node.CONNECTION_DEFAULT_TYPE,
+ faultHandlerScope, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(
+ faultHandlerScope, Node.CONNECTION_DEFAULT_TYPE,
+ join, Node.CONNECTION_DEFAULT_TYPE);
}
}
@@ -66,5 +93,26 @@
public void setTargetLinks(TargetLink[] targetLinks) {
this.targetLinks = targetLinks;
}
+
+ public static class BPELFaultHandlerScope extends CompositeContextNode {
+ private static final long serialVersionUID = 4L;
+
+ public BPELFaultHandlerScope() {
+ VariableScope variableScope = new VariableScope();
+ List<Variable> variables = new ArrayList<Variable>();
+ Variable variable = new Variable();
+ variable.setName(INTERNAL_FAULT_DATA_VARIABLE);
+ variables.add(variable);
+ variable = new Variable();
+ variable.setName(INTERNAL_FAULT_NAME_VARIABLE);
+ variable.setType(new StringDataType());
+ variables.add(variable);
+ variableScope.setVariables(variables);
+ addContext(variableScope);
+ setDefaultContext(variableScope);
+ }
+
+ }
+
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSequence.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSequence.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSequence.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -18,9 +18,9 @@
private TargetLink[] targetLinks;
public void setActivities(List<BPELActivity> activities) {
- if (activities == null || activities.size() < 2) {
+ if (activities == null || activities.size() < 1) {
throw new IllegalArgumentException(
- "A BPEL sequence must contain at least two sub activities!");
+ "A BPEL sequence must contain at least one activity!");
}
BPELActivity previous = activities.get(0);
addNode(previous);
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWait.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWait.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWait.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -1,6 +1,5 @@
package org.drools.bpel.core;
-import org.drools.process.core.timer.Timer;
import org.drools.workflow.core.node.TimerNode;
/**
@@ -11,6 +10,8 @@
private static final long serialVersionUID = 4L;
+ private String forExpression;
+ private String untilExpression;
private SourceLink[] sourceLinks;
private TargetLink[] targetLinks;
@@ -31,25 +32,19 @@
}
public void setForExpression(String forExpression) {
- Timer timer = new Timer();
- timer.setDelay(getDelayFor(forExpression));
- setTimer(timer);
+ this.forExpression = forExpression;
}
public void setUntilExpression(String untilExpression) {
- Timer timer = new Timer();
- timer.setDelay(getDelayUntil(untilExpression));
- setTimer(timer);
+ this.untilExpression = untilExpression;
}
-
- private int getDelayFor(String forExpression) {
- // TODO: BPELPick timer delay
- return 1000;
+
+ public String getForExpression() {
+ return forExpression;
}
-
- private int getDelayUntil(String untilExpression) {
- // TODO: BPELPick timer until
- return 1000;
+
+ public String getUntilExpression() {
+ return untilExpression;
}
-
+
}
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -11,8 +11,8 @@
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.core.BPELAssign.Literal;
+import org.drools.bpel.core.BPELAssign.VariableRef;
import org.drools.bpel.xpath.XMLDataType;
import org.drools.bpel.xpath.XPathReturnValueEvaluator;
import org.drools.process.core.context.variable.VariableScope;
@@ -45,10 +45,18 @@
BPELAssign assign = getBPELAssign();
for (Copy copy: assign.getCopies()) {
From fromPart = copy.getFrom();
- VariablePart toPart = (VariablePart) copy.getTo();
+ VariableRef toPart = (VariableRef) copy.getTo();
Object fromValue = getValue(fromPart);
if (toPart.getPart() == null) {
- setVariableValue(toPart.getVariable(), fromValue);
+ if (fromValue instanceof String) {
+ setVariableValue(toPart.getVariable(), (String) fromValue);
+ } else if (fromValue instanceof Element) {
+ String value = DOMUtils.domToString(((Element) fromValue).getFirstChild());
+ setVariableValue(toPart.getVariable(), value);
+ } else {
+ throw new IllegalArgumentException(
+ "Cannot set variable of this type " + fromValue);
+ }
} else {
String toValue = getVariableValue(toPart.getVariable());
if (toValue == null) {
@@ -63,8 +71,8 @@
}
private Object getValue(From from) {
- if (from instanceof VariablePart) {
- VariablePart fromPart = (VariablePart) from;
+ if (from instanceof VariableRef) {
+ VariableRef fromPart = (VariableRef) from;
String fromValue = getVariableValue(fromPart.getVariable());
if (fromPart.getPart() == null) {
return fromValue;
@@ -76,8 +84,20 @@
} catch (Throwable t) {
throw new IllegalArgumentException("Could not get value", t);
}
- } else if (from instanceof LiteralValue) {
- return ((LiteralValue) from).getValue();
+ } else if (from instanceof Literal) {
+ String literal = ((Literal) from).getValue();
+ if (literal.startsWith("<?xml")) {
+ int index = literal.indexOf("?>");
+ literal = "<message>" + literal.substring(index + 3) + "</message>";
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(literal.getBytes()));
+ return document.getDocumentElement();
+ } catch (Throwable t) {
+ throw new IllegalArgumentException("Could not get value", t);
+ }
+ }
+ return literal;
} else if (from instanceof Expression) {
String expression = ((Expression) from).getExpression();
try {
@@ -111,7 +131,7 @@
Element to = DOMUtils.findChildByName((Element) toDocument.getDocumentElement(), new QName(toPart));
if (fromValue instanceof Element) {
Element from = (Element) fromValue;
- Element replacement = toDocument.createElementNS(from.getNamespaceURI(), from.getNodeName());
+ Element replacement = toDocument.createElementNS(null, toPart);
NodeList nl = from.getChildNodes();
for (int i = 0; i < nl.getLength(); ++i)
replacement.appendChild(toDocument.importNode(nl.item(i), true));
@@ -168,7 +188,7 @@
return null;
}
- private void setVariableValue(String variable, Object value) {
+ private void setVariableValue(String variable, String value) {
VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
if (variableScopeInstance != null) {
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -1,16 +1,16 @@
package org.drools.bpel.instance;
import org.drools.bpel.core.BPELFaultHandler;
+import org.drools.bpel.core.BPELScope;
+import org.drools.bpel.core.BPELScope.BPELFaultHandlerScope;
import org.drools.process.core.context.exception.ExceptionHandler;
import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.context.exception.ExceptionHandlerInstance;
import org.drools.process.instance.context.variable.VariableScopeInstance;
import org.drools.workflow.core.Node;
-import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.NodeInstanceContainer;
import org.drools.workflow.instance.impl.NodeInstanceImpl;
-import org.drools.workflow.instance.node.CompositeNodeInstance;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
public class BPELFaultHandlerInstance implements ExceptionHandlerInstance {
@@ -42,10 +42,15 @@
throw new IllegalArgumentException(
"Cannot handle exception: " + exception);
}
- NodeInstance nodeInstance = nodeInstanceContainer.getNodeInstance(faultHandler.getActivity());
+ CompositeContextNodeInstance nodeInstance = (CompositeContextNodeInstance)
+ nodeInstanceContainer.getNodeInstance((BPELFaultHandlerScope)
+ faultHandler.getActivity().getNodeContainer());
+ VariableScopeInstance variableScopeInstance = ((VariableScopeInstance) nodeInstance.resolveContextInstance(VariableScope.VARIABLE_SCOPE, BPELScope.INTERNAL_FAULT_NAME_VARIABLE));
+ variableScopeInstance.setVariable(BPELScope.INTERNAL_FAULT_NAME_VARIABLE, exception);
+ variableScopeInstance.setVariable(BPELScope.INTERNAL_FAULT_DATA_VARIABLE, param);
String faultVariable = faultHandler.getFaultVariable();
if (faultVariable != null) {
- VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ variableScopeInstance = (VariableScopeInstance)
((NodeInstanceImpl) nodeInstance).resolveContextInstance(VariableScope.VARIABLE_SCOPE, faultHandler.getFaultVariable());
if (variableScopeInstance != null) {
variableScopeInstance.setVariable(faultVariable, (String) param);
@@ -56,11 +61,6 @@
}
}
nodeInstance.trigger(null, Node.CONNECTION_DEFAULT_TYPE);
- if (nodeInstanceContainer instanceof BPELProcessInstance) {
- ((BPELProcessInstance) nodeInstanceContainer).setState(ProcessInstance.STATE_ABORTED);
- } else {
- ((CompositeNodeInstance) nodeInstanceContainer).triggerCompleted(Node.CONNECTION_DEFAULT_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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFlowInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -48,13 +48,6 @@
}
}
- 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);
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -90,7 +90,8 @@
@Override
protected void internalStart() {
- // do nothing, BPEL Processes are started by receiving a message
+ NodeInstance nodeInstance = getNodeInstance(getBPELProcess().getActivity());
+ nodeInstance.trigger(null, Node.CONNECTION_DEFAULT_TYPE);
}
}
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELRethrowInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELRethrowInstance.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELRethrowInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -0,0 +1,65 @@
+package org.drools.bpel.instance;
+
+import org.drools.bpel.core.BPELScope;
+import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.context.exception.ExceptionScopeInstance;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.NodeInstanceContainer;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
+import org.drools.workflow.instance.node.FaultNodeInstance;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELRethrowInstance extends FaultNodeInstance {
+
+ private static final long serialVersionUID = 400L;
+
+ public void internalTrigger(NodeInstance from, String type) {
+ if (BPELLinkManager.checkActivityEnabled(this)) {
+ super.internalTrigger(from, type);
+ }
+ }
+
+ protected ExceptionScopeInstance getExceptionScopeInstance(String faultName) {
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ resolveContextInstance(VariableScope.VARIABLE_SCOPE, BPELScope.INTERNAL_FAULT_NAME_VARIABLE);
+ BPELScopeInstance scopeInstance = (BPELScopeInstance)
+ ((CompositeContextNodeInstance) variableScopeInstance.getContextInstanceContainer())
+ .getNodeInstanceContainer();
+ NodeInstanceContainer nodeInstanceContainer = scopeInstance.getNodeInstanceContainer();
+ if (nodeInstanceContainer instanceof ProcessInstance) {
+ return (ExceptionScopeInstance)
+ ((ProcessInstance) nodeInstanceContainer)
+ .getContextInstance(ExceptionScope.EXCEPTION_SCOPE);
+ }
+ if (nodeInstanceContainer instanceof NodeInstance) {
+ return (ExceptionScopeInstance)
+ ((NodeInstance) nodeInstanceContainer).resolveContextInstance(ExceptionScope.EXCEPTION_SCOPE, faultName);
+ }
+ throw new IllegalArgumentException(
+ "Could not find enclosing exception scope");
+ }
+
+ protected String getFaultName() {
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ resolveContextInstance(VariableScope.VARIABLE_SCOPE, BPELScope.INTERNAL_FAULT_NAME_VARIABLE);
+ return (String) variableScopeInstance.getVariable(BPELScope.INTERNAL_FAULT_NAME_VARIABLE);
+ }
+
+ protected Object getFaultData() {
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ resolveContextInstance(VariableScope.VARIABLE_SCOPE, BPELScope.INTERNAL_FAULT_DATA_VARIABLE);
+ return variableScopeInstance.getVariable(BPELScope.INTERNAL_FAULT_DATA_VARIABLE);
+ }
+
+ protected void handleException(String faultName, ExceptionScopeInstance exceptionScopeInstance) {
+ super.handleException(faultName, exceptionScopeInstance);
+ 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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSequenceInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -1,7 +1,5 @@
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;
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELThrowInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELThrowInstance.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELThrowInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -18,8 +18,8 @@
}
}
- protected void handleException(ExceptionScopeInstance exceptionScopeInstance) {
- super.handleException(exceptionScopeInstance);
+ protected void handleException(String faultName, ExceptionScopeInstance exceptionScopeInstance) {
+ super.handleException(faultName, exceptionScopeInstance);
BPELLinkManager.activateTargetLinks(this);
}
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -1,7 +1,19 @@
package org.drools.bpel.instance;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.apache.ode.utils.xsd.Duration;
+import org.drools.bpel.core.BPELWait;
+import org.drools.bpel.xpath.XPathReturnValueEvaluator;
+import org.drools.process.core.timer.Timer;
+import org.drools.spi.ProcessContext;
import org.drools.workflow.instance.NodeInstance;
import org.drools.workflow.instance.node.TimerNodeInstance;
+import org.w3c.dom.Element;
/**
*
@@ -11,12 +23,85 @@
private static final long serialVersionUID = 400L;
+ public BPELWait getBPELWait() {
+ return (BPELWait) getNode();
+ }
+
public void internalTrigger(NodeInstance from, String type) {
if (BPELLinkManager.checkActivityEnabled(this)) {
- super.internalTrigger(from, type);
+ super.internalTrigger(from, type);
}
}
+ protected Timer createTimer() {
+ Timer timer = new Timer();
+ BPELWait wait = getBPELWait();
+ if (wait.getForExpression() != null) {
+ timer.setDelay(getTimerDelayFor(wait.getForExpression()));
+ } else if (wait.getUntilExpression() != null) {
+ timer.setDelay(getTimerDelayUntil(wait.getUntilExpression()));
+ }
+ timer.setPeriod(0);
+ return timer;
+ }
+
+ private long getTimerDelayFor(String forExpression) {
+ try {
+ XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
+ evaluator.setExpression(forExpression);
+ ProcessContext processContext = new ProcessContext();
+ processContext.setNodeInstance(this);
+ String literal = (String) evaluator.evaluate(getProcessInstance().getWorkingMemory(), processContext, XPathConstants.STRING);
+
+ Calendar cal = Calendar.getInstance();
+ Duration duration = new Duration(literal);
+ duration.addTo(cal);
+ long delay = cal.getTime().getTime() - Calendar.getInstance().getTime().getTime();
+ if (delay < 0) {
+ delay = 0;
+ }
+ return delay;
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not get timer delay for", t);
+ }
+ }
+
+ private long getTimerDelayUntil(String untilExpression) {
+ try {
+ XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
+ evaluator.setExpression(untilExpression);
+ ProcessContext processContext = new ProcessContext();
+ processContext.setNodeInstance(this);
+ List literal = (List) evaluator.evaluate(getProcessInstance().getWorkingMemory(), processContext, XPathConstants.NODESET);
+ Calendar calendar = null;
+ if (literal.size() == 0) {
+ throw new IllegalArgumentException("No results for timer until");
+ }
+ if (literal.size() > 1) {
+ throw new IllegalArgumentException("Multiple results for timer until");
+ }
+ Object date = literal.get(0);
+ if (date instanceof Calendar) {
+ calendar = (Calendar) date;
+ } else if (date instanceof Date) {
+ calendar = Calendar.getInstance();
+ calendar.setTime((Date) date);
+ } else if (date instanceof Element) {
+ date = ((Element) date).getTextContent();
+ // TODO
+ }
+ long delay = calendar.getTime().getTime() - Calendar.getInstance().getTime().getTime();
+ if (delay < 0) {
+ delay = 0;
+ }
+ return delay;
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not get timer delay until", t);
+ }
+ }
+
public void triggerCompleted() {
super.triggerCompleted();
BPELLinkManager.activateTargetLinks(this);
Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/CopyOfBPELAssignInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/CopyOfBPELAssignInstance.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/CopyOfBPELAssignInstance.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -0,0 +1,586 @@
+package org.drools.bpel.instance;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+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.Literal;
+import org.drools.bpel.core.BPELAssign.VariableRef;
+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;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class CopyOfBPELAssignInstance extends NodeInstanceImpl {
+
+ private static final long serialVersionUID = 400L;
+
+ public BPELAssign getBPELAssign() {
+ return (BPELAssign) getNode();
+ }
+
+ public void internalTrigger(NodeInstance from, String type) {
+ if (BPELLinkManager.checkActivityEnabled(this)) {
+ BPELAssign assign = getBPELAssign();
+ for (Copy copy: assign.getCopies()) {
+ copy(copy);
+ }
+ triggerCompleted(Node.CONNECTION_DEFAULT_TYPE, true);
+ }
+ }
+
+ private void copy(Copy copy) {
+ org.w3c.dom.Node rvalue = evalRValue(copy.getFrom());
+ org.w3c.dom.Node lvalue = evalLValue(copy.getTo());
+
+ org.w3c.dom.Node lvaluePtr = lvalue;
+ boolean headerAssign = false;
+ if (copy.getTo() instanceof BPELAssign.DirectRef) {
+ throw new UnsupportedOperationException();
+// DirectRef dref = ((DirectRef) copy.getTo());
+// Element el = DOMUtils.findChildByName((Element) lvalue, dref.elName);
+// if (el == null) {
+// el = (Element) ((Element) lvalue).appendChild(lvalue.getOwnerDocument()
+// .createElementNS(dref.elName.getNamespaceURI(), dref.elName.getLocalPart()));
+// }
+// lvaluePtr = el;
+ } else if (copy.getTo() instanceof BPELAssign.VariableRef) {
+ VariableRef varRef = ((VariableRef) copy.getTo());
+ if (varRef.getHeaderPart() != null) {
+ headerAssign = true;
+ }
+ lvaluePtr = evalQuery(
+ lvalue, varRef.getPart() != null ? varRef.getPart() : varRef.getHeaderPart(),
+ varRef.getLocation());
+ } else if (copy.getTo() instanceof BPELAssign.PropertyRef) {
+ throw new UnsupportedOperationException();
+// PropertyRef propRef = ((PropertyRef) copy.getTo());
+// lvaluePtr = evalQuery(lvalue, propRef.propertyAlias.part,
+// propRef.propertyAlias.location,
+// new EvaluationContextProxy(propRef.getVariable(),
+// lvalue));
+ } else if (copy.getTo() instanceof BPELAssign.LValueExpression) {
+ throw new UnsupportedOperationException();
+// LValueExpression lexpr = (LValueExpression) copy.getTo();
+// lvaluePtr = evalQuery(lvalue, null, lexpr.expression,
+// new EvaluationContextProxy(lexpr.getVariable(), lvalue));
+ }
+
+ // For partner link assignmenent, the whole content is assigned.
+ if (copy.getTo() instanceof BPELAssign.PartnerLinkRef) {
+ throw new UnsupportedOperationException();
+// PartnerLinkRef pLinkRef = ((PartnerLinkRef) copy.getTo());
+// PartnerLinkInstance plval = _scopeFrame.resolve(pLinkRef.partnerLink);
+// replaceEndpointRefence(plval, rvalue);
+ } else {
+ // Sneakily converting the EPR if it's not the format expected by the lvalue
+ if (copy.getFrom() instanceof BPELAssign.PartnerLinkRef) {
+ throw new UnsupportedOperationException();
+// rvalue = getBpelRuntimeContext().convertEndpointReference((Element)rvalue, lvaluePtr);
+// if (rvalue.getNodeType() == org.w3c.dom.Node.DOCUMENT_NODE)
+// rvalue = ((Document) rvalue).getDocumentElement();
+ }
+ if (headerAssign && lvaluePtr.getParentNode().getNodeName().equals("message")) {
+ lvalue = copyInto((Element)lvalue, (Element) lvaluePtr, (Element) rvalue);
+ } else if (rvalue.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE && lvaluePtr.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
+ lvalue = replaceElement((Element) lvalue, (Element) lvaluePtr, (Element) rvalue,
+ copy.isKeepSrcElementName());
+ } else {
+ lvalue = replaceContent(lvalue, lvaluePtr, rvalue.getTextContent());
+ }
+ setVariableValue(copy.getTo().getVariable(), lvalue);
+ }
+ }
+
+ private org.w3c.dom.Node evalLValue(BPELAssign.To to) {
+ org.w3c.dom.Node lval = null;
+ if (!(to instanceof BPELAssign.PartnerLinkRef)) {
+ String lvar = getVariableValue(to.getVariable());
+ if (lvar == null) {
+ Document doc = DOMUtils.newDocument();
+ String type = getVariableType(to.getVariable());
+ String ns = null;
+ if (type != null) {
+ int index = type.lastIndexOf("}");
+ if (index != -1) {
+ ns = type.substring(1, index);
+ type = type.substring(index + 1);
+ }
+ }
+ org.w3c.dom.Node val = doc.createElementNS(ns, type);
+ if (val.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
+ Element tempwrapper = doc.createElementNS(null, "temporary-simple-type-wrapper");
+ doc.appendChild(tempwrapper);
+ tempwrapper.appendChild(val);
+ val = tempwrapper;
+ } else {
+ doc.appendChild(val);
+ }
+ // Only external variables need to be initialized, others are new and going to be overwtitten
+// if (lvar.declaration.extVar != null) {
+// lval = initializeVariable(lvar, val);
+// }
+// else
+ lval = val;
+ } else {
+ lval = getAsElement(getVariableValue(lvar));
+ }
+ }
+ return lval;
+ }
+
+ private org.w3c.dom.Node evalRValue(BPELAssign.From from) {
+ org.w3c.dom.Node retVal;
+ if (from instanceof BPELAssign.DirectRef) {
+ throw new UnsupportedOperationException();
+// DirectRef dref = (DirectRef) from;
+// Node data = fetchVariableData(
+// _scopeFrame.resolve(dref.variable), false);
+// retVal = DOMUtils.findChildByName((Element)data, dref.elName);
+ } else if (from instanceof BPELAssign.VariableRef) {
+ VariableRef varRef = (VariableRef) from;
+ org.w3c.dom.Node data = getAsElement(getVariableValue(varRef.getVariable()));
+ retVal = evalQuery(data, varRef.getPart() != null ? varRef.getPart() : varRef.getHeaderPart(), varRef.getLocation());
+ } else if (from instanceof BPELAssign.PropertyRef) {
+ throw new UnsupportedOperationException();
+// PropertyRef propRef = (PropertyRef) from;
+// org.w3c.dom.Node data = fetchVariableData(_scopeFrame.resolve(propRef.variable), false);
+// retVal = evalQuery(data, propRef.propertyAlias.part,
+// propRef.propertyAlias.location, getEvaluationContext());
+ } else if (from instanceof BPELAssign.PartnerLinkRef) {
+ throw new UnsupportedOperationException();
+// PartnerLinkRef pLinkRef = (PartnerLinkRef) from;
+// PartnerLinkInstance pLink = _scopeFrame.resolve(pLinkRef.partnerLink);
+// Node tempVal = pLinkRef.isMyEndpointReference ?
+// getBpelRuntimeContext().fetchMyRoleEndpointReferenceData(pLink)
+// : getBpelRuntimeContext().fetchPartnerRoleEndpointReferenceData(pLink);
+// retVal = tempVal;
+ } else if (from instanceof BPELAssign.Expression) {
+ List<org.w3c.dom.Node> l;
+ String expr = ((Expression) from).getExpression();
+ try {
+ l = new ArrayList<org.w3c.dom.Node>();
+ l.add(getAsElement(evaluateExpression(expr)));
+ } catch (Throwable t) {
+ throw new IllegalArgumentException("Could not evaluate expression", t);
+ }
+ if (l.size() == 0) {
+ throw new IllegalArgumentException(
+ "RValue no nodes selected: " + expr);
+ } else if (l.size() > 1) {
+ throw new IllegalArgumentException(
+ "RValue multiple nodes selected: " + expr);
+ }
+ retVal = (org.w3c.dom.Node) l.get(0);
+ } else if (from instanceof BPELAssign.Literal) {
+ Element literalRoot = getAsElement(((Literal) from).getValue());
+ assert literalRoot.getLocalName().equals("literal");
+ // We'd like a single text node...
+
+ literalRoot.normalize();
+ retVal = literalRoot.getFirstChild();
+
+ // Adjust for whitespace before an element.
+ if (retVal != null && retVal.getNodeType() == org.w3c.dom.Node.TEXT_NODE
+ && retVal.getTextContent().trim().length() == 0
+ && retVal.getNextSibling() != null) {
+ retVal = retVal.getNextSibling();
+ }
+
+ if (retVal == null) {
+ // Special case, no children --> empty TII
+ retVal = literalRoot.getOwnerDocument().createTextNode("");
+ } else if (retVal.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
+ // Make sure there is no more elements.
+ org.w3c.dom.Node x = retVal.getNextSibling();
+ while (x != null) {
+ if (x.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
+ throw new IllegalArgumentException(
+ "Literal contains multiple EIIs");
+
+ }
+ x = x.getNextSibling();
+ }
+ } else if (retVal.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
+ // Make sure there are no elements following this text node.
+ org.w3c.dom.Node x = retVal.getNextSibling();
+ while (x != null) {
+ if (x.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
+ throw new IllegalArgumentException(
+ "Literal contains mixed content");
+ }
+ x = x.getNextSibling();
+ }
+
+ }
+
+ if (retVal == null) {
+ throw new IllegalArgumentException(
+ "Literal must contain TII or EII");
+ }
+ } else {
+ throw new IllegalArgumentException(
+ "Unknown RVALUE type: " + from);
+ }
+
+ // Now verify we got something.
+ if (retVal == null) {
+ throw new IllegalArgumentException("Empty RValue");
+ }
+
+ // Now check that we got the right thing.
+ switch (retVal.getNodeType()) {
+ case org.w3c.dom.Node.TEXT_NODE:
+ case org.w3c.dom.Node.ATTRIBUTE_NODE:
+ case org.w3c.dom.Node.ELEMENT_NODE:
+ case org.w3c.dom.Node.CDATA_SECTION_NODE:
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid RValue");
+
+ }
+ return retVal;
+ }
+
+// private void replaceEndpointRefence(PartnerLinkInstance plval, org.w3c.dom.Node rvalue) {
+// // Eventually wrapping with service-ref element if we've been directly assigned some
+// // value that isn't wrapped.
+// if (rvalue.getNodeType() == org.w3c.dom.Node.TEXT_NODE ||
+// (rvalue.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE && !rvalue.getLocalName().equals("service-ref"))) {
+// Document doc = DOMUtils.newDocument();
+// Element serviceRef = doc.createElementNS(Namespaces.WSBPEL2_0_FINAL_SERVREF, "service-ref");
+// doc.appendChild(serviceRef);
+// NodeList children = rvalue.getChildNodes();
+// for (int m = 0; m < children.getLength(); m++) {
+// org.w3c.dom.Node child = children.item(m);
+// serviceRef.appendChild(doc.importNode(child, true));
+// }
+// rvalue = serviceRef;
+// }
+//
+// getBpelRuntimeContext().writeEndpointReference(plval, (Element)rvalue);
+// }
+
+ private Element replaceElement(Element lval, Element ptr, Element src,
+ boolean keepSrcElement) {
+ Document doc = ptr.getOwnerDocument();
+ org.w3c.dom.Node parent = ptr.getParentNode();
+ if (keepSrcElement) {
+ Element replacement = (Element)doc.importNode(src, true);
+ parent.replaceChild(replacement, ptr);
+ return (lval == ptr) ? replacement : lval;
+ }
+
+ Element replacement = doc.createElementNS(ptr.getNamespaceURI(), ptr.getLocalName());
+ NodeList nl = src.getChildNodes();
+ for (int i = 0; i < nl.getLength(); ++i)
+ replacement.appendChild(doc.importNode(nl.item(i), true));
+ NamedNodeMap attrs = src.getAttributes();
+ for (int i = 0; i < attrs.getLength(); ++i)
+ if (!((Attr)attrs.item(i)).getName().startsWith("xmlns"))
+ replacement.setAttributeNodeNS((Attr)doc.importNode(attrs.item(i), true));
+ parent.replaceChild(replacement, ptr);
+ DOMUtils.copyNSContext(ptr, replacement);
+
+ return (lval == ptr) ? replacement : lval;
+ }
+
+ private Element copyInto(Element lval, Element ptr, Element src) {
+ ptr.appendChild(ptr.getOwnerDocument().importNode(src, true));
+ return lval;
+ }
+
+ /**
+ * isInsert flag desginates this as an 'element' type insertion, which
+ * requires insert the actual element value, rather than it's children
+ *
+ * @return
+ * @throws FaultException
+ */
+ private org.w3c.dom.Node replaceContent(org.w3c.dom.Node lvalue, org.w3c.dom.Node lvaluePtr, String rvalue) {
+ Document d = lvaluePtr.getOwnerDocument();
+
+ switch (lvaluePtr.getNodeType()) {
+ case org.w3c.dom.Node.ELEMENT_NODE:
+
+ // Remove all the children.
+ while (lvaluePtr.hasChildNodes())
+ lvaluePtr.removeChild(lvaluePtr.getFirstChild());
+
+ // Append a new text node.
+ lvaluePtr.appendChild(d.createTextNode(rvalue));
+
+ // If lvalue is a text, removing all lvaluePtr children had just removed it
+ // so we need to rebuild it as a child of lvaluePtr
+ if (lvalue instanceof Text)
+ lvalue = lvaluePtr.getFirstChild();
+ break;
+
+ case org.w3c.dom.Node.TEXT_NODE:
+
+ org.w3c.dom.Node newval = d.createTextNode(rvalue);
+ // Replace ourselves .
+ lvaluePtr.getParentNode().replaceChild(newval, lvaluePtr);
+
+ // A little kludge, let our caller know that the root element has changed.
+ // (used for assignment to a simple typed variable)
+ if (lvalue.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
+ // No children, adding an empty text children to point to
+ if (lvalue.getFirstChild() == null) {
+ Text txt = lvalue.getOwnerDocument().createTextNode("");
+ lvalue.appendChild(txt);
+ }
+ if (lvalue.getFirstChild().getNodeType() == org.w3c.dom.Node.TEXT_NODE)
+ lvalue = lvalue.getFirstChild();
+ }
+ if (lvalue.getNodeType() == org.w3c.dom.Node.TEXT_NODE && ((Text) lvalue).getWholeText().equals(
+ ((Text) lvaluePtr).getWholeText()))
+ lvalue = lvaluePtr = newval;
+ break;
+
+ case org.w3c.dom.Node.ATTRIBUTE_NODE:
+
+ ((Attr) lvaluePtr).setValue(rvalue);
+ break;
+
+ default:
+ // This could occur if the expression language selects something
+ // like
+ // a PI or a CDATA.
+ throw new IllegalArgumentException(
+ "Could not replace content, illegal node type: " + lvaluePtr.getNodeType());
+ }
+
+ return lvalue;
+ }
+
+ private org.w3c.dom.Node evalQuery(org.w3c.dom.Node data, String part, String expression) {
+ assert data != null;
+
+ if (part != null) {
+ QName partName = new QName(null, part);
+ org.w3c.dom.Node qualLVal = DOMUtils.findChildByName((Element) data, partName);
+// if (part.type instanceof OElementVarType) {
+// QName elName = ((OElementVarType) part.type).elementType;
+// qualLVal = DOMUtils.findChildByName((Element) qualLVal, elName);
+// } else if (part.type == null) {
+// // Special case of header parts never referenced in the WSDL def
+// if (qualLVal != null && qualLVal.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE
+// && ((Element)qualLVal).getAttribute("headerPart") != null)
+// qualLVal = DOMUtils.getFirstChildElement((Element) qualLVal);
+// // The needed part isn't there, dynamically creating it
+// if (qualLVal == null) {
+// qualLVal = data.getOwnerDocument().createElementNS(null, part);
+// ((Element)qualLVal).setAttribute("headerPart", "true");
+// data.appendChild(qualLVal);
+// }
+// }
+ data = qualLVal;
+ }
+
+ if (expression != null) {
+ // Neat little trick....
+ data = getAsElement(evaluateExpression(expression));
+ }
+
+ return data;
+ }
+
+ private String evaluateExpression(String expression) {
+ 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);
+ }
+ }
+
+// private Object getValue(From from) {
+// if (from instanceof VariableRef) {
+// VariableRef fromPart = (VariableRef) 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 Literal) {
+// return ((Literal) 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 toDocument = factory.newDocumentBuilder().parse(new ByteArrayInputStream(toValue.getBytes()));
+// Element to = DOMUtils.findChildByName((Element) toDocument.getDocumentElement(), new QName(toPart));
+// 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);
+// }
+// }
+//
+// private String initializeVariable(String variable) {
+// 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 getVariableType(String variable) {
+ 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();
+ int index = type.lastIndexOf("}");
+ if (index != -1) {
+ type = type.substring(index + 1);
+ }
+ return type;
+ }
+ }
+ return null;
+ }
+
+ private Element getAsElement(String value) {
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document toDocument = factory.newDocumentBuilder().parse(new ByteArrayInputStream(value.getBytes()));
+ return toDocument.getDocumentElement();
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not parse value " + value, t);
+ }
+ }
+
+ private String getVariableValue(String variable) {
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
+ if (variableScopeInstance != null) {
+ return (String) variableScopeInstance.getVariable(variable);
+ } else {
+ System.err.println("Could not find variable scope for variable " + variable);
+ System.err.println("when trying assign");
+ System.err.println("Continuing without setting variable.");
+ }
+ return null;
+ }
+
+ private void setVariableValue(String variable, Object value) {
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
+ if (variableScopeInstance != null) {
+ variableScopeInstance.setVariable(variable, value);
+ } else {
+ System.err.println("Could not find variable scope for variable " + variable);
+ System.err.println("when trying assign");
+ System.err.println("Continuing without setting variable.");
+ }
+ }
+
+ public void triggerCompleted(String type, boolean remove) {
+ super.triggerCompleted(type, remove);
+ BPELLinkManager.activateTargetLinks(this);
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XMLDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XMLDataType.java 2008-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XMLDataType.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -10,6 +10,10 @@
private String typeDefinition;
+ public XMLDataType(String typeDefinition) {
+ this.typeDefinition = typeDefinition;
+ }
+
public boolean verifyDataType(Object value) {
return value instanceof String;
}
@@ -18,10 +22,6 @@
return typeDefinition;
}
- public void setTypeDefinition(String typeDefinition) {
- this.typeDefinition = typeDefinition;
- }
-
public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
typeDefinition = input.readUTF();
}
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -59,7 +59,28 @@
});
xpf.setXPathVariableResolver(new XPathVariableResolver() {
public Object resolveVariable(QName name) {
- return processContext.getVariable(name.getLocalPart());
+ String varName;
+ String partName;
+ int dotloc = name.getLocalPart().indexOf('.');
+ if (dotloc == -1) {
+ varName = name.getLocalPart();
+ partName = null;
+ } else {
+ varName = name.getLocalPart().substring(0, dotloc);
+ partName = name.getLocalPart().substring(dotloc + 1);
+ }
+ String value = (String) processContext.getVariable(varName);
+ if (partName == null) {
+ return value;
+ }
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document fromDocument = factory.newDocumentBuilder().parse(new ByteArrayInputStream(value.getBytes()));
+ return DOMUtils.findChildByName((Element) fromDocument.getDocumentElement(), new QName(partName));
+ } catch (Throwable t) {
+ throw new IllegalArgumentException(
+ "Could not get part of variable", t);
+ }
}
});
XPathEvaluator xpe = (XPathEvaluator) xpf.newXPath();
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf 2008-08-05 22:42:05 UTC (rev 21374)
@@ -5,11 +5,13 @@
import org.drools.bpel.core.BPELReceive;
import org.drools.bpel.core.BPELReply;
import org.drools.bpel.core.BPELScope;
+import org.drools.bpel.core.BPELScope$BPELFaultHandlerScope;
import org.drools.bpel.core.BPELSequence;
import org.drools.bpel.core.BPELEmpty;
import org.drools.bpel.core.BPELPick;
import org.drools.bpel.core.BPELIf;
import org.drools.bpel.core.BPELThrow;
+import org.drools.bpel.core.BPELRethrow;
import org.drools.bpel.core.BPELWait;
import org.drools.bpel.core.BPELWhile;
import org.drools.bpel.core.BPELRepeatUntil;
@@ -25,26 +27,30 @@
import org.drools.bpel.instance.BPELPickInstance;
import org.drools.bpel.instance.BPELIfInstance;
import org.drools.bpel.instance.BPELThrowInstance;
+import org.drools.bpel.instance.BPELRethrowInstance;
import org.drools.bpel.instance.BPELWaitInstance;
import org.drools.bpel.instance.BPELWhileInstance;
import org.drools.bpel.instance.BPELRepeatUntilInstance;
import org.drools.bpel.instance.BPELExitInstance;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
import org.drools.workflow.instance.impl.factory.ReuseNodeFactory;
[
- 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 ),
+ BPELAssign : new ReuseNodeFactory( BPELAssignInstance ),
+ BPELFlow : new ReuseNodeFactory( BPELFlowInstance ),
+ BPELInvoke : new ReuseNodeFactory( BPELInvokeInstance ),
+ BPELReceive : new ReuseNodeFactory( BPELReceiveInstance ),
+ BPELReply : new ReuseNodeFactory( BPELReplyInstance ),
+ BPELScope : new ReuseNodeFactory( BPELScopeInstance ),
+ BPELFaultHandlerScope : new ReuseNodeFactory( CompositeContextNodeInstance ),
+ BPELSequence : new ReuseNodeFactory( BPELSequenceInstance ),
+ BPELEmpty : new ReuseNodeFactory( BPELEmptyInstance ),
+ BPELPick : new ReuseNodeFactory( BPELPickInstance ),
+ BPELIf : new ReuseNodeFactory( BPELIfInstance ),
+ BPELThrow : new ReuseNodeFactory( BPELThrowInstance ),
+ BPELRethrow : new ReuseNodeFactory( BPELRethrowInstance ),
+ 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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCompilerTest.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -96,7 +96,10 @@
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "{http://manufacturing.org/wsdl/purchase}shippingPT", "requestShipping");
BPELTestUtil.replyWebServiceInvocationFault(workingMemory, workItem, "{http://manufacturing.org/wsdl/purchase}cannotCompleteOrder", "SHIPPING FAULT");
- assertEquals(ProcessInstance.STATE_ABORTED, processInstance.getState());
+ workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder");
+ BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
}
}
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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -21,6 +21,7 @@
import org.drools.bpel.core.BPELActivity.TargetLink;
import org.drools.bpel.instance.BPELProcessInstance;
import org.drools.bpel.test.BPELTestUtil.WebServiceInvocationHandler;
+import org.drools.bpel.xpath.XMLDataType;
import org.drools.common.AbstractRuleBase;
import org.drools.common.InternalWorkingMemory;
import org.drools.compiler.PackageBuilder;
@@ -28,7 +29,6 @@
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.instance.ProcessInstance;
import org.drools.process.instance.WorkItem;
import org.drools.process.instance.WorkItemHandler;
@@ -42,34 +42,33 @@
process.setId("1");
process.setVersion("1");
process.setPackageName("org.drools.bpel.test");
- int nodeId = 0;
// variables
VariableScope variableScope = process.getVariableScope();
List<Variable> variables = new ArrayList<Variable>();
Variable variable = new Variable();
variable.setName("PO");
- variable.setType(new StringDataType());
+ variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}POMessage"));
variables.add(variable);
variable = new Variable();
variable.setName("Invoice");
- variable.setType(new StringDataType());
+ variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}InvMessage"));
variables.add(variable);
variable = new Variable();
variable.setName("POFault");
- variable.setType(new StringDataType());
+ variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}orderFaultType"));
variables.add(variable);
variable = new Variable();
variable.setName("shippingRequest");
- variable.setType(new StringDataType());
+ variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}shippingRequestMessage"));
variables.add(variable);
variable = new Variable();
variable.setName("shippingInfo");
- variable.setType(new StringDataType());
+ variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}shippingInfoMessage"));
variables.add(variable);
variable = new Variable();
variable.setName("shippingSchedule");
- variable.setType(new StringDataType());
+ variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}scheduleMessage"));
variables.add(variable);
variableScope.setVariables(variables);
@@ -79,7 +78,6 @@
faultHandler.setFaultName("lns:cannotCompleteOrder");
faultHandler.setFaultVariable("POFault");
BPELReply reply = new BPELReply();
- reply.setId(++nodeId);
reply.setPartnerLink("purchasing");
reply.setPortType("lns:purchaseOrderPT");
reply.setOperation("sendPurchaseOrder");
@@ -91,13 +89,11 @@
// sequence
BPELSequence sequence = new BPELSequence();
- sequence.setId(++nodeId);
sequence.setName("sequence");
List<BPELActivity> sequenceActivities = new ArrayList<BPELActivity>();
// Receive purchase order
BPELReceive receive = new BPELReceive();
- receive.setId(++nodeId);
receive.setName("Receive Purchase Order");
receive.setOperation("purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder");
receive.setVariable("PO");
@@ -106,29 +102,25 @@
// flow
BPELFlow flow = new BPELFlow();
- flow.setId(++nodeId);
flow.setName("flow");
flow.setLinks(new String[] { "ship-to-invoice", "ship-to-scheduling" });
List<BPELActivity> flowActivities = new ArrayList<BPELActivity>();
/********** sequence1 **********/
BPELSequence sequence1 = new BPELSequence();
- sequence1.setId(++nodeId);
sequence1.setName("sequence1");
List<BPELActivity> sequence1Activities = new ArrayList<BPELActivity>();
// assign1
BPELAssign assign1 = new BPELAssign();
- assign1.setId(++nodeId);
BPELAssign.Copy copy = assign1.new Copy();
- copy.setFrom(assign1.new VariablePart("PO", "customerInfo"));
- copy.setTo(assign1.new VariablePart("shippingRequest", "customerInfo"));
+ copy.setFrom(assign1.new VariableRef("PO", "customerInfo", null, null));
+ copy.setTo(assign1.new VariableRef("shippingRequest", "customerInfo", null, null));
assign1.addCopy(copy);
sequence1Activities.add(assign1);
// invoke1
BPELInvoke invoke1 = new BPELInvoke();
- invoke1.setId(++nodeId);
invoke1.setName("Decide On Shipper");
invoke1.setPartnerLink("shipping");
invoke1.setPortType("lns:shippingPT");
@@ -140,7 +132,6 @@
// receive1
BPELReceive receive1 = new BPELReceive();
- receive1.setId(++nodeId);
receive1.setName("Arrange Logistics");
receive1.setOperation("shipping", "lns:shippingCallbackPT", "sendSchedule");
receive1.setVariable("shippingSchedule");
@@ -153,13 +144,11 @@
/********** sequence2 **********/
BPELSequence sequence2 = new BPELSequence();
- sequence2.setId(++nodeId);
sequence2.setName("sequence2");
List<BPELActivity> sequence2Activities = new ArrayList<BPELActivity>();
// invoke2a
BPELInvoke invoke2a = new BPELInvoke();
- invoke2a.setId(++nodeId);
invoke2a.setName("Initial Price Calculation");
invoke2a.setPartnerLink("invoicing");
invoke2a.setPortType("lns:computePricePT");
@@ -169,7 +158,6 @@
// invoke2b
BPELInvoke invoke2b = new BPELInvoke();
- invoke2b.setId(++nodeId);
invoke2b.setName("Complete Price Calculation");
invoke2b.setPartnerLink("invoicing");
invoke2b.setPortType("lns:computePricePT");
@@ -180,7 +168,6 @@
// receive2
BPELReceive receive2 = new BPELReceive();
- receive2.setId(++nodeId);
receive2.setName("Receive Invoice");
receive2.setOperation("invoicing", "lns:invoiceCallbackPT", "sendInvoice");
receive2.setVariable("Invoice");
@@ -192,13 +179,11 @@
/********** sequence3 **********/
BPELSequence sequence3 = new BPELSequence();
- sequence3.setId(++nodeId);
sequence3.setName("sequence3");
List<BPELActivity> sequence3Activities = new ArrayList<BPELActivity>();
// invoke3a
BPELInvoke invoke3a = new BPELInvoke();
- invoke3a.setId(++nodeId);
invoke3a.setName("Initiate Production Scheduling");
invoke3a.setPartnerLink("scheduling");
invoke3a.setPortType("lns:schedulingPT");
@@ -208,7 +193,6 @@
// invoke2b
BPELInvoke invoke3b = new BPELInvoke();
- invoke3b.setId(++nodeId);
invoke3b.setName("Complete Production Scheduling");
invoke3b.setPartnerLink("scheduling");
invoke3b.setPortType("lns:schedulingPT");
@@ -225,7 +209,6 @@
// reply
reply = new BPELReply();
- reply.setId(++nodeId);
reply.setName("Invoice Processing");
reply.setPartnerLink("purchasing");
reply.setPortType("lns:purchaseOrderPT");
@@ -322,7 +305,10 @@
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
BPELTestUtil.replyWebServiceInvocationFault(workingMemory, workItem, "lns:cannotCompleteOrder", "SHIPPING FAULT");
- assertEquals(ProcessInstance.STATE_ABORTED, processInstance.getState());
+ workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder");
+ BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+
+ assertEquals(ProcessInstance.STATE_COMPLETED, 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-08-05 19:10:51 UTC (rev 21373)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTestUtil.java 2008-08-05 22:42:05 UTC (rev 21374)
@@ -72,7 +72,7 @@
+ workItem.getParameter("PartnerLink") + " "
+ workItem.getParameter("PortType") + " "
+ (workItem.getParameter("FaultName") == null ? ""
- : "fault=" + workItem.getParameter("FaultName"))
+ : "fault=" + workItem.getParameter("FaultName")) + " "
+ workItem.getParameter("Operation") + ", message = "
+ workItem.getParameter("Message"));
}
More information about the jboss-svn-commits
mailing list