Test and version history entry for edge case when one of the read methods of a bean property is inaccessible, and the other (indexed VS non-indexed) is accessible.
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/03106619 Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/03106619 Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/03106619 Branch: refs/heads/2.3 Commit: 03106619036c0f427a5838b4e795f139fdf30703 Parents: f09918d Author: ddekany <[email protected]> Authored: Sun Oct 15 21:31:10 2017 +0200 Committer: ddekany <[email protected]> Committed: Sun Oct 15 21:51:45 2017 +0200 ---------------------------------------------------------------------- src/manual/en_US/book.xml | 16 +++++++ .../ext/beans/BeansWrapperMiscTest.java | 48 ++++++++++++++++++++ 2 files changed, 64 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/03106619/src/manual/en_US/book.xml ---------------------------------------------------------------------- diff --git a/src/manual/en_US/book.xml b/src/manual/en_US/book.xml index 421a14a..a66096e 100644 --- a/src/manual/en_US/book.xml +++ b/src/manual/en_US/book.xml @@ -27249,6 +27249,22 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> </listitem> <listitem> + <para>Bug fixed (affects Java 8 and later): Regardless of the + value of the <literal>preferIndexedReadMethod</literal> setting + (see previous point), if one of the indexed read method and the + non-indexed read method is inaccessible (i.e., it's declared in + a non-public type, and wasn't inherited by a public type), while + the other read method is accessible, we will use the accessible + one. Earlier, if there was an indexed read method but it was + inaccessible, we have given up, and that bean property wasn't + visible. Such properties will now be visible again, just as + before Java 8. (Before Java 8 + <literal>java.beans.Inrospector</literal> has only exposed the + non-indexed read method in this case, so we didn't have this + problem.)</para> + </listitem> + + <listitem> <para>Bug fixed: On OpenJDK 9 (but not on earlier versions, nor on Oracle Java 9 (tested with <quote>build 9+181</quote>)), when you try to use the DOM-based XML support http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/03106619/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java b/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java index 917b2b3..c3ff772 100644 --- a/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java +++ b/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java @@ -22,12 +22,14 @@ package freemarker.ext.beans; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import java.lang.reflect.Modifier; import java.util.Collections; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import freemarker.core._JavaVersions; import freemarker.template.Configuration; import freemarker.template.TemplateBooleanModel; import freemarker.template.TemplateHashModel; @@ -36,6 +38,7 @@ import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import freemarker.template.TemplateScalarModel; import freemarker.template.TemplateSequenceModel; +import freemarker.template.Version; import freemarker.template.utility.Constants; @RunWith(JUnit4.class) @@ -95,6 +98,27 @@ public class BeansWrapperMiscTest { assertEquals(2, ((TemplateSequenceModel) fooTM).size()); } } + + @Test + public void java8InaccessibleIndexedAccessibleNonIndexedReadMethodTest() throws TemplateModelException { + assertTrue("This test case must be ran on Java 8 or later", _JavaVersions.JAVA_8 != null); + assertFalse(Modifier.isPublic(BeanWithInaccessibleIndexedProperty.class.getModifiers())); + + for (Version ici : new Version[] { Configuration.VERSION_2_3_26, Configuration.VERSION_2_3_27 }) { + BeansWrapper bw = new BeansWrapper(ici); + TemplateHashModel beanTM = (TemplateHashModel) bw.wrap(new BeanWithInaccessibleIndexedProperty()); + TemplateModel fooTM = beanTM.get("foo"); + + assertThat(fooTM, instanceOf(TemplateSequenceModel.class)); + assertEquals("b", + ((TemplateScalarModel) ((TemplateSequenceModel) fooTM).get(1)).getAsString()); + // Even with 2.3.26, where the indexed reader was preferred, as it's inaccessible, we use the normal reader: + assertEquals(2, ((TemplateSequenceModel) fooTM).size()); + + TemplateModel barTM = beanTM.get("bar"); + assertNull(barTM); // all read methods inaccessible + } + } public static class BeanWithBothIndexedAndArrayProperty { @@ -110,4 +134,28 @@ public class BeansWrapperMiscTest { } + public interface HasFoo { + String[] getFoo(); + } + + // Note: This class is deliberately not public + static class BeanWithInaccessibleIndexedProperty implements HasFoo { + + private final static String[] FOO = new String[] { "a", "b" }; + + public String getFoo(int index) { + return FOO[index]; + } + + // This will be accessible + public String[] getFoo() { + return FOO; + } + + public String getBar(int index) { + return FOO[index]; + } + + } + }
