WICKET-4441 PageProvider should create a new Page instance if PageParameters are changed, even if a stored page exists.
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a53591f0 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a53591f0 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a53591f0 Branch: refs/heads/master Commit: a53591f030b87b5d1552e567226705020dee2a62 Parents: 565346c Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Tue Jan 14 11:36:22 2014 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Tue Jan 14 11:36:22 2014 +0200 ---------------------------------------------------------------------- .../mapper/AbstractBookmarkableMapper.java | 7 ++++++ .../request/mapper/BookmarkableMapperTest.java | 25 ++++++++++++++++---- .../core/request/mapper/MountedMapperTest.java | 25 ++++++++++++++++---- .../core/request/mapper/PackageMapperTest.java | 25 ++++++++++++++++---- 4 files changed, 70 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/a53591f0/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 5074ac0..a1cb05f 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 @@ -246,6 +246,13 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper } else { + PageParameters constructionPageParameters = provider.getPageInstance().getPageParameters(); + if (PageParameters.equals(constructionPageParameters, pageParameters) == false) + { + // create a fresh page instance because the request page parameters are different than the ones + // when the resolved page by id has been created + return new RenderPageRequestHandler(new PageProvider(pageClass, pageParameters)); + } return new RenderPageRequestHandler(provider); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/a53591f0/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java index f1db41b..c8c2a0f 100644 --- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/BookmarkableMapperTest.java @@ -99,7 +99,11 @@ public class BookmarkableMapperTest extends AbstractMapperTest } /** + * The tests resolves pages by id as if they were existed in the page store. + * These pages have no page parameters (i.e. page.getPageParameters() == null). * + * The request that the encoder does also has no parameters (neither in the path + * nor in the query string) so the resolved page is assumed to be valid. */ @Test public void decode3() @@ -113,7 +117,18 @@ public class BookmarkableMapperTest extends AbstractMapperTest } /** + * The tests resolves pages by id as if they were existed in the page store. + * These pages have no page parameters (i.e. page.getPageParameters() == null). * + * Since Wicket 7.0.0 (WICKET-4441) if a new request to hybrid url + * (a url with both mount path and pageId) has different page parameters + * than the resolved page then a new page instance with the new parameters + * is created. + * This way if a user manipulates manually the product id in url like: + * /wicket/bookmarkable/my.Product?3&id=23 + * to + * /wicket/bookmarkable/my.Product?3&id=24 + * then Wicket will create a new page that will show product=24 */ @Test public void decode4() @@ -122,13 +137,15 @@ public class BookmarkableMapperTest extends AbstractMapperTest IRequestHandler handler = encoder.mapRequest(getRequest(url)); assertThat(handler, instanceOf(RenderPageRequestHandler.class)); - IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); - checkPage(page, 15); + RenderPageRequestHandler h = (RenderPageRequestHandler) handler; + ((PageProvider) h.getPageProvider()).setPageSource(context); + IRequestablePage page = h.getPage(); + checkPage(page, 1); PageParameters p = page.getPageParameters(); - assertEquals(0, p.getIndexedCount()); + assertEquals(2, p.getIndexedCount()); - assertEquals(0, p.getNamedKeys().size()); + assertEquals(2, p.getNamedKeys().size()); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/a53591f0/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 04ca930..0024874 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 @@ -152,7 +152,11 @@ public class MountedMapperTest extends AbstractMapperTest } /** + * The tests resolves pages by id as if they were existed in the page store. + * These pages have no page parameters (i.e. page.getPageParameters() == null). * + * The request that the encoder does also has no parameters (neither in the path + * nor in the query string) so the resolved page is assumed to be valid. */ @Test public void decode3() @@ -166,7 +170,18 @@ public class MountedMapperTest extends AbstractMapperTest } /** + * The tests resolves pages by id as if they were existed in the page store. + * These pages have no page parameters (i.e. page.getPageParameters() == null). * + * Since Wicket 7.0.0 (WICKET-4441) if a new request to hybrid url + * (a url with both mount path and pageId) has different page parameters + * than the resolved page then a new page instance with the new parameters + * is created. + * This way if a user manipulates manually the product id in url like: + * /products/23?3 + * to + * /products/24?3 + * then Wicket will create a new page that will show product=24 */ @Test public void decode4() @@ -175,13 +190,15 @@ public class MountedMapperTest extends AbstractMapperTest IRequestHandler handler = encoder.mapRequest(getRequest(url)); assertThat(handler, instanceOf(RenderPageRequestHandler.class)); - IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); - checkPage(page, 15); + RenderPageRequestHandler h = (RenderPageRequestHandler) handler; + ((PageProvider) h.getPageProvider()).setPageSource(context); + IRequestablePage page = h.getPage(); + checkPage(page, 1); PageParameters p = page.getPageParameters(); - assertEquals(0, p.getIndexedCount()); + assertEquals(2, p.getIndexedCount()); - assertEquals(0, p.getNamedKeys().size()); + assertEquals(2, p.getNamedKeys().size()); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/a53591f0/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java index 2a4635b..e469b10 100644 --- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java @@ -167,7 +167,11 @@ public class PackageMapperTest extends AbstractMapperTest } /** + * The tests resolves pages by id as if they were existed in the page store. + * These pages have no page parameters (i.e. page.getPageParameters() == null). * + * The request that the encoder does also has no parameters (neither in the path + * nor in the query string) so the resolved page is assumed to be valid. */ @Test public void decode3() @@ -181,7 +185,18 @@ public class PackageMapperTest extends AbstractMapperTest } /** + * The tests resolves pages by id as if they were existed in the page store. + * These pages have no page parameters (i.e. page.getPageParameters() == null). * + * Since Wicket 7.0.0 (WICKET-4441) if a new request to hybrid url + * (a url with both mount path and pageId) has different page parameters + * than the resolved page then a new page instance with the new parameters + * is created. + * This way if a user manipulates manually the product id in url like: + * /mount/path/Products/23?3 + * to + * /mount/path/Products/24?3 + * then Wicket will create a new page that will show product=24 */ @Test public void decode4() @@ -190,13 +205,15 @@ public class PackageMapperTest extends AbstractMapperTest IRequestHandler handler = encoder.mapRequest(getRequest(url)); assertThat(handler, instanceOf(RenderPageRequestHandler.class)); - IRequestablePage page = ((RenderPageRequestHandler)handler).getPage(); - checkPage(page, 15); + RenderPageRequestHandler h = (RenderPageRequestHandler) handler; + ((PageProvider) h.getPageProvider()).setPageSource(context); + IRequestablePage page = h.getPage(); + checkPage(page, 1); PageParameters p = page.getPageParameters(); - assertEquals(0, p.getIndexedCount()); + assertEquals(2, p.getIndexedCount()); - assertEquals(0, p.getNamedKeys().size()); + assertEquals(2, p.getNamedKeys().size()); } /**
