This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
The following commit(s) were added to refs/heads/master by this push: new 5d3b195 Refactor and simplify new boolean APIs. 5d3b195 is described below commit 5d3b1955c48dc08bcaeab4a9a71a92cf1189b6f2 Author: Gary Gregory <gardgreg...@gmail.com> AuthorDate: Sun Oct 18 16:24:02 2020 -0400 Refactor and simplify new boolean APIs. --- .../commons/io/filefilter/AndFileFilter.java | 77 ++++++++++++-------- .../commons/io/filefilter/FalseFileFilter.java | 19 +++++ .../apache/commons/io/filefilter/IOFileFilter.java | 12 +-- .../commons/io/filefilter/NotFileFilter.java | 2 +- .../apache/commons/io/filefilter/OrFileFilter.java | 85 +++++++++++++--------- .../commons/io/filefilter/TrueFileFilter.java | 18 +++++ .../commons/io/filefilter/FileFilterTestCase.java | 25 ++----- 7 files changed, 148 insertions(+), 90 deletions(-) diff --git a/src/main/java/org/apache/commons/io/filefilter/AndFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/AndFileFilter.java index 47e720a..b1c6f42 100644 --- a/src/main/java/org/apache/commons/io/filefilter/AndFileFilter.java +++ b/src/main/java/org/apache/commons/io/filefilter/AndFileFilter.java @@ -22,9 +22,9 @@ import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Objects; /** * A {@link java.io.FileFilter} providing conditional AND logic across a list of @@ -46,12 +46,30 @@ public class AndFileFilter private final List<IOFileFilter> fileFilters; /** - * Constructs a new instance of <code>AndFileFilter</code>. + * Constructs a new empty instance. * * @since 1.1 */ public AndFileFilter() { - this.fileFilters = new ArrayList<>(); + this(0); + } + + /** + * Constructs a new instance with the given initial list. + * + * @param initialList the initial list. + */ + private AndFileFilter(final ArrayList<IOFileFilter> initialList) { + this.fileFilters = Objects.requireNonNull(initialList); + } + + /** + * Constructs a new instance with the given initial capacity. + * + * @param initialCapacity the initial capacity. + */ + private AndFileFilter(int initialCapacity) { + this(new ArrayList<>(initialCapacity)); } /** @@ -62,43 +80,31 @@ public class AndFileFilter * @throws IllegalArgumentException if either filter is null */ public AndFileFilter(final IOFileFilter filter1, final IOFileFilter filter2) { - if (filter1 == null || filter2 == null) { - throw new IllegalArgumentException("The filters must not be null"); - } - this.fileFilters = new ArrayList<>(2); - this.fileFilters.add(filter1); - this.fileFilters.add(filter2); + this(2); + addFileFilter(filter1); + addFileFilter(filter2); } /** - * Constructs a new file filter that ANDs the result of other filters. + * Constructs a new instance for the give filters. + * @param fileFilters filters to OR. * - * @param filter1 the first filter, must not be null - * @param filters more filters, must not be null - * @throws IllegalArgumentException if either filter is null + * @since 2.9.0 */ - public AndFileFilter(final IOFileFilter filter1, final IOFileFilter... filters) { - if (filter1 == null || filters == null) { - throw new IllegalArgumentException("The filters must not be null"); - } - this.fileFilters = new ArrayList<>(filters.length + 1); - this.fileFilters.add(filter1); - this.fileFilters.addAll(Arrays.asList(filters)); + public AndFileFilter(final IOFileFilter... fileFilters) { + this(Objects.requireNonNull(fileFilters, "fileFilters").length); + addFileFilter(fileFilters); } /** * Constructs a new instance of <code>AndFileFilter</code> * with the specified list of filters. * - * @param fileFilters a List of IOFileFilter instances, copied, null ignored + * @param fileFilters a List of IOFileFilter instances, copied. * @since 1.1 */ public AndFileFilter(final List<IOFileFilter> fileFilters) { - if (fileFilters == null) { - this.fileFilters = new ArrayList<>(); - } else { - this.fileFilters = new ArrayList<>(fileFilters); - } + this(new ArrayList<>(Objects.requireNonNull(fileFilters))); } /** @@ -154,8 +160,20 @@ public class AndFileFilter * {@inheritDoc} */ @Override - public void addFileFilter(final IOFileFilter ioFileFilter) { - this.fileFilters.add(ioFileFilter); + public void addFileFilter(final IOFileFilter fileFilter) { + this.fileFilters.add(Objects.requireNonNull(fileFilter, "fileFilter")); + } + + /** + * Adds the given file filters. + * + * @param fileFilters the filters to add. + * @since 2.9.0 + */ + public void addFileFilter(final IOFileFilter... fileFilters) { + for (final IOFileFilter fileFilter : Objects.requireNonNull(fileFilters, "fileFilters")) { + addFileFilter(fileFilter); + } } /** @@ -201,8 +219,7 @@ public class AndFileFilter if (i > 0) { buffer.append(","); } - final Object filter = fileFilters.get(i); - buffer.append(filter == null ? "null" : filter.toString()); + buffer.append(Objects.toString(fileFilters.get(i))); } buffer.append(")"); return buffer.toString(); diff --git a/src/main/java/org/apache/commons/io/filefilter/FalseFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/FalseFileFilter.java index 338bf5b..a1c09ce 100644 --- a/src/main/java/org/apache/commons/io/filefilter/FalseFileFilter.java +++ b/src/main/java/org/apache/commons/io/filefilter/FalseFileFilter.java @@ -30,6 +30,8 @@ import java.nio.file.attribute.BasicFileAttributes; */ public class FalseFileFilter implements IOFileFilter, Serializable { + private static final String TO_STRING = Boolean.FALSE.toString(); + /** * Singleton instance of false filter. * @@ -76,6 +78,7 @@ public class FalseFileFilter implements IOFileFilter, Serializable { /** * Returns false. + * * @param file the file to check (ignored) * * @return false @@ -91,4 +94,20 @@ public class FalseFileFilter implements IOFileFilter, Serializable { return TrueFileFilter.INSTANCE; } + @Override + public String toString() { + return TO_STRING; + } + + @Override + public IOFileFilter and(IOFileFilter fileFilter) { + // FALSE AND expression <=> FALSE + return INSTANCE; + } + + @Override + public IOFileFilter or(IOFileFilter fileFilter) { + // FALSE OR expression <=> expression + return fileFilter; + } } diff --git a/src/main/java/org/apache/commons/io/filefilter/IOFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/IOFileFilter.java index 902b9cf..90df711 100644 --- a/src/main/java/org/apache/commons/io/filefilter/IOFileFilter.java +++ b/src/main/java/org/apache/commons/io/filefilter/IOFileFilter.java @@ -75,13 +75,13 @@ public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter { } /** - * Creates a new "and" filter with this filter and the given filters. + * Creates a new "and" filter with this filter. * - * @param fileFilter the filters to "and". + * @param fileFilter the filter to "and". * @return a new filter * @since 2.9.0 */ - default AndFileFilter and(final IOFileFilter... fileFilter) { + default IOFileFilter and(final IOFileFilter fileFilter) { return new AndFileFilter(this, fileFilter); } @@ -96,13 +96,13 @@ public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter { } /** - * Creates a new "or" filter with this filter and the given filters. + * Creates a new "or" filter with this filter. * - * @param fileFilter the filters to "or". + * @param fileFilter the filter to "or". * @return a new filter * @since 2.9.0 */ - default OrFileFilter or(final IOFileFilter... fileFilter) { + default IOFileFilter or(final IOFileFilter fileFilter) { return new OrFileFilter(this, fileFilter); } diff --git a/src/main/java/org/apache/commons/io/filefilter/NotFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/NotFileFilter.java index be437c0..0523fff 100644 --- a/src/main/java/org/apache/commons/io/filefilter/NotFileFilter.java +++ b/src/main/java/org/apache/commons/io/filefilter/NotFileFilter.java @@ -95,7 +95,7 @@ public class NotFileFilter extends AbstractFileFilter implements Serializable { */ @Override public String toString() { - return super.toString() + "(" + filter.toString() + ")"; + return "NOT (" + filter.toString() + ")"; } } diff --git a/src/main/java/org/apache/commons/io/filefilter/OrFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/OrFileFilter.java index 56af7f5..01c1e32 100644 --- a/src/main/java/org/apache/commons/io/filefilter/OrFileFilter.java +++ b/src/main/java/org/apache/commons/io/filefilter/OrFileFilter.java @@ -22,9 +22,9 @@ import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Objects; /** * 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 * @since 1.1 */ public OrFileFilter() { - this.fileFilters = new ArrayList<>(); + this(0); } /** - * Constructs a new file filter that ORs the result of other filters. + * Constructs a new instance with the given initial list. + * + * @param initialList the initial list. + */ + private OrFileFilter(final ArrayList<IOFileFilter> initialList) { + this.fileFilters = Objects.requireNonNull(initialList); + } + + /** + * Constructs a new instance with the given initial capacity. + * + * @param initialCapacity the initial capacity. + */ + private OrFileFilter(final int initialCapacity) { + this(new ArrayList<>(initialCapacity)); + } + + /** + * Constructs a new instance for the give filters. + * @param fileFilters filters to OR. * - * @param filter1 the first filter, must not be null - * @param filter2 the second filter, must not be null - * @throws IllegalArgumentException if either filter is null + * @since 2.9.0 */ - public OrFileFilter(final IOFileFilter filter1, final IOFileFilter filter2) { - if (filter1 == null || filter2 == null) { - throw new IllegalArgumentException("The filters must not be null"); - } - this.fileFilters = new ArrayList<>(2); - this.fileFilters.add(filter1); - this.fileFilters.add(filter2); + public OrFileFilter(final IOFileFilter... fileFilters) { + this(Objects.requireNonNull(fileFilters, "fileFilters").length); + addFileFilter(fileFilters); } /** * Constructs a new file filter that ORs the result of other filters. * * @param filter1 the first filter, must not be null - * @param filters more filter, must not be null + * @param filter2 the second filter, must not be null * @throws IllegalArgumentException if either filter is null */ - public OrFileFilter(final IOFileFilter filter1, final IOFileFilter... filters) { - if (filter1 == null || filters == null) { - throw new IllegalArgumentException("The filters must not be null"); - } - this.fileFilters = new ArrayList<>(filters.length + 1); - this.fileFilters.add(filter1); - this.fileFilters.addAll(Arrays.asList(filters)); + public OrFileFilter(final IOFileFilter filter1, final IOFileFilter filter2) { + this(2); + addFileFilter(filter1); + addFileFilter(filter2); } /** * Constructs a new instance of <code>OrFileFilter</code> with the specified filters. * - * @param fileFilters the file filters for this filter, copied, null ignored + * @param fileFilters the file filters for this filter, copied. * @since 1.1 */ public OrFileFilter(final List<IOFileFilter> fileFilters) { - if (fileFilters == null) { - this.fileFilters = new ArrayList<>(); - } else { - this.fileFilters = new ArrayList<>(fileFilters); - } + this(new ArrayList<>(Objects.requireNonNull(fileFilters))); } /** @@ -139,8 +145,20 @@ public class OrFileFilter extends AbstractFileFilter implements ConditionalFileF * {@inheritDoc} */ @Override - public void addFileFilter(final IOFileFilter ioFileFilter) { - this.fileFilters.add(ioFileFilter); + public void addFileFilter(final IOFileFilter fileFilter) { + this.fileFilters.add(Objects.requireNonNull(fileFilter, "fileFilter")); + } + + /** + * Adds the given file filters. + * + * @param fileFilters the filters to add. + * @since 2.9.0 + */ + public void addFileFilter(final IOFileFilter... fileFilters) { + for (final IOFileFilter fileFilter : Objects.requireNonNull(fileFilters, "fileFilters")) { + addFileFilter(fileFilter); + } } /** @@ -155,8 +173,8 @@ public class OrFileFilter extends AbstractFileFilter implements ConditionalFileF * {@inheritDoc} */ @Override - public boolean removeFileFilter(final IOFileFilter ioFileFilter) { - return this.fileFilters.remove(ioFileFilter); + public boolean removeFileFilter(final IOFileFilter fileFilter) { + return this.fileFilters.remove(fileFilter); } /** @@ -165,7 +183,7 @@ public class OrFileFilter extends AbstractFileFilter implements ConditionalFileF @Override public void setFileFilters(final List<IOFileFilter> fileFilters) { this.fileFilters.clear(); - this.fileFilters.addAll(fileFilters); + this.fileFilters.addAll(Objects.requireNonNull(fileFilters, "fileFilters")); } /** @@ -183,8 +201,7 @@ public class OrFileFilter extends AbstractFileFilter implements ConditionalFileF if (i > 0) { buffer.append(","); } - final Object filter = fileFilters.get(i); - buffer.append(filter == null ? "null" : filter.toString()); + buffer.append(Objects.toString(fileFilters.get(i))); } } buffer.append(")"); diff --git a/src/main/java/org/apache/commons/io/filefilter/TrueFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/TrueFileFilter.java index 7a394b7..7a4f335 100644 --- a/src/main/java/org/apache/commons/io/filefilter/TrueFileFilter.java +++ b/src/main/java/org/apache/commons/io/filefilter/TrueFileFilter.java @@ -30,6 +30,8 @@ import java.nio.file.attribute.BasicFileAttributes; */ public class TrueFileFilter implements IOFileFilter, Serializable { + private static final String TO_STRING = Boolean.TRUE.toString(); + private static final long serialVersionUID = 8782512160909720199L; /** @@ -91,4 +93,20 @@ public class TrueFileFilter implements IOFileFilter, Serializable { return FalseFileFilter.INSTANCE; } + @Override + public IOFileFilter or(final IOFileFilter fileFilter) { + // TRUE OR expression <=> true + return INSTANCE; + } + + @Override + public IOFileFilter and(final IOFileFilter fileFilter) { + // TRUE AND expression <=> expression + return fileFilter; + } + + @Override + public String toString() { + return TO_STRING; + } } diff --git a/src/test/java/org/apache/commons/io/filefilter/FileFilterTestCase.java b/src/test/java/org/apache/commons/io/filefilter/FileFilterTestCase.java index ca525b8..f5e7526 100644 --- a/src/test/java/org/apache/commons/io/filefilter/FileFilterTestCase.java +++ b/src/test/java/org/apache/commons/io/filefilter/FileFilterTestCase.java @@ -205,8 +205,6 @@ public class FileFilterTestCase { assertFiltering(trueFilter.and(falseFilter), new File("foo.test"), false); assertFiltering(falseFilter.and(trueFilter), new File("foo.test"), false); assertFiltering(falseFilter.and(trueFilter), new File("foo.test"), false); - assertFiltering(falseFilter.and(trueFilter, trueFilter), new File("foo.test"), false); - assertFiltering(falseFilter.and(trueFilter, trueFilter, trueFilter), new File("foo.test"), false); } @Test @@ -222,13 +220,9 @@ public class FileFilterTestCase { assertFiltering(new AndFileFilter(filters), new File("test"), false); assertFiltering(new AndFileFilter(), new File("test"), false); - assertThrows(IllegalArgumentException.class, () -> new AndFileFilter(falseFilter, (IOFileFilter) null)); - assertThrows(IllegalArgumentException.class, () -> new AndFileFilter(null, falseFilter)); - - final AndFileFilter f = new AndFileFilter((List<IOFileFilter>) null); - assertTrue(f.getFileFilters().isEmpty()); - - assertNotNull(f.toString()); // TODO better tests + assertThrows(NullPointerException.class, () -> new AndFileFilter(falseFilter, (IOFileFilter) null)); + assertThrows(NullPointerException.class, () -> new AndFileFilter(null, falseFilter)); + assertThrows(NullPointerException.class, () -> new AndFileFilter((List<IOFileFilter>) null)); } @Test @@ -519,6 +513,7 @@ public class FileFilterTestCase { assertSame(FalseFileFilter.FALSE, FalseFileFilter.INSTANCE); assertSame(TrueFileFilter.TRUE, FalseFileFilter.INSTANCE.negate()); assertSame(TrueFileFilter.INSTANCE, FalseFileFilter.INSTANCE.negate()); + assertNotNull(FalseFileFilter.INSTANCE.toString()); } @Test @@ -1339,8 +1334,6 @@ public class FileFilterTestCase { assertFiltering(new OrFileFilter(), testPath, false); // assertFiltering(falseFilter.or(trueFilter), testPath, true); - assertFiltering(falseFilter.or(falseFilter, trueFilter), testPath, true); - assertFiltering(falseFilter.or(falseFilter, falseFilter, trueFilter), testPath, true); final List<IOFileFilter> filters = new ArrayList<>(); filters.add(trueFilter); @@ -1364,14 +1357,7 @@ public class FileFilterTestCase { assertTrue(!orFilter.accept(testFile.getParentFile(), testFile.getName())); assertEquals(FileVisitResult.TERMINATE, orFilter.accept(testPath, null)); - try { - new OrFileFilter(falseFilter, (IOFileFilter) null); - fail(); - } catch (final IllegalArgumentException ex) { - } - - final OrFileFilter f = new OrFileFilter((List<IOFileFilter>) null); - assertTrue(f.getFileFilters().isEmpty()); + assertThrows(NullPointerException.class, () -> new OrFileFilter(falseFilter, (IOFileFilter) null)); } @Test @@ -1738,6 +1724,7 @@ public class FileFilterTestCase { assertSame(TrueFileFilter.TRUE, TrueFileFilter.INSTANCE); assertSame(FalseFileFilter.FALSE, TrueFileFilter.INSTANCE.negate()); assertSame(FalseFileFilter.INSTANCE, TrueFileFilter.INSTANCE.negate()); + assertNotNull(TrueFileFilter.INSTANCE.toString()); } @Test