You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Martin Grigorov <mg...@apache.org> on 2010/12/04 11:39:05 UTC

Re: getMarkupIdFromMarkup problem

Hi,

I am not sure whether this should be a concern.
Before having Component#getMarkupIdFromMarkup() it was possible to have such
code:

public MyPanel(String id) {
super(id);

WebMarkupContainer a = new WebMarkupContainer("a");
add(a);
 WebMarkupContainer b = new WebMarkupContainer("b");
add(b);
 b.add(new SimpleAttributeModifier("aId", a.getMarkupId()));
}

Now such usage of a.getMarkupId() is no more possible. It should be wrapped
in dynamic model.
Not a big deal but it shows that the new feature breaks old code.


On Thu, Nov 25, 2010 at 5:17 PM, Martin Grigorov <mg...@apache.org>wrote:

> https://issues.apache.org/jira/browse/WICKET-3197
>  <https://issues.apache.org/jira/browse/WICKET-3197>have fun ;-)
>
>
> On Thu, Nov 25, 2010 at 4:58 PM, Juergen Donnerstag <
> juergen.donnerstag@gmail.com> wrote:
>
>> >This means .addOrReplace() cannot be used in Page constructor, even
>> >indirectly.
>> Please provide a test case and I'll have a look.
>>
>> >Can we add some check in
>> org.apache.wicket.Component.getMarkupIdFromMarkup()
>> >so that it immediately returns 'null' if the markup is not available ?
>> We could but I don't like the idea. The name implies that needs access
>> to the markup. If markup is not available that clearly is an error =>
>> exception
>>
>> >org.apache.wicket.Component.onMarkupAttached() doesn't set any flag that
>> the
>> >markup is available.
>> Doesn't need to. The process make sure it's called only once (I hope).
>>
>> >If we use this approach then we will have to add javadoc line to this
>> method
>> >that it works only when the markup is available.
>> good point.
>>
>> I agree the issue probably is with addOrReplace(). I don't think I
>> added any testcase for that. But I'm happy to look after if you could
>> provide a (failing) testcase
>>
>> Juergen
>>
>>
>> On Thu, Nov 25, 2010 at 4:34 PM, Martin Grigorov <mg...@apache.org>
>> wrote:
>> > Quick and dirty workaround to be able to run the app:
>> >
>> > if (getFlag(FLAG_INITIALIZED) && parent != null)
>> > { /* the current body of getMarkupIdFromMarkup() */ }
>> > return null;
>> >
>> > On Thu, Nov 25, 2010 at 4:28 PM, Martin Grigorov <mgrigorov@apache.org
>> >wrote:
>> >
>> >> My app is not happy with this new method. I guess other apps will
>> complain
>> >> too.
>> >>
>> >> Moved the code to onInitialize() and now the new exception is:
>> >>
>> >> org.apache.wicket.markup.MarkupException: Can not determine Markup.
>> >> Component is not yet connected to a parent. [WebMarkupContainer
>> [Component
>> >> id = applyTable]]
>> >> at org.apache.wicket.Component.getMarkup(Component.java:717)
>> >> at org.apache.wicket.Component.getMarkupTag(Component.java:1438)
>> >> at
>> org.apache.wicket.Component.getMarkupIdFromMarkup(Component.java:849)
>> >> at org.apache.wicket.Component.getMarkupIdImpl(Component.java:1484)
>> >> at org.apache.wicket.MarkupContainer.replace(MarkupContainer.java:807)
>> >> at
>> org.apache.wicket.MarkupContainer.addOrReplace(MarkupContainer.java:239)
>> >>  at
>> com.fredhopper.bm.layout.ControlPanel.setOnApply(ControlPanel.java:192)
>> >> at com.fredhopper.bm.layout.TopPanel.setOnApply(TopPanel.java:67)
>> >> at
>> >>
>> com.fredhopper.bm.pages.search.SynonymsPage.<init>(SynonymsPage.java:123)
>> >> ......
>> >>
>> >> This means .addOrReplace() cannot be used in Page constructor, even
>> >> indirectly.
>> >> Can we add some check in
>> >> org.apache.wicket.Component.getMarkupIdFromMarkup() so that it
>> immediately
>> >> returns 'null' if the markup is not available ?
>> >> org.apache.wicket.Component.onMarkupAttached() doesn't set any flag
>> that
>> >> the markup is available.
>> >> If we use this approach then we will have to add javadoc line to this
>> >> method that it works only when the markup is available.
>> >>
>> >> On Wed, Nov 24, 2010 at 10:32 PM, Juergen Donnerstag <
>> >> juergen.donnerstag@gmail.com> wrote:
>> >>
>> >>> Excepted is:
>> >>> - if a component provides its own markup either via subclassing
>> >>> getMarkup() or is expected to have associated markup (e.g. Panel) =>
>> >>> markup available in ctor
>> >>> - Component.onMarkupAttached() is invoked as soon as the markup is
>> >>> available. E.g. a child to a Panel. child.onMarkupAttached() is
>> >>> invoked when child gets added to panel
>> >>> - onInitialize() gets called once a path to the Page is available
>> >>>
>> >>> Juergen
>> >>>
>> >>> On Wed, Nov 24, 2010 at 10:06 PM, Martin Grigorov <
>> mgrigorov@apache.org>
>> >>> wrote:
>> >>> > Hi,
>> >>> >
>> >>> > I just updated my app to latest 1.5 and the following exception
>> >>> happened:
>> >>> >
>> >>> > org.apache.wicket.WicketRuntimeException: No Page found for
>> component
>> >>> > [ShortcutsPanel [Component id = componentItem]]
>> >>> > at org.apache.wicket.Component.getPage(Component.java:1787)
>> >>> > at
>> >>>
>> org.apache.wicket.MarkupContainer.getMarkupType(MarkupContainer.java:531)
>> >>> > at
>> >>> >
>> >>>
>> org.apache.wicket.MarkupContainer.getAssociatedMarkup(MarkupContainer.java:441)
>> >>> > at
>> >>> >
>> >>>
>> org.apache.wicket.markup.html.panel.Panel$PanelMarkupHelper.getMarkup(Panel.java:166)
>> >>> > at
>> org.apache.wicket.markup.html.panel.Panel.getMarkup(Panel.java:142)
>> >>> > at org.apache.wicket.Component.getMarkup(Component.java:722)
>> >>> > at org.apache.wicket.Component.getMarkupTag(Component.java:1436)
>> >>> > at
>> org.apache.wicket.Component.getMarkupIdFromMarkup(Component.java:847)
>> >>> > <<<<<<<<<<<< new
>> >>> > at org.apache.wicket.Component.getMarkupIdImpl(Component.java:1482)
>> >>> > at org.apache.wicket.Component.getMarkupId(Component.java:1537)
>> >>> > at org.apache.wicket.Component.getMarkupId(Component.java:1599)
>> >>> > at
>> >>> >
>> >>>
>> com.fredhopper.bm.components.savedsearches.ShortcutsPanel.<init>(ShortcutsPanel.java:184)
>> >>> > ....
>> >>> >
>> >>> > In ShortcutsPanel's ctor we need to get the markupId of one of the
>> >>> > components in this Panel ...
>> >>> > I know that if I move the code to onInitialize() then everything
>> will be
>> >>> OK,
>> >>> > but I wanted to discuss with you whether the new behavior is OK for
>> 1.5.
>> >>> >
>> >>>
>> >>
>> >>
>> >
>>
>
>

Re: getMarkupIdFromMarkup problem

Posted by Martin Grigorov <mg...@apache.org>.
Here is a quickstart.

I replaced SimpleAttributeModifier with AttributeModifier backed by
AbstractReadOnlyModel and my app is back in the game :-)

On Sat, Dec 4, 2010 at 12:08 PM, Juergen Donnerstag <
juergen.donnerstag@gmail.com> wrote:

> I don't think you are right. Your example will will.  The error only
> occured with addOrReplace() and only if a component was replaced.
>
> Juergen
>
> On Sat, Dec 4, 2010 at 11:39 AM, Martin Grigorov <mg...@apache.org>
> wrote:
> > Hi,
> >
> > I am not sure whether this should be a concern.
> > Before having Component#getMarkupIdFromMarkup() it was possible to have
> such
> > code:
> >
> > public MyPanel(String id) {
> > super(id);
> >
> > WebMarkupContainer a = new WebMarkupContainer("a");
> > add(a);
> >  WebMarkupContainer b = new WebMarkupContainer("b");
> > add(b);
> >  b.add(new SimpleAttributeModifier("aId", a.getMarkupId()));
> > }
> >
> > Now such usage of a.getMarkupId() is no more possible. It should be
> wrapped
> > in dynamic model.
> > Not a big deal but it shows that the new feature breaks old code.
> >
> >
> > On Thu, Nov 25, 2010 at 5:17 PM, Martin Grigorov <mgrigorov@apache.org
> >wrote:
> >
> >> https://issues.apache.org/jira/browse/WICKET-3197
> >>  <https://issues.apache.org/jira/browse/WICKET-3197>have fun ;-)
> >>
> >>
> >> On Thu, Nov 25, 2010 at 4:58 PM, Juergen Donnerstag <
> >> juergen.donnerstag@gmail.com> wrote:
> >>
> >>> >This means .addOrReplace() cannot be used in Page constructor, even
> >>> >indirectly.
> >>> Please provide a test case and I'll have a look.
> >>>
> >>> >Can we add some check in
> >>> org.apache.wicket.Component.getMarkupIdFromMarkup()
> >>> >so that it immediately returns 'null' if the markup is not available ?
> >>> We could but I don't like the idea. The name implies that needs access
> >>> to the markup. If markup is not available that clearly is an error =>
> >>> exception
> >>>
> >>> >org.apache.wicket.Component.onMarkupAttached() doesn't set any flag
> that
> >>> the
> >>> >markup is available.
> >>> Doesn't need to. The process make sure it's called only once (I hope).
> >>>
> >>> >If we use this approach then we will have to add javadoc line to this
> >>> method
> >>> >that it works only when the markup is available.
> >>> good point.
> >>>
> >>> I agree the issue probably is with addOrReplace(). I don't think I
> >>> added any testcase for that. But I'm happy to look after if you could
> >>> provide a (failing) testcase
> >>>
> >>> Juergen
> >>>
> >>>
> >>> On Thu, Nov 25, 2010 at 4:34 PM, Martin Grigorov <mgrigorov@apache.org
> >
> >>> wrote:
> >>> > Quick and dirty workaround to be able to run the app:
> >>> >
> >>> > if (getFlag(FLAG_INITIALIZED) && parent != null)
> >>> > { /* the current body of getMarkupIdFromMarkup() */ }
> >>> > return null;
> >>> >
> >>> > On Thu, Nov 25, 2010 at 4:28 PM, Martin Grigorov <
> mgrigorov@apache.org
> >>> >wrote:
> >>> >
> >>> >> My app is not happy with this new method. I guess other apps will
> >>> complain
> >>> >> too.
> >>> >>
> >>> >> Moved the code to onInitialize() and now the new exception is:
> >>> >>
> >>> >> org.apache.wicket.markup.MarkupException: Can not determine Markup.
> >>> >> Component is not yet connected to a parent. [WebMarkupContainer
> >>> [Component
> >>> >> id = applyTable]]
> >>> >> at org.apache.wicket.Component.getMarkup(Component.java:717)
> >>> >> at org.apache.wicket.Component.getMarkupTag(Component.java:1438)
> >>> >> at
> >>> org.apache.wicket.Component.getMarkupIdFromMarkup(Component.java:849)
> >>> >> at org.apache.wicket.Component.getMarkupIdImpl(Component.java:1484)
> >>> >> at
> org.apache.wicket.MarkupContainer.replace(MarkupContainer.java:807)
> >>> >> at
> >>>
> org.apache.wicket.MarkupContainer.addOrReplace(MarkupContainer.java:239)
> >>> >>  at
> >>> com.fredhopper.bm.layout.ControlPanel.setOnApply(ControlPanel.java:192)
> >>> >> at com.fredhopper.bm.layout.TopPanel.setOnApply(TopPanel.java:67)
> >>> >> at
> >>> >>
> >>>
> com.fredhopper.bm.pages.search.SynonymsPage.<init>(SynonymsPage.java:123)
> >>> >> ......
> >>> >>
> >>> >> This means .addOrReplace() cannot be used in Page constructor, even
> >>> >> indirectly.
> >>> >> Can we add some check in
> >>> >> org.apache.wicket.Component.getMarkupIdFromMarkup() so that it
> >>> immediately
> >>> >> returns 'null' if the markup is not available ?
> >>> >> org.apache.wicket.Component.onMarkupAttached() doesn't set any flag
> >>> that
> >>> >> the markup is available.
> >>> >> If we use this approach then we will have to add javadoc line to
> this
> >>> >> method that it works only when the markup is available.
> >>> >>
> >>> >> On Wed, Nov 24, 2010 at 10:32 PM, Juergen Donnerstag <
> >>> >> juergen.donnerstag@gmail.com> wrote:
> >>> >>
> >>> >>> Excepted is:
> >>> >>> - if a component provides its own markup either via subclassing
> >>> >>> getMarkup() or is expected to have associated markup (e.g. Panel)
> =>
> >>> >>> markup available in ctor
> >>> >>> - Component.onMarkupAttached() is invoked as soon as the markup is
> >>> >>> available. E.g. a child to a Panel. child.onMarkupAttached() is
> >>> >>> invoked when child gets added to panel
> >>> >>> - onInitialize() gets called once a path to the Page is available
> >>> >>>
> >>> >>> Juergen
> >>> >>>
> >>> >>> On Wed, Nov 24, 2010 at 10:06 PM, Martin Grigorov <
> >>> mgrigorov@apache.org>
> >>> >>> wrote:
> >>> >>> > Hi,
> >>> >>> >
> >>> >>> > I just updated my app to latest 1.5 and the following exception
> >>> >>> happened:
> >>> >>> >
> >>> >>> > org.apache.wicket.WicketRuntimeException: No Page found for
> >>> component
> >>> >>> > [ShortcutsPanel [Component id = componentItem]]
> >>> >>> > at org.apache.wicket.Component.getPage(Component.java:1787)
> >>> >>> > at
> >>> >>>
> >>>
> org.apache.wicket.MarkupContainer.getMarkupType(MarkupContainer.java:531)
> >>> >>> > at
> >>> >>> >
> >>> >>>
> >>>
> org.apache.wicket.MarkupContainer.getAssociatedMarkup(MarkupContainer.java:441)
> >>> >>> > at
> >>> >>> >
> >>> >>>
> >>>
> org.apache.wicket.markup.html.panel.Panel$PanelMarkupHelper.getMarkup(Panel.java:166)
> >>> >>> > at
> >>> org.apache.wicket.markup.html.panel.Panel.getMarkup(Panel.java:142)
> >>> >>> > at org.apache.wicket.Component.getMarkup(Component.java:722)
> >>> >>> > at org.apache.wicket.Component.getMarkupTag(Component.java:1436)
> >>> >>> > at
> >>> org.apache.wicket.Component.getMarkupIdFromMarkup(Component.java:847)
> >>> >>> > <<<<<<<<<<<< new
> >>> >>> > at
> org.apache.wicket.Component.getMarkupIdImpl(Component.java:1482)
> >>> >>> > at org.apache.wicket.Component.getMarkupId(Component.java:1537)
> >>> >>> > at org.apache.wicket.Component.getMarkupId(Component.java:1599)
> >>> >>> > at
> >>> >>> >
> >>> >>>
> >>>
> com.fredhopper.bm.components.savedsearches.ShortcutsPanel.<init>(ShortcutsPanel.java:184)
> >>> >>> > ....
> >>> >>> >
> >>> >>> > In ShortcutsPanel's ctor we need to get the markupId of one of
> the
> >>> >>> > components in this Panel ...
> >>> >>> > I know that if I move the code to onInitialize() then everything
> >>> will be
> >>> >>> OK,
> >>> >>> > but I wanted to discuss with you whether the new behavior is OK
> for
> >>> 1.5.
> >>> >>> >
> >>> >>>
> >>> >>
> >>> >>
> >>> >
> >>>
> >>
> >>
> >
>

Re: getMarkupIdFromMarkup problem

Posted by Juergen Donnerstag <ju...@gmail.com>.
I don't think you are right. Your example will will.  The error only
occured with addOrReplace() and only if a component was replaced.

Juergen

On Sat, Dec 4, 2010 at 11:39 AM, Martin Grigorov <mg...@apache.org> wrote:
> Hi,
>
> I am not sure whether this should be a concern.
> Before having Component#getMarkupIdFromMarkup() it was possible to have such
> code:
>
> public MyPanel(String id) {
> super(id);
>
> WebMarkupContainer a = new WebMarkupContainer("a");
> add(a);
>  WebMarkupContainer b = new WebMarkupContainer("b");
> add(b);
>  b.add(new SimpleAttributeModifier("aId", a.getMarkupId()));
> }
>
> Now such usage of a.getMarkupId() is no more possible. It should be wrapped
> in dynamic model.
> Not a big deal but it shows that the new feature breaks old code.
>
>
> On Thu, Nov 25, 2010 at 5:17 PM, Martin Grigorov <mg...@apache.org>wrote:
>
>> https://issues.apache.org/jira/browse/WICKET-3197
>>  <https://issues.apache.org/jira/browse/WICKET-3197>have fun ;-)
>>
>>
>> On Thu, Nov 25, 2010 at 4:58 PM, Juergen Donnerstag <
>> juergen.donnerstag@gmail.com> wrote:
>>
>>> >This means .addOrReplace() cannot be used in Page constructor, even
>>> >indirectly.
>>> Please provide a test case and I'll have a look.
>>>
>>> >Can we add some check in
>>> org.apache.wicket.Component.getMarkupIdFromMarkup()
>>> >so that it immediately returns 'null' if the markup is not available ?
>>> We could but I don't like the idea. The name implies that needs access
>>> to the markup. If markup is not available that clearly is an error =>
>>> exception
>>>
>>> >org.apache.wicket.Component.onMarkupAttached() doesn't set any flag that
>>> the
>>> >markup is available.
>>> Doesn't need to. The process make sure it's called only once (I hope).
>>>
>>> >If we use this approach then we will have to add javadoc line to this
>>> method
>>> >that it works only when the markup is available.
>>> good point.
>>>
>>> I agree the issue probably is with addOrReplace(). I don't think I
>>> added any testcase for that. But I'm happy to look after if you could
>>> provide a (failing) testcase
>>>
>>> Juergen
>>>
>>>
>>> On Thu, Nov 25, 2010 at 4:34 PM, Martin Grigorov <mg...@apache.org>
>>> wrote:
>>> > Quick and dirty workaround to be able to run the app:
>>> >
>>> > if (getFlag(FLAG_INITIALIZED) && parent != null)
>>> > { /* the current body of getMarkupIdFromMarkup() */ }
>>> > return null;
>>> >
>>> > On Thu, Nov 25, 2010 at 4:28 PM, Martin Grigorov <mgrigorov@apache.org
>>> >wrote:
>>> >
>>> >> My app is not happy with this new method. I guess other apps will
>>> complain
>>> >> too.
>>> >>
>>> >> Moved the code to onInitialize() and now the new exception is:
>>> >>
>>> >> org.apache.wicket.markup.MarkupException: Can not determine Markup.
>>> >> Component is not yet connected to a parent. [WebMarkupContainer
>>> [Component
>>> >> id = applyTable]]
>>> >> at org.apache.wicket.Component.getMarkup(Component.java:717)
>>> >> at org.apache.wicket.Component.getMarkupTag(Component.java:1438)
>>> >> at
>>> org.apache.wicket.Component.getMarkupIdFromMarkup(Component.java:849)
>>> >> at org.apache.wicket.Component.getMarkupIdImpl(Component.java:1484)
>>> >> at org.apache.wicket.MarkupContainer.replace(MarkupContainer.java:807)
>>> >> at
>>> org.apache.wicket.MarkupContainer.addOrReplace(MarkupContainer.java:239)
>>> >>  at
>>> com.fredhopper.bm.layout.ControlPanel.setOnApply(ControlPanel.java:192)
>>> >> at com.fredhopper.bm.layout.TopPanel.setOnApply(TopPanel.java:67)
>>> >> at
>>> >>
>>> com.fredhopper.bm.pages.search.SynonymsPage.<init>(SynonymsPage.java:123)
>>> >> ......
>>> >>
>>> >> This means .addOrReplace() cannot be used in Page constructor, even
>>> >> indirectly.
>>> >> Can we add some check in
>>> >> org.apache.wicket.Component.getMarkupIdFromMarkup() so that it
>>> immediately
>>> >> returns 'null' if the markup is not available ?
>>> >> org.apache.wicket.Component.onMarkupAttached() doesn't set any flag
>>> that
>>> >> the markup is available.
>>> >> If we use this approach then we will have to add javadoc line to this
>>> >> method that it works only when the markup is available.
>>> >>
>>> >> On Wed, Nov 24, 2010 at 10:32 PM, Juergen Donnerstag <
>>> >> juergen.donnerstag@gmail.com> wrote:
>>> >>
>>> >>> Excepted is:
>>> >>> - if a component provides its own markup either via subclassing
>>> >>> getMarkup() or is expected to have associated markup (e.g. Panel) =>
>>> >>> markup available in ctor
>>> >>> - Component.onMarkupAttached() is invoked as soon as the markup is
>>> >>> available. E.g. a child to a Panel. child.onMarkupAttached() is
>>> >>> invoked when child gets added to panel
>>> >>> - onInitialize() gets called once a path to the Page is available
>>> >>>
>>> >>> Juergen
>>> >>>
>>> >>> On Wed, Nov 24, 2010 at 10:06 PM, Martin Grigorov <
>>> mgrigorov@apache.org>
>>> >>> wrote:
>>> >>> > Hi,
>>> >>> >
>>> >>> > I just updated my app to latest 1.5 and the following exception
>>> >>> happened:
>>> >>> >
>>> >>> > org.apache.wicket.WicketRuntimeException: No Page found for
>>> component
>>> >>> > [ShortcutsPanel [Component id = componentItem]]
>>> >>> > at org.apache.wicket.Component.getPage(Component.java:1787)
>>> >>> > at
>>> >>>
>>> org.apache.wicket.MarkupContainer.getMarkupType(MarkupContainer.java:531)
>>> >>> > at
>>> >>> >
>>> >>>
>>> org.apache.wicket.MarkupContainer.getAssociatedMarkup(MarkupContainer.java:441)
>>> >>> > at
>>> >>> >
>>> >>>
>>> org.apache.wicket.markup.html.panel.Panel$PanelMarkupHelper.getMarkup(Panel.java:166)
>>> >>> > at
>>> org.apache.wicket.markup.html.panel.Panel.getMarkup(Panel.java:142)
>>> >>> > at org.apache.wicket.Component.getMarkup(Component.java:722)
>>> >>> > at org.apache.wicket.Component.getMarkupTag(Component.java:1436)
>>> >>> > at
>>> org.apache.wicket.Component.getMarkupIdFromMarkup(Component.java:847)
>>> >>> > <<<<<<<<<<<< new
>>> >>> > at org.apache.wicket.Component.getMarkupIdImpl(Component.java:1482)
>>> >>> > at org.apache.wicket.Component.getMarkupId(Component.java:1537)
>>> >>> > at org.apache.wicket.Component.getMarkupId(Component.java:1599)
>>> >>> > at
>>> >>> >
>>> >>>
>>> com.fredhopper.bm.components.savedsearches.ShortcutsPanel.<init>(ShortcutsPanel.java:184)
>>> >>> > ....
>>> >>> >
>>> >>> > In ShortcutsPanel's ctor we need to get the markupId of one of the
>>> >>> > components in this Panel ...
>>> >>> > I know that if I move the code to onInitialize() then everything
>>> will be
>>> >>> OK,
>>> >>> > but I wanted to discuss with you whether the new behavior is OK for
>>> 1.5.
>>> >>> >
>>> >>>
>>> >>
>>> >>
>>> >
>>>
>>
>>
>