You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2025/05/30 15:24:12 UTC
(sling-org-apache-sling-jcr-resource) branch feature/expose-type-via-valuemap created (now 4fd8ebd)
This is an automated email from the ASF dual-hosted git repository.
kwin pushed a change to branch feature/expose-type-via-valuemap
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-resource.git
at 4fd8ebd SLING-12781 Expose resource type via ValueMap
This branch includes the following new commits:
new 4fd8ebd SLING-12781 Expose resource type via ValueMap
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-jcr-resource) 01/01: SLING-12781 Expose resource type via ValueMap
Posted by kw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kwin pushed a commit to branch feature/expose-type-via-valuemap
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-resource.git
commit 4fd8ebdc31f7a35f32fa4a35978a42bff93a4469
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Fri May 30 17:24:04 2025 +0200
SLING-12781 Expose resource type via ValueMap
---
.../sling/jcr/resource/internal/JcrValueMap.java | 6 +++++
.../internal/helper/jcr/JcrItemResource.java | 28 ----------------------
.../helper/jcr/JcrItemResourceFactory.java | 2 +-
.../internal/helper/jcr/JcrNodeResource.java | 5 ++--
.../internal/helper/jcr/JcrPropertyResource.java | 9 +++++--
.../helper/jcr/JcrItemResourceTestBase.java | 8 +++++++
.../internal/helper/jcr/JcrNodeResourceTest.java | 7 +-----
.../helper/jcr/JcrPropertyResourceTest.java | 2 +-
8 files changed, 27 insertions(+), 40 deletions(-)
diff --git a/src/main/java/org/apache/sling/jcr/resource/internal/JcrValueMap.java b/src/main/java/org/apache/sling/jcr/resource/internal/JcrValueMap.java
index 1b6ae65..de55181 100644
--- a/src/main/java/org/apache/sling/jcr/resource/internal/JcrValueMap.java
+++ b/src/main/java/org/apache/sling/jcr/resource/internal/JcrValueMap.java
@@ -36,6 +36,7 @@ import org.apache.jackrabbit.util.ISO9075;
import org.apache.jackrabbit.util.Text;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.jcr.resource.api.JcrResourceConstants;
import org.apache.sling.jcr.resource.internal.helper.JcrPropertyMapCacheEntry;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -297,6 +298,11 @@ public class JcrValueMap implements ValueMap {
try {
final String key = escapeKeyName(name);
Property property = NodeUtil.getPropertyOrNull(node,key);
+ if (property == null && name.equals(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY)) {
+ // special handling for the resource type property which according to the API must always be exposed via property sling:resourceType
+ // use value of jcr:primaryType if sling:resourceType is not set
+ property = NodeUtil.getPropertyOrNull(node, Property.JCR_PRIMARY_TYPE);
+ }
if (property != null) {
return cacheProperty(property);
}
diff --git a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java
index d81cd8e..020fa95 100644
--- a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java
+++ b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResource.java
@@ -111,34 +111,6 @@ abstract class JcrItemResource<T extends Item> // this should be package private
return item;
}
- /**
- * Compute the resource type of the given node, using either the
- * SLING_RESOURCE_TYPE_PROPERTY, or the node's primary node type, if the
- * property is not set
- */
- @NotNull
- protected String getResourceTypeForNode(final @NotNull Node node) throws RepositoryException {
- String result = null;
-
- Property property = NodeUtil.getPropertyOrNull(node, JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY);
- if (property != null) {
- result = property.getString();
- }
-
- if (result == null || result.length() == 0) {
- // Do not load the relatively expensive NodeType object unless necessary. See OAK-2441 for the reason why it
- // cannot only use getProperty here.
- property = NodeUtil.getPropertyOrNull(node, Property.JCR_PRIMARY_TYPE);
- if (property != null) {
- result = property.getString();
- } else {
- result = node.getPrimaryNodeType().getName();
- }
- }
-
- return result;
- }
-
public static long getContentLength(final @NotNull Property property) throws RepositoryException {
if (property.isMultiple()) {
return -1;
diff --git a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResourceFactory.java b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResourceFactory.java
index 6bd3806..3492851 100644
--- a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResourceFactory.java
+++ b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResourceFactory.java
@@ -100,7 +100,7 @@ public class JcrItemResourceFactory {
}
} else {
log.debug("createResource: Found JCR Property Resource at path '{}'", resourcePath);
- resource = new JcrPropertyResource(resourceResolver, resourcePath, version, (Property) item);
+ resource = new JcrPropertyResource(resourceResolver, resourcePath, version, (Property) item, helper);
}
resource.getResourceMetadata().setParameterMap(parameters);
return resource;
diff --git a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java
index 57b58b4..8aa13b4 100644
--- a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java
+++ b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResource.java
@@ -93,8 +93,9 @@ class JcrNodeResource extends JcrItemResource<Node> { // this should be package
public @NotNull String getResourceType() {
if (this.resourceType == null) {
try {
- this.resourceType = getResourceTypeForNode(getNode());
- } catch (final RepositoryException e) {
+ this.resourceType = new JcrValueMap(getNode(), this.helper)
+ .get(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY, String.class);
+ } catch (final IllegalArgumentException e) {
LOGGER.error("Unable to get resource type for node " + getNode(), e);
this.resourceType = "<unknown resource type>";
}
diff --git a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java
index a4ec14b..6bc8cd2 100644
--- a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java
+++ b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResource.java
@@ -36,6 +36,9 @@ import org.apache.sling.adapter.annotations.Adapter;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceMetadata;
import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.jcr.resource.api.JcrResourceConstants;
+import org.apache.sling.jcr.resource.internal.HelperData;
+import org.apache.sling.jcr.resource.internal.JcrValueMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
@@ -56,9 +59,11 @@ class JcrPropertyResource extends JcrItemResource<Property> { // this should be
public JcrPropertyResource(final @NotNull ResourceResolver resourceResolver,
final @NotNull String path,
final @Nullable String version,
- final @NotNull Property property) throws RepositoryException {
+ final @NotNull Property property,
+ final @NotNull HelperData helper) throws RepositoryException {
super(resourceResolver, path, version, property, new ResourceMetadata());
- this.resourceType = getResourceTypeForNode(property.getParent())
+ this.resourceType = new JcrValueMap(property.getNode(), helper)
+ .get(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY, String.class)
+ "/" + property.getName();
if (PropertyType.BINARY != getProperty().getType()) {
this.getResourceMetadata().setContentType("text/plain");
diff --git a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResourceTestBase.java b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResourceTestBase.java
index f6c0392..e1d5b8e 100644
--- a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResourceTestBase.java
+++ b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrItemResourceTestBase.java
@@ -20,12 +20,16 @@ package org.apache.sling.jcr.resource.internal.helper.jcr;
import java.io.IOException;
import java.io.InputStream;
+import java.util.concurrent.atomic.AtomicReference;
import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;
import org.apache.sling.api.SlingConstants;
+import org.apache.sling.api.resource.external.URIProvider;
+import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
import org.apache.sling.jcr.resource.api.JcrResourceConstants;
+import org.apache.sling.jcr.resource.internal.HelperData;
public abstract class JcrItemResourceTestBase extends SlingRepositoryTestBase {
@@ -90,4 +94,8 @@ public abstract class JcrItemResourceTestBase extends SlingRepositoryTestBase {
}
}
}
+
+ public static HelperData getHelperData() {
+ return new HelperData(new AtomicReference<>(), new AtomicReference<>());
+ }
}
diff --git a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceTest.java b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceTest.java
index 4b870af..910286d 100644
--- a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceTest.java
+++ b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrNodeResourceTest.java
@@ -25,7 +25,6 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
@@ -37,14 +36,9 @@ import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceMetadata;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.jcr.resource.api.JcrResourceConstants;
-import org.apache.sling.jcr.resource.internal.HelperData;
public class JcrNodeResourceTest extends JcrItemResourceTestBase {
- private HelperData getHelperData() {
- return new HelperData(new AtomicReference<>(), new AtomicReference<>());
- }
-
public void testLinkedFile() throws Exception {
String fileName = "file";
String linkedFileName = "linkedFile";
@@ -140,6 +134,7 @@ public class JcrNodeResourceTest extends JcrItemResourceTestBase {
JcrNodeResource jnr = new JcrNodeResource(null, node.getPath(), null, node, getHelperData());
assertEquals(JcrConstants.NT_UNSTRUCTURED, jnr.getResourceType());
+ assertEquals(JcrConstants.NT_UNSTRUCTURED, jnr.getValueMap().get(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY, String.class));
String typeName = "some/resource/type";
node.setProperty(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY, typeName);
diff --git a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResourceTest.java b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResourceTest.java
index c004b88..0bcf18a 100644
--- a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResourceTest.java
+++ b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrPropertyResourceTest.java
@@ -77,7 +77,7 @@ public class JcrPropertyResourceTest {
allowing(property).getString();
will(returnValue(stringValue));
}});
- final JcrPropertyResource propResource = new JcrPropertyResource(resolver, "/path/to/string-property", null, property);
+ final JcrPropertyResource propResource = new JcrPropertyResource(resolver, "/path/to/string-property", null, property, JcrItemResourceTestBase.getHelperData());
assertEquals("Byte length of " + stringValue, stringByteLength, propResource.getResourceMetadata().getContentLength());
}
}