re PR classpath/20198 (java.security.CodeSource.getLocation output is different than expected)

PR classpath/20198:
	* java/net/URLClassLoader.java (FileURLLoader): Added argument.
	(JarURLLoader): Likewise.
	(addURLImpl): Canonicalize file URLs.

From-SVN: r109844
This commit is contained in:
Tom Tromey 2006-01-17 23:25:12 +00:00 committed by Tom Tromey
parent a37a4460b5
commit 96c6b0e22a
2 changed files with 47 additions and 8 deletions

View 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

View 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