WfMC Sample Workflow
Use Case
The WfMC sample workflow is a sales order processing scenario.
The XYZE Products Company receives orders from cash and credit
accounts: cash accounts pay by credit card and credit accounts are
invoiced. A suite of three co-operating workflows manages the process
of
receiving orders, arranging payment by credit card or invoice, and
order fulfillment. The business rules and process flows are as follows:
- Received orders are transformed then validated.
- Order amounts from credit account customers must not cause the balance
to exceed the credit limit.
- Order amounts from cash customers must be pre-approved by the credit
card company.
-
If either credit check fails:
- The order is cancelled and a cancellation notification is emailed to the
customer.
- If the credit check is successful:
- The order fulfillment process is started.
- An acceptance letter is composed.
- A order confirmation messages is emailed to the customer.
- The order is passed for fulfillment.
- If the order has not been fulfilled within three days:
- If the order has not been fulfilled within five days:
- The process cancels the order and terminates.
- If the order is from a credit account customer:
- An invoice is created.
- The invoice is emailed to the customer.
- If the order is from a cash customer:
- Their credit card is billed.
- A receipt is created.
- The receipt is emailed to the customer.
N.B. The OBE version of this workflow process differs slightly from
the original WfMC version, which contains several errors, omissions and
inconsistencies. The OBE version is fully functional and is also
event-triggerable.
Interfaces
Order Document Schema
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="Order">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Items">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Item" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="itemNumber" type="xsd:integer" use="required"/>
<xsd:attribute name="itemQty" type="xsd:integer" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="accountNumber" type="xsd:integer" use="required"/>
<!--
Adrian Price: This is the wrong data type for a financial
transaction. Should use xsd:decimal to prevent inaccuracies.
-->
<xsd:attribute name="totalAmount" type="xsd:float" use="required"/>
<xsd:attribute name="emailAddress" type="xsd:string" use="required"/>
<xsd:attribute name="orderType" type="orderType" use="required"/>
<xsd:attribute name="cardType" type="cardType" use="required">
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="orderType">
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="PO"/>
<xsd:enumeration value="Credit"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="cardType">
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="MC-VISA"/>
<xsd:enumeration value="Discover"/>
<xsd:enumeration value="AMEX"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Applications
Note: In the OBE version all server-side automated processing is
implemented by PROCEDURES. This is because the XPDL specification is
unclear about the semantic distinction between a tool which is invoked
as PROCEDURE versus one which is invoked as an APPLICATION. OBE
semantics assume that, being typically non-interactive, procedures are
invoked server-side whereas applications, being typically
interactive, are invoked client-side (and therefore require non-SYSTEM
activity performers and thus have associated work items).
Procedures
transformData(IN STRING orderString, OUT
Document
orderDocument
)
checkData(IN Document orderInfo, OUT STRING orderStatus)
checkVendor(IN INTEGER accountNumber, IN FLOAT orderAmount, OUT STRING
creditStatus)
enterOrder(IN Document orderInfo, OUT INTEGER salesOrderNumber)
composeMessage(IN STRING status, IN INTEGER orderNumber)
setCreditInfo(IN INTEGER accountNumber, IN FLOAT amount, IN STRING cardType,
OUT
Document creditInfo
)
getCreditInfo(
IN INTEGER
orderNumber
,
OUT
Document creditInfo
)
shipOrder(
IN INTEGER
orderNumber, OUT STRING
orderStatus)
billAccount(
IN INTEGER
orderNumber)
createInvoice(
IN INTEGER
orderNumber, OUT STRING
documentURI)
createReceipt(
IN INTEGER
orderNumber, OUT
STRING documentURI)
cancelOrder(
IN INTEGER
orderNumber)
setOrderStatus(IN STRING creditStatus, OUT STRING orderStatus)
Credit Card Web Service
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://wfmc.org/standards/docs/xpdl_sample"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://wfmc.org/standards/docs/xpdl_sample"
xmlns:intf="http://wfmc.org/standards/docs/xpdl_sample"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<schema targetNamespace="http://wfmc.org/standards/docs/xpdl_sample"
xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="CreditInfo">
<sequence>
<element name="merchantNumber" nillable="true"
type="xsd:string"/>
<element name="accountNumber" nillable="true"
type="xsd:string"/>
<element name="amount" nillable="true" type="xsd:decimal"/>
<element name="cardType" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<element name="creditInfo" type="impl:CreditInfo"/>
<element name="status" type="xsd:string"/>
</schema>
</wsdl:types>
<wsdl:message name="getCreditAuthorizationRequest">
<wsdl:part name="creditInfo" element="impl:creditInfo"/>
</wsdl:message>
<wsdl:message name="getCreditAuthorizationResponse">
<wsdl:part name="status" element="impl:status"/>
</wsdl:message>
<wsdl:message name="chargeCreditAccountRequest">
<wsdl:part name="creditInfo" element="impl:creditInfo"/>
</wsdl:message>
<wsdl:message name="chargeCreditAccountResponse">
<wsdl:part name="status" element="impl:status"/>
</wsdl:message>
<wsdl:portType name="CreditPortType">
<wsdl:operation name="getCreditAuthorization"
parameterOrder="creditInfo">
<wsdl:input name="getCreditAuthorizationRequest"
message="impl:getCreditAuthorizationRequest"/>
<wsdl:output name="getCreditAuthorizationResponse"
message="impl:getCreditAuthorizationResponse"/>
</wsdl:operation>
<wsdl:operation name="chargeCreditAccount" parameterOrder="creditInfo">
<wsdl:input name="chargeCreditAccountRequest"
message="impl:chargeCreditAccountRequest"/>
<wsdl:output name="chargeCreditAccountResponse"
message="impl:chargeCreditAccountResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CreditServicePortSoapBinding"
type="impl:CreditPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getCreditAuthorization">
<soap:operation soapAction="http://localhost:8080/obeexamples/services/CreditServicePort/GetCreditAuthorization"/>
<!--<soap:operation soapAction=""/>-->
<wsdl:input name="getCreditAuthorizationRequest">
<soap:body
namespace="http://wfmc.org/standards/docs/xpdl_sample"
use="literal"/>
</wsdl:input>
<wsdl:output name="getCreditAuthorizationResponse">
<soap:body
namespace="http://wfmc.org/standards/docs/xpdl_sample"
use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="chargeCreditAccount">
<soap:operation soapAction="http://localhost:8080/obeexamples/services/CreditServicePort/ChargeCreditAccount"/>
<!--<soap:operation soapAction=""/>-->
<wsdl:input name="chargeCreditAccountRequest">
<soap:body
namespace="http://wfmc.org/standards/docs/xpdl_sample"
use="literal"/>
</wsdl:input>
<wsdl:output name="chargeCreditAccountResponse">
<soap:body
namespace="http://wfmc.org/standards/docs/xpdl_sample"
use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="CreditService">
<wsdl:port binding="impl:CreditServicePortSoapBinding"
name="CreditServicePort">
<soap:address
location="http://localhost:8080/obeexamples/services/CreditService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Solution
Process
Model Description
EOrder Workflow - wfmc-wf-1
- The workflow can either be started manually or triggered by the '
WfMCSalesOrderReceived
' application event. (N.B. Event
triggering is an OBE extension - standard XPDL has no
semantic equivalent.)
- The 'Transform Data' activity invokes the '
transformData
'
tool, passing the orderString
as an IN parameter and
storing the result in the OUT parameter 'orderInfo
'.
- If an exception occurs, the 'Raise Alarm' activity starts,
auto-completes, then activates the 'Compose Rejection' activity.
- The 'Check Data' activity checks
orderInfo
to verify
it, setting the 'status
' OUT parameter.
- If
orderInfo
is valid, the 'Check Order'
activity branches the flow according to whether the order is against a
credit account or a credit card.
- If a credit account, the 'Check Vendor' activity invokes the
checkVendor()
procedure which checks whether the account balance would would
remain
within the preset credit limit for that customer. If it does not,
transition 30 activates the 'Compose Rejection' activity. If it
does, the flow proceeds to the 'Enter Order' activity.
- If a credit card sale, the 'Check Credit' activity invokes the
'CreditCheck' subflow. If the credit card authorization request is
declined, transition activates the 'Compose Rejection'
activity.
If successful, the flowproceeds to the 'Enter Order' activity.
- The 'Enter Order' activity passes
orderInfo
to the '
enterOrder
' tool, storing the result into the '
orderNumber
' OUT parameter.
- Once the order has been entered the following three activities
proceed in parallel. When they are all complete, the workflow process
is marked complete.
- The 'Fill Order Subprocess' activity asynchronously invokes the
'FillOrder' subflow.
- The 'Compose Acceptance' activity composes a document of
acceptance (presumably storing it somewhere so that it will be
accessible to the customer via a URL).
- The 'EMail Confirmation' activity composes an email and sends
it to the customer's email address. The EMail message content
contains
a reference to the customer's order number.
FillOrder Workflow - wfmc-wf-2
- The 'FillOrder' workflow is invoked as a subprocess from EOrder, with
orderNumber
, orderType
and
emailAddress
being passed as parameters to the subflow.
- The 'Ship Order' activity invokes the '
shipOrder
' tool,
passing orderNumber
and storing the result in the '
status
' OUT parameter.
- If the 'Ship Order' activity has not completed within three days, this
activates the 'Raise Alarm' activity.
- If the 'Ship Order' activity has not completed within five days the
'Cancel Order' activity is activated, which invokes the '
cancelOrder
' tool.
- Otherwise, if this is a credit account order:
- The 'Billing' activity invokes the '
billAccount
' tool,
passing orderNumber
as a parameter.
- The 'Create Invoice' activity invokes the '
createInvoice
' tool, passing orderNumber
and
storing the resulting docUri
.
- If this is a credit card order:
- The 'Get Credit Info' activity invokes the '
getCreditInfo
' tool to retrieve the creditInfo
object for this orderNumber
.
- The 'Charge Credit' activity invokes the '
chargeCreditAccount
' tool (implemented as a call to a Web Service) to raise
the charge to the credit card.
- The 'Create Receipt' activity invokes the '
createReceipt
' tool, passing orderNumber
and storing the
resulting docUri
.
- The 'EMail Receipt or Invoice' activity generates and sends an
email message which contains a link to the receipt or invoice.
CreditCheck Workflow - wfmc-wf-3
- The 'CheckCredit' workflow is invoked as a subprocess from EOrder, with
accountNumber
, amount
and
cardType
being passed as parameters to the subflow.
- The 'Set Credit Info' activity invokes the '
setCreditInfo
'
tool, passing accountNumber
, amount
and
cardType
as IN parameters and storing the returned XML
document in the creditInfo
OUT parameter.
- The 'Get Credit Authorization' passes the
creditInfo
document to the 'getCreditAuthorization
' tool (a Web
Service) and stores the returned result in the
creditStatus
OUT parameter.
- The 'Set Order Status' activity invokes the '
setOrderStatus
' tool to convert the creditStatus
authorization code into
the status
value returned by the subflow as an OUT
parameter.
XPDL Process Model
<?xml version="1.0" encoding="UTF-8"?>
<Package Id="wfmc-sample" Name="Sample Workflow Process"
xmlns="http://www.wfmc.org/2002/XPDL1.0" xmlns:obe="http://obe.sourceforge.net/2005/OBE1.0"
xmlns:xpdl="http://www.wfmc.org/2002/XPDL1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xyz="http://www.xyzeorder.com/workflow"
xsi:schemaLocation="http://www.wfmc.org/2002/XPDL1.0 http://wfmc.org/standards/docs/TC-1025_schema_10_xpdl.xsd">
<PackageHeader>
<XPDLVersion>1.0</XPDLVersion>
<Vendor>XYZ, Inc</Vendor>
<Created>6/18/2002 5:27:17 PM</Created>
</PackageHeader>
<ConformanceClass GraphConformance="NON_BLOCKED"/>
<Script Type="text/x-xpath"/>
<TypeDeclarations>
<TypeDeclaration Id="Text" Name="Long Java String">
<ExternalReference location="java:java.lang.String"/>
</TypeDeclaration>
<TypeDeclaration Id="CardType" Name="CardType">
<ExternalReference
location="http://wfmc.org/standards/docs/xpdl_sample/orderschema.xsd"
xref="cardType"/>
</TypeDeclaration>
<TypeDeclaration Id="Order" Name="Order">
<ExternalReference
location="http://wfmc.org/standards/docs/xpdl_sample/orderschema.xsd"
xref="Order"/>
</TypeDeclaration>
<TypeDeclaration Id="CreditInfo" Name="CreditInfo">
<!--<ExternalReference
location="http://wfmc.org/standards/docs/xpdl_sample/creditService.wsdl"
namespace="http://wfmc.org/standards/docs/xpdl_sample" xref="CreditInfo"/>-->
<ExternalReference
location="http://localhost:8080/obeexamples/services/CreditServicePort?wsdl"
namespace="http://wfmc.org/standards/docs/xpdl_sample" xref="CreditInfo"/>
</TypeDeclaration>
<TypeDeclaration Id="OrderStatus" Name="OrderStatus">
<SchemaType>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="Status">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="ValidData"/>
<xsd:enumeration value="InvalidData"/>
<xsd:enumeration value="Accept"/>
<xsd:enumeration value="BadCredit"/>
<xsd:enumeration value="OverLimit"/>
<xsd:enumeration value="BadDataFormat"/>
</xsd:restriction>
</xsd:simpleType>
<!--
<xsd:element name="Status">
<xsd:simpleType>
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="ValidData"/>
<xsd:enumeration value="InvalidData"/>
<xsd:enumeration value="Accept"/>
<xsd:enumeration value="BadCredit"/>
<xsd:enumeration value="OverLimit"/>
<xsd:enumeration value="BadDataFormat"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
-->
</xsd:schema>
</SchemaType>
</TypeDeclaration>
</TypeDeclarations>
<Participants>
<Participant Id="DBConnection">
<ParticipantType Type="SYSTEM"/>
<Description>Reference to Database Resource</Description>
</Participant>
</Participants>
<Applications>
<Application Id="setCreditInfo">
<Description>Creates and initializes a CreditInfo object.</Description>
<FormalParameters>
<FormalParameter Id="accountNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
<FormalParameter Id="amount" Mode="IN">
<DataType>
<BasicType Type="FLOAT"/>
</DataType>
</FormalParameter>
<FormalParameter Id="cardType" Mode="IN">
<DataType>
<DeclaredType Id="CardType"/>
</DataType>
</FormalParameter>
<FormalParameter Id="creditInfo" Mode="OUT">
<DataType>
<DeclaredType Id="CreditInfo"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="obe.email">
<FormalParameters>
<FormalParameter Id="subject" Mode="IN">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
<FormalParameter Id="body" Mode="IN">
<DataType>
<DeclaredType Id="Text"/>
</DataType>
</FormalParameter>
<FormalParameter Id="att" Mode="IN">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
<FormalParameter Id="to" Mode="IN">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
<FormalParameter Id="cc" Mode="IN">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
<FormalParameter Id="bcc" Mode="IN">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="obe.velocity">
<FormalParameters>
<FormalParameter Id="template" Mode="IN">
<DataType>
<DeclaredType Id="Text"/>
</DataType>
</FormalParameter>
<FormalParameter Id="resolve" Mode="IN">
<DataType>
<BasicType Type="BOOLEAN"/>
</DataType>
</FormalParameter>
<FormalParameter Id="result" Mode="OUT">
<DataType>
<DeclaredType Id="Text"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
</Applications>
<WorkflowProcesses>
<WorkflowProcess AccessLevel="PUBLIC" Id="wfmc-wf-1" Name="EOrder">
<ProcessHeader/>
<FormalParameters>
<FormalParameter Id="orderString" Mode="IN">
<DataType>
<DeclaredType Id="Text"/>
</DataType>
</FormalParameter>
<FormalParameter Id="returnMessage" Mode="OUT">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
</FormalParameters>
<DataFields>
<DataField Id="orderNumber" IsArray="FALSE">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
<InitialValue>0</InitialValue>
<Length>0</Length>
</DataField>
<DataField Id="body" IsArray="FALSE">
<DataType>
<DeclaredType Id="Text"/>
</DataType>
</DataField>
<DataField Id="status" IsArray="FALSE">
<DataType>
<DeclaredType Id="OrderStatus"/>
</DataType>
</DataField>
<DataField Id="orderInfo" IsArray="FALSE">
<DataType>
<DeclaredType Id="Order"/>
</DataType>
</DataField>
</DataFields>
<Applications>
<Application Id="transformData">
<FormalParameters>
<FormalParameter Id="orderString" Mode="IN">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
<FormalParameter Id="orderInfo" Mode="OUT">
<DataType>
<DeclaredType Id="Order"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="checkData">
<FormalParameters>
<FormalParameter Id="orderInfo" Mode="IN">
<DataType>
<DeclaredType Id="Order"/>
</DataType>
</FormalParameter>
<FormalParameter Id="status" Mode="OUT">
<DataType>
<DeclaredType Id="OrderStatus"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="checkVendor">
<FormalParameters>
<FormalParameter Id="accountNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
<FormalParameter Id="amount" Mode="IN">
<DataType>
<BasicType Type="FLOAT"/>
</DataType>
</FormalParameter>
<FormalParameter Id="status" Mode="OUT">
<DataType>
<DeclaredType Id="OrderStatus"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="enterOrder">
<FormalParameters>
<FormalParameter Id="orderInfo" Mode="IN">
<DataType>
<DeclaredType Id="Order"/>
</DataType>
</FormalParameter>
<FormalParameter Id="orderNumber" Mode="OUT">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="composeMessage">
<FormalParameters>
<FormalParameter Id="status" Mode="IN">
<DataType>
<DeclaredType Id="OrderStatus"/>
</DataType>
</FormalParameter>
<FormalParameter Id="orderNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
</Applications>
<Activities>
<Activity Id="1" Name="Check Data">
<Implementation>
<Tool Id="checkData" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderInfo</ActualParameter>
<ActualParameter>status</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<TransitionRestrictions>
<TransitionRestriction>
<Split Type="XOR">
<TransitionRefs>
<TransitionRef Id="22"/>
<TransitionRef Id="23"/>
</TransitionRefs>
</Split>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="271"/>
<ExtendedAttribute Name="YOffset" Value="100"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="183" ypos="389"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="183" y="389"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="5">
<Route/>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="61"/>
<ExtendedAttribute Name="YOffset" Value="100"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="35" ypos="389"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="35" y="389"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="6">
<Route/>
<TransitionRestrictions>
<TransitionRestriction>
<Join Type="XOR"/>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="991"/>
<ExtendedAttribute Name="YOffset" Value="115"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="755" ypos="315"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="755" y="315"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="8" Name="EMail Confirmation">
<Implementation>
<Tool Id="obe.velocity" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>
'Your order number ${orderNumber} is being processed. Thank-you for ordering from XYZE Products, Inc.'
</ActualParameter>
<ActualParameter>false()</ActualParameter>
<ActualParameter>body</ActualParameter>
</ActualParameters>
</Tool>
<Tool Id="obe.email" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>concat('XYZE Products Order Number ', $orderNumber)</ActualParameter>
<ActualParameter>$body</ActualParameter>
<ActualParameter/>
<ActualParameter>$orderInfo/Order/@emailAddress/text()</ActualParameter>
<ActualParameter/>
<ActualParameter/>
</ActualParameters>
</Tool>
</Implementation>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="721"/>
<ExtendedAttribute Name="YOffset" Value="130"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="657" ypos="312"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="657" y="312"/>
</ExtendedAttribute>
<ExtendedAttribute Name="SystemActivity" Value="Email"/>
<ExtendedAttribute Name="Email">
<xyz:Email subject="Order %%orderNumber" to="%%orderInfo.emailAddress">
<xyz:MessageText>
Order number %%orderNumber is being processed. Thank-you for ordering from XYZE Products, Inc.
</xyz:MessageText>
</xyz:Email>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="9">
<Route/>
<TransitionRestrictions>
<TransitionRestriction>
<Split Type="AND">
<TransitionRefs>
<TransitionRef Id="1"/>
<TransitionRef Id="38"/>
<TransitionRef Id="2"/>
</TransitionRefs>
</Split>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="601"/>
<ExtendedAttribute Name="YOffset" Value="55"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="572" ypos="389"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="572" y="389"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="10" Name="Check Credit Subprocess">
<Implementation>
<SubFlow Execution="SYNCHR" Id="wfmc-wf-3">
<ActualParameters>
<ActualParameter>$orderInfo/Order/@accountNumber/text()</ActualParameter>
<ActualParameter>$orderInfo/Order/@totalAmount/text()</ActualParameter>
<ActualParameter>$orderInfo/Order/@cardType/text()</ActualParameter>
<ActualParameter>status</ActualParameter>
</ActualParameters>
</SubFlow>
</Implementation>
<TransitionRestrictions>
<TransitionRestriction>
<Split Type="XOR">
<TransitionRefs>
<TransitionRef Id="26"/>
<TransitionRef Id="31"/>
</TransitionRefs>
</Split>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="491"/>
<ExtendedAttribute Name="YOffset" Value="90"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="381" ypos="535"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="381" y="535"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="11" Name="Fill Order Subprocess">
<Implementation>
<SubFlow Execution="ASYNCHR" Id="wfmc-wf-2">
<ActualParameters>
<ActualParameter>$orderNumber</ActualParameter>
<ActualParameter>$orderInfo/Order/@orderType/text()</ActualParameter>
<ActualParameter>$orderInfo/Order/@emailAddress/text()</ActualParameter>
</ActualParameters>
</SubFlow>
</Implementation>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="721"/>
<ExtendedAttribute Name="YOffset" Value="20"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="653" ypos="389"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="653" y="389"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="12" Name="Check Order Type">
<Route/>
<TransitionRestrictions>
<TransitionRestriction>
<Split Type="XOR">
<TransitionRefs>
<TransitionRef Id="24"/>
<TransitionRef Id="25"/>
</TransitionRefs>
</Split>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="391"/>
<ExtendedAttribute Name="YOffset" Value="95"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="293" ypos="460"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="293" y="460"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="17" Name="Transform Data">
<Implementation>
<Tool Id="transformData" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderString</ActualParameter>
<ActualParameter>orderInfo</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<TransitionRestrictions>
<TransitionRestriction>
<Split Type="XOR">
<TransitionRefs>
<TransitionRef Id="40"/>
<TransitionRef Id="21"/>
</TransitionRefs>
</Split>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="161"/>
<ExtendedAttribute Name="YOffset" Value="100"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="102" ypos="389"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="102" y="389"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="32" Name="Enter Order">
<Implementation>
<Tool Id="enterOrder" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderInfo</ActualParameter>
<ActualParameter>orderNumber</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<TransitionRestrictions>
<TransitionRestriction>
<Join Type="XOR"/>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="561"/>
<ExtendedAttribute Name="YOffset" Value="60"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="510" ypos="389"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="510" y="389"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="33">
<Route/>
<TransitionRestrictions>
<TransitionRestriction>
<Join Type="AND"/>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="851"/>
<ExtendedAttribute Name="YOffset" Value="75"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="725" ypos="391"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="725" y="391"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="39" Name="Compose Rejection Message">
<Implementation>
<Tool Id="composeMessage" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$status</ActualParameter>
<ActualParameter>-1</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<TransitionRestrictions>
<TransitionRestriction>
<Join Type="XOR"/>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="611"/>
<ExtendedAttribute Name="YOffset" Value="185"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="655" ypos="245"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="655" y="245"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="41" Name="Check Vendor Account">
<Implementation>
<Tool Id="checkVendor" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderInfo/Order/@accountNumber/text()</ActualParameter>
<ActualParameter>$orderInfo/Order/@totalAmount/text()</ActualParameter>
<ActualParameter>status</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<TransitionRestrictions>
<TransitionRestriction>
<Split Type="XOR">
<TransitionRefs>
<TransitionRef Id="27"/>
<TransitionRef Id="30"/>
</TransitionRefs>
</Split>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="431"/>
<ExtendedAttribute Name="YOffset" Value="55"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="381" ypos="316"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="381" y="316"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="56" Name="Compose Acceptance Message">
<Implementation>
<Tool Id="composeMessage" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$status</ActualParameter>
<ActualParameter>$orderNumber</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="721"/>
<ExtendedAttribute Name="YOffset" Value="75"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="653" ypos="462"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="653" y="462"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="58" Name="Raise Alarm">
<Implementation>
<No/>
</Implementation>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="351"/>
<ExtendedAttribute Name="YOffset" Value="180"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="100" ypos="250"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="100" y="250"/>
</ExtendedAttribute>
<ExtendedAttribute Name="SystemActivity" Value="Alarm"/>
</ExtendedAttributes>
</Activity>
</Activities>
<Transitions>
<Transition From="9" Id="1" To="8">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="9" Id="2" To="11">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="11" Id="16" To="33">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="8" Id="17" To="33">
<Condition Type="OTHERWISE"/>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="33" Id="18" To="6">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="5" Id="20" To="17">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="17" Id="21" To="1">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="1" Id="22" To="12">
<Condition>$status = 'ValidData'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="1" Id="23" To="39">
<Condition>$status = 'InvalidData'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="12" Id="24" To="10">
<Condition>$orderInfo/Order/@orderType = 'Credit'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="12" Id="25" To="41">
<Condition>$orderInfo/Order/@orderType = 'PO'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="10" Id="26" To="32">
<Condition>$status = 'Accept'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="41" Id="27" To="32">
<Condition>$status = 'Accept'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="32" Id="28" To="9">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="39" Id="29" To="6">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="41" Id="30" To="39">
<Condition>$status = 'OverLimit'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="10" Id="31" To="39">
<Condition>$status = 'BadCredit'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="9" Id="38" To="56">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="56" Id="39" To="33">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="17" Id="40" To="58">
<Condition Type="EXCEPTION"/>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="58" Id="42" To="39">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
</Transitions>
<ExtendedAttributes>
<ExtendedAttribute Name="obe.Event">
<obe:Event Id="WfMCSalesOrderReceived">
<xpdl:ActualParameters>
<xpdl:ActualParameter>orderString</xpdl:ActualParameter>
</xpdl:ActualParameters>
</obe:Event>
</ExtendedAttribute>
<ExtendedAttribute Name="StartOfWorkflow" Value="FreeTextExpressionParticipant;5;61;20;NOROUTING"/>
<ExtendedAttribute Name="EndOfWorkflow" Value="FreeTextExpressionParticipant;6;1060;30;NOROUTING"/>
<ExtendedAttribute Name="ParticipantVisualOrder" Value="DBConnection;FreeTextExpressionParticipant;"/>
</ExtendedAttributes>
</WorkflowProcess>
<WorkflowProcess AccessLevel="PRIVATE" Id="wfmc-wf-2" Name="FillOrder">
<ProcessHeader/>
<FormalParameters>
<FormalParameter Id="orderNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
<Description>Order number assigned to the order.</Description>
</FormalParameter>
<FormalParameter Id="orderType" Mode="IN">
<DataType>
<ExternalReference
location="http://wfmc.org/standards/docs/xpdl_sample/orderschema.xsd"
xref="orderType"/>
</DataType>
</FormalParameter>
<FormalParameter Id="emailAddress" Mode="IN">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
</FormalParameters>
<DataFields>
<DataField Id="body" IsArray="FALSE">
<DataType>
<DeclaredType Id="Text"/>
</DataType>
<Description>The body of the receipt or invoice email message.</Description>
</DataField>
<DataField Id="docURI" IsArray="FALSE">
<DataType>
<BasicType Type="STRING"/>
</DataType>
<Description>URI of receipt or invoice.</Description>
</DataField>
<DataField Id="orderStatus" IsArray="FALSE">
<DataType>
<DeclaredType Id="OrderStatus"/>
</DataType>
</DataField>
<DataField Id="creditInfo" IsArray="FALSE">
<DataType>
<DeclaredType Id="CreditInfo"/>
</DataType>
</DataField>
<DataField Id="creditStatus" IsArray="FALSE">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</DataField>
</DataFields>
<Participants>
<Participant Id="Shipper">
<ParticipantType Type="ROLE"/>
<Description>Order shipper</Description>
</Participant>
</Participants>
<Applications>
<Application Id="getCreditInfo">
<FormalParameters>
<FormalParameter Id="OrderNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
<FormalParameter Id="CreditInfo" Mode="OUT">
<DataType>
<DeclaredType Id="CreditInfo"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="shipOrder">
<Description>This application presents a screen that presents order
information for the order identified by shipOrder. The
user may update the order with any changes such as back
order information. It returns a string indicating
whether the order is complete or on back order.</Description>
<FormalParameters>
<FormalParameter Id="OrderNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
<FormalParameter Id="Status" Mode="OUT">
<DataType>
<DeclaredType Id="OrderStatus"/>
</DataType>
<Description>The String that describes the status -- either
"Complete" or "Backorder"</Description>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="chargeCreditAccount">
<Description>Charges the credit card and prepares a receipt for a
credit order.</Description>
<ExternalReference
location="http://localhost:8080/obeexamples/services/CreditServicePort?wsdl"
namespace="http://wfmc.org/standards/docs/xpdl_sample"
xref="chargeCreditAccount"/>
</Application>
<Application Id="billAccount">
<Description>Bills the vendor account</Description>
<FormalParameters>
<FormalParameter Id="orderNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="createInvoice">
<Description>Creates an invoice using the order information and stores it on a server.</Description>
<FormalParameters>
<FormalParameter Id="orderNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
<FormalParameter Id="docURI" Mode="OUT">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="createReceipt">
<Description>Creates a receipt using the order information and stores it on a server.</Description>
<FormalParameters>
<FormalParameter Id="orderNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
<FormalParameter Id="docURI" Mode="OUT">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
<Application Id="cancelOrder">
<FormalParameters>
<FormalParameter Id="orderNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
</Applications>
<Activities>
<Activity Id="21">
<Route/>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="71"/>
<ExtendedAttribute Name="YOffset" Value="90"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="62" ypos="389"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="62" y="389"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="22" Name="Billing">
<Implementation>
<Tool Id="billAccount" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderNumber</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="241"/>
<ExtendedAttribute Name="YOffset" Value="60"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="347" ypos="435"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="347" y="435"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="23" Name="Charge Credit Card">
<Implementation>
<Tool Id="chargeCreditAccount" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$creditInfo</ActualParameter>
<ActualParameter>creditStatus</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="351"/>
<ExtendedAttribute Name="YOffset" Value="125"/>
<ExtendedAttribute Name="SystemActivity" Value="WebService"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="386" ypos="338"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="386" y="338"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="30">
<Route/>
<TransitionRestrictions>
<TransitionRestriction>
<Join Type="XOR"/>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="531"/>
<ExtendedAttribute Name="YOffset" Value="10"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="613" ypos="389"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="613" y="389"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="31" Name="EMail Receipt or Invoice">
<Implementation>
<Tool Id="obe.velocity" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>
'Order number ${orderNumber} is ${orderStatus}. Your receipt or invoice can be viewed at ${docURI}. Thank-you for ordering from XYZE Products, Inc.'
</ActualParameter>
<ActualParameter>false()</ActualParameter>
<ActualParameter>body</ActualParameter>
</ActualParameters>
</Tool>
<Tool Id="obe.email" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>concat('XYZE Products Order Number ', $orderStatus)</ActualParameter>
<ActualParameter>$body</ActualParameter>
<ActualParameter>$docURI</ActualParameter>
<ActualParameter>$emailAddress</ActualParameter>
<ActualParameter/>
<ActualParameter/>
</ActualParameters>
</Tool>
</Implementation>
<TransitionRestrictions>
<TransitionRestriction>
<Join Type="XOR"/>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="511"/>
<ExtendedAttribute Name="YOffset" Value="80"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="430" ypos="385"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="430" y="385"/>
</ExtendedAttribute>
<ExtendedAttribute Name="SystemActivity" Value="Email"/>
<ExtendedAttribute Name="Email">
<xyz:Email subject="%%orderStatus" to="%%emailAddress">
<xyz:Attachments>
<xyz:Attachment>%%docURI</xyz:Attachment>
</xyz:Attachments>
<xyz:MessageText>
Order number %%orderNumber is %%orderStatus. Thank-you for ordering from XYZE Products, Inc.
</xyz:MessageText>
</xyz:Email>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="36" Name="Ship Order">
<Description>View order and enter fulfillment info</Description>
<Implementation>
<Tool Id="shipOrder" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderNumber</ActualParameter>
<ActualParameter>orderStatus</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<Deadline Execution="ASYNCHR">
<DeadlineCondition>3D</DeadlineCondition>
<ExceptionName>notifyException</ExceptionName>
</Deadline>
<Deadline Execution="SYNCHR">
<DeadlineCondition>5D</DeadlineCondition>
<ExceptionName>timeoutException</ExceptionName>
</Deadline>
<TransitionRestrictions>
<TransitionRestriction>
<Split Type="XOR">
<TransitionRefs>
<TransitionRef Id="11"/>
<TransitionRef Id="10"/>
<TransitionRef Id="49"/>
<TransitionRef Id="50"/>
</TransitionRefs>
</Split>
</TransitionRestriction>
</TransitionRestrictions>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="121"/>
<ExtendedAttribute Name="YOffset" Value="55"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="133" ypos="386"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="133" y="386"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="59" Name="Get Credit Info">
<Implementation>
<Tool Id="getCreditInfo" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderNumber</ActualParameter>
<ActualParameter>creditInfo</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="241"/>
<ExtendedAttribute Name="YOffset" Value="120"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="311" ypos="338"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="311" y="338"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="60" Name="Create Invoice">
<Implementation>
<Tool Id="createInvoice" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderNumber</ActualParameter>
<ActualParameter>docURI</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="351"/>
<ExtendedAttribute Name="YOffset" Value="60"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="460" ypos="435"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="460" y="435"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="61" Name="Create Receipt">
<Implementation>
<Tool Id="createReceipt" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderNumber</ActualParameter>
<ActualParameter>docURI</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="451"/>
<ExtendedAttribute Name="YOffset" Value="125"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="461" ypos="338"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="461" y="338"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="63" Name="Raise Alarm">
<Implementation>
<No/>
</Implementation>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="241"/>
<ExtendedAttribute Name="YOffset" Value="45"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="83" ypos="271"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="83" y="271"/>
</ExtendedAttribute>
<ExtendedAttribute Name="SystemActivity" Value="Alarm"/>
</ExtendedAttributes>
</Activity>
<Activity Id="64" Name="Cancel Order">
<Description>View order and enter fulfillment info</Description>
<Implementation>
<Tool Id="cancelOrder" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$orderNumber</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="241"/>
<ExtendedAttribute Name="YOffset" Value="5"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="174" ypos="271"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="174" y="271"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
</Activities>
<Transitions>
<Transition From="21" Id="8" To="36">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="36" Id="10" To="22">
<Condition>$orderType = 'PO'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="36" Id="11" To="59">
<Condition>$orderType = 'Credit'</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="60" Id="13" To="31">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="61" Id="14" To="31">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="31" Id="15" To="30">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="59" Id="43" To="23">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="23" Id="44" To="61">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="22" Id="45" To="60">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="36" Id="49" To="63">
<Condition Type="EXCEPTION">notifyException</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="36" Id="50" To="64">
<Condition Type="EXCEPTION">timeoutException</Condition>
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="64" Id="51" To="30">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
</Transitions>
<ExtendedAttributes>
<ExtendedAttribute Name="StartOfWorkflow" Value="FreeTextExpressionParticipant;21;51;10;NOROUTING"/>
<ExtendedAttribute Name="EndOfWorkflow" Value="FreeTextExpressionParticipant;63;360;50;NOROUTING"/>
<ExtendedAttribute Name="EndOfWorkflow" Value="FreeTextExpressionParticipant;30;660;20;NOROUTING"/>
<ExtendedAttribute Name="ParticipantVisualOrder" Value="FreeTextExpressionParticipant;DBConnection;"/>
</ExtendedAttributes>
</WorkflowProcess>
<WorkflowProcess AccessLevel="PRIVATE" Id="wfmc-wf-3" Name="CreditCheck">
<ProcessHeader/>
<FormalParameters>
<FormalParameter Id="accountNumber" Mode="IN">
<DataType>
<BasicType Type="INTEGER"/>
</DataType>
</FormalParameter>
<FormalParameter Id="amount" Mode="IN">
<DataType>
<BasicType Type="FLOAT"/>
</DataType>
</FormalParameter>
<FormalParameter Id="cardType" Mode="IN">
<DataType>
<DeclaredType Id="CardType"/>
</DataType>
</FormalParameter>
<FormalParameter Id="status" Mode="OUT">
<DataType>
<DeclaredType Id="OrderStatus"/>
</DataType>
</FormalParameter>
</FormalParameters>
<DataFields>
<DataField Id="creditInfo" IsArray="FALSE">
<DataType>
<DeclaredType Id="CreditInfo"/>
</DataType>
</DataField>
<DataField Id="creditStatus" IsArray="FALSE">
<DataType>
<BasicType Type="STRING"/>
</DataType>
<Length>0</Length>
</DataField>
</DataFields>
<Applications>
<Application Id="getCreditAuthorization">
<Description>Gets credit authorization from a charge card web service.</Description>
<ExternalReference
location="http://localhost:8080/obeexamples/services/CreditServicePort?wsdl"
namespace="http://wfmc.org/standards/docs/xpdl_sample"
xref="getCreditAuthorization"/>
</Application>
<Application Id="setOrderStatus">
<Description>Converts status returned by credit check to OrderStatus.</Description>
<FormalParameters>
<FormalParameter Id="creditStatus" Mode="IN">
<DataType>
<BasicType Type="STRING"/>
</DataType>
</FormalParameter>
<FormalParameter Id="orderStatus" Mode="OUT">
<DataType>
<DeclaredType Id="OrderStatus"/>
</DataType>
</FormalParameter>
</FormalParameters>
</Application>
</Applications>
<Activities>
<Activity Id="48">
<Route/>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="121"/>
<ExtendedAttribute Name="YOffset" Value="55"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="61" ypos="395"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="61" y="395"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="49" Name="Set Credit Info">
<Implementation>
<Tool Id="setCreditInfo" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$accountNumber</ActualParameter>
<ActualParameter>$amount</ActualParameter>
<ActualParameter>$cardType</ActualParameter>
<ActualParameter>creditInfo</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<Performer>DBConnection</Performer>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="DBConnection"/>
<ExtendedAttribute Name="XOffset" Value="191"/>
<ExtendedAttribute Name="YOffset" Value="45"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="151" ypos="394"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="151" y="394"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="50" Name="Get Credit Authorization">
<Implementation>
<Tool Id="getCreditAuthorization" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$creditInfo</ActualParameter>
<ActualParameter>creditStatus</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="291"/>
<ExtendedAttribute Name="YOffset" Value="55"/>
<ExtendedAttribute Name="SystemActivity" Value="WebService"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="253" ypos="394"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="253" y="394"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="52">
<Route/>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="541"/>
<ExtendedAttribute Name="YOffset" Value="60"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="444" ypos="397"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="444" y="397"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
<Activity Id="62" Name="Set Order Status">
<Implementation>
<Tool Id="setOrderStatus" Type="PROCEDURE">
<ActualParameters>
<ActualParameter>$creditStatus</ActualParameter>
<ActualParameter>status</ActualParameter>
</ActualParameters>
</Tool>
</Implementation>
<ExtendedAttributes>
<ExtendedAttribute Name="ParticipantID" Value="FreeTextExpressionParticipant"/>
<ExtendedAttribute Name="XOffset" Value="421"/>
<ExtendedAttribute Name="YOffset" Value="60"/>
<ExtendedAttribute Name="Coordinates">
<xyz:Coordinates xpos="361" ypos="394"/>
</ExtendedAttribute>
<ExtendedAttribute Name="obe.Bounds">
<obe:Bounds x="361" y="394"/>
</ExtendedAttribute>
</ExtendedAttributes>
</Activity>
</Activities>
<Transitions>
<Transition From="50" Id="35" To="62">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="48" Id="46" To="49">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="49" Id="47" To="50">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
<Transition From="62" Id="48" To="52">
<ExtendedAttributes>
<ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
</ExtendedAttributes>
</Transition>
</Transitions>
<ExtendedAttributes>
<ExtendedAttribute Name="StartOfWorkflow" Value="FreeTextExpressionParticipant;48;51;50;NOROUTING"/>
<ExtendedAttribute Name="EndOfWorkflow" Value="FreeTextExpressionParticipant;52;670;60;NOROUTING"/>
<ExtendedAttribute Name="ParticipantVisualOrder" Value="DBConnection;FreeTextExpressionParticipant;"/>
</ExtendedAttributes>
</WorkflowProcess>
</WorkflowProcesses>
<ExtendedAttributes>
<ExtendedAttribute Name="MadeBy" Value="JaWE"/>
<ExtendedAttribute Name="Version" Value="1.2"/>
</ExtendedAttributes>
</Package>
Solution Files
See the solution files under $OBE_HOME/examples
:
config/processes/wfmc-sample.xpdl
config/resources/creditService.wsdl
config/resources/orderschema.xsd
config/
BasicToolAgentFactory.xml
etc/WfMCSample/order-1.xml
etc/WfMCSample/order-2.xml
src/org/wfmc/sample/CreditBindingImpl.java
src/org/wfmc/sample/CreditInfo.java
src/org/wfmc/sample/CreditServiceClient.java
src/org/wfmc/sample/CreditServicePortType.java
src/org/obe/examples/WfMCSampleTools.java
Deployment and Execution
The EOrder
workflow supports both manual and triggered start.
- Deploy the
wfmc-sample
.xpdl
package.
- Start a workflow instance by either:
- Instantiating an instance of the
EOrder
workflow
from the Worklist client.
- When prompted, pasting the contents of an XML order which conforms
to the
$OBE_HOME/examples/config/resources/orderschema.xsd
schema,
such as order-1.xml
or order-2.xml
in
$OBE_HOME/examples/etc/WfMCSample
.
- or
- Open a console window and navigate to the
$OBE_HOME/examples/etc/
WfMCSample
directory.
- Execute either or both of the commands:
send order-1
.xml
send order-2
.xml
- In either case, enable
logging to observe in-flight process activity, or use a worklist
client or the
cladmin
tool to probe process instances.
- For each process instance created above, use the worklist client
to locate, execute and where necessary mark work items complete.
Certain work items will present supplementary windows, dialogs or
prompts as they invoke the tools associated with their defining
activities.