You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ap...@apache.org on 2006/12/26 14:55:39 UTC

svn commit: r490298 - in /harmony/enhanced/classlib/trunk/modules/luni/src: main/java/java/net/URLClassLoader.java test/java/tests/api/java/net/URLClassLoaderTest.java

Author: apetrenko
Date: Tue Dec 26 05:55:38 2006
New Revision: 490298

URL: http://svn.apache.org/viewvc?view=rev&rev=490298
Log:
Patch for HARMONY-2871 "[classlib][luni] URLClassLoader invalidates it's state if there is invalid URLs in its urls list"

Modified:
    harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/URLClassLoader.java
    harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/URLClassLoaderTest.java

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/URLClassLoader.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/URLClassLoader.java?view=diff&rev=490298&r1=490297&r2=490298
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/URLClassLoader.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/URLClassLoader.java Tue Dec 26 05:55:38 2006
@@ -33,6 +33,7 @@
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.IdentityHashMap;
 import java.util.List;
@@ -64,6 +65,8 @@
 
     URL[] urls, orgUrls;
 
+    HashSet invalidUrls = new HashSet();
+
     private IdentityHashMap<URL, JarFile> resCache = new IdentityHashMap<URL, JarFile>(32);
 
     private URLStreamHandlerFactory factory;
@@ -245,12 +248,10 @@
     Vector<URL> findResources(URL[] searchURLs, String name, Vector<URL> result) {
         boolean findInExtensions = searchURLs == urls;
         for (int i = 0; i < searchURLs.length; i++) {
-            if (searchURLs[i] != null) {
+            if (!invalidUrls.contains(searchURLs[i])) {
                 URL[] search = new URL[] { searchURLs[i] };
                 URL res = findResourceImpl(search, name);
-                if (search[0] == null) {
-                    searchURLs[i] = null;
-                } else {
+                if (!invalidUrls.contains(search[0])) {
                     if (res != null && !result.contains(res)) {
                         result.addElement(res);
                     }
@@ -360,9 +361,7 @@
                     URL[] search = new URL[] { newExtensions[k] };
                     if (resources != null) {
                         URL res = findResourceImpl(search, name);
-                        if (search[0] == null) { // the URL does not exist
-                            newExtensions[k] = null;
-                        } else {
+                        if (!invalidUrls.contains(search[0])) { // the URL does not exist
                             if (res != null && !resources.contains(res)) {
                                 resources.addElement(res);
                             }
@@ -379,9 +378,7 @@
                         if (result != null) {
                             return result;
                         }
-                        if (search[0] == null) { // the URL does not exist
-                            newExtensions[k] = null;
-                        } else {
+                        if (!invalidUrls.contains(search[0])) { // the URL exists
                             result = findInExtensions(explore(newExtensions[k],
                                     i), name, i, null, url);
                             if (result != null) {
@@ -694,7 +691,9 @@
         boolean findInExtensions = searchList == urls;
         int i = 0;
         while (i < searchList.length) {
-            if (searchList[i] != null) {
+            if (searchList[i] == null) {
+                throw new NullPointerException("One of urls is null");
+            } else if(!invalidUrls.contains(searchList[i])) {
                 JarFile jf = null;
                 try {
                     URL currentUrl = searchList[i];
@@ -717,7 +716,7 @@
                                 resCache.put(currentUrl, jf);
                             } catch (IOException e) {
                                 // Don't look for this jar file again
-                                searchList[i] = null;
+                                invalidUrls.add(searchList[i]);
                                 throw e;
                             }
                         }
@@ -729,7 +728,7 @@
                             int sepIdx = file.lastIndexOf("!/");
                             if (sepIdx == -1) {
                                 // Invalid URL, don't look here again
-                                searchList[i] = null;
+                                invalidUrls.add(searchList[i]);
                                 continue;
                             }
                             sepIdx += 2;
@@ -989,6 +988,9 @@
         final String name = new StringBuffer(clsName.replace('.', '/')).append(
                 ".class").toString(); //$NON-NLS-1$
         for (int i = 0; i < searchURLs.length; i++) {
+            if (searchURLs[i] == null) {
+                throw new NullPointerException("One of urls is null");
+            } else if(!invalidUrls.contains(searchURLs[i])) {
             Manifest manifest = null;
             InputStream is = null;
             JarEntry entry = null;
@@ -1013,7 +1015,7 @@
                             resCache.put(thisURL, jf);
                         } catch (IOException e) {
                             // Don't look for this jar file again
-                            searchURLs[i] = null;
+                            invalidUrls.add(searchURLs[i]);
                             throw e;
                         }
                     }
@@ -1024,7 +1026,7 @@
                         int sepIdx = file.lastIndexOf("!/");
                         if (sepIdx == -1) {
                             // Invalid URL, don't look here again
-                            searchURLs[i] = null;
+                            invalidUrls.add(searchURLs[i]);
                             continue;
                         }
                         sepIdx += 2;
@@ -1152,6 +1154,7 @@
                         return c;
                     }
                 }
+            }
             }
         }
         return null;

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/URLClassLoaderTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/URLClassLoaderTest.java?view=diff&rev=490298&r1=490297&r2=490298
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/URLClassLoaderTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/net/URLClassLoaderTest.java Tue Dec 26 05:55:38 2006
@@ -311,6 +311,22 @@
         } catch (NullPointerException npe) {
             // Expected
         }
+
+        // Regression test for HARMONY-2871.
+        URLClassLoader cl = new URLClassLoader(new URL[] { new URL("file:/foo.jar") });
+
+        try {
+            Class.forName("foo.Foo", false, cl);
+        } catch (Exception ex) {
+            // Don't care
+        }
+
+        try {
+            Class.forName("foo.Foo", false, cl);
+            fail("NullPointerException should be thrown");
+        } catch (ClassNotFoundException cnfe) {
+            // Expected
+        }
     }
 
     /**