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

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:jboss:shared-session-config:1.0"
            xmlns="urn:jboss:shared-session-config:1.0"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified"
            version="1.0">

    <!-- Root element -->
    <xsd:element name="shared-session-config" type="sharedSessionType">
        <xsd:annotation>
            <xsd:documentation>
                Root element for the shared session config. If this is present in the root of
                an ear then all war's deployed in the ear will share a single session manager.
            </xsd:documentation>
        </xsd:annotation>
    </xsd:element>

    <xsd:complexType name="sharedSessionType">
        <xsd:sequence>
            <xsd:element name="max-active-sessions" type="xsd:string" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="session-config" type="session-configType" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="replication-config" type="replication-configType" minOccurs="0" maxOccurs="1"/>

        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="session-configType">
        <xsd:annotation>
            <xsd:documentation>

                The session-configType defines the session parameters
                for this web application.

                Used in: web-app

            </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="session-timeout"
                         type="xsd:integer"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        The session-timeout element defines the default
                        session timeout interval for all sessions created
                        in this web application. The specified timeout
                        must be expressed in a whole number of minutes.
                        If the timeout is 0 or less, the container ensures
                        the default behaviour of sessions is never to time
                        out. If this element is not specified, the container
                        must set its default timeout period.

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="cookie-config"
                         type="cookie-configType"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        The cookie-config element defines the configuration of the
                        session tracking cookies created by this web application.

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="tracking-mode"
                         type="tracking-modeType"
                         minOccurs="0"
                         maxOccurs="3">
                <xsd:annotation>
                    <xsd:documentation>

                        The tracking-mode element defines the tracking modes
                        for sessions created by this web application

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="id"
                       type="xsd:ID"/>
    </xsd:complexType>

    <xsd:simpleType name="tracking-modeType">
        <xsd:annotation>
            <xsd:documentation>

                The tracking modes for sessions created by this web
                application

                Used in: session-config

            </xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="COOKIE"/>
            <xsd:enumeration value="URL"/>
            <xsd:enumeration value="SSL"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="cookie-configType">
        <xsd:annotation>
            <xsd:documentation>

                The cookie-configType defines the configuration for the
                session tracking cookies of this web application.

                Used in: session-config

            </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="name"
                         type="xsd:string"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        The name that will be assigned to any session tracking
                        cookies created by this web application.
                        The default is JSESSIONID

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="domain"
                         type="xsd:string"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        The domain name that will be assigned to any session tracking
                        cookies created by this web application.

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="path"
                         type="xsd:string"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        The path that will be assigned to any session tracking
                        cookies created by this web application.

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="comment"
                         type="xsd:string"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        The comment that will be assigned to any session tracking
                        cookies created by this web application.

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="http-only"
                         type="xsd:boolean"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        Specifies whether any session tracking cookies created
                        by this web application will be marked as HttpOnly

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="secure"
                         type="xsd:boolean"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        Specifies whether any session tracking cookies created
                        by this web application will be marked as secure
                        even if the request that initiated the corresponding session
                        is using plain HTTP instead of HTTPS

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="max-age"
                         type="xsd:integer"
                         minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>

                        The lifetime (in seconds) that will be assigned to any
                        session tracking cookies created by this web application.
                        Default is -1

                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="id"
                       type="xsd:ID"/>
    </xsd:complexType>


    <xsd:complexType name="replication-configType">
        <xsd:annotation>
            <xsd:documentation>
                <![CDATA[

            HTTP Session clustering configuration (optional tags)

            ]]>
            </xsd:documentation>
        </xsd:annotation>

        <xsd:sequence>
            <xsd:element name="cache-name" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>
                        <![CDATA[

                    Clustering only: Specifies the name of the Infinispan container and cache in which to store session data.

                    Default value, if not explicitly set, is determined by the application server.

                    To use a specific cache within a cache container, use the form "container.cache".
                    If unqualified, the default cache of the specified container is used.

                    e.g. <cache-name>web</cache-name>
                         <cache-name>web.dist</cache-name>

                    ]]>
                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="replication-granularity" type="replication-granularityType" minOccurs="0"
                         default="SESSION">
                <xsd:annotation>
                    <xsd:documentation>
                        <![CDATA[

                    Clustering only: Determines the session replication granularity level.
                    Possible values are:
                            1 - "SESSION" (default)
                            2 - "ATTRIBUTE"

                    Using SESSION granularity, all session attributes are replicated if any were modified within
                    the scrope of a request. This policy is required if an object reference is shared by multiple
                    session attributes. However, this can be inefficient if session attributes are sufficiently
                    large and/org are modified infrequently, since all attributes must be replicated reglardless
                    of  whether they were modified or not.

                    Using ATTRIBUTE granularity, only those attributes that were modified within the scope of a
                    request are replicated. This policy is not appropriate if an object reference is shared by
                    multiple session attributes. This can be more efficient than SESSION granularity if the
                    session attributes are sufficiently large and/or modified infrequently.

                    Examples:
                          <replication-granularity>SESSION</replication-granularity>
                       or
                          <replication-granularity>ATTRIBUTE</replication-granularity>

                    ]]>
                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:simpleType name="replication-granularityType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="SESSION"/>
            <xsd:enumeration value="ATTRIBUTE"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

