X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=common%2Futil%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Futil%2FClassLoaderUtils.java;h=1ddd53df232b9709b7d20149a5f1c30202c9e6da;hb=refs%2Fchanges%2F09%2F42509%2F1;hp=6f84ef81ff8a115adcec1f4aae5e14044014844d;hpb=a0d9f509acb275e5f047e91dd8e18ea738baa1c8;p=yangtools.git 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 6f84ef81ff..1ddd53df23 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 @@ -11,28 +11,26 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; import com.google.common.base.Supplier; - import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class ClassLoaderUtils { private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderUtils.class); + private static final Splitter DOT_SPLITTER = Splitter.on('.'); private ClassLoaderUtils() { throw new UnsupportedOperationException("Utility class"); } /** - * * Runs {@link Supplier} with provided {@link ClassLoader}. * * Invokes supplies function and makes sure that original {@link ClassLoader} @@ -41,23 +39,22 @@ public final class ClassLoaderUtils { * @param cls {@link ClassLoader} to be used. * @param function Function to be executed. * @return Result of supplier invocation. - * */ public static V withClassLoader(final ClassLoader cls, final Supplier function) { checkNotNull(cls, "Classloader should not be null"); checkNotNull(function, "Function should not be null"); - final ClassLoader oldCls = Thread.currentThread().getContextClassLoader(); + final Thread currentThread = Thread.currentThread(); + final ClassLoader oldCls = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(cls); + currentThread.setContextClassLoader(cls); return function.get(); } finally { - Thread.currentThread().setContextClassLoader(oldCls); + currentThread.setContextClassLoader(oldCls); } } /** - * * Runs {@link Callable} with provided {@link ClassLoader}. * * Invokes supplies function and makes sure that original {@link ClassLoader} @@ -66,22 +63,22 @@ public final class ClassLoaderUtils { * @param cls {@link ClassLoader} to be used. * @param function Function to be executed. * @return Result of callable invocation. - * */ public static V withClassLoader(final ClassLoader cls, final Callable function) throws Exception { checkNotNull(cls, "Classloader should not be null"); checkNotNull(function, "Function should not be null"); - final ClassLoader oldCls = Thread.currentThread().getContextClassLoader(); + final Thread currentThread = Thread.currentThread(); + final ClassLoader oldCls = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(cls); + currentThread.setContextClassLoader(cls); return function.call(); } finally { - Thread.currentThread().setContextClassLoader(oldCls); + currentThread.setContextClassLoader(oldCls); } } - public static Object construct(final Constructor constructor, final List objects) + public static Object construct(final Constructor constructor, final List objects) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { final Object[] initargs = objects.toArray(); return constructor.newInstance(initargs); @@ -104,16 +101,19 @@ public final class ClassLoaderUtils { if ("char[]".equals(name)) { return char[].class; } + return loadClass0(cls,name); + } + private static Class loadClass0(final ClassLoader cls, final String name) throws ClassNotFoundException { try { return cls.loadClass(name); - } catch (ClassNotFoundException e) { - String[] components = name.split("\\."); - String potentialOuter; - int length = components.length; - if (length > 2 && (potentialOuter = components[length - 2]) != null && Character.isUpperCase(potentialOuter.charAt(0))) { - String outerName = Joiner.on(".").join(Arrays.asList(components).subList(0, length - 1)); - String innerName = outerName + "$" + components[length-1]; + } catch (final ClassNotFoundException e) { + final List components = DOT_SPLITTER.splitToList(name); + + if (isInnerClass(components)) { + final int length = components.size() - 1; + final String outerName = Joiner.on(".").join(components.subList(0, length)); + final String innerName = outerName + "$" + components.get(length); return cls.loadClass(innerName); } else { throw e; @@ -121,6 +121,19 @@ public final class ClassLoaderUtils { } } + private static boolean isInnerClass(final List components) { + final int length = components.size(); + if (length < 2) { + return false; + } + + final String potentialOuter = components.get(length - 2); + if (potentialOuter == null) { + return false; + } + return Character.isUpperCase(potentialOuter.charAt(0)); + } + public static Class loadClassWithTCCL(final String name) throws ClassNotFoundException { return loadClass(Thread.currentThread().getContextClassLoader(), name); } @@ -128,14 +141,14 @@ public final class ClassLoaderUtils { public static Class tryToLoadClassWithTCCL(final String fullyQualifiedName) { try { return loadClassWithTCCL(fullyQualifiedName); - } catch (ClassNotFoundException e) { + } catch (final ClassNotFoundException e) { LOG.debug("Failed to load class {}", fullyQualifiedName, e); return null; } } public static Class

findFirstGenericArgument(final Class scannedClass, final Class genericType) { - return withClassLoader(scannedClass.getClassLoader(), ClassLoaderUtils.findFirstGenericArgumentTask(scannedClass, genericType)); + return withClassLoader(scannedClass.getClassLoader(), ClassLoaderUtils.findFirstGenericArgumentTask(scannedClass, genericType)); } private static Supplier> findFirstGenericArgumentTask(final Class scannedClass, final Class genericType) { @@ -156,7 +169,7 @@ public final class ClassLoaderUtils { Preconditions.checkNotNull(subclass); Preconditions.checkNotNull(genericType); - for (Type type : subclass.getGenericInterfaces()) { + for (final Type type : subclass.getGenericInterfaces()) { if (type instanceof ParameterizedType && genericType.equals(((ParameterizedType) type).getRawType())) { return (ParameterizedType) type; }