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

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new 4e18c3ba15 Add support for the length attribute to ArrayELResolver
4e18c3ba15 is described below

commit 4e18c3ba15900ba1336185811b3159bf7760afef
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Apr 12 22:25:19 2023 +0100

    Add support for the length attribute to ArrayELResolver
---
 java/jakarta/el/ArrayELResolver.java            |  5 +++
 test/org/apache/el/TestValueExpressionImpl.java | 56 +++++++++++++++++++++++++
 test/org/apache/el/TesterBeanA.java             |  9 ++++
 webapps/docs/changelog.xml                      |  5 +++
 4 files changed, 75 insertions(+)

diff --git a/java/jakarta/el/ArrayELResolver.java 
b/java/jakarta/el/ArrayELResolver.java
index f256a069a6..88176320ed 100644
--- a/java/jakarta/el/ArrayELResolver.java
+++ b/java/jakarta/el/ArrayELResolver.java
@@ -24,6 +24,8 @@ import java.util.Objects;
  */
 public class ArrayELResolver extends ELResolver {
 
+    private static final String LENGTH_PROPERTY_NAME = "length";
+
     private final boolean readOnly;
 
     /**
@@ -73,6 +75,9 @@ public class ArrayELResolver extends ELResolver {
 
         if (base != null && base.getClass().isArray()) {
             context.setPropertyResolved(base, property);
+            if (LENGTH_PROPERTY_NAME.equals(property)) {
+                return Integer.valueOf(Array.getLength(base));
+            }
             int idx = coerce(property);
             if (idx < 0 || idx >= Array.getLength(base)) {
                 return null;
diff --git a/test/org/apache/el/TestValueExpressionImpl.java 
b/test/org/apache/el/TestValueExpressionImpl.java
index 4577bf2b5b..de56634df4 100644
--- a/test/org/apache/el/TestValueExpressionImpl.java
+++ b/test/org/apache/el/TestValueExpressionImpl.java
@@ -328,4 +328,60 @@ public class TestValueExpressionImpl extends ELBaseTest {
         Assert.assertNotNull(result);
         Assert.assertTrue(result.isEmpty());
     }
+
+
+    @Test
+    public void testArrayLength01() {
+        ExpressionFactory factory = ExpressionFactory.newInstance();
+        ELContext context = new ELContextImpl();
+
+        TesterBeanA beanA = new TesterBeanA();
+        beanA.setValArray(new String[3]);
+
+        ValueExpression var = factory.createValueExpression(beanA, 
TesterBeanA.class);
+        context.getVariableMapper().setVariable("beanA", var);
+
+        ValueExpression ve = factory.createValueExpression(context, 
"${beanA.valArray.length}", Integer.class);
+
+        // Check the result
+        Integer result = (Integer) ve.getValue(context);
+        Assert.assertEquals(Integer.valueOf(3), result);
+    }
+
+
+    @Test
+    public void testArrayLength02() {
+        ExpressionFactory factory = ExpressionFactory.newInstance();
+        ELContext context = new ELContextImpl();
+
+        TesterBeanA beanA = new TesterBeanA();
+        beanA.setValArray(new String[0]);
+
+        ValueExpression var = factory.createValueExpression(beanA, 
TesterBeanA.class);
+        context.getVariableMapper().setVariable("beanA", var);
+
+        ValueExpression ve = factory.createValueExpression(context, 
"${beanA.valArray.length}", Integer.class);
+
+        // Check the result
+        Integer result = (Integer) ve.getValue(context);
+        Assert.assertEquals(Integer.valueOf(0), result);
+    }
+
+
+    @Test
+    public void testArrayLength03() {
+        ExpressionFactory factory = ExpressionFactory.newInstance();
+        ELContext context = new ELContextImpl();
+
+        TesterBeanA beanA = new TesterBeanA();
+
+        ValueExpression var = factory.createValueExpression(beanA, 
TesterBeanA.class);
+        context.getVariableMapper().setVariable("beanA", var);
+
+        ValueExpression ve = factory.createValueExpression(context, 
"${beanA.valArray.length}", Integer.class);
+
+        // Check the result
+        Integer result = (Integer) ve.getValue(context);
+        Assert.assertNull(result);
+    }
 }
diff --git a/test/org/apache/el/TesterBeanA.java 
b/test/org/apache/el/TesterBeanA.java
index 6e87d8887f..5557ae0ece 100644
--- a/test/org/apache/el/TesterBeanA.java
+++ b/test/org/apache/el/TesterBeanA.java
@@ -23,6 +23,7 @@ public class TesterBeanA {
     private String name;
     private long valLong;
     private List<?> valList;
+    private Object[] valArray;
 
     public TesterBeanB getBean() {
         return bean;
@@ -56,6 +57,14 @@ public class TesterBeanA {
         this.valList = valList;
     }
 
+    public Object[] getValArray() {
+        return valArray;
+    }
+
+    public void setValArray(Object[] valArray) {
+        this.valArray = valArray;
+    }
+
     public CharSequence echo1(CharSequence cs) {
         return "A1" + cs;
     }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 5c1bb952a3..6ebafe24c6 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -236,6 +236,11 @@
         <bug>66536</bug>: Fix parsing of tag files that meant that tag
         directives could be ignored for some tag files. (markt)
       </fix>
+      <add>
+        Align the EL implementation with the latest changes to the Jakarta EL
+        specification and add support for the length attribute to the
+        <code>ArrayElResolver</code>. (markt)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Cluster">


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to