From: Robert Varga Date: Mon, 9 Apr 2018 13:38:33 +0000 (+0200) Subject: Improve ClassLoaderUtils.loadClassWithTCCL() X-Git-Tag: v2.0.4~28 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=b158e4f783ea985731cd39fd0458afd6f03c45be;p=yangtools.git Improve ClassLoaderUtils.loadClassWithTCCL() There are scenarios when we do not have a Thread Context Class Loader, such as when executing from Netty's GlobalEventExecutor. When we attempt to load a class in that scenario, the method will throw a NPE, which exposes users which can deal with the class not being able to load to a RuntimeException -- preventing recovery. Detect the case when TCCL is null and report a failure to load the class, noting the reason for the failure. Change-Id: Ia6837ba451d290a2070bc24e9e7088c60275cae0 Signed-off-by: Robert Varga --- diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/ClassLoaderUtils.java b/common/util/src/main/java/org/opendaylight/yangtools/util/ClassLoaderUtils.java index b380d323e4..e3e7a2c692 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/ClassLoaderUtils.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/ClassLoaderUtils.java @@ -215,13 +215,27 @@ public final class ClassLoaderUtils { } public static Class loadClassWithTCCL(final String name) throws ClassNotFoundException { - return loadClass(Thread.currentThread().getContextClassLoader(), name); + final Thread thread = Thread.currentThread(); + final ClassLoader tccl = thread.getContextClassLoader(); + if (tccl == null) { + throw new ClassNotFoundException("Thread " + thread + " does not have a Context Class Loader, cannot load " + + name); + } + return loadClass(tccl, name); } // FIXME: 3.0.0: Document and return Optional public static Class tryToLoadClassWithTCCL(final String fullyQualifiedClassName) { + final Thread thread = Thread.currentThread(); + final ClassLoader tccl = thread.getContextClassLoader(); + if (tccl == null) { + LOG.debug("Thread {} does not have a Context Class Loader, not loading class {}", thread, + fullyQualifiedClassName); + return null; + } + try { - return loadClassWithTCCL(fullyQualifiedClassName); + return loadClass(tccl, fullyQualifiedClassName); } catch (final ClassNotFoundException e) { LOG.debug("Failed to load class {}", fullyQualifiedClassName, e); return null;