Hi all,

I just gave this a try by copying the whole `MessageContainer` class to my
project and using it like this:

final MessageContainer c = new MessageContainer("msg", "test.msg", false);
> c.add(new ExternalLink("link", Model.of("http://test.com";), new
> StringResourceModel("test.link")));
> add(c);


This fails with a NPE because the MessageContainer assumes, that it has to
use its parent component for resolving any nested components, because the
`<wicket:message/>` tag is not a container by itself:

Component component = getParent().get(id);
> if (component == null) {
> component = ComponentResolvers.resolve(getParent(), markupStream,
> currentTag, null);

        // Must not be a Page and it must be connected to a parent.
> if (component.getParent() == null) {
> component = null;
> }

}


When used with a `<wicket:container />` or a `<div wicket:id="myId"/>` the
tag component itself has to be used to resolve nested components. It is
possible to fix this by replacing all calls to `getParent()` with a custom
method that checks if the tag is a wicket message or some other element,
but it does not feel right.

I could go ahead with my local copy of MessageContainer and adjust it for
my project but it contains a lot of logic that has to be duplicated like
message interpolation and markup stream parsing.

I'd be willing to provide a PR if someone in the development team has any
suggestions on how to approach this.

Best,

Thomas



On Thu, Jul 25, 2019 at 9:17 AM Thomas Heigl <tho...@umschalt.com> wrote:

> Hi Martin,
>
> Sure. Currently I'm using <wicket:message> like described in the JavaDoc
> of WicketMessageResolver:
>
> Template:
>
>>   <wicket:message key="myKey">
>>         <span wicket:id="amount">[amount]</span>.
>>         <a wicket:id="link">
>>             <wicket:message key="linkText"/>
>>         </a>
>>    </wicket:message>
>
>
> Java:
>
>> add(new Label("amount", new Model<String>("$5.00")));
>> add(new BookmarkablePageLink<Void>("link", DetailsPage.class));
>
>
> i18n:
>
>> myKey=Your balance is ${amount}. Click ${link} to view the details.
>> linkText=here
>
>
> This works, but the key "myKey" cannot be changed during runtime. I'd like
> to use the private MessageContainer the same way I can use an
> EnclosureContainer:
>
> Template:
>
>>   <wicket:container wicket:id="msg">
>>         <span wicket:id="amount">[amount]</span>.
>>         <a wicket:id="link">
>>             <wicket:message key="linkText"/>
>>         </a>
>>    </wicket:container>
>
>
> Java:
>
>> final String key = "myKey";
>
> final MessageContainer msg = new MessageContainer("msg", key, true);
>
> msg.add(new Label("amount", new Model<String>("$5.00")));
>> msg.add(new BookmarkablePageLink<Void>("link", DetailsPage.class));
>
> add(msg);
>
>
> I hope that explains my requirement a bit better.
>
> Best,
>
>  Thomas
>
>
> On Thu, Jul 25, 2019 at 6:48 AM Martin Terra <
> martin.te...@koodaripalvelut.com> wrote:
>
>> Hi!
>>
>> Can you show an example of solution now vs. solution after change, what
>> are
>> the benefits of such visibility change to your case? Maybe there is
>> another
>> way to accomplish your goal?
>>
>> **
>> Martin
>>
>> ke 24. heinäk. 2019 klo 22.25 Thomas Heigl (tho...@umschalt.com)
>> kirjoitti:
>>
>> > Hi all,
>> >
>> > I'd like to create Wicket messages with child components
>> programatically.
>> > Currently, this is only possible by using the <wicket:message> tag and
>> > nesting components inside of it.
>> >
>> > For most use cases this is sufficient, but I sometimes come across cases
>> > where I'd like to programatically define the message key instead of
>> > hard-coding it in the template.
>> >
>> > The class that does all the interpolation is currently
>> > private:
>> > org.apache.wicket.markup.resolver.WicketMessageResolver.MessageContainer
>> >
>> > Would it be possible to make this a public (top-level) class in Wicket
>> 9?
>> > If I understand correctly, this would solve my requirement without any
>> > other code changes.
>> >
>> > Best regards,
>> >
>> > Thomas
>> >
>>
>

Reply via email to