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();
}
}