These are just the default implementations of these two methods. If you change #newWebRequest() to return something else, e.g. PortletWebRequest, then you will have to override #newWebResponse() as well (e.g PortletWebResponse). Until this change ServletWebResponse was working directly with HttpServletRequest, now it has "wider knowledge" thru ServletWebRequest. Maybe we can change #newWebResponse() to receive "Response" instead of "WebResponse", but the cast will be still needed for this _default_ implementation. I chose "WebResponse" as type because this is in *Web*Application.
On Mon, Sep 20, 2010 at 12:03 PM, Peter Ertl <[email protected]> wrote: > I don't know if the cast to (ServletWebRequest) in webapplicat...@383 is > safe? > > return new HeaderBufferingWebResponse(new > ServletWebResponse((ServletWebRequest)webRequest, > > If it is safe then why not change > > protected WebResponse newWebResponse(final WebRequest webRequest, > final HttpServletResponse httpServletResponse) > > to > > protected WebResponse newWebResponse(final ServletWebRequest > webRequest, final HttpServletResponse httpServletResponse) > > ? > > That's exactly the location in code I did not know how to proceed. > > Igor mentioned that abstract WebRequest does not necessarily have to be > ServletWebRequest when running in different containers. > > @dev: any opinions on that? > > > Am 20.09.2010 um 10:30 schrieb Martin Grigorov: > > > Please review r998677. > > I implemented the logic we discussed in IRC with you before your change. > > > > On Mon, Sep 20, 2010 at 10:24 AM, Peter Ertl <[email protected]> wrote: > > > >> Hi Martin, > >> > >> I am aware of that uglyness but I could not figure out a clean way to > get > >> around it. > >> > >> When fixing WICKET-3048 I needed a way to detect if the current request > is > >> of type 'ajax'. > >> > >> However the ctor from ServletWebResponse is > >> > >> public ServletWebResponse(HttpServletRequest httpServletRequest, > >> HttpServletResponse httpServletResponse) > >> > >> To change it to > >> > >> public ServletWebResponse(ServletWebRequest servletWebRequest, > >> HttpServletResponse httpServletResponse) > >> > >> you would need to instantiate > >> > >> public ServletWebRequest(HttpServletRequest httpServletRequest, > >> String filterPrefix) > >> > >> However there's no easy way to get 'filterPrefix' in the relevant places > so > >> I was kind of stuck there. > >> > >> Note my TODO in ServletWebRequest line 389 :-( > >> > >> If you can figure out a clean way to get this done I will appreciate > that > >> :-) > >> > >> > >> > >> > >> > >> > >> Am 19.09.2010 um 16:22 schrieb Martin Grigorov: > >> > >>> Hi Peter, > >>> > >>> On Thu, Sep 16, 2010 at 12:40 AM, <[email protected]> wrote: > >>> > >>>> Author: pete > >>>> Date: Wed Sep 15 22:39:59 2010 > >>>> New Revision: 997528 > >>>> > >>>> URL: http://svn.apache.org/viewvc?rev=997528&view=rev > >>>> Log: > >>>> fixed non-working ajax redirects: WICKET-3048 > >>>> > >>>> Modified: > >>>> > >>>> > >> > wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java > >>>> > >>>> > >> > wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java > >>>> > >>>> > >> > wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.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=997528&r1=997527&r2=997528&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 Sep 15 22:39:59 2010 > >>>> @@ -104,8 +104,8 @@ public abstract class WebRequest extends > >>>> /** > >>>> * Marker parameter for AjaxRequest. > >>>> */ > >>>> - private static final String PARAM_AJAX = "wicket:ajax"; > >>>> - private static final String HEADER_AJAX = "Wicket-Ajax"; > >>>> + protected static final String PARAM_AJAX = "wicket:ajax"; > >>>> + protected static final String HEADER_AJAX = "Wicket-Ajax"; > >>>> > >>>> /** > >>>> * Returns whether this request is an Ajax request. This > >>>> implementation only checks for value of > >>>> > >>>> Modified: > >>>> > >> > wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java > >>>> URL: > >>>> > >> > http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=997528&r1=997527&r2=997528&view=diff > >>>> > >>>> > >> > ============================================================================== > >>>> --- > >>>> > >> > wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java > >>>> (original) > >>>> +++ > >>>> > >> > wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java > >>>> Wed Sep 15 22:39:59 2010 > >>>> @@ -371,4 +371,23 @@ public class ServletWebRequest extends W > >>>> { > >>>> return RequestUtils.getCharset(httpServletRequest); > >>>> } > >>>> + > >>>> + @Override > >>>> + public boolean isAjax() > >>>> + { > >>>> + return isAjax(httpServletRequest); > >>>> + } > >>>> + > >>>> + /** > >>>> + * check if random http servlet request is an ajax request > >>>> + * > >>>> + * @param httpServletRequest web request > >>>> + * @return <code>true</code> if ajax, <code>false</code> if > >> regular > >>>> request > >>>> + */ > >>>> + public static boolean isAjax(HttpServletRequest > >> httpServletRequest) > >>>> + { > >>>> + // TODO there is some redundancy in this method and > >>>> WebRequest#isAjax - can this be eliminated? > >>>> + return > >>>> Strings.isTrue(httpServletRequest.getHeader(HEADER_AJAX)) || > >>>> + > >>>> Strings.isTrue(httpServletRequest.getParameter(PARAM_AJAX)); > >>>> + } > >>>> > >>> What is the reason to add this method at all ? > >>> Why not use WebRequest#isAjax() ? > >>> > >>> Why 'static' ? ServletWebRequest has a reference to its > >> HttpServletRequest. > >>> Why do you want to check some other HttpServletRequest ?! > >>> > >>>> } > >>>> > >>>> 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=997528&r1=997527&r2=997528&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 Sep 15 22:39:59 2010 > >>>> @@ -31,7 +31,7 @@ import org.apache.wicket.util.lang.Args; > >>>> > >>>> /** > >>>> * WebResponse that wraps a {...@link ServletWebResponse}. > >>>> - * > >>>> + * > >>>> * @author Matej Knopp > >>>> */ > >>>> public class ServletWebResponse extends WebResponse > >>>> @@ -41,7 +41,7 @@ public class ServletWebResponse extends > >>>> > >>>> /** > >>>> * Construct. > >>>> - * > >>>> + * > >>>> * @param httpServletRequest > >>>> * @param httpServletResponse > >>>> */ > >>>> @@ -57,7 +57,7 @@ public class ServletWebResponse extends > >>>> > >>>> /** > >>>> * Returns the wrapped response > >>>> - * > >>>> + * > >>>> * @return wrapped response > >>>> */ > >>>> public final HttpServletResponse getHttpServletResponse() > >>>> @@ -223,25 +223,35 @@ public class ServletWebResponse extends > >>>> @Override > >>>> public void sendRedirect(String url) > >>>> { > >>>> - sendRedirect(url, false); > >>>> - } > >>>> - > >>>> - private void sendRedirect(String url, boolean cacheable) > >>>> - { > >>>> - redirect = true; > >>>> - url = getAbsoluteURL(url); > >>>> - url = httpServletResponse.encodeRedirectURL(url); > >>>> - > >>>> try > >>>> { > >>>> - // proxies eventually cache '302 temporary > >>>> redirect' responses: > >>>> - // for most wicket use cases this is fatal > since > >>>> redirects are > >>>> - // usually highly dynamic and can not be > >> statically > >>>> mapped > >>>> - // to a request url in general > >>>> - if (cacheable == false) > >>>> - this.disableCaching(); > >>>> + redirect = true; > >>>> + url = getAbsoluteURL(url); > >>>> + url = > >> httpServletResponse.encodeRedirectURL(url); > >>>> + > >>>> + // wicket redirects should never be cached > >>>> + this.disableCaching(); > >>>> + > >>>> + if > >> (ServletWebRequest.isAjax(httpServletRequest)) > >>>> + { > >>>> + > >>>> httpServletResponse.addHeader("Ajax-Location", url); > >>>> + > >>>> + /* > >>>> + * usually the Ajax-Location header is > >>>> enough and we do not need to the > >>>> + * redirect url into the response, but > >>>> sometimes the response is processed > >>>> + * via an iframe (eg using multipart > >> ajax > >>>> handling) and the headers are not > >>>> + * available because XHR is not used > and > >>>> that is the only way javascript has > >>>> + * access to response headers. > >>>> + */ > >>>> + httpServletResponse.getWriter().write( > >>>> + "<ajax-response><redirect>" + > >> url + > >>>> "</redirect></ajax-response>"); > >>>> > >>>> - httpServletResponse.sendRedirect(url); > >>>> + setContentType("text/xml;charset=" + > >>>> httpServletRequest.getCharacterEncoding()); > >>>> + } > >>>> + else > >>>> + { > >>>> + httpServletResponse.sendRedirect(url); > >>>> + } > >>>> } > >>>> catch (IOException e) > >>>> { > >>>> > >>>> > >>>> > >> > >> > >
