Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51386
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Thu, 16 Jun 2011 17:24:03 +0000 (17:24 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Thu, 16 Jun 2011 17:24:03 +0000 (17:24 +0000)
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

java/org/apache/catalina/startup/ContextConfig.java
test/org/apache/catalina/startup/TestContextConfigAnnotation.java
webapps/docs/changelog.xml

index ac396c9..b6d406c 100644 (file)
@@ -1985,6 +1985,7 @@ public class ContextConfig
                 for (ServletContainerInitializer sci : entry.getValue()) {
                     initializerClassMap.get(sci).add(clazz);
                 }
+                match = false;
             }
         }
     }
index 085eae4..ec3153c 100644 (file)
  */
 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<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
      * 
index a12e630..1145e5a 100644 (file)
         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">