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 2009/12/07 17:43:28 UTC

svn commit: r887992 - in /tomcat/trunk/java/org/apache/catalina: core/ApplicationDispatcher.java core/ApplicationFilterChain.java core/StandardWrapperValve.java deploy/FilterDef.java startup/ContextConfig.java startup/WebXml.java

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r887992 - in /tomcat/trunk/java/org/apache/catalina: core/ApplicationDispatcher.java core/ApplicationFilterChain.java core/StandardWrapperValve.java deploy/FilterDef.java startup/ContextConfig.java startup/WebXml.java

Posted by Mark Thomas <ma...@apache.org>.
sebb wrote:
> On 07/12/2009, markt@apache.org <ma...@apache.org> wrote:

>>  -            // 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
> 
> Should that be "similar to" ?
> 
> If it really is "simpler", then it would be "simpler than".

Probably. I'll go look at the code and figure out which.

Mark




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


Re: svn commit: r887992 - in /tomcat/trunk/java/org/apache/catalina: core/ApplicationDispatcher.java core/ApplicationFilterChain.java core/StandardWrapperValve.java deploy/FilterDef.java startup/ContextConfig.java startup/WebXml.java

Posted by sebb <se...@gmail.com>.
On 07/12/2009, markt@apache.org <ma...@apache.org> wrote:
> 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

Should that be "similar to" ?

If it really is "simpler", then it would be "simpler than".

>          }
>
>          // 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-unsubscribe@tomcat.apache.org
>  For additional commands, e-mail: dev-help@tomcat.apache.org
>
>

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