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

Reply via email to