<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" 
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>
      <ref name="element-constraints"/>
  </start>

  <define name="element-constraints">
      <zeroOrMore>
	<choice>
	  <ref name="element-location"/>
	  <ref name="element-colocation"/>
	  <ref name="element-order"/>
	  <ref name="element-rsc_ticket"/>
	</choice>
      </zeroOrMore>
  </define>

  <define name="element-location">
    <element name="rsc_location">
      <attribute name="id"><data type="ID"/></attribute>
      <choice>
	<group>
	  <choice>
	    <attribute name="rsc"><data type="IDREF"/></attribute>
	    <attribute name="rsc-pattern"><text/></attribute>
	  </choice>
	  <optional>
	    <attribute name="role">
	      <ref name="attribute-roles"/>
	    </attribute>
	  </optional>
	</group>
	<oneOrMore>
	  <ref name="element-resource-set"/>
	</oneOrMore>
      </choice>
      <choice>
	<group>
	  <choice>
	    <attribute name="domain"><data type="IDREF"/></attribute>
	    <group>
	      <attribute name="node"><text/></attribute>
	      <externalRef href="score.rng"/>
	    </group>
	  </choice>
	</group>
	<oneOrMore>
	  <externalRef href="rule.rng"/>
	</oneOrMore>
      </choice>
      <optional>
	<ref name="element-lifetime"/>
      </optional>
    </element>
  </define>

  <define name="element-resource-set">
    <element name="resource_set">
      <choice>
	<attribute name="id-ref"><data type="IDREF"/></attribute>
	<group>
	  <attribute name="id"><data type="ID"/></attribute>
	  <optional>
	    <attribute name="sequential"><data type="boolean"/></attribute>
	  </optional>
	  <optional>
	    <attribute name="require-all"><data type="boolean"/></attribute>
	  </optional>
	  <optional>
	    <attribute name="action">
	      <ref name="attribute-actions"/>
	    </attribute>
	  </optional>
	  <optional>
	    <attribute name="role">
	      <ref name="attribute-roles"/>
	    </attribute>
	  </optional>
	  <optional>
	    <externalRef href="score.rng"/>
	  </optional>
	  <oneOrMore>
	    <element name="resource_ref">
	      <attribute name="id"><data type="IDREF"/></attribute>
	    </element>
	  </oneOrMore>
	</group>
      </choice>
    </element>
  </define>

  <define name="element-colocation">
    <element name="rsc_colocation">
      <attribute name="id"><data type="ID"/></attribute>
      <optional>
	<choice>
	  <externalRef href="score.rng"/>
	  <attribute name="score-attribute"><text/></attribute>
	  <attribute name="score-attribute-mangle"><text/></attribute>
	</choice>
      </optional>
      <optional>
	<ref name="element-lifetime"/>
      </optional>
      <choice>
	<oneOrMore>
	  <ref name="element-resource-set"/>
	</oneOrMore>
	<group>
	  <attribute name="rsc"><data type="IDREF"/></attribute>
	  <attribute name="with-rsc"><data type="IDREF"/></attribute>
	  <optional>
	    <attribute name="node-attribute"><text/></attribute>
	  </optional>
	  <optional>
	    <attribute name="rsc-role">
	      <ref name="attribute-roles"/>
	    </attribute>
	  </optional>
	  <optional>
	    <attribute name="with-rsc-role">
	      <ref name="attribute-roles"/>
	    </attribute>
	  </optional>
	  <optional>
	    <attribute name="rsc-instance"><data type="integer"/></attribute>
	  </optional>
	  <optional>
	    <attribute name="with-rsc-instance"><data type="integer"/></attribute>
	  </optional>
	</group>
      </choice>
    </element>
  </define>

  <define name="element-order">
    <element name="rsc_order">
      <attribute name="id"><data type="ID"/></attribute>
      <optional>
	<ref name="element-lifetime"/>
      </optional>
      <optional>
	<attribute name="symmetrical"><data type="boolean"/></attribute>
      </optional>
      <optional>
	<choice>
	  <externalRef href="score.rng"/>
	  <attribute name="kind">
	    <ref name="order-types"/>
	  </attribute>
	</choice>
      </optional>
      <choice>
	<oneOrMore>
	  <ref name="element-resource-set"/>
	</oneOrMore>
	<group>
	  <attribute name="first"><data type="IDREF"/></attribute>
	  <attribute name="then"><data type="IDREF"/></attribute>
	  <optional>
	    <attribute name="first-action">
	      <ref name="attribute-actions"/>
	    </attribute>
	  </optional>
	  <optional>
	    <attribute name="then-action">
	      <ref name="attribute-actions"/>
	    </attribute>
	  </optional>
	  <optional>
	    <attribute name="first-instance"><data type="integer"/></attribute>
	  </optional>
	  <optional>
	    <attribute name="then-instance"><data type="integer"/></attribute>
	  </optional>
	</group>
      </choice>
    </element>
  </define>
 
  <define name="element-rsc_ticket">
    <element name="rsc_ticket">
      <attribute name="id"><data type="ID"/></attribute>
      <choice>
	<oneOrMore>
	  <ref name="element-resource-set"/>
	</oneOrMore>
	<group>
	  <attribute name="rsc"><data type="IDREF"/></attribute>
	  <optional>
	    <attribute name="rsc-role">
	      <ref name="attribute-roles"/>
	    </attribute>
	  </optional>
	</group>
      </choice>
      <attribute name="ticket"><text/></attribute>
      <optional>
	<attribute name="loss-policy">
	  <choice>
	    <value>stop</value>
	    <value>demote</value>
	    <value>fence</value>
	    <value>freeze</value>
	  </choice>
	</attribute>
      </optional>
    </element>
  </define>

  <define name="attribute-actions">
    <choice>
      <value>start</value>
      <value>promote</value>
      <value>demote</value>
      <value>stop</value>
    </choice>
  </define>
      
  <define name="attribute-roles">
    <choice>
      <value>Stopped</value>
      <value>Started</value>
      <value>Master</value>
      <value>Slave</value>
    </choice>
  </define>

  <define name="order-types">
    <choice>
      <value>Optional</value>
      <value>Mandatory</value>
      <value>Serialize</value>
    </choice>
  </define>

  <define name="element-lifetime">
    <element name="lifetime">
      <oneOrMore>
	<externalRef href="rule.rng"/>
      </oneOrMore>
    </element>
  </define>
  
</grammar>
