package com.limegroup.gnutella.downloader; import java.util.ArrayList; import java.util.List; import com.limegroup.gnutella.Endpoint; /** * This class keeps track of chattable <tt>HTTPDownloader</tt> instances for * a single <tt>ManagedDownloader</tt>. It maintains a <tt>List</tt> of * chat-enabled hosts, and returns the most recently added (the most recently * downloaded-from) chat-enabled host upon request. */ final class DownloadChatList { /** * Constant for the <tt>List</tt> of chattable <tt>HTTPDownloader</tt>s * for this <tt>ManagedDownloader</tt>. */ private final List CHAT_LIST = new ArrayList(); /** * Returns whether or not there is a chat-enabled host for this download. */ synchronized boolean hasChatEnabledHost() { return !CHAT_LIST.isEmpty(); } /** * Returns the first chattable <tt>Endpoint</tt> instance in the list, * or <tt>null</tt> if the list is empty. * * @return the first chattable <tt>Endpoint</tt> instance in the list, * or <tt>null</tt> if the list is empty. */ synchronized Endpoint getChatEnabledHost() { if(CHAT_LIST.isEmpty()) return null; HTTPDownloader downloader = (HTTPDownloader)CHAT_LIST.get(CHAT_LIST.size()-1); return new Endpoint(downloader.getInetAddress().getHostAddress(), downloader.getPort()); } /** * Adds a new <tt>HTTPDownloader</tt> to the list of hosts that we * can chat with for this download if the host is chat-enabled. 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 chat with). Similarly, * if the list is getting large (by chat 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 chat-enabled */ synchronized void addHost(HTTPDownloader host) { if(!host.chatEnabled()) return; // if this host is already in the list, remove it from the list and // add it as the freshest one if(CHAT_LIST.contains(host)) { CHAT_LIST.remove(host); } // if our list of chat-enabled host is growing a bit, just get rid of // the oldest and add the new one if(CHAT_LIST.size() >= 5) { CHAT_LIST.remove(0); } CHAT_LIST.add(host); } /** * Checks if the specified <tt>HTTPDownloader</tt> instance is chat-enabled, * and removes it if it is in the list. * * @param host the <tt>HTTPDownloader</tt> to remove */ synchronized void removeHost(HTTPDownloader host) { if(!host.chatEnabled()) return; CHAT_LIST.remove(host); } }