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