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());
        }
 
        /**

Reply via email to