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 (<context-param>), 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()