freemarker.core.MessageUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of freemarker-gae Show documentation
Show all versions of freemarker-gae Show documentation
Google App Engine compliant variation of FreeMarker.
FreeMarker is a "template engine"; a generic tool to generate text output based on templates.
/*
* Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky
*
* Licensed 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.
*/
package freemarker.core;
import java.util.ArrayList;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.utility.StringUtil;
/**
* Utilities for creating error messages (and other messages).
*/
class MessageUtil {
static final String UNKNOWN_DATE_TO_STRING_ERROR_MESSAGE
= "Can't convert the date-like value to string because it isn't "
+ "known if it's a date (no time part), time or date-time value.";
static final String UNKNOWN_DATE_TYPE_ERROR_TIP =
"Use ?date, ?time, or ?datetime to tell FreeMarker the exact type.";
static final String[] UNKNOWN_DATE_TO_STRING_TIPS = new String[] {
UNKNOWN_DATE_TYPE_ERROR_TIP,
"If you need a particular format only once, use ?string(pattern), like ?string('dd.MM.yyyy HH:mm:ss'), "
+ "to specify which fields to display. "
};
static final String EMBEDDED_MESSAGE_BEGIN = "---begin-message---\n";
static final String EMBEDDED_MESSAGE_END = "\n---end-message---";
// Can't be instantiated
private MessageUtil() { }
static String formatLocationForSimpleParsingError(Template template, int line, int column) {
return formatLocation("in", template, line, column);
}
static String formatLocationForSimpleParsingError(String templateName, int line, int column) {
return formatLocation("in", templateName, line, column);
}
static String formatLocationForDependentParsingError(Template template, int line, int column) {
return formatLocation("on", template, line, column);
}
static String formatLocationForDependentParsingError(String templateName, int line, int column) {
return formatLocation("on", templateName, line, column);
}
static String formatLocationForEvaluationError(Template template, int line, int column) {
return formatLocation("at", template, line, column);
}
static String formatLocationForEvaluationError(Macro macro, int line, int column) {
Template t = macro.getTemplate();
return formatLocation("at", t != null ? t.getName() : null, macro.getName(), macro.isFunction(), line, column);
}
static String formatLocationForEvaluationError(String templateName, int line, int column) {
return formatLocation("at", templateName, line, column);
}
private static String formatLocation(String preposition, Template template, int line, int column) {
return formatLocation(preposition, template != null ? template.getName() : null, line, column);
}
private static String formatLocation(String preposition, String templateName, int line, int column) {
return formatLocation(
preposition, templateName,
null, false,
line, column);
}
private static String formatLocation(
String preposition, String templateName,
String macroOrFuncName, boolean isFunction,
int line, int column) {
String templateDesc;
if (line < 0) {
templateDesc = "?eval-ed string";
line -= TemplateObject.RUNTIME_EVAL_LINE_DISPLACEMENT - 1;
macroOrFuncName = null;
} else {
templateDesc = templateName != null
? "template " + StringUtil.jQuoteNoXSS(templateName)
: "nameless template";
}
return "in " + templateDesc
+ (macroOrFuncName != null
? " in " + (isFunction ? "function " : "macro ") + StringUtil.jQuote(macroOrFuncName)
: "")
+ " "
+ preposition + " line " + line + ", column " + column;
}
/**
* Returns a single line string that is no longer than {@code maxLength}.
* If will truncate the string at line-breaks too.
* The truncation is always signaled with a a {@code "..."} at the end of the result string.
*/
static String shorten(String s, int maxLength) {
if (maxLength < 5) maxLength = 5;
boolean isTruncated = false;
int brIdx = s.indexOf('\n');
if (brIdx != -1) {
s = s.substring(0, brIdx);
isTruncated = true;
};
brIdx = s.indexOf('\r');
if (brIdx != -1) {
s = s.substring(0, brIdx);
isTruncated = true;
}
if (s.length() > maxLength) {
s = s.substring(0, maxLength - 3);
isTruncated = true;
}
if (!isTruncated) {
return s;
} else {
if (s.endsWith(".")) {
if (s.endsWith("..")) {
if (s.endsWith("...")) {
return s;
} else {
return s + ".";
}
} else {
return s + "..";
}
} else {
return s + "...";
}
}
}
static StringBuffer appendExpressionAsUntearable(StringBuffer sb, Expression argExp) {
boolean needParen =
!(argExp instanceof NumberLiteral)
&& !(argExp instanceof StringLiteral)
&& !(argExp instanceof BooleanLiteral)
&& !(argExp instanceof ListLiteral)
&& !(argExp instanceof HashLiteral)
&& !(argExp instanceof Identifier)
&& !(argExp instanceof Dot)
&& !(argExp instanceof DynamicKeyName)
&& !(argExp instanceof MethodCall)
&& !(argExp instanceof BuiltIn);
if (needParen) sb.append('(');
sb.append(argExp.getCanonicalForm());
if (needParen) sb.append(')');
return sb;
}
static TemplateModelException newArgCntError(String methodName, int argCnt, int expectedCnt) {
return newArgCntError(methodName, argCnt, expectedCnt, expectedCnt);
}
static TemplateModelException newArgCntError(String methodName, int argCnt, int minCnt, int maxCnt) {
ArrayList/*