Network Protocol Java

// URLUtils.java
// $Id: URLUtils.java,v 1.3 2007/02/11 18:39:47 ylafon Exp $
// (c) COPYRIGHT ERCIM, Keio and MIT, 2003.
// Please first read the full copyright statement in file COPYRIGHT.html
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
public class URLUtils {
  static Method url_defport;
  static {
    try {
      Class c = java.net.URL.class;
      url_defport = c.getMethod("getDefaultPort", (Class[]) null);
    } catch (NoSuchMethodException ex) {
      // not using a recent jdk...
      url_defport = null;
    }
  }
  /**
   * Checks that the protocol://host:port part of two URLs are equal.
   * 
   * @param u1,
   *          the first URL to check
   * @param u2,
   *          the second URL to check
   * @return a boolean, true if the protocol://host:port part of the URL are
   *         equals, false otherwise
   */
  public static boolean equalsProtocolHostPort(URL u1, URL u2) {
    if ((u1 == null) || (u2 == null)) {
      return false;
    }
    // check that the protocol are the same (as it impacts the
    // default port check
    if (!u1.getProtocol().equalsIgnoreCase(u2.getProtocol())) {
      return false;
    }
    // check that both hostnames are equal
    if (!u1.getHost().equalsIgnoreCase(u2.getHost())) {
      return false;
    }
    int u1p = u1.getPort();
    int u2p = u2.getPort();
    // if port is ok, it's good!
    if (u1p == u2p) {
      return true;
    } else if ((u1p > 0) && (u2p > 0)) {
      return false;
    }
    // otherwise, the painful comparison of -1 and such
    if (url_defport != null) {
      if (u1p == -1) {
        try {
          int u1dp;
          u1dp = ((Integer) url_defport.invoke(u1, (Object[]) null)).intValue();
          return (u2p == u1dp);
        } catch (InvocationTargetException ex) {
        } catch (IllegalAccessException iex) {
        }
      } else {
        try {
          int u2dp;
          u2dp = ((Integer) url_defport.invoke(u2, (Object[]) null)).intValue();
          return (u1p == u2dp);
        } catch (InvocationTargetException ex) {
        } catch (IllegalAccessException iex) {
        }
      }
    }
    // no JDK 1.4 this is becoming painful...
    if (u1p == -1) {
      String s = u1.getProtocol();
      int u1dp = 0;
      if (s.equalsIgnoreCase("http")) {
        u1dp = 80;
      } else if (s.equalsIgnoreCase("https")) {
        u1dp = 443;
      } // FIXME do others?
      return (u2p == u1dp);
    } else {
      String s = u2.getProtocol();
      int u2dp = 0;
      if (s.equalsIgnoreCase("http")) {
        u2dp = 80;
      } else if (s.equalsIgnoreCase("https")) {
        u2dp = 443;
      } // FIXME do others?
      return (u1p == u2dp);
    }
  }
  /**
   * normalize an URL,
   * 
   * @param u,
   *          the URL to normalize
   * @return a new URL, the normalized version of the parameter, or the u URL,
   *         if something failed in the process
   */
  public static URL normalize(URL u) {
    String proto = u.getProtocol().toLowerCase();
    String host = u.getHost().toLowerCase();
    int port = u.getPort();
    if (port != -1) {
      if (url_defport != null) {
        try {
          int udp;
          udp = ((Integer) url_defport.invoke(u, (Object[]) null)).intValue();
          // we have the default, skip the port part
          if (udp == port) {
            port = -1;
          }
        } catch (InvocationTargetException ex) {
        } catch (IllegalAccessException iex) {
        }
      } else {
        switch (port) {
        case 21:
          if (proto.equals("ftp")) {
            port = -1;
          }
          break;
        case 80:
          if (proto.equals("http")) {
            port = -1;
          }
          break;
        case 443:
          if (proto.equals("https")) {
            port = -1;
          }
          break;
        }
      }
    }
    try {
      URL _nu;
      if (port == -1) {
        _nu = new URL(proto, host, u.getFile());
      } else {
        _nu = new URL(proto, host, port, u.getFile());
      }
      return _nu;
    } catch (MalformedURLException ex) {
    }
    return u;
  }
}