Updated Branches: refs/heads/sandbox/preserve-page-parameters-and-execute-listener-interface-after-expiration 4299d74c9 -> 79ba33817
WICKET-5466 watch out for null component; break early from method Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c1c1f794 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c1c1f794 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c1c1f794 Branch: refs/heads/sandbox/preserve-page-parameters-and-execute-listener-interface-after-expiration Commit: c1c1f79408052235339c8696a8c3564caac8a111 Parents: 5de39f4 Author: svenmeier <[email protected]> Authored: Tue Jan 14 16:59:42 2014 +0100 Committer: svenmeier <[email protected]> Committed: Tue Jan 14 16:59:42 2014 +0100 ---------------------------------------------------------------------- .../ListenerInterfaceRequestHandler.java | 91 ++++++++++---------- .../ListenerInterfaceRequestHandlerTest.java | 31 ++++++- 2 files changed, 74 insertions(+), 48 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/c1c1f794/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java index 84592d7..1e24206 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java @@ -172,65 +172,62 @@ public class ListenerInterfaceRequestHandler component = null; } - if ((component == null && freshPage) || - (component != null && getComponent().getPage() == page)) + if ((component == null && !freshPage) || (component != null && component.getPage() != page)) { - if (page instanceof Page) - { - // initialize the page to be able to check whether it is stateless - ((Page)page).internalInitialize(); - } - final boolean isStateless = page.isPageStateless(); + throw new WicketRuntimeException("Component '" + getComponentPath() + + "' has been removed from page."); + } - RedirectPolicy policy = isStateless ? RedirectPolicy.NEVER_REDIRECT - : RedirectPolicy.AUTO_REDIRECT; - final IPageProvider pageProvider = new PageProvider(page); + if (page instanceof Page) + { + // initialize the page to be able to check whether it is stateless + ((Page)page).internalInitialize(); + } + final boolean isStateless = page.isPageStateless(); + + RedirectPolicy policy = isStateless + ? RedirectPolicy.NEVER_REDIRECT + : RedirectPolicy.AUTO_REDIRECT; + final IPageProvider pageProvider = new PageProvider(page); - if (freshPage && (isStateless == false || component == null)) + if (freshPage && (isStateless == false || component == null)) + { + // A listener interface is invoked on an expired page. + + // If the page is stateful then we cannot assume that the listener interface is + // invoked on its initial state (right after page initialization) and that its + // component and/or behavior will be available. That's why the listener interface + // should be ignored and the best we can do is to re-paint the newly constructed + // page. + + if (LOG.isDebugEnabled()) { - // A listener interface is invoked on an expired page. - - // If the page is stateful then we cannot assume that the listener interface is - // invoked on its initial state (right after page initialization) and that its - // component and/or behavior will be available. That's why the listener interface - // should be ignored and the best we can do is to re-paint the newly constructed - // page. - - if (LOG.isDebugEnabled()) - { - LOG.debug( - "A ListenerInterface '{}' assigned to '{}' is executed on an expired stateful page. " - + "Scheduling re-create of the page and ignoring the listener interface...", - listenerInterface, getComponentPath()); - } - - if (isAjax) - { - policy = RedirectPolicy.ALWAYS_REDIRECT; - } - - requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler( - pageProvider, policy)); - return; + LOG.debug( + "A ListenerInterface '{}' assigned to '{}' is executed on an expired stateful page. " + + "Scheduling re-create of the page and ignoring the listener interface...", + listenerInterface, getComponentPath()); } - if (isAjax == false && listenerInterface.isRenderPageAfterInvocation()) + if (isAjax) { - // schedule page render after current request handler is done. this can be - // overridden during invocation of listener - // method (i.e. by calling RequestCycle#setResponsePage) - requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler( - pageProvider, policy)); + policy = RedirectPolicy.ALWAYS_REDIRECT; } - invokeListener(); - + requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler( + pageProvider, policy)); + return; } - else + + if (isAjax == false && listenerInterface.isRenderPageAfterInvocation()) { - throw new WicketRuntimeException("Component " + getComponent() + - " has been removed from page."); + // schedule page render after current request handler is done. this can be + // overridden during invocation of listener + // method (i.e. by calling RequestCycle#setResponsePage) + requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler( + pageProvider, policy)); } + + invokeListener(); } private void invokeListener() http://git-wip-us.apache.org/repos/asf/wicket/blob/c1c1f794/wicket-core/src/test/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandlerTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandlerTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandlerTest.java index 9cd6905..cc03296 100644 --- a/wicket-core/src/test/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandlerTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandlerTest.java @@ -23,13 +23,16 @@ import org.apache.wicket.MarkupContainer; import org.apache.wicket.Page; import org.apache.wicket.RequestListenerInterface; import org.apache.wicket.Session; +import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.WicketTestCase; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.IMarkupResourceStreamProvider; import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.form.IOnChangeListener; import org.apache.wicket.markup.html.link.ILinkListener; import org.apache.wicket.request.Url; +import org.apache.wicket.resource.DummyPage; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceStreamNotFoundException; import org.apache.wicket.util.resource.StringResourceStream; @@ -42,8 +45,34 @@ public class ListenerInterfaceRequestHandlerTest extends WicketTestCase { /** + * WICKET-5466 + */ + @Test + public void removedComponent() + { + // non-existing component on fresh page is ignored + PageAndComponentProvider freshPage = new PageAndComponentProvider(DummyPage.class, null, + "foo"); + new ListenerInterfaceRequestHandler(freshPage, IOnChangeListener.INTERFACE).respond(tester + .getRequestCycle()); + + // non-existing component on old page fails + PageAndComponentProvider oldPage = new PageAndComponentProvider(new DummyPage(), "foo"); + try + { + new ListenerInterfaceRequestHandler(oldPage, IOnChangeListener.INTERFACE) + .respond(tester.getRequestCycle()); + fail(); + } + catch (WicketRuntimeException ex) + { + assertEquals("Component 'foo' has been removed from page.", ex.getMessage()); + } + } + + /** * https://issues.apache.org/jira/browse/WICKET-4116 - * + * * @throws Exception */ @Test
