Skip to content
This repository was archived by the owner on Apr 28, 2018. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 11 additions & 14 deletions src/main/java/org/jboss/modules/JDKSpecific.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,17 @@ final class JDKSpecific {

// === private fields and data ===

static final Set<String> MODULES_PACKAGES = new HashSet<>(Arrays.asList(
private static final StackWalker STACK_WALKER = doPrivileged((PrivilegedAction<StackWalker>) () -> StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE));
private static final ClassLoader PLATFORM_CLASS_LOADER = doPrivileged((PrivilegedAction<ClassLoader>) ClassLoader::getPlatformClassLoader);
private static final ClassLoader OUR_CLASS_LOADER = JDKSpecific.class.getClassLoader();
private static final Set<String> MODULES_PACKAGES = new HashSet<>(Arrays.asList(
"org/jboss/modules",
"org/jboss/modules/filter",
"org/jboss/modules/log",
"org/jboss/modules/management",
"org/jboss/modules/ref"
));

static final StackWalker STACK_WALKER = doPrivileged((PrivilegedAction<StackWalker>) () -> StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE));

static final ClassLoader PLATFORM_CLASS_LOADER = doPrivileged((PrivilegedAction<ClassLoader>) ClassLoader::getPlatformClassLoader);
static final ClassLoader OUR_CLASS_LOADER = JDKSpecific.class.getClassLoader();

// === the actual JDK-specific API ===

Expand All @@ -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) {
Expand All @@ -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);
Expand All @@ -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);
}

Expand All @@ -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<URL> getSystemResources(final String name) throws IOException {
final Enumeration<URL> resources = getPlatformClassLoader().getResources(name);
final Enumeration<URL> 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);
}
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/org/jboss/modules/NamedClassLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 <a href="mailto:[email protected]">David M. Lloyd</a>
* @author <a href="mailto:[email protected]">Richard Opalka</a>
*/
public abstract class NamedClassLoader extends ClassLoader {
static {
Expand Down Expand Up @@ -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;
}
}