jumping to a new task node
akriel Apr 17, 2009 3:22 PMFor various reasons within my app that is using JBPM I need to be able to abort all current tasks and jump to a different location in the process under certain circumstances (specifically if at any time the underlying data is updated). I have written a tag to do this though it isn't quite working the way I expected.
The code will create the task I specify, but it sometimes create two of them, and sometimes will also create an additional task form my startnode. I know I must be missing something but I can't see what.
Any help is greatly appreciated.
public class RestartToNodeActionListener implements JbpmActionListener
{
private final ValueExpression processInstanceExpression;
private final ValueExpression toNodeExpression;
public RestartToNodeActionListener( final ValueExpression processInstance, final ValueExpression toNode )
{
processInstanceExpression = processInstance;
toNodeExpression = toNode;
}
public String getName()
{
return "restartToNodeActionListener";
}
public void handleAction( JbpmJsfContext context, ActionEvent event )
{
try
{
final FacesContext facesContext = FacesContext.getCurrentInstance();
final ELContext elContext = facesContext.getELContext();
ProcessInstance processInstance = ( ProcessInstance ) processInstanceExpression.getValue( elContext );
String toNodeName = ( String ) toNodeExpression.getValue( elContext );
// get the task manager
TaskMgmtInstance taskManager = processInstance.getTaskMgmtInstance();
// get the old root token
Token oldRoot = processInstance.getRootToken();
// get the def so we can find the start node
ProcessDefinition processDefinition = processInstance.getProcessDefinition();
// get the start node to create the new root token
Node startNode = processDefinition.getStartState();
// get all tasks for the current instance
List<TaskInstance> tasks = new ArrayList<TaskInstance>( taskManager.getTaskInstances() );
int taskCount = tasks.size();
for ( int i = 0; i < taskCount; i++ )
{
TaskInstance taskInstance = tasks.get( i );
if ( taskInstance != null )
{
// remove each task instance
taskManager.removeTaskInstance( taskInstance );
// if the task is active cancel it
if ( taskInstance.isOpen() && !taskInstance.isCancelled() )
{
// try to cancel the task instance
taskInstance.cancel();
}
}
}
// added this because not all tasks were being canceled and was hoping it would be a catch all.
taskManager.endAll();
// get the task definition manager
TaskMgmtDefinition taskManagerDefinition = taskManager.getTaskMgmtDefinition();
// set the node we want to jump to
Task startTask = taskManagerDefinition.getTask( toNodeName );
// get the node to move the root token to
Node startingNode = taskManagerDefinition.getProcessDefinition().getNode( toNodeName );
// set the root token to point to the node
oldRoot.setNode( startingNode );
// create the new task instance
TaskInstance newStartInstance = taskManager.createTaskInstance( startTask, oldRoot );
// add in a start task
taskManager.addTaskInstance( newStartInstance );
context.selectOutcome("success");
}
catch ( Exception ex )
{
context.setError( "Error clearing tasks and resetting to task", ex );
return;
}
}
}