import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
-import java.sql.SQLException;
-
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
*/
protected static Properties restrictedServlets = null;
-
+
// ------------------------------------------------------------- Properties
* @param e The servlet exception
*/
public static Throwable getRootCause(ServletException e) {
- Throwable rootCause = e.getRootCause();
- return findRootCause(e, rootCause);
+ Throwable rootCause = e;
+ Throwable rootCauseCheck = null;
+ // Extra aggressive rootCause finding
+ int loops = 0;
+ do {
+ loops++;
+ rootCauseCheck = rootCause.getCause();
+ if (rootCauseCheck != null)
+ rootCause = rootCauseCheck;
+ } while (rootCauseCheck != null && (loops < 20));
+ return rootCause;
}
- /*
- * Work through the root causes using specific methods for well known types
- * and getCause() for the rest. Stop when the next rootCause is null or
- * an exception is found that has itself as its own rootCause.
- */
- private static final Throwable findRootCause(Throwable theException,
- Throwable theRootCause) {
-
- Throwable deeperRootCause = null;
-
- if (theRootCause == null || theRootCause == theException) {
- return theException;
- }
-
- if (theRootCause instanceof SQLException) {
- deeperRootCause = ((SQLException) theRootCause).getNextException();
- }
- if (deeperRootCause == null) {
- deeperRootCause = theRootCause.getCause();
- }
-
- return findRootCause(theRootCause, deeperRootCause);
- }
-
-
-
/**
* Refuse to add a child Container, because Wrappers are the lowest level
* of the Container hierarchy.
import java.io.IOException;
import java.io.Writer;
-import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
sb.append(RequestUtil.filter(stackTrace));
sb.append("</pre></p>");
+ int loops = 0;
Throwable rootCause = throwable.getCause();
- Throwable nestedRootCause = null;
- while (rootCause != null) {
+ while (rootCause != null && (loops < 10)) {
stackTrace = getPartialServletStackTrace(rootCause);
sb.append("<p><b>");
sb.append(sm.getString("errorReportValve.rootCause"));
sb.append(RequestUtil.filter(stackTrace));
sb.append("</pre></p>");
// In case root cause is somehow heavily nested
- try {
- if (rootCause instanceof SQLException) {
- nestedRootCause = ((SQLException) rootCause).
- getNextException();
- }
- if (nestedRootCause == null) {
- nestedRootCause = rootCause.getCause();
- }
-
- if (rootCause == nestedRootCause)
- rootCause = null;
- else {
- rootCause = nestedRootCause;
- nestedRootCause = null;
- }
- } catch (ClassCastException e) {
- rootCause = null;
- }
+ rootCause = rootCause.getCause();
+ loops++;
}
+
sb.append("<p><b>");
sb.append(sm.getString("errorReportValve.note"));
sb.append("</b> <u>");