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 2010/05/17 00:29:30 UTC

svn commit: r944928 - in /tomcat/trunk/java/org/apache/catalina/startup: ContextConfig.java LocalStrings.properties TldConfig.java XmlErrorHandler.java

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org