You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by sebb <se...@gmail.com> on 2009/12/08 02:24:57 UTC

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

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


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