/** * Copyright 2013 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.jbpm.services.task.query; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.jbpm.services.task.HumanTaskServiceFactory; import org.jbpm.services.task.HumanTaskServicesBaseTest; import org.jbpm.services.task.impl.factories.TaskFactory; import org.jbpm.services.task.impl.model.TaskImpl; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.kie.api.task.model.Status; import org.kie.api.task.model.Task; import org.kie.api.task.model.TaskSummary; import org.kie.internal.query.QueryParameterIdentifiers; import org.kie.internal.task.api.InternalTaskService; import org.kie.internal.task.api.model.InternalTaskData; import org.kie.internal.task.query.TaskSummaryQueryBuilder; import org.kie.internal.task.query.TaskSummaryQueryBuilder.OrderBy; import bitronix.tm.resource.jdbc.PoolingDataSource; @SuppressWarnings("deprecation") public class TaskQueryBuilderLocalTest extends HumanTaskServicesBaseTest { private PoolingDataSource pds; private EntityManagerFactory emf; @Before public void setup() { pds = setupPoolingDataSource(); emf = Persistence.createEntityManagerFactory( "org.jbpm.services.task" ); this.taskService = (InternalTaskService) HumanTaskServiceFactory.newTaskServiceConfigurator() .entityManagerFactory(emf) .getTaskService(); } @After public void clean() { super.tearDown(); if (emf != null) { emf.close(); } if (pds != null) { pds.close(); } } private static final String stakeHolder = "vampire"; private TaskImpl addTask( long workItemId, long procInstId, String busAdmin, String potOwner, String name, String deploymentId) { String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { " + "taskStakeholders = [new User('" + stakeHolder + "')]," + "businessAdministrators = [new User('" + busAdmin + "')]," + "potentialOwners = [new User('" + potOwner + "')]" + " }),"; str += "name = '" + name + "' })"; Task taskImpl = TaskFactory.evalTask(new StringReader(str)); ((InternalTaskData) taskImpl.getTaskData()).setWorkItemId(workItemId); ((InternalTaskData) taskImpl.getTaskData()).setProcessInstanceId(procInstId); ((InternalTaskData) taskImpl.getTaskData()).setDeploymentId(deploymentId); taskService.addTask(taskImpl, new HashMap<String, Object>()); assertNotNull( "Null task id", taskImpl.getId()); return (TaskImpl) taskImpl; } private long[] getUnboxedArray(List<Long> list) { return list.stream().mapToLong(Long::longValue).toArray(); } @Test public void testTaskQueryBuilderSimply() { TaskSummaryQueryBuilder queryBuilder = taskService.taskSummaryQuery(stakeHolder); queryBuilder.build().getResultList(); } @Test public void testGetTasksByVariousFields() { Task [] tasks = new Task[12]; List<Long> workItemIds = new ArrayList<Long>(); List<Long> procInstIds = new ArrayList<Long>(); List<Long> taskIds = new ArrayList<Long>(); List<String> busAdmins = new ArrayList<String>(); List<String> potOwners = new ArrayList<String>(); List<Status> statuses = new ArrayList<Status>(); statuses.add(Status.Reserved); TaskImpl taskImpl; Long firstTaskId; { long workItemId = 23; long procInstId = 101; String busAdmin = "Wintermute"; String potOwner = "Maelcum"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, "This is my task name", null); firstTaskId = taskImpl.getId(); taskIds.add(firstTaskId); assertEquals( potOwner, taskImpl.getTaskData().getActualOwner().getId() ); tasks[0] = taskImpl; procInstIds.add(procInstId); workItemIds.add(workItemId); busAdmins.add(busAdmin); potOwners.add(potOwner); } List<TaskSummary> results = taskService.taskSummaryQuery(stakeHolder).build().getResultList(); assertFalse("No tasks retrieved!", results.isEmpty()); results = taskService.taskSummaryQuery(stakeHolder).workItemId(getUnboxedArray(workItemIds)).build().getResultList(); assertEquals("List of tasks: work item id", 1, results.size()); { long workItemId = 25; long procInstId = 103; String busAdmin = "Neuromancer"; String potOwner = "Hideo"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, "This is my task name", null); taskIds.add(taskImpl.getId()); assertEquals( potOwner, taskImpl.getTaskData().getActualOwner().getId() ); // start task taskService.start(taskImpl.getId(), potOwner); tasks[1] = (Task) taskService.getTaskById(taskImpl.getId()); statuses.add(tasks[1].getTaskData().getStatus()); procInstIds.add(procInstId); workItemIds.add(workItemId); busAdmins.add(busAdmin); potOwners.add(potOwner); } { // Add one more task, just to make sure things are working well long workItemId = 57; long procInstId = 111; String busAdmin = "reviewer"; String potOwner = "translator"; String deploymentId = "armitage"; String name = "Koude Bevel"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, name, deploymentId); assertEquals( potOwner, taskImpl.getTaskData().getActualOwner().getId() ); taskService.start(taskImpl.getId(), potOwner); taskService.fail(taskImpl.getId(), busAdmin, null); } // everything results = taskService.taskSummaryQuery(stakeHolder).build().getResultList(); assertEquals("List of tasks: everything", 3, results.size()); testOrderByTaskIdAscending(results); // max results results = taskService.taskSummaryQuery(stakeHolder).maxResults(2).build().getResultList(); assertEquals("List of tasks: max results", 2, results.size()); testOrderByTaskIdAscending(results); assertEquals( "Did not order when returning tasks (first task id: " + results.get(0).getId(), firstTaskId.longValue(), results.get(0).getId().longValue()); // single param tests results = taskService.taskSummaryQuery(stakeHolder).workItemId(getUnboxedArray(workItemIds)).build().getResultList(); assertEquals("List of tasks: work item ids", 2, results.size()); testOrderByTaskIdAscending(results); results = taskService.taskSummaryQuery(stakeHolder).taskId(getUnboxedArray(taskIds)).build().getResultList(); assertEquals("List of tasks: task ids", 2, results.size()); testOrderByTaskIdAscending(results); results = taskService.taskSummaryQuery(stakeHolder).processInstanceId(getUnboxedArray(procInstIds)).build().getResultList(); assertEquals("List of tasks: process instance ids", 2, results.size()); testOrderByTaskIdAscending(results); results = taskService.taskSummaryQuery(stakeHolder).businessAdmin(busAdmins.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks: bus admins", 2, results.size()); testOrderByTaskIdAscending(results); results = taskService.taskSummaryQuery(stakeHolder).potentialOwner(potOwners.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks: pot owners", 2, results.size()); testOrderByTaskIdAscending(results); results = taskService.taskSummaryQuery(stakeHolder).actualOwner(potOwners.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks: task owners", 2, results.size()); testOrderByTaskIdAscending(results); results = taskService.taskSummaryQuery(stakeHolder).status(statuses.toArray(new Status[0])).build().getResultList(); assertEquals("List of tasks: status", 2, results.size()); testOrderByTaskIdAscending(results); // work item id and/or task id List<Long> testLongList = new ArrayList<Long>(); testLongList.add(workItemIds.get(0)); List<Long> testLongListTwo = new ArrayList<Long>(); testLongListTwo.add(taskIds.get(1)); results = taskService.taskSummaryQuery(stakeHolder).and().workItemId(getUnboxedArray(testLongList)).taskId(getUnboxedArray(testLongListTwo)).build().getResultList(); assertEquals("List of tasks", 0, results.size()); results = taskService.taskSummaryQuery(stakeHolder).or().workItemId(getUnboxedArray(testLongList)).taskId(getUnboxedArray(testLongListTwo)).build().getResultList(); assertEquals("List of tasks", 2, results.size()); testOrderByTaskIdAscending(results); // task id and/or process instance id testLongList.clear(); testLongList.add(procInstIds.get(1)); results = taskService.taskSummaryQuery(stakeHolder).or().taskId(getUnboxedArray(testLongListTwo)).processInstanceId(getUnboxedArray(testLongList)).build().getResultList(); assertEquals("List of tasks", 1, results.size()); testOrderByTaskIdAscending(results); results = taskService.taskSummaryQuery(stakeHolder).and().taskId(getUnboxedArray(testLongListTwo)).processInstanceId(getUnboxedArray(testLongList)).build().getResultList(); assertEquals("List of tasks", 1, results.size()); testOrderByTaskIdAscending(results); // process instance id and/or bus admin List<String> testStringList = new ArrayList<String>(); testStringList.add(busAdmins.get(0)); results = taskService.taskSummaryQuery(stakeHolder).and().processInstanceId(getUnboxedArray(testLongList)).businessAdmin(testStringList.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks", 0, results.size()); results = taskService.taskSummaryQuery(stakeHolder).or().processInstanceId(getUnboxedArray(testLongList)).businessAdmin(testStringList.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks", 2, results.size()); testOrderByTaskIdAscending(results); // bus admin and/or pot owner testStringList.clear(); testStringList.add(busAdmins.get(1)); List<String> testStringListTwo = new ArrayList<String>(); testStringListTwo.add(potOwners.get(0)); results = taskService.taskSummaryQuery(stakeHolder).and().businessAdmin(testStringList.toArray(new String[0])).potentialOwner(testStringListTwo.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks", 0, results.size()); results = taskService.taskSummaryQuery(stakeHolder).or().businessAdmin(testStringList.toArray(new String[0])).potentialOwner(testStringListTwo.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks", 2, results.size()); testOrderByTaskIdAscending(results); // pot owner and/or task owner testStringList.clear(); testStringList.add(tasks[1].getTaskData().getActualOwner().getId()); results = taskService.taskSummaryQuery(stakeHolder).and().potentialOwner(testStringListTwo.toArray(new String[0])).actualOwner(testStringList.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks", 0, results.size()); results = taskService.taskSummaryQuery(stakeHolder).or().potentialOwner(testStringListTwo.toArray(new String[0])).actualOwner(testStringList.toArray(new String[0])).build().getResultList(); assertEquals("List of tasks", 2, results.size()); testOrderByTaskIdAscending(results); // task owner and/or status List<Status> testStatusList = new ArrayList<Status>(); testStatusList.add(statuses.get(0)); results = taskService.taskSummaryQuery(stakeHolder).and().actualOwner(testStringList.toArray(new String[0])).status(testStatusList.toArray(new Status[0])).build().getResultList(); assertEquals("List of tasks", 0, results.size()); results = taskService.taskSummaryQuery(stakeHolder).or().actualOwner(testStringList.toArray(new String[0])).status(testStatusList.toArray(new Status[0])).build().getResultList(); assertEquals("List of tasks", 2, results.size()); testOrderByTaskIdAscending(results); } private void testOrderByTaskIdAscending(List<TaskSummary> results) { for( int i = 1; i < results.size(); ++i ) { assertTrue("Tasks not correctly ordered: " + results.get(0).getId() + " ? " + results.get(1).getId(), results.get(i-1).getId() < results.get(i).getId()); } } @Test public void testGetTasksByVariousFieldsWithUserGroupCallback() { String potOwner = "Bobba Fet"; List<String> potOwners = new ArrayList<String>(); potOwners.add(potOwner); String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { " + "businessAdministrators = [new Group('Administrators')]," + "potentialOwners = [new Group('Crusaders')]" + " }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); ((InternalTaskData) task.getTaskData()).setWorkItemId(1); ((InternalTaskData) task.getTaskData()).setProcessInstanceId(1); taskService.addTask(task, new HashMap<String, Object>()); List<TaskSummary> results = taskService.taskSummaryQuery("Administrator").potentialOwner(potOwner).build().getResultList(); assertNotNull(results); assertEquals(1, results.size()); TaskSummary resultTask = results.get(0); // "Wintermute" does not have the proper permissions results = taskService.taskSummaryQuery("Wintermute").potentialOwner(potOwner).build().getResultList(); assertEquals(0, results.size()); } @Test public void testGetTasksByVariousFieldsWithUserGroupCallbackAdmin() { String potOwner = "Administrator"; List<String> busAdmins = new ArrayList<String>(); busAdmins.add(potOwner); String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { " + "businessAdministrators = [new Group('Administrators')]," + "potentialOwners = [new Group('Crusaders')]" + " }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); ((InternalTaskData) task.getTaskData()).setWorkItemId(1); ((InternalTaskData) task.getTaskData()).setProcessInstanceId(1); taskService.addTask(task, new HashMap<String, Object>()); List<TaskSummary> results = taskService.taskSummaryQuery(potOwner).businessAdmin(busAdmins.toArray(new String[0])).build().getResultList(); assertNotNull(results); assertEquals(1, results.size()); } @Test public void testGetTasksByVariousFieldsWithUserGroupCallbackByParams() { String potOwner = "Bobba Fet"; String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { " + "businessAdministrators = [new Group('Administrators')]," + "potentialOwners = [new Group('Crusaders')]" + " }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); ((InternalTaskData) task.getTaskData()).setWorkItemId(1); ((InternalTaskData) task.getTaskData()).setProcessInstanceId(1); taskService.addTask(task, new HashMap<String, Object>()); List<TaskSummary> results = taskService.taskSummaryQuery("Administrator").potentialOwner(potOwner).build().getResultList(); assertNotNull(results); assertEquals(1, results.size()); } @Test public void testGetTasksByVariousFieldsWithUserGroupCallbackAdminByParams() { String busAdmin = "Administrator"; String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { " + "businessAdministrators = [new Group('Administrators')]," + "potentialOwners = [new Group('Crusaders')]" + " }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); ((InternalTaskData) task.getTaskData()).setWorkItemId(1); ((InternalTaskData) task.getTaskData()).setProcessInstanceId(1); taskService.addTask(task, new HashMap<String, Object>()); List<TaskSummary> results = taskService.taskSummaryQuery("Crusaders").businessAdmin(busAdmin).build().getResultList(); assertNotNull(results); assertEquals(1, results.size()); } @Test public void testTaskQueryBuilder() { Task [] tasks = new Task[12]; List<Long> workItemIds = new ArrayList<Long>(); List<Long> procInstIds = new ArrayList<Long>(); List<Long> taskIds = new ArrayList<Long>(); List<String> busAdmins = new ArrayList<String>(); List<String> potOwners = new ArrayList<String>(); List<Status> statuses = new ArrayList<Status>(); statuses.add(Status.Reserved); TaskImpl taskImpl; Long firstTaskId; { long workItemId = 231; long procInstId = 1011; String busAdmin = "Parzival"; String potOwner = "Art3mis"; String name = "EggHunting"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, name, null); firstTaskId = taskImpl.getId(); taskIds.add(firstTaskId); assertEquals( potOwner, taskImpl.getTaskData().getActualOwner().getId() ); tasks[0] = taskImpl; procInstIds.add(procInstId); workItemIds.add(workItemId); busAdmins.add(busAdmin); potOwners.add(potOwner); // as much as possible TaskSummaryQueryBuilder queryBuilder = taskService.taskSummaryQuery(stakeHolder) .intersect() .workItemId(workItemId) .processInstanceId(procInstId) .businessAdmin(busAdmin) .potentialOwner(potOwner) .taskId(taskImpl.getId()) .ascending(OrderBy.taskId); List<TaskSummary> results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); queryBuilder.clear(); results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); } { long workItemId = 251; long procInstId = 1031; String busAdmin = "Neuromancer"; String potOwner = "Hideo"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, "This is my task name", null); taskIds.add(taskImpl.getId()); assertEquals( potOwner, taskImpl.getTaskData().getActualOwner().getId() ); // start task taskService.start(taskImpl.getId(), potOwner); tasks[1] = (Task) taskService.getTaskById(taskImpl.getId()); statuses.add(tasks[1].getTaskData().getStatus()); procInstIds.add(procInstId); workItemIds.add(workItemId); busAdmins.add(busAdmin); potOwners.add(potOwner); // as much as possible TaskSummaryQueryBuilder queryBuilder = taskService.taskSummaryQuery(stakeHolder) .intersect() .workItemId(workItemId) .processInstanceId(procInstId) .businessAdmin(busAdmin) .potentialOwner(potOwner) .taskId(taskImpl.getId()); List<TaskSummary> results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); queryBuilder.clear(); results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 2, results.size()); queryBuilder.clear(); queryBuilder.workItemId(workItemId); results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); assertEquals("Incorrect task retrieved", tasks[1].getId(), results.get(0).getId() ); queryBuilder.clear(); queryBuilder.processInstanceId(procInstId); results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); assertEquals("Incorrect task retrieved", tasks[1].getId(), results.get(0).getId() ); queryBuilder.clear(); queryBuilder.businessAdmin(busAdmin); results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); assertEquals("Incorrect task retrieved", tasks[1].getId(), results.get(0).getId() ); queryBuilder.clear(); queryBuilder.potentialOwner(potOwner); results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); assertEquals("Incorrect task retrieved", tasks[1].getId(), results.get(0).getId() ); queryBuilder.clear(); queryBuilder.taskId(taskImpl.getId()); results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); assertEquals("Incorrect task retrieved", tasks[1].getId(), results.get(0).getId() ); } { // Add one more task, just to make sure things are working wel long workItemId = 57; long procInstId = 11111; String busAdmin = "reviewer"; String potOwner = "translator"; String deploymentId = "armitage"; String name = "Koude Bevel"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, name, deploymentId); procInstIds.add(procInstId); workItemIds.add(workItemId); busAdmins.add(busAdmin); potOwners.add(potOwner); assertEquals( potOwner, taskImpl.getTaskData().getActualOwner().getId() ); taskService.start(taskImpl.getId(), potOwner); taskService.fail(taskImpl.getId(), busAdmin, null); TaskSummaryQueryBuilder queryBuilder = taskService.taskSummaryQuery(stakeHolder) .maxResults(1); List<TaskSummary> results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); queryBuilder.clear(); results = queryBuilder.build().getResultList(); assertFalse("Empty List of tasks", results.isEmpty() || results.size() == 1); testOrderByTaskIdAscending(results); queryBuilder.clear(); queryBuilder.descending(OrderBy.processInstanceId); results = queryBuilder.build().getResultList(); assertFalse("List of tasks too small", results.isEmpty() || results.size() == 1); for( int i = 1; i < results.size(); ++i ) { Long aVal = results.get(i-1).getProcessInstanceId(); Long bVal = results.get(i).getProcessInstanceId(); assertTrue("Tasks not correctly ordered: " + aVal + " ?>? " + bVal, aVal > bVal); } queryBuilder.offset(results.size()-1).ascending(OrderBy.taskId); results = queryBuilder.build().getResultList(); assertFalse("Empty List of tasks", results.isEmpty()); assertEquals("List of tasks", 1, results.size()); assertEquals("Task id", taskImpl.getId(), results.get(0).getId()); } TaskSummaryQueryBuilder queryBuilder = taskService.taskSummaryQuery(stakeHolder); List<TaskSummary> results = queryBuilder.businessAdmin(busAdmins.toArray(new String[busAdmins.size()])).build().getResultList(); assertEquals( 3, results.size() ); // pagination { // Add two more tasks, in order to have a quorum long workItemId = 59; long procInstId = 12111; String busAdmin = "Wintermute"; String potOwner = "molly"; String deploymentId = "Dixie Flatline"; String name = "Complete Mission"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, name, deploymentId); // Add two more tasks, in order to have a quorum ++workItemId; ++procInstId; busAdmin = "Neuromancer"; potOwner = "case"; deploymentId = "Linda Lee"; name = "Resurrect"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, name, deploymentId); } results = queryBuilder.clear().build().getResultList(); assertTrue("Result list too small to test: " + results.size(), results.size() == 5 ); results = queryBuilder.clear().offset(1).build().getResultList(); assertTrue("Expected 4, not " + results.size() + " results", results.size() == 4 ); results = queryBuilder.clear().offset(1).maxResults(3).build().getResultList(); assertTrue("Expected 3, not " + results.size() + " results", results.size() == 3 ); results = queryBuilder.clear().offset(3).maxResults(3).build().getResultList(); assertTrue("Expected 2, not " + results.size() + " results", results.size() == 2 ); // pot owner (and no "user-group limiting" clause) { // Add two more tasks, in order to have a quorum long workItemId = 104; long procInstId = 1766; String busAdmin = stakeHolder; String potOwner = stakeHolder; String deploymentId = "Louis de Ponte du Lac"; String name = "Interview"; taskImpl = addTask(workItemId, procInstId, busAdmin, potOwner, name, deploymentId); } queryBuilder.clear(); queryBuilder = taskService.taskSummaryQuery(stakeHolder) .intersect() .potentialOwner(stakeHolder); results = queryBuilder.build().getResultList(); assertEquals("List of tasks", 1, results.size()); } }