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
The following commit(s) were added to refs/heads/master by this push: new 8df3528 WICKET-6563 add CachingPageStore 8df3528 is described below commit 8df3528dc44a08b7d375c20e764a3664cd6a5f30 Author: Sven Meier <svenme...@apache.org> AuthorDate: Fri Mar 27 10:13:13 2020 +0100 WICKET-6563 add CachingPageStore --- .../apache/wicket/DefaultPageManagerProvider.java | 9 +- .../apache/wicket/pageStore/CachingPageStore.java | 109 +++++++++++++++++++++ .../wicket/pageStore/InSessionPageStore.java | 82 ++++++---------- .../wicket/DefaultPageManagerProviderTest.java | 6 +- .../core/request/mapper/TestMapperContext.java | 7 +- .../wicket/page/PersistentPageManagerTest.java | 2 +- .../wicket/pageStore/InSessionPageStoreTest.java | 18 +++- .../wicket/versioning/PageVersioningTest.java | 4 +- 8 files changed, 174 insertions(+), 63 deletions(-) diff --git a/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java b/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java index e128266..540b1b3 100644 --- a/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java +++ b/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java @@ -21,6 +21,7 @@ import java.io.File; import org.apache.wicket.page.IPageManager; import org.apache.wicket.page.PageManager; import org.apache.wicket.pageStore.AsynchronousPageStore; +import org.apache.wicket.pageStore.CachingPageStore; import org.apache.wicket.pageStore.CryptingPageStore; import org.apache.wicket.pageStore.DiskPageStore; import org.apache.wicket.pageStore.FilePageStore; @@ -103,7 +104,7 @@ public class DefaultPageManagerProvider implements IPageManagerProvider store = newAsynchronousStore(store); - store = newSessionStore(store); + store = newCachingStore(store); store = newRequestStore(store); @@ -125,7 +126,7 @@ public class DefaultPageManagerProvider implements IPageManagerProvider } /** - * Cache pages in the request until it is finished. + * Keep pages in the request until it is finished. * * @see RequestPageStore */ @@ -139,9 +140,9 @@ public class DefaultPageManagerProvider implements IPageManagerProvider * * @see InSessionPageStore */ - protected IPageStore newSessionStore(IPageStore pageStore) + protected IPageStore newCachingStore(IPageStore pageStore) { - return new InSessionPageStore(pageStore, 1, getSerializer()); + return new CachingPageStore(pageStore, new InSessionPageStore(1, getSerializer())); } /** diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/CachingPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/CachingPageStore.java new file mode 100644 index 0000000..d4eff87 --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/CachingPageStore.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.pageStore; + +import org.apache.wicket.page.IManageablePage; + +/** + * A store of pages that uses an {@link IPageStore} as a cache in front of another store to delegate to. + */ +public class CachingPageStore extends DelegatingPageStore +{ + + private IPageStore cache; + + /** + * Constructor. + * @param delegate store to delegate to + * @param cache store to use as cache + */ + public CachingPageStore(IPageStore delegate, IPageStore cache) + { + super(delegate); + + this.cache = cache; + } + + /** + * Get the store used a cache. + * + * @return store + */ + public IPageStore getCache() + { + return cache; + } + + @Override + public IManageablePage getPage(IPageContext context, int id) + { + IManageablePage page = cache.getPage(context, id); + if (page != null) { + return page; + } + + return getDelegate().getPage(context, id); + } + + @Override + public void addPage(IPageContext context, IManageablePage page) + { + cache.addPage(context, page); + + getDelegate().addPage(context, page); + } + + @Override + public void removePage(IPageContext context, IManageablePage page) + { + cache.removePage(context, page); + + getDelegate().removePage(context, page); + } + + @Override + public void removeAllPages(IPageContext context) + { + cache.removeAllPages(context); + + getDelegate().removeAllPages(context); + } + + @Override + public void revertPage(IPageContext context, IManageablePage page) + { + cache.revertPage(context, page); + + getDelegate().revertPage(context, page); + } + + @Override + public void detach(IPageContext context) + { + cache.detach(context); + + getDelegate().detach(context); + } + + @Override + public void destroy() + { + cache.destroy(); + + getDelegate().destroy(); + } +} \ No newline at end of file diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java index 3c363fd..a1beb4d 100644 --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java @@ -26,7 +26,6 @@ import java.util.function.Supplier; import javax.servlet.http.HttpSession; -import org.apache.wicket.DefaultPageManagerProvider; import org.apache.wicket.MetaDataKey; import org.apache.wicket.Session; import org.apache.wicket.WicketRuntimeException; @@ -39,27 +38,16 @@ import org.apache.wicket.util.lang.Classes; /** * A store keeping a configurable maximum of pages in the session. * <p> - * This store can be used in two different ways: - * <ul> - * <li>as a fast cache in front of a persistent store (as used by {@link DefaultPageManagerProvider})</li> - * <li>as an application's persistent store of serialized pages in the session</li> - * </ul> + * Note: see {@link #getKey()} for using more than once instance in an application */ -public class InSessionPageStore extends DelegatingPageStore +public class InSessionPageStore implements IPageStore { - private static final MetaDataKey<SessionData> KEY_CACHE = new MetaDataKey<>() + private static final MetaDataKey<SessionData> KEY = new MetaDataKey<>() { private static final long serialVersionUID = 1L; }; - private static final MetaDataKey<SessionData> KEY_PERSISTENT = new MetaDataKey<>() - { - private static final long serialVersionUID = 1L; - }; - - private final MetaDataKey<SessionData> key; - private final ISerializer serializer; private final Supplier<SessionData> dataCreator; @@ -75,7 +63,7 @@ public class InSessionPageStore extends DelegatingPageStore */ public InSessionPageStore(int maxPages) { - this(new NoopPageStore(), null, KEY_PERSISTENT, () -> new CountLimitedData(maxPages)); + this(null, () -> new CountLimitedData(maxPages)); } /** @@ -89,23 +77,7 @@ public class InSessionPageStore extends DelegatingPageStore */ public InSessionPageStore(Bytes maxBytes) { - this(new NoopPageStore(), null, KEY_PERSISTENT, () -> new SizeLimitedData(maxBytes)); - } - - /** - * Keep a cache of {@code maxPages} in each session. - * <p> - * If the container serializes sessions to disk, any non-{@code SerializedPage} added to this - * store will be dropped. - * - * @param delegate - * store to delegate to - * @param maxPages - * maximum pages to keep in session - */ - public InSessionPageStore(IPageStore delegate, int maxPages) - { - this(delegate, maxPages, null); + this(null, () -> new SizeLimitedData(maxBytes)); } /** @@ -114,26 +86,20 @@ public class InSessionPageStore extends DelegatingPageStore * If the container serializes sessions to disk, any non-{@code SerializedPage} added to this * store will be automatically serialized. * - * @param delegate - * store to delegate to * @param maxPages * maximum pages to keep in session * @param serializer - * optional serializer used only in case session serialization + * optional serializer used only in case session serialization */ - public InSessionPageStore(IPageStore delegate, int maxPages, ISerializer serializer) + public InSessionPageStore(int maxPages, ISerializer serializer) { - this(delegate, serializer, KEY_CACHE, () -> new CountLimitedData(maxPages)); + this(serializer, () -> new CountLimitedData(maxPages)); } - private InSessionPageStore(IPageStore delegate, ISerializer serializer, MetaDataKey<SessionData> key, Supplier<SessionData> dataCreator) + private InSessionPageStore(ISerializer serializer, Supplier<SessionData> dataCreator) { - super(delegate); - this.serializer = serializer; - this.key = key; - this.dataCreator = dataCreator; } @@ -150,7 +116,7 @@ public class InSessionPageStore extends DelegatingPageStore } } - return getDelegate().getPage(context, id); + return null; } @Override @@ -159,8 +125,6 @@ public class InSessionPageStore extends DelegatingPageStore SessionData data = getSessionData(context, true); data.add(page); - - getDelegate().addPage(context, page); } @Override @@ -171,8 +135,6 @@ public class InSessionPageStore extends DelegatingPageStore { data.remove(page.getPageId()); } - - getDelegate().removePage(context, page); } @Override @@ -183,13 +145,11 @@ public class InSessionPageStore extends DelegatingPageStore { data.removeAll(); } - - getDelegate().removeAllPages(context); } private SessionData getSessionData(IPageContext context, boolean create) { - SessionData data = context.getSessionData(key, () -> { + SessionData data = context.getSessionData(getKey(), () -> { if (create) { return dataCreator.get(); @@ -210,10 +170,22 @@ public class InSessionPageStore extends DelegatingPageStore } /** + * Session data is stored under a {@link MetaDataKey}. + * <p> + * In cases where more than one instance is used in an application (e.g. as a fast cache + * <em>and</em> a persistent store of serialized pages in the session), this method has to be + * overridden to provide a separate key for each instance. + */ + protected MetaDataKey<SessionData> getKey() + { + return KEY; + } + + /** * Data kept in the {@link Session}, might get serialized along with its containing * {@link HttpSession}. */ - abstract static class SessionData implements Serializable + protected abstract static class SessionData implements Serializable { transient ISerializer serializer; @@ -402,4 +374,10 @@ public class InSessionPageStore extends DelegatingPageStore size = 0; } } + + @Override + public boolean supportsVersioning() + { + return false; + } } diff --git a/wicket-core/src/test/java/org/apache/wicket/DefaultPageManagerProviderTest.java b/wicket-core/src/test/java/org/apache/wicket/DefaultPageManagerProviderTest.java index 5adad4d..7696d9f 100644 --- a/wicket-core/src/test/java/org/apache/wicket/DefaultPageManagerProviderTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/DefaultPageManagerProviderTest.java @@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import org.apache.wicket.page.IPageManager; import org.apache.wicket.pageStore.AsynchronousPageStore; +import org.apache.wicket.pageStore.CachingPageStore; import org.apache.wicket.pageStore.DiskPageStore; import org.apache.wicket.pageStore.InSessionPageStore; import org.apache.wicket.pageStore.RequestPageStore; @@ -42,8 +43,9 @@ class DefaultPageManagerProviderTest extends WicketTestCase IPageManager manager = new DefaultPageManagerProvider(tester.getApplication()).get(); RequestPageStore request = (RequestPageStore)manager.getPageStore(); - InSessionPageStore session = (InSessionPageStore)request.getDelegate(); - AsynchronousPageStore asynchronous = (AsynchronousPageStore)session.getDelegate(); + CachingPageStore caching = (CachingPageStore)request.getDelegate(); + InSessionPageStore session = (InSessionPageStore)caching.getCache(); + AsynchronousPageStore asynchronous = (AsynchronousPageStore)caching.getDelegate(); SerializingPageStore serializing = (SerializingPageStore)asynchronous.getDelegate(); DiskPageStore disk = (DiskPageStore)serializing.getDelegate(); 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 6f3be0f..1f163a2 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 @@ -23,7 +23,9 @@ import org.apache.wicket.markup.MarkupParser; import org.apache.wicket.mock.MockPageContext; import org.apache.wicket.page.IPageManager; import org.apache.wicket.page.PageManager; +import org.apache.wicket.pageStore.CachingPageStore; import org.apache.wicket.pageStore.IPageContext; +import org.apache.wicket.pageStore.IPageStore; import org.apache.wicket.pageStore.InMemoryPageStore; import org.apache.wicket.pageStore.InSessionPageStore; import org.apache.wicket.pageStore.RequestPageStore; @@ -44,7 +46,7 @@ public class TestMapperContext implements IMapperContext private static final String APP_NAME = "test_app"; private static int count; - InSessionPageStore pageStore; + IPageStore pageStore; MockPageContext pageContext; IPageManager pageManager; private String appName; @@ -60,7 +62,8 @@ public class TestMapperContext implements IMapperContext pageContext = new MockPageContext(); InMemoryPageStore inMemoryPageStore = new InMemoryPageStore(appName, Integer.MAX_VALUE); - pageStore = new InSessionPageStore(inMemoryPageStore, 4, new JavaSerializer(appName)); + InSessionPageStore inSessionPageStore = new InSessionPageStore(4, new JavaSerializer(appName)); + pageStore = new CachingPageStore(inMemoryPageStore, inSessionPageStore); pageManager = new PageManager(new RequestPageStore(pageStore)) { @Override protected IPageContext createPageContext() 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 77bb7f0..300f18b 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 @@ -105,7 +105,7 @@ class PersistentPageManagerTest */ private IPageManager createPageManager(String appName, AtomicReference<Object> sessionData) { - IPageStore store = new InSessionPageStore(new NoopPageStore(), Integer.MAX_VALUE, new JavaSerializer(APP_NAME)); + IPageStore store = new InSessionPageStore(Integer.MAX_VALUE, new JavaSerializer(APP_NAME)); return new PageManager(store) { @Override diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/InSessionPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/InSessionPageStoreTest.java index 301a33c..6bd00a5 100644 --- a/wicket-core/src/test/java/org/apache/wicket/pageStore/InSessionPageStoreTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/InSessionPageStoreTest.java @@ -16,15 +16,31 @@ */ package org.apache.wicket.pageStore; +import org.apache.wicket.MetaDataKey; +import org.apache.wicket.pageStore.InSessionPageStore.SessionData; + /** * Test for {@link InSessionPageStore}. */ public class InSessionPageStoreTest extends AbstractPageStoreTest { + + private static final MetaDataKey<SessionData> KEY = new MetaDataKey<SessionData>() + { + private static final long serialVersionUID = 1L; + }; + @Override protected IPageStore createPageStore(int maxEntries) { - return new InSessionPageStore(new NoopPageStore(), maxEntries); + return new InSessionPageStore(maxEntries) { + + @Override + protected MetaDataKey<SessionData> getKey() + { + return KEY; + } + }; } } diff --git a/wicket-core/src/test/java/org/apache/wicket/versioning/PageVersioningTest.java b/wicket-core/src/test/java/org/apache/wicket/versioning/PageVersioningTest.java index 3842780..e882bab 100644 --- a/wicket-core/src/test/java/org/apache/wicket/versioning/PageVersioningTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/versioning/PageVersioningTest.java @@ -23,6 +23,7 @@ import org.apache.wicket.IPageManagerProvider; import org.apache.wicket.Page; import org.apache.wicket.page.IPageManager; import org.apache.wicket.page.PageManager; +import org.apache.wicket.pageStore.CachingPageStore; import org.apache.wicket.pageStore.IPageStore; import org.apache.wicket.pageStore.InMemoryPageStore; import org.apache.wicket.pageStore.InSessionPageStore; @@ -62,7 +63,8 @@ class PageVersioningTest { InMemoryPageStore inMemory = new InMemoryPageStore("test", Integer.MAX_VALUE); SerializingPageStore serializing = new SerializingPageStore(inMemory, new JavaSerializer("test")); - final IPageStore store = new InSessionPageStore(serializing, Integer.MAX_VALUE); + InSessionPageStore session = new InSessionPageStore(Integer.MAX_VALUE); + final IPageStore store = new CachingPageStore(serializing, session); return new PageManager(store); }; }