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  
25  import org.apache.commons.lang3.ArrayUtils;
26  import org.apache.commons.vfs2.FileFilter;
27  import org.apache.commons.vfs2.FileSelectInfo;
28  import org.apache.commons.vfs2.FileSystemException;
29  
30  /**
31   * A filter providing conditional AND logic across a list of file filters. This
32   * filter returns {@code true} if all filters in the list return {@code true}.
33   * Otherwise, it returns {@code false}. Checking of the file filter list stops
34   * when the first filter returns {@code false}.
35   *
36   * @author This code was originally ported from Apache Commons IO File Filter
37   * @see "http://commons.apache.org/proper/commons-io/"
38   * @since 2.4
39   */
40  public class AndFileFilter implements FileFilter, ConditionalFileFilter, Serializable {
41  
42      private static final long serialVersionUID = 1L;
43  
44      /** The list of file filters. */
45      private final List<FileFilter> fileFilters;
46  
47      /**
48       * Default constructor.
49       */
50      public AndFileFilter() {
51          this.fileFilters = new ArrayList<>();
52      }
53  
54      /**
55       * Constructs a new file filter that ANDs the result of other filters.
56       *
57       * @param filters array of filters, must not be null or empty
58       */
59      public AndFileFilter(final FileFilter... filters) {
60          if (ArrayUtils.isEmpty(filters)) {
61              throw new IllegalArgumentException("The filters must not be null or empty");
62          }
63          for (final FileFilter filter : filters) {
64              if (filter == null) {
65                  throw new IllegalArgumentException("Null filters are not allowed");
66              }
67          }
68          this.fileFilters = new ArrayList<>(Arrays.asList(filters));
69      }
70  
71      /**
72       * Constructs a new instance of {@code AndFileFilter} with the specified
73       * list of filters.
74       *
75       * @param fileFilters a List of FileFilter instances, copied, null ignored
76       */
77      public AndFileFilter(final List<FileFilter> fileFilters) {
78          if (fileFilters == null) {
79              this.fileFilters = new ArrayList<>();
80          } else {
81              this.fileFilters = new ArrayList<>(fileFilters);
82          }
83      }
84  
85      @Override
86      public boolean accept(final FileSelectInfo fileSelectInfo) throws FileSystemException {
87          if (this.fileFilters.isEmpty()) {
88              return false;
89          }
90          for (final FileFilter fileFilter : fileFilters) {
91              if (!fileFilter.accept(fileSelectInfo)) {
92                  return false;
93              }
94          }
95          return true;
96      }
97  
98      @Override
99      public void addFileFilter(final FileFilter fileFilter) {
100         this.fileFilters.add(fileFilter);
101     }
102 
103     @Override
104     public List<FileFilter> getFileFilters() {
105         return Collections.unmodifiableList(this.fileFilters);
106     }
107 
108     @Override
109     public boolean removeFileFilter(final FileFilter fileFilter) {
110         return this.fileFilters.remove(fileFilter);
111     }
112 
113     @Override
114     public void setFileFilters(final List<FileFilter> fileFilters) {
115         this.fileFilters.clear();
116         this.fileFilters.addAll(fileFilters);
117     }
118 
119     /**
120      * Provide a String representation of this file filter.
121      *
122      * @return a String representation
123      */
124     @Override
125     public String toString() {
126         final StringBuilder buffer = new StringBuilder();
127         buffer.append(super.toString());
128         buffer.append("(");
129         if (fileFilters != null) {
130             for (int i = 0; i < fileFilters.size(); i++) {
131                 if (i > 0) {
132                     buffer.append(",");
133                 }
134                 final Object filter = fileFilters.get(i);
135                 buffer.append(filter == null ? "null" : filter.toString());
136             }
137         }
138         buffer.append(")");
139         return buffer.toString();
140     }
141 
142 }