]
Tyler Mendenhall commented on JBPM-457:
---------------------------------------
This is still an issue in jbpm-jpdl-3.2.1 and causes the same null pointer issue when
deploying a process definition that references a subflow in the jbpm console.
I have implemented similar code to resolve the problem in a unit test.
I have a deploy process method:
protected void deployProcess() {
this.dbPersistenceServiceFactory.createSchema();
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
String processDef = this.getProcessDefinitionLocation();
if (processDef==null) throw new IllegalArgumentException("unspecified process
name");
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlResource(processDef);
jbpmContext.deployProcessDefinition(processDefinition);
this.deploySubProcesses(processDefinition);
} finally {
jbpmContext.close();
}
}
private void deploySubProcesses(ProcessDefinition superProcessDef){
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try{
// for each subprocess defined in the map there will be a node definition in the key
// and the process definition xml location in the value
Map subProcessMap = this.getSubProcessMap();
for (Iterator iter = subProcessMap.keySet().iterator(); iter.hasNext();) {
String nodeName = (String) iter.next();
String definitionLocation = (String)subProcessMap.get(nodeName);
if (definitionLocation==null){
throw new IllegalArgumentException("Node:"+nodeName+" is missing the
processdefinition.xml location");
}
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlResource(definitionLocation);
jbpmContext.deployProcessDefinition(processDefinition);
ProcessState node = (ProcessState)superProcessDef.getNode(nodeName);
if (node!=null){
node.setSubProcessDefinition(processDefinition);
} else {
String superName = superProcessDef.getName();
throw new IllegalArgumentException("Node:"+nodeName+" does not exist
in "+superName);
}
}
} finally {
jbpmContext.close();
}
}
However it requires the user to set up the association between process nodes in the parent
process definition with individual sub classes.
Hopefully this will help out a bit.
Thanks,
Tyler
Parent process deployment does not link process-state with subprocess
definition
--------------------------------------------------------------------------------
Key: JBPM-457
URL:
http://jira.jboss.com/jira/browse/JBPM-457
Project: JBoss jBPM
Issue Type: Bug
Components: Core Engine
Reporter: Eduardo Jimenez
Assigned To: Tom Baeyens
From the ProcessState code:
Code:
if (jbpmSession != null) {
// now, we must be able to find the sub-process
if (subProcessName != null) {
// if the name and the version are specified
if (subProcessVersion != null) {
try {
int version = Integer.parseInt(subProcessVersion);
// select that exact process definition as the subprocess definition
subProcessDefinition =
jbpmSession.getGraphSession().findProcessDefinition(subProcessNam
e, version);
} catch (NumberFormatException e) {
jpdlReader.addWarning("version in process-state was not a number: "
+ processStateElement.asXML());
}
} else { // if only the name is specified
// select the latest version of that process as the subprocess
// definition
subProcessDefinition =
jbpmSession.getGraphSession().findLatestProcessDefinition(subProces
sName);
}
} else {
jpdlReader.addWarning("no sub-process name specified in process-state "
+ processStateElement.asXML());
}
}
if there is no session open, it simply won't look for the parent process.
Now, from the ProcessArchiveDeployer:
Code:
public static void deployZipInputStream(ZipInputStream zipInputStream, JbpmSessionFactory
jbpmSessio
nFactory) {
ProcessDefinition processDefinition =
ProcessDefinition.parseParZipInputStream(zipInputStream);
deployProcessDefinition(processDefinition, jbpmSessionFactory);
}
It reads the process definition first, then calls deploy, which opens the first
jbpmSession!!!. The session must be open first before attempting to deploy!.
Now, you might say, use the ant task, but the bug is still there:
Code:
private void deploy(File file, JbpmSessionFactory jbpmSessionFactory) throws IOException,
FileNotFou
ndException {
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));
ProcessArchiveDeployer.deployZipInputStream(zipInputStream,jbpmSessionFactory);
}
See, the ant task doens't open a jbpmSession either, so its up to
ProcessArchiveDeployer.deployZipInputStream() to do it, which is the same method I'm
having an issue with.
Examining ProcessArchiveDeployer, every way of deploying a process would have the same
problem.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: