This is an automated email from the ASF dual-hosted git repository. svenmeier pushed a commit to branch WICKET-6847-onEndRequest-before-flush in repository https://gitbox.apache.org/repos/asf/wicket.git
commit 15a6cedfb8b855c004b2ece201d9eac063ef770e Author: Sven Meier <svenme...@apache.org> AuthorDate: Fri Nov 6 18:36:16 2020 +0100 WICKET-6847 onEndRequest before flush allows RequestPageStore to check for stateful pages --- pom.xml | 12 ++++++++++++ .../src/main/java/org/apache/wicket/Application.java | 6 ++++++ .../java/org/apache/wicket/page/IPageManager.java | 6 ++++++ .../java/org/apache/wicket/page/PageManager.java | 6 ++++++ .../apache/wicket/pageStore/DelegatingPageStore.java | 6 ++++++ .../java/org/apache/wicket/pageStore/IPageStore.java | 9 +++++++++ .../apache/wicket/pageStore/RequestPageStore.java | 19 ++++++++++++++----- .../apache/wicket/request/cycle/RequestCycle.java | 20 ++++++++++---------- 8 files changed, 69 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 0c7cfd5..4e0c912 100644 --- a/pom.xml +++ b/pom.xml @@ -1133,6 +1133,18 @@ <comparisonVersion>9.0.0</comparisonVersion> <failOnError>true</failOnError> <logResults>true</logResults> + <ignored> + <difference> + <differenceType>7012</differenceType> + <className>org/apache/wicket/page/IPageManager</className> + <method>void end()</method> + </difference> + <difference> + <differenceType>7012</differenceType> + <className>org/apache/wicket/pageStore/IPageStore</className> + <method>void end(org.apache.wicket.pageStore.IPageContext)</method> + </difference> + </ignored> </configuration> <executions> <execution> diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java b/wicket-core/src/main/java/org/apache/wicket/Application.java index 78fd57f..fa4ce29 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Application.java +++ b/wicket-core/src/main/java/org/apache/wicket/Application.java @@ -1567,6 +1567,12 @@ public abstract class Application implements UnboundListener, IEventSink, IMetad requestCycle.getListeners().add(new IRequestCycleListener() { @Override + public void onEndRequest(RequestCycle cycle) + { + internalGetPageManager().end(); + } + + @Override public void onDetach(final RequestCycle requestCycle) { internalGetPageManager().detach(); diff --git a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java index c675cd9..ef6094a 100644 --- a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java +++ b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java @@ -73,6 +73,12 @@ public interface IPageManager void clear(); /** + * End the request. + */ + default void end() { + } + + /** * Detach at end of request. */ void detach(); diff --git a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java index 642b3c1..02bf13c 100644 --- a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java +++ b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java @@ -80,6 +80,12 @@ public class PageManager implements IPageManager } @Override + public void end() + { + store.end(createPageContext()); + } + + @Override public void detach() { store.detach(createPageContext()); diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java index 5ec3a79..3402b2c 100644 --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java @@ -76,6 +76,12 @@ public abstract class DelegatingPageStore implements IPageStore } @Override + public void end(IPageContext context) + { + delegate.end(context); + } + + @Override public void detach(IPageContext context) { delegate.detach(context); diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java index 3872c8a..19f4079 100644 --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java @@ -94,6 +94,15 @@ public interface IPageStore IManageablePage getPage(IPageContext context, int id); /** + * End the current context. + * + * @param context + */ + default void end(IPageContext context) + { + } + + /** * Detach from the current context. * * @param context diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java index 54dc9da..d5c4d78 100644 --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java @@ -59,11 +59,6 @@ public class RequestPageStore extends DelegatingPageStore @Override public void addPage(IPageContext context, IManageablePage page) { - // make sure an HTTP session is bound before committing the response - if (isPageStateless(page) == false) - { - context.getSessionId(true); - } getRequestData(context).add(page); } @@ -92,6 +87,20 @@ public class RequestPageStore extends DelegatingPageStore } @Override + public void end(IPageContext context) + { + RequestData requestData = getRequestData(context); + for (IManageablePage page : requestData.pages()) + { + if (isPageStateless(page) == false) + { + // last opportunity to create a session + context.getSessionId(true); + } + } + } + + @Override public void detach(IPageContext context) { RequestData requestData = getRequestData(context); diff --git a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java index b9f9841..d913a92 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java @@ -261,6 +261,16 @@ public class RequestCycle implements IRequestCycle, IEventSink, IMetadataContext } finally { + try + { + onEndRequest(); + listeners.onEndRequest(this); + } + catch (RuntimeException e) + { + log.error("Exception occurred during onEndRequest", e); + } + set(null); } @@ -648,16 +658,6 @@ public class RequestCycle implements IRequestCycle, IEventSink, IMetadataContext { try { - onEndRequest(); - listeners.onEndRequest(this); - } - catch (RuntimeException e) - { - log.error("Exception occurred during onEndRequest", e); - } - - try - { requestHandlerExecutor.detach(); } catch (RuntimeException exception)