Re: Expression Handling Again

"Eric B. Ridge" <[email protected]> Thu, 22 Sep 2005 17:35:02 -0400
Newsgroups gmane.comp.java.webmacro.user
Message-ID <[email protected]>
On Sep 22, 2005, at 5:27 PM, Keats Kirsch wrote:

> Eric's method is nice.

It's also really fast.  On the order of 20% faster than communicating  
the value through the Context.  Which is important if you're doing  
this sort of thing over and over in web-requests.

eric

> 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
> _______________________________________________
> Webmacro-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/webmacro-user
>



-------------------------------------------------------
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