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.io.filefilter;
18  
19  import java.io.File;
20  import java.io.Serializable;
21  import java.util.ArrayList;
22  import java.util.Collections;
23  import java.util.List;
24  
25  /**
26   * A {@link java.io.FileFilter} providing conditional AND logic across a list of
27   * file filters. This filter returns <code>true</code> if all filters in the
28   * list return <code>true</code>. Otherwise, it returns <code>false</code>.
29   * Checking of the file filter list stops when the first filter returns
30   * <code>false</code>.
31   *
32   * @since Commons IO 1.0
33   * @version $Revision: 619112 $ $Date: 2008-02-06 19:25:47 +0000 (Wed, 06 Feb 2008) $
34   *
35   * @author Steven Caswell
36   */
37  public class AndFileFilter
38          extends AbstractFileFilter
39          implements ConditionalFileFilter, Serializable {
40  
41      /** The list of file filters. */
42      private List<IOFileFilter> fileFilters;
43  
44      /**
45       * Constructs a new instance of <code>AndFileFilter</code>.
46       *
47       * @since Commons IO 1.1
48       */
49      public AndFileFilter() {
50          this.fileFilters = new ArrayList<IOFileFilter>();
51      }
52  
53      /**
54       * Constructs a new instance of <code>AndFileFilter</code>
55       * with the specified list of filters.
56       *
57       * @param fileFilters  a List of IOFileFilter instances, copied, null ignored
58       * @since Commons IO 1.1
59       */
60      public AndFileFilter(final List<IOFileFilter> fileFilters) {
61          if (fileFilters == null) {
62              this.fileFilters = new ArrayList<IOFileFilter>();
63          } else {
64              this.fileFilters = new ArrayList<IOFileFilter>(fileFilters);
65          }
66      }
67  
68      /**
69       * Constructs a new file filter that ANDs the result of two other filters.
70       *
71       * @param filter1  the first filter, must not be null
72       * @param filter2  the second filter, must not be null
73       * @throws IllegalArgumentException if either filter is null
74       */
75      public AndFileFilter(IOFileFilter filter1, IOFileFilter filter2) {
76          if (filter1 == null || filter2 == null) {
77              throw new IllegalArgumentException("The filters must not be null");
78          }
79          this.fileFilters = new ArrayList<IOFileFilter>();
80          addFileFilter(filter1);
81          addFileFilter(filter2);
82      }
83  
84      /**
85       * {@inheritDoc}
86       */
87      public void addFileFilter(final IOFileFilter ioFileFilter) {
88          this.fileFilters.add(ioFileFilter);
89      }
90  
91      /**
92       * {@inheritDoc}
93       */
94      public List<IOFileFilter> getFileFilters() {
95          return Collections.unmodifiableList(this.fileFilters);
96      }
97  
98      /**
99       * {@inheritDoc}
100      */
101     public boolean removeFileFilter(final IOFileFilter ioFileFilter) {
102         return this.fileFilters.remove(ioFileFilter);
103     }
104 
105     /**
106      * {@inheritDoc}
107      */
108     public void setFileFilters(final List<IOFileFilter> fileFilters) {
109         this.fileFilters = new ArrayList<IOFileFilter>(fileFilters);
110     }
111 
112     /**
113      * {@inheritDoc}
114      */
115     public boolean accept(final File file) {
116         if (this.fileFilters.size() == 0) {
117             return false;
118         }
119         for (IOFileFilter fileFilter : fileFilters) {
120             if (!fileFilter.accept(file)) {
121                 return false;
122             }
123         }
124         return true;
125     }
126 
127     /**
128      * {@inheritDoc}
129      */
130     public boolean accept(final File file, final String name) {
131         if (this.fileFilters.size() == 0) {
132             return false;
133         }
134         for (IOFileFilter fileFilter : fileFilters) {
135             if (!fileFilter.accept(file, name)) {
136                 return false;
137             }
138         }
139         return true;
140     }
141 
142     /**
143      * Provide a String representaion of this file filter.
144      *
145      * @return a String representaion
146      */
147     public String toString() {
148         StringBuilder buffer = new StringBuilder();
149         buffer.append(super.toString());
150         buffer.append("(");
151         if (fileFilters != null) {
152             for (int i = 0; i < fileFilters.size(); i++) {
153                 if (i > 0) {
154                     buffer.append(",");
155                 }
156                 Object filter = fileFilters.get(i);
157                 buffer.append(filter == null ? "null" : filter.toString());
158             }
159         }
160         buffer.append(")");
161         return buffer.toString();
162     }
163 
164 }