ファクトとはルールの判断対象となるオブジェクトで、ファクト・プロパティ値のグループ化はバケット・セットによって定義されます。
この章の内容は次のとおりです。
Oracle Business Rulesでは、ルールに対して実行できるファクトは、アサートされたデータ・オブジェクトです。各オブジェクト・インスタンスは単一のファクトに対応しています。オブジェクトが(変更済かどうかに関係なく)再アサートされると、Rules Engineが更新され、そのオブジェクトの新しい状態が反映されます。 オブジェクトの再アサートによるファクトの作成はありません。 特定のファクト・タイプに複数のファクトを指定するには、オブジェクト・インスタンスを個別にアサートする必要があります。
Rules Designerでは、データ・モデルの一部であるファクト定義を使用してOracle Business Rulesにビジネス・オブジェクトおよびそのメソッドを認識させます。
ルールを作成する前に、ファクトおよびオプションのバケット・セットを1つ以上作成する必要があります。
Rules Designerでは、次のタイプのファクトを使用できます。
XMLファクト: XMLファクトは、XMLスキーマを指定して既存のソースからインポートされます。インポートしたXMLファクトに別名を追加するか、XMLファクトをRLファクトと併用し、ビジネス・ニーズに応じてデータ・モデルを変更できます。
詳細は、第3.2項「XMLファクトの使用」を参照してください。
Javaファクト: Javaファクトは既存のソースからインポートされます。Javaファクトに別名を追加するか、RLファクトと併用し、ビジネス・ニーズをデータ・モデルのターゲットにすることができます。また、Javaファクトは、作成するルールまたはデシジョン表で使用する関連Javaクラスのインポートにも使用されます。
詳細は、第3.3項「Javaファクトの使用」を参照してください。
RLファクト: RLファクトは、ユーザーが直接作成でき、外部ソースが存在しないタイプの唯一のファクトです。他のすべてのタイプのOracle Business Rulesファクトはインポートされます。RLファクトは、リレーショナル・データベースの行またはメソッドがないJavaBeanと同じです。RLファクトには、データ・モデルで使用可能なタイプ(RLファクト、Javaファクトまたはプリミティブ・タイプ)のプロパティのリストが含まれています。RLファクトを使用すると、動的な仮想型を提供することでJavaアプリケーションのオブジェクト・モデルを拡張できます。
詳細は、第3.4項「RLファクトの使用」を参照してください。
ADF Business Componentsファクト: ADF Business Componentsファクトを使用すると、ルールおよびデシジョン表でADF Business Componentsをファクトとして使用できます。ADF Business Componentsのファクトを使用することで、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフをアサートし、Oracle Business Rulesにビュー・オブジェクトのグラフ内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させることができます。
詳細は、第3.5項「ADF Business Componentsファクトの使用」を参照してください。
ルール対応アプリケーションのビジネス・オブジェクトを調査するルールを作成したり、結果をアプリケーションに返す場合は、通常、Javaファクト・タイプとXMLファクト・タイプを使用します。 RL Languageファクト・タイプ定義を使用して、Rules Engineで他のルールを起動できる中間ファクトを作成します。
バケット・セットを作成し、指定したタイプの値リストまたは値範囲を定義できます。作成したバケット・セットは、一致するタイプのファクト・プロパティに関連付けることができます。バケット・セットがファクト・プロパティに関連付けられている場合、Oracle Business Rulesでは、ルールまたはデシジョン表でファクト・プロパティの値に対する制約として定義したバケットが使用されます。
詳細は、次を参照してください。
XMLファクト・タイプを使用すると、ルールを記述する際にXMLスキーマのタイプ、要素および属性を使用できます。 XMLスキーマに定義されている要素およびタイプをデータ・モデルにインポートし、Javaファクト・タイプやRLファクト・タイプの場合と同様にルールおよびデシジョン表の作成に使用できます。XMLスキーマ定義およびXMLファクト・タイプの間のマッピングには、Java Architecture for XML Binding(JAXB)が使用されます。Oracle Business Rulesでは、デフォルトでOracle Application Serverに同梱されているJAXB 2.0を使用します。JSR-222に定義されているJAXBは、XMLスキーマ定義内のタイプ、名前、規則および、Javaで使用可能なタイプ、許可される名前、規則の間のマッピングを提供します。 たとえば、xsd:integer
タイプのorder-id
という要素は、BigInteger
型のorderID
というJava Beanプロパティにマップされます(xsd:int
タイプはJavaのint
にマップされます)。
したがって、Oracle Business Rulesでは、アプリケーションに関連付けられたデータを含むXML文書があり、そのXML文書に関連付けられたスキーマがある場合、Rules Designerを使用し、XMLスキーマから指定する要素に基づいてルールを定義できます。
XMLファクト・タイプを作成する手順は、次のとおりです。
XMLスキーマを定義または取得します。
Rules Designerを使用して、XMLスキーマをディクショナリにインポートします。 この手順では、JAXBコンパイラを使用してXMLスキーマからJavaクラスを生成します。XMLスキーマのコンパイル後に、スキーマから必要な要素を選択し、データ・モデル内でXMLファクトを追加し、生成されたJAXBクラスをデータ・モデルにインポートします。 これらの手順の詳細は、第3.2.1項「XMLスキーマをインポートしてXMLファクトを追加する方法」を参照してください。
データ・モデルに追加したXMLファクトに基づいて、ルールを記述するか、デシジョン表を作成します。 詳細は、第4.3項「ルールの使用」および第5.2項「デシジョン表の作成」を参照してください。
XMLスキーマに定義されている要素およびタイプをデータ・モデルにインポートし、タイプのインスタンスをルールで作成、アサート、変更および取消しできます。ほとんどのXML文書では階層情報が記述されており、各要素にはサブ要素が含まれています。通常、ユーザーはこの階層内の複数の要素および要素間の階層関係に基づいて個々のルールを記述します。Oracle Business Rulesでは、ファクトをアサートする際のデフォルト動作は単一のファクト・インスタンスをアサートすることのみで、サブ要素の階層内で参照している可能性のある子オブジェクトはアサートしません。ルールまたはデシジョン表の作成時には、通常、ルート要素への参照に基づいて要素の階層全体をアサートするようにします。Oracle Business Rulesには、階層を再帰的にアサートできるように
assertTree
アクション・タイプが用意されています。詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。
データ・モデルでXMLスキーマ定義を使用する前に、XMLスキーマをインポートする必要があります。 この手順では、JAXBクラスを生成し、生成されたクラスおよびパッケージをRules Designerで参照可能なXMLスキーマに関連付けます。
XMLスキーマをインポートしてXMLファクトを追加する手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
図3-1に示すように、「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。
「XMLファクト」タブで「作成」をクリックします。「XMLファクトの作成」ダイアログが表示されます。
「XMLファクトの作成」ダイアログの「ソース・スキーマ」領域で、「ソース・スキーマの追加」をクリックします。図3-2に示すように、「ソース・スキーマの追加」ダイアログが表示されます。
「ソース・スキーマの追加」ダイアログで、インポートするXMLスキーマの場所を「スキーマの場所」フィールドに入力するか、「参照」をクリックしてXMLスキーマを検索します。 インポート中に、ファイルがプロジェクトにコピーされます。
「ソース・スキーマの追加」ダイアログの「JAXBクラス・ディレクトリ」フィールドで、デフォルトを受け入れるか、またはRules DesignerでJAXB生成のJavaソースおよびクラス・ファイルを格納するディレクトリを入力します。
「ソース・スキーマの追加」ダイアログの「ターゲット・パッケージ」フィールドで、ターゲット・パッケージ名を入力するか、またはこのフィールドを空白にしておきます。このフィールドを空白にした場合、JAXBクラス・パッケージ名は、JAXB XMLおよびJavaのデフォルト・マッピング・ルールを使用してXMLスキーマのXMLターゲット・ネームスペースから生成されるか、注釈を使用して明示的に定義されたパッケージ名から生成されるか、ネームスペースまたは注釈が定義されていない場合は「generated
」になります。 スキーマのネームスペースを使用することをお薦めします。
たとえば、ネームスペースhttp://www.oracle.com/as11/rules/demo
は、com.oracle.as11.rules.demo
にマップされます。
「OK」をクリックします。 Rules Designerでスキーマが処理されJAXBがコンパイルされるため、スキーマのサイズによっては、この手順の完了に時間がかかる場合があります。 この手順が完了すると、図3-3に示すように、Rules Designerの「XMLファクトの作成」ダイアログは、「ターゲット・クラス」領域が更新され、JAXBクラスが含まれた状態で表示されます。
「XMLファクトの作成」ダイアログの「ターゲット・クラス」領域で、XMLファクト・タイプとしてインポートするクラスを選択します。
「OK」をクリックします。
XMLファクトを使用するには、Rules Designerで「XMLファクトの編集 -」ダイアログを開きます。
XMLファクトを表示して編集する手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。
「XMLファクト」表で、編集するXMLファクトのアイコンをダブルクリックします。図3-4に示すように、「XMLファクトの編集 -」ダイアログが表示されます。
「XMLファクトの編集 -」ダイアログには、表3-1に示すフィールドがあります。
表3-1 XMLファクト: 「XMLファクトの編集 -」ダイアログのフィールド
プロジェクト内でXMLスキーマが変更された場合、Oracle Business Rulesディクショナリにスキーマを再インポートする必要があります。 スキーマを再インポートすると、Oracle Business Rulesでは、JAXBを使用してすべてのXMLファクト・タイプに対してソース・スキーマをすべて再コンパイルし、更新されたXMLスキーマ定義を使用してXMLファクト・タイプ定義を更新します。スキーマまたはクラスを変更し、実行時に変更後のスキーマまたはクラスを使用する場合、ファクトを再インポートする必要があります。
XMLファクトを再インポートする手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。
「XMLファクト」ページで、「更新されたスキーマからのXMLファクトのリロード」アイコンをクリックします。
再インポート操作が完了した後、互換性のない変更(更新されたスキーマに、ルールで参照されているプロパティを削除したという変更が含まれているなど)によって発生する検証警告があれば、訂正する必要があります。
ルールを記述する場合、assertTree
アクション・タイプは拡張モードでのみ使用可能です。 assertTree
を使用したルール作成の詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。
デシジョン関数を作成する場合、入力タイプのtree
オプションでは、作業メモリーに入力ファクトを入れるためにassert
を使用するかassertTree
を使用するかを定義します。 assertTree
の詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。
XMLスキーマにrestriction
定義が含まれていると、要素内での使用に有効なタイプを制限できます。 restrictionの一般的な用途は、例3-1に示すように、要素に使用できる文字列の列挙を定義することです。
例3-1 XMLスキーマのrestrictionの例
<xs:simpleType name="status-type"> <xs:restriction base="xs:string"> <xs:enumeration value="manual"/> <xs:enumeration value="approved"/> <xs:enumeration value="rejected"/> </xs:restriction> </xs:simpleType>
Oracle JAXB 2.0では、restrictionがJava列挙タイプにマップされます。Rules Designerを使用してJava列挙タイプまたは要素をXML制限とともにインポートすると、列挙を表す静的な最終フィールドを式に使用できます。 また、Oracle Business Rulesでは列挙ごとに、すべての列挙値およびNULLを含むバケット・セットが作成されます。バケット・セットの詳細は、第3.6項「バケット・セットの使用」を参照してください。
Oracle Application Serverには、デフォルト・バージョンのJAXBバインド・コンパイラが同梱されています。 異なるJAXBバインド・コンパイラも使用できます。 ただし、異なるJAXBバインド・コンパイラを使用する場合は、XMLスキーマ処理を手動で実行し、生成されたJavaパッケージおよびクラスをJavaファクトとしてデータ・モデルにインポートする必要があります。
JAXBの詳細は、次を参照してください。
スキーマまたはクラスを変更し、実行時に変更後のスキーマまたはクラスを使用する場合、ファクトを再インポートする必要があります。互換性のない変更(ルールで参照されているプロパティの削除など)によって発生する検証警告があれば、訂正する必要があります。 詳細は、第3.2.3項「スキーマが更新されたXMLファクトをリロードする方法」を参照してください。
ほとんどのユーザーは、ObjectFactoryを使用またはインポートする必要はありません。 ObjectFactoryをインポートして使用する必要がある場合は、インポートする各XMLスキーマに異なるパッケージ名を使用しないと、異なるObjectFactoryクラスが競合します。
minOccurs="0"
およびnillable="true"
の要素を持つXMLスキーマを使用するには、JAXBで特別な処理が必要です。 詳細は、付録C.13「入力済要素を持つXMLスキーマをタイプJAXBElementとしてインポートするのはなぜですか。」を参照してください。
JAXBのデフォルト要素のネーミング規則によって、XMLスキーマの要素名にアンダースコア文字が含まれていると、XMLスキーマのコンパイルに失敗する場合があります。 詳細は、付録D.8「アンダースコアを持つXMLスキーマでJAXBコンパイルに失敗するのはなぜですか。」を参照してください。
デシジョン・サービスで入力するタイプと名前には特定の制限があります。 詳細は、付録D.9「デシジョン・サービスの入力と出力はどのように制限されますか。」を参照してください。
Rules Designerでは、Javaファクトをインポートすると、JavaクラスおよびそのメソッドがRules Designerで参照可能になります。Rules Designerでは、Javaコードやバイトコードがデータ・モデルやディクショナリにコピーされることはありません。
Javaファクト・タイプを使用すると、Javaクラスの選択したプロパティおよびメソッドをRules Engineにインポートできるため、ルールではそのJavaクラスのインスタンスへのアクセス、作成、変更および削除が可能となります。
Javaファクト・タイプをインポートすると、Rules EngineはJavaクラスに定義されているpublic属性、publicメソッドおよびBeanプロパティにアクセスして使用できます(Beanプロパティが適切です。これは、BeanプロパティがModifyアクションで変更できるからです)。
Javaファクトをルールおよびデシジョン表で使用する前に、Javaファクトを含むクラスおよびパッケージをRules Designerで使用可能にする必要があります。 そのためには、Rules Designerを使用してJavaクラスを含むクラスパスを指定し、Javaファクトをインポートします。
Javaファクトをインポートして定義する手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
図3-5に示すように、「ファクト」ナビゲーション・タブで、「Javaファクト」タブを選択します。
「Javaファクト」タブで「作成」をクリックします。 図3-6に示すように、「Javaファクトの作成」ダイアログが表示されます。
「Javaファクトの作成」ダイアログで、インポートするクラスを含むクラスパスが「クラスパス」領域に表示されない場合は、「クラスパスに追加」をクリックします。 「ディレクトリ/Jarの選択」ダイアログが表示されます。
Rules Designerのデフォルト・クラスパスには、3つのパッケージjava
、javax
およびorg
が含まれています。この3つのパッケージには、Rules DesignerでJavaランタイム・ライブラリ(rt.jar)からインポートできるクラスが含まれています。 Rules Designerでは、これらのクラスを「クラス」領域から削除することはできません(また、関連するクラスパスは「クラスパス」領域に表示されません)。
「ディレクトリ/Jarの選択」ダイアログで、追加するクラスパスまたはjarファイルを参照して選択します。デフォルトでは、プロジェクトの出力ディレクトリはインポート・クラスパスに存在し、プロジェクト内のJavaクラスは「クラス」インポータに表示されます。 表示されない場合は、プロジェクトに対してBuildアクションを実行します。
「開く」をクリックします。 これにより、クラスパスまたはjarファイルが追加され、「クラスパス」領域が更新されます。
「Javaファクトの作成」ダイアログの「クラス」領域で、図3-7に示すように、インポートするパッケージとクラスを選択します。
「OK」をクリックします。 「Javaファクト」タブの「Javaファクト」表が更新されます。
Javaファクトのインポート後にJavaファクトを表示および編集するには、「Javaファクトの編集 -」ダイアログを使用します。
Javaファクトを表示して編集する手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。
「ファクト」ナビゲーション・タブで、「Javaファクト」タブを選択します。
「Javaファクト」表で、編集するJavaファクトをダブルクリックします。 図3-8に示すように、「Javaファクトの編集 -」ダイアログが表示されます。
「Javaファクトの編集 -」ダイアログには、表3-2に示すフィールドがあります。
表3-2 「Javaファクトの編集 -」ダイアログのフィールド
Javaファクトを定義する際の注意事項は、次のとおりです。
Windowsシステムでは、「クラスパス」領域でクラスパスの指定に円記号(\
)またはスラッシュ(/)を使用できます。Rules Designerでは、どちらのパス・セパレータも使用できます。
Rules Designerで使用するクラスおよびインタフェースは、次のルールに従う必要があります。つまり、クラスまたはインタフェースを使用する場合、参照可能にできるのは、そのスーパー・クラスまたは実装されるインタフェースの1つのみです。
クラスパスを指定する際に、JARファイル、ZIPファイルまたはディレクトリのフルパスを指定できます。
クラスパスにディレクトリ名を指定する場合、そのディレクトリでは、ルート・パッケージ(完全パッケージ名に含まれる最初のパッケージ)が格納されているディレクトリで終わるクラスパスを指定します。つまり、クラスパスでディレクトリを指定すると、Rules Designerではそのツリー内でパッケージ名構造と一致するディレクトリ名が検索されます。
たとえば、c:\myprj\cool\example\Test1.class
にあるクラスcool.example.Test1
をインポートするには、クラスパスの値c:\myprj
を指定します。
クラスを変更した場合は、ファクトを再インポートする必要があります。 再インポート操作の完了後、クラスの変更によって検証警告が表示されることがあります。互換性のない変更(ルールで参照されているプロパティの削除など)によって発生する検証警告があれば、訂正する必要があります。
RLファクトは、ユーザーが直接作成でき外部ソースが存在しないタイプの唯一のファクトです。他のすべてのタイプのOracle Business Rulesファクトはインポートされます。RLファクトは、リレーショナル・データベースの行またはメソッドがないJavaBeanと同じです。RLファクトには、データ・モデルで使用可能なタイプ(RLファクト、Javaファクトまたはプリミティブ・タイプ)のプロパティのリストが含まれています。 RLファクトを使用すると、動的な仮想型を提供することでJavaアプリケーションのオブジェクト・モデルを拡張できます。
次に例を示します。
顧客が過去3か月間に500ドル支払った場合(IF customer spent $500 within past 3 months)
その顧客はGold Customerとなる(THEN customer is a Gold Customer)
このルールでは、顧客データを指定するJavaファクトを使用し、RLファクト(Gold Customer)を作成するアクションも使用できます。ルールは、次のように、Gold Customerファクトを使用するように定義できます。
顧客がGold Customerの場合(IF customer is a Gold customer)
10%の割引を提供する(THEN offer 10% discount)
このルールでは、Gold Customerという名前のRLファクトを使用しています。このルールは、Gold Customerファクトを使用して、過去3か月間に500ドルの支払があった顧客には10%割引の資格があることを示しています。ルールには、顧客がGold Customerになる他の方法も指定できます。
Rules Designerでテストおよびプロトタイプ化を行う場合、RLファクトを作成し、ルールの記述およびテストに使用してから、スキーマをインポートし、XMLファクトに切り替えることができます(承認済XMLスキーマが作成されるか使用可能になるまで、待機が必要な場合があります)。RLファクトから対応するXMLファクトに切り替える手順は、次のとおりです。
RLファクトを削除します(これにより、作成したルールまたはデシジョン表で削除対象のRLファクトを使用しているという検証警告が表示されます)。
XMLファクトをインポートし、そのXMLファクトおよびプロパティに、手順1で削除したRLファクトとプロパティの名前と一致する別名を与えます。
このプロセスでは、XMLファクトとプロパティの別名および型が削除するRLファクトの別名および型と一致する場合、検証警告が削除されます。
「ファクト」ナビゲーション・タブからRLファクトを追加します。
RLファクトを定義する手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
図3-9に示すように、「ファクト」ナビゲーション・タブで、「RLファクト」タブを選択します。
「RLファクト」タブで「作成」をクリックします。
「RLファクト」表で、「名前」フィールドにRLファクトの名前を入力するか、またはデフォルト名を受け入れます。
「RLファクト」表で、「説明」フィールドに説明を入力するか、またはデフォルトの説明なしを受け入れます。
RLファクトにプロパティを追加するには、「RLファクトの編集 -」ダイアログを使用します。
RLファクトを表示、編集してRLファクトのプロパティを追加する手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
「RLファクト」タブで、ファクトを表示または編集するRLファクトをダブルクリックします。 図3-10に示すように、「RLファクトの編集 -」ダイアログが表示されます。
RLファクトのプロパティを追加するには、「RLファクトの編集 -」ダイアログの「プロパティ」領域で「作成」をクリックします。
「名前」フィールドにプロパティ名を入力します。
「タイプ」フィールドで、ドロップダウン・リストからタイプを選択するか、またはプロパティ・タイプを入力します。
プロパティにバケット・セットを関連付けるには、「バケットセット」フィールドのドロップダウン・リストからバケット・セットを選択します。
プロパティに初期値を関連付けるには、「初期値」フィールドに値を入力します。
必要に応じて前述の手順を繰り返し、さらにプロパティを追加します。
「OK」をクリックします。
「RLファクトの編集 -」ダイアログを使用してRLファクトにプロパティを追加する場合、図3-11に示すように、「プロパティ」領域の「初期値」フィールドに候補値のドロップダウン・リストが表示されます。
Rules Designerの一部のフィールドを使用する際に、図3-12に示すように、初期値のドロップダウン・リストや他のドロップダウン・リストが空の場合があります。 この場合、ドロップダウン・リストは空のボックスです。 したがって、Rules Designerで値の入力に役立つオプションがみつからない場合、テキスト入力領域に値を直接入力するか、または「式ビルダー」アイコンをクリックして「式ビルダー」ダイアログを表示する必要があります。
ADF Business Componentsファクトを使用すると、ルールおよびデシジョン表でADF Business Componentsをファクトとして使用できます。ADF Business Componentsのファクトを使用することで、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフをアサートし、Oracle Business Rulesにビュー・オブジェクトのグラフ内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させることができます。
詳細は、第10章「Oracle Business RulesとADF Business Componentsの使用」を参照してください。
ADF Business Componentsビュー・オブジェクトをインポートすると、ビュー・オブジェクの各属性に対応するプロパティを持つADF Business Componentsファクト・タイプが作成されます。
ADF Business Componentsファクトを追加する手順は、次のとおりです。
「ファクト」ナビゲーション・タブをクリックし、「ADF-BCファクト」タブを選択します。 図3-13に示すように、「ADF-BCファクト」表が表示されます。
「作成」をクリックします。 図3-14に示すように、「ADF-BCファクト」ダイアログが表示されます。
「接続」フィールドのドロップダウン・リストから、ADF Business Componentsオブジェクトで使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。 詳細は、第3.5.2項「ADF Business Componentsファクトのクラスパスに関する必須情報」を参照してください。
「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。
「OK」をクリックします。 図3-15に示すように、「ファクト」ナビゲーション・タブが表示されます。 インポートしたファクトには検証警告が含まれることに注意してください。 この検証警告の削除の詳細は、第3.5.3項「ADF Business Componentsの循環参照に関する必須情報」を参照してください。
図3-15 Rules DesignerでのADF Business Componentsファクト
表示されたいずれかのクラスパスの「ADF-BCファクトの作成」ダイアログの「クラスパスの検索」領域に表示されるクラスパス・リストには、プロジェクトで使用できるオブジェクト定義を表示できます。 プロジェクトに使用できないクラスパスを使用する必要がある場合は、このダイアログで「クラスパスに追加」をクリックするだけで十分です(非常にまれなケース)。
ADF Business Componentsファクトには、図3-15に示すように循環参照を含めることができます。 この警告がビジネス・ルール検証ログに表示された場合は、循環参照を手動で解決する必要があります。 そのためには、循環参照に関係するいずれかのプロパティの「参照可能」チェック・ボックスの選択を解除します。
各ADF Business Componentsファクト・タイプには、各ファクト・インスタンスが表すoracle.jbo.Row
を参照するViewRowImpl
という名前のプロパティと、この行と親行のキー値セットの取得に使用可能なoracle.rules.sdk2.decisionpoint.KeyChain
オブジェクトを指すkey_values
という名前のプロパティが含まれています。
ADF Business Componentsを使用する際の注意事項は、次のとおりです。
ビュー・オブジェクト定義間の関係は、ビュー定義の属性、特にビュー・リンクのアクセッサである属性のイントロスペクションによって決定されます。
ADF Business Componentsファクト・タイプ・インポータでは、どの関係が1対1で、どの関係が1対多であるかが正しく判別され、それに従ってディクショナリに定義が生成されます。 1対多関係の場合、生成されるプロパティのタイプはList
で、実行時に示されたタイプのファクトが含まれています。
循環的なタイプ依存性を持つADF Business Componentsファクト・タイプは使用できません。 循環に関係する1つ以上のプロパティの「参照可能」チェック・ボックスの選択を解除して、これらの循環を絶つ必要があります。
ADF Business Componentsファクト・タイプはJavaファクト・タイプではなく、ビュー・オブジェクト用に明示的に作成された実装クラスのメソッドは起動できません。
この種のメソッドをコールする必要がある場合は、ビュー・オブジェクト実装をADF Business Componentsファクト・タイプのかわりにJavaファクト・タイプとしてディクショナリに追加します。この場合、すべてのgetter、setterおよびその他のメソッドが使用可能になりますが、関連するビュー・オブジェクトにアクセスできなくなり、そのオブジェクトへのアクセスが必要な場合は、これらの関係を明示的に管理する必要があるというトレードオフがあります。
内部的には、ADF Business Componentsファクト・タイプはRLファクト・タイプのインスタンスです。
つまり、このことは、ADF Business Componentsビュー・オブジェクト・インスタンスをルール・セッションに直接アサートすることはできず、かわりにMetadataHelper
およびADFBCFactTypeHelper
クラスに用意されているヘルパー・メソッドを使用する必要があることを意味します。詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。
バケット・セットを作成すると、値リストまたは値範囲のリストを定義して、Oracle Business Rules内のファクトまたはファクト・プロパティについて許容範囲内の値セットを制限できます。バケット・セットは、バケット・セットに名前を付けてデータ・モデルに格納する再利用可能なグローバル・バケット・セット、またはデシジョン表の定義時に指定し、1つの条件式にのみ適用するローカル・バケット・セットとして定義できます。ローカル・バケット・セットの使用の詳細は、第5.2.2項「デシジョン表への条件行の追加方法」を参照してください。
バケット・セットは次のように使用できます。
ファクト・タイプ・プロパティをバケット・セットに関連付けることができます。 これにより、ファクト・プロパティについて許容範囲内の値セットを制限できます。 詳細は、第3.7.1項「バケット・セットをファクト・プロパティに関連付ける方法」を参照してください。
デシジョン表では、バケット・セットを使用して、デシジョン表の一部である条件式について、値リストまたは値範囲を指定します。バケット・セットの値または範囲により、デシジョン表内の条件式ごとに複数の候補があることが判別されます。 バケット・セットを使用すると、条件式内の各候補がグループまたは範囲に分割されます。このグループまたは範囲では、セルによりバケット・セット(または、セルごとに複数の値バケット)からの値でバケットが1つ指定されます。 たとえば、色に関するバケット・セットが定義されている場合は、青、赤およびオレンジなどの文字列のリストを含むバケットが考えられます。 整数を含むバケット・セットは、1未満、1から10、および11以上という3つのバケットが考えられます。詳細は、第5.2.2項「デシジョン表への条件行の追加方法」を参照してください。
グローバル、関数および関数の引数をバケット・セットに関連付けることができます。 バケット・セットをグローバルに関連付けると、割り当てられた値がバケット・セットで指定された値に制限されていることを、デザインタイムに検証できます。 バケット・セットを関数の引数に関連付けると、バケット・セットの値のみを使用して関数がコールされることが検証されます。 バケット・セットをこのように使用すると、Rules Designerでは、許可されない定数の引数値が割り当てられるか、渡されたグローバル値および関数の引数について検証警告をレポートできます。このタイプのバケット・セット検証は、デザインタイムの定数値のみが検証されるという意味で弱い検証です。 バケット・セットに関連付けられたグローバルまたは関数の引数に基づく実行時チェックは適用されません。 バケット・セットを関数に関連付けると、条件行の式として関数を使用した場合に、そのバケット・セットを使用するようにデシジョン表の条件式が自動的に設定されます。 詳細は、第3.7.2項「バケット・セットを関数または関数の引数に関連付ける方法」を参照してください。
デザインタイムの検証に加え、LOVバケット・セットを使用して、IF/THENルールのテストおよびアクションで式の入力時にリストに表示されるオプションを提供できます。 詳細は、第4.11.3項「バケット・セットを使用してテスト式のオプションを指定する方法」を参照してください。
バケット・セットには次の3つの形式があります。
LOV: 値リストで定義されます(第3.6.1項「値リスト・グローバル・バケット・セットの定義方法」を参照)。
範囲: 範囲のエンドポイントで定義される値範囲のリストで定義されます(第3.6.2項「範囲リスト・グローバル・バケット・セットの定義方法」を参照)。
列挙: 次のいずれかからインポートされる列挙タイプのリストで定義されます。
XMLタイプ(第3.6.3項「XMLタイプからの列挙タイプ(列挙)バケット・セットの定義方法」を参照)。
Javaファクト(第3.6.4項「Javaタイプからの列挙タイプ(列挙)バケット・セットの定義方法」を参照)。
値リスト・バケット・セットを使用すると、バケット・セットのバケットの型およびリストを指定できます。
詳細は、第3.6.5項「値リスト・バケット・セットに関する必須情報」を参照してください。
値リスト(LOV)グローバル・バケット・セットを定義する手順は、次のとおりです。
Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。
図3-16に示すように、「バケットセットの作成」アイコンの横にあるドロップダウン・リストから、「値リスト」を選択します。
バケットのバケット・アイコンをダブルクリックします。「バケットセットの編集」ダイアログが表示されます。
「バケットセットの編集」ダイアログで、「名前」列にバケット・セット名を入力します。
「データ型」列で、ドロップダウン・リストからデータ型を選択します。
たとえば、ドロップダウン・リストから「String」を選択します。
「作成」アイコンをクリックして値を追加します。
追加するバケットごとに、次の手順を実行します。
「値」フィールドに値を入力します。 LOVバケットのStringタイプの値では、3回クリックすると文字列全体を選択できます。 これにより、図3-17に示すように、文字列を入力し、Rules Designerで同じ別名が引用符で囲まれずに追加できます。
「エイリアス」フィールドに別名を入力します。
値が許可された値の場合は、「アクションで許可済」フィールドのチェック・ボックスを選択します。
「アクションで許可済」フィールドと「許可されないバケットをテストに含める」フィールドの詳細は、第3.6.7項「バケット・セットの「アクションで許可済」オプションに関する必須情報」を参照してください。
「説明」フィールドに説明を入力します。
図3-17に示すように、必要に応じてバケット・セットの「作成」アイコンをクリックし、値をさらに追加します。
「バケットセットの編集」ウィンドウで「OK」をクリックします。
デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられているLOVバケット・セット内のバケットの相対位置を変更することで管理できます。
値リスト・バケット・セット内のバケットの順序を変更する手順は、次のとおりです。
バケット・セットの「バケットセットの編集」ダイアログで、順序を変更するバケットを選択します。
バケットの順序を下位へ変更するには、「下に移動」アイコンをクリックします。
バケットの順序を上位へ変更するには、「上に移動」アイコンをクリックします。
「OK」をクリックします。
範囲リスト・バケット・セットを使用すると、バケット・セットのバケットの型およびエンドポイントを指定できます。
詳細は、第3.6.6項「範囲バケット・セットに関する必須情報」を参照してください。
範囲リスト(範囲)グローバル・バケット・セットを定義する手順は、次のとおりです。
Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。
「バケットセットの作成」アイコンの横にあるドロップダウン・リストから、「範囲リスト」を選択します。
「データ型」フィールドをダブルクリックします。 図3-18に示すように、「バケットセットの編集」ダイアログが表示されます。
「バケットセットの編集」ダイアログで、「名前」フィールドにバケット・セット名を入力します。
「バケットセットの編集」ダイアログで、「データ型」フィールドのドロップダウン・リストからバケット・セットに該当するデータ型を選択します。
この例では、「int」を選択します。
「バケットの追加」アイコンを繰り返しクリックし、図3-19に示すようにバケット・セットに必要な数のバケットを追加します。
この手順では、3つのバケットを追加します。 図3-19に示すように、デフォルト値で開始します。 デフォルトのバケットを変更した後、バケットには次の値が存在します。
1000より大きい
500以上1000以下
500未満
Rules Designerにより、デフォルト値50、0、および負の無限大(-Infinity)でバケットが追加されます。
「エンドポイント」フィールドで、最初(最上位)のバケットから始めてデフォルト値をダブルクリックし、最上位の値バケットのエンドポイントを入力して[Enter]を押します。
この例では、最初のバケットについて1000と入力します。
「含まれるエンドポイント」フィールドで、該当するチェック・ボックスを選択して、バケットのエンドポイントを含めるか除外します。
この例では、バケットのエンドポイントを含めるために、このチェック・ボックスを選択状態のままにしておくことができます。
「アクションで許可済」フィールドで、該当するチェック・ボックスを選択して、バケット・セットの許可された値にバケットを含めます。
「アクションで許可済」フィールドと「許可されないバケットをテストに含める」フィールドの詳細は、第3.6.7項「バケット・セットの「アクションで許可済」オプションに関する必須情報」を参照してください。
「エイリアス」フィールドでデフォルト値をダブルクリックし、必要なバケット別名を入力して[Enter]を押すこともできます。
別名は、このバケット・セットを使用するデシジョン表に表示されます。別名を使用すると、バケットにデフォルト値(範囲ベースの範囲値)よりもわかりやすい名前を付けることができます。
「範囲」フィールドは読取り専用で、バケットに関連付けられている実際の範囲が別名値に関係なく明確に識別されます。詳細は、第3.6.6項「範囲バケット・セットに関する必須情報」を参照してください。
以降のバケットごとに、バケットのリスト内で下に移動し、手順7以降を繰り返します。第2のバケットの場合、エンドポイント値500を入力します。
図3-20に、完成したバケット・セットを示します。
「バケットセットの編集」ダイアログで「OK」をクリックします。
XMLスキーマをインポートする際に、XSDに列挙値が含まれていると、Rules Designerでは列挙ごとに列挙タイプ・バケット・セットが自動的に作成されます。列挙タイプ・バケット・セットは読取り専用ですが、バケットの順序は変更できます。
詳細は、第3.2.4項「XMLファクトに関する必須情報」を参照してください。
XMLタイプから列挙タイプ(列挙)バケット・セットを定義する手順は、次のとおりです。
必要な列挙を含むXSDを取得します。
例3-2に、列挙Status
を含むorder.xsd
スキーマ・ファイルを示します。
例3-2 order.xsdスキーマ
<?xml version="1.0" ?> <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://example.com/ns/customerorder" xmlns:tns="http://example.com/ns/customerorder" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="CustomerOrder"> <complexType> <sequence> <element name="name" type="string" /> <element name="creditScore" type="int" /> <element name="annualSpending" type="double" /> <element name="value" type="string" /> <element name="order" type="double" /> </sequence> </complexType> </element> <element name="OrderApproval"> <complexType> <sequence> <element name="status" type="tns:Status"/> </sequence> </complexType> </element> <simpleType name="Status"> <restriction base="string"> <enumeration value="manual"/> <enumeration value="approved"/> <enumeration value="rejected"/> </restriction> </simpleType> </schema>
Rules Designerでディクショナリを開き、列挙を含む指定のスキーマを使用してXMLファクトを作成します。詳細は、第3.2項「XMLファクトの使用」を参照してください。
「バケットセット」ナビゲーション・タブをクリックし、Enumバケット・セットを選択して、図3-21に示すようなバケット・セットを表示します。 図3-21では、例3-2に示すインポートされたStatus
の列挙値がXSD指定値を含むバケットとしてインポートされていることに注意してください。
デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられている列挙バケット・セット内のバケットの相対位置を変更することで管理できます。
列挙バケット・セット内のバケットの順序を変更する手順は、次のとおりです。
バケット・セットの「バケットセットの編集」ダイアログで、順序を変更するバケットを選択します。
バケットの順序を下位へ変更するには、「下に移動」アイコンをクリックします。
バケットの順序を上位へ変更するには、「上に移動」アイコンをクリックします。
「OK」をクリックします。
Java列挙をインポートすると、Rules DesignerではJava列挙ごとに列挙タイプのバケット・セットが自動的に作成されます。列挙タイプ・バケット・セットは読取り専用ですが、バケットの順序は変更できます。
Javaファクトから列挙タイプ(列挙)バケット・セットを定義する手順は、次のとおりです。
必要な列挙を含むJavaクラスを作成または取得します。
例3-3に、列挙OrderSize
を含むRejectPurchaseItem.java
クラスを示します。
Rules Designerでディクショナリを開き、Javaクラスを使用してJavaファクトを作成します。詳細は、第3.3項「Javaファクトの使用」を参照してください。
図3-22に、Java列挙Class1$OrderSize
のJavaファクトの作成方法を示します。
図3-23に示すように、Rules Designerで「バケットセット」ナビゲーション・タブをクリックし、Enumバケット・セットを選択します。 例3-3の列挙からの列挙Class1$OrderSize
が、Javaのenum
指定値を含むバケット・セットになっていることに注意してください。
デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられている列挙バケット・セット内のバケットの相対位置を変更することで管理できます。
列挙タイプ(列挙)バケット・セット内のバケットの順序を変更する手順は、次のとおりです。
バケット・セットの「バケットセットの編集」ダイアログで、順序を変更するバケットを選択します。
バケットの順序を下位へ変更するには、「下に移動」アイコンをクリックします。
バケットの順序を上位へ変更するには、「上に移動」アイコンをクリックします。
「OK」をクリックします。
デシジョン表では、条件式に関連付けられているバケット・セット内のバケットの順序によって条件セルの順序が決まり、したがってルールの順序も決まります。 デシジョン表でのルールの順序付けは、条件式に関連付けられている値リスト・バケット・セット内のバケットの相対位置を変更することで管理できますが、範囲バケットの順序は変更できません。
図3-24に、値リストを使用するcolorsというバケット・セットに関するRules Designer内のバケット・セット定義を示します。
図3-24に示すように、デフォルトでは値リスト・バケット・セットの値リスト(LOV)に値otherwise
が含まれています。この値otherwise
は、他のすべての値とは異なり、他のバケットを持たないタイプのすべての値と一致します。 したがって、値リストにotherwise
がある場合、そのバケット・セットを使用する条件式では、各値を処理して指定のタイプの値ごとに一致を提供できます。この場合、一致は定義済の値またはotherwise
バケットです。 otherwise
値はLOVバケット・セットから削除できませんが、「アクションで許可済」チェック・ボックスの選択を解除して除外できます(otherwise
を除外した場合、バケット・セット内のバケットのリストにない値を割り当てようとすると、検証警告が生成されます)。
表3-3に、Rules DesignerでLOVバケット・セットについてサポートされているバケット・セット値を示します。
表3-3 LOVバケット・セットについてサポートされている型
タイプ | 説明 |
---|---|
Javaプリミティブ型 |
|
|
|
|
現行ロケール内の |
注意: デシジョン表でブール型を使用する場合、LOVバケット・セットを指定する必要はありません。 ブール型の場合、Oracle Business Rulesには可能な値(true およびfalse )用の組込みバケットが用意されています。 |
範囲リスト・バケット・セットにバケットを追加すると、現在選択しているバケット値および次に上位のバケット値に基づいて値が計算されます。 エンドポイント値を変更すると、値は自動的にバケット・セット内でソートされるため、新規バケットの追加先はどこでもかまいません。 ただし、Rules Designerでは、現行のバケット・セットのエンドポイント値およびエンドポイント値の間に余地がない場合があります。この場合、Rules Designerでは次の書式の検証警告が表示されます。
RUL-05849: Bucketset has duplicate bucket value "4999"
この問題を解決するには、バケットのエンドポイントを変更し、重複するバケットを削除する必要があります。
図3-25に、整数int
および範囲を持つバケット・セットの「バケットセットの編集」ウィンドウを示します。
表3-4に、Rules Designerで範囲バケットについてサポートされている型を示します。
表3-4 範囲バケットについてサポートされている型
タイプ | 説明 |
---|---|
選択したプリミティブ型 |
|
|
現行ロケール内のCalendar型が含まれます。 |
「範囲」フィールドに関する次の規則に注意してください。
論理演算子: 正または負の無限大に関する範囲を指定します。たとえば、>=25
は25以上で正の無限大を意味し、<18
は負の無限大から18未満を意味します。
大カッコ「[
」: このエンドポイント値を含む範囲を指定します。たとえば、[18..25)
は18以上25未満を意味します。
丸カッコ「)」: このエンドポイント値を除く範囲を指定します。 たとえば、(18..25]
は18より大きく25以下を意味します。
バケット・セット内のバケットを定義する際、許可されていない値に対応する一部のバケットを定義できます。 たとえば、運転者の年齢に関するバケット・セットでは、通常、0より小さい値を含むバケットは許可しません。したがって、運転者のデータを持つファクトに、運転者の年齢に関するバケット・セットに関連付けられた年齢プロパティが含まれる場合は、年齢プロパティが-1などの値に設定されているファクトを作成または変更できないようにする必要があります。バケット・セットでは、有効なバケットに対して「アクションで許可済」を選択し、無効なバケットに対してこのオプションの選択を解除します。
バケット・セット・オプション「許可されないバケットをテストに含める」を使用すると、デシジョン表の条件およびルールのテストで「アクションで許可済」が選択されているかどうかに関係なく、すべてのバケットを含めることができます。すべてのバケットを含めることで、不正な値を明示的にテストできます。 オプション「許可されないバケットをテストに含める」を使用すると、次のような2つのケースに対応できます。
Oracle Business Rules Engineの入力データがクリーンで、無効なデータ(負の年齢など)が含まれていない場合。 この場合、「許可されないバケットをテストに含める」の選択を解除する必要があります。 注意: age < 0
を「アクションで許可済」に設定しないのは、これにより、modify(driver, age: -1))
のような無効な値を使用するアクションを作成しようとした場合に、デザインタイムの検証警告が提供されるためです。 詳細は、第4.11項「ルールにおけるオプション値の制約としてのバケット・セットの使用」を参照してください。
ルール・テストとデシジョン表で除外されたバケットを考慮する場合。 この場合、「許可されないバケットをテストに含める」を選択する必要があります。 これは、Oracle Business Rules Engineの入力データがクリーンでなく、無効なデータ(無効な負の年齢など)が含まれている可能性がある場合に役立ちます。 すべてのバケット・セットに対するアクションを提供するデシジョン表には、除外されたバケットに関するケースを含めることができ、エラー・ファクトのアサートなど、適切なアクションを提供します。 これを処理するには、バケット・セット内の各バケットの「アクションで許可済」フィールドを選択する方法、および「アクションで許可済」フィールドは構成されたままにして「許可されないバケットをテストに含める」フィールドを選択する方法があります。 「許可されないバケットをテストに含める」フィールドを使用すると便利であるのみでなく、各バケットを再構成する必要がなく、「アクションで許可済」の構成も保持されます。そのため、このバケット・セットを容易に再利用し、(「許可されないバケットをテストに含める」の選択を解除したときに)第1のケースを処理できます。
バケット・セットにバケット値を入力する場合、入力値はバケット・セットに指定されたタイプに対して有効である必要があります。 入力した値がバケット・セット・タイプに無効であると、Rules Designerで引用符が追加され文字列になります。 入力されたデータが指定タイプに対して適切でない場合、引用符を追加することによってのみ有効なリテラルとなります。 たとえば、intタイプのLOVバケット・セットで2.2という値を入力すると、Rules Designerから次のような警告が表示されます。
RUL-05833: Invalid characters "2.2" in bucket value
この問題を解決するには、バケット値に有効な値(この場合は値2など)を入力するか、バケット・セットのタイプを変更します。
別の例として、バケットに値を入力する場合、たとえばデータ型がshortのバケット・セットで値999999のバケットを追加すると、Rules Designerによって"999999"という値が割り当てられます。 Shortの最大値は32767です。この場合、データ型がshortのバケット・セットに対して「String」は有効なバケット値ではないため、バケット値に関する前述の例に似た警告が表示されます。 この問題を解決するには、すべてのバケットに対して適切な値(この例では、32767以下の値)を入力します。
グローバル・バケット・セットを定義した後、データ・モデルの各部をグローバル・バケット・セットに関連付けることができます(両方のタイプに互換性がある場合)。これにより、デシジョン表を定義する際、「条件」領域にある条件セルにバケット・セットを自動的に割り当てることができます。また、バケット・セットがファクト・プロパティに関連付けられている場合、Oracle Business Rulesでは、ルールでファクト・プロパティの式の値に対する制約として定義したバケットが使用されます。
デシジョン表を作成する準備のため、グローバル・バケット・セットをデータ・モデル内のファクト・プロパティに関連付けることができます。
バケット・セットをファクト・プロパティに関連付ける手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
必要なファクト・タイプを選択します。 選択したファクト・タイプに適した「ファクトの編集」ダイアログが表示されます。
「プロパティ」表の「バケットセット」の下で、適切なファクト・プロパティのセルを選択し、プロパティに関連付けるバケット・セットをドロップダウン・リストから選択します。 図3-26に示す例を参照してください。
「ファクトの編集」ページで「OK」をクリックします。
デシジョン表を作成する準備のため、グローバル・バケット・セットをデータ・モデル内の関数に関連付けることができます。
バケット・セットを関数の戻り値に関連付ける手順は、次のとおりです。
Rules Designerで、「関数」タブを選択します。
編集する関数を選択します。これにより、選択された関数について、関数の引数および関数本体が表示されます。
「関数」表の「バケットセット」の下でセルを選択し、使用するバケット・セットをドロップダウン・リストから選択します。 図3-27に示す例を参照してください。
バケット・セットを関数の引数に関連付ける手順は、次のとおりです。
Rules Designerで、「関数」ナビゲーション・タブを選択します。
編集する関数を選択します。これにより、選択された関数について、関数の引数および関数本体が表示されます。
「関数」表の「引数」領域で、適切な引数を選択します。
指定の引数について「バケットセット」の下でセルを選択し、使用するバケット・セットをドロップダウン・リストから選択します。