// Also, this code could potentially be put behind a runAsync boundary, to
// save whatever dependencies it uses from the initial download.
new Timer() {
@Override
public void run() {
SafeHtmlBuilder stack = new SafeHtmlBuilder();
Throwable error = t;
while (error != null) {
String token = String.valueOf((new Date()).getTime());
stack.appendHtmlConstant("Token: " + token + "<br> ");
stack.appendEscaped(String.valueOf(error.getMessage())).appendHtmlConstant("<br>");
for (StackTraceElement elt : error.getStackTrace()) {
stack.appendHtmlConstant(" ")
.appendEscaped(maybe(elt.getClassName(), "??")).appendHtmlConstant(".") //
.appendEscaped(maybe(elt.getMethodName(), "??")).appendHtmlConstant(" (") //
.appendEscaped(maybe(elt.getFileName(), "??")).appendHtmlConstant(":") //
.appendEscaped(maybe(elt.getLineNumber(), "??")).appendHtmlConstant(")") //
.appendHtmlConstant("<br>");
}
error = error.getCause();
if (error != null) {
stack.appendHtmlConstant("Caused by: ");
}
}
whenReady.use(stack.toSafeHtml());
}
}.schedule(1);
}