<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://cve.mitre.org/cve/downloads/1.0"
    targetNamespace="http://cve.mitre.org/cve/downloads/xml_schema_info.html"
    elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">

    <!--  **************************************************************************************** -->
    <!--  Changelog:
                1.0 - Initial version
    -->
    <!--  **************************************************************************************** -->
    <xsd:annotation>
        <xsd:documentation xml:lang="en"> Simple schema that defines the format of the CVE List
            provided by MITRE </xsd:documentation>
    </xsd:annotation>

    <!--  **************************************************************************************** -->
    <!--  Start Item Element Definition -->
    <!--  **************************************************************************************** -->
    <xsd:element name="cve">
        <xsd:annotation>
            <xsd:documentation xml:lang="en"> cve is the top level element of the CVE List provided
                by MITRE. It represents holds all CVE Items. </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="item" type="ItemType" minOccurs="1" maxOccurs="unbounded"/>
            </xsd:sequence>
            <xsd:attribute name="schemaVersion" type="xsd:token" use="optional"/>
        </xsd:complexType>
    </xsd:element>

    <!--  **************************************************************************************** -->
    <!--  Simple Types -->
    <!--  **************************************************************************************** -->
    <!-- CUSTOM TYPE DEFINITIONS-->
    <xsd:simpleType name="typeEnumType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="CAN"/>
            <xsd:enumeration value="CVE"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="statusEnumType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="Entry"/>
            <xsd:enumeration value="Candidate"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <!-- need to verify enumeration -->
    <xsd:simpleType name="simplePhaseEnumType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="Proposed"/>
            <xsd:enumeration value="Interim"/>
            <xsd:enumeration value="Modified"/>
            <xsd:enumeration value="Assigned"/>
        </xsd:restriction>
    </xsd:simpleType>

    <!--  **************************************************************************************** -->
    <!--  Complex Types -->
    <!--  **************************************************************************************** -->
    <xsd:complexType name="ItemType">
        <xsd:sequence>
            <xsd:element name="status" type="statusEnumType" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="phase" type="specificPhaseType" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="desc" type="xsd:string" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="refs" type="refsType" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="votes" type="votesType" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="comments" type="commentsType" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <!--Need to Verify Enumeration-->
        <xsd:attribute name="type" type="typeEnumType" use="required"/>
        <xsd:attribute name="name" type="xsd:token" use="required"/>
        <xsd:attribute name="seq" type="xsd:token" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="commentsType">
        <xsd:sequence>
            <xsd:element name="comment" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="voter" type="xsd:token" use="required"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="votesType">
        <xsd:sequence>
            <xsd:element name="accept" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="count" type="xsd:token" use="required"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="modify" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="count" type="xsd:token" use="required"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="noop" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="count" type="xsd:token" use="required"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="recast" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="count" type="xsd:token" use="required"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="reject" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="count" type="xsd:token" use="required"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="reviewing" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="count" type="xsd:token" use="required"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="revote" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="count" type="xsd:token" use="required"/>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>


    <xsd:complexType name="specificPhaseType">
        <xsd:simpleContent>
            <xsd:extension base="simplePhaseEnumType">
                <xsd:attribute name="date" type="xsd:token" use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="refsType">
        <xsd:annotation>
            <xsd:documentation>holds all hyperlink elements</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="ref" type="refType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="refType">
        <xsd:annotation>
            <xsd:documentation>Holds individual hyperlink element</xsd:documentation>
        </xsd:annotation>
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="source" type="xsd:token" use="required"/>
                <xsd:attribute name="url" type="xsd:anyURI" use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
</xsd:schema>
