There may be another bug.
When calling taskInstance.end(), it now throws an exception (great!), but 
unfortunately, that exception does not stop the ending of the task instance. So 
the task instance is indeed considered "ended" anyway, even though you have 
required variables that are missing.

See the end method below, found in TaskInstance. The validation is only done 
when submitVariables() is called, but before that is called, a bunch of work 
has already taken place on the task instance.
/**
  |    * marks this task as done and specifies a transition  
  |    * leaving the task-node for the case that the completion of this 
  |    * task instances triggers a signal on the token.
  |    * If this task leads to a signal on the token, the given transition 
  |    * name will be used in the signal.
  |    * If this task completion does not trigger execution to move on, 
  |    * the transition is ignored.
  |    */
  |   public void end(Transition transition) {
  |     if (this.end!=null){
  |       throw new IllegalStateException("task instance '"+id+"' is already 
ended");
  |     }
  |     if (this.isSuspended) {
  |       throw new JbpmException("task instance '"+id+"' is suspended");
  |     }
  |     
  |     // mark the end of this task instance
  |     this.end = new Date();
  |     this.isOpen = false;
  | 
  |     // fire the task instance end event
  |     if ( (task!=null)
  |          && (token!=null)
  |        ) {
  |       ExecutionContext executionContext = new ExecutionContext(token);
  |       executionContext.setTask(task);
  |       executionContext.setTaskInstance(this);
  |       task.fireEvent(Event.EVENTTYPE_TASK_END, executionContext);
  |     }
  |     
  |     // log this assignment
  |     if (token!=null) {
  |       token.addLog(new TaskEndLog(this));
  |     }
  |     
  |     // submit the variables
  |     submitVariables();
  |     
  |     // verify if the end of this task triggers continuation of execution
  |     if (isSignalling) {
  |       this.isSignalling = false;
  |       
  |       
  |       
  |       if ( this.isStartTaskInstance() // ending start tasks always leads to 
a signal
  |            || ( (task!=null)
  |                 && (token!=null)
  |                 && (task.getTaskNode()!=null)
  |                 && (task.getTaskNode().completionTriggersSignal(this))
  |               )
  |          ) {
  |         
  |         if (transition==null) {
  |           log.debug("completion of task '"+task.getName()+"' results in 
taking the default transition");
  |           token.signal();
  |         } else {
  |           log.debug("completion of task '"+task.getName()+"' results in 
taking transition '"+transition+"'");
  |           token.signal(transition);
  |         }
  |       }
  |     }
  |   }

Am I missing something? Should it work this way? Surely the task instance 
should not "end" if the required variables are not set.
I think I may need to do my own validation in my framework action class by 
calling startTaskInstance.getTask().getTaskController().getVariableAccesses(), 
then implementing my own (similair) validation function on that variable access 
list, and not even bother calling taskInstance.end() if my own validation 
fails. Would you recommend I do it this way?

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

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4084218
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to