[kaffe] CVS kaffe (robilad): Resynced with GNU Classpath: class loading fixes

Kaffe CVS cvs-commits at kaffe.org
Tue Feb 15 19:51:50 PST 2005


PatchSet 5551 
Date: 2005/02/16 03:43:33
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
Resynced with GNU Classpath: class loading fixes

2005-02-16  Dalibor Topic  <robilad at kaffe.org>

        Resynced with GNU Classpath.

        2005-02-15  Mark Wielaard  <mark at klomp.org>

        * java/net/URLClassLoader.java (JarURLLoader.JarURLLoader): Just use
        space for parsing CLASS_PATH attribute.

        2005-02-15  Andrew Haley  <aph at redhat.com>

        * java/net/URLClassLoader.java
        (URLLoader.getClassPath): New method.
        (JarURLLoader.JarURLLoader): Read mainfest to parse Class-Path
        attribute and add URLs for each entry.
        (JarURLLoader.classPath): New field.
        (JarURLLoader.getClassPath): New method.
        (addURLImpl): Scan through the list of extraUrls in the new
        loader, adding them to our urlinfos.
        (definePackage, findURLResource, findResources): Use
        urlinfos.size(), not urls.size().

Members: 
	ChangeLog:1.3595->1.3596 
	libraries/javalib/java/net/URLClassLoader.java:1.22->1.23 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3595 kaffe/ChangeLog:1.3596
--- kaffe/ChangeLog:1.3595	Wed Feb 16 03:30:19 2005
+++ kaffe/ChangeLog	Wed Feb 16 03:43:33 2005
@@ -2,6 +2,28 @@
 
 	Resynced with GNU Classpath.
 
+	2005-02-15  Mark Wielaard  <mark at klomp.org>
+
+        * java/net/URLClassLoader.java (JarURLLoader.JarURLLoader): Just use
+        space for parsing CLASS_PATH attribute.
+
+	2005-02-15  Andrew Haley  <aph at redhat.com>
+
+        * java/net/URLClassLoader.java
+        (URLLoader.getClassPath): New method.
+        (JarURLLoader.JarURLLoader): Read mainfest to parse "Class-Path"
+        attribute and add URLs for each entry.
+        (JarURLLoader.classPath): New field.
+        (JarURLLoader.getClassPath): New method.
+        (addURLImpl): Scan through the list of extraUrls in the new
+        loader, adding them to our urlinfos.
+        (definePackage, findURLResource, findResources): Use
+        urlinfos.size(), not urls.size().
+
+2005-02-16  Dalibor Topic  <robilad at kaffe.org>
+
+	Resynced with GNU Classpath.
+
 	2005-02-14  Mark Wielaard  <mark at klomp.org>
 
         * java/net/URLClassLoader.java (findClass): Throw
Index: kaffe/libraries/javalib/java/net/URLClassLoader.java
diff -u kaffe/libraries/javalib/java/net/URLClassLoader.java:1.22 kaffe/libraries/javalib/java/net/URLClassLoader.java:1.23
--- kaffe/libraries/javalib/java/net/URLClassLoader.java:1.22	Wed Feb 16 03:30:24 2005
+++ kaffe/libraries/javalib/java/net/URLClassLoader.java	Wed Feb 16 03:43:37 2005
@@ -55,12 +55,15 @@
 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;
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
 
+
 /**
  * A secure class loader that can load classes and resources from
  * multiple locations.  Given an array of <code>URL</code>s this class
@@ -143,9 +146,10 @@
   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();
 
@@ -214,6 +218,11 @@
     {
       return null;
     }
+
+    Vector getClassPath()
+    {
+      return null;
+    }
   }
 
   /**
@@ -283,6 +292,8 @@
     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
+
     public JarURLLoader(URLClassLoader classloader, URL baseURL)
     {
       super(classloader, baseURL);
@@ -295,19 +306,48 @@
       sb.append("!/");
       String jarURL = sb.toString();
 
+      this.classPath = null;
       URL baseJarURL = null;
       JarFile jarfile = null;
       try
-        {
-          baseJarURL =
-            new URL(null, jarURL, classloader.getURLStreamHandler("jar"));
-
-          jarfile =
-            ((JarURLConnection) baseJarURL.openConnection()).getJarFile();
-        }
+	{
+	  baseJarURL =
+	    new URL(null, jarURL, classloader.getURLStreamHandler("jar"));
+	  
+	  jarfile =
+	    ((JarURLConnection) baseJarURL.openConnection()).getJarFile();
+	  
+	  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, " ");
+	      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;
@@ -341,6 +381,11 @@
           return null;
         }
     }
+
+    Vector getClassPath()
+    {
+      return classPath;
+    }
   }
 
   static final class JarURLResource extends Resource
@@ -650,6 +695,7 @@
    */
   protected void addURL(URL newUrl)
   {
+    urls.add(newUrl);
     addURLImpl(newUrl);
   }
 
@@ -680,8 +726,21 @@
             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);
+	      }
+	  }
+
       }
   }
 
@@ -692,7 +751,7 @@
   private void addURLs(URL[] newUrls)
   {
     for (int i = 0; i < newUrls.length; i++)
-      addURLImpl(newUrls[i]);
+      addURL(newUrls[i]);
   }
 
   /**
@@ -890,7 +949,7 @@
    */
   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);
@@ -961,7 +1020,7 @@
     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);



More information about the kaffe mailing list