Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-5698

WebApplication#unmount() unmounts the whole compound mapper if some of its inner ones matches

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 7.0.0-M3, 6.17.0
    • 6.18.0, 7.0.0-M4
    • wicket
    • None

    Description

      From dev@ mailing lists: http://markmail.org/message/wmdgbrhvrvaeygvr

      WebApplication.unmount() calls getRootRequestMapperAsCompound(), and
      calls unmount() on that.

      getRootRequestMapperAsCompound() checks if the root request mapper is a
      compound, if not, wraps it in a compound, sets the compound as root and
      returns the compound.

      CompoundRequestMapper.unmount() identifies which of the mappers added
      directly to the compound handle the url, and removes them.

      The problem:
      If the original root mapper was a single wrapper, or layer of wrappers,
      with the actual mounted mapper wrapped some levels down, then the whole
      wrapper is removed, not just the specific MountedMapper that is wrapped.
      This has the effect of removing every single mapper, leaving root mapper
      as an empty compound.

      I would like to attempt to provide a patch to fix this, but would like
      guidance on the approach. I have come up with three approaches:

      1. Introduce interface IWrappedRequestMapper. This will be an interface
      which has one method: IRequestMapper getWrappedRequestMapper(). We can
      then have all wrapper mappers implement this and work down the tree to
      find the correct MountedMapper (wicket 6) to remove.

      2. Have WebApplication hold a reference to a specific
      CompoundRequestMapper, and have all mount()/unmount() operations add and
      remove from this mapper. This compound would need to be added to the
      default list during init. This makes it complicated to work out how to
      do things like have CryptoMapper not apply to mounted pages.

      3. Add method unmount() to IRequestMapper, so that wrappers can
      delegate. This obviously can only be done in wicket 7, but we're making
      mounting a problem of every single request mapper, when not even
      Application cares about mounting.

      Attachments

        1. WICKET-5698.patch
          17 kB
          Martin Tzvetanov Grigorov
        2. WICKET-5698-2.patch
          29 kB
          Jesse Long
        3. WICKET-5698-3.patch
          29 kB
          Jesse Long

        Activity

          People

            jesselong Jesse Long
            mgrigorov Martin Tzvetanov Grigorov
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: