Author: markt Date: Thu Jun 16 17:24:03 2011 New Revision: 1136550 URL: http://svn.apache.org/viewvc?rev=1136550&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51386 Correct code for processing @HandlesTypes annotations so only types of interest are reported to a ServletContainerInitializer.
Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1136550&r1=1136549&r2=1136550&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Thu Jun 16 17:24:03 2011 @@ -1985,6 +1985,7 @@ public class ContextConfig for (ServletContainerInitializer sci : entry.getValue()) { initializerClassMap.get(sci).add(clazz); } + match = false; } } } Modified: tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java?rev=1136550&r1=1136549&r2=1136550&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java (original) +++ tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java Thu Jun 16 17:24:03 2011 @@ -16,14 +16,23 @@ */ package org.apache.catalina.startup; +import java.beans.PropertyChangeListener; import java.io.File; import java.net.URL; +import java.util.HashSet; import java.util.Set; import javax.servlet.DispatcherType; +import javax.servlet.Servlet; +import javax.servlet.ServletContainerInitializer; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; import junit.framework.TestCase; +import org.apache.catalina.Container; +import org.apache.catalina.Loader; +import org.apache.catalina.core.StandardContext; import org.apache.catalina.deploy.FilterDef; import org.apache.catalina.deploy.FilterMap; import org.apache.catalina.deploy.ServletDef; @@ -241,6 +250,93 @@ public class TestContextConfigAnnotation assertNull(filterDef); } + public void testCheckHandleTypes() throws Exception { + ContextConfig config = new ContextConfig(); + + // Need a Context, Loader and ClassLoader for checkHandleTypes + StandardContext context = new StandardContext(); + context.setLoader(new TesterLoader()); + config.context = context; + + // Add an SCI that has no interest in any type + SCI sciNone = new SCI(); + config.initializerClassMap.put(sciNone, new HashSet<Class<?>>()); + + // Add an SCI with an interest in Servlets + SCI sciServlet = new SCI(); + config.initializerClassMap.put(sciServlet, new HashSet<Class<?>>()); + config.typeInitializerMap.put(Servlet.class, + new HashSet<ServletContainerInitializer>()); + config.typeInitializerMap.get(Servlet.class).add(sciServlet); + + // Add an SCI with an interest in Objects - i.e. everything + SCI sciObject = new SCI(); + config.initializerClassMap.put(sciObject, new HashSet<Class<?>>()); + config.typeInitializerMap.put(Object.class, + new HashSet<ServletContainerInitializer>()); + config.typeInitializerMap.get(Object.class).add(sciObject); + + // Scan Servlet, Filter, Servlet, Listener + WebXml ignore = new WebXml(); + File file = paramClassResource( + "org/apache/catalina/startup/ParamServlet"); + config.processAnnotationsFile(file, ignore); + file = paramClassResource("org/apache/catalina/startup/ParamFilter"); + config.processAnnotationsFile(file, ignore); + file = paramClassResource("org/apache/catalina/startup/TesterServlet"); + config.processAnnotationsFile(file, ignore); + file = paramClassResource("org/apache/catalina/startup/TestListener"); + config.processAnnotationsFile(file, ignore); + + // Check right number of classes were noted to be handled + assertEquals(0, config.initializerClassMap.get(sciNone).size()); + assertEquals(2, config.initializerClassMap.get(sciServlet).size()); + assertEquals(4, config.initializerClassMap.get(sciObject).size()); + } + + private static final class SCI implements ServletContainerInitializer { + @Override + public void onStartup(Set<Class<?>> c, ServletContext ctx) + throws ServletException { + // NO-OP. Just need a class that implements SCI. + } + } + + private static final class TesterLoader implements Loader { + + @Override + public void backgroundProcess() {} + @Override + public ClassLoader getClassLoader() { + return this.getClass().getClassLoader(); + } + @Override + public Container getContainer() { return null; } + @Override + public void setContainer(Container container) {} + @Override + public boolean getDelegate() { return false; } + @Override + public void setDelegate(boolean delegate) {} + @Override + public String getInfo() { return null; } + @Override + public boolean getReloadable() { return false; } + @Override + public void setReloadable(boolean reloadable) {} + @Override + public void addPropertyChangeListener(PropertyChangeListener l) { + } + @Override + public void addRepository(String repository) {} + @Override + public String[] findRepositories() { return null; } + @Override + public boolean modified() { return false; } + @Override + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + /** * Find compiled test class * Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1136550&r1=1136549&r2=1136550&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Thu Jun 16 17:24:03 2011 @@ -59,6 +59,11 @@ initialized when the web application started and a load on startup value was set. (markt) </fix> + <fix> + <bug>51386</bug>: Correct code for processing @HandlesTypes annotations + so only types of interest are reported to a ServletContainerInitializer. + (markt) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org