You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2010/08/01 23:32:24 UTC
svn commit: r981323 - in /wicket/trunk:
wicket-request/src/main/java/org/apache/wicket/request/RequestHandlerStack.java
wicket/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
Author: knopp
Date: Sun Aug 1 21:32:24 2010
New Revision: 981323
URL: http://svn.apache.org/viewvc?rev=981323&view=rev
Log:
Handle situation when current request handler is overriden during page render
Modified:
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/RequestHandlerStack.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
Modified: wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/RequestHandlerStack.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/RequestHandlerStack.java?rev=981323&r1=981322&r2=981323&view=diff
==============================================================================
--- wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/RequestHandlerStack.java (original)
+++ wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/RequestHandlerStack.java Sun Aug 1 21:32:24 2010
@@ -135,6 +135,17 @@ public abstract class RequestHandlerStac
}
/**
+ * Returns the request handler scheduled after current request handler.
+ *
+ * @see #scheduleRequestHandlerAfterCurrent(IRequestHandler)
+ * @return handler or <code>null</code>
+ */
+ public IRequestHandler getRequestHandlerScheduledAfterCurrent()
+ {
+ return scheduledAfterCurrent;
+ }
+
+ /**
* Replaces the currently executed {@link IRequestHandler} with new {@link IRequestHandler}. The
* currently executed {@link IRequestHandler} is terminated and the new {@link IRequestHandler}
* is executed.
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java?rev=981323&r1=981322&r2=981323&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java Sun Aug 1 21:32:24 2010
@@ -20,6 +20,7 @@ import org.apache.wicket.Application;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.BufferedWebResponse;
import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.component.IRequestablePage;
@@ -113,6 +114,8 @@ public class WebPageRenderer extends Pag
*/
protected BufferedWebResponse renderPage(Url targetUrl, RequestCycle requestCycle)
{
+ IRequestHandler scheduled = requestCycle.getRequestHandlerScheduledAfterCurrent();
+
// keep the original response
final Response originalResponse = requestCycle.getResponse();
@@ -126,7 +129,18 @@ public class WebPageRenderer extends Pag
{
requestCycle.setResponse(response);
getPage().renderPage();
- return response;
+
+ if (scheduled == null && requestCycle.getRequestHandlerScheduledAfterCurrent() != null)
+ {
+ // This is a special case. During page render another request handler got scheduled.
+ // The handler
+ // will want to overwrite the response, so we need to let it
+ return null;
+ }
+ else
+ {
+ return response;
+ }
}
finally
{
@@ -183,7 +197,11 @@ public class WebPageRenderer extends Pag
// or the targetUrl matches current url and the page is not stateless
// or the targetUrl matches current url, page is stateless but it's redirect-to-render
// just render the page
- renderPage();
+ BufferedWebResponse response = renderPage(targetUrl, requestCycle);
+ if (response != null)
+ {
+ response.writeTo((WebResponse)requestCycle.getResponse());
+ }
}
else if (!targetUrl.equals(currentUrl) && //
(getRedirectPolicy() == RedirectPolicy.ALWAYS_REDIRECT || isRedirectToRender()))
@@ -213,6 +231,11 @@ public class WebPageRenderer extends Pag
// redirect to buffer
BufferedWebResponse response = renderPage(targetUrl, requestCycle);
+ if (response == null)
+ {
+ return;
+ }
+
// check if the url hasn't changed after page has been rendered
// (i.e. the stateless flag might have changed which could result in different page url)
Url targetUrl2 = requestCycle.urlFor(getRenderPageRequestHandler());