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 2010/12/17 17:01:42 UTC

svn commit: r1050433 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/request/handler/render/ main/java/org/apache/wicket/util/tester/ test/java/org/apache/wicket/request/handler/

Author: mgrigorov
Date: Fri Dec 17 16:01:41 2010
New Revision: 1050433

URL: http://svn.apache.org/viewvc?rev=1050433&view=rev
Log:
WICKET-3252 StalePageException on non-versioned Page in Ajax request does not render ajax-response

If a hit to stale page is made and the current request is an Ajax one then always redirect to the new page. It doesn't make sense to return the new page's markup in Ajax response

Added:
    wicket/trunk/wicket/src/test/java/org/apache/wicket/request/handler/
    wicket/trunk/wicket/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java   (with props)
Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java

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=1050433&r1=1050432&r2=1050433&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 Fri Dec 17 16:01:41 2010
@@ -21,12 +21,14 @@ 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.Request;
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.handler.RenderPageRequestHandler;
 import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
+import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.settings.IRequestCycleSettings.RenderStrategy;
 import org.slf4j.Logger;
@@ -97,6 +99,20 @@ public class WebPageRenderer extends Pag
 		return WebApplication.get().getAndRemoveBufferedResponse(getSessionId(), url);
 	}
 
+	private boolean isAjax(RequestCycle requestCycle)
+	{
+		boolean isAjax = false;
+
+		Request request = requestCycle.getRequest();
+		if (request instanceof WebRequest)
+		{
+			WebRequest webRequest = (WebRequest)request;
+			isAjax = webRequest.isAjax();
+		}
+
+		return isAjax;
+	}
+
 	/**
 	 * 
 	 * @param url
@@ -176,13 +192,15 @@ public class WebPageRenderer extends Pag
 		Url targetUrl = requestCycle.mapUrlFor(getRenderPageRequestHandler());
 
 		//
-		// the code below is little hairy but we have to handle 3 redirect policies
-		// and 3 rendering strategies
+		// the code below is little hairy but we have to handle 3 redirect policies,
+		// 3 rendering strategies and two kind of requests (ajax and normal)
 		//
 
 		// try to get an already rendered buffered response for current URL
 		BufferedWebResponse bufferedResponse = getAndRemoveBufferedResponse(currentUrl);
 
+		boolean isAjax = isAjax(requestCycle);
+
 		if (bufferedResponse != null)
 		{
 			logger.warn("The Buffered response should be handled by BufferedResponseRequestHandler");
@@ -191,8 +209,12 @@ public class WebPageRenderer extends Pag
 		}
 		else if (getRedirectPolicy() == RedirectPolicy.NEVER_REDIRECT || isOnePassRender() //
 			||
-			(targetUrl.equals(currentUrl) && !getPageProvider().isNewPageInstance() && !getPage().isPageStateless()) //
-			|| (targetUrl.equals(currentUrl) && isRedirectToRender()))
+			(!isAjax //
+				&&
+				(targetUrl.equals(currentUrl) && !getPageProvider().isNewPageInstance() && !getPage().isPageStateless()) //
+			|| (targetUrl.equals(currentUrl) && isRedirectToRender()) //
+			) //
+		) //
 		{
 			// if the policy is never to redirect
 			// or one pass render mode is on
@@ -205,8 +227,10 @@ public class WebPageRenderer extends Pag
 				response.writeTo((WebResponse)requestCycle.getResponse());
 			}
 		}
-		else if (!targetUrl.equals(currentUrl) && //
-			(getRedirectPolicy() == RedirectPolicy.ALWAYS_REDIRECT || isRedirectToRender()))
+		else if ((!targetUrl.equals(currentUrl) && getRedirectPolicy() == RedirectPolicy.ALWAYS_REDIRECT) //
+			||
+			isRedirectToRender() //
+			|| (isAjax && targetUrl.equals(currentUrl)))
 		{
 			// if target URL is different
 			// and render policy is always-redirect or it's redirect-to-render

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=1050433&r1=1050432&r2=1050433&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java Fri Dec 17 16:01:41 2010
@@ -21,6 +21,7 @@ import java.io.Serializable;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.nio.charset.Charset;
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -71,6 +72,8 @@ import org.apache.wicket.markup.html.lin
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.parser.XmlPullParser;
+import org.apache.wicket.markup.parser.XmlTag;
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.mock.MockPageManager;
 import org.apache.wicket.mock.MockRequestParameters;
@@ -105,6 +108,7 @@ import org.apache.wicket.session.ISessio
 import org.apache.wicket.settings.IRequestCycleSettings.RenderStrategy;
 import org.apache.wicket.util.IProvider;
 import org.apache.wicket.util.lang.Classes;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.visit.IVisit;
 import org.apache.wicket.util.visit.IVisitor;
@@ -186,6 +190,8 @@ public class BaseWicketTester
 
 	private boolean exposeExceptions = true;
 
+	private boolean useRequestUrlAsBase = true;
+
 	private IRequestHandler forcedHandler;
 
 	// Simulates the cookies maintained by the browser
@@ -635,6 +641,30 @@ public class BaseWicketTester
 	}
 
 	/**
+	 * 
+	 * @return last Wicket-Ajax-BaseURL set on AJAX HTTP request header
+	 */
+	public String getWicketAjaxBaserUrlFromLastRequest() throws IOException,
+		ResourceStreamNotFoundException, ParseException
+	{
+		XmlPullParser parser = new XmlPullParser();
+		parser.parse(getLastResponseAsString());
+		XmlTag tag = null;
+		do
+		{
+			tag = (XmlTag)parser.nextTag();
+			if (tag.isOpen() && tag.getName().equals("script") &&
+				"wicket-ajax-base-url".equals(tag.getString("id")))
+			{
+				parser.next();
+				return parser.getString().toString().split("\\\"")[1];
+			}
+		}
+		while (tag != null);
+		return null;
+	}
+
+	/**
 	 * @return list of prior requests
 	 */
 	public List<MockHttpServletRequest> getPreviousRequests()
@@ -1841,7 +1871,10 @@ public class BaseWicketTester
 	{
 		ServletWebRequest req = createServletWebRequest();
 		requestCycle.setRequest(req);
-		requestCycle.getUrlRenderer().setBaseUrl(req.getUrl());
+		if (useRequestUrlAsBase)
+		{
+			requestCycle.getUrlRenderer().setBaseUrl(req.getUrl());
+		}
 
 	}
 
@@ -1998,6 +2031,22 @@ public class BaseWicketTester
 	}
 
 	/**
+	 * @return useRequestUrlAsBase
+	 */
+	public boolean isUseRequestUrlAsBase()
+	{
+		return useRequestUrlAsBase;
+	}
+
+	/**
+	 * @param useRequestUrlAsBase
+	 */
+	public void setUseRequestUrlAsBase(boolean setBaseUrl)
+	{
+		this.useRequestUrlAsBase = setBaseUrl;
+	}
+
+	/**
 	 * 
 	 * @param _url
 	 */

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java?rev=1050433&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java Fri Dec 17 16:01:41 2010
@@ -0,0 +1,139 @@
+/*
+ * 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;
+
+import java.io.IOException;
+import java.text.ParseException;
+
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.mapper.StalePageException;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.junit.Test;
+
+/**
+ * 
+ * @see <a href="https://issues.apache.org/jira/browse/WICKET-3252">WICKET-3252</a>
+ * @author pedro
+ */
+public class PageProviderTest extends WicketTestCase
+{
+	@Test
+	public void testStalePageException()
+	{
+		tester.startPage(TestPage.class);
+		TestPage testPage = (TestPage)tester.getLastRenderedPage();
+
+		// cache the link to the first page version
+		String firstHRef = tester.urlFor(testPage.link);
+		// request a new page
+		tester.clickLink("link");
+
+		try
+		{
+			// just making clear that we are in the tester land
+			tester.setExposeExceptions(true);
+			// try to get the old one
+			tester.getRequest().setURL(firstHRef);
+			tester.processRequest();
+			fail("Stale page request process should throw StalePageException");
+		}
+		catch (StalePageException e)
+		{
+			assertTrue(true);
+		}
+	}
+
+	/**
+	 * Request an old URL in an AJAX request and assert that we have an AJAX response.
+	 * 
+	 */
+	public void testStalePageExceptionOnAjaxRequest() throws IOException,
+		ResourceStreamNotFoundException, ParseException
+	{
+		tester.startPage(TestPage.class);
+
+		TestPage testPage = (TestPage)tester.getLastRenderedPage();
+		// cache the old URL
+		Url firstAjaxLinkUrl = tester.urlFor(testPage.ajaxLink);
+
+		// request a new page
+		tester.clickLink("link");
+
+		tester.setExposeExceptions(false);
+		tester.setFollowRedirects(false);
+		tester.setUseRequestUrlAsBase(false);
+
+		// execute the old URL
+		executeAjaxUrlWithLastBaseUrl(firstAjaxLinkUrl);
+
+		assertTrue(tester.getLastResponseAsString().startsWith("<ajax-response>"));
+		assertTrue(tester.getLastResponse().isRedirect());
+	}
+
+	/**
+	 * 
+	 */
+	private void executeAjaxUrlWithLastBaseUrl(Url url) throws IOException,
+		ResourceStreamNotFoundException, ParseException
+	{
+		tester.getRequest().setUrl(url);
+		tester.getRequest().addHeader("Wicket-Ajax-BaseURL",
+			tester.getWicketAjaxBaserUrlFromLastRequest());
+		tester.getRequest().addHeader("Wicket-Ajax", "true");
+		tester.processRequest();
+	}
+
+	public static class TestPage extends WebPage implements IMarkupResourceStreamProvider
+	{
+		Link<Void> link;
+		AjaxLink<Void> ajaxLink;
+
+		public TestPage()
+		{
+			add(link = new Link<Void>("link")
+			{
+				@Override
+				public void onClick()
+				{
+				}
+			});
+			add(ajaxLink = new AjaxLink<Void>("ajaxLink")
+			{
+				@Override
+				public void onClick(AjaxRequestTarget target)
+				{
+				}
+			});
+		}
+
+		public IResourceStream getMarkupResourceStream(MarkupContainer container,
+			Class<?> containerClass)
+		{
+			return new StringResourceStream(
+				"<html><body><a wicket:id=\"link\"></a><a wicket:id=\"ajaxLink\"></a></body></html>");
+		}
+	}
+}

Propchange: wicket/trunk/wicket/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native



Re: svn commit: r1050433 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/request/handler/render/ main/java/org/apache/wicket/util/tester/ test/java/org/apache/wicket/request/handler/

Posted by Martin Grigorov <mg...@apache.org>.
Hi Jeremy,

On Sat, Dec 18, 2010 at 3:41 AM, Jeremy Thomerson <jeremy@wickettraining.com
> wrote:

> A couple questions about this commit (inline):
>
> On Fri, Dec 17, 2010 at 10:01 AM, <mg...@apache.org> wrote:
>
> > Author: mgrigorov
> > Date: Fri Dec 17 16:01:41 2010
> > New Revision: 1050433
> >
> > URL: http://svn.apache.org/viewvc?rev=1050433&view=rev
> > Log:
> > WICKET-3252 StalePageException on non-versioned Page in Ajax request does
> > not render ajax-response
> >
> > If a hit to stale page is made and the current request is an Ajax one
> then
> > always redirect to the new page. It doesn't make sense to return the new
> > page's markup in Ajax response
> >
>
> <snip>
>
>
> > +       private boolean isAjax(RequestCycle requestCycle)
> > +       {
> > +               boolean isAjax = false;
> > +
> > +               Request request = requestCycle.getRequest();
> > +               if (request instanceof WebRequest)
> > +               {
> > +                       WebRequest webRequest = (WebRequest)request;
> > +                       isAjax = webRequest.isAjax();
> > +               }
> > +
> > +               return isAjax;
> > +       }
> >
>
> Is this new method needed?  I haven't looked at exactly where this renderer
> is getting called, but can't we say the following?
> boolean isAjax = AjaxRequestTarget.get() != null;
>
> That's what we're doing elsewhere in the code.
>
> Yes, it is needed. In this particular case the request is to a stale page,
so the Ajax request handler (target) is transformed to
RenderPageRequestHandler with a new
page instance. That's why we need to check on a lower level.

Actually this code for checking whether the current request is Ajax is used
in few more places. Maybe we have to move it in some util class, e.g.
RequestUtil.


> +       public String getWicketAjaxBaserUrlFromLastRequest() throws
> > IOException,
> > +               ResourceStreamNotFoundException, ParseException
> >
>
> Typo here - "Baser" should be "Base".
>
Fixed! Thanks!

>
> Great work on writing a new test case for your change!
>
Actually the test is provided by Pedro. Thanks, Pedro!

>
> --
> Jeremy Thomerson
> http://wickettraining.com
> *Need a CMS for Wicket?  Use Brix! http://brixcms.org*
>

Re: svn commit: r1050433 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/request/handler/render/ main/java/org/apache/wicket/util/tester/ test/java/org/apache/wicket/request/handler/

Posted by Jeremy Thomerson <je...@wickettraining.com>.
A couple questions about this commit (inline):

On Fri, Dec 17, 2010 at 10:01 AM, <mg...@apache.org> wrote:

> Author: mgrigorov
> Date: Fri Dec 17 16:01:41 2010
> New Revision: 1050433
>
> URL: http://svn.apache.org/viewvc?rev=1050433&view=rev
> Log:
> WICKET-3252 StalePageException on non-versioned Page in Ajax request does
> not render ajax-response
>
> If a hit to stale page is made and the current request is an Ajax one then
> always redirect to the new page. It doesn't make sense to return the new
> page's markup in Ajax response
>

<snip>


> +       private boolean isAjax(RequestCycle requestCycle)
> +       {
> +               boolean isAjax = false;
> +
> +               Request request = requestCycle.getRequest();
> +               if (request instanceof WebRequest)
> +               {
> +                       WebRequest webRequest = (WebRequest)request;
> +                       isAjax = webRequest.isAjax();
> +               }
> +
> +               return isAjax;
> +       }
>

Is this new method needed?  I haven't looked at exactly where this renderer
is getting called, but can't we say the following?
boolean isAjax = AjaxRequestTarget.get() != null;

That's what we're doing elsewhere in the code.

+       public String getWicketAjaxBaserUrlFromLastRequest() throws
> IOException,
> +               ResourceStreamNotFoundException, ParseException
>

Typo here - "Baser" should be "Base".

Great work on writing a new test case for your change!

-- 
Jeremy Thomerson
http://wickettraining.com
*Need a CMS for Wicket?  Use Brix! http://brixcms.org*