Choreography Definition Language Example


<package name="ConsumerRetailerChoreo" version="1.0"
  <informationType name="purchaseOrderType" type="pons:PurchaseOrderMsg"/>
  <informationType name="purchaseOrderAckType" type="pons:PurchaseOrderAckMsg"/>
  <token name="purchaseOrderID" informationType="tns:intType"/>
  <token name="retailerRef" informationType="tns:uriType"/>
  <tokenLocator tokenName="tns:purchaseOrderID"
                informationType="tns:purchaseOrderType" query="/PO/orderId"/>
  <tokenLocator tokenName="tns:purchaseOrderID"
                informationType="tns:purchaseOrderAckType" query="/PO/orderId"/>

  <role name="Consumer">
    <behavior name="consumerForRetailer" interface="cns:ConsumerRetailerPT"/>
    <behavior name="consumerForWarehouse" interface="cns:ConsumerWarehousePT"/>
  </role>
  <role name="Retailer">
    <behavior name="retailerForConsumer" interface="rns:RetailerConsumerPT"/>
  </role>

  <relationship name="ConsumerRetailerRelationship">
    <role type="tns:Consumer" behavior="consumerForRetailer"/>
    <role type="tns:Retailer" behavior="retailerForConsumer"/>
  </relationship>

  <channelType name="ConsumerChannel">
    <role type="tns:Consumer"/>
    <reference>
      <token type="tns:consumerRef"/>
    </reference>
    <identity>
      <token type="tns:purchaseOrderID"/>
    </identity>
  </channelType>

  <channelType name="RetailerChannel">
    <passing channel="ConsumerChannel" action="request" />
    <role type="tns:Retailer" behavior="retailerForConsumer"/>
    <reference>
      <token type="tns:retailerRef"/>
    </reference>
    <identity>
      <token type="tns:purchaseOrderID"/>
    </identity>
  </channelType>

  <choreography name="ConsumerRetailerChoreo" root="true">
    <relationship type="tns:ConsumerRetailerRelationship"/>
    <variableDefinitions>
    <variable name="purchaseOrder" informationType="tns:purchaseOrderType" 
              silent-action="true" />
    <variable name="purchaseOrderAck" informationType="tns:purchaseOrderAckType" />
    <variable name="retailer-channel" channelType="tns:RetailerChannel"/>

    <variable name="consumer-channel" channelType="tns:ConsumerChannel"/>
    <interaction channelVariable="tns:retailer-channel " 
                 operation="handlePurchaseOrder" align="true" 
                 initiateChoreography="true">
      <participate relationship="tns:ConsumerRetailerRelationship" 
                   fromRole="tns:Consumer" toRole="tns:Retailer"/>
      <exchange messageContentType="tns:purchaseOrderType" action="request">
        <use variable="cdl:getVariable(tns:purchaseOrder, tns:Consumer)"/>
        <populate variable="cdl:getVariable(tns:purchaseOrder, tns:Retailer)"/>
      </exchange>
      <exchange messageContentType="purchaseOrderAckType" action="respond">
        <use variable="cdl:getVariable(tns:purchaseOrderAck, tns:Retailer)"/>
        <populate variable="cdl:getVariable(tns:purchaseOrderAck, tns:Consumer)"/>
      </exchange>
      <record role="tns:Retailer" action="request">
        <source variable="cdl:getVariable(tns:purchaseOrder, PO/CustomerRef, 
                                             tns:Retailer)"/>
        <target variable="cdl:getVariable(tns:consumer-channel, tns:Retailer)"/>
      </record>
    </interaction>
  </choreography>
</package>