osworkflow(一) 基本api解析

一、怎样取得当前步骤的信息
Workflow wf = new BasicWorkflow(username);
Step step = (step)wf.getCurrentSteps(id).iterator().next();
这样就得到了当前需要执行的步骤,返回的是一个step,step可以得到的信息一般可用的是getCaller(),得到当前的执行者,getEntryId(),得到工作流的id,这个不理解,既然得到step需要传入workflow的id,为什么还需要此方法?
如果需要得到步骤的描述信息,则需要得到StepDescriptor:
1.先获得WorkflowDescriptor
WorkflowDescriptor wd = wf.getWorkflowDescriptor(wf.getWorkflowName(id));
2.获得StepDescriptor
StepDescriptor sd = wd.getStep(stepId);//这里的stepId可以用step.getStepId()来取得
3.StepDescriptor可以得到的信息
StepDescriptor可以得到在xml中配置的描述信息,比如step的名称,sd.getName();


二、怎么取得可执行动作的信息
估计猜也猜得到了,取得ActionDescriptor;
没错,先用StepDescriptor取得ActionDescriptor,这样就能获取执行动作的名称等信息。

所以在osworkflow中可以写一些常用的Util方法,可是也许是osworkflow的设计问题,每个Util方法都得重复很多代码,比如重复得获取WorkflowDescriptor.StepDescriptor等等。。。。
简单例子如下:

public static List<Action> getActionNames(long id,String username){
List<Action> actions = new ArrayList<Action>();

List<String> names = new ArrayList<String>();
Workflow wf = new BasicWorkflow(username);
WorkflowDescriptor wd = wf.getWorkflowDescriptor(wf.getWorkflowName(id));
Step step = (Step) wf.getCurrentSteps(id).iterator().next();
StepDescriptor sd = wd.getStep(step.getStepId());

List<ActionDescriptor> ads = sd.getActions();
for(ActionDescriptor a:ads){
Action action = new Action();
action.setActionId(a.getId());
action.setActionName(a.getName());
actions.add(action);
}
return actions;
}
获得当前步骤下能执行的action的名称,这一般是在页面上用于显示的,比如审批同意还是驳回,并不是自己手动加一个链接上去,而是动态生成的。

三、怎样传一些可用值到osworkflow流程中使用
这个问题一开始纠结了好久。慢慢地看一些前辈写的例子才知道。
在osworkflow的initialize()和doAction()方法中可以传一个map参数。这个参数即用来传值供流程中使用,比如:
Map inputs = new HashMap();
inputs.put("hello","hello world");
wf.initialize("请假",1,inputs);
传进去的inputs可以在初始化定义的时候使用,我猜具体可以在script中用transientVars.get();获得,但是没有实现,因为一般用不着。最常见的一般是定义一个function()在function类中使用,可以用来保存数据到数据库中。
如下:
<initial-actions>
<action name="工作流初始化" id="1000">
<pre-functions>
<function type="class">
<arg name="class.name">com.ideamoment.function.FunctionTest</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>
</results>
</action>
</initial-actions>
在FunctionTest中可以获取到inputs的值
public class TestFunction implements FunctionProvider{

public void execute(Map transientVars, Map args, PropertySet ps)
throws WorkflowException {
String hello = (String)transientVars.get("hello");
System.out.println(hello);
}
另外也可以在xml定义的流程文件中<arg>标签中定义数据,然后在Funtion中用args.get()来获取。
以上为自己摸索osworkflow得出的东西,官方文档是在太粗糙,基本没什么有价值的东西。希望前辈还能在指教一下,唉。

你可能感兴趣的:(工作流,OSWorkflow)