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());