BPEL and PSEUDO SQL Codes for Bookstore Example Using WED-Flow Approach
This Document has posted in
http://www.ime.usp.br/~jef/apendix- CoopIS2010.pdf to complete the reading of the paper submitted to CoopIS 2010entitle “Reducing the Complexity of Exception Handling in Business Process Development: The WED-Flow Approach.
To illustrate business process modeling and implementation using the WED- flow approach, consider a bookstore that sells books through orders over the Internet. An important event that a bookstore needs to manage is the ordering of books made by its customers. For this purpose our sample bookstore has created a business process called order book. Whenever a customer makes a book order, an instance of this business process commences execution. The most important common events and their respective activities are represented for such a book order process illustrated in Figure 1 (using the classical BPMN modeling). In the figure, a clear dependency relation between events is observable except in first event that initiates the process.
The main lifecycle is represented by events and activities that belong to the critical path (customer orders books, bookstore validates the order, customer pays the order, bookstore sends a book, and customer receives books) and the events and activities that belong to the exception paths (customer cancel order, customers reclaim, customer does not pay orders, bookstore abort orders, bookstore does not send books, and customer returns books).
Figure 1
Bookstore Example using BPEL Code
<!--
BPEL CODE FOR MESSAGE CONFIGURATIONS-->
<portType name=" WEDFLOWPT ">
<operation name="Create WEDFLOW ">
<input message="ptr:WEDFLOW" />
</operation>
</portType>
<portType name=" WEDSTATEPT ">
<operation name="Instantiate WEDSTATE ">
<input message="ptr:WEDSTATE" />
</operation>
</portType>
<portType name=" WEDTRIGGERPT ">
<operation name="Create WEDTRIGGER">
<input message="ptr:WEDTRIGGER" />
</operation>
</portType>
<portType name=" WECONDITIONPT ">
<operation name="Create WEDCONDITION ">
<input message="ptr:WEDCONDITION" />
</operation>
</portType>
<portType name=" WEDTRANSITIONPT ">
<operation name="Create WEDTRANSITION ">
<input message="ptr:WEDTRANSITION" />
</operation>
</portType>
<portType name=" EOPT ">
<operation name="Create EO">
<input message="ptr:EO" />
</operation>
</portType>
<portType name=" OrderBookRequestPT ">
<operation name="OrderBookRequest">
<input message="ptr:OrderBookRequestMessage" />
</operation>
</portType>
<!--
BPEL CODE FOR ORDER BOOK WED-Flow Infra-structure-->
<process name = “OrderBook”>
<plnk:partnerLinkType name="WEDFLOW">
<plnk:role name="Create WEDFLOW">
<plnk:portType name="plr:WEDFLOW" />
<plnk:role name="Instantiate WEDSTATE">
<plnk:portType name="plr:WESTATE" />
<plnk:role name="Create WEDTRIGGER">
<plnk:portType name="plr:WEDTRIGGER" />
<plnk:role name="Create WEDCONDITION">
<plnk:portType name="plr:WEDCONDITION" />
<plnk:role name="Create WEDTRANSITION">
<plnk:portType name="plr:WEDTRANSITION" />
<plnk:role name="Create EO">
<plnk:portType name="plr:EO" />
</plnk:role><plnk:role name="OrderBook">
<plnk:portType name="plr:OrderRequestPT" />
</plnk:role>
</plnk:partnerLinkType>
<variables>
<!-- input Schema for WEDFLOW -->
<variable name="WEDFLOW-Schema"
messageType="pts:WEDFLOWSchemaMessage"/>
<!-- input values for Instantiate WEDSTATE-->
<variable name="WEDSTATE-VALUES"
messageType="pts:WEDSTATEVALUESMessage"/>
<!-- input Schema for WEDTRIGGER -->
<variable name="WEDTRIGGER-Code "
messageType="pts:WEDTRIGGERCodeMessage"/>
<!-- input Code for WEDCONDITION -->
<variable name="WEDCONDITION-Code "
messageType="pts:WEDCONDITIONCodeMessage"/>
<!-- input Code for WEDTRANSITION -->
<variable name="WEDTRANSITION-Code "
messageType="pts:WEDTRANSITIONCodeMessage"/>
<!-- input Code for EO -->
<variable name="EO-Code "
messageType="pts:EOCodeMessage"/>
<!-- input for the OrderBookRequest -->
<variable name="OrderBookRequest"
messageType="ptr:OrderBookRequestMessage"/>
</variables>
<!--
BPEL CODE FOR CRITICAL EVENTS to ORDER BOOK-->
<sequence>
<!-- Receive initial request from WEDFLOW -->
<receive partnerLink="WEDFLOW"
portType="WEDFLOWPT"
operation="Create WEDFLOW"
variable="WEDFLOW-Schema"
createInstance="yes" />
<invoke>
operation= Create WEDFLOW-Schema </invoke>
<!-- Receive initial values for WEDSTATE -->
<receive partnerLink="WEDSTATE"
portType="WEDSTATEPT"
operation="Instantiate WEDSTATE"
variable="WEDSTATE-VALUES"
createInstance="yes" />
<invoke>
operation= Instantiate WEDSTATE-VALUES </invoke>
<!-- Receive Schema for WEDTRIGGER Initial WEDflow Instance-->
<receive partnerLink="WEDTRIGGER"
portType="WEDTRIGGERPT"
operation="Create WEDTRIGGER"
variable="WEDTRIGGER-Code"
createInstance="yes" />
<invoke>
operation= Create WEDTRIGGER-Code <! -- Continual Query1 -->
<!--SELECT customer_id, book_id, order_id, date, status, result-->
<!--FROM Order-->
<!--WHERE Order.status = “requested” -->
<!--Teq1: Trigger: 5min interval every day -->
<!--Stop1: Order.status= done -->
</invoke>
<!--Receive Code for WEDCONDITION--> <!-- Order Values-- >
<receive partnerLink="WEDCONDITION"
portType="WEDCONDITIONPT"
operation="Create WEDCONDITION"
variable="WEDCONDITION-Code"
createInstance="yes" />
<invoke>
operation= Create WEDCONDITION-Code
IF order values are OK and there is the Book </invoke>
<!--Receive Code for WEDCONDITION--> <!-- Cancel = Requested-- >
<receive partnerLink="WEDCONDITION"
portType="WEDCONDITIONPT"
operation="Create WEDCONDITION"
variable="WEDCONDITION-Code"
createInstance="yes" />
<invoke>
operation= Create WEDCONDITION-Code IF Order.status = requested </invoke>
<!--Receive Code for WEDTRANSITION--><!--Instantiate WEDSTATE -->
<receive partnerLink="WEDTRANSITION"
portType="WEDTRANSITIONPT"
operation="Create WEDTRANSITION"
variable="WEDTRANSITION-Code"
createInstance="yes" />
<invoke>
operation= Instantiate WEDTRANSITION-Code <!--Processing-->
INSTATIATE WEDSTATE Order-Request;
UPDATE Order SET (status=processing)
</invoke>
. . .
<!--
BPEL CODE FOR EXCEPTION EVENTS to ORDER BOOK-->
<!-- Receive Schema for WEDTRIGGER Cancelation-->
<receive partnerLink="WEDTRIGGER"
portType="WEDTRIGGERPT"
operation="Create WEDTRIGGER"
variable="WEDTRIGGER-Code"
createInstance="yes" />
<invoke>
operation= Create WEDTRIGGER-Code <! -- Continual Query2 -->
<! -- SELECT customer_id, book_id, order_id, date, status, result
<! -- FROM Order -->
<! -- WHERE Order.cancelation = “canceled” -->
<! -- Teq1: Trigger: 5min interval every day -->
<! -- Stop1: Order.cancelation = “canceled-accepted” -->
</invoke>
<!-- Receive Code for WEDCONDITION --> <!--Cancel = Validated-- >
<receive partnerLink="WEDCONDITION"
portType="WEDCONDITIONPT"
operation="Create WEDCONDITION"
variable="WEDCONDITION-Code"
createInstance="yes" />
<invoke>
operation= Create WEDCONDITION-Code IF Order.status = validated </invoke>
<!-- Receive Code for WEDCONDITION --> <!-- Cancel = payment -- >
<receive partnerLink="WEDCONDITION"
portType="WEDCONDITIONPT"
operation="Create WEDCONDITION"
variable="WEDCONDITION-Code"
createInstance="yes" />
<invoke>
operation= Create WEDCONDITION-Code IF Order.status = payment </invoke>
<!-- Receive Code for WEDCONDITION --> <!-- Cancel = sent -- >
<receive partnerLink="WEDCONDITION"
portType="WEDCONDITIONPT"
operation="Create WEDCONDITION"
variable="WEDCONDITION-Code"
createInstance="yes" />
<invoke>
operation= Create WEDCONDITION-Code IF Order.status = sent
</invoke>
<!--Receive Code for WEDCONDITION--> <!-- Cancel = received -- >
<receive partnerLink="WEDCONDITION"
portType="WEDCONDITIONPT"
operation="Create WEDCONDITION"
variable="WEDCONDITION-Code"
createInstance="yes" />
<invoke>
operation= Create WEDCONDITION-Code
IF Order.status = received </invoke>
<!--Receive Code for WEDTRANSITION--><!-- Order Cancelation -->
<receive partnerLink="WEDTRANSITION"
portType="WEDTRANSITIONPT"
operation="Create WEDTRANSITION"
variable="WEDTRANSITION-Code"
createInstance="yes" />
<invoke>
operation= Instantiate WEDTRANSITION-Code<!--Validated-->
INSTATIATE WEDSTATE Order-Request;
UPDATE Order SET (status=done; result=canceled-accepted)
</invoke>
. . .
<!-- CREATE MAIN CODE FOR INSTANCE of an Order Book-->
<eventHandlers>
<onMessage WEDTRIGGER Order-Book-Request <switch>
<case WEDCONDITION Order-Book-Values <invoke>
operation= WEDTRANSITION Order-Book-Processing </invoke>
</case>
. . .
<case WEDCONDITION Order-Book-Canceled <invoke>
operation= WEDTRANSITION Order-Book-Canceled </invoke>
</case>
...
</switch>
</onMessage>
</eventHandlers>
</process>
Bookstore Example using PSEUDO SQL Code INFRASTRUCTURE Using SQL CODE
ON CREATE-WEDFLOW Order-Book
CREATE WEDSTATE Schema-Data-State (Schema-Order-Book) SET WEDSTATE Initial-Data-State (VALUES)
CREATE WEDTRIGGER Order-Book-Request (ContinualQuery1)
SELECT customer_id, book_id, order_id, date, status, result FROM Order
WHERE Order.status = “requested”
Teq1: Trigger: 5min interval every day Stop1: Order.status= done
CREATE WEDCONDITION Order-Book-Values
IF Request values are OK and there is a Book CREATE WEDTRANSITION Order-Book-Request
BEGIN
INSERT new WED-state copying data state values from triggers;
UPDATE Order SET (status = request);
END
CREATE WEDTRANSITION Order-Book-Processing BEGIN
INSERT new WED-state copying last valid data state;
UPDATE Order SET (status = processing);
END
CREATE WEDTRANSITION Order-Book-Cancelation-Validated BEGIN
INSERT new Order copying last valid data state values
UPDATE Order SET (status = done; result = canceled-accepted);
END
MAIN SQL CODE FOR TWO EVENTS
============================
ON WEDFLOWTRIGGER Order-Request FOR EACH ROW
IF WEDCONDITION Order-Book-Values
CALL WEDTRANSITION Order-Book-Processing ENDIF
. . .
ON WEDFLOWTRIGGER Order-Cancelation FOR EACH ROW
IF WEDCONDITION Order-Book-Cancelation-Validated
CALL WEDTRANSITION Order-Book-Cancelation-Validated ENDIF
IF WEDCONDITION Order-Book-Cancelation-Payment CALL WEDTRANSITION Order-Book-Payment
ENDIF
IF WEDCONDITION Order-Book-Cancelation-Sent CALL WEDTRANSITION Order-Book-Sent
ENDIF
IF WEDCONDITION Order-Book-Cancelation-Received CALL WEDTRANSITION Order-Book-Received
ENDIF . . .