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.List;
22  
23  import org.apache.commons.io.FilenameUtils;
24  import org.apache.commons.io.IOCase;
25  
26  /**
27   * Filters files using the supplied wildcards.
28   * <p>
29   * This filter selects files and directories based on one or more wildcards.
30   * Testing is case-sensitive by default, but this can be configured.
31   * <p>
32   * The wildcard matcher uses the characters '?' and '*' to represent a
33   * single or multiple wildcard characters.
34   * This is the same as often found on Dos/Unix command lines.
35   * The extension check is case-sensitive by .
36   * See {@link FilenameUtils#wildcardMatchOnSystem} for more information.
37   * <p>
38   * For example:
39   * <pre>
40   * File dir = new File(".");
41   * FileFilter fileFilter = new WildcardFileFilter("*test*.java~*~");
42   * File[] files = dir.listFiles(fileFilter);
43   * for (int i = 0; i < files.length; i++) {
44   *   System.out.println(files[i]);
45   * }
46   * </pre>
47   *
48   * @author Jason Anderson
49   * @version $Revision: 155419 $ $Date: 2008-02-06 19:25:47 +0000 (Wed, 06 Feb 2008) $
50   * @since Commons IO 1.3
51   */
52  public class WildcardFileFilter extends AbstractFileFilter implements Serializable {
53  
54      /** The wildcards that will be used to match filenames. */
55      private final String[] wildcards;
56      /** Whether the comparison is case sensitive. */
57      private final IOCase caseSensitivity;
58  
59      /**
60       * Construct a new case-sensitive wildcard filter for a single wildcard.
61       *
62       * @param wildcard  the wildcard to match
63       * @throws IllegalArgumentException if the pattern is null
64       */
65      public WildcardFileFilter(String wildcard) {
66          this(wildcard, null);
67      }
68  
69      /**
70       * Construct a new wildcard filter for a single wildcard specifying case-sensitivity.
71       *
72       * @param wildcard  the wildcard to match, not null
73       * @param caseSensitivity  how to handle case sensitivity, null means case-sensitive
74       * @throws IllegalArgumentException if the pattern is null
75       */
76      public WildcardFileFilter(String wildcard, IOCase caseSensitivity) {
77          if (wildcard == null) {
78              throw new IllegalArgumentException("The wildcard must not be null");
79          }
80          this.wildcards = new String[] { wildcard };
81          this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
82      }
83  
84      /**
85       * Construct a new case-sensitive wildcard filter for an array of wildcards.
86       * <p>
87       * The array is not cloned, so could be changed after constructing the
88       * instance. This would be inadvisable however.
89       *
90       * @param wildcards  the array of wildcards to match
91       * @throws IllegalArgumentException if the pattern array is null
92       */
93      public WildcardFileFilter(String[] wildcards) {
94          this(wildcards, null);
95      }
96  
97      /**
98       * Construct a new wildcard filter for an array of wildcards specifying case-sensitivity.
99       * <p>
100      * The array is not cloned, so could be changed after constructing the
101      * instance. This would be inadvisable however.
102      *
103      * @param wildcards  the array of wildcards to match, not null
104      * @param caseSensitivity  how to handle case sensitivity, null means case-sensitive
105      * @throws IllegalArgumentException if the pattern array is null
106      */
107     public WildcardFileFilter(String[] wildcards, IOCase caseSensitivity) {
108         if (wildcards == null) {
109             throw new IllegalArgumentException("The wildcard array must not be null");
110         }
111         this.wildcards = wildcards;
112         this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
113     }
114 
115     /**
116      * Construct a new case-sensitive wildcard filter for a list of wildcards.
117      *
118      * @param wildcards  the list of wildcards to match, not null
119      * @throws IllegalArgumentException if the pattern list is null
120      * @throws ClassCastException if the list does not contain Strings
121      */
122     public WildcardFileFilter(List<String> wildcards) {
123         this(wildcards, null);
124     }
125 
126     /**
127      * Construct a new wildcard filter for a list of wildcards specifying case-sensitivity.
128      *
129      * @param wildcards  the list of wildcards to match, not null
130      * @param caseSensitivity  how to handle case sensitivity, null means case-sensitive
131      * @throws IllegalArgumentException if the pattern list is null
132      * @throws ClassCastException if the list does not contain Strings
133      */
134     public WildcardFileFilter(List<String> wildcards, IOCase caseSensitivity) {
135         if (wildcards == null) {
136             throw new IllegalArgumentException("The wildcard list must not be null");
137         }
138         this.wildcards = wildcards.toArray(new String[wildcards.size()]);
139         this.caseSensitivity = (caseSensitivity == null ? IOCase.SENSITIVE : caseSensitivity);
140     }
141 
142     //-----------------------------------------------------------------------
143     /**
144      * Checks to see if the filename matches one of the wildcards.
145      *
146      * @param dir  the file directory
147      * @param name  the filename
148      * @return true if the filename matches one of the wildcards
149      */
150     public boolean accept(File dir, String name) {
151         for (int i = 0; i < wildcards.length; i++) {
152             if (FilenameUtils.wildcardMatch(name, wildcards[i], caseSensitivity)) {
153                 return true;
154             }
155         }
156         return false;
157     }
158 
159     /**
160      * Checks to see if the filename matches one of the wildcards.
161      *
162      * @param file  the file to check
163      * @return true if the filename matches one of the wildcards
164      */
165     public boolean accept(File file) {
166         String name = file.getName();
167         for (int i = 0; i < wildcards.length; i++) {
168             if (FilenameUtils.wildcardMatch(name, wildcards[i], caseSensitivity)) {
169                 return true;
170             }
171         }
172         return false;
173     }
174 
175     /**
176      * Provide a String representaion of this file filter.
177      *
178      * @return a String representaion
179      */
180     public String toString() {
181         StringBuilder buffer = new StringBuilder();
182         buffer.append(super.toString());
183         buffer.append("(");
184         if (wildcards != null) {
185             for (int i = 0; i < wildcards.length; i++) {
186                 if (i > 0) {
187                     buffer.append(",");
188                 }
189                 buffer.append(wildcards[i]);
190             }
191         }
192         buffer.append(")");
193         return buffer.toString();
194     }
195 
196 }