Repository: wicket Updated Branches: refs/heads/WICKET-6563 a3604f7c3 -> ad1f9b88c
WICKET-6563 javadoc and test for SerializingPageStore; keep page type in serializedpage Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ad1f9b88 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ad1f9b88 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ad1f9b88 Branch: refs/heads/WICKET-6563 Commit: ad1f9b88ce8412e2b8eec5de72073b9688deb3bb Parents: a3604f7 Author: Sven Meier <[email protected]> Authored: Tue Jul 3 23:52:10 2018 +0200 Committer: Sven Meier <[email protected]> Committed: Tue Jul 3 23:52:10 2018 +0200 ---------------------------------------------------------------------- .../java/org/apache/wicket/Application.java | 5 +- .../wicket/DefaultPageManagerProvider.java | 18 +++++-- .../wicket/pageStore/InMemoryPageStore.java | 8 +-- .../wicket/pageStore/InSessionPageStore.java | 2 +- .../apache/wicket/pageStore/SerializedPage.java | 14 +++++- .../wicket/pageStore/SerializingPageStore.java | 6 +-- .../pageStore/SerializingPageStoreTest.java | 52 ++++++++++++++++++++ 7 files changed, 88 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/ad1f9b88/wicket-core/src/main/java/org/apache/wicket/Application.java ---------------------------------------------------------------------- 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 64bf7ac..e1a0fb8 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Application.java +++ b/wicket-core/src/main/java/org/apache/wicket/Application.java @@ -56,8 +56,6 @@ import org.apache.wicket.markup.resolver.HtmlHeaderResolver; import org.apache.wicket.markup.resolver.WicketContainerResolver; import org.apache.wicket.markup.resolver.WicketMessageResolver; import org.apache.wicket.page.IPageManager; -import org.apache.wicket.pageStore.DefaultPageContext; -import org.apache.wicket.pageStore.IPageContext; import org.apache.wicket.pageStore.IPageStore; import org.apache.wicket.protocol.http.IRequestLogger; import org.apache.wicket.protocol.http.RequestLogger; @@ -1344,8 +1342,11 @@ public abstract class Application implements UnboundListener, IEventSink } /** + * Set the provider of an {@link IPageManager}. * * @param provider + * + * @see DefaultPageManagerProvider */ public final Application setPageManagerProvider(final IPageManagerProvider provider) { http://git-wip-us.apache.org/repos/asf/wicket/blob/ad1f9b88/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java ---------------------------------------------------------------------- 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 0539355..308b0fd 100644 --- a/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java +++ b/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java @@ -30,6 +30,7 @@ import org.apache.wicket.pageStore.NoopPageStore; import org.apache.wicket.pageStore.RequestPageStore; import org.apache.wicket.pageStore.SerializingPageStore; import org.apache.wicket.serialize.ISerializer; +import org.apache.wicket.settings.FrameworkSettings; import org.apache.wicket.settings.StoreSettings; import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.lang.Bytes; @@ -47,14 +48,17 @@ import org.apache.wicket.util.lang.Bytes; * <li>{@link RequestPageStore} caching pages until end of the request</li> * <li>{@link InSessionPageStore} keeping the last accessed page in the session</li> * <li>{@link SerializingPageStore} serializing all pages (so they are available for back-button </li> - * <li>{@link InMemoryPageStore} keeping all pages</li> + * <li>{@link InMemoryPageStore} keeping all pages in memory</li> * </ul> - * ... or if all pages should be kept in the session only without any serialization (no back-button support) + * ... or if all pages should be kept in the session only, without any serialization (no back-button support though) * <ul> * <li>{@link RequestPageStore} caching pages until end of the request</li> * <li>{@link InSessionPageStore} keeping a limited count of pages in the session, e.g. 10</li> * <li>{@link NoopPageStore} discarding all exceeding pages</li> * </ul> + * For back-button support <em>at least one</em> store in the chain must create copies of added pages (usually through serialization), + * otherwise any following request will work on an identical page instance and the previous state of page is no longer accessible. + * <p> * Other stores be may inserted ad libitum, e.g. * <ul> * <li>{@link GroupingPageStore} groups pages with their own maximum page limit</li> @@ -91,8 +95,12 @@ public class DefaultPageManagerProvider implements IPageManagerProvider /** * Get the {@link ISerializer} to use for serializing of pages. + * <p> + * By default the serializer of the applications {@link FrameworkSettings}. * * @return how to serialize pages if needed for any {@link IPageStore} + * + * @see FrameworkSettings#getSerializer() */ protected ISerializer getSerializer() { @@ -100,7 +108,7 @@ public class DefaultPageManagerProvider implements IPageManagerProvider } /** - * Keep pages in the request until it is finished. + * Cache pages in the request until it is finished. * * @see RequestPageStore */ @@ -110,7 +118,7 @@ public class DefaultPageManagerProvider implements IPageManagerProvider } /** - * After requests keep pages in the session. + * Cache last page in the session for fast access. * * @see InSessionPageStore */ @@ -139,7 +147,7 @@ public class DefaultPageManagerProvider implements IPageManagerProvider } /** - * Keep pages persistent on disk. + * Keep persistent copies of all pages, by default on disk. * * @see DiskPageStore * @see StoreSettings#getMaxSizePerSession() http://git-wip-us.apache.org/repos/asf/wicket/blob/ad1f9b88/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java index fc11901..c3e352d 100644 --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java @@ -179,7 +179,7 @@ public class InMemoryPageStore implements IPersistentPageStore synchronized (data) { return StreamSupport.stream(data.spliterator(), false) - .map(page -> new MermoryPersistedPage(page, getSize(page))) + .map(page -> new PersistedPage(page, getSize(page))) .collect(Collectors.toList()); } } @@ -315,7 +315,7 @@ public class InMemoryPageStore implements IPersistentPageStore } } - private static class MermoryPersistedPage implements IPersistedPage + private static class PersistedPage implements IPersistedPage { private final int id; @@ -324,10 +324,10 @@ public class InMemoryPageStore implements IPersistentPageStore private final long size; - public MermoryPersistedPage(IManageablePage page, long size) + public PersistedPage(IManageablePage page, long size) { this.id = page.getPageId(); - this.type = page.getClass().getName(); + this.type = page instanceof SerializedPage ? ((SerializedPage)page).getPageType() : page.getClass().getName(); this.size = size; } http://git-wip-us.apache.org/repos/asf/wicket/blob/ad1f9b88/wicket-core/src/main/java/org/apache/wicket/pageStore/InSessionPageStore.java ---------------------------------------------------------------------- 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 e3d3e07..8af66d6 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 @@ -247,7 +247,7 @@ public class InSessionPageStore extends DelegatingPageStore { throw new IllegalStateException("SessionData#init() was not called"); } - pages.set(p, new SerializedPage(page.getPageId(), serializer.serialize(page))); + pages.set(p, new SerializedPage(page.getPageId(), page.getClass().getName(), serializer.serialize(page))); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/ad1f9b88/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializedPage.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializedPage.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializedPage.java index 86291d9..8ebe559 100644 --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializedPage.java +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializedPage.java @@ -22,19 +22,24 @@ import org.apache.wicket.util.lang.Args; /** * A wrapper around a serialized page. * <p> - * {@link IPageStore} might choose to use this representation of a page internally, + * An {@link IPageStore} might choose to use this representation of a page internally, * or accept it in {@link IPageStore#addPage(IPageContext, IManageablePage)}. + * + * @see SerializingPageStore */ class SerializedPage implements IManageablePage { private final int pageId; + + private final String pageType; private final byte[] data; - public SerializedPage(int pageId, byte[] data) + public SerializedPage(int pageId, String pageType, byte[] data) { this.pageId = pageId; + this.pageType = pageType; this.data = Args.notNull(data, "data"); } @@ -50,6 +55,11 @@ class SerializedPage implements IManageablePage return pageId; } + public String getPageType() + { + return pageType; + } + public byte[] getData() { return data; http://git-wip-us.apache.org/repos/asf/wicket/blob/ad1f9b88/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java index 3b5ac3a..eb754f6 100644 --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/SerializingPageStore.java @@ -45,18 +45,18 @@ public class SerializingPageStore extends DelegatingPageStore public IManageablePage getPage(IPageContext context, int id) { IManageablePage page = super.getPage(context, id); + if (page instanceof SerializedPage) { page = (IManageablePage)serializer.deserialize(((SerializedPage)page).getData()); } - - return super.getPage(context, id); + return page; } @Override public void addPage(IPageContext context, IManageablePage page) { if (page instanceof SerializedPage == false) { - page = new SerializedPage(page.getPageId(), serializer.serialize(page)); + page = new SerializedPage(page.getPageId(), page.getClass().getName(), serializer.serialize(page)); } super.addPage(context, page); } http://git-wip-us.apache.org/repos/asf/wicket/blob/ad1f9b88/wicket-core/src/test/java/org/apache/wicket/pageStore/SerializingPageStoreTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/SerializingPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/SerializingPageStoreTest.java new file mode 100644 index 0000000..5d50f00 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/SerializingPageStoreTest.java @@ -0,0 +1,52 @@ +/* + * 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 static org.junit.Assert.assertEquals; + +import org.apache.wicket.MockPage; +import org.apache.wicket.mock.MockPageStore; +import org.apache.wicket.page.IManageablePage; +import org.apache.wicket.serialize.java.JavaSerializer; +import org.junit.Test; + +/** + * Test for {@link SerializingPageStore}. + */ +public class SerializingPageStoreTest +{ + + @Test + public void test() + { + DummyPageContext context = new DummyPageContext(); + + MockPageStore mockStore = new MockPageStore(); + + IManageablePage original = new MockPage(1); + + SerializingPageStore store = new SerializingPageStore(mockStore, new JavaSerializer("test")); + + store.addPage(context, original); + + SerializedPage serialized = (SerializedPage)mockStore.getPage(context, 1); + assertEquals("page was serialized", 1, serialized.getPageId()); + + MockPage deserialized = (MockPage)store.getPage(context, 1); + assertEquals("page was deserialized", 1, deserialized.getPageId()); + } +}
