1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.io.filefilter;
18
19 import java.io.File;
20 import java.io.FileFilter;
21 import java.io.Serializable;
22 import java.nio.file.FileVisitResult;
23 import java.nio.file.Path;
24 import java.nio.file.attribute.BasicFileAttributes;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.Objects;
29 import java.util.stream.Stream;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class AndFileFilter extends AbstractFileFilter implements ConditionalFileFilter, Serializable {
46
47 private static final long serialVersionUID = 7215974688563965257L;
48
49
50 private final List<IOFileFilter> fileFilters;
51
52
53
54
55
56
57 public AndFileFilter() {
58 this(0);
59 }
60
61
62
63
64
65
66 private AndFileFilter(final ArrayList<IOFileFilter> initialList) {
67 this.fileFilters = Objects.requireNonNull(initialList, "initialList");
68 }
69
70
71
72
73
74
75 private AndFileFilter(final int initialCapacity) {
76 this(new ArrayList<>(initialCapacity));
77 }
78
79
80
81
82
83
84
85 public AndFileFilter(final IOFileFilter... fileFilters) {
86 this(Objects.requireNonNull(fileFilters, "fileFilters").length);
87 addFileFilter(fileFilters);
88 }
89
90
91
92
93
94
95
96
97 public AndFileFilter(final IOFileFilter filter1, final IOFileFilter filter2) {
98 this(2);
99 addFileFilter(filter1);
100 addFileFilter(filter2);
101 }
102
103
104
105
106
107
108
109
110 public AndFileFilter(final List<IOFileFilter> fileFilters) {
111 this(new ArrayList<>(Objects.requireNonNull(fileFilters, "fileFilters")));
112 }
113
114
115
116
117 @Override
118 public boolean accept(final File file) {
119 return !isEmpty() && fileFilters.stream().allMatch(fileFilter -> fileFilter.accept(file));
120 }
121
122
123
124
125 @Override
126 public boolean accept(final File file, final String name) {
127 return !isEmpty() && fileFilters.stream().allMatch(fileFilter -> fileFilter.accept(file, name));
128 }
129
130
131
132
133
134 @Override
135 public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
136 return isEmpty() ? FileVisitResult.TERMINATE
137 : toDefaultFileVisitResult(fileFilters.stream().allMatch(fileFilter -> fileFilter.accept(file, attributes) == FileVisitResult.CONTINUE));
138 }
139
140
141
142
143 @Override
144 public void addFileFilter(final IOFileFilter fileFilter) {
145 fileFilters.add(Objects.requireNonNull(fileFilter, "fileFilter"));
146 }
147
148
149
150
151
152
153
154 public void addFileFilter(final IOFileFilter... fileFilters) {
155 Stream.of(Objects.requireNonNull(fileFilters, "fileFilters")).forEach(this::addFileFilter);
156 }
157
158
159
160
161 @Override
162 public List<IOFileFilter> getFileFilters() {
163 return Collections.unmodifiableList(fileFilters);
164 }
165
166 private boolean isEmpty() {
167 return fileFilters.isEmpty();
168 }
169
170
171
172
173 @Override
174 public boolean removeFileFilter(final IOFileFilter ioFileFilter) {
175 return fileFilters.remove(ioFileFilter);
176 }
177
178
179
180
181 @Override
182 public void setFileFilters(final List<IOFileFilter> fileFilters) {
183 this.fileFilters.clear();
184 this.fileFilters.addAll(fileFilters);
185 }
186
187
188
189
190
191
192 @Override
193 public String toString() {
194 final StringBuilder buffer = new StringBuilder();
195 buffer.append(super.toString());
196 buffer.append("(");
197 append(fileFilters, buffer);
198 buffer.append(")");
199 return buffer.toString();
200 }
201
202 }