You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2008/12/31 10:54:18 UTC

svn commit: r730362 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/protocol/http/ main/java/org/apache/wicket/protocol/http/servlet/ main/java/org/apache/wicket/util/tester/ test/java/org/apache/wicket/ajax/markup/html/componentMap/ test/ja...

Author: jdonnerstag
Date: Wed Dec 31 01:54:17 2008
New Revision: 730362

URL: http://svn.apache.org/viewvc?rev=730362&view=rev
Log:
fixed wicket-1910: ServletWebRequest.isAjax Should be cached

Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPanelTest.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/TestExpirePage.html
    wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java?rev=730362&r1=730361&r2=730362&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/MockWebApplication.java Wed Dec 31 01:54:17 2008
@@ -16,11 +16,6 @@
  */
 package org.apache.wicket.protocol.http;
 
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -29,6 +24,12 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.IPageMap;
@@ -123,7 +124,14 @@
 	private final ServletContext context;
 
 	private final WicketFilter filter;
-	private Set<Cookie> cookiesOfThisSession = new HashSet<Cookie>();
+
+	private final Set<Cookie> cookiesOfThisSession = new HashSet<Cookie>();
+
+	/**
+	 * Must be true to create add a wicket-ajax header to the next request. Will be immediately
+	 * reset to false
+	 */
+	private boolean createAjaxRequest = false;
 
 	/**
 	 * Create the mock http tester that can be used for testing.
@@ -393,8 +401,7 @@
 	@SuppressWarnings("deprecation")
 	public <C extends Page> void processRequestCycle(final Class<C> pageClass, PageParameters params)
 	{
-		setupRequestAndResponse();
-		final WebRequestCycle cycle = createRequestCycle();
+		final WebRequestCycle cycle = setupRequestAndResponse();
 		try
 		{
 			BaseWicketTester.callOnBeginRequest(cycle);
@@ -465,7 +472,9 @@
 				getServletRequest().setURL(path + url);
 			}
 			else
+			{
 				log.warn("The application does not have a HomePage, this might cause problems or unexpected behavior");
+			}
 			cycle.request(requestTarget);
 		}
 		finally
@@ -642,8 +651,11 @@
 		wicketResponse = application.newWebResponse(servletResponse);
 		WebRequestCycle requestCycle = createRequestCycle();
 		if (!initializeHttpSessionAsTemporary())
+		{
 			application.getSessionStore().bind(wicketRequest, wicketSession);
+		}
 		wicketResponse.setAjax(wicketRequest.isAjax());
+		createAjaxRequest = false;
 		return requestCycle;
 	}
 
@@ -656,7 +668,7 @@
 	 */
 	public WebRequestCycle setupRequestAndResponse()
 	{
-		return setupRequestAndResponse(false);
+		return setupRequestAndResponse(isCreateAjaxRequest());
 	}
 
 	/**
@@ -714,4 +726,28 @@
 			dir.delete();
 		}
 	}
+
+	/**
+	 * Gets createAjaxRequest.
+	 * 
+	 * @return createAjaxRequest
+	 */
+	public boolean isCreateAjaxRequest()
+	{
+		return createAjaxRequest;
+	}
+
+	/**
+	 * Sets createAjaxRequest.
+	 * 
+	 * Must be true to create add a wicket-ajax header to the next request. Will be immediately
+	 * reset to false
+	 * 
+	 * @param createAjaxRequest
+	 *            createAjaxRequest
+	 */
+	public void setCreateAjaxRequest(boolean createAjaxRequest)
+	{
+		this.createAjaxRequest = createAjaxRequest;
+	}
 }

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=730362&r1=730361&r2=730362&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 Dec 31 01:54:17 2008
@@ -60,6 +60,11 @@
 
 	private int previousUrlDepth;
 
+	/** Marks this request as an ajax request. */
+	private boolean ajax;
+
+	private boolean forceNewVersion = false;
+
 	/**
 	 * Protected constructor.
 	 * 
@@ -69,6 +74,21 @@
 	public ServletWebRequest(final HttpServletRequest httpServletRequest)
 	{
 		this.httpServletRequest = httpServletRequest;
+
+		ajax = false;
+		String ajaxHeader = httpServletRequest.getHeader("Wicket-Ajax");
+		if (Strings.isEmpty(ajaxHeader) == false)
+		{
+			try
+			{
+				ajax = Strings.isTrue(ajaxHeader);
+			}
+			catch (StringValueConversionException e)
+			{
+				// We are not interested in this exception but we log it anyway
+				log.debug("Couldn't convert the Wicket-Ajax header: " + ajaxHeader);
+			}
+		}
 	}
 
 	/**
@@ -151,6 +171,9 @@
 			httpServletRequest);
 	}
 
+	/**
+	 * @see org.apache.wicket.Request#getRelativePathPrefixToContextRoot()
+	 */
 	@Override
 	public String getRelativePathPrefixToContextRoot()
 	{
@@ -228,6 +251,9 @@
 		return depthRelativeToWicketHandler;
 	}
 
+	/**
+	 * @see org.apache.wicket.Request#getRelativePathPrefixToWicketHandler()
+	 */
 	@Override
 	public String getRelativePathPrefixToWicketHandler()
 	{
@@ -408,25 +434,21 @@
 	 * 
 	 * @see org.apache.wicket.protocol.http.WebRequest#isAjax()
 	 */
-	// TODO matej? should we have a simple way of supporting other ajax things?
-	// or should they just set that same header??
 	@Override
-	public boolean isAjax()
+	public final boolean isAjax()
 	{
-		String ajaxHeader = httpServletRequest.getHeader("Wicket-Ajax");
-		if (Strings.isEmpty(ajaxHeader) == false)
-		{
-			try
-			{
-				return Strings.isTrue(ajaxHeader);
-			}
-			catch (StringValueConversionException e)
-			{
-				// We are not interested in this exception but we log it anyway
-				log.debug("Couldn't convert the Wicket-Ajax header: " + ajaxHeader);
-			}
-		}
-		return false;
+		return ajax;
+	}
+
+	/**
+	 * THIS IS FOR WICKET INTERNAL USE ONLY. DO NOT USE IT IN YOUR APPLICATION.
+	 * 
+	 * @param ajax
+	 *            ajax
+	 */
+	public final void setAjax(boolean ajax)
+	{
+		this.ajax = ajax;
 	}
 
 	/**
@@ -463,8 +485,6 @@
 		this.forceNewVersion = forceNewVersion;
 	}
 
-	private boolean forceNewVersion = false;
-
 	/**
 	 * @see org.apache.wicket.protocol.http.WebRequest#newMultipartWebRequest(org.apache.wicket.util.lang.Bytes)
 	 */
@@ -482,24 +502,6 @@
 	}
 
 	/**
-	 * @see java.lang.Object#toString()
-	 */
-	@Override
-	public String toString()
-	{
-		return "[method = " + httpServletRequest.getMethod() + ", protocol = " +
-			httpServletRequest.getProtocol() + ", requestURL = " +
-			httpServletRequest.getRequestURL() + ", contentType = " +
-			httpServletRequest.getContentType() + ", contentLength = " +
-			httpServletRequest.getContentLength() + ", contextPath = " +
-			httpServletRequest.getContextPath() + ", pathInfo = " +
-			httpServletRequest.getPathInfo() + ", requestURI = " +
-			httpServletRequest.getRequestURI() + ", servletPath = " +
-			httpServletRequest.getServletPath() + ", pathTranslated = " +
-			httpServletRequest.getPathTranslated() + "]";
-	}
-
-	/**
 	 * Set the redirect url where wicket will redirect to for the next page
 	 * 
 	 * @param wicketRedirectUrl
@@ -525,9 +527,30 @@
 
 	}
 
+	/**
+	 * @see org.apache.wicket.Request#getQueryString()
+	 */
 	@Override
 	public String getQueryString()
 	{
 		return httpServletRequest.getQueryString();
 	}
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString()
+	{
+		return "[method = " + httpServletRequest.getMethod() + ", protocol = " +
+			httpServletRequest.getProtocol() + ", requestURL = " +
+			httpServletRequest.getRequestURL() + ", contentType = " +
+			httpServletRequest.getContentType() + ", contentLength = " +
+			httpServletRequest.getContentLength() + ", contextPath = " +
+			httpServletRequest.getContextPath() + ", pathInfo = " +
+			httpServletRequest.getPathInfo() + ", requestURI = " +
+			httpServletRequest.getRequestURI() + ", servletPath = " +
+			httpServletRequest.getServletPath() + ", pathTranslated = " +
+			httpServletRequest.getPathTranslated() + "]";
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=730362&r1=730361&r2=730362&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java Wed Dec 31 01:54:17 2008
@@ -16,7 +16,6 @@
  */
 package org.apache.wicket.util.tester;
 
-import javax.servlet.http.HttpServletRequest;
 import java.io.Serializable;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
@@ -56,7 +55,6 @@
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.protocol.http.HttpSessionStore;
-import org.apache.wicket.protocol.http.MockHttpServletRequest;
 import org.apache.wicket.protocol.http.MockHttpServletResponse;
 import org.apache.wicket.protocol.http.MockWebApplication;
 import org.apache.wicket.protocol.http.WebApplication;
@@ -263,11 +261,8 @@
 	 */
 	public void executeBehavior(final AbstractAjaxBehavior behavior)
 	{
-		// setupRequestAndResponse();
-		WebRequestCycle cycle = createRequestCycle();
 		CharSequence url = behavior.getCallbackUrl(false);
-		setupRequestAndResponse(true);
-		cycle = createRequestCycle();
+		WebRequestCycle cycle = setupRequestAndResponse(true);
 		getServletRequest().setRequestToRedirectString(url.toString());
 		processRequestCycle(cycle);
 	}
@@ -985,8 +980,7 @@
 	public void debugComponentTrees(String filter)
 	{
 		log.info("debugging ----------------------------------------------");
-		for (WicketTesterHelper.ComponentData obj : WicketTesterHelper.getComponentData(
-				getLastRenderedPage()))
+		for (WicketTesterHelper.ComponentData obj : WicketTesterHelper.getComponentData(getLastRenderedPage()))
 		{
 			if (obj.path.matches(".*" + filter + ".*"))
 			{
@@ -1115,6 +1109,8 @@
 	 */
 	public void executeAjaxEvent(Component component, String event)
 	{
+		setCreateAjaxRequest(true);
+
 		String failMessage = "Can't execute event on a component which is null.";
 		notNull(failMessage, component);
 
@@ -1150,11 +1146,8 @@
 		// that the request is not an ajax request -> we have to set the header manually
 		if (!requestCycle.getWebRequest().isAjax())
 		{
-			HttpServletRequest req = requestCycle.getWebRequest().getHttpServletRequest();
-			if (req instanceof MockHttpServletRequest)
-			{
-				((MockHttpServletRequest)req).addHeader("Wicket-Ajax", "Yes");
-			}
+			throw new IllegalStateException(
+				"The ServletWebRequest was created without wicket-ajax header. Please use tester.setCreateAjaxRequest(true)");
 		}
 
 		// If the event is an FormSubmitBehavior then also "submit" the form
@@ -1170,19 +1163,29 @@
 		processRequestCycle(requestCycle);
 	}
 
+	/**
+	 * 
+	 * @return
+	 */
 	protected WebRequestCycle resolveRequestCycle()
 	{
 		// initialize the request only if needed to allow the user to pass
-		// request parameters, see
-		// WICKET-254
+		// request parameters, see WICKET-254
 		WebRequestCycle requestCycle;
 		if (RequestCycle.get() == null)
 		{
-			requestCycle = setupRequestAndResponse(true);
+			requestCycle = setupRequestAndResponse();
 		}
 		else
 		{
 			requestCycle = (WebRequestCycle)RequestCycle.get();
+
+			// If a ajax request is requested but the existing is not, than we still need to create
+			// a new one
+			if ((requestCycle.getWebRequest().isAjax() == false) && (isCreateAjaxRequest() == true))
+			{
+				requestCycle = setupRequestAndResponse();
+			}
 		}
 		return requestCycle;
 	}

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPanelTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPanelTest.java?rev=730362&r1=730361&r2=730362&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPanelTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPanelTest.java Wed Dec 31 01:54:17 2008
@@ -18,7 +18,6 @@
 
 import org.apache.wicket.Page;
 import org.apache.wicket.WicketTestCase;
-import org.apache.wicket.protocol.http.WebRequestCycle;
 import org.apache.wicket.util.diff.DiffUtil;
 
 
@@ -46,7 +45,6 @@
 	{
 		tester.setupRequestAndResponse(true);
 		executeTest(SimpleTestPage.class, "SimpleTestPageExpectedResult.html");
-		WebRequestCycle cycle = tester.createRequestCycle();
 
 		Page page = tester.getLastRenderedPage();
 		tester.executeBehavior(((SimpleTestPanel)page.get("testPanel")).getTimeBehavior());

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/TestExpirePage.html
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/TestExpirePage.html?rev=730362&r1=730361&r2=730362&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/TestExpirePage.html (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/TestExpirePage.html Wed Dec 31 01:54:17 2008
@@ -1 +1,3 @@
-<a wicket:id="link">Click me to get an error</a>
+<body>
+  <a wicket:id="link">Click me to get an error</a>
+</body>

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java?rev=730362&r1=730361&r2=730362&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java Wed Dec 31 01:54:17 2008
@@ -58,15 +58,24 @@
 	public void testExpirePage()
 	{
 		tester.startPage(TestExpirePage.class);
+		String document = tester.getServletResponse().getDocument();
+		assertTrue(document.contains("Click me to get an error"));
+
 		AjaxLink link = (AjaxLink)tester.getComponentFromLastRenderedPage("link");
 
-		// Cannot use executeAjaxEvent or onClick because WicketTester creates
-		// an AjaxRequestTarget from scratch
+		// Clear the session to remove the pages
+		// tester.getWicketSession().invalidateNow();
+		//
+		// tester.setCreateAjaxRequest(true);
 		// tester.executeAjaxEvent(link, "onclick");
 		// tester.clickLink("link");
+		//
+		// document = tester.getServletResponse().getDocument();
+		// assertTrue(document.contains("-"));
+		// tester.assertAjaxLocation();
 
-		// FIXME should not be needed
-		tester.createRequestCycle();
+		WebRequestCycle cycle = tester.setupRequestAndResponse(true);
+		tester.getWicketSession().invalidateNow();
 
 		// Clear the session to remove the pages
 		tester.getWicketSession().invalidateNow();
@@ -74,20 +83,14 @@
 		// Invoke the call back URL of the ajax event behavior
 		String callbackUrl = ((AjaxEventBehavior)link.getBehaviors().get(0)).getCallbackUrl()
 			.toString();
-		tester.setupRequestAndResponse();
-
-		// Fake an Ajax request
-		(tester.getServletRequest()).addHeader("Wicket-Ajax", "Yes");
-		// Set ajax mode again, as it is done in setupRequestAndResponse() only
-		tester.getWicketResponse().setAjax(tester.getWicketRequest().isAjax());
-
 		tester.getServletRequest().setURL(callbackUrl);
 
-		// Do not call tester.processRequestCycle() because it throws an
+		// Do not call processRequestCycle() because it throws an
 		// exception when getting an error page
-		WebRequestCycle cycle = tester.createRequestCycle();
 		cycle.request();
 
+		document = tester.getServletResponse().getDocument();
+		assertTrue(document.equals("-"));
 		tester.assertAjaxLocation();
 	}
 
@@ -99,31 +102,29 @@
 		tester.startPage(TestErrorPage.class);
 		AjaxLink link = (AjaxLink)tester.getComponentFromLastRenderedPage("link");
 
-		// Cannot use executeAjaxEvent or onClick because WicketTester creates
-		// an AjaxRequestTarget from scratch
-		// tester.executeAjaxEvent(link, "onclick");
-		// tester.clickLink("link");
+		try
+		{
+			tester.executeAjaxEvent(link, "onclick");
+			assertTrue("Excepted an error message to be thrown", false);
+		}
+		catch (IllegalStateException ex)
+		{
+			// expected exception
+			tester.assertAjaxLocation();
+		}
 
-		// FIXME should not be needed
-		tester.createRequestCycle();
-
-		// Invoke the call back URL of the ajax event behavior
-		String callbackUrl = ((AjaxEventBehavior)link.getBehaviors().get(0)).getCallbackUrl()
-			.toString()
-			.replaceAll("&amp;", "&");
-		tester.setupRequestAndResponse();
-		// Fake an Ajax request
-		(tester.getServletRequest()).addHeader("Wicket-Ajax", "Yes");
-		// Set ajax mode again, as it is done in setupRequestAndResponse() only
-		tester.getWicketResponse().setAjax(tester.getWicketRequest().isAjax());
-
-		tester.getServletRequest().setURL(callbackUrl);
-
-		// Do not call tester.processRequestCycle() because it throws an
-		// exception when getting an error page
-		WebRequestCycle cycle = tester.createRequestCycle();
-		cycle.request();
+		tester.startPage(TestErrorPage.class);
+		link = (AjaxLink)tester.getComponentFromLastRenderedPage("link");
 
-		tester.assertAjaxLocation();
+		try
+		{
+			tester.clickLink("link");
+			assertTrue("Excepted an error message to be thrown", false);
+		}
+		catch (IllegalStateException ex)
+		{
+			// expected exception
+			tester.assertAjaxLocation();
+		}
 	}
 }

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java?rev=730362&r1=730361&r2=730362&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java Wed Dec 31 01:54:17 2008
@@ -16,11 +16,13 @@
  */
 package org.apache.wicket.util.tester;
 
-import javax.servlet.http.Cookie;
 import java.util.Collection;
 import java.util.Locale;
 
+import javax.servlet.http.Cookie;
+
 import junit.framework.TestCase;
+
 import org.apache.wicket.Component;
 import org.apache.wicket.MockPageWithLink;
 import org.apache.wicket.MockPageWithOneComponent;
@@ -470,7 +472,8 @@
 
 	public void testTesterCanBeOverridenToNotReuseExistingRequestCycleInExecuteAjaxEvent()
 	{
-		tester = new WicketTester(new MyMockApplication()) {
+		tester = new WicketTester(new MyMockApplication())
+		{
 			@Override
 			protected WebRequestCycle resolveRequestCycle()
 			{
@@ -594,16 +597,16 @@
 		assertFalse(submit.isEnabled());
 		FormTester form = tester.newFormTester("form");
 
-		tester.setupRequestAndResponse();
+		tester.setupRequestAndResponse(true);
 		form.setValue("text", "XX");
 		setTextFieldAndAssertSubmit(false);
 		Session.get().cleanupFeedbackMessages();
 
-		tester.setupRequestAndResponse();
+		tester.setupRequestAndResponse(true);
 		form.setValue("text", "XXXYYYXXX");
 		setTextFieldAndAssertSubmit(true);
 
-		tester.setupRequestAndResponse();
+		tester.setupRequestAndResponse(true);
 		form.setValue("text", "");
 		setTextFieldAndAssertSubmit(false);
 	}