Configuration is now immutable. Instead, you should use Configuration.Builder to set up the setting values, then create the Configuration with the builder's build() method. FreemarkerServlet (including some of its public and protected API-s) and the test suite was reworked accordingly. There are still many rough edges, such as the setSetting(Strin,String) API should appear in MutableParsingAndProcessingConfiguration too, it's not settled how we will handle Map/List setting values (when are they copied to avoid aliasing effects, when they are remain mutable), etc.
Some cleanup of random small things I have ran into during the above refactoring. Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/7d61a45d Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/7d61a45d Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/7d61a45d Branch: refs/heads/3 Commit: 7d61a45d9ff129138c0eccc5a30112d7b419f22a Parents: 7c85a56 Author: ddekany <[email protected]> Authored: Fri May 5 22:51:25 2017 +0200 Committer: ddekany <[email protected]> Committed: Fri May 5 23:00:07 2017 +0200 ---------------------------------------------------------------------- README.md | 1 - .../apache/freemarker/core/ASTDirSetting.java | 14 +- .../apache/freemarker/core/ASTExpBuiltIn.java | 10 +- .../freemarker/core/ASTExpBuiltInVariable.java | 10 +- .../freemarker/core/ASTExpHashLiteral.java | 5 +- .../apache/freemarker/core/Configuration.java | 3924 +++++++++--------- .../freemarker/core/ConfigurationException.java | 2 +- .../ConfigurationSettingValueException.java | 61 +- .../org/apache/freemarker/core/Environment.java | 69 +- ...utableParsingAndProcessingConfiguration.java | 225 +- .../core/MutableProcessingConfiguration.java | 677 +-- .../NonStringOrTemplateOutputException.java | 2 +- .../freemarker/core/ParsingConfiguration.java | 175 +- .../core/ProcessingConfiguration.java | 9 +- .../org/apache/freemarker/core/Template.java | 34 +- .../freemarker/core/TemplateConfiguration.java | 77 +- .../freemarker/core/TopLevelConfiguration.java | 194 + .../UnknownConfigurationSettingException.java | 3 +- .../core/_ErrorDescriptionBuilder.java | 2 +- .../core/arithmetic/ArithmeticEngine.java | 2 +- .../core/debug/RmiDebuggedEnvironmentImpl.java | 4 +- .../freemarker/core/model/ObjectWrapper.java | 10 +- .../freemarker/core/model/TemplateModel.java | 2 +- .../core/model/impl/DefaultObjectWrapper.java | 31 +- .../core/outputformat/MarkupOutputFormat.java | 6 +- .../core/outputformat/OutputFormat.java | 4 +- .../impl/UndefinedOutputFormat.java | 5 +- .../core/templateresolver/CacheStorage.java | 4 +- .../core/templateresolver/TemplateLoader.java | 3 +- .../templateresolver/TemplateLoadingResult.java | 3 +- .../TemplateLookupStrategy.java | 2 +- .../templateresolver/TemplateNameFormat.java | 6 +- .../core/templateresolver/TemplateResolver.java | 12 +- .../impl/DefaultTemplateNameFormat.java | 7 +- .../impl/DefaultTemplateNameFormatFM2.java | 5 +- .../impl/DefaultTemplateResolver.java | 75 +- .../templateresolver/impl/MruCacheStorage.java | 4 +- .../templateresolver/impl/NullCacheStorage.java | 3 +- .../templateresolver/impl/SoftCacheStorage.java | 3 +- .../impl/StrongCacheStorage.java | 3 +- .../impl/URLTemplateLoader.java | 2 +- .../freemarker/core/util/CommonBuilder.java | 8 +- .../freemarker/core/util/_StringUtil.java | 12 +- .../core/valueformat/TemplateValueFormat.java | 11 +- .../apache/freemarker/dom/NodeListModel.java | 5 +- .../org/apache/freemarker/dom/NodeModel.java | 10 +- .../freemarker/servlet/FreemarkerServlet.java | 291 +- .../FreemarkerServletConfigurationBuilder.java | 79 + .../freemarker/servlet/InitParamParser.java | 5 +- .../servlet/WebAppTemplateLoader.java | 2 +- src/manual/en_US/FM3-CHANGE-LOG.txt | 13 +- .../org/apache/freemarker/core/ASTPrinter.java | 6 +- .../core/ActualNamingConvetionTest.java | 21 +- .../freemarker/core/ActualTagSyntaxTest.java | 36 +- .../freemarker/core/BreakPlacementTest.java | 8 +- .../apache/freemarker/core/CamelCaseTest.java | 110 +- .../freemarker/core/CanonicalFormTest.java | 11 +- .../freemarker/core/CoercionToTextualTest.java | 34 +- .../freemarker/core/ConfigurableTest.java | 4 +- .../freemarker/core/ConfigurationTest.java | 1008 +++-- .../freemarker/core/CustomAttributeTest.java | 6 +- .../apache/freemarker/core/DateFormatTest.java | 204 +- .../freemarker/core/DirectiveCallPlaceTest.java | 7 +- .../freemarker/core/EncodingOverrideTest.java | 9 +- .../EnvironmentGetTemplateVariantsTest.java | 9 +- .../apache/freemarker/core/ExceptionTest.java | 24 +- .../apache/freemarker/core/GetSourceTest.java | 14 +- .../freemarker/core/HeaderParsingTest.java | 10 +- .../IncludeAndImportConfigurableLayersTest.java | 187 +- .../freemarker/core/IncludeAndImportTest.java | 86 +- .../freemarker/core/IncudeFromNamelessTest.java | 15 +- .../core/InterpretAndEvalTemplateNameTest.java | 5 +- .../core/InterpretSettingInheritanceTest.java | 43 +- .../core/JavaCCExceptionAsEOFFixTest.java | 9 +- .../freemarker/core/MiscErrorMessagesTest.java | 5 +- .../core/MistakenlyPublicImportAPIsTest.java | 5 +- .../core/MistakenlyPublicMacroAPIsTest.java | 3 +- .../core/NewBiObjectWrapperRestrictionTest.java | 9 +- .../core/ObjectBuilderSettingsTest.java | 62 +- .../core/OptInTemplateClassResolverTest.java | 182 +- .../freemarker/core/OutputFormatTest.java | 280 +- .../core/ParsingErrorMessagesTest.java | 12 +- .../apache/freemarker/core/SQLTimeZoneTest.java | 111 +- .../freemarker/core/SpecialVariableTest.java | 38 +- .../core/StringLiteralInterpolationTest.java | 10 +- .../org/apache/freemarker/core/TabSizeTest.java | 15 +- .../core/TagSyntaxVariationsTest.java | 127 +- .../core/TemplateConfigurationTest.java | 87 +- ...gurationWithDefaultTemplateResolverTest.java | 153 +- .../core/TemplateConstructorsTest.java | 4 +- .../core/TemplateGetEncodingTest.java | 12 +- .../core/TemplateLookupStrategyTest.java | 145 +- .../core/TemplateNameSpecialVariablesTest.java | 115 +- .../core/TemplateNotFoundMessageTest.java | 84 +- .../core/TheadInterruptingSupportTest.java | 3 +- .../freemarker/core/UnclosedCommentTest.java | 1 - .../core/WhitespaceStrippingTest.java | 12 +- .../model/impl/DefaultObjectWrapperTest.java | 13 +- .../DefaultTemplateResolverTest.java | 112 +- .../FileTemplateLoaderTest.java | 7 +- .../TemplateConfigurationFactoryTest.java | 5 +- .../TemplateNameFormatTest.java | 13 +- .../core/valueformat/NumberFormatTest.java | 154 +- .../impl/ExtendedDecimalFormatTest.java | 15 +- .../manualtest/AutoEscapingExample.java | 11 +- .../ConfigureOutputFormatExamples.java | 129 +- .../manualtest/CustomFormatsExample.java | 57 +- .../freemarker/manualtest/ExamplesTest.java | 59 - .../manualtest/GettingStartedExample.java | 16 +- .../TemplateConfigurationExamples.java | 225 +- .../servlet/FreemarkerServletTest.java | 60 +- .../freemarker/servlet/InitParamParserTest.java | 9 +- .../servlet/jsp/RealServletContainertTest.java | 63 +- .../apache/freemarker/test/TemplateTest.java | 82 +- .../test/TestConfigurationBuilder.java | 92 + .../freemarker/test/servlet/WebAppTestCase.java | 1 + .../test/templatesuite/TemplateTestCase.java | 27 +- .../test/templatesuite/TemplateTestSuite.java | 2 +- .../test/util/EntirelyCustomObjectWrapper.java | 91 + .../test/util/FullyCustomObjectWrapper.java | 91 - 120 files changed, 5787 insertions(+), 5014 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/README.md ---------------------------------------------------------------------- diff --git a/README.md b/README.md index a571483..6393f28 100644 --- a/README.md +++ b/README.md @@ -187,7 +187,6 @@ apply it to your development environment: dom4j-*.jar, which casues compilation errors if it wins over jaxen-*.jar). - Press "Finish" -- Eclipse will indicate many errors at this point; it's expected, read on. - Project -> Properties -> Java Compiler -> Errors/Warnings: Check in "Enable project specific settings", then set "Forbidden reference (access rules)" from "Error" to "Warning". http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/main/java/org/apache/freemarker/core/ASTDirSetting.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirSetting.java b/src/main/java/org/apache/freemarker/core/ASTDirSetting.java index 396d269..68a0672 100644 --- a/src/main/java/org/apache/freemarker/core/ASTDirSetting.java +++ b/src/main/java/org/apache/freemarker/core/ASTDirSetting.java @@ -63,8 +63,8 @@ final class ASTDirSetting extends ASTDirective { String key = keyTk.image; if (Arrays.binarySearch(SETTING_NAMES, key) < 0) { StringBuilder sb = new StringBuilder(); - if (cfg.getSettingNames(true).contains(key) - || cfg.getSettingNames(false).contains(key)) { + if (Configuration.ExtendableBuilder.getSettingNames(true).contains(key) + || Configuration.ExtendableBuilder.getSettingNames(false).contains(key)) { sb.append("The setting name is recognized, but changing this setting from inside a template isn't " + "supported."); } else { @@ -75,16 +75,16 @@ final class ASTDirSetting extends ASTDirective { int shownNamingConvention; { int namingConvention = tokenManager.namingConvention; - shownNamingConvention = namingConvention != Configuration.AUTO_DETECT_NAMING_CONVENTION - ? namingConvention : Configuration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */; + shownNamingConvention = namingConvention != ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION + ? namingConvention : ParsingConfiguration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */; } boolean first = true; for (String correctName : SETTING_NAMES) { int correctNameNamingConvention = _StringUtil.getIdentifierNamingConvention(correctName); - if (shownNamingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION - ? correctNameNamingConvention != Configuration.LEGACY_NAMING_CONVENTION - : correctNameNamingConvention != Configuration.CAMEL_CASE_NAMING_CONVENTION) { + if (shownNamingConvention == ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION + ? correctNameNamingConvention != ParsingConfiguration.LEGACY_NAMING_CONVENTION + : correctNameNamingConvention != ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) { if (first) { first = false; } else { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java b/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java index 5774812..be559f6 100644 --- a/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java +++ b/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java @@ -331,16 +331,16 @@ abstract class ASTExpBuiltIn extends ASTExpression implements Cloneable { int shownNamingConvention; { int namingConvention = tokenManager.namingConvention; - shownNamingConvention = namingConvention != Configuration.AUTO_DETECT_NAMING_CONVENTION - ? namingConvention : Configuration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */; + shownNamingConvention = namingConvention != ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION + ? namingConvention : ParsingConfiguration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */; } boolean first = true; for (String correctName : names) { int correctNameNamingConvetion = _StringUtil.getIdentifierNamingConvention(correctName); - if (shownNamingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION - ? correctNameNamingConvetion != Configuration.LEGACY_NAMING_CONVENTION - : correctNameNamingConvetion != Configuration.CAMEL_CASE_NAMING_CONVENTION) { + if (shownNamingConvention == ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION + ? correctNameNamingConvetion != ParsingConfiguration.LEGACY_NAMING_CONVENTION + : correctNameNamingConvetion != ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) { if (first) { first = false; } else { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java b/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java index ca34a7d..ece2099 100644 --- a/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java +++ b/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java @@ -123,8 +123,8 @@ final class ASTExpBuiltInVariable extends ASTExpression { int shownNamingConvention; { int namingConvention = tokenManager.namingConvention; - shownNamingConvention = namingConvention != Configuration.AUTO_DETECT_NAMING_CONVENTION - ? namingConvention : Configuration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */; + shownNamingConvention = namingConvention != ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION + ? namingConvention : ParsingConfiguration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */; } { @@ -146,9 +146,9 @@ final class ASTExpBuiltInVariable extends ASTExpression { boolean first = true; for (final String correctName : SPEC_VAR_NAMES) { int correctNameNamingConvention = _StringUtil.getIdentifierNamingConvention(correctName); - if (shownNamingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION - ? correctNameNamingConvention != Configuration.LEGACY_NAMING_CONVENTION - : correctNameNamingConvention != Configuration.CAMEL_CASE_NAMING_CONVENTION) { + if (shownNamingConvention == ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION + ? correctNameNamingConvention != ParsingConfiguration.LEGACY_NAMING_CONVENTION + : correctNameNamingConvention != ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) { if (first) { first = false; } else { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java b/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java index 57a5a6e..792787a 100644 --- a/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java +++ b/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java @@ -19,7 +19,6 @@ package org.apache.freemarker.core; -import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -107,7 +106,7 @@ final class ASTExpHashLiteral extends ASTExpression { return new ASTExpHashLiteral(clonedKeys, clonedValues); } - private class SequenceHash implements TemplateHashModelEx2, Serializable { + private class SequenceHash implements TemplateHashModelEx2 { private HashMap<String, TemplateModel> map; private TemplateCollectionModel keyCollection, valueCollection; // ordered lists of keys and values @@ -147,7 +146,7 @@ final class ASTExpHashLiteral extends ASTExpression { @Override public TemplateModel get(String key) { - return (TemplateModel) map.get(key); + return map.get(key); } @Override
