<!--
  ~ 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.
  -->

<binding add-constructors="true" force-classes="true"
    xmlns:tns="http://ws.sosnoski.com/library/types">

  <namespace uri="http://ws.sosnoski.com/library/types" default="elements"/>
  
  <mapping name="getBook"
      class="org.apache.axis2.jibx.wrappers.GetBookRequest">
    <value name="isbn" field="m_isbn"/>
  </mapping>
  
  <mapping name="getBookResponse"
      class="org.apache.axis2.jibx.wrappers.GetBookResponse">
    <structure name="getBookReturn" field="m_book" usage="optional"
        map-as="tns:BookInformation"/>
  </mapping>
  
  <mapping name="getBooksByType"
      class="org.apache.axis2.jibx.wrappers.GetBooksByTypeRequest">
    <value name="type" field="m_type"/>
  </mapping>
  
  <mapping name="getBooksByTypeResponse"
      class="org.apache.axis2.jibx.wrappers.GetBooksByTypeResponse">
    <collection field="m_books" usage="optional">
      <structure name="getBooksByTypeReturn" map-as="tns:BookInformation"/>
    </collection>
  </mapping>
  
  <mapping name="getTypes"
      class="org.apache.axis2.jibx.wrappers.GetTypesRequest"/>
  
  <mapping name="getTypesResponse"
      class="org.apache.axis2.jibx.wrappers.GetTypesResponse">
    <collection field="m_types" usage="optional">
      <structure name="getTypesReturn" map-as="tns:TypeInformation"/>
    </collection>
  </mapping>
  
  <mapping name="addBook"
      class="org.apache.axis2.jibx.wrappers.AddBookRequest">
    <structure field="m_book">
      <value name="type" field="m_type"/>
      <value name="isbn" field="m_isbn"/>
      <collection field="m_authors">
        <value name="author" type="java.lang.String"/>
      </collection>
      <value name="title" field="m_title"/>
    </structure>
  </mapping>
  
  <mapping name="addBookResponse"
      class="org.apache.axis2.jibx.wrappers.AddBookResponse">
    <value name="addBookReturn" field="m_success"/>
  </mapping>
  
  <mapping name="addBookInstance"
      class="org.apache.axis2.jibx.wrappers.AddBookInstanceRequest">
    <structure name="book" field="m_book" map-as="tns:BookInformation"/>
  </mapping>
  
  <mapping name="addBookInstanceResponse"
      class="org.apache.axis2.jibx.wrappers.AddBookInstanceResponse"/>
  
  <mapping abstract="true" class="org.apache.axis2.jibx.beans.Book"
      type-name="tns:BookInformation">
    <namespace prefix="types" uri="http://ws.sosnoski.com/library/types"/>
    <value name="type" style="attribute" field="m_type"/>
    <value name="isbn" style="attribute" field="m_isbn"/>
    <collection field="m_authors">
      <value name="author" type="java.lang.String"/>
    </collection>
    <value name="title" field="m_title"/>
  </mapping>
  
  <mapping abstract="true" class="org.apache.axis2.jibx.beans.Type"
      type-name="tns:TypeInformation">
    <value name="name" style="attribute" field="m_name"/>
    <value name="count" style="attribute" field="m_count"/>
    <value style="text" field="m_description"/>
  </mapping>

</binding>
