You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2010/10/14 00:57:25 UTC

svn commit: r1022318 - in /wicket/trunk: wicket-request/src/main/java/org/apache/wicket/request/http/ wicket/src/main/java/org/apache/wicket/ajax/ wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ wicket/src/main/java/org/apache/wicket/requ...

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);
 		}
 	}