This is an automated email from the ASF dual-hosted git repository.
reschke pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
The following commit(s) were added to refs/heads/master by this push:
new e7f0d0ad SLING-12747: add logging to iteration loop in
ResourceResolverImpl (#203)
e7f0d0ad is described below
commit e7f0d0ad2c4a32e8603285f242920f4fb66aa38d
Author: Julian Reschke <[email protected]>
AuthorDate: Thu Sep 11 14:00:28 2025 +0200
SLING-12747: add logging to iteration loop in ResourceResolverImpl (#203)
---
.../impl/ResourceResolverImpl.java | 29 ++++++++++++++++------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
index f36aa205..ff04067f 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
@@ -350,13 +350,18 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
// loop while finding internal or external redirect into the
// content out of the virtual host mapping tree
// the counter is to ensure we are not caught in an endless loop here
- // TODO: might do better to be able to log the loop and help the user
- for (int i = 0; i < 100; i++) {
+
+ final int maxIterations = 100;
+ int iterationsLeft = maxIterations;
+
+ while (iterationsLeft > 0) {
+ iterationsLeft -= 1;
String[] mappedPath = null;
final Iterator<MapEntry> mapEntriesIterator =
this.factory.getMapEntries().getResolveMapsIterator(requestPath);
+
while (mapEntriesIterator.hasNext()) {
final MapEntry mapEntry = mapEntriesIterator.next();
mappedPath = mapEntry.replace(requestPath);
@@ -368,12 +373,12 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
Arrays.toString(mappedPath));
}
if (mapEntry.isInternal()) {
- // internal redirect
+ // internal redirect: stop looking for further
MapEntries
logger.debug("resolve: Redirecting internally");
break;
}
- // external redirect
+ // external redirect: we are done
logger.debug("resolve: Returning external redirect");
return this.factory
.getResourceDecoratorTracker()
@@ -388,14 +393,14 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
break;
}
- // if the mapped path is not an URL, use this path to continue
+ // if the mapped path is not a URI, abort and use this path to
continue
if (!mappedPath[0].contains("://")) {
logger.debug("resolve: Mapped path is for resource tree");
realPathList = mappedPath;
break;
}
- // otherwise the mapped path is an URI and we have to try to
+ // otherwise the mapped path is a URI, and we have to try to
// resolve that URI now, using the URI's path as the real path
try {
final URI uri = new URI(mappedPath[0], false);
@@ -404,11 +409,21 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
logger.debug("resolve: Mapped path is an URL, using new
request path {}", requestPath);
} catch (final URIException use) {
- // TODO: log and fail
+ logger.debug("resolve: failure parsing {} as URI",
mappedPath[0], use);
throw new ResourceNotFoundException(absPath);
}
}
+ if (iterationsLeft <= 0) {
+ // we get here if we - while following URI-shaped internal
redirects -
+ // reached the maximum number of allowed iterations
+ logger.debug(
+ "resolve: maximum number of iterations ({}) exhausted
while following internal redirects, "
+ + "continuing with last found request path: {}",
+ maxIterations,
+ requestPath);
+ }
+
// now we have the real path resolved from virtual host mapping
// this path may be absolute or relative, in which case we try
// to resolve it against the search path