/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.bpel.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import junit.framework.TestCase;
import org.drools.RuleBaseConfiguration;
import org.drools.RuleBaseFactory;
import org.drools.bpel.core.BPELActivity;
import org.drools.bpel.core.BPELAssign;
import org.drools.bpel.core.BPELFaultHandler;
import org.drools.bpel.core.BPELFlow;
import org.drools.bpel.core.BPELInvoke;
import org.drools.bpel.core.BPELProcess;
import org.drools.bpel.core.BPELReceive;
import org.drools.bpel.core.BPELReply;
import org.drools.bpel.core.BPELSequence;
import org.drools.bpel.core.BPELActivity.SourceLink;
import org.drools.bpel.core.BPELActivity.TargetLink;
import org.drools.bpel.instance.BPELProcessInstance;
import org.drools.bpel.test.BPELTestUtil.WebServiceInvocationHandler;
import org.drools.bpel.xpath.XMLDataType;
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.instance.ProcessInstance;
import org.drools.process.instance.WorkItem;
import org.drools.process.instance.WorkItemHandler;
import org.drools.reteoo.ReteooWorkingMemory;
public class BPELCoreTest extends TestCase {
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");
// variables
VariableScope variableScope = process.getVariableScope();
List<Variable> variables = new ArrayList<Variable>();
Variable variable = new Variable();
variable.setName("PO");
variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}POMessage"));
variables.add(variable);
variable = new Variable();
variable.setName("Invoice");
variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}InvMessage"));
variables.add(variable);
variable = new Variable();
variable.setName("POFault");
variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}orderFaultType"));
variables.add(variable);
variable = new Variable();
variable.setName("shippingRequest");
variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}shippingRequestMessage"));
variables.add(variable);
variable = new Variable();
variable.setName("shippingInfo");
variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}shippingInfoMessage"));
variables.add(variable);
variable = new Variable();
variable.setName("shippingSchedule");
variable.setType(new XMLDataType("{http://manufacturing.org/wsdl/purchase}scheduleMessage"));
variables.add(variable);
variableScope.setVariables(variables);
// faultHandler
List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
BPELFaultHandler faultHandler = new BPELFaultHandler();
faultHandler.setFaultName("lns:cannotCompleteOrder");
faultHandler.setFaultVariable("POFault");
BPELReply reply = new BPELReply();
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.setName("sequence");
List<BPELActivity> sequenceActivities = new ArrayList<BPELActivity>();
// Receive purchase order
BPELReceive receive = new BPELReceive();
receive.setName("Receive Purchase Order");
receive.setOperation("purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder");
receive.setVariable("PO");
receive.setCreateInstance(true);
sequenceActivities.add(receive);
// flow
BPELFlow flow = new BPELFlow();
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.setName("sequence1");
List<BPELActivity> sequence1Activities = new ArrayList<BPELActivity>();
// assign1
BPELAssign assign1 = new BPELAssign();
BPELAssign.Copy copy = assign1.new Copy();
copy.setFrom(assign1.new VariableRef("PO", "customerInfo", null, null));
copy.setTo(assign1.new VariableRef("shippingRequest", "customerInfo", null, null));
assign1.addCopy(copy);
sequence1Activities.add(assign1);
// invoke1
BPELInvoke invoke1 = new BPELInvoke();
invoke1.setName("Decide On Shipper");
invoke1.setPartnerLink("shipping");
invoke1.setPortType("lns:shippingPT");
invoke1.setOperation("requestShipping");
invoke1.setInputVariable("shippingRequest");
invoke1.setOutputVariable("shippingInfo");
invoke1.setSourceLinks(new SourceLink[] { new SourceLink("ship-to-invoice") });
sequence1Activities.add(invoke1);
// receive1
BPELReceive receive1 = new BPELReceive();
receive1.setName("Arrange Logistics");
receive1.setOperation("shipping", "lns:shippingCallbackPT", "sendSchedule");
receive1.setVariable("shippingSchedule");
receive1.setCreateInstance(false);
receive1.setSourceLinks(new SourceLink[] { new SourceLink("ship-to-scheduling") });
sequence1Activities.add(receive1);
sequence1.setActivities(sequence1Activities);
flowActivities.add(sequence1);
/********** sequence2 **********/
BPELSequence sequence2 = new BPELSequence();
sequence2.setName("sequence2");
List<BPELActivity> sequence2Activities = new ArrayList<BPELActivity>();
// invoke2a
BPELInvoke invoke2a = new BPELInvoke();
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.setName("Complete Price Calculation");
invoke2b.setPartnerLink("invoicing");
invoke2b.setPortType("lns:computePricePT");
invoke2b.setOperation("sendShippingPrice");
invoke2b.setInputVariable("shippingInfo");
invoke2b.setTargetLinks(new TargetLink[] { new TargetLink("ship-to-invoice") });
sequence2Activities.add(invoke2b);
// receive2
BPELReceive receive2 = new BPELReceive();
receive2.setName("Receive Invoice");
receive2.setOperation("invoicing", "lns:invoiceCallbackPT", "sendInvoice");
receive2.setVariable("Invoice");
receive2.setCreateInstance(false);
sequence2Activities.add(receive2);
sequence2.setActivities(sequence2Activities);
flowActivities.add(sequence2);
/********** sequence3 **********/
BPELSequence sequence3 = new BPELSequence();
sequence3.setName("sequence3");
List<BPELActivity> sequence3Activities = new ArrayList<BPELActivity>();
// invoke3a
BPELInvoke invoke3a = new BPELInvoke();
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.setName("Complete Production Scheduling");
invoke3b.setPartnerLink("scheduling");
invoke3b.setPortType("lns:schedulingPT");
invoke3b.setOperation("sendShippingSchedule");
invoke3b.setInputVariable("shippingSchedule");
invoke3b.setTargetLinks(new TargetLink[] { new TargetLink("ship-to-scheduling") });
sequence3Activities.add(invoke3b);
sequence3.setActivities(sequence3Activities);
flowActivities.add(sequence3);
flow.setActivities(flowActivities);
sequenceActivities.add(flow);
// reply
reply = new BPELReply();
reply.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, null);
return process;
}
// normal execution
public void testPurchaseOrderProcessNormalFlow() {
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);
BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
// start process
BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder",
"<POMessage><customerInfo>Jack</customerInfo><purchaseOrder>PURCHASE_ORDER</purchaseOrder></POMessage>");
// reply to web service invocations
WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "requestProductionScheduling");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "initiatePriceCalculation");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "<shippingInfoMessage><shippingInfo>SHIPPING_INFO</shippingInfo></shippingInfoMessage>");
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "sendShippingPrice");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
// invoke web service callbacks
BPELTestUtil.webServiceInvocation(processInstance, "shipping", "lns:shippingCallbackPT", "sendSchedule", "<scheduleMessage><schedule>SCHEDULE</schedule></scheduleMessage>");
BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "lns:invoiceCallbackPT", "sendInvoice", "<InvMessage><IVC>INVOICE</IVC></InvMessage>");
// reply to web service invocation
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "sendShippingSchedule");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
}
// shipping returns fault
public static void testPurchaseOrderProcessFault() {
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);
BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
// start process
BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder",
"<POMessage><customerInfo>Jack</customerInfo><purchaseOrder>PURCHASE_ORDER</purchaseOrder></POMessage>");
// reply to web service invocations
WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "requestProductionScheduling");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "initiatePriceCalculation");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
BPELTestUtil.replyWebServiceInvocationFault(workingMemory, workItem, "lns:cannotCompleteOrder", "SHIPPING FAULT");
workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder");
BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
}
}