You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by re...@apache.org on 2025/08/22 17:21:50 UTC

(sling-org-apache-sling-resourceresolver) 01/01: SLING-12901: alias refactoring - NPE when attempting to alias root

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

reschke pushed a commit to branch SLING-12901
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git

commit f9a5e2de7b61c63035988ec2591bd86f97a1fa27
Author: Julian Reschke <re...@apache.org>
AuthorDate: Fri Aug 22 18:21:32 2025 +0100

    SLING-12901: alias refactoring - NPE when attempting to alias root
---
 .../impl/mapping/AliasHandler.java                 | 26 ++++++++++++++--------
 .../impl/mapping/AliasMapEntriesTest.java          | 20 ++++++++++++++---
 2 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/AliasHandler.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/AliasHandler.java
index de9b3676..40c8e57d 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/AliasHandler.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/AliasHandler.java
@@ -203,8 +203,8 @@ class AliasHandler {
         @NotNull
         private Map<String, Map<String, Collection<String>>> loadAliases(
                 @NotNull ResourceResolver resolver,
-                @Nullable List<String> conflictingAliases,
-                @Nullable List<String> invalidAliases,
+                @NotNull List<String> conflictingAliases,
+                @NotNull List<String> invalidAliases,
                 @NotNull StringBuilder diagnostics) {
 
             Map<String, Map<String, Collection<String>>> map = new ConcurrentHashMap<>();
@@ -529,13 +529,21 @@ class AliasHandler {
                 return false;
             } else {
                 // but apply them to the containing resource
-                return loadAliasFromArray(
-                        aliasArray,
-                        map,
-                        conflictingAliases,
-                        invalidAliases,
-                        containingResource.getName(),
-                        ResourceUtil.getParent(containingResource.getPath()));
+
+                String parentPath = ResourceUtil.getParent(containingResource.getPath());
+
+                if (parentPath == null) {
+                    log.debug("the root path cannot have aliases");
+                    return false;
+                } else {
+                    return loadAliasFromArray(
+                            aliasArray,
+                            map,
+                            conflictingAliases,
+                            invalidAliases,
+                            containingResource.getName(),
+                            parentPath);
+                }
             }
         }
     }
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/AliasMapEntriesTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/AliasMapEntriesTest.java
index 8ac52f15..3a90ef73 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/AliasMapEntriesTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/AliasMapEntriesTest.java
@@ -176,11 +176,11 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
         }
     }
 
-    private static void addResource(MapEntries mapEntries, String path, AtomicBoolean bool)
+    private static boolean addResource(MapEntries mapEntries, String path, AtomicBoolean bool)
             throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
         Method method = MapEntries.class.getDeclaredMethod("addResource", String.class, AtomicBoolean.class);
         method.setAccessible(true);
-        method.invoke(mapEntries, path, bool);
+        return (Boolean) method.invoke(mapEntries, path, bool);
     }
 
     private static void removeResource(MapEntries mapEntries, String path, AtomicBoolean bool)
@@ -496,6 +496,17 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
                 actual.contains(match1) || actual.contains(match2));
     }
 
+    // SLING-12901
+    @Test
+    public void test_doAddAliasOnRoot() throws Exception {
+        Resource root = createMockedResource("/");
+        when(root.getValueMap()).thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS, "alias"));
+
+        assertFalse(
+                "attempts to add aliases to root must be ignored",
+                addResource(mapEntries, root.getPath(), new AtomicBoolean()));
+    }
+
     // SLING-3727
     @Test
     public void test_doAddAliasAttributesWithDisableAliasOptimization() throws Exception {
@@ -541,7 +552,10 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
     // SLING-3727
     @Test
     public void test_doRemoveAttributesWithDisableAliasOptimization() throws Exception {
-        when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(false);
+        Assume.assumeFalse(
+                "checks behaviour for non-optimized case only",
+                resourceResolverFactory.isOptimizeAliasResolutionEnabled());
+
         mapEntries = new MapEntries(
                 resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider, metrics);