<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsfl="http://www.cs.cf.ac.uk/User/Yan.Huang/xmlschema/wsfl/"
    xmlns:swfl="http://www.cs.cf.ac.uk/User/Yan.Huang/xmlschema/swfl/"
    targetNamespace="http://www.cs.cf.ac.uk/User/Yan.Huang/xmlschema/swfl/"
    elementFormDefault="qualified">

<xsd:element name="definitions" type="swfl:definitionsType">
    <xsd:unique name="swflFlowModelName">
        <xsd:selector xpath="swflFlowModel"/>
        <xsd:field xpath="@name"/>
    </xsd:unique>
</xsd:element>

<xsd:complexType name="definitionsType">
    <xsd:sequence>
        <xsd:element ref="swfl:swflFlowModel"
            minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
</xsd:complexType>


<xsd:element name="swflFlowModel" type="swfl:swflFlowModelType">
    <xsd:key name="providerName">
        <xsd:selector xpath="serviceProvider"/>
        <xsd:field xpath="@name"/>
    </xsd:key>
    <xsd:key name="activityName">
        <xsd:selector xpath="activity"/>
        <xsd:field xpath="@name"/>
    </xsd:key>
    <xsd:unique name="controlLinkName">
        <xsd:selector xpath="controlLink"/>
        <xsd:field xpath="@name"/>
    </xsd:unique>
    <xsd:unique name="dataLinkName">
        <xsd:selector xpath="dataLink"/>
        <xsd:field xpath="@name"/>
    </xsd:unique>
    <xsd:keyref name="linkActivityRef" refer="activityName">
        <xsd:selector xpath="implement|import"/>
        <xsd:field xpath="@source|@target"/>
    </xsd:keyref>
</xsd:element>

<xsd:complexType name="swflFlowModelType">
    <xsd:sequence>
        <xsd:element ref="wsdl:message"
            minOccurs="0"  maxOccurs="unbounded"/>
        <xsd:element name="flowSource" type="wsfl:flowSourceType"
            minOccurs="0"/>
        <xsd:element name="flowSink" type="wsfl:flowSinkType"
            minOccurs="0"/>
        <xsd:element name="serviceProvider" type="wsfl:serviceProviderType"
            minOccurs="0" maxOccurs="unbounded"/>
        <xsd:group ref="activityFlowGroup"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="NCName" use="required"/>
    <xsd:attribute name="serviceProviderType" type="Qname"/>
</xsd:complexType>

<xsd:group name="activityFlowGroup">
    <xsd:sequence>
        <xsd:element name="activity" type="swflActivityType"
            minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="controlLink" type="swflControllinkType"
            minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="dataLink" type="swflDatalinkType"
            minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
</xsd:group>

<xsd:complexType name="swflActivityType">
    <xsd:choice>
        <xsd:element name="normal" type="wsfl:ActivityType"/>
        <xsd:element name="assign" type="assignmentType"/>
        <xsd:element name="if" type="controlType"/>
        <xsd:element name="while" type="loopType"/>
        <xsd:element name="dowhile" type="loopType"/>
        <xsd:element name="for" type="loopType"/>
        <xsd:element name="switch" type="controlType">
            <xsd:key name="CasePortName">
                <xsd:selector xpath="case"/>
                <xsd:field xpath="@port"/>
            </xsd:key>
        </xsd:element>
    </xsd:choice>
    <xsd:attribute name="operation" type="NCName"/>
</xsd:complexType>

<xsd:complexType name="assignmentType">
    <xsd:complexContent>
        <xsd:extension base="wsdl:tOperation">
            <xsd:sequence>
                <xsd:element name="left" type="dataPartType"/>
                <xsd:element name="right" type="dataPartType"/>
            </xsd:sequence>
            <xsd:attribute name="flowsource" type="NCName"/>
            <xsd:attribute name="part" type="NCName"/>
            <xsd:attribute name="converter" type="xsd:string" use="optional"/>
            <xsd:attribute name="assignType" type="assignTypeType"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:simpleType name="assignTypeType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="="/>
        <xsd:enumeration value="+="/>
        <xsd:enumeration value="-="/>
        <xsd:enumeration value="*="/>
        <xsd:enumeration value="/="/>
    </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="loopType">
    <xsd:complexContent>
        <xsd:extension base="wsdl:tOperation">
            <xsd:sequence>
                <xsd:element name="expression" type="xsd:string"/>
            </xsd:sequence>
            <xsd:attribute name="setParallel" type="YesOrNoType"
                default="no" use="optional"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="controlType">
    <xsd:complexContent>
        <xsd:extension base="wsdl:tOperation">
            <xsd:sequence>
                <xsd:element name="case" type="caseType"
                        minOccur="0" maxOccur="unbounded"/>
                <xsd:element name="defaultCase" type="defaultCaseType"
                        minOccur="0"/>
            </xsd:sequence>
            <xsd:attribute name="expression" type="String" use="optional"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="caseType">
    <xsd:extension base="xsd:String">
        <xsd:attribute name="port" type="string" use="required"/>
    </xsd:extension>
</xsd:complexType>

<xsd:complexType name="defaultCaseType">
    <xsd:extension base="xsd:string">
        <xsd:attribute name="port" type="string" fixed="default" use="required"/>
    </xsd:extension>
</xsd:complexType>

<xsd:complexType name="swflDatalinkType">
    <xsd:complexContent>
        <xsd:extension base="linkType">
            <xsd:sequence>
                <xsd:element ref="swflMap" minOccurs="0"/>
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:simpleType name="YesOrNoType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="yes"/>
        <xsd:enumeration value="no"/>
    </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="swflControllinkType">
    <xsd:complexContent>
            <xsd:extension base="wsfl:controlLinkType">
                <xsd:attribute name="controlPort" type="xsd:integer"
                        use="optional"/>
            </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:element name="swflMap" type="swflMapType"/>
  <xsd:complexType name="swflMapType">
    <xsd:sequence>
        <xsd:element name="part" type="mapPartType"
                    minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="sourceMessage" type="NCName"/>
    <xsd:attribute name="targetMessage" type="NCName"/>
  </xsd:complexType>

  <xsd:complexType name="mapPartType">
    <sequence>
        <xsd:element name="sourcePart" type="dataPartType"/>
        <xsd:element name="targetpart" type="dataPartType"/>
    </sequence>
    <xsd:attribute name="name" type="NCName" use="optional"/>
    <xsd:attribute name="converter" type="NCName" use="optional"/>
    <xsd:attribute name="sharedType" type="YesOrNoType"
        default="no"  use="optional"/>
  </xsd:complexType>


  <xsd:complexType name="dataPartType">
    <xsd:sequence>
        <xsd:element name="item" type="itemType"
                    minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="NCName" use="optional"/>
  </xsd:complexType>

  <xsd:complexType name="itemType">
    <xsd:choice>
        <xsd:element name="field">
            <xsd:complexType>
                <xsd:attribute name="name" type="xsd:string"/>
            </xsd:complexType>
        </xsd:element>
        <xsd:element name="index">
                    <xsd:complexType>
                <xsd:attribute name="dimension" type="xsd:integer"/>
                <xsd:attribute name="index" type="xsd:string"/>
            </xsd:complexType>
        </xsd:element>
    </xsd:choice>
  </xsd:complexType>

</xsd:schema>
