package cz.cuni.mff.d3s.been.web.model;
import java.util.*;
import cz.cuni.mff.d3s.been.api.BeenApi;
import cz.cuni.mff.d3s.been.api.BeenApiException;
import cz.cuni.mff.d3s.been.core.benchmark.BenchmarkEntry;
import cz.cuni.mff.d3s.been.core.task.TaskContextEntry;
import cz.cuni.mff.d3s.been.core.task.TaskContextState;
import cz.cuni.mff.d3s.been.core.task.TaskEntry;
/**
* @author donarus
*/
public final class TaskContextSupport {
private final BeenApi api;
private ArrayList<ArrayList<TaskEntry>> orphanedContexts;
public TaskContextSupport(BeenApi api) {
this.api = api;
}
public void killTaskContext(String contextId) throws BeenApiException, InterruptedException {
api.killTaskContext(contextId);
int time = 0;
TaskContextEntry entry = api.getTaskContext(contextId);
while (time < Timeouts.KILL_TASK_CONTEXT_TIMEOUT && entry != null && entry.getContextState() != TaskContextState.FAILED && entry.getContextState() != TaskContextState.FINISHED) {
Thread.sleep(1000);
time++;
entry = api.getTaskContext(contextId);
}
}
public void removeKilledTaskContext(String contextId) throws BeenApiException {
this.api.removeTaskContextEntry(contextId);
}
public boolean isContextRemovable(String contextId) throws BeenApiException {
TaskContextEntry context = api.getTaskContext(contextId);
if (context.getContextState() != TaskContextState.FINISHED && context.getContextState() != TaskContextState.FAILED) {
return false;
}
return true;
}
public boolean isTaskContextInFinalState(String taskContextId) throws BeenApiException {
TaskContextEntry taskContextEntry = this.api.getTaskContext(taskContextId);
TaskContextState state = taskContextEntry.getContextState();
return state == TaskContextState.FAILED || state == TaskContextState.FINISHED;
}
public ArrayList<ArrayList<TaskEntry>> getOrphanedContexts() throws BeenApiException {
Collection<TaskEntry> allTasks = api.getTasks();
Collection<String> tasksInTree = getTaskIdsFromTree();
Collection<String> generatorTasks = getGeneratorTaskIds();
ArrayList<TaskEntry> taskEntries = new ArrayList<>(allTasks);
Collections.sort(taskEntries, new Comparator<TaskEntry>() {
@Override
public int compare(TaskEntry o1, TaskEntry o2) {
int order = o1.getTaskContextId().compareTo(o2.getTaskContextId());
if (order == 0)
order = o1.getId().compareTo(o2.getId());
return order;
}
});
Map<String, ArrayList<TaskEntry>> tasksByContexts = new LinkedHashMap<>();
for (TaskEntry taskEntry : taskEntries) {
if (tasksInTree.contains(taskEntry.getId())) {
continue;
}
if (generatorTasks.contains(taskEntry.getId())) {
continue;
}
String contextId = taskEntry.getTaskContextId();
if (!tasksByContexts.containsKey(contextId))
tasksByContexts.put(contextId, new ArrayList<TaskEntry>());
tasksByContexts.get(contextId).add(taskEntry);
}
return new ArrayList<>(tasksByContexts.values());
}
private Collection<String> getGeneratorTaskIds() throws BeenApiException {
ArrayList<String> result = new ArrayList<>();
for (BenchmarkEntry benchmarkEntry : api.getBenchmarks()) {
result.add(benchmarkEntry.getGeneratorId());
}
return result;
}
private Collection<String> getTaskIdsFromTree() throws BeenApiException {
ArrayList<String> result = new ArrayList<>();
for (BenchmarkEntry benchmarkEntry : api.getBenchmarks()) {
for (TaskContextEntry taskContextEntry : api.getTaskContextsInBenchmark(benchmarkEntry.getId())) {
for (TaskEntry taskEntry : api.getTasksInTaskContext(taskContextEntry.getId())) {
result.add(taskEntry.getId());
}
}
}
return result;
}
public boolean isContextFinished(String contextId) throws BeenApiException {
TaskContextEntry taskContextEntry = this.api.getTaskContext(contextId);
TaskContextState state = taskContextEntry.getContextState();
return state == TaskContextState.FINISHED;
}
}