[ https://issues.apache.org/jira/browse/WICKET-6339?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15964055#comment-15964055 ]
Sven Ackermann commented on WICKET-6339: ---------------------------------------- Hi, I tried to build a test case based on our setup, but this would get too complex. So I created a very simple test to illustrate the problem: {code} @Test public void testSimple() { // application needed new WicketTester(); // test markup Markup markup = Markup.of("<html><body><wicket:panel><wicket:container wicket:id='content'><a wicket:id='link' href='https://www.google.de'>Test</a></wicket:container></wicket:panel></body></html>"); IMarkupFragment firstLevelfragment = markup.find("content"); System.out.println(firstLevelfragment + " " + firstLevelfragment.size()); // construct a new fragment for the link-Tag as sub-fragment of firstLevelfragment MarkupFragment secondLevelFragment = new MarkupFragment(firstLevelfragment, 1); System.out.println(secondLevelFragment + " " + secondLevelFragment.size()); List<MarkupElement> iteratorElements = new ArrayList<>(secondLevelFragment.size()); for (MarkupElement markupElement : secondLevelFragment) { iteratorElements.add(markupElement); } List<MarkupElement> getElements = new ArrayList<>(secondLevelFragment.size()); for (int i = 0; i < secondLevelFragment.size(); i++) { getElements.add(secondLevelFragment.get(i)); } // elements from iterator should match the ones from the get(i) method assertEquals(getElements, iteratorElements); } {code} As I mentioned, we have a very special usecase where we use some Wicket APIs that are not commonly used. We also have a workaround (using {{MarkupFragment.get(int)}} and {{MarkupFragment.size()}} instead of {{MarkupFragment.iterator()}}). I just wanted to tell you, that there might be sth. wrong in your code. If you think it's too risky to change sth. here, I can totally understand that. To describe our usecase a bit: We have a special subclass of {{MarkupContainer}} that loads its content from a CMS. Within that static content we look for all links and manipulate the markup in a way that these links are replaced with Wicket AjaxLinks to add some special handling (basically sth. like a confirmation "Do you really want to click this link?"). I know that our solution is maybe not the best way to do that, but there were some requirements to do it like this. In the setup we use the APIs of {{Markup}}, {{IMarkupFragment}}, {{AbstractMarkupParser}}, {{AbstractMarkupFilter}} and {{ComponentTag}}. If we use the {{MarkupFragment.iterator()}} method, we get the following error which I debugged down to the described problem: {quote} Tag expected MarkupStream: [markup = org.apache.wicket.util.resource.StringResourceStream@7ce97bef: <a href="https://www.google.de/" target="_blank">Test</a> <wicket:container wicket:id="content"><a href="https://www.google.de/" target="_blank">Test</a>, index = 0, current = [Raw markup]] at org.apache.wicket.markup.MarkupStream.throwMarkupException(MarkupStream.java:526) at org.apache.wicket.markup.MarkupStream.getTag(MarkupStream.java:258) at org.apache.wicket.Component.internalRenderComponent(Component.java:2517) at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1698) at org.apache.wicket.Component.internalRender(Component.java:2380) at org.apache.wicket.Component.render(Component.java:2308) at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1524) at org.apache.wicket.MarkupContainer.renderAll(MarkupContainer.java:1759) at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1734) at org.apache.wicket.MarkupContainer.renderAssociatedMarkup(MarkupContainer.java:797) at org.apache.wicket.markup.html.panel.AssociatedMarkupSourcingStrategy.renderAssociatedMarkup(AssociatedMarkupSourcingStrategy.java:77) at org.apache.wicket.markup.html.panel.PanelMarkupSourcingStrategy.onComponentTagBody(PanelMarkupSourcingStrategy.java:112) at org.apache.wicket.Component.internalRenderComponent(Component.java:2565) at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1698) at org.apache.wicket.Component.internalRender(Component.java:2380) at org.apache.wicket.Component.render(Component.java:2308) at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1524) at org.apache.wicket.MarkupContainer.renderAll(MarkupContainer.java:1759) at org.apache.wicket.Page.onRender(Page.java:879) at org.apache.wicket.markup.html.WebPage.onRender(WebPage.java:141) at org.apache.wicket.Component.internalRender(Component.java:2380) at org.apache.wicket.Component.render(Component.java:2308) at org.apache.wicket.Page.renderPage(Page.java:1018) at org.apache.wicket.request.handler.render.WebPageRenderer.renderPage(WebPageRenderer.java:124) at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:236) at org.apache.wicket.util.tester.BaseWicketTester$LastPageRecordingPageRendererProvider$1.respond(BaseWicketTester.java:2747) at org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:175) at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:895) at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265) at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222) at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293) at org.apache.wicket.util.tester.BaseWicketTester.processRequest(BaseWicketTester.java:718) at org.apache.wicket.util.tester.BaseWicketTester.processRequest(BaseWicketTester.java:657) at org.apache.wicket.util.tester.BaseWicketTester.startPage(BaseWicketTester.java:887) at org.apache.wicket.util.tester.BaseWicketTester.startPage(BaseWicketTester.java:904) at org.apache.wicket.util.tester.BaseWicketTester.startComponentInPage(BaseWicketTester.java:1466) at org.apache.wicket.util.tester.BaseWicketTester.startComponentInPage(BaseWicketTester.java:1386) {quote} > Wrong implementation of MarkupFragment.iterator() > ------------------------------------------------- > > Key: WICKET-6339 > URL: https://issues.apache.org/jira/browse/WICKET-6339 > Project: Wicket > Issue Type: Bug > Components: wicket > Affects Versions: 7.2.0 > Reporter: Sven Ackermann > > The method returns {{getRootMarkup().iterator(startIndex, size)}}, but this > only works when {{getRootMarkup() == getParentMarkup()}} or all intermediate > {{MarkupFragment}}s start at index 0. > The {{startIndex}} of all intermediate {{MarkupFragment}}s must be added, > otherwise the iterator starts at a wrong index. -- This message was sent by Atlassian JIRA (v6.3.15#6346)