package org.limewire.core.impl.download.listener;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import org.limewire.core.settings.DownloadSettings;
import org.limewire.listener.EventListener;
import org.limewire.util.Objects;
import com.limegroup.gnutella.Downloader;
import com.limegroup.gnutella.Downloader.DownloadState;
import com.limegroup.gnutella.downloader.CoreDownloader;
import com.limegroup.gnutella.downloader.DownloadStateEvent;
/**
* Listens for the completion of downloads, adding completed downloads to the
* DownloadSettings.RECENT_DOWNLOADS list.
*/
public class RecentDownloadListener implements EventListener<DownloadStateEvent> {
private static final int DEFAULT_MAX_TRACKED_DOWNLOADS = 10;
private final Downloader downloader;
private final int maxTrackedDownloads;
public RecentDownloadListener(Downloader downloader, int maxTrackedDownloads) {
assert maxTrackedDownloads > 0;
this.downloader = Objects.nonNull(downloader, "downloader");
this.maxTrackedDownloads = maxTrackedDownloads;
if (downloader.getState() == DownloadState.COMPLETE) {
if (downloader instanceof CoreDownloader) {
handleEvent(new DownloadStateEvent((CoreDownloader) downloader,
DownloadState.COMPLETE));
}
}
}
public RecentDownloadListener(Downloader downloader) {
this(downloader, DEFAULT_MAX_TRACKED_DOWNLOADS);
}
@Override
public void handleEvent(DownloadStateEvent event) {
// TODO don't do anything for torrent downloads?
DownloadState downloadStatus = event.getType();
if (DownloadState.COMPLETE == downloadStatus) {
File saveFile = downloader.getSaveFile();
if (saveFile != null) {
if (DownloadSettings.REMEMBER_RECENT_DOWNLOADS.getValue()) {
synchronized (RecentDownloadListener.class) {
List<File> files;
synchronized (DownloadSettings.RECENT_DOWNLOADS) {
files = new ArrayList<File>(DownloadSettings.RECENT_DOWNLOADS.get());
}
files.add(saveFile);
Collections.sort(files, new FileDateLeastToMostRecentComparator());
while(files.size() > maxTrackedDownloads) {
files.remove(0);
}
DownloadSettings.RECENT_DOWNLOADS.set(new HashSet<File>(files));
}
}
}
}
}
/**
* Orders files from least to most recent.
*/
private static class FileDateLeastToMostRecentComparator implements Comparator<File> {
@Override
public int compare(File o1, File o2) {
return Long.valueOf(o1.lastModified()).compareTo(Long.valueOf(o2.lastModified()));
}
}
}