Embulkのソースコードスタイルチェック方法 (Java編)


## 1 概要

EmbulkのJava関連のコードは、Prestoと同じコードスタイル(Airlift codestyle)で記述されていま~~す~~した。
(Embulk本体は、v0.9から[Google Java Styleの一部修正版](https://github.com/embulk/embulk/tree/master/config/checkstyle)が採用されています。(2018/2/8追記))
下記の手順で、プラグインのソースコードが同じコードスタイルになっているかどうかをチェックすることができます。

Gradleの設定とIntelliJ IDEA 15 CE(OSX)、 の設定それぞれについて解説します。

~~ちなみに、Gradleの設定は、``embulk new``したときに自動的に生成できるようにするPRを作成しました。
[[Propose] Add checkstyle settings in Java plugin generator](https://github.com/embulk/embulk/pull/361) 
いい悪いどちらでも是非、コメントください。~~

プラグイン内のコードスタイルをチェックする設定がEmbulk 0.8から利用できるようになりました。

なお、Embulkのプロジェクトではプラグイン作成者の方が小気味良いハックで目の前の問題を解決することも許されても良いという方針から、スタイルを厳密に守ることを重要視していません。プラグインを作られる方の好きなスタイルでプラグインを作るのも自由です。

## 2 Gradleの場合

次の手順で設定をします。

* 2.1 設定
* 2.2 チェックコマンドを実行
* 2.3 余談

## 2.1 build.gradleの設定(embulk 0.8からは自動設定)

embulk 0.8からは、embulk newをすると、次の設定がbuild.gradleに追加されます。

embulk 0.8より前のプラグインでも``embulk migrate path/to/plugin_dir``コマンドを実行すれば同じ設定が適用されます。

```
plugins {
    // 略
    id "checkstyle"
}
// 略
checkstyle {
    configFile = file("${project.rootDir}/config/checkstyle/checkstyle.xml")
    toolVersion = '6.14.1'
}
checkstyleMain {
    configFile = file("${project.rootDir}/config/checkstyle/default.xml")
    ignoreFailures = true
}
checkstyleTest {
    configFile = file("${project.rootDir}/config/checkstyle/default.xml")
    ignoreFailures = true
}
```

またチェックに使うファイルが次の場所に作成されます。
二つのファイルはチェックする内容が若干異なります。

例えば、default.xmlはimportの順序に関するチェックは行わないようになっています。

* config/checkstyle/default.xml
* config/checkstyle/checkstyle.xml

### 2.3 チェックコマンドを実行

``gradlew <チェックの種類>``でチェックを行うことができます。

チェックは次の種類が利用できます。checkは、``checkstyleMain``と``checkstyleTest``それぞれを実行します。

* check: 緩いチェックで、警告のみ
  * checkstyleMain: プラグイン本体のチェック
  * checkstyleTest: テストコードのスタイルチェック
* checkstyle: より厳密なチェック、スタイルに従わないとエラーになる。

``checkstyle``の実行例はつぎのとおりです。

```
./gradlew checkstyle
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:checkstyleMain
[ant:checkstyle] /path/to/embulk-input-hdfs/src/main/java/org/embulk/input/hdfs/HdfsFileInputPlugin.java:27: 'java.io.File' は上のインポート文から１行空けるべきです。
[ant:checkstyle] /path/to/embulk-input-hdfs/src/main/java/org/embulk/input/hdfs/HdfsFileInputPlugin.java:180:45: ':' の前にホワイトスペースがありません。
[ant:checkstyle] /path/to/embulk-input-hdfs/src/main/java/org/embulk/input/hdfs/HdfsFileInputPlugin.java:187:57: 名前 'rewind_seconds' はパターン '^[a-z][a-zA-Z0-9]*$' に一致しなければなりません。
[ant:checkstyle] /path/to/embulk-input-hdfs/src/main/java/org/embulk/input/hdfs/HdfsPartialFile.java:3:8: 使用されないインポートです - org.apache.hadoop.fs.Path。
[ant:checkstyle] /path/to/embulk-input-hdfs/src/main/java/org/embulk/input/hdfs/HdfsPartialFile.java:23:30: '{' は新しい行にあるべきです。
[ant:checkstyle] /path/to/embulk-input-hdfs/src/main/java/org/embulk/input/hdfs/HdfsPartialFile.java:38: Blank line before closing brace
[ant:checkstyle] /path/to/embulk-input-hdfs/src/main/java/org/embulk/input/hdfs/HdfsPartialFileInputStream.java:0: ファイルが新しい行で終了していません。
[ant:checkstyle] /path/to/embulk-input-hdfs/src/main/java/org/embulk/input/hdfs/HdfsPartialFileInputStream.java:48:40: 'cast' の後にホワイトスペースがありません。
:checkstyleMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':checkstyleMain'.
> Checkstyle rule violations were found. See the report at: file:///path/to/embulk-input-hdfs/build/reports/checkstyle/main.xml

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 2.97 secs
```


### 余談

* build.gradle内に``toolVersion = 6.7``と記述しなくても良くなりました。(Embulk 0.8以降) 
* 上記はgradleのバージョンを2.6から2.10にアップデートしたからです。

## 3 IntelliJ IDEA 2020.3の場合

[Airlift.xml](https://github.com/airlift/codestyle)をダウンロードして、~/Library/Preferences/IdeaIC2016.2/codestyles/Airlift.xml(古いバージョンでは、~/Library/Preferences/IdeaIC15/codestyles/Airlift.xml) として保存します。

[Preferences] -> [Editor] -> [Code style]でSchemaからAirliftが選択できるようになります。

![IntelliJ IDEA 15 CE](https://qiita-image-store.s3.amazonaws.com/0/61464/e3c3050c-41f1-678e-84f6-34c41dff96bf.png)

### ソースコードのフォーマット

[Reformatting Source Code](https://www.jetbrains.com/idea/help/reformatting-source-code.html) によると、``Code`` -> ``Reformat Code``で自動整形をしてくれます。
[Optimizing Imports](https://www.jetbrains.com/help/idea/2016.2/optimizing-imports.html)によると、``Code`` -> ``Optimize Imports``で、importの順番を直してくれます。

## 4 参考情報

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hanpen_good">@hanpen_good</a> InteliJ のはコレで大丈夫なハズです：<a href="https://t.co/rkdaMpaPAQ">https://t.co/rkdaMpaPAQ</a></p>&mdash; FURUHASHI Sadayuki (@frsyuki) <a href="https://twitter.com/frsyuki/status/623266918024122368">2015, 7月 20</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

[Check code style](https://github.com/embulk/embulk-executor-mapreduce/issues/15) embulk-executor-mapreduce