You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/03/10 16:56:57 UTC

[2/3] git commit: WICKET-5527 Inefficient DefaultPageStore.SerializedPagesCache

WICKET-5527 Inefficient DefaultPageStore.SerializedPagesCache

Extract AbstractCachingPageStore - an AbstractPageStore that uses SecondLevelPageCache to manage the caching


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/583e03cf
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/583e03cf
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/583e03cf

Branch: refs/heads/5527-inefficient-DefaultDataStore
Commit: 583e03cf8f282c6c02d21c614594eaf1eecc15ae
Parents: 65bd82f
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon Mar 10 17:45:16 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon Mar 10 17:45:16 2014 +0200

----------------------------------------------------------------------
 .../pageStore/AbstractCachingPageStore.java     | 105 +++++++++++++++++++
 .../wicket/pageStore/AbstractPageStore.java     |   4 +-
 .../wicket/pageStore/DefaultPageStore.java      |  61 +++--------
 .../wicket/pageStore/PerSessionPageStore.java   |  58 ++--------
 .../wicket/pageStore/SecondLevelPageCache.java  |   2 +
 5 files changed, 135 insertions(+), 95 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/583e03cf/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractCachingPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractCachingPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractCachingPageStore.java
new file mode 100644
index 0000000..86b8d82
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractCachingPageStore.java
@@ -0,0 +1,105 @@
+/*
+ * 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;
+import org.apache.wicket.serialize.ISerializer;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * An abstract {@link org.apache.wicket.pageStore.IPageStore} that uses
+ * {@link org.apache.wicket.pageStore.SecondLevelPageCache} to cache the stored pages in memory
+ *
+ * @param <P>
+ *          The type of the page to be stored
+ */
+public abstract class AbstractCachingPageStore<P> extends AbstractPageStore
+{
+	/**
+	 * The cache implementation
+	 */
+	protected final SecondLevelPageCache<String, Integer, P> pagesCache;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param pageSerializer
+	 *          The serializer that will convert pages to/from byte[]
+	 * @param dataStore
+	 *          The third level page cache
+	 * @param pagesCache
+	 *          The cache to use as a second level store
+	 */
+	protected AbstractCachingPageStore(ISerializer pageSerializer, IDataStore dataStore,
+	                                   SecondLevelPageCache<String, Integer, P> pagesCache)
+	{
+		super(pageSerializer, dataStore);
+
+		this.pagesCache = Args.notNull(pagesCache, "pagesCache");
+	}
+
+	@Override
+	public IManageablePage getPage(final String sessionId, final int pageId)
+	{
+		P fromCache = pagesCache.getPage(sessionId, pageId);
+		if (fromCache != null)
+		{
+			return convertToPage(fromCache);
+		}
+
+		byte[] data = getPageData(sessionId, pageId);
+		if (data != null)
+		{
+			return deserializePage(data);
+		}
+		return null;
+	}
+
+	@Override
+	public void removePage(final String sessionId, final int pageId)
+	{
+		pagesCache.removePage(sessionId, pageId);
+		removePageData(sessionId, pageId);
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public void storePage(final String sessionId, final IManageablePage page)
+	{
+		byte[] data = serializePage(page);
+		if (data != null)
+		{
+			int pageId = page.getPageId();
+			pagesCache.storePage(sessionId, pageId,  (P) page);
+			storePageData(sessionId, pageId, data);
+		}
+	}
+
+	@Override
+	public void unbind(final String sessionId)
+	{
+		removePageData(sessionId);
+		pagesCache.removePages(sessionId);
+	}
+
+	@Override
+	public void destroy()
+	{
+		super.destroy();
+		pagesCache.destroy();
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/583e03cf/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java
index 16b1cbc..07f97d5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPageStore.java
@@ -41,7 +41,7 @@ public abstract class AbstractPageStore implements IPageStore
 	protected AbstractPageStore(final ISerializer pageSerializer, final IDataStore dataStore)
 	{
 		Args.notNull(pageSerializer, "pageSerializer");
-		Args.notNull(dataStore, "DataStore");
+		Args.notNull(dataStore, "dataStore");
 
 		this.pageSerializer = pageSerializer;
 		this.dataStore = dataStore;
@@ -149,6 +149,6 @@ public abstract class AbstractPageStore implements IPageStore
 	{
 		Args.notNull(data, "data");
 
-		return (IManageablePage)pageSerializer.deserialize(data);
+		return (IManageablePage) pageSerializer.deserialize(data);
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/583e03cf/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java
index b27e04f..393fac3 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageStore.java
@@ -34,12 +34,10 @@ import org.slf4j.LoggerFactory;
  * direction when loading {@link SerializedPage} from the data store.
  * 
  */
-public class DefaultPageStore extends AbstractPageStore
+public class DefaultPageStore extends AbstractCachingPageStore<DefaultPageStore.SerializedPage>
 {
 	private static final Logger LOG = LoggerFactory.getLogger(DefaultPageStore.class);
 
-	private final SerializedPagesCache serializedPagesCache;
-
 	/**
 	 * Construct.
 	 * 
@@ -54,53 +52,22 @@ public class DefaultPageStore extends AbstractPageStore
 	public DefaultPageStore(final ISerializer pageSerializer, final IDataStore dataStore,
 		final int cacheSize)
 	{
-		super(pageSerializer, dataStore);
-		serializedPagesCache = new SerializedPagesCache(cacheSize);
-	}
-
-	@Override
-	public IManageablePage getPage(final String sessionId, final int id)
-	{
-		SerializedPage fromCache = serializedPagesCache.getPage(sessionId, id);
-		if (fromCache != null && fromCache.data != null)
-		{
-			return deserializePage(fromCache.data);
-		}
-
-		byte[] data = getPageData(sessionId, id);
-		if (data != null)
-		{
-			return deserializePage(data);
-		}
-		return null;
-	}
-
-	@Override
-	public void removePage(final String sessionId, final int id)
-	{
-		serializedPagesCache.removePage(sessionId, id);
-		removePageData(sessionId, id);
+		super(pageSerializer, dataStore, new SerializedPagesCache(cacheSize));
 	}
 
 	@Override
 	public void storePage(final String sessionId, final IManageablePage page)
 	{
-		SerializedPage serialized = serializePage(sessionId, page);
+		SerializedPage serialized = createSerializedPage(sessionId, page);
 		if (serialized != null)
 		{
-			serializedPagesCache.storePage(sessionId, page.getPageId(), serialized);
-			storePageData(sessionId, serialized.getPageId(), serialized.getData());
+			int pageId = page.getPageId();
+			pagesCache.storePage(sessionId, pageId, serialized);
+			storePageData(sessionId, pageId, serialized.getData());
 		}
 	}
 
 	@Override
-	public void unbind(final String sessionId)
-	{
-		removePageData(sessionId);
-		serializedPagesCache.removePages(sessionId);
-	}
-
-	@Override
 	public IManageablePage convertToPage(final Object object)
 	{
 		if (object == null)
@@ -140,7 +107,7 @@ public class DefaultPageStore extends AbstractPageStore
 	 */
 	private SerializedPage restoreStrippedSerializedPage(final SerializedPage serializedPage)
 	{
-		SerializedPage result = serializedPagesCache.getPage(serializedPage.getSessionId(),
+		SerializedPage result = pagesCache.getPage(serializedPage.getSessionId(),
 			serializedPage.getPageId());
 		if (result != null)
 		{
@@ -164,13 +131,13 @@ public class DefaultPageStore extends AbstractPageStore
 		if (page instanceof IManageablePage)
 		{
 			IManageablePage _page = (IManageablePage)page;
-			result = serializedPagesCache.getPage(sessionId, _page.getPageId());
+			result = pagesCache.getPage(sessionId, _page.getPageId());
 			if (result == null)
 			{
-				result = serializePage(sessionId, _page);
+				result = createSerializedPage(sessionId, _page);
 				if (result != null)
 				{
-					serializedPagesCache.storePage(sessionId, _page.getPageId(), result);
+					pagesCache.storePage(sessionId, _page.getPageId(), result);
 				}
 			}
 		}
@@ -304,7 +271,7 @@ public class DefaultPageStore extends AbstractPageStore
 	 * @param page
 	 * @return the serialized page information
 	 */
-	protected SerializedPage serializePage(final String sessionId, final IManageablePage page)
+	protected SerializedPage createSerializedPage(final String sessionId, final IManageablePage page)
 	{
 		Args.notNull(sessionId, "sessionId");
 		Args.notNull(page, "page");
@@ -478,5 +445,11 @@ public class DefaultPageStore extends AbstractPageStore
 				}
 			}
 		}
+
+		@Override
+		public void destroy()
+		{
+			cache.clear();
+		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/583e03cf/wicket-core/src/main/java/org/apache/wicket/pageStore/PerSessionPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/PerSessionPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/PerSessionPageStore.java
index ac57ab9..f1d5d9a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/PerSessionPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/PerSessionPageStore.java
@@ -25,16 +25,13 @@ import java.util.concurrent.ConcurrentSkipListMap;
 import org.apache.wicket.page.IManageablePage;
 import org.apache.wicket.serialize.ISerializer;
 import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.lang.Objects;
 import org.apache.wicket.util.time.Time;
 
 /**
  *
  */
-public class PerSessionPageStore extends AbstractPageStore
+public class PerSessionPageStore extends AbstractCachingPageStore<IManageablePage>
 {
-	private final SecondLevelPageCache<String, Integer, IManageablePage> pagesCache;
-
 	/**
 	 * Construct.
 	 *
@@ -49,50 +46,7 @@ public class PerSessionPageStore extends AbstractPageStore
 	public PerSessionPageStore(final ISerializer pageSerializer, final IDataStore dataStore,
 	                           final int cacheSize)
 	{
-		super(pageSerializer, dataStore);
-		this.pagesCache = new PagesCache(cacheSize);
-	}
-
-	@Override
-	public IManageablePage getPage(final String sessionId, final int id)
-	{
-		IManageablePage fromCache = pagesCache.getPage(sessionId, id);
-		if (fromCache != null)
-		{
-			return fromCache;
-		}
-
-		byte[] data = getPageData(sessionId, id);
-		if (data != null)
-		{
-			return deserializePage(data);
-		}
-		return null;
-	}
-
-	@Override
-	public void removePage(final String sessionId, final int id)
-	{
-		pagesCache.removePage(sessionId, id);
-		removePageData(sessionId, id);
-	}
-
-	@Override
-	public void storePage(final String sessionId, final IManageablePage page)
-	{
-		byte[] data = serializePage(page);
-		if (data != null)
-		{
-			pagesCache.storePage(sessionId, page.getPageId(), page);
-			storePageData(sessionId, page.getPageId(), data);
-		}
-	}
-
-	@Override
-	public void unbind(final String sessionId)
-	{
-		removePageData(sessionId);
-		pagesCache.removePages(sessionId);
+		super(pageSerializer, dataStore, new PagesCache(cacheSize));
 	}
 
 	@Override
@@ -166,7 +120,7 @@ public class PerSessionPageStore extends AbstractPageStore
 			@Override
 			public int compare(PageValue p1, PageValue p2)
 			{
-				return Objects.compareWithConversion(p1.accessTime, p2.accessTime);
+				return p1.accessTime.compareTo(p2.accessTime);
 			}
 		}
 
@@ -333,5 +287,11 @@ public class PerSessionPageStore extends AbstractPageStore
 				}
 			}
 		}
+
+		@Override
+		public void destroy()
+		{
+			cache.clear();
+		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/583e03cf/wicket-core/src/main/java/org/apache/wicket/pageStore/SecondLevelPageCache.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/SecondLevelPageCache.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/SecondLevelPageCache.java
index 656827e..3d30857 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/SecondLevelPageCache.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/SecondLevelPageCache.java
@@ -37,4 +37,6 @@ public interface SecondLevelPageCache<S, PI, P>
 	P getPage(S session, PI pageId);
 
 	void storePage(S session, PI pageId, P page);
+
+	void destroy();
 }