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;
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;
tldScanWebXml();
// Stage 3a - TLDs under WEB-INF (not lib or classes)
- tldScanResourcePaths(WEB_INF);
+ tldScanResourcePaths(context.getResources(), WEB_INF);
// Stage 3b - .jar files in WEB-INF/lib/
tldScanWebInfLib();
}
/*
- * Scans the web application's sub-directory identified by rootPath,
- * along with its sub-directories, for TLDs.
+ * Scans the web application's subdirectory identified by rootPath,
+ * along with its subdirectories, for TLDs.
*
* Initially, rootPath equals /WEB-INF/. The /WEB-INF/classes and
- * /WEB-INF/lib sub-directories are excluded from the search, as per the
+ * /WEB-INF/lib subdirectories are excluded from the search, as per the
* JSP 2.0 spec.
*
- * @param startPath The path whose sub-directories are to be searched for
+ * @param resources The web application's resources
+ * @param rootPath The path whose subdirectories are to be searched for
* TLDs
- *
- * Keep code in sync with o.a.j.compiler.TldLocationsCache
*/
- private void tldScanResourcePaths(String startPath) {
+ private void tldScanResourcePaths(DirContext resources,
+ String rootPath) {
if (log.isTraceEnabled()) {
- log.trace(sm.getString("tldConfig.webinfScan", startPath));
+ log.trace(sm.getString("tldConfig.webinfScan", rootPath));
}
- 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/"))) {
+ 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"))) {
continue;
}
- if (path.endsWith(".tld")) {
- if (path.startsWith("/WEB-INF/tags/") &&
- !path.endsWith("implicit.tld")) {
+ if (resourcePath.endsWith(TLD_EXT)) {
+ if (resourcePath.startsWith("/WEB-INF/tags") &&
+ !resourcePath.endsWith("implicit.tld")) {
continue;
}
try {
- tldScanTld(path);
+ tldScanTld(resourcePath);
} catch (Exception e) {
log.warn(sm.getString(
- "tldConfig.webinfFail", path),e);
+ "tldConfig.webinfFail", resourcePath),e);
}
} else {
- tldScanResourcePaths(path);
+ tldScanResourcePaths(resources, resourcePath + '/');
}
}
+ } catch (NamingException e) {
+ // Silent catch: it's valid that no /WEB-INF directory exists
}
}