package com.jakeapp.gui.swing.worker; import com.jakeapp.gui.swing.callbacks.TaskChangedCallback; import com.jakeapp.gui.swing.dialogs.debugging.ActiveTasks; import com.jakeapp.gui.swing.worker.tasks.IJakeTask; import com.jakeapp.gui.swing.xcore.EventCore; import org.apache.log4j.Logger; import javax.swing.*; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * JakeExecutor - Main Thread Pool to start Tasks to the Core. * * @author studpete */ public class JakeExecutor extends ThreadPoolExecutor { private static final Logger log = Logger.getLogger(JakeExecutor.class); private static JakeExecutor instance; private final ConcurrentHashMap<Integer, IJakeTask> runningTasks = new ConcurrentHashMap<Integer, IJakeTask>(); public static JakeExecutor getInstance() { if (instance == null) { instance = new JakeExecutor(); } return instance; } /** * Calls ThreadPoolExecutor.execute. * * @param task Command that should be executed. */ public static void exec(IJakeTask task) { getInstance().execute(task); getInstance().addRunningTask(task); } private void addRunningTask(IJakeTask task) { log.debug("Register Task: " + task.getClass().getSimpleName()); runningTasks.put(task.hashCode(), task); fireTasksChanged(task, TaskChangedCallback.TaskOps.Started); } // private for singleton private JakeExecutor() { super(4, 15, 5, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } public static void removeTask(IJakeTask task) { getInstance().runningTasks.remove(task.hashCode()); fireTasksChanged(task, TaskChangedCallback.TaskOps.Finished); } private static void fireTasksChanged(final IJakeTask task, final TaskChangedCallback.TaskOps op) { // make call threadsave! SwingUtilities.invokeLater(new Runnable() { public void run() { EventCore.get().fireTasksChangedListener(task, op); // FIXME: use new interface TaskChanged ActiveTasks.tasksUpdated(); } }); } public static Map<Integer, IJakeTask> getTasks() { return getInstance().runningTasks; } public static boolean isTaskRunning(Class aclass) { for (IJakeTask task : getInstance().runningTasks.values()) { if (task.getClass().equals(aclass)) { return true; } } //return getInstance().runningTasks.containsKey(aclass.toString().hashCode()); return false; } public static boolean hasTasksRunning() { return countTasksRunning() > 0; } /** * Get Task on top of executor * * @return */ public static IJakeTask getLatestTask() { // HACK: make this less ugly! //synchronized (getInstance().runningTasks) { return (IJakeTask) getInstance().runningTasks.values().toArray()[getInstance() .runningTasks.size() - 1]; //} } public static int countTasksRunning() { return getInstance().runningTasks.size(); } }