<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" />
<meta http-equiv="content-type" content="" />
<title>JiBX general document/literal</title>
</head>
<body>
<h1>JiBX general document/literal</h1>
<p>Code generation for JiBX data binding converts operations
defined by a Web service to method calls. With general
document/literal (doc/lit) Web services the generated methods each
take a single parameter object and return a single result object.
Here's a sample doc/lit WSDL (partial) by way of an example:</p>
<pre>
&lt;wsdl:definitions targetNamespace="http://ws.sosnoski.com/library/wsdl"
    xmlns:tns="http://ws.sosnoski.com/library/types"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"&gt;
    
  &lt;wsdl:types&gt;
  
    &lt;schema elementFormDefault="qualified"
        targetNamespace="http://ws.sosnoski.com/library/types"
        xmlns="http://www.w3.org/2001/XMLSchema"&gt;
        
      &lt;element name="getBook"&gt;
        &lt;complexType&gt;
          &lt;sequence&gt;
            &lt;element name="isbn" type="string"/&gt;
          &lt;/sequence&gt;
        &lt;/complexType&gt;
      &lt;/element&gt;
      
      &lt;element name="getBookResponse"&gt;
        &lt;complexType&gt;
          &lt;sequence&gt;
            &lt;element name="book" minOccurs="0" type="tns:BookInformation"/&gt;
          &lt;/sequence&gt;
        &lt;/complexType&gt;
      &lt;/element&gt;
      
      &lt;element name="addBook"&gt;
        &lt;complexType&gt;
          &lt;sequence&gt;
            &lt;element name="type" type="string"/&gt;
            &lt;element name="isbn" type="string"/&gt;
            &lt;element name="author" minOccurs="0" maxOccurs="unbounded" type="string"/&gt;
            &lt;element name="title" type="string"/&gt;
          &lt;/sequence&gt;
        &lt;/complexType&gt;
      &lt;/element&gt;
      
      &lt;element name="addBookResponse"&gt;
        &lt;complexType&gt;
          &lt;sequence&gt;
            &lt;element name="success" type="boolean"/&gt;
          &lt;/sequence&gt;
        &lt;/complexType&gt;
      &lt;/element&gt;
      
      &lt;complexType name="BookInformation"&gt;
        &lt;sequence&gt;
          &lt;element name="author" minOccurs="0" maxOccurs="unbounded" type="string"/&gt;
          &lt;element name="title" type="string"/&gt;
        &lt;/sequence&gt;
        &lt;attribute name="type" use="required" type="string"/&gt;
        &lt;attribute name="isbn" use="required" type="string"/&gt;
      &lt;/complexType&gt;
      
    &lt;/schema&gt;

  &lt;/wsdl:types&gt;

  &lt;wsdl:message name="getBookRequest"&gt;
    &lt;wsdl:part element="wns:getBook" name="parameters"/&gt;
  &lt;/wsdl:message&gt;

  &lt;wsdl:message name="getBookResponse"&gt;
    &lt;wsdl:part element="wns:getBookResponse" name="parameters"/&gt;
  &lt;/wsdl:message&gt;

  &lt;wsdl:message name="addBookRequest"&gt;
    &lt;wsdl:part element="wns:addBook" name="parameters"/&gt;
  &lt;/wsdl:message&gt;
  
  &lt;wsdl:message name="addBookResponse"&gt;
    &lt;wsdl:part element="wns:addBookResponse" name="parameters"/&gt;
  &lt;/wsdl:message&gt;

  &lt;wsdl:portType name="Library"&gt;

    &lt;wsdl:operation name="getBook"&gt;
      &lt;wsdl:input message="wns:getBookRequest" name="getBookRequest"/&gt;
      &lt;wsdl:output message="wns:getBookResponse" name="getBookResponse"/&gt;
    &lt;/wsdl:operation&gt;

    &lt;wsdl:operation name="addBook"&gt;
      &lt;wsdl:input message="wns:addBookRequest" name="addBookRequest"/&gt;
      &lt;wsdl:output message="wns:addBookResponse" name="addBookResponse"/&gt;
    &lt;/wsdl:operation&gt;

  &lt;/wsdl:portType&gt;
  ...
&lt;/wsdl:definitions&gt;
</pre>
<p>This WSDL defines a service with just two operations:
<b>getBook</b> and <b>addBook</b>. The <b>getBook</b> operation
takes a <i>getBook</i> element as input, and returns a
<i>getBookResponse</i> element as output, while <b>addBook</b>
takes an <i>addBook</i> element as input and returns an
<i>addBookResponse</i> as output. Here's the body of the client
interface generated by the standard JiBX code generation:</p>
<pre>
    public interface LibraryJibxUnwrapped {
          
             
        /**
         * Auto generated method signatures
         * @param addBook
         */
         public com.sosnoski.ws.library.jibx.wrappers.AddBookResponse addBook(
         com.sosnoski.ws.library.jibx.wrappers.AddBookRequest addBook) throws java.rmi.RemoteException
          
                       
             ;
             
             
        /**
         * Auto generated method signatures
         * @param getBook
         */
         public com.sosnoski.ws.library.jibx.wrappers.GetBookResponse getBook(
         com.sosnoski.ws.library.jibx.wrappers.GetBookRequest getBook) throws java.rmi.RemoteException
          
                       
             ;
             

        
       //
       }
</pre>
<p>You can see that the JiBX code generation converted the
operations into simple method call interfaces using objects
corresponding to the input and output elements of the operation
(see <a href="./jibx-unwrapped-example.html">JiBX Unwrapped
Example</a> for the interface generated when unwrapping is instead
used). The server-side interface is the same.</p>
<p>You need to supply an appropriate JiBX binding definition for
use in code generation (using the <i>-Ebindingfile {file}</i>
parameter for WSDL2Java - see <a href=
"./jibx-codegen-integration.html#codegen">JiBX Codegen Integration
- WSDL2Java usage</a> for more details). This must define concrete
<i>mappings</i> for each element used as the input or output of an
operation. The JiBX code generation extension matches the element
names to the binding in order to determine the corresponding class
to use in generated code.</p>
<p>For example, here's a binding definition that matches the above
WSDL:</p>
<pre>
&lt;binding add-constructors="true"&gt;

  &lt;namespace uri="http://ws.sosnoski.com/library/types" default="elements"/&gt;
  
  &lt;mapping name="getBook"
      class="com.sosnoski.ws.library.jibx.wrappers.GetBookRequest"&gt;
    &lt;value name="isbn" field="m_isbn"/&gt;
  &lt;/mapping&gt;
  
  &lt;mapping name="getBookResponse"
      class="com.sosnoski.ws.library.jibx.wrappers.GetBookResponse"&gt;
    &lt;structure name="book" field="m_book"/&gt;
  &lt;/mapping&gt;
  
  &lt;mapping name="addBook"
      class="com.sosnoski.ws.library.jibx.wrappers.AddBookRequest"&gt;
    &lt;structure field="m_book"&gt;
      &lt;value name="type" field="m_type"/&gt;
      &lt;value name="isbn" field="m_isbn"/&gt;
      &lt;collection field="m_authors"&gt;
        &lt;value name="author" type="java.lang.String"/&gt;
      &lt;/collection&gt;
      &lt;value name="title" field="m_title"/&gt;
    &lt;/structure&gt;
  &lt;/mapping&gt;
  
  &lt;mapping name="addBookResponse"
      class="com.sosnoski.ws.library.jibx.wrappers.AddBookResponse"/&gt;
  
  &lt;mapping abstract="true" class="com.sosnoski.ws.library.jibx.beans.Book"&gt;
    &lt;value name="type" style="attribute" field="m_type"/&gt;
    &lt;value name="isbn" style="attribute" field="m_isbn"/&gt;
    &lt;collection field="m_authors"&gt;
      &lt;value name="author" type="java.lang.String"/&gt;
    &lt;/collection&gt;
    &lt;value name="title" field="m_title"/&gt;
  &lt;/mapping&gt;

&lt;/binding&gt;
</pre>
<p>And here are the actual data object classes:</p>
<pre>
package com.sosnoski.ws.library.jibx.wrappers;

import com.sosnoski.ws.library.jibx.beans.Book;

public class AddBookRequest
{
    private Book m_book;
    
    public AddBookRequest(Book book) {
        m_book = book;
    }
    
    public Book getBook() {
        return m_book;
    }
}

public class AddBookResponse
{
}

public class GetBookRequest
{
    private String m_isbn;
    
    public GetBookRequest(String isbn) {
        m_isbn = isbn;
    }

    public String getIsbn() {
        return m_isbn;
    }
}

public class GetBookResponse
{
    private Book m_book;
    
    public GetBookResponse(Book book) {
        m_book = book;
    }
    
    public Book getBook() {
        return m_book;
    }
}

package com.sosnoski.ws.library.jibx.beans;

public class Book
{
    private String m_type;
    private String m_isbn;
    private String m_title;
    private String[] m_authors;
    
    public Book() {}

    public String getType() {
        return m_type;
    }
    
    public String getIsbn() {
        return m_isbn;
    }
    
    public String getTitle() {
        return m_title;
    }
    
    public String[] getAuthors() {
        return m_authors;
    }
}
</pre>
</body>
</html>
