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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]