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: [email protected]
For additional commands, e-mail: [email protected]