jbpm CVS head makes it possible to deside runtime which subprocess to take (the name can be an EL). You can then e.g. use a processvariable to decide which subprocess to use. This is a kind of flexibility that in many cases is sufficient to have a dynamic process without modifying the process.
Can you see it this would work for you?
I saw the subprocess capability, but have not looked into it in depth yet. I'll check it out to see if it applies. Of course, I'm looking to avoid a big code rewrite if I can.
Here's a scenario to consdier:
A (part of a) process has the following steps. The first step has to be completed (i.e. its task completed) before moving to the next step.
1) person A does task AA
2) persons B, C and D do tasks BB, CC and DD in parallel
3) person E does task EE
In the graph this looks like (very roughly) task node AA to fork node to task nodes BB, CC, DD to join node to task node EE. The process is started and gets to step 1. Now the process author decides he needs to add person Z to do task ZZ in parallel with persons B, C and D in step 2. He wants to just add this in to the running process. This is what I'm trying to solve.
Is this a one-off situation where you just need to fix this particular process instance or are you looking for a more complete solution moving forward e.g. having a dynamic multiple choice after AA task is complete so that XX and YY could also be options but not known up front?
Definitely looking to solve the general case.
In the typical case, the process is not changed once started, but occasionally either the task assignment has to change (prior to the task being assigned) or a new user and new task assigned. Sometimes the task is removed, but that's a relatively easy case that I've got working now.
1) assignments can't be taken from a pool for the tasks. They are very specific and are set up when the process is created (using custom assignment handlers that get the assignment name from the data given in the process definition's XML).
2) each process definition is unique because of the above.
3) we have custom web-based process authoring that allows the process author to assign variable numbers of parallel tasks. The forks and joins are added by my code in this case. While the processes always have the same general sequence, entire sets of nodes may not be created if the process author has decided that those steps are not necessary for a particular case. Being red-blooded human users though, they sometimes change their minds.
create a custom fork (see the wiki and/or search this forum) that way you can use processvariables to feed the fork and behave differently