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 <[email protected]> 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(); } }
