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

Reply via email to