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);
                                };
                        }

Reply via email to