private boolean checkForWorkflowCompletion(final Workflow workflow) throws TerminateWorkflowException { List<Task> allTasks = workflow.getTasks(); if (allTasks.isEmpty()) { return false; } Map<String, Status> taskStatusMap = new HashMap<>(); workflow.getTasks().forEach(task -> taskStatusMap.put(task.getReferenceTaskName(), task.getStatus())); List<WorkflowTask> workflowTasks = workflow.getWorkflowDefinition().getTasks(); boolean allCompletedSuccessfully = workflowTasks.stream().parallel().allMatch(wftask -> { Status status = taskStatusMap.get(wftask.getTaskReferenceName()); return status != null && status.isSuccessful() && status.isTerminal(); }); boolean noPendingTasks = taskStatusMap.values() .stream() .allMatch(Status::isTerminal); boolean noPendingSchedule = workflow.getTasks().stream().parallel().filter(wftask -> { String next = getNextTasksToBeScheduled(workflow, wftask); return next != null && !taskStatusMap.containsKey(next); }).collect(Collectors.toList()).isEmpty(); return allCompletedSuccessfully && noPendingTasks && noPendingSchedule; }
private boolean checkForWorkflowCompletion(final Workflow workflow) throws TerminateWorkflowException { List<Task> allTasks = workflow.getTasks(); if (allTasks.isEmpty()) { return false; } Map<String, Status> taskStatusMap = new HashMap<>(); workflow.getTasks().forEach(task -> taskStatusMap.put(task.getReferenceTaskName(), task.getStatus())); List<WorkflowTask> workflowTasks = workflow.getWorkflowDefinition().getTasks(); boolean allCompletedSuccessfully = workflowTasks.stream().parallel().allMatch(wftask -> { Status status = taskStatusMap.get(wftask.getTaskReferenceName()); return status != null && status.isSuccessful() && status.isTerminal(); }); boolean noPendingTasks = taskStatusMap.values() .stream() .allMatch(Status::isTerminal); boolean noPendingSchedule = workflow.getTasks().stream().parallel().filter(wftask -> { String next = getNextTasksToBeScheduled(workflow, wftask); return next != null && !taskStatusMap.containsKey(next); }).collect(Collectors.toList()).isEmpty(); return allCompletedSuccessfully && noPendingTasks && noPendingSchedule; }