package org.torrent.internal.service; import java.util.Collection; import java.util.concurrent.CopyOnWriteArrayList; import org.torrent.internal.data.TorrentMetaInfo.Piece; import org.torrent.internal.service.event.ContentStateEvent; import org.torrent.internal.util.Validator; public abstract class AbstractContentStateService implements ContentStateService { private Collection<ContentStateListener> listeners = new CopyOnWriteArrayList<ContentStateListener>(); private final EventDispatcherService disp; public AbstractContentStateService(EventDispatcherService dispatcher) { Validator.nonNull(dispatcher); disp = dispatcher; } @Override public void addContentStateListener(ContentStateListener listener) { listeners.add(listener); } @Override public void removeContentStateListener(ContentStateListener listener) { listeners.remove(listener); } @Override public void setAvailable(Piece piece) { fire(new ContentStateEvent(this, piece, ContentState.AVAILABLE)); } @Override public void setRequired(Piece piece) { fire(new ContentStateEvent(this, piece, ContentState.REQUIRED)); } @Override public void setValidated(Piece piece) { fire(new ContentStateEvent(this, piece, ContentState.VALIDATED)); } private void fire(final ContentStateEvent contentEvent) { disp.invokeLater(new Runnable() { @Override public void run() { for (ContentStateListener l : listeners) { l.stateChanged(contentEvent); } } }); } }