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 8c6f2972be Fix BZ 66419 - handle varargs call with single argument 8c6f2972be is described below commit 8c6f2972beb5f4c7809dddf5633b696e3f069b4a 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 4d67cfec36..bac8db1be9 100644 --- a/java/org/apache/el/parser/AstFunction.java +++ b/java/org/apache/el/parser/AstFunction.java @@ -163,7 +163,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]; @@ -200,6 +200,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 5697f020e3..4b3a6572bd 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 jakarta.el.ELContext; import jakarta.el.ELProcessor; +import jakarta.el.ExpressionFactory; +import jakarta.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 fec228945e..9fba57e37f 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -148,6 +148,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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org