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 2013/06/13 11:48:20 UTC

[08/11] git commit: full test webpagerender method for current implementation state

full test webpagerender method for current implementation state


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

Branch: refs/heads/master
Commit: 4950a773dc7e3d286c67cdc4611f3b9bd2b060af
Parents: b891bb8
Author: Michael Mosmann <mi...@mosmann.de>
Authored: Thu Sep 27 00:57:12 2012 +0200
Committer: Michael Mosmann <mi...@mosmann.de>
Committed: Thu Sep 27 00:57:12 2012 +0200

----------------------------------------------------------------------
 .../request/handler/render/WebPageRenderer.java | 128 ++++++++++---------
 .../handler/render/AbstractVariations.java      |  37 ++++++
 .../render/ShouldRedirectToTargetUrl.java       |  55 ++++++++
 ...uldRenderPageAndWriteResponseVariations.java |  19 +--
 .../handler/render/WebPageRendererTest.java     |  68 ++++++++--
 5 files changed, 222 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/4950a773/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 b74df37..6bb7b90 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
@@ -182,6 +182,7 @@ public class WebPageRenderer extends PageRenderer
 
 			boolean onePassRender = isOnePassRender();
 			boolean isRedirectToRender = isRedirectToRender();
+			boolean redirectToBuffer = isRedirectToBuffer();
 
 			boolean targetEqualsCurrentUrl = targetUrl.equals(currentUrl);
 			boolean isNewPageInstance = getPageProvider().isNewPageInstance();
@@ -195,76 +196,79 @@ public class WebPageRenderer extends PageRenderer
 					response.writeTo((WebResponse)requestCycle.getResponse());
 				}
 			}
-			else if (shouldRedirectToTargetUrl(isAjax, redirectPolicy, isRedirectToRender, targetEqualsCurrentUrl, isNewPageInstance, isPageStateless))
-			{
-				redirectTo(targetUrl, requestCycle);
-			}
-			else
-			{
-				if (isRedirectToBuffer() == false && logger.isDebugEnabled())
-				{
-					String details = String.format("redirect strategy: '%s', isAjax: '%s', redirect policy: '%s', " +
-							"current url: '%s', target url: '%s', is new: '%s', is stateless: '%s', is temporary: '%s'",
-							Application.get().getRequestCycleSettings().getRenderStrategy(),
-							isAjax, redirectPolicy, currentUrl, targetUrl, isNewPageInstance,
-									isPageStateless, isSessionTemporary());
-					logger.debug("Falling back to Redirect_To_Buffer render strategy because none of the conditions " +
-							"matched. Details: " + details);
-				}
-
-				// 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.mapUrlFor(getRenderPageRequestHandler());
-
-				if (targetUrl.getSegments().equals(targetUrl2.getSegments()) == false)
-				{
-					// the amount of segments is different - generated relative URLs will not work, we
-					// need to rerender the page. This shouldn't happen, but in theory it can - with
-					// RequestHandlerEncoders that produce different URLs with different amount of
-					// segments for stateless and stateful pages
-					response = renderPage(targetUrl2, requestCycle);
-				}
-
-				if (currentUrl.equals(targetUrl2))
+			else {
+				boolean sessionTemporary = isSessionTemporary();
+				if (shouldRedirectToTargetUrl(isAjax, redirectPolicy, isRedirectToRender, targetEqualsCurrentUrl, isNewPageInstance, isPageStateless, sessionTemporary))
 				{
-					// no need to redirect when both urls are exactly the same
-					response.writeTo((WebResponse)requestCycle.getResponse());
-				}
-				// if page is still stateless after render
-				else if (isPageStateless && !enableRedirectForStatelessPage())
-				{
-					// we don't want the redirect to happen for stateless page
-					// example:
-					// when a normal mounted stateful page is hit at /mount/point
-					// wicket renders the page to buffer and redirects to /mount/point?12
-					// but for stateless page the redirect is not necessary
-					// also for listener interface on stateful page we want to redirect
-					// after the listener is invoked, but on stateless page the user
-					// must ask for redirect explicitly
-					response.writeTo((WebResponse)requestCycle.getResponse());
+					redirectTo(targetUrl, requestCycle);
 				}
 				else
 				{
-					storeBufferedResponse(targetUrl2, response);
-
-					redirectTo(targetUrl2, requestCycle);
+					if (redirectToBuffer == false && logger.isDebugEnabled())
+					{
+						String details = String.format("redirect strategy: '%s', isAjax: '%s', redirect policy: '%s', " +
+								"current url: '%s', target url: '%s', is new: '%s', is stateless: '%s', is temporary: '%s'",
+								Application.get().getRequestCycleSettings().getRenderStrategy(),
+								isAjax, redirectPolicy, currentUrl, targetUrl, isNewPageInstance,
+										isPageStateless, sessionTemporary);
+						logger.debug("Falling back to Redirect_To_Buffer render strategy because none of the conditions " +
+								"matched. Details: " + details);
+					}
+
+					// 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.mapUrlFor(getRenderPageRequestHandler());
+
+					if (targetUrl.getSegments().equals(targetUrl2.getSegments()) == false)
+					{
+						// the amount of segments is different - generated relative URLs will not work, we
+						// need to rerender the page. This shouldn't happen, but in theory it can - with
+						// RequestHandlerEncoders that produce different URLs with different amount of
+						// segments for stateless and stateful pages
+						response = renderPage(targetUrl2, requestCycle);
+					}
+
+					if (currentUrl.equals(targetUrl2))
+					{
+						// no need to redirect when both urls are exactly the same
+						response.writeTo((WebResponse)requestCycle.getResponse());
+					}
+					// if page is still stateless after render
+					else if (isPageStateless && !enableRedirectForStatelessPage())
+					{
+						// we don't want the redirect to happen for stateless page
+						// example:
+						// when a normal mounted stateful page is hit at /mount/point
+						// wicket renders the page to buffer and redirects to /mount/point?12
+						// but for stateless page the redirect is not necessary
+						// also for listener interface on stateful page we want to redirect
+						// after the listener is invoked, but on stateless page the user
+						// must ask for redirect explicitly
+						response.writeTo((WebResponse)requestCycle.getResponse());
+					}
+					else
+					{
+						storeBufferedResponse(targetUrl2, response);
+
+						redirectTo(targetUrl2, requestCycle);
+					}
 				}
 			}
 		}
 	}
 
-	protected boolean shouldRedirectToTargetUrl(boolean ajax, RedirectPolicy redirectPolicy, boolean redirectToRender, boolean targetEqualsCurrentUrl, boolean newPageInstance, boolean pageStateless) {
+	protected static boolean shouldRedirectToTargetUrl(boolean ajax, RedirectPolicy redirectPolicy, boolean redirectToRender, boolean targetEqualsCurrentUrl, boolean newPageInstance, boolean pageStateless,boolean sessionTemporary) {
 		return shouldRedirectToTargetUrlConditionA(ajax, redirectPolicy, redirectToRender, targetEqualsCurrentUrl)
 			||
-						shouldAlsoRedirectToTargetUrlConditionB(targetEqualsCurrentUrl, newPageInstance, pageStateless);
+						shouldAlsoRedirectToTargetUrlConditionB(targetEqualsCurrentUrl, newPageInstance, pageStateless,sessionTemporary);
 	}
 
 	// if
@@ -274,7 +278,7 @@ public class WebPageRenderer extends PageRenderer
 	//	or
 	//		its ajax and the targetUrl matches current url
 	// just redirect
-	protected static boolean shouldRedirectToTargetUrlConditionA(boolean ajax, RedirectPolicy redirectPolicy, boolean redirectToRender, boolean targetEqualsCurrentUrl) {
+	private static boolean shouldRedirectToTargetUrlConditionA(boolean ajax, RedirectPolicy redirectPolicy, boolean redirectToRender, boolean targetEqualsCurrentUrl) {
 		return alwaysRedirect(redirectPolicy) //
 						||
 						redirectToRender //
@@ -295,10 +299,10 @@ public class WebPageRenderer extends PageRenderer
 	// *before* page is rendered, render the page, get URL after render and if the URL is
 	// different (meaning page is not stateless), save the buffer and redirect again (which
 	// is pretty much what the next step does)
-	private boolean shouldAlsoRedirectToTargetUrlConditionB(boolean targetEqualsCurrentUrl, boolean newPageInstance, boolean pageStateless) {
+	private static  boolean shouldAlsoRedirectToTargetUrlConditionB(boolean targetEqualsCurrentUrl, boolean newPageInstance, boolean pageStateless, boolean sessionTemporary) {
 		return !targetEqualsCurrentUrl //
 			&&
-			(newPageInstance || (isSessionTemporary() && pageStateless));
+			(newPageInstance || (sessionTemporary && pageStateless));
 	}
 
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/4950a773/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
new file mode 100644
index 0000000..ddec3ca
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.handler.render;
+
+public abstract class AbstractVariations {
+
+	protected abstract VariationIterator<?> last();
+
+	public abstract boolean getResult();
+
+	public boolean hasNextVariation() {
+		return last().hasNextVariation();
+	}
+
+	public void nextVariation() {
+		last().nextVariation();
+	}
+
+	protected static void toString(StringBuilder sb,String label, VariationIterator<?> iterator) {
+		sb.append(label).append("=").append(iterator.value()).append(",");
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/4950a773/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRedirectToTargetUrl.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRedirectToTargetUrl.java b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRedirectToTargetUrl.java
new file mode 100644
index 0000000..e54768c
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRedirectToTargetUrl.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.handler.render;
+
+import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
+
+public class ShouldRedirectToTargetUrl extends AbstractVariations {
+
+	VariationIterator<Boolean> ajax=VariationIterator.of(Variation.ofBoolean());
+	VariationIterator<RenderPageRequestHandler.RedirectPolicy> redirectPolicy=VariationIterator.of(ajax,Variation.of(RenderPageRequestHandler.RedirectPolicy.class));
+	VariationIterator<Boolean> redirectToRender=VariationIterator.of(redirectPolicy,Variation.ofBoolean());
+	VariationIterator<Boolean> targetEqualsCurrentUrl=VariationIterator.of(redirectToRender,Variation.ofBoolean());
+	VariationIterator<Boolean> newPageInstance=VariationIterator.of(targetEqualsCurrentUrl,Variation.ofBoolean());
+	VariationIterator<Boolean> pageStateless=VariationIterator.of(newPageInstance,Variation.ofBoolean());
+	VariationIterator<Boolean> sessionTemporary=VariationIterator.of(pageStateless,Variation.ofBoolean());
+
+	VariationIterator<Boolean> last=sessionTemporary;
+
+
+	public String toString() {
+		StringBuilder sb=new StringBuilder();
+		toString(sb,"ajax",ajax);
+		toString(sb,"redirectPolicy",redirectPolicy);
+		toString(sb,"redirectToRender",redirectToRender);
+		toString(sb,"targetEqualsCurrentUrl",targetEqualsCurrentUrl);
+		toString(sb,"newPageInstance",newPageInstance);
+		toString(sb,"pageStateless",pageStateless);
+		toString(sb,"sessionTemporary",sessionTemporary);
+		return sb.toString();
+	}
+
+	@Override
+	protected VariationIterator<?> last() {
+		return last;
+	}
+
+	@Override
+	public boolean getResult() {
+		return WebPageRenderer.shouldRedirectToTargetUrl(ajax.value(), redirectPolicy.value(), redirectToRender.value(), targetEqualsCurrentUrl.value(), newPageInstance.value(), pageStateless.value(),sessionTemporary.value());
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/4950a773/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
index f1bad05..213c395 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
+++ b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
@@ -18,7 +18,7 @@ package org.apache.wicket.request.handler.render;
 
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
 
-public class ShouldRenderPageAndWriteResponseVariations {
+public class ShouldRenderPageAndWriteResponseVariations extends AbstractVariations {
 
 	VariationIterator<RenderPageRequestHandler.RedirectPolicy> redirectPolicy=VariationIterator.of(Variation.of(RenderPageRequestHandler.RedirectPolicy.class));
 	VariationIterator<Boolean> ajax=VariationIterator.of(redirectPolicy, Variation.ofBoolean());
@@ -31,16 +31,13 @@ public class ShouldRenderPageAndWriteResponseVariations {
 
 	VariationIterator<Boolean> last=pageStateless;
 
-	public boolean getResult() {
-		return WebPageRenderer.shouldRenderPageAndWriteResponse(ajax.value(),onePassRender.value(),redirectToRender.value(),redirectPolicy.value(),shouldPreserveClientUrl.value(),targetEqualsCurrentUrl.value(),newPageInstance.value(),pageStateless.value());
-	}
-
-	public boolean hasNextVariation() {
-		return last.hasNextVariation();
+	@Override
+	protected VariationIterator<?> last() {
+		return last;
 	}
 
-	public void nextVariation() {
-		last.nextVariation();
+	public boolean getResult() {
+		return WebPageRenderer.shouldRenderPageAndWriteResponse(ajax.value(),onePassRender.value(),redirectToRender.value(),redirectPolicy.value(),shouldPreserveClientUrl.value(),targetEqualsCurrentUrl.value(),newPageInstance.value(),pageStateless.value());
 	}
 
 	public String toString() {
@@ -56,7 +53,5 @@ public class ShouldRenderPageAndWriteResponseVariations {
 		return sb.toString();
 	}
 
-	static void toString(StringBuilder sb,String label, VariationIterator<?> iterator) {
-		sb.append(label).append("=").append(iterator.value()).append(",");
-	}
+
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4950a773/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
index 47022a3..a537360 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
@@ -761,20 +761,13 @@ public class WebPageRendererTest
 
 	@Test
 	public void testShouldRenderPageAndWriteResponseVariationIntegrity() {
-		int count=1;
-		ShouldRenderPageAndWriteResponseVariations variations=new ShouldRenderPageAndWriteResponseVariations();
-		while (variations.hasNextVariation()) {
-			count++;
-			variations.nextVariation();
-		}
+		int count = countVariations(new ShouldRenderPageAndWriteResponseVariations());
 		Assert.assertEquals(2*2*2*2*2*2*2*3,count);
 	}
 
 	@Test
 	public void testShouldRenderPageAndWriteResponseVariation() {
 
-		int idx=0;
-
 		String match =
 						"    X   XXXXXXXX" +
 						"    XXXXXXXXXXXX" +
@@ -801,14 +794,67 @@ public class WebPageRendererTest
 						"        XXXXXXXX" +
 						"    XXXXXXXXXXX";
 
-		ShouldRenderPageAndWriteResponseVariations variations=new ShouldRenderPageAndWriteResponseVariations();
+		checkVariations(match,new ShouldRenderPageAndWriteResponseVariations());
+	}
+
+	@Test
+	public void testShouldRedirectToTargetUrlIntegrity() {
+		int count = countVariations(new ShouldRedirectToTargetUrl());
+		Assert.assertEquals(2*3*2*2*2*2*2,count);
+	}
+
+	@Test
+	public void testShouldRedirectToTargetUrl() {
+
+		String match =
+						"XXXXXXXXXXXXXXXX" +
+						"XXXXXXXXXXXXXXXX" +
+						"   XXXXX        " +
+						"XXXXXXXXXXXXXXXX" +
+						"   XXXXX        " +
+						"XXXXXXXXXXXXXXXX" +
+						"XXXXXXXXXXXXXXXX" +
+						"XXXXXXXXXXXXXXXX" +
+						"   XXXXXXXXXXXXX" +
+						"XXXXXXXXXXXXXXXX" +
+						"   XXXXXXXXXXXXX" +
+						"XXXXXXXXXXXXXXX";
+
+		checkVariations(match,new ShouldRedirectToTargetUrl());
+	}
+
+
+	private int countVariations(AbstractVariations variations) {
+		int count=1;
 		while (variations.hasNextVariation()) {
-			Assert.assertEquals(variations.toString(), match.charAt(idx) == 'X',variations.getResult());
+			count++;
 			variations.nextVariation();
-			idx++;
 		}
+		return count;
+	}
 
+	private void checkVariations(String match,AbstractVariations variations) {
+		int idx=0;
+		while (variations.hasNextVariation()) {
+			Assert.assertEquals(variations.toString(), match.charAt(idx) == 'X', variations.getResult());
+			variations.nextVariation();
+			idx++;
+		}
+	}
 
+	private void printVariations(AbstractVariations variations) {
+		int idx=0;
+		System.out.print("\"");
+		while (variations.hasNextVariation()) {
+			System.out.print(variations.getResult() ? 'X': ' ');
+			variations.nextVariation();
+			idx++;
+			if (idx>=16) {
+				System.out.print("\"+\n\"");
+				idx=0;
+			}
+		}
+		System.out.println("\";");
 	}
 
 	/**