package org.torrent.internal.transfer; import java.beans.IndexedPropertyChangeEvent; import java.beans.PropertyChangeEvent; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.torrent.internal.data.TorrentMetaInfo; import org.torrent.internal.data.TorrentMetaInfo.Piece; import org.torrent.internal.event.AvailabilityEvent; import org.torrent.internal.event.AvailabilityListener; import org.torrent.internal.util.Bits; import org.torrent.internal.util.Validator; public class AvailabilityObserver extends BTSessionListenerAdapter { private final int[] availability; private List<AvailabilityListener> listeners = new CopyOnWriteArrayList<AvailabilityListener>(); public AvailabilityObserver(TorrentMetaInfo content) { Validator.nonNull(content); availability = new int[content.getPiecesCount()]; } @Override public synchronized void bitFieldBitChanged(IndexedPropertyChangeEvent event) { if (!event.getOldValue().equals(event.getNewValue())) { if ((Boolean) event.getNewValue()) { increaseAvailability(event.getIndex()); } else { decreaseAvailability(event.getIndex()); } } } @Override public synchronized void bitFieldChanged(PropertyChangeEvent event) { Bits oldValue = (Bits) event.getOldValue(); Bits newValue = (Bits) event.getNewValue(); for (int i = 0; i < availability.length; i++) { if (oldValue.get(i) != newValue.get(i)) { if (newValue.get(i)) { increaseAvailability(i); } else { decreaseAvailability(i); } } } } private void decreaseAvailability(int i) { int value = --availability[i]; AvailabilityEvent evt = new AvailabilityEvent(this, i, value); for (AvailabilityListener l : listeners) { l.decreasedAvailability(evt); } } private void increaseAvailability(int i) { int value = ++availability[i]; AvailabilityEvent evt = new AvailabilityEvent(this, i, value); for (AvailabilityListener l : listeners) { l.increasedAvailability(evt); } } public synchronized int getAvailability(Piece piece) { return availability[piece.getIndex()]; } }