Search in sources :

Example 6 with TaskAssigningSolution

use of org.kie.server.services.taskassigning.core.model.TaskAssigningSolution in project droolsjbpm-integration by kiegroup.

the class SolutionProcessorTest method isProcessing.

@Test
public void isProcessing() {
    TaskAssigningSolution solution = new TaskAssigningSolution(-1, new ArrayList<>(), new ArrayList<>());
    runnableBase.process(solution);
    assertTrue(runnableBase.isProcessing());
}
Also used : TaskAssigningSolution(org.kie.server.services.taskassigning.core.model.TaskAssigningSolution) Test(org.junit.Test)

Example 7 with TaskAssigningSolution

use of org.kie.server.services.taskassigning.core.model.TaskAssigningSolution in project droolsjbpm-integration by kiegroup.

the class SolutionSynchronizerTest method executeSynchronizeSolutionWithNoChangesTimeout.

private void executeSynchronizeSolutionWithNoChangesTimeout(CompletableFuture future, LocalDateTime startTime, Duration unchangedPeriodTimeout, List<TaskAssigningRuntimeDelegate.FindTasksResult> tasksQueryResults, int executionsCount) throws Exception {
    TaskAssigningSolution solution = new TaskAssigningSolution(1, new ArrayList<>(), new ArrayList<>());
    queryExecutionsCountDown = new CountDownLatch(executionsCount);
    prepareQueryExecutions(tasksQueryResults);
    when(generatedChanges.isEmpty()).thenReturn(false);
    when(emptyChanges.isEmpty()).thenReturn(true);
    when(solverExecutor.isStarted()).thenReturn(true);
    runnableBase.synchronizeSolution(solution, startTime, unchangedPeriodTimeout);
    // wait for the query executions to happen
    queryExecutionsCountDown.await();
    applyResultCountDown.await();
    verify(resultConsumer).accept(resultCaptor.capture());
    runnableBase.destroy();
    future.get();
    assertTrue(runnableBase.isDestroyed());
}
Also used : TaskAssigningSolution(org.kie.server.services.taskassigning.core.model.TaskAssigningSolution) CountDownLatch(java.util.concurrent.CountDownLatch)

Example 8 with TaskAssigningSolution

use of org.kie.server.services.taskassigning.core.model.TaskAssigningSolution in project droolsjbpm-integration by kiegroup.

the class TaskAssigningGenerator method writeTaskAssigningSolution.

private void writeTaskAssigningSolution(int taskListSize, int userListSize) {
    String fileName = determineFileName(taskListSize, userListSize);
    File outputFile = new File(outputDir, fileName + ".xml");
    TaskAssigningSolution solution = createTaskAssigningSolution(fileName, taskListSize, USER_GROUP_SIZE, userListSize);
    solutionFileIO.write(solution, outputFile);
    logger.info("Saved: {}", outputFile);
}
Also used : TaskAssigningSolution(org.kie.server.services.taskassigning.core.model.TaskAssigningSolution) File(java.io.File)

Example 9 with TaskAssigningSolution

use of org.kie.server.services.taskassigning.core.model.TaskAssigningSolution in project droolsjbpm-integration by kiegroup.

the class TaskAssigningGenerator method createTaskAssigningSolution.

private TaskAssigningSolution createTaskAssigningSolution(String fileName, int taskListSize, int groupListSize, int userListSize) {
    TaskAssigningSolution solution = new TaskAssigningSolution();
    solution.setId(0L);
    List<Group> groupList = createGroupList(groupListSize);
    createUserList(solution, userListSize, groupList);
    createTaskList(solution, taskListSize, groupList);
    BigInteger totalFacts = AbstractSolutionImporter.factorial(taskListSize + userListSize - 1);
    BigInteger fixedFacts = AbstractSolutionImporter.factorial(userListSize - 1);
    BigInteger possibleSolutionSize = (totalFacts == null || fixedFacts == null) ? null : totalFacts.divide(fixedFacts);
    logger.info("TaskAssigningSolution {} has {} tasks, {} groups, and {} users with a search space of {}.", fileName, taskListSize, groupListSize, userListSize, AbstractSolutionImporter.getFlooredPossibleSolutionSize(possibleSolutionSize));
    return solution;
}
Also used : Group(org.kie.server.services.taskassigning.core.model.Group) TaskAssigningSolution(org.kie.server.services.taskassigning.core.model.TaskAssigningSolution) BigInteger(java.math.BigInteger)

Example 10 with TaskAssigningSolution

use of org.kie.server.services.taskassigning.core.model.TaskAssigningSolution in project droolsjbpm-integration by kiegroup.

the class SolutionBuilder method build.

public TaskAssigningSolution build() {
    final List<Task> tasks = new ArrayList<>();
    final Map<String, List<IndexedElement<Task>>> assignedTasksByUserId = new HashMap<>();
    final Map<String, User> usersById = filterDuplicates(externalUsers).filter(externalUser -> !IS_PLANNING_USER.test(externalUser.getId())).map(UserUtil::fromExternalUser).collect(Collectors.toMap(User::getEntityId, Function.identity()));
    usersById.put(PLANNING_USER.getEntityId(), PLANNING_USER);
    taskDataList.forEach(taskData -> {
        context.setTaskChangeTime(taskData.getTaskId(), taskData.getLastModificationDate());
        final Task task = fromTaskData(taskData);
        final Status status = convertFromString(task.getStatus());
        switch(status) {
            case Ready:
                tasks.add(task);
                break;
            case Reserved:
            case InProgress:
            case Suspended:
                if (isNoneEmpty(taskData.getActualOwner())) {
                    // If actualOwner is empty the only chance is that the task was in Ready status and changed to
                    // Suspended, since Reserved and InProgress tasks has always an owner in jBPM.
                    // Finally tasks with no actualOwner (Suspended) are skipped, since they'll be properly added to
                    // the solution when they change to Ready status and the proper jBPM event is raised.
                    tasks.add(task);
                    final PlanningTask planningTask = taskData.getPlanningTask();
                    if (planningTask != null && taskData.getActualOwner().equals(planningTask.getAssignedUser())) {
                        boolean pinned = InProgress == status || Suspended == status || planningTask.getPublished() || !usersById.containsKey(taskData.getActualOwner());
                        addTaskToUser(assignedTasksByUserId, task, planningTask.getAssignedUser(), planningTask.getIndex(), pinned);
                    } else {
                        boolean pinned = (Reserved == status && !IS_PLANNING_USER.test(taskData.getActualOwner())) || InProgress == status || Suspended == status;
                        addTaskToUser(assignedTasksByUserId, task, taskData.getActualOwner(), -1, pinned);
                    }
                }
                break;
            default:
                // no other cases exists, sonar required.
                throw new IndexOutOfBoundsException("Value: " + taskData.getStatus() + " is out of range in current switch");
        }
    });
    assignedTasksByUserId.forEach((key, assignedTasks) -> {
        User user = usersById.get(key);
        if (user == null) {
            // create the user by convention.
            user = new User(key.hashCode(), key);
            usersById.put(key, user);
        }
        final List<Task> userTasks = assignedTasks.stream().map(IndexedElement::getElement).collect(Collectors.toList());
        addTasksToUser(user, userTasks);
    });
    // Add the DUMMY_TASK to avoid running into scenarios where the solution remains with no tasks.
    tasks.add(DUMMY_TASK);
    final List<User> users = new ArrayList<>(usersById.values());
    return new TaskAssigningSolution(-1, users, tasks);
}
Also used : Status(org.kie.api.task.model.Status) Task(org.kie.server.services.taskassigning.core.model.Task) PlanningTask(org.kie.server.api.model.taskassigning.PlanningTask) TaskOrUser(org.kie.server.services.taskassigning.core.model.TaskOrUser) User(org.kie.server.services.taskassigning.core.model.User) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) TaskAssigningSolution(org.kie.server.services.taskassigning.core.model.TaskAssigningSolution) StatusConverter.convertFromString(org.kie.server.api.model.taskassigning.util.StatusConverter.convertFromString) PlanningTask(org.kie.server.api.model.taskassigning.PlanningTask) ArrayList(java.util.ArrayList) List(java.util.List)

Aggregations

TaskAssigningSolution (org.kie.server.services.taskassigning.core.model.TaskAssigningSolution)70 User (org.kie.server.services.taskassigning.core.model.User)29 Test (org.junit.Test)26 Task (org.kie.server.services.taskassigning.core.model.Task)24 ArrayList (java.util.ArrayList)21 TaskPropertyChangeProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.TaskPropertyChangeProblemFactChange)17 ProblemFactChange (org.optaplanner.core.impl.solver.ProblemFactChange)17 AddTaskProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.AddTaskProblemFactChange)16 AddUserProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.AddUserProblemFactChange)16 AssignTaskProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.AssignTaskProblemFactChange)16 DisableUserProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.DisableUserProblemFactChange)16 ReleaseTaskProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.ReleaseTaskProblemFactChange)16 RemoveTaskProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.RemoveTaskProblemFactChange)16 RemoveUserProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.RemoveUserProblemFactChange)16 UserPropertyChangeProblemFactChange (org.kie.server.services.taskassigning.core.model.solver.realtime.UserPropertyChangeProblemFactChange)16 TaskData (org.kie.server.api.model.taskassigning.TaskData)15 TaskUtil.fromTaskData (org.kie.server.services.taskassigning.planning.util.TaskUtil.fromTaskData)13 UserUtil.fromExternalUser (org.kie.server.services.taskassigning.planning.util.UserUtil.fromExternalUser)12 PlanningTask (org.kie.server.api.model.taskassigning.PlanningTask)11 List (java.util.List)8