Wicket
  1. Wicket
  2. WICKET-5013

Wicket Enclosure fails with more than one component

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 6.3.0
    • Fix Version/s: 6.6.0, 1.5.10
    • Component/s: wicket
    • Labels:
      None
    • Environment:
      Sun JDK 1.7.0_11
      Ubuntu 12.10

      Description

      An enclosure like:

      <wicket:enclosure child="message">
      <span wicket:id="message" />
      <a href="#" wicket:id="link"></a>
      </wicket:enclosure>

      fails with:
      org.apache.wicket.WicketRuntimeException: The component(s) below failed to render. Possible reasons could be that: 1) you have added a component in code but forgot to reference it in the markup (thus the component will never be rendered), 2) if your components were added in a parent container then make sure the markup for the child container includes them in <wicket:extend>.

      1. [ExternalLink [Component id = link]]

      It will report failed rendering for all components within the enclosure except the child.
      This works if I turn the enclosure into an inline enclosure:

      <div wicket:enclosure="message">
      <span wicket:id="message" />
      <a href="#" wicket:id="link"></a>
      </div>

      I got this error when upgrading from Wicket 6.2.0 to 6.3.0.

      I also noticed that the AjaxEnclosureListener only visits the InlineEnclosures.

      1. WICKET-5013.zip
        22 kB
        Christoph Leiter

        Activity

        Hide
        Martin Grigorov added a comment -

        Please attach a quickstart application that demonstrates the problem.
        Also try with <span ...></span> instead of the short version that you use.
        And try with 6.5.0 too

        Show
        Martin Grigorov added a comment - Please attach a quickstart application that demonstrates the problem. Also try with <span ...></span> instead of the short version that you use. And try with 6.5.0 too
        Hide
        Christoph Leiter added a comment -

        Now that was difficult to reproduce in a quickstart. It happened only if I added the DebugBar. I traced it further down and this happens because getPage().detach() is called (inside DebugBar somewhere, to measure page size). This method calls MarkupContainer#detachChildren and there is this:

        // We need to keep InlineEnclosures for Ajax request handling.
        // TODO this is really ugly. Feature request for 1.5: change auto-component that
        // they don't need to be removed anymore.
        if (component.isAuto() && !(component instanceof InlineEnclosure))

        { children_remove(i); }

        If I add && !(component instanceof Enclosure) it avoids the problem. I don't have a any real insight how auto components work and so I'm quite certain that this is the wrong approach.

        I'll add a quickstart so that someone can have a look at it.

        Show
        Christoph Leiter added a comment - Now that was difficult to reproduce in a quickstart. It happened only if I added the DebugBar. I traced it further down and this happens because getPage().detach() is called (inside DebugBar somewhere, to measure page size). This method calls MarkupContainer#detachChildren and there is this: // We need to keep InlineEnclosures for Ajax request handling. // TODO this is really ugly. Feature request for 1.5: change auto-component that // they don't need to be removed anymore. if (component.isAuto() && !(component instanceof InlineEnclosure)) { children_remove(i); } If I add && !(component instanceof Enclosure) it avoids the problem. I don't have a any real insight how auto components work and so I'm quite certain that this is the wrong approach. I'll add a quickstart so that someone can have a look at it.
        Hide
        Christoph Leiter added a comment -

        WICKET-5014 is related. detach() is also called here from the WicketObjets.sizeOf(). The change that causes these troubles was introduced by WICKET-4867.

        Show
        Christoph Leiter added a comment - WICKET-5014 is related. detach() is also called here from the WicketObjets.sizeOf(). The change that causes these troubles was introduced by WICKET-4867 .
        Hide
        Martin Grigorov added a comment -

        The objects will be cloned before detaching them and measuring their size from now on, so the original component wont be detached.

        Show
        Martin Grigorov added a comment - The objects will be cloned before detaching them and measuring their size from now on, so the original component wont be detached.

          People

          • Assignee:
            Martin Grigorov
            Reporter:
            Magne Rasmussen
          • Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development