URLUtils.java Source code

Java tutorial

Introduction

Here is the source code for URLUtils.java

Source

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