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"