public final class YNet extends Ydecomposition<o:p></o:p>
<o:p> </o:p>
Ynet对象表示了 Control Flow的信息。其就是对 processControlElements xml元素中的Task流程的记载。<o:p></o:p>
<o:p> </o:p>
有关Cancel的xml定义<o:p></o:p>
<task id="cancel"><o:p></o:p>
<flowsInto><o:p></o:p>
<nextElementRef id="fin_make_itinerary"/><o:p></o:p>
</flowsInto><o:p></o:p>
<join code="and"/><o:p></o:p>
<split code="and"/><o:p></o:p>
<removesTokens id="register"/><o:p></o:p>
<removesTokens id="ableToCancel"/><o:p></o:p>
<removesTokens id="do_itinerary_segment"/><o:p></o:p>
<removesTokens id="pay"/><o:p></o:p>
<decomposesTo id="cancel"/><o:p></o:p>
</task><o:p></o:p>
<o:p> </o:p>
一段样例的Task定义如下<o:p></o:p>
<task id="record" xsi:type="MultipleInstanceExternalTaskFactsType"><o:p></o:p>
<flowsInto><o:p></o:p>
<nextElementRef id="selectSongs"/><o:p></o:p>
</flowsInto><o:p></o:p>
<join code="xor"/><o:p></o:p>
<split code="and"/><o:p></o:p>
<startingMappings><o:p></o:p>
<mapping><o:p></o:p>
<expression query="<nameOfPerformer>{for $d in /data/nameOfArtist return $d/text()}</nameOfPerformer>"/><o:p></o:p>
<mapsTo>nameOfPerformer</mapsTo><o:p></o:p>
</mapping><o:p></o:p>
<mapping><o:p></o:p>
<expression query="/data/nameOfRecord"/><o:p></o:p>
<mapsTo>nameOfRecord</mapsTo><o:p></o:p>
</mapping><o:p></o:p>
</startingMappings><o:p></o:p>
<decomposesTo id="RecordSong"/><o:p></o:p>
<minimum>1</minimum><o:p></o:p>
<maximum>10</maximum><o:p></o:p>
<threshold>4</threshold><o:p></o:p>
<creationMode code="dynamic"/><o:p></o:p>
<miDataInput><o:p></o:p>
<expression query="<songlist>{if ( count(/data/songlist/*) > 0) then /data/songlist/* else /data/songList_backup/* }</songlist>"/><o:p></o:p>
<splittingExpression query="for $d in /songlist/* return <songLocal> { for $e in $d/* return $e } </songLocal>"/><o:p></o:p>
<formalInputParam>songLocal</formalInputParam><o:p></o:p>
</miDataInput><o:p></o:p>
<miDataOutput><o:p></o:p>
<formalOutputExpression query="/data/songLocal"/><o:p></o:p>
<outputJoiningExpression query="<songlist>{for $d in /data/songLocal return <song>{ for $e in $d/* return $e }</song>}</songlist>"/><o:p></o:p>
<resultAppliedToLocalVariable>songlist</resultAppliedToLocalVariable><o:p></o:p>
</miDataOutput><o:p></o:p>
</task><o:p></o:p>
<o:p> </o:p>
注意,在YAWL解析task xml元素的时候,有关MultipleInstanceExternalTaskFactsType 的相关属性,是跟随在其Task对象(YexternalTask类)内的。而不想其他一些属性,比如flowsInto,inputMapping等等之类,是存放于Ynet对象(记录整个流程相关信息)<o:p></o:p>
<o:p> </o:p>
Moreover, it is possible to indicate that the task terminates the moment a certain threshold of instances has completed. The momentthis threshold is reached, all running instances are terminated and the task completes.If no threshold is specified, the task completes once all instances have completed.<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
其Root Net元素会编译成为 YNet对象。Decomposition的类型如果为“NetFactsType”,则也编译为Ynet对象,如果为“WebServiceGatewayFactsType”,则编译为YAWLServiceGateway 对象。<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
当然,Token是存储在 Condition(Place)之中。<o:p></o:p>
YAWL的place接口是 Ycondition,其实现类是 au.edu.qut.yawl.elements.YexternalCondition。<o:p></o:p>
<o:p> </o:p>
这个Condition类中有一个YidentifierBag对象: protected YIdentifierBag _bag;<o:p></o:p>
利用YIdentifierBag对象来记录 当前Condition中所包含的 Token,以及这个Token的值(或者说叫作数量)。<o:p></o:p>
来看看YidentifierBag处理原则:<o:p></o:p>
/**<o:p></o:p>
* 新增Token对象<o:p></o:p>
* @param identifier 代表Token对象<o:p></o:p>
*/ <o:p></o:p>
public void addIdentifier(YIdentifier identifier){<o:p></o:p>
/**<o:p></o:p>
* 不光新增token,而且还记录这个token的数量(相当于记录多个token)<o:p></o:p>
*/<o:p></o:p>
int amount = 0;<o:p></o:p>
if(_idToQtyMap.containsKey(identifier)){<o:p></o:p>
amount = ((Integer) _idToQtyMap.get(identifier)).intValue();<o:p></o:p>
}<o:p></o:p>
_idToQtyMap.put(identifier, new Integer(++amount));<o:p></o:p>
identifier.addLocation(_condition);<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
<o:p></o:p>