Re: Simulating null parameters in macros

Daniel Dekany <[email protected]>
Newsgroups gmane.comp.web.freemarker.user
Message-ID <[email protected]>
Well, I have added tip for a minor improvement there... but really,
this whole null-mess will not be fixed without adding null support in
FreeMarker itself... which AFAIR can't be done without breaking BC.
/-:

-- 
Best regards,
 Daniel Dekany


Tuesday, July 5, 2011, 6:21:42 PM, Hinkle, Cameron wrote:

> I asked this question on Stack Overflow but no one seemed to have
> an answer for me.  Hoping someone here will:
> http://stackoverflow.com/questions/6553004/simulate-null-parameters-in-freemarker-macros
>  
> I'm building a site using Freemarker and have started heavily using
> macros. I know in Freemarker 2.3 that passing a null value into a
> macro as a parameter is equivalent to not passing a parameter at all
> so I've created a global variable called "null" to simulate null checking in my macros:
> <#assign null="NUL" />
> Now in my macros I can do this:
> <#maco doSomething param1=null>
>   <#if param1 != null>
>     <div>WIN!</div>
>   </#if>
> </#macro>
> The problem comes if I want to pass a parameter that isn't a
> scalar. For instance, passing a List (which in Freemarker is a
> SimpleSequence) to a macro and checking against my null keyword yields the error:
> freemarker.template.TemplateException: The only legal comparisons
> are between two numbers, two strings, or two dates. Left hand
> operand is a freemarker.template.SimpleSequence Right hand operand
> is a freemarker.template.SimpleScalar
> I took a look at the freemarker code and I can see the issue (ComparisonExpression.isTrue()):
> if(ltm instanceof TemplateNumberModel && rtm instanceof TemplateNumberModel) {
>   ...
> }
> else if(ltm instanceof TemplateDateModel && rtm instanceof TemplateDateModel) {
>   ...
> }
> else if(ltm instanceof TemplateScalarModel && rtm instanceof TemplateScalarModel) {
>   ...
> }
> else if(ltm instanceof TemplateBooleanModel && rtm instanceof TemplateBooleanModel) {
>   ...
> }
> // Here we handle compatibility issues
> else if(env.isClassicCompatible()) {
>   ...
> }
> else {
>   throw new TemplateException("The only legal comparisons...", env);
> }
> So the only solution I can think of is to set isClassicCompatible
> to true, which I think will call toString() on both objects and
> compare the result. However, the documentation specifically says
> anything relying on old features should be rewritten.
> My quesion is, is there a solution to this that doesn't rely on deprecated features?
>  
>  
> Thanks,
> Cameron
>  
> Cameron Hinkle  |  Senior Application Engineer  |  Nike DCIT  | 
> 503.532.3075  |  7. Evolve Immediately |
>  


------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.