package com.yoursway.utils;
public class JavaStackFrameUtils {
public static String callerPackageOutside(Class<?> klass) {
return packageName(callerClassOutside(klass));
}
public static String callerClassOutside(Class<?> klass) {
return callerStackTraceElementOutside(klass).getClassName();
}
public static String callerMethodOutside(Class<?> klass) {
return callerStackTraceElementOutside(klass).getMethodName();
}
public static StackTraceElement callerStackTraceElementOutside(Class<?> klass) {
boolean thisClassMet = false;
for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
boolean inThisClass = klass.getName().equals(element.getClassName());
if (!thisClassMet) {
if (inThisClass)
thisClassMet = true;
} else {
if (!inThisClass)
return element;
}
}
throw new AssertionError("Unreachable");
}
public static String removeBasePackageName(String className, String packageName) {
String prefix = packageName + ".";
if (!className.startsWith(prefix))
throw new IllegalArgumentException("Class " + className + " is not from package " + packageName);
return className.substring(prefix.length());
}
public static String packageName(Class<?> klass) {
return packageName(klass.getName());
}
public static String packageName(String className) {
int pos = className.lastIndexOf('.');
if (pos < 0)
return "";
return className.substring(0, pos);
}
public static boolean isTrivialExtention(String interfacePackage, String implementationPackage) {
if (implementationPackage.equals(interfacePackage))
return true;
if (implementationPackage.equals(interfacePackage + ".impl")
|| implementationPackage.equals(interfacePackage + ".implementation"))
return true;
int internalPos = implementationPackage.indexOf(".internal.");
if (internalPos >= 0 && interfacePackage.indexOf(".internal.") < 0
&& interfacePackage.equals(remove(implementationPackage, internalPos, ".internal".length())))
return true;
return false;
}
private static String remove(String s, int start, int length) {
return s.substring(start) + s.substring(start + length);
}
}