1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

###実装したいこと

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

#IntelliJでプロジェクト作成
intellij_new.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
以下の2つはメニューから File>Project Structure... を開いて設定します。

####External Libraries
Project Settings>Libraries から追加します。
ascore-1912.0800.jar、asdesigner-1912.0800.jarの2つを追加します。
libraries.png
####Artifacts
Project Settings>Atrifacts から追加します。
MedianComponent.jarという名前にします。このJarファイルへはkotlinのライブラリは追加しますが、ascore-1912.0800.jarとasdesigner-1912.0800.jarは含めません。
artifacts.png

以上でIntelliJでビルドを実行するとコンポーネントのJarファイルが作成できるようになりました。
dir.PNG

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

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

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

class MedianComponent : SimpleComponent {

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

private val ERROR_FIELD_NAME_IS_EMPTY = "1"

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

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

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

    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メソッドは以下な感じで書きます。

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

        passStream();
        return true
    }

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

全コードはgithubに置いておきましたので見たい方はどうぞ。

#注意

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

#ビルド
ビルドはIntelliJのこのボタンをクリック!
build.PNG
作成されたjarファイルはoutフォルダー下にあります。
build_component.PNG

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

#Flow
Flowは以下な感じで作成しました。
flow1.PNG
アイコンは的の中央に当たった矢をイメージしてみました。
ちょっとアレなのでわかりやすく「中央」と漢字で書いてみたり・・・

CSVの内容
flow2.PNG

Mapperの内容
flow3.PNG

#実行結果
flow4.png
無事に中央値15.5となりました。

FlowServiceのログにも出力されています。
log.PNG

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?