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 2026/09/02 17:58:57 UTC

(sling-org-apache-sling-resourceresolver) 01/01: SLING-13327: add metrics related to observation events related to vanity paths and aliases - wip

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

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

commit d63b7cbc75334d455c825d5ae89113edc5ddae52
Author: Julian Reschke <re...@apache.org>
AuthorDate: Wed Sep 2 18:58:38 2026 +0100

    SLING-13327: add metrics related to observation events related to vanity paths and aliases - wip
---
 .../impl/mapping/AliasHandler.java                 |  3 +++
 .../resourceresolver/impl/mapping/MapEntries.java  | 29 ++++++++++++++++++----
 .../impl/mapping/AliasMapEntriesTest.java          | 18 ++++++++++++--
 3 files changed, 43 insertions(+), 7 deletions(-)

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 e4faf8fd..e6edeb5b 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
@@ -87,6 +87,7 @@ class AliasHandler {
     @NotNull
     Map<String, Map<String, Collection<String>>> aliasMapsMap = UNITIALIZED_MAP;
 
+    final AtomicLong aliasEvents;
     final AtomicLong aliasResourcesOnStartup;
     final AtomicLong detectedConflictingAliases;
     final AtomicLong detectedInvalidAliases;
@@ -105,6 +106,7 @@ class AliasHandler {
         this.sendChangeEvent = sendChangeEvent;
         this.drain = drain;
 
+        this.aliasEvents = new AtomicLong();
         this.aliasResourcesOnStartup = new AtomicLong(0);
         this.detectedConflictingAliases = new AtomicLong(0);
         this.detectedInvalidAliases = new AtomicLong(0);
@@ -539,6 +541,7 @@ class AliasHandler {
         } else {
             // we read the aliases from the resource given in the method call parameters
             String[] aliasArray = resource.getValueMap().get(ResourceResolverImpl.PROP_ALIAS, String[].class);
+
             if (aliasArray == null) {
                 return false;
             } else {
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 1784481b..b515b4d9 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
@@ -55,6 +55,7 @@ import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.api.resource.observation.ExternalResourceChangeListener;
 import org.apache.sling.api.resource.observation.ResourceChange;
 import org.apache.sling.api.resource.observation.ResourceChangeListener;
+import org.apache.sling.resourceresolver.impl.ResourceResolverImpl;
 import org.apache.sling.resourceresolver.impl.ResourceResolverMetrics;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
@@ -195,8 +196,19 @@ public class MapEntries implements MapEntriesHandler, ResourceChangeListener, Ex
 
             Resource resource = this.resolver != null ? resolver.getResource(ctx.path) : null;
             if (resource != null) {
-                boolean vanityPathAdded = ctx.forVanityPath && vph.doAddVanity(resource);
-                boolean aliasAdded = ctx.forAlias && ah.doAddAlias(resource);
+
+                boolean aliasAdded = false;
+                boolean vanityPathAdded = false;
+
+                if (ctx.forAlias) {
+                    if (resource.getValueMap().containsKey(ResourceResolverImpl.PROP_ALIAS)) {
+                        ah.aliasEvents.incrementAndGet();
+                    }
+                    aliasAdded = ah.doAddAlias(resource);
+                }
+                if (ctx.forVanityPath) {
+                    vanityPathAdded = ctx.forAlias && ah.doAddAlias(resource);
+                }
                 return vanityPathAdded || aliasAdded;
             } else {
                 return false;
@@ -215,12 +227,13 @@ public class MapEntries implements MapEntriesHandler, ResourceChangeListener, Ex
 
             Resource resource = this.resolver != null ? resolver.getResource(ctx.path) : null;
 
-            boolean isValidVanityPath = vph.isValidVanityPath(ctx.path);
-
             if (resource != null) {
 
+                boolean aliasChanged = false;
                 boolean vanityPathChanged = false;
 
+                boolean isValidVanityPath = vph.isValidVanityPath(ctx.path);
+
                 if (ctx.forVanityPath && isValidVanityPath) {
                     // we remove the old vanity path first
                     vanityPathChanged |= vph.doRemoveVanity(ctx.path);
@@ -234,7 +247,13 @@ public class MapEntries implements MapEntriesHandler, ResourceChangeListener, Ex
                     vanityPathChanged |= vph.doAddVanity(contentRsrc != null ? contentRsrc : resource);
                 }
 
-                boolean aliasChanged = ctx.forAlias && ah.doUpdateAlias(resource);
+                if (ctx.forAlias) {
+                    if (resource.getValueMap().containsKey(ResourceResolverImpl.PROP_ALIAS)) {
+                        ah.aliasEvents.incrementAndGet();
+                    }
+                    aliasChanged = ah.doUpdateAlias(resource);
+                }
+
                 return vanityPathChanged || aliasChanged;
             }
         } finally {
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 7fbb881f..6174aeaa 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
@@ -713,10 +713,14 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
         Resource parent = createMockedResource("/parent");
         Resource result = createMockedResource(parent, "child");
 
+        assertEquals(0, mapEntries.ah.aliasEvents.get());
+
         when(result.getValueMap()).thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS, "alias"));
 
         updateResource(mapEntries, "/parent/child", new AtomicBoolean());
 
+        assertEquals(1, mapEntries.ah.aliasEvents.get());
+
         Map<String, Collection<String>> aliasMapEntry = mapEntries.getAliasMap("/parent");
         assertNotNull(aliasMapEntry);
         assertTrue(aliasMapEntry.containsKey("child"));
@@ -727,14 +731,13 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
         when(result.getValueMap()).thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS, "aliasUpdated"));
 
         updateResource(mapEntries, "/parent/child", new AtomicBoolean());
+        assertEquals(1, aliasMap.size());
 
         aliasMapEntry = mapEntries.getAliasMap("/parent");
         assertNotNull(aliasMapEntry);
         assertTrue(aliasMapEntry.containsKey("child"));
         assertEquals(List.of("aliasUpdated"), aliasMapEntry.get("child"));
 
-        assertEquals(1, aliasMap.size());
-
         // testing jcr:content node update
         Resource jcrContentResult = createMockedResource(result, "jcr:content");
 
@@ -742,6 +745,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
                 .thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS, "aliasJcrContent"));
 
         updateResource(mapEntries, "/parent/child/jcr:content", new AtomicBoolean());
+        assertEquals(3, mapEntries.ah.aliasEvents.get());
 
         aliasMapEntry = mapEntries.getAliasMap("/parent");
         assertNotNull(aliasMapEntry);
@@ -754,6 +758,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
         when(jcrContentResult.getValueMap())
                 .thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS, "aliasJcrContentUpdated"));
         updateResource(mapEntries, "/parent/child/jcr:content", new AtomicBoolean());
+        assertEquals(4, mapEntries.ah.aliasEvents.get());
 
         aliasMapEntry = mapEntries.getAliasMap("/parent");
         assertNotNull(aliasMapEntry);
@@ -765,6 +770,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
 
         // re-update alias
         updateResource(mapEntries, "/parent/child", new AtomicBoolean());
+        assertEquals(5, mapEntries.ah.aliasEvents.get());
 
         aliasMapEntry = mapEntries.getAliasMap("/parent");
         assertNotNull(aliasMapEntry);
@@ -778,6 +784,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
         when(secondResult.getValueMap()).thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS, "alias2"));
 
         updateResource(mapEntries, "/parent/child2", new AtomicBoolean());
+        assertEquals(6, mapEntries.ah.aliasEvents.get());
         assertEquals(1, aliasMap.size());
 
         aliasMapEntry = mapEntries.getAliasMap("/parent");
@@ -787,6 +794,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
         when(jcrContentResult.getValueMap())
                 .thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS, "aliasJcrContentUpdated"));
         updateResource(mapEntries, "/parent/child/jcr:content", new AtomicBoolean());
+        assertEquals(7, mapEntries.ah.aliasEvents.get());
 
         aliasMapEntry = mapEntries.getAliasMap("/parent");
         assertNotNull(aliasMapEntry);
@@ -800,6 +808,7 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
         when(jcrContentResult.getValueMap())
                 .thenReturn(buildValueMap(ResourceResolverImpl.PROP_ALIAS, "aliasJcrContentUpdated"));
         updateResource(mapEntries, "/parent/child/jcr:content", new AtomicBoolean());
+        assertEquals(8, mapEntries.ah.aliasEvents.get());
 
         aliasMapEntry = mapEntries.getAliasMap("/parent");
         assertNotNull(aliasMapEntry);
@@ -1290,6 +1299,8 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
         ah.initializeAliases();
         assertFalse(ah.isReady());
 
+        assertEquals(0, ah.aliasEvents.get());
+
         // bg init will wait until we give green light - events only from here on, no stubbing
         mapEntries.onChange(List.of(new ResourceChange(ResourceChange.ChangeType.REMOVED, leaf1.getPath(), false)));
         mapEntries.onChange(List.of(new ResourceChange(ResourceChange.ChangeType.ADDED, leaf2.getPath(), false)));
@@ -1299,6 +1310,9 @@ public class AliasMapEntriesTest extends AbstractMappingMapEntriesTest {
 
         assertTrue(ah.isReady());
 
+        // REMOVED: no event, ADDED: one event
+        assertEquals(1, ah.aliasEvents.get());
+
         Map<String, Collection<String>> aliasMapEntry = mapEntries.getAliasMap(top);
         assertNotNull(aliasMapEntry);