On 27/04/2010 11:19, Konstantin Kolinko wrote: > 2010/4/27 <kkoli...@apache.org>: >> Author: kkolinko >> Date: Tue Apr 27 09:01:37 2010 >> New Revision: 938363 >> >> URL: http://svn.apache.org/viewvc?rev=938363&view=rev >> Log: >> If the class implements both interfaces then call >> addApplicationLifecycleListener only once. >> >> Modified: >> tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java >> >> Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java >> URL: >> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java?rev=938363&r1=938362&r2=938363&view=diff >> ============================================================================== >> --- tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java >> (original) >> +++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java Tue >> Apr 27 09:01:37 2010 >> @@ -1266,13 +1266,9 @@ public class ApplicationContext >> match = true; >> } >> >> - if (t instanceof HttpSessionListener) { >> - context.addApplicationLifecycleListener(t); >> - match = true; >> - } >> - >> - if (t instanceof ServletContextListener) { >> - // TODO SERVLET3 - also need to check caller? spec isn't clear >> + if (t instanceof HttpSessionListener >> + || t instanceof ServletContextListener) { >> + // TODO SERVLET3 - if ServletContextListener then also need to >> check caller? spec isn't clear >> context.addApplicationLifecycleListener(t); >> match = true; >> } >>
I don't think the above change is valid as-is. (I reopened 49181 with an explanation as to why I wanted to change the previous patch.) My reading of the spec suggested that ServletContextListener's can't be added dynamically unless they also implement another EventListener interface. > Regarding the "TODO SERVLET3" comment in the above fragment: > > Reading the first few sentences at the beginning of Chapter 4.4, > ( "These methods can only be called during the initialization of the > application either > from the contexInitialized method of a ServletContextListener > implementation or from the onStartup method of a > ServletContainerInitializer implementation." ) > it looks that it is a state check: > > a) Before we start calling ServletContextListener.contextInitialized() > any listeners allowed in addListener() can be added. > > b) Once we started calling > ServletContextListener.contextInitialized(), a new > ServletContextListener cannot be added anymore. > > c) Once contextInitialized() calls are done, no more listeners, > servlets, filters can be added programmatically. > > Implementing this as a call chain check as the comment suggests, thus > using try+catch+check stack, seems too costly and impractical. I agree, my idea was to pass a wrapped ServletContext to anything that shouldn't be able to call those methods, delegating the other methods but throwing an exception on the dynamic addListener etc methods. yes/no/fail? p > PS. I am not ready to implement this right now, but maybe somebody is. > > Best regards, > Konstantin Kolinko > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org >
signature.asc
Description: OpenPGP digital signature