Merge branch 'master' into sandbox/preserve-page-parameters-and-execute-listener-interface-after-expiration
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/79ba3381 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/79ba3381 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/79ba3381 Branch: refs/heads/sandbox/preserve-page-parameters-and-execute-listener-interface-after-expiration Commit: 79ba33817899b5921a1864da9fc39e5f5a97395b Parents: 4299d74 60d3009 Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Authored: Thu Jan 16 12:51:18 2014 +0200 Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Committed: Thu Jan 16 12:51:18 2014 +0200 ---------------------------------------------------------------------- .../src/main/java/org/apache/wicket/Page.java | 3 + .../wicket/ajax/res/js/wicket-event-jquery.js | 26 +++++- .../ListenerInterfaceRequestHandler.java | 98 ++++++++++---------- .../markup/html/form/NumberTextField.java | 16 +++- .../wicket/request/cycle/RequestCycle.java | 6 +- .../request/resource/PackageResource.java | 6 +- .../apache/wicket/settings/PageSettings.java | 2 +- .../ListenerInterfaceRequestHandlerTest.java | 31 ++++++- .../markup/html/form/NumberTextFieldTest.java | 34 ++++++- .../wicket/request/cycle/UrlRendererTest.java | 11 +++ wicket-core/src/test/js/event.js | 20 ++++ .../ajax/markup/html/modal/res/modal.js | 18 ++-- .../org/apache/wicket/request/UrlRenderer.java | 4 +- .../util/resource/ResourceStreamWrapper.java | 2 +- 14 files changed, 203 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/79ba3381/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java ---------------------------------------------------------------------- diff --cc wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java index 76fa264,1e24206..0ddb30b --- 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,68 -172,62 +172,66 @@@ public class ListenerInterfaceRequestHa 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."); + } + + 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); - RedirectPolicy policy = isStateless ? RedirectPolicy.NEVER_REDIRECT - : RedirectPolicy.AUTO_REDIRECT; - final IPageProvider pageProvider = new PageProvider(page); - if (freshPage && (isStateless == false || component == null)) ++ final boolean canCallListenerInterfaceAfterExpiry = component != null ++ ? component.canCallListenerInterfaceAfterExpiry() ++ : false; + - final boolean canCallListenerInterfaceAfterExpiry = component != null - ? component.canCallListenerInterfaceAfterExpiry() - : false; - if (!canCallListenerInterfaceAfterExpiry && freshPage && (isStateless == false || component == null)) ++ if (!canCallListenerInterfaceAfterExpiry && 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/79ba3381/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java ---------------------------------------------------------------------- diff --cc wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java index 8070359,19ddaa0..aa8a351 --- a/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java +++ b/wicket-core/src/main/java/org/apache/wicket/settings/PageSettings.java @@@ -121,29 -115,4 +121,29 @@@ public class PageSetting { this.recreateMountedPagesAfterExpiry = recreateMountedPagesAfterExpiry; } + + /** + * @return {@code true} if Wicket should execute the listener interface of a component + * which owner page is freshly created after expiration of the old one + * @see #getRecreateMountedPagesAfterExpiry() + * @see org.apache.wicket.request.component.IRequestableComponent#canCallListenerInterfaceAfterExpiry() + */ + public boolean getCallListenerInterfaceAfterExpiry() + { + return recreateMountedPagesAfterExpiry && callListenerInterfaceAfterExpiry; + } + + /** + * Sets a setting that determines whether Wicket should execute the listener interface of a component + * which owner page is freshly created after expiration of the old one + * + * @param callListenerInterfaceAfterExpiry + * {@code true} if Wicket should execute the listener interface - * @see #setRecreateMountedPagesAfterExpiry(boolean) ++ * @see #setRecreateMountedPagesAfterExpiry(boolean) + * @see org.apache.wicket.request.component.IRequestableComponent#canCallListenerInterfaceAfterExpiry() + */ + public void setCallListenerInterfaceAfterExpiry(boolean callListenerInterfaceAfterExpiry) + { + this.callListenerInterfaceAfterExpiry = callListenerInterfaceAfterExpiry; + } }