<?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:ee:1.2"
            xmlns="urn:jboss:domain:ee:1.2"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified"
            version="1.2">

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

    <xs:complexType name="subsystem">
        <xs:sequence>
            <xs:element name="global-modules" type="modulesType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="ear-subdeployments-isolated" default="false" type="ear-subdeployments-isolatedType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="spec-descriptor-property-replacement" type="descriptor-property-replacementType" minOccurs="0" maxOccurs="1" />
            <xs:element name="jboss-descriptor-property-replacement" type="descriptor-property-replacementType" minOccurs="0" maxOccurs="1" />
            <xs:element name="annotation-property-replacement" type="annotation-property-replacementType" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="modulesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="module" type="moduleType"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="moduleType">
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="slot" type="xs:string"/>
        <xs:attribute name="annotations" type="xs:boolean" use="optional" default="false"/>
        <xs:attribute name="meta-inf" type="xs:boolean" use="optional" default="false"/>
        <xs:attribute name="services" type="xs:boolean" use="optional" default="true"/>
    </xs:complexType>

    <xs:simpleType name="ear-subdeployments-isolatedType">
        <xs:annotation>
                <xs:documentation>
                    Flag indicating whether each of the subdeployments within a .ear can access classes belonging to
                    another subdeployment within the same .ear. Setting this to false, allows the subdeployments to
                    see classes belonging to other subdeployments within the .ear.
                    For example:
                    myapp.ear
                     |
                     |--- web.war
                     |
                     |--- ejb1.jar
                     |
                     |--- ejb2.jar

                    If the ear-subdeployments-isolated is set to false, then the classes in web.war can access classes
                    belonging to ejb1.jar and ejb2.jar. Similarly, classes from ejb1.jar can access classes from ejb2.jar
                    (and vice-versa).

                    *Note that this flag, has no effect on the isolated classloader of the .war file(s). i.e. irrespective
                    of whether this flag is set to true or false, the .war within a .ear will have a isolated classloader
                    and other subdeployments within that .ear will not be able to access classes from that .war. This is
                    as per spec*
                </xs:documentation>
        </xs:annotation>

        <xs:restriction base="xs:boolean"/>
    </xs:simpleType>

    <xs:simpleType name="descriptor-property-replacementType">
        <xs:annotation>
            <xs:documentation>
                Flag indicating whether system property replacement will be performed on a descriptor. This defaults to
                true, however it is disabled in the default configurations.

                Security Node: System properties etc are resolved in the security context of the application server
                itself, not the deployment that contains the file. This means that if you are running with a security
                manager and enable this property, a deployment can potentially access system properties or environment
                entries that the security manager would have otherwise prevented.
            </xs:documentation>
        </xs:annotation>

        <xs:restriction base="xs:boolean"/>
    </xs:simpleType>

    <xs:simpleType name="annotation-property-replacementType">
        <xs:annotation>
            <xs:documentation>
                Flag indicating whether system property replacement will be performed on an annotation. This defaults to
                true, however it is disabled in the default configurations.

                Security Node: System properties etc are resolved in the security context of the application server
                itself, not the deployment that contains the file. This means that if you are running with a security
                manager and enable this property, a deployment can potentially access system properties or environment
                entries that the security manager would have otherwise prevented.
            </xs:documentation>
        </xs:annotation>

        <xs:restriction base="xs:boolean" />
    </xs:simpleType>
</xs:schema>
