This is an automated email from the ASF dual-hosted git repository.
rombert 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 c11a78e Revert "SLING-7544 - Make optimized alias lookup non-blocking"
c11a78e is described below
commit c11a78e155e3eddc963423e199fbbd8566d6a9b7
Author: Robert Munteanu <[email protected]>
AuthorDate: Tue Jul 31 14:18:34 2018 +0200
Revert "SLING-7544 - Make optimized alias lookup non-blocking"
This reverts commit 0f7d6668cd746d7fff9e08df54f3fd1f4f2846b1.
This commit introduces a race condition when new aliases get
added while the intialization was still running. Reverting
pending a better solution.
---
.../impl/CommonResourceResolverFactoryImpl.java | 10 --
.../impl/ResourceResolverFactoryActivator.java | 4 -
.../impl/ResourceResolverFactoryConfig.java | 6 -
.../impl/ResourceResolverImpl.java | 4 +-
.../impl/mapping/MapConfigurationProvider.java | 4 -
.../resourceresolver/impl/mapping/MapEntries.java | 102 ++----------
.../impl/mapping/MapEntriesHandler.java | 7 -
.../impl/MockedResourceResolverImplTest.java | 6 -
.../impl/mapping/MapEntriesTest.java | 184 +--------------------
9 files changed, 17 insertions(+), 310 deletions(-)
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
b/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
index 63d6236..11c6b24 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
@@ -555,14 +555,4 @@ public class CommonResourceResolverFactoryImpl implements
ResourceResolverFactor
}
}
}
-
- @Override
- public boolean isAliasMapInitialized() {
- return mapEntries.isAliasMapInitialized();
- }
-
- @Override
- public boolean isForceNoAliasTraversal() {
- return this.activator.isForceNoAliasTraversal();
- }
}
\ No newline at end of file
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
index ced1fb8..5984363 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
@@ -197,10 +197,6 @@ public class ResourceResolverFactoryActivator {
return this.config.resource_resolver_optimize_alias_resolution();
}
- public boolean isForceNoAliasTraversal() {
- return this.config.force_no_alias_traversal();
- }
-
public boolean isLogUnclosedResourceResolvers() {
return this.config.resource_resolver_log_unclosed();
}
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java
index 2666540..a0aa53f 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java
@@ -149,12 +149,6 @@ public @interface ResourceResolverFactoryConfig {
" and on the alias update time if the number of aliases
is huge (over 10000).")
boolean resource_resolver_optimize_alias_resolution() default true;
-
- @AttributeDefinition(name = "Force no traversal for optimized alias
lookup",
- description = "When enabled the lookup of alias map for optimized
resolution enforces retry until an index is present"+
- "and does not traverse repository.")
- boolean force_no_alias_traversal() default true;
-
@AttributeDefinition(name = "Allowed Vanity Path Location",
description ="This setting can contain a list of path prefixes, e.g.
/libs/, /content/. If " +
"such a list is configured, only vanity paths from
resources starting with this prefix " +
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
index 02b3be7..fca270e 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
@@ -476,7 +476,7 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
while (path != null) {
String alias = null;
if (current != null && !path.endsWith(JCR_CONTENT_LEAF)) {
- if (factory.isOptimizeAliasResolutionEnabled() &&
factory.isAliasMapInitialized()) {
+ if (factory.isOptimizeAliasResolutionEnabled()) {
logger.debug("map: Optimize Alias Resolution is
Enabled");
String parentPath = ResourceUtil.getParent(path);
if (parentPath != null) {
@@ -989,7 +989,7 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
// we do not have a child with the exact name, so we look for
// a child, whose alias matches the childName
- if (factory.isOptimizeAliasResolutionEnabled() &&
factory.isAliasMapInitialized()){
+ if (factory.isOptimizeAliasResolutionEnabled()){
logger.debug("getChildInternal: Optimize Alias Resolution is
Enabled");
//optimization made in SLING-2521
final Map<String, String> aliases =
factory.getMapEntries().getAliasMap(parent.getPath());
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
index 82c5827..aeb437c 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
@@ -54,8 +54,6 @@ public interface MapConfigurationProvider extends
ResourceResolverFactory {
boolean isOptimizeAliasResolutionEnabled();
- boolean isAliasMapInitialized();
-
boolean hasVanityPathPrecedence();
Map<String, Object> getServiceUserAuthenticationInfo(final String
subServiceName) throws LoginException;
@@ -80,6 +78,4 @@ public interface MapConfigurationProvider extends
ResourceResolverFactory {
* If <code>null</code> is returned, all paths are allowed.
*/
List<VanityPathConfig> getVanityPathConfig();
-
- boolean isForceNoAliasTraversal();
}
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
index cfa261a..089c3bf 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
@@ -25,7 +25,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
-import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -53,9 +52,7 @@ import java.util.concurrent.locks.ReentrantLock;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.api.SlingConstants;
-import org.apache.sling.api.SlingException;
import org.apache.sling.api.resource.LoginException;
-import org.apache.sling.api.resource.QuerySyntaxException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
@@ -78,11 +75,9 @@ import org.slf4j.LoggerFactory;
public class MapEntries implements
MapEntriesHandler,
ResourceChangeListener,
- ExternalResourceChangeListener,
- AutoCloseable {
+ ExternalResourceChangeListener {
private static final String JCR_CONTENT = "jcr:content";
- private static final int TRAVERSAL_RETRY_INTERVAL = 30000;
private static final String JCR_CONTENT_PREFIX = "jcr:content/";
@@ -113,10 +108,6 @@ public class MapEntries implements
private static final String JCR_SYSTEM_PREFIX = "/jcr:system/";
- final static String ALIAS_QUERY_DEFAULT = "SELECT sling:alias FROM nt:base
WHERE sling:alias IS NOT NULL";
-
- final static String ALIAS_QUERY_NO_TRAVERSAL = ALIAS_QUERY_DEFAULT + "
option(traversal fail)";
-
static final String ANY_SCHEME_HOST = "[^/]+/[^/]+";
/** default log */
@@ -136,7 +127,7 @@ public class MapEntries implements
private Map <String,List <String>> vanityTargets;
- private volatile Map<String, Map<String, String>> aliasMap;
+ private Map<String, Map<String, String>> aliasMap;
private final ReentrantLock initializing = new ReentrantLock();
@@ -150,8 +141,6 @@ public class MapEntries implements
private boolean updateBloomFilterFile = false;
- private Thread aliasTraversal = null;
-
@SuppressWarnings({ "unchecked" })
public MapEntries(final MapConfigurationProvider factory, final
BundleContext bundleContext, final EventAdmin eventAdmin)
throws LoginException, IOException {
@@ -163,7 +152,7 @@ public class MapEntries implements
this.resolveMapsMap = Collections.singletonMap(GLOBAL_LIST_KEY,
(List<MapEntry>)Collections.EMPTY_LIST);
this.mapMaps = Collections.<MapEntry> emptyList();
this.vanityTargets = Collections.<String,List <String>>emptyMap();
- this.aliasMap = Collections.emptyMap();
+ this.aliasMap = Collections.<String, Map<String, String>>emptyMap();
doInit();
@@ -200,15 +189,10 @@ public class MapEntries implements
final Map<String, List<MapEntry>> newResolveMapsMap = new
ConcurrentHashMap<>();
- aliasMap = Collections.emptyMap();
//optimization made in SLING-2521
if (this.factory.isOptimizeAliasResolutionEnabled()) {
- aliasTraversal = new Thread(new Runnable(){
- public void run() {
- aliasMap = loadAliases(resolver);
- }
- });
- aliasTraversal.start();
+ final Map<String, Map<String, String>> aliasMap =
this.loadAliases(resolver);
+ this.aliasMap = aliasMap;
}
this.resolveMapsMap = newResolveMapsMap;
@@ -278,10 +262,6 @@ public class MapEntries implements
}
- protected int getTraversalRetryInterval(){
- return TRAVERSAL_RETRY_INTERVAL;
- }
-
private boolean addResource(final String path, final AtomicBoolean
resolverRefreshed) {
this.initializing.lock();
@@ -654,16 +634,6 @@ public class MapEntries implements
return aliasMap.get(parentPath);
}
- @Override
- public boolean isAliasMapInitialized() {
- // since loading the aliases is equivalent to replacing the
empty map
- // with another instance, and the reference is volatile, it's
safe
- // to equate initialization being done with the empty map being
replaced
- // note that it's not provably safe to check the map size, as
we might
- // enter the scenario where there are no aliases
- return aliasMap != Collections.<String,Map<String,String>>
emptyMap();
- }
-
/**
* get the MapEnty containing all the nodes having a specific vanityPath
*/
@@ -1057,59 +1027,16 @@ public class MapEntries implements
*/
private Map<String, Map<String, String>> loadAliases(final
ResourceResolver resolver) {
final Map<String, Map<String, String>> map = new ConcurrentHashMap<>();
- String queryString = this.factory.isForceNoAliasTraversal() ?
ALIAS_QUERY_NO_TRAVERSAL : ALIAS_QUERY_DEFAULT;
- while (true){
- try {
- final Iterator<Resource> i =
resolver.findResources(queryString, "sql");
- while (i.hasNext()) {
- final Resource resource = i.next();
- loadAlias(resource, map);
- }
- break;
- } catch (SlingException e) {
- Throwable cause = unwrapThrowable(e);
- if (cause instanceof IllegalArgumentException &&
ALIAS_QUERY_NO_TRAVERSAL.equals(queryString)) {
- log.debug(
- "Expected index not available
yet - will retry", e);
- try {
-
TimeUnit.MILLISECONDS.sleep(getTraversalRetryInterval());
- } catch (InterruptedException ex) {
- log.warn("Interrupted while
sleeping", ex);
- }
- } else if (cause instanceof ParseException) {
- if
(ALIAS_QUERY_NO_TRAVERSAL.equals(queryString)) {
- log.warn("Traversal fail option
set but query not accepted by queryengine, falling back to allowing traversal
as queryengine might not support option", e);
- queryString =
ALIAS_QUERY_DEFAULT;
- } else {
- log.error("Queryengine couldn't
parse query - interrupting loading of aliasmap",e);
- break;
- }
- try {
-
TimeUnit.MILLISECONDS.sleep(getTraversalRetryInterval());
- } catch (InterruptedException ex) {
- log.warn("Interrupted while
sleeping", ex);
- }
-
-
- } else {
- log.error("QueryEngine not able to
process query {} ", queryString, e);
- break;
- }
- }
- }
+ final String queryString = "SELECT sling:alias FROM nt:base WHERE
sling:alias IS NOT NULL";
+ final Iterator<Resource> i = resolver.findResources(queryString,
"sql");
+ while (i.hasNext()) {
+ final Resource resource = i.next();
+ loadAlias(resource, map);
+ }
return map;
}
/**
- * Extract root cause of exception
- * @param e {@code Throwable} to be checked
- * @return Root {@code Throwable}
- */
- private Throwable unwrapThrowable(Throwable e) {
- return e.getCause() == null ? e : unwrapThrowable(e.getCause());
- }
-
- /**
* Load alias given a resource
*/
private boolean loadAlias(final Resource resource, Map<String, Map<String,
String>> map) {
@@ -1625,11 +1552,4 @@ public class MapEntries implements
}
}
- @Override
- public void close() throws Exception {
- if (aliasTraversal != null) {
- aliasTraversal.interrupt();
- }
- }
-
}
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
index e445927..df19e5d 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
@@ -51,11 +51,6 @@ public interface MapEntriesHandler {
public Map<String, String> getAliasMap(String parentPath) {
return Collections.emptyMap();
}
-
- @Override
- public boolean isAliasMapInitialized() {
- return false;
- }
};
Map<String, String> getAliasMap(String parentPath);
@@ -72,6 +67,4 @@ public interface MapEntriesHandler {
* This is for the web console plugin
*/
List<MapEntry> getResolveMaps();
-
- boolean isAliasMapInitialized();
}
diff --git
a/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
b/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
index 330b103..be2dfd5 100644
---
a/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
+++
b/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
@@ -235,12 +235,6 @@ public class MockedResourceResolverImplTest {
}
@Override
- public boolean force_no_alias_traversal() {
- return true;
- }
-
-
- @Override
public String[] resource_resolver_mapping() {
return new String[] { "/:/",
"/content/:/", "/system/docroot/:/",
"/content.html-/$" };
diff --git
a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
index 490196b..8864fb8 100644
---
a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
+++
b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
@@ -25,7 +25,6 @@ import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -33,7 +32,6 @@ import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
-import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -46,7 +44,6 @@ import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@@ -56,7 +53,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
-import org.apache.sling.api.SlingException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
@@ -70,7 +66,6 @@ import
org.apache.sling.resourceresolver.impl.mapping.MapConfigurationProvider.V
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -129,7 +124,6 @@ public class MapEntriesTest {
when(resourceResolverFactory.isVanityPathEnabled()).thenReturn(true);
when(resourceResolverFactory.getVanityPathConfig()).thenReturn(configs);
when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(true);
-
when(resourceResolverFactory.isForceNoAliasTraversal()).thenReturn(true);
when(resourceResolverFactory.getObservationPaths()).thenReturn(new
Path[] {new Path("/")});
when(resourceResolverFactory.getMapRoot()).thenReturn(MapEntries.DEFAULT_MAP_ROOT);
when(resourceResolverFactory.getMaxCachedVanityPathEntries()).thenReturn(-1L);
@@ -150,8 +144,8 @@ public class MapEntriesTest {
}
- @Test(timeout = 1000)
- public void test_simple_alias_support() throws InterruptedException {
+ @Test
+ public void test_simple_alias_support() {
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
@@ -175,19 +169,14 @@ public class MapEntriesTest {
mapEntries.doInit();
- // looping check for completion of aliasMap as it is calculated
asynchronously
- while (!mapEntries.isAliasMapInitialized()) {
- Thread.sleep(10);
- }
-
Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMap);
assertTrue(aliasMap.containsKey("alias"));
assertEquals("child", aliasMap.get("alias"));
}
- @Test(timeout = 1000)
- public void test_that_duplicate_alias_doesnt_replace_first_alias() throws
InterruptedException {
+ @Test
+ public void test_that_duplicate_alias_doesnt_replace_first_alias() {
Resource parent = mock(Resource.class);
when(parent.getPath()).thenReturn("/parent");
@@ -217,11 +206,6 @@ public class MapEntriesTest {
mapEntries.doInit();
- // looping check for completion of aliasMap as it is calculated
asynchronously
- while (!mapEntries.isAliasMapInitialized()) {
- Thread.sleep(10);
- }
-
Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
assertNotNull(aliasMap);
assertTrue(aliasMap.containsKey("alias"));
@@ -1651,166 +1635,6 @@ public class MapEntriesTest {
assertNull(aliasMapEntry);
}
- @Test(timeout = 1000)
- public void test_delayed_optimized_aliaslookup() throws Exception {
- final Method addResource =
MapEntries.class.getDeclaredMethod("addResource", String.class,
AtomicBoolean.class);
- addResource.setAccessible(true);
-
- mapEntries = new MapEntries(resourceResolverFactory, bundleContext,
eventAdmin);
-
- 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.getValueMap()).thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS,
"alias"));
-
- addResource.invoke(mapEntries, "/parent/child", new AtomicBoolean());
-
- final CountDownLatch latch = new CountDownLatch(1);
-
- when(resourceResolver.findResources(anyString(),
eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() {
-
- @Override
- public Iterator<Resource> answer(InvocationOnMock invocation)
throws Throwable {
- latch.await();
- if
(invocation.getArguments()[0].toString().contains(ResourceResolverImpl.PROP_ALIAS))
{
- return Arrays.asList(result, result).iterator();
- } else {
- return Collections.<Resource> emptySet().iterator();
- }
- }
- });
-
- mapEntries.doInit();
-
- assertFalse(mapEntries.isAliasMapInitialized());
- latch.countDown();
- // looping check for completion of aliasMap as it is calculated
asynchronously
- while (!mapEntries.isAliasMapInitialized()) {
- Thread.sleep(10);
- }
- assertTrue(mapEntries.isAliasMapInitialized());
- Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
- assertEquals(1, aliasMap.size());
- assertNotNull(aliasMap);
- assertEquals(1, aliasMap.size());
- assertEquals("child", aliasMap.get("alias"));
- }
-
- @Test(timeout = 1000)
- public void test_delayed_optimized_aliaslookup_traversalfail() throws
Exception {
- final Method addResource =
MapEntries.class.getDeclaredMethod("addResource", String.class,
AtomicBoolean.class);
- addResource.setAccessible(true);
-
- mapEntries = Mockito.spy(new MapEntries(resourceResolverFactory,
bundleContext, eventAdmin));
- doReturn(100).when(mapEntries).getTraversalRetryInterval();
-
- 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.getValueMap()).thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS,
"alias"));
-
- addResource.invoke(mapEntries, "/parent/child", new AtomicBoolean());
-
- final CountDownLatch latch = new CountDownLatch(2);
-
- ArgumentCaptor<String> queryCaptor =
ArgumentCaptor.forClass(String.class);
- when(resourceResolver.findResources(queryCaptor.capture(),
eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() {
-
- @Override
- public Iterator<Resource> answer(InvocationOnMock invocation)
throws Throwable {
- if (latch.getCount() > 0){
- latch.countDown();
- throw new SlingException("Query couldn't be satified
due to ", new IllegalArgumentException("Traversal") );
- } else {
- if
(invocation.getArguments()[0].toString().contains(ResourceResolverImpl.PROP_ALIAS))
{
- return Arrays.asList(result, result).iterator();
- } else {
- return Collections.<Resource>
emptySet().iterator();
- }
- }
- }
- });
-
- mapEntries.doInit();
-
- assertFalse(mapEntries.isAliasMapInitialized());
- latch.countDown();
- // looping check for completion of aliasMap as it is calculated
asynchronously
- while (!mapEntries.isAliasMapInitialized()) {
- Thread.sleep(10);
- }
- assertTrue(queryCaptor.getValue().contains("traversal fail"));
- assertTrue(mapEntries.isAliasMapInitialized());
- Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
- assertEquals(1, aliasMap.size());
- assertNotNull(aliasMap);
- assertEquals(1, aliasMap.size());
- assertEquals("child", aliasMap.get("alias"));
- }
-
- @Test
- public void test_aliaslookup_traversalfail_not_supported() throws
Exception {
- final Method addResource =
MapEntries.class.getDeclaredMethod("addResource", String.class,
AtomicBoolean.class);
- addResource.setAccessible(true);
-
- mapEntries = Mockito.spy(new MapEntries(resourceResolverFactory,
bundleContext, eventAdmin));
- doReturn(100).when(mapEntries).getTraversalRetryInterval();
-
- 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.getValueMap()).thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS,
"alias"));
-
- addResource.invoke(mapEntries, "/parent/child", new AtomicBoolean());
-
- ArgumentCaptor<String> queryCaptor =
ArgumentCaptor.forClass(String.class);
- when(resourceResolver.findResources(queryCaptor.capture(),
eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() {
-
- @Override
- public Iterator<Resource> answer(InvocationOnMock invocation)
throws Throwable {
- if (invocation.getArguments()[0].toString().contains("traversal
fail")){
- throw new SlingException("Query couldn't be satified
due to ", new ParseException("Options not known", 0) );
- } else {
- if
(invocation.getArguments()[0].toString().contains(ResourceResolverImpl.PROP_ALIAS))
{
- return Arrays.asList(result, result).iterator();
- } else {
- return Collections.<Resource>
emptySet().iterator();
- }
- }
- }
- });
-
- mapEntries.doInit();
-
- assertFalse(mapEntries.isAliasMapInitialized());
- // looping check for completion of aliasMap as it is calculated
asynchronously
- while (!mapEntries.isAliasMapInitialized()) {
- Thread.sleep(10);
- }
- assertFalse(queryCaptor.getValue().contains("traversal fail"));
- assertTrue(mapEntries.isAliasMapInitialized());
- Map<String, String> aliasMap = mapEntries.getAliasMap("/parent");
- assertEquals(1, aliasMap.size());
- assertNotNull(aliasMap);
- assertEquals(1, aliasMap.size());
- assertEquals("child", aliasMap.get("alias"));
- }
-
@Test
public void test_isValidVanityPath() throws Exception {
Method method =
MapEntries.class.getDeclaredMethod("isValidVanityPath", String.class);