題名にsonar-web-pluginに独自のチェックをさせる方法と書きましたが、
現状存在しないと、Stack Overflowに書いてありました。。。
なので、今回はsonar-web-pluginをgitから落としてきて改造する方法になります。
前提:独自チェックするコードは既にあるものとし、今回はそれをsonarのプラグイン上で動くようにします。
準備:githubからソースを落とす。以下から取れます。
https://github.com/SonarCommunity/sonar-web.git
落としたら、Eclipseか何かに取り込んで早速編集開始。
1.既にあるチェックモジュールを必要なパッケージごと、
「src/main/java」にコピーして引越ししましょう。
2.チェックモジュールを登録します。
以下のソースに独自のチェックを行うクラス(MyCheck)を書き足しします。
クラス名:org.sonar.plugins.web.rules.CheckClasses
private static final Class[] CLASSES = new Class[] {
・・・
MyCheck.class
};
3.SonarQubeのプロファイルに表示されるルール名を登録します。
以下のテキストファイルにキーバリューで登録します。
ファイル:src/main/resources/org/sonar/l10n/web.properties
設定値:rule.Web.MyCheck.name=My Checker
4.独自チェックで引っ掛かった場合のソリューションをhtmlで提供します。
以下に、3で書いた設定値のキー(MyCheck).htmlというファイルを追加し、
そこに記載します。
htmlを置く場所:src/main/resources/org/sonar/l10n/web/rules/Web
5.独自チェックを行うソースをsonarプラグインとして動くようにします。
①classにアノテーションを付けて、「AbstractPageCheck」を継承する。
以下のような感じになります。
@Rule(key = "MyCheck", priority = Priority.MAJOR)
@WebRule(activeByDefault = true)
@RuleTags( {RuleTags.CONVENTION, RuleTags.JSP_JSF, RuleTags.HTML5} )
public class MyCheck extends AbstractPageCheck{
・・・
}
@Ruleのkeyに指定しているのは、3,4で書いた設定値のキーです。
@RuleTagsは、SOnarQubeの品質プロファイルにみたときに、何のチェックがされるかというのをGUIで可視化してくれます。(自己申告ですが。)
②デフォルトのコンストラクタは暗黙で呼ばれるので、行いたい初期処理があれば、入れておきます。
③public void startDocument(List nodes) をオーバーライド実装します。
これは、1ファイルの読み込みが開始したときに呼ばれるメソッドです。
このメソッドの上で実際のチェックを走らせます。
ファイル自体は以下のメソッドで取れるので、元のチェックがFileが渡される作りであるならば、以下メソッドで取って渡せば、全て同じに動きます。
メソッド:super.getWebSourceCode().getFile();
④チェックに引っ掛かったら、以下のメソッドを呼んで、違反を知らせます。
チェックが終わると、まとめて書かれます。
createViolation("違反が発生した行番号", "違反メッセージ");
書くのはこれだけです。
これをビルドしてjarファイルを作成しなおし、
{SONAR_HOME}/extension/pluginの下に置いて、SonarQubeを再起動すれば、独自チェックが走るようになります。