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 <[email protected]>
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);
 

Reply via email to