package com.athena.asm.tool.notifier.selector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.athena.asm.data.Post;
import com.athena.asm.tool.notifier.PostField;
import com.athena.asm.tool.notifier.markup.Markup;
import com.athena.asm.tool.notifier.markup.MarkupUtils;
public class Selector {
private final boolean requirePostContent;
private List<Criteria> criterias;
/**
* 构造器
* @author aleck
*
*/
public static class SelectorBuilder {
private List<Criteria> criterias = new ArrayList<Criteria>();
public static SelectorBuilder create() {
return new SelectorBuilder();
}
public SelectorBuilder addCriteria(Criteria pc) {
criterias.add(pc);
return this;
}
public SelectorBuilder addKeywordCriteria(PostField field, KeywordCriteria.Type type, String keyword,
boolean caseSensitive, boolean wholeWordOnly) {
criterias.add(new KeywordCriteria(field, type, keyword, caseSensitive, wholeWordOnly));
return this;
}
public SelectorBuilder addDateCriteria(DateCriteria.Type type, Date base) {
criterias.add(new DateCriteria(type, base));
return this;
}
public SelectorBuilder addAuthorCriteria(String expected, boolean caseSensitive) {
criterias.add(new AuthorCriteria(expected, caseSensitive));
return this;
}
public SelectorBuilder addAttachmentCriteria() {
criterias.add(new AttachmentCriteria());
return this;
}
public Selector build() {
return new Selector(criterias);
}
}
private Selector(List<Criteria> criterias) {
this.criterias = new ArrayList<Criteria>(criterias);
requirePostContent = calcRequirePostContent();
}
/**
* 是否需要Post.content进行判断
* @return
*/
public boolean requirePostContent() {
return requirePostContent;
}
/**
* 一个对象是否符合达到条件
* @param entry
* @return
*/
public boolean qualify(Post post) {
boolean failed = false;
for (Criteria pc : criterias) {
if (!pc.qualify(post)) {
failed = true;
break;
}
}
return !(failed);
}
/**
* 将所有匹配的地方标记出来
* @param post
* @return
*/
public Map<PostField, List<Markup>> mark(Post post) {
List<Markup> markups = new ArrayList<Markup>();
for (Criteria pc : criterias) {
markups.addAll(pc.mark(post));
}
return MarkupUtils.tidy(markups);
}
/**
* 将collection中的所有达到要求的元素选取出来
* @param collection
* @return
*/
public List<Post> filter(Collection<Post> collection) {
List<Post> ret = new ArrayList<Post>();
for (Post entry : collection) {
if (qualify(entry)) {
ret.add(entry);
}
}
return ret;
}
/**
* 计算是否依赖于Post.content
* @return
*/
private boolean calcRequirePostContent() {
boolean requires = false;
for (Criteria pc : criterias) {
if (pc.requirePostContent()) {
requires = true;
break;
}
}
return requires;
}
}