Repository: incubator-freemarker
Updated Branches:
  refs/heads/3 e3e7f1e2d -> cae86e18e


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
index bdb7e93..26bbee4 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/util/TemplateLanguageUtils.java
@@ -26,8 +26,8 @@ import org.apache.freemarker.core._CoreAPI;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 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.TemplateCollectionModelEx;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
@@ -757,7 +757,7 @@ public final class TemplateLanguageUtils {
 
     /**
      * Return the template language type name of the value as it should be 
shown in error messages, considering {@link
-     * TemplateCollectionModel} subinterfaces only.
+     * TemplateIterableModel} subinterfaces only.
      *
      * @param callable
      *         Can't be {@code null}.
@@ -857,9 +857,9 @@ public final class TemplateLanguageUtils {
 
         if (TemplateSequenceModel.class.isAssignableFrom(cl)) {
             appendTypeName(sb, typeNamesAppended, "sequence");
-        } else if (TemplateCollectionModel.class.isAssignableFrom(cl)) {
+        } else if (TemplateIterableModel.class.isAssignableFrom(cl)) {
             appendTypeName(sb, typeNamesAppended,
-                    TemplateCollectionModelEx.class.isAssignableFrom(cl) ? 
"extended_collection" : "collection");
+                    TemplateCollectionModel.class.isAssignableFrom(cl) ? 
"collection" : "iterable");
         } else if (TemplateModelIterator.class.isAssignableFrom(cl)) {
             appendTypeName(sb, typeNamesAppended, "iterator");
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-core/src/main/javacc/FTL.jj
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/javacc/FTL.jj 
b/freemarker-core/src/main/javacc/FTL.jj
index e5d1e30..54f9a45 100644
--- a/freemarker-core/src/main/javacc/FTL.jj
+++ b/freemarker-core/src/main/javacc/FTL.jj
@@ -4176,7 +4176,7 @@ void HeaderElement() :
                             }
                             TemplateHashModelEx prefixMap = 
(TemplateHashModelEx) value;
                             try {
-                                TemplateCollectionModel keys = 
prefixMap.keys();
+                                TemplateIterableModel keys = prefixMap.keys();
                                 for (TemplateModelIterator it = 
keys.iterator(); it.hasNext();) {
                                     String prefix = ((TemplateStringModel) 
it.next()).getAsString();
                                     TemplateModel valueModel = 
prefixMap.get(prefix);
@@ -4198,7 +4198,7 @@ void HeaderElement() :
                             }
                             TemplateHashModelEx attributeMap = 
(TemplateHashModelEx) value;
                             try {
-                                TemplateCollectionModel keys = 
attributeMap.keys();
+                                TemplateIterableModel keys = 
attributeMap.keys();
                                 for (TemplateModelIterator it = 
keys.iterator(); it.hasNext();) {
                                         String attName = 
((TemplateStringModel) it.next()).getAsString();
                                         Object attValue = 
DeepUnwrap.unwrap(attributeMap.get(attName));

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/AttributeNodeModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/AttributeNodeModel.java
 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/AttributeNodeModel.java
index d6af687..b7f7830 100644
--- 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/AttributeNodeModel.java
+++ 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/AttributeNodeModel.java
@@ -44,7 +44,7 @@ class AttributeNodeModel extends NodeModel implements 
TemplateStringModel {
     }
     
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return true;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/CharacterDataNodeModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/CharacterDataNodeModel.java
 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/CharacterDataNodeModel.java
index 21e8a27..024c333 100644
--- 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/CharacterDataNodeModel.java
+++ 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/CharacterDataNodeModel.java
@@ -40,7 +40,7 @@ class CharacterDataNodeModel extends NodeModel implements 
TemplateStringModel {
     }
     
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return true;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java
index 3d6a379..13b8cf2 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java
@@ -70,7 +70,7 @@ class DocumentModel extends NodeModel implements 
TemplateHashModel {
     }
     
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return false;
     }
 } 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java
index eb978fe..f71506d 100644
--- 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java
+++ 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java
@@ -50,7 +50,7 @@ class DocumentTypeModel extends NodeModel {
     }
     
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return true;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java
index 4be196d..f571e6c 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java
@@ -41,7 +41,7 @@ class ElementModel extends NodeModel implements 
TemplateStringModel {
     }
     
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return false;
     }
     
@@ -61,7 +61,8 @@ class ElementModel extends NodeModel implements 
TemplateStringModel {
         if (key.equals("*")) {
             NodeListModel ns = new NodeListModel(this);
             TemplateSequenceModel children = getChildNodes();
-            for (int i = 0; i < children.size(); i++) {
+            int size = children.getCollectionSize();
+            for (int i = 0; i < size; i++) {
                 NodeModel child = (NodeModel) children.get(i);
                 if (child.node.getNodeType() == Node.ELEMENT_NODE) {
                     ns.add(child);
@@ -120,7 +121,7 @@ class ElementModel extends NodeModel implements 
TemplateStringModel {
         } else if (DomStringUtils.isXMLNameLike(key)) {
             // We interpret key as an element name
             NodeListModel result = ((NodeListModel) 
getChildNodes()).filterByName(key);
-            return result.size() != 1 ? result : result.get(0);
+            return result.getCollectionSize() != 1 ? result : result.get(0);
         } else {
             // We don't anything like this that's element-specific; fall back 
             return super.get(key);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java
index 5db727a..99d7e61 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java
@@ -86,7 +86,7 @@ class NodeListModel extends SimpleSequence implements 
TemplateHashModel, _Unexpe
     
     NodeListModel filterByName(String name) throws TemplateException {
         NodeListModel result = new NodeListModel(contextNode);
-        int size = size();
+        int size = getCollectionSize();
         if (size == 0) {
             return result;
         }
@@ -103,13 +103,14 @@ class NodeListModel extends SimpleSequence implements 
TemplateHashModel, _Unexpe
     }
     
     @Override
-    public boolean isEmpty() {
-        return size() == 0;
+    public boolean isEmptyHash() {
+        return false;
     }
     
     @Override
     public TemplateModel get(String key) throws TemplateException {
-        if (size() == 1) {
+        int size = getCollectionSize();
+        if (size == 1) {
             NodeModel nm = (NodeModel) get(0);
             return nm.get(key);
         }
@@ -118,7 +119,7 @@ class NodeListModel extends SimpleSequence implements 
TemplateHashModel, _Unexpe
                     || key.equals(AtAtKey.NESTED_MARKUP.getKey()) 
                     || key.equals(AtAtKey.TEXT.getKey())) {
                 StringBuilder result = new StringBuilder();
-                for (int i = 0; i < size(); i++) {
+                for (int i = 0; i < size; i++) {
                     NodeModel nm = (NodeModel) get(i);
                     TemplateStringModel textModel = (TemplateStringModel) 
nm.get(key);
                     result.append(textModel.getAsString());
@@ -129,8 +130,8 @@ class NodeListModel extends SimpleSequence implements 
TemplateHashModel, _Unexpe
                 if (AtAtKey.containsKey(key)) {
                     throw new TemplateException(
                             "\"" + key + "\" is only applicable to a single 
XML node, but it was applied on "
-                            + (size() != 0
-                                    ? size() + " XML nodes (multiple matches)."
+                            + (size != 0
+                                    ? size + " XML nodes (multiple matches)."
                                     : "an empty list of XML nodes (no 
matches)."));
                 } else {
                     throw new TemplateException("Unsupported @@ key: " + key);
@@ -142,26 +143,26 @@ class NodeListModel extends SimpleSequence implements 
TemplateHashModel, _Unexpe
                         && (DomStringUtils.isXMLNameLike(key, 1)  || 
key.equals("@@") || key.equals("@*"))))
                 || key.equals("*") || key.equals("**")) {
             NodeListModel result = new NodeListModel(contextNode);
-            for (int i = 0; i < size(); i++) {
+            for (int i = 0; i < size; i++) {
                 NodeModel nm = (NodeModel) get(i);
                 if (nm instanceof ElementModel) {
                     TemplateSequenceModel tsm = (TemplateSequenceModel) 
nm.get(key);
                     if (tsm != null) {
-                        int size = tsm.size();
-                        for (int j = 0; j < size; j++) {
+                        int tsmSize = tsm.getCollectionSize();
+                        for (int j = 0; j < tsmSize; j++) {
                             result.add(tsm.get(j));
                         }
                     }
                 }
             }
-            if (result.size() == 1) {
+            if (result.getCollectionSize() == 1) {
                 return result.get(0);
             }
             return result;
         }
         XPathSupport xps = getXPathSupport();
         if (xps != null) {
-            Object context = (size() == 0) ? null : rawNodeList(); 
+            Object context = (size == 0) ? null : rawNodeList();
             return xps.executeQuery(context, key);
         } else {
             throw new TemplateException(
@@ -171,7 +172,7 @@ class NodeListModel extends SimpleSequence implements 
TemplateHashModel, _Unexpe
     }
     
     private List rawNodeList() throws TemplateException {
-        int size = size();
+        int size = getCollectionSize();
         ArrayList al = new ArrayList(size);
         for (int i = 0; i < size; i++) {
             al.add(((NodeModel) get(i)).node);
@@ -183,7 +184,7 @@ class NodeListModel extends SimpleSequence implements 
TemplateHashModel, _Unexpe
         if (xpathSupport == null) {
             if (contextNode != null) {
                 xpathSupport = contextNode.getXPathSupport();
-            } else if (size() > 0) {
+            } else if (getCollectionSize() > 0) {
                 xpathSupport = ((NodeModel) get(0)).getXPathSupport();
             }
         }
@@ -206,11 +207,12 @@ class NodeListModel extends SimpleSequence implements 
TemplateHashModel, _Unexpe
     }
 
     private Object[] newTypeErrorExplanation(String type) {
+        int size = getCollectionSize();
         return new Object[] {
                 "This XML query result can't be used as ", type, " because for 
that it had to contain exactly "
-                + "1 XML node, but it contains ", Integer.valueOf(size()), " 
nodes. "
+                + "1 XML node, but it contains ", Integer.valueOf(size), " 
nodes. "
                 + "That is, the constructing XML query has found ",
-                isEmpty()
+                size == 0
                     ? "no matches."
                     : "multiple matches."
                 };

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java
index 123a1a7..030005c 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java
@@ -33,6 +33,7 @@ import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
+import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateNodeModel;
 import org.apache.freemarker.core.model.TemplateNodeModelEx;
 import org.apache.freemarker.core.model.TemplateNumberModel;
@@ -40,6 +41,7 @@ import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.model.impl.SimpleString;
+import org.apache.freemarker.core.model.impl.SingleItemTemplateModelIterator;
 import org.slf4j.Logger;
 import org.w3c.dom.Attr;
 import org.w3c.dom.CDATASection;
@@ -208,20 +210,38 @@ abstract public class NodeModel implements 
TemplateNodeModelEx, TemplateHashMode
         }
         throw new TemplateException("Unknown node type: " + nodeType + ". This 
should be impossible!");
     }
-    
+
+    /**
+     * Always returns {@code false}.
+     */
+    @Override
+    public boolean isEmptyHash() throws TemplateException {
+        return false;
+    }
+
+    @Override
+    public TemplateModelIterator iterator() throws TemplateException {
+        return new SingleItemTemplateModelIterator(this);
+    }
+
+    @Override
+    public final TemplateModel get(int index) {
+        return index == 0 ? this : null;
+    }
+
     /**
      * Always returns 1.
      */
     @Override
-    public final int size() {
+    public final int getCollectionSize() {
         return 1;
     }
-    
+
     @Override
-    public final TemplateModel get(int i) {
-        return i == 0 ? this : null;
+    public final boolean isEmptyCollection() throws TemplateException {
+        return false;
     }
-    
+
     @Override
     public String getNodeNamespace() {
         int nodeType = node.getNodeType();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/PINodeModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/PINodeModel.java 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/PINodeModel.java
index 2a6a43e..bbd9c68 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/PINodeModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/PINodeModel.java
@@ -39,7 +39,7 @@ class PINodeModel extends NodeModel implements 
TemplateStringModel {
     }
     
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return true;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
index 5554f9b..e002ac7 100644
--- 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
+++ 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
@@ -97,7 +97,7 @@ class SunInternalXalanXPathSupport implements XPathSupport {
                         result.add(n);
                     }
                 } while (n != null);
-                return result.size() == 1 ? result.get(0) : result;
+                return result.getCollectionSize() == 1 ? result.get(0) : 
result;
             }
             if (xresult instanceof XBoolean) {
                 return ((XBoolean) xresult).bool() ? TemplateBooleanModel.TRUE 
: TemplateBooleanModel.FALSE;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java
----------------------------------------------------------------------
diff --git 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java
index f962d05..56bc12f 100644
--- 
a/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java
+++ 
b/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java
@@ -97,7 +97,7 @@ class XalanXPathSupport implements XPathSupport {
                         result.add(n);
                     }
                 } while (n != null);
-                return result.size() == 1 ? result.get(0) : result;
+                return result.getCollectionSize() == 1 ? result.get(0) : 
result;
             }
             if (xresult instanceof XBoolean) {
                 return ((XBoolean) xresult).bool() ? TemplateBooleanModel.TRUE 
: TemplateBooleanModel.FALSE;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/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 cb6ee96..0a159e9 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.TemplateCollectionModel;
+import org.apache.freemarker.core.model.TemplateIterableModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.impl.SimpleCollection;
+import org.apache.freemarker.core.model.impl.SimpleIterable;
 
 /**
  * TemplateHashModel wrapper for a HttpServletRequest attributes.
@@ -62,12 +62,12 @@ public final class HttpRequestHashModel implements 
TemplateHashModelEx {
     }
 
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return !request.getAttributeNames().hasMoreElements();
     }
     
     @Override
-    public int size() {
+    public int getHashSize() {
         int result = 0;
         for (Enumeration enumeration = request.getAttributeNames(); 
enumeration.hasMoreElements(); ) {
             enumeration.nextElement();
@@ -77,21 +77,21 @@ public final class HttpRequestHashModel implements 
TemplateHashModelEx {
     }
     
     @Override
-    public TemplateCollectionModel keys() {
+    public TemplateIterableModel keys() {
         ArrayList keys = new ArrayList();
         for (Enumeration enumeration = request.getAttributeNames(); 
enumeration.hasMoreElements(); ) {
             keys.add(enumeration.nextElement());
         }
-        return new SimpleCollection(keys.iterator(), wrapper);
+        return new SimpleIterable(keys.iterator(), wrapper);
     }
     
     @Override
-    public TemplateCollectionModel values() {
+    public TemplateIterableModel values() {
         ArrayList values = new ArrayList();
         for (Enumeration enumeration = request.getAttributeNames(); 
enumeration.hasMoreElements(); ) {
             values.add(request.getAttribute((String) 
enumeration.nextElement()));
         }
-        return new SimpleCollection(values.iterator(), wrapper);
+        return new SimpleIterable(values.iterator(), wrapper);
     }
 
     public HttpServletRequest getRequest() {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/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 e815a17..25833ef 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
@@ -27,10 +27,10 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.freemarker.core.model.ObjectWrapper;
-import org.apache.freemarker.core.model.TemplateCollectionModel;
+import org.apache.freemarker.core.model.TemplateIterableModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.impl.SimpleCollection;
+import org.apache.freemarker.core.model.impl.SimpleIterable;
 import org.apache.freemarker.core.model.impl.SimpleString;
 
 /**
@@ -54,24 +54,24 @@ public class HttpRequestParametersHashModel implements 
TemplateHashModelEx {
     }
 
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return !request.getParameterNames().hasMoreElements();
     }
     
     @Override
-    public int size() {
+    public int getHashSize() {
         return getKeys().size();
     }
     
     @Override
-    public TemplateCollectionModel keys() {
-        return new SimpleCollection(getKeys().iterator(), objectWrapper);
+    public TemplateIterableModel keys() {
+        return new SimpleIterable(getKeys().iterator(), objectWrapper);
     }
     
     @Override
-    public TemplateCollectionModel values() {
+    public TemplateIterableModel values() {
         final Iterator iter = getKeys().iterator();
-        return new SimpleCollection(
+        return new SimpleIterable(
             new Iterator() {
                 @Override
                 public boolean hasNext() {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
index 1a0ff52..d2f5723 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
@@ -108,7 +108,7 @@ public final class HttpSessionHashModel implements 
TemplateHashModel, Serializab
     }
 
     @Override
-    public boolean isEmpty() throws TemplateException {
+    public boolean isEmptyHash() throws TemplateException {
         checkSessionExistence();
         return session == null || 
!session.getAttributeNames().hasMoreElements();
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
index 1679412..d66ea94 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
@@ -48,7 +48,7 @@ public final class ServletContextHashModel implements 
TemplateHashModel {
     }
 
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return !servletctx.getAttributeNames().hasMoreElements();
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
index 3c2b4c0..29a3f54 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
@@ -28,6 +28,7 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.NoSuchElementException;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.Servlet;
@@ -451,6 +452,9 @@ public JspWriter pushBody(Writer w) {
         @Override
         public Object nextElement() {
             try {
+                if (!it.hasNext()) {
+                    throw new NoSuchElementException();
+                }
                 return ((TemplateStringModel) it.next()).getAsString();
             } catch (TemplateException tme) {
                 throw new UndeclaredThrowableException(tme);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
index 81f0e03..75f1fe2 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
@@ -72,7 +72,7 @@ abstract class JspTagModelBase implements 
TemplateModelWithOriginName {
             throws TemplateException,
         InvocationTargetException, 
         IllegalAccessException {
-        if (args != null && !args.isEmpty()) {
+        if (args != null && !args.isEmptyHash()) {
             final Object[] argArray = new Object[1];
             for (TemplateHashModelEx2.KeyValuePairIterator iter = 
args.keyValuePairIterator(); iter.hasNext(); ) {
                 final TemplateHashModelEx2.KeyValuePair entry = iter.next();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index d486772..26231f9 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -356,7 +356,7 @@ public class TaglibFactory implements TemplateHashModel {
      * Returns false.
      */
     @Override
-    public boolean isEmpty() {
+    public boolean isEmptyHash() {
         return false;
     }
 
@@ -1513,7 +1513,7 @@ public class TaglibFactory implements TemplateHashModel {
         }
 
         @Override
-        public boolean isEmpty() {
+        public boolean isEmptyHash() {
             return tagsAndFunctions.isEmpty();
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes-modernModels.txt
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes-modernModels.txt
 
b/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes-modernModels.txt
index 0208260..f1f2e1f 100644
--- 
a/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes-modernModels.txt
+++ 
b/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes-modernModels.txt
@@ -60,8 +60,8 @@ String: s [java.lang.String]
 Number: 1 [java.math.BigDecimal]
 Boolean: true [java.lang.Boolean]
 Date-time: 2014-12-20T16:19:00Z [java.util.Date]
-Sequence: [1, 2, 3] [org.apache.freemarker.core.model.impl.SequenceAdapter]
-Hash: {a=1, b=2, c=3} [org.apache.freemarker.core.model.impl.HashAdapter]
+Sequence: [1, 2, 3] 
[org.apache.freemarker.core.model.impl.TemplateSequenceModelAdapter]
+Hash: {a=1, b=2, c=3} 
[org.apache.freemarker.core.model.impl.TemplateHashModelAdapter]
 
 Values created in Java:
 LinkedList: [1, 2, 3] [java.util.LinkedList]

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes.txt
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes.txt
 
b/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes.txt
index 0208260..f1f2e1f 100644
--- 
a/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes.txt
+++ 
b/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/attributes.txt
@@ -60,8 +60,8 @@ String: s [java.lang.String]
 Number: 1 [java.math.BigDecimal]
 Boolean: true [java.lang.Boolean]
 Date-time: 2014-12-20T16:19:00Z [java.util.Date]
-Sequence: [1, 2, 3] [org.apache.freemarker.core.model.impl.SequenceAdapter]
-Hash: {a=1, b=2, c=3} [org.apache.freemarker.core.model.impl.HashAdapter]
+Sequence: [1, 2, 3] 
[org.apache.freemarker.core.model.impl.TemplateSequenceModelAdapter]
+Hash: {a=1, b=2, c=3} 
[org.apache.freemarker.core.model.impl.TemplateHashModelAdapter]
 
 Values created in Java:
 LinkedList: [1, 2, 3] [java.util.LinkedList]

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cae86e18/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TestUtils.java
----------------------------------------------------------------------
diff --git 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TestUtils.java 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TestUtils.java
index f338b27..c199bb9 100644
--- 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TestUtils.java
+++ 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TestUtils.java
@@ -1,6 +1,5 @@
 package org.apache.freemarker.test;
 
-import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
@@ -128,14 +127,14 @@ public final class TestUtils {
     }
 
     public static String listToString(List<?> list) {
-        return collectionToString("", list);
+        return iterableToString("", list);
     }
 
     public static String setToString(Set<?> list) {
-        return collectionToString("Set", list);
+        return iterableToString("Set", list);
     }
 
-    private static String collectionToString(String prefix, Collection<?> 
list) {
+    private static String iterableToString(String prefix, Iterable<?> list) {
         if (list == null) return "null";
 
         StringBuilder sb = new StringBuilder();

Reply via email to