/* IteratorMethod.java created 2007-12-05 * */ package org.signalml.method.iterator; import static org.signalml.app.util.i18n.SvarogI18n._; import org.apache.log4j.Logger; import org.signalml.exception.SanityCheckException; import org.signalml.method.AbstractMethod; import org.signalml.method.ComputationException; import org.signalml.method.InitializingMethod; import org.signalml.method.InputDataException; import org.signalml.method.MethodExecutionTracker; import org.signalml.method.SuspendableMethod; import org.signalml.method.TrackableMethod; import org.signalml.plugin.export.SignalMLException; import org.signalml.plugin.export.method.BaseMethodData; /** IteratorMethod * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class MethodIteratorMethod extends AbstractMethod implements InitializingMethod, SuspendableMethod, TrackableMethod { protected static final Logger logger = Logger.getLogger(MethodIteratorMethod.class); private IterableMethod subjectMethod; public MethodIteratorMethod(IterableMethod subjectMethod) { super(); if (subjectMethod == null) { throw new NullPointerException("No method"); } this.subjectMethod = subjectMethod; } public IterableMethod getSubjectMethod() { return subjectMethod; } @Override public Object doComputation(Object dataObj, MethodExecutionTracker tracker) throws ComputationException { MethodIteratorData data = (MethodIteratorData) dataObj; MethodIteratorResult results; int totalIterations = data.getTotalIterations(); int completedIterations = data.getCompletedIterations(); int i; Object result; tracker.setTickerLimit(0, totalIterations); tracker.setTicker(0, completedIterations); if (completedIterations > 0) { results = data.getCompletedResults(); if (results.size() != completedIterations) { throw new SanityCheckException("Invalid number of suspended results"); } } else { results = new MethodIteratorResult(data.getParameters()); data.setCompletedResults(results); } TickerOffsettingTrackerWrapper trackerWrapper = new TickerOffsettingTrackerWrapper(tracker); Object[] parameterValues; for (i=completedIterations; i<totalIterations; i++) { parameterValues = data.setupForIteration(i); try { result = subjectMethod.compute(data.getSubjectMethodData(), trackerWrapper); } catch (InputDataException ex) { logger.error("Iteration caused the data to become invalid", ex); throw new ComputationException("error.iterationError", ex); } if (result != null) { results.add(subjectMethod.digestIterationResult(i, result), parameterValues); data.setCompletedIterations(i+1); tracker.tick(0); } if (tracker.isRequestingAbort()) { return null; } else if (tracker.isRequestingSuspend()) { return null; } if (result == null) { return null; } } return results; } @Override public BaseMethodData createData() { return new MethodIteratorData(); } @Override public String getName() { return "iteration(" + subjectMethod.getName() + ")"; } @Override public Class<?> getResultClass() { return MethodIteratorResult.class; } @Override public String getUID() { return subjectMethod.getUID() + "-ITERATION"; } @Override public int[] getVersion() { return subjectMethod.getVersion(); } @Override public boolean supportsDataClass(Class<?> clazz) { return MethodIteratorData.class.isAssignableFrom(clazz); } @Override public int getTickerCount() { if (subjectMethod instanceof TrackableMethod) { return 1 + ((TrackableMethod) subjectMethod).getTickerCount(); } return 1; } @Override public String getTickerLabel(int ticker) { if (ticker > 0 && subjectMethod instanceof TrackableMethod) { return ((TrackableMethod) subjectMethod).getTickerLabel(ticker-1); } return _("Iteration progress"); } @Override public void initialize() throws SignalMLException { if (subjectMethod instanceof InitializingMethod) { ((InitializingMethod) subjectMethod).initialize(); } } @Override public boolean isDataSuspended(Object data) { return (((MethodIteratorData) data).getCompletedIterations() > 0); } }