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("&", "&");
- 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);
}