您的位置:首页 > 其它

osworkflow中的主要方法源码分析

2008-02-15 11:43 323 查看
[size=medium][align=center]osworkflow中的主要方法源码分析[/align][/size]

一、 doAction方法

Workflow fw = new BasicWorkflow("username");   //创建一个workflow
long id = Long.parseLong(request.getParameter("workflowId"));
String doActionString = request.getParameter("doAction"); //从request中得到将要进行的动作
if (doActionString != null && ! doActionString.equals("")) {
int actionId = Integer.parseInt(doActionString);
wf.doAction(id, actionId, Collections.EMPTY_MAP);
}


Wofkflow接口里面提供方法public void doAction(long id, int actionId, Map inputs) throws InvalidInputException, WorkflowException;

id是workflow的id号,actionId是即将要进行的动作的id。该方法进行如下动作:

1、根据workflow的id得到该工作流实例(entry),如果该实例的状态不是Activated的,则立即返回。
2、调用的populateTransientMap方法。该方法把众多参数都存放入transientVars这个map中,包括context,workflowDescritor(工作流XML文件描述对象),actionId等。
3、判断要执行的这个action是否存在(在globalActions与当前所有step的action的列表中查找),并且其验证条件是否满足。如果action没有找到或者验证不通过,则抛出InvalidActionException。
4、调用transitionWorkflow方法。该方法返回流程实例是否明确完成的标记,如果流程结束,则返回true,否则返回false。
5、若流程没有明确表明结束,则用checkImplicitFinish方法检查该流程是否已经结束,它会检查当前step中是否还有有效的action未执行,若没有,则结束该流程实例。


二、 transitionWorkflow方法

protected boolean transitionWorkflow(WorkflowEntry entry, List currentSteps, WorkflowStore store, WorkflowDescriptor wf, ActionDescriptor action, Map transientVars, Map inputs, PropertySet ps) throws WorkflowException


transitionWorkflow方法是工作流最最核心的方法。如果流程结束,则返回true,否则返回false。

1、调用getCurrentStep方法返回一个当前有效的step。如果currentSteps这个列表中只有一个step,则返回该step,否则遍历所有的list,返回一个当前有效的step(action可执行)。
2、验证transientVars里的参数是否符合该action的执行要求。
3、执行当前该step的所有post-functions。因为我们要离开当前这个step,进入下一个step,因此要进行收尾工作。
4、执行action的所有pre-functions。
5、遍历action的所有有条件结果(condition-result),选取一个满足条件的result,验证transientVars里的参数,并把pre-functions和post-functions放入extraPreFunctions和extraPostFunctions中。
6、如果该action没有有效的有条件结果,则执行无条件结果(unconditional-result),验证transientVars里的参数,把pre-functions和post-functions放入extraPreFunctions和extraPostFunctions中。
7、执行将要执行的结果中的pre-functions,即extraPreFunctions。
8、如果该结果是一个分支(split),进行以下步骤:(1)遍历该分支的所有结果,验证transientVars中的参数是否满足条件。(2)执行所有分支结果的pre-functions。(3)如果该action还没有finish,则执行所有的split的结果。调用createNewCurrentStep方法,把当前step放入historySteps,并且创建新步骤。(4)执行所有分支结果的post-functions。
9、如果该结果是一个join,进行以下步骤:(1)把当前步骤标记为finished,并将其移入historySteps。(2)在刚结束的step,当前其他的cuttentSteps与historySteps中查找,如果step是通往join节点的step,则把它放入joinSteps中。然后把joinSteps以JoinNodes的方式放入transientVars中。(3)检查join节点的条件是否符合,验证transientVars中的参数,执行joinresult的pre-functions。(4)检查joinSteps中除刚结束节点之外的其他节点(因为刚结束的节点在之前已经放入historySetps中),如果不在历史节点中,则moveToHistory。 (5) 如果该action还没有finish,则把所有通往join节点的step放入previousIds中,调用createNewCurrentStep方法,并且创建新步骤。(6)执行结果的post-functions。
10、如果该结果既不是split,也不是join,则直接调用createNewCurrentStep方法,把当前step放入historySteps,并且创建新步骤。
11、执行结果(result)中的post-functions,即extraPostFunctions。
12、执行action中的post-functions。
13、如果该action是初始动作(initial action),则把workflowEntry设置为ACTIVATED。
14、如果该action是结束动作,则把workflowEntry设置为COMPLETED。返回true。
15、执行其他有效的自动动作(auto actions)。


三 createNewCurrentStep方法

private Step createNewCurrentStep(ResultDescriptor theResult, WorkflowEntry entry, WorkflowStore store, int actionId, Step currentStep, long[] previousIds, Map transientVars, PropertySet ps) throws WorkflowException;


theResult是当前要执行的结果(result),currentStep是当前的步骤,previousIds是通向下一个step的步骤集合。

1、如果nextStep不存在,则把nextStep设置为当前的step。
2、用step的oldStatus来标记currentStep的status,表明结束当前步骤。把当前step放入历史步骤中。
3、用createCurrentStep方法创建新的newStep,设置其owner,startDate等。
4、如果这是一个新流程的起始step,则创建一个当前步骤列表,把newStep放入当前步骤列表中,并把该列表放入transientVars。
5、执行该newStep的所有pre-functions。 阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐