Skip to content

Commit 5d3b195

Browse files
author
Gary Gregory
committed
Refactor and simplify new boolean APIs.
1 parent 37ba41f commit 5d3b195

7 files changed

Lines changed: 148 additions & 90 deletions

File tree

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

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
import java.nio.file.Path;
2323
import java.nio.file.attribute.BasicFileAttributes;
2424
import java.util.ArrayList;
25-
import java.util.Arrays;
2625
import java.util.Collections;
2726
import java.util.List;
27+
import java.util.Objects;
2828

2929
/**
3030
* A {@link java.io.FileFilter} providing conditional AND logic across a list of
@@ -46,12 +46,30 @@ public class AndFileFilter
4646
private final List<IOFileFilter> fileFilters;
4747

4848
/**
49-
* Constructs a new instance of <code>AndFileFilter</code>.
49+
* Constructs a new empty instance.
5050
*
5151
* @since 1.1
5252
*/
5353
public AndFileFilter() {
54-
this.fileFilters = new ArrayList<>();
54+
this(0);
55+
}
56+
57+
/**
58+
* Constructs a new instance with the given initial list.
59+
*
60+
* @param initialList the initial list.
61+
*/
62+
private AndFileFilter(final ArrayList<IOFileFilter> initialList) {
63+
this.fileFilters = Objects.requireNonNull(initialList);
64+
}
65+
66+
/**
67+
* Constructs a new instance with the given initial capacity.
68+
*
69+
* @param initialCapacity the initial capacity.
70+
*/
71+
private AndFileFilter(int initialCapacity) {
72+
this(new ArrayList<>(initialCapacity));
5573
}
5674

5775
/**
@@ -62,43 +80,31 @@ public AndFileFilter() {
6280
* @throws IllegalArgumentException if either filter is null
6381
*/
6482
public AndFileFilter(final IOFileFilter filter1, final IOFileFilter filter2) {
65-
if (filter1 == null || filter2 == null) {
66-
throw new IllegalArgumentException("The filters must not be null");
67-
}
68-
this.fileFilters = new ArrayList<>(2);
69-
this.fileFilters.add(filter1);
70-
this.fileFilters.add(filter2);
83+
this(2);
84+
addFileFilter(filter1);
85+
addFileFilter(filter2);
7186
}
7287

7388
/**
74-
* Constructs a new file filter that ANDs the result of other filters.
89+
* Constructs a new instance for the give filters.
90+
* @param fileFilters filters to OR.
7591
*
76-
* @param filter1 the first filter, must not be null
77-
* @param filters more filters, must not be null
78-
* @throws IllegalArgumentException if either filter is null
92+
* @since 2.9.0
7993
*/
80-
public AndFileFilter(final IOFileFilter filter1, final IOFileFilter... filters) {
81-
if (filter1 == null || filters == null) {
82-
throw new IllegalArgumentException("The filters must not be null");
83-
}
84-
this.fileFilters = new ArrayList<>(filters.length + 1);
85-
this.fileFilters.add(filter1);
86-
this.fileFilters.addAll(Arrays.asList(filters));
94+
public AndFileFilter(final IOFileFilter... fileFilters) {
95+
this(Objects.requireNonNull(fileFilters, "fileFilters").length);
96+
addFileFilter(fileFilters);
8797
}
8898

8999
/**
90100
* Constructs a new instance of <code>AndFileFilter</code>
91101
* with the specified list of filters.
92102
*
93-
* @param fileFilters a List of IOFileFilter instances, copied, null ignored
103+
* @param fileFilters a List of IOFileFilter instances, copied.
94104
* @since 1.1
95105
*/
96106
public AndFileFilter(final List<IOFileFilter> fileFilters) {
97-
if (fileFilters == null) {
98-
this.fileFilters = new ArrayList<>();
99-
} else {
100-
this.fileFilters = new ArrayList<>(fileFilters);
101-
}
107+
this(new ArrayList<>(Objects.requireNonNull(fileFilters)));
102108
}
103109

104110
/**
@@ -154,8 +160,20 @@ public FileVisitResult accept(final Path file, final BasicFileAttributes attribu
154160
* {@inheritDoc}
155161
*/
156162
@Override
157-
public void addFileFilter(final IOFileFilter ioFileFilter) {
158-
this.fileFilters.add(ioFileFilter);
163+
public void addFileFilter(final IOFileFilter fileFilter) {
164+
this.fileFilters.add(Objects.requireNonNull(fileFilter, "fileFilter"));
165+
}
166+
167+
/**
168+
* Adds the given file filters.
169+
*
170+
* @param fileFilters the filters to add.
171+
* @since 2.9.0
172+
*/
173+
public void addFileFilter(final IOFileFilter... fileFilters) {
174+
for (final IOFileFilter fileFilter : Objects.requireNonNull(fileFilters, "fileFilters")) {
175+
addFileFilter(fileFilter);
176+
}
159177
}
160178

161179
/**
@@ -201,8 +219,7 @@ public String toString() {
201219
if (i > 0) {
202220
buffer.append(",");
203221
}
204-
final Object filter = fileFilters.get(i);
205-
buffer.append(filter == null ? "null" : filter.toString());
222+
buffer.append(Objects.toString(fileFilters.get(i)));
206223
}
207224
buffer.append(")");
208225
return buffer.toString();

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
*/
3131
public class FalseFileFilter implements IOFileFilter, Serializable {
3232

33+
private static final String TO_STRING = Boolean.FALSE.toString();
34+
3335
/**
3436
* Singleton instance of false filter.
3537
*
@@ -76,6 +78,7 @@ public boolean accept(final File dir, final String name) {
7678

7779
/**
7880
* Returns false.
81+
*
7982
* @param file the file to check (ignored)
8083
*
8184
* @return false
@@ -91,4 +94,20 @@ public IOFileFilter negate() {
9194
return TrueFileFilter.INSTANCE;
9295
}
9396

97+
@Override
98+
public String toString() {
99+
return TO_STRING;
100+
}
101+
102+
@Override
103+
public IOFileFilter and(IOFileFilter fileFilter) {
104+
// FALSE AND expression <=> FALSE
105+
return INSTANCE;
106+
}
107+
108+
@Override
109+
public IOFileFilter or(IOFileFilter fileFilter) {
110+
// FALSE OR expression <=> expression
111+
return fileFilter;
112+
}
94113
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ default FileVisitResult accept(final Path path, final BasicFileAttributes attrib
7575
}
7676

7777
/**
78-
* Creates a new "and" filter with this filter and the given filters.
78+
* Creates a new "and" filter with this filter.
7979
*
80-
* @param fileFilter the filters to "and".
80+
* @param fileFilter the filter to "and".
8181
* @return a new filter
8282
* @since 2.9.0
8383
*/
84-
default AndFileFilter and(final IOFileFilter... fileFilter) {
84+
default IOFileFilter and(final IOFileFilter fileFilter) {
8585
return new AndFileFilter(this, fileFilter);
8686
}
8787

@@ -96,13 +96,13 @@ default IOFileFilter negate() {
9696
}
9797

9898
/**
99-
* Creates a new "or" filter with this filter and the given filters.
99+
* Creates a new "or" filter with this filter.
100100
*
101-
* @param fileFilter the filters to "or".
101+
* @param fileFilter the filter to "or".
102102
* @return a new filter
103103
* @since 2.9.0
104104
*/
105-
default OrFileFilter or(final IOFileFilter... fileFilter) {
105+
default IOFileFilter or(final IOFileFilter fileFilter) {
106106
return new OrFileFilter(this, fileFilter);
107107
}
108108

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ private FileVisitResult not(final FileVisitResult accept) {
9595
*/
9696
@Override
9797
public String toString() {
98-
return super.toString() + "(" + filter.toString() + ")";
98+
return "NOT (" + filter.toString() + ")";
9999
}
100100

101101
}

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

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
import java.nio.file.Path;
2323
import java.nio.file.attribute.BasicFileAttributes;
2424
import java.util.ArrayList;
25-
import java.util.Arrays;
2625
import java.util.Collections;
2726
import java.util.List;
27+
import java.util.Objects;
2828

2929
/**
3030
* A {@link java.io.FileFilter} providing conditional OR logic across a list of file filters. This filter returns
@@ -47,53 +47,59 @@ public class OrFileFilter extends AbstractFileFilter implements ConditionalFileF
4747
* @since 1.1
4848
*/
4949
public OrFileFilter() {
50-
this.fileFilters = new ArrayList<>();
50+
this(0);
5151
}
5252

5353
/**
54-
* Constructs a new file filter that ORs the result of other filters.
54+
* Constructs a new instance with the given initial list.
55+
*
56+
* @param initialList the initial list.
57+
*/
58+
private OrFileFilter(final ArrayList<IOFileFilter> initialList) {
59+
this.fileFilters = Objects.requireNonNull(initialList);
60+
}
61+
62+
/**
63+
* Constructs a new instance with the given initial capacity.
64+
*
65+
* @param initialCapacity the initial capacity.
66+
*/
67+
private OrFileFilter(final int initialCapacity) {
68+
this(new ArrayList<>(initialCapacity));
69+
}
70+
71+
/**
72+
* Constructs a new instance for the give filters.
73+
* @param fileFilters filters to OR.
5574
*
56-
* @param filter1 the first filter, must not be null
57-
* @param filter2 the second filter, must not be null
58-
* @throws IllegalArgumentException if either filter is null
75+
* @since 2.9.0
5976
*/
60-
public OrFileFilter(final IOFileFilter filter1, final IOFileFilter filter2) {
61-
if (filter1 == null || filter2 == null) {
62-
throw new IllegalArgumentException("The filters must not be null");
63-
}
64-
this.fileFilters = new ArrayList<>(2);
65-
this.fileFilters.add(filter1);
66-
this.fileFilters.add(filter2);
77+
public OrFileFilter(final IOFileFilter... fileFilters) {
78+
this(Objects.requireNonNull(fileFilters, "fileFilters").length);
79+
addFileFilter(fileFilters);
6780
}
6881

6982
/**
7083
* Constructs a new file filter that ORs the result of other filters.
7184
*
7285
* @param filter1 the first filter, must not be null
73-
* @param filters more filter, must not be null
86+
* @param filter2 the second filter, must not be null
7487
* @throws IllegalArgumentException if either filter is null
7588
*/
76-
public OrFileFilter(final IOFileFilter filter1, final IOFileFilter... filters) {
77-
if (filter1 == null || filters == null) {
78-
throw new IllegalArgumentException("The filters must not be null");
79-
}
80-
this.fileFilters = new ArrayList<>(filters.length + 1);
81-
this.fileFilters.add(filter1);
82-
this.fileFilters.addAll(Arrays.asList(filters));
89+
public OrFileFilter(final IOFileFilter filter1, final IOFileFilter filter2) {
90+
this(2);
91+
addFileFilter(filter1);
92+
addFileFilter(filter2);
8393
}
8494

8595
/**
8696
* Constructs a new instance of <code>OrFileFilter</code> with the specified filters.
8797
*
88-
* @param fileFilters the file filters for this filter, copied, null ignored
98+
* @param fileFilters the file filters for this filter, copied.
8999
* @since 1.1
90100
*/
91101
public OrFileFilter(final List<IOFileFilter> fileFilters) {
92-
if (fileFilters == null) {
93-
this.fileFilters = new ArrayList<>();
94-
} else {
95-
this.fileFilters = new ArrayList<>(fileFilters);
96-
}
102+
this(new ArrayList<>(Objects.requireNonNull(fileFilters)));
97103
}
98104

99105
/**
@@ -139,8 +145,20 @@ public FileVisitResult accept(final Path file, final BasicFileAttributes attribu
139145
* {@inheritDoc}
140146
*/
141147
@Override
142-
public void addFileFilter(final IOFileFilter ioFileFilter) {
143-
this.fileFilters.add(ioFileFilter);
148+
public void addFileFilter(final IOFileFilter fileFilter) {
149+
this.fileFilters.add(Objects.requireNonNull(fileFilter, "fileFilter"));
150+
}
151+
152+
/**
153+
* Adds the given file filters.
154+
*
155+
* @param fileFilters the filters to add.
156+
* @since 2.9.0
157+
*/
158+
public void addFileFilter(final IOFileFilter... fileFilters) {
159+
for (final IOFileFilter fileFilter : Objects.requireNonNull(fileFilters, "fileFilters")) {
160+
addFileFilter(fileFilter);
161+
}
144162
}
145163

146164
/**
@@ -155,8 +173,8 @@ public List<IOFileFilter> getFileFilters() {
155173
* {@inheritDoc}
156174
*/
157175
@Override
158-
public boolean removeFileFilter(final IOFileFilter ioFileFilter) {
159-
return this.fileFilters.remove(ioFileFilter);
176+
public boolean removeFileFilter(final IOFileFilter fileFilter) {
177+
return this.fileFilters.remove(fileFilter);
160178
}
161179

162180
/**
@@ -165,7 +183,7 @@ public boolean removeFileFilter(final IOFileFilter ioFileFilter) {
165183
@Override
166184
public void setFileFilters(final List<IOFileFilter> fileFilters) {
167185
this.fileFilters.clear();
168-
this.fileFilters.addAll(fileFilters);
186+
this.fileFilters.addAll(Objects.requireNonNull(fileFilters, "fileFilters"));
169187
}
170188

171189
/**
@@ -183,8 +201,7 @@ public String toString() {
183201
if (i > 0) {
184202
buffer.append(",");
185203
}
186-
final Object filter = fileFilters.get(i);
187-
buffer.append(filter == null ? "null" : filter.toString());
204+
buffer.append(Objects.toString(fileFilters.get(i)));
188205
}
189206
}
190207
buffer.append(")");

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
*/
3131
public class TrueFileFilter implements IOFileFilter, Serializable {
3232

33+
private static final String TO_STRING = Boolean.TRUE.toString();
34+
3335
private static final long serialVersionUID = 8782512160909720199L;
3436

3537
/**
@@ -91,4 +93,20 @@ public IOFileFilter negate() {
9193
return FalseFileFilter.INSTANCE;
9294
}
9395

96+
@Override
97+
public IOFileFilter or(final IOFileFilter fileFilter) {
98+
// TRUE OR expression <=> true
99+
return INSTANCE;
100+
}
101+
102+
@Override
103+
public IOFileFilter and(final IOFileFilter fileFilter) {
104+
// TRUE AND expression <=> expression
105+
return fileFilter;
106+
}
107+
108+
@Override
109+
public String toString() {
110+
return TO_STRING;
111+
}
94112
}

0 commit comments

Comments
 (0)