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);
        }


Reply via email to