[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