diff --git a/o.n.bootstrap/src/org/netbeans/ProxyClassLoader.java b/o.n.bootstrap/src/org/netbeans/ProxyClassLoader.java --- a/o.n.bootstrap/src/org/netbeans/ProxyClassLoader.java +++ b/o.n.bootstrap/src/org/netbeans/ProxyClassLoader.java @@ -227,7 +227,28 @@ if (shouldDelegateResource(path, null)) cls = systemCL.loadClass(name); }*/ } else { - cls = doLoadClassFromParents(del, path, pkg, name, cls); + // multicovered package, search in order + for (ProxyClassLoader pcl : parents) { // all our accessible parents + if (del.contains(pcl) && shouldDelegateResource(path, pcl)) { // that cover given package + Class _cls = pcl.selfLoadClass(pkg, name); + if (_cls != null) { + if (cls == null) { + cls = _cls; + } else if (cls != _cls) { + String message = "Will not load class " + name + " arbitrarily from one of " + + cls.getClassLoader() + " and " + pcl + " starting from " + this + + "; see http://wiki.netbeans.org/DevFaqModuleCCE"; + ClassNotFoundException cnfe = new ClassNotFoundException(message); + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, null, cnfe); + } else { + LOGGER.warning(message); + } + throw cnfe; + } + } + } + } if (cls == null && del.contains(this)) cls = selfLoadClass(pkg, name); if (cls != null) sclPackages.put(pkg, false); } @@ -235,13 +256,7 @@ try { cls = systemCL.loadClass(name); } catch (ClassNotFoundException e) { - cls = doLoadClassFromParents(null, path, pkg, name, cls); - if (cls == null) { - cls = selfLoadClass(pkg, name); - if (cls == null) { - throw new ClassNotFoundException(diagnosticCNFEMessage(e.getMessage(), del), e); - } - } + throw new ClassNotFoundException(diagnosticCNFEMessage(e.getMessage(), del), e); } } if (cls == null) { @@ -271,33 +286,6 @@ " and declared parents " + parentSetS; } - private Class doLoadClassFromParents(Set del, final String path, String pkg, String name, Class cls) throws ClassNotFoundException { - // multicovered package, search in order - for (ProxyClassLoader pcl : parents) { // all our accessible parents - if (del == null || (del.contains(pcl) && shouldDelegateResource(path, pcl))) { - // that cover given package - Class _cls = pcl.selfLoadClass(pkg, name); - if (_cls != null) { - if (cls == null) { - cls = _cls; - } else if (cls != _cls) { - String message = "Will not load class " + name + " arbitrarily from one of " + - cls.getClassLoader() + " and " + pcl + " starting from " + this + - "; see http://wiki.netbeans.org/DevFaqModuleCCE"; - ClassNotFoundException cnfe = new ClassNotFoundException(message); - if (LOGGER.isLoggable(Level.FINE)) { - LOGGER.log(Level.FINE, null, cnfe); - } else { - LOGGER.warning(message); - } - throw cnfe; - } - } - } - } - return cls; - } - /** May return null */ private synchronized Class selfLoadClass(String pkg, String name) { Class cls = findLoadedClass(name); @@ -393,9 +381,6 @@ // uncovered package, go directly to SCL if (url == null && shouldDelegateResource(path, null)) url = systemCL.getResource(name); - if (url == null) { - url = findResource(name); - } return url; } diff --git a/o.n.bootstrap/test/unit/src/org/netbeans/ModuleFactoryAlienTest.java b/o.n.bootstrap/test/unit/src/org/netbeans/ModuleFactoryAlienTest.java --- a/o.n.bootstrap/test/unit/src/org/netbeans/ModuleFactoryAlienTest.java +++ b/o.n.bootstrap/test/unit/src/org/netbeans/ModuleFactoryAlienTest.java @@ -172,7 +172,6 @@ } public static class Factory extends ModuleFactory { - private static Set registered; static void clear() { } @@ -355,7 +354,6 @@ } @Override - @SuppressWarnings(value = "unchecked") public Enumeration findResources(String name) { return Enumerations.empty(); } @@ -365,12 +363,25 @@ if (name.equals("org.fakepkg.FakeIfce")) { return FakeIfceHidden.class; } - try { - return l == null ? null : l.loadClass(name); - } catch (ClassNotFoundException ex) { - ex.printStackTrace(); - return null; + return null; + } + + @Override + protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + Class c = findLoadedClass(name); + if (c != null) { + return c; } + if (l != null) { + try { + c = l.loadClass(name); + if (resolve) { + resolveClass(c); + } + return c; + } catch (ClassNotFoundException x) {} + } + return super.loadClass(name, resolve); } @Override diff --git a/o.n.bootstrap/test/unit/src/org/netbeans/ProxyClassLoaderTest.java b/o.n.bootstrap/test/unit/src/org/netbeans/ProxyClassLoaderTest.java --- a/o.n.bootstrap/test/unit/src/org/netbeans/ProxyClassLoaderTest.java +++ b/o.n.bootstrap/test/unit/src/org/netbeans/ProxyClassLoaderTest.java @@ -49,8 +49,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; -import java.util.HashSet; -import java.util.Set; import org.fakepkg.FakeIfceHidden; import org.openide.util.Enumerations; import org.openide.util.Exceptions; @@ -196,11 +194,9 @@ ClassLoader l; - public Loader(String publicPackage) throws MalformedURLException { + public Loader(String... publicPackages) throws MalformedURLException { super(new ClassLoader[0], true); - Set pkgs = new HashSet(); - pkgs.add(publicPackage); - addCoveredPackages(pkgs); + addCoveredPackages(Arrays.asList(publicPackages)); } @Override @@ -214,7 +210,6 @@ } @Override - @SuppressWarnings(value = "unchecked") public Enumeration findResources(String name) { return Enumerations.empty(); } @@ -224,12 +219,25 @@ if (name.equals("org.fakepkg.FakeIfce")) { return FakeIfceHidden.class; } - try { - return l == null ? null : l.loadClass(name); - } catch (ClassNotFoundException ex) { - ex.printStackTrace(); - return null; + return null; + } + + @Override + protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + Class c = findLoadedClass(name); + if (c != null) { + return c; } + if (l != null) { + try { + c = l.loadClass(name); + if (resolve) { + resolveClass(c); + } + return c; + } catch (ClassNotFoundException x) {} + } + return super.loadClass(name, resolve); } @Override @@ -241,7 +249,7 @@ File j1 = new File(jars, "simple-module.jar"); ClassLoader l1 = new URLClassLoader(new URL[] { j1.toURI().toURL() }); - Loader loader = new Loader("org.bar"); + Loader loader = new Loader("org.bar", "org.fakepkg"); File jar = new File(jars, "depends-on-simple-module.jar"); loader.l = new URLClassLoader(new URL[] { jar.toURI().toURL() }, l1);