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 2009/07/20 16:39:17 UTC
svn commit: r795860 - in /tomcat/trunk/java/org/apache:
catalina/startup/TldConfig.java jasper/compiler/TldLocationsCache.java
Author: markt
Date: Mon Jul 20 14:39:17 2009
New Revision: 795860
URL: http://svn.apache.org/viewvc?rev=795860&view=rev
Log:
Sync the TLD file scanning code for WEB-INF between Catalina and Jasper
- Based on the Jasper algorithm
- Uses additional checks from Catalina (Jasper now ignores TLD files in WEB-INF/lib and WEB-INF classes)
- Adds comments noting the need to keep the two implementations in sync
Modified:
tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java
tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java
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=795860&r1=795859&r2=795860&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java Mon Jul 20 14:39:17 2009
@@ -29,6 +29,7 @@
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.jar.JarEntry;
@@ -38,6 +39,7 @@
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
+import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.apache.catalina.Context;
@@ -331,7 +333,7 @@
tldScanWebXml();
// Stage 3a - TLDs under WEB-INF (not lib or classes)
- tldScanResourcePaths(context.getResources(), WEB_INF);
+ tldScanResourcePaths(WEB_INF);
// Stage 3b - .jar files in WEB-INF/lib/
tldScanWebInfLib();
@@ -399,51 +401,51 @@
}
/*
- * Scans the web application's subdirectory identified by rootPath,
- * along with its subdirectories, for TLDs.
+ * Scans the web application's sub-directory identified by rootPath,
+ * along with its sub-directories, for TLDs.
*
* Initially, rootPath equals /WEB-INF/. The /WEB-INF/classes and
- * /WEB-INF/lib subdirectories are excluded from the search, as per the
+ * /WEB-INF/lib sub-directories are excluded from the search, as per the
* JSP 2.0 spec.
*
- * @param resources The web application's resources
- * @param rootPath The path whose subdirectories are to be searched for
+ * @param startPath The path whose sub-directories are to be searched for
* TLDs
+ *
+ * Keep code in sync with o.a.j.compiler.TldLocationsCache
*/
- private void tldScanResourcePaths(DirContext resources,
- String rootPath) {
+ private void tldScanResourcePaths(String startPath) {
if (log.isTraceEnabled()) {
- log.trace(sm.getString("tldConfig.webinfScan", rootPath));
+ log.trace(sm.getString("tldConfig.webinfScan", startPath));
}
- try {
- NamingEnumeration<NameClassPair> items = resources.list(rootPath);
- while (items.hasMoreElements()) {
- NameClassPair item = items.nextElement();
- String resourcePath = rootPath + item.getName();
- if (!resourcePath.endsWith(TLD_EXT)
- && (resourcePath.equals("/WEB-INF/classes")
- || resourcePath.equals("/WEB-INF/lib"))) {
+ ServletContext ctxt = getContext().getServletContext();
+
+ Set<String> dirList = ctxt.getResourcePaths(startPath);
+ if (dirList != null) {
+ Iterator<String> it = dirList.iterator();
+ while (it.hasNext()) {
+ String path = it.next();
+ if (!path.endsWith(TLD_EXT)
+ && (path.startsWith("/WEB-INF/lib/")
+ || path.startsWith("/WEB-INF/classes/"))) {
continue;
}
- if (resourcePath.endsWith(TLD_EXT)) {
- if (resourcePath.startsWith("/WEB-INF/tags") &&
- !resourcePath.endsWith("implicit.tld")) {
+ if (path.endsWith(".tld")) {
+ if (path.startsWith("/WEB-INF/tags/") &&
+ !path.endsWith("implicit.tld")) {
continue;
}
try {
- tldScanTld(resourcePath);
+ tldScanTld(path);
} catch (Exception e) {
log.warn(sm.getString(
- "tldConfig.webinfFail", resourcePath),e);
+ "tldConfig.webinfFail", path),e);
}
} else {
- tldScanResourcePaths(resources, resourcePath + '/');
+ tldScanResourcePaths(path);
}
}
- } catch (NamingException e) {
- // Silent catch: it's valid that no /WEB-INF directory exists
}
}
Modified: tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java?rev=795860&r1=795859&r2=795860&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java (original)
+++ tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java Mon Jul 20 14:39:17 2009
@@ -245,7 +245,7 @@
if (initialized) return;
try {
processWebDotXml();
- processTldsInFileSystem("/WEB-INF/");
+ tldScanResourcePaths("/WEB-INF/");
scanJars();
initialized = true;
} catch (Exception ex) {
@@ -416,8 +416,10 @@
* Searches the filesystem under /WEB-INF for any TLD files, and adds
* an implicit map entry to the taglib map for any TLD that has a <uri>
* element.
+ *
+ * Keep code in sync with o.a.c.startup.TldConfig
*/
- private void processTldsInFileSystem(String startPath)
+ private void tldScanResourcePaths(String startPath)
throws Exception {
Set<String> dirList = ctxt.getResourcePaths(startPath);
@@ -425,30 +427,38 @@
Iterator<String> it = dirList.iterator();
while (it.hasNext()) {
String path = it.next();
- if (path.endsWith("/")) {
- processTldsInFileSystem(path);
- }
- if (!path.endsWith(".tld")) {
+ if (!path.endsWith(".tld")
+ && (path.startsWith("/WEB-INF/lib/")
+ || path.startsWith("/WEB-INF/classes/"))) {
continue;
}
- InputStream stream = ctxt.getResourceAsStream(path);
- String uri = null;
- try {
- uri = getUriFromTld(path, stream);
- } finally {
- if (stream != null) {
- try {
- stream.close();
- } catch (Throwable t) {
- // do nothing
+ if (path.endsWith(".tld")) {
+ if (path.startsWith("/WEB-INF/tags/") &&
+ !path.endsWith("implicit.tld")) {
+ continue;
+ }
+ InputStream stream = ctxt.getResourceAsStream(path);
+ String uri = null;
+ try {
+ uri = getUriFromTld(path, stream);
+ } finally {
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (Throwable t) {
+ // do nothing
+ }
}
}
+ // Add implicit map entry only if its uri is not already
+ // present in the map
+ if (uri != null && mappings.get(uri) == null) {
+ mappings.put(uri, new String[] { path, null });
+ }
+ } else {
+ tldScanResourcePaths(path);
}
- // Add implicit map entry only if its uri is not already
- // present in the map
- if (uri != null && mappings.get(uri) == null) {
- mappings.put(uri, new String[] { path, null });
- }
+
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org