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