Re: Expression Handling Again

Keats Kirsch <[email protected]> Thu, 22 Sep 2005 17:27:25 -0400
Newsgroups gmane.comp.java.webmacro.user
Message-ID <[email protected]>
Eric's method is nice.  I do something similar (though less elegant) in 
the PropertiesDirective.  However for XML files there is a much simpler 
method that I sometimes use: just parse the XML file as a template 
before you parse the XML.  Works great.

You can use doubles in WMScript, but not natively with the built-in 
operators.  You can use the $Math tool and the casting functions, like 
$toDouble.

Keats

Dan Miller wrote:

>That method works great to get the result. One last
>thing, how come webmacro expressions do not return
>double. Is that historical? Now that we use a grammar
>and parser for WM can is it possible to expand
>expressions? 
>
>Thanks
>
>--- "Eric B. Ridge" <[email protected]> wrote:
>
>  
>
>>Rather than creating a StringMacro, create a
>>StringTemplate, with a  
>>mini-template of:
>>     #set $foo = $x + 1
>>
>>Then use a custom TemplateVisitor to pull out the
>>"SetValue" argument  
>>of the #set directive:
>>
>>     static class MyTemplateVisitor extends
>>TemplateVisitor {
>>         Object value;
>>
>>         public Object getValue() {
>>             return value;
>>         }
>>
>>         public void visitDirectiveArg(String
>>string, Object object) {
>>             // the #set directive has 2 arguments: 
>>"SetTarget" (LHS)
>>             // and "SetValue" (RHS).  We're only
>>interested in  
>>"SetValue"
>>             if (string.equals("SetValue")) {
>>                 value = object;
>>             }
>>         }
>>     }
>>
>>So, you're code will be something like:
>>
>>public Object evalExpression (Context context,
>>String expression) {
>>     StringTemplate tmpl =  new StringTemplate
>>(context.getBroker(),  
>>"#set $foo = " + expression);
>>     MyTemplateVisitor visitor = new
>>MyTemplateVisitor();
>>
>>     template.parse();
>>     template.accept(visitor);
>>
>>     Object value = visitor.getValue();
>>     if (value instanceof Maco) {
>>         return ((Macro) value).evaluate(_context);
>>     } else {
>>         return value;
>>     }
>>}
>>
>>Hope this helps.
>>
>>eric
>>
>>
>>
>>
>>
>>On Sep 22, 2005, at 12:22 PM, Dan Miller wrote:
>>
>>    
>>
>>>I guess what I was wondering about was using the
>>>      
>>>
>>api
>>    
>>
>>>directly stepping in before the #set places the
>>>      
>>>
>>result
>>    
>>
>>>into the context. I was looking into the src for
>>>PropertyMethod and trying to figure out how to get
>>>      
>>>
>>the
>>    
>>
>>>result.
>>>
>>>I am using webmacro throughout a webproject, and
>>>      
>>>
>>would
>>    
>>
>>>like to use similiar webmacro expression in xml
>>>      
>>>
>>files
>>    
>>
>>>which are read and processed. Thanks
>>>
>>>--- Keats Kirsch <[email protected]> wrote:
>>>
>>>
>>>      
>>>
>>>>AFAIK there are only two ways to get something
>>>>        
>>>>
>>out
>>    
>>
>>>>of a WM template
>>>>expansion -- capture the result of the expansion,
>>>>        
>>>>
>>or
>>    
>>
>>>>pull something from
>>>>the context.  Actually I suppose you could use
>>>>        
>>>>
>>the
>>    
>>
>>>>#bean directive to
>>>>create a "global" variable and then get it from
>>>>        
>>>>
>>the
>>    
>>
>>>>Broker.
>>>>
>>>>Maybe if you can explain your requirements we
>>>>        
>>>>
>>could
>>    
>>
>>>>think of a way of
>>>>doing what you want.
>>>>
>>>>Keats
>>>>
>>>>Dan Miller wrote:
>>>>
>>>>
>>>>        
>>>>
>>>>>The usage of the StringMacro to use the #set
>>>>>
>>>>>          
>>>>>
>>>>directive
>>>>
>>>>        
>>>>
>>>>>works great. I was wondering if there is
>>>>>          
>>>>>
>>anything
>>    
>>
>>>>>exposed to evaluate the expression without
>>>>>
>>>>>          
>>>>>
>>>>modifying
>>>>
>>>>        
>>>>
>>>>>the context.
>>>>>
>>>>>This works great, but I would like to leave the
>>>>>context as is, not adding new temp variables to
>>>>>          
>>>>>
>>the
>>    
>>
>>>>>context.
>>>>>
>>>>>Context ctx = new Context();
>>>>>ctx.put("val1", 1);
>>>>>ctx.put("val2", 155);
>>>>>Macro macro = null;
>>>>>macro = new StringMacro("#set $val = $val1 +
>>>>>
>>>>>          
>>>>>
>>>>$val2");
>>>>
>>>>        
>>>>
>>>>>macro.evaluate( ctx);
>>>>>Integer val = (Integer)ctx.get("val");
>>>>>
>>>>>
>>>>>I am looking forward to the 2.0 release.
>>>>>
>>>>>
>>>>>
>>>>>          
>>>>>
>>>>
>>>>
>>>>        
>>>>
>
>=== message truncated ===
>  
>




-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php