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

  <!-- Root -->
  <xs:element name="application">
   <xs:complexType>
    <xs:all>
     <!-- LiveRebel -->
     <xs:element name="name" type="xs:string" minOccurs="0" />
     <xs:element name="module" type="xs:string" minOccurs="0" />
     <xs:element name="deployment" type="xs:string" minOccurs="0" />
     <xs:element name="version" type="xs:string" minOccurs="0" />
     
     <!-- Resources -->
     <xs:element ref="classpath" minOccurs="0" />
     <xs:element ref="web" minOccurs="0" />
     <xs:element ref="war" minOccurs="0" />
    </xs:all>
   </xs:complexType>
  </xs:element>
  
  <!-- Class path -->
	<xs:simpleType name="fallback_mode">
	  <xs:restriction base="xs:string">
	    <xs:enumeration value="all"/>
	    <xs:enumeration value="default"/>
	    <xs:enumeration value="none"/>
	  </xs:restriction>
	</xs:simpleType>
  
  <xs:element name="classpath">
   <xs:complexType>
    <xs:sequence>
      <xs:choice maxOccurs="unbounded">
        <xs:element ref="dir" />
        <xs:element ref="jar" />
        <xs:element ref="dirset" />
        <xs:element ref="jarset" />
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="fallback" type="fallback_mode" default="default"/>
   </xs:complexType>
  </xs:element>
  
  <xs:element name="dir">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="include_exclude">
          <xs:attribute name="name" type="xs:string" use="required"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="jar">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="include_exclude">
          <xs:attribute name="name" type="xs:string" use="required"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="dirset">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="include_exclude">
          <xs:attribute name="dir" type="xs:string" use="required"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="jarset">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="include_exclude">
          <xs:attribute name="dir" type="xs:string" use="required"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  
  <xs:complexType name="include_exclude" abstract="true">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="include"/>
        <xs:element ref="exclude"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="includes" type="xs:string" use="optional"/>
    <xs:attribute name="excludes" type="xs:string" use="optional"/>
  </xs:complexType>
  
	<xs:element name="include">
	  <xs:complexType>
	    <xs:attribute name="name" type="xs:string" use="required"/>
	  </xs:complexType>
	</xs:element>
  
	<xs:element name="exclude">
	  <xs:complexType>
	    <xs:attribute name="name" type="xs:string" use="required"/>
	  </xs:complexType>
	</xs:element>
  
  <!-- Web -->
  <xs:element name="web">
   <xs:complexType>
    <xs:sequence>
      <xs:element ref="link" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
   </xs:complexType>
  </xs:element>
  
  <xs:element name="link">
    <xs:complexType>
	    <xs:sequence>
	      <xs:choice maxOccurs="unbounded">
	        <xs:element ref="dir" />
	        <xs:element ref="jar" />
	      </xs:choice>
	    </xs:sequence>
      <xs:attribute type="xs:string" name="target" default="/" use="optional" />
    </xs:complexType>
  </xs:element>
  
  <!-- WAR -->
  <xs:element name="war">
   <xs:complexType>
    <xs:attribute type="xs:string" use="optional" name="file"/>
    <xs:attribute type="xs:string" use="optional" name="dir"/>
   </xs:complexType>
  </xs:element>  

</xs:schema>