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());
}
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());
}
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);
}
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;
}
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);
}
Aggregations