This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git


The following commit(s) were added to refs/heads/master by this push:
     new d3bc7fd  FELIX-6498 : Support servlet api 4.0
d3bc7fd is described below

commit d3bc7fdbdf9695d7283984649159f35c4809ca6f
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Mon Jan 3 15:21:14 2022 +0100

    FELIX-6498 : Support servlet api 4.0
---
 .../http/base/internal/dispatch/Dispatcher.java    |  3 +-
 .../http/base/internal/dispatch/RequestInfo.java   | 35 ++++++++--------
 .../internal/dispatch/ServletResponseWrapper.java  |  7 +++-
 .../base/internal/registry/PathResolution.java     |  6 +++
 .../internal/registry/PathResolverFactory.java     | 48 +++++++++++++++++++++-
 .../base/internal/service/ServletContextImpl.java  | 13 ++++--
 .../whiteboard/SharedServletContextImpl.java       |  7 +++-
 7 files changed, 93 insertions(+), 26 deletions(-)

diff --git 
a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
 
b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
index 47efa9b..bcf5d76 100644
--- 
a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
+++ 
b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
@@ -134,7 +134,8 @@ public final class Dispatcher
                        }
 
                        final ExtServletContext servletContext = 
pr.handler.getContext();
-                       final RequestInfo requestInfo = new 
RequestInfo(pr.servletPath, pr.pathInfo, null, req.getRequestURI(), 
pr.handler.getName(), pr.matchedPattern, false);
+                       final RequestInfo requestInfo = new 
RequestInfo(pr.servletPath, pr.pathInfo, null, req.getRequestURI(),
+                               pr.handler.getName(), pr.matchedPattern, 
pr.matchValue, pr.match, false);
                        final HttpServletRequest wrappedRequest = new 
ServletRequestWrapper(req, servletContext, requestInfo, null,
                                pr.handler.getServletInfo().isAsyncSupported(),
                                pr.handler.getMultipartConfig(),
diff --git 
a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/RequestInfo.java
 
b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/RequestInfo.java
index 1b63f4f..ce52453 100644
--- 
a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/RequestInfo.java
+++ 
b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/RequestInfo.java
@@ -28,8 +28,9 @@ public final class RequestInfo implements HttpServletMapping
     final String pathInfo;
     final String queryString;
     final String requestURI;
-    private final String servletName;
-    private final String servletPattern;
+    private final String matchServletName;
+    private final String matchPattern;
+    private final String matchValue;
     private final MappingMatch match;
     final boolean nameMatch;
 
@@ -39,46 +40,46 @@ public final class RequestInfo implements HttpServletMapping
      * @param pathInfo The path info
      * @param queryString The query string
      * @param requestURI The request uri
-     * @param servletName The servlet name
-     * @param servletPattern The servlet pattern
+     * @param matchServletName The servlet name
+     * @param matchPattern The servlet pattern
+     * @param matchValue The value matching
+     * @param match The match type
      * @param nameMatch Is named dispatcher
      */
     public RequestInfo(final String servletPath,
             final String pathInfo,
             final String queryString,
             final String requestURI,
-            final String servletName,
-            final String servletPattern,
+            final String matchServletName,
+            final String matchPattern,
+            final String matchValue,
+            final MappingMatch match,
             final boolean nameMatch)
     {
         this.servletPath = servletPath;
         this.pathInfo = pathInfo;
         this.queryString = queryString;
         this.requestURI = requestURI;
-        this.servletName = servletName;
-        this.servletPattern = servletPattern;
-        if ( "".equals(servletPattern) ) {
-            this.match = MappingMatch.DEFAULT;
-        } else {
-            this.match = MappingMatch.PATH;
-        }
+        this.matchServletName = matchServletName;
+        this.matchPattern = matchPattern;
+        this.matchValue = matchValue;
+        this.match = match;
         this.nameMatch = nameMatch;
     }
 
     @Override
     public String getMatchValue() {
-        // TODO - this is wrong
-        return this.servletPattern;
+        return this.matchValue;
     }
 
     @Override
     public String getPattern() {
-        return this.servletPattern;
+        return this.matchPattern;
     }
 
     @Override
     public String getServletName() {
-        return this.servletName;
+        return this.matchServletName;
     }
 
     @Override
diff --git 
a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java
 
b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java
index 28e9071..e0a2615 100644
--- 
a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java
+++ 
b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/ServletResponseWrapper.java
@@ -101,7 +101,12 @@ final class ServletResponseWrapper extends 
HttpServletResponseWrapper
                         final String pathInfo = request.getRequestURI();
                         final String queryString = null; // XXX
 
-                        final RequestInfo requestInfo = new 
RequestInfo(servletPath, pathInfo, queryString, pathInfo, 
request.getHttpServletMapping().getServletName(), 
request.getHttpServletMapping().getPattern(), false);
+                        final RequestInfo requestInfo = new 
RequestInfo(servletPath, pathInfo, queryString, pathInfo,
+                                
request.getHttpServletMapping().getServletName(),
+                                request.getHttpServletMapping().getPattern(),
+                                
request.getHttpServletMapping().getMatchValue(),
+                                
request.getHttpServletMapping().getMappingMatch(),
+                                false);
 
                         final FilterHandler[] filterHandlers = 
errorRegistry.getFilterHandlers(errorResolution, DispatcherType.ERROR, 
request.getRequestURI());
 
diff --git 
a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolution.java
 
b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolution.java
index 696c931..3b210cd 100644
--- 
a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolution.java
+++ 
b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolution.java
@@ -16,6 +16,8 @@
  */
 package org.apache.felix.http.base.internal.registry;
 
+import javax.servlet.http.MappingMatch;
+
 /**
  * Resolution of a servlet based on the path
  */
@@ -30,4 +32,8 @@ public class PathResolution extends ServletResolution {
     public String[] patterns;
 
     public String matchedPattern;
+
+    public MappingMatch match;
+
+    public String matchValue;
 }
diff --git 
a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
 
b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
index d3a9ec4..94be252 100644
--- 
a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
+++ 
b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
@@ -18,11 +18,12 @@ package org.apache.felix.http.base.internal.registry;
 
 import java.util.regex.Pattern;
 
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
+import javax.servlet.http.MappingMatch;
 
 import org.apache.felix.http.base.internal.handler.ServletHandler;
 import org.apache.felix.http.base.internal.service.HttpServiceFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * The path resolver factory creates a path resolver for a pattern.
@@ -156,6 +157,10 @@ public abstract class PathResolverFactory {
                 pr.requestURI = uri;
                 pr.handler = this.getServletHandler();
 
+                pr.matchedPattern = this.getPattern();
+                pr.match = MappingMatch.CONTEXT_ROOT;
+                pr.matchValue = this.getPattern();
+
                 return pr;
             }
             return null;
@@ -177,6 +182,10 @@ public abstract class PathResolverFactory {
             pr.requestURI = uri;
             pr.handler = this.getServletHandler();
 
+            pr.matchedPattern = this.getPattern();
+            pr.match = MappingMatch.DEFAULT;
+            pr.matchValue = "";
+
             return pr;
         }
     }
@@ -204,6 +213,11 @@ public abstract class PathResolverFactory {
                 pr.requestURI = uri;
                 pr.handler = this.getServletHandler();
 
+                pr.matchedPattern = this.getPattern();
+                pr.match = MappingMatch.EXACT;
+                final int pos = uri.lastIndexOf("/");
+                pr.matchValue = uri.substring(pos + 1, uri.length());
+
                 return pr;
             }
             else if ( uri.startsWith(prefix) )
@@ -214,6 +228,11 @@ public abstract class PathResolverFactory {
                 pr.requestURI = uri;
                 pr.handler = this.getServletHandler();
 
+                pr.matchedPattern = this.getPattern();
+                pr.match = MappingMatch.PATH;
+                final int pos = uri.lastIndexOf("/");
+                pr.matchValue = uri.substring(pos + 1, uri.length());
+
                 return pr;
             }
             return null;
@@ -246,6 +265,11 @@ public abstract class PathResolverFactory {
                 pr.requestURI = uri;
                 pr.handler = this.getServletHandler();
 
+                pr.matchedPattern = this.getPattern();
+                pr.match = MappingMatch.EXACT;
+                final int pos = uri.lastIndexOf("/");
+                pr.matchValue = uri.substring(pos + 1, uri.length());
+
                 return pr;
             }
             return null;
@@ -281,6 +305,11 @@ public abstract class PathResolverFactory {
                 pr.requestURI = uri;
                 pr.handler = this.getServletHandler();
 
+                pr.matchedPattern = this.getPattern();
+                pr.match = MappingMatch.EXACT;
+                final int pos = uri.lastIndexOf("/");
+                pr.matchValue = uri.substring(pos + 1, uri.length());
+
                 return pr;
             }
             if ( uri.startsWith(this.prefix) )
@@ -291,6 +320,11 @@ public abstract class PathResolverFactory {
                 pr.requestURI = uri;
                 pr.handler = this.getServletHandler();
 
+                pr.matchedPattern = this.getPattern();
+                pr.match = MappingMatch.PATH;
+                final int pos = uri.lastIndexOf("/");
+                pr.matchValue = uri.substring(pos + 1, uri.length());
+
                 return pr;
             }
             return null;
@@ -323,6 +357,11 @@ public abstract class PathResolverFactory {
                 pr.requestURI = uri;
                 pr.handler = this.getServletHandler();
 
+                pr.matchedPattern = this.getPattern();
+                pr.match = MappingMatch.EXTENSION;
+                final int pos = uri.lastIndexOf("/");
+                pr.matchValue = uri.substring(pos + 1, uri.length() - 
this.extension.length());
+
                 return pr;
             }
             return null;
@@ -354,6 +393,11 @@ public abstract class PathResolverFactory {
                 pr.servletPath = uri;
                 pr.requestURI = uri;
 
+                // regex is not supported by servlet spec, we use PATH matching
+                pr.matchedPattern = this.getPattern();
+                pr.match = MappingMatch.PATH;
+                pr.matchValue = uri;
+
                 return pr;
             }
             return null;
diff --git 
a/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
 
b/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
index fddff41..536ee9d 100644
--- 
a/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
+++ 
b/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
@@ -48,6 +48,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSessionAttributeListener;
 import javax.servlet.http.HttpSessionListener;
+import javax.servlet.http.MappingMatch;
 
 import org.apache.felix.http.base.internal.HttpConfig;
 import org.apache.felix.http.base.internal.context.ExtServletContext;
@@ -509,7 +510,8 @@ public class ServletContextImpl implements ExtServletContext
                resolution.handler = servletHandler;
             resolution.handlerRegistry = this.handlerRegistry;
             // TODO - what is the path of a named servlet?
-            final RequestInfo requestInfo = new RequestInfo("", null, null, 
null, null, "", true);
+            final RequestInfo requestInfo = new RequestInfo("", null, null, 
null, name,
+                    "", "", MappingMatch.EXACT, true);
             dispatcher = new RequestDispatcherImpl(resolution, requestInfo);
         }
         else
@@ -544,8 +546,13 @@ public class ServletContextImpl implements 
ExtServletContext
         if ( pathResolution != null )
         {
             pathResolution.handlerRegistry = this.handlerRegistry;
-            final RequestInfo requestInfo = new 
RequestInfo(pathResolution.servletPath, pathResolution.pathInfo, query, 
UriUtils.concat(this.getContextPath(), encodedRequestURI),
-                    pathResolution.handler.getName(), 
pathResolution.matchedPattern, false);
+            final RequestInfo requestInfo = new 
RequestInfo(pathResolution.servletPath,
+                    pathResolution.pathInfo,
+                    query,
+                    UriUtils.concat(this.getContextPath(), encodedRequestURI),
+                    pathResolution.handler.getName(),
+                    pathResolution.matchedPattern,
+                    pathResolution.matchValue, pathResolution.match, false);
             dispatcher = new RequestDispatcherImpl(pathResolution, 
requestInfo);
         }
         else
diff --git 
a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
 
b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
index 5f74092..13132af 100644
--- 
a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
+++ 
b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
@@ -42,6 +42,7 @@ import javax.servlet.ServletRegistration.Dynamic;
 import javax.servlet.SessionCookieConfig;
 import javax.servlet.SessionTrackingMode;
 import javax.servlet.descriptor.JspConfigDescriptor;
+import javax.servlet.http.MappingMatch;
 
 import org.apache.felix.http.base.internal.dispatch.RequestDispatcherImpl;
 import org.apache.felix.http.base.internal.dispatch.RequestInfo;
@@ -320,7 +321,7 @@ public class SharedServletContextImpl implements 
ServletContext
                resolution.handler = servletHandler;
             resolution.handlerRegistry = this.registry;
             // TODO - what is the path of a named servlet?
-            final RequestInfo requestInfo = new RequestInfo("", null, null, 
null, null, "", true);
+            final RequestInfo requestInfo = new RequestInfo("", null, null, 
null, name, "", "", MappingMatch.EXACT, true);
             dispatcher = new RequestDispatcherImpl(resolution, requestInfo);
         }
         else
@@ -357,7 +358,9 @@ public class SharedServletContextImpl implements 
ServletContext
             pathResolution.handlerRegistry = this.registry;
             final RequestInfo requestInfo = new 
RequestInfo(pathResolution.servletPath, pathResolution.pathInfo, query,
                     UriUtils.concat(this.contextPath, encodedRequestURI),
-                    pathResolution.handler.getName(), 
pathResolution.matchedPattern, false);
+                    pathResolution.handler.getName(), 
pathResolution.matchedPattern,
+                    pathResolution.matchValue, pathResolution.match,
+                    false);
             dispatcher = new RequestDispatcherImpl(pathResolution, 
requestInfo);
         }
         else

Reply via email to