Author: markt
Date: Thu May 13 12:19:43 2010
New Revision: 943872

URL: http://svn.apache.org/viewvc?rev=943872&view=rev
Log:
Identify source of TLD validation errors to aid debugging

Modified:
    tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java

Modified: tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties?rev=943872&r1=943871&r2=943872&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties Thu 
May 13 12:19:43 2010
@@ -105,6 +105,9 @@ tldConfig.cce=Lifecycle event data objec
 tldConfig.dirFail=Failed to process directory [{0}] for TLD files
 tldConfig.dirScan=Scanning for TLD files in directory [{0}]
 tldConfig.execute=Error processing TLD files for context path {0}
+tldConfig.handlerError=Non-fatal error [{0}] reported processing [{1}]. 
+tldConfig.handlerWarning=Warning [{0}] reported processing [{1}]. 
+tldConfig.jarFail=Failed to process JAR [{0}] for TLD files
 tldConfig.webinfFail=Failed to process TLD found at [{0}]
 tldConfig.webinfScan=Scanning WEB-INF for TLD files in [{0}]
 tldConfig.webxmlAdd=Adding path [{0}] for URI [{1}]

Modified: tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java?rev=943872&r1=943871&r2=943872&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java Thu May 13 
12:19:43 2010
@@ -47,8 +47,10 @@ import org.apache.tomcat.JarScannerCallb
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.res.StringManager;
 import org.apache.tomcat.util.digester.Digester;
+import org.xml.sax.ErrorHandler;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 
 
 /**
@@ -344,6 +346,43 @@ public final class TldConfig  implements
         }
     }
 
+    private static class TldErrorHandler implements ErrorHandler {
+        
+        private Set<SAXParseException> errors =
+            new HashSet<SAXParseException>();
+        
+        private Set<SAXParseException> warnings =
+            new HashSet<SAXParseException>();
+
+        @Override
+        public void error(SAXParseException exception) throws SAXException {
+            // Collect non-fatal errors
+            errors.add(exception);
+        }
+
+        @Override
+        public void fatalError(SAXParseException exception) throws 
SAXException {
+            // Re-throw fatal errors
+            throw exception;
+        }
+
+        @Override
+        public void warning(SAXParseException exception) throws SAXException {
+            // Collect warnings
+            warnings.add(exception);
+        }
+        
+        public Set<SAXParseException> getErrors() {
+            // Internal use only - don't worry about immutability
+            return errors;
+        }
+        
+        public Set<SAXParseException> getWarnings() {
+            // Internal use only - don't worry about immutability
+            return warnings;
+        }
+    }
+    
     // -------------------------------------------------------- Private Methods
 
 
@@ -383,7 +422,8 @@ public final class TldConfig  implements
                 try {
                     InputStream stream = context.getServletContext(
                             ).getResourceAsStream(resourcePath);
-                    tldScanStream(stream);
+                    TldErrorHandler handler = tldScanStream(stream);
+                    processErrorHandler(handler, resourcePath);
                     taglibUris.add(descriptor.getTaglibURI());
                     webxmlTaglibUris.add(descriptor.getTaglibURI());
                 } catch (IOException ioe) {
@@ -429,7 +469,8 @@ public final class TldConfig  implements
                     }
                     InputStream stream = ctxt.getResourceAsStream(path);
                     try {
-                        tldScanStream(stream);
+                        TldErrorHandler handler = tldScanStream(stream);
+                        processErrorHandler(handler, path);
                     } catch (IOException ioe) {
                         log.warn(sm.getString("tldConfig.webinfFail", path),
                                 ioe);
@@ -471,7 +512,9 @@ public final class TldConfig  implements
                     InputStream stream = null;
                     try {
                         stream = new FileInputStream(fileList[i]);
-                        tldScanStream(stream);
+                        TldErrorHandler handler = tldScanStream(stream);
+                        processErrorHandler(handler,
+                                fileList[i].getAbsolutePath());
                     } catch (IOException ioe) {
                         log.warn(sm.getString("tldConfig.dirFail",
                                 fileList[i].getAbsolutePath()),
@@ -498,21 +541,26 @@ public final class TldConfig  implements
      * 
      * Keep in sync with o.a.j.comiler.TldLocationsCache
      */
-    private void tldScanJar(JarURLConnection conn) throws IOException {
+    private void tldScanJar(JarURLConnection conn) {
 
         JarFile jarFile = null;
+        String name = null;
         try {
             conn.setUseCaches(false);
             jarFile = conn.getJarFile();
             Enumeration<JarEntry> entries = jarFile.entries();
             while (entries.hasMoreElements()) {
                 JarEntry entry = entries.nextElement();
-                String name = entry.getName();
+                name = entry.getName();
                 if (!name.startsWith("META-INF/")) continue;
                 if (!name.endsWith(".tld")) continue;
                 InputStream stream = jarFile.getInputStream(entry);
-                tldScanStream(stream);
+                TldErrorHandler handler = tldScanStream(stream);
+                processErrorHandler(handler, conn.getURL() + name);
             }
+        } catch (IOException ioe) {
+            log.warn(sm.getString("tldConfig.jarFail", conn.getURL() + name),
+                    ioe);
         } finally {
             if (jarFile != null) {
                 try {
@@ -526,6 +574,21 @@ public final class TldConfig  implements
 
 
     /*
+     * Log the non-fatal errors and warnings
+     */
+    private void processErrorHandler(TldErrorHandler handler, String source) {
+       for (SAXParseException e : handler.getWarnings()) {
+           log.warn(sm.getString(
+                   "tldConfig.handlerWarning", e.getMessage(), source));
+       }
+       for (SAXParseException e : handler.getErrors()) {
+           log.warn(sm.getString(
+                   "tldConfig.handlerError", e.getMessage(), source));
+       }
+    }
+    
+    
+    /*
      * Scan the TLD contents in the specified input stream, and register
      * any application event listeners found there.  <b>NOTE</b> - This 
      * method ensure that the InputStream is correctly closed.
@@ -534,12 +597,16 @@ public final class TldConfig  implements
      *
      * @throws IOException  If the file cannot be read
      */
-    private void tldScanStream(InputStream resourceStream) throws IOException {
+    private TldErrorHandler tldScanStream(InputStream resourceStream)
+            throws IOException {
         
         InputSource source = new InputSource(resourceStream);
         
+        TldErrorHandler result = new TldErrorHandler();
+        
         synchronized (tldDigester) {
             try {
+                tldDigester.setErrorHandler(result);
                 tldDigester.push(this);
                 tldDigester.parse(source);
             } catch (SAXException s) {
@@ -555,6 +622,7 @@ public final class TldConfig  implements
                     }
                 }
             }
+            return result;
         }
     }
 



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

Reply via email to