<?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"
           xmlns="urn:jboss:cli:1.3"
           targetNamespace="urn:jboss:cli:1.3"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
        >


    <xs:element name="jboss-cli">
        <xs:annotation>
            <xs:documentation>
                Root element for the JBoss Command Line Interface configuration.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="default-controller" minOccurs="0"/>
                <xs:element ref="validate-operation-requests" minOccurs="0"/>
                <xs:element ref="history" minOccurs="0"/>

                <xs:element name="resolve-parameter-values" type="xs:boolean" minOccurs="0" maxOccurs="1" default="false">
                    <xs:annotation>
                        <xs:documentation>
                            Whether to resolve system properties specified as command argument (or operation parameter)
                            values before sending the operation request to the controller or let the resolution happen
                            on the server side.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>

                <xs:element ref="connection-timeout" minOccurs="0" maxOccurs="1"/>

                <xs:element ref="ssl" minOccurs="0" maxOccurs="1"/>
                
                <xs:element ref="silent" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="default-controller">
        <xs:annotation>
            <xs:documentation>
                This element contains the configuration of the default controller to connect to
                when the connect command is executed w/o arguments.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="host" type="xs:string" minOccurs="0" default="localhost"/>
                <xs:element name="port" type="xs:int" minOccurs="0" default="9999"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="validate-operation-requests" type="xs:boolean" default="true">
        <xs:annotation>
            <xs:documentation>
                Indicates whether the parameter list of the operation reuqests
                should be validated before the requests are sent to the controller
                for the execution.
            </xs:documentation>
        </xs:annotation>
    </xs:element>

    <xs:element name="history">
        <xs:annotation>
            <xs:documentation>
                This element contains the configuration for the commands and operations history log.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="enabled" type="xs:boolean" minOccurs="0" default="true"/>
                <xs:element name="file-name" type="xs:string" minOccurs="0" default=".jboss-cli-history"/>
                <xs:element name="file-dir" type="xs:string" minOccurs="0" default="${user.home}"/>
                <xs:element name="max-size" type="xs:int" minOccurs="0" default="500"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="connection-timeout" type="xs:int" default="5000">
        <xs:annotation>
            <xs:documentation>
                The time allowed to establish a connection with the controller.
            </xs:documentation>
        </xs:annotation>
    </xs:element>

    <xs:element name="ssl">
        <xs:annotation>
            <xs:documentation>
                This element contains the configuration for the Key and Trust stores
                used for SSL.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="vault" type="vaultType" minOccurs="0" />
                <xs:element name="key-store" type="xs:string" minOccurs="0" />
                <xs:element name="key-store-password" type="xs:string" minOccurs="0" />
                <xs:element name="alias" type="xs:string" minOccurs="0" />
                <xs:element name="key-password" type="xs:string" minOccurs="0" />
                <xs:element name="trust-store" type="xs:string" minOccurs="0" />
                <xs:element name="trust-store-password" type="xs:string" minOccurs="0" />
                <xs:element name="modify-trust-store" type="xs:boolean" default="true" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>
                            Setting to true will cause the CLI to prompt when unrecognised certificates are received
                            and allow them to be stored in the truststore.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="silent" type="xs:boolean" default="false">
        <xs:annotation>
            <xs:documentation>
                Whether to write info and error messages to the terminal output.
                Even if the value is false, the messages will still be logged
                using the logger if its configuration allows and/or if the
                output target was specified as part of the command line using '>'.
            </xs:documentation>
        </xs:annotation>
    </xs:element>
    

    <xs:complexType name="vaultType">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
                    Vault Configuration. If no 'code' and 'module' are supplied the default implementation will be used.
                    If 'code' is specified but no 'module', it will look for the class named by 'specified' in the picketbox module.
                    If 'module' is specified, it will look for the class specified by 'code' in the module specified by 'module'.
                ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="vault-option" type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="code" type="xs:string" use="optional"/>
        <xs:attribute name="module" type="xs:string" use="optional"/>
    </xs:complexType>

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