⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processimagetagservlet.java

📁 workflow first jbpm
💻 JAVA
字号:
package com.yuyanshan.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;

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;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.yuyanshan.service.BeanService;

/** 
 * @author yuyanshan E-mail: yuyanshan1@163.com 
 * @version 1.0 create_time:Jul 29, 2008 5:44:01 PM 
 * @class_explain: 
 */

public class ProcessImageTagServlet extends HttpServlet {
	private long taskInstanceId = -1;
	  private long tokenInstanceId = -1;
	  
	  private byte[] gpdBytes = null;
	  private byte[] imageBytes = null;
	  private Token currentToken = null;
	  private ProcessDefinition processDefinition = null;
	  private JbpmContext jbpmContext=null;
	  static String currentTokenColor = "red";
	  static String childTokenColor = "blue";
	  static String tokenNameColor = "blue";
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
		ApplicationContext ctx=WebApplicationContextUtils.getRequiredWebApplicationContext(req.getSession().getServletContext());
	    JbpmConfiguration jbpmConfiguration=(JbpmConfiguration) ctx.getBean("jbpmConfiguration");
		PrintWriter out = resp.getWriter();
		this.taskInstanceId = Long.parseLong(req.getParameter("tokenId"));
//		JbpmConfiguration jbpmConfiguration = (JbpmConfiguration) BeanService.getBean("jbpmConfiguration");
//		  JbpmConfiguration jbpmConfiguration = JbpmConfiguration
//			.getInstance();
	     jbpmContext = jbpmConfiguration.getCurrentJbpmContext(); 
	    if(jbpmContext==null)
	    {
	    	jbpmContext=jbpmConfiguration.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();
	    
	    
		 try {
		     
		      retrieveByteArrays();
		      if (gpdBytes != null && imageBytes != null) {
		        writeTable(out);
		      }
		    } catch (Exception e) {
		      e.printStackTrace();
		      
		    } 
		    finally
		    {
		    	jbpmContext.close();
		    }
		    
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
//		this.doGet(req, resp);
	}

	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(PrintWriter out) 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();
	    PrintWriter jspOut = out;

	    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 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);
	  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -