diff --git a/src/main/java/org/jboss/modules/JDKSpecific.java b/src/main/java/org/jboss/modules/JDKSpecific.java index 35c5159..6b39c2c 100644 --- a/src/main/java/org/jboss/modules/JDKSpecific.java +++ b/src/main/java/org/jboss/modules/JDKSpecific.java @@ -57,7 +57,10 @@ final class JDKSpecific { // === private fields and data === - static final Set MODULES_PACKAGES = new HashSet<>(Arrays.asList( + private static final StackWalker STACK_WALKER = doPrivileged((PrivilegedAction) () -> StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)); + private static final ClassLoader PLATFORM_CLASS_LOADER = doPrivileged((PrivilegedAction) ClassLoader::getPlatformClassLoader); + private static final ClassLoader OUR_CLASS_LOADER = JDKSpecific.class.getClassLoader(); + private static final Set MODULES_PACKAGES = new HashSet<>(Arrays.asList( "org/jboss/modules", "org/jboss/modules/filter", "org/jboss/modules/log", @@ -65,10 +68,6 @@ final class JDKSpecific { "org/jboss/modules/ref" )); - static final StackWalker STACK_WALKER = doPrivileged((PrivilegedAction) () -> StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)); - - static final ClassLoader PLATFORM_CLASS_LOADER = doPrivileged((PrivilegedAction) ClassLoader::getPlatformClassLoader); - static final ClassLoader OUR_CLASS_LOADER = JDKSpecific.class.getClassLoader(); // === the actual JDK-specific API === @@ -91,9 +90,7 @@ static Class getCallingClass() { } static boolean isParallelCapable(ConcurrentClassLoader cl) { - // TODO this API isn't merged yet - // return cl.isParallelCapable(); - return ConcurrentClassLoader.getLockForClass(cl, "$TEST$") != cl; + return cl.isRegisteredAsParallelCapable(); } static Package getPackage(ClassLoader cl, String packageName) { @@ -114,7 +111,7 @@ static LocalLoader getSystemLocalLoader() { return new LocalLoader() { public Class loadClassLocal(final String name, final boolean resolve) { try { - return Class.forName(name, resolve, getPlatformClassLoader()); + return Class.forName(name, resolve, PLATFORM_CLASS_LOADER); } catch (ClassNotFoundException ignored) { try { return Class.forName(name, resolve, OUR_CLASS_LOADER); @@ -125,7 +122,7 @@ public Class loadClassLocal(final String name, final boolean resolve) { } public Package loadPackageLocal(final String name) { - final Package pkg = getPackage(getPlatformClassLoader(), name); + final Package pkg = getPackage(PLATFORM_CLASS_LOADER, name); return pkg != null ? pkg : getPackage(OUR_CLASS_LOADER, name); } @@ -150,23 +147,23 @@ static ClassLoader getPlatformClassLoader() { } static URL getSystemResource(final String name) { - final URL resource = getPlatformClassLoader().getResource(name); + final URL resource = PLATFORM_CLASS_LOADER.getResource(name); return resource != null ? resource : OUR_CLASS_LOADER.getResource(name); } static Enumeration getSystemResources(final String name) throws IOException { - final Enumeration resources = getPlatformClassLoader().getResources(name); + final Enumeration resources = PLATFORM_CLASS_LOADER.getResources(name); return resources != null && resources.hasMoreElements() ? resources : OUR_CLASS_LOADER.getResources(name); } static InputStream getSystemResourceAsStream(final String name) { - final InputStream stream = getPlatformClassLoader().getResourceAsStream(name); + final InputStream stream = PLATFORM_CLASS_LOADER.getResourceAsStream(name); return stream != null ? stream : OUR_CLASS_LOADER.getSystemResourceAsStream(name); } static Class getSystemClass(@SuppressWarnings("unused") final ConcurrentClassLoader caller, final String className) throws ClassNotFoundException { try { - return getPlatformClassLoader().loadClass(className); + return PLATFORM_CLASS_LOADER.loadClass(className); } catch (ClassNotFoundException ignored) { return OUR_CLASS_LOADER.loadClass(className); } diff --git a/src/main/java/org/jboss/modules/NamedClassLoader.java b/src/main/java/org/jboss/modules/NamedClassLoader.java index 89f2c42..48b5cb1 100644 --- a/src/main/java/org/jboss/modules/NamedClassLoader.java +++ b/src/main/java/org/jboss/modules/NamedClassLoader.java @@ -18,10 +18,13 @@ package org.jboss.modules; +import java.net.URL; + /** * A class loader that may be named. On Java 9 and later, the name will be propagated up to the JVM. * * @author David M. Lloyd + * @author Richard Opalka */ public abstract class NamedClassLoader extends ClassLoader { static { @@ -57,4 +60,19 @@ protected NamedClassLoader(final String name) { public String getName() { return super.getName(); } + + /** {@inheritDoc} */ + @Override + protected Package definePackage(final String name, final String specTitle, final String specVersion, + final String specVendor, final String implTitle, final String implVersion, + final String implVendor, final URL sealBase) { + Package pkg; + try { + pkg = super.definePackage(name, specTitle, specVersion, specVendor, implTitle, implVersion, implVendor, sealBase); + } catch (final IllegalArgumentException iae) { + pkg = super.getDefinedPackage(name); + if (pkg == null) throw iae; + } + return pkg; + } }