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 2020/03/26 06:07:27 UTC

[wicket] branch master updated: Minor improvements in pageStore package

This is an automated email from the ASF dual-hosted git repository.

mgrigorov 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 cd44134  Minor improvements in pageStore package
cd44134 is described below

commit cd441346709ba932d0870eaf72f048bfee51370a
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Thu Mar 26 07:58:14 2020 +0200

    Minor improvements in pageStore package
    
    * Remove ISerializer from some PageStore impls because it is not used anyway
    * Use Java 8 diamonds where possible
    * Fix javadoc errors
    * Add empty default implementation for #detach() methods in interfaces. It is implemented very rarely. In the current case only in Component.java
    * Make some member fields 'final'
    * Add null-checks for File.list() methods
    * Use Java 8+ lambda methods where applicable
    * Replace deprecated Mockito.verifyZeroInteractions() with verifyNoInteractions()
---
 .../org/apache/wicket/page/IManageablePage.java    |  3 +-
 .../pageStore/AbstractPersistentPageStore.java     | 10 +++---
 .../wicket/pageStore/AsynchronousPageStore.java    | 39 +++++-----------------
 .../apache/wicket/pageStore/CryptingPageStore.java |  8 ++---
 .../wicket/pageStore/DefaultPageContext.java       |  2 +-
 .../org/apache/wicket/pageStore/DiskPageStore.java | 35 ++++---------------
 .../org/apache/wicket/pageStore/FilePageStore.java | 34 +++----------------
 .../apache/wicket/pageStore/GroupingPageStore.java | 10 +++---
 .../org/apache/wicket/pageStore/IPageStore.java    |  8 ++---
 .../wicket/pageStore/IPersistentPageStore.java     |  2 +-
 .../apache/wicket/pageStore/InMemoryPageStore.java | 17 ++++------
 .../wicket/pageStore/InSessionPageStore.java       | 17 +++++-----
 .../apache/wicket/pageStore/RequestPageStore.java  |  6 ++--
 .../apache/wicket/pageStore/SerializedPage.java    |  7 +---
 .../wicket/pageStore/SerializingPageStore.java     |  4 +--
 .../wicket/pageStore/crypt/DefaultCrypter.java     |  4 ---
 .../wicket/pageStore/disk/NestedFolders.java       | 19 +++++------
 .../wicket/pageStore/disk/PageWindowManager.java   | 10 +++---
 .../request/component/IRequestableComponent.java   |  3 +-
 .../wicket/request/component/IRequestablePage.java |  6 ++++
 .../test/java/org/apache/wicket/MockComponent.java |  5 ---
 .../wicket/page/PersistentPageManagerTest.java     |  5 ---
 .../pageStore/AsynchronousPageStoreTest.java       |  5 ---
 .../apache/wicket/pageStore/DiskPageStoreTest.java |  5 ++-
 .../apache/wicket/pageStore/FilePageStoreTest.java |  4 +--
 .../protocol/http/request/WebClientInfoTest.java   |  2 +-
 26 files changed, 89 insertions(+), 181 deletions(-)

diff --git a/wicket-core/src/main/java/org/apache/wicket/page/IManageablePage.java b/wicket-core/src/main/java/org/apache/wicket/page/IManageablePage.java
index 11c3756..c57bf3c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/page/IManageablePage.java
+++ b/wicket-core/src/main/java/org/apache/wicket/page/IManageablePage.java
@@ -40,7 +40,8 @@ public interface IManageablePage extends IClusterable
 	 * Detaches model after use. This is generally used to null out transient references that can be
 	 * re-attached later.
 	 */
-	void detach();
+	default void detach()
+	{}
 
 	/**
 	 * Sets whether or not the page is allowed to change its page id. Implementations of this
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPersistentPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPersistentPageStore.java
index 17541ee..74df252 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPersistentPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/AbstractPersistentPageStore.java
@@ -165,7 +165,7 @@ public abstract class AbstractPersistentPageStore implements IPageStore
 	/**
 	 * Create an identifier for the given context.
 	 * <p>
-	 * Default implementation uses {@link IPageContext#getSessionId()}.
+	 * Default implementation uses {@link IPageContext#getSessionId(boolean)}}.
 	 * 
 	 * @param context context
 	 * @return identifier for the session
@@ -224,11 +224,11 @@ public abstract class AbstractPersistentPageStore implements IPageStore
 
 	protected static class PersistedPage implements IPersistedPage
 	{
-		private int pageId;
+		private final int pageId;
 
-		private String pageType;
+		private final String pageType;
 
-		private long pageSize;
+		private final long pageSize;
 
 		public PersistedPage(int pageId, String pageType, long pageSize)
 		{
@@ -256,4 +256,4 @@ public abstract class AbstractPersistentPageStore implements IPageStore
 		}
 
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousPageStore.java
index caf17ce..735683c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousPageStore.java
@@ -18,7 +18,6 @@ package org.apache.wicket.pageStore;
 
 import java.io.Serializable;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
@@ -102,8 +101,8 @@ public class AsynchronousPageStore extends DelegatingPageStore
 
 	/**
 	 * 
-	 * @param pageId
 	 * @param sessionId
+	 * @param pageId
 	 * @return generated key
 	 */
 	private static String getKey(final String sessionId, final int pageId)
@@ -145,8 +144,6 @@ public class AsynchronousPageStore extends DelegatingPageStore
 		}
 
 		/**
-		 * 
-		 * @param entry
 		 * @return generated key
 		 */
 		private String getKey()
@@ -189,12 +186,9 @@ public class AsynchronousPageStore extends DelegatingPageStore
 			if (asynchronous)
 			{
 				value = (T)attributeCache.get(key);
-				if (value == null )
+				if (value == null && defaultValue.get() != null)
 				{
-					if (defaultValue.get() != null)
-					{
 						throw new WicketRuntimeException("session attribute can not be changed asynchronuously");
-					}
 				}
 			} else {
 				value = context.getSessionAttribute(key, defaultValue);
@@ -218,12 +212,9 @@ public class AsynchronousPageStore extends DelegatingPageStore
 			if (asynchronous)
 			{
 				value = context.getSessionData(key, () -> null);
-				if (value == null )
+				if (value == null && defaultValue.get() != null)
 				{
-					if (defaultValue.get() != null)
-					{
 						throw new WicketRuntimeException("session data can not be changed asynchronuously");
-					}
 				}
 			}
 			else
@@ -340,13 +331,10 @@ public class AsynchronousPageStore extends DelegatingPageStore
 		}
 
 		String key = getKey(sessionId, page.getPageId());
-		if (key != null)
+		PendingAdd entry = queueMap.remove(key);
+		if (entry != null)
 		{
-			PendingAdd entry = queueMap.remove(key);
-			if (entry != null)
-			{
-				queue.remove(entry);
-			}
+			queue.remove(entry);
 		}
 
 		getDelegate().removePage(context, page);
@@ -394,18 +382,9 @@ public class AsynchronousPageStore extends DelegatingPageStore
 		if (sessionId == null) {
 			return;
 		}
-		
-		Iterator<PendingAdd> iterator = queue.iterator();
-		while (iterator.hasNext())
-		{
-			PendingAdd add = iterator.next(); 
-		
-			if (add.sessionId.equals(sessionId))
-			{
-				iterator.remove();
-			}
-		}
+
+		queue.removeIf(add -> add.sessionId.equals(sessionId));
 		
 		getDelegate().removeAllPages(context);
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/CryptingPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/CryptingPageStore.java
index dc0d6eb..5b697b6 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/CryptingPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/CryptingPageStore.java
@@ -41,7 +41,7 @@ import org.apache.wicket.util.lang.Args;
  */
 public class CryptingPageStore extends DelegatingPageStore
 {
-	private static final MetaDataKey<SessionData> KEY = new MetaDataKey<SessionData>()
+	private static final MetaDataKey<SessionData> KEY = new MetaDataKey<>()
 	{
 		private static final long serialVersionUID = 1L;
 	};
@@ -53,8 +53,8 @@ public class CryptingPageStore extends DelegatingPageStore
 	/**
 	 * @param delegate
 	 *            store to delegate to
-	 * @param applicationName
-	 *            name of application
+	 * @param application
+	 *            the application
 	 */
 	public CryptingPageStore(IPageStore delegate, Application application)
 	{
@@ -163,4 +163,4 @@ public class CryptingPageStore extends DelegatingPageStore
 			return crypter.decrypt(encrypted, key);
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageContext.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageContext.java
index 57e7e3c..780f440 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageContext.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/DefaultPageContext.java
@@ -33,7 +33,7 @@ public class DefaultPageContext implements IPageContext
 {
 	
 	/**
-	 * @see org.apache.wicket.pageStore.IPageContext#getSessionId()
+	 * @see org.apache.wicket.pageStore.IPageContext#getSessionId(boolean)
 	 */
 	@Override
 	public String getSessionId(boolean bind)
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
index 033e1cc..d6bda8f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
@@ -18,7 +18,6 @@ package org.apache.wicket.pageStore;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -42,7 +41,6 @@ import org.apache.wicket.pageStore.disk.NestedFolders;
 import org.apache.wicket.pageStore.disk.PageWindowManager;
 import org.apache.wicket.pageStore.disk.PageWindowManager.FileWindow;
 import org.apache.wicket.protocol.http.PageExpiredException;
-import org.apache.wicket.serialize.ISerializer;
 import org.apache.wicket.util.file.Files;
 import org.apache.wicket.util.io.IOUtils;
 import org.apache.wicket.util.lang.Args;
@@ -59,7 +57,7 @@ import org.slf4j.LoggerFactory;
  * Since Ajax requests do not change the id of a page, {@link DiskPageStore} offers an optimization to overwrite the most recently written
  * page, if it has the same id as a new page to write.<p>
  * However this does not help in case of alternating requests between multiple browser windows: In this case requests are processed for
- * different page ids and the oldests pages are constantly overwritten (this can easily happen with Ajax timers on one or more pages).
+ * different page ids and the oldest pages are constantly overwritten (this can easily happen with Ajax timers on one or more pages).
  * This leads to pages with identical id superfluously kept in the file, while older pages are prematurely expelled.
  * Any following request to these older pages will then fail with {@link PageExpiredException}.   
  */
@@ -92,24 +90,6 @@ public class DiskPageStore extends AbstractPersistentPageStore implements IPersi
 	 */
 	public DiskPageStore(String applicationName, File fileStoreFolder, Bytes maxSizePerSession)
 	{
-		this(applicationName, fileStoreFolder, maxSizePerSession, null);
-	}
-
-	/**
-	 * Create a store to disk.
-	 * 
-	 * @param applicationName
-	 *            name of application
-	 * @param fileStoreFolder
-	 *            folder to store to
-	 * @param maxSizePerSession
-	 *            maximum size per session
-	 * @param serializer
-	 *            for serialization of pages
-	 */
-	public DiskPageStore(String applicationName, File fileStoreFolder, Bytes maxSizePerSession,
-		ISerializer serializer)
-	{
 		super(applicationName);
 		
 		this.folders = new NestedFolders(new File(fileStoreFolder, applicationName + "-filestore"));
@@ -285,7 +265,7 @@ public class DiskPageStore extends AbstractPersistentPageStore implements IPersi
 			{
 				ObjectOutputStream oos = new ObjectOutputStream(stream);
 				
-				List<DiskData> list = new ArrayList<>(diskDatas.size());
+				ArrayList<DiskData> list = new ArrayList<>(diskDatas.size());
 				for (DiskData diskData : diskDatas.values())
 				{
 					if (diskData.sessionIdentifier != null)
@@ -310,7 +290,7 @@ public class DiskPageStore extends AbstractPersistentPageStore implements IPersi
 
 	/**
 	 * 
-	 * @param session
+	 * @param sessionIdentifier
 	 *            key
 	 * @return a list of the last N page windows
 	 */
@@ -499,15 +479,14 @@ public class DiskPageStore extends AbstractPersistentPageStore implements IPersi
 			if (create || file.exists())
 			{
 				String mode = create ? "rw" : "r";
-				try
+				try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, mode))
 				{
-					RandomAccessFile randomAccessFile = new RandomAccessFile(file, mode);
 					channel = randomAccessFile.getChannel();
 				}
-				catch (FileNotFoundException fnfx)
+				catch (IOException iox)
 				{
 					// can happen if the file is locked. WICKET-4176
-					log.error(fnfx.getMessage(), fnfx);
+					log.error(iox.getMessage(), iox);
 				}
 			}
 			return channel;
@@ -558,4 +537,4 @@ public class DiskPageStore extends AbstractPersistentPageStore implements IPersi
 		File sessionFolder = folders.get(sessionIdentifier, true);
 		return new File(sessionFolder, "data").getAbsolutePath();
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/FilePageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/FilePageStore.java
index 2fb968d..9e21715 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/FilePageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/FilePageStore.java
@@ -35,7 +35,6 @@ import java.util.Set;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.page.IManageablePage;
 import org.apache.wicket.pageStore.disk.NestedFolders;
-import org.apache.wicket.serialize.ISerializer;
 import org.apache.wicket.util.file.Files;
 import org.apache.wicket.util.io.IOUtils;
 import org.apache.wicket.util.lang.Args;
@@ -78,23 +77,6 @@ public class FilePageStore extends AbstractPersistentPageStore implements IPersi
 	 */
 	public FilePageStore(String applicationName, File fileStoreFolder, Bytes maxSizePerSession)
 	{
-		this(applicationName, fileStoreFolder, maxSizePerSession, null);
-	}
-
-	/**
-	 * Create a store to files.
-	 * 
-	 * @param applicationName
-	 *            name of application
-	 * @param fileStoreFolder
-	 *            folder to store to
-	 * @param maxSizePerSession
-	 *            maximum size per session
-	 * @param serializer
-	 *            for serialization of pages
-	 */
-	public FilePageStore(String applicationName, File fileStoreFolder, Bytes maxSizePerSession, ISerializer serializer)
-	{
 		super(applicationName);
 		
 		this.folders = new NestedFolders(new File(fileStoreFolder, applicationName + "-filestore"));
@@ -229,32 +211,27 @@ public class FilePageStore extends AbstractPersistentPageStore implements IPersi
 		Arrays.sort(files, new LastModifiedComparator());
 
 		long total = 0;
-		for (int f = 0; f < files.length; f++)
+		for (File candidate : files)
 		{
-			File candidate = files[f];
-
 			total += candidate.length();
 
 			if (total > maxSizePerSession.bytes())
 			{
 				if (!Files.remove(candidate))
 				{
-					log.warn("cannot remove page data for session {} page {}", sessionIdentifier,
-						candidate.getName());
+					log.warn("cannot remove page data for session {} page {}", sessionIdentifier, candidate.getName());
 				}
 			}
 		}
 	}
 
-	public class LastModifiedComparator implements Comparator<File>
+	public static class LastModifiedComparator implements Comparator<File>
 	{
-
 		@Override
 		public int compare(File f1, File f2)
 		{
 			return Long.compare(f2.lastModified(), f1.lastModified());
 		}
-
 	}
 
 	@Override
@@ -288,8 +265,7 @@ public class FilePageStore extends AbstractPersistentPageStore implements IPersi
 					int pageId;
 					try
 					{
-						pageId = Integer
-							.valueOf(name.substring(0, name.length() - FILE_SUFFIX.length()));
+						pageId = Integer.parseInt(name.substring(0, name.length() - FILE_SUFFIX.length()), 10);
 					}
 					catch (Exception ex)
 					{
@@ -376,4 +352,4 @@ public class FilePageStore extends AbstractPersistentPageStore implements IPersi
 
 		return Bytes.bytes(total);
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/GroupingPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/GroupingPageStore.java
index b588df7..9eaaa7d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/GroupingPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/GroupingPageStore.java
@@ -40,12 +40,12 @@ public abstract class GroupingPageStore extends DelegatingPageStore
 
 	private static final String DEFAULT_GROUP = "default";
 
-	private static final MetaDataKey<SessionData> KEY = new MetaDataKey<SessionData>()
+	private static final MetaDataKey<SessionData> KEY = new MetaDataKey<>()
 	{
 		private static final long serialVersionUID = 1L;
 	};
 
-	private int maxGroups;
+	private final int maxGroups;
 	
 	/**
 	 * Is a group of a page stable.
@@ -157,9 +157,9 @@ public abstract class GroupingPageStore extends DelegatingPageStore
 	 */
 	static class SessionData implements Serializable
 	{
-		private LinkedList<String> groups = new LinkedList<>();
+		private final LinkedList<String> groups = new LinkedList<>();
 
-		private Map<String, MetaDataEntry<?>[]> metaData = new HashMap<>();
+		private final Map<String, MetaDataEntry<?>[]> metaData = new HashMap<>();
 
 		public synchronized <T> void setMetaData(String group, MetaDataKey<T> key, T value)
 		{
@@ -282,4 +282,4 @@ public abstract class GroupingPageStore extends DelegatingPageStore
 			throw new WicketRuntimeException("no request available for group");
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
index 50634a0..3872c8a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
@@ -50,8 +50,8 @@ public interface IPageStore
 	 * 
 	 * @param context
 	 *            the context of the page
-	 * @param id
-	 *            the id of the page.
+	 * @param page
+	 *            the page.
 	 */
 	void addPage(IPageContext context, IManageablePage page);
 
@@ -60,8 +60,8 @@ public interface IPageStore
 	 * 
 	 * @param context
 	 *            the context of the page
-	 * @param id
-	 *            the id of the page.
+	 * @param page
+	 *            the page.
 	 */
 	void removePage(IPageContext context, IManageablePage page);
 
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java
index 9a4226d..837ae7f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java
@@ -51,7 +51,7 @@ public interface IPersistentPageStore extends IPageStore
 	/**
 	 * Get information about all persisted pages with the given session identifier.
 	 * 
-	 * @param the
+	 * @param sessionIdentifier
 	 *            identifier of the session.
 	 * @return all persisted pages
 	 */
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 481f717..222589f 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
@@ -205,7 +205,7 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	/**
 	 * Data kept in memory.
 	 */
-	static abstract class MemoryData implements Iterable<IManageablePage>
+	abstract static class MemoryData implements Iterable<IManageablePage>
 	{
 		/**
 		 * Kept in list instead of map, since non-serialized pages might change their id during a request.
@@ -243,11 +243,8 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 
 		public synchronized IManageablePage get(int pageId)
 		{
-			Iterator<IManageablePage> iterator = pages.iterator();
-			while (iterator.hasNext())
+			for (final IManageablePage page : pages)
 			{
-				IManageablePage page = iterator.next();
-				
 				if (page.getPageId() == pageId)
 				{
 					return page;
@@ -269,8 +266,7 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	 */
 	static class CountLimitedData extends MemoryData
 	{
-
-		private int maxPages;
+		private final int maxPages;
 
 		public CountLimitedData(int maxPages)
 		{
@@ -294,8 +290,7 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 	 */
 	static class SizeLimitedData extends MemoryData
 	{
-		
-		private Bytes maxBytes;
+		private final Bytes maxBytes;
 		
 		private long size;
 
@@ -330,9 +325,9 @@ public class InMemoryPageStore extends AbstractPersistentPageStore implements IP
 			SerializedPage page = (SerializedPage) super.remove(pageId);
 			if (page != null)
 			{
-				size -= ((SerializedPage) page).getData().length;
+				size -= page.getData().length;
 			}
 			return page;
 		}
 	}
-}
\ 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 c740380..3c363fd 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
@@ -48,12 +48,12 @@ import org.apache.wicket.util.lang.Classes;
 public class InSessionPageStore extends DelegatingPageStore
 {
 
-	private static final MetaDataKey<SessionData> KEY_CACHE = new MetaDataKey<SessionData>()
+	private static final MetaDataKey<SessionData> KEY_CACHE = new MetaDataKey<>()
 	{
 		private static final long serialVersionUID = 1L;
 	};
 
-	private static final MetaDataKey<SessionData> KEY_PERSISTENT = new MetaDataKey<SessionData>()
+	private static final MetaDataKey<SessionData> KEY_PERSISTENT = new MetaDataKey<>()
 	{
 		private static final long serialVersionUID = 1L;
 	};
@@ -213,7 +213,7 @@ public class InSessionPageStore extends DelegatingPageStore
 	 * Data kept in the {@link Session}, might get serialized along with its containing
 	 * {@link HttpSession}.
 	 */
-	static abstract class SessionData implements Serializable
+	abstract static class SessionData implements Serializable
 	{
 
 		transient ISerializer serializer;
@@ -328,14 +328,14 @@ public class InSessionPageStore extends DelegatingPageStore
 	 */
 	static class CountLimitedData extends SessionData
 	{
-
-		private int maxPages;
+		private final int maxPages;
 
 		public CountLimitedData(int maxPages)
 		{
 			this.maxPages = Args.withinRange(1, Integer.MAX_VALUE, maxPages, "maxPages");
 		}
 
+		@Override
 		public synchronized void add(IManageablePage page)
 		{
 			super.add(page);
@@ -352,8 +352,7 @@ public class InSessionPageStore extends DelegatingPageStore
 	 */
 	static class SizeLimitedData extends SessionData
 	{
-
-		private Bytes maxBytes;
+		private final Bytes maxBytes;
 
 		private long size;
 
@@ -389,7 +388,7 @@ public class InSessionPageStore extends DelegatingPageStore
 			SerializedPage page = (SerializedPage)super.remove(pageId);
 			if (page != null)
 			{
-				size -= ((SerializedPage)page).getData().length;
+				size -= page.getData().length;
 			}
 
 			return page;
@@ -403,4 +402,4 @@ public class InSessionPageStore extends DelegatingPageStore
 			size = 0;
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
index 0c0da70..ddeab95 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
@@ -115,7 +115,7 @@ public class RequestPageStore extends DelegatingPageStore
 
 	private RequestData getRequestData(IPageContext context)
 	{
-		return context.getRequestData(KEY, () -> new RequestData());
+		return context.getRequestData(KEY, RequestData::new);
 	}
 	
 	/**
@@ -123,7 +123,7 @@ public class RequestPageStore extends DelegatingPageStore
 	 */
 	static class RequestData
 	{
-		private LinkedList<IManageablePage> pages = new LinkedList<>();
+		private final LinkedList<IManageablePage> pages = new LinkedList<>();
 		
 		public void add(IManageablePage page)
 		{
@@ -160,4 +160,4 @@ public class RequestPageStore extends DelegatingPageStore
 			pages.clear();
 		}		
 	}
-}
\ No newline at end of file
+}
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 eccabe6..4dd6bd7 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
@@ -85,11 +85,6 @@ public final class SerializedPage implements IManageablePage
 	{
 		return data;
 	}
-	
-	@Override
-	public void detach()
-	{
-	}
 
 	@Override
 	public boolean setFreezePageId(boolean freeze)
@@ -102,4 +97,4 @@ public final class SerializedPage implements IManageablePage
 	{
 		return "[SerializedPage id = " + pageId + ", type=" + pageType + ", size=" + data.length + "]";
 	}
-}
\ No newline at end of file
+}
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 bd19872..c62df9f 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
@@ -27,7 +27,7 @@ import org.apache.wicket.util.lang.Classes;
 public class SerializingPageStore extends DelegatingPageStore
 {
 
-	private ISerializer serializer;
+	private final ISerializer serializer;
 
 	/**
 	 * @param delegate
@@ -81,4 +81,4 @@ public class SerializingPageStore extends DelegatingPageStore
 		}
 		getDelegate().addPage(context, page);
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/crypt/DefaultCrypter.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/crypt/DefaultCrypter.java
index efc4169..403a4d7 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/crypt/DefaultCrypter.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/crypt/DefaultCrypter.java
@@ -33,10 +33,6 @@ import org.apache.wicket.WicketRuntimeException;
  */
 public class DefaultCrypter implements ICrypter
 {
-	public DefaultCrypter()
-	{
-	}
-
 	protected Cipher getCipher() throws GeneralSecurityException
 	{
 		return Cipher.getInstance("AES/CBC/PKCS5Padding");
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/NestedFolders.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/NestedFolders.java
index 7636d83..f4d00e6 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/NestedFolders.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/NestedFolders.java
@@ -17,6 +17,7 @@
 package org.apache.wicket.pageStore.disk;
 
 import java.io.File;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -98,15 +99,14 @@ public class NestedFolders
 			Files.removeFolder(folder);
 			
 			File high = folder.getParentFile();
-			if (high.list().length == 0)
+			final String[] highChildren = high.list();
+			if (highChildren != null && highChildren.length == 0 && Files.removeFolder(high))
 			{
-				if (Files.removeFolder(high))
+				File low = high.getParentFile();
+				final String[] lowChildren = low.list();
+				if (lowChildren != null && lowChildren.length == 0)
 				{
-					File low = high.getParentFile();
-					if (low.list().length == 0)
-					{
-						Files.removeFolder(low);
-					}
+					Files.removeFolder(low);
 				}
 			}
 		}
@@ -127,10 +127,7 @@ public class NestedFolders
 			{
 				for (File high: Files.list(low))
 				{
-					for (File file : Files.list(high))
-					{
-						files.add(file);
-					}
+					Collections.addAll(files, Files.list(high));
 				}
 			}
 		}
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/PageWindowManager.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/PageWindowManager.java
index ad60dab..424089a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/PageWindowManager.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/disk/PageWindowManager.java
@@ -86,7 +86,7 @@ public class PageWindowManager implements Serializable
 		}
 	}
 
-	private final List<FileWindow> windows = new ArrayList<FileWindow>();
+	private final List<FileWindow> windows = new ArrayList<>();
 
 	/**
 	 * map from page id to list of pagewindow indices (referring to the windows list) - to improve
@@ -149,9 +149,9 @@ public class PageWindowManager implements Serializable
 	private void rebuildIndices()
 	{
 		idToWindowIndex = null;
-		idToWindowIndex = new IntHashMap<Integer>();
+		idToWindowIndex = new IntHashMap<>();
 		windowIndexToPageId = null;
-		windowIndexToPageId = new IntHashMap<Integer>();
+		windowIndexToPageId = new IntHashMap<>();
 		for (int i = 0; i < windows.size(); ++i)
 		{
 			FileWindow window = windows.get(i);
@@ -355,7 +355,7 @@ public class PageWindowManager implements Serializable
 	 * Creates and returns a new page window for given page.
 	 * 
 	 * @param pageId
-	 * @param type 
+	 * @param pageType
 	 * @param size
 	 * @return page window
 	 */
@@ -437,7 +437,7 @@ public class PageWindowManager implements Serializable
 	 */
 	public synchronized List<FileWindow> getFileWindows()
 	{
-		List<FileWindow> result = new ArrayList<FileWindow>();
+		List<FileWindow> result = new ArrayList<>();
 
 		// start from current index to 0
 		int currentIndex = indexPointer;
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java b/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
index f7bd8ec..17787b9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
@@ -107,7 +107,8 @@ public interface IRequestableComponent
 	 * 
 	 * </p>
 	 */
-	void detach();
+	default void detach()
+	{}
 
 	/**
 	 * @return {@code true} if it is save to call an {@link org.apache.wicket.IRequestListener} on this component
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestablePage.java b/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestablePage.java
index a5cfb22..d8e1833 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestablePage.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/component/IRequestablePage.java
@@ -71,4 +71,10 @@ public interface IRequestablePage extends IRequestableComponent, IManageablePage
 	 * @return page parameters or <code>null</code>
 	 */
 	PageParameters getPageParameters();
+
+	/**
+	 * {@inheritDoc}
+	 */
+	default void detach()
+	{}
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/MockComponent.java b/wicket-core/src/test/java/org/apache/wicket/MockComponent.java
index 8af8c40..949fa7d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/MockComponent.java
+++ b/wicket-core/src/test/java/org/apache/wicket/MockComponent.java
@@ -133,11 +133,6 @@ public class MockComponent implements IRequestableComponent, IRequestListener
 	}
 
 	@Override
-	public void detach()
-	{
-	}
-
-	@Override
 	public boolean canCallListenerAfterExpiry()
 	{
 		return false;
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 d10dc4d..77bb7f0 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
@@ -154,11 +154,6 @@ class PersistentPageManagerTest
 		}
 
 		@Override
-		public void detach()
-		{
-		}
-
-		@Override
 		public boolean setFreezePageId(boolean freeze)
 		{
 			return false;
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java
index 7bad045..c9060ae 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java
@@ -79,11 +79,6 @@ public class AsynchronousPageStoreTest
 		}
 
 		@Override
-		public void detach()
-		{
-		}
-
-		@Override
 		public boolean setFreezePageId(boolean freeze)
 		{
 			return false;
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskPageStoreTest.java
index dc9d534..233ad41 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskPageStoreTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskPageStoreTest.java
@@ -20,7 +20,6 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 
-import org.apache.wicket.serialize.java.JavaSerializer;
 import org.apache.wicket.util.WicketTestTag;
 import org.apache.wicket.util.lang.Bytes;
 import org.junit.jupiter.api.Tag;
@@ -43,10 +42,10 @@ public class DiskPageStoreTest extends AbstractConcurrentPageStoreTest
 	{
 		File fileStoreFolder = Files.createTempDirectory(null).toFile();
 
-		IPageStore pageStore = new DiskPageStore("app1", fileStoreFolder, MAX_SIZE_PER_SESSION, new JavaSerializer("app1"));
+		IPageStore pageStore = new DiskPageStore("app1", fileStoreFolder, MAX_SIZE_PER_SESSION);
 
 		doTestStore(pageStore);
 
 		pageStore.destroy();
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/FilePageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/FilePageStoreTest.java
index 86f393a..777a1d5 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/FilePageStoreTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/FilePageStoreTest.java
@@ -43,10 +43,10 @@ public class FilePageStoreTest extends AbstractConcurrentPageStoreTest
 	{
 		File folder = Files.createTempDirectory(null).toFile();
 
-		IPageStore pageStore = new FilePageStore("app1", folder, MAX_SIZE_PER_SESSION, new JavaSerializer("app1"));
+		IPageStore pageStore = new FilePageStore("app1", folder, MAX_SIZE_PER_SESSION);
 
 		doTestStore(pageStore);
 
 		pageStore.destroy();
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/WebClientInfoTest.java b/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/WebClientInfoTest.java
index 033e597..2c01d91 100644
--- a/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/WebClientInfoTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/request/WebClientInfoTest.java
@@ -64,7 +64,7 @@ class WebClientInfoTest
 		WebClientInfo clientInfo = new WebClientInfo(requestCycleMock, "No user agent");
 		String actual = clientInfo.getRemoteAddr(requestCycleMock);
 		assertEquals(expected, actual);
-		Mockito.verifyZeroInteractions(servletRequest);
+		Mockito.verifyNoInteractions(servletRequest);
 	}
 
 	/**