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);
}
}
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>
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");