package cn.bran.japid.util;
import cn.bran.japid.template.JapidRenderer;
import cn.bran.play.JapidController;
//import static org.junit.Assert.*;
//
//import org.junit.Test;
public class StackTraceUtils {
public static String getCaller() {
int depth = 3;
return getCaller(depth);
}
public static String getCaller2() {
int depth = 4;
return getCaller(depth);
}
public static String getCaller3() {
int depth = 5;
return getCaller(depth);
}
/**
* @param depth
* @return
*/
public static String getCaller(int depth) {
final StackTraceElement[] ste = new Throwable().getStackTrace();
StackTraceElement st = ste[depth];
return st.getClassName() + "." + st.getMethodName();
}
public static String getCurrentMethodFullName() {
return getCaller(2);
}
public static String getJapidRenderInvoker() {
return getInvokerOf(JapidRenderer.class.getName(), "render");
}
/**
* @return {invokerclass}.{method}
*/
public static String getInvokerOf(String targetClassName, String methodName) {
final StackTraceElement[] ste = new Throwable().getStackTrace();
for (int i = 0; i < ste.length; i++) {
StackTraceElement st = ste[i];
String className = st.getClassName();
String method = st.getMethodName();
if (className.equals(targetClassName) && method.equals(methodName)) {
// the next one is what I want
st = ste[i + 1];
className = st.getClassName();
method = st.getMethodName();
return className + "." + method;
}
}
return null;
}
static class QuickThrowable extends Throwable {
@Override
public synchronized Throwable fillInStackTrace() {
return this;
}
}
/**
* @author Bing Ran (bing.ran@hotmail.com)
* @return
* @deprecated deprecated using stacktrace to find out about invokers for performance reason. Should have used JapidController.thread
*/
public static String getJapidControllerInvoker(String method) {
// JapidFlags.log("deprecated using stacktrace to find out about invokers for performance reason. Should have used JapidController.threadData");
return getInvokerOf(JapidController.class.getName(), method);
}
}