SLING-9620 - ResourceMapperImpl.getAllMappings does not respect multi-valued sling:alias
Read mult-valued aliases also when optimised alias resolution is enabled.
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 89f2859..1bd69b2 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
@@ -25,7 +25,9 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.function.UnaryOperator;
+import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
@@ -226,18 +228,14 @@
final Map<String, String> aliases = mapEntries.getAliasMap(parentPath);
- if ( aliases == null )
+ if ( aliases == null || !aliases.containsValue(current.getName()) )
return Collections.emptyList();
- if ( aliases.containsValue(current.getName()) ) {
- for ( Map.Entry<String,String> entry : aliases.entrySet() ) {
- if (current.getName().equals(entry.getValue())) {
- // TODO - support multi-valued entries
- return Collections.singletonList(entry.getKey());
- }
- }
- }
- 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);
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
index e267be5..77f6ca2 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
@@ -25,12 +25,10 @@
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
-import static org.junit.Assume.assumeFalse;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
-import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
@@ -47,7 +45,6 @@
import org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl;
import org.apache.sling.spi.resource.provider.ResourceProvider;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
-import org.jetbrains.annotations.NotNull;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
@@ -208,8 +205,6 @@
@Test
public void mapResourceWithMultivaluedAlias() {
- assumeFalse(optimiseAliasResolution);
-
ExpectedMappings.existingResource("/there-multiple")
.singleMapping("/alias-value-3")
.singleMappingWithRequest("/app/alias-value-3")