package org.atomnuke.util.remote;
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.atomnuke.lifecycle.Reclaimable;
/**
*
* @author zinic
*/
public class CancellationManager implements Reclaimable {
private final List<WeakReference<CancellationRemote>> cancellationRemotes;
public CancellationManager() {
cancellationRemotes = new LinkedList<WeakReference<CancellationRemote>>();
}
@Override
public synchronized void destroy() {
for (CancellationRemote remote : remotes()) {
remote.cancel();
}
cancellationRemotes.clear();
}
public synchronized void add(CancellationRemote remote) {
cancellationRemotes.add(new WeakReference<CancellationRemote>(remote));
}
private List<CancellationRemote> remotes() {
final List<CancellationRemote> activeRemotes = new LinkedList<CancellationRemote>();
for (Iterator<WeakReference<CancellationRemote>> cancellationRemoteItr = cancellationRemotes.iterator(); cancellationRemoteItr.hasNext();) {
final CancellationRemote remoteReference = cancellationRemoteItr.next().get();
if (remoteReference == null || remoteReference.canceled()) {
cancellationRemoteItr.remove();
} else {
activeRemotes.add(remoteReference);
}
}
return activeRemotes;
}
}