package org.jacorb.test.notification;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.StringTokenizer;
public class CallerResolver {
public String getCaller() {
String stackTrace = makeStackTrace();
StringTokenizer lineTokenizer = new StringTokenizer(stackTrace, "\n");
while (lineTokenizer.hasMoreTokens()) {
String line = lineTokenizer.nextToken().trim();
if (line.startsWith("at " + getClass().getName() + ".getCaller")) {
if (lineTokenizer.hasMoreTokens()) {
return extractClassName(lineTokenizer.nextToken());
}
}
}
return null;
}
public String makeStackTrace() {
try {
throw new RuntimeException("INTENTIONAL");
} catch (RuntimeException re) {
StringWriter sw = new StringWriter();
re.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
}
String extractClassName(String stackTraceLine) {
//get rid of the leading indentation
String className = stackTraceLine.trim();
// get rid of the "at " before the class name
className = className.substring(3);
// get rid of the source file/line number info
className = className.substring(0, className.indexOf('('));
// get rid of the method name
className = className.substring(0, className.lastIndexOf('.'));
return className;
}
}