package railo.runtime.cache.util;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
import railo.commons.io.cache.CacheKeyFilter;
/**
* Wildcard Filter
*/
public class WildCardFilter implements CacheKeyFilter {
private static final String specials="{}[]().+\\^$";
private final Pattern pattern;
private final PatternMatcher matcher=new Perl5Matcher();
private final String wildcard;
private boolean ignoreCase;
/**
* @param wildcard
* @throws MalformedPatternException
*/
public WildCardFilter(String wildcard,boolean ignoreCase) throws MalformedPatternException {
this.wildcard=wildcard;
this.ignoreCase=ignoreCase;
StringBuffer sb = new StringBuffer(wildcard.length());
int len=wildcard.length();
for(int i=0;i<len;i++) {
char c = wildcard.charAt(i);
if(c == '*')sb.append(".*");
else if(c == '?') sb.append('.');
else if(specials.indexOf(c)!=-1)sb.append('\\').append(c);
else sb.append(c);
}
pattern=new Perl5Compiler().compile(ignoreCase?sb.toString().toLowerCase():sb.toString());
}
@Override
public boolean accept(String key) {
return matcher.matches(ignoreCase?key.toLowerCase():key, pattern);
}
@Override
public String toString() {
return "Wildcardfilter:"+wildcard;
}
@Override
public String toPattern() {
return wildcard;
}
}