<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- the Usecase root element -->
  <xs:element name="usecase" type="Usecase" />

  <!-- the Usecase reloaded -->
  <xs:complexType name="Usecase">
    <xs:choice>
      <xs:element name="callEvent" minOccurs="0" maxOccurs="1"
        type="callEventUseCase" />
      <xs:element name="callMlm" minOccurs="0" maxOccurs="1"
        type="callMlmUseCase" />
      <xs:element name="evaluateRead" minOccurs="0" maxOccurs="1"
        type="HostInterfaceUseCase" />
      <xs:element name="evaluateMessage" minOccurs="0"
        maxOccurs="1" type="HostInterfaceUseCase" />
      <xs:element name="evaluateDestination" minOccurs="0"
        maxOccurs="1" type="HostInterfaceUseCase" />
      <xs:element name="executeInterface" minOccurs="0"
        maxOccurs="1" type="HostInterfaceUseCase" />
      <xs:element name="write" minOccurs="0" maxOccurs="1"
        type="WriteUseCase" />
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="callEventUseCase">
    <xs:sequence>
      <xs:element name="key" type="EventKey" minOccurs="1"
        maxOccurs="1" />
      <xs:element name="results" minOccurs="0" maxOccurs="1"
        type="XsdArdenDataTypes" />
      <xs:element name="payload" minOccurs="0" maxOccurs="1"
        type="xs:anyType"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="callMlmUseCase">
    <xs:sequence>
      <xs:element name="key" type="MlmKey" minOccurs="1"
        maxOccurs="1" />
      <xs:element name="arguments" minOccurs="1" maxOccurs="1"
        type="XsdArdenDataTypes" />
      <xs:element name="results" minOccurs="0" maxOccurs="1"
        type="XsdArdenDataTypes" />
      <xs:element name="payload" minOccurs="0" maxOccurs="1"
        type="xs:anyType"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <!-- for all UseCases that contain the <as> tag: evaluateRead, evaluateMessage,
    evaluateDestination, executeInterface -->
  <xs:complexType name="HostInterfaceUseCase">
    <xs:complexContent>
      <xs:extension base="callEventUseCase">
        <xs:sequence>
          <xs:element name="as" minOccurs="1" maxOccurs="1" type="as" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- the write Usecase which has a special structure ! -->
  <xs:complexType name="WriteUseCase">
    <xs:sequence>
      <xs:element name="key" type="WriteKey" />
    </xs:sequence>
  </xs:complexType>

  <!-- the type of the <as> tag within the HostInterfaceUsecase ! -->
  <xs:complexType name="as">
    <xs:sequence minOccurs="1" maxOccurs="1">
      <xs:element name="objectDeclaration" minOccurs="0"
        maxOccurs="1" type="XsdArdenObjDeclaration" />
    </xs:sequence>
  </xs:complexType>

  <!-- all XsdArdenDataTypes without the list element ! -->
  <xs:complexType name="XsdArdenDataTypes">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="number" type="XsdArdenNumber" />
      <xs:element name="string" type="XsdArdenString" />
      <xs:element name="boolean" type="XsdArdenBoolean" />
      <xs:element name="time" type="XsdArdenTime" />
      <xs:element name="duration" type="XsdArdenDuration" /> <!-- evaluation has to be done separatly, or insert regex here ! -->
      <xs:element name="null" type="XsdArdenNull" />
      <xs:element name="object" type="XsdArdenObject" />
      <xs:element name="objectDeclaration" type="XsdArdenObjDeclaration" />
      <xs:element name="list" type="XsdArdenDataTypesNoList" />
    </xs:choice>
  </xs:complexType>

  <!-- only one of the listed types is allowed, needed in objectField -->
  <xs:complexType name="ObjectFieldType">
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:element name="number" type="XsdArdenNumber" />
      <xs:element name="string" type="XsdArdenString" />
      <xs:element name="boolean" type="XsdArdenBoolean" />
      <xs:element name="time" type="XsdArdenTime" />
      <xs:element name="duration" type="XsdArdenDuration" /> <!-- evaluation has to be done separatly, or insert regex here ! -->
      <xs:element name="null" type="XsdArdenNull"/>
      <xs:element name="object" type="XsdArdenObject" />
      <xs:element name="objectDeclaration" type="XsdArdenObjDeclaration" />
      <xs:element name="list" type="XsdArdenDataTypesNoList" />
    </xs:choice>
    <xs:attribute name="name" type="xs:string" />
  </xs:complexType>

  <!-- all XsdArdenDataTypes without the list element ! -->
  <xs:complexType name="XsdArdenDataTypesNoList">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="number" type="XsdArdenNumber" />
      <xs:element name="string" type="XsdArdenString" />
      <xs:element name="boolean" type="XsdArdenBoolean" />
      <xs:element name="time" type="XsdArdenTime" />
      <xs:element name="duration" type="XsdArdenDuration" /> <!-- evaluation has to be done separatly, or insert regex here ! -->
      <xs:element name="null" type="XsdArdenNull"/>
      <xs:element name="object" type="XsdArdenObject" />
      <xs:element name="objectDeclaration" type="XsdArdenObjDeclaration" />
    </xs:choice>
  </xs:complexType>

  <!-- now following some self explanatory defitions of XsdArdenDataTypes which
    are used in the SimpleArdenDataTypes complexType ! -->
  <xs:complexType name="XsdArdenObjDeclaration">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
      <xs:element name="field" type="XsdObjDeclarationField"></xs:element>
    </xs:sequence>
    <xs:attribute name="objDeclName" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="XsdObjDeclarationField">
    <xs:attribute name="name" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="XsdArdenObject">
    <xs:sequence>
      <xs:element name="field" minOccurs="1" maxOccurs="unbounded"
        type="ObjectFieldType" />
    </xs:sequence>
    <xs:attribute name="objDeclName" type="xs:string" use="required" />
    <xs:attribute name="primaryTime" type="xs:dateTime" use="optional" />
  </xs:complexType>

  <xs:simpleType name="XsdArdenApplicability">
      <xs:restriction base="xs:double">
        <xs:minInclusive value="0"/>
            <xs:maxInclusive value="1"/>
      </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="XsdArdenNumber">
    <xs:simpleContent>
      <xs:extension base="xs:double">
        <xs:attribute name="primaryTime" type="xs:dateTime"
          use="optional" />
          <xs:attribute name="applicability" type="XsdArdenApplicability" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="XsdArdenString">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="primaryTime" type="xs:dateTime"
          use="optional" />
        <xs:attribute name="applicability" type="XsdArdenApplicability" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="XsdArdenBoolean">
    <xs:simpleContent>
      <xs:extension base="XsdArdenBooleanBase">
        <xs:attribute name="primaryTime" type="xs:dateTime"
          use="optional" />
        <xs:attribute name="applicability" type="XsdArdenApplicability" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="XsdArdenNullBase">
      <xs:restriction base="xs:string">
        <xs:length value="0" />
      </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="XsdArdenNull">
    <xs:simpleContent>
      <xs:extension base="XsdArdenNullBase">
        <xs:attribute name="primaryTime" type="xs:dateTime"
          use="optional" />
        <xs:attribute name="applicability" type="XsdArdenApplicability" use="optional"/>
      </xs:extension>
      </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="XsdArdenBooleanBase">
    <xs:restriction base="xs:string">
      <xs:enumeration value="true" />
      <xs:enumeration value="false" />
      <xs:enumeration value="null" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="XsdArdenTime">
    <xs:simpleContent>
      <xs:extension base="xs:dateTime">
        <xs:attribute name="primaryTime" type="xs:dateTime"
          use="optional" />
        <xs:attribute name="applicability" type="XsdArdenApplicability" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="XsdArdenDuration">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="primaryTime" type="xs:dateTime"
          use="optional" />
        <xs:attribute name="applicability" type="XsdArdenApplicability" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <!-- the structure of the <key> tag of the callMlm Usecase ! -->
  <xs:complexType name="MlmKey">
    <xs:sequence>
      <xs:element name="mlmName" minOccurs="1" maxOccurs="1"
        type="xs:string" />
      <xs:element name="institution" minOccurs="0" maxOccurs="1"
        type="xs:string" />
      <xs:element name="version" minOccurs="0" maxOccurs="1"
        type="xs:string" />
      <xs:element name="eventTime" minOccurs="0" maxOccurs="1"
        type="xs:dateTime" />
      <xs:element name="triggerTime" minOccurs="0" maxOccurs="1"
        type="xs:dateTime" />
    </xs:sequence>
  </xs:complexType>

  <!-- the structure of the <key> tag of the callEvent Usecase ! -->
  <xs:complexType name="EventKey">
    <xs:sequence>
      <xs:element name="mapping" minOccurs="1" maxOccurs="unbounded"
        type="xs:string" />
      <xs:element name="eventTime" minOccurs="0" maxOccurs="1"
        type="xs:dateTime" />
    </xs:sequence>
  </xs:complexType>

  <!-- the structure of the <key> tag of the write Usecase ! -->
  <xs:complexType name="WriteKey">
    <xs:sequence>
      <xs:element name="expression" minOccurs="1" maxOccurs="1"
        type="xs:string" />
      <xs:element name="destination" minOccurs="0" maxOccurs="1"
        type="xs:string" />
    </xs:sequence>
  </xs:complexType>

</xs:schema>