On Mon, Jun 7, 2021 at 5:38 AM Numa Schmeder <n...@dfacto.ch> wrote:

> Hi Thiago,
>

Hello!


> Thank you for your feedback, yes indeed, I have checked the code of the
> property binding and the antler syntax.
> Indeed it compiles byte code based on real method signature, so you can’t
> be to generic or it won’t find the method you have written.


And that's exactly how Tapestry voids runtime reflection so property access
is as fast as handwritten code. :)


> I was actually thinking of implementing Spring Expression Language (SpEL),
> OGNL is getting a bit outdated and is now longer evolving.


Interesting! Planning to opensource it when it's done? It would be nice.


> Although I figured out my language issue, if you don’t call
> PersistentLocale on first render, URL won’t contain the locale virtual
> folder in the path.
> I think this is a bug, the natural behavior seems to be if you define
> multiple locales, on first render without local (index page for example) it
> should select the appropriate locale from request, browser etc.. (this
> works) and set it with persistentLocale, so links should be written
> correctly with the locale virtual folder. What do you think ?
>

Hmm, I have to think about this one. No ready-made answers like the other
ones in this thread. :)


> Lastly I wanted to override a value encoder for specific hibernate objects
> to create SEO friendly urls , but it was discarded because there is already
> an hibernate value encoder registered with tapestry hibernate, how can I
> override it for specific objects ?
>

ValueEncoderSource is a service with a mapped configuration: key is the
class of the object being encoded/decoded, ValueEncoderFactory (which is
usually implemented together with ValueEncoder in most but not all cases),
so this should be a very straightforward Tapestry-IoC service contribution
override. I'm not sure how you tried to do your override.


> Your help is very much appreciated.


It's always nice to help people, doubly if it's about Tapestry. :D


>
>
> Thank you.
>
> Best regards,
>
> Numa
>
> > Le 6 juin 2021 à 21:09, Thiago H. de Paula Figueiredo <
> thiag...@gmail.com> a écrit :
> >
> > On Wed, May 26, 2021 at 7:00 AM Numa Schmeder <n...@dfacto.ch <mailto:
> n...@dfacto.ch>> wrote:
> >
> >> Hello,
> >>
> >
> > Hello!
> >
> >
> >> It seems method with varargs doesn’t work with property expression.
> >> If I put the following property expression, I get an error: Message
> >> doesn’t have a public “format" method.
> >> ${messages.format('priceFromPerGuest', travelMinPricePerGuest,
> >> displayedCurrency)}
> >> But If I write it as follow is works:
> >> messages.format('priceFromPerGuest', [travelMinPricePerGuest,
> >> displayedCurrency])
> >>
> >> Is this a bug ?
> >>
> >
> > I don't think so. Varargs, as far as I know, are implemented in Java
> purely
> > as a compiler feature, and Tapestry prop binding expressions work at
> > runtime, so it only sees method(arg, Object[] varargs) for something
> > declared as method(arg1, Object... varargs).
> >
> >
> >> Tapestry property expression is a bit limiting, particularly in
> conditions
> >> where you can’t have logical expression as:  test=“size > 10”
> >>
> >
> > Let me be pedantic here. :) Yes, it's the prop binding, short for
> property.
> > Being based on properties, it can be very fast, since Tapestry-IoC and
> > Tapestry can create code that calls properties without using reflection.
> > This binding was never supposed to have logical expressions.
> >
> >
> >> I know the rational is to keep property expression as simple as
> possible,
> >> but having some logic expressed in the template is not that bad,
> >
> >
> > Having logic expressed in the template is completely against the way the
> > prop binding was created and implemented, so I suggest you to not try or
> > want to do something one given tool doesn't want.
> >
> >
> >> because it’s in context ans sometimes makes more sense than having
> >> everything in java code.
> >
> >
> > Here comes one of the beauties of Tapestry: it's incredibly flexible and
> > customizable. You can create your own bindings with any logic you want!
> If
> > you don't know how, please let us know and we'll show you how.
> >
> > By the way, ChenilleKit, a third-party Tapestry add-on library, provides
> an
> > OGNL binding that provides a lot of expression power (but uses reflection
> > at runtime).
> >
> >
> >> Also if you work a lot with collection of objects, you have to create a
> >> property for each type of element in the collections, the “var” keyword
> is
> >> not powerful to be used in complex property expressions.
> >> Exemple, this won’t work, but it would be very practical:
> >> <t:loop source=“countries” value=“var:country”>
> >>        ${var:country.getName(locale)} - ${getPopulation(var:country)}
> >> </t:loop>
> >>
> >> And if you use a generic property tempValue that you could reuse in
> >> different places, it won’t work because all conduits will be based on
> the
> >> Object Type and not Country type.
> >>
> >> @Property
> >> Object tempValue
> >>
> >> <t:loop source=“countries” value=“var: tempValue”>
> >>        ${tempValue.getName(locale)} - ${getPopulation(tempValue)}
> >> </t:loop>
> >>
> >> Could we find a solution to avoir creating a lot of fields for all
> loops ?
> >>
> >
> > The var binding only really accepts strings well because it doesn't use
> > reflection and being able to support arbitrary types would need
> reflection.
> >
> >
> >>
> >> Thank you for your help,
> >>
> >> Best!
> >>
> >>
> >>  <http://www.dfacto.ch/ <http://www.dfacto.ch/>>       Numa Schmeder
>   www.dfacto.ch <http://www.dfacto.ch/>  <
> >> http://www.dfacto.ch/ <http://www.dfacto.ch/>>
> >> n...@dfacto.ch <mailto:n...@dfacto.ch> <mailto:n...@dfacto.ch <mailto:
> n...@dfacto.ch>>   |   M +41 79 538 30 01
> >>
> >> DIGITAL STRATEGY   |   DESIGN   |   DEVELOPMENT
> >>
> >>
> >>
> >>
> >>
> >
> > --
> > Thiago
>
>

-- 
Thiago

Reply via email to