This is an automated email from the ASF dual-hosted git repository. reschke pushed a commit to branch SLING-12879b in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
commit 98683ee2115c126142c8a8028d1829a6cdcc7ba8 Author: Julian Reschke <[email protected]> AuthorDate: Fri Aug 15 14:25:13 2025 +0100 SLING-12879: add wiring to handler and test class (wip) --- .../impl/CommonResourceResolverFactoryImpl.java | 6 ++++ .../impl/mapping/AliasHandler.java | 8 ++++- .../impl/mapping/MapConfigurationProvider.java | 4 ++- .../impl/mapping/AliasMapEntriesTest.java | 35 +++++++++++++++++++--- 4 files changed, 47 insertions(+), 6 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 935fe244..3428e8c6 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java @@ -397,6 +397,12 @@ public class CommonResourceResolverFactoryImpl implements MapConfigurationProvid return this.activator.getVanityPathConfigurer().isVanityPathCacheInitInBackground(); } + @Override + public boolean isAliasCacheInitInBackground() { + // wiring to config will be added later + return false; + } + /** * get's the ServiceTracker of the ResourceAccessSecurity service */ 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 6b0e8d53..f8f5e0f0 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 @@ -129,7 +129,13 @@ class AliasHandler { // optimization made in SLING-2521 if (this.factory.isOptimizeAliasResolutionEnabled()) { AliasInitializer ai = new AliasInitializer(); - ai.run(); + if (this.factory.isAliasCacheInitInBackground()) { + this.log.debug("bg init starting"); + Thread aiinit = new Thread(ai, "AliasInitializer"); + aiinit.start(); + } else { + ai.run(); + } } doUpdateConfiguration.run(); 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 b731aed6..aab6e86b 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 @@ -57,9 +57,11 @@ public interface MapConfigurationProvider extends ResourceResolverFactory { int getVanityBloomFilterMaxBytes(); + boolean hasVanityPathPrecedence(); + boolean isOptimizeAliasResolutionEnabled(); - boolean hasVanityPathPrecedence(); + boolean isAliasCacheInitInBackground(); Map<String, Object> getServiceUserAuthenticationInfo(final String subServiceName) throws LoginException; 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 4ec7eb39..743ec9f0 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 @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Matcher; @@ -63,6 +64,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -100,13 +102,16 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest { private final boolean isOptimizeAliasResolutionEnabled; - @Parameterized.Parameters(name = "isOptimizeAliasResolutionEnabled={0}") + private final boolean isAliasCacheInitInBackground; + + @Parameterized.Parameters(name = "isOptimizeAliasResolutionEnabled={0},isAliasCacheInitInBackground{1}") public static Collection<Object[]> data() { - return List.of(new Object[][] {{false}, {true}}); + return List.of(new Object[][] {{false, false}, {true, false}, {true, true}}); } - public AliasMapEntriesTest(boolean isOptimizeAliasResolutionEnabled) { + public AliasMapEntriesTest(boolean isOptimizeAliasResolutionEnabled, boolean isAliasCacheInitInBackground) { this.isOptimizeAliasResolutionEnabled = isOptimizeAliasResolutionEnabled; + this.isAliasCacheInitInBackground = isAliasCacheInitInBackground; } private AutoCloseable mockCloser; @@ -124,6 +129,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest { when(resourceResolverFactory.getObservationPaths()).thenReturn(new Path[] {new Path("/")}); when(resourceResolverFactory.getServiceResourceResolver(any(Map.class))).thenReturn(resourceResolver); when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(isOptimizeAliasResolutionEnabled); + when(resourceResolverFactory.isAliasCacheInitInBackground()).thenReturn(isAliasCacheInitInBackground); when(resourceResolverFactory.getMapRoot()).thenReturn(MapEntries.DEFAULT_MAP_ROOT); when(resourceResolver.findResources(anyString(), eq("sql"))).thenReturn(Collections.emptyIterator()); @@ -134,6 +140,8 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest { mapEntries = new MapEntries( resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider, metrics); + waitForBackgroundInitReady(); + final Field aliasMapField = AliasHandler.class.getDeclaredField("aliasMapsMap"); aliasMapField.setAccessible(true); this.aliasMap = (Map<String, Map<String, String>>) aliasMapField.get(mapEntries.ah); @@ -154,6 +162,22 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest { mockCloser.close(); } + private void waitForBackgroundInitReady() { + if (resourceResolverFactory.isAliasCacheInitInBackground()) { + long until = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10); + while (!mapEntries.ah.usesCache()) { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + // ignore + } + if (System.currentTimeMillis() > until) { + fail("background init did not finish in time"); + } + } + } + } + private static void addResource(MapEntries mapEntries, String path, AtomicBoolean bool) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { Method method = MapEntries.class.getDeclaredMethod("addResource", String.class, AtomicBoolean.class); @@ -242,6 +266,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest { prepareMapEntriesForAlias(false, false, false, true, "foo", "bar"); mapEntries.ah.initializeAliases(); + waitForBackgroundInitReady(); assertTrue(mapEntries.ah.usesCache()); } @@ -283,6 +308,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest { for (String invalidAlias : invalidAliases) { prepareMapEntriesForAlias(false, false, invalidAlias); mapEntries.ah.initializeAliases(); + waitForBackgroundInitReady(); Map<String, Collection<String>> aliasMap = mapEntries.getAliasMap("/parent"); assertEquals(Collections.emptyMap(), aliasMap); } @@ -458,7 +484,8 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest { return Collections.emptyIterator(); }); - new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider, metrics); + mapEntries.ah.initializeAliases(); + waitForBackgroundInitReady(); assertTrue("seems no alias query was made", !queryMade.isEmpty()); String match1 = "(isdescendantnode('/a') OR isdescendantnode('/''b'''))";
