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/11/24 22:06:56 UTC

getMarkupIdFromMarkup problem

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

Re: getMarkupIdFromMarkup problem

Posted by Martin Grigorov <mg...@apache.org>.
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>.
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 Juergen Donnerstag <ju...@gmail.com>.
>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 <mg...@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 <mg...@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>.
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 <mg...@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 <mg...@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>.
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 <mg...@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>.
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 <mg...@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.
>