E Oracle Business RulesとJSR-94実行セットの使用

Java SEまたはJava EEクライアントからルール・エンジンにアクセスするための標準JavaランタイムAPIを定義するJava Rule Engine API (JSR-94)の仕様の概要。

詳細は、次を参照してください。

E.1 Oracle Business RulesとJSR-94ルール実行セットの概要

Oracle Business Rulesには、JSR-94サポート機能が用意されています。このため、より移植性の高いルール対応アプリケーションを作成できます。

Oracle Business RulesルールセットからJSR-94実行セットを作成し、これらの実行セットからJSR-94ルール・セッションを作成できます。詳細は、「Oracle Business RulesルールセットからのJSR-94ルール実行セットの作成」を参照してください。

Oracle Business Rulesルールセットにアクセスし、JSR-94 APIを使用してOracle Business Rules Engineに対して実行できます。詳細は、「JSR-94インタフェースをOracle Business Rulesとともに使用」を参照してください。

Oracle Business Rulesには、便利なJSR-94 APIの拡張機能も用意されています。詳細は、「Oracle Business RulesのJSR-94拡張機能の使用」を参照してください。

E.2 Oracle Business RulesルールセットからのJSR-94ルール実行セットの作成

JSR-94をRL Languageテキストでルールとともに使用するには、ルールをJSR-94ルール実行セットにマップする必要があります。

JSR-94ルール実行セット(ルール実行セット)は、一緒に実行されることを前提としたルールのコレクションです。ルール実行セットは、実行する前に登録する必要もあります。登録によってルール実行セットがURIと関連付けられ、そのURIを使用して、JSR-94ルール・セッションを作成できます。

ノート:

Oracle Business Rulesでは、JSR-94実行セットの登録は永続的ではありません。したがって、ルール実行セットは、JSR-94 RuleExecutionSetProviderインタフェースを使用し、プログラム上で登録する必要があります。

詳細は、「createRuleExecutionSetを使用したルール実行セットの作成」を参照してください。

E.2.1 Oracle Business RulesのRL Languageテキストからのルール実行セットの作成

JSR-94を、テキストとして保存されたRL言語ルールセットとともに使用できます。この場合、Oracle RLテキストはルール実行セットに直接含められます。RL言語テキストを含める際に使用できるJSR-94拡張機能の詳細は、「拡張されたcreateRuleExecutionSetを使用したルール実行セットの作成」を参照してください。

Oracle Business RulesのOracle RL Languageテキストからルール実行セットを作成するには:

  1. RL Languageのマッピング情報をXML文書に指定します。表E-1に、ルール実行セットの作成に必要なマッピング要素を示します。次の例には、RL LanguageテキストをJSR-94ルール実行セットにマッピングするためのサンプルのXML文書を示します。

    <rule-execution-set xmlns="http://xmlns.oracle.com/rules/jsr94/configuration"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
        <name>CarRentalDemo</name>
        <description>The Car Rental Demo</description>
        <rule-source>
            <rl-text>
             ruleset DM {
                fact class carrental.Driver {
                   hide property ableToDrive, driverLicNum, licIssueDate, licenceType,
                   llicIssueDate, numPreAccidents, numPreConvictions,
                   numYearsSinceLicIssued, vehicleType;
                };
    
                   final String DeclineMessage = &quot;Rental declined &quot;;
    
                   public class Decision  supports xpath {
                      public String driverName;
                      public String type;
                      public String message;
                  }
    
                   function assertXPath(String package,
                                        java.lang.Object element, String xpath) {
                      //RL literal statement
                      main.assertXPath( package, element, xpath );
                   }
    
                   function println(String message) {
                      //RL literal statement
                      main.println(message);
                   }
    
                   function showDecision(DM.Decision decision) {
                      //RL literal statement
                      DM.println( &quot;Rental decision is &quot; + decision.type +
                                  &quot; for driver &quot; + decision.driverName +
                                  &quot; for reason &quot; + decision.message);
                   }
             }
            </rl-text>
        </rule-source>
        <rule-source>
            <rl-text>
                ruleset vehicleRent {
                    rule UnderAge {
                        priority = 0;
                        if ((fact carrental.Driver v0_Driver &amp;&amp;
                            (v0_Driver.age &lt; 19))) {
                                DM.println( &quot;Rental declined: &quot; + v0_Driver.name +
                                &quot; Under age, age is: &quot; + v0_Driver.age);
                                retract(v0_Driver);
                        }
                    }
                }
            </rl-text>
        </rule-source>
        <ruleset-stack>
            <ruleset-name>vehicleRent</ruleset-name>
        </ruleset-stack>
    </rule-execution-set>
    
  2. 次に、このXML文書をJSR-94管理APIで使用して、ルール実行セットを作成します。作成したルール実行セットは、RuleAdministrationインスタンスを使用して、JSR-94ランタイムに登録されます。

    表E-1 JSR-94のOracle Business RulesのOracle RL LanguageテキストXMLマッピング要素

    要素 説明

    <rule-source>

    Oracle Business Rulesルールセットを含む明示的なRL言語テキストを含む<rl-text>タグが含まれます。複数の<rule-source>タグを使用して、複数のルールセット指定できます(解析順に指定)。

    <ruleset-stack>

    初期ルールセット・スタックを構成するルールセットのリストを指定します。リストに指定するルールセットの順序は、スタックの最上位から最下位です。

ノート:

<rl-text>要素に、事前定義済のXMLエンティティを含めることはできません。これには、「&」、「>」、「<」、「"」および「\」の各文字が含まれます。

E.2.2 URLで指定したOracle RLテキストからのルール実行セットの作成

JSR-94は、URLを使用して指定したOracle RLルールセットとともに使用できます。URLを指定する際に使用できるJSR-94拡張機能の詳細は、「拡張されたcreateRuleExecutionSetを使用したルール実行セットの作成」を参照してください。

URLで指定したOracle RLテキストからルール実行セットを作成するには:

  1. Oracle RLのマッピング情報をXML文書に指定します。表E-2に、ルール実行セットの作成に必要なマッピング要素を示します。次の例には、Oracle RLテキストをJSR-94ルール実行セットにマッピングするためのサンプルのXML文書を示します。

    <?xml version="1.0" encoding="UTF-8"?>
    <rule-execution-set xmlns="http://xmlns.oracle.com/rules/jsr94/configuration"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
        <name>CarRentalDemo</name>
        <description>The Car Rental Demo</description>
        <rule-source>
            <rl-url>
                file:rl/DM.r1
            </rl-url>
        </rule-source>
        <rule-source>
            <rl-url>
                file:r1/VehicleRent.r1
            </rl-url>
        </rule-source>
        <ruleset-stack>
            <ruleset-name>vehicleRent</ruleset-name>
        </ruleset-stack>
    </rule-execution-set>
    
  2. 次に、このXML文書をJSR-94管理APIで使用して、ルール実行セットを作成します。作成したルール実行セットは、RuleAdministrationインスタンスを使用して、JSR-94ランタイムに登録されます。

    表E-2 JSR-94のOracle Business RulesのOracle RL URL XMLマッピング要素

    要素 説明

    <rule-source>

    RL言語テキストの場所を指定するURLを含む<rl-url>タグが含まれます。複数の<rule-source>タグを使用して、複数のルールセット指定できます(解析順に指定)。

    <ruleset-stack>

    初期ルールセット・スタックを構成するルールセットのリストを指定します。リストに指定するルールセットの順序は、スタックの最上位から最下位です。

E.2.3 複数のソースからのルールセットを持つルール実行セットの作成

ルール実行セットに複数のソースから生成されたルールが含まれ、それらのソースがルール・デザイナで定義されたルールセットとRL言語のルールセットの混在である場合があります。この場合、XML要素<rule-execution-set>のセットには、ルールの各ソースごとに1つずつ複数の<rule-source>要素が含まれます。<rule-source>は、Rules Engineでの解析順にリストする必要があります。

ノート:

このリリースのOracle Business Rulesでは、JSR-94ルール実行セットで参照できるのは1つのルール・デザイナ・ディクショナリのみです。

E.3 JSR-94インタフェースをOracle Business Rulesとともに使用

この項では、JSR-94インタフェースに関してOracle Business Rules固有の事項を説明します。

この項では、次の項について説明します。

  • createRuleExecutionSetを使用したルール実行セットの作成

  • createRuleSessionによるルール・セッションの作成

  • JSR-94メタデータの操作

  • Oracle Business Rules JSR-94拡張の使用

E.3.1 createRuleExecutionSetを使用したルール実行セットの作成

javax.rules.adminRuleExecutionSetProviderおよびLocalRuleExecutionSetProviderインタフェースには、RuleExecutionSetオブジェクトを作成するためのcreateRuleExecutionSetが含まれています。

createRuleExecutionSetメソッドを使用するために、最初の引数は表E-3に示すように解析されます。

表E-3 createRuleExecutionSetメソッドの最初の引数の種類

引数 説明

org.w3c.dom.Element

構成スキーマからの<rule-execution-set>要素のインスタンスを指定します。

java.lang.String

構成スキーマからの<rule-execution-set>要素のインスタンスであるXML文書の場所のURLを指定します。

java.io.InputStream

構成スキーマからの<rule-execution-set>要素のインスタンスであるXML文書を読み込むために使用する入力スキームを指定します。

java.io.Reader

構成スキーマからの<rule-execution-set>要素のインスタンスであるXML文書を読み込むために使用する文字読取装置を指定します。

ノート:

JSR-94には、java.lang.Object引数を取るcreateRuleExecutionSetメソッドも含まれます。この引数は、ルール実行セットの抽象構文ツリーであると想定されています。Oracle Business Rules for Oracle Fusion Middleware 11gリリース1 (11.1.1)では、この引数によるこれらのメソッドの使用はサポートされていません。java.lang.Object引数を使用してこれらのメソッドを起動すると、RuleExecutionSetCreateExceptionという例外が発生します。

createRuleExecutionSetメソッドの第2引数は、ベンダー固有プロパティのjava.util.Mapです。

E.3.2 createRuleSessionを使用したルール・セッションの作成

クライアントでは、RuleRuntimeクラスのcreateRuleSessionメソッドを使用して、JSRー94ルール・セッションを作成します。このメソッドは、ベンダー固有プロパティのjava.util.Map引数を取ります。この引数は、Oracle Business Rules oracle.rules.rl.RuleSessionに対して定義されたプロパティを渡すために使用できます。

ルール実行セットにURLまたはリポジトリ・ルール・ソースが含まれる場合、そのソースからのルールは、新規のRuleSessionが作成されるたびに取得されます。

E.3.3 JSR-94メタデータの使用

JSR-94では、ルール実行セットおよびルール実行セット内のルールに対して、メタデータを使用できます。Oracle Business Rules実装では、JSR-94仕様以外のメタデータは追加されません。

ルール実行セットの説明はオプション項目であるため、説明がない場合があります。説明がない場合は、空の文字列が戻されます。ルールについては、ルール名のみが使用可能で、説明は空の文字列で初期化されます。

E.3.4 Oracle Business RulesのJSR-94拡張機能の使用

この項では、JSR-94実装クラスで提供される拡張機能について説明します。

E.3.4.1 拡張されたcreateRuleExecutionSetを使用したルール実行セットの作成

Oracle Business Rulesには、RuleExecutionSetを作成する際に入力として必要なXML制御ファイルを簡単に作成するために、ヘルパー関数が用意されています。

RLLocalRuleExecutionSetProviderクラスのヘルパー・メソッドcreateRuleExecutionSetを使用できます。createRuleExecutionSetメソッドには、次のシグネチャがあります。

RuleExecutionSet createRuleExecutionSet(String name,
                                        String description,
                                        RuleSource[] sources,
                                        String[] rulesetStack,
                                        Map properties)

表E-4に、createRuleExecutionSetの引数を示します。

表E-4 createRuleExecutionSetの引数

引数 説明

name

ルール実行セットの名前を指定します。

description

ルール実行セットの説明を指定します。

sources

ルールのソースを指定する配列を指定します。RuleSourceは、次のクラスで実装されるインタフェースです。

  • RLTextSource: RL Languageテキスト用のRL Languageテキスト

  • RLUrlSource: RL LanguageテキストのURL用のRL Language URL

詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』oracle.rules.jsr94.adminパッケージに関する説明を参照してください。

rulesetstack

ルールの実行前に設定されるRL Languageルールセット・スタックの初期内容を指定します。配列の内容は、スタックの最上位(0番目の要素)から最下位(最後の要素)の順に指定します。

properties

Oracle固有プロパティ。

E.3.4.2 JSR-94でのRL Language関数の起動

JSR-94ルール・セッションとのステートフルな相互作用では、ユーザーが任意にRL Language関数を起動できることが必要です。JSR-94 StatefulRuleSessionインタフェースを実装するクラスによって、oracle.rules.rl.RuleSessionクラスのcallFunctionメソッドにアクセスできます。

次の例に、JSR-94 StatefulRuleSessionで引数なしのRL Language関数を起動する方法を示します。

import javax.rules.*;
...
StatefulRuleSession session;
...
((oracle.rules.jsr94.RLStatefulRuleSession) session).callFunction("myFunction");