Author: markt Date: Mon Dec 7 14:17:14 2009 New Revision: 887928 URL: http://svn.apache.org/viewvc?rev=887928&view=rev Log: Add async-supported impl for Servlets
Modified: tomcat/trunk/java/org/apache/catalina/Wrapper.java tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java tomcat/trunk/java/org/apache/catalina/deploy/ServletDef.java tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java tomcat/trunk/java/org/apache/catalina/startup/WebXml.java Modified: tomcat/trunk/java/org/apache/catalina/Wrapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Wrapper.java?rev=887928&r1=887927&r2=887928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/Wrapper.java (original) +++ tomcat/trunk/java/org/apache/catalina/Wrapper.java Mon Dec 7 14:17:14 2009 @@ -347,5 +347,17 @@ * Set the multi-part configuration for the associated servlet. To clear the * multi-part configuration specify <code>null</code> as the new value. */ - public void setMultipartConfigElement(MultipartConfigElement multipartConfig); + public void setMultipartConfigElement( + MultipartConfigElement multipartConfig); + + /** + * Does the associated Servlet support async processing? Defaults to + * <code>true</code> + */ + public boolean isAsyncSupported(); + + /** + * Set the async support for the associated servlet. + */ + public void setAsyncSupported(boolean asyncSupport); } 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=887928&r1=887927&r2=887928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java Mon Dec 7 14:17:14 2009 @@ -28,8 +28,10 @@ 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; @@ -273,11 +275,25 @@ support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT, servlet, request, response); - if ((request instanceof HttpServletRequest) && + 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; + } + // Use potentially wrapped request from this point + if ((wRequest instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) { if( Globals.IS_SECURITY_ENABLED ) { - final ServletRequest req = request; + final ServletRequest req = wRequest; final ServletResponse res = response; Principal principal = ((HttpServletRequest) req).getUserPrincipal(); @@ -289,11 +305,12 @@ principal); args = null; } else { - servlet.service(request, response); + servlet.service(wRequest, response); } } else { - servlet.service(request, response); + servlet.service(wRequest, response); } + // Stop using wrapped request now Servlet has been processed support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT, servlet, request, response); } catch (IOException e) { @@ -581,4 +598,30 @@ } + // --------------------------------- 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/StandardWrapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java?rev=887928&r1=887927&r2=887928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java Mon Dec 7 14:17:14 2009 @@ -260,6 +260,11 @@ * Multipart config */ protected MultipartConfigElement multipartConfigElement = null; + + /** + * Async support + */ + protected boolean asyncSupported = true; /** * Static class array used when the SecurityManager is turned on and @@ -1502,6 +1507,15 @@ this.multipartConfigElement = multipartConfigElement; } + @Override + public boolean isAsyncSupported() { + return asyncSupported; + } + + public void setAsyncSupported(boolean asyncSupported) { + this.asyncSupported = asyncSupported; + } + // -------------------------------------------------------- Package Methods Modified: tomcat/trunk/java/org/apache/catalina/deploy/ServletDef.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/ServletDef.java?rev=887928&r1=887927&r2=887928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/deploy/ServletDef.java (original) +++ tomcat/trunk/java/org/apache/catalina/deploy/ServletDef.java Mon Dec 7 14:17:14 2009 @@ -220,4 +220,18 @@ public void setMultipartDef(MultipartDef multipartDef) { this.multipartDef = multipartDef; } + + + /** + * Does this servlet support async. + */ + private String asyncSupported = null; + + public String getAsyncSupported() { + return this.asyncSupported; + } + + public void setAsyncSupported(String asyncSupported) { + this.asyncSupported = asyncSupported; + } } Modified: tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java?rev=887928&r1=887927&r2=887928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java Mon Dec 7 14:17:14 2009 @@ -383,6 +383,10 @@ digester.addCallMethod(fullPrefix + "/servlet/multipart-config/file-size-threshold", "setFileSizeThreshold", 0); + digester.addCallMethod(fullPrefix + "/servlet/async-supported", + "setAsyncSupported", 0); + + digester.addRule(fullPrefix + "/servlet-mapping", new CallMethodMultiRule("addServletMapping", 2, 0)); digester.addCallParam(fullPrefix + "/servlet-mapping/servlet-name", 1); 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=887928&r1=887927&r2=887928&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/WebXml.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/WebXml.java Mon Dec 7 14:17:14 2009 @@ -18,7 +18,6 @@ package org.apache.catalina.startup; -import java.io.File; import java.net.URL; import java.util.HashMap; import java.util.HashSet; @@ -30,7 +29,6 @@ import java.util.Set; import javax.servlet.MultipartConfigElement; -import javax.servlet.ServletContext; import org.apache.catalina.Context; import org.apache.catalina.Wrapper; @@ -517,9 +515,6 @@ // messageDestinations were ignored in Tomcat 6, so ignore here - // TODO SERVLET3 - This needs to be more fine-grained. Whether or not to - // process annotations on destroy() will depend on where - // the filter/servlet was loaded from. Joy. context.setIgnoreAnnotations(metadataComplete); for (String extension : mimeMappings.keySet()) { context.addMimeMapping(extension, mimeMappings.get(extension)); @@ -582,6 +577,10 @@ multipartdef.getLocation())); } } + if (servlet.getAsyncSupported() != null) { + wrapper.setAsyncSupported( + Boolean.parseBoolean(servlet.getAsyncSupported())); + } context.addChild(wrapper); } for (String pattern : servletMappings.keySet()) { @@ -1050,6 +1049,15 @@ dest.getMultipartDef(), failOnConflict); } + if (dest.getAsyncSupported() == null) { + dest.setAsyncSupported(src.getAsyncSupported()); + } else if (src.getAsyncSupported() != null) { + if (failOnConflict && + !src.getAsyncSupported().equals(dest.getAsyncSupported())) { + return false; + } + } + return true; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org