Re: Expression Handling Again

Lane Sharman <[email protected]> Fri, 23 Sep 2005 09:45:26 -0700 (PDT)
Newsgroups gmane.comp.java.webmacro.user
Message-ID <[email protected]>
ebr:

this is cool. could you cut and paste this into a wiki page:

AccessingContextValues

Also, how do you use the Visitor to get a random value in the context?

-Lane

--- "Eric B. Ridge" <[email protected]> wrote:

From: "Eric B. Ridge" <[email protected]>
Date: Thu, 22 Sep 2005 17:35:02 -0400
To: [email protected]
Subject: Re: [WebMacro-user] Expression Handling Again

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