<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

  <xs:element name="enunciate">

    <xs:annotation>
      <xs:documentation>
        The root "enunciate" element for the configuration.
      </xs:documentation>
    </xs:annotation>

    <xs:complexType>
      <xs:sequence>
        <xs:element name="validator" type="validator" minOccurs="0" maxOccurs="1"/>
        <xs:element name="api-import" type="api-import" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="jaxb-import" type="jaxb-import" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="deployment" type="deployment" minOccurs="0" maxOccurs="1"/>
        <xs:element name="namespaces" type="namespaces" minOccurs="0" maxOccurs="1"/>
        <xs:element name="services" type="services" minOccurs="0" maxOccurs="1"/>
        <xs:element name="modules" type="modules" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="label" type="xs:string"/>
      <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>

  </xs:element>

  <xs:complexType name="validator">

    <xs:annotation>
      <xs:documentation>
        Used to define a custom validator to use to validate the web service declarations.
      </xs:documentation>
    </xs:annotation>

    <xs:attribute name="class" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="deployment">

    <xs:annotation>
      <xs:documentation>
        Used to define the deployment configuration.
      </xs:documentation>
    </xs:annotation>

    <xs:attribute name="protocol" type="xs:string" />
    <xs:attribute name="host" type="xs:string" />
    <xs:attribute name="context" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="services">

    <xs:annotation>
      <xs:documentation>
        Custom configuration for specific services.
      </xs:documentation>
    </xs:annotation>

    <xs:sequence>
      <xs:element name="soap" type="services-soap" minOccurs="0" maxOccurs="1"/>
      <xs:element name="rest" type="services-rest" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>

  </xs:complexType>

  <xs:complexType name="services-soap">

    <xs:annotation>
      <xs:documentation>
        Custom configuration for SOAP services.
      </xs:documentation>
    </xs:annotation>

    <xs:sequence>
      <xs:element name="service" type="services-soap-service" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>

    <xs:attribute name="defaultSubcontext" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="services-rest">

    <xs:annotation>
      <xs:documentation>
        Custom configuration for REST services.
      </xs:documentation>
    </xs:annotation>

    <xs:sequence>
      <xs:element name="content-types" type="content-types" minOccurs="0" maxOccurs="1"/>      
    </xs:sequence>

    <xs:attribute name="defaultRestSubcontext" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="services-soap-service">

    <xs:annotation>
      <xs:documentation>
        Custom configuration for a specific soap service.
      </xs:documentation>
    </xs:annotation>

    <xs:attribute name="name" use="required" type="xs:string" />
    <xs:attribute name="relativePath" use="required" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="namespaces">

    <xs:annotation>
      <xs:documentation>
        Set of namespace declarations.
      </xs:documentation>
    </xs:annotation>

    <xs:sequence>
      <xs:element name="namespace" type="namespace" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="namespace">
    <xs:annotation>
      <xs:documentation>
        A namespace declaration. The id is the prefix that will be used as needed.
      </xs:documentation>
    </xs:annotation>

    <xs:attribute name="id" type="xs:string" use="required"/>
    <xs:attribute name="uri" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="content-types">

    <xs:annotation>
      <xs:documentation>
        Set of namespace declarations.
      </xs:documentation>
    </xs:annotation>

    <xs:sequence>
      <xs:element name="content-type" type="content-type" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="content-type">
    <xs:annotation>
      <xs:documentation>
        A content-type declaration.
      </xs:documentation>
    </xs:annotation>

    <xs:attribute name="type" type="xs:string" use="required"/>
    <xs:attribute name="id" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="jaxb-import">
    <xs:annotation>
      <xs:documentation>
        The JAXB imports allow external dependencies on JAXB types.
      </xs:documentation>
    </xs:annotation>

    <xs:attribute name="class" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="api-import">
    <xs:annotation>
      <xs:documentation>
        Set of additional api classes to be Enunciated.
      </xs:documentation>
    </xs:annotation>

    <xs:attribute name="class" type="xs:string"/>
    <xs:attribute name="package" type="xs:string"/>
    <xs:attribute name="seekSource" type="xs:boolean"/>
  </xs:complexType>

  <xs:complexType name="modules">
    <xs:annotation>
      <xs:documentation>
        Set of modules to use to enunciate the web API.
      </xs:documentation>
    </xs:annotation>

    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
