Repository: mina-sshd Updated Branches: refs/heads/master c01a6c4f9 -> fbe2f4fa9
Fix classloading problems Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/6189fff8 Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/6189fff8 Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/6189fff8 Branch: refs/heads/master Commit: 6189fff80dc6e4f9afd63f1013641d4a0035f7b1 Parents: c01a6c4 Author: Guillaume Nodet <[email protected]> Authored: Tue Feb 14 11:21:36 2017 +0100 Committer: Guillaume Nodet <[email protected]> Committed: Tue Feb 14 11:21:36 2017 +0100 ---------------------------------------------------------------------- .../common/util/security/SecurityUtils.java | 3 +- .../sshd/common/util/threads/ThreadUtils.java | 34 +++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/6189fff8/sshd-core/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java index 62b9e3b..6aff088 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java @@ -390,11 +390,10 @@ public final class SecurityUtils { if ((GenericUtils.length(regsList) > 0) && (!"none".equalsIgnoreCase(regsList))) { String[] classes = GenericUtils.split(regsList, ','); Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - ClassLoader cl = ThreadUtils.resolveDefaultClassLoader(SecurityUtils.class); for (String registrarClass : classes) { SecurityProviderRegistrar r; try { - r = ThreadUtils.createDefaultInstance(cl, SecurityProviderRegistrar.class, registrarClass); + r = ThreadUtils.createDefaultInstance(SecurityUtils.class, SecurityProviderRegistrar.class, registrarClass); } catch (ReflectiveOperationException t) { Throwable e = GenericUtils.peelException(t); logger.error("Failed ({}) to create default {} registrar instance: {}", http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/6189fff8/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java index 0c003ba..d55469e 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java @@ -25,6 +25,8 @@ import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; @@ -96,9 +98,13 @@ public final class ThreadUtils { return resolveDefaultClassLoader(anchor == null ? null : anchor.getClass()); } + public static Iterable<ClassLoader> resolveDefaultClassLoaders(Object anchor) { + return resolveDefaultClassLoaders(anchor == null ? null : anchor.getClass()); + } + public static <T> T createDefaultInstance(Class<?> anchor, Class<T> targetType, String className) throws ReflectiveOperationException { - return createDefaultInstance(resolveDefaultClassLoader(anchor), targetType, className); + return createDefaultInstance(resolveDefaultClassLoaders(anchor), targetType, className); } public static <T> T createDefaultInstance(ClassLoader cl, Class<T> targetType, String className) @@ -108,6 +114,18 @@ public final class ThreadUtils { return targetType.cast(instance); } + public static <T> T createDefaultInstance(Iterable<ClassLoader> cls, Class<T> targetType, String className) + throws ReflectiveOperationException { + for (ClassLoader cl : cls) { + try { + return createDefaultInstance(cl, targetType, className); + } catch (ClassNotFoundException e) { + // Ignore + } + } + throw new ClassNotFoundException(className); + } + /** * <P>Attempts to find the most suitable {@link ClassLoader} as follows:</P> * <UL> @@ -148,6 +166,20 @@ public final class ThreadUtils { return cl; } + public static Iterable<ClassLoader> resolveDefaultClassLoaders(Class<?> anchor) { + Set<ClassLoader> cls = new LinkedHashSet<>(); + Thread thread = Thread.currentThread(); + ClassLoader cl = thread.getContextClassLoader(); + if (cl != null) { + cls.add(cl); + } + if (anchor != null) { + cls.add(anchor.getClassLoader()); + } + cls.add(ClassLoader.getSystemClassLoader()); + return cls; + } + public static ExecutorService newFixedThreadPool(String poolName, int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, // TODO make this configurable
