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 <[email protected]> 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 <[email protected]>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 < >> [email protected]> 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 <[email protected]> >>> 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 <[email protected] >>> >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 < >>> >> [email protected]> 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 < >>> [email protected]> >>> >>> 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. >>> >>> > >>> >>> >>> >> >>> >> >>> > >>> >> >> >
