この章では、ファクト・タイプ、関数、グローバル、バケット・セット、デシジョン関数、ディクショナリ・リンクで構成されているOracle Business Rulesデータ・モデルについて説明します。
この章の項目は、次のとおりです。
詳細は、第1.1.8項「ディクショナリとは」を参照してください。
Oracle Business Rulesアプリケーションのデータ・モデル部分を実装するには、ディクショナリを作成し、データ・モデル要素を追加します。ディクショナリを完成するには、これらのデータ・モデル要素を使用するか、要素に依存するルールを含むルールセットを1つ以上作成します。
詳細は、次を参照してください。
ディクショナリは、ファクト、関数、グローバル、バケット・セット、リンク、デシジョン関数およびルールセットに使用するOracle Business Rulesコンテナです。また、アプリケーションのルールセットおよびデータ・モデルが格納されているXMLファイルです。ディクショナリは他のディクショナリにリンクできます。必要な数のディクショナリを作成できます。ディクショナリには任意の数のルールセットとデータ・モデル要素を含めることができます。1つのデータ・モデルを1つ以上のディクショナリに格納できます。ルールセットで参照されるデータ・モデル要素はすべて、直接的に、またはリンクを通してディクショナリ内で使用可能である必要があります。
ディクショナリは、*.rules
ファイルに格納されます。
ディクショナリを作成する場合は、Javaクラスと同じように、名前とパッケージを指定します。データ・モデル要素とルールセットをこのディクショナリの内側に作成できます。また、ディクショナリ・リンクを作成して、ターゲット・ディクショナリの名前とパッケージを指定することで、別のディクショナリのデータ・モデルとルールセットを参照することもできます。各ディクショナリには論理的な組込みディクショナリが格納されています。このディクショナリには、すべてのOracle Business Rulesアプリケーションが必要とする標準の関数とタイプが含まれています。組込みディクショナリは変更できません。
メイン・ディクショナリに加えて、PurchaseItems.rules
などの、アプリケーション固有のディクショナリを1つ以上作成できます。これらのディクショナリのプロパティは変更できます。
ディクショナリとそのリンク先のディクショナリによって定義された完全なデータ・モデルは、結合ディクショナリと呼ばれています。同じディクショナリに対して複数のリンクを作成できます。この場合、最初のリンク以外はすべて無視されます。
詳細は、第2.2.7項「ディクショナリ・リンクに関する必須情報」を参照してください。
Oracle Jdeveloperでは、数多くの方法でOracle Business Rulesのディクショナリを作成できます。この項では、SOAプロジェクトでディクショナリを作成する方法を1つ示します。SOAアプリケーションで使用するディクショナリを作成できます。
典型的なSOAコンポジットのデザイン・パターンでは、各アプリケーションに専用ディクショナリまたはディレクトリが用意されます。これにより、各アプリケーションは自己格納されるようになり、個別にデプロイできるようになります。様々なアプリケーションが共通データ・モデルの同一部分へのアクセスを必要とする場合は、ディクショナリ・リンクを使用して、ターゲット・アプリケーションのディクショナリをソース・アプリケーションのディクショナリに組み込むことができます。この場合、アプリケーションはターゲット・アプリケーションのディクショナリをソース・アプリケーションにコピーして、ソースにリンクされているコピーの内容を保持します。リンクされた要素を使用する場合、それらはローカル・コンテンツとして表示されます。
SOAアプリケーションの外部で、ビジネス層に使用するディクショナリを作成することもできます。詳細は、第9.2.5項「Gradesプロジェクト内でのOracle Business Rulesディクショナリの作成方法」を参照してください。
Rules Designerを使用してSOA層にディクショナリを作成する手順は、次のとおりです。
アプリケーション・ナビゲータで、SOAアプリケーションを選択し、SOAプロジェクトを選択または作成します。
右クリックして、リストから「新規」を選択します。
図2-1に示すように、「新規ギャラリ」で、「現在のプロジェクト・テクノロジ」タブを選択して「カテゴリ」領域で「SOA層」を開きます。
「新規ギャラリ」ウィンドウの「項目」領域で、「ビジネス・ルール」を選択します。
「OK」をクリックします。「ビジネス・ルールの作成」ダイアログが表示されます。
図2-2に示すように、「ビジネス・ルールの作成」ダイアログで次のフィールドに入力します。
「名前」フィールドにディクショナリ名を入力します。たとえば、PurchaseItems
と入力します。
「パッケージ」フィールドに、ディクショナリが属するJavaパッケージを入力します。たとえば、com.example
と入力します。
入力および出力を指定する手順は、次のとおりです。
「追加」アイコンをクリックし、入力を作成するには「入力」を、出力を作成するには「出力」を選択します。
「タイプ・チューザ」ダイアログで、適切なXSDを開いて適切なタイプを選択します。
「OK」をクリックして「タイプ・チューザ」ダイアログを閉じます。
入力および出力を後で追加したり、削除できます。詳細は、第6章「デシジョン関数の使用」を参照してください。
「ビジネス・ルールの作成」ダイアログで「OK」をクリックして、デシジョン・コンポーネントおよびOracle Business Rulesディクショナリを作成します。
図2-3に示すように、Oracle JDeveloperによって、拡張子.rules
が付いたディクショナリがファイル内に作成され、Rules Designerが起動します。
図2-3 Oracle Business RulesディクショナリPurchaseItemsの新規作成
Oracle JDeveloperによって、composite.xml内にデシジョン・コンポーネントも作成されます。このコンポーネントを表示するには、図2-4に示すようにcomposite.xml
ファイルをダブルクリックします。
Rules Designerを使用して、SOAアプリケーションの外部で、ビジネス層に使用するディクショナリを作成できます。SOAなしでOracle Business Rulesを使用する方法については、第9章「ルール対応の非SOA Java EEアプリケーションの作成」を参照してください。
「ディクショナリ設定」アイコンを使用して、ディクショナリ設定を表示および編集できます。
ディクショナリ別名を変更する手順は、次のとおりです。
Oracle JDeveloperで、Oracle Business Rulesディクショナリを開きます。
Rules Designerで、「ディクショナリ設定」アイコンをクリックします。
「ディクショナリ設定」ダイアログの「エイリアス」フィールドで、別名を必要な名前に変更します。図2-5に、このフィールドを示します。
「OK」をクリックします。
Rules Designerの「リンク」ナビゲーション・タブを使用して、同じアプリケーションまたは別のアプリケーション内のディクショナリにリンクできます。別のディクショナリにリンクするには、他のディクショナリが1つ以上使用可能である必要があります。
リソース・ピッカーを使用してディクショナリにリンクする手順は、次のとおりです。
図2-6に示すように、Rules Designerで「リンク」ナビゲーション・タブをクリックします。
「リンク」領域で「作成」アイコンをクリックして、リストから「既存のディクショナリの参照」を選択します。「SOAリソース・ブラウザ」ダイアログが表示されます。
図2-7に示すように、「SOAリソース・ブラウザ」ダイアログで、リンクするディクショナリにナビゲートして選択します。
「OK」をクリックします。
ADF Business Componentsのファクトを使用する場合は、デシジョン・ポイント・ディクショナリへのリンクを作成する必要があります。詳細は、第10章「Oracle Business RulesとADF Business Componentsの使用」を参照してください。
デシジョン・ポイント・ディクショナリにリンクする手順は、次のとおりです。
Rules Designerで、「リンク」ナビゲーション・タブをクリックします。
「リンク」領域で、「作成」をクリックし、リストから「デシジョン・ポイント・ディクショナリ」を選択します。この操作には少し時間がかかります。デシジョン・ポイント・ディクショナリがロードされるまで待機する必要があります。
別のディクショナリ(たとえば、Shared_rules)にリンクしているディクショナリ(たとえば、Project_rules1)がある場合、どちらのディクショナリも変更されていることを確認する必要があります。たとえば、Shared_rulesディクショナリを変更した場合、Project_rules1でのこの変更を表示するには、Project_rules1ディクショナリを更新するか、Rules Designerを閉じて、再度開きます。
リンク先ディクショナリを更新する手順は、次のとおりです。
サンプル・ディクショナリ名を使用し、「保存」アイコンをクリックしてShared_rulesディクショナリを保存します。
Project_rules1ディクショナリを選択します。
「リンク」ナビゲーション・タブを選択します。
「ディクショナリ・キャッシュ」アイコンをクリックします。
「ディクショナリ・ファインダ・キャッシュ」ダイアログで、適切なリンク先ディクショナリを選択します。
「クリア」アイコンをクリックします。
「ディクショナリ・ファインダ・キャッシュ」ダイアログで、「閉じる」をクリックします。
「検証」アイコンをクリックします。
他のディクショナリへのリンクを含むディクショナリを使用すると、次の場合に役立ちます。
データモデルの共有。プロジェクト内のデータ・モデル部分を共有します。別のプロジェクトのディクショナリにリンクすると、それがローカル・プロジェクトにコピーされます。
たとえば、Oracle Business Rules関数をいくつか共有したいプロジェクトについて考えてみます。その関数を格納するディクショナリを作成し、DictCommon
という名前を付けることができます。次に、DictApp1
およびDictApp2
という2つのディクショナリを作成し、両方ともDictCommon
にリンクします。これで両方とも同じOracle Business Rules関数を使用できます。いずれかの関数を変更する場合は、DictCommon
内のバージョンを変更するだけです。これで、次にDictApp1
またはDictApp2
からRL Languageを生成するときには、どちらのディクショナリも更新後の関数を使用します。
Oracle Business Rulesでは、完全修飾されたディクショナリ名はDictionaryFQNと呼ばれ、次の2つの要素で構成されています。
ディクショナリ・パッケージ: パッケージ名
ディクショナリ名: ディクショナリ名
ディクショナリは、DictionaryFQNおよび別名を使用してリンク先ディクショナリを参照します。Oracle Business Rulesでは、DictionaryFQNを使用してリンク先ディクショナリが検索されます。
結合ディクショナリに関する次のネーミング制約は次のとおりです。
パッケージとディクショナリ名を含む個別の完全ディクショナリ名を使用する必要があります。また、ディクショナリ別名も個別にする必要があります。
特定の種類のデータ・モデル定義(関数、Oracle RLクラスまたはバケット・セットなど)の別名が、ディクショナリ内で一意である必要があります。
直接含んでいるディクショナリの別名で定義を修飾できます。最上位および組込みディクショナリ内の定義を修飾する必要はありません。別のディクショナリ内の定義は修飾する必要があり、この修飾はディクショナリ・リンクの接頭辞リンク名プロパティによって制御されます。
ルールセット名はディクショナリ内で一意にする必要があります。ルールセットのRL Languageを生成する場合、ディクショナリの別名は生成名の一部にはなりません。たとえば、dict1という名前のディクショナリをdict2にリンクして結合ディクショナリを作成し、dict1にはrule_1を含むruleset_1を格納して、dict2にもrule_2を含むruleset_1を格納した場合、結合ディクショナリでは、2つのルール、rule_1とrule_2の両方が、同じルールセット(ruleset_1)内に存在することになります。
すべてのルールおよびデシジョン表には、ルールセット内で一意の名前が必要です。
たとえば、ディクショナリd1とディクショナリd2を含む結合ディクショナリ内で、ディクショナリd1にルールrule_1を含むルールセットRuleset_1
があるとします。ディクショナリd2にもrule_2を含むルールセットRuleset_1
がある場合、Oracle Business Rulesによってリンク済結合ディクショナリからRL Languageが生成されると、両方のルールrule_1およびrule_2が単一のルールセットRuleset_1
に含まれます。このネーミング規則に違反し、結合ディクショナリ内の単一ルールセットのルールに個別の名前を使用しなかった場合は、Rules Designerによって、次のような検証警告が表示されます。
RUL-05920: Rule Set Ruleset_1 has two Rules with name rule_1
詳細は、付録A「Oracle Business Rulesのファイルと制限事項」を参照してください。
リソース・ピッカーを使用してディクショナリ・リンクを作成すると、ディクショナリはソース・プロジェクト(リンク元のディクショナリが常駐しているプロジェクト)にコピーされます。つまり、このタイプのリンクでは、ディクショナリのローカル・コピーがプロジェクトに作成されます。これは、ターゲット・ディクショナリの場所に関係なく、元のターゲットへのリンクではありません。つまり、リソース・ピッカーを使用してリンクを作成した場合、Rules Designerではリンクにコピー操作が使用されます。
Rules Designerを使用している場合、デプロイされたコンポジット・アプリケーションおよび関連するOracle Business RulesディクショナリをMDS接続で参照できます。ただし、MDSにデプロイされたディクショナリにディクショナリ・リンクを作成することはできません。
デシジョン関数の入力は、デシジョン関数の初期アクションに対する変数として使用できます。入力がファクトである場合、そのファクトは作業メモリー内にアサートされるので、ルールは、デシジョン関数の入力名ではなく、タイプおよびプロパティの値に基づいてファクトと一致する必要があります。たとえば、同じタイプに2つの入力input1およびinput2が存在する場合、ルールはこれらの入力をタイプおよびプロパティの値に基づいて識別するのであって、異なる2つの名前によって識別するわけではありません。入力が参照できないファクト(たとえば、文字列や整数)の場合、<decision function name>という名前のラッパー・タイプが作成され、ルールはこのタイプと一致する必要があります。
Rules Designerを使用してOracle Business Rulesグローバルを追加できます。
Oracle Business Rulesで使用するグローバルは、Javaにおけるパブリックな静的変数に類似しています。グローバルは、定数または変更可能に指定できます。
グローバルの定義を使用すると、複数のルールと関数で情報を共有できます。たとえば、複数のルールで10%割引を使用する場合は、グローバルGold Discountを作成し、このグローバルを使用してすべてのルールに適切な割引を適用できます。
グローバルの定義を使用すると、プログラムをモジュール化してメンテナンスを容易にできます。
Rules Designerを使用して、グローバルを追加できます。
グローバルを追加する手順は、次のとおりです。
Rules Designerで、「グローバル」ナビゲーション・タブを選択します。
グローバル表で「作成」アイコンをクリックします。これにより、グローバルが追加され、図2-8に示すように、「グローバルの編集 -」ダイアログが表示されます。
「名前」フィールドに名前を入力するか、またはデフォルト値を使用します。
「タイプ」フィールドで、リストからタイプを選択します。
「バケットセット」フィールドで、リストから値を選択することもできます。
「値」フィールドで、値を入力するか、リストから値を選択するか、「式ビルダー」アイコンをクリックして式を入力します。詳細は、第4.10項「式ビルダーの使用」を参照してください。
グローバルが定数である場合は、「定数」チェック・ボックスを選択します。このオプションを選択することは、グローバルが定数値であることを示します。詳細は、第2.3.3項「ファイナルオプションと定数オプションに関する必須情報」を参照してください。
グローバルがファイナルでない場合は、「ファイナル」チェック・ボックスの選択を解除します。このオプションの選択を解除することは、Assignアクションなどで、グローバルを変更可能にすることを意味します。
Rules Designerを使用して、グローバルを編集できます。
グローバルを編集する手順は、次のとおりです。
Rules Designerで、「グローバル」ナビゲーション・タブを選択します。
グローバル表の行内のグローバル・アイコンをダブルクリックします。行内のグローバル・アイコンをダブルクリックすると、図2-9に示すように、「グローバルの編集 - グローバル名」ウィンドウが表示されます。このウィンドウで、グローバルを編集し、「ファイナル」フィールドや「定数」フィールド(グローバルをダブルクリックして「グローバルの編集 -」ダイアログを表示した場合は、「定数」フィールドのみ表示)などのフィールド値を変更できます。
「グローバルの編集 -」ダイアログには、グローバルに対して選択可能な「定数」チェック・ボックスと「ファイナル」チェック・ボックスが表示されます。
グローバルを使用する場合は、次のことに注意してください。
「ファイナル」の選択を解除することは、Assignアクションなどで、グローバルを変更可能にすることを意味します。
「ファイナル」を選択することは、ルール内のテストでグローバルを使用できることを示します(ファイナルでないグローバルはルール内のテストで使用できません)。
「ファイナル」を選択することは、グローバルが実行時に1度初期化され、変更できないことを示します。
「グローバルの編集 -」ダイアログで「定数」オプションを選択することは、グローバルが定数であることを示します。Oracle Business Rulesでは、定数は、文字列や数値リテラル、値が定数であるファイナル・グローバル、または定数と+
、-
、*
および/
を含む単純な式です。
グローバルに対して「定数」オプションを選択すると、次の3つの影響があります。
文字列リテラルを二重引用符で囲む必要がありません。
式の値の選択リストに定数のみが表示されます。
式の値が有効な定数である必要があります。
「定数」オプションは、必要に応じて選択できます。バケット値、バケット範囲のエンドポイントおよびルールセット・フィルタの値は、常に定数であることに注意してください。
データ・モデルにはデシジョン関数が含まれています。デシジョン関数の使用については、第6.1項「デシジョン関数の概要」を参照してください。
Oracle Business Rulesには、ルール作成時の複雑さを隠すための関数が用意されています。Oracle Business Rulesでは、組込み関数またはユーザー定義関数をルールおよびデシジョン表の条件およびアクションに使用できます。
Oracle Business Rulesでは、Javaメソッドに類似する方法で関数を定義しますが、Oracle Business Rules関数はクラスに属しません。Javaアプリケーション・オブジェクト・モデルはOracle Business Rules関数を使用して拡張できるため、ユーザーは、元のJavaアプリケーション・コードを変更せずに、複数の操作をルールで実行できます。
Oracle Business Rules関数は、ルールまたはデシジョン表に関連付けられている条件またはアクションに使用できます。
また、Oracle Business Rules関数定義を使用して、同じまたは類似した式を複数のルール間で共有し、結果をアプリケーションに戻すこともできます。
Oracle Business Rules関数には、次の項目が含まれています。
名前: Oracle Business Rules関数名。
戻り型: Oracle Business Rules関数の戻り型、または戻り値がない場合はvoid。
バケット・セット: Oracle Business Rules関数に関連付けるバケット・セット。
引数: 関数の引数。各関数の引数には名前および型があります。
関数本体: 事前定義済アクションを含む関数本体。事前定義済アクションを使用すると、Rules DesignerではOracle Business Rules関数の書式が適切で検証可能であることが保証されます。
Rules Designer内で関数を使用してルールをテストすることもできます。詳細については、第8.1.5項「Oracle Business Rules関数によるデシジョン関数のテスト方法」を参照してください。
Rules Designerを使用して、Oracle Business Rules関数を追加します。
Oracle Business Rules関数を追加する手順は、次のとおりです。
Rules Designerで、「関数」ナビゲーション・タブを選択します。
「作成」アイコンを選択します。
「名前」フィールドに関数名を入力するか、デフォルト名を使用します。
「戻り型」のリストから戻り型を選択します。たとえば、「void
」を選択します。
「バケットセット」フィールドのリストから、関数の戻り型に関連付けるバケット・セットを選択することもできます。
必要に応じて、「説明」フィールドに説明を入力します。
「引数」表で「追加」をクリックし、関数の引数を1つ以上追加します。
引数ごとに、「型」フィールドのリストから型を選択します。
「バケットセット」フィールドの各引数に関して、バケット・セット制約で指定した引数値に制限するために、リストからバケット・セットを選択します。
「本体」領域に、関数本体のアクションと引数を入力します。assert
、call
、modify
の範囲の必要なアクションを、if
、else
、elseif
、while
、for
、if
(advanced)
、while
(advanced)
のような条件アクションにも追加できます。図2-10に示す例を参照してください。
ルール・リソースの名前、別名、説明をローカライズできます。これにより、ワークスペースとSOAコンポーザでリソースをうまく制御できるようになります。バケット、バケット・セット、グローバル、ルールセット、ルールなど、ほとんどのリソースをローカライズできます。
これらのリソースを作成したら、「変換」タブでロケール固有の情報を追加できます。各ロケールは個別のリソース・バンドルに保存されています。
注意: リソース・バンドルを手動で編集して、ローカライズされた文字列を追加したり編集したりすることはできません。リソース・バンドルを編集するには、JDeveloperまたはSOAコンポーザのRules Designerの「変換」タブを使用する必要があります。 |
JDeveloperのRules Designerを使用して、ビジネス・ルールのリソースをローカライズできます。
ビジネス・ルールのリソースをローカライズする方法は、次のとおりです。
Rules Designerで、「変換」タブを選択します。
「リソース・バンドルの作成」アイコンをクリックします。
「リソース・バンドルの作成」画面が表示されます。
リストで「ロケール」を選択します。
「OK」をクリックします。
追加した各ロケールは、「リソース・バンドルの変換」表の列として表示されます。ビジネス・ルールの各リソースは、この表の行として表示されます。各ロケールは個別のリソース・バンドルとして保存されます。
リソースおよびロケールに対応する表のセルをダブルクリックして、ローカライズされたテキストを入力します。