From d59da9db7d82ac496f89c83eeea11bfa2b997fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Op=C3=A1lka?= Date: Wed, 14 Dec 2016 22:22:45 +0100 Subject: [PATCH 1/4] Removing hack detecting if class loader is registered as parallel capable --- src/main/java/org/jboss/modules/JDKSpecific.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/jboss/modules/JDKSpecific.java b/src/main/java/org/jboss/modules/JDKSpecific.java index 35c5159..04a30f6 100644 --- a/src/main/java/org/jboss/modules/JDKSpecific.java +++ b/src/main/java/org/jboss/modules/JDKSpecific.java @@ -91,9 +91,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) { From c8a4c18a65e1114df48e821d024c3af29b22bc04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Op=C3=A1lka?= Date: Wed, 14 Dec 2016 22:26:06 +0100 Subject: [PATCH 2/4] Refactoring static fields visibility from 'package private' to 'private' --- src/main/java/org/jboss/modules/JDKSpecific.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jboss/modules/JDKSpecific.java b/src/main/java/org/jboss/modules/JDKSpecific.java index 04a30f6..adb46db 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 === From 377d055208d5fcab88cb7ec9f0f731539ce0e3a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Op=C3=A1lka?= Date: Wed, 14 Dec 2016 22:35:08 +0100 Subject: [PATCH 3/4] Refactoring - performance improvement. Don't call getter but use field directly. --- src/main/java/org/jboss/modules/JDKSpecific.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jboss/modules/JDKSpecific.java b/src/main/java/org/jboss/modules/JDKSpecific.java index adb46db..6b39c2c 100644 --- a/src/main/java/org/jboss/modules/JDKSpecific.java +++ b/src/main/java/org/jboss/modules/JDKSpecific.java @@ -111,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); @@ -122,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); } @@ -147,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); } From 2e0b6a3476d3cae4e05580b45712bb0d0598427d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Op=C3=A1lka?= Date: Tue, 20 Dec 2016 11:55:16 +0100 Subject: [PATCH 4/4] [MODULES-277][MODULES-270] fixing problem where ClassLoader.definePackage() can throw IAE on JDK9 --- .../org/jboss/modules/NamedClassLoader.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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; + } }