<?xml version="1.0" encoding="UTF-8"?>

<!--
 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 
 Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
 
 The contents of this file are subject to the terms of either the GNU
 General Public License Version 2 only ("GPL") or the Common Development
 and Distribution License("CDDL") (collectively, the "License").  You
 may not use this file except in compliance with the License. You can obtain
 a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
 or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
 language governing permissions and limitations under the License.
 
 When distributing the software, include this License Header Notice in each
 file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
 Sun designates this particular file as subject to the "Classpath" exception
 as provided by Sun in the GPL Version 2 section of the License file that
 accompanied this code.  If applicable, add the following below the License
 Header, with the fields enclosed by brackets [] replaced by your own
 identifying information: "Portions Copyrighted [year]
 [name of copyright owner]"
 
 Contributor(s):
 
 If you wish your version of this file to be governed by only the CDDL or
 only the GPL Version 2, indicate your decision by adding "[Contributor]
 elects to include this software in this distribution under the [CDDL or GPL
 Version 2] license."  If you don't indicate a single choice of license, a
 recipient has the option to distribute your version of this file under
 either the CDDL, the GPL Version 2 or to extend the choice of license to
 its licensees as provided above.  However, if you add GPL Version 2 code
 and therefore, elected the GPL Version 2 license, then the option applies
 only if the new code is made subject to such option by the copyright
 holder.
-->


<xsd:schema
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="http://java.sun.com/xml/ns/jax-rpc/ri/config"
        targetNamespace="http://java.sun.com/xml/ns/jax-rpc/ri/config"
        elementFormDefault="qualified"
        attributeFormDefault="unqualified"
        version="1.0">

    <xsd:annotation>
        <xsd:documentation>
        This is the schema for wscompile configuration files.
        The only allowed top-level element is "configuration".
        </xsd:documentation>
    </xsd:annotation>

    <xsd:element name="configuration">
        <xsd:annotation>
            <xsd:documentation>
            The top-level element. It must contain one out of three possible elements,
            corresponding to three different ways to feed service information to the tool.
            
            Elements: (mutually exclusive)
                "service" - a service description based on a set of service endpoint interfaces;
                "wsdl" - a WSDL document to import and process;
                "modelfile" - a previously saved model file (-model option in wscompile).
                "j2eeMappingFile" - J2EE mapping information defined by JSR 109
            </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:choice>
                    <xsd:element name="service" type="tns:serviceType"/>
                    <xsd:element name="wsdl" type="tns:wsdlType"/>
                    <xsd:element name="modelfile" type="tns:modelfileType"/>
			  <xsd:element name="j2eeMappingFile" type="tns:j2eeMappingFileType"/>
                </xsd:choice>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="serviceType">
        <xsd:annotation>
            <xsd:documentation>
            A description of a service based on a set of Java interfaces (called "service endpoint
            interfaces" in the spec).
            
            Attributes:
                "name" - service name;
                "targetNamespace" - target namespace for the generated WSDL document;
                "typeNamespace" - target namespace for the XML Schema embedded in the generated WSDL document;
                "packageName" - name of the Java package to use by default.
                
            Elements:
                "interface"* - a sequence of service endpoint interface descriptions;
                "typeMappingRegistry"? - the type mapping registry to use for this service;
                "handlerChains"? - default handler chains for the endpoints in this service;
                "namespaceMappingRegistry"? - XML namespace to Java package mapping information.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="interface" type="tns:interfaceType" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="typeMappingRegistry" type="tns:typeMappingRegistryType" minOccurs="0"/>
            <xsd:element name="handlerChains" type="tns:handlerChainsType" minOccurs="0"/>
            <xsd:element name="namespaceMappingRegistry" type="tns:namespaceMappingRegistryType" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required"/>
        <xsd:attribute name="targetNamespace" type="xsd:anyURI" use="required"/>
        <xsd:attribute name="typeNamespace" type="xsd:anyURI" use="required"/>
        <xsd:attribute name="packageName" type="xsd:string" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="interfaceType">
        <xsd:annotation>
            <xsd:documentation>
            An endpoint definition based on a service endpoint interface.
            
            Attributes:
                "name" - name of the service endpoint interface (a Java interface);
                "servantName" (optional) - name of the service endpoint implementation class;
                "soapAction" (optional) - SOAPAction string to use for all operations in the interface;
                "soapActionBase" (optional) - base URI for the SOAPAction string; the SOAPAction for
                    a given operation will be obtained by appending the operation name to the value provided
                    here; this attribute is exclusive with the "soapAction" one.
                    
            Elements:
                "handlerChains" - specifies the handler chains for this endpoint.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="handlerChains" type="tns:handlerChainsType" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required"/>
        <xsd:attribute name="servantName" type="xsd:string"/>
        <xsd:attribute name="soapAction" type="xsd:string"/>
        <xsd:attribute name="soapActionBase" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="wsdlType">
        <xsd:annotation>
            <xsd:documentation>
            A description of a service based on an existing WSDL document.
            
            Attributes:
                "location" - URL of the WSDL document;
                "packageName" - name of the Java package to use by default.
                
            Elements:
                "typeMappingRegistry"? - the type mapping registry to use for this service;
                "handlerChains"? - default handler chains for the endpoints in this service;
                "namespaceMappingRegistry"? - XML namespace to Java package mapping information.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="typeMappingRegistry" type="tns:typeMappingRegistryType" minOccurs="0"/>
            <xsd:element name="handlerChains" type="tns:handlerChainsType" minOccurs="0"/>
            <xsd:element name="namespaceMappingRegistry" type="tns:namespaceMappingRegistryType" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="location" type="xsd:anyURI" use="required"/>
        <xsd:attribute name="packageName" type="xsd:string" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="modelfileType">
        <xsd:annotation>
            <xsd:documentation>
            A description of a service based on an existing model file.
            
            Attributes:
                "location" - URL of the model file (typically ending in .xml.gz);
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
        </xsd:sequence>
        <xsd:attribute name="location" type="xsd:anyURI" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="j2eeMappingFileType">
        <xsd:annotation>
            <xsd:documentation>
            
            Attirbutes:
                "location" - the J2EE mapping file URL
                "wsdlLocation" - the wsdl file URL
                
            </xsd:documentation>
        </xsd:annotation>

        <xsd:attribute name="location" type="xsd:anyURI" use="required"/>
        <xsd:attribute name="wsdlLocation" type="xsd:anyURI" use="required"/>
    </xsd:complexType>


    <xsd:complexType name="handlerChainsType">
        <xsd:annotation>
            <xsd:documentation>
            A set of handlerChains.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="chain" type="tns:chainType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="chainType">
        <xsd:annotation>
            <xsd:documentation>
            A handler chain.
            
            Attributes:
                "runAt" - specifies whether the chain must run on the client or the server;
                "roles" - the SOAP roles for the chain.
                
            Elements:
                "handler"* - a sequence of handlers that form this chain.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="handler" type="tns:handlerType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="runAt" type="tns:runAtType" use="required"/>
        <xsd:attribute name="roles" type="tns:roleListType"/>
    </xsd:complexType>

    <xsd:simpleType name="roleListType">
        <xsd:annotation>
            <xsd:documentation>
            A list of SOAP roles, i.e. a list of URIs.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:list itemType="xsd:anyURI"/>
    </xsd:simpleType>

    <xsd:complexType name="handlerType">
        <xsd:annotation>
            <xsd:documentation>
            A handler description.
            
            Attributes:
                "className" - the name of the handler's class;
                "headers" - the names of the headers consumed by this handler.
            
            Elements:
                "property"* - initialization properties for this handler.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="property" type="tns:propertyType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="className" type="xsd:string" use="required"/>
        <xsd:attribute name="headers" type="tns:headerListType"/>
    </xsd:complexType>

    <xsd:simpleType name="headerListType">
        <xsd:annotation>
            <xsd:documentation>
            A list of header names, i.e. a list of QNames.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:list itemType="xsd:QName"/>
    </xsd:simpleType>

    <xsd:complexType name="propertyType">
        <xsd:annotation>
            <xsd:documentation>
            An initialization property for a handler.
            
            Attributes:
                "name" - the name of the property;
                "value" - its value.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required"/>
        <xsd:attribute name="value" type="xsd:string" use="required"/>
    </xsd:complexType>

    <xsd:simpleType name ="runAtType">
        <xsd:annotation>
            <xsd:documentation>
            The places a handler chain can run at, one of "client" or "server".
            </xsd:documentation>
        </xsd:annotation>

        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="client"/>
            <xsd:enumeration value="server"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="typeMappingRegistryType">
        <xsd:annotation>
            <xsd:documentation>
            A type mapping registry.
            
            Elements:
                "import"? - a list of XML Schema documents that describe user-defined types.
                "typeMapping"* - a sequence of type mappings, one per encoding.
                "additionalTypes"? - a list of additional Java types that should be processed even if
                    don't appear in the interfaces for the service.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="import" type="tns:importType" minOccurs="0"/>
            <xsd:element name="typeMapping" type="tns:typeMappingType" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="additionalTypes" type="tns:additionalTypesType" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="importType">
            <xsd:annotation>
            <xsd:documentation>
            A list of schema documents to import, usually describing schema types used
            by pluggable serializers.
            
            Elements:
                "schema"* - a list of schema documents to import.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="schema" type="tns:schemaType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="schemaType">
        <xsd:annotation>
            <xsd:documentation>
            One schema document to be imported.
            Attributes:
                "namespace" - the namespace that the document describes;
                "location" - a URL pointing to the schema document.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
        </xsd:sequence>
        <xsd:attribute name="namespace" type="xsd:anyURI" use="required"/>
        <xsd:attribute name="location" type="xsd:anyURI" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="typeMappingType">
        <xsd:annotation>
            <xsd:documentation>
            A type mapping for a particular encoding.
            
            Attributes:
                "encodingStyle" - the URI denoting the encoding.
            
            Elements:
                "entry"* - a list of type mapping entries.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="entry" type="tns:entryType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="encodingStyle" type="xsd:anyURI" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="entryType">
        <xsd:annotation>
            <xsd:documentation>
            An entry in a type mapping.
            
            Attributes:
                "schemaType" - the name of a schema type;
                "javaType" - the name of the corresponding Java class;
                "serializerFactory" - the name of the serializer factory class to use for this type;
                "deserializerFactory" - the name of the deserializer factory class to use for this type.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
        </xsd:sequence>
        <xsd:attribute name="schemaType" type="xsd:QName" use="required"/>
        <xsd:attribute name="javaType" type="xsd:string" use="required"/>
        <xsd:attribute name="serializerFactory" type="xsd:string" use="required"/>
        <xsd:attribute name="deserializerFactory" type="xsd:string" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="additionalTypesType">
        <xsd:annotation>
            <xsd:documentation>
            A list of additional Java types to be processed by the tool..
            
            Elements:
                "class"* - a list of classes to be processed.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="class" type="tns:classType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="classType">
        <xsd:annotation>
            <xsd:documentation>
            A Java class description.
            
            Attributes:
                "class" - the name of the class.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="namespaceMappingRegistryType">
        <xsd:annotation>
            <xsd:documentation>
            A registry mapping XML namespace to/from Java packages.
            
            Elements:
                "namespaceMapping"* - a list of mappings.
            </xsd:documentation>
        </xsd:annotation>
        
        <xsd:sequence>
            <xsd:element name="namespaceMapping" type="tns:namespaceMappingType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="namespaceMappingType">
        <xsd:annotation>
            <xsd:documentation>
            One XML namespace to/from Java package mapping.
            
            Attributes:
                "namespace" - XML namespace name;
                "packageName" - Java package name.
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
        </xsd:sequence>
        <xsd:attribute name="namespace" type="xsd:anyURI" use="required"/>
        <xsd:attribute name="packageName" type="xsd:string" use="required"/>
    </xsd:complexType>

</xsd:schema>
