Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 46EF5200BF7 for ; Mon, 5 Dec 2016 00:49:57 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 44099160B0E; Sun, 4 Dec 2016 23:49:57 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 6B05B160B25 for ; Mon, 5 Dec 2016 00:49:56 +0100 (CET) Received: (qmail 58394 invoked by uid 500); 4 Dec 2016 23:49:55 -0000 Mailing-List: contact notifications-help@freemarker.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@freemarker.incubator.apache.org Delivered-To: mailing list notifications@freemarker.incubator.apache.org Received: (qmail 58385 invoked by uid 99); 4 Dec 2016 23:49:55 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 04 Dec 2016 23:49:55 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 29B1CC036D for ; Sun, 4 Dec 2016 23:49:55 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -6.219 X-Spam-Level: X-Spam-Status: No, score=-6.219 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-2.999] autolearn=disabled Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id c53NXjTRJO14 for ; Sun, 4 Dec 2016 23:49:53 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with SMTP id A5B125F36D for ; Sun, 4 Dec 2016 23:49:52 +0000 (UTC) Received: (qmail 58321 invoked by uid 99); 4 Dec 2016 23:49:51 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 04 Dec 2016 23:49:51 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id C638DE9411; Sun, 4 Dec 2016 23:49:51 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ddekany@apache.org To: notifications@freemarker.incubator.apache.org Date: Sun, 04 Dec 2016 23:49:52 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [2/2] incubator-freemarker git commit: FREEMARKER-42: ?first now works with FTL collections (things that can be listed but doesn't support getting items by index), not only with sequences. The practical importance of this is that ?first now always works archived-at: Sun, 04 Dec 2016 23:49:57 -0000 FREEMARKER-42: ?first now works with FTL collections (things that can be listed but doesn't support getting items by index), not only with sequences. The practical importance of this is that ?first now always works on Java Set-s (which is useful for Set-s with well defined ordering), while earlier it has failed depending on the object_wrapper configuration setting. Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/496ddfbc Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/496ddfbc Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/496ddfbc Branch: refs/heads/2.3-gae Commit: 496ddfbc08c6d3242ab5c31694db152d9c1e4c58 Parents: ed403c8 Author: ddekany Authored: Mon Dec 5 00:49:38 2016 +0100 Committer: ddekany Committed: Mon Dec 5 00:49:38 2016 +0100 ---------------------------------------------------------------------- .../freemarker/core/BuiltInsForSequences.java | 33 ++++++++++-- src/manual/en_US/book.xml | 57 ++++++++++++++++++-- .../test/templatesuite/TemplateTestCase.java | 1 + .../expected/sequence-builtins.txt | 7 +++ .../templates/sequence-builtins.ftl | 8 ++- 5 files changed, 98 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/496ddfbc/src/main/java/freemarker/core/BuiltInsForSequences.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/BuiltInsForSequences.java b/src/main/java/freemarker/core/BuiltInsForSequences.java index a12d274..d56a95f 100644 --- a/src/main/java/freemarker/core/BuiltInsForSequences.java +++ b/src/main/java/freemarker/core/BuiltInsForSequences.java @@ -138,15 +138,40 @@ class BuiltInsForSequences { } - static class firstBI extends BuiltInForSequence { + static class firstBI extends BuiltIn { + @Override - TemplateModel calculateResult(TemplateSequenceModel tsm) + TemplateModel _eval(Environment env) + throws TemplateException { + TemplateModel model = target.eval(env); + // In 2.3.x only, we prefer TemplateSequenceModel for + // backward compatibility. In 2.4.x, we prefer TemplateCollectionModel. + if (model instanceof TemplateSequenceModel && !isBuggySeqButGoodCollection(model)) { + return calculateResultForSequence((TemplateSequenceModel) model); + } else if (model instanceof TemplateCollectionModel) { + return calculateResultForColletion((TemplateCollectionModel) model); + } else { + throw new NonSequenceOrCollectionException(target, model, env); + } + } + + private TemplateModel calculateResultForSequence(TemplateSequenceModel seq) throws TemplateModelException { - if (tsm.size() == 0) { + if (seq.size() == 0) { + return null; + } + return seq.get(0); + } + + private TemplateModel calculateResultForColletion(TemplateCollectionModel coll) + throws TemplateModelException { + TemplateModelIterator iter = coll.iterator(); + if (!iter.hasNext()) { return null; } - return tsm.get(0); + return iter.next(); } + } static class joinBI extends BuiltIn { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/496ddfbc/src/manual/en_US/book.xml ---------------------------------------------------------------------- diff --git a/src/manual/en_US/book.xml b/src/manual/en_US/book.xml index e592d47..4adf154 100644 --- a/src/manual/en_US/book.xml +++ b/src/manual/en_US/book.xml @@ -30,7 +30,7 @@ Manual - Freemarker 2.3.25 + Freemarker 2.3.26 @@ -16416,8 +16416,19 @@ N first built-in - The first subvariable of the sequence. Template processing - will die with error if the sequence is empty. + Returns the first item of the sequence. Thus + value?first is the + same as value[0], + except that, since FreeMarker 2.3.26, + value?first also works + if value doesn't + support getting items with numerical index, but still supports to be + listed (i.e., with FTL collection values). + + If the sequence or collection is empty, the result will be a + missing value (as in + empty?first!'No item was + found').
@@ -26603,6 +26614,46 @@ TemplateModel x = env.getVariable("x"); // get variable x Version history +
+ 2.3.26 (incubating at Apache) + + Release date: FIXME + + This is a stable, final + release. The incubating suffix is required + by the Apache Software Foundation until the project becomes a fully + accepted (graduated) Apache project. + +
+ Changes on the FTL side + + + + Bug fixed (FREEMARKER-42): + ?first now works with FTL collections (things + that can be listed but doesn't support getting items by index), + not only with sequences. The practical importance of this is + that ?first now always works on Java + Set-s (which is useful for + Set-s with well defined ordering), while + earlier it has failed depending on the + object_wrapper configuration setting. + + +
+ +
+ Changes on the Java side + + + + FIXME + + +
+
+
2.3.25 (incubating at Apache) http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/496ddfbc/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java ---------------------------------------------------------------------- diff --git a/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java b/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java index dfac6b3..24b67f8 100644 --- a/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java +++ b/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java @@ -377,6 +377,7 @@ public class TemplateTestCase extends FileTestCase { abcSet.add("b"); abcSet.add("c"); dataModel.put("abcSet", abcSet); + dataModel.put("abcSetNonSeq", DefaultNonListCollectionAdapter.adapt(abcSet, beansWrapper)); List listWithNull = new ArrayList(); listWithNull.add("a"); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/496ddfbc/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt ---------------------------------------------------------------------- diff --git a/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt b/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt index 664c95b..1201da9 100644 --- a/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt +++ b/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt @@ -395,3 +395,10 @@ Join - (empty) - a, b, c. - a, b, c. + + +Misc +---- + +First of set 1: a +First of set 2: a \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/496ddfbc/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl ---------------------------------------------------------------------- diff --git a/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl b/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl index c431048..1586ad9 100644 --- a/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl +++ b/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl @@ -351,4 +351,10 @@ Join - ${listWithNullsOnly?join(", ", "(empty)", ".")} - ${abcSet?join(", ", "(empty)", ".")} - ${abcCollection?join(", ", "(empty)", ".")} -<@assertFails message="index 1">${['a', [], 'c']?join(", ", "(empty)", ".")} \ No newline at end of file +<@assertFails message="index 1">${['a', [], 'c']?join(", ", "(empty)", ".")} + +Misc +---- + +First of set 1: ${abcSet?first} +First of set 2: ${abcSetNonSeq?first} \ No newline at end of file