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