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;
     }