Kotlinでコンポーネントを書いてみる

#中央値を取得するコンポーネント
中央値は階級に幅があるパターンがあったりしますが、一番簡単な個別のデータから中央値を取得するものを作ります。

###実装したいこと

* 入力ストリームはRecordとCSV
* レコードの指定フィールドから中央値を取得する
* 取得した中央値はプロパティの値として設定する

#IntelliJでプロジェクト作成
![intellij_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/94a3930a-820b-a1b3-8096-681af040a7cb.png)
作成したプロジェクトへ以下を追加していきます。

* パッケージ　com.asteria.sample.kotlin.component にします。
* コンポーネント用Kotlinクラスファイル MedianComponent.kt にします。
* META-INFのもろもろファイル
* External Libraries
* Artifacts

###META-INF
コンポーネントとして必要なJarファイル内に必要なファイルたちです。
プロジェクトの「src」の下に作成します。

META-INF
└ asteria
　├ icons
　│　└ Median.png アイコンファイル
　├ ja
　│　├ reference
　│　│　└ component
　│　│　　 └ Median.html ヘルプファイル
　│　└ ComponentDefine.xconf コンポーネント定義ファイル 
　└ version.xml バージョンファイル

ComponentDefine.xconfファイルはいつものxscファイルとほぼ同じ感じで作ります。

###Project Structure
以下の２つはメニューから File＞Project Structure... を開いて設定します。

####External Libraries
Project Settings＞Libraries から追加します。
ascore-1912.0800.jar、asdesigner-1912.0800.jarの２つを追加します。
![libraries.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/c81c51dd-8dc1-58d6-c11f-b824fcddd7cb.png)
####Artifacts
Project Settings＞Atrifacts から追加します。
MedianComponent.jarという名前にします。このJarファイルへはkotlinのライブラリは追加しますが、ascore-1912.0800.jarとasdesigner-1912.0800.jarは含めません。
![artifacts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/74f16fe8-78f9-8d82-a40b-626d1465fe8e.png)

以上でIntelliJでビルドを実行するとコンポーネントのJarファイルが作成できるようになりました。
![dir.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/88b9884e-24e9-dede-875e-8827c8583469.png)

#コード
プロパティは３つ

 *フィールド名：中央値を取得したいフィールド名を指定する
 *中央値：readonlyで計算した中央値を設定する
 *レコード数 ：readonlyで使用したレコード数を設定する

KotlinはJavaのクラスを継承できるのでSimpleComponentを継承します。

```kotlin
class MedianComponent : SimpleComponent {
```

エラーコードはvalで定義します。

```kotlin
private val ERROR_FIELD_NAME_IS_EMPTY = "1"
```

プロパティもこんな感じに定義できます。

```kotlin
private val _propFieldName = StringProperty("FieldName", true, true)
```

通常コンストラクタでストリーム定義などを行います。
こんな感じ

```kotlin
    constructor() : super() {
        inputConnector.acceptType = StreamType.RECORDS or StreamType.CSV
        inputConnector.acceptLinkCount = 1
        outputConnector.acceptType = StreamType.RECORDS or StreamType.CSV

        registerProperty(_propFieldName)
        registerProperty(_propMedian)
        registerProperty(_propRecordCount)
    }
```

処理の本体executeメソッドは以下な感じで書きます。

```kotlin
    override fun execute(p0: ExecuteContext?): Boolean {
        //処理

        passStream();
        return true
    }
```

実はKotlin初心者の私がサクサクコードが書けたのもIntelliJのおかげです。
Javaのコードをコピーしてきて、ペーストするとKotlinのコードに変換してくれました。
JavaのコードがあるならKotlinで書かなくてもいいのでは？という疑問は置いといて、ごにょごにょと変換してくれる動作は感動的です！

全コードは[github](https://github.com/ArimitsuIshii/MedianComponent)に置いておきましたので見たい方はどうぞ。

#注意

* ConponentDefine.xconfはxscファイルと若干違うので、インストール済のコンポーネントを見て確認することをお勧めします。
* ヘルプファイルは雛形を書くのではなく、完成形のhtmlファイルを書きます。CSSを他のヘルプと合わせたければ既存のコンポーネントヘルプで確認します。

#ビルド
ビルドはIntelliJのこのボタンをクリック！
![build.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/34d1791d-d11a-927d-d537-889d9589745e.png)
作成されたjarファイルはoutフォルダー下にあります。
![build_component.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/de54e807-0cc3-be03-5d0e-a3f4504c1c0c.png)

#AsteriaWarpへJarファイル追加
コンポーネントのJarファイルは、[DATA_DIR]下の以下のパスにコピーします。
C:\asteriahome5\system\lib\components
#フローデザイナーへJarファイル追加
メニューから ツール＞コンポーネント／マッパー関数の取得 を開きます。MedianComponent.jarをダウンロードしてフローデザイナーを再起動します。

#Flow
Flowは以下な感じで作成しました。
![flow1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/f49edb48-579d-07d7-251e-d71ff6361d5a.png)
アイコンは的の中央に当たった矢をイメージしてみました。
ちょっとアレなのでわかりやすく「中央」と漢字で書いてみたり・・・

CSVの内容
![flow2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/c1fa7924-0069-17b4-7c5b-7c1a31c5f34a.png)

Mapperの内容
![flow3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/a5b38e6b-8968-de1a-aae9-fe70f1ab20e5.png)

#実行結果
![flow4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/dde154a1-6714-582a-1a93-237fa7c48d30.png)
無事に中央値15.5となりました。

FlowServiceのログにも出力されています。
![log.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/040f034f-4461-1a08-f39a-30e2da5b1ae7.png)

#参考文献
http://www.wwq.jp/stacalcul/median1.htm