jbpm创建流程图_Jbpm流程图显示

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

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

1 首先找到jbpm项目自带的 org.jbpm.webapp.servlet下的三个servlet:

deployServlet,ProcessImageServlet, UploadServlet 和org.jbpm.webapp.servlet下的

processImageTag。

把这些东东copy到你的项目的src中

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

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

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

ProcessImageServlet

org.jbpm.webapp.servlet.ProcessImageServlet

ProcessImageServlet

/processimage

DeployServlet

org.jbpm.webapp.servlet.DeployServlet

DeployServlet

/deploy

UploadServlet

org.jbpm.webapp.servlet.UploadServlet

UploadServlet

/upload

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

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

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("

");

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("

");

if (token.getName() != null) {

jspOut.println(" "

+ token.getName() + "");

}

jspOut.println("

");

}

jspOut.println("

");

} else {

boxConstraint = extractBoxConstraint(rootDiagramElement);

jspOut.println("

jspOut.println("

");

jspOut.println("   

+ imageLink + ")\" valign=top>");

jspOut

.println("     

jspOut.println("       

");

jspOut.println("         

");

jspOut.println("       

");

jspOut.println("       

");

jspOut

.println("         

color:transparent;\">

");

jspOut

.println("         

+ currentTokenColor

+ "; border-width:"

+ borderWidth

+ "px; border-style:groove; background-color:transparent;\"

width="

+ boxConstraint[2] + " height="

+ (boxConstraint[3] + (2 * borderWidth))

+ "> 

");

jspOut.println("       

");

jspOut.println("     

");

jspOut.println("   

");

jspOut.println("

");

jspOut.println("

");

}

}

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

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

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

pageEncoding="utf-8"%>

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()

+":"+request.getServerPort()+path+"/";

long tokenId = Long.parseLong(request.getParameter("tokenId"));

%>

My JSP 'viewFlow.jsp' starting page
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值