You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2020/04/15 21:52:44 UTC

[wicket] branch master updated: WICKET-6769 allow custom map implementation

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 2a6a064  WICKET-6769 allow custom map implementation
2a6a064 is described below

commit 2a6a0641b512137500a8cf74a11a00e4a4879bb7
Author: Sven Meier <sv...@apache.org>
AuthorDate: Mon Apr 13 23:53:02 2020 +0200

    WICKET-6769 allow custom map implementation
---
 .../apache/wicket/pageStore/InMemoryPageStore.java | 148 ++++++++++++++-------
 1 file changed, 97 insertions(+), 51 deletions(-)

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 222589f..1bc95ba 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
@@ -41,13 +41,13 @@ import org.apache.wicket.util.lang.Classes;
 public class InMemoryPageStore extends AbstractPersistentPageStore implements IPersistentPageStore
 {
 
-	private final Map<String, MemoryData> datas = new ConcurrentHashMap<>();
+	private final Map<String, IMemoryData> datas;
 
-	private final Supplier<MemoryData> dataCreator;
+	private final Supplier<IMemoryData> dataCreator;
 
 	/**
 	 * Keep {@code maxPages} for each session.
-	 *    
+	 * 
 	 * @param applicationName
 	 *            {@link Application#getName()}
 	 * @param maxPages
@@ -55,14 +55,14 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	 */
 	public InMemoryPageStore(String applicationName, int maxPages)
 	{
-		this(applicationName, () -> new CountLimitedData(maxPages));
+		this(applicationName, () -> new CountLimitedData(maxPages), new ConcurrentHashMap<>());
 	}
 
 	/**
 	 * Keep page up to {@code maxBytes} for each session.
 	 * <p>
-	 * All pages added to this store <em>must</em> be {@code SerializedPage}s. You can achieve this by letting
-	 * a {@link SerializingPageStore} delegate to this store.
+	 * All pages added to this store <em>must</em> be {@code SerializedPage}s. You can achieve this
+	 * by letting a {@link SerializingPageStore} delegate to this store.
 	 * 
 	 * @param applicationName
 	 *            {@link Application#getName()}
@@ -71,29 +71,40 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	 */
 	public InMemoryPageStore(String applicationName, Bytes maxBytes)
 	{
-		this(applicationName, () -> new SizeLimitedData(maxBytes));
+		this(applicationName, () -> new SizeLimitedData(maxBytes), new ConcurrentHashMap<>());
 	}
 
-	InMemoryPageStore(String applicationName, Supplier<MemoryData> dataCreator)
+	/**
+	 * @param applicationName
+	 *            {@link Application#getName()}
+	 * @param dataCreator
+	 *            creator of new data
+	 * @param datas
+	 *            storage for datas
+	 */
+	protected InMemoryPageStore(String applicationName, Supplier<IMemoryData> dataCreator,
+		Map<String, IMemoryData> datas)
 	{
 		super(applicationName);
-		
+
 		this.dataCreator = dataCreator;
+
+		this.datas = datas;
 	}
 
 	/**
-	 * Versioning is not supported.	
+	 * Versioning is not supported.
 	 */
 	@Override
 	public boolean supportsVersioning()
 	{
 		return false;
 	}
-	
+
 	@Override
 	protected IManageablePage getPersistedPage(String sessionIdentifier, int id)
 	{
-		MemoryData data = getMemoryData(sessionIdentifier, false);
+		IMemoryData data = getMemoryData(sessionIdentifier, false);
 		if (data != null)
 		{
 			return data.get(id);
@@ -105,7 +116,7 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	@Override
 	protected void removePersistedPage(String sessionIdentifier, IManageablePage page)
 	{
-		MemoryData data = getMemoryData(sessionIdentifier, false);
+		IMemoryData data = getMemoryData(sessionIdentifier, false);
 		if (data != null)
 		{
 			synchronized (data)
@@ -124,7 +135,7 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	@Override
 	protected void addPersistedPage(String sessionIdentifier, IManageablePage page)
 	{
-		MemoryData data = getMemoryData(sessionIdentifier, true);
+		IMemoryData data = getMemoryData(sessionIdentifier, true);
 
 		data.add(page);
 	}
@@ -138,7 +149,7 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	@Override
 	public List<IPersistedPage> getPersistedPages(String sessionIdentifier)
 	{
-		MemoryData data = datas.get(sessionIdentifier);
+		IMemoryData data = datas.get(sessionIdentifier);
 		if (data == null)
 		{
 			return new ArrayList<>();
@@ -146,13 +157,13 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 
 		synchronized (data)
 		{
-			return StreamSupport.stream(data.spliterator(), false)
-				.map(page -> {
-					String pageType = page instanceof SerializedPage ? ((SerializedPage)page).getPageType() : Classes.name(page.getClass());
-					
-					return new PersistedPage(page.getPageId(), pageType, getSize(page));
-				})
-				.collect(Collectors.toList());
+			return StreamSupport.stream(data.spliterator(), false).map(page -> {
+				String pageType = page instanceof SerializedPage
+					? ((SerializedPage)page).getPageType()
+					: Classes.name(page.getClass());
+
+				return new PersistedPage(page.getPageId(), pageType, getSize(page));
+			}).collect(Collectors.toList());
 		}
 	}
 
@@ -161,7 +172,7 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	{
 		int size = 0;
 
-		for (MemoryData data : datas.values())
+		for (IMemoryData data : datas.values())
 		{
 			synchronized (data)
 			{
@@ -190,48 +201,80 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 		}
 	}
 
-	private MemoryData getMemoryData(String sessionIdentifier, boolean create)
+	private IMemoryData getMemoryData(String sessionIdentifier, boolean create)
 	{
 		if (!create)
 		{
 			return datas.get(sessionIdentifier);
 		}
 
-		MemoryData data = dataCreator.get();
-		MemoryData existing = datas.putIfAbsent(sessionIdentifier, data);
+		IMemoryData data = dataCreator.get();
+		IMemoryData existing = datas.putIfAbsent(sessionIdentifier, data);
 		return existing != null ? existing : data;
 	}
 
 	/**
-	 * Data kept in memory.
+	 * Pages kept in memory for a session.
 	 */
-	abstract static class MemoryData implements Iterable<IManageablePage>
+	interface IMemoryData extends Iterable<IManageablePage>
 	{
 		/**
-		 * Kept in list instead of map, since non-serialized pages might change their id during a request.
+		 * Remove a page.
+		 * 
+		 * @param pageId
+		 * @return
 		 */
-		List<IManageablePage> pages = new LinkedList<>();
+		IManageablePage remove(int pageId);
+
+		/**
+		 * Add a page.
+		 * 
+		 * @param page
+		 */
+		void add(IManageablePage page);
+
+		/**
+		 * Get a page.
+		 * 
+		 * @param id
+		 * @return
+		 */
+		IManageablePage get(int id);
+	}
 
+	/**
+	 * List based implementation.
+	 */
+	protected static class MemoryData implements IMemoryData
+	{
+		/**
+		 * Kept in list instead of map, since non-serialized pages might change their id during a
+		 * request.
+		 */
+		List<IManageablePage> pages = new LinkedList<>();
+		
 		@Override
 		public Iterator<IManageablePage> iterator()
 		{
 			return pages.iterator();
 		}
 
+		@Override
 		public synchronized void add(IManageablePage page)
 		{
 			remove(page.getPageId());
-			
+
 			pages.add(page);
 		}
 
+		@Override
 		public synchronized IManageablePage remove(int pageId)
 		{
 			Iterator<IManageablePage> iterator = pages.iterator();
 			while (iterator.hasNext())
 			{
 				IManageablePage page = iterator.next();
-				
+
 				if (page.getPageId() == pageId)
 				{
 					iterator.remove();
@@ -241,6 +284,7 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 			return null;
 		}
 
+		@Override
 		public synchronized IManageablePage get(int pageId)
 		{
 			for (final IManageablePage page : pages)
@@ -250,21 +294,22 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 					return page;
 				}
 			}
-			
+
 			return null;
 		}
-		
-		protected void removeOldest() {
+
+		protected void removeOldest()
+		{
 			IManageablePage page = pages.iterator().next();
-			
+
 			remove(page.getPageId());
 		}
 	}
-	
+
 	/**
 	 * Limit pages by count.
 	 */
-	static class CountLimitedData extends MemoryData
+	protected static class CountLimitedData extends MemoryData
 	{
 		private final int maxPages;
 
@@ -272,57 +317,58 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 		{
 			this.maxPages = Args.withinRange(1, Integer.MAX_VALUE, maxPages, "maxPages");
 		}
-	
+
 		@Override
 		public synchronized void add(IManageablePage page)
 		{
 			super.add(page);
-			
+
 			while (pages.size() > maxPages)
 			{
 				removeOldest();
 			}
 		}
 	}
-	
+
 	/**
 	 * Limit pages by size.
 	 */
-	static class SizeLimitedData extends MemoryData
+	protected static class SizeLimitedData extends MemoryData
 	{
 		private final Bytes maxBytes;
-		
+
 		private long size;
 
 		public SizeLimitedData(Bytes maxBytes)
 		{
 			Args.notNull(maxBytes, "maxBytes");
-			
+
 			this.maxBytes = Args.withinRange(Bytes.bytes(1), Bytes.MAX, maxBytes, "maxBytes");
 		}
-		
+
 		@Override
 		public synchronized void add(IManageablePage page)
 		{
 			if (page instanceof SerializedPage == false)
 			{
-				throw new WicketRuntimeException("InMemoryPageStore limited by size works with serialized pages only");
+				throw new WicketRuntimeException(
+					"InMemoryPageStore limited by size works with serialized pages only");
 			}
-			
+
 			super.add(page);
-			
-			size += ((SerializedPage) page).getData().length;
+
+			size += ((SerializedPage)page).getData().length;
 
 			while (size > maxBytes.bytes())
 			{
 				removeOldest();
 			}
 		}
-		
+
 		@Override
 		public synchronized IManageablePage remove(int pageId)
 		{
-			SerializedPage page = (SerializedPage) super.remove(pageId);
+			SerializedPage page = (SerializedPage)super.remove(pageId);
 			if (page != null)
 			{
 				size -= page.getData().length;