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