<?xml version="1.0" encoding="ISO-8859-1"?>

        <!--
        This is the document type descriptor for the
        org.eclipse.jetty.xml.XmlConfiguration class.  It allows a java object to be
        configured by with a sequence of Set, Put and Call elements.  These tags are
        mapped to methods on the object to be configured as follows:

          <Set  name="Test">value</Set>              ==  obj.setTest("value");
          <Put  name="Test">value</Put>              ==  obj.put("Test","value");
          <Call name="test"><Arg>value</Arg></Call>  ==  obj.test("value");

        Values themselves may be configured objects that are created with the
        <New> tag or returned from a <Call> tag.

        Values are matched to arguments on a best effort approach, but types
        my be specified if a match is not achieved.
        -->

        <!ENTITY % CONFIG "Set|Get|Put|Call|New|Ref|Array|Map|Property">
        <!ENTITY % VALUE "#PCDATA|Get|Call|New|Ref|Array|Map|SystemProperty|Env|Property">
        <!ENTITY % TYPE_ATTR "type CDATA #IMPLIED " >
        <!ENTITY % CLASS_ATTR "class CDATA #IMPLIED" >
        <!ENTITY % NAME_ATTR_REQUIRED "name CDATA #REQUIRED" >
        <!ENTITY % NAME_ATTR "name CDATA #IMPLIED" >
        <!ENTITY % PROPERTY_ATTR "property CDATA #IMPLIED" >
        <!ENTITY % DEPRECATED_ATTR "deprecated CDATA #IMPLIED" >
        <!ENTITY % DEFAULT_ATTR "default CDATA #IMPLIED" >
        <!ENTITY % ID_ATTR "id ID #IMPLIED" >
        <!ENTITY % ARG_ATTR "arg CDATA #IMPLIED" >
        <!ENTITY % ITEM_ATTR "item CDATA #IMPLIED" >
        <!ENTITY % REF_ATTR "refid CDATA #IMPLIED" >
        <!ENTITY % ID_ATTR_REQUIRED "id ID #REQUIRED" >

        <!--
        Configure Element.
        This is the root element that specifies the class of object that
        can be configured:

            <Configure class="com.acme.MyClass"> ... </Configure>
        -->
        <!ELEMENT Configure (Id?,Class?,Arg*,(%CONFIG;)*) >
        <!ATTLIST Configure %ID_ATTR; %CLASS_ATTR; >


        <!--
        Set Element.
        This element maps to a call to a setter method or field on the current object.
        The name and optional type attributes are used to select the setter
        method. If the name given is xxx, then a setXxx method is used, or
        the xxx field is used of setXxx cannot be found.

        A Set element can contain value text and/or the value objects returned
        by other elements such as Call, New, SystemProperty, etc.
        If no value type is specified, then white
        space is trimmed out of the value. If it contains multiple value
        elements they are added as strings before being converted to any
        specified type.

        If the property attribute is set to a property name, then the set is
        performed only if the property has a non null value. If the Set element
        contains no value then the the property attribute value is used as the set
        value.

        A Set with a class attribute is treated as a static set method invocation.
        -->
        <!ELEMENT Set (%VALUE;)* >
        <!ATTLIST Set %ID_ATTR; %CLASS_ATTR; %NAME_ATTR_REQUIRED; %TYPE_ATTR; %PROPERTY_ATTR;>


        <!--
        Get Element.
        This element maps to a call to a getter method or field on the current object.
        The name attribute is used to select the get method.
        If the name given is xxx, then a getXxx method is used, or
        the xxx field is used if getXxx cannot be found.
        A Get element can contain other elements such as Set, Put, Call, etc.
        which act on the object returned by the get call.

        A Get with a class attribute is treated as a static get method or field.
        -->
        <!ELEMENT Get (Id?,Name?,Class?,(%CONFIG;)*) >
        <!ATTLIST Get %ID_ATTR; %NAME_ATTR; %CLASS_ATTR; >


        <!--
        Put Element.
        This element maps to a call to a put method on the current object,
        which must implement the Map interface. The name attribute is used
        as the put key and the optional type attribute can force the type
        of the value.

        A Put element can contain value text and/or value elements such as Call,
        New, SystemProperty, etc. If no value type is specified, then white
        space is trimmed out of the value. If it contains multiple value
        elements they are added as strings before being converted to any
        specified type.
        -->
        <!ELEMENT Put (%VALUE;)* >
        <!ATTLIST Put %NAME_ATTR_REQUIRED; %TYPE_ATTR; >


        <!--
        Id Element.
        This element is the equivalent of the id attribute.
        -->
        <!ELEMENT Id (%VALUE;)* >


        <!--
        Name element.
        This element is the equivalent of the name attribute.
        -->
        <!ELEMENT Name (%VALUE;)* >


        <!--
        Deprecated element.
        This element is the equivalent of the deprecated attribute.
        -->
        <!ELEMENT Deprecated (%VALUE;)* >


        <!--
        Default element.
        This element is the equivalent of the default attribute.
        -->
        <!ELEMENT Default (%VALUE;)* >


        <!--
        Class element.
        This element is the equivalent of the class attribute.
        -->
        <!ELEMENT Class (%VALUE;)* >


        <!--
        Type element.
        This element is the equivalent of the type attribute.
        -->
        <!ELEMENT Type (%VALUE;)* >


        <!--
        Call Element.
        This element maps to an arbitrary call to a method on the current object,
        The name attribute and Arg elements are used to select the method.

        A Call element can contain a sequence of Arg elements followed by
        a sequence of other elements such as Set, Put, Call, etc. which act on any object
        returned by the original call:

         <Call id="o2" name="test">
           <Arg>value1</Arg>
           <Set name="Test">Value2</Set>
         </Call>

        This is equivalent to:

         Object o2 = o1.test("value1");
         o2.setTest("value2");

        A Call with a class attribute is treated as a static call.
        -->
        <!ELEMENT Call (Id?,Name?,Class?,Arg*,(%CONFIG;)*) >
        <!ATTLIST Call %ID_ATTR; %NAME_ATTR; %CLASS_ATTR; %ARG_ATTR; >


        <!--
        Arg Element.
        This element defines a positional or optional named argument for the
        Call and New elements. The optional type attribute can force the type
        of the value.

        An Arg element can contain value text and/or value elements such as Call,
        New, SystemProperty, etc. If no value type is specified, then white
        space is trimmed out of the value. If it contains multiple value
        elements they are added as strings before being converted to any
        specified type.
        -->
        <!ELEMENT Arg (%VALUE;)* >
        <!ATTLIST Arg %NAME_ATTR; %TYPE_ATTR; >


        <!--
        New Element.
        This element allows the creation of a new object as part of a
        value for elements such as Set, Put, Arg, etc. The class attribute
        determines the type of the new object and the contained Arg elements
        are used to select the constructor for the new object.

        A New element can contain a sequence of Arg elements followed by
        a sequence of elements such as Set, Put, Call, etc. elements
        which act on the new object:

         <New id="o" class="com.acme.MyClass">
           <Arg>value1</Arg>
           <Set name="test">Value2</Set>
         </New>

        This is equivalent to:

         Object o = new com.acme.MyClass("value1");
         o.setTest("Value2");
        -->
        <!ELEMENT New (Id?,Class?,Arg*,(%CONFIG;)*) >
        <!ATTLIST New %ID_ATTR; %CLASS_ATTR; %ARG_ATTR; >


        <!--
        Ref Element.
        This element allows a previously created object to be referenced by id.  The
        attribute refid is used to specify the id of another object (the attribute id can
        also be used, but it's use is deprecated).
        A Ref element can contain a sequence of elements such as Set, Put, Call, etc.
        which act on the referenced object.

         <Ref refid="myobject">
           <Set name="Test">Value2</Set>
         </New>
        -->
        <!ELEMENT Ref (Id?,(%CONFIG;)*) >
        <!ATTLIST Ref %ID_ATTR; %REF_ATTR;>


        <!--
        Array Element.
        This element allows the creation of a new array as part of a
        value of elements such as Set, Put, Arg, etc. The type attribute determines
        the type of the new array and the contained Item elements
        are used for each element of the array:

         <Array type="java.lang.String">
           <Item>value0</Item>
           <Item><New class="java.lang.String"><Arg>value1</Arg></New></Item>
         </Array>

        This is equivalent to:
         String[] a = new String[] { "value0", new String("value1") };
        -->
        <!ELEMENT Array (Id?,Type?,Item*) >
        <!ATTLIST Array %ID_ATTR; %TYPE_ATTR; %ITEM_ATTR; >


        <!--
        Map Element.
        This element allows the creation of a new map as part of a
        value of elements such as Set, Put, Arg, etc. The type attribute determines
        the type of the new array and the contained Item elements
        are used for each element of the array:

         <Map>
           <Entry>
             <Item>keyName</Item>
             <Item><New class="java.lang.String"><Arg>value1</Arg></New></Item>
           </Entry>
         </Map>

        This is equivalent to:
         Map m = new HashMap();
         m.put("keyName", new String("value1"));
        -->
        <!ELEMENT Map (Id?,Class?,Entry*) >
        <!ATTLIST Map %ID_ATTR; %CLASS_ATTR; >
        <!ELEMENT Entry (Item,Item) >


        <!--
        Item Element.
        This element defines an entry for the Array or Map Entry elements.
        The optional type attribute can force the type of the value.

        An Item element can contain value text and/or the value object of
        elements such as Call, New, SystemProperty, etc. If no value type
        is specified, then white space is trimmed out of the value.
        If it contains multiple value elements they are added as strings
        before being converted to any specified type.
        -->
        <!ELEMENT Item (%VALUE;)* >
        <!ATTLIST Item %ID_ATTR; %TYPE_ATTR; >


        <!--
        System Property Element.
        This element allows JVM System properties to be retrieved as
        part of the value of elements such as Set, Put, Arg, etc.
        The name attribute specifies the property name and the optional
        default argument provides a default value.

         <SystemProperty name="Test" default="value" />

        This is equivalent to:

         System.getProperty("Test","value");
        -->
        <!ELEMENT SystemProperty (Id?,Name?,Deprecated*,Default?) >
        <!ATTLIST SystemProperty %ID_ATTR; %NAME_ATTR; %DEPRECATED_ATTR; %DEFAULT_ATTR; >


        <!--
        Environment variable Element.
        This element allows OS Environment variables to be retrieved as
        part of the value of elements such as Set, Put, Arg, etc.
        The name attribute specifies the env variable name and the optional
        default argument provides a default value.

         <Env name="Test" default="value" />

        This is equivalent to:

         String v=System.getEnv("Test");
         if (v==null) v="value";

        -->
        <!ELEMENT Env (Id?,Name?,Deprecated*,Default?) >
        <!ATTLIST Env %ID_ATTR; %NAME_ATTR; %DEPRECATED_ATTR; %DEFAULT_ATTR; >


        <!--
        Property Element.
        This element allows arbitrary properties to be retrieved by name.
        The name attribute specifies the property name and the optional
        default argument provides a default value.
        -->
        <!ELEMENT Property (Id?,Name?,Deprecated*,Default?) >
        <!ATTLIST Property %ID_ATTR; %NAME_ATTR; %DEPRECATED_ATTR; %DEFAULT_ATTR; >