diff options
author | Claude Brisson <cbrisson@apache.org> | 2018-10-15 00:00:50 +0000 |
---|---|---|
committer | Claude Brisson <cbrisson@apache.org> | 2018-10-15 00:00:50 +0000 |
commit | 4d50cb534cb51f90059a8d4f62a4b7467fcd2e44 (patch) | |
tree | b49e7309ce5fb392e087b63237fd05b0593a0f20 /velocity-engine-core/src | |
parent | b6c294805b57913a304c53607dbf1b6b5b32d8c9 (diff) | |
download | apache-velocity-engine-4d50cb534cb51f90059a8d4f62a4b7467fcd2e44.tar.gz |
[VELOCITY-903] #foreach #else #end ready
git-svn-id: https://svn.apache.org/repos/asf/velocity/engine/trunk@1843869 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'velocity-engine-core/src')
11 files changed, 151 insertions, 7 deletions
diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java index 9334c3df..7356a3ae 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java @@ -26,10 +26,8 @@ import org.apache.velocity.runtime.RuntimeConstants; 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 */ diff --git a/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java b/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java index b30b57a4..bdf24cfc 100644 --- a/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java +++ b/velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java @@ -167,6 +167,7 @@ public class TemplateTestCase extends BaseTestCase implements TemplateTestBase 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 BaseTestCase implements TemplateTestBase context.put("obarr", oarr ); context.put("enumerator", vec.elements()); context.put("intarr", intarr ); + context.put("emptyarr", emptyarr ); // Add some Numbers context.put ("int1", 1000); diff --git a/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC b/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC new file mode 100644 index 00000000..77499bfa --- /dev/null +++ b/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC @@ -0,0 +1,14 @@ + empty + +~~~~ empty ~~~~ + +<table> + <tbody> + <tr> + <td> + nobody + </td> + </tr> + </tbody> +</table> + diff --git a/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES b/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES new file mode 100644 index 00000000..3a233d91 --- /dev/null +++ b/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES @@ -0,0 +1,14 @@ + empty + +~~~~ empty ~~~~ + +<table> + <tbody> + <tr> + <td> + nobody + </td> + </tr> + </tbody> +</table> + diff --git a/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE b/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE new file mode 100644 index 00000000..fde55f4d --- /dev/null +++ b/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE @@ -0,0 +1,20 @@ + + empty + + +~~~~ empty ~~~~ + +<table> + <tbody> + + <tr> + + <td> + nobody + </td> + + </tr> + + </tbody> +</table> + diff --git a/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED b/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED new file mode 100644 index 00000000..84dc126e --- /dev/null +++ b/velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED @@ -0,0 +1,14 @@ + empty + +~~~~ empty ~~~~ + +<table> + <tbody> +<tr> + <td> +nobody + </td> +</tr> + </tbody> +</table> + diff --git a/velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl b/velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl new file mode 100644 index 00000000..d2c81d17 --- /dev/null +++ b/velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl @@ -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> + diff --git a/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp b/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp index 95df95ed..8f325f34 100644 --- a/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp +++ b/velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp @@ -28,4 +28,6 @@ Choose among : $foo2 : bar +-- Empty array + empty diff --git a/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp b/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp index ce7fc2ee..2dcc3474 100644 --- a/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp +++ b/velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp @@ -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 diff --git a/velocity-engine-core/src/test/resources/templates/foreach-array.vm b/velocity-engine-core/src/test/resources/templates/foreach-array.vm index bb8eff39..371004d6 100644 --- a/velocity-engine-core/src/test/resources/templates/foreach-array.vm +++ b/velocity-engine-core/src/test/resources/templates/foreach-array.vm @@ -53,4 +53,10 @@ Choose among : \$foo2 : $i #end +-- Empty array +#foreach( $i in [] ) + really?! +#else + empty +#end diff --git a/velocity-engine-core/src/test/resources/templates/foreach-type.vm b/velocity-engine-core/src/test/resources/templates/foreach-type.vm index a484409e..6022884f 100644 --- a/velocity-engine-core/src/test/resources/templates/foreach-type.vm +++ b/velocity-engine-core/src/test/resources/templates/foreach-type.vm @@ -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 |