From 8ac4bd37068ea73ca55ebeaba16ec72709f0d617 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 24 Sep 2004 08:02:09 +0000 Subject: [PATCH] URL.java (systemClassLoader): New static field. 2004-09-24 Mark Wielaard * java/net/URL.java (systemClassLoader): New static field. (getURLStreamHandler): Always use system/application classloader for finding URLStreamhandler. Remove unecessary instanceof checks. From-SVN: r88018 --- libjava/ChangeLog | 6 +++++ libjava/java/net/URL.java | 48 +++++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 011bae2b973..1399a55ee70 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2004-09-24 Mark Wielaard + + * java/net/URL.java (systemClassLoader): New static field. + (getURLStreamHandler): Always use system/application classloader + for finding URLStreamhandler. Remove unecessary instanceof checks. + 2004-09-24 Guilhem Lavaux * java/net/URL.java diff --git a/libjava/java/net/URL.java b/libjava/java/net/URL.java index 71e43583736..7bbbd982deb 100644 --- a/libjava/java/net/URL.java +++ b/libjava/java/net/URL.java @@ -39,6 +39,8 @@ exception statement from your version. */ package java.net; import gnu.java.net.URLParseError; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; @@ -124,6 +126,9 @@ public final class URL implements Serializable private static final String DEFAULT_SEARCH_PATH = "gnu.java.net.protocol|gnu.inet"; + // Cached System ClassLoader + private static ClassLoader systemClassLoader; + /** * The name of the protocol for this URL. * The protocol is always stored in lower case. @@ -890,36 +895,39 @@ public final class URL implements Serializable // Finally loop through our search path looking for a match. StringTokenizer pkgPrefix = new StringTokenizer(ph_search_path, "|"); + // Cache the systemClassLoader + if (systemClassLoader == null) + { + systemClassLoader = (ClassLoader) AccessController.doPrivileged + (new PrivilegedAction() { + public Object run() { + return ClassLoader.getSystemClassLoader(); + } + }); + } + do { - String clsName = - (pkgPrefix.nextToken() + "." + protocol + ".Handler"); - try { - Object obj = Class.forName(clsName).newInstance(); - - if (! (obj instanceof URLStreamHandler)) - continue; - else - ph = (URLStreamHandler) obj; - } - catch (Exception e) - { - // Can't instantiate; handler still null, - // go on to next element. + // Try to get a class from the system/application + // classloader, initialize it, make an instance + // and try to cast it to a URLStreamHandler. + String clsName = + (pkgPrefix.nextToken() + "." + protocol + ".Handler"); + Class c = Class.forName(clsName, true, systemClassLoader); + ph = (URLStreamHandler) c.newInstance(); } + catch (Throwable t) { /* ignored */ } } - while ((! (ph instanceof URLStreamHandler)) - && pkgPrefix.hasMoreTokens()); + while (ph == null && pkgPrefix.hasMoreTokens()); } // Update the hashtable with the new protocol handler. if (ph != null && cache_handlers) - if (ph instanceof URLStreamHandler) - ph_cache.put(protocol, ph); - else - ph = null; + ph_cache.put(protocol, ph); + else + ph = null; return ph; }