OSWorkflow观念探讨 -转自史蒂芬

[b] --流程设定基础 [/b]
(史帝芬, 2005/6/6, hi.steven@gmail.com)

看完第一支程式,相信读者会有许多疑问,这里先就流程的设定做初步的介绍。首先,读者应该注意到了,第一支程式的用到三个xml设定档,这三个是设定流程的设定档,说明如下。

osworkflow.xml:这个档案是设定流程是否存在资料库或存在记忆体,前面的内容是存在MS SQL Server的写法。

leave.xml:请假流程写在这个档案,这也是osworkflow的重点之一。

workflows.xml:指定系统启动时要载入那些流程。


这里针对leave.xml做些说明…

initial-actions:每个流程都至少需定义一个initial-actions,这是流程的起点。

action:导致流程变动的动作,每个action都有个编号,且不能重复。

step:虽然它的名称是步骤,似乎它会有动作?其实将它视为流程位置可能比较恰当,osworkflow真正的动作在action发生。

result:执行动作后的结果,result有两种conditional-result和unconditional-result,每个result一定有unconditional-result,当conditional-result的条件都不满足时,就执行unconditional-result。

status:流程在某个action时的状态。

old-status:流程执行某个action后的状态。

caller:这是OSWorkflow的保留字,可取得呼叫此工作流的user,即Workflow workflow = new BasicWorkflow(caller);在资料库中会记录于Table OS_HISTORYSTEP如下:


記得在pre-functions加上如下設定…
[img]http://friping.iteye.com/upload/attachment/85277/bc1b03de-0dc9-3460-984b-0aae1f24428b.jpg[/img]
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
owner:這是傳工作流到此步驟的user。

[b] --限制条件 转自史蒂芬[/b]
编辑
第二支程式只举AllowOwnerOnlyCondition为例,事实上OSWorkflow 2.7版提供了以下四种限制条件。

OSUserGroupCondition:限制由隶属某指定Group的人执行。

StatusCondition:限制step的status为某个值时才能执行。

AllowOwnerOnlyCondition:只允许Owner执行。

DenyOwnerCondition:只有Owner不能执行。

当同时要加上两个限制条件时,可以如下写。


<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">
com.opensymphony.workflow.util.StatusCondition
</arg>
<arg name="status">Queued</arg>
</condition>
<condition type="class">
<arg name="class.name">
com.opensymphony.workflow.util.OSUserGroupCondition
</arg>
<arg name="group">A0001</arg>
</condition>
</conditions>
</restrict-to>

[b] --传值储值 [/b]
Property sets:持续性变数,会将变数值存入Table OS_PROPERTYENTRY,在设定档中以propertySet来存取。

Transient Map:临时性变数,仅在workflow中有效,在设定档中以transientVars来存取。

外部函数:外部函数要实作FunctionProvider,如第三支程式的OutputPropertySet,在设定档中如下呼叫使用。
<function type="class">
<arg name="class.name">
tw.idv.idealist.OutputPropertySet
</arg>
<arg name="author">Steven Shi</arg>
</function>

[b] --校验器[/b]
看完第四支程式应该多半的人已经知道怎么做校验器了!这里再大略讲解一下。首先写一个类别,这个类别要实作Validator,如前面程式的MyValidator,如有错误抛出exception。接下来在流程设定档中加入

<validators>
<validator type="class">
<arg name="class.name">
tw.idv.idealist.MyValidator
</arg>
</validator>
</validators>

上面這一段設定應放在那裡? 這可以查一下DTD,就知道應放於那個位置了。
<!ELEMENT action (meta*, restrict-to? , validators?, pre-functions?, results, post-functions?)>


[b]--查询API [/b]
要使用OSWorkflow提供的Query API,先继承AbstractWorkflow,透过AbstractWorkflow里的getPersistence method可连接资料做查询,其余的语法参考程式即可知道,这里针对几点做说明:

WorkflowExpressionQuery参数
这个类别建立时所需的四个参数,第二个对应到资料库的Table如下所示,第一个则对应到Table中的栏位,栏位如何对应由名称应可明了,不另作说明。

常數 Table
FieldExpression.ENTRY OS_WFENTRY
FieldExpression.CURRENT_STEPS OS_CURRENTSTEP
FieldExpression.HISTORY_STEPS OS_HISTORYSTEP

第三個參數為運算元,只有四種如下:
運算元 說明
FieldExpression.EQUALS 等於
FieldExpression.NOT_EQUALS 不等於
FieldExpression.GT 大於
FieldExpression.LT 小於


巢状运算
如果要比较的不只一个栏位,就需要用到巢状运算,使用class NestedExpression,底下是一个官方文件的范例:

// Get all finished workflow entries
//where the current owner is 'testuser'
Expression queryLeft = new FieldExpression(
FieldExpression.OWNER,
FieldExpression.CURRENT_STEPS,
FieldExpression.EQUALS, 'testuser');
Expression queryRight = new FieldExpression(
FieldExpression.STATUS,
FieldExpression.CURRENT_STEPS,
FieldExpression.EQUALS,
"Finished",
true);
WorkflowExpressionQuery query =
new WorkflowExpressionQuery(
new NestedExpression(
new Expression[] {queryLeft, queryRight},
NestedExpression.AND));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值