Skip to content

Commit 7eabae5

Browse files
committed
Fix FileFilterTestCase use case for symbolic links on non-Windows OS.
- Make SymbolicLinkFileFilter configurable: -- Add SymbolicLinkFileFilter.SymbolicLinkFileFilter(FileVisitResult, FileVisitResult) -- Add AbstractFileFilter(FileVisitResult, FileVisitResult) - CountingPathVisitor should not follow links by default to properly count from FileUtils.
1 parent 4ddc11c commit 7eabae5

24 files changed

Lines changed: 78 additions & 25 deletions

src/main/java/org/apache/commons/io/file/CountingPathVisitor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Objects;
2727

2828
import org.apache.commons.io.file.Counters.PathCounters;
29+
import org.apache.commons.io.filefilter.SymbolicLinkFileFilter;
2930
import org.apache.commons.io.filefilter.TrueFileFilter;
3031

3132
/**
@@ -65,7 +66,7 @@ public static CountingPathVisitor withLongCounters() {
6566
* @param pathCounter How to count path visits.
6667
*/
6768
public CountingPathVisitor(final PathCounters pathCounter) {
68-
this(pathCounter, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
69+
this(pathCounter, new SymbolicLinkFileFilter(FileVisitResult.TERMINATE, FileVisitResult.CONTINUE), TrueFileFilter.INSTANCE);
6970
}
7071

7172
/**
@@ -149,6 +150,7 @@ protected void updateFileCounters(final Path file, final BasicFileAttributes att
149150

150151
@Override
151152
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attributes) throws IOException {
153+
// Note: A file can be a symbolic link to a directory.
152154
if (Files.exists(file) && fileFilter.accept(file, attributes) == FileVisitResult.CONTINUE) {
153155
updateFileCounters(file, attributes);
154156
}

src/main/java/org/apache/commons/io/file/PathUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ public static PathCounters countDirectory(final Path directory) throws IOExcepti
315315
* @param directory directory to delete.
316316
* @return The visitor used to count the given directory.
317317
* @throws IOException if an I/O error is thrown by a visitor method.
318+
* @since 2.12.0
318319
*/
319320
public static PathCounters countDirectoryAsBigInteger(final Path directory) throws IOException {
320321
return visitFileTree(CountingPathVisitor.withBigIntegerCounters(), directory).getPathCounters();

src/main/java/org/apache/commons/io/filefilter/AbstractFileFilter.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,39 @@
3939
*/
4040
public abstract class AbstractFileFilter implements IOFileFilter, PathVisitor {
4141

42-
static FileVisitResult toFileVisitResult(final boolean accept, final Path path) {
42+
static FileVisitResult toDefaultFileVisitResult(final boolean accept) {
4343
return accept ? FileVisitResult.CONTINUE : FileVisitResult.TERMINATE;
4444
}
4545

46+
/**
47+
* What to do when this filter accepts.
48+
*/
49+
private final FileVisitResult onAccept;
50+
51+
/**
52+
* What to do when this filter rejects.
53+
*/
54+
private final FileVisitResult onReject;
55+
56+
/**
57+
* Constructs a new instance.
58+
*/
59+
public AbstractFileFilter() {
60+
this(FileVisitResult.CONTINUE, FileVisitResult.TERMINATE);
61+
}
62+
63+
/**
64+
* Constructs a new instance.
65+
*
66+
* @param onAccept What to do on acceptance.
67+
* @param onReject What to do on rejection.
68+
* @since 2.12.0.
69+
*/
70+
protected AbstractFileFilter(final FileVisitResult onAccept, final FileVisitResult onReject) {
71+
this.onAccept = onAccept;
72+
this.onReject = onReject;
73+
}
74+
4675
/**
4776
* Checks to see if the File should be accepted by this filter.
4877
*
@@ -89,6 +118,16 @@ public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttribut
89118
return accept(dir, attributes);
90119
}
91120

121+
/**
122+
* Converts a boolean into a FileVisitResult.
123+
*
124+
* @param accept accepted or rejected.
125+
* @return a FileVisitResult.
126+
*/
127+
FileVisitResult toFileVisitResult(final boolean accept) {
128+
return accept ? onAccept : onReject;
129+
}
130+
92131
/**
93132
* Provides a String representation of this file filter.
94133
*

src/main/java/org/apache/commons/io/filefilter/AgeFileFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ public FileVisitResult accept(final Path file, final BasicFileAttributes attribu
207207
} catch (final IOException e) {
208208
return handle(e);
209209
}
210-
return toFileVisitResult(acceptOlder != newer, file);
210+
return toFileVisitResult(acceptOlder != newer);
211211
}
212212

213213
/**

src/main/java/org/apache/commons/io/filefilter/CanExecuteFileFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public boolean accept(final File file) {
9090
*/
9191
@Override
9292
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
93-
return toFileVisitResult(Files.isExecutable(file), file);
93+
return toFileVisitResult(Files.isExecutable(file));
9494
}
9595

9696
}

src/main/java/org/apache/commons/io/filefilter/CanReadFileFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public boolean accept(final File file) {
100100
*/
101101
@Override
102102
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
103-
return toFileVisitResult(Files.isReadable(file), file);
103+
return toFileVisitResult(Files.isReadable(file));
104104
}
105105

106106
}

src/main/java/org/apache/commons/io/filefilter/CanWriteFileFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public boolean accept(final File file) {
8989
*/
9090
@Override
9191
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
92-
return toFileVisitResult(Files.isWritable(file), file);
92+
return toFileVisitResult(Files.isWritable(file));
9393
}
9494

9595
}

src/main/java/org/apache/commons/io/filefilter/DirectoryFileFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public boolean accept(final File file) {
105105
*/
106106
@Override
107107
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
108-
return toFileVisitResult(Files.isDirectory(file), file);
108+
return toFileVisitResult(Files.isDirectory(file));
109109
}
110110

111111
}

src/main/java/org/apache/commons/io/filefilter/EmptyFileFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ public FileVisitResult accept(final Path file, final BasicFileAttributes attribu
120120
try {
121121
if (Files.isDirectory(file)) {
122122
try (Stream<Path> stream = Files.list(file)) {
123-
return toFileVisitResult(!stream.findFirst().isPresent(), file);
123+
return toFileVisitResult(!stream.findFirst().isPresent());
124124
}
125125
}
126-
return toFileVisitResult(Files.size(file) == 0, file);
126+
return toFileVisitResult(Files.size(file) == 0);
127127
} catch (final IOException e) {
128128
return handle(e);
129129
}

src/main/java/org/apache/commons/io/filefilter/FileEqualsFileFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@ public boolean accept(final File file) {
5252

5353
@Override
5454
public FileVisitResult accept(final Path path, final BasicFileAttributes attributes) {
55-
return toFileVisitResult(Objects.equals(this.path, path), path);
55+
return toFileVisitResult(Objects.equals(this.path, path));
5656
}
5757
}

0 commit comments

Comments
 (0)