From 0d50a5d5a50488d5f2962d06b3437b44596711bd Mon Sep 17 00:00:00 2001 From: markt Date: Mon, 1 Jan 2007 18:55:08 +0000 Subject: [PATCH] Port fix from TC5 to display the JSP source when a compilation error occurs git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@491614 13f79535-47bb-0310-9956-ffa450edef68 --- .../jasper/compiler/DefaultErrorHandler.java | 17 +-- .../apache/jasper/compiler/ErrorDispatcher.java | 25 ++++- java/org/apache/jasper/compiler/JDTCompiler.java | 2 +- .../apache/jasper/compiler/JavacErrorDetail.java | 123 ++++++++++++++++++--- .../apache/jasper/servlet/JspServletWrapper.java | 80 +++----------- webapps/docs/changelog.xml | 4 + 6 files changed, 159 insertions(+), 92 deletions(-) diff --git a/java/org/apache/jasper/compiler/DefaultErrorHandler.java b/java/org/apache/jasper/compiler/DefaultErrorHandler.java index 761b6b6f3..cb2bb15fb 100644 --- a/java/org/apache/jasper/compiler/DefaultErrorHandler.java +++ b/java/org/apache/jasper/compiler/DefaultErrorHandler.java @@ -67,22 +67,23 @@ class DefaultErrorHandler implements ErrorHandler { StringBuffer buf = new StringBuffer(); for (int i=0; i < details.length; i++) { + buf.append("\n"); if (details[i].getJspBeginLineNumber() >= 0) { args = new Object[] { new Integer(details[i].getJspBeginLineNumber()), details[i].getJspFileName() }; + buf.append("\n"); buf.append(Localizer.getMessage("jsp.error.single.line.number", args)); - buf.append("\n"); + buf.append("\n"); + buf.append(details[i].getErrorMessage()); + buf.append("\n"); + buf.append(details[i].getJspExtract()); } - - buf.append( - Localizer.getMessage("jsp.error.corresponding.servlet")); - buf.append(details[i].getErrorMessage()); - buf.append("\n\n"); } - - throw new JasperException(Localizer.getMessage("jsp.error.unable.compile") + "\n\n" + buf); + buf.append("\n\nStacktrace:"); + throw new JasperException( + Localizer.getMessage("jsp.error.unable.compile") + ": " + buf); } /** diff --git a/java/org/apache/jasper/compiler/ErrorDispatcher.java b/java/org/apache/jasper/compiler/ErrorDispatcher.java index b484ccb39..970b13cc9 100644 --- a/java/org/apache/jasper/compiler/ErrorDispatcher.java +++ b/java/org/apache/jasper/compiler/ErrorDispatcher.java @@ -23,6 +23,7 @@ import java.net.MalformedURLException; import java.util.ArrayList; import org.apache.jasper.JasperException; +import org.apache.jasper.JspCompilationContext; import org.xml.sax.SAXException; /** @@ -501,8 +502,25 @@ public class ErrorDispatcher { * @return JavacErrorDetail The error details * @throws JasperException */ - public static JavacErrorDetail createJavacError(String fname, Node.Nodes page, - StringBuffer errMsgBuf, int lineNum) throws JasperException { + public static JavacErrorDetail createJavacError(String fname, + Node.Nodes page, StringBuffer errMsgBuf, int lineNum) + throws JasperException { + return createJavacError(fname, page, errMsgBuf, lineNum, null); + } + + + /** + * @param fname + * @param page + * @param errMsgBuf + * @param lineNum + * @param ctxt + * @return JavacErrorDetail The error details + * @throws JasperException + */ + public static JavacErrorDetail createJavacError(String fname, + Node.Nodes page, StringBuffer errMsgBuf, int lineNum, + JspCompilationContext ctxt) throws JasperException { JavacErrorDetail javacError; // Attempt to map javac error line number to line in JSP page ErrorVisitor errVisitor = new ErrorVisitor(lineNum); @@ -514,7 +532,8 @@ public class ErrorDispatcher { lineNum, errNode.getStart().getFile(), errNode.getStart().getLineNumber(), - errMsgBuf); + errMsgBuf, + ctxt); } else { /* * javac error line number cannot be mapped to JSP page diff --git a/java/org/apache/jasper/compiler/JDTCompiler.java b/java/org/apache/jasper/compiler/JDTCompiler.java index 4e4320748..6aa13e27d 100644 --- a/java/org/apache/jasper/compiler/JDTCompiler.java +++ b/java/org/apache/jasper/compiler/JDTCompiler.java @@ -352,7 +352,7 @@ public class JDTCompiler extends org.apache.jasper.compiler.Compiler { try { problemList.add(ErrorDispatcher.createJavacError (name, pageNodes, new StringBuffer(problem.getMessage()), - problem.getSourceLineNumber())); + problem.getSourceLineNumber(), ctxt)); } catch (JasperException e) { log.error("Error visiting node", e); } diff --git a/java/org/apache/jasper/compiler/JavacErrorDetail.java b/java/org/apache/jasper/compiler/JavacErrorDetail.java index 26e542701..0750c5987 100644 --- a/java/org/apache/jasper/compiler/JavacErrorDetail.java +++ b/java/org/apache/jasper/compiler/JavacErrorDetail.java @@ -17,6 +17,16 @@ package org.apache.jasper.compiler; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import org.apache.jasper.JspCompilationContext; + /** * Class providing details about a javac compilation error. * @@ -30,6 +40,7 @@ public class JavacErrorDetail { private String jspFileName; private int jspBeginLineNum; private StringBuffer errMsg; + private String jspExtract = null; /** * Constructor. @@ -40,12 +51,12 @@ public class JavacErrorDetail { * @param errMsg The compilation error message */ public JavacErrorDetail(String javaFileName, - int javaLineNum, - StringBuffer errMsg) { + int javaLineNum, + StringBuffer errMsg) { - this.javaFileName = javaFileName; - this.javaLineNum = javaLineNum; - this.errMsg = errMsg; + this.javaFileName = javaFileName; + this.javaLineNum = javaLineNum; + this.errMsg = errMsg; this.jspBeginLineNum = -1; } @@ -62,14 +73,69 @@ public class JavacErrorDetail { * @param errMsg The compilation error message */ public JavacErrorDetail(String javaFileName, - int javaLineNum, - String jspFileName, - int jspBeginLineNum, - StringBuffer errMsg) { + int javaLineNum, + String jspFileName, + int jspBeginLineNum, + StringBuffer errMsg) { + + this(javaFileName, javaLineNum, jspFileName, jspBeginLineNum, errMsg, + null); + } + public JavacErrorDetail(String javaFileName, + int javaLineNum, + String jspFileName, + int jspBeginLineNum, + StringBuffer errMsg, + JspCompilationContext ctxt) { + this(javaFileName, javaLineNum, errMsg); - this.jspFileName = jspFileName; - this.jspBeginLineNum = jspBeginLineNum; + this.jspFileName = jspFileName; + this.jspBeginLineNum = jspBeginLineNum; + + if (jspBeginLineNum > 0 && ctxt != null) { + try { + // Read both files in, so we can inspect them + String[] jspLines = readFile + (ctxt.getResourceAsStream(jspFileName)); + + String[] javaLines = readFile + (new FileInputStream(ctxt.getServletJavaFileName())); + + // If the line contains the opening of a multi-line scriptlet + // block, then the JSP line number we got back is probably + // faulty. Scan forward to match the java line... + if (jspLines[jspBeginLineNum-1].lastIndexOf("<%") > + jspLines[jspBeginLineNum-1].lastIndexOf("%>")) { + String javaLine = javaLines[javaLineNum-1].trim(); + + for (int i=jspBeginLineNum-1; i - jspLines[jspLineNumber-1].lastIndexOf("%>")) { - String javaLine = javaLines[javaLineNumber-1].trim(); - - for (int i=jspLineNumber-1; i + + Display the JSP source when a compilation error occurs and display + the correct line number rather than start of a scriptlet block. (markt) + -- 2.11.0