1 Reply Latest reply on Sep 14, 2009 1:12 PM by Ronald van Kuijk

    Query HistoryService for task assignee and name?

    Latchezar Marinkov Newbie

      I am using jBPM 4.1 and tried to write a unit test that queries the history service using the task assignee and name.
      First i looked at the sources of jBPM and searched for tests that are performing a similar query. Unfortunately the only test related to history task assignee was org.jbpm.test.history.HistoryTaskAssigneeTest shown below and the test didn't use the assignee information to perform the query:

      /*
       * JBoss, Home of Professional Open Source
       * Copyright 2005, JBoss Inc., and individual contributors as indicated
       * by the @authors tag. See the copyright.txt in the distribution for a
       * full listing of individual contributors.
       *
       * This is free software; you can redistribute it and/or modify it
       * under the terms of the GNU Lesser General Public License as
       * published by the Free Software Foundation; either version 2.1 of
       * the License, or (at your option) any later version.
       *
       * This software is distributed in the hope that it will be useful,
       * but WITHOUT ANY WARRANTY; without even the implied warranty of
       * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
       * Lesser General Public License for more details.
       *
       * You should have received a copy of the GNU Lesser General Public
       * License along with this software; if not, write to the Free
       * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
       * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
       */
      package org.jbpm.test.history;
      
      import org.jbpm.api.Execution;
      import org.jbpm.api.history.HistoryActivityInstance;
      import org.jbpm.test.JbpmTestCase;
      
      
      /**
       * @author Tom Baeyens
       */
      public class HistoryTaskAssigneeTest extends JbpmTestCase {
      
       public void testHistoryTaskAssignee() {
       deployJpdlXmlString(
       "<process name='TaskAssignee'>" +
       " <start>" +
       " <transition to='review' />" +
       " </start>" +
       " <task name='review' " +
       " assignee='johndoe'>" +
       " <transition to='wait' />" +
       " </task>" +
       " <state name='wait'/>" +
       "</process>"
       );
      
       executionService.startProcessInstanceByKey("TaskAssignee");
      
       HistoryActivityInstance historyActivityInstance = historyService
       .createHistoryActivityInstanceQuery()
       .uniqueResult();
      
       }
      
      }
      


      The current implementation of the HistoryTaskQuery allows querying using the assignee but not the name of the task. To find out the name for the task i decided to make a HistoryActivityInstanceQuery using the executiondid that will be delivered by the HistoryTaskQuery. To my surprise this didn't work. The HistoryActivityInstanceQuery delivered 3 HistoryActivityInstances instead of 1. So it is not possible to figure out the name of the task that was performed by the assignee. The unit test is shown below:

      package com.cg.wfl.jbpm.examples.wfl_examples.history;
      
      import java.util.List;
      
      import org.jbpm.api.Execution;
      import org.jbpm.api.history.HistoryActivityInstance;
      import org.jbpm.api.history.HistoryTask;
      import org.jbpm.test.JbpmTestCase;
      
      public class HistoryTaskAssigneeTest extends JbpmTestCase {
       public void testHistoryTaskAssignee() {
       deployJpdlXmlString(
       "<process name='TaskAssigneeTest'>" +
       " <start>" +
       " <transition to='a' />" +
       " </start>" +
       " <task name='a' assignee='mary'>" +
       " <transition name='toB' to ='b' />" +
       " </task>" +
       " <task name='b' assignee='alex'>" +
       " <transition name='toC' to ='c' />" +
       " </task>" +
       " <task name='c' assignee='mary'>" +
       " <transition name='toEnd' to ='end' />" +
       " </task>" +
       " <end name='end' />" +
       "</process>"
       );
       Execution execution = executionService.startProcessInstanceByKey("TaskAssigneeTest");
      
       String taskId = taskService.createTaskQuery().uniqueResult().getId();
       taskService.completeTask(taskId);
       taskId = taskService.createTaskQuery().uniqueResult().getId();
       taskService.completeTask(taskId);
       taskId = taskService.createTaskQuery().uniqueResult().getId();
       taskService.completeTask(taskId);
      
       assertNull("execution "+execution.getId()+" should not exist",
       executionService.findExecutionById(execution.getId()));
      
       List<HistoryTask> historyTasks = historyService.createHistoryTaskQuery().
       assignee("mary").list();
       assertEquals(2, historyTasks.size());
      
       historyTasks = historyService.createHistoryTaskQuery().
       assignee("alex").list();
       assertEquals(1, historyTasks.size());
      
       // Try to find out the name of the task for the first task with assignee mary
       String executionId = historyTasks.get(0).getExecutionId();
       List<HistoryActivityInstance> historyActivities = historyService.createHistoryActivityInstanceQuery().
       executionId(executionId).list();
       // The expectation is 1 entry in the list, but the list contains 3 entries
       // It is not possible to link the HistoryTask to the HistoryActivityInstance
       // using the executionId!
       assertEquals(1, historyActivities.size());
       }
      }
      


      I found also the following jira issues that references task history details and hope that the problem with the task name will be also considered.

      https://jira.jboss.org/jira/browse/JBPM-2442

      Any help or comments are welcomed.