From: markt Date: Thu, 6 Aug 2009 13:08:31 +0000 (+0000) Subject: TLD handling improvements X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=9cac91db3e6c992466444292b7451354edb931df;p=tomcat7.0 TLD handling improvements - make non standard behaviour configurable - add a few more log messages - sync method names git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@801637 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/startup/LocalStrings.properties b/java/org/apache/catalina/startup/LocalStrings.properties index 071fe48ec..455d26e37 100644 --- a/java/org/apache/catalina/startup/LocalStrings.properties +++ b/java/org/apache/catalina/startup/LocalStrings.properties @@ -93,7 +93,9 @@ hostConfig.undeploying=Undeploying deployed web applications tldConfig.addListeners=Adding {0} listeners from TLD files tldConfig.cce=Lifecycle event data object {0} is not a Context tldConfig.classloaderFail=Failed to process ''{0}'' for TLDs. +tldConfig.classloaderStart=Scanning for TLDs in classloader hierarchy tldConfig.execute=Error processing TLD files for context path {0} +tldConfig.jarUrlStart=Scanning for TLD files in URL ''{0}'' tldConfig.webinflibStart=Scanning WEB-INF/lib for JARs containing META-INF/**/*.TLD tldConfig.webinflibJarFail=Failed to scan JAR ''{0}'' for TLDs tldConfig.webinfFail=Failed to process TLD found at ''{0}'' diff --git a/java/org/apache/catalina/startup/TldConfig.java b/java/org/apache/catalina/startup/TldConfig.java index 1a472fb7f..33bf53d42 100644 --- a/java/org/apache/catalina/startup/TldConfig.java +++ b/java/org/apache/catalina/startup/TldConfig.java @@ -63,6 +63,12 @@ public final class TldConfig implements LifecycleListener { private static final String WEB_INF = "/WEB-INF/"; private static final String WEB_INF_LIB = "/WEB-INF/lib/"; + // Configuration properties + private static final boolean SCAN_CLASSPATH = Boolean.valueOf( + System.getProperty( + "org.apache.jasper.compiler.TldLocationsCache.SCAN_CLASSPATH", + "true")).booleanValue(); + // Names of JARs that are known not to contain any TLDs private static HashSet noTldJars; @@ -334,7 +340,9 @@ public final class TldConfig implements LifecycleListener { tldScanWebInfLib(); // Stage 4 - Additional entries from the container - tldScanClassloaders(); + if (SCAN_CLASSPATH) { + tldScanClassloaders(); + } // Now add all the listeners we found to the listeners for this context String list[] = getTldListeners(); @@ -511,6 +519,10 @@ public final class TldConfig implements LifecycleListener { */ private void tldScanClassloaders() { + if (log.isTraceEnabled()) { + log.trace(sm.getString("tldConfig.classloaderStart")); + } + ClassLoader loader = Thread.currentThread().getContextClassLoader(); @@ -543,6 +555,10 @@ public final class TldConfig implements LifecycleListener { * Keep in sync with o.a.j.comiler.TldLocationsCache */ private void tldScanJar(URL url) throws IOException { + if (log.isTraceEnabled()) { + log.trace(sm.getString("tldConfig.jarUrlStart", url)); + } + URLConnection conn = url.openConnection(); if (conn instanceof JarURLConnection) { tldScanJar((JarURLConnection) conn); diff --git a/java/org/apache/jasper/compiler/TldLocationsCache.java b/java/org/apache/jasper/compiler/TldLocationsCache.java index b87b18110..dc8134076 100644 --- a/java/org/apache/jasper/compiler/TldLocationsCache.java +++ b/java/org/apache/jasper/compiler/TldLocationsCache.java @@ -95,6 +95,12 @@ public class TldLocationsCache { private static final String JAR_EXT = ".jar"; private static final String TLD_EXT = ".tld"; + // Configuration properties + private static final boolean SCAN_CLASSPATH = Boolean.valueOf( + System.getProperty( + "org.apache.jasper.compiler.TldLocationsCache.SCAN_CLASSPATH", + "true")).booleanValue(); + // Names of JARs that are known not to contain any TLDs private static HashSet noTldJars; @@ -245,7 +251,9 @@ public class TldLocationsCache { tldScanWebXml(); tldScanResourcePaths(WEB_INF); tldScanWebInfLib(); - tldScanClassloaders(); + if (SCAN_CLASSPATH) { + tldScanClassloaders(); + } initialized = true; } catch (Exception ex) { throw new JasperException(Localizer.getMessage( @@ -467,13 +475,13 @@ public class TldLocationsCache { private void tldScanJar(URL url) throws IOException { URLConnection conn = url.openConnection(); if (conn instanceof JarURLConnection) { - scanJar((JarURLConnection) conn); + tldScanJar((JarURLConnection) conn); } else { String urlStr = url.toString(); if (urlStr.startsWith(FILE_PROTOCOL) && urlStr.endsWith(JAR_EXT)) { URL jarURL = new URL("jar:" + urlStr + "!/"); - scanJar((JarURLConnection) jarURL.openConnection()); + tldScanJar((JarURLConnection) jarURL.openConnection()); } } } @@ -487,7 +495,7 @@ public class TldLocationsCache { * * Keep in sync with o.a.c.startup.TldConfig */ - private void scanJar(JarURLConnection conn) throws IOException { + private void tldScanJar(JarURLConnection conn) throws IOException { JarFile jarFile = null; String resourcePath = conn.getJarFileURL().toString(); diff --git a/webapps/docs/config/systemprops.xml b/webapps/docs/config/systemprops.xml index 1bb9104cb..8d60ed9dd 100644 --- a/webapps/docs/config/systemprops.xml +++ b/webapps/docs/config/systemprops.xml @@ -94,6 +94,15 @@ true will be used.

+ +

When scanning the class path for TLDs, should Jasper scan all JAR files + in the classpath, including those provided by the web application's parent + clasloaders? This is intended for sharing tag libraries between multiple + web applications by making the JAR available via the common or shared + classloader. If not specified, the default value of true will + be used.

+
+

If true, any tag buffer that expands beyond org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE will be