Author: cbrisson Date: Mon Feb 20 11:51:14 2017 New Revision: 1783746 URL: http://svn.apache.org/viewvc?rev=1783746&view=rev Log: [engine] testcase and literals behavior for emptycheck=false; reference should cache emptycheck for speed
Added: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyNoEmptyCheckTestCase.java - copied, changed from r1783739, velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyTestCase.java Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTFloatingPointLiteral.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIntegerLiteral.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMap.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTObjectArray.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTFloatingPointLiteral.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTFloatingPointLiteral.java?rev=1783746&r1=1783745&r2=1783746&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTFloatingPointLiteral.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTFloatingPointLiteral.java Mon Feb 20 11:51:14 2017 @@ -21,6 +21,7 @@ package org.apache.velocity.runtime.pars import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.exception.TemplateInitException; +import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.parser.Parser; import java.math.BigDecimal; @@ -115,7 +116,7 @@ public class ASTFloatingPointLiteral ext */ public boolean evaluate( InternalContextAdapter context) { - return !MathUtils.isZero(value); + return !rsvc.getBoolean(RuntimeConstants.CHECK_EMPTY_OBJECTS, true) || !MathUtils.isZero(value); } } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIntegerLiteral.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIntegerLiteral.java?rev=1783746&r1=1783745&r2=1783746&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIntegerLiteral.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIntegerLiteral.java Mon Feb 20 11:51:14 2017 @@ -21,6 +21,7 @@ package org.apache.velocity.runtime.pars import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.exception.TemplateInitException; +import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.parser.Parser; import java.math.BigInteger; @@ -112,6 +113,6 @@ public class ASTIntegerLiteral extends S */ public boolean evaluate( InternalContextAdapter context) { - return !MathUtils.isZero(value); + return !rsvc.getBoolean(RuntimeConstants.CHECK_EMPTY_OBJECTS, true) || !MathUtils.isZero(value); } } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMap.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMap.java?rev=1783746&r1=1783745&r2=1783746&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMap.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMap.java Mon Feb 20 11:51:14 2017 @@ -22,6 +22,7 @@ package org.apache.velocity.runtime.pars import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.TemplateInitException; +import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.parser.Parser; import java.util.LinkedHashMap; @@ -102,6 +103,6 @@ public class ASTMap extends SimpleNode */ public boolean evaluate( InternalContextAdapter context) { - return children != null && children.length > 0; + return !rsvc.getBoolean(RuntimeConstants.CHECK_EMPTY_OBJECTS, true) || children != null && children.length > 0; } } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTObjectArray.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTObjectArray.java?rev=1783746&r1=1783745&r2=1783746&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTObjectArray.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTObjectArray.java Mon Feb 20 11:51:14 2017 @@ -22,6 +22,7 @@ package org.apache.velocity.runtime.pars import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.TemplateInitException; +import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.parser.Parser; import java.util.ArrayList; @@ -93,6 +94,6 @@ public class ASTObjectArray extends Simp */ public boolean evaluate( InternalContextAdapter context) { - return children != null && children.length > 0; + return !rsvc.getBoolean(RuntimeConstants.CHECK_EMPTY_OBJECTS, true) || children != null && children.length > 0; } } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java?rev=1783746&r1=1783745&r2=1783746&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTReference.java Mon Feb 20 11:51:14 2017 @@ -72,6 +72,8 @@ public class ASTReference extends Simple private String morePrefix = ""; private String identifier = ""; + private boolean checkEmpty; + private String literal = null; /** @@ -169,6 +171,12 @@ public class ASTReference extends Simple logOnNull = rsvc.getBoolean(RuntimeConstants.RUNTIME_LOG_REFERENCE_LOG_INVALID, true); + /* + * whether to check for emptiness when evaluating + */ + checkEmpty = + rsvc.getBoolean(RuntimeConstants.CHECK_EMPTY_OBJECTS, true); + /** * In the case we are referencing a variable with #if($foo) or * #if( ! $foo) then we allow variables to be undefined and we @@ -579,7 +587,7 @@ public class ASTReference extends Simple } try { - return DuckType.asBoolean(value, rsvc.getBoolean(RuntimeConstants.CHECK_EMPTY_OBJECTS, true)); + return DuckType.asBoolean(value, checkEmpty); } catch(Exception e) { Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java?rev=1783746&r1=1783745&r2=1783746&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java Mon Feb 20 11:51:14 2017 @@ -348,7 +348,7 @@ public class ASTStringLiteral extends Si public boolean evaluate( InternalContextAdapter context) { String str = (String)value(context); - return str != null && !str.isEmpty(); + return str != null && (!rsvc.getBoolean(RuntimeConstants.CHECK_EMPTY_OBJECTS, true) || !str.isEmpty()); } } Copied: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyNoEmptyCheckTestCase.java (from r1783739, velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyTestCase.java) URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyNoEmptyCheckTestCase.java?p2=velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyNoEmptyCheckTestCase.java&p1=velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyTestCase.java&r1=1783739&r2=1783746&rev=1783746&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyTestCase.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IfEmptyNoEmptyCheckTestCase.java Mon Feb 20 11:51:14 2017 @@ -19,10 +19,13 @@ package org.apache.velocity.test; * under the License. */ +import org.apache.velocity.app.VelocityEngine; +import org.apache.velocity.runtime.RuntimeConstants; + import java.math.BigDecimal; import java.math.BigInteger; -import java.util.Collections; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -30,13 +33,19 @@ import java.util.TreeMap; /** * Used to check that empty values are properly handled in #if statements */ -public class IfEmptyTestCase extends BaseTestCase +public class IfEmptyNoEmptyCheckTestCase extends BaseTestCase { - public IfEmptyTestCase(final String name) + public IfEmptyNoEmptyCheckTestCase(final String name) { super(name); } + @Override + protected void setUpEngine(VelocityEngine engine) + { + engine.setProperty(RuntimeConstants.CHECK_EMPTY_OBJECTS, "false"); + } + protected void assertEmpty(Object obj) { context.put("obj", obj); @@ -52,54 +61,44 @@ public class IfEmptyTestCase extends Bas public void testNull() { assertEmpty(null); - assertEmpty(new NullAsString()); - assertEmpty(new NullAsNumber()); + assertNotEmpty(new NullAsString()); + assertNotEmpty(new NullAsNumber()); } public void testDataStructures() { - assertEmpty(Collections.emptyMap()); - assertEmpty(Collections.emptyList()); - assertEmpty(new Object[]{}); - List list = new ArrayList(); - list.add(1); - assertNotEmpty(list); - Map map = new TreeMap(); - map.put("foo", 1); - assertNotEmpty(map); + assertNotEmpty(Collections.emptyMap()); + assertNotEmpty(Collections.emptyList()); + assertNotEmpty(new Object[]{}); } public void testString() { - assertEmpty(""); - assertEmpty(new EmptyAsString()); - assertNotEmpty("hello"); + assertNotEmpty(""); + assertNotEmpty(new EmptyAsString()); } public void testNumber() { - assertEmpty(0); - assertEmpty(0L); - assertEmpty(0.0f); - assertEmpty(0.0); - assertEmpty(BigInteger.ZERO); - assertEmpty(BigDecimal.ZERO); - assertNotEmpty(1); - assertNotEmpty(1L); - assertNotEmpty(1.0f); - assertNotEmpty(1.0); - assertNotEmpty(BigInteger.ONE); - assertNotEmpty(BigDecimal.ONE); + assertNotEmpty(0); } public void testStringBuilder() { StringBuilder builder = new StringBuilder(); - assertEmpty(builder); - builder.append("yo"); assertNotEmpty(builder); } + public void testLiterals() + { + assertEvalEquals("", "#if( !0 )fail#end"); + assertEvalEquals("", "#if( !0.0 )fail#end"); + assertEvalEquals("", "#if( !'' )fail#end"); + assertEvalEquals("", "#if( !\"\" )fail#end"); + assertEvalEquals("", "#if( ![] )fail#end"); + assertEvalEquals("", "#if( !{} )fail#end"); + } + public static class NullAsString { public String getAsString()