`
friping
  • 浏览: 133920 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

OSWorkflow的第二支程式

阅读更多
這裡將介紹如何在流程裡加上限制,首先修改leave.xml,限制送出假單的人一定要是啟動流程的人。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN"
"http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">
<workflow>
  <initial-actions>
   <action id="0" name="開始">
      <pre-functions>
<function type="class">
    <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    </function>
      </pre-functions>
      <results>
        <unconditional-result old-status="Finished" status="Queued"
step="1" owner="${caller}" />
      </results>
    </action>
  </initial-actions>

  <steps>
    <step id="1" name="填假單">
      <actions>
        <action id="1" name="送出">
          <restrict-to>
            <conditions>
              <condition type="class">
                <arg name="class.name">
                  com.opensymphony.workflow.util.AllowOwnerOnlyCondition
                </arg>
              </condition>
            </conditions>
          </restrict-to>
          <pre-functions>
      <function type="class">
      <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    </function>
          </pre-functions>
          <results>
            <unconditional-result old-status="Finished" status="Queued"
step="2"  owner="${caller}" />
          </results>
        </action>
      </actions>
    </step>

    <step id="2" name="批假單">
      <actions>
        <action id="2" name="准許">
  <pre-functions>
    <function type="class">
      <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    </function>
  </pre-functions>
          <results>
            <unconditional-result old-status="Finished" status="Queued"
step="3"  owner="${caller}"/>
          </results>
        </action>

        <action id="3" name="駁回">
  <pre-functions>
    <function type="class">
      <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    </function>
  </pre-functions>
          <results>
            <unconditional-result old-status="Finished" status="Queued"
step="1"  owner="${caller}"/>
          </results>
        </action>
      </actions>     
    </step>

    <step id="3" name="停止" />
  </steps>
</workflow>

接著更改Leave.java及LeaveAction.java,讓啟動流程的人和送出假單的人可以不同。
    Leave.java
package tw.idv.idealist;

import com.opensymphony.workflow.InvalidActionException;
import com.opensymphony.workflow.InvalidEntryStateException;
import com.opensymphony.workflow.InvalidInputException;
import com.opensymphony.workflow.InvalidRoleException;
import com.opensymphony.workflow.Workflow;
import com.opensymphony.workflow.WorkflowException;
import com.opensymphony.workflow.basic.BasicWorkflow;
import com.opensymphony.workflow.config.DefaultConfiguration;
import com.opensymphony.workflow.spi.Step;

/**
* 請假流程
* @author steven
*/
public class Leave {
/**
* 啟動流程
* @param employee 員工編號
* @return 工作流編號
*/
public long start(String employee) {
Workflow workflow = new BasicWorkflow(employee);
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
long workflowId = -1;
try {
//leave是workflowx.xml中定的名稱
workflowId = workflow.initialize("leave", 0, null);
} catch (InvalidActionException e) {
e.printStackTrace();
} catch (InvalidRoleException e) {
e.printStackTrace();
} catch (InvalidInputException e) {
e.printStackTrace();
} catch (InvalidEntryStateException e) {
e.printStackTrace();
} catch (WorkflowException e) {
e.printStackTrace();
}

return workflowId;
}

/**
* 送出假單
* @param workflowId 工作流編號
* @param employee 員工編號
*/
public void send(long workflowId, String employee) {
Workflow workflow = new BasicWorkflow(employee);
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
try {
workflow.doAction(workflowId, 1, null);
} catch (InvalidActionException e) {
e.printStackTrace();
} catch (InvalidRoleException e) {
e.printStackTrace();
} catch (InvalidInputException e) {
e.printStackTrace();
} catch (InvalidEntryStateException e) {
e.printStackTrace();
} catch (WorkflowException e) {
e.printStackTrace();
}
}

/**
* 准假假單
* @param workflowId 工作流編號
* @param actionId 動作編號, 2 准許, 3 駁回
*/
public void allow(long workflowId, int actionId) {
Workflow workflow = new BasicWorkflow("manager1");
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
try {
workflow.doAction(workflowId, actionId, null);
} catch (InvalidInputException e) {
e.printStackTrace();
} catch (WorkflowException e) {
e.printStackTrace();
}
catch (InvalidActionException e) {
e.printStackTrace();
}
}
}
    LeaveAction.java
package tw.idv.idealist.actions;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import tw.idv.idealist.Leave;

/**
* @author Steven
*/
public class LeaveAction extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Leave leave = new Leave();
String employee = req.getParameter("employee");
long workflowId = leave.start(employee);
leave.send(workflowId, "someone"); // <<== 非啟動流程的人送出假單
resp.sendRedirect("allow.jsp?workflowId=" + workflowId);
}

}
package tw.idv.idealist.actions;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import tw.idv.idealist.Leave;

/**
* @author Steven
*/
public class LeaveAction extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Leave leave = new Leave();
String employee = req.getParameter("employee");
long workflowId = leave.start(employee);
leave.send(workflowId, "someone"); // <<== 非啟動流程的人送出假單
resp.sendRedirect("allow.jsp?workflowId=" + workflowId);
}

}
啟動Tomcat,並執行leave.jsp後,會出現如下exception,確實OSWorkflow偵測到啟動流程的人和送出假單的人不同。

com.opensymphony.workflow.InvalidActionException: Action 1 is invalid
at com.opensymphony.workflow.AbstractWorkflow.doAction(AbstractWorkflow.java:546)
at tw.idv.idealist.Leave.send(Leave.java:56)
at tw.idv.idealist.actions.LeaveAction.doPost(LeaveAction.java:25)
at tw.idv.idealist.actions.LeaveAction.doGet(LeaveAction.java:17)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2422)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:163)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:199)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:700)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:584)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)

分享到:
评论

相关推荐

    OSWorkflow

    OSWorkflow

    OSWorkFlow

    4. 第三方教程:网上有许多关于OSWorkFlow的教程和博客文章,深入讲解各个功能和最佳实践。 总的来说,OSWorkFlow为Java开发者提供了一个强大且易用的工作流解决方案,能够有效地提升企业的业务流程管理水平。通过...

    osworkflow_bundle2

    10. **工作流设计工具**:虽然 OSWorkflow 本身不提供图形化设计工具,但有一些第三方工具(如 JBoss jBPM)可以用于可视化设计 OSWorkflow 流程,并生成相应的 XML 配置。 在 "osworkflow_bundle" 中,你可能会...

    OSWorkFlow分析

    OSWorkflow沒辦法寫出那種一目瞭然的程式,但是我仍盡量將程式簡化,希望初學者能在看完這第一支程式後, 就能有所體會

    osworkflow

    1. **流程定义**:osWorkflow 提供了一个XML格式的流程定义语言,允许开发者以声明式的方式定义流程。每个流程可以包含多个状态(steps)和转换条件,以及相关的操作(actions)。 2. **流程实例管理**:系统能够...

    OSWorkflow中文手册 OSWorkflow中文手册

    2. **OSWorkflow核心概念** - **流程定义**:定义了工作流的各个步骤和转换规则,包括活动(Activities)、决策(Decisions)和事件(Events)。 - **流程实例**:基于流程定义创建的具体实例,每个实例代表一个...

    osworkflow中文入门指南,osworkflow+hibernate+spring集成配置,osworkflow-2.8.0.jar

    **osworkflow** 是一个开源的工作流管理系统,专为Java应用程序设计,用于管理复杂的工作流程。在本入门指南中,我们将深入探讨如何使用osworkflow,并将其与流行的数据持久化框架Hibernate和依赖注入容器Spring进行...

    OSWorkflow2.8 API文档

    OSWorkflow 2.8 API 文档

    Osworkflow10份资料

    OSWorkflow中文手册OSWorkflow-chinese-manual-2.8.pdf Packt.Publishing.OSWorkflow.A.Guide.for.Java.Developers.and.Architects.Aug.2007.pdf 工作流普及风暴—基础概念.doc 用osworkflow写一个请假例子.rar

    osworkflow2.8

    2. **OSWorkflow 特性** - **可视化工作流设计**:OSWorkflow 提供了图形化的流程设计工具,使得非技术人员也能理解和修改流程。 - **动态流程更改**:支持运行时更改流程,无需重新部署应用,提高了灵活性。 - *...

    osworkflow学习笔记

    通过osworkflow项目的学习和实践,总结出的一套osworkflow工作流引擎的学习笔记,供需要使用osworkflow系统的同学们借鉴,谢谢!

    OSWorkflow源码及电子书

    1. **入门教程**:介绍如何安装和配置OSWorkflow,以及如何创建第一个工作流实例。 2. **API参考**:详细说明了OSWorkflow的各个类和接口,帮助开发者理解和使用API进行开发。 3. **最佳实践**:提供一些实际案例和...

    OsWorkflow工作流实例

    OsWorkflow是一款开源的工作流引擎,它为应用程序提供了一种灵活且可扩展的方式来管理业务流程。在本实例中,我们将深入探讨OsWorkflow的核心概念、主要功能以及如何创建和测试一个工作流实例。 工作流引擎是软件...

    osworkflow2.8.pdf

    #### 二、OSWorkflow 架构与组成 - **核心库**:OSWorkflow 的核心功能由 `OSWorkflow-2.8.0.jar` 提供,这是运行 OSWorkflow 所必需的基础组件。 - **日志支持**:使用 `commons-logging.jar` 进行日志记录。 - **...

    OsWorkflow

    OsWorkflow 是一个基于Java的工作流引擎,主要用于设计和执行复杂的业务流程。这个项目是一个请假申请的工作流示例,其中流程的定义完全存储在XML文件中,这样可以方便地进行流程的配置和更改,无需修改源代码。对于...

    Osworkflow 入门级例子

    Osworkflow 是一个开源的工作流引擎,它为应用程序提供了一种灵活的方式来管理业务流程。这个入门级的例子将带你了解 Osworkflow2.8 的基本概念和如何在项目中简单地实现工作流。 Osworkflow 提供了一个强大的框架...

    osworkflow指导文档 + 源码

    2. **步骤执行(Execute Step)**:osWorkflow 根据当前状态和转移条件执行相应的步骤。 3. **状态变迁(State Transition)**:完成步骤后,osWorkflow 更新实例的状态,并可能触发新的转移。 4. **流程控制...

    OSWORKFlow流程开发教程

    #### 2. 必备JAR包及组件 - **OSWorkflow自身包**:包含核心工作流引擎实现。 - **核心引用包**:如Log4j用于日志记录,Xerces用于XML解析等。 - **可选包**:根据应用需求选择,如PDF生成、图表生成库。 - **Spring...

Global site tag (gtag.js) - Google Analytics