4 コマンドライン・インタフェースの使用

ルールセットをSystem.inから読み込み、関数printlnwatchおよびshowからの出力をSystem.outに書き込むRLコマンドラインの概要を取得します。

4.1 コマンドライン・インタフェースの開始と使用

次のコマンドは、プロンプトRL>を使用して、単純なコマンドライン・インタフェースを起動します。

この例ではJava Beanが含まれていません。

java -jar SOA_ORACLE_HOME/soa/modules/oracle.rules_11.1.1/rl.jar -p "RL> "

ここで、SOA_ORACLE_HOMEは、SOAモジュールがインストールされる場所です(たとえば、c:/Oracle/Middleware)。-pオプションはプロンプトを指定します。

次に、このBeanにアクセスするためのRL Languageコマンドラインの開始方法を示します。

java -classpath SOA_ORACLE_HOME/soa/modules/oracle.rules_11.1.1/rl.jar;BeanPath oracle.rules.rl.session.CommandLine -p "RL> "

BeanPathは提供されているJava Beanクラスへのクラスパス・コンポーネントです。

このコマンドライン・インタフェースを終了するには、コマンド・プロンプトで特殊なアクションexit;を使用します。exit;アクションをルールセットに含めることはできません。かわりに、任意のアクションでSystem.exit(int)メソッドを起動して終了できます。

RLコマンドライン・インタフェースは、入力を行単位で蓄積し、入力ストリームに次のいずれかが含まれるとその入力を解析します。

  • 完全な名前付きルールセットが含まれる場合

  • 名前なしルールセット内の、1つ以上の完全なimportincluderulesetdefinitionアクション・コマンドが含まれる場合。

ノート:

ifelsetrycatchfinallyアクションでは、終了場所を先に確認する必要があります。else句のないifまたはfinally句のないtryをRLコマンドラインで実行するには、セミコロン終了文字を追加する必要があります。

これは、includeまたはRuleSession APIを使用してRLを実行する場合は必要ありません。

次のコード例では、RLコマンドライン入力処理のサンプルを示します。

RL> int i = 1;
RL> if (i > 0) {println("i positive");}
// nothing happens - waiting for possible "else"
;
i positive
RL>

入力は、行の最後で完了する必要があります。たとえば、行の途中でアクションが終了している場合、そのアクションは、次のアクションが行の最後で完了するまで解析されません。

例4-1 コマンドライン入力処理の例(行の終了まで待機する例)

RL> println("delayed"
); println("hello"
); println("world");
delayed
hello
world
RL>

4.1.1 コマンドライン入力処理の使用

コマンドライン入力処理に関するノート

  1. コマンドラインでは入力を複数のブロックに分割してから、各ブロックをインタプリタに渡します。閉じカッコまたはセミコロンを入力しない場合、コマンドラインでは、ブロック全体を解析する前に閉じカッコまたはセミコロンの入力を待機するため、エラーは発生しません。

  2. コマンドライン・インタプリタを対話形式、つまり-iオプションを設定して使用すると、入力が、行番号を付ける目的で、新規行で終了する小規模なルールセットに分解されます。エラーは、ルールセット内の番号を使用してレポートされます。

    たとえば、次の行で構成される入力があるとします。

    int i = 0; i = 1; // this is a ruleset
    i = "i";  // this is another ruleset 
    

    この例の場合、コマンドラインでは次のエラーがレポートされます。

    Oracle Business Rules RL: type check error
    ConversionException: cannot convert from type 'java.lang.String' to type 'int'
    at line 1 column 5 in main

    このような動作を回避するには、ルールセットの入力を明示的に囲みます。たとえば、

    ruleset main {
         int i = 0; i = 1;
         i = "i";
    }
    

    これで、エラーは3行目で発生します。あるいは、includeを使用して入力ファイルをインクルードできます。

4.2 RLコマンドラインのオプション

次の表は、RLコマンドラインのオプションについて説明しています。

表4-1 RLコマンドラインのオプション

フラグ 説明

–i

ルールセットを、デフォルトのSystem.inではなく、次の引数で指定したファイルから読み込みます。

たとえば、

-i myInput.rl

ノート: コマンドラインでは入力を複数のブロックに分割してから、各ブロックをインタプリタに渡します。ファイルmyInput.rlの最後に閉じカッコまたはセミコロンが含まれていない場合、コマンドラインでは、ブロック全体を解析する前に閉じカッコまたはセミコロンの入力を待機するため、エラーは発生しません。したがって、コマンドラインの入力を待機している間に、-iオプションを使用して提供された不完全な入力ファイルが実行され、ファイルmyInput.rlの有効なコード部分が実行されて終了する場合があります。

–c

次の引数を最初のRLコマンドとして実行し、入力の読込みを開始します。このオプションは、デバッグ用の設定と関数のファイルを読み込むのに便利です。

たとえば、

-c "include file:debugSettings.rl;"

コマンドを実行した後に入力から読み込まない場合は、コマンドの後にexit;を追加します。

たとえば、

-c "include file:script.rl; exit;"

–p

次の引数をプロンプト文字列として設定します。

たとえば、

-p "RL> "

-o

printlnwatchおよびshowからの出力を、System.outではなく、次にくる引数で指定された名前のファイルに書き込むように指定します。

たとえば:

–o debug.log

–v

バージョン情報を出力します。

4.3 RLコマンドラインの組込みコマンド

RLコマンドライン・インタフェースによって実装されるコマンドのリストを取得します。これらのコマンドはRLの一部ではありません。

したがって、これらのコマンドをブロック内に表示したり、ルールセットに含めることはできません。

4.3.1 clearコマンド

現行のRuleSessionオブジェクトを破棄し、新規オブジェクトを割り当てます。これによって、ルール、変数、クラスおよび関数がすべて破棄されます。

clear;を使用してコマンドラインを再開するかわりに、exit;と入力し、Javaコマンドを再発行して別のコマンドラインを開始することもできます。

4.3.2 exitコマンド

コマンドライン・インタフェースを終了します。コマンドライン・インタフェースは、入力のend-of-fileに到達した場合にも終了します。