/* GetTaskResultAction.java created 2007-10-19 * */ package org.signalml.app.action.workspace.tasks; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.Window; import java.awt.event.ActionEvent; import org.apache.log4j.Logger; import org.signalml.app.action.AbstractFocusableSignalMLAction; import org.signalml.app.action.selector.TaskFocusSelector; import org.signalml.app.method.ApplicationIterableMethodDescriptor; import org.signalml.app.method.ApplicationMethodDescriptor; import org.signalml.app.method.ApplicationMethodManager; import org.signalml.app.method.MethodIterationResultConsumer; import org.signalml.app.method.MethodResultConsumer; import org.signalml.app.view.common.dialogs.DialogResultListener; import org.signalml.app.view.common.dialogs.errors.Dialogs; import org.signalml.method.Method; import org.signalml.method.iterator.IterableMethod; import org.signalml.method.iterator.MethodIteratorData; import org.signalml.method.iterator.MethodIteratorMethod; import org.signalml.method.iterator.MethodIteratorResult; import org.signalml.plugin.export.SignalMLException; import org.signalml.task.Task; import org.signalml.task.TaskResult; /** GetTaskResultAction * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class GetTaskResultAction extends AbstractFocusableSignalMLAction<TaskFocusSelector> { private static final long serialVersionUID = 1L; protected static final Logger logger = Logger.getLogger(GetTaskResultAction.class); private ApplicationMethodManager methodManager; private DialogResultListener dialogResultListener; public GetTaskResultAction( TaskFocusSelector actionFocusSelector, DialogResultListener dialogResultListener) { this(actionFocusSelector); this.dialogResultListener = dialogResultListener; } public GetTaskResultAction(TaskFocusSelector taskFocusSelector) { super(taskFocusSelector); setText(_("Get result")); setIconPath("org/signalml/app/icon/getresult.png"); setToolTip(_("Get the results of this task")); } @Override public void actionPerformed(ActionEvent ev) { Task targetTask = getActionFocusSelector().getActiveTask(); if (targetTask == null) { return; } TaskResult result = null; synchronized (targetTask) { if (targetTask.getStatus().isFinished()) { result = targetTask.getResult(); } } if (result == null) { logger.warn("No result to get"); return; } logger.debug("Got result [" + result + "]"); Method method = targetTask.getMethod(); if (method instanceof MethodIteratorMethod) { MethodIteratorMethod iteratorMethod = (MethodIteratorMethod) method; IterableMethod subjectMethod = iteratorMethod.getSubjectMethod(); // special treatment of the iterator, use an iterable result consumer of the subject method ApplicationMethodDescriptor anyDescr = methodManager.getMethodData(subjectMethod); ApplicationIterableMethodDescriptor descriptor = null; if (anyDescr instanceof ApplicationIterableMethodDescriptor) { descriptor = (ApplicationIterableMethodDescriptor) anyDescr; } if (descriptor == null) { logger.warn("No descriptor, can't get consumer"); return; } MethodIterationResultConsumer consumer = descriptor.getIterationConsumer(methodManager); if (consumer == null) { logger.warn("No consumer"); return; } MethodIteratorData iteratorData = (MethodIteratorData) targetTask.getData(); MethodIteratorResult iteratorResult = (MethodIteratorResult) result.getResult(); try { consumer.consumeIterationResult(subjectMethod, iteratorData, iteratorResult); } catch (SignalMLException ex) { logger.error("Failed to consume result", ex); Dialogs.showExceptionDialog((Window) null, ex); return; } } else { // normal case - use normal consumer ApplicationMethodDescriptor descriptor = methodManager.getMethodData(method); if (descriptor == null) { logger.warn("No descriptor, can't get consumer"); return; } MethodResultConsumer consumer = descriptor.getConsumer(methodManager); if (consumer == null) { logger.warn("No consumer"); return; } boolean consumerResult = false; try { consumerResult = consumer.consumeResult(method, targetTask.getData(), result.getResult()); } catch (SignalMLException ex) { logger.error("Failed to consume result", ex); Dialogs.showExceptionDialog((Window) null, ex); return; } if (dialogResultListener != null) { dialogResultListener.dialogCompleted(consumerResult); } } } @Override public void setEnabledAsNeeded() { boolean enabled = false; Task targetTask = getActionFocusSelector().getActiveTask(); if (targetTask != null) { enabled = targetTask.getStatus().isFinished(); } setEnabled(enabled); } public ApplicationMethodManager getMethodManager() { return methodManager; } public void setMethodManager(ApplicationMethodManager methodManager) { this.methodManager = methodManager; } }