package ilarkesto.concurrent; import java.util.Collection; import java.util.Collections; public abstract class ACollectionTask<E> extends ATask { private int count; private int index; private E element; protected abstract Collection<E> prepare() throws InterruptedException; protected abstract void perform(E element) throws InterruptedException; @Override protected final void perform() throws InterruptedException { Collection<E> elements = prepare(); if (elements == null) elements = Collections.emptyList(); count = elements.size(); index = 0; for (E element : elements) { this.element = element; perform(element); if (isAbortRequested()) break; index++; } cleanup(); } public final int getIndex() { return index; } protected void cleanup() throws InterruptedException {} protected String getProgressMessage(E element) { return element.toString(); } @Override public final String getProgressMessage() { return getProgressMessage(element); } @Override public final float getProgress() { if (count == 0) return 1; if (index == 0) return 0; return (float) index / (float) count; } }