SLING-9314 - NPE in ObjectModel.toBoolean(Object) when object.toString() returns null (#6)

* applied slightly modified patch from Paul Bjorkstrand
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 3797e00..5425af4 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
@@ -155,22 +155,28 @@
 
         if (object instanceof Number) {
             Number number = (Number) object;
-            return !(number.doubleValue() == 0.0);
+            return number.doubleValue() != 0.0;
         }
 
-        String s = object.toString().trim();
-        if (EMPTY_STRING.equals(s)) {
-            return false;
-        } else if ("true".equalsIgnoreCase(s) || "false".equalsIgnoreCase(s)) {
-            return Boolean.parseBoolean(s);
+        if (object instanceof Boolean) {
+            return Boolean.TRUE.equals(object);
         }
 
-        if (object instanceof Collection) {
-            return ((Collection) object).size() > 0;
+        if (object instanceof String) {
+            String s = (String) object;
+            if (EMPTY_STRING.equals(s)) {
+                return false;
+            } else if ("true".equalsIgnoreCase(s) || "false".equalsIgnoreCase(s)) {
+                return Boolean.parseBoolean(s);
+            }
         }
 
-        if (object instanceof Map) {
-            return ((Map) object).size() > 0;
+        if (object instanceof Collection<?>) {
+            return !((Collection<?>) object).isEmpty();
+        }
+
+        if (object instanceof Map<?, ?>) {
+            return !((Map<?, ?>) object).isEmpty();
         }
 
         if (object instanceof Iterable<?>) {
@@ -181,11 +187,15 @@
             return ((Iterator<?>) object).hasNext();
         }
 
-        if (object instanceof Optional) {
-            return toBoolean(((Optional) object).orElse(false));
+        if (object instanceof Optional<?>) {
+            Optional<?> optional = (Optional<?>) object;
+            return optional.filter(ObjectModel::toBoolean).isPresent();
         }
 
-        return !(object instanceof Object[]) || ((Object[]) object).length > 0;
+        if (object.getClass().isArray()) {
+            return Array.getLength(object) > 0;
+        }
+        return true;
     }
 
     /**
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 1ec2699..2d54676 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
@@ -48,6 +48,9 @@
         assertFalse(ObjectModel.toBoolean(0));
         assertTrue(ObjectModel.toBoolean(123456));
         assertFalse(ObjectModel.toBoolean(""));
+        assertFalse(ObjectModel.toBoolean(false));
+        assertFalse(ObjectModel.toBoolean(Boolean.FALSE));
+        assertFalse(ObjectModel.toBoolean(new int[0]));
         assertFalse(ObjectModel.toBoolean("FalSe"));
         assertFalse(ObjectModel.toBoolean("false"));
         assertFalse(ObjectModel.toBoolean("FALSE"));
@@ -81,6 +84,17 @@
         assertTrue(ObjectModel.toBoolean(Optional.of(true)));
         assertTrue(ObjectModel.toBoolean(Optional.of("pass")));
         assertTrue(ObjectModel.toBoolean(Optional.of(1)));
+        assertTrue(ObjectModel.toBoolean(new Object()));
+        Map<String, String> map2 = new HashMap<String, String>() {
+            @Override
+            public String toString() {
+                return null;
+            }
+        };
+        assertFalse(ObjectModel.toBoolean(map2));
+        map2.put("one", "entry");
+        assertTrue(ObjectModel.toBoolean(map2));
+
     }
 
     @Test