/* ApplicationTaskManager.java created 2007-10-06 * */ package org.signalml.app.task; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.Window; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.signalml.SignalMLOperationMode; import org.signalml.app.method.ApplicationMethodManager; import org.signalml.app.view.common.dialogs.PleaseWaitDialog; import org.signalml.app.view.common.dialogs.TaskStatusDialog; import org.signalml.app.view.common.dialogs.errors.ExceptionDialog; import org.signalml.method.CleanupMethod; import org.signalml.method.Method; import org.signalml.task.DefaultTaskManager; import org.signalml.task.Task; /** ApplicationTaskManager * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class ApplicationTaskManager extends DefaultTaskManager { protected static final Logger logger = Logger.getLogger(ApplicationTaskManager.class); private Map<Task,ApplicationTaskWorker> workerMap = new HashMap<Task,ApplicationTaskWorker>(); private Map<Task,TaskStatusDialog> dialogMap = new HashMap<Task,TaskStatusDialog>(); private Map<Task,TaskEventProxy> proxyMap = new HashMap<Task, TaskEventProxy>(); private ApplicationMethodManager methodManager; private PleaseWaitDialog pleaseWaitDialog; private Window statusDialogParent; private SignalMLOperationMode mode; public ApplicationTaskManager() { super(); } protected ApplicationTaskWorker getWorkerForTask(Task task) { return workerMap.get(task); } public TaskEventProxy getEventProxyForTask(Task task) { return proxyMap.get(task); } public TaskStatusDialog getStatusDialogForTask(Task task) { TaskStatusDialog dialog = dialogMap.get(task); if (dialog == null) { dialog = createStatusDialog(task); dialogMap.put(task, dialog); } return dialog; } protected TaskStatusDialog createStatusDialog(Task task) { TaskStatusDialog dialog = new TaskStatusDialog(task, mode); dialog.setTaskManager(this); dialog.setMethodManager(methodManager); return dialog; } @Override public void addTask(Task task) { TaskEventProxy proxy = new TaskEventProxy(); proxyMap.put(task, proxy); super.addTask(task); } public void startTask(Task task) { ApplicationTaskWorker worker = new ApplicationTaskWorker(task); workerMap.put(task, worker); TaskEventProxy proxy = proxyMap.get(task); proxy.setWorker(worker); worker.execute(); } public void resumeTask(Task task) { ApplicationTaskWorker worker = new ApplicationTaskWorker(task); workerMap.put(task, worker); TaskEventProxy proxy = proxyMap.get(task); proxy.setWorker(worker); worker.execute(); } @Override public void removeTask(Task task) { synchronized (this) { super.removeTask(task); synchronized (task) { if (task.getStatus().isAbortable()) { task.abort(false); } } ApplicationTaskWorker worker = workerMap.get(task); if (worker != null) { worker.cancel(true); workerMap.remove(task); } TaskEventProxy proxy = proxyMap.get(task); if (proxy != null) { proxy.setWorker(null); proxyMap.remove(task); } TaskStatusDialog dialog = dialogMap.get(task); if (dialog != null) { if (dialog.isVisible()) { dialog.hideDialog(); } dialog.dispose(); dialogMap.remove(task); } Method method = task.getMethod(); if (method instanceof CleanupMethod) { ((CleanupMethod) method).cleanUp(task.getData()); } } } public void waitForTaskToStopWorking(Task task) { ApplicationTaskWorker worker = workerMap.get(task); if (worker == null) { return; } if (worker.isDone()) { return; } pleaseWaitDialog.setActivity(_("waiting for task")); pleaseWaitDialog.configureForIndeterminateSimulated(); worker.setPleaseWaitDialog(pleaseWaitDialog); pleaseWaitDialog.waitAndShowDialogIn(statusDialogParent, 500, worker); } public SignalMLOperationMode getMode() { return mode; } public void setMode(SignalMLOperationMode mode) { this.mode = mode; } public ApplicationMethodManager getMethodManager() { return methodManager; } public void setMethodManager(ApplicationMethodManager methodManager) { this.methodManager = methodManager; } public Window getStatusDialogParent() { return statusDialogParent; } public void setStatusDialogParent(Window statusDialogParent) { this.statusDialogParent = statusDialogParent; } public PleaseWaitDialog getPleaseWaitDialog() { return pleaseWaitDialog; } public void setPleaseWaitDialog(PleaseWaitDialog pleaseWaitDialog) { this.pleaseWaitDialog = pleaseWaitDialog; } }