X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fbinding%2Fimpl%2Futil%2FClassLoaderUtils.java;h=d230fd17f9475c24bd920094a233734291593901;hb=3dcdf33c8cbc2eba8b2e6cb0f110a17edfe57ec4;hp=ccf99dfe379681b85e613214bfe996d309a318ad;hpb=d542617f3486541cf9937009fb6aa1e3f2c9f0e2;p=controller.git diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/ClassLoaderUtils.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/ClassLoaderUtils.java index ccf99dfe37..d230fd17f9 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/ClassLoaderUtils.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/util/ClassLoaderUtils.java @@ -1,36 +1,85 @@ package org.opendaylight.controller.sal.binding.impl.util; - - import java.util.concurrent.Callable; +import java.util.concurrent.locks.Lock; import static com.google.common.base.Preconditions.*; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.google.common.base.Joiner; +import com.google.common.base.Optional; -import org.opendaylight.yangtools.yang.binding.Identifier; +public final class ClassLoaderUtils { -public class ClassLoaderUtils { - - public static V withClassLoader(ClassLoader cls,Callable function) throws Exception { - checkNotNull(cls); - checkNotNull(function); + private ClassLoaderUtils() { + throw new UnsupportedOperationException("Utility class"); + } + + public static V withClassLoader(ClassLoader cls, Callable function) throws Exception { + return withClassLoaderAndLock(cls, Optional. absent(), function); + } + + public static V withClassLoaderAndLock(ClassLoader cls, Lock lock, Callable function) throws Exception { + checkNotNull(lock, "Lock should not be null"); + return withClassLoaderAndLock(cls, Optional.of(lock), function); + } + + public static V withClassLoaderAndLock(ClassLoader cls, Optional lock, Callable function) + throws Exception { + checkNotNull(cls, "Classloader should not be null"); + checkNotNull(function, "Function should not be null"); + if (lock.isPresent()) { + lock.get().lock(); + } ClassLoader oldCls = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(cls); - V result = function.call(); - Thread.currentThread().setContextClassLoader(oldCls); - return result; - } catch (Exception e) { + return function.call(); + } finally { Thread.currentThread().setContextClassLoader(oldCls); - throw new Exception(e); + if (lock.isPresent()) { + lock.get().unlock(); + } } } - public static Object construct(Constructor constructor, ArrayList objects) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - Object[] initargs = objects.toArray(new Object[]{}); - return constructor.newInstance(initargs); + public static Object construct(Constructor constructor, List objects) + throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Object[] initargs = objects.toArray(new Object[] {}); + return constructor.newInstance(initargs); + } + + public static Class loadClassWithTCCL(String name) throws ClassNotFoundException { + if ("byte[]".equals(name)) { + return byte[].class; + } + try { + return Thread.currentThread().getContextClassLoader().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]; + return Thread.currentThread().getContextClassLoader().loadClass(innerName); + } else { + throw e; + } + } + } + + public static Class tryToLoadClassWithTCCL(String fullyQualifiedName) { + try { + return loadClassWithTCCL(fullyQualifiedName); + } catch (ClassNotFoundException e) { + + } + return null; } } \ No newline at end of file