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