Java tutorial
// 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; } }