<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.globus.org/namespaces/2003/04/rsl"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:rsl="http://www.globus.org/namespaces/2003/04/rsl"
            xmlns="http://www.globus.org/namespaces/2003/04/rsl"
            elementFormDefault="qualified">

    <xsd:annotation>
        <xsd:documentation>
            This is a draft version of the GRAM RSL language
            expressed as an XML Schema.
        </xsd:documentation>
    </xsd:annotation>


    <!-- RSL substitution types -->
    <xsd:complexType name="substitutionDefinitionType">
        <xsd:sequence>
            <xsd:any    namespace="##any"
                        minOccurs="1"
                        maxOccurs="unbounded"
                        processContents="lax"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="substitutionReferenceType">
        <xsd:attribute name="name" type="xsd:string"/>
    </xsd:complexType>
    <xsd:element name="substitutionRef" type="rsl:substitutionReferenceType"/>

    <xsd:complexType name="stringValueType">
        <xsd:attribute name="value" type="xsd:string"/>
    </xsd:complexType>
 
    <!-- types for specifying strings -->
    <xsd:complexType name="stringElementType">
        <xsd:choice minOccurs="1" maxOccurs="unbounded">
            <xsd:element name="stringElement" type="rsl:stringValueType"/>
            <xsd:element name="integerElement" type="rsl:integerValueType"/>
            <xsd:element name="longElement" type="rsl:longValueType"/>
            <xsd:element name="floatElement" type="rsl:floatValueType"/>
            <xsd:element name="doubleElement" type="rsl:doubleValueType"/>
            <xsd:element name="booleanElement" type="rsl:booleanValueType"/>
            <xsd:element ref="rsl:substitutionRef"/>
        </xsd:choice>
    </xsd:complexType>

    <xsd:complexType name="stringType">
        <xsd:sequence>
            <xsd:element name="string" type="rsl:stringElementType"/>
        </xsd:sequence>
    </xsd:complexType>


    <!-- types for describing directory paths -->
    <xsd:complexType name="pathType">
        <xsd:sequence>
            <xsd:element name="path" type="rsl:stringElementType"/>
        </xsd:sequence>
    </xsd:complexType>


    <!-- types for specifying integers -->
    <xsd:complexType name="integerValueType">
        <xsd:attribute name="value" type="xsd:int"/>
    </xsd:complexType>

    <xsd:complexType name="integerElementType">
        <xsd:choice minOccurs="0" maxOccurs="1">
            <xsd:element name="integerElement" type="rsl:integerValueType"/>
            <xsd:element ref="rsl:substitutionRef"/>
        </xsd:choice>
        <xsd:attribute name="value" type="xsd:int"/>
    </xsd:complexType>
 
    <xsd:complexType name="integerType">
        <xsd:sequence>
            <xsd:element name="integer" type="rsl:integerElementType"/>
        </xsd:sequence>
    </xsd:complexType>
 
    <!-- types for specifying long -->
    <xsd:complexType name="longValueType">
        <xsd:attribute name="value" type="xsd:long"/>
    </xsd:complexType>

    <xsd:complexType name="longElementType">
        <xsd:choice minOccurs="0" maxOccurs="1">
            <xsd:element name="longElement" type="rsl:longValueType"/>
            <xsd:element ref="rsl:substitutionRef"/>
        </xsd:choice>
        <xsd:attribute name="value" type="xsd:long"/>
    </xsd:complexType>
 
    <xsd:complexType name="longType">
        <xsd:sequence>
            <xsd:element name="long" type="rsl:longElementType"/>
        </xsd:sequence>
    </xsd:complexType>

    <!-- types for specifying boolean values -->
    <xsd:complexType name="booleanValueType">
        <xsd:attribute name="value" type="xsd:boolean"/>
    </xsd:complexType>

    <xsd:complexType name="booleanElementType">
        <xsd:choice minOccurs="0" maxOccurs="1">
            <xsd:element name="booleanElement" type="rsl:booleanValueType"/>
            <xsd:element ref="rsl:substitutionRef"/>
        </xsd:choice>
        <xsd:attribute name="value" type="xsd:boolean"/>
    </xsd:complexType>
 
    <xsd:complexType name="booleanType">
        <xsd:sequence>
            <xsd:element name="boolean" type="rsl:booleanElementType"/>
        </xsd:sequence>
    </xsd:complexType>
 
    <!-- types for specifying float -->
    <xsd:complexType name="floatValueType">
        <xsd:attribute name="value" type="xsd:float"/>
    </xsd:complexType>

    <xsd:complexType name="floatElementType">
        <xsd:choice minOccurs="0" maxOccurs="1">
            <xsd:element name="floatElement" type="rsl:floatValueType"/>
            <xsd:element ref="rsl:substitutionRef"/>
        </xsd:choice>
        <xsd:attribute name="value" type="xsd:float"/>
    </xsd:complexType>
 
    <xsd:complexType name="floatType">
        <xsd:sequence>
            <xsd:element name="float" type="rsl:floatElementType"/>
        </xsd:sequence>
    </xsd:complexType>
 
    <!-- types for specifying double -->
    <xsd:complexType name="doubleValueType">
        <xsd:attribute name="value" type="xsd:double"/>
    </xsd:complexType>

    <xsd:complexType name="doubleElementType">
        <xsd:choice minOccurs="0" maxOccurs="1">
            <xsd:element name="doubleElement" type="rsl:doubleValueType"/>
            <xsd:element ref="rsl:substitutionRef"/>
        </xsd:choice>
        <xsd:attribute name="value" type="xsd:double"/>
    </xsd:complexType>
 
    <xsd:complexType name="doubleType">
        <xsd:sequence>
            <xsd:element name="double" type="rsl:doubleElementType"/>
        </xsd:sequence>
    </xsd:complexType>

    <!-- url types -->
    <xsd:complexType name="urlElementType">
        <xsd:choice minOccurs="1" maxOccurs="unbounded">
            <xsd:element name="urlElement" type="rsl:stringValueType"/>
            <xsd:element ref="rsl:substitutionRef"/>
        </xsd:choice>
    </xsd:complexType>

    <xsd:complexType name="urlType">
        <xsd:sequence>
            <xsd:element name="url" type="rsl:urlElementType"/>
        </xsd:sequence>
    </xsd:complexType>


    <!-- hashtable types -->
    <xsd:complexType name="hashtableEntryType">
        <xsd:complexContent>
            <xsd:extension base="rsl:stringElementType">
                <xsd:attribute name="name" type="xsd:string" use="required"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="hashtableElementType">
        <xsd:sequence>
            <xsd:element    name="entry"
                            type="rsl:hashtableEntryType"
                            minOccurs="0"
                            maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="hashtableType">
        <xsd:sequence>
            <xsd:element name="hashtable" type="rsl:hashtableElementType"/>
        </xsd:sequence>
    </xsd:complexType>


    <!-- enumeration type-->
    <xsd:complexType name="enumerationElementType">
        <xsd:choice>
            <xsd:element ref="rsl:substitutionRef"/>
            <xsd:element name="enumerationValue"/>
        </xsd:choice>
    </xsd:complexType>

    <xsd:complexType name="enumerationType">
        <xsd:sequence>
            <xsd:element name="enumeration" type="rsl:enumerationElementType"/>
        </xsd:sequence>
    </xsd:complexType>


   <!-- file input types -->
    <xsd:complexType name="fileInputElementType">
        <xsd:sequence>
            <xsd:element name="url" type="rsl:urlElementType"/>
            <xsd:element name="path" type="rsl:stringElementType"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="fileInputType">
        <xsd:sequence>
            <xsd:element name="fileInput" type="rsl:fileInputElementType"/>
        </xsd:sequence>
    </xsd:complexType>


   <!-- file output types -->
    <xsd:complexType name="fileOutputElementType">
        <xsd:sequence>
            <xsd:element name="path" type="rsl:stringElementType"/>
            <xsd:element name="url" type="rsl:urlElementType"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="fileOutputType">
        <xsd:sequence>
            <xsd:element name="fileOutput" type="rsl:fileOutputElementType"/>
        </xsd:sequence>
    </xsd:complexType>


   <!-- string array types -->
    <xsd:complexType name="stringArrayElementType">
        <xsd:sequence>
            <xsd:element    name="string"
                            type="stringElementType"
                            minOccurs="0"
                            maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="stringArrayType">
        <xsd:sequence>
            <xsd:element name="stringArray" type="rsl:stringArrayElementType"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="twoDimensionalArrayType">
        <xsd:sequence>
            <xsd:element    name="twoDimensionalArray"
                            type="rsl:stringType"
                            minOccurs="0"
                            maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>


   <!-- path array types -->
    <xsd:complexType name="pathArrayElementType">
        <xsd:sequence>
            <xsd:element    name="path"
                            type="stringElementType"
                            minOccurs="0"
                            maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="pathArrayType">
        <xsd:sequence>
            <xsd:element name="pathArray" type="rsl:pathArrayElementType"/>
        </xsd:sequence>
    </xsd:complexType>


   <!-- file intput array types -->
    <xsd:complexType name="fileInputArrayElementType">
        <xsd:sequence>
            <xsd:element    name="fileInput"
                            type="rsl:fileInputElementType"
                            minOccurs="0"
                            maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="fileInputArrayType">
        <xsd:sequence>
            <xsd:element    name="fileInputArray"
                            type="rsl:fileInputArrayElementType"/>
        </xsd:sequence>
    </xsd:complexType>


   <!-- file output array types -->
   <xsd:complexType name="fileOutputArrayElementType">
        <xsd:sequence minOccurs="0" maxOccurs="unbounded">
            <xsd:element    name="fileOutput"
                            type="rsl:fileOutputElementType"
                            minOccurs="0"
                            maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="fileOutputArrayType">
        <xsd:sequence>
            <xsd:element    name="fileOutputArray"
                            type="rsl:fileOutputArrayElementType"/>
        </xsd:sequence>
    </xsd:complexType>


    <xsd:complexType name="contentType"/>

    <xsd:element name="content" type="rsl:contentType" abstract="true"/>


    <!-- The following is the document/top-level type -->
    <xsd:complexType name="rslType">
        <xsd:sequence>
            <xsd:element name="substitutionDef"
                         type="rsl:substitutionDefinitionType"
                         minOccurs="0"
                         maxOccurs="unbounded"/>

            <xsd:element ref="content" minOccurs="1" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>

    <!-- This is our document element (the all-encompasing, outer element) -->
    <xsd:element name="rsl" type="rsl:rslType"/>

</xsd:schema>

