This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Re: Patch: URLClassLoader change
- From: Tom Tromey <tromey at redhat dot com>
- To: Mark Wielaard <mark at klomp dot org>
- Cc: Java Patch List <java-patches at gcc dot gnu dot org>
- Date: 10 Dec 2002 16:49:45 -0700
- Subject: Re: Patch: URLClassLoader change
- References: <871y4qwxyz.fsf@fleche.redhat.com><1039550858.7431.34.camel@elsschot>
- Reply-to: tromey at redhat dot com
>>>>> "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);