package org.atomnuke.pubsub.sub;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.atomnuke.atom.model.Category;
import org.atomnuke.atom.model.Entry;
import org.atomnuke.pubsub.api.type.SubscriptionCategory;
import org.atomnuke.sink.eps.selector.EntrySelector;
import org.atomnuke.sink.eps.selector.SelectorResult;
/**
*
* @author zinic
*/
public class RegexCategorySelector implements EntrySelector {
private final Set<Pattern> compiledPatterns;
public RegexCategorySelector() {
compiledPatterns = new HashSet<Pattern>();
}
public synchronized void selectOn(SubscriptionCategory category) {
final String searchCat = subscriptionCategoryToString(category);
//TODO: if we're doing translation of the search category than chances are we're going to want to sanitize it better - for now, be lazy
String saitizedString = searchCat.replace(".", "\\.");
saitizedString = saitizedString.replace("*", ".*");
final Pattern pattern = Pattern.compile(saitizedString);
compiledPatterns.add(pattern);
}
private static String subscriptionCategoryToString(SubscriptionCategory cat) {
final StringBuilder searchCatBuilder = new StringBuilder();
if (!StringUtils.isBlank(cat.getScheme())) {
searchCatBuilder.append(cat.getScheme());
}
if (!StringUtils.isBlank(cat.getTerm())) {
searchCatBuilder.append(cat.getTerm());
}
return searchCatBuilder.toString();
}
private static String categoryToString(Category cat) {
final StringBuilder searchCatBuilder = new StringBuilder();
if (!StringUtils.isBlank(cat.scheme())) {
searchCatBuilder.append(cat.scheme());
}
if (!StringUtils.isBlank(cat.term())) {
searchCatBuilder.append(cat.term());
}
return searchCatBuilder.toString();
}
@Override
public synchronized SelectorResult select(Entry entry) {
for (Category cat : entry.categories()) {
final String searchCat = categoryToString(cat);
if (StringUtils.isNotBlank(searchCat)) {
for (Pattern pattern : compiledPatterns) {
if (pattern.matcher(searchCat).matches()) {
return SelectorResult.PROCESS;
}
}
}
}
return SelectorResult.PASS;
}
}