You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by so...@apache.org on 2017/10/02 08:17:08 UTC

[3/6] wicket git commit: WICKET-6461 don't consume segments for optional parameters if required parameters are following

WICKET-6461 don't consume segments for optional parameters if required parameters are following


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

Branch: refs/heads/WICKET-6105-java.time
Commit: 2283dc502fca56f9e912823a4f94a629188aa63f
Parents: c28b72d
Author: Sven Meier <sv...@apache.org>
Authored: Mon Sep 25 21:14:02 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Mon Sep 25 21:18:27 2017 +0200

----------------------------------------------------------------------
 .../mapper/AbstractBookmarkableMapper.java      | 34 ++++++++-----
 .../core/request/mapper/MountedMapperTest.java  | 53 ++++++++++++++++++--
 2 files changed, 72 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/2283dc50/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
index a6bab53..9a39c10 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
@@ -622,46 +622,56 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper
 	protected PageParameters extractPageParameters(Request request, Url url)
 	{
 		int[] matchedParameters = getMatchedSegmentSizes(url);
+		
 		int total = 0;
 		for (int curMatchSize : matchedParameters)
+		{
 			total += curMatchSize;
+		}
 		PageParameters pageParameters = extractPageParameters(request, total, pageParametersEncoder);
 		if (pageParameters != null)
 		{
 			pageParameters.setLocale(resolveLocale());
 		}
 
-		int skippedParameters = 0;
+		int segmentIndex = 0;
 		for (int pathSegmentIndex = 0; pathSegmentIndex < pathSegments.size(); pathSegmentIndex++)
 		{
-			MountPathSegment curPathSegment = pathSegments.get(pathSegmentIndex);
-			int matchSize = matchedParameters[pathSegmentIndex] - curPathSegment.getFixedPartSize();
-			int optionalParameterMatch = matchSize - curPathSegment.getMinParameters();
-			for (int matchSegment = 0; matchSegment < matchSize; matchSegment++)
+			MountPathSegment pathSegment = pathSegments.get(pathSegmentIndex);
+			
+			int totalAdded = 0;
+			int requiredAdded = 0;
+			for (int segmentParameterIndex = 0; segmentParameterIndex < pathSegment.getMaxParameters() && totalAdded < matchedParameters[pathSegmentIndex]; segmentParameterIndex++)
 			{
 				if (pageParameters == null)
 				{
 					pageParameters = newPageParameters();
 				}
 
-				int curSegmentIndex = matchSegment + curPathSegment.getSegmentIndex();
-				String curSegment = mountSegments[curSegmentIndex];
+				String curSegment = mountSegments[pathSegment.getSegmentIndex() + segmentParameterIndex];
+
 				String placeholder = getPlaceholder(curSegment);
 				String optionalPlaceholder = getOptionalPlaceholder(curSegment);
 				// extract the parameter from URL
 				if (placeholder != null)
 				{
 					pageParameters.add(placeholder,
-							url.getSegments().get(curSegmentIndex - skippedParameters), INamedParameters.Type.PATH);
+							url.getSegments().get(segmentIndex), INamedParameters.Type.PATH);
+					segmentIndex++;
+					totalAdded++;
+					requiredAdded++;
 				}
-				else if (optionalPlaceholder != null && optionalParameterMatch > 0)
+				else if (optionalPlaceholder != null &&
+					matchedParameters[pathSegmentIndex] - segmentParameterIndex > pathSegment.getMinParameters() + pathSegment.getFixedPartSize() - requiredAdded)
 				{
 					pageParameters.add(optionalPlaceholder,
-							url.getSegments().get(curSegmentIndex - skippedParameters), INamedParameters.Type.PATH);
-					optionalParameterMatch--;
+							url.getSegments().get(segmentIndex), INamedParameters.Type.PATH);
+					segmentIndex++;
+					totalAdded++;
 				}
 			}
-			skippedParameters += curPathSegment.getMaxParameters() - matchSize;
+
+			segmentIndex += pathSegment.getFixedPartSize();
 		}
 		return pageParameters;
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2283dc50/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 fcd8afc..5b809a7 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
@@ -739,7 +739,7 @@ public class MountedMapperTest extends AbstractMapperTest
 		IRequestablePage page = ((RenderPageRequestHandler)handler).getPage();
 
 		assertEquals(0, page.getPageParameters().getIndexedCount());
-		assertTrue(page.getPageParameters().getNamedKeys().size() == 3);
+		assertEquals(3, page.getPageParameters().getNamedKeys().size());
 		assertEquals("p1", page.getPageParameters().get("param1").toString());
 		assertEquals("p2", page.getPageParameters().get("param2").toString());
 		assertEquals("p3", page.getPageParameters().get("param3").toString());
@@ -811,7 +811,7 @@ public class MountedMapperTest extends AbstractMapperTest
 		IRequestablePage page = ((RenderPageRequestHandler)handler).getPage();
 
 		assertEquals(1, page.getPageParameters().getIndexedCount());
-		assertTrue(page.getPageParameters().getNamedKeys().size() == 2);
+		assertEquals(2, page.getPageParameters().getNamedKeys().size());
 		assertFalse("param1 should not be set",
 			page.getPageParameters().getNamedKeys().contains("param1"));
 		assertEquals("p2", page.getPageParameters().get("param2").toString());
@@ -859,7 +859,54 @@ public class MountedMapperTest extends AbstractMapperTest
 		assertEquals("some/path/p2/p3/i1/i2?a=b&b=c", url.toString());
 	}
 
-	/* WICKET-5056 * */
+	/**
+	 * WICKET-6461
+	 */
+	@Test
+	public void optionalPlaceholdersBeforeRequiredPlaceholder() throws Exception
+	{
+		final MountedMapper mapper = new MountedMapper("/params/#{optional1}/#{optional2}/${required}", MockPage.class) {
+			@Override
+			protected IMapperContext getContext()
+			{
+				return context;
+			}
+
+			@Override
+			boolean getRecreateMountedPagesAfterExpiry()
+			{
+				return true;
+			}
+		};
+		
+		IRequestHandler handler = mapper.mapRequest(getRequest(Url.parse("params/required")));
+		assertThat(handler, instanceOf(RenderPageRequestHandler.class));
+		IRequestablePage page = ((RenderPageRequestHandler)handler).getPage();
+		PageParameters p = page.getPageParameters();
+		assertEquals(1, p.getNamedKeys().size());
+		assertEquals("required", p.get("required").toString());
+		
+		handler = mapper.mapRequest(getRequest(Url.parse("params/optional1/required")));
+		assertThat(handler, instanceOf(RenderPageRequestHandler.class));
+		page = ((RenderPageRequestHandler)handler).getPage();
+		p = page.getPageParameters();
+		assertEquals(2, p.getNamedKeys().size());
+		assertEquals("required", p.get("required").toString());
+		assertEquals("optional1", p.get("optional1").toString());
+		
+		handler = mapper.mapRequest(getRequest(Url.parse("params/optional1/optional2/required")));
+		assertThat(handler, instanceOf(RenderPageRequestHandler.class));
+		page = ((RenderPageRequestHandler)handler).getPage();
+		p = page.getPageParameters();
+		assertEquals(3, p.getNamedKeys().size());
+		assertEquals("required", p.get("required").toString());
+		assertEquals("optional1", p.get("optional1").toString());
+		assertEquals("optional2", p.get("optional2").toString());
+	}
+
+	/**
+	 * WICKET-5056
+	 */
 	@Test
 	public void optionalParameterGetsLowerScore_ThanExactOne() throws Exception
 	{