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;
}