* Merged gcj-abi-2-dev-branch to trunk.
(Actual changes too large to list in the commit message; see ChangeLog.) From-SVN: r91270
This commit is contained in:
parent
ec0641f612
commit
367390404d
70 changed files with 11301 additions and 3355 deletions
|
@ -54,6 +54,8 @@ import java.security.SecureClassLoader;
|
|||
import java.security.cert.Certificate;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.Vector;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.JarEntry;
|
||||
|
@ -144,9 +146,10 @@ public class URLClassLoader extends SecureClassLoader
|
|||
private final Vector urls = new Vector();
|
||||
|
||||
/**
|
||||
* Store pre-parsed information for each url into this vector
|
||||
* each element is a URL loader, corresponding to the URL of
|
||||
* the same index in "urls"
|
||||
* Store pre-parsed information for each url into this vector: each
|
||||
* element is a URL loader. A jar file has its own class-path
|
||||
* attribute which adds to the URLs that will be searched, but this
|
||||
* does not add to the list of urls.
|
||||
*/
|
||||
private final Vector urlinfos = new Vector();
|
||||
|
||||
|
@ -188,10 +191,15 @@ public class URLClassLoader extends SecureClassLoader
|
|||
final CodeSource noCertCodeSource;
|
||||
|
||||
URLLoader(URLClassLoader classloader, URL baseURL)
|
||||
{
|
||||
this(classloader, baseURL, baseURL);
|
||||
}
|
||||
|
||||
URLLoader(URLClassLoader classloader, URL baseURL, URL overrideURL)
|
||||
{
|
||||
this.classloader = classloader;
|
||||
this.baseURL = baseURL;
|
||||
this.noCertCodeSource = new CodeSource(baseURL, null);
|
||||
this.noCertCodeSource = new CodeSource(overrideURL, null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -221,6 +229,11 @@ public class URLClassLoader extends SecureClassLoader
|
|||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Vector getClassPath()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -290,6 +303,10 @@ public class URLClassLoader extends SecureClassLoader
|
|||
final JarFile jarfile; // The jar file for this url
|
||||
final URL baseJarURL; // Base jar: url for all resources loaded from jar
|
||||
|
||||
Vector classPath; // The "Class-Path" attribute of this Jar's manifest
|
||||
|
||||
SoURLLoader soURLLoader;
|
||||
|
||||
public JarURLLoader(URLClassLoader classloader, URL baseURL)
|
||||
{
|
||||
super(classloader, baseURL);
|
||||
|
@ -302,25 +319,87 @@ public class URLClassLoader extends SecureClassLoader
|
|||
sb.append("!/");
|
||||
String jarURL = sb.toString();
|
||||
|
||||
this.soURLLoader = null;
|
||||
this.classPath = null;
|
||||
URL baseJarURL = null;
|
||||
JarFile jarfile = null;
|
||||
try
|
||||
{
|
||||
baseJarURL =
|
||||
new URL(null, jarURL, classloader.getURLStreamHandler("jar"));
|
||||
{
|
||||
baseJarURL
|
||||
= new URL(null, jarURL, classloader.getURLStreamHandler("jar"));
|
||||
jarfile
|
||||
= ((JarURLConnection) baseJarURL.openConnection()).getJarFile();
|
||||
|
||||
jarfile =
|
||||
((JarURLConnection) baseJarURL.openConnection()).getJarFile();
|
||||
}
|
||||
if (jarfile != null)
|
||||
{
|
||||
String fileName = baseURL.getFile();
|
||||
if (fileName != null)
|
||||
{
|
||||
File f = new File(fileName);
|
||||
String libDirName = f.getCanonicalFile().getParent()
|
||||
+ File.separator + "GCJLIBS";
|
||||
File libDir = new File(libDirName);
|
||||
if (libDir != null && (libDir.isDirectory()))
|
||||
{
|
||||
File soFile = new File (libDirName
|
||||
+ File.separator + f.getName()
|
||||
+ ".so");
|
||||
if (soFile != null && soFile.isFile())
|
||||
this.soURLLoader
|
||||
= new SoURLLoader (classloader, soFile.toURL(),
|
||||
baseURL);
|
||||
}
|
||||
}
|
||||
|
||||
Manifest manifest;
|
||||
Attributes attributes;
|
||||
String classPathString;
|
||||
|
||||
if ((manifest = jarfile.getManifest()) != null
|
||||
&& (attributes = manifest.getMainAttributes()) != null
|
||||
&& ((classPathString
|
||||
= attributes.getValue(Attributes.Name.CLASS_PATH))
|
||||
!= null))
|
||||
{
|
||||
this.classPath = new Vector();
|
||||
|
||||
StringTokenizer st
|
||||
= new StringTokenizer
|
||||
(classPathString,
|
||||
System.getProperty ("path.separator", ":"));
|
||||
|
||||
while (st.hasMoreElements ())
|
||||
{
|
||||
String e = st.nextToken ();
|
||||
try
|
||||
{
|
||||
URL url = new URL(baseURL, e);
|
||||
this.classPath.add(url);
|
||||
}
|
||||
catch (java.net.MalformedURLException xx)
|
||||
{
|
||||
// Give up
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (IOException ioe)
|
||||
{
|
||||
/* ignored */
|
||||
/* ignored */
|
||||
}
|
||||
|
||||
this.baseJarURL = baseJarURL;
|
||||
this.jarfile = jarfile;
|
||||
}
|
||||
|
||||
Class getClass(String className)
|
||||
{
|
||||
if (soURLLoader != null)
|
||||
return soURLLoader.getClass(className);
|
||||
return null;
|
||||
}
|
||||
|
||||
/** get resource with the name "name" in the jar url */
|
||||
Resource getResource(String name)
|
||||
{
|
||||
|
@ -337,6 +416,11 @@ public class URLClassLoader extends SecureClassLoader
|
|||
return null;
|
||||
}
|
||||
|
||||
public String toString ()
|
||||
{
|
||||
return "jarfile " + jarfile.getName();
|
||||
}
|
||||
|
||||
Manifest getManifest()
|
||||
{
|
||||
try
|
||||
|
@ -348,6 +432,11 @@ public class URLClassLoader extends SecureClassLoader
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Vector getClassPath()
|
||||
{
|
||||
return classPath;
|
||||
}
|
||||
}
|
||||
|
||||
static final class JarURLResource extends Resource
|
||||
|
@ -486,7 +575,12 @@ public class URLClassLoader extends SecureClassLoader
|
|||
|
||||
SoURLLoader(URLClassLoader classloader, URL url)
|
||||
{
|
||||
super(classloader, url);
|
||||
this(classloader, url, url);
|
||||
}
|
||||
|
||||
SoURLLoader(URLClassLoader classloader, URL url, URL overrideURL)
|
||||
{
|
||||
super(classloader, url, overrideURL);
|
||||
helper = SharedLibHelper.findHelper(classloader, url.getFile(),
|
||||
noCertCodeSource);
|
||||
}
|
||||
|
@ -577,6 +671,11 @@ public class URLClassLoader extends SecureClassLoader
|
|||
return (int) file.length();
|
||||
}
|
||||
|
||||
public String toString ()
|
||||
{
|
||||
return "file " +file.getAbsolutePath();
|
||||
}
|
||||
|
||||
public URL getURL()
|
||||
{
|
||||
try
|
||||
|
@ -729,6 +828,7 @@ public class URLClassLoader extends SecureClassLoader
|
|||
*/
|
||||
protected void addURL(URL newUrl)
|
||||
{
|
||||
urls.add(newUrl);
|
||||
addURLImpl(newUrl);
|
||||
}
|
||||
|
||||
|
@ -761,8 +861,21 @@ public class URLClassLoader extends SecureClassLoader
|
|||
urlloaders.put(newUrl, loader);
|
||||
}
|
||||
|
||||
urls.add(newUrl);
|
||||
urlinfos.add(loader);
|
||||
urlinfos.add(loader);
|
||||
|
||||
Vector extraUrls = loader.getClassPath();
|
||||
if (extraUrls != null)
|
||||
{
|
||||
Iterator it = extraUrls.iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
URL url = (URL)it.next();
|
||||
URLLoader extraLoader = (URLLoader) urlloaders.get(url);
|
||||
if (! urlinfos.contains (extraLoader))
|
||||
addURLImpl(url);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -773,7 +886,7 @@ public class URLClassLoader extends SecureClassLoader
|
|||
private void addURLs(URL[] newUrls)
|
||||
{
|
||||
for (int i = 0; i < newUrls.length; i++)
|
||||
addURLImpl(newUrls[i]);
|
||||
addURL(newUrls[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -830,7 +943,7 @@ public class URLClassLoader extends SecureClassLoader
|
|||
{
|
||||
// Just try to find the resource by the (almost) same name
|
||||
String resourceName = className.replace('.', '/') + ".class";
|
||||
int max = urls.size();
|
||||
int max = urlinfos.size();
|
||||
Resource resource = null;
|
||||
for (int i = 0; i < max && resource == null; i++)
|
||||
{
|
||||
|
@ -939,7 +1052,7 @@ public class URLClassLoader extends SecureClassLoader
|
|||
*/
|
||||
private Resource findURLResource(String resourceName)
|
||||
{
|
||||
int max = urls.size();
|
||||
int max = urlinfos.size();
|
||||
for (int i = 0; i < max; i++)
|
||||
{
|
||||
URLLoader loader = (URLLoader) urlinfos.elementAt(i);
|
||||
|
@ -1010,7 +1123,7 @@ public class URLClassLoader extends SecureClassLoader
|
|||
throws IOException
|
||||
{
|
||||
Vector resources = new Vector();
|
||||
int max = urls.size();
|
||||
int max = urlinfos.size();
|
||||
for (int i = 0; i < max; i++)
|
||||
{
|
||||
URLLoader loader = (URLLoader) urlinfos.elementAt(i);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue