SLING-6421 ValueMapDecorator should use typed methods when decorating ValueMaps

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1775354 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java b/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java
index 357ad5d..0f941a1 100644
--- a/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java
+++ b/src/main/java/org/apache/sling/api/wrappers/ValueMapDecorator.java
@@ -51,6 +51,10 @@
      * {@inheritDoc}
      */
     public <T> T get(String name, Class<T> type) {
+        if (base instanceof ValueMap) {
+            // shortcut if decorated map is ValueMap
+            return ((ValueMap)base).get(name, type);
+        }
         return convert(get(name), type);
     }
 
@@ -145,7 +149,11 @@
      */
     @SuppressWarnings("unchecked")
     public <T> T get(String name, T defaultValue) {
-        if ( defaultValue == null ) {
+        if (base instanceof ValueMap) {
+            // shortcut if decorated map is ValueMap
+            return ((ValueMap)base).get(name, defaultValue);
+        }
+        if (defaultValue == null) {
             return (T)get(name);
         }
         T value = get(name, (Class<T>) defaultValue.getClass());
diff --git a/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java b/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java
index 43b13c0..6c7fc75 100644
--- a/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java
+++ b/src/test/java/org/apache/sling/api/wrappers/ValueMapDecoratorTest.java
@@ -18,6 +18,10 @@
  */
 package org.apache.sling.api.wrappers;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -146,4 +150,17 @@
         Assert.assertFalse("Two ValueMapDecorators based on maps with different entries should not be equal",
                 valueMap.equals(valueMap2));
     }
+    
+    @Test
+    public void testDelegateToValueMap() {
+        ValueMap original = mock(ValueMap.class);
+        ValueMap decorated = new ValueMapDecorator(original);
+        
+        decorated.get("prop1", String.class);
+        verify(original, times(1)).get("prop1", String.class);
+
+        decorated.get("prop1", "defValue");
+        verify(original, times(1)).get("prop1", "defValue");
+    }
+    
 }