This is an automated email from the ASF dual-hosted git repository. svenmeier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/wicket.git
commit ee9af92be7c0d47ae6d7a2011efc88cb9006cf4e Author: Sven Meier <[email protected]> AuthorDate: Tue Apr 30 18:55:46 2019 +0200 WICKET-6563 allow untouch of page --- .../main/java/org/apache/wicket/Application.java | 2 +- .../src/main/java/org/apache/wicket/Page.java | 8 ++--- .../src/main/java/org/apache/wicket/Session.java | 3 +- .../request/handler/RenderPageRequestHandler.java | 2 +- .../org/apache/wicket/mock/MockPageManager.java | 10 +++++-- .../java/org/apache/wicket/page/IPageManager.java | 29 ++++++++---------- .../apache/wicket/page/PageAccessSynchronizer.java | 14 ++++++--- .../java/org/apache/wicket/page/PageManager.java | 10 +++++-- .../wicket/pageStore/DelegatingPageStore.java | 6 ++++ .../org/apache/wicket/pageStore/IPageStore.java | 9 ++++++ .../apache/wicket/pageStore/RequestPageStore.java | 12 +++++++- .../core/request/mapper/TestMapperContext.java | 2 +- .../DontStoreNotRenderedPageTestCase.java | 4 +-- .../html/TransparentWebMarkupContainerTest.java | 4 +-- .../wicket/page/PageAccessSynchronizerTest.java | 2 +- .../wicket/page/PersistentPageManagerTest.java | 2 +- .../wicket/pageStore/RequestPageStoreTest.java | 34 ++++++++++++++++++---- .../wicket/request/handler/PageProviderTest.java | 10 +++---- .../apache/wicket/examples/frames/BodyFrame.java | 2 +- .../ajax/markup/html/modal/ModalWindow.java | 2 +- 20 files changed, 114 insertions(+), 53 deletions(-) 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 035ee0b..82a046a 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Application.java +++ b/wicket-core/src/main/java/org/apache/wicket/Application.java @@ -1523,7 +1523,7 @@ public abstract class Application implements UnboundListener, IEventSink, IMetad { session = newSession(requestCycle.getRequest(), requestCycle.getResponse()); ThreadContext.setSession(session); - internalGetPageManager().removeAllPages(); + internalGetPageManager().clear(); sessionListeners.onCreated(session); } else diff --git a/wicket-core/src/main/java/org/apache/wicket/Page.java b/wicket-core/src/main/java/org/apache/wicket/Page.java index 7e74a4e..3f0f5b5 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Page.java +++ b/wicket-core/src/main/java/org/apache/wicket/Page.java @@ -287,7 +287,7 @@ public abstract class Page extends MarkupContainer if (isInitialization == false) { - pageManager.addPage(this); + pageManager.touchPage(this); } } } @@ -298,7 +298,7 @@ public abstract class Page extends MarkupContainer super.onInitialize(); final IPageManager pageManager = getSession().getPageManager(); - pageManager.addPage(this); + pageManager.touchPage(this); } /** @@ -825,7 +825,7 @@ public abstract class Page extends MarkupContainer getSession().getSessionStore().getSessionId(RequestCycle.get().getRequest(), true); // Add/touch the response page in the session. - getSession().getPageManager().addPage(this); + getSession().getPageManager().touchPage(this); } if (getApplication().getDebugSettings().isOutputMarkupContainerClassName()) @@ -936,7 +936,7 @@ public abstract class Page extends MarkupContainer setStatelessHint(false); // make sure the page will be available on following request - getSession().getPageManager().addPage(this); + getSession().getPageManager().touchPage(this); return new PageReference(numericId); } diff --git a/wicket-core/src/main/java/org/apache/wicket/Session.java b/wicket-core/src/main/java/org/apache/wicket/Session.java index 60f5676..eb31dfe 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Session.java +++ b/wicket-core/src/main/java/org/apache/wicket/Session.java @@ -38,7 +38,6 @@ import org.apache.wicket.feedback.FeedbackMessages; import org.apache.wicket.feedback.IFeedbackContributor; import org.apache.wicket.page.IPageManager; import org.apache.wicket.page.PageAccessSynchronizer; -import org.apache.wicket.pageStore.IPageStore; import org.apache.wicket.request.Request; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.session.ISessionStore; @@ -292,7 +291,7 @@ public abstract class Session implements IClusterable, IEventSink, IMetadataCont { if (isTemporary() == false) { - getPageManager().removeAllPages(); + getPageManager().clear(); } } diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java index 642d40f..156d420 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RenderPageRequestHandler.java @@ -136,7 +136,7 @@ public class RenderPageRequestHandler if (Session.exists()) { // WICKET-5499 - Session.get().getPageManager().addPage(pageProvider.getPageInstance()); + Session.get().getPageManager().touchPage(pageProvider.getPageInstance()); } } } diff --git a/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java b/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java index 799f7b0..9c5216a 100644 --- a/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java +++ b/wicket-core/src/main/java/org/apache/wicket/mock/MockPageManager.java @@ -56,18 +56,24 @@ public class MockPageManager implements IPageManager } @Override - public void addPage(IManageablePage page) + public void touchPage(IManageablePage page) { pages.put(page.getPageId(), page); } @Override - public void removeAllPages() + public void clear() { pages.clear(); } @Override + public void untouchPage(IManageablePage page) + { + pages.remove(page.getPageId()); + } + + @Override public void 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 8f4cd0e..c675cd9 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 @@ -56,12 +56,21 @@ public interface IPageManager * @param page * page to add */ - void addPage(IManageablePage page); + void touchPage(IManageablePage page); /** - * Remove all pages. + * Marks page as non-changed. + * Could be used in Ajax requests to avoid storing the page if no changes have happened. + * + * @param page + * the page that should <strong>not</strong> be stored in the page stores at the end of the request. */ - void removeAllPages(); + void untouchPage(IManageablePage page); + + /** + * Clear all pages. + */ + void clear(); /** * Detach at end of request. @@ -79,18 +88,4 @@ public interface IPageManager * @return store or <code>null</code> */ IPageStore getPageStore(); - - /** - * @deprecated will be removed in Wicket 10 - */ - default void touchPage(IManageablePage page) { - addPage(page); - } - - /** - * @deprecated will be removed in Wicket 10 - */ - default void clear() { - removeAllPages(); - } } diff --git a/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java b/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java index 8d69fda..a744bb7 100644 --- a/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java +++ b/wicket-core/src/main/java/org/apache/wicket/page/PageAccessSynchronizer.java @@ -280,17 +280,23 @@ public class PageAccessSynchronizer implements Serializable } @Override - public void addPage(IManageablePage page) + public void touchPage(IManageablePage page) { lockPage(page.getPageId()); - manager.addPage(page); + manager.touchPage(page); } @Override - public void removeAllPages() + public void clear() { - manager.removeAllPages(); + manager.clear(); + } + + @Override + public void untouchPage(IManageablePage page) + { + manager.untouchPage(page); } @Override 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 52604cc..642b3c1 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 @@ -62,18 +62,24 @@ public class PageManager implements IPageManager } @Override - public void addPage(IManageablePage page) + public void touchPage(IManageablePage page) { store.addPage(createPageContext(), page); } @Override - public void removeAllPages() + public void clear() { store.removeAllPages(createPageContext()); } @Override + public void untouchPage(IManageablePage page) + { + store.revertPage(createPageContext(), page); + } + + @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 ba256a0..5ec3a79 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 @@ -70,6 +70,12 @@ public abstract class DelegatingPageStore implements IPageStore } @Override + public void revertPage(IPageContext context, IManageablePage page) + { + delegate.revertPage(context, page); + } + + @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 bf2c798..50634a0 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 @@ -74,6 +74,15 @@ public interface IPageStore void removeAllPages(IPageContext context); /** + * Revert adding a page - optional operation. + * + * @param page + * the page that should be reverted + */ + default void revertPage(IPageContext context, IManageablePage page) { + } + + /** * Restores a page from storage. * * @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 0355774..0c0da70 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 @@ -16,6 +16,7 @@ */ package org.apache.wicket.pageStore; +import java.util.ArrayList; import java.util.LinkedList; import org.apache.wicket.MetaDataKey; @@ -78,6 +79,14 @@ public class RequestPageStore extends DelegatingPageStore } @Override + public void revertPage(IPageContext context, IManageablePage page) + { + getRequestData(context).remove(page); + + getDelegate().revertPage(context, page); + } + + @Override public void detach(IPageContext context) { RequestData requestData = getRequestData(context); @@ -125,7 +134,8 @@ public class RequestPageStore extends DelegatingPageStore public Iterable<IManageablePage> pages() { - return pages; + // must work on copy to prevent concurrent modification when page is re-added during detaching + return new ArrayList<>(pages); } public IManageablePage get(int id) diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java index 4129c66..6f3be0f 100644 --- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java @@ -78,7 +78,7 @@ public class TestMapperContext implements IMapperContext pageContext.clearRequest(); MockPage other = new MockPage(); other.setPageId(Integer.MAX_VALUE); - getPageManager().addPage(other); + getPageManager().touchPage(other); pageManager.detach(); } diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java index 857c715..2eb35c7 100644 --- a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java +++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java @@ -58,10 +58,10 @@ public abstract class DontStoreNotRenderedPageTestCase extends WicketTestCase return new MockPageManager() { @Override - public void addPage(IManageablePage page) + public void touchPage(IManageablePage page) { assertFalse(page instanceof PageB, "PageB should not be touched!"); - super.addPage(page); + super.touchPage(page); } }; }; diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java index 39d81c3..f4eeac6 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java @@ -125,10 +125,10 @@ public class TransparentWebMarkupContainerTest extends WicketTestCase return new MockPageManager() { @Override - public void addPage(IManageablePage page) + public void touchPage(IManageablePage page) { page = WicketObjects.cloneObject(page); - super.addPage(page); + super.touchPage(page); } }; } diff --git a/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java b/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java index ad697ed..c686d6a 100644 --- a/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java @@ -323,7 +323,7 @@ class PageAccessSynchronizerTest int pageId = 1; IManageablePage page = new MockPage(pageId); - synchronizedPageManager.addPage(page); + synchronizedPageManager.touchPage(page); synchronizedPageManager.getPage(pageId); PageLock pageLock2 = locks.get(Integer.valueOf(pageId)); assertNotNull(pageLock2); diff --git a/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java b/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java index eea83bf..d10dc4d 100644 --- a/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java @@ -65,7 +65,7 @@ class PersistentPageManagerTest // add a page TestPage toSerializePage = new TestPage(); - pageManager.addPage(toSerializePage); + pageManager.touchPage(toSerializePage); pageManager.detach(); // get the stored SessionEntry 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 ab7a4bc..ff02195 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 @@ -34,7 +34,7 @@ public class RequestPageStoreTest { @Test - void test() + void testAdd() { MockPageStore mockStore = new MockPageStore(); @@ -42,9 +42,9 @@ public class RequestPageStoreTest RequestPageStore store = new RequestPageStore(mockStore); - MockPage page1 = new MockPage(2); - MockPage page2 = new MockPage(3); - MockPage page3 = new MockPage(4); + MockPage page1 = new MockPage(1); + MockPage page2 = new MockPage(2); + MockPage page3 = new MockPage(3); store.addPage(context, page1); store.addPage(context, page2); @@ -58,8 +58,32 @@ public class RequestPageStoreTest 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"); - assertNull(store.getPage(context, 4), "no page in request store"); + } + + @Test + void testUntouch() + { + MockPageStore mockStore = new MockPageStore(); + + MockPageContext context = new MockPageContext(); + + RequestPageStore store = new RequestPageStore(mockStore); + + MockPage page = new MockPage(1); + + store.addPage(context, page); + + store.revertPage(context, page); + + assertTrue(mockStore.getPages().isEmpty(), "no page delegated before detach"); + + store.detach(context); + + assertEquals(0, mockStore.getPages().size(), "untouched page not delegated on detach"); + + assertNull(store.getPage(context, 1), "no page in request store"); } } diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java b/wicket-core/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java index 0bc9eb2..252760e 100644 --- a/wicket-core/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java @@ -65,7 +65,7 @@ class PageProviderTest extends WicketTestCase // storing test page TestMapperContext mapperContext = new TestMapperContext(); - mapperContext.getPageManager().addPage(testPage); + mapperContext.getPageManager().touchPage(testPage); mapperContext.getPageManager().detach(); // by cleaning session cache we make sure of not being testing the same in-memory instance @@ -80,7 +80,7 @@ class PageProviderTest extends WicketTestCase // changing some sate StatefullMockPage providedPage = (StatefullMockPage)pageProvider.getPageInstance(); providedPage.state = newState; - mapperContext.getPageManager().addPage(providedPage); + mapperContext.getPageManager().touchPage(providedPage); mapperContext.getPageManager().detach(); @@ -216,7 +216,7 @@ class PageProviderTest extends WicketTestCase { TestMapperContext mapperContext = new TestMapperContext(); Page page = new TestPage(); - mapperContext.getPageManager().addPage(page); + mapperContext.getPageManager().touchPage(page); mapperContext.getPageManager().detach(); // by cleaning session cache we make sure of not being testing the same in-memory instance @@ -239,7 +239,7 @@ class PageProviderTest extends WicketTestCase { TestMapperContext mapperContext = new TestMapperContext(); Page page = new TestPage(); - mapperContext.getPageManager().addPage(page); + mapperContext.getPageManager().touchPage(page); mapperContext.getPageManager().detach(); // by cleaning session cache we make sure of not being testing the same in-memory instance @@ -256,7 +256,7 @@ class PageProviderTest extends WicketTestCase { TestMapperContext mapperContext = new TestMapperContext(); Page page = new TestPage(); - mapperContext.getPageManager().addPage(page); + mapperContext.getPageManager().touchPage(page); mapperContext.getPageManager().detach(); PageProvider pageProvider = new PageProvider(page.getPageId(), page.getRenderCount()); diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/frames/BodyFrame.java b/wicket-examples/src/main/java/org/apache/wicket/examples/frames/BodyFrame.java index f557a59..4939eb9 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/frames/BodyFrame.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/frames/BodyFrame.java @@ -41,7 +41,7 @@ public class BodyFrame extends WebPage { // create a new page instance, passing this 'master page' as an argument LeftFrame leftFrame = new LeftFrame(this); - getSession().getPageManager().addPage(leftFrame); + getSession().getPageManager().touchPage(leftFrame); // get the url to that page IRequestHandler leftFrameHandler = new RenderPageRequestHandler(new PageProvider(leftFrame)); // and create a simple component that modifies it's src attribute to diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java index 8302650..808a9e8 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java @@ -1044,7 +1044,7 @@ public class ModalWindow extends Panel CharSequence pageUrl; RequestCycle requestCycle = RequestCycle.get(); - page.getSession().getPageManager().addPage(page); + page.getSession().getPageManager().touchPage(page); if (page.isPageStateless()) { pageUrl = requestCycle.urlFor(page.getClass(), page.getPageParameters());
