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("\";");
}
/**