[ 
https://issues.apache.org/jira/browse/WICKET-3512?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13010486#comment-13010486
 ] 

Juergen Donnerstag commented on WICKET-3512:
--------------------------------------------

I played a bit with your patches and tests. 

I think using page.getAutoIndex() is the right approach. The id will always be 
page unique and MarkupContainer.autoAdd() will make sure the markup gets 
assigned.

on your additional test case, it actually works fine when java and markup are 
like they should be. But when users forgot to add one of the labels, like you 
deliberately did in your test cases, than wicket will throw an exception "has 
already been rendered" instead of "component not found". Clearly giving the 
wrong hint to the user. That's what the TWMC patch is about. It would not be 
needed for Wicket to render properly.

Page.wasRendered should be final and the javadoc should mention that it's a 
Wicket internal API which should not be used by users (=> contract or behavior 
might change in the futur releases)

> <wicket:enclosure> results in MarkupException when used with multiple 
> <wicket:child>
> ------------------------------------------------------------------------------------
>
>                 Key: WICKET-3512
>                 URL: https://issues.apache.org/jira/browse/WICKET-3512
>             Project: Wicket
>          Issue Type: Bug
>    Affects Versions: 1.5-RC2
>            Reporter: Robin Shine
>            Assignee: Pedro Santos
>         Attachments: WICKET-3512.patch
>
>
> Put below simple pages into a Wicket web application:
> TestPage1.html:
> <html>
>       <head>
>               <title>title</title>
>       </head>
>       <body>
>               <div wicket:id="test1"></div>
>               <wicket:child></wicket:child>
>       </body>
> </html>
> TestPage1.java:
> package com.example.test;
> import org.apache.wicket.markup.html.WebPage;
> import org.apache.wicket.markup.html.basic.Label;
> public class TestPage1 extends WebPage {
>       public TestPage1() {
>               add(new Label("test1", "test1"));
>       }
> }
> TestPage2.html:
> <wicket:extend>
>       <wicket:enclosure child="test2">
>               <div wicket:id="test2"></div>
>       </wicket:enclosure>
>       <wicket:child></wicket:child>
> </wicket:extend>
> TestPage2.java:
> package com.example.test;
> import org.apache.wicket.markup.html.basic.Label;
> public class TestPage2 extends TestPage1 {
>       
>       public TestPage2() {
>               add(new Label("test2", "test2"));
>       }
> }
> TestPage3.html:
> <wicket:extend>
>       <wicket:enclosure child="test3">
>               <div wicket:id="test3"></div>
>       </wicket:enclosure>
> </wicket:extend>
> TestPage3.java:
> package com.example.test;
> import org.apache.wicket.markup.html.basic.Label;
> public class TestPage3 extends TestPage2 {
>       
>       public TestPage3() {
>               add(new Label("test3", "test3"));
>       }
> }
> Here TestPage3 extends TestPage2, and TestPage2 extends TestPage1. Both 
> TestPage2.html and TestPage3.html contains a <wicket:enclosure> tag. Now 
> mount TestPage3 and access it, below errors will be generated:
> Message: The component [Component id = test2] was rendered already. You can 
> render it only once during a render phase. Class relative path: 
> org.apache.wicket.markup.html.basic.Label:test2
> Root cause:
> org.apache.wicket.markup.MarkupException: The component [Component id = 
> test2] was rendered already. You can render it only once during a render 
> phase. Class relative path: org.apache.wicket.markup.html.basic.Label:test2
>        at org.apache.wicket.Page.componentRendered(Page.java:299)
>        at org.apache.wicket.Component.rendered(Component.java:2570)
>        at org.apache.wicket.Component.internalRender(Component.java:2377)
>        at org.apache.wicket.Component.render(Component.java:2301)
>        at 
> org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1415)
>          ...
> This error won't occur if <wicket:enclosure> is removed from one of the page. 

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to