/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.java.rule; import java.util.regex.Pattern; import net.sourceforge.pmd.lang.java.ast.ASTLiteral; import net.sourceforge.pmd.lang.java.rule.regex.RegexHelper; import net.sourceforge.pmd.lang.rule.properties.StringProperty; /** * This class allow to match a Literal (most likely a String) with a regex * pattern. Obviously, there are many applications of it (such as * basic.xml/AvoidUsingHardCodedIP). * * @author Romain PELISSE, belaran@gmail.com */ // FUTURE This is not referenced by any RuleSet? public class GenericLiteralCheckerRule extends AbstractJavaRule { private Pattern pattern; private static final String PROPERTY_NAME = "regexPattern"; private static final StringProperty REGEX_PROPERTY = new StringProperty(PROPERTY_NAME, "Regular expression", "", 1.0f); public GenericLiteralCheckerRule() { definePropertyDescriptor(REGEX_PROPERTY); } private void init() { if (pattern == null) { // Retrieve the regex pattern set by user String stringPattern = super.getProperty(REGEX_PROPERTY); // Compile the pattern only once if (stringPattern != null && stringPattern.length() > 0) { pattern = Pattern.compile(stringPattern); } else { throw new IllegalArgumentException("Must provide a value for the '" + PROPERTY_NAME + "' property."); } } } /** * This method checks if the Literal matches the pattern. If it does, a * violation is logged. */ @Override public Object visit(ASTLiteral node, Object data) { init(); String image = node.getImage(); if (image != null && image.length() > 0 && RegexHelper.isMatch(this.pattern, image)) { addViolation(data, node); } return data; } }