You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by gh...@apache.org on 2020/09/10 22:12:57 UTC

[sling-org-apache-sling-engine] 01/01: SLING-9662 Use Resource Mapping API for resolving

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

ghenzler pushed a commit to branch feature/SLING-9662-Introduce-Resource-Mapping-SPI-v2
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-engine.git

commit 203f9a85a101749c070ea8c3d76ef194c8056b73
Author: georg.henzler <ge...@netcentric.biz>
AuthorDate: Thu Sep 10 15:51:09 2020 +0200

    SLING-9662 Use Resource Mapping API for resolving
---
 pom.xml                                            |  2 +-
 .../apache/sling/engine/impl/SlingMainServlet.java | 19 ++++++++--
 .../engine/impl/SlingRequestProcessorImpl.java     | 34 ++++++++++++++----
 .../sling/engine/impl/request/RequestData.java     | 40 +++++++++++++++-------
 .../engine/impl/request/InitResourceTest.java      | 16 +++++----
 5 files changed, 82 insertions(+), 29 deletions(-)

diff --git a/pom.xml b/pom.xml
index 83d0419..bcc1606 100644
--- a/pom.xml
+++ b/pom.xml
@@ -111,7 +111,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.api</artifactId>
-            <version>2.6.0</version>
+            <version>2.23.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java b/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
index d1e3add..f48af22 100644
--- a/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
+++ b/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
@@ -37,6 +37,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.sling.api.adapter.AdapterManager;
 import org.apache.sling.api.request.SlingRequestEvent;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.mapping.PathToUriMappingService;
 import org.apache.sling.api.servlets.ServletResolver;
 import org.apache.sling.auth.core.AuthenticationSupport;
 import org.apache.sling.commons.mime.MimeTypeService;
@@ -142,6 +143,9 @@ public class SlingMainServlet extends GenericServlet {
     @Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
     private volatile RequestListenerManager requestListenerManager;
 
+    @Reference
+    private volatile PathToUriMappingService pathToUriMappingService;
+
     private BundleContext bundleContext;
 
     /** default log */
@@ -231,6 +235,9 @@ public class SlingMainServlet extends GenericServlet {
                 localRLM.sendEvent(request, SlingRequestEvent.EventType.EVENT_INIT);
             }
 
+            final RequestData requestData = new RequestData(requestProcessor, request, (HttpServletResponse) res);
+            requestData.initResourceUri();
+
             ResourceResolver resolver = null;
             try {
                 if (!allowTrace && "TRACE".equals(request.getMethod())) {
@@ -247,8 +254,7 @@ public class SlingMainServlet extends GenericServlet {
                         : null;
 
                 // real request handling for HTTP requests
-                requestProcessor.doProcessRequest(request, (HttpServletResponse) res,
-                    resolver);
+                requestProcessor.doProcessRequest(request, (HttpServletResponse) res, resolver, requestData);
 
             } catch (ClientAbortException cae) {
                 log.debug("service: ClientAbortException, probable cause is client aborted request or network problem", cae);
@@ -601,6 +607,15 @@ public class SlingMainServlet extends GenericServlet {
     public void unsetMimeTypeService(final MimeTypeService mimeTypeService) {
         slingHttpContext.unsetMimeTypeService(mimeTypeService);
     }
+    
+    @Reference(name = "PathToUriMappingService", cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, unbind = "unsetPathToUriMappingService")
+    public void setPathToUriMappingService(final PathToUriMappingService pathToUriMappingService) {
+        requestProcessor.setPathToUriMappingService(pathToUriMappingService);
+    }
+
+    public void unsetPathToUriMappingService(final PathToUriMappingService pathToUriMappingService) {
+        requestProcessor.unsetPathToUriMappingService(pathToUriMappingService);
+    }
 
     @Reference(name = "AuthenticationSupport", cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, unbind = "unsetAuthenticationSupport")
     public void setAuthenticationSupport(
diff --git a/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java b/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
index d70283b..54f814d 100644
--- a/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
+++ b/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
@@ -44,6 +44,8 @@ import org.apache.sling.api.request.RequestPathInfo;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceNotFoundException;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.mapping.PathToUriMappingService;
+import org.apache.sling.api.resource.uri.ResourceUriBuilder;
 import org.apache.sling.api.servlets.ServletResolver;
 import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
 import org.apache.sling.engine.SlingRequestProcessor;
@@ -76,6 +78,8 @@ public class SlingRequestProcessorImpl implements SlingRequestProcessor {
 
     private volatile RequestProcessorMBeanImpl mbean;
 
+    private PathToUriMappingService pathToUriMappingService;
+
     // ---------- helper setters
 
     void setServerInfo(final String serverInfo) {
@@ -102,6 +106,17 @@ public class SlingRequestProcessorImpl implements SlingRequestProcessor {
         }
     }
 
+    public void setPathToUriMappingService(PathToUriMappingService pathToUriMappingService) {
+        this.pathToUriMappingService = pathToUriMappingService;
+
+    }
+
+    public void unsetPathToUriMappingService(PathToUriMappingService pathToUriMappingService) {
+        if (this.pathToUriMappingService == pathToUriMappingService) {
+            this.pathToUriMappingService = null;
+        }
+    }
+
     void setFilterManager(final ServletFilterManager filterManager) {
         this.filterManager = filterManager;
     }
@@ -110,16 +125,18 @@ public class SlingRequestProcessorImpl implements SlingRequestProcessor {
         this.mbean = mbean;
     }
 
+    public PathToUriMappingService getPathToUriMappingService() {
+        return this.pathToUriMappingService;
+    }
+
     /**
      * This method is directly called by the Sling main servlet.
      */
-    public void doProcessRequest(final HttpServletRequest servletRequest,
+    void doProcessRequest(final HttpServletRequest servletRequest,
             final HttpServletResponse servletResponse,
-            final ResourceResolver resourceResolver) throws IOException {
+            final ResourceResolver resourceResolver, RequestData requestData) throws IOException {
 
         // setting the Sling request and response
-        final RequestData requestData = new RequestData(this, servletRequest,
-            servletResponse);
         final SlingHttpServletRequest request = requestData.getSlingRequest();
         final SlingHttpServletResponse response = requestData.getSlingResponse();
 
@@ -137,8 +154,8 @@ public class SlingRequestProcessorImpl implements SlingRequestProcessor {
             }
 
             // initialize the request data - resolve resource and servlet
-            Resource resource = requestData.initResource(resourceResolver);
-            requestData.initServlet(resource, sr);
+            requestData.setResourceResolver(resourceResolver);
+            requestData.initServlet(sr);
 
             FilterHandle[] filters = filterManager.getFilters(FilterChainType.REQUEST);
             if (filters != null) {
@@ -245,7 +262,8 @@ public class SlingRequestProcessorImpl implements SlingRequestProcessor {
         final Object oldValue = servletRequest.getAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING);
         servletRequest.setAttribute(ParameterSupport.MARKER_IS_SERVICE_PROCESSING, Boolean.TRUE);
         try {
-            this.doProcessRequest(servletRequest, servletResponse, resourceResolver);
+            final RequestData requestData = new RequestData(this, servletRequest, servletResponse);
+            this.doProcessRequest(servletRequest, servletResponse, resourceResolver, requestData);
         } finally {
             // restore the old value
             if ( oldValue != null ) {
@@ -435,4 +453,6 @@ public class SlingRequestProcessorImpl implements SlingRequestProcessor {
             super.flushBuffer();
         }
     }
+
+
 }
diff --git a/src/main/java/org/apache/sling/engine/impl/request/RequestData.java b/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
index 379eb83..a947458 100644
--- a/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
+++ b/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
@@ -45,6 +45,9 @@ import org.apache.sling.api.request.RequestUtil;
 import org.apache.sling.api.request.TooManyCallsException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.mapping.PathToUriMappingService;
+import org.apache.sling.api.resource.mapping.PathToUriMappingService.Result;
+import org.apache.sling.api.resource.uri.ResourceUri;
 import org.apache.sling.api.servlets.ServletResolver;
 import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
 import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
@@ -56,6 +59,8 @@ import org.apache.sling.engine.impl.StaticResponseHeader;
 import org.apache.sling.engine.impl.adapter.SlingServletRequestAdapter;
 import org.apache.sling.engine.impl.adapter.SlingServletResponseAdapter;
 import org.apache.sling.engine.impl.parameters.ParameterSupport;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -123,7 +128,7 @@ public class RequestData {
 
     private static volatile ArrayList<StaticResponseHeader> ADDITIONAL_RESPONSE_HEADERS;
 
-    /** The SlingMainServlet used for request dispatching and other stuff */
+    /** The SlingRequestProcessorImpl used for request dispatching and other stuff */
     private final SlingRequestProcessorImpl slingRequestProcessor;
 
     private final long startTimestamp;
@@ -150,6 +155,8 @@ public class RequestData {
     /** the current ContentData */
     private ContentData currentContentData;
 
+    private ResourceUri resourceUri;
+
     /**
      * the number of servlets called by
      * {@link #service(SlingHttpServletRequest, SlingHttpServletResponse)}
@@ -229,9 +236,12 @@ public class RequestData {
         }
     }
 
-    public Resource initResource(ResourceResolver resourceResolver) {
+    public void setResourceResolver(ResourceResolver resourceResolver) {
         // keep the resource resolver for request processing
         this.resourceResolver = resourceResolver;
+    }
+
+    public void initResourceUri() {
 
         // resolve the resource
         requestProgressTracker.startTimer("ResourceResolution");
@@ -249,23 +259,27 @@ public class RequestData {
             path = path.concat(decodedURL.substring(decodedURL.indexOf(';')));
         }
 
-        Resource resource = resourceResolver.resolve(request, path);
+        Result resolveResult = slingRequestProcessor.getPathToUriMappingService().resolve(request, path);
+        this.resourceUri = resolveResult.getResourceUri();
+
+        String resourcePath = resourceUri.getResourcePath();
+
         if (request.getAttribute(REQUEST_RESOURCE_PATH_ATTR) == null) {
-            request.setAttribute(REQUEST_RESOURCE_PATH_ATTR, resource.getPath());
+            request.setAttribute(REQUEST_RESOURCE_PATH_ATTR, resourcePath);
         }
         requestProgressTracker.logTimer("ResourceResolution",
-            "URI={0} resolves to Resource={1}",
-            getServletRequest().getRequestURI(), resource);
-        return resource;
+                "URI={0} resolves to Resource Path={1}",
+                getServletRequest().getRequestURI(), resourcePath);
+
     }
 
-    public void initServlet(final Resource resource,
-            final ServletResolver sr) {
+    public void initServlet(final ServletResolver sr) {
         // the resource and the request path info, will never be null
-        RequestPathInfo requestPathInfo = new SlingRequestPathInfo(resource);
-        ContentData contentData = setContent(resource, requestPathInfo);
 
-	    requestProgressTracker.log("Resource Path Info: {0}", requestPathInfo);
+        Resource resource = this.resourceResolver.resolve(this.resourceUri.getResourcePath());
+        ContentData contentData = setContent(resource, this.resourceUri);
+
+        requestProgressTracker.log("Resource Uri: {0}", resourceUri);
 
         // finally resolve the servlet for the resource
         requestProgressTracker.startTimer("ServletResolution");
@@ -274,6 +288,7 @@ public class RequestData {
             "URI={0} handled by Servlet={1}",
             getServletRequest().getRequestURI(), (servlet == null ? "-none-" : RequestUtil.getServletName(servlet)));
         contentData.setServlet(servlet);
+
     }
 
     public SlingRequestProcessorImpl getSlingRequestProcessor() {
@@ -564,7 +579,6 @@ public class RequestData {
     }
 
     // ---------- Content inclusion stacking -----------------------------------
-
     public ContentData setContent(final Resource resource,
             final RequestPathInfo requestPathInfo) {
         if ( this.recursionDepth >=  maxInclusionCounter) {
diff --git a/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java b/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java
index 9e5f1ce..a922562 100644
--- a/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java
+++ b/src/test/java/org/apache/sling/engine/impl/request/InitResourceTest.java
@@ -24,6 +24,8 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.apache.sling.api.request.RequestProgressTracker;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.mapping.PathToUriMappingService;
+import org.apache.sling.engine.impl.SlingRequestProcessorImpl;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Before;
@@ -39,7 +41,7 @@ public class InitResourceTest {
     private RequestData requestData;
     private HttpServletRequest req;
     private HttpServletResponse resp;
-    private ResourceResolver resourceResolver;
+    private SlingRequestProcessorImpl slingRequestProcessorImpl;
 
     private final String requestURL;
     private final String pathInfo;
@@ -70,7 +72,9 @@ public class InitResourceTest {
 
         req = context.mock(HttpServletRequest.class);
         resp = context.mock(HttpServletResponse.class);
-        resourceResolver = context.mock(ResourceResolver.class);
+        slingRequestProcessorImpl = new SlingRequestProcessorImpl();
+        PathToUriMappingService pathToUriMappingService = context.mock(PathToUriMappingService.class);
+        slingRequestProcessorImpl.setPathToUriMappingService(pathToUriMappingService);
 
         context.checking(new Expectations() {{
             allowing(req).getRequestURL();
@@ -94,15 +98,15 @@ public class InitResourceTest {
             allowing(req).getAttribute(RequestProgressTracker.class.getName());
             will(returnValue(null));
 
-            // Verify that the ResourceResolver is called with the expected path
-            allowing(resourceResolver).resolve(with(any(HttpServletRequest.class)),with(equal(expectedResolvePath)));
+                allowing(pathToUriMappingService).resolve(with(any(HttpServletRequest.class)), with(equal(expectedResolvePath)));
+
         }});
 
-        requestData = new RequestData(null, req, resp);
+        requestData = new RequestData(slingRequestProcessorImpl, req, resp);
     }
 
     @Test
     public void resolverPathMatches() {
-        requestData.initResource(resourceResolver);
+        requestData.initResourceUri();
     }
 }