You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by re...@apache.org on 2025/08/15 13:25:36 UTC

(sling-org-apache-sling-resourceresolver) branch SLING-12879b created (now 98683ee2)

This is an automated email from the ASF dual-hosted git repository.

reschke pushed a change to branch SLING-12879b
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git


      at 98683ee2 SLING-12879: add wiring to handler and test class (wip)

This branch includes the following new commits:

     new 98683ee2 SLING-12879: add wiring to handler and test class (wip)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(sling-org-apache-sling-resourceresolver) 01/01: SLING-12879: add wiring to handler and test class (wip)

Posted by re...@apache.org.
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 <ju...@gmx.de>
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'''))";