001 package railo.commons.io.res.util; 002 003 import org.apache.oro.text.regex.MalformedPatternException; 004 import org.apache.oro.text.regex.Pattern; 005 import org.apache.oro.text.regex.PatternMatcher; 006 import org.apache.oro.text.regex.Perl5Compiler; 007 import org.apache.oro.text.regex.Perl5Matcher; 008 009 import railo.commons.io.SystemUtil; 010 import railo.commons.io.res.Resource; 011 import railo.commons.lang.StringUtil; 012 013 /** 014 * Wildcard Filter 015 */ 016 public class WildCardFilter implements ResourceAndResourceNameFilter { 017 018 private static final String specials="{}[]().+\\^$"; 019 private static final boolean IS_WIN=SystemUtil.isWindows(); 020 021 private final Pattern pattern; 022 private final PatternMatcher matcher=new Perl5Matcher(); 023 private final String wildcard; 024 private boolean ignoreCase; 025 026 public WildCardFilter(String wildcard) throws MalformedPatternException { 027 this(wildcard,IS_WIN); 028 } 029 030 /** 031 * @param wildcard 032 * @throws MalformedPatternException 033 */ 034 public WildCardFilter(String wildcard,boolean ignoreCase) throws MalformedPatternException { 035 this.wildcard=wildcard; 036 StringBuilder sb = new StringBuilder(wildcard.length()); 037 int len=wildcard.length(); 038 039 for(int i=0;i<len;i++) { 040 char c = wildcard.charAt(i); 041 if(c == '*')sb.append(".*"); 042 else if(c == '?') sb.append('.'); 043 else if(specials.indexOf(c)!=-1)sb.append('\\').append(c); 044 else sb.append(c); 045 } 046 047 this.ignoreCase=ignoreCase; 048 pattern=new Perl5Compiler().compile(ignoreCase?StringUtil.toLowerCase(sb.toString()):sb.toString()); 049 } 050 051 @Override 052 public boolean accept(Resource file) { 053 return matcher.matches(ignoreCase?StringUtil.toLowerCase(file.getName()):file.getName(), pattern); 054 } 055 056 public boolean accept(Resource parent, String name) { 057 //print.out("accept:"+name); 058 return matcher.matches(ignoreCase?StringUtil.toLowerCase(name):name, pattern); 059 } 060 public boolean accept(String name) { 061 return matcher.matches(ignoreCase?StringUtil.toLowerCase(name):name, pattern); 062 } 063 064 @Override 065 public String toString() { 066 return "Wildcardfilter:"+wildcard; 067 } 068 069 }