`
fantasy
  • 浏览: 516349 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于Osworkflow的工作流开发。

阅读更多
基本开发思路
一个流程:
  • 一个业务流程service,用于定义流程的名称及初始化执行ID。(如下PolicyWorkflowService )
  • 一个流程定义文件。
  • N个condition(用于做权限限制)。
  • N个function(用于执行业务函数)。

public class PolicyWorkflowService extends WorkflowService {

    public static String WORKFLOW_NAME = "policy";
    public static int INITIALIZE_ACTION_ID = 100;

    public PolicyPublishWorkflowService() {
        super(WORKFLOW_NAME, INITIALIZE_ACTION_ID);
    }
}

也可以作为Spring的Bean配置出来。


WorkflowService用于提供工作流引擎的基础服务。
所有业务流程service必须继承它。
此类不能直接提供给外部使用。
/**
 * 工作流程服务类
 * 
 * @author kiral
 * @日期 2008-1-15
 */
public class WorkflowService{

    public static final Logger logger = Logger.getLogger(WorkflowService.class);

    private String workflowName;

    private Workflow workflow;

    private int initActionId;

    protected WorkflowService() {
    }

    protected WorkflowService(String workflowName, int initActionId) {
        this.workflowName = workflowName;
        this.initActionId = initActionId;
    }

    /**
     * 初始化工作流程
     * 
     * @param userName
     * @param inputs
     * @return
     * @throws Exception
     * @deprecated 使用doInitialize()替换
     */
    @SuppressWarnings("unchecked")
    @Deprecated
    public long doInitialize(String userName) {
        return doInitialize();
    }

    @SuppressWarnings("unchecked")
    public long doInitialize(Map input) {
        long wf_id = -1;
        try {
            wf_id = workflow.initialize(workflowName, initActionId, input);
        } catch (InvalidRoleException e) {
            logger.info("当前用户不能初始化工作流");
        } catch (Exception e) {
            throw new RuntimeException("初始化工作流出现问题:", e);
        }
        return wf_id;
    }

    /**
     * 初始化工作流程
     */
    @SuppressWarnings("unchecked")
    public long doInitialize() {
        return doInitialize(new HashMap());
    }
    
    /**
     * 执行动作
     * 
     * @deprecated 使用doAction(workflowId,actionId,inputs)替换
     */
    @SuppressWarnings("unchecked")
    @Deprecated
    public void doAction(final String userName, final long workflowId, final int actionId,
            final Map inputs) {
        doAction(workflowId, actionId, inputs);
    }
    
    

    /**
     * 执行动作
     * 
     * @param userName
     * @param workflowId
     * @param actionId
     * @param inputs
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public void doAction(final long workflowId, final int actionId, final Map inputs) {
        try {
            workflow.setContext();
            workflow.doAction(workflowId, actionId, inputs);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    /**
     * 流程是否结束
     * @return true结束 
     */
    public boolean hasEnd(String workflowId)
    {
        return queryCurrentStep(workflowId)==null?true:false;
    }

    

    /**
     * 执行动作
     * 
     * @param userName
     * @param workflowId
     * @param actionId
     * @param inputs
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public void doAction(final long workflowId, final int actionId) {
        doAction(workflowId, actionId, null);
    }

    public void doAction(final String workflowId, final int actionId) {
        Assert.hasLength(workflowId, "workflowId不能为空");
        doAction(Long.parseLong(workflowId), actionId, null);
    }

    @SuppressWarnings("unchecked")
    public void doAction(final String workflowId, final int actionId, final String operationId) {
        Map inputs = new HashMap();
        inputs.put("operationId", inputs);
        doAction(Long.parseLong(workflowId), actionId, inputs);
    }
    
    /**
     * 查询当前步骤的描述信息
     * 
     * @param workflowId
     * @param userName
     * @return
     * @deprecated 使用queryCurrentStepDescriptor(long workflowId)替换
     */
    @SuppressWarnings("unchecked")
    @Deprecated
    public StepDescriptor queryCurrentStepDescriptor(long workflowId, String userName) {
        return queryCurrentStepDescriptor(workflowId);
    }

    /**
     * 查询当前步骤的描述信息
     * 
     * @param workflowId
     * @param userName
     * @return
     */
    @SuppressWarnings("unchecked")
    public StepDescriptor queryCurrentStepDescriptor(long workflowId) {
        List list = workflow.getCurrentSteps(workflowId);
        if (list == null || list.isEmpty()) {
            return null;
        } else {
            return queryStepDescriptor(((Step) list.get(0)).getStepId());
        }
    }

    public StepDescriptor queryCurrentStepDescriptor(String workflowId) {
        return queryCurrentStepDescriptor(Long.parseLong(workflowId));
    }

    /**
     * 查询当前步骤
     * 
     * @param workflowId
     * @deprecated 使用queryCurrentStep(long workflowId)替换
     */
    @SuppressWarnings("unchecked")
    @Deprecated
    public Step queryCurrentStep(long workflowId, String userName) {
        return queryCurrentStep(workflowId);
    }

    /**
     * 查询当前步骤
     * 
     * @param workflowId
     * @return
     */
    @SuppressWarnings("unchecked")
    public Step queryCurrentStep(long workflowId) {
        List list = workflow.getCurrentSteps(workflowId);
        return list.isEmpty() ? null : ((Step) list.get(0));
    }
    
    public Step queryCurrentStep(String workflowId) {
        return queryCurrentStep(Long.parseLong(workflowId));
    }

    @SuppressWarnings("unchecked")
    public StepDescriptor queryStepDescriptor(int stepId) {
        return getWorkflowDescriptor().getStep(stepId);
    }

    /**
     * 指定Action是否是当前将要执行的action
     */
    public boolean isCurrentAction(long workflowId, String userName, int actionId) {
        Map<Integer, String> actionMap = findAvailableActions(workflowId, userName);
        return actionMap.get(actionId) == null ? false : true;
    }

    /**
     * 得到用户指定流程的有效行动
     * 
     * @param workflowId
     * @param userName
     * @return actionID和名称的键值对
     */
    public Map<Integer, String> findAvailableActions(long workflowId, String userName) {
        Map<Integer, String> result = new HashMap<Integer, String>();
        int[] availableActions = workflow.getAvailableActions(workflowId, null);
        WorkflowDescriptor wd = workflow
                .getWorkflowDescriptor(workflow.getWorkflowName(workflowId));
        for (int i = 0; i < availableActions.length; i++) {
            int actionId = availableActions[i];
            result.put(actionId, wd.getAction(actionId).getName());
        }
        return result;
    }

    public Map<Integer, String> findAvailableActions(String workflowId, String userName) {
        Assert.hasLength(workflowId, "workflowId不能为空");
        return findAvailableActions(Long.parseLong(workflowId), userName);
    }

    public String findActionName(int actionId) {
        ActionDescriptor actionDescriptor = getWorkflowDescriptor().getAction(actionId);
        return actionDescriptor == null ? null : actionDescriptor.getName();
    }

    /**
     * 查询所有步骤
     */
    @SuppressWarnings("unchecked")
    public List<Step> findSteps(long workflowId) {
        Assert.isTrue(workflowId > 0, "workflowId必须大于零");
        List<Step> result = new ArrayList<Step>();
        List currentSteps = workflow.getCurrentSteps(workflowId);
        List historySteps = workflow.getHistorySteps(workflowId);
        result.addAll(currentSteps);
        result.addAll(historySteps);
        return result;
    }
    
    @SuppressWarnings("unchecked")
    public List<SimpleStep> findCurrentSteps(long workflowId) {
        Assert.isTrue(workflowId > 0, "workflowId必须大于零");
        return workflow.getCurrentSteps(workflowId);
    }
    
    @SuppressWarnings("unchecked")
    public List<Step> findHistorySteps(long workflowId) {
        Assert.isTrue(workflowId > 0, "workflowId必须大于零");
        return workflow.getHistorySteps(workflowId);
    }

    /**
     * 获得工作流描述
     * 
     */
    public WorkflowDescriptor getWorkflowDescriptor() {
        return workflow.getWorkflowDescriptor(workflowName);
    }

    /**
     * 查询工作流描述
     * 
     */
    public WorkflowDescriptor queryWorkflowDescriptor(long workflowId) {
        return workflow.getWorkflowDescriptor(workflow.getWorkflowName(workflowId));
    }

    public void setWorkflow(IscsmWorkflow workflow) {
        this.workflow = workflow;
    }

}



Workflow类,在这里你可以设置流程的执行者。
public class Workflow extends AbstractWorkflow {
    
    public void setContext() {
        String caller;
        try {
            caller = “你系统的用户”;
        } catch (Exception e) {
            caller = "";
        }
        super.context = new BasicWorkflowContext(caller);
    }
    
}


AbstractFunction类,所有Function的基类,继承他能得到很多工作流引擎自带的基础属性。如调用者,流程ID..等
import java.util.Map;

import com.opensymphony.workflow.FunctionProvider;
import com.opensymphony.workflow.basic.BasicWorkflowContext;
import com.opensymphony.workflow.spi.WorkflowEntry;

public abstract class AbstractFunction implements FunctionProvider {
    
    protected long workflowId;

    protected String caller;

    protected int actionId;

    private WorkflowService workflowService;
    
    @SuppressWarnings("unchecked")
    protected void set(Map transientVars,Map args) {
        WorkflowEntry workflowEntry = (WorkflowEntry) transientVars.get("entry");
        workflowId = workflowEntry.getId();
        BasicWorkflowContext context = (BasicWorkflowContext) transientVars.get("context");
        caller = context.getCaller();
        actionId = (Integer) transientVars.get("actionId");
    }
    

    public void setWorkflowService(WorkflowService workflowService) {
        this.workflowService = workflowService;
    }

}


使用自定义的condition来实现,用自己的权限系统控制流程
public class UserRightCondition implements Condition {

    private UserRoleDAO userRoleDAO;

    @SuppressWarnings("unchecked")
    public boolean passesCondition(Map transientVars, Map args, PropertySet ps)
            throws StoreException {
        String actionCode = (String) args.get("actionCode");
        //在流程定义文件里配置能够执行当前流程的角色PK或者,权限PK。
          //然后在这里判断当前caller是否有对应的权限和角色,如果有返回true

        return false;
    }
}


一些内置的condition
  • OSUserGroupCondition -  使用 OSUser来判断调用者是否在参数"group"中。 
  • StatusCondition -  判断当前步骤的状态是否与参数"status"相同。
  • AllowOwnerOnlyCondition -  如果调用者是指定的步骤的所有者的话,那么只返回
  • true,如果没有指明步骤的话,就返回当前步骤。
  • DenyOwnerCondition 与 AllowOwnerOnlyCondition 功能相反。
使用如下:
<condition type="class">                                               
<arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg> 
<condition>
分享到:
评论

相关推荐

    OsWorkflow工作流实例

    总的来说,OsWorkflow工作流实例为我们提供了一个强大的工具,用于构建和管理业务流程。通过理解和实践这个实例,我们可以学习到如何在实际项目中应用工作流引擎,提升软件系统的灵活性和可维护性。无论是在企业级...

    OSWorkflow 工作流 开发指南、中文手册

    OSWorkflow 是一个开源的工作流解决方案,最初由OpenSymphony团队开发,现在由Atlassian公司维护。它允许开发者定义复杂的业务流程,并提供了一套API和Web界面来控制和监控这些流程。OSWorkflow 支持多种数据库存储...

    OSWorkFlow 工作流系统设计知识的详细讲解

    本文档将对OSWorkFlow工作流系统的设计知识进行详细讲解。OSWorkFlow是一个开源的工作流引擎,适用于构建灵活、高效的企业级应用。它提供了一套完整的解决方案,帮助开发者实现业务流程自动化,提高工作效率。 ####...

    workflow_osworkflow_工作流_

    OSWorkflow,全称OpenSymphony Workflow,是由OpenSymphony Group开发的一个轻量级工作流引擎。它的设计目标是提供一个可扩展且易于使用的平台,用于实现业务流程的建模和执行。OSWorkflow的核心特性包括: 1. **...

    osworkflow详细资料 pdf 工作流

    **工作流技术与OSWorkflow详解** 工作流(Workflow)是一种自动化业务流程的技术,它通过定义、执行和管理工作任务的流转,实现企业业务流程的规范化和自动化。在IT领域,工作流系统广泛应用于企业管理、项目协作、...

    工作流 osworkflow 例子和原理

    OSWorkflow的实现基于XML配置文件,这使得工作流定义易于理解和修改。通过XML,你可以定义每个步骤的属性,如参与者、后继步骤和相关条件。此外,OSWorkflow提供了API和事件监听器机制,允许开发者在流程执行过程中...

    Java四大主流开源工作流引擎分析Shark,osworkflow,jbpm,jflow

    osworkflow在开发工作流管理系统时经常被推荐,尤其与WebWork2结合使用。尽管WebWork2已被Struts2取代,但有人提出osworkflow可能与Struts2实现完美整合,这为开发者提供了更多可能性。 最后,jflow是由CCflow发展...

    OSWorkflow的开发指导与指南.pdf

    综上所述,OSWorkflow开发指导与指南为开发者提供了一套完整的工作流管理方案,包括了工作流引擎的基本概念、组件结构、存储方式、配置和高级操作等多个方面,旨在帮助开发者快速理解和掌握OSWorkflow的开发与应用。

    工作流引擎(osworkflow) 2.80

    OSWorkflow 是一款基于 Java 的工作流引擎,能够与各种Java应用程序集成,如Java EE 应用服务器或Spring框架。 2. **OSWorkflow 特性**: - **流程定义**:OSWorkflow 支持XML格式的流程定义,允许开发者以直观的...

    osworkflow开发指南

    osWorkFlow是一款强大的开源工作流引擎,用于管理应用程序中的业务流程。它提供了灵活的工作流定义、状态跟踪以及任务分配等功能,极大地提升了企业级应用的流程自动化能力。osWorkFlow是基于Java开发的,因此可以...

    《OSWorkflow开发指南》电子版

    OSWorkflow是由OpenSymphony组织开发的一款轻量级工作流引擎,适用于中小企业级别的应用系统。随着业务系统的复杂度增加,状态管理和流程控制的需求日益凸显,传统的硬编码方式无法满足高效、灵活的工作流管理需求。...

    osworkflow三个开发文档

    **osworkflow** 是一个开源的工作流引擎,它允许开发者在Java应用程序中实现复杂的业务流程管理。这个技术的主要目标是提供一种灵活、可扩展的方式,来定义、执行和控制业务流程。osworkflow 提供了一个强大的API,...

    OSWorkflow工作流程源码(JAVA/JSP)

    **OSWorkflow工作流程源码详解** ...通过上述步骤,你可以基于OSWorkflow构建出符合业务需求的工作流程系统,同时,通过深入研究源码,还能提升对工作流引擎原理的理解,为未来更复杂的工作流应用打下坚实基础。

    osworkflow eclipse+mysql 请假审批流程 完整示例

    《基于osworkflow与Eclipse的请假审批流程完整示例解析》 在IT行业中,工作流管理系统(Workflow Management System,简称WMS)是企业信息化建设的重要组成部分,它能够规范业务流程,提高工作效率。osworkflow是一...

    开发java工作流范例

    这个压缩包文件包含了一个名为"osworkflow例子"的示例项目,它很可能是基于OSWorkflow框架的一个实例,OSWorkflow是Java领域中常用的工作流引擎之一。 首先,我们需要理解什么是工作流。工作流是指一系列相互关联、...

    OSWorkflow开发指南

    #### 与Spring联用的OSWorkflow工作流 ##### 创建工作流 在Spring环境下创建OSWorkflow实例时,通常会通过Spring的Bean工厂来进行初始化。首先,在Spring配置文件中定义一个`WorkflowStore` Bean,然后基于该Bean...

    osworkflow2.8基于Spring+Hibernate

    osWorkflow是一款开源的工作流引擎,它提供了灵活的工作流程定义和执行能力,使得开发者能够方便地在应用程序中集成工作流管理功能。本文将深入探讨如何在Spring和Hibernate的集成环境中运用osWorkflow2.8版本,实现...

    OSWorkFlow入门指南.pdf

    此外,使用OSWorkflow提供的范例应用,开发人员可以在不涉及复杂持久化配置的情况下,快速学习和测试工作流的运作。 工作流管理系统通常需要持久化存储工作流的状态,这样即使在应用重启之后,工作流实例的状态信息...

Global site tag (gtag.js) - Google Analytics