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