package ilarkesto.concurrent; import java.util.ArrayList; import java.util.List; public final class BatchTask extends ATask { private List<TaskWrapper> tasks = new ArrayList<TaskWrapper>(); private TaskWrapper currentTask; private float progressed; @Override protected void perform() { int totalWeight = 0; for (TaskWrapper wrapper : tasks) { totalWeight += wrapper.weight; } for (TaskWrapper wrapper : tasks) { wrapper.effectiveWeight = (float) wrapper.weight / (float) totalWeight; } while (!tasks.isEmpty() && !isAbortRequested()) { currentTask = tasks.get(0); tasks.remove(currentTask); currentTask.task.run(); progressed += currentTask.effectiveWeight; } } @Override public void abort() { if (currentTask != null) currentTask.task.abort(); super.abort(); } @Override public void reset() { for (TaskWrapper taskWrapper : tasks) { if (taskWrapper.task.isFinished()) continue; taskWrapper.task.abort(); } super.reset(); } @Override public String getProgressMessage() { return currentTask == null ? null : currentTask.task.getProgressMessage(); } @Override public float getProgress() { if (currentTask == null) return super.getProgress(); return progressed + (currentTask.effectiveWeight * currentTask.task.getProgress()); } public void addTask(ATask task) { addTask(task, 1); } public void addTask(ATask task, int weight) { tasks.add(new TaskWrapper(task, weight)); } private static class TaskWrapper { private ATask task; private int weight; private float effectiveWeight; public TaskWrapper(ATask task, int weight) { this.task = task; this.weight = weight; } } }