Testing the Process Designer prototype implementation

The tool implemented performs two main functions, service discovery and process generation. This section describes the testing process that was carried on to carry out these functionalities. To test these functions a process template was created and a process was generated using the template. This template was created in order to generate an executable process that will help in arranging for a trip to a conference. It has four activities getting conference details, booking a hotel, booking a ticket to go to conference location and booking the return ticket. Since the purpose is to demonstrate the working of the tool and not to generate a process with intricate details, a simplified process has been assumed.

The TecDawg tool needs two file as inputs, the process template (shown in figure) and the process WSDL (shown in figure). The process template, the process WSDL and the generated process (shown in figure) are shown in the end of this appendix section.

Discovery

This section describes the testing on discovery mechanism implemented as a part of this paper. The process template has an activity to reserve a room in a hotel (for simplicity location of the hotel is assumed to be in the location of the conference). If the search for Web services that assist in making room reservation has to be carried out in UDDI it can be done in two ways, keyword based search and category-based search.

Microsoft’s UBR (http://uddi.microsoft.com/search/default.aspx) was searched for testing. When the search was keyword based (using ‘hotel’) it resulted in 7 records. When the search was based on the UNSPC3.1 taxonomy.  It resulted in only one service.

The results can be summarized as follows

1.       The descriptions of few services were meaningful. But typically descriptions are for human understanding and it is not feasible to use descriptions in service discovery or selection.

2.     None of the results was linked to WSDL file. Even if we could locate WSDL files of the services, selection the most appropriate service based on the semantics of the activity requirements is not possible with the current discovery mechanism supported by UDDI.

Figure : Search for Hotel Booking services in UBR using keyword

 

Figure : Search for Hotel Booking services in UBR using category

 

In contrast, the discovery mechanism suggested in the paper can be used effectively to discover appropriate Web services based on the semantics of the requirement. For example the template shown in figure 18 has an activity named Hotel that is annotated with HotelServiceSemantics. This semantic specification is defined in criteria element of the template. It states that one of the inputs of the service should be compatible with the concept CheckInDate in the ontology identified by HotelOnto and so on. The ‘TecDawg’ tool discovery mechanism finds all related services and rank them based on their semantics. The following screenshot shows the service selection step in the process composition using our tool.

Figure : Search for Hotel Booking services based on semantics of requirements

 

The tool selects the services and ranks based on the semantics of the requirement and the QoS criteria. So the semantic discovery implemented as a part of this tool is effective and working.

 

 

 

Process Generation

The second functionality of the tool is process generation. This section explains testing carried our to check the functionality. The template describes various activities and their sequence in the process of arranging for trip to a conference. The template describes the process shown in the following figure:

 

Figure : Web Process that is described in the template

 

Two of the activities AirTicketTo and AirTicketReturn are specified as activities of type serviceImpl. There are two other activities ConferenceDetails and Hotel of types WSInterface and SemanticActivityTemplate respectively. After the discovery and service selection, data lfow has to be established among the activities.  Based on the template, WSDL details and the data flow specified during build time the process was generated successfully. The process is listed in the end of the appendix. It should be noted that the control flow of this template is different from the control flow specified in the template shown in figure **** and the process generation was successful. Hence the process generator is working well for different kind of control and data flow constructs.

 

 

Template Follows:

<?xml version="1.0" encoding="UTF-8"?>

<process-template name="sample process" HotelOnto="HotelOntologyTModel" FinanceOnto="FinanceOntologyTModel" GeneralTrade="GeneralTradeOntology">

   <sequence name="sequence-1">

      <receive name="receive" processWSDL-operation = "arrange4Conference"/>

            <invoke-activity name="ConferenceDetails" type="WSInterface"

               tModel-id="uuid:f5e283fd-0bf5-e283-b52d-b8acf6332a17"

               qos-spec="qos-1"

               ranking-weights="ranking-1"

               operation-name="getConferenceDetails"/>

             <flow name="flow-1">

                      <invoke-activity name="Hotel" type="SemanticTemplate"

                               semantic-spec="HotelServiceSemantics"

                               ranking-weights="ranking-2"

                               discovery-URL=

"http://westpoint.cs.uga.edu:8080/registry-server/RegistryServerServlet"/>   

                            <invoke-activity name="AirTicketTo" type="ServiceImpl"

                               wsdl-URL=

"http://lsdis.cs.uga.edu/proj/meteors/wsdls/TravelServiceNo1.wsdl"

                               operation-name="bookAirTicket"/>

                            <invoke-activity name="AirTicketReturn" type="ServiceImpl"

                               wsdl-URL=

"http://lsdis.cs.uga.edu/proj/meteors/wsdls/TravelServiceNo1.wsdl"

                               operation-name="bookAirTicket"/>               

            </flow>        

      <reply name="reply" processWSDL-operation = "arrange4Conference"/>     

   </sequence>

          <qos-spec name="qos-1">

            <delaytime unit="milliseconds" qualifier="LT">200</delaytime>

       </qos-spec>

       <ranking-weights name="ranking-2">

                <semantic-matching-weight>100</semantic-matching-weight>

                <input-semantics-weight>30</input-semantics-weight>

                <output-semantics-weight>20</output-semantics-weight>

                <operational-semantics-weight>30</operational-semantics-weight>

       </ranking-weights>

       <ranking-weights name="ranking-1">

                <qos-weight>100</qos-weight>

       </ranking-weights>

       <criteria>

             <semantic-spec name="HotelServiceSemantics">

                   <input name="anyInput1" onto-concept="HotelOnto:CheckInDate"/>

                   <input name="anyInput2" onto-concept="HotelOnto:CheckOutDate"/>

                   <input name="anyInput3" onto-concept="HotelOnto:GuestName"/>  

                   <input name="anyInput4" onto-concept="FinanceOnto:CrCardNo"/>             

                   <input name="anyInput5" onto-concept="FinanceOnto:CrCardType"/>

                   <input name="anyInput6" onto-concept="FinanceOnto:CrCardExpiryDate"/>

                   <output name="anyOutputName"

onto-concept="GeneralTrade:Confirmation"/>

                   <operation name="operationConcept"

operation-concept="HotelOnto:RoomBooking"/>

              </semantic-spec>

            </criteria>

</process-template>

Figure : Process Template used to generate the process

 

Process WSDL follows:

<?xml version="1.0" encoding="UTF-8"?>

<definitions

    name="ConferenceScenarioNo1"

    targetNamespace="http://lsdis.cs.uga.edu/ConferenceScenarioNo1.wsdl"

    xmlns="http://schemas.xmlsoap.org/wsdl/"

    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

    xmlns:tns="http://lsdis.cs.uga.edu/ConferenceScenarioNo1.wsdl"

    xmlns:slt="http://schemas.xmlsoap.org/ws/2002/07/service-link/"

    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <message name="arrange4ConferenceResponse">

        <part name="HotelConfirmation" type="xsd:string"/>

        <part name="ToTicketConfirmation" type="xsd:string"/>

        <part name="ReturnTicketConfirmation" type="xsd:string"/>

    </message>

    <message name="arrange4ConferenceRequest">

        <part name="AttendeeName" type="xsd:string"/>

        <part name="ConferenceId" type="xsd:int"/>

        <part name="CCNo" type="xsd:string"/>

        <part name="CCType" type="xsd:string"/>

        <part name="CCExpDate" type="xsd:string"/>

    </message>

    <portType name="ConferenceScenarioNo1PortType">

        <operation

            name="arrange4Conference">

            <documentation>Books hotel, travel tickets for a conference</documentation>

            <input message="tns:arrange4ConferenceRequest"/>

            <output message="tns:arrange4ConferenceResponse"/>

        </operation>

    </portType>

  <slt:serviceLinkType name="sampleConferenceArrangerSLT">

    <slt:role name="anyRole">

      <slt:portType name="tns:ConferenceScenarioNo1PortType"/>

    </slt:role>

  </slt:serviceLinkType> 

</definitions>

Figure : Process WSDL used to generate the process

 

 

Generated process is as follows:

<?xml version="1.0" encoding="UTF-8"?>

<process xmlns="http://schemas.xmlsoap.org/ws/2002/07/business-process/" xmlns:NS1="http://lsdis.cs.uga.edu/ConferenceScenarioNo1.wsdl" xmlns:NS2="http:/lsdis.cs.uga.edu/ConferenceServiceNo1.wsdl"

xmlns:NS3="http://lsdis.cs.uga.edu/HotelServiceNo1.wsdl"

xmlns:NS4="http://lsdis.cs.uga.edu/TravelServiceNo1.wsdl"

xmlns:tns-utils="http://lsdis.cs.uga.edu/sample-utils.wsdl">

 

  <partners>

  <partner name="caller" serviceLinkType="NS1:dummySLT"/>

  <partner name="service-provider-1" serviceLinkType="tns-utils:provider-1-SLT"/>

  <partner name="service-provider-2" serviceLinkType="tns-utils:provider-2-SLT"/>

  <partner name="service-provider-3" serviceLinkType="tns-utils:provider-3-SLT"/>

  </partners>

 

  <containers>

    <container messageType="NS1:arrange4ConferenceRequest" name="receive"/>

    <container messageType="NS2:getConferenceDetailsRequest"

name="ConferenceDetails-request"/>

<container messageType="NS2:getConferenceDetailsResponse"

name="ConferenceDetails-response"/>

    <container messageType="NS3:bookHotelRequest" name="Hotel-request"/>

    <container messageType="NS3:bookHotelResponse" name="Hotel-response"/>

    <container messageType="NS4:bookAirTicketRequest"

name="AirTicketTo-request"/>

    <container messageType="NS4:bookAirTicketResponse"

name="AirTicketTo-response"/>

    <container messageType="NS4:bookAirTicketRequest"

name="AirTicketReturn-request"/>

    <container messageType="NS4:bookAirTicketResponse"

name="AirTicketReturn-response"/>

    <container messageType="NS1:arrange4ConferenceRequest"

name="response"/>

  </containers>

 

  <sequence name="sequence-1">

    <receive container="receive" createInstance="yes" name="receive" operation="arrange4Conference" partner="caller" portType="NS1:ConferenceScenarioNo1PortType"/>

   

    <assign name="ConferenceDetails">

   

    <copy><from container="receive" part=" ConferenceId"/><to container="ConferenceDetails-request" part=" ConferenceId"/></copy><copy><from expression="'2003'"/><to container="ConferenceDetails-request" part=" Year"/></copy>

   

    </assign>

   

    <invoke inputContainer="ConferenceDetails-request" name="ConferenceDetails" operation="getConferenceDetails" outputContainer="ConferenceDetails-response" partner="service-provider-1" portType="NS2:ConferenceServiceNo1PortType"/>

   

    <flow name="flow-1">

   

      <assign name="Hotel">

     

      <copy><from container="receive" part=" CCNo"/><to container="Hotel-request" part=" CreditCardNo"/></copy><copy><from container="receive" part=" CCExpDate"/><to container="Hotel-request" part=" CreditCardExpDate"/></copy><copy><from container="receive" part=" CCType"/><to container="Hotel-request" part=" CreditCardType"/></copy><copy><from container="receive" part=" AttendeeName"/><to container="Hotel-request" part=" GuestName"/></copy><copy><from container="ConferenceDetails-response" part=" StartDate"/><to container="Hotel-request" part=" DateIn"/></copy><copy><from container="ConferenceDetails-response" part=" EndDate"/><to container="Hotel-request" part=" DateOut"/></copy>

     

      </assign>

     

      <invoke inputContainer="Hotel-request" name="Hotel" operation="bookHotel" outputContainer="Hotel-response" partner="service-provider-2" portType="NS3:HotelServiceNo1PortType"/>

     

      <assign name="AirTicketTo">

     

      <copy><from container="ConferenceDetails-response" part=" Location"/><to container="AirTicketTo-request" part=" To"/></copy><copy><from expression="'HOMELOCATION'"/><to container="AirTicketTo-request" part=" From"/></copy><copy><from container="ConferenceDetails-response" part=" StartDate"/><to container="AirTicketTo-request" part=" JourneyDate"/></copy><copy><from container="receive" part=" AttendeeName"/><to container="AirTicketTo-request" part=" PassengerName"/></copy>

     

      </assign>

     

      <invoke inputContainer="AirTicketTo-request" name="AirTicketTo" operation="bookAirTicket" outputContainer="AirTicketTo-response" partner="service-provider-3" portType="NS4:TravelServiceNo1PortType"/>

     

      <assign name="AirTicketReturn">

     

      <copy><from container="ConferenceDetails-response" part=" Location"/><to container="AirTicketReturn-request" part=" From"/></copy><copy><from expression="'HOMELOCATION2'"/><to container="AirTicketReturn-request" part=" To"/></copy><copy><from container="ConferenceDetails-response" part=" EndDate"/><to container="AirTicketReturn-request" part=" JourneyDate"/></copy><copy><from container="receive" part=" AttendeeName"/><to container="AirTicketReturn-request" part=" PassengerName"/></copy>

     

      </assign>

     

      <invoke inputContainer="AirTicketReturn-request" name="AirTicketReturn" operation="bookAirTicket" outputContainer="AirTicketReturn-response" partner="service-provider-3" portType="NS4:TravelServiceNo1PortType"/>

     

    </flow>

   

    <assign name="reply">

   

    <copy><from container="Hotel-response" part=" Confirmation"/><to container="response" part=" HotelConfirmation"/></copy><copy><from container="AirTicketTo-response" part=" Confirmation"/><to container="response" part=" ToTicketConfirmation"/></copy><copy><from container="AirTicketReturn-response" part=" Confirmation"/><to container="response" part=" ReturnTicketConfirmation"/></copy>

    </assign>

   

    <reply container="response" name="reply" operation="arrange4Conference" partner="caller" portType="NS1:ConferenceScenarioNo1PortType"/>

   

  </sequence>

 

</process>

Figure : Process Generated based on template