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

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="serviceGroup">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="service"/>
                <xs:element minOccurs="0" ref="parameter"/>
                <xs:element minOccurs="0" ref="module"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="service">
        <xs:complexType>
            <xs:sequence>
                <xs:choice maxOccurs="unbounded">
                    <xs:element ref="module"/>
                    <xs:element ref="operation"/>
                    <xs:element ref="parameter"/>
                    <xs:element ref="description"/>
                    <xs:element ref="excludeOperations"/>
                    <xs:element ref="messageReceivers"/>
                    <xs:element ref="schema"/>
                    <xs:element ref="transports"/>
                </xs:choice>
                <xs:element minOccurs="0" ref="dataLocator"/>
            </xs:sequence>
            <xs:attribute name="class"/>
            <xs:attribute name="name"/>
            <xs:attribute name="scope" type="xs:NCName"/>
            <xs:attribute name="targetNamespace" type="xs:anyURI"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="description" type="xs:string"/>
    <xs:element name="excludeOperations">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="operation"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="messageReceivers">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="messageReceiver"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="schema">
        <xs:complexType>
            <xs:attribute name="schemaNamespace" use="required" type="xs:anyURI"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="transports">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="transport"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="transport" type="xs:NCName"/>
    <xs:element name="dataLocator">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="dialectLocator"/>
            </xs:sequence>
            <xs:attribute name="class"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="dialectLocator">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="dialect" use="required" type="xs:anyURI"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="parameter">
        <xs:complexType mixed="true">
            <xs:attribute name="locked" type="xs:NMTOKEN"/>
            <xs:attribute name="name" use="required" type="xs:NCName"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="module">
        <xs:complexType>
            <xs:attribute name="ref" use="required" type="xs:NCName"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="operation">
        <xs:complexType mixed="true">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="messageReceiver"/>
                <xs:element ref="module"/>
                <xs:element ref="parameter"/>
                <xs:element ref="actionMapping"/>
                <xs:element ref="faultActionMapping"/>
                <xs:element ref="message"/>
                <xs:element ref="outputActionMapping"/>
            </xs:choice>
            <xs:attribute name="mep" type="xs:anyURI"/>
            <xs:attribute name="name" type="xs:NCName"/>
            <xs:attribute name="qname" type="xs:NCName"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="actionMapping" type="xs:anyURI"/>
    <xs:element name="faultActionMapping">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:anyURI">
                    <xs:attribute name="faultName" use="required" type="xs:NCName"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="message">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="parameter"/>
            </xs:sequence>
            <xs:attribute name="label" use="required" type="xs:NCName"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="outputActionMapping" type="xs:anyURI"/>
    <xs:element name="messageReceiver">
        <xs:complexType>
            <xs:attribute name="class" use="required" type="xs:NCName"/>
            <xs:attribute name="mep" type="xs:anyURI"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
