tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tim Funk <funk...@joedog.org>
Subject Re: svn commit: r701355 - in /tomcat/trunk/java/org/apache/catalina: core/StandardContext.java startup/LocalStrings.properties startup/TldConfig.java
Date Fri, 03 Oct 2008 12:08:37 GMT
Unless I am missing something - we will now have a one TldConfig per 
Context. And each TldConfig will have its own tldDigester. But the 
tldDigester is only used once on startup to find all the listeners.

So tldDigester only needs to live for the life of execute() where 
eventType=Lifecycle.START_EVENT.

Long story short:
I think tldDigester can now be a local variable in the execute() method. 
That way the tldDigester can be deallocated after startup by how the 
variable is scoped.

-Tim

markt@apache.org wrote:
> Author: markt
> Date: Fri Oct  3 04:53:28 2008
> New Revision: 701355
> 
> URL: http://svn.apache.org/viewvc?rev=701355&view=rev
> Log:
> Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=45933
> Don't use parser from web-app for tld files
> 
> Modified:
>     tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
>     tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
>     tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java
> 
> Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=701355&r1=701354&r2=701355&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Fri Oct  3 04:53:28
2008
> @@ -4267,10 +4267,6 @@
>                      ((Lifecycle) pipeline).start();
>                  }
>                  
> -                if(getProcessTlds()) {
> -                    processTlds();
> -                }
> -                
>                  // Notify our interested LifecycleListeners
>                  lifecycle.fireLifecycleEvent(START_EVENT, null);
>                  
> @@ -4481,40 +4477,6 @@
>      }
>  
>      /**
> -     * 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 @@
>                  return;
>              }
>          }
> +        if (processTlds) {
> +            this.addLifecycleListener(new TldConfig());
> +        }
> +
>          super.init();
>          
>          // Notify our interested LifecycleListeners
> 
> Modified: tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties?rev=701355&r1=701354&r2=701355&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties (original)
> +++ tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties Fri Oct  3
04:53:28 2008
> @@ -87,6 +87,8 @@
>  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
> 
> 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=701355&r1=701354&r2=701355&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java Fri Oct  3 04:53:28
2008
> @@ -47,20 +47,24 @@
>  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 <b>Context</b> that configures the properties
> - * of that Context, and the associated defined servlets.
> + * Startup event listener for a <b>Context</b> 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<String> noTldJars;
> @@ -387,20 +391,6 @@
>      }
>  
>      /**
> -     * 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
>       * <code>META-INF</code> subdirectory, and scan each TLD for application
>       * event listeners that need to be registered.
> @@ -502,10 +492,6 @@
>      private void tldScanStream(InputSource resourceStream)
>          throws Exception {
>  
> -        if (tldDigester == null){
> -            tldDigester = createTldDigester();
> -        }
> -        
>          synchronized (tldDigester) {
>              try {
>                  tldDigester.push(this);
> @@ -730,4 +716,51 @@
>  
>          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();
> +        }
> +    }
>  }
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message