You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2015/12/22 13:27:45 UTC

svn commit: r1721385 - in /sling/trunk/bundles/api/src: main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java

Author: rombert
Date: Tue Dec 22 12:27:45 2015
New Revision: 1721385

URL: http://svn.apache.org/viewvc?rev=1721385&view=rev
Log:
SLING-4658 - ValueMapDecorator should support conversion from array to single value type

Applied pull request by Mikołaj Mański, thanks for the contribution.

This closes #114

Modified:
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java
    sling/trunk/bundles/api/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java

Modified: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java?rev=1721385&r1=1721384&r2=1721385&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java (original)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java Tue Dec 22 12:27:45 2015
@@ -71,15 +71,15 @@ public class ValueMapDecorator implement
             } else if (type.isArray()) {
                 return (T) convertToArray(obj, type.getComponentType());
             } else if (type == String.class) {
-                return (T) String.valueOf(obj);
+                return (T) String.valueOf(getSingleValue(obj));
             } else if (type == Integer.class) {
-                return (T) (Integer) Integer.parseInt(obj.toString());
+                return (T) (Integer) Integer.parseInt(getSingleValue(obj));
             } else if (type == Long.class) {
-                return (T) (Long) Long.parseLong(obj.toString());
+                return (T) (Long) Long.parseLong(getSingleValue(obj));
             } else if (type == Double.class) {
-                return (T) (Double) Double.parseDouble(obj.toString());
+                return (T) (Double) Double.parseDouble(getSingleValue(obj));
             } else if (type == Boolean.class) {
-                return (T) (Boolean) Boolean.parseBoolean(obj.toString());
+                return (T) (Boolean) Boolean.parseBoolean(getSingleValue(obj));
             } else {
                 return null;
             }
@@ -89,6 +89,25 @@ public class ValueMapDecorator implement
     }
 
     /**
+     * Gets a single value of String from the object. If the object is an array it returns it's first element.
+     * @param obj object or object array.
+     * @return result of <code>toString()</code> on object or first element of an object array. If @param obj is null
+     * or it's an array with first element that is null, then null is returned.
+     */
+    private String getSingleValue(Object obj) {
+        final String result;
+        if (obj == null) {
+            result = null;
+        } else if (obj.getClass().isArray()) {
+            final Object[] values = (Object[]) obj;
+            result = values[0] != null ? values[0].toString() : null;
+        } else {
+            result = obj.toString();
+        }
+        return result;
+    }
+
+    /**
      * Converts the object to an array of the given type
      * @param obj the object or object array
      * @param type the component type of the array
@@ -237,6 +256,6 @@ public class ValueMapDecorator implement
     public boolean equals(Object obj) {
         return base.equals(obj);
     }
-    
-    
+
+
 }
\ No newline at end of file

Modified: sling/trunk/bundles/api/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java?rev=1721385&r1=1721384&r2=1721385&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java (original)
+++ sling/trunk/bundles/api/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java Tue Dec 22 12:27:45 2015
@@ -71,14 +71,13 @@ public class ValueMapDecoratorTest {
     }
 
     @Test
-    @Ignore("SLING-4658")
     public void testGettingSingleValuesFromMultiValueEntries() {
         map.put("prop1", new String[] { "test", "test2" });
         map.put("prop2", new String[] { "1", "2" });
         Assert.assertEquals("First element from underlying array should be returned", "test",
                 valueMap.get("prop1", String.class));
         Assert.assertEquals("First element from underlying array should be returned", Integer.valueOf(1),
-                valueMap.get("prop1", Integer.class));
+                valueMap.get("prop2", Integer.class));
     }
 
     @Test