Author: dklco
Date: Wed Jun 19 14:49:55 2013
New Revision: 1494643

URL: http://svn.apache.org/r1494643
Log:
Fixing SLING-1500 - Added a EL function to support getting a value with a 
default value or casting the result

Modified:
    
sling/trunk/bundles/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/SlingFunctions.java
    
sling/trunk/bundles/scripting/jsp-taglib/src/main/resources/META-INF/sling.tld
    
sling/trunk/bundles/scripting/jsp-taglib/src/test/java/org/apache/sling/scripting/jsp/taglib/TestSlingFunctions.java
    
sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/taglib-test.jsp

Modified: 
sling/trunk/bundles/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/SlingFunctions.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/SlingFunctions.java?rev=1494643&r1=1494642&r2=1494643&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/SlingFunctions.java
 (original)
+++ 
sling/trunk/bundles/scripting/jsp-taglib/src/main/java/org/apache/sling/scripting/jsp/taglib/SlingFunctions.java
 Wed Jun 19 14:49:55 2013
@@ -21,6 +21,7 @@ import java.util.Iterator;
 import org.apache.sling.api.adapter.Adaptable;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -90,21 +91,6 @@ public class SlingFunctions {
        }
 
        /**
-        * Loads the Class for the name from the current thread's classload.
-        * 
-        * @param className
-        *            The name of the class to load
-        * @return the class
-        * @throws ClassNotFoundException
-        *             a class with the specified name could not be found
-        */
-       private static Class<?> loadClass(String className)
-                       throws ClassNotFoundException {
-               return Thread.currentThread().getContextClassLoader()
-                               .loadClass(className);
-       }
-
-       /**
         * Gets the resource at the relative path to the provided resource.
         * 
         * @param base
@@ -142,13 +128,37 @@ public class SlingFunctions {
                log.trace("getResource");
 
                log.debug("Getting resource at path {}", path);
-               if(resolver == null){
+               if (resolver == null) {
                        throw new IllegalArgumentException("Null resource 
resolver");
                }
                return resolver.getResource(path);
        }
 
        /**
+        * Gets the value of the specified key from the ValueMap and either 
coerses
+        * the value into the specified type or uses the specified type as a 
default
+        * depending on the parameter passed in.
+        * 
+        * @param properties
+        *            the ValueMap from which to retrieve the value
+        * @param key
+        *            the key for the value to retrieve
+        * @param defaultOrType
+        *            either the default value or the class to which to coerce 
the
+        *            value
+        * @return
+        */
+       @SuppressWarnings("unchecked")
+       public static final <E> E getValue(ValueMap properties, String key,
+                       Object defaultOrType) {
+               if (defaultOrType instanceof Class<?>) {
+                       return properties.get(key, (Class<E>) defaultOrType);
+               } else {
+                       return properties.get(key, (E) defaultOrType);
+               }
+       }
+
+       /**
         * Method for allowing the invocation of the Sling Resource listChildren
         * method.
         * 
@@ -159,7 +169,7 @@ public class SlingFunctions {
         */
        public static final Iterator<Resource> listChildren(Resource resource) {
                log.trace("listChildren");
-               
+
                Iterator<Resource> children = null;
                if (resource != null) {
                        log.debug("Listing children at path {}", 
resource.getPath());
@@ -169,4 +179,19 @@ public class SlingFunctions {
                }
                return children;
        }
+
+       /**
+        * Loads the Class for the name from the current thread's classload.
+        * 
+        * @param className
+        *            The name of the class to load
+        * @return the class
+        * @throws ClassNotFoundException
+        *             a class with the specified name could not be found
+        */
+       private static Class<?> loadClass(String className)
+                       throws ClassNotFoundException {
+               return Thread.currentThread().getContextClassLoader()
+                               .loadClass(className);
+       }
 }

Modified: 
sling/trunk/bundles/scripting/jsp-taglib/src/main/resources/META-INF/sling.tld
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/jsp-taglib/src/main/resources/META-INF/sling.tld?rev=1494643&r1=1494642&r2=1494643&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/jsp-taglib/src/main/resources/META-INF/sling.tld 
(original)
+++ 
sling/trunk/bundles/scripting/jsp-taglib/src/main/resources/META-INF/sling.tld 
Wed Jun 19 14:49:55 2013
@@ -42,6 +42,13 @@
                <function-signature>org.apache.sling.api.resource.Resource 
getResource(org.apache.sling.api.resource.ResourceResolver,java.lang.String)</function-signature>
        </function>
 
+    <function>
+        <name>getValue</name>
+        
<function-class>org.apache.sling.scripting.jsp.taglib.SlingFunctions</function-class>
+        <function-signature>java.lang.Object 
getValue(org.apache.sling.api.resource.ValueMap,java.lang.String,java.lang.Object)</function-signature>
+    </function>
+       
+
        <function>
                <name>listChildren</name>
                
<function-class>org.apache.sling.scripting.jsp.taglib.SlingFunctions</function-class>

Modified: 
sling/trunk/bundles/scripting/jsp-taglib/src/test/java/org/apache/sling/scripting/jsp/taglib/TestSlingFunctions.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/jsp-taglib/src/test/java/org/apache/sling/scripting/jsp/taglib/TestSlingFunctions.java?rev=1494643&r1=1494642&r2=1494643&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/jsp-taglib/src/test/java/org/apache/sling/scripting/jsp/taglib/TestSlingFunctions.java
 (original)
+++ 
sling/trunk/bundles/scripting/jsp-taglib/src/test/java/org/apache/sling/scripting/jsp/taglib/TestSlingFunctions.java
 Wed Jun 19 14:49:55 2013
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertNot
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
@@ -45,6 +46,7 @@ public class TestSlingFunctions {
                        .getLogger(TestGetResourceTag.class);
        private MockResource resource;
        private MockResourceResolver resolver;
+       private Date date;
        private static final String TEST_PATH = "/content";
 
        /**
@@ -68,6 +70,9 @@ public class TestSlingFunctions {
                        }
                };
                resource = new MockResource(resolver, TEST_PATH, "test");
+               this.date = new Date();
+               resource.addProperty("date", date);
+               resource.addProperty("long", new Long(0L));
                resolver.addResource(resource);
                MockResource child1 = new MockResource(resolver, TEST_PATH + 
"/child1",
                                "test");
@@ -127,6 +132,34 @@ public class TestSlingFunctions {
        }
 
        @Test
+       public void testGetValue(){
+               log.info("testGetValue");
+               Resource resource = SlingFunctions.getResource(resolver, 
TEST_PATH);
+               ValueMap properties = resource.adaptTo(ValueMap.class);
+               
+               log.info("Testing using class coersion");
+               Date retrievedDate = SlingFunctions.getValue(properties, 
"date", Date.class);
+               assertEquals(date,retrievedDate);
+               assertTrue(retrievedDate instanceof Date);
+               
+               log.info("Testing with default value on existing key");
+               Long retrievedLong = SlingFunctions.getValue(properties, 
"long", new Long(-123L));
+               assertEquals(new Long(0L),retrievedLong);
+               assertTrue(retrievedLong instanceof Long);
+               
+               log.info("Testing with no value and class coersion");
+               Date fakeDate = SlingFunctions.getValue(properties, "date1", 
Date.class);
+               assertTrue(fakeDate == null);
+               
+               log.info("Testing with no value and default specified");
+               Long fakeLong = SlingFunctions.getValue(properties, "long1", 
new Long(-123L));
+               assertEquals(new Long(-123L),fakeLong);
+               assertTrue(fakeLong instanceof Long);
+
+               log.info("Tests successful!");
+       }
+       
+       @Test
        public void testListChildResources() {
                log.info("testListChildResources");
                Iterator<Resource> children = 
SlingFunctions.listChildren(resource);

Modified: 
sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/taglib-test.jsp
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/taglib-test.jsp?rev=1494643&r1=1494642&r2=1494643&view=diff
==============================================================================
--- 
sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/taglib-test.jsp
 (original)
+++ 
sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/taglib-test.jsp
 Wed Jun 19 14:49:55 2013
@@ -1,4 +1,5 @@
 <%@page session="false" contentType="text/html; charset=utf-8"%>
+<%@page import="java.util.Date" %>
 <%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling"; %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"; %>
 <sling:defineObjects/><c:set var="success" value="true" />
@@ -106,6 +107,20 @@ Get Resource Function
     Test 3: Not Found Handling
     Result: <c:set var="nfresource7" 
value="${sling:getResource(resourceResolver, 'test123123')}" 
/><c:choose><c:when test="${empty 
nfresource7.path}">SUCCESS</c:when><c:otherwise>ERROR<c:set var="success" 
value="false" /></c:otherwise></c:choose>
     
+Get Value Function
+    Test 1: Get Property
+    <%
+    pageContext.setAttribute("dateClass", Date.class);
+    %>
+    Result: <c:set var="property5" 
value="${sling:getValue(componentProps,'jcr:created',dateClass)}" 
/><c:choose><c:when test="${not empty 
property5}">SUCCESS</c:when><c:otherwise>ERROR<c:set var="success" 
value="false" /></c:otherwise></c:choose>
+    
+    Test 2: Not Found Property
+    Result: <c:set var="property6" 
value="${sling:getValue(componentProps,'jcr:created2',dateClass)}" 
/><c:choose><c:when test="${empty 
property6}">SUCCESS</c:when><c:otherwise>ERROR<c:set var="success" 
value="false" /></c:otherwise></c:choose>
+
+    Test 3: Default Value
+    Result: <c:set var="property7" 
value="${sling:getValue(componentProps,'jcr:created2','fakeval')}" 
/><c:choose><c:when test="${not empty 
property7}">SUCCESS</c:when><c:otherwise>ERROR<c:set var="success" 
value="false" /></c:otherwise></c:choose>
+    
+    
 List Children Function
     Test 1: Get Children
     Result: <c:set var="childResources4" 
value="${sling:listChildren(contentResource)}" /><c:choose><c:when test="${not 
empty childResources4}">SUCCESS</c:when><c:otherwise>ERROR<c:set var="success" 
value="false" /></c:otherwise></c:choose>


Reply via email to