Stringtemplate compare strings does not work
Asked Answered
T

2

6

Can someone explain why this does not work ?

StringTemplate query = new StringTemplate("hello " +  
                "$if(param==\"val1\")$" +  
                " it works! " +  
                "$endif$ " +  
                "world");  
        query.setAttribute("param", "val1");  
        System.out.println("result: "+query.toString());  

It throws

eval tree parse error :0:0: unexpected end of subtree at org.antlr.stringtemplate.language.ActionEvaluator.ifCondition(ActionEvaluator.java:815) at org.antlr.stringtemplate.language.ConditionalExpr.write(ConditionalExpr.java:99)

Tetracaine answered 16/11, 2010 at 15:34 Comment(0)
N
12

ST doesn't allow computation in the templates. That would make it part of the model.

Niphablepsia answered 16/11, 2010 at 16:5 Comment(6)
It seriously boggles my mind how people can find StringTemplate, read enough about it to create a sample example, yet not grasp its single most important strength.Condemnation
It's hard to say whether it's really strength or weakness. It's easy to see why this isn't so obvious though: other templating engines have it. And check for equality isn't much of a "computation", plus there are conditionals in string template anyway.Headlight
conditionals only test presence or absence, not value. huge diff in terms of model-view separation.Niphablepsia
"conditionals only test presence or absence, not value" Wrong - they do test boolean conditions for value, not just presence of any boolean value.Headlight
doesn't iterating over a list or map do calculations on the template ( like size) ?Buckshot
The key difference is there is no user-defined computations allowed :)Niphablepsia
H
5

You can't compare strings inside stringtemplate, unfortunately, but you can send a result of such a comparison into template as a parameter:

StringTemplate query = new StringTemplate("hello " +  
                "$if(paramEquals)$" +  
                " it works! " +  
                "$endif$ " +  
                "world");  
        query.setAttribute("paramEquals", param.equals("val1"));  
        System.out.println("result: "+query.toString());

It might not be what you're looking for, since every time you need to add a comparison you have to pass an extra parameter, and for loops it's even worse. But this is one workaround that may work for simple cases.

Headlight answered 4/7, 2012 at 11:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.