<?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="http://www.w3.org/2001/XMLSchema"
    xmlns:ger="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2"
    xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.2"
    xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2"
    targetNamespace="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    attributeFormDefault="unqualified">

    <xs:annotation>
        <xs:documentation>
            This is an XML Schema Definition for Geronimo resource adapter
            deployment plan. In case the Geronimo resource adapter deployment
            plan is provided internally in the resource adapter archive, it
            should be names META-INF/geronimo-ra.xml. In case the Geronimo
            resource adapter deployment plan is provided externally, the
            deployment descriptor can be named anything and provided to the
            deploy tool. Alternatively it can be included in the EAR and
            referenced by an alt-dd element of the EAR deployment plan. All the
            Geronimo resource adapter deployment plan must specify the top level
            element as connector with namespace specified as xmlns=
            "http://geronimo.apache.org/xml/ns/j2ee/connector-1.2". The default
            location for this document is
            http://geronimo.apache.org/xml/ns/j2ee/connector-1.2
        </xs:documentation>
    </xs:annotation>
    <xs:import namespace="http://geronimo.apache.org/xml/ns/naming-1.2"
        schemaLocation="geronimo-naming-1.2.xsd">
        <xs:annotation>
            <xs:documentation>
                Import partial schema containing common naming elements, the
                imported plan declares elements like ejb-ref, ejb-local-ref,
                service-ref,resource-ref, and resource-env-ref required by this
                plan schema.
            </xs:documentation>
        </xs:annotation>
    </xs:import>
    <xs:import namespace="http://geronimo.apache.org/xml/ns/deployment-1.2"
        schemaLocation="geronimo-module-1.2.xsd">
        <xs:annotation>
            <xs:documentation>
                Import Geronimo Services deployment plans. The imported plan
                includes complex types like moduleType, environmentType,
                dependenciesType, etc. required by this plan schema.
            </xs:documentation>
        </xs:annotation>
    </xs:import>
    <xs:import namespace="http://www.w3.org/XML/1998/namespace"
        schemaLocation="http://www.w3.org/2001/xml.xsd" />

    <xs:annotation>
        <xs:documentation>
            <![CDATA[
            documents using this schema should start like:
            <connector xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2"
            version="1.5">

            @(#)geronimo-connector_1_5.xsds
            ]]>
        </xs:documentation>
    </xs:annotation>

    <!-- **************************************************** -->

    <xs:element name="connector" type="ger:connectorType">
        <xs:annotation>
            <xs:documentation>
                The connector element is the root element of the deployment
                descriptor for the resource adapter. Note that the sub-elements
                of this element should be as in the given order in a sequence.
                It includes geronimo specific information for the resource
                adapter library.
            </xs:documentation>
        </xs:annotation>

        <xs:unique name="resourceadapter-instance-name-uniqueness">
            <xs:annotation>
                <xs:documentation>
                    The resourceadapter-instance element must have a unique
                    name.
                </xs:documentation>
            </xs:annotation>
            <xs:selector
                xpath="ger:resourceadapter/ger:resourceadapter-instance" />
            <xs:field xpath="ger:resourceadapter-name" />
        </xs:unique>

        <xs:unique name="connectiondefinition-instance-name-uniqueness">
            <xs:annotation>
                <xs:documentation>
                    The connectiondefinition-instance element must have a unique
                    name.
                </xs:documentation>
            </xs:annotation>
            <xs:selector
                xpath="ger:resourceadapter/ger:outbound-resourceadapter/ger:connection-definition/ger:connectiondefinition-instance" />
            <xs:field xpath="ger:name" />
        </xs:unique>

        <xs:unique name="admin-object-instance-name-uniqueness">
            <xs:annotation>
                <xs:documentation>
                    The admin-object-instance element must have a unique name.
                </xs:documentation>
            </xs:annotation>
            <xs:selector xpath="ger:adminobject/ger:adminobject-instance" />
            <xs:field xpath="ger:message-destination-name" />
        </xs:unique>
    </xs:element>

    <!-- **************************************************** -->

    <xs:complexType name="adminobjectType">
        <xs:annotation>
            <xs:documentation>
                This complex type maps back to adminobjectType complex type in
                connectors xsd.
            </xs:documentation>
        </xs:annotation>

        <xs:sequence>
            <xs:element name="adminobject-interface"
                type="ger:fully-qualified-classType">
                <xs:annotation>
                    <xs:documentation>
                        The element adminobject-interface maps back to an
                        adminobject-interface element in ra.xml. It specifies
                        the fully qualified name of Java interface of the
                        administrated object.
                    </xs:documentation>
                </xs:annotation>

            </xs:element>
            <xs:element name="adminobject-class"
                type="ger:fully-qualified-classType">
                <xs:annotation>
                    <xs:documentation>
                        The element adminobject-class maps back to an
                        adminobject-class element in ra.xml. It specifies the
                        fully qualified name of Java class of the administrated
                        object.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="adminobject-instance"
                type="ger:adminobject-instanceType" minOccurs="0"
                maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The element adminobject-instance contains the
                        configuration for this specific instance of the
                        administered object type, with a unique name, and values
                        for any configuration properties necessary for that
                        administered object type.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="adminobject-instanceType">
        <xs:sequence>
            <xs:element name="message-destination-name" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        A unique name for admin object instance. Used in object
                        name of gbean for it. Matches message-destination-name
                        in ejb-jar.xml assembly descriptor.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="config-property-setting"
                type="ger:config-property-settingType" minOccurs="0"
                maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The element config-property-setting specifies the set of
                        properties for admin object instance.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <!-- **************************************************** -->

    <xs:complexType name="config-property-settingType">
        <xs:annotation>
            <xs:documentation>
                The config-property-settingType contains a name-value pair for a
                config-property or required-config-property
            </xs:documentation>
        </xs:annotation>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="name" type="xs:string" use="required">
                    <xs:annotation>
                        <xs:documentation>
                            The name of the property in name-value pair. It
                            should match the config-property-name in a
                            config-property in the adminobject element of the
                            ra.xml file.
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <!-- **************************************************** -->

    <xs:complexType name="connection-definitionType">
        <xs:annotation>
            <xs:documentation>
                The connection-definitionType defines a set of connection
                interfaces and classes pertaining to a particular connection
                type. This also includes configurable properties for
                ManagedConnectionFactory instances that may be produced out of
                this set.

                The name element uniquely identifies this instance
            </xs:documentation>
        </xs:annotation>

        <xs:sequence>
            <xs:element name="connectionfactory-interface"
                type="ger:fully-qualified-classType">
                <xs:annotation>
                    <xs:documentation>
                        The connectionfactory-interface is unique in ra.xml so
                        is used to index into ra.xml. It provides the fully
                        qualified name of java interface used as
                        connectionfactory for resource adapter.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="connectiondefinition-instance"
                type="ger:connectiondefinition-instanceType" minOccurs="0"
                maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The connectiondefinition-instance provides the
                        configuration for a specific connection.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="connectiondefinition-instanceType">
        <xs:sequence>
            <xs:element name="name" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        The unique name of the connection definition instance
                        used to identify the connection configuration specified
                        here.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            
            <xs:element name="jndi-name" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The jndi name for this connection factory used for
                        jndi lookups using osgi:service/ scheme.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>

            <xs:element name="implemented-interface"
                type="ger:fully-qualified-classType" minOccurs="0"
                maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        Additional fully qualified name of java interfaces
                        implemented by the connectionfactory used by the
                        application apart from the connectionfactory-interface
                        specified before.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>

            <xs:element name="config-property-setting"
                type="ger:config-property-settingType" minOccurs="0"
                maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The element config-property-setting specifies the set of
                        properties for connection instance.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>

            <!--<xs:choice>-->

            <xs:element name="connectionmanager"
                type="ger:connectionmanagerType">
                <xs:annotation>
                    <xs:documentation>
                        The connectionmanager element specifies the connection
                        specific settings like transaction, security, and
                        connection pool.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>

            <!--<xs:element name="connectionmanager-ref" type="xs:string"/>-->
            <!--</xs:choice>-->

        </xs:sequence>
    </xs:complexType>

    <!-- **************************************************** -->

    <xs:complexType name="connectionmanagerType">
        <xs:annotation>
            <xs:documentation>
                The connectionmanager element specifies the connection specific
                settings like transaction, security, and connection pool.
            </xs:documentation>
        </xs:annotation>

        <xs:sequence>
            <xs:element name="container-managed-security" type="ger:emptyType"
                minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        This empty element indicates that the connection is
                        authenticated by container and no user authentication is
                        required. This setting is ignored if res-auth is
                        provided inr resource-ref.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:choice minOccurs="0">
                <xs:element name="no-transaction" type="ger:emptyType">
                    <xs:annotation>
                        <xs:documentation>
                            This empty element indicates no participation of
                            connection in any transactions.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="local-transaction" type="ger:emptyType">
                    <xs:annotation>
                        <xs:documentation>
                            This empty element indicates participation of
                            connection in only local transactions involving only
                            this connection.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="xa-transaction"
                    type="ger:xatransactionType">
                    <xs:annotation>
                        <xs:documentation>
                            The xa-transaction element indicates participation
                            of connection in multi resource transactions. This
                            element provides caching information for XA
                            transaction.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="transaction-log" type="ger:emptyType">
                    <xs:annotation>
                        <xs:documentation>
                            This empty element indicates participation JDBC
                            resource of local transaction type in XA
                            transactions.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:choice>
            <xs:choice>
                <xs:element name="no-pool" type="ger:emptyType">
                    <xs:annotation>
                        <xs:documentation>
                            This empty element indicates connection will not be
                            pooled at all, which mean every connection request
                            will open a connection for its own purpose.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="single-pool" type="ger:singlepoolType">
                    <xs:annotation>
                        <xs:documentation>
                            This element indicates connection will pooled in
                            only one connection pool. This element provides
                            information about single connection pool being
                            deployed.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="partitioned-pool"
                    type="ger:partitionedpoolType">
                    <xs:annotation>
                        <xs:documentation>
                            This element indicates connection will pooled in
                            multiple connection pools. This element provides
                            information about multiple connection pools being
                            deployed.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="xatransactionType">
        <xs:sequence>
            <xs:element name="transaction-caching" type="ger:emptyType"
                minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        This empty element indicates the sharing of same
                        connection in same transaction if multiple connections
                        are requested in same transaction.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="thread-caching" type="ger:emptyType"
                minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        This empty element indicates the sharing of same
                        connection in same thread if multiple connections are
                        requested in same thread.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="singlepoolType">
        <xs:sequence>
            <xs:element name="max-size" type="xs:int" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The maximum number of connection in a connection pool
                        being deployed. The connection pool will stop filling
                        once reached this value.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="min-size" type="xs:int" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The minimum number of connection in a connection pool
                        being deployed. The connection pool will try to fill
                        itself if the number of connections fall below this
                        value.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="blocking-timeout-milliseconds" type="xs:int"
                minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The time after which timeout will be thrown if no
                        connections are available to be loaned in a connection
                        pool.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="idle-timeout-minutes" type="xs:int"
                minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The time after which connection will be automatically
                        considered released.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:choice>
                <xs:element name="match-one" type="ger:emptyType">
                    <xs:annotation>
                        <xs:documentation>
                            This element indicates that only one connection
                            needs to be checked for matching the connection
                            request. If the connection does not match, it throws
                            an error to the effect of "please adjust your
                            configuration and try again".
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="match-all" type="ger:emptyType">
                    <xs:annotation>
                        <xs:documentation>
                            This element indicates that all the connections need
                            to be checked for matching the connection request.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="select-one-assume-match"
                    type="ger:emptyType">
                    <xs:annotation>
                        <xs:documentation>
                            This empty field indicated that no connection
                            settings need to checked and matched, and assumes
                            that all connections are same and one of them will
                            be returned back to client.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="partitionedpoolType">
        <complexContent>
            <extension base="ger:singlepoolType">
                <xs:sequence>
                    <xs:element name="partition-by-subject" type="ger:emptyType"
                        minOccurs="0">
                        <xs:annotation>
                            <xs:documentation>
                                This empty partition-by-subject field indicates
                                that connection pool has to be partitioned by
                                subject field.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:element>
                    <xs:element name="partition-by-connectionrequestinfo"
                        type="ger:emptyType" minOccurs="0">
                        <xs:annotation>
                            <xs:documentation>
                                This empty partition-by-connectionrequestinfo
                                field indicates that connection pool has to be
                                partitioned by connection request information.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:element>
                </xs:sequence>
            </extension>
        </complexContent>
    </xs:complexType>

    <!-- **************************************************** -->

    <xs:complexType name="connectorType">
        <xs:annotation>
            <xs:documentation>
                The connector element is the root element of the deployment
                descriptor for the resource adapter. Note that the sub-elements
                of this element should be as in the given order in a sequence.
                It includes geronimo specific information for the resource
                adapter library.
            </xs:documentation>
        </xs:annotation>

        <xs:sequence>
            <xs:element ref="sys:environment" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Reference to environment element defined in imported
                        "geronimo-module-1.2.xsd"
                    </xs:documentation>
                </xs:annotation>
            </xs:element>

            <xs:element name="resourceadapter" type="ger:resourceadapterType"
                maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The element resourceadapter defines the resource
                        adapters for the connector defined in the document.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>

            <xs:element name="adminobject" type="ger:adminobjectType"
                minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The element adminobject maps back to adminobject defined
                        in ra.xml. It provides specific instance information for
                        administer object defined in ra.xml. For example, if
                        topic is declared in the ra.xml this could provide topic
                        instance information.
                        An admin object configured here cannot implement ResourceAdapterAssociation.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>

            <xs:element ref="sys:service" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        Reference to service element defined in imported
                        "geronimo-module-1.2.xsd".
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>

    </xs:complexType>

    <!-- **************************************************** -->

    <xs:complexType name="emptyType" />

    <!-- **************************************************** -->

    <xs:complexType name="outbound-resourceadapterType">
        <xs:annotation>
            <xs:documentation>
                The outbound-resourceadapterType specifies information about an
                outbound resource adapter. The information includes fully
                qualified names of classes/interfaces required as part of the
                connector architecture specified contracts for connection
                management, level of transaction support provided, one or more
                authentication mechanisms supported and additional required
                security permissions.

                If there is no authentication-mechanism specified as part of
                resource adapter element then the resource adapter does not
                support any standard security authentication mechanisms as part
                of security contract. The application server ignores the
                security part of the system contracts in this case.
            </xs:documentation>
        </xs:annotation>

        <xs:sequence>
            <xs:element name="connection-definition"
                type="ger:connection-definitionType" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The connection-definitionType defines a set of
                        connection interfaces and classes pertaining to a
                        particular connection type. This also includes
                        configurable properties for ManagedConnectionFactory
                        instances that may be produced out of this set.

                        The name element uniquely identifies this instance.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <!-- **************************************************** -->

    <xs:complexType name="resourceadapterType">
        <xs:sequence>
            <xs:element name="resourceadapter-instance"
                type="ger:resourceadapter-instanceType" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The resourceadapter instance provide resource adapter
                        instance specific information like configuration
                        properties and workmanager implementation.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="outbound-resourceadapter"
                type="ger:outbound-resourceadapterType" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        The outbound-resourceadapterType specifies information
                        about an outbound resource adapter. The information
                        includes fully qualified names of classes/interfaces
                        required as part of the connector architecture specified
                        contracts for connection management, level of
                        transaction support provided, one or more authentication
                        mechanisms supported and additional required security
                        permissions.

                        If there is no authentication-mechanism specified as
                        part of resource adapter element then the resource
                        adapter does not support any standard security
                        authentication mechanisms as part of security contract.
                        The application server ignores the security part of the
                        system contracts in this case.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="adminobject" type="ger:adminobjectType"
                minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The element adminobject maps back to adminobject defined
                        in ra.xml. It provides specific instance information for
                        administer object defined in ra.xml. For example, if
                        topic is declared in the ra.xml this could provide topic
                        instance information.
                        An admin object configured here can implement ResourceAdapterAssociation.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="resourceadapter-instanceType">
        <xs:annotation>
            <xs:documentation>
                The resourceadapter instance info is put in a separate optional
                element to provide easier more consistent support for 1.0
                adapters. The resourceadapter instance provide resource adapter
                instance specific information like configuration properties and
                workmanager implementation.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="resourceadapter-name" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        The element resourceadapter-name provides a name for
                        this resource adapter, and it is used to index back to
                        the resourceadapter-name specified in ra.xml.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="config-property-setting"
                type="ger:config-property-settingType" minOccurs="0"
                maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>
                        The element config-property-setting specifies the set of
                        properties for resource adapter instance.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element ref="naming:workmanager">
                <xs:annotation>
                    <xs:documentation>
                        Reference to workmanager element defined in imported
                        "geronimo-naming-1.2.xsd"
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <!-- types borrowed from the j2ee schema.  We might want to centralize  these -->

    <xs:simpleType name="fully-qualified-classType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>

    <xs:complexType name="descriptionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute ref="xml:lang" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

</xs:schema>
