Oracle Business Rules ユーザーズ・ガイド 10g(10.1.3.1.0) B31866-02 |
|
この章では、Oracle Business Rules Rule Author(Rule Author)をチュートリアル形式で紹介します。Rule Authorの起動方法、データ・モデルの作成方法およびルールの作成および保存方法について説明します。また、Rules Engineとともに動作するJavaサンプル・アプリケーションの作成方法も示します。
このマニュアルでは、レンタカー・サンプルを使用して、Rule Authorでの作業方法を説明します。レンタカー・サンプルでは、運転者データを使用して運転者情報を指定し、ビジネス・ルールを使用してレンタカー会社のサービス担当が運転者の年齢制限により車両の貸出しを断る必要があるかどうかを判断します。この例を使用して、UnderAgeルールという1つのルールを作成します(ルールはレンタカー会社のビジネス・ルールに従って指定されます)。
この章の内容は次のとおりです。
Oracle Application Serverを使用している場合は、最初に適切な権限を持つユーザーを作成してから、Rule Authorを起動して使用する必要があります。手順は次のとおりです。
「名前」フィールドにRule Authorへのログインに使用する名前(ruleadmin
など)を入力します。このユーザーのパスワードを入力および確認します。「ロールの割当て」セクションで、ダブルクリックまたは矢印を使用して、このユーザーにrule-administrators
ロールを割り当てます。作業が終了した後、「OK」をクリックします。
Rule Authorは、ホーム・ページのURLを入力することで起動します。ホーム・ページのURLには、通常、ホスト・コンピュータ名とインストール時にアプリケーション・サーバーに対して割り当てられたポート番号、およびRule Authorのホーム・ページのパスが含まれています。次に例を示します。
http://myhost1.mycompany.com:8888/ruleauthor/
図2-1に、Rule Authorの「ログイン」ページを示します。Rule Authorユーザーの作成(2.1項「Rule Authorユーザーの作成」)時に指定したユーザー名とパスワードを指定します。
ログインしてから、「リポジトリ」タブをクリックすると、Rule Authorのリポジトリ接続ページが表示されます(図2-2を参照)。操作を実行する前に、リポジトリに接続する必要があります。詳細は、2.4.1項「Rule Authorリポジトリへの接続」を参照してください。
Rule Authorの各ページには、「ログアウト」、「ヘルプ」、および「バージョン情報」へのリンクが示されます。これらのリンクは次のように使用できます。
「ホーム」タブをクリックして、Rule Authorのホーム・ページにアクセスします(図2-4を参照)。ホーム・ページには2つのペインがあります。上部のペインには複数のタブが表示され、下部のペインには現在選択されているタブの内容が表示されます。
Rule Authorでの作業は、ディクショナリから着手する必要があります。Rule Authorでは、ルールおよび関連する定義をディクショナリに格納します。ディクショナリを作成または保存するには、最初に、ディクショナリを格納するリポジトリに接続する必要があります。出荷時のRule Authorでは、WebDAV(Web Distributed Authoring and Versioning)リポジトリとファイル・リポジトリの2種類のリポジトリがサポートされています。ここでは、Java版How-Toのディクショナリを作成し、保存します。
この章の例では、ディクショナリをWebDAVリポジトリに保存します。
注意:
この章に記載されているディクショナリを作成するには、WebDAVリポジトリまたはファイル・リポジトリを使用して新しいディクショナリを作成するか、あるいはJava版How-Toとともに提供される 手順については、2.4.2項「Rule Authorディクショナリの作成」を参照してください。 |
Oracle Business Rulesでは、ルールおよびそのルールに関連付けられているデータ・モデルをディクショナリに格納します。ディクショナリはリポジトリに作成および保存されます。
注意: WebDAVリポジトリを使用する場合、このリポジトリが、接続する前に存在している必要があります。詳細は、付録B「リポジトリを利用したRule AuthorとRules SDKの使用」を参照してください。 |
リポジトリに接続する手順は、次のとおりです。
http://www.fully_qualified_host_name.com:port/repository_name
WebDAVリポジトリの設定方法の詳細は、B.1項「WebDAVリポジトリの使用」を参照してください。
Rule Authorディクショナリは最上位コンテナであり、Rule Authorで作業する起点となります。ディクショナリは、通常、アプリケーションのルール部分に対応しています。
ディクショナリを作成する手順は、次のとおりです。
CarRental
と入力します(図2-7を参照)。
別のディクショナリ名で保存する場合や現行のディクショナリにバージョンを指定する場合は、次のように「別名保存」を使用します。
CarRental
など)。
HowTo
などです(図2-8を参照)。
データの消失を防止するために、ディクショナリを定期的に保存してください。ディクショナリを保存するには、次のいずれかを実行します。
前述のいずれかの操作を実行した後、「ディクショナリの保存」ページの「保存」をクリックします。「保存」をクリックすると、ステータス領域に確認メッセージが表示されます。次に例を示します。
Dictionary 'CarRental(HowTo)' has been saved
関連項目:
Rule Authorのセッションのタイムアウトを構成する方法の詳細、およびタイムアウトの発生時にRule Authorが現在の作業をディクショナリ・バージョンに保存する方法の詳細は、「Rule Authorのセッション・タイムアウト」を参照してください。 |
ルールに対する作業の前に、データ・モデルを定義する必要があります。データ・モデルには、Javaクラス・ファクト・タイプ、XMLファクト・タイプおよびRL Languageファクト・タイプなど、ルールで使用されるファクトやデータ・オブジェクトに関するビジネス・データ定義が格納されます。説明を単純化するために、この項ではJavaファクト・タイプをJavaファクトと記述します。ここでは、Javaファクトのみを取り扱います。
内容は次のとおりです。
Java版How-Toには、$HowToDir/lib
ディレクトリのcar-objs.jar
ファイルが格納されています。このJARファイルには、レンタカー・サンプルのDriver
クラスが指定されています。Driver
オブジェクトに対するJavaソースは、$HowToDir/src/carrental
ディレクトリにあります。HowToDirには、Java版How-Toをインストールしたディレクトリが入ります。
Javaファクトをデータ・モデルにインポートする前に、Rule Authorで使用可能なJavaファクトが組み込まれているクラスおよびパッケージを作成する必要があります。そのためには、Rule Authorを使用して、Javaクラスが格納されているクラスパスを指定します。たとえば、Driver
というJavaクラスのクラスパスを追加する手順は、次のとおりです。
CarRental
ディクショナリとHowTo
バージョンを選択して、「ロード」をクリックします。
「Javaファクト」をクリックして「Javaファクト・サマリー」ページを表示します(図2-9を参照)。
$HowToDir/lib/car-objs.jar
$HowToDirを、Java版How-Toをインストールしたディレクトリに置換します。
carrental
パッケージが「クラス」ボックスに追加されます(図2-10を参照)。次に、「クラス・セレクタ」ページからデータ・モデルにインポートするJavaクラスを選択する必要があります。Driver
クラスをデータ・モデルに追加する手順は、次のとおりです。
1 class or package has been imported.
ユーザー・クラスパスを指定して、JavaクラスをRule Authorにインポートする際の注意点は、次のとおりです。
java
、javax
およびorg
の3つのパッケージが指定されます。これらのパッケージには、Rule AuthorによってJavaランタイム・ライブラリ(rt.jar)からインポートできるクラスが格納されています。Rule Authorでは、これらのクラスを「クラス」領域から削除できません(また、関連するクラスパスは「現在のクラスパス」フィールドには表示されません)。
ArrayList
をObject
型の変数に割り当てる場合は、ArrayList
、AbstractList
およびAbstractCollection
をデータ・モデルにインポートする必要があります。このように指定しないと、型チェックが正しく機能せず、式が有効になりません。
¥lib¥car-objs.jar
を使用できます。$HowToDirには、Java版How-Toをインストールしたディレクトリが入ります。
詳細は、D.6項「データ・モデル内のクラス順序と階層の保持」を参照してください。
たとえば、c:¥myprj¥cool¥example¥Test1.class
にあるcool.example.Test1
というクラスをデータ・モデルにインポートする場合は、「ユーザー・クラスパス」の値としてc:¥myprj
を指定します。
「定義」タブでデータ・モデルを操作していて、作業を完了する場合は、ディクショナリを保存してください。
定義をディクショナリに保存する手順は、次のとおりです。
ビジネス用語を使用することで、ビジネス・アナリストは、Javaパッケージ名、クラス名、メソッド名またはメンバー変数名を使用せずに、簡単に理解できる名前を使用してRule Authorでルールを作成できます。Rule Authorには別名機能が用意されています。この機能を使用すると、ビジネスマン向けの用語を使用してルールのビジネス・オブジェクトまたはファクトを参照できます。必要な手順は、ルールに使用する予定のビジネス・オブジェクトに対して、ビジネス用語を定義することのみです。また、「ルールセット」タブからルールを作成する際は、Rule Authorの「参照可能」ボックスを使用して、Rule Authorのリストに表示するプロパティとメソッドを指定します。
内容は次のとおりです。
Javaファクト定義に対してビジネス用語を指定する手順は、次のとおりです。
carrental.Driver
クラスを含む表が表示されます。
carrental.Driver
クラスに対するJavaファクトのプロパティとメソッドの表を表示します。
carrental.Driver
の「エイリアス」フィールドの別名DriverData
を入力します。
age
エントリに対して、適切な別名を指定します。たとえば、「エイリアス」フィールドにDriverAge
と入力します。
DriverName
と入力します。
RL Language関数に対してビジネス用語を指定する手順は、次のとおりです。
「RL関数」
をクリックし、「RL関数サマリー」ページを表示します。レンタカー・サンプルでは、DM.assertXPath
関数およびDM.println
関数を含む表が表示されます。
DM.println
関数について、編集アイコンをクリックして詳細を表示します。
PrintOutput
と入力します。
プロパティまたはメソッドがRule Authorのリストで参照可能かどうかを指定する手順は、次のとおりです。
carrental.Driver
クラスを含む表が表示されます。
carrental.Driver
に対するJavaファクトのプロパティとメソッドの表を表示します。
age
およびname
のみを参照可能にする必要があります。
この項では、レンタカー・サンプルのルールを定義し、Rule Authorでルールを作成する基本的な手順を示します。
内容は次のとおりです。
Rule Authorを使用してルールを作成する前に、ルールセットを作成する必要があります。ルールセットとはルールのコンテナです。
ルールセットを作成する手順は、次のとおりです。
vehicleRent
と入力します。
vehicleRent
ルールセットを作成します。「OK」をクリックすると、ナビゲーション・ツリーの「ルールセット」の下に新しいルールセットが表示されます。
ルールセットを作成した後は、ルールセットにルールを作成できます。ここでは、UnderAgeというルールを作成します。このルールは、次の内容をテストします。
If the age of a driver is younger than 21, then decline to rent
UnderAgeルールには、Rules Engineが照合する単一のパターンと、そのパターンに適用されるテストが指定されます。
次のアクションがUnderAgeルールに関連付けられます。
Rule Authorを使用してUnderAgeルールを追加する手順は、次のとおりです。
vehicleRent
ルールセットが格納された「ルールセット」フォルダが表示されます。
UnderAge
と入力します。
Under age driver rule
と入力します(図2-14を参照)。Rules Engineを実行すると、ルール・パターンに対してファクトがチェックされ、一致するパターンが検索されます。UnderAgeルールのパターンを追加するには、次の手順を実行します。
このボックスは、一致するたびに(一致するすべての運転者に)、ルールを起動することを指定します。別の選択肢の1つである「次のケースが少なくとも1つある」の値は、少なくとも1つが一致する(そのような運転者が1人いる)場合に、ルールを1回行うことを選択します。「次のケースがない」の値は、一致しない(一致する運転者がいない)場合に、ルールを1回起動することを指定します。
driver
と入力(パターンのバインド変数名を定義)します。この値を使用して、単一のルールで同じタイプの複数のインスタンスをテストできます。たとえば、パターンのバインド変数を使用すると、driver1.age
>
driver2.age
などの比較で、指定した名前を使用して、ある運転者と他の運転者との一致を比較できます。
<make a choice>
というテキストが表示されます。このボックスには、データ・モデルから使用可能なファクト・タイプが表示されます。このボックスで、DriverData
(ファクト・タイプの別名をデータ・モデルに定義していない場合はcarrental.Driver
)を選択します。
パターンに対してテストが定義されていないと、定義するアクションはすべての運転者に適用されます。パターンにテストを定義するには、2.7.2.3項の説明に従って「パターン定義」ページを続行します。
パターンに対してテストを追加する手順は、次のとおりです。
driver.DriverAge
(このメンバー変数の別名をデータ・モデルに定義していない場合はdriver.age
)を選択します。
Any
とFixed
の固定値を備えたドロップダウン・リストがあります(図2-17を参照)。これらの値は制約と呼ばれ、カスタマイズを有効化または無効化します。Fixed
を使用すると、フィールドは読取り専用になります。これにより、このフィールドはカスタマイズなしに指定されます。Any
を選択すると、Rule Authorで値を変更できることが指定されます(これにより、技術を持たないユーザーでも、「カスタマイズ」タブからフィールドに変更を加えることができます。)。「値」フィールドの制約としてAny
を選択します。
パターンに対してテストを追加する際の注意点は、次のとおりです。
アクションはパターン一致と関連しています。ルールの「if」部が一致すると、Rules Engineによって「then」部がアクティブになり、ルールに関連するアクションの実行が準備されます。
ここでは、UnderAgeルールに対して2つのアクションを追加します。第1のアクションは結果の出力です。第2のアクションは、Rules Engineからの運転者ファクトの取消しです。次のような様々な理由で、ファクトの取消しが必要になることがあります。
UnderAgeルールの一致に関する結果を出力するアクションを追加する手順は、次のとおりです。
Call
項目を選択します。「アクション・パラメータ」ボックスが表示されます。
PrintOutput
(この関数の別名を定義していない場合はDM.println
)を選択します。「関数の引数」ボックスが開きます。
"Rental declined " + driver.DriverName + " Underage,age is:" + driver.DriverAge
次に、UnderAgeルールに対して取消しアクションを追加します。次の手順を実行し、この第2のアクションをルールに追加します。
Retract
を選択します。「アクション・パラメータ」ボックスが表示されます。
driver
を選択します。パターン名driver
は、パターンが一致した単一のインスタンスを参照します。
注意: アクションをルールに追加する場合、連続して追加できるのは新しいアクションのみです。あるアクションがそれ以前のアクションの結果に依存する場合は、アクションを追加する順序が重要になります。アクション・タイプの詳細は、表3-2を参照してください。 |
Rule Authorの「カスタマイズ」タブは、ビジネス・ユーザー用に設計されています。ルール開発者は、「ルールセット」タブから使用できる「パターン定義」ページの許可された値のフィールドを使用して、カスタマイズを許可するかどうかを指定します。カスタマイズが許可されている場合は、カスタマイズ可能なフィールドについて、有効な値の範囲を指定できます。その結果、ビジネス・ユーザーは「カスタマイズ」タブを使用して値を変更できます。
この例では、「カスタマイズ」タブで、運転者の年齢制限を変更するようにUnderAgeルールを変更できます(このサンプルでは、値に制限はなく、あらゆる指定値が有効です)。
「カスタマイズ」タブを使用してUnderAgeルールを変更する手順は、次のとおりです。
driver.DriverAge < 21
のテストを編集できるテキスト入力フィールドがあります。このフィールドで、値21
を19
に変更します。
ディクショナリを保存すると、Java版How-Toに対するデータ・モデルとルールの作成は終了となります。
データ・モデルおよびルール指定したルールセットが格納されているディクショナリを作成および保存した後は、ルール対応Javaアプリケーションでディクショナリを使用できます。この項では、ルール対応Javaアプリケーションを作成する手順を示します。
内容は次のとおりです。
このサンプル・アプリケーションの完全なコードは、$HowToDir/src/carrental
ディレクトリのTestMain.java
を参照してください。$HowToDirには、Java版How-Toをインストールしたディレクトリが入ります。
ルール対応プログラムを記述する最初の手順は、必要なクラスのインポートです。例2-1に、レンタカー・サンプルのためのTestMain.java
アプリケーションからのインポートを示します。
import java.util.Date; import oracle.rules.sdk.ruleset.RuleSet; import oracle.rules.sdk.repository.RuleRepository; import oracle.rules.sdk.repository.RepositoryManager; import oracle.rules.sdk.repository.RepositoryType; import oracle.rules.sdk.repository.RepositoryContext; import oracle.rules.sdk.dictionary.RuleDictionary; import oracle.rules.sdk.exception.RepositoryException; import oracle.rules.sdk.store.jar.Keys; import oracle.rules.rl.RuleSession; import carrental.Driver;
ルール対応Javaアプリケーションを作成する場合は、次の手順を実行し、ディクショナリにアクセスしてルールセットを指定します(例2-2を参照)。
String
を作成します。
RuleType
オブジェクトを使用して、RepositoryManager.getRegisteredRepositoryType
メソッドから取得するリポジトリを保持します。例2-2 は、ファイル・タイプ・リポジトリを示しています。
リポジトリ・マネージャ
のcreateRuleRepositoryInstance
メソッドを使用してリポジトリ・インスタンスを作成します。
RepositoryContext
を定義し、適切なプロパティを設定します。ファイル・リポジトリの場合は、例2-2のrepoPath
パラメータに伴って記載されているように、リポジトリのパスを指定します。
RuleRepository
オブジェクトrepo
のinit
メソッドを使用して、リポジトリ・インスタンスを初期化します。String fs = "/"; String repoPath = "dict" + fs + "CarRepository"; RepositoryType jarType = RepositoryManager.getRegisteredRepositoryType( Keys.CONNECTION ); RuleRepository repo = RepositoryManager.createRuleRepositoryInstance( jarType ); //fill in initialization property values RepositoryContext jarCtx = new RepositoryContext(); jarCtx.setProperty( oracle.rules.sdk.store.jar.Keys.PATH, repoPath ); //initialize the repository instance. repo.init( jarCtx );
例2-2のように、ファイル・リポジトリではなくWebDAVリポジトリをロードする場合は、getWebDAVRepository
メソッドを使用してください。コメントには、HowToDir/src/carrental
ディレクトリのTestMain.java
が含まれます。$HowToDirには、Java版How-Toをインストールしたディレクトリが入ります。
ルールを使用するJavaアプリケーションを作成する場合は、指定されたバージョンのディクショナリをロードする必要があります。例2-3のように、RuleDictionary
オブジェクトを使用してディクショナリをロードします。この例では、CarRental
ディクショナリをHowTo
バージョンでdict
という名前のオブジェクトにロードします。CarRental
ディクショナリが、リポジトリで使用可能である必要があります。バージョン名HowTo
のCarRental
ディクショナリは、以前にRule Authorを使用して作成されています。
RuleDictionary dict = repo.loadDictionary( "CarRental", "HowTo" );
ディクショナリをロードした後は、ルールセットを指定し、Rules SDKを使用してRL Languageプログラムを生成する必要があります。この手順は、ディクショナリが中間XML形式を使用してデータ・モデルとルールを格納するために必要です。Rules SDKには、ルールにアクセスするためのメソッドと関連するデータ・モデルがあります。Rules SDKは、中間XML形式からのマッピングを実行して、Rules Engineで動作するRL Languageプログラムを作成します。
Rule Authorでは、各ルールセットには2つのコンポーネント(ディクショナリのルールセットすべてに適用されるグローバルなデータ・モデルと、ルールセットに関連付けられている一連のルール)が挿入されます。例2-4に、これら2つのコンポーネントについてRL Languageを生成するコードを示します。
//init a rule session String rsname = "vehicleRent"; String dmrl = dict.dataModelRL(); String rsrl = dict.ruleSetRL( rsname );
ルールとデータ・モデルが挿入されているRL Languageプログラムを生成すると、いつでもルール・セッションで作業できる状態になります。ルール・セッションは、Rules Engineを初期化し、多数のルール実行にわたってRules Engineの状態を保守します。RuleSession
オブジェクトは、アプリケーションとRules Engineとの間のインタフェースです。
例2-5に、RuleSession
オブジェクトを作成し、RL Languageプログラムを実行するコードを示します。
executeRuleset()
メソッドは、文字列として渡されたRL Languageプログラムを実行します。このメソッドは、指定のRL Languageプログラムの解析をRules Engineに指示します。
RuleSession session = new RuleSession(); session.executeRuleset( dmrl ); session.executeRuleset( rsrl ); session.callFunction( "reset" ); session.callFunction( "clearRulesetStack" ); session.callFunctionWithArgument( "pushRuleset", rsname );
データ・モデルとルールセットがロードされると、ルール・セッションは、そのルール・セッション用にアサートするファクトに対していつでも指定のルールセットを実行できる状態になります。
ルール・セッションを実行する前に、通常はいくつかのファクトをアサートします。ルール・セッションでデータ・モデルを実行する場合は、新しいファクトをアサートするルール・セッションを準備します。ファクトをアサートするには、session.callFunctionWithArgument()
メソッドと、ファクトを引数として提供するassert
関数を使用します。
例2-6に、レンタカー・サンプルのDriver
オブジェクトを準備して、3つのファクトをアサートするサンプル・コードを示します。
// Date Function static public Date getDate(String dateStr ) { Date result = null; try { java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat( "MM/DD/YYYY" ); result = sdf.parse( dateStr ); } catch( Throwable t) { t.printStackTrace(); } return result; } // Driver d1 record Date d1LicIssueDate = getDate( "10/1/1969" ); Driver d1 = new Driver( "d111", "Dave", 50, "sports", "full", d1LicIssueDate, 0, 1, true ); // Driver d2 record Date d2LicIssueDate = getDate( "8/1/2004" ); Driver d2 = new Driver( "d222", "Qun", 15, "truck", "provisional", d2LicIssueDate, 0, 0, true ); //Driver d3 record Date d3LicIssueDate = getDate( "6/1/2004" ); Driver d3 = new Driver( "d333", "Lance", 44, "motorcycle", "full", d3LicIssueDate, 0, 1, true ); session.callFunctionWithArgument( "assert", d1 ); session.callFunctionWithArgument( "assert", d2 ); session.callFunctionWithArgument( "assert", d3 );
例2-7に、ルール・セッションを実行するコードを示します。
session.callFunction( "run");
$HowToDir/lib
ディレクトリには、TestMain.jar
が格納されています。これは、CarRental
ディクショナリを使用するOracle Business RulesJavaアプリケーションで、ただちに実行できます。ディクショナリ名を変更した場合は、TestMain.java
を変更する必要があります(ソースはディレクトリ$HowToDir/src
にあります。HowToDirには、Java版How-Toをインストールしたディレクトリが入ります)。
例2-8に、TestMain
内でアサートされたファクトを使用して実行しているTestMain
からの出力を示します。
java carrental.TestMain Rental declined Qun Under age: age is: 15
すべてのファクトがルールにマッチして出力を生成するわけではないことに注意してください。この例は、UnderAgeルールに一致する、アサートされたファクトである運転者に関する出力を示しています。
|
![]() Copyright © 2005, 2006, Oracle Corporation. All Rights Reserved. |
|