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

    <xs:element name="patterndb">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ruleset" type="rulesetType" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation>
                        <xs:documentation>
                            A container to group log patterns for an application/program.
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="version" type="xs:NMTOKEN" use="required" fixed="3">
                <xs:annotation>
                    <xs:documentation>
                        The schema version of the pattern database.
                        The current version is '3'.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="pub_date" type="xs:date" use="required">
                <xs:annotation>
                    <xs:documentation>
                        The publication date of the XML file.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
        <xs:unique name="ruleset_name">
            <xs:selector xpath="ruleset"/>
            <xs:field xpath="@name"/>
        </xs:unique>
        <xs:unique name="ids">
            <xs:selector xpath=".//*"/>
            <xs:field xpath="@id"/>
        </xs:unique>
    </xs:element>

    <xs:complexType name="rulesetType">
        <xs:all>
            <xs:element name="description" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        An optional element to attach description to a ruleset.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="url" type="xs:anyURI" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        An optional element to point to a URL related to the ruleset.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="pattern" type="patternType" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        An optional element with a pattern representing the name of the application related
                        to the ruleset in the syslog program field.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="rules">
                <xs:annotation>
                    <xs:documentation>
                        The rules in the ruleset.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="rule" type="ruleType" minOccurs="0" maxOccurs="unbounded">
                            <xs:annotation>
                                <xs:documentation>
                                    A rule describes one log event with classifications and details.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
                <xs:unique name="patterns">
                    <xs:selector xpath="rule/patterns/pattern"/>
                    <xs:field xpath="."/>
                </xs:unique>
            </xs:element>
        </xs:all>
        <xs:attribute name="name" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The name of the application.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:complexType name="ruleType">
        <xs:all>
            <xs:element name="description" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        An optional element to describe the log disposition.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="urls" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Optional elements to point to some external resource for disposition.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="url" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
                <xs:unique name="urls">
                    <xs:selector xpath="url"/>
                    <xs:field xpath="."/>
                </xs:unique>
            </xs:element>
            <xs:element name="values" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Optional values that are added after template evaluation to messages
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="value" minOccurs="0"  maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="xs:string">
                                        <xs:attribute name="name" type="xs:string" use="required"/>
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
                <xs:unique name="values">
                    <xs:selector xpath="value"/>
                    <xs:field xpath="@name"/>
                </xs:unique>
            </xs:element>
             <xs:element name="examples" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Optional examples to test rule patterns and configuration
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="example" type="exampleType" minOccurs="0"  maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
                <xs:unique name="examples">
                    <xs:selector xpath="example"/>
                    <xs:field xpath="test_message"/>
                </xs:unique>
            </xs:element>

            <xs:element name="tags" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Optional keywords that can be used for a freeform grouping of the rules.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="tag" type="xs:token" minOccurs="0"  maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
                <xs:unique name="tags">
                    <xs:selector xpath="tag"/>
                    <xs:field xpath="."/>
                </xs:unique>
            </xs:element>
            <xs:element name="patterns">
                <xs:annotation>
                    <xs:documentation>
                        Patterns representing the rule. Log messages matching any one of the patterns
                        are classified to this rule.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="pattern" type="patternType" minOccurs="0" maxOccurs="unbounded">
                            <xs:annotation>
                                <xs:documentation>
                                    A pattern representing the log message.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:all>
        <xs:attribute name="provider" type="xs:string" use="required">
            <xs:annotation>
                <xs:documentation>
                    The provider of the rule. To distinguish between who supplied the rule,
                    or if it has been added to the xml by a local user.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="id" type="xs:string" use="required"/>
        <xs:attribute name="class" type="classType" use="required">
            <xs:annotation>
                <xs:documentation>
                    The class of the rule.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>

    <xs:simpleType name="uuidType">
        <xs:annotation>
            <xs:documentation>
                This describes a UUID syntax. Currently it is not used for
                the IDing to avoid enforcing the use of UUIDs, which some
                users complained about. Once the decision on the rule id
                format happens this may completely be removed.
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[a-zA-Z0-9]{8}-([a-zA-Z0-9]{4}-){3}[a-zA-Z0-9]{12}"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="patternType">
        <xs:annotation>
            <xs:documentation>
                This type describes a radix/parser pattern which is used to match
                a program name or a whole log message.
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string"/>
    </xs:simpleType>

    <xs:simpleType name="classType">
        <xs:annotation>
            <xs:documentation>
                The classification class for a single rule.
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[\-a-zA-Z0-9_\.%:@\+!\^\\/]+"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="exampleType">
        <xs:all>
            <xs:element name="test_message">
                <xs:annotation>
                    <xs:documentation>
                        The example message to test rule patterns
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="program" type="xs:string" use="optional"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="test_values" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="test_value" minOccurs="0"  maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="xs:string">
                                        <xs:attribute name="name" type="xs:string" use="required"/>
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
                <xs:unique name="test-values">
                    <xs:selector xpath="test_value"/>
                    <xs:field xpath="@name"/>
                </xs:unique>
            </xs:element>
            <xs:element name="test_tags" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="test_tag" type="xs:string" minOccurs="0"  maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:all>
    </xs:complexType>

</xs:schema>
