/* * Copyright (c) 2010-2016 Evolveum * * 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 com.evolveum.midpoint.wf.impl.policy.other; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.wf.impl.activiti.ActivitiEngine; import com.evolveum.midpoint.wf.impl.policy.AbstractWfTestPolicy; import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemType; import org.activiti.engine.TaskService; import org.activiti.engine.task.IdentityLink; import org.activiti.engine.task.TaskQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.List; import static org.testng.AssertJUnit.*; /** * @author mederly */ @ContextConfiguration(locations = {"classpath:ctx-workflow-test-main.xml"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) public class TestActivitiQuery extends AbstractWfTestPolicy { protected static final Trace LOGGER = TraceManager.getTrace(TestActivitiQuery.class); @Override protected PrismObject<UserType> getDefaultActor() { return userAdministrator; } @Autowired private ActivitiEngine activitiEngine; @Test public void test100SearchByMoreAssignees() throws Exception { final String TEST_NAME = "test100SearchByMoreAssignees"; TestUtil.displayTestTile(this, TEST_NAME); login(userAdministrator); Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); assignRole(userJackOid, roleRole1aOid, task, result); // should start approval process assertNotAssignedRole(userJackOid, roleRole1aOid, task, result); { SearchResultList<WorkItemType> itemsAll = modelService.searchContainers(WorkItemType.class, null, null, task, result); assertEquals("Wrong # of total work items", 1, itemsAll.size()); } { ObjectQuery query2 = QueryBuilder.queryFor(WorkItemType.class, prismContext) .item(WorkItemType.F_ASSIGNEE_REF).ref(userLead1Oid) .build(); SearchResultList<WorkItemType> items2 = modelService.searchContainers(WorkItemType.class, query2, null, task, result); assertEquals("Wrong # of work items found using single-assignee query", 1, items2.size()); } { List<PrismReferenceValue> refs = new ArrayList<>(); refs.add(prv("oid-number-1")); refs.add(prv(userLead1Oid)); refs.add(prv("oid-number-3")); ObjectQuery query3 = QueryBuilder.queryFor(WorkItemType.class, prismContext) .item(WorkItemType.F_ASSIGNEE_REF).ref(refs) .build(); SearchResultList<WorkItemType> items3 = modelService .searchContainers(WorkItemType.class, query3, null, task, result); assertEquals("Wrong # of work items found using multi-assignee query", 1, items3.size()); } } /** * Actually, this mechanism is not used anymore. We use identity links to store information about assignees. * But keeping this test - just in case something like that would be needed later. */ @Test public void test200TestQueryByTaskVariable() throws Exception { final String TEST_NAME = "test200TestQueryByTaskVariable"; TestUtil.displayTestTile(this, TEST_NAME); login(userAdministrator); TaskService taskService = activitiEngine.getTaskService(); TaskQuery tq = taskService.createTaskQuery(); org.activiti.engine.task.Task task = tq.singleResult(); System.out.println("Task = " + task); assertNotNull("No task", task); final String TASK_NAME = "Approve assigning Role1a to jack"; final String VAR = "someVariable"; taskService.setVariableLocal(task.getId(), VAR, "[:abc];[:def];[UserType:"+userLead1Oid+"]"); TaskQuery tq1 = taskService.createTaskQuery().includeTaskLocalVariables() .taskVariableValueLike(VAR, "%:def]%") .taskName(TASK_NAME); assertFound(tq1, "#1"); TaskQuery tq2 = taskService.createTaskQuery().includeTaskLocalVariables().taskVariableValueLike(VAR, "%:xyz]%"); org.activiti.engine.task.Task task2 = tq2.singleResult(); System.out.println("Task2 = " + task2); assertNull("Found task2 even if it shouldn't", task2); TaskQuery tq3 = taskService.createTaskQuery().includeTaskLocalVariables() .taskName(TASK_NAME) .or() .taskVariableValueLike(VAR, "%:ghi]%") .taskVariableValueLike(VAR, "%:xxx]%") .taskVariableValueLike(VAR, "%:"+userLead1Oid+"]%") .endOr(); org.activiti.engine.task.Task task3 = tq3.singleResult(); System.out.println("Task3 = " + task3); assertNotNull("No task3", task3); TaskQuery tq4 = taskService.createTaskQuery().includeTaskLocalVariables() .taskName(TASK_NAME) .or() .taskVariableValueLike(VAR, "%:"+userLead1Oid+"]%") .taskVariableValueLike(VAR, "%:xxx]%") .taskAssignee(userLead1Oid) .endOr(); org.activiti.engine.task.Task task4 = tq4.singleResult(); System.out.println("Task4 = " + task4); assertNotNull("No task4", task4); TaskQuery tq5 = taskService.createTaskQuery().includeTaskLocalVariables() .taskName(TASK_NAME) .or() .taskVariableValueLike(VAR, "%:"+userLead1Oid+"]%") .taskVariableValueLike(VAR, "%:xxx]%") .taskAssignee("xxx;" + userLead1Oid) .endOr(); org.activiti.engine.task.Task task5 = tq5.singleResult(); System.out.println("Task5 = " + task5); assertNotNull("No task5", task5); TaskQuery tq6 = taskService.createTaskQuery().includeTaskLocalVariables() .taskName(TASK_NAME) .or() .taskVariableValueLike(VAR, "%:xxx]%") .taskVariableValueLike(VAR, "%:"+userLead1Oid+"]%") .taskAssignee("xxx;yyy") .endOr(); org.activiti.engine.task.Task task6 = tq6.singleResult(); System.out.println("Task6 = " + task6); assertNotNull("No task6", task6); TaskQuery tq7 = taskService.createTaskQuery().includeTaskLocalVariables() .taskName(TASK_NAME) .or() .taskVariableValueLike(VAR, "%:xxx]%") .taskVariableValueLike(VAR, "%:yyy]%") .taskAssignee("xxx;UserType:" + userLead1Oid) .endOr(); org.activiti.engine.task.Task task7 = tq7.singleResult(); System.out.println("Task7 = " + task7); assertNotNull("No task7", task7); } @Test public void test210TestQueryByIdentityLink() throws Exception { final String TEST_NAME = "test210TestQueryByIdentityLink"; TestUtil.displayTestTile(this, TEST_NAME); login(userAdministrator); TaskService taskService = activitiEngine.getTaskService(); TaskQuery tq = taskService.createTaskQuery(); org.activiti.engine.task.Task task = tq.singleResult(); System.out.println("Task = " + task); assertNotNull("No task", task); final String TASK_NAME = "Approve assigning Role1a to jack"; List<IdentityLink> linksBefore = taskService.getIdentityLinksForTask(task.getId()); System.out.println("Identity links (before)" + linksBefore); taskService.addUserIdentityLink(task.getId(), "123", CommonProcessVariableNames.MIDPOINT_ASSIGNEE); taskService.addUserIdentityLink(task.getId(), "456", CommonProcessVariableNames.MIDPOINT_ASSIGNEE); List<IdentityLink> linksAfter = taskService.getIdentityLinksForTask(task.getId()); System.out.println("Identity links (after)" + linksAfter); TaskQuery tq1 = taskService.createTaskQuery() .taskInvolvedUser("UserType:"+userLead1Oid) .taskName(TASK_NAME); assertFound(tq1, "involved user (assignee)"); assertFound(taskService.createTaskQuery() .taskInvolvedUser("123") .taskName(TASK_NAME), "involved user (midpoint-assignee 123)"); assertFound(taskService.createTaskQuery() .taskInvolvedUser("456") .taskName(TASK_NAME), "involved user (midpoint-assignee 456)"); assertNotFound(taskService.createTaskQuery() .taskInvolvedUser("123xxx") .taskName(TASK_NAME), "involved user (wrong user)"); assertFound(taskService.createTaskQuery() .taskInvolvedUser("123;124") .taskName(TASK_NAME), "involved user (123 or 124)"); assertFound(taskService.createTaskQuery() .taskInvolvedUser("124;123") .taskName(TASK_NAME), "involved user (124 or 123)"); assertNotFound(taskService.createTaskQuery() .taskInvolvedUser("124x;123x") .taskName(TASK_NAME), "involved user (124x or 123x)"); assertFound(taskService.createTaskQuery() .or() .taskInvolvedUser("123") .taskCandidateGroup("xxxxxxx") .endOr() .taskName(TASK_NAME), "involved user (123 or candidate group xxxxxxx)"); assertFound(taskService.createTaskQuery() .or() .taskInvolvedUser("123;124") .taskCandidateGroup("xxxxxxx") .endOr() .taskName(TASK_NAME), "involved user (123 or 124 or candidate group xxxxxxx)"); assertNotFound(taskService.createTaskQuery() .or() .taskInvolvedUser("123x;124x") .taskCandidateGroup("xxxxxxx") .endOr() .taskName(TASK_NAME), "involved user (123x or 124x or candidate group xxxxxxx)"); } private void assertFound(TaskQuery tq1, String desc) { LOGGER.trace("Executing query {}", desc); org.activiti.engine.task.Task task1 = tq1.singleResult(); System.out.println("Task for " + desc + ": " + task1); assertNotNull("No task for " + desc, task1); } private void assertNotFound(TaskQuery tq1, String desc) { LOGGER.trace("Executing query {}", desc); org.activiti.engine.task.Task task1 = tq1.singleResult(); System.out.println("Task for " + desc + ": " + task1); assertNull("Found task for " + desc + " even if there shouldn't be one", task1); } @Test public void test300SearchByAssignee() throws Exception { final String TEST_NAME = "test210SearchByAssignee"; TestUtil.displayTestTile(this, TEST_NAME); login(userAdministrator); Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); List<PrismReferenceValue> assigneeRefs = new ArrayList<>(); assigneeRefs.add(prv("oid-number-1")); assigneeRefs.add(prv(userLead1Oid)); assigneeRefs.add(prv("oid-number-3")); assigneeRefs.add(prv("oid-number-4")); assigneeRefs.add(prv("oid-number-5")); assigneeRefs.add(prv("oid-number-6")); ObjectQuery query = QueryBuilder.queryFor(WorkItemType.class, prismContext) .item(WorkItemType.F_ASSIGNEE_REF).ref(assigneeRefs) .build(); SearchResultList<WorkItemType> items = modelService .searchContainers(WorkItemType.class, query, null, task, result); assertEquals("Wrong # of work items found using multi-assignee/multi-delegate query", 1, items.size()); } }