2 Replies Latest reply on Mar 27, 2007 8:29 AM by kukeltje

    task node implementation

    tom.baeyens

      i'm thinking about the implementation of the task node. i see 3 options implement how the created task gets inserted into the the database. any comments are appreciated.

      In the first approach, we could just add Task to the pvm package. Process languages should have the ability to ignore that member field. This violates a little bit the language pluggability in the sense that processes that don't use it will have the tasks property. But on the other hand, if we decouple everything, the simple things become quite complex (also for the user) as you can see in the other alternatives below.

      public void execute(Execution execution) throws Exception {
       Task task = createTask(execution);
      
       execution.addTask(task);
      


      In this second approach, we could have a task repository in the context. Pretty modular, but the user is confronted with the task repository in his configuration files. The service could keep track of all the created tasks and inserts them in the db.

      public void execute(Execution execution) throws Exception {
       Task task = createTask(execution);
      
       TaskRepository taskRepository = (TaskRepository) execution.getContext().find("taskRepository");
       taskRepository.addTask(task);
      


      // OR //

      Assume the execution implements a kind of TaskExecution interface. In that case, the process languages that want to make use of tasks, can make sure that their Execution will implement that interface. The concrete execution class can have a member field called tasks that will be persisted with JPA in cascading mode.

      One of the advantages here is that in testing, you don't require a context to be set up.

      public void execute(Execution execution) throws Exception {
       Task task = createTask(execution);
      
       if (! (execution instanceof TaskExecution)) {
       throw new JbpmException("couldn't add task because execution doesn't implement TaskExecution");
       }
       TaskExecution taskExecution = (TaskExecution) execution;
       taskExecution.addTask(task);
      



      a last approach might be to have a kind of generic extensions mechanism in the execution (just like we have the modules now with ModuleInstance). It could be a hashmap that stores any runtime information keyed by name.

      public void execute(Execution execution) throws Exception {
       Task task = createTask(execution);
      
       TaskExtension taskExtension = (TaskExtension)execution.getExtension(Task.EXTENSIONKEY_TASK);
       taskExtension.addTask(task);
      





        • 1. Re: task node implementation
          dmlloyd

           

          "tom.baeyens@jboss.com" wrote:
          In the first approach, we could just add Task to the pvm package. Process languages should have the ability to ignore that member field.


          I like this approach best. If users don't want to use tasks, they can just ignore the property with no harmful effects. This is better than going back to a modular system in my opinion, and for users who do want tasks in their process language, it will be far easier on them.

          • 2. Re: task node implementation
            kukeltje

            I agree with David and as I read it correctly, Tom favors the first solution as well