Author: remy.maucherat(a)jboss.com
Date: 2009-04-29 12:18:25 -0400 (Wed, 29 Apr 2009)
New Revision: 1035
Modified:
trunk/java/org/apache/catalina/startup/BaseContextScanner.java
trunk/java/org/apache/catalina/startup/ClassLoadingContextScanner.java
trunk/java/org/apache/catalina/startup/ContextConfig.java
trunk/java/org/apache/tomcat/WarComponents.java
Log:
- Do the scanning code for ServletContainerInitializer.
Modified: trunk/java/org/apache/catalina/startup/BaseContextScanner.java
===================================================================
--- trunk/java/org/apache/catalina/startup/BaseContextScanner.java 2009-04-29 02:01:44 UTC
(rev 1034)
+++ trunk/java/org/apache/catalina/startup/BaseContextScanner.java 2009-04-29 16:18:25 UTC
(rev 1035)
@@ -23,7 +23,11 @@
package org.apache.catalina.startup;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
@@ -38,12 +42,12 @@
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
+import javax.servlet.annotation.HandlesTypes;
import org.apache.catalina.Context;
import org.apache.catalina.ContextScanner;
import org.apache.catalina.Globals;
import org.apache.catalina.JarRepository;
-import org.apache.tomcat.WarComponents.JarServletContainerInitializerService;
public abstract class BaseContextScanner
implements ContextScanner {
@@ -108,15 +112,15 @@
protected ArrayList<String> overlays = new ArrayList<String>();
protected ArrayList<String> webFragments = new ArrayList<String>();
protected Map<String, Set<String>> TLDs = new HashMap<String,
Set<String>>();
- protected Map<String, JarServletContainerInitializerService>
jarServletContainerInitializerService =
+ protected Map<String, JarServletContainerInitializerService>
jarServletContainerInitializerServices =
new HashMap<String, JarServletContainerInitializerService>();
/**
* Used to speed up scanning for the services interest classes.
*/
protected Class<?>[] handlesTypesArray = null;
- protected Map<Class<?>, JarServletContainerInitializerService>
handlesTypes =
- new HashMap<Class<?>, JarServletContainerInitializerService>();
+ protected Map<Class<?>, JarServletContainerInitializerServiceImpl>
handlesTypes =
+ new HashMap<Class<?>, JarServletContainerInitializerServiceImpl>();
public Iterator<Class<?>> getAnnotatedClasses() {
@@ -140,7 +144,7 @@
public Map<String, JarServletContainerInitializerService>
getJarServletContainerInitializerServices() {
- return jarServletContainerInitializerService;
+ return jarServletContainerInitializerServices;
}
@@ -389,20 +393,74 @@
* Scan all class files in the given JAR.
*/
public void scanJar(Context context, JarFile file) {
+ // Find webapp descriptor fragments
if (file.getEntry(Globals.WEB_FRAGMENT_PATH) != null) {
webFragments.add(file.getName());
}
+ // Find webapp overlays
if (file.getEntry(Globals.OVERLAY_PATH) != null) {
overlays.add(file.getName());
}
- if (file.getEntry(Globals.SERVLET_CONTAINER_INITIALIZER_SERVICE_PATH) != null) {
- // FIXME: Read Servlet container initializer service file
-
- // FIXME: Load Servlet container initializer class and read HandlesTypes
annotation
-
- // FIXME: Add in jarService map, and add in the local map used to speed up
lookups
-
+ // Find ServletContainerInitializer services
+ JarEntry servletContainerInitializerEntry =
file.getJarEntry(Globals.SERVLET_CONTAINER_INITIALIZER_SERVICE_PATH);
+ String servletContainerInitializerClassName = null;
+ if (servletContainerInitializerEntry != null) {
+ // Read Servlet container initializer service file
+ InputStream is = null;
+ try {
+ is = file.getInputStream(servletContainerInitializerEntry);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ servletContainerInitializerClassName = reader.readLine();
+ int pos = servletContainerInitializerClassName.indexOf('#');
+ if (pos > 0) {
+ servletContainerInitializerClassName =
servletContainerInitializerClassName.substring(0, pos);
+ }
+ servletContainerInitializerClassName =
servletContainerInitializerClassName.trim();
+ } catch (Exception e) {
+ // FIXME: error message or exception
+ } finally {
+ try {
+ if (is != null) {
+ is.close();
+ }
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ // Load Servlet container initializer class and read HandlesTypes annotation
+ Class<?> servletContainerInitializerClass = null;
+ Class<?>[] typesArray = null;
+ if (servletContainerInitializerClassName != null) {
+ try {
+ servletContainerInitializerClass =
context.getLoader().getClassLoader()
+ .loadClass(servletContainerInitializerClassName);
+ if
(servletContainerInitializerClass.isAnnotationPresent(HandlesTypes.class)) {
+ HandlesTypes handlesTypes =
servletContainerInitializerClass.getAnnotation(HandlesTypes.class);
+ typesArray = handlesTypes.value();
+ }
+ } catch (Throwable t) {
+ // FIXME: error message or exception
+ }
+ }
+ // Add in jarService map, and add in the local map used to speed up lookups
+ JarServletContainerInitializerServiceImpl
jarServletContainerInitializerService =
+ new
JarServletContainerInitializerServiceImpl(servletContainerInitializerClass,
handlesTypesArray);
+ jarServletContainerInitializerServices.put(file.getName(),
jarServletContainerInitializerService);
+ if (typesArray != null) {
+ ArrayList<Class<?>> handlesTypesList = new
ArrayList<Class<?>>();
+ if (handlesTypesArray != null) {
+ for (int i = 0; i < handlesTypesArray.length; i++) {
+ handlesTypesList.add(handlesTypesArray[i]);
+ }
+ }
+ for (int i = 0; i < typesArray.length; i++) {
+ handlesTypesList.add(typesArray[i]);
+ handlesTypes.put(typesArray[i],
jarServletContainerInitializerService);
+ }
+ handlesTypesArray = handlesTypesList.toArray(handlesTypesArray);
+ }
}
+ // Find tag library descriptors
HashSet<String> jarTLDs = new HashSet<String>();
Enumeration<JarEntry> entries = file.entries();
while (entries.hasMoreElements()) {
@@ -444,4 +502,27 @@
public abstract Class<?> scanClass(Context context, String className, File
file, JarEntry entry);
+ protected class JarServletContainerInitializerServiceImpl implements
JarServletContainerInitializerService {
+ protected Class<?> servletContainerInitializer = null;
+ protected Class<?>[] interestClasses = null;
+ protected HashSet<String> interestClassNames = new
HashSet<String>();
+ protected JarServletContainerInitializerServiceImpl(Class<?>
servletContainerInitializer, Class<?>[] interestClasses) {
+ this.servletContainerInitializer = servletContainerInitializer;
+ this.interestClasses = interestClasses;
+ }
+ public Class<?> getServletContainerInitializer() {
+ return servletContainerInitializer;
+ }
+ public Class<?>[] getInterestClasses() {
+ return interestClasses;
+ }
+ protected void addInterestClassName(String className) {
+ interestClassNames.add(className);
+ }
+ public String[] getInterestClassesArray() {
+ return interestClassNames.toArray(new String[0]);
+ }
+ }
+
+
}
Modified: trunk/java/org/apache/catalina/startup/ClassLoadingContextScanner.java
===================================================================
--- trunk/java/org/apache/catalina/startup/ClassLoadingContextScanner.java 2009-04-29
02:01:44 UTC (rev 1034)
+++ trunk/java/org/apache/catalina/startup/ClassLoadingContextScanner.java 2009-04-29
16:18:25 UTC (rev 1035)
@@ -39,6 +39,15 @@
// Load the class using the classloader, and see if it implements one of the web
annotations
try {
Class<?> clazz =
context.getLoader().getClassLoader().loadClass(className);
+ if (handlesTypesArray != null) {
+ for (int i = 0; i < handlesTypesArray.length; i++) {
+ if (handlesTypesArray[i].isAssignableFrom(clazz)) {
+ JarServletContainerInitializerServiceImpl
jarServletContainerInitializerService =
+ handlesTypes.get(handlesTypesArray[i]);
+
jarServletContainerInitializerService.addInterestClassName(clazz.getName());
+ }
+ }
+ }
if (clazz.isAnnotationPresent(MultipartConfig.class)
|| clazz.isAnnotationPresent(WebFilter.class)
|| clazz.isAnnotationPresent(WebInitParam.class)
Modified: trunk/java/org/apache/catalina/startup/ContextConfig.java
===================================================================
--- trunk/java/org/apache/catalina/startup/ContextConfig.java 2009-04-29 02:01:44 UTC (rev
1034)
+++ trunk/java/org/apache/catalina/startup/ContextConfig.java 2009-04-29 16:18:25 UTC (rev
1035)
@@ -1459,6 +1459,8 @@
validateSecurityRoles();
}
+ // FIXME: Invoke Servlet container initializer
+
// Configure an authenticator if we need one
if (ok)
authenticatorConfig();
Modified: trunk/java/org/apache/tomcat/WarComponents.java
===================================================================
--- trunk/java/org/apache/tomcat/WarComponents.java 2009-04-29 02:01:44 UTC (rev 1034)
+++ trunk/java/org/apache/tomcat/WarComponents.java 2009-04-29 16:18:25 UTC (rev 1035)
@@ -30,7 +30,7 @@
public interface WarComponents {
public interface JarServletContainerInitializerService {
- public String[] getInterestClasseNames();
+ public String[] getInterestClassesArray();
public Class<?>[] getInterestClasses();
public Class<?> getServletContainerInitializer();
}
Show replies by date