Author: markt Date: Tue Jan 23 18:55:06 2007 New Revision: 499215 URL: http://svn.apache.org/viewvc?view=rev&rev=499215 Log: Further improvements to the fix for bug 39088 - Remove dependency on jsp-api using Tim Funk's suggested approach - Add the recursion part of the patch I missed previously - Handle the case where initCause() has been used rather than the nesting mechanism provided by the well known type
Testing showed that ErrorReportValve was not getting to the root of some of the admittedly crazy sets of nested exceptions I was testing with so this has also been updated to use the same approach as StandardWrapper Modified: tomcat/container/tc5.5.x/catalina/build.xml tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/StandardWrapper.java tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/ErrorReportValve.java Modified: tomcat/container/tc5.5.x/catalina/build.xml URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/catalina/build.xml?view=diff&rev=499215&r1=499214&r2=499215 ============================================================================== --- tomcat/container/tc5.5.x/catalina/build.xml (original) +++ tomcat/container/tc5.5.x/catalina/build.xml Tue Jan 23 18:55:06 2007 @@ -30,7 +30,6 @@ <!-- Dependent JARs and files --> <property name="ant.jar" value="${ant.home}/lib/ant.jar"/> <property name="servlet-api.jar" value="${api.home}/jsr154/dist/lib/servlet-api.jar"/> - <property name="jsp-api.jar" value="${api.home}/jsr152/dist/lib/jsp-api.jar"/> <property name="tomcat-util.jar" value="${tomcat-util.home}/build/lib/tomcat-util.jar"/> <property name="tomcat-coyote.jar" @@ -73,7 +72,6 @@ <pathelement location="${mail.jar}"/> <pathelement location="${regexp.jar}"/> <pathelement location="${servlet-api.jar}"/> - <pathelement location="${jsp-api.jar}"/> <pathelement location="${xercesImpl.jar}"/> <pathelement location="${xml-apis.jar}"/> <pathelement location="${classes.dir}"/> @@ -103,7 +101,6 @@ <pathelement location="${mail.jar}"/> <pathelement location="${regexp.jar}"/> <pathelement location="${servlet-api.jar}"/> - <pathelement location="${jsp-api.jar}"/> <pathelement location="${xercesImpl.jar}"/> <pathelement location="${xml-apis.jar}"/> <pathelement location="${classes.dir}"/> Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/StandardWrapper.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/StandardWrapper.java?view=diff&rev=499215&r1=499214&r2=499215 ============================================================================== --- tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/StandardWrapper.java (original) +++ tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/StandardWrapper.java Tue Jan 23 18:55:06 2007 @@ -38,7 +38,6 @@ import javax.servlet.ServletResponse; import javax.servlet.SingleThreadModel; import javax.servlet.UnavailableException; -import javax.servlet.jsp.JspException; import javax.management.ListenerNotFoundException; import javax.management.MBeanNotificationInfo; import javax.management.Notification; @@ -59,6 +58,7 @@ import org.apache.catalina.security.SecurityUtil; import org.apache.catalina.util.Enumerator; import org.apache.catalina.util.InstanceSupport; +import org.apache.tomcat.util.IntrospectionUtils; import org.apache.tomcat.util.log.SystemLogHandler; import org.apache.commons.modeler.Registry; @@ -268,6 +268,19 @@ private static Class[] classTypeUsedInService = new Class[]{ ServletRequest.class, ServletResponse.class}; + + private static Class jspExceptionClazz; + + static { + try { + jspExceptionClazz = Class.forName("javax.servlet.jsp.JspException"); + } catch (ClassNotFoundException e) { + // Expected if jsp-api not on classpath, eg when embedding + jspExceptionClazz = null; + } + } + + // ------------------------------------------------------------- Properties @@ -638,6 +651,7 @@ return findRootCause(e, 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 @@ -649,18 +663,23 @@ Throwable deeperRootCause = null; if (theRootCause == null || theRootCause == theException) { - deeperRootCause = theException; - } else if (theRootCause instanceof ServletException) { + return theException; + } + + if (theRootCause instanceof ServletException) { deeperRootCause = ((ServletException) theRootCause).getRootCause(); - } else if (theRootCause instanceof JspException) { - deeperRootCause = ((JspException) theRootCause).getRootCause(); + } else if (jspExceptionClazz!=null && + jspExceptionClazz.isAssignableFrom(theRootCause.getClass())) { + deeperRootCause = (Throwable)IntrospectionUtils.getProperty( + theRootCause, "rootCause"); } else if (theRootCause instanceof SQLException) { deeperRootCause = ((SQLException) theRootCause).getNextException(); - } else { + } + if (deeperRootCause == null) { deeperRootCause = theRootCause.getCause(); } - return deeperRootCause; + return findRootCause(theRootCause, deeperRootCause); } Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/ErrorReportValve.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/ErrorReportValve.java?view=diff&rev=499215&r1=499214&r2=499215 ============================================================================== --- tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/ErrorReportValve.java (original) +++ tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/ErrorReportValve.java Tue Jan 23 18:55:06 2007 @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.Writer; +import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; @@ -72,6 +73,16 @@ protected static StringManager sm = StringManager.getManager(Constants.Package); + private static Class jspExceptionClazz; + + static { + try { + jspExceptionClazz = Class.forName("javax.servlet.jsp.JspException"); + } catch (ClassNotFoundException e) { + // Expected if jsp-api not on classpath, eg when embedding + jspExceptionClazz = null; + } + } // ------------------------------------------------------------- Properties @@ -240,8 +251,22 @@ sb.append("</pre></p>"); // In case root cause is somehow heavily nested try { - nestedRootCause = (Throwable)IntrospectionUtils.getProperty - (rootCause, "rootCause"); + if (rootCause instanceof ServletException) { + nestedRootCause = + ((ServletException) rootCause).getRootCause(); + } else if (jspExceptionClazz!=null && + jspExceptionClazz.isAssignableFrom( + rootCause.getClass())) { + nestedRootCause = (Throwable)IntrospectionUtils. + getProperty(rootCause, "rootCause"); + } else if (rootCause instanceof SQLException) { + nestedRootCause = ((SQLException) rootCause). + getNextException(); + } + if (nestedRootCause == null) { + nestedRootCause = rootCause.getCause(); + } + if (rootCause == nestedRootCause) rootCause = null; else --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]