You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "Sergiu Dumitriu (JIRA)" <ji...@apache.org> on 2019/04/02 13:40:00 UTC

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

     [ https://issues.apache.org/jira/browse/VELOCITY-911?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sergiu Dumitriu closed VELOCITY-911.
------------------------------------
    Resolution: Not A Problem
      Assignee: Claude Brisson

> 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.0, 2.1
>            Reporter: M. Luppi
>            Assignee: Claude Brisson
>            Priority: Major
>         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|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