From 3b364f12fbd0a41bd83a8d88aa7cc63a1ec18ce4 Mon Sep 17 00:00:00 2001 From: markt Date: Fri, 3 Oct 2008 11:53:28 +0000 Subject: [PATCH] Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=45933 Don't use parser from web-app for tld files git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@701355 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/catalina/core/StandardContext.java | 42 ++---------- .../catalina/startup/LocalStrings.properties | 2 + java/org/apache/catalina/startup/TldConfig.java | 75 ++++++++++++++++------ 3 files changed, 60 insertions(+), 59 deletions(-) diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java index 1fdd0e2e2..514eb92e7 100644 --- a/java/org/apache/catalina/core/StandardContext.java +++ b/java/org/apache/catalina/core/StandardContext.java @@ -4267,10 +4267,6 @@ public class StandardContext ((Lifecycle) pipeline).start(); } - if(getProcessTlds()) { - processTlds(); - } - // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(START_EVENT, null); @@ -4481,40 +4477,6 @@ public class StandardContext } /** - * Processes TLDs. - * - * @throws LifecycleException If an error occurs - */ - protected void processTlds() throws LifecycleException { - TldConfig tldConfig = new TldConfig(); - tldConfig.setContext(this); - - // (1) check if the attribute has been defined - // on the context element. - tldConfig.setTldValidation(tldValidation); - tldConfig.setTldNamespaceAware(tldNamespaceAware); - - // (2) if the attribute wasn't defined on the context - // try the host. - if (!tldValidation) { - tldConfig.setTldValidation - (((StandardHost) getParent()).getXmlValidation()); - } - - if (!tldNamespaceAware) { - tldConfig.setTldNamespaceAware - (((StandardHost) getParent()).getXmlNamespaceAware()); - } - - try { - tldConfig.execute(); - } catch (Exception ex) { - log.error("Error reading tld listeners " - + ex.toString(), ex); - } - } - - /** * Stop this Context component. * * @exception LifecycleException if a shutdown error occurs @@ -5327,6 +5289,10 @@ public class StandardContext return; } } + if (processTlds) { + this.addLifecycleListener(new TldConfig()); + } + super.init(); // Notify our interested LifecycleListeners diff --git a/java/org/apache/catalina/startup/LocalStrings.properties b/java/org/apache/catalina/startup/LocalStrings.properties index e953db4be..de5c08aee 100644 --- a/java/org/apache/catalina/startup/LocalStrings.properties +++ b/java/org/apache/catalina/startup/LocalStrings.properties @@ -87,6 +87,8 @@ hostConfig.stop=HostConfig: Processing STOP hostConfig.undeploy=Undeploying context [{0}] hostConfig.undeploy.error=Error undeploying web application at context path {0} hostConfig.undeploying=Undeploying deployed web applications +tldConfig.cce=Lifecycle event data object {0} is not a Context +tldConfig.execute=Error processing TLD files for context path {0} userConfig.database=Exception loading user database userConfig.deploy=Deploying web application for user {0} userConfig.deploying=Deploying user web applications diff --git a/java/org/apache/catalina/startup/TldConfig.java b/java/org/apache/catalina/startup/TldConfig.java index 1dde2ec1f..fd891c72b 100644 --- a/java/org/apache/catalina/startup/TldConfig.java +++ b/java/org/apache/catalina/startup/TldConfig.java @@ -47,20 +47,24 @@ import javax.naming.directory.DirContext; import javax.servlet.ServletException; import org.apache.catalina.Context; +import org.apache.catalina.Lifecycle; +import org.apache.catalina.LifecycleEvent; +import org.apache.catalina.LifecycleListener; import org.apache.catalina.core.StandardContext; +import org.apache.catalina.core.StandardHost; import org.apache.catalina.util.StringManager; import org.apache.tomcat.util.digester.Digester; import org.xml.sax.InputSource; /** - * Startup event listener for a Context that configures the properties - * of that Context, and the associated defined servlets. + * Startup event listener for a Context that configures application + * listeners configured in any TLD files. * * @author Craig R. McClanahan * @author Jean-Francois Arcand * @author Costin Manolache */ -public final class TldConfig { +public final class TldConfig implements LifecycleListener { // Names of JARs that are known not to contain any TLDs private static HashSet noTldJars; @@ -387,20 +391,6 @@ public final class TldConfig { } /** - * Create (if necessary) and return a Digester configured to process a tag - * library descriptor, looking for additional listener classes to be - * registered. - */ - private static Digester createTldDigester() { - - return DigesterFactory.newDigester(tldValidation, - tldNamespaceAware, - new TldRuleSet()); - - } - - - /** * Scan the JAR file at the specified resource path for TLDs in the * META-INF subdirectory, and scan each TLD for application * event listeners that need to be registered. @@ -502,10 +492,6 @@ public final class TldConfig { private void tldScanStream(InputSource resourceStream) throws Exception { - if (tldDigester == null){ - tldDigester = createTldDigester(); - } - synchronized (tldDigester) { try { tldDigester.push(this); @@ -730,4 +716,51 @@ public final class TldConfig { return jarPathMap; } + + public void lifecycleEvent(LifecycleEvent event) { + // Identify the context we are associated with + try { + context = (Context) event.getLifecycle(); + } catch (ClassCastException e) { + log.error(sm.getString("tldConfig.cce", event.getLifecycle()), e); + return; + } + + if (event.getType().equals(Lifecycle.INIT_EVENT)) { + init(); + } else if (event.getType().equals(Lifecycle.START_EVENT)) { + try { + execute(); + } catch (Exception e) { + log.error(sm.getString( + "tldConfig.execute", context.getPath()), e); + } + } // Ignore the other event types - nothing to do + } + + private void init() { + if (tldDigester == null){ + // (1) check if the attribute has been defined + // on the context element. + setTldValidation(context.getTldValidation()); + setTldNamespaceAware(context.getTldNamespaceAware()); + + // (2) if the attribute wasn't defined on the context + // try the host. + if (!tldValidation) { + setTldValidation( + ((StandardHost) context.getParent()).getXmlValidation()); + } + + if (!tldNamespaceAware) { + setTldNamespaceAware( + ((StandardHost) context.getParent()).getXmlNamespaceAware()); + } + + tldDigester = DigesterFactory.newDigester(tldValidation, + tldNamespaceAware, + new TldRuleSet()); + tldDigester.getParser(); + } + } } -- 2.11.0