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 <mgrigo...@apache.org> Authored: Fri Jun 14 16:56:29 2013 +0300 Committer: Martin Tzvetanov Grigorov <mgrigo...@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); + } }