package com.limegroup.gnutella.downloader;
import com.limegroup.gnutella.util.IntervalSet;
import java.util.NoSuchElementException;
import java.util.Iterator;
/**
* Selection strategy that selects the next available block.
*
* This is not well tested; it's just here as a testing stub.
*/
public class TestSequentialStrategy implements SelectionStrategy {
public Interval pickAssignment(IntervalSet availableBytes,
IntervalSet neededBytes,
long blockSize) throws NoSuchElementException {
// Construct test cases such that this won't result in getting the first element of an empty list
Iterator intervalIterator = availableBytes.getAllIntervals();
// If we don't need alignment, we're done
if (blockSize < 1 && intervalIterator.hasNext())
return (Interval) intervalIterator.next();
// Loop over intervals, looking for a suitable candidate
while (intervalIterator.hasNext()) {
Interval candidate = (Interval) intervalIterator.next();
// align the high point of the interval
long alignedHigh = candidate.low;
// step ahead one block size
alignedHigh += blockSize;
// cut back to the block boundary
alignedHigh -= (alignedHigh % blockSize);
// step back one more byte
alignedHigh -= 1;
if (alignedHigh <= candidate.high) {
return new Interval((int)candidate.low, (int) alignedHigh);
} else {
return candidate;
}
}
// All Intervals have been tested and found to be lacking
throw new NoSuchElementException("blockSize:"+blockSize+" Intervals:"+availableBytes);
}
}