package org.limewire.core.impl.download;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.Set;
import org.limewire.collection.glazedlists.GlazedListsFactory;
import org.limewire.core.api.download.DownloadItem;
import org.limewire.core.api.download.DownloadState;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.matchers.Matcher;
/**
* calculates
*/
class QueueTimeCalculator {
/**
* List of all items whose DownloadState is DOWNLOADING
*/
private final EventList<DownloadItem> downloadingList;
public QueueTimeCalculator(EventList<DownloadItem> downloadItems) {
EventList<DownloadItem> list =
GlazedListsFactory.filterList(downloadItems, new DownloadStateMatcher(
DownloadState.DOWNLOADING));
Comparator<DownloadItem> dlComparator = new Comparator<DownloadItem>() {
@Override
public int compare(DownloadItem o1, DownloadItem o2) {
return (int) (o1.getRemainingDownloadTime() - o2.getRemainingDownloadTime());
}
};
downloadingList = GlazedListsFactory.sortedList(list, dlComparator);
}
public long getRemainingQueueTime(DownloadItem queueItem) {
downloadingList.getReadWriteLock().readLock().lock();
try {
if (queueItem.getState() != DownloadState.LOCAL_QUEUED) {
return DownloadItem.UNKNOWN_TIME;
}
int priority = queueItem.getLocalQueuePriority();
// top priority is 1 (but may briefly be 0 when resuming)
int index = priority - 1;
if (index >= downloadingList.size() || index < 0) {
return DownloadItem.UNKNOWN_TIME;
}
return downloadingList.get(index).getRemainingDownloadTime();
} finally {
downloadingList.getReadWriteLock().readLock().unlock();
}
}
private static class DownloadStateMatcher implements Matcher<DownloadItem> {
private final Set<DownloadState> downloadStates;
public DownloadStateMatcher(DownloadState first, DownloadState... rest) {
downloadStates = EnumSet.of(first, rest);
}
@Override
public boolean matches(DownloadItem item) {
if (item == null) {
return false;
} else {
return downloadStates.contains(item.getState());
}
}
}
}