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