This is an automated email from the ASF dual-hosted git repository.

radu pushed a commit to branch issue/SLING-8228
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly-runtime.git

commit fe8a9e88af508ee8d5f1d1661cc9f25b85b9a97f
Author: Radu Cotescu <r...@apache.org>
AuthorDate: Tue Jan 22 10:34:41 2019 +0100

    SLING-8228 - Expand Optional objects in the ObjectModel
    
    * applied slightly modified patch from #2 (closes #2)
    
    Co-authored-by: Ilyas Turkben <isturk...@gmail.com>
---
 .../scripting/sightly/render/ObjectModel.java      | 20 +++++++-
 .../scripting/sightly/render/ObjectModelTest.java  | 58 +++++++++++++++++++++-
 2 files changed, 76 insertions(+), 2 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/scripting/sightly/render/ObjectModel.java 
b/src/main/java/org/apache/sling/scripting/sightly/render/ObjectModel.java
index e3ef0ad..3797e00 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/render/ObjectModel.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/render/ObjectModel.java
@@ -31,6 +31,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 
 import org.apache.commons.lang3.StringUtils;
@@ -114,6 +115,9 @@ public final class ObjectModel {
         if (resolved == null) {
             String propertyName = toString(property);
             if (StringUtils.isNotEmpty(propertyName)) {
+                if (target instanceof Optional) {
+                    return resolveProperty(((Optional) target).orElse(null), 
property);
+                }
                 if (target instanceof Map) {
                     resolved = ((Map) target).get(property);
                 }
@@ -177,6 +181,10 @@ public final class ObjectModel {
             return ((Iterator<?>) object).hasNext();
         }
 
+        if (object instanceof Optional) {
+            return toBoolean(((Optional) object).orElse(false));
+        }
+
         return !(object instanceof Object[]) || ((Object[]) object).length > 0;
     }
 
@@ -195,6 +203,10 @@ public final class ObjectModel {
         if (object instanceof Number) {
             return (Number) object;
         }
+        if (object instanceof Optional) {
+            return toNumber(((Optional) object).orElse(null));
+        }
+
         String stringValue = toString(object);
         try {
             return NumberUtils.createNumber(stringValue);
@@ -227,7 +239,10 @@ public final class ObjectModel {
                 output = object.toString();
             } else if (object instanceof Enum) {
                 return ((Enum) object).name();
-            } else {
+            } else if (object instanceof Optional) {
+                return toString(((Optional) object).orElse(EMPTY_STRING));
+            }
+            else {
                 Collection<?> col = toCollection(object);
                 output = collectionToString(col);
             }
@@ -269,6 +284,9 @@ public final class ObjectModel {
             }
             return list;
         }
+        if (object instanceof Optional) {
+            return toCollection(((Optional) 
object).orElse(Collections.emptyList()));
+        }
         if (object instanceof Collection) {
             return (Collection<Object>) object;
         }
diff --git 
a/src/test/java/org/apache/sling/scripting/sightly/render/ObjectModelTest.java 
b/src/test/java/org/apache/sling/scripting/sightly/render/ObjectModelTest.java
index 28f88bd..1ec2699 100644
--- 
a/src/test/java/org/apache/sling/scripting/sightly/render/ObjectModelTest.java
+++ 
b/src/test/java/org/apache/sling/scripting/sightly/render/ObjectModelTest.java
@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Vector;
 
 import org.apache.sling.scripting.sightly.render.testobjects.Person;
@@ -72,6 +73,14 @@ public class ObjectModelTest {
         assertTrue(ObjectModel.toBoolean(new Bag<>(testArray)));
         assertFalse(ObjectModel.toBoolean(new Bag<>(new Integer[]{})));
         assertTrue(ObjectModel.toBoolean(new Date()));
+
+        assertFalse(ObjectModel.toBoolean(Optional.empty()));
+        assertFalse(ObjectModel.toBoolean(Optional.of("")));
+        assertFalse(ObjectModel.toBoolean(Optional.of(false)));
+        assertFalse(ObjectModel.toBoolean(Optional.ofNullable(null)));
+        assertTrue(ObjectModel.toBoolean(Optional.of(true)));
+        assertTrue(ObjectModel.toBoolean(Optional.of("pass")));
+        assertTrue(ObjectModel.toBoolean(Optional.of(1)));
     }
 
     @Test
@@ -80,6 +89,14 @@ public class ObjectModelTest {
         assertEquals(1, ObjectModel.toNumber("1"));
         assertNull(ObjectModel.toNumber(null));
         assertNull(ObjectModel.toNumber("1-2"));
+
+        assertNull(ObjectModel.toNumber(Optional.empty()));
+        assertNull(ObjectModel.toNumber(Optional.of(false)));
+        assertNull(ObjectModel.toNumber(Optional.ofNullable(null)));
+        assertNull(ObjectModel.toNumber(Optional.of(true)));
+        assertNull(ObjectModel.toNumber(Optional.of("pass")));
+        assertEquals(1, ObjectModel.toNumber(Optional.of(1)));
+        assertEquals(1, ObjectModel.toNumber(Optional.of("1")));
     }
 
     @Test
@@ -94,6 +111,14 @@ public class ObjectModelTest {
         assertEquals("1,2,3", ObjectModel.toString(testList));
         assertEquals("1,2,3", ObjectModel.toString(testArray));
         assertEquals("1,2,3", ObjectModel.toString(testPrimitiveArray));
+
+        assertEquals("", ObjectModel.toString(Optional.empty()));
+        assertEquals("false", ObjectModel.toString(Optional.of(false)));
+        assertEquals("", ObjectModel.toString(Optional.ofNullable(null)));
+        assertEquals("true", ObjectModel.toString(Optional.of(true)));
+        assertEquals("pass", ObjectModel.toString(Optional.of("pass")));
+        assertEquals("1", ObjectModel.toString(Optional.of(1)));
+        assertEquals("1", ObjectModel.toString(Optional.of("1")));
     }
 
     @Test
@@ -101,7 +126,7 @@ public class ObjectModelTest {
         assertTrue(ObjectModel.toCollection(null).isEmpty());
         assertTrue(ObjectModel.toCollection(new StringBuilder()).isEmpty());
         Integer[] testArray = new Integer[] {1, 2, 3};
-        int[] testPrimitiveArray = new int[]{1, 2, 3};
+        int[] testPrimitiveArray = new int[] {1, 2, 3};
         List<Integer> testList = Arrays.asList(testArray);
         Map<String, Integer> map = new HashMap<String, Integer>() {{
             put("one", 1);
@@ -121,6 +146,12 @@ public class ObjectModelTest {
         assertTrue(stringCollection.size() == 1 && 
stringCollection.contains(stringObject));
         Collection numberCollection = ObjectModel.toCollection(numberObject);
         assertTrue(numberCollection.size() == 1 && 
numberCollection.contains(numberObject));
+
+        List<Object> emptyList = Collections.emptyList();
+        assertEquals(emptyList, ObjectModel.toCollection(Optional.empty()));
+        assertEquals(emptyList, 
ObjectModel.toCollection(Optional.of(Arrays.asList())));
+        List<Integer> list = Arrays.asList(1, 2, 3);
+        assertEquals(list, ObjectModel.toCollection(Optional.of(list)));
     }
 
     @Test
@@ -176,6 +207,15 @@ public class ObjectModelTest {
         assertNull("Expected null result for public method available on 
implementation but not exposed by interface.", ObjectModel
                 .resolveProperty(johnDoe, "fullName"));
         assertNull("Expected null result for inexistent method.", 
ObjectModel.resolveProperty(johnDoe, "nomethod"));
+
+        OptionalTest optionalTest = new OptionalTest();
+        assertEquals(Optional.of("string"), 
ObjectModel.resolveProperty(optionalTest, "string"));
+        assertEquals(Optional.of(1), ObjectModel.resolveProperty(optionalTest, 
"int"));
+        assertEquals(Optional.of(1), 
ObjectModel.resolveProperty(Optional.of(optionalTest), "int"));
+        assertEquals(Optional.of(Integer.valueOf(1)), 
ObjectModel.resolveProperty(optionalTest, "integer"));
+        assertEquals(Optional.of(Integer.valueOf(1)), 
ObjectModel.resolveProperty(Optional.of(optionalTest), "integer"));
+        assertEquals(null, ObjectModel.resolveProperty(Optional.empty(), 
"integer"));
+
     }
 
     @Test
@@ -242,4 +282,20 @@ public class ObjectModelTest {
             };
         }
     }
+
+    public class OptionalTest {
+        public Optional<String> getEmpty() {
+            return Optional.empty();
+        }
+        public Optional<String> getString() {
+            return Optional.of("string");
+        }
+        public Optional<Integer> getInt() {
+            return Optional.of(1);
+        }
+        public Optional<Integer> getInteger() {
+            return Optional.of(Integer.valueOf(1));
+        }
+    }
 }
+

Reply via email to