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 35131687 SLING-12901: alias refactoring - NPE when attempting to alias 
root (#196)
35131687 is described below

commit 35131687bfd719208a7ae26845ddc54b57743756
Author: Julian Reschke <[email protected]>
AuthorDate: Fri Aug 22 19:37:36 2025 +0200

    SLING-12901: alias refactoring - NPE when attempting to alias root (#196)
---
 .../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);
 

Reply via email to