@Override public Assignment apply(Task task, TaskContext taskContext, String excludedUser) { UserInfo userInfo = (UserInfo) ((org.jbpm.services.task.commands.TaskContext)taskContext).get(EnvironmentName.TASK_USER_INFO); List<OrganizationalEntity> excluded = (getExcludedEntities(task, userInfo)); // Get the the users from the task's the potential owners, making sure that excluded users are not included List<OrganizationalEntity> potentialOwners = task.getPeopleAssignments().getPotentialOwners().stream() .filter(oe -> oe instanceof User && !excluded.contains(oe) && !oe.getId().equals(excludedUser)) .collect(Collectors.toList()); // Get the users belonging to groups that are potential owners task.getPeopleAssignments().getPotentialOwners().stream().filter(oe -> oe instanceof Group) .forEach(oe -> { Iterator<OrganizationalEntity> groupUsers = userInfo.getMembersForGroup((Group)oe); if (groupUsers != null) { groupUsers.forEachRemaining(user -> { if (user != null && !excluded.contains(user) && !potentialOwners.contains(user) && !user.getId().equals(excludedUser)) { potentialOwners.add(user); } }); } }); logger.debug("Asking the load calculator [{}] for task loads for the users {}",calculator.getIdentifier(),potentialOwners); List<User> users = potentialOwners.stream().map(entityToUser).collect(Collectors.toList()); Collection<UserTaskLoad> loads = calculator.getUserTaskLoads(users, taskContext); UserTaskLoad lightestLoad = loads.stream().min(UserTaskLoad::compareTo).orElse(null); return lightestLoad != null ? new Assignment(lightestLoad.getUser().getId()):null; }
private void initializeTask(Task task){ Status assignedStatus = null; if (task.getPeopleAssignments() != null && task.getPeopleAssignments().getPotentialOwners() != null && task.getPeopleAssignments().getPotentialOwners().size() == 1) { // if there is a single potential owner, assign and set status to Reserved OrganizationalEntity potentialOwner = task.getPeopleAssignments().getPotentialOwners().get(0); // if there is a single potential user owner, assign and set status to Reserved if (potentialOwner instanceof User) { ((InternalTaskData) task.getTaskData()).setActualOwner((User) potentialOwner); assignedStatus = Status.Reserved; } //If there is a group set as potentialOwners, set the status to Ready ?? if (potentialOwner instanceof Group) { assignedStatus = Status.Ready; } } else if (task.getPeopleAssignments() != null && task.getPeopleAssignments().getPotentialOwners() != null && task.getPeopleAssignments().getPotentialOwners().size() > 1) { // multiple potential owners, so set to Ready so one can claim. assignedStatus = Status.Ready; } else { //@TODO: we have no potential owners } if (assignedStatus != null) { ((InternalTaskData) task.getTaskData()).setStatus(assignedStatus); } } }
@SuppressWarnings("unchecked") protected void assignGroups(WorkItem workItem, PeopleAssignments peopleAssignments) { List<OrganizationalEntity> potentialOwners = peopleAssignments.getPotentialOwners(); Object groupIds = adjustParam(workItem.getParameter(GROUP_ID), groupFilter); if (groupIds instanceof Collection) { processPeopleAssignments((Collection<OrganizationalEntity>)groupIds, potentialOwners); } else { processPeopleAssignments((String)groupIds, potentialOwners, false); } }
@SuppressWarnings("unchecked") protected void assignActors(WorkItem workItem, PeopleAssignments peopleAssignments, InternalTaskData taskData) { List<OrganizationalEntity> potentialOwners = peopleAssignments.getPotentialOwners(); Object actorIds = adjustParam(workItem.getParameter(ACTOR_ID), userFilter); if (actorIds instanceof Collection) { processPeopleAssignments((Collection<OrganizationalEntity>)actorIds, potentialOwners); } else { processPeopleAssignments((String)actorIds, potentialOwners, true); } // Set the first user as creator ID??? hmmm might be wrong if (potentialOwners.size() > 0 && taskData.getCreatedBy() == null) { OrganizationalEntity firstPotentialOwner = potentialOwners.get(0); taskData.setCreatedBy((User) firstPotentialOwner); } } @SuppressWarnings("unchecked")
@Test public void testUserOnPotentialOwnersGroups() { List<String> userGroups = new ArrayList<>(); userGroups.add("user"); when(userGroupCallback.getGroupsForUser(USER_ID)).thenReturn(userGroups); List<OrganizationalEntity> potentialOwners = new ArrayList<>(); potentialOwners.add(new GroupImpl("user")); when(peopleAssignments.getPotentialOwners()).thenReturn(potentialOwners); Task commandTask = command.execute(taskContext); assertEquals(task, commandTask); }
protected boolean checkUserPermissions(String userId, Task task, TaskContext context) { List<String> usersGroup = context.getUserGroupCallback().getGroupsForUser(userId); usersGroup.add(userId); if (checkUserPermissions(usersGroup, task.getPeopleAssignments().getPotentialOwners())) { return true; } return checkUserPermissions(usersGroup, task.getPeopleAssignments().getBusinessAdministrators()); }
private void postInit(Object result) { if (result instanceof Task) { Task task = (Task) result; if (task != null && !eagerDisabled) { task.getNames().size(); task.getDescriptions().size(); task.getSubjects().size(); task.getPeopleAssignments().getBusinessAdministrators().size(); task.getPeopleAssignments().getPotentialOwners().size(); ((InternalPeopleAssignments) task.getPeopleAssignments()).getRecipients().size(); ((InternalPeopleAssignments) task.getPeopleAssignments()).getExcludedOwners().size(); ((InternalPeopleAssignments) task.getPeopleAssignments()).getTaskStakeholders().size(); task.getTaskData().getAttachments().size(); task.getTaskData().getComments().size(); ((InternalTask)task).getDeadlines().getStartDeadlines().size(); ((InternalTask)task).getDeadlines().getEndDeadlines().size(); if (((InternalTask)task).getDelegation() != null) { ((InternalTask)task).getDelegation().getDelegates().size(); } } } else if (result instanceof Collection<?>) { ((Collection<?>) result).size(); } }
protected void assertPotentialOwners(Task task, int expectedSize, String... expectedNames) { List<OrganizationalEntity> potentialOwners = task.getPeopleAssignments().getPotentialOwners(); assertThat(potentialOwners).hasSize(expectedSize); if (expectedNames.length > 0) { assertThat(potentialOwners).as("No match for expected potential owner name") .extracting(OrganizationalEntity::getId) .contains(expectedNames); } }
public void assignTask(Task task) { List<OrganizationalEntity> potentialOwners = task.getPeopleAssignments().getPotentialOwners(); potentialOwners.clear(); Group group = TaskModelProvider.getFactory().newGroup(); ((InternalOrganizationalEntity) group).setId("Crusaders"); potentialOwners.add(group); } }
@Override public void afterTaskForwardedEvent(TaskEvent event) { String userId = event.getTaskContext().getUserId(); Task ti = event.getTask(); StringBuilder message = new StringBuilder(); String entitiesAsString = (ti.getPeopleAssignments().getPotentialOwners()).stream().map(oe -> oe.getId()).collect(Collectors.joining(",")); message.append("Forward to [" + entitiesAsString + "]"); TaskEventImpl taskEvent = new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.FORWARDED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId, message.toString()); AuditTaskImpl auditTaskImpl = createAuditTask(ti, event.getEventDate()); auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(getActualOwner(ti)); auditTaskImpl.setLastModificationDate(event.getEventDate()); sendMessage(new AuditTaskData(auditTaskImpl, taskEvent), 4); }
@Test public void testNominateToGroup() { String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { businessAdministrators = [ new User('Darth Vader'), new User('Bobba Fet') ] } ),"; str += "name = 'This is my task name'})"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); List<OrganizationalEntity> potentialGroups = new ArrayList<OrganizationalEntity>(); Group group = TaskModelProvider.getFactory().newGroup(); ((InternalOrganizationalEntity) group).setId("Knights Templer"); potentialGroups.add(group); taskService.nominate(taskId, "Darth Vader", potentialGroups); //shouldn't affect the assignments Task task1 = taskService.getTaskById(taskId); assertTrue(task1.getPeopleAssignments().getPotentialOwners().contains(group)); assertEquals(task1.getTaskData().getStatus(), Status.Ready); }
@Test public void testAssignGroups() { String groupId = "Software Developers, Project Managers"; Task task = TaskModelProvider.getFactory().newTask(); PeopleAssignments peopleAssignments = peopleAssignmentHelper.getNullSafePeopleAssignments(task); WorkItem workItem = new WorkItemImpl(); workItem.setParameter(PeopleAssignmentHelper.GROUP_ID, groupId); peopleAssignmentHelper.assignGroups(workItem, peopleAssignments); OrganizationalEntity organizationalEntity1 = peopleAssignments.getPotentialOwners().get(0); assertTrue(organizationalEntity1 instanceof Group); assertEquals("Software Developers", organizationalEntity1.getId()); OrganizationalEntity organizationalEntity2 = peopleAssignments.getPotentialOwners().get(1); assertTrue(organizationalEntity2 instanceof Group); assertEquals("Project Managers", organizationalEntity2.getId()); }
@Test public void testForwardFromReady() throws Exception { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('Bobba Fet'), new User('Darth Vader') ],businessAdministrators = [ new User('Administrator') ], }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); // Check is Forwarded taskService.forward(taskId, "Darth Vader", "Tony Stark"); Task task2 = taskService.getTaskById(taskId); assertFalse(task2.getPeopleAssignments().getPotentialOwners().contains(createUser("Darth Vader"))); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(createUser("Tony Stark"))); assertNull(task2.getTaskData().getActualOwner()); assertEquals(Status.Ready, task2.getTaskData().getStatus()); }
@Test public void testForwardGroupWithBusinessAdministrator() throws Exception { String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [ new Group('Knights Templer') ], businessAdministrators = [ new User('Administrator') ], }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); final Group group = createGroup("Knights Templer"); Task task1 = taskService.getTaskById(taskId); assertEquals(Status.Ready, task1.getTaskData().getStatus()); System.out.println("task1.getPeopleAssignments().getPotentialOwners() = " + task1.getPeopleAssignments().getPotentialOwners()); assertTrue(task1.getPeopleAssignments().getPotentialOwners().contains(group)); // Check is Delegated try { taskService.forward(taskId, "Administrator", "Tony Stark"); fail("Forward task from Group to a User should fail"); } catch (PermissionDeniedException e) {} Task task2 = taskService.getTaskById(taskId); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(group)); assertNull(task2.getTaskData().getActualOwner()); assertEquals(Status.Ready, task2.getTaskData().getStatus()); }
@Test public void testDelegateFromReady() throws Exception { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('Bobba Fet'), new User('Darth Vader') ],businessAdministrators = [ new User('Administrator') ], }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); // Check is Delegated taskService.delegate(taskId, "Darth Vader", "Tony Stark"); Task task2 = taskService.getTaskById(taskId); User user = createUser("Darth Vader"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); user = createUser("Tony Stark"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); assertEquals("Tony Stark", task2.getTaskData().getActualOwner().getId()); // this was checking for ready, but it should be reserved.. it was an old bug assertEquals(Status.Reserved, task2.getTaskData().getStatus()); }
@Test public void testForwardReadyWithBusinessAdministrator() throws Exception { String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('Bobba Fet'), new User('Darth Vader') ],businessAdministrators = [ new User('Administrator') ], }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); // Ready Task task1 = taskService.getTaskById(taskId); assertEquals(Status.Ready, task1.getTaskData().getStatus()); // Check is Delegated taskService.forward(taskId, "Administrator", "Tony Stark"); Task task2 = taskService.getTaskById(taskId); User user = createUser("Darth Vader"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); user = createUser("Tony Stark"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); assertNull(task2.getTaskData().getActualOwner()); assertEquals(Status.Ready, task2.getTaskData().getStatus()); }
@Test public void testForwardReservedWithBusinessAdministrator() throws Exception { String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('Bobba Fet'), new User('Darth Vader') ],businessAdministrators = [ new User('Administrator') ], }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); // Claim and Reserved taskService.claim(taskId, "Darth Vader"); Task task1 = taskService.getTaskById(taskId); assertEquals(Status.Reserved, task1.getTaskData().getStatus()); assertEquals("Darth Vader", task1.getTaskData().getActualOwner().getId()); // Check is Delegated taskService.forward(taskId, "Administrator", "Tony Stark"); Task task2 = taskService.getTaskById(taskId); User user = createUser("Darth Vader"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); user = createUser("Tony Stark"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); assertNull(task2.getTaskData().getActualOwner()); assertEquals(Status.Ready, task2.getTaskData().getStatus()); }
@Test public void testForwardFromReserved() throws Exception { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('Bobba Fet'), new User('Darth Vader') ],businessAdministrators = [ new User('Administrator') ], }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); // Claim and Reserved taskService.claim(taskId, "Darth Vader"); Task task1 = taskService.getTaskById(taskId); assertEquals(Status.Reserved, task1.getTaskData().getStatus()); assertEquals("Darth Vader", task1.getTaskData().getActualOwner().getId()); // Check is Delegated taskService.forward(taskId, "Darth Vader", "Tony Stark"); Task task2 = taskService.getTaskById(taskId); User user = createUser("Darth Vader"); assertFalse(task2.getPeopleAssignments().getPotentialOwners().contains(user)); user = createUser("Tony Stark"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); assertNull(task2.getTaskData().getActualOwner()); assertEquals(Status.Ready, task2.getTaskData().getStatus()); }
@Test public void testDelegateFromReserved() throws Exception { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new User('Bobba Fet'), new User('Darth Vader') ],businessAdministrators = [ new User('Administrator') ], }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); // Claim and Reserved taskService.claim(taskId, "Darth Vader"); Task task1 = taskService.getTaskById(taskId); assertEquals(Status.Reserved, task1.getTaskData().getStatus()); assertEquals("Darth Vader", task1.getTaskData().getActualOwner().getId()); // Check is Delegated taskService.delegate(taskId, "Darth Vader", "Tony Stark"); Task task2 = taskService.getTaskById(taskId); User user = createUser("Darth Vader"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); user = createUser("Tony Stark"); assertTrue(task2.getPeopleAssignments().getPotentialOwners().contains(user)); assertEquals("Tony Stark", task2.getTaskData().getActualOwner().getId()); assertEquals(Status.Reserved, task2.getTaskData().getStatus()); }
@Test public void testCompleteWithRestrictedGroups() { // One potential owner, should go straight to state Reserved String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), "; str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [new Group('analyst'), new Group('Crusaders') ],businessAdministrators = [ new User('Administrator') ], }),"; str += "name = 'This is my task name' })"; Task task = TaskFactory.evalTask(new StringReader(str)); taskService.addTask(task, new HashMap<String, Object>()); long taskId = task.getId(); List<OrganizationalEntity> potOwners = task.getPeopleAssignments().getPotentialOwners(); assertNotNull(potOwners); assertEquals(1, potOwners.size()); assertEquals("Crusaders", potOwners.get(0).getId()); // Go straight from Ready to Inprogress taskService.start(taskId, "Darth Vader"); Task task1 = taskService.getTaskById(taskId); assertEquals(Status.InProgress, task1.getTaskData().getStatus()); assertEquals("Darth Vader", task1.getTaskData().getActualOwner().getId()); // Check is Complete taskService.complete(taskId, "Darth Vader", null); Task task2 = taskService.getTaskById(taskId); assertEquals(Status.Completed, task2.getTaskData().getStatus()); assertEquals("Darth Vader", task2.getTaskData().getActualOwner().getId()); }