This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Patch: URLClassLoader change


>>>>> "Mark" == Mark Wielaard <mark@klomp.org> writes:

Mark> I attached a slightly rewritten patch.
Mark> (Note that it compiles, but that is all testing that I done).

Thanks.  I found one minor bug in the new static method.
New patch appended.  I'll check it in later today.

Tom

from  Mark Wielaard  <mark@klomp.org>
	Tom Tromey  <tromey@redhat.com>

	* java/net/URLClassLoader.java (getCanonicalFileURL): New method.
	(JarURLLoader): Use it.
	(FileURLLoader): Likewise.
	(JarURLResource.getURL): Use chained exception.
	(FileResource.getURL): Likewise.
	(FileURLLoader.getResource): Use canonical file name.
	(addURL): Indentation fix.

Index: java/net/URLClassLoader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/net/URLClassLoader.java,v
retrieving revision 1.11
diff -u -r1.11 URLClassLoader.java
--- java/net/URLClassLoader.java 9 Dec 2002 00:04:00 -0000 1.11
+++ java/net/URLClassLoader.java 10 Dec 2002 23:49:28 -0000
@@ -212,7 +212,7 @@
       return null;
     }
   }
-    
+
   /** 
    * A <code>Resource</code> represents a resource in some
    * <code>URLLoader</code>. It also contains all information (e.g.,
@@ -271,6 +271,22 @@
     abstract InputStream getInputStream() throws IOException;
   }
 
+  static URL getCanonicalFileURL(URL url)
+  {
+    if ("file".equals(url.getProtocol()))
+      {
+	try
+	  {
+	    File f = new File(url.getFile()).getCanonicalFile();
+	    url = new URL("file", "", f.toString());
+	  }
+	catch (IOException ignore)
+	  {
+	  }
+      }
+    return url;
+  }
+
   /**
    * A <code>JarURLLoader</code> is a type of <code>URLLoader</code>
    * only loading from jar url.
@@ -282,8 +298,8 @@
 
     public JarURLLoader(URLClassLoader classloader, URL baseURL)
     {
-      super(classloader, baseURL);
-        
+      super(classloader, getCanonicalFileURL(baseURL));
+
       // cache url prefix for all resources in this jar url
       String external = baseURL.toExternalForm();
       StringBuffer sb = new StringBuffer(external.length() + 6);
@@ -306,7 +322,7 @@
       this.baseJarURL = baseJarURL;
       this.jarfile = jarfile;
     }
-    
+
     /** get resource with the name "name" in the jar url */
     Resource getResource(String name)
     {
@@ -331,7 +347,6 @@
 	  return null;
 	}
     }
-      
   }
 
   final static class JarURLResource extends Resource
@@ -358,7 +373,7 @@
     {
       return entry.getCertificates();
     }
-                
+
     URL getURL()
     {
       try
@@ -368,7 +383,9 @@
 	}
       catch(MalformedURLException e)
 	{
-	  throw new InternalError(e.toString());
+	  InternalError ie = new InternalError();
+	  ie.initCause(e);
+	  throw ie;
 	}
     }
   }
@@ -468,19 +485,24 @@
 
     FileURLLoader(URLClassLoader classloader, URL url)
     {
-      super(classloader, url);
-      // Note that this must be a "file" protocol URL.
-      dir = new File(url.getFile());
+      super(classloader, getCanonicalFileURL(url));
+      dir = new File(baseURL.getFile());
     }
-    
+
     /** get resource with the name "name" in the file url */
     Resource getResource(String name)
     {
       File file = new File(dir, name);
+      try
+	{
+	  file = file.getCanonicalFile();
+	}
+      catch (IOException ignore)
+	{
+	}
       if (file.exists() && !file.isDirectory())
 	return new FileResource(this, name, file);
-      else
-	return null;
+      return null;
     }
   }
 
@@ -503,7 +525,7 @@
     {
       return (int)file.length();
     }
-                
+
     public URL getURL()
     {
       try
@@ -513,7 +535,9 @@
 	}
       catch(MalformedURLException e)
 	{
-	  throw new InternalError(e.toString());
+	  InternalError ie = new InternalError();
+	  ie.initCause(e);
+	  throw ie;
 	}
     }
   }
@@ -667,13 +691,12 @@
 	  {
 	    String file = newUrl.getFile();
 	    // Check that it is not a directory
-	    if (!(file.endsWith("/") || file.endsWith(File.separator)))
+	    if (! (file.endsWith("/") || file.endsWith(File.separator)))
 	      loader = new JarURLLoader(this, newUrl);
-	    else // it's a url that point to a jar file
-	      if ("file".equals(newUrl.getProtocol()))
-		loader = new FileURLLoader(this, newUrl);
-	      else
-		loader = new RemoteURLLoader(this, newUrl);
+	    else if ("file".equals(newUrl.getProtocol()))
+	      loader = new FileURLLoader(this, newUrl);
+	    else
+	      loader = new RemoteURLLoader(this, newUrl);
 
 	    // cache it
 	    urlloaders.put(newUrl, loader);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]