LoginSignup
0
0

More than 5 years have passed since last update.

ストリームをデバッグの時だけチェックするコンポーネント

Posted at

ストリームをチェックするコンポーネントを作ってみます。

JavaInterpreterコンポーネントでコンポーネントに必要な一式を指定フォルダに出力する機能がありますので、久しぶりに使ってみます。

JavaInterpreterコンポーネントの右クリックメニューから「カスタムコンポーネントの作成」を選びます。
createComponent1.png

コンポーネント名などを入力して...アイコンどうやって選ぶんだ?バグ?

createComponent2.png
フォルダはフルパスか、3回作り直した・・・

createComponent3.png
入力ストリームはチェックするだけなので、そのまま出力します。

createComponent4.png
FilePathのプロパティを1つだけ持ってます。
作成するコンポーネントのプロパティはこれだけで、比較したいストリームのファイルをフルパスで指定することになります。
これは、JavaInterPreterのカテゴリープロパティ「パラメーター」の値です。

createComponent5.png
JavaInterPreterのプロパティ「ソースコード」の値です。空では動きません。

createComponent6.png
jarの名前はblog.jarにします。
インストールパスを指定?
ここで気が付きました、ヘルプの画像と違う・・・ダイアログのサイズが足りてない
ダイアログの右下を引っ張ってサイズを大きくすると出てきます。
createComponent7.png
むむむ、
今までのアイコンやらフォルダ指定もサイズが足りていないので表示されていなかったようです。

「完了」で指定フォルダにコンポーネント作成に必要なファイルが出力されます。
ant用のbuild.xmlがありますので、実行します。
distフォルダの下にblog.jarができました。簡単です。
最近のコンポーネント用jarファイルにはバージョン番号などを入れますが、無くても大丈夫です。

出力されたソースにdoExecuteメソッドがありますので、以下のように修正しました。
入力ストリームのバイト配列と指定したファイルのバイト配列のサイズと内容を比較してログを出します。
やりたい事はチェックするだけなのでログは出しますが、何が起きても処理は継続します。

    private void doExecute(ExecuteContext context, StreamCheckComponent component) throws FlowException {
        //デバッグのときと、指定したファイルが存在するときだけ処理
        if (context.isDebugInfoEnabled() && _checkFile.exists()) {
            try {
                //入力ストリームをバイナリに
                byte[] inputStreamByte = getInputConnector().getStream().byteValue();
                if (getFileSize() != inputStreamByte.length) {
                    context.error(getMessage(KEY_SIZE_CHIGAU, storeErrorStream(inputStreamByte)));
                }
                //ファイルをバイナリに
                byte[] checkFileByte = getFileByte();
                if (!Arrays.equals(inputStreamByte, checkFileByte)) {
                    context.error(getMessage(KEY_DATA_CHIGAU, storeErrorStream(inputStreamByte)));
                }
            } catch (Exception e) {
                context.fatal(e);
            }
        }
    }

エラーメッセージを2つ追加しています。これは以下のようにxscファイルに追記します。

<xsc lang="ja" xmlns="http://www.infoteria.com/asteria/flowengine/definition">
    <Component category="コントロール" icon="streamCheck.png" name="StreamCheck"  displayName="StreamCheck"  toolTip="">
        <Class>com.infoteria.blog.StreamCheckComponent</Class>
        <Message key="SIZE_CHIGAU">データのサイズが異なります。ファイルに保存しました %1</Message>
        <Message key="DATA_CHIGAU">データが異なります。ファイルに保存しました %1</Message>
        <Property mapping="false" name="Exception" type="exception"/>

        <Property name="FilePath"  type="string"    tooltip=""  ></Property>
        <Input accept="Binary;Text;HTML;ParameterList;Record;CSV;FixedLength;MIME;XML" default="Binary"  />
        <Output  streamPassThrough="true"  />
    </Component>
</xsc>

アイコンもxscファイルで変更できますので、「カスタムコンポーネントの作成」ダイアログで指定できなくても大丈夫です。
今回は「streamCheck.png」に変更してます → streamCheck.png

ソースをごにょごにょ修正して、antを実行してblog.jarを作成します。

コンポーネントを早速動かしてみます。

出来たjarファイルを以下のフォルダに入れます。
「WARPデータフォルダ」/system/lib/components
そしてWARPを起動して、フローデザイナーから接続します。
フローデザイナーのメニュー「ツール」/「コンポーネント/マッパー関数の取得」よりblog.jarを取得して再起動します。

createComponentDesigner.png
無事コントロールタブにCheckStreamコンポーネントが追加されています。

TextストリームとRecordストリームで確認してみたところ、動いているようです。

createComponentLog.png
フローをデバッグで実行している場合にのみログが出力されます。

こういう機能はあったら嬉しいのかな?
・大きいストリームに対応するとか
・違いを細かく出力するとか
・通常の実行モードではコンポーネント自体スルーするとか
・結果をExcelにまとめてくれるとか・・・これは別コンポーネントでいいか

JavaInterpreterコンポーネントの「カスタムコンポーネントの作成」で出力されたソースを以下に置いておきます。
https://github.com/ArimitsuIshii/asteria_component

0
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
0
0