You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2011/04/13 21:18:32 UTC
svn commit: r1091892 - in /wicket/trunk/wicket-core/src:
main/java/org/apache/wicket/request/handler/render/
test/java/org/apache/wicket/request/handler/render/
Author: mgrigorov
Date: Wed Apr 13 19:18:31 2011
New Revision: 1091892
URL: http://svn.apache.org/viewvc?rev=1091892&view=rev
Log:
WICKET-3347 Simplify somehow the code in org.apache.wicket.request.handler.render.WebPageRenderer.respond(RequestCycle)
Add more unit tests for page renderer.
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/PageRenderer.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/PageRenderer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/PageRenderer.java?rev=1091892&r1=1091891&r2=1091892&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/PageRenderer.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/PageRenderer.java Wed Apr 13 19:18:31 2011
@@ -106,6 +106,24 @@ public abstract class PageRenderer
return Session.get().isTemporary();
}
+ /**
+ * When the page renders to buffer and it is still stateless after rendering, this flag
+ * determines whether the redirect will take place or not.
+ * <p>
+ * By default we will redirect. This is so we do not end up having the browser be on a listener
+ * URL. A simple scenario is calling {@code setResponsePage(new StatelessPage())} inside form's
+ * {@code onSubmit()} or link's {@code onClick()} callbacks, or any other listener interface
+ * callback. What will happen is that the browser will be on URL like
+ * {@code ./wicket/page?0-2.IFormSubmitListener-form}, and we will not redirect - leaving the
+ * browser on such URL. This is a worse alternative then saving one redirect because it may
+ * cause problems if user presses the refresh button in the browser.
+ *
+ * @return redirect flag
+ */
+ protected boolean enableRedirectForStatelessPage()
+ {
+ return true;
+ }
/**
* Render the response using give {@link RequestCycle}.
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java?rev=1091892&r1=1091891&r2=1091892&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java Wed Apr 13 19:18:31 2011
@@ -260,23 +260,4 @@ public class WebPageRenderer extends Pag
throw new IllegalStateException("Unknown RenderStrategy.");
}
}
-
- /**
- * When the page renders to buffer and it is still stateless after rendering, this flag
- * determines whether the redirect will take place or not.
- * <p>
- * By default we will redirect. This is so we do not end up having the browser be on a listener
- * URL. A simple scenario is calling {@code setResponsePage(new StatelessPage())} inside form's
- * {@code onSubmit()} or link's {@code onClick()} callbacks, or any other listener interface
- * callback. What will happen is that the browser will be on URL like
- * {@code ./wicket/page?0-2.IFormSubmitListener-form}, and we will not redirect - leaving the
- * browser on such URL. This is a worse alternative then saving one redirect because it may
- * cause problems if user presses the refresh button in the browser.
- *
- * @return redirect flag
- */
- protected boolean enableRedirectForStatelessPage()
- {
- return true;
- }
}
Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java?rev=1091892&r1=1091891&r2=1091892&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java Wed Apr 13 19:18:31 2011
@@ -24,6 +24,8 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import org.apache.wicket.protocol.http.BufferedWebResponse;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.UrlRenderer;
@@ -35,6 +37,7 @@ import org.apache.wicket.request.handler
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.settings.IRequestCycleSettings;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -49,6 +52,8 @@ public class WebPageRendererTest
private UrlRenderer urlRenderer;
private WebRequest request;
private WebResponse response;
+ private IRequestablePage page;
+ private IPageProvider provider;
/**
* Common setup
@@ -56,9 +61,9 @@ public class WebPageRendererTest
@Before
public void before()
{
- IPageProvider provider = mock(IPageProvider.class);
+ provider = mock(IPageProvider.class);
- IRequestablePage page = mock(IRequestablePage.class);
+ page = mock(IRequestablePage.class);
when(provider.getPageInstance()).thenReturn(page);
handler = new RenderPageRequestHandler(provider);
@@ -254,6 +259,313 @@ public class WebPageRendererTest
}
/**
+ * Tests that when the current request is Ajax then a redirect should happen
+ */
+ @Test
+ public void testSameUrlsAndAjaxRequest()
+ {
+ PageRenderer renderer = new TestPageRenderer(handler);
+
+ Url sameUrl = Url.parse("same");
+
+ when(urlRenderer.getBaseUrl()).thenReturn(sameUrl);
+
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(sameUrl);
+
+ when(request.isAjax()).thenReturn(true);
+
+ renderer.respond(requestCycle);
+
+ verify(response, never()).write(any(byte[].class));
+ verify(response).sendRedirect(anyString());
+ }
+
+ /**
+ * Tests that when {@link IRequestCycleSettings.RenderStrategy#REDIRECT_TO_RENDER} is configured
+ * then no matter what are the fromUrl and toUrl a redirect will happen
+ */
+ @Test
+ public void testRedirectToRender()
+ {
+
+ PageRenderer renderer = new TestPageRenderer(handler)
+ {
+ @Override
+ protected boolean isRedirectToRender()
+ {
+ return true;
+ }
+
+ };
+
+ when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("a"));
+
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("b"));
+
+ renderer.respond(requestCycle);
+
+ verify(response, never()).write(any(byte[].class));
+ verify(response).sendRedirect(anyString());
+ }
+
+ /**
+ * Tests that when target URL is different and session is temporary and page is stateless this
+ * is special case when page is stateless but there is no session so we can't render it to
+ * buffer
+ */
+ @Test
+ public void testDifferentUrlsTemporarySessionAndStatelessPage()
+ {
+ when(page.isPageStateless()).thenReturn(true);
+
+ PageRenderer renderer = new TestPageRenderer(handler)
+ {
+ @Override
+ protected boolean isRedirectToBuffer()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean isSessionTemporary()
+ {
+ return true;
+ }
+ };
+
+ when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("a"));
+
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("b"));
+
+ renderer.respond(requestCycle);
+
+ verify(response, never()).write(any(byte[].class));
+ verify(response).sendRedirect(anyString());
+ }
+
+ /**
+ * Tests that when URLs are different and we have a page class and not an instance we can
+ * redirect to the url which will instantiate the instance of us
+ */
+ @Test
+ public void testDifferentUrlsAndNewPageInstance()
+ {
+ when(provider.isNewPageInstance()).thenReturn(true);
+
+ PageRenderer renderer = new TestPageRenderer(handler)
+ {
+ @Override
+ protected boolean isRedirectToBuffer()
+ {
+ return true;
+ }
+ };
+
+ when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("a"));
+
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("b"));
+
+ renderer.respond(requestCycle);
+
+ verify(response, never()).write(any(byte[].class));
+ verify(response).sendRedirect(anyString());
+ }
+
+ /**
+ * Tests that when during page render another request handler got scheduled. The handler will
+ * want to overwrite the response, so we need to let it
+ */
+ @Test
+ public void testRedirectToBufferNoPageToRender()
+ {
+ final AtomicBoolean stored = new AtomicBoolean(false);
+
+ PageRenderer renderer = new TestPageRenderer(handler)
+ {
+ @Override
+ protected boolean isRedirectToBuffer()
+ {
+ return true;
+ }
+
+ @Override
+ protected BufferedWebResponse renderPage(Url targetUrl, RequestCycle requestCycle)
+ {
+ return null;
+ }
+
+ @Override
+ protected void storeBufferedResponse(Url url, BufferedWebResponse response)
+ {
+ stored.set(true);
+ }
+ };
+
+ // needed for earlier checks
+ when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("a"));
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("b"));
+
+ renderer.respond(requestCycle);
+
+ verify(response, never()).write(any(byte[].class));
+ verify(response, never()).write(any(CharSequence.class));
+ verify(response, never()).sendRedirect(anyString());
+ Assert.assertFalse(stored.get());
+ }
+
+ /**
+ * Tests that when the page is stateless and redirect for stateless pages is disabled then the
+ * page should be written without redirect
+ */
+ @Test
+ public void testRedirectToBufferStatelessPageAndRedirectIsDisabled()
+ {
+ final AtomicBoolean stored = new AtomicBoolean(false);
+
+ PageRenderer renderer = new TestPageRenderer(handler)
+ {
+ @Override
+ protected boolean isRedirectToBuffer()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean enableRedirectForStatelessPage()
+ {
+ return false;
+ }
+
+ @Override
+ protected void storeBufferedResponse(Url url, BufferedWebResponse response)
+ {
+ stored.set(true);
+ }
+ };
+
+ when(page.isPageStateless()).thenReturn(true);
+
+ // needed for earlier checks
+ when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("a"));
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("b"));
+
+ renderer.respond(requestCycle);
+
+ verify(response).write(any(byte[].class));
+ verify(response, never()).sendRedirect(anyString());
+ Assert.assertFalse(stored.get());
+ }
+
+ /**
+ * Tests that when the page is stateless and redirect for stateless pages is enabled then there
+ * should be a redirect
+ */
+ @Test
+ public void testRedirectToBufferStatelessPageAndRedirectIsEsabled()
+ {
+ final AtomicBoolean stored = new AtomicBoolean(false);
+
+ PageRenderer renderer = new TestPageRenderer(handler)
+ {
+ @Override
+ protected boolean isRedirectToBuffer()
+ {
+ return true;
+ }
+
+ @Override
+ protected void storeBufferedResponse(Url url, BufferedWebResponse response)
+ {
+ stored.set(true);
+ }
+ };
+
+ when(page.isPageStateless()).thenReturn(true);
+
+ // needed for earlier checks
+ when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("a"));
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("b"));
+
+ renderer.respond(requestCycle);
+
+ verify(response, never()).write(any(byte[].class));
+ verify(response).sendRedirect(anyString());
+ Assert.assertTrue(stored.get());
+ }
+
+ /**
+ * Tests that when the page is stateful and the urls are different then there should be a
+ * redirect
+ */
+ @Test
+ public void testRedirectToBufferStatefulPage()
+ {
+ final AtomicBoolean stored = new AtomicBoolean(false);
+
+ PageRenderer renderer = new TestPageRenderer(handler)
+ {
+ @Override
+ protected boolean isRedirectToBuffer()
+ {
+ return true;
+ }
+
+ @Override
+ protected void storeBufferedResponse(Url url, BufferedWebResponse response)
+ {
+ stored.set(true);
+ }
+ };
+
+ // needed for earlier checks
+ when(urlRenderer.getBaseUrl()).thenReturn(Url.parse("a"));
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(Url.parse("b"));
+
+ renderer.respond(requestCycle);
+
+ verify(response, never()).write(any(byte[].class));
+ verify(response).sendRedirect(anyString());
+ Assert.assertTrue(stored.get());
+ }
+
+ /**
+ * Tests that when the page is stateful and the urls are the same then there should be a
+ * redirect
+ */
+ @Test
+ public void testRedirectToBufferStatefulPageAndSameUrls()
+ {
+ final AtomicBoolean stored = new AtomicBoolean(false);
+
+ PageRenderer renderer = new TestPageRenderer(handler)
+ {
+ @Override
+ protected boolean isRedirectToBuffer()
+ {
+ return true;
+ }
+
+ @Override
+ protected void storeBufferedResponse(Url url, BufferedWebResponse response)
+ {
+ stored.set(true);
+ }
+ };
+
+ Url sameUrl = Url.parse("same");
+
+ // needed for earlier checks
+ when(urlRenderer.getBaseUrl()).thenReturn(sameUrl);
+ when(requestCycle.mapUrlFor(eq(handler))).thenReturn(sameUrl);
+
+ renderer.respond(requestCycle);
+
+ verify(response).write(any(byte[].class));
+ verify(response, never()).sendRedirect(anyString());
+ Assert.assertFalse(stored.get());
+ }
+
+ /**
* Configures common methods which are used by all tests
*/
private static class TestPageRenderer extends WebPageRenderer
@@ -289,6 +601,10 @@ public class WebPageRendererTest
return false;
}
-
+ @Override
+ protected boolean isSessionTemporary()
+ {
+ return false;
+ }
}
}