Author: pete
Date: Wed Oct 13 22:57:25 2010
New Revision: 1022318

URL: http://svn.apache.org/viewvc?rev=1022318&view=rev
Log:
WICKET-3086: 

- setResponsePage() for ajax requests
- redirect for ajax during page processing
- iframe-safe ajax base url during upload
- determination of absolute path in ajax mode

Modified:
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=1022318&r1=1022317&r2=1022318&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
 Wed Oct 13 22:57:25 2010
@@ -118,6 +118,29 @@ public abstract class WebRequest extends
                return Strings.isTrue(getHeader(HEADER_AJAX)) ||
                        
Strings.isTrue(getRequestParameters().getParameterValue(PARAM_AJAX).toString());
        }
+       
+       
+       private static final String PARAM_AJAX_BASE_URL = "wicket:ajax:baseurl";
+       private static final String HEADER_AJAX_BASE_URL = 
"Wicket-Ajax-BaseURL";
+
+       /**
+        * Returns the ajax base Url if this request is an Ajax request.
+        *  
+        * @return if the request is an ajax request it will return the ajax 
base Url otherwise null
+        */
+       public String getAjaxBaseUrl()
+       {
+               if (isAjax())
+               {
+                       String baseUrl = getHeader(HEADER_AJAX_BASE_URL);
+
+                       if (baseUrl != null)
+                               return baseUrl;
+
+                       return 
getRequestParameters().getParameterValue(PARAM_AJAX_BASE_URL).toString(null);
+               }
+               return null;
+       }
 
        /**
         * Returns request with specified URL and same POST parameters as this 
request.

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java?rev=1022318&r1=1022317&r2=1022318&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
 Wed Oct 13 22:57:25 2010
@@ -297,7 +297,7 @@ public abstract class AbstractDefaultAja
 
                Url oldBaseURL = requestCycle.getUrlRenderer().getBaseUrl();
                WebRequest request = (WebRequest)requestCycle.getRequest();
-               Url baseURL = 
Url.parse(request.getHeader("Wicket-Ajax-BaseURL"), request.getCharset());
+               Url baseURL = Url.parse(request.getAjaxBaseUrl(), 
request.getCharset());
                requestCycle.getUrlRenderer().setBaseUrl(baseURL);
 
                respond(target);

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java?rev=1022318&r1=1022317&r2=1022318&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java 
(original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java 
Wed Oct 13 22:57:25 2010
@@ -576,7 +576,7 @@ public class AjaxRequestTarget implement
                        RequestCycle rc = (RequestCycle)requestCycle;
                        Url oldBaseURL = rc.getUrlRenderer().getBaseUrl();
                        WebRequest request = 
(WebRequest)requestCycle.getRequest();
-                       Url baseURL = 
Url.parse(request.getHeader("Wicket-Ajax-BaseURL"), request.getCharset());
+                       Url baseURL = Url.parse(request.getAjaxBaseUrl(), 
request.getCharset());
 
                        rc.getUrlRenderer().setBaseUrl(baseURL);
 

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js?rev=1022318&r1=1022317&r2=1022318&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js Wed 
Oct 13 22:57:25 2010
@@ -1151,7 +1151,7 @@ Wicket.Ajax.Call.prototype = {
                
                // reconfigure the form
                form.target=iframe.name;
-               form.action=this.request.url + "&wicket:ajax=true";
+               form.action=this.request.url + 
"&wicket:ajax=true&wicket:ajax:baseurl=" + 
Wicket.Form.encode(Wicket.Ajax.baseUrl);
                form.method="post";
                form.enctype="multipart/form-data";
                form.encoding="multipart/form-data";

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=1022318&r1=1022317&r2=1022318&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
 Wed Oct 13 22:57:25 2010
@@ -217,13 +217,16 @@ public class ServletWebResponse extends 
 
                        if (webRequest.isAjax())
                        {
-                               String ajaxBaseUrl = 
httpServletRequest.getHeader("Wicket-Ajax-BaseURL");
+                               String ajaxBaseUrl = 
webRequest.getAjaxBaseUrl();
 
                                if (ajaxBaseUrl == null)
                                        throw new IllegalStateException(
                                                "current ajax request is 
missing the base url header");
 
-                               current = Url.parse('/' + ajaxBaseUrl, charset);
+                               String contextPath = 
httpServletRequest.getContextPath();
+                               String filterPrefix = 
webRequest.getFilterPrefix();
+                               
+                               current = Url.parse(contextPath + '/' + 
filterPrefix + ajaxBaseUrl, charset);
                        }
                        else
                        {

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=1022318&r1=1022317&r2=1022318&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
 Wed Oct 13 22:57:25 2010
@@ -27,6 +27,7 @@ import org.apache.wicket.request.compone
 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;
@@ -159,7 +160,6 @@ public class WebPageRenderer extends Pag
        {
                WebResponse response = (WebResponse)requestCycle.getResponse();
                String relativeUrl = 
requestCycle.getUrlRenderer().renderUrl(url);
-               response.reset();
                response.sendRedirect(relativeUrl);
        }
 
@@ -169,108 +169,132 @@ public class WebPageRenderer extends Pag
        @Override
        public void respond(RequestCycle requestCycle)
        {
-               Url currentUrl = requestCycle.getUrlRenderer().getBaseUrl();
-               Url targetUrl = 
requestCycle.mapUrlFor(getRenderPageRequestHandler());
+               Url previousBaseUrl = null;
 
-               //
-               // the code below is little hairy but we have to handle 3 
redirect policies
-               // and 3 rendering strategies
-               //
-
-               // try to get an already rendered buffered response for current 
URL
-               BufferedWebResponse bufferedResponse = 
getAndRemoveBufferedResponse(currentUrl);
-
-               if (bufferedResponse != null)
-               {
-                       logger.warn("The Buffered response should be handled by 
BufferedResponseRequestHandler");
-                       // if there is saved response for this URL render it
-                       
bufferedResponse.writeTo((WebResponse)requestCycle.getResponse());
-               }
-               else if (getRedirectPolicy() == RedirectPolicy.NEVER_REDIRECT 
|| isOnePassRender() //
-                       ||
-                       (targetUrl.equals(currentUrl) && 
!getPageProvider().isNewPageInstance() && !getPage().isPageStateless()) //
-                       || (targetUrl.equals(currentUrl) && 
isRedirectToRender()))
+               try
                {
-                       // if the policy is never to redirect
-                       // or one pass render mode is on
-                       // or the targetUrl matches current url and the page is 
not stateless
-                       // or the targetUrl matches current url, page is 
stateless but it's redirect-to-render
-                       // just render the page
-                       BufferedWebResponse response = renderPage(currentUrl, 
requestCycle);
-                       if (response != null)
+                       // in case of ajax we have to set the proper base 
address for url rendering
+                       if (requestCycle.getRequest() instanceof WebRequest)
                        {
-                               
response.writeTo((WebResponse)requestCycle.getResponse());
-                       }
-               }
-               else if (!targetUrl.equals(currentUrl) && //
-                       (getRedirectPolicy() == RedirectPolicy.ALWAYS_REDIRECT 
|| isRedirectToRender()))
-               {
-                       // if target URL is different
-                       // and render policy is always-redirect or it's 
redirect-to-render
-                       redirectTo(targetUrl, requestCycle);
-               }
-               else if (!targetUrl.equals(currentUrl) //
-                       &&
-                       isSessionTemporary() && getPage().isPageStateless())
-               {
-                       // if 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
-
-                       // note: if we had session here we would render the 
page to buffer and then redirect to
-                       // URL generated *after* page has been rendered (the 
statelessness may change during
-                       // render). this would save one redirect because now we 
have to render to URL generated
-                       // *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)
-                       redirectTo(targetUrl, requestCycle);
-               }
-               else if (isRedirectToBuffer())
-               {
-                       // redirect to buffer
-                       BufferedWebResponse response = renderPage(targetUrl, 
requestCycle);
+                               WebRequest webRequest = 
(WebRequest)requestCycle.getRequest();
+                               String ajaxBaseUrl = 
webRequest.getAjaxBaseUrl();
 
-                       if (response == null)
-                       {
-                               return;
+                               if (ajaxBaseUrl != null)
+                               {
+                                       Url currentBaseUrl = 
Url.parse(ajaxBaseUrl, webRequest.getCharset());
+                                       previousBaseUrl = 
requestCycle.getUrlRenderer().setBaseUrl(currentBaseUrl);
+                               }
                        }
 
-                       // 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());
+                       Url currentUrl = 
requestCycle.getUrlRenderer().getBaseUrl();
+                       Url targetUrl = 
requestCycle.mapUrlFor(getRenderPageRequestHandler());
+                       boolean sameUrl = targetUrl.equals(currentUrl);
+
+                       //
+                       // the code below is little hairy but we have to handle 
3 redirect policies
+                       // and 3 rendering strategies
+                       //
 
-                       if 
(targetUrl.getSegments().equals(targetUrl2.getSegments()) == false)
+                       // try to get an already rendered buffered response for 
current URL
+                       BufferedWebResponse bufferedResponse = 
getAndRemoveBufferedResponse(currentUrl);
+
+                       if (bufferedResponse != null)
                        {
-                               // 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);
+                               logger.warn("The Buffered response should be 
handled by BufferedResponseRequestHandler");
+                               // if there is saved response for this URL 
render it
+                               
bufferedResponse.writeTo((WebResponse)requestCycle.getResponse());
                        }
-
-                       // if page is still stateless after render
-                       if (getPage().isPageStateless() && 
!enableRedirectForStatelessPage())
+                       else if (getRedirectPolicy() == 
RedirectPolicy.NEVER_REDIRECT
+                               ||
+                               isOnePassRender()
+                               ||
+                               (sameUrl && 
!getPageProvider().isNewPageInstance() && !getPage().isPageStateless())
+                               ||
+                               (sameUrl && isRedirectToRender()))
                        {
-                               // 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 explicitely
-                               
response.writeTo((WebResponse)requestCycle.getResponse());
+                               // if the policy is never to redirect
+                               // or one pass render mode is on
+                               // or the targetUrl matches current url and the 
page is not stateless
+                               // or the targetUrl matches current url, page 
is stateless but it's redirect-to-render
+                               // just render the page
+                               BufferedWebResponse response = 
renderPage(currentUrl, requestCycle);
+                               if (response != null)
+                               {
+                                       
response.writeTo((WebResponse)requestCycle.getResponse());
+                               }
                        }
-                       else
+                       else if (!sameUrl && (getRedirectPolicy() == 
RedirectPolicy.ALWAYS_REDIRECT || isRedirectToRender()))
+                       {
+                               // if target URL is different
+                               // and render policy is always-redirect or it's 
redirect-to-render
+                               redirectTo(targetUrl, requestCycle);
+                       }
+                       else if (!sameUrl && isSessionTemporary() && 
getPage().isPageStateless())
+                       {
+                               // if 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
+
+                               // note: if we had session here we would render 
the page to buffer and then redirect to
+                               // URL generated *after* page has been rendered 
(the statelessness may change during
+                               // render). this would save one redirect 
because now we have to render to URL generated
+                               // *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)
+                               redirectTo(targetUrl, requestCycle);
+                       }
+                       else if (isRedirectToBuffer())
                        {
-                               storeBufferedResponse(targetUrl2, response);
+                               // 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 page is still stateless after render
+                               if (getPage().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 explicitely
+                                       
response.writeTo((WebResponse)requestCycle.getResponse());
+                               }
+                               else
+                               {
+                                       storeBufferedResponse(targetUrl2, 
response);
 
-                               redirectTo(targetUrl2, requestCycle);
+                                       redirectTo(targetUrl2, requestCycle);
+                               }
+                       }
+                       else
+                       {
+                               throw new IllegalStateException("Unknown 
RenderStrategy.");
                        }
                }
-               else
+               finally
                {
-                       throw new IllegalStateException("Unknown 
RenderStrategy.");
+                       if (previousBaseUrl != null)
+                               
requestCycle.getUrlRenderer().setBaseUrl(previousBaseUrl);
                }
        }
 


Reply via email to