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.