package com.faforever.client.task;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.lang.invoke.MethodHandles;
import java.util.concurrent.ThreadPoolExecutor;
public class TaskServiceImpl implements TaskService {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private final ObservableList<Task<?>> activeTasks;
@Resource
ThreadPoolExecutor threadPoolExecutor;
private ObservableList<Task<?>> unmodifiableObservableList;
public TaskServiceImpl() {
activeTasks = FXCollections.synchronizedObservableList(FXCollections.observableArrayList());
unmodifiableObservableList = FXCollections.unmodifiableObservableList(activeTasks);
}
@Override
@SuppressWarnings("unchecked")
public <T extends CompletableTask> T submitTask(T task) {
task.getFuture().whenComplete((o, throwable) -> {
activeTasks.remove(task);
if (throwable != null) {
logger.warn("Task failed", (Throwable) throwable);
}
});
activeTasks.add(task);
threadPoolExecutor.execute(task);
return task;
}
@Override
public ObservableList<Task<?>> getActiveTasks() {
return unmodifiableObservableList;
}
@PreDestroy
void preDestroy() {
threadPoolExecutor.shutdownNow();
}
}