package net.sourceforge.pmd.eclipse.ui.preferences.br;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.lang.rule.properties.StringProperty;
import net.sourceforge.pmd.util.StringUtil;
/**
*
* @author BrianRemedios
*/
public class FilterManager {
private String newFilterPrefix;
private final StringProperty filterPropertyDesc;
private Map<String, List<Rule>> rulesByFilterName;
private Map<Integer, String> namesByFilterHash;
public FilterManager(StringProperty filterDesc, String filterPrefix) {
filterPropertyDesc = filterDesc;
newFilterPrefix = filterPrefix;
}
public void addFilter(String name, String source) {
}
public void addFilterFrom(Rule rule) {
if (rulesByFilterName == null) {
rulesByFilterName = new HashMap<String, List<Rule>>();
namesByFilterHash = new HashMap<Integer, String>();
}
String filter = rule.getProperty(filterPropertyDesc);
if (StringUtil.isEmpty(filter)) return;
filter = filter.trim();
int hashCode = filter.hashCode();
String name = namesByFilterHash.get(hashCode);
if (name == null) {
name = newName();
namesByFilterHash.put(hashCode, name);
rulesByFilterName.put(name, new ArrayList<Rule>());
}
rulesByFilterName.get(name).add(rule);
}
public void setFilter(String name, Rule rule) {
}
private String newName() {
return newFilterPrefix + namesByFilterHash.size();
}
public void setName(String name, String filterSource) {
int code = filterSource.trim().hashCode();
namesByFilterHash.put(code, name);
}
public String[] names() {
if (rulesByFilterName == null) return StringUtil.getEmptyStrings();
return rulesByFilterName.keySet().toArray(new String[rulesByFilterName.size()]);
}
public int referencesTo(String name) {
if (rulesByFilterName == null) return 0;
List<Rule> rules = rulesByFilterName.get(name);
return rules == null ? 0 : rules.size();
}
public void modify(String name, String newSource) {
if (rulesByFilterName == null) return;
String theSource = newSource.trim();
int hash = theSource.hashCode();
namesByFilterHash.put(hash, name);
for (Rule rule : rulesByFilterName.get(name)) {
rule.setProperty(filterPropertyDesc, theSource);
}
}
public void rename(String oldName, String newName) {
// TODO
}
public void remove(String name) {
for (Rule rule : rulesByFilterName.get(name)) {
rule.setProperty(filterPropertyDesc, null);
}
rulesByFilterName.remove(name);
int hashKey = 0; // do a reverse lookup
for (Map.Entry<Integer, String> entry : namesByFilterHash.entrySet()) {
if (entry.getValue().equals(name)) {
hashKey = entry.getKey();
break;
}
}
namesByFilterHash.remove(hashKey);
}
public void load() {
}
public void save() {
}
}