[jboss-user] [JBoss jBPM] - Re: Just a Question Regarding Change in Process Definition

dleerob do-not-reply at jboss.com
Mon Mar 31 08:42:43 EDT 2008


Here's what I finally did to update files stored in the database for a Process Definition, such as JSP pages, xml files, class files (handlers) etc:

- I copied ProcessUploadServlet.java from jbpm source, and created my own version in my webapp source code.

- In web.xml I used my ProcessUploadServlet.java, instead of the one in the jpbm package.

- I copied the method 'GraphSession.deployProcessDefinition(processDefinition)' into my ProcessUploadServlet.java

- I copied the method 'GraphSession.findLatestProcessDefinition' into my ProcessUploadServlet.java

- In the handleRequest method in my ProcessUploadServlet.java, where the deployProcessDefinition method is called, I replaced it to call my own deployProcessDefinition method, as shown below:
String updateProcessDefinitionFilesStr = (String)request.getParameter(Constants.UPDATE_PROCESS_DEFINITION_FILES);
  | 				boolean updateProcessDefinition = false;
  | 				if (updateProcessDefinitionFilesStr != null && updateProcessDefinitionFilesStr.equalsIgnoreCase("Yes")) {
  | 					updateProcessDefinition = true;
  | 				}

- I then modified my copy of the deployProcessDefinition to look as follows:
/**
  | 	 * The code for the original method can be found at: jbpm-jpdl-3.2.2\src\jpdl\org\jbpm\db\GraphSession.java
  | 	 * We are using our customized method instead, so we can update Process Definition files if we want,
  | 	 * instead of creating a new version.
  | 	 * Note: if the version of JBPM is updated, we need to re-look at this method to make sure
  | 	 * it will still work according to the new version.
  | 	 * @param processDefinition
  | 	 * @param jbpmContext
  | 	 * @param updateProcessDefinition
  | 	 */
  | 	private void deployProcessDefinition(ProcessDefinition processDefinition, JbpmContext jbpmContext, boolean updateProcessDefinition) {
  | 		Session session = jbpmContext.getSession();
  | 		String processDefinitionName = processDefinition.getName();
  | 		// if the process definition has a name (process versioning only applies to named process definitions)
  | 		if (processDefinitionName!=null) {
  | 			// find the current latest process definition
  | 			ProcessDefinition previousLatestVersion = findLatestProcessDefinition(processDefinitionName, jbpmContext);
  | 			// if there is a current latest process definition
  | 			if (previousLatestVersion!=null) {
  | 					if (updateProcessDefinition) {
  | 						log.info("Updating Process Definition '"+previousLatestVersion.getName()+"' version '"+previousLatestVersion.getVersion()+"'");
  | 						Map fileBytes = processDefinition.getFileDefinition().getBytesMap();
  | 						FileDefinition previousFileDefinition = previousLatestVersion.getFileDefinition();
  | 						session.createSQLQuery("delete from jbpm_byteblock where PROCESSFILE_ IN (select ID_ from jbpm_bytearray where FILEDEFINITION_ = "+previousFileDefinition.getId()+")").executeUpdate();
  | 						session.createSQLQuery("delete from jbpm_bytearray where FILEDEFINITION_ = "+previousFileDefinition.getId()).executeUpdate();
  | 						for (Iterator it = fileBytes.keySet().iterator();it.hasNext();) {
  | 							String fileName = (String)it.next();
  | 							previousFileDefinition.addFile(fileName, (byte[])fileBytes.get(fileName));
  | 						}
  | 						//don't change version, but instead update existing process definition
  | 						session.save(previousFileDefinition);
  | 						log.info("Process Definition Updated.");
  | 						return;
  | 					}
  | 					else {
  | 						//new version
  | 						log.info("Creating new version '"+(previousLatestVersion.getVersion()+1)+"' for Process Definition '"+processDefinition.getName()+"'");
  | 						processDefinition.setVersion(previousLatestVersion.getVersion()+1);
  | 					}
  | 			} 
  | 			else {
  | 				// start from 1
  | 				processDefinition.setVersion(1);
  | 			}
  | 
  | 			session.save(processDefinition);
  | 
  | 		}
  | 		else {
  | 			throw new JbpmException("process definition does not have a name");
  | 		}
  | 	}

- In eclipse, when deploying my Process Definition, under the 'Server Deployer' field, I add on the parameter 'updateProcessDefinitionFiles=Yes'. Eg: /workflow/upload?updateProcessDefinitionFiles=Yes

This seems to work for me, if all I want to do is update the ProcessDefinition's FileDefinition object with new files. (ie. updating the files in the database).

Any feedback is welcome, I would like to know if there's a better way to do it, or if you see any possible problems/pitfalls with this way of doing it.

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4140108#4140108

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4140108



More information about the jboss-user mailing list