<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns=          "urn:jbpm.org:jpdl-3.1" 
           targetNamespace="urn:jbpm.org:jpdl-3.1" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

  <!--  PROCESS-DEFINITION -->
  <!--  ################## -->
  <xs:element name="process-definition">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="swimlane" />
        <xs:element ref="start-state" />
        <xs:group   ref="node-elements"/>
        <xs:group   ref="action-elements" />
        <xs:element ref="event" />
        <xs:element ref="exception-handler" />
        <xs:element ref="task" />
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <!--  SWIMLANE -->
  <!--  ######## -->
  <xs:element name="swimlane">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="1">
        <xs:element ref="assignment"/>
      </xs:sequence>
      <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <!--  NODES -->
  <!--  ##### -->
  <xs:element name="start-state">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="task"/>
        <xs:element ref="transition"/>
        <xs:element ref="event"/>
        <xs:element ref="exception-handler"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="end-state">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="event"/>
        <xs:element ref="exception-handler"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="decision">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="handler" type="delegation" />
        <xs:element ref="event"/>
        <xs:element ref="exception-handler"/>
        <xs:element name="transition">
          <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="condition">
                <xs:complexType mixed="true">
                  <xs:sequence minOccurs="0" maxOccurs="unbounded">
                    <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
                  </xs:sequence>
                  <xs:attribute name="expression" type="xs:string" />
                </xs:complexType>
              </xs:element>
              <xs:group ref="action-elements"/>
              <xs:element ref="exception-handler"/>
            </xs:choice>
            <xs:attribute name="to" type="xs:string" use="required" />
            <xs:attribute name="name" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="expression" type="xs:string" />
      <xs:attribute name="async" type="xs:string" default="false" />
    </xs:complexType>
  </xs:element>

  <xs:element name="fork">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="script" />
        <xs:group ref="node-content-elements" />
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="async" type="xs:string" default="false" />
    </xs:complexType>
  </xs:element>
  
  <xs:element name="join">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="node-content-elements" />
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="async" type="xs:string" default="false" />
    </xs:complexType>
  </xs:element>

  <xs:element name="node">
    <xs:complexType>
      <xs:sequence>
        <xs:choice minOccurs="0">
          <xs:group ref="action-elements" />
        </xs:choice>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:group ref="node-content-elements" />
        </xs:choice>
      </xs:sequence>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="async" type="xs:string" default="false" />
    </xs:complexType>
  </xs:element>

  <xs:element name="process-state">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="sub-process">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:attribute name="version" type="xs:integer" />
          </xs:complexType>
        </xs:element>
        <xs:element ref="variable" />
        <xs:group ref="node-content-elements" />
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="async" type="xs:string" default="false" />
    </xs:complexType>
  </xs:element>

  <xs:element name="state">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="node-content-elements"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="async" type="xs:string" default="false" />
    </xs:complexType>
  </xs:element>

  <xs:element name="super-state">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="node-elements"/>
        <xs:group ref="node-content-elements"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="async" type="xs:string" default="false" />
    </xs:complexType>
  </xs:element>

  <xs:element name="task-node">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="task" />
        <xs:group ref="node-content-elements" />
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="create-tasks" type="booleanType" default="true" />
      <xs:attribute name="end-tasks" type="booleanType" default="false" />
      <xs:attribute name="signal" default="last">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="unsynchronized"/>
            <xs:enumeration value="never"/>
            <xs:enumeration value="first"/>
            <xs:enumeration value="first-wait"/>
            <xs:enumeration value="last"/>
            <xs:enumeration value="last-wait"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="async" type="xs:string" default="false" />
    </xs:complexType>
  </xs:element>

  <!--  TRANSITION -->
  <!--  ########## -->
  <xs:element name="transition">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="action-elements"/>
        <xs:element ref="exception-handler" />
      </xs:choice>
      <xs:attribute name="to" type="xs:string" use="required" />
      <xs:attribute name="name" type="xs:string" />
    </xs:complexType>
  </xs:element>

  <!-- ACTIONS -->
  <!-- ####### -->
  <xs:element name="action">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="class" type="xs:string" />
      <xs:attribute name="config-type" default="field">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="field"/>
            <xs:enumeration value="bean"/>
            <xs:enumeration value="constructor"/>
            <xs:enumeration value="configuration-property"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="name" type="xs:string" />
      <xs:attribute name="ref-name" type="xs:string" />
      <xs:attribute name="accept-propagated-events" type="booleanType" default="true" />
      <xs:attribute name="expression" type="xs:string" />
      <xs:attribute name="async" type="xs:string" />
    </xs:complexType>
  </xs:element>

  <xs:element name="cancel-timer">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="create-timer">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="action"/>
        <xs:element ref="script"/>
      </xs:choice>
      <xs:attribute name="duedate" type="xs:string" use="required" />
      <xs:attribute name="name" type="xs:string" />
      <xs:attribute name="repeat" type="xs:string" />
      <xs:attribute name="transition" type="xs:string" />
    </xs:complexType>
  </xs:element>

  <xs:element name="script">
    <xs:complexType  mixed="true">
      <xs:sequence>
        <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="name" type="xs:string" />
      <xs:attribute name="accept-propagated-events" type="booleanType" default="true" />
    </xs:complexType>
  </xs:element>

  <!--  EVENT -->
  <!--  ##### -->
  <xs:element name="event">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="action-elements"/>
      </xs:choice>
      <xs:attribute name="type" use="required">
        <xs:simpleType>
          <xs:union>
            <xs:simpleType>
              <xs:restriction base="xs:string"/>
            </xs:simpleType>
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="node-enter"/>
                <xs:enumeration value="node-leave"/>
                <xs:enumeration value="process-start"/>
                <xs:enumeration value="process-end"/>
                <xs:enumeration value="task-create"/>
                <xs:enumeration value="task-assign"/>
                <xs:enumeration value="task-start"/>
                <xs:enumeration value="task-end"/>
                <xs:enumeration value="before-signal"/>
                <xs:enumeration value="after-signal"/>
                <xs:enumeration value="superstate-enter"/>
                <xs:enumeration value="superstate-leave"/>
                <xs:enumeration value="timer-create"/>
                <xs:enumeration value="subprocess-created"/>
                <xs:enumeration value="subprocess-end"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:union>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <!--  EXCEPTION-HANDLER -->
  <!--  ################# -->
  <xs:element name="exception-handler">
    <xs:complexType>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element ref="action"/>
        <xs:element ref="script"/>
      </xs:choice>
      <xs:attribute name="exception-class" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <!--  TASK -->
  <!--  #### -->
  <xs:element name="task">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="assignment"/>
        <xs:element ref="controller"/>
        <xs:element ref="event"/>
        <xs:element ref="timer"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:string" />
      <xs:attribute name="blocking" type="booleanType" default="false"/>
      <xs:attribute name="signalling" type="booleanType" default="true"/>
      <xs:attribute name="description" type="xs:string" />
      <xs:attribute name="duedate" type="xs:string" />
      <xs:attribute name="swimlane" type="xs:string" />
      <xs:attribute name="priority" type="priorityType" default="normal" />
    </xs:complexType>
  </xs:element>
  
  <xs:element name="controller" type="delegation" />

  <xs:element name="assignment">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="delegation">
          <xs:attribute name="expression" type="xs:string" />
          <xs:attribute name="actor-id" type="xs:string" />
          <xs:attribute name="pooled-actors" type="xs:string" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <!--  TIMER -->
  <!--  ##### -->
  <xs:element name="timer">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="action"/>
        <xs:element ref="script"/>
      </xs:choice>
      <xs:attribute name="duedate" type="xs:string" use="required" />
      <xs:attribute name="name" type="xs:string" />
      <xs:attribute name="repeat" type="xs:string" />
      <xs:attribute name="transition" type="xs:string" />
    </xs:complexType>
  </xs:element>

  <xs:element name="variable">
    <xs:complexType>
      <xs:sequence>
        <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="access" type="xs:string" default="read,write"/>
      <xs:attribute name="mapped-name" type="xs:string" />
    </xs:complexType>
  </xs:element>
  
  <!-- TYPES AND GROUPS -->
  <!-- ################ -->
  <xs:complexType name="delegation" mixed="true">
    <xs:sequence>
      <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="class" type="xs:string" />
    <xs:attribute name="config-type" default="field">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="field"/>
          <xs:enumeration value="bean"/>
          <xs:enumeration value="constructor"/>
          <xs:enumeration value="configuration-property"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>

  <xs:simpleType name="configType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="field"/>
      <xs:enumeration value="bean"/>
      <xs:enumeration value="constructor"/>
      <xs:enumeration value="configuration-property"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="booleanType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="yes"/>
      <xs:enumeration value="no"/>
      <xs:enumeration value="true"/>
      <xs:enumeration value="false"/>
      <xs:enumeration value="on"/>
      <xs:enumeration value="off"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="priorityType">
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="highest"/>
          <xs:enumeration value="high"/>
          <xs:enumeration value="normal"/>
          <xs:enumeration value="low"/>
          <xs:enumeration value="lowest"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="xs:int"/>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

  <xs:group name="node-elements">
    <xs:choice>
      <xs:element ref="node"/>
      <xs:element ref="state"/>
      <xs:element ref="task-node"/>
      <xs:element ref="super-state"/>
      <xs:element ref="process-state"/>
      <xs:element ref="fork"/>
      <xs:element ref="join"/>
      <xs:element ref="decision"/>
      <xs:element ref="end-state"/>
    </xs:choice>
  </xs:group>
  
  <xs:group name="action-elements">
    <xs:choice>
      <xs:element ref="action"/>
      <xs:element ref="script"/>
      <xs:element ref="create-timer"/>
      <xs:element ref="cancel-timer"/>
    </xs:choice>
  </xs:group>
  
  <xs:group name="node-content-elements">
    <xs:choice>
      <xs:element ref="event"/>
      <xs:element ref="exception-handler"/>
      <xs:element ref="timer"/>
      <xs:element ref="transition"/>
    </xs:choice>
  </xs:group>

</xs:schema>
