Re: Expression Handling Again

Lane Sharman <[email protected]> Sun, 25 Sep 2005 07:50:48 -0700 (PDT)
Newsgroups gmane.comp.java.webmacro.user
Message-ID <[email protected]>
I think it would be better to actually make the code available
somewhere rather than hide it away on Wiki. Also, there's a few
things that should be done to that little function. Namely, caching
of StringTemplates.

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

You don't. It's a TemplateVisitor, not a ContextVisitor.

Eric: I will do this but I am not familiar with the TemplateVisitor usage. Is there an existing test case I can look at?

-Lane

eric

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