luehe 2004/05/25 14:27:55 Modified: jasper2/src/share/org/apache/jasper/compiler DefaultErrorHandler.java ErrorDispatcher.java JavacErrorDetail.java Log: Include javac errors whose line numbers cannot be mapped to JSP page in error message that is returned to client. For instance, a missing closing brace in a scriptlet causes havoc with the try-catch-finally block that that JSP compiler puts around all generated code, and the resulting javac error line numbers fall outside the scope of the begin and end java line numbers of the scriptlet (and therefore cannot be mapped back to the JSP line number of the scriptlet). (This used to return the misleading error message about failure to find javac compiler.) Revision Changes Path 1.12 +12 -7 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/DefaultErrorHandler.java Index: DefaultErrorHandler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/DefaultErrorHandler.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- DefaultErrorHandler.java 21 May 2004 17:52:59 -0000 1.11 +++ DefaultErrorHandler.java 25 May 2004 21:27:55 -0000 1.12 @@ -66,18 +66,23 @@ StringBuffer buf = new StringBuffer(); for (int i=0; i < details.length; i++) { - args = new Object[] { + if (details[i].getJspBeginLineNumber() >= 0) { + args = new Object[] { new Integer(details[i].getJspBeginLineNumber()), details[i].getJspFileName() }; - buf.append(Localizer.getMessage("jsp.error.single.line.number", - args)); - buf.append(Localizer.getMessage("jsp.error.corresponding.servlet")); + buf.append(Localizer.getMessage("jsp.error.single.line.number", + args)); + buf.append("\n"); + } + + buf.append( + Localizer.getMessage("jsp.error.corresponding.servlet")); buf.append(details[i].getErrorMessage()); - buf.append('\n'); + buf.append("\n\n"); } - throw new JasperException(Localizer.getMessage("jsp.error.unable.compile") - + buf); + throw new JasperException( + Localizer.getMessage("jsp.error.unable.compile") + "\n\n" + buf); } /** 1.20 +44 -25 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ErrorDispatcher.java Index: ErrorDispatcher.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ErrorDispatcher.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- ErrorDispatcher.java 21 May 2004 17:52:59 -0000 1.19 +++ ErrorDispatcher.java 25 May 2004 21:27:55 -0000 1.20 @@ -431,9 +431,9 @@ throws IOException, JasperException { Vector errVec = new Vector(); - StringBuffer partialErrMsg = new StringBuffer(); + StringBuffer errMsgBuf = null; int lineNum = -1; - Node errNode = null; + JavacErrorDetail javacError = null; BufferedReader reader = new BufferedReader(new StringReader(errMsg)); @@ -453,16 +453,11 @@ int beginColon = line.indexOf(':', 2); int endColon = line.indexOf(':', beginColon + 1); if ((beginColon >= 0) && (endColon >= 0)) { - if (errNode != null) { - // add previous error to error vector - errVec.add(new JavacErrorDetail( - fname, - lineNum, - errNode.getStart().getFile(), - errNode.getStart().getLineNumber(), - partialErrMsg.toString())); - partialErrMsg = new StringBuffer(); + if (javacError != null) { + // add previous error to error vector + errVec.add(javacError); } + String lineNumStr = line.substring(beginColon + 1, endColon); try { lineNum = Integer.parseInt(lineNumStr); @@ -470,29 +465,53 @@ // XXX } - // Map servlet line number to corresponding node in JSP page + errMsgBuf = new StringBuffer(); + + // Attempt to map javac error line number to line in JSP page ErrorVisitor errVisitor = new ErrorVisitor(lineNum); page.visit(errVisitor); - errNode = errVisitor.getJspSourceNode(); + Node errNode = errVisitor.getJspSourceNode(); + if ((errNode != null) && (errNode.getStart() != null)) { + javacError = new JavacErrorDetail( + fname, + lineNum, + errNode.getStart().getFile(), + errNode.getStart().getLineNumber(), + errMsgBuf); + } else { + /* + * javac error line number cannot be mapped to JSP page + * line number. For example, this is the case if a + * scriptlet is missing a closing brace, which causes + * havoc with the try-catch-finally block that the code + * generator places around all generated code: As a result + * of this, the javac error line numbers will be outside + * the range of begin and end java line numbers that were + * generated for the scriptlet, and therefore cannot be + * mapped to the start line number of the scriptlet in the + * JSP page. + * Include just the javac error info in the error detail. + */ + javacError = new JavacErrorDetail( + fname, + lineNum, + errMsgBuf); + } } // Ignore messages preceding first error - if (errNode != null) { - partialErrMsg.append(line); - partialErrMsg.append('\n'); + if (errMsgBuf != null) { + errMsgBuf.append(line); + errMsgBuf.append("\n"); } } - reader.close(); - // Add last error to error vector - if (errNode != null) { - errVec.add(new JavacErrorDetail(fname, - lineNum, - errNode.getStart().getFile(), - errNode.getStart().getLineNumber(), - partialErrMsg.toString())); - } + if (javacError != null) { + errVec.add(javacError); + } + + reader.close(); JavacErrorDetail[] errDetails = null; if (errVec.size() > 0) { 1.3 +23 -6 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JavacErrorDetail.java Index: JavacErrorDetail.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JavacErrorDetail.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- JavacErrorDetail.java 17 Mar 2004 19:23:03 -0000 1.2 +++ JavacErrorDetail.java 25 May 2004 21:27:55 -0000 1.3 @@ -28,7 +28,25 @@ private int javaLineNum; private String jspFileName; private int jspBeginLineNum; - private String errMsg; + private StringBuffer errMsg; + + /** + * Constructor. + * + * @param javaFileName The name of the Java file in which the + * compilation error occurred + * @param javaLineNum The compilation error line number + * @param errMsg The compilation error message + */ + public JavacErrorDetail(String javaFileName, + int javaLineNum, + StringBuffer errMsg) { + + this.javaFileName = javaFileName; + this.javaLineNum = javaLineNum; + this.errMsg = errMsg; + this.jspBeginLineNum = -1; + } /** * Constructor. @@ -46,12 +64,11 @@ int javaLineNum, String jspFileName, int jspBeginLineNum, - String errMsg) { - this.javaFileName = javaFileName; - this.javaLineNum = javaLineNum; + StringBuffer errMsg) { + + this(javaFileName, javaLineNum, errMsg); this.jspFileName = jspFileName; this.jspBeginLineNum = jspBeginLineNum; - this.errMsg = errMsg; } /** @@ -100,6 +117,6 @@ * @return Compilation error message */ public String getErrorMessage() { - return this.errMsg; + return this.errMsg.toString(); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]