diff --git a/pom.xml b/pom.xml
index 5abc29f11..84433c692 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,7 +52,6 @@
4.0.0-SNAPSHOT
3.30.6
4.3.4
- 2.20.0
3.1.1
1.0.0
diff --git a/spring-shell-core/pom.xml b/spring-shell-core/pom.xml
index 4efc14291..f7ab4c571 100644
--- a/spring-shell-core/pom.xml
+++ b/spring-shell-core/pom.xml
@@ -56,11 +56,6 @@
reactor-core
${reactor.version}
-
- commons-io
- commons-io
- ${commons-io.version}
-
jakarta.validation
jakarta.validation-api
diff --git a/spring-shell-core/src/main/java/org/springframework/shell/core/tui/component/PathSearch.java b/spring-shell-core/src/main/java/org/springframework/shell/core/tui/component/PathSearch.java
index 8615f4021..685ee1555 100644
--- a/spring-shell-core/src/main/java/org/springframework/shell/core/tui/component/PathSearch.java
+++ b/spring-shell-core/src/main/java/org/springframework/shell/core/tui/component/PathSearch.java
@@ -16,10 +16,13 @@
package org.springframework.shell.core.tui.component;
import java.io.IOException;
+import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.nio.file.PathMatcher;
+import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Collections;
@@ -34,11 +37,6 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.apache.commons.io.file.AccumulatorPathVisitor;
-import org.apache.commons.io.file.Counters;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.apache.commons.io.filefilter.NotFileFilter;
-import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.jline.keymap.BindingReader;
import org.jline.keymap.KeyMap;
import org.jline.terminal.Terminal;
@@ -73,6 +71,7 @@
*
* @author Janne Valkealahti
* @author Piotr Olaszewski
+ * @author Andrey Litvitski
*/
public class PathSearch extends AbstractTextComponent {
@@ -614,8 +613,7 @@ public PathScannerResult apply(String input, PathSearchContext context) {
Path path = Path.of(p);
log.debug(String.format("Walking input %s for path %s", input, path));
Files.walkFileTree(path, visitor);
- log.debug(String.format("walked files %s dirs %s", visitor.getPathCounters().getFileCounter().get(),
- visitor.getPathCounters().getDirectoryCounter().get()));
+ log.debug(String.format("walked files %s dirs %s", visitor.getFileCount(), visitor.getDirCount()));
}
catch (Exception e) {
log.debug("PathSearchPathVisitor caused exception", e);
@@ -623,7 +621,7 @@ public PathScannerResult apply(String input, PathSearchContext context) {
// match and score candidates
Set treeSet = new HashSet();
- Stream.concat(visitor.getFileList().stream(), visitor.getDirList().stream()).forEach(p -> {
+ Stream.concat(visitor.getFiles().stream(), visitor.getDirs().stream()).forEach(p -> {
SearchMatchResult result;
if (StringUtils.hasText(match)) {
SearchMatch searchMatch = SearchMatch.builder()
@@ -643,37 +641,81 @@ public PathScannerResult apply(String input, PathSearchContext context) {
return treeSet.stream()
.sorted()
.limit(context.getPathSearchConfig().getMaxPathsSearch())
- .collect(Collectors.collectingAndThen(Collectors.toList(),
- list -> PathScannerResult.of(list, visitor.getPathCounters().getDirectoryCounter().get(),
- visitor.getPathCounters().getFileCounter().get(), StringUtils.hasText(match))));
+ .collect(Collectors.collectingAndThen(Collectors.toList(), list -> PathScannerResult.of(list,
+ visitor.getDirCount(), visitor.getFileCount(), StringUtils.hasText(match))));
}
}
/**
- * Extension to AccumulatorPathVisitor which allows to break out from scanning when
- * enough results are found.
+ * Extension to SimpleFileVisitor which allows to break out from scanning when enough
+ * results are found.
*/
- private static class PathSearchPathVisitor extends AccumulatorPathVisitor {
+ private static class PathSearchPathVisitor extends SimpleFileVisitor {
private final int limitFiles;
- private final static IOFileFilter DNFILTER = new NotFileFilter(new WildcardFileFilter(".*"));
+ private long fileCount;
+
+ private long dirCount;
+
+ private final List files = new ArrayList<>();
+
+ private final List dirs = new ArrayList<>();
+
+ private final PathMatcher hiddenMatcher = FileSystems.getDefault().getPathMatcher("glob:.*");
PathSearchPathVisitor(int limitFiles) {
- super(Counters.longPathCounters(), DNFILTER, DNFILTER);
this.limitFiles = limitFiles;
}
+ private boolean accept(Path path) {
+ Path name = path.getFileName();
+ if (name == null) {
+ return false;
+ }
+ return !this.hiddenMatcher.matches(name);
+ }
+
+ @Override
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+ if (!accept(dir)) {
+ return FileVisitResult.SKIP_SUBTREE;
+ }
+ this.dirs.add(dir);
+ this.dirCount++;
+ return FileVisitResult.CONTINUE;
+ }
+
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException {
FileVisitResult result = super.visitFile(file, attributes);
- if (getPathCounters().getFileCounter().get() >= this.limitFiles) {
- return FileVisitResult.TERMINATE;
+ if (accept(file)) {
+ this.files.add(file);
+ this.fileCount++;
+ if (this.fileCount >= this.limitFiles) {
+ return FileVisitResult.TERMINATE;
+ }
}
return result;
}
+ public long getDirCount() {
+ return this.dirCount;
+ }
+
+ public List getFiles() {
+ return this.files;
+ }
+
+ public List getDirs() {
+ return this.dirs;
+ }
+
+ public long getFileCount() {
+ return this.fileCount;
+ }
+
}
}