Simplify DeleteTrashFolder
Replace inner class with Java 8 stream, Files.walkFileTree() with Files.
walk() and for recursive removal of subtree, use Guava's MoreFiles.
deleteRecursively.
Change-Id: I3007bb608ab27920627d016943b1de67682fd590
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 07ef2e6..02dc82c 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
@@ -15,22 +15,20 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Sets;
+import com.google.common.io.MoreFiles;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.RepositoryConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
import java.io.IOException;
-import java.nio.file.FileVisitResult;
+import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
import java.util.Set;
import java.util.regex.Pattern;
+import java.util.stream.Stream;
import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.RepositoryCache.FileKey;
-import org.eclipse.jgit.util.FS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -77,78 +75,36 @@
repoFolders.addAll(repositoryCfg.getAllBasePaths());
}
- class TrashFolderRemover extends SimpleFileVisitor<Path> {
-
- @Override
- public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
- throws IOException {
- String fName = dir.getFileName().toString();
- if (TrashFolderPredicate.match(fName)) {
- log.warn("Will delete this folder: {}", dir);
- recursiveDelete(dir);
- return FileVisitResult.SKIP_SUBTREE;
- } else if (FileKey.isGitRepository(dir.toFile(), FS.DETECTED)) {
- // We are in a GITDIR and don't expect trash folders inside GITDIR's.
- return FileVisitResult.SKIP_SUBTREE;
- }
-
- return super.preVisitDirectory(dir, attrs);
- }
-
- /**
- * Recursively delete the specified file and all of its contents.
- *
- * @throws IOException
- */
- private void recursiveDelete(Path file) throws IOException {
- Files.walkFileTree(
- file,
- new SimpleFileVisitor<Path>() {
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
- throws IOException {
- Files.delete(file);
- return FileVisitResult.CONTINUE;
- }
-
- @Override
- public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException {
- if (e != null) {
- throw e;
- }
- Files.delete(dir);
- return FileVisitResult.CONTINUE;
- }
- });
- }
- }
-
@Override
public void start() {
thread =
- new Thread(
- () -> {
- for (Path folder : repoFolders) {
- if (!folder.toFile().exists()) {
- log.debug("Base path {} does not exist", folder);
- continue;
- }
- try {
- Files.walkFileTree(folder, new TrashFolderRemover());
- } catch (IOException e) {
- log.warn("Exception while trying to delete trash folders", e);
- }
- }
- },
- "DeleteTrashFolders");
+ new Thread(() -> repoFolders.stream().forEach(this::evaluateIfTrash), "DeleteTrashFolders");
thread.start();
}
+ private void evaluateIfTrash(Path folder) {
+ try (Stream<Path> dir = Files.walk(folder, FileVisitOption.FOLLOW_LINKS)) {
+ dir.filter(Files::isDirectory)
+ .filter(TrashFolderPredicate::match)
+ .forEach(this::recursivelyDelete);
+ } catch (IOException e) {
+ log.error("Failed to evaluate {}", folder, e);
+ }
+ }
+
@VisibleForTesting
Thread getWorkerThread() {
return thread;
}
+ private void recursivelyDelete(Path folder) {
+ try {
+ MoreFiles.deleteRecursively(folder);
+ } catch (IOException e) {
+ log.error("Failed to delete {}", folder, e);
+ }
+ }
+
@Override
public void stop() {}
}