[jboss-user] [JBoss jBPM] - Re: is it possible to force the token jump from one node to

dleerob do-not-reply at jboss.com
Tue Apr 22 05:24:42 EDT 2008


Here is a method I use (in my own framework), to re-route a token.
It may be simpler for you, but the way we do things in our app, this worked for us. Hopefully you can use it or get some ideas:
private void rerouteToken (HttpServletRequest request, ActionErrors errors, ActionMessages messages, ProcessInstance processInstance) {
  | 		User currentUser = getUser(request);
  | 		String tokenId = request.getParameter(Constants.PROCESS_ADMIN_ACTION_TOKEN_ID);
  | 		String nodeName = request.getParameter(Constants.PROCESS_ADMIN_ACTION_NODE_NAME);
  | 		log.info("A token re-route was requested by user '"+currentUser.getUsername()+"' for tokenId '"+tokenId+"' to node '"+nodeName+"'");
  | 		if (tokenId == null || tokenId.equals("")) {
  | 			String errorMsg = "Cannot reroute token, as no tokenId was specified.";
  | 			log.error(errorMsg);
  | 			errors.add(ActionMessages.GLOBAL_MESSAGE, 
  | 					new ActionMessage("errors.customMessage",errorMsg));
  | 			return;
  | 		}
  | 		if (nodeName == null || nodeName.equals("")) {
  | 			String errorMsg = "Cannot reroute token, as no node name was specified.";
  | 			log.error(errorMsg);
  | 			errors.add(ActionMessages.GLOBAL_MESSAGE, 
  | 					new ActionMessage("errors.customMessage",errorMsg));
  | 			return;
  | 		}
  | 		Token token = jbpmContext.getToken(Long.parseLong(tokenId));
  | 		if (token == null) {
  | 			String errorMsg = "Cannot reroute token, as token with ID '"+tokenId+"' was not found.";
  | 			log.error(errorMsg);
  | 			errors.add(ActionMessages.GLOBAL_MESSAGE, 
  | 					new ActionMessage("errors.customMessage",errorMsg));
  | 			return;
  | 		}
  | 		
  | 		Node newNode = processInstance.getProcessDefinition().getNode(nodeName);
  | 		//don't allow re-route if Start Node was selected.
  | 		if (newNode.getId() == newNode.getProcessDefinition().getStartState().getId()) { //if new node is start node
  | 			String errorMsg = "Cannot re-route token to a Start State. You should rather start a new process.";
  | 			log.error(errorMsg);
  | 			errors.add(ActionMessages.GLOBAL_MESSAGE, 
  | 					new ActionMessage("errors.customMessage",errorMsg));
  | 		}
  | 		else {
  | 			//---process reroute---
  | 			//Cancel current incomplete task instances-------------------------------------------------------------
  | 			log.info("Removing task instances found at token with ID '"+tokenId+"'");
  | 			List deleteTaskInstanceList = new ArrayList();
  | 			//create a seperate list of those task instances to delete. If deleting them
  | 			//straight from iterator, a ConcurrentModificationException will occur when calling it.next(); 
  | 			for(Iterator it = processInstance.getTaskMgmtInstance().getTaskInstances().iterator();it.hasNext();) {
  | 				TaskInstance taskInstance = (TaskInstance)it.next();
  | 				if(tokenId.equals(taskInstance.getToken().getId()+"")) {
  | 					if (taskInstance.getEnd() == null) { //not complete task
  | 						deleteTaskInstanceList.add(taskInstance);
  | 					}
  | 				}
  | 			}
  | 			for (int x = 0; x < deleteTaskInstanceList.size(); x++) {
  | 				TaskInstance taskInstance = (TaskInstance)deleteTaskInstanceList.get(x);
  | 				//Clear local variables-----------------------------------------------
  | 				//We must clear local variables, or task instance will save variables
  | 				//from previous instance. We must not delete them, but rather set them
  | 				//to blank, or an exception will be thrown if the variables were 
  | 				//set to 'required' in the process definition.
  | 				Map localVariables = taskInstance.getVariablesLocally();
  | 				for (Iterator it = localVariables.keySet().iterator();it.hasNext();) {
  | 					String variableName = (String)it.next();
  | 					taskInstance.setVariableLocally(variableName, "");
  | 				}
  | 				//--------------------------------------------------------------------
  | 				log.info("Cancelling task instance with ID '"+taskInstance.getId()+"'");
  | 				boolean overwriteSwimlane = false; //don't overwrite swimlane actor
  | 				taskInstance.setActorId("[rerouted by "+currentUser.getUsername()+"]", overwriteSwimlane);
  | 				taskInstance.setSignalling(false);
  | 				//Workaround to stop task-end event from firing when we cancel a task instance. 
  | 				//Remove event, cancel task instance, add event again-----------------
  | 				Task task = taskInstance.getTask();
  | 				Event endTaskEvent = task.getEvent(Event.EVENTTYPE_TASK_END);
  | 				if (endTaskEvent != null) {
  | 					task.removeEvent(endTaskEvent);					
  | 				}
  | 				taskInstance.cancel();
  | 				if (endTaskEvent != null) {
  | 					task.addEvent(endTaskEvent);					
  | 				}
  | 				//-------------------------------------------------------------------
  | 			}
  | 			//-----------------------------------------------------------------------------------------------------
  | 			newNode.enter(new ExecutionContext(token));
  | 			//log info
  | 			String msg = "Token with ID '"+token.getId()+"' was rerouted to node '"+nodeName+"'";
  | 			log.info(msg);
  | 			messages.add(ActionMessages.GLOBAL_MESSAGE,
  | 					new ActionMessage("messages.customMessage", msg));
  | 		}
  | 		
  | 	}

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

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



More information about the jboss-user mailing list