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 <[email protected]>
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"