package org.atomnuke.sink.manager;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import org.atomnuke.plugin.InstanceContext;
import org.atomnuke.sink.AtomSink;
import org.atomnuke.service.gc.ReclamationHandler;
import org.atomnuke.util.remote.CancellationRemote;
/**
*
* @author zinic
*/
public class SinkManagerImpl implements SinkManager {
private final ReclamationHandler reclamationHandler;
private final List<ManagedSink> sinks;
public SinkManagerImpl(ReclamationHandler reclamationHandler) {
this.reclamationHandler = reclamationHandler;
sinks = new LinkedList<ManagedSink>();
}
@Override
public synchronized boolean hasRegisteredSinks() {
return !sinks.isEmpty();
}
@Override
public synchronized List<ManagedSink> sinks() {
for (Iterator<ManagedSink> registeredSinkItr = sinks.iterator(); registeredSinkItr.hasNext();) {
final ManagedSink managedSink = registeredSinkItr.next();
if (managedSink.cancellationRemote().canceled()) {
registeredSinkItr.remove();
}
}
return Collections.unmodifiableList(sinks);
}
@Override
public synchronized CancellationRemote addSink(InstanceContext<? extends AtomSink> atomSinkContext) {
final CancellationRemote cancellationRemote = reclamationHandler.watch(atomSinkContext);
final UUID taskId = UUID.randomUUID();
final ManagedSink newSink = new ManagedSink(atomSinkContext, cancellationRemote, taskId);
sinks.add(newSink);
return cancellationRemote;
}
}