Return-Path: X-Original-To: apmail-freemarker-notifications-archive@minotaur.apache.org Delivered-To: apmail-freemarker-notifications-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 0E93017A79 for ; Tue, 29 Sep 2015 00:06:00 +0000 (UTC) Received: (qmail 93368 invoked by uid 500); 29 Sep 2015 00:06:00 -0000 Delivered-To: apmail-freemarker-notifications-archive@freemarker.apache.org Received: (qmail 93352 invoked by uid 500); 29 Sep 2015 00:06:00 -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 93321 invoked by uid 99); 29 Sep 2015 00:05:59 -0000 Received: from Unknown (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 29 Sep 2015 00:05:59 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 8378FC6C1A for ; Tue, 29 Sep 2015 00:05:59 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.77 X-Spam-Level: * X-Spam-Status: No, score=1.77 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, T_RP_MATCHES_RCVD=-0.01] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id VPU4v-jNjbLM for ; Tue, 29 Sep 2015 00:05:58 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with SMTP id 43221206AE for ; Tue, 29 Sep 2015 00:05:58 +0000 (UTC) Received: (qmail 93263 invoked by uid 99); 29 Sep 2015 00:05:58 -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; Tue, 29 Sep 2015 00:05:58 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id CF045E0537; Tue, 29 Sep 2015 00:05:57 +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: Tue, 29 Sep 2015 00:05:57 -0000 Message-Id: <462a8bf3554a47bfbc6b817b2dc90dc3@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/5] incubator-freemarker git commit: Added checks against null returning (custom) TemplateValueFormat results. Minor cleanup and documentation additions in formatting related parts. Repository: incubator-freemarker Updated Branches: refs/heads/2.3 84927d91a -> 4b1550e78 Added checks against null returning (custom) TemplateValueFormat results. Minor cleanup and documentation additions in formatting related parts. Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/9ce036f5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/9ce036f5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/9ce036f5 Branch: refs/heads/2.3 Commit: 9ce036f5d78fef56a03b49f83e88379366f04c3e Parents: e90143c Author: ddekany Authored: Sat Sep 26 09:19:52 2015 +0200 Committer: ddekany Committed: Sat Sep 26 09:19:52 2015 +0200 ---------------------------------------------------------------------- .../freemarker/core/AddConcatExpression.java | 1 - .../core/BuiltInsForMultipleTypes.java | 2 +- .../java/freemarker/core/DollarVariable.java | 2 +- src/main/java/freemarker/core/Environment.java | 6 +-- src/main/java/freemarker/core/EvalUtil.java | 42 ++++++++++++++++---- .../freemarker/core/TemplateDateFormat.java | 2 + .../freemarker/core/TemplateNumberFormat.java | 2 + .../java/freemarker/ext/beans/BeanModel.java | 8 +++- 8 files changed, 50 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9ce036f5/src/main/java/freemarker/core/AddConcatExpression.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/AddConcatExpression.java b/src/main/java/freemarker/core/AddConcatExpression.java index c90cb19..f92b933 100644 --- a/src/main/java/freemarker/core/AddConcatExpression.java +++ b/src/main/java/freemarker/core/AddConcatExpression.java @@ -82,7 +82,6 @@ final class AddConcatExpression extends Expression { leftModel, leftExp, (String) null, markupOutputFormat, env); Object rightOMOrStr = EvalUtil.coerceModelToMarkupOutputOrString( rightModel, rightExp, (String) null, markupOutputFormat, env); - // TODO prove that neither can be null if (leftOMOrStr instanceof String) { if (rightOMOrStr instanceof String) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9ce036f5/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java b/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java index aaaaf97..deb88b2 100644 --- a/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java +++ b/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java @@ -578,7 +578,7 @@ class BuiltInsForMultipleTypes { throw new BugException(); } } - cachedValue = defaultFormat.formatToString(dateModel); + cachedValue = EvalUtil.formatResultNotNull(defaultFormat.formatToString(dateModel)); } catch (TemplateValueFormatException e) { try { throw MessageUtil.newCantFormatDateException(defaultFormat, target, e, true); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9ce036f5/src/main/java/freemarker/core/DollarVariable.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/DollarVariable.java b/src/main/java/freemarker/core/DollarVariable.java index 4331b51..23a995b 100644 --- a/src/main/java/freemarker/core/DollarVariable.java +++ b/src/main/java/freemarker/core/DollarVariable.java @@ -68,7 +68,7 @@ final class DollarVariable extends Interpolation { } else { out.write(s); } - } else { // moOrStr wasn't output yet + } else { final TemplateMarkupOutputModel mo = (TemplateMarkupOutputModel) moOrStr; final MarkupOutputFormat moOF = mo.getOutputFormat(); // ATTENTION: Keep this logic in sync. ?esc/?noEsc's logic! http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9ce036f5/src/main/java/freemarker/core/Environment.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/Environment.java b/src/main/java/freemarker/core/Environment.java index a1073c2..ca6d7b1 100644 --- a/src/main/java/freemarker/core/Environment.java +++ b/src/main/java/freemarker/core/Environment.java @@ -1049,7 +1049,7 @@ public final class Environment extends Configurable { boolean useTempModelExc) throws TemplateException { try { - return format.formatToString(number); + return EvalUtil.formatResultNotNull(format.formatToString(number)); } catch (TemplateValueFormatException e) { throw MessageUtil.newCantFormatNumberException(format, exp, e, useTempModelExc); } @@ -1324,7 +1324,7 @@ public final class Environment extends Configurable { TemplateDateFormat format = getTemplateDateFormat(tdm, tdmSourceExpr, useTempModelExc); try { - return format.formatToString(tdm); + return EvalUtil.formatResultNotNull(format.formatToString(tdm)); } catch (TemplateValueFormatException e) { throw MessageUtil.newCantFormatDateException(format, tdmSourceExpr, e, useTempModelExc); } @@ -1347,7 +1347,7 @@ public final class Environment extends Configurable { useTempModelExc); try { - return format.formatToString(tdm); + return EvalUtil.formatResultNotNull(format.formatToString(tdm)); } catch (TemplateValueFormatException e) { throw MessageUtil.newCantFormatDateException(format, blamedDateSourceExp, e, useTempModelExc); } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9ce036f5/src/main/java/freemarker/core/EvalUtil.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/EvalUtil.java b/src/main/java/freemarker/core/EvalUtil.java index c20dcff..6dfc68d 100644 --- a/src/main/java/freemarker/core/EvalUtil.java +++ b/src/main/java/freemarker/core/EvalUtil.java @@ -341,26 +341,32 @@ class EvalUtil { } } + /** + * @return Never {@code null} + */ static String coerceModelToString(TemplateModel tm, Expression exp, String seqHint, Environment env) throws TemplateException { if (tm instanceof TemplateNumberModel) { - return env.formatNumberToString((TemplateNumberModel) tm, exp, false); + return formatResultNotNull(env.formatNumberToString((TemplateNumberModel) tm, exp, false)); } else if (tm instanceof TemplateDateModel) { - return env.formatDateToString((TemplateDateModel) tm, exp, false); + return formatResultNotNull(env.formatDateToString((TemplateDateModel) tm, exp, false)); } else { return coerceModelToStringCommon(tm, exp, seqHint, false, env); } } + /** + * @return Never {@code null} + */ static Object coerceModelToMarkupOutputOrString(TemplateModel tm, Expression exp, String seqHint, MarkupOutputFormat markupOutputFormat, Environment env) throws TemplateException { if (tm instanceof TemplateNumberModel) { TemplateNumberModel tnm = (TemplateNumberModel) tm; TemplateNumberFormat format = env.getTemplateNumberFormat(exp, false); try { - return markupOutputFormat != null + return formatResultNotNull(markupOutputFormat != null ? format.formatToMarkupOrString(tnm, markupOutputFormat) - : format.formatToString(tnm); + : format.formatToString(tnm)); } catch (TemplateValueFormatException e) { throw MessageUtil.newCantFormatNumberException(format, exp, e, false); } @@ -368,9 +374,9 @@ class EvalUtil { TemplateDateModel tdm = (TemplateDateModel) tm; TemplateDateFormat format = env.getTemplateDateFormat(tdm, exp, false); try { - return markupOutputFormat != null + return formatResultNotNull(markupOutputFormat != null ? format.formatToMarkupOrString(tdm, markupOutputFormat) - : format.formatToString(tdm); + : format.formatToString(tdm)); } catch (TemplateValueFormatException e) { throw MessageUtil.newCantFormatDateException(format, exp, e, false); } @@ -382,11 +388,17 @@ class EvalUtil { } /** + * @param tm + * If {@code null} that's an exception, unless we are in classic compatible mode. + * * @param supportsTOM * Whether the caller {@code coerceModelTo...} method could handle a {@link TemplateMarkupOutputModel}. + * + * @return Never {@code null} */ - private static String coerceModelToStringCommon(TemplateModel tm, Expression exp, String seqHint, boolean supportsTOM, - Environment env) throws TemplateModelException, InvalidReferenceException, TemplateException, + private static String coerceModelToStringCommon( + TemplateModel tm, Expression exp, String seqHint, boolean supportsTOM, Environment env) + throws TemplateModelException, InvalidReferenceException, TemplateException, NonStringOrTemplateOutputException, NonStringException { if (tm instanceof TemplateScalarModel) { return modelToString((TemplateScalarModel) tm, exp, env); @@ -444,6 +456,20 @@ class EvalUtil { } } + static String formatResultNotNull(String r) { + if (r != null) { + return r; + } + throw new NullPointerException("TemplateValueFormatter result can't be null"); + } + + static Object formatResultNotNull(Object r) { + if (r != null) { + return r; + } + throw new NullPointerException("TemplateValueFormatter result can't be null"); + } + /** * Returns an {@link ArithmeticEngine} even if {@code env} is {@code null}, because we are in parsing phase. */ http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9ce036f5/src/main/java/freemarker/core/TemplateDateFormat.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/TemplateDateFormat.java b/src/main/java/freemarker/core/TemplateDateFormat.java index 6a6d66b..2f49d2d 100644 --- a/src/main/java/freemarker/core/TemplateDateFormat.java +++ b/src/main/java/freemarker/core/TemplateDateFormat.java @@ -62,6 +62,8 @@ public abstract class TemplateDateFormat extends TemplateValueFormat { * {@link #formatToString(TemplateDateModel)} escaped, it must return the {@link String} that * {@link #formatToString(TemplateDateModel)} does. * + *

The implementation in {@link TemplateDateFormat} simply calls {@link #formatToString(TemplateDateModel)}. + * * @param outputFormat * When the result is a {@link TemplateMarkupOutputModel} result, it must be exactly of this output * format. http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9ce036f5/src/main/java/freemarker/core/TemplateNumberFormat.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/core/TemplateNumberFormat.java b/src/main/java/freemarker/core/TemplateNumberFormat.java index eb75ea7..69a5da0 100644 --- a/src/main/java/freemarker/core/TemplateNumberFormat.java +++ b/src/main/java/freemarker/core/TemplateNumberFormat.java @@ -61,6 +61,8 @@ public abstract class TemplateNumberFormat extends TemplateValueFormat { * {@link #formatToString(TemplateNumberModel)} escaped, it must return the {@link String} that * {@link #formatToString(TemplateNumberModel)} does. * + *

The implementation in {@link TemplateNumberFormat} simply calls {@link #formatToString(TemplateNumberModel)}. + * * @param outputFormat * When the result is a {@link TemplateMarkupOutputModel} result, it must be exactly of this output * format. Not {@code null}. http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9ce036f5/src/main/java/freemarker/ext/beans/BeanModel.java ---------------------------------------------------------------------- diff --git a/src/main/java/freemarker/ext/beans/BeanModel.java b/src/main/java/freemarker/ext/beans/BeanModel.java index 090deab..26eb1f5 100644 --- a/src/main/java/freemarker/ext/beans/BeanModel.java +++ b/src/main/java/freemarker/ext/beans/BeanModel.java @@ -337,9 +337,15 @@ implements * In FreeMarker 1.7 (and also at least in 2.1) {@link BeanModel} was a {@link TemplateScalarModel}. Some internal * FreeMarker code tries to emulate FreeMarker classic by calling this method when a {@link TemplateScalarModel} is * expected. + * + * @return Never {@code null} */ String getAsClassicCompatibleString() { - return object == null ? "null" : object.toString(); + if (object == null) { + return "null"; + } + String s = object.toString(); + return s != null ? s : "null"; } @Override