package hudson.plugins.checkstyle.rules; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.digester.Digester; import org.apache.commons.lang.StringUtils; import org.xml.sax.SAXException; /** * Reads the meta data of the Checkstyle rules from the DocBook files of the Checkstyle distribution. * * @author Ulli Hafner */ public final class CheckStyleRules { /** Mapping of rule names to rules. */ private final Map<String, Rule> rulesByName = new HashMap<String, Rule>(); /** Singleton instance. */ private static final CheckStyleRules INSTANCE = new CheckStyleRules(); /** * Returns the singleton instance. * * @return the singleton instance */ public static CheckStyleRules getInstance() { return INSTANCE; } /** * Creates the singleton instance. */ private CheckStyleRules() { // prevents instantiation } /** * Initializes the rules. */ public void initialize() { try { String[] ruleFiles = new String[] {"annotation", "coding", "design", "duplicates", "header", "imports", "javadoc", "metrics", "misc", "modifier", "naming", "regexp", "sizes", "whitespace"}; for (int i = 0; i < ruleFiles.length; i++) { InputStream inputStream = CheckStyleRules.class.getResourceAsStream("config_" + ruleFiles[i] + ".xml"); Digester digester = createDigester(); List<Rule> rules = new ArrayList<Rule>(); digester.push(rules); digester.parse(inputStream); for (Rule rule : rules) { rulesByName.put(rule.getName(), rule); } } } catch (ParserConfigurationException exception) { log(exception); } catch (IOException exception) { log(exception); } catch (SAXException exception) { log(exception); } } private void log(final Throwable exception) { Logger.getLogger(CheckStyleRules.class.getName()).log(Level.SEVERE, "Can't initialize checkstyle rules.", exception); } /** * Creates a new digester. * * @return the new digester. * @throws ParserConfigurationException * if digester is not configured properly */ private Digester createDigester() throws ParserConfigurationException { Digester digester = new Digester(); digester.setValidating(false); digester.setClassLoader(CheckStyleRules.class.getClassLoader()); String section = "*/section"; digester.addObjectCreate(section, Rule.class); digester.addSetProperties(section); digester.addSetNext(section, "add"); String subSection = "*/section/subsection"; digester.addObjectCreate(subSection, Topic.class); digester.addSetProperties(subSection); digester.addSetNext(subSection, "setDescription"); digester.addRule(subSection, new TopicRule()); return digester; } /** * Returns all Checkstyle rules. * * @return all Checkstyle rules */ public Collection<Rule> getRules() { return Collections.unmodifiableCollection(rulesByName.values()); } /** * Returns the Checkstyle rule with the specified name. * * @param name the name of the rule * @return the Checkstyle rule with the specified name. */ public Rule getRule(final String name) { Rule rule = rulesByName.get(name); if (rule == null) { rule = rulesByName.get(StringUtils.removeEnd(name, "Check")); } if (rule == null) { return new Rule(name); } return rule; } /** * Returns the description of the Checkstyle rule with the specified name. * * @param name the name of the rule * @return the description for the specified rule . */ public String getDescription(final String name) { return getRule(name).getDescription(); } }