Author: markt
Date: Tue Apr 12 15:54:46 2016
New Revision: 1738818

URL: http://svn.apache.org/viewvc?rev=1738818&view=rev
Log:
Create a dedicated package to access Servlet 4.0 features.
Ensure the HTTP/2 push example works under a security manager.

Added:
    tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationMapping.java
      - copied, changed from r1738650, 
tomcat/trunk/java/org/apache/catalina/core/ApplicationMapping.java
    tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/GenericFilter.java
      - copied, changed from r1738622, 
tomcat/trunk/java/javax/servlet/GenericFilter.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/RequestDispatcher.java
   (with props)
    tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/   (with 
props)
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpFilter.java
      - copied, changed from r1738622, 
tomcat/trunk/java/javax/servlet/http/HttpFilter.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequest.java
   (with props)
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequestWrapper.java
      - copied, changed from r1738622, 
tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/Mapping.java
      - copied, changed from r1738622, 
tomcat/trunk/java/javax/servlet/http/Mapping.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/MappingMatch.java
      - copied, changed from r1738622, 
tomcat/trunk/java/javax/servlet/http/MappingMatch.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/PushBuilder.java
      - copied, changed from r1738622, 
tomcat/trunk/java/javax/servlet/http/PushBuilder.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/package-info.java 
  (with props)
    
tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestApplicationMapping.java
      - copied, changed from r1738622, 
tomcat/trunk/test/org/apache/catalina/core/TestApplicationMapping.java
Modified:
    tomcat/tc8.5.x/trunk/conf/catalina.policy
    tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/RequestFacade.java
    tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationContext.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java
    tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/Mapper.java
    tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/MappingData.java
    
tomcat/tc8.5.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
    tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml
    
tomcat/tc8.5.x/trunk/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java

Modified: tomcat/tc8.5.x/trunk/conf/catalina.policy
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/conf/catalina.policy?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/conf/catalina.policy (original)
+++ tomcat/tc8.5.x/trunk/conf/catalina.policy Tue Apr 12 15:54:46 2016
@@ -189,6 +189,10 @@ grant {
     // Applications using WebSocket need to be able to access these packages
     permission java.lang.RuntimePermission 
"accessClassInPackage.org.apache.tomcat.websocket";
     permission java.lang.RuntimePermission 
"accessClassInPackage.org.apache.tomcat.websocket.server";
+
+    // Applications need to access these packages to use the Servlet 4.0 
Preview
+    permission java.lang.RuntimePermission 
"accessClassInPackage.org.apache.catalina.servlet4preview";
+    permission java.lang.RuntimePermission 
"accessClassInPackage.org.apache.catalina.servlet4preview.http";
 };
 
 

Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/Request.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/Request.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/Request.java 
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/Request.java Tue 
Apr 12 15:54:46 2016
@@ -74,11 +74,14 @@ import org.apache.catalina.Realm;
 import org.apache.catalina.Session;
 import org.apache.catalina.TomcatPrincipal;
 import org.apache.catalina.Wrapper;
+import org.apache.catalina.core.ApplicationMapping;
 import org.apache.catalina.core.ApplicationPart;
 import org.apache.catalina.core.ApplicationPushBuilder;
 import org.apache.catalina.core.ApplicationSessionCookieConfig;
 import org.apache.catalina.core.AsyncContextImpl;
 import org.apache.catalina.mapper.MappingData;
+import org.apache.catalina.servlet4preview.http.Mapping;
+import org.apache.catalina.servlet4preview.http.PushBuilder;
 import org.apache.catalina.util.ParameterMap;
 import org.apache.coyote.ActionCode;
 import org.apache.coyote.UpgradeToken;
@@ -116,7 +119,7 @@ import org.ietf.jgss.GSSException;
  * @author Remy Maucherat
  * @author Craig R. McClanahan
  */
-public class Request implements HttpServletRequest {
+public class Request implements 
org.apache.catalina.servlet4preview.http.HttpServletRequest {
 
     private static final Log log = LogFactory.getLog(Request.class);
 
@@ -481,6 +484,7 @@ public class Request implements HttpServ
         }
 
         mappingData.recycle();
+        applicationMapping.recycle();
 
         applicationRequest = null;
         if (Globals.IS_SECURITY_ENABLED || Connector.RECYCLE_FACADES) {
@@ -619,6 +623,7 @@ public class Request implements HttpServ
      * Mapping data.
      */
     protected final MappingData mappingData = new MappingData();
+    private final ApplicationMapping applicationMapping = new 
ApplicationMapping(mappingData);
 
     /**
      * @return mapping data.
@@ -1902,6 +1907,7 @@ public class Request implements HttpServ
      *
      * @return {@code true} If this request supports server push
      */
+    @Override
     public boolean isPushSupported() {
         AtomicBoolean result = new AtomicBoolean();
         coyoteRequest.action(ActionCode.IS_PUSH_SUPPORTED, result);
@@ -1915,7 +1921,8 @@ public class Request implements HttpServ
      *
      * @return A builder to use to construct the push request
      */
-    public ApplicationPushBuilder getPushBuilder() {
+    @Override
+    public PushBuilder getPushBuilder() {
         return new ApplicationPushBuilder(this);
     }
 
@@ -2181,6 +2188,12 @@ public class Request implements HttpServ
     }
 
 
+    @Override
+    public Mapping getMapping() {
+        return applicationMapping.getMapping();
+    }
+
+
     /**
      * @return the HTTP request method used in this Request.
      */

Modified: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/RequestFacade.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/RequestFacade.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/RequestFacade.java 
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/connector/RequestFacade.java 
Tue Apr 12 15:54:46 2016
@@ -34,15 +34,16 @@ import javax.servlet.ServletInputStream;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpUpgradeHandler;
 import javax.servlet.http.Part;
 
 import org.apache.catalina.Globals;
-import org.apache.catalina.core.ApplicationPushBuilder;
 import org.apache.catalina.security.SecurityUtil;
+import org.apache.catalina.servlet4preview.http.HttpServletRequest;
+import org.apache.catalina.servlet4preview.http.Mapping;
+import org.apache.catalina.servlet4preview.http.PushBuilder;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -1116,12 +1117,37 @@ public class RequestFacade implements Ht
 
 
     /**
+     * {@inheritDoc}
+     * <p>
+     * Pulled forward from Servlet 4.0. The method signature may be modified,
+     * removed or replaced at any time until Servlet 4.0 becomes final.
+     */
+    @Override
+    public Mapping getMapping() {
+        return request.getMapping();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * <p>
      * Pulled forward from Servlet 4.0. The method signature may be modified,
      * removed or replaced at any time until Servlet 4.0 becomes final.
-     *
-     * @return A builder to use to construct the push request
      */
-    public ApplicationPushBuilder getPushBuilder() {
+    @Override
+    public boolean isPushSupported() {
+        return request.isPushSupported();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * Pulled forward from Servlet 4.0. The method signature may be modified,
+     * removed or replaced at any time until Servlet 4.0 becomes final.
+     */
+    @Override
+    public PushBuilder getPushBuilder() {
         return request.getPushBuilder();
     }
 }

Modified: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationContext.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationContext.java 
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationContext.java 
Tue Apr 12 15:54:46 2016
@@ -63,6 +63,7 @@ import org.apache.catalina.WebResourceRo
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.mapper.MappingData;
+import org.apache.catalina.servlet4preview.http.Mapping;
 import org.apache.catalina.util.ServerInfo;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.buf.CharChunk;
@@ -375,7 +376,7 @@ public class ApplicationContext
         if (wrapper == null)
             return (null);
 
-        return new ApplicationDispatcher(wrapper, null, null, null, null, 
name);
+        return new ApplicationDispatcher(wrapper, null, null, null, null, 
null, name);
 
     }
 
@@ -460,13 +461,14 @@ public class ApplicationContext
         Wrapper wrapper = mappingData.wrapper;
         String wrapperPath = mappingData.wrapperPath.toString();
         String pathInfo = mappingData.pathInfo.toString();
+        Mapping mapping = (new ApplicationMapping(mappingData)).getMapping();
 
         mappingData.recycle();
 
         // Construct a RequestDispatcher to process this request
         return new ApplicationDispatcher
             (wrapper, uriCC.toString(), wrapperPath, pathInfo,
-             queryString, null);
+             queryString, mapping, null);
 
     }
 

Modified: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java 
(original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java 
Tue Apr 12 15:54:46 2016
@@ -44,6 +44,7 @@ import org.apache.catalina.connector.Req
 import org.apache.catalina.connector.RequestFacade;
 import org.apache.catalina.connector.Response;
 import org.apache.catalina.connector.ResponseFacade;
+import org.apache.catalina.servlet4preview.http.Mapping;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.res.StringManager;
 
@@ -199,12 +200,13 @@ final class ApplicationDispatcher implem
      *  (if any)
      * @param queryString Query string parameters included with this request
      *  (if any)
+     * @param mapping The mapping for this resource (if any)
      * @param name Servlet name (if a named dispatcher was created)
      *  else <code>null</code>
      */
     public ApplicationDispatcher
         (Wrapper wrapper, String requestURI, String servletPath,
-         String pathInfo, String queryString, String name) {
+         String pathInfo, String queryString, Mapping mapping, String name) {
 
         super();
 
@@ -215,6 +217,7 @@ final class ApplicationDispatcher implem
         this.servletPath = servletPath;
         this.pathInfo = pathInfo;
         this.queryString = queryString;
+        this.mapping = mapping;
         this.name = name;
     }
 
@@ -258,6 +261,12 @@ final class ApplicationDispatcher implem
 
 
     /**
+     * The mapping for this RequestDispatcher.
+     */
+    private final Mapping mapping;
+
+
+    /**
      * The StringManager for this package.
      */
     private static final StringManager sm = 
StringManager.getManager(Constants.Package);
@@ -349,8 +358,7 @@ final class ApplicationDispatcher implem
                 (ApplicationHttpRequest) wrapRequest(state);
             String contextPath = context.getPath();
             HttpServletRequest hrequest = state.hrequest;
-            if (hrequest.getAttribute(
-                    RequestDispatcher.FORWARD_REQUEST_URI) == null) {
+            if (hrequest.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI) 
== null) {
                 wrequest.setAttribute(RequestDispatcher.FORWARD_REQUEST_URI,
                                       hrequest.getRequestURI());
                 wrequest.setAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH,
@@ -361,6 +369,16 @@ final class ApplicationDispatcher implem
                                       hrequest.getPathInfo());
                 wrequest.setAttribute(RequestDispatcher.FORWARD_QUERY_STRING,
                                       hrequest.getQueryString());
+                Mapping mapping;
+                if (hrequest instanceof 
org.apache.catalina.servlet4preview.http.HttpServletRequest) {
+                    mapping = 
((org.apache.catalina.servlet4preview.http.HttpServletRequest)
+                            hrequest).getMapping();
+                } else {
+                    mapping = (new ApplicationMapping(null)).getMapping();
+                }
+                wrequest.setAttribute(
+                        
org.apache.catalina.servlet4preview.RequestDispatcher.FORWARD_MAPPING,
+                        mapping);
             }
 
             wrequest.setContextPath(contextPath);
@@ -371,6 +389,7 @@ final class ApplicationDispatcher implem
                 wrequest.setQueryString(queryString);
                 wrequest.setQueryParams(queryString);
             }
+            wrequest.setMapping(mapping);
 
             processRequest(request,response,state);
         }
@@ -560,6 +579,11 @@ final class ApplicationDispatcher implem
                                       queryString);
                 wrequest.setQueryParams(queryString);
             }
+            if (mapping != null) {
+                wrequest.setAttribute(
+                        
org.apache.catalina.servlet4preview.RequestDispatcher.INCLUDE_MAPPING,
+                        mapping);
+            }
 
             wrequest.setAttribute(Globals.DISPATCHER_TYPE_ATTR,
                     DispatcherType.INCLUDE);

Modified: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java 
(original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java 
Tue Apr 12 15:54:46 2016
@@ -31,13 +31,14 @@ import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpSession;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.Globals;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Session;
+import org.apache.catalina.servlet4preview.http.Mapping;
+import org.apache.catalina.servlet4preview.http.PushBuilder;
 import org.apache.catalina.util.ParameterMap;
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.MessageBytes;
@@ -59,7 +60,8 @@ import org.apache.tomcat.util.http.Param
  * @author Craig R. McClanahan
  * @author Remy Maucherat
  */
-class ApplicationHttpRequest extends HttpServletRequestWrapper {
+class ApplicationHttpRequest
+        extends 
org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper {
 
 
     // ------------------------------------------------------- Static Variables
@@ -74,11 +76,13 @@ class ApplicationHttpRequest extends Htt
       RequestDispatcher.INCLUDE_SERVLET_PATH,
       RequestDispatcher.INCLUDE_PATH_INFO,
       RequestDispatcher.INCLUDE_QUERY_STRING,
+      org.apache.catalina.servlet4preview.RequestDispatcher.INCLUDE_MAPPING,
       RequestDispatcher.FORWARD_REQUEST_URI,
       RequestDispatcher.FORWARD_CONTEXT_PATH,
       RequestDispatcher.FORWARD_SERVLET_PATH,
       RequestDispatcher.FORWARD_PATH_INFO,
-      RequestDispatcher.FORWARD_QUERY_STRING };
+      RequestDispatcher.FORWARD_QUERY_STRING,
+      org.apache.catalina.servlet4preview.RequestDispatcher.FORWARD_MAPPING};
 
 
     // ----------------------------------------------------------- Constructors
@@ -181,6 +185,12 @@ class ApplicationHttpRequest extends Htt
 
 
     /**
+     * The mapping for this request.
+     */
+    private Mapping mapping = null;
+
+
+    /**
      * The currently active session for this request.
      */
     protected Session session = null;
@@ -509,6 +519,12 @@ class ApplicationHttpRequest extends Htt
     }
 
 
+    @Override
+    public Mapping getMapping() {
+        return mapping;
+    }
+
+
     /**
      * Return the session associated with this Request, creating one
      * if necessary.
@@ -614,7 +630,8 @@ class ApplicationHttpRequest extends Htt
     }
 
 
-    public ApplicationPushBuilder getPushBuilder() {
+    @Override
+    public PushBuilder getPushBuilder() {
         return new ApplicationPushBuilder(this);
     }
 
@@ -678,8 +695,7 @@ class ApplicationHttpRequest extends Htt
 
         // Initialize the attributes for this request
         dispatcherType = 
(DispatcherType)request.getAttribute(Globals.DISPATCHER_TYPE_ATTR);
-        requestDispatcherPath =
-            request.getAttribute(Globals.DISPATCHER_REQUEST_PATH_ATTR);
+        requestDispatcherPath = 
request.getAttribute(Globals.DISPATCHER_REQUEST_PATH_ATTR);
 
         // Initialize the path elements for this request
         contextPath = request.getContextPath();
@@ -687,7 +703,11 @@ class ApplicationHttpRequest extends Htt
         queryString = request.getQueryString();
         requestURI = request.getRequestURI();
         servletPath = request.getServletPath();
-
+        if (request instanceof 
org.apache.catalina.servlet4preview.http.HttpServletRequest) {
+            mapping = 
((org.apache.catalina.servlet4preview.http.HttpServletRequest) 
request).getMapping();
+        } else {
+            mapping = (new ApplicationMapping(null)).getMapping();
+        }
     }
 
 
@@ -745,6 +765,12 @@ class ApplicationHttpRequest extends Htt
         this.queryParamString = queryString;
     }
 
+
+    void setMapping(Mapping mapping) {
+        this.mapping = mapping;
+    }
+
+
     // ------------------------------------------------------ Protected Methods
 
     /**

Copied: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationMapping.java 
(from r1738650, 
tomcat/trunk/java/org/apache/catalina/core/ApplicationMapping.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationMapping.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationMapping.java&p1=tomcat/trunk/java/org/apache/catalina/core/ApplicationMapping.java&r1=1738650&r2=1738818&rev=1738818&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationMapping.java 
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationMapping.java 
Tue Apr 12 15:54:46 2016
@@ -16,10 +16,9 @@
  */
 package org.apache.catalina.core;
 
-import javax.servlet.http.Mapping;
-import javax.servlet.http.MappingMatch;
-
 import org.apache.catalina.mapper.MappingData;
+import org.apache.catalina.servlet4preview.http.Mapping;
+import org.apache.catalina.servlet4preview.http.MappingMatch;
 
 public class ApplicationMapping {
 
@@ -33,37 +32,41 @@ public class ApplicationMapping {
 
     public Mapping getMapping() {
         if (mapping == null) {
-            String servletName;
-            if (mappingData.wrapper == null) {
-                servletName = "";
+            if (mappingData == null) {
+                mapping = new MappingImpl("", "", MappingMatch.UNKNOWN, "");
             } else {
-                servletName = mappingData.wrapper.getName();
-            }
-            switch (mappingData.matchType) {
-                case CONTEXT_ROOT:
-                    mapping = new MappingImpl("", "", mappingData.matchType, 
servletName);
-                    break;
-                case DEFAULT:
-                    mapping = new MappingImpl("/", "/", mappingData.matchType, 
servletName);
-                    break;
-                case EXACT:
-                    mapping = new 
MappingImpl(mappingData.wrapperPath.toString(),
-                            mappingData.wrapperPath.toString(), 
mappingData.matchType, servletName);
-                    break;
-                case EXTENSION:
-                    String path = mappingData.wrapperPath.toString();
-                    int extIndex = path.lastIndexOf('.');
-                    mapping = new MappingImpl(path.substring(0, extIndex),
-                            "*" + path.substring(extIndex), 
mappingData.matchType, servletName);
-                    break;
-                case PATH:
-                    mapping = new MappingImpl(mappingData.pathInfo.toString(),
-                            mappingData.wrapperPath.toString() + "/*",
-                            mappingData.matchType, servletName);
-                    break;
-                case UNKNOWN:
-                    mapping = new MappingImpl("", "", mappingData.matchType, 
servletName);
-                    break;
+                String servletName;
+                if (mappingData.wrapper == null) {
+                    servletName = "";
+                } else {
+                    servletName = mappingData.wrapper.getName();
+                }
+                switch (mappingData.matchType) {
+                    case CONTEXT_ROOT:
+                        mapping = new MappingImpl("", "", 
mappingData.matchType, servletName);
+                        break;
+                    case DEFAULT:
+                        mapping = new MappingImpl("/", "/", 
mappingData.matchType, servletName);
+                        break;
+                    case EXACT:
+                        mapping = new 
MappingImpl(mappingData.wrapperPath.toString(),
+                                mappingData.wrapperPath.toString(), 
mappingData.matchType, servletName);
+                        break;
+                    case EXTENSION:
+                        String path = mappingData.wrapperPath.toString();
+                        int extIndex = path.lastIndexOf('.');
+                        mapping = new MappingImpl(path.substring(0, extIndex),
+                                "*" + path.substring(extIndex), 
mappingData.matchType, servletName);
+                        break;
+                    case PATH:
+                        mapping = new 
MappingImpl(mappingData.pathInfo.toString(),
+                                mappingData.wrapperPath.toString() + "/*",
+                                mappingData.matchType, servletName);
+                        break;
+                    case UNKNOWN:
+                        mapping = new MappingImpl("", "", 
mappingData.matchType, servletName);
+                        break;
+                }
             }
         }
 

Modified: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java 
(original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java 
Tue Apr 12 15:54:46 2016
@@ -35,6 +35,7 @@ import javax.servlet.http.HttpSession;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.connector.Request;
+import org.apache.catalina.servlet4preview.http.PushBuilder;
 import org.apache.catalina.util.SessionConfig;
 import org.apache.coyote.ActionCode;
 import org.apache.coyote.PushToken;
@@ -44,7 +45,7 @@ import org.apache.tomcat.util.collection
 import org.apache.tomcat.util.http.CookieProcessor;
 import org.apache.tomcat.util.res.StringManager;
 
-public class ApplicationPushBuilder {
+public class ApplicationPushBuilder implements PushBuilder {
 
     private static final StringManager sm = 
StringManager.getManager(ApplicationPushBuilder.class);
 
@@ -167,6 +168,7 @@ public class ApplicationPushBuilder {
     }
 
 
+    @Override
     public ApplicationPushBuilder path(String path) {
         if (path.startsWith("/")) {
             this.path = path;
@@ -183,77 +185,91 @@ public class ApplicationPushBuilder {
     }
 
 
+    @Override
     public String getPath() {
         return path;
     }
 
 
+    @Override
     public ApplicationPushBuilder method(String method) {
         this.method = method;
         return this;
     }
 
 
+    @Override
     public String getMethod() {
         return method;
     }
 
 
+    @Override
     public ApplicationPushBuilder etag(String etag) {
         this.etag = etag;
         return this;
     }
 
 
+    @Override
     public String getEtag() {
         return etag;
     }
 
 
+    @Override
     public ApplicationPushBuilder lastModified(String lastModified) {
         this.lastModified = lastModified;
         return this;
     }
 
 
+    @Override
     public String getLastModified() {
         return lastModified;
     }
 
 
+    @Override
     public ApplicationPushBuilder queryString(String queryString) {
         this.queryString = queryString;
         return this;
     }
 
 
+    @Override
     public String getQueryString() {
         return queryString;
     }
 
 
+    @Override
     public ApplicationPushBuilder sessionId(String sessionId) {
         this.sessionId = sessionId;
         return this;
     }
 
 
+    @Override
     public String getSessionId() {
         return sessionId;
     }
 
 
+    @Override
     public ApplicationPushBuilder conditional(boolean conditional) {
         this.conditional = conditional;
         return this;
     }
 
 
+    @Override
     public boolean isConditional() {
         return conditional;
     }
 
 
+    @Override
     public ApplicationPushBuilder addHeader(String name, String value) {
         List<String> values = headers.get(name);
         if (values == null) {
@@ -266,6 +282,7 @@ public class ApplicationPushBuilder {
     }
 
 
+    @Override
     public ApplicationPushBuilder setHeader(String name, String value) {
         List<String> values = headers.get(name);
         if (values == null) {
@@ -280,6 +297,7 @@ public class ApplicationPushBuilder {
     }
 
 
+    @Override
     public ApplicationPushBuilder removeHeader(String name) {
         headers.remove(name);
 
@@ -287,11 +305,13 @@ public class ApplicationPushBuilder {
     }
 
 
+    @Override
     public Set<String> getHeaderNames() {
         return Collections.unmodifiableSet(headers.keySet());
     }
 
 
+    @Override
     public String getHeader(String name) {
         List<String> values = headers.get(name);
         if (values == null) {
@@ -302,6 +322,7 @@ public class ApplicationPushBuilder {
     }
 
 
+    @Override
     public boolean push() {
         if (path == null) {
             throw new 
IllegalStateException(sm.getString("pushBuilder.noPath"));

Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/Mapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/Mapper.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/Mapper.java (original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/Mapper.java Tue Apr 12 
15:54:46 2016
@@ -30,6 +30,7 @@ import org.apache.catalina.Host;
 import org.apache.catalina.WebResource;
 import org.apache.catalina.WebResourceRoot;
 import org.apache.catalina.Wrapper;
+import org.apache.catalina.servlet4preview.http.MappingMatch;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.Ascii;
@@ -992,6 +993,7 @@ public final class Mapper {
                     (path.getBuffer(), path.getStart(), path.getLength());
                 mappingData.wrapperPath.setChars
                     (path.getBuffer(), path.getStart(), path.getLength());
+                mappingData.matchType = MappingMatch.DEFAULT;
             }
             // Redirection to a folder
             char[] buf = path.getBuffer();
@@ -1040,8 +1042,10 @@ public final class Mapper {
                 mappingData.wrapperPath.setString("");
                 // This seems wrong but it is what the spec says...
                 mappingData.contextPath.setString("");
+                mappingData.matchType = MappingMatch.CONTEXT_ROOT;
             } else {
                 mappingData.wrapperPath.setString(wrapper.name);
+                mappingData.matchType = MappingMatch.EXACT;
             }
         }
     }
@@ -1093,6 +1097,7 @@ public final class Mapper {
                     (path.getBuffer(), path.getOffset(), path.getLength());
                 mappingData.wrapper = wrappers[pos].object;
                 mappingData.jspWildCard = wrappers[pos].jspWildCard;
+                mappingData.matchType = MappingMatch.PATH;
             }
         }
     }
@@ -1137,6 +1142,7 @@ public final class Mapper {
                     mappingData.requestPath.setChars(buf, servletPath, pathEnd
                             - servletPath);
                     mappingData.wrapper = wrapper.object;
+                    mappingData.matchType = MappingMatch.EXTENSION;
                 }
                 path.setOffset(servletPath);
                 path.setEnd(pathEnd);

Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/MappingData.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/MappingData.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/MappingData.java 
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/mapper/MappingData.java Tue 
Apr 12 15:54:46 2016
@@ -20,6 +20,7 @@ package org.apache.catalina.mapper;
 import org.apache.catalina.Context;
 import org.apache.catalina.Host;
 import org.apache.catalina.Wrapper;
+import org.apache.catalina.servlet4preview.http.MappingMatch;
 import org.apache.tomcat.util.buf.MessageBytes;
 
 /**
@@ -43,6 +44,9 @@ public class MappingData {
 
     public final MessageBytes redirectPath = MessageBytes.newInstance();
 
+    // Fields used by ApplicationMapping to implement 
javax.servlet.http.Mapping
+    public MappingMatch matchType = MappingMatch.UNKNOWN;
+
     public void recycle() {
         host = null;
         context = null;
@@ -55,5 +59,6 @@ public class MappingData {
         wrapperPath.recycle();
         pathInfo.recycle();
         redirectPath.recycle();
+        matchType = MappingMatch.UNKNOWN;
     }
 }

Modified: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java 
(original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java 
Tue Apr 12 15:54:46 2016
@@ -166,6 +166,7 @@ public final class SecurityClassLoad {
     private static final void loadCoyotePackage(ClassLoader loader)
             throws Exception {
         final String basePackage = "org.apache.coyote.";
+        loader.loadClass(basePackage + "PushToken");
         loader.loadClass(basePackage + "http11.Constants");
         // Make sure system property is read at this point
         Class<?> clazz = loader.loadClass(basePackage + "Constants");
@@ -277,7 +278,9 @@ public final class SecurityClassLoad {
         loader.loadClass(basePackage + "util.buf.StringCache$CharEntry");
         loader.loadClass(basePackage + "util.buf.UriUtil");
         // collections
-        loader.loadClass(basePackage + 
"util.collections.CaseInsensitiveKeyMap");
+        Class<?> clazz = loader.loadClass(basePackage + 
"util.collections.CaseInsensitiveKeyMap");
+        // Ensure StringManager is configured
+        clazz.newInstance();
         loader.loadClass(basePackage + 
"util.collections.CaseInsensitiveKeyMap$EntryImpl");
         loader.loadClass(basePackage + 
"util.collections.CaseInsensitiveKeyMap$EntryIterator");
         loader.loadClass(basePackage + 
"util.collections.CaseInsensitiveKeyMap$EntrySet");
@@ -286,7 +289,7 @@ public final class SecurityClassLoad {
         loader.loadClass(basePackage + "util.http.CookieProcessor");
         loader.loadClass(basePackage + "util.http.NamesEnumerator");
         // Make sure system property is read at this point
-        Class<?> clazz = loader.loadClass(basePackage + 
"util.http.FastHttpDateFormat");
+        clazz = loader.loadClass(basePackage + "util.http.FastHttpDateFormat");
         clazz.newInstance();
         loader.loadClass(basePackage + "util.http.parser.HttpParser");
         loader.loadClass(basePackage + "util.http.parser.MediaType");

Copied: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/GenericFilter.java
 (from r1738622, tomcat/trunk/java/javax/servlet/GenericFilter.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/GenericFilter.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/GenericFilter.java&p1=tomcat/trunk/java/javax/servlet/GenericFilter.java&r1=1738622&r2=1738818&rev=1738818&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/GenericFilter.java (original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/GenericFilter.java
 Tue Apr 12 15:54:46 2016
@@ -14,11 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package javax.servlet;
+package org.apache.catalina.servlet4preview;
 
 import java.io.Serializable;
 import java.util.Enumeration;
 
+import javax.servlet.Filter;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
 public abstract class GenericFilter implements Filter, FilterConfig, 
Serializable {
 
     private static final long serialVersionUID = 1L;

Added: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/RequestDispatcher.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/RequestDispatcher.java?rev=1738818&view=auto
==============================================================================
--- 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/RequestDispatcher.java
 (added)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/RequestDispatcher.java
 Tue Apr 12 15:54:46 2016
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina.servlet4preview;
+
+/**
+ * Provides early access to some parts of the proposed Servlet 4.0 API.
+ */
+public interface RequestDispatcher extends javax.servlet.RequestDispatcher {
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #forward(javax.servlet.ServletRequest,
+     * javax.servlet.ServletResponse)} method is called. It provides the
+     * original value of a path-related property of the request. See the 
chapter
+     * "Forwarded Request Parameters" in the Servlet Specification for details.
+     *
+     * @since Servlet 4.0
+     */
+    static final String FORWARD_MAPPING = "javax.servlet.forward.mapping";
+
+    /**
+     * The name of the request attribute that should be set by the container
+     * when the {@link #include(javax.servlet.ServletRequest,
+     * javax.servlet.ServletResponse)} method is called on the
+     * {@code RequestDispatcher} obtained by a path and not by a name.
+     * It provides information on the path that was used to obtain the
+     * {@code RequestDispatcher} instance for this include call. See the 
chapter
+     * "Included Request Parameters" in the Servlet Specification for details.
+     *
+     * @since Servlet 4.0
+     */
+    static final String INCLUDE_MAPPING = "javax.servlet.include.mapping";
+}

Propchange: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/RequestDispatcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/
------------------------------------------------------------------------------
    bugtraq:append = false

Propchange: tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/
------------------------------------------------------------------------------
    bugtraq:label = Bugzilla ID (optional)

Propchange: tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Tue Apr 12 15:54:46 2016
@@ -0,0 +1,2 @@
+(https?\://(bz|issues)\.apache\.org/bugzilla/show_bug.cgi\?id=\d+|BZ\s?\d+)
+(\d+)

Propchange: tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/
------------------------------------------------------------------------------
    bugtraq:message = Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/
------------------------------------------------------------------------------
    bugtraq:url = https://bz.apache.org/bugzilla/show_bug.cgi?id=%BUGID%

Copied: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpFilter.java
 (from r1738622, tomcat/trunk/java/javax/servlet/http/HttpFilter.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpFilter.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpFilter.java&p1=tomcat/trunk/java/javax/servlet/http/HttpFilter.java&r1=1738622&r2=1738818&rev=1738818&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpFilter.java (original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpFilter.java
 Tue Apr 12 15:54:46 2016
@@ -14,15 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package javax.servlet.http;
+package org.apache.catalina.servlet4preview.http;
 
 import java.io.IOException;
 
 import javax.servlet.FilterChain;
-import javax.servlet.GenericFilter;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.catalina.servlet4preview.GenericFilter;
 
 public abstract class HttpFilter extends GenericFilter {
 

Added: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequest.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequest.java?rev=1738818&view=auto
==============================================================================
--- 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequest.java
 (added)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequest.java
 Tue Apr 12 15:54:46 2016
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina.servlet4preview.http;
+
+/**
+ * Provides early access to some parts of the proposed Servlet 4.0 API.
+ */
+public interface HttpServletRequest extends 
javax.servlet.http.HttpServletRequest {
+
+    public Mapping getMapping();
+
+    /**
+     * Does the current request allow push requests. This will return {@code
+     * true} only if the underlying protocol supports server push and if pushes
+     * are permitted from the current request.
+     *
+     * @return {@code true} if server push is supported for the current request
+     *         otherwise {@code false}
+     */
+    public boolean isPushSupported();
+
+    /**
+     * Obtain a builder for generating push requests. {@link PushBuilder}
+     * documents how this request will be used as the basis for a push request.
+     * Each call to this method will return a new instance, independent of any
+     * previous instance obtained.
+     *
+     * @return A builder that can be used to generate push requests based on
+     *         this request.
+     *
+     * @since Servlet 4.0
+     */
+    public PushBuilder getPushBuilder();
+}

Propchange: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequestWrapper.java
 (from r1738622, 
tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequestWrapper.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequestWrapper.java&p1=tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java&r1=1738622&r2=1738818&rev=1738818&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java 
(original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/HttpServletRequestWrapper.java
 Tue Apr 12 15:54:46 2016
@@ -14,26 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package javax.servlet.http;
+package org.apache.catalina.servlet4preview.http;
 
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Enumeration;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequestWrapper;
 
 /**
- * Provides a convenient implementation of the HttpServletRequest interface 
that
- * can be subclassed by developers wishing to adapt the request to a Servlet.
- * This class implements the Wrapper or Decorator pattern. Methods default to
- * calling through to the wrapped request object.
- *
- * @see javax.servlet.http.HttpServletRequest
- * @since v 2.3
+ * Provides early access to some parts of the proposed Servlet 4.0 API.
  */
-public class HttpServletRequestWrapper extends ServletRequestWrapper implements
-        HttpServletRequest {
+public class HttpServletRequestWrapper extends 
javax.servlet.http.HttpServletRequestWrapper
+        implements HttpServletRequest {
 
     /**
      * Constructs a request object wrapping the given request.
@@ -43,7 +31,7 @@ public class HttpServletRequestWrapper e
      * @throws java.lang.IllegalArgumentException
      *             if the request is null
      */
-    public HttpServletRequestWrapper(HttpServletRequest request) {
+    public HttpServletRequestWrapper(javax.servlet.http.HttpServletRequest 
request) {
         super(request);
     }
 
@@ -52,348 +40,42 @@ public class HttpServletRequestWrapper e
     }
 
     /**
-     * The default behavior of this method is to return getAuthType() on the
-     * wrapped request object.
-     */
-    @Override
-    public String getAuthType() {
-        return this._getHttpServletRequest().getAuthType();
-    }
-
-    /**
-     * The default behavior of this method is to return getCookies() on the
-     * wrapped request object.
-     */
-    @Override
-    public Cookie[] getCookies() {
-        return this._getHttpServletRequest().getCookies();
-    }
-
-    /**
-     * The default behavior of this method is to return getDateHeader(String
-     * name) on the wrapped request object.
-     */
-    @Override
-    public long getDateHeader(String name) {
-        return this._getHttpServletRequest().getDateHeader(name);
-    }
-
-    /**
-     * The default behavior of this method is to return getHeader(String name)
-     * on the wrapped request object.
-     */
-    @Override
-    public String getHeader(String name) {
-        return this._getHttpServletRequest().getHeader(name);
-    }
-
-    /**
-     * The default behavior of this method is to return getHeaders(String name)
-     * on the wrapped request object.
-     */
-    @Override
-    public Enumeration<String> getHeaders(String name) {
-        return this._getHttpServletRequest().getHeaders(name);
-    }
-
-    /**
-     * The default behavior of this method is to return getHeaderNames() on the
-     * wrapped request object.
-     */
-    @Override
-    public Enumeration<String> getHeaderNames() {
-        return this._getHttpServletRequest().getHeaderNames();
-    }
-
-    /**
-     * The default behavior of this method is to return getIntHeader(String
-     * name) on the wrapped request object.
-     */
-    @Override
-    public int getIntHeader(String name) {
-        return this._getHttpServletRequest().getIntHeader(name);
-    }
-
-    /**
-     * The default behavior of this method is to return getMapping() on the
-     * wrapped request object.
-     */
-    @Override
-    public Mapping getMapping() {
-        return this._getHttpServletRequest().getMapping();
-    }
-
-    /**
-     * The default behavior of this method is to return getMethod() on the
-     * wrapped request object.
-     */
-    @Override
-    public String getMethod() {
-        return this._getHttpServletRequest().getMethod();
-    }
-
-    /**
-     * The default behavior of this method is to return getPathInfo() on the
-     * wrapped request object.
-     */
-    @Override
-    public String getPathInfo() {
-        return this._getHttpServletRequest().getPathInfo();
-    }
-
-    /**
-     * The default behavior of this method is to return getPathTranslated() on
-     * the wrapped request object.
-     */
-    @Override
-    public String getPathTranslated() {
-        return this._getHttpServletRequest().getPathTranslated();
-    }
-
-    /**
-     * The default behavior of this method is to return getContextPath() on the
-     * wrapped request object.
-     */
-    @Override
-    public String getContextPath() {
-        return this._getHttpServletRequest().getContextPath();
-    }
-
-    /**
-     * The default behavior of this method is to return getQueryString() on the
-     * wrapped request object.
-     */
-    @Override
-    public String getQueryString() {
-        return this._getHttpServletRequest().getQueryString();
-    }
-
-    /**
-     * The default behavior of this method is to return getRemoteUser() on the
-     * wrapped request object.
-     */
-    @Override
-    public String getRemoteUser() {
-        return this._getHttpServletRequest().getRemoteUser();
-    }
-
-    /**
-     * The default behavior of this method is to return isUserInRole(String
-     * role) on the wrapped request object.
-     */
-    @Override
-    public boolean isUserInRole(String role) {
-        return this._getHttpServletRequest().isUserInRole(role);
-    }
-
-    /**
-     * The default behavior of this method is to return getUserPrincipal() on
-     * the wrapped request object.
-     */
-    @Override
-    public java.security.Principal getUserPrincipal() {
-        return this._getHttpServletRequest().getUserPrincipal();
-    }
-
-    /**
-     * The default behavior of this method is to return getRequestedSessionId()
-     * on the wrapped request object.
-     */
-    @Override
-    public String getRequestedSessionId() {
-        return this._getHttpServletRequest().getRequestedSessionId();
-    }
-
-    /**
-     * The default behavior of this method is to return getRequestURI() on the
-     * wrapped request object.
-     */
-    @Override
-    public String getRequestURI() {
-        return this._getHttpServletRequest().getRequestURI();
-    }
-
-    /**
-     * The default behavior of this method is to return getRequestURL() on the
-     * wrapped request object.
-     */
-    @Override
-    public StringBuffer getRequestURL() {
-        return this._getHttpServletRequest().getRequestURL();
-    }
-
-    /**
-     * The default behavior of this method is to return getServletPath() on the
-     * wrapped request object.
-     */
-    @Override
-    public String getServletPath() {
-        return this._getHttpServletRequest().getServletPath();
-    }
-
-    /**
-     * The default behavior of this method is to return getSession(boolean
-     * create) on the wrapped request object.
-     */
-    @Override
-    public HttpSession getSession(boolean create) {
-        return this._getHttpServletRequest().getSession(create);
-    }
-
-    /**
-     * The default behavior of this method is to return getSession() on the
-     * wrapped request object.
-     */
-    @Override
-    public HttpSession getSession() {
-        return this._getHttpServletRequest().getSession();
-    }
-
-    /**
-     * The default behavior of this method is to call changeSessionId() on the
-     * wrapped request object.
-     */
-    @Override
-    public String changeSessionId() {
-        return this._getHttpServletRequest().changeSessionId();
-    }
-
-    /**
-     * The default behavior of this method is to return
-     * isRequestedSessionIdValid() on the wrapped request object.
-     */
-    @Override
-    public boolean isRequestedSessionIdValid() {
-        return this._getHttpServletRequest().isRequestedSessionIdValid();
-    }
-
-    /**
-     * The default behavior of this method is to return
-     * isRequestedSessionIdFromCookie() on the wrapped request object.
-     */
-    @Override
-    public boolean isRequestedSessionIdFromCookie() {
-        return this._getHttpServletRequest().isRequestedSessionIdFromCookie();
-    }
-
-    /**
-     * The default behavior of this method is to return
-     * isRequestedSessionIdFromURL() on the wrapped request object.
-     */
-    @Override
-    public boolean isRequestedSessionIdFromURL() {
-        return this._getHttpServletRequest().isRequestedSessionIdFromURL();
-    }
-
-    /**
-     * The default behavior of this method is to return
-     * isRequestedSessionIdFromUrl() on the wrapped request object.
-     *
-     * @deprecated As of Version 3.0 of the Java Servlet API
-     */
-    @Override
-    @Deprecated
-    public boolean isRequestedSessionIdFromUrl() {
-        return this._getHttpServletRequest().isRequestedSessionIdFromUrl();
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p>
-     * The default behavior of this method is to return
-     * {@link HttpServletRequest#authenticate(HttpServletResponse)}
-     * on the wrapped request object.
-     *
-     * @since Servlet 3.0
-     */
-    @Override
-    public boolean authenticate(HttpServletResponse response)
-            throws IOException, ServletException {
-        return this._getHttpServletRequest().authenticate(response);
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p>
-     * The default behavior of this method is to return
-     * {@link HttpServletRequest#login(String, String)}
-     * on the wrapped request object.
-     *
-     * @since Servlet 3.0
-     */
-    @Override
-    public void login(String username, String password) throws 
ServletException {
-        this._getHttpServletRequest().login(username, password);
-    }
-
-    /**
      * {@inheritDoc}
      * <p>
      * The default behavior of this method is to return
-     * {@link HttpServletRequest#logout()}
-     * on the wrapped request object.
+     * {@link HttpServletRequest#getMapping()} on the wrapped request object.
      *
-     * @since Servlet 3.0
-     */
-    @Override
-    public void logout() throws ServletException {
-        this._getHttpServletRequest().logout();
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p>
-     * The default behavior of this method is to return
-     * {@link HttpServletRequest#getParts()}
-     * on the wrapped request object.
-     *
-     * @since Servlet 3.0
+     * @since Servlet 4.0
      */
     @Override
-    public Collection<Part> getParts() throws IOException,
-            ServletException {
-        return this._getHttpServletRequest().getParts();
+    public Mapping getMapping() {
+        return this._getHttpServletRequest().getMapping();
     }
 
     /**
      * {@inheritDoc}
      * <p>
      * The default behavior of this method is to return
-     * {@link HttpServletRequest#getPart(String)}
-     * on the wrapped request object.
+     * {@link HttpServletRequest#isPushSupported()} on the wrapped request 
object.
      *
-     * @since Servlet 3.0
+     * @since Servlet 4.0
      */
     @Override
-    public Part getPart(String name) throws IOException,
-            ServletException {
-        return this._getHttpServletRequest().getPart(name);
+    public boolean isPushSupported() {
+        return this._getHttpServletRequest().isPushSupported();
     }
 
-    /**
-     * {@inheritDoc}
-     * <p>
-     * The default behavior of this method is to return
-     * {@link HttpServletRequest#upgrade(Class)} on the wrapped request object.
-     *
-     * @since Servlet 3.1
-     */
-    @Override
-    public <T extends HttpUpgradeHandler> T upgrade(
-            Class<T> httpUpgradeHandlerClass) throws IOException, 
ServletException {
-        return this._getHttpServletRequest().upgrade(httpUpgradeHandlerClass);
-    }
 
     /**
      * {@inheritDoc}
      * <p>
      * The default behavior of this method is to return
-     * {@link HttpServletRequest#isPushSupported()} on the wrapped request 
object.
+     * {@link HttpServletRequest#getPushBuilder()} on the wrapped request 
object.
      *
      * @since Servlet 4.0
      */
     @Override
-    public boolean isPushSupported() {
-        return this._getHttpServletRequest().isPushSupported();
+    public PushBuilder getPushBuilder() {
+        return this._getHttpServletRequest().getPushBuilder();
     }
 }

Copied: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/Mapping.java 
(from r1738622, tomcat/trunk/java/javax/servlet/http/Mapping.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/Mapping.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/Mapping.java&p1=tomcat/trunk/java/javax/servlet/http/Mapping.java&r1=1738622&r2=1738818&rev=1738818&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/Mapping.java (original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/Mapping.java 
Tue Apr 12 15:54:46 2016
@@ -14,7 +14,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-package javax.servlet.http;
+package org.apache.catalina.servlet4preview.http;
 
 import javax.servlet.annotation.WebServlet;
 

Copied: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/MappingMatch.java
 (from r1738622, tomcat/trunk/java/javax/servlet/http/MappingMatch.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/MappingMatch.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/MappingMatch.java&p1=tomcat/trunk/java/javax/servlet/http/MappingMatch.java&r1=1738622&r2=1738818&rev=1738818&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/MappingMatch.java (original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/MappingMatch.java
 Tue Apr 12 15:54:46 2016
@@ -14,7 +14,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-package javax.servlet.http;
+package org.apache.catalina.servlet4preview.http;
 
 /**
  * Represents the ways that a request can be mapped to a servlet

Copied: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/PushBuilder.java
 (from r1738622, tomcat/trunk/java/javax/servlet/http/PushBuilder.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/PushBuilder.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/PushBuilder.java&p1=tomcat/trunk/java/javax/servlet/http/PushBuilder.java&r1=1738622&r2=1738818&rev=1738818&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/PushBuilder.java (original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/http/PushBuilder.java
 Tue Apr 12 15:54:46 2016
@@ -14,7 +14,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-package javax.servlet.http;
+package org.apache.catalina.servlet4preview.http;
 
 import java.util.Set;
 

Added: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/package-info.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/package-info.java?rev=1738818&view=auto
==============================================================================
--- 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/package-info.java 
(added)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/package-info.java 
Tue Apr 12 15:54:46 2016
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * This package provides early access to some of the new features in the 
Servlet
+ * 4.0 API. This package exists in Tomcat 8.5 only. The package will not exist
+ * in Tomcat 9 and applications depending on classes in this package will need
+ * to be modified before they will work with Tomcat 9. It is intended that any
+ * such modifications will be limited to replacing
+ * <code>import org.apache.catalina.servlet4preview...<code> with
+ * <code>import javax.servlet...<code> and removing casts.
+ * <p>
+ * This package is not a complete copy of the proposed Servlet 4.0 API. It
+ * contains only a sub-set of those classes that are new or modified in Servlet
+ * 4.0. Users may request the inclusion of additional Servlet 4.0 API changes 
in
+ * this package via a Bugzilla enhancement request against Tomcat 8.5.
+ * <p>
+ * The Servlet 4.0 API is a work in progress. The public API of classes in this
+ * package may change in incompatible ways - including classes being renamed or
+ * deleted - between point releases of Tomcat 8.5.
+ */
+package org.apache.catalina.servlet4preview;

Propchange: 
tomcat/tc8.5.x/trunk/java/org/apache/catalina/servlet4preview/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestApplicationMapping.java 
(from r1738622, 
tomcat/trunk/test/org/apache/catalina/core/TestApplicationMapping.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestApplicationMapping.java?p2=tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestApplicationMapping.java&p1=tomcat/trunk/test/org/apache/catalina/core/TestApplicationMapping.java&r1=1738622&r2=1738818&rev=1738818&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestApplicationMapping.java 
(original)
+++ 
tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestApplicationMapping.java 
Tue Apr 12 15:54:46 2016
@@ -24,12 +24,12 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.Mapping;
 
 import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.catalina.Context;
+import org.apache.catalina.servlet4preview.http.Mapping;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.buf.ByteChunk;
@@ -284,12 +284,14 @@ public class TestApplicationMapping exte
                 throws ServletException, IOException {
             resp.setContentType("text/plain;charset=UTF-8");
             PrintWriter pw = resp.getWriter();
-            Mapping mapping = req.getMapping();
+            Mapping mapping = 
((org.apache.catalina.servlet4preview.http.HttpServletRequest)
+                    req).getMapping();
             pw.println("MatchValue=[" + mapping.getMatchValue() + "]");
             pw.println("Pattern=[" + mapping.getPattern() + "]");
             pw.println("MatchType=[" + mapping.getMappingMatch() + "]");
             pw.println("ServletName=[" + mapping.getServletName() + "]");
-            Mapping includeMapping = (Mapping) 
req.getAttribute(RequestDispatcher.INCLUDE_MAPPING);
+            Mapping includeMapping = (Mapping) req.getAttribute(
+                    
org.apache.catalina.servlet4preview.RequestDispatcher.INCLUDE_MAPPING);
             if (includeMapping != null) {
                 pw.println("IncludeMatchValue=[" + 
includeMapping.getMatchValue() + "]");
                 pw.println("IncludePattern=[" + includeMapping.getPattern() + 
"]");
@@ -297,7 +299,8 @@ public class TestApplicationMapping exte
                 pw.println("IncludeServletName=[" + 
includeMapping.getServletName() + "]");
 
             }
-            Mapping forwardMapping = (Mapping) 
req.getAttribute(RequestDispatcher.FORWARD_MAPPING);
+            Mapping forwardMapping = (Mapping) req.getAttribute(
+                    
org.apache.catalina.servlet4preview.RequestDispatcher.FORWARD_MAPPING);
             if (forwardMapping != null) {
                 pw.println("ForwardMatchValue=[" + 
forwardMapping.getMatchValue() + "]");
                 pw.println("ForwardPattern=[" + forwardMapping.getPattern() + 
"]");

Modified: tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml Tue Apr 12 15:54:46 2016
@@ -114,6 +114,11 @@
         functions as designed and sessions are swapped out to keep the active
         session count below <code>maxActiveSessions</code>. (markt)
       </fix>
+      <add>
+        Add the <code>org.apache.catalina.servlet4preview</code> package that
+        can be used to gain early access to Servlet 4.0 features. Note that 
this
+        package will <strong>not</strong> be present in Tomcat 9. (markt)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Coyote">

Modified: 
tomcat/tc8.5.x/trunk/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java?rev=1738818&r1=1738817&r2=1738818&view=diff
==============================================================================
--- 
tomcat/tc8.5.x/trunk/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java
 (original)
+++ 
tomcat/tc8.5.x/trunk/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java
 Tue Apr 12 15:54:46 2016
@@ -24,8 +24,7 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.catalina.connector.RequestFacade;
-import org.apache.catalina.core.ApplicationPushBuilder;
+import org.apache.catalina.servlet4preview.http.PushBuilder;
 
 public class SimpleImagePush extends HttpServlet {
 
@@ -35,7 +34,8 @@ public class SimpleImagePush extends Htt
     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
             throws ServletException, IOException {
 
-        ApplicationPushBuilder pb = ((RequestFacade) 
req).getPushBuilder().path("servlets/images/code.gif");
+        PushBuilder pb = 
((org.apache.catalina.servlet4preview.http.HttpServletRequest)
+                req).getPushBuilder().path("servlets/images/code.gif");
         pb.push();
 
         resp.setCharacterEncoding("UTF-8");



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to