[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