String group = (String) args.get("group");
//判断该操作员是否在运行的组中.
return user.inGroup(group);
} catch (EntityNotFoundException e) {
return false;
}
}
工作项的获得
OSWorkflow本身没有工作项的概念,,但它提供了灵活的机制,使开发者能够实现自己的工作项,我们可以在steps里定义一个<pre-functions>来实现这一功能.如果开发自己的function必须实现OSWorkflow提供的接口: com.opensymphony.workflow.FunctionProvider,该接口的定义如下:
package com.opensymphony.workflow;
import com.opensymphony.module.propertyset.PropertySet;
import java.util.Map;
/**
* Interface to be implemented by any class that are to be called from within a workflow as a function,
* either as a pre-function or a post-function.The args nested elements within the function xml call
* will be mapped to the properties parameter.
*
* @author <a href="mailto:plightbo@hotmail.com">Pat Lightbody</a>
* @version $Revision: 1.5 $
*/
public interface FunctionProvider {
//~ Methods ////////////////////////////////////////////////////////////////
public void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException;
}
该接口也只有一个方法,方法的参数同Condition.
我们首先要定义一个wo***tem表,用来存放我们的工作项列表.这里列出该表的一些必须的字段.
Create table wo***tem
(
Id number, --主键
Entry_ID number, --流程实例ID
Step_ID number, --step id
Type char(1), --参与者的类型 0 为某员工,某个角色,某个group,
--某个前step的执行者.
Value number, -- 参与者的实际值,可以是员工的ID,角色的ID,group的ID
)
在数据库里创建该表后,修改我们的流程定义.举个例子来说:
<step id=”6” name=”approve”>
<pre_functions>
<function type=”class”>
<arg name=”class.name”>os.TestFunctionProvider</args>
<arg name=”type”>group</arg>
<arg name=”value”>zte</arg>
</function>
</pre_functions>
<actions>
…
<actions>
</step>
下面是我们需要实现的os.TestFunctionProvider伪码:
public class TestFunctionProvider implements FunctionProvider {
//~ Methods ////////////////////////////////////////////////////////////////
public void execute(Map transientVars, Map args, PropertySet ps) {
WorkflowEntry entry = (WorkflowEntry) transientVars.get("entry");
//得到流程实例ID
String entry_id = entry.getId ();
//得到当前的stepId
String stepIdVal = (String) args.get("stepId");
//得到流程参与者的类型
String type = (String)args.get (“type”);
//得到流程参与者的值.
String value = (String)args.get(“value”);
//执行sql操作,把相关值存到数据库的wo***tem中
transientVars.put("caller", context.getCaller());
}
}
通过查询wo***tem表,就可以得到工作项了. |