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

  <xs:element name="SSP">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="network"/>
        <xs:element ref="hosts"/>
        <xs:element ref="archivalUnits"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="network">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="networkIdentity"/>
        <xs:element ref="networkCapabilities"/>
        <xs:element ref="networkTerms"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="networkIdentity">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name"/>
        <xs:element ref="description"/>
        <xs:element ref="accessBase"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="networkCapabilities">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="protocolVersion"/>
        <xs:element ref="numberReplicates"/>
        <xs:element ref="replicationFrequency"/>
        <xs:element ref="verificationFrequency"/>
        <xs:element ref="versioningPolicy"/>
        <xs:element ref="deletionPolicy"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="protocolVersion">
    <xs:complexType>
      <xs:attribute name="version" use="required" type="xs:string"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="numberReplicates">
    <xs:complexType>
      <xs:attribute name="min" use="required" type="xs:positiveInteger"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="replicationFrequency">
    <xs:complexType>
      <xs:attribute name="maxHours" use="required" type="xs:positiveInteger"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="verificationFrequency">
    <xs:complexType>
      <xs:attribute name="maxHours" use="required" type="xs:positiveInteger"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="versioningPolicy">
    <xs:complexType>
      <xs:attribute name="policyType" use="required" type="SPP-policyType"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="deletionPolicy">
    <xs:complexType>
      <xs:attribute name="policyType" use="required" type="xs:NCName"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="networkTerms">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="contentTerms"/>
        <xs:element ref="hostingTerms"/>
        <xs:element ref="serviceTerms"/>
        <xs:element ref="VOTerms"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="contentTerms">
    <xs:complexType mixed="true">
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="hostingTerms">
    <xs:complexType mixed="true">
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="serviceTerms">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="TRACTerms" minOccurs="0"/>
        <xs:element ref="GeneralTerms" minOccurs="1"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="VOTerms">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="TRACTerms" minOccurs="0"/>
        <xs:element ref="GeneralTerms" minOccurs="1"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="hosts">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="host"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="host">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="hostIdentity"/>
        <xs:element ref="hostCapabilities"/>
        <xs:element ref="hostTerms"/>
      </xs:sequence>
      <xs:attribute name="host_id" type="SPP-IPAddress"/>
    </xs:complexType>
    <xs:unique name="host-unique">
      <xs:selector xpath="SSP/hosts/host"></xs:selector>
      <xs:field xpath="SSP/hosts/host/@host_id"></xs:field>
    </xs:unique>
  </xs:element>
  <xs:element name="hostIdentity">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name"/>
        <xs:element ref="description"/>
        <xs:element ref="accessBase"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="hostCapabilities">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="lockssVersion"/>
        <xs:element ref="storageAvailable"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="lockssVersion">
    <xs:complexType>
      <xs:attribute name="protocolVersion" use="required" type="xs:string"/>
      <xs:attribute name="softwareVersion" use="required" type="xs:string"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="storageAvailable">
    <xs:complexType>
      <xs:attribute name="max_size" use="required" type="SPP-sizeType"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="hostTerms">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="systemsDocumentation"/>
        <xs:element ref="hostTermsCompliance"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="hostTermsCompliance">
    <xs:complexType mixed="true">
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
      <xs:attribute name="complianceType" use="optional" default="inSchema" type="SPP-hostComplianceType"/>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="archivalUnits">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="au"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="au">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="auIdentity"/>
        <xs:element ref="auCapabilities"/>
        <xs:element ref="auTerms"/>
      </xs:sequence>
      <xs:attribute name="au_id" type="xs:string"/>
    </xs:complexType>
    <xs:unique name="au-unique">
      <xs:selector xpath="SSP/archivalUnits/au"></xs:selector>
      <xs:field xpath="SSP/archivalUnits/au/@au_id"></xs:field>
    </xs:unique>
  </xs:element>
  <xs:element name="auIdentity">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name"/>
        <xs:element ref="description"/>
        <xs:element ref="accessBase"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="auCapabilities">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="updateFrequency"/>
        <xs:element ref="storageRequired"/>
        <xs:element ref="pluginRequired"/>        
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="updateFrequency">
    <xs:complexType>
      <xs:attribute name="minDays" default="30" use="optional" type="xs:positiveInteger"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="storageRequired">
    <xs:complexType>
      <xs:attribute name="max_size" use="required" type="xs:nonNegativeInteger"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="pluginRequired">
    <xs:complexType>
      <xs:attribute name="pluginURI" use="required" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="auTerms">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="contentTermsCompliance"/>
        <xs:element ref="disseminationTerms"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="contentTermsCompliance">
    <xs:complexType mixed="true">
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
      <xs:attribute name="complianceType" use="optional" default="inAu" type="SPP-auComplianceType"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="disseminationTerms">
    <xs:complexType mixed="true">
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
      <xs:attribute name="disseminationType" use="optional" default="clickthrough" type="SPP-disseminationType"/>
      <xs:attribute name="disseminationCondition" use="optional" default="failure" type="SPP-disseminationCondition"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="name">
    <xs:complexType mixed="true">
      <xs:attribute name="uniqueID" type="xs:NMTOKEN"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="description">
    <xs:complexType mixed="true">
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="accessBase">
    <xs:complexType>
      <xs:attribute name="accessURI" type="xs:anyURI" use="required"/>
      <xs:attribute name="adminEmail" type="SPP-emailType" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="TRACTerms">
    <xs:complexType mixed="true">
      <xs:attribute name="TRACID" use="required" type="xs:NCName"/>
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="GeneralTerms">
    <xs:complexType mixed="true">
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="systemsDocumentation">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="TRACTerms" minOccurs="0"/>
        <xs:element ref="GeneralTerms" minOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="fulltextURI" use="optional" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="SPP-sizeType">
    <xs:restriction base="xs:string">
      <xs:pattern value="\d(\.\d){0,1}\d*(B|KB|MB|GB|TB|PB)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SPP-emailType">
    <xs:restriction base="xs:string">
      <xs:pattern value="(\S+@(\S+\.)+\S+|)"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SPP-policyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="required"/>
      <xs:enumeration value="optional"/>
      <xs:enumeration value="unsupported"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SPP-auComplianceType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="inAu"/>
      <xs:enumeration value="inUri"/>
      <xs:enumeration value="inSchema"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SPP-hostComplianceType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="inUri"/>
      <xs:enumeration value="inSchema"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SPP-disseminationType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="unrestricted"/>
      <xs:enumeration value="clickthrough"/>
      <xs:enumeration value="vetted"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SPP-disseminationCondition">
    <xs:restriction base="xs:string">
      <xs:enumeration value="unrestricted"/>
      <xs:enumeration value="failure"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SPP-IPAddress">
    <xs:restriction base="xs:string">
      <xs:pattern value="((1\d{0,2})|(2[0-4]\d{0,1})|(25[0-5]{0,1})|(2[6-9]{0,1})|(\d{1,2}))\.((1\d{0,2})|(2[0-4]\d{0,1})|(25[0-5]{0,1})|(2[6-9]{0,1})|(\d{1,2}))\.((1\d{0,2})|(2[0-4]\d{0,1})|(25[0-5]{0,1})|(2[6-9]{0,1})|(\d{1,2}))\.((1\d{0,2})|(2[0-4]\d{0,1})|(25[0-5]{0,1})|(2[6-9]{0,1})|(\d{1,2}))"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
