From e37b2a2d9ccf0a4d9071b39f62c8ad986fdb3093 Mon Sep 17 00:00:00 2001 From: markt Date: Thu, 16 Jun 2011 17:24:03 +0000 Subject: [PATCH] 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. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1136550 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/catalina/startup/ContextConfig.java | 1 + .../startup/TestContextConfigAnnotation.java | 96 ++++++++++++++++++++++ webapps/docs/changelog.xml | 5 ++ 3 files changed, 102 insertions(+) diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java index ac396c981..b6d406c45 100644 --- a/java/org/apache/catalina/startup/ContextConfig.java +++ b/java/org/apache/catalina/startup/ContextConfig.java @@ -1985,6 +1985,7 @@ public class ContextConfig for (ServletContainerInitializer sci : entry.getValue()) { initializerClassMap.get(sci).add(clazz); } + match = false; } } } diff --git a/test/org/apache/catalina/startup/TestContextConfigAnnotation.java b/test/org/apache/catalina/startup/TestContextConfigAnnotation.java index 085eae44b..ec3153cd2 100644 --- a/test/org/apache/catalina/startup/TestContextConfigAnnotation.java +++ b/test/org/apache/catalina/startup/TestContextConfigAnnotation.java @@ -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 extends TestCase { 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>()); + + // Add an SCI with an interest in Servlets + SCI sciServlet = new SCI(); + config.initializerClassMap.put(sciServlet, new HashSet>()); + config.typeInitializerMap.put(Servlet.class, + new HashSet()); + 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>()); + config.typeInitializerMap.put(Object.class, + new HashSet()); + 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> 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 * diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index a12e630ce..1145e5a61 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -59,6 +59,11 @@ initialized when the web application started and a load on startup value was set. (markt) + + 51386: Correct code for processing @HandlesTypes annotations + so only types of interest are reported to a ServletContainerInitializer. + (markt) + -- 2.11.0