<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:annotation>
 <xsd:documentation xml:lang="en">
  Filesystem Database schema writen by Olivier Poitrey on 4/20/2004
  Version $Id: configuration.xsd,v 1.1 2004/04/22 19:24:05 ensc Exp $
 </xsd:documentation>
</xsd:annotation>

<xsd:group name="commonElements">
 <xsd:sequence>
  <xsd:element name="description" type="xsd:normalizedString" minOccurs="0"/>
 </xsd:sequence>
</xsd:group>

<xsd:attributeGroup name="commonAttributes">
 <xsd:attribute name="name" type="xsd:token" use="required"/>
 <xsd:attribute name="type" default="fixed">
  <xsd:simpleType>
   <xsd:restriction base="xsd:string">
    <xsd:enumeration value="fixed"/>
    <xsd:enumeration value="symbolic"/>
   </xsd:restriction>
  </xsd:simpleType>
 </xsd:attribute>
 <xsd:attribute name="use" default="required">
  <xsd:simpleType>
   <xsd:restriction base="xsd:string">
    <xsd:enumeration value="optional"/>
    <xsd:enumeration value="required"/>
    <xsd:enumeration value="prohibited"/>
   </xsd:restriction>
  </xsd:simpleType>
 </xsd:attribute>
</xsd:attributeGroup>

<xsd:simpleType name="quantityType">
 <xsd:union memberTypes="xsd:unsignedInt">
  <xsd:simpleType>
   <xsd:restriction base="xsd:string">
    <xsd:enumeration value="unbounded"/>
   </xsd:restriction>
  </xsd:simpleType>
 </xsd:union>
</xsd:simpleType>

<xsd:complexType name="baseItem" abstract="true">
 <xsd:sequence>
  <xsd:group ref="commonElements"/>
 </xsd:sequence>
 <xsd:attributeGroup ref="commonAttributes"/>
</xsd:complexType>

<xsd:complexType name="baseNode" abstract="true">
 <xsd:sequence>
  <xsd:group ref="commonElements"/>
  <xsd:choice minOccurs="0" maxOccurs="unbounded">
   <xsd:element name="collection" type="collectionType">
    <xsd:unique name="collection">
     <xsd:annotation>
      <xsd:documentation xml:lang="en">
       Avoid duplicate element with same name attribute on the same level tree
      </xsd:documentation>
     </xsd:annotation>
     <xsd:selector xpath="*"/>
     <xsd:field xpath="@name"/>
    </xsd:unique>
   </xsd:element>
   <xsd:element name="scalar" type="scalarType"/>
   <xsd:element name="list" type="listType"/>
   <xsd:element name="hash" type="hashType"/>
   <xsd:element name="boolean" type="booleanType"/>
   <xsd:element name="data" type="dataType"/>
   <xsd:element name="link" type="linkType"/>
   <xsd:element name="program" type="programType"/>
  </xsd:choice>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="collectionType">
 <xsd:complexContent>
  <xsd:extension base="baseNode">
   <xsd:attributeGroup ref="commonAttributes"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="scalarType">
 <xsd:complexContent>
  <xsd:extension base="baseItem">
   <xsd:sequence>
    <xsd:element name="default" type="xsd:normalizedString" minOccurs="0"/>
    <xsd:element name="restriction" minOccurs="0">
     <xsd:complexType>
      <xsd:choice>
       <xsd:element name="enumeration" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
         <xsd:attribute name="value" type="xsd:normalizedString"/>
        </xsd:complexType>
       </xsd:element>
      </xsd:choice>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="listType">
 <xsd:complexContent>
  <xsd:extension base="baseItem">
   <xsd:sequence>
    <xsd:element name="minElements" type="quantityType" minOccurs="0" default="0"/>
    <xsd:element name="maxElements" type="quantityType" minOccurs="0" default="unbounded"/>
    <xsd:element name="elements" minOccurs="0">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="element" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
         <xsd:sequence>
          <xsd:group ref="commonElements"/>
          <xsd:element name="default" type="xsd:boolean" minOccurs="0" default="0"/>
         </xsd:sequence>
         <xsd:attribute name="name" type="xsd:normalizedString" use="required"/>
        </xsd:complexType>
       </xsd:element>
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="hashType">
 <xsd:complexContent>
  <xsd:extension base="baseItem">
   <xsd:sequence>
    <xsd:element name="keys" minOccurs="0">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="key" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
         <xsd:sequence>
          <xsd:group ref="commonElements"/>
          <xsd:element name="default" type="xsd:normalizedString" minOccurs="0"/>
         </xsd:sequence>
         <xsd:attribute name="name" type="xsd:normalizedString" use="required"/>
        </xsd:complexType>
       </xsd:element>
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="booleanType">
 <xsd:complexContent>
  <xsd:extension base="baseItem">
   <xsd:sequence>
    <xsd:element name="default" type="xsd:boolean" minOccurs="0"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="dataType">
 <xsd:complexContent>
  <xsd:extension base="baseItem">
   <xsd:sequence>
    <xsd:element name="default" type="xsd:string" minOccurs="0"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="linkType">
 <xsd:complexContent>
  <xsd:extension base="baseItem">
   <xsd:sequence>
    <xsd:element name="default" type="xsd:token" minOccurs="0"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="programType">
 <xsd:complexContent>
  <xsd:extension base="baseItem">
   <xsd:sequence>
    <xsd:element name="parameterList" minOccurs="0">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="parameter" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
         <xsd:sequence>
          <xsd:group ref="commonElements"/>
         </xsd:sequence>
         <xsd:attribute name="name" type="xsd:normalizedString" use="required"/>
        </xsd:complexType>
       </xsd:element>
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<!-- root element -->
<xsd:element name="database">
 <xsd:complexType>
  <xsd:complexContent>
   <xsd:extension base="baseNode"/>
  </xsd:complexContent>
 </xsd:complexType>
 <xsd:unique name="database">
  <xsd:annotation>
   <xsd:documentation xml:lang="en">
    Avoid duplicate element with same name attribute on the same level tree
   </xsd:documentation>
  </xsd:annotation>
  <xsd:selector xpath="*"/>
  <xsd:field xpath="@name"/>
 </xsd:unique>
</xsd:element>

</xsd:schema>
