001 package railo.runtime.cache.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.cache.CacheKeyFilter; 010 011 /** 012 * Wildcard Filter 013 */ 014 public class WildCardFilter implements CacheKeyFilter { 015 016 private static final String specials="{}[]().+\\^$"; 017 018 private final Pattern pattern; 019 private final PatternMatcher matcher=new Perl5Matcher(); 020 private final String wildcard; 021 022 private boolean ignoreCase; 023 024 025 /** 026 * @param wildcard 027 * @throws MalformedPatternException 028 */ 029 public WildCardFilter(String wildcard,boolean ignoreCase) throws MalformedPatternException { 030 this.wildcard=wildcard; 031 this.ignoreCase=ignoreCase; 032 StringBuffer sb = new StringBuffer(wildcard.length()); 033 int len=wildcard.length(); 034 035 for(int i=0;i<len;i++) { 036 char c = wildcard.charAt(i); 037 if(c == '*')sb.append(".*"); 038 else if(c == '?') sb.append('.'); 039 else if(specials.indexOf(c)!=-1)sb.append('\\').append(c); 040 else sb.append(c); 041 } 042 pattern=new Perl5Compiler().compile(ignoreCase?sb.toString().toLowerCase():sb.toString()); 043 } 044 045 /** 046 * @see railo.commons.io.cache.CacheKeyFilter#accept(java.lang.String) 047 */ 048 public boolean accept(String key) { 049 return matcher.matches(ignoreCase?key.toLowerCase():key, pattern); 050 } 051 052 /** 053 * 054 * @see java.lang.Object#toString() 055 */ 056 public String toString() { 057 return "Wildcardfilter:"+wildcard; 058 } 059 060 /** 061 * @see railo.commons.io.cache.CacheFilter#toPattern() 062 */ 063 public String toPattern() { 064 return wildcard; 065 } 066 067 }