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

Reply via email to