Author: markt Date: Thu Dec 1 15:29:28 2016 New Revision: 1772229 URL: http://svn.apache.org/viewvc?rev=1772229&view=rev Log: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=60431 Improve handling of varargs in UEL expressions. Based on a patch by Ben.
Added: tomcat/trunk/test/webapp/bug6nnnn/bug60431.jsp (with props) Modified: tomcat/trunk/java/org/apache/el/parser/AstFunction.java tomcat/trunk/test/org/apache/el/TestELEvaluation.java tomcat/trunk/test/org/apache/el/TestELInJsp.java tomcat/trunk/test/org/apache/el/TesterFunctions.java tomcat/trunk/test/webapp/WEB-INF/test.tld tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/el/parser/AstFunction.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstFunction.java?rev=1772229&r1=1772228&r2=1772229&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/parser/AstFunction.java (original) +++ tomcat/trunk/java/org/apache/el/parser/AstFunction.java Thu Dec 1 15:29:28 2016 @@ -163,13 +163,18 @@ public final class AstFunction extends S Object result = null; int inputParameterCount = parameters.jjtGetNumChildren(); int methodParameterCount = paramTypes.length; - if (inputParameterCount > 0) { + if (inputParameterCount == 0 && methodParameterCount == 1 && m.isVarArgs()) { + params = new Object[] { null }; + } else if (inputParameterCount > 0) { params = new Object[methodParameterCount]; try { for (int i = 0; i < methodParameterCount; i++) { if (m.isVarArgs() && i == methodParameterCount - 1) { if (inputParameterCount < methodParameterCount) { - params[i] = null; + params[i] = new Object[] { null }; + } else if (inputParameterCount == methodParameterCount && + paramTypes[i].isArray()) { + params[i] = parameters.jjtGetChild(i).getValue(ctx); } else { Object[] varargs = new Object[inputParameterCount - methodParameterCount + 1]; @@ -179,12 +184,11 @@ public final class AstFunction extends S varargs[j-i] = coerceToType(ctx, varargs[j-i], target); } params[i] = varargs; - params[i] = coerceToType(ctx, params[i], paramTypes[i]); } } else { params[i] = parameters.jjtGetChild(i).getValue(ctx); - params[i] = coerceToType(ctx, params[i], paramTypes[i]); } + params[i] = coerceToType(ctx, params[i], paramTypes[i]); } } catch (ELException ele) { throw new ELException(MessageFactory.get("error.function", this Modified: tomcat/trunk/test/org/apache/el/TestELEvaluation.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/TestELEvaluation.java?rev=1772229&r1=1772228&r2=1772229&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/TestELEvaluation.java (original) +++ tomcat/trunk/test/org/apache/el/TestELEvaluation.java Thu Dec 1 15:29:28 2016 @@ -231,6 +231,30 @@ public class TestELEvaluation { Assert.assertEquals("$2", evaluateExpression("$#{1+1}")); } + @Test + public void testBug60431a() { + Assert.assertEquals("OK", evaluateExpression("${fn:concat('O','K')}")); + } + + @Test + public void testBug60431b() { + Assert.assertEquals("OK", evaluateExpression("${fn:concat(fn:toArray('O','K'))}")); + } + + @Test + public void testBug60431c() { + Assert.assertEquals("", evaluateExpression("${fn:concat()}")); + } + + @Test + public void testBug60431d() { + Assert.assertEquals("OK", evaluateExpression("${fn:concat2('OK')}")); + } + + @Test + public void testBug60431e() { + Assert.assertEquals("RUOK", evaluateExpression("${fn:concat2('RU', fn:toArray('O','K'))}")); + } // ************************************************************************ Modified: tomcat/trunk/test/org/apache/el/TestELInJsp.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/TestELInJsp.java?rev=1772229&r1=1772228&r2=1772229&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/TestELInJsp.java (original) +++ tomcat/trunk/test/org/apache/el/TestELInJsp.java Thu Dec 1 15:29:28 2016 @@ -499,6 +499,17 @@ public class TestELInJsp extends TomcatB } + @Test + public void testBug60431() throws Exception { + getTomcatInstanceTestWebapp(false, true); + + ByteChunk res = getUrl("http://localhost:" + getPort() + "/test/bug6nnnn/bug60431.jsp"); + String result = res.toString(); + assertEcho(result, "01-OK"); + assertEcho(result, "02-OK"); + } + + // Assertion for text contained with <p></p>, e.g. printed by tags:echo private static void assertEcho(String result, String expected) { Assert.assertTrue(result, result.indexOf("<p>" + expected + "</p>") > 0); Modified: tomcat/trunk/test/org/apache/el/TesterFunctions.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/TesterFunctions.java?rev=1772229&r1=1772228&r2=1772229&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/TesterFunctions.java (original) +++ tomcat/trunk/test/org/apache/el/TesterFunctions.java Thu Dec 1 15:29:28 2016 @@ -37,6 +37,18 @@ public class TesterFunctions { return result.toString(); } + public static String concat2(String prefix, String... inputs) { + StringBuilder result = new StringBuilder(prefix); + for (String input : inputs) { + result.append(input); + } + return result.toString(); + } + + public static String[] toArray(String a, String b) { + return new String[] { a, b }; + } + public static class Inner$Class { @@ -58,6 +70,36 @@ public class TesterFunctions { return m; } catch (SecurityException e) { // Ignore + } catch (NoSuchMethodException e) { + // Ignore + } + } else if ("concat".equals(localName)) { + Method m; + try { + m = TesterFunctions.class.getMethod("concat", String[].class); + return m; + } catch (SecurityException e) { + // Ignore + } catch (NoSuchMethodException e) { + // Ignore + } + } else if ("concat2".equals(localName)) { + Method m; + try { + m = TesterFunctions.class.getMethod("concat2", String.class, String[].class); + return m; + } catch (SecurityException e) { + // Ignore + } catch (NoSuchMethodException e) { + // Ignore + } + } else if ("toArray".equals(localName)) { + Method m; + try { + m = TesterFunctions.class.getMethod("toArray", String.class, String.class); + return m; + } catch (SecurityException e) { + // Ignore } catch (NoSuchMethodException e) { // Ignore } Modified: tomcat/trunk/test/webapp/WEB-INF/test.tld URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/WEB-INF/test.tld?rev=1772229&r1=1772228&r2=1772229&view=diff ============================================================================== --- tomcat/trunk/test/webapp/WEB-INF/test.tld (original) +++ tomcat/trunk/test/webapp/WEB-INF/test.tld Thu Dec 1 15:29:28 2016 @@ -40,4 +40,12 @@ </function-signature> </function> + <function> + <name>toArray</name> + <function-class>org.apache.el.TesterFunctions</function-class> + <function-signature> + java.lang.String toArray(java.lang.String,java.lang.String) + </function-signature> + </function> + </taglib> \ No newline at end of file Added: tomcat/trunk/test/webapp/bug6nnnn/bug60431.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/bug6nnnn/bug60431.jsp?rev=1772229&view=auto ============================================================================== --- tomcat/trunk/test/webapp/bug6nnnn/bug60431.jsp (added) +++ tomcat/trunk/test/webapp/bug6nnnn/bug60431.jsp Thu Dec 1 15:29:28 2016 @@ -0,0 +1,25 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib uri="http://tomcat.apache.org/testerFunctions" prefix="fn" %> +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> +<html> + <head><title>Bug 60431 test case</title></head> + <body> + <tags:echo echo="${'01-' += fn:concat('O', 'K')}"/> + <tags:echo echo="${'02-' += fn:concat(fn:toArray('O', 'K'))}"/> + </body> +</html> \ No newline at end of file Propchange: tomcat/trunk/test/webapp/bug6nnnn/bug60431.jsp ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1772229&r1=1772228&r2=1772229&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Thu Dec 1 15:29:28 2016 @@ -192,6 +192,14 @@ </fix> </changelog> </subsection> + <subsection name="Jasper"> + <changelog> + <fix> + <bug>60431</bug>: Improve handling of varargs in UEL expressions. Based + on a patch by Ben. (markt) + </fix> + </changelog> + </subsection> <subsection name="Web applications"> <changelog> <fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org