FREEMARKER-109: In JSP TLD-s, line breaks inside a function parameter lists have caused IllegalArgumentException Invalid function signature.
Project: http://git-wip-us.apache.org/repos/asf/freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/freemarker/commit/022714ad Tree: http://git-wip-us.apache.org/repos/asf/freemarker/tree/022714ad Diff: http://git-wip-us.apache.org/repos/asf/freemarker/diff/022714ad Branch: refs/heads/2.3-gae Commit: 022714ad67a46cb552e480b958550c2a77e07480 Parents: db4cb24 Author: ddekany <ddek...@apache.org> Authored: Tue Nov 27 20:38:25 2018 +0100 Committer: ddekany <ddek...@apache.org> Committed: Tue Nov 27 20:38:25 2018 +0100 ---------------------------------------------------------------------- .../freemarker/ext/jsp/TaglibMethodUtil.java | 11 +++-- src/manual/en_US/book.xml | 10 +++- .../java/freemarker/ext/jsp/TLDParsingTest.java | 52 ++++++++++++++------ .../freemarker/ext/jsp/TLDParsingTest.tld | 12 +++++ 4 files changed, 63 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/freemarker/blob/022714ad/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java b/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java index 8ce1b05..ab1effb 100644 --- a/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java +++ b/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java @@ -33,7 +33,7 @@ final class TaglibMethodUtil { } private static final Pattern FUNCTION_SIGNATURE_PATTERN = - Pattern.compile("^([\\w\\.]+(\\s*\\[\\s*\\])?)\\s+([\\w]+)\\s*\\((.*)\\)$"); + Pattern.compile("^([\\w\\.]+(\\s*\\[\\s*\\])?)\\s+(\\w+)\\s*\\((.*)\\)$", Pattern.DOTALL); private static final Pattern FUNCTION_PARAMETER_PATTERN = Pattern.compile("^([\\w\\.]+)(\\s*\\[\\s*\\])?$"); @@ -46,12 +46,13 @@ final class TaglibMethodUtil { * @param signature Java Server Page (TM) Specification compliant function signature string. * @return method if found. */ - public static Method getMethodByFunctionSignature(Class clazz, String signature) + static Method getMethodByFunctionSignature(Class clazz, String signature) throws SecurityException, NoSuchMethodException, ClassNotFoundException { Matcher m1 = FUNCTION_SIGNATURE_PATTERN.matcher(signature); if (!m1.matches()) { - throw new IllegalArgumentException("Invalid function signature."); + throw new IllegalArgumentException("Invalid function signature (doesn't match this pattern: " + + FUNCTION_SIGNATURE_PATTERN + ")"); } String methodName = m1.group(3); @@ -72,9 +73,9 @@ final class TaglibMethodUtil { for (int i = 0; i < paramsArray.length; i++) { token = paramsArray[i].trim(); m2 = FUNCTION_PARAMETER_PATTERN.matcher(token); - if (!m2.matches()) { - throw new IllegalArgumentException("Invalid argument signature: '" + token + "'."); + throw new IllegalArgumentException("Invalid argument signature (doesn't match pattern " + + FUNCTION_PARAMETER_PATTERN + "): " + token); } paramType = m2.group(1); http://git-wip-us.apache.org/repos/asf/freemarker/blob/022714ad/src/manual/en_US/book.xml ---------------------------------------------------------------------- diff --git a/src/manual/en_US/book.xml b/src/manual/en_US/book.xml index 1ea161b..e774e8c 100644 --- a/src/manual/en_US/book.xml +++ b/src/manual/en_US/book.xml @@ -30,7 +30,7 @@ <titleabbrev>Manual</titleabbrev> - <productname>Freemarker 2.3.28</productname> + <productname>Freemarker 2.3.29</productname> </info> <preface role="index.html" xml:id="preface"> @@ -27634,6 +27634,14 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> <itemizedlist> <listitem> <para><link + xlink:href="https://issues.apache.org/jira/browse/FREEMARKER-109">FREEMARKER-109</link>: + In JSP TLD-s, line breaks inside a function parameter lists have + caused <literal>IllegalArgumentException</literal> + <quote>Invalid function signature</quote>.</para> + </listitem> + + <listitem> + <para><link xlink:href="https://issues.apache.org/jira/browse/FREEMARKER-104">FREEMARKER-104</link>: More helpful log and error messages (especially, no <literal>NullPointerException</literal> cause exception logged http://git-wip-us.apache.org/repos/asf/freemarker/blob/022714ad/src/test/java/freemarker/ext/jsp/TLDParsingTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/freemarker/ext/jsp/TLDParsingTest.java b/src/test/java/freemarker/ext/jsp/TLDParsingTest.java index ab45f07..37d2cb3 100644 --- a/src/test/java/freemarker/ext/jsp/TLDParsingTest.java +++ b/src/test/java/freemarker/ext/jsp/TLDParsingTest.java @@ -41,9 +41,10 @@ import org.xml.sax.XMLReader; import freemarker.ext.beans.BeansWrapper; import freemarker.ext.beans.BeansWrapperBuilder; +import freemarker.template.SimpleNumber; import freemarker.template.SimpleScalar; import freemarker.template.TemplateMethodModelEx; -import freemarker.template.TemplateModel; +import freemarker.template.TemplateNumberModel; import freemarker.template.TemplateScalarModel; import freemarker.template.Version; @@ -79,21 +80,36 @@ public class TLDParsingTest { assertTrue(tldParser.getListeners().get(0) instanceof ExampleContextListener); Map tagsAndFunctions = tldParser.getTagsAndFunctions(); - assertEquals(4, tagsAndFunctions.size()); - - JspTagModelBase tag = (JspTagModelBase) tagsAndFunctions.get("setStringAttributeTag"); - assertNotNull(tag); - tag = (JspTagModelBase) tagsAndFunctions.get("setStringAttributeTag2"); - assertNotNull(tag); - - TemplateMethodModelEx function = (TemplateMethodModelEx) tagsAndFunctions.get("toUpperCase"); - assertNotNull(function); - TemplateScalarModel result = (TemplateScalarModel) function.exec(Arrays.asList(new TemplateModel [] { new SimpleScalar("abc") })); - assertEquals("ABC", result.getAsString()); - function = (TemplateMethodModelEx) tagsAndFunctions.get("toUpperCase2"); - assertNotNull(function); - result = (TemplateScalarModel) function.exec(Arrays.asList(new TemplateModel [] { new SimpleScalar("abc") })); - assertEquals("ABC", result.getAsString()); + assertEquals(5, tagsAndFunctions.size()); + + { + JspTagModelBase tag = (JspTagModelBase) tagsAndFunctions.get("setStringAttributeTag"); + assertNotNull(tag); + tag = (JspTagModelBase) tagsAndFunctions.get("setStringAttributeTag2"); + assertNotNull(tag); + } + + { + TemplateMethodModelEx function = (TemplateMethodModelEx) tagsAndFunctions.get("toUpperCase"); + assertNotNull(function); + TemplateScalarModel result = (TemplateScalarModel) function.exec(Arrays.asList(new SimpleScalar("abc"))); + assertEquals("ABC", result.getAsString()); + } + + { + TemplateMethodModelEx function = (TemplateMethodModelEx) tagsAndFunctions.get("toUpperCase2"); + assertNotNull(function); + TemplateScalarModel result = (TemplateScalarModel) function.exec(Arrays.asList(new SimpleScalar("abc"))); + assertEquals("ABC", result.getAsString()); + } + + { + TemplateMethodModelEx function = (TemplateMethodModelEx) tagsAndFunctions.get("add3"); + assertNotNull(function); + TemplateNumberModel result = (TemplateNumberModel) function.exec(Arrays.asList( + new SimpleNumber(1), new SimpleNumber(2), new SimpleNumber(3))); + assertEquals(6, result.getAsNumber()); + } } public static class StringFunctions { @@ -104,6 +120,10 @@ public class TLDParsingTest { public static String toUpperCase(String source) { return source.toUpperCase(); } + + public static int add3(int x, int y, int z) { + return x + y + z; + } } public static class SetStringAttributeTag extends TagSupport { http://git-wip-us.apache.org/repos/asf/freemarker/blob/022714ad/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld ---------------------------------------------------------------------- diff --git a/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld b/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld index 1f7e049..52e277b 100644 --- a/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld +++ b/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld @@ -86,4 +86,16 @@ <function-signature>String toUpperCase(java.lang.String)</function-signature> </function> + <function> + <name>add3</name> + <function-class>freemarker.ext.jsp.TLDParsingTest$StringFunctions</function-class> + <function-signature> + int add3 ( + int , + int, + int + ) + </function-signature> + </function> + </taglib>