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

<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="urn:jboss:domain:keycloak-server:1.1"
           xmlns="urn:jboss:domain:keycloak-server:1.1"
           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 server subsystem, used to configure the Keycloak server
                ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="web-context" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="providers" type="providersLocationType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="master-realm-name" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="scheduled-task-interval" type="xs:long" minOccurs="0" maxOccurs="1"/>
            <xs:element name="theme" type="themeDefaultsType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="spi" type="spiType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
        
    </xs:complexType>
    
    <xs:complexType name="providersLocationType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="provider" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
    
    <xs:complexType name="themeDefaultsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="staticMaxAge" type="xs:long" minOccurs="0" maxOccurs="1"/>
            <xs:element name="cacheThemes" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="cacheTemplates" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="welcomeTheme" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="default" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="dir" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="modules" type="modulesType" minOccurs="0" maxOccurs="1"/>
        </xs:choice>
    </xs:complexType>
    
    <xs:complexType name="modulesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="module" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
    
    <xs:complexType name="spiType">
        <xs:sequence>
            <xs:element name="default-provider" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="provider" type="providerType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="name" use="required"/>
    </xs:complexType>
    
    <xs:complexType name="providerType">
        <xs:sequence>
            <xs:element name="properties" type="properties" minOccurs="0" maxOccurs="1"/>
        </xs:sequence>
        <xs:attribute name="name" use="required"/>
        <xs:attribute name="enabled" use="required"/>
    </xs:complexType>
    
    <xs:complexType name="properties">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="property" type="propertyType" maxOccurs="unbounded"/>
            <xs:element name="list" type="listType" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="propertyType">
        <xs:attribute name="name" use="required"/>
        <xs:attribute name="value" use="optional"/>
    </xs:complexType>
    
    <xs:complexType name="listType">
        <xs:sequence>
            <xs:element name="value" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="name" use="required"/>
    </xs:complexType>
</xs:schema>
