Author: markt
Date: Mon Dec  7 16:43:25 2009
New Revision: 887992

URL: http://svn.apache.org/viewvc?rev=887992&view=rev
Log:
Add support for WebFilter
Remove wrappers to implement isAsyncSupported() having found the setAttribute() 
code
It is individual filters rather than the whole filter chain that need to be 
considered for isAsyncSupported

Modified:
    tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java
    tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java
    tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java
    tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
    tomcat/trunk/java/org/apache/catalina/startup/WebXml.java

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java?rev=887992&r1=887991&r2=887992&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java Mon 
Dec  7 16:43:25 2009
@@ -641,15 +641,6 @@
         ApplicationFilterChain filterChain = factory.createFilterChain(request,
                                                                 
wrapper,servlet);
         
-        Object origAsyncSupported = 
request.getAttribute(Globals.ASYNC_SUPPORTED_ATTR);
-        //we have a new filter chain, setup isAsyncSupported here
-        boolean filterAsyncSupported = filterChain.isAsyncSupported();
-        if (!filterAsyncSupported && request.isAsyncSupported()) {
-            //the request says we support it, but the filters don't
-            //TODO SERVLET3 - async
-            request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, Boolean.FALSE);
-        }
-        
         // Call the service() method for the allocated servlet instance
         try {
             String jspFile = wrapper.getJspFile();
@@ -704,8 +695,6 @@
             
wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException",
                              wrapper.getName()), e);
             runtimeException = e;
-        } finally {
-            request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, 
origAsyncSupported);
         }
 
         // Release the filter chain (if any) for this request
@@ -715,7 +704,7 @@
         } catch (Throwable e) {
             
wrapper.getLogger().error(sm.getString("standardWrapper.releaseFilters",
                              wrapper.getName()), e);
-            // FIXME: Exception handling needs to be simpiler to what is in 
the StandardWrapperValue
+            // FIXME: Exception handling needs to be simpler to what is in the 
StandardWrapperValue
         }
 
         // Deallocate the allocated servlet instance

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java?rev=887992&r1=887991&r2=887992&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java Mon 
Dec  7 16:43:25 2009
@@ -28,10 +28,8 @@
 import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
-import javax.servlet.ServletRequestWrapper;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.catalina.Globals;
@@ -224,6 +222,11 @@
                 support.fireInstanceEvent(InstanceEvent.BEFORE_FILTER_EVENT,
                                           filter, request, response);
                 
+                if (request.isAsyncSupported() && "false".equalsIgnoreCase(
+                        filterConfig.getFilterDef().getAsyncSupported())) {
+                    request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,
+                            Boolean.FALSE);
+                }
                 if( Globals.IS_SECURITY_ENABLED ) {
                     final ServletRequest req = request;
                     final ServletResponse res = response;
@@ -275,25 +278,17 @@
 
             support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT,
                                       servlet, request, response);
-            ServletRequest wRequest; 
             if (request.isAsyncSupported()
                     && !support.getWrapper().isAsyncSupported()) {
-                if (request instanceof HttpServletRequest) {
-                    wRequest = new HttpServletRequestNoAsyc(
-                            (HttpServletRequest) request);
-                } else {
-                    // Must be a ServletRequest
-                    wRequest = new ServletRequestNoAsyc(request);
-                }
-            } else {
-                wRequest = request;
+                request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,
+                        Boolean.FALSE);
             }
             // Use potentially wrapped request from this point
-            if ((wRequest instanceof HttpServletRequest) &&
+            if ((request instanceof HttpServletRequest) &&
                 (response instanceof HttpServletResponse)) {
                     
                 if( Globals.IS_SECURITY_ENABLED ) {
-                    final ServletRequest req = wRequest;
+                    final ServletRequest req = request;
                     final ServletResponse res = response;
                     Principal principal = 
                         ((HttpServletRequest) req).getUserPrincipal();
@@ -305,12 +300,11 @@
                                                principal);   
                     args = null;
                 } else {  
-                    servlet.service(wRequest, response);
+                    servlet.service(request, response);
                 }
             } else {
-                servlet.service(wRequest, response);
+                servlet.service(request, response);
             }
-            // Stop using wrapped request now Servlet has been processed
             support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
                                       servlet, request, response);
         } catch (IOException e) {
@@ -586,42 +580,4 @@
         this.support = support;
 
     }
-    
-    public boolean isAsyncSupported() {
-        boolean supported = true;
-        for (ApplicationFilterConfig config : filters) {
-            if (config!=null && config.getFilterDef()!=null) {
-                supported = supported & 
config.getFilterDef().isAsyncSupported();
-            }
-        }
-        return supported;
-    }
-
-
-    // --------------------------------- Wrapper classes for isAsyncSupported()
-    
-    private class HttpServletRequestNoAsyc extends HttpServletRequestWrapper {
-
-        public HttpServletRequestNoAsyc(HttpServletRequest request) {
-            super(request);
-        }
-        
-        @Override
-        public boolean isAsyncSupported() {
-            return false;
-        }
-    }
-
-    private class ServletRequestNoAsyc extends ServletRequestWrapper {
-
-        public ServletRequestNoAsyc(ServletRequest request) {
-            super(request);
-        }
-        
-        @Override
-        public boolean isAsyncSupported() {
-            return false;
-        }
-    }
-
 }

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java?rev=887992&r1=887991&r2=887992&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java Mon 
Dec  7 16:43:25 2009
@@ -203,10 +203,6 @@
         
         // Reset comet flag value after creating the filter chain
         request.setComet(false);
-        //check filters to see if we support async or not.
-        if (filterChain != null && request.isAsyncSupported()) {
-            request.setAsyncSupported(filterChain.isAsyncSupported());
-        }
 
         // Call the filter chain for this request
         // NOTE: This also calls the servlet's service() method

Modified: tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java?rev=887992&r1=887991&r2=887992&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java (original)
+++ tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java Mon Dec  7 
16:43:25 2009
@@ -136,13 +136,13 @@
         this.smallIcon = smallIcon;
     }
     
-    private boolean asyncSupported = false;
+    private String asyncSupported = null;
     
-    public boolean isAsyncSupported() {
+    public String getAsyncSupported() {
         return asyncSupported;
     }
-    
-    public void setAsyncSupported(boolean asyncSupported) {
+
+    public void setAsyncSupported(String asyncSupported) {
         this.asyncSupported = asyncSupported;
     }
 

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=887992&r1=887991&r2=887992&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Mon Dec  7 
16:43:25 2009
@@ -1673,10 +1673,11 @@
             String type = ae.getAnnotationType();
             if ("Ljavax/servlet/annotation/WebServlet;".equals(type)) {
                 processAnnotationWebServlet(className, ae, fragment);
+            }else if ("Ljavax/servlet/annotation/WebFilter;".equals(type)) {
+                processAnnotationWebFilter(className, ae, fragment);
             }else if ("Ljavax/servlet/annotation/WebListener;".equals(type)) {
                 fragment.addListener(className);
             } else {
-                // TODO SERVLET 3 - Other annotations
                 // Unknown annotation - ignore
             }
         }
@@ -1688,22 +1689,22 @@
             // Skip this annotation. Entry in web.xml takes priority
             return;
         }
-        boolean mappingSet = false;
+        boolean urlPatternsSet = false;
         ServletDef servletDef = new ServletDef();
         servletDef.setServletName(className);
         servletDef.setServletClass(className);
-        String[] mappings = null;
+        String[] urlPatterns = null;
 
         ElementValuePair[] evps = ae.getElementValuePairs();
         for (ElementValuePair evp : evps) {
             String name = evp.getNameString();
             if ("value".equals(name) || "urlPatterns".equals(name)) {
-                if (mappingSet) {
+                if (urlPatternsSet) {
                     throw new IllegalArgumentException(sm.getString(
                             "contextConfig.urlPatternValue", className));
                 }
-                mappingSet = true;
-                mappings = processAnnotationsUrlPatterns(evp.getValue());
+                urlPatternsSet = true;
+                urlPatterns = processAnnotationsStringArray(evp.getValue());
             } else if ("name".equals(name)) {
                 servletDef.setServletName(evp.getValue().stringifyValue());
             } else if ("description".equals(name)) {
@@ -1729,16 +1730,82 @@
                 // Ignore
             }
         }
-        if (mappings != null) {
+        if (urlPatterns != null) {
             fragment.addServlet(servletDef);
-            for (String mapping : mappings) {
-                fragment.addServletMapping(mapping,
+            for (String urlPattern : urlPatterns) {
+                fragment.addServletMapping(urlPattern,
                         servletDef.getServletName());
             }
         }
     }
 
-    protected String[] processAnnotationsUrlPatterns(ElementValue ev) {
+    protected void processAnnotationWebFilter(String className,
+            AnnotationEntry ae, WebXml fragment) {
+        if (fragment.getFilters().containsKey(className)) {
+            // Skip this annotation. Entry in web.xml takes priority
+            return;
+        }
+        boolean urlPatternsSet = false;
+        FilterDef filterDef = new FilterDef();
+        FilterMap filterMap = new FilterMap();
+        filterDef.setFilterName(className);
+        filterDef.setFilterClass(className);
+        String[] urlPatterns = null;
+
+        ElementValuePair[] evps = ae.getElementValuePairs();
+        for (ElementValuePair evp : evps) {
+            String name = evp.getNameString();
+            if ("value".equals(name) || "urlPatterns".equals(name)) {
+                if (urlPatternsSet) {
+                    throw new IllegalArgumentException(sm.getString(
+                            "contextConfig.urlPatternValue", className));
+                }
+                urlPatternsSet = true;
+                urlPatterns = processAnnotationsStringArray(evp.getValue());
+                for (String urlPattern : urlPatterns) {
+                    filterMap.addURLPattern(urlPattern);
+                }
+            } else if ("filterName".equals(name)) {
+                filterDef.setFilterName(evp.getValue().stringifyValue());
+            } else if ("servletNames".equals(name)) {
+                String[] servletNames =
+                    processAnnotationsStringArray(evp.getValue());
+                for (String servletName : servletNames) {
+                    filterMap.addServletName(servletName);
+                }
+            } else if ("dispatcherTypes".equals(name)) {
+                String[] dispatcherTypes =
+                    processAnnotationsStringArray(evp.getValue());
+                for (String dispatcherType : dispatcherTypes) {
+                    filterMap.setDispatcher(dispatcherType);
+                }
+            } else if ("description".equals(name)) {
+                filterDef.setDescription(evp.getValue().stringifyValue());
+            } else if ("displayName".equals(name)) {
+                filterDef.setDisplayName(evp.getValue().stringifyValue());
+            } else if ("largeIcon".equals(name)) {
+                filterDef.setLargeIcon(evp.getValue().stringifyValue());
+            } else if ("smallIcon".equals(name)) {
+                filterDef.setSmallIcon(evp.getValue().stringifyValue());
+            } else if ("asyncSupported".equals(name)) {
+                filterDef.setAsyncSupported(evp.getValue().stringifyValue());
+            } else if ("initParams".equals(name)) {
+                Map<String,String> initParams =
+                    processAnnotationWebInitParams(evp.getValue());
+                for (String paramName : initParams.keySet()) {
+                    filterDef.addInitParameter(paramName,
+                            initParams.get(paramName));
+                }
+            } else {
+                // Ignore
+            }
+        }
+        fragment.addFilter(filterDef);
+        filterMap.setFilterName(filterDef.getFilterName());
+        fragment.addFilterMapping(filterMap);
+    }
+
+    protected String[] processAnnotationsStringArray(ElementValue ev) {
         ArrayList<String> values = new ArrayList<String>();
         if (ev instanceof ArrayElementValue) {
             ElementValue[] arrayValues =

Modified: tomcat/trunk/java/org/apache/catalina/startup/WebXml.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/WebXml.java?rev=887992&r1=887991&r2=887992&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/WebXml.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/WebXml.java Mon Dec  7 
16:43:25 2009
@@ -962,11 +962,15 @@
     }
     
     private boolean mergeFilter(FilterDef src, FilterDef dest, boolean 
failOnConflict) {
-        if (src.isAsyncSupported() != dest.isAsyncSupported()) {
-            // Always fail
-            return false;
+        if (dest.getAsyncSupported() == null) {
+            dest.setAsyncSupported(src.getAsyncSupported());
+        } else if (src.getAsyncSupported() != null) {
+            if (failOnConflict &&
+                    !src.getAsyncSupported().equals(dest.getAsyncSupported())) 
{
+                return false;
+            }
         }
-        
+
         if (dest.getFilterClass()  == null) {
             dest.setFilterClass(src.getFilterClass());
         } else if (src.getFilterClass() != null) {



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

Reply via email to