AbstractRuleViolationFactory.java
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 }