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 ca55aa8e JEXL-398: re-allow dot-ed expression for map keys; - fix 
array/set/map builders to use extended flag; - re-allow [,...] as valid empty 
syntax;
ca55aa8e is described below

commit ca55aa8e9ad4265e4a764ac3c7eab8f057bd5e1c
Author: henrib <hen...@apache.org>
AuthorDate: Tue Jan 23 11:34:26 2024 +0100

    JEXL-398: re-allow dot-ed expression for map keys;
    - fix array/set/map builders to use extended flag;
    - re-allow [,...] as valid empty syntax;
---
 .../org/apache/commons/jexl3/JexlArithmetic.java   | 19 +++++----
 .../org/apache/commons/jexl3/parser/Parser.jjt     |  4 +-
 .../org/apache/commons/jexl3/Issues300Test.java    | 48 +++++++++++++++++++++-
 3 files changed, 60 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlArithmetic.java 
b/src/main/java/org/apache/commons/jexl3/JexlArithmetic.java
index 585cf15d..8e24523e 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlArithmetic.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlArithmetic.java
@@ -284,12 +284,13 @@ public class JexlArithmetic {
      * @return the array builder
      */
     public ArrayBuilder arrayBuilder(final int size, final boolean extended) {
-        return new org.apache.commons.jexl3.internal.ArrayBuilder(size);
+        return new org.apache.commons.jexl3.internal.ArrayBuilder(size, 
extended);
     }
-    @Deprecated
+
     /**
      * @deprecated since 3.3.1
      */
+    @Deprecated
     public ArrayBuilder arrayBuilder(final int size) {
         return arrayBuilder(size, false);
     }
@@ -322,12 +323,13 @@ public class JexlArithmetic {
      * @return the array builder
      */
     public SetBuilder setBuilder(final int size, final boolean extended) {
-        return new org.apache.commons.jexl3.internal.SetBuilder(size);
+        return new org.apache.commons.jexl3.internal.SetBuilder(size, 
extended);
     }
-    @Deprecated
+
     /**
      * @deprecated since 3.3.1
      */
+    @Deprecated
     public SetBuilder setBuilder(final int size) {
         return setBuilder(size, false);
     }
@@ -361,12 +363,13 @@ public class JexlArithmetic {
      * @return the map builder
      */
     public MapBuilder mapBuilder(final int size, final boolean extended) {
-        return new org.apache.commons.jexl3.internal.MapBuilder(size);
+        return new org.apache.commons.jexl3.internal.MapBuilder(size, 
extended);
     }
-    @Deprecated
+
     /**
      * @deprecated since 3.3.1
      */
+    @Deprecated
     public MapBuilder mapBuilder(final int size) {
         return mapBuilder(size, false);
     }
@@ -683,7 +686,7 @@ public class JexlArithmetic {
         }
         if (val instanceof String) {
             final String string = (String) val;
-            if ("".equals(string)) {
+            if (string.isEmpty()) {
                 return BigDecimal.ZERO;
             }
             return roundBigDecimal(new BigDecimal(string, getMathContext()));
@@ -1144,7 +1147,7 @@ public class JexlArithmetic {
      * <p>For convenience, booleans are converted as 1/0 (true/false).</p>
      *
      * @param value  argument
-     * @return true if argument can be represented by a long
+     * @return a non-null value if argument can be represented by a long
      */
     protected Number asLongNumber(final Object value) {
         return asLongNumber(strict, value);
diff --git a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt 
b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
index 520b3c8c..527f1e30 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
+++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
@@ -869,7 +869,7 @@ void ArrayLiteral() : {}
 {
    <LBRACKET>
    (
-        ExtendedLiteral()
+        (<COMMA>)? ExtendedLiteral()
     |
         (Expression() (LOOKAHEAD(2) <COMMA> Expression())*
             (<COMMA> (ExtendedLiteral() { jjtThis.setExtended(true); })? )? )?
@@ -890,7 +890,7 @@ void MapLiteral() : {}
 
 void MapEntry() : {}
 {
-    Identifier(true) <COLON> Expression()
+    LOOKAHEAD(2) Identifier(true) <COLON> Expression()
     |
     Expression() <COLON> Expression()
 }
diff --git a/src/test/java/org/apache/commons/jexl3/Issues300Test.java 
b/src/test/java/org/apache/commons/jexl3/Issues300Test.java
index e89e46f1..7baa7908 100644
--- a/src/test/java/org/apache/commons/jexl3/Issues300Test.java
+++ b/src/test/java/org/apache/commons/jexl3/Issues300Test.java
@@ -28,7 +28,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -1227,8 +1229,9 @@ public class Issues300Test {
         result = (String) script.execute(null, proxy);
         Assert.assertEquals(control, result);
     }
+
     @Test
-    public void testIssue398() {
+    public void testIssue398a() {
         final String src = "let m = {\n" +
             "  \"foo\": 1,\n" +
             "  \"bar\": 2,\n" +
@@ -1240,6 +1243,49 @@ public class Issues300Test {
         final Map<?,?> map = (Map<?, ?>) result;
         Assert.assertEquals(2, map.size());
     }
+
+    @Test
+    public void testIssue398b() {
+        Map<String,Object> foo = Collections.singletonMap("X", "x");
+        Map<String,Object> bar = Collections.singletonMap("Y", "y");
+        JexlContext ctxt = new MapContext();
+        ctxt.set("foo", foo);
+        ctxt.set("bar", bar);
+        final String src = "let m = {\n" +
+                "  foo.X: 1,\n" +
+                "  bar.Y: 2,\n" +
+                "}";
+        final JexlEngine jexl = new JexlBuilder().create();
+        JexlScript script = jexl.createScript(src);
+        Object result = script.execute(ctxt);
+        Assert.assertTrue(result instanceof Map);
+        Map<?,?> map = (Map<?, ?>) result;
+        Assert.assertEquals(2, map.size());
+        Assert.assertEquals(1, map.get("x"));
+        Assert.assertEquals(2, map.get("y"));
+
+        script = jexl.createScript(src, "foo", "bar");
+        result = script.execute(null, foo, bar);
+        Assert.assertTrue(result instanceof Map);
+        map = (Map<?, ?>) result;
+        Assert.assertEquals(2, map.size());
+        Assert.assertEquals(1, map.get("x"));
+        Assert.assertEquals(2, map.get("y"));
+    }
+
+    @Test
+    public void testIssue398c() {
+        final JexlEngine jexl = new JexlBuilder().create();
+        Object empty = jexl.createScript("[,...]").execute(null);
+        Assert.assertNotNull(empty);
+        Assert.assertTrue(jexl.createScript("[1]").execute(null) instanceof 
int[]);
+        Assert.assertTrue(jexl.createScript("[1,...]").execute(null) 
instanceof ArrayList<?>);
+        Assert.assertTrue(jexl.createScript("{1}").execute(null) instanceof 
HashSet<?>);
+        Assert.assertTrue(jexl.createScript("{1,...}").execute(null) 
instanceof LinkedHashSet<?>);
+        Assert.assertTrue(jexl.createScript("{'one': 1}").execute(null) 
instanceof HashMap<?,?>);
+        Assert.assertTrue(jexl.createScript("{'one': 1,...}").execute(null) 
instanceof LinkedHashMap<?,?>);
+    }
+
     @Test public void testPropagateOptions() {
         final String src0 = "`${$options.strict?'+':'-'}strict"
                 + " ${$options.cancellable?'+':'-'}cancellable"

Reply via email to