Search in sources :

Example 1 with JavacErrorDetail

use of org.apache.jasper.compiler.JavacErrorDetail in project tomcat by apache.

the class JspServletWrapper method handleJspException.

/**
     * <p>Attempts to construct a JasperException that contains helpful information
     * about what went wrong. Uses the JSP compiler system to translate the line
     * number in the generated servlet that originated the exception to a line
     * number in the JSP.  Then constructs an exception containing that
     * information, and a snippet of the JSP to help debugging.
     * Please see http://bz.apache.org/bugzilla/show_bug.cgi?id=37062 and
     * http://www.tfenne.com/jasper/ for more details.
     *</p>
     *
     * @param ex the exception that was the cause of the problem.
     * @return a JasperException with more detailed information
     */
protected JasperException handleJspException(Exception ex) {
    try {
        Throwable realException = ex;
        if (ex instanceof ServletException) {
            realException = ((ServletException) ex).getRootCause();
        }
        // First identify the stack frame in the trace that represents the JSP
        StackTraceElement[] frames = realException.getStackTrace();
        StackTraceElement jspFrame = null;
        for (int i = 0; i < frames.length; ++i) {
            if (frames[i].getClassName().equals(this.getServlet().getClass().getName())) {
                jspFrame = frames[i];
                break;
            }
        }
        if (jspFrame == null || this.ctxt.getCompiler().getPageNodes() == null) {
            // parsed JSP to hand, we can't really add anything
            return new JasperException(ex);
        }
        int javaLineNumber = jspFrame.getLineNumber();
        JavacErrorDetail detail = ErrorDispatcher.createJavacError(jspFrame.getMethodName(), this.ctxt.getCompiler().getPageNodes(), null, javaLineNumber, ctxt);
        // If the line number is less than one we couldn't find out
        // where in the JSP things went wrong
        int jspLineNumber = detail.getJspBeginLineNumber();
        if (jspLineNumber < 1) {
            throw new JasperException(ex);
        }
        if (options.getDisplaySourceFragment()) {
            return new JasperException(Localizer.getMessage("jsp.exception", detail.getJspFileName(), "" + jspLineNumber) + System.lineSeparator() + System.lineSeparator() + detail.getJspExtract() + System.lineSeparator() + System.lineSeparator() + "Stacktrace:", ex);
        }
        return new JasperException(Localizer.getMessage("jsp.exception", detail.getJspFileName(), "" + jspLineNumber), ex);
    } catch (Exception je) {
        // If anything goes wrong, just revert to the original behaviour
        if (ex instanceof JasperException) {
            return (JasperException) ex;
        }
        return new JasperException(ex);
    }
}
Also used : ServletException(javax.servlet.ServletException) JavacErrorDetail(org.apache.jasper.compiler.JavacErrorDetail) JasperException(org.apache.jasper.JasperException) ServletException(javax.servlet.ServletException) JasperException(org.apache.jasper.JasperException) IOException(java.io.IOException) FileNotFoundException(java.io.FileNotFoundException) UnavailableException(javax.servlet.UnavailableException)

Aggregations

FileNotFoundException (java.io.FileNotFoundException)1 IOException (java.io.IOException)1 ServletException (javax.servlet.ServletException)1 UnavailableException (javax.servlet.UnavailableException)1 JasperException (org.apache.jasper.JasperException)1 JavacErrorDetail (org.apache.jasper.compiler.JavacErrorDetail)1