Cover page images (keys)

Foundations And Future Directions of Web Services & Architecture

Charlton Barreto <charlton_b@acm.org>
W3C Web Services Description & Web Services Choreography Working Groups

WWW2006, Edinburgh, Scotland, 25 May 2006

Outline

Example of the use of Web services

Web merchant

What Web services are trying to achieve

Lofty goals …

… translating to an architecture

… justifying some choices:

XML-based messages
for platform-independent machine processing
Framework focused on extensibility
facilitating interoperability
Machine-processable descriptions
facilitating integration
Loose coupling
maximizing scalability

Traditional Web interaction

Traditional Web interaction

Web services interaction

Web services interaction

Web services stack

Stack of W3C Web services technologies

Messages

  1. Messaging framework
  2. Description formats
  3. Looking to the future

Messaging framework for Web services

Built on top of Web technologies:

Messaging framework

SOAP Version 1.2

SOAP message

The SOAP envelope

SOAP message

SOAP message path

SOAP message path

Example of a SOAP message

<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
 <env:Header>
  <m:reservation xmlns:m="http://travelcompany.example.org/reservation" 
          env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
          env:mustUnderstand="true">
   <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference>
   <m:dateAndTime>2001-11-29T13:20:00.000-05:00</m:dateAndTime>
  </m:reservation>
 </env:Header>
 <env:Body>
  <p:itinerary
    xmlns:p="http://travelcompany.example.org/reservation/travel">
   …
  </p:itinerary>
 </env:Body>
</env:Envelope>

Message exchange patterns

Underlying protocols binding

SOAP 1.2 HTTP Binding

Simple addition service

public class MathService
{
    static int total=0;

    // Add an integer and return the total
    public int add(int a)
    {
        total += a;
        return total;
    }
    
    // Get the total of all the additions
    public int total()
    {
        return total;
    }
    
}

Deployed with Axis 1.3

Simple addition client

import org.apache.axis.client.Call;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.soap.SOAPConstants;
import javax.xml.rpc.ParameterMode;

public class AddClient
{
   public static void main(String [] args) throws Exception {

       if (args == null || args.length != 1) {
           System.err.println("Usage: AddClient <int>");
           return;
       }
       
       Call call = new Call("http://localhost:8080/axis/MathService.jws");
       call.setSOAPVersion(SOAPConstants.SOAP12_CONSTANTS);

       Integer i = new Integer(args[0]);

       call.setOperationName("add");
       call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);
       call.setReturnType(XMLType.XSD_INT);

       Integer ret = (Integer) call.invoke(new Object [] { i });
       
       System.out.println("Added " + i + ". Current total: " + ret);
   }
}

POST example: adding a value

charlton@muramasa ~/ws-setup% java AddClient 432
Added 432. Current total: 3468

produces the following HTTP request:

POST /axis/MathService.jws HTTP/1.0
Content-Type: application/soap+xml; charset=UTF-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.3
Host: 127.0.0.1:8080
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 363

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <add soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      <a xsi:type="xsd:int">432</a>
    </add>
  </soapenv:Body>
</soapenv:Envelope>

resulting in the following HTTP reply:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=16ADA5B3AB2CBE3BA1582201B4F8BC28; Path=/axis
Content-Type: application/soap+xml;charset=UTF-8
Date: Wed, 19 Oct 2005 14:34:48 GMT
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <addResponse soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      <ns1:result xmlns:ns1="http://www.w3.org/2003/05/soap-rpc">addReturn</ns1:result>
      <addReturn xsi:type="xsd:int">3468</addReturn>
    </addResponse>
  </soapenv:Body>
</soapenv:Envelope>

GET example: retrieving the total

GET /axis/MathService.jws?method=total HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050922 Firefox/1.0.7 (Debian package 1.0.7-1)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.8,fr;q=0.6,de;q=0.4,es;q=0.2
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: JSESSIONID=9B2EB217BEA1C3EB8DEE1FE1F5E283B9

returns:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/xml;charset=ISO-8859-1
Content-Length: 410
Date: Wed, 19 Oct 2005 14:40:30 GMT

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <totalResponse soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
      <totalReturn xsi:type="xsd:int">3468</totalReturn>
    </totalResponse>
  </soapenv:Body>
</soapenv:Envelope>

Note about message encoding

SOAP extensibility: SOAP modules

SOAP extensibility: SOAP features

mustUnderstand example: updated client

import org.apache.axis.client.Call;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.soap.SOAPConstants;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.axis.Constants;

public class AddClientMU
{
   public static void main(String [] args) throws Exception {
       
       if (args == null || args.length != 1) {
           System.err.println("Usage: AddClient <int>");
           return;
       }
       
       Call call = new Call("http://localhost:8080/axis/MathService.jws");
       call.setSOAPVersion(SOAPConstants.SOAP12_CONSTANTS);

       SOAPHeaderElement header = new SOAPHeaderElement("http://example.com/header",
                                                        "very-important-info", "blah");
       header.setMustUnderstand(true);
       header.setActor(Constants.URI_SOAP12_ULTIMATE_ROLE);


       call.addHeader(header);

       Integer i = new Integer(args[0]);

       call.setOperationName("add");
       call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);
       call.setReturnType(XMLType.XSD_INT);

       Integer ret = (Integer) call.invoke(new Object [] { i });
       
       System.out.println("Added " + i + ". Current total: " + ret);
   }
}

returns on error:

charlton@muramasa ~/ws-setup% java AddClientMU 2
Exception in thread "main" AxisFault
 faultCode: {http://www.w3.org/2003/05/soap-envelope}MustUnderstand
 faultSubcode:
 faultString: Did not understand "MustUnderstand" header(s):{http://example.com/he
ader}very-important-info
 faultActor:
 faultNode:
 faultDetail:
        {http://xml.apache.org/axis/}stackTrace:Did not understand "MustUnderstand" header(s):{http://example.com/header}very-important-info
        at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
        at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
        at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext
.java:1087)
[…]

Triggering a mustUnderstand fault

POST /axis/MathService.jws HTTP/1.0
Content-Type: application/soap+xml; charset=UTF-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.3
Host: 127.0.0.1:8080
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 616

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
   xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Header>
  <ns1:very-important-info
     soapenv:role="http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"
     soapenv:mustUnderstand="true"
     xsi:type="xsd:string"
     xmlns:ns1="http://example.com/header">
      blah
  </ns1:very-important-info>
 </soapenv:Header>
 <soapenv:Body>
  <add soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
   <a xsi:type="xsd:int">2</a>
  </add>
 </soapenv:Body>
</soapenv:Envelope>

mustUnderstand fault

HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
Content-Type: application/soap+xml;charset=UTF-8
Date: Fri, 04 Nov 2005 12:38:56 GMT
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
   xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Header>
  <soapenv:NotUnderstood qname="ns1:very-important-info"
   soapenv:role="http://schemas.xmlsoap.org/soap/actor/next"
   soapenv:mustUnderstand="false"
   xmlns:ns1="http://example.com/header"/>
 </soapenv:Header>
 <soapenv:Body>
  <soapenv:Fault>
   <soapenv:Code>
     <soapenv:Value>soapenv:MustUnderstand</soapenv:Value>
   </soapenv:Code>
   <soapenv:Reason>
    <soapenv:Text xml:lang="en">
      Did not understand &quot;MustUnderstand&quot; header(s):{http://example.com/header}very-important-info
    </soapenv:Text>
   </soapenv:Reason>
   <soapenv:Detail>
    <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">jibboom</ns2:hostname>
   </soapenv:Detail>
  </soapenv:Fault>
 </soapenv:Body>
</soapenv:Envelope>

SOAP 1.2 status

Addressing information: Web Services Addressing 1.0

Addressing from and to endpoints

Example of a EPR

<wsa:EndpointReference
     xmlns:wsa="http://www.w3.org/2005/04/addressing"
     xmlns:fabrikam="http://example.com/fabrikam"
     xmlns:wsdli="http://www.w3.org/2005/05/wsdl-instance"
     wsdli:wsdlLocation="http://example.com/fabrikam
       http://example.com/fabrikam/fabrikam.wsdl">
  <wsa:Address>
    http://example.com/fabrikam/acct
  </wsa:Address>
  <wsa:Metadata>
    <wsaw:InterfaceName>
      fabrikam:Inventory
    </wsaw:InterfaceName>
  </wsa:Metadata>
  <wsa:ReferenceParameters>
    <fabrikam:CustomerKey>
      412
    </fabrikam:CustomerKey>
  </wsa:ReferenceParameters>
</wsa:EndpointReference>

Message addressing properties

Example of using WS-Addressing

Web services Addressing example

Example request message

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"      
    xmlns:wsa="http://www.w3.org/2005/03/addressing">
  <soap:Header>
    <wsa:To>
      http://example.com/fabrikam/Purchasing
    </wsa:To>
    <wsa:Action>
      http://example.com/fabrikam/SubmitPO
    </wsa:Action>
    <wsa:MessageID>
      http://example.com/6B29FC40-CA47-1067
    </wsa:MessageID>
    <wsa:RelatesTo
        RelationshipType="http://www.w3.org/2005/03/addressing/reply">
      http://example.com/fabrikam/mid/1234
    </wsa:RelatesTo>
    <wsa:ReplyTo>
      <wsa:Address>
        mailto:client1@example.com
      </wsa:Address>
    </wsa:ReplyTo>
  </soap:Header>
  <soap:Body>
    …
  </soap:Body>
</soap:Envelope>

Example response message using wsa:Reply-To

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"      
    xmlns:wsa="http://www.w3.org/2005/03/addressing">
  <soap:Header>
    <wsa:To>
      mailto:client1@example.com
    </wsa:To>
    <wsa:Action>
      http://example.com/fabrikam/POAcceptance
    </wsa:Action>
    <wsa:From>
      <wsa:Address>
        http://example.com/fabrikam/Purchasing
      </wsa:Address>
    </wsa:From>
    <wsa:MessageID>
      mid:123@example.com
    </wsa:MessageID>
    <wsa:RelatesTo
        RelationshipType="http://www.w3.org/2005/03/addressing/reply">
      http://example.com/6B29FC40-CA47-1067
    </wsa:RelatesTo>
  </soap:Header>
  <soap:Body>
    …
  </soap:Body>
</soap:Envelope>

WS-Addressing 1.0 status

Handling non-XML data

Optimizing transmission

Transmission issue
Transmission can be optimized
Processing issue
Base64 representation is only a logical view

XOP & MTOM

SOAP message containing binary parts

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope' 
    xmlns:xmlmime='http://www.w3.org/2004/11/xmlmime'>
  <soap:Body>
    <m:data xmlns:m='http://example.org/stuff'>
      <!-- Two binary components: a photo and a signature -->
      <m:photo>/aWKKapGGyQ=</m:photo>
      <m:sig>Faa7vROi2VQ=</m:sig>
    </m:data>
  </soap:Body>
</soap:Envelope>

SOAP message packaged with MTOM

MTOM packaging

Optimized message

MIME-Version: 1.0
Content-Type: Multipart/Related;boundary=MIME_boundary;
    type="application/xop+xml";
    start="<mymessage.xml@example.org>";
    startinfo="application/soap+xml; action=\"ProcessData\""
Content-Description: SOAP message with my pic and sig in it

--MIME_boundary
Content-Type: application/xop+xml; 
    charset=UTF-8; 
    type="application/soap+xml; action=\"ProcessData\""
Content-Transfer-Encoding: 8bit
Content-ID: <mymessage.xml@example.org>

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
    xmlns:xmlmime='http://www.w3.org/2004/11/xmlmime'>
  <soap:Body>
    <m:data xmlns:m='http://example.org/stuff'>
      <!-- Two binary components: a photo and a signature -->
      <m:photo><xop:Include 
    xmlns:xop='http://www.w3.org/2004/08/xop/include' 
    href='cid:http://example.org/me.jpg'/></m:photo>
      <m:sig><xop:Include 
    xmlns:xop='http://www.w3.org/2004/08/xop/include' 
    href='cid:http://example.org/my.hsh'/></m:sig>
    </m:data>
  </soap:Body>
</soap:Envelope>

--MIME_boundary
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-ID: <http://example.org/me.jpg>

// binary octets for JPEG image

--MIME_boundary
Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: binary
Content-ID: <http://example.org/my.hsh>

// binary octets for signature

--MIME_boundary--

Resource representation SOAP header block

RRSHB example

<soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
    xmlns:rep='http://www.w3.org/2004/08/representation'
    xmlns:xmlmime='http://www.w3.org/2005/05/xmlmime'>
 <soap:Header>
  <rep:Representation resource='http://example.org/me.jpg'>
   <rep:Data
   xmlmime:contentType='image/jpeg'>/aWKKapGGyQ=</rep:Data>
  </rep:Representation>
 </soap:Header>
 <soap:Body>
  <x:MyData xmlns:x='http://example.org/mystuff'>
   <x:name>John Q. Public</x:name>
   <x:img src='http://example.org/me.jpg'/>
  </x:MyData>
 </soap:Body>
</soap:Envelope>

XOP/MTOM/RRSHB status

Doing something with this messaging framework

But:

Description

  1. Messaging framework
  2. Description formats
  3. Looking to the future

Describing Web services

What is WSDL 2.0?

Web service description (WSD)

WSD governing interaction between a requester agent and provider agent

WSDL 2.0 Structure

Description document:

<description targetNamespace="…">

Message formats (schema types):

  <types> … </types>

Abstract interface of the service:

  <interface>
    <operation> … </operation>*
  </interface>

Binding of these messages to a protocol:

  <binding> … </binding>

Location of the service:

  <service>
    <endpoint> … </endpoint>*
  </service>

</description>

New Features in WSDL 2.0

Inheritance

WSD A inherits from WSD B and WSD C

Extension Mechanisms

Example of open content model extensibility

Specifying that WS-Addressing 1.0 must be used:

<binding name="reservationSOAPBinding" 
    interface="tns:reservationInterface"
    type="http://www.w3.org/2005/08/wsdl/soap12"
    wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP">
  <wsaw:UsingAddressing wsdl:required="true" 
        xmlns:wsaw="http://www.w3.org/2005/03/addressing/wsdl"/>
  <operation ref="tns:opCheckAvailability"
      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response" />
  <fault ref="tns:invalidDataFault" wsoap:code="soap:Sender" />
</binding>

Message Exchange Patterns (MEPs)

MEP example: In-Out

<operation name="location" wsdlx:safe="true"
           pattern="http://www.w3.org/2004/08/wsdl/in-out">
  <input element="s:location"
    style="http://www.w3.org/2005/05/wsdl/style/uri-style"/>
  <output element="s:temperature"/>
</operation>

Marking Operations as Safe

<operation name="location" wsdlx:safe="true"
           pattern="http://www.w3.org/2005/05/wsdl/in-out">
  <input element="s:location"
    style="http://www.w3.org/2005/05/wsdl/style/uri-style"/>
  <output element="s:temperature"/>
</operation>

Bindings

SOAP 1.2 Binding

SOAP 1.2 Binding Example

<binding name="SoapBinding" interface="m:CompleteInterface"
  type="http://www.w3.org/2005/05/wsdl/soap"
  wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"/>
  <!-- Use of MTOM -->
  <wsoap:module
   uri="http://www.w3.org/2004/08/soap/features/http-optimization"/>
  <operation ref="m:location"/>
  <operation ref="m:set">
    <input messageLabel="In">
      <!-- Required use of a security extension -->
      <wsoap:module required="true"
      uri="http://accurateweather.example/mySecurityExtension"/>
    </input>
    <output messageLabel="Out"/>
  </operation>
</binding>

Axis example: http://localhost:8080/axis/MathService.jws?wsdl

Only WSDL 1.1 is supported by Axis 1.3:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
    targetNamespace="http://localhost:8080/axis/services/MathServiceDL"
    xmlns:apachesoap="http://xml.apache.org/xml-soap"
    xmlns:impl="http://localhost:8080/axis/services/MathServiceDL"
    xmlns:intf="http://localhost:8080/axis/services/MathServiceDL"
    xmlns:tns1="http://doclit"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.3
Built on Oct 05, 2005 (05:23:37 EDT)-->
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="http://doclit" xmlns="http://www.w3.org/2001/XMLSchema">
   <element name="add">
    <complexType>
     <sequence>
      <element name="in0" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
   <element name="addResponse">
    <complexType>
     <sequence>
      <element name="addReturn" type="xsd:int"/>
     </sequence>
    </complexType>
    </element>
   <element name="total">
    <complexType/>
   </element>
   <element name="totalResponse">
    <complexType>
     <sequence>
      <element name="totalReturn" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
  </schema>
 </wsdl:types>

   <wsdl:message name="totalResponse">
      <wsdl:part element="tns1:totalResponse" name="parameters"/>
   </wsdl:message>

   <wsdl:message name="totalRequest">
      <wsdl:part element="tns1:total" name="parameters"/>
   </wsdl:message>

   <wsdl:message name="addResponse">
      <wsdl:part element="tns1:addResponse" name="parameters"/>
   </wsdl:message>

   <wsdl:message name="addRequest">
      <wsdl:part element="tns1:add" name="parameters"/>
   </wsdl:message>

   <wsdl:portType name="MathServiceDL">

      <wsdl:operation name="add">
         <wsdl:input message="impl:addRequest" name="addRequest"/>
         <wsdl:output message="impl:addResponse" name="addResponse"/>
      </wsdl:operation>

      <wsdl:operation name="total">
         <wsdl:input message="impl:totalRequest" name="totalRequest"/>
         <wsdl:output message="impl:totalResponse" name="totalResponse"/>
      </wsdl:operation>
   </wsdl:portType>

   <wsdl:binding name="MathServiceDLSoapBinding" type="impl:MathServiceDL">

      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="add">
         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="addRequest">
            <wsdlsoap:body use="literal"/>
         </wsdl:input>
         <wsdl:output name="addResponse">
            <wsdlsoap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>

      <wsdl:operation name="total">
         <wsdlsoap:operation soapAction=""/>
         <wsdl:input name="totalRequest">
            <wsdlsoap:body use="literal"/>
         </wsdl:input>
         <wsdl:output name="totalResponse">
            <wsdlsoap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="MathServiceDLService">
      <wsdl:port binding="impl:MathServiceDLSoapBinding" name="MathServiceDL">
         <wsdlsoap:address location="http://localhost:8080/axis/services/MathServiceDL"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

Axis example in WSDL 2.0: heading

<?xml version="1.0" encoding="UTF-8"?>
<description
    targetNamespace="http://localhost:8080/axis/services/MathServiceDL" 
    xmlns:tns="http://localhost:8080/axis/services/MathServiceDL"
    xmlns:sns="http://doclit"
    xmlns="http://www.w3.org/2005/08/wsdl"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsoap="http://www.w3.org/2005/08/wsdl/soap"
    xmlns:whttp="http://www.w3.org/2005/08/wsdl/http"
    xmlns:wsdlx= "http://www.w3.org/2005/08/wsdl-extensions">

Axis example in WSDL 2.0: messages

   <types>
    <xsd:schema targetNamespace="http://doclit">

      <xsd:element name="total"/>

      <xsd:element name="totalResponse">
        <xsd:complexType>     
	  <xsd:sequence>      
	    <xsd:element name="totalReturn" type="xsd:int"/>
	  </xsd:sequence>
	</xsd:complexType>
      </xsd:element>

      <xsd:element name="add">
        <xsd:complexType>
	  <xsd:sequence> 
	    <xsd:element name="a" type="xsd:int"/>
	  </xsd:sequence>
	</xsd:complexType>
      </xsd:element>
            
      <xsd:element name="addResponse">
        <xsd:complexType>
	  <xsd:sequence>      
	    <xsd:element name="addReturn" type="xsd:int"/>
	  </xsd:sequence>
	</xsd:complexType>
      </xsd:element>
            
    </xsd:schema>    
   </types>

Axis example in WSDL 2.0: interface

   <interface name="MathService">

      <operation name="add" pattern="http://www.w3.org/2005/08/wsdl/in-out"
                       style="http://www.w3.org/2005/08/wsdl/rpc">
         <input element="sns:add"/>
         <output element="sns:addResponse"/>
      </operation>

      <operation name="total" pattern="http://www.w3.org/2005/08/wsdl/in-out"
                      wsdlx:safe="true">
         <input element="sns:total"/>
         <output element="sns:totalResponse"/>
      </operation>

   </interface>

Axis example in WSDL 2.0: SOAP binding

   <binding name="MathServiceSoapBinding"
            type="http://www.w3.org/2005/08/wsdl/soap"
            wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP">

     <operation ref="add" wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"/>

     <operation ref="total" whttp:location="?method=total"
                     wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response/"/>

   </binding>

Axis example in WSDL 2.0: service

   <service name="MathServiceService"
            interface="tns:MathService">

     <endpoint binding="tns:MathServiceSoapBinding" name="MathEndpoint"
              address="http://localhost:8080/axis/services/MathServiceDL"/>
   </service>

</description>

Generating a Web service client from a WSDL document

charlton@muramasa ~/ws-setup% java org.apache.axis.wsdl.WSDL2Java \
http://localhost:8080/axis/services/MathServiceDL\?WSDL

charlton@muramasa ~/ws-setup% ls localhost/axis/services/MathServiceDL
MathServiceDL.class         MathServiceDLServiceLocator.class
MathServiceDL.java          MathServiceDLServiceLocator.java
MathServiceDLService.class  MathServiceDLSoapBindingStub.class
MathServiceDLService.java   MathServiceDLSoapBindingStub.java

Generating a Web service client from a WSDL document (continued)

import localhost.axis.services.MathServiceDL.*;

public class WSDLMathClientDL {
    public static void main(String[] args) {
             Integer i = new Integer(args[0]);

             try {
               MathServiceDLService service = new MathServiceDLServiceLocator();
               MathServiceDL endpoint = service.getMathServiceDL();
               int ret = endpoint.add(i);

               System.out.println("Added " + i + ". Current total: " + ret);
             } catch (Exception e) {
               System.err.println("Exception caught: " + e);
             }
    }
}

HTTP Binding

Status of WSDL 2.0

Web Services Choreography Description Language 1.0

What is WS-Choreography?

What is WS-CDL?

WS-CDL is the Choreography Description Language

Where do WS-CDL, WSDL and SOAP fit into WS-*?

WS-CDL, WSDL + SOAP in WS-*

Motivations

IT FUD

Motivations

Order from Chaos

Using CDL

One would use CDL

Using CDL

Using CDL

How would one use CDL?

Using CDL

Using CDL

WS-CDL is a design language

CDL components

CDL components

CDL components

CDL components

CDL components

CDL components

CDL components

CDL structure

CDL structure

Example

Example - bubble and stick

Bubble & Stick

Example - bubble and stick

Bubble & Stick: Buyer/Seller

Example - bubble and stick

Bubble & Stick: Credit Check/Ship

Example - sequence diagrammes

Sequence Diagramme: Normal Collaboration

Example - sequence diagrammes

Sequence Diagramme: Bartering Collaboration

Example - sequence diagrammes

Sequence Diagramme: Credit Rejection Collaboration

Example - sequence diagrammes

Sequence Diagramme: Normal Collaboration

Example - WS-CDL

Example - some interactions

Some Interactions

Example - some interactions

Some Interactions

Interaction dependencies

To define a choreography of interactions, one must first

  1. define roleTypes
  2. define relationshipTypes
  3. define informationTypes
  4. define tokenTypes
  5. define channelTypes

Role types

Role Types

Relationship types

Relationship Types

Information types

Information Types

Token types

Token Types

Channel types

Channel Types

Channel types

Channel Types

Choreography dependencies

Then to complete defining a choreography, one must

  1. declare variables
  2. declare relationshipTypes

Choreography

Choreography

Interactions and ordering

Interactions and Ordering

Bartering process

Bartering Process

Bartering process

Bartering Process

Dependent workunits

Dependent WorkUnits

Dependent workunits

Dependent WorkUnits

Dependent workunits

Dependent WorkUnits

Workunits

WorkUnits

Workunits

WorkUnits

Comparison

Comparison

Approach

Approach

Choreography Approach

Example - tools

WS-CDL editor: Buyer-Seller

Buyer-Seller

WS-CDL editor: Simple RFQ

Simple Request For Quote

WS-CDL editor: Good test script

Good Test Script

WS-CDL editor: Bad test script

Bad Test Script

WS-CDL editor: Good simulation

Good Simulation

WS-CDL editor: Bad simulation

Bad Simulation

Status of WS Choreography

What's ahead of us

  1. Messaging framework
  2. Description formats
  3. Looking to the future

Looking into the future

Policies: constraints and capabilities

Semantics in Web service descriptions

Semantics: setting expectations

Internationalization

<env:Envelope>
 <env:Header>
  <i18n:international>
   <i18n:locale>en-US</i18n:locale>
   <i18n:preferences>
    <ldml:collation>
     <ldml:alias source="de_DE" type="phonebook"/>
    </ldml:collation>
   </i18n:preferences>
  </i18n:international>
  …
 </env:Header>
 <env:Body>
  …
 </env:Body>
</env:Envelope>

Privacy

    <operation
     name="OperationAddr" 
     pattern="http://www.w3.org/2003/11/wsdl/in-out"
     p3patt:p3p="http://example.com/p3p-pol1.xml">
      <input message="mytypes:addrUpdate"/>
      <output message="mytypes:updateResp"/>
    </operation>

Databinding

References