WSDL Peter Komisar © Conestoga College  v.1.1 / 2005
references: Web Services Description Language (WSDL) 1.1 W3C Note, http://www.w3.org/TR/wsdl, '
Web Service Description Language (WSDL) Version 2.0 Part 2: Message Exchange Patterns', 
http://www.w3.org/TR/2004/WD-wsdl20-patterns-20040326 ''First Look at WSDL 2.0', Canyang
Kevin Liu, SAP,
Building Web Services with Java,S.Graham et.al, Sam's Publishing,'Web Services
Description Language (WSDL) Version
2.0 Part 0: Primer, W3C Working Draft' 
'http://www.w3.org/TR/wsdl20-primer, Web Services Description Language (WSDL) Version 2.0
Part 1: Core Language, W3C Working Draft, http://www.w3.org/TR/wsdl20
'Apache Axis Installation
& User Guides'. http:www.apache.org  // would seem shorter if the w3 WSDL docs had shorter names!


Introduction


"As communications protocols and message formats are standardized in the web
community, it becomes increasingly possible and important to be able to describe
the communications in some structured way. WSDL addresses this need by defining
an XML grammar for describing network services as collections of communication
endpoints capable of exchanging messages."
        
"WSDL is an XML format for describing network services as a set of endpoints
operating on messages containing either document-oriented or procedure-oriented
information."                                                                  - W3C WSDL 1.1 Note


WSDL, an abbreviation of Web Services Description Language, specifies a set
of XML tags that can be used to describe web services in a standard format. 
WSDL is widely accepted and is supported by Microsoft, IBM, BEA and Sun.
Popular implementation of SOAP engines such as Apache's Axis support WSDL
as well as do commercial web servers such as IBM's Websphere, Microsoft's
IIS, Sun's iPlanet and BEA's WebLogic. Java supports


The Current State of WSDL Specification


WSDL is a standard which, as of early 2005 is in a state of flux. The WSDL 1.1
W3C note formed the basis for wide scale adoption of WSDL by most industrial
heavyweights. The W3C  has formed  W3C Working Group who are currently
working on a final drafts of WSDL version 2.0. The WSDL 2.0 primer working
draft was recently published in December 2004.
The draft will finally be proposed
as a W3C  recommendation.

The WSDL 2.0 documents have received some criticism. On first glance they are
not very inviting reads.  As an example of a reaction, you might enjoy looking at
O'Reilly XML author, Rich Salz's article <>'WSDL 2: Just Say No',
 

http://webservices.xml.com/pub/a/ws/2004/11/17/salz.html

The Working Group is sensitive to criticism (as is indicated by their response to
Salz's article) it can be assumed that the recommendations that follows will be
thoroughly worked over to make it as clear and user friendly as possible.

At this time, there is no WSDL 2.0 support in any implementations, but plenty
of WSDL 1.1 support so we have to put the emphasis on WSDL 1.1 while where
possible carrying forward a comparison with WSDL 2.0.


A WSDL 1.1 Summary

A WSDL document is essentially a service 'definition'.

"A WSDL document defines services as collections of network endpoints, or
ports . . messages  . .  are abstract descriptions of the data being exchanged,
and port types . . . are abstract collections of operations. The concrete protocol
and data format specifications for a particular port type constitutes a reusable
binding
. "
                                                                           -W3C WSDL 1.1 Note


The WSDL 2.0 View

A WSDL document is essentially a service 'description'.

A WSDL 2 describes services as a collection of endpoints (dropping the term
ports). Operations act on messages implicitly ( with message and parts elements
omitted.)  Interfaces rather than portTypes are abstract collections of operations.
The concrete protocol and data format for a particluar interface constitutes a
reusable binding.



WSDL Reference Sources


WSDL Reference Sources


The W3C WSDL 1.1 is located at the following URL.
                http://www.w3.org/TR/wsdl


WSDL Version 2 is a W3C working draft at this time ( 02-2005 ) described in three parts:  




WSDL Architecture


If you studied CORBA you would recall the trick that was used to achieve
cross platform portability was first defining services in IDL or Interface
Definition Language. IDL interfaces were essentially a collection of 'C'
function prototypes that described abstractly what would eventually be
translated and implemented in a programming language running natively
on a given platform. The 'magic' of CORBA was that it never lost sight
of the language neutral definitions that were defined in IDL. An ORB would
translate the function calls and return types in and out of the native
language all the while communicated with other ORBs in a neutral
dialect. This might enable a machine running Java on an Mac communicate
with an IBM PC perhaps running C++.

WSDL also defines such an abstraction, only instead of using IDL interfaces,
an equivalent form is defined in XML elements supplied by WSDL. The top
layer of the following diagram defines the interfaces of the service and is
abstract. The binding and service layer dictate concrete details of how and
where the service can be found. The actual implementation of the service
is left to the application operating at the endpoint of the service.

WSDL is similar to CORBA's neutral definition layer in that it supplies a
commonly defined 'neutral' carrier which only needs to execute natively
at the endpoints of the message exchange.


WSDL Architectural Layers  // Service is a set of portTypes or interfaces

   
  Interface    < interface >

// defines the abstract interface(s), operations, parameter and return types
               
    Binding      < binding >
  // dictates the protocol over which the message will be sent

   
   Service      < service >

   // The endpoint describes where the service will be found. The address
   // is dependent on the underlying protocol being used. i.e .in HTTP the
   // endpoint will be a URL while over SMTP it will be email address.



Changes made in WSDL 2.0

WSDL 2.0 seeks to clarify the language of WSDL 1.1, provide stronger support
of other W3C Recommendations such as the XML Information Set and to
features that are causing interoperability problems or are unnecessary. For
instance, support for operation overloading has been removed from WSDL 2.0.


Associated Technologies

Both WSDL versions and rely heavily on the XML Schema Definition Language,
now frequently referred to by the abbreviation XSD. While XSD is WSDL canonical
form, WSDL allows the use of other type definition languages ( via extensibility
mechanisms.)  WSDL 1.1 supports specific 'binding extensions' for SOAP 1.1,
HTTP GET/POST and MIME.  WSDL extends support to all HTTP methods and
uses MIME indirectly through a new attachements methodology called MTOM.
Following are namespaces, currently defined for use in WSDL 1.1 and WSDL 2.0.


Namespace URIs Used in WSDL 1.1 and Counterparts in WSDL 2.0

prefix WSDL 1.1 Namespace URI WSDL 2.0 Namespace URI
wsdl http://schemas.xmlsoap.org/wsdl/
WSDL 1.1 Document namespace

http://www.w3.org/2004/08/wsdl
WSDL 2..0 Document namespace
soap / wsoap
http://schemas.xmlsoap.org/wsdl/soap/
// WSDL 1.1 uses SOAP 1.1
http://www.w3.org/2004/08/wsdl/soap12
// WSDL 2.0 uses SOAP 1.2
http /
whttp
http://schemas.xmlsoap.org/wsdl/http/
// Namespace for WSDL HTTP GET & POST binding

http://www.w3.org/2004/08/wsdl/http
mime http://schemas.xmlsoap.org/wsdl/mime/
// WSDL 1.1 attachment support based on
  SOAP with Attachment
The WSDL 1.1 MIME binding is deprecated
 // WSDL 2.0 attachment support based on MTOM,
//  which is a SOAP 1.2-based solution provided by
// the W3C.

soapenc /
http://schemas.xmlsoap.org/soap/encoding/
 // SOAP 1.1 Encoding namespace

http://www.w3.org/2004/08/wsdl/soap12
// SOAP 1.2 Encoding namespace
soapenv /
http://schemas.xmlsoap.org/soap/envelope/
// SOAP 1.1 Envelope namespace


xsi http://www.w3.org/2000/10/XMLSchema-instance
// XML Schema Instance namespace
"http://www.w3.org/2001/XMLSchema-instance"
xsd http://www.w3.org/2000/10/XMLSchema
// XML Schema namespace
"http://www.w3.org/2001/XMLSchema"
tns (various) The “this namespace” (tns) prefix is used as a convention to refer to the current document. Additional WSDL 2.0 Types

 wsdli //   Schema for WSDL instance
 http://www.w3.org/2004/08/wsdl-instance
 wsdls // WSDL Simple Types namespace
 
http://www.w3.org/2004/08/wsdl-simple-types
 
wrpc // WSDL RPC style document schema
 
http://www.w3.org/2004/08/wsdl/rpc

// The XML Schema Namespaces for WSDL 1.1 are as were stated in the W3C WSDL 1.1 Note.


Name Changes


The WSDL 2.0 draft adopt some reasonable changes. WSDL is 'Web Services Description
Language' so it is logical that the languages supplies 'descriptions' rather than 'definitions'
thus the change in the root element. Also the term 'interface' is popularly understood to
mean a 'collection of abstract operations' so changing the <portType> element to the
<interface> element is reasonable. The WSDL 1.1 Note themselves describe endpoints
as 'ports' or 'endpoints' with 'endpoint' providing a clearer description. The <message>
elements are dropped in  WSDL  2.0 in favour of an 'inline' description that is contained
inside the <operation element.>

//  at least if your not a sailor or TCP/IP specialist.


Major Elements of WSDL 1.1  &  Counterparts in WSDL 2.0

WSDL 1.1
 WSDL 1.2
  Description
 definitions
 descriptions
 The WSDL root element 
 types
   // same  "a container for data type definitions using
  some type system (such as XSD) "
 message
  // dropped becomes
  // part of operation semantics
 " an abstract, typed definition of data being communicated
 operation
 // same
 "abstract description of an action supported by a service
 portType
 interface
 "an abstract set of operations supported by one or more endpoints"
 port
 endpoint
 " an single endpoint defined as a combination of a binding
  and a network address." 
 service
 // same  " a collection of related endpoints"
 binding
 // same
 " a concrete protocol and data format specification for a
   particular port type"
 import
 import
 " the import element is used to modularize a WSDL document


WSDL 1.1 Sample
 
In practice, WSDL comes down to specifying a service in the form of a WSDL
document. Following is an example in WSDL 1.1 from the WSDL 1.1 Note.
You'll notice the authors do not use SOAP 1.1 encoding for typing, instead
supplying their own "fixed XML format" to render element types ( i.e. type="string").


WSDL 1.1 Request/Response via HTTP Example // from the WSDL 1.1 Note

<?xml version="1.0"?>
<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<types>
<schema targetNamespace="http://example.com/stockquote.xsd"
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
</types>

<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>

<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>

<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>

<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>

<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>

</definitions>


WSDL Major Elements


Since it will be some time before WSDL 2.0 support is widespread we
will focus on describing WSDL 1.1 elements and note where WSDL 2.0
differs from WSDL 1.1.

The <definitions> Element

The 'definitions' element is the root element of a WSDL document. It holds
all other WSDL elements.
The element has a 'name' attribute that normally
corresponds to the name of the WebService. It has a 'targetNamespace'
attribute for the document. The definitions element will also contain a number
of related namespaces such as those for SOAP and WSDL. An XML schema
namespace may appear in the 'definitions' element or locally in the 'types'
element, (as observed in various examples).

The following set of namespaces from the Apache Axis WSDL example
shows an interesting variation where a URNs are used in a couple of
namespace declarations. Also note that SOAP 1.1 is being targeted
as is the 1.1 version of WSDL.

The following is a skeleton representation of a <definitions> element
with it's potential constituent parts.

A <definitions> element Skeleton Diagram

<definitions name="UsuallyNameOfWebService"
targetNamespace = "http://www.example.com/services/ServiceNamespace"
<!-- also normally includes SOAP, WSDL and optionally XML Schema namespaces>
>
<!-- All the following elements may appear zero or more times
except for the 'types' element which appears zero or one times >

<documentation/>
<import />
<types />
<message> 
<portTypes />
<binding />
<service />
<binding />
<service />

</definitions>



WSDL 2. Differences


The <definitions> element of WSDL1.1 is replaced by the <descriptions>
element and it's sub-elements in WSDL 2.0.


The <document> Element

WSDL uses the 'document' element to provide readable documentation
for human use. The document is a mixed type allows arbitrary text and
element mixing and is allowed inside any WSDL language element.


The <import> Element

The original authors of WSDL promoted 'modularity', supplying the 'import'
element to allow defining different aspects of an overall WSDL description
in separate documents. These documents could then be imported into larger
WSDL document. You can imagine this would be handy for a schema
document for instance. The 'import' element has the following form.
The folloiwng form as described in the W3C WSDL 1.1 Note shows that
the import element allows a namespace and a location to be specified
for a document via URIs.


The <import> element Form

<import namespace="uri" location="uri"/> *


WSDL 1.1 Note Example

<import namespace="http://example.com/stockquote/schemas"
location="http://example.com/stockquote/stockquote.xsd"/>


The <types> Element

The types element stores data type definitions used in messaging.
These commonly will be defined XML Schema Language. WSDL
endorses XSD but allows other typing systems to be used. The
types element acts as a container for a schema definitions that are
used inside messages.

A nice feature of WSDL is that it allows us to use schema definition
language directly in the WSDL document in it's native form. We can
drop our schema element that contains our type definitions directly
inside the <types> element. The following example is the <types>
element that is found in the Apache Axis WSDL address book
example. Though it is legal, it is not recommended you have more
than one root <schema> element contained in the <types> element.


Apache Axis WSDL <types> Element Example
  <!-- type defs -->

<types>
<xsd:schema targetNamespace="urn:AddressFetcher2"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">

<xsd:simpleType name="stateType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="TX"/>
<xsd:enumeration value="IN"/>
<xsd:enumeration value="OH"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="phone">
<xsd:all>
<xsd:element name="areaCode" type="xsd:int"/>
<xsd:element name="exchange" type="xsd:string"/>
<xsd:element name="number" type="xsd:string"/>
</xsd:all>
</xsd:complexType>

<xsd:complexType name="address">
<xsd:all>
<xsd:element name="streetNum" type="xsd:int"/>
<xsd:element name="streetName" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="typens:stateType"/>
<xsd:element name="zip" type="xsd:int"/>
<xsd:element name="phoneNumber" type="typens:phone"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</types>

The <message> Element

The message element acts as a container for 'parts' elements.
Each part element is typed, typically using XSD, (XML Schema
Definition Language) Each message has a 'name' attribute which
takes a unique identifier.

The messsage defines the part of the communication that is sent
over the 'wire'. This might be an input, output or a fault message.
If defined for 'message oriented' system, the message will be an
XML document. If the message is used in 'RPC style' communications,
an input message will represent input parameters. If there is a return
value, then an output message will represent the return types.

The W3C WSDL 1.1 Note shows the followng form of the message
element. The form shows that there may be any number of messages
each containing any number of part elements. Each part element
has a name and an optional 'element' and optional 'type' attribute.
Both of these attributes are used to indicate type. Only one or the
other of these attributes to indicate type.

W3C WSDL 1.1 Note 

// The message-typing attributes (which may vary depending
// on the type system used) are shown in bold. - WSDL 1.1 Note

<definitions .... >
   <message name="nmtoken"> *
       <part name="nmtoken" element="qname"? type="qname"?/> *
   </message>
</definitions>

// Either the 'element' atttribute or the 'type' attribute is used but not both

If the type is set to using the 'element' attribute, then this element type
will become the specifically named contents of the SOAP envelope. This
element will be defined globally in the document or inside the document's
schema definitions (whether inside the <types> element or by import).

If the type is set using the 'type' attribute, the message name may be
generic and is only required to have that type.


Apache Axis Example  of Four Messages

//The first two are used in combination to form a method that returns void

 <message name="empty"/>

  <message name="AddEntryRequest">
    <part name="name" type="xsd:string"/>
    <part name="address" type="typens:address"/>
  </message>

// The mext two messages are used in an RPC with a return value

  <message name="GetAddressFromNameRequest">
    <part name="name" type="xsd:string"/>
  </message>

  <message name="GetAddressFromNameResponse">
    <part name="address" type="typens:address"/>
  </message>

// The 'typens' abbreviates 'type namespace' and is
// associated with the target namespace of the
schema
// element inside the 'types' element



The <part> Sub-Element


The <part> subelements, you can see represent the parameters
or return types of the messages. The above examples shows
two 'part' elements that are typed to XML Schema built in
xsd:string types. Two other elements are complex types that
are defined in the <types> element of the associated
WSDL document.

// The 'typens' prefix is defined globally in the WSDL document
// and points to the document's target namespace. The
//'targetNamespace' attribute of the <schema> element that is
// nested inside the <types> element of the WSDL document
// also points to this same target namespace. */



WSDL 2.0 Differences

In WSDL 2.0 the <message> element and it's <parts> are omitted
and defined inside the context of Operation elements. The following
examples are excerpts from 'First Look at WSDL 2.0' by Canyang
Kevin Liu at SAP.

 

WSDL 1.1 Example of a <message> and  <portType> Elements
exerpt from 'First Look at WSDL 2.0' by Canyang Kevin Liu, from  SAP
 

<><message name="GetLastTradePriceInput">
      <part name="body" element="xsd1:TradePriceRequest"/>
 </message>

<message name="GetLastTradePriceOutput">
      <part name="body" element="xsd1:TradePrice"/>
</message>

<portType name="StockQuotePortType">
     <operation name="GetLastTradePrice">
         <input message="tns:GetLastTradePriceInput"/>
         <output message="tns:GetLastTradePriceOutput"/>
      </operation>
</portType>



Corresponding WSDL 2.0 Code Omits <message> and <part> Elements
excerpt from 'First Look at WSDL 2.0' by Canyang Kevin Liu, from  SAP


<><interface name="StockQuote">
  
<operation name="GetLastTradePrice"
          pattern="http://www.w3.org/2004/03/wsdl/in-out">
                <input messageLable = “In
                      element="xsd1:TradePriceRequest"/>
                 <output messageLable = “Out
                      element="xsd1:TradePrice"/>
     </operation>
</interface>



The <portType> Element

The <portType> element(s) provides the key description of what a service
does, as each portType element defines the set of operations that a web
service supplies.

The <portType> element is used to house a set of operation definitions. It is
similar to a Java interface.
The following example from the W3C WSDL Note
shows that a 'portType' element that might house zero or more <operation>
elements however one portType element is typical and represent a good
form in that there is one WSDL document per portType. 
 
The portType and operation names will all need to be unique  with respect
to their containing scopes.



W3C Form of the <portType> Element


<wsdl:definitions .... >
<wsdl:portType name="nmtoken">
<wsdl:operation name="nmtoken" .... /> *
</wsdl:portType>
</wsdl:definitions>

WSDL 2.0 Differences

The <portType> element is replaced by the <interface> in WSDL 2.0.


The <operation> Element

Operations define methods or functions in terms of XML Elements. The
<operation> element holds <input> and <output> elements which in turn
reference <message> elements that supply details relating to input
parameters and return values.


Apache Axis WSDL Example


  <operation name="addEntry">
      <input message="tns:AddEntryRequest"/>
      <output message="tns:empty"/>
    </operation>



WSDL defines four types of operations which are termed 'transmission
primitives'which we look at when we finish surveying the WSDL element
set.

The <binding> Element

The <binding> element carries information that describes message formats
and details regarding the protocol over which the messages are sent. The
'type' attribute is used to associate the binding being defined to a specific
'portType' element. There may be more than one binding specified per
portType, however each binding element is used to describe only one protocol.

Following is the W3C description of the grammar used for the binding element.

W3C Grammar for the <binding>  Element
<wsdl:definitions .... >
<wsdl:binding name="nmtoken" type="qname"> *
<-- extensibility element (1) --> *
<wsdl:operation name="nmtoken"> *
<-- extensibility element (2) --> *
<wsdl:input name="nmtoken"? > ?
<-- extensibility element (3) -->
</wsdl:input>
<wsdl:output name="nmtoken"? > ?
<-- extensibility element (4) --> *
</wsdl:output>
<wsdl:fault name="nmtoken"> *
<-- extensibility element (5) --> *
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions>

You'll notice what seems to be a little redundancy as the binding element
maps information to each of the operations and their parts. The 'binding'
element supplies protocol-specific information for each of the elements
of a 'portType'
definition.

There is one other element that is added to the binding element that is specific
to SOAP. In the case of SOAP it is the <soap:binding> element. The style
attribute can hold either the value "rpc" or "document to describe the messaging
format. In the following example, "rpc", and the transport protocol, in the following
example it is HTTP.


First Few Lines of the <binding> Element in the Apache Axis WSDL Example


<binding name="AddressBookSOAPBinding" type="tns:AddressBook">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>


The 'style' attribute is important as it decides what format the SOAP messaging
will take. If the 'style' is 'document' type then the message goes 'as is' in the
SOAP envelope. If the "rpc" value is specified then messages are nested in
the context of operation elements.
Following is the <binding> element from the W3C WSDL 1.1 Note. It describes
a document style SOAP communication over HTTP. The input and output in
this example uses a 'literal' form of communication. The "literal" value is
generally used with the 'document; form as there is no conversion of types
between Java and XML


The <binding> element from the W3C WSDL 1.1 Note

  <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>

Following is the <binding> element from the Apache Axis WSDL Example
abridged to a single operation. It shows it is an RPC type of communication
over SOAP over HTTP. Each of the input and output messages will use
SOAP encoding.


An Example of an Abridged <binding> element from the Apache Axis WSDL

 <binding name="AddressBookSOAPBinding" type="tns:AddressBook">
    <soap:binding style="rpc"
                  transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="addEntry">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="encoded"
                   namespace="urn:AddressFetcher2"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded"
                   namespace="urn:AddressFetcher2"
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
   <!-- abridged leaves out a second method description -->

  </binding>


// The SOAP Action Header is a mandatory field for SOAP requests that
// are sent via HTTP.  One source states that it's corresponding 'soapAction'
// attribute should at
least be assigned an empty string, "". We see samples
//
from the W3C WSDL 1.1 Note where these attribute are left out.


The <service> Element

A service encapsulates a group of zero or more related ports. Ports
defined in a service are restricted from inter-communicating. Ports
may be supplied that are the same port type but use different bindings
or addresses. In this case these ports are considered alternatives,
supplying the same service over different transport protocols and
message formats.


W3C Grammar for the <service> Element

<wsdl:definitions .... >
<wsdl:service name="nmtoken"> *
<wsdl:port .... />*
</wsdl:service>
</wsdl:definitions>



The <port> Element

The port element is used supply an address for a web service. It does
this by defining an endpoint. For a given binding, a single address is
specified.
Following is the W3C description of the grammar used for
the 'port' element.

W3C Grammar for the <port> Element

<wsdl:definitions .... >
<wsdl:service .... > *
<wsdl:port name="nmtoken" binding="qname"> *
<-- extensibility element (1) -->
</wsdl:port>
</wsdl:service>
</wsdl:definitions>


W3C Example for Service & Port Element

  <service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>

// the binding attribute references the WSDL documents <binding> element


WSDL Messaging Formats


WSDL Transmission Primitives

WSDL defines four types of operations which are termed 'transmission
primitives' that parallel the messaging formats that are described in
SOAP.
They are 'one-way', 'request-response', 'solicit-response' and
'notification'. The WSDL 1.1 note only defines the first two bindings.
The latter two are described but not implemented.


WSDL Transmission Primitives

Operation Naming Convention

The 'name' attribute may be used to supply <input> and <output> elements
with identifiers. WSDL supplies a default behaviour for naming operations.

'One-way' Operation

In a 'One-way' operation the 'input' element adopts the name of the operation.


Request-Response'
&  'Solicit-Response' operations

The  input and output elements are named after the operation followed by
the appropriate suffix appended, either 'Request', 'Solicit' or 'Response'.


Apache Axis WSDL Example
of a Request-Response Naming Pattern

<operation name="getAddressFromName">
      <input message="tns:GetAddressFromNameRequest"/>
      <output message="tns:GetAddressFromNameResponse"/>
    </operation>



Operation Forms For Each Type of Transmission Primitive
// called MEPs or Message Exchange Patterns in later specifications

Following are the W3C Examples for each sort of operation.


One-way Operation

The one-way operation is characterized by a single input element.

W3C 'One-way' Operation Grammar

<wsdl:definitions .... > <wsdl:portType .... > *
<wsdl:operation name="nmtoken">
<wsdl:input name="nmtoken"? message="qname"/>
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>

The input element specifies the abstract message format for the one-way operation.

Request-response Operation

The request-response operation adds an output element and a fault element to report
if an error occurs in attempting to generate a response.

W3C 'Request-response' Operation Grammar

<wsdl:definitions .... >
<wsdl:portType .... > *
<wsdl:operation name="nmtoken" parameterOrder="nmtokens">
<wsdl:input name="nmtoken"? message="qname"/>
<wsdl:output name="nmtoken"? message="qname"/>
<wsdl:fault name="nmtoken" message="qname"/>*
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>


Solicit-Response Operation

The grammar for a solicit-response operation is:

W3C 'Solicit-response' Operation Grammar

The solicit-response operation is like the request response operation except
that the input and output order are reversed. Recall that this format would
issue from an endpoint to a subscriber or client.


W3C 'Solicit-Response' Operation Grammar


<wsdl:definitions .... >
<wsdl:portType .... > *
<wsdl:operation name="nmtoken" parameterOrder="nmtokens">
<wsdl:output name="nmtoken"? message="qname"/>
<wsdl:input name="nmtoken"? message="qname"/>
<wsdl:fault name="nmtoken" message="qname"/>*
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>


Notification Operation

The grammar of the notification operation mirrors the one-way operation similar in that
it has a single but opposite 'output' element nested.

W3C 'Notification' Operation Grammar

<wsdl:definitions .... >
<wsdl:portType .... > *
<wsdl:operation name="nmtoken">
<wsdl:output name="nmtoken"? message="qname"/>
</wsdl:operation>
</wsdl:portType >
</wsdl:definitions>


Parameter Order

The 'parameterOrder' attribute is supplied allowing an operation to describe
parameter names in a space-separated list where the order is the same as
the parameters in the RPC signature. The return value cannot be part of this
list.
(The paramaterOrder attribute is NMTOKENS type, plural of NMTOKEN
type.  (NMTOKEN  is the XML name token type and can be part of any legal
XML name.)

// If a part name appears in only the input message, it is an 'in' parameter.
// If a part name appears in only the output message, it is an 'out' parameter
// A part name that appears in both the input and output message, it is named an 'in/out' parameter



WSDL 2.0 Defines 8 Message Patterns
// WSDL Version 2.0 Part 2: Message Exchange Patterns

// http://www.w3.org/TR/2004/WD-wsdl20-patterns-20040326 

WSDL 2.0 Describes the Following Messaga Exchange Patterns (MEPs) 
Grouped as 'in' or 'out' types.
  • In-Only // one message, no fault 
  • Robust In-Only // one message, triggers fault
  • In-Out // two messages, 'in' and 'out' fault replaces message
  • In-Optional-Out // one message 'in', optional 'out', message triggers fault
 // out types mirror the 'in' patterns
  • Out-Only // one message, no fault 
  • Robust Out-Only // one message, triggers fault
  • Out-In // two messages, 'out' and 'in'', fault replaces message
  • Out-Optional-In // one message 'out', optional 'in', message triggers fault



Authoring and Portability


WSDL Use of the 'import' Element

The <import> element allows service descriptions to be contained
in separate documents that can then be imported as needed. This
makes reuse of WSDL descriptions easy and also allows the WSDL
documents to be more readable.

The W3C WSDL note supplies an example based on it's first example
to show how the data type definitions, the abstract definitions and the
specific bindings can be separated into separate documents.

WSDL 1.1 Note Schema Definition Example

// has the URL, http://example.com/stockquote/stockquote.xsd

<?xml version="1.0"?>
<schema targetNamespace="http://example.com/stockquote/schemas"
xmlns="http://www.w3.org/2000/10/XMLSchema">

<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>

The above schema is imported into the following WSDL document
that focuses on defining the abstract aspects of a WSDL definition,
the description of the interface (portType), operations and messages.

WSDL 1.1 Note Defining the Abstract Aspects of the Service

// http://example.com/stockquote/stockquote.wsdl

<?xml version="1.0"?>
<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote/definitions"
xmlns:tns="http://example.com/stockquote/definitions"
xmlns:xsd1="http://example.com/stockquote/schemas"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<import namespace="http://example.com/stockquote/schemas"
location="http://example.com/stockquote/stockquote.xsd"/>


<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>

<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>

<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
</definitions>


Finally, the Interface WSDL document is imported into a WSDL
document that supplies the concrete implementation details, in
the <binding> and <service> elements.


W3C WSDL 1.1 Note Example Importing PortType into a WSDL
Document Defining The Bindings and Service

// http://example.com/stockquote/stockquoteservice.wsdl

<?xml version="1.0"?>
<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote/service"
xmlns:tns="http://example.com/stockquote/service"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:defs="http://example.com/stockquote/definitions"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<import namespace="http://example.com/stockquote/definitions"
location="http://example.com/stockquote/stockquote.wsdl"/>


<binding name="StockQuoteSoapBinding" type="defs:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>

<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>


WSDL SOAP Bindings Examples


The following points are quoted from the W3C WSDL note primarily to
show the parts of the WSDL document that are involved in binding the
message to the underlying protocol. The examples are easy to view
as the pertinent sections are highlighted.

The first example shows a document style communication over SMTP.
You can see the style is assigned the "document" value and the use
attributes are assigned "literal" values. In this case the 'transport'
attribute is assigned the URL representing SMTP, "

Example   transport="http://example.com/smtp"

Also you will notice the address in the <port> element is an e-mail address.

// In the document form 'soapAction' has not been assigned.

W3C Example  SOAP binding of one-way operation over SMTP using a SOAP Header
// from the W3C WSDL note

<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<message name="SubscribeToQuotes">
<part name="body" element="xsd1:SubscribeToQuotes"/>
<!-- an example of a Header Definition -->
<part name="subscribeheader" element="xsd1:SubscriptionHeader"/>
</message>

<portType name="StockQuotePortType">
<operation name="SubscribeToQuotes">
<input message="tns:SubscribeToQuotes"/>
</operation>
</portType>

<binding name="StockQuoteSoap" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://example.com/smtp"/>
<operation name="SubscribeToQuotes">
<input message="tns:SubscribeToQuotes">
<soap:body parts="body" use="literal"/>
<soap:header message="tns:SubscribeToQuotes" part="subscribeheader" use="literal"/>

</input>
</operation>
</binding>

<service name="StockQuoteService">
<port name="StockQuotePort" binding="tns:StockQuoteSoap">
<soap:address location="mailto:subscribe@example.com"/>
</port>
</service>

<types>
<schema targetNamespace="http://example.com/stockquote.xsd"
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="SubscribeToQuotes">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="SubscriptionHeader" type="uriReference"/>
</schema>
</types>
</definitions>

The second example from the WSDL note shows a request-response RPC type operation
that communicates over HTTP.  The following line communicates that the messaging will
be an RPC type over HTTP.  Noticing the bolded script, the style is "rpc" and the transport
is designated with the SOAP URL for HTTP. The 'use' attributes of the <soap:body>
elements have been assigned the "encoded" value. The port address is an HTT P URL.

// The 'soapAction' attribute has been assigned a URL representing the operation call.


Example 4. SOAP binding of request-response RPC operation over HTTP
<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<message name="GetTradePriceInput">
<part name="tickerSymbol" element="xsd:string"/>
<part name="time" element="xsd:timeInstant"/>
</message>

<message name="GetTradePriceOutput">
<part name="result" type="xsd:float"/>
</message>

<portType name="StockQuotePortType">
<operation name="GetTradePrice">
<input message="tns:GetTradePriceInput"/>
<output message="tns:GetTradePriceOutput"/>
</operation>
</portType>

<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetTradePrice">
<soap:operation soapAction="http://example.com/GetTradePrice"/>
<input>
<soap:body use="encoded" namespace="http://example.com/stockquote"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="http://example.com/stockquote"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>>
</binding>

<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>


Apache WSDL Support 
// the following and related material is practical and not covered on the final




If you return to the Apache Axis User Guide, and continue from page 15
you will see how Axis supplies practical support for WSDL. Axis supports
WSDL by supplying 'discovery' support and WSDL tools.

Web Browser Service Discovery

A user may access a service URL with a web browser by appending "?WSDL"
to the end of the URL. A WSDL document is automatically generated to describe
the service.

Tool Support  // WSDL2Java

Axis supplies the WSDL2Java tool which build Java interfaces, implementation
classes, accessory classes and stubs and skeletons that correspond to a
WSDL document description. This set of classes can then be implemented
and deployed to create a service corresponding to the WSDL description.
Following is an example of how this utility is used.


Invocation of Apache WSDL2Java Tool at the Command Line
 
java org.apache.axis.wsdl.WSDLJava (WSDL-file-URL)

Example  java org.apache.axis.wsdl.WSDLJava  
               file:///home/peter/axis-1_2RC2/samples/addr/AddressBook.wsdl

// Java2WSDL

Axis also supplies the reverse tool, Java2WSDL which facilitates the creation
of a WSDL document from a supplied Java interface. The WSDL file generated
can then be passed into WSDL2Java to generate the Java classes needed to
deploy the service on Apache Axis.

Following is the example supplied in the Apache Axis User Guide showing how
this utility is invoked.

Apache Axis Java2WSDL Example
% java org.apache.axis.wsdl.Java2WSDL -o wp.wsdl  
-l"http://localhost:8080/axis/services/WidgetPrice" -n "urn:Example6"
-p"samples.userguide.example6" "urn:Example6" samples.userguide.example6.WidgetPrice

Where:


An Example Showing the Use of the Apache Axis WSDL Utilities

Consider the following simple Java interface whose service might be described
as getting and setting a clubhouse password.

Java Interface Example


package clubhouse;

public interface Password{
public void setPassword(String string);
public String getPassword( );
  }

Compile the above interface. Create a clubhouse directory and move the
compiled interface class into this directory. This interface class can become
the argument to the Java2WSDL tool.


Example of Command Line Invocation of Java2WSDL

[peter@localhost java]$ java org.apache.axis.wsdl.Java2WSDL -o password.wsdl
-l"http://localhost:8080/axis/services/Password" -n  "urn:Example" -p"clubhouse"
"urn:Example"  clubhouse.Password

// notice no space between the flag character and the quotation marks where applicabl

With a little luck, the following, Password.wsdl file appears in the current directory.
// white space edited for presentation

WSDL Generated By Apache Axis Utility

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:Example"
xmlns:impl="urn:Example" xmlns:intf="urn:Example"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

<!--WSDL created by Apache Axis version: 1.2RC2
Built on Nov 16, 2004 (12:19:44 EST)-->

   <wsdl:message name="getPasswordRequest">
   </wsdl:message>
   <wsdl:message name="getPasswordResponse">
       <wsdl:part name="getPasswordReturn" type="xsd:string"/>
   </wsdl:message>
   <wsdl:message name="setPasswordResponse">
   </wsdl:message>
   <wsdl:message name="setPasswordRequest">
      <wsdl:part name="in0" type="xsd:string"/>
   </wsdl:message>

   <wsdl:portType name="Password">
      <wsdl:operation name="setPassword" parameterOrder="in0">
         <wsdl:input name="setPasswordRequest" message="impl:setPasswordRequest"/>
         <wsdl:output name="setPasswordResponse" message="impl:setPasswordResponse"/>
      </wsdl:operation>
      <wsdl:operation name="getPassword">
         <wsdl:input name="getPasswordRequest" message="impl:getPasswordRequest"/>
         <wsdl:output name="getPasswordResponse" message="impl:getPasswordResponse"/>
      </wsdl:operation>
   </wsdl:portType>

   <wsdl:binding name="PasswordSoapBinding" type="impl:Password">
      <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="setPassword">
         <wsdlsoap:operation soapAction=""/>
         <wsdl:input name="setPasswordRequest">
            <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Example"/>
         </wsdl:input>
         <wsdl:output name="setPasswordResponse">
            <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Example"/>
         </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="getPassword">
         <wsdlsoap:operation soapAction=""/>
         <wsdl:input name="getPasswordRequest">
            <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Example"/>
         </wsdl:input>
         <wsdl:output name="getPasswordResponse">
            <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Example"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>

   <wsdl:service name="PasswordService">
      <wsdl:port name="Password" binding="impl:PasswordSoapBinding">
         <wsdlsoap:address location="http://localhost:8080/axis/services/Password"/>
      </wsdl:port>
   </wsdl:service>

</wsdl:definitions>


This WSDL file can then be processed by the WSDL2Java tool.

Example

java org.apache.axis.wsdl.WSDL2Java /home/peter/java/password.wsdl


The Example Directory


This generates the the Example directory with the following Java Source
files listed. The "--skeletonDeploy true" option needs to be deployed to
create a skeleton class.

the "--skeletonDeploy true" option, a skeleton


Directory and classes Created Without the -skeletonDeploy flag Turned On

[peter@localhost Example]$ ls
Password.java         PasswordServiceLocator.java
PasswordService.java  PasswordSoapBindingStub.java


The Java Interface Corresponding To PortType

Following is the Password.java class 're-invented' as an RMI inteface
This is a Java class that represents the <portType> element.


The Inteface Reinvented as a RMI Interface

/**
 * Password.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis 1.2RC2 Nov 16, 2004 (12:19:44 EST) WSDL2Java emitter.
 */

package Example;

public interface Password extends java.rmi.Remote {
    public void setPassword(java.lang.String in0) throws java.rmi.RemoteException;
    public java.lang.String getPassword() throws java.rmi.RemoteException;
}


The Java Service Interface

The PasswordService.java class is an interface dedicated to representing
the service that is defined. It is couched in terms of the Java RPC API.
This class represents the <service> element.


JAX-RPC Form of the Interface


 /**
 * PasswordService.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis 1.2RC2 Nov 16, 2004 (12:19:44 EST) WSDL2Java emitter.
 */

package Example;

public interface PasswordService extends javax.xml.rpc.Service {
    public java.lang.String getPasswordAddress();

    public Example.Password getPassword() throws javax.xml.rpc.ServiceException;

    public Example.Password getPassword(java.net.URL portAddress) throws javax.xml.rpc.ServiceException;
}


The SOAP Binding Stub

The PasswordSoapBindingStub.java does the heavy lifting and is
quite complex. It communicates with Service and Call objects which
are involved with sending the messaging over the wire.  ( This class
is too big and would 'sink' the note at this point. You can look at
your own version in the exercise.

The ServiceLocator Class

 "The service interface defines a get method for each port listed in the
service element of the WSDL. The locator is the implementation of this
service interface. It implements these get methods. " -Apache Axis User Guide

The methods of the Service Locator would be overridden to supply the
serivce.


Other classes such as the Skeleton, and Holder classes were not
generated as special 'out' or 'in/out' methods were not used.



Exercise 

// note if you are having trouble getting Axis going reports
// of what trouble you have will suffice for the previous
// assignment. See end of note for a tip on Axis installation
// Axis should be available in the lab this week to do the
// basic parts of the following assignment



1) a) Using any of the examples provided as guides, create a
    WSDL file for a service that will supply methods to return
    a GST, a PST value a total with tax value for any value
    passed into it. The XML schema decimal type could be
    used to represent the dollar and cents amounts.

// GST & PST are Federal & Provincial taxes of 8% and 7%.
 
   b)  Run the WSDL2Java  translator supplied with Apache
   Axis on the file in order to create the Java classes that
   would be used to deploy this service.

   c) Briefly itemize the Java files that were created and
       in a table correlate the classes to the different parts
       of the WSDL file.

   c) Optional Investigation: You may wish to proceed
     to an implementation of the service on Axis. It might
     be worth waiting until next week when we study
     JAX-RPC which will give us a better understanding
     of how Axis works.
   


AND / OR    // PS You could use the Java2WSDL tool to assist you in #1
  

2 ) a) Create a Java Inteface that defines two methods.
    It can be something as simple as divide and multiply.
    Remember the interface will define two abstract
    methods.
  
    b) Run it through the Apache Axis Java2WSDL command
    supplying appropriate parameters.

    c) Run the WSDL2Java command on the generated
    WSDL file to create the collection of Java classes
    needed to create a service.

 
c) Optional Investigation //  as above



Note on associating JSWSDP with Tomcat After Installation 


The Java Development Kit link to get version 5.

http://java.sun.com/j2se/1.5.0/download.jsp

Install as usual.


2 ) Install Apache Tomcat as usual.
http://jakarta.apache.org/site/binindex.cgi#Release%20Builds


3) The JWSDP package expands in typical Sun fashion. You will encounter
that there are two ways of installing the java web services package. This
will come at you as the JWSDP wizard proceeds.

If you have Apache Tomcat already installed, the Java Web Services
package wizard can be directed to automatically use it as it's web server.
On my home machine, I had trouble getting the wizard to accept the location
I had for Tomcat so I elected to make the connection between Tomcat and
Java Web Services after the fact using the script described below.
Following
is the JWSDP download.

*To Test:* Before you install the JWSDP, and you open on Tomcat at
http://localhost:8080 you will see the regular Tomcat Welcome page.
After installing the JWSDP. (either connecting JWSDP to Tomcat
at running the wizard or after using the script) you will see a different
Welcome page when opening on localhost:8080. This tells you the
install is successful and Apache Tomcat is ready to run the web
services stuff.


Java Web Services Developer Pack 1.5 Download

http://java.sun.com/webservices/downloads/webservicespack.html



*Joining Java Web Services to Tomcat After Installation Using the Script*

To join the Web Services stuff to Tomcat after you have JWSDP installed
you need to run a Web Services Script.

After the JWSDP is expanded, you will find a 'jwsdpontomcat' script
under the following directories.

jwsdp-1.5 \ jwsdp-shared \ bin \ jwsdpontomcat.bat / // windows/

jwsdp-1.5 / jwsdp-shared / bin / jwsdpontomcat.sh /// solaris/ linux /

Run and if things go well it ends saying BUILD SUCCESSFUL.
.