[jboss-user] [JBoss jBPM] - Variable missing in assignment handler

lpiccoli do-not-reply at jboss.com
Tue Jul 14 05:39:38 EDT 2009


hi all,

my swimlane assignment handler is unable to retrieve variables that have been previous set in both root token and local token.

the test involves a forkhandler, sub process and swimlane assignment handler.

When inside the SwimlaneAssignmentHandler getVariable() returns null which is not what i was expecting


  | public void assign(Assignable assignable, ExecutionContext executionContext) {
  | 				  	
  | assertNotNull("shouldnt be null", executionContext.getVariable(IDENTIFIER));
  | String expression = (String)executionContext.getVariable(EXPRESSION);
  | assertNotNull( "shouldnt be null", expression );
  | 

as it was set in the previous ActivityForkActionHandler.execute()



  | public void execute(final ExecutionContext executionContext) throws Exception {
  | .....stuff
  | Token(rootToken, "ITP" + item.getId()); //TODO -lp		        	
  | newToken.setTerminationImplicit(true);
  | 		                executionContext.getJbpmContext().getSession().save(newToken);
  | final ExecutionContext newExecutionContext = new ExecutionContext(newToken);
  | newExecutionContext.getContextInstance().createVariable( 
  | 			                		EXPRESSION, 
  | 			                		item.getResponsibleExpression(),
  | 			                		newToken);
  | 
  | 


I am not sure if the problem is with my process definition of the swimlan assignment


  | <swimlane name='responsible' >
  | <assignment class='com.asteriski.itpflow.action.ActivityForkActionHandlerTest$SwimlaneAssignmentHandler'/>
  | </swimlane>
  | 

or with how i am setting the local variables against token in the forkHandler above

i have a attached the entire test case below. It is a bit tedious but i needed to include all the handler code.

any help is most appreciated.


  | public class ActivityForkActionHandlerTest extends AbstractJbpmTestCase  {
  | 
  | 		static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance("jbpm.test.cfg.xml");
  | 		
  | 		public void testForkHandlerAndSubProcess() throws Exception {
  | 		
  | 			 JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  | 			 
  | 			 ProcessDefinition subProcessDefinition = ProcessDefinition.parseXmlString(
  | 				      "<process-definition name='sub'>" +
  | 				      "  <start-state>" +
  | 				      "    <transition to='wait' />" +
  | 				      "  </start-state>" +
  | 				      "   <swimlane name='responsible' >" +
  | 					  "		<assignment class='com.asteriski.itpflow.action.ActivityForkActionHandlerTest$SwimlaneAssignmentHandler' />" +
  | 				      "	   </swimlane>" +
  | 				      "   <task-node name='wait' >" 		+			   
  | 				      "		<description>'just waiting'</description>" +
  | 				      "     <task name='task-waiting' signal='block' swimlane='responsible'>"+
  | 				      "    </task>" +
  | 				      "   <transition to='end_sub'></transition>" +
  | 				      "  </task-node>" +
  | 				      "  <end-state name='end_sub' />" +
  | 				      "</process-definition>"
  | 				    );
  | 				    jbpmContext.deployProcessDefinition(subProcessDefinition);
  | 				    
  | 		    ProcessDefinition superProcessDefinition = ProcessDefinition.parseXmlString(
  | 		    		"<process-definition" +
  | 		    		" name='super'>" +
  | 		    		"<start-state name='start'> " +
  | 		    		"<transition name='to_state' to='forkActivities'>" +
  | 		            "</transition>" +
  | 		            "</start-state>" +
  | 		            "  <node name='forkActivities'>" +
  | 				      "  <action class='com.asteriski.itpflow.action.ActivityForkActionHandlerTest$ActivityForkActionHandler' config-type='bean' name='ActivityForkActionHandler'></action>" +
  | 				      "   <description>" +
  | 				      "    find all activities that have no blocking state and generate a testign request"+
  | 				      "   </description>" +
  | 				      " <transition to='Sub Process'></transition>" +
  | 				      " </node>" +
  | 		            "<process-state name='Sub Process'>" +
  | 		    		"<sub-process name='sub'/>" +
  | 		    		"<transition to='task-node1'></transition>" +
  | 		    		"</process-state>" +
  | 		            "<task-node name='task-node1'> " +
  | 		            "  <task  name='task1'>" +
  | 		            "  </task>" +
  | 		            "  <transition to='end' name='to_end'> " +
  | 		            "  </transition>" +
  | 		            "</task-node>" +
  | 		            "<end-state name='end'></end-state> " +
  | 		            "</process-definition>");
  | 		    
  | 		
  | 		    jbpmContext.deployProcessDefinition(superProcessDefinition);
  | 		    ProcessInstance processInstance = jbpmContext.newProcessInstance("super");
  | 		    
  | 		    ProcessState processState = (ProcessState) superProcessDefinition.getNode("Sub Process");
  | 		    processState.setSubProcessDefinition(subProcessDefinition);
  | 		
  | 		    processInstance.getContextInstance().createVariable(Constant.ITP_ID_JBPM_CONTEXT_IDENTIFIER, 1);
  | 		    
  | 		    // After construction, the process execution has one main path
  | 		    // of execution (=the root token).
  | 		    Token rootToken = processInstance.getRootToken();
  | 		    
  | 			assertEquals( 
  | 					"start",
  | 					rootToken.getNode().getName());
  | 			
  | 			
  | 		 // Move the process instance to the task
  | 		    rootToken.signal();
  | 			assertEquals(
  | 					"Sub Process",
  | 					rootToken.getNode().getName());
  | 
  | 			//get the sub process
  | 			ProcessInstance subProcessInstance = rootToken.getSubProcessInstance();
  | 		    assertSame(subProcessDefinition, subProcessInstance.getProcessDefinition());
  | 		    Token subToken = subProcessInstance.getRootToken();
  | 
  | 
  | 			 // Move the process instance to the task
  | 		    subToken.signal();
  | 			assertEquals(
  | 					"end_sub",
  | 					subToken.getNode().getName());
  | 
  | 		    
  | 		}
  | 		  
  | 		  public static class SwimlaneAssignmentHandler implements AssignmentHandler {
  | 
  | 			  Logger log = Logger.getLogger(ResponsibleSwimlaneAssignmentHandler.class);
  | 			  
  | 			  private static final long serialVersionUID = 1L;
  | 
  | 			  public void assign(Assignable assignable, ExecutionContext executionContext) {
  | 				  
  | 		
  | 			  	  assertNotNull("shouldnt be null", executionContext.getVariable(Constant.ITP_ID_JBPM_CONTEXT_IDENTIFIER));
  | 			  	  String expression = (String)executionContext.getVariable(Constant.ASSIGNMENT_RESPONSIBLE_EXPRESSION_JBPM_CONTEXT_IDENTIFIER);
  | 			  	  assertNotNull( "shouldnt be null", expression );
  | 				  
  | 			  	  assignable.setPooledActors( expression );
  | 			  }
  | 		  }
  | 		  
  | 		  
  | 		  public static class ActivityForkActionHandler  implements ActionHandler, Constant {
  | 
  | 				Logger log = Logger.getLogger( ActivityForkActionHandler.class );
  | 			   
  | 				
  | 				/**
  | 			     * Create a new child token for each item in list.
  | 			     *
  | 			     * @param executionContext
  | 			     * @throws Exception
  | 			     */
  | 			    @SuppressWarnings("unchecked")
  | 				public void execute(final ExecutionContext executionContext) throws Exception {
  | 
  | 			    	log.debug("execute");
  | 			    	long id =Long.valueOf( executionContext.getContextInstance().getVariable(ITP_ID_JBPM_CONTEXT_IDENTIFIER).toString() );	    	
  | 			    	log.debug("execute itp d:" + id);
  | 			    	
  | 			    	Collection<ITPItem> activities = getActivities( id );
  | 
  | 			    	if( activities != null ){
  | 				        final Token rootToken = executionContext.getToken();
  | 				        final Node node = executionContext.getNode();
  | 				        log.debug( "node name:" + node.getName() );
  | 				        log.debug( "node getDescription:" + node.getDescription() );
  | 				        log.debug( "node getDefaultLeavingTransition:" + node.getDefaultLeavingTransition().getName() );
  | 				        final Transition transition = (Transition) node.getLeavingTransitions().get(0); //TODO must work out which transition to use
  | 				        
  | 				        log.debug( "transition name:" + transition.getName() );
  | 				        
  | 				        Collection<ExecutionContext> newContextList = new ArrayList<ExecutionContext>();
  | 				        
  | 		                //newExecutionContext.getContextInstance().createVariable(as, item, newToken);
  | 				        //
  | 				        
  | 				        for (Iterator iterator = activities.iterator(); iterator.hasNext();) {
  | 						
  | 				        	ITPItem item = (ITPItem) iterator.next();
  | 							log.debug( "item id:" + item.getId() );
  | 							
  | 							final Token newToken = new Token(rootToken, "ITP" + item.getId()); //TODO -lp		        	
  | 					        newToken.setTerminationImplicit(true);
  | 			                executionContext.getJbpmContext().getSession().save(newToken);
  | 			                final ExecutionContext newExecutionContext = new ExecutionContext(newToken);
  | 			                newExecutionContext.getContextInstance().createVariable( 
  | 			                		ASSIGNMENT_RESPONSIBLE_EXPRESSION_JBPM_CONTEXT_IDENTIFIER, 
  | 			                		item.getResponsibleExpression(),
  | 			                		newToken);
  | 			                log.debug("execute getVariable:" + newExecutionContext.getVariable(ASSIGNMENT_RESPONSIBLE_EXPRESSION_JBPM_CONTEXT_IDENTIFIER));
  | 							
  | 			                newContextList.add(newExecutionContext);
  | 				        }
  | 				        
  | 				        // Now, let each new token leave the node.
  | 				        //
  | 						for (Iterator<ExecutionContext> iterator = newContextList.iterator(); iterator.hasNext();) {
  | 							ExecutionContext context = iterator.next();
  | 					        //go via transition
  | 				            node.leave(context, transition);
  | 							
  | 						}
  | 			    	}
  | 			    	
  | 			    	log.debug("leaving node" );
  | 			    	executionContext.leaveNode();
  | 			    }
  | 
  | 			    /**
  | 			     * TODO the test version needs to be mocked somehow
  | 			     * @param id
  | 			     * @return
  | 			     */
  | 			    public Collection<ITPItem> getActivities( long id) {
  | 				
  | 				log.trace("getActivities");
  | 				Collection<ITPItem> items = new ArrayList<ITPItem>();
  | 				
  | 				ITPItem itp1 = new ITPItem();
  | 				itp1.setId(1);
  | 				itp1.setResponsibleExpression("hello1");
  | 				ITPItem itp2 = new ITPItem();
  | 				itp2.setId(2);
  | 				itp2.setResponsibleExpression("hello2");
  | 				ITPItem itp3 = new ITPItem();
  | 				itp3.setId(3);
  | 				itp3.setResponsibleExpression("hello3");
  | 				
  | 				items.add(itp1);
  | 				items.add(itp2);
  | 				items.add(itp3);
  | 				return items;
  | 
  | 				}
  | 		  }
  | 	}
  | 


-lp

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

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



More information about the jboss-user mailing list