GenericLiteralCheckerRule.java
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() ) {
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() && RegexHelper.isMatch(this.pattern,image) ) {
53       addViolation(data, node);
54     }
55     return data;
56   }
57 }