Updated Branches:
  
refs/heads/sandbox/WICKET-4441-create-new-page-hybrid-url-with-different-parameters
 a53591f03 -> aa84e95ab


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/WICKET-4441-create-new-page-hybrid-url-with-different-parameters
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

Reply via email to