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=6e65b03658f58b55b3268dd03d9af9fffb49fbc7;hb=1eb87c819cc6881ca7be74917a5d0bb7a9cad41f;hp=6f84ef81ff8a115adcec1f4aae5e14044014844d;hpb=60bf2afa4363039a64ccd29837fd611bae40278d;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..6e65b03658 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,53 +11,50 @@ 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} + *

Invokes supplies function and makes sure that original {@link ClassLoader} * is context {@link ClassLoader} after execution. * * @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,36 +63,31 @@ 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); } /** - * * Loads class using this supplied classloader. * - * - * @param cls * @param name String name of class. - * @return - * @throws ClassNotFoundException */ public static Class loadClass(final ClassLoader cls, final String name) throws ClassNotFoundException { if ("byte[]".equals(name)) { @@ -104,23 +96,39 @@ 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; } + + throw e; } } + 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,27 +136,25 @@ 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(), findFirstGenericArgumentTask(scannedClass, genericType)); } - private static Supplier> findFirstGenericArgumentTask(final Class scannedClass, final Class genericType) { - return new Supplier>() { - @Override - @SuppressWarnings("unchecked") - public Class

get() { - final ParameterizedType augmentationGeneric = findParameterizedType(scannedClass, genericType); - if (augmentationGeneric != null) { - return (Class

) augmentationGeneric.getActualTypeArguments()[0]; - } - return null; + @SuppressWarnings("unchecked") + private static Supplier> findFirstGenericArgumentTask(final Class scannedClass, + final Class genericType) { + return () -> { + final ParameterizedType augmentationGeneric = findParameterizedType(scannedClass, genericType); + if (augmentationGeneric != null) { + return (Class

) augmentationGeneric.getActualTypeArguments()[0]; } + return null; }; } @@ -156,7 +162,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; }