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

Reply via email to