Oracle Business Rules ユーザーズ・ガイド 10g(10.1.3.1.0) B31866-02 |
|
この章では、XML文書を使用してOracle Business Rulesで作業するためのチュートリアルを提供します(ファクトはXML文書で提供されます)。また、XMLを使用するルール対応Javaアプリケーションの作成方法も示します。
ルールのXML版How-Toでは、XML文書で提供される運転者データを使用して運転者情報を指定し、この章で作成するビジネス・ルールを使用してレンタカー会社のサービス担当が(定義するレンタカー会社のビジネス・ポリシーに従って)運転者の年齢制限により車両の貸出しを断る必要があるかどうかを判断します。
この章の内容は次のとおりです。
Rule Authorを使用して、XML要素をデータ・モデルにインポートし、条件式にXML要素を使用してルールを記述できます。たとえば、アプリケーションに関連するデータが格納されているXML文書があり、そのXML文書にスキーマが関連付けられている場合は、Rule Authorを使用して、指定の要素に基づいてXMLスキーマからルールを定義できます。
Rule AuthorでXML文書を使用して、XMLスキーマに着手する際に必要な手順は、次のとおりです。
Rule Authorでルールを作成した後は、XML文書でルールを使用するアプリケーションを記述できます。XML文書の処理を完了するには、XML文書の要素をRules Engineセッションにアサートします。
JAXBの詳細は、
http://java.sun.com/webservices/jaxb/を参照してください。
Rule Authorは、ホーム・ページのURLを入力することで起動します。ホーム・ページのURLには、通常、ホスト・コンピュータ名とインストール時にアプリケーション・サーバーに対して割り当てられたポート番号、およびRule Authorのホーム・ページのパスが含まれています。
Rule Authorでの作業は、ディクショナリから着手する必要があります。Rule Authorでは、ルールおよび関連する定義をディクショナリに格納します。ディクショナリを作成または保存するには、ディクショナリを格納するリポジトリに接続する必要があります。出荷時のRule Authorでは、WebDAV(Web Distributed Authoring and Versioning)リポジトリとファイル・リポジトリの2種類のリポジトリがサポートされています。
ここでは、WebDAVリポジトリを使用してXML版How-Toのディクショナリを作成し、保存します。
内容は次のとおりです。
Oracle Business Rulesでは、ディクショナリには、ルールおよびそのルールに関連付けられているデータ・モデルが格納されます。
注意: 使用するリポジトリ(WebDAVリポジトリまたはファイル・リポジトリ)の選択に関係なく、リポジトリに接続するためには、リポジトリが存在している必要があります。詳細は、付録B「リポジトリを利用したRule AuthorとRules SDKの使用」を参照してください。 |
リポジトリに接続する手順は、次のとおりです。
「WebDAV」
リポジトリ・タイプを選択します。
http://www.fully_qualified_host_name.com:7777/repository_name
WebDAVリポジトリの設定方法の詳細は、B.1項「WebDAVリポジトリの使用」を参照してください。
ディクショナリは最上位コンテナであり、Rule Authorで作業する起点となります。ディクショナリは、通常、アプリケーションのルール部分に対応しています。
ディクショナリを作成する手順は、次のとおりです。
CarRentalxml
と入力します。
別のディクショナリ名で保存する場合や現行のディクショナリにバージョンを指定する場合は、次のように「別名保存」領域を使用します。
CarRentalxml
など)。
HowToxml
と入力します。
データの消失を防止するために、ディクショナリを定期的に保存してください。ディクショナリを保存するには、次のいずれかを実行します。
前述のいずれかの操作を実行した後、「ディクショナリの保存」ページの「保存」をクリックします。「保存」をクリックすると、ステータス領域に確認メッセージが表示されます。次に例を示します。
Dictionary 'CarRentalxml(HowToxml)' has been saved
関連項目:
Rule Authorセッションのタイムアウトの構成に関する詳細と、タイムアウトが発生した場合にRule Authorが現在の作業をディクショナリ・バージョンに自動的に保存する方法の詳細は、「Rule Authorのセッション・タイムアウト」を参照してください。 |
ルールでの作業前に、データ・モデルを定義する必要があります。データ・モデルには、Javaクラス・ファクト・タイプ、XMLファクト・タイプおよびRL Languageファクト・タイプなど、ルールで使用されるファクトやデータ・オブジェクトに関するビジネス・データ定義が格納されます。ここでは、XMLファクト・タイプが格納されているデータ・モデルのみを取り扱います。
内容は次のとおりです。
XMLサンプルには、$HowToDir/data
ディレクトリのcarrental.xsd
ファイルが格納されています。このファイルは、ファクトをアサートするためにXML文書を使用するXML版レンタカー・サンプルのスキーマを指定します。スキーマ定義にアクセスするには、$HowToDirを、XML How-Toをインストールしたディレクトリに置換します。
データ・モデルでXML要素を使用する前に、Rule Authorを使用して、XML要素を表すJAXBクラスを生成する必要があります。ここでは、JAXBクラスを生成し、XMLスキーマに関連付けられている生成したクラスとパッケージをRule Authorで参照できるようにします。
Rule Authorを使用してXML版レンタカー・サンプル・スキーマを準備する手順は、次のとおりです。
CarRentalxml
ディクショナリを作成した直後の場合は、2へ進んでください。「リポジトリ」タブをクリックし、CarRentalxml
ディクショナリをロードします。
「XMLファクト」をクリックして「XMLファクト・サマリー」ページを表示します(図4-4を参照)。
c:/temp/xml
と入力します。
入力した値は、生成されるクラス・パッケージ名になります。たとえば、generated
という名前を使用します(図4-5を参照)。この例では、generated
という名前を使用しますが、この名前に特別な意味はありません。この名前で、生成されたクラスのパッケージが指定されます。
この手順では、Rule Authorがスキーマを処理し、JAXBをコンパイルするのにしばらくの時間を要するため、スキーマのサイズによっては、この手順が完了するまで待機する必要があります。この手順が完了すると「スキーマの追加」テキスト入力フィールドが空白になり、Rule Authorによって「現在のXMLスキーマ」フィールドが更新され、「生成したJAXBクラス」領域が表示されます(図4-6を参照)。
ここでは、XMLスキーマ要素を表すJAXB生成クラスを(サンプル・スキーマcarrental.xsd
から)データ・モデルに移動します。「定義」タブから「XMLスキーマ・セレクタ」ページを使用して、データ・モデルにインポートするXML要素を選択します。
DriverType
をスキーマからデータ・モデルに追加する手順は、次のとおりです。
「1つのクラスまたはパッケージがインポートされました。」という確認メッセージが表示されます。
XMLスキーマをRule Authorに追加する際の注意点は、次のとおりです。
JAXB生成クラスまたはインポートしたパッケージを含めたXMLファクトをデータ・モデルに表示する手順は、次のとおりです。
XML版レンタカー・サンプルでは、インポートされたDriverTypeクラス、RepositoryTypeクラス、RepositoryクラスおよびObjectFactoryクラスを含むXMLファクト表が表示されます。
XMLファクトのプロパティとメソッドの表の「参照可能」フィールドと「拡張」フィールドの詳細は、「Rule Authorのリストに関する参照可能性およびオブジェクト・チェーンの指定」を参照してください。
関連項目:
「定義」タブでデータ・モデルを操作している場合、および作業を完了する場合は、ディクショナリを保存してください。
ディクショナリを保存する手順は、次のとおりです。
ビジネス用語を使用することで、ビジネス・アナリストは、XML名やJavaパッケージ名、クラス名、メソッド名またはメンバー変数名を使用せずに、簡単に理解できる名前を使用してルールを作成できます。Rule Authorには別名機能が用意されています。この機能を使用すると、ビジネスマン向けの用語を使用してルールのビジネス・オブジェクトまたはファクトを参照できます。唯一必要な手順は、ルールに使用する予定のビジネス・オブジェクトに対してビジネス用語を定義することです。また、「ルールセット」タブからルールを作成する際は、Rule Authorの「参照可能」ボックスを使用して、Rule Authorのリストに表示するプロパティとメソッドを指定します。
内容は次のとおりです。
XMLファクト定義に対してビジネス用語を指定する手順は、次のとおりです。
generated.DriverType
クラスを含む表が表示されます(generated以外のパッケージ名を指定した場合、パッケージ名はgenerated
とは異なります)。
DriverType
の編集アイコンをクリックします。「XMLファクト」ページが表示されます。
DriverData
と入力します。
age
エントリに対して、適切な別名を指定します。たとえば、「エイリアス」フィールドにDriverAge
と入力します。
DriverName
と入力します。
XMLファクト定義に対してビジネス用語を指定する際の注意点は、次のとおりです。
たとえば、//complexType[@name='driverType']
のように表示されます。「XML名」は、クラスがdriverType
という名前のXML複合型から生成されたことを示しています。「生成元」フィールドは、XMLファクトに対してJAXBクラスを生成したXMLスキーマの名前を示します。
RL Language関数に対してビジネス用語を指定する手順は、次のとおりです。
「RL関数」
をクリックし、「RL関数サマリー」ページを表示します。XML版レンタカー・サンプルでは、DM.assertXPath
関数およびDM.println
関数を含む表が表示されます。
DM.println
関数について、「編集」フィールドの編集アイコンをクリックして詳細を表示します。
PrintOutput
と入力します。
プロパティまたはメソッドがRule Authorのリストで参照可能かどうかを指定する手順は、次のとおりです。
DriverType
に対するXMLファクトのプロパティとメソッドを表示します(表では、このエントリの値は「エイリアス」列のDriverData
です)。「XMLファクト」ページが表示されます。
age
およびname
のみを参照可能にする必要があります。
ここでは、XML版レンタカー・サンプルのルールを定義します。
内容は次のとおりです。
ルールを作成する前に、ルールセットを作成する必要があります。ルールセットとはルールのコンテナです。
ルールセットを作成する手順は、次のとおりです。
vehicleRent
と入力します。
vehicle rent rule set
と入力します。
vehicleRent
ルールセットが作成されます。ルールセットを作成すると、図4-8のように新しいエントリがツリーに表示されます。
ルールセットを作成した後は、ルールセットにルールを作成できます。ここでは、UnderAgeルールを作成します。UnderAgeルールは、次の内容をテストします。
If the age of the driver is younger than 21, then decline to rent
UnderAgeルールには、Rules Engineが照合する単一のパターンと、そのパターンに適用されるテストが指定されます。
次のアクションがUnderAgeルールに関連付けられます。
Rule Authorを使用してUnderAgeルールを追加する手順は、次のとおりです。
UnderAge
と入力します。
0
を入力します。Rules Engineを実行すると、ルールを使用して、一致するパターンに使用可能なファクトがチェックされます。UnderAgeルールのパターンを追加する手順は、次のとおりです。
「パターン定義」ページには、「パターンの選択」と「パターンのテストを定義」の2つの領域があります(図4-11を参照)。
このボックスは、一致するたびに(一致するすべての運転者に)、ルールを起動することを指定します。別の値の1つである「次のケースが少なくとも1つある」
は、少なくとも1つが一致する(そのような運転者が1人いる)場合に、ルールを1回起動することを選択します。別の値の「次のケースがない」
は、一致しない(一致する運転者がいない)場合に、ルールを1回起動することを指定します。
このフィールドにdriver
と入力(パターンのバインド変数名を定義)します。
このフィールドを使用して、単一のルールで同じタイプの複数のインスタンスをテストできます。たとえば、driver1.age
>
driver2.age
などの比較で、指定した名前を使用して、ある運転者と他の運転者を比較できます。
<make a choice>
というテキストが表示されます。このボックスには、使用可能なファクト・タイプが表示されます。このボックスで、DriverData
を選択します。
パターンに対してテストが定義されていないと、定義するアクションはすべての運転者に適用されます。パターンにテストを定義するには、4.6.2.3項の説明に従って操作を続行します。
パターンに対してテストを追加する手順は、次のとおりです。
driver.DriverAge
を選択します。
Fixed
とAny
の値を備えたリストがあります(図4-13を参照)。「値」フィールドの制約としてAny
を選択します。
これらの値は制約と呼ばれます。制約値を使用してカスタマイズを有効化または無効化します。Fixed
値を使用して、フィールドを読取り専用にします。これは、この値に対してカスタマイズを禁止することを指定します。Any
値を選択すると、Rule Authorでの値の変更が許可されることを指定します。Any
の値を設定すると、ルールをカスタマイズできます(専門外のユーザーによる変更がサポートされます)。許可する値を制限する制約も定義できます。
パターンに対してテストを追加する際の注意点は、次のとおりです。
アクションはパターン一致と関連しています。実行時に、ルールの「if」部が一致すると、ルールに関連付けられているアクションを実行するために、Rules Engineによって「then」部が実行されます。
ここでは、UnderAgeルールに対して2つのアクションを追加します。第1のアクションは結果の出力です。第2のアクションは、Rules Engineからの運転者ファクトの取消しです。次のような様々な理由で、ファクトの取消しが必要になることがあります。
UnderAgeルールの一致に関する結果を出力するアクションを追加する手順は、次のとおりです。
Call
項目を選択します。「アクション・パラメータ」ボックスが表示されます。
PrintOutput
(println
の別名を定義していない場合はDM.println
)を選択します。「関数の引数」ボックスが表示されます。
"Rental declined" + driver.DriverName + " Under age,age is:" + driver.DriverAge
次に、UnderAgeルールに対して取消しアクションを追加します。次の手順を実行し、この第2のアクションをルールに追加します。
Retract
を選択します。「アクション・パラメータ」ボックスが表示されます。
driver
を選択します。アクションで使用される場合、パターン名(driver
)は、パターンが一致した単一のインスタンスを参照します。
Rule Authorの「カスタマイズ」タブは、ビジネス・ユーザー用に設計されています。ルール開発者は、「ルールセット」タブから使用できる「パターン定義」ページの許可された値のフィールドを使用して、カスタマイズを許可するかどうかを指定します。カスタマイズが許可されている場合は、カスタマイズ可能な値について、値の範囲を指定できます。その結果、ビジネス・ユーザーは「カスタマイズ」タブを使用して値を変更できます。
この例では、「カスタマイズ」タブで、運転者の年齢制限を変更するようにUnderAgeルールを変更できます(このサンプルでは、値に制限はなく、あらゆる指定値が有効です)。
「カスタマイズ」タブを使用してUnderAgeルールを変更する手順は、次のとおりです。
driver.DriverAge < 21
のテストを編集できるテキスト入力フィールドがあります。このフィールドに19を入力(21から19に値を変更)します。
ディクショナリを保存すると、XML版レンタカー・サンプルに対するデータ・モデルとルールの作成は終了となります。
データ・モデルおよびルールを指定したルールセットが格納されているRule Authorディクショナリを作成および保存した後は、既存のJavaアプリケーションをルール対応にしたり、新しいルール対応Javaアプリケーションを作成できます。この項では、ルール対応アプリケーションを作成する手順を示します。
内容は次のとおりです。
このサンプル・アプリケーションの完全なコードは、$HowToDir/src/carrental
ディレクトリのTestXML.java
を参照してください。$HowToDirには、XML How-Toをインストールしたディレクトリが入ります。
注意1:
第2章でJava版のレンタカーの例を完了している場合、この例での違いは、JAXBコンテキストを作成する必要がある点と、ファクトをルール・セッションに追加するために |
ルール対応プログラムを記述する最初の手順は、特定の必要なクラスのインポートです。例4-1に、XML版レンタカー・サンプルのTestXML.java
アプリケーションからのインポートを示します。
package carrental; import java.io.File; import java.util.List; import java.util.ArrayList; import java.util.Properties; import javax.xml.bind.*; 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;
JAXB生成クラスを使用して、最初にJAXBコンテキストを指定し、次にスキーマに準拠するXML文書をアンマーシャリングする必要があります。例4-2に、このコードをTestXML.java
から示します。
JAXBContext jc = JAXBContext.newInstance("generated"); Unmarshaller um = jc.createUnmarshaller(); String fs = System.getProperty("file.separator"); String xmlpath = "data" + fs + "carrental.xml" ; Object root = um.unmarshal(new File(xmlpath));
ルール対応Javaアプリケーションを作成する場合は、次の手順を実行し、ディクショナリにアクセスしてルールセットを指定します(例4-3を参照)。
String
を作成します。
RuleType
オブジェクトを使用して、RepositoryManager.getRegisteredRepositoryType
メソッドから取得するリポジトリを保持します。
createRuleRepositoryInstance
メソッドを使用してリポジトリ・インスタンスを作成します。
RepositoryContext
を定義し、適切なプロパティを設定します。ファイル・リポジトリの場合は、repoPath
パラメータに伴って記載されているように、リポジトリのパスを指定します。
RuleRepository
オブジェクトrepo
のinit
メソッドを使用して、リポジトリ・インスタンスを初期化します。 String repoPath = "dict" + fs + "CarxmlRepository"; RepositoryType jarType = RepositoryManager.getRegisteredRepositoryType( Keys.CONNECTION ); RuleRepository repo = RepositoryManager.createRuleRepositoryInstance( jarType ); RepositoryContext jarCtx = new RepositoryContext(); jarCtx.setProperty( oracle.rules.sdk.store.jar.Keys.PATH, repoPath ); repo.init( jarCtx );
例4-3のように、ファイル・リポジトリではなくWebDAVリポジトリをロードするには、getWebDAVRepository
を使用してください。この例は、$HowToDir/src/carrental
ディクショナリのTestXML.java
にあります。
ルール対応Javaアプリケーションを作成する場合は、ディクショナリを指定バージョンでロードする必要があります。例4-4のように、RuleDictionary
オブジェクトを使用してディクショナリをロードします。この例では、CarRental
ディクショナリをHowTo
バージョンでdict
という名前のオブジェクトにロードします。CarRental
ディクショナリは、リポジトリで使用可能であることが必要です(前述の項でRule Authorを使用して、バージョン名がHowTo
のCarRental
ディクショナリを作成しました)。
RuleDictionary dict = repo.loadDictionary( "CarRentalxml", "HowToxml" );
ディクショナリをロードした後は、Rules SDKを使用してRL Languageプログラムを生成できます。ディクショナリは中間XML形式を使用してデータ・モデルとルールセットを格納するため、この手順は必須です。RuleDictionary
オブジェクトは、データ・モデルとルールセットにアクセスするためのメソッドを提供し、中間XML形式からマッピングを実行します。このマッピングで、RL Languageデータ・プログラムが作成されます。
Rule Authorを使用してルールを生成する場合は、各ルールセットが2つのコンポーネント(ディクショナリのルールセットすべてに適用されるグローバルなデータ・モデルと、ルールセットに関連付けられている一連のルール)を指定します。
例4-5に、ルールセットおよび関連するデータ・モデルについてRL Languageコードを生成するコードを示します。
String rsname = "vehicleRent";String dmrl = dict.dataModelRL();String rsrl = dict.ruleSetRL( rsname );
ルールとデータ・モデルが挿入されているRL Languageプログラムを生成すると、いつでもルール・セッションで作業できる状態になります。ルール・セッションは、Rules Engineを初期化し、多数のルール実行にわたってRules Engineの状態を保守します。
例4-6に、RuleSession
オブジェクトを作成し、RL Languageプログラムを実行するコードを示します。
executeRuleset()
メソッドは、指定のRL Languageプログラムの解析をRules Engineに指示します。
RuleSession session = new RuleSession(); session.executeRuleset( dmrl ); session.executeRuleset( rsrl ); session.callFunction( "reset" ); session.callFunction( "clearRulesetStack" ); session.callFunctionWithArgument( "pushRuleset", rsname );
データ・モデルとルールセットがロードされると、ルール・セッションは、そのルール・セッション用にアサートするファクトに対して、いつでもルールセットを実行できる状態になります。
ルール・セッションを実行する前に、XMLデータが格納されているXML文書をアンマーシャリングし、次にXML文書からファクトをアサートする必要があります。4.8.2項に、XML文書のアンマーシャリング方法を示します。
XML文書からファクトをアサートするには、assertXPath
関数を引数に指定してsession.callFunctionWithArgument()
メソッドを使用します。
例4-7に、assertXPath
を使用してXMLファクトをルール・セッションにアサートするサンプル・コードを示します。
callFunctionWithArgumentList
メソッドには、関数名引数とリスト引数が必要です。リスト引数argList
には、次の3つの引数が含まれます。
assertXPath
の第1引数は、JAXBで生成したパッケージ名です。この例ではgenerated
です。
assertXPath
の第2引数は、アンマーシャリングされたXML文書のルート・オブジェクトです。この例では、アンマーシャリングされたオブジェクト参照はroot
オブジェクトです。
assertXPath
の第3引数は、アサートするXPath式です。この例では、"//*"によってXMLツリー全体がsession
という名前のルール・セッションにアサートされます。List argList = new ArrayList(3); argList.add( "generated" ); argList.add( root ); argList.add( "//*" ); session.callFunctionWithArgumentList( "assertXPath", argList );
例4-8に、ルール・セッションを実行するコードを示します。
session.callFunction( "run");
$HowToDir/lib
ディレクトリには、TestXML.jar
が格納されています。これは、CarRentalxml
ディクショナリを使用するOracle Business Rules Javaアプリケーションで、ただちに実行できます。ディクショナリ名を変更して、TestXML.java
を修正する必要がある場合、ソースは$HowToDir/src
ディレクトリにあります。このディレクトリのReadme.txt
ファイルには、テスト・プログラムの実行に必要な環境変数の設定について指示が記載されています。$HowToDirには、XML版How-Toをインストールしたディレクトリが入ります。
例4-9に、実行しているTestXML
からの出力を示します。
java carrental.TestXMLRental declined Qun Under age, age is: 15
すべてのファクトが出力を生成したり、ルールを起動するとはかぎりません。この例では、UnderAgeルールと一致してアサートされたファクトについてのみ出力が表示されます。
|
![]() Copyright © 2005, 2006, Oracle Corporation. All Rights Reserved. |
|