package org.torrent.internal.transfer;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.Set;
import org.torrent.internal.data.TorrentMetaInfo;
import org.torrent.internal.data.TorrentMetaInfo.Piece;
import org.torrent.internal.peer.connection.BTConnection;
public class DefaultDistributionWatcher extends DistributionWatcher {
public DefaultDistributionWatcher(TorrentMetaInfo contentInfo) {
super(contentInfo);
}
@Override
protected Coverage createCoverage(BTConnection con) {
return new Coverage() {
// Prevent piece request jumping
private Piece lastRequired;
Set<Piece> set = new LinkedHashSet<Piece>();
private Comparator<Piece> pieceComparator;
@Override
public Piece bestRequired() {
if (set.isEmpty()) {
return null;
}
if (lastRequired != null && set.contains(lastRequired)) {
return lastRequired;
}
return lastRequired = Collections.min(set, pieceComparator);
}
@Override
public void setComparator(Comparator<Piece> comparator) {
assert comparator != null;
pieceComparator = comparator;
}
@Override
public void markAsRequired(Piece piece) {
set.add(piece);
}
@Override
public void markNotRequired(Piece piece) {
set.remove(piece);
}
@Override
public boolean hasRequired() {
return !set.isEmpty();
}
};
}
}