You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by cb...@apache.org on 2016/07/17 13:13:38 UTC
svn commit: r1753071 -
/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java
Author: cbrisson
Date: Sun Jul 17 13:13:38 2016
New Revision: 1753071
URL: http://svn.apache.org/viewvc?rev=1753071&view=rev
Log:
[engine] have #foreach honnor the Closeable interface on the iterator
Modified:
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java
Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java?rev=1753071&r1=1753070&r2=1753071&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java Sun Jul 17 13:13:38 2016
@@ -19,6 +19,7 @@ package org.apache.velocity.runtime.dire
* under the License.
*/
+import java.io.Closeable;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
@@ -164,13 +165,12 @@ public class Foreach extends Directive
/**
* Retrieve the contextual iterator.
*/
- protected Iterator getIterator(InternalContextAdapter context, Node node)
+ protected Iterator getIterator(Object iterable, Node node)
{
Iterator i = null;
/*
* do our introspection to see what our collection is
*/
- Object iterable = node.value(context);
if (iterable != null)
{
try
@@ -215,7 +215,9 @@ public class Foreach extends Directive
public boolean render(InternalContextAdapter context, Writer writer, Node node)
throws IOException
{
- Iterator i = getIterator(context, node.jjtGetChild(2));
+ Node iterableNode = node.jjtGetChild(2);
+ Object iterable = iterableNode.value(context);
+ Iterator i = getIterator(iterable, iterableNode);
if (i == null)
{
return false;
@@ -272,6 +274,13 @@ public class Foreach extends Directive
}
}
clean(context, o);
+ /*
+ * closes the iterator if it implements the Closeable interface
+ */
+ if (i != null && i instanceof Closeable && i != iterable) /* except if the iterable is the iterator itself */
+ {
+ ((Closeable)i).close();
+ }
return true;
}