1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.rules.strings;
5
6 import net.sourceforge.pmd.AbstractRule;
7 import net.sourceforge.pmd.ast.ASTBlockStatement;
8 import net.sourceforge.pmd.ast.ASTLiteral;
9 import org.apache.oro.text.perl.Perl5Util;
10
11 /***
12 * This rule finds the following:
13 * <p/>
14 * <pre>
15 * StringBuffer.append("c"); // appends a
16 * single character
17 * </pre>
18 * <p/>
19 * It is preferable to use StringBuffer.append('c'); // appends a single
20 * character Implementation of PMD RFE 1373863
21 */
22 public class AppendCharacterWithChar extends AbstractRule {
23
24 private static final String REGEX = "/\"[////]?[//s//S]\"/i";
25
26 public Object visit(ASTLiteral node, Object data) {
27 ASTBlockStatement bs = (ASTBlockStatement) node
28 .getFirstParentOfType(ASTBlockStatement.class);
29 if (bs == null) {
30 return data;
31 }
32
33 String str = node.getImage();
34 if (str == null || str.length() < 3 || str.length() > 4) {
35 return data;
36 }
37
38
39
40 Perl5Util regexp = new Perl5Util();
41 if (regexp.match(REGEX, str)) {
42 if (!InefficientStringBuffering.isInStringBufferAppend(node, 8)) {
43 return data;
44 }
45 addViolation(data, node);
46 }
47 return data;
48 }
49 }