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);
+ }
}