/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.rule; import java.text.MessageFormat; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.util.StringUtil; public abstract class AbstractRuleViolationFactory implements RuleViolationFactory { private static final Object[] NO_ARGS = new Object[0]; private String cleanup(String message, Object[] args) { if (message != null) { // Escape PMD specific variable message format, specifically the { // in the ${, so MessageFormat doesn't bitch. final String escapedMessage = StringUtil.replaceString(message, "${", "$'{'"); return MessageFormat.format(escapedMessage, args != null ? args : NO_ARGS); } else { return message; } } @Override public void addViolation(RuleContext ruleContext, Rule rule, Node node, String message, Object[] args) { String formattedMessage = cleanup(message, args); ruleContext.getReport().addRuleViolation(createRuleViolation(rule, ruleContext, node, formattedMessage)); } @Override public void addViolation(RuleContext ruleContext, Rule rule, Node node, String message, int beginLine, int endLine, Object[] args) { String formattedMessage = cleanup(message, args); ruleContext.getReport() .addRuleViolation(createRuleViolation(rule, ruleContext, node, formattedMessage, beginLine, endLine)); } protected abstract RuleViolation createRuleViolation(Rule rule, RuleContext ruleContext, Node node, String message); protected abstract RuleViolation createRuleViolation(Rule rule, RuleContext ruleContext, Node node, String message, int beginLine, int endLine); }