Some Javadoc improvements related to incompatible_improvements and the object_wrapper setting
diff --git a/freemarker-core/src/main/java/freemarker/core/Configurable.java b/freemarker-core/src/main/java/freemarker/core/Configurable.java
index 6eaf8ed..63b7e85 100644
--- a/freemarker-core/src/main/java/freemarker/core/Configurable.java
+++ b/freemarker-core/src/main/java/freemarker/core/Configurable.java
@@ -1460,8 +1460,20 @@
}
/**
- * Sets the object wrapper used to wrap objects to {@link TemplateModel}-s.
- * The default is {@link ObjectWrapper#DEFAULT_WRAPPER}.
+ * Sets the {@link ObjectWrapper} used to wrap objects to {@link TemplateModel}-s when using this
+ * {@link Configurable}.
+ *
+ * <p>On {@link Configuration} level, the default is a {@link DefaultObjectWrapper} instance with the same
+ * {@link Configuration#setIncompatibleImprovements incompatible_improvements} setting value as of the
+ * {@link Configuration}. (Also, with very low incompatible improvements it's
+ * {@link ObjectWrapper#DEFAULT_WRAPPER}.). Untill you called this method, the default value will be
+ * automatically replaced when {@link Configuration#setIncompatibleImprovements(Version)} is called, to follow
+ * the value of the {@code incompatible_improvements} setting.
+ *
+ * <p>Below {@link Configuration} level it's usually unset, so we fall back to
+ * what's coming from {@link Configuration}.
+ *
+ * @param objectWrapper Not null.
*/
public void setObjectWrapper(ObjectWrapper objectWrapper) {
NullArgumentException.check("objectWrapper", objectWrapper);
diff --git a/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java
index 0e20266..3962bf9 100644
--- a/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java
+++ b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java
@@ -226,10 +226,13 @@
* the application, but again, see the list of effects below.
*
* <p>The reason it's separate from {@link Configuration#setIncompatibleImprovements(Version)} is that
- * {@link ObjectWrapper} objects are often shared among multiple {@link Configuration}-s, so the two version
- * numbers are technically independent. But it's recommended to keep those two version numbers the same.
- *
- * <p>The changes enabled by {@code incompatibleImprovements} are:
+ * {@link ObjectWrapper} objects are sometimes shared among multiple {@link Configuration}-s, so the two version
+ * numbers are technically independent. But it's recommended to keep those two version numbers the same. Actually,
+ * if you leave the {@link Configuration#setObjectWrapper(ObjectWrapper) object_wrapper} setting at its default
+ * (and most do), then that will be kept the same as of the {@link Configuration}.
+ *
+ * <p>The changes enabled by {@code incompatibleImprovements} are (but also check the changes at
+ * {@link DefaultObjectWrapper#DefaultObjectWrapper(Version)}, if you are using {@link DefaultObjectWrapper}):
* <ul>
* <li>
* <p>2.3.0: No changes; this is the starting point, the version used in older projects.
@@ -268,7 +271,7 @@
* <p>2.3.33 (or higher):
* The default of {@link BeansWrapper#setRecordZeroArgumentNonVoidMethodPolicy(ZeroArgumentNonVoidMethodPolicy)}
* has changed to {@link ZeroArgumentNonVoidMethodPolicy#BOTH_PROPERTY_AND_METHOD}, from
- * {@link ZeroArgumentNonVoidMethodPolicy#METHOD_ONLY}. This means that Java records public methods with
+ * {@link ZeroArgumentNonVoidMethodPolicy#METHOD_ONLY}. This means that Java record public methods with
* 0-arguments and non-void return type are now exposed both as properties, and as methods, while earlier they
* were only exposed as methods. That is, if in a record you have {@code public String name()}, now in
* templates the value can be accessed both as {@code obj.name} (like a property), and as {@code obj.name()}
@@ -280,6 +283,10 @@
* {@link BeansWrapper} improvements were already present, so {@link #getIncompatibleImprovements()} might return
* a lower version than what you have specified.
*
+ * <p>Note again that most projects use {@link DefaultObjectWrapper} (which extends {@link BeansWrapper}), in
+ * which case see the additional changes at {@link DefaultObjectWrapper#DefaultObjectWrapper(Version)}!
+ * </p>
+ *
* @since 2.3.21
*/
public BeansWrapper(Version incompatibleImprovements) {
diff --git a/freemarker-core/src/main/java/freemarker/template/Configuration.java b/freemarker-core/src/main/java/freemarker/template/Configuration.java
index 97a22cb..d08f815 100644
--- a/freemarker-core/src/main/java/freemarker/template/Configuration.java
+++ b/freemarker-core/src/main/java/freemarker/template/Configuration.java
@@ -619,9 +619,9 @@
* <p>Bugfixes and improvements that are fully backward compatible, also those that are important security fixes,
* are enabled regardless of the incompatible improvements setting.
*
- * <p>Do NOT ever use {@link #getVersion()} to set the "incompatible improvements". Always use a fixed value, like
- * {@link #VERSION_2_3_30}. Otherwise your application can break as you upgrade FreeMarker. (As of 2.3.30, doing
- * this will be logged as an error. As of 2.4.0, it will be probably disallowed, by throwing exception.)
+ * <p><b>Do NOT ever use {@link #getVersion()} to set the "incompatible improvements". Always use a fixed value</b>,
+ * like {@link #VERSION_2_3_33}. Otherwise, your application can break as you upgrade FreeMarker. (As of 2.3.30,
+ * doing this will be logged as an error. As of 2.4.0, it will be probably disallowed, by throwing exception.)
*
* <p>An important consequence of setting this setting is that now your application will check if the stated minimum
* FreeMarker version requirement is met. Like if you set this setting to 2.3.22, but accidentally the application
@@ -630,7 +630,12 @@
*
* <p>Note that as FreeMarker's minor (2nd) or major (1st) version number increments, it's possible that emulating
* some of the old bugs will become unsupported, that is, even if you set this setting to a low value, it silently
- * wont bring back the old behavior anymore. Information about that will be present here.
+ * won't bring back the old behavior anymore. Information about that will be present here.
+ *
+ * <p>Note that {@link DefaultObjectWrapper} (and {@link BeansWrapper}, which it extends) has its own "incompatible
+ * improvements" setting (see {@link DefaultObjectWrapper#DefaultObjectWrapper(Version)}), but if you leave the
+ * {@link #setObjectWrapper(ObjectWrapper) object_wrapper} setting at its default (and most do), then that will be
+ * kept the same as of the {@link Configuration}.
*
* <p>Currently the effects of this setting are:
* <ul>
@@ -892,16 +897,16 @@
* 2.3.26 (or higher):
* <ul>
* <li><p>
- * {@link BeansWrapper} and {@link DefaultObjectWrapper} now exposes Java 8 default methods (and the bean
- * properties they define); see {@link BeansWrapper#BeansWrapper(Version)}.
+ * The default {@link Configuration#setObjectWrapper(ObjectWrapper) object_wrapper} now exposes Java
+ * 8 default methods (and the bean properties they define); see {@link BeansWrapper#BeansWrapper(Version)}.
* </ul>
* </li>
* <li><p>
* 2.3.27 (or higher):
* <ul>
* <li><p>
- * {@link BeansWrapper} and {@link DefaultObjectWrapper} now prefers the non-indexed JavaBean property
- * read method over the indexed read method when Java 8 exposes both;
+ * The default {@link Configuration#setObjectWrapper(ObjectWrapper) object_wrapper} now prefers the
+ * non-indexed JavaBean property read method over the indexed read method when Java 8 exposes both;
* see {@link BeansWrapper#BeansWrapper(Version)}.
* <li><p>
* The following unchecked exceptions (but not their subclasses) will be wrapped into
@@ -978,7 +983,7 @@
* <p>
* 2.3.33 (or higher):
* <ul>
- * <li><p>Comparing strings is now way faster. If your template does lot of string comparisons, this can
+ * <li><p>Comparing strings is now way faster. If your template does lot of string comparisons, this can
* mean very significant speedup. We now use a simpler way of comparing strings, and because templates
* were only ever allowed equality comparisons between strings (not less-than, or greater-than), it's very
* unlikely to change the behavior of your templates. (Technically, what changes is that instead of using
@@ -986,7 +991,11 @@
* normalization. So, in theory it's possible that for some locales two different but similarly looking
* characters were treated as equal by the collator, but will count as different now. But it's very
* unlikely that anyone wanted to depend on such fragile logic anyway. Note again that we still do UNICODE
- * normalization, so combining characters won't break your comparison.)</p></li>
+ * normalization, so combining characters won't break your comparisons.)</p></li>
+ * <li><p>
+ * The default {@link Configuration#setObjectWrapper(ObjectWrapper) object_wrapper} now exposes Java
+ * records public methods with 0-arguments and non-void return type are now exposed both as properties,
+ * and as methods; see {@link BeansWrapper#BeansWrapper(Version)}.
* </ul>
* </li>
* </ul>
@@ -1991,8 +2000,8 @@
/**
* Use {@link #Configuration(Version)} instead if possible; see the meaning of the parameter there.
*
- * <p>Do NOT ever use {@link #getVersion()} to set the "incompatible improvements". Always use a fixed value, like
- * {@link #VERSION_2_3_30}. Otherwise your application can break as you upgrade FreeMarker. (As of 2.3.30, doing
+ * <p><b>Do NOT ever use {@link #getVersion()} to set the "incompatible improvements"! Always use a fixed value</b>,
+ * like {@link #VERSION_2_3_30}. Otherwise, your application can break as you upgrade FreeMarker. (As of 2.3.30, doing
* this will be logged as an error. As of 2.4.0, it will be probably disallowed, by throwing exception.)
*
* <p>If the default value of a setting depends on the {@code incompatibleImprovements} and the value of that setting