You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2018/02/05 20:00:36 UTC

svn commit: r1823230 - /uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Misc.java

Author: schor
Date: Mon Feb  5 20:00:36 2018
New Revision: 1823230

URL: http://svn.apache.org/viewvc?rev=1823230&view=rev
Log:
[UIMA-5721] utility to collect unique class loaders in the call chain in order

Modified:
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Misc.java

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Misc.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Misc.java?rev=1823230&r1=1823229&r2=1823230&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Misc.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Misc.java Mon Feb  5 20:00:36 2018
@@ -55,6 +55,7 @@ import org.apache.uima.UIMAFramework;
 import org.apache.uima.UIMARuntimeException;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.impl.BuiltinTypeKinds;
+import org.apache.uima.internal.util.MsgLocalizationClassLoader.CallStack;
 import org.apache.uima.internal.util.function.Runnable_withException;
 import org.apache.uima.util.Level;
 import org.apache.uima.util.Logger;
@@ -139,6 +140,29 @@ public class Misc {
   public static String formatcaller(String className, String methodName, int lineNumber) {
     return className.substring(1 + className.lastIndexOf('.')) + "." + methodName + "[" + lineNumber + "]";
   }
+  
+  public static ClassLoader [] getCallingClass_classLoaders() {
+    
+   // get the call stack; "new" is needed to get the current context call stack
+    
+    final Class<?>[] cs = new CallStack().getCallStack();
+    // start at the caller of the caller's class loader
+    // cs[0] is getClassContext
+    // cs[1] is getCallStack
+    // cs[2] is this method, getCallingClass_classLoaders
+    ArrayList<ClassLoader> cls = new ArrayList<>();
+    for (int i = 3; i < cs.length; i++) {
+      Class<?> callingClass = cs[i];
+      ClassLoader cl = callingClass.getClassLoader();
+      if (null == cl) { // means system class loader
+        cl = ClassLoader.getSystemClassLoader();
+      }
+      if (! cls.contains(cl)) {
+        cls.add(cl);          
+      }
+    }
+    return cls.toArray(new ClassLoader[cls.size()]);
+  }
 
   /**
    * @param s the string to possibly elide
@@ -1100,6 +1124,15 @@ public class Misc {
         return true;
       }
     }
+    return false;
+  }
+  
+  static public boolean contains(ClassLoader[] cls, ClassLoader cl) {
+    for (ClassLoader item : cls) {
+      if (item == cl) {
+        return true;
+      }
+    }
     return false;
   }