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 2017/05/22 21:01:12 UTC

[1/2] incubator-freemarker git commit: Configuration-related int constants were replaced with enums:

Repository: incubator-freemarker
Updated Branches:
  refs/heads/3 be5568979 -> 99ac69739


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/ParsingConfiguration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ParsingConfiguration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ParsingConfiguration.java
index 0eb9569..6b40359 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ParsingConfiguration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ParsingConfiguration.java
@@ -21,7 +21,6 @@ package org.apache.freemarker.core;
 import java.nio.charset.Charset;
 
 import org.apache.freemarker.core.arithmetic.ArithmeticEngine;
-import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
 import org.apache.freemarker.core.outputformat.OutputFormat;
 import org.apache.freemarker.core.outputformat.impl.HTMLOutputFormat;
 import org.apache.freemarker.core.outputformat.impl.UndefinedOutputFormat;
@@ -37,27 +36,6 @@ import org.apache.freemarker.core.outputformat.impl.XMLOutputFormat;
  */
 public interface ParsingConfiguration {
 
-    int AUTO_DETECT_NAMING_CONVENTION = 10;
-    int LEGACY_NAMING_CONVENTION = 11;
-    int CAMEL_CASE_NAMING_CONVENTION = 12;
-
-    int AUTO_DETECT_TAG_SYNTAX = 0;
-    int ANGLE_BRACKET_TAG_SYNTAX = 1;
-    int SQUARE_BRACKET_TAG_SYNTAX = 2;
-
-    /**
-     * Don't enable auto-escaping, regardless of what the {@link OutputFormat} is. Note that a {@code
-     * <#ftl auto_esc=true>} in the template will override this.
-     */
-    int DISABLE_AUTO_ESCAPING_POLICY = 20;
-    /**
-     * Enable auto-escaping if the output format supports it and {@link MarkupOutputFormat#isAutoEscapedByDefault()} is
-     * {@code true}.
-     */
-    int ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY = 21;
-    /** Enable auto-escaping if the {@link OutputFormat} supports it. */
-    int ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY = 22;
-
     /**
      * The template language used; this is often overridden for certain file extension with the
      * {@link Configuration#getTemplateConfigurations() templateConfigurations} setting of the {@link Configuration}.
@@ -71,25 +49,25 @@ public interface ParsingConfiguration {
      * that has no {@code #ftl} in it. The {@code tagSyntax}
      * parameter must be one of:
      * <ul>
-     *   <li>{@link #AUTO_DETECT_TAG_SYNTAX}:
+     *   <li>{@link TagSyntax#AUTO_DETECT}:
      *     use the syntax of the first FreeMarker tag (can be anything, like <tt>#list</tt>,
      *     <tt>#include</tt>, user defined, etc.)
-     *   <li>{@link #ANGLE_BRACKET_TAG_SYNTAX}:
+     *   <li>{@link TagSyntax#ANGLE_BRACKET}:
      *     use the angle bracket syntax (the normal syntax)
-     *   <li>{@link #SQUARE_BRACKET_TAG_SYNTAX}:
+     *   <li>{@link TagSyntax#SQUARE_BRACKET}:
      *     use the square bracket syntax
      * </ul>
      *
-     * <p>In FreeMarker 2.3.x {@link #ANGLE_BRACKET_TAG_SYNTAX} is the
+     * <p>In FreeMarker 2.3.x {@link TagSyntax#ANGLE_BRACKET} is the
      * default for better backward compatibility. Starting from 2.4.x {@link
-     * ParsingConfiguration#AUTO_DETECT_TAG_SYNTAX} is the default, so it's recommended to use
+     * TagSyntax#AUTO_DETECT} is the default, so it's recommended to use
      * that even for 2.3.x.
      *
      * <p>This setting is ignored for the templates that have {@code ftl} directive in
      * it. For those templates the syntax used for the {@code ftl} directive determines
      * the syntax.
      */
-    int getTagSyntax();
+    TagSyntax getTagSyntax();
 
     /**
      * Tells if this setting is set directly in this object. If not, then depending on the implementing class, reading
@@ -113,14 +91,15 @@ public interface ParsingConfiguration {
      *
      * <p>
      * Which convention to use: FreeMarker prior to 2.3.23 has only supported
-     * {@link #LEGACY_NAMING_CONVENTION}, so that's how most templates and examples out there are written
+     * {@link NamingConvention#LEGACY}, so that's how most templates and examples out there are
+     * written
      * as of 2015. But as templates today are mostly written by programmers and often access Java API-s which already
-     * use camel case, {@link #CAMEL_CASE_NAMING_CONVENTION} is the recommended option for most projects.
+     * use camel case, {@link NamingConvention#CAMEL_CASE} is the recommended option for most projects.
      * However, it's no necessary to make a application-wide decision; see auto-detection below.
      *
      * <p>
      * FreeMarker will decide the naming convention automatically for each template individually when this setting is
-     * set to {@link #AUTO_DETECT_NAMING_CONVENTION} (which is the default). The naming convention of a template is
+     * set to {@link NamingConvention#AUTO_DETECT} (which is the default). The naming convention of a template is
      * decided when the first core (non-user-defined) identifier is met during parsing (not during processing) where the
      * naming convention is relevant (like for {@code s?upperCase} or {@code s?upper_case} it's relevant, but for
      * {@code s?length} it isn't). At that point, the naming convention of the template is decided, and any later core
@@ -130,15 +109,15 @@ public interface ParsingConfiguration {
      *
      * <p>
      * FreeMarker always enforces the same naming convention to be used consistently within the same template "file".
-     * Additionally, when this setting is set to non-{@link #AUTO_DETECT_NAMING_CONVENTION}, the selected naming
+     * Additionally, when this setting is set to non-{@link NamingConvention#AUTO_DETECT}, the selected naming
      * convention is enforced on all templates. Thus such a setup can be used to enforce an application-wide naming
      * convention.
      *
      * @return
-     *            One of the {@link #AUTO_DETECT_NAMING_CONVENTION} or
-     *            {@link #LEGACY_NAMING_CONVENTION} or {@link #CAMEL_CASE_NAMING_CONVENTION}.
+     *            One of the {@link NamingConvention#AUTO_DETECT} or
+     *            {@link NamingConvention#LEGACY} or {@link NamingConvention#CAMEL_CASE}.
      */
-    int getNamingConvention();
+    NamingConvention getNamingConvention();
 
     /**
      * Tells if this setting is set directly in this object. If not, then depending on the implementing class, reading
@@ -175,7 +154,7 @@ public interface ParsingConfiguration {
     /**
      * See {@link Configuration#getAutoEscapingPolicy()}.
      */
-    int getAutoEscapingPolicy();
+    AutoEscapingPolicy getAutoEscapingPolicy();
 
     /**
      * Tells if this setting is set directly in this object. If not, then depending on the implementing class, reading
@@ -225,12 +204,12 @@ public interface ParsingConfiguration {
      *       (i.e., {@link HTMLOutputFormat#INSTANCE}, unless the {@code "HTML"} name is overridden by
      *       the {@link Configuration#getRegisteredCustomOutputFormats registeredOutputFormats} setting) and
      *       the {@link #getAutoEscapingPolicy() autoEscapingPolicy} setting to
-     *       {@link #ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY}.
+     *       {@link AutoEscapingPolicy#ENABLE_IF_DEFAULT}.
      *   <li>{@code ftlx}: Sets the {@link #getOutputFormat() outputFormat} setting to
      *       {@code "XML"} (i.e., {@link XMLOutputFormat#INSTANCE}, unless the {@code "XML"} name is overridden by
      *       the {@link Configuration#getRegisteredCustomOutputFormats registeredOutputFormats} setting) and
      *       the {@link #getAutoEscapingPolicy() autoEscapingPolicy} setting to
-     *       {@link #ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY}.
+     *       {@link AutoEscapingPolicy#ENABLE_IF_DEFAULT}.
      * </ul>
      *
      * <p>These file extensions are not case sensitive. The file extension is the part after the last dot in the source

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/TagSyntax.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/TagSyntax.java b/freemarker-core/src/main/java/org/apache/freemarker/core/TagSyntax.java
new file mode 100644
index 0000000..423ab9c
--- /dev/null
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/TagSyntax.java
@@ -0,0 +1,29 @@
+/*
+ * 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 org.apache.freemarker.core;
+
+/**
+ * Used as the value of the {@link ParsingConfiguration#getTagSyntax()}  tagSyntax} setting.
+ */
+public enum TagSyntax {
+    AUTO_DETECT,
+    ANGLE_BRACKET,
+    SQUARE_BRACKET
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java b/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java
index c4787e4..7562b85 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java
@@ -115,12 +115,12 @@ public class Template implements ProcessingConfiguration, CustomStateScope {
     private Map<String, Serializable> customAttributes;
     private transient Map<Object, Object> mergedCustomAttributes;
 
-    private Integer autoEscapingPolicy;
+    private AutoEscapingPolicy autoEscapingPolicy;
     // Values from template content that are detected automatically:
     private Charset actualSourceEncoding;
-    private int actualTagSyntax;
+    private TagSyntax actualTagSyntax;
 
-    private int actualNamingConvention;
+    private NamingConvention actualNamingConvention;
     // Custom state:
     private final Object customStateMapLock = new Object();
     private final ConcurrentHashMap<CustomStateKey, Object> customStateMap = new ConcurrentHashMap<>(0);
@@ -283,7 +283,7 @@ public class Template implements ProcessingConfiguration, CustomStateScope {
    Template(
             String lookupName, String sourceName, Reader reader,
             Configuration configuration, TemplateConfiguration templateConfiguration,
-            OutputFormat contextOutputFormat, Integer contextAutoEscapingPolicy,
+            OutputFormat contextOutputFormat, AutoEscapingPolicy contextAutoEscapingPolicy,
             Charset actualSourceEncoding, InputStream streamToUnmarkWhenEncEstabd) throws IOException, ParseException {
         _NullArgumentException.check("configuration", configuration);
         this.cfg = configuration;
@@ -659,27 +659,27 @@ public class Template implements ProcessingConfiguration, CustomStateScope {
 
     /**
      * Returns the tag syntax the parser has chosen for this template. If the syntax could be determined, it's
-     * {@link ParsingConfiguration#SQUARE_BRACKET_TAG_SYNTAX} or {@link ParsingConfiguration#ANGLE_BRACKET_TAG_SYNTAX}. If the syntax
+     * {@link TagSyntax#SQUARE_BRACKET} or {@link TagSyntax#ANGLE_BRACKET}. If the syntax
      * couldn't be determined (like because there was no tags in the template, or it was a plain text template), this
      * returns whatever the default is in the current configuration, so it's maybe
-     * {@link ParsingConfiguration#AUTO_DETECT_TAG_SYNTAX}.
+     * {@link TagSyntax#AUTO_DETECT}.
      * 
      * @since 2.3.20
      */
-    public int getActualTagSyntax() {
+    public TagSyntax getActualTagSyntax() {
         return actualTagSyntax;
     }
     
     /**
      * Returns the naming convention the parser has chosen for this template. If it could be determined, it's
-     * {@link ParsingConfiguration#LEGACY_NAMING_CONVENTION} or {@link ParsingConfiguration#CAMEL_CASE_NAMING_CONVENTION}. If it
+     * {@link NamingConvention#LEGACY} or {@link NamingConvention#CAMEL_CASE}. If it
      * couldn't be determined (like because there no identifier that's part of the template language was used where
      * the naming convention matters), this returns whatever the default is in the current configuration, so it's maybe
-     * {@link ParsingConfiguration#AUTO_DETECT_TAG_SYNTAX}.
+     * {@link TagSyntax#AUTO_DETECT}.
      * 
      * @since 2.3.23
      */
-    public int getActualNamingConvention() {
+    public NamingConvention getActualNamingConvention() {
         return actualNamingConvention;
     }
     
@@ -709,7 +709,7 @@ public class Template implements ProcessingConfiguration, CustomStateScope {
      * {@link Configuration#getAutoEscapingPolicy()}, {@link ParsingConfiguration#getAutoEscapingPolicy()},
      * {@code #ftl} header's {@code auto_esc} option in the template.
      */
-    public int getAutoEscapingPolicy() {
+    public AutoEscapingPolicy getAutoEscapingPolicy() {
         return autoEscapingPolicy != null ? autoEscapingPolicy
                 : tCfg != null && tCfg.isAutoEscapingPolicySet() ? tCfg.getAutoEscapingPolicy()
                 : cfg.getAutoEscapingPolicy();
@@ -718,7 +718,7 @@ public class Template implements ProcessingConfiguration, CustomStateScope {
     /**
      * Should be called by the parser, for example to apply the auto escaping policy specified in the #ftl header.
      */
-    void setAutoEscapingPolicy(int autoEscapingPolicy) {
+    void setAutoEscapingPolicy(AutoEscapingPolicy autoEscapingPolicy) {
         this.autoEscapingPolicy = autoEscapingPolicy;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java
index a8fc5ae..77a40bb 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java
@@ -84,10 +84,10 @@ public final class TemplateConfiguration implements ParsingAndProcessingConfigur
     private final Map<Object, Object> customAttributes;
     
     private final TemplateLanguage templateLanguage;
-    private final Integer tagSyntax;
-    private final Integer namingConvention;
+    private final TagSyntax tagSyntax;
+    private final NamingConvention namingConvention;
     private final Boolean whitespaceStripping;
-    private final Integer autoEscapingPolicy;
+    private final AutoEscapingPolicy autoEscapingPolicy;
     private final Boolean recognizeStandardFileExtensions;
     private final OutputFormat outputFormat;
     private final Charset sourceEncoding;
@@ -185,7 +185,7 @@ public final class TemplateConfiguration implements ParsingAndProcessingConfigur
     }
 
     @Override
-    public int getTagSyntax() {
+    public TagSyntax getTagSyntax() {
         if (!isTagSyntaxSet()) {
             throw new SettingValueNotSetException("tagSyntax");
         }
@@ -211,7 +211,7 @@ public final class TemplateConfiguration implements ParsingAndProcessingConfigur
     }
 
     @Override
-    public int getNamingConvention() {
+    public NamingConvention getNamingConvention() {
         if (!isNamingConventionSet()) {
             throw new SettingValueNotSetException("namingConvention");
         }
@@ -237,7 +237,7 @@ public final class TemplateConfiguration implements ParsingAndProcessingConfigur
     }
 
     @Override
-    public int getAutoEscapingPolicy() {
+    public AutoEscapingPolicy getAutoEscapingPolicy() {
         if (!isAutoEscapingPolicySet()) {
             throw new SettingValueNotSetException("autoEscapingPolicy");
         }
@@ -942,7 +942,7 @@ public final class TemplateConfiguration implements ParsingAndProcessingConfigur
         }
 
         @Override
-        protected int getDefaultTagSyntax() {
+        protected TagSyntax getDefaultTagSyntax() {
             throw new SettingValueNotSetException("tagSyntax");
         }
 
@@ -952,7 +952,7 @@ public final class TemplateConfiguration implements ParsingAndProcessingConfigur
         }
 
         @Override
-        protected int getDefaultNamingConvention() {
+        protected NamingConvention getDefaultNamingConvention() {
             throw new SettingValueNotSetException("namingConvention");
         }
 
@@ -962,7 +962,7 @@ public final class TemplateConfiguration implements ParsingAndProcessingConfigur
         }
 
         @Override
-        protected int getDefaultAutoEscapingPolicy() {
+        protected AutoEscapingPolicy getDefaultAutoEscapingPolicy() {
             throw new SettingValueNotSetException("autoEscapingPolicy");
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateParsingConfigurationWithFallback.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateParsingConfigurationWithFallback.java b/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateParsingConfigurationWithFallback.java
index 93a5840..30414a7 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateParsingConfigurationWithFallback.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateParsingConfigurationWithFallback.java
@@ -48,7 +48,7 @@ final class TemplateParsingConfigurationWithFallback implements ParsingConfigura
     }
 
     @Override
-    public int getTagSyntax() {
+    public TagSyntax getTagSyntax() {
         return tCfg.isTagSyntaxSet() ? tCfg.getTagSyntax() : cfg.getTagSyntax();
     }
 
@@ -58,7 +58,7 @@ final class TemplateParsingConfigurationWithFallback implements ParsingConfigura
     }
 
     @Override
-    public int getNamingConvention() {
+    public NamingConvention getNamingConvention() {
         return tCfg.isNamingConventionSet() ? tCfg.getNamingConvention() : cfg.getNamingConvention();
     }
 
@@ -88,7 +88,7 @@ final class TemplateParsingConfigurationWithFallback implements ParsingConfigura
     }
 
     @Override
-    public int getAutoEscapingPolicy() {
+    public AutoEscapingPolicy getAutoEscapingPolicy() {
         return tCfg.isAutoEscapingPolicySet() ? tCfg.getAutoEscapingPolicy() : cfg.getAutoEscapingPolicy();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/_ErrorDescriptionBuilder.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_ErrorDescriptionBuilder.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_ErrorDescriptionBuilder.java
index 2d09062..5dfa623 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/_ErrorDescriptionBuilder.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/_ErrorDescriptionBuilder.java
@@ -225,7 +225,7 @@ public class _ErrorDescriptionBuilder {
                                     || (partStr.charAt(1) == '/') && (partStr.charAt(2) == '#' || partStr.charAt(2) == '@')
                     )
                             && partStr.charAt(partStr.length() - 1) == '>') {
-                        if (template.getActualTagSyntax() == ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX) {
+                        if (template.getActualTagSyntax() == TagSyntax.SQUARE_BRACKET) {
                             sb.append('[');
                             sb.append(partStr.substring(1, partStr.length() - 1));
                             sb.append(']');

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
index cc96d81..6a51764 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
@@ -697,7 +697,10 @@ public class _ObjectBuilderSettingEvaluator {
             }
 
             // For accessing static fields:
-            addWithSimpleName(SHORTHANDS, Configuration.class);
+            addWithSimpleName(SHORTHANDS, Configuration.class); // [FM3] Won't be needed
+            addWithSimpleName(SHORTHANDS, TagSyntax.class);
+            addWithSimpleName(SHORTHANDS, NamingConvention.class);
+
         }
         String fullClassName = SHORTHANDS.get(className);
         return fullClassName == null ? className : fullClassName;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtil.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtil.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtil.java
index b53aae8..4035a1f 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtil.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtil.java
@@ -30,7 +30,7 @@ import java.util.StringTokenizer;
 import java.util.regex.Pattern;
 
 import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.ParsingConfiguration;
+import org.apache.freemarker.core.NamingConvention;
 import org.apache.freemarker.core.Template;
 import org.apache.freemarker.core.Version;
 
@@ -1604,21 +1604,21 @@ public class _StringUtil {
     }
 
     /**
-     * @return {@link ParsingConfiguration#CAMEL_CASE_NAMING_CONVENTION}, or {@link ParsingConfiguration#LEGACY_NAMING_CONVENTION}
-     *         or, {@link ParsingConfiguration#AUTO_DETECT_NAMING_CONVENTION} when undecidable.
+     * @return {@link NamingConvention#CAMEL_CASE}, or {@link NamingConvention#LEGACY}
+     *         or, {@link NamingConvention#AUTO_DETECT} when undecidable.
      */
-    public static int getIdentifierNamingConvention(String name) {
+    public static NamingConvention getIdentifierNamingConvention(String name) {
         final int ln = name.length();
         for (int i = 0; i < ln; i++) {
             final char c = name.charAt(i);
             if (c == '_') {
-                return ParsingConfiguration.LEGACY_NAMING_CONVENTION;
+                return NamingConvention.LEGACY;
             }
             if (_StringUtil.isUpperUSASCII(c)) {
-                return ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION;
+                return NamingConvention.CAMEL_CASE;
             }
         }
-        return ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION;
+        return NamingConvention.AUTO_DETECT;
     }
 
     // [2.4] Won't be needed anymore

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/javacc/FTL.jj
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/javacc/FTL.jj b/freemarker-core/src/main/javacc/FTL.jj
index dc6079f..0df4035 100644
--- a/freemarker-core/src/main/javacc/FTL.jj
+++ b/freemarker-core/src/main/javacc/FTL.jj
@@ -78,7 +78,7 @@ public class FMParser {
     private boolean stripWhitespace, stripText;
     private int incompatibleImprovements;
     private OutputFormat outputFormat;
-    private int autoEscapingPolicy;
+    private AutoEscapingPolicy autoEscapingPolicy;
     private boolean autoEscaping;
     private ParsingConfiguration pCfg;
     private InputStream streamToUnmarkWhenEncEstabd;
@@ -96,7 +96,7 @@ public class FMParser {
     private int mixedContentNesting; // for stripText
 
     FMParser(Template template, Reader reader,
-            ParsingConfiguration pCfg, OutputFormat outputFormat, Integer autoEscapingPolicy,
+            ParsingConfiguration pCfg, OutputFormat outputFormat, AutoEscapingPolicy autoEscapingPolicy,
             InputStream streamToUnmarkWhenEncEstabd) {
         this(template, true, readerToTokenManager(reader, pCfg),
                 pCfg, outputFormat, autoEscapingPolicy,
@@ -110,7 +110,7 @@ public class FMParser {
     }
 
     FMParser(Template template, boolean newTemplate, FMParserTokenManager tkMan,
-            ParsingConfiguration pCfg, OutputFormat contextOutputFormat, Integer contextAutoEscapingPolicy,
+            ParsingConfiguration pCfg, OutputFormat contextOutputFormat, AutoEscapingPolicy contextAutoEscapingPolicy,
     		InputStream streamToUnmarkWhenEncEstabd) {
         this(tkMan);
 
@@ -133,39 +133,30 @@ public class FMParser {
                     : outputFormatFromExt != null ? outputFormatFromExt
                     : pCfg.getOutputFormat();
             autoEscapingPolicy = contextAutoEscapingPolicy != null ? contextAutoEscapingPolicy
-                    : outputFormatFromExt != null ? Configuration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY
+                    : outputFormatFromExt != null ? AutoEscapingPolicy.ENABLE_IF_DEFAULT
                     : pCfg.getAutoEscapingPolicy();
         }
         recalculateAutoEscapingField();
 
         token_source.setParser(this);
 
-        int tagSyntax = pCfg.getTagSyntax();
+        TagSyntax tagSyntax = pCfg.getTagSyntax();
         switch (tagSyntax) {
-        case Configuration.AUTO_DETECT_TAG_SYNTAX:
+        case AUTO_DETECT:
             token_source.autodetectTagSyntax = true;
             break;
-        case Configuration.ANGLE_BRACKET_TAG_SYNTAX:
+        case ANGLE_BRACKET:
             token_source.squBracTagSyntax = false;
             break;
-        case Configuration.SQUARE_BRACKET_TAG_SYNTAX:
+        case SQUARE_BRACKET:
             token_source.squBracTagSyntax = true;
             break;
         default:
-            throw new IllegalArgumentException("Illegal argument for tagSyntax: " + tagSyntax);
+            throw new BugException("Unsupported tagSyntax: " + tagSyntax);
         }
 
-        int namingConvention = pCfg.getNamingConvention();
-        switch (namingConvention) {
-        case Configuration.AUTO_DETECT_NAMING_CONVENTION:
-        case Configuration.CAMEL_CASE_NAMING_CONVENTION:
-        case Configuration.LEGACY_NAMING_CONVENTION:
-            token_source.initialNamingConvention = namingConvention;
-            token_source.namingConvention = namingConvention;
-            break;
-        default:
-            throw new IllegalArgumentException("Illegal argument for namingConvention: " + namingConvention);
-        }
+        token_source.initialNamingConvention = pCfg.getNamingConvention();
+        token_source.namingConvention = token_source.initialNamingConvention;
 
         this.stripWhitespace = pCfg.getWhitespaceStripping();
 
@@ -233,14 +224,14 @@ public class FMParser {
      */
     private void recalculateAutoEscapingField() {
         if (outputFormat instanceof MarkupOutputFormat) {
-            if (autoEscapingPolicy == Configuration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY) {
+            if (autoEscapingPolicy == AutoEscapingPolicy.ENABLE_IF_DEFAULT) {
                 autoEscaping = ((MarkupOutputFormat) outputFormat).isAutoEscapedByDefault();
-            } else if (autoEscapingPolicy == Configuration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY) {
+            } else if (autoEscapingPolicy == AutoEscapingPolicy.ENABLE_IF_SUPPORTED) {
                 autoEscaping = true;
-            } else if (autoEscapingPolicy == Configuration.DISABLE_AUTO_ESCAPING_POLICY) {
+            } else if (autoEscapingPolicy == AutoEscapingPolicy.DISABLE) {
                 autoEscaping = false;
             } else {
-                throw new IllegalStateException("Unhandled autoEscaping enum: " + autoEscapingPolicy);
+                throw new BugException("Unhandled autoEscaping enum: " + autoEscapingPolicy);
             }
         } else {
             autoEscaping = false;
@@ -254,10 +245,8 @@ public class FMParser {
     /**
      * Don't use it, unless you are developing FreeMarker itself.
      */
-    public int _getLastTagSyntax() {
-        return token_source.squBracTagSyntax
-                ? Configuration.SQUARE_BRACKET_TAG_SYNTAX
-                : Configuration.ANGLE_BRACKET_TAG_SYNTAX;
+    public TagSyntax _getLastTagSyntax() {
+        return token_source.squBracTagSyntax ? TagSyntax.SQUARE_BRACKET : TagSyntax.ANGLE_BRACKET;
     }
     
     /**
@@ -265,7 +254,7 @@ public class FMParser {
      * The naming convention used by this template; if it couldn't be detected so far, it will be the most probable one.
      * This could be used for formatting error messages, but not for anything serious.
      */
-    public int _getLastNamingConvention() {
+    public NamingConvention _getLastNamingConvention() {
         return token_source.namingConvention;
     }
 
@@ -501,8 +490,8 @@ TOKEN_MGR_DECLS:
             autodetectTagSyntax,
             directiveSyntaxEstablished,
             inInvocation;
-    int initialNamingConvention;
-    int namingConvention;
+    NamingConvention initialNamingConvention;
+    NamingConvention namingConvention;
     Token namingConventionEstabilisher;
     int incompatibleImprovements;
 
@@ -514,7 +503,7 @@ TOKEN_MGR_DECLS:
      * This method handles tag syntax ('<' VS '['), and also participates in naming convention detection.
      * If you update this logic, take a look at the UNKNOWN_DIRECTIVE token too. 
      */
-    private void handleTagSyntaxAndSwitch(Token tok, int tokenNamingConvention, int newLexState) {
+    private void handleTagSyntaxAndSwitch(Token tok, NamingConvention tokenNamingConvention, int newLexState) {
         final String image = tok.image;
         
         char firstChar = image.charAt(0);
@@ -537,16 +526,16 @@ TOKEN_MGR_DECLS:
      * Used for tags whose name isn't affected by naming convention.
      */
     private void handleTagSyntaxAndSwitch(Token tok, int newLexState) {
-        handleTagSyntaxAndSwitch(tok, Configuration.AUTO_DETECT_NAMING_CONVENTION, newLexState);
+        handleTagSyntaxAndSwitch(tok, NamingConvention.AUTO_DETECT, newLexState);
     }
 
     void checkNamingConvention(Token tok) {
         checkNamingConvention(tok, _StringUtil.getIdentifierNamingConvention(tok.image)); 
     }
     
-    void checkNamingConvention(Token tok, int tokenNamingConvention) {
-        if (tokenNamingConvention != Configuration.AUTO_DETECT_NAMING_CONVENTION) {
-	        if (namingConvention == Configuration.AUTO_DETECT_NAMING_CONVENTION) {
+    void checkNamingConvention(Token tok, NamingConvention tokenNamingConvention) {
+        if (tokenNamingConvention != NamingConvention.AUTO_DETECT) {
+	        if (namingConvention == NamingConvention.AUTO_DETECT) {
 	            namingConvention = tokenNamingConvention;
 	            namingConventionEstabilisher = tok;
 	        } else if (namingConvention != tokenNamingConvention) {
@@ -559,12 +548,12 @@ TOKEN_MGR_DECLS:
         return new TokenMgrError(
                 "Naming convention mismatch. "
                 + "Identifiers that are part of the template language (not the user specified ones) "
-                + (initialNamingConvention == Configuration.AUTO_DETECT_NAMING_CONVENTION
+                + (initialNamingConvention == NamingConvention.AUTO_DETECT
                     ? "must consistently use the same naming convention within the same template. This template uses "
                     : "must use the configured naming convention, which is the ")
-                + (namingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION
+                + (namingConvention == NamingConvention.CAMEL_CASE
                             ? "camel case naming convention (like: exampleName) "
-                            : (namingConvention == Configuration.LEGACY_NAMING_CONVENTION
+                            : (namingConvention == NamingConvention.LEGACY
                                     ? "legacy naming convention (directive (tag) names are like examplename, " 
                                       + "everything else is like example_name) "
                                     : "??? (internal error)"
@@ -587,9 +576,9 @@ TOKEN_MGR_DECLS:
      * @param charIdxInName
      *         The index of the deciding character relatively to the first letter of the name.
      */
-    private static int getTagNamingConvention(Token tok, int charIdxInName) {
+    private static NamingConvention getTagNamingConvention(Token tok, int charIdxInName) {
         return _StringUtil.isUpperUSASCII(getTagNameCharAt(tok, charIdxInName))
-                ? Configuration.CAMEL_CASE_NAMING_CONVENTION : Configuration.LEGACY_NAMING_CONVENTION;
+                ? NamingConvention.CAMEL_CASE : NamingConvention.LEGACY;
     }
 
     static char getTagNameCharAt(Token tok, int charIdxInName) {
@@ -803,9 +792,9 @@ TOKEN:
     <TERSE_COMMENT : ("<" | "[") "#--" > { noparseTag = "-->"; handleTagSyntaxAndSwitch(matchedToken, NO_PARSE); }
     |
     <NOPARSE: <START_TAG> "no" ("p" | "P") "arse" <CLOSE_TAG1>> {
-        int tagNamingConvention = getTagNamingConvention(matchedToken, 2);
+        NamingConvention tagNamingConvention = getTagNamingConvention(matchedToken, 2);
         handleTagSyntaxAndSwitch(matchedToken, tagNamingConvention, NO_PARSE);
-        noparseTag = tagNamingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION ? "noParse" : "noparse";
+        noparseTag = tagNamingConvention == NamingConvention.CAMEL_CASE ? "noParse" : "noparse";
     }
     |
     <END_IF : <END_TAG> "if" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
@@ -3503,14 +3492,14 @@ ASTDirAutoEsc AutoEsc() :
 {
     Token start, end;
     TemplateElements children;
-    int lastAutoEscapingPolicy;
+    AutoEscapingPolicy lastAutoEscapingPolicy;
 }
 {
     start = <AUTOESC>
     {
         checkCurrentOutputFormatCanEscape(start);
         lastAutoEscapingPolicy = autoEscapingPolicy;
-        autoEscapingPolicy = Configuration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY;
+        autoEscapingPolicy = AutoEscapingPolicy.ENABLE_IF_SUPPORTED;
         recalculateAutoEscapingField();
     }
     children = MixedContentElements()
@@ -3529,13 +3518,13 @@ ASTDirNoAutoEsc NoAutoEsc() :
 {
     Token start, end;
     TemplateElements children;
-    int lastAutoEscapingPolicy;
+    AutoEscapingPolicy lastAutoEscapingPolicy;
 }
 {
     start = <NOAUTOESC>
     {
         lastAutoEscapingPolicy = autoEscapingPolicy;
-        autoEscapingPolicy = Configuration.DISABLE_AUTO_ESCAPING_POLICY;
+        autoEscapingPolicy = AutoEscapingPolicy.DISABLE;
         recalculateAutoEscapingField();
     }
     children = MixedContentElements()
@@ -3923,9 +3912,9 @@ void HeaderElement() :
                         } else if (ks.equalsIgnoreCase("auto_esc") || ks.equals("autoEsc")) {
                             if (getBoolean(exp, false)) {
                                 autoEscRequester = key;
-                                autoEscapingPolicy = Configuration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY;
+                                autoEscapingPolicy = AutoEscapingPolicy.ENABLE_IF_SUPPORTED;
                             } else {
-                                autoEscapingPolicy = Configuration.DISABLE_AUTO_ESCAPING_POLICY;
+                                autoEscapingPolicy = AutoEscapingPolicy.DISABLE;
                             }
                             recalculateAutoEscapingField();
 
@@ -3993,7 +3982,7 @@ void HeaderElement() :
 	                        } else if (ks.equals("xmlns")) {
 	                            // [2.4] If camel case will be the default, update this
                                 correctName
-                                        = token_source.namingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION
+                                        = token_source.namingConvention == NamingConvention.CAMEL_CASE
                                                 ? "nsPrefixes" : "ns_prefixes";
                             } else if (ks.equals("auto_escape") || ks.equals("auto_escaping") || ks.equals("autoesc")) {
                                 correctName = "auto_esc";


[2/2] incubator-freemarker git commit: Configuration-related int constants were replaced with enums:

Posted by dd...@apache.org.
Configuration-related int constants were replaced with enums:

- FM2 Configuration.${c}_NAMING_CONVENTION with NamingConvention.${c}
- FM2 Configuration.${c}_TAG_SYNTAX with TagSyntax.${c}
- FM2 Configuration.${c}_AUTO_ESCAPING_POLICY with AutoEscapingPolicy.${c}


Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/99ac6973
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/99ac6973
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/99ac6973

Branch: refs/heads/3
Commit: 99ac69739f6439ce8dd6143f7eb0046e885998e5
Parents: be55689
Author: ddekany <dd...@apache.org>
Authored: Mon May 22 18:08:54 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Mon May 22 23:01:02 2017 +0200

----------------------------------------------------------------------
 FM3-CHANGE-LOG.txt                              |   5 +
 .../core/ActualNamingConvetionTest.java         |  17 ++--
 .../freemarker/core/ActualTagSyntaxTest.java    |  34 +++----
 .../apache/freemarker/core/CamelCaseTest.java   |  28 ++---
 .../freemarker/core/CoercionToTextualTest.java  |   2 +-
 .../freemarker/core/ConfigurableTest.java       |   4 +-
 .../freemarker/core/ConfigurationTest.java      |  51 ++++------
 .../core/InterpretSettingInheritanceTest.java   |  10 +-
 .../core/ObjectBuilderSettingsTest.java         |   2 +-
 .../freemarker/core/OutputFormatTest.java       |  32 +++---
 .../core/ParsingErrorMessagesTest.java          |   2 +-
 .../freemarker/core/SpecialVariableTest.java    |   8 +-
 .../core/TagSyntaxVariationsTest.java           |   8 +-
 .../core/TemplateConfigurationTest.java         |  16 +--
 .../apache/freemarker/core/ASTDirSetting.java   |  16 +--
 .../apache/freemarker/core/ASTExpBuiltIn.java   |  18 ++--
 .../freemarker/core/ASTExpBuiltInVariable.java  |  18 ++--
 .../freemarker/core/AutoEscapingPolicy.java     |  44 ++++++++
 .../apache/freemarker/core/Configuration.java   | 102 +++++++++----------
 ...utableParsingAndProcessingConfiguration.java |  77 ++++++--------
 .../core/MutableProcessingConfiguration.java    |  11 +-
 .../freemarker/core/NamingConvention.java       |  29 ++++++
 .../core/OutputFormatBoundBuiltIn.java          |   4 +-
 .../freemarker/core/ParsingConfiguration.java   |  55 ++++------
 .../org/apache/freemarker/core/TagSyntax.java   |  29 ++++++
 .../org/apache/freemarker/core/Template.java    |  24 ++---
 .../freemarker/core/TemplateConfiguration.java  |  18 ++--
 ...emplateParsingConfigurationWithFallback.java |   6 +-
 .../core/_ErrorDescriptionBuilder.java          |   2 +-
 .../core/_ObjectBuilderSettingEvaluator.java    |   5 +-
 .../freemarker/core/util/_StringUtil.java       |  14 +--
 freemarker-core/src/main/javacc/FTL.jj          |  89 +++++++---------
 32 files changed, 412 insertions(+), 368 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/FM3-CHANGE-LOG.txt
----------------------------------------------------------------------
diff --git a/FM3-CHANGE-LOG.txt b/FM3-CHANGE-LOG.txt
index 9600281..f0823ab 100644
--- a/FM3-CHANGE-LOG.txt
+++ b/FM3-CHANGE-LOG.txt
@@ -245,3 +245,8 @@ the FreeMarer 3 changelog here:
             new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
                     .extensions(DOMDefaultObjectWrapperExtension.INSTANCE)
                     .build())
+
+- Configuration-related int constants were replaced with enums:
+  - FM2 Configuration.${c}_NAMING_CONVENTION with NamingConvention.${c}
+  - FM2 Configuration.${c}_TAG_SYNTAX with TagSyntax.${c}
+  - FM2 Configuration.${c}_AUTO_ESCAPING_POLICY with AutoEscapingPolicy.${c}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualNamingConvetionTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualNamingConvetionTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualNamingConvetionTest.java
index 57e40fa..69a95c9 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualNamingConvetionTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualNamingConvetionTest.java
@@ -32,32 +32,33 @@ public class ActualNamingConvetionTest {
     public void testUndetectable() throws IOException {
         final String ftl = "<#if true>${x?size}</#if>";
         assertEquals(getActualNamingConvention(ftl,
-                ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION), ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION);
+                NamingConvention.AUTO_DETECT), NamingConvention.AUTO_DETECT);
         assertEquals(getActualNamingConvention(ftl,
-                ParsingConfiguration.LEGACY_NAMING_CONVENTION), ParsingConfiguration.LEGACY_NAMING_CONVENTION);
+                NamingConvention.LEGACY), NamingConvention.LEGACY);
         assertEquals(getActualNamingConvention(ftl,
-                ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION), ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
+                NamingConvention.CAMEL_CASE), NamingConvention.CAMEL_CASE);
     }
 
     @Test
     public void testLegacyDetected() throws IOException {
         final String ftl = "${x?upper_case}";
         assertEquals(getActualNamingConvention(ftl,
-                ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION), ParsingConfiguration.LEGACY_NAMING_CONVENTION);
+                NamingConvention.AUTO_DETECT), NamingConvention.LEGACY);
         assertEquals(getActualNamingConvention(ftl,
-                ParsingConfiguration.LEGACY_NAMING_CONVENTION), ParsingConfiguration.LEGACY_NAMING_CONVENTION);
+                NamingConvention.LEGACY), NamingConvention.LEGACY);
     }
 
     @Test
     public void testCamelCaseDetected() throws IOException {
         final String ftl = "${x?upperCase}";
         assertEquals(getActualNamingConvention(ftl,
-                ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION), ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
+                NamingConvention.AUTO_DETECT), NamingConvention.CAMEL_CASE);
         assertEquals(getActualNamingConvention(ftl,
-                ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION), ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
+                NamingConvention.CAMEL_CASE), NamingConvention.CAMEL_CASE);
     }
 
-    private int getActualNamingConvention(String ftl, int namingConvention) throws IOException {
+    private NamingConvention getActualNamingConvention(String ftl, NamingConvention namingConvention)
+            throws IOException {
         return new Template(null, ftl,
                 new TestConfigurationBuilder().namingConvention(namingConvention).build())
                 .getActualNamingConvention();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualTagSyntaxTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualTagSyntaxTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualTagSyntaxTest.java
index 88f0646..02d7f3d 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualTagSyntaxTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ActualTagSyntaxTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.freemarker.core;
 
-import static org.apache.freemarker.core.ParsingConfiguration.*;
+import static org.apache.freemarker.core.TagSyntax.*;
 import static org.junit.Assert.*;
 
 import java.io.IOException;
@@ -31,35 +31,35 @@ public class ActualTagSyntaxTest {
 
     @Test
     public void testWithFtlHeader() throws IOException {
-        testWithFtlHeader(AUTO_DETECT_TAG_SYNTAX);
-        testWithFtlHeader(ANGLE_BRACKET_TAG_SYNTAX);
-        testWithFtlHeader(SQUARE_BRACKET_TAG_SYNTAX);
+        testWithFtlHeader(AUTO_DETECT);
+        testWithFtlHeader(ANGLE_BRACKET);
+        testWithFtlHeader(SQUARE_BRACKET);
     }
     
-    private void testWithFtlHeader(int cfgTagSyntax) throws IOException {
-        assertEquals(getActualTagSyntax("[#ftl]foo", cfgTagSyntax), SQUARE_BRACKET_TAG_SYNTAX);
-        assertEquals(getActualTagSyntax("<#ftl>foo", cfgTagSyntax), ANGLE_BRACKET_TAG_SYNTAX);
+    private void testWithFtlHeader(TagSyntax cfgTagSyntax) throws IOException {
+        assertEquals(getActualTagSyntax("[#ftl]foo", cfgTagSyntax), SQUARE_BRACKET);
+        assertEquals(getActualTagSyntax("<#ftl>foo", cfgTagSyntax), ANGLE_BRACKET);
     }
     
     @Test
     public void testUndecidable() throws IOException {
-        assertEquals(getActualTagSyntax("foo", AUTO_DETECT_TAG_SYNTAX), ANGLE_BRACKET_TAG_SYNTAX);
-        assertEquals(getActualTagSyntax("foo", ANGLE_BRACKET_TAG_SYNTAX), ANGLE_BRACKET_TAG_SYNTAX);
-        assertEquals(getActualTagSyntax("foo", SQUARE_BRACKET_TAG_SYNTAX), SQUARE_BRACKET_TAG_SYNTAX);
+        assertEquals(getActualTagSyntax("foo", AUTO_DETECT), ANGLE_BRACKET);
+        assertEquals(getActualTagSyntax("foo", ANGLE_BRACKET), ANGLE_BRACKET);
+        assertEquals(getActualTagSyntax("foo", SQUARE_BRACKET), SQUARE_BRACKET);
     }
 
     @Test
     public void testDecidableWithoutFtlHeader() throws IOException {
-        assertEquals(getActualTagSyntax("foo<#if true></#if>", AUTO_DETECT_TAG_SYNTAX), ANGLE_BRACKET_TAG_SYNTAX);
-        assertEquals(getActualTagSyntax("foo<#if true></#if>", ANGLE_BRACKET_TAG_SYNTAX), ANGLE_BRACKET_TAG_SYNTAX);
-        assertEquals(getActualTagSyntax("foo<#if true></#if>", SQUARE_BRACKET_TAG_SYNTAX), SQUARE_BRACKET_TAG_SYNTAX);
+        assertEquals(getActualTagSyntax("foo<#if true></#if>", AUTO_DETECT), ANGLE_BRACKET);
+        assertEquals(getActualTagSyntax("foo<#if true></#if>", ANGLE_BRACKET), ANGLE_BRACKET);
+        assertEquals(getActualTagSyntax("foo<#if true></#if>", SQUARE_BRACKET), SQUARE_BRACKET);
         
-        assertEquals(getActualTagSyntax("foo[#if true][/#if]", AUTO_DETECT_TAG_SYNTAX), SQUARE_BRACKET_TAG_SYNTAX);
-        assertEquals(getActualTagSyntax("foo[#if true][/#if]", ANGLE_BRACKET_TAG_SYNTAX), ANGLE_BRACKET_TAG_SYNTAX);
-        assertEquals(getActualTagSyntax("foo[#if true][/#if]", SQUARE_BRACKET_TAG_SYNTAX), SQUARE_BRACKET_TAG_SYNTAX);
+        assertEquals(getActualTagSyntax("foo[#if true][/#if]", AUTO_DETECT), SQUARE_BRACKET);
+        assertEquals(getActualTagSyntax("foo[#if true][/#if]", ANGLE_BRACKET), ANGLE_BRACKET);
+        assertEquals(getActualTagSyntax("foo[#if true][/#if]", SQUARE_BRACKET), SQUARE_BRACKET);
     }
     
-    private int getActualTagSyntax(String ftl, int cfgTagSyntax) throws IOException {
+    private TagSyntax getActualTagSyntax(String ftl, TagSyntax cfgTagSyntax) throws IOException {
         return new Template(
                 null, ftl,
                 new TestConfigurationBuilder().tagSyntax(cfgTagSyntax).build()).getActualTagSyntax();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/CamelCaseTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/CamelCaseTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/CamelCaseTest.java
index 95572ad..d2f3fa0 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/CamelCaseTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/CamelCaseTest.java
@@ -120,21 +120,21 @@ public class CamelCaseTest extends TemplateTest {
         assertErrorContains("<#ftl strip_whitespace=true>${.fooBar}", "naming convention");
 
         setConfiguration(new TestConfigurationBuilder()
-                .namingConvention(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION)
+                .namingConvention(NamingConvention.CAMEL_CASE)
                 .outputEncoding(StandardCharsets.UTF_8)
                 .build());
         assertErrorContains("<#ftl strip_whitespace=true>", "naming convention");
         assertOutput("<#ftl stripWhitespace=true>${.outputEncoding}", StandardCharsets.UTF_8.name());
         
         setConfiguration(new TestConfigurationBuilder()
-                .namingConvention(ParsingConfiguration.LEGACY_NAMING_CONVENTION)
+                .namingConvention(NamingConvention.LEGACY)
                 .outputEncoding(StandardCharsets.UTF_8)
                 .build());
         assertErrorContains("<#ftl stripWhitespace=true>", "naming convention");
         assertOutput("<#ftl strip_whitespace=true>${.output_encoding}", StandardCharsets.UTF_8.name());
         
         setConfiguration(new TestConfigurationBuilder()
-                .namingConvention(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION)
+                .namingConvention(NamingConvention.AUTO_DETECT)
                 .outputEncoding(StandardCharsets.UTF_8)
                 .build());
         assertOutput("<#ftl stripWhitespace=true>${.outputEncoding}", StandardCharsets.UTF_8.name());
@@ -187,7 +187,7 @@ public class CamelCaseTest extends TemplateTest {
 
     @Test
     public void stringLiteralInterpolation() throws IOException, TemplateException {
-        assertEquals(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION, getConfiguration().getNamingConvention());
+        assertEquals(NamingConvention.AUTO_DETECT, getConfiguration().getNamingConvention());
         addToDataModel("x", "x");
         
         assertOutput("${'-${x?upperCase}-'} ${x?upperCase}", "-X- X");
@@ -217,7 +217,7 @@ public class CamelCaseTest extends TemplateTest {
     
     @Test
     public void evalAndInterpret() throws IOException, TemplateException {
-        assertEquals(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION, getConfiguration().getNamingConvention());
+        assertEquals(NamingConvention.AUTO_DETECT, getConfiguration().getNamingConvention());
         // The naming convention detected doesn't affect the enclosing template's naming convention.
         // - ?eval:
         assertOutput("${\"'x'?upperCase\"?eval}${'x'?upper_case}", "XX");
@@ -253,7 +253,7 @@ public class CamelCaseTest extends TemplateTest {
 
     private void setConfigurationToLegacyCaseNamingConvention() {
         setConfiguration(new TestConfigurationBuilder()
-                .namingConvention(ParsingConfiguration.LEGACY_NAMING_CONVENTION)
+                .namingConvention(NamingConvention.LEGACY)
                 .build());
     }
 
@@ -275,7 +275,7 @@ public class CamelCaseTest extends TemplateTest {
 
     private void setConfigurationToCamelCaseNamingConvention() {
         setConfiguration(new TestConfigurationBuilder()
-                .namingConvention(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION)
+                .namingConvention(NamingConvention.CAMEL_CASE)
                 .build());
     }
 
@@ -297,7 +297,7 @@ public class CamelCaseTest extends TemplateTest {
     private void assertContainsBothNamingStyles(Set<String> names, NamePairAssertion namePairAssertion) {
         Set<String> underscoredNamesWithCamelCasePair = new HashSet<>();
         for (String name : names) {
-            if (_StringUtil.getIdentifierNamingConvention(name) == ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) {
+            if (_StringUtil.getIdentifierNamingConvention(name) == NamingConvention.CAMEL_CASE) {
                 String underscoredName = correctIsoBIExceptions(_StringUtil.camelCaseToUnderscored(name)); 
                 assertTrue(
                         "Missing underscored variation \"" + underscoredName + "\" for \"" + name + "\".",
@@ -308,7 +308,7 @@ public class CamelCaseTest extends TemplateTest {
             }
         }
         for (String name : names) {
-            if (_StringUtil.getIdentifierNamingConvention(name) == ParsingConfiguration.LEGACY_NAMING_CONVENTION) {
+            if (_StringUtil.getIdentifierNamingConvention(name) == NamingConvention.LEGACY) {
                 assertTrue("Missing camel case variation for \"" + name + "\".",
                         underscoredNamesWithCamelCasePair.contains(name));
             }
@@ -323,7 +323,7 @@ public class CamelCaseTest extends TemplateTest {
     public void camelCaseDirectives() throws IOException, TemplateException {
         camelCaseDirectives(false);
         setConfiguration(new TestConfigurationBuilder()
-                .tagSyntax(ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX)
+                .tagSyntax(TagSyntax.AUTO_DETECT)
                 .build());
         camelCaseDirectives(true);
     }
@@ -364,11 +364,11 @@ public class CamelCaseTest extends TemplateTest {
     }
     
     private void explicitNamingConvention(boolean squared) throws IOException, TemplateException {
-        int tagSyntax = squared ? ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX
-                : ParsingConfiguration.ANGLE_BRACKET_TAG_SYNTAX;
+        TagSyntax tagSyntax = squared ? TagSyntax.AUTO_DETECT
+                : TagSyntax.ANGLE_BRACKET;
         setConfiguration(new TestConfigurationBuilder()
                 .tagSyntax(tagSyntax)
-                .namingConvention(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION)
+                .namingConvention(NamingConvention.CAMEL_CASE)
                 .build());
 
         assertErrorContains(
@@ -396,7 +396,7 @@ public class CamelCaseTest extends TemplateTest {
 
         setConfiguration(new TestConfigurationBuilder()
                 .tagSyntax(tagSyntax)
-                .namingConvention(ParsingConfiguration.LEGACY_NAMING_CONVENTION)
+                .namingConvention(NamingConvention.LEGACY)
                 .build());
 
         assertErrorContains(

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java
index 91d3749..1e945fe 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java
@@ -57,7 +57,7 @@ public class CoercionToTextualTest extends TemplateTest {
     public void testEscBuiltin() throws IOException, TemplateException {
         setConfiguration(createDefaultConfigurationBuilder()
                 .outputFormat(HTMLOutputFormat.INSTANCE)
-                .autoEscapingPolicy(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY)
+                .autoEscapingPolicy(AutoEscapingPolicy.DISABLE)
                 .booleanFormat("<y>,<n>")
                 .build());
         assertOutput("${'a<b'?esc}", "a&lt;b");

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurableTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurableTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurableTest.java
index ebcc465..5301f14 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurableTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurableTest.java
@@ -96,7 +96,7 @@ public class ConfigurableTest {
             String fieldName = field.getName();
             if (fieldName.endsWith("_KEY")) {
                 String keyFieldValue = (String) field.get(null);
-                assertNotEquals(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION,
+                assertNotEquals(NamingConvention.CAMEL_CASE,
                         _StringUtil.getIdentifierNamingConvention(keyFieldValue));
                 assertEquals(fieldName.substring(0, fieldName.length() - 4).toLowerCase(), keyFieldValue);
                 
@@ -109,7 +109,7 @@ public class ConfigurableTest {
                 
                 try {
                     String keyCCFieldValue = (String) confClass.getField(fieldName + "_CAMEL_CASE").get(null);
-                    assertNotEquals(ParsingConfiguration.LEGACY_NAMING_CONVENTION,
+                    assertNotEquals(NamingConvention.LEGACY,
                             _StringUtil.getIdentifierNamingConvention(keyCCFieldValue));
                     assertEquals(keyFieldValue, _StringUtil.camelCaseToUnderscored(keyCCFieldValue));
                 } catch (NoSuchFieldException e) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
index dcefa3f..87f1c21 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
@@ -547,38 +547,31 @@ public class ConfigurationTest extends TestCase {
     public void testSetAutoEscaping() throws Exception {
        Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
     
-       assertEquals(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+       assertEquals(AutoEscapingPolicy.ENABLE_IF_DEFAULT, cfgB.getAutoEscapingPolicy());
 
-       cfgB.setAutoEscapingPolicy(ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY);
-       assertEquals(ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+       cfgB.setAutoEscapingPolicy(AutoEscapingPolicy.ENABLE_IF_SUPPORTED);
+       assertEquals(AutoEscapingPolicy.ENABLE_IF_SUPPORTED, cfgB.getAutoEscapingPolicy());
 
-       cfgB.setAutoEscapingPolicy(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY);
-       assertEquals(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+       cfgB.setAutoEscapingPolicy(AutoEscapingPolicy.ENABLE_IF_DEFAULT);
+       assertEquals(AutoEscapingPolicy.ENABLE_IF_DEFAULT, cfgB.getAutoEscapingPolicy());
 
-       cfgB.setAutoEscapingPolicy(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY);
-       assertEquals(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+       cfgB.setAutoEscapingPolicy(AutoEscapingPolicy.DISABLE);
+       assertEquals(AutoEscapingPolicy.DISABLE, cfgB.getAutoEscapingPolicy());
        
        cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "enableIfSupported");
-       assertEquals(ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+       assertEquals(AutoEscapingPolicy.ENABLE_IF_SUPPORTED, cfgB.getAutoEscapingPolicy());
 
        cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "enable_if_supported");
-       assertEquals(ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+       assertEquals(AutoEscapingPolicy.ENABLE_IF_SUPPORTED, cfgB.getAutoEscapingPolicy());
        
        cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "enableIfDefault");
-       assertEquals(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+       assertEquals(AutoEscapingPolicy.ENABLE_IF_DEFAULT, cfgB.getAutoEscapingPolicy());
 
        cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "enable_if_default");
-       assertEquals(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+       assertEquals(AutoEscapingPolicy.ENABLE_IF_DEFAULT, cfgB.getAutoEscapingPolicy());
        
        cfgB.setSetting(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE, "disable");
-       assertEquals(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
-       
-       try {
-           cfgB.setAutoEscapingPolicy(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
-           fail();
-       } catch (IllegalArgumentException e) {
-           // Expected
-       }
+       assertEquals(AutoEscapingPolicy.DISABLE, cfgB.getAutoEscapingPolicy());
     }
 
     public void testSetOutputFormat() throws Exception {
@@ -1180,16 +1173,16 @@ public class ConfigurationTest extends TestCase {
     public void testNamingConventionSetSetting() throws ConfigurationException {
         Configuration.Builder cfg = new Configuration.Builder(Configuration.VERSION_3_0_0);
 
-        assertEquals(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION, cfg.getNamingConvention());
+        assertEquals(NamingConvention.AUTO_DETECT, cfg.getNamingConvention());
         
         cfg.setSetting("naming_convention", "legacy");
-        assertEquals(ParsingConfiguration.LEGACY_NAMING_CONVENTION, cfg.getNamingConvention());
+        assertEquals(NamingConvention.LEGACY, cfg.getNamingConvention());
         
         cfg.setSetting("naming_convention", "camel_case");
-        assertEquals(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION, cfg.getNamingConvention());
+        assertEquals(NamingConvention.CAMEL_CASE, cfg.getNamingConvention());
         
         cfg.setSetting("naming_convention", "auto_detect");
-        assertEquals(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION, cfg.getNamingConvention());
+        assertEquals(NamingConvention.AUTO_DETECT, cfg.getNamingConvention());
     }
 
     public void testLazyImportsSetSetting() throws ConfigurationException {
@@ -1400,9 +1393,9 @@ public class ConfigurationTest extends TestCase {
     public void testGetSupportedBuiltInDirectiveNames() {
         Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).build();
         
-        Set<String> allNames = cfg.getSupportedBuiltInDirectiveNames(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION);
-        Set<String> lNames = cfg.getSupportedBuiltInDirectiveNames(ParsingConfiguration.LEGACY_NAMING_CONVENTION);
-        Set<String> cNames = cfg.getSupportedBuiltInDirectiveNames(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
+        Set<String> allNames = cfg.getSupportedBuiltInDirectiveNames(NamingConvention.AUTO_DETECT);
+        Set<String> lNames = cfg.getSupportedBuiltInDirectiveNames(NamingConvention.LEGACY);
+        Set<String> cNames = cfg.getSupportedBuiltInDirectiveNames(NamingConvention.CAMEL_CASE);
         
         checkNamingConventionNameSets(allNames, lNames, cNames);
         
@@ -1415,9 +1408,9 @@ public class ConfigurationTest extends TestCase {
     public void testGetSupportedBuiltInNames() {
         Configuration cfg = new Configuration.Builder(Configuration.VERSION_3_0_0).build();
         
-        Set<String> allNames = cfg.getSupportedBuiltInNames(ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION);
-        Set<String> lNames = cfg.getSupportedBuiltInNames(ParsingConfiguration.LEGACY_NAMING_CONVENTION);
-        Set<String> cNames = cfg.getSupportedBuiltInNames(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
+        Set<String> allNames = cfg.getSupportedBuiltInNames(NamingConvention.AUTO_DETECT);
+        Set<String> lNames = cfg.getSupportedBuiltInNames(NamingConvention.LEGACY);
+        Set<String> cNames = cfg.getSupportedBuiltInNames(NamingConvention.CAMEL_CASE);
         
         checkNamingConventionNameSets(allNames, lNames, cNames);
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java
index 2d061d7..dd4f899 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java
@@ -42,7 +42,7 @@ public class InterpretSettingInheritanceTest  extends TemplateTest {
     @Test
     public void tagSyntaxTest() throws IOException, TemplateException {
         setConfiguration(new TestConfigurationBuilder()
-                .tagSyntax(ParsingConfiguration.ANGLE_BRACKET_TAG_SYNTAX)
+                .tagSyntax(TagSyntax.ANGLE_BRACKET)
                 .build());
         assertOutput(FTL_S_A_S, OUT_A_S_WHEN_SYNTAX_IS_A);
         assertOutput(FTL_S_S_A, OUT_S_A_WHEN_SYNTAX_IS_A);
@@ -50,7 +50,7 @@ public class InterpretSettingInheritanceTest  extends TemplateTest {
         assertOutput(FTL_A_S_A, OUT_S_A_WHEN_SYNTAX_IS_A);
 
         setConfiguration(new TestConfigurationBuilder()
-                .tagSyntax(ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX)
+                .tagSyntax(TagSyntax.SQUARE_BRACKET)
                 .build());
         assertOutput(FTL_S_A_S, OUT_A_S_WHEN_SYNTAX_IS_S);
         assertOutput(FTL_S_S_A, OUT_S_A_WHEN_SYNTAX_IS_S);
@@ -58,7 +58,7 @@ public class InterpretSettingInheritanceTest  extends TemplateTest {
         assertOutput(FTL_A_S_A, OUT_S_A_WHEN_SYNTAX_IS_S);
 
         setConfiguration(new TestConfigurationBuilder()
-                .tagSyntax(ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX)
+                .tagSyntax(TagSyntax.AUTO_DETECT)
                 .build());
         assertOutput(FTL_S_A_S, OUT_A_S_WHEN_SYNTAX_IS_A);
         assertOutput(FTL_S_S_A, OUT_S_A_WHEN_SYNTAX_IS_S);
@@ -89,13 +89,13 @@ public class InterpretSettingInheritanceTest  extends TemplateTest {
     @Test
     public void evalTest() throws IOException, TemplateException {
         setConfiguration(new TestConfigurationBuilder()
-                .tagSyntax(ParsingConfiguration.ANGLE_BRACKET_TAG_SYNTAX)
+                .tagSyntax(TagSyntax.ANGLE_BRACKET)
                 .build());
         assertOutput("<@'\"[#if true]s[/#if]<#if true>a</#if>\"?interpret'?eval />", OUT_S_A_WHEN_SYNTAX_IS_A);
         assertOutput("[#ftl][@'\"[#if true]s[/#if]<#if true>a</#if>\"?interpret'?eval /]", OUT_S_A_WHEN_SYNTAX_IS_A);
 
         setConfiguration(new TestConfigurationBuilder()
-                .tagSyntax(ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX)
+                .tagSyntax(TagSyntax.SQUARE_BRACKET)
                 .build());
         assertOutput("[@'\"[#if true]s[/#if]<#if true>a</#if>\"?interpret'?eval /]", OUT_S_A_WHEN_SYNTAX_IS_S);
         assertOutput("<#ftl><@'\"[#if true]s[/#if]<#if true>a</#if>\"?interpret'?eval />", OUT_S_A_WHEN_SYNTAX_IS_S);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java
index 49534fa..7c0d841 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java
@@ -911,7 +911,7 @@ public class ObjectBuilderSettingsTest {
         assertEqualsEvaled(123, "org.apache.freemarker.core.ObjectBuilderSettingsTest$TestStaticFields.CONST");
         
         // With shorthand class name:
-        assertEqualsEvaled(ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX, "Configuration.AUTO_DETECT_TAG_SYNTAX");
+        assertEqualsEvaled(TagSyntax.AUTO_DETECT, "TagSyntax.AUTO_DETECT");
         
         try {
             _ObjectBuilderSettingEvaluator.eval(

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java
index eedb4d1..d78c558 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.freemarker.core;
 
-import static org.apache.freemarker.core.ParsingConfiguration.*;
+import static org.apache.freemarker.core.AutoEscapingPolicy.*;
 import static org.junit.Assert.*;
 
 import java.io.IOException;
@@ -189,7 +189,7 @@ public class OutputFormatTest extends TemplateTest {
         ConditionalTemplateConfigurationFactory tcfNoAutoEsc = new ConditionalTemplateConfigurationFactory(
                 new FileNameGlobMatcher("t.*"),
                 new TemplateConfiguration.Builder()
-                        .autoEscapingPolicy(DISABLE_AUTO_ESCAPING_POLICY)
+                        .autoEscapingPolicy(DISABLE)
                         .build());
 
         {
@@ -289,34 +289,34 @@ public class OutputFormatTest extends TemplateTest {
         addTemplate("tWithHeaderTrue", "<#ftl autoEsc=true>${'a&b'}");
         
         TestConfigurationBuilder cfgB = createDefaultConfigurationBuilder().outputFormat(XMLOutputFormat.INSTANCE);
-        assertEquals(ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+        assertEquals(ENABLE_IF_DEFAULT, cfgB.getAutoEscapingPolicy());
 
         for (boolean cfgAutoEscaping : new boolean[] { true, false }) {
             if (!cfgAutoEscaping) {
-                cfgB.setAutoEscapingPolicy(DISABLE_AUTO_ESCAPING_POLICY);
+                cfgB.setAutoEscapingPolicy(DISABLE);
             }
             setConfiguration(cfgB.build());
 
             {
                 Template t = getConfiguration().getTemplate("t");
                 if (cfgAutoEscaping) {
-                    assertEquals(ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, t.getAutoEscapingPolicy());
+                    assertEquals(ENABLE_IF_DEFAULT, t.getAutoEscapingPolicy());
                     assertOutput(t, "a&amp;b");
                 } else {
-                    assertEquals(DISABLE_AUTO_ESCAPING_POLICY, t.getAutoEscapingPolicy());
+                    assertEquals(DISABLE, t.getAutoEscapingPolicy());
                     assertOutput(t, "a&b");
                 }
             }
             
             {
                 Template t = getConfiguration().getTemplate("tWithHeaderFalse");
-                assertEquals(DISABLE_AUTO_ESCAPING_POLICY, t.getAutoEscapingPolicy());
+                assertEquals(DISABLE, t.getAutoEscapingPolicy());
                 assertOutput(t, "a&b");
             }
             
             {
                 Template t = getConfiguration().getTemplate("tWithHeaderTrue");
-                assertEquals(ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY, t.getAutoEscapingPolicy());
+                assertEquals(ENABLE_IF_SUPPORTED, t.getAutoEscapingPolicy());
                 assertOutput(t, "a&amp;b");
             }
 
@@ -364,7 +364,7 @@ public class OutputFormatTest extends TemplateTest {
                 assertOutput(commonAutoEscFtl, "&amp;");
             } else {
                 setConfiguration(createDefaultConfigurationBuilder()
-                        .autoEscapingPolicy(DISABLE_AUTO_ESCAPING_POLICY)
+                        .autoEscapingPolicy(DISABLE)
                         .build());
                 assertOutput(commonAutoEscFtl, "&");
             }
@@ -781,19 +781,19 @@ public class OutputFormatTest extends TemplateTest {
         TestConfigurationBuilder cfgB = createDefaultConfigurationBuilder();
         cfgB.setRegisteredCustomOutputFormats(ImmutableList.<OutputFormat>of(
                 SeldomEscapedOutputFormat.INSTANCE, DummyOutputFormat.INSTANCE));
-        assertEquals(ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, cfgB.getAutoEscapingPolicy());
+        assertEquals(ENABLE_IF_DEFAULT, cfgB.getAutoEscapingPolicy());
         
         String commonFTL = "${'.'} ${.autoEsc?c}";
         String notEsced = ". false";
         String esced = "\\. true";
 
-        for (int autoEscPolicy : new int[] {
-                ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY,
-                ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY,
-                DISABLE_AUTO_ESCAPING_POLICY }) {
+        for (AutoEscapingPolicy autoEscPolicy : new AutoEscapingPolicy[] {
+                ENABLE_IF_DEFAULT,
+                ENABLE_IF_SUPPORTED,
+                DISABLE }) {
             cfgB.setAutoEscapingPolicy(autoEscPolicy);
             
-            String sExpted = autoEscPolicy == ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY ? esced : notEsced;
+            String sExpted = autoEscPolicy == ENABLE_IF_SUPPORTED ? esced : notEsced;
             cfgB.setOutputFormat(SeldomEscapedOutputFormat.INSTANCE);
             setConfiguration(cfgB.build());
             assertOutput(commonFTL, sExpted);
@@ -802,7 +802,7 @@ public class OutputFormatTest extends TemplateTest {
             assertOutput("<#ftl outputFormat='seldomEscaped'>" + commonFTL, sExpted);
             assertOutput("<#outputFormat 'seldomEscaped'>" + commonFTL + "</#outputFormat>", sExpted);
             
-            String dExpted = autoEscPolicy == DISABLE_AUTO_ESCAPING_POLICY ? notEsced : esced;
+            String dExpted = autoEscPolicy == DISABLE ? notEsced : esced;
             cfgB.setOutputFormat(DummyOutputFormat.INSTANCE);
             setConfiguration(cfgB.build());
             assertOutput(commonFTL, dExpted);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java
index 8f20d6c..c8b1f7d 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java
@@ -30,7 +30,7 @@ import org.junit.Test;
 public class ParsingErrorMessagesTest {
 
     private Configuration cfg = new TestConfigurationBuilder()
-            .tagSyntax(ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX)
+            .tagSyntax(TagSyntax.AUTO_DETECT)
             .build();
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/SpecialVariableTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/SpecialVariableTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/SpecialVariableTest.java
index 7e17fc7..99aae83 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/SpecialVariableTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/SpecialVariableTest.java
@@ -64,8 +64,8 @@ public class SpecialVariableTest extends TemplateTest {
     public void testAutoEsc() throws Exception {
         Configuration.Builder cfgB = new Configuration.Builder(Configuration.VERSION_3_0_0);
 
-        for (int autoEscaping : new int[] {
-                ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY, ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY }) {
+        for (AutoEscapingPolicy autoEscaping : new AutoEscapingPolicy[] {
+                AutoEscapingPolicy.ENABLE_IF_DEFAULT, AutoEscapingPolicy.ENABLE_IF_SUPPORTED }) {
             cfgB.setAutoEscapingPolicy(autoEscaping);
             cfgB.setOutputFormat(HTMLOutputFormat.INSTANCE);
             setConfiguration(cfgB.build());
@@ -81,7 +81,7 @@ public class SpecialVariableTest extends TemplateTest {
             assertOutput("${.autoEsc?c}", "false");
         }
         
-        cfgB.setAutoEscapingPolicy(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY);
+        cfgB.setAutoEscapingPolicy(AutoEscapingPolicy.DISABLE);
         cfgB.setOutputFormat(HTMLOutputFormat.INSTANCE);
         setConfiguration(cfgB.build());
         assertOutput("${.autoEsc?c}", "false");
@@ -95,7 +95,7 @@ public class SpecialVariableTest extends TemplateTest {
         setConfiguration(cfgB.build());
         assertOutput("${.autoEsc?c}", "false");
 
-        cfgB.setAutoEscapingPolicy(ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY);
+        cfgB.setAutoEscapingPolicy(AutoEscapingPolicy.ENABLE_IF_DEFAULT);
         setConfiguration(cfgB.build());
         assertOutput(
                 "${.autoEsc?c} "

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/TagSyntaxVariationsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/TagSyntaxVariationsTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/TagSyntaxVariationsTest.java
index fa21c76..7b2473b 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/TagSyntaxVariationsTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/TagSyntaxVariationsTest.java
@@ -70,8 +70,8 @@ public class TagSyntaxVariationsTest extends TestCase {
             for (int angOrSqu = 0; angOrSqu < 2; angOrSqu++) {
                 Configuration cfg = new TestConfigurationBuilder()
                         .tagSyntax(angOrSqu == 0
-                                ? ParsingConfiguration.ANGLE_BRACKET_TAG_SYNTAX
-                                : ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX)
+                                ? TagSyntax.ANGLE_BRACKET
+                                : TagSyntax.SQUARE_BRACKET)
                         .build();
 
                 String dir_xxx = angOrSqu == 0 ? dir_ang : dir_squ;
@@ -108,7 +108,7 @@ public class TagSyntaxVariationsTest extends TestCase {
 
             {
                 Configuration cfg = new TestConfigurationBuilder()
-                        .tagSyntax(ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX)
+                        .tagSyntax(TagSyntax.AUTO_DETECT)
                         .build();
                 for (int perm = 0; perm < 4; perm++) {
                     // All 4 permutations
@@ -123,7 +123,7 @@ public class TagSyntaxVariationsTest extends TestCase {
 
             {
                 Configuration cfg = new TestConfigurationBuilder()
-                        .tagSyntax(ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX)
+                        .tagSyntax(TagSyntax.AUTO_DETECT)
                         .build();
                 // Permutations
                 for (int angOrSquStart = 0; angOrSquStart < 2; angOrSquStart++) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core-test/src/test/java/org/apache/freemarker/core/TemplateConfigurationTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/TemplateConfigurationTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/TemplateConfigurationTest.java
index 5b1cda9..e4d4390 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/TemplateConfigurationTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/TemplateConfigurationTest.java
@@ -178,11 +178,11 @@ public class TemplateConfigurationTest {
 
         // Parser-only settings:
         SETTING_ASSIGNMENTS.put("templateLanguage", TemplateLanguage.STATIC_TEXT);
-        SETTING_ASSIGNMENTS.put("tagSyntax", ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX);
-        SETTING_ASSIGNMENTS.put("namingConvention", ParsingConfiguration.LEGACY_NAMING_CONVENTION);
+        SETTING_ASSIGNMENTS.put("tagSyntax", TagSyntax.SQUARE_BRACKET);
+        SETTING_ASSIGNMENTS.put("namingConvention", NamingConvention.LEGACY);
         SETTING_ASSIGNMENTS.put("whitespaceStripping", false);
         SETTING_ASSIGNMENTS.put("strictSyntaxMode", false);
-        SETTING_ASSIGNMENTS.put("autoEscapingPolicy", ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY);
+        SETTING_ASSIGNMENTS.put("autoEscapingPolicy", AutoEscapingPolicy.DISABLE);
         SETTING_ASSIGNMENTS.put("outputFormat", HTMLOutputFormat.INSTANCE);
         SETTING_ASSIGNMENTS.put("recognizeStandardFileExtensions", false);
         SETTING_ASSIGNMENTS.put("tabSize", 1);
@@ -541,7 +541,7 @@ public class TemplateConfigurationTest {
         
         {
             TemplateConfiguration.Builder tcb = new TemplateConfiguration.Builder();
-            tcb.setTagSyntax(ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX);
+            tcb.setTagSyntax(TagSyntax.SQUARE_BRACKET);
             TemplateConfiguration tc = tcb.build();
             assertOutputWithoutAndWithTC(tc, "[#if true]y[/#if]", "[#if true]y[/#if]", "y");
             testedProps.add(Configuration.ExtendableBuilder.TAG_SYNTAX_KEY_CAMEL_CASE);
@@ -549,7 +549,7 @@ public class TemplateConfigurationTest {
         
         {
             TemplateConfiguration.Builder tcb = new TemplateConfiguration.Builder();
-            tcb.setNamingConvention(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
+            tcb.setNamingConvention(NamingConvention.CAMEL_CASE);
             TemplateConfiguration tc = tcb.build();
             assertOutputWithoutAndWithTC(tc, "<#if true>y<#elseif false>n</#if>", "y", null);
             testedProps.add(Configuration.ExtendableBuilder.NAMING_CONVENTION_KEY_CAMEL_CASE);
@@ -584,7 +584,7 @@ public class TemplateConfigurationTest {
         {
             TemplateConfiguration.Builder tcb = new TemplateConfiguration.Builder();
             tcb.setOutputFormat(XMLOutputFormat.INSTANCE);
-            tcb.setAutoEscapingPolicy(ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY);
+            tcb.setAutoEscapingPolicy(AutoEscapingPolicy.DISABLE);
             TemplateConfiguration tc = tcb.build();
             assertOutputWithoutAndWithTC(tc, "${'a&b'}", "a&b", "a&b");
             testedProps.add(Configuration.ExtendableBuilder.AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE);
@@ -789,7 +789,7 @@ public class TemplateConfigurationTest {
 
             {
                 // Force camelCase:
-                tcb.setNamingConvention(ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION);
+                tcb.setNamingConvention(NamingConvention.CAMEL_CASE);
 
                 TemplateConfiguration tc = tcb.build();
 
@@ -799,7 +799,7 @@ public class TemplateConfigurationTest {
 
             {
                 // Force legacy:
-                tcb.setNamingConvention(ParsingConfiguration.LEGACY_NAMING_CONVENTION);
+                tcb.setNamingConvention(NamingConvention.LEGACY);
 
                 TemplateConfiguration tc = tcb.build();
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java
index 68a0672..a2c077f 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java
@@ -72,19 +72,19 @@ final class ASTDirSetting extends ASTDirective {
                 sb.append(_StringUtil.jQuote(key)).append(".");
                 sb.append(" The allowed setting names are: ");
 
-                int shownNamingConvention;
+                NamingConvention shownNamingConvention;
                 {
-                    int namingConvention = tokenManager.namingConvention;
-                    shownNamingConvention = namingConvention != ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION
-                            ? namingConvention : ParsingConfiguration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */;
+                    NamingConvention namingConvention = tokenManager.namingConvention;
+                    shownNamingConvention = namingConvention != NamingConvention.AUTO_DETECT
+                            ? namingConvention : NamingConvention.LEGACY /* [2.4] CAMEL_CASE */;
                 }
                 
                 boolean first = true;
                 for (String correctName : SETTING_NAMES) {
-                    int correctNameNamingConvention = _StringUtil.getIdentifierNamingConvention(correctName);
-                    if (shownNamingConvention == ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION
-                            ? correctNameNamingConvention != ParsingConfiguration.LEGACY_NAMING_CONVENTION
-                            : correctNameNamingConvention != ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) {
+                    NamingConvention correctNameNamingConvention = _StringUtil.getIdentifierNamingConvention(correctName);
+                    if (shownNamingConvention == NamingConvention.CAMEL_CASE
+                            ? correctNameNamingConvention != NamingConvention.LEGACY
+                            : correctNameNamingConvention != NamingConvention.CAMEL_CASE) {
                         if (first) {
                             first = false;
                         } else {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java
index be559f6..5a276a5 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java
@@ -327,20 +327,20 @@ abstract class ASTExpBuiltIn extends ASTExpression implements Cloneable {
             names.addAll(BUILT_INS_BY_NAME.keySet());
             Collections.sort(names);
             char lastLetter = 0;
-            
-            int shownNamingConvention;
+
+            NamingConvention shownNamingConvention;
             {
-                int namingConvention = tokenManager.namingConvention;
-                shownNamingConvention = namingConvention != ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION
-                        ? namingConvention : ParsingConfiguration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */;
+                NamingConvention namingConvention = tokenManager.namingConvention;
+                shownNamingConvention = namingConvention != NamingConvention.AUTO_DETECT
+                        ? namingConvention : NamingConvention.LEGACY /* [2.4] CAMEL_CASE */;
             }
             
             boolean first = true;
             for (String correctName : names) {
-                int correctNameNamingConvetion = _StringUtil.getIdentifierNamingConvention(correctName);
-                if (shownNamingConvention == ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION
-                        ? correctNameNamingConvetion != ParsingConfiguration.LEGACY_NAMING_CONVENTION
-                        : correctNameNamingConvetion != ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) {
+                NamingConvention correctNameNamingConvetion = _StringUtil.getIdentifierNamingConvention(correctName);
+                if (shownNamingConvention == NamingConvention.CAMEL_CASE
+                        ? correctNameNamingConvetion != NamingConvention.LEGACY
+                        : correctNameNamingConvetion != NamingConvention.CAMEL_CASE) {
                     if (first) {
                         first = false;
                     } else {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
index ece2099..0dda491 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
@@ -119,12 +119,12 @@ final class ASTExpBuiltInVariable extends ASTExpression {
             StringBuilder sb = new StringBuilder();
             sb.append("Unknown special variable name: ");
             sb.append(_StringUtil.jQuote(name)).append(".");
-            
-            int shownNamingConvention;
+
+            NamingConvention shownNamingConvention;
             {
-                int namingConvention = tokenManager.namingConvention;
-                shownNamingConvention = namingConvention != ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION
-                        ? namingConvention : ParsingConfiguration.LEGACY_NAMING_CONVENTION /* [2.4] CAMEL_CASE */;
+                NamingConvention namingConvention = tokenManager.namingConvention;
+                shownNamingConvention = namingConvention != NamingConvention.AUTO_DETECT
+                        ? namingConvention : NamingConvention.LEGACY /* [2.4] CAMEL_CASE */;
             }
             
             {
@@ -145,10 +145,10 @@ final class ASTExpBuiltInVariable extends ASTExpression {
             sb.append("\nThe allowed special variable names are: ");
             boolean first = true;
             for (final String correctName : SPEC_VAR_NAMES) {
-                int correctNameNamingConvention = _StringUtil.getIdentifierNamingConvention(correctName);
-                if (shownNamingConvention == ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION
-                        ? correctNameNamingConvention != ParsingConfiguration.LEGACY_NAMING_CONVENTION
-                        : correctNameNamingConvention != ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) {
+                NamingConvention correctNameNamingConvention = _StringUtil.getIdentifierNamingConvention(correctName);
+                if (shownNamingConvention == NamingConvention.CAMEL_CASE
+                        ? correctNameNamingConvention != NamingConvention.LEGACY
+                        : correctNameNamingConvention != NamingConvention.CAMEL_CASE) {
                     if (first) {
                         first = false;
                     } else {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/AutoEscapingPolicy.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/AutoEscapingPolicy.java b/freemarker-core/src/main/java/org/apache/freemarker/core/AutoEscapingPolicy.java
new file mode 100644
index 0000000..c221559
--- /dev/null
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/AutoEscapingPolicy.java
@@ -0,0 +1,44 @@
+/*
+ * 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 org.apache.freemarker.core;
+
+import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
+import org.apache.freemarker.core.outputformat.OutputFormat;
+
+/**
+ * Used as the value of the {@link ParsingConfiguration#getAutoEscapingPolicy() autoEscapingPolicy} setting.
+ */
+public enum AutoEscapingPolicy {
+
+    /**
+     * Don't enable auto-escaping, regardless of what the {@link OutputFormat} is. Note that a {@code
+     * <#ftl auto_esc=true>} in the template will override this.
+     */
+    DISABLE,
+
+    /**
+     * Enable auto-escaping if the output format supports it and {@link MarkupOutputFormat#isAutoEscapedByDefault()} is
+     * {@code true}.
+     */
+    ENABLE_IF_DEFAULT,
+
+    /** Enable auto-escaping if the {@link OutputFormat} supports it. */
+    ENABLE_IF_SUPPORTED
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
index 710cad3..05643a0 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
@@ -74,6 +74,7 @@ import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameForma
 import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateResolver;
 import org.apache.freemarker.core.templateresolver.impl.MruCacheStorage;
 import org.apache.freemarker.core.templateresolver.impl.SoftCacheStorage;
+import org.apache.freemarker.core.util.BugException;
 import org.apache.freemarker.core.util.CaptureOutput;
 import org.apache.freemarker.core.util.CommonBuilder;
 import org.apache.freemarker.core.util.HtmlEscape;
@@ -242,10 +243,10 @@ public final class Configuration
     // ParsingConfiguration settings:
 
     private final TemplateLanguage templateLanguage;
-    private final int tagSyntax;
-    private final int namingConvention;
+    private final TagSyntax tagSyntax;
+    private final NamingConvention namingConvention;
     private final boolean whitespaceStripping;
-    private final int autoEscapingPolicy;
+    private final AutoEscapingPolicy autoEscapingPolicy;
     private final OutputFormat outputFormat;
     private final Boolean recognizeStandardFileExtensions;
     private final int tabSize;
@@ -581,7 +582,7 @@ public final class Configuration
 
     /**
      * When auto-escaping should be enabled depending on the current {@linkplain OutputFormat output format};
-     * default is {@link ParsingConfiguration#ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY}. Note that the default output
+     * default is {@link AutoEscapingPolicy#ENABLE_IF_DEFAULT}. Note that the default output
      * format, {@link UndefinedOutputFormat}, is a non-escaping format, so there auto-escaping will be off.
      * Note that the templates can turn auto-escaping on/off locally with directives like {@code <#ftl auto_esc=...>},
      * which will ignore the policy.
@@ -614,13 +615,13 @@ public final class Configuration
      * {@linkplain #getTemplateConfigurations() template configurations setting}. This setting is also overridden by
      * the standard file extensions; see them at {@link #getRecognizeStandardFileExtensions()}.
      *
-     * @see Configuration.Builder#setAutoEscapingPolicy(int)
-     * @see TemplateConfiguration.Builder#setAutoEscapingPolicy(int)
+     * @see Configuration.Builder#setAutoEscapingPolicy(AutoEscapingPolicy)
+     * @see TemplateConfiguration.Builder#setAutoEscapingPolicy(AutoEscapingPolicy)
      * @see Configuration.Builder#setOutputFormat(OutputFormat)
      * @see TemplateConfiguration.Builder#setOutputFormat(OutputFormat)
      */
     @Override
-    public int getAutoEscapingPolicy() {
+    public AutoEscapingPolicy getAutoEscapingPolicy() {
         return autoEscapingPolicy;
     }
 
@@ -779,7 +780,7 @@ public final class Configuration
     }
 
     @Override
-    public int getTagSyntax() {
+    public TagSyntax getTagSyntax() {
         return tagSyntax;
     }
 
@@ -795,20 +796,8 @@ public final class Configuration
         return true;
     }
 
-    // [FM3] Use enum; won't be needed
-    static void validateNamingConventionValue(int namingConvention) {
-        if (namingConvention != ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION
-                && namingConvention != ParsingConfiguration.LEGACY_NAMING_CONVENTION
-                && namingConvention != ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) {
-            throw new IllegalArgumentException("\"naming_convention\" can only be set to one of these: "
-                    + "Configuration.AUTO_DETECT_NAMING_CONVENTION, "
-                    + "or Configuration.LEGACY_NAMING_CONVENTION"
-                    + "or Configuration.CAMEL_CASE_NAMING_CONVENTION");
-        }
-    }
-
     @Override
-    public int getNamingConvention() {
+    public NamingConvention getNamingConvention() {
         return namingConvention;
     }
 
@@ -1466,7 +1455,7 @@ public final class Configuration
     }
     
     /**
-     * Same as {@link #getSupportedBuiltInNames(int)} with argument {@link #getNamingConvention()}.
+     * Same as {@link #getSupportedBuiltInNames(NamingConvention)} with argument {@link #getNamingConvention()}.
      * 
      * @since 2.3.20
      */
@@ -1480,30 +1469,31 @@ public final class Configuration
      * to be future-proof, it's an instance method. 
      * 
      * @param namingConvention
-     *            One of {@link ParsingConfiguration#AUTO_DETECT_NAMING_CONVENTION},
-     *            {@link ParsingConfiguration#LEGACY_NAMING_CONVENTION}, and
-     *            {@link ParsingConfiguration#CAMEL_CASE_NAMING_CONVENTION}. If it's
-     *            {@link ParsingConfiguration#AUTO_DETECT_NAMING_CONVENTION} then the union
+     *            One of {@link NamingConvention#AUTO_DETECT},
+     *            {@link NamingConvention#LEGACY}, and
+     *            {@link NamingConvention#CAMEL_CASE}. If it's
+     *            {@link NamingConvention#AUTO_DETECT} then the union
      *            of the names in all the naming conventions is returned.
      * 
      * @since 2.3.24
      */
-    public Set<String> getSupportedBuiltInNames(int namingConvention) {
+    public Set<String> getSupportedBuiltInNames(NamingConvention namingConvention) {
         Set<String> names;
-        if (namingConvention == ParsingConfiguration.AUTO_DETECT_NAMING_CONVENTION) {
+        if (namingConvention == NamingConvention.AUTO_DETECT) {
             names = ASTExpBuiltIn.BUILT_INS_BY_NAME.keySet();
-        } else if (namingConvention == ParsingConfiguration.LEGACY_NAMING_CONVENTION) {
+        } else if (namingConvention == NamingConvention.LEGACY) {
             names = ASTExpBuiltIn.SNAKE_CASE_NAMES;
-        } else if (namingConvention == ParsingConfiguration.CAMEL_CASE_NAMING_CONVENTION) {
+        } else if (namingConvention == NamingConvention.CAMEL_CASE) {
             names = ASTExpBuiltIn.CAMEL_CASE_NAMES;
         } else {
-            throw new IllegalArgumentException("Unsupported naming convention constant: " + namingConvention);
+            throw new BugException("Unsupported naming convention constant: " + namingConvention);
         }
         return Collections.unmodifiableSet(names);
     }
     
     /**
-     * Same as {@link #getSupportedBuiltInDirectiveNames(int)} with argument {@link #getNamingConvention()}.
+     * Same as {@link #getSupportedBuiltInDirectiveNames(NamingConvention)} with argument
+     * {@link #getNamingConvention()}.
      * 
      * @since 2.3.21
      */
@@ -1516,23 +1506,23 @@ public final class Configuration
      * <tt>&lt;#directiveName ...&gt;</tt>.
      * 
      * @param namingConvention
-     *            One of {@link ParsingConfiguration#AUTO_DETECT_NAMING_CONVENTION},
-     *            {@link ParsingConfiguration#LEGACY_NAMING_CONVENTION}, and
-     *            {@link ParsingConfiguration#CAMEL_CASE_NAMING_CONVENTION}. If it's
-     *            {@link ParsingConfiguration#AUTO_DETECT_NAMING_CONVENTION} then the union
+     *            One of {@link NamingConvention#AUTO_DETECT},
+     *            {@link NamingConvention#LEGACY}, and
+     *            {@link NamingConvention#CAMEL_CASE}. If it's
+     *            {@link NamingConvention#AUTO_DETECT} then the union
      *            of the names in all the naming conventions is returned. 
      * 
      * @since 2.3.24
      */
-    public Set<String> getSupportedBuiltInDirectiveNames(int namingConvention) {
-        if (namingConvention == AUTO_DETECT_NAMING_CONVENTION) {
+    public Set<String> getSupportedBuiltInDirectiveNames(NamingConvention namingConvention) {
+        if (namingConvention == NamingConvention.AUTO_DETECT) {
             return ASTDirective.ALL_BUILT_IN_DIRECTIVE_NAMES;
-        } else if (namingConvention == LEGACY_NAMING_CONVENTION) {
+        } else if (namingConvention == NamingConvention.LEGACY) {
             return ASTDirective.LEGACY_BUILT_IN_DIRECTIVE_NAMES;
-        } else if (namingConvention == CAMEL_CASE_NAMING_CONVENTION) {
+        } else if (namingConvention == NamingConvention.CAMEL_CASE) {
             return ASTDirective.CAMEL_CASE_BUILT_IN_DIRECTIVE_NAMES;
         } else {
-            throw new IllegalArgumentException("Unsupported naming convention constant: " + namingConvention);
+            throw new BugException("Unsupported naming convention constant: " + namingConvention);
         }
     }
     
@@ -1732,11 +1722,11 @@ public final class Configuration
                     setWhitespaceStripping(_StringUtil.getYesNo(value));
                 } else if (AUTO_ESCAPING_POLICY_KEY_SNAKE_CASE.equals(name) || AUTO_ESCAPING_POLICY_KEY_CAMEL_CASE.equals(name)) {
                     if ("enable_if_default".equals(value) || "enableIfDefault".equals(value)) {
-                        setAutoEscapingPolicy(ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY);
+                        setAutoEscapingPolicy(AutoEscapingPolicy.ENABLE_IF_DEFAULT);
                     } else if ("enable_if_supported".equals(value) || "enableIfSupported".equals(value)) {
-                        setAutoEscapingPolicy(ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY);
+                        setAutoEscapingPolicy(AutoEscapingPolicy.ENABLE_IF_SUPPORTED);
                     } else if ("disable".equals(value)) {
-                        setAutoEscapingPolicy(DISABLE_AUTO_ESCAPING_POLICY);
+                        setAutoEscapingPolicy(AutoEscapingPolicy.DISABLE);
                     } else {
                         throw new ConfigurationSettingValueException( name, value,
                                 "No such predefined auto escaping policy name");
@@ -1860,21 +1850,21 @@ public final class Configuration
                     }
                 } else if (TAG_SYNTAX_KEY_SNAKE_CASE.equals(name) || TAG_SYNTAX_KEY_CAMEL_CASE.equals(name)) {
                     if ("auto_detect".equals(value) || "autoDetect".equals(value)) {
-                        setTagSyntax(AUTO_DETECT_TAG_SYNTAX);
+                        setTagSyntax(TagSyntax.AUTO_DETECT);
                     } else if ("angle_bracket".equals(value) || "angleBracket".equals(value)) {
-                        setTagSyntax(ANGLE_BRACKET_TAG_SYNTAX);
+                        setTagSyntax(TagSyntax.ANGLE_BRACKET);
                     } else if ("square_bracket".equals(value) || "squareBracket".equals(value)) {
-                        setTagSyntax(SQUARE_BRACKET_TAG_SYNTAX);
+                        setTagSyntax(TagSyntax.SQUARE_BRACKET);
                     } else {
                         throw new ConfigurationSettingValueException(name, value, "No such predefined tag syntax name");
                     }
                 } else if (NAMING_CONVENTION_KEY_SNAKE_CASE.equals(name) || NAMING_CONVENTION_KEY_CAMEL_CASE.equals(name)) {
                     if ("auto_detect".equals(value) || "autoDetect".equals(value)) {
-                        setNamingConvention(AUTO_DETECT_NAMING_CONVENTION);
+                        setNamingConvention(NamingConvention.AUTO_DETECT);
                     } else if ("legacy".equals(value)) {
-                        setNamingConvention(LEGACY_NAMING_CONVENTION);
+                        setNamingConvention(NamingConvention.LEGACY);
                     } else if ("camel_case".equals(value) || "camelCase".equals(value)) {
-                        setNamingConvention(CAMEL_CASE_NAMING_CONVENTION);
+                        setNamingConvention(NamingConvention.CAMEL_CASE);
                     } else {
                         throw new ConfigurationSettingValueException(name, value,
                                 "No such predefined naming convention name.");
@@ -2339,8 +2329,8 @@ public final class Configuration
         }
 
         @Override
-        protected int getDefaultTagSyntax() {
-            return ANGLE_BRACKET_TAG_SYNTAX;
+        protected TagSyntax getDefaultTagSyntax() {
+            return TagSyntax.ANGLE_BRACKET;
         }
 
         @Override
@@ -2349,8 +2339,8 @@ public final class Configuration
         }
 
         @Override
-        protected int getDefaultNamingConvention() {
-            return AUTO_DETECT_NAMING_CONVENTION;
+        protected NamingConvention getDefaultNamingConvention() {
+            return NamingConvention.AUTO_DETECT;
         }
 
         @Override
@@ -2413,8 +2403,8 @@ public final class Configuration
         }
 
         @Override
-        protected int getDefaultAutoEscapingPolicy() {
-            return ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY;
+        protected AutoEscapingPolicy getDefaultAutoEscapingPolicy() {
+            return AutoEscapingPolicy.ENABLE_IF_DEFAULT;
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/MutableParsingAndProcessingConfiguration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/MutableParsingAndProcessingConfiguration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/MutableParsingAndProcessingConfiguration.java
index 00a387d..a053d92 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/MutableParsingAndProcessingConfiguration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/MutableParsingAndProcessingConfiguration.java
@@ -33,10 +33,10 @@ public abstract class MutableParsingAndProcessingConfiguration<
         implements ParsingAndProcessingConfiguration {
 
     private TemplateLanguage templateLanguage;
-    private Integer tagSyntax;
-    private Integer namingConvention;
+    private TagSyntax tagSyntax;
+    private NamingConvention namingConvention;
     private Boolean whitespaceStripping;
-    private Integer autoEscapingPolicy;
+    private AutoEscapingPolicy autoEscapingPolicy;
     private Boolean recognizeStandardFileExtensions;
     private OutputFormat outputFormat;
     private Charset sourceEncoding;
@@ -48,28 +48,19 @@ public abstract class MutableParsingAndProcessingConfiguration<
 
     /**
      * Setter pair of {@link #getTagSyntax()}.
+     *
+     * @param tagSyntax
+     *         Can't be {@code null}
      */
-    public void setTagSyntax(int tagSyntax) {
-        valideTagSyntaxValue(tagSyntax);
+    public void setTagSyntax(TagSyntax tagSyntax) {
+        _NullArgumentException.check("tagSyntax", tagSyntax);
         this.tagSyntax = tagSyntax;
     }
 
-    // [FM3] Use enum; won't be needed
-    static void valideTagSyntaxValue(int tagSyntax) {
-        if (tagSyntax != ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX
-                && tagSyntax != ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX
-                && tagSyntax != ParsingConfiguration.ANGLE_BRACKET_TAG_SYNTAX) {
-            throw new IllegalArgumentException(
-                    "\"tagSyntax\" can only be set to one of these: "
-                    + "Configuration.AUTO_DETECT_TAG_SYNTAX, Configuration.ANGLE_BRACKET_SYNTAX, "
-                    + "or Configuration.SQUARE_BRACKET_SYNTAX");
-        }
-    }
-
     /**
-     * Fluent API equivalent of {@link #tagSyntax(int)}
+     * Fluent API equivalent of {@link #tagSyntax(TagSyntax)}
      */
-    public SelfT tagSyntax(int tagSyntax) {
+    public SelfT tagSyntax(TagSyntax tagSyntax) {
         setTagSyntax(tagSyntax);
         return self();
     }
@@ -83,7 +74,7 @@ public abstract class MutableParsingAndProcessingConfiguration<
     }
 
     @Override
-    public int getTagSyntax() {
+    public TagSyntax getTagSyntax() {
         return isTagSyntaxSet() ? tagSyntax : getDefaultTagSyntax();
     }
 
@@ -91,7 +82,7 @@ public abstract class MutableParsingAndProcessingConfiguration<
      * Returns the value the getter method returns when the setting is not set, possibly by inheriting the setting value
      * from another {@link ParsingConfiguration}, or throws {@link SettingValueNotSetException}.
      */
-    protected abstract int getDefaultTagSyntax();
+    protected abstract TagSyntax getDefaultTagSyntax();
 
     @Override
     public boolean isTagSyntaxSet() {
@@ -140,16 +131,19 @@ public abstract class MutableParsingAndProcessingConfiguration<
 
     /**
      * Setter pair of {@link #getNamingConvention()}.
+     *
+     * @param namingConvention
+     *         Can't be {@code null}
      */
-    public void setNamingConvention(int namingConvention) {
-        Configuration.validateNamingConventionValue(namingConvention);
+    public void setNamingConvention(NamingConvention namingConvention) {
+        _NullArgumentException.check("namingConvention", namingConvention);
         this.namingConvention = namingConvention;
     }
 
     /**
-     * Fluent API equivalent of {@link #setNamingConvention(int)}
+     * Fluent API equivalent of {@link #setNamingConvention(NamingConvention)}
      */
-    public SelfT namingConvention(int namingConvention) {
+    public SelfT namingConvention(NamingConvention namingConvention) {
         setNamingConvention(namingConvention);
         return self();
     }
@@ -163,10 +157,10 @@ public abstract class MutableParsingAndProcessingConfiguration<
     }
 
     /**
-     * The getter pair of {@link #setNamingConvention(int)}.
+     * The getter pair of {@link #setNamingConvention(NamingConvention)}.
      */
     @Override
-    public int getNamingConvention() {
+    public NamingConvention getNamingConvention() {
          return isNamingConventionSet() ? namingConvention
                 : getDefaultNamingConvention();
     }
@@ -175,7 +169,7 @@ public abstract class MutableParsingAndProcessingConfiguration<
      * Returns the value the getter method returns when the setting is not set, possibly by inheriting the setting value
      * from another {@link ParsingConfiguration}, or throws {@link SettingValueNotSetException}.
      */
-    protected abstract int getDefaultNamingConvention();
+    protected abstract NamingConvention getDefaultNamingConvention();
 
     /**
      * Tells if this setting is set directly in this object or its value is inherited from the parent parsing configuration..
@@ -233,28 +227,15 @@ public abstract class MutableParsingAndProcessingConfiguration<
     /**
      * * Setter pair of {@link #getAutoEscapingPolicy()}.
      */
-    public void setAutoEscapingPolicy(int autoEscapingPolicy) {
-        validateAutoEscapingPolicyValue(autoEscapingPolicy);
+    public void setAutoEscapingPolicy(AutoEscapingPolicy autoEscapingPolicy) {
+        _NullArgumentException.check("autoEscapingPolicy", autoEscapingPolicy);
         this.autoEscapingPolicy = autoEscapingPolicy;
     }
 
-    // [FM3] Use enum; won't be needed
-    static void validateAutoEscapingPolicyValue(int autoEscapingPolicy) {
-        if (autoEscapingPolicy != ParsingConfiguration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY
-                && autoEscapingPolicy != ParsingConfiguration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY
-                && autoEscapingPolicy != ParsingConfiguration.DISABLE_AUTO_ESCAPING_POLICY) {
-            throw new IllegalArgumentException(
-                    "\"tagSyntax\" can only be set to one of these: "
-                            + "Configuration.ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY,"
-                            + "Configuration.ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY, "
-                            + "or Configuration.DISABLE_AUTO_ESCAPING_POLICY");
-        }
-    }
-
     /**
-     * Fluent API equivalent of {@link #setAutoEscapingPolicy(int)}
+     * Fluent API equivalent of {@link #setAutoEscapingPolicy(AutoEscapingPolicy)}
      */
-    public SelfT autoEscapingPolicy(int autoEscapingPolicy) {
+    public SelfT autoEscapingPolicy(AutoEscapingPolicy autoEscapingPolicy) {
         setAutoEscapingPolicy(autoEscapingPolicy);
         return self();
     }
@@ -268,10 +249,10 @@ public abstract class MutableParsingAndProcessingConfiguration<
     }
 
     /**
-     * The getter pair of {@link #setAutoEscapingPolicy(int)}.
+     * The getter pair of {@link #setAutoEscapingPolicy(AutoEscapingPolicy)}.
      */
     @Override
-    public int getAutoEscapingPolicy() {
+    public AutoEscapingPolicy getAutoEscapingPolicy() {
          return isAutoEscapingPolicySet() ? autoEscapingPolicy : getDefaultAutoEscapingPolicy();
     }
 
@@ -279,7 +260,7 @@ public abstract class MutableParsingAndProcessingConfiguration<
      * Returns the value the getter method returns when the setting is not set, possibly by inheriting the setting value
      * from another {@link ParsingConfiguration}, or throws {@link SettingValueNotSetException}.
      */
-    protected abstract int getDefaultAutoEscapingPolicy();
+    protected abstract AutoEscapingPolicy getDefaultAutoEscapingPolicy();
 
     /**
      * Tells if this setting is set directly in this object or its value is inherited from the parent parsing configuration..

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/MutableProcessingConfiguration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/MutableProcessingConfiguration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/MutableProcessingConfiguration.java
index c5c4c82..6fc904f 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/MutableProcessingConfiguration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/MutableProcessingConfiguration.java
@@ -1636,10 +1636,10 @@ public abstract class MutableProcessingConfiguration<SelfT extends MutableProces
      *   <li><p>{@code "auto_escaping"}:
      *       See {@link Configuration#getAutoEscapingPolicy()}
      *       <br>String value: {@code "enable_if_default"} or {@code "enableIfDefault"} for
-     *       {@link ParsingConfiguration#ENABLE_IF_DEFAULT_AUTO_ESCAPING_POLICY},
+     *       {@link AutoEscapingPolicy#ENABLE_IF_DEFAULT},
      *       {@code "enable_if_supported"} or {@code "enableIfSupported"} for
-     *       {@link ParsingConfiguration#ENABLE_IF_SUPPORTED_AUTO_ESCAPING_POLICY}
-     *       {@code "disable"} for {@link ParsingConfiguration#DISABLE_AUTO_ESCAPING_POLICY}.
+     *       {@link AutoEscapingPolicy#ENABLE_IF_SUPPORTED}
+     *       {@code "disable"} for {@link AutoEscapingPolicy#DISABLE}.
      *       
      *   <li><p>{@code "sourceEncoding"}:
      *       See {@link Configuration#getSourceEncoding()}; since 2.3.26 also accepts value "JVM default"
@@ -1796,7 +1796,7 @@ public abstract class MutableProcessingConfiguration<SelfT extends MutableProces
      *            The keys and values can be any kind of expression, like even object builder expressions.
      *            The resulting Java object will be a {@link Map} that keeps the item order ({@link LinkedHashMap} as
      *            of this writing).
-     *        <li>A reference to a public static filed, like {@code Configuration.AUTO_DETECT_TAG_SYNTAX} or
+     *        <li>A reference to a public static filed, like {@code Configuration.AUTO_DETECT} or
      *            {@code com.example.MyClass.MY_CONSTANT}.
      *        <li>An object builder expression. That is, object builder expressions can be nested into each other. 
      *      </ul>
@@ -1815,7 +1815,8 @@ public abstract class MutableProcessingConfiguration<SelfT extends MutableProces
      *     {@link AndMatcher}, {@link OrMatcher}, {@link NotMatcher}, {@link ConditionalTemplateConfigurationFactory},
      *     {@link MergingTemplateConfigurationFactory}, {@link FirstMatchTemplateConfigurationFactory},
      *     {@link HTMLOutputFormat}, {@link XMLOutputFormat}, {@link RTFOutputFormat}, {@link PlainTextOutputFormat},
-     *     {@link UndefinedOutputFormat}, {@link Configuration}, {@link TemplateLanguage}.
+     *     {@link UndefinedOutputFormat}, {@link Configuration}, {@link TemplateLanguage}, {@link NamingConvention},
+     *     {@link TagSyntax}.
      *   </li>
      *   <li>
      *     <p>{@link TimeZone} objects can be created like {@code TimeZone("UTC")}, despite that there's no a such

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/NamingConvention.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NamingConvention.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NamingConvention.java
new file mode 100644
index 0000000..5c347c5
--- /dev/null
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NamingConvention.java
@@ -0,0 +1,29 @@
+/*
+ * 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 org.apache.freemarker.core;
+
+/**
+ * Used as the value of the {@link ParsingConfiguration#getNamingConvention()} namingConvention} setting.
+ */
+public enum NamingConvention  {
+    AUTO_DETECT,
+    LEGACY,
+    CAMEL_CASE;
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99ac6973/freemarker-core/src/main/java/org/apache/freemarker/core/OutputFormatBoundBuiltIn.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/OutputFormatBoundBuiltIn.java b/freemarker-core/src/main/java/org/apache/freemarker/core/OutputFormatBoundBuiltIn.java
index c67f2c0..4193ca6 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/OutputFormatBoundBuiltIn.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/OutputFormatBoundBuiltIn.java
@@ -25,9 +25,9 @@ import org.apache.freemarker.core.util._NullArgumentException;
 abstract class OutputFormatBoundBuiltIn extends SpecialBuiltIn {
     
     protected OutputFormat outputFormat;
-    protected int autoEscapingPolicy;
+    protected AutoEscapingPolicy autoEscapingPolicy;
     
-    void bindToOutputFormat(OutputFormat outputFormat, int autoEscapingPolicy) {
+    void bindToOutputFormat(OutputFormat outputFormat, AutoEscapingPolicy autoEscapingPolicy) {
         _NullArgumentException.check(outputFormat);
         this.outputFormat = outputFormat;
         this.autoEscapingPolicy = autoEscapingPolicy;