Repository: wicket Updated Branches: refs/heads/master f7a669086 -> c4805d870
WICKET-6288 testing if the page if expired using IPageProvider API Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c4805d87 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c4805d87 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c4805d87 Branch: refs/heads/master Commit: c4805d87012c2f0c2e80418453d0c60f3a5db7c7 Parents: f7a6690 Author: Pedro Henrique Oliveira dos Santos <[email protected]> Authored: Wed Jan 25 04:03:19 2017 -0200 Committer: Pedro Henrique Oliveira dos Santos <[email protected]> Committed: Wed Jan 25 04:03:19 2017 -0200 ---------------------------------------------------------------------- .../core/request/handler/IPageProvider.java | 7 +++ .../ListenerInterfaceRequestHandler.java | 21 ++++---- .../core/request/handler/PageProvider.java | 9 ++++ .../ListenerInterfaceRequestHandlerTest.java | 55 ++++++++++++++++++++ 4 files changed, 80 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/c4805d87/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java index 617eb81..90fdaf8 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java @@ -62,6 +62,13 @@ public interface IPageProvider boolean isNewPageInstance(); /** + * Returns whether the provided page was expired prior to this access. + * + * @return <code>true></code> if the page was created after its original instance expired. + */ + boolean wasExpired(); + + /** * Returns class of the page. * * @return page class http://git-wip-us.apache.org/repos/asf/wicket/blob/c4805d87/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 4cb54ee..c976a42 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 @@ -167,28 +167,25 @@ public class ListenerInterfaceRequestHandler // initialize the page to be able to check whether it is stateless ((Page)page).internalInitialize(); } - final boolean isStateless = page.isPageStateless(); - RedirectPolicy policy = isStateless + RedirectPolicy policy = page.isPageStateless() ? RedirectPolicy.NEVER_REDIRECT : RedirectPolicy.AUTO_REDIRECT; - final boolean canCallListenerInterfaceAfterExpiry = component != null && component.canCallListenerInterfaceAfterExpiry(); + boolean blockIfExpired = component != null && !component.canCallListenerInterfaceAfterExpiry(); - if (!canCallListenerInterfaceAfterExpiry && freshPage && (isStateless == false || component == null)) - { - // A request listener is invoked on an expired page. + boolean lateComponent = component == null && freshPage; - // If the page is stateful then we cannot assume that the listener 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 - // should be ignored and the best we can do is to re-paint the newly constructed - // page. + if ((pageComponentProvider.wasExpired() && blockIfExpired) || lateComponent) + { + // A request listener is invoked on an expired page or the component couldn't be + // determined. The best we can do is to re-paint the newly constructed page. + // Reference: WICKET-4454, WICKET-6288 if (LOG.isDebugEnabled()) { LOG.debug( - "An IRequestListener on '{}' is executed on an expired stateful page. " + "An IRequestListener was called but its page/component({}) couldn't be resolved. " + "Scheduling re-create of the page and ignoring the listener interface...", getComponentPath()); } http://git-wip-us.apache.org/repos/asf/wicket/blob/c4805d87/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java index 0d262d1..e5e1a01 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java @@ -220,6 +220,15 @@ public class PageProvider implements IPageProvider, IClusterable } /** + * @see org.apache.wicket.core.request.handler.IPageProvider#wasExpired() + */ + @Override + public boolean wasExpired() + { + return pageId != null && isPageInstanceFresh(); + } + + /** * @see IPageProvider#getPageClass() */ @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/c4805d87/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 930bec3..d1c0592 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 @@ -16,6 +16,8 @@ */ package org.apache.wicket.core.request.handler; +import static org.hamcrest.Matchers.is; + import java.io.IOException; import java.text.ParseException; @@ -25,9 +27,15 @@ import org.apache.wicket.Session; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.core.request.mapper.MountedMapper; +import org.apache.wicket.markup.IMarkupFragment; import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.Markup; import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.markup.html.link.StatelessLink; import org.apache.wicket.request.Url; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.resource.DummyPage; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceStreamNotFoundException; @@ -150,4 +158,51 @@ public class ListenerInterfaceRequestHandlerTest extends WicketTestCase assertFalse("Handler should not report a page instance is available ", handler.isPageInstanceCreated()); } + + @Test + public void skipListenerIfExpiredPage() + { + tester.getApplication().getRootRequestMapperAsCompound() .add(new MountedMapper("/segment", NotExpiredPage.class)); + tester.startPage(NotExpiredPage.class); + tester.clickLink("statelessLink"); + NotExpiredPage page = (NotExpiredPage)tester.getLastRenderedPage(); + assertThat(page.invoked, is(true)); + } + + public static class NotExpiredPage extends WebPage + { + public boolean invoked; + + public NotExpiredPage(PageParameters pageParameters) + { + super(pageParameters); + add(new StatelessLink<Object>("statelessLink") + { + public void onClick() + { + invoked = true; + } + }); + add(new Link<Object>("statefullLink") + { + public void onClick() + { + } + }); + } + + @Override + public IMarkupFragment getMarkup() + { + return Markup.of( + "<html><body><a wicket:id=\"statelessLink\"></a><a wicket:id=\"statefullLink\"></a></body></html>"); + } + + @Override + protected void onBeforeRender() + { + get("statefullLink").setVisible(false); + super.onBeforeRender(); + } + } }
