You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by jo...@apache.org on 2023/09/09 14:41:46 UTC

[sling-org-apache-sling-resourceresolver] 01/01: SLING-11715 in the optimized code path avoid resource resolution

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

joerghoh pushed a commit to branch SLING-11715-optimize-mapping
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git

commit 4b1e3c0c7c76262bd1ddc9a150a14ed4728d7b2b
Author: Jörg Hoh <jo...@joerghoh.de>
AuthorDate: Sat Sep 9 16:41:34 2023 +0200

    SLING-11715 in the optimized code path avoid resource resolution
---
 .../impl/mapping/ResourceMapperImpl.java           | 122 +++++++++++++--------
 1 file changed, 79 insertions(+), 43 deletions(-)

diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImpl.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImpl.java
index 3e02101..6382510 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImpl.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImpl.java
@@ -203,23 +203,7 @@ public class ResourceMapperImpl implements ResourceMapper {
         // make sure to append resolutionPathInfo, if present
         pathBuilder.setResolutionPathInfo(resolutionPathInfo);
         
-        Resource current = res;
-        String path = res.getPath();
-        while (path != null) {
-            List<String> aliases = Collections.emptyList();
-            // read alias only if we can read the resources and it's not a jcr:content leaf
-            if (current != null && !path.endsWith(ResourceResolverImpl.JCR_CONTENT_LEAF)) {
-                aliases = readAliases(path, current);
-            }
-            // build the path from the name segments or aliases
-            pathBuilder.insertSegment(aliases, ResourceUtil.getName(path));
-            path = ResourceUtil.getParent(path);
-            if ("/".equals(path)) {
-                path = null;
-            } else if (path != null) {
-                current = res.getResourceResolver().resolve(path);
-            }
-        }
+        resolveAliases(res, pathBuilder);
         
         // and then we have the mapped path to work on
         List<String> mappedPaths = pathBuilder.generatePaths();
@@ -232,34 +216,86 @@ public class ResourceMapperImpl implements ResourceMapper {
         
         return mappedPaths;
     }
+
+	private void resolveAliases(Resource res, PathGenerator pathBuilder) {
+		Resource current = res;
+        String path = res.getPath();
+        if (this.mapEntries.isOptimizeAliasResolutionEnabled()) {
+        	// this code path avoids any creation of Sling Resource objects
+        	while (path != null) {
+	            List<String> aliases = Collections.emptyList();
+	            // read alias only if we can read the resources and it's not a jcr:content leaf
+	            if (current != null && !path.endsWith(ResourceResolverImpl.JCR_CONTENT_LEAF)) {
+	                aliases = readAliasesOptimized(path);
+	            }
+	            // build the path from the name segments or aliases
+	            pathBuilder.insertSegment(aliases, ResourceUtil.getName(path));
+	            path = ResourceUtil.getParent(path);
+	            if ("/".equals(path)) {
+	                path = null;
+	            } 
+	        }
+        }
+        else {
+        	// while here there Resources are resolved
+	        while (path != null) {
+	            List<String> aliases = Collections.emptyList();
+	            // read alias only if we can read the resources and it's not a jcr:content leaf
+	            if (current != null && !path.endsWith(ResourceResolverImpl.JCR_CONTENT_LEAF)) {
+	                aliases = readAliases(path, current);
+	            }
+	            // build the path from the name segments or aliases
+	            pathBuilder.insertSegment(aliases, ResourceUtil.getName(path));
+	            path = ResourceUtil.getParent(path);
+	            if ("/".equals(path)) {
+	                path = null;
+	            } else if (path != null) {
+	                current = res.getResourceResolver().resolve(path);
+	            }
+	        }
+        }
+	}
     
+	/**
+	 * Resolve the aliases for the given resource by directly reading the sling:alias property
+	 * @param path the path of the resource
+	 * @param current the resource
+	 * @return
+	 */
     private List<String> readAliases(String path, Resource current) {
-        if (this.mapEntries.isOptimizeAliasResolutionEnabled()) {
-            logger.debug("map: Optimize Alias Resolution is Enabled");
-            String parentPath = ResourceUtil.getParent(path);
-            
-            if ( parentPath == null )
-                return Collections.emptyList();
-            
-            final Map<String, String> aliases = mapEntries.getAliasMap(parentPath);
-            
-            if ( aliases == null || !aliases.containsValue(current.getName()) ) 
-                return Collections.emptyList();
-            
-            return aliases.entrySet().stream()
-                .filter( e -> current.getName().contentEquals(e.getValue()) )
-                .map( Entry::getKey )
-                .collect(Collectors.toList());
-            
-        } else {
-            logger.debug("map: Optimize Alias Resolution is Disabled");
-            String[] aliases = ResourceResolverControl.getProperty(current, ResourceResolverImpl.PROP_ALIAS, String[].class);
-            if ( aliases == null || aliases.length == 0 )
-                return Collections.emptyList();
-            if ( aliases.length == 1 )
-                return Collections.singletonList(aliases[0]);
-            return Arrays.asList(aliases);
-        }        
+    	logger.debug("map: Optimize Alias Resolution is Disabled");
+    	String[] aliases = ResourceResolverControl.getProperty(current, ResourceResolverImpl.PROP_ALIAS, String[].class);
+    	if ( aliases == null || aliases.length == 0 )
+    		return Collections.emptyList();
+    	if ( aliases.length == 1 )
+    		return Collections.singletonList(aliases[0]);
+    	return Arrays.asList(aliases);      
+    }
+    
+    /**
+     * Resolve teh aliases for the given resource by a lookup in the mapEntries structure, avoiding
+     * any repository access
+     * @param path
+     * @return
+     */
+    private List<String> readAliasesOptimized(String path) {
+    	logger.debug("map: Optimize Alias Resolution is Enabled");
+    	String parentPath = ResourceUtil.getParent(path);
+    	if ( parentPath == null ) {
+    		return Collections.emptyList();
+    	}
+    	String name = path.substring(parentPath.length()+1);
+
+    	final Map<String, String> aliases = mapEntries.getAliasMap(parentPath);
+
+    	if ( aliases == null || !aliases.containsValue(name) ) 
+    		return Collections.emptyList();
+
+    	return aliases.entrySet().stream()
+    			.filter( e -> name.contentEquals(e.getValue()) )
+    			.map( Entry::getKey )
+    			.collect(Collectors.toList());
+
     }
 
     private void populateMappingsFromMapEntries(List<String> mappings, List<String> mappedPathList,