This is an automated email from the ASF dual-hosted git repository. radu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly-runtime.git
The following commit(s) were added to refs/heads/master by this push: new 5484236 SLING-8228 - Expand Optional objects in the ObjectModel 5484236 is described below commit 5484236789d1a9edb2f81a99fad1144e8ab04095 Author: Radu Cotescu <170911+raducote...@users.noreply.github.com> AuthorDate: Tue Jan 22 16:58:36 2019 +0100 SLING-8228 - Expand Optional objects in the ObjectModel * applied slightly modified patch from #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)); + } + } } +