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:56 UTC

[sling-org-apache-sling-engine] branch feature/SLING-9662-Introduce-Resource-Mapping-SPI-v2 created (now 203f9a8)

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

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


      at 203f9a8  SLING-9662 Use Resource Mapping API for resolving

This branch includes the following new commits:

     new 203f9a8  SLING-9662 Use Resource Mapping API for resolving

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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

Posted by gh...@apache.org.
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();
     }
 }