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

<!--
  ~ JBoss, Home of Professional Open Source.
  ~ Copyright 2010, Red Hat, Inc., and individual contributors
  ~ as indicated by the @author tags. See the copyright.txt file in the
  ~ distribution for a full listing of individual contributors.
  ~
  ~ This is free software; you can redistribute it and/or modify it
  ~ under the terms of the GNU Lesser General Public License as
  ~ published by the Free Software Foundation; either version 2.1 of
  ~ the License, or (at your option) any later version.
  ~
  ~ This software is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  ~ Lesser General Public License for more details.
  ~
  ~ You should have received a copy of the GNU Lesser General Public
  ~ License along with this software; if not, write to the Free
  ~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  -->

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


    <xs:element name="domain">
        <xs:annotation>
            <xs:documentation>
                Root element for the master document specifying the core configuration
                for the servers in a domain. There should be one such master
                document per domain, available to the host controller that
                is configured to act as the domain controller.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="extensions" type="extensionsType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="system-properties" type="properties-with-boottime" minOccurs="0" maxOccurs="1"/>
                <xs:element name="paths" type="named-pathsType" minOccurs="0" maxOccurs="1" />
                <xs:element name="profiles" type="profilesType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="interfaces" type="named-interfacesType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="socket-binding-groups" type="socket-binding-groupsType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="deployments" type="domain-deploymentsType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="server-groups" type="server-groupsType" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="host">
        <xs:annotation>
            <xs:documentation>
                Root element for a document configuring a host controller and
                the group of servers under the control of that host controller.
                The standard usage would be for a domain to have one such host controller
                on each physical (or virtual) host machine. Emphasis in this
                document is on enumerating the servers, configuring items that
                are specific to the host environment (e.g. IP addresses), and
                on any server-specific configuration settings.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="system-properties" type="properties-with-boottime" minOccurs="0"/>
                <xs:element name="paths" type="specified-pathsType" minOccurs="0" maxOccurs="1" />
                <xs:element name="management" type="managementType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="domain-controller" type="domain-controllerType"/>
                <xs:element name="interfaces" type="specified-interfacesType" minOccurs="0"/>
                <xs:element name="jvms" type="jvmsType" minOccurs="0"/>
                <xs:element name="servers" type="serversType" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="optional">
                <xs:annotation>
                    <xs:documentation>
                        The name to use for this host's host controller. Must be
                        unique across the domain. If not set, defaults to the
                        runtime value of InetAddress.getLocalHost().getHostName().
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="server">
        <xs:annotation>
            <xs:documentation>
                Root element for a document specifying the configuration
                of a single "standalone" server that does not operate
                as part of a domain.

                Note that this element is distinct from the 'serverType'
                specified in this schema. The latter type forms part of the
                configuration of a server that operates as part of a domain.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="extensions" type="extensionsType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="system-properties" type="properties" minOccurs="0" maxOccurs="1"/>
                <xs:element name="paths" type="specified-pathsType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="management" type="managementType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="profile" type="standalone-profileType" minOccurs="0"/>
                <xs:element name="interfaces" type="specified-interfacesType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="socket-binding-group" type="standalone-socket-binding-groupType" minOccurs="0" maxOccurs="1"/>
                <xs:element name="deployments" type="server-deploymentsType" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="optional">
                <xs:annotation>
                    <xs:documentation>
                        The name to use for this server. If not set, defaults to
                        the runtime value of InetAddress.getLocalHost().getHostName().
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="domain-managementType">
        <xs:annotation>
            <xs:documentation>
                Domain-wide default configuration settings for the management of standalone servers and a Host Controller.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="security-realms" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="security-realm" type="security-realmType" minOccurs="1"
                                    maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="outbound-connections" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                      <xs:element name="ldap" type="ldapType" minOccurs="1" /> <!-- TODO minOccurs only while ldap is only supported connection. -->
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="managementType">
        <xs:annotation>
            <xs:documentation>
                The centralized configuration for the management of standalone servers and a Host Controller.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:extension base="domain-managementType">
                <xs:sequence>
                    <xs:element name="management-interfaces" type="management-interfacesType" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="ldapType"> <!-- TODO - May extend from a common connection type for name -->
        <xs:annotation>
            <xs:documentation>
                The LDAP connection definition.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The name of this connection.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="url" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The URL to connect to ldap.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <!-- TODO - Later will be optional if we support GSSAPI to connect to LDAP -->
        <xs:attribute name="search-dn" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The distinguished name to use when connecting to LDAP to perform searches.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="search-credential" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The credential to use when connecting to perform a search.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <!-- TODO - May drop this and just allow free name/value properties for extension. -->
        <xs:attribute name="initial-context-factory" type="xs:string" default="com.sun.jndi.ldap.LdapCtxFactory">
            <xs:annotation>
                <xs:documentation>
                    The initial context factory to establish the LdapContext.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="security-realmType">
        <xs:annotation>
            <xs:documentation>
                Configuration of a security realm for securing access to the management interfaces.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="server-identities" type="server-identitiesType" minOccurs="0" />
            <xs:element name="authentication" type="authenticationType" minOccurs="0" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The name of this security-realm, each security-realm must be assigned a unique name.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="server-identitiesType">
        <xs:annotation>
            <xs:documentation>
                Configuration of the identities that represent the server.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
          <xs:element name="ssl" type="sslType" minOccurs="0" />
          <xs:element name="secret" type="secretType" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="secretType">
        <xs:annotation>
            <xs:documentation>
                Configuration of the SSL identity of this server.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="value" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The secret / password - Base64 Encoded
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="sslType">
        <xs:annotation>
            <xs:documentation>
                Configuration of the SSL identity of this server.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="keystore" type="keystoreType" />
        </xs:sequence>
        <xs:attribute name="protocol" type="xs:string" default="TLS">
            <xs:annotation>
                <xs:documentation>
                    The protocol to use when creating the SSLContext.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="keystoreType">
        <xs:annotation>
            <xs:documentation>
                The keystore configuration for the server.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="relative-to" use="optional" type="xs:string">
            <xs:annotation>
                <xs:documentation>
                    The name of another previously named path, or of one of the
                    standard paths provided by the system. If 'relative-to' is
                    provided, the value of the 'path' attribute is treated as
                    relative to the path specified by this attribute.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="path" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The path of the keystore.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="password" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The password to open the keystore.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="authenticationType">
        <xs:annotation>
            <xs:documentation>
                Configuration of the server side authentication mechanisms.
            </xs:documentation>
        </xs:annotation>
        <xs:choice>
            <xs:element name="ldap" type="ldapAuthenticationType" minOccurs="0" />
            <xs:element name="properties" type="propertiesAuthenticationType" minOccurs="0" />
            <xs:element name="users" type="usersAuthenticationType" minOccurs="0" />
        </xs:choice>
        <xs:attribute name="useDomainController" type="xs:boolean" default="false">
            <xs:annotation>
                <xs:documentation>
                    Should the request delegate to the domain controller or handle the authentication locally.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="ldapAuthenticationType">
        <xs:annotation>
            <xs:documentation>
                Definition to use LDAP as the user repository.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="connection" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The name of the connection to use to connect to LDAP.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="base-dn" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The base distinguished name to commence the search for the user.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="username-attribute" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The name of the attribute to search for the user.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="recursive" type="xs:boolean" default="false">
            <xs:annotation>
                <xs:documentation>
                    Should the search be recursive.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="user-dn" type="xs:string" default="dn">
            <xs:annotation>
                <xs:documentation>
                    The name of the attribute which is the users distinguished name.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>


    <xs:complexType name="usersAuthenticationType">
           <xs:annotation>
            <xs:documentation>
                A set of users
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="user" type="userType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="userType">
        <xs:annotation>
            <xs:documentation>
                A single user.
            </xs:documentation>
        </xs:annotation>
        <xs:choice>
            <xs:element name="password" type="xs:string" />
        </xs:choice>
        <xs:attribute name="username" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The users username.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="propertiesAuthenticationType">
        <xs:annotation>
            <xs:documentation>
                Declaration of users stored within properties files.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="relative-to" use="optional" type="xs:string">
            <xs:annotation>
                <xs:documentation>
                    The name of another previously named path, or of one of the
                    standard paths provided by the system. If 'relative-to' is
                    provided, the value of the 'path' attribute is treated as
                    relative to the path specified by this attribute.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="path" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The path of the properties file containing the users.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="management-interfaceType">
        <xs:annotation>
            <xs:documentation>
                Configuration of a host's or standalone server's exposed management interface.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="interface" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    Network interface on which the host's socket for
                    management communication should be opened.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="port" type="xs:int" use="optional">
            <xs:annotation>
                <xs:documentation>
                    Port on which the host's socket for
                    management communication should be opened.

                    If not specified the port will not be opened.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="secure-port" type="xs:int" use="optional">
            <xs:annotation>
                <xs:documentation>
                    Secure port on which the host's socket for
                    management communication should be opened.

                    If not specified the port will not be opened.

                    If specified the security-realm will be required to obtain
                    the SSL configuration.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="security-realm" type="xs:string" use="optional">
            <xs:annotation>
                <xs:documentation>
                    The security realm to use for this management interface, the capabilities
                    of the security realm will be queried to identify the authentication mechanism(s) to
                    offer.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="management-interfacesType">
        <xs:all minOccurs="0">
            <xs:element name="native-interface" type="management-interfaceType"/>
            <xs:element name="http-interface" type="management-interfaceType"/>
        </xs:all>
    </xs:complexType>

    <xs:complexType name="domain-controllerType">
        <xs:choice>
            <xs:element name="local" type="domain-controller-localType"/>
            <xs:element name="remote" type="domain-controller-remoteType"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="domain-controller-localType" />

    <xs:complexType name="domain-controller-remoteType">
         <xs:attribute name="host" type="xs:string" use="required" />
         <xs:attribute name="port" type="xs:integer" use="required" />
         <xs:attribute name="security-realm" type="xs:string" use="optional" />
    </xs:complexType>

    <xs:complexType name="serversType">
        <xs:sequence>
            <xs:element name="server" type="serverType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="serverType">
        <xs:all>
            <xs:element name="paths" type="specified-pathsType" minOccurs="0" maxOccurs="1" />

            <xs:element name="interface-specs" type="specified-interfacesType" minOccurs="0"/>
            <xs:element name="socket-binding-group" type="socket-binding-group-refType" minOccurs="0"/>

            <!--<xs:element name="loggers" type="loggersType" minOccurs="0"/>-->
            <xs:element name="system-properties" type="properties-with-boottime" minOccurs="0"/>
            <xs:element name="jvm" minOccurs="0" type="serverJvmType"/>
        </xs:all>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="group" type="xs:string" use="required"/>
        <xs:attribute name="auto-start" type="xs:boolean" default="true"/>
    </xs:complexType>

    <xs:complexType name="extensionsType">
        <xs:annotation>
            <xs:documentation>Contains a list of extension modules.</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="extension" type="extensionType" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="extensionType">
        <xs:annotation>
            <xs:documentation>
                A module that extends the standard capabilities of a domain
                or a standalone server.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="module" use="required" type="xs:string">
            <xs:annotation>
                <xs:documentation>The name of the module</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="server-groupsType">
        <xs:sequence>
            <xs:element name="server-group" type="server-groupType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="server-groupType">
        <xs:sequence>
            <xs:element name="jvm" type="namedJvmType" minOccurs="0"/>
            <xs:element name="socket-binding-group" type="socket-binding-group-refType" minOccurs="1"/>

            <xs:element name="deployments" type="server-groupDeploymentsType" minOccurs="0"/>

            <xs:element name="system-properties" minOccurs="0" type="properties-with-boottime"/>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string">
            <xs:annotation>
                <xs:documentation>
                    The name of the server group
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="profile" type="xs:string">
            <xs:annotation>
                <xs:documentation>
                    The name of the profile this server is running.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="server-groupDeploymentsType">
        <xs:annotation>
            <xs:documentation>Contains a list of deployments that have been mapped to a server-group.</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="deployment" type="base-deploymentType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="base-deploymentType">
        <xs:attribute name="name" use="required">
            <xs:annotation>
                <xs:documentation>Unique identifier of the deployment. Must be unique across all deployments.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="runtime-name" use="required">
            <xs:annotation>
                <xs:documentation>Name by which the deployment will be known within a running server.of the deployment.
                    Does not need to be unique across all deployments in the domain, although it must be unique within
                    an individual server. For example, two different deployments running on different servers in
                    the domain could both have a 'runtime-name' of 'example.war', with one having a 'name'
                    of 'example.war_v1' and another with an 'name' of 'example.war_v2'.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType><xs:complexType name="server-deploymentsType">
    <xs:annotation>
        <xs:documentation>Contains a list of deployments that have been mapped to a server.</xs:documentation>
    </xs:annotation>
    <xs:sequence>
        <xs:element name="deployment" type="server-deploymentType" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

    <xs:complexType name="server-deploymentType">
        <xs:annotation>
            <xs:documentation>A deployment that has been mapped to a server.</xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:extension base="base-deploymentType">
                <xs:sequence>
                    <!-- TODO: maxOccurs should be unbounded once overlays are in place -->
                    <xs:choice maxOccurs="1">
                        <xs:element name="content" type="contentType"/>
                        <xs:element name="fs-archive" type="fs-archiveType"/>
                        <xs:element name="fs-exploded" type="fs-explodedType"/>
                    </xs:choice>
                </xs:sequence>
                <!--  TODO clarify what a value of 'false' means -->
                <xs:attribute name="enabled" use="optional" type="xs:boolean" default="true">
                    <xs:annotation>
                        <xs:documentation>Whether the deployment deploy automatically when the server starts up.
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="contentType">
        <xs:attribute name="sha1" use="required">
            <xs:annotation>
                <xs:documentation>The checksum of the content</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="fs-archiveType">
        <xs:annotation>
            <xs:documentation>Archived content found on the filesystem</xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:extension base="fs-baseType"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="fs-baseType">
        <xs:complexContent>
            <xs:extension base="pathType"/>
        </xs:complexContent>
        <!-- TODO: make path required
        <xs:complexContent>
            <xs:restriction base="pathType">
                <xs:attribute name="path" use="required"/>
            </xs:restriction>
        </xs:complexContent>
        -->
    </xs:complexType>

    <xs:complexType name="fs-explodedType">
        <xs:annotation>
            <xs:documentation>Exploded content found on the filesystem</xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:extension base="fs-baseType"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="domain-deploymentsType">
        <xs:annotation>
            <xs:documentation>Contains a list of domain-level deployments</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="deployment" type="domain-deploymentType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="domain-deploymentType">
        <xs:annotation>
            <xs:documentation>Deployment represents anything that can be deployed (e.g. an application such as EJB-JAR,
                WAR, EAR,
                any kind of standard archive such as RAR or JBoss-specific deployment),
                which can be enabled or disabled on a domain level.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:extension base="base-deploymentType">
                <xs:sequence>
                    <!-- TODO: maxOccurs should be unbounded once overlays are in place -->
                    <xs:choice maxOccurs="1">
                        <xs:element name="content" type="contentType"/>
                        <xs:element name="fs-archive" type="fs-archiveType"/>
                        <xs:element name="fs-exploded" type="fs-explodedType"/>
                    </xs:choice>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- TODO this is not used anywhere yet -->
    <xs:complexType name="clustersType">
        <xs:complexContent>
            <xs:extension base="server-groupType">
                <xs:sequence>
                    <xs:element name="partition-name" type="xs:string"/>
                    <xs:element name="state-transfer-timeout" type="xs:integer"/>
                    <xs:element name="method-call-timeout" type="xs:integer"/>
                </xs:sequence>
                <xs:attribute name="category" type="xs:string" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- domain-configuration related definitions -->
    <xs:complexType name="domain-configurationType">
        <xs:annotation>
            <xs:documentation>The domain controller/server bootstrap configuration</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element ref="bootstrapURI"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="bootstrapURI" type="xs:string">
        <xs:annotation>
            <xs:documentation>The URI for bootstrapping a domain server</xs:documentation>
        </xs:annotation>
    </xs:element>

    <xs:complexType name="profilesType">
        <xs:annotation>
            <xs:documentation>Contains a list of profiles available for use in the domain</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="profile" type="domain-profileType" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="domain-profileType">
        <xs:annotation>
            <xs:documentation>Contains a list of subsystems</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="include" type="profile-includeType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>A profile declaration may include configuration
                        elements from other namespaces for the subsystems that make up the profile.
                    </xs:documentation>
                </xs:annotation>
            </xs:any>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>Name of the profile</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="profile-includeType">
        <xs:annotation>
            <xs:documentation>Specifies that a contents of a named profile are to be included in
                the profile whose definition includes this type.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="profile" use="required">
            <xs:annotation>
                <xs:documentation>Name of the profile to include</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="standalone-profileType">
        <xs:annotation>
            <xs:documentation>Contains a list of subsystems</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:choice minOccurs="1" maxOccurs="unbounded">
                <xs:any namespace="##other">
                    <xs:annotation>
                        <xs:documentation>A profile declaration may include configuration
                            elements from other namespaces for the subsystems that make up the profile.
                        </xs:documentation>
                    </xs:annotation>
                </xs:any>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>

    <!-- general socket definition -->
    <xs:complexType name="socket-binding-groupsType">
        <xs:annotation>
            <xs:documentation>Contains a list of socket binding groups</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="socket-binding-group" type="socket-binding-groupType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="socket-binding-groupType">
        <xs:annotation>
            <xs:documentation>Contains a list of socket configurations</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="include" type="socket-binding-group-includeType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="socket-binding" type="socket-bindingType" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="default-interface" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    Name of an interface that should be used as the interface for
                    any sockets that do not explicitly declare one.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="socket-binding-group-includeType">
        <xs:annotation>
            <xs:documentation>Specifies that a contents of a named socket-binding-group are to be included in
                the socket-binding-group whose definition includes this type.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="socket-binding-group" use="required">
            <xs:annotation>
                <xs:documentation>Name of the socket-binding-group to include</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="standalone-socket-binding-groupType">
        <xs:annotation>
            <xs:documentation>Contains a list of socket configurations</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="socket-binding" type="socket-bindingType" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="default-interface" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    Name of an interface that should be used as the interface for
                    any sockets that do not explicitly declare one.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
	    <xs:attribute name="port-offset" type="xs:int" use="optional" default="0">
	        <xs:annotation>
                <xs:documentation>
	                    Increment to apply to the base port values defined in the
	                    socket group to derive the values to use on this
	                    server.
	            </xs:documentation>
	        </xs:annotation>
	    </xs:attribute>
    </xs:complexType>

    <xs:complexType name="socket-bindingType">
        <xs:annotation>
            <xs:documentation>Configuration information for a socket.</xs:documentation>
        </xs:annotation>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="interface" type="xs:string" use="optional">
            <xs:annotation>
                <xs:documentation>
                    Name of the interface to which the socket should be bound, or, for multicast
                    sockets, the interface on which it should listen. This should
                    be one of the declared interfaces.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="port" type="xs:unsignedShort" use="optional" default="0">
            <xs:annotation>
                <xs:documentation>
                    Number of the port to which the socket should be bound.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="fixed-port" type="xs:boolean" use="optional" default="false">
            <xs:annotation>
                <xs:documentation>
                    Whether the port value should remain fixed even if numerically offsets
                    are applied to the other sockets in the socket group..
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="multicast-address" type="xs:string" use="optional">
            <xs:annotation>
                <xs:documentation>
                    Multicast address on which the socket should receive multicast
                    traffic. If unspecified, the socket will not be configured
                    to receive multicast.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="multicast-port" type="xs:positiveInteger" use="optional">
            <xs:annotation>
                <xs:documentation>
                    Port on which the socket should receive multicast
                    traffic. Must be configured if 'multicast-address' is configured.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="socket-binding-group-refType">
        <xs:attribute name="ref" type="xs:string">
            <xs:annotation>
                <xs:documentation>
                    The socket group to use for the server group or server.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="port-offset" type="xs:int" default="0">
            <xs:annotation>
                <xs:documentation>
                    Increment to apply to the base port values defined in the
                    referenced socket group to derive the values to use on this
                    server.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>


    <xs:complexType name="named-interfacesType">
        <xs:annotation>
            <xs:documentation>
                A list of named network interfaces. The interfaces may or may
                not be fully specified (i.e. include criteria on how to determine
                their IP address.)
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="interface" type="named-interfaceType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <!-- TODO make this and specified-interfaceType the same except for interface-criteriaGroup minOccurs -->
    <xs:complexType name="named-interfaceType">
        <xs:annotation>
            <xs:documentation>
                A named network interface, but without any criteria
                for determining the IP address to associate with that interface.
                Acts as a placeholder in the model (e.g. at the domain level)
                until a fully specified interface definition is applied at a
                lower level (e.g. at the server level, where available addresses
                are known.)
            </xs:documentation>
        </xs:annotation>
        <xs:group ref="interface-criteriaGroup" minOccurs="0"/>
        <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:complexType name="specified-interfacesType">
        <xs:annotation>
            <xs:documentation>
                A list of fully specified named network interfaces.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="interface" type="specified-interfaceType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="specified-interfaceType">
        <xs:annotation>
            <xs:documentation>
                A named network interface, along with required criteria
                for determining the IP address to associate with that interface.
            </xs:documentation>
        </xs:annotation>
        <xs:group ref="interface-criteriaGroup" minOccurs="1"/>
        <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:group name="interface-criteriaGroup">
        <xs:annotation>
            <xs:documentation>
                A set of criteria that can be used at runtime to determine
                what IP address to use for an interface.
            </xs:documentation>
        </xs:annotation>
        <xs:choice>
            <xs:element name="any-address" type="any-addressType"/>
            <xs:element name="any-ipv6-address" type="any-ipv6-addressType"/>
            <xs:element name="any-ipv4-address" type="any-ipv4-addressType"/>
            <xs:choice maxOccurs="unbounded">
                <xs:element name="inet-address" type="inet-addressType"/>
                <xs:element name="loopback" type="loopbackType"/>
                <xs:element name="loopback-address" type="loopback-addressType"/>
                <xs:element name="multicast" type="multicastType"/>
                <xs:element name="point-to-point" type="point-to-pointType"/>
                <xs:element name="virtual" type="interface-virtualType"/>
                <xs:element name="up" type="interface-upType"/>
                <xs:element name="public-address" type="public-addressType"/>
                <xs:element name="link-local-address" type="link-local-addressType"/>
                <xs:element name="site-local-address" type="site-local-addressType"/>
                <xs:element name="nic" type="nicType"/>
                <xs:element name="nic-match" type="nic-matchType"/>
                <xs:element name="subnet-match" type="subnet-matchType"/>
                <xs:element name="not" type="address-exclusionType"/>
                <xs:element name="any" type="address-exclusionType"/>
            </xs:choice>
        </xs:choice>
    </xs:group>

    <xs:complexType name="inet-addressType">
        <xs:attribute name="value" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    Either a IP address in IPv6 or IPv4 dotted decimal notation,
                    or a hostname that can be resolved to an IP address.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="nicType">
        <xs:attribute name="name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The name of a network interface (e.g. eth0, eth1, lo).
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="nic-matchType">
        <xs:attribute name="pattern" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    A regular expression against which the names of the network
                    interfaces available on the machine can be matched to find
                    an acceptable interface.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="subnet-matchType">
        <xs:attribute name="value" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    A network IP address and the number of bits in the
                    address' network prefix, written in "slash notation";
                    e.g. "192.168.0.0/16".
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="address-exclusionType">
        <xs:choice>
            <xs:element name="inet-address" type="inet-addressType"/>
            <xs:element name="loopback" type="loopbackType"/>
            <xs:element name="loopback-address" type="loopback-addressType"/>
            <xs:element name="multicast" type="multicastType"/>
            <xs:element name="point-to-point" type="point-to-pointType"/>
            <xs:element name="virtual" type="interface-virtualType"/>
            <xs:element name="up" type="interface-upType"/>
            <xs:element name="public-address" type="public-addressType"/>
            <xs:element name="link-local-address" type="link-local-addressType"/>
            <xs:element name="site-local-address" type="site-local-addressType"/>
            <xs:element name="nic" type="nicType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="nic-match" type="nic-matchType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="subnet-match" type="subnet-matchType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="loopbackType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that part of the selection criteria
                for an interface should be whether or not it is a loopback
                interface.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="loopback-addressType">
        <xs:annotation>
            <xs:documentation>
                A loopback address that may not actually configured on the machine's loopback interface.
                Differs from inet-addressType in that the given value will be used even if no NIC can
                be found that has the IP address associated with it.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="value" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    An IP address in IPv6 or IPv4 dotted decimal notation.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="multicastType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that part of the selection criteria
                for an interface should be whether or not it supports
                multicast.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="point-to-pointType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that part of the selection criteria
                for an interface should be whether or not it is a point-to-point
                interface.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="interface-upType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that part of the selection criteria
                for an interface should be whether or not it is currently up.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="interface-virtualType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that part of the selection criteria
                for an interface should be whether or not it is a virtual
                interface.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="public-addressType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that part of the selection criteria
                for an interface should be whether or not it has a publicly
                routable address.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="site-local-addressType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that part of the selection criteria
                for an interface should be whether or not an address associated
                with it is site-local.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="link-local-addressType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that part of the selection criteria
                for an interface should be whether or not an address associated
                with it is link-local.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="any-ipv6-addressType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that sockets using this interface
                should be bound to the IPv6 wildcard address (::).
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="any-ipv4-addressType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that sockets using this interface
                should be bound to the IPv4 wildcard address (0.0.0.0).
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="any-addressType">
        <xs:annotation>
            <xs:documentation>
                Empty element indicating that sockets using this interface
                should be bound to a wildcard address. The IPv6 wildcard
                address (::) will be used unless the java.net.preferIpV4Stack
                system property is set to true, in which case the IPv4
                wildcard address (0.0.0.0) will be used. If a socket is
                bound to an IPv6 anylocal address on a dual-stack machine,
                it can accept both IPv6 and IPv4 traffic; if it is bound to
                an IPv4 (IPv4-mapped) anylocal address, it can only accept
                IPv4 traffic.
            </xs:documentation>
        </xs:annotation>
    </xs:complexType>

    <xs:complexType name="socketType">
        <xs:annotation>
            <xs:documentation>Configuration information for a socket.</xs:documentation>
        </xs:annotation>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="interface" type="xs:string" use="optional">
            <xs:annotation>
                <xs:documentation>
                    Name of the interface to which the socket should be bound, or, for multicast
                    sockets, the interface on which it should listen. This should
                    be one of the declared interfaces.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="port" type="xs:unsignedShort" use="optional" default="0">
            <xs:annotation>
                <xs:documentation>
                    Number of the port to which the socket should be bound.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="fixed-port" type="xs:boolean" use="optional" default="false">
            <xs:annotation>
                <xs:documentation>
                    Whether the port value should remain fixed even if numerically offsets
                    are applied to the other sockets in the socket group..
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="multicast-address" type="xs:string" use="optional">
            <xs:annotation>
                <xs:documentation>
                    Multicast address on which the socket should receive multicast
                    traffic. If unspecified, the socket will not be configured
                    to receive multicast.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="multicast-port" type="xs:positiveInteger" use="optional">
            <xs:annotation>
                <xs:documentation>
                    Port on which the socket should receive multicast
                    traffic. If unspecified, the socket will not be configured
                    to receive multicast.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <!-- Path configurations -->
    <xs:complexType name="named-pathsType">
        <xs:annotation>
            <xs:documentation>
                A list of named filesystem paths. The paths may or may
                not be fully specified (i.e. include the actual paths.)
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="path" type="named-pathType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="named-pathType">
        <xs:annotation>
            <xs:documentation>
                A named filesystem path, but without a requirement to specify
                the actual path. If no actual path is specified, acts as a
                as a placeholder in the model (e.g. at the domain level)
                until a fully specified path definition is applied at a
                lower level (e.g. at the host level, where available addresses
                are known.)
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:extension base="pathType">
                <xs:attribute name="name" type="xs:string" use="required">
                    <xs:annotation>
                        <xs:documentation>
                        The name of the path. Cannot be one of the standard fixed paths
                        provided by the system:

                        jboss.home - the root directory of the JBoss AS distribution
                        user.home - user's home directory
                        user.dir - user's current working directory
                        java.home - java installation directory
                        jboss.server.base.dir - root directory for an individual server
                                                instance

                        Note that the system provides other standard paths that can be
                        overridden by declaring them in the configuration file. See
                        the 'relative-to' attribute documentation for a complete
                        list of standard paths.
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="pathType">
        <xs:attribute name="path">
            <xs:annotation>
                <xs:documentation>
                The actual filesystem path. Treated as an absolute path, unless the
                'relative-to' attribute is specified, in which case the value
                is treated as relative to that path.

                If treated as an absolute path, the actual runtime pathname specified
                by the value of this attribute will be determined as follows:

                If this value is already absolute, then the value is directly
                used.  Otherwise the runtime pathname is resolved in a
                system-dependent way.  On UNIX systems, a relative pathname is
                made absolute by resolving it against the current user directory.
                On Microsoft Windows systems, a relative pathname is made absolute
                by resolving it against the current directory of the drive named by the
                pathname, if any; if not, it is resolved against the current user
                directory.
                </xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"></xs:minLength>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative-to" type="xs:string" use="optional">
            <xs:annotation>
                <xs:documentation>
                The name of another previously named path, or of one of the
                standard paths provided by the system. If 'relative-to' is
                provided, the value of the 'path' attribute is treated as
                relative to the path specified by this attribute. The standard
                paths provided by the system include:

                jboss.home - the root directory of the JBoss AS distribution
                user.home - user's home directory
                user.dir - user's current working directory
                java.home - java installation directory
                jboss.server.base.dir - root directory for an individual server
                                        instance
                jboss.server.config.dir - directory in which server configuration
                                          files are stored.
                jboss.server.data.dir - directory the server will use for persistent
                                        data file storage
                jboss.server.log.dir - directory the server will use for
                                       log file storage
                jboss.server.temp.dir - directory the server will use for
                                       temporary file storage
                jboss.domain.servers.dir - directory under which a host controller
                                           will create the working area for
                                           individual server instances
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="specified-pathsType">
        <xs:annotation>
            <xs:documentation>
                A list of named filesystem paths.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="path" type="specified-pathType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="specified-pathType">
        <xs:annotation>
            <xs:documentation>
                A named filesystem path.
            </xs:documentation>
        </xs:annotation>
        <xs:attribute name="name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                The name of the path. Cannot be one of the standard fixed paths
                provided by the system:

                jboss.home.dir - the root directory of the JBoss AS distribution
                user.home - user's home directory
                user.dir - user's current working directory
                java.home - java installation directory
                jboss.server.base.dir - root directory for an individual server
                                        instance

                Note that the system provides other standard paths that can be
                overridden by declaring them in the configuration file. See
                the 'relative-to' attribute documentation for a complete
                list of standard paths.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="path" use="required">
            <xs:annotation>
                <xs:documentation>
                The actual filesystem path. Treated as an absolute path, unless the
                'relative-to' attribute is specified, in which case the value
                is treated as relative to that path.

                If treated as an absolute path, the actual runtime pathname specified
                by the value of this attribute will be determined as follows:

                If this value is already absolute, then the value is directly
                used.  Otherwise the runtime pathname is resolved in a
                system-dependent way.  On UNIX systems, a relative pathname is
                made absolute by resolving it against the current user directory.
                On Microsoft Windows systems, a relative pathname is made absolute
                by resolving it against the current directory of the drive named by the
                pathname, if any; if not, it is resolved against the current user
                directory.

                Note relative path declarations have to use '/' as file separator.
                </xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"></xs:minLength>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative-to" type="xs:string" use="optional">
            <xs:annotation>
                <xs:documentation>
                The name of another previously named path, or of one of the
                standard paths provided by the system. If 'relative-to' is
                provided, the value of the 'path' attribute is treated as
                relative to the path specified by this attribute. The standard
                paths provided by the system include:

                jboss.home.dir - the root directory of the JBoss AS distribution
                user.home - user's home directory
                user.dir - user's current working directory
                java.home - java installation directory
                jboss.server.base.dir - root directory for an individual server
                                        instance
                jboss.server.config.dir - directory in which server configuration
                                          files are stored.
                jboss.server.data.dir - directory the server will use for persistent
                                        data file storage
                jboss.server.log.dir - directory the server will use for
                                       log file storage
                jboss.server.temp.dir - directory the server will use for
                                       temporary file storage
                jboss.domain.servers.dir - directory under which a host controller
                                           will create the working area for
                                           individual server instances
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <!--  JVM configurations -->
    <xs:complexType name="jvmsType">
        <xs:sequence>
            <xs:element name="jvm" type="namedJvmType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="jvmType">
        <xs:all minOccurs="0" maxOccurs="1">
            <xs:element name="heap" type="heapType" minOccurs="0"/>
            <!-- XX:PermSize, XX:MaxPermSize -->
            <xs:element name="permgen" type="bounded-memory-sizeType" minOccurs="0"/>
            <!-- Xss -->
            <xs:element name="stack" type="memory-sizeType" minOccurs="0"/>
            <xs:element name="agent-lib" type="jvm-agentLibType" minOccurs="0"/>
            <xs:element name="agent-path" type="jvm-agentPathType" minOccurs="0"/>
            <xs:element name="java-agent" type="jvm-javaagentType" minOccurs="0"/>
            <xs:element name="jvm-options" type="jvm-optionsType" minOccurs="0"/>
            <xs:element name="environment-variables" type="environmentVariablesType" minOccurs="0"/>
        </xs:all>
        <xs:attribute name="java-home" type="xs:string"/>
        <xs:attribute name="type" default="SUN">
            <xs:simpleType>
                <xs:restriction base="xs:token">
                    <xs:enumeration value="SUN">
			            <xs:annotation>
			                <xs:documentation>Allows the full set of JVM options to be set via the jvm schema elements</xs:documentation>
			            </xs:annotation>
                    </xs:enumeration>
                    <xs:enumeration value="IBM">
                        <xs:annotation>
                            <xs:documentation>Sets a subset of the JVM options via the jvm schema elements</xs:documentation>
                        </xs:annotation>
                    </xs:enumeration>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="env-classpath-ignored" default="true" type="xs:boolean"/>
    </xs:complexType>

    <xs:complexType name="namedJvmType">
        <xs:complexContent>
            <xs:extension base="jvmType">
                <xs:attribute name="name" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="serverJvmType">
        <xs:complexContent>
            <xs:extension base="namedJvmType">
                <xs:attribute name="debug-enabled" type="xs:boolean" default="false"/>
                <xs:attribute name="debug-options" type="xs:string" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="heapType">
        <xs:attribute name="size" use="optional">
            <xs:annotation>
                <xs:documentation>Initial JVM heap size</xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="max-size" use="optional">
            <xs:annotation>
                <xs:documentation>Maximum JVM heap size</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="jvm-optionsType">
        <xs:sequence>
            <xs:element name="option" type="jvm-optionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="jvm-optionType">
        <xs:attribute name="value" use="required">
            <xs:annotation>
                <xs:documentation>JVM option value</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="jvm-agentLibType">
        <xs:attribute name="value" use="required">
            <xs:annotation>
                <xs:documentation>JVM agent lib value </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="jvm-agentPathType">
        <xs:attribute name="value" use="required">
            <xs:annotation>
                <xs:documentation>JVM agent path value </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="jvm-javaagentType">
        <xs:attribute name="value" use="required">
            <xs:annotation>
                <xs:documentation>JVM javaagent value </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="bounded-memory-sizeType">
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="max-size" type="xs:string"/>
    </xs:complexType>

    <xs:complexType name="memory-sizeType">
        <xs:attribute name="size" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:complexType name="properties-with-boottime">
        <xs:sequence>
            <xs:element name="property" type="boottimePropertyType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="properties">
        <xs:sequence>
            <xs:element name="property" type="propertyType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="environmentVariablesType">
        <xs:sequence>
            <xs:element name="variable" type="propertyType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="propertyType">
        <xs:attribute name="name" use="required"/>
        <xs:attribute name="value" use="optional"/>
    </xs:complexType>

    <xs:complexType name="boottimePropertyType">
        <xs:complexContent>
            <xs:extension base="propertyType">
                <xs:attribute name="boot-time" type="xs:boolean" default="true"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

</xs:schema>