You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "M. Luppi (JIRA)" <ji...@apache.org> on 2019/04/01 15:26:01 UTC

[jira] [Created] (VELOCITY-911) Incorrect evaluation of IF-Directive for objects with isEmpty-method

M. Luppi created VELOCITY-911:
---------------------------------

             Summary: Incorrect evaluation of IF-Directive for objects with isEmpty-method
                 Key: VELOCITY-911
                 URL: https://issues.apache.org/jira/browse/VELOCITY-911
             Project: Velocity
          Issue Type: Bug
    Affects Versions: 2.1, 2.0
            Reporter: M. Luppi
         Attachments: VelocityIsEmptyBugMCVE.java, mcve-project.zip, template.vm

With Velocity 2.0 the logic of evaluation for IF-Directives changed and now uses an extended approach to determine whether it is true. This bug report only refers to the case where $foo is an +object+. The documentation for 2.0 and 2.1 state as follows:
{quote}The variable $foo is evaluated to determine whether it is true, which will happen under one of those circumstances: [...]
$foo is an object (other than a string, a number or a collection) which is not null

_Source: http://velocity.apache.org/engine/2.0/user-guide.html#if-elseif-else_
{quote}
After a long debugging session I have found that objects with a public isEmpty-method are not being handled according to the documentation cited above. Thereby, such objects are evaluated as false if there is an isEmpty-method that returns false. The correct evaluation result according to the documentation should be true since the object is not null and not a string, a number or a collection.

It gets even more confusing when we take access modifiers into account. If the access of the isEmpty-method is not public, the behaviour is as it should be. When we make it public, however, the above explained bug occurs in version 2.0 as well as 2.1.

See the attached classes and the template or the whole project of the MCVE (minimal, complete, and verifiable example) as ZIP.

The output of the test is as follows:
{code:java}
null object
-----------
[ OK ] Expected.


non-null object with isEmpty-method (public)
--------------------------------------------
isEmpty evaluates to true
[FAIL] Not expected since object is not null.

isEmpty evaluates to false
[ OK ] Expected.


non-null object with isEmpty-method (package-private)
-----------------------------------------------------
isEmpty evaluates to true
[ OK ] Expected.

isEmpty evaluates to false
[ OK ] Expected.
{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org