blob: 3fe57bc5e7db60162205afbc5a311b302d8e0d2a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.sling.resourceresolver.impl.mapping;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.apache.sling.resourceresolver.impl.mapping.MapConfigurationProvider.VanityPathConfig;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.osgi.framework.BundleContext;
import org.osgi.service.event.EventAdmin;
public class MapEntriesTest {
private MapEntries mapEntries;
File vanityBloomFilterFile;
@Mock
private MapConfigurationProvider resourceResolverFactory;
@Mock
private BundleContext bundleContext;
@Mock
private ResourceResolver resourceResolver;
@Mock
private EventAdmin eventAdmin;
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
final List<VanityPathConfig> configs = new ArrayList<MapConfigurationProvider.VanityPathConfig>();
configs.add(new VanityPathConfig("/libs/", false));
configs.add(new VanityPathConfig("/libs/denied", true));
configs.add(new VanityPathConfig("/foo/", false));
configs.add(new VanityPathConfig("/baa/", false));
configs.add(new VanityPathConfig("/justVanityPath", false));
configs.add(new VanityPathConfig("/justVanityPath2", false));
configs.add(new VanityPathConfig("/badVanityPath", false));
configs.add(new VanityPathConfig("/redirectingVanityPath", false));
configs.add(new VanityPathConfig("/redirectingVanityPath301", false));
configs.add(new VanityPathConfig("/vanityPathOnJcrContent", false));
Collections.sort(configs);
vanityBloomFilterFile = new File("src/main/resourcesvanityBloomFilter.txt");
when(bundleContext.getDataFile("vanityBloomFilter.txt")).thenReturn(vanityBloomFilterFile);
when(resourceResolverFactory.getAdministrativeResourceResolver(null)).thenReturn(resourceResolver);
when(resourceResolverFactory.isVanityPathEnabled()).thenReturn(true);
when(resourceResolverFactory.getVanityPathConfig()).thenReturn(configs);
when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(true);
when(resourceResolver.findResources(anyString(), eq("sql"))).thenReturn(
Collections.<Resource> emptySet().iterator());
mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin);
Field field0 = MapEntries.class.getDeclaredField("mapRoot");
field0.setAccessible(true);
field0.set(mapEntries, MapEntries.DEFAULT_MAP_ROOT);
Field field1 = MapEntries.class.getDeclaredField("maxCachedVanityPathEntries");
field1.setAccessible(true);
field1.set(mapEntries, -1);
}
@After
public void tearDown() throws Exception {
vanityBloomFilterFile.delete();
}
@Test
public void test_simple_alias_support() {
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
when(resourceResolver.findResources(anyString(), eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() {
public Iterator<Resource> answer(InvocationOnMock invocation) throws Throwable {
if (invocation.getArguments()[0].toString().contains("sling:alias")) {
return Collections.singleton(result).iterator();
} else {
return Collections.<Resource> emptySet().iterator();
}
}
});
mapEntries.doInit();
Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMap);
assertTrue(aliasMap.containsKey("alias"));
assertEquals("child", aliasMap.get("alias"));
}
@Test
public void test_that_duplicate_alias_doesnt_replace_first_alias() {
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
final Resource secondResult = mock(Resource.class);
when(secondResult.getParent()).thenReturn(parent);
when(secondResult.getPath()).thenReturn("/parent/child2");
when(secondResult.getName()).thenReturn("child2");
when(secondResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
when(resourceResolver.findResources(anyString(), eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() {
public Iterator<Resource> answer(InvocationOnMock invocation) throws Throwable {
if (invocation.getArguments()[0].toString().contains("sling:alias")) {
return Arrays.asList(result, secondResult).iterator();
} else {
return Collections.<Resource> emptySet().iterator();
}
}
});
mapEntries.doInit();
Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMap);
assertTrue(aliasMap.containsKey("alias"));
assertEquals("child", aliasMap.get("alias"));
}
@Test
public void test_vanity_path_registration() throws Exception {
// specifically making this a weird value because we want to verify that
// the configuration value is being used
int DEFAULT_VANITY_STATUS = 333333;
when(resourceResolverFactory.getDefaultVanityPathRedirectStatus()).thenReturn(DEFAULT_VANITY_STATUS);
final List<Resource> resources = new ArrayList<Resource>();
Resource justVanityPath = mock(Resource.class, "justVanityPath");
when(justVanityPath.getPath()).thenReturn("/justVanityPath");
when(justVanityPath.getName()).thenReturn("justVanityPath");
when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath"));
resources.add(justVanityPath);
Resource badVanityPath = mock(Resource.class, "badVanityPath");
when(badVanityPath.getPath()).thenReturn("/badVanityPath");
when(badVanityPath.getName()).thenReturn("badVanityPath");
when(badVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/content/mypage/en-us-{132"));
resources.add(badVanityPath);
Resource redirectingVanityPath = mock(Resource.class, "redirectingVanityPath");
when(redirectingVanityPath.getPath()).thenReturn("/redirectingVanityPath");
when(redirectingVanityPath.getName()).thenReturn("redirectingVanityPath");
when(redirectingVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/redirectingVanityPath", "sling:redirect", true));
resources.add(redirectingVanityPath);
Resource redirectingVanityPath301 = mock(Resource.class, "redirectingVanityPath301");
when(redirectingVanityPath301.getPath()).thenReturn("/redirectingVanityPath301");
when(redirectingVanityPath301.getName()).thenReturn("redirectingVanityPath301");
when(redirectingVanityPath301.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/redirectingVanityPath301", "sling:redirect", true, "sling:redirectStatus", 301));
resources.add(redirectingVanityPath301);
Resource vanityPathOnJcrContentParent = mock(Resource.class, "vanityPathOnJcrContentParent");
when(vanityPathOnJcrContentParent.getPath()).thenReturn("/vanityPathOnJcrContent");
when(vanityPathOnJcrContentParent.getName()).thenReturn("vanityPathOnJcrContent");
Resource vanityPathOnJcrContent = mock(Resource.class, "vanityPathOnJcrContent");
when(vanityPathOnJcrContent.getPath()).thenReturn("/vanityPathOnJcrContent/jcr:content");
when(vanityPathOnJcrContent.getName()).thenReturn("jcr:content");
when(vanityPathOnJcrContent.getParent()).thenReturn(vanityPathOnJcrContentParent);
when(vanityPathOnJcrContent.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/vanityPathOnJcrContent"));
resources.add(vanityPathOnJcrContent);
when(resourceResolver.findResources(anyString(), eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() {
public Iterator<Resource> answer(InvocationOnMock invocation) throws Throwable {
if (invocation.getArguments()[0].toString().contains("sling:vanityPath")) {
return resources.iterator();
} else {
return Collections.<Resource> emptySet().iterator();
}
}
});
mapEntries.doInit();
mapEntries.initializeVanityPaths();
List<MapEntry> entries = mapEntries.getResolveMaps();
assertEquals(8, entries.size());
for (MapEntry entry : entries) {
if (entry.getPattern().contains("/target/redirectingVanityPath301")) {
assertEquals(301, entry.getStatus());
assertFalse(entry.isInternal());
} else if (entry.getPattern().contains("/target/redirectingVanityPath")) {
assertEquals(DEFAULT_VANITY_STATUS, entry.getStatus());
assertFalse(entry.isInternal());
} else if (entry.getPattern().contains("/target/justVanityPath")) {
assertTrue(entry.isInternal());
} else if (entry.getPattern().contains("/target/vanityPathOnJcrContent")) {
for (String redirect : entry.getRedirect()) {
assertFalse(redirect.contains("jcr:content"));
}
}
}
Field field = MapEntries.class.getDeclaredField("vanityTargets");
field.setAccessible(true);
Map<String, List<String>> vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
assertEquals(4, vanityTargets.size());
}
private ValueMap buildValueMap(Object... string) {
final Map<String, Object> data = new HashMap<String, Object>();
for (int i = 0; i < string.length; i = i + 2) {
data.put((String) string[i], string[i+1]);
}
return new ValueMapDecorator(data);
}
private Resource getVanityPathResource(final String path) {
Resource rsrc = mock(Resource.class);
when(rsrc.getPath()).thenReturn(path);
when(rsrc.getName()).thenReturn(ResourceUtil.getName(path));
when(rsrc.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/vanity" + path));
return rsrc;
}
@Test
public void test_vanity_path_registration_include_exclude() throws IOException {
final String[] validPaths = {"/libs/somewhere", "/libs/a/b", "/foo/a", "/baa/a"};
final String[] invalidPaths = {"/libs/denied/a", "/libs/denied/b/c", "/nowhere"};
final List<Resource> resources = new ArrayList<Resource>();
for(final String val : validPaths) {
resources.add(getVanityPathResource(val));
}
for(final String val : invalidPaths) {
resources.add(getVanityPathResource(val));
}
when(resourceResolver.findResources(anyString(), eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() {
public Iterator<Resource> answer(InvocationOnMock invocation) throws Throwable {
if (invocation.getArguments()[0].toString().contains("sling:vanityPath")) {
return resources.iterator();
} else {
return Collections.<Resource> emptySet().iterator();
}
}
});
mapEntries.doInit();
mapEntries.initializeVanityPaths();
List<MapEntry> entries = mapEntries.getResolveMaps();
// each valid resource results in 2 entries
assertEquals(validPaths.length * 2, entries.size());
final Set<String> resultSet = new HashSet<String>();
for(final String p : validPaths) {
resultSet.add(p + "$1");
resultSet.add(p + ".html");
}
for (final MapEntry entry : entries) {
assertTrue(resultSet.remove(entry.getRedirect()[0]));
}
}
@Test
public void test_getActualContentPath() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("getActualContentPath", String.class);
method.setAccessible(true);
String actualContent = (String) method.invoke(mapEntries, "/content");
assertEquals("/content", actualContent);
actualContent = (String) method.invoke(mapEntries, "/content/jcr:content");
assertEquals("/content", actualContent);
}
@Test
public void test_getMapEntryRedirect() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("getMapEntryRedirect", MapEntry.class);
method.setAccessible(true);
MapEntry mapEntry = new MapEntry("/content", -1, false, 0, "/content");
String actualContent = (String) method.invoke(mapEntries, mapEntry);
assertEquals("/content", actualContent);
mapEntry = new MapEntry("/content", -1, false, 0, "/content$1");
actualContent = (String) method.invoke(mapEntries, mapEntry);
assertEquals("/content", actualContent);
mapEntry = new MapEntry("/content", -1, false, 0, "/content.html");
actualContent = (String) method.invoke(mapEntries, mapEntry);
assertEquals("/content", actualContent);
}
@Test
public void test_doAddVanity() throws Exception {
List<MapEntry> entries = mapEntries.getResolveMaps();
assertEquals(0, entries.size());
Field field = MapEntries.class.getDeclaredField("vanityTargets");
field.setAccessible(true);
Map<String, List<String>> vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
assertEquals(0, vanityTargets.size());
Method method = MapEntries.class.getDeclaredMethod("doAddVanity", String.class);
method.setAccessible(true);
Resource justVanityPath = mock(Resource.class, "justVanityPath");
when(resourceResolver.getResource("/justVanityPath")).thenReturn(justVanityPath);
when(justVanityPath.getPath()).thenReturn("/justVanityPath");
when(justVanityPath.getName()).thenReturn("justVanityPath");
when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath"));
method.invoke(mapEntries, "/justVanityPath");
entries = mapEntries.getResolveMaps();
assertEquals(2, entries.size());
//bad vanity
Resource badVanityPath = mock(Resource.class, "badVanityPath");
when(resourceResolver.getResource("/badVanityPath")).thenReturn(badVanityPath);
when(badVanityPath.getPath()).thenReturn("/badVanityPath");
when(badVanityPath.getName()).thenReturn("badVanityPath");
when(badVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/content/mypage/en-us-{132"));
method.invoke(mapEntries, "/badVanityPath");
assertEquals(2, entries.size());
vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
assertEquals(1, vanityTargets.size());
//vanity under jcr:content
Resource vanityPathOnJcrContentParent = mock(Resource.class, "vanityPathOnJcrContentParent");
when(vanityPathOnJcrContentParent.getPath()).thenReturn("/vanityPathOnJcrContent");
when(vanityPathOnJcrContentParent.getName()).thenReturn("vanityPathOnJcrContent");
Resource vanityPathOnJcrContent = mock(Resource.class, "vanityPathOnJcrContent");
when(resourceResolver.getResource("/vanityPathOnJcrContent/jcr:content")).thenReturn(vanityPathOnJcrContent);
when(vanityPathOnJcrContent.getPath()).thenReturn("/vanityPathOnJcrContent/jcr:content");
when(vanityPathOnJcrContent.getName()).thenReturn("jcr:content");
when(vanityPathOnJcrContent.getParent()).thenReturn(vanityPathOnJcrContentParent);
when(vanityPathOnJcrContent.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/vanityPathOnJcrContent"));
method.invoke(mapEntries, "/vanityPathOnJcrContent/jcr:content");
entries = mapEntries.getResolveMaps();
assertEquals(4, entries.size());
vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
assertEquals(2, vanityTargets.size());
assertNull(vanityTargets.get("/vanityPathOnJcrContent/jcr:content"));
assertNotNull(vanityTargets.get("/vanityPathOnJcrContent"));
}
@Test
public void test_doUpdateVanity() throws Exception {
Field field0 = MapEntries.class.getDeclaredField("resolveMapsMap");
field0.setAccessible(true);
Map<String, List<MapEntry>> resolveMapsMap = (Map<String, List<MapEntry>>) field0.get(mapEntries);
assertEquals(1, resolveMapsMap.size());
Field field = MapEntries.class.getDeclaredField("vanityTargets");
field.setAccessible(true);
Map<String, List<String>> vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
assertEquals(0, vanityTargets.size());
Method method = MapEntries.class.getDeclaredMethod("doAddVanity", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doUpdateVanity", String.class);
method1.setAccessible(true);
Resource justVanityPath = mock(Resource.class, "justVanityPath");
when(resourceResolver.getResource("/justVanityPath")).thenReturn(justVanityPath);
when(justVanityPath.getPath()).thenReturn("/justVanityPath");
when(justVanityPath.getName()).thenReturn("justVanityPath");
when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath"));
method.invoke(mapEntries, "/justVanityPath");
assertEquals(2, resolveMapsMap.size());
assertEquals(1, vanityTargets.size());
assertNotNull(resolveMapsMap.get("/target/justVanityPath"));
assertNull(resolveMapsMap.get("/target/justVanityPathUpdated"));
assertEquals(1, vanityTargets.get("/justVanityPath").size());
assertEquals("/target/justVanityPath", vanityTargets.get("/justVanityPath").get(0));
//update vanity path
when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPathUpdated"));
method1.invoke(mapEntries, "/justVanityPath");
assertEquals(2, resolveMapsMap.size());
assertEquals(1, vanityTargets.size());
assertNull(resolveMapsMap.get("/target/justVanityPath"));
assertNotNull(resolveMapsMap.get("/target/justVanityPathUpdated"));
assertEquals(1, vanityTargets.get("/justVanityPath").size());
assertEquals("/target/justVanityPathUpdated", vanityTargets.get("/justVanityPath").get(0));
//vanity under jcr:content
Resource vanityPathOnJcrContentParent = mock(Resource.class, "vanityPathOnJcrContentParent");
when(vanityPathOnJcrContentParent.getPath()).thenReturn("/vanityPathOnJcrContent");
when(vanityPathOnJcrContentParent.getName()).thenReturn("vanityPathOnJcrContent");
Resource vanityPathOnJcrContent = mock(Resource.class, "vanityPathOnJcrContent");
when(resourceResolver.getResource("/vanityPathOnJcrContent/jcr:content")).thenReturn(vanityPathOnJcrContent);
when(vanityPathOnJcrContent.getPath()).thenReturn("/vanityPathOnJcrContent/jcr:content");
when(vanityPathOnJcrContent.getName()).thenReturn("jcr:content");
when(vanityPathOnJcrContent.getParent()).thenReturn(vanityPathOnJcrContentParent);
when(vanityPathOnJcrContent.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/vanityPathOnJcrContent"));
method.invoke(mapEntries, "/vanityPathOnJcrContent/jcr:content");
assertEquals(3, resolveMapsMap.size());
assertEquals(2, vanityTargets.size());
assertNotNull(resolveMapsMap.get("/target/vanityPathOnJcrContent"));
assertNull(resolveMapsMap.get("/target/vanityPathOnJcrContentUpdated"));
assertEquals(1, vanityTargets.get("/vanityPathOnJcrContent").size());
assertEquals("/target/vanityPathOnJcrContent", vanityTargets.get("/vanityPathOnJcrContent").get(0));
//update vanity path
when(vanityPathOnJcrContent.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/vanityPathOnJcrContentUpdated"));
method1.invoke(mapEntries, "/vanityPathOnJcrContent/jcr:content");
assertEquals(3, resolveMapsMap.size());
assertEquals(2, vanityTargets.size());
assertNull(resolveMapsMap.get("/target/vanityPathOnJcrContent"));
assertNotNull(resolveMapsMap.get("/target/vanityPathOnJcrContentUpdated"));
assertEquals(1, vanityTargets.get("/vanityPathOnJcrContent").size());
assertEquals("/target/vanityPathOnJcrContentUpdated", vanityTargets.get("/vanityPathOnJcrContent").get(0));
}
@Test
public void test_doRemoveVanity() throws Exception {
Field field0 = MapEntries.class.getDeclaredField("resolveMapsMap");
field0.setAccessible(true);
Map<String, List<MapEntry>> resolveMapsMap = (Map<String, List<MapEntry>>) field0.get(mapEntries);
assertEquals(1, resolveMapsMap.size());
Field field = MapEntries.class.getDeclaredField("vanityTargets");
field.setAccessible(true);
Map<String, List<String>> vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
assertEquals(0, vanityTargets.size());
Method method = MapEntries.class.getDeclaredMethod("doAddVanity", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doRemoveVanity", String.class);
method1.setAccessible(true);
Resource justVanityPath = mock(Resource.class, "justVanityPath");
when(resourceResolver.getResource("/justVanityPath")).thenReturn(justVanityPath);
when(justVanityPath.getPath()).thenReturn("/justVanityPath");
when(justVanityPath.getName()).thenReturn("justVanityPath");
when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath"));
method.invoke(mapEntries, "/justVanityPath");
assertEquals(2, resolveMapsMap.size());
assertEquals(1, vanityTargets.size());
assertNotNull(resolveMapsMap.get("/target/justVanityPath"));
assertEquals(1, vanityTargets.get("/justVanityPath").size());
assertEquals("/target/justVanityPath", vanityTargets.get("/justVanityPath").get(0));
//remove vanity path
method1.invoke(mapEntries, "/justVanityPath");
assertEquals(1, resolveMapsMap.size());
assertEquals(0, vanityTargets.size());
assertNull(resolveMapsMap.get("/target/justVanityPath"));
//vanity under jcr:content
Resource vanityPathOnJcrContentParent = mock(Resource.class, "vanityPathOnJcrContentParent");
when(vanityPathOnJcrContentParent.getPath()).thenReturn("/vanityPathOnJcrContent");
when(vanityPathOnJcrContentParent.getName()).thenReturn("vanityPathOnJcrContent");
Resource vanityPathOnJcrContent = mock(Resource.class, "vanityPathOnJcrContent");
when(resourceResolver.getResource("/vanityPathOnJcrContent/jcr:content")).thenReturn(vanityPathOnJcrContent);
when(vanityPathOnJcrContent.getPath()).thenReturn("/vanityPathOnJcrContent/jcr:content");
when(vanityPathOnJcrContent.getName()).thenReturn("jcr:content");
when(vanityPathOnJcrContent.getParent()).thenReturn(vanityPathOnJcrContentParent);
when(vanityPathOnJcrContent.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/vanityPathOnJcrContent"));
method.invoke(mapEntries, "/vanityPathOnJcrContent/jcr:content");
assertEquals(2, resolveMapsMap.size());
assertEquals(1, vanityTargets.size());
assertNotNull(resolveMapsMap.get("/target/vanityPathOnJcrContent"));
assertEquals(1,vanityTargets.get("/vanityPathOnJcrContent").size());
assertEquals("/target/vanityPathOnJcrContent", vanityTargets.get("/vanityPathOnJcrContent").get(0));
//remove vanity path
method1.invoke(mapEntries, "/vanityPathOnJcrContent/jcr:content");
assertEquals(1, resolveMapsMap.size());
assertEquals(0, vanityTargets.size());
assertNull(resolveMapsMap.get("/target/vanityPathOnJcrContent"));
}
@Test
public void test_doUpdateVanityOrder() throws Exception {
Field field0 = MapEntries.class.getDeclaredField("resolveMapsMap");
field0.setAccessible(true);
Map<String, List<MapEntry>> resolveMapsMap = (Map<String, List<MapEntry>>) field0.get(mapEntries);
assertEquals(1, resolveMapsMap.size());
Field field = MapEntries.class.getDeclaredField("vanityTargets");
field.setAccessible(true);
Map<String, List<String>> vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
assertEquals(0, vanityTargets.size());
Method method = MapEntries.class.getDeclaredMethod("doAddVanity", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doUpdateVanityOrder", String.class, boolean.class);
method1.setAccessible(true);
Resource justVanityPath = mock(Resource.class, "justVanityPath");
when(resourceResolver.getResource("/justVanityPath")).thenReturn(justVanityPath);
when(justVanityPath.getPath()).thenReturn("/justVanityPath");
when(justVanityPath.getName()).thenReturn("justVanityPath");
when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath"));
method.invoke(mapEntries, "/justVanityPath");
Resource justVanityPath2 = mock(Resource.class, "justVanityPath2");
when(resourceResolver.getResource("/justVanityPath2")).thenReturn(justVanityPath2);
when(justVanityPath2.getPath()).thenReturn("/justVanityPath2");
when(justVanityPath2.getName()).thenReturn("justVanityPath2");
when(justVanityPath2.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath","sling:vanityOrder", 100));
method.invoke(mapEntries, "/justVanityPath2");
assertEquals(2, resolveMapsMap.size());
assertEquals(2, vanityTargets.size());
assertNotNull(resolveMapsMap.get("/target/justVanityPath"));
Iterator <MapEntry> iterator = resolveMapsMap.get("/target/justVanityPath").iterator();
assertEquals("/justVanityPath2$1", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath$1", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath2.html", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath.html", iterator.next().getRedirect()[0]);
assertFalse(iterator.hasNext());
when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath","sling:vanityOrder", 1000));
method1.invoke(mapEntries, "/justVanityPath",false);
iterator = resolveMapsMap.get("/target/justVanityPath").iterator();
assertEquals("/justVanityPath$1", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath2$1", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath.html", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath2.html", iterator.next().getRedirect()[0]);
assertFalse(iterator.hasNext());
when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath"));
method1.invoke(mapEntries, "/justVanityPath",true);
iterator = resolveMapsMap.get("/target/justVanityPath").iterator();
assertEquals("/justVanityPath2$1", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath$1", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath2.html", iterator.next().getRedirect()[0]);
assertEquals("/justVanityPath.html", iterator.next().getRedirect()[0]);
assertFalse(iterator.hasNext());
}
//SLING-3727
@Test
public void test_doAddAliasAttributesWithDisableAliasOptimization() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAttributes", String.class, String[].class, boolean.class);
method.setAccessible(true);
when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(false);
mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin);
Field field0 = MapEntries.class.getDeclaredField("mapRoot");
field0.setAccessible(true);
field0.set(mapEntries, MapEntries.DEFAULT_MAP_ROOT);
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent/child")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent/child",
new String[] { "sling:alias" }, false);
Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
assertNull(aliasMap);
}
//SLING-3727
@Test
public void test_doUpdateAttributesWithDisableAliasOptimization() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doUpdateAttributes", String.class, String[].class, boolean.class);
method.setAccessible(true);
when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(false);
mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin);
Field field0 = MapEntries.class.getDeclaredField("mapRoot");
field0.setAccessible(true);
field0.set(mapEntries, MapEntries.DEFAULT_MAP_ROOT);
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent/child")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent/child",
new String[] { "sling:alias" }, false);
Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
assertNull(aliasMap);
}
//SLING-3727
@Test
public void test_doRemoveAttributessWithDisableAliasOptimization() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doRemoveAttributes", String.class, String[].class, boolean.class, boolean.class);
method.setAccessible(true);
when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(false);
mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin);
Field field0 = MapEntries.class.getDeclaredField("mapRoot");
field0.setAccessible(true);
field0.set(mapEntries, MapEntries.DEFAULT_MAP_ROOT);
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent/child")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent/child",
new String[] { "sling:alias" }, false, false);
Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
assertNull(aliasMap);
}
@Test
public void test_doAddAlias() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
method.setAccessible(true);
Field field0 = MapEntries.class.getDeclaredField("aliasMap");
field0.setAccessible(true);
Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
assertEquals(0, aliasMap.size());
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent/child")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent/child");
Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertEquals("child", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
//test_that_duplicate_alias_doesnt_replace_first_alias
final Resource secondResult = mock(Resource.class);
when(resourceResolver.getResource("/parent/child2")).thenReturn(secondResult);
when(secondResult.getParent()).thenReturn(parent);
when(secondResult.getPath()).thenReturn("/parent/child2");
when(secondResult.getName()).thenReturn("child2");
when(secondResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent/child2");
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertEquals("child", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
//testing jcr:content node
final Resource jcrContentResult = mock(Resource.class);
when(resourceResolver.getResource("/parent/child/jcr:content")).thenReturn(jcrContentResult);
when(jcrContentResult.getParent()).thenReturn(result);
when(jcrContentResult.getPath()).thenReturn("/parent/child/jcr:content");
when(jcrContentResult.getName()).thenReturn("jcr:content");
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContent"));
method.invoke(mapEntries, "/parent/child/jcr:content");
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(2, aliasMapEntry.size());
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("child", aliasMapEntry.get("aliasJcrContent"));
assertEquals(1, aliasMap.size());
}
@Test
public void test_doAddAlias2() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
method.setAccessible(true);
Field field0 = MapEntries.class.getDeclaredField("aliasMap");
field0.setAccessible(true);
Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
assertEquals(0, aliasMap.size());
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent");
when(result.getName()).thenReturn("parent");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent");
Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertEquals("parent", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
//test_that_duplicate_alias_doesnt_replace_first_alias
final Resource secondResult = mock(Resource.class);
when(resourceResolver.getResource("/parent2")).thenReturn(secondResult);
when(secondResult.getParent()).thenReturn(parent);
when(secondResult.getPath()).thenReturn("/parent2");
when(secondResult.getName()).thenReturn("parent2");
when(secondResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent2");
aliasMapEntry = mapEntries.getAliasMap("/");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertEquals("parent", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
//testing jcr:content node
final Resource jcrContentResult = mock(Resource.class);
when(resourceResolver.getResource("/parent/jcr:content")).thenReturn(jcrContentResult);
when(jcrContentResult.getParent()).thenReturn(result);
when(jcrContentResult.getPath()).thenReturn("/parent/jcr:content");
when(jcrContentResult.getName()).thenReturn("jcr:content");
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContent"));
method.invoke(mapEntries, "/parent/jcr:content");
aliasMapEntry = mapEntries.getAliasMap("/");
assertNotNull(aliasMapEntry);
assertEquals(2, aliasMapEntry.size());
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("parent", aliasMapEntry.get("aliasJcrContent"));
assertEquals(1, aliasMap.size());
}
@Test
public void test_doUpdateAlias() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doUpdateAttributes", String.class , String[].class, boolean.class);
method1.setAccessible(true);
Field field0 = MapEntries.class.getDeclaredField("aliasMap");
field0.setAccessible(true);
Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
assertEquals(0, aliasMap.size());
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent/child")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent/child");
Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertFalse(aliasMapEntry.containsKey("aliasUpdated"));
assertEquals("child", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasUpdated"));
method1.invoke(mapEntries, "/parent/child", new String[] { "sling:alias" }, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertFalse(aliasMapEntry.containsKey("alias"));
assertTrue(aliasMapEntry.containsKey("aliasUpdated"));
assertEquals("child", aliasMapEntry.get("aliasUpdated"));
assertEquals(1, aliasMap.size());
//testing jcr:content node update
final Resource jcrContentResult = mock(Resource.class);
when(resourceResolver.getResource("/parent/child/jcr:content")).thenReturn(jcrContentResult);
when(jcrContentResult.getParent()).thenReturn(result);
when(jcrContentResult.getPath()).thenReturn("/parent/child/jcr:content");
when(jcrContentResult.getName()).thenReturn("jcr:content");
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContent"));
when(result.getChild("jcr:content")).thenReturn(jcrContentResult);
method.invoke(mapEntries, "/parent/child/jcr:content");
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(2, aliasMapEntry.size());
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertFalse(aliasMapEntry.containsKey("aliasJcrContentUpdated"));
assertEquals("child", aliasMapEntry.get("aliasJcrContent"));
assertEquals(1, aliasMap.size());
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContentUpdated"));
method1.invoke(mapEntries, "/parent/child/jcr:content", new String[] { "sling:alias" }, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(2, aliasMapEntry.size());
assertFalse(aliasMapEntry.containsKey("aliasJcrContent"));
assertTrue(aliasMapEntry.containsKey("aliasJcrContentUpdated"));
assertEquals("child", aliasMapEntry.get("aliasJcrContentUpdated"));
assertEquals(1, aliasMap.size());
//re-update alias
method1.invoke(mapEntries, "/parent/child", new String[] { "sling:alias" }, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(2, aliasMapEntry.size());
assertFalse(aliasMapEntry.containsKey("alias"));
assertTrue(aliasMapEntry.containsKey("aliasUpdated"));
assertEquals("child", aliasMapEntry.get("aliasUpdated"));
//add another node with different alias and check that the update doesn't break anything (see also SLING-3728)
final Resource secondResult = mock(Resource.class);
when(resourceResolver.getResource("/parent/child2")).thenReturn(secondResult);
when(secondResult.getParent()).thenReturn(parent);
when(secondResult.getPath()).thenReturn("/parent/child2");
when(secondResult.getName()).thenReturn("child2");
when(secondResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias2"));
method.invoke(mapEntries, "/parent/child2");
assertEquals(1, aliasMap.size());
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(3, aliasMapEntry.size());
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContentUpdated"));
method1.invoke(mapEntries, "/parent/child/jcr:content", new String[] { "sling:alias" }, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(3, aliasMapEntry.size());
assertFalse(aliasMapEntry.containsKey("aliasJcrContent"));
assertTrue(aliasMapEntry.containsKey("aliasJcrContentUpdated"));
assertEquals("child", aliasMapEntry.get("aliasJcrContentUpdated"));
assertEquals(1, aliasMap.size());
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", null));
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContentUpdated"));
method1.invoke(mapEntries, "/parent/child/jcr:content", new String[] { "sling:alias" }, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(2, aliasMapEntry.size());
assertFalse(aliasMapEntry.containsKey("aliasJcrContent"));
assertTrue(aliasMapEntry.containsKey("aliasJcrContentUpdated"));
assertEquals("child", aliasMapEntry.get("aliasJcrContentUpdated"));
assertEquals(1, aliasMap.size());
}
@Test
public void test_doRemoveAlias() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doRemoveAttributes", String.class, String[].class, boolean.class, boolean.class);
method1.setAccessible(true);
Field field0 = MapEntries.class.getDeclaredField("aliasMap");
field0.setAccessible(true);
Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
assertEquals(0, aliasMap.size());
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent/child")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent/child");
Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertEquals("child", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
method1.invoke(mapEntries, "/parent/child", new String[] { "sling:alias" }, false, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNull(aliasMapEntry);
assertEquals(0, aliasMap.size());
//re-add node and test nodeDeletion true
method.invoke(mapEntries, "/parent/child");
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertEquals("child", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
when(resourceResolver.getResource("/parent/child")).thenReturn(null);
method1.invoke(mapEntries, "/parent/child", new String[] { "sling:alias" }, true, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNull(aliasMapEntry);
assertEquals(0, aliasMap.size());
}
@Test
public void test_doRemoveAlias2() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doRemoveAttributes", String.class, String[].class, boolean.class, boolean.class);
method1.setAccessible(true);
Field field0 = MapEntries.class.getDeclaredField("aliasMap");
field0.setAccessible(true);
Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
assertEquals(0, aliasMap.size());
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent/child")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap());
//testing jcr:content node removal
final Resource jcrContentResult = mock(Resource.class);
when(resourceResolver.getResource("/parent/child/jcr:content")).thenReturn(jcrContentResult);
when(jcrContentResult.getParent()).thenReturn(result);
when(jcrContentResult.getPath()).thenReturn("/parent/child/jcr:content");
when(jcrContentResult.getName()).thenReturn("jcr:content");
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContent"));
when(result.getChild("jcr:content")).thenReturn(jcrContentResult);
method.invoke(mapEntries, "/parent/child/jcr:content");
Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("child", aliasMapEntry.get("aliasJcrContent"));
assertEquals(1, aliasMap.size());
method1.invoke(mapEntries, "/parent/child/jcr:content", new String[] { "sling:alias" }, false, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNull(aliasMapEntry);
assertEquals(0, aliasMap.size());
//re-add node and test nodeDeletion true
method.invoke(mapEntries, "/parent/child/jcr:content");
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("child", aliasMapEntry.get("aliasJcrContent"));
assertEquals(1, aliasMap.size());
when(resourceResolver.getResource("/parent/child/jcr:content")).thenReturn(null);
when(result.getChild("jcr:content")).thenReturn(null);
method1.invoke(mapEntries, "/parent/child/jcr:content", new String[] { "sling:alias" }, true, false);
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNull(aliasMapEntry);
assertEquals(0, aliasMap.size());
}
@Test
public void test_doRemoveAlias3() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doRemoveAttributes", String.class, String[].class, boolean.class, boolean.class);
method1.setAccessible(true);
Field field0 = MapEntries.class.getDeclaredField("aliasMap");
field0.setAccessible(true);
Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
assertEquals(0, aliasMap.size());
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent/child")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent/child");
when(result.getName()).thenReturn("child");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent/child");
final Resource jcrContentResult = mock(Resource.class);
when(resourceResolver.getResource("/parent/child/jcr:content")).thenReturn(jcrContentResult);
when(jcrContentResult.getParent()).thenReturn(result);
when(jcrContentResult.getPath()).thenReturn("/parent/child/jcr:content");
when(jcrContentResult.getName()).thenReturn("jcr:content");
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContent"));
when(result.getChild("jcr:content")).thenReturn(jcrContentResult);
method.invoke(mapEntries, "/parent/child/jcr:content");
Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("child", aliasMapEntry.get("aliasJcrContent"));
//test with two nodes
assertEquals(1, aliasMap.size());
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(2, aliasMapEntry.size());
method1.invoke(mapEntries, "/parent/child/jcr:content", new String[] { "sling:alias" }, false, false);
assertEquals(1, aliasMap.size());
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(1, aliasMapEntry.size());
// re-add the node and test /parent/child
method.invoke(mapEntries, "/parent/child/jcr:content");
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("child", aliasMapEntry.get("aliasJcrContent"));
assertEquals(2, aliasMapEntry.size());
method1.invoke(mapEntries, "/parent/child", new String[] { "sling:alias" }, false, false);
assertEquals(1, aliasMap.size());
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(1, aliasMapEntry.size());
// re-add the node and test node removal
method.invoke(mapEntries, "/parent/child");
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("child", aliasMapEntry.get("aliasJcrContent"));
assertEquals(2, aliasMapEntry.size());
when(resourceResolver.getResource("/parent/child/jcr:content")).thenReturn(null);
when(result.getChild("jcr:content")).thenReturn(null);
method1.invoke(mapEntries, "/parent/child/jcr:content", new String[] { "sling:alias" }, true, false);
assertEquals(1, aliasMap.size());
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertEquals(1, aliasMapEntry.size());
// re-add the node and test node removal for /parent/child
when(resourceResolver.getResource("/parent/child/jcr:content")).thenReturn(jcrContentResult);
when(result.getChild("jcr:content")).thenReturn(jcrContentResult);
method.invoke(mapEntries, "/parent/child/jcr:content");
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("child", aliasMapEntry.get("aliasJcrContent"));
assertEquals(2, aliasMapEntry.size());
method1.invoke(mapEntries, "/parent/child", new String[] { "sling:alias" }, true, false);
assertEquals(0, aliasMap.size());
aliasMapEntry = mapEntries.getAliasMap("/parent");
assertNull(aliasMapEntry);
}
@Test
public void test_doRemoveAlias4() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doRemoveAttributes", String.class, String[].class, boolean.class, boolean.class);
method1.setAccessible(true);
Field field0 = MapEntries.class.getDeclaredField("aliasMap");
field0.setAccessible(true);
Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
assertEquals(0, aliasMap.size());
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent");
when(result.getName()).thenReturn("parent");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
method.invoke(mapEntries, "/parent");
Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertEquals("parent", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
method1.invoke(mapEntries, "/parent", new String[] { "sling:alias" }, false, false);
aliasMapEntry = mapEntries.getAliasMap("/");
assertNull(aliasMapEntry);
assertEquals(0, aliasMap.size());
//re-add node and test nodeDeletion true
method.invoke(mapEntries, "/parent");
aliasMapEntry = mapEntries.getAliasMap("/");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("alias"));
assertEquals("parent", aliasMapEntry.get("alias"));
assertEquals(1, aliasMap.size());
when(resourceResolver.getResource("/parent")).thenReturn(null);
method1.invoke(mapEntries, "/parent", new String[] { "sling:alias" }, true, false);
aliasMapEntry = mapEntries.getAliasMap("/");
assertNull(aliasMapEntry);
assertEquals(0, aliasMap.size());
}
@Test
public void test_doRemoveAlias5() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
method.setAccessible(true);
Method method1 = MapEntries.class.getDeclaredMethod("doRemoveAttributes", String.class, String[].class, boolean.class, boolean.class);
method1.setAccessible(true);
Field field0 = MapEntries.class.getDeclaredField("aliasMap");
field0.setAccessible(true);
Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
assertEquals(0, aliasMap.size());
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/");
final Resource result = mock(Resource.class);
when(resourceResolver.getResource("/parent")).thenReturn(result);
when(result.getParent()).thenReturn(parent);
when(result.getPath()).thenReturn("/parent");
when(result.getName()).thenReturn("parent");
when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap());
//testing jcr:content node removal
final Resource jcrContentResult = mock(Resource.class);
when(resourceResolver.getResource("/parent/jcr:content")).thenReturn(jcrContentResult);
when(jcrContentResult.getParent()).thenReturn(result);
when(jcrContentResult.getPath()).thenReturn("/parent/jcr:content");
when(jcrContentResult.getName()).thenReturn("jcr:content");
when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContent"));
when(result.getChild("jcr:content")).thenReturn(jcrContentResult);
method.invoke(mapEntries, "/parent/jcr:content");
Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("parent", aliasMapEntry.get("aliasJcrContent"));
assertEquals(1, aliasMap.size());
method1.invoke(mapEntries, "/parent/jcr:content", new String[] { "sling:alias" }, false, false);
aliasMapEntry = mapEntries.getAliasMap("/");
assertNull(aliasMapEntry);
assertEquals(0, aliasMap.size());
//re-add node and test nodeDeletion true
method.invoke(mapEntries, "/parent/jcr:content");
aliasMapEntry = mapEntries.getAliasMap("/");
assertNotNull(aliasMapEntry);
assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
assertEquals("parent", aliasMapEntry.get("aliasJcrContent"));
assertEquals(1, aliasMap.size());
when(resourceResolver.getResource("/parent/jcr:content")).thenReturn(null);
when(result.getChild("jcr:content")).thenReturn(null);
method1.invoke(mapEntries, "/parent/jcr:content", new String[] { "sling:alias" }, true, false);
aliasMapEntry = mapEntries.getAliasMap("/");
assertNull(aliasMapEntry);
assertEquals(0, aliasMap.size());
}
@Test
public void test_isValidVanityPath() throws Exception {
Method method = MapEntries.class.getDeclaredMethod("isValidVanityPath", Resource.class);
method.setAccessible(true);
final Resource resource = mock(Resource.class);
when(resource.getPath()).thenReturn("/jcr:system/node");
assertFalse((Boolean)method.invoke(mapEntries, resource));
when(resource.getPath()).thenReturn("/justVanityPath");
assertFalse((Boolean)method.invoke(mapEntries, resource));
when(resource.adaptTo(ValueMap.class)).thenReturn(mock(ValueMap.class));
assertTrue((Boolean)method.invoke(mapEntries, resource));
}
}