Skip to content

Commit b970553

Browse files
author
Gary Gregory
committed
AccumulatorPathVisitor does not track directories properly.
1 parent b803066 commit b970553

3 files changed

Lines changed: 117 additions & 4 deletions

File tree

src/changes/changes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ The <action> type attribute can be add,update,fix,remove.
6363
<action dev="ggregory" type="fix" due-to="Michiel Kalkman">
6464
FileUtils#copyDirectory(File, File, FileFilter, preserveFileDate) clean up #163.
6565
</action>
66+
<action dev="ggregory" type="fix" due-to="Michiel Kalkman">
67+
AccumulatorPathVisitor does not track directories properly.
68+
</action>
6669
<!-- ADD -->
6770
<action dev="ggregory" type="add" due-to="Gary Gregory">
6871
Add FileSystemProviders class.

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import java.io.IOException;
2121
import java.nio.file.FileVisitResult;
22-
import java.nio.file.Files;
2322
import java.nio.file.Path;
2423
import java.nio.file.attribute.BasicFileAttributes;
2524
import java.util.ArrayList;
@@ -70,6 +69,10 @@ public AccumulatorPathVisitor(final PathCounters pathCounter) {
7069
super(pathCounter);
7170
}
7271

72+
private void add(final List<Path> list, final Path dir) {
73+
list.add(dir.normalize());
74+
}
75+
7376
@Override
7477
public boolean equals(final Object obj) {
7578
if (this == obj) {
@@ -111,6 +114,12 @@ public int hashCode() {
111114
return result;
112115
}
113116

117+
@Override
118+
public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException {
119+
add(dirList, dir);
120+
return super.postVisitDirectory(dir, exc);
121+
}
122+
114123
/**
115124
* Relativizes each directory path with {@link Path#relativize(Path)} against the given {@code parent}, optionally
116125
* sorting the result.
@@ -120,7 +129,8 @@ public int hashCode() {
120129
* @param comparator How to sort, null uses default sorting.
121130
* @return A new list
122131
*/
123-
public List<Path> relativizeDirectories(final Path parent, final boolean sort, final Comparator<? super Path> comparator) {
132+
public List<Path> relativizeDirectories(final Path parent, final boolean sort,
133+
final Comparator<? super Path> comparator) {
124134
return PathUtils.relativize(getDirList(), parent, sort, comparator);
125135
}
126136

@@ -133,13 +143,14 @@ public List<Path> relativizeDirectories(final Path parent, final boolean sort, f
133143
* @param comparator How to sort, null uses default sorting.
134144
* @return A new list
135145
*/
136-
public List<Path> relativizeFiles(final Path parent, final boolean sort, final Comparator<? super Path> comparator) {
146+
public List<Path> relativizeFiles(final Path parent, final boolean sort,
147+
final Comparator<? super Path> comparator) {
137148
return PathUtils.relativize(getFileList(), parent, sort, comparator);
138149
}
139150

140151
@Override
141152
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attributes) throws IOException {
142-
((Files.isDirectory(file)) ? dirList : fileList).add(file.normalize());
153+
add(fileList, file);
143154
return super.visitFile(file, attributes);
144155
}
145156

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.commons.io.file;
19+
20+
import static org.apache.commons.io.file.CounterAssertions.assertCounts;
21+
import static org.junit.jupiter.api.Assertions.assertEquals;
22+
import static org.junit.jupiter.api.Assertions.assertTrue;
23+
24+
import java.io.File;
25+
import java.io.IOException;
26+
import java.nio.file.Files;
27+
import java.nio.file.Path;
28+
import java.nio.file.Paths;
29+
30+
import org.apache.commons.io.filefilter.AndFileFilter;
31+
import org.apache.commons.io.filefilter.DirectoryFileFilter;
32+
import org.apache.commons.io.filefilter.EmptyFileFilter;
33+
import org.apache.commons.io.filefilter.PathVisitorFileFilter;
34+
import org.junit.jupiter.api.Test;
35+
import org.junit.jupiter.api.io.TempDir;
36+
37+
public class AccumulatorPathVisitorTest {
38+
39+
@TempDir
40+
File tempDirFile;
41+
42+
/**
43+
* Tests an empty folder.
44+
*/
45+
@Test
46+
public void testEmptyFolder() throws IOException {
47+
final Path tempDir = tempDirFile.toPath();
48+
final AccumulatorPathVisitor accPathVisitor = AccumulatorPathVisitor.withLongCounters();
49+
final PathVisitorFileFilter countingFileFilter = new PathVisitorFileFilter(accPathVisitor);
50+
Files.walkFileTree(tempDir,
51+
new AndFileFilter(countingFileFilter, DirectoryFileFilter.INSTANCE, EmptyFileFilter.EMPTY));
52+
assertCounts(1, 0, 0, accPathVisitor.getPathCounters());
53+
assertEquals(1, accPathVisitor.getDirList().size());
54+
assertTrue(accPathVisitor.getFileList().isEmpty());
55+
}
56+
57+
/**
58+
* Tests a directory with one file of size 0.
59+
*/
60+
@Test
61+
public void testFolders1FileSize0() throws IOException {
62+
final AccumulatorPathVisitor accPathVisitor = AccumulatorPathVisitor.withLongCounters();
63+
final PathVisitorFileFilter countingFileFilter = new PathVisitorFileFilter(accPathVisitor);
64+
Files.walkFileTree(Paths.get("src/test/resources/org/apache/commons/io/dirs-1-file-size-0"),
65+
countingFileFilter);
66+
assertCounts(1, 1, 0, accPathVisitor.getPathCounters());
67+
assertEquals(1, accPathVisitor.getDirList().size());
68+
assertEquals(1, accPathVisitor.getFileList().size());
69+
}
70+
71+
/**
72+
* Tests a directory with one file of size 1.
73+
*/
74+
@Test
75+
public void testFolders1FileSize1() throws IOException {
76+
final AccumulatorPathVisitor accPathVisitor = AccumulatorPathVisitor.withLongCounters();
77+
final PathVisitorFileFilter countingFileFilter = new PathVisitorFileFilter(accPathVisitor);
78+
Files.walkFileTree(Paths.get("src/test/resources/org/apache/commons/io/dirs-1-file-size-1"),
79+
countingFileFilter);
80+
assertCounts(1, 1, 1, accPathVisitor.getPathCounters());
81+
assertEquals(1, accPathVisitor.getDirList().size());
82+
assertEquals(1, accPathVisitor.getFileList().size());
83+
}
84+
85+
/**
86+
* Tests a directory with two subdirectories, each containing one file of size 1.
87+
*/
88+
@Test
89+
public void testFolders2FileSize2() throws IOException {
90+
final AccumulatorPathVisitor accPathVisitor = AccumulatorPathVisitor.withLongCounters();
91+
final PathVisitorFileFilter countingFileFilter = new PathVisitorFileFilter(accPathVisitor);
92+
Files.walkFileTree(Paths.get("src/test/resources/org/apache/commons/io/dirs-2-file-size-2"),
93+
countingFileFilter);
94+
assertCounts(3, 2, 2, accPathVisitor.getPathCounters());
95+
assertEquals(3, accPathVisitor.getDirList().size());
96+
assertEquals(2, accPathVisitor.getFileList().size());
97+
98+
}
99+
}

0 commit comments

Comments
 (0)