You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2007/01/01 19:55:09 UTC

svn commit: r491614 - in /tomcat/tc6.0.x/trunk: java/org/apache/jasper/compiler/ java/org/apache/jasper/servlet/ webapps/docs/

Author: markt
Date: Mon Jan  1 10:55:08 2007
New Revision: 491614

URL: http://svn.apache.org/viewvc?view=rev&rev=491614
Log:
Port fix from TC5 to display the JSP source when a compilation error occurs

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/DefaultErrorHandler.java
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ErrorDispatcher.java
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JDTCompiler.java
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java
    tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/DefaultErrorHandler.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/DefaultErrorHandler.java?view=diff&rev=491614&r1=491613&r2=491614
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/DefaultErrorHandler.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/DefaultErrorHandler.java Mon Jan  1 10:55:08 2007
@@ -67,22 +67,23 @@
         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);
     }
     
     /**

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ErrorDispatcher.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ErrorDispatcher.java?view=diff&rev=491614&r1=491613&r2=491614
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ErrorDispatcher.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ErrorDispatcher.java Mon Jan  1 10:55:08 2007
@@ -23,6 +23,7 @@
 import java.util.ArrayList;
 
 import org.apache.jasper.JasperException;
+import org.apache.jasper.JspCompilationContext;
 import org.xml.sax.SAXException;
 
 /**
@@ -501,8 +502,25 @@
      * @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 @@
                     lineNum,
                     errNode.getStart().getFile(),
                     errNode.getStart().getLineNumber(),
-                    errMsgBuf);
+                    errMsgBuf,
+                    ctxt);
         } else {
             /*
              * javac error line number cannot be mapped to JSP page

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JDTCompiler.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JDTCompiler.java?view=diff&rev=491614&r1=491613&r2=491614
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JDTCompiler.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JDTCompiler.java Mon Jan  1 10:55:08 2007
@@ -352,7 +352,7 @@
                                     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);
                                     }

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java?view=diff&rev=491614&r1=491613&r2=491614
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java Mon Jan  1 10:55:08 2007
@@ -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 @@
     private String jspFileName;
     private int jspBeginLineNum;
     private StringBuffer errMsg;
+    private String jspExtract = null;
 
     /**
      * Constructor.
@@ -40,12 +51,12 @@
      * @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 @@
      * @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.length; i++) {
+                        if (jspLines[i].indexOf(javaLine) != -1) {
+                            // Update jsp line number
+                            this.jspBeginLineNum = i+1;
+                            break;
+                        }
+                    }
+                }
+    
+                // copy out a fragment of JSP to display to the user
+                StringBuffer fragment = new StringBuffer(1024);
+                int startIndex = Math.max(0, this.jspBeginLineNum-1-3);
+                int endIndex = Math.min(
+                        jspLines.length-1, this.jspBeginLineNum-1+3);
+    
+                for (int i=startIndex;i<=endIndex; ++i) {
+                    fragment.append(i+1);
+                    fragment.append(": ");
+                    fragment.append(jspLines[i]);
+                    fragment.append("\n");
+                }
+                jspExtract = fragment.toString();
+    
+            } catch (IOException ioe) {
+                // Can't read files - ignore
+            }
+        }
     }
 
     /**
@@ -79,7 +145,7 @@
      * @return Java source file name
      */
     public String getJavaFileName() {
-	return this.javaFileName;
+        return this.javaFileName;
     }
 
     /**
@@ -88,7 +154,7 @@
      * @return Compilation error line number
      */
     public int getJavaLineNumber() {
-	return this.javaLineNum;
+        return this.javaLineNum;
     }
 
     /**
@@ -98,7 +164,7 @@
      * @return JSP file from which the Java source file was generated.
      */
     public String getJspFileName() {
-	return this.jspFileName;
+        return this.jspFileName;
     }
 
     /**
@@ -109,7 +175,7 @@
      * compilation error
      */
     public int getJspBeginLineNumber() {
-	return this.jspBeginLineNum;
+        return this.jspBeginLineNum;
     }
 
     /**
@@ -118,6 +184,31 @@
      * @return Compilation error message
      */
     public String getErrorMessage() {
-	return this.errMsg.toString();
+        return this.errMsg.toString();
+    }
+    
+    /**
+     * Gets the extract of the JSP that corresponds to this message.
+     *
+     * @return Extract of JSP where error occurred
+     */
+    public String getJspExtract() {
+        return this.jspExtract;
+    }
+    
+    /**
+     * Reads a text file from an input stream into a String[]. Used to read in
+     * the JSP and generated Java file when generating error messages.
+     */
+    private String[] readFile(InputStream s) throws IOException {
+        BufferedReader reader = new BufferedReader(new InputStreamReader(s));
+        List lines = new ArrayList();
+        String line;
+
+        while ( (line = reader.readLine()) != null ) {
+            lines.add(line);
+        }
+
+        return (String[]) lines.toArray( new String[lines.size()] );
     }
 }

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java?view=diff&rev=491614&r1=491613&r2=491614
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java Mon Jan  1 10:55:08 2007
@@ -17,15 +17,9 @@
 
 package org.apache.jasper.servlet;
 
-import java.io.BufferedReader;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.servlet.Servlet;
 import javax.servlet.ServletConfig;
@@ -504,10 +498,11 @@
             else {
                 int javaLineNumber = jspFrame.getLineNumber();
                 JavacErrorDetail detail = ErrorDispatcher.createJavacError(
-                                                                           jspFrame.getMethodName(),
-                                                                           this.ctxt.getCompiler().getPageNodes(),
-                                                                           null,
-                                                                           javaLineNumber);
+                        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
@@ -517,69 +512,26 @@
                 }
 
                 if (options.getDisplaySourceFragment()) {
-
-                    // Read both files in, so we can inspect them
-                    String[] jspLines = readFile
-                    (this.ctxt.getResourceAsStream(detail.getJspFileName()));
-
-                    String[] javaLines = readFile
-                    (new FileInputStream(this.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[jspLineNumber-1].lastIndexOf("<%") >
-                    jspLines[jspLineNumber-1].lastIndexOf("%>")) {
-                        String javaLine = javaLines[javaLineNumber-1].trim();
-
-                        for (int i=jspLineNumber-1; i<jspLines.length; i++) {
-                            if (jspLines[i].indexOf(javaLine) != -1) {
-                                jspLineNumber = i+1;
-                                break;
-                            }
-                        }
-                    }
-
-                    // copy out a fragment of JSP to display to the user
-                    StringBuffer buffer = new StringBuffer(1024);
-                    int startIndex = Math.max(0, jspLineNumber-1-3);
-                    int endIndex = Math.min(jspLines.length-1, jspLineNumber-1+3);
-
-                    for (int i=startIndex;i<=endIndex; ++i) {
-                        buffer.append(i+1);
-                        buffer.append(": ");
-                        buffer.append(jspLines[i]);
-                        buffer.append("\n");
-                    }
-
                     return new JasperException(Localizer.getMessage
-                            ("jsp.exception", detail.getJspFileName(), "" + jspLineNumber) + "\n" + buffer, ex);
+                            ("jsp.exception", detail.getJspFileName(),
+                                    "" + jspLineNumber) +
+                                    "\n\n" + detail.getJspExtract() +
+                                    "\n\nStacktrace:", ex);
                     
                 } else {
                     return new JasperException(Localizer.getMessage
-                            ("jsp.exception", detail.getJspFileName(), "" + jspLineNumber), ex);
+                            ("jsp.exception", detail.getJspFileName(),
+                                    "" + jspLineNumber), ex);
                 }
             }
         } catch (Exception je) {
             // If anything goes wrong, just revert to the original behaviour
-            return new JasperException(ex);
-        }
-    }
-
-    /**
-     * Reads a text file from an input stream into a String[]. Used to read in
-     * the JSP and generated Java file when generating error messages.
-     */
-    private String[] readFile(InputStream s) throws IOException {
-        BufferedReader reader = new BufferedReader(new InputStreamReader(s));
-        List lines = new ArrayList();
-        String line;
-
-        while ( (line = reader.readLine()) != null ) {
-            lines.add(line);
+            if (ex instanceof JasperException) {
+                return (JasperException) ex;
+            } else {
+                return new JasperException(ex);
+            }
         }
-
-        return (String[]) lines.toArray( new String[lines.size()] );
     }
 
 }

Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?view=diff&rev=491614&r1=491613&r2=491614
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Mon Jan  1 10:55:08 2007
@@ -21,6 +21,10 @@
         When displaying JSP source after an exception, handle included files.
         (markt)
       </fix>
+      <fix>
+        Display the JSP source when a compilation error occurs and display
+        the correct line number rather than start of a scriptlet block. (markt)
+      </fix>
     </changelog>
   </subsection>
 </section>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org