On 07/12/2009, [email protected] <[email protected]> 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: [email protected] > For additional commands, e-mail: [email protected] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
