package dk.daoas.adressevedligehold.tasks; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import dk.daoas.adressevedligehold.tasks.Task.TaskBean; import dk.daoas.adressevedligehold.tasks.Task.TaskState; public class TaskManager { public static final String TASKMANAGER = "TASKMANAGER"; ExecutorService executor = Executors.newFixedThreadPool(1); private int nextId = 1; private ArrayList tasks = new ArrayList(); private HashMap taskIdMap = new HashMap(); private Task currentTask; public synchronized List getTasks() { ArrayList tmpList = new ArrayList(); for (Task t : tasks) { tmpList.add( t.getTaskBean() ); } Collections.reverse(tmpList); return tmpList; } public void setCurrentTask(Task task) { this.currentTask = task; } public Task getCurrentTask() { return this.currentTask; } public Task getTaskById(int id) { return taskIdMap.get(id); } void shutDown() { if (currentTask != null) { currentTask.doAbort(); } executor.shutdownNow(); } public synchronized void removeTask(Task removeTask) { if (removeTask.state == TaskState.STATE_QUEUED) { removeTask.doAbort(); } if (removeTask.state == TaskState.STATE_ABORTED || removeTask.state == TaskState.STATE_DONE || removeTask.state == TaskState.STATE_QUEUED) { taskIdMap.remove( removeTask.getId() ); tasks.remove(removeTask); return; } throw new RuntimeException("Cant remove task in current state:" + removeTask.state); } public synchronized void submitTask(Task newTask) { int id = getNextTaskid(); newTask.setId(id); newTask.setManager(this); taskIdMap.put(id, newTask); tasks.add(newTask); executor.submit(newTask); } private synchronized int getNextTaskid() { return nextId++; } }