Repository: incubator-freemarker Updated Branches: refs/heads/3 6565719b1 -> 99a750b68
`TemplateHashModelEx.keys()` and `values()` returns `TemplateCollectoinModel`, just as in FM2, but in FM3 `TemplateCollectoinModel` has `getCollectionSize()` and `isEmptyCollection` method. So this affects `TemplateHashModelEx` implementations as well. Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/99a750b6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/99a750b6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/99a750b6 Branch: refs/heads/3 Commit: 99a750b685818becc2b30701766bce30d575ea61 Parents: 6565719 Author: ddekany <[email protected]> Authored: Sat Sep 2 10:41:09 2017 +0200 Committer: ddekany <[email protected]> Committed: Sat Sep 2 10:41:09 2017 +0200 ---------------------------------------------------------------------- FM3-CHANGE-LOG.txt | 3 + .../templatesuite/models/AllTemplateModels.java | 13 +-- .../models/HashAndStringModel.java | 10 +-- .../core/templatesuite/models/Listables.java | 12 +-- .../freemarker/core/ASTExpAddOrConcat.java | 8 +- .../apache/freemarker/core/ASTExpDefault.java | 12 +-- .../freemarker/core/ASTExpHashLiteral.java | 8 +- .../org/apache/freemarker/core/Environment.java | 12 +-- .../apache/freemarker/core/NativeHashEx2.java | 6 +- .../core/debug/RmiDebuggedEnvironmentImpl.java | 12 +-- .../core/model/EmptyCollectionModel.java | 4 + .../freemarker/core/model/EmptyHashModel.java | 8 +- .../core/model/EmptyIterableModel.java | 31 +++++++ .../core/model/GeneralPurposeNothing.java | 8 +- .../core/model/TemplateCollectionModel.java | 2 + .../core/model/TemplateHashModelEx.java | 4 +- .../core/model/TemplateIterableModel.java | 2 +- .../freemarker/core/model/impl/BeanModel.java | 6 +- .../core/model/impl/DefaultMapAdapter.java | 12 +-- .../core/model/impl/SimpleCollection.java | 89 ++++++++++++++++++++ .../freemarker/core/model/impl/SimpleHash.java | 11 +-- .../core/model/impl/SimpleIterable.java | 15 ++-- .../freemarker/core/model/impl/StaticModel.java | 10 +-- .../servlet/HttpRequestHashModel.java | 12 +-- .../servlet/HttpRequestParametersHashModel.java | 72 +++++++++------- 25 files changed, 263 insertions(+), 119 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/FM3-CHANGE-LOG.txt ---------------------------------------------------------------------- diff --git a/FM3-CHANGE-LOG.txt b/FM3-CHANGE-LOG.txt index dbc017c..5593816 100644 --- a/FM3-CHANGE-LOG.txt +++ b/FM3-CHANGE-LOG.txt @@ -223,6 +223,9 @@ Major changes / features - `isEmpty` of FM2 `TemplateCollectionModelEx` (now `TemplateCollectionModel`) and FM2 `TemplateHashModel` was renamed to `isEmptyCollection` and `isEmptyHash`, so that for multi-typed values can give different results depending on the type. Also, for collections `size()` was renamed to `getCollectionSize()`, and for hashes `getHashSize()`. + - `TemplateHashModelEx.keys()` and `values()` returns `TemplateCollectoinModel`, just as in FM2, but in FM3 + `TemplateCollectoinModel` has `getCollectionSize()` and `isEmptyCollection` method. So this affects + `TemplateHashModelEx` implementations as well. - Removed freemarker.ext.log, our log abstraction layer from the times when there was no clear winner on this field. Added org.slf4j:slf4j-api as required dependency instead. - Added Spring support to the FreeMarker project (freemarker-spring module), instead of relying Spring developers http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java index 3a9009b..a5b387c 100644 --- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java +++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java @@ -23,14 +23,15 @@ import java.util.Date; import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core.model.TemplateBooleanModel; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateDateModel; import org.apache.freemarker.core.model.TemplateHashModelEx; +import org.apache.freemarker.core.model.TemplateIterableModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelIterator; import org.apache.freemarker.core.model.TemplateNumberModel; -import org.apache.freemarker.core.model.TemplateStringModel; import org.apache.freemarker.core.model.TemplateSequenceModel; +import org.apache.freemarker.core.model.TemplateStringModel; import org.apache.freemarker.core.model.impl.SimpleString; /** @@ -78,13 +79,13 @@ public class AllTemplateModels implements } @Override - public TemplateIterableModel keys() throws TemplateException { - return EMPTY_ITERABLE; + public TemplateCollectionModel keys() throws TemplateException { + return EMPTY_COLLECTION; } @Override - public TemplateIterableModel values() throws TemplateException { - return EMPTY_ITERABLE; + public TemplateCollectionModel values() throws TemplateException { + return EMPTY_COLLECTION; } @Override http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndStringModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndStringModel.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndStringModel.java index 2e0104d..9586b30 100644 --- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndStringModel.java +++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndStringModel.java @@ -20,8 +20,8 @@ package org.apache.freemarker.core.templatesuite.models; import org.apache.freemarker.core.TemplateException; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; -import org.apache.freemarker.core.model.TemplateIterableModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateStringModel; import org.apache.freemarker.core.model.impl.SimpleString; @@ -51,13 +51,13 @@ public class HashAndStringModel implements TemplateHashModelEx, TemplateStringMo } @Override - public TemplateIterableModel keys() throws TemplateException { - return TemplateIterableModel.EMPTY_ITERABLE; + public TemplateCollectionModel keys() throws TemplateException { + return TemplateCollectionModel.EMPTY_COLLECTION; } @Override - public TemplateIterableModel values() throws TemplateException { - return TemplateIterableModel.EMPTY_ITERABLE; + public TemplateCollectionModel values() throws TemplateException { + return TemplateCollectionModel.EMPTY_COLLECTION; } } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java index ed8b48d..6f83960 100644 --- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java +++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java @@ -32,14 +32,14 @@ import org.apache.freemarker.core.Configuration; import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.ObjectWrappingException; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateHashModelEx2; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.WrappingTemplateModel; import org.apache.freemarker.core.model.impl.DefaultMapAdapter; import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; -import org.apache.freemarker.core.model.impl.SimpleIterable; +import org.apache.freemarker.core.model.impl.SimpleCollection; import org.apache.freemarker.core.model.impl.SimpleHash; import com.google.common.collect.ImmutableMap; @@ -172,13 +172,13 @@ public class Listables { } @Override - public TemplateIterableModel keys() { - return new SimpleIterable(map.keySet(), getObjectWrapper()); + public TemplateCollectionModel keys() { + return new SimpleCollection(map.keySet(), getObjectWrapper()); } @Override - public TemplateIterableModel values() { - return new SimpleIterable(map.values(), getObjectWrapper()); + public TemplateCollectionModel values() { + return new SimpleCollection(map.values(), getObjectWrapper()); } } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java index 5fa8eac..b821b44 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java @@ -23,9 +23,9 @@ import java.util.HashSet; import java.util.Set; import org.apache.freemarker.core.arithmetic.ArithmeticEngine; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModel; import org.apache.freemarker.core.model.TemplateHashModelEx; -import org.apache.freemarker.core.model.TemplateIterableModel; import org.apache.freemarker.core.model.TemplateMarkupOutputModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelIterator; @@ -284,15 +284,13 @@ final class ASTExpAddOrConcat extends ASTExpression { } @Override - public TemplateIterableModel keys() - throws TemplateException { + public TemplateCollectionModel keys() throws TemplateException { initKeys(); return keys; } @Override - public TemplateIterableModel values() - throws TemplateException { + public TemplateCollectionModel values() throws TemplateException { initValues(); return values; } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpDefault.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpDefault.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpDefault.java index 07e12fb..6b6d409 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpDefault.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpDefault.java @@ -20,8 +20,8 @@ package org.apache.freemarker.core; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx2; -import org.apache.freemarker.core.model.TemplateIterableModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelIterator; import org.apache.freemarker.core.model.TemplateSequenceModel; @@ -73,13 +73,13 @@ class ASTExpDefault extends ASTExpression { } @Override - public TemplateIterableModel keys() { - return TemplateIterableModel.EMPTY_ITERABLE; + public TemplateCollectionModel keys() { + return TemplateCollectionModel.EMPTY_COLLECTION; } @Override - public TemplateIterableModel values() { - return TemplateIterableModel.EMPTY_ITERABLE; + public TemplateCollectionModel values() { + return TemplateCollectionModel.EMPTY_COLLECTION; } @Override @@ -88,7 +88,7 @@ class ASTExpDefault extends ASTExpression { } } - static final TemplateModel EMPTY_STRING_AND_SEQUENCE_AND_HASH = new EmptyStringAndSequenceAndHash(); + private static final TemplateModel EMPTY_STRING_AND_SEQUENCE_AND_HASH = new EmptyStringAndSequenceAndHash(); private final ASTExpression lho, rho; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java index a6eaab4..dd29369 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java @@ -24,7 +24,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.ListIterator; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx2; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelIterator; @@ -108,7 +108,7 @@ final class ASTExpHashLiteral extends ASTExpression { private class LinkedHash implements TemplateHashModelEx2 { private HashMap<String, TemplateModel> map; - private TemplateIterableModel keyCollection, valueCollection; // ordered lists of keys and values + private TemplateCollectionModel keyCollection, valueCollection; // ordered lists of keys and values LinkedHash(Environment env) throws TemplateException { map = new LinkedHashMap<>(); @@ -128,7 +128,7 @@ final class ASTExpHashLiteral extends ASTExpression { } @Override - public TemplateIterableModel keys() { + public TemplateCollectionModel keys() { if (keyCollection == null) { keyCollection = new IterableAndSequence(new NativeStringCollectionCollection(map.keySet())); } @@ -136,7 +136,7 @@ final class ASTExpHashLiteral extends ASTExpression { } @Override - public TemplateIterableModel values() { + public TemplateCollectionModel values() { if (valueCollection == null) { valueCollection = new IterableAndSequence(new NativeCollection(map.values())); } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java b/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java index 26d5a0e..23df374 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java @@ -48,7 +48,7 @@ import org.apache.freemarker.core.arithmetic.ArithmeticEngine; import org.apache.freemarker.core.model.ArgumentArrayLayout; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.TemplateCallableModel; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateDateModel; import org.apache.freemarker.core.model.TemplateDirectiveModel; import org.apache.freemarker.core.model.TemplateFunctionModel; @@ -59,8 +59,8 @@ import org.apache.freemarker.core.model.TemplateModelIterator; import org.apache.freemarker.core.model.TemplateModelWithOriginName; import org.apache.freemarker.core.model.TemplateNodeModel; import org.apache.freemarker.core.model.TemplateNumberModel; -import org.apache.freemarker.core.model.TemplateStringModel; import org.apache.freemarker.core.model.TemplateSequenceModel; +import org.apache.freemarker.core.model.TemplateStringModel; import org.apache.freemarker.core.model.impl.SimpleHash; import org.apache.freemarker.core.templateresolver.MalformedTemplateNameException; import org.apache.freemarker.core.templateresolver.TemplateResolver; @@ -2229,12 +2229,12 @@ public final class Environment extends MutableProcessingConfiguration<Environmen // configuration shared variables even though // the hash will return them, if only for BWC reasons @Override - public TemplateIterableModel values() throws TemplateException { + public TemplateCollectionModel values() throws TemplateException { return ((TemplateHashModelEx) rootDataModel).values(); } @Override - public TemplateIterableModel keys() throws TemplateException { + public TemplateCollectionModel keys() throws TemplateException { return ((TemplateHashModelEx) rootDataModel).keys(); } @@ -2866,13 +2866,13 @@ public final class Environment extends MutableProcessingConfiguration<Environmen } @Override - public TemplateIterableModel keys() { + public TemplateCollectionModel keys() { ensureInitializedRTE(); return super.keys(); } @Override - public TemplateIterableModel values() { + public TemplateCollectionModel values() { ensureInitializedRTE(); return super.values(); } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java index bb505c6..9b39e82 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java @@ -25,7 +25,7 @@ import java.util.LinkedHashMap; import java.util.Map; import org.apache.freemarker.core.model.ObjectWrapper; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx2; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.impl.SimpleString; @@ -89,12 +89,12 @@ class NativeHashEx2 implements TemplateHashModelEx2, Serializable { } @Override - public TemplateIterableModel keys() throws TemplateException { + public TemplateCollectionModel keys() throws TemplateException { return new NativeStringCollectionCollection(map.keySet()); } @Override - public TemplateIterableModel values() throws TemplateException { + public TemplateCollectionModel values() throws TemplateException { return new NativeCollection(map.values()); } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java index 4d9ace6..d1c2154 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java @@ -38,11 +38,11 @@ import org.apache.freemarker.core.MutableProcessingConfiguration; import org.apache.freemarker.core.ProcessingConfiguration; import org.apache.freemarker.core.Template; import org.apache.freemarker.core.TemplateException; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; -import org.apache.freemarker.core.model.impl.SimpleIterable; +import org.apache.freemarker.core.model.impl.SimpleCollection; import org.apache.freemarker.core.model.impl.SimpleString; import org.apache.freemarker.core.util.UndeclaredThrowableException; @@ -133,19 +133,19 @@ class RmiDebuggedEnvironmentImpl extends RmiDebugModelImpl implements DebuggedEn } @Override - public TemplateIterableModel keys() { - return new SimpleIterable(keySet(), OBJECT_WRAPPER); + public TemplateCollectionModel keys() { + return new SimpleCollection(keySet(), OBJECT_WRAPPER); } @Override - public TemplateIterableModel values() throws TemplateException { + public TemplateCollectionModel values() throws TemplateException { Collection keys = keySet(); List list = new ArrayList(keys.size()); for (Iterator it = keys.iterator(); it.hasNext(); ) { list.add(get((String) it.next())); } - return new SimpleIterable(list, OBJECT_WRAPPER); + return new SimpleCollection(list, OBJECT_WRAPPER); } @Override http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionModel.java index a38574c..576bd59 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionModel.java @@ -25,6 +25,10 @@ import org.apache.freemarker.core.TemplateException; class EmptyCollectionModel implements TemplateCollectionModel, Serializable { + public EmptyCollectionModel() { + + } + @Override public int getCollectionSize() throws TemplateException { return 0; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java index 966e0bb..69ebe26 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java @@ -31,13 +31,13 @@ class EmptyHashModel implements TemplateHashModelEx2, Serializable { } @Override - public TemplateIterableModel keys() throws TemplateException { - return TemplateIterableModel.EMPTY_ITERABLE; + public TemplateCollectionModel keys() throws TemplateException { + return TemplateCollectionModel.EMPTY_COLLECTION; } @Override - public TemplateIterableModel values() throws TemplateException { - return TemplateIterableModel.EMPTY_ITERABLE; + public TemplateCollectionModel values() throws TemplateException { + return TemplateCollectionModel.EMPTY_COLLECTION; } @Override http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIterableModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIterableModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIterableModel.java new file mode 100644 index 0000000..6200eb9 --- /dev/null +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIterableModel.java @@ -0,0 +1,31 @@ +/* + * 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.model; + +import org.apache.freemarker.core.TemplateException; + +class EmptyIterableModel implements TemplateIterableModel { + + @Override + public TemplateModelIterator iterator() throws TemplateException { + return TemplateModelIterator.EMPTY_ITERATOR; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java index 3eba7a9..438b704 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java @@ -98,13 +98,13 @@ implements TemplateBooleanModel, TemplateStringModel, TemplateSequenceModel, Tem } @Override - public TemplateIterableModel keys() { - return TemplateIterableModel.EMPTY_ITERABLE; + public TemplateCollectionModel keys() { + return TemplateCollectionModel.EMPTY_COLLECTION; } @Override - public TemplateIterableModel values() { - return TemplateIterableModel.EMPTY_ITERABLE; + public TemplateCollectionModel values() { + return TemplateCollectionModel.EMPTY_COLLECTION; } @Override http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java index 1562b0a..4dd5624 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java @@ -27,6 +27,8 @@ import org.apache.freemarker.core.TemplateException; */ public interface TemplateCollectionModel extends TemplateIterableModel { + TemplateCollectionModel EMPTY_COLLECTION = new EmptyCollectionModel(); + /** * Returns the number items in this collection, or {@link Integer#MAX_VALUE}, if there are more than * {@link Integer#MAX_VALUE} items. http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java index 2a968c9..2b5c3a6 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java @@ -41,11 +41,11 @@ public interface TemplateHashModelEx extends TemplateHashModel { * @return a iterable returning the keys in the hash. Every element of the returned by the iterable must implement * the {@link TemplateStringModel} (as the keys of hashes are always strings). */ - TemplateIterableModel keys() throws TemplateException; + TemplateCollectionModel keys() throws TemplateException; /** * @return An iterable returning the values in the hash. The elements returned by the iterable can be any kind of * {@link TemplateModel}-s. */ - TemplateIterableModel values() throws TemplateException; + TemplateCollectionModel values() throws TemplateException; } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateIterableModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateIterableModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateIterableModel.java index 7d67f08..4cd35a2 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateIterableModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateIterableModel.java @@ -39,7 +39,7 @@ import org.apache.freemarker.core.TemplateException; */ public interface TemplateIterableModel extends TemplateModel { - TemplateCollectionModel EMPTY_ITERABLE = new EmptyCollectionModel(); + TemplateIterableModel EMPTY_ITERABLE = new EmptyIterableModel(); /** * Retrieves an iterator that is used to iterate over the elements of something. http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java index 06dd2c0..3f4c45b 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java @@ -37,7 +37,7 @@ import org.apache.freemarker.core._DelayedJQuote; import org.apache.freemarker.core._DelayedTemplateLanguageTypeDescription; import org.apache.freemarker.core.model.AdapterTemplateModel; import org.apache.freemarker.core.model.ObjectWrappingException; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateFunctionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateModel; @@ -288,12 +288,12 @@ public class BeanModel } @Override - public TemplateIterableModel keys() { + public TemplateCollectionModel keys() { return new IterableAndSequence(DefaultNonListCollectionAdapter.adapt(keySet(), wrapper)); } @Override - public TemplateIterableModel values() throws TemplateException { + public TemplateCollectionModel values() throws TemplateException { List<Object> values = new ArrayList<>(getHashSize()); TemplateModelIterator it = keys().iterator(); while (it.hasNext()) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java index f663990..f24d7c5 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java @@ -27,7 +27,7 @@ import org.apache.freemarker.core._DelayedJQuote; 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.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateHashModelEx2; import org.apache.freemarker.core.model.TemplateModel; @@ -66,7 +66,7 @@ public class DefaultMapAdapter extends WrappingTemplateModel return new DefaultMapAdapter(map, wrapper); } - private DefaultMapAdapter(Map map, ObjectWrapper wrapper) { + private DefaultMapAdapter(Map map, ObjectWrapperWithAPISupport wrapper) { super(wrapper); this.map = map; } @@ -134,13 +134,13 @@ public class DefaultMapAdapter extends WrappingTemplateModel } @Override - public TemplateIterableModel keys() { - return new SimpleIterable(map.keySet(), getObjectWrapper()); + public TemplateCollectionModel keys() { + return DefaultNonListCollectionAdapter.adapt(map.keySet(), (ObjectWrapperWithAPISupport) getObjectWrapper()); } @Override - public TemplateIterableModel values() { - return new SimpleIterable(map.values(), getObjectWrapper()); + public TemplateCollectionModel values() { + return DefaultNonListCollectionAdapter.adapt(map.values(), (ObjectWrapperWithAPISupport) getObjectWrapper()); } @Override http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java new file mode 100644 index 0000000..748a9a2 --- /dev/null +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java @@ -0,0 +1,89 @@ +/* + * 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.model.impl; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Iterator; + +import org.apache.freemarker.core.TemplateException; +import org.apache.freemarker.core.model.ObjectWrapper; +import org.apache.freemarker.core.model.TemplateCollectionModel; +import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.TemplateModelIterator; +import org.apache.freemarker.core.model.WrappingTemplateModel; + +/** + * A simple implementation of {@link TemplateCollectionModel}. + * <p> + * This class is thread-safe. The returned {@link TemplateModelIterator}-s are <em>not</em> thread-safe. + */ +public class SimpleCollection extends WrappingTemplateModel implements TemplateCollectionModel, Serializable { + + private final Collection<?> collection; + + public SimpleCollection(Collection<?> collection, ObjectWrapper wrapper) { + super(wrapper); + this.collection = collection; + } + + @Override + public int getCollectionSize() throws TemplateException { + return collection.size(); + } + + @Override + public boolean isEmptyCollection() throws TemplateException { + return collection.isEmpty(); + } + + /** + * Retrieves a template model iterator that is used to iterate over the elements in this iterable. + */ + @Override + public TemplateModelIterator iterator() { + return new SimpleTemplateModelIterator(collection.iterator()); + } + + /** + * Wraps an {@link Iterator}; not thread-safe. + */ + private class SimpleTemplateModelIterator implements TemplateModelIterator { + + private final Iterator<?> iterator; + + SimpleTemplateModelIterator(Iterator<?> iterator) { + this.iterator = iterator; + } + + @Override + public TemplateModel next() throws TemplateException { + Object value = iterator.next(); + return value instanceof TemplateModel ? (TemplateModel) value : wrap(value); + } + + @Override + public boolean hasNext() throws TemplateException { + return iterator.hasNext(); + } + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java index e2c867e..38f2a9b 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java @@ -30,7 +30,7 @@ import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core._DelayedJQuote; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.TemplateBooleanModel; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateHashModelEx2; import org.apache.freemarker.core.model.TemplateModel; @@ -277,17 +277,18 @@ public class SimpleHash extends WrappingTemplateModel implements TemplateHashMod } @Override - public TemplateIterableModel keys() { - return new SimpleIterable(map.keySet(), getObjectWrapper()); + public TemplateCollectionModel keys() { + return new SimpleCollection(map.keySet(), getObjectWrapper()); } @Override - public TemplateIterableModel values() { - return new SimpleIterable(map.values(), getObjectWrapper()); + public TemplateCollectionModel values() { + return new SimpleCollection(map.values(), getObjectWrapper()); } @Override public KeyValuePairIterator keyValuePairIterator() { return new MapKeyValuePairIterator(map, getObjectWrapper()); } + } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleIterable.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleIterable.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleIterable.java index 1856535..34ce021 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleIterable.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleIterable.java @@ -21,6 +21,7 @@ package org.apache.freemarker.core.model.impl; import java.io.Serializable; import java.util.Iterator; +import java.util.List; import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core.model.ObjectWrapper; @@ -31,15 +32,15 @@ import org.apache.freemarker.core.model.WrappingTemplateModel; /** * A simple implementation of {@link TemplateIterableModel}. - * It's able to wrap <tt>java.util.Iterator</tt>-s and <tt>java.util.Collection</tt>-s. - * If you wrap an <tt>Iterator</tt>, the variable can be <#list>-ed only once! + * It's able to wrap {@link Iterable}-s and {@link Iterator}-s. + * If you wrap an {@link Iterator}, the variable can be <#list>-ed only once! * - * <p>Consider using {@link SimpleSequence} instead of this class if you want to wrap <tt>Iterator</tt>s. - * <tt>SimpleSequence</tt> will read all elements of the <tt>Iterator</tt>, and store them in a <tt>List</tt> + * <p>Consider using {@link SimpleSequence} instead of this class if you want to wrap {@link Iterator}-s. + * {@link SimpleSequence} will read all elements of the {@link Iterator}, and store them in a {@link List} * (this may cause too high resource consumption in some applications), so you can list the variable - * for unlimited times. Also, if you want to wrap <tt>Collection</tt>s, and then list the resulting - * variable for many times, <tt>SimpleSequence</tt> may gives better performance, as the - * wrapping of non-<tt>TemplateModel</tt> objects happens only once. + * for unlimited times. Also, if you want to wrap {@link Iterable}-s, and then list the resulting + * variable for many times, {@link SimpleSequence} may gives better performance, as the + * wrapping of non-{@link TemplateModel} objects happens only once. * * <p>This class is thread-safe. The returned {@link TemplateModelIterator}-s * are <em>not</em> thread-safe. http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java index 1ea6027..684bc63 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java @@ -27,7 +27,7 @@ import java.util.Iterator; import java.util.Map; import org.apache.freemarker.core.TemplateException; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateFunctionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateModel; @@ -94,13 +94,13 @@ final class StaticModel implements TemplateHashModelEx { } @Override - public TemplateIterableModel keys() throws TemplateException { - return (TemplateIterableModel) wrapper.getOuterIdentity().wrap(map.keySet()); + public TemplateCollectionModel keys() throws TemplateException { + return (TemplateCollectionModel) wrapper.getOuterIdentity().wrap(map.keySet()); } @Override - public TemplateIterableModel values() throws TemplateException { - return (TemplateIterableModel) wrapper.getOuterIdentity().wrap(map.values()); + public TemplateCollectionModel values() throws TemplateException { + return (TemplateCollectionModel) wrapper.getOuterIdentity().wrap(map.values()); } private void populate() throws TemplateException { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java ---------------------------------------------------------------------- diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java index 0a159e9..9a61294 100644 --- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java +++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java @@ -28,10 +28,10 @@ import javax.servlet.http.HttpServletResponse; import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateModel; -import org.apache.freemarker.core.model.impl.SimpleIterable; +import org.apache.freemarker.core.model.impl.SimpleCollection; /** * TemplateHashModel wrapper for a HttpServletRequest attributes. @@ -77,21 +77,21 @@ public final class HttpRequestHashModel implements TemplateHashModelEx { } @Override - public TemplateIterableModel keys() { + public TemplateCollectionModel keys() { ArrayList keys = new ArrayList(); for (Enumeration enumeration = request.getAttributeNames(); enumeration.hasMoreElements(); ) { keys.add(enumeration.nextElement()); } - return new SimpleIterable(keys.iterator(), wrapper); + return new SimpleCollection(keys, wrapper); } @Override - public TemplateIterableModel values() { + public TemplateCollectionModel values() { ArrayList values = new ArrayList(); for (Enumeration enumeration = request.getAttributeNames(); enumeration.hasMoreElements(); ) { values.add(request.getAttribute((String) enumeration.nextElement())); } - return new SimpleIterable(values.iterator(), wrapper); + return new SimpleCollection(values, wrapper); } public HttpServletRequest getRequest() { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/99a750b6/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java ---------------------------------------------------------------------- diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java index 25833ef..573c4ad 100644 --- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java +++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java @@ -21,16 +21,17 @@ package org.apache.freemarker.servlet; import java.util.ArrayList; import java.util.Enumeration; -import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; +import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core.model.ObjectWrapper; -import org.apache.freemarker.core.model.TemplateIterableModel; +import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateModel; -import org.apache.freemarker.core.model.impl.SimpleIterable; +import org.apache.freemarker.core.model.TemplateModelIterator; +import org.apache.freemarker.core.model.impl.SimpleCollection; import org.apache.freemarker.core.model.impl.SimpleString; /** @@ -40,7 +41,7 @@ import org.apache.freemarker.core.model.impl.SimpleString; public class HttpRequestParametersHashModel implements TemplateHashModelEx { private final HttpServletRequest request; private final ObjectWrapper objectWrapper; - private List keys; + private List<String> keys; public HttpRequestParametersHashModel(HttpServletRequest request, ObjectWrapper objectWrapper) { this.request = request; @@ -64,38 +65,51 @@ public class HttpRequestParametersHashModel implements TemplateHashModelEx { } @Override - public TemplateIterableModel keys() { - return new SimpleIterable(getKeys().iterator(), objectWrapper); + public TemplateCollectionModel keys() { + return new SimpleCollection(getKeys(), objectWrapper); } @Override - public TemplateIterableModel values() { - final Iterator iter = getKeys().iterator(); - return new SimpleIterable( - new Iterator() { - @Override - public boolean hasNext() { - return iter.hasNext(); - } - @Override - public Object next() { - return request.getParameter((String) iter.next()); - } - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }, objectWrapper); - } + public TemplateCollectionModel values() { + return new TemplateCollectionModel() { + private final List<String> paramNames = getKeys(); + + @Override + public int getCollectionSize() throws TemplateException { + return paramNames.size(); + } + + @Override + public boolean isEmptyCollection() throws TemplateException { + return paramNames.isEmpty(); + } + + @Override + public TemplateModelIterator iterator() throws TemplateException { + return new TemplateModelIterator() { + int nextIndex; - protected String transcode(String string) { - return string; + @Override + public TemplateModel next() throws TemplateException { + TemplateModel result = objectWrapper.wrap( + request.getParameter(paramNames.get(nextIndex))); + nextIndex++; + return result; + } + + @Override + public boolean hasNext() throws TemplateException { + return nextIndex < paramNames.size(); + } + }; + } + }; } - private synchronized List getKeys() { + private synchronized List<String> getKeys() { if (keys == null) { - keys = new ArrayList(); - for (Enumeration enumeration = request.getParameterNames(); enumeration.hasMoreElements(); ) { + keys = new ArrayList<>(); + for (Enumeration<String> enumeration = request.getParameterNames(); enumeration.hasMoreElements(); ) { keys.add(enumeration.nextElement()); } }
