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();
