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