<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:tns="http://www.net.cmu.edu/netsage/xml/main"
  targetNamespace="http://www.net.cmu.edu/netsage/xml/main"
  elementFormDefault="qualified">

  <xs:simpleType name="localtime">
    <xs:annotation>
      <xs:documentation>
        Like xs:time, but without the timezone specification support
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:time">
      <xs:pattern value="[0-9:]+"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="weekday">
    <xs:restriction base="xs:nonNegativeInteger">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="7"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="month">
    <xs:restriction base="xs:nonNegativeInteger">
      <xs:minInclusive value="1"/>
      <xs:maxInclusive value="12"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="monthday">
    <xs:restriction base="xs:nonNegativeInteger">
      <xs:minInclusive value="1"/>
      <xs:maxInclusive value="31"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="monthweek">
    <xs:restriction base="xs:nonNegativeInteger">
      <xs:minInclusive value="1"/>
      <xs:maxInclusive value="5"/>
    </xs:restriction>
  </xs:simpleType>
  
<!--
  <xs:simpleType name="ipaddr">
    <xs:restriction base="xs:token">
  <xs:pattern value="((\d{1,2}|1\d{2}|2[01234]\d|25[012345])\.){3}\d{1,2}|1\d{2}|2[01234]\d|25[012345]"/> 
    </xs:restriction>
  </xs:simpleType>
-->
  
  <xs:element name="top">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:hosts"/>
        <xs:element ref="tns:server" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="hosts">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:host" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="server">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:server_file" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="server_hostname" type="xs:NMTOKEN" use="optional"/>
      <xs:attribute name="server_software" type="xs:string" use="required"/>
      <xs:attribute name="server_swversion" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="server_file">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:globalattrs"/>
        <xs:element ref="tns:watchgroup" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="file_name" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="host">
    <xs:complexType>
      <!-- XXX neither string nor token are correct here. 
      Need custom types -->
      
      <xs:attribute name="ref" type="xs:nonNegativeInteger" use="optional"/>
      <!-- or -->
      <xs:attribute name="id" type="xs:nonNegativeInteger" use="optional"/>
      <xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
      <xs:attribute name="ip_address" type="xs:unsignedLong" use="optional"/>

    </xs:complexType>
  </xs:element>
  
  <xs:element name="subperiod">
    <xs:complexType>
      <xs:attribute name="weekday_start" type="tns:weekday" use="optional"/>
      <xs:attribute name="weekday_end" type="tns:weekday" use="optional"/>
      <xs:attribute name="time_start" type="tns:localtime" use="optional"/>
      <xs:attribute name="time_end" type="tns:localtime" use="optional"/>
      <xs:attribute name="month_start" type="tns:month" use="optional"/>
      <xs:attribute name="month_end" type="tns:month" use="optional"/>
      <xs:attribute name="monthday_start" type="tns:monthday" use="optional"/>
      <xs:attribute name="monthday_end" type="tns:monthday" use="optional"/>
      <xs:attribute name="monthweek_start" type="tns:monthweek" use="optional"/>
      <xs:attribute name="monthweek_end" type="tns:monthweek" use="optional"/>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="period">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:subperiod" minOccurs="0" maxOccurs="unbounded"/>
        <xs:any minOccurs="0" maxOccurs="unbounded"
          namespace="http://www.net.cmu.edu/netsage/xml/attributes" 
          processContents="lax"/>
      </xs:sequence>
      <xs:attribute name="name" type="xs:NMTOKEN" use="required"/>
    </xs:complexType>
  </xs:element>        

  <xs:element name="service">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:dependencies" minOccurs="0" maxOccurs="3"/>
        <xs:any namespace="http://www.net.cmu.edu/netsage/xml/attributes" 
          processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="tns:period" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="name" type="xs:NMTOKEN" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="watchgroup">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element ref="tns:host"/>
        <xs:element ref="tns:service"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:NMTOKEN" use="required"/>
      <xs:attribute name="description" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="globalattrs">
    <xs:complexType>
      <xs:sequence>
        <xs:any minOccurs="0" maxOccurs="unbounded"
          namespace="http://www.net.cmu.edu/netsage/xml/attributes" 
          processContents="lax"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>        
  
  <xs:element name="dependencies">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="tns:dep-svc"/>
        <xs:element ref="tns:dep-and"/>
        <xs:element ref="tns:dep-or"/>
        <xs:element ref="tns:dep-not"/>
      </xs:choice>
      <xs:attribute name="type" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="alert"/>
            <xs:enumeration value="host"/>
            <xs:enumeration value="monitor"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="dep-and">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element ref="tns:dep-svc"/>
        <xs:element ref="tns:dep-and"/>
        <xs:element ref="tns:dep-or"/>
        <xs:element ref="tns:dep-not"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name="dep-or">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element ref="tns:dep-svc"/>
        <xs:element ref="tns:dep-and"/>
        <xs:element ref="tns:dep-or"/>
        <xs:element ref="tns:dep-not"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name="dep-not">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="tns:dep-svc"/>
        <xs:element ref="tns:dep-and"/>
        <xs:element ref="tns:dep-or"/>
        <xs:element ref="tns:dep-not"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name="dep-svc">
    <xs:complexType>
      <xs:attribute name="hostgroup" type="xs:NMTOKEN" use="required"/>
      <xs:attribute name="service" type="xs:NMTOKEN" use="required"/>
    </xs:complexType>
  </xs:element>

</xs:schema>

