View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.vfs2.filter;
18  
19  import java.io.Serializable;
20  import java.util.ArrayList;
21  import java.util.Arrays;
22  import java.util.Collections;
23  import java.util.List;
24  import java.util.Objects;
25  
26  import org.apache.commons.lang3.ArrayUtils;
27  import org.apache.commons.vfs2.FileFilter;
28  import org.apache.commons.vfs2.FileSelectInfo;
29  import org.apache.commons.vfs2.FileSystemException;
30  
31  /**
32   * A filter providing conditional AND logic across a list of file filters. This
33   * filter returns {@code true} if all filters in the list return {@code true}.
34   * Otherwise, it returns {@code false}. Checking of the file filter list stops
35   * when the first filter returns {@code false}.
36   *
37   * @author This code was originally ported from Apache Commons IO File Filter
38   * @see "https://commons.apache.org/proper/commons-io/"
39   * @since 2.4
40   */
41  public class AndFileFilter implements FileFilter, ConditionalFileFilter, Serializable {
42  
43      private static final long serialVersionUID = 1L;
44  
45      /** The list of file filters. */
46      private final List<FileFilter> fileFilters;
47  
48      /**
49       * Default constructor.
50       */
51      public AndFileFilter() {
52          fileFilters = new ArrayList<>();
53      }
54  
55      /**
56       * Constructs a new file filter that ANDs the result of other filters.
57       *
58       * @param filters array of filters, must not be null or empty
59       */
60      public AndFileFilter(final FileFilter... filters) {
61          if (ArrayUtils.isEmpty(filters)) {
62              throw new IllegalArgumentException("The filters must not be null or empty");
63          }
64          for (final FileFilter filter : filters) {
65              if (filter == null) {
66                  throw new IllegalArgumentException("Null filters are not allowed");
67              }
68          }
69          fileFilters = new ArrayList<>(Arrays.asList(filters));
70      }
71  
72      /**
73       * Constructs a new instance of {@code AndFileFilter} with the specified
74       * list of filters.
75       *
76       * @param fileFilters a List of FileFilter instances, copied, null ignored
77       */
78      public AndFileFilter(final List<FileFilter> fileFilters) {
79          if (fileFilters == null) {
80              this.fileFilters = new ArrayList<>();
81          } else {
82              this.fileFilters = new ArrayList<>(fileFilters);
83          }
84      }
85  
86      @Override
87      public boolean accept(final FileSelectInfo fileSelectInfo) throws FileSystemException {
88          if (fileFilters.isEmpty()) {
89              return false;
90          }
91          for (final FileFilter fileFilter : fileFilters) {
92              if (!fileFilter.accept(fileSelectInfo)) {
93                  return false;
94              }
95          }
96          return true;
97      }
98  
99      @Override
100     public void addFileFilter(final FileFilter fileFilter) {
101         fileFilters.add(fileFilter);
102     }
103 
104     @Override
105     public List<FileFilter> getFileFilters() {
106         return Collections.unmodifiableList(fileFilters);
107     }
108 
109     @Override
110     public boolean removeFileFilter(final FileFilter fileFilter) {
111         return fileFilters.remove(fileFilter);
112     }
113 
114     @Override
115     public void setFileFilters(final List<FileFilter> fileFilters) {
116         this.fileFilters.clear();
117         this.fileFilters.addAll(fileFilters);
118     }
119 
120     /**
121      * Provide a String representation of this file filter.
122      *
123      * @return a String representation
124      */
125     @Override
126     public String toString() {
127         final StringBuilder buffer = new StringBuilder();
128         buffer.append(super.toString());
129         buffer.append("(");
130         if (fileFilters != null) {
131             for (int i = 0; i < fileFilters.size(); i++) {
132                 if (i > 0) {
133                     buffer.append(",");
134                 }
135                 buffer.append(Objects.toString(fileFilters.get(i)));
136             }
137         }
138         buffer.append(")");
139         return buffer.toString();
140     }
141 
142 }