[jboss-svn-commits] JBL Code SVN: r20212 - in labs/jbossrules/trunk/drools-process: drools-bpel and 16 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu May 29 10:42:04 EDT 2008


Author: KrisVerlaenen
Date: 2008-05-29 10:42:04 -0400 (Thu, 29 May 2008)
New Revision: 20212

Added:
   labs/jbossrules/trunk/drools-process/drools-bpel/
   labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
   labs/jbossrules/trunk/drools-process/drools-bpel/.project
   labs/jbossrules/trunk/drools-process/drools-bpel/src/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/
   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/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/BPELFaultHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultHandlerContainer.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/core/BPELStructuredActivity.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionHandlerInstance.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/BPELFlowInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELInvokeInstance.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
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstanceFactory.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReplyInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSequenceInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessContextInstanceFactory.conf
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessInstanceFactory.conf
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTest.java
Log:
WS-BPEL implementation

Added: labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/.classpath	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/.classpath	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,9 @@
+<?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>

Added: labs/jbossrules/trunk/drools-process/drools-bpel/.project
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/.project	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/.project	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>drools-bpel</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELActivity.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,19 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.Node;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public interface BPELActivity extends Node {
+
+    String[] getSourceLinks();
+    
+    void setSourceLinks(String[] sourceLinks);
+    
+    String[] getTargetLinks();
+    
+    void setTargetLinks(String[] targetLinks);
+    
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,38 @@
+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 BPELAssign extends ActionNode implements BPELBasicActivity {
+
+    private static final long serialVersionUID = 400L;
+    
+    private String[] sourceLinks;
+    private String[] targetLinks;
+    
+    public void setAction(String assign) {
+        setAction(new DroolsConsequenceAction("mvel", assign));
+    }
+
+    public String[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(String[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public String[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(String[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELBasicActivity.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,10 @@
+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/BPELFaultExceptionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultExceptionHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultExceptionHandler.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,21 @@
+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) {
+        
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultHandler.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,41 @@
+package org.drools.bpel.core;
+
+import org.drools.process.core.context.exception.ExceptionHandler;
+
+/**
+ * A BPEL FaultHandler.
+ * A catchAll faultHandler has a null faultName.
+ *  
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELFaultHandler implements ExceptionHandler {
+    
+    private String faultName;
+    private String faultVariable;
+    private BPELActivity activity;
+    
+    public String getFaultName() {
+        return faultName;
+    }
+    
+    public void setFaultName(String faultName) {
+        this.faultName = faultName;
+    }
+    
+    public String getFaultVariable() {
+        return faultVariable;
+    }
+    
+    public void setFaultVariable(String faultVariable) {
+        this.faultVariable = faultVariable;
+    }
+    
+    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/BPELFaultHandlerContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultHandlerContainer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFaultHandlerContainer.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,9 @@
+package org.drools.bpel.core;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public interface BPELFaultHandlerContainer {
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELFlow.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,93 @@
+package org.drools.bpel.core;
+
+import java.util.Iterator;
+import java.util.List;
+
+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.Join;
+import org.drools.workflow.core.node.Split;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELFlow extends CompositeNode implements BPELStructuredActivity {
+    
+    private static final long serialVersionUID = 400L;
+    
+    private Split split;
+    private Join join;
+    private String[] links;
+    private String[] sourceLinks;
+    private String[] targetLinks;
+    
+    public BPELFlow() {
+        split = new Split();
+        split.setType(Split.TYPE_AND);
+        addNode(split);
+        join = new Join();
+        join.setType(Join.TYPE_AND);
+        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 setActivities(List<BPELActivity> activities) {
+        if (activities == null || activities.size() < 2) {
+            throw new IllegalArgumentException(
+                "A BPEL flow must contain at least two sub activities!");
+        }
+        for (Iterator<BPELActivity> iterator = activities.iterator(); iterator.hasNext(); ) {
+            addActivity(iterator.next());
+        }
+    }
+    
+    private void addActivity(BPELActivity activity) {
+        addNode(activity);
+        new ConnectionImpl(
+            split, Node.CONNECTION_DEFAULT_TYPE,
+            activity, Node.CONNECTION_DEFAULT_TYPE);
+        new ConnectionImpl(
+            activity, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE);
+    }
+
+    public void setLinks(String[] links) {
+        this.links = links;
+    }
+    
+    public String[] getLinks() {
+        return links;
+    }
+    
+    public String[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(String[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public String[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(String[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELInvoke.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,86 @@
+package org.drools.bpel.core;
+
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.workflow.core.node.WorkItemNode;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELInvoke extends WorkItemNode implements BPELBasicActivity, BPELFaultHandlerContainer {
+
+    private static final long serialVersionUID = 400L;
+    
+    private static final String PARTNER_LINK = "PartnerLink";
+    private static final String PORT_TYPE = "PortType";
+    private static final String OPERATION = "Operation";
+    private static final String INPUT = "Message";
+    private static final String OUTPUT = "Result";
+    
+    private String[] sourceLinks;
+    private String[] targetLinks;
+    
+    public BPELInvoke() {
+        Work work = new WorkImpl();
+        work.setName("WebServiceInvocation");
+        setWork(work);
+    }
+    
+    public String getPartnerLink() {
+        return (String) getWork().getParameter(PARTNER_LINK);
+    }
+
+    public void setPartnerLink(String partnerLink) {
+        getWork().setParameter(PARTNER_LINK, partnerLink);
+    }
+
+    public String getPortType() {
+        return (String) getWork().getParameter(PORT_TYPE);
+    }
+
+    public void setPortType(String porttype) {
+        getWork().setParameter(PORT_TYPE, porttype);
+    }
+
+    public String getOperation() {
+        return (String) getWork().getParameter(OPERATION);
+    }
+
+    public void setOperation(String operation) {
+        getWork().setParameter(OPERATION, operation);
+    }
+
+    public String getInputVariable() {
+        return getInMapping(INPUT);
+    }
+
+    public void setInputVariable(String inputVariable) {
+        addInMapping(INPUT, inputVariable);
+    }
+
+    public String getOutputVariable() {
+        return getOutMapping(OUTPUT);
+    }
+
+    public void setOutputVariable(String outputVariable) {
+        addOutMapping(OUTPUT, outputVariable);
+    }
+
+    public String[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(String[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public String[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(String[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELProcess.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,69 @@
+package org.drools.bpel.core;
+
+import java.util.List;
+
+import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.WorkflowProcessImpl;
+import org.drools.workflow.core.node.EndNode;
+
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELProcess extends WorkflowProcessImpl implements BPELFaultHandlerContainer {
+
+    private static final long serialVersionUID = 400L;
+    
+    public static final String BPEL_TYPE = "BPEL";
+    
+    private BPELActivity activity;
+    
+    public BPELProcess() {
+        setType(BPEL_TYPE);
+        VariableScope variableScope = new VariableScope();
+        addContext(variableScope);
+        setDefaultContext(variableScope);
+    }
+    
+    public VariableScope getVariableScope() {
+        return (VariableScope) getDefaultContext(VariableScope.VARIABLE_SCOPE);
+    }
+    
+    public void setActivity(BPELActivity activity) {
+        if (activity == null) {
+            throw new IllegalArgumentException(
+                "The activity of a BPEL process may not be null!");
+        }
+        if (this.activity != null) {
+            throw new IllegalArgumentException(
+                "The activity of this BPEL process has already been set!");
+        }
+        this.activity = activity;
+        addNode(activity);
+        EndNode end = new EndNode();
+        addNode(end);
+        new ConnectionImpl(
+            activity, Node.CONNECTION_DEFAULT_TYPE,
+            end, Node.CONNECTION_DEFAULT_TYPE);
+    }
+    
+    public BPELActivity getActivity() {
+        return activity;
+    }
+    
+    public void setFaultHandlers(List<BPELFaultHandler> faultHandlers) {
+        ExceptionScope exceptionScope = new ExceptionScope();
+        addContext(exceptionScope);
+        setDefaultContext(exceptionScope);
+        for (BPELFaultHandler faultHandler: faultHandlers) {
+            addNode(faultHandler.getActivity());
+            exceptionScope.setExceptionHandler(faultHandler.getFaultName(), faultHandler);
+        }
+        // TODO: process should end once fault handler has been executed
+    }
+    
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReceive.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,94 @@
+package org.drools.bpel.core;
+
+import java.util.List;
+
+import org.drools.workflow.core.Connection;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.NodeImpl;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELReceive extends NodeImpl implements BPELBasicActivity {
+
+    private static final long serialVersionUID = 400L;
+
+    private String partnerLink;
+    private String portType;
+    private String operation;
+    private String variable;
+    private boolean createInstance;
+    private String[] sourceLinks;
+    private String[] targetLinks;
+    
+    
+    public BPELReceive() {
+    }
+    
+    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 boolean isCreateInstance() {
+        return createInstance;
+    }
+    
+    public void setCreateInstance(boolean createInstance) {
+        this.createInstance = createInstance;
+    }
+
+    public String[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(String[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public String[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(String[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+    public Connection getTo() {
+        final List<Connection> list =
+            getOutgoingConnections(Node.CONNECTION_DEFAULT_TYPE);
+        if (list.size() > 0) {
+            return (Connection) list.get(0);
+        }
+        return null;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELReply.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,87 @@
+package org.drools.bpel.core;
+
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.workflow.core.node.WorkItemNode;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELReply extends WorkItemNode implements BPELBasicActivity {
+
+    private static final long serialVersionUID = 400L;
+    
+    private static final String PARTNER_LINK = "PartnerLink";
+    private static final String PORT_TYPE = "PortType";
+    private static final String OPERATION = "Operation";
+    private static final String INPUT = "Message";
+    private static final String FAULT_NAME = "FaultName";
+    
+    private String[] sourceLinks;
+    private String[] targetLinks;
+    
+    public BPELReply() {
+        // TODO: a reply is not a simple web service invocation
+        Work work = new WorkImpl();
+        work.setName("WebServiceInvocation");
+        setWork(work);
+    }
+    
+    public String getPartnerLink() {
+        return (String) getWork().getParameter(PARTNER_LINK);
+    }
+
+    public void setPartnerLink(String partnerLink) {
+        getWork().setParameter(PARTNER_LINK, partnerLink);
+    }
+
+    public String getPortType() {
+        return (String) getWork().getParameter(PORT_TYPE);
+    }
+
+    public void setPortType(String porttype) {
+        getWork().setParameter(PORT_TYPE, porttype);
+    }
+
+    public String getOperation() {
+        return (String) getWork().getParameter(OPERATION);
+    }
+
+    public void setOperation(String operation) {
+        getWork().setParameter(OPERATION, operation);
+    }
+
+    public String getVariable() {
+        return getInMapping(INPUT);
+    }
+    
+    public void setFaultName(String faultName) {
+        getWork().setParameter(FAULT_NAME, faultName);
+    }
+    
+    public String getFaultName() {
+        return (String) getWork().getParameter(FAULT_NAME);
+    }
+
+    public void setVariable(String variable) {
+        addInMapping(INPUT, variable);
+    }
+
+    public String[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(String[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public String[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(String[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,42 @@
+package org.drools.bpel.core;
+
+import org.drools.workflow.core.Node;
+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 {
+
+    private static final long serialVersionUID = 400L;
+
+    public void setActivity(BPELActivity activity) {
+        addNode(activity);
+        linkIncomingConnections(
+            Node.CONNECTION_DEFAULT_TYPE,
+            new CompositeNode.NodeAndType(
+                activity, Node.CONNECTION_DEFAULT_TYPE));
+        linkOutgoingConnections(
+            new CompositeNode.NodeAndType(
+                activity, Node.CONNECTION_DEFAULT_TYPE),
+            Node.CONNECTION_DEFAULT_TYPE);
+    }
+
+    public String[] getSourceLinks() {
+        throw new IllegalArgumentException("A scope does not support links!");
+    }
+
+    public String[] getTargetLinks() {
+        throw new IllegalArgumentException("A scope does not support links!");
+    }
+
+    public void setSourceLinks(String[] sourceLinks) {
+        throw new IllegalArgumentException("A scope does not support links!");
+    }
+
+    public void setTargetLinks(String[] targetLinks) {
+        throw new IllegalArgumentException("A scope does not support links!");
+    }
+    
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELSequence.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,61 @@
+package org.drools.bpel.core;
+
+import java.util.List;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.node.CompositeNode;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELSequence extends CompositeNode implements BPELStructuredActivity {
+    
+    private static final long serialVersionUID = 400L;
+
+    private String[] sourceLinks;
+    private String[] targetLinks;
+    
+    public void setActivities(List<BPELActivity> activities) {
+        if (activities == null || activities.size() < 2) {
+            throw new IllegalArgumentException(
+                "A BPEL sequence must contain at least two sub activities!");
+        }
+        BPELActivity previous = activities.get(0);
+        addNode(previous);
+        linkIncomingConnections(
+            Node.CONNECTION_DEFAULT_TYPE,
+            new CompositeNode.NodeAndType(
+                    previous, Node.CONNECTION_DEFAULT_TYPE));
+        for (int i = 1; i < activities.size(); i++ ) {
+            BPELActivity next = activities.get(i);
+            addNode(next);
+            new ConnectionImpl(
+                previous, Node.CONNECTION_DEFAULT_TYPE,
+                next, Node.CONNECTION_DEFAULT_TYPE);
+            previous = next;
+        }
+        linkOutgoingConnections(
+            new CompositeNode.NodeAndType(
+                previous, Node.CONNECTION_DEFAULT_TYPE),
+            Node.CONNECTION_DEFAULT_TYPE);
+    }
+    
+    public String[] getSourceLinks() {
+        return sourceLinks;
+    }
+
+    public void setSourceLinks(String[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
+    }
+
+    public String[] getTargetLinks() {
+        return targetLinks;
+    }
+
+    public void setTargetLinks(String[] targetLinks) {
+        this.targetLinks = targetLinks;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELStructuredActivity.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,13 @@
+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/instance/BPELAssignInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -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 BPELAssignInstance 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);
+    }
+    
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionHandlerInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,58 @@
+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);
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELExceptionScopeInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,35 @@
+package org.drools.bpel.instance;
+
+import org.drools.bpel.core.BPELFaultHandler;
+import org.drools.process.core.context.exception.ExceptionHandler;
+import org.drools.process.instance.context.exception.ExceptionScopeInstance;
+import org.drools.workflow.instance.NodeInstanceContainer;
+import org.drools.workflow.instance.context.WorkflowContextInstance;
+
+public class BPELExceptionScopeInstance extends ExceptionScopeInstance implements WorkflowContextInstance {
+
+    private static final long serialVersionUID = 400L;
+    
+    private NodeInstanceContainer nodeInstanceContainer;
+
+    public NodeInstanceContainer getNodeInstanceContainer() {
+        return nodeInstanceContainer;
+    }
+
+    public void setNodeInstanceContainer(NodeInstanceContainer nodeInstanceContainer) {
+        this.nodeInstanceContainer = nodeInstanceContainer;
+    }
+
+	public void handleException(ExceptionHandler handler, String exception, Object params) {
+		if (handler instanceof BPELFaultHandler) {
+			BPELExceptionHandlerInstance handlerInstance = new BPELExceptionHandlerInstance();
+	        handlerInstance.setExceptionHandler(handler);
+	        handlerInstance.setNodeInstanceContainer(nodeInstanceContainer);
+			handlerInstance.handleException(exception, params);
+		} else {
+			throw new IllegalArgumentException(
+				"A BPEL Exception scope can only handle BPELFaultHandlers: " + handler);
+		}
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFlowInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFlowInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFlowInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,53 @@
+package org.drools.bpel.instance;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpel.core.BPELFlow;
+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 BPELFlowInstance extends CompositeNodeInstance {
+
+    private static final long serialVersionUID = 400L;
+    
+    private List<String> activatedLinks = new ArrayList<String>();
+    private Map<String, NodeInstance> waitingActivityInstances = new HashMap<String, NodeInstance>();
+    
+    public BPELFlow getBPELFlow() {
+        return (BPELFlow) getNode();
+    }
+    
+    public void activateLink(String linkName) {
+        activatedLinks.add(linkName);
+        NodeInstance waitingActivityInstance = waitingActivityInstances.get(linkName);
+        if (waitingActivityInstance != null) {
+            waitingActivityInstance.trigger(null, null);
+        }
+    }
+    
+    public void addWaitingActivityInstance(NodeInstance nodeInstance, String linkName) {
+        waitingActivityInstances.put(linkName, nodeInstance);
+    }
+    
+    public boolean isLinkActive(String linkName) {
+        return activatedLinks.contains(linkName);
+    }
+    
+    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/BPELInvokeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELInvokeInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELInvokeInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,36 @@
+package org.drools.bpel.instance;
+
+import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.context.exception.ExceptionScopeInstance;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.WorkItemNodeInstance;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELInvokeInstance extends WorkItemNodeInstance {
+    
+    private static final long serialVersionUID = 400L;
+
+    public void internalTrigger(NodeInstance from, String type) {
+        if (BPELLinkManager.checkActivityEnabled(this)) {
+            super.internalTrigger(from, type);
+        }
+    }
+    
+    public void triggerCompleted(WorkItem workItem) {
+        String faultName = (String) workItem.getResult("FaultName");
+        if (faultName == null) {
+            super.triggerCompleted(workItem);
+            BPELLinkManager.activateTargetLinks(this);
+        } else {
+            String faultMessage = (String) workItem.getResult("Result");
+            ExceptionScopeInstance exceptionScopeInstance = (ExceptionScopeInstance)
+                resolveContextInstance(ExceptionScope.EXCEPTION_SCOPE, faultName);
+            exceptionScopeInstance.handleException(faultName, faultMessage);
+        }
+    }
+    
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELLinkManager.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,64 @@
+package org.drools.bpel.instance;
+
+import org.drools.bpel.core.BPELActivity;
+import org.drools.util.ArrayUtils;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.NodeInstanceContainer;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public final class BPELLinkManager {
+    
+    private BPELLinkManager() {
+    }
+    
+    private static String[] getSourceLinks(NodeInstance activityInstance) {
+        return ((BPELActivity) 
+            ((NodeInstanceImpl) activityInstance).getNode())
+                .getSourceLinks();
+    }
+    
+    private static String[] getTargetLinks(NodeInstance activityInstance) {
+        return ((BPELActivity) 
+            ((NodeInstanceImpl) activityInstance).getNode())
+                .getTargetLinks();
+    }
+    
+    public static boolean checkActivityEnabled(NodeInstance activityInstance) {
+        boolean enabled = true;
+        String[] 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])) {
+                    enabled = false;
+                    flowInstance.addWaitingActivityInstance(activityInstance, incomingLinks[i]);
+                }
+            }
+        }
+        return enabled;
+    }
+    
+    public static void activateTargetLinks(NodeInstance activityInstance) {
+        String[] outgoingLinks = getSourceLinks(activityInstance);
+        if (outgoingLinks != null) {
+            for (int i = 0; i < outgoingLinks.length; i++) {
+                BPELFlowInstance flowInstance = getFlowInstance(activityInstance, outgoingLinks[i]);
+                flowInstance.activateLink(outgoingLinks[i]);
+            }
+        }
+    }
+
+    private static BPELFlowInstance getFlowInstance(NodeInstance activityInstance, String linkName) {
+        NodeInstanceContainer parent = activityInstance.getNodeInstanceContainer();
+        while (!(parent instanceof BPELFlowInstance)
+                || !ArrayUtils.contains(((BPELFlowInstance) parent).getBPELFlow().getLinks(), linkName)) {
+             parent = ((NodeInstance) parent).getNodeInstanceContainer();     
+        }
+        return (BPELFlowInstance) parent;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELNodeInstanceFactoryRegistry.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,32 @@
+package org.drools.bpel.instance;
+
+import org.drools.bpel.core.BPELAssign;
+import org.drools.bpel.core.BPELFlow;
+import org.drools.bpel.core.BPELInvoke;
+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.workflow.instance.impl.NodeInstanceFactoryRegistry;
+import org.drools.workflow.instance.impl.factory.CreateNewNodeFactory;
+
+public class BPELNodeInstanceFactoryRegistry extends NodeInstanceFactoryRegistry {
+    
+    public BPELNodeInstanceFactoryRegistry() {
+        register( BPELAssign.class,
+                  new CreateNewNodeFactory( BPELAssignInstance.class ) );
+        register( BPELFlow.class,
+                  new CreateNewNodeFactory( BPELFlowInstance.class ) );
+        register( BPELInvoke.class,
+                  new CreateNewNodeFactory( BPELInvokeInstance.class ) );
+        register( BPELReceive.class,
+                  new CreateNewNodeFactory( BPELReceiveInstance.class ) );
+        register( BPELReply.class,
+                  new CreateNewNodeFactory( BPELReplyInstance.class ) );
+        register( BPELScope.class,
+                  new CreateNewNodeFactory( BPELScopeInstance.class ) );
+        register( BPELSequence.class,
+                  new CreateNewNodeFactory( BPELSequenceInstance.class ) );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,90 @@
+package org.drools.bpel.instance;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.bpel.core.BPELActivity;
+import org.drools.bpel.core.BPELProcess;
+import org.drools.bpel.core.BPELReceive;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.NodeInstanceContainer;
+import org.drools.workflow.instance.impl.WorkflowProcessInstanceImpl;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELProcessInstance extends WorkflowProcessInstanceImpl {
+    
+    private static final long serialVersionUID = 400L;
+
+    public BPELProcess getBPELProcess() {
+        return (BPELProcess) getProcess();
+    }
+    
+    public void acceptMessage(String partnerLink, String portType, String operation, String message) {
+        if (getState() == STATE_PENDING) {
+            setState(STATE_ACTIVE);
+        }
+        BPELReceive receive = findBPELReceive(partnerLink, portType, operation);
+        if (receive == null) {
+            throw new IllegalArgumentException(
+                "Could not find BPELReceive for " + partnerLink + ", " + portType + ", " + operation);
+        }
+        BPELActivity activity = receive;
+        List<BPELActivity> parents = new ArrayList<BPELActivity>(); 
+        while (!activity.getNodeContainer().equals(getBPELProcess())) {
+            activity = (BPELActivity) activity.getNodeContainer();
+            parents.add(0, activity);
+        }
+        NodeInstanceContainer nodeInstanceContainer = this;
+        for (Iterator<BPELActivity> iterator = parents.iterator(); iterator.hasNext(); ) {
+            BPELActivity parent = iterator.next();
+            NodeInstance nodeInstance = nodeInstanceContainer.getFirstNodeInstance(parent.getId());
+            if (nodeInstance != null) {
+                nodeInstanceContainer = (NodeInstanceContainer) nodeInstance;
+            } else if (receive.isCreateInstance()) {
+                nodeInstanceContainer = (NodeInstanceContainer) nodeInstanceContainer.getNodeInstance(parent);
+            } else {
+                // TODO: store message in cache of accepted messages
+                return;
+            }
+        }
+        ((BPELReceiveInstance) nodeInstanceContainer.getNodeInstance(receive)).triggerCompleted(message);
+    }
+    
+    private BPELReceive findBPELReceive(String partnerLink, String portType, String operation) {
+        return findBPELReceive(partnerLink, portType, operation, getBPELProcess().getActivity());
+    }
+    
+    private BPELReceive findBPELReceive(String partnerLink, String portType, String operation, Node node) {
+        if (node instanceof BPELReceive) {
+            BPELReceive receive = (BPELReceive) node;
+            if (receive.getPartnerLink().equals(partnerLink)
+                    && receive.getPortType().equals(portType)
+                    && receive.getOperation().equals(operation)) {
+                return receive;
+            }
+            return null;
+        }
+        if (node instanceof NodeContainer) {
+            Node[] nodes = ((NodeContainer) node).getNodes();
+            for (int i = 0; i < nodes.length; i++) {
+                BPELReceive result = findBPELReceive(partnerLink, portType, operation, nodes[i]);
+                if (result != null) {
+                    return result;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    protected void internalStart() {
+        // do nothing, BPEL Processes are started by receiving a message
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstanceFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstanceFactory.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.drools.bpel.instance;
+
+import java.io.Externalizable;
+import java.io.ObjectOutput;
+import java.io.IOException;
+import java.io.ObjectInput;
+
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.ProcessInstanceFactory;
+
+public class BPELProcessInstanceFactory implements ProcessInstanceFactory, Externalizable {
+
+    private static final long serialVersionUID = 400L;
+
+    public ProcessInstance createProcessInstance() {
+        return new BPELProcessInstance();
+    }
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+    }
+
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,44 @@
+package org.drools.bpel.instance;
+
+import org.drools.bpel.core.BPELReceive;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.workflow.core.Connection;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+
+/**
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPELReceiveInstance extends NodeInstanceImpl {
+
+    private static final long serialVersionUID = 400L;
+
+    public BPELReceive getBPELReceive() {
+        return (BPELReceive) getNode();
+    }
+    
+    public void internalTrigger(NodeInstance from, String type) {
+        if (BPELLinkManager.checkActivityEnabled(this)) {
+            // TODO look in cache of already receive messages
+        }
+    }
+    
+    public void triggerCompleted(String message) {
+        String variable = getBPELReceive().getVariable();
+        if (variable != null) {
+            VariableScopeInstance variableScope = (VariableScopeInstance) resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
+            if (variableScope == null) {
+                throw new IllegalArgumentException(
+                    "Variable " + variable + " not found!");
+            }
+            variableScope.setVariable(variable, message);
+        }
+        Connection to = getBPELReceive().getTo();
+        triggerCompleted(Node.CONNECTION_DEFAULT_TYPE, true);
+        BPELLinkManager.activateTargetLinks(this);
+    }
+
+}

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

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,25 @@
+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 BPELScopeInstance 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/BPELSequenceInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSequenceInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELSequenceInstance.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,25 @@
+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 BPELSequenceInstance 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/resources/META-INF/bpelNodeBuilderRegistry.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,7 @@
+// we use MVEL to configure our nodes, simply populate a map, which will be added to the main registry
+import org.drools.bpel.core.BPELAssign;
+import org.drools.process.builder.ActionNodeBuilder;
+
+[
+    BPELAssign   : new ActionNodeBuilder(),
+]

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessContextInstanceFactory.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessContextInstanceFactory.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessContextInstanceFactory.conf	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,8 @@
+// we use MVEL to configure our nodes, simply populate a map, which will be added to the main registry
+import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.bpel.instance.BPELExceptionScopeInstance;
+import org.drools.workflow.instance.context.WorkflowReuseContextInstanceFactory;
+
+[
+    ExceptionScope : new WorkflowReuseContextInstanceFactory( BPELExceptionScopeInstance ),
+]

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessInstanceFactory.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessInstanceFactory.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessInstanceFactory.conf	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,7 @@
+// we use MVEL to configure our process, simply populate a map, which will be added to the main registry
+import org.drools.bpel.core.BPELProcess;
+import org.drools.bpel.instance.BPELProcessInstanceFactory;
+
+[
+    BPELProcess     : new BPELProcessInstanceFactory(),
+]

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelProcessNodeInstanceFactory.conf	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,26 @@
+// we use MVEL to configure our nodes, simply populate a map, which will be added to the main registry
+import org.drools.bpel.core.BPELAssign;
+import org.drools.bpel.core.BPELFlow;
+import org.drools.bpel.core.BPELInvoke;
+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.instance.BPELAssignInstance;
+import org.drools.bpel.instance.BPELFlowInstance;
+import org.drools.bpel.instance.BPELInvokeInstance;
+import org.drools.bpel.instance.BPELReceiveInstance;
+import org.drools.bpel.instance.BPELReplyInstance;
+import org.drools.bpel.instance.BPELScopeInstance;
+import org.drools.bpel.instance.BPELSequenceInstance;
+import org.drools.workflow.instance.impl.factory.CreateNewNodeFactory;
+
+[
+    BPELAssign   : new CreateNewNodeFactory( BPELAssignInstance ),
+    BPELFlow     : new CreateNewNodeFactory( BPELFlowInstance ),
+    BPELInvoke   : new CreateNewNodeFactory( BPELInvokeInstance ),
+    BPELReceive  : new CreateNewNodeFactory( BPELReceiveInstance ),
+    BPELReply    : new CreateNewNodeFactory( BPELReplyInstance ),
+    BPELScope    : new CreateNewNodeFactory( BPELScopeInstance ),
+    BPELSequence : new CreateNewNodeFactory( BPELSequenceInstance ),
+]

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELTest.java	2008-05-29 14:42:04 UTC (rev 20212)
@@ -0,0 +1,403 @@
+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"));
+        }
+
+    }
+    
+}




More information about the jboss-svn-commits mailing list