1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.io.file;
19
20 import java.io.IOException;
21 import java.math.BigInteger;
22 import java.nio.file.FileVisitResult;
23 import java.nio.file.Files;
24 import java.nio.file.Path;
25 import java.nio.file.attribute.BasicFileAttributes;
26 import java.util.Objects;
27
28 import org.apache.commons.io.file.Counters.PathCounters;
29 import org.apache.commons.io.filefilter.IOFileFilter;
30 import org.apache.commons.io.filefilter.SymbolicLinkFileFilter;
31 import org.apache.commons.io.filefilter.TrueFileFilter;
32 import org.apache.commons.io.function.IOBiFunction;
33
34
35
36
37
38
39 public class CountingPathVisitor extends SimplePathVisitor {
40
41 static final String[] EMPTY_STRING_ARRAY = {};
42
43 static IOFileFilter defaultDirFilter() {
44 return TrueFileFilter.INSTANCE;
45 }
46
47 static IOFileFilter defaultFileFilter() {
48 return new SymbolicLinkFileFilter(FileVisitResult.TERMINATE, FileVisitResult.CONTINUE);
49 }
50
51
52
53
54
55
56 public static CountingPathVisitor withBigIntegerCounters() {
57 return new CountingPathVisitor(Counters.bigIntegerPathCounters());
58 }
59
60
61
62
63
64
65 public static CountingPathVisitor withLongCounters() {
66 return new CountingPathVisitor(Counters.longPathCounters());
67 }
68
69 private final PathCounters pathCounters;
70 private final PathFilter fileFilter;
71 private final PathFilter dirFilter;
72
73
74
75
76
77
78 public CountingPathVisitor(final PathCounters pathCounter) {
79 this(pathCounter, defaultFileFilter(), defaultDirFilter());
80 }
81
82
83
84
85
86
87
88
89
90 public CountingPathVisitor(final PathCounters pathCounter, final PathFilter fileFilter, final PathFilter dirFilter) {
91 this.pathCounters = Objects.requireNonNull(pathCounter, "pathCounter");
92 this.fileFilter = Objects.requireNonNull(fileFilter, "fileFilter");
93 this.dirFilter = Objects.requireNonNull(dirFilter, "dirFilter");
94 }
95
96
97
98
99
100
101
102
103
104
105 public CountingPathVisitor(final PathCounters pathCounter, final PathFilter fileFilter, final PathFilter dirFilter,
106 final IOBiFunction<Path, IOException, FileVisitResult> visitFileFailed) {
107 super(visitFileFailed);
108 this.pathCounters = Objects.requireNonNull(pathCounter, "pathCounter");
109 this.fileFilter = Objects.requireNonNull(fileFilter, "fileFilter");
110 this.dirFilter = Objects.requireNonNull(dirFilter, "dirFilter");
111 }
112
113 @Override
114 public boolean equals(final Object obj) {
115 if (this == obj) {
116 return true;
117 }
118 if (!(obj instanceof CountingPathVisitor)) {
119 return false;
120 }
121 final CountingPathVisitor other = (CountingPathVisitor) obj;
122 return Objects.equals(pathCounters, other.pathCounters);
123 }
124
125
126
127
128
129
130 public PathCounters getPathCounters() {
131 return pathCounters;
132 }
133
134 @Override
135 public int hashCode() {
136 return Objects.hash(pathCounters);
137 }
138
139 @Override
140 public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException {
141 updateDirCounter(dir, exc);
142 return FileVisitResult.CONTINUE;
143 }
144
145 @Override
146 public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attributes) throws IOException {
147 final FileVisitResult accept = dirFilter.accept(dir, attributes);
148 return accept != FileVisitResult.CONTINUE ? FileVisitResult.SKIP_SUBTREE : FileVisitResult.CONTINUE;
149 }
150
151 @Override
152 public String toString() {
153 return pathCounters.toString();
154 }
155
156
157
158
159
160
161
162
163 protected void updateDirCounter(final Path dir, final IOException exc) {
164 pathCounters.getDirectoryCounter().increment();
165 }
166
167
168
169
170
171
172
173 protected void updateFileCounters(final Path file, final BasicFileAttributes attributes) {
174 pathCounters.getFileCounter().increment();
175 pathCounters.getByteCounter().add(attributes.size());
176 }
177
178 @Override
179 public FileVisitResult visitFile(final Path file, final BasicFileAttributes attributes) throws IOException {
180
181 if (Files.exists(file) && fileFilter.accept(file, attributes) == FileVisitResult.CONTINUE) {
182 updateFileCounters(file, attributes);
183 }
184 return FileVisitResult.CONTINUE;
185 }
186
187 }