You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jl...@apache.org on 2014/09/29 23:19:20 UTC

[1/2] git commit: Ignore Netbeans format config file

Repository: wicket
Updated Branches:
  refs/heads/master 602e21b39 -> d06f84d1b


Ignore Netbeans format config file


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b3e51bc9
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b3e51bc9
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b3e51bc9

Branch: refs/heads/master
Commit: b3e51bc9c87a1a1ecc636ef3da771c1fd6dbede2
Parents: 602e21b
Author: Jesse Long <jl...@apache.org>
Authored: Mon Sep 29 17:58:10 2014 +0200
Committer: Jesse Long <jl...@apache.org>
Committed: Mon Sep 29 17:58:10 2014 +0200

----------------------------------------------------------------------
 .gitignore | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b3e51bc9/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 3fb655e..55c1161 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@ velocity.log
 node_modules/
 release.properties
 testing/wicket-js-tests/node/
+nb-configuration.xml


[2/2] git commit: WICKET-5698 WebApplication#unmount() unmounts the whole compound mapper if some of its inner ones matches

Posted by jl...@apache.org.
WICKET-5698 WebApplication#unmount() unmounts the whole compound mapper if some of its inner ones matches


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/d06f84d1
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/d06f84d1
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/d06f84d1

Branch: refs/heads/master
Commit: d06f84d1b87011e5c152c5fb3f05ae50c1c58cda
Parents: b3e51bc
Author: Jesse Long <jl...@apache.org>
Authored: Mon Sep 29 23:17:09 2014 +0200
Committer: Jesse Long <jl...@apache.org>
Committed: Mon Sep 29 23:17:09 2014 +0200

----------------------------------------------------------------------
 .../core/request/mapper/CryptoMapper.java       |  15 +-
 .../wicket/protocol/http/WebApplication.java    |  99 +++++++-
 .../wicket/protocol/https/HttpsMapper.java      |  12 +-
 .../wicket/util/tester/BaseWicketTester.java    |   9 +-
 .../protocol/http/WebApplicationTest.java       | 244 +++++++++++++++++++
 .../request/mapper/CompoundRequestMapper.java   |  63 -----
 .../request/mapper/ICompoundRequestMapper.java  |   8 -
 .../request/mapper/IRequestMapperDelegate.java  |  36 +++
 .../mapper/ParentPathReferenceRewriter.java     |   9 +-
 .../mapper/CompoundRequestMapperTest.java       | 100 --------
 10 files changed, 419 insertions(+), 176 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
index be876fb..61d47c2 100755
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
@@ -24,6 +24,7 @@ import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Url;
+import org.apache.wicket.request.mapper.IRequestMapperDelegate;
 import org.apache.wicket.util.IProvider;
 import org.apache.wicket.util.crypt.ICrypt;
 import org.apache.wicket.util.crypt.ICryptFactory;
@@ -48,7 +49,7 @@ import org.slf4j.LoggerFactory;
  * @author Jesse Long
  * @author svenmeier
  */
-public class CryptoMapper implements IRequestMapper
+public class CryptoMapper implements IRequestMapperDelegate
 {
 	private static final Logger log = LoggerFactory.getLogger(CryptoMapper.class);
 
@@ -144,9 +145,21 @@ public class CryptoMapper implements IRequestMapper
 
 	/**
 	 * @return the wrapped root request mapper
+	 *
+	 * @deprecated Since 7.0.0, 6.18.0, to be removed in 8.0.0. Use {@link #getDelegateMapper()} instead.
 	 */
+	@Deprecated
 	protected final IRequestMapper getWrappedMapper()
 	{
+		return getDelegateMapper();
+	}
+
+	/**
+	 * @return the wrapped root request mapper
+	 */
+	@Override
+	public final IRequestMapper getDelegateMapper()
+	{
 		return wrappedMapper;
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
index 0ff49bc..0ce46b1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
@@ -17,6 +17,10 @@
 package org.apache.wicket.protocol.http;
 
 import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Locale;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -62,6 +66,8 @@ import org.apache.wicket.request.handler.render.PageRenderer;
 import org.apache.wicket.request.handler.render.WebPageRenderer;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.mapper.ICompoundRequestMapper;
+import org.apache.wicket.request.mapper.IRequestMapperDelegate;
 import org.apache.wicket.request.resource.CssResourceReference;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
@@ -391,7 +397,98 @@ public abstract class WebApplication extends Application
 		{
 			path = path.substring(1);
 		}
-		getRootRequestMapperAsCompound().unmount(path);
+
+		IRequestMapper mapper = getRootRequestMapper();
+
+		while (mapper instanceof IRequestMapperDelegate)
+		{
+			mapper = ((IRequestMapperDelegate) mapper).getDelegateMapper();
+		}
+
+		/*
+		 * Only attempt to unmount if root request mapper is either a compound, or wraps a compound to avoid leaving the
+		 * application with no mappers installed.
+		 */
+		if (mapper instanceof ICompoundRequestMapper)
+		{
+			final Url url = Url.parse(path);
+
+			Request request = new Request()
+			{
+				@Override
+				public Url getUrl()
+				{
+					return url;
+				}
+
+				@Override
+				public Url getClientUrl()
+				{
+					return url;
+				}
+
+				@Override
+				public Locale getLocale()
+				{
+					return null;
+				}
+
+				@Override
+				public Charset getCharset()
+				{
+					return null;
+				}
+
+				@Override
+				public Object getContainerRequest()
+				{
+					return null;
+				}
+			};
+
+			unmountFromCompound((ICompoundRequestMapper) mapper, request);
+		}
+	}
+
+	/**
+	 * Descends the tree of {@link ICompoundRequestMapper}s and {@link IRequestMapperDelegate}s to find the correct descendant
+	 * to remove.
+	 *
+	 * @param parent
+	 *		The {@link ICompoundRequestMapper} from which to unmount the matching mapper.
+	 * @param request
+	 *		The request used to find the mapper to remove.
+	 */
+	private void unmountFromCompound(ICompoundRequestMapper parent, Request request)
+	{
+		Collection<IRequestMapper> toRemove = new LinkedList<>();
+
+		for (IRequestMapper mapper : parent)
+		{
+			if (mapper.mapRequest(request) != null)
+			{
+				IRequestMapper actualMapper = mapper;
+
+				while (actualMapper instanceof IRequestMapperDelegate)
+				{
+					actualMapper = ((IRequestMapperDelegate) actualMapper).getDelegateMapper();
+				}
+
+				if (actualMapper instanceof ICompoundRequestMapper)
+				{
+					unmountFromCompound((ICompoundRequestMapper) actualMapper, request);
+				}
+				else
+				{
+					toRemove.add(mapper);
+				}
+			}
+		}
+
+		for (IRequestMapper mapper : toRemove)
+		{
+			parent.remove(mapper);
+		}
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java b/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java
index aaa1a3e..391aab0 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/https/HttpsMapper.java
@@ -29,6 +29,7 @@ import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.mapper.IRequestMapperDelegate;
 import org.apache.wicket.util.collections.ClassMetaCache;
 import org.apache.wicket.util.lang.Args;
 
@@ -61,7 +62,7 @@ import org.apache.wicket.util.lang.Args;
  * 
  * @author igor
  */
-public class HttpsMapper implements IRequestMapper
+public class HttpsMapper implements IRequestMapperDelegate
 {
 	private final HttpsConfig config;
 	private final IRequestMapper delegate;
@@ -79,6 +80,15 @@ public class HttpsMapper implements IRequestMapper
 		this.config = config;
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public IRequestMapper getDelegateMapper()
+	{
+		return delegate;
+	}
+
 	@Override
 	public final int getCompatibilityScore(Request request)
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index e749e1c..cc1f6c5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -119,6 +119,7 @@ import org.apache.wicket.request.handler.render.PageRenderer;
 import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.mapper.IRequestMapperDelegate;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
@@ -2750,7 +2751,7 @@ public class BaseWicketTester
 	/**
 	 *
 	 */
-	private class TestRequestMapper implements IRequestMapper
+	private class TestRequestMapper implements IRequestMapperDelegate
 	{
 		private final IRequestMapper delegate;
 
@@ -2760,6 +2761,12 @@ public class BaseWicketTester
 		}
 
 		@Override
+		public IRequestMapper getDelegateMapper()
+		{
+			return delegate;
+		}
+
+		@Override
 		public int getCompatibilityScore(Request request)
 		{
 			return delegate.getCompatibilityScore(request);

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-core/src/test/java/org/apache/wicket/protocol/http/WebApplicationTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/WebApplicationTest.java b/wicket-core/src/test/java/org/apache/wicket/protocol/http/WebApplicationTest.java
new file mode 100644
index 0000000..4371c72
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/WebApplicationTest.java
@@ -0,0 +1,244 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.http;
+
+import java.nio.charset.Charset;
+import java.util.Iterator;
+import java.util.Locale;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.IRequestMapper;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.handler.EmptyRequestHandler;
+import org.apache.wicket.request.mapper.CompoundRequestMapper;
+import org.apache.wicket.request.mapper.ICompoundRequestMapper;
+import org.apache.wicket.request.mapper.IRequestMapperDelegate;
+import org.junit.Test;
+
+/**
+ * Test WebApplication
+ */
+public class WebApplicationTest extends WicketTestCase
+{
+	private static final String MOUNT_PATH_1 = "mount/path/1";
+	private static final String MOUNT_PATH_2 = "mount/path/2";
+	private static final String MOUNT_PATH_3 = "mount/path/3";
+	private static final String MOUNT_PATH_4 = "mount/path/4";
+
+	/**
+	 * Test basic unmounting from a compound mapper.
+	 */
+	@Test
+	public void testUnmountSimple()
+	{
+		CompoundRequestMapper compound = new CompoundRequestMapper();
+
+		compound.add(tester.getApplication().getRootRequestMapper());
+
+		compound.add(new MountMapper(MOUNT_PATH_1, new EmptyRequestHandler()));
+		compound.add(new MountMapper(MOUNT_PATH_2, new EmptyRequestHandler()));
+		compound.add(new MountMapper(MOUNT_PATH_3, new EmptyRequestHandler()));
+
+		tester.getApplication().setRootRequestMapper(compound);
+
+		tester.getApplication().unmount(MOUNT_PATH_1);
+
+		assertEquals("Compound size should be 3", 3, getCompoundRequestMapperSize(compound));
+
+		assertNull("Mount path 1 should not be mounted",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_1)));
+
+		assertTrue("Mount path 2 should match",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_2)) instanceof EmptyRequestHandler);
+
+		assertTrue("Mount path 3 should match",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_3)) instanceof EmptyRequestHandler);
+	}
+
+	/**
+	 * See https://issues.apache.org/jira/browse/WICKET-5698
+	 */
+	@Test
+	public void testUnmountComplex()
+	{
+		CompoundRequestMapper nestedCompound = new CompoundRequestMapper();
+
+		nestedCompound.add(tester.getApplication().getRootRequestMapper());
+
+		nestedCompound.add(new MountMapper(MOUNT_PATH_1, new EmptyRequestHandler()));
+		nestedCompound.add(new MountMapper(MOUNT_PATH_2, new EmptyRequestHandler()));
+
+		CompoundRequestMapper rootCompound = new CompoundRequestMapper();
+
+		rootCompound.add(new SimpleRequestMapperDelegate(nestedCompound));
+
+		rootCompound.add(new MountMapper(MOUNT_PATH_3, new EmptyRequestHandler()));
+		rootCompound.add(new MountMapper(MOUNT_PATH_4, new EmptyRequestHandler()));
+
+		tester.getApplication().setRootRequestMapper(new SimpleRequestMapperDelegate(rootCompound));
+
+		tester.getApplication().unmount(MOUNT_PATH_1);
+
+		assertEquals("Compound size should be 2", 2, getCompoundRequestMapperSize(nestedCompound));
+
+		assertNull("Mount path 1 should not be mounted",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_1)));
+
+		assertTrue("Mount path 2 should match",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_2)) instanceof EmptyRequestHandler);
+
+		assertTrue("Mount path 3 should match",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_3)) instanceof EmptyRequestHandler);
+
+		assertTrue("Mount path 4 should match",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_4)) instanceof EmptyRequestHandler);
+
+		tester.getApplication().unmount(MOUNT_PATH_3);
+
+		assertNull("Mount path 1 should not be mounted",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_1)));
+
+		assertTrue("Mount path 2 should match",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_2)) instanceof EmptyRequestHandler);
+
+		assertNull("Mount path 3 should not be mounted",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_3)));
+
+		assertTrue("Mount path 4 should match",
+			tester.getApplication().getRootRequestMapper().mapRequest(createMockRequest(MOUNT_PATH_4)) instanceof EmptyRequestHandler);
+	}
+
+	private static Request createMockRequest(String path)
+	{
+		final Url url = Url.parse(path);
+
+		return new Request()
+		{
+			@Override
+			public Url getUrl()
+			{
+				return url;
+			}
+
+			@Override
+			public Url getClientUrl()
+			{
+				return url;
+			}
+
+			@Override
+			public Locale getLocale()
+			{
+				return null;
+			}
+
+			@Override
+			public Charset getCharset()
+			{
+				return null;
+			}
+
+			@Override
+			public Object getContainerRequest()
+			{
+				return null;
+			}
+		};
+	}
+
+	private static int getCompoundRequestMapperSize(ICompoundRequestMapper compound)
+	{
+		int retv = 0;
+
+		for (Iterator<IRequestMapper> it = compound.iterator(); it.hasNext();)
+		{
+			it.next();
+			retv++;
+		}
+
+		return retv;
+	}
+
+	private static class MountMapper implements IRequestMapper
+	{
+		private final String path;
+		private final IRequestHandler handler;
+
+		public MountMapper(String path, EmptyRequestHandler handler)
+		{
+			this.path = path;
+			this.handler = handler;
+		}
+
+		@Override
+		public IRequestHandler mapRequest(Request request)
+		{
+			if (request.getUrl().toString().equals(path))
+			{
+				return handler;
+			}
+			return null;
+		}
+
+		@Override
+		public int getCompatibilityScore(Request request)
+		{
+			return 0;
+		}
+
+		@Override
+		public Url mapHandler(IRequestHandler requestHandler)
+		{
+			return null;
+		}
+	}
+
+	private static class SimpleRequestMapperDelegate implements IRequestMapperDelegate
+	{
+		private final IRequestMapper delegate;
+
+		public SimpleRequestMapperDelegate(IRequestMapper delegate)
+		{
+			this.delegate = delegate;
+		}
+
+		@Override
+		public IRequestMapper getDelegateMapper()
+		{
+			return delegate;
+		}
+
+		@Override
+		public IRequestHandler mapRequest(Request request)
+		{
+			return delegate.mapRequest(request);
+		}
+
+		@Override
+		public int getCompatibilityScore(Request request)
+		{
+			return delegate.getCompatibilityScore(request);
+		}
+
+		@Override
+		public Url mapHandler(IRequestHandler requestHandler)
+		{
+			return delegate.mapHandler(requestHandler);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java
index 94635b3..07f858e 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/CompoundRequestMapper.java
@@ -16,12 +16,10 @@
  */
 package org.apache.wicket.request.mapper;
 
-import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Locale;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.wicket.request.IRequestHandler;
@@ -242,65 +240,4 @@ public class CompoundRequestMapper implements ICompoundRequestMapper
 	{
 		return mappers.iterator();
 	}
-
-	@Override
-	public void unmount(String path)
-	{
-		final Url url = Url.parse(path);
-		final Request request = createRequest(url);
-
-		for (IRequestMapper mapper : this)
-		{
-			if (mapper instanceof ICompoundRequestMapper)
-			{
-				ICompoundRequestMapper inner = (ICompoundRequestMapper) mapper;
-				inner.unmount(path);
-			}
-			else if (mapper.mapRequest(request) != null)
-			{
-				remove(mapper);
-			}
-		}
-	}
-
-	int size()
-	{
-		return mappers.size();
-	}
-
-	Request createRequest(final Url url)
-	{
-		return new Request()
-		{
-			@Override
-			public Url getUrl()
-			{
-				return url;
-			}
-
-			@Override
-			public Locale getLocale()
-			{
-				return null;
-			}
-
-			@Override
-			public Object getContainerRequest()
-			{
-				return null;
-			}
-
-			@Override
-			public Url getClientUrl()
-			{
-				return url;
-			}
-
-			@Override
-			public Charset getCharset()
-			{
-				return null;
-			}
-		};
-	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-request/src/main/java/org/apache/wicket/request/mapper/ICompoundRequestMapper.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/ICompoundRequestMapper.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/ICompoundRequestMapper.java
index 0bb235c..2325290 100755
--- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/ICompoundRequestMapper.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/ICompoundRequestMapper.java
@@ -41,12 +41,4 @@ public interface ICompoundRequestMapper extends IRequestMapper, Iterable<IReques
 	 * @return {@code this} for chaining
 	 */
 	ICompoundRequestMapper remove(IRequestMapper mapper);
-
-	/**
-	 * Unregisters all {@link IRequestMapper}s which would match on a this path
-	 * 
-	 * @param path
-	 *            the path to unmount
-	 */
-	void unmount(String path);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-request/src/main/java/org/apache/wicket/request/mapper/IRequestMapperDelegate.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/IRequestMapperDelegate.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/IRequestMapperDelegate.java
new file mode 100644
index 0000000..175deca
--- /dev/null
+++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/IRequestMapperDelegate.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.mapper;
+
+import org.apache.wicket.request.IRequestMapper;
+
+/**
+ * A interface to be implemented by {@link IRequestMapper}s that delegate to other {@link IRequestMapper}s.
+ * This allows the application to traverse the tree of request mappers to find a mounted mapper to remove
+ * when unmounting mounted mappers.
+ *
+ * @author Jesse Long
+ */
+public interface IRequestMapperDelegate extends IRequestMapper
+{
+	/**
+	 * Returns the delegate {@link IRequestMapper}.
+	 *
+	 * @return The delegate {@link IRequestMapper}.
+	 */
+	IRequestMapper getDelegateMapper();
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java
index c786685..5f569e4 100755
--- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/ParentPathReferenceRewriter.java
@@ -29,7 +29,7 @@ import org.apache.wicket.util.lang.Args;
  * 
  * @author igor.vaynberg
  */
-public class ParentPathReferenceRewriter implements IRequestMapper
+public class ParentPathReferenceRewriter implements IRequestMapperDelegate
 {
 	private final IProvider<String> escapeSequence;
 	private final IRequestMapper chain;
@@ -108,4 +108,11 @@ public class ParentPathReferenceRewriter implements IRequestMapper
 	{
 		return chain.getCompatibilityScore(request);
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IRequestMapper getDelegateMapper()
+	{
+		return chain;
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/d06f84d1/wicket-request/src/test/java/org/apache/wicket/request/mapper/CompoundRequestMapperTest.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/test/java/org/apache/wicket/request/mapper/CompoundRequestMapperTest.java b/wicket-request/src/test/java/org/apache/wicket/request/mapper/CompoundRequestMapperTest.java
index 93a281e..977edf7 100644
--- a/wicket-request/src/test/java/org/apache/wicket/request/mapper/CompoundRequestMapperTest.java
+++ b/wicket-request/src/test/java/org/apache/wicket/request/mapper/CompoundRequestMapperTest.java
@@ -16,11 +16,6 @@
  */
 package org.apache.wicket.request.mapper;
 
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.IRequestMapper;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.handler.EmptyRequestHandler;
 import org.apache.wicket.request.mapper.CompoundRequestMapper.MapperWithScore;
 import org.junit.Assert;
 import org.junit.Test;
@@ -30,101 +25,6 @@ import org.junit.Test;
  */
 public class CompoundRequestMapperTest extends Assert
 {
-
-	private static final String MOUNT_PATH_3 = "mount/path/3";
-	private static final String MOUNT_PATH_2 = "mount/path/2";
-	private static final String MOUNT_PATH_1 = "mount/path/1";
-
-	@Test
-	public void unmount()
-	{
-		CompoundRequestMapper compound = new CompoundRequestMapper();
-
-		compound.add(new MountMapper(MOUNT_PATH_1, new EmptyRequestHandler()));
-		compound.add(new MountMapper(MOUNT_PATH_2, new EmptyRequestHandler()));
-		compound.add(new MountMapper(MOUNT_PATH_3, new EmptyRequestHandler()));
-
-		assertEquals(3, compound.size());
-
-		compound.unmount(MOUNT_PATH_2);
-		assertEquals(2, compound.size());
-
-		assertTrue(
-			"Mount path 1 should match",
-			compound.mapRequest(compound.createRequest(Url.parse(MOUNT_PATH_1))) instanceof EmptyRequestHandler);
-		assertNull("Mount path 2 should not match",
-			compound.mapRequest(compound.createRequest(Url.parse(MOUNT_PATH_2))));
-		assertTrue(
-			"Mount path 3 should match",
-			compound.mapRequest(compound.createRequest(Url.parse(MOUNT_PATH_3))) instanceof EmptyRequestHandler);
-	}
-
-	/**
-	 * https://issues.apache.org/jira/browse/WICKET-5698
-	 */
-	@Test
-	public void unmountNested()
-	{
-		CompoundRequestMapper compound = new CompoundRequestMapper();
-
-		CompoundRequestMapper nestedCompound = new CompoundRequestMapper();
-		compound.add(nestedCompound);
-
-		nestedCompound.add(new MountMapper(MOUNT_PATH_1, new EmptyRequestHandler()));
-		nestedCompound.add(new MountMapper(MOUNT_PATH_2, new EmptyRequestHandler()));
-		nestedCompound.add(new MountMapper(MOUNT_PATH_3, new EmptyRequestHandler()));
-
-		assertEquals(1, compound.size());
-		assertEquals(3, nestedCompound.size());
-
-		compound.unmount(MOUNT_PATH_2);
-		assertEquals(1, compound.size());
-		assertEquals(2, nestedCompound.size());
-
-		assertTrue(
-				"Mount path 1 should match",
-				compound.mapRequest(compound.createRequest(Url.parse(MOUNT_PATH_1))) instanceof EmptyRequestHandler);
-		assertNull("Mount path 2 should not match",
-				compound.mapRequest(compound.createRequest(Url.parse(MOUNT_PATH_2))));
-		assertTrue(
-				"Mount path 3 should match",
-				compound.mapRequest(compound.createRequest(Url.parse(MOUNT_PATH_3))) instanceof EmptyRequestHandler);
-	}
-
-	private static class MountMapper implements IRequestMapper
-	{
-		private final String path;
-		private final IRequestHandler handler;
-
-		public MountMapper(String path, EmptyRequestHandler handler)
-		{
-			this.path = path;
-			this.handler = handler;
-		}
-
-		@Override
-		public IRequestHandler mapRequest(Request request)
-		{
-			if (request.getUrl().toString().equals(path))
-			{
-				return handler;
-			}
-			return null;
-		}
-
-		@Override
-		public int getCompatibilityScore(Request request)
-		{
-			return 0;
-		}
-
-		@Override
-		public Url mapHandler(IRequestHandler requestHandler)
-		{
-			return null;
-		}
-	}
-
 	/**
 	 * Test {@link MapperWithScore#compareTo(MapperWithScore)}.
 	 */