package topasin.filter;
import static topasin.util.TopAsinUtil.LB;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import topasin.util.AsinDetail;
/**
* filter supported asin field value
*
* @author mengzang
*
*/
public class AsinFieldsFilter implements AsinDetailFilter {
private static Set<String>[] fieldValues;
private static int[] fieldIndexs;
private AsinFieldsFilter() {
}
private static AsinFieldsFilter filter = null;
@SuppressWarnings("unchecked")
public static void initAsinFieldValueFilter(Map<String, List<String>> settings) {
if (settings == null || settings.size() == 0) {
return;
}
fieldIndexs = new int[settings.size()];
fieldValues = new Set[settings.size()];
int i = 0;
boolean createInstance = false;
for (Entry<String, List<String>> filterField : settings.entrySet()) {
fieldIndexs[i] = AsinDetail.getIndexFromFieldName(filterField.getKey());
fieldValues[i] = getSetFromListWithoutEmptyString(filterField.getValue());
createInstance |= (fieldValues[i] != null);
i++;
}
if (createInstance == true) {
filter = new AsinFieldsFilter();
}
}
public static AsinFieldsFilter getInstance() {
return filter;
}
private static Set<String> getSetFromListWithoutEmptyString(List<String> list) {
Set<String> ret = null;
if (list == null) {
return null;
}
for (String str : list) {
if (StringUtils.isNotBlank(str)) {
if (ret == null) {
ret = new HashSet<String>(list.size());
}
ret.add(str.trim());
}
}
return ret;
}
@Override
public AsinDetail filterAsinDetailLine(AsinDetail asinDetail) {
for (int i = 0; i < fieldIndexs.length; i++) {
if (fieldValues[i] == null) {
continue;
}
String fieldValue = asinDetail.getStringFieldValue(fieldIndexs[i]);
if (fieldValues[i].contains(fieldValue) == false) {
return null;
}
}
return asinDetail;
}
@Override
public String toString() {
StringBuilder filterDesc = new StringBuilder("AsinFieldValueFilter [");
for (int i = 0; i < fieldIndexs.length; i++) {
filterDesc.append(LB + "\t" + AsinDetail.getFieldDisplayNameFromIndex(fieldIndexs[i]));
filterDesc.append("=" + fieldValues[i]);
}
filterDesc.append(LB + "]");
return filterDesc.toString();
}
}