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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org