Re: [tools] Using java.text.MessageFormat in templates

Nathan Bubna <[email protected]> Fri, 21 Feb 2014 10:42:39 -0800
Newsgroups gmane.comp.jakarta.velocity.user
Message-ID <CAFyaDjF-WB42AegMpX3dsoBY==Ly-FNW-NZT0qia3arhqvSDaA@mail.gmail.com>
Yes, the conflict was intentional. The idea was that people using
VelocityStruts would default to using Struts' message support, so we should
default $text to use that. Whether that is still valid reasoning, i don't
know. I haven't used Struts in a very, very long time.


On Fri, Feb 21, 2014 at 10:17 AM, Christopher Schultz <
[email protected]> wrote:

> All,
>
> On 2/21/14, 12:48 PM, Christopher Schultz wrote:
> > All,
> >
> > I have a template where I'd like to take some text in a variable and do
> > parametric-replacement like new
> > MessageFormat("format").format(replacements) might do.
> >
> > I'm already using Velocity Tools/Struts to great effect with pre-defined
> > messages in properties files, but this data needs to come from a
> > database and I'd rather not pre-process the data in Java code unless
> > absolutely necessary.
> >
> > I've browsed through the tools available from Velocity Tools and I don't
> > really see anything that would meet my needs. I even looked at ClassTool
> > to see if I could instantiate an object through brute-force and it looks
> > like that is not possible.
> >
> > Is there a stock tool I can use, or will I have to write my own?
>
> Of course, as soon as I post, I find ResourceTool.render, which appears
> to do exactly what I want.
>
> I can see that while the Javadoc says the method signature is
> render(Object resource, Object[] args), Velocity treats it as a varargs
> call and so you need to do:
>
>    $text.render("format", arg, arg, arg)
>
>  instead of
>
>    $text.render("format", [arg, arg, arg])
>
> Use of the latter yields unfortunate results ;)
>
> Also, it looks like the default key for ResourceTool is "text", as I can
> see this during startup:
>
> INFO:  Velocity  [debug] Configuring factory with:
> FactoryConfiguration from 8 sources including 4 data with 3 toolboxes:
>  Toolbox 'application' with 1 properties [scope -auto-> application; ]
> and 17 tools:
>   Tool 'alternator' => org.apache.velocity.tools.generic.AlternatorTool
>   Tool 'class' => org.apache.velocity.tools.generic.ClassTool
> [...]
>   Tool 'text' => org.apache.velocity.tools.generic.ResourceTool
>
> ...but it conflicts with Velocity Struts, which re-defined the key:
>
>  Toolbox 'request' with 2 properties [scope -auto-> request; xhtml
> -auto-> true;
>  ] and 16 tools:
>   Tool 'context' => org.apache.velocity.tools.view.ViewContextTool
>   [...]
>   Tool 'text' => org.apache.velocity.tools.struts.MessageTool
>
> Since the "Struts" key is at a closer scope (request instead of
> application), it masks the definition at the application level. I can
> clearly re-name the ResourceTool's key, but I was wondering if it was
> intentional to have a tool key naming conflict there?
>
> Thanks,
> -chris
>
>