This is an automated email from the ASF dual-hosted git repository. ddekany pushed a commit to branch 2.3-gae in repository https://gitbox.apache.org/repos/asf/freemarker.git
commit bf5e0b0a60f5cfe2a5c3ab350beb96b1da785a23 Author: ddekany <[email protected]> AuthorDate: Wed May 8 18:23:34 2024 +0200 Renamed some ZeroArgumentNonVoidMethodPolicy-es to reflect the meaning more precisely (on the expense of having really long enum names): - BOTH_PROPERTY_AND_METHOD to BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD - PROPERTY_ONLY to PROPERTY_ONLY_UNLESS_BEAN_PROPERTY_READ_METHOD This way it's now also true that the ZeroArgumentNonVoidMethodPolicy just specifies "How to show 0 argument non-void public methods to templates", as not all the exceptions related to Java Beans are described for the enum values. --- .../main/java/freemarker/core/DotBeforeMethodCall.java | 2 +- .../main/java/freemarker/ext/beans/BeansWrapper.java | 12 +++++++----- .../freemarker/ext/beans/ClassIntrospectorBuilder.java | 5 +++-- .../ext/beans/ZeroArgumentNonVoidMethodPolicy.java | 6 +++--- .../template/MethodCallAwareTemplateHashModel.java | 3 ++- .../ext/beans/TestZeroArgumentNonVoidMethodPolicy.java | 18 ++++++++++++------ freemarker-manual/src/main/docgen/en_US/book.xml | 10 +++++----- 7 files changed, 33 insertions(+), 23 deletions(-) diff --git a/freemarker-core/src/main/java/freemarker/core/DotBeforeMethodCall.java b/freemarker-core/src/main/java/freemarker/core/DotBeforeMethodCall.java index f40ebbd1..7fd3e1b7 100644 --- a/freemarker-core/src/main/java/freemarker/core/DotBeforeMethodCall.java +++ b/freemarker-core/src/main/java/freemarker/core/DotBeforeMethodCall.java @@ -30,7 +30,7 @@ import freemarker.template.TemplateModel; * Like {@link Dot}, but when used before method call (but as of 2.3.33, before 0-argument calls only), as in * {@code obj.key()}. The reason it's only used before 0-argument calls (as of 2.3.33 at least) is that it adds some * overhead, and this {@link Dot} subclass was added to implement - * {@link ZeroArgumentNonVoidMethodPolicy#BOTH_PROPERTY_AND_METHOD} + * {@link ZeroArgumentNonVoidMethodPolicy#BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD} * (via {@link BeansWrapper.MethodAppearanceDecision#setMethodInsteadOfPropertyValueBeforeCall(boolean)}). We don't * necessarily want to go beyond that hack, as we don't have separate method namespace in the template language. * 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 542ac9d3..2a7f9125 100644 --- a/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java +++ b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java @@ -266,7 +266,8 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable { * <li> * <p>2.3.33 (or higher): * The default of {@link BeansWrapper#setRecordZeroArgumentNonVoidMethodPolicy(ZeroArgumentNonVoidMethodPolicy)} - * has changed to {@link ZeroArgumentNonVoidMethodPolicy#BOTH_PROPERTY_AND_METHOD}, from + * has changed to + * {@link ZeroArgumentNonVoidMethodPolicy#BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD}, from * {@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 @@ -670,8 +671,9 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable { /** * Sets the {@link ZeroArgumentNonVoidMethodPolicy} for classes that are Java records; if the * {@code BeansWrapper#BeansWrapper(Version) incompatibleImprovements} of the object wrapper is at least 2.3.33, - * then this defaults to {@link ZeroArgumentNonVoidMethodPolicy#BOTH_PROPERTY_AND_METHOD}, otherwise this defaults - * to {@link ZeroArgumentNonVoidMethodPolicy#METHOD_ONLY}. + * then this defaults to + * {@link ZeroArgumentNonVoidMethodPolicy#BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD}, + * otherwise this defaults to {@link ZeroArgumentNonVoidMethodPolicy#METHOD_ONLY}. * * <p>Note that methods in this class are inherited by {@link DefaultObjectWrapper}, which is what you normally use. * @@ -1945,12 +1947,12 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable { throw new BugException("Failed to create PropertyDescriptor for " + m, e); } methodInsteadOfPropertyValueBeforeCall = appliedZeroArgumentNonVoidMethodPolicy == - ZeroArgumentNonVoidMethodPolicy.BOTH_PROPERTY_AND_METHOD; + ZeroArgumentNonVoidMethodPolicy.BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD; } else { exposeAsProperty = null; methodInsteadOfPropertyValueBeforeCall = false; } - exposeMethodAs = appliedZeroArgumentNonVoidMethodPolicy != ZeroArgumentNonVoidMethodPolicy.PROPERTY_ONLY + exposeMethodAs = appliedZeroArgumentNonVoidMethodPolicy != ZeroArgumentNonVoidMethodPolicy.PROPERTY_ONLY_UNLESS_BEAN_PROPERTY_READ_METHOD ? m.getName() : null; methodShadowsProperty = true; replaceExistingProperty = false; diff --git a/freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java index a966f08d..7ff87072 100644 --- a/freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java +++ b/freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java @@ -77,7 +77,7 @@ final class ClassIntrospectorBuilder implements Cloneable { treatDefaultMethodsAsBeanMembers = incompatibleImprovements.intValue() >= _VersionInts.V_2_3_26; defaultZeroArgumentNonVoidMethodPolicy = ZeroArgumentNonVoidMethodPolicy.METHOD_ONLY; recordZeroArgumentNonVoidMethodPolicy = incompatibleImprovements.intValue() >= _VersionInts.V_2_3_33 && _JavaVersions.JAVA_16 != null - ? ZeroArgumentNonVoidMethodPolicy.BOTH_PROPERTY_AND_METHOD + ? ZeroArgumentNonVoidMethodPolicy.BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD : defaultZeroArgumentNonVoidMethodPolicy; memberAccessPolicy = DefaultMemberAccessPolicy.getInstance(this.incompatibleImprovements); } @@ -198,7 +198,8 @@ final class ClassIntrospectorBuilder implements Cloneable { /** * Sets the {@link ZeroArgumentNonVoidMethodPolicy} used for records. - * The default value is {@link ZeroArgumentNonVoidMethodPolicy#BOTH_PROPERTY_AND_METHOD} if + * The default value is + * {@link ZeroArgumentNonVoidMethodPolicy#BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD} if * {@link #getIncompatibleImprovements()} is at least 2.3.33, and we are on Java 16 or later, otherwise * it's {@link ZeroArgumentNonVoidMethodPolicy#METHOD_ONLY}. * diff --git a/freemarker-core/src/main/java/freemarker/ext/beans/ZeroArgumentNonVoidMethodPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/ZeroArgumentNonVoidMethodPolicy.java index 187d5bc7..607857ce 100644 --- a/freemarker-core/src/main/java/freemarker/ext/beans/ZeroArgumentNonVoidMethodPolicy.java +++ b/freemarker-core/src/main/java/freemarker/ext/beans/ZeroArgumentNonVoidMethodPolicy.java @@ -65,7 +65,7 @@ public enum ZeroArgumentNonVoidMethodPolicy { * before FreeMarker was aware of records (and hence that those methods are like property read methods), the * only way that worked was {@code obj.something()}, so to be more backward compatible, we have to support both. */ - BOTH_PROPERTY_AND_METHOD, + BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD, /** * Only {@code obj.m()} gives back the value in a template, {@code obj.m} in a template just gives the method itself. @@ -75,7 +75,7 @@ public enum ZeroArgumentNonVoidMethodPolicy { /** * {@code obj.m} in a template gives back the value, and you can't get the method itself. But, it's not applicable * for Java Bean property read methods, which will remain normals methods, just like with - * {@link #BOTH_PROPERTY_AND_METHOD}. + * {@link #BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD}. */ - PROPERTY_ONLY + PROPERTY_ONLY_UNLESS_BEAN_PROPERTY_READ_METHOD } diff --git a/freemarker-core/src/main/java/freemarker/template/MethodCallAwareTemplateHashModel.java b/freemarker-core/src/main/java/freemarker/template/MethodCallAwareTemplateHashModel.java index bac40768..97173f36 100644 --- a/freemarker-core/src/main/java/freemarker/template/MethodCallAwareTemplateHashModel.java +++ b/freemarker-core/src/main/java/freemarker/template/MethodCallAwareTemplateHashModel.java @@ -47,7 +47,8 @@ import freemarker.template.utility.NullArgumentException; * operator will call {@link #getBeforeMethodCall(String) getBeforeMethodCall("someComponent")}, rather than * {@link #get(String) get("someComponent")}. This is needed to implement subtle features like * {@link BeansWrapper.MethodAppearanceDecision#setMethodInsteadOfPropertyValueBeforeCall(boolean)}, - * which is needed to implement {@link ZeroArgumentNonVoidMethodPolicy#BOTH_PROPERTY_AND_METHOD}. + * which is needed to implement + * {@link ZeroArgumentNonVoidMethodPolicy#BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD}. * * <p>While technically we could do the same for method calls with more the 0 arguments, as of 2.3.33 at least, we * don't want to generalize this to that case. This is a workaround we added to address the issue with accessing diff --git a/freemarker-core16/src/test/java/freemarker/ext/beans/TestZeroArgumentNonVoidMethodPolicy.java b/freemarker-core16/src/test/java/freemarker/ext/beans/TestZeroArgumentNonVoidMethodPolicy.java index ce61d01b..63f60482 100644 --- a/freemarker-core16/src/test/java/freemarker/ext/beans/TestZeroArgumentNonVoidMethodPolicy.java +++ b/freemarker-core16/src/test/java/freemarker/ext/beans/TestZeroArgumentNonVoidMethodPolicy.java @@ -75,7 +75,7 @@ public class TestZeroArgumentNonVoidMethodPolicy extends TemplateTest { () -> { DefaultObjectWrapper beansWrapper = new DefaultObjectWrapper(VERSION_2_3_32); beansWrapper.setRecordZeroArgumentNonVoidMethodPolicy( - ZeroArgumentNonVoidMethodPolicy.BOTH_PROPERTY_AND_METHOD); + ZeroArgumentNonVoidMethodPolicy.BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD); return beansWrapper; }, cacheTopLevelVars); @@ -90,7 +90,8 @@ public class TestZeroArgumentNonVoidMethodPolicy extends TemplateTest { setupDataModel( () -> { DefaultObjectWrapper beansWrapper = new DefaultObjectWrapper(VERSION_2_3_32); - beansWrapper.setRecordZeroArgumentNonVoidMethodPolicy(ZeroArgumentNonVoidMethodPolicy.PROPERTY_ONLY); + beansWrapper.setRecordZeroArgumentNonVoidMethodPolicy( + ZeroArgumentNonVoidMethodPolicy.PROPERTY_ONLY_UNLESS_BEAN_PROPERTY_READ_METHOD); return beansWrapper; }, cacheTopLevelVars); @@ -105,7 +106,8 @@ public class TestZeroArgumentNonVoidMethodPolicy extends TemplateTest { setupDataModel( () -> { DefaultObjectWrapper beansWrapper = new DefaultObjectWrapper(VERSION_2_3_33); - beansWrapper.setRecordZeroArgumentNonVoidMethodPolicy(ZeroArgumentNonVoidMethodPolicy.PROPERTY_ONLY); + beansWrapper.setRecordZeroArgumentNonVoidMethodPolicy( + ZeroArgumentNonVoidMethodPolicy.PROPERTY_ONLY_UNLESS_BEAN_PROPERTY_READ_METHOD); return beansWrapper; }, cacheTopLevelVars); @@ -120,7 +122,8 @@ public class TestZeroArgumentNonVoidMethodPolicy extends TemplateTest { setupDataModel( () -> { DefaultObjectWrapper beansWrapper = new DefaultObjectWrapper(VERSION_2_3_32); - beansWrapper.setDefaultZeroArgumentNonVoidMethodPolicy(ZeroArgumentNonVoidMethodPolicy.PROPERTY_ONLY); + beansWrapper.setDefaultZeroArgumentNonVoidMethodPolicy( + ZeroArgumentNonVoidMethodPolicy.PROPERTY_ONLY_UNLESS_BEAN_PROPERTY_READ_METHOD); return beansWrapper; }, cacheTopLevelVars); @@ -136,7 +139,7 @@ public class TestZeroArgumentNonVoidMethodPolicy extends TemplateTest { () -> { DefaultObjectWrapper beansWrapper = new DefaultObjectWrapper(VERSION_2_3_33); beansWrapper.setDefaultZeroArgumentNonVoidMethodPolicy( - ZeroArgumentNonVoidMethodPolicy.BOTH_PROPERTY_AND_METHOD); + ZeroArgumentNonVoidMethodPolicy.BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD); return beansWrapper; }, cacheTopLevelVars); @@ -149,7 +152,10 @@ public class TestZeroArgumentNonVoidMethodPolicy extends TemplateTest { public void testSettings() throws TemplateException, IOException { getConfiguration().setSetting( "objectWrapper", - "DefaultObjectWrapper(2.3.33, defaultZeroArgumentNonVoidMethodPolicy=freemarker.ext.beans.ZeroArgumentNonVoidMethodPolicy.BOTH_PROPERTY_AND_METHOD)"); + "DefaultObjectWrapper(2.3.33, " + + "defaultZeroArgumentNonVoidMethodPolicy=" + + "freemarker.ext.beans.ZeroArgumentNonVoidMethodPolicy" + + ".BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD)"); setupDataModel(() -> getConfiguration().getObjectWrapper(), false); assertRecIsBothPropertyAndMethod(); assertNrcIsBothPropertyAndMethod(); diff --git a/freemarker-manual/src/main/docgen/en_US/book.xml b/freemarker-manual/src/main/docgen/en_US/book.xml index 918c9a8d..9e55a3d0 100644 --- a/freemarker-manual/src/main/docgen/en_US/book.xml +++ b/freemarker-manual/src/main/docgen/en_US/book.xml @@ -30269,7 +30269,7 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> <literal>ObjectWrapper</literal>, then set its <literal>incompatible_improvements</literal>, or just its <literal>recordZeroArgumentNonVoidMethodPolicy</literal> - property to <literal>BOTH_PROPERTY_AND_METHOD</literal>). If in + property to <literal>BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD</literal>). If in a Java record you have something like <literal>int price()</literal>, earlier you could only read the value in templates as <literal>obj.price()</literal>. With this @@ -30305,8 +30305,8 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> Each has enum type <literal>freemarker.ext.beans.ZeroArgumentNonVoidMethodPolicy</literal>, that can be <literal>METHOD_ONLY</literal>, - <literal>PROPERTY_ONLY</literal>, or - <literal>BOTH_PROPERTY_AND_METHOD</literal>. + <literal>PROPERTY_ONLY_UNLESS_BEAN_PROPERTY_READ_METHOD</literal>, or + <literal>BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD</literal>. Therefore:</para> <itemizedlist> @@ -30324,7 +30324,7 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> <para>For records, you can enforce proper style with setting <literal>recordZeroArgumentNonVoidMethodPolicy</literal> - to <literal>PROPERTY_ONLY</literal>. The default with + to <literal>PROPERTY_ONLY_UNLESS_BEAN_PROPERTY_READ_METHOD</literal>. The default with <literal>incompatible_improvements</literal> 2.3.33 is more lenient, as there using <literal>()</literal> is allowed (for backward compatibility, and because people @@ -30345,7 +30345,7 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> instead of <literal>TemplateHashModel.get("price")</literal>. This is needed for - <literal>ZeroArgumentNonVoidMethodPolicy.BOTH_PROPERTY_AND_METHOD</literal> + <literal>ZeroArgumentNonVoidMethodPolicy.BOTH_METHOD_AND_PROPERTY_UNLESS_BEAN_PROPERTY_READ_METHOD</literal> to work.</para> </listitem>
