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