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 <[email protected]> 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);
