package com.google.code.joto.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.collections.Predicate;
/**
* simple Pattern-based predicate for text includes + excludes
*/
public class PatternsPredicate implements Predicate/*<String>*/, Serializable {
/** internal for java.io.Serializable */
private static final long serialVersionUID = 1L;
private final List<Pattern> includePatterns;
private final List<Pattern> excludePatterns;
// ------------------------------------------------------------------------
public PatternsPredicate(List<Pattern> includePatterns, List<Pattern> excludePatterns) {
this.includePatterns = includePatterns;
this.excludePatterns = excludePatterns;
}
public static PatternsPredicate snewCompilePatterns(Collection<String> includeRegexps, Collection<String> excludeRegexps) {
return new PatternsPredicate(compilePatterns(includeRegexps), compilePatterns(excludeRegexps));
}
// ------------------------------------------------------------------------
@Override
public boolean evaluate(Object object) {
if (!(object instanceof String)) return false;
String str = (String) object;
boolean res = evaluate(str, includePatterns, excludePatterns);
return res;
}
public boolean evaluate(String str) {
if (str == null) return false;
boolean res = evaluate(str, includePatterns, excludePatterns);
return res;
}
// static utilities
// ------------------------------------------------------------------------
public static boolean evaluate(String text, List<Pattern> includePatterns, List<Pattern> excludePatterns) {
boolean res = true;
if (includePatterns != null) {
res = matchesAny(text, includePatterns);
}
if (res) {
if (excludePatterns != null) {
res = ! matchesAny(text, excludePatterns);
}
}
return res;
}
public static boolean matchesAny(String text, List<Pattern> patterns) {
boolean res = false;
if (patterns == null || patterns.isEmpty()) return false;
for(Pattern p : patterns) {
if (p.matcher(text).matches()) {
res = true;
break;
}
}
return res;
}
public static List<Pattern> compilePatterns(Collection<String> regexs) {
if (regexs == null) return null;
List<Pattern> res = new ArrayList<Pattern>(regexs.size());
for(String regex : regexs) {
res.add(Pattern.compile(regex));
}
return res;
}
}