01 /**
02 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03 */
04 package net.sourceforge.pmd.lang.java.rule;
05
06 import java.util.regex.Pattern;
07
08 import net.sourceforge.pmd.lang.java.ast.ASTLiteral;
09 import net.sourceforge.pmd.lang.java.rule.regex.RegexHelper;
10 import net.sourceforge.pmd.lang.rule.properties.StringProperty;
11
12
13 /**
14 * This class allow to match a Literal (most likely a String) with a regex pattern.
15 * Obviously, there are many applications of it (such as basic.xml/AvoidUsingHardCodedIP).
16 *
17 * @author Romain PELISSE, belaran@gmail.com
18 */
19 //FUTURE This is not referenced by any RuleSet?
20 public class GenericLiteralCheckerRule extends AbstractJavaRule {
21
22 private Pattern pattern;
23
24 private static final String PROPERTY_NAME = "regexPattern";
25
26 private static final StringProperty REGEX_PROPERTY = new StringProperty(PROPERTY_NAME,"Regular expression","", 1.0f);
27
28 public GenericLiteralCheckerRule() {
29 definePropertyDescriptor(REGEX_PROPERTY);
30 }
31
32 private void init() {
33 if (pattern == null) {
34 // Retrieve the regex pattern set by user
35 String stringPattern = super.getProperty(REGEX_PROPERTY);
36 // Compile the pattern only once
37 if ( stringPattern != null && stringPattern.length() > 0 ) {
38 pattern = Pattern.compile(stringPattern);
39 } else {
40 throw new IllegalArgumentException("Must provide a value for the '" + PROPERTY_NAME + "' property.");
41 }
42 }
43 }
44
45 /**
46 * This method checks if the Literal matches the pattern. If it does, a violation is logged.
47 */
48 @Override
49 public Object visit(ASTLiteral node, Object data) {
50 init();
51 String image = node.getImage();
52 if ( image != null && image.length() > 0 && RegexHelper.isMatch(this.pattern,image) ) {
53 addViolation(data, node);
54 }
55 return data;
56 }
57 }
|