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

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

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

JavaInterpreterコンポーネントの右クリックメニューから「カスタムコンポーネントの作成」を選びます。
![createComponent1.png](https://qiita-image-store.s3.amazonaws.com/0/180278/4e0a91ab-04c9-a3a8-efe4-471efb75cb67.png)

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

![createComponent2.png](https://qiita-image-store.s3.amazonaws.com/0/180278/9b62f1ec-ab3b-ba83-e3c3-db695b599be0.png)
フォルダはフルパスか、３回作り直した・・・

![createComponent3.png](https://qiita-image-store.s3.amazonaws.com/0/180278/6823e153-bb8d-ce7c-35af-05deea7556bb.png)
入力ストリームはチェックするだけなので、そのまま出力します。

![createComponent4.png](https://qiita-image-store.s3.amazonaws.com/0/180278/f34240e8-bf97-ffbd-a86f-6c3b16dd9b5b.png)
FilePathのプロパティを１つだけ持ってます。
作成するコンポーネントのプロパティはこれだけで、比較したいストリームのファイルをフルパスで指定することになります。
これは、JavaInterPreterのカテゴリープロパティ「パラメーター」の値です。

![createComponent5.png](https://qiita-image-store.s3.amazonaws.com/0/180278/72562235-868e-2ed6-cf8c-9c6f384dbc76.png)
JavaInterPreterのプロパティ「ソースコード」の値です。空では動きません。

![createComponent6.png](https://qiita-image-store.s3.amazonaws.com/0/180278/7873d194-878f-6bba-81a9-ad3ff1f5bcc5.png)
jarの名前はblog.jarにします。
インストールパスを指定？
ここで気が付きました、ヘルプの画像と違う・・・ダイアログのサイズが足りてない
ダイアログの右下を引っ張ってサイズを大きくすると出てきます。
![createComponent7.png](https://qiita-image-store.s3.amazonaws.com/0/180278/8efbf6a1-bc22-8c10-2400-ca5d2591c61d.png)
むむむ、
今までのアイコンやらフォルダ指定もサイズが足りていないので表示されていなかったようです。

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

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

```java
	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);
			}
		}
	}
```
エラーメッセージを２つ追加しています。これは以下のように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](https://qiita-image-store.s3.amazonaws.com/0/180278/572bc4be-eb8e-4636-ae8f-4b1b77942f5e.png)

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

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

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

![createComponentDesigner.png](https://qiita-image-store.s3.amazonaws.com/0/180278/e13c3cf1-b39c-e143-2974-60d20efe14ef.png)
無事コントロールタブにCheckStreamコンポーネントが追加されています。

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

![createComponentLog.png](https://qiita-image-store.s3.amazonaws.com/0/180278/7af69a39-e30f-d8e0-4b71-4ad475e5f344.png)
フローをデバッグで実行している場合にのみログが出力されます。

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

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