SLING-11794 - Adding a new method to get the properties as an adapted type
SLING-11794 - Adding a new method to get the properties as an adapted type
diff --git a/src/main/java/org/apache/sling/resource/collection/ResourceCollection.java b/src/main/java/org/apache/sling/resource/collection/ResourceCollection.java
index de88eb0..02e8e96 100755
--- a/src/main/java/org/apache/sling/resource/collection/ResourceCollection.java
+++ b/src/main/java/org/apache/sling/resource/collection/ResourceCollection.java
@@ -24,6 +24,7 @@
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ValueMap;
import org.osgi.annotation.versioning.ProviderType;
/**
@@ -67,7 +68,15 @@
/**
* Returns additional properties for a particular resource in Collection entry.
*
- * @return properties of the Collection entry as <code>ModifiableValueMap</code>, returns null if entry found.
+ * @return properties of the Collection entry as a ValueMap which will not be null
+ */
+ ValueMap getValueMap(Resource resource);
+
+ /**
+ * Returns additional properties for a particular resource in Collection entry.
+ *
+ * @return properties of the Collection entry as <code>ModifiableValueMap</code>, returns null if no entry found
+ * or the entry cannot be adapted to a ModifiableValueMap
*/
ModifiableValueMap getProperties(Resource resource);
diff --git a/src/main/java/org/apache/sling/resource/collection/impl/ResourceCollectionImpl.java b/src/main/java/org/apache/sling/resource/collection/impl/ResourceCollectionImpl.java
index 12cb05a..3a92dca 100755
--- a/src/main/java/org/apache/sling/resource/collection/impl/ResourceCollectionImpl.java
+++ b/src/main/java/org/apache/sling/resource/collection/impl/ResourceCollectionImpl.java
@@ -25,6 +25,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.sling.api.SlingConstants;
@@ -34,7 +35,7 @@
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.resource.ValueMap;
-
+import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.apache.sling.resource.collection.ResourceCollection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -293,19 +294,28 @@
vm.put(ResourceCollectionConstants.REFERENCES_PROP, order);
}
- @Override
- public ModifiableValueMap getProperties(Resource resource) {
- Iterator<Resource> entries = membersResource.listChildren();
+ private <T> Optional<T> getPropertiesAs(Resource resource, Class<T> type) {
+ Iterator<Resource> entries = membersResource.listChildren();
while (entries.hasNext()) {
- Resource entry = entries.next();
- String path = ResourceUtil.getValueMap(entry).get(
- ResourceCollectionConstants.REF_PROPERTY, "");
+ Resource entry = entries.next();
+ String path = ResourceUtil.getValueMap(entry).get(
+ ResourceCollectionConstants.REF_PROPERTY, "");
if (resource.getPath().equals(path)) {
- return entry.adaptTo(ModifiableValueMap.class);
+ return Optional.ofNullable(entry.adaptTo(type));
}
}
- return null;
- }
+ return Optional.empty();
+ }
+
+ @Override
+ public ModifiableValueMap getProperties(Resource resource) {
+ return getPropertiesAs(resource, ModifiableValueMap.class).orElse(null);
+ }
+
+ @Override
+ public ValueMap getValueMap(Resource resource) {
+ return getPropertiesAs(resource, ValueMap.class).orElse(new ValueMapDecorator(new HashMap<>()));
+ }
}
diff --git a/src/main/java/org/apache/sling/resource/collection/package-info.java b/src/main/java/org/apache/sling/resource/collection/package-info.java
index bc6c9fd..232b52f 100644
--- a/src/main/java/org/apache/sling/resource/collection/package-info.java
+++ b/src/main/java/org/apache/sling/resource/collection/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
-@org.osgi.annotation.versioning.Version("1.0.2")
+@org.osgi.annotation.versioning.Version("1.1.0")
package org.apache.sling.resource.collection;
diff --git a/src/test/java/org/apache/sling/resource/collection/impl/ResourceCollectionImplTest.java b/src/test/java/org/apache/sling/resource/collection/impl/ResourceCollectionImplTest.java
index eb9624d..716ac37 100755
--- a/src/test/java/org/apache/sling/resource/collection/impl/ResourceCollectionImplTest.java
+++ b/src/test/java/org/apache/sling/resource/collection/impl/ResourceCollectionImplTest.java
@@ -23,15 +23,15 @@
import java.util.Iterator;
import java.util.Map;
-import junit.framework.Assert;
-
import org.apache.sling.api.SlingConstants;
+import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.resource.collection.ResourceCollection;
import org.apache.sling.resource.collection.ResourceCollectionManager;
import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -221,4 +221,45 @@
Assert.assertEquals(0, numOfRes);
}
+
+ @Test
+ public void testGetValueMap() throws PersistenceException {
+ final Map<String, Object> props = new HashMap<String, Object>();
+ props.put("creator", "slingdev");
+
+ final ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "collection3");
+
+ final Resource resource = resResolver.create(resResolver.getResource("/"), "res1",
+ Collections.singletonMap(PROPERTY_RESOURCE_TYPE, (Object) "type"));
+ collection.add(resource, props);
+
+ final Resource collectionRes = resResolver.getResource("/collection3");
+ Assert.assertNotNull(collectionRes);
+
+ Assert.assertEquals(true, collection.contains(resource));
+
+ ValueMap vm = collection.getValueMap(resource);
+
+ Assert.assertNotNull(vm);
+ Assert.assertEquals("slingdev", vm.get("creator", ""));
+ }
+
+ @Test
+ public void testGetValueMap__emptyOnInvalidResource() throws PersistenceException {
+
+ final ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "collection3");
+
+ final Resource resource = resResolver.create(resResolver.getResource("/"), "res1",
+ Collections.singletonMap(PROPERTY_RESOURCE_TYPE, (Object) "type"));
+
+ final Resource collectionRes = resResolver.getResource("/collection3");
+ Assert.assertNotNull(collectionRes);
+
+ Assert.assertEquals(false, collection.contains(resource));
+
+ ValueMap vm = collection.getValueMap(resource);
+
+ Assert.assertNotNull(vm);
+ }
+
}
\ No newline at end of file