JavaInterpreter

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

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

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

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

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

■入力/出力

接続数: 最小 0/最大 無制限
入力データ型説明
入力NAll入力値

出力データ型説明
出力1All戻り値

■プロパティ

名前プロパティ型説明
ソースコードstring実行するソースを記述します
出力数int出力数を指定します。

■解説

基本的にクラス定義ができない以外はJavaと仕様は同じです。インタプリタ内ではクラス定義はできませんが、Javaの標準的なクラスなどの既存クラスを使用することは可能です。
入力はいくつでも受け付けることができます。(入力なしでも使用可能です。)
出力は必ず必要です。(出力がフロー変数などにつながっていないとコンパイル時に削除されます。)
in/outという名前の変数が事前に本製品で予約されて定義されています。この変数から、入力値をとったり、出力を設定することができます。 (出力が1つだけの場合はreturn文で戻しても出力とすることもできますが、SDKウィザードでマッパー関数を生成した場合に ソース修正が必要になるのでout変数にsetValueする方法を推奨します。)

inは、Valueの配列になっています。入力が3つある場合はそれぞれ、「in[0]」「in[1]」「in[2]」として参照することができます。

outは出力数が1の場合はValueそのものに、 2以上の場合はValueの配列となります。 つまり出力数が1の場合は値の設定は「out.setValue("a");」のようになるのに対し、 複数ある場合は「out[0].setValue("b");」となることに注意してください。

■例

ex1. 2つの入力文字列を結合して戻り値とする

out.setValue(in[0].strValue() + in[1].strValue());

ex2. 2つの入力を整数値として足したものを戻り値とする

out.setValue(in[0].longValue() + in[1].longValue());

ex3. 入力文字列がファイル名である場合、そのファイルサイズを戻り値とする

File file = new File(in[0].strValue());
out.setValue(file.length());

注:標準のJavaとは違いBeanShellでは以下のパッケージがデフォルトでimportされていますので、import文は不要です。 

    java.lang 
    java.io 
    java.util 
    java.net 
    java.awt 
    java.awt.event 
    javax.swing 
    javax.swing.event

ex4. JDBC

import java.sql.*;
Class.forName("oracle.jdbc.driver.OracleDriver");
  Connection con = DriverManager.getConnection("...", "XXXX", "XXXX");
  Statement stmt = con.createStatement();
  ResultSet rs = stmt.executeQuery("SELECT * from XXX");
  while(rs.next())
  {
  ...
  }
  stmt.close();
  con.close();

以上のようなコードも実行できます。 java.sqlはデフォルトではimportされていないのでimport文を使っていることに注意してください。

ここで使用しているoracle.jdbc.driver.OracleDriverというクラスがなかった場合には、ClassNotFoundExceptionになります。 インタプリタ内でキャッチされなかった例外は、そのままマッパーの例外となります。エラー処理フローが設定されていれば、そちらに実行がうつり、なければ実行が中止されます。

最後にConnectionをclose()していることに注意してください。 closeをし忘れると、そのまま残り、フローエンジン全体のリソースを圧迫する原因になります。 通常のJavaと同じように以下のようなコードにするのが適切です。

Class.forName("oracle.jdbc.driver.OracleDriver");
  Conneciton con = null;
  Statement stmt = null;
  try
  {
    con = DriverManager.getConnection("...", "XXXX", "XXXX");
    stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * from XXX");
    while(rs.next())
    {
      ...
    }
  }
  finally
  {
    if (stmt != null) ※nullチェックをしないとNullPointerExceptionになる可能性があります
      stmt.close(); 
    if (con != null)
      con.close();
  }

ex5. クラス定義ができないと困りそうな例

BeanShellのマニュアルに書いてあるものですが、以下に例を載せておきます。

import javax.xml.parsers.*;
import org.xml.sax.InputSource;
  factory = SAXParserFactory.newInstance();
  saxParser = factory.newSAXParser();
  parser = saxParser.getXMLReader();
  parser.setContentHandler( this ); ※ここと
  invoke( name, args ) { ※ここに注目
    System.out.println( name );
  }
  parser.parse( new InputSource("..."));

この処理系はJavaインタプリタなので、型は実行時に決まるので実は変数の型宣言がいらないという点にも注目してください。
(あっても問題はありません)

ex6. 累乗計算の例

out.setValue(Math.pow(in[0].doubleValue(),in[1].doubleValue()));

戻り値をdouble以外にしたい場合は適時キャストしてください。

以下に整数の例を挙げます

out.setValue((long)Math.pow(in[0].doubleValue(),in[1].doubleValue()));

ex7. Exceptionの使用

if (in[0].strValue().length() >= 10)
  throw new MapperException("入力が長すぎます。");
else
  out.setValue(in[0]);

インタプリタの中からExceptionをthrowする場合はMapperExceptionをthrowします。
そうすることで、指定のメッセージをエラーメッセージとして持つExceptionがMapperコンポーネントで発生したものとして処理されます。(Exceptionフローでキャッチできます。)
MapperException以外の例外をthrowした場合は、「<Inline eval of: ...>」のようなスクリプトのエラーレポートをメッセージとして持つExceptionとして処理されます。
MapperExceptionはimportなしで使用することができます。

■Valueクラス

本製品で定義しているデータ型(Integer,Decimal,String,Binary,Double,DateTime,Boolean)を表現しているクラスです。

任意の型を保持し、任意の型に変換することができます。

com.infoteria.asteria.valueパッケージに存在します。

public void setValue(boolean value)値を設定します。型はBooleanになります
public void setValue(Boolean value)
public void setValue(byte value)値を設定します。型はIntegerになります
public void setValue(short value)
public void setValue(int value)
public void setValue(long value)
public void setValue(Byte value)
public void setValue(Short value)
public void setValue(Integer value)
public void setValue(Long value)
public void setValue(float value)値を設定します。型はDoubleになります
public void setValue(double value)
public void setValue(Float value)
public void setValue(Double value)
public void setValue(BigInteger value)値を設定します。型はDecimalになります。
public void setValue(BigDecimal value)
public void setValue(char value)値を設定します。型はStringになります。
public void setValue(Character value)
public void setValue(String value)
public void setValue(Calendar value)値を設定します。型はDateTimeになります。
public void setValue(Date value)
public void setValue(byte[] value)値を設定します。型はBinaryになります。
public boolean booleanValue()値をbooleanとして取得します。
public int intValue()値をintとして取得します。
public long longValue()値をlongとして取得します。
public double doubleValue()値をdoubleとして取得します。
public BigDecimal decimalValue()値をBigDecimalとして取得します。
public Date dateValue()値をDateとして取得します。
public String strValue()値をStringとして取得します。
public byte[] byteValue()値をシステムのデフォルトエンコーディングでのバイト列として取得します。
public byte[] byteValue(String encoding)値を指定のエンコーディングでのバイト列として取得します。
public void setNull()値をnullに設定します。
public boolean isNull()値がnullならtrueを返します。

変換規則は「フローサービス マニュアル」の「フローデザイナー」-「ストリーム」-「フィールドのデータ型」の「データ型の変換」の説明を参照してください。

■注意事項

■カスタム関数の作成

右クリックメニューの「カスタム関数の作成」から作成したJavaInterpreterのコードを本製品のマッパー関数とするためのソース一式を生成することができます。
JavaInterpreterのコードをマッパー関数化することには次のようなメリットがあります。

詳細についてはSDKのドキュメントを参照してください。