<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns="eml://ecoinformatics.org/qualityReport"
  targetNamespace="eml://ecoinformatics.org/qualityReport"
  elementFormDefault="unqualified" attributeFormDefault="unqualified">
  
  <xs:annotation>
    <xs:documentation>This XML Schema is used to validate XML Quality Report
      documents generated by the quality reporting facilities of the Data Manager 
      Library code. A quality report contains zero or one datasetReport elements,
      followed by zero or more entityReport elements. Both datasetReport and
      entityReport elements contain zero or more qualityCheck elements. Each
      qualityCheck element captures the information from a single quality metric
      performed on EML metadata, on data, or on the congruency of the metadata 
      to the data.
    </xs:documentation>
  </xs:annotation>

  <!-- qualityReport document element -->
  <xs:element name="qualityReport">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="creationDate"  minOccurs="0" maxOccurs="1" />
        <xs:element ref="packageId"     minOccurs="0" maxOccurs="1" />
        <xs:element ref="includeSystem" minOccurs="0" maxOccurs="unbounded" />
        <xs:element ref="datasetReport" minOccurs="0" />
        <xs:element ref="entityReport"  minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <!-- end of qualityReport document element -->
  
  <!-- datasetReport element -->
  <xs:element name="datasetReport">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="qualityCheck" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
  <!-- entityReport element -->
  <xs:element name="entityReport">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="entityName" />
        <xs:element ref="entityId"     minOccurs="0" />
        <xs:element ref="qualityCheck" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- qualityCheck information -->
  <xs:element name="qualityCheck">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="identifier" />
        <xs:element ref="name" />
        <xs:element ref="description"  minOccurs="0" />
        <xs:element ref="emlPath"      minOccurs="0" />
        <xs:element ref="expected"     minOccurs="0" />
        <xs:element ref="found"        minOccurs="0" />
        <xs:element ref="status"       minOccurs="0" maxOccurs="1" />
        <xs:element ref="explanation"  minOccurs="0" />
        <xs:element ref="suggestion"   minOccurs="0" />
        <xs:element ref="reference"    minOccurs="0" />
      </xs:sequence>
      <xs:attribute name="qualityType" use="optional" default="congruency">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="congruency"/>
            <xs:enumeration value="data"/>
            <xs:enumeration value="metadata"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="statusType" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="info"/>
            <xs:enumeration value="warn"/>
            <xs:enumeration value="error"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="system" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
  
  <!-- Enumerated type: status -->
  <xs:element name="status">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="notChecked" />
        <xs:enumeration value="valid" />
        <xs:enumeration value="info" />
        <xs:enumeration value="warn" />
        <xs:enumeration value="error" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <xs:element name="creationDate" type="xs:dateTime" />
  <xs:element name="description"  type="xs:string" />
  <xs:element name="emlPath"      type="xs:string" />
  <xs:element name="entityId"     type="xs:string" />
  <xs:element name="entityName"   type="xs:string" />
  <xs:element name="expected"     type="xs:string" />
  <xs:element name="explanation"  type="xs:string" />
  <xs:element name="found"        type="xs:string" />
  <xs:element name="identifier"   type="xs:string" />
  <xs:element name="name"         type="xs:string" />
  <xs:element name="packageId"    type="xs:string" />
  <xs:element name="reference"    type="xs:string" />
  <xs:element name="includeSystem" type="xs:string" />
  <xs:element name="suggestion"   type="xs:string" />

</xs:schema>