@AllArgsConstructor
public static class Caller {
@Getter private List<StackTraceElement> trace;
@Getter private String name;
private long startTime;
public long getRunTime() {
return System.currentTimeMillis() - startTime;
}
public Document toDocument() {
List<String> traceStrings = trace.stream()
.map(StackTraceElement::toString)
.toList();
return new Document("trace", traceStrings)
.append("name", name)
.append("run_time", getRunTime());
}
}
private static String callerName(StackTraceElement[] traceList) {
final var element = traceList[4];
try {
final var methodClass = Class.forName(element.getClassName());
if (Action.class.isAssignableFrom(methodClass)) {
return methodClass.getSimpleName();
}
} catch (Exception e) {
// pass
}
return String.format("%s.%s", element.getClassName(), element.getMethodName());
}
@Getter private static final List<Caller> callers = new ArrayList<>();
private static Caller addToCallersList() {
var traceList = Thread.currentThread().getStackTrace();
final var caller = new Caller(Arrays.asList(traceList).subList(2, Thread.currentThread().getStackTrace().length), callerName(traceList), System.currentTimeMillis());
callers.add(caller);
return caller;
}