This is an automated email from the ASF dual-hosted git repository.

rmaucher pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 875c8630e84a3ba316efe79ad6eaeb5fc5a6f0df
Author: opencode <[email protected]>
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 e3c38dcf3f..c798b94412 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;
 
@@ -53,7 +54,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()) {
             return RETURN_EMPTY;
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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to