You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2022/12/18 16:54:46 UTC
[freemarker] 02/03: FREEMARKER-198: To avoid deadlock when class initialization happens on multiple threads (like _TemplateAPI->DefaultObjectWrapper, and DefaultObjectWrapper->_TemplateAPI), factored out static fields from _TemplateAPI into their owns classes.
This is an automated email from the ASF dual-hosted git repository.
ddekany pushed a commit to branch 2.3-gae
in repository https://gitbox.apache.org/repos/asf/freemarker.git
commit 37b5b161a4ce5f2acdc3dac5c0beeade625048ba
Author: ddekany <dd...@apache.org>
AuthorDate: Sun Dec 18 17:19:00 2022 +0100
FREEMARKER-198: To avoid deadlock when class initialization happens on multiple threads (like _TemplateAPI->DefaultObjectWrapper, and DefaultObjectWrapper->_TemplateAPI), factored out static fields from _TemplateAPI into their owns classes.
---
src/main/java/freemarker/cache/TemplateCache.java | 5 +-
.../core/APINotSupportedTemplateException.java | 4 +-
.../java/freemarker/core/AddConcatExpression.java | 6 +-
.../java/freemarker/core/BuiltInsForDates.java | 3 +-
.../freemarker/core/BuiltInsForMultipleTypes.java | 7 +-
.../java/freemarker/core/BuiltInsForNodes.java | 4 +-
.../java/freemarker/core/BuiltInsForSequences.java | 6 +-
.../freemarker/core/BuiltInsForStringsBasic.java | 4 +-
.../core/BuiltInsForStringsEncoding.java | 4 +-
.../freemarker/core/BuiltInsForStringsRegexp.java | 4 +-
src/main/java/freemarker/core/BuiltinVariable.java | 4 +-
src/main/java/freemarker/core/Configurable.java | 3 +-
src/main/java/freemarker/core/DynamicKeyName.java | 12 +-
src/main/java/freemarker/core/Environment.java | 25 +-
src/main/java/freemarker/core/EvalUtil.java | 4 +-
.../freemarker/core/GetOptionalTemplateMethod.java | 4 +-
src/main/java/freemarker/core/HashLiteral.java | 12 +-
src/main/java/freemarker/core/Interpret.java | 4 +-
src/main/java/freemarker/core/JSONParser.java | 10 +-
src/main/java/freemarker/core/ListLiteral.java | 6 +-
src/main/java/freemarker/core/Macro.java | 6 +-
src/main/java/freemarker/core/Range.java | 3 +-
src/main/java/freemarker/core/RecurseNode.java | 4 +-
.../freemarker/core/TemplateConfiguration.java | 3 +-
src/main/java/freemarker/core/VisitNode.java | 4 +-
src/main/java/freemarker/core/_CoreAPI.java | 6 +-
.../java/freemarker/ext/ant/FreemarkerXmlTask.java | 4 +-
.../java/freemarker/ext/beans/BeansWrapper.java | 9 +-
.../ext/beans/BeansWrapperConfiguration.java | 3 +-
.../ext/beans/ClassIntrospectorBuilder.java | 7 +-
.../java/freemarker/ext/jdom/NodeListModel.java | 4 +-
.../freemarker/ext/jsp/FreeMarkerPageContext.java | 6 +-
.../freemarker/ext/servlet/InitParamParser.java | 6 +-
.../java/freemarker/template/Configuration.java | 6 +-
.../freemarker/template/DefaultObjectWrapper.java | 6 +-
.../DefaultObjectWrapperConfiguration.java | 4 +-
src/main/java/freemarker/template/Template.java | 4 +-
.../java/freemarker/template/_ObjectWrappers.java | 58 ++++
.../java/freemarker/template/_TemplateAPI.java | 53 +---
.../java/freemarker/template/_VersionInts.java | 50 +++
.../freemarker/template/utility/DOMNodeModel.java | 4 +-
.../template/utility/TemplateModelUtils.java | 6 +-
src/main/javacc/FTL.jj | 352 ++++++++++-----------
.../freemarker/template/ConfigurationTest.java | 2 +-
.../template/DefaultObjectWrapperTest.java | 2 +-
.../test/templatesuite/TemplateTestCase.java | 4 +-
.../test/templatesuite/models/LegacyList.java | 4 +-
.../templatesuite/models/TransformHashWrapper.java | 4 +-
48 files changed, 416 insertions(+), 339 deletions(-)
diff --git a/src/main/java/freemarker/cache/TemplateCache.java b/src/main/java/freemarker/cache/TemplateCache.java
index be19aeea..77c69578 100644
--- a/src/main/java/freemarker/cache/TemplateCache.java
+++ b/src/main/java/freemarker/cache/TemplateCache.java
@@ -40,6 +40,7 @@ import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateNotFoundException;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.NullArgumentException;
import freemarker.template.utility.StringUtil;
import freemarker.template.utility.UndeclaredThrowableException;
@@ -279,7 +280,7 @@ public class TemplateCache {
} catch (MalformedTemplateNameException e) {
// If we don't have to emulate backward compatible behavior, then just rethrow it:
if (templateNameFormat != TemplateNameFormat.DEFAULT_2_3_0
- || config.getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_4_0) {
+ || config.getIncompatibleImprovements().intValue() >= _VersionInts.V_2_4_0) {
throw e;
}
return new MaybeMissingTemplate(null, e);
@@ -795,7 +796,7 @@ public class TemplateCache {
private Object modifyForConfIcI(Object templateSource) {
if (templateSource == null) return null;
- if (config.getIncompatibleImprovements().intValue() < _TemplateAPI.VERSION_INT_2_3_21) {
+ if (config.getIncompatibleImprovements().intValue() < _VersionInts.V_2_3_21) {
return templateSource;
}
diff --git a/src/main/java/freemarker/core/APINotSupportedTemplateException.java b/src/main/java/freemarker/core/APINotSupportedTemplateException.java
index f21fa0e3..c706581c 100644
--- a/src/main/java/freemarker/core/APINotSupportedTemplateException.java
+++ b/src/main/java/freemarker/core/APINotSupportedTemplateException.java
@@ -25,7 +25,7 @@ import freemarker.template.SimpleHash;
import freemarker.template.SimpleSequence;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
/**
* Thrown when {@code ?api} is not supported by a value.
@@ -56,7 +56,7 @@ class APINotSupportedTemplateException extends TemplateException {
desc.tip("In the FreeMarker configuration, \"", Configurable.OBJECT_WRAPPER_KEY,
"\" is a DefaultObjectWrapper with its \"useAdaptersForContainers\" property set to "
+ "false. Setting it to true might solves this problem.");
- if (dow.getIncompatibleImprovements().intValue() < _TemplateAPI.VERSION_INT_2_3_22) {
+ if (dow.getIncompatibleImprovements().intValue() < _VersionInts.V_2_3_22) {
desc.tip("Setting DefaultObjectWrapper's \"incompatibleImprovements\" to 2.3.22 or higher will "
+ "change the default value of \"useAdaptersForContainers\" to true.");
}
diff --git a/src/main/java/freemarker/core/AddConcatExpression.java b/src/main/java/freemarker/core/AddConcatExpression.java
index a4bfb9f1..f02be125 100644
--- a/src/main/java/freemarker/core/AddConcatExpression.java
+++ b/src/main/java/freemarker/core/AddConcatExpression.java
@@ -35,7 +35,7 @@ import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
/**
* An operator for the + operator. Note that this is treated
@@ -274,7 +274,7 @@ final class AddConcatExpression extends Expression {
throws TemplateModelException {
if (keys == null) {
HashSet keySet = new HashSet();
- SimpleSequence keySeq = new SimpleSequence(32, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence keySeq = new SimpleSequence(32, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
addKeys(keySet, keySeq, (TemplateHashModelEx) this.left);
addKeys(keySet, keySeq, (TemplateHashModelEx) this.right);
keys = new CollectionAndSequence(keySeq);
@@ -297,7 +297,7 @@ final class AddConcatExpression extends Expression {
private void initValues()
throws TemplateModelException {
if (values == null) {
- SimpleSequence seq = new SimpleSequence(size(), _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence seq = new SimpleSequence(size(), _ObjectWrappers.SAFE_OBJECT_WRAPPER);
// Note: size() invokes initKeys() if needed.
int ln = keys.size();
diff --git a/src/main/java/freemarker/core/BuiltInsForDates.java b/src/main/java/freemarker/core/BuiltInsForDates.java
index c4f660be..2a702660 100644
--- a/src/main/java/freemarker/core/BuiltInsForDates.java
+++ b/src/main/java/freemarker/core/BuiltInsForDates.java
@@ -33,6 +33,7 @@ import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.DateUtil;
import freemarker.template.utility.UnrecognizedTimeZoneException;
@@ -206,7 +207,7 @@ class BuiltInsForDates {
} else {
// java.sql.Time values meant to carry calendar field values only, so we don't show offset for them.
return !(date instanceof java.sql.Time
- && _TemplateAPI.getTemplateLanguageVersionAsInt(this) >= _TemplateAPI.VERSION_INT_2_3_21);
+ && _TemplateAPI.getTemplateLanguageVersionAsInt(this) >= _VersionInts.V_2_3_21);
}
}
diff --git a/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java b/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
index 87cce1fb..b214d8c3 100644
--- a/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
+++ b/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
@@ -48,6 +48,7 @@ import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
import freemarker.template.TemplateTransformModel;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.NumberUtil;
/**
@@ -114,7 +115,7 @@ class BuiltInsForMultipleTypes {
@Override
public int getMinimumICIVersion() {
- return _TemplateAPI.VERSION_INT_2_3_21;
+ return _VersionInts.V_2_3_21;
}
@Override
@@ -136,7 +137,7 @@ class BuiltInsForMultipleTypes {
@Override
public int getMinimumICIVersion() {
- return _TemplateAPI.VERSION_INT_2_3_32;
+ return _VersionInts.V_2_3_32;
}
@Override
@@ -364,7 +365,7 @@ class BuiltInsForMultipleTypes {
TemplateModel tm = target.eval(env);
target.assertNonNull(tm, env);
return (tm instanceof TemplateSequenceModel || tm instanceof TemplateCollectionModel)
- && (_TemplateAPI.getTemplateLanguageVersionAsInt(this) < _TemplateAPI.VERSION_INT_2_3_21
+ && (_TemplateAPI.getTemplateLanguageVersionAsInt(this) < _VersionInts.V_2_3_21
// These implement TemplateSequenceModel, yet they can't be #list-ed:
|| !(tm instanceof SimpleMethodModel || tm instanceof OverloadedMethodsModel))
? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
diff --git a/src/main/java/freemarker/core/BuiltInsForNodes.java b/src/main/java/freemarker/core/BuiltInsForNodes.java
index 71e76bd9..ff75b6ee 100644
--- a/src/main/java/freemarker/core/BuiltInsForNodes.java
+++ b/src/main/java/freemarker/core/BuiltInsForNodes.java
@@ -30,7 +30,7 @@ import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateNodeModel;
import freemarker.template.TemplateNodeModelEx;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
/**
* A holder for builtins that operate exclusively on (XML-)node left-hand value.
@@ -123,7 +123,7 @@ class BuiltInsForNodes {
private Environment env;
AncestorSequence(Environment env) {
- super(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ super(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
this.env = env;
}
diff --git a/src/main/java/freemarker/core/BuiltInsForSequences.java b/src/main/java/freemarker/core/BuiltInsForSequences.java
index b80f42e7..3d2b9fc8 100644
--- a/src/main/java/freemarker/core/BuiltInsForSequences.java
+++ b/src/main/java/freemarker/core/BuiltInsForSequences.java
@@ -45,7 +45,7 @@ import freemarker.template.TemplateModelListSequence;
import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
import freemarker.template.utility.Constants;
import freemarker.template.utility.StringUtil;
@@ -889,8 +889,8 @@ class BuiltInsForSequences {
coll instanceof TemplateCollectionModelEx
? new SimpleSequence(
((TemplateCollectionModelEx) coll).size(),
- _TemplateAPI.SAFE_OBJECT_WRAPPER)
- : new SimpleSequence(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ _ObjectWrappers.SAFE_OBJECT_WRAPPER)
+ : new SimpleSequence(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (TemplateModelIterator iter = coll.iterator(); iter.hasNext(); ) {
seq.add(iter.next());
}
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsBasic.java b/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
index 4ab8c40f..c97c93ed 100644
--- a/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
+++ b/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
@@ -35,7 +35,7 @@ import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
import freemarker.template.utility.StringUtil;
class BuiltInsForStringsBasic {
@@ -833,7 +833,7 @@ class BuiltInsForStringsBasic {
static class word_listBI extends BuiltInForString {
@Override
TemplateModel calculateResult(String s, Environment env) {
- SimpleSequence result = new SimpleSequence(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence result = new SimpleSequence(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
StringTokenizer st = new StringTokenizer(s);
while (st.hasMoreTokens()) {
result.add(st.nextToken());
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java b/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
index f6001353..59dc3fe6 100644
--- a/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
+++ b/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
@@ -28,7 +28,7 @@ import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.StringUtil;
class BuiltInsForStringsEncoding {
@@ -51,7 +51,7 @@ class BuiltInsForStringsEncoding {
@Override
public int getMinimumICIVersion() {
- return _TemplateAPI.VERSION_INT_2_3_20;
+ return _VersionInts.V_2_3_20;
}
@Override
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java b/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
index eddc97c1..d8be40bd 100644
--- a/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
+++ b/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
@@ -35,7 +35,7 @@ import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
import freemarker.template.utility.StringUtil;
@@ -145,7 +145,7 @@ class BuiltInsForStringsRegexp {
MatchWithGroups(String input, Matcher matcher) {
matchedInputPart = input.substring(matcher.start(), matcher.end());
final int grpCount = matcher.groupCount() + 1;
- groupsSeq = new SimpleSequence(grpCount, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ groupsSeq = new SimpleSequence(grpCount, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (int i = 0; i < grpCount; i++) {
groupsSeq.add(matcher.group(i));
}
diff --git a/src/main/java/freemarker/core/BuiltinVariable.java b/src/main/java/freemarker/core/BuiltinVariable.java
index ccc9d0b6..b8f06a0a 100644
--- a/src/main/java/freemarker/core/BuiltinVariable.java
+++ b/src/main/java/freemarker/core/BuiltinVariable.java
@@ -32,7 +32,7 @@ import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.StringUtil;
/**
@@ -222,7 +222,7 @@ final class BuiltinVariable extends Expression {
// The behavior of env.getTemplate() was changed with IcI 2.3.22, but there was an unintended side effect
// of changing the behavior of .template_name, which was fixed with IcI 2.3.23. IcI 2.3.22 deliberately
// remains broken.
- return (env.getConfiguration().getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_23)
+ return (env.getConfiguration().getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_23)
? new SimpleScalar(env.getTemplate230().getName())
: new SimpleScalar(env.getTemplate().getName());
}
diff --git a/src/main/java/freemarker/core/Configurable.java b/src/main/java/freemarker/core/Configurable.java
index 676bd7f1..dd38163a 100644
--- a/src/main/java/freemarker/core/Configurable.java
+++ b/src/main/java/freemarker/core/Configurable.java
@@ -65,6 +65,7 @@ import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModel;
import freemarker.template.Version;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.NullArgumentException;
import freemarker.template.utility.StringUtil;
@@ -2096,7 +2097,7 @@ public class Configurable {
throw new IllegalArgumentException("List items must be String-s.");
}
addAutoInclude((String) templateName, this instanceof Configuration && ((Configuration) this)
- .getIncompatibleImprovements().intValue() < _TemplateAPI.VERSION_INT_2_3_25);
+ .getIncompatibleImprovements().intValue() < _VersionInts.V_2_3_25);
}
}
}
diff --git a/src/main/java/freemarker/core/DynamicKeyName.java b/src/main/java/freemarker/core/DynamicKeyName.java
index ec46af20..f8cef3a4 100644
--- a/src/main/java/freemarker/core/DynamicKeyName.java
+++ b/src/main/java/freemarker/core/DynamicKeyName.java
@@ -34,7 +34,9 @@ import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
+import freemarker.template._ObjectWrappers;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.Constants;
/**
@@ -291,7 +293,7 @@ final class DynamicKeyName extends Expression {
srcIdx += step;
}
// List items are already wrapped:
- return new SimpleSequence(resultList, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ return new SimpleSequence(resultList, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
} else if (targetLazySeq != null) {
// As a targetLazySeq can only occur if a new built-in like ?filter or ?map was used somewhere in the target
// expression, in this case we can return lazily generated sequence without breaking backward compatibility.
@@ -386,7 +388,7 @@ final class DynamicKeyName extends Expression {
resultList.add(targetIter.next());
}
// List items are already wrapped:
- return new SimpleSequence(resultList, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ return new SimpleSequence(resultList, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
}
}
@@ -433,13 +435,13 @@ final class DynamicKeyName extends Expression {
"Range top index " + highIndex + " (0-based) is outside the sliced sequence of length " +
srcIdx + ".");
}
- return new SimpleSequence(Arrays.asList(resultElements), _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ return new SimpleSequence(Arrays.asList(resultElements), _ObjectWrappers.SAFE_OBJECT_WRAPPER);
}
private TemplateModel emptyResult(boolean seq) {
return seq
- ? (_TemplateAPI.getTemplateLanguageVersionAsInt(this) < _TemplateAPI.VERSION_INT_2_3_21
- ? new SimpleSequence(_TemplateAPI.SAFE_OBJECT_WRAPPER)
+ ? (_TemplateAPI.getTemplateLanguageVersionAsInt(this) < _VersionInts.V_2_3_21
+ ? new SimpleSequence(_ObjectWrappers.SAFE_OBJECT_WRAPPER)
: Constants.EMPTY_SEQUENCE)
: TemplateScalarModel.EMPTY_STRING;
}
diff --git a/src/main/java/freemarker/core/Environment.java b/src/main/java/freemarker/core/Environment.java
index 617bb48c..a078eaea 100644
--- a/src/main/java/freemarker/core/Environment.java
+++ b/src/main/java/freemarker/core/Environment.java
@@ -73,7 +73,8 @@ import freemarker.template.TemplateSequenceModel;
import freemarker.template.TemplateTransformModel;
import freemarker.template.TransformControl;
import freemarker.template.Version;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
+import freemarker.template._VersionInts;
import freemarker.template.utility.DateUtil;
import freemarker.template.utility.DateUtil.DateToISO8601CalendarFactory;
import freemarker.template.utility.NullWriter;
@@ -218,7 +219,7 @@ public final class Environment extends Configurable {
public Environment(Template template, final TemplateHashModel rootDataModel, Writer out) {
super(template);
configuration = template.getConfiguration();
- incompatibleImprovementsGE2328 = configuration.getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_28;
+ incompatibleImprovementsGE2328 = configuration.getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_28;
this.globalNamespace = new Namespace(null);
this.currentNamespace = mainNamespace = new Namespace(template);
this.out = out;
@@ -520,7 +521,7 @@ public final class Environment extends Configurable {
if (tc != null
&& !(t instanceof FlowControlException
&& getConfiguration().getIncompatibleImprovements().intValue()
- >= _TemplateAPI.VERSION_INT_2_3_27)) {
+ >= _VersionInts.V_2_3_27)) {
tc.onError(t);
} else {
throw t;
@@ -739,7 +740,7 @@ public final class Environment extends Configurable {
void invokeNodeHandlerFor(TemplateNodeModel node, TemplateSequenceModel namespaces)
throws TemplateException, IOException {
if (nodeNamespaces == null) {
- SimpleSequence ss = new SimpleSequence(1, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence ss = new SimpleSequence(1, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
ss.add(currentNamespace);
nodeNamespaces = ss;
}
@@ -1136,7 +1137,7 @@ public final class Environment extends Configurable {
private static SimpleSequence initPositionalCatchAllParameter(Macro.Context macroCtx, String catchAllParamName) {
SimpleSequence positionalCatchAllParamValue;
- positionalCatchAllParamValue = new SimpleSequence(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ positionalCatchAllParamValue = new SimpleSequence(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
macroCtx.setLocalVar(catchAllParamName, positionalCatchAllParamValue);
return positionalCatchAllParamValue;
}
@@ -1144,7 +1145,7 @@ public final class Environment extends Configurable {
private static SimpleHash initNamedCatchAllParameter(Macro.Context macroCtx, String catchAllParamName) {
SimpleHash namedCatchAllParamValue;
namedCatchAllParamValue = new SimpleHash(
- new LinkedHashMap<String, Object>(), _TemplateAPI.SAFE_OBJECT_WRAPPER, 0);
+ new LinkedHashMap<String, Object>(), _ObjectWrappers.SAFE_OBJECT_WRAPPER, 0);
macroCtx.setLocalVar(catchAllParamName, namedCatchAllParamValue);
return namedCatchAllParamValue;
}
@@ -1698,7 +1699,7 @@ public final class Environment extends Configurable {
* @since 2.3.32
*/
public TemplateNumberFormat getCTemplateNumberFormat() {
- if (configuration.getIncompatibleImprovements().intValue() < _TemplateAPI.VERSION_INT_2_3_32) {
+ if (configuration.getIncompatibleImprovements().intValue() < _VersionInts.V_2_3_32) {
ensureCNumberFormatInitialized();
return cTemplateNumberFormat;
}
@@ -1710,7 +1711,7 @@ public final class Environment extends Configurable {
private void ensureCNumberFormatInitialized() {
// Note: DecimalFormat-s aren't thread-safe, so you must clone the static field value.
if (cNumberFormat == null) {
- if (configuration.getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_31) {
+ if (configuration.getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_31) {
cNumberFormat = (DecimalFormat) C_NUMBER_FORMAT_ICI_2_3_21.clone();
} else {
cNumberFormat = (DecimalFormat) C_NUMBER_FORMAT_ICI_2_3_20.clone();
@@ -3308,12 +3309,12 @@ public final class Environment extends Configurable {
private Template template;
Namespace() {
- super(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ super(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
this.template = Environment.this.getTemplate();
}
Namespace(Template template) {
- super(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ super(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
this.template = template;
}
@@ -3517,11 +3518,11 @@ public final class Environment extends Configurable {
};
private boolean isBeforeIcI2322() {
- return configuration.getIncompatibleImprovements().intValue() < _TemplateAPI.VERSION_INT_2_3_22;
+ return configuration.getIncompatibleImprovements().intValue() < _VersionInts.V_2_3_22;
}
boolean isIcI2324OrLater() {
- return configuration.getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_24;
+ return configuration.getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_24;
}
/**
diff --git a/src/main/java/freemarker/core/EvalUtil.java b/src/main/java/freemarker/core/EvalUtil.java
index a3582084..3d3f900d 100644
--- a/src/main/java/freemarker/core/EvalUtil.java
+++ b/src/main/java/freemarker/core/EvalUtil.java
@@ -33,7 +33,7 @@ import freemarker.template.TemplateModelException;
import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
/**
* Internally used static utilities for evaluation expressions.
@@ -602,7 +602,7 @@ class EvalUtil {
}
if (env.getWrapUncheckedExceptions()) {
return true;
- } else if (env.getConfiguration().getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_27) {
+ } else if (env.getConfiguration().getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_27) {
// We have to judge if we dare to wrap this exception, or it's too likely that some applications try to
// catch it around the template processing to do something special. For the same reason, we only wrap very
// frequent exceptions.
diff --git a/src/main/java/freemarker/core/GetOptionalTemplateMethod.java b/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
index bb4d2f13..24a3581d 100644
--- a/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
+++ b/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
@@ -37,7 +37,7 @@ import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
import freemarker.template.utility.TemplateModelUtils;
/**
@@ -144,7 +144,7 @@ class GetOptionalTemplateMethod implements TemplateMethodModelEx {
"; see cause exception");
}
- SimpleHash result = new SimpleHash(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleHash result = new SimpleHash(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
result.put(RESULT_EXISTS, template != null);
// If the template is missing, result.include and such will be missing too, so that a default can be
// conveniently provided like in <@optTemp.include!myDefaultMacro />.
diff --git a/src/main/java/freemarker/core/HashLiteral.java b/src/main/java/freemarker/core/HashLiteral.java
index f358ba3c..cc6d2c97 100644
--- a/src/main/java/freemarker/core/HashLiteral.java
+++ b/src/main/java/freemarker/core/HashLiteral.java
@@ -31,7 +31,9 @@ import freemarker.template.TemplateHashModelEx2;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
+import freemarker.template._ObjectWrappers;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
@SuppressWarnings("deprecation")
final class HashLiteral extends Expression {
@@ -111,7 +113,7 @@ final class HashLiteral extends Expression {
private TemplateCollectionModel keyCollection, valueCollection; // ordered lists of keys and values
SequenceHash(Environment env) throws TemplateException {
- if (_TemplateAPI.getTemplateLanguageVersionAsInt(HashLiteral.this) >= _TemplateAPI.VERSION_INT_2_3_21) {
+ if (_TemplateAPI.getTemplateLanguageVersionAsInt(HashLiteral.this) >= _VersionInts.V_2_3_21) {
map = new LinkedHashMap<>();
for (int i = 0; i < size; i++) {
Expression keyExp = keys.get(i);
@@ -127,8 +129,8 @@ final class HashLiteral extends Expression {
// Legacy hash literal, where repeated keys were kept when doing ?values or ?keys, yet overwritten when
// doing hash[key].
map = new HashMap<>();
- SimpleSequence keyList = new SimpleSequence(size, _TemplateAPI.SAFE_OBJECT_WRAPPER);
- SimpleSequence valueList = new SimpleSequence(size, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence keyList = new SimpleSequence(size, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
+ SimpleSequence valueList = new SimpleSequence(size, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (int i = 0; i < size; i++) {
Expression keyExp = keys.get(i);
Expression valExp = values.get(i);
@@ -156,7 +158,7 @@ final class HashLiteral extends Expression {
if (keyCollection == null) {
// This can only happen when IcI >= 2.3.21, an the map is a LinkedHashMap.
keyCollection = new CollectionAndSequence(
- new SimpleSequence(map.keySet(), _TemplateAPI.SAFE_OBJECT_WRAPPER));
+ new SimpleSequence(map.keySet(), _ObjectWrappers.SAFE_OBJECT_WRAPPER));
}
return keyCollection;
}
@@ -166,7 +168,7 @@ final class HashLiteral extends Expression {
if (valueCollection == null) {
// This can only happen when IcI >= 2.3.21, an the map is a LinkedHashMap.
valueCollection = new CollectionAndSequence(
- new SimpleSequence(map.values(), _TemplateAPI.SAFE_OBJECT_WRAPPER));
+ new SimpleSequence(map.values(), _ObjectWrappers.SAFE_OBJECT_WRAPPER));
}
return valueCollection;
}
diff --git a/src/main/java/freemarker/core/Interpret.java b/src/main/java/freemarker/core/Interpret.java
index 9b4cb418..4e6694ee 100644
--- a/src/main/java/freemarker/core/Interpret.java
+++ b/src/main/java/freemarker/core/Interpret.java
@@ -31,7 +31,7 @@ import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
import freemarker.template.TemplateTransformModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
/**
@@ -81,7 +81,7 @@ class Interpret extends OutputFormatBoundBuiltIn {
}
String templateSource = sourceExpr.evalAndCoerceToPlainText(env);
Template parentTemplate = env.getConfiguration().getIncompatibleImprovements().intValue()
- >= _TemplateAPI.VERSION_INT_2_3_26 ? env.getCurrentTemplate() : env.getTemplate();
+ >= _VersionInts.V_2_3_26 ? env.getCurrentTemplate() : env.getTemplate();
final Template interpretedTemplate;
try {
diff --git a/src/main/java/freemarker/core/JSONParser.java b/src/main/java/freemarker/core/JSONParser.java
index ddb01c07..61fc4a9d 100644
--- a/src/main/java/freemarker/core/JSONParser.java
+++ b/src/main/java/freemarker/core/JSONParser.java
@@ -20,17 +20,13 @@
package freemarker.core;
import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.LinkedHashMap;
-import java.util.List;
import java.util.Map;
import freemarker.template.SimpleHash;
import freemarker.template.SimpleNumber;
import freemarker.template.SimpleScalar;
import freemarker.template.SimpleSequence;
-import freemarker.template.Template;
import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateHashModelEx2;
import freemarker.template.TemplateModel;
@@ -38,7 +34,7 @@ import freemarker.template.TemplateModelException;
import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
import freemarker.template.utility.Constants;
import freemarker.template.utility.NumberUtil;
import freemarker.template.utility.StringUtil;
@@ -297,7 +293,7 @@ class JSONParser {
if (tryConsumeChar(']')) return Constants.EMPTY_SEQUENCE;
boolean afterComma = false;
- SimpleSequence elements = new SimpleSequence(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence elements = new SimpleSequence(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
do {
skipWS();
elements.add(consumeValue(afterComma ? null : UNCLOSED_ARRAY_MESSAGE, afterComma ? -1 : startP));
@@ -340,7 +336,7 @@ class JSONParser {
skipWS();
afterComma = true;
} while (consumeChar(',', '}', UNCLOSED_OBJECT_MESSAGE, startP) == ',');
- return new SimpleHash(map, _TemplateAPI.SAFE_OBJECT_WRAPPER, 0);
+ return new SimpleHash(map, _ObjectWrappers.SAFE_OBJECT_WRAPPER, 0);
}
private boolean isE(char c) {
diff --git a/src/main/java/freemarker/core/ListLiteral.java b/src/main/java/freemarker/core/ListLiteral.java
index 7745db72..d4f6de66 100644
--- a/src/main/java/freemarker/core/ListLiteral.java
+++ b/src/main/java/freemarker/core/ListLiteral.java
@@ -31,7 +31,7 @@ import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
final class ListLiteral extends Expression {
@@ -44,7 +44,7 @@ final class ListLiteral extends Expression {
@Override
TemplateModel _eval(Environment env) throws TemplateException {
- SimpleSequence list = new SimpleSequence(items.size(), _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence list = new SimpleSequence(items.size(), _ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (Expression exp : items) {
TemplateModel tm = exp.eval(env);
if (env == null || !env.isClassicCompatible()) {
@@ -140,7 +140,7 @@ final class ListLiteral extends Expression {
TemplateSequenceModel evaluateStringsToNamespaces(Environment env) throws TemplateException {
TemplateSequenceModel val = (TemplateSequenceModel) eval(env);
- SimpleSequence result = new SimpleSequence(val.size(), _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence result = new SimpleSequence(val.size(), _ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (int i = 0; i < items.size(); i++) {
Object itemExpr = items.get(i);
if (itemExpr instanceof StringLiteral) {
diff --git a/src/main/java/freemarker/core/Macro.java b/src/main/java/freemarker/core/Macro.java
index 31d621e7..878c4b2e 100644
--- a/src/main/java/freemarker/core/Macro.java
+++ b/src/main/java/freemarker/core/Macro.java
@@ -37,7 +37,7 @@ import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
import freemarker.template.utility.Constants;
/**
@@ -344,7 +344,7 @@ public final class Macro extends TemplateElement implements TemplateModel {
}
SimpleSequence argsSpecVarValue = new SimpleSequence(
- lengthWithCatchAlls, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ lengthWithCatchAlls, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (int paramIndex = 0; paramIndex < argsSpecVarDraft.length; paramIndex++) {
argsSpecVarValue.add(argsSpecVarDraft[paramIndex]);
}
@@ -379,7 +379,7 @@ public final class Macro extends TemplateElement implements TemplateModel {
SimpleHash argsSpecVarValue = new SimpleHash(
new LinkedHashMap<String, Object>(lengthWithCatchAlls * 4 / 3, 1.0f),
- _TemplateAPI.SAFE_OBJECT_WRAPPER, 0);
+ _ObjectWrappers.SAFE_OBJECT_WRAPPER, 0);
for (int paramIndex = 0; paramIndex < argsSpecVarDraft.length; paramIndex++) {
argsSpecVarValue.put(paramNames[paramIndex], argsSpecVarDraft[paramIndex]);
}
diff --git a/src/main/java/freemarker/core/Range.java b/src/main/java/freemarker/core/Range.java
index a141c7c6..bd5620c2 100644
--- a/src/main/java/freemarker/core/Range.java
+++ b/src/main/java/freemarker/core/Range.java
@@ -22,6 +22,7 @@ package freemarker.core;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
/**
* A class that represents a Range between two integers.
@@ -56,7 +57,7 @@ final class Range extends Expression {
begin, endType != END_SIZE_LIMITED ? lhoValue : begin + lhoValue,
endType == END_INCLUSIVE, endType == END_SIZE_LIMITED);
} else {
- return _TemplateAPI.getTemplateLanguageVersionAsInt(this) >= _TemplateAPI.VERSION_INT_2_3_21
+ return _TemplateAPI.getTemplateLanguageVersionAsInt(this) >= _VersionInts.V_2_3_21
? new ListableRightUnboundedRangeModel(begin)
: new NonListableRightUnboundedRangeModel(begin);
}
diff --git a/src/main/java/freemarker/core/RecurseNode.java b/src/main/java/freemarker/core/RecurseNode.java
index c7a4b095..e2d326e5 100644
--- a/src/main/java/freemarker/core/RecurseNode.java
+++ b/src/main/java/freemarker/core/RecurseNode.java
@@ -28,7 +28,7 @@ import freemarker.template.TemplateModel;
import freemarker.template.TemplateNodeModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
/**
@@ -58,7 +58,7 @@ final class RecurseNode extends TemplateElement {
}
if (nss != null) {
if (nss instanceof TemplateHashModel) {
- SimpleSequence ss = new SimpleSequence(1, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence ss = new SimpleSequence(1, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
ss.add(nss);
nss = ss;
} else if (!(nss instanceof TemplateSequenceModel)) {
diff --git a/src/main/java/freemarker/core/TemplateConfiguration.java b/src/main/java/freemarker/core/TemplateConfiguration.java
index 92cc6718..ff290f5b 100644
--- a/src/main/java/freemarker/core/TemplateConfiguration.java
+++ b/src/main/java/freemarker/core/TemplateConfiguration.java
@@ -29,6 +29,7 @@ import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.NullArgumentException;
/**
@@ -115,7 +116,7 @@ public final class TemplateConfiguration extends Configurable implements ParserC
return;
}
- if (((Configuration) cfg).getIncompatibleImprovements().intValue() < _TemplateAPI.VERSION_INT_2_3_22
+ if (((Configuration) cfg).getIncompatibleImprovements().intValue() < _VersionInts.V_2_3_22
&& hasAnyConfigurableSet()) {
throw new IllegalStateException(
"This TemplateConfiguration can't be associated to a Configuration that has "
diff --git a/src/main/java/freemarker/core/VisitNode.java b/src/main/java/freemarker/core/VisitNode.java
index daaf0a7a..8d3006c5 100644
--- a/src/main/java/freemarker/core/VisitNode.java
+++ b/src/main/java/freemarker/core/VisitNode.java
@@ -27,7 +27,7 @@ import freemarker.template.TemplateModel;
import freemarker.template.TemplateNodeModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
/**
@@ -57,7 +57,7 @@ final class VisitNode extends TemplateElement {
}
if (nss != null) {
if (nss instanceof Environment.Namespace) {
- SimpleSequence ss = new SimpleSequence(1, _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence ss = new SimpleSequence(1, _ObjectWrappers.SAFE_OBJECT_WRAPPER);
ss.add(nss);
nss = ss;
} else if (!(nss instanceof TemplateSequenceModel)) {
diff --git a/src/main/java/freemarker/core/_CoreAPI.java b/src/main/java/freemarker/core/_CoreAPI.java
index 55a2d3d6..df522a13 100644
--- a/src/main/java/freemarker/core/_CoreAPI.java
+++ b/src/main/java/freemarker/core/_CoreAPI.java
@@ -40,9 +40,11 @@ import freemarker.template.utility.ClassUtil;
* For internal use only; don't depend on this, there's no backward compatibility guarantee at all!
* This class is to work around the lack of module system in Java, i.e., so that other FreeMarker packages can
* access things inside this package that users shouldn't.
- */
+ */
public class _CoreAPI {
-
+ // ATTENTION! Don't refer to other classes in the static initializer of this class! Fields that need that must be
+ // moved into separate class, to avoid class init deadlocks.
+
public static final String ERROR_MESSAGE_HR = "----";
// Can't be instantiated
diff --git a/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java b/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
index 58c5cb7e..46e99559 100644
--- a/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
+++ b/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
@@ -49,7 +49,7 @@ import freemarker.template.SimpleScalar;
import freemarker.template.Template;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateNodeModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
import freemarker.template.utility.ClassUtil;
import freemarker.template.utility.SecurityUtilities;
@@ -602,7 +602,7 @@ extends
}
private static TemplateModel wrapMap(Map table) {
- SimpleHash model = new SimpleHash(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleHash model = new SimpleHash(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (Iterator it = table.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = (Map.Entry) it.next();
model.put(String.valueOf(entry.getKey()), new SimpleScalar(String.valueOf(entry.getValue())));
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapper.java b/src/main/java/freemarker/ext/beans/BeansWrapper.java
index c321558e..5ac4ea1f 100644
--- a/src/main/java/freemarker/ext/beans/BeansWrapper.java
+++ b/src/main/java/freemarker/ext/beans/BeansWrapper.java
@@ -67,6 +67,7 @@ import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
import freemarker.template.Version;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.ClassUtil;
import freemarker.template.utility.RichObjectWrapper;
import freemarker.template.utility.WriteProtectable;
@@ -869,7 +870,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
}
static boolean is2321Bugfixed(Version version) {
- return version.intValue() >= _TemplateAPI.VERSION_INT_2_3_21;
+ return version.intValue() >= _VersionInts.V_2_3_21;
}
boolean is2324Bugfixed() {
@@ -877,7 +878,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
}
static boolean is2324Bugfixed(Version version) {
- return version.intValue() >= _TemplateAPI.VERSION_INT_2_3_24;
+ return version.intValue() >= _VersionInts.V_2_3_24;
}
/**
@@ -886,8 +887,8 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
*/
protected static Version normalizeIncompatibleImprovementsVersion(Version incompatibleImprovements) {
_TemplateAPI.checkVersionNotNullAndSupported(incompatibleImprovements);
- return incompatibleImprovements.intValue() >= _TemplateAPI.VERSION_INT_2_3_27 ? Configuration.VERSION_2_3_27
- : incompatibleImprovements.intValue() == _TemplateAPI.VERSION_INT_2_3_26 ? Configuration.VERSION_2_3_26
+ return incompatibleImprovements.intValue() >= _VersionInts.V_2_3_27 ? Configuration.VERSION_2_3_27
+ : incompatibleImprovements.intValue() == _VersionInts.V_2_3_26 ? Configuration.VERSION_2_3_26
: is2324Bugfixed(incompatibleImprovements) ? Configuration.VERSION_2_3_24
: is2321Bugfixed(incompatibleImprovements) ? Configuration.VERSION_2_3_21
: Configuration.VERSION_2_3_0;
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java b/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
index 7be7ee4b..ff43033d 100644
--- a/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
+++ b/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
@@ -24,6 +24,7 @@ import freemarker.template.ObjectWrapper;
import freemarker.template.TemplateDateModel;
import freemarker.template.Version;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
/**
* Holds {@link BeansWrapper} configuration settings and defines their defaults.
@@ -89,7 +90,7 @@ public abstract class BeansWrapperConfiguration implements Cloneable {
: BeansWrapper.normalizeIncompatibleImprovementsVersion(incompatibleImprovements);
this.incompatibleImprovements = incompatibleImprovements;
- preferIndexedReadMethod = incompatibleImprovements.intValue() < _TemplateAPI.VERSION_INT_2_3_27;
+ preferIndexedReadMethod = incompatibleImprovements.intValue() < _VersionInts.V_2_3_27;
classIntrospectorBuilder = new ClassIntrospectorBuilder(incompatibleImprovements);
}
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java b/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
index cd4df0f5..76e42318 100644
--- a/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
+++ b/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
@@ -29,6 +29,7 @@ import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Version;
import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.NullArgumentException;
final class ClassIntrospectorBuilder implements Cloneable {
@@ -69,15 +70,15 @@ final class ClassIntrospectorBuilder implements Cloneable {
// to some version changes that affects BeansWrapper, but not the other way around.
this.incompatibleImprovements = normalizeIncompatibleImprovementsVersion(incompatibleImprovements);
treatDefaultMethodsAsBeanMembers
- = incompatibleImprovements.intValue() >= _TemplateAPI.VERSION_INT_2_3_26;
+ = incompatibleImprovements.intValue() >= _VersionInts.V_2_3_26;
memberAccessPolicy = DefaultMemberAccessPolicy.getInstance(this.incompatibleImprovements);
}
private static Version normalizeIncompatibleImprovementsVersion(Version incompatibleImprovements) {
_TemplateAPI.checkVersionNotNullAndSupported(incompatibleImprovements);
// All breakpoints here must occur in BeansWrapper.normalizeIncompatibleImprovements!
- return incompatibleImprovements.intValue() >= _TemplateAPI.VERSION_INT_2_3_30 ? Configuration.VERSION_2_3_30
- : incompatibleImprovements.intValue() >= _TemplateAPI.VERSION_INT_2_3_21 ? Configuration.VERSION_2_3_21
+ return incompatibleImprovements.intValue() >= _VersionInts.V_2_3_30 ? Configuration.VERSION_2_3_30
+ : incompatibleImprovements.intValue() >= _VersionInts.V_2_3_21 ? Configuration.VERSION_2_3_21
: Configuration.VERSION_2_3_0;
}
diff --git a/src/main/java/freemarker/ext/jdom/NodeListModel.java b/src/main/java/freemarker/ext/jdom/NodeListModel.java
index 7e963f74..dc669247 100644
--- a/src/main/java/freemarker/ext/jdom/NodeListModel.java
+++ b/src/main/java/freemarker/ext/jdom/NodeListModel.java
@@ -60,7 +60,7 @@ import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
/**
* Provides a template for wrapping JDOM objects. It is capable of storing not only
@@ -1168,7 +1168,7 @@ implements
throws Exception {
org.jdom.input.SAXBuilder builder = new org.jdom.input.SAXBuilder();
Document document = builder.build(System.in);
- SimpleHash model = new SimpleHash(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleHash model = new SimpleHash(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
model.put("document", new NodeListModel(document));
FileReader fr = new FileReader(args[0]);
Template template = new Template(args[0], fr);
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java b/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
index 724ba83f..041f8926 100644
--- a/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
+++ b/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
@@ -61,7 +61,7 @@ import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.UndeclaredThrowableException;
/**
@@ -195,7 +195,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
case PAGE_SCOPE: {
try {
final TemplateModel tm = environment.getGlobalNamespace().get(name);
- if (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_22 && unwrapper != null) {
+ if (incompatibleImprovements >= _VersionInts.V_2_3_22 && unwrapper != null) {
return unwrapper.unwrap(tm);
} else { // Legacy behavior branch
if (tm instanceof AdapterTemplateModel) {
@@ -213,7 +213,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
if (tm instanceof TemplateBooleanModel) {
return Boolean.valueOf(((TemplateBooleanModel) tm).getAsBoolean());
}
- if (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_22
+ if (incompatibleImprovements >= _VersionInts.V_2_3_22
&& tm instanceof TemplateDateModel) {
return ((TemplateDateModel) tm).getAsDate();
}
diff --git a/src/main/java/freemarker/ext/servlet/InitParamParser.java b/src/main/java/freemarker/ext/servlet/InitParamParser.java
index 8791058c..0236e7e2 100644
--- a/src/main/java/freemarker/ext/servlet/InitParamParser.java
+++ b/src/main/java/freemarker/ext/servlet/InitParamParser.java
@@ -36,7 +36,7 @@ import freemarker.core._ObjectBuilderSettingEvaluator;
import freemarker.core._SettingEvaluationEnvironment;
import freemarker.log.Logger;
import freemarker.template.Configuration;
-import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.StringUtil;
@@ -82,7 +82,7 @@ final class InitParamParser {
String filePath = pureTemplatePath.substring(TEMPLATE_PATH_PREFIX_FILE.length());
templateLoader = new FileTemplateLoader(new File(filePath));
} else if (pureTemplatePath.startsWith("[")
- && cfg.getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_22) {
+ && cfg.getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_22) {
if (!pureTemplatePath.endsWith("]")) {
// B.C. constraint: Can't throw any checked exceptions.
throw new TemplatePathParsingException("Failed to parse template path; closing \"]\" is missing.");
@@ -96,7 +96,7 @@ final class InitParamParser {
}
templateLoader = new MultiTemplateLoader(templateLoaders);
} else if (pureTemplatePath.startsWith("{")
- && cfg.getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_22) {
+ && cfg.getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_22) {
throw new TemplatePathParsingException("Template paths starting with \"{\" are reseved for future purposes");
} else {
templateLoader = new WebappTemplateLoader(srvCtx, pureTemplatePath);
diff --git a/src/main/java/freemarker/template/Configuration.java b/src/main/java/freemarker/template/Configuration.java
index 11ac38bd..93bfd83d 100644
--- a/src/main/java/freemarker/template/Configuration.java
+++ b/src/main/java/freemarker/template/Configuration.java
@@ -1031,7 +1031,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
private static TemplateLoader createDefaultTemplateLoader(
Version incompatibleImprovements, TemplateLoader existingTemplateLoader) {
- if (incompatibleImprovements.intValue() < _TemplateAPI.VERSION_INT_2_3_21) {
+ if (incompatibleImprovements.intValue() < _VersionInts.V_2_3_21) {
if (existingTemplateLoader instanceof LegacyDefaultFileTemplateLoader) {
return existingTemplateLoader;
}
@@ -2463,7 +2463,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
@Override
public boolean getRecognizeStandardFileExtensions() {
return recognizeStandardFileExtensions == null
- ? incompatibleImprovements.intValue() >= _TemplateAPI.VERSION_INT_2_3_24
+ ? incompatibleImprovements.intValue() >= _VersionInts.V_2_3_24
: recognizeStandardFileExtensions.booleanValue();
}
@@ -3667,7 +3667,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
* @since 2.3.21
*/
public static ObjectWrapper getDefaultObjectWrapper(Version incompatibleImprovements) {
- if (incompatibleImprovements.intValue() < _TemplateAPI.VERSION_INT_2_3_21) {
+ if (incompatibleImprovements.intValue() < _VersionInts.V_2_3_21) {
return ObjectWrapper.DEFAULT_WRAPPER;
} else {
return new DefaultObjectWrapperBuilder(incompatibleImprovements).build();
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapper.java b/src/main/java/freemarker/template/DefaultObjectWrapper.java
index eb44ce65..07b16229 100644
--- a/src/main/java/freemarker/template/DefaultObjectWrapper.java
+++ b/src/main/java/freemarker/template/DefaultObjectWrapper.java
@@ -133,7 +133,7 @@ public class DefaultObjectWrapper extends freemarker.ext.beans.BeansWrapper {
: new DefaultObjectWrapperConfiguration(bwCfg.getIncompatibleImprovements()) { };
useAdaptersForContainers = dowDowCfg.getUseAdaptersForContainers();
useAdapterForEnumerations = useAdaptersForContainers
- && getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_26;
+ && getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_26;
forceLegacyNonListCollections = dowDowCfg.getForceLegacyNonListCollections();
iterableSupport = dowDowCfg.getIterableSupport();
domNodeSupport = dowDowCfg.getDOMNodeSupport();
@@ -450,8 +450,8 @@ public class DefaultObjectWrapper extends freemarker.ext.beans.BeansWrapper {
protected static Version normalizeIncompatibleImprovementsVersion(Version incompatibleImprovements) {
_TemplateAPI.checkVersionNotNullAndSupported(incompatibleImprovements);
Version bwIcI = BeansWrapper.normalizeIncompatibleImprovementsVersion(incompatibleImprovements);
- return incompatibleImprovements.intValue() < _TemplateAPI.VERSION_INT_2_3_22
- || bwIcI.intValue() >= _TemplateAPI.VERSION_INT_2_3_22
+ return incompatibleImprovements.intValue() < _VersionInts.V_2_3_22
+ || bwIcI.intValue() >= _VersionInts.V_2_3_22
? bwIcI : Configuration.VERSION_2_3_22;
}
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java b/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
index a9575bc1..da93feeb 100644
--- a/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
+++ b/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
@@ -43,8 +43,8 @@ public abstract class DefaultObjectWrapperConfiguration extends BeansWrapperConf
_TemplateAPI.checkCurrentVersionNotRecycled(
incompatibleImprovements,
"freemarker.configuration", "DefaultObjectWrapper");
- useAdaptersForContainers = getIncompatibleImprovements().intValue() >= _TemplateAPI.VERSION_INT_2_3_22;
- forceLegacyNonListCollections = true; // [2.4]: = IcI < _TemplateAPI.VERSION_INT_2_4_0;
+ useAdaptersForContainers = getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_22;
+ forceLegacyNonListCollections = true; // [2.4]: = IcI < _TemplateAPI.V_2_4_0;
domNodeSupport = true;
jythonSupport = true;
}
diff --git a/src/main/java/freemarker/template/Template.java b/src/main/java/freemarker/template/Template.java
index 578f48d9..06e9cb1a 100644
--- a/src/main/java/freemarker/template/Template.java
+++ b/src/main/java/freemarker/template/Template.java
@@ -343,9 +343,9 @@ public class Template extends Configurable {
private static Version normalizeTemplateLanguageVersion(Version incompatibleImprovements) {
_TemplateAPI.checkVersionNotNullAndSupported(incompatibleImprovements);
int v = incompatibleImprovements.intValue();
- if (v < _TemplateAPI.VERSION_INT_2_3_19) {
+ if (v < _VersionInts.V_2_3_19) {
return Configuration.VERSION_2_3_0;
- } else if (v > _TemplateAPI.VERSION_INT_2_3_21) {
+ } else if (v > _VersionInts.V_2_3_21) {
return Configuration.VERSION_2_3_21;
} else { // if 2.3.19 or 2.3.20 or 2.3.21
return incompatibleImprovements;
diff --git a/src/main/java/freemarker/template/_ObjectWrappers.java b/src/main/java/freemarker/template/_ObjectWrappers.java
new file mode 100644
index 00000000..511531b9
--- /dev/null
+++ b/src/main/java/freemarker/template/_ObjectWrappers.java
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+package freemarker.template;
+
+/**
+ * For internal use only; don't depend on this, there's no backward compatibility guarantee at all!
+ * This class is to work around the lack of module system in Java, i.e., so that other FreeMarker packages can
+ * access things inside this package that users shouldn't.
+ */
+// Be careful to not refer this class in the static initializers of other classes that (indirectly) refer to this class,
+// as that can lead to deadlock as the class initialization locks are acquired by the JVM! This is also why this was
+// extracted from _TemplateAPI.
+public final class _ObjectWrappers {
+ /**
+ * Kind of a dummy {@link ObjectWrapper} used at places where the internal code earlier used the
+ * {@link ObjectWrapper#DEFAULT_WRAPPER} singleton, because it wasn't supposed to wrap/unwrap anything with it;
+ * never use this {@link ObjectWrapper} in situations where values of arbitrary types need to be wrapped!
+ * The typical situation is that we are using {@link SimpleSequence}, or {@link SimpleHash}, which always has an
+ * {@link ObjectWrapper} field, even if we don't care in the given situation, and so we didn't set it explicitly.
+ * The concern with the old way is that the {@link ObjectWrapper} set in the {@link Configuration} is possibly
+ * more restrictive than the default, so if the template author can somehow make FreeMarker wrap something with the
+ * default {@link ObjectWrapper}, then we got a security problem. So we try not to have that around, if possible.
+ * The obvious fix, and the better engineering would be just use a {@link TemplateSequenceModel} or
+ * {@link TemplateHashModelEx2} implementation at those places, which doesn't have an {@link ObjectWrapper} (and
+ * doesn't have the overhead of said implementations either). But, some user code might casts the values it
+ * receives (as directive argument for example) to {@link SimpleSequence} or {@link SimpleHash}, instead of to
+ * {@link TemplateSequenceModel} or {@link TemplateHashModelEx2}. Such user code is wrong, but still, if it worked
+ * so far fine (especially as sequence/hash literals are implemented by these "Simple" classes), it's better if it
+ * keeps working when they upgrade to 2.3.30. Such user code will be still out of luck if it also tries to add items
+ * which are not handled by {@link SimpleObjectWrapper}, but such abuse is even more unlikely, and this is how far
+ * we could go with this backward compatibility hack.
+ *
+ * @since 2.3.30
+ */
+ public static final SimpleObjectWrapper SAFE_OBJECT_WRAPPER;
+ static {
+ SAFE_OBJECT_WRAPPER = new SimpleObjectWrapper(Configuration.VERSION_2_3_0);
+ SAFE_OBJECT_WRAPPER.writeProtect();
+ }
+
+}
diff --git a/src/main/java/freemarker/template/_TemplateAPI.java b/src/main/java/freemarker/template/_TemplateAPI.java
index a43842fe..51002b8b 100644
--- a/src/main/java/freemarker/template/_TemplateAPI.java
+++ b/src/main/java/freemarker/template/_TemplateAPI.java
@@ -36,55 +36,12 @@ import freemarker.template.utility.NullArgumentException;
/**
* For internal use only; don't depend on this, there's no backward compatibility guarantee at all!
* This class is to work around the lack of module system in Java, i.e., so that other FreeMarker packages can
- * access things inside this package that users shouldn't.
- */
+ * access things inside this package that users shouldn't.
+ */
public class _TemplateAPI {
-
- // Constants for faster access... probably unnecessary and should be removed.
- public static final int VERSION_INT_2_3_0 = Configuration.VERSION_2_3_0.intValue();
- public static final int VERSION_INT_2_3_19 = Configuration.VERSION_2_3_19.intValue();
- public static final int VERSION_INT_2_3_20 = Configuration.VERSION_2_3_20.intValue();
- public static final int VERSION_INT_2_3_21 = Configuration.VERSION_2_3_21.intValue();
- public static final int VERSION_INT_2_3_22 = Configuration.VERSION_2_3_22.intValue();
- public static final int VERSION_INT_2_3_23 = Configuration.VERSION_2_3_23.intValue();
- public static final int VERSION_INT_2_3_24 = Configuration.VERSION_2_3_24.intValue();
- public static final int VERSION_INT_2_3_25 = Configuration.VERSION_2_3_25.intValue();
- public static final int VERSION_INT_2_3_26 = Configuration.VERSION_2_3_26.intValue();
- public static final int VERSION_INT_2_3_27 = Configuration.VERSION_2_3_27.intValue();
- public static final int VERSION_INT_2_3_28 = Configuration.VERSION_2_3_28.intValue();
- public static final int VERSION_INT_2_3_29 = Configuration.VERSION_2_3_29.intValue();
- public static final int VERSION_INT_2_3_30 = Configuration.VERSION_2_3_30.intValue();
- public static final int VERSION_INT_2_3_31 = Configuration.VERSION_2_3_31.intValue();
- public static final int VERSION_INT_2_3_32 = Configuration.VERSION_2_3_32.intValue();
- public static final int VERSION_INT_2_4_0 = Version.intValueFor(2, 4, 0);
+ // ATTENTION! Don't refer to other classes in the static initializer of this class! Fields that need that must be
+ // moved into separate class, as it was done in _VersionInts, and _ObjectWrappers, to avoid class init deadlocks.
- /**
- * Kind of a dummy {@link ObjectWrapper} used at places where the internal code earlier used the
- * {@link ObjectWrapper#DEFAULT_WRAPPER} singleton, because it wasn't supposed to wrap/unwrap anything with it;
- * never use this {@link ObjectWrapper} in situations where values of arbitrary types need to be wrapped!
- * The typical situation is that we are using {@link SimpleSequence}, or {@link SimpleHash}, which always has an
- * {@link ObjectWrapper} field, even if we don't care in the given situation, and so we didn't set it explicitly.
- * The concern with the old way is that the {@link ObjectWrapper} set in the {@link Configuration} is possibly
- * more restrictive than the default, so if the template author can somehow make FreeMarker wrap something with the
- * default {@link ObjectWrapper}, then we got a security problem. So we try not to have that around, if possible.
- * The obvious fix, and the better engineering would be just use a {@link TemplateSequenceModel} or
- * {@link TemplateHashModelEx2} implementation at those places, which doesn't have an {@link ObjectWrapper} (and
- * doesn't have the overhead of said implementations either). But, some user code might casts the values it
- * receives (as directive argument for example) to {@link SimpleSequence} or {@link SimpleHash}, instead of to
- * {@link TemplateSequenceModel} or {@link TemplateHashModelEx2}. Such user code is wrong, but still, if it worked
- * so far fine (especially as sequence/hash literals are implemented by these "Simple" classes), it's better if it
- * keeps working when they upgrade to 2.3.30. Such user code will be still out of luck if it also tries to add items
- * which are not handled by {@link SimpleObjectWrapper}, but such abuse is even more unlikely, and this is how far
- * we could go with this backward compatibility hack.
- *
- * @since 2.3.30
- */
- public static final SimpleObjectWrapper SAFE_OBJECT_WRAPPER;
- static {
- SAFE_OBJECT_WRAPPER = new SimpleObjectWrapper(Configuration.VERSION_2_3_0);
- SAFE_OBJECT_WRAPPER.writeProtect();
- }
-
public static void checkVersionNotNullAndSupported(Version incompatibleImprovements) {
NullArgumentException.check("incompatibleImprovements", incompatibleImprovements);
int iciV = incompatibleImprovements.intValue();
@@ -93,7 +50,7 @@ public class _TemplateAPI {
+ incompatibleImprovements + ", but the installed FreeMarker version is only "
+ Configuration.getVersion() + ". You may need to upgrade FreeMarker in your project.");
}
- if (iciV < VERSION_INT_2_3_0) {
+ if (iciV < _VersionInts.V_2_3_0) {
throw new IllegalArgumentException("\"incompatibleImprovements\" must be at least 2.3.0.");
}
}
diff --git a/src/main/java/freemarker/template/_VersionInts.java b/src/main/java/freemarker/template/_VersionInts.java
new file mode 100644
index 00000000..22ba09d8
--- /dev/null
+++ b/src/main/java/freemarker/template/_VersionInts.java
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+package freemarker.template;
+
+/**
+ * For internal use only; don't depend on this, there's no backward compatibility guarantee at all!
+ * This class is to work around the lack of module system in Java, i.e., so that other FreeMarker packages can
+ * access things inside this package that users shouldn't.
+ */
+// Because we refer to other classes in the static initializer of this class, be careful with referring this class in
+// the static initializers of other classes, as that can lead to deadlock if the class initialization locks are acquired
+// by the JVM in different orders! This is also why this was extracted from _TemplateAPI.
+public final class _VersionInts {
+ private _VersionInts() {
+ }
+
+ // Constants for faster access... probably unnecessary and should be removed.
+ public static final int V_2_3_0 = Configuration.VERSION_2_3_0.intValue();
+ public static final int V_2_3_19 = Configuration.VERSION_2_3_19.intValue();
+ public static final int V_2_3_20 = Configuration.VERSION_2_3_20.intValue();
+ public static final int V_2_3_21 = Configuration.VERSION_2_3_21.intValue();
+ public static final int V_2_3_22 = Configuration.VERSION_2_3_22.intValue();
+ public static final int V_2_3_23 = Configuration.VERSION_2_3_23.intValue();
+ public static final int V_2_3_24 = Configuration.VERSION_2_3_24.intValue();
+ public static final int V_2_3_25 = Configuration.VERSION_2_3_25.intValue();
+ public static final int V_2_3_26 = Configuration.VERSION_2_3_26.intValue();
+ public static final int V_2_3_27 = Configuration.VERSION_2_3_27.intValue();
+ public static final int V_2_3_28 = Configuration.VERSION_2_3_28.intValue();
+ public static final int V_2_3_30 = Configuration.VERSION_2_3_30.intValue();
+ public static final int V_2_3_31 = Configuration.VERSION_2_3_31.intValue();
+ public static final int V_2_3_32 = Configuration.VERSION_2_3_32.intValue();
+ public static final int V_2_4_0 = Version.intValueFor(2, 4, 0);
+}
diff --git a/src/main/java/freemarker/template/utility/DOMNodeModel.java b/src/main/java/freemarker/template/utility/DOMNodeModel.java
index b1c6f1b1..8a1ffef6 100644
--- a/src/main/java/freemarker/template/utility/DOMNodeModel.java
+++ b/src/main/java/freemarker/template/utility/DOMNodeModel.java
@@ -38,7 +38,7 @@ import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateSequenceModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
/**
* A convenient wrapper class for wrapping a Node in the W3C DOM API.
@@ -74,7 +74,7 @@ public class DOMNodeModel implements TemplateHashModel {
if ("attributes".equals(key)) {
NamedNodeMap attributes = node.getAttributes();
if (attributes != null) {
- SimpleHash hash = new SimpleHash(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleHash hash = new SimpleHash(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (int i = 0; i < attributes.getLength(); i++) {
Attr att = (Attr) attributes.item(i);
hash.put(att.getName(), att.getValue());
diff --git a/src/main/java/freemarker/template/utility/TemplateModelUtils.java b/src/main/java/freemarker/template/utility/TemplateModelUtils.java
index 4efff56c..a95f409c 100644
--- a/src/main/java/freemarker/template/utility/TemplateModelUtils.java
+++ b/src/main/java/freemarker/template/utility/TemplateModelUtils.java
@@ -39,7 +39,7 @@ import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateScalarModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
/**
* Static utility method related to {@link TemplateModel}-s that didn't fit elsewhere.
@@ -258,7 +258,7 @@ public final class TemplateModelUtils {
private void initKeys() throws TemplateModelException {
if (keys == null) {
Set<String> keySet = new HashSet<>();
- SimpleSequence keySeq = new SimpleSequence(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence keySeq = new SimpleSequence(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
for (TemplateHashModelEx hash : hashes) {
addKeys(keySet, keySeq, hash);
}
@@ -281,7 +281,7 @@ public final class TemplateModelUtils {
private void initValues() throws TemplateModelException {
if (values == null) {
- SimpleSequence seq = new SimpleSequence(size(), _TemplateAPI.SAFE_OBJECT_WRAPPER);
+ SimpleSequence seq = new SimpleSequence(size(), _ObjectWrappers.SAFE_OBJECT_WRAPPER);
// Note: size() invokes initKeys() if needed.
int ln = keys.size();
diff --git a/src/main/javacc/FTL.jj b/src/main/javacc/FTL.jj
index a6ee15b0..1ecfa4d8 100644
--- a/src/main/javacc/FTL.jj
+++ b/src/main/javacc/FTL.jj
@@ -292,22 +292,22 @@ public class FMParser {
this.outputFormat = outputFormat;
recalculateAutoEscapingField();
- if (incompatibleImprovements < _TemplateAPI.VERSION_INT_2_3_24) {
+ if (incompatibleImprovements < _VersionInts.V_2_3_24) {
// Emulate bug, where the string literal parser haven't inherited the IcI:
- incompatibleImprovements = _TemplateAPI.VERSION_INT_2_3_0;
+ incompatibleImprovements = _VersionInts.V_2_3_0;
}
-
+
// So that loop variable built-ins, like ?index, works inside the interpolations in the string literal:
iteratorBlockContexts = parentParser.iteratorBlockContexts;
}
void tearDownStringLiteralMode(FMParser parentParser) {
// If the naming convention was established inside the string literal, it's inherited by the parent:
- FMParserTokenManager parentTokenSource = parentParser.token_source;
+ FMParserTokenManager parentTokenSource = parentParser.token_source;
parentTokenSource.namingConvention = token_source.namingConvention;
parentTokenSource.namingConventionEstabilisher = token_source.namingConventionEstabilisher;
}
-
+
/**
* Used when we need to recreate the source code from the AST (such as for the FM2 to FM3 converter).
*/
@@ -350,7 +350,7 @@ public class FMParser {
}
return null;
}
-
+
/**
* Updates the {@link #autoEscaping} field based on the {@link #autoEscapingPolicy} and {@link #outputFormat} fields.
*/
@@ -369,7 +369,7 @@ public class FMParser {
autoEscaping = false;
}
}
-
+
MarkupOutputFormat getMarkupOutputFormat() {
return outputFormat instanceof MarkupOutputFormat ? (MarkupOutputFormat) outputFormat : null;
}
@@ -382,7 +382,7 @@ public class FMParser {
? Configuration.SQUARE_BRACKET_TAG_SYNTAX
: Configuration.ANGLE_BRACKET_TAG_SYNTAX;
}
-
+
/**
* Don't use it, unless you are developing FreeMarker itself.
* The naming convention used by this template; if it couldn't be detected so far, it will be the most probable one.
@@ -513,14 +513,14 @@ public class FMParser {
}
throw new ParseException("Expecting boolean (true/false) parameter", exp);
}
-
+
void checkCurrentOutputFormatCanEscape(Token start) throws ParseException {
if (!(outputFormat instanceof MarkupOutputFormat)) {
throw new ParseException("The current output format can't do escaping: " + outputFormat,
template, start);
}
- }
-
+ }
+
private ParserIteratorBlockContext pushIteratorBlockContext() {
if (iteratorBlockContexts == null) {
iteratorBlockContexts = new ArrayList<ParserIteratorBlockContext>(4);
@@ -529,16 +529,16 @@ public class FMParser {
iteratorBlockContexts.add(newCtx);
return newCtx;
}
-
+
private void popIteratorBlockContext() {
iteratorBlockContexts.remove(iteratorBlockContexts.size() - 1);
}
-
+
private ParserIteratorBlockContext peekIteratorBlockContext() {
int size = iteratorBlockContexts != null ? iteratorBlockContexts.size() : 0;
- return size != 0 ? (ParserIteratorBlockContext) iteratorBlockContexts.get(size - 1) : null;
+ return size != 0 ? (ParserIteratorBlockContext) iteratorBlockContexts.get(size - 1) : null;
}
-
+
private void checkLoopVariableBuiltInLHO(String loopVarName, Expression lhoExp, Token biName)
throws ParseException {
int size = iteratorBlockContexts != null ? iteratorBlockContexts.size() : 0;
@@ -560,8 +560,8 @@ public class FMParser {
+ "but there's no loop variable in scope with this name: " + loopVarName,
lhoExp);
}
-
- private String forEachDirectiveSymbol() {
+
+ private String forEachDirectiveSymbol() {
// [2.4] Use camel case as the default
return token_source.namingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION ? "#forEach" : "#foreach";
}
@@ -685,7 +685,7 @@ TOKEN_MGR_DECLS:
// We only get here if this is a strict FTL tag.
tagSyntaxEstablished = true;
- if (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_28
+ if (incompatibleImprovements >= _VersionInts.V_2_3_28
|| interpolationSyntax == SQUARE_BRACKET_INTERPOLATION_SYNTAX) {
// For END_xxx tags, as they can't contain expressions, the whole tag is a single token. So this is the only
// chance to check if we got something inconsistent like `</#if]`. (We can't do this at the #CLOSE_TAG1 or
@@ -702,16 +702,16 @@ TOKEN_MGR_DECLS:
}
} // if end-tag
}
-
+
checkNamingConvention(tok, tokenNamingConvention);
-
+
SwitchTo(newLexState);
}
void checkNamingConvention(Token tok) {
- checkNamingConvention(tok, _CoreStringUtils.getIdentifierNamingConvention(tok.image));
+ checkNamingConvention(tok, _CoreStringUtils.getIdentifierNamingConvention(tok.image));
}
-
+
void checkNamingConvention(Token tok, int tokenNamingConvention) {
if (tokenNamingConvention != Configuration.AUTO_DETECT_NAMING_CONVENTION) {
if (namingConvention == Configuration.AUTO_DETECT_NAMING_CONVENTION) {
@@ -722,7 +722,7 @@ TOKEN_MGR_DECLS:
}
}
}
-
+
private TokenMgrError newNameConventionMismatchException(Token tok) {
return new TokenMgrError(
"Naming convention mismatch. "
@@ -733,7 +733,7 @@ TOKEN_MGR_DECLS:
+ (namingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION
? "camel case naming convention (like: exampleName) "
: (namingConvention == Configuration.LEGACY_NAMING_CONVENTION
- ? "legacy naming convention (directive (tag) names are like examplename, "
+ ? "legacy naming convention (directive (tag) names are like examplename, "
+ "everything else is like example_name) "
: "??? (internal error)"
))
@@ -755,11 +755,11 @@ TOKEN_MGR_DECLS:
private void handleTagSyntaxAndSwitch(Token tok, int newLexState) {
handleTagSyntaxAndSwitch(tok, Configuration.AUTO_DETECT_NAMING_CONVENTION, newLexState);
}
-
+
private boolean isStrictTag(String image) {
return image.length() > 2 && (image.charAt(1) == '#' || image.charAt(2) == '#');
}
-
+
/**
* Detects the naming convention used, both in start- and end-tag tokens.
*
@@ -773,7 +773,7 @@ TOKEN_MGR_DECLS:
static char getTagNameCharAt(Token tok, int charIdxInName) {
final String image = tok.image;
-
+
// Skip tag delimiter:
int idx = 0;
for (;;) {
@@ -817,7 +817,7 @@ TOKEN_MGR_DECLS:
}
private void startInterpolation(Token tok) {
- if (
+ if (
interpolationSyntax == LEGACY_INTERPOLATION_SYNTAX
&& tok.kind == SQUARE_BRACKET_INTERPOLATION_OPENING
|| interpolationSyntax == DOLLAR_INTERPOLATION_SYNTAX
@@ -827,7 +827,7 @@ TOKEN_MGR_DECLS:
tok.kind = STATIC_TEXT_NON_WS;
return;
}
-
+
if (postInterpolationLexState != -1) {
// This certainly never occurs, as starting an interpolation in expression mode fails earlier.
char c = tok.image.charAt(0);
@@ -847,7 +847,7 @@ TOKEN_MGR_DECLS:
SwitchTo(postInterpolationLexState);
postInterpolationLexState = -1;
}
-
+
private TokenMgrError newUnexpectedClosingTokenException(Token closingTk) {
return new TokenMgrError(
"You can't have an \"" + closingTk.image + "\" here, as there's nothing open that it could close.",
@@ -921,7 +921,7 @@ TOKEN:
*/
<ATTEMPT : <START_TAG> "attempt" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
|
- <RECOVER : <START_TAG> "recover" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
+ <RECOVER : <START_TAG> "recover" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
|
<IF : <START_TAG> "if" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
|
@@ -1096,7 +1096,7 @@ TOKEN:
*/
<UNKNOWN_DIRECTIVE : ("[#" | "[/#" | "<#" | "</#") (["a"-"z", "A"-"Z", "_"])+>
{
- if (!tagSyntaxEstablished && incompatibleImprovements < _TemplateAPI.VERSION_INT_2_3_19) {
+ if (!tagSyntaxEstablished && incompatibleImprovements < _VersionInts.V_2_3_19) {
matchedToken.kind = STATIC_TEXT_NON_WS;
} else {
char firstChar = matchedToken.image.charAt(0);
@@ -1121,7 +1121,7 @@ TOKEN:
// unknown directive:
if (_CoreAPI.ALL_BUILT_IN_DIRECTIVE_NAMES.contains(dn)) {
throw new TokenMgrError(
- "#" + dn + " is an existing directive, but the tag is malformed. "
+ "#" + dn + " is an existing directive, but the tag is malformed. "
+ " (See FreeMarker Manual / Directive Reference.)",
TokenMgrError.LEXICAL_ERROR,
matchedToken.beginLine, matchedToken.beginColumn + 1,
@@ -1214,7 +1214,7 @@ TOKEN:
("x" ["0"-"9", "A"-"F", "a"-"f"])
)
>
- |
+ |
<STRING_LITERAL :
(
"\""
@@ -1322,12 +1322,12 @@ TOKEN:
// There's a legacy glitch where you can always close a tag with `]`, like `<#if x]`. We have to keep that
// working for backward compatibility, hence we don't always throw at !squBracTagSyntax:
if (!squBracTagSyntax
- && (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_28
+ && (incompatibleImprovements >= _VersionInts.V_2_3_28
|| interpolationSyntax == SQUARE_BRACKET_INTERPOLATION_SYNTAX)
|| postInterpolationLexState != -1 /* We're in an interpolation => We aren't in a tag */) {
throw newUnexpectedClosingTokenException(matchedToken);
}
-
+
// Close tag, either legally or to emulate legacy glitch:
matchedToken.kind = DIRECTIVE_END;
if (inFTLHeader) {
@@ -1379,7 +1379,7 @@ TOKEN:
// Remove backslashes from Token.image:
final String s = matchedToken.image;
if (s.indexOf('\\') != -1) {
- final int srcLn = s.length();
+ final int srcLn = s.length();
final char[] newS = new char[srcLn - 1];
int dstIdx = 0;
for (int srcIdx = 0; srcIdx < srcLn; srcIdx++) {
@@ -1411,136 +1411,136 @@ TOKEN:
<#NON_ESCAPED_ID_START_CHAR:
[
// This was generated on JDK 1.8.0_20 Win64 with src/main/misc/identifierChars/IdentifierCharGenerator.java
- "$",
- "@" - "Z",
- "_",
- "a" - "z",
- "\u00AA",
- "\u00B5",
- "\u00BA",
- "\u00C0" - "\u00D6",
- "\u00D8" - "\u00F6",
- "\u00F8" - "\u1FFF",
- "\u2071",
- "\u207F",
- "\u2090" - "\u209C",
- "\u2102",
- "\u2107",
- "\u210A" - "\u2113",
- "\u2115",
- "\u2119" - "\u211D",
- "\u2124",
- "\u2126",
- "\u2128",
- "\u212A" - "\u212D",
- "\u212F" - "\u2139",
- "\u213C" - "\u213F",
- "\u2145" - "\u2149",
- "\u214E",
- "\u2183" - "\u2184",
- "\u2C00" - "\u2C2E",
- "\u2C30" - "\u2C5E",
- "\u2C60" - "\u2CE4",
- "\u2CEB" - "\u2CEE",
- "\u2CF2" - "\u2CF3",
- "\u2D00" - "\u2D25",
- "\u2D27",
- "\u2D2D",
- "\u2D30" - "\u2D67",
- "\u2D6F",
- "\u2D80" - "\u2D96",
- "\u2DA0" - "\u2DA6",
- "\u2DA8" - "\u2DAE",
- "\u2DB0" - "\u2DB6",
- "\u2DB8" - "\u2DBE",
- "\u2DC0" - "\u2DC6",
- "\u2DC8" - "\u2DCE",
- "\u2DD0" - "\u2DD6",
- "\u2DD8" - "\u2DDE",
- "\u2E2F",
- "\u3005" - "\u3006",
- "\u3031" - "\u3035",
- "\u303B" - "\u303C",
- "\u3040" - "\u318F",
- "\u31A0" - "\u31BA",
- "\u31F0" - "\u31FF",
- "\u3300" - "\u337F",
- "\u3400" - "\u4DB5",
- "\u4E00" - "\uA48C",
- "\uA4D0" - "\uA4FD",
- "\uA500" - "\uA60C",
- "\uA610" - "\uA62B",
- "\uA640" - "\uA66E",
- "\uA67F" - "\uA697",
- "\uA6A0" - "\uA6E5",
- "\uA717" - "\uA71F",
- "\uA722" - "\uA788",
- "\uA78B" - "\uA78E",
- "\uA790" - "\uA793",
- "\uA7A0" - "\uA7AA",
- "\uA7F8" - "\uA801",
- "\uA803" - "\uA805",
- "\uA807" - "\uA80A",
- "\uA80C" - "\uA822",
- "\uA840" - "\uA873",
- "\uA882" - "\uA8B3",
- "\uA8D0" - "\uA8D9",
- "\uA8F2" - "\uA8F7",
- "\uA8FB",
- "\uA900" - "\uA925",
- "\uA930" - "\uA946",
- "\uA960" - "\uA97C",
- "\uA984" - "\uA9B2",
- "\uA9CF" - "\uA9D9",
- "\uAA00" - "\uAA28",
- "\uAA40" - "\uAA42",
- "\uAA44" - "\uAA4B",
- "\uAA50" - "\uAA59",
- "\uAA60" - "\uAA76",
- "\uAA7A",
- "\uAA80" - "\uAAAF",
- "\uAAB1",
- "\uAAB5" - "\uAAB6",
- "\uAAB9" - "\uAABD",
- "\uAAC0",
- "\uAAC2",
- "\uAADB" - "\uAADD",
- "\uAAE0" - "\uAAEA",
- "\uAAF2" - "\uAAF4",
- "\uAB01" - "\uAB06",
- "\uAB09" - "\uAB0E",
- "\uAB11" - "\uAB16",
- "\uAB20" - "\uAB26",
- "\uAB28" - "\uAB2E",
- "\uABC0" - "\uABE2",
- "\uABF0" - "\uABF9",
- "\uAC00" - "\uD7A3",
- "\uD7B0" - "\uD7C6",
- "\uD7CB" - "\uD7FB",
- "\uF900" - "\uFB06",
- "\uFB13" - "\uFB17",
- "\uFB1D",
- "\uFB1F" - "\uFB28",
- "\uFB2A" - "\uFB36",
- "\uFB38" - "\uFB3C",
- "\uFB3E",
- "\uFB40" - "\uFB41",
- "\uFB43" - "\uFB44",
- "\uFB46" - "\uFBB1",
- "\uFBD3" - "\uFD3D",
- "\uFD50" - "\uFD8F",
- "\uFD92" - "\uFDC7",
- "\uFDF0" - "\uFDFB",
- "\uFE70" - "\uFE74",
- "\uFE76" - "\uFEFC",
- "\uFF10" - "\uFF19",
- "\uFF21" - "\uFF3A",
- "\uFF41" - "\uFF5A",
- "\uFF66" - "\uFFBE",
- "\uFFC2" - "\uFFC7",
- "\uFFCA" - "\uFFCF",
- "\uFFD2" - "\uFFD7",
- "\uFFDA" - "\uFFDC"
+ "$",
+ "@" - "Z",
+ "_",
+ "a" - "z",
+ "\u00AA",
+ "\u00B5",
+ "\u00BA",
+ "\u00C0" - "\u00D6",
+ "\u00D8" - "\u00F6",
+ "\u00F8" - "\u1FFF",
+ "\u2071",
+ "\u207F",
+ "\u2090" - "\u209C",
+ "\u2102",
+ "\u2107",
+ "\u210A" - "\u2113",
+ "\u2115",
+ "\u2119" - "\u211D",
+ "\u2124",
+ "\u2126",
+ "\u2128",
+ "\u212A" - "\u212D",
+ "\u212F" - "\u2139",
+ "\u213C" - "\u213F",
+ "\u2145" - "\u2149",
+ "\u214E",
+ "\u2183" - "\u2184",
+ "\u2C00" - "\u2C2E",
+ "\u2C30" - "\u2C5E",
+ "\u2C60" - "\u2CE4",
+ "\u2CEB" - "\u2CEE",
+ "\u2CF2" - "\u2CF3",
+ "\u2D00" - "\u2D25",
+ "\u2D27",
+ "\u2D2D",
+ "\u2D30" - "\u2D67",
+ "\u2D6F",
+ "\u2D80" - "\u2D96",
+ "\u2DA0" - "\u2DA6",
+ "\u2DA8" - "\u2DAE",
+ "\u2DB0" - "\u2DB6",
+ "\u2DB8" - "\u2DBE",
+ "\u2DC0" - "\u2DC6",
+ "\u2DC8" - "\u2DCE",
+ "\u2DD0" - "\u2DD6",
+ "\u2DD8" - "\u2DDE",
+ "\u2E2F",
+ "\u3005" - "\u3006",
+ "\u3031" - "\u3035",
+ "\u303B" - "\u303C",
+ "\u3040" - "\u318F",
+ "\u31A0" - "\u31BA",
+ "\u31F0" - "\u31FF",
+ "\u3300" - "\u337F",
+ "\u3400" - "\u4DB5",
+ "\u4E00" - "\uA48C",
+ "\uA4D0" - "\uA4FD",
+ "\uA500" - "\uA60C",
+ "\uA610" - "\uA62B",
+ "\uA640" - "\uA66E",
+ "\uA67F" - "\uA697",
+ "\uA6A0" - "\uA6E5",
+ "\uA717" - "\uA71F",
+ "\uA722" - "\uA788",
+ "\uA78B" - "\uA78E",
+ "\uA790" - "\uA793",
+ "\uA7A0" - "\uA7AA",
+ "\uA7F8" - "\uA801",
+ "\uA803" - "\uA805",
+ "\uA807" - "\uA80A",
+ "\uA80C" - "\uA822",
+ "\uA840" - "\uA873",
+ "\uA882" - "\uA8B3",
+ "\uA8D0" - "\uA8D9",
+ "\uA8F2" - "\uA8F7",
+ "\uA8FB",
+ "\uA900" - "\uA925",
+ "\uA930" - "\uA946",
+ "\uA960" - "\uA97C",
+ "\uA984" - "\uA9B2",
+ "\uA9CF" - "\uA9D9",
+ "\uAA00" - "\uAA28",
+ "\uAA40" - "\uAA42",
+ "\uAA44" - "\uAA4B",
+ "\uAA50" - "\uAA59",
+ "\uAA60" - "\uAA76",
+ "\uAA7A",
+ "\uAA80" - "\uAAAF",
+ "\uAAB1",
+ "\uAAB5" - "\uAAB6",
+ "\uAAB9" - "\uAABD",
+ "\uAAC0",
+ "\uAAC2",
+ "\uAADB" - "\uAADD",
+ "\uAAE0" - "\uAAEA",
+ "\uAAF2" - "\uAAF4",
+ "\uAB01" - "\uAB06",
+ "\uAB09" - "\uAB0E",
+ "\uAB11" - "\uAB16",
+ "\uAB20" - "\uAB26",
+ "\uAB28" - "\uAB2E",
+ "\uABC0" - "\uABE2",
+ "\uABF0" - "\uABF9",
+ "\uAC00" - "\uD7A3",
+ "\uD7B0" - "\uD7C6",
+ "\uD7CB" - "\uD7FB",
+ "\uF900" - "\uFB06",
+ "\uFB13" - "\uFB17",
+ "\uFB1D",
+ "\uFB1F" - "\uFB28",
+ "\uFB2A" - "\uFB36",
+ "\uFB38" - "\uFB3C",
+ "\uFB3E",
+ "\uFB40" - "\uFB41",
+ "\uFB43" - "\uFB44",
+ "\uFB46" - "\uFBB1",
+ "\uFBD3" - "\uFD3D",
+ "\uFD50" - "\uFD8F",
+ "\uFD92" - "\uFDC7",
+ "\uFDF0" - "\uFDFB",
+ "\uFE70" - "\uFE74",
+ "\uFE76" - "\uFEFC",
+ "\uFF10" - "\uFF19",
+ "\uFF21" - "\uFF3A",
+ "\uFF41" - "\uFF5A",
+ "\uFF66" - "\uFFBE",
+ "\uFFC2" - "\uFFC7",
+ "\uFFCA" - "\uFFCF",
+ "\uFFD2" - "\uFFD7",
+ "\uFFDA" - "\uFFDC"
]
>
|
@@ -1569,7 +1569,7 @@ TOKEN:
|
<EMPTY_DIRECTIVE_END : "/>" | "/]">
{
- if (tagSyntaxEstablished && (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_28
+ if (tagSyntaxEstablished && (incompatibleImprovements >= _VersionInts.V_2_3_28
|| interpolationSyntax == SQUARE_BRACKET_INTERPOLATION_SYNTAX)) {
String image = matchedToken.image;
char lastChar = image.charAt(image.length() - 1);
@@ -3518,11 +3518,11 @@ Macro Macro() :
// To prevent parser check loopholes like <#list ...><#macro ...><#break></#macro></#list>.
lastIteratorBlockContexts = iteratorBlockContexts;
iteratorBlockContexts = null;
- if (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_23) {
- lastBreakableDirectiveNesting = breakableDirectiveNesting;
- lastContinuableDirectiveNesting = continuableDirectiveNesting;
- breakableDirectiveNesting = 0;
- continuableDirectiveNesting = 0;
+ if (incompatibleImprovements >= _VersionInts.V_2_3_23) {
+ lastBreakableDirectiveNesting = breakableDirectiveNesting;
+ lastContinuableDirectiveNesting = continuableDirectiveNesting;
+ breakableDirectiveNesting = 0;
+ continuableDirectiveNesting = 0;
} else {
lastBreakableDirectiveNesting = 0; // Just to prevent uninitialized local variable error later
lastContinuableDirectiveNesting = 0;
@@ -3542,11 +3542,11 @@ Macro Macro() :
)
{
iteratorBlockContexts = lastIteratorBlockContexts;
- if (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_23) {
+ if (incompatibleImprovements >= _VersionInts.V_2_3_23) {
breakableDirectiveNesting = lastBreakableDirectiveNesting;
continuableDirectiveNesting = lastContinuableDirectiveNesting;
}
-
+
inMacro = inFunction = false;
Macro result = new Macro(
name, paramNamesWithDefault, catchAllParamName, isFunction, requireArgsSpecialVariable, children);
@@ -4305,7 +4305,7 @@ Token UnparsedContent(Token start, StringBuilder buf) :
{
buf.setLength(buf.length() - t.image.length());
if (!t.image.endsWith(";")
- && _TemplateAPI.getTemplateLanguageVersionAsInt(template) >= _TemplateAPI.VERSION_INT_2_3_21) {
+ && _TemplateAPI.getTemplateLanguageVersionAsInt(template) >= _VersionInts.V_2_3_21) {
throw new ParseException("Unclosed \"" + start.image + "\"", template, start);
}
return t;
diff --git a/src/test/java/freemarker/template/ConfigurationTest.java b/src/test/java/freemarker/template/ConfigurationTest.java
index 9bf0609d..a3adc5ba 100644
--- a/src/test/java/freemarker/template/ConfigurationTest.java
+++ b/src/test/java/freemarker/template/ConfigurationTest.java
@@ -334,7 +334,7 @@ public class ConfigurationTest extends TestCase {
public void testVersion() {
Version v = Configuration.getVersion();
- assertTrue(v.intValue() > _TemplateAPI.VERSION_INT_2_3_20);
+ assertTrue(v.intValue() > _VersionInts.V_2_3_20);
assertSame(v.toString(), Configuration.getVersionNumber());
try {
diff --git a/src/test/java/freemarker/template/DefaultObjectWrapperTest.java b/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
index 17c67023..541bf1bf 100644
--- a/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
+++ b/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
@@ -106,7 +106,7 @@ public class DefaultObjectWrapperTest {
expected.add(Configuration.VERSION_2_3_27); // no non-BC change in 2.3.32
List<Version> actual = new ArrayList<>();
- for (int i = _TemplateAPI.VERSION_INT_2_3_0; i <= Configuration.getVersion().intValue(); i++) {
+ for (int i = _VersionInts.V_2_3_0; i <= Configuration.getVersion().intValue(); i++) {
int major = i / 1000000;
int minor = i % 1000000 / 1000;
int micro = i % 1000;
diff --git a/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java b/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
index f0cb148d..5e179a25 100644
--- a/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
+++ b/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
@@ -74,7 +74,7 @@ import freemarker.template.TemplateNodeModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
import freemarker.template.Version;
-import freemarker.template._TemplateAPI;
+import freemarker.template._VersionInts;
import freemarker.template.utility.NullArgumentException;
import freemarker.template.utility.NullWriter;
import freemarker.template.utility.StringUtil;
@@ -450,7 +450,7 @@ public class TemplateTestCase extends FileTestCase {
dataModel.put("dow", dow);
dataModel.put("dowPre22", dow
&& ((DefaultObjectWrapper) conf.getObjectWrapper()).getIncompatibleImprovements()
- .intValue() < _TemplateAPI.VERSION_INT_2_3_22);
+ .intValue() < _VersionInts.V_2_3_22);
}
}
diff --git a/src/test/java/freemarker/test/templatesuite/models/LegacyList.java b/src/test/java/freemarker/test/templatesuite/models/LegacyList.java
index a02199bc..e23b60bd 100644
--- a/src/test/java/freemarker/test/templatesuite/models/LegacyList.java
+++ b/src/test/java/freemarker/test/templatesuite/models/LegacyList.java
@@ -24,7 +24,7 @@ import java.util.Iterator;
import freemarker.template.SimpleSequence;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
/**
* A little bridge class that subclasses the new SimpleList
@@ -35,7 +35,7 @@ public class LegacyList extends SimpleSequence {
private Iterator iterator;
public LegacyList() {
- super(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ super(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
}
/**
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java b/src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
index f317b18c..5d4049c6 100644
--- a/src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
+++ b/src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
@@ -24,7 +24,7 @@ import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
-import freemarker.template._TemplateAPI;
+import freemarker.template._ObjectWrappers;
import freemarker.template.utility.HtmlEscape;
import freemarker.template.utility.StandardCompress;
@@ -34,7 +34,7 @@ import freemarker.template.utility.StandardCompress;
public class TransformHashWrapper implements TemplateHashModel,
TemplateScalarModel {
- private SimpleHash m_cHashModel = new SimpleHash(_TemplateAPI.SAFE_OBJECT_WRAPPER);
+ private SimpleHash m_cHashModel = new SimpleHash(_ObjectWrappers.SAFE_OBJECT_WRAPPER);
/** Creates new TransformHashWrapper */
public TransformHashWrapper() {