Hi Wicket Devs,

WebApplication.unmount() and/or CompoundRequestMapper.unmount() is broken, and I want to fix it.

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.

Any thoughts?

Thanks,
Jesse

Reply via email to