// Yank out everything until we find a known ENTRY point
// if we don't find one, so be it, this is only a convenience
{
// Entry points are the following:
final Filter start = Filters.classes("javax.ejb.embeddable.EJBContainer", "javax.naming.InitialContext");
final Iterator<StackTraceElement> iterator = elements.iterator();
while (iterator.hasNext()) {
final StackTraceElement element = iterator.next();
iterator.remove();
// If we haven't yet reached an entry point, just keep going
if (!start.accept(element.getClassName())) {
continue;
}
// We found an entry point.
// Fast-forward past this class
while (iterator.hasNext() && element.getClassName().equals(iterator.next().getClassName())) {
iterator.remove();
}
// Ok, we have iterated up to the calling user class, so stop now
break;
}
}
// Now iterate till we find an END point
// We don't want any of the classes after that
{
final Filter end = Filters.packages(
"junit.",
"org.junit.",
"org.testng.",
"org.apache.maven.",
"org.eclipse.",
"com.intellij.",
"org.scalatest."
);
// Everything between here and the end is part
// of the call chain in which we are interested
for (final StackTraceElement element : elements) {
if (end.accept(element.getClassName())) {
break;
}
callers.add(element.getClassName());
}
}
// We don't need this anymore
elements.clear();
// Finally filter out everything that we definitely don't want
{
final Filter unwanted = Filters.packages(
"java.",
"javax.",
"sun.reflect."
);
final Iterator<String> classes = callers.iterator();
while (classes.hasNext()) {
if (unwanted.accept(classes.next())) {
classes.remove();
}
}
}