开源工作流引擎Shark入门3——与业务系统结合的一个demo

    在本系列第一篇文章介绍的基础上,开发一个简单的工作流应用系统,以第二篇文章介绍的请假流程为例。
    把第二篇文章中做的mydemo.xpdl复制到应用的repository/external文件夹下面。
    在mysql数据库中建立一个请假单据的业务表:
create table ask_for_leave (
id MEDIUMINT NOT NULL AUTO_INCREMENT primary key,
apply_user varchar(50), -- 申请人
apply_time timestamp default now(), -- 申请时间
begin_leave_time timestamp, -- 假期开始时间
end_leave_time timestamp, -- 假期结束时间
leave_reason varchar(500), -- 请假理由
approve_user varchar(50), -- 审批人
approve_time timestamp, -- 审批时间
is_passed smallint, -- 是否同意,1 同意,2 驳回
approve_remark varchar(500), -- 审批备注,如驳回的原因
back_time timestamp -- 销假时间
);
    建立一个用于与Shark交互的工具类:
package demo.shark;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;

import org.enhydra.shark.Shark;
import org.enhydra.shark.api.admin.ParticipantMappingManagerAdmin;
import org.enhydra.shark.api.client.wfmc.wapi.WMConnectInfo;
import org.enhydra.shark.api.client.wfmodel.WfAssignment;
import org.enhydra.shark.api.client.wfmodel.WfProcess;
import org.enhydra.shark.api.client.wfmodel.WfProcessIterator;
import org.enhydra.shark.api.client.wfmodel.WfProcessMgr;
import org.enhydra.shark.api.client.wfservice.PackageAdministration;
import org.enhydra.shark.api.client.wfservice.SharkConnection;
import org.enhydra.shark.api.client.wfservice.XPDLBrowser;
import org.enhydra.shark.api.common.SharkConstants;
import org.enhydra.shark.api.internal.partmappersistence.ParticipantMap;
import org.enhydra.shark.xpdl.XMLUtil;


public class SharkUtil {
    
    private static DataSource ds;
    /**
     * 获取数据源
     * @return
     * @throws Exception
     */
    public static DataSource getDS() throws Exception {
        if (ds == null) ds = (DataSource) new InitialContext().lookup("java:comp/env/sharkdb");
        return ds;
    }
    
    /**
     * 获取数据库连接
     * @return
     * @throws Exception
     */
    public static Connection getConn() throws Exception {
        return getDS().getConnection();
    }
    
    /**
     * 获取事务UserTransaction
     * @return
     * @throws Exception
     */
    public static UserTransaction getUserTransaction() throws Exception {
        UserTransaction ut = (UserTransaction) new InitialContext().lookup("java:comp/env/UserTransaction");
        return ut;
    }
    
    //private static PackageFileFilter packageFileFilter = new PackageFileFilter();
    private static Properties p = new Properties();
    private static String EXTERNAL_PACKAGES_REPOSITORY = "repository/external";
    private static boolean _debug_ = false;
    private static boolean sharkConfigured = false;
    private static boolean ipc = false;
    private static String engineName = "sharkDemo";
    //private static WMConnectInfo wmconnInfo;
    public static final String VARIABLE_TO_PROCESS_UPDATE = "VariableToProcess_UPDATE";
    public static final String VARIABLE_TO_PROCESS_VIEW = "VariableToProcess_VIEW";

    /**
     * 读取配置文件初始化工作流
     * @param realPath
     * @throws Exception
     */
    public static void initProperties(String realPath)
        throws Exception
    {
        if(_debug_)
        {
            System.err.println("#_init_#");
        }
        if(!ipc)
        {
            ipc = true;
            try
            {
                if(!realPath.endsWith("//"))
                {
                    realPath = realPath + "//";
                }
                realPath = replaceAll(realPath, "//", "/");
                p.load(new FileInputStream(realPath + "conf/Shark.conf"));
                Iterator it = p.keySet().iterator();
                do
                {
                    if(!it.hasNext())
                    {
                        break;
                    }
                    String key = (String)it.next();
                    String value = p.getProperty(key);
                    if(0 <= value.indexOf("@@"))
                    {
                        if(_debug_)
                        {
                            System.err.print("key is " + key + ", old value is" + value);
                        }
                        value = replaceAll(value, "@@/", realPath);
                        p.setProperty(key, value);
                        if(_debug_)
                        {
                            System.err.println(", new value is" + value);
                        }
                    }
                } while(true);
                p.load(new FileInputStream(realPath + "conf/SharkJSPClient.conf"));
                setPathToXPDLRepositoryFolder(realPath + EXTERNAL_PACKAGES_REPOSITORY);
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
            p.setProperty("enginename", engineName);
        }
    }
    
    /**
     * 初始化工作流
     * @param realPath
     * @throws Exception
     */
    public static void init(String realPath)
        throws Exception
    {
        if(!sharkConfigured)
        {
            initProperties(realPath);
            Shark.configure(p);
            sharkConfigured = true;
        }
    }
    
    private static String replaceAll(String input, String forReplace, String replaceWith)
    {
        if(input == null)
        {
            return null;
        }
        StringBuffer result = new StringBuffer();
        for(boolean hasMore = true; hasMore;)
        {
            int start = input.indexOf(forReplace);
            int end = start + forReplace.length();
            if(start != -1)
            {
                result.append(input.substring(0, start) + replaceWith);
                input = input.substring(end);
            } else
            {
                hasMore = false;
                result.append(input);
            }
        }

        if(result.toString().equals(""))
        {
            return input;
        } else
        {
            return result.toString();
        }
    }
    
    /**
     * 设置xpdl文件所在的路径
     * @param xpdlRepFolder
     * @throws Exception
     */
    public static void setPathToXPDLRepositoryFolder(String xpdlRepFolder)
        throws Exception
    {
        EXTERNAL_PACKAGES_REPOSITORY = xpdlRepFolder;
        System.err.println(xpdlRepFolder);
        File f = new File(xpdlRepFolder);
        System.err.println(f);
        if(!f.isAbsolute())
        {
            System.err.println("isn't absolute");
            f = f.getAbsoluteFile();
        }
        System.err.println(f);
        if(!f.exists())
        {
            throw new Exception("Folder " + xpdlRepFolder + " does not exist");
        }
        try
        {
            EXTERNAL_PACKAGES_REPOSITORY = f.getCanonicalPath();
        }
        catch(Exception ex)
        {
            EXTERNAL_PACKAGES_REPOSITORY = f.getAbsolutePath();
        }
    }
    
    /**
     * 获取工作流引擎的名称
     * @return
     */
    public static String getEngineName() {
        return engineName;
    }
    
    /**
     * 获取工作流系统的连接
     * @param wmconnInfo
     * @return
     * @throws Exception
     */
    public static SharkConnection connect(WMConnectInfo wmconnInfo)
        throws Exception
    {
        if(_debug_)
        {
            System.err.println("#_connect_#");
        }
        SharkConnection sConn = Shark.getInstance().getSharkConnection();
        sConn.connect(wmconnInfo);
        return sConn;
    }
    
    /**
     * 关闭工作流连接
     * @param sConn
     * @throws Exception
     */
    public static void disconnect(SharkConnection sConn)
        throws Exception
    {
        if(_debug_)
        {
            System.err.println("#_disconnect_#");
        }
        sConn.disconnect();
    }
    
    /**
     * 加载一个包
     * @param sc
     * @param xpdlName
     * @return
     * @throws Exception
     */
    public static String loadPackage(SharkConnection sc, String xpdlName)
        throws Exception
    {
        if(_debug_)
        {
            System.err.println("#_packageLoad_#");
        }
        String realPath = EXTERNAL_PACKAGES_REPOSITORY + "/" + xpdlName;
        PackageAdministration pa = Shark.getInstance().getPackageAdministration();
        String pkgId = XMLUtil.getIdFromFile(realPath);
        if(!pa.isPackageOpened(sc.getSessionHandle(), pkgId))
        {
            try
            {
                pa.openPackage(sc.getSessionHandle(), realPath);
            }
            catch(Exception e)
            {
                e.printStackTrace();
                throw e;
            }
        }
        else 
        {
            pa.updatePackageFromFile(sc.getSessionHandle(), pkgId, realPath);
        }
        return pkgId;
    }
    
    /**
     * 获取流程的唯一定义名称
     * @param sc
     * @param pkgId
     * @param pkgVer
     * @param pDefId
     * @return
     * @throws Exception
     */
    public static String getUniqueProcessDefinitionName(SharkConnection sc, java.lang.String pkgId, java.lang.String pkgVer, java.lang.String pDefId)
        throws Exception
    {
        XPDLBrowser xpdlb = Shark.getInstance().getXPDLBrowser();
        String procDefName = xpdlb.getUniqueProcessDefinitionName(sc.getSessionHandle(),
                                                                pkgId,
                                                                "",
                                                                pDefId);
        return procDefName;
    }
    
    /**
     * 开启一个流程
     * @param sc
     * @param mgrName
     * @return
     * @throws Exception
     */
    public static WfProcess startProcess(SharkConnection sc, String mgrName)
        throws Exception
    {
        if(_debug_)
        {
            System.err.println("#_processStartName_#");
        }
        try
        {
            WfProcess prs = null;
            if(!isProcessRunning(sc, mgrName))
            {
                WfProcessMgr mgr = sc.getProcessMgr(mgrName);
                prs = mgr.create_process(null);
                prs.start();
            }
            return prs;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            throw e;
        }
    }
    
    /**
     * 流程是否在运行
     * @param sc
     * @param mgrName
     * @return
     * @throws Exception
     */
    public static boolean isProcessRunning(SharkConnection sc, String mgrName)
        throws Exception
    {
        try
        {
            System.err.println("#_isProcessRunning_# (" + mgrName + ")");
        
            WfProcessIterator pit;
            WfProcessMgr pMgr = sc.getProcessMgr(mgrName);
            pit = pMgr.get_iterator_process();
            pit.set_query_expression("state.equals(/"open.running/")");
            if(_debug_)
            {
                System.err.println("#_" + pit.how_many() + "_#");
                System.err.println("#_" + pit.get_next_n_sequence(0).length + "_#");
            }
            return 0 < pit.get_next_n_sequence(0).length;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            throw e;
        }
    }
    
    /**
     * 结束一个活动
     * @param sConn
     * @param activityId
     * @throws Exception
     */
    public static void completeActivity(SharkConnection sConn, String activityId)
        throws Exception
    {
        try
        {
            if(null != activityId)
            {
                try
                {
                    WfAssignment a = getAssignment(sConn, activityId);
                    if(!isMine(sConn, a))
                    {
                        assignmentAccept(sConn, a);
                    }
                    a.activity().complete();
                }
                catch(Exception e)
                {
                    throw e;
                }
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
            throw e;
        }
    }
    
    /**
     * 获取一个活动的分配
     * @param sConn
     * @param activityId
     * @return
     * @throws Exception
     */
    public static WfAssignment getAssignment(SharkConnection sConn, String activityId)
        throws Exception
    {
        WfAssignment ar[];
        ar = sConn.getResourceObject().get_sequence_work_item(0);
        System.out.println("--------------total activity count:" + ar.length);
        for (int i=0; i<ar.length; i++)
        {
            System.out.println("--------------key:" + ar[i].activity().key());
            if(activityId.equals(ar[i].activity().key()))
            {
                return ar[i];
            }
        }
        throw new Exception("Activity:" + activityId + " not found in " + sConn.getResourceObject().resource_key() + "'s worklist");
    }
    
    /**
     * 判断活动是否是连接工作流的用户所有
     * @param sConn
     * @param activityId
     * @return
     * @throws Exception
     */
    public static boolean isMine(SharkConnection sConn, String activityId)
        throws Exception
    {
        WfAssignment a = getAssignment(sConn, activityId);
        return isMine(sConn, a);
    }
    
    /**
     * 判断活动是否是连接工作流的用户所有
     * @param sConn
     * @param a
     * @return
     * @throws Exception
     */
    public static boolean isMine(SharkConnection sConn, WfAssignment a)
        throws Exception
    {
        return a.get_accepted_status();
    }
    
    /**
     * 接受一个分配
     * @param sConn
     * @param activityId
     * @throws Exception
     */
    public static void assignmentAccept(SharkConnection sConn, String activityId)
        throws Exception
    {
        assignmentAccept(sConn, getAssignment(sConn, activityId));
    }
    
    /**
     * 接受一个分配
     * @param sConn
     * @param a
     * @throws Exception
     */
    public static void assignmentAccept(SharkConnection sConn, WfAssignment a)
        throws Exception
    {
        a.set_accepted_status(true);
    }
    
    /**
     * 设置流程上下文变量
     * @param sConn
     * @param activityId
     * @param vName
     * @param vValue
     * @throws Exception
     */
    public static void setVariable(SharkConnection sConn, String activityId, String vName, String vValue)
        throws Exception
    {
        WfAssignment a = getAssignment(sConn, activityId);
        if(!isMine(sConn, a))
        {
            throw new Exception("I don't own activity " + activityId);
        }
        Map _m = new HashMap();
        Object c = a.activity().process_context().get(vName);
        if(c instanceof Long)
        {
            c = new Long(vValue);
        } else
        if(c instanceof Boolean)
        {
            c = Boolean.valueOf(vValue);
        } else
        if(c instanceof Double)
        {
            c = Double.valueOf(vValue);
        } else
        {
            c = vValue;
        }
        _m.put(vName, c);
        a.activity().set_result(_m);
    }
    
    /**
     * 获取工作列表
     * @param sConn
     * @return
     * @throws Exception
     */
    public static List<Map> getWorkList(SharkConnection sConn)
        throws Exception
    {
        List<Map> workList = new ArrayList<Map>();
        WfAssignment ar[];
        ar = sConn.getResourceObject().get_sequence_work_item(0);
        System.out.println("--------------total activity count:" + ar.length);
        for (int i=0; i<ar.length; i++)
        {
            Map workItem = new HashMap();
            workItem.put("processName", ar[i].activity().container().name());
            workItem.put("activityName", ar[i].activity().name());
            workItem.put("processContext", ar[i].activity().process_context());
            workItem.put("activityKey", ar[i].activity().key());
            workList.add(workItem);
            
        }
        return workList;
    }
}
    建立用于请假的业务类:
package demo.shark;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.transaction.Status;
import javax.transaction.UserTransaction;

import org.enhydra.shark.Shark;
import org.enhydra.shark.api.client.wfmc.wapi.WMConnectInfo;
import org.enhydra.shark.api.client.wfmodel.WfActivity;
import org.enhydra.shark.api.client.wfmodel.WfAssignment;
import org.enhydra.shark.api.client.wfmodel.WfProcess;
import org.enhydra.shark.api.client.wfservice.PackageAdministration;
import org.enhydra.shark.api.client.wfservice.SharkConnection;

public class AskForLeave { 
    private final static String employeeName = "user1";
    private final static String employeePwd = "user1";
    private final static String managerName = "user1";
    private final static String managerPwd = "user1";
    
    /**
     * 请假申请
     * @param request
     * @throws Exception
     */
    public static void apply(HttpServletRequest request) throws Exception {
        UserTransaction ut = SharkUtil.getUserTransaction();
        Connection conn = SharkUtil.getConn();
        boolean rollback = false;
        SharkConnection shConn = null;
        try {
            ut.begin();
            
            //*********业务部分
            //请假申请存入数据库
            Statement stmt = conn.createStatement();
            String sql = "insert into ask_for_leave(apply_user," +
                  "begin_leave_time,end_leave_time,leave_reason) values(" +
                  "'" + request.getParameter("apply_user") + "'," +
                  "'" + request.getParameter("begin_leave_time") + "'," +
                  "'" + request.getParameter("end_leave_time") + "'," +
                  "'" + request.getParameter("leave_reason") + "')";
            System.out.println("insert:" + sql);
            stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
            ResultSet rs = stmt.getGeneratedKeys();
            int id = 0;
            if (rs.next()) id = rs.getInt(1);
            System.out.println("--------------id:" + id);
            
            //*********工作流部分
            System.out.println("--------------wf init");
            //初始化
            SharkUtil.init(request.getRealPath("/"));
            //加载包
            WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
            shConn = SharkUtil.connect(wmconnInfo);
            String pkgId = SharkUtil.loadPackage(shConn, "mydemo.xpdl");
            System.out.println("--------------load pachage:" + pkgId);
            //启动流程
            PackageAdministration pa = Shark.getInstance().getPackageAdministration();
            String pkgVersion = pa.getCurrentPackageVersion(shConn.getSessionHandle(), pkgId);
            String procDefName = SharkUtil.getUniqueProcessDefinitionName(shConn, pkgId, pkgVersion, "askForLeave");
            WfProcess prs = SharkUtil.startProcess(shConn, procDefName);
            Map prsCtx = new HashMap();
            prsCtx.put("biz_id", id + "");
            prs.set_process_context(prsCtx);
            System.out.println("--------------start process:" + procDefName);
            
            //完成申请活动
            WfActivity[] act = prs.get_sequence_step(1);
            SharkUtil.assignmentAccept(shConn, act[0].key());
            act[0].complete();
            System.out.println("--------------comolete apply activity");
            
        }
        catch (Exception e) {
            rollback = true;
            e.printStackTrace();
            throw e;
        }
        finally {
            if (shConn != null) SharkUtil.disconnect(shConn);
            
            if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
                if (rollback) ut.rollback();
                else ut.commit();
            }
            
            if (conn != null) conn.close();
        }
        
        
    }
    
    /**
     * 获取经理的工作列表
     * @param request
     * @return
     * @throws Exception
     */
    public static List<Map> getManagerWorkList(HttpServletRequest request) throws Exception {
        List<Map> workList = null;
        UserTransaction ut = SharkUtil.getUserTransaction();
        Connection conn = SharkUtil.getConn();
        boolean rollback = false;
        SharkConnection shConn = null;
        
        try {
            ut.begin();
            //初始化
            SharkUtil.init(request.getRealPath("/"));
            
            //获取工作流连接
            WMConnectInfo wmconnInfo = new WMConnectInfo(managerName, managerPwd, SharkUtil.getEngineName(), "");
            shConn = SharkUtil.connect(wmconnInfo);
            System.out.println("--------------get wf connection");
            //获取工作列表
            workList = SharkUtil.getWorkList(shConn);
            
            System.out.println("--------------work list count:" + workList.size());
            
        }
        catch (Exception e) {
            rollback = true;
            e.printStackTrace();
            throw e;
        }
        finally {
            if (shConn != null) SharkUtil.disconnect(shConn);
            
            if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
                if (rollback) ut.rollback();
                else ut.commit();
            }
            
            if (conn != null) conn.close();
        }
        
        return workList;
    }
    
    /**
     * 获取申请人的工作列表
     * @param request
     * @return
     * @throws Exception
     */
    public static List<Map> getEmployeeWorkList(HttpServletRequest request) throws Exception {
        List<Map> workList = null;
        UserTransaction ut = SharkUtil.getUserTransaction();
        Connection conn = SharkUtil.getConn();
        boolean rollback = false;
        SharkConnection shConn = null;
        
        try {
            ut.begin();
            
            //初始化
            SharkUtil.init(request.getRealPath("/"));
            
            //获取工作流连接
            WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
            shConn = SharkUtil.connect(wmconnInfo);
            System.out.println("--------------get wf connection");
            //获取工作列表
            workList = SharkUtil.getWorkList(shConn);
            
            System.out.println("--------------work list count:" + workList.size());
            
        }
        catch (Exception e) {
            rollback = true;
            e.printStackTrace();
            throw e;
        }
        finally {
            if (shConn != null) SharkUtil.disconnect(shConn);
            
            if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
                if (rollback) ut.rollback();
                else ut.commit();
            }
            
            if (conn != null) conn.close();
        }
        
        return workList;
    }
    
    /**
     * 根据请假单id获取请假单信息
     * @param id
     * @return
     * @throws Exception
     */
    public static Map getById(String id) throws Exception {
        Map form = new HashMap();
        Connection conn = SharkUtil.getConn();
        
        try {
            Statement stmt = conn.createStatement();
            ResultSet rst = stmt.executeQuery("select * from ask_for_leave where id=" + id);
            if (rst.next()) {
                form.put("apply_user", rst.getString("apply_user"));
                form.put("begin_leave_time", rst.getString("begin_leave_time"));
                form.put("end_leave_time", rst.getString("end_leave_time"));
                form.put("leave_reason", rst.getString("leave_reason"));
            }
            rst.close();
            stmt.close();
        }
        catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        finally {
            
            if (conn != null) conn.close();
        }
        
        return form;
    }
    
    /**
     * 审批
     * @param request
     * @throws Exception
     */
    public static void approval(HttpServletRequest request) throws Exception {
        UserTransaction ut = SharkUtil.getUserTransaction();
        Connection conn = SharkUtil.getConn();
        boolean rollback = false;
        SharkConnection shConn = null;
        try {
            ut.begin();
            //审批信息存入数据库
            Statement stmt = conn.createStatement();
            String sql = "update ask_for_leave set " +
                  "approve_user='" + managerName + "', " +
                  "approve_time=now()," +
                  "is_passed=" + request.getParameter("is_passed") + "," +
                  "approve_remark='" + request.getParameter("approve_remark") + "' " +
                  "where id=" + request.getParameter("biz_id");
            System.out.println("--------------update:" + sql);
            stmt.executeUpdate(sql);
            System.out.println("--------------update complete");
            
            //初始化
            SharkUtil.init(request.getRealPath("/"));
            //连接工作流
            WMConnectInfo wmconnInfo = new WMConnectInfo(managerName, managerPwd, SharkUtil.getEngineName(), "");
            shConn = SharkUtil.connect(wmconnInfo);
            
            //完成审批活动
            String activityKey = request.getParameter("activityKey");
            WfAssignment wfAssignment = SharkUtil.getAssignment(shConn, activityKey);
            SharkUtil.assignmentAccept(shConn, wfAssignment);
            boolean is_passed = false;
            if ("1".equals(request.getParameter("is_passed"))) is_passed = true;
            Map processContext = new HashMap();
            processContext.put("is_passed", new Boolean(is_passed));
            wfAssignment.activity().container().set_process_context(processContext);
            
            wfAssignment.activity().complete();
            System.out.println("--------------comolete approval activity");
            
        }
        catch (Exception e) {
            rollback = true;
            e.printStackTrace();
            throw e;
        }
        finally {
            if (shConn != null) SharkUtil.disconnect(shConn);
            
            if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
                if (rollback) ut.rollback();
                else ut.commit();
            }
            
            if (conn != null) conn.close();
        }
        
        
    }
    
    /**
     * 申请人处理审批后的事务
     * @param request
     * @throws Exception
     */
    public static void leave(HttpServletRequest request) throws Exception {
        UserTransaction ut = SharkUtil.getUserTransaction();
        Connection conn = SharkUtil.getConn();
        boolean rollback = false;
        SharkConnection shConn = null;
        try {
            ut.begin();
            //处理休假情况
            Statement stmt = conn.createStatement();
            ResultSet rst = stmt.executeQuery("select * from ask_for_leave where id="+request.getParameter("biz_id")+"");
            boolean isPassed = false;
            if (rst.next()) {
                if ("1".equals(rst.getString("is_passed"))) isPassed = true;
            }
            if (isPassed) {
                String sql = "update ask_for_leave set " +
                  "back_time=now() " +
                  "where id=" + request.getParameter("biz_id");
                System.out.println("--------------update:" + sql);
                stmt.executeUpdate(sql);
            }
            System.out.println("--------------update complete");
            
            //初始化
            SharkUtil.init(request.getRealPath("/"));
            //连接工作流
            WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
            shConn = SharkUtil.connect(wmconnInfo);
            
            //完成最后的活动
            String activityKey = request.getParameter("activityKey");
            WfAssignment wfAssignment = SharkUtil.getAssignment(shConn, activityKey);
            SharkUtil.assignmentAccept(shConn, wfAssignment);
            wfAssignment.activity().complete();
            System.out.println("--------------comolete all activity");
            
        }
        catch (Exception e) {
            rollback = true;
            e.printStackTrace();
            throw e;
        }
        finally {
            if (shConn != null) SharkUtil.disconnect(shConn);
            
            if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
                if (rollback) ut.rollback();
                else ut.commit();
            }
            
            if (conn != null) conn.close();
        }
    }
}
    然后建立几个jsp文件。apply.jsp是申请请假的页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<form name="form1" method="POST" action="apply_result.jsp">
申请人:<input type="text" name="apply_user" value="suntao"/><br/>
假期开始时间:<input type="text" name="begin_leave_time" value="2009-08-07 09:00"/>(YYYY-MM-DD HH24:MI)<br/>
假期结束时间:<input type="text" name="end_leave_time" value="2009-08-07 18:00"/>(YYYY-MM-DD HH24:MI)<br/>
请假理由:<input type="text" name="leave_reason" value="事假"/><br/>
<input type="submit" value="提交"/><br/>
</form>
</body>
</html>
    请假处理的页面apply_result.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.apply(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
    经理的工作列表页面managerWorkList.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%
List<Map> workList = AskForLeave.getManagerWorkList(request);
%>
<table border="1">
  <tr>
    <td>工作名称</td>
    <td>工作任务</td>
    <td>处理</td>
  </tr>
  <%for(int i=0;i<workList.size();i++){ %>
  <tr>
    <%
    Map processContext = (Map) workList.get(i).get("processContext"); 
    String biz_id = processContext.get("biz_id").toString();
    String activityKey = workList.get(i).get("activityKey").toString();
    %>
    <td><%=workList.get(i).get("processName") %></td>
    <td><%=workList.get(i).get("activityName") %></td>
    <td><a href="approval.jsp?biz_id=<%=biz_id %>&activityKey=<%=activityKey %>">处理</a></td>
  </tr>
  <%} %>
</table>
</body>
</html>
    审批页面approval.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
<script language="javascript">
function go(is_passed)
{
  document.getElementById("is_passed").value = is_passed;
  document.getElementById("form1").submit();
}
</script>
</head>
<body>
<%
String id=request.getParameter("biz_id"); 
Map formData = AskForLeave.getById(id);
%>
<form id="form1" name="form1" method="POST" action="approval_result.jsp">
<input type="hidden" name="biz_id" value="<%=id %>"/>
<input type="hidden" name="activityKey" value="<%=request.getParameter("activityKey") %>"/>
<input type="hidden" id="is_passed" name="is_passed" value=""/>
申请人:<%=formData.get("apply_user") %><br/>
假期开始时间:<%=formData.get("begin_leave_time") %><br/>
假期结束时间:<%=formData.get("end_leave_time") %><br/>
请假理由:<%=formData.get("leave_reason") %><br/>
审批意见:<input type="text" name="approve_remark" value=""/><br/>
<input type="button" value="同意" οnclick="go(1)"/>  <input type="button" value="拒绝" οnclick="go(2)"/><br/>
</form>
</body>
</html>
    审批处理页面approval_result.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.approval(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
    申请人工作列表页面employeeWorkList.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%
List<Map> workList = AskForLeave.getEmployeeWorkList(request);
%>
<table border="1">
  <tr>
    <td>工作名称</td>
    <td>工作任务</td>
    <td>处理</td>
  </tr>
  <%for(int i=0;i<workList.size();i++){ %>
  <tr>
    <%
    Map processContext = (Map) workList.get(i).get("processContext"); 
    String biz_id = processContext.get("biz_id").toString();
    String activityKey = workList.get(i).get("activityKey").toString();
    %>
    <td><%=workList.get(i).get("processName") %></td>
    <td><%=workList.get(i).get("activityName") %></td>
    <td><a href="leave_result.jsp?biz_id=<%=biz_id %>&activityKey=<%=activityKey %>">处理</a></td>
  </tr>
  <%} %>
</table>
</body>
</html>
   申请人处理审批后事务页面leave_result.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.leave(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
    然后运行taomcat,在apply.jsp页面发起请假申请,在managerWorkList.jsp页面进行审批,在employeeWorkList.jsp页面进行后续处理。
    但这里有个问题,在类AskForLeave中都是用user1这一个用户登录的工作流系统,没有区分出谁处理对应的工作,这就涉及到任务的分配问题,下一篇接着讲述。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值