Repository: incubator-freemarker Updated Branches: refs/heads/3 f2f2bf056 -> c6f83ebf6
Forward ported from 2.3-gae: DefaultIteratorAdapter now supports ?api. It was an oversight that it didn't. Also, added ?api support to the recently added DefaultEnumerationAdapter too. Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/c6f83ebf Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/c6f83ebf Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/c6f83ebf Branch: refs/heads/3 Commit: c6f83ebf67b6c6bde94ecc57d0c728a4030b0c8c Parents: f2f2bf0 Author: ddekany <[email protected]> Authored: Sun Mar 12 16:03:37 2017 +0100 Committer: ddekany <[email protected]> Committed: Sun Mar 12 16:03:37 2017 +0100 ---------------------------------------------------------------------- .../model/impl/DefaultEnumerationAdapter.java | 9 ++++++++- .../core/model/impl/DefaultIteratorAdapter.java | 9 ++++++++- .../model/impl/DefaultObjectWrapperTest.java | 20 +++++++++++++++++--- 3 files changed, 33 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c6f83ebf/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java b/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java index d56e635..d5b6989 100644 --- a/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java +++ b/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java @@ -25,10 +25,12 @@ import java.util.Iterator; import org.apache.freemarker.core.model.AdapterTemplateModel; import org.apache.freemarker.core.model.ObjectWrapper; +import org.apache.freemarker.core.model.ObjectWrapperWithAPISupport; import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.TemplateModelIterator; +import org.apache.freemarker.core.model.TemplateModelWithAPISupport; import org.apache.freemarker.core.model.WrapperTemplateModel; import org.apache.freemarker.core.model.WrappingTemplateModel; @@ -41,7 +43,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; */ @SuppressWarnings("serial") public class DefaultEnumerationAdapter extends WrappingTemplateModel implements TemplateCollectionModel, - AdapterTemplateModel, WrapperTemplateModel, Serializable { + AdapterTemplateModel, WrapperTemplateModel, TemplateModelWithAPISupport, Serializable { @SuppressFBWarnings(value="SE_BAD_FIELD", justification="We hope it's Seralizable") private final Enumeration<?> enumeration; @@ -77,6 +79,11 @@ public class DefaultEnumerationAdapter extends WrappingTemplateModel implements return new SimpleTemplateModelIterator(); } + @Override + public TemplateModel getAPI() throws TemplateModelException { + return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(enumeration); + } + /** * Not thread-safe. */ http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c6f83ebf/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java b/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java index b72be28..60d9243 100644 --- a/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java +++ b/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java @@ -24,10 +24,12 @@ import java.util.Iterator; import org.apache.freemarker.core.model.AdapterTemplateModel; import org.apache.freemarker.core.model.ObjectWrapper; +import org.apache.freemarker.core.model.ObjectWrapperWithAPISupport; import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.TemplateModelIterator; +import org.apache.freemarker.core.model.TemplateModelWithAPISupport; import org.apache.freemarker.core.model.WrapperTemplateModel; import org.apache.freemarker.core.model.WrappingTemplateModel; @@ -51,7 +53,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; * @since 2.3.22 */ public class DefaultIteratorAdapter extends WrappingTemplateModel implements TemplateCollectionModel, - AdapterTemplateModel, WrapperTemplateModel, Serializable { + AdapterTemplateModel, WrapperTemplateModel, TemplateModelWithAPISupport, Serializable { @SuppressFBWarnings(value="SE_BAD_FIELD", justification="We hope it's Seralizable") private final Iterator iterator; @@ -87,6 +89,11 @@ public class DefaultIteratorAdapter extends WrappingTemplateModel implements Tem return new SimpleTemplateModelIterator(); } + @Override + public TemplateModel getAPI() throws TemplateModelException { + return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(iterator); + } + /** * Not thread-safe. */ http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c6f83ebf/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java b/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java index 26857b2..38076a1 100644 --- a/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java +++ b/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java @@ -591,7 +591,18 @@ public class DefaultObjectWrapperTest { assertThat(e.getMessage(), containsString("can be listed only once")); } } - + + @Test + public void testIteratorApiSupport() throws TemplateModelException { + TemplateModel wrappedIterator = OW.wrap(Collections.emptyIterator()); + assertThat(wrappedIterator, instanceOf(DefaultIteratorAdapter.class)); + DefaultIteratorAdapter iteratorAdapter = (DefaultIteratorAdapter) wrappedIterator; + + TemplateHashModel api = (TemplateHashModel) iteratorAdapter.getAPI(); + assertFalse(((TemplateBooleanModel) ((TemplateMethodModelEx) + api.get("hasNext")).exec(Collections.emptyList())).getAsBoolean()); + } + @SuppressWarnings("boxing") @Test public void testCharKeyFallback() throws TemplateModelException { @@ -656,12 +667,11 @@ public class DefaultObjectWrapperTest { @Test public void testEnumerationAdapter() throws TemplateModelException { - DefaultObjectWrapper ow = new DefaultObjectWrapperBuilder(Configuration.VERSION_3_0_0).build(); Vector<String> vector = new Vector<String>(); vector.add("a"); vector.add("b"); - TemplateModel wrappedEnumeration = ow.wrap(vector.elements()); + TemplateModel wrappedEnumeration = OW.wrap(vector.elements()); assertThat(wrappedEnumeration, instanceOf(DefaultEnumerationAdapter.class)); DefaultEnumerationAdapter enumAdapter = (DefaultEnumerationAdapter) wrappedEnumeration; TemplateModelIterator iterator = enumAdapter.iterator(); @@ -677,6 +687,10 @@ public class DefaultObjectWrapperTest { } catch (TemplateException e) { assertThat(e.getMessage(), containsStringIgnoringCase("only once")); } + + TemplateHashModel api = (TemplateHashModel) enumAdapter.getAPI(); + assertFalse(((TemplateBooleanModel) ((TemplateMethodModelEx) + api.get("hasMoreElements")).exec(Collections.emptyList())).getAsBoolean()); } @Test
