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