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

<!--
  ~ Copyright The WildFly Authors
  ~ SPDX-License-Identifier: Apache-2.0
  -->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:jboss:domain:transactions:1.4"
            xmlns="urn:jboss:domain:transactions:1.4"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified"
            version="1.4">

    <!-- The transaction subsystem root element -->
    <xs:element name="subsystem" type="subsystem"/>

    <xs:complexType name="subsystem">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The configuration of the transactions subsystem.
            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="core-environment" type="core-environment" maxOccurs="1"/>
            <xs:element name="recovery-environment" type="recovery-environment" maxOccurs="1"/>
            <xs:element name="coordinator-environment" type="coordinator-environment" minOccurs="0" maxOccurs="1"/>
            <xs:element name="object-store" type="object-store" minOccurs="0" maxOccurs="1"/>
            <xs:element name="jts" type="jts-Type" minOccurs="0" maxOccurs="1"/>
            <xs:choice minOccurs="0" maxOccurs="1">
                <xs:element name="use-hornetq-store" type="use-hornetq-store-Type" minOccurs="0" maxOccurs="1"/>
                <xs:element name="jdbc-store" type="jdbc-store-Type" minOccurs="0" maxOccurs="1"/>
            </xs:choice>
        </xs:sequence>


    </xs:complexType>

    <xs:complexType name="recovery-environment">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The recovery environment configuration.

                The "socket-binding" attribute is used to reference the correct socket binding to use for the
                recovery environment.
                The "status-socket-binding" attribute is used to reference the correct socket binding to use for the
                transaction status manager.
                The "recovery-listener" attribute sets if recovery system should listen on a network socket or not.
            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="socket-binding" type="xs:string" />
        <xs:attribute name="status-socket-binding" type="xs:string" />
        <xs:attribute name="recovery-listener" type="xs:boolean" default="false"/>
    </xs:complexType>

    <xs:complexType name="core-environment">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The core environment configuration.

                The process-id element specifies the process id implemention.
                The "node-identifier" attribute is used to set the node identifier on the core environment.

                The "path" attribute denotes a relative or absolute filesystem path denoting where the transaction
                manager core should store data.

                The "relative-to" attribute references a global path configuration in the domain model, defaulting
                to the JBoss Application Server data directory (jboss.server.data.dir). If the value of the "path" attribute
                does not specify an absolute pathname, it will treated as relative to this path.
            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:all>
            <xs:element name="process-id" type="process-id" />
        </xs:all>
        <xs:attribute name="node-identifier" type="xs:string" default="1"/>
        <xs:attribute name="path" type="xs:string" default="var"/>
        <xs:attribute name="relative-to" type="xs:string" default="jboss.server.data.dir"/>
    </xs:complexType>
    <xs:complexType name="process-id">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The process identifer implementation
                The "node-identifier" attribute is used to set the node identifier on the core environment.
                The "socket-process-id-max-ports" attribute is used to set the max ports on the core environment.
            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:choice>
            <xs:element name="uuid" type="uuid" />
            <xs:element name="socket" type="socket-id" />
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="uuid">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The UUID based process identifer implementation
            ]]>
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>
    <xs:complexType name="socket-id">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The socket based process identifer implementation
                The "socket-binding" attribute is used to specify the port to bind to.
                The "socket-process-id-max-ports" attribute is used to set the max ports on the core environment.
            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="socket-binding" type="xs:string" use="required"/>
        <xs:attribute name="socket-process-id-max-ports" type="xs:int" default="10" />
    </xs:complexType>

    <xs:attribute name="socket-process-id-max-ports" type="xs:int" default="10" />

    <xs:complexType name="coordinator-environment">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The coordinator environment configuration.
                enable-statistics - if recording of transaction statistics is enabled, false otherwise.
                enable-tsm-status - if the transaction status manager (TSM) service, needed for out of process recovery, should be provided or not.
                default-timeout - the default transaction lifetime, in seconds.
            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="enable-statistics" type="xs:boolean" default="false"/>
        <xs:attribute name="enable-tsm-status" type="xs:boolean" default="false"/>
        <xs:attribute name="default-timeout" type="xs:int" default="300" />
    </xs:complexType>

    <xs:complexType name="object-store">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The object store configuration.

                The "path" attribute denotes a relative or absolute filesystem path denoting where the transaction
                manager object store should store data.

                The "relative-to" attribute references a global path configuration in the domain model, defaulting
                to the JBoss Application Server data directory (jboss.server.data.dir). If the value of the "path" attribute
                does not specify an absolute pathname, it will treated as relative to this path.
            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="path" type="xs:string" default="tx-object-store"/>
        <xs:attribute name="relative-to" type="xs:string" default="jboss.server.data.dir" />
    </xs:complexType>

    <xs:complexType name="jts-Type">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The flag to enable JTS.
            ]]>
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="use-hornetq-store-Type">
        <xs:annotation>
            <xs:documentation>
            <![CDATA[
                The flag to enable the hornetq transaction log store.
            ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="enable-async-io" type="xs:boolean" use="optional" default="false">
            <xs:annotation>
                <xs:documentation>
                    <![CDATA[
                        Enable AsyncIO for the hornetq transaction log store.
                        ]]>
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="jdbc-store-Type">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
                        The presence of this tag enable the jdbc transaction log store.
                    ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:all>
            <xs:element name="action" type="jdbc-store-settings-Type" minOccurs="0" maxOccurs="1">
                <xs:annotation>
                    <xs:documentation>
                        <![CDATA[
                             Configure jdbc store for default action store. If not present defaults are used.
                                ]]>
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="communication" type="jdbc-store-settings-Type" minOccurs="0" maxOccurs="1">
                <xs:annotation>
                    <xs:documentation>
                        <![CDATA[
                            Configure jdbc store for communication store. If not present defaults are used.
                                ]]>
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="state" type="jdbc-store-settings-Type" minOccurs="0" maxOccurs="1">
                <xs:annotation>
                    <xs:documentation>
                        <![CDATA[
                           Configure jdbc store for state store. If not present defaults are used.
                                ]]>
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:all>
        <xs:attribute name="datasource-jndi-name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    <![CDATA[
                        Configure datasource jndi used to connect for jdbc store
                        ]]>
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="jdbc-store-settings-Type">
            <xs:annotation>
                <xs:documentation>
                    <![CDATA[
                            Settings for jdbc store
                        ]]>
                </xs:documentation>
            </xs:annotation>
            <xs:attribute name="table-prefix" type="xs:string" use="optional" />
            <xs:attribute name="drop-table" type="xs:boolean" use="optional" default="false"/>
        </xs:complexType>

</xs:schema>
