From 4156151fd3aae80cd30026ed41fd9f81073d1ddc Mon Sep 17 00:00:00 2001 From: Laurent Almeras Date: Thu, 11 Jun 2026 11:02:04 +0200 Subject: [PATCH] WICKET-7186: correctly delegate calls to wicket cleaner FileCleaningTrackerAdapter does not delegate some calls to IFileCleaner. These call are then performed by FileCleaningTracker superclass. Each FileCleaningTrackerAdapter then create a Reaper thread that is leaked (FileCleaningTrackerAdapter is request-scope). Intended behavior is to delegate to IFileCleaner that is a singleton (there is at most 1 Reaper by wicket application). The issue appears on wicket 10.9.x as commons-fileupload2-M5 refactors DiskFileItem and now calls the Path variant of track(...) method. This fix adds the missing delegate methods. --- .../org/apache/wicket/util/file/FileCleaner.java | 13 +++++++++++++ .../util/file/FileCleanerTrackerAdapter.java | 14 ++++++++++++++ .../org/apache/wicket/util/file/IFileCleaner.java | 15 +++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/wicket-util/src/main/java/org/apache/wicket/util/file/FileCleaner.java b/wicket-util/src/main/java/org/apache/wicket/util/file/FileCleaner.java index 3b7b5a93ed1..b1ccb6efe76 100644 --- a/wicket-util/src/main/java/org/apache/wicket/util/file/FileCleaner.java +++ b/wicket-util/src/main/java/org/apache/wicket/util/file/FileCleaner.java @@ -17,6 +17,7 @@ package org.apache.wicket.util.file; import java.io.File; +import java.nio.file.Path; import org.apache.commons.io.FileCleaningTracker; import org.apache.commons.io.FileDeleteStrategy; @@ -52,6 +53,18 @@ public void track(final File file, final Object marker, FileDeleteStrategy delet cleaner.track(file, marker, deleteStrategy); } + @Override + public void track(Path file, Object marker) + { + cleaner.track(file, marker); + } + + @Override + public void track(Path file, Object marker, FileDeleteStrategy deleteStrategy) + { + cleaner.track(file, marker, deleteStrategy); + } + @Override public void destroy() { diff --git a/wicket-util/src/main/java/org/apache/wicket/util/file/FileCleanerTrackerAdapter.java b/wicket-util/src/main/java/org/apache/wicket/util/file/FileCleanerTrackerAdapter.java index 059ef49fb01..1e04032d20d 100644 --- a/wicket-util/src/main/java/org/apache/wicket/util/file/FileCleanerTrackerAdapter.java +++ b/wicket-util/src/main/java/org/apache/wicket/util/file/FileCleanerTrackerAdapter.java @@ -17,6 +17,8 @@ package org.apache.wicket.util.file; +import java.nio.file.Path; + import org.apache.commons.io.FileCleaningTracker; import org.apache.commons.io.FileDeleteStrategy; import org.apache.wicket.util.lang.Args; @@ -62,4 +64,16 @@ public void track(String path, Object marker, FileDeleteStrategy deleteStrategy) { fileCleaner.track(new File(path), marker, deleteStrategy); } + + @Override + public void track(Path file, Object marker) + { + fileCleaner.track(file, marker); + } + + @Override + public void track(Path file, Object marker, FileDeleteStrategy deleteStrategy) + { + fileCleaner.track(file, marker, deleteStrategy); + } } diff --git a/wicket-util/src/main/java/org/apache/wicket/util/file/IFileCleaner.java b/wicket-util/src/main/java/org/apache/wicket/util/file/IFileCleaner.java index 3f9fe169032..5a2eae89fac 100644 --- a/wicket-util/src/main/java/org/apache/wicket/util/file/IFileCleaner.java +++ b/wicket-util/src/main/java/org/apache/wicket/util/file/IFileCleaner.java @@ -17,6 +17,7 @@ package org.apache.wicket.util.file; import java.io.File; +import java.nio.file.Path; import org.apache.commons.io.FileDeleteStrategy; @@ -59,6 +60,20 @@ public interface IFileCleaner */ void track(File file, Object marker, FileDeleteStrategy deleteStrategy); + /** + * {@link Path} variant for file tracking. + * + * @see #track(File, Object) + */ + void track(Path file, Object marker); + + /** + * {@link Path} variant for file tracking. + * + * @see #track(File, Object, FileDeleteStrategy) + */ + void track(Path file, Object marker, FileDeleteStrategy deleteStrategy); + /** * Call this method to stop the cleaner and to free all allocated resources by it */