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 2021/03/03 12:07:49 UTC

[velocity-engine] branch master updated: Fix references alternate values implementation, with some more test cases

This is an automated email from the ASF dual-hosted git repository.

cbrisson pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/velocity-engine.git


The following commit(s) were added to refs/heads/master by this push:
     new dd9b724  Fix references alternate values implementation, with some more test cases
dd9b724 is described below

commit dd9b7242dc690b5dc341542087904b9606fa6a71
Author: Claude Brisson <cl...@renegat.net>
AuthorDate: Wed Mar 3 13:07:34 2021 +0100

    Fix references alternate values implementation, with some more test cases
---
 .../velocity/runtime/parser/node/ASTReference.java | 24 ++++++++++------------
 .../velocity/test/AlternateValuesTestCase.java     | 11 ++++++++++
 .../test/StrictAlternateValuesTestCase.java        | 16 +++++++++++++--
 3 files changed, 36 insertions(+), 15 deletions(-)

diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java
index 3d37c43..d4ddda9 100644
--- a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java
+++ b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java
@@ -308,15 +308,6 @@ public class ASTReference extends SimpleNode
 
             Object result = getRootVariableValue(context);
 
-            /* a reference which has been provided an alternate value
-             * is *knowingly* potentially null and should be accepted
-             * in strict mode (except if the alternate value is null)
-             */
-            if (astAlternateValue != null && (!DuckType.asBoolean(result, false)))
-            {
-                result = astAlternateValue.value(context);
-            }
-
             if (result == null && !strictRef)
             {
                 /*
@@ -332,6 +323,11 @@ public class ASTReference extends SimpleNode
                             rsvc.getParserConfiguration().getDollarChar() + rootString, null, null, uberInfo);
                 }
 
+                if (astAlternateValue != null && (!DuckType.asBoolean(result, true)))
+                {
+                    result = astAlternateValue.value(context);
+                }
+
                 return result;
             }
 
@@ -370,10 +366,6 @@ public class ASTReference extends SimpleNode
                     }
                     previousResult = result;
                     result = jjtGetChild(i).execute(result,context);
-                    if (astAlternateValue != null && (!DuckType.asBoolean(result, checkEmpty)))
-                    {
-                        result = astAlternateValue.value(context);
-                    }
                     if (result == null && !strictRef)  // If strict and null then well catch this
                                                        // next time through the loop
                     {
@@ -440,6 +432,12 @@ public class ASTReference extends SimpleNode
                     }
                 }
 
+                // Check alternate value at the end of the evaluation
+                if (astAlternateValue != null && (!DuckType.asBoolean(result, true)))
+                {
+                    result = astAlternateValue.value(context);
+                }
+
                 return result;
             }
             catch(MethodInvocationException mie)
diff --git a/velocity-engine-core/src/test/java/org/apache/velocity/test/AlternateValuesTestCase.java b/velocity-engine-core/src/test/java/org/apache/velocity/test/AlternateValuesTestCase.java
index 877b93a..a141c06 100644
--- a/velocity-engine-core/src/test/java/org/apache/velocity/test/AlternateValuesTestCase.java
+++ b/velocity-engine-core/src/test/java/org/apache/velocity/test/AlternateValuesTestCase.java
@@ -47,4 +47,15 @@ public class AlternateValuesTestCase extends BaseTestCase
         assertEvalEquals("<1.1>", "<${foo|1.1}>");
     }
 
+    public void testComplexEval()
+    {
+        assertEvalEquals("<no date tool>", "<${date.format('medium', $date.date)|'no date tool'}>");
+        assertEvalEquals("true", "#set($val=false)${val.toString().replace(\"false\", \"true\")|'so what'}");
+        assertEvalEquals("so what", "#set($foo='foo')${foo.contains('bar')|'so what'}");
+        assertEvalEquals("so what", "#set($val=false)${val.toString().contains('bar')|'so what'}");
+        assertEvalEquals("true", "#set($val=false)${val.toString().contains('false')|'so what'}");
+        assertEvalEquals("", "$!{null|$null}");
+        assertEvalEquals("null", "$!{null|'null'}");
+        assertEvalEquals("so what", "#set($spaces='   ')${spaces.trim()|'so what'}");
+    }
 }
diff --git a/velocity-engine-core/src/test/java/org/apache/velocity/test/StrictAlternateValuesTestCase.java b/velocity-engine-core/src/test/java/org/apache/velocity/test/StrictAlternateValuesTestCase.java
index d5c7ff4..36fe903 100644
--- a/velocity-engine-core/src/test/java/org/apache/velocity/test/StrictAlternateValuesTestCase.java
+++ b/velocity-engine-core/src/test/java/org/apache/velocity/test/StrictAlternateValuesTestCase.java
@@ -56,9 +56,21 @@ public class StrictAlternateValuesTestCase extends BaseTestCase
         assertEvalEquals("<foo>", "<${foo|'foo'}>");
         assertEvalEquals("bar", "#set($bar='bar')${foo|$bar}");
         assertEvalEquals("bar", "#set($bar='bar')${foo|${bar}}");
-        assertEvalException ("${foo.bar.baz()[5]|'hop'}", VelocityException.class);
+        assertEvalException("${foo.bar.baz()[5]|'hop'}", VelocityException.class);
         assertEvalEquals("{foo}", "{${foo|'foo'}}");
-        assertEvalException ("$foo", VelocityException.class);
+        assertEvalException("$foo", VelocityException.class);
+    }
+
+    public void testComplexEval()
+    {
+        assertEvalException("<${date.format('medium', $date.date)|'no date tool'}>", VelocityException.class);
+        assertEvalEquals("true", "#set($val=false)${val.toString().replace(\"false\", \"true\")|'so what'}");
+        assertEvalEquals("so what", "#set($foo='foo')${foo.contains('bar')|'so what'}");
+        assertEvalEquals("so what", "#set($val=false)${val.toString().contains('bar')|'so what'}");
+        assertEvalEquals("true", "#set($val=false)${val.toString().contains('false')|'so what'}");
+        assertEvalException("$!{null|$null}", VelocityException.class);
+        assertEvalEquals("null", "$!{null|'null'}");
+        assertEvalEquals("so what", "#set($spaces='   ')${spaces.trim()|'so what'}");
     }
 
 }