[jboss-svn-commits] JBL Code SVN: r21226 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/workflow/instance/node and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jul 25 10:56:37 EDT 2008


Author: KrisVerlaenen
Date: 2008-07-25 10:56:37 -0400 (Fri, 25 Jul 2008)
New Revision: 21226

Added:
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/
   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/BPELCompensationHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELCorrelation.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELEmpty.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELThrow.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/core/BPELWhile.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELEmptyInstance.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/BPELPickInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSwitchInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/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/instance/BPELWhileInstance.java
   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
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/resources/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/resources/purchaseOrderProcess.bpel
Removed:
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELBasicActivity.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultExceptionHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELStructuredActivity.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionHandlerInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTest.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.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/WorkItemNodeInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELActivity.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/BPELInvoke.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReply.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/instance/BPELExceptionScopeInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELLinkManager.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELNodeInstanceFactoryRegistry.java
Log:
JBRULES-1696: Extends WS-BPEL support
 - extended support for more node types and improved implemenation
  - integrated ODE parser for reading in XML files

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -137,8 +137,8 @@
         return outConnectionMap.get(outType);
     }
     
-    public CompositeNode.NodeAndType internalGetLinkedOutgoingNode(String inType) {
-        return inConnectionMap.get(inType);
+    public CompositeNode.NodeAndType internalGetLinkedOutgoingNode(String outType) {
+        return outConnectionMap.get(outType);
     }
 
     public Map<String, CompositeNode.NodeAndType> getLinkedIncomingNodes() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -28,9 +28,17 @@
 	private static final long serialVersionUID = 400L;
 	
 	private String faultName;
-	private String faultData;
+	private String faultVariable;
 
-    public String getFaultName() {
+    public String getFaultVariable() {
+		return faultVariable;
+	}
+
+	public void setFaultVariable(String faultVariable) {
+		this.faultVariable = faultVariable;
+	}
+
+	public String getFaultName() {
 		return faultName;
 	}
 

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-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/FaultNodeInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -17,8 +17,10 @@
  */
 
 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.core.Node;
 import org.drools.workflow.core.node.FaultNode;
 import org.drools.workflow.instance.NodeInstance;
@@ -46,10 +48,27 @@
         ExceptionScopeInstance exceptionScopeInstance = (ExceptionScopeInstance)
             resolveContextInstance(ExceptionScope.EXCEPTION_SCOPE, faultNode.getFaultName());
         if (exceptionScopeInstance != null) {
-            exceptionScopeInstance.handleException(faultNode.getFaultName(), null);
+        	handleException(exceptionScopeInstance);
         } else {
         	getProcessInstance().setState(ProcessInstance.STATE_ABORTED);
         }
     }
+    
+    protected void handleException(ExceptionScopeInstance exceptionScopeInstance) {
+    	Object value = null;
+    	String faultVariable = getFaultNode().getFaultVariable();
+    	if (faultVariable != null) {
+    		VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+            	resolveContextInstance(VariableScope.VARIABLE_SCOPE, faultVariable);
+            if (variableScopeInstance != null) {
+                value = variableScopeInstance.getVariable(faultVariable);
+            } else {
+                System.err.println("Could not find variable scope for variable " + faultVariable);
+                System.err.println("when trying to execute fault node " + getFaultNode().getName());
+                System.err.println("Continuing without setting value.");
+            }
+    	}
+        exceptionScopeInstance.handleException(getFaultNode().getFaultName(), value);
+    }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -164,8 +164,10 @@
     }
     
     public void cancel() {
+    	if (workItemId != -1) {
+    		getProcessInstance().getWorkingMemory().getWorkItemManager().internalAbortWorkItem(workItemId);
+    	}
         super.cancel();
-        getProcessInstance().getWorkingMemory().getWorkItemManager().internalAbortWorkItem(workItem.getId());
     }
     
     public void addEventListeners() {

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/.classpath	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/.classpath	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,9 +1,19 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/main/java"/>
-	<classpathentry kind="src" path="src/test/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/drools-compiler"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/drools-core"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry kind="src" path="src/main/resources"/>
+	<classpathentry kind="src" path="src/test/java"/>
+	<classpathentry kind="src" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/drools-compiler"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/drools-core"/>
+	<classpathentry kind="lib" path="lib/ode-bpel-compiler.jar"/>
+	<classpathentry kind="lib" path="lib/commons-logging-1.1.jar"/>
+	<classpathentry kind="lib" path="lib/wsdl4j-1.6.1.jar"/>
+	<classpathentry kind="lib" path="lib/ode-utils.jar"/>
+	<classpathentry kind="lib" path="lib/xercesImpl-2.9.0.jar"/>
+	<classpathentry kind="lib" path="lib/ode-bpel-schemas.jar"/>
+	<classpathentry kind="lib" path="lib/xalan-2.7.0.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,163 @@
+package org.drools.bpel.compiler;
+
+import java.io.ByteArrayInputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.ode.bpel.compiler.bom.Activity;
+import org.apache.ode.bpel.compiler.bom.AssignActivity;
+import org.apache.ode.bpel.compiler.bom.BpelObjectFactory;
+import org.apache.ode.bpel.compiler.bom.Catch;
+import org.apache.ode.bpel.compiler.bom.FlowActivity;
+import org.apache.ode.bpel.compiler.bom.InvokeActivity;
+import org.apache.ode.bpel.compiler.bom.Link;
+import org.apache.ode.bpel.compiler.bom.LinkSource;
+import org.apache.ode.bpel.compiler.bom.LinkTarget;
+import org.apache.ode.bpel.compiler.bom.Process;
+import org.apache.ode.bpel.compiler.bom.ReceiveActivity;
+import org.apache.ode.bpel.compiler.bom.ReplyActivity;
+import org.apache.ode.bpel.compiler.bom.SequenceActivity;
+import org.apache.ode.utils.StreamUtils;
+import org.drools.bpel.core.BPELActivity;
+import org.drools.bpel.core.BPELAssign;
+import org.drools.bpel.core.BPELFaultHandler;
+import org.drools.bpel.core.BPELFlow;
+import org.drools.bpel.core.BPELInvoke;
+import org.drools.bpel.core.BPELProcess;
+import org.drools.bpel.core.BPELReceive;
+import org.drools.bpel.core.BPELReply;
+import org.drools.bpel.core.BPELSequence;
+import org.drools.bpel.core.BPELActivity.SourceLink;
+import org.drools.bpel.core.BPELActivity.TargetLink;
+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.xml.sax.InputSource;
+
+public class BPELCompiler {
+
+	public BPELProcess compileProcess(URL bpelFile) throws Exception {
+		InputSource isrc = new InputSource(new ByteArrayInputStream(StreamUtils.read(bpelFile)));
+		Process process = BpelObjectFactory.getInstance().parse(isrc, bpelFile.toURI());
+		return compileProcess(process);
+	}
+	
+	private BPELProcess compileProcess(Process process) {
+		BPELProcess result = new BPELProcess();
+		result.setName(process.getName());
+		result.setId(process.getTargetNamespace());
+		result.setPackageName("org.drools.bpel");
+		result.setVersion("1.0");
+		BPELActivity activity = compileActivity(process.getRootActivity());
+		result.setActivity(activity);
+		// variables
+		VariableScope variableScope = result.getVariableScope();
+        List<Variable> variables = new ArrayList<Variable>();
+		for (org.apache.ode.bpel.compiler.bom.Variable variable: process.getVariables()) {
+	        Variable bpelVariable =	new Variable();
+	        bpelVariable.setName(variable.getName());
+	        bpelVariable.setType(new StringDataType());
+	        variables.add(bpelVariable);
+		}
+		variableScope.setVariables(variables);
+		// fault handlers
+        List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
+        for (Catch catcher: process.getFaultHandler().getCatches()) {
+            BPELFaultHandler faultHandler = new BPELFaultHandler();
+            faultHandler.setFaultName(catcher.getFaultName().toString());
+            faultHandler.setFaultVariable(catcher.getFaultVariable());
+            faultHandler.setActivity(compileActivity(catcher.getActivity()));
+            faultHandlers.add(faultHandler);
+        }
+        result.setFaultHandlers(faultHandlers);
+		return result;
+	}
+	
+	private BPELActivity compileActivity(Activity activity) {
+		BPELActivity result = null;
+		if (activity instanceof ReceiveActivity) {
+			ReceiveActivity receiveActivity = (ReceiveActivity) activity;
+			BPELReceive receive = new BPELReceive();
+			receive.setCreateInstance(receiveActivity.isCreateInstance());
+			receive.setPartnerLink(receiveActivity.getPartnerLink());
+			receive.setPortType(receiveActivity.getPortType().toString());
+			receive.setOperation(receiveActivity.getOperation());
+			receive.setVariable(receiveActivity.getVariable());
+			result = receive;
+		} else if (activity instanceof ReplyActivity) {
+			ReplyActivity replyActivity = (ReplyActivity) activity;
+			BPELReply reply = new BPELReply();
+			reply.setPartnerLink(replyActivity.getPartnerLink());
+			reply.setPortType(replyActivity.getPortType().toString());
+			reply.setOperation(replyActivity.getOperation());
+			reply.setVariable(replyActivity.getVariable());
+			if (replyActivity.getFaultName() != null) {
+				reply.setFaultName(replyActivity.getFaultName().toString());
+			}
+			result = reply;
+		} else if (activity instanceof InvokeActivity) {
+			InvokeActivity invokeActivity = (InvokeActivity) activity;
+			BPELInvoke invoke = new BPELInvoke();
+			invoke.setPartnerLink(invokeActivity.getPartnerLink());
+			invoke.setPortType(invokeActivity.getPortType().toString());
+			invoke.setOperation(invokeActivity.getOperation());
+			invoke.setInputVariable(invokeActivity.getInputVar());
+			if (invokeActivity.getOutputVar() != null) { 
+				invoke.setOutputVariable(invokeActivity.getOutputVar());
+			}
+			result = invoke;
+		} else if (activity instanceof SequenceActivity) {
+			SequenceActivity sequenceActivity = (SequenceActivity) activity;
+			BPELSequence sequence = new BPELSequence();
+			List<BPELActivity> subActivities = new ArrayList<BPELActivity>();
+			for (Activity subActivity: sequenceActivity.getActivities()) {
+				subActivities.add(compileActivity(subActivity));
+			}
+			sequence.setActivities(subActivities);
+			result = sequence;
+		} else if (activity instanceof FlowActivity) {
+			FlowActivity flowActivity = (FlowActivity) activity;
+			BPELFlow flow = new BPELFlow();
+			List<BPELActivity> subActivities = new ArrayList<BPELActivity>();
+			for (Activity subActivity: flowActivity.getActivities()) {
+				subActivities.add(compileActivity(subActivity));
+			}
+			flow.setActivities(subActivities);
+			String[] links = new String[flowActivity.getLinks().size()];
+			int i = 0;
+			for (Link link: flowActivity.getLinks()) {
+				links[i++] = link.getLinkName();
+			}
+			flow.setLinks(links);
+			result = flow;
+		} else if (activity instanceof AssignActivity) {
+			AssignActivity assignActivity = (AssignActivity) activity;
+			BPELAssign assign = new BPELAssign();
+			// TODO
+			assign.setAction("");
+			result = assign;
+		} else {
+			throw new IllegalArgumentException("Unknown activity type " + activity.getClass());
+		}
+		result.setName(activity.getName());
+		SourceLink[] sourceLinks = new SourceLink[activity.getLinkSources().size()];
+		int i = 0;
+		for (LinkSource linkSource: activity.getLinkSources()) {
+			sourceLinks[i] = new SourceLink(linkSource.getLinkName());
+			if (linkSource.getTransitionCondition() != null) {
+				sourceLinks[i].setTransitionCondition(linkSource.getTransitionCondition().getTextValue());
+			}
+			i++;
+		}
+		result.setSourceLinks(sourceLinks);
+		TargetLink[] targetLinks = new TargetLink[activity.getLinkTargets().size()];
+		i = 0;
+		for (LinkTarget linkTarget: activity.getLinkTargets()) {
+			targetLinks[i++] = new TargetLink(linkTarget.getLinkName());
+		}
+		result.setTargetLinks(targetLinks);
+		return result;
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELActivity.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELActivity.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELActivity.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -7,13 +7,58 @@
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
 public interface BPELActivity extends Node {
+	
+	// TODO
+	// String getJoinCondition();
+	// void setJoinCondition(String joinCondition);
+	
+	// TODO
+	// boolean isSuppressJoinFailure();
+	// void setSuppressJoinFailure(boolean suppressJoinFailure);
 
-    String[] getSourceLinks();
+    SourceLink[] getSourceLinks();
     
-    void setSourceLinks(String[] sourceLinks);
+    void setSourceLinks(SourceLink[] sourceLinks);
     
-    String[] getTargetLinks();
+    TargetLink[] getTargetLinks();
     
-    void setTargetLinks(String[] targetLinks);
+    void setTargetLinks(TargetLink[] targetLinks);
     
+    public class SourceLink {
+    	
+    	private String linkName;
+    	private String transitionCondition;
+    	
+		public SourceLink(String linkName) {
+			this.linkName = linkName;
+		}
+		
+		public String getLinkName() {
+			return linkName;
+		}
+		
+		public String getTransitionCondition() {
+			return transitionCondition;
+		}
+		
+		public void setTransitionCondition(String transitionCondition) {
+			this.transitionCondition = transitionCondition;
+		}
+		
+    }
+    
+    public class TargetLink {
+    	
+    	private String linkName;
+    	
+    	public TargetLink(String linkName) {
+    		this.linkName = linkName;
+    	}
+
+		public String getLinkName() {
+			return linkName;
+		}
+
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -8,30 +8,30 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELAssign extends ActionNode implements BPELBasicActivity {
+public class BPELAssign extends ActionNode implements BPELActivity {
 
     private static final long serialVersionUID = 400L;
     
-    private String[] sourceLinks;
-    private String[] targetLinks;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
     
     public void setAction(String assign) {
         setAction(new DroolsConsequenceAction("mvel", assign));
     }
 
-    public String[] getSourceLinks() {
+    public SourceLink[] getSourceLinks() {
         return sourceLinks;
     }
 
-    public void setSourceLinks(String[] sourceLinks) {
+    public void setSourceLinks(SourceLink[] sourceLinks) {
         this.sourceLinks = sourceLinks;
     }
 
-    public String[] getTargetLinks() {
+    public TargetLink[] getTargetLinks() {
         return targetLinks;
     }
 
-    public void setTargetLinks(String[] targetLinks) {
+    public void setTargetLinks(TargetLink[] targetLinks) {
         this.targetLinks = targetLinks;
     }
 

Deleted: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELBasicActivity.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELBasicActivity.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELBasicActivity.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,10 +0,0 @@
-package org.drools.bpel.core;
-
-
-/**
- * 
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public interface BPELBasicActivity extends BPELActivity {
-
-}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELCompensationHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELCompensationHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELCompensationHandler.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,19 @@
+package org.drools.bpel.core;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELCompensationHandler {
+
+    private BPELActivity activity;
+
+	public BPELActivity getActivity() {
+		return activity;
+	}
+
+	public void setActivity(BPELActivity activity) {
+		this.activity = activity;
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELCorrelation.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELCorrelation.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELCorrelation.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,41 @@
+package org.drools.bpel.core;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELCorrelation {
+	
+	public static final int PATTERN_IN = 1;
+	public static final int PATTERN_OUT = 2;
+	public static final int PATTERN_OUT_IN = 3;
+	
+	private String set;
+	private boolean initiate;
+	private int pattern;
+	
+	public String getSet() {
+		return set;
+	}
+	
+	public void setSet(String set) {
+		this.set = set;
+	}
+	
+	public boolean isInitiate() {
+		return initiate;
+	}
+	
+	public void setInitiate(boolean initiate) {
+		this.initiate = initiate;
+	}
+	
+	public int getPattern() {
+		return pattern;
+	}
+	
+	public void setPattern(int pattern) {
+		this.pattern = pattern;
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELEmpty.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELEmpty.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELEmpty.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,37 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELEmpty extends ActionNode implements BPELActivity {
+
+	private static final long serialVersionUID = 4L;
+
+	private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
+    
+    public BPELEmpty() {
+    	this.setAction(new DroolsConsequenceAction("java", ""));
+    }
+
+    public SourceLink[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(SourceLink[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public TargetLink[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(TargetLink[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultExceptionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultExceptionHandler.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultExceptionHandler.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,21 +0,0 @@
-package org.drools.bpel.core;
-
-import org.drools.process.core.context.exception.ExceptionHandler;
-
-public class BPELFaultExceptionHandler implements ExceptionHandler {
-
-    private String faultName;
-    
-    public String getFaultName() {
-        return faultName;
-    }
-
-    public void setFaultName(String faultName) {
-        this.faultName = faultName;
-    }
-
-    public void handleException(String exception, Object params) {
-        
-    }
-
-}

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-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFlow.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -13,15 +13,15 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELFlow extends CompositeNode implements BPELStructuredActivity {
+public class BPELFlow extends CompositeNode implements BPELActivity {
     
     private static final long serialVersionUID = 400L;
     
     private Split split;
     private Join join;
     private String[] links;
-    private String[] sourceLinks;
-    private String[] targetLinks;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
     
     public BPELFlow() {
         split = new Split();
@@ -74,19 +74,19 @@
         return links;
     }
     
-    public String[] getSourceLinks() {
+    public SourceLink[] getSourceLinks() {
         return sourceLinks;
     }
 
-    public void setSourceLinks(String[] sourceLinks) {
+    public void setSourceLinks(SourceLink[] sourceLinks) {
         this.sourceLinks = sourceLinks;
     }
 
-    public String[] getTargetLinks() {
+    public TargetLink[] getTargetLinks() {
         return targetLinks;
     }
 
-    public void setTargetLinks(String[] targetLinks) {
+    public void setTargetLinks(TargetLink[] targetLinks) {
         this.targetLinks = targetLinks;
     }
 

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELInvoke.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELInvoke.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELInvoke.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -8,7 +8,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELInvoke extends WorkItemNode implements BPELBasicActivity, BPELFaultHandlerContainer {
+public class BPELInvoke extends WorkItemNode implements BPELActivity, BPELFaultHandlerContainer {
 
     private static final long serialVersionUID = 400L;
     
@@ -18,8 +18,12 @@
     private static final String INPUT = "Message";
     private static final String OUTPUT = "Result";
     
-    private String[] sourceLinks;
-    private String[] targetLinks;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
+    private BPELFaultHandler[] catches;
+    private BPELFaultHandler catchAll;
+    private BPELCorrelation[] correlations;
+    private BPELCompensationHandler compensationHandler;
     
     public BPELInvoke() {
         Work work = new WorkImpl();
@@ -67,20 +71,52 @@
         addOutMapping(OUTPUT, outputVariable);
     }
 
-    public String[] getSourceLinks() {
+    public SourceLink[] getSourceLinks() {
         return sourceLinks;
     }
 
-    public void setSourceLinks(String[] sourceLinks) {
+    public void setSourceLinks(SourceLink[] sourceLinks) {
         this.sourceLinks = sourceLinks;
     }
 
-    public String[] getTargetLinks() {
+    public TargetLink[] getTargetLinks() {
         return targetLinks;
     }
 
-    public void setTargetLinks(String[] targetLinks) {
+    public void setTargetLinks(TargetLink[] targetLinks) {
         this.targetLinks = targetLinks;
     }
 
+	public BPELFaultHandler[] getCatches() {
+		return catches;
+	}
+
+	public void setCatches(BPELFaultHandler[] catches) {
+		this.catches = catches;
+	}
+
+	public BPELFaultHandler getCatchAll() {
+		return catchAll;
+	}
+
+	public void setCatchAll(BPELFaultHandler catchAll) {
+		this.catchAll = catchAll;
+	}// TODO: BPELInvoke
+
+	public BPELCorrelation[] getCorrelations() {
+		return correlations;
+	}
+
+	public void setCorrelations(BPELCorrelation[] correlations) {
+		this.correlations = correlations;
+	}
+
+	public BPELCompensationHandler getCompensationHandler() {
+		return compensationHandler;
+	}
+
+	public void setCompensationHandler(BPELCompensationHandler compensationHandler) {
+		this.compensationHandler = compensationHandler;
+	}
+
 }

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,227 @@
+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;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELPick extends CompositeNode implements BPELActivity {
+
+    private static final long serialVersionUID = 400L;
+
+    private boolean createInstance;
+    private Join join;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
+
+    public BPELPick() {
+    	EndNode endNode = new EndNode();
+    	endNode.setTerminate(false);
+        join = new Join();
+        join.setType(Join.TYPE_XOR);
+        addNode(join);
+        linkIncomingConnections(
+            Node.CONNECTION_DEFAULT_TYPE,
+            new CompositeNode.NodeAndType(
+                endNode, Node.CONNECTION_DEFAULT_TYPE));
+        linkOutgoingConnections(
+            new CompositeNode.NodeAndType(
+                join, Node.CONNECTION_DEFAULT_TYPE),
+            Node.CONNECTION_DEFAULT_TYPE);
+    }
+    
+    public void setName(String name) {
+        super.setName(name);
+        join.setName(name + " join");
+    }
+    
+    public boolean isCreateInstance() {
+		return createInstance;
+	}
+
+	public void setCreateInstance(boolean createInstance) {
+		this.createInstance = createInstance;
+	}
+
+	public void addOnMessage(OnMessage onMessage) {
+    	EventNode eventNode = new EventNode();
+    	eventNode.addEventFilter(new OnMessageEventFilter(
+			onMessage.getPartnerLink(), onMessage.getPortType(), onMessage.getOperation()));
+    	addNode(eventNode);
+    	addNode(onMessage.getActivity());
+        new ConnectionImpl(
+            eventNode, Node.CONNECTION_DEFAULT_TYPE,
+            onMessage.getActivity(), Node.CONNECTION_DEFAULT_TYPE);
+        new ConnectionImpl(
+    		onMessage.getActivity(), Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE);
+    }
+    
+	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);
+    	addNode(onAlarm.getActivity());
+        new ConnectionImpl(
+            timerNode, 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;
+    }
+
+    public void setSourceLinks(SourceLink[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public TargetLink[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(TargetLink[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+    
+    public class OnMessage {
+    	
+    	private String partnerLink;
+    	private String portType;
+    	private String operation;
+    	private String variable;
+    	private BPELCorrelation[] correlations;
+    	private BPELActivity activity;
+    	
+		public String getPartnerLink() {
+			return partnerLink;
+		}
+		
+		public void setPartnerLink(String partnerLink) {
+			this.partnerLink = partnerLink;
+		}
+		
+		public String getPortType() {
+			return portType;
+		}
+		
+		public void setPortType(String portType) {
+			this.portType = portType;
+		}
+		
+		public String getOperation() {
+			return operation;
+		}
+		
+		public void setOperation(String operation) {
+			this.operation = operation;
+		}
+		
+		public String getVariable() {
+			return variable;
+		}
+		
+		public void setVariable(String variable) {
+			this.variable = variable;
+		}
+		
+		public BPELCorrelation[] getCorrelations() {
+			return correlations;
+		}
+		
+		public void setCorrelations(BPELCorrelation[] correlations) {
+			this.correlations = correlations;
+		}
+    	
+		public BPELActivity getActivity() {
+			return activity;
+		}
+		
+		public void setActivity(BPELActivity activity) {
+			this.activity = activity;
+		}
+    	
+    }
+    
+    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;
+    	private String untilExpression;
+    	private BPELActivity activity;
+    	
+		public String getForExpression() {
+			return forExpression;
+		}
+		
+		public void setForExpression(String forExpression) {
+			this.forExpression = forExpression;
+		}
+		
+		public String getUntilExpression() {
+			return untilExpression;
+		}
+		
+		public void setUntilExpression(String untilExpression) {
+			this.untilExpression = untilExpression;
+		}
+		
+		public BPELActivity getActivity() {
+			return activity;
+		}
+		
+		public void setActivity(BPELActivity activity) {
+			this.activity = activity;
+		}
+    	
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -43,8 +43,10 @@
                 "The activity of this BPEL process has already been set!");
         }
         this.activity = activity;
+        activity.setId(1);
         addNode(activity);
         EndNode end = new EndNode();
+        end.setId(2);
         addNode(end);
         new ConnectionImpl(
             activity, Node.CONNECTION_DEFAULT_TYPE,
@@ -59,7 +61,9 @@
         ExceptionScope exceptionScope = new ExceptionScope();
         addContext(exceptionScope);
         setDefaultContext(exceptionScope);
+        int i = 3;
         for (BPELFaultHandler faultHandler: faultHandlers) {
+        	faultHandler.getActivity().setId(i++);
             addNode(faultHandler.getActivity());
             exceptionScope.setExceptionHandler(faultHandler.getFaultName(), faultHandler);
         }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -10,7 +10,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELReceive extends NodeImpl implements BPELBasicActivity {
+public class BPELReceive extends NodeImpl implements BPELActivity {
 
     private static final long serialVersionUID = 400L;
 
@@ -19,13 +19,10 @@
     private String operation;
     private String variable;
     private boolean createInstance;
-    private String[] sourceLinks;
-    private String[] targetLinks;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
+    private BPELCorrelation[] correlations;
     
-    
-    public BPELReceive() {
-    }
-    
     public String getPartnerLink() {
         return partnerLink;
     }
@@ -66,19 +63,19 @@
         this.createInstance = createInstance;
     }
 
-    public String[] getSourceLinks() {
+    public SourceLink[] getSourceLinks() {
         return sourceLinks;
     }
 
-    public void setSourceLinks(String[] sourceLinks) {
+    public void setSourceLinks(SourceLink[] sourceLinks) {
         this.sourceLinks = sourceLinks;
     }
 
-    public String[] getTargetLinks() {
+    public TargetLink[] getTargetLinks() {
         return targetLinks;
     }
 
-    public void setTargetLinks(String[] targetLinks) {
+    public void setTargetLinks(TargetLink[] targetLinks) {
         this.targetLinks = targetLinks;
     }
 
@@ -91,4 +88,12 @@
         return null;
     }
 
+	public BPELCorrelation[] getCorrelations() {
+		return correlations;
+	}
+
+	public void setCorrelations(BPELCorrelation[] correlations) {
+		this.correlations = correlations;
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReply.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReply.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReply.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -8,7 +8,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELReply extends WorkItemNode implements BPELBasicActivity {
+public class BPELReply extends WorkItemNode implements BPELActivity {
 
     private static final long serialVersionUID = 400L;
     
@@ -18,10 +18,11 @@
     private static final String INPUT = "Message";
     private static final String FAULT_NAME = "FaultName";
     
-    private String[] sourceLinks;
-    private String[] targetLinks;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
+    private BPELCorrelation[] correlations;
     
-    public BPELReply() {
+	public BPELReply() {
         // TODO: a reply is not a simple web service invocation
         Work work = new WorkImpl();
         work.setName("WebServiceInvocation");
@@ -68,20 +69,28 @@
         addInMapping(INPUT, variable);
     }
 
-    public String[] getSourceLinks() {
+    public SourceLink[] getSourceLinks() {
         return sourceLinks;
     }
 
-    public void setSourceLinks(String[] sourceLinks) {
+    public void setSourceLinks(SourceLink[] sourceLinks) {
         this.sourceLinks = sourceLinks;
     }
 
-    public String[] getTargetLinks() {
+    public TargetLink[] getTargetLinks() {
         return targetLinks;
     }
 
-    public void setTargetLinks(String[] targetLinks) {
+    public void setTargetLinks(TargetLink[] targetLinks) {
         this.targetLinks = targetLinks;
     }
 
+    public BPELCorrelation[] getCorrelations() {
+		return correlations;
+	}
+
+	public void setCorrelations(BPELCorrelation[] correlations) {
+		this.correlations = correlations;
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,16 +1,28 @@
 package org.drools.bpel.core;
 
+import org.drools.process.core.context.variable.VariableScope;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeContextNode;
 import org.drools.workflow.core.node.CompositeNode;
 
 /**
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELScope extends CompositeNode implements BPELActivity, BPELFaultHandlerContainer {
+public class BPELScope extends CompositeContextNode implements BPELActivity, BPELFaultHandlerContainer {
 
     private static final long serialVersionUID = 400L;
 
+    public BPELScope() {
+	    VariableScope variableScope = new VariableScope();
+	    addContext(variableScope);
+	    setDefaultContext(variableScope);
+	}
+	
+	public VariableScope getVariableScope() {
+	    return (VariableScope) getDefaultContext(VariableScope.VARIABLE_SCOPE);
+	}
+
     public void setActivity(BPELActivity activity) {
         addNode(activity);
         linkIncomingConnections(
@@ -23,19 +35,19 @@
             Node.CONNECTION_DEFAULT_TYPE);
     }
 
-    public String[] getSourceLinks() {
+    public SourceLink[] getSourceLinks() {
         throw new IllegalArgumentException("A scope does not support links!");
     }
 
-    public String[] getTargetLinks() {
+    public TargetLink[] getTargetLinks() {
         throw new IllegalArgumentException("A scope does not support links!");
     }
 
-    public void setSourceLinks(String[] sourceLinks) {
+    public void setSourceLinks(SourceLink[] sourceLinks) {
         throw new IllegalArgumentException("A scope does not support links!");
     }
 
-    public void setTargetLinks(String[] targetLinks) {
+    public void setTargetLinks(TargetLink[] targetLinks) {
         throw new IllegalArgumentException("A scope does not support links!");
     }
     

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-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSequence.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -10,12 +10,12 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELSequence extends CompositeNode implements BPELStructuredActivity {
+public class BPELSequence extends CompositeNode implements BPELActivity {
     
     private static final long serialVersionUID = 400L;
 
-    private String[] sourceLinks;
-    private String[] targetLinks;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
     
     public void setActivities(List<BPELActivity> activities) {
         if (activities == null || activities.size() < 2) {
@@ -42,19 +42,19 @@
             Node.CONNECTION_DEFAULT_TYPE);
     }
     
-    public String[] getSourceLinks() {
+    public SourceLink[] getSourceLinks() {
         return sourceLinks;
     }
 
-    public void setSourceLinks(String[] sourceLinks) {
+    public void setSourceLinks(SourceLink[] sourceLinks) {
         this.sourceLinks = sourceLinks;
     }
 
-    public String[] getTargetLinks() {
+    public TargetLink[] getTargetLinks() {
         return targetLinks;
     }
 
-    public void setTargetLinks(String[] targetLinks) {
+    public void setTargetLinks(TargetLink[] targetLinks) {
         this.targetLinks = targetLinks;
     }
 

Deleted: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELStructuredActivity.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELStructuredActivity.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELStructuredActivity.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,13 +0,0 @@
-package org.drools.bpel.core;
-
-import java.util.List;
-
-/**
- * 
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public interface BPELStructuredActivity extends BPELActivity {
-    
-    void setActivities(List<BPELActivity> activities);
-
-}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSwitch.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,78 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.ConstraintImpl;
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELSwitch extends CompositeNode implements BPELActivity {
+
+    private static final long serialVersionUID = 400L;
+
+    private Split split;
+    private Join join;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
+
+    public BPELSwitch() {
+    	split = new Split();
+        split.setType(Split.TYPE_XOR);
+        addNode(split);
+        join = new Join();
+        join.setType(Join.TYPE_XOR);
+        addNode(join);
+        linkIncomingConnections(
+            Node.CONNECTION_DEFAULT_TYPE,
+            new CompositeNode.NodeAndType(
+                split, Node.CONNECTION_DEFAULT_TYPE));
+        linkOutgoingConnections(
+            new CompositeNode.NodeAndType(
+                join, Node.CONNECTION_DEFAULT_TYPE),
+            Node.CONNECTION_DEFAULT_TYPE);
+    }
+    
+    public void setName(String name) {
+        super.setName(name);
+        split.setName(name + " split");
+        join.setName(name + " join");
+    }
+    
+    public void addCase(String expression, BPELActivity activity) {
+    	addNode(activity);
+        ConnectionImpl connection = new ConnectionImpl(
+            split, Node.CONNECTION_DEFAULT_TYPE,
+            activity, Node.CONNECTION_DEFAULT_TYPE);
+        new ConnectionImpl(
+            activity, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE);
+        ConstraintImpl constraint = new ConstraintImpl();
+        constraint.setConstraint(expression);
+        constraint.setType("code");
+        constraint.setDialect("XPath");
+        constraint.setPriority(getNodes().length - 2);
+        split.setConstraint(connection, constraint);
+    }
+    
+    public SourceLink[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(SourceLink[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public TargetLink[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(TargetLink[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELThrow.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELThrow.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELThrow.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -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 BPELThrow 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;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWait.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,55 @@
+package org.drools.bpel.core;
+
+import org.drools.process.core.timer.Timer;
+import org.drools.workflow.core.node.TimerNode;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELWait extends TimerNode 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;
+    }
+
+	public void setForExpression(String forExpression) {
+		Timer timer = new Timer();
+		timer.setDelay(getDelayFor(forExpression));
+		setTimer(timer);
+	}
+
+	public void setUntilExpression(String untilExpression) {
+		Timer timer = new Timer();
+		timer.setDelay(getDelayUntil(untilExpression));
+		setTimer(timer);
+	}
+	
+	private int getDelayFor(String forExpression) {
+		// TODO: BPELPick timer delay
+		return 1000;
+	}
+    
+	private int getDelayUntil(String untilExpression) {
+		// TODO: BPELPick timer until
+		return 1000;
+	}
+    
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,91 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.ConstraintImpl;
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELWhile extends CompositeNode implements BPELActivity {
+
+    private static final long serialVersionUID = 400L;
+
+    private Join join;
+    private Split split;
+    private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
+
+    public BPELWhile() {
+        join = new Join();
+        join.setType(Join.TYPE_XOR);
+        addNode(join);
+    	split = new Split();
+        split.setType(Split.TYPE_XOR);
+        addNode(split);
+        BPELEmpty empty = new BPELEmpty();
+        addNode(empty);
+        linkIncomingConnections(
+            Node.CONNECTION_DEFAULT_TYPE,
+            new CompositeNode.NodeAndType(
+                join, Node.CONNECTION_DEFAULT_TYPE));
+        linkOutgoingConnections(
+            new CompositeNode.NodeAndType(
+                empty, Node.CONNECTION_DEFAULT_TYPE),
+            Node.CONNECTION_DEFAULT_TYPE);
+        new ConnectionImpl(
+            join, Node.CONNECTION_DEFAULT_TYPE,
+            split, Node.CONNECTION_DEFAULT_TYPE);
+        ConnectionImpl connection = new ConnectionImpl(
+            split, Node.CONNECTION_DEFAULT_TYPE,
+            empty, Node.CONNECTION_DEFAULT_TYPE);
+        ConstraintImpl constraint = new ConstraintImpl();
+        constraint.setConstraint("true");
+        constraint.setType("code");
+        constraint.setPriority(Integer.MAX_VALUE);
+        split.setConstraint(connection, constraint);
+    }
+    
+    public void setName(String name) {
+        super.setName(name);
+        split.setName(name + " split");
+        join.setName(name + " join");
+    }
+    
+    public void setActivity(String condition, BPELActivity activity) {
+    	addNode(activity);
+        ConnectionImpl connection = new ConnectionImpl(
+            split, Node.CONNECTION_DEFAULT_TYPE,
+            activity, Node.CONNECTION_DEFAULT_TYPE);
+        new ConnectionImpl(
+            activity, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE);
+        ConstraintImpl constraint = new ConstraintImpl();
+        constraint.setConstraint(condition);
+        constraint.setType("code");
+        constraint.setDialect("XPath");
+        constraint.setPriority(getNodes().length - 2);
+        split.setConstraint(connection, constraint);
+    }
+    
+    public SourceLink[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(SourceLink[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public TargetLink[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(TargetLink[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELEmptyInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELEmptyInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELEmptyInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,25 @@
+package org.drools.bpel.instance;
+
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.ActionNodeInstance;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELEmptyInstance extends ActionNodeInstance {
+    
+    private static final long serialVersionUID = 400L;
+
+    public void internalTrigger(NodeInstance from, String type) {
+        if (BPELLinkManager.checkActivityEnabled(this)) {
+            super.internalTrigger(from, type);
+        }
+    }
+    
+    public void triggerCompleted() {
+        super.triggerCompleted();
+        BPELLinkManager.activateTargetLinks(this);
+    }
+    
+}

Deleted: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionHandlerInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionHandlerInstance.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionHandlerInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,58 +0,0 @@
-package org.drools.bpel.instance;
-
-import org.drools.bpel.core.BPELFaultHandler;
-import org.drools.process.core.context.exception.ExceptionHandler;
-import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.context.exception.ExceptionHandlerInstance;
-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.impl.NodeInstanceImpl;
-
-public class BPELExceptionHandlerInstance implements ExceptionHandlerInstance {
-
-    private BPELFaultHandler faultHandler;
-    private NodeInstanceContainer nodeInstanceContainer; 
-    
-    public BPELFaultHandler getFaultHandler() {
-        return faultHandler;
-    }
-
-    public void setExceptionHandler(ExceptionHandler handler) {
-        this.faultHandler = (BPELFaultHandler) handler;
-    }
-
-    public NodeInstanceContainer getNodeInstanceContainer() {
-        return nodeInstanceContainer;
-    }
-
-    public void setNodeInstanceContainer(NodeInstanceContainer nodeInstanceContainer) {
-        this.nodeInstanceContainer = nodeInstanceContainer;
-    }
-
-    public void handleException(String exception, Object param) {
-        if (exception == null) {
-            throw new IllegalArgumentException(
-                "Exception is null!");
-        }
-        if (!(faultHandler.getFaultName() == null || exception.equals(faultHandler.getFaultName()))) {
-            throw new IllegalArgumentException(
-                "Cannot handle exception: " + exception);
-        }
-        NodeInstance nodeInstance = nodeInstanceContainer.getNodeInstance(faultHandler.getActivity());
-        String faultVariable = faultHandler.getFaultVariable();
-        if (faultVariable != null) {
-            VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
-                ((NodeInstanceImpl) nodeInstance).resolveContextInstance(VariableScope.VARIABLE_SCOPE, faultHandler.getFaultVariable());
-            if (variableScopeInstance != null) {
-                variableScopeInstance.setVariable(faultVariable, (String) param);
-            } else {
-                System.err.println("Could not find variable scope for variable " + faultVariable);
-                System.err.println("when trying handle fault " + exception);
-                System.err.println("Continuing without setting variable.");
-            }
-        }
-        nodeInstance.trigger(null, null);
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionScopeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionScopeInstance.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionScopeInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -22,7 +22,7 @@
 
 	public void handleException(ExceptionHandler handler, String exception, Object params) {
 		if (handler instanceof BPELFaultHandler) {
-			BPELExceptionHandlerInstance handlerInstance = new BPELExceptionHandlerInstance();
+			BPELFaultHandlerInstance handlerInstance = new BPELFaultHandlerInstance();
 	        handlerInstance.setExceptionHandler(handler);
 	        handlerInstance.setNodeInstanceContainer(nodeInstanceContainer);
 			handlerInstance.handleException(exception, params);

Copied: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java (from rev 21186, labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionHandlerInstance.java)
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,66 @@
+package org.drools.bpel.instance;
+
+import org.drools.bpel.core.BPELFaultHandler;
+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;
+
+public class BPELFaultHandlerInstance implements ExceptionHandlerInstance {
+
+    private BPELFaultHandler faultHandler;
+    private NodeInstanceContainer nodeInstanceContainer; 
+    
+    public BPELFaultHandler getFaultHandler() {
+        return faultHandler;
+    }
+
+    public void setExceptionHandler(ExceptionHandler handler) {
+        this.faultHandler = (BPELFaultHandler) handler;
+    }
+
+    public NodeInstanceContainer getNodeInstanceContainer() {
+        return nodeInstanceContainer;
+    }
+
+    public void setNodeInstanceContainer(NodeInstanceContainer nodeInstanceContainer) {
+        this.nodeInstanceContainer = nodeInstanceContainer;
+    }
+
+    public void handleException(String exception, Object param) {
+        if (exception == null) {
+            throw new IllegalArgumentException(
+                "Exception is null!");
+        }
+        if (!(faultHandler.getFaultName() == null || exception.equals(faultHandler.getFaultName()))) {
+            throw new IllegalArgumentException(
+                "Cannot handle exception: " + exception);
+        }
+        NodeInstance nodeInstance = nodeInstanceContainer.getNodeInstance(faultHandler.getActivity());
+        String faultVariable = faultHandler.getFaultVariable();
+        if (faultVariable != null) {
+            VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+                ((NodeInstanceImpl) nodeInstance).resolveContextInstance(VariableScope.VARIABLE_SCOPE, faultHandler.getFaultVariable());
+            if (variableScopeInstance != null) {
+                variableScopeInstance.setVariable(faultVariable, (String) param);
+            } else {
+                System.err.println("Could not find variable scope for variable " + faultVariable);
+                System.err.println("when trying handle fault " + exception);
+                System.err.println("Continuing without setting variable.");
+            }
+        }
+        nodeInstance.trigger(null, null);
+        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/BPELLinkManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELLinkManager.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELLinkManager.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,6 +1,8 @@
 package org.drools.bpel.instance;
 
 import org.drools.bpel.core.BPELActivity;
+import org.drools.bpel.core.BPELActivity.SourceLink;
+import org.drools.bpel.core.BPELActivity.TargetLink;
 import org.drools.util.ArrayUtils;
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.NodeInstanceContainer;
@@ -15,13 +17,13 @@
     private BPELLinkManager() {
     }
     
-    private static String[] getSourceLinks(NodeInstance activityInstance) {
+    private static SourceLink[] getSourceLinks(NodeInstance activityInstance) {
         return ((BPELActivity) 
             ((NodeInstanceImpl) activityInstance).getNode())
                 .getSourceLinks();
     }
     
-    private static String[] getTargetLinks(NodeInstance activityInstance) {
+    private static TargetLink[] getTargetLinks(NodeInstance activityInstance) {
         return ((BPELActivity) 
             ((NodeInstanceImpl) activityInstance).getNode())
                 .getTargetLinks();
@@ -29,13 +31,13 @@
     
     public static boolean checkActivityEnabled(NodeInstance activityInstance) {
         boolean enabled = true;
-        String[] incomingLinks = getTargetLinks(activityInstance);
+        TargetLink[] incomingLinks = getTargetLinks(activityInstance);
         if (incomingLinks != null) {
             for (int i = 0; i < incomingLinks.length; i++) {
-                BPELFlowInstance flowInstance = getFlowInstance(activityInstance, incomingLinks[i]);
-                if (!flowInstance.isLinkActive(incomingLinks[i])) {
+                BPELFlowInstance flowInstance = getFlowInstance(activityInstance, incomingLinks[i].getLinkName());
+                if (!flowInstance.isLinkActive(incomingLinks[i].getLinkName())) {
                     enabled = false;
-                    flowInstance.addWaitingActivityInstance(activityInstance, incomingLinks[i]);
+                    flowInstance.addWaitingActivityInstance(activityInstance, incomingLinks[i].getLinkName());
                 }
             }
         }
@@ -43,11 +45,14 @@
     }
     
     public static void activateTargetLinks(NodeInstance activityInstance) {
-        String[] outgoingLinks = getSourceLinks(activityInstance);
+        SourceLink[] outgoingLinks = getSourceLinks(activityInstance);
         if (outgoingLinks != null) {
             for (int i = 0; i < outgoingLinks.length; i++) {
-                BPELFlowInstance flowInstance = getFlowInstance(activityInstance, outgoingLinks[i]);
-                flowInstance.activateLink(outgoingLinks[i]);
+                BPELFlowInstance flowInstance = getFlowInstance(activityInstance, outgoingLinks[i].getLinkName());
+                String transitionCondition = outgoingLinks[i].getTransitionCondition(); 
+                if (transitionCondition == null || evaluateTransitionCondition(transitionCondition)) {
+                	flowInstance.activateLink(outgoingLinks[i].getLinkName());
+                }
             }
         }
     }
@@ -60,5 +65,10 @@
         }
         return (BPELFlowInstance) parent;
     }
+    
+    private static boolean evaluateTransitionCondition(String transitionCondition) {
+    	// TODO SourceLink transitionCondition
+    	return true;
+    }
 
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELNodeInstanceFactoryRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELNodeInstanceFactoryRegistry.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELNodeInstanceFactoryRegistry.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,12 +1,18 @@
 package org.drools.bpel.instance;
 
 import org.drools.bpel.core.BPELAssign;
+import org.drools.bpel.core.BPELEmpty;
 import org.drools.bpel.core.BPELFlow;
 import org.drools.bpel.core.BPELInvoke;
+import org.drools.bpel.core.BPELPick;
 import org.drools.bpel.core.BPELReceive;
 import org.drools.bpel.core.BPELReply;
 import org.drools.bpel.core.BPELScope;
 import org.drools.bpel.core.BPELSequence;
+import org.drools.bpel.core.BPELSwitch;
+import org.drools.bpel.core.BPELThrow;
+import org.drools.bpel.core.BPELWait;
+import org.drools.bpel.core.BPELWhile;
 import org.drools.workflow.instance.impl.NodeInstanceFactoryRegistry;
 import org.drools.workflow.instance.impl.factory.CreateNewNodeFactory;
 
@@ -27,6 +33,18 @@
                   new CreateNewNodeFactory( BPELScopeInstance.class ) );
         register( BPELSequence.class,
                   new CreateNewNodeFactory( BPELSequenceInstance.class ) );
+        register( BPELEmpty.class,
+                  new CreateNewNodeFactory( BPELEmptyInstance.class ) );
+        register( BPELPick.class,
+                  new CreateNewNodeFactory( BPELPickInstance.class ) );
+        register( BPELSwitch.class,
+                  new CreateNewNodeFactory( BPELSwitchInstance.class ) );
+        register( BPELThrow.class,
+                  new CreateNewNodeFactory( BPELThrowInstance.class ) );
+        register( BPELWait.class,
+                  new CreateNewNodeFactory( BPELWaitInstance.class ) );
+        register( BPELWhile.class,
+                  new CreateNewNodeFactory( BPELWhileInstance.class ) );
     }
 
 }

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELPickInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELPickInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELPickInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,24 @@
+package org.drools.bpel.instance;
+
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.CompositeNodeInstance;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELPickInstance extends CompositeNodeInstance {
+
+    private static final long serialVersionUID = 400L;
+    
+    public void internalTrigger(NodeInstance from, String type) {
+        if (BPELLinkManager.checkActivityEnabled(this)) {
+            super.internalTrigger(from, type);
+        }
+    }
+    
+    public void triggerCompleted(String outType) {
+        super.triggerCompleted(outType);
+        BPELLinkManager.activateTargetLinks(this);
+    }
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSwitchInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSwitchInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSwitchInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,24 @@
+package org.drools.bpel.instance;
+
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.CompositeNodeInstance;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELSwitchInstance extends CompositeNodeInstance {
+
+    private static final long serialVersionUID = 400L;
+    
+    public void internalTrigger(NodeInstance from, String type) {
+        if (BPELLinkManager.checkActivityEnabled(this)) {
+            super.internalTrigger(from, type);
+        }
+    }
+    
+    public void triggerCompleted(String outType) {
+        super.triggerCompleted(outType);
+        BPELLinkManager.activateTargetLinks(this);
+    }
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELThrowInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELThrowInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELThrowInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,25 @@
+package org.drools.bpel.instance;
+
+import org.drools.process.instance.context.exception.ExceptionScopeInstance;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.FaultNodeInstance;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELThrowInstance extends FaultNodeInstance {
+
+    private static final long serialVersionUID = 400L;
+    
+    public void internalTrigger(NodeInstance from, String type) {
+        if (BPELLinkManager.checkActivityEnabled(this)) {
+            super.internalTrigger(from, type);
+        }
+    }
+    
+    protected void handleException(ExceptionScopeInstance exceptionScopeInstance) {
+        super.handleException(exceptionScopeInstance);
+        BPELLinkManager.activateTargetLinks(this);
+    }
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,24 @@
+package org.drools.bpel.instance;
+
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.TimerNodeInstance;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELWaitInstance extends TimerNodeInstance {
+
+    private static final long serialVersionUID = 400L;
+    
+    public void internalTrigger(NodeInstance from, String type) {
+        if (BPELLinkManager.checkActivityEnabled(this)) {
+            super.internalTrigger(from, type);
+        }
+    }
+    
+    public void triggerCompleted() {
+        super.triggerCompleted();
+        BPELLinkManager.activateTargetLinks(this);
+    }
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWhileInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWhileInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWhileInstance.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,24 @@
+package org.drools.bpel.instance;
+
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.CompositeNodeInstance;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELWhileInstance extends CompositeNodeInstance {
+
+    private static final long serialVersionUID = 400L;
+    
+    public void internalTrigger(NodeInstance from, String type) {
+        if (BPELLinkManager.checkActivityEnabled(this)) {
+            super.internalTrigger(from, type);
+        }
+    }
+    
+    public void triggerCompleted(String outType) {
+        super.triggerCompleted(outType);
+        BPELLinkManager.activateTargetLinks(this);
+    }
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCompilerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCompilerTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCompilerTest.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,112 @@
+package org.drools.bpel.test;
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.bpel.compiler.BPELCompiler;
+import org.drools.bpel.core.BPELProcess;
+import org.drools.bpel.instance.BPELProcessInstance;
+import org.drools.bpel.test.BPELTestUtil.WebServiceInvocationHandler;
+import org.drools.common.AbstractRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.compiler.ProcessBuilder;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.reteoo.ReteooWorkingMemory;
+
+public class BPELCompilerTest extends TestCase {
+	
+	private WorkingMemory getWorkingMemory() throws Exception {
+		// Compile process
+		BPELCompiler compiler = new BPELCompiler();
+		BPELProcess process = compiler.compileProcess(
+			BPELCompilerTest.class.getResource("/purchaseOrderProcess.bpel"));
+		
+		// Build process
+		Properties properties = new Properties(); 
+        properties.put( "processNodeBuilderRegistry", "bpelNodeBuilderRegistry.conf" );
+        PackageBuilderConfiguration packageConf = new PackageBuilderConfiguration( properties );
+        PackageBuilder packageBuilder = new PackageBuilder(packageConf);
+        ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
+        processBuilder.buildProcess(process);
+        
+        // Load process
+        properties = new Properties(); 
+        properties.put( "processInstanceFactoryRegistry", "bpelProcessInstanceFactory.conf" );        
+        properties.put( "processNodeInstanceFactoryRegistry", "bpelProcessNodeInstanceFactory.conf" );        
+        properties.put( "processContextInstanceFactoryRegistry", "bpelProcessContextInstanceFactory.conf" );        
+        RuleBaseConfiguration ruleBaseConf = new RuleBaseConfiguration( properties );
+        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase(ruleBaseConf);
+        ruleBase.addProcess(process);
+        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        WorkItemHandler handler = new WebServiceInvocationHandler();
+        workingMemory.getWorkItemManager().registerWorkItemHandler("WebServiceInvocation", handler);
+        return workingMemory;
+	}
+	
+	public void testPurchaseOrderProcessNormalFlow() throws Exception {
+        // Execute process
+		WorkingMemory workingMemory = getWorkingMemory();
+        BPELProcessInstance processInstance = (BPELProcessInstance)
+        	workingMemory.startProcess("http://drools.jboss.org/example/bpel/purchase");
+        
+        // start process
+        BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
+
+        // reply to web service invocations
+        WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "{http://manufacturing.org/wsdl/purchase}schedulingPT", "requestProductionScheduling");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "{http://manufacturing.org/wsdl/purchase}computePricePT", "initiatePriceCalculation");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+        
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "{http://manufacturing.org/wsdl/purchase}shippingPT", "requestShipping");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "SHIPPING");
+        
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "{http://manufacturing.org/wsdl/purchase}computePricePT", "sendShippingPrice");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+        
+        // invoke web service callbacks
+        BPELTestUtil.webServiceInvocation(processInstance, "shipping", "{http://manufacturing.org/wsdl/purchase}shippingCallbackPT", "sendSchedule", "SCHEDULE");
+        BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "{http://manufacturing.org/wsdl/purchase}invoiceCallbackPT", "sendInvoice", "INVOICE");
+
+        // reply to web service invocation
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "{http://manufacturing.org/wsdl/purchase}schedulingPT", "sendShippingSchedule");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+        
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+        
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+	}
+
+	public void testPurchaseOrderProcessFault() throws Exception {
+        // Execute process
+		WorkingMemory workingMemory = getWorkingMemory();
+        BPELProcessInstance processInstance = (BPELProcessInstance)
+        	workingMemory.startProcess("http://drools.jboss.org/example/bpel/purchase");
+        
+        // start process
+        BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "{http://manufacturing.org/wsdl/purchase}purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
+
+        // reply to web service invocations
+        WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "{http://manufacturing.org/wsdl/purchase}schedulingPT", "requestProductionScheduling");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "{http://manufacturing.org/wsdl/purchase}computePricePT", "initiatePriceCalculation");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+        
+        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());
+	}
+	
+}

Copied: labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java (from rev 21186, labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,328 @@
+package org.drools.bpel.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.audit.WorkingMemoryFileLogger;
+import org.drools.bpel.core.BPELActivity;
+import org.drools.bpel.core.BPELAssign;
+import org.drools.bpel.core.BPELFaultHandler;
+import org.drools.bpel.core.BPELFlow;
+import org.drools.bpel.core.BPELInvoke;
+import org.drools.bpel.core.BPELProcess;
+import org.drools.bpel.core.BPELReceive;
+import org.drools.bpel.core.BPELReply;
+import org.drools.bpel.core.BPELSequence;
+import org.drools.bpel.core.BPELActivity.SourceLink;
+import org.drools.bpel.core.BPELActivity.TargetLink;
+import org.drools.bpel.instance.BPELProcessInstance;
+import org.drools.bpel.test.BPELTestUtil.WebServiceInvocationHandler;
+import org.drools.common.AbstractRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.compiler.ProcessBuilder;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.core.datatype.impl.type.StringDataType;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.reteoo.ReteooWorkingMemory;
+
+public class BPELCoreTest {
+
+    public static BPELProcess getProcess() {
+        BPELProcess process = new BPELProcess();
+        process.setName("Purchase Order Process");
+        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());
+        variables.add(variable);
+        variable = new Variable();
+        variable.setName("Invoice");
+        variable.setType(new StringDataType());
+        variables.add(variable);
+        variable = new Variable();
+        variable.setName("POFault");
+        variable.setType(new StringDataType());
+        variables.add(variable);
+        variable = new Variable();
+        variable.setName("shippingRequest");
+        variable.setType(new StringDataType());
+        variables.add(variable);
+        variable = new Variable();
+        variable.setName("shippingInfo");
+        variable.setType(new StringDataType());
+        variables.add(variable);
+        variable = new Variable();
+        variable.setName("shippingSchedule");
+        variable.setType(new StringDataType());
+        variables.add(variable);
+        variableScope.setVariables(variables);
+        
+        // faultHandler
+        List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
+        BPELFaultHandler faultHandler = new BPELFaultHandler();
+        faultHandler.setFaultName("cannotCompleteOrder");
+        faultHandler.setFaultVariable("POFault");
+        BPELReply reply = new BPELReply();
+        reply.setId(++nodeId);
+        reply.setPartnerLink("purchasing");
+        reply.setPortType("lns:purchaseOrderPT");
+        reply.setOperation("sendPurchaseOrder");
+        reply.setVariable("POFault");
+        reply.setFaultName("cannotCompleteOrder");
+        faultHandler.setActivity(reply);
+        faultHandlers.add(faultHandler);
+        process.setFaultHandlers(faultHandlers);
+        
+        // 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.setPartnerLink("purchasing");
+        receive.setPortType("lns:purchaseOrderPT");
+        receive.setOperation("sendPurchaseOrder");
+        receive.setVariable("PO");
+        receive.setCreateInstance(true);
+        sequenceActivities.add(receive);
+        
+        // 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);
+            // $shippingRequest.customerInfo <- $PO.customerInfo
+            assign1.setAction("");
+            sequence1Activities.add(assign1);
+            
+            // invoke1
+            BPELInvoke invoke1 = new BPELInvoke();
+            invoke1.setId(++nodeId);
+            invoke1.setName("Decide On Shipper");
+            invoke1.setPartnerLink("shipping");
+            invoke1.setPortType("lns:shippingPT");
+            invoke1.setOperation("requestShipping");
+            invoke1.setInputVariable("shippingRequest");
+            invoke1.setOutputVariable("shippingInfo");
+            invoke1.setSourceLinks(new SourceLink[] { new SourceLink("ship-to-invoice") });
+            sequence1Activities.add(invoke1);
+        
+            // receive1
+            BPELReceive receive1 = new BPELReceive();
+            receive1.setId(++nodeId);
+            receive1.setName("Arrange Logistics");
+            receive1.setPartnerLink("shipping");
+            receive1.setPortType("lns:shippingCallbackPT");
+            receive1.setOperation("sendSchedule");
+            receive1.setVariable("shippingSchedule");
+            receive1.setCreateInstance(false);
+            receive1.setSourceLinks(new SourceLink[] { new SourceLink("ship-to-scheduling") });
+            sequence1Activities.add(receive1);
+            
+            sequence1.setActivities(sequence1Activities);
+            flowActivities.add(sequence1);
+            
+            /********** 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");
+            invoke2a.setOperation("initiatePriceCalculation");
+            invoke2a.setInputVariable("PO");
+            sequence2Activities.add(invoke2a);
+            
+            // invoke2b
+            BPELInvoke invoke2b = new BPELInvoke();
+            invoke2b.setId(++nodeId);
+            invoke2b.setName("Complete Price Calculation");
+            invoke2b.setPartnerLink("invoicing");
+            invoke2b.setPortType("lns:computePricePT");
+            invoke2b.setOperation("sendShippingPrice");
+            invoke2b.setInputVariable("shippingInfo");
+            invoke2b.setTargetLinks(new TargetLink[] { new TargetLink("ship-to-invoice") });
+            sequence2Activities.add(invoke2b);
+        
+            // receive2
+            BPELReceive receive2 = new BPELReceive();
+            receive2.setId(++nodeId);
+            receive2.setName("Receive Invoice");
+            receive2.setPartnerLink("invoicing");
+            receive2.setPortType("lns:invoiceCallbackPT");
+            receive2.setOperation("sendInvoice");
+            receive2.setVariable("Invoice");
+            receive2.setCreateInstance(false);
+            sequence2Activities.add(receive2);
+            
+            sequence2.setActivities(sequence2Activities);
+            flowActivities.add(sequence2);
+            
+            /********** 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");
+            invoke3a.setOperation("requestProductionScheduling");
+            invoke3a.setInputVariable("PO");
+            sequence3Activities.add(invoke3a);
+            
+            // invoke2b
+            BPELInvoke invoke3b = new BPELInvoke();
+            invoke3b.setId(++nodeId);
+            invoke3b.setName("Complete Production Scheduling");
+            invoke3b.setPartnerLink("scheduling");
+            invoke3b.setPortType("lns:schedulingPT");
+            invoke3b.setOperation("sendShippingSchedule");
+            invoke3b.setInputVariable("shippingSchedule");
+            invoke3b.setTargetLinks(new TargetLink[] { new TargetLink("ship-to-scheduling") });
+            sequence3Activities.add(invoke3b);
+        
+            sequence3.setActivities(sequence3Activities);
+            flowActivities.add(sequence3);
+            
+        flow.setActivities(flowActivities);
+        sequenceActivities.add(flow);
+        
+        // reply
+        reply = new BPELReply();
+        reply.setId(++nodeId);
+        reply.setName("Invoice Processing");
+        reply.setPartnerLink("purchasing");
+        reply.setPortType("lns:purchaseOrderPT");
+        reply.setOperation("sendPurchaseOrder");
+        reply.setVariable("Invoice");
+        sequenceActivities.add(reply);
+        
+        sequence.setActivities(sequenceActivities);
+        process.setActivity(sequence);
+        
+        Properties properties = new Properties(); 
+        properties.put( "processNodeBuilderRegistry", "bpelNodeBuilderRegistry.conf" );
+        PackageBuilderConfiguration packageConf = new PackageBuilderConfiguration( properties );
+        PackageBuilder packageBuilder = new PackageBuilder(packageConf);
+        ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
+        processBuilder.buildProcess(process);
+        return process;
+    }
+    
+    // normal execution
+    public static void main(String[] args) {
+        BPELProcess process = getProcess();
+        // execute
+        Properties properties = new Properties(); 
+        properties.put( "processInstanceFactoryRegistry", "bpelProcessInstanceFactory.conf" );        
+        properties.put( "processNodeInstanceFactoryRegistry", "bpelProcessNodeInstanceFactory.conf" );        
+        properties.put( "processContextInstanceFactoryRegistry", "bpelProcessContextInstanceFactory.conf" );        
+        RuleBaseConfiguration ruleBaseConf = new RuleBaseConfiguration( properties );
+        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase(ruleBaseConf);
+        ruleBase.addProcess(process);
+        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        WorkItemHandler handler = new WebServiceInvocationHandler();
+        workingMemory.getWorkItemManager().registerWorkItemHandler("WebServiceInvocation", handler);
+        WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(workingMemory);
+        BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
+        
+        // start process
+        BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
+
+        // reply to web service invocations
+        WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "requestProductionScheduling");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "initiatePriceCalculation");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+        
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "SHIPPING");
+        
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "sendShippingPrice");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+        
+        // invoke web service callbacks
+        BPELTestUtil.webServiceInvocation(processInstance, "shipping", "lns:shippingCallbackPT", "sendSchedule", "SCHEDULE");
+        BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "lns:invoiceCallbackPT", "sendInvoice", "INVOICE");
+
+        // reply to web service invocation
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "sendShippingSchedule");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+
+        logger.writeToDisk();
+    }
+    
+    // shipping returns fault
+    public static void main1(String[] args) {
+        BPELProcess process = getProcess();
+        // execute
+        Properties properties = new Properties(); 
+        properties.put( "processInstanceFactoryRegistry", "bpelProcessInstanceFactory.conf" );        
+        properties.put( "processNodeInstanceFactoryRegistry", "bpelProcessNodeInstanceFactory.conf" );        
+        properties.put( "processContextInstanceFactoryRegistry", "bpelProcessContextInstanceFactory.conf" );        
+        RuleBaseConfiguration ruleBaseConf = new RuleBaseConfiguration( properties );
+        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase(ruleBaseConf);
+        ruleBase.addProcess(process);
+        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        WorkItemHandler handler = new WebServiceInvocationHandler();
+        workingMemory.getWorkItemManager().registerWorkItemHandler("WebServiceInvocation", handler);
+        WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(workingMemory);
+        BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
+        
+        // start process
+        BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
+
+        // reply to web service invocations
+        WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "requestProductionScheduling");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "initiatePriceCalculation");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
+        
+        workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
+        BPELTestUtil.replyWebServiceInvocationFault(workingMemory, workItem, "cannotCompleteOrder", "SHIPPING FAULT");
+
+        logger.writeToDisk();
+    }
+
+    
+}

Deleted: labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTest.java	2008-07-25 14:50:59 UTC (rev 21225)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTest.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -1,403 +0,0 @@
-package org.drools.bpel.test;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import org.drools.RuleBaseConfiguration;
-import org.drools.RuleBaseFactory;
-import org.drools.WorkingMemory;
-import org.drools.audit.WorkingMemoryFileLogger;
-import org.drools.bpel.core.BPELActivity;
-import org.drools.bpel.core.BPELAssign;
-import org.drools.bpel.core.BPELFaultHandler;
-import org.drools.bpel.core.BPELFlow;
-import org.drools.bpel.core.BPELInvoke;
-import org.drools.bpel.core.BPELProcess;
-import org.drools.bpel.core.BPELReceive;
-import org.drools.bpel.core.BPELReply;
-import org.drools.bpel.core.BPELSequence;
-import org.drools.bpel.instance.BPELProcessInstance;
-import org.drools.common.AbstractRuleBase;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.compiler.PackageBuilder;
-import org.drools.compiler.PackageBuilderConfiguration;
-import org.drools.compiler.ProcessBuilder;
-import org.drools.process.core.context.variable.Variable;
-import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.core.datatype.impl.type.StringDataType;
-import org.drools.process.instance.WorkItem;
-import org.drools.process.instance.WorkItemHandler;
-import org.drools.process.instance.WorkItemManager;
-import org.drools.reteoo.ReteooWorkingMemory;
-
-public class BPELTest {
-
-    public static BPELProcess getProcess() {
-        BPELProcess process = new BPELProcess();
-        process.setName("Purchase Order Process");
-        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());
-        variables.add(variable);
-        variable = new Variable();
-        variable.setName("Invoice");
-        variable.setType(new StringDataType());
-        variables.add(variable);
-        variable = new Variable();
-        variable.setName("POFault");
-        variable.setType(new StringDataType());
-        variables.add(variable);
-        variable = new Variable();
-        variable.setName("shippingRequest");
-        variable.setType(new StringDataType());
-        variables.add(variable);
-        variable = new Variable();
-        variable.setName("shippingInfo");
-        variable.setType(new StringDataType());
-        variables.add(variable);
-        variable = new Variable();
-        variable.setName("shippingSchedule");
-        variable.setType(new StringDataType());
-        variables.add(variable);
-        variableScope.setVariables(variables);
-        
-        // faultHandler
-        List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
-        BPELFaultHandler faultHandler = new BPELFaultHandler();
-        faultHandler.setFaultName("cannotCompleteOrder");
-        faultHandler.setFaultVariable("POFault");
-        BPELReply reply = new BPELReply();
-        reply.setId(++nodeId);
-        reply.setPartnerLink("purchasing");
-        reply.setPortType("lns:purchaseOrderPT");
-        reply.setOperation("sendPurchaseOrder");
-        reply.setVariable("POFault");
-        reply.setFaultName("cannotCompleteOrder");
-        faultHandler.setActivity(reply);
-        faultHandlers.add(faultHandler);
-        process.setFaultHandlers(faultHandlers);
-        
-        // 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.setPartnerLink("purchasing");
-        receive.setPortType("lns:purchaseOrderPT");
-        receive.setOperation("sendPurchaseOrder");
-        receive.setVariable("PO");
-        receive.setCreateInstance(true);
-        sequenceActivities.add(receive);
-        
-        // 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);
-            // $shippingRequest.customerInfo <- $PO.customerInfo
-            assign1.setAction("");
-            sequence1Activities.add(assign1);
-            
-            // invoke1
-            BPELInvoke invoke1 = new BPELInvoke();
-            invoke1.setId(++nodeId);
-            invoke1.setName("Decide On Shipper");
-            invoke1.setPartnerLink("shipping");
-            invoke1.setPortType("lns:shippingPT");
-            invoke1.setOperation("requestShipping");
-            invoke1.setInputVariable("shippingRequest");
-            invoke1.setOutputVariable("shippingInfo");
-            invoke1.setSourceLinks(new String[] { "ship-to-invoice" });
-            sequence1Activities.add(invoke1);
-        
-            // receive1
-            BPELReceive receive1 = new BPELReceive();
-            receive1.setId(++nodeId);
-            receive1.setName("Arrange Logistics");
-            receive1.setPartnerLink("shipping");
-            receive1.setPortType("lns:shippingCallbackPT");
-            receive1.setOperation("sendSchedule");
-            receive1.setVariable("shippingSchedule");
-            receive1.setCreateInstance(false);
-            receive1.setSourceLinks(new String[] { "ship-to-scheduling" });
-            sequence1Activities.add(receive1);
-            
-            sequence1.setActivities(sequence1Activities);
-            flowActivities.add(sequence1);
-            
-            /********** 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");
-            invoke2a.setOperation("initiatePriceCalculation");
-            invoke2a.setInputVariable("PO");
-            sequence2Activities.add(invoke2a);
-            
-            // invoke2b
-            BPELInvoke invoke2b = new BPELInvoke();
-            invoke2b.setId(++nodeId);
-            invoke2b.setName("Complete Price Calculation");
-            invoke2b.setPartnerLink("invoicing");
-            invoke2b.setPortType("lns:computePricePT");
-            invoke2b.setOperation("sendShippingPrice");
-            invoke2b.setInputVariable("shippingInfo");
-            invoke2b.setTargetLinks(new String[] { "ship-to-invoice" });
-            sequence2Activities.add(invoke2b);
-        
-            // receive2
-            BPELReceive receive2 = new BPELReceive();
-            receive2.setId(++nodeId);
-            receive2.setName("Receive Invoice");
-            receive2.setPartnerLink("invoicing");
-            receive2.setPortType("lns:invoiceCallbackPT");
-            receive2.setOperation("sendInvoice");
-            receive2.setVariable("Invoice");
-            receive2.setCreateInstance(false);
-            sequence2Activities.add(receive2);
-            
-            sequence2.setActivities(sequence2Activities);
-            flowActivities.add(sequence2);
-            
-            /********** 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");
-            invoke3a.setOperation("requestProductionScheduling");
-            invoke3a.setInputVariable("PO");
-            sequence3Activities.add(invoke3a);
-            
-            // invoke2b
-            BPELInvoke invoke3b = new BPELInvoke();
-            invoke3b.setId(++nodeId);
-            invoke3b.setName("Complete Production Scheduling");
-            invoke3b.setPartnerLink("scheduling");
-            invoke3b.setPortType("lns:schedulingPT");
-            invoke3b.setOperation("sendShippingSchedule");
-            invoke3b.setInputVariable("shippingSchedule");
-            invoke3b.setTargetLinks(new String[] { "ship-to-scheduling" });
-            sequence3Activities.add(invoke3b);
-        
-            sequence3.setActivities(sequence3Activities);
-            flowActivities.add(sequence3);
-            
-        flow.setActivities(flowActivities);
-        sequenceActivities.add(flow);
-        
-        // reply
-        reply = new BPELReply();
-        reply.setId(++nodeId);
-        reply.setName("Invoice Processing");
-        reply.setPartnerLink("purchasing");
-        reply.setPortType("lns:purchaseOrderPT");
-        reply.setOperation("sendPurchaseOrder");
-        reply.setVariable("Invoice");
-        sequenceActivities.add(reply);
-        
-        sequence.setActivities(sequenceActivities);
-        process.setActivity(sequence);
-        
-        Properties properties = new Properties(); 
-        properties.put( "processNodeBuilderRegistry", "bpelNodeBuilderRegistry.conf" );
-        PackageBuilderConfiguration packageConf = new PackageBuilderConfiguration( properties );
-        PackageBuilder packageBuilder = new PackageBuilder(packageConf);
-        ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
-        processBuilder.buildProcess(process);
-        return process;
-    }
-    
-    // normal execution
-    public static void main(String[] args) {
-        BPELProcess process = getProcess();
-        // execute
-        Properties properties = new Properties(); 
-        properties.put( "processInstanceFactoryRegistry", "bpelProcessInstanceFactory.conf" );        
-        properties.put( "processNodeInstanceFactoryRegistry", "bpelProcessNodeInstanceFactory.conf" );        
-        properties.put( "processContextInstanceFactoryRegistry", "bpelProcessContextInstanceFactory.conf" );        
-        RuleBaseConfiguration ruleBaseConf = new RuleBaseConfiguration( properties );
-        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase(ruleBaseConf);
-        ruleBase.addProcess(process);
-        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
-        WorkItemHandler handler = new WebServiceInvocationHandler();
-        workingMemory.getWorkItemManager().registerWorkItemHandler("WebServiceInvocation", handler);
-        WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(workingMemory);
-        BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
-        
-        // start process
-        webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
-
-        // reply to web service invocations
-        WorkItem workItem = findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "requestProductionScheduling");
-        replyWebServiceInvocation(workingMemory, workItem, null);
-
-        workItem = findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "initiatePriceCalculation");
-        replyWebServiceInvocation(workingMemory, workItem, null);
-        
-        workItem = findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
-        replyWebServiceInvocation(workingMemory, workItem, "SHIPPING");
-        
-        workItem = findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "sendShippingPrice");
-        replyWebServiceInvocation(workingMemory, workItem, null);
-        
-        // invoke web service callbacks
-        webServiceInvocation(processInstance, "shipping", "lns:shippingCallbackPT", "sendSchedule", "SCHEDULE");
-        webServiceInvocation(processInstance, "invoicing", "lns:invoiceCallbackPT", "sendInvoice", "INVOICE");
-
-        // reply to web service invocation
-        workItem = findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "sendShippingSchedule");
-        replyWebServiceInvocation(workingMemory, workItem, null);
-
-        logger.writeToDisk();
-    }
-    
-    // shipping returns fault
-    public static void main1(String[] args) {
-        BPELProcess process = getProcess();
-        // execute
-        Properties properties = new Properties(); 
-        properties.put( "processInstanceFactoryRegistry", "bpelProcessInstanceFactory.conf" );        
-        properties.put( "processNodeInstanceFactoryRegistry", "bpelProcessNodeInstanceFactory.conf" );        
-        properties.put( "processContextInstanceFactoryRegistry", "bpelProcessContextInstanceFactory.conf" );        
-        RuleBaseConfiguration ruleBaseConf = new RuleBaseConfiguration( properties );
-        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase(ruleBaseConf);
-        ruleBase.addProcess(process);
-        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
-        WorkItemHandler handler = new WebServiceInvocationHandler();
-        workingMemory.getWorkItemManager().registerWorkItemHandler("WebServiceInvocation", handler);
-        WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(workingMemory);
-        BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
-        
-        // start process
-        webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
-
-        // reply to web service invocations
-        WorkItem workItem = findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "requestProductionScheduling");
-        replyWebServiceInvocation(workingMemory, workItem, null);
-
-        workItem = findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "initiatePriceCalculation");
-        replyWebServiceInvocation(workingMemory, workItem, null);
-        
-        workItem = findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
-        replyWebServiceInvocationFault(workingMemory, workItem, "cannotCompleteOrder", "SHIPPING FAULT");
-
-        logger.writeToDisk();
-    }
-    
-    private static WorkItem findWebServiceInvocation(WorkingMemory workingMemory, String partnerLink, String portType, String operation) {
-        Set<WorkItem> workItems = workingMemory.getWorkItemManager().getWorkItems();
-        for (Iterator<WorkItem> iterator = workItems.iterator(); iterator.hasNext(); ) {
-            WorkItem workItem = iterator.next();
-            if ("WebServiceInvocation".equals(workItem.getName())
-                    && workItem.getParameter("PartnerLink").equals(partnerLink)
-                    && workItem.getParameter("PortType").equals(portType)
-                    && workItem.getParameter("Operation").equals(operation)) {
-                return workItem;
-            }
-        }
-        return null;
-    }
-    
-    private static void replyWebServiceInvocation(WorkingMemory workingMemory, WorkItem workItem, String result) {
-        System.out.println("Replying to web service invocation "
-                + workItem.getParameter("PartnerLink") + " "
-                + workItem.getParameter("PortType") + " "
-                + workItem.getParameter("Operation") + ", message = "
-                + workItem.getParameter("Message") + ": "
-                + result);
-        Map<String, Object> results = new HashMap<String, Object>();
-        results.put("Result", result);
-        workingMemory.getWorkItemManager().completeWorkItem(workItem.getId(), results);
-    }
-    
-    private static void replyWebServiceInvocationFault(WorkingMemory workingMemory, WorkItem workItem, String faultName, String result) {
-        System.out.println("Replying to web service invocation "
-                + workItem.getParameter("PartnerLink") + " "
-                + workItem.getParameter("PortType") + " "
-                + workItem.getParameter("Operation") + ", faultName = "
-                + workItem.getParameter("FaultName") + ", message = "
-                + workItem.getParameter("Message") + ": "
-                + result);
-        Map<String, Object> results = new HashMap<String, Object>();
-        results.put("Result", result);
-        results.put("FaultName", faultName);
-        workingMemory.getWorkItemManager().completeWorkItem(workItem.getId(), results);
-    }
-    
-    private static void webServiceInvocation(BPELProcessInstance processInstance, String partnerLink, String portType, String operation, String result) {
-        System.out.println("Web service invocation "
-                + partnerLink + " "
-                + portType + " "
-                + operation + ": "
-                + result);
-        processInstance.acceptMessage(partnerLink, portType, operation, result);
-    }
-    
-    public static class WebServiceInvocationHandler implements WorkItemHandler {
-
-        public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
-            System.out.println("Web service invoked "
-                + workItem.getParameter("PartnerLink") + " "
-                + workItem.getParameter("PortType") + " "
-                + (workItem.getParameter("FaultName") == null ? ""
-                		: "fault=" + workItem.getParameter("FaultName"))
-                + workItem.getParameter("Operation") + ", message = "
-                + workItem.getParameter("Message"));
-        }
-        
-        public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
-            System.out.println("Web service invocation aborted "
-                + workItem.getParameter("PartnerLink") + " "
-                + workItem.getParameter("PortType") + " "
-                + (workItem.getParameter("FaultName") == null ? ""
-            		: workItem.getParameter("FaultName"))
-                + workItem.getParameter("Operation") + ", message = "
-                + workItem.getParameter("Message"));
-        }
-
-    }
-    
-}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTestUtil.java	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,92 @@
+package org.drools.bpel.test;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.bpel.instance.BPELProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.process.instance.WorkItemManager;
+
+public class BPELTestUtil {
+	
+	private BPELTestUtil() {
+	}
+
+    public static WorkItem findWebServiceInvocation(WorkingMemory workingMemory, String partnerLink, String portType, String operation) {
+        Set<WorkItem> workItems = workingMemory.getWorkItemManager().getWorkItems();
+        for (Iterator<WorkItem> iterator = workItems.iterator(); iterator.hasNext(); ) {
+            WorkItem workItem = iterator.next();
+            if ("WebServiceInvocation".equals(workItem.getName())
+                    && workItem.getParameter("PartnerLink").equals(partnerLink)
+                    && workItem.getParameter("PortType").equals(portType)
+                    && workItem.getParameter("Operation").equals(operation)) {
+                return workItem;
+            }
+        }
+        return null;
+    }
+    
+    public static void replyWebServiceInvocation(WorkingMemory workingMemory, WorkItem workItem, String result) {
+        System.out.println("Replying to web service invocation "
+                + workItem.getParameter("PartnerLink") + " "
+                + workItem.getParameter("PortType") + " "
+                + workItem.getParameter("Operation") + ", message = "
+                + workItem.getParameter("Message") + ": "
+                + result);
+        Map<String, Object> results = new HashMap<String, Object>();
+        results.put("Result", result);
+        workingMemory.getWorkItemManager().completeWorkItem(workItem.getId(), results);
+    }
+    
+    public static void replyWebServiceInvocationFault(WorkingMemory workingMemory, WorkItem workItem, String faultName, String result) {
+        System.out.println("Replying to web service invocation "
+                + workItem.getParameter("PartnerLink") + " "
+                + workItem.getParameter("PortType") + " "
+                + workItem.getParameter("Operation") + ", faultName = "
+                + workItem.getParameter("FaultName") + ", message = "
+                + workItem.getParameter("Message") + ": "
+                + result);
+        Map<String, Object> results = new HashMap<String, Object>();
+        results.put("Result", result);
+        results.put("FaultName", faultName);
+        workingMemory.getWorkItemManager().completeWorkItem(workItem.getId(), results);
+    }
+    
+    public static void webServiceInvocation(BPELProcessInstance processInstance, String partnerLink, String portType, String operation, String result) {
+        System.out.println("Web service invocation "
+                + partnerLink + " "
+                + portType + " "
+                + operation + ": "
+                + result);
+        processInstance.acceptMessage(partnerLink, portType, operation, result);
+    }
+    
+    public static class WebServiceInvocationHandler implements WorkItemHandler {
+
+        public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+            System.out.println("Web service invoked "
+                + workItem.getParameter("PartnerLink") + " "
+                + workItem.getParameter("PortType") + " "
+                + (workItem.getParameter("FaultName") == null ? ""
+                		: "fault=" + workItem.getParameter("FaultName"))
+                + workItem.getParameter("Operation") + ", message = "
+                + workItem.getParameter("Message"));
+        }
+        
+        public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+            System.out.println("Web service invocation aborted "
+                + workItem.getParameter("PartnerLink") + " "
+                + workItem.getParameter("PortType") + " "
+                + (workItem.getParameter("FaultName") == null ? ""
+            		: workItem.getParameter("FaultName"))
+                + workItem.getParameter("Operation") + ", message = "
+                + workItem.getParameter("Message"));
+        }
+
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/test/resources/purchaseOrderProcess.bpel
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/test/resources/purchaseOrderProcess.bpel	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/resources/purchaseOrderProcess.bpel	2008-07-25 14:56:37 UTC (rev 21226)
@@ -0,0 +1,69 @@
+<process name="purchaseOrderProcess"
+  targetNamespace="http://drools.jboss.org/example/bpel/purchase"
+  xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
+  xmlns:lns="http://manufacturing.org/wsdl/purchase">
+  
+ <partnerLinks>
+  <partnerLink name="purchasing" partnerLinkType="lns:purchasingLT" myRole="purchaseService"/>
+  <partnerLink name="invoicing" partnerLinkType="lns:invoicingLT" myRole="invoiceRequester" partnerRole="invoiceService"/>
+  <partnerLink name="shipping" partnerLinkType="lns:shippingLT" myRole="shippingRequester" partnerRole="shippingService"/>
+  <partnerLink name="scheduling" partnerLinkType="lns:schedulingLT" partnerRole="schedulingService"/>
+ </partnerLinks>
+ 
+ <variables>
+  <variable name="PO" messageType="lns:POMessage"/>
+  <variable name="Invoice" messageType="lns:InvMessage"/>
+  <variable name="POFault" messageType="lns:orderFaultType"/>
+  <variable name="shippingRequest" messageType="lns:shippingRequestMessage"/>
+  <variable name="shippingInfo" messageType="lns:shippingInfoMessage"/>
+  <variable name="shippingSchedule" messageType="lns:scheduleMessage"/>
+ </variables>
+ 
+ <faultHandlers>
+  <catch faultName="lns:cannotCompleteOrder" faultVariable="POFault">
+   <reply partnerLink="purchasing" portType="lns:purchaseOrderPT" operation="sendPurchaseOrder" variable="POFault" faultName="cannotCompleteOrder"/>
+  </catch>
+ </faultHandlers>
+ 
+ <sequence>
+  <receive partnerLink="purchasing" portType="lns:purchaseOrderPT" operation="sendPurchaseOrder" variable="PO" createInstance="yes">
+  </receive>
+  <flow>
+   <links>
+    <link name="ship-to-invoice"/>
+    <link name="ship-to-scheduling"/>
+   </links>
+   <sequence>
+    <assign>
+     <copy>
+      <from variable="PO" part="customerInfo"/>
+      <to variable="shippingRequest" part="customerInfo"/>
+     </copy>
+    </assign>
+    <invoke partnerLink="shipping" portType="lns:shippingPT" operation="requestShipping" inputVariable="shippingRequest" outputVariable="shippingInfo">
+     <source linkName="ship-to-invoice"/>
+    </invoke>
+    <receive partnerLink="shipping" portType="lns:shippingCallbackPT" operation="sendSchedule" variable="shippingSchedule">
+     <source linkName="ship-to-scheduling"/>
+    </receive>
+   </sequence>
+   <sequence>
+    <invoke partnerLink="invoicing" portType="lns:computePricePT" operation="initiatePriceCalculation" inputVariable="PO">
+    </invoke>
+    <invoke partnerLink="invoicing" portType="lns:computePricePT" operation="sendShippingPrice" inputVariable="shippingInfo">
+     <target linkName="ship-to-invoice"/>
+    </invoke>
+    <receive partnerLink="invoicing" portType="lns:invoiceCallbackPT" operation="sendInvoice" variable="Invoice"/>
+   </sequence>
+   <sequence>
+    <invoke partnerLink="scheduling" portType="lns:schedulingPT" operation="requestProductionScheduling" inputVariable="PO">
+    </invoke>
+    <invoke partnerLink="scheduling" portType="lns:schedulingPT" operation="sendShippingSchedule" inputVariable="shippingSchedule">
+     <target linkName="ship-to-scheduling"/>
+    </invoke>
+   </sequence>
+  </flow>
+  <reply partnerLink="purchasing" portType="lns:purchaseOrderPT" operation="sendPurchaseOrder" variable="Invoice"/>
+ </sequence>
+   
+</process>
\ No newline at end of file




More information about the jboss-svn-commits mailing list