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/26 12:21:58 UTC
svn commit: r1052875 - in /wicket/trunk/wicket/src:
main/java/org/apache/wicket/ajax/ main/java/org/apache/wicket/protocol/http/
main/java/org/apache/wicket/response/filter/
test/java/org/apache/wicket/response/
test/java/org/apache/wicket/response/fil...
Author: mgrigorov
Date: Sun Dec 26 11:21:58 2010
New Revision: 1052875
URL: http://svn.apache.org/viewvc?rev=1052875&view=rev
Log:
WICKET-3280 IResponseFilter doesn't work in 1.5
Re-enable IResponseFilter for both ajax and non-ajax responses.
Added:
wicket/trunk/wicket/src/test/java/org/apache/wicket/response/
wicket/trunk/wicket/src/test/java/org/apache/wicket/response/filter/
wicket/trunk/wicket/src/test/java/org/apache/wicket/response/filter/ResponseFilterTest.java (with props)
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/response/filter/IResponseFilter.java
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=1052875&r1=1052874&r2=1052875&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 Sun Dec 26 11:21:58 2010
@@ -51,6 +51,8 @@ import org.apache.wicket.request.http.We
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.response.StringResponse;
+import org.apache.wicket.response.filter.IResponseFilter;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.string.AppendingStringBuffer;
import org.apache.wicket.util.string.Strings;
@@ -603,43 +605,18 @@ public class AjaxRequestTarget implement
// Make sure it is not cached by a client
response.disableCaching();
- response.write("<?xml version=\"1.0\" encoding=\"");
- response.write(encoding);
- response.write("\"?>");
- response.write("<ajax-response>");
-
- // invoke onbeforerespond event on listeners
- fireOnBeforeRespondListeners();
-
- // normal behavior
- Iterator<CharSequence> it = prependJavaScripts.iterator();
- while (it.hasNext())
- {
- CharSequence js = it.next();
- respondInvocation(response, js);
- }
-
- // process added components
- respondComponents(response);
-
- fireOnAfterRespondListeners(response);
-
- // execute the dom ready javascripts as first javascripts
- // after component replacement
- it = domReadyJavaScripts.iterator();
- while (it.hasNext())
+ try
{
- CharSequence js = it.next();
- respondInvocation(response, js);
+ final StringResponse bodyResponse = new StringResponse();
+ contructResponseBody(bodyResponse, encoding);
+ invokeResponseFilters(bodyResponse);
+ response.write(bodyResponse.getBuffer());
}
- it = appendJavaScripts.iterator();
- while (it.hasNext())
+ finally
{
- CharSequence js = it.next();
- respondInvocation(response, js);
+ // restore the original response
+ RequestCycle.get().setResponse(response);
}
-
- response.write("</ajax-response>");
}
finally
{
@@ -648,6 +625,80 @@ public class AjaxRequestTarget implement
}
/**
+ * Collects the response body (without the headers) so that it can be pre-processed before
+ * written down to the original response.
+ *
+ * @param bodyResponse
+ * the buffering response
+ * @param encoding
+ * the encoding that should be used to encode the body
+ */
+ private void contructResponseBody(final Response bodyResponse, final String encoding)
+ {
+ bodyResponse.write("<?xml version=\"1.0\" encoding=\"");
+ bodyResponse.write(encoding);
+ bodyResponse.write("\"?>");
+ bodyResponse.write("<ajax-response>");
+
+ // invoke onbeforerespond event on listeners
+ fireOnBeforeRespondListeners();
+
+ // normal behavior
+ Iterator<CharSequence> it = prependJavaScripts.iterator();
+ while (it.hasNext())
+ {
+ CharSequence js = it.next();
+ respondInvocation(bodyResponse, js);
+ }
+
+ // process added components
+ respondComponents(bodyResponse);
+
+ fireOnAfterRespondListeners(bodyResponse);
+
+ // execute the dom ready javascripts as first javascripts
+ // after component replacement
+ it = domReadyJavaScripts.iterator();
+ while (it.hasNext())
+ {
+ CharSequence js = it.next();
+ respondInvocation(bodyResponse, js);
+ }
+ it = appendJavaScripts.iterator();
+ while (it.hasNext())
+ {
+ CharSequence js = it.next();
+ respondInvocation(bodyResponse, js);
+ }
+
+ bodyResponse.write("</ajax-response>");
+ }
+
+ /**
+ * Runs the configured {@link IResponseFilter}s over the constructed Ajax response
+ *
+ * @param contentResponse
+ * the Ajax {@link Response} body
+ */
+ private void invokeResponseFilters(final StringResponse contentResponse)
+ {
+ AppendingStringBuffer responseBuffer = new AppendingStringBuffer(
+ contentResponse.getBuffer());
+
+ List<IResponseFilter> responseFilters = Application.get()
+ .getRequestCycleSettings()
+ .getResponseFilters();
+
+ if (responseFilters != null)
+ {
+ for (IResponseFilter filter : responseFilters)
+ {
+ filter.filter(responseBuffer);
+ }
+ }
+ }
+
+ /**
*
*/
private void fireOnBeforeRespondListeners()
@@ -667,7 +718,7 @@ public class AjaxRequestTarget implement
*
* @param response
*/
- private void fireOnAfterRespondListeners(final WebResponse response)
+ private void fireOnAfterRespondListeners(final Response response)
{
// invoke onafterresponse event on listeners
if (listeners != null)
@@ -697,7 +748,7 @@ public class AjaxRequestTarget implement
*
* @param response
*/
- private void respondComponents(WebResponse response)
+ private void respondComponents(Response response)
{
// TODO: We might need to call prepareRender on all components upfront
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java?rev=1052875&r1=1052874&r2=1052875&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java Sun Dec 26 11:21:58 2010
@@ -24,10 +24,13 @@ import java.util.List;
import javax.servlet.http.Cookie;
+import org.apache.wicket.Application;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.response.filter.IResponseFilter;
import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.string.AppendingStringBuffer;
/**
* Subclass of {@link WebResponse} that buffers the actions and performs those on another response.
@@ -117,6 +120,20 @@ public class BufferedWebResponse extends
@Override
protected void invoke(WebResponse response)
{
+
+ AppendingStringBuffer responseBuffer = new AppendingStringBuffer(builder);
+
+ List<IResponseFilter> responseFilters = Application.get()
+ .getRequestCycleSettings()
+ .getResponseFilters();
+
+ if (responseFilters != null)
+ {
+ for (IResponseFilter filter : responseFilters)
+ {
+ filter.filter(responseBuffer);
+ }
+ }
response.write(builder);
}
};
@@ -534,4 +551,5 @@ public class BufferedWebResponse extends
{
return charSequenceAction.builder.toString();
}
+
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/response/filter/IResponseFilter.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/response/filter/IResponseFilter.java?rev=1052875&r1=1052874&r2=1052875&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/response/filter/IResponseFilter.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/response/filter/IResponseFilter.java Sun Dec 26 11:21:58 2010
@@ -21,7 +21,7 @@ import org.apache.wicket.util.string.App
/**
* A response filter can be added to the
* {@link org.apache.wicket.settings.IRequestCycleSettings#addResponseFilter(IResponseFilter)}
- * object The will be called from the Buffered Response objects right before they would send it to
+ * object. This will be called from the Buffered Response objects right before they would send it to
* the real responses. You have to use the
* {@link org.apache.wicket.settings.IRequestCycleSettings#setBufferResponse(boolean)}(to true which
* is the default) for this filtering to work.
Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/response/filter/ResponseFilterTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/response/filter/ResponseFilterTest.java?rev=1052875&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/response/filter/ResponseFilterTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/response/filter/ResponseFilterTest.java Sun Dec 26 11:21:58 2010
@@ -0,0 +1,125 @@
+/*
+ * 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.response.filter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.wicket.MockPageWithLink;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.resource.DummyApplication;
+import org.apache.wicket.util.string.AppendingStringBuffer;
+import org.apache.wicket.util.tester.DummyHomePage;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test case for <a href="https://issues.apache.org/jira/browse/WICKET-3280">WICKET-3280</a>
+ *
+ * {@link IResponseFilter}s must be called for both Ajax and non-Ajax responses
+ */
+@SuppressWarnings("serial")
+public class ResponseFilterTest
+{
+ private final AtomicInteger counter = new AtomicInteger(0);
+
+ private WicketTester tester;
+
+ @Before
+ public void before()
+ {
+ final IResponseFilter responseFilter = new IResponseFilter()
+ {
+ public AppendingStringBuffer filter(AppendingStringBuffer responseBuffer)
+ {
+ counter.getAndIncrement();
+ return responseBuffer;
+ }
+ };
+
+ final WebApplication application = new DummyApplication()
+ {
+ @Override
+ protected void init()
+ {
+ super.init();
+ getRequestCycleSettings().addResponseFilter(responseFilter);
+ }
+ };
+
+ tester = new WicketTester(application);
+ }
+
+ @After
+ public void after()
+ {
+ counter.set(0);
+ }
+
+ @Test
+ public void normalRequest()
+ {
+ tester.startPage(DummyHomePage.class);
+
+ assertEquals(1, counter.get());
+ }
+
+ @Test
+ public void ajaxRequest()
+ {
+ AjaxPage page = new AjaxPage(counter);
+ tester.startPage(page);
+ // normal page response
+ assertEquals(1, counter.get());
+
+ tester.clickLink("link", true);
+ assertEquals(2, counter.get());
+ assertTrue(page.ajaxCalled);
+
+ }
+
+ /**
+ * Test page for ajax request
+ */
+ public static class AjaxPage extends MockPageWithLink
+ {
+ boolean ajaxCalled = false;
+
+ /**
+ * Construct.
+ *
+ * @param counter
+ */
+ public AjaxPage(final AtomicInteger counter)
+ {
+ add(new AjaxLink<Void>(MockPageWithLink.LINK_ID)
+ {
+ @Override
+ public void onClick(AjaxRequestTarget target)
+ {
+ ajaxCalled = true;
+ }
+ });
+ }
+ }
+}
Propchange: wicket/trunk/wicket/src/test/java/org/apache/wicket/response/filter/ResponseFilterTest.java
------------------------------------------------------------------------------
svn:eol-style = native