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