[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