You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/02/03 07:27:46 UTC

svn commit: r905910 - in /tomcat/trunk/java/org/apache/catalina/core: ApplicationContext.java LocalStrings.properties StandardContext.java

Author: markt
Date: Wed Feb  3 06:27:46 2010
New Revision: 905910

URL: http://svn.apache.org/viewvc?rev=905910&view=rev
Log:
More servlet 3.0 plumbing
Fix some Eclipse warnings

Modified:
    tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
    tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.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=905910&r1=905909&r2=905910&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java Wed Feb  3 06:27:46 2010
@@ -24,10 +24,13 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Enumeration;
 import java.util.EventListener;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -42,11 +45,17 @@
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextAttributeEvent;
 import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRegistration;
+import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestListener;
 import javax.servlet.SessionCookieConfig;
 import javax.servlet.SessionTrackingMode;
+import javax.servlet.annotation.WebListener;
 import javax.servlet.descriptor.JspConfigDescriptor;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionListener;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.Engine;
@@ -125,17 +134,13 @@
 
     /**
      * Empty String collection to serve as the basis for empty enumerations.
-     * <strong>DO NOT ADD ANY ELEMENTS TO THIS COLLECTION!</strong>
      */
-    private static final ArrayList<String> emptyString =
-        new ArrayList<String>();
+    private static final List<String> emptyString = Collections.emptyList();
 
     /**
      * Empty Servlet collection to serve as the basis for empty enumerations.
-     * <strong>DO NOT ADD ANY ELEMENTS TO THIS COLLECTION!</strong>
      */
-    private static final ArrayList<Servlet> emptyServlet =
-        new ArrayList<Servlet>();
+    private static final List<Servlet> emptyServlet = Collections.emptyList();
 
 
     /**
@@ -395,17 +400,18 @@
 
         // Get query string
         String queryString = null;
-        int pos = path.indexOf('?');
+        String normalizedPath = path;
+        int pos = normalizedPath.indexOf('?');
         if (pos >= 0) {
-            queryString = path.substring(pos + 1);
-            path = path.substring(0, pos);
+            queryString = normalizedPath.substring(pos + 1);
+            normalizedPath = normalizedPath.substring(0, pos);
         }
 
-        path = RequestUtil.normalize(path);
-        if (path == null)
+        normalizedPath = RequestUtil.normalize(normalizedPath);
+        if (normalizedPath == null)
             return (null);
 
-        pos = path.length(); 
+        pos = normalizedPath.length(); 
 
         // Use the thread local URI and mapping data
         DispatchData dd = dispatchData.get();
@@ -428,11 +434,11 @@
              * Ignore any trailing path params (separated by ';') for mapping
              * purposes
              */
-            int semicolon = path.indexOf(';');
+            int semicolon = normalizedPath.indexOf(';');
             if (pos >= 0 && semicolon > pos) {
                 semicolon = -1;
             }
-            uriCC.append(path, 0, semicolon > 0 ? semicolon : pos);
+            uriCC.append(normalizedPath, 0, semicolon > 0 ? semicolon : pos);
             context.getMapper().map(uriMB, mappingData);
             if (mappingData.wrapper == null) {
                 return (null);
@@ -443,7 +449,7 @@
              * RequestDispatcher's requestURI
              */
             if (semicolon > 0) {
-                uriCC.append(path, semicolon, pos - semicolon);
+                uriCC.append(normalizedPath, semicolon, pos - semicolon);
             }
         } catch (Exception e) {
             // Should never happen
@@ -525,17 +531,18 @@
         if (!path.startsWith("/") && Globals.STRICT_SERVLET_COMPLIANCE)
             return null;
 
-        path = RequestUtil.normalize(path);
-        if (path == null)
+        String normalizedPath = RequestUtil.normalize(path);
+        if (normalizedPath == null)
             return (null);
 
         DirContext resources = context.getResources();
         if (resources != null) {
             try {
-                Object resource = resources.lookup(path);
+                Object resource = resources.lookup(normalizedPath);
                 if (resource instanceof Resource)
                     return (((Resource) resource).streamContent());
             } catch (Exception e) {
+                // Ignore
             }
         }
         return (null);
@@ -561,13 +568,13 @@
                 (sm.getString("applicationContext.resourcePaths.iae", path));
         }
 
-        path = RequestUtil.normalize(path);
-        if (path == null)
+        String normalizedPath = RequestUtil.normalize(path);
+        if (normalizedPath == null)
             return (null);
 
         DirContext resources = context.getResources();
         if (resources != null) {
-            return (getResourcePathsInternal(resources, path));
+            return (getResourcePathsInternal(resources, normalizedPath));
         }
         return (null);
 
@@ -825,7 +832,10 @@
      *          else a {@link FilterRegistration.Dynamic} object that can be
      *          used to further configure the filter
      * @throws IllegalStateException if the context has already been initialised
-     * @throws UnsupportedOperationException - TODO SERVLET3
+     * @throws UnsupportedOperationException - if this context was passed to the
+     *         {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+     *         method of a {@link ServletContextListener} that was not declared
+     *         in web.xml, a web-fragment or annotated with {@link WebListener}.
      */
     public FilterRegistration.Dynamic addFilter(String filterName,
             String filterClass) throws IllegalStateException {
@@ -842,7 +852,10 @@
      *          else a {@link FilterRegistration.Dynamic} object that can be
      *          used to further configure the filter
      * @throws IllegalStateException if the context has already been initialised
-     * @throws UnsupportedOperationException - TODO SERVLET3
+     * @throws UnsupportedOperationException - if this context was passed to the
+     *         {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+     *         method of a {@link ServletContextListener} that was not declared
+     *         in web.xml, a web-fragment or annotated with {@link WebListener}.
      */
     public FilterRegistration.Dynamic addFilter(String filterName,
             Filter filter) throws IllegalStateException {
@@ -859,7 +872,10 @@
      *          else a {@link FilterRegistration.Dynamic} object that can be
      *          used to further configure the filter
      * @throws IllegalStateException if the context has already been initialised
-     * @throws UnsupportedOperationException - TODO SERVLET3
+     * @throws UnsupportedOperationException - if this context was passed to the
+     *         {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+     *         method of a {@link ServletContextListener} that was not declared
+     *         in web.xml, a web-fragment or annotated with {@link WebListener}.
      */
     public FilterRegistration.Dynamic addFilter(String filterName,
             Class<? extends Filter> filterClass) throws IllegalStateException {
@@ -876,7 +892,13 @@
                     sm.getString("applicationContext.addFilter.ise",
                             getContextPath()));
         }
-        
+
+        // TODO SERVLET3
+        // throw UnsupportedOperationException - if this context was passed to the
+        // {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+        // method of a {@link ServletContextListener} that was not declared
+        // in web.xml, a web-fragment or annotated with {@link WebListener}.
+
         FilterDef filterDef = context.findFilterDef(filterName);
         
         // Assume a 'complete' FilterRegistration is one that has a class and
@@ -926,19 +948,22 @@
         if (filterDef == null) {
             return null;
         }
-        
         return new ApplicationFilterRegistration(filterDef, context);
     }
+
     
     /**
      * Add servlet to context.
-     * @param   servletName  Name of filter to add
-     * @param   servletClass Name of filter class
+     * @param   servletName  Name of servlet to add
+     * @param   servletClass Name of servlet class
      * @returns <code>null</code> if the servlet has already been fully defined,
      *          else a {@link ServletRegistration.Dynamic} object that can be
      *          used to further configure the servlet
      * @throws IllegalStateException if the context has already been initialised
-     * @throws UnsupportedOperationException - TODO SERVLET3
+     * @throws UnsupportedOperationException - if this context was passed to the
+     *         {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+     *         method of a {@link ServletContextListener} that was not declared
+     *         in web.xml, a web-fragment or annotated with {@link WebListener}.
      */
     public ServletRegistration.Dynamic addServlet(String servletName,
             String servletClass) throws IllegalStateException {
@@ -947,6 +972,19 @@
     }
 
 
+    /**
+     * Add servlet to context.
+     * @param   servletName Name of servlet to add
+     * @param   servlet     Servlet instance to add
+     * @returns <code>null</code> if the servlet has already been fully defined,
+     *          else a {@link ServletRegistration.Dynamic} object that can be
+     *          used to further configure the servlet
+     * @throws IllegalStateException if the context has already been initialised
+     * @throws UnsupportedOperationException - if this context was passed to the
+     *         {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+     *         method of a {@link ServletContextListener} that was not declared
+     *         in web.xml, a web-fragment or annotated with {@link WebListener}.
+     */
     public ServletRegistration.Dynamic addServlet(String servletName,
             Servlet servlet) throws IllegalStateException {
 
@@ -954,6 +992,19 @@
     }
 
     
+    /**
+     * Add servlet to context.
+     * @param   servletName  Name of servlet to add
+     * @param   servletClass Class of servlet to add
+     * @returns <code>null</code> if the servlet has already been fully defined,
+     *          else a {@link ServletRegistration.Dynamic} object that can be
+     *          used to further configure the servlet
+     * @throws IllegalStateException if the context has already been initialised
+     * @throws UnsupportedOperationException - if this context was passed to the
+     *         {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+     *         method of a {@link ServletContextListener} that was not declared
+     *         in web.xml, a web-fragment or annotated with {@link WebListener}.
+     */
     public ServletRegistration.Dynamic addServlet(String servletName,
             Class <? extends Servlet> servletClass)
     throws IllegalStateException {
@@ -971,6 +1022,12 @@
                             getContextPath()));
         }
         
+        // TODO SERVLET3
+        // throw UnsupportedOperationException - if this context was passed to the
+        // {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+        // method of a {@link ServletContextListener} that was not declared
+        // in web.xml, a web-fragment or annotated with {@link WebListener}.
+
         Wrapper wrapper = (Wrapper) context.findChild(servletName);
         
         // Assume a 'complete' FilterRegistration is one that has a class and
@@ -1128,28 +1185,115 @@
     
     @Override
     public void addListener(Class<? extends EventListener> listenerClass) {
-        // TODO SERVLET3
+        EventListener listener;
+        try {
+            listener = createListener(listenerClass);
+        } catch (ServletException e) {
+            throw new IllegalArgumentException(sm.getString(
+                    "applicationContext.addListener.iae.init",
+                    listenerClass.getName()), e);
+        }
+        addListener(listener);
     }
 
 
     @Override
     public void addListener(String className) {
-        // TODO SERVLET3
+        
+        Class<?> clazz;
+        
+        try {
+             clazz = Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            throw new IllegalArgumentException(sm.getString(
+                    "applicationContext.addListener.iae.cnfe", className), e);
+        }
+        
+        if (!EventListener.class.isAssignableFrom(clazz)) {
+            throw new IllegalArgumentException(sm.getString(
+                    "applicationContext.addListener.iae.wrongType", className));
+        }
+
+        try {
+            @SuppressWarnings("unchecked") // tested above
+            EventListener listener = createListener((Class<EventListener>)clazz);
+            addListener(listener);
+        } catch (ServletException e) {
+            throw new IllegalArgumentException(sm.getString(
+                    "applicationContext.addListener.iae.wrongType", className),
+                    e);
+        }
+        
     }
 
 
     @Override
     public <T extends EventListener> void addListener(T t) {
+        if (context.getAvailable()) {
+            throw new IllegalStateException(
+                    sm.getString("applicationContext.addListener.ise",
+                            getContextPath()));
+        }
+
         // TODO SERVLET3
+        // throw UnsupportedOperationException - if this context was passed to the
+        // {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
+        // method of a {@link ServletContextListener} that was not declared
+        // in web.xml, a web-fragment or annotated with {@link WebListener}.
+
+        if (t instanceof ServletContextAttributeListener ||
+                t instanceof ServletRequestListener ||
+                t instanceof ServletRequestAttributeListener ||
+                t instanceof HttpSessionAttributeListener) {
+            context.addApplicationEventListener(t);
+            return;
+        }
+        
+        if (t instanceof HttpSessionListener) {
+            context.addApplicationLifecycleListener(t);
+        }
+        
+        if (t instanceof ServletContextListener) {
+            // TODO SERVLET3 - also need to check caller? spec isn't clear
+            context.addApplicationLifecycleListener(t);
+        }
+        
+        throw new IllegalArgumentException(sm.getString(
+                "applicationContext.addListener.iae.wrongType",
+                t.getClass().getName()));
+
     }
 
 
     @Override
     public <T extends EventListener> T createListener(Class<T> c)
             throws ServletException {
-        // TODO SERVLET3
-        return null;
-    }
+        try {
+            @SuppressWarnings("unchecked")
+            T listener =
+                (T) context.getInstanceManager().newInstance(c.getName());
+            if (listener instanceof ServletContextListener ||
+                    listener instanceof ServletContextAttributeListener ||
+                    listener instanceof ServletRequestListener ||
+                    listener instanceof ServletRequestAttributeListener ||
+                    listener instanceof HttpSessionListener ||
+                    listener instanceof HttpSessionAttributeListener) {
+                return listener;
+            }
+            throw new IllegalArgumentException(sm.getString(
+                    "applicationContext.addListener.iae.wrongType",
+                    listener.getClass().getName()));
+        } catch (IllegalAccessException e) {
+            throw new ServletException(e);
+        } catch (InvocationTargetException e) {
+            throw new ServletException(e);
+        } catch (NamingException e) {
+            throw new ServletException(e);
+        } catch (InstantiationException e) {
+            throw new ServletException(e);
+        } catch (ClassNotFoundException e) {
+            throw new ServletException(e);
+        }    }
 
 
     @Override
@@ -1217,8 +1361,16 @@
 
     @Override
     public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
-        // TODO SERVLET3
-        return null;
+        Map<String, ApplicationFilterRegistration> result =
+            new HashMap<String, ApplicationFilterRegistration>();
+        
+        FilterDef[] filterDefs = context.findFilterDefs();
+        for (FilterDef filterDef : filterDefs) {
+            result.put(filterDef.getFilterName(),
+                    new ApplicationFilterRegistration(filterDef, context));
+        }
+
+        return result;
     }
 
 
@@ -1231,6 +1383,10 @@
 
     @Override
     public Map<String, ? extends ServletRegistration> getServletRegistrations() {
+        Map<String, ApplicationServletRegistration > result =
+            new HashMap<String, ApplicationServletRegistration>();
+        
+        context.findChildren();
         // TODO SERVLET3
         return null;
     }

Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=905910&r1=905909&r2=905910&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Wed Feb  3 06:27:46 2010
@@ -14,6 +14,9 @@
 # limitations under the License.
 
 applicationContext.addFilter.ise=Filters can not be added to context {0} as the context has been initialised
+applicationContext.addListener.iae.cnfe=Unable to create an instance of type [{0}]
+applicationContext.addListener.iae.wrongType=The type specified [{0}] is not one of the expected listener types
+applicationContext.addListener.ise=Listeners can not be added to context {0} as the context has been initialised
 applicationContext.addRole.ise=Roles can not be added to context {0} as the context has been initialised
 applicationContext.addServlet.ise=Servlets can not be added to context {0} as the context has been initialised
 applicationContext.attributeEvent=Exception thrown by attributes event listener

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=905910&r1=905909&r2=905910&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Wed Feb  3 06:27:46 2010
@@ -1007,6 +1007,20 @@
 
 
     /**
+     * Add a listener to the end of the list of initialized application event
+     * listeners.
+     */
+    public void addApplicationEventListener(Object listener) {
+        int len = applicationEventListenersObjects.length;
+        Object[] newListeners = new Object[len + 1];
+        System.arraycopy(applicationEventListenersObjects, 0,
+                newListeners, 0, len);
+        newListeners[len + 1] = listener;
+        applicationEventListenersObjects = newListeners;
+    }
+    
+    
+    /**
      * Return the set of initialized application lifecycle listener objects,
      * in the order they were specified in the web application deployment
      * descriptor, for this application.
@@ -1032,6 +1046,20 @@
 
 
     /**
+     * Add a listener to the end of the list of initialized application
+     * lifecycle listeners.
+     */
+    public void addApplicationLifecycleListener(Object listener) {
+        int len = applicationLifecycleListenersObjects.length;
+        Object[] newListeners = new Object[len + 1];
+        System.arraycopy(applicationLifecycleListenersObjects, 0,
+                newListeners, 0, len);
+        newListeners[len + 1] = listener;
+        applicationLifecycleListenersObjects = newListeners;
+    }
+
+    
+    /**
      * Return the antiJARLocking flag for this Context.
      */
     public boolean getAntiJARLocking() {



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org