WICKET-5309 check whether rendering changed page url

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

Branch: refs/heads/5299-ajax-strategy
Commit: 4ab506431371e78ee5d1f5000200c74f89a97a94
Parents: 1c8dc6f
Author: svenmeier <s...@meiers.net>
Authored: Thu Aug 8 12:25:08 2013 +0200
Committer: svenmeier <s...@meiers.net>
Committed: Thu Aug 8 12:25:08 2013 +0200

----------------------------------------------------------------------
 .../request/handler/render/WebPageRenderer.java | 25 ++++++++++++++++----
 1 file changed, 20 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/4ab50643/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
 
b/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
index ad39922..b3fb62b 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
@@ -259,17 +259,32 @@ public class WebPageRenderer extends PageRenderer
                                        // force creation of possible stateful 
page to get the final target url
                                        getPage();
 
-                                       Url renderTargetUrl = 
requestCycle.mapUrlFor(getRenderPageRequestHandler());
+                                       Url beforeRenderUrl = 
requestCycle.mapUrlFor(getRenderPageRequestHandler());
 
                                        // redirect to buffer
-                                       BufferedWebResponse response = 
renderPage(renderTargetUrl, requestCycle);
+                                       BufferedWebResponse response = 
renderPage(beforeRenderUrl, requestCycle);
 
                                        if (response == null)
                                        {
                                                return;
                                        }
 
-                                       if (currentUrl.equals(renderTargetUrl))
+                                       // the url might have changed after 
page has been rendered (e.g. the
+                                       // stateless flag might have changed 
because stateful components
+                                       // were added)
+                                       final Url afterRenderUrl = requestCycle
+                                               
.mapUrlFor(getRenderPageRequestHandler());
+
+                                       if 
(beforeRenderUrl.getSegments().equals(afterRenderUrl.getSegments()) == false)
+                                       {
+                                               // the amount of segments is 
different - generated relative URLs
+                                               // will not work, we need to 
rerender the page. This can happen
+                                               // with IRequestHandlers that 
produce different URLs with
+                                               // different amount of segments 
for stateless and stateful pages
+                                               response = 
renderPage(afterRenderUrl, requestCycle);
+                                       }
+
+                                       if (currentUrl.equals(afterRenderUrl))
                                        {
                                                // no need to redirect when 
both urls are exactly the same
                                                
response.writeTo((WebResponse)requestCycle.getResponse());
@@ -289,9 +304,9 @@ public class WebPageRenderer extends PageRenderer
                                        }
                                        else
                                        {
-                                               
storeBufferedResponse(renderTargetUrl, response);
+                                               
storeBufferedResponse(afterRenderUrl, response);
 
-                                               redirectTo(renderTargetUrl, 
requestCycle);
+                                               redirectTo(afterRenderUrl, 
requestCycle);
                                        }
                                }
                        }

Reply via email to