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

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

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

    <xs:complexType name="subsystem-type">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
                    The Keycloak subsystem, used to register deployments managed by Keycloak
                ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="realm" maxOccurs="unbounded" minOccurs="0" type="realm-type"/>
            <xs:element name="secure-deployment" maxOccurs="unbounded" minOccurs="0" type="secure-deployment-type"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="realm-type">
        <xs:all>
            <xs:element name="cors-allowed-headers" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="client-keystore-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="client-keystore" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="truststore" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="truststore-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="enable-cors" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="allow-any-hostname" type="xs:boolean" minOccurs="0" maxOccurs="1" />
            <xs:element name="client-key-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="connection-pool-size" type="xs:integer" minOccurs="0" maxOccurs="1"/>
            <xs:element name="cors-max-age" type="xs:integer" minOccurs="0" maxOccurs="1"/>
            <xs:element name="auth-server-url" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="expose-token" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="disable-trust-manager" type="xs:boolean" minOccurs="0" maxOccurs="1" />
            <xs:element name="ssl-required" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="cors-allowed-methods" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="realm-public-key" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="auth-server-url-for-backend-requests" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="always-refresh-token" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="register-node-at-startup" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="register-node-period" type="xs:integer" minOccurs="0" maxOccurs="1"/>
            <xs:element name="token-store" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="principal-attribute" type="xs:string" minOccurs="0" maxOccurs="1"/>
        </xs:all>
        <xs:attribute name="name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>The name of the realm.</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
    
    <xs:complexType name="secure-deployment-type">
        <xs:all>
            <xs:element name="client-keystore-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="client-keystore" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="enable-cors" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="allow-any-hostname" type="xs:boolean" minOccurs="0" maxOccurs="1" />
            <xs:element name="use-resource-role-mappings" type="xs:boolean" minOccurs="0" maxOccurs="1" />
            <xs:element name="cors-max-age" type="xs:integer" minOccurs="0" maxOccurs="1"/>
            <xs:element name="auth-server-url" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="realm" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="disable-trust-manager" type="xs:boolean" minOccurs="0" maxOccurs="1" />
            <xs:element name="cors-allowed-methods" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="bearer-only" type="xs:boolean" minOccurs="0" maxOccurs="1" />
            <xs:element name="cors-allowed-headers" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="resource" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="truststore" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="truststore-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="client-key-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="public-client" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="connection-pool-size" type="xs:integer" minOccurs="0" maxOccurs="1"/>
            <xs:element name="expose-token" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="ssl-required" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="realm-public-key" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="credential" type="credential-type" minOccurs="1" maxOccurs="1"/>
            <xs:element name="auth-server-url-for-backend-requests" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="always-refresh-token" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="register-node-at-startup" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="register-node-period" type="xs:integer" minOccurs="0" maxOccurs="1"/>
            <xs:element name="token-store" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="principal-attribute" type="xs:string" minOccurs="0" maxOccurs="1"/>
        </xs:all>
        <xs:attribute name="name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>The name of the realm.</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
    
    <xs:complexType name="credential-type">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="name" type="xs:string" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>
