/* * Copyright 2012 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; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.StringReader; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.jbpm.services.task.exception.CannotAddTaskException; import org.jbpm.services.task.exception.PermissionDeniedException; import org.jbpm.services.task.impl.factories.TaskFactory; import org.jbpm.services.task.internals.rule.AssignmentService; import org.jbpm.services.task.rule.RuleContextProvider; import org.jbpm.services.task.rule.TaskRuleService; import org.jbpm.services.task.rule.impl.RuleContextProviderImpl; import org.jbpm.services.task.utils.ContentMarshallerHelper; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.kie.api.io.Resource; import org.kie.api.io.ResourceType; 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.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.io.ResourceFactory; import org.kie.internal.task.api.InternalTaskService; import org.kie.internal.task.api.model.ContentData; import bitronix.tm.resource.jdbc.PoolingDataSource; public class LifeCycleLocalWithRuleServiceTest extends HumanTaskServicesBaseTest { private PoolingDataSource pds; private EntityManagerFactory emf; @BeforeClass public static void setupOnce() { RuleContextProvider ruleContextProvider = RuleContextProviderImpl.get(); Map<String, Object> addTaskGlobals = ruleContextProvider.getGlobals(TaskRuleService.ADD_TASK_SCOPE); if (addTaskGlobals == null) { addTaskGlobals = new HashMap<String, Object>(); addTaskGlobals.put("assignmentService", new AssignmentService()); ruleContextProvider.addGlobals(TaskRuleService.ADD_TASK_SCOPE, addTaskGlobals); } try { Resource addTask = ResourceFactory.newClassPathResource("simple-add-task-rules.drl"); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(addTask, ResourceType.DRL); ruleContextProvider.addKieBase(TaskRuleService.ADD_TASK_SCOPE, kbuilder.newKnowledgeBase()); } catch (Exception e) { } try { Resource completeTask = ResourceFactory.newClassPathResource("simple-complete-task-rules.drl"); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(completeTask, ResourceType.DRL); ruleContextProvider.addKieBase(TaskRuleService.COMPLETE_TASK_SCOPE, kbuilder.newKnowledgeBase()); } catch (Exception e) { } } @AfterClass public static void clear() { RuleContextProvider ruleContextProvider = RuleContextProviderImpl.get(); Map<String, Object> addTaskGlobals = ruleContextProvider.getGlobals(TaskRuleService.ADD_TASK_SCOPE); addTaskGlobals.clear(); ruleContextProvider.addKieBase(TaskRuleService.ADD_TASK_SCOPE, null); ruleContextProvider.addKieBase(TaskRuleService.COMPLETE_TASK_SCOPE, null); } @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() { if (emf != null) { emf.close(); } if (pds != null) { pds.close(); } } @Test public void testCreateTaskWithExcludedActorByRule() { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { workItemId = 1 } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('john')],businessAdministrators = [ new User('Administrator') ], }),"; str += "description = 'This is my description', "; str += "subject = 'This is my subject', "; str += "name = 'This is my task name' })"; Task task = (Task) TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); List<TaskSummary> tasks = taskService.getTasksOwned("john", "en-UK"); assertNotNull(tasks); assertEquals(0, tasks.size()); } @Test public void testCreateTaskWithAutoAssignActorByRule() { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { workItemId = 1 } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('john'), new User('mary'),new User('krisv')],businessAdministrators = [ new User('Administrator') ], }),"; str += "description = 'This is my description', "; str += "subject = 'This is my subject', "; str += "name = 'This is my task name' })"; Task task = (Task) TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); List<TaskSummary> tasks = taskService.getTasksOwned("mary", "en-UK"); assertNotNull(tasks); assertEquals(1, tasks.size()); assertEquals("mary", tasks.get(0).getActualOwnerId()); assertEquals(Status.Reserved, tasks.get(0).getStatus()); } @Test public void testCreateTaskWithDisallowedCreationByRule() { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { workItemId = 1 } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('peter')],businessAdministrators = [ new User('Administrator') ], }),"; str += "descriptions = [ new I18NText( 'en-UK', 'This is my description')], "; str += "subjects = [ new I18NText( 'en-UK', 'This is my subject')], "; str += "names = [ new I18NText( 'en-UK', 'This is my task name')] })"; Task task = (Task) TaskFactory.evalTask(new StringReader(str)); try { taskService.addTask(task, new HashMap<String, Object>()); fail("Task should not be created due to rule violation"); } catch (CannotAddTaskException e) { assertTrue(e.getMessage().indexOf("peter does not work here any more") != -1); } } @Test public void testCreateTaskWithDisallowedCreationBasedOnContentByRule() { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { workItemId = 1 } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('john')],businessAdministrators = [ new User('Administrator') ], }),"; str += "descriptions = [ new I18NText( 'en-UK', 'This is my description')], "; str += "subjects = [ new I18NText( 'en-UK', 'This is my subject')], "; str += "names = [ new I18NText( 'en-UK', 'This is my task name')] })"; Task task = (Task) TaskFactory.evalTask(new StringReader(str)); Map<String, Object> params = new HashMap<String, Object>(); params.put("manager", "John"); try { taskService.addTask(task, params); fail("Task should not be created due to rule violation"); } catch (CannotAddTaskException e) { assertTrue(e.getMessage().indexOf("John (manager) does not work here any more") != -1); } } @Test public void testCreateTaskWithDisallowedCreationBasedOnContentByRuleWithContentData() { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { workItemId = 1 } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('john')],businessAdministrators = [ new User('Administrator') ], }),"; str += "descriptions = [ new I18NText( 'en-UK', 'This is my description')], "; str += "subjects = [ new I18NText( 'en-UK', 'This is my subject')], "; str += "names = [ new I18NText( 'en-UK', 'This is my task name')] })"; Task task = (Task) TaskFactory.evalTask(new StringReader(str)); Map<String, Object> params = new HashMap<String, Object>(); params.put("manager", "John"); ContentData data = ContentMarshallerHelper.marshal(task, params, null); try { taskService.addTask(task, data); fail("Task should not be created due to rule violation"); } catch (CannotAddTaskException e) { assertTrue(e.getMessage().indexOf("John (manager) does not work here any more") != -1); } } @Test public void testCreateTaskWithAssignByServiceByRule() { Properties userGroups = new Properties(); userGroups.setProperty("john", "Crusaders"); userGroups.setProperty("Administrator", "BA"); // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { workItemId = 1 } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [], businessAdministrators = [ new User('Administrator') ], }),"; str += "description = 'This is my description', "; str += "subject = 'This is my subject', "; str += "name = 'This is my task name' })"; Task task = (Task) TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); List<TaskSummary> tasks = taskService.getTasksAssignedAsPotentialOwner("john", "en-UK"); assertNotNull(tasks); assertEquals(1, tasks.size()); assertEquals(Status.Ready, tasks.get(0).getStatus()); } @Test public void testCompleteTaskWithCheckByRule() { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { workItemId = 1 } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('mary')],businessAdministrators = [ new User('Administrator') ], }),"; str += "description = 'This is my description', "; str += "subject = 'This is my subject', "; str += "name = 'This is my task name' })"; Task task = (Task) TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); List<TaskSummary> tasks = taskService.getTasksOwned("mary", "en-UK"); assertNotNull(tasks); assertEquals(1, tasks.size()); long taskId = tasks.get(0).getId(); taskService.start(taskId, "mary"); Map<String, Object> data = new HashMap<String, Object>(); data.put("approved", "false"); try { taskService.complete(taskId, "mary", data); fail("Task should not be created due to rule violation"); } catch (PermissionDeniedException e) { assertTrue(e.getMessage().indexOf("Mary is not allowed to complete task with approved false") != -1); } } }