Workflow Patterns and YAWL (Yet Another Workflow Language)

Workflow Patterns

Workflow Patterns emerged in some time in 1990's when it was acknowleged that tehre is a lack of basic researches in workflow or business processes in general. As Workflow Patterns collections matured, the group in QUT (Queensland University of Technology, Auslaria) and EUT  (Eindhoven University of Technology, the Netherlands) developed YAWL (see below). It is a new workflow language which is more generic and appropriate conceptually and theoritically than existing proprietary models and lauguages. The problems of proprietary solutions are that they may not be theoriticaly consistent or well-thought of, that they may not be generially applicable, that the different concepts or models (or language) may not be compatible to each other, and that they may be biased for special applications.

For examples and better explanations, please see:  QUT Workflow Patters site or EUT Workflow site

YAWL (Yet Another Workflow Language)

YAWL has been developed based on the Workflow Patterns. The YAWL site states that it is apparently based on [Petri Net].

While Petri Net uses Positions, Arcs and Transitions, a YAWL Net (a workflow or process) uses Tasks, Arcs, Conditions and Terminators (start an end), i.e. there is no Transion which sits between Positions and determins spits and merges. Different from Petri Net Tansition, the YAWL Condition is a way to represent the transitional "state" and it is realy a simple connector of Arcs, i.e. it does not impose any user-definable conditions for branching in spite of the name. It is useful as a split/merge points for Arcs to synchronize execution tokens in a Net., acting like an AND point.

In fact, it is important to note that Arcs and Conditons do not have any functionality that you can set, like conditions or shchronizing. They are simply connecting elements of Tasks. Branching or merging conditions and the manners (AND, OR or XOR) in YAWL are actually handled by Tasks themselves with "Decoration" functionality of the Editor, which adds AND, OR or XOR splits (outbound) or joins (inbound) to those Tasks. In constrac, an un-decorated Task can accept only one Arc in and one Arc out.

Also, just like the mathematical tradition of Petri Net, YAWL desings can be validated for its rechability, for example. A workflow, or Net, also must have one start and one end. In contrast, it is interesting to note that in XPDL a Process can have multiple starts and ends in one Lane (equivalent to Net).  In YAWL, all branches also must merge to the one end to finish in a Net.

New YAWL

Recently a "newYAWL" was released as:

N. Russell, A.H.M. ter Hofstede, D. Edmond, and W.M.P. van der Aalst. newYAWL: Achieving Comprehensive Patterns Support in Workflow for the Control-Flow, Data and Resource Perspectives. BPM Center Report BPM-07-05, BPMcenter.org, 2007.

Changes made in terms of constructs are as follows (the figure was taken from the above document by Russell et al).


 

YAWL example 

The following figure shows basic elements in YAWL. Arrows are Arcs.


 
Splits and Joins in YAWL are added to Tasks.
 

 
YAWL also has a concept of Data Flow. In the editor, these are defined as local valiables (Task varialbes) and global varialbles (Net variables). These can be used for inter-Task communications within a Net. However, it does not seem that there are global variables which can be shared between different Nets. Accordting to  "Design and implementation of YAWL sytem", W.M.P. van Aalst et al, apparently this is a limitation Petri Net (on which the current YAWL is based) and the the future YAWL will be extend to include inter-Net communications in order to overcome this limitation.

The current version (as of 2007-03-26) of YAWL is Beta 8.

YAWL implemetation

YAWL.org provides YAWL Editor (V. 1.4), Engine (V 7.1) and Nexus Web Server (RC1), which are available from the YAWL web site or from Sourceforge YAWL project.

The following image is from the YAWL web site, showing an example design on their YAWL Editor (Java). 

 

YAWL Export format

Although YAWL Editor normally saves workflow designs as YAWL internal format (extension .ywl), it exports workflows as an XML format to the YAWL engines so that it can be understood by them and executed.

Although the struture of the XML is not intended to be any standard (since the YAWL is a concept which is neutral to modelling tool - such as graphical modelling - or lauguage), the file exported from the example workflow design by the Editor (V 1.4) is as below.

It is of interest as to how the Arcs, split and joins are handled. 

<flowsInto>
            <nextElementRef id="Chat_6" />
            <isDefaultFlow />
          </flowsInto>
          <flowsInto>
            <nextElementRef id="Forum_8" />
            <predicate ordering="0">New_Net_1/vote/text()</predicate>
          </flowsInto>
          <join code="xor" />
          <split code="xor" />

As exemplifined in this XML, the condition of the XOR split is formulated as an XPath expression, using any Task or Net variables, which "simple" values, such as boolean, double, long or string. That is definitely one way to properly address the variables since they are exported within the XML document. It, however, is not necessarily essential to address the local and global variables with the XPath format, although it has an advantage of avoiding possible name clash.

<?xml version="1.0" encoding="UTF-8"?>
<specificationSet version="Beta 7.1"
	xmlns="http://www.citi.qut.edu.au/yawl"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.citi.qut.edu.au/yawl d:/yawl/schema/YAWL_SchemaBeta7.1.xsd">
  <specification uri="unnamed.ywl">
    <metaData>
      <creator>yoichitakayama</creator>
      <description>No description has been given.</description>
      <version>0.1</version>
    </metaData>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" />
    <decomposition id="New_Net_1" isRootNet="true" xsi:type="NetFactsType">
      <inputParam>
        <name>vote</name>
        <type>boolean</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>poll</name>
        <type>long</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>posts</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>cahts</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>chats</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <outputParam>
        <name>vote</name>
        <type>boolean</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
      <outputParam>
        <name>chats</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
      <outputParam>
        <name>poll_output</name>
        <type>long</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
      <outputParam>
        <name>posts</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
      <outputParam>
        <name>cahts</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
      <outputParam>
        <name>poll</name>
        <type>long</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
      <localVariable>
        <name>poll_output</name>
        <type>long</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </localVariable>
      <processControlElements>
        <inputCondition id="InputCondition_1">
          <name>Start</name>
          <flowsInto>
            <nextElementRef id="Vote_7" />
          </flowsInto>
        </inputCondition>
        <task id="Vote_7">
          <name>Vote</name>
          <flowsInto>
            <nextElementRef id="Chat_6" />
            <isDefaultFlow />
          </flowsInto>
          <flowsInto>
            <nextElementRef id="Forum_8" />
            <predicate ordering="0">New_Net_1/vote/text()</predicate>
          </flowsInto>
          <join code="xor" />
          <split code="xor" />
          <completedMappings>
            <mapping>
              <expression query="&lt;poll&gt;{/vote/poll/text()}&lt;/poll&gt;" />
              <mapsTo>poll</mapsTo>
            </mapping>
            <mapping>
              <expression query="&lt;vote&gt;{/vote/vote/text()}&lt;/vote&gt;" />
              <mapsTo>vote</mapsTo>
            </mapping>
          </completedMappings>
          <decomposesTo id="vote" />
        </task>
        <task id="Forum_8">
          <name>Forum</name>
          <flowsInto>
            <nextElementRef id="Report_25" />
          </flowsInto>
          <join code="xor" />
          <split code="and" />
          <startingMappings>
            <mapping>
              <expression query="&lt;vote&gt;{/New_Net_1/vote/text()}&lt;/vote&gt;" />
              <mapsTo>vote</mapsTo>
            </mapping>
            <mapping>
              <expression query="&lt;poll&gt;{/New_Net_1/poll/text()}&lt;/poll&gt;" />
              <mapsTo>poll</mapsTo>
            </mapping>
          </startingMappings>
          <completedMappings>
            <mapping>
              <expression query="&lt;posts&gt;{/Forum/posts/text()}&lt;/posts&gt;" />
              <mapsTo>posts</mapsTo>
            </mapping>
          </completedMappings>
          <decomposesTo id="Forum" />
        </task>
        <task id="Chat_6">
          <name>Chat</name>
          <flowsInto>
            <nextElementRef id="Report_25" />
          </flowsInto>
          <join code="xor" />
          <split code="and" />
          <startingMappings>
            <mapping>
              <expression query="&lt;vote&gt;{/New_Net_1/vote/text()}&lt;/vote&gt;" />
              <mapsTo>vote</mapsTo>
            </mapping>
            <mapping>
              <expression query="&lt;poll&gt;{/New_Net_1/poll/text()}&lt;/poll&gt;" />
              <mapsTo>poll</mapsTo>
            </mapping>
          </startingMappings>
          <completedMappings>
            <mapping>
              <expression query="&lt;chats&gt;{/chat/chats/text()}&lt;/chats&gt;" />
              <mapsTo>chats</mapsTo>
            </mapping>
          </completedMappings>
          <decomposesTo id="chat" />
        </task>
        <task id="Report_25">
          <name>Report</name>
          <flowsInto>
            <nextElementRef id="OutputCondition_2" />
          </flowsInto>
          <join code="xor" />
          <split code="and" />
          <startingMappings>
            <mapping>
              <expression query="&lt;vote&gt;{/New_Net_1/vote/text()}&lt;/vote&gt;" />
              <mapsTo>vote</mapsTo>
            </mapping>
            <mapping>
              <expression query="&lt;chats&gt;{/New_Net_1/chats/text()}&lt;/chats&gt;" />
              <mapsTo>chats</mapsTo>
            </mapping>
            <mapping>
              <expression query="&lt;posts&gt;{/New_Net_1/posts/text()}&lt;/posts&gt;" />
              <mapsTo>posts</mapsTo>
            </mapping>
            <mapping>
              <expression query="&lt;poll&gt;{/New_Net_1/poll/text()}&lt;/poll&gt;" />
              <mapsTo>poll</mapsTo>
            </mapping>
          </startingMappings>
          <decomposesTo id="report" />
        </task>
        <outputCondition id="OutputCondition_2">
          <name>End</name>
        </outputCondition>
      </processControlElements>
    </decomposition>
    <decomposition id="vote" xsi:type="WebServiceGatewayFactsType">
      <outputParam>
        <name>vote</name>
        <type>boolean</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
      <outputParam>
        <name>poll</name>
        <type>long</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
    </decomposition>
    <decomposition id="report" xsi:type="WebServiceGatewayFactsType">
      <inputParam>
        <name>poll</name>
        <type>long</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>vote</name>
        <type>boolean</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>chats</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>posts</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
    </decomposition>
    <decomposition id="Forum" xsi:type="WebServiceGatewayFactsType">
      <inputParam>
        <name>vote</name>
        <type>boolean</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>poll</name>
        <type>long</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <outputParam>
        <name>posts</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
    </decomposition>
    <decomposition id="chat" xsi:type="WebServiceGatewayFactsType">
      <inputParam>
        <name>vote</name>
        <type>boolean</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <inputParam>
        <name>poll</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </inputParam>
      <outputParam>
        <name>chats</name>
        <type>string</type>
        <namespace>http://www.w3.org/2001/XMLSchema</namespace>
      </outputParam>
    </decomposition>
  </specification>
</specificationSet>
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.