From 1ab5a9da060beee8746465cb3d618befb94c643a Mon Sep 17 00:00:00 2001 From: reiern70 Date: Mon, 5 Jun 2023 11:03:17 +0300 Subject: [PATCH] [WICKET-7059] make easier to skip some page serializations --- .../wicket/pageStore/RequestPageStore.java | 19 ++++++++- .../pageStore/RequestPageStoreTest.java | 39 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) 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 c8034f5f4a0..d3a4244531e 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 @@ -21,6 +21,7 @@ import org.apache.wicket.MetaDataKey; import org.apache.wicket.page.IManageablePage; +import org.apache.wicket.request.IRequestCycle; import org.apache.wicket.request.cycle.RequestCycle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,9 +108,10 @@ public void end(IPageContext context) public void detach(IPageContext context) { RequestData requestData = getRequestData(context); + IRequestCycle requestCycle = RequestCycle.get(); for (IManageablePage page : requestData.pages()) { - if (isPageStateless(page) == false) + if (isPageStateless(page) == false && shouldSerializePage(requestCycle, page)) { getDelegate().addPage(context, page); } @@ -119,6 +121,21 @@ public void detach(IPageContext context) getDelegate().detach(context); } + /** + * Give the opportunity to skip some serializations. E.g. we have some AJAX behavior that is sending some + * info from client to page but page structure didn't change at all and nothing is repainted via AJAX. + * But this will trigger a serialization. Returning false here would prevent that request from doing a + * page serialization. For heavy pages this can really make a difference. + * + * @param requestCycle The request + * @param page The {@link IManageablePage} + * @return true if page should be serialized for this request. The default is true. + */ + protected boolean shouldSerializePage(IRequestCycle requestCycle, IManageablePage page) + { + return true; + } + private boolean isPageStateless(final IManageablePage page) { boolean isPageStateless; try diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/RequestPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/RequestPageStoreTest.java index ff021956c19..a9db0a0e0b9 100644 --- a/wicket-core/src/test/java/org/apache/wicket/pageStore/RequestPageStoreTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/RequestPageStoreTest.java @@ -23,6 +23,8 @@ import org.apache.wicket.MockPage; import org.apache.wicket.mock.MockPageContext; import org.apache.wicket.mock.MockPageStore; +import org.apache.wicket.page.IManageablePage; +import org.apache.wicket.request.IRequestCycle; import org.junit.jupiter.api.Test; /** @@ -62,6 +64,43 @@ void testAdd() assertNull(store.getPage(context, 2), "no page in request store"); assertNull(store.getPage(context, 3), "no page in request store"); } + + + @Test + void testAvoidSomePage() + { + MockPageStore mockStore = new MockPageStore(); + + MockPageContext context = new MockPageContext(); + + RequestPageStore store = new RequestPageStore(mockStore) { + @Override + protected boolean shouldSerializePage(IRequestCycle requestCycle, IManageablePage page) { + // we just skip serialization of third page. + return page.getPageId() != 3; + } + }; + + MockPage page1 = new MockPage(1); + MockPage page2 = new MockPage(2); + MockPage page3 = new MockPage(3); + + store.addPage(context, page1); + store.addPage(context, page2); + store.addPage(context, page3); + + assertTrue(mockStore.getPages().isEmpty(), "no pages delegated before detach"); + + store.detach(context); + + assertEquals(2, mockStore.getPages().size(), "pages delegated on detach"); + + mockStore.getPages().clear(); + + assertNull(store.getPage(context, 1), "no page in request store"); + assertNull(store.getPage(context, 2), "no page in request store"); + assertNull(store.getPage(context, 3), "no page in request store"); + } @Test void testUntouch()