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