PR classpath/20198:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Jan 2006 23:25:12 +0000 (23:25 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 17 Jan 2006 23:25:12 +0000 (23:25 +0000)
* java/net/URLClassLoader.java (FileURLLoader): Added argument.
(JarURLLoader): Likewise.
(addURLImpl): Canonicalize file URLs.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109844 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/net/URLClassLoader.java

index f8df781..9b8dff9 100644 (file)
@@ -1,3 +1,10 @@
+2006-01-17  Tom Tromey  <tromey@redhat.com>
+
+       PR classpath/20198:
+       * java/net/URLClassLoader.java (FileURLLoader): Added argument.
+       (JarURLLoader): Likewise.
+       (addURLImpl): Canonicalize file URLs.
+
 2006-01-16  Mark Wielaard  <mark@klomp.org>
 
        Imported GNU Classpath 0.20
index 5bb0337..ada4b63 100644 (file)
@@ -1,5 +1,5 @@
 /* URLClassLoader.java --  ClassLoader that loads classes from one or more URLs
-   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
@@ -305,9 +305,10 @@ public class URLClassLoader extends SecureClassLoader
 
     Vector classPath;  // The "Class-Path" attribute of this Jar's manifest
 
-    public JarURLLoader(URLClassLoader classloader, URL baseURL)
+    public JarURLLoader(URLClassLoader classloader, URL baseURL,
+                       URL absoluteUrl)
     {
-      super(classloader, baseURL);
+      super(classloader, baseURL, absoluteUrl);
 
       // Cache url prefix for all resources in this jar url.
       String external = baseURL.toExternalForm();
@@ -601,10 +602,10 @@ public class URLClassLoader extends SecureClassLoader
   {
     File dir; //the file for this file url
 
-    FileURLLoader(URLClassLoader classloader, URL url)
+    FileURLLoader(URLClassLoader classloader, URL url, URL absoluteUrl)
     {
-      super(classloader, url);
-      dir = new File(baseURL.getFile());
+      super(classloader, url, absoluteUrl);
+      dir = new File(absoluteUrl.getFile());
     }
 
     /** get resource with the name "name" in the file url */
@@ -885,13 +886,44 @@ public class URLClassLoader extends SecureClassLoader
             String file = newUrl.getFile();
             String protocol = newUrl.getProtocol();
 
+           // If we have a file: URL, we want to make it absolute
+           // here, before we decide whether it is really a jar.
+           URL absoluteURL;
+           if ("file".equals (protocol))
+             {
+               File dir = new File(file);
+               URL absUrl;
+               try
+                 {
+                   absoluteURL = dir.getCanonicalFile().toURL();
+                 }
+               catch (IOException ignore)
+                 {
+                   try
+                     {
+                       absoluteURL = dir.getAbsoluteFile().toURL();
+                     }
+                   catch (MalformedURLException _)
+                     {
+                       // This really should not happen.
+                       absoluteURL = newUrl;
+                     }
+                 }
+             }
+           else
+             {
+               // This doesn't hurt, and it simplifies the logic a
+               // little.
+               absoluteURL = newUrl;
+             }
+
             // Check that it is not a directory
            if ("gcjlib".equals(protocol))
              loader = new SoURLLoader(this, newUrl);
            else if (! (file.endsWith("/") || file.endsWith(File.separator)))
-              loader = new JarURLLoader(this, newUrl);
+              loader = new JarURLLoader(this, newUrl, absoluteURL);
             else if ("file".equals(protocol))
-              loader = new FileURLLoader(this, newUrl);
+             loader = new FileURLLoader(this, newUrl, absoluteURL);
            else if ("core".equals(protocol))
              loader = new CoreURLLoader(this, newUrl);
             else