/* * SonarQube PHP Custom Rules Example * Copyright (C) 2016-2016 SonarSource SA * mailto:contact AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.sonar.samples.php.checks; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.sonar.check.Priority; import org.sonar.check.Rule; import org.sonar.plugins.php.api.tree.ScriptTree; import org.sonar.plugins.php.api.tree.statement.StatementTree; import org.sonar.plugins.php.api.visitors.PHPVisitorCheck; /** * Example of implementation of a check by extending {@link PHPVisitorCheck}. * PHPVisitorCheck provides methods to visit nodes of the Abstract Syntax Tree * that represents the source code. *

* Those methods can be overridden to process information * related to node and issue can be created via the context that can be * accessed through {@link PHPVisitorCheck#context()}. */ @Rule( key = ROQLInTryCatchRule.KEY, priority = Priority.MAJOR, name = "ROQL must be placed inside a try-catch block.", tags = {"convention"}, // Description can either be given in this annotation or through HTML name .html located in package src/resources/org/sonar/l10n/php/rules/ description = "

ROQL must be placed inside a try-catch block.

" ) public class ROQLInTryCatchRule extends PHPVisitorCheck { public static final String KEY = "ROQLInTryCatch"; Pattern p = Pattern.compile("(.*try[\\W|\\s|\\w|\\d]*ROQL*[\\W|\\s|\\w|\\d]*catch.*)"); /** * Overriding script visiting each of the statement blocks to create an issue * each time "ROQL" query is not enclosed within try-catch block. */ @Override public void visitScript(ScriptTree tree) { super.visitScript(tree); List stTree = tree.statements(); for (int i = 0; i < stTree.size(); i++) { if(stTree.get(i).toString().contains("ROQL")) { Matcher matcher = p.matcher(stTree.get(i).toString()); if (matcher.matches() == false) { context().newIssue(this, stTree.get(i) , "ROQL must be placed inside a try-catch block."); } } } } }