aboutsummaryrefslogtreecommitdiff
path: root/velocity-engine-core/src
diff options
context:
space:
mode:
authorClaude Brisson <cbrisson@apache.org>2018-10-15 00:00:50 +0000
committerClaude Brisson <cbrisson@apache.org>2018-10-15 00:00:50 +0000
commit4d50cb534cb51f90059a8d4f62a4b7467fcd2e44 (patch)
treeb49e7309ce5fb392e087b63237fd05b0593a0f20 /velocity-engine-core/src
parentb6c294805b57913a304c53607dbf1b6b5b32d8c9 (diff)
downloadapache-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')
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Foreach.java25
-rw-r--r--velocity-engine-core/src/test/java/org/apache/velocity/test/TemplateTestCase.java2
-rw-r--r--velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.BC14
-rw-r--r--velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.LINES14
-rw-r--r--velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.NONE20
-rw-r--r--velocity-engine-core/src/test/resources/gobbling/compare/foreach_empty.vtl.STRUCTURED14
-rw-r--r--velocity-engine-core/src/test/resources/gobbling/foreach_empty.vtl26
-rw-r--r--velocity-engine-core/src/test/resources/templates/compare/foreach-array.cmp2
-rw-r--r--velocity-engine-core/src/test/resources/templates/compare/foreach-type.cmp7
-rw-r--r--velocity-engine-core/src/test/resources/templates/foreach-array.vm6
-rw-r--r--velocity-engine-core/src/test/resources/templates/foreach-type.vm28
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