[jboss-user] [JBoss Seam] - Re: Seam jBPM: use annotation or pages.xml to get next task?

avbentem do-not-reply at jboss.com
Wed Mar 21 11:40:04 EDT 2007


Ok, now that Gavin gave a nice combination of @StartTask and pages.xml, I wonder if something similar could be done using the value returned by @CreateProcess, somehow also forcing @StartTask to be triggered?

Now, how to explain this... In the Todo example we've got:
@CreateProcess(definition = "todo")
  | public void createTodo() { 
  |     // nothing here in fact
  | }
and
<process-definition name="todo">
  |     :
  |     <task-node name="todo">
  |         <task name="todo" description="#{todoList.description}">
  |         <assignment actor-id="#{actor.id}"/>
  |     </task>
  |     :
  | </process-definition>
Above, when createTodo() completes successfully then @CreateProcess somehow tells jBPM that the process is started. Eventually the <task-node> is reached at which point jBPM will create the org.jbpm.taskmgmt.exe.TaskInstance and assign it to the current actor. Next, the task could be started using, for example, Gavin's TaskSelector#selectTask. 

Above, createTodo() does not return a value, so the actor stays at the current page. In my example I do in fact return a value, which gives the actor my page on which I check if the task has been started. To find the single task that I expect, I use something like:
@Name("taskFinder")
  | public class TaskFinder {
  |     @Logger Log log;
  |     @In ProcessInstance processInstance;
  | 
  |     /**
  |      * Convenience method to get the single task from the current process
  |      * instance.
  |      * <p>
  |      * Assumes the process instance holds exactly one task; returns
  |      * <code>null</code> if none or multiple tasks are found.
  |      * 
  |      * @return org.jbpm.taskmgmt.exe.TaskInstance, just like returned by
  |      *         {@link org.jboss.seam.core.TaskInstanceList}, or 
  |      *         <code>null</code> when none or multiple tasks are found.
  |      */
  |     @SuppressWarnings("unchecked")
  |     public TaskInstance getSingleTaskInstance() {
  |         Collection<TaskInstance> taskInstances =
  |             (Collection<TaskInstance>) processInstance.getTaskMgmtInstance()
  |             .getTaskInstances();
  | 
  |         if (taskInstances.size() != 1) {
  |             log.error("Expected single task, found #0", taskInstances.size());
  |             return null;
  |         }
  |         return (TaskInstance)taskInstances.iterator().next();
  |     }
  | }

and

<c:choose>
  |     <c:when test="#{taskInstance == null}">
  |         <p>This task has not yet been started.</p>
  |         <p><s:link action="#{taskSelector.startTask}"
  |             taskInstance="#{taskFinder.singleTaskInstance}"
  |             value="Start now" />.</p>
  |     </c:when>
  |     <c:otherwise>
  |     :

So, though all of this happens AFTER createTodo() completes, for this specific process I know that a single task is created (almost) immediately. I actually even know the name of that task. So I can assume only a single task will be found.

Though the above works for me (well, I guess in some cases I actually would like it to start automatically when needed...), I wonder if this could somehow be implemented without my TaskFinder, for example using pages.xml?

(and errr, yes, in the Todo-list example starting the task would in fact also end it, but just suppose the @EndTask is set on another method so we could show some Todo-task page...)


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

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



More information about the jboss-user mailing list