DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=31171>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=31171

ClassCastException in org.apache.jasper.runtime.PageContextImpl.getException

           Summary: ClassCastException in
                    org.apache.jasper.runtime.PageContextImpl.getException
           Product: Tomcat 5
           Version: 5.0.19
          Platform: All
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: Jasper
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


I am writing to report a case where calling PageContextImpl.getException()
can result in a ClassCastException.  This occurred in tomcat 5.0.19,
but examination of tomcat 5.0.28's source code, the problem could
occur there as well.

In my application, I have an jsp declared as an error page.  This
error page uses a tag to record some additional information.  The
first few lines of this tag are as follows:

    public void doTag() throws IOException, JspException
    {
        try {

            PageContext context = (PageContext)getJspContext();
            JspWriter out = context.getOut();
            HttpServletRequest request = (HttpServletRequest) context.getRequest();
            Throwable error = context.getException();
            // proceed to log the exception and some of the
            // surrounding contextual information

In one case, the `catch' associated with this try caught a
ClassCastException from PageContextImpl.getException():

  // line 608 in 5.0.19's PageContextImpl.java
  // line 560 in 5.0.28's PageContextImpl.java
  public Exception getException() { return (Exception)request.getAttribute(EXCEPTION); 
}


This would occur if the error was a result of a java.lang.Throwable.


What possible paths might lead up to this?

The _jspService() generated by JspC typically terminates with
something like the following:

    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          out.clearBuffer();
        if (pageContext != null) pageContext.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
    }

It's catching a Throwable.

PageContextImpl.handlePageException() (lines 730 - 745 in version
5.0.28) does this: 


   public void handlePageException(final Throwable t)
        throws IOException, ServletException
    {
        if (t == null)
            throw new NullPointerException("null Throwable");

        if (System.getSecurityManager() != null){
            try{
                AccessController.doPrivileged(new PrivilegedExceptionAction(){
                    public Object run() throws Exception{
                        doHandlePageException(t);
                        return null;
                    }
                });


It's dealing with throwables.

Continuing on to doHandlePageException(), (lines 763 - 786 in version
5.0.28):

    private void doHandlePageException(Throwable t)
        throws IOException, ServletException {

        if (errorPageURL != null && !errorPageURL.equals("")) {

            /*
             * Set request attributes.
             * Do not set the javax.servlet.error.exception attribute here
             * (instead, set in the generated servlet code for the error page)
             * in order to prevent the ErrorReportValve, which is invoked as
             * part of forwarding the request to the error page, from
             * throwing it if the response has not been committed (the response
             * will have been committed if the error page is a JSP page).
             */
            request.setAttribute("javax.servlet.jsp.jspException", t);
            request.setAttribute("javax.servlet.error.status_code",
                new Integer(HttpServletResponse.SC_INTERNAL_SERVER_ERROR));
            request.setAttribute("javax.servlet.error.request_uri",
            ((HttpServletRequest) request).getRequestURI());
            request.setAttribute("javax.servlet.error.servlet_name",
                     config.getServletName());
                try {
                    forward(errorPageURL);


It's also dealing with Throwables.


The following two (short) jsp files reproduce the problem consistently.


--------------- Page: foo.jsp -----------------------------------
<%@ page session="false"
         language="java" 
         errorPage="/myerror.jsp"
%>

<html><body>hello world</body></html>
<%
  if (1 + 1 == 2) {
    throw new Throwable("The cake fell in the mud");
  }
%>
------------------------------------------------------------------


------------------- Page: myerror.jsp ----------------------------
<!-- myerror.jsp -->
<%@ page session="false"
         language="java"
         isErrorPage="true"
         import="java.io.PrintWriter"
%>

An error occurred:

<pre>
<%
out.println(pageContext.getException().toString());

%>
</pre>
------------------------------------------------------------------


Perhaps getException() could take extra steps to ensure that the
object being returned is indeed an exception (and wrap it if it's
not).

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to