package org.atomnuke.task.manager.impl; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.atomnuke.task.ManagedTask; import org.atomnuke.task.manager.TaskTracker; import org.atomnuke.util.TimeValue; import org.atomnuke.util.remote.CancellationRemote; /** * * @author zinic */ public class ThreadSafeTaskTracker implements TaskTracker { private final CancellationRemote cancellationRemote; private final List<ManagedTask> pollingTasks; public ThreadSafeTaskTracker(CancellationRemote cancellationRemote) { this.cancellationRemote = cancellationRemote; pollingTasks = new LinkedList<ManagedTask>(); } @Override public boolean active() { return !cancellationRemote.canceled(); } @Override public synchronized boolean hasTasksToSchedule(TimeValue now) { boolean shouldSchedule = false; for (ManagedTask task : pollingTasks) { if (task.pollingController().shouldPoll(now)) { shouldSchedule = true; break; } } return shouldSchedule; } @Override public synchronized List<ManagedTask> activeTasks() { for (Iterator<ManagedTask> managedTaskIter = pollingTasks.iterator(); managedTaskIter.hasNext();) { final ManagedTask managedTask = managedTaskIter.next(); // Cancellation of a task may occur at anytime - if it was canceled, remove it if (managedTask.handle().cancellationRemote().canceled()) { managedTaskIter.remove(); } } return new LinkedList<ManagedTask>(pollingTasks); } @Override public synchronized void enlistAction(ManagedTask task) { if (active()) { pollingTasks.add(task); } else { throw new IllegalStateException("This object has been destroyed and can no longer enlist tasks."); } } }