Use Gerrit's WorkQueue for running the DeleteTrashFolder task

The deletion of the trash folders was executed using an unmanaged thread
which was not visible to the Gerrit admins in the list of tasks.

Rely on the standard Gerrit's WorkQueue so that the deletion of trash
folders are visible in the tasks and can also be easily managed with
Gerrit commands, without having to go to a lower level in digging on the
JVM threads.

Bug: Issue 456214601
Change-Id: I0e6b80f8bfd5e1283070e4afe93fa048fc4d71ad
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
index 1be7f1c..1150a56 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
@@ -23,12 +23,15 @@
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.RepositoryConfig;
 import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.WorkQueue;
 import com.google.inject.Inject;
 import java.io.IOException;
 import java.nio.file.FileVisitOption;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
 import org.eclipse.jgit.lib.Config;
@@ -36,6 +39,8 @@
 public class DeleteTrashFolders implements LifecycleListener {
   private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
+  private final WorkQueue workQueue;
+
   static class TrashFolderPredicate {
 
     private TrashFolderPredicate() {
@@ -74,21 +79,39 @@
   }
 
   private Set<Path> repoFolders;
-  private Thread thread;
+
+  private Future<Void> threadCompleted;
 
   @Inject
   public DeleteTrashFolders(
-      SitePaths site, @GerritServerConfig Config cfg, RepositoryConfig repositoryCfg) {
+      SitePaths site,
+      @GerritServerConfig Config cfg,
+      RepositoryConfig repositoryCfg,
+      WorkQueue workQueue) {
     repoFolders = Sets.newHashSet();
     repoFolders.add(site.resolve(cfg.getString("gerrit", null, "basePath")));
     repoFolders.addAll(repositoryCfg.getAllBasePaths());
+    this.workQueue = workQueue;
   }
 
   @Override
   public void start() {
-    thread =
-        new Thread(() -> repoFolders.stream().forEach(this::evaluateIfTrash), "DeleteTrashFolders");
-    thread.start();
+    threadCompleted =
+        workQueue
+            .getDefaultQueue()
+            .submit(
+                new Callable<>() {
+                  @Override
+                  public Void call() {
+                    repoFolders.stream().forEach(DeleteTrashFolders.this::evaluateIfTrash);
+                    return null;
+                  }
+
+                  @Override
+                  public String toString() {
+                    return "DeleteTrashFolders";
+                  }
+                });
   }
 
   private void evaluateIfTrash(Path folder) {
@@ -102,8 +125,8 @@
   }
 
   @VisibleForTesting
-  Thread getWorkerThread() {
-    return thread;
+  Future<Void> getWorkerFuture() {
+    return threadCompleted;
   }
 
   private void recursivelyDelete(Path folder) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFoldersTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFoldersTest.java
index acb7a03..9eda84e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFoldersTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFoldersTest.java
@@ -20,9 +20,11 @@
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.server.config.RepositoryConfig;
 import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.WorkQueue;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.concurrent.Executors;
 import org.eclipse.jgit.internal.storage.file.FileRepository;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Repository;
@@ -39,6 +41,8 @@
 
   @Mock private RepositoryConfig repositoryCfg;
 
+  @Mock private WorkQueue workQueue;
+
   @Rule public TemporaryFolder tempFolder = new TemporaryFolder();
 
   private Path basePath;
@@ -51,7 +55,8 @@
     Config cfg = new Config();
     cfg.setString("gerrit", null, "basePath", basePath.toString());
     when(repositoryCfg.getAllBasePaths()).thenReturn(ImmutableList.of());
-    trashFolders = new DeleteTrashFolders(sitePaths, cfg, repositoryCfg);
+    when(workQueue.getDefaultQueue()).thenReturn(Executors.newSingleThreadScheduledExecutor());
+    trashFolders = new DeleteTrashFolders(sitePaths, cfg, repositoryCfg, workQueue);
   }
 
   @Test
@@ -59,7 +64,7 @@
     FileRepository repoToDelete = createRepository("repo.1234567890123.deleted");
     FileRepository repoToKeep = createRepository("anotherRepo.git");
     trashFolders.start();
-    trashFolders.getWorkerThread().join();
+    trashFolders.getWorkerFuture().get();
     assertThat(repoToDelete.getDirectory().exists()).isFalse();
     assertThat(repoToKeep.getDirectory().exists()).isTrue();
   }