`

把jbpm流程图显示在jsp页面中2008-07-10 15:08把jbpm流程图显示在jsp页面中

阅读更多
把jbpm流程图显示在jsp页面中2008-07-10 15:08把jbpm流程图显示在jsp页面中


---------------------------------------------------------------------------------------------------------------------------
1 首先找到jbpm项目自带的 org.jbpm.webapp.servlet下的三个servlet:
deployServlet,ProcessImageServlet, UploadServlet 和org.jbpm.webapp.servlet下的processImageTag。
把这些东东copy到你的项目的src中

2 配置项目下的web.xml,代码如下:
---------------------------------------------------------------------------------------------------------------------------

<!-- jBPM -->
    <servlet>
        <servlet-name>ProcessImageServlet</servlet-name>
        <servlet-class>
            org.jbpm.webapp.servlet.ProcessImageServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ProcessImageServlet</servlet-name>
        <url-pattern>/processimage</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>DeployServlet</servlet-name>
        <servlet-class>
            org.jbpm.webapp.servlet.DeployServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DeployServlet</servlet-name>
        <url-pattern>/deploy</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>UploadServlet</servlet-name>
        <servlet-class>
            org.jbpm.webapp.servlet.UploadServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UploadServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>
---------------------------------------------------------------------------------------------------------------------------

3 把jbpm自带的标签定义 jbpm.tld    copy到你的项目的/web-info 目录下

4 找到jbpm自带的deploy.html(把这个html放在项目的webroot根目录下,牵涉到servlet的解析问题),这就是流程定义的部署页面。

5 流程定义文件的打包:在eclipse的process definition的设计界面下打开你设计好的流程定义图,
利用designer的 “deployment”把三个文件(gpd.xml   processdefiniton.xml.   processimage.jpg)打包,
点击“save process archive locally”,选定“location”,点击“save without deplying”保存流程定义文件包
(当然你也可以利用desinger中的deployment server setting ,只要能把这三个文件部署到你的数据库中即可)

6 利用deploy.html部署打包好的流程定义文件包 到数据库。可以查看jbjpm_bytearray表中是否有数据,有的话则表明部署成功,
否则就是没有部署成功

7一定要把显示流程图的jsp页面(假设名字为show.jsp)放在webroot根目录下(因为牵涉到servlet的解释问题),
在jsp页面中调用 即可显示出流程图及当前节点的位置。

8如果有nullpointexception,修改UploadServlet,代码如下:

JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
     if(jbpmContext == null)
     {
      jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
     }

8 运行试试吧,应该能够成功的。
---------------------------------------------------------------------------------------------------------------------------
UploadServlet .java改写

---------------------------------------------------------------------------------------------------------------------------

package org.jbpm.webapp.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.zip.ZipInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        response.setContentType("text/html; charset=utf-8");
        response.getWriter().println(handleRequest(request));
    }
    public void printInput(HttpServletRequest request) throws IOException {
        InputStream inputStream = request.getInputStream();
        StringBuffer buffer = new StringBuffer();
        int read;
        while ((read = inputStream.read()) != -1) {
            buffer.append((char) read);
        }
        log.debug(buffer.toString());
    }
    private String handleRequest(HttpServletRequest request) {
        if (!FileUpload.isMultipartContent(request)) {
            log.debug("Not a multipart request");
            return "Not a multipart request";
        }
        try {
            DiskFileUpload fileUpload = new DiskFileUpload();
            List list = fileUpload.parseRequest(request);
            Iterator iterator = list.iterator();
            if (!iterator.hasNext()) {
                log.debug("No process file in the request");
                return "No process file in the request";
            }
            FileItem fileItem = (FileItem) iterator.next();
            if (fileItem.getContentType().indexOf(
                    "application/x-zip-compressed") == -1) {
                log.debug("Not a process archive");
                return "Not a process archive";
            }
            return doDeployment(fileItem);
        } catch (FileUploadException e) {
            e.printStackTrace();
            return "FileUploadException";
        }
    }
    private String doDeployment(FileItem fileItem) {
        System.out.println("文件" + fileItem.getName());
        try {
            ZipInputStream zipInputStream = new ZipInputStream(fileItem
                    .getInputStream());
            //
            JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
            // 添加代码
            if (jbpmContext == null) {
                JbpmConfiguration config = JbpmConfiguration.getInstance();
                jbpmContext = config.createJbpmContext();
            }
            //
            ProcessDefinition processDefinition = ProcessDefinition
                    .parseParZipInputStream(zipInputStream);
            log.debug("创建Created a processdefinition : "
                    + processDefinition.getName());
            jbpmContext.deployProcessDefinition(processDefinition);
            zipInputStream.close();
            jbpmContext.close();
            return "上传 " + processDefinition.getName() + " 成功";
        } catch (IOException e) {
            return "IOException";
        }
    }
    private static Log log = LogFactory.getLog(UploadServlet.class);
}
---------------------------------------------------------------------------------------------------------------------------
ProcessImageTag 改写
---------------------------------------------------------------------------------------------------------------------------
/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jbpm.webapp.tag;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.xpath.DefaultXPath;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.file.def.FileDefinition;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.Token;
import org.jbpm.taskmgmt.exe.TaskInstance;
public class ProcessImageTag extends TagSupport {
    private static final long serialVersionUID = 1L;
    private long taskInstanceId = -1;
    private long tokenInstanceId = -1;
    private byte[] gpdBytes = null;
    private byte[] imageBytes = null;
    private Token currentToken = null;
    private ProcessDefinition processDefinition = null;
    static String currentTokenColor = "red";
    static String childTokenColor = "blue";
    static String tokenNameColor = "blue";
    public void release() {
        taskInstanceId = -1;
        gpdBytes = null;
        imageBytes = null;
        currentToken = null;
    }
    public int doEndTag() throws JspException {
        try {
            initialize();
            retrieveByteArrays();
            if (gpdBytes != null && imageBytes != null) {
                writeTable();
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new JspException("table couldn't be displayed", e);
        } catch (DocumentException e) {
            e.printStackTrace();
            throw new JspException("table couldn't be displayed", e);
        }
        release();
        return EVAL_PAGE;
    }
    private void retrieveByteArrays() {
        try {
            FileDefinition fileDefinition = processDefinition
                    .getFileDefinition();
            gpdBytes = fileDefinition.getBytes("gpd.xml");
            imageBytes = fileDefinition.getBytes("processimage.jpg");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void writeTable() throws IOException, DocumentException {
        int borderWidth = 4;
        Element rootDiagramElement = DocumentHelper.parseText(
                new String(gpdBytes)).getRootElement();
        int[] boxConstraint;
        int[] imageDimension = extractImageDimension(rootDiagramElement);
        String imageLink = "processimage?definitionId="
                + processDefinition.getId();
        JspWriter jspOut = pageContext.getOut();
        if (tokenInstanceId > 0) {
            List allTokens = new ArrayList();
            walkTokens(currentToken, allTokens);
            jspOut
                    .println("<div style='position:relative; background-image:url("
                            + imageLink
                            + "); width: "
                            + imageDimension[0]
                            + "px; height: " + imageDimension[1] + "px;'>");
            for (int i = 0; i < allTokens.size(); i++) {
                Token token = (Token) allTokens.get(i);
                // check how many tokens are on teh same level (= having the
                // same parent)
                int offset = i;
                if (i > 0) {
                    while (offset > 0
                            && ((Token) allTokens.get(offset - 1)).getParent()
                                    .equals(token.getParent())) {
                        offset--;
                    }
                }
                boxConstraint = extractBoxConstraint(rootDiagramElement, token);
           
       
                // Adjust for borders
                // boxConstraint[2]-=borderWidth*2;
                // boxConstraint[3]-=borderWidth*2;
                jspOut.println("<div style='position:absolute; left: "
                        + boxConstraint[0] + "px; top: " + boxConstraint[1]
                        + "px; ");
                if (i == (allTokens.size() - 1)) {
                    jspOut.println("border: " + currentTokenColor);
                } else {
                    jspOut.println("border: " + childTokenColor);
                }
                jspOut.println(" " + borderWidth + "px groove; " + "width: "
                        + boxConstraint[2] + "px; height: " + boxConstraint[3]
                        + "px;'>");
                if (token.getName() != null) {
                    jspOut.println("<span style='color:" + tokenNameColor
                            + ";font-style:italic;position:absolute;left:"
                            + (boxConstraint[2] + 10) + "px;top:"
                            + ((i - offset) * 20) + ";'>&nbsp;"
                            + token.getName() + "</span>");
                }
                jspOut.println("</div>");
            }
            jspOut.println("</div>");
        } else {
            boxConstraint = extractBoxConstraint(rootDiagramElement);
            jspOut.println("<table border=0 cellspacing=0 cellpadding=0 width="
                    + imageDimension[0] + " height=" + imageDimension[1] + ">");
            jspOut.println(" <tr>");
            jspOut.println("    <td width=" + imageDimension[0] + " height="
                    + imageDimension[1] + " style=\"background-image:url("
                    + imageLink + ")\" valign=top>");
            jspOut
                    .println("      <table border=0 cellspacing=0 cellpadding=0>");
            jspOut.println("        <tr>");
            jspOut.println("          <td width="
                    + (boxConstraint[0] - borderWidth) + " height="
                    + (boxConstraint[1] - borderWidth)
                    + " style=\"background-color:transparent;\"></td>");
            jspOut.println("        </tr>");
            jspOut.println("        <tr>");
            jspOut
                    .println("          <td style=\"background-color:transparent;\"></td>");
            jspOut
                    .println("          <td style=\"border-color:"
                            + currentTokenColor
                            + "; border-width:"
                            + borderWidth
                            + "px; border-style:groove; background-color:transparent;\" width="
                            + boxConstraint[2] + " height="
                            + (boxConstraint[3] + (2 * borderWidth))
                            + ">&nbsp;</td>");
            jspOut.println("        </tr>");
            jspOut.println("      </table>");
            jspOut.println("    </td>");
            jspOut.println(" </tr>");
            jspOut.println("</table>");
        }
    }
    private int[] extractBoxConstraint(Element root) {
        int[] result = new int[4];
        String nodeName = currentToken.getNode().getName();
        XPath xPath = new DefaultXPath("//node[@name='" + nodeName + "']");
        Element node = (Element) xPath.selectSingleNode(root);
        result[0] = Integer.valueOf(node.attribute("x").getValue()).intValue();
        result[1] = Integer.valueOf(node.attribute("y").getValue()).intValue();
        result[2] = Integer.valueOf(node.attribute("width").getValue())
                .intValue();
        result[3] = Integer.valueOf(node.attribute("height").getValue())
                .intValue();
        return result;
    }
    private int[] extractBoxConstraint(Element root, Token token) {
        int[] result = new int[4];
        String nodeName = token.getNode().getName();
        XPath xPath = new DefaultXPath("//node[@name='" + nodeName + "']");
        Element node = (Element) xPath.selectSingleNode(root);       
       
        result[0] = Integer.valueOf(node.attribute("x").getValue()).intValue();
        result[1] = Integer.valueOf(node.attribute("y").getValue()).intValue();  
       
        result[2] = Integer.valueOf(node.attribute("width").getValue())
                .intValue();
        result[3] = Integer.valueOf(node.attribute("height").getValue())
                .intValue();
        return result;
    }
    private int[] extractImageDimension(Element root) {
        int[] result = new int[2];
        result[0] = Integer.valueOf(root.attribute("width").getValue())
                .intValue();
        result[1] = Integer.valueOf(root.attribute("height").getValue())
                .intValue();
        return result;
    }
    private void initialize() {
        JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
        // 添加代码
        if (jbpmContext == null) {
            JbpmConfiguration config = JbpmConfiguration.getInstance();
            jbpmContext = config.createJbpmContext();
        }
        //
        if (this.taskInstanceId > 0) {
            TaskInstance taskInstance = jbpmContext.getTaskMgmtSession()
                    .loadTaskInstance(taskInstanceId);
            currentToken = taskInstance.getToken();
        } else {
            if (this.tokenInstanceId > 0)
                currentToken = jbpmContext.getGraphSession().loadToken(
                        this.tokenInstanceId);
        }
        processDefinition = currentToken.getProcessInstance()
                .getProcessDefinition();
    }
    private void walkTokens(Token parent, List allTokens) {
        Map children = parent.getChildren();
        if (children != null && children.size() > 0) {
            Collection childTokens = children.values();
            for (Iterator iterator = childTokens.iterator(); iterator.hasNext();) {
                Token child = (Token) iterator.next();
                walkTokens(child, allTokens);
            }
        }
        allTokens.add(parent);
    }
    public void setTask(long id) {
        this.taskInstanceId = id;
    }
    public void setToken(long id) {
        this.tokenInstanceId = id;
    }
}
--------------------------------------------------------------------------------------------------------------------------

viewFlow.jsp
---------------------------------------------------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"%>
   
<%@ taglib uri="/WEB-INF/jbpm.tld" prefix="jbpm" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
long tokenId = Long.parseLong(request.getParameter("tokenId"));
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'viewFlow.jsp' starting page</title>
   
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
</head>

<body>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics