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 2018/10/15 00:00:50 UTC

svn commit: r1843869 - in /velocity/engine/trunk/velocity-engine-core/src: main/java/org/apache/velocity/runtime/directive/ test/java/org/apache/velocity/test/ test/resources/gobbling/ test/resources/gobbling/compare/ test/resources/templates/ test/res...

Author: cbrisson
Date: Mon Oct 15 00:00:50 2018
New Revision: 1843869

URL: http://svn.apache.org/viewvc?rev=1843869&view=rev
Log:
[VELOCITY-903] #foreach #else #end ready

Added:
    velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC
    velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES
    velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE
    velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED
    velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl
Modified:
    velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java
    velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java
    velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp
    velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp
    velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-array.vm
    velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-type.vm

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=1843869&r1=1843868&r2=1843869&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 Mon Oct 15 00:00:50 2018
@@ -26,10 +26,8 @@ import org.apache.velocity.runtime.Runti
 import org.apache.velocity.runtime.RuntimeServices;
 import org.apache.velocity.runtime.parser.ParseException;
 import org.apache.velocity.runtime.parser.Token;
-import org.apache.velocity.runtime.parser.node.ASTReference;
-import org.apache.velocity.runtime.parser.node.Node;
+import org.apache.velocity.runtime.parser.node.*;
 import org.apache.velocity.runtime.parser.node.ParserTreeConstants;
-import org.apache.velocity.runtime.parser.node.SimpleNode;
 import org.apache.velocity.util.StringUtils;
 import org.apache.velocity.util.introspection.Info;
 
@@ -214,17 +212,30 @@ public class Foreach extends Directive
     public boolean render(InternalContextAdapter context, Writer writer, Node node)
         throws IOException
     {
+        // Get the block ast tree which is always the last child ...
+        Node block = node.jjtGetChild(node.jjtGetNumChildren()-1);
+
+        // ... except if there is an #else claude
+        Node elseBlock = null;
+        Node previous = node.jjtGetChild(node.jjtGetNumChildren()-2);
+        if (previous instanceof ASTBlock)
+        {
+            elseBlock = block;
+            block = previous;
+        }
+
         Node iterableNode = node.jjtGetChild(2);
         Object iterable = iterableNode.value(context);
         Iterator i = getIterator(iterable, iterableNode);
-        if (i == null)
+        if (i == null || !i.hasNext())
         {
+            if (elseBlock != null)
+            {
+                renderBlock(context, writer, elseBlock);
+            }
             return false;
         }
 
-        // Get the block ast tree which is always the last child
-        Node block = node.jjtGetChild(node.jjtGetNumChildren()-1);
-
         /*
          * save the element key if there is one
          */

Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java?rev=1843869&r1=1843868&r2=1843869&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java Mon Oct 15 00:00:50 2018
@@ -167,6 +167,7 @@ public class TemplateTestCase extends Ba
 
         Object[] oarr = { "a","b","c","d" } ;
         int intarr[] = { 10, 20, 30, 40, 50 };
+        int emptyarr[] = {};
 
         context.put( "collection", vec );
         context2.put("iterator", vec.iterator());
@@ -174,6 +175,7 @@ public class TemplateTestCase extends Ba
         context.put("obarr", oarr );
         context.put("enumerator", vec.elements());
         context.put("intarr", intarr );
+        context.put("emptyarr", emptyarr );
 
         // Add some Numbers
         context.put ("int1", 1000);

Added: velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC?rev=1843869&view=auto
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC (added)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC Mon Oct 15 00:00:50 2018
@@ -0,0 +1,14 @@
+      empty
+  
+~~~~  empty  ~~~~
+
+<table>
+  <tbody>
+    <tr>
+        <td>
+        nobody
+      </td>
+      </tr>
+  </tbody>
+</table>
+

Added: velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES?rev=1843869&view=auto
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES (added)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES Mon Oct 15 00:00:50 2018
@@ -0,0 +1,14 @@
+    empty
+
+~~~~  empty  ~~~~
+
+<table>
+  <tbody>
+    <tr>
+      <td>
+        nobody
+      </td>
+    </tr>
+  </tbody>
+</table>
+

Added: velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE?rev=1843869&view=auto
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE (added)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE Mon Oct 15 00:00:50 2018
@@ -0,0 +1,20 @@
+  
+    empty
+  
+
+~~~~  empty  ~~~~
+
+<table>
+  <tbody>
+
+    <tr>
+  
+      <td>
+        nobody
+      </td>
+  
+    </tr>
+
+  </tbody>
+</table>
+

Added: velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED?rev=1843869&view=auto
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED (added)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED Mon Oct 15 00:00:50 2018
@@ -0,0 +1,14 @@
+  empty
+
+~~~~  empty  ~~~~
+
+<table>
+  <tbody>
+<tr>
+  <td>
+nobody
+  </td>
+</tr>
+  </tbody>
+</table>
+

Added: velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl?rev=1843869&view=auto
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl (added)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl Mon Oct 15 00:00:50 2018
@@ -0,0 +1,26 @@
+  #foreach( $i in [])
+    $i
+  #else
+    empty
+  #end
+
+~~~~ #foreach($i in []) #else empty #end ~~~~
+
+<table>
+  <tbody>
+#foreach($row in [1..1])
+    <tr>
+  #foreach($col in [])
+      <td>
+        ghost
+      </td>
+  #else
+      <td>
+        nobody
+      </td>
+  #end
+    </tr>
+#end
+  </tbody>
+</table>
+

Modified: velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp?rev=1843869&r1=1843868&r2=1843869&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp (original)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp Mon Oct 15 00:00:50 2018
@@ -28,4 +28,6 @@ Choose among :
 
  $foo2 : bar
 
+-- Empty array
+  empty
 

Modified: velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp?rev=1843869&r1=1843868&r2=1843869&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp (original)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp Mon Oct 15 00:00:50 2018
@@ -7,11 +7,15 @@ Using a Object []
   c
   d
 
+  empty
+
 Using a Map
 
   this is from a hashtable!
   this is from a hashtable too!
 
+  this map was empty
+
 Using a Collection
 
   string1
@@ -22,6 +26,7 @@ Using an Iterator
   string1 
   string2 
 
+  empty
 
 Using an Enumeration
 
@@ -36,3 +41,5 @@ Using an array of primitives
   30
   40
   50
+
+  empty

Modified: velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-array.vm
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-array.vm?rev=1843869&r1=1843868&r2=1843869&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-array.vm (original)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-array.vm Mon Oct 15 00:00:50 2018
@@ -53,4 +53,10 @@ Choose among :
  \$foo2 : $i
 #end
 
+-- Empty array
+#foreach( $i in [] )
+  really?!
+#else
+  empty
+#end
 

Modified: velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-type.vm
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-type.vm?rev=1843869&r1=1843868&r2=1843869&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-type.vm (original)
+++ velocity/engine/trunk/velocity-engine-core/src/test/resources/templates/foreach-type.vm Mon Oct 15 00:00:50 2018
@@ -15,12 +15,24 @@ Using a Object []
   $i
 #end
 
+#foreach( $i in [])
+  $i
+#else
+  empty
+#end
+
 Using a Map
 
 #foreach( $i in $map )
   $i
 #end
 
+#foreach( $i in {} )
+  $i
+#else
+  this map was empty
+#end
+
 Using a Collection
 
 #foreach($i in $collection )
@@ -33,11 +45,19 @@ Using an Iterator
   $i 
 #end
 
+#set($emptyList = [])
+#foreach($i in $emptyList.iterator())
+  $i
+#else
+  empty
+#end
 
 Using an Enumeration
 
 #foreach($i in $enumerator)
   $i
+#else
+  error
 #end
 
 
@@ -45,4 +65,12 @@ Using an array of primitives
 
 #foreach( $i in $intarr )
   $i
+#else
+  error
+#end
+
+#foreach( $i in $emptyarr )
+  $i
+#else
+  empty
 #end