freemarker-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Dekany (JIRA)" <>
Subject [jira] [Commented] (FREEMARKER-68) Double-question mark operator does not properly test for attributes
Date Fri, 11 Aug 2017 10:00:02 GMT


Daniel Dekany commented on FREEMARKER-68:

The problem is not specific to {{??}} actually. That way it works is that {{freemarker.ext.jython.JythonModel.get(String)}}
is called (which is just an implementation of {{TemplateHashModel.get(String)}} as far as
FreeMarker is concerned), and then if that returns {{null}} then {{??}} or the other existence
handlers operators (most notably {{exp!defaultExp}}) handle it. That particular {{get}} implementation
calls {{PyObject.__findattr__(key)}}, and if that returns {{null}} then it also tries {{PyObject.__finditem__(key)}}.
If both was {{null}}, then {{get}} returns {{null}}, and {{??}} works. I'm not sure what the
proper {{PyObject}} calls would be... And frankly, I think that the Jython wrapper is some
early implementation hastily dropped in back then by the earlier developers, maybe to catch
some attention from then much more active Jython community, but then it was practically abandoned.
But as its part of {{freemarker.jar}}, it stuck there for backward compatibility. So I can
imagine there's a lot to improve there. If anyone cares to improve it (or even create an external
wrapper that's better, as then there are no backward compatibility constraints), it's highly
welcome. Similarly here, it's not likely that anything will happen without a Pull Request
or patch, which also considers backward compatibility (means, certainly we will need to add
{{incompatibleImprovements}} setting to the {{JythonWrapper}}, similarly as {{DefaultObjectWrapper}}
has it too).

> Double-question mark operator does not properly test for attributes
> -------------------------------------------------------------------
>                 Key: FREEMARKER-68
>                 URL:
>             Project: Apache Freemarker
>          Issue Type: Bug
>          Components: engine
>    Affects Versions: 2.3.23
>            Reporter: Jason Sachs
> The double-question mark operator doesn't work properly with some Jython objects.
> It works properly with dicts.
> It does not work properly with custom classes and triggers an item lookup.
> Example setup: (I can't post a complete self-contained example, sorry)
> Jython code called before FreeMarker template is rendered:
> {code}
> class VoodooDoll(object):
>     def pinch(self):
>         return "ouch"
> model['test1'] = dict(voodooDoll=VoodooDoll())
> {code}
> FreeMarker template:
> {code}
> <#if test1.blah??>
> blah present
> </#if>
> <#if test1.voodooDoll??>
> voodoo doll present
> </#if>
> <#if test1.voodooDoll.pinch??>
> voodoo doll pinch present
> </#if>
> <#if test1.voodooDoll.hit??>
> voodoo doll hit present
> </#if>
> {code}
> This produces the output
> {noformat}
> voodoo doll present
> voodoo doll pinch present
> {noformat}
> so the first three {{#if}} tests work properly, but the fourth one causes this error:
> {noformat}
> 	- Failed at: #if test1.voodooDoll.hit??  [in template "source\\aux-files\\parameters.html.template"
at line 58, column 1]
> ...
> Caused by: TypeError: 'VoodooDoll' object is unsubscriptable
> 	at org.python.core.Py.TypeError(
> 	at org.python.core.PyObject.__finditem__(
> 	at org.python.core.PyObjectDerived.__finditem__(
> {noformat}

This message was sent by Atlassian JIRA

View raw message