Author: markt Date: Sun May 16 22:29:29 2010 New Revision: 944928 URL: http://svn.apache.org/viewvc?rev=944928&view=rev Log: Refactor XML validation error handling. Error reporting in web.xml and web-fragment.xml now includes source info.
Added: tomcat/trunk/java/org/apache/catalina/startup/XmlErrorHandler.java (with props) Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java 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/ContextConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=944928&r1=944927&r2=944928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Sun May 16 22:29:29 2010 @@ -90,7 +90,6 @@ import org.apache.tomcat.JarScannerCallb import org.apache.tomcat.util.res.StringManager; import org.apache.tomcat.util.digester.Digester; import org.apache.tomcat.util.digester.RuleSet; -import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXParseException; @@ -611,10 +610,12 @@ public class ContextConfig contextDigester.setUseContextClassLoader(false); contextDigester.push(context.getParent()); contextDigester.push(context); - ContextErrorHandler errorHandler = new ContextErrorHandler(); + XmlErrorHandler errorHandler = new XmlErrorHandler(); contextDigester.setErrorHandler(errorHandler); contextDigester.parse(source); - if (errorHandler.parseException != null) { + if (errorHandler.getWarnings().size() > 0 || + errorHandler.getErrors().size() > 0) { + errorHandler.logFindings(log, contextXml.toString()); ok = false; } if (log.isDebugEnabled()) @@ -1590,7 +1591,7 @@ public class ContextConfig if (source == null) return; - ContextErrorHandler handler = new ContextErrorHandler(); + XmlErrorHandler handler = new XmlErrorHandler(); // Web digesters and rulesets are shared between contexts but are not // thread safe. Whilst there should only be one thread at a time @@ -1615,8 +1616,10 @@ public class ContextConfig try { digester.parse(source); - if (handler.getParseException() != null) { + if (handler.getWarnings().size() > 0 || + handler.getErrors().size() > 0) { ok = false; + handler.logFindings(log, source.getSystemId()); } } catch (SAXParseException e) { log.error(sm.getString("contextConfig.applicationParse", @@ -2228,7 +2231,7 @@ public class ContextConfig stream = jarFile.getInputStream(fragmentEntry); InputSource source = new InputSource( urlConn.getJarFileURL().toString() + - File.separatorChar + FRAGMENT_LOCATION); + "!/" + FRAGMENT_LOCATION); source.setByteStream(stream); parseWebXml(source, fragment, true); } @@ -2295,29 +2298,4 @@ public class ContextConfig return fragments; } } - - - protected static class ContextErrorHandler - implements ErrorHandler { - - private SAXParseException parseException = null; - - public void error(SAXParseException exception) { - parseException = exception; - } - - public void fatalError(SAXParseException exception) { - parseException = exception; - } - - public void warning(SAXParseException exception) { - parseException = exception; - } - - public SAXParseException getParseException() { - return parseException; - } - } - - } 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=944928&r1=944927&r2=944928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties Sun May 16 22:29:29 2010 @@ -105,8 +105,6 @@ 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}] @@ -122,4 +120,5 @@ userConfig.start=UserConfig: Processing userConfig.stop=UserConfig: Processing STOP webRuleSet.absoluteOrdering=<absolute-ordering> element not valid in web-fragment.xml and will be ignored webRuleSet.relativeOrdering=<ordering> element not valid in web.xml and will be ignored - +xmlErrorHandler.error=Non-fatal error [{0}] reported processing [{1}]. +xmlErrorHandler.warning=Warning [{0}] reported processing [{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=944928&r1=944927&r2=944928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java Sun May 16 22:29:29 2010 @@ -14,11 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.startup; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -47,10 +44,8 @@ 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; /** @@ -346,43 +341,6 @@ 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 @@ -422,8 +380,8 @@ public final class TldConfig implements try { InputStream stream = context.getServletContext( ).getResourceAsStream(resourcePath); - TldErrorHandler handler = tldScanStream(stream); - processErrorHandler(handler, resourcePath); + XmlErrorHandler handler = tldScanStream(stream); + handler.logFindings(log, resourcePath); taglibUris.add(descriptor.getTaglibURI()); webxmlTaglibUris.add(descriptor.getTaglibURI()); } catch (IOException ioe) { @@ -469,8 +427,8 @@ public final class TldConfig implements } InputStream stream = ctxt.getResourceAsStream(path); try { - TldErrorHandler handler = tldScanStream(stream); - processErrorHandler(handler, path); + XmlErrorHandler handler = tldScanStream(stream); + handler.logFindings(log, path); } catch (IOException ioe) { log.warn(sm.getString("tldConfig.webinfFail", path), ioe); @@ -512,9 +470,8 @@ public final class TldConfig implements InputStream stream = null; try { stream = new FileInputStream(fileList[i]); - TldErrorHandler handler = tldScanStream(stream); - processErrorHandler(handler, - fileList[i].getAbsolutePath()); + XmlErrorHandler handler = tldScanStream(stream); + handler.logFindings(log, fileList[i].getAbsolutePath()); } catch (IOException ioe) { log.warn(sm.getString("tldConfig.dirFail", fileList[i].getAbsolutePath()), @@ -555,8 +512,8 @@ public final class TldConfig implements if (!name.startsWith("META-INF/")) continue; if (!name.endsWith(".tld")) continue; InputStream stream = jarFile.getInputStream(entry); - TldErrorHandler handler = tldScanStream(stream); - processErrorHandler(handler, conn.getURL() + name); + XmlErrorHandler handler = tldScanStream(stream); + handler.logFindings(log, conn.getURL() + name); } } catch (IOException ioe) { log.warn(sm.getString("tldConfig.jarFail", conn.getURL() + name), @@ -574,21 +531,6 @@ 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. @@ -597,12 +539,12 @@ public final class TldConfig implements * * @throws IOException If the file cannot be read */ - private TldErrorHandler tldScanStream(InputStream resourceStream) + private XmlErrorHandler tldScanStream(InputStream resourceStream) throws IOException { InputSource source = new InputSource(resourceStream); - TldErrorHandler result = new TldErrorHandler(); + XmlErrorHandler result = new XmlErrorHandler(); synchronized (tldDigester) { try { Added: tomcat/trunk/java/org/apache/catalina/startup/XmlErrorHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/XmlErrorHandler.java?rev=944928&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/XmlErrorHandler.java (added) +++ tomcat/trunk/java/org/apache/catalina/startup/XmlErrorHandler.java Sun May 16 22:29:29 2010 @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.catalina.startup; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.juli.logging.Log; +import org.apache.tomcat.util.res.StringManager; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +public class XmlErrorHandler implements ErrorHandler { + + private static final StringManager sm = + StringManager.getManager(Constants.Package); + + 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; + } + + public void logFindings(Log log, String source) { + for (SAXParseException e : getWarnings()) { + log.warn(sm.getString( + "xmlErrorHandler.warning", e.getMessage(), source)); + } + for (SAXParseException e : getErrors()) { + log.warn(sm.getString( + "xmlErrorHandler.error", e.getMessage(), source)); + } + } +} Propchange: tomcat/trunk/java/org/apache/catalina/startup/XmlErrorHandler.java ------------------------------------------------------------------------------ svn:eol-style = native --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org