+49 228 5552576-0


info@predic8.com

Create WSDL Java API

The following listing shows how to create a WSDL document with Java and the Membrane SOA Model.

package sample.wsdl;

import java.io.StringWriter;
import groovy.xml.MarkupBuilder;

import com.predic8.wsdl.*;
import com.predic8.wsdl.creator.*;
import com.predic8.schema.*;
import static com.predic8.schema.Schema.*;

public class GenerateWSDL {

  public static void main(String[] args) {
    dumpWSDL(createWSDL());
  }

  private static Definitions createWSDL() {
    Schema schema = new Schema("http://predic8.com/add/1/");
    
    schema.newElement("add").newComplexType().newSequence().newElement("summand", INT).setMaxOccurs("unbounded");
    schema.newElement("addResponse").newComplexType().newSequence().newElement("number", INT);
    
    Definitions wsdl = new Definitions("http://predic8.com/wsdl/AddService/1/", "AddService");
    wsdl.add(schema);
    
    PortType pt = wsdl.newPortType("AddPortType");
    Operation op = pt.newOperation("add");
    
    op.newInput("add").newMessage("add").newPart("parameters", "tns:add");
    op.newOutput("addResponse").newMessage("addResponse").newPart("parameters", "tns:addResponse");
    return wsdl;
  }

  private static void dumpWSDL(Definitions wsdl) {
    StringWriter writer = new StringWriter();
    WSDLCreator creator = new WSDLCreator();
    creator.setBuilder(new MarkupBuilder(writer));
    wsdl.create(creator, new WSDLCreatorContext());
    System.out.println(writer);
  }
}
      
Listing 1: CreateWSDL.java

After executing you get the output shown in listing 2. It is an abstract WSDL document with an embedded XML Schema.

<definitions targetNamespace='http://predic8.com/wsdl/AddService/1/' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:tns='http://predic8.com/wsdl/AddService/1/' />
  <types>
    <xsd:schema targetNamespace='http://predic8.com/add/1/' attributeFormDefault='unqualified' elementFormDefault='unqualified' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
      <xsd:element name='add' minOccurs='1' maxOccurs='1'>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name='summand' type='xsd:int' minOccurs='1' maxOccurs='unbounded' />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name='addResponse' minOccurs='1' maxOccurs='1'>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name='number' type='xsd:int' minOccurs='1' maxOccurs='1' />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </types>
  <message name='add'>
    <part name='parameters' element='tns:add' />
  </message>
  <message name='addResponse'>
    <part name='parameters' element='tns:addResponse' />
  </message>
  <portType name='AddPortType'>
    <operation name='add'>
      <input message='tns:add' name='add' />
      <output message='tns:addResponse' name='addResponse' />
    </operation>
  </portType>
</definitions>
      
Listing 2: Created WSDL

Now let's have a look at the code from listing 1 in detail. In line 9 we have a static import that makes constants for the build-in XML Schema types available.

import static com.predic8.schema.Schema.*;

First we create a new Schema with the targetnamespace "http://predic8.com/add/1/" at line 18.

Schema schema = new Schema("http://predic8.com/add/1/");

Then we create a new element for the add operation. Using the chained syntax we can host a new complex type into the element and within that we host a new sequence. This notation makes it very comfortable to create schemas especially for Web Services.

schema.newElement("add").newComplexType().newSequence().newElement("summand", INT).setMaxOccurs("unbounded");

Next we create the WSDL document for the AddService in the targetnamespace.

Definitions wsdl = new Definitions("http://predic8.com/wsdl/AddService/1/", "AddService");
    wsdl.add(schema);

Then we create a new portType and the add operation.

PortType pt = wsdl.newPortType("AddPortType");
    Operation op = pt.newOperation("add");

In line 29 you can see how an input for the add operation is created. And now the input is linked over a part to the fomerly created add element.

op.newInput("add").newMessage("add").newPart("parameters", "tns:add");