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'''))";

Reply via email to