package org.drugis.common.threading.status; import java.util.List; import org.apache.commons.lang.StringUtils; import org.drugis.common.beans.AbstractObservable; import org.drugis.common.threading.Task; import org.drugis.common.threading.event.TaskProgressEvent; public abstract class AbstractProgressModel extends AbstractObservable implements TextProgressModel { public static final String DONE_TEXT = "Done!"; public static final String WAITING_TEXT = "waiting"; public static final String FAILED_TEXT = "failed"; public static final String ABORTED_TEXT = "Aborted"; protected Task d_task; protected Double d_progress; protected boolean d_determinate; protected abstract Double calcProgress(); protected abstract boolean calcDeterminate(); protected double calcProgress(TaskProgressEvent evt) { return (double) evt.getIteration() / evt.getTotalIterations(); } public boolean getDeterminate() { return d_determinate; } public Double getProgress() { return d_progress; } String formatProgress(Double progress) { if(progress == null) return "?"; Long round = (Long)Math.round(100.0 * progress); return round.toString() + "%"; } public String getText() { String taskName = d_task.toString(); List<String> phaseStrings = getPhaseStrings(); String phaseString = " (" + StringUtils.join(phaseStrings, ", ") + ")"; if (!d_task.isStarted()) { return taskName + " (" + WAITING_TEXT + ")"; } if (d_task.isFinished()) { return DONE_TEXT; } if (d_task.isFailed()) { return taskName + " "+FAILED_TEXT +": " + d_task.getFailureCause().getMessage(); } if (d_task.isAborted()) { return taskName + ": " + ABORTED_TEXT; } if (!phaseStrings.isEmpty()) { return taskName + phaseString; } return taskName + ": " + formatProgress(getDeterminate() ? d_progress : null); } abstract protected List<String> getPhaseStrings(); protected void setProgress(Double progress) { Double oldValue = d_progress; d_progress = progress; firePropertyChange(PROPERTY_PROGRESS, oldValue, d_progress); firePropertyChange(PROPERTY_TEXT, null, getText()); } protected void setDeterminate(boolean determinate) { boolean oldValue = d_determinate; d_determinate = determinate; firePropertyChange(PROPERTY_DETERMINATE, oldValue, d_determinate); } }