You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2013/06/14 15:57:08 UTC

git commit: WICKET-5056 Page mount with an optional named parameter overtakes a mount with more specific path

Updated Branches:
  refs/heads/master 11ef03bd1 -> 56169634c


WICKET-5056 Page mount with an optional named parameter overtakes a mount with more specific path


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

Branch: refs/heads/master
Commit: 56169634c82a58b2dc5c071fb8f1e80a531eaf56
Parents: 11ef03b
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Fri Jun 14 16:56:29 2013 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Jun 14 16:57:00 2013 +0300

----------------------------------------------------------------------
 .../core/request/mapper/MountedMapper.java      | 10 +++-
 .../core/request/mapper/MountedMapperTest.java  | 58 ++++++++++++++++++++
 2 files changed, 67 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/56169634/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
index ae742d6..12f8985 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
@@ -495,7 +495,15 @@ public class MountedMapper extends AbstractBookmarkableMapper
 	{
 		if (urlStartsWith(request.getUrl(), mountSegments))
 		{
-			return mountSegments.length;
+			/* see WICKET-5056 - alter score with pathSegment type */
+			int countOptional = 0;
+			int fixedSegments = 0;
+			for (MountPathSegment pathSegment : pathSegments)
+			{
+				fixedSegments += pathSegment.getFixedPartSize();
+				countOptional += pathSegment.getOptionalParameters();
+			}
+			return mountSegments.length - countOptional + fixedSegments;
 		}
 		else
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/56169634/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
index 3815361..d8cccb5 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
@@ -28,6 +28,7 @@ import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
 import org.apache.wicket.markup.html.link.ILinkListener;
 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.component.IRequestableComponent;
 import org.apache.wicket.request.component.IRequestablePage;
@@ -809,4 +810,61 @@ public class MountedMapperTest extends AbstractMapperTest
 		Url url = optionPlaceholderEncoder.mapHandler(handler);
 		assertEquals("some/path/p2/p3/i1/i2?a=b&b=c", url.toString());
 	}
+
+	/* WICKET-5056 **/
+	@Test
+	public void optionalParameterGetsLowerScore_ThanExactOne() throws Exception
+	{
+		final Url url = Url.parse("all/sindex");
+		final MountedMapper exactMount = new MountedMapper("/all/sindex", MockPage.class);
+		final MountedMapper optionalParameter = new MountedMapper("/all/#{exp}", MockPage.class);
+		Request request = getRequest(url);
+		final int exactCompatScore = exactMount.getCompatibilityScore(request);
+		final int optCompatScore = optionalParameter.getCompatibilityScore(request);
+		assertTrue("exactCompatScore should have greater compatibility score than optional one" +
+			" got exact = " + exactCompatScore + " and optional = " + optCompatScore,
+			exactCompatScore > optCompatScore);
+	}
+
+	@Test
+	public void exactMountGetsBetterScore_ThanParameterOne() throws Exception
+	{
+		final Url url = Url.parse("all/sindex");
+		final MountedMapper exactMount = new MountedMapper("/all/sindex", MockPage.class);
+		final MountedMapper requiredParam = new MountedMapper("/all/${exp}", MockPage.class);
+		Request request = getRequest(url);
+		final int exactCompatScore = exactMount.getCompatibilityScore(request);
+		final int requiredParamScore = requiredParam.getCompatibilityScore(request);
+		assertTrue("exactCompatScore should have greater compatibility score than required one" +
+			" got exact = " + exactCompatScore + " and required= " + requiredParamScore,
+			exactCompatScore > requiredParamScore);
+	}
+
+	@Test
+	public void exactMountGetsBetterScore_ThanParameterOne_ThenOptionalOne() throws Exception
+	{
+		final Url url = Url.parse("all/sindex");
+		final MountedMapper exactMount = new MountedMapper("/all/sindex", MockPage.class);
+		final MountedMapper requiredParam = new MountedMapper("/all/${exp}", MockPage.class);
+		final MountedMapper optionalParameter = new MountedMapper("/all/#{exp}", MockPage.class);
+		final MountedMapper requiredOptionalParam = new MountedMapper("/all/${exp}/#{opt}", MockPage.class);
+
+		Request request = getRequest(url);
+		final int exactCompatScore = exactMount.getCompatibilityScore(request);
+		final int requiredParamScore = requiredParam.getCompatibilityScore(request);
+		final int optCompatScore = optionalParameter.getCompatibilityScore(request);
+		final int requiredOptCompatScore = requiredOptionalParam.getCompatibilityScore(request);
+
+		assertTrue("exactCompatScore should have greater compatibility score than required one" +
+			" got exact = " + exactCompatScore + " and required= " + requiredParamScore,
+				exactCompatScore > requiredParamScore);
+
+		assertTrue("exactCompatScore should have greater compatibility score than required+optional one" +
+				" got exact = " + exactCompatScore + " and requiredOptional= " + requiredOptCompatScore,
+				exactCompatScore > requiredOptCompatScore);
+
+		assertTrue("exactCompatScore should have greater compatibility score than optional one" +
+			" got exact = " + exactCompatScore + " and optional = " + optCompatScore,
+				requiredParamScore > optCompatScore);
+	}
 }