Author: ivaynberg
Date: Sat Feb 27 06:09:07 2010
New Revision: 916912

URL: http://svn.apache.org/viewvc?rev=916912&view=rev
Log:
wip on removing the need for MockApplication/Session/RequestCycle in wicket 
tester. This required replacing some factory methods on Application such as 
newRequestCycle with provider interfaces so user's implementation can be 
decorated for test environment. for an example see IRequestCycleProvider and 
IPageRendererProvider and their references.

Added:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageRendererProvider.java  
 (with props)
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/IRequestCycleProvider.java  
 (with props)
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/PageRenderer.java
      - copied, changed from r916772, 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/RenderPageRequestHandlerDelegate.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebPageRenderer.java
      - copied, changed from r916772, 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/util/IProvider.java   
(with props)
Removed:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockRequestCycle.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/RenderPageRequestHandlerDelegate.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/RenderPageRequestHandler.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/ParentResourceEscapePathTest.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java?rev=916912&r1=916911&r2=916912&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java Sat 
Feb 27 06:09:07 2010
@@ -55,8 +55,6 @@
 import org.apache.wicket.ng.request.component.PageParameters;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
 import org.apache.wicket.ng.request.cycle.RequestCycleContext;
-import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
-import 
org.apache.wicket.ng.request.handler.impl.render.RenderPageRequestHandlerDelegate;
 import org.apache.wicket.ng.request.mapper.IMapperContext;
 import org.apache.wicket.ng.request.mapper.SystemMapper;
 import org.apache.wicket.ng.resource.ResourceReferenceRegistry;
@@ -202,6 +200,11 @@
        /** can the settings object be set/used. */
        private boolean settingsAccessible;
 
+       /** page renderer provider */
+       private IPageRendererProvider pageRendererProvider;
+
+       /** request cycle provider */
+       private IRequestCycleProvider requestCycleProvider;
 
        /**
         * Checks if the <code>Application</code> threadlocal is set in this 
thread
@@ -850,7 +853,7 @@
        /**
         * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT CALL IT.
         */
-       protected void internalDestroy()
+       public void internalDestroy()
        {
                // destroy detach listener
                final IDetachListener detachListener = 
getFrameworkSettings().getDetachListener();
@@ -916,6 +919,8 @@
                setRootRequestMapper(new SystemMapper());
 
                pageFactory = newPageFactory();
+
+               requestCycleProvider = new DefaultRequestCycleProvider();
        }
 
        /**
@@ -1247,11 +1252,17 @@
        // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-       /**
-        * Returns the {...@link RenderPageRequestHandlerDelegate} responsible 
for rendering the page.
-        */
-       public abstract RenderPageRequestHandlerDelegate 
getRenderPageRequestHandlerDelegate(
-               RenderPageRequestHandler renderPageRequestHandler);
+       public final IPageRendererProvider getPageRendererProvider()
+       {
+               return pageRendererProvider;
+       }
+
+       public final void setPageRendererProvider(IPageRendererProvider 
pageRendererProvider)
+       {
+               Checks.argumentNotNull(pageRendererProvider, 
"pageRendererProvider");
+               this.pageRendererProvider = pageRendererProvider;
+       }
+
 
        // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1402,17 +1413,25 @@
                return session;
        }
 
-       /**
-        * Override this method to create custom Request Cycle instance.
-        * 
-        * @param context
-        *            holds context necessary to instantiate a request cycle, 
such as the current
-        *            request, response, and request mappers
-        * @return
-        */
-       protected RequestCycle newRequestCycle(RequestCycleContext context)
+
+       public IRequestCycleProvider getRequestCycleProvider()
+       {
+               return requestCycleProvider;
+       }
+
+       public void setRequestCycleProvider(IRequestCycleProvider 
requestCycleProvider)
+       {
+               this.requestCycleProvider = requestCycleProvider;
+       }
+
+       private static class DefaultRequestCycleProvider implements 
IRequestCycleProvider
        {
-               return new RequestCycle(context);
+
+               public RequestCycle get(RequestCycleContext context)
+               {
+                       return new RequestCycle(context);
+               }
+
        }
 
 
@@ -1422,15 +1441,8 @@
                RequestCycleContext context = new RequestCycleContext(request, 
response,
                        getRootRequestMapper(), new DefaultExceptionMapper());
 
-               RequestCycle requestCycle = newRequestCycle(context);
-               requestCycle.register(new RequestCycle.DetachCallback()
-               {
-                       public void onDetach(RequestCycle requestCycle)
-                       {
-                               getPageManager().commitRequest();
-                               Session.get().cleanupFeedbackMessages();
-                       }
-               });
+               RequestCycle requestCycle = 
getRequestCycleProvider().get(context);
+
                return requestCycle;
        }
 
@@ -1445,6 +1457,19 @@
                }
                internalInit();
                init();
+               validateInit();
+       }
+
+       /**
+        * Gives the Application object a chance to validate if it has been 
properly initialized
+        */
+       protected void validateInit()
+       {
+               if (getPageRendererProvider() == null)
+               {
+                       throw new IllegalStateException(
+                               "An instance of IPageRendererProvider has not 
yet been set on this Application. @see Application#setPageRendererProvider");
+               }
        }
 
        /**
@@ -1482,5 +1507,4 @@
        {
                return 
URLConnection.getFileNameMap().getContentTypeFor(fileName);
        }
-
 }

Added: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageRendererProvider.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageRendererProvider.java?rev=916912&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageRendererProvider.java 
(added)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageRendererProvider.java 
Sat Feb 27 06:09:07 2010
@@ -0,0 +1,25 @@
+/*
+ * 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;
+
+import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.render.PageRenderer;
+
+public interface IPageRendererProvider
+{
+       PageRenderer get(RenderPageRequestHandler handler);
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageRendererProvider.java
------------------------------------------------------------------------------
    svn:executable = *

Added: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/IRequestCycleProvider.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/IRequestCycleProvider.java?rev=916912&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/IRequestCycleProvider.java 
(added)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/IRequestCycleProvider.java 
Sat Feb 27 06:09:07 2010
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+import org.apache.wicket.ng.request.cycle.RequestCycle;
+import org.apache.wicket.ng.request.cycle.RequestCycleContext;
+
+/**
+ * Provides instances of {...@link RequestCycle} objects
+ * 
+ * @author igor.vaynberg
+ */
+public interface IRequestCycleProvider
+{
+       /**
+        * Provides instance of {...@link RequestCycle}
+        * 
+        * @param context
+        * @return instance of request cycle
+        */
+       RequestCycle get(RequestCycleContext context);
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/IRequestCycleProvider.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java?rev=916912&r1=916911&r2=916912&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
 Sat Feb 27 06:09:07 2010
@@ -16,19 +16,10 @@
  */
 package org.apache.wicket.ng.mock;
 
-import javax.servlet.ServletContext;
-
 import org.apache.wicket.Page;
 import org.apache.wicket.Session;
-import org.apache.wicket.ng.request.component.IRequestablePage;
-import org.apache.wicket.ng.request.cycle.RequestCycle;
-import org.apache.wicket.ng.request.cycle.RequestCycleContext;
-import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
-import 
org.apache.wicket.ng.request.handler.impl.render.RenderPageRequestHandlerDelegate;
-import 
org.apache.wicket.ng.request.handler.impl.render.WebRenderPageRequestHandlerDelegate;
 import org.apache.wicket.pageStore.IPageManager;
 import org.apache.wicket.pageStore.IPageManagerContext;
-import org.apache.wicket.protocol.http.MockServletContext;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.session.ISessionStore;
 
@@ -51,38 +42,6 @@
                return DEVELOPMENT;
        }
 
-       @Override
-       protected MockRequestCycle newRequestCycle(RequestCycleContext context)
-       {
-               return new MockRequestCycle(context);
-       }
-
-       private IRequestablePage lastRenderedPage;
-
-       public IRequestablePage getLastRenderedPage()
-       {
-               return lastRenderedPage;
-       }
-
-       public void clearLastRenderedPage()
-       {
-               lastRenderedPage = null;
-       }
-
-       @Override
-       public RenderPageRequestHandlerDelegate 
getRenderPageRequestHandlerDelegate(
-               RenderPageRequestHandler renderPageRequestHandler)
-       {
-               return new 
WebRenderPageRequestHandlerDelegate(renderPageRequestHandler)
-               {
-                       @Override
-                       public void respond(RequestCycle requestCycle)
-                       {
-                               lastRenderedPage = 
getPageProvider().getPageInstance();
-                               super.respond(requestCycle);
-                       }
-               };
-       }
 
        @Override
        protected IPageManager newPageManager(IPageManagerContext context)
@@ -104,30 +63,9 @@
                return getSessionStore().lookup(null);
        }
 
-       private MockServletContext mockServletContext;
-
-       @Override
-       public ServletContext getServletContext()
-       {
-               return mockServletContext;
-       }
-
        @Override
        public final String getInitParameter(String key)
        {
                return null;
        }
-
-       @Override
-       protected void internalInit()
-       {
-               // TODO NG What should the proper path be
-               mockServletContext = new MockServletContext(this, "");
-               super.internalInit();
-       }
-
-       public void destroy()
-       {
-               internalDestroy();
-       }
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java?rev=916912&r1=916911&r2=916912&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java
 Sat Feb 27 06:09:07 2010
@@ -24,6 +24,7 @@
 import org.apache.wicket.MetaDataKey;
 import org.apache.wicket.Request;
 import org.apache.wicket.Response;
+import org.apache.wicket.Session;
 import org.apache.wicket.ng.ThreadContext;
 import org.apache.wicket.ng.request.IRequestMapper;
 import org.apache.wicket.ng.request.Url;
@@ -61,6 +62,8 @@
 {
        private static final Logger log = 
LoggerFactory.getLogger(RequestCycle.class);
 
+       private boolean cleanupFeedbackMessagesOnDetach = true;
+
        /**
         * Custom callback invoked on request cycle detach. Detach callbacks 
are invoked after all
         * {...@link IRequestHandler}s are detached.
@@ -134,6 +137,7 @@
                exceptionMapper = context.getExceptionMapper();
        }
 
+
        /**
         * 
         * @return a new url renderer
@@ -420,6 +424,15 @@
        public void detach()
        {
                set(this);
+
+               if (cleanupFeedbackMessagesOnDetach)
+               {
+                       if (Session.exists())
+                       {
+                               Session.get().cleanupFeedbackMessages();
+                       }
+               }
+
                try
                {
                        super.detach();
@@ -511,4 +524,16 @@
        {
                return newClientInfo();
        }
+
+       public boolean isCleanupFeedbackMessagesOnDetach()
+       {
+               return cleanupFeedbackMessagesOnDetach;
+       }
+
+       public void setCleanupFeedbackMessagesOnDetach(boolean 
cleanupFeedbackMessagesOnDetach)
+       {
+               this.cleanupFeedbackMessagesOnDetach = 
cleanupFeedbackMessagesOnDetach;
+       }
+
+
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/RenderPageRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/RenderPageRequestHandler.java?rev=916912&r1=916911&r2=916912&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/RenderPageRequestHandler.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/RenderPageRequestHandler.java
 Sat Feb 27 06:09:07 2010
@@ -146,6 +146,6 @@
         */
        public void respond(RequestCycle requestCycle)
        {
-               
Application.get().getRenderPageRequestHandlerDelegate(this).respond(requestCycle);
+               
Application.get().getPageRendererProvider().get(this).respond(requestCycle);
        }
 }

Copied: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/PageRenderer.java
 (from r916772, 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/RenderPageRequestHandlerDelegate.java)
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/PageRenderer.java?p2=wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/PageRenderer.java&p1=wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/RenderPageRequestHandlerDelegate.java&r1=916772&r2=916912&rev=916912&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/RenderPageRequestHandlerDelegate.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/PageRenderer.java
 Sat Feb 27 06:09:07 2010
@@ -28,7 +28,7 @@
  * 
  * @author Matej Knopp
  */
-public abstract class RenderPageRequestHandlerDelegate
+public abstract class PageRenderer
 {
        private final RenderPageRequestHandler renderPageRequestHandler;
 
@@ -37,7 +37,7 @@
         * 
         * @param renderPageRequestHandler
         */
-       public RenderPageRequestHandlerDelegate(RenderPageRequestHandler 
renderPageRequestHandler)
+       public PageRenderer(RenderPageRequestHandler renderPageRequestHandler)
        {
                this.renderPageRequestHandler = renderPageRequestHandler;
        }

Copied: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebPageRenderer.java
 (from r916772, 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java)
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebPageRenderer.java?p2=wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebPageRenderer.java&p1=wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java&r1=916772&r2=916912&rev=916912&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebPageRenderer.java
 Sat Feb 27 06:09:07 2010
@@ -32,20 +32,20 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * {...@link RenderPageRequestHandlerDelegate} for web applications.
+ * {...@link PageRenderer} for web applications.
  * 
  * @author Matej Knopp
  */
-public class WebRenderPageRequestHandlerDelegate extends 
RenderPageRequestHandlerDelegate
+public class WebPageRenderer extends PageRenderer
 {
-       private static Logger logger = 
LoggerFactory.getLogger(WebRenderPageRequestHandlerDelegate.class);
+       private static Logger logger = 
LoggerFactory.getLogger(WebPageRenderer.class);
 
        /**
         * Construct.
         * 
         * @param renderPageRequestHandler
         */
-       public WebRenderPageRequestHandlerDelegate(RenderPageRequestHandler 
renderPageRequestHandler)
+       public WebPageRenderer(RenderPageRequestHandler 
renderPageRequestHandler)
        {
                super(renderPageRequestHandler);
        }
@@ -149,7 +149,7 @@
        }
 
        /**
-        * @see 
org.apache.wicket.ng.request.handler.impl.render.RenderPageRequestHandlerDelegate#respond(org.apache.wicket.ng.request.cycle.RequestCycle)
+        * @see 
org.apache.wicket.ng.request.handler.impl.render.PageRenderer#respond(org.apache.wicket.ng.request.cycle.RequestCycle)
         */
        @Override
        public void respond(RequestCycle requestCycle)

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebApplication.java?rev=916912&r1=916911&r2=916912&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
 Sat Feb 27 06:09:07 2010
@@ -24,6 +24,7 @@
 import javax.servlet.http.HttpSession;
 
 import org.apache.wicket.Application;
+import org.apache.wicket.IPageRendererProvider;
 import org.apache.wicket.IRequestHandler;
 import org.apache.wicket.Page;
 import org.apache.wicket.Request;
@@ -39,8 +40,8 @@
 import org.apache.wicket.ng.request.IRequestMapper;
 import org.apache.wicket.ng.request.Url;
 import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
-import 
org.apache.wicket.ng.request.handler.impl.render.RenderPageRequestHandlerDelegate;
-import 
org.apache.wicket.ng.request.handler.impl.render.WebRenderPageRequestHandlerDelegate;
+import org.apache.wicket.ng.request.handler.impl.render.PageRenderer;
+import org.apache.wicket.ng.request.handler.impl.render.WebPageRenderer;
 import org.apache.wicket.ng.request.mapper.MountedMapper;
 import org.apache.wicket.ng.resource.ResourceReference;
 import org.apache.wicket.session.HttpSessionStore;
@@ -102,6 +103,8 @@
        /** Log. */
        private static final Logger log = 
LoggerFactory.getLogger(WebApplication.class);
 
+       private ServletContext servletContext;
+
        /**
         * Covariant override for easy getting the current {...@link 
WebApplication} without having to cast
         * it.
@@ -135,6 +138,7 @@
        /** The WicketFilter that this application is attached to */
        private WicketFilter wicketFilter;
 
+
        /**
         * Constructor. <strong>Use {...@link #init()} for any configuration of 
your application instead of
         * overriding the constructor.</strong>
@@ -172,6 +176,18 @@
                        " in the init() method instead of your constructor");
        }
 
+
+       /**
+        * Sets servlet context this application runs after. This is uaully 
done from a filter or a
+        * servlet responsible for managing this application object, such as 
{...@link WicketFilter}
+        * 
+        * @param servletContext
+        */
+       public void setServletContext(ServletContext servletContext)
+       {
+               this.servletContext = servletContext;
+       }
+
        /**
         * Gets the servlet context for this application. Use this to get 
references to absolute paths,
         * global web.xml parameters (&lt;context-param&gt;), etc.
@@ -180,13 +196,13 @@
         */
        public ServletContext getServletContext()
        {
-               if (wicketFilter != null)
+               if (servletContext == null)
                {
-                       return 
wicketFilter.getFilterConfig().getServletContext();
+                       throw new IllegalStateException("servletContext is not 
set yet. Any code in your"
+                               + " Application object that uses the wicket 
filter instance should be put"
+                               + " in the init() method instead of your 
constructor");
                }
-               throw new IllegalStateException("servletContext is not set yet. 
Any code in your"
-                       + " Application object that uses the wicket filter 
instance should be put"
-                       + " in the init() method instead of your constructor");
+               return servletContext;
        }
 
        /**
@@ -352,7 +368,9 @@
         */
        public final void setWicketFilter(final WicketFilter wicketFilter)
        {
+               Checks.argumentNotNull(wicketFilter, "wicketFilter");
                this.wicketFilter = wicketFilter;
+               servletContext = 
wicketFilter.getFilterConfig().getServletContext();
        }
 
        /**
@@ -421,6 +439,8 @@
                        getResourceSettings().addResourceFolder(resourceFolder);
                }
 
+               setPageRendererProvider(new WebPageRendererProvider());
+
                // Configure the app.
                configure();
        }
@@ -633,13 +653,6 @@
        }
 
        @Override
-       public RenderPageRequestHandlerDelegate 
getRenderPageRequestHandlerDelegate(
-               RenderPageRequestHandler renderPageRequestHandler)
-       {
-               return new 
WebRenderPageRequestHandlerDelegate(renderPageRequestHandler);
-       }
-
-       @Override
        public void set()
        {
                ThreadContext.setApplication(this);
@@ -651,4 +664,13 @@
                String mimeType = getServletContext().getMimeType(fileName);
                return mimeType != null ? mimeType : 
super.getMimeType(fileName);
        }
+
+       private static class WebPageRendererProvider implements 
IPageRendererProvider
+       {
+               public PageRenderer get(RenderPageRequestHandler handler)
+               {
+                       return new WebPageRenderer(handler);
+               }
+
+       }
 }

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/util/IProvider.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/util/IProvider.java?rev=916912&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/util/IProvider.java 
(added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/util/IProvider.java Sat 
Feb 27 06:09:07 2010
@@ -0,0 +1,33 @@
+/*
+ * 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.util;
+
+/**
+ * An object that can provide instances of type {...@code T}
+ * 
+ * @author igor.vaynberg
+ * @param <T>
+ */
+public interface IProvider<T>
+{
+       /**
+        * Provides an instance of type {...@code T}
+        * 
+        * @return instance of type {...@code T}
+        */
+       T get();
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/util/IProvider.java
------------------------------------------------------------------------------
    svn:executable = *

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=916912&r1=916911&r2=916912&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
 Sat Feb 27 06:09:07 2010
@@ -18,7 +18,6 @@
 
 import java.io.Serializable;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -28,10 +27,14 @@
 
 import javax.servlet.http.Cookie;
 
+import org.apache.wicket.Application;
 import org.apache.wicket.Component;
+import org.apache.wicket.IPageRendererProvider;
+import org.apache.wicket.IRequestCycleProvider;
 import org.apache.wicket.IRequestHandler;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
+import org.apache.wicket.Request;
 import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.Session;
 import org.apache.wicket.WicketRuntimeException;
@@ -61,20 +64,24 @@
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.ng.ThreadContext;
 import org.apache.wicket.ng.mock.MockApplication;
-import org.apache.wicket.ng.mock.MockRequestCycle;
 import org.apache.wicket.ng.mock.MockSession;
 import org.apache.wicket.ng.mock.MockWebRequest;
 import org.apache.wicket.ng.mock.MockWebResponse;
 import org.apache.wicket.ng.request.IRequestMapper;
 import org.apache.wicket.ng.request.Url;
 import org.apache.wicket.ng.request.component.PageParameters;
+import org.apache.wicket.ng.request.cycle.IExceptionMapper;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
+import org.apache.wicket.ng.request.cycle.RequestCycleContext;
 import org.apache.wicket.ng.request.handler.IPageProvider;
 import org.apache.wicket.ng.request.handler.PageAndComponentProvider;
 import org.apache.wicket.ng.request.handler.PageProvider;
 import 
org.apache.wicket.ng.request.handler.impl.BookmarkablePageRequestHandler;
 import 
org.apache.wicket.ng.request.handler.impl.ListenerInterfaceRequestHandler;
 import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
+import org.apache.wicket.ng.request.handler.impl.render.PageRenderer;
+import org.apache.wicket.protocol.http.MockServletContext;
+import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.settings.IRequestCycleSettings.RenderStrategy;
 import org.apache.wicket.util.diff.DiffUtil;
 import org.apache.wicket.util.lang.Classes;
@@ -128,7 +135,7 @@
        }
 
 
-       private final MockApplication application;
+       private final WebApplication application;
 
        private boolean followRedirects = true;
        private int redirectCount;
@@ -150,7 +157,23 @@
        private final MockSession session;
 
        /** current request cycle */
-       private MockRequestCycle requestCycle;
+       private RequestCycle requestCycle;
+       private RequestCycle lastRequestCycle;
+
+       private Page lastRenderedPage;
+
+       private boolean exposeExceptions = true;
+
+       private IRequestHandler forcedHandler;
+
+       /**
+        * @return last rendered page
+        */
+       public Page getLastRenderedPage()
+       {
+               return lastRenderedPage;
+       }
+
 
        /**
         * Creates <code>WicketTester</code> and automatically create a 
<code>WebApplication</code>, but
@@ -197,17 +220,28 @@
         * @param application
         *            a <code>WicketTester</code> <code>WebApplication</code> 
object
         */
-       public BaseWicketTester(final MockApplication application)
+       public BaseWicketTester(final WebApplication application)
        {
                oldThreadContext = ThreadContext.detach();
 
                this.application = application;
+
                // FIXME some tests are leaking applications by not calling 
destroy on them or overriding
                // teardown() without calling super, for now we work around by 
making each name unique
                this.application.setName("WicketTesterApplication-" + 
UUID.randomUUID());
                this.application.set();
+
+               application.setServletContext(new 
MockServletContext(application, ""));
+
+               // initialize the application
                this.application.initApplication();
 
+               // reconfigure application for the test environment
+               application.setPageRendererProvider(new 
LastPageRecordingPageRendererProvider(
+                       application.getPageRendererProvider()));
+               application.setRequestCycleProvider(new 
TestRequestCycleProvider(
+                       application.getRequestCycleProvider()));
+
                // prepare session
                session = new MockSession(new MockWebRequest(Url.parse("/")));
                getApplication().getSessionStore().bind(null, session);
@@ -220,7 +254,7 @@
        {
                request = new MockWebRequest(Url.parse("/"));
                response = new MockWebResponse();
-               requestCycle = 
(MockRequestCycle)application.createRequestCycle(request, response);
+               requestCycle = application.createRequestCycle(request, 
response);
                ThreadContext.setRequestCycle(requestCycle);
        }
 
@@ -259,11 +293,11 @@
        }
 
        /**
-        * Returns the {...@link MockApplication} for this environment.
+        * Returns the {...@link Application} for this environment.
         * 
         * @return application
         */
-       public MockApplication getApplication()
+       public WebApplication getApplication()
        {
                return application;
        }
@@ -274,7 +308,7 @@
         */
        public void destroy()
        {
-               application.destroy();
+               application.internalDestroy();
                ThreadContext.detach();
        }
 
@@ -311,24 +345,29 @@
                return processRequest(request, forcedRequestHandler, false);
        }
 
-       private boolean processRequest(MockWebRequest request, IRequestHandler 
forcedRequestHandler,
-               boolean redirect)
+       private boolean processRequest(MockWebRequest forcedRequest,
+               IRequestHandler forcedRequestHandler, boolean redirect)
        {
 
+               if (forcedRequest != null)
+               {
+                       request = forcedRequest;
+               }
+
+               forcedHandler = forcedRequestHandler;
+               requestCycle = application.createRequestCycle(request, 
response);
+               ThreadContext.setRequestCycle(requestCycle);
+
                try
                {
+
                        if (!redirect)
                        {
                                /*
                                 * we do not reset the session during redirect 
processing because we want to
                                 * preserve the state before the redirect, eg 
any error messages reported
                                 */
-                               session.reset();
-                       }
-
-                       if (request != null)
-                       {
-                               setRequest(request);
+                               session.cleanupFeedbackMessages();
                        }
 
                        if (getLastResponse() != null)
@@ -337,15 +376,10 @@
                                // worked...
                                for (Cookie cookie : 
getLastResponse().getCookies())
                                {
-                                       this.request.addCookie(cookie);
+                                       request.addCookie(cookie);
                                }
                        }
 
-                       if (forcedRequestHandler != null)
-                       {
-                               
requestCycle.forceRequestHandler(forcedRequestHandler);
-                       }
-
                        if (!requestCycle.processRequestAndDetach())
                        {
                                return false;
@@ -354,6 +388,13 @@
                        recordRequestResponse();
                        setupNextRequestCycle();
 
+
+                       // reattach request cycle to thread after it removed 
itself in detach
+                       lastRequestCycle = requestCycle;
+                       requestCycle = application.createRequestCycle(request, 
response);
+                       ThreadContext.setRequestCycle(requestCycle);
+
+
                        if (followRedirects && lastResponse.isRedirect())
                        {
                                if (redirectCount == 100)
@@ -373,7 +414,7 @@
                                        newUrl.getQueryParameters());
                                mergedURL.concatSegments(newUrl.getSegments());
 
-                               this.request.setUrl(mergedURL);
+                               request.setUrl(mergedURL);
                                processRequest(null, null, true);
 
                                --redirectCount;
@@ -388,6 +429,13 @@
 
        }
 
+
+       public RequestCycle getLastRequestCycle()
+       {
+               return lastRequestCycle;
+       }
+
+
        private void recordRequestResponse()
        {
                lastRequest = request;
@@ -466,14 +514,6 @@
        }
 
        /**
-        * @return last rendered page
-        */
-       public Page getLastRenderedPage()
-       {
-               return (Page)application.getLastRenderedPage();
-       }
-
-       /**
         * Sets whether responses with redirects will be followed automatically.
         * 
         * @param followRedirects
@@ -600,7 +640,7 @@
         */
        public final <C extends Page> Page startPage(Class<C> pageClass)
        {
-               request.setUrl(RequestCycle.get().urlFor(
+               request.setUrl(application.getRootRequestMapper().mapHandler(
                        new BookmarkablePageRequestHandler(new 
PageProvider(pageClass))));
                processRequest();
                return getLastRenderedPage();
@@ -619,7 +659,7 @@
         */
        public final <C extends Page> Page startPage(Class<C> pageClass, 
PageParameters parameters)
        {
-               request.setUrl(RequestCycle.get().urlFor(
+               request.setUrl(application.getRootRequestMapper().mapHandler(
                        new BookmarkablePageRequestHandler(new 
PageProvider(pageClass, parameters))));
                processRequest();
                return getLastRenderedPage();
@@ -717,23 +757,7 @@
                                                        Constructor<? extends 
Panel> c = panelClass.getConstructor(String.class);
                                                        return 
c.newInstance(panelId);
                                                }
-                                               catch (SecurityException e)
-                                               {
-                                                       throw 
convertoUnexpect(e);
-                                               }
-                                               catch (NoSuchMethodException e)
-                                               {
-                                                       throw 
convertoUnexpect(e);
-                                               }
-                                               catch (InstantiationException e)
-                                               {
-                                                       throw 
convertoUnexpect(e);
-                                               }
-                                               catch (IllegalAccessException e)
-                                               {
-                                                       throw 
convertoUnexpect(e);
-                                               }
-                                               catch 
(InvocationTargetException e)
+                                               catch (Exception e)
                                                {
                                                        throw 
convertoUnexpect(e);
                                                }
@@ -1579,7 +1603,7 @@
                throw new WicketRuntimeException(message);
        }
 
-       public MockRequestCycle getRequestCycle()
+       public RequestCycle getRequestCycle()
        {
                return requestCycle;
        }
@@ -1595,4 +1619,117 @@
        }
 
 
+       public boolean isExposeExceptions()
+       {
+               return exposeExceptions;
+       }
+
+
+       public void setExposeExceptions(boolean exposeExceptions)
+       {
+               this.exposeExceptions = exposeExceptions;
+       }
+
+
+       private class LastPageRecordingPageRendererProvider implements 
IPageRendererProvider
+       {
+               private final IPageRendererProvider delegate;
+
+               public 
LastPageRecordingPageRendererProvider(IPageRendererProvider delegate)
+               {
+                       this.delegate = delegate;
+               }
+
+               public PageRenderer get(RenderPageRequestHandler handler)
+               {
+                       lastRenderedPage = 
(Page)handler.getPageProvider().getPageInstance();
+                       return delegate.get(handler);
+               }
+       }
+
+       private class TestExceptionMapper implements IExceptionMapper
+       {
+               private final IExceptionMapper delegate;
+
+               public TestExceptionMapper(IExceptionMapper delegate)
+               {
+                       this.delegate = delegate;
+               }
+
+               public IRequestHandler map(Exception e)
+               {
+                       if (exposeExceptions)
+                       {
+                               if (e instanceof RuntimeException)
+                               {
+                                       throw (RuntimeException)e;
+                               }
+                               else
+                               {
+                                       throw new WicketRuntimeException(e);
+                               }
+                       }
+                       else
+                       {
+                               return delegate.map(e);
+                       }
+               }
+       }
+
+       private class TestRequestCycleProvider implements IRequestCycleProvider
+       {
+               private final IRequestCycleProvider delegate;
+
+               public TestRequestCycleProvider(IRequestCycleProvider delegate)
+               {
+                       this.delegate = delegate;
+               }
+
+
+               public RequestCycle get(RequestCycleContext context)
+               {
+                       context.setRequestMapper(new 
TestRequestMapper(context.getRequestMapper(),
+                               forcedHandler));
+                       forcedHandler = null;
+                       context.setExceptionMapper(new 
TestExceptionMapper(context.getExceptionMapper()));
+                       return delegate.get(context);
+               }
+
+       }
+
+       private static class TestRequestMapper implements IRequestMapper
+       {
+               private final IRequestMapper delegate;
+               private final IRequestHandler forcedHandler;
+
+               public TestRequestMapper(IRequestMapper delegate, 
IRequestHandler forced)
+               {
+                       this.delegate = delegate;
+                       forcedHandler = forced;
+               }
+
+               public int getCompatibilityScore(Request request)
+               {
+                       return delegate.getCompatibilityScore(request);
+               }
+
+               public Url mapHandler(IRequestHandler requestHandler)
+               {
+                       return delegate.mapHandler(requestHandler);
+               }
+
+               public IRequestHandler mapRequest(Request request)
+               {
+                       if (forcedHandler != null)
+                       {
+                               return forcedHandler;
+                       }
+                       else
+                       {
+                               return delegate.mapRequest(request);
+                       }
+               }
+
+       }
+
 }

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ParentResourceEscapePathTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ParentResourceEscapePathTest.java?rev=916912&r1=916911&r2=916912&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ParentResourceEscapePathTest.java
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ParentResourceEscapePathTest.java
 Sat Feb 27 06:09:07 2010
@@ -64,7 +64,7 @@
                final ResourceReference ref = new PackageResourceReference(
                        ParentResourceEscapePathTestPage.class, 
"../../../ParentResourceTest.js");
 
-               assertEquals(expectedResourceUrl(), 
tester.getRequestCycle().urlFor(ref));
+               assertEquals(expectedResourceUrl(), 
tester.getLastRequestCycle().urlFor(ref));
        }
 
        public void testRequestHandlingOfResourceUrlWithEscapeStringInside()


Reply via email to