package com.limegroup.gnutella.util; import java.net.InetAddress; import java.util.Comparator; /** * Utility interface that allows class containing host information to be * used generically. */ public interface IpPort { /** * Accessor for the <tt>InetAddress</tt> for this host. * * @return the <tt>InetAddress</tt> for this host */ InetAddress getInetAddress(); /** * Accessor for the port this host is listening on. * * @return the port this host is listening on */ int getPort(); /** * Accessor for the address string. * * @return the address of this host as a string */ String getAddress(); /** * The sole comparator to use for IpPort objects. */ public static final Comparator COMPARATOR = new IpPortComparator(); /** * A comparator to compare IpPort objects. * * This is useful for when a variety of objects that implement IpPort * want to be placed in a Set. Since it is difficult (near impossible) * to enforce that they all maintain a valid contract with regards * to hashCode & equals, the only valid way to enforce Set equality * is to use a Comparator that is based on the IpPortness. */ public static class IpPortComparator implements Comparator { public int compare(Object a, Object b) { if(a == b) return 0; IpPort ip1 = (IpPort)a; IpPort ip2 = (IpPort)b; int diff = ip1.getPort() - ip2.getPort(); if(diff == 0) { byte[] neta = ip1.getInetAddress().getAddress(); byte[] netb = ip2.getInetAddress().getAddress(); if(neta[0] == netb[0]) { if(neta[1] == netb[1]) { if(neta[2] == netb[2]) { if(neta[3] == netb[3]) { return 0; } else { return neta[3] - netb[3]; } } else { return neta[2] - netb[2]; } } else { return neta[1] - netb[1]; } } else { return neta[0] - netb[0]; } } else return diff; } } }