01 package net.sourceforge.pmd.lang.rule;
02
03 import java.text.MessageFormat;
04
05 import net.sourceforge.pmd.Rule;
06 import net.sourceforge.pmd.RuleContext;
07 import net.sourceforge.pmd.RuleViolation;
08 import net.sourceforge.pmd.lang.ast.Node;
09 import net.sourceforge.pmd.util.StringUtil;
10
11 public abstract class AbstractRuleViolationFactory implements RuleViolationFactory {
12
13 private static final Object[] NO_ARGS = new Object[0];
14
15 public void addViolation(RuleContext ruleContext, Rule rule, Node node, String message, Object[] args) {
16 final String formattedMessage;
17 if (message != null) {
18 // Escape PMD specific variable message format, specifically the { in the ${, so MessageFormat doesn't bitch.
19 final String escapedMessage = StringUtil.replaceString(message, "${", "$'{'");
20 formattedMessage = MessageFormat.format(escapedMessage, args != null ? args : NO_ARGS);
21 } else {
22 formattedMessage = message;
23 }
24 ruleContext.getReport().addRuleViolation(createRuleViolation(rule, ruleContext, node, formattedMessage));
25 }
26
27 protected abstract RuleViolation createRuleViolation(Rule rule, RuleContext ruleContext, Node node, String message);
28 }
|