package net.sourceforge.pmd.eclipse.ui.preferences.br; import java.util.ArrayList; import java.util.List; import java.util.Set; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.eclipse.plugin.UISettings; import net.sourceforge.pmd.eclipse.ui.quickfix.PMDResolutionGenerator; import net.sourceforge.pmd.eclipse.util.Util; import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.rule.XPathRule; /** * A value and label extractor interface for anything implementing the Rule interface * and may be real fields or values held as properties. * * Value returned are typed as comparable to facilitate sorting. Never return null, * return an empty string instead. * * @author Brian Remedios */ public interface RuleFieldAccessor { // NOTE: If you update these values then you also need to update // the tooltip that references them: 'preference.ruleset.column.rule_type.tooltip' String[] ruleTypeGeneric= new String[] { "-", "Generic" }; String[] ruleTypeXPath = new String[] { "X", "XPath" }; String[] ruleTypeDFlow = new String[] { "D", "Dataflow" }; String[] ruleTypeTypeRes= new String[] { "T", "Type resolving" }; RuleFieldAccessor since = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { return rule.getSince(); } }; RuleFieldAccessor priority = new BasicRuleFieldAccessor() { public Comparable<?> valueFor(Rule rule) { return rule.getPriority(); } public String labelFor(Rule rule) { return UISettings.labelFor(rule.getPriority()); } public Comparable<?> valueFor(RuleCollection collection) { return RuleUtil.commonPriority(collection); } }; RuleFieldAccessor priorityName = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { return UISettings.labelFor(rule.getPriority()); } }; RuleFieldAccessor fixCount = new BasicRuleFieldAccessor() { public Comparable<Integer> valueFor(Rule rule) { return PMDResolutionGenerator.fixCountFor(rule); } }; RuleFieldAccessor name = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { return rule.getName(); } }; RuleFieldAccessor description = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { return rule.getDescription(); } }; RuleFieldAccessor usesDFA = new BasicRuleFieldAccessor() { public Comparable<Boolean> valueFor(Rule rule) { return rule.usesDFA(); } public Comparable<?> valueFor(RuleCollection collection) { return RuleUtil.allUseDfa(collection); } }; RuleFieldAccessor message = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { return rule.getMessage(); } }; RuleFieldAccessor url = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { return rule.getExternalInfoUrl(); } }; RuleFieldAccessor exampleCount = new BasicRuleFieldAccessor() { public Comparable<?> valueFor(Rule rule) { int count = rule.getExamples().size(); return count > 0 ? Integer.toString(count) : ""; } }; RuleFieldAccessor ruleType = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { StringBuilder sb = new StringBuilder(3); if (rule.hasDescriptor(XPathRule.XPATH_DESCRIPTOR)) sb.append(ruleTypeXPath[0]); if (rule.usesDFA()) sb.append(ruleTypeDFlow[0]); if (rule.usesTypeResolution()) sb.append(ruleTypeTypeRes[0]); if (sb.length() == 0) sb.append(ruleTypeGeneric[0]); return sb.toString(); } final int labelTypeIdx = 0; // just show the letter codes public String labelFor(Rule rule) { List<String> types = new ArrayList<String>(3); if (rule.hasDescriptor(XPathRule.XPATH_DESCRIPTOR)) types.add(ruleTypeXPath[labelTypeIdx]); // if (if (RuleUtil.isXPathRule(rule)) TODO if (rule.usesDFA()) types.add(ruleTypeDFlow[labelTypeIdx]); if (rule.usesTypeResolution()) types.add(ruleTypeTypeRes[labelTypeIdx]); if (types.isEmpty()) types.add(ruleTypeGeneric[labelTypeIdx]); return Util.asString(types, ", "); } }; RuleFieldAccessor language = new BasicRuleFieldAccessor() { public Comparable<Language> valueFor(Rule rule) { return rule.getLanguage(); } public String labelFor(Rule rule) { return rule.getLanguage().getName(); } }; RuleFieldAccessor minLanguageVersion = new BasicRuleFieldAccessor() { public Comparable<LanguageVersion> valueFor(Rule rule) { return rule.getMinimumLanguageVersion(); } }; RuleFieldAccessor maxLanguageVersion = new BasicRuleFieldAccessor() { public Comparable<LanguageVersion> valueFor(Rule rule) { return rule.getMaximumLanguageVersion(); } }; RuleFieldAccessor violationRegex = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { return rule.getProperty(Rule.VIOLATION_SUPPRESS_REGEX_DESCRIPTOR); } }; RuleFieldAccessor violationXPath = new BasicRuleFieldAccessor() { public Comparable<String> valueFor(Rule rule) { return rule.getProperty(Rule.VIOLATION_SUPPRESS_XPATH_DESCRIPTOR); } }; RuleFieldAccessor nonDefaultProperyCount = new BasicRuleFieldAccessor() { public Comparable<Integer> valueFor(Rule rule) { return RuleUtil.modifiedPropertiesIn(rule).size(); } }; /** * @param rule Rule * @return Comparable */ Comparable<?> valueFor(Rule rule); Comparable<?> valueFor(RuleCollection collection); Set<Comparable<?>> uniqueValuesFor(RuleCollection collection); String labelFor(Rule rule); }