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 /** 052 * @see railo.commons.io.res.filter.ResourceFilter#accept(railo.commons.io.res.Resource) 053 */ 054 public boolean accept(Resource file) { 055 return matcher.matches(ignoreCase?StringUtil.toLowerCase(file.getName()):file.getName(), pattern); 056 } 057 058 public boolean accept(Resource parent, String name) { 059 //print.out("accept:"+name); 060 return matcher.matches(ignoreCase?StringUtil.toLowerCase(name):name, pattern); 061 } 062 public boolean accept(String name) { 063 return matcher.matches(ignoreCase?StringUtil.toLowerCase(name):name, pattern); 064 } 065 066 /** 067 * 068 * @see java.lang.Object#toString() 069 */ 070 public String toString() { 071 return "Wildcardfilter:"+wildcard; 072 } 073 074 }