package com.limegroup.gnutella.bootstrap; import java.text.ParseException; import org.apache.commons.httpclient.URI; import org.apache.commons.httpclient.URIException; import com.limegroup.gnutella.util.StringUtils; /** * A URL for a GWebCache endpoint, plus some additional connection * history data: * * <ul> * <li>The time this was discovered * <li>The times we were able to connect to this * <li>The times we were unable to connect to this * </ul> * * Written to and read from gnutella.net. * * @see GWebCache * @see HostCatcher */ public class BootstrapServer { //TODO: factor code with ExtendedEndpoint? /** The URL to server's script, e.g., "http://path/to/script.php". */ private final URI _url; /** * Constructs a new BootstrapServer from a URL or an extended * gnutella.net data line. * * @param s single line of the form "http://server.com/path/to/script" or * or "http://server.com/path/to/script,dtime,ctimes,ftimes". In the * extended format, "dtime" is the host discovery time, ctimes is a * semicolon separated list of successful connect times, and ftimes is * semicolon separated list of unsuccessful connect times. * @exception ParseException line could not be be parsed in * either format. The offset is not necessarily set. */ public BootstrapServer(String s) throws ParseException { if (!StringUtils.startsWithIgnoreCase(s, "http")) throw new ParseException(s, 0); try { int i=s.indexOf(","); //TODO: relies on s being URL encoded if (i<0) //simple url _url = new URI(s.toCharArray()); else //extended gnutella.net _url = new URI(s.substring(0,i).toCharArray()); } catch (URIException e) { throw new ParseException(s, 0); } } /** * Returns the URL to the server, minus any request parameters. This is * guaranteed to be non-null. */ public String getURLString() { return _url.toString(); } /** * Returns a parsable represenation of this. This can be reconstructed by * constructing a new BootstrapServer with the returned string as an * argument. Does not include any end-of-line characters. */ public String toString() { return _url.toString(); } /** * Creates an integer suitable for hash table indexing.<p> * The hash code is based upon all the URL components relevant for URL * comparison. As such, this operation is a blocking operation. */ public int hashCode() { return _url.hashCode(); } /** * Returns true if o is a BootStrapServer with the same URL. */ public boolean equals(Object o) { if(o == this) return true; if (o instanceof BootstrapServer) return this._url.equals(((BootstrapServer)o)._url); return false; } }