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