use of org.kie.server.services.taskassigning.core.model.solver.realtime.ReleaseTaskProblemFactChange in project droolsjbpm-integration by kiegroup.
the class SolutionChangesBuilderTest method assertChange.
private void assertChange(List<ProblemFactChange<TaskAssigningSolution>> result, int index, ReleaseTaskProblemFactChange expected) {
ReleaseTaskProblemFactChange change = (ReleaseTaskProblemFactChange) result.get(index);
assertTaskEquals(expected.getTask(), change.getTask());
}
use of org.kie.server.services.taskassigning.core.model.solver.realtime.ReleaseTaskProblemFactChange in project droolsjbpm-integration by kiegroup.
the class SolutionChangesBuilder method addTaskChanges.
private void addTaskChanges(final Task task, final TaskData taskData, final Map<String, User> usersById, final List<ReleaseTaskProblemFactChange> releasedTasksChanges, final Set<Task> removedTasksSet, final List<TaskPropertyChangeProblemFactChange> propertyChanges, final Map<String, List<IndexedElement<AssignTaskProblemFactChange>>> changesByUserId) {
final Status taskDataStatus = convertFromString(taskData.getStatus());
switch(taskDataStatus) {
case Ready:
if (!convertToString(Status.Ready).equals(task.getStatus())) {
// task was probably assigned to someone else in the past and released from the task
// list administration
releasedTasksChanges.add(new ReleaseTaskProblemFactChange(task));
}
break;
case Reserved:
case InProgress:
case Suspended:
if (taskData.getActualOwner() == null) {
// Task was necessary in Ready status prior going into Suspension. Remove it from solution
// and let it be added again if it comes into Ready or Reserved status in a later moment.
removedTasksSet.add(task);
} else if (!taskData.getActualOwner().equals(task.getUser().getEntityId())) {
// if Reserved:
// the task was probably manually re-assigned from the task list to another user.
// We must respect this assignment.
// if InProgress:
// the task was probably re-assigned to another user from the task list prior to start.
// We must correct this assignment so it's reflected in the plan and also respect it.
// if Suspended:
// the task was assigned to someone else from the task list prior to the suspension,
// we must reflect that change in the plan.
final User user = getUser(usersById, taskData.getActualOwner());
// assign and ensure the task is published since the task was already seen by the public audience.
AssignTaskProblemFactChange change = new AssignTaskProblemFactChange(task, user, true);
addChangeToUser(changesByUserId, change, user, -1, true);
} else if ((taskData.getPlanningTask() == null || taskData.getPlanningTask().getPublished()) && !task.isPinned()) {
// The task was published and not yet pinned
final User user = getUser(usersById, taskData.getActualOwner());
AssignTaskProblemFactChange change = new AssignTaskProblemFactChange(task, user, true);
int index = taskData.getPlanningTask() != null ? taskData.getPlanningTask().getIndex() : -1;
addChangeToUser(changesByUserId, change, user, index, true);
}
break;
case Completed:
case Exited:
case Failed:
case Error:
case Obsolete:
removedTasksSet.add(task);
break;
default:
// sonar required. No other cases exist.
break;
}
if (!removedTasksSet.contains(task) && (taskData.getPriority() != task.getPriority() || !taskData.getStatus().equals(task.getStatus()))) {
TaskPropertyChangeProblemFactChange propertyChange = new TaskPropertyChangeProblemFactChange(task);
if (taskData.getPriority() != task.getPriority()) {
propertyChange.setPriority(taskData.getPriority());
}
if (!taskData.getStatus().equals(task.getStatus())) {
propertyChange.setStatus(taskData.getStatus());
}
propertyChanges.add(propertyChange);
}
}
use of org.kie.server.services.taskassigning.core.model.solver.realtime.ReleaseTaskProblemFactChange in project droolsjbpm-integration by kiegroup.
the class SolutionChangesBuilder method build.
public List<ProblemFactChange<TaskAssigningSolution>> build() {
final Map<Long, Task> taskById = solution.getTaskList().stream().filter(IS_NOT_DUMMY).collect(Collectors.toMap(Task::getId, Function.identity()));
final Map<String, User> usersById = solution.getUserList().stream().collect(Collectors.toMap(User::getEntityId, Function.identity()));
final List<AddTaskProblemFactChange> newTaskChanges = new ArrayList<>();
final List<ReleaseTaskProblemFactChange> releasedTasksChanges = new ArrayList<>();
final List<RemoveTaskProblemFactChange> removedTaskChanges = new ArrayList<>();
final Set<Task> removedTasksSet = new HashSet<>();
final List<TaskPropertyChangeProblemFactChange> propertyChanges = new ArrayList<>();
final Map<String, List<IndexedElement<AssignTaskProblemFactChange>>> changesByUserId = new HashMap<>();
final List<AddUserProblemFactChange> newUserChanges = new ArrayList<>();
final List<ProblemFactChange<TaskAssigningSolution>> userUpdateChanges = new ArrayList<>();
final List<RemoveUserProblemFactChange> removableUserChanges = new ArrayList<>();
final List<TaskData> filteredTaskDataList = taskDataList.stream().filter(taskData -> !context.isProcessedTaskChange(taskData.getTaskId(), taskData.getLastModificationDate())).collect(Collectors.toList());
Task task;
for (TaskData taskData : filteredTaskDataList) {
task = taskById.remove(taskData.getTaskId());
if (task == null) {
addNewTaskChanges(taskData, usersById, newTaskChanges, changesByUserId);
} else {
addTaskChanges(task, taskData, usersById, releasedTasksChanges, removedTasksSet, propertyChanges, changesByUserId);
}
}
for (Task removedTask : removedTasksSet) {
removedTaskChanges.add(new RemoveTaskProblemFactChange(removedTask));
}
if (executeUsersUpdate) {
addUserChanges(usersById, newUserChanges, userUpdateChanges);
} else {
addRemovableUserChanges(changesByUserId, removableUserChanges);
}
List<ProblemFactChange<TaskAssigningSolution>> totalChanges = new ArrayList<>();
totalChanges.addAll(newUserChanges);
totalChanges.addAll(removedTaskChanges);
totalChanges.addAll(releasedTasksChanges);
changesByUserId.values().forEach(byUserChanges -> byUserChanges.forEach(change -> totalChanges.add(change.getElement())));
totalChanges.addAll(propertyChanges);
totalChanges.addAll(userUpdateChanges);
totalChanges.addAll(newTaskChanges);
totalChanges.addAll(removableUserChanges);
if (LOGGER.isTraceEnabled()) {
if (!totalChanges.isEmpty()) {
traceProgrammedChanges(LOGGER, removedTaskChanges, releasedTasksChanges, changesByUserId, propertyChanges, newTaskChanges, newUserChanges, userUpdateChanges, removableUserChanges);
} else {
LOGGER.trace("No changes has been calculated.");
}
}
applyWorkaroundForPLANNER241(solution, totalChanges);
if (!totalChanges.isEmpty()) {
totalChanges.add(0, scoreDirector -> context.setCurrentChangeSetId(context.nextChangeSetId()));
}
filteredTaskDataList.forEach(taskData -> context.setTaskChangeTime(taskData.getTaskId(), taskData.getLastModificationDate()));
return totalChanges;
}
use of org.kie.server.services.taskassigning.core.model.solver.realtime.ReleaseTaskProblemFactChange in project droolsjbpm-integration by kiegroup.
the class SolutionChangesBuilderTest method addReleasedTaskChange.
@Test
public void addReleasedTaskChange() {
TaskData taskData = mockTaskData(TASK_ID, NAME, Ready, USER_ENTITY_ID);
Task task = fromTaskData(taskData);
task.setStatus(convertToString(Reserved));
TaskAssigningSolution solution = mockSolution(Collections.singletonList(task), Collections.emptyList());
List<ProblemFactChange<TaskAssigningSolution>> result = SolutionChangesBuilder.create().withSolution(solution).withTasks(mockTaskDataList(taskData)).withUserSystem(userSystemService).withContext(context).build();
assertChangeIsTheChangeSetId(result, 0);
assertChange(result, 1, new ReleaseTaskProblemFactChange(task));
assertTaskChangeRegistered(taskData.getTaskId(), taskData.getLastModificationDate());
}
Aggregations