Re: how to make freeMarker simply call toString?

Daniel Dekany <[email protected]> Sun, 30 Mar 2014 23:59:40 +0200
Newsgroups gmane.comp.web.freemarker.user
Message-ID <[email protected]>
Sunday, March 30, 2014, 9:38:35 PM, Vitaliy Semochkin wrote:

> Hello Dánie,
>
> You advise works great, thank you very much for the fast response!
>
> As for your question, I need it because I do not know the types of 
> variablles that arrive to my template.

What will consume that template output? The toString() of arbitrary
objects is meaningless for users (non-developer human beings) for
sure. It's also useless for other programs, as it's not even possible
to write code that reliably extracts data from the toString() of
standard collections and maps, as they don't quote the items or
anything like that. It's only good for debugging. Do you need this for
debugging maybe?

> My only option to display it is to follow the rule:
> When I have an expression ${someObject.someFieldOrPropertOrMethod} to be displayed
> in case it returns a primitive i want it to be cast to String via
> it's Wrapper class (Boolean, Float, etc)
> in case it is an object that overrides Object's toString() I want
> it to be displayed as a result of toString() execution.
> in case it is a sequence that does not override toString() (e.g
> array, list, set) I want it to be displayed as
> [value1.toString,...,valueN.toString]
> in case it is a Map that does not override toString I want it to be
> displayed as [{key1.toString(),value1.toString()..., ]
>
> Am I right that all I need to do, is to override BeansWrapper?

Yes, to ensure that all wrapped values that you want to print and
isn't a TemplateNumberModel or TemplateBooleanModel or
TemplateDateModel implements TemplateScalarModel, in the way that you
prefer, you will have to do that. Now, BeansWrapper is a quite complex
beast, so I'm not sure if it will be easy or not...

> Once again, thank you very much for supporting this great project
> and for a lighting fast response on Sunday  
>
> Regards,
> Vitaliy
>
>
>
>
>
>
> On Sun, Mar 30, 2014 at 6:35 PM, Daniel Dekany <[email protected]> wrote:
> Hello,
>
> The way it works currently is that if FreeMarker doesn't know how to
> make string out of a value (an FTL sequence or FTL hash in your case),
> it will check if the *wrapped* value (which is made by the
> ObjectWrapper from the plain Java object) implements
> TemplateScalarModel, and if it does, it will use that to generate the
> text to print. So, everything is possible with a custom ObjectWrapper.
>
> As of how to achieve this with an out-of-the box object wrapper...
> BeansWrapper does this if you don't
> beansWrapper.setSimpleMapWrapper(true) it, except for arrays, but the
> toString output of arrays is useless anyway. However, I wouldn't
> recommend setSimpleMapWrapper(false), because it mixes the method
> names with the keys in the map, which can get quite confusing.
>
> But maybe I can give a better answer (or an RFE...) if I know why is
> this needed. So why?
>
> --
> Thanks,
>  Daniel Dekany
>
>
> Sunday, March 30, 2014, 12:16:07 PM, Vitaliy Semochkin wrote:
>
>> Hello,
>>
>> I want to configure Freemarker
>> in order to make it replace
>>
>> every ${object}, ${object.someField}, ${object.someMethod()}
>> in my template with a toString value for the returned object.
>> Even if it is an array, list, map or collection.
>>
>> How to configure freemarkert in order to do so?
>>
>> Regards,
>> Vitaliy
>>
>
>

-- 
Thanks,
 Daniel Dekany


------------------------------------------------------------------------------