You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2026/10/18 15:32:53 UTC
(tomcat) 07/17: Correct the EL empty operator for empty primitive arrays
This is an automated email from the ASF dual-hosted git repository.
rmaucher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 785e0633b14568d8c0aecca3d4f1b361d3ef7aa2
Author: opencode <re...@apache.org>
AuthorDate: Sun Oct 18 14:34:04 2026 +0200
Correct the EL empty operator for empty primitive arrays
The EL specification defines the empty operator as true when the
operand evaluates to an empty array. AstAbstractEmpty tested arrays
with instanceof Object[] and Array.length, which only matches object
arrays. A one-dimensional primitive array, such as an int[0] returned
by a bean property, is not an instance of Object[], so empty evaluated
to false and not empty to true, silently inverting the spec result.
Other array handling in the EL implementation (the stream resolver and
ELSupport) already uses the primitive-array-correct reflective checks.
Test array-ness with Class.isArray() and length with
java.lang.reflect.Array.getLength() instead. The null disjunct
precedes this test and short-circuits, so no additional null guard is
required. Multi-dimensional behaviour is unchanged: an empty outer
array is empty and a non-empty outer array with empty inner arrays is
not, consistent with the previous treatment of equivalent object
arrays.
Adds tests to TestAstEmpty and TestAstNotEmpty covering empty and
filled primitive arrays plus an empty object array as a regression
guard for the original path. The primitive-array tests fail against
the previous implementation.
---
java/org/apache/el/parser/AstAbstractEmpty.java | 3 ++-
test/org/apache/el/parser/TestAstEmpty.java | 29 +++++++++++++++++++++++++
test/org/apache/el/parser/TestAstNotEmpty.java | 19 ++++++++++++++++
3 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/java/org/apache/el/parser/AstAbstractEmpty.java b/java/org/apache/el/parser/AstAbstractEmpty.java
index 7509cae71c..0153eb7953 100644
--- a/java/org/apache/el/parser/AstAbstractEmpty.java
+++ b/java/org/apache/el/parser/AstAbstractEmpty.java
@@ -17,6 +17,7 @@
/* Generated By:JJTree: Do not edit this line. AstAbstractEmpty.java */
package org.apache.el.parser;
+import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
@@ -51,7 +52,7 @@ public abstract class AstAbstractEmpty extends SimpleNode {
public Object getValue(EvaluationContext ctx) throws ELException {
Object obj = this.children[0].getValue(ctx);
if (obj == null || obj instanceof String && ((String) obj).isEmpty() ||
- obj instanceof Object[] && ((Object[]) obj).length == 0 ||
+ obj.getClass().isArray() && Array.getLength(obj) == 0 ||
obj instanceof Collection<?> && ((Collection<?>) obj).isEmpty() ||
obj instanceof Map<?,?> && ((Map<?,?>) obj).isEmpty() ||
obj instanceof Optional && ((Optional<?>) obj).isEmpty()) {
diff --git a/test/org/apache/el/parser/TestAstEmpty.java b/test/org/apache/el/parser/TestAstEmpty.java
index 1523967189..c90f7fe29e 100644
--- a/test/org/apache/el/parser/TestAstEmpty.java
+++ b/test/org/apache/el/parser/TestAstEmpty.java
@@ -37,4 +37,33 @@ public class TestAstEmpty {
Boolean result = processor.eval("empty ''");
Assert.assertEquals(Boolean.TRUE, result);
}
+
+ @Test
+ public void test03() {
+ // An array with no elements is empty. This includes primitive arrays.
+ ELProcessor processor = new ELProcessor();
+ processor.defineBean("arr", new int[0]);
+ Boolean result = processor.eval("empty arr");
+ Assert.assertEquals(Boolean.TRUE, result);
+ }
+
+
+
+ @Test
+ public void test04() {
+ ELProcessor processor = new ELProcessor();
+ processor.defineBean("arr", new int[] { 1, 2 });
+ Boolean result = processor.eval("empty arr");
+ Assert.assertEquals(Boolean.FALSE, result);
+ }
+
+
+
+ @Test
+ public void test05() {
+ ELProcessor processor = new ELProcessor();
+ processor.defineBean("arr", new Object[0]);
+ Boolean result = processor.eval("empty arr");
+ Assert.assertEquals(Boolean.TRUE, result);
+ }
}
diff --git a/test/org/apache/el/parser/TestAstNotEmpty.java b/test/org/apache/el/parser/TestAstNotEmpty.java
index dceca6bb1c..8e6c9e9973 100644
--- a/test/org/apache/el/parser/TestAstNotEmpty.java
+++ b/test/org/apache/el/parser/TestAstNotEmpty.java
@@ -37,4 +37,23 @@ public class TestAstNotEmpty {
Boolean result = processor.eval("not empty ''");
Assert.assertEquals(Boolean.FALSE, result);
}
+
+
+ @Test
+ public void test03() {
+ // An array with no elements is empty. This includes primitive arrays.
+ ELProcessor processor = new ELProcessor();
+ processor.defineBean("arr", new int[0]);
+ Boolean result = processor.eval("not empty arr");
+ Assert.assertEquals(Boolean.FALSE, result);
+ }
+
+
+ @Test
+ public void test04() {
+ ELProcessor processor = new ELProcessor();
+ processor.defineBean("arr", new int[] { 1, 2 });
+ Boolean result = processor.eval("not empty arr");
+ Assert.assertEquals(Boolean.TRUE, result);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org