ko-time/src/main/java/cn/langpy/kotime/handler/RunTimeHandler.java
2022-09-08 12:09:13 +08:00

84 lines
3.4 KiB
Java

package cn.langpy.kotime.handler;
import cn.langpy.kotime.model.ExceptionNode;
import cn.langpy.kotime.model.InvokedInfo;
import cn.langpy.kotime.model.MethodNode;
import cn.langpy.kotime.service.InvokedQueue;
import cn.langpy.kotime.service.MethodNodeService;
import cn.langpy.kotime.util.Context;
import cn.langpy.kotime.util.MethodStack;
import cn.langpy.kotime.util.RecordException;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import java.lang.reflect.Parameter;
/**
* zhangchang
*/
public class RunTimeHandler implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
boolean kotimeEnable = Context.getConfig().getEnable();
if (!kotimeEnable) {
return invocation.proceed();
}
boolean exceptionEnable = Context.getConfig().getExceptionEnable();
Parameter[] parameters = invocation.getMethod().getParameters();
long begin = System.nanoTime();
Object obj = null;
MethodNode parent = MethodNodeService.getParentMethodNode();
MethodStack.record(invocation);
if (exceptionEnable) {
try {
obj = invocation.proceed();
} catch (Exception te) {
Exception e = null;
if (te instanceof RecordException) {
e = ((RecordException) te).getOriginalException();
}else {
e = te;
}
ExceptionNode exception = new ExceptionNode();
exception.setName(e.getClass().getSimpleName());
exception.setClassName(e.getClass().getName());
exception.setMessage(e.getMessage());
exception.setId(exception.getClassName() + exception.getName());
MethodNode current = MethodNodeService.getCurrentMethodNode(invocation, 0.0);
for (StackTraceElement stackTraceElement : e.getStackTrace()) {
if (stackTraceElement.getClassName().equals(current.getClassName())) {
exception.setValue(stackTraceElement.getLineNumber());
InvokedInfo invokedInfo = new InvokedInfo();
invokedInfo.setCurrent(current);
invokedInfo.setParent(parent);
invokedInfo.setException(exception);
invokedInfo.setNames(parameters);
invokedInfo.setValues(invocation.getArguments());
InvokedQueue.add(invokedInfo);
InvokedQueue.wake();
break;
}
}
MethodStack.clear();
if (!(te instanceof RecordException)) {
throw te;
}
}
} else {
obj = invocation.proceed();
}
long end = System.nanoTime();
MethodNode current = MethodNodeService.getCurrentMethodNode(invocation, ((end - begin) / 1000000.0));
InvokedInfo invokedInfo = new InvokedInfo();
invokedInfo.setCurrent(current);
invokedInfo.setParent(parent);
invokedInfo.setNames(parameters);
invokedInfo.setValues(invocation.getArguments());
InvokedQueue.add(invokedInfo);
InvokedQueue.wake();
MethodStack.clear();
return obj;
}
}