You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2022/05/25 08:52:47 UTC
[commons-jexl] branch master updated: JEXL-370: ObjectContext has() method no longer confuses property existence and property being null;
This is an automated email from the ASF dual-hosted git repository.
henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
The following commit(s) were added to refs/heads/master by this push:
new dfc15a74 JEXL-370: ObjectContext has() method no longer confuses property existence and property being null;
dfc15a74 is described below
commit dfc15a7472d0b641a19bc6e69f6bb90690eda4f0
Author: henrib <he...@apache.org>
AuthorDate: Wed May 25 10:52:40 2022 +0200
JEXL-370: ObjectContext has() method no longer confuses property existence and property being null;
---
RELEASE-NOTES.txt | 1 +
.../org/apache/commons/jexl3/ObjectContext.java | 7 +----
.../org/apache/commons/jexl3/Issues300Test.java | 35 ++++++++++++++++++++++
3 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 9b3bb2b3..b56fde82 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -47,6 +47,7 @@ New Features in 3.3:
Bugs Fixed in 3.3:
==================
+* JEXL-370: Cannot check if variable is defined using ObjectContext if the value is null
* JEXL-364: Evaluator options not propagated in closures
* JEXL-362: JexlInfo position reporting is off
* JEXL-361: Null may be used as operand silently even in arithmetic strict(true) mode
diff --git a/src/main/java/org/apache/commons/jexl3/ObjectContext.java b/src/main/java/org/apache/commons/jexl3/ObjectContext.java
index 6d4b0416..4fd408b1 100644
--- a/src/main/java/org/apache/commons/jexl3/ObjectContext.java
+++ b/src/main/java/org/apache/commons/jexl3/ObjectContext.java
@@ -90,12 +90,7 @@ public class ObjectContext<T> implements JexlContext, JexlContext.NamespaceResol
@Override
public boolean has(final String name) {
- final JexlPropertyGet jget = jexl.getUberspect().getPropertyGet(object, name);
- try {
- return jget != null && jget.invoke(object) != null;
- } catch (final Exception xany) {
- return false;
- }
+ return jexl.getUberspect().getPropertyGet(object, name) != null;
}
@Override
diff --git a/src/test/java/org/apache/commons/jexl3/Issues300Test.java b/src/test/java/org/apache/commons/jexl3/Issues300Test.java
index c5de60bd..e48ebf8e 100644
--- a/src/test/java/org/apache/commons/jexl3/Issues300Test.java
+++ b/src/test/java/org/apache/commons/jexl3/Issues300Test.java
@@ -28,6 +28,7 @@ import java.util.Map;
import org.apache.commons.jexl3.internal.Engine32;
import org.apache.commons.jexl3.internal.OptionsContext;
+import org.apache.commons.jexl3.introspection.JexlPropertyGet;
import org.junit.Assert;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
@@ -780,4 +781,38 @@ public class Issues300Test {
String s1 = script.getSourceText();
Assert.assertNotEquals(s0, s1);
}
+
+ public static class Var370 {
+ private String name = null;
+ public void setName(String s) {
+ name = s;
+ }
+ public String getName() {
+ return name;
+ }
+ }
+
+ @Test public void test370() {
+ Var370 var370 = new Var370();
+ JexlEngine jexl = new JexlBuilder().safe(true).create();
+ ObjectContext<Var370> ctxt = new ObjectContext<Var370>(jexl, var370);
+ JexlExpression get = jexl.createExpression("name");
+ // not null
+ var370.setName("John");
+ Assert.assertEquals("John",get.evaluate(ctxt));
+ Assert.assertTrue(ctxt.has("name"));
+ // null
+ var370.setName(null);
+ Assert.assertNull(get.evaluate(ctxt));
+ Assert.assertTrue(ctxt.has("name"));
+ // undefined
+ get = jexl.createExpression("phone");
+ Assert.assertFalse(ctxt.has("phone"));
+ try {
+ get.evaluate(ctxt);
+ Assert.fail("phone should be undefined!");
+ } catch(JexlException.Variable xvar) {
+ Assert.assertEquals("phone", xvar.getVariable());
+ }
+ }
}