JavaInterpreter - Javaインタープリタ

ソースコード で指定したJavaのコードを実行します。

JavaインタプリタのエンジンとしてBeanShellを本製品に組み込んでいます。

詳しくはhttp://www.beanshell.org/をご覧ください。

言語仕様などは下記を参照してください。

http://www.beanshell.org/manual/contents.html

■ストリーム情報

入力フォーマットすべて
接続数1
説明すべてのストリームを入力できます。
出力フォーマットすべて
説明入力をそのまま出力 が「いいえ」の場合は、ソースコード中でストリームを作成してreturnする必要があります。
はい」の場合は、入力ストリームをそのまま出力します。

■コンポーネントプロパティ

名前プロパティ型マッピング説明
ソースコードstring入力&出力 実行するソースを記述します。
入力をそのまま出力streamPassThrough- コンポーネントの入力ストリームをそのまま出力ストリームにするかどうかを指定します。
はい [true] - 入力ストリームがそのまま出力ストリームになります。
いいえ [false] - ソースコード中でストリームを作成してreturnする必要があります。
パラメーターcategory入力&出力 ソースコード中で使用するパラメーターを設定します。
ここで定義したパラメーターはソースコード中でcomponent.getParameterメソッドで取得できます。また、このプロパティは自動的にストリーム変数になります。本コンポーネントの後に連結したマッパーで、ストリーム変数として見えるようになっています。ストリーム変数については、「はじめに」-「詳細なトピック」-「フローの構成要素」-「変数」-「ストリーム変数」を参照してください。

■トランザクション処理

コミット何もしません。
ロールバック何もしません。

■エラー処理

タイプパラメーターエラー処理フロー
へのストリーム
エラー
コード
説明
汎用 なし コンポーネントの入力ストリーム なし ソースコード中でExceptionがthrowされた場合

■解説

基本的にクラス定義ができない以外はJavaと仕様は同じです。
インタプリタ内ではクラス定義はできませんが、Javaの標準的なクラスなどの既存クラスを使用することは可能です。
componentとcontextという2つの変数は事前にフローサービスで予約されて定義されていて、そこから入力ストリームやパラメーターを取得して処理を行うことができます。ストリームを直接扱う場合はフローサービスの内部クラスに関する知識が必要です。それらの説明については「フローサービス開発キット」に記述されています。詳しくは、「関連リンク」から「フローサービス開発キット」のリンクを参照してください。
ここではパラメーターの使用方法とStringやbyte[]を使用した簡易的な出力ストリームの作成に絞って説明します。

■パラメーターの取得と設定

JavaInterpreterではインスペクタの「パラメーター」タブで自由にパラメーターを定義することができます。
ここで定義したパラメーターでは直前のMapperで値を差し込んだり、ソースコード中で設定した値を後続のMapperで参照したりすることができます。

パラメーターの取得には予約変数componentのgetParameter(String)というメソッドを使用します。
このメソッドで取得できるのはValueというフローサービスの内部クラスです。
Valueクラスはフローサービスのデータ型(Integer,Decimal,String,Binary,Double,DateTime,Boolean)を表現しているクラスで、その使用方法についてはマッパー関数のJavaInterpreterのヘルプに詳しいのでそちらも参照してください。

//パラメーターAとパラメーターBから整数として値を取得し、パラメーターCに設定する
Value a = component.getParameter("A");
Value b = component.getParameter("B");
Value c = component.getParameter("C");
c.setValue(a.longValue() + b.longValue());

■出力ストリームの設定

入力をそのまま出力 が「いいえ」の場合はソースコード中でストリームを生成してreturnする必要があります。
returnできるオブジェクトは次のうちのいずれかです。

StreamDataObjectはフローサービスのストリームを表現するクラスでその詳細についてはここでは解説しません。
JavaInterpreterではほとんどの場合2番目のStringを返り値としてストリームを作成する方法を使用します。

Stringを返り値とする場合コンポーネントのストリーム定義をText系のストリーム(Text、CSV、HTML、XML、JSON)のいずれかにします。
そしてそこで行った定義内容に沿う形で文字列を生成し、それを返せばOKです。

//出力ストリームがCSVの場合、CSV文字列を生成してreturnする
return "1,abc,あいうえお\r\n2,def,かきくけこ";
//出力ストリームがXMLの場合
//エンコーディング(XML宣言)やインデントはストリーム作成時に設定されるので気にしなくて良い。
return "<root><elem1>あいうえお</elem1></root>";
//出力ストリームがJSONの場合
return "{\"root\":{\"elem1\":\"あいうえお\"}}";

byte[]やDocumentやJSONObjectやJSONArrayをreturnする場合も考え方は同じでコンポーネント側のストリーム定義で行った定義に適合するものを作成してreturnすればOKです。

■componentとcontextのメソッド

予約変数componentはcom.infoteria.asteria.flowengine2.component.ComponentクラスのサブクラスであるJavaInterpreterComponent自身です。

予約変数contextはフローの実行コンテキストであるcom.infoteria.asteria.flowengine2.execute.ExecuteContextクラスです。

以下にこの2つのクラスの代表的なメソッドをあげておきます。
詳しくは、「関連リンク」から「フローサービス開発キット」のリンクを参照してください。

component
public Value getParameter(String name)パラメーターを取得します。
nameで指定された名前が定義されていない場合はnullになります。
public InputConnector getInputConnector()入力コネクタを取得します。
public OutputConnector getOutputConnector()出力コネクタを取得します。
context
public void debug(String msg)ログを出力します。
public void debugInfo(String msg)
public void info(String msg)
public void warn(String msg)
public void error(String msg)
public void fatal(String msg)
public FlowSession getSession()セッションを取得します。
public void addTransaction(Transaction t)トランザクションを追加します。

■テスト

ソースの編集ダイアログ上でテストボタンをクリックすることで実際にサーバー側でソースを実行した結果を確認することができます。
テストボタンをクリックすると編集中のソースコードが実行され、コード内でreturnしたオブジェクトが文字列で結果ダイアログが表示されます。

入力をそのまま出力する場合などソースコード内からreturnするオブジェクトがない場合はテストに成功した場合でも結果ダイアログは空になります。
このような場合はcontextのログ出力メソッドでログを出力してそちらを確認するか、一時的にreturn文を書いて実行してください。

テストではすべてのソースコードが実行可能なわけではありません。
例えば入力ストリームから情報を取得して使用するようなソースの場合は必ずテストに失敗します。
ソースに誤りがないと思われるにも関わらずテストに失敗する場合はフローの実行を試してください。

■注意事項

■独自ライブラリの使用

ソースコードの中で独自のライブラリを使用する場合は、[DATA_DIR]/system/lib/userlib に使用するjarファイルをコピーしてからフローサービスを再起動してください。

■カスタムコンポーネントの作成

作成したJavaInterpreterのコードをフローサービスのコンポーネントとするためのソース一式を生成することができます。コンポーネントを右クリックして表示されるメニューの「カスタムコンポーネントの作成」を選択すると、ソース一式を生成するためのウィザードが表示されます。
JavaInterpreterのコードをコンポーネント化することには次のようなメリットがあります。

詳しくは、「関連リンク」から「フローサービス開発キット」のリンクを参照してください。
注意:ウィザードではプロパティの追加を行うことができますが、プロパティ型が「choice」または「editableChoice」の場合に指定する選択肢に「=」を含む文字は定義できません。ウィザードでソース一式を生成後に定義ファイルを直接編集して定義してください。