You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2023/01/23 20:27:04 UTC
[tomcat] 02/03: Fix BZ 66419 - handle varargs call with single argument
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit b6f1bef80061e6b851a894f2f1372f98e6484578
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Jan 23 19:54:46 2023 +0000
Fix BZ 66419 - handle varargs call with single argument
---
java/org/apache/el/parser/AstFunction.java | 11 ++++++++++-
test/org/apache/el/parser/TestAstFunction.java | 22 ++++++++++++++++++++++
webapps/docs/changelog.xml | 8 ++++++++
3 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/java/org/apache/el/parser/AstFunction.java b/java/org/apache/el/parser/AstFunction.java
index 833468e9d5..1e6eeacc34 100644
--- a/java/org/apache/el/parser/AstFunction.java
+++ b/java/org/apache/el/parser/AstFunction.java
@@ -162,7 +162,7 @@ public final class AstFunction extends SimpleNode {
if (m.isVarArgs() && i == methodParameterCount - 1) {
if (inputParameterCount < methodParameterCount) {
params[i] = new Object[] { null };
- } else if (inputParameterCount == methodParameterCount && paramTypes[i].isArray()) {
+ } else if (inputParameterCount == methodParameterCount && isArray(parameters.jjtGetChild(i).getValue(ctx))) {
params[i] = parameters.jjtGetChild(i).getValue(ctx);
} else {
Object[] varargs = new Object[inputParameterCount - methodParameterCount + 1];
@@ -199,6 +199,15 @@ public final class AstFunction extends SimpleNode {
return result;
}
+
+ private boolean isArray(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ return obj.getClass().isArray();
+ }
+
+
public void setLocalName(String localName) {
this.localName = localName;
}
diff --git a/test/org/apache/el/parser/TestAstFunction.java b/test/org/apache/el/parser/TestAstFunction.java
index 70a2a22f61..138ecade40 100644
--- a/test/org/apache/el/parser/TestAstFunction.java
+++ b/test/org/apache/el/parser/TestAstFunction.java
@@ -16,7 +16,10 @@
*/
package org.apache.el.parser;
+import javax.el.ELContext;
import javax.el.ELProcessor;
+import javax.el.ExpressionFactory;
+import javax.el.StandardELContext;
import org.junit.Assert;
import org.junit.Test;
@@ -37,4 +40,23 @@ public class TestAstFunction {
Object result = processor.getValue("valueOf(1000)", Integer.class);
Assert.assertEquals(Integer.valueOf(1000), result);
}
+
+ @Test
+ public void testVarargMethod() throws NoSuchMethodException, SecurityException {
+ ExpressionFactory factory = ExpressionFactory.newInstance();
+ ELContext context = new StandardELContext(factory);
+ context.getFunctionMapper().mapFunction("fn", "format",
+ String.class.getMethod("format", String.class, Object[].class));
+
+ //Object result = factory.createValueExpression(context, "${fn:format('%s-%s','one','two')}", String.class)
+ // .getValue(context);
+ //Assert.assertEquals("one-two", result);
+
+ Object result = factory.createValueExpression(context, "${fn:format('%s-%s','one,two'.split(','))}", String.class)
+ .getValue(context);
+ Assert.assertEquals("one-two", result);
+
+ result = factory.createValueExpression(context, "${fn:format('%s','one')}", String.class).getValue(context);
+ Assert.assertEquals("one", result);
+ }
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index ded49284b6..c8b34cd1e8 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -121,6 +121,14 @@
</add>
</changelog>
</subsection>
+ <subsection name="Jasper">
+ <changelog>
+ <fix>
+ <bug>66419</bug>: Fix calls from expression language to a method that
+ accepts varargs when only one argument was passed. (markt)
+ </fix>
+ </changelog>
+ </subsection>
<subsection name="Other">
<changelog>
<update>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org