package com.limegroup.gnutella.downloader; import java.util.ArrayList; import java.util.List; import com.limegroup.gnutella.RemoteFileDesc; /** * This class keeps track of browsable <tt>HTTPDownloader</tt> instances for * a single <tt>ManagedDownloader</tt>. It maintains a <tt>List</tt> of * browsable hosts, and returns the most recently added (the most recently * downloaded-from) browsable host upon request. */ final class DownloadBrowseHostList { /** * Constant for the <tt>List</tt> of browsable <tt>HTTPDownloader</tt>s * for this <tt>ManagedDownloader</tt>. */ private final List BROWSE_LIST = new ArrayList(); /** * Returns whether or not there is a browsable host for this download. */ synchronized boolean hasBrowseHostEnabledHost() { return !BROWSE_LIST.isEmpty(); } /** * Returns the first browsable <tt>Endpoint</tt> instance in the list, * or <tt>null</tt> if the list is empty. * * @return the first browsable <tt>RemoteFileDesc</tt> instance in the list, * or <tt>null</tt> if the list is empty. */ synchronized RemoteFileDesc getBrowseHostEnabledHost() { if(BROWSE_LIST.isEmpty()) return null; HTTPDownloader downloader = (HTTPDownloader)BROWSE_LIST.get(BROWSE_LIST.size()-1); return downloader.getRemoteFileDesc(); } /** * Adds a new <tt>HTTPDownloader</tt> to the list of hosts that we * can browse with for this download if the host is browsable. If the * added host is already in the list, this removes it and adds it again * as the freshest host (the one that we will browse with). Similarly, * if the list is getting large (by browse standards), this will remove * the oldest host and add the new one as the freshest one. * * @param host the new <tt>HTTPDownloader</tt> to add if it is browsable */ synchronized void addHost(HTTPDownloader host) { if(!host.browseEnabled()) return; // if this host is already in the list, remove it from the list and // add it as the freshest one if(BROWSE_LIST.contains(host)) { BROWSE_LIST.remove(host); } // if our list of browsable host is growing a bit, just get rid of // the oldest and add the new one if(BROWSE_LIST.size() >= 5) { BROWSE_LIST.remove(0); } BROWSE_LIST.add(host); } /** * Checks if the specified <tt>HTTPDownloader</tt> instance is browsable, * and removes it if it is in the list. * * @param host the <tt>HTTPDownloader</tt> to remove */ synchronized void removeHost(HTTPDownloader host) { if(!host.browseEnabled()) return; BROWSE_LIST.remove(host); } }