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


Reply via email to