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 15:17:15 UTC
svn commit: r887928 - in /tomcat/trunk/java/org/apache/catalina:
Wrapper.java core/ApplicationFilterChain.java core/StandardWrapper.java
deploy/ServletDef.java startup/WebRuleSet.java startup/WebXml.java
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org