URL.java (systemClassLoader): New static field.
authorMark Wielaard <mark@klomp.org>
Fri, 24 Sep 2004 08:02:09 +0000 (08:02 +0000)
committerMichael Koch <mkoch@gcc.gnu.org>
Fri, 24 Sep 2004 08:02:09 +0000 (08:02 +0000)
2004-09-24  Mark Wielaard  <mark@klomp.org>

* 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
libjava/java/net/URL.java

index 011bae2b973f22398cd3a2580a2fb0e154969fd2..1399a55ee70f1b302731ad3139f98e86b8e39a70 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-24  Mark Wielaard  <mark@klomp.org>
+
+       * 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 <guilhem@kaffe.org>
 
        * java/net/URL.java
index 71e43583736ca569c46d4ae7030760a8c5c7521f..7bbbd982deb8a228bd73ac5621f58337673bc486 100644 (file)
@@ -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, "|");
 
-       do
+       // Cache the systemClassLoader
+       if (systemClassLoader == null)
          {
-           String clsName =
-             (pkgPrefix.nextToken() + "." + protocol + ".Handler");
+           systemClassLoader = (ClassLoader) AccessController.doPrivileged
+             (new PrivilegedAction() {
+                 public Object run() {
+                   return ClassLoader.getSystemClassLoader();
+                 }
+               });
+         }
 
+       do
+         {
            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;
   }