Oracle® Fusion Middleware

Oracle Business Process Managementを使用したビジネス・ルールの設計

12c (12.2.1.1)

E79348-01(原本部品番号:E66977-01)

2016年6月

開発者およびビジネス・ユーザー向けのドキュメントで、Oracle JDeveloper with Oracle SOAエクステンションなどのデザインタイム・ツールやOracle SOA Composerなどのランタイム・アプリケーションを使用することでOracle Business Rulesのファクト、ルールおよびデシジョン表に関連するアプリケーションの使用や開発を行う方法に関する情報を提供します。

Oracle Fusion Middleware Oracle Business Process Managementによるビジネス・ルールの設計 12c (12.2.1.1)

E79348-01

Copyright © 2005, 2016, Oracle and/or its affiliates. All rights reserved.

原本著者: Oracle Corporation

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

このガイドで説明する新機能

1 Oracle Business Rulesの概要

- 1.1 Oracle Business Rulesの概要

- 1.1.1 Oracle Business Rulesを使用する理由

- 1.1.2 Oracle Business Rulesの用語の理解

- 1.1.2.1 ファクトおよび値セットとは

- 1.1.2.2 ルールセットとは

- 1.1.2.3 ディクショナリとは

- 1.1.2.4 グローバルとは

- 1.1.2.5 デシジョン関数とは

- 1.1.2.6 デシジョン・ポイントとは

- 1.1.2.7 ビジネス・フレーズとは

- 1.2 Oracle Business Rulesの形式の理解

- 1.2.1 ルール

- 1.2.1.1 ルール条件とは

- 1.2.1.2 ルール・アクションとは

- 1.2.1.3 動詞ルールと一般的なルールの違い

- 1.2.2 デシジョン表

- 1.3 Oracle Business Rulesのランタイム要素とデザインタイム要素

- 1.3.1 SOAコンポジット・アプリケーションでのデシジョン・コンポーネント(Business Rules)

- 1.3.2 Java EEアプリケーションにおけるOracle Business RulesのRules Engineの使用

- 1.3.3 Oracle Business Rules RL Language

- 1.3.4 Oracle Business Rules SDK

- 1.3.5 ルール・デザイナ

- 1.3.6 Oracle SOA Composerアプリケーション

- 1.3.7 Oracle Business Process Composerアプリケーション

- 1.4 Oracle Business Rules Engineのアーキテクチャ

- 1.4.1 宣言ルール

- 1.4.2 Reteアルゴリズム

- 1.4.3 非Reteアルゴリズム

- 1.4.3.1 非Reteアルゴリズムの構成

- 1.4.4 作業メモリーとは

- 1.4.5 ルールの起動とルール・セッション

2 データ・モデル要素の使用

- 2.1 データ・モデル要素の使用の概要

- 2.2 ディクショナリとディクショナリ・リンクの概要

- 2.2.1 ディクショナリとディクショナリ・リンクの使用

- 2.2.2 ルール・デザイナを使用してSOA層にディクショナリを作成する方法

- 2.2.3 ルール・デザイナを使用してビジネス層にディクショナリを作成する方法

- 2.2.4 ディクショナリ設定の表示および編集方法

- 2.2.4.1 ディクショナリ別名を変更する方法

- 2.2.4.2 「プリファレンス」タブを編集する方法

- 2.2.4.3 「データ・モデル」タブを編集する方法

- 2.2.5 ディクショナリにリンクする方法

- 2.2.6 リンク先ディレクトリの更新方法

- 2.2.7 ディクショナリ・リンクに関する必知事項

- 2.2.8 ディクショナリ・リンクおよびディクショナリ・コピーに関する必知事項

- 2.2.9 デプロイされたディクショナリへのディクショナリ・リンクに関する必知事項

- 2.2.10 BPELでのビジネス・ルールの入力および出力に関する必知事項

- 2.2.11 2つ以上のディクショナリを比較またはマージする方法

- 2.2.11.1 ディクショナリ間の差異を調べる方法

- 2.2.11.2 ディクショナリのマージ方法

- 2.3 Oracle Business Rulesグローバルの使用

- 2.3.1 Oracle Business Rulesグローバルの追加方法

- 2.3.2 Oracle Business Rulesグローバルの編集方法

- 2.3.3 「ファイナル」オプションと「定数」オプションに関する必知事項

- 2.4 デシジョン関数の使用

- 2.5 Oracle Business Rules関数の概要

- 2.5.1 Oracle Business Rules関数の追加方法

- 2.6 Oracle Business Ruleリソースのローカライズ

- 2.6.1 Oracle Business Rulesでのリソースのローカライズ方法

3 ファクトと値セットの使用

- 3.1 ファクトと値セットの使用の概要

- 3.2 XMLファクトの使用

- 3.2.1 XMLファクト・タイプを作成する方法

- 3.2.2 XMLスキーマをインポートしてXMLファクトを追加する方法

- 3.2.3 XMLファクトの表示および編集方法

- 3.2.4 スキーマが更新されたXMLファクトをリロードする方法

- 3.2.5 XMLファクトに関する必知事項

- 3.3 Javaファクトの使用

- 3.3.1 JavaクラスをインポートしてJavaファクトを定義する方法

- 3.3.2 Javaファクトの表示および編集方法

- 3.3.3 Javaファクトに関する必知事項

- 3.4 RLファクトの使用

- 3.4.1 RLファクトの定義方法

- 3.4.2 RLファクトを表示および編集してRLファクトのプロパティを追加する方法

- 3.4.3 RLファクトに関する必知事項

- 3.5 ADFビジネス・コンポーネント・ファクトの使用

- 3.5.1 ADFビジネス・コンポーネント・ファクトをインポートおよび定義する方法

- 3.5.2 ADFビジネス・コンポーネント・ファクトのクラスパスに関する必知事項

- 3.5.3 ADFビジネス・コンポーネントの循環参照に関する必知事項

- 3.5.4 ADFビジネス・コンポーネント・ファクトに関する必知事項

- 3.6 値セットの使用

- 3.6.1 値リスト・グローバル値セットの定義方法

- 3.6.2 範囲リスト・グローバル値セットの定義方法

- 3.6.3 XMLタイプからの列挙タイプ(列挙)値セットの定義方法

- 3.6.4 Javaタイプからの列挙タイプ(列挙)値セットの定義方法

- 3.6.5 値リスト値セットに関する必知事項

- 3.6.6 範囲値セットに関する必知事項

- 3.6.7 値セットの「アクションで許可済」オプションに関する必知事項

- 3.6.8 値に関する必知事項

- 3.7 値セットのビジネス条件との関連付け

- 3.7.1 値セットをファクト・プロパティに関連付ける方法

- 3.7.2 値セットを関数または関数の引数に関連付ける方法

- 3.7.2.1 値セットを関数の引数に関連付ける方法

- 3.7.3 値セットをグローバル値に関連付ける方法

4 ルールセットとルールの使用

- 4.1 ルールセット、ルールおよびビジネス・フレーズの使用の概要

- 4.2 ルールセットの使用

- 4.2.1 ルールセットの作成方法

- 4.2.2 ルールセットの有効日の設定方法

- 4.2.3 ルールの有効日の設定方法

- 4.2.4 フィルタを使用してルールセット内で一致するルールを表示する方法

- 4.2.5 リストからコンポーネント値を選択するときのオート・コンプリートの使用

- 4.3 ルールの使用

- 4.3.1 一般的なルールの追加方法

- 4.3.2 動詞ルールの追加方法

- 4.3.3 ルールでのテストの定義方法

- 4.3.4 動詞ルールでのテストの定義方法

- 4.3.5 Oracle Business Rulesテスト変数に関する必知事項

- 4.3.6 ルールでの範囲テストの定義方法

- 4.3.7 ルールでのセット・テストの定義方法

- 4.3.8 一般的なルールでのアクションの定義方法

- 4.3.8.1 一般的なルールの基本アクション

- 4.3.9 動詞ルールでのアクションの定義方法

- 4.3.10 ルール・アクションに関する必知事項

- 4.3.11 Oracle Business Rulesのパフォーマンス・チューニングに関する必知事項

- 4.4 動詞ルールおよびビジネス・フレーズの概要

- 4.4.1 ビジネス・フレーズの使用

- 4.4.1.1 「ビジネス・フレーズ」タブ

- 4.4.1.2 ドラフトのビジネス・フレーズと動詞ルール

- 4.4.2 ビジネス・フレーズの作成方法

- 4.4.2.1 ビジネス・フレーズの作成シナリオの例

- 4.4.2.2 ビジネス・フレーズの変換

- 4.4.3 動詞ルールにおけるビジネス・フレーズの選択または追加

- 4.4.3.1 動詞ルール作成時の新規ビジネス・フレーズのインスタンス化

- 4.4.3.2 動詞ルール作成時のビジネス・フレーズの選択

- 4.4.3.3 導出されたビジネス・フレーズ

- 4.4.3.4 リストに表示するビジネス・フレーズの選択

- 4.5 ディクショナリの検証

- 4.5.1 データ・モデル検証

- 4.5.2 ルール検証の理解

- 4.5.3 デシジョン表の検証

- 4.5.4 ディクショナリの検証方法

- 4.6 ルールおよびデシジョン表での詳細設定の使用

- 4.6.1 ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法

- 4.6.2 拡張モード・オプションの選択方法

- 4.6.3 アクティブ・オプションの選択方法

- 4.6.4 論理オプションの選択方法

- 4.6.5 ルールの優先度の設定方法

- 4.6.6 有効日の指定方法

- 4.7 ネスト・テストの使用

- 4.8 拡張モードのルールの使用

- 4.8.1 拡張モードのパターン一致オプションの使用方法

- 4.8.2 拡張モードの一致したファクト名の使用方法

- 4.8.3 拡張モードのアクション・フォームの使用方法

- 4.8.3.1 ルール・デザイナの拡張モード・アクション・オプション

- 4.8.4 拡張モードの集計条件の使用方法

- 4.8.4.1 集計関数の使用

- 4.8.5 拡張モードのルールに関する必知事項

- 4.8.5.1 拡張モード・オプションをクリアする方法

- 4.9 拡張テストの使用

- 4.9.1 拡張テスト・フォーム

- 4.10 ツリー・モードのルールの使用

- 4.10.1 サンプルのPOのXMLインスタンス(要約)

- 4.10.2 ツリー・モードのルール(非拡張モード)

- 4.10.3 拡張ツリー・モードのルール

- 4.10.4 単純ツリー・モードのルールの作成方法

- 4.10.5 拡張ツリー・モードのルールの作成方法

- 4.10.6 ツリー・モードのルールに関する必知事項

- 4.11 日付ファクトの使用、日付関数および有効日の指定

- 4.11.1 現在の日付ファクトの使用方法

- 4.11.2 有効日に関する必知事項

- 4.11.3 Duration、JavaDate、OracleDateおよびXMLDateメソッドの使用方法

- 4.12 式ビルダーの概要

- 4.12.1 式ビルダーの使用方法

- 4.12.2 式の使用に関する必知事項

- 4.13 値セットをルールのオプション値の制約として使用する方法

- 4.13.1 範囲リスト値セットをビジネス条件の制約として使用する方法

- 4.13.2 値リスト値セットをファクト・プロパティの制約として使用する方法

- 4.13.3 値セットを使用してテスト式のオプションを指定する方法

- 4.14 ランタイム・ルールの変更内容のリポジトリからJDeveloperへのインポート

- 4.15 データ・モデルが深い場合のルールのモデル化方法

5 デシジョン表の使用

- 5.1 デシジョン表の使用の概要

- 5.1.1 デシジョン表とは

- 5.1.1.1 デシジョン表の条件に関する必知事項

- 5.1.1.2 デシジョン表のアクションに関する必知事項

- 5.1.1.3 デシジョン表のルールに関する必知事項

- 5.1.2 条件セル値の理解

- 5.1.3 アクション・セル値の理解

- 5.1.4 デシジョン表のループに関する必知事項

- 5.2 デシジョン表の作成

- 5.2.1 デシジョン表の作成方法

- 5.2.2 デシジョン表への条件行の追加方法

- 5.2.3 デシジョン表条件の値セットを使用または指定する方法

- 5.2.4 デシジョン表へのアクションの追加方法

- 5.2.4.1 デシジョン表のアクション・セルの値を設定する方法

- 5.2.4.2 デシジョン表のアクション・セルの選択を解除する方法

- 5.2.5 デシジョン表へのルールの追加方法

- 5.2.6 デシジョン表でのテストの定義方法

- 5.3 デシジョン表の操作の概要

- 5.3.1 デシジョン表の分割操作と圧縮操作

- 5.3.1.1 デシジョン表の移動操作

- 5.3.1.2 デシジョン表のギャップ・チェック

- 5.3.1.3 デシジョン表の競合分析

- 5.3.2 デシジョン表の圧縮または分割方法

- 5.3.3 デシジョン表内の条件のマージまたは分割方法

- 5.3.4 条件セル操作を使用する方法

- 5.3.4.1 デシジョン表内の条件の兄弟セルをマージする方法

- 5.3.4.2 デシジョン表内の条件のセルを分割する方法

- 5.3.4.3 デシジョン表内の条件セルについて考慮されない値を指定する方法

- 5.3.4.4 すべての値セットを選択して条件セルについて考慮されない値を指定する方法

- 5.3.5 デシジョン表のギャップ・チェックの実行方法

- 5.3.6 デシジョン表の手動競合解決の実行方法

- 5.3.7 デシジョン表の自動オーバーライド競合解決ポリシーの設定方法

- 5.3.8 デシジョン表の競合ポリシーの無視の設定方法

- 5.4 Oracle Business Rulesデシジョン表アプリケーションの作成と実行

- 5.4.1 注文承認アプリケーションのソース・ファイルの取得方法

- 5.4.2 注文承認アプリケーションの作成方法

- 5.4.3 注文承認のビジネス・ルール・サービス・コンポーネントの作成方法

- 5.4.4 注文承認のデータ・モデル要素の表示方法

- 5.4.5 注文承認のデータ・モデルに値セットを追加する方法

- 5.4.5.1 CreditScore値セットをデータ・モデルに追加する方法

- 5.4.6 値セットをOrderプロパティおよびCreditScoreプロパティに関連付ける方法

- 5.4.7 注文承認用デシジョン表の追加方法

- 5.4.7.1 デシジョン表にアクションを作成する方法

- 5.4.7.2 デシジョン表のセルの分割とアクションの追加

- 5.4.7.3 デシジョン表内のルールごとにアクションを追加する方法

- 5.4.7.4 デシジョン表の圧縮

- 5.4.7.5 1つの一般ルールによる複数の限定的ルールの置換

- 5.4.7.6 一般ルールの追加

- 5.4.7.7 自動オーバーライド競合解決ポリシーを有効にする方法

- 5.4.8 注文承認のビジネス・ルール検証ログのチェック方法

- 5.4.9 注文承認アプリケーションのデプロイ方法

- 5.4.10 注文承認アプリケーションのテスト方法

- 5.5 Microsoft Excelでのデシジョン表の編集

- 5.5.1 エクスポートされるものの理解

- 5.5.2 デシジョン表をエクスポートする方法

- 5.5.3 編集済デシジョン表をディクショナリにインポートして戻す方法

- 5.5.4 Excelでデシジョン表を編集する方法

- 5.5.4.1 ルールの追加または削除とセルのマージまたは分割

- 5.5.4.2 値セットの追加または削除

- 5.5.4.3 値セットの表示または非表示と説明の編集

- 5.5.4.4 プリファレンスの設定

- 5.5.4.5 簡易または拡張モードの使用方法

- 5.5.4.6 ReadMeワークシートの非表示または表示

- 5.5.4.7 条件セルの編集

- 5.5.4.8 アクションの編集

- 5.5.4.9 式の編集

- 5.5.4.10 アクション式のパラメータの編集

- 5.5.4.11 説明の編集

- 5.5.4.12 自動追加機能の使用方法

- 5.5.4.13 値セット・ワークシートでの値のエイリアス

- 5.5.4.14 値セットと条件の同期

6 デシジョン関数の使用

- 6.1 デシジョン関数の概要

- 6.2 デシジョン関数の使用

- 6.2.1 既存のデシジョン関数を編集する方法

- 6.2.2 入力の順序を変更する方法

- 6.2.3 出力の順序を変更する方法

- 6.2.4 デシジョン関数を編集する方法

- 6.3 ルール・デバッグ用の「ルール起動制限」オプションに関する必須情報

- 6.4 デシジョン関数の引数に関する必須情報

- 6.5 デシジョン関数の「ステートレス」オプションに関する必須情報

7 ビジネス・ルールのテストと検証

- 7.1 概要

- 7.1.1 テスト機能のコンポーネント

- 7.2 JDeveloperでのルールのテスト

- 7.2.1 テスト・スイートとケースの作成および管理方法

- 7.2.2 テスト・テンプレートの作成方法

- 7.2.3 テスト・スイートまたはケースの実行方法

- 7.2.4 テスト・テンプレートからの非定型テストの実行方法

- 7.2.5 特定のデシジョン関数に対するテストの実行方法

- 7.3 Business Process Composerでのルールのテスト

- 7.4 SOAコンポーザでのルールのテスト

- 7.4.1 テスト・スイートとケースの作成および管理方法

- 7.4.2 テスト・テンプレートの作成方法

- 7.4.3 テスト・スイートまたはケースの実行方法

- 7.4.4 テスト・テンプレートからの非定型テストの実行方法

- 7.4.5 特定のデシジョン関数に対するテストの実行方法

- 7.5 ルール関数を使用したデシジョン関数のテスト

- 7.5.1 デシジョン関数のテストに関する必知事項

- 7.6 SOAコンポーザでのデシジョン・サービスのテスト

8 スタンドアロン(非SOA/BPM)シナリオでのルールの使用

- 8.1 リポジトリからのディクショナリのロード

- 8.2 ルール・ディクショナリの実行

- 8.3 Rules SDKデシジョン・ポイントAPIの概要

- 8.3.1 デシジョン・ポイントAPIの使用

- 8.3.2 レンタカー・サンプル・アプリケーションの入手方法

- 8.3.3 レンタカー・サンプル・アプリケーションとプロジェクトを開く方法

- 8.4 デシジョン・ポイントで使用するディクショナリの作成

- 8.4.1 デシジョン・ポイントで使用するデータ・モデル要素の作成方法

- 8.4.2 デシジョン・ポイントからコールするデシジョン関数の表示方法

- 8.4.3 デシジョン関数のルールまたはデシジョン表の作成方法

- 8.4.4 デシジョン表を使用したレンタカー・サンプルの使用に関する必知事項

- 8.5 Rules SDKデシジョン・ポイントを使用したJavaアプリケーションの作成

- 8.5.1 デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法

- 8.5.2 事前ロード済のディクショナリでデシジョン・ポイントを使用する方法

- 8.5.3 エグゼキュータ・サービスを使用してデシジョン・ポイントでスレッドを実行する方法

- 8.5.4 デシジョン・ポイント・インスタンスの作成および使用方法

- 8.5.4.1 getInstance()でデシジョン・ポイント・インスタンスを作成するサンプル・コード

- 8.6 レンタカー・サンプルの実行

- 8.6.1 レンタカーのサンプル出力

- 8.7 本番環境でのデシジョン・ポイントの使用に関する必知事項

- 8.8 デシジョン・ポイントとデシジョン・トレースに関する必知事項

- 8.8.1 デシジョン・トレースの使用例

9 ルール対応の非SOA Java EEアプリケーションの作成

- 9.1 等級サンプル・アプリケーションの概要

- 9.2 等級サンプル・アプリケーション用のアプリケーションとプロジェクトの作成

- 9.2.1 等級サンプル・アプリケーション用のFusion Webアプリケーションの作成方法

- 9.2.2 アクセス可能なADF Facesページの開発方法

- 9.2.3 Gradesプロジェクトの作成方法

- 9.2.4 Gradesプロジェクト内でのXMLスキーマの追加方法とJAXBクラスの生成方法

- 9.2.4.1 等級スキーマからJAXB 2.0コンテンツ・モデルを生成する方法

- 9.2.5 Gradesプロジェクト内でのOracle Business Rulesディクショナリの作成方法

- 9.3 等級サンプル・アプリケーション用のデータ・モデル要素とルールの作成

- 9.3.1 等級サンプル・アプリケーション用の値セットの作成方法

- 9.3.2 値セットをファクト・プロパティに関連付ける方法

- 9.3.3 等級サンプル・アプリケーション用のデシジョン表の追加方法

- 9.3.4 デシジョン表にアクションを追加する方法

- 9.3.5 等級サンプル・アプリケーション用のデシジョン表でのルールの追加方法

- 9.3.6 等級サンプル・アプリケーション用のデシジョン関数名の変更方法

- 9.4 Rules SDKコールを含む等級アプリケーションのサーブレットの追加

- 9.4.1 Gradesプロジェクトへのサーブレットの追加方法

- 9.5 等級サンプル・アプリケーション用HTMLテスト・ページの追加

- 9.6 デプロイメントのための等級サンプル・アプリケーションの準備

- 9.6.1 等級サンプル・アプリケーション用のWARファイルの作成方法

- 9.6.2 等級サンプル・アプリケーションへのルール・ライブラリの追加方法

- 9.6.3 等級サンプル・アプリケーションへのMDSデプロイメント・ファイルの追加方法

- 9.6.4 等級サンプル・アプリケーションへのEARファイルの追加方法

- 9.7 等級サンプル・アプリケーションのデプロイと実行

- 9.7.1 等級サンプル・アプリケーションのデプロイ方法

- 9.7.2 等級サンプル・アプリケーションの実行方法

10 Oracle Business RulesとADFビジネス・コンポーネントの使用

- 10.1 Business RulesとADFビジネス・コンポーネントの使用の概要

- 10.1.1 Oracle Business RulesのADFビジネス・コンポーネント・ファクト・タイプ

- 10.1.2 Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ

- 10.1.2.1 ActionType実装のサンプル

- 10.2 ADFビジネス・コンポーネント・ファクトを使用する場合のデシジョン・ポイントの使用

- 10.2.1 ADFビジネス・コンポーネント・ファクトによるデシジョン・ポイントのコール方法

- 10.2.1.1 デシジョン・ポイント・トランザクションの設定

- 10.2.1.2 ランタイム・プロパティの設定

- 10.2.1.3 ADFビジネス・コンポーネント・ルールに使用するinvokeメソッドのコール

- 10.2.1.4 デシジョン・ポイントの起動に関する必知事項

- 10.2.1.5 setInputsメソッドを使用してデシジョン・ポイントを起動するサンプル

- 10.2.1.6 setViewObjectメソッドを使用してデシジョン・ポイントを起動するサンプル

- 10.2.2 Javaデシジョン・ポイント・インタフェースによるデシジョン関数のコール方法

- 10.2.3 ADFビジネス・コンポーネントによるデシジョン関数の構成に関する必知事項

- 10.3 ADFビジネス・コンポーネント・ファクトを使用したBusiness Rulesアプリケーションの作成

- 10.3.1 ADFビジネス・コンポーネント・ファクトを使用するアプリケーションの作成方法

- 10.3.2 Business RulesのADFビジネス・コンポーネント・アプリケーションの作成方法

- 10.3.3 Business Rulesサンプル・アプリケーションのビュー・オブジェクト・チューニングの更新方法

- 10.3.4 Oracle Business Rulesのディクショナリの作成方法

- 10.3.5 デシジョン・ポイント・ディクショナリ・リンクの追加方法

- 10.3.6 ADFビジネス・コンポーネント・ファクトをインポートする方法

- 10.3.6.1 プロパティを表示不可能としてマーク付けする方法

- 10.3.6.2 DepartmentsViewとEmployeesViewの別名を設定する方法

- 10.3.7 外部マネージャ・ルールセットの追加および実行方法

- 10.3.7.1 外部マネージャ・ルールセットおよびデシジョン関数の追加方法

- 10.3.7.2 ActionTypeのJava実装クラスの作成方法

- 10.3.7.3 メッセージ・アクションのJavaファクトをインポートする方法

- 10.3.7.4 マネージャ検索ルールの追加方法

- 10.3.7.5 外部マネージャ・ファインダ・クラスの追加方法

- 10.3.7.6 ローカル・ディクショナリ・アクセスのADF META INFの更新方法

- 10.3.7.7 MDSでアクセス可能な場所に定義/ディクショナリをコピーする方法

- 10.3.7.8 外部マネージャ・ファインダをチェックするプロジェクトの作成および実行方法

- 10.3.8 部門マネージャ・ルールセットの追加および実行方法

- 10.3.8.1 部門マネージャ・ファインダ・ルールセットの追加方法

- 10.3.8.2 部門マネージャ・ファインダ・ルールセットの検索ルールの追加方法

- 10.3.8.3 従業員取消しルールセットの追加方法

- 10.3.8.4 部門マネージャ検索デシジョン関数の追加方法

- 10.3.8.5 部門マネージャ・ファインダJavaクラスの追加方法

- 10.3.8.6 MDSでアクセス可能な場所にディクショナリをコピーする方法

- 10.3.8.7 マネージャ検索ルールをチェックするプロジェクトの作成および実行方法

- 10.3.9 従業員昇給ルールセットと従業員取消しルールセットの追加および実行方法

- 10.3.9.1 昇給ルールセットの追加方法

- 10.3.9.2 昇給ActionTypeのJava実装クラスの作成方法

- 10.3.9.3 昇給アクションのJavaファクトをインポートする方法

- 10.3.9.4 12年昇給ルールの追加方法

- 10.3.9.5 従業員昇給デシジョン関数の追加方法

- 10.3.9.6 従業員昇給Javaクラスの追加方法

- 10.3.9.7 MDSでアクセス可能な場所にディクショナリをコピーする方法

- 10.3.9.8 昇給ルールをチェックするプロジェクトの作成および実行方法

11 SOAアプリケーションでのデシジョン・コンポーネントの使用

- 11.1 デシジョン・コンポーネントの概要

- 11.2 デシジョン・コンポーネントの使用

- 11.2.1 デシジョン・コンポーネント・メタデータの使用

- 11.2.2 デシジョン関数を公開するデシジョン・コンポーネントの使用

- 11.2.3 デシジョン・コンポーネントとのステートフルな相互作用の使用

- 11.2.4 デシジョン・コンポーネントとのステートフルな相互作用に関する必知事項

- 11.3 デシジョン・サービスのアーキテクチャ

12 実行時のOracle Business RulesとのOracle SOAコンポーザの使用方法

- 12.1 Oracle SOAコンポーザの概要

- 12.1.1 セッションの作成とパブリッシュ

- 12.1.1.1 Oracle Business Rulesディクショナリの変更のパブリッシュ

- 12.1.1.2 ブックマークの作成

- 12.1.1.3 ディクショナリ設定の確認

- 12.1.2 Oracle SOAコンポーザのユーザー認証の使用

- 12.1.3 SOAコンポーザのアクセス制御およびユーザー認証に関する必知事項

- 12.2 アクセシビリティ・オプションの設定

- 12.2.1 ログイン前にアクセシビリティ機能を設定する方法

- 12.2.2 ログイン後にアクセシビリティ・オプションを設定する方法

- 12.3 Oracle Business Rulesディクショナリのオープンおよび表示

- 12.3.1 ルールセットを表示および編集する方法

- 12.3.1.1 SOAコンポーザでの動詞ルールの追加方法

- 12.3.2 値セットを表示および編集する方法

- 12.3.3 グローバルを表示および編集する方法

- 12.3.4 ビジネス・フレーズを表示および編集する方法

- 12.3.5 テストを表示および編集する方法

- 12.3.6 エクスプローラを表示する方法

- 12.3.7 ファクトを表示および編集する方法

- 12.3.8 デシジョン関数を表示する方法

- 12.3.9 リンク先ディクショナリ名を表示する方法

- 12.3.10 Oracle Business Rulesディクショナリでディクショナリ・リンクを使用する方法

- 12.3.11 変換を表示および編集する方法

- 12.4 ディクショナリの編集のスタート・ガイド

- 12.4.1 Oracle SOAコンポーザにおけるローカライズされた数値書式に関する必知事項

- 12.4.2 ルール要素の切取り/コピーおよび貼付けに関する必知事項

- 12.4.3 Oracle Business Rulesディクショナリでグローバルを編集する方法

- 12.4.4 Oracle Business Rulesディクショナリで値セットを編集する方法

- 12.4.5 Oracle Business Rulesディクショナリでデシジョン関数を編集する方法

- 12.4.6 Oracle Business Rulesディクショナリ・エディタの宣言コンポーネントに関する必知事項

- 12.4.7 Oracle Business Rulesディクショナリ・エディタのタスク・フローに関する必知事項

- 12.5 Oracle Business Rulesディクショナリでのルールの編集

- 12.5.1 「ルールセット」タブの使用方法

- 12.5.2 Oracle Business Rulesディクショナリでルールを編集する方法

- 12.5.3 ルールの追加方法

- 12.5.4 ルールの削除方法

- 12.5.5 ルールの詳細設定を表示および編集する方法

- 12.5.6 ルール条件の追加方法

- 12.5.7 ルール条件の削除方法

- 12.5.8 ルール条件の変更方法

- 12.5.9 ルール・アクションの追加方法

- 12.5.10 ルール・アクションを削除する方法

- 12.5.11 ルール・アクションを変更する方法

- 12.5.12 拡張モードのルールの使用方法

- 12.5.12.1 拡張モード・オプションの使用

- 12.5.13 拡張テストの使用方法

- 12.5.14 ツリー・モードのルールの使用方法

- 12.5.15 Oracle Business Rulesエディタの宣言コンポーネントに関する必知事項

- 12.5.16 Oracle Business Rulesディクショナリ・エディタの宣言コンポーネントに関する必知事項

- 12.5.17 Oracle Business Rulesディクショナリ・エディタのタスク・フローに関する必知事項

- 12.6 Oracle SOAコンポーザのブラウザ・ウィンドウの使用

- 12.6.1 式ビルダー

- 12.6.2 条件ブラウザ

- 12.6.3 「日付」ブラウザ

- 12.6.4 「右のオペランド」ブラウザ

- 12.7 Oracle Business Rulesディクショナリのデシジョン表の編集

- 12.7.1 デシジョン表の追加

- 12.7.2 デシジョン表への条件行の追加

- 12.7.3 デシジョン表へのアクションの追加

- 12.7.4 デシジョン表へのルールの追加

- 12.7.4.1 デシジョン表のセルの編集

- 12.7.4.2 デシジョン表でのルールの順序の操作

- 12.7.5 デシジョン表でのルールの削除

- 12.7.6 デシジョン表でのテストの定義

- 12.7.7 デシジョン表の分割および圧縮

- 12.7.8 デシジョン表での欠落しているルールのチェック

- 12.7.9 デシジョン表での競合解決の実行

- 12.7.10 行から列への切替

- 12.7.11 デシジョン表での拡張モード・オプションの使用

- 12.7.12 デシジョン表の削除

- 12.7.13 Microsoft Excelでのデシジョン表の編集

- 12.7.13.1 エクスポートされるものの理解

- 12.7.13.2 デシジョン表をエクスポートする方法

- 12.7.13.3 デシジョン表をディクショナリにインポートする方法

- 12.7.13.4 Excelでデシジョン表を編集する方法

- 12.7.14 ルール・テスト変数に関する必知事項

- 12.8 Oracle Business Rulesディクショナリの比較およびマージ

- 12.8.1 ディクショナリ間の差異を調べる方法

- 12.9 Oracle Business Rulesのリソース名のローカライズ

- 12.9.1 Oracle Business Rulesコンポーネントのエイリアスのローカライズ方法

- 12.10 Oracle JDeveloperのルール・ディクショナリと実行時のディクショナリの更新の同期

- 12.11 Oracle Business Rulesディクショナリの検証と診断

- 12.11.1 「検証ログ」タブの理解

- 12.11.2 「診断」タブの理解

- 12.11.3 「履歴センター」タブの理解

- 12.11.4 「ログの保存」タブの理解

- 12.12 タスクの操作

- 12.12.1 タスク・メタデータの表示方法

- 12.12.2 タスクまたはAMXのルール・メタデータを構成する方法

- 12.12.2.1 イベント・ドリブンの設定の構成

- 12.12.2.2 データ・ドリブンの設定の構成(ルールまたは条件)

付録

A Oracle Business Rulesのファイルと制限事項

- A.1 ルール・デザイナの命名規則

- A.1.1 ルールセットのネーミング

- A.1.2 ディクショナリのネーミング

- A.1.3 別名のネーミング

- A.1.4 XMLスキーマのターゲット・パッケージのネーミング

B Oracle Business Rulesの組込みクラスと関数

- B.1 文字列のクラス

- B.2 リストのクラス

- B.3 数値のクラス

- B.4 時間と期間のクラス

- B.5 その他のクラス

- B.6 関数

C Oracle Business Rulesに関するよくある質問

- C.1 JavaオブジェクトをファクトとしてアサートしてからModifyアクションを使用せずに変更すると、ルールが起動しないのはなぜですか。

- C.2 Oracle Business Rules RL LanguageとJavaの相違はなんですか。

- C.3 RuleSessionでは並行性と同期化はどのように処理されますか。

- C.3.1 RuleSessionのサンプル共有オブジェクト

- C.3.2 RuleSessionのサンプル・プロデューサ・コード

- C.3.3 RuleSessionのサンプル・コンシューマ・コード

- C.4 自己結合を正しく表現するにはどうすればよいですか。

- C.4.1 ファクトFのすべての組合せの検索サンプル

- C.4.2 ファクトFの組合せの検索サンプル

- C.4.3 高速の完全比較サンプル

- C.5 Oracle Business Rulesではプロパティ変更リスナーをどのように使用しますか。

- C.6 Oracle Business Rulesでデシジョン・サービスを使用する場合にどのような制限がありますか。

- C.7 ルールにJavaコードを挿入するにはどうすればよいですか。

- C.8 BPELでデシジョン・サービスにJavaベース・ファクトを使用することはできますか。

- C.9 BPELデシジョン・サービスでデバッグ機能を有効化するにはどうすればよいですか。

- C.10 Oracle Business Rulesでバージョニングをサポートするにはどうすればよいですか。

- C.11 ルールおよびデシジョン表で優先度を使用する場合、優先度の順序はどうなりますか。

- C.12 xsd:string入力済要素を持つXMLスキーマをタイプJAXBElementとしてインポートするのはなぜですか。

- C.13 Javaクラスに加えた変更がデータ・モデルに反映されないのはなぜですか。

- C.14 Rules SDKを使用して式にNULLを含めるにはどうすればよいですか。

- C.15 ディクショナリを格納するためのリポジトリとしてWebDAVがサポートされていますか。

- C.16 ルール・デザイナによるソース・コード制御システムの使用

D Oracle Business Rulesのトラブルシューティング

- D.1 非表示のgetterメソッドとsetterメソッド

- D.2 プロパティのsetterのみを使用したJavaクラス

- D.3 実行時のNoClassDefFoundエラー

- D.4 RL固有のキーワード・ネーミング競合エラー

- D.5 ビジネス・ルール・サービス・ランタイムからのjava.lang.IllegalAccessError

- D.6 JAXB 1.0ディクショナリとRLのMultipleInheritanceException

- D.7 アンダースコアを持つXMLスキーマでJAXBコンパイルに失敗するのはなぜですか。

- D.8 デシジョン・サービスの入力と出力の要素タイプはどのように制限されますか。

- D.9 デシジョン・サービスの入力と出力のスキーマはどのように制限されますか。

- D.10 インポートしたファクト・タイプ内のJava予約名はどのように処理したらよいですか。

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

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

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

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

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

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

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

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

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

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

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

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

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

はじめに

このマニュアルでは、Oracle Business Rulesを設計する方法について説明します。

対象読者

Oracle Business Process Managementによるビジネス・ルールの設計は、アプリケーション・プログラマ、システム管理者および次の作業を行うその他のユーザーを対象としています。

- Oracle Business Rulesプログラムの作成

- 既存のOracle Business Rulesプログラムの変更またはカスタマイズ

- ルール・プログラムを使用したJavaアプリケーションの作成

- 既存Javaアプリケーションへのルール・プログラムの追加

このドキュメントを使用するには、Java言語プログラミングの実務に関する基本的な知識が必要です。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティへの取り組みについては、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)にアクセスしてください。

Oracleサポートへのアクセス

サポートを購入したオラクル社のお客様は、My Oracle Supportを介して電子的なサポートにアクセスできます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info、聴覚に障害があるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

関連ドキュメント

詳細は、オラクル社の次の資料を参照してください。

- Oracle Business Process Management Rulesランゲージ・リファレンス

- Oracle Business Process Managementを使用したプロセスの管理とモニタリング

- 『Oracle SOAスイートでのSOAアプリケーションの開発』

表記規則

このマニュアルでは次の表記規則を使用します。

表記規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

このガイドで説明する新機能

この項では、Oracle Fusion Middlewareリリース12c (12.2.1.1)リリースにおけるOracle Business Rulesの新機能と製品の重要な変更点の概要を示します。

このリリースに追加された新機能はありません。このリリースのガイドには重要なバグ修正が含まれています。

使用しているスキンによっては、このガイドで示される画面は実装状態と異なる場合があります。相違点は軽微なものです。

機能とその使用方法の詳細は、このガイドの参照先を確認してください。このドキュメントは、『Oracle Fusion Middleware Oracle Business Rulesユーザーズ・ガイド』の新版になります。

既知の問題のリスト(リリース・ノート)については、「Oracle SOA製品の既知の問題」(http://www.oracle.com/technetwork/middleware/soasuite/documentation/soaknowissues12211-2873928.html)を参照してください。

1 Oracle Business Rulesの概要

この章では、ビジネス・ルールの概念と、Oracle Business Rulesのランタイム要素およびデザインタイム要素(ファクト、値セット、ルールセット、デシジョン表、Oracle BP Composer、Oracle SOAコンポーザなど)について説明します。Oracle Business Rules Engineのアーキテクチャについても説明します。

この章の内容は次のとおりです。

- Oracle Business Rulesの概要

- Oracle Business Rulesの形式の理解

- Oracle Business Rulesのランタイム要素とデザインタイム要素

- Oracle Business Rules Engineのアーキテクチャ

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

- Oracle Business Process Management Rulesランゲージ・リファレンス

- Oracle Fusion Middleware Oracle Business RulesのJava APIリファレンス

- 『Oracle SOAスイートでのSOAアプリケーションの開発』

1.1 Oracle Business Rulesの概要

Oracle Business Rulesによって、ビジネス・アナリストおよび開発を行わない人々が、プログラミングを行うことなくビジネス・ロジックを簡単に定義および変更できるようになり、プロセスおよびアプリケーションの柔軟性が高まります。Oracle Business Rulesでは、統合JDeveloperデザイン・プラットフォームを活用し、関連するプロセスまたはアプリケーションの外部でビジネス・ルールをメンテナンスすることで、迅速かつ容易なルール変更が可能になり、以降の再デプロイ・コストが削減されます。

図1-1 Oracle Business Rules

Oracle Business Rulesを使用することで、ポリシー、計算および推論を自動化するとともに、基礎となるアプリケーション・コードからルール・ロジックを分離できます。これにより、より迅速なルール・メンテナンスが可能になり、ビジネス・アナリストは、プログラマによる支援を受けたりビジネス・プロセスを中断させることなく、ルール・ロジックを変更できるようになります。

ビジネス・アナリストは、Process Composerでルールをモデル化し、Process Studioでプロセスをさらに調整して完成できます。

IT開発者はBPM Studioを使用し、既知のデータ型、サービス、およびヒューマン・タスクの実装が含まれているそのビジネス・カタログと対話します。その後、開発者はプロジェクトを作成し、それをビジネス・カタログに公開します。そして、ビジネス・アナリストまたはビジネス・ユーザーはProcess Composerを使用して、ビジネス・カタログ内のプロジェクトをチェックアウトし、既存のプロセス・モデルに変更を加えることができます。

少数のルールを使用する単純な計算のモデル化を必要としているユーザーがいる一方で、複雑な意思決定のためにルールを使用しており、デシジョンのモデル化の問題に対処する方法を必要としているユーザーもいます。

図1-2 Oracle Business Rulesのコンポーネント

Oracle Business Rulesには、エンタープライズ全体にわたるルールの検出、ガバナンス、バージョニング、トレース機能および可用性のためのルール・エディタ、ルール・ブラウザ、ルール・エンジンおよびルール・リポジトリが含まれています。ビジネス・ルールは、ビジネス・ルール・エディタを使用して定義され、一元化されたビジネス・ルール・リポジトリに格納されて管理されます。モデラー内の事前定義済ビジネス・プロセス・ルールを参照できます。ビジネス・プロセス・モデル内のビジネス・ルール・アクティビティは、デシジョン・サービスに変換され、それによって実行可能ビジネス・プロセス内のビジネス・ルール・エンジンが起動されます。ビジネス・ユーザーは、ビジネス・プロセスを再デプロイしたり再実装することなく、直感的なWebブラウザ・インタフェースを使用してその場でこれらのビジネス・ポリシーを変更できます。

1.1.1 Oracle Business Rulesを使用する理由

Oracle Business Rulesは、迅速性、ビジネス制御および透過性の要件に対応する高性能かつ軽量なビジネス・ルール製品です。

ビジネス・ルールとは、ビジネス・ポリシーを記述した文、または重要なビジネス・デシジョンを記述した文のことです。たとえば、ビジネス・ルールには次のものが含まれます。

- 消費ポリシーや承認マトリックスなどのビジネス・ポリシー
金融機関であれば、次のようなビジネス・ルールを使用します。

- 有効な構成や規制上の要件などの制約
たとえば、レンタカー会社であれば、次のようなビジネス・ルールを使用します。

- 割引や割増などの計算

- 顧客の額に基づくオファーなどの判断機能
航空会社であれば、次のようなビジネス・ルールを使用します。

これらの例は、それぞれ個別のビジネス・ルールを示しています。実際には、Oracle Business Rulesを使用して、多数のビジネス・ルールを組み合せたり、さらに複雑なテストを使用できます。

たとえば、レンタカー会社の例では、ルールにDriver Age Ruleという名前を指定できます。Driver Age Ruleなどのルールは、従来、アプリケーション・コードに組み込まれ、Javaアプリケーションでは、次のように表示されていました。

public boolean checkDriverAgeRule (Driver driver) {
boolean declineRent = false;
int age = driver.getAge();
if(  age < 21 ) {
declineRent = true;
}
return declineRent;
}

技術的な知識のないユーザーにとっては、このようなコードを理解し、変更することは困難な場合があります。たとえば、レンタカー会社がポリシーを変更し、Driver Age Ruleを使用して18歳未満のすべての運転者を拒否するとします。多くの本番環境では、開発者がアプリケーションを変更し、変更したアプリケーションを再コンパイルして再デプロイする必要があります。ビジネス・アナリストが、ほとんどプログラマの援助なしに、ビジネス・ルールで表現されたポリシーを変更できるため、このプロセスは簡素化されます。Oracle Business Rulesを使用するアプリケーションでは、新しい政府規制や、社内プロセスの改善、顧客およびサプライヤの関係の変化にアプリケーションが対応できるよう、継続的な変更がサポートされます。

1.1.2 Oracle Business Rulesの用語の理解

ビジネス・ルールには、次のものを含める必要があります。

- ルールセット: ルールの結果を決定する条件またはアクションのセット。

- ファクト: ルールセットによって使用されるデータ・オブジェクト。

- デシジョン関数: ルールを実行するコードへの参照。

また、ビジネス・ルールには、次のものを含める場合があります。

- 関数: ルールセット内で呼び出すことができる関数。このタイプの関数の1つの例は、データ・オブジェクトを初期化するものです。

- グローバル: ルールセット内で使用されるデータ・オブジェクト。定数の場合もあります。

- 値セット: 条件によって使用される値のリストまたは範囲。

- リンク: 他のビジネス・ルール・ディクショナリへのリンク。

後続の項で、これらのコンポーネントについて詳しく説明します。

1.1.2.1 ファクトおよび値セットとは

Oracle Business Rulesでは、ルールは、ファクト・タイプに関して記述します。各ファクトはファクト・タイプのインスタンスです。ルールを作成する前に1つ以上のファクト・タイプをインポートまたは作成する必要があります。ただし、動詞ルールを使用する場合は、実行可能ルールを定義するまでファクト・タイプのモデル化を遅延することもできます。

Oracle Business Rulesでは、FactTypeはデータ・モデルにおけるタイプ定義であり、ファクトはそのタイプのインスタンスです。たとえば、ルールはファクト・タイプに関して記述されます。Oracle Business Rulesランタイム、またはRL Languageを記述する開発者は、RL Languageのassert関数を使用してファクトのインスタンスをOracle Business Rulesに追加します。ルール・デザイナでは、XMLスキーマ、Javaクラス、Oracle RL定義、ADFビジネス・コンポーネント・ビュー・オブジェクトに基づいて、様々なファクト・タイプを定義できます。

値セットを作成し、指定したタイプの値リストまたは値範囲を定義できます。作成した値セットは、一致するタイプのファクト・プロパティに関連付けることができます。Oracle Business Rulesでは、定義した値セットを使用して、ルールまたはデシジョン表内のファクト・プロパティに関連した値に対する制約が指定されます。また、値セットを使用して、変数の初期値、関数の戻り値および関数の引数の値に対して制約を指定することもできます。

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

- ファクトと値セットの使用

- Oracle Business Rules Engineのアーキテクチャ

1.1.2.2 ルールセットとは

ルールセットは、IF-THENルールおよびデシジョン表に使用されるOracle Business Rulesコンテナです。ルールセットは、ルールおよびデシジョン表に対してJavaパッケージに似たネームスペースを提供します。またルールセットを使用して、ルールの起動を部分的に順序付けることも可能です。

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

- ルールセットとルールの使用

- Oracle Business Process Managementのルール・ランゲージ・リファレンスのルールの起動の順序付けに関する項

1.1.2.3 ディクショナリとは

ディクショナリは、ファクト、ビジネス・フレーズ、関数、グローバル、値セット、リンク、デシジョン関数およびルールセットに使用するOracle Business Rulesコンテナです。また、アプリケーションのルールセットおよびデータ・モデルが格納されているXMLファイルです。ディクショナリは他のディクショナリにリンクできます。Oracle JDeveloperでは、Oracle Business Rulesディクショナリが.rulesファイルで作成されます。必要な数のディクショナリを作成できます。1つのディクショナリに多数のルールセットを含めることができます。詳細は、「ディクショナリとディクショナリ・リンクの概要」を参照してください。

1.1.2.4 グローバルとは

グローバルは、ビジネス・ルール内のどの場所からでもアクセスできる変数または定数です。グローバルを作成するときには、ビジネス・ユーザーがルール・ロジックに触れることなくルールの動作を変更できるようにする必要があります。

1.1.2.5 デシジョン関数とは

デシジョン関数は、JavaまたはSOAから(SOA/BPMコンポジット・アプリケーションから、またはコンポジット・アプリケーション内のコンポーネントから)ルールを起動するための規定を提供します。規定には、入力ファクト・タイプ、実行するルールセットおよび出力ファクト・タイプが含まれます。詳細は、「デシジョン表の使用」を参照してください。

1.1.2.6 デシジョン・ポイントとは

Oracle Business Rules SDK (Rules SDK)によってAPIが提供されます。このAPIを使用して、Oracle Business Rulesディクショナリ内のルール(およびディクショナリのすべてのコンテンツ)にアクセス、作成、変更および実行するアプリケーションを作成できます。Rules SDKは、Javaアプリケーションからルールまたはデシジョン表にアクセスおよび実行するデシジョン・ポイントAPIを提供します。詳細は、「スタンドアロン(非SOA/BPM)シナリオでのルールの使用」を参照してください。

1.1.2.7 ビジネス・フレーズとは

ビジネス・フレーズとは、動詞ルールに対するテストおよびアクションの作成に使用するボキャブラリ要素です。動詞ルールを記述する際は、条件、ファクト、グローバルおよび他のディクショナリ要素から自動的に導出されるビジネス・フレーズのセットが、テストおよびアクションに含めるために使用できるようになります。独自のビジネス・フレーズを定義できます。

ビジネス・フレーズは一般的なルールでは使用されません。

1.2 Oracle Business Rulesの形式の理解

Oracle Business Rulesでは、ルールの作成に複数の方法が用意されています。ルールは、異なる方法(IF/THENルールとして、およびデシジョン表として)でモデル化できます。

IF/THENルール(または単なるルール)の記述方法には、一般的なルールとしてと動詞ルールとしての2つがあります。

- 一般的なルールでは、擬似コード言語を使用して、ルール・ロジックを表します

- 動詞ルールでは、自然言語文を使用してルール・ロジックを表します

- デシジョン表は、スプレッドシートのような形式で表される複数の関連したルールです。

ルールおよびデシジョン表は、ファクト・タイプおよびプロパティに関して記述します。「デシジョン表」を参照してください。ファクト・タイプは、Javaクラス、XMLスキーマ、Oracle ADFビジネス・コンポーネント・ビュー・オブジェクトからインポートされることもあれば、ルール・デザイナで作成されることもあります。ファクト・プロパティは、名前、値、データ型およびオプションの値セットを持っています。値セットは、データ型の値空間を、デシジョン表、選択リストおよびデザインタイムの検証に使用できる値または範囲に分割します(「ファクトおよび値セットとは」を参照)。

動詞ルールのテストおよびアクションは、導出されたビジネス・フレーズおよびユーザー定義のビジネス・フレーズを使用して作成できます。導出されるビジネス・フレーズは、ファクト、グローバルおよびディクショナリのその他の情報を使用して自動的に作成されますが、ユーザー定義のフレーズは、明示的に作成して導出されたフレーズを補うことができます。さらに、ユーザー定義のフレーズは、事前作成することも、動詞ルールの構成時に必要に応じて作成することもできます。

ルールおよびデシジョン表を、ルールセットと呼ばれるOracle Business Rulesオブジェクトにグループ化します(「ルールセットとは」を参照)。

1つ以上のルールセット、それらのファクトおよび値セットを、ディクショナリと呼ばれるOracle Business Rulesオブジェクトにグループ化します(「ディクショナリとは」を参照)。

詳細は、「Oracle Business Rulesのランタイム要素とデザインタイム要素」を参照してください。

1.2.1 ルール

ルールは、条件を評価するためと、条件を満たした(trueに評価される)ときのアクションを指定するために使用されます。

ルールは、次の2つの異なるパラダイムを使用してモデル化できます。

- 一般的なルール: 擬似コード言語を使用して、ルール・ロジックを表します。

- 動詞ルール: 自然言語文を使用して、話し言葉に似たドメイン固有文でルール・ロジックを表現します。「動詞ルールと一般的なルールの違い」を参照してください。

ルールはif-then構造に従い、次の部分で構成されます。

- IF部分: 条件またはパターン一致(「ルール条件とは」を参照)

- THEN部分: アクションのリスト(「ルール・アクションとは」を参照)

1.2.1.1 ルール条件とは

ルールのIF部分は、ファクト・タイプを参照する条件式で構成されています。

たとえば、一般的なルールの場合は次のようになります。

Rental_application.driver age < 21の場合

一般的なルールの条件式では、より小さい比較を使用してビジネス条件(Rental_application.driver age)が数値21と比較されます。

動詞ルールの場合は次のようになります。

IF rental car driver is an underage driver

動詞ルール条件は、1つ以上の論理テストを指定できるビジネス・フレーズです。(「ビジネス・フレーズとは」を参照)。

ルール条件は、ファクトの組合せで条件式がtrueになるたびにルールをアクティブにします。ルール条件はRules Engine内の使用可能なファクト全体に対する問合せのようなものであり、問合せから戻される行のそれぞれに対してルールがアクティブになります。

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

- ファクトと値セットの使用

- ルールセットとルールの使用

- Oracle Business Process Managementのルール・ランゲージ・リファレンスのルール条件に関する項

1.2.1.2 ルール・アクションとは

ルールのTHEN部分には、ルールの起動時に実行されるアクションが含まれています。ルールはアクティブ化され、優先度など競合解決メカニズムを使用して他のルールのアクティブ化の中から選択された後、起動されます。

ルールはいくつかの種類のアクションを実行することがあります。ファクトを追加、変更または削除するアクションがあります。また、あるアクションではJavaメソッドを実行したり、関数を実行してファクトのステータスを変更したり、ファクトを作成できます。

ルールは、同時ではなく順番に起動します。ルール・アクションによってルールのアクティブ化設定が変更され、どのルールが次に起動されるのかが変更される場合があることに注意してください。

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

- ルールの起動とルール・セッション

- ルールセットとルールの使用

- Oracle Business Process Managementのルール・ランゲージ・リファレンスのルールの起動の順序付けに関する項

1.2.1.3 動詞ルールと一般的なルールの違い

動詞ルールでは、擬似自然言語文を使用してルール・ロジックを表すことができます。それらによって、話し言葉に似たドメイン固有文を使用してルールを記述できます。

動詞ルールは、ビジネス・フレーズと緊密に連携し、それらによって自然言語のテストおよびアクションを作成するためのボキャブラリが提供されます。「ビジネス・フレーズとは」を参照してください。

たとえば、次の例に示す一般的なルール・テストの場合:

IF
all of the following are true
policy is a policy
policyScore.type == Score Type.Policy
policyScore.id == policy.id
car is a Car
carScore is a Score Tracker
carScore.type == Score Type.Car
carScore.id == car.id
customer is a Customer
customerScore is a Score Tracker
customerScore.type == Score Type.Customer
customerScore.id == customer.id
score of a car == carScore.score
score of customer == customerScore.score
score of policy = policyScore.score

THEN
assign new BigDecimal var = newBigDecimal((1+((2-((customerScore + carScore + policyScore)/150))/100))*(Lower Threshold))
assign new double premium = var.setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue()

この同じテストの動詞ルール表現は、次のようにすることができます。

IF
ready to calculate premium
THEN
calculate premium base on score of customer, score of policy and score of car

ready to calculate premium、scoreなどのビジネス・フレーズは、条件に対するロジックを詳しく示しています。

動詞ルールはトップダウンまたはボトムアップなど自分のスタイルに合せた方法で記述できます。

たとえば、まだ定義していないビジネス・フレーズを使用して動詞ルールを記述できます。テストおよびアクションのロジックを表す動詞ルールを作成したら、ビジネス・フレーズの特性を定義できます。

導出されたビジネス・フレーズを提供したシステムを使用して動詞ルールを作成することもできます。既存の条件、ファクト、グローバルおよび他のディクショナリ要素に基づいて自動的に作成されるビジネス・フレーズもあります。

また、必要なビジネス・フレーズを最初にすべて定義して、動詞ルールのテストおよびアクションでそれらを使用することで、ボトム・アップ形式を使用して動詞ルールを記述できます。

詳細は、「ルールセットとルールの使用」を参照してください。

1.2.2 デシジョン表

デシジョン表は、多数のプロパティ値の組合せ分析に多数のルールが必要な場合の、よりコンパクトで直感的な代替ビジネス・ルール形式です。デシジョン表を使用すると、すべての組合せをカバーし、また競合する組合せが2つとしてない、一連のルールを作成できます。

デシジョン表はif-thenルールと機能的に同等ですが、特定の状況ではデシジョン表が理想的であることがわかります。

- 複雑度
デシジョン表は、複雑なルールを簡素化します。複数のルールがあり、それらにそれぞれ複数の条件およびアクションがある場合、デシジョン表によってそれらの使用が大幅に簡単になります。

- 競合の解決
デシジョン表には、競合している条件があるかどうかが示されます。

- ギャップ分析
デシジョン表を分析して、一部の条件が収容されていないかどうか判別できます。

詳細は、「デシジョン表の使用」を参照してください。

1.3 Oracle Business Rulesのランタイム要素とデザインタイム要素

Oracle Business Rulesでは、ビジネス・ルールをデシジョン・コンポーネントとして、またはJavaアプリケーションのライブラリとして使用するためのサポート機能が用意されています。デシジョン・コンポーネントは、ルールおよびルールセットを、複数のビジネス・プロセスから起動できる再利用可能なサービスとして公開するメカニズムです。

Oracle SOA SuiteまたはOracle BPM Suiteでルールを作成して使用したり、ルールを作成してアプリケーションに統合できるように、Oracle Business Rulesには次のランタイム要素およびデザインタイム要素が用意されています。

- SOAコンポジット・アプリケーションでのデシジョン・コンポーネント(Business Rules)

- Java EEアプリケーションにおけるOracle Business RulesのRules Engineの使用

- Oracle Business Rules RL Language

- Oracle Business Rules SDK

- ルール・デザイナ

- Oracle SOA Composerアプリケーション

- BP Composerの使用

1.3.1 SOAコンポジット・アプリケーションでのデシジョン・コンポーネント(Business Rules)

Oracle SOA Suiteには、Oracle Business Rulesをサポートするデシジョン・コンポーネントのサポート機能が用意されています。デシジョン・コンポーネントは、ルールおよびルールセットを、複数のビジネス・プロセスから起動できる再利用可能なサービスとして公開するメカニズムです。

デシジョン・コンポーネントは、コンポジット内で使用でき、かつBPELコンポーネントに接続できるSCAコンポーネントです。それ以外に、デシジョン・コンポーネントはヒューマン・ワークフローでのメディエータおよび拡張ルーティング・ルールの動的ルーティング機能に使用されます。

Oracle Business Rules Rules Engine (Rules Engine)は、ルールをファクトに効率的に適用してルールを定義および処理するSOAビジネス・ルール・サービス・エンジンを使用したSOAコンポジット・アプリケーションのサービス・エンジン・コンポーネントで使用可能です。

詳細は、「Oracle Business Rules Engineのアーキテクチャ」を参照してください。

1.3.2 Java EEアプリケーションにおけるOracle Business RulesのRules Engineの使用

The Rules Engineは、Java EEアプリケーション(非SOA)で使用するライブラリとして使用可能です。Rules Engineにより、ルールがファクトに効率的に適用され、ルールが処理されます。Rules Engineは、Oracle Business Rules RL Language (RL Language)と呼ばれるJavaに似た本番ルール言語を定義し、言語処理エンジン(推論エンジン)を提供し、デバッグのサポート・ツールを提供します。

ルール・デザイナを使用することで、ビジネス・ルールをアプリケーション・コードから分離でき、グラフィカル・ツールを使用してビジネス・ポリシーをすばやく変更できるようになります。Rules Engineでは、ビジネス・ルールが評価されてデシジョンまたはファクトが返され、それらがビジネス・プロセスで使用されます。

ルール対応Javaアプリケーションでは、ルール・プログラムをロードして実行できます。ルール対応アプリケーションは、ファクト(JavaオブジェクトまたはXML文書の形式でアサートされたもの)およびルールをRules Engineに渡します。ルール対応Javaアプリケーションで実行されるRules Engineは、Reteアルゴリズムを使用して、ファクトに適したルールを効率的に起動します。

詳細は、「Oracle Business Rules Engineのアーキテクチャ」および「Oracle Business Rules SDK」を参照してください。

1.3.3 Oracle Business Rules RL Language

Oracle Business Rulesは、Oracle Business Rules RL Language (RL Language)と呼ばれるJavaに似た高レベルな言語をサポートしています。RL Languageは、Oracle Business Rulesプログラムに有効な構文を定義します。RL Languageには、Javaセマンティクスの能力をサポートするルールを定義するための、Javaに似た直感的な構文が含まれており、使いやすい構文をアプリケーション開発者に提供します。RL Languageは、動的に生成したり、ファイルに格納できるテキスト文のコレクションで構成されています。

RL Languageを使用すると、アプリケーション・プログラムではJavaオブジェクトをファクトとしてアサートでき、ルールではオブジェクト・プロパティを参照してメソッドを起動できます。同様に、アプリケーション・プログラムではXML文書またはXML文書の一部をファクトとして使用できます。

プログラマは、すべての機能を備えたルール・プログラミング言語として、RL Languageを直接およびOracle Business Rules SDK (Rules SDK)の一部として使用できます。

ビジネス・アナリストは、ルール・デザイナを使用してルールを操作できます。この場合、ビジネス・アナリストは、RL Languageプログラムを直接表示または記述する必要はありません。詳細は、「ルール・デザイナ」を参照してください。

RL Languageの詳細は、Oracle Business Process Managementのルール・ランゲージ・リファレンスを参照してください。

1.3.4 Oracle Business Rules SDK

Oracle Business Rules SDK (Rules SDK)は、ビジネス・ルール管理機能を提供するJavaライブラリであり、開発者はこれを使用して、ディクショナリにアクセスするルール対応プログラムを作成したり、ルールの追加や既存のルールの変更を行うカスタマイズされたルール・プログラムを作成できます。ルール・デザイナはRules SDKを使用して、明確に定義されたインタフェースにより、ルールおよびデータ・モデルの作成、変更およびアクセスを行います。カスタマ・アプリケーションでは、Rules SDKを使用して、ルールおよびデータ・モデルのコレクションのアクセス、表示、作成、変更を行うことができます。

Rules SDK APIをルール対応アプリケーションで使用して、ルールにアクセスしたり、ルールを作成および変更できます。ルールおよび関連するデータ・モデルは最初、カスタム・アプリケーションで作成されるか、またはルール・デザイナを使用して作成されます。

このマニュアルでは、Oracle Business Rules SDKデシジョン・ポイントAPIについて説明します。デシジョン・ポイントを使用すると、ディクショナリにアクセスし、ディクショナリ内のルールを実行できます。Oracle Business Rules SDK APIの詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

詳細は、「スタンドアロン(非SOA/BPM)シナリオでのルールの使用」を参照してください。

1.3.5 ルール・デザイナ

Oracle JDeveloperのOracle Business Rules Designer(ルール・デザイナ)拡張機能は、ルールを作成および編集できるエディタです。

ルール・デザイナは、ルールの作成および一般的なルールおよびデシジョン表の編集のためのpoint-and-clickインタフェースを提供します。ビジネス・ルールおよびデータ・モデルを直接操作できるため、ルール・デザイナを使用するためにRL Languageを理解する必要はありません。

ルール・デザイナは、動詞ルールに対して、ガイド付き作成(自動推奨およびフィルタリング)およびキーボードベースのインタフェースも提供します。ガイド付き作成およびキーボードベースのインタフェースの詳細は、「SOAコンポーザでの動詞ルールの追加方法」を参照してください。

ルール・デザイナは、アプリケーション開発者やビジネス・アナリストなど、様々なタイプのユーザーをサポートしています。アプリケーション開発者は、ルール・デザイナを使用して、データ・モデルおよびルールの初期セットを定義します。ビジネス・アナリストは、ルール・デザイナを使用して、ルールの初期セットを操作したり、ビジネス・ニーズに従ってルールの初期セットを変更およびカスタマイズします。ルール・デザイナを使用すると、ビジネス・アナリストは、ほとんどプログラマの援助なしに、ルールを作成およびカスタマイズできます。

また、トップダウン・モデリングでは、ビジネス・アナリストは、後で開発者が実装できるルールを記述的に定義できます。これらの様々なモデリング方法では、開発者とアナリストの間の協力が必要です。

多くの場合、ルール・モデリングは反復的に実行され、より技術的でなく、自然言語に近い文を使用したルールの定義に使用できるドメイン固有言語の作成に彼らの両方が貢献します。

動詞ルールの詳細は、ルールセットとルールの使用を参照してください。

1.3.6 Oracle SOA Composerアプリケーション

SOAコンポジット・アプリケーションにディクショナリがデプロイされると、Oracle Business Rulesによって、ディクショナリを表示したり、ディクショナリを編集して変更を保存したりできるようになります。SOAコンポーザ・アプリケーション (SOAコンポーザ)を使用して、SOAコンポジット・アプリケーションの一部としてデプロイされているディクショナリを操作できます。

詳細は、「実行時のOracle Business RulesとのOracle SOAコンポーザの使用方法」を参照してください。

1.3.7 Oracle Business Process Composerアプリケーション

Business Process Composerルール・エディタを使用すると、ルール・ディクショナリを表示および編集できます。ルール・ディクショナリは、プロセス・エディタおよびデータ・アソシエーション・エディタに類似のタブを使用したウィンドウに表示されます。

BP Composerでのルールの使用方法の詳細は、『Oracle Fusion Middleware Oracle Business Process Composerによるビジネス・プロセスの開発』のOracle Business Process Composerルール・エディタの使用方法に関する項を参照してください。

1.4 Oracle Business Rules Engineのアーキテクチャ

Reteアルゴリズムを使用したルールベース・システムは、Oracle Business Rulesの基盤です。

ルールベース・システムは、次の要素で構成されています。

- ルールベース: 適切なビジネス・ポリシーや、その他のIF/THENルール、動詞ルールおよびデシジョン表にエンコードされたナレッジ。

- 作業メモリー: システムに追加された情報。Oracle Business Rulesでは、アサート・コールを使用してシステムに一連のファクトを追加します。

- 推論エンジン: ルールを処理するRules Engine。一連のファクトを対象とした特定の実行において、ファクトに適合するルールを、パターン一致を実行して判断します。

Oracle Business Rulesでは、ルールベース・システムはデータドリブンの前向き連鎖システムです。ファクトは起動可能なルールを決定します。したがって、ルールの起動されるとき、そのルールは一連のファクトと一致したものです。ルールにはファクトを追加でき、これらのファクトもルールに対して再実行されます。このプロセスは、結論に達するか、このサイクルが停止またはリセットされるまで繰り返し実行されます。このように、前向き連鎖のルールベース・システムでは、ファクトによってルールが起動し、ルールの起動によって新たなファクトが作成され、そのファクトによってさらに別のルールが起動します。このようなプロセスを、推論サイクルと呼びます。

非Reteアルゴリズムも使用可能です。両方の詳細は、「Reteアルゴリズム」および「非Reteアルゴリズム」を参照してください。

1.4.1 宣言的ルール

Oracle Business Rulesでは、宣言ルールを使用することができます。ここでは、コーディングではなくファクトに基づいて宣言を作成するルールを作成します。宣言ルールの例は次のとおりです。

IF a Customer is a Premium customer, offer them 10% discount
IF a Customer is a Gold customer, offer them 5% discount

宣言ルール

- 文は制御フローなしで宣言されます。

- 制御フローはRules Engineによって決定されます。

- ルールはプロシージャ・コードよりもメンテナンスが容易です。

- ルールはビジネス・ユーザーの作業方法に適切に関連付けられています。

ルールによってファクトが追加され、これらのファクトがルールに対して実行される場合、このようなプロセスを推論サイクルと呼びます。推論サイクルでは、初期ファクトによってルールが起動し、ルールの起動によって新たなファクトが作成され、そのファクトによってさらに別のルールが起動する場合があります。たとえば、初期ファクトを使用してRules Engineで他のファクトの実行および追加が行われ、他のファクトによって、推論サイクルを作成するこのファクトの条件がテストされます。

IF a Customer is a Premium customer, offer them 10% discount
IF a Customer is a Gold customer, offer them 5% discount
IF a Customer spends > 1000, make them Premium customer

Oracle Business Rulesで提供される推論サイクルを使用すると、強力でモジュール形式の宣言アサーションが可能になります。

1.4.2 Reteアルゴリズム

Reteアルゴリズムは、人工知能の研究者によって1970年代後期に最初に開発され、現在では、様々なベンダーが提供するRules Engineの核となっています。Oracle Business Rulesでは、ルールとファクトのパターン一致プロセスを最適化するため、このReteアルゴリズムを使用しています。Reteアルゴリズムは、部分一致の結果を、作業メモリーにあるノードの単一ネットワークに格納します。

Reteアルゴリズムを使用すると、Rules Engineではファクトの削除、追加または変更時に不要な再確認を回避できます。ファクトとルールを処理するために、Reteアルゴリズムは、各ファクト定義に入力ノードを、各ルールに出力ノードを作成し、使用します。

ファクト参照は入力ノードから出力ノードへと流れます。入力ノードと出力ノードの間にテスト・ノードと結合ノードがあります。テストが発生するのは、ルール条件にブール式が含まれている場合です。結合が発生するのは、ルール条件が2つのファクトの論理積(AND)を実行する場合です。ルールは、その出力ノードにファクト参照が含まれている場合にアクティブになります。ファクト参照はネットワーク全体でキャッシュされ、アクティブになったルールの再計算の速度が上がります。ファクトが追加、削除または変更された場合、Reteネットワークでは、キャッシュとルールのアクティブ化が増分のみで更新されます。

Reteアルゴリズムの利点は、次のとおりです。

- ルール順序からの独立: 他のルールに影響を与えずに、ルールを追加および削除できます。

- 複数ルール間での最適化: 共通の条件を使用する各ルールは、Reteネットワーク内でノードを共有します。

- 高いパフォーマンスの推論サイクル: 通常、各ルールの起動によって変更されるのは少数のファクトのみで、Reteネットワークの更新コストは、ファクトまたはルールの総数ではなく、変更されたファクトの数に比例します。

1.4.3 非Reteアルゴリズム

Non-Reteアルゴリズム(NRE)は、Reteアルゴリズムの代替で、Reteアルゴリズムと比較して消費メモリーが少なくなります。ビジネス・ルールのユース・ケースの多くでは、パフォーマンスも向上します。NREアルゴリズムの中核は、新しいルール条件評価アプローチにあります。新しいアルゴリズムのキー・ポイントは次のとおりです。

- より簡素化された内部ルール表現。

- ルール・テスト、ルール・アクション、およびユーザー定義の関数のために生成されたバイト・コード。

- より効率的な変更操作。

- ルール条件は、それを含んでいるルールセットがスタックの先頭になるまでは評価されない。最初の評価の後、必要に応じてファクト操作で再評価が行われる。

- ルール実行中にルールセット・スタックにルールセットが1回のみ存在する場合は、不要な再評価を回避できる。

- ルール実行セマンティクスが保持される。

2つのアルゴリズムの間の2つの主な相違は次のとおりです。

- ルール条件の評価:

- Reteアルゴリズムでは、ルール条件はファクト操作(アサート、変更、リトラクト)が行われるときに評価されます。

- 非Reteアルゴリズムでは、ルール条件は、そのルールセットがスタックの先頭になったときに初めて評価され、その後のファクト操作で評価されます。

- ルールの起動順序。ルールの起動順序が定義されていない場合があります。たとえば、1つのファクトによって複数のルールが同時にアクティブ化され、それらのプロパティが同一である場合です。このような場合、ルールのアクティブ化の起動順序は異なることがあります。

注意:

ルールの既存のセットが、Reteアルゴリズムでのそのルールの起動順序が定義されていない可能性があっても、その順序に明示的に依存していることがあります。順序は、作成時に潜在バグを公開できる非Reteアルゴリズムでは異なる場合があります。

1.4.3.1 非Reteアルゴリズムの構成

ルール・デザイナでの「ディクショナリ設定」パネルの「プリファレンス」タブでアルゴリズムを選択できます。アルゴリズムの選択は、SOAおよびBPMコンポジット・アプリケーションの場合は自動的に処理されます。JEEアプリケーションまたは他の非SOA/BPMアプリケーションの場合、RuleSessionまたはRuleSessionPoolの作成時にアルゴリズムの選択を指定する必要があります。

RuleSessionsの詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』のRuleSessionの使用方法に関する項を参照してください。

ルールの実行中に複数のルールセットが実行されることがよくあります。また、各ルールセットがルールセット・スタックに1回追加され、そのルールセットのルールの起動を完了すると、そのルールの実行中はそれがそのスタックに再度追加されないこともよくあります。非Reteアルゴリズムでは、このような場合に、そのルールセットがスタックに1回のみ出現することを指定するとパフォーマンスを向上できます。非Reteアルゴリズムを選択した場合、デシジョン関数定義で「1回のスタックのルールセット」チェック・ボックスを選択して、この機能を有効化します。

Reteまたは非Reteアルゴリズムをどのような場合に使用するのかの詳細は、『Oracle Business Process Managementルール言語リファレンス』のルール・エンジン・アルゴリズムに関する項を参照してください。

1.4.4 作業メモリーとは

Oracle Business Rulesでは、作業メモリーを使用してファクトを格納します。ファクトは、作業メモリーの外部には存在しません。Oracle Business Rulesの作業メモリーはRuleSessionに格納されます。

1.4.5 ルールの起動とルール・セッション

ルール・セッションは、ルール、ファクトおよびアジェンダで構成されます。アサートまたは取消しによって、作業メモリーからファクト・インスタンスが追加または削除されます。

作業メモリー内のファクトに変更があると、次のようになります。

- ルールの条件が評価されます。

- 一致するルールがアジェンダに追加されます(アクティブ化)。

- 一致しなくなったルールはアジェンダから削除されます。

- アクティブ化されたルールについて、Rules Engineによってアクションが実行(起動)されます。

図1-3に、Oracle Business Rulesランタイムのこの部分を示します。

図1-3 ルール・セッションでのルールと作業メモリーおよびファクト

ルール・アクションでは、ファクトをアサートまたは変更してアクティブ化をアジェンダに追加するか、ファクトを取り消してアクティブ化をアジェンダから削除できます。ルールのアクションが原因で再度起動されると、ループが発生する可能性があります。ルールは順番に起動しますが、事前に定義された順序ではありません。ルール・セッションには、ルールセットのスタックが含まれています。アクティブ化されたルールは、次のように起動されます。

- スタック最上部にあるルールセット内のルールが起動されます。

- ルールセット内では、ユーザー定義の優先度に従って起動が順序付けされます。

- 同じ優先度の場合、デフォルトでは、最も最近にアクティブ化されたルールが最初に起動されます。詳細は、『Oracle Business Process Managementルール言語リファレンス』のsetStrategy関数に関する項を参照してください。

Reteアルゴリズムの場合、起動されるのはスタック上にあるルールセット内のルールのみですが、ルール・セッション内のルールがすべて照合され、一致した場合はアクティブ化されます。非Reteアルゴリズムの場合、これは、スタックの先頭にあるルールセットのルールにあてはまります。これは、「1回のスタックのルールセット」が選択されていない場合、ルールセット・スタックから取得されたルールセットのルールにもあてはまります。

2 データ・モデル要素の使用

この章では、ファクト・タイプ、関数、グローバル、値セット、デシジョン関数、ディクショナリ・リンクで構成されているOracle Business Rulesデータ・モデルについて説明します。

この章の内容は以下のとおりです。

- データ・モデル要素の使用の概要

- ディクショナリとディクショナリ・リンクの概要

- Oracle Business Rulesグローバルの使用

- デシジョン関数の使用

- Oracle Business Rules関数の概要

- Oracle Business Ruleリソースのローカライズ

2.1 データ・モデル要素の使用の概要

Oracle Business Rulesアプリケーションのデータ・モデル部分を実装するには、ディクショナリを作成し、データ・モデル要素を追加します。ディクショナリを完成するには、これらのデータ・モデル要素を使用するか、要素に依存するルールを含むルールセットを1つ以上作成します。

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

- ファクトと値セットの使用

- ルールセットとルールの使用

- デシジョン表の使用

2.2 ディクショナリとディクショナリ・リンクの概要

ディクショナリは、ファクト、関数、グローバル、値セット、リンク、デシジョン関数およびルールセットに使用するOracle Business Rulesコンテナです。また、アプリケーションのルールセットおよびデータ・モデルが格納されているXMLファイルです。ディクショナリは他のディクショナリにリンクできます。

必要な数のディクショナリを作成できます。ディクショナリには任意の数のルールセットとデータ・モデル要素を含めることができます。1つのデータ・モデルを1つ以上のディクショナリに格納できます。ルールセットで参照されるデータ・モデル要素はすべて、直接的に、またはリンクを通してディクショナリ内で使用可能である必要があります。

ディクショナリは、*.rulesファイルに格納されます。

2.2.1 ディクショナリとディクショナリ・リンクの使用

ディクショナリを作成する場合は、Javaクラスと同じように、名前とパッケージを指定します。データ・モデル要素とルールセットをこのディクショナリの内側に作成できます。また、ディクショナリ・リンクを作成して、ターゲット・ディクショナリの名前とパッケージを指定することで、別のディクショナリのデータ・モデルとルールセットを参照することもできます。各ディクショナリには論理的な組込みディクショナリが格納されています。このディクショナリには、すべてのOracle Business Rulesアプリケーションが必要とする標準の関数とタイプが含まれています。組込みディクショナリは変更できません。

メイン・ディクショナリに加えて、PurchaseItems.rulesなどの、アプリケーション固有のディクショナリを1つ以上作成できます。これらのディクショナリのプロパティは変更できます。

ディクショナリとそのリンク先のディクショナリによって定義された完全なデータ・モデルは、結合データ・モデルと呼ばれています。同じディクショナリに対して複数のリンクを作成できます。この場合、最初のリンク以外はすべて無視されます。

詳細は、「ディクショナリ・リンクに関する必知事項」を参照してください。

2.2.2 ルール・デザイナを使用してSOA層にディクショナリを作成する方法

Oracle JDeveloperでは、複数の方法でOracle Business Rulesのディクショナリを作成できます。SOAアプリケーションで使用するディクショナリを作成できます。この項では、SOAプロジェクトでディクショナリを作成する1つの方法を示します。

典型的なSOAコンポジットのデザイン・パターンでは、各アプリケーションに専用ディクショナリが用意されます。各アプリケーションは自己完結になり、個別にデプロイできるようになります。

場合によっては、複数のアプリケーションが、1つの共通データ・モデルの共通部分にアクセスすることが必要になります。このような場合、ディクショナリ・リンクを使用して、ソース・アプリケーション内にターゲット・アプリケーションのディクショナリを含めます。ソース・アプリケーションはターゲット・アプリケーションのディクショナリをコピーして、ソースにリンクされているコピーの内容を保持します。リンクされた要素を使用する場合、それらはローカル・コンテンツとして表示されます。

SOAアプリケーションの外部で、ビジネス層に使用するディクショナリを作成することもできます。詳細は、「Gradesプロジェクト内でのOracle Business Rulesディクショナリの作成方法」を参照してください。

ルール・デザイナを使用してSOA層にディクショナリを作成する手順は、次のとおりです。

1. アプリケーション・ナビゲータで、SOAアプリケーションを選択し、SOAプロジェクトを選択または作成します。

2. 下矢印をクリックし、リストから「新規」、「ギャラリから」を選択します。

3. 図2-1に示すように、「新規ギャラリ」ダイアログで「SOA層」を開きます。

図2-1 SOAプロジェクト用のビジネス・ルール・ディクショナリの作成

4. 「新規ギャラリ」ウィンドウで、「ビジネス・ルール」を選択します。

5. 「OK」をクリックします。「ビジネス・ルールの作成」ダイアログが表示されます。

6. 図2-2に示すように、「ビジネス・ルールの作成」ダイアログで次のフィールドに入力します。

- 「名前」フィールドにディクショナリ名を入力します。たとえば、PurchaseItemsと入力します。

- 「パッケージ」フィールドに、ディクショナリが属するJavaパッケージを入力します。たとえば、com.exampleと入力します。

図2-2 「ビジネス・ルールの作成」ダイアログ

7. 入力および出力を指定する手順は、次のとおりです。

a. 「追加」ボタンをクリックし、入力を作成するには「入力」を、出力を作成するには「出力」を選択します。

b. 「タイプ・チューザ」ダイアログで、適切なXSDを開いて適切なタイプを選択します。

c. 「OK」をクリックして「タイプ・チューザ」ダイアログを閉じます。

入力および出力を後で追加したり、削除できます。詳細は、デシジョン関数の使用を参照してください。

8. 「ビジネス・ルールの作成」ダイアログで「OK」をクリックして、デシジョン・コンポーネントおよびOracle Business Rulesディクショナリを作成します。
図2-3に示すように、Oracle JDeveloperによって、拡張子.rulesが付いたディクショナリがファイル内に作成され、ルール・デザイナが起動します。スクリーン・ショットには、BPMがインストールされていないとSOAでアクセスできない場合がある一部のBPM機能が表示されていることに注意してください。

図2-3 Oracle Business Rulesディクショナリの新規作成

9. Oracle JDeveloperによって、composite.xml内にデシジョン・コンポーネントも作成されます。このコンポーネントを表示するには、composite.xmlファイルをダブルクリックします。

2.2.3 ルール・デザイナを使用してビジネス層にディクショナリを作成する方法

ルール・デザイナを使用して、SOAアプリケーションの外部で、ビジネス層に使用するディクショナリを作成できます。SOAなしでOracle Business Rulesを使用する方法については、「ルール対応の非SOA Java EEアプリケーションの作成」を参照してください。

2.2.4 ディクショナリ設定の表示および編集方法

「設定」タブを使用して、ディクショナリ設定を表示および編集できます。「設定」タブには、「一般」、「プリファレンス」および「データ・モデル」 の3つのタブがあります。「プリファレンス」タブを使用して、実行アルゴリズムを選択し、動詞ルールを使用しているときに表示されるフレーズ提案を指定します。「データ・モデル」タブは、グローバル修飾子パターンの指定および動詞ルールに使用されます。パターンには、{member}, {fact}の2つのフラグメントを含める必要があります。たとえば、{fact}の{member}のようにします。

2.2.4.1 ディクショナリ別名を変更する方法

ディクショナリ別名を変更する手順は、次のとおりです。

1. Oracle JDeveloperで、Oracle Business Rulesディクショナリを開きます。

2. ルール・デザイナで、「設定」タブをクリックします。

3. 「ディクショナリ設定」ダイアログの「エイリアス」フィールドで、別名を必要な名前に変更します。図2-4に、このフィールドを示します。

図2-4 「ディクショナリ設定」、「一般」タブ

2.2.4.2 「プリファレンス」タブを編集する方法

「プリファレンス」タブを編集する手順は次のとおりです。

1. 図2-5に示すように、「設定」タブで、「プリファレンス」タブをクリックします。

2. 「ルール実行アルゴリズム」フィールドで、「RETE」または「非RETE」を選択します。

RETEまたは非RETEアルゴリズムの詳細は、「非Reteアルゴリズムの構成」を参照してください。

3. 「フレーズ提案」フィールドで、「すべて」、「自動提案」または「ビジネス・フレーズ」を選択します。フレーズ提案は、動詞ルール用です。自動提案のみの表示、ビジネス・フレーズのみの表示または両方の表示を選択できます。

ビジネス・フレーズの詳細は、「動詞ルールおよびビジネス・フレーズの概要」を参照してください。

図2-5 「ディクショナリ設定」、「プリファレンス」タブ

2.2.4.3 「データ・モデル」タブを編集する方法

「データ・モデル」タブを編集する手順は、次のとおりです。

1. 図2-6に示すように、「グローバル修飾子パターン」フィールドで、「バンドル・エディタ」ボタンをクリックし、この変換可能な値のリソース・バンドルを更新します。

ここで、グローバル修飾子パターンを指定できます。これは動詞ルールで使用されます。パターンには、{member}および{fact}の2つのフラグメントを含める必要があります。フラグメント{member}および{fact}は必須です。

2. 終了したら、「閉じる」をクリックします。

図2-6 「ディクショナリ設定」、「データ・モデル」タブ

2.2.5 ディクショナリにリンクする方法

ルール・デザイナの「リンク」ナビゲーション・タブを使用して、同じアプリケーションのディクショナリにリンクできます。別のディクショナリにリンクするには、他のディクショナリが1つ以上使用可能である必要があります。

リソース・ピッカーを使用してディクショナリにリンクする手順は、次のとおりです。

1. 図2-7に示すように、Rules Designerで「リンク」ナビゲーション・タブをクリックします。

図2-7 Rules Designerの「リンク」タブ

2. 「リンク」領域で、「作成」ボタンをクリックし、リストから「既存のディクショナリの参照」を選択します。「SOAリソース・ブラウザ」ダイアログが表示されます。

3. 図2-8に示すように、「SOAリソース・ブラウザ」ダイアログで、リンクするディクショナリにナビゲートして選択します。

図2-8 「リソース・ピッカー」

4. 「OK」をクリックします。

ADFビジネス・コンポーネントのファクトを使用する場合は、デシジョン・ポイント・ディクショナリへのリンクを作成する必要があります。詳細は、Oracle Business RulesとADFビジネス・コンポーネントの使用を参照してください。

デシジョン・ポイント・ディクショナリを追加するには、ルール・デザイナで「リンク」ナビゲーション・タブをクリックします。「リンク」領域で、「作成」をクリックし、リストから「デシジョン・ポイント・ディクショナリ」を選択します。この操作には少し時間がかかります。デシジョン・ポイント・ディクショナリがロードされるまで待機する必要があります。

2.2.6 リンク先ディレクトリの更新方法

別のディクショナリ(たとえば、Shared_rules)にリンクしているディクショナリ(たとえば、Project_rules1)がある場合、どちらのディクショナリも変更されていることを確認する必要があります。たとえば、Shared_rulesディクショナリを変更した場合、Project_rules1でのこの変更を表示するには、Project_rules1ディクショナリを更新するか、ルール・デザイナを閉じて、再度開きます。リンクを定義しているディクショナリからリンク先ディクショナリ内の変更のみを表示でき、その逆は表示できないことに注意してください。

リンク先ディクショナリを更新する手順は、次のとおりです。

1. これらのサンプル・ディクショナリ名を使用し、「保存」ボタンをクリックしてShared_rulesディクショナリを保存します。

2. Project_rules1ディクショナリを選択します。

3. 「リンク」ナビゲーション・タブを選択します。

4. 「ディクショナリ・キャッシュ」ボタンをクリックします。

5. 「ディクショナリ・ファインダ・キャッシュ」ダイアログで、適切なリンク先ディクショナリを選択します。

6. 「クリア」ボタンをクリックします。

7. 「ディクショナリ・ファインダ・キャッシュ」ダイアログで、「閉じる」をクリックします。

8. 「検証」ボタンをクリックします。

2.2.7 ディクショナリ・リンクに関する必知事項

他のディクショナリへのリンクを含むディクショナリを使用すると、次の場合に役立ちます。

- データモデルの共有。プロジェクト内のデータ・モデル部分を共有します。別のプロジェクトのディクショナリにリンクすると、それがローカル・プロジェクトにコピーされます。
たとえば、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に含まれます。この命名規則に違反し、結合ディクショナリ内の単一ルールセットのルールに個別の名前を使用しなかった場合は、ルール・デザイナによって、次のような検証警告が表示されます。

RUL-05920: Rule Set Ruleset_1 has two Rules with name rule_1

詳細は、「Oracle Business Rulesのファイルと制限事項」を参照してください。

2.2.8 ディクショナリ・リンクおよびディクショナリ・コピーに関する必知事項

リソース・ピッカーを使用してディクショナリ・リンクを作成すると、ディクショナリはソース・プロジェクト(リンク元のディクショナリが常駐しているプロジェクト)にコピーされます。つまり、このタイプのリンクでは、ディクショナリのローカル・コピーがプロジェクトに作成されます。これは、ターゲット・ディクショナリの場所に関係なく、元のターゲットへのリンクではありません。つまり、リソース・ピッカーを使用してリンクを作成した場合、ルール・デザイナではリンクにコピー操作が使用されます。

SOAおよび非SOAルール・ディクショナリ内のりリンク先ディクショナリについて、次のことに注意してください。

- SOAアプリケーション

1. 同じプロジェクト内のディクショナリ、soa/sharedにシードされているシステム・ディクショナリ、またはクラスパスで使用可能になっているディクショナリのみをリンク先ディクショナリとして使用できます。

2. 複数のコンポジット内のルールにわたって同じリンク先ディクショナリを使用する必要がある場合は、そのリンク先ディクショナリをクラスパスで参照する必要があります。

- Non_SOAアプリケーション

1. リンク先ディクショナリは同じアプリケーション内、MDS内の共有場所またはクラスパス内に配置できます。それらのディクショナリを見つけ、解決するには、適切なディクショナリ・ファインダを用意する必要があります。

2.2.9 デプロイされたディクショナリへのディクショナリ・リンクに関する必知事項

ルール・デザイナを使用している場合、デプロイされたコンポジット・アプリケーションおよび関連するOracle Business RulesディクショナリをMDS接続で参照できます。ただし、MDSにデプロイされたディクショナリにディクショナリ・リンクを作成することはできません。

2.2.10 BPELでのビジネス・ルールの入力および出力に関する必知事項

デシジョン関数の入力は、デシジョン関数の初期アクションに対する変数として使用できます。入力がファクトである場合、そのファクトは作業メモリー内にアサートされるので、ルールは、デシジョン関数の入力名ではなく、タイプおよびプロパティの値に基づいてファクトと一致する必要があります。たとえば、同じタイプに2つの入力input1およびinput2が存在する場合、ルールはこれらの入力をタイプおよびプロパティの値に基づいて識別するのであって、異なる2つの名前によって識別するわけではありません。入力が参照できないファクト(たとえば、文字列や整数)の場合、<decision function name>という名前のラッパー・タイプが作成され、ルールはこのタイプと一致する必要があります。

2.2.11 2つ以上のディクショナリを比較またはマージする方法

「差異ディクショナリ」機能を使用すると、ディクショナリの最新バージョンと任意の旧バージョンとの差異を確認し、比較したバージョン以降の変更をロールバックできます。最新バージョンから見た差異が確認されます。

「ディクショナリのマージ」機能を使用すると、ベース・バージョンと最大3つの変更バージョンとの差異を確認し、それらの差異を解決またはマージできます。変更されたバージョンから見た差異が確認されます。

「差異ディクショナリ」と「ディクショナリのマージ」はどちらも差異を表示して解決できますが、これらの2つの機能の基本的な違いは、複数のディクショナリをマージできますが、複数のディクショナリの差異をとることはできない点です。

「ディクショナリのマージ」および「差異ディクショナリ」オプションは、図2-9に示すようにルール・デザイナから使用できます。

図2-9 ディクショナリの差異/マージ・ボタン

Oracle JDeveloperでのデザインタイムには、最大3つまでの異なるディクショナリを比較して、4つ目のディクショナリにマージできます。実行時には、SOAコンポーザを使用することで、限定された比較を実行できます。詳細は、「実行時のOracle Business RulesとのOracle SOAコンポーザの使用方法」を参照してください。

ルール・デザイナでは、ベース・バージョン(編集中のもの)を2つのそれぞれ個別に変更されたバージョン(ベース・バージョンに対して相対的)と比較して、選択した変更をベース・バージョンにマージできます(新規バージョンとしての保存が必要)。

警告:

ディクショナリは差異またはマージ・モードになっているときは読取り専用になるため、これらの機能のいずれかの実行を決定する前に、すべての変更を解決する準備をする必要があります。

ディクショナリのマージは注意深く実行してください。関与する様々なバージョンを特定し、管理する必要があります(ベース、バージョン1、バージョン2および結果)。

2.2.11.1 ディクショナリ間の差異を調べる方法

ディクショナリを比較する場合は、最初にルール・デザイナで新しいディクショナリを開き、「差異ディクショナリ」ダイアログを使用して、比較する古いディクショナリを選択します。新しい方のディクショナリに存在しないものはすべて、新しいバージョンからの削除としてフラグが指定されます。

ディクショナリ間の差異を調べる手順は、次のとおりです。

1. ルール・デザイナで、新しいディクショナリを開いたまま、「差異ディクショナリ」をクリックします。

2. 「差異ディクショナリ」ダイアログで、「参照」をクリックし、「マージするディクショナリの選択」ダイアログを開き、比較するディクショナリを見つけます。

3. 「OK」をクリックします。

4. 短いバージョン名または番号を入力します。

5. 終了したら、「OK」をクリックします。

6. 図2-10に示すように、2つのディクショナリ間のすべての差異に変更アイコンのフラグが付きます。

図2-10 表示される変更差異

変更アイコンは、左側のすべてのタブに対して、および各タブ内の特定のアーティファクトに対して表示されます。

7. 各タブをクリックし、「差異の受入れ」または「差異の拒否」を決定します。または、ツールバーで「すべてを受入れ」または「すべて却下」を選択できます。

適切な変更アイコンをクリックすることで、ディクショナリの任意のレベルで差異の受入れまたは拒否ができます。たとえば、Rule1を古いバージョンに戻すが、新しいディクショナリ内のそれ以外のものはすべて保持するには、最初にRule1にドリルダウンして「差異の拒否」を選択し、ツールバーから「すべてを受入れ」を選択します。差異モードでは、受入れによって新しいバージョンが保持され、拒否によって古いバージョンに戻ることに注意してください。

差異ディクショナリ・オプションを表示できます。この選択項目は、ディクショナリを比較した後に使用可能になります。図2-10に示すように、「差異ディクショナリの表示」オプションには、比較されるディクショナリに関する情報がリストされます。

2.2.11.2 ディクショナリのマージ方法

複数のディクショナリのマージが必要な場合は、まずルール・デザイナで古い方のディクショナリを開いてから、「ディクショナリのマージ」ダイアログを使用して、マージする新しいディクショナリを選択します。古いディクショナリに存在しないものはすべて、最新バージョンでの追加としてフラグが指定されます。

これは、複数のディクショナリに対して機能するため、最初に最も古いものを使用し、次に1つ以上の新しいものを使用して、最後にその結果を最も新しいものに保存します。

ディクショナリのマージは、注意深く行ってください。すべての差異が解決されるまで一般的な編集は無効化されているため、場合によっては、競合している値を暫定的に受け入れるか拒否し、残りの差異を処理した後、編集を終了するために戻ることが必要になります。

ディクショナリをマージする手順:

1. ルール・デザイナで、最も古いディクショナリを開いたまま、「ディクショナリのマージ」をクリックします。

2. 「ディクショナリのマージ」ダイアログで、「参照」をクリックし、「マージするディクショナリの選択」ダイアログを開き、比較するディクショナリを見つけます。

3. 「OK」をクリックします。

4. 短いバージョン名または番号を入力します。

5. 終了したら、「OK」をクリックします。

6. 図2-11に示すように、ルール・デザイナではすべての変更にフラグが付きます。「差異のマージ」ダイアログを使用して「受入れ」または「拒否」を行うか、何もアクションを行いません。そのタブで「差異の受入れ」または「差異の拒否」を使用することもできます。または、ツールバーで「すべてを受入れ」または「すべて却下」を行うこともできます。

図2-11 「差異のマージ」ダイアログ

2.3 Oracle Business Rulesグローバルの使用

ルール・デザイナを使用してOracle Business Rulesグローバルを追加できます。

Oracle Business Rulesで使用するグローバルは、Javaにおけるパブリックな静的変数に類似しています。グローバルは、定数または変更可能に指定できます。

グローバルの定義を使用すると、複数のルールと関数で情報を共有できます。たとえば、複数のルールで10%割引を使用する場合は、グローバルGold Discountを作成し、このグローバルを使用してすべてのルールに適切な割引を適用できます。

グローバルの定義を使用すると、プログラムをモジュール化してメンテナンスを容易にできます。

2.3.1 Oracle Business Rulesグローバルの追加方法

ルール・デザイナを使用して、グローバルを追加できます。

グローバルを追加する手順は、次のとおりです。

1. Rules Designerで、「グローバル」ナビゲーション・タブを選択します。

2. グローバル表で「作成」ボタンをクリックします。これにより、グローバルが追加され、図2-12に示すように、「グローバルの編集 -」ダイアログが表示されます。

図2-12 ルール・デザイナでのグローバルの追加

3. 「名前」フィールドに名前を入力するか、またはデフォルト値を使用します。

4. 「タイプ」フィールドで、リストからタイプを選択します。

5. 「値セット」フィールドで、リストから値を選択することもできます。

6. 「値」フィールドで、値を入力するか、リストから値を選択するか、「式ビルダー」ボタンをクリックして式を入力します。

詳細は、「式ビルダーの概要」を参照してください。

7. グローバルが定数である場合は、「定数」チェック・ボックスを選択します。このオプションを選択することは、グローバルが定数値であることを示します。

詳細は、「ファイナル」オプションと「定数」オプションに関する必知事項」を参照してください。

8. グローバルがファイナルでない場合、「ファイナル」チェック・ボックスの選択を解除します。このオプションの選択を解除することは、Assignアクションなどで、グローバルを変更可能にすることを意味します。

2.3.2 Oracle Business Rulesグローバルの編集方法

ルール・デザイナを使用して、グローバルを編集できます。

グローバルを編集する手順は、次のとおりです。

1. Rules Designerで、「グローバル」ナビゲーション・タブを選択します。

2. 「編集」ボタンをクリックし、「グローバルの編集 - グローバル名」ウィンドウを開きます。このウィンドウで、グローバルを編集し、「ファイナル」フィールドや「定数」フィールドなどのフィールド値を変更できます。

2.3.3 「ファイナル」オプションと「定数」オプションに関する必知事項

「グローバルの編集」ダイアログには、グローバルに対して選択可能な「定数」チェック・ボックスと「ファイナル」チェック・ボックスが表示されます。

グローバルを使用する場合は、次のことに注意してください。

- 「ファイナル」の選択を解除することは、Assignアクションなどで、グローバルを変更可能にすることを意味します。

- 「ファイナル」を選択することは、ルール内のテストでグローバルを使用できることを示します(ファイナルでないグローバルはルール内のテストで使用できません)。

- 「ファイナル」を選択することは、グローバルが実行時に1度初期化され、変更できないことを示します。

「グローバルの編集 -」ダイアログで「定数」オプションを選択することは、グローバルが定数であることを示します。Oracle Business Rulesでは、定数は、文字列や数値リテラル、値が定数であるファイナル・グローバル、または定数と+、-、*および/を含む単純な式です。

グローバルに対して「定数」オプションを選択すると、次の3つの影響があります。

- 文字列リテラルを二重引用符で囲む必要がありません。

- 式の値の選択リストに定数のみが表示されます。

- 式の値が有効な定数である必要があります。

「定数」オプションは、必要に応じて選択できます。値セット値、値セット範囲エンドポイント、およびルールセット・フィルタ値は、常に定数であることに注意してください。

2.4 デシジョン関数の使用

データ・モデルにはデシジョン関数が含まれています。

デシジョン関数の使用については、「デシジョン関数の概要」を参照してください。

2.5 Oracle Business Rules関数の概要

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関数に関連付ける値セット。これはオプションです。

- 引数: 関数の引数。各関数の引数には名前、型およびオプションの値セットがあります。

- 関数本体: 事前定義済アクションを含む関数本体。事前定義済アクションを使用すると、ルール・デザイナではOracle Business Rules関数の書式が適切で検証可能であることが保証されます。

ルール・デザイナ内で関数を使用してルールをテストすることもできます。詳細は、「ルール関数を使用したデシジョン関数のテスト」を参照してください。

2.5.1 Oracle Business Rules関数の追加方法

ルール・デザイナを使用して、Oracle Business Rules関数を追加します。

Oracle Business Rules関数を追加する手順は、次のとおりです。

1. Rules Designerで、「関数」ナビゲーション・タブを選択します。

2. 「作成」ボタンを選択します。

3. 「名前」フィールドに関数名を入力するか、デフォルト名を使用します。

4. 「戻り型」のリストから戻り型を選択します。たとえば、「void」を選択します。

5. 「値セット」フィールドのリストから、関数の戻り型に関連付ける値セットを選択することもできます。

6. 必要に応じて、「説明」フィールドに説明を入力します。

7. 「引数」表で「追加」をクリックし、関数の引数を1つ以上追加します。

8. 引数ごとに、「型」フィールドのリストから型を選択します。

9. 「値セット」フィールドの各引数について、値セットの制約によって指定されているとおりに引数値を制限するには、リストから値セットを選択します。

10. 「本体」領域に、関数本体のアクションと引数を入力します。assert、call、modifyの範囲の必要なアクションを、if、else、elseif、while、for、if (advanced)、while (advanced)のような条件アクションにも追加できます。図2-13に示す例を参照してください。

図2-13 Oracle Business Rules関数の追加

2.6 Oracle Business Ruleリソースのローカライズ

ルール・リソースの名前、別名、説明をローカライズできます。これにより、ワークスペースとSOAコンポーザでリソースをうまく制御できるようになります。値セット、グローバル、ルールセット、ルールなど、ほとんどのリソースをローカライズできます。動詞ルールでは、ビジネス・フレーズの値もローカライズできます。

これらのリソースを作成したら、「変換」タブでロケール固有の情報を追加できます。各ロケールは個別のリソース・バンドルに保存されています。

注意:

リソース・バンドルを手動で編集して、ローカライズされた文字列を追加したり編集したりすることはできません。リソース・バンドルを編集するには、JDeveloper、BP ComposerまたはSOAコンポーザのルール・デザイナの「変換」タブを使用する必要があります。

2.6.1 Oracle Business Rulesでのリソースのローカライズ方法

JDeveloperのルール・デザイナを使用して、ビジネス・ルールのリソースをローカライズできます。

ビジネス・ルールのリソースをローカライズする方法は、次のとおりです。

1. Rules Designerで、「変換」タブを選択します。

2. 「リソース・バンドルの作成」ボタンをクリックします。

「リソース・バンドルの作成」画面が表示されます。

3. 図2-14のように、「ロケール」をリストから選択します。

追加した各ロケールは、「リソース・バンドルの変換」表の列として表示されます。ビジネス・ルールの各リソースは、この表の行として表示されます。各ロケールは個別のリソース・バンドルとして保存されます。

図2-14 新しいロケールの追加

4. リソースおよびロケールに対応する表のセルをクリックして、ローカライズされたテキストを入力します。

注意:

変換された値は、現在のロケールでのみ検証されます。検証は、使用されていない他のロケールでの変換に対しては行われません。

5. 「変換の移入」およびラジオ・ボタンを選択し、未変換テキストまたは別のロケールから新しいバンドルの変換を移入します。

6. 「OK」をクリックします。

3 ファクトと値セットの使用

この章では、ファクト・タイプと呼ばれるOracle Business Rulesデータ・モデル要素について説明します。ファクトはルールの判断対象となるオブジェクトです。ファクト・プロパティ値のグループ化を定義する、値セットと呼ばれるもう1つの要素についても説明します。

この章の内容は以下のとおりです。

- ファクトと値セットの使用の概要

- XMLファクトの使用

- Javaファクトの使用

- RLファクトの使用

- ADFビジネス・コンポーネント・ファクトの使用

- 値セットの使用

- 値セットのビジネス条件との関連付け

3.1 ファクトと値セットの使用の概要

ルール・デザイナでは、データ・モデルの一部であるファクト・タイプを使用してOracle Business Rulesにビジネス・オブジェクトおよびそのメソッドを認識させます。ファクト・タイプは、データ・モデルにおけるタイプ定義です。ファクトは、そのファクト・タイプのインスタンスであり、ルールの実行対象とすることができるデータ構造です。

たとえば、ファクト・タイプは、関連するプロパティ(ビジネス条件)のコレクションであると、ファクトはそのビジネス条件にバインドされた関連するデータのコレクションです。顧客ファクトには、名前だけでなく、アドレス、履歴、信用格付などが含まれる場合があります。

ルールを作成する前に、ファクト・タイプおよび値セットを作成できます。

ルール・デザイナでは、次の種類のファクトを使用できます。

- XMLファクト: XMLファクトは、XMLスキーマを指定して既存のソースからインポートされます。インポートしたXMLファクトに別名を追加するか、XMLファクトをRLファクトと併用し、ビジネス・ニーズに応じてデータ・モデルを変更できます。
詳細は、「XMLファクトの使用」を参照してください。

- Javaファクト: Javaファクトは既存のソースからインポートされます。Javaファクトに別名を追加するか、RLファクトと併用し、ビジネス・ニーズをデータ・モデルのターゲットにすることができます。また、Javaファクトは、作成するルールまたはデシジョン表で使用する関連Javaクラスのインポートにも使用されます。
詳細は、「Javaファクトの使用」を参照してください。

- RLファクト: RLファクトは、ユーザーが直接作成でき、外部ソースが存在しないタイプの唯一のファクトです。他のすべてのタイプのOracle Business Rulesファクトはインポートされます。RLファクトは、リレーショナル・データベースの行またはプロパティを持つJavaBeanと似ています。RLファクトには、名前付きの型指定プロパティのセットが含まれます。プロパティ値には、文字列のようなプリミティブ、別の構造化ファクトまたはリストを使用できます。RLファクトは、迅速で独立的な開発およびデシジョン・ロジックのテストに役立ちます。インポートされたスキーマを使用可能にするか安定させる前に、RLファクトを使用して、インポートされたファクト・タイプから最終的に取得される入力データ(XMLスキーマなど)を、モデル化できます。中間デシジョンはアプリケーションに返されません(顧客を優良または不良に分類するサブデシジョンなど)。通常は、デシジョンの入力および出力データに使用されるファクト・タイプをインポートすることが最適な方法です。RLファクトを使用すると、動的な仮想型を提供することでJavaアプリケーションのオブジェクト・モデルを拡張できます。
詳細は、「RLファクトの使用」を参照してください。

- ADFビジネス・コンポーネント・ファクト: ADFビジネス・コンポーネント・ファクトを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます。ADFビジネス・コンポーネントのファクトを使用することで、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフをアサートし、Oracle Business Rulesにビュー・オブジェクトのグラフ内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させることができます。
詳細は、「ADFビジネス・コンポーネント・ファクトの使用」を参照してください。

ルール対応アプリケーションのビジネス・オブジェクトを調査するルールを作成したり、結果をアプリケーションに返す場合は、通常、Javaファクト・タイプとXMLファクト・タイプを使用します。RL Languageファクト・タイプ定義を使用して、Rules Engineで他のルールを起動できる中間ファクトを作成します。ADFビジネス・コンポーネント・ファクト・タイプを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます

Oracle Business Rulesでは、ルールに対して実行できるファクトは、アサートされたデータ・オブジェクトです。各オブジェクト・インスタンスは単一のファクトに対応しています。オブジェクトが(変更済かどうかに関係なく)再アサートされると、Rules Engineが更新され、そのオブジェクトの新しい状態が反映されます。オブジェクトの再アサートによるファクトの作成はありません。特定のファクト・タイプに複数のファクトを指定するには、オブジェクト・インスタンスを個別にアサートする必要があります。

値セットを作成すると、指定したタイプの値のリストまたは値の範囲を定義できます。値セットを作成すると、値セットを、一致するタイプのビジネス条件に関連付けることができます。値セットがビジネス条件に関連付けられている場合、Oracle Business Rulesでは、デシジョン表に含まれているルールでビジネス条件の値に対する制約として定義した値または範囲が使用されます。

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

- 値セットの使用

- 値セットのビジネス条件との関連付け

3.2 XMLファクトの使用

XMLファクト・タイプを使用すると、ルールを記述する際にXMLスキーマのタイプ、要素および属性を使用できます。XMLスキーマに定義されている要素およびタイプをデータ・モデルにインポートし、Javaファクト・タイプやRLファクト・タイプの場合と同様にIF/THENルールおよびデシジョン表ルールの作成に使用できます。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文書に関連付けられたスキーマがある場合、ルール・デザイナを使用し、XMLスキーマから指定する要素に基づいてルールを定義できます。

注意:
XSDに単純型のプリミティブまたは非プリミティブ・ルート要素が含まれる場合、JAXBでは単純型要素がJAXBElementにマッピングされ、ObjectFactoryクラスのみが生成されます。ビジネス・ルールで使用される複合型のファクトを作成する必要があります。

3.2.1 XMLファクト・タイプを作成する方法

1. XMLスキーマを定義または取得します。

2. ルール・デザイナを使用して、XMLスキーマをディクショナリにインポートします。

この手順では、JAXBコンパイラを使用してXMLスキーマからJavaクラスを生成します。XMLスキーマのコンパイル後に、スキーマから必要な要素を選択し、データ・モデル内でXMLファクトを追加し、生成されたJAXBクラスをデータ・モデルにインポートします。

これらの手順の詳細は、「XMLスキーマをインポートしてXMLファクトを追加する方法」を参照してください。

3. データ・モデルに追加したXMLファクトに基づいて、ルールを記述するか、デシジョン表を作成します。

詳細は、「ルールの使用」および「デシジョン表の作成」を参照してください。

XMLスキーマに定義されている要素およびタイプをデータ・モデルにインポートし、タイプのインスタンスをルールで作成、アサート、変更および取消しできます。ほとんどのXML文書では階層情報が記述されており、各要素にはサブ要素が含まれています。通常、ユーザーはこの階層内の複数の要素および要素間の階層関係に基づいて個々のルールを記述します。

Oracle Business Rulesでは、ファクトをアサートする際のデフォルト動作は単一のファクト・インスタンスをアサートすることのみで、サブ要素の階層内で参照している可能性のある子オブジェクトはアサートしません。ルールまたはデシジョン表の作成時には、通常、ルート要素への参照に基づいて要素の階層全体をアサートするようにします。Oracle Business Rulesには、階層を再帰的にアサートできるようにassertTreeアクション・タイプが用意されています。詳細は、「ツリー・モードのルールの使用」を参照してください。

3.2.2 XMLスキーマをインポートしてXMLファクトを追加する方法

データ・モデルでXMLスキーマ定義を使用する前に、XMLスキーマをインポートする必要があります。この手順では、JAXBクラスを生成し、生成されたクラスおよびパッケージをルール・デザイナで参照可能なXMLスキーマに関連付けます。

XMLスキーマをインポートしてXMLファクトを追加する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 図3-1に示すように、「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。

図3-1 Rules Designerの「XMLファクト」タブ

3. 「XMLファクト」タブで「作成」をクリックします。「XMLファクトの作成」ダイアログが表示されます。

4. 「XMLファクトの作成」ダイアログの「ソース・スキーマ」領域で、「ソース・スキーマの追加」をクリックし、「ソース・スキーマの追加」ダイアログを開きます。

5. 「ソース・スキーマの追加」ダイアログでは、次の操作を実行します。

- 「スキーマの場所」フィールドで、インポートするXMLスキーマの場所を入力するか、「参照」をクリックしてXMLスキーマを検索します。インポート中に、ファイルがプロジェクトにコピーされます。

注意:

通常、XMLスキーマ(xsd)ファイルはSchemasと呼ばれるxsdフォルダ内にあります。作成したXMLスキーマはSOA内のxsdフォルダ内に保存する必要があるからです。

- 「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」をクリックします。
ルール・デザイナでスキーマが処理されJAXBがコンパイルされるため、スキーマのサイズによっては、この手順の完了に時間がかかる場合があります。この手順が完了すると、ルール・デザイナの「XMLファクトの作成」ダイアログは、「ターゲット・クラス」領域が更新され、JAXBクラスが含まれた状態で表示されます。

6. 「XMLファクトの作成」ダイアログの「ターゲット・クラス」領域で、XMLファクト・タイプとしてインポートするクラスを選択します。

7. 「OK」をクリックします。

3.2.3 XMLファクトの表示および編集方法

XMLファクトを使用するには、Rules Designerで「XMLファクトの編集 -」ダイアログを開きます。

XMLファクトを表示して編集する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。

3. 「XMLファクト」表で、編集するXMLファクトのアイコンをダブルクリックします。図3-2に示すように、「XMLファクトの編集 -」ダイアログが表示されます。

図3-2 「XMLファクトの編集 -」ダイアログ

「XMLファクトの編集 -」ダイアログには、表3-1に示すフィールドがあります。

表3-1 XMLファクト: 「XMLファクトの編集 -」ダイアログのフィールド

フィールド

説明

名前

XMLファクト名が表示されます。JAXB生成クラスの名前は変更できません。

エイリアス

XMLファクトの別名を入力します。この値は変更できます。デフォルトは、未修飾のクラス名です。

修飾子パターン

このフィールドは動詞ルールに使用されます。

ここで何も指定されていない場合は、グローバル修飾子が使用されます。カスタム修飾子パターンがファクトに指定されている場合、パターンに2つの部分({member}、{fact})が含まれている必要があります。次のようにパターンを指定します。

- {fact}'s {member}

- {member} in {fact}

- {member} of {fact} (これがデフォルトです)。

動詞ルールの使用方法の詳細は、「動詞ルールおよびビジネス・フレーズの概要」を参照してください。

スーパー・クラス

このファクトに関連付けられているJavaスーパークラスが表示されます。

XML名

XMLファクトに関連付けられているXML名が表示されます。

生成元

ビジネス・ルール・データ・モデルにコピーされる際にXMLファクトのソースとなったXMLスキーマ・ファイルが表示されます。

参照可能

ルール・デザイナのリストにXMLファクトを表示する場合に選択します。XMLファクトから他のXMLファクトが参照されることによって、ツリーが形成されることがあります。ルールで参照するプロパティを含む、すべてのXMLファクト・タイプを参照可能にする必要があります。

XPathアサーションのサポート

ファクトについてXPathアサーションを有効化する場合に選択します。この機能は、下位互換性のためにのみ提供されています。通常、このオプションは使用しません。

説明

XMLファクトの説明を入力します。

「属性」領域

表示または編集するXMLファクトのJAXBクラスに関連付けられている、使用可能なコンストラクタ、プロパティ、メソッドまたはフィールドを選択します。

列を幅に合せる

列幅を調整するには、このチェック・ボックスを選択します。

3.2.4 スキーマが更新されたXMLファクトをリロードする方法

プロジェクト内でXMLスキーマが変更された場合、Oracle Business Rulesディクショナリにスキーマを再インポートする必要があります。スキーマを再インポートすると、Oracle Business Rulesでは、JAXBを使用してすべてのXMLファクト・タイプに対してソース・スキーマをすべて再コンパイルし、更新されたXMLスキーマ定義を使用してXMLファクト・タイプ定義を更新します。スキーマまたはクラスを変更し、実行時に変更後のスキーマまたはクラスを使用する場合、ファクトを再インポートする必要があります。

注意:

スキーマの再インポート時に、XMLファクトの変更基準となるXMLスキーマが変更された場合、ファクトが更新され、ベース・ディレクトリにインポートされます。リンクされたディクショナリ内のファクトを使用する場合は、変更されたスキーマのXMLファクトを、リンクされたディクショナリではなく、ベース・ディクショナリからリロードする必要があります。

XMLファクトを再インポートする手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。

3. 「XMLファクト」ページで、「変更されたスキーマに基づいたファクトのリロード(リンクされたファクトを除く)」または「すべてのファクトのリロード(リンクされたファクトを除く)」をクリックします。

再インポート操作が完了した後、互換性のない変更(更新されたスキーマに、ルールで参照されているプロパティを削除したという変更が含まれているなど)によって発生する検証警告があれば、訂正する必要があります。

3.2.5 XMLファクトに関する必知事項

XMLファクトを使用する際の注意事項は、次のとおりです。

XMLスキーマにrestriction定義が含まれていると、要素内での使用に有効なタイプを制限できます。restrictionの一般的な用途は、次に示す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列挙タイプにマップされます。ルール・デザイナを使用してJava列挙タイプまたは要素をXML制限とともにインポートすると、列挙を表す静的な最終フィールドを式に使用できます。また、Oracle Business Rulesでは列挙ごとに、すべての列挙値およびNULLを含む値セットが作成されます。値セットの詳細は、「値セットの使用」を参照してください。

- Oracle Application Serverには、デフォルト・バージョンのJAXBバインド・コンパイラが同梱されています。異なるJAXBバインド・コンパイラも使用できます。ただし、異なるJAXBバインド・コンパイラを使用する場合は、XMLスキーマ処理を手動で実行し、生成されたJavaパッケージおよびクラスをJavaファクトとしてデータ・モデルにインポートする必要があります。
JAXBの詳細は、次を参照してください。

http://java.sun.com/webservices/jaxb/

- スキーマまたはクラスを変更し、実行時に変更後のスキーマまたはクラスを使用する場合、ファクトを再インポートする必要があります。互換性のない変更(ルールで参照されているプロパティの削除など)によって発生する検証警告があれば、訂正する必要があります。詳細は、「スキーマが更新されたXMLファクトをリロードする方法」を参照してください。

- ほとんどのユーザーは、ObjectFactoryを使用またはインポートする必要はありません。ObjectFactoryをインポートして使用する必要がある場合は、インポートする各XMLスキーマに異なるパッケージ名を使用しないと、異なるObjectFactoryクラスが競合します。

- minOccurs="0"およびnillable="true"を含む要素のあるXMLスキーマの使用では、JAXBでの特別な処理が発生します。詳細は、「xsd:string入力済要素を持つXMLスキーマをタイプJAXBElementとしてインポートするのはなぜですか。」を参照してください。

- JAXBのデフォルト要素の命名規則では、XMLスキーマ要素名にアンダースコア文字を含むXMLスキーマのコンパイルに失敗します。詳細は、「アンダースコアを持つXMLスキーマでJAXBコンパイルに失敗するのはなぜですか。」を参照してください。

- デシジョン・サービスの入力のタイプおよび名前には、特定の制限があります。詳細は、「デシジョン・サービスの入力と出力の要素タイプはどのように制限されますか。」を参照してください。

- 組込みディクショナリには、JavaラッパーのInteger、Long、Short、Float、Double、BigDecimal、BigIntegerに対するサポートが含まれています。これらのタイプは、XMLファクト・タイプに表示されます。

3.3 Javaファクトの使用

ルール・デザイナでは、Javaファクトをインポートすると、Javaクラスおよびそのメソッドがルール・デザイナで参照可能になります。ルール・デザイナでは、Javaコードやバイトコードがデータ・モデルやディクショナリにコピーされることはありません。

Javaファクト・タイプを使用すると、Javaクラスの選択したプロパティおよびメソッドをRules Engineにインポートできるため、ルールではそのJavaクラスのインスタンスへのアクセス、作成、変更および削除が可能となります。

Javaファクト・タイプをインポートすると、Rules EngineはJavaクラスに定義されているpublic属性、publicメソッドおよびBeanプロパティにアクセスして使用できます(Beanプロパティが適切です。これは、BeanプロパティがModifyアクションで変更できるからです)。

3.3.1 JavaクラスをインポートしてJavaファクトを定義する方法

Javaファクトをルールおよびデシジョン表で使用する前に、Javaファクトを含むクラスおよびパッケージをルール・デザイナで使用可能にする必要があります。そのためには、ルール・デザイナを使用してJavaクラスを含むクラスパスを指定し、Javaファクトをインポートします。

Javaファクト・タイプを使用すると、副作用の有無に関係なくメソッドをインポートできます。副作用とは、I/O、データベース問合せ、Webサービスなどの負荷の高い操作のことです。Javaクラスをファクトとして使用するときは、副作用に関する次の点に留意してください。

- ルールおよびデシジョン表の条件およびアクションは、副作用のあるメソッドを使用しません。

- アクションはすべてのメソッドを使用できます。副作用は推奨されませんが、許容されます。

Javaファクトをインポートして定義する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 図3-3に示すように、「ファクト」ナビゲーション・タブで、「Javaファクト」タブを選択します。

図3-3 「ファクト」ナビゲーション・タブの「Javaファクト」表

3. 「Javaファクト」タブで、「作成」をクリックし、「Javaファクトの作成」ダイアログを開きます。

4. 「Javaファクトの作成」ダイアログで、インポートするクラスを含むクラスパスが「クラスパス」領域に表示されない場合は、「クラスパスに追加」をクリックします。「ディレクトリ/Jarの選択」ダイアログが表示されます。

ルール・デザイナのデフォルト・クラスパスには、3つのパッケージjava、javaxおよびorgが含まれています。この3つのパッケージには、ルール・デザイナでJavaランタイム・ライブラリ(rt.jar)からインポートできるクラスが含まれています。Rules Designerでは、これらのクラスを「クラス」領域から削除することはできません(また、関連するクラスパスは「クラスパス」領域に表示されません)。

5. 「ディレクトリ/Jarの選択」ダイアログで、追加するクラスパスまたはjarファイルを参照して選択します。デフォルトでは、プロジェクトの出力ディレクトリはインポート・クラスパスに存在し、プロジェクト内のJavaクラスは「クラス」インポータに表示されます。表示されない場合は、プロジェクトに対してBuildアクションを実行します。

6. 「開く」をクリックします。これにより、クラスパスまたはjarファイルが追加され、「クラスパス」領域が更新されます。

7. 「Javaファクトの作成」ダイアログの「クラス」領域で、インポートするパッケージとクラスを選択します。

8. 「OK」をクリックします。「Javaファクト」タブの「Javaファクト」表が更新されます。

3.3.2 Javaファクトの表示および編集方法

Javaファクトのインポート後にJavaファクトを表示および編集するには、「Javaファクトの編集 -」ダイアログを使用します。

Javaファクトを表示して編集する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。

2. 「ファクト」ナビゲーション・タブで、「Javaファクト」タブを選択します。

3. 「Javaファクト」表で、編集するJavaファクトをダブルクリックします。図3-4に示すように、「Javaファクトの編集 -」ダイアログが表示されます。

図3-4 「Javaファクトの編集 -」ダイアログ

「Javaファクトの編集 -」ダイアログには、表3-2に示すフィールドがあります。

表3-2 「Javaファクトの編集 -」ダイアログのフィールド

フィールド

説明

クラス

Javaファクトに関連付けられているソースのJavaファクト・クラスが表示されます。

エイリアス

Javaファクトの別名を入力します。

修飾子パターン

このフィールドは動詞ルールに使用されます。

ここで何も指定されていない場合は、グローバル修飾子が使用されます。カスタム修飾子パターンがファクトに指定されている場合、パターンに2つの部分({member}、{fact})が含まれている必要があります。次のようにパターンを指定します。

- {fact}'s {member}

- {member} in {fact}

- {member} of {fact} (これがデフォルトです)。

動詞ルールの使用方法の詳細は、「動詞ルールおよびビジネス・フレーズの概要」を参照してください。

スーパー・クラス

このファクトに関連付けられているJavaスーパークラスが表示されます。

表示可能

ルール・デザイナのリストにJavaファクトを表示する場合に選択します。

説明

Javaファクトの説明を入力します。

「属性」領域

表示または編集するJavaファクトのJavaクラスに関連付けられている、使用可能なクラス・プロパティ、コンストラクタ、メソッドまたはフィールドを選択します。

プロパティ

いくつかのJavaオブジェクトには、そのオブジェクトの定義に役立つフィールドがあります。たとえば、Calendarには、週の初めの日、タイムゾーンなどを定義するためのプロパティがあります。

列を幅に合せる

列幅を調整するには、このチェック・ボックスを選択します。

属性の説明

「属性の説明」は、そのプロパティの説明です。

3.3.3 Javaファクトに関する必知事項

Javaファクトを定義する際の注意事項は、次のとおりです。

- Windowsシステムでは、「クラスパス」領域でクラスパスの指定に円記号(\)またはスラッシュ(/)を使用できます。ルール・デザイナでは、どちらのパス・セパレータも使用できます。

- ルール・デザイナで使用するクラスおよびインタフェースは、次のルールに従う必要があります。つまり、クラスまたはインタフェースを使用する場合、参照可能にできるのは、そのスーパー・クラスまたは実装されるインタフェースの1つのみです。

- クラスパスを指定する際に、JARファイル、ZIPファイルまたはディレクトリのフルパスを指定できます。

- クラスパスにディレクトリ名を指定する場合、そのディレクトリでは、ルート・パッケージ(完全パッケージ名に含まれる最初のパッケージ)が格納されているディレクトリで終わるクラスパスを指定します。つまり、クラスパスでディレクトリを指定すると、ルール・デザイナではそのツリー内でパッケージ名構造と一致するディレクトリ名が検索されます。
たとえば、c:\myprj\cool\example\Test1.classにあるクラスcool.example.Test1をインポートするには、クラスパスの値c:\myprjを指定します。

- クラスを変更した場合は、ファクトを再インポートする必要があります。再インポート操作の完了後、クラスの変更によって検証警告が表示されることがあります。互換性のない変更(ルールで参照されているプロパティの削除など)によって発生する検証警告があれば、訂正する必要があります。

3.4 RLファクトの使用

RLファクトは、ユーザーが直接作成でき外部ソースが存在しないタイプの唯一のファクトです。他のすべてのタイプのOracle Business Rulesファクトはインポートされます。RLファクトは、リレーショナル・データベースの行またはメソッドがないJavaBeanと同じです。RLファクトには、データ・モデルで使用可能なタイプ(RLファクト、Javaファクトまたはプリミティブ・タイプ)のプロパティのリストが含まれています。

RLファクトを使用すると、動的な仮想型を提供することでJavaアプリケーションのオブジェクト・モデルを拡張できます。

次に例を示します。

R1: if monthly spend = Customer.monthlySpend
then assert new Temp(three month spend: monthly spend[0] + monthly spend[1] + monthly spend[2])
R2: if Temp.three month spend > 500
then modify Temp(status: GOLD)
R3: if Temp.status == GOLD
then assert new Result(discount: 0.10).

ルール・デザイナでテストおよびプロトタイプ化を行う場合、RLファクトを作成し、ルールの記述およびテストに使用してから、スキーマをインポートし、XMLファクトに切り替えることができます(承認済XMLスキーマが作成されるか使用可能になるまで、待機が必要な場合があります)。RLファクトから対応するXMLファクトに切り替える手順は、次のとおりです。

1. RLファクトを削除します(これにより、作成したルールまたはデシジョン表で削除対象のRLファクトを使用しているという検証警告が表示されます)。

2. XMLファクトをインポートし、そのXMLファクトおよびプロパティに、手順1で削除したRLファクトとプロパティの名前と一致する別名を与えます。

3. このプロセスでは、XMLファクトとプロパティの別名および型が削除するRLファクトの別名および型と一致する場合、検証警告が削除されます。

3.4.1 RLファクトの定義方法

「ファクト」ナビゲーション・タブからRLファクトを追加します。

RLファクトを定義する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 図3-5に示すように、「ファクト」ナビゲーション・タブで、「RLファクト」タブを選択します。

図3-5 Rules Designerの「RLファクト」タブ

3. 「RLファクト」タブで「作成」をクリックします。

4. 「RLファクト」表で、「名前」フィールドにRLファクトの名前を入力するか、またはデフォルト名を受け入れます。

5. 「RLファクト」表で、「説明」フィールドに説明を入力するか、またはデフォルトの説明なしを受け入れます。

3.4.2 RLファクトを表示および編集してRLファクトのプロパティを追加する方法

RLファクトにプロパティを追加するには、「RLファクトの編集 -」ダイアログを使用します。

RLファクトを表示、編集してRLファクトのプロパティを追加する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「RLファクト」タブで、ファクトを表示または編集するRLファクトをダブルクリックします。図3-6に示すように、「RLファクトの編集 -」ダイアログが表示されます。

図3-6 「RLファクトの編集 -」ダイアログ

3. RLファクトのプロパティを追加するには、「RLファクトの編集 -」ダイアログの「プロパティ」領域で「作成」をクリックします。

a. 「名前」フィールドにプロパティ名を入力します。

b. 「タイプ」フィールドで、リストからタイプを選択するか、またはプロパティ・タイプを入力します。

c. 値セットをプロパティに関連付けるには、「値セット」フィールドのリストから、値セットを選択します。

d. プロパティに初期値を関連付けるには、「初期値」フィールドに値を入力します。

4. 必要に応じて前述の手順を繰り返し、さらにプロパティを追加します。

5. 「OK」をクリックします。

3.4.3 RLファクトに関する必知事項

「RLファクトの編集 -」ダイアログを使用してRLファクトにプロパティを追加する場合、図3-7に示すように、「プロパティ」領域の「初期値」フィールドに候補値のリストが表示されます。

図3-7 RLファクトのプロパティの初期値の設定

ルール・デザイナの一部のフィールドを使用する際は、初期値のリストや他のリストが空の場合があります。この場合、リストは空のボックスです。したがって、ルール・デザイナで値の入力に役立つオプションがみつからない場合、テキスト入力領域に値を直接入力するか、または「式ビルダー」ボタンをクリックして「式ビルダー」ダイアログを表示する必要があります。

3.5 ADFビジネス・コンポーネント・ファクトの使用

ADFビジネス・コンポーネント・ファクトを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます。ADFビジネス・コンポーネントのファクトを使用することで、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフをアサートし、Oracle Business Rulesにビュー・オブジェクトのグラフ内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させることができます。

詳細は、「Oracle Business RulesとADFビジネス・コンポーネントの使用」を参照してください。

3.5.1 ADFビジネス・コンポーネント・ファクトをインポートおよび定義する方法

ADFビジネス・コンポーネント・ビュー・オブジェクトをインポートすると、ビュー・オブジェクの各属性に対応するプロパティを持つADFビジネス・コンポーネント・ファクト・タイプが作成されます。

ADFビジネス・コンポーネント・ファクトを追加する手順は、次のとおりです。

1. 「ファクト」ナビゲーション・タブをクリックし、「ADF-BCファクト」タブを選択します。図3-8に示すように、「ADF-BCファクト」表が表示されます。

図3-8 「ADFビジネス・コンポーネント・ファクト」タブ

2. 「作成」...をクリックします。これにより、「ADF-BCファクトの作成」ダイアログが開きます。

3. 「接続」フィールドのリストから、ADFビジネス・コンポーネント・オブジェクトで使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。詳細は、「ADFビジネス・コンポーネント・ファクトのクラスパスに関する必知事項」を参照してください。

4. 「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。

5. 「OK」をクリックします。これにより、「ファクト」ナビゲーション・タブが表示されます。インポートしたファクトには検証警告が含まれることに注意してください。この検証警告の削除の詳細は、「ADFビジネス・コンポーネントの循環参照に関する必知事項」を参照してください。

3.5.2 ADFビジネス・コンポーネント・ファクトのクラスパスに関する必知事項

表示されたいずれかのクラスパスの「ADFビジネス・コンポーネント・ファクト」ダイアログの「クラスパスの検索」領域に表示されるクラスパス・リストには、プロジェクトで使用できるオブジェクト定義を表示できます。プロジェクトに使用できないクラスパスを使用する必要がある場合は、このダイアログで「クラスパスに追加」をクリックするだけで十分です(非常にまれなケース)。

3.5.3 ADFビジネス・コンポーネントの循環参照に関する必知事項

ADFビジネス・コンポーネント・ファクトには、循環参照が含まれていることがあります。この警告がビジネス・ルール検証ログに表示された場合は、循環参照を手動で解決する必要があります。そのためには、循環参照に関係するいずれかのプロパティの「参照可能」チェック・ボックスの選択を解除する必要があります。

3.5.4 ADFビジネス・コンポーネント・ファクトに関する必知事項

各ADFビジネス・コンポーネント・ファクト・タイプには、各ファクト・インスタンスが表すoracle.jbo.Rowを参照するViewRowImplという名前のプロパティと、この行と親行のキー値セットの取得に使用可能なoracle.rules.sdk2.decisionpoint.KeyChainオブジェクトを指すkey_valuesという名前のプロパティが含まれています。

ADFビジネス・コンポーネントを使用する際の注意事項は、次のとおりです。

- ビュー・オブジェクト定義間の関係は、ビュー定義の属性、特にビュー・リンクのアクセッサである属性のイントロスペクションによって決定されます。
ADFビジネス・コンポーネント・ファクト・タイプ・インポータでは、どの関係が1対1で、どの関係が1対多であるかが正しく判別され、それに従ってディクショナリに定義が生成されます。1対多関係の場合、生成されるプロパティのタイプはListで、実行時に示されたタイプのファクトが含まれています。

- 循環的なタイプ依存性を持つADFビジネス・コンポーネント・ファクト・タイプは使用できません。循環に関係する1つ以上のプロパティの「参照可能」チェック・ボックスの選択を解除して、これらの循環を絶つ必要があります。

- ADFビジネス・コンポーネント・ファクト・タイプはJavaファクト・タイプではなく、ビュー・オブジェクト用に明示的に作成された実装クラスのメソッドは起動できません。
この種のメソッドをコールする必要がある場合は、ビュー・オブジェクト実装をADFビジネス・コンポーネント・ファクト・タイプのかわりにJavaファクト・タイプとしてディクショナリに追加します。この場合、すべてのgetter、setterおよびその他のメソッドが使用可能になりますが、関連するビュー・オブジェクトにアクセスできなくなり、そのオブジェクトへのアクセスが必要な場合は、これらの関係を明示的に管理する必要があるというトレードオフがあります。

- 内部的には、ADFビジネス・コンポーネント・ファクト・タイプはRLファクト・タイプのインスタンスです。
つまり、このことは、ADFビジネス・コンポーネント・ビュー・オブジェクト・インスタンスをルール・セッションに直接アサートすることはできず、かわりにMetadataHelperおよびADFBCFactTypeHelperクラスに用意されているヘルパー・メソッドを使用する必要があることを意味します。詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

3.6 値セットの使用

値セットを作成すると、値リストまたは値範囲のリストを定義して、Oracle Business Rules内のファクトまたはファクト・プロパティについて許容範囲内の値セットを制限できます。値セットは、名前が付けられてデータ・モデルに格納される再利用可能なグローバル値セットとして、または、デシジョン表を定義するときに指定し、1つの条件式にのみ適用されるローカル値セットとして定義できます。

ローカル値セットの使用方法の詳細は、「デシジョン表への条件行の追加方法」を参照してください。

値セットは次のように使用できます。

- 値セットとファクト・タイプ・プロパティを関連付けることができます。これにより、ファクト・プロパティについて許容範囲内の値セットを制限できます。詳細は、「値セットをファクト・プロパティに関連付ける方法」を参照してください。

- 値セットは、いくつかのプリミティブ値(数値、文字列、日付、ブール、または列挙)の値リストまたは値範囲を定義します。値セットは、ファクト・タイプ・プロパティの値に対して固定の選択肢のセット(たとえば、男性または女性など)を提供するために、そのプロパティと関連付けることができます。値セットは、デシジョン表の条件式の値に対して固定の選択肢のセットを提供するために、その条件と関連付ける必要があります。これらの選択肢(値または値範囲)は、デシジョン表の条件セルに入力されます。
デシジョン表の各条件式では、値セットの値または範囲により、複数の可能性を決定できます。値セットを使用すると、条件式のそれぞれの可能性が値または範囲に分けられ、それらでは1つのセルが、値セットの値の1つの値または範囲を指定します(または、セルごとに複数の値または範囲を指定することもできます)。たとえば、色について定義した値セットでは、値または範囲に"blue"、"red"、"orange"といった文字列のリストを含むことができます。整数を含む値セットでは、1未満、1から10、10より上の3つの範囲を持つことができます。詳細は、「デシジョン表への条件行の追加方法」を参照してください。

- グローバル、関数および関数の引数を値セットに関連付けることができます。値セットをグローバルに関連付けると、割り当てられた値が値セットで指定された値に制限されていることを、デザインタイムに検証できます。値セットを関数引数と関連付けると、その関数がその値セット内の値でのみ呼び出されることが検証されます。値セットをこのように使用すると、ルール・デザイナでは、許可されない定数の引数値が割り当てられるか、渡されたグローバル値および関数の引数について検証警告をレポートできます。関数と値セットを関連付けると、その関数がデシジョン表の条件行の式として使用されるときに、その条件行がその値セットを使用するように自動的に設定されます。検証されるのは定数式値のみです。グローバル初期式値および関数パラメータ式値が、関連付けられた値セットに対して必ず検証されるようにするには、その式に関連付けられた「定数」チェック・ボックスを選択します。値セットに関連付けられたグローバルまたは関数の引数に基づく実行時チェックは適用されません。詳細は、「値セットを関数または関数の引数に関連付ける方法」を参照してください。

- デザインタイムの検証に加え、LOV値セットを使用して、IF/THENルールのテストおよびアクションで式の入力時にリストに表示されるオプションを提供できます。詳細は、「値セットを使用してテスト式のオプションを指定する方法」を参照してください。

値セットには次の3つの形式があります。

- LOV: 値リストで定義されます(「値リスト・グローバル値セットの定義方法」を参照)。

- 範囲: 範囲のエンドポイントで定義される値範囲のリストで定義されます(「範囲リスト・グローバル値セットの定義方法」を参照)。

- 列挙: 次のいずれかからインポートされる列挙タイプのリストで定義されます。

- XMLタイプ(「XMLタイプからの列挙タイプ(列挙)値セットの定義方法」を参照)。

- Javaファクト(「Javaタイプからの列挙タイプ(列挙)値セットの定義方法」を参照)。

3.6.1 値リスト・グローバル値セットの定義方法

値リスト値セットでは、その値セットの値または範囲のタイプおよびリストを指定できます。詳細は、「値リスト値セットに関する必知事項」を参照してください。

値リスト(LOV)グローバル値セットを定義する手順は次のとおりです。

1. ルール・デザイナで、「値セット」ナビゲーション・タブを選択します。

2. 図3-9に示すように、「値セットの作成」アイコンの横にあるリストから「値セット」を選択します。

図3-9 値リスト・グローバル値セットの追加

3. 値セットの「編集」ボタンをクリックし、「値セットの編集」ダイアログを表示します。

4. 「値セットの編集」ダイアログの「名前」列に名前を入力します。

値セット名が、いずれのファクト・エイリアスとも同じではないことを確認します。これにより、次に類似した検証エラーが発生します。

RUL-05006: The fact type "Rating" has the same alias as an unrelated value set.

5. 「データ型」列で、リストからデータ型を選択します。

6. 「説明」に入力します。

7. 図3-10に示すように、「編集」ボタンをクリックし、値を追加します。

図3-10 「値セットの編集」ダイアログ

8. 追加する値ごとに、次のように実行します。

- 「値」フィールドに値を入力します。LOV値のStringタイプの値では、3回クリックすると文字列全体を選択できます。これにより、文字列を入力できます。ルール・デザイナによって、引用符なしで同じエイリアスが追加されます。
値セットの「値セット」ダイアログを編集して、値セットのリスト内の値の順序を変更できます。「上に移動」または「下に移動」ボタンをクリックして、順序を変更します。

- 「エイリアス」フィールドに別名を入力します。
エイリアスの指定方法の詳細は、「範囲リスト・グローバル値セットの定義方法」を参照してください。

- 値が許可された値の場合は、「アクションで許可済」フィールドのチェック・ボックスを選択します。
「アクションで許可済」フィールドと「許可されない値をテストに含める」フィールドの詳細は、「値セットの「アクションで許可済」オプションに関する必知事項」を参照してください。

- 「説明」フィールドに説明を入力します。

9. 必要に応じて値セットの「作成」ボタンをクリックし、値をさらに追加します。

10. 「値セットの編集」ウィンドウで「OK」をクリックします。

デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられているLOV値セット内の値または範囲の相対位置を変更することで管理できます。

3.6.2 範囲リスト・グローバル値セットの定義方法

範囲リスト値セットでは、その値セットの値または範囲のタイプおよびエンドポイントを指定できます。詳細は、「範囲値セットに関する必知事項」を参照してください。

範囲リスト(範囲)グローバル値セットを定義する手順は、次のとおりです。

1. ルール・デザイナで、「値セット」ナビゲーション・タブを選択します。

2. 「値セットの作成」ボタンの横にあるリストから「範囲値セット」を選択します。

3. 「データ型」フィールドをダブルクリックします。これによって「値セットの編集」ダイアログが表示されます。「名前」フィールドに値セットの名前を入力します。

4. 「データ型」フィールドで、リストから値セットに適したデータ型を選択します。

5. 「作成」を繰り返しクリックして、値セットに必要な数の値または範囲を追加します。

この手順では、3つの値を追加します。デフォルト値から始めます。デフォルトを変更した後、次の値が存在するようになります。

- 1000より大きい

- 500以上1000以下

- 500未満

ルール・デザイナにより、デフォルト値50、0および負の無限大(-Infinity)で値が追加されます。

6. 「エンドポイント」フィールドで、最初(最上位)の値から始めてデフォルト値をダブルクリックし、最上位の値のエンドポイントを入力して[Enter]を押します。

この例では、最初の値に1000を入力します。

7. 「含まれるエンドポイント」フィールドで、該当するチェック・ボックスを選択して、値のエンドポイントを含めるか除外します。

この例では、値のエンドポイントを含めるために、このチェック・ボックスを選択状態のままにしておくことができます。

8. 「アクションで許可済」フィールドで、該当するチェック・ボックスを選択して、値セットの許可された値に値を含めます。

「アクションで許可済」フィールドと「許可されない値をテストに含める」フィールドの詳細は、「値セットの「アクションで許可済」オプションに関する必知事項」を参照してください。

9. 「エイリアス」フィールドでデフォルト値をダブルクリックし、必要な値エイリアスを入力して[Enter]を押すこともできます。

エイリアスは、この値セットを使用するデシジョン表に表示されます。エイリアスを使用すると、値にデフォルト値(範囲ベースの範囲値)よりもわかりやすい名前を付けることができます。

Oracle Business Rulesのほとんどの名前とエイリアスでは、文字、数字、埋込みの単一スペース、特殊文字($、_、'、.、-、/、:)しか使用できません。ただし、値エイリアスでは、[0..1]などのその他の文字を使用できます。エイリアスにこうした追加の文字が含まれている場合、デシジョン表のアクション・セル内のエイリアスによって値を参照することはできません。この場合は、値名(値とも呼ばれている)を使用できます。

「範囲」フィールドは読取り専用で、値に関連付けられている実際の範囲がエイリアス値に関係なく明確に識別されます。詳細は、「範囲値セットに関する必知事項」を参照してください。

10. 値リストのリスト内を下に移動し、後続の値ごとに、、手順6以降を繰り返します。第2の値の場合、エンドポイント値500を入力します。

11. 「値セットの編集」ダイアログで「OK」をクリックします。

3.6.3 XMLタイプからの列挙タイプ(列挙)値セットの定義方法

XMLスキーマをインポートする際に、XSDに列挙値が含まれていると、ルール・デザイナでは列挙ごとに列挙タイプ値セットが自動的に作成されます。列挙タイプ値セットは読取り専用ですが、バケットの順序は変更できます。

詳細は、「XMLファクトに関する必知事項」を参照してください。

XMLタイプから列挙タイプ(列挙)値セットを定義する手順は、次のとおりです。

1. 必要な列挙を含むXSDを取得します。

次の例に、列挙Statusを含む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>

2. ルール・デザイナでディクショナリを開き、列挙を含む指定のスキーマを使用してXMLファクトを作成します。詳細は、「XMLファクトの使用」を参照してください。

3. 「値セット」ナビゲーション・タブをクリックし、列挙値を選択して値セットを表示します。インポートされるStatus列挙値は、XSD指定された値を持つ値としてインポートされることに注意してください。

値セットの「値セット」ダイアログを編集して、列挙値セットの値の順序を変更できます。「上に移動」または「下に移動」ボタンをクリックして、順序を変更します。

デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられている列挙値セット内の値の相対位置を変更することで管理できます。

3.6.4 Javaタイプからの列挙タイプ(列挙)値セットの定義方法

Java列挙をインポートすると、ルール・デザイナではJava列挙ごとに列挙タイプの値セットが自動的に作成されます。列挙タイプ値セットは読取り専用ですが、バケットの順序は変更できます。

Javaファクトから列挙タイプ(列挙)値セットを定義する手順は、次のとおりです。

1. 必要な列挙を含むJavaクラスを作成または取得します。

次のコード例に、列挙OrderSizeを含むRejectPurchaseItem.javaクラスを示します。

package com.example;

public class Class1

{

public enum OrderSize { SMALL, MEDIUM, LARGE };

public Class1()

{
}
}

2. ルール・デザイナでディクショナリを開き、Javaクラスを使用してJavaファクトを作成します。詳細は、「Javaファクトの使用」を参照してください。

3. ルール・デザイナで「値セット」ナビゲーション・タブをクリックし、Enum値セットを選択します。

値セットの「値セット」ダイアログを編集して、列挙タイプ値セットの値の順序または範囲を変更できます。「上に移動」または「下に移動」ボタンをクリックして、順序を変更します。

デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられている列挙値セット内の値または範囲の相対位置を変更することで管理できます。

3.6.5 値リスト値セットに関する必知事項

デシジョン表では、条件式に関連付けられている値セット内の値の順序によって条件セルの順序が決まり、したがってルールの順序も決まります。デシジョン表でのルールの順序付けは、条件式に関連付けられている値リスト値セット内の値の相対位置を変更することで管理できますが、範囲の順序は変更できません。

図3-11は、値リストを使用した色を指定する値セットのルール・デザイナでの値セット定義を示しています。

図3-11 値リストを使用した値セット定義

図3-11に示すように、デフォルトの値リスト値セットでは、otherwiseという値が値リスト(LOV)に含まれています。このotherwiseという値は、他のすべての値と性質が異なり、他の値または範囲を持たないすべての値タイプと一致します。したがって、値リストのotherwiseを使用すると、値セットを使用する条件式はすべての値を処理可能になり、指定したタイプのすべての値と一致するようになります。この場合の一致は、定義された値か、otherwise値のいずれかに対するものです。otherwise値をLOV値セットから削除できませんが、「アクションで許可済」チェック・ボックスを選択解除して除外することはできます(otherwiseを除外すると、値セット内の値リストに存在しない値を割り当てようとすると、検証警告が表示されます)。

表3-3に、ルール・デザイナでLOV値セットについてサポートされている値セット値を示します。

表3-3 LOV値セットに対してサポートされているタイプ

型

説明

Javaプリミティブ型

int、double、boolean、char、byte、short、longおよびfloatが含まれます。

String

String型が含まれます。

Time、DateTime、Date

現行ロケールのTime, DateTime, and Dateタイプが含まれます。

注意:

デシジョン表でブール型を使用する場合、LOV値セットを指定する必要はありません。ブール型の場合、Oracle Business Rulesには可能な値(trueおよびfalse)用の組込み値または範囲が用意されています。

3.6.6 範囲値セットに関する必知事項

範囲リスト値セットに値または範囲を追加すると、現在選択している値および次に上位の値に基づいて値が計算されます。エンドポイント値を変更すると、値は自動的に値セット内でソートされるため、新規値の追加先はどこでもかまいません。ただし、ルール・デザイナでは、現行の値セットのエンドポイント値とそのエンドポイント値の間に値がない場合があります。この場合、ルール・デザイナでは次の書式の検証警告が表示されます。

RUL-05849: Valueset has duplicate bucket value "4999"

この問題を解決するには、値のエンドポイントを変更し、重複する値を削除する必要があります。

表3-4に、ルール・デザイナで範囲値についてサポートされているタイプを示します。

表3-4 範囲値に対してサポートされているタイプ

型

説明

選択したプリミティブ型

int、double、short、longおよびfloatが含まれます。

Time、DateTime、Date

現行ロケールのTime, DateTime, and Dateタイプが含まれます。

「範囲」フィールドに関する次の規則に注意してください。

- 論理演算子: 正または負の無限大に関する範囲を指定します。たとえば、>=25は25以上で正の無限大を意味し、<18は負の無限大から18未満を意味します。

- 大カッコ「[」: このエンドポイント値を含む範囲を指定します。たとえば、[18..25)は18以上25未満を意味します。

- 丸カッコ「)」: このエンドポイント値を除く範囲を指定します。たとえば、(18..25]は18より大きく25以下を意味します。

3.6.7 値セットの「アクションで許可済」オプションに関する必知事項

値セット内の値または範囲を定義する際、許可されていない値に対応する一部の値または範囲を定義できます。たとえば、運転者の年齢の値セットの場合、通常、0より小さい値を含む値は許可しません。したがって、運転者のデータを持つファクトに、運転者の年齢の値セットに関連付けられている年齢プロパティが含まれる場合は、年齢プロパティが-1などの値に設定されているファクトを作成または変更できないようにする必要があります。値セットで、有効な値に対して「アクションで許可済」を選択し、無効な値に対してこのオプションの選択を解除します。

値セット・オプション「許可されない値をテストに含める」により、デシジョン表の条件およびルールのテストで「アクションで許可済」が選択されているかどうかに関係なく、すべての値を含めることができるようになります。すべての値または範囲を含めることで、不正な値を明示的にテストできます。オプション「許可されない値をテストに含める」を使用すると、次のような2つのケースに対応できます。

1. Oracle Business Rules Engineの入力データがクリーンで、無効なデータ(負の年齢など)が含まれていない場合。この場合、「許可されない値をテストに含める」の選択を解除する必要があります。注意: age < 0を「アクションで許可済」に設定しないのは、これにより、modify(driver, age: -1))のような無効な値を使用するアクションを作成しようとした場合に、デザインタイムの検証警告が提供されるためです。詳細は、「値セットをルールのオプション値の制約として使用する方法」を参照してください。

2. ルールのテストやデシジョン表で、除外した値を検討したい場合があります。この場合、「許可されない値をテストに含める」を選択する必要があります。これは、Oracle Business Rules Engineの入力データがクリーンでなく、無効なデータ(無効な負の年齢など)が含まれているような場合に役立ちます。すべての値セットのアクションを提供するデシジョン表では、除外した値のケースを含めて、エラー・ファクトのアサートなど、適切なアクションを提供することもできます。この処理のためには、値セット内のすべての値の「アクションで許可済」フィールドを選択するか、「アクションで許可済」フィールドの構成をそのままにして「許可されない値をテストに含める」フィールドを選択できます。「許可されない値をテストに含める」フィールドを使用すると、便利で、すべての値を再構成する必要がないだけでなく、「アクションで許可済」の構成が保持されるため、簡単にこの値セットを再使用して最初のケースを処理できます(「許可されない値をテストに含める」の選択を解除していない場合)。

3.6.8 値に関する必知事項

値セットに値を入力する場合、入力する値は、その値セットに指定されたタイプに対して有効であることが必要です。入力した値が値セット・タイプに無効であると、ルール・デザイナで引用符が追加され文字列になります。入力されたデータが指定タイプに対して適切でない場合、引用符を追加することによってのみ有効なリテラルとなります。たとえば、intタイプのLOV値セットで2.2という値を入力すると、ルール・デザイナから次のような警告が表示されます。

RUL-05833: Invalid characters "2.2" in value

この問題を解決するには、値に有効な値(この場合は値2など)を入力するか、値セットのタイプを変更します。

別の例として、値に値を入力する場合、たとえばデータ型がshortの値セットで値を入力し、値999999の値を追加すると、ルール・デザイナによってこれに"999999"という値が割り当てられます。Shortの最大値は32767です。この場合、データ型がshortの値セットに対して「String」は有効な値ではないため、前述の例と同様に値に関する警告が表示されます。これを解決するには、すべての値に対して適切な値(この例では、32767以下の値)を入力します。

3.7 値セットのビジネス条件との関連付け

グローバル値セットを定義した後、データ・モデルの一部をそのグローバル値セットに関連付けることができます(それらのタイプに互換性がある場合)。これにより、デシジョン表を定義する際、「条件」領域にある条件セルに値セットを自動的に割り当てることができます。また、値セットがビジネス条件に関連付けられている場合、Oracle Business Rulesでは、ルールでビジネス条件の式の値に対する制約として定義した値または範囲が使用されます。

次の4種類のビジネス条件を値セットに関連付けることができます。

- ファクト・プロパティ

- 関数の結果

- 関数の引数

- グローバル値

3.7.1 値セットをファクト・プロパティに関連付ける方法

デシジョン表を作成する準備のため、グローバル値セットをデータ・モデル内のファクト・プロパティに関連付けることができます。

値セットをファクト・プロパティに関連付ける手順は次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 編集するファクト・タイプを選択し、「編集」ボタンをクリックします。選択したファクト・タイプに適した「ファクトの編集」ダイアログが表示されます。

3. 「プロパティ」表の「値セット」の下で、適切なファクト・プロパティのセルを選択し、プロパティに関連付ける値セットをリストから選択します。図3-12に示す例を参照してください。

図3-12 プロパティの値セットの定義

4. 「ファクトの編集」ページで「OK」をクリックします。

3.7.2 値セットを関数または関数の引数に関連付ける方法

デシジョン表を作成する準備のため、グローバル値セットをデータ・モデル内の関数に関連付けることができます。

値セットを関数の戻り値に関連付ける手順は、次のとおりです。

1. Rules Designerで、「関数」タブを選択します。

2. 編集する関数を選択します。これにより、選択された関数について、関数の引数および関数本体が表示されます。

3. 「関数」表の「値セット」の下でセルを選択し、使用する値セットをリストから選択します。図3-13に示す例を参照してください。

図3-13 関数の戻り値に対する値セットの定義

3.7.2.1 値セットを関数の引数に関連付ける方法

値セットを関数の引数に関連付ける手順は、次のとおりです。

1. Rules Designerで、「関数」ナビゲーション・タブを選択します。

2. 編集する関数を選択します。これにより、選択された関数について、関数の引数および関数本体が表示されます。

3. 「関数」表の「引数」領域で、適切な引数を選択します。

4. 指定されている引数に対して「値セット」の下でセルを選択し、使用する値セットをリストから選択します。

3.7.3 値セットをグローバル値に関連付ける方法

デシジョン表を作成する準備のため、グローバル値セットをデータ・モデル内のグローバル値に関連付けることができます。

値セットをグローバル値に関連付ける手順は、次のとおりです。

1. Rules Designerで、「グローバル」ナビゲーション・タブを選択します。

2. 編集対象のグローバル値を選択します。

3. 「グローバル」表の「値セット」の下で、適切なグローバル値のセルを選択し、グローバル値に関連付ける値セットをリストから選択します。図3-14に示す例を参照してください。

図3-14 グローバル値に対する値セットの定義

4 ルールセットとルールの使用

この章では、ルールセットと呼ばれるOracle Business Rulesデータ・モデル要素について説明します。これは、1つ以上のルールまたはデシジョン表をグループ化するために使用します。ディクショナリ、ネスト・テスト、単純およびツリー・モードのルール、式ビルダーの使用方法についても説明します。

この章の内容は以下のとおりです。

- ルールセット、ルールおよびビジネス・フレーズの使用の概要

- ルールセットの使用

- ルールの使用

- 動詞ルールおよびビジネス・フレーズの概要

- ディクショナリの検証

- ルールおよびデシジョン表での詳細設定の使用

- ネスト・テストの使用

- 拡張モードのルールの使用

- 拡張テストの使用

- ツリー・モードのルールの使用

- Date Facts_ Date Functions_の使用および有効日の指定

- 式ビルダーの概要

- 値セットをルールのオプション値の制約として使用する方法

- ランタイム・ルールの変更内容のリポジトリからJDeveloperへのインポート

- データ・モデルが深い場合のルールのモデル化方法

詳細は、「ルールセットとは」を参照してください。

4.1 ルールセット、ルールおよびビジネス・フレーズの使用の概要

ビジネス・ルールを使用して、ビジネスの重要な意思決定やポリシーを定義します。

これらの意思決定およびポリシーの例を、次に示します。

- ビジネス・ポリシー: 消費ポリシーおよび承認マトリックスなど

- 制約: 有効な構成や規制上の要件など

- 計算: 割引、割増またはスコアなど

- 判断機能: 顧客の額に基づくオファーなど

Oracle Business Rulesでは、ルールの作成に複数の方法が用意されています。

- IF/THENルール: ルールはIF/THEN文で示されます。IF/THENルールには2つのモデル化方法があります。一般的なルールでは、擬似コード言語を使用して、ルール・ロジックを表します。動詞ルールでは、自然言語文を使用してルール・ロジックを表します。

- デシジョン表では、複数の関連するルールがスプレッドシート形式の単一ビューに表示されます。

ビジネス・フレーズは、動詞ルールのテストおよびアクションの構成のための自然言語のボキャブラリの提供に使用されます。一般ルールでは使用されません。

この章には、IF/THENルールの使用の詳細も含まれています。デシジョン表の使用の詳細は、「デシジョン表の使用」を参照してください。

4.2 ルールセットの使用

ルールセットは、ルールおよびデシジョン表の実行単位となります。また、ルールの共有単位でもあり、ルールはルールセットに属します。複数のルールセットを順番に実行できます。この処理は、ルール・フローと呼ばれます。順序はルールセット・スタックによって決まります。この順序は、ルールセットをスタックにプッシュおよびスタックからポップするルール・アクションによって操作できます。ルールセットでは、ルール優先度によって、ルールを起動する順序が指定されます。

ルールセットには、ルールセットがいつアクティブになるのかを制御する有効日指定も含まれています。ルールセットは次のようにすることができます。

- 常にアクティブ

- 時間範囲中はアクティブ

- 日付範囲中はアクティブ

- 時間および日付範囲中はアクティブ

4.2.1 ルールセットの作成方法

ルールおよびデシジョン表はすべて、ルールセット内に作成されます。ルールセットにより、ルールとデシジョン表が1つの実行単位として編成されます。

ルール・セットを作成するには、次のようにします。

1. ルール・デザイナで、「ルールセット」タブに移動します。

2. 「ルール・セットの作成」ボタンをクリックします。これにより、「ルール・セットの作成」ダイアログが表示されます。

3. 「名前」フィールドに名前を入力します。

注意:
ビジネス・ルールまたはルール・セット、あるいは他のルール・オブジェクトの名前に. (ドット)を含めることはできません。

4. 「説明」フィールドに説明を入力します。

5. 「OK」をクリックします。

4.2.2 ルールセットの有効日の設定方法

有効日のサポートにより、ルールセット、ルールまたはデシジョン表の開始日と終了日を指定できます。ルールセットの場合、有効日では、ルールセット内のルールおよびデシジョン表が有効な日付の範囲を定義します。有効日の詳細は、「Date Facts_ Date Functions_の使用および有効日の指定」を参照してください。

ルールセットの有効日を設定する手順は、次のとおりです。

1. 「ルールセット」タブから、ルールセット名を選択します。

2. 図4-1に示すように、ルールセット名の横にあるナビゲーション・ボタンをクリックしてルールセット情報を開き、ルールセットの「名前」、「説明」および「有効日」フィールドを表示します。

図4-1 「有効日」フィールドが表示されているルールセット

3. 「有効日」エントリを選択します。図4-2に示すように、「有効日の設定」ダイアログが表示されます。

図4-2 「有効日の設定」ダイアログの使用

4. 「有効日の設定」ダイアログを使用して、ルールセットの有効日を指定します。「日付の設定」ボタンをクリックすると、「開始」および「終了」フィールドのデータ入力に役立つカレンダが表示されます。

ルールセット、ルールまたはデシジョン表の有効開始日または有効終了日、あるいはその両方を指定できます。ルールセットの有効日を指定する方法は、「ルールセットの有効日の設定方法」を参照してください。

4.2.3 ルールの有効日の設定方法

ルールの有効開始日または有効終了日、あるいはその両方を指定できます。

ルールの有効日を設定する手順は、次のとおりです。

1. 「ルールセット」ナビゲーション・タブで、ルールセット名を選択します。

2. ルールセット内のルールを選択します。

3. ルール名の横にある「詳細設定の表示」をクリックします。

4. 「有効日」フィールドを選択します。「有効日の設定」ダイアログが表示されます。

5. 「有効日の設定」ダイアログを使用して、ルールの有効日を指定します。「日付の設定」ボタンをクリックすると、「開始」および「終了」フィールドのデータ入力に役立つカレンダが表示されます。

6. 「有効日の設定」ダイアログで、「OK」をクリックします。

4.2.4 フィルタを使用してルールセット内で一致するルールを表示する方法

ルールセット内のルール数が増加するにつれて、ルール・リストのナビゲートが困難になる可能性があります。ルール・デザイナに対して、ルール・リストをフィルタして必要なルールのみを表示するように指示できます。たとえば、アクティブなルールのみ、または検証警告のあるルールのみを表示できます。

ルール作成の詳細は、「ルールの使用」を参照してください。

フィルタを使用してルールセット内で一致するルールを表示する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. ルールのフィルタ設定を表示するには、図4-3に示すように、ルールセット名の横にある「フィルタ問合せの表示」をクリックします。

図4-3 ルール・セットでのフィルタ問合せの表示または非表示

3. 「フィルタ問合せ」フィールドで「<テストの挿入>」をクリックしてデフォルトのテストを挿入します。

4. デフォルトのテストを構成します。
この場合、図4-4に示すように、「<オペランド>」をクリックすると、表4-1に示すルール固有のオプションから選択できます。

表4-1 ルールのフィルタ問合せのオペランド

オペランド

説明

name

ルール名と照合します。

description

ルールの説明と照合します。

priority

ルールの優先度と照合します。詳細は、「ルールの優先度の設定方法」を参照してください。

start date

ルール開始日と照合します。詳細は、「有効日に関する必知事項」を参照してください。

end date

ルール終了日と照合します。詳細は、「有効日に関する必知事項」を参照してください。

minutes until start date

ルール開始日までの指定の時間(分)と照合します。詳細は、「有効日に関する必知事項」を参照してください。

minutes until end date

ルール終了日までの指定の時間(分)と照合します。詳細は、「有効日に関する必知事項」を参照してください。

days until start date

ルール開始日までの指定の日数と照合します。詳細は、「有効日に関する必知事項」を参照してください

days until end date

ルール終了日までの指定の日数と照合します。詳細は、「有効日に関する必知事項」を参照してください

years until start date

ルール開始日までの指定の年数と照合します。詳細は、「有効日に関する必知事項」を参照してください

years until end date

ルール終了日までの指定の年数と照合します。詳細は、「有効日に関する必知事項」を参照してください

is active

ルールがアクティブかどうかと照合します。詳細は、「アクティブ・オプションの選択方法」を参照してください。

is valid

ルールに検証警告があるかどうかと照合します。詳細は、「ルール検証」を参照してください。

referenced fact types

1つ以上のファクト・タイプと照合します。

図4-4 フィルタ問合せのオペランド

詳細は、「動詞ルールでのテストの定義方法」を参照してください。

5. 演算子を選択し、比較演算子を選択します。たとえば、名前についてはオペランド・リストから「次を含む」を選択できます。

6. フィルタ・テストの右の比較オペランドを入力します。たとえば、文字列Policyを入力します。

7. フィルタ問合せが完成した後、フィルタをルールセット内のルールに適用できます。

a. フィルタを適用にするには、「フィルタ・オン」チェック・ボックスを選択します。
ルール・デザイナでは、図4-5に示すように、フィルタ問合せに一致するルールのみが表示されます。

図4-5 ルール・セットでのフィルタ問合せの有効化

b. フィルタ問合せを無効化するには、「フィルタ・オン」チェック・ボックスの選択を解除します。
ルールセット内のすべてのルールが表示されます。

c. フィルタ問合せを削除するには、それを選択し、[Del]を押すか「フィルタのクリア」をクリックします。

4.2.5 リストからコンポーネント値を選択するときのオート・コンプリートの使用

ルール・デザイナを使用すると、ビジネス・ルールの次のコンポーネントの値を簡単に設定できます。

- 式

- 条件

- オペランド

- アクション

これらのコンポーネントを編集するには、Rules Editorでそのコンポーネントをクリックして、ドロップダウン・リストまたはツリーから必要な値を選択します。リストの最上部にあるテキスト領域に、必要な値の名前を入力することもできます。テキストの入力を開始すると、図4-6のように、オプションのリストがフィルタされます。

図4-6 オート・コンプリート機能の使用

この図では、入力したテキストで始まるオプションのみが表示されています。

4.3 ルールの使用

ファクトを処理し、Oracle Business Rulesで処理できる暫定的な結論を取得するためのビジネス・ルールを作成します。ルールセット内にルールを作成するため、ルールを使用する前にルールセットを作成する必要があります(または、デフォルトのルールセットを使用します)。

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

ルールは、設計時にテストでき、アプリケーションをデプロイする必要はありません。詳細は、「ルール関数を使用したデシジョン関数のテスト」を参照してください。

ルール・デザイナのルール検証は、不適切または不完全なルールについて警告が表示されるため、ルールを使用する際に役立ちます。検証ログ・ウィンドウを表示するには、「検証」ボタンをクリックするか、または「表示」→「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。ルールをテストまたはデプロイする前に、すべての警告を修正する必要があります。ルール検証の詳細は、「ルール検証」を参照してください。

ルールセット内のルール数が増加するにつれて、ルール・リストをフィルタして必要なルールのみを表示するようにルール・デザイナを構成できます。詳細は、「フィルタを使用してルールセット内で一致するルールを表示する方法」を参照してください。

4.3.1 一般的なルールの追加方法

一般的なルールを作成するには、まずルールをルールセットに追加してから、テストとアクションを挿入します。アクションはパターン照合に関連付けられます。実行時に、ルールの「IF」領域にあるテストが一致すると、Rules Engineにより「THEN」のアクションがアクティブ化され、ルールに関連付けられているアクションの実行が準備されます。

デフォルトでは、ルール・デザイナによって、一致するファクトごとに起動されるルールが作成されます。同じファクト・タイプが2回以上一致するか、まったく一致しないというルールなど、他のオプションを有効化するには、「拡張モード」を選択します。拡張モードおよび詳細設定の表示の詳細は、「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

ルールセットに一般的なルールを追加する手順は次のとおりです。

1. ルール・デザイナで、「ルールセット」タブを選択し、「+」をクリックします。

2. 「概要」タブの「一般的なルール」パネルで「+」をクリックします。または、「一般的なルール」タブで、「ルールの作成」または「作成」(「+」)をクリックします。

たとえば、図4-8に示すように、「ルールの作成」をクリックしてRule_1という名前のルールを追加します。

図4-7 ルール・セットへのルールの追加

注意:
ルールを削除するときは、必ずルール・エディタで削除ボタンをクリックしてください。左側のツリー・ナビゲーションで削除すると、ルールが完全に削除されません。

4.3.2 動詞ルールの追加方法

動詞ルールは、一般的なルールと類似した形式で作成され、実行されます。ただし、いくつかの相違があります。

動詞ルールを作成するには、まずルールをルールセットに追加してから、テストとアクションを挿入します。動詞ルールを定義する際は、ビジネス・フレーズを追加します。これは、システムから自動的に導出することも、ユーザーが定義することもできます。ビジネス・フレーズは、ルールを記述する前でも後でも定義できます。

動詞ルールでは、拡張モードもツリー・モードもサポートされていません。

ルールセットに動詞ルールを追加する手順は次のとおりです。

1. ルール・デザイナで、「ルールセット」タブを選択し、「+」をクリックします。

2. 「概要」タブの「動詞ルール」パネルで「+」をクリックします。または、「動詞ルール」タブで、「動詞ルールの作成」または「作成」(「+」)をクリックします。

たとえば、図4-8に示すように、「動詞ルールの作成」をクリックしてVerbalRule1という名前のルールを追加します。

図4-8 ルール・セットへの動詞ルールの追加

4.3.3 ルールでのテストの定義方法

ルール内でテストを作成するには、ファクトに対する条件を追加します。たとえば、年間消費額プロパティを持つCustomerOrderサンプル・ファクトを使用し、顧客に関連付けられている年間消費額に基づいて、顧客の注文が高額消費に関連付けられているかどうかを判別するテストを追加できます。値セットを使用して、ルール内のテストおよびアクションの値を制限できます。詳細は、「値セットをルールのオプション値の制約として使用する方法」を参照してください。

図4-9に、このサンプル・ルールを示します。

図4-9 ルールへのテストの追加

実行時には、このルールが処理される際に、Rules Engineにより、一致するファクトを検索するように定義したルール・パターン・テストを基準にしてファクトがチェックされます。このサンプル・ルールRule_1の場合、ファクトが一致すると、Rules Engineによりファクトが変更されて、値プロパティが「High」に変更されます。

ルール内でテストを定義する手順は、次のとおりです。

1. ルール・デザイナで、「ルールセット」タブから「+」をクリックし、使用するルールを追加または選択(たとえば、Rule_1を選択)します。

2. 図4-14に示すように、ルールの「IF」領域には左<operand>と右<operand>が含まれています。

図4-10 左オペランドと右オペランドを使用するルール・テスト

3. ルールで、「<テストの挿入>」をクリックし、たとえば、「簡易テスト」を選択します。

4. テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。図4-15に示すように、テキスト入力領域とリストが表示されます。

図4-11 ルール内のテストの左オペランドの構成

a. 値を入力するには、リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。

b. リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。
対応するオペランドのタイプと一致する値を入力する必要があります。たとえば、テストIF CustomerOrder.annualSpending > <operand>の場合、<operand>に有効な値は、CustomerOrderフィールドのannualSpendingのタイプと一致する必要があります。

5. テストでは、表示される演算子を必要な論理演算子で置き換えるか、またはデフォルト(==)を受け入れます。そのためには、デフォルトの==演算子を選択します。フィールドとリストが表示されます。左オペランドのデータ型に応じて、リストには追加の演算子が含まれる場合もあります。たとえば、文字列をテストする場合、左側でStringオペランドを選択すると、図4-16に示すように、追加のString演算子(startsWithおよびequalsIgnoreCaseなど)が使用できるようになります。

図4-12 ルール内のString演算子の構成

同様に、左オペランドと右オペランドの間の論理条件をテストするには、論理演算子==(等号)、!=(等しくない)、>(より大きい)、>=(以上)、<(より小さい)、<=(以下)から1つ選択します。演算子の詳細は、「Oracle Business Rulesの組込みクラスと関数」を参照してください。

6. テストでは、右オペランドを値で置き換えます。
<オペランド>プレースホルダを、オペランドに使用できるように構成します。

たとえば、図4-13に示すように、テキスト入力領域に>25と入力し、[Enter]を押します。

図4-13 ルール内のテストの右オペランドの構成

4.3.4 動詞ルールでのテストの定義方法

動詞ルールでテストを作成するには、導出されたまたはユーザー定義のビジネス・フレーズを選択するか、新しいユーザー定義のビジネス・フレーズ(詳細は後で指定する)を記述します。

動詞ルール・テストにテキストを入力する際は、ルール・エディタによって、関連するビジネス・フレーズのドロップダウン・リストが表示されます。

動詞ルール内でテストを定義する手順は、次のとおりです。

1. ルール・デザイナで、新しい動詞ルールを追加するか、使用する動詞ルールを選択します。

2. 図4-14に示すように、ルールの「IF」領域にはプレースホルダ「<テストの挿入>」が含まれています。

図4-14 左オペランドと右オペランドを使用するルール・テスト

3. ルールで、「<テストの挿入>」をクリックし、表示されたテキスト入力ボックスでテストの入力を開始します。

4. テキスト(たとえば、policyなど)を入力する際は、図4-15に示すように、関連するビジネス・フレーズのリストが表示されます。必要なものを選択します。

図4-15 動詞ルールでのテストの構成

5. 必要に応じてリストを調整できます。さらに多くの選択肢を表示するには、ビジネス・フレーズを選択して[Tab]キーを押します。次に示すように、選択したものに関連するビジネス・フレーズがリストに移入されます。

図4-16 動詞ルールでの推奨ビジネス・フレーズの調整

6. ビジネス・ルールに'{value}'などのパラメータがある場合、それらをクリックしてそれらの詳細を指定します。

7. 新しいビジネス・フレーズを記述した場合、そのルールはドラフト・モードになっています。「ビジネス・フレーズ」タブでビジネス・フレーズを定義します。詳細は、「ビジネス・フレーズの作成方法」を参照してください。

4.3.5 Oracle Business Rulesテスト変数に関する必知事項

Oracle Business Rulesテスト変数を使用すると、ルールおよびデシジョン表の条件やアクションで発生する冗長な式を短縮できます。変数およびその値は、インラインのビジネス条件定義と表現されることがあります。テスト変数は、インライン・エイリアスとも呼ばれます。

テスト変数を挿入するオプションは、ルール条件セクションの<insert test>の横にリストとして表示されます。ルール条件の定義の一部として、複雑な式、数学式または関数に対するコールアウトを表す変数を定義できます。

たとえば、SongというXMLファクトがあり、composerという属性にsizeという関数があるとします。この属性を参照するときには、Song.composer.size()を毎回使用するのではなく、次のように単純な変数を定義できます。

lo = Song.composer.size()

これ以降、テストでは、式の一部にloを使用できます。簡単なものから複雑な式まで、あらゆる式にすることが可能です。たとえば、関数の本体で、<insert action>をクリックすると、使用可能なオプションの一部として式を表示できます。

図4-17は、テスト変数を表示しています。

図4-17 ルールのテスト変数

インライン・エイリアスを定義したら、それ以降のテスト条件では、オペランドのリスト内でインライン・エイリアスを使用できます。インライン・エイリアスの範囲は、そのインライン・エイリアスが定義された特定のルールにおけるそれ以降のテストに制限されます。ネスト・テストの場合でもインライン・エイリアスを使用できます。ネスト・テストは、そのエイリアスを定義したベース・テストの一部だからです。このことは、ネスト・テスト内で定義するすべてのテストにあてはまります。インライン・エイリアスの範囲は、ベース・テストとそのネスト・テストの条件に対して制限されるだけでなく、そのルールのアクションに対しても制限されます。インライン・エイリアスがネスト・テストの条件の一部として定義され、メインのテスト条件の一部としては定義されていない場合でも、このエイリアスは、メインのネスト・テスト内部または外部のそれ以降のすべてのテスト条件に対して使用できます。

ただし、ネストされていないテスト内部でインライン・エイリアスを定義した場合は、このインライン・エイリアスの範囲は、ネストされていないテスト内部のそれ以降のテストのみに制限され、ネストされていないテストの外部のどのテストにも制限されません。

インライン・エイリアスは、If-Thenルールとデシジョン表のどちらでも使用できます。デシジョン表では、拡張モードで、パターンを表示または非表示にしたり、「<パターンの挿入>」をクリックしてパターンを入力できます。パターンを挿入したら、テストを挿入できます。標準モードでは、テストを表示または非表示にしたり、<insert test>をクリックしてテストを入力できます。

注意:

「拡張モード」機能は、下位互換性のためにのみ維持されています。簡易モードで拡張テストを使用し、必要な任意の種類の条件を作成することをお薦めします。

拡張モードで実行できることはすべて、簡易モードで実行できます。拡張モード・ルールは、単に「拡張モード」チェック・ボックスの選択を解除することで同等の簡易モードに変換できます。

詳細は、「拡張テストの使用」を参照してください

4.3.6 ルールでの範囲テストの定義方法

ルール内で範囲テストを作成するには、ファクトに対する条件を追加します。たとえば、年間消費額プロパティを持つCustomerOrderサンプル・ファクトを使用し、顧客の注文額が上位の範囲と下位の範囲のどちらに該当するかを判別するテストを追加できます。

次にこのサンプル・ルールの概要を示します。

IF
CustomerOrder.annualSpending between 100 and 2000
THEN
Modify CustomerOrder.value = "Normal"

実行時には、このルールが処理される際に、Rules Engineにより、一致するファクトを検索するように定義したルール・パターン・テストを基準にしてファクトがチェックされます。

ルール内で範囲テストを定義する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. 「表示」フィールドで「IF/THENルール」(Rules Designerのデフォルト)を選択します。

3. 使用するルールを追加または選択します。たとえば、Rule_1を選択します。

4. 「Rule_1」の「IF」領域で、「<テストの挿入>」を選択します。

5. ルールの「IF」領域のテストには左<operand>と右<operand>が含まれています。

6. 範囲テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。図4-18に示すように、テキスト入力領域とリストが表示されます。

図4-18 ルールへのテストの左オペランドの追加

a. 値を入力するには、リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。

b. リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。対応するオペランドのタイプと一致する値を入力する必要があります。
たとえば、テストIF CustomerOrder.annualSpending > <operand>の場合、<operand>に有効な値は、CustomerOrderフィールドのannualSpendingのタイプと一致する必要があります。

7. 範囲テストでは、between演算子を選択します。そのためには、デフォルトの==演算子を選択します。テキスト入力領域とリストが表示されます。図4-19に示すように、「between」を選択します。

図4-19 ルール内の範囲テストの演算子の構成

これにより、さらに2つの<operand>プレースホルダが追加されます。

8. 他のオペランドの場合と同様に、これらの<operand>プレースホルダを構成します。
この例では、このテストがtrueになるのは、左端のオペランド(CustomerOrder.annualSpending)が値100と2000の間にある場合です。

4.3.7 ルールでのセット・テストの定義方法

ルール内でセット・テストを作成するには、ファクトに対する条件を追加します。たとえば、ライン品目プロパティを持つCustomerOrderサンプル・ファクトを使用し、ライン品目が任意の製品セットに属しているかどうかを判別するテストを追加できます。

次にこのサンプル・ルールの概要を示します。

IF
CustomerOrder.lineItem.sku in 12345, 43255, 76348
THEN
Modify CustomerOrder.value = "High"

実行時には、このルールが処理される際に、Rules Engineにより、一致するファクトを検索するように定義したルール・パターン・テストを基準にしてファクトがチェックされます。

ルール内でセット・テストを定義する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. 「表示」フィールドで「IF/THENルール」(Rules Designerのデフォルト)を選択します。

3. 使用するルールを追加または選択します。たとえば、Rule_1を選択します。

4. 「Rule_1」の「IF」領域で、「<テストの挿入>」を選択します。

5. ルールの「IF」領域のテストには左<operand>と右<operand>が含まれています。

6. セット・テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。図4-20に示すように、テキスト入力領域とリストが表示されます。

図4-20 ルールへのテストの左オペランドの追加

a. 値を入力するには、リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。

b. リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。

7. セット・テストでは、in演算子を使用します。そのためには、デフォルトの==演算子を選択します。テキスト入力領域とリストが表示されます。図4-21に示すように、「in」を選択します。

図4-21 ルール内のセット・テストの演算子の構成

これにより、図4-22に示すように、さらに2つの<オペランド>プレースホルダがカンマ区切りリスト形式で追加され、<挿入>プレースホルダも追加されます。

図4-22 セット・テストのin演算子

リストに別のオペランドを追加するには、「<挿入>」をクリックします。

リストからオペランドを削除するには、オペランドを右クリックして「テスト式の削除」を選択します。

8. 図4-23に示すように、<オペランド>プレースホルダをオペランドに使用できるように構成します。

図4-23 ルール内のセット・テストのオペランドの構成

このテストがtrueになるのは、左端のオペランド(CustomerOrder.lineItem.sku)の値が12345、43255または76348の場合です。

4.3.8 一般的なルールでのアクションの定義方法

ルールを作成するには、テストおよびアクションを挿入します。アクションはパターン一致と関連しています。ルールの「IF」領域にあるテストが一致すると、Rules Engineにより「THEN」のアクションがアクティブ化され、ルールに関連付けられているアクションの実行が準備されます。

アクションを追加する場合は、表4-2に示すいずれかのフォームのアクションを使用します。表4-2に示す各フォームでは、ルール・デザイナが表示するオプションは状況依存なので、使用するリストおよび項目の数は、追加するアクション、およびアクションの入力中の選択内容に応じて異なる可能性があります。表4-2には基本のアクションが示されています。拡張モードでは追加のアクションを使用できます。拡張モードの詳細は、「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

一般的なルール内でアクションを定義する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. 一般的なルールの「THEN」領域で、「<アクションの挿入>」を選択します。図4-27に示すように、「アクションの追加」リストが表示されます。

図4-24 ルールへのModifyアクションの追加

3. 「アクションの追加」リストで、追加するアクションのタイプを選択します。たとえば、「modify」を選択します。テキスト領域にアクション名を入力することもできます。テキストの入力を開始すると、使用可能な選択肢のリストが自動的にフィルタされます。この機能は、使用可能なオプションの数が多い場合に便利です。

assert、call、modifyの範囲の必要なアクションを、if、else、elseif、while、for、if (advanced)、while (advanced)のような条件アクションにも追加できます。

4. 「THEN」領域で、「<ターゲット>」を選択してオプション・リストを表示します。図4-25に示すように、「RequestedProduct」を選択します。

図4-25 ルールへのModifyアクションの追加とターゲットの選択

5. 「<プロパティの編集>」を選択します。「プロパティ」ダイアログが表示されます。

6. 図4-26に示すように、「プロパティ」ダイアログで、「値」列に"High"と(二重引用符を含めて)入力し、[Enter]を押します。

図4-26 ルールへのModifyアクションのプロパティと値の追加

7. 「プロパティ」ダイアログで、「閉じる」をクリックします。これにより、ルールが表示されます。

4.3.8.1 一般的なルールの基本アクション

表4-2 ルール・アクションのオプション

アクション・フォーム

説明

assert New

新規ファクトをアサートします。

assign,

新規ファクトをアサートします。

call

関数をコールします。

modify

一致したファクトに関連付けられているデータ値を変更します。

retract

ファクトを取り消します。

assert

ファクトをアサートします。

asset tree

ルートが指定されたファクトのツリーをアサートします。

assign new

新しいファクトを割り当てます。

expression

式を実行します。

return

returnアクションは、関数またはルールのアクション・ブロックから戻ります。ルール内のreturnアクションはルールセット・スタックをポップするため、実行は現在ルールセット・スタックの最上部にあるルールセットからのアジェンダに対するアクティブ化に進みます。

RL

入力したOracle RL式を使用します。

synchronized

synchronizedアクションは、複数スレッドのアクションの同期化に役立ちます。synchronizedアクション・ブロックを使用すると、指定したオブジェクトのロックを取得してからアクション・ブロックを実行し、次にロックを解放できます。

throw

例外をスローします。例外はjava.lang.Throwableを実装するJavaオブジェクトである必要があります。スローされた例外は、tryアクション・ブロック内のcatchによって捕捉される場合があります。

try

Oracle RLのtry、catchおよびfinallyは、構文もセマンティクスもJavaに類似しています。catch句またはfinally句が1つ以上必要です。

if、else、elseif、for、while

条件アクション。

4.3.9 動詞ルールでのアクションの定義方法

一般的なルールと同様に、動詞ルールを作成するには、テストおよびアクションを挿入します。動詞ルールのテストおよびアクションは、主としてビジネス・フレーズで構成されています。

動詞ルール内でアクションを定義する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. 動詞ルールの「THEN」領域で、「<アクションの挿入>」を選択します。図4-27に示すように、ビジネス・フレーズの追加リストが表示されます。

図4-27 動詞ルールへのアクションの追加

3. ビジネス・フレーズ・リストで、推奨ビジネス・フレーズのリストを表示するアクションの入力を開始します。

アクションをフレーズにする方法がよくわからない場合は、キーワードを入力することもできます。たとえば、特定の方法で割増を計算する必要がある場合、calculate Premiumと入力すると、関連するビジネス・フレーズが表示されます。

図4-28 動詞ルールへのアクションの追加

4. 必要を満たすビジネス・フレーズがある場合は、それを選択します。

5. ビジネス・フレーズのリストをさらに調整するには、使用するものに関連するものを選択し、[Tab]キーを押します。

調整済のビジネス・フレーズのセットが含まれたリストが表示されます。目的のフレーズを選択します。

図4-29 動詞ルールへのアクションの追加

6. リスト内のビジネス・フレーズが必要を満たさない場合は、ビジネス・フレーズを入力し、「新規ビジネス・フレーズの追加」を選択して新しいビジネス・フレーズをインスタンス化します。「ビジネス・フレーズ」タブで、ビジネス・フレーズの定義を完了します。

4.3.10 ルール・アクションに関する必知事項

条件の値がアクションによって変更された場合に、ルールのループが発生することがあります。ループは、単一ルール内のルール間、複数のデシジョン表全体、または同一ルールセット内のルールおよびデシジョン表全体で発生する場合があります。ルール条件内で使用されるファクト・プロパティを変更するルール・アクションは作成しないようにする必要があります。このようなルールによって、実行時に無限ループが発生する場合があります。

4.3.11 Oracle Business Rulesのパフォーマンス・チューニングに関する必知事項

ほとんどの場合、ルールを記述する際にパフォーマンスに注意を払う必要はありません。ただし、ルールのパフォーマンスを向上および最大化するのに役立つヒントがありますので、必要に応じて利用してください。

Oracle Business Rulesのパフォーマンス・チューニングの詳細は、『パフォーマンスのチューニング・ガイド』のOracle Business Rulesパフォーマンス・チューニングに関する項を参照してください。

4.4 動詞ルールおよびビジネス・フレーズの概要

動詞ルールはビジネス・フレーズと連携して機能することで、ルールの柔軟なオーサリングを可能にし、自然言語文を使用して、会話言語と同様のドメイン固有文でルール・ロジックを表現できるようにします。

ビジネス・フレーズは、動詞ルールの文構成で使用される条件の背景となるロジックを提供します。

動詞ルールのテストおよびアクションは、導出されたビジネス・フレーズおよびユーザー定義のビジネス・フレーズを使用して作成できます。導出されるビジネス・フレーズは、ファクト、グローバルおよびディクショナリのその他の情報を使用して自動的に作成されますが、ユーザー定義のフレーズは、明示的に作成して導出されたフレーズを補うことができます。さらに、ユーザー定義のフレーズは、事前作成することも、動詞ルールの構成時に必要に応じて作成することもできます。

動詞ルールの作成時は、提案されたビジネス・フレーズを使用したり、その場で独自にインスタンス化して後で実装詳細を指定することもできます。また、最初に動詞ルールで必要なビジネス・フレーズを作成してから、動詞ルールを完成する方法もあります。

4.4.1 ビジネス・フレーズの使用

ビジネス・フレーズは、ルール・デザイナの「ビジネス・フレーズ」タブで作成します。

ビジネス・フレーズは次の3つの部分で構成されています。

- パラメータ: ビジネス・フレーズに渡すことができる変数のタイプを定義するパラメータ

- 値: パラメータのプレース・ホルダ(存在する場合)などのビジネス・フレーズの式

- マッピング: ビジネス・フレーズの条件を定義するロジックの定義

ビジネス・フレーズには2つのタイプがあります。

- テスト・ビジネス・フレーズ: 条件を定義します。これらは、一般的なルールのIF部分と同じタイプのロジックを提供します。詳細は、「ルールでのテストの定義方法」を参照してください。

- アクション・ビジネス・フレーズ: 動詞ルールのテスト・ビジネス・フレーズによって定義された条件が満たされた場合に実行するアクションを定義します。これらは、一般的なルールのTHEN部分と同じタイプのロジックを提供します。詳細は、「動詞ルールでのアクションの定義方法」を参照してください。

4.4.1.1 「ビジネス・フレーズ」タブ

テストおよびアクションのビジネス・フレーズは、図4-30に示すように、どちらもルール・デザイナの「ビジネス・フレーズ」タブで作成します。

図4-30 「ビジネス・フレーズ」タブ

このタブには、次のセクションがあります。

- 「ビジネス・フレーズ」リスト

- パラメータ

- 値

- マッピング

「ビジネス・フレーズ」リスト

「ビジネス・フレーズ」リストには、ディクショナリに含まれるビジネス・フレーズが表示されます。

ツールバー・コントロールを使用して、検索によるリストをフィルタリング、リストをリフレッシュ、新しいテストまたはアクションのビジネス・フレーズを追加、および現在選択されているビジネス・フレーズを削除します。

このリストには、ビジネス・フレーズおよびそれらの属性(「値」、「フォーム」および「ドラフト」)が表示されます。

ビジネス・フレーズをドラフトとしてマークするには、直接、リスト内の「ドラフト」チェック・ボックスを選択します。

検証エラーが含まれているビジネス・フレーズには、赤い波線のアンダースコアでマークされます。それらの上にカーソルを移動するとポップアップにエラーが表示されます。

パラメータ

「パラメータ」パネルを使用してパラメータを表示および編集します。

「挿入」をクリックし、ビジネス・フレーズの値にパラメータを追加します。「追加」および「削除」を使用してパラメータを作成および削除します。

「フォーム」属性は、パラメータのタイプを定義します。選択肢は次のとおりです。

- 値: 非定型の値。選択した場合、「タイプ」をboolean、byte、char、double、float、int、long、shortまたはStringから選択できます。

- 変数: そのビジネス・フレーズのスコープ内ですでに定義されている変数。選択した場合、「タイプ」を、ディクショナリ内の定義済ファクト・タイプの1つから選択できます。

- 式: 式を入力します。

値

「値」パネルで、ビジネス・フレーズの定義を編集します。値は、「ビジネス・フレーズ」リストのビジネス・フレーズ、および動詞ルールを作成する場合の選択肢リストに表示されるビジネス・フレーズの表示名としても使用されます。

マッピング

「マッピング」パネルでビジネス・フレーズの条件の論理定義を編集します。ビジネス・フレーズのマッピングには、ビジネス・フレーズのロジックが一般的なルールとして作成された場合のものと類似した論理コンストラクトが含まれています。ビジネス・フレーズのマッピングの作成にも適用される原則と手順は、「ルールの使用」のテストとアクションの説明を参照してください。

4.4.1.2 ドラフトのビジネス・フレーズと動詞ルール

ビジネス・フレーズは、ドラフト・ステータスとしてマークできます。

ビジネス・フレーズのドラフト・ステータスは、ビジネス・フレーズ・リストの「ドラフト」を選択または選択解除することで設定またはオーバーライドできます。

動詞ルールのドラフト・ステータスは参照するビジネス・フレーズから導出され、直接は操作できません。動詞ルールにドラフトとマークされたビジネス・フレーズが含まれる場合、このルールもドラフトとしてマークされます。図4-31に示すように、動詞ルールの説明パネルは単色の青に変更され、「ドラフト」という語がルール名の横に表示されます。動詞ルールで参照しているすべてのビジネス・フレーズからドラフトのマークがなくなった場合、動詞ルールのドラフト・ステータスは解除されます。

図4-31 ドラフトとマークされている動詞ルール

ドラフトのビジネス・フレーズおよび動詞ルールは、検証されず、実行用のディクショナリにも含まれません。これにより、ビジネス・フレーズおよび動詞ルールの改良時にも、ディクショナリの使用またはテストの続行が可能になります。

動詞ルールの作成時には、ディクショナリにまだ存在していないビジネス・フレーズを構成できます。これらは、ビジネス・フレーズのリストに自動的に追加され、ドラフトのマークが付けられ、さらに動詞ルールもドラフトとしてマークされます。

4.4.2 ビジネス・フレーズの作成方法

ビジネス・フレーズは「ビジネス・フレーズ」タブで作成します。ビジネス・フレーズは、動詞ルールの記述中に指定し、後で「ビジネス・フレーズ」タブでその定義を完成することもできます。

「ビジネス・フレーズ」タブを使用して、ビジネス・フレーズを追加、変更、および削除します。

新しいビジネス・フレーズを作成する手順は次のとおりです。

1. ルール・デザイナで、「ビジネス・フレーズ」タブを選択し、「作成」(「+」)をクリックしてテスト・ビジネス・フレーズを作成します。「テスト・ビジネス・フレーズ」または「アクション・ビジネス・フレーズ」を選択します。

新しいビジネス・フレーズが作成されます。

2. 「値」パネルで、ビジネス・フレーズの定義を入力します。未定義のパラメータのプレースホルダは、その名前を中カッコで囲んで入力することで組み込むことができます。次に例を示します。

{customer} is single

3. 「パラメータ」パネルで、パラメータを定義します。「作成」(+)をクリックして、新しいパラメータを追加します。その名前をダブルクリックし、編集します。その「フォーム」と「タイプ」を指定します。必要に応じて「値セット」を指定します。

4. ビジネス・フレーズの値にパラメータを追加するには、「挿入」をクリックします。

5. 「マッピング」パネルで、ビジネス・フレーズのマッピングを定義します。「<テストの挿入>」をクリックして開始します。テストを選択し、オペランドを指定します。必要に応じてさらにテストを追加します。

4.4.2.1 ビジネス・フレーズの作成シナリオの例

この例の場合、ほとんどのプロジェクト定義が完了している保険見積りプロジェクトがあると想定します。多くの場合、顧客がマイナーであるかどうか調べるためと、保険契約を無効化するためのテストをするビジネス・フレーズを追加する必要があります。

新しいテスト・ビジネス・フレーズを作成し、値{customer} is a minorを指定します。

次に、パラメータcustomerを定義し、それを前に定義したCustomerファクトにマッピングします。

ここで、条件を指定するマッピングを指定します。「<テストの挿入>」をクリックし、簡易テストを選択します。左の「<オペランド>」をクリックし、「customer」を開いて、「customer.age」を選択します。右のオペランドをクリックし、値21を指定します。

テスト・ビジネス・フレーズは、次の図4-32のようになります。

図4-32 テスト・ビジネス・フレーズの例

ここで、アクション・ビジネス・フレーズを作成し、控除を高い値に設定し、それに値Set High Deductibleを指定します。

policyという変数を作成し、それを、前に定義したPolicyファクトにマッピングします。

「マッピング」パネルで「<テストの挿入>」をクリックし、「式」を選択します。「<式>」をクリックすると、式エディタが表示されます。policy.deductibleに移動し、それを選択し、「式に挿入」をクリックします。= 2000で式を完成し、「OK」をクリックします。

アクション・ビジネス・フレーズは、次の図4-33のようになります。

図4-33 アクション・ビジネス・フレーズの例

4.4.2.2 ビジネス・フレーズの変換

ディクショナリに追加されたビジネス・フレーズの「値」属性は、元が導出されたビジネス・フレーズであったかユーザー定義のビジネス・フレーズであったかに関係なく、変換できます。

「ビジネス・フレーズ」タブで、変換するビジネス・フレーズを選択し、「値」パネルで「変換バンドルの編集」をクリックします。表示された「バンドル・エディタ」ダイアログで変換を編集します。

4.4.3 動詞ルールにおけるビジネス・フレーズの選択または追加

動詞ルールは、ビジネス・フレーズを使用してIFおよびTHENテストおよびアクションを指定します。

動詞ルールでテストまたはアクションを定義するときに、選択肢のドロップダウン・リストをトリガーするテキストを入力します。このリストから、ディクショナリに既存のビジネス・フレーズの選択、ビジネス・フレーズの自動生成、入力内容に基づく新規ビジネス・フレーズのインスタンス化を実行し、後から「ビジネス・フレーズ」タブで実装詳細を指定できます。

4.4.3.1 動詞ルール作成時の新規ビジネス・フレーズのインスタンス化

新規動詞ルールの作成時に、ドロップダウン・リストから選択するのではなく、テストまたはアクションに入力することによって、新規ビジネス・フレーズをインスタンス化できます。これらのビジネス・フレーズはドラフトとマークされ、このフレーズを使用する動詞ルールもドラフトとマークされます。

次の例では、目的のビジネス・フレーズCustomer is low riskがテストとして入力されています。このビジネス・フレーズは、ドロップダウン・リストには表示されません。これは自動的に生成されたものではなく、事前にディクショナリで定義されていません。

図4-34 ルールへの新しいビジネス・フレーズの追加

動詞ルールがドラフトとしてマークされます。

図4-35 新しいビジネス・フレーズが追加され、ルールがドラフトとしてマークされる

ビジネス・フレーズはドラフトとしてマークされ、「ビジネス・ルール」リストに追加されます。パラメータ(存在する場合)およびマッピング情報を指定する必要があります。

図4-36 ドラフトとマークされている動詞ルールから追加されたビジネス・フレーズ

4.4.3.2 動詞ルール作成時のビジネス・フレーズの選択

テストまたはアクションの作成時に、以前のユーザー定義ビジネス・フレーズと自動生成された導出ビジネス・フレーズの両方が含まれ、関連性に従ってソートされた堅牢なリストが自動的に提示されます。

ユーザー定義および導出されたビジネス・フレーズは、ドロップダウン・リストで相互を区別できません。

4.4.3.3 導出されたビジネス・フレーズ

導出されたビジネス・フレーズは、ベースとなっているディクショナリで定義されたとおりのビジネス・オブジェクトおよびデータ・モデルに基づいて、自動的に作成されます。これらは、システムがユーザーによる入力に基づいてユーザーが作成しようとしていると計算したものに基づいて、その場で作成されます。これらは、動詞ルールに追加されていない場合は永続化されません。

導出されたビジネス・フレーズは、動詞ルールに追加されると、単なる通常のビジネス・フレーズになり、パラメータおよび変換がサポートされます。

4.4.3.4 リストに表示するビジネス・フレーズの選択

「設定」タブ→「ディクショナリ設定」→「フレーズ提案」→「値」ドロップダウンを使用して、動詞ルールのテストおよびアクションの作成中に表示されるドロップダウン選択リストに表示されるビジネス・フレーズのタイプを制御します。

選択肢は次のとおりです。

- すべて: ディクショナリ内のユーザー定義ビジネス・フレーズと導出されたビジネス・フレーズの両方を表示します。

- 自動提案: 導出されたビジネス・フレーズのみを表示します。

- ビジネス・フレーズ: ディクショナリからのユーザー定義のビジネス・フレーズのみを表示します。

4.5 ディクショナリの検証

ディクショナリを変更すると、ルール・デザイナではディクショナリ検証が実行されます。ルールまたはデシジョン表の使用時には、ルール・デザイナによる検証が役立ちます。

検証ログ・ウィンドウを表示するには、「検証」ボタンをクリックするか、または「表示」→「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。これにより、不正または不完全なルールに関する警告が表示されます。ルールをテストまたはデプロイする前に、すべての警告を修正する必要があります。

ディクショナリが無効な場合、ルール・デザイナでは警告メッセージのリストが生成されて関連ディクショナリ・オブジェクトがリスト表示されます。検証メッセージ情報は、ディクショナリ・オブジェクトの検索と問題の解決に使用できます。また、検証警告のあるオブジェクトには、図4-37に示すように検証インディケータ(赤い波線による下線)のフラグが付きます。

図4-37 ログと画面に波線による下線で表示された検証警告

ディクショナリが無効な場合は、そのディクショナリを保存できます。ただし、RL Languageを生成できるのは、有効でルール・デザイナの検証ログに警告が表示されないディクショナリの場合のみです。

検証ログでは、各検証メッセージに次の情報が含まれています。

- メッセージ: メッセージは、Oracle Business Rules例外に関する問題の詳細説明を提供します。

- ディクショナリ・オブジェクト: このフィールドには、ディクショナリのコンポーネントの識別に必要な詳細を示すパスが表示されます。

- プロパティ: 警告メッセージに関連するオブジェクトの、プロパティに関する情報を提供します。

検証ログの表示中に、項目を選択し、右クリックしてリストから「エディタでオブジェクトを選択して強調表示」を選択すると、カーソルが移動し、ディクショナリ・オブジェクトが選択されます。一部の検証警告の場合、この機能を使用できないことに注意してください。

4.5.1 データ・モデル検証

ディクショナリを変更すると、ルール・デザイナではディクショナリ検証が実行されます。ルール・デザイナにより警告メッセージが表示された場合、検証ログには、検証警告の原因となったディクショナリ・オブジェクトの検索に役立つメッセージが含まれています。たとえば、次の文字列は、警告がRLFact_1というデータ・モデル・オブジェクトから発生していることを示しています。また、問題はtest_intというプロパティにあります。

CarRental/Data Model/RLFact_1/test_int/Expression

表4-3に、検証メッセージで指定されたディクショナリ・オブジェクト名の各部を示します。

表4-3 検証ログ内のデータ・モデルのディクショナリ・プロパティ

名前

説明

CarRental

ディクショナリ名

Data Model

ディクショナリ内のデータ・モデル・コンポーネント

RLFact_1

データ・モデル内の要素名

test_int

指定された要素内のプロパティ名

Expression

プロパティの式部分

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

- ルール検証の理解

- デシジョン表の検証の理解

- ディクショナリの検証方法

4.5.2 ルール検証の理解

「検証」ボタンをクリックすると、ルール・デザイナにより検証ログが表示されます。ルールを初めて追加すると、図4-38のような検証警告が表示されます。

図4-38 新しいルールに対するビジネス・ルール - ログ検証メッセージ

ルールに関する検証メッセージのディクショナリ・オブジェクト名部分には、検証警告に関連するルールセット、ルールおよびルール内の領域を識別できるように詳細が含まれています。たとえば、次のディクショナリ・オブジェクト指定は問題を示しています。

OracleRules1/Ruleset_2/Rules_1/Pattern[1]

検証メッセージでは、ルールのディクショナリ・オブジェクト名に1から始まる索引が使用されます。したがって、最初のパターンはPattern[1]です。

ルールを検証するのみでなく、デザイン時にルール・デザイナでテストすることもできます。詳細は、「ルール関数を使用したデシジョン関数のテスト」を参照してください。

4.5.3 デシジョン表の検証

「検証」ボタンをクリックすると、ルール・デザイナにより検証ログが表示されます。デシジョン表を初めて追加したときは、図4-38に示すように、新しいルールに対して表示されるものに類似した検証警告が表示されます。

図4-39 新しいデシジョン表に対するビジネス・ルール - ログ検証メッセージ

デシジョン表に関する検証メッセージのディクショナリ・オブジェクト名部分には、デシジョン表のうち検証警告に関連する領域を識別できるように詳細が含まれています。たとえば、次のディクショナリ・オブジェクト指定は、デシジョン表の最初のアクション行と最初のアクション・セルに問題があることを示します。

OR1/Ruleset_1/DecisionTable_1/Action[1]/Action Cell[1]

検証メッセージでは、デシジョン表オブジェクトのディクショナリ・オブジェクト名に1から始まる索引が使用されます。たとえば、「条件」領域の第1行の第1条件セルを示すメッセージは次のようになります。

OracleRules1/Ruleset_1/DecisionTable_2/Condition[1]/Condition Cell[1]

この指定は、デシジョン表の「条件」領域のうち、第1行にあるラベルR1が付いたルールの条件セルを示しています。

4.5.4 ディクショナリの検証方法

ディクショナリを変更すると、ルール・デザイナではディクショナリ検証が実行されます。

ディクショナリを検証する手順は、次のとおりです。

1. ルール・デザイナで、「検証」ボタン(チェックマーク)をクリックします。

2. メッセージ領域からビジネス・ルール - ログを選択します。

3. 検証ログの表示中に、項目を選択し、右クリックしてリストから「エディタでオブジェクトを選択して強調表示」を選択すると、カーソルが移動し、ディクショナリ・オブジェクトが選択されます。一部の検証警告の場合、この機能を使用できないことに注意してください。

4.6 ルールおよびデシジョン表での詳細設定の使用

ルールおよびデシジョン表の詳細設定では、詳細オプションを提供する機能を使用できます。これらのオプションは、すべてのOracle Business Rulesユーザーに必要なものではありません。

図4-40に詳細設定機能を示します。

図4-40 詳細設定の表示/非表示

次の機能が含まれます。

- 拡張モード: ルール内でその他のパターン一致オプションおよびネスト・テストを使用できます。拡張モードは、前に使用したことがある場合にのみ使用してください。簡易モードで拡張テストを使用し、必要な任意の種類の条件を作成することをお薦めします。
詳細は、次を参照してください。

- ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法

- 拡張モード・オプションの選択方法

- 拡張モードのルールの使用

- 単純モード: 更新済であり、複雑なルールを構築する場合に使用する必要があります。拡張モードは、前に使用したことがある場合にのみ使用してください。「拡張モード」機能は、下位互換性のためにのみ維持されています。
詳細は、「拡張テストの使用」を参照してください。

- ツリー・モード: マスター・ディテール階層(親子リレーションシップにマップされるネストされた要素)を容易に使用できるようにします。このようなファクト間の親子関係は、XMLおよびADFビジネス・コンポーネント・ファクト・タイプにおいて一般的です。このオプションは、「拡張モード」オプションと併用できます。
詳細は、「単純ツリー・モードのルールの作成方法」を参照してください。

- アクティブなルール: ルールまたはデシジョン表がアクティブであるか非アクティブであるかを指定します。「アクティブなルール」が選択解除されている場合、指定したルールまたはデシジョン表はルール・デザイナによって検証されません。
詳細は、「アクティブ・オプションの選択方法」を参照してください。

- 論理: ルールを起動するファクトとルールによりアサートされるファクト間の論理的な依存関係を有効化または無効化できます。
詳細は、「論理オプションの選択方法」を参照してください。

- 「ギャップの許可」: (デシジョン表の詳細設定でのみ使用可能)。このチェック・ボックスでは、デシジョン表でギャップが検出された場合に検証メッセージをレポートするかどうかを指定します。その場合の検証メッセージを次に示します。

RUL-05852: Decision Table has gaps

詳細は、「デシジョン表のギャップ・チェック」および「デシジョン表のギャップ・チェックの実行方法」を参照してください。

- 優先度: ルールまたはデシジョン表の優先度を指定します。ルールセット内では、優先度の高いルールが実行されてから、優先度の低いルールが実行されます。
詳細は、「ルールの優先度の設定方法」を参照してください。

- 競合ポリシー: (デシジョン表の詳細設定でのみ使用可能)。デシジョン表の競合ポリシーとして、次のいずれかを指定します。

- 手動: 競合ルールごとに競合解決を手動で指定することで、競合を解決します。

- 自動オーバーライド: 自動競合解決ポリシーを使用して、可能な場合に、オーバーライド競合解決を使用して競合を自動的に解決します。

- 無視: 競合が無視されます。

詳細は、「デシジョン表の競合分析」を参照してください。

- 有効日: ルールまたはデシジョン表の有効日を指定します。
詳細は、「有効日の指定方法」を参照してください。

4.6.1 ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法

ルール・デザイナでは、各ルール名およびデシジョン表名の横に「詳細設定の表示」または「詳細設定の非表示」ボタンがあり、詳細設定の表示と非表示を切り替えることができます。

ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える手順は、次のとおりです。

1. 詳細設定を表示するルールセット選択します。

2. 「表示」フィールドのリストから、「IF/THENルール」を選択するか、またはデシジョン表を選択します。

a. 詳細設定を表示するには、図4-41に示すように、ルール名の横にある「詳細設定の表示」をクリックします(ルール名の横に、選択されているボタンがあります)。

図4-41 詳細設定の表示または非表示

b. 詳細設定を非表示にするには、ルール名の横にある「詳細設定の非表示」をクリックします。

4.6.2 拡張モード・オプションの選択方法

その他のパターン一致オプションおよびその他のアクションを提供するルールまたはデシジョン表機能を使用するには、「拡張モード」を選択します。詳細は、「拡張モードのルールの使用」を参照してください。

拡張モード・オプションを選択する手順は、次のとおりです。

1. 拡張モードを設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「拡張モード」を選択します。

図4-42および図4-43は、拡張と簡易の各モードで表示されるルールの例です。

拡張モードと簡易モードでは、パターンの存在と不在のために、同じフォームが異なるもののようになります。

図4-42 「拡張モード」を選択

図4-43は、同じルールの「拡張モード」の選択を解除した状態を示しています。

図4-43 「拡張モード」を選択解除

4.6.3 アクティブ・オプションの選択方法

Oracle Business Rulesには、ルールまたはデシジョン表がアクティブであるか非アクティブであるかを指定する機能が組み込まれています。アクティブ・オプションは有効日に関係なく設定され、前に指定した有効日を変更または削除せずに設定できます。「アクティブなルール」の選択が解除されている場合、ルールはルール・デザイナによって検証されません。

アクティブ・オプションを選択する手順は、次のとおりです。

1. 「アクティブなルール」オプションを設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「アクティブなルール」を選択します。

4.6.4 論理オプションの選択方法

「論理」オプションが選択されているルールセットまたはデシジョン表では、生成されるRL Language内のルールで論理プロパティを使用するように指定されています。論理プロパティを使用すると、ルールを起動するファクトとルールによりアサートされるファクト間の論理的な依存関係を有効化または無効化できます。

論理プロパティが有効化されているルールでは、ルール内のアクション・ブロックによってアサートされた全ファクトが、ルール条件内で一致したファクトに依存します。ルールの条件が適用されなくなるなど、ルール条件で参照されていたファクトに変更があると、ルール条件によってアサートされたファクトは自動的に取り消されます。論理プロパティの詳細は、『Oracle Business Process Managementルール言語リファレンス』を参照してください。

ルールセットとデシジョン表の「論理」オプションを使用すると、ルールセットまたはデシジョン表内のルールに関連して生成されたRL Languageに対する論理プロパティを有効化または無効化できます。デフォルトでは、「論理」オプションは選択されません。

論理オプションを選択する手順は、次のとおりです。

1. 「論理」オプションを設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「論理」を選択します。

4.6.5 ルールの優先度の設定方法

ルールまたはデシジョン表の優先度を設定できます。表4-4に示すように事前定義済の名前が付いた優先度のリストから選択する方法と、正または負の整数を入力して独自の優先度レベルを指定する方法があります。ルールセット内では、優先度の高いルールが実行されてから、優先度の低いルールが実行されます。デフォルトの優先度はmedium(整数値0)です。

表4-4 優先度文字列と値のマッピング

名前付き優先度

整数値

最高

3000

より高い

2000

高

1000

中(デフォルトの優先度)

0

低

-1000

より低い

-2000

最低

-3000

ルールの優先度を設定する手順は、次のとおりです。

1. 優先度を設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「優先度」フィールドで、優先度値を指定します。

a. 名前付きの優先度を指定するには、「優先度」リストから名前付きの優先度を選択します。

b. 整数による優先度を指定するには、「優先度」フィールドをクリックして正または負の整数値を入力し、[Enter]を押します。

4.6.6 有効日の指定方法

ルールセット、ルールまたはデシジョン表の有効日を指定できます。

有効日を指定する手順は、次のとおりです。

1. 有効日を設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「有効日」フィールドを選択します。「有効日の設定」ダイアログが表示されます。

4. 「有効日の設定」ダイアログを使用して有効日を設定します。

有効日の使用の詳細は、「Date Facts_ Date Functions_の使用および有効日の指定」および「ルールセットの有効日の設定方法」を参照してください。

4.7 ネスト・テストの使用

ルールまたはデシジョン表では、ネスト・テスト機能を使用して、さらに複雑なテストを作成できます。

ネスト・テストを使用する手順は、次のとおりです。

1. ネスト・テストを使用するルールを選択します。

2. 「IF」領域で、「ネスト・テスト」をクリックして選択します。

3. 図4-44に示すように、テストを選択した状態で、右クリックしてリストを表示します。

図4-44 ルールへのネスト・テストの追加

4. 必要に応じてテストを完成します。

4.8 拡張モードのルールの使用

Oracle Business Rulesでは、Oracle Business Rules機能のサポートを追加する詳細なルールを作成できる機能が提供されます。

注意:

「拡張モード」機能は、下位互換性のためにのみ維持されています。簡易モードで拡張テストを使用し、必要な任意の種類の条件を作成することをお薦めします。

拡張モードで実行できることはすべて、簡易モードで実行できます。拡張モード・ルールは、単に「拡張モード」チェック・ボックスの選択を解除することで同等の簡易モードに変換できます。

詳細は、「拡張テストの使用」を参照してください。

Oracle Business Rulesでは、次のOracle Business Rules機能のサポートを追加する詳細なルールを作成できる機能が提供されます。

- その他のパターン一致オプション(「拡張モードのパターン一致オプションの使用方法」を参照)

- その他の一致したファクト名オプション(「拡張モードの一致したファクト名の使用方法」を参照)

- その他のサポートされるアクション・フォーム(「拡張モードのアクション・フォームの使用方法」を参照)

- パターン一致の集計関数オプション(「拡張モードの集計条件の使用方法」を参照)

詳細は、「拡張モードのルールに関する必知事項」を参照してください。

4.8.1 拡張モードのパターン一致オプションの使用方法

拡張モードのパターン一致オプションでは、ルールの起動時期を指定します。表4-5に、使用可能なオプションを示します。

表4-5 拡張モードのパターン一致オプション

オプション

説明

次の各ケース

これは、デフォルトのパターン一致オプションです。一致が存在するたびに(一致するすべてのケースで)ルールを起動する必要があります。

次のケースがある

このオプションでは、一致が1つ以上存在する場合にルールの起動が1つ選択されます。

次のケースがない

この値では、一致がない場合にルールを1回起動するように指定します。

aggregate

このオプションでは、すべての一致に集計関数を適用するように指定します。詳細は、「拡張モードの集計条件の使用方法」を参照してください。

拡張モードのパターン一致オプションを使用する手順は、次のとおりです。

1. パターン一致オプションを使用するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「拡張モード」を選択します。

4. 図4-45に示すように、テスト・パターンを右クリックして「囲む」を選択します。

図4-45 オプションで囲む

図4-46 「囲む」オプション

「囲む」ダイアログが表示されます。

5. 「囲む」ダイアログからパターン・ブロック・オプションを選択し、「OK」をクリックします。

図4-47に示すように、パターンはデフォルトの「(次の各ケース)」を使用してネスト・パターンで囲まれます。

図4-47 デフォルトのパターン一致オプション: 「次の各ケース」

6. 図4-48に示すように、デフォルトの「(次の各ケース)」オプションを選択し、リストから必要なパターン一致オプションを選択します。

図4-48 詳細パターン一致オプションの追加

4.8.2 拡張モードの一致したファクト名の使用方法

ルールまたはデシジョン表内で一致したファクト名のフィールド(パターンのバインド変数)を使用すると、1つのルールで同じタイプの複数インスタンスをテストできます。一致したファクト名を使用すると、一致したファクトについて一時的な名前を入力してテストで使用できます。たとえば、図4-49に示すルールでは、一致する帽子品目が注文に1つ以上含まれている場合に靴品目に割引が適用されるルールでの、パターンのバインド変数の使用を示しています。

図4-49 パターンのバインド変数を使用するルール

たとえば、図4-50に示すように、顧客の注文で重複している品目を検索するためのルールを作成できます。この例は、ルールでの一致の使用を示しています。

図4-50 注文で重複している品目を検索するルール

拡張モードの一致したファクト名を使用する手順は、次のとおりです。

1. 一致したファクト名を追加するルールまたはデシジョン表を選択します。

2. ルール名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「拡張モード」を選択します。

4. 「<ファクト・タイプ>」を選択し、リストからファクト・タイプを入力します。

5. 図4-51に示すように、表示される一致したファクト名を選択し、必要に応じて変更します。たとえば、一致したファクト名Order$LineItem1を入力して[Enter]を押します。

図4-51 一致したファクトの変数名の追加

6. 図4-52に示すように、ルールを作成します。一致したファクト名をオペランドとして選択できることに注意してください。オペランド「LineItem1」および「LineItem2」を必要に応じて選択し、ルールを作成します。

図4-52 一致したファクト変数名のオペランドとしての選択

図4-52では、テストによって次の行がチェックされます。

RL.get fact ID(Order$LineItem1) > RL.get fact ID(Order$LineItem2)

Order$LineItemという単一のインスタンスが、Order$LineItemファクト・タイプと一致するどのパターンとも一致しないようにします。異なるインスタンスの異なる組合せに対してルールが実行されないように、「>」が必要になります。詳細は、「自己結合を正しく表現するにはどうすればよいですか。」を参照してください。

4.8.3 拡張モードのアクション・フォームの使用方法

拡張モードでルールを作成する場合、Rules Designerでは表4-6に示す使用可能なアクションのリストが表示されます。表4-6に示す各フォームについて、ルール・デザイナで表示されるオプションは状況依存です。このため、アクション・タイプを使用するときに表示されるリストおよび項目の数は状況依存であり、追加するアクション、およびアクションの入力中の選択内容に応じて異なります。

拡張モードのアクション・フォームを使用する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. ルールまたはデシジョン表を選択または追加します。

3. ルールまたはデシジョン表で、ルールまたはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

4. 「拡張モード」を選択します。

5. 挿入領域が表示された状態で、ルールの「THEN」領域で、「<アクションの挿入>」を選択します。図4-53に示すように、アクション・リストが表示されます。

図4-53 拡張モードのルールへのアクションの追加

6. リストで、追加するアクションを選択します。

たとえば、「assign new」を選択します。

7. 「THEN」領域で、アクションの状況依存パラメータを選択し、適切な値を入力します。

4.8.3.1 ルール・デザイナの拡張モード・アクション・オプション

表4-6 拡張モードのアクション・オプション

アクション・フォーム

説明

Assert

ファクトをアサートします

Assert Tree

ルートが指定されたファクトのツリーをアサートします。

Assert New

新規ファクトをアサートします。

Assign

変数に値を割り当てます。

Assign New

新規の変数に値を割り当てます。

Expression

式を実行します。

Call

関数をコールします。

For

Javaに類似したOracle RLにはforループがあります。forループには、変数とコレクションを持つ型が含まれています。型と変数により、ループ内で使用されるコレクション値を保持するループ変数が定義されます。コレクションは、ループ変数に適切な型のコレクションとして評価される式です。forループを使用すると、任意のコレクションを繰り返すことができます。

return、throwまたはhaltによってアクション・ブロックを終了できます。

If

if elseアクションを使用する場合、テストがtrueのときは、最初にアクション・ブロックを実行します。テストがfalseのときは、オプションのelse部分を実行します。これは別のifアクションやアクション・ブロックである場合もあります。Javaと異なり、Oracle RLにはアクション・ブロックが必要であり、単一のセミコロンの終了アクションは許可されていません。

Modify

一致したファクトに関連付けられているデータ値を変更します。

Retract

ファクトを取り消します。

Return

returnアクションは、関数またはルールのアクション・ブロックから戻ります。ルール内のreturnアクションはルールセット・スタックをポップするため、実行は現在ルールセット・スタックの最上部にあるルールセットからのアジェンダに対するアクティブ化に進みます。

rl

入力したOracle RL式を使用します。

synchronized

Javaと同様に、synchronizedアクションは複数のスレッドのアクションを同期化する際に役立ちます。synchronizedアクション・ブロックを使用すると、指定したオブジェクトのロックを取得してからアクション・ブロックを実行し、次にロックを解放できます。

throw

例外をスローします。例外はjava.lang.Throwableを実装するJavaオブジェクトである必要があります。スローされた例外は、tryアクション・ブロック内のcatchによって捕捉される場合があります。

try

Oracle RLのtry、catchおよびfinallyは、構文もセマンティクスもJavaに類似しています。catch句またはfinally句が1つ以上必要です。

while

テストがtrueの間にアクション・ブロックを実行します。return、throwまたはhaltによってアクション・ブロックを終了できます。

4.8.4 拡張モードの集計条件の使用方法

拡張モードでルールを作成する際に、ルール・デザイナではパターン一致集計オプションがサポートされます。1つのみのファクトではなく複数のファクトに基づくルール条件を記述する場合に、集計を使用できます。複数のファクトにわたるビューが条件に含まれている場合は、集計関数を使用します。

拡張モードの集計を使用する手順は、次のとおりです。

1. 集計関数を使用するルールまたはデシジョン表を選択または作成します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「拡張モード」を選択して、使用するファクト・タイプを入力します。

4. 「<パターンの挿入>」を選択してパターンを追加し、そのパターンを選択します。

5. パターンを右クリックして「囲む」を選択します。「囲む」ダイアログが表示されます。

6. 「囲む」ダイアログで、パターン・ブロックを選択します。「OK」をクリックします。

詳細は、「拡張モードのパターン一致オプションの使用方法」を参照してください。

7. パターンで、最初のフィールドを選択します。デフォルトでは、このフィールドには図4-54に示すように「(次の各ケース)」が含まれています。

図4-54 詳細パターン一致オプションの追加

8. aggregateオプションを選択します。図4-55に示すように、集計用の状況依存フィールドが追加されます。

図4-55 ルールでの集計関数の使用

- 「<関数>」をクリックし、リストから関数を選択します。

- 条件で、「<ファクト・タイプ>」をクリックし、リストからファクト・タイプを選択します。

- 「<式>」をクリックし、リストから式を選択します。

ルール・デザイナでは、デフォルトで集計パターンの作成時に変数名が作成されます。作成中のルールに必要な場合は、デフォルトの変数名を置き換える変数名を入力します。図4-56に、集計を使用して完成したルールを示します。この例では、わかりやすくするためにルールには変数名total_costおよびitem_xが表示されています。

図4-56 ルール内で完成した集計関数

9. 必要に応じてその他のテストを入力します。この例では、図4-57に示すように、赤色の品目のテストを入力します。

図4-57 赤色合計コスト・ルールでの集計関数の使用

4.8.4.1 集約関数の使用

表4-7に、使用可能な集計関数を示します。

表4-7 拡張モードのルール用の集計関数

関数

説明

count

一致するファクトのカウント。

average

一致するファクトの平均。

maximum

一致するファクトの最大値。

minimum

一致するファクトの最小値。

sum

一致するファクトの合計。

collection

一致するファクトのリストを作成します。

たとえば、次のような特別な注文を指定するルールを記述します。

IF
an order has more than 5 line items whose price is above a certain value
THEN
the order requires manual approval

5つの明細品目は複数のファクトにわたる場合があります。そのため、count集計関数を使用して、このサンプルの特別な注文規則を記述できます。

集計関数を使用する場合、次の手順を実行します。

- パターンにaggregateを選択します。

- 表4-7に示すリストから関数を入力します。

- 値を入力するか、または状況依存メニューから選択します。

- <variable>: 集計値の名前。

- <expression> 集計する値(driver.age.など)。選択した集計関数がcount関数の場合、<expression>は使用しません。

たとえば、図4-58に示すように、赤色のすべての明細品目のコストの合計を計算できます。

図4-58 赤色合計コスト・ルールでの集計関数の使用

4.8.5 拡張モードのルールに関する必知事項

「拡張モード」のルールを使用する際には、次のような特殊ケースに注意する必要があります。

- 集計を使用する場合、アクションにはパターン変数が表示されません。パターン変数は、「(次の各ケース...)」パターンを使用する場合のアクション・リストにのみ表示されます。したがって、「集計」、「次のケースがある」パターンまたは「次のケースがない」パターンには、パターン変数を表示できません。

- 「拡張モード」を選択すると、詳細パターン一致などの詳細オプションをルールで使用しているかぎり、「拡張モード」は選択状態のままで非アクティブ(グレー表示)になっています。「拡張モード」の選択を解除するには、拡張モード機能を削除するか、または元に戻す必要があります(拡張モードではないルールを作成することからやり直し、その後で拡張モードのルールを削除するほうが容易な場合があります)。

4.8.5.1 拡張モード・オプションをクリアする方法

1. 「拡張モード」の選択を解除するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします(「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. ルールの状態を考慮します。

- ルールを簡素化して「拡張モード」オプションを有効化(「拡張モード」ボタンがグレー表示でなくなり有効になる)できる場合。ルールを簡素化して、「拡張モード」が有効になったら、「拡張モード」の選択を解除します。

- 「元に戻す」を使用して「拡張モード」ルールを作成するために使用した手順を元に戻し、ルールを「拡張モード」ではない状態にできる場合は、この方法を使用してルールを簡素化します。

- ルールを簡素化できない場合は、ルールを削除して再作成します。

4.9 拡張テストの使用

拡張テストは、複雑なルールを構築する場合に使用する必要があります。拡張テスト、つまり簡易モードは、拡張モード・ルールを置き換えます。

注意:

「拡張モード」機能は、下位互換性のためにのみ維持されています。拡張モードの詳細は、「拡張モードのルールの使用」を参照してください。

拡張モードで実行できることはすべて、簡易モードで実行できるようになりました。UIは、図4-59に示すように、複雑なルールおよびテストをより簡単に作成できるように合理化され、向上しています。

図4-59 拡張テストのリスト

拡張モード・ルールは、「拡張モード」チェック・ボックスの選択を解除することで同等の簡易モードに変換できます。

拡張テストは、一般的なルール、デシジョン表、およびビジネス・フレーズの定義中にのみ適用できます。それらは、動詞ルールでは表示されません。

4.9.1 拡張テスト・フォーム

元の4つのテスト(表4-8の最初に示す)に加えて、次の新しいフォームがあります。

表4-8 拡張テスト

フォーム

説明

簡易テスト

これは、条件のビルディング・ブロックです。値を、別の値、範囲またはセットと比較します。

例: Emp.salary > 1000

変数

変数を初期化します。

例: age = Duration.years between(Emp.birthdate,RL.date.get current())

ネスト・テスト(...)

包含ブロック内にテストをカプセル化します。

例: (age > 50 or Emp.salary > 50000)

否定されたテスト(...)

テストを否定します。

例: not(age > 50 and Emp.salary > 50000)

次のすべて

次のすべてがtrueです。

例: (age > 50 and Emp.salary > 50000)

次のいずれか...

次のいくつかがtrueです。例:

IF

e is a Emp and  there is no Emp where     Emp.salary < e.salary     <insert test>  <insert test>THEN  assign e.isLowestPaid = true

は

ファクトを定義します。

例: eはEmpです

ブール式

ブール式をキャプチャします。

例: isEligible(Emp)

次のケースがある

このテストにはANDで接続された1つ以上の子テストがあります。

これらの子テストは、少なくとも1つのケースに対してすべてtrueです。1つのケースは、含まれる「は」テストへのファクトのバインディングです。

「は」子孫を持つ必要があります。

例:

There is a case where

e is a Emp and

d is a Dept and

e.salary > 1000000 and

d.name == "Marketing" and

d.employees contains e

次がある <factType1>,...<factTypeN> 条件#*

このテストにはANDで接続されたN個以上の子テストがあります。

非表示の「<factType>は<factType>」が最初のN個の子としてテストします。

これらの子テストは、少なくとも1つのケースに対してすべてtrueです。

表示される子テストがないことも有効です。その場合、「条件」キーワードは抑止されます。

例:

IF
there is a Emp, Dept where
Emp.salary > 1000000 and
Dept.name == "Marketing" and
Dept.employees contains Emp
THEN
call print "there is a highly paid marketer!"
IF
there is a Emp
THEN  call print "somebody works here!"

次のケースがない

このテストにはANDで接続された1つ以上の子テストがあります。

この子テストはどのケースに対してもtrueになりません(含まれている「は」テストへのファクトのバインディングは、他のどのテストも満たしません)。

「は」子孫を持つ必要があります。

次がない <factType1>,...,<factTypeN> 条件

最初のN個の子としての非表示の「<factType>は<factType>」

これらの子テストは、どのケースに対してtrueになりません。

集計

このテストにはANDで接続された0個以上の子テストがあります。

「は」子を持つ必要があります(非表示の可能性あり)。

v is the sum|average|minimum|maximum|count|collection of<expression> where

表示される子テストがない場合、「条件」句は省略されます。

IF
number of employees is the count of Emp
THEN
call print "number of employees: " + number of employees

IF
number of male employees is the count of Emp where
Emp.gender == "M"
THEN
call print "number of male employees: " + number of male employees

前述の両方のルールで、SDKによって、非表示のネストされた「は」テストがEmpに対して作成されることに注意してください。

明示的な「は」を使用することもできます。

IF
number of male employees is the count of e where
e is Emp and
e.gender == "M"
THEN
call print "number of male employees: " + number of male employees

図4-60は、「次のケースがある」フォームが使用されている例です。

図4-60 拡張テストの例1

図4-61は、「次のケースがない」フォームが使用されている例です。

図4-61 拡張テストの例2

複雑なルールの構築方法の詳細は、「ルールの使用」を参照してください。

4.10 ツリー・モードのルールの使用

ツリー・モードのルールを使用すると、親子関係にマップされるネストされた要素が存在するマスター・ディテール階層を容易に使用できます。

ビジネス・プロセスおよびルールを使用して小売発注書(PO)を処理するアプリケーション部分のライフサイクルについて考えます。発注書には、PO全体に適用される取引条件を含むヘッダーがあります。POには、出荷先のリストも含まれています。各宛先には、住所、宛先の住所に出荷される品目のリストおよび出荷のリストが含まれています。

すべての品目のステータスが出荷済または取消し済である場合に、POが完全に出荷済であるとする、というビジネス・ルールについて考えます。

図4-62に、POの例のサンプルXMLスキーマ表現を示します。POのXML文書はツリー構造になっています。これにより、POの自然な表現が可能になります。たとえば、PO自体は最上位レベルの文書要素であり、宛先は品目要素および出荷要素を含むネストされた要素です。出荷要素にも、注文された品目を参照する品目要素が含まれています。ステータスには、有効な値のリストがあります。

図4-62 ツリー・モードのルールのサンプルのPOスキーマ

次のサンプル発注書(PO)スキーマの例に、図4-62で示したサンプルの発注書のXMLスキーマを示します。

<?xml version= '1.0' encoding= 'UTF-8' ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.org"
targetNamespace="http://www.example.org"
elementFormDefault="qualified">
<xsd:element name="PO">
<xsd:annotation>
<xsd:documentation>A sample element</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="header">
<xsd:complexType>
<xsd:attribute name="status" type="Status"/>
<xsd:attribute name="order-date" type="xsd:date"/>
<xsd:attribute name="customer-value"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="billing">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="address"/>
<xsd:element name="payment"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="destination" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="address"/>
<xsd:element name="item" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="ID"/>
<xsd:attribute name="status"/>
<xsd:attribute name="quantity" type="xsd:int"/>
<xsd:attribute name="availability-date" type="xsd:date"/>
<xsd:attribute name="qoh" type="xsd:int"/>
<xsd:attribute name="price"
type="xsd:decimal"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="shipment" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="item" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="ID"/>
<xsd:attribute name="quantity"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="ship-date"/>
<xsd:attribute name="method"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="status" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="Status">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="open"/>
<xsd:enumeration value="partially shipped"/>
<xsd:enumeration value="fully shipped"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>

4.10.1 サンプルのPOのXMLインスタンス(要約)

例4-1に、POスキーマのインスタンスのXMLの一部を示します。ツリー・モードのルールを使用するために、1つ以上の取引条件をテストするルールを作成でき、テストにパスした場合は1つ以上の取引条件が追加または変更されます。Oracle Business Rulesには、サンプルのPOインスタンスのようなファクト・ツリーでのエラーのないルール作成を有効化する特別なサポートがあります。

たとえば、次のように指定するPOスキーマのインスタンスのルール作成について考えます。

IF the time between the order date and the date for availability of an item is more than 30 days
THEN cancel the item

例4-1 サンプルのPOのXMLインスタンス(要約)

<PO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org ../../../../Temp/PO.xsd"
xmlns="http://www.example.org">
<header/>
<billing>
<address/>
<payment/>
</billing>
<destination>
<address/>
<item ID="a01"/>
<item ID="a02"/>
<item ID="a03"/>
<shipment>
<item ID="a01"/>
<item ID="a02"/>
</shipment>
</destination>
</PO>

4.10.2 ツリー・モードのルール(非拡張モード)

「拡張モード」オプションが選択されておらず、「ツリー・モード」が選択されている場合は、非拡張ツリー・モード、つまり単純ツリー・モードを使用します。このモードでは、ルール・デザイナにより、ルート・ファクト・タイプを入力するROOT: <fact type>が表示されます。

「ツリー・モード」を選択し、「拡張モード」の選択を解除してルールを作成すると、修飾名を使用してツリー内のプロパティを参照できます。次に例を示します。

- PO/destination/item.quantityはitem.quantityに似ていますが、POのdestinationである品目のみが一致します。

- PO$Destination$item.quantityはList<item>を参照します。この参照は、非ツリー・モードから変更されていません。

単純ツリー・モードでは、選択できるのは多対多結合や集計を必要としない条件のみです。

詳細は、「単純ツリー・モードのルールの作成方法」を参照してください。

4.10.3 拡張ツリー・モードのルール

「拡張モード」オプションが選択されており、「ツリー・モード」オプションが選択されている場合は、拡張ツリー・モードを使用します。このモードでは、Rules Designerにより、図4-63に示すように、ルート・ファクト・タイプを入力するROOT: 「<ファクト・タイプ>」が表示されます。ルール・デザイナでは、ツリー構造のファクトのパターンが表示されますが、親ファクトと子ファクトを結合する単純テストは非表示です。

図4-63 拡張ツリー・モード

拡張ツリー・モードでは、ツリー・モードのパターン(ルート以外)は次のように表示されます。

<演算子> <変数> is a <ファクト・パス>

<ファクト・パス>は、ルートから始まる1対1および1対多関係をたどるXPathに類似したパスです。たとえば、各ファクト・パスにはPO/destinationなどの名前が付いており、POはルート・ファクト・タイプで、destinationはタイプListのプロパティです。ファクト・パス内の1対多関係は、PO/destinationのように/で示されます。

ファクト・パス内の1対1関係は、.で示されます。これは非ツリー・モードから変更されていません。たとえば、item.availabilityDateです。

拡張モードはパターンの概念を公開しており、その最も単純な形式はis aパターンです。たとえば、p is a POではpはすべてのPOファクトと繰り返し一致し、d is a p/destinationではdはpのすべてのdestinationと一致します。is aの左側は変数であり、右側はファクト・タイプまたはファクト・パスです。デフォルトでは、Oracle Business Rulesによってファクト・タイプまたはファクト・パスと等しい変数名が設定されます。たとえば、PO is a POです。パターンにはパターン・ブロックを使用することもできます。パターン・ブロックには、ブロック内でネストされたパターンおよびテストに適用される論理数量子、否定または集計があります。

詳細は、「拡張ツリー・モードのルールの作成方法」を参照してください。

拡張ツリー・モードのルールを使用する場合、ルール・デザイナでは、直積を回避しながら、様々な子フォレストからの条件を同じルールに結合するために、集計パターン(有無など)を使用する必要があります。

4.10.4 単純ツリー・モードのルールの作成方法

次の手順で、30日以内に入荷しない品目をキャンセルするPOルールを作成します。

IF the time between the order date and the date for availability of an item is more than 30 days
THEN cancel the item

単純ツリー・モードのルールを作成する手順は、次のとおりです。

1. ルールセットにIF/THENルールを作成し、詳細設定を表示します。

一般的なルールの追加についての詳細は、「一般的なルールの追加方法」を参照してください。

詳細設定の詳細は、「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

2. 「ツリー・モード」を選択します。ROOTの横にある「<ファクト・タイプ>」プレースホルダをクリックし、リストから選択します。

図4-64 単純ツリー・モード: ルートの構成

- 「<テストの挿入>」を選択し、リストから選択します。
IF文がIF <オペランド> == <オペランド>となります。

- 左の「<オペランド>」を選択し、リストからオプションを選択します。

3. 図4-65のように、「式ビルダー」ボタンを選択します。

図4-65 単純ツリー・モードの式の追加

- 「式ビルダー」ダイアログで、「式」領域に表示されている品目をコピーして削除します。

- 式ビルダーで、「関数」タブを選択します。

- ナビゲータで、「Duration」を開き、「daysbetween」関数をダブルクリックします。

- daysbetween引数テンプレートを削除します。

- 「daysbetween」関数の2番目の引数として前に切り取った値を貼り付けます。

- 「式ビルダー」ダイアログで、「変数」タブを選択します。

- 「daysbetween」関数の最初の引数について、ナビゲータを使用して「PO」を開き、「header」を開いて「orderDate」をダブルクリックします。

- 「式ビルダー」ダイアログで「OK」をクリックします。
詳細は、「式ビルダーの概要」を参照してください。

4. リストで、「式」領域で[Enter]を押します。「operator」を選択して>を入力します。

5. 図4-66に示すように、右の「<オペランド>」を選択し、値30を入力して[Enter]を押します。

図4-66 単純ツリー・モード: 右オペランドの値30

- 「<アクションの挿入>」をクリックし、リストから「modify」を選択します。
THEN文がTHEN modify <ターゲット>となります。

- 「<ターゲット>」をクリックし、リストから「PO/destination/item」を選択します。THEN文は次のようになります。

THEN modify PO/destination/item ( <add property> )

- 「<プロパティの追加>」をクリックします。「プロパティ」ダイアログが表示されます。
「プロパティ」ダイアログで、図4-67に示すように、status名に値"canceled"を入力します。

図4-67 単純ツリー・モード: アクション

6. 「プロパティ」ダイアログで、「閉じる」をクリックします。

図4-68に示すように、完成したルールが表示されます。

図4-68 単純ツリー・モードのルールの最終的なルール

modify文では、PO/destination/itemは特定のitemインスタンス・メンバーを参照することに注意してください。

4.10.5 拡張ツリー・モードのルールの作成方法

次の手順で、次のように要約できる送料無料ルールを作成します。

IF the total cost of "free shipping eligible" items to a given destination is greater than $40
THEN shipping of those items is free

拡張ツリー・モードのルールを作成する手順は、次のとおりです。

1. ルールセット内にIF/THENルールを作成します。

詳細は、「一般的なルールの追加方法」を参照してください。

2. 詳細設定を表示します。

詳細は、「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

3. 図4-69に示すように、「拡張モード」を選択し、「ツリー・モード」を選択します。

図4-69 無料出荷用の拡張ツリー・モードのルール

4. 「<ファクト・タイプ>」プレースホルダを選択し、リストから「PO」を選択します。

5. 図4-70に示すように、無料出荷ルールを完成します。

図4-70 拡張ツリー・モードの無料出荷ルール

4.10.6 ツリー・モードのルールに関する必知事項

「ツリー・モード」を選択し、ルート・ファクト・タイプを選択すると、オプション・リストには使用可能なすべてのファクト・タイプが表示されます(ルート・ファクト・タイプの子のみではありません)。これにより、ルート・ファクト・タイプの子以外にも使用可能なすべてのファクト・タイプを表示できます。選択したルート・ファクト・タイプの子のみを表示するようにオプション・リストを制限することはできません。

4.11 日付ファクトの使用、日付関数および有効日の指定

Oracle Business Rulesでは、時刻と日付の操作を容易にする機能が提供され、時刻と日付に基づいてルールがいつ有効かを決定できる有効日機能が提供されます。

- CurrentDateファクトを使用すると、現在の日付を表すファクトに基づいて判断できます。

- 「有効日」を使用すると、ルールセット内のすべてのルールとデシジョン表、個々のルールまたは個々のデシジョン表が有効な日付または日時の範囲を定義する開始日と終了日を指定できます。

表4-9に、使用可能な「有効日」のオプションを示します。

表4-9 有効日に可能な値

有効日

説明

常に有効

「開始」も「終了」も設定しないことを指定します。

開始(「終了」日付設定なし)

特定の日付から不特定の将来にかけて有効です。

終了(「開始」日付設定なし)

現在から特定の日付まで有効です。

「開始」設定と「終了」設定

2つの日付の間のみ有効です。

「常に」以外の有効日指定には、次のいずれかを使用できます。

- 日付のみ指定、時間指定なし: この場合、有効日は各タイムゾーンの指定日の午前0時とみなされます。

- 日付、タイムゾーンを指定、時間指定なし: この場合、有効日は指定のタイムゾーンの指定日の午前0時とみなされます。

- 日付、タイムゾーン、時間を指定: この場合、日付と時間を完全に指定します。

- 時間指定のみで、日付およびタイムゾーン指定なし: すべての日の指定の時間に適用されます。

- 時間とタイムゾーンを指定、日付指定なし: すべての日の指定の時間に適用されます。

4.11.1 現在の日付ファクトの使用方法

ルールまたはデシジョン表で現在の日付ファクトを使用できます。

CurrentDateファクトを使用する手順は、次のとおりです。

1. 「ルールセット」ナビゲーション・タブで、ルールセットを選択します。

2. ルールセット内のルールを選択します。

3. 図4-71に示すように、「IF」領域で、CurrentDateファクトおよびCalendarタイプの日付メソッドを使用する条件を追加します。

図4-71 CurrentDateファクトを使用する条件を持つルール

4.11.2 有効日に関する必知事項

デフォルトでは、Oracle Business Rules Engineにより、CurrentDateファクトおよび有効日に関連付けられるクロックは暗黙的に管理され、それぞれシステム日付の値に設定されます。RL Language関数setCurrentDate()およびsetEffectiveDate()を使用すると、現在の日付および有効日を明示的に設定できます。詳細は、『Oracle Business Process Managementルール言語リファレンス』を参照してください。

有効開始日とは、その日からルール、デシジョン表またはルールセットがルール評価と起動に関連させることができる日のことです。したがって、ルールが有効であれば条件が満たされた場合に起動でき、ルールが有効でなければ条件が満たされるかどうかに関係なく起動しません。

有効終了日とは、その日からルール、デシジョン表またはルールセットがルール評価に関連しなくなる日のことです(有効ではないということは、ルールが起動しないということを意味します)。

有効開始日と有効終了日はデシジョン表に設定できますが、デシジョン表内のルールに対して個別に設定することはできません。

ルールとデシジョン表には、「アクティブなルール」オプションも組み込まれています。このオプションは有効日に関係なく設定され、指定の有効日を変更または削除することなく日付を有効にします。「アクティブなルール」オプションの使用の詳細は、「アクティブ・オプションの選択方法」を参照してください。

ルールセットとルールセット内のルールまたはデシジョン表の両方に対して有効日が定義されている場合、その優先度は次のようになります(最上位の優先度は1です)。

1. ルールセットの「アクティブなルール」オプションの選択が解除されている場合、そのエンティティのRL Languageは生成されません。

2. ルールセットの有効日プロパティの一方または両方が選択されている場合、有効開始日と有効終了日では、ルールセット内に定義されているルールまたはデシジョン表について許可された有効日の範囲が定義されます(つまり、「有効日の設定」ダイアログでルールセットの「開始」チェック・ボックスおよび「終了」チェック・ボックスの一方または両方が選択されている場合)。
したがって、ルールセット内のルールまたはデシジョン表について指定された有効日は、それを含んでいるルールセットによって設定された境界に違反できません。たとえば、ルールには、ルールセットについて指定された有効終了日よりも後の有効終了日を指定できません。

3. 個別のルールまたはデシジョン表の「アクティブなルール」の選択が解除されている場合、そのルールまたはデシジョン表のRL Languageは生成されません。

4. ルールセットの「有効日の設定」ダイアログの「時間」が選択されている場合、またはルールセット内のルールまたはデシジョン表についてこのオプションが選択されている場合、有効日を指定する際にはルールセット内のルールまたはデシジョン表の全インスタンスの「時間」を選択する必要があります。この場合、「両方」または「日付」が選択されている場合は、Rules Designerでは次の検証警告が表示されます。

RUL-05742: Calendar form incompatibility detected with forms Time and DateTime.
If the calendar form is set to Time on a rule set or any of the rules or
decision tables within that ruleset then the calendar form for that entire
rule set is restricted to Time.

4.11.3 Duration、JavaDate、OracleDateおよびXMLDateメソッドの使用方法

Duration、JavaDateおよびXMLDate、OracleDateおよびOracleDuration拡張メソッドをルールまたはデシジョン表で使用できます。詳細は、「Oracle Business Rulesの組込みクラスと関数」を参照してください。

Durationメソッドを使用する手順は、次のとおりです。

1. 「ルールセット」ナビゲーション・タブで、ルールセットを選択します。

2. ルールセット内のルールを選択します(Durationメソッドはデシジョン表で使用することもできます)。

3. 「IF」領域で条件を追加します。

4. ルール条件のオペランドを選択します。

5. リストから「式ビルダー」を選択します。詳細は、「式ビルダーの概要」を参照してください。

6. 式ビルダーで、「関数」タブを選択します。

7. 「式ビルダー」のナビゲータで、「Duration」フォルダを開きます。

8. 間隔テストの必要に応じて、適切なメソッドをダブルクリックして選択および挿入します。

9. 適切な引数をメソッドに指定します。図4-72に示す例を参照してください。

10. 「OK」をクリックしてルールを確認します。

図4-72 ルールでのDurationメソッドの使用

4.12 式ビルダーの概要

Rules Designerの様々な部分から式ビルダーにアクセスできます。たとえば、「グローバルの編集 -」ダイアログや、デシジョン表内で条件を操作するときの「条件」領域、および自由形式の式を選択して拡張モードでルールとデシジョン表を入力するときなどです

式ビルダーを使用して、Oracle Business Rules用の式を作成したり編集できます。

図4-73に、ルール・デザイナの式ビルダーを示します。

図4-73 ルール・デザイナの式ビルダー

4.12.1 式ビルダーの使用方法

式ビルダーでは、「変数」または「関数」ナビゲーション・ツリー、または「演算子」タブ、または「定数」タブで項目をダブルクリックすると、項目は「式」領域の式に挿入されます。また、「式」領域でテキストを入力して、式を直接作成または編集することもできます。

式を入力するときは、「変数」は有効な割当ターゲットであり、「定数」は有効な割当ターゲットではないことに注意してください。そのため、作成する式に追加する項目のタイプが明確ではない場合は、両方のタブを使用する必要があります。

「式」フィールド内の関数にカーソルを置き、挿入する式または関数をダブルクリックして、選択した関数の引数を指定します。たとえば、関数のカッコ内にカーソルを置いて変数を選択します。これにより、カーソル位置にある式に変数が挿入されます。

4.12.2 式の使用に関する必知事項

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では式を使用できます。式を使用することで、*、+、/、%、およびプリミティブな数値に対してサポートされたその他の演算子(double、intなど)や、組込みディクショナリで使用できる数値タイプInteger、Long、Short、Float、Double BigDecimal、BigIntegerを使用して算術計算ができます。サポートされるプリミティブな数値の詳細は、『Oracle Business Process Managementルール言語リファレンス』を参照してください。

式を使用すると、任意の2つの数値タイプ間でキャストを行うことができます。たとえば、(short)((BigInteger)1 + (Long)2)のようになります。次のコード例に、タイプとキャストを使用したアクションのその他のサンプル式を示します。

assign new double db = 3.3
assign new BigDecimal bd = 3.3  // no cast required
assign db = bd // no cast required
assign bd = (BigDecimal)db // cast is required

式プロセッサは型の昇格にXPath/Xqueryルールを使用します(XML Path Language (XPath) 2.0)。たとえば、BigDecimalはfloat/doubleに昇格します。別方向へのタイプの昇格にはキャストが必要です(3.3などのリテラルを除く)。

4.13 値セットをルールのオプション値の制約として使用する方法

値リスト値セットと範囲リスト値セットを使用して、ルール内のビジネス条件に対する制約を指定できます。これにより、ルール・デザイナを使用して、指定値が範囲外の場合や、値セットで指定された候補値セットの範囲内にない場合に、可能性のあるエラーに関する検証警告を生成できます。

Oracle Business Rulesでは、値セットを使用して、グローバル初期値、関数の戻り値または関数の引数値の制約を指定することもできます。詳細は、「Oracle Business Rulesグローバルの使用」および「値セットのビジネス条件との関連付け」を参照してください。

4.13.1 範囲リスト値セットをビジネス条件の制約として使用する方法

範囲リスト値セットは、関数結果以外のビジネス条件の制約として使用できます。

値リスト値セットを制約として使用する方法の詳細は、「値リスト値セットをファクト・プロパティの制約として使用する方法」を参照してください。

範囲リスト値セットをファクト・プロパティの制約として使用する手順は、次のとおりです。

1. 「値セット」タブで、値セットをダブルクリックし、「値セットの編集」ダイアログを開きます。

2. 対象となる範囲を含んだ値セットを指定し、有効なすべての範囲について「アクションで許可済」を選択します。範囲を含めるには、最上部と最下部のエンドポイントについて「アクションで許可済」の選択を解除します。

3. アプリケーションに必要な場合は「含まれるエンドポイント」を選択します。

4. 「許可されない値をテストに含める」の選択を解除します。たとえば、有効な等級を定義し、かつ100より大きいまたは0未満の値を許可しない値セットの場合は、値セット・エンドポイントを定義します。

図4-74 ファクト・プロパティに対する有効な値セット

5. この値セットをビジネス条件と関連付けます。この例では、test_math1と値セットを関連付けます。

これで、このファクト・プロパティを使用するテストでルールを定義すると、値が範囲外の場合に検証警告が表示されます。たとえば、値-10の式でルールを定義すると、ルール・デザイナに検証警告が表示されます。

4.13.2 値リスト値セットをファクト・プロパティの制約として使用する方法

値リスト値セットをファクト・プロパティの制約として使用できます。

範囲リスト値セットを制約として使用する方法の詳細は、「範囲リスト値セットをビジネス条件の制約として使用する方法」を参照してください。

値リスト値セットをファクト・プロパティの制約として使用する手順は、次のとおりです。

1. 対象となる値を含んだLOV値セットを指定し、有効なすべての値について「アクションで許可済」を選択します。詳細は、「値リスト・グローバル値セットの定義方法」を参照してください。

2. otherwise値セットについて「アクションで許可済」の選択を解除します。

3. 「許可されない値をテストに含める」の選択を解除します。

4. この値セットをファクト・プロパティに関連付けます。

4.13.3 値セットを使用してテスト式のオプションを指定する方法

LOV値セットを使用して、式およびアクションのオプションを指定できます。

値セットを使用してルール式およびアクションのオプションを指定する手順は、次のとおりです。

1. ルール・デザイナで、ファクト・プロパティに対応するタイプのLOV値セットを定義します。詳細は、「値リスト・グローバル値セットの定義方法」を参照してください。

2. この値セットをファクト・プロパティに関連付けます。詳細は、「値セットをファクト・プロパティに関連付ける方法」を参照してください。

3. 式を入力すると、ルール・デザイナにより「values options」に値が表示されます。たとえば、ファクト・プロパティDriver.eye_testをeyesというLOV値セットに値pass、failおよびglasses_requiredで関連付け、テスト式でDriver.eye_testを使用した場合、値は制限されます。

4.14 ランタイム・ルールの変更内容のリポジトリからJDeveloperへのインポート

この項では、SOAコンポーザで実装されているルールに対する変更をJDeveloperにインポートする方法について説明します。

SOAコンポーザのディクショナリに変更を行った場合は、「Oracle Business Rulesディクショナリの変更のパブリッシュ」に示すように、その変更内容をMDSリポジトリにアップロードする必要があります。ただし、これらの変更はJDeveloperでは更新されません。MDSリポジトリからJDeveloperに、変更内容を手動でインポートする必要があります。

JDeveloperに変更内容をインポートする手順は、次のとおりです。

1. アプリケーション・ナビゲータで変更を行ったルールを選択します。

2. 図4-75に示すように、ルール・エディタで「MDSからインポート」ボタンをクリックします。

図4-75 MDSリポジトリからの変更のインポート

3. 「ディクショナリのインポート」ダイアログからMDSリポジトリを選択します。

4. 「OK」をクリックします。

JDeveloperで変更内容が更新され、ルール・エディタに変更内容が表示されます。

4.15 データ・モデルが深い場合のルールのモデル化方法

次のヒントを使用して、複雑すぎるルールを回避してください。

- ルール・テスト変数(インライン・エイリアス)を使用して、簡易テストを作成します。

- どの1:1接頭辞も、ファクト・パスから削除できます。

ルール・テスト変数:

ルール・テスト変数(インライン・エイリアス)を使用して、簡易テストを作成します。これは、深いデータ・モデルがある場合のルールのモデル化に役立ちます。

たとえば、ルールが次のようになっているとします。

IF
task/payload/purchaseOrder/line.amount > 100
THEN
modify ...

次のように書き換えることができます。

Root: task
IF
amount = task/payload/purchaseOrder/line.amount and
amount > 100.0
THEN
modify ...

(OR)

Root: task
IF
line = task/payload/purchaseOrder/line and line.amount > 100.0 and line.amount < 1000.0
THEN
modify ...

1:1接頭辞を削除します。

どの1:1接頭辞もファクト・パスから削除できる(それがテストで参照されていない場合)ことに注意してください。たとえば、タスクに最大で1ペイロードがあり、1ペイロードに最大で1つの発注書があり、テストがそのタスクもそのペイロード属性も参照していないとわかっている場合、次のように短い例を使用できます。

Root: PurchaseOrder
IF
line = PurchaseOrder/line and
line.amount > 100.0 and line.amount < 1000.0
THEN
...

リレーションシップが1:多であり、どのタスクまたはペイロードにどの発注書が含まれているかを考慮しない場合は、短いパスを使用することもできます。単にすべての発注書を処理することを望んでいます。

5 デシジョン表の使用

この章では、デシジョン表を使用して、IF/THENルール書式の代替となるわかりやすい書式でビジネス・ルールを作成し、使用する方法について説明します。さらに、条件、競合、アクションなど、デシジョン表の各種コンポーネントについて取り上げ、デシジョン表に対して実行できる様々な操作についても説明します。

この章の内容は以下のとおりです。

- デシジョン表の使用の概要

- デシジョン表の作成

- デシジョン表の操作の概要

- Oracle Business Rulesデシジョン表アプリケーションの作成と実行

- Microsoft Excelでのデシジョン表の編集

5.1 デシジョン表の使用の概要

企業は、自社のビジネス・プロセスを自動化するためにソフトウェアに投資しています。従来、この自動化の焦点は、データに関する意思決定を容易にするためのデータの収集、プレゼンテーションおよび操作に置かれていました。しかし、ビジネス・プロセスに関するルール詳細をソフトウェア・アーキテクチャに組み込むことで意思決定プロセスを自動化するという、ソフトウェア設計者と開発者に対する要求が大きくなってきています。また、多くの企業は、ビジネスの変化に対するソフトウェア・システムの応答性を高めようという圧力の高まりに直面しています。

場合によっては、ビジネス・ルールを記述およびテストする役割が、ソフトウェア・エンジニアではなく、研修を受けたビジネス・ユーザーに割り当てられるようになりました。また、ソフトウェアのビジネス上の動作の変更を従来のソフトウェア開発サイクルから分離し、その変更内容を製品や販売サイクルのようなビジネス主導の規範に関連付ける組織もあります。

デシジョン表は、特にコンピュータ・プログラマではなくビジネス・アナリストが記述を担当する場合に、データ処理タスクを記述するためのメカニズムを提供します。

スプレッドシートに慣れたビジネス・アナリストにとって、デシジョン表の書式は直感的なものです。デシジョン表に用意されている仮の構造により、複数の類似するルールを容易に作成、理解および変更でき、ソフトウェアでルールの完全性および整合性をチェックできます。

Oracle Business Rulesデシジョン表には、次の機能があります。

- 強力な視覚化: コンパクトで構造化されたプレゼンテーション。この視覚化は、多数の表を使用し、宣言的で単純なステップに編成されるという、現実のビジネス・ポリシーの表現方法に適合しています。

- エラー防止: 不完全性や非整合性を回避します。デシジョン表は適切に構造化されているため、自動化されたツールで競合、冗長性および不完全性をチェックし、有効で整合性のあるビジネス・ルールを迅速に開発できます。

- モジュール形式の情報編成: 複数のルールが単一の表にグループ化されます。スプレッドシートのように、連携して動作するルールのグループが単一の表示可能ペインに置かれます。たとえば、申込者が適格かどうかをチェックする6つのルールがある場合、個別ではあっても関連するルールとして表示するのではなく、6つのルールすべてを表示する方が便利です。

- ルールの最適化およびパフォーマンス上のメリット: Oracle Business Rulesのデシジョン表には自動化された機能が用意されており、IF/THENルールに比べて、必要なルールの数を削減できます(これをルールの結合と呼びます)。

- ルール検証機能: デプロイメント前にルールの論理的な整合性を確認する機能が用意されています。競合または不完全性をチェックするように自動化されたツールを使用して、有効で整合性のあるビジネス・ルールを迅速に開発できます。

デシジョン表を使用する主な理由は、検証および視覚化が容易であることです。

詳細は、ルールセットとルールの使用を参照してください。

5.1.1 デシジョン表とは

デシジョン表では、スプレッドシート形式の単一ビューに複数の関連するルールが表示されます。ルール・デザイナの場合、デシジョン表には関連するビジネス・ルールのコレクション、条件行、ルールおよびアクションがわかりやすい表形式で表示されます。ビジネス・ユーザーは、各セルおよびそれぞれの値をすばやく比較し、デシジョン表のルール分析機能(ルール・デザイナでボタンをクリックして値を選択することで使用可能)を使用し、競合するケースや欠落しているルールを識別し、訂正できます。

デシジョン表の概念を理解しやすいように、運転者に免許資格があるかどうかを判別する一連のIF/THENルールおよび、それと同等のデシジョン表を示します。運転免許の教習を受講済の運転者が受講証明を持っていることに注意してください。

このIF/THENルールは次のようになります。

if driver.age < 20 and driver.has_training then training = true
if driver.age < 20 and driver.has_training = false then driver.eligible = false
if driver.age >= 20 then driver.eligible = true (do not care about training for this case)

図5-1に、これらのルールをデシジョン表で表現したものを示します。この図には、デシジョン表の「条件」および「アクション」領域が含まれています。

図5-1 条件とアクションを使用するサンプル・デシジョン表

5.1.1.1 デシジョン表の条件に関する必知事項

デシジョン表の「条件」領域には、1行以上の条件行が含まれています。各条件行には条件式が含まれ、ルールごとに条件セルがあります。条件式は、ルール・デザイナで構築する式です。条件式はファクト・プロパティまたは関数結果であることが多いのですが、値セットに関連付けられる型の式の場合もあります。テスト式は、Driver.age<16のように、よく使用されます。これらの式は、trueおよびfalseという値を使用して、組込みのブール型の値セットと関連付けられています。指定された条件セルの値または範囲は、関連付けられたLOVまたは範囲の値セットの1つ以上の値または範囲から取得されます。値セットの詳細は、「値セットの使用」を参照してください。

たとえば、図5-1は、Driver.ageプロパティを持つDriverファクトの条件式を示しています。デシジョン表内の対応する行は、範囲<20および>=20の値を含む条件セルを示しています。セル内の値は、driver_agesというグローバル値セットから取得されます。

図5-1には、Driver.has_trainingプロパティを持つDriverファクトの条件行も示されています。この条件行は、値true、falseおよび-を持つ条件セルを示しています。ハイフン(-)は、考慮されないこと(つまり、この場合はDriver.has_trainingがtrueでもfalseでもかまわないこと)を意味します。これらの条件セルの値は、ブール型に関連付けられているデフォルト値セットから取得されます(これは、値trueおよびfalseのデフォルト値で構成されています)。

-(考慮しない)値は、新しい値が値セットに追加されるときに、デシジョン表にギャップが発生しないようにするために役立ちます。たとえば、値セットに最初に1、2、otherwiseが含まれている場合、入力が3であるとotherwiseに一致しているルールが起動されます。ただし、3が明示的に値セットに追加されると、otherwiseは3の入力値に一致しなくなります。この入力に対してどのルールにも-が含まれていない場合、入力値が3であると、どのルールも起動せず、デシジョン表にギャップがあると言われるようになります。

それ以外の値ではなく値セットのotherwise値に明示的に一致させる場合は、otherwiseを使用します。otherwiseは、デシジョン表での競合の回避に役立ちます。-はどのような値にも一致させるために使用され、多くの場合、競合が発生します。これらの競合は、「自動オーバーライド」競合ポリシーを使用して自動的に解決できます。

デシジョン表にはルールがバケット順に表示され、ルールの順序を変更するには値セット内のバケットの順序を変更する必要があります。つまり、条件行に関連付けられている値セット内のバケットの順序によって条件セルの順序が決まり、したがってルールの順序も決まります。デシジョン表でのルールの順序付けは、条件行に関連付けられているLOV値セット内のバケットの相対位置を変更することで管理できますが、範囲バケット(値)の順序は変更できません。値セット内のバケットの順序付けの詳細は、「値リスト・グローバル値セットの定義方法」を参照してください。

5.1.1.2 デシジョン表のアクションに関する必知事項

デシジョン表では、アクションはルールに関連付けられています。実行時には、条件セルについてファクトが一致すると、Rules Engineにより、そのルールに関連付けられているアクションの実行が準備されます。

表5-1に、「アクション」領域で選択できるアクションのタイプを示します。したがって、アクションでは、関数の呼出し、新規ファクトのアサート、ファクトのリトラクト、ファクトの変更などを実行できます。「アクション」領域では、ルールに対する個別アクションに対応するセルをアクション・セルと呼びます。拡張モードの詳細は、「拡張モード・オプションの選択方法」を参照してください。

表5-1 アクション・セルに値するデシジョン表のアクション

アクション

説明

assert new

新規ファクトをアサートします。

assign

変数に値を割り当てます。

call

関数をコールします。

modify

一致したファクトに関連付けられているデータ値を変更します。

retract

ファクトを取り消します。

assert

ファクトをアサートします

assert tree

ルートが指定されたファクトのツリーをアサートします。

assign new

新規の変数に値を割り当てます。

expression

式を実行します。

return

returnアクションは、関数またはルールのアクション・ブロックから戻ります。ルール内のreturnアクションはルールセット・スタックをポップするため、実行は現在ルールセット・スタックの最上部にあるルールセットからのアジェンダに対するアクティブ化に進みます。

throw

例外をスローします。例外はjava.lang.Throwableを実装するJavaオブジェクトである必要があります。スローされた例外は、tryアクション・ブロック内のcatchによって捕捉される場合があります。

複数のアクションを追加する場合、「アクション」領域で追加したアクションは順序付けされます。上位の行に表示されるアクションが実行されてから、下位の行のアクションが実行されます。

デシジョン表のアクション(modifyなど)では、条件セル内で一致したファクトを参照できます。たとえば、デシジョン表にDriverファクトの条件行があり、そこにDriver.ageとDriver.has_trainingの条件行が含まれている場合、アクションでプロパティDriver.eligibleを変更でき、アクション・セルごとにDriver.eligibleの値を指定できます。

「アクション」領域の一部のタイプのアクションには、「パラメータ化」チェック・ボックスが含まれています。このチェック・ボックスでは、そのアクションのプロパティとして、デシジョン表内のルールに関連付けられたアクション・セル内の値セットを設定できることが指定されます。パラメータ化されたチェック・ボックスが選択されると、アクション・セルに値が入力されていない場合に、「アクション」領域で、アクション内の式の値に入力した値がプロパティのデフォルト値になります。たとえば、図5-2を参照してみると、値falseがアクション・プロパティeligibleのデフォルト値として割り当てられています。

図5-2 デフォルト値が設定されたパラメータ化アクションが表示されているアクション・エディタ

5.1.1.3 デシジョン表のルールに関する必知事項

ルールセットにはデシジョン表が含まれており、これによりデシジョン表をIF/THENルールと一緒にグループ化できます。ルールセットでルールとデシジョン表をグループ化すると、IF/THENルールとデシジョン表のルールがすべて、相互関係した1セットのルールとして実行されます。

デシジョン表内のルールには名前がありません。ルール・デザイナではデシジョン表内のルールがR1、R2およびR3のようなラベル付きで表示されますが、これらのルール・ラベルは個別ルールの名前ではなく、デシジョン表に含まれているルールの現行の順序付けから導出されたラベルです。したがって、ラベルR1が付いているルールを位置3に移動すると、ルール・デザイナにより、このルールのラベルがR3に変更されます。

デシジョン表内のルールは、条件セルのツリーを含む表として編成されます。1行目の条件セルは、以降の条件行のセルに続きます。行iの親セルは、行i+1の子に続きます。

図5-3は、デシジョン表内のルールを示しています。ここで各ルールは、「条件」領域の各行の1つのセルと、「アクション」領域内の同じ列の関連するアクション・セルで構成されています。図5-3では、ラベルR3が付いているルールを示していますが、このルールは、条件1 (Driver.age < 20値)による最初のセル、条件2 (Driver.eye_test = fail値)による2つめのセル、条件3 (Driver.has_training = true値)による3つ目のセルによって定義されています。R1からR12の他のそれぞれのルールにも、デシジョン表までの一意のパスがあります。

図5-3 デシジョン表内のルール

図5-3に示すように、1つのセルが別のセルの親になり、親のセルが下位のセルにまたがることは重要です。「条件」領域では、親の条件セルが同じである複数の条件セルは、兄弟と呼ばれます。一部の操作は兄弟である条件セルにのみ適用されます。たとえば、図5-4では2つの兄弟セルが選択されており、これらのセルが選択された状態なので、「選択済セルのマージ」操作が有効になっています。これらのセルでは、対応する値セットでDriver.eye_testの値がfailであるものも兄弟になります(図5-4のR3列とR4列を参照)。詳細は、「デシジョン表内の条件のマージまたは分割方法」を参照してください。

図5-4 デシジョン表の兄弟条件セル

ルール・デザイナでは、行を選択して「移動」ボタンをクリックすることで、行の順序を容易に変更できます。「条件」領域で行の順序を変更すると、条件セルに対する操作を必要な粒度で実行できます。つまり、条件セルの位置や、条件セルの親、子または兄弟の位置に応じて、ツリーの特定レベルでのみ適切な特定の値を分割、マージまたは割り当てる場合に、移動操作を使用できます。

5.1.2 条件セル値の理解

デフォルトでは、条件行の作成時にデシジョン表により単一の条件セルが作成され、そのセルに「?」値が割り当てられます。条件セルの値が?である場合は、そのセルの値が値セットでは未定義であることを示します。例として、図5-5にStrategyContextの「?」の値を示します。条件セル内の連続した値範囲は結合されていることに注意してください。たとえば、<20と[20..40]を選択すると、<=40として表示されます。

図5-5 条件セルで未定義を示すサンプル・デシジョン表

5.1.3 アクション・セル値の理解

デシジョン表の「アクション」領域では、あるアクション・セルが何も実行しないように指定できます。この場合は、そのアクション・セルの選択を解除します。アクション・セルのチェック・ボックスの選択が解除されている場合は、パターンがデシジョン表内で指定された条件値に一致しても、このアクションが実行されないことを意味します。つまり、アクション・セルごとに、関連付けられているルールでアクションをアクティブにする必要があるか、またはアクションを実行しないかを指定できます。

デシジョン表では、条件セルが値セットから削除済の値を表している場合、ルール・デザイナにより次のような検証警告が表示されます。

RUL-05831: Decision table value reference not found

このタイプの検証警告を解決するには、次のいずれかを実行できます。

- 条件セルをダブルクリックしてリストから値を1つ以上選択し、値を定義します。

- 欠落している値を値セットに追加するか、その条件を、欠落している値が含まれている別の値セットに関連付けます。

5.1.4 デシジョン表のループに関する必知事項

デシジョン表のループは、条件行の値がアクションにより変更される場合に発生します。ループは、単一のデシジョン表内のルール間か、複数のデシジョン表全体か、同一ルールセット内のルールおよびデシジョン表全体で設定できます。デシジョン表のアクションとして、デシジョン表の条件で使用されるファクト・プロパティを変更するアクションは作成しないでください。このようなアクションによって、無限ループが発生する場合があります。

注意:

包含するデシジョン関数に対するルール実行制限を使用することで、無限ループを防止できます。

5.2 デシジョン表の作成

デシジョン表を追加するには、複数のステップを実行します。

手順には、デシジョン表の作成、値セットの作成、デシジョン表への条件とアクションの追加、デシジョン表の操作の使用(デシジョン表の検証、訂正および変更)が含まれます。

5.2.1 デシジョン表の作成方法

デシジョン表で作業するには、まずルールセット内にデシジョン表を作成します。

デシジョン表を作成する手順は、次のとおりです。

1. ルール・デザイナで、「ルールセット」タブから既存のルールセットを選択するか、「ルール・セットの作成」をクリックしてルールセットを作成します。

2. 図5-6に示すように、「概要」タブの「デシジョン表」領域から「作成」をクリックします。これにより、デシジョン表が作成されます。

図5-6 デシジョン表の追加

注意:

デシジョン表を追加すると、ルール検証ログに検証警告が表示されます。デシジョン表は、条件およびアクションを追加するまでは不完全なものであり、検証すると必ず警告が表示されます。

5.2.2 デシジョン表への条件行の追加方法

デシジョン表には、デシジョン表の条件行を指定するための「条件」領域が含まれています。条件行により、Oracle Rules Engineで実行時に照合されるファクトが決定されます。デシジョン表を作成するには、デシジョン表に条件行を1行以上追加する必要があります。

デシジョン表に条件行を追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件を追加するデシジョン表を選択します。

2. 「デシジョン表」領域で、「追加」ボタンの横にあるリストから「条件」を選択します。

3. 図5-7に示すように、「条件」領域で、「<条件の編集>」をダブルクリックしてナビゲータを表示し、式を選択または入力します。

図5-7 デシジョン表への条件の追加

4. ナビゲータ内でクリックして変数を選択するか、「式ビルダー」ボタンをクリックして「式ビルダー」ウィンドウを表示し、式を入力します。「式ビルダー」を使用すると式を作成できます。

5. 各条件行には、各セルの値の取得元の値セットが必要です。選択した値に、関連付けられたグローバル値セットがある場合、デフォルトでは、その値セットが条件行に関連付けられています。

6. 必要に応じて手順2から手順5を繰り返し、デシジョン表にさらに条件行を追加します。

5.2.3 デシジョン表条件の値セットを使用または指定する方法

1. 各条件行には、各セルの値の取得元の値セットが必要です。選択した値に、関連付けられたグローバル値セットがある場合、デフォルトでは、その値セットが条件行に関連付けられています。

2. 値に関連付けられているグローバル値セットがない場合、デシジョン表に条件行を追加した後、ローカル値リストまたはローカル範囲リストのいずれかの値セットを指定して条件行と関連付けるか、既存のグローバル値セットを指定する必要があります。条件のための値セットを追加するには、図5-8のように、「条件」領域で条件を選択し、値セット・リストから選択して値セットを関連付けます。値セット・リストには、該当するタイプの使用可能なグローバル値セットが含まれています。

図5-8 デシジョン表で条件行に使用する値セットの指定

3. グローバル値セットを指定しない場合、「ローカル値セット」または「ローカル範囲値セット」のいずれかを選択して、指定されたタイプの値セットを作成および使用することで、ローカル値セットを作成および使用できます。

4. 必要に応じて手順2から手順3を繰り返し、デシジョン表にさらに条件行を定義します。

値セットの作成の詳細は、「値セットの使用」を参照してください。

5.2.4 デシジョン表へのアクションの追加方法

デシジョン表には、デシジョン表のアクションを指定するための「アクション」領域が含まれています。これにより、デシジョン表内のルールに対するアクションが決まります。有効なデシジョン表を作成するには、デシジョン表にアクションを追加します。特定の値が適用されるアクション・セルごとに、値を設定します。アクション・セルごとに、アクションがルールに適用されない場合はそのセルの選択を解除します。デフォルトでは、デシジョン表にアクションを追加すると、すべてのルールに対するアクションの選択が解除されます

デシジョン表にアクションを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクションを追加するデシジョン表を選択します。

2. 「追加」ボタンの横にあるリストから、「アクション」を選択し、使用可能なアクションをリストから選択します。表5-1に、使用可能なアクションを示します。たとえば、「Modify」を選択します。図5-9に示すように、ルール・デザイナの「アクション・エディタ」ダイアログが表示されます。

図5-9 デシジョン表へのアクションの追加

3. 「アクション・エディタ」ダイアログの「ターゲット」領域で、アクションのターゲットを選択します。これにより、アクションが適用されるデータ・モデル・オブジェクトが指定されます。

4. 指定したターゲットについて、必要に応じてアクションで目的の操作が実行されるように、「引数」表のフィールドを変更します。「アクション・エディタ」ダイアログの「引数」表には、表5-2に示すフィールドが含まれています。

表5-2 「アクション・エディタ」ダイアログの「引数」フィールド

フィールド

説明

プロパティ

指定したターゲットのプロパティ名が表示されます。

タイプ

プロパティのタイプが表示されます。

値

使用可能なアクションのリストから、アクションのデフォルト値を選択します。指定した値は、アクション全体にデフォルト値として適用されるか、または特定のアクション・セルを選択している場合は、選択したアクション・セルに適用されます。

パラメータ化

パラメータ化された値を指定します。パラメータ化された値は、デシジョン表のアクション・セルに表示されます。パラメータ化された値をプロパティに選択すると、通常は各ルールにより異なるパラメータ値が入力されます。

定数

定数値を指定する場合に選択します。

5. 「アクション・エディタ」ダイアログで、すべてのルールのアクション・セルを選択するには、「常に選択」チェック・ボックスを選択します。

6. 必要に応じてステップ2からステップ5を繰り返し、デシジョン表に対してさらにアクションを定義します。

5.2.4.1 デシジョン表のアクション・セルの値を設定する方法

アクション・セルの値を設定する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクション・セル値を指定するデシジョン表を選択します。

2. 「アクション」領域で、適切なアクション・セルが選択されていることを確認します。「アクション・エディタ」ダイアログで「常に選択」チェック・ボックスを選択した場合は、すべてのアクション・セルを選択する必要があります。「常に選択」チェック・ボックスの選択が解除されている場合は、アクション・セルのチェック・ボックスを使用して適切なアクション・セルを選択します。

3. 「アクション」領域で、選択したアクション・セルごとに、パラメータ化されたプロパティに適切な値を入力します。そのためには、アクション・セルのプロパティ・セルを選択し、値を入力するか、リストから値を選択するか、または「式ビルダー」ボタンをクリックして「式ビルダー」ダイアログを使用します。

デシジョン表から値セットを参照する方法の詳細は、「範囲リスト・グローバル値セットの定義方法」を参照してください。

5.2.4.2 デシジョン表のアクション・セルの選択を解除する方法

アクション・セルの選択を解除する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクション・セルの選択を解除するデシジョン表を選択します。

2. 「アクション」領域で、アクション・セルを選択し、アクション・セル内のチェック・ボックスの選択を解除します。アクションに対して「常に選択」が設定されている場合は、アクション・セル値の選択を解除できません。

アクションを追加するときに、アクションの順序変更が必要になる場合があります。ルール・デザイナでは、「下に移動」ボタンまたは「上に移動」ボタンを使用して、アクションの順序を変更できます。

5.2.5 デシジョン表へのルールの追加方法

デシジョン表にルールを追加できます。ルール・デザイナでは、既存のルールの左側にルールの列が追加され、各条件セルは「?」に初期化されます。これは実際には検証エラーを意味し、セルに適切な値を入力するように求めています。

デシジョン表にルールを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、ルールを追加するデシジョン表を選択します。

2. 「追加」ボタンの横にあるリストから、「ルール」を選択します。

3. 条件セルの値を入力します。新しいルールはデシジョン表の最初のルールとして左側に追加され、その他のルールは、値の順序が定義どおりに保たれるように、必要に応じて移動していることに注意してください。

4. アクション・セルの値を入力します。

デシジョン表の「詳細設定」にある「バケットによるルールの順序付け」チェック・ボックスは、デフォルトで選択されています。この場合、新しいルールを追加すると、デシジョン表のレイアウトが自動的に変更されます。

デシジョン表に新しいルールを追加すると、新しいルールはデシジョン表の最初のルールとして追加され、その他のルールは、値の順序が定義どおりに保たれるように、必要に応じて移動します。これは、「バケットによるルールの順序付け」が有効になっているからです。つまり、デシジョン表のルールの順序は、条件式に関連付けられている値の相対位置に応じて設定されるのです。ルールを追加するときに「バケットによるルールの順序付け」が有効でない場合、新しいルールはデシジョン表の最後のルールとして追加されます。どちらの場合も、新しいルールの列のセルには、セルに値がまだ設定されていないことを示す「?」という記号が表示されます。

注意:

「バケットによるルールの順序付け」を選択すると、ルールが順序付けされ、重複ルール(厳密に同じ値を持つルール)は結合されます。したがって、値を持たない2つのルールをデシジョン表に追加することはできません。この場合、ルールが重複することになり、即座に結合されてしまうからです。「バケットによるルールの順序付け」の選択を解除すると、重複ルールが許可されます。

さらに、ルール列に関連する「移動」ボタンも使用できます。これらを使用してルールの位置を変更できます。「表の行と列を反転」ボタンを使用して、デシジョン表の表示を変更します。これにより、「移動」ボタンも影響を受けます。移動方向は、上または下、左または右になります。「マージ」、「圧縮」ぉよびスパン・オプションも有効化されます。ルールを切り取り、コピー、または貼り付けることもできます。

詳細は、「デシジョン表の操作の概要」を参照してください。

5.2.6 デシジョン表でのテストの定義方法

デシジョン表でテストを定義できます。テストでは、デシジョン表内のルールを起動する場合は、trueに評価する必要があります。テストの定義とルール条件の使用方法の詳細は、「ルールの使用」を参照してください。

「データ・エクスプローラ」タブを使用すると、データ・モデル内のファクト・タイプおよび値セットを検索できます。

デシジョン表にテストを追加する手順は、次のとおりです。

1. ルール・デザイナで、「ルールセット」ナビゲーション・タブからルールセットを選択し、ルールを追加するデシジョン表を選択します。

2. デシジョン表名の左にある「パターン/テストの表示」ボタン(虫眼鏡)をクリックします。「拡張モード」が選択されている場合は、そのチェック・ボックスの選択を解除します。

3. 図5-10に示すように、必要に応じていずれかのオプションを選択します。テストのない変数がよく使用され、それらの変数はデシジョン表の条件およびアクションで使用できることに注意してください。

- 簡易テスト

- 変数

- ネストされたテスト

- 否定されたテスト

- 次のすべて...

- 次のいずれか...

- は

- 次のファクトがある...

- 次のケースがある...

- 次のファクトがない...

- 次のケースがない...

- 集計...

- ブール式

図5-10 オプション・リスト

4. 図5-11のように、左右の<operand>をクリックしてオペランド値を入力し、演算子リストをクリックして演算子を選択します。

図5-11 値オプション・リスト

テストの記述の詳細は、「ビジネス・ルールのテストと検証」を参照してください。

5.3 デシジョン表の操作の概要

デシジョン表の作成後に、デシジョン表の内容を変更し、すべてのケースに関する完全なルールセットを含むデシジョン表を生成したり、複数のケースに関して最小数のルールを提供するデシジョン表を生成できます。

デシジョン表の作成後、デシジョン表に対して次のような操作を実行できます。

- デシジョン表のセルの圧縮または分割。

- デシジョン表内の条件のマージまたは分割。

- デシジョン表内のルール間の競合の検出および解決。

- デシジョン表内のギャップ(欠落しているルール)の検出と修正。

5.3.1 デシジョン表の分割操作と圧縮操作

分割操作と圧縮操作を使用すると、デシジョン表の条件セルの内容を操作できます。

表分割操作では、条件間で値の組合せごとにルールが作成されます。たとえば、3つのブール条件を持つデシジョン表には、2 x 2 x 2 = 8のルールが作成されます。32のブール条件を持つデシジョン表では、2**32から20億のルールが作成されます。したがって、作成されるルールの数が少なく、アクション・セルに十分に収まる場合は、表分割を使用するのが適切です。

デシジョン表内で考慮されない値に一致条件を適用し、セルごとに一致ケースを作成する場合は、表分割操作を使用します。

分割は、デシジョン表全体または単一の条件行に適用できます。また、個別の条件セルに対して分割を実行することもできます。

デシジョン表で選択した内容に応じて、分割操作により条件セルを作成できます。つまり、分割操作を使用してデシジョン表内でルールを作成できます。表5-3に、選択した条件セル、条件行またはデシジョン表全体に対する分割操作のまとめを示します。

表5-3 分割操作のサマリー

演算子

説明

条件セル

セルが表す値ごとに、兄弟の条件セルが1つ作成されます。

条件セル値が"考慮しない"である場合、そのセルは、兄弟条件セルによって表されていない値セット内の値ごとに1つの兄弟セルに分割され、"考慮しない"は表示されなくなります。

条件行

直前の条件式内の各条件セルについて、値セット内の値ごとにセルを1つ含んだ兄弟グループを作成します。この操作には、各兄弟グループに考慮されない値を追加して、各兄弟グループ内の条件セルごとにsplitをコールするのと同じ効果があります。

デシジョン表

デシジョン表内の各条件行に対してsplitをコールするのと同じ効果があります。

デシジョン表で選択した内容に応じて、表圧縮またはセル・マージ操作により条件セルを削除できます。表圧縮操作は、デシジョン表全体に適用できます。また、マージ操作は、兄弟セルまたは条件行全体に対して実行できます。つまり、表圧縮またはマージを使用してデシジョン表からルールを削除できます。表5-4に、表圧縮操作およびマージ操作のまとめを示します。

表5-4 マージ操作のサマリー

演算子

説明

条件セル

複数の条件セルをマージすると、各セル内のすべての値が単一セルに追加され、そのセルを除くすべてのセルが削除されます。セルの1つに考慮されない値が表示されている場合、マージされたセルにも考慮されない値が表示されます。

この操作ではアクション・セルをマージでき、これにより、「RUL-05847: 重複するデシジョン表アクション・パラメータ"{0}"」など、重複するアクション・セルに関する警告を作成できます。

条件行

各兄弟グループ内のすべての値が、直前の条件式にある条件セルごとに結合されて単一の考慮されない値セルとなります。この操作には、各兄弟グループ内のすべてのセルに対してmergeをコールするのと同じ効果があります。

この操作ではアクション・セルをマージでき、これにより、「RUL-05847: 重複するデシジョン表アクション・パラメータ"{0}"」など、重複するアクション・セルに関する警告を作成できます。

デシジョン表

ルールの条件を同一アクションとマージすることでデシジョン表が圧縮されます。

競合するアクション・セルが操作に関連付けられていない場合、分割とマージは逆の操作になります。この場合、競合するアクション・セルがなければ、マージ操作では兄弟のすべての値を1つの兄弟に結合し、他の兄弟の条件セルは破棄されます。条件セルをマージした結果、デシジョン表にアクション・セルが含まれていれば、そのアクション・セルもマージされます。つまり、マージ操作では複数の条件セルを1つの条件セルに結合し、すべての値を1つのセルに追加するのです。

競合する値を持つアクション・セルは、マージ操作では追加の手動ステップを必要とする形式でマージされます。そのため、2つのアクション・セルのパラメータが競合する場合、マージ後のアクション・セルには競合する複数のパラメータ値が含まれることになります。これらの競合する値はアクション・セルに追加され、不要な重複パラメータを選択して削除することにより手動で解決する必要があります。例については、アクション・セル内で競合する値を示す図5-12を参照してください。

1つのプロパティについて複数の値を含むアクション・セルは無効です。このアクション・セルを選択すると、ルール・デザイナではアクション・セル用の単一値を選択できるように、チェック・ボックスを含むポップアップ・ウィンドウが表示されます。図5-12の検証ログに示すように、ルール・デザイナでは単一値を選択するまで検証警告が表示されます。

図5-12 マージ後のアクション・セルについて解決が必要な競合するプロパティ

5.3.1.1 デシジョン表の移動操作

デシジョン表内で条件またはアクションを移動できます。「移動」ボタンを使用すると、「条件」領域に表示される条件行や「アクション」領域に表示されるアクションの順序を変更できます。条件を上下に移動してルールの表示順序を変更できますが、これらの操作によってロジックが変わることはありません。たとえば、if (x.a == 1 and x.b == 1)は論理的にはif (x.b == 1 and x.a == 1)と同じです。

デシジョン表で作業する場合、一部の操作は兄弟である条件セルにのみ適用されます。「移動」ボタンを使用すると、デシジョン表の操作が必要な粒度でツリーに適用されるように行の順序を変更できます。たとえば、単一ルールの条件セルに対するアクションを変更する場合は、その条件セルをデシジョン表の「条件」領域の最終行に移動する必要があります。例として、図5-13に示すデシジョン表を考えてみます。

図5-13 デシジョン表内のルール

この表をDriver.ageの粒度で表示するには、図5-14に示すように、Driver.age条件を第1行から第3行に移動します。

図5-14 age条件を最終行に移動した後のデシジョン表

次に、最初の2つのルール(運転者が視覚テストをパスし、運転教習がtrueの場合)でDriver.age条件が考慮されないようにします。Driver.age条件が最終行にあるときは、これらの特定の条件に変更を簡単に適用できます。つまり、この表では、Driver.ageが最終行にあるときは、年齢に関連するルールを非常に高い粒度で、簡単に表示および変更できるようになります。一般的に、条件セルの位置や、条件セルの親、子または兄弟の位置に応じて、ツリーの特定レベルでのみ適切な特定の値を分割、マージまたは割り当てる場合に、移動操作を使用できます。

「アクション」領域内のアクションの場合は、「上へ移動」または「下に移動」をクリックするとアクションの順序を変更できます。アクションは、複数のアクションが適用される場合に最初のアクションが実行されてから以降のアクションが実行されるように順序付けされます。そのため、アプリケーションによっては、アクションに「上へ移動」または「下に移動」操作を使用することが適切な場合があります。

5.3.1.2 デシジョン表のギャップ・チェック

ギャップとは、デシジョン表内で欠落しているルールです。デシジョン表にギャップが生じるのは、各条件からの1つの値の組合せが、既存のルールの対象でない場合です。Rules Designerには、ギャップをチェックするためのギャップ・チェックが用意されています。「ギャップ分析」ボタンをクリックすると、ルール・デザイナによりギャップが検索され、検出されたギャップを修正するためのダイアログが表示されます。

ギャップがあると検証警告が表示されるように選択できます。「詳細設定」領域で「ギャップの許可」の選択を解除すると、ギャップの検出時にデシジョン表で検証警告がレポートされます。詳細は、「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

たとえば、Driverの例では、Driver.age < 20でDriver.has_trainingがfalseのケースを対象とするルールを削除してギャップを作成してから、「ギャップ分析」をクリックすると、図5-15に示す「ギャップ分析」ダイアログが表示されます。チェック・ボックスを選択して「OK」をクリックすると、すべてのルールまたは選択したルールがデシジョン表に追加されます(この例では、追加対象として単一のルールが表示されているのみです)。

図5-15 ギャップのチェック

次のケースについては、ギャップ・チェックにより異なる新規ルールが生成されます。

- 兄弟ルール: 欠落している複数の兄弟ルールが単一の新規ルールとして追加されます。たとえば、2つの条件Driver.ageおよびDriver.hairを持つルールを考えてみます。異なる髪色に関して2つのルールが欠落しており、それらが兄弟(つまり、共通の親を持つ)ルールの場合、ギャップ・チェックでは図5-16に示すように単一ルールが表示されます。

- 非兄弟ルール: 欠落している複数の非兄弟ルールが、個別の新規ルールとして追加されます。たとえば、同じ親を持たない2つの異なるルールが欠落している場合、ギャップ・チェックでは図5-17に示すように2つのルールが表示されます。

図5-16 欠落している兄弟ルールがある場合のギャップ・チェック

図5-17 欠落している非兄弟ルールがある場合のギャップ・チェック

図5-16と図5-17に示したどちらの場合も2つの値が欠落していますが、兄弟ルールの場合は複数の値が結合されて新規の単一ルールになります。したがって、通常、ギャップ・チェックでは、多数の限定的なルールではなく少数の汎用的なルールが提案されます。

兄弟ルールの場合は、複数のルールを追加した後、必要な値を取得するように各セルを編集できます。または、ギャップの検索を使用してルールを追加してから、複数の値を含むセルを分割し、不要なルールを削除します。

5.3.1.3 デシジョン表の競合分析

デシジョン表内のルールが競合する場合があります。2つのルールが競合するのは、両者が重複し、異なるアクションが設定されている場合です。2つのルールが重複するのは、その条件セルの1つ以上に共通する値がある場合です。重複は、デシジョン表に考慮されない条件セルが含まれている場合に一般的です。競合のない重複は一般的であり、問題はありません。

Rules Designerでは競合が検出され、「競合の表示」をクリックするとデシジョン表の「競合解決」行に競合を表示できます。競合を処理して解決する方法は、指定された競合ポリシーによって異なります。競合ポリシーを選択するか、デフォルトの手動競合ポリシーを使用できます。「詳細設定」領域の「競合ポリシー」オプションを使用して競合ポリシーを設定すると、Rules Designerによってデシジョン表の競合ポリシーが設定されます。「競合ポリシー」では、デシジョン表の競合ポリシーとして、次のいずれかを指定します。

- 手動: 競合ルールごとに競合解決を手動で指定することで、競合を解決します。

- 自動オーバーライド: Oracle Business Rules自動競合解決ポリシーを使用して、可能な場合に、オーバーライド競合解決を使用して競合を自動的に解決します。

- 無視: 競合が無視されます。

詳細は、「ルールおよびデシジョン表での詳細設定の使用」を参照してください。たとえば、図5-18に示されているデシジョン表の競合ルールは、デフォルトの手動競合ポリシーで解決されています。

図5-18 「競合」領域に競合するルールが表示されているデシジョン表

デシジョン表の「競合解決」領域でセルをクリックすると、次の方法でルール間の競合を解決できます。

- オーバーライド(「Override」および「OverriddenBy」): あるルールを他のルールでオーバーライドできます。オーバーライドにより、1つのルールの起動を指定します。オーバーライドは、優先度設定と相互排他を組み合せたものです。優先度設定は一時的であり、相称的ではありません。相互排他は一時的かつ相称的です。AによりCがオーバーライドされ、BによりCがオーバーライドされる場合、実行順序は最初にAまたはB、次にCとなりますが、実行されるのはA、BまたはCのうち1つのみです。

- 前に実行(「RunBefore」および「RunAfter」): ルールを優先付けします。「前に実行」では、2つのルールを規定の順序で起動します。優先度設定は一時的ですが、相称的ではありません。つまり、AがBより前に、BがCより前に実行される場合、AはCより前に実行されますが、BはAより前には実行されません。ここでは、デシジョン表のrunBeforeリストが使用されます。このリストでは「前に実行」するルールの方がリスト内のルールよりも優先度が高くなることを指定しています。

- 無視(「NoConflict」): 競合を無視します。無視により、2つのルールが任意の順序で起動されます。たとえば、デシジョン表内で競合する次のルールを考えてみます。

rule1: everybody gets a 10% raise (as specified with a do not care value in a decision table condition cell)
rule2: employee with Top Performer set to true gets a 5% raise

これらのルールでは、rule2によりrule1がオーバーライドされると、最上位成績者が5%の昇給を取得し、それ以外の全員が10%の昇給を取得します。ただし、この場合は、両方のルールを起動させます。どちらのルールを最初に起動しても問題なく、競合もないため、どちらを先に起動しても最上位成績者は15.5%の昇給を取得します。この場合は、NoConflictリストを使用して競合を解決します。競合なしとは、同一の優先度を持つIF/THENルールで取得するものであり、競合は警告されないのみで、一方のルールで他方のルールをオーバーライドするかどうかは慎重に考慮する必要があることに注意してください。

図5-19に、「競合解決」領域で競合するルールを選択したときに表示される、Rules Designerの「競合解決」ダイアログを示します。このダイアログでは、オーバーライド、「RunBefore」または「RunAfter」オプションによる優先度設定および「NoConflict」オプションを選択して、ルール間の競合を解決できます。

図5-19 デシジョン表の「競合解決」ダイアログの使用

デシジョン表の「詳細設定」の「競合ポリシー」の「自動オーバーライド」オプションを使用すると、可能な場合は競合を自動的に解決するように指定できます。自動オーバーライド競合解決ポリシーでは、特殊ケースにより一般的なケースがオーバーライドされるように指定します。詳細は、「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

つまり、デシジョン表に競合がある場合は、次の1つ以上を実行して競合を解決できます。

- デシジョン表の「競合ポリシー」→「自動オーバーライド」 オプションを選択して、自動オーバーライド競合解決を使用します。

- デシジョン表の「競合ポリシー」→「無視」オプションを選択して、競合を無視します。

- デシジョン表の「競合ポリシー」→「手動」 オプションを選択することで、手動の競合解決を使用し、「競合の表示」チェック・ボックスを選択した状態で「競合解決」領域でセルを選択することで、ダイアログ内の競合するルールごとに「競合解決」を設定します。

- デシジョン表を変更して重複を削除します。

- アクションを結合して競合を削除します。

5.3.2 デシジョン表の圧縮または分割方法

「表の圧縮」ボタンおよび「表の分割」アイコンを使用して、デシジョン表を圧縮または分割します。詳細は、「デシジョン表の分割操作と圧縮操作」を参照してください。

デシジョン表のセルを圧縮または分割する手順は、次のとおりです。

1. ルール・デザイナで、「ルールセット」ナビゲーション・タブからルールセットを選択します。「概要」タブでデシジョン表を選択し、「編集」をクリックします。

2. 「表の圧縮」ボタンをクリックして圧縮するか、「表の分割」ボタンをクリックしてセルを分割します。

5.3.3 デシジョン表内の条件のマージまたは分割方法

条件マージ操作および条件分割操作を使用して、デシジョン表内の条件をマージまたは分割します。詳細は、「デシジョン表の分割操作と圧縮操作」を参照してください。

デシジョン表内の条件をマージまたは分割する手順は、次のとおりです。

1. ルール・デザイナで、「ルールセット」ナビゲーション・タブからルールセットを選択します。「概要」タブで、条件をマージまたは分割するデシジョン表を選択し、「編集」をクリックします。

2. 「条件」領域で、マージまたは分割する条件を選択します。

3. 右クリックしてリストから「条件のマージ」または「分割条件」を選択します。

5.3.4 条件セル操作を使用する方法

条件セル操作を使用して、条件セルの分割、兄弟条件セルのマージまたはデシジョン表内の条件セルについて考慮されない値を指定します。詳細は、「デシジョン表の分割操作と圧縮操作」を参照してください。

5.3.4.1 デシジョン表内の条件の兄弟セルをマージする方法

1. ルール・デザイナで、「ルールセット」ナビゲーション・タブからルールセットを選択します。「概要」タブで、条件セルをマージするデシジョン表を選択し、「編集」をクリックします。

2. マージする兄弟条件セルを選択します。

3. 右クリックしてリストから「選択済セルのマージ」を選択します。

5.3.4.2 デシジョン表内の条件のセルを分割する方法

1. ルール・デザイナで、「ルールセット」ナビゲーション・タブからルールセットを選択します。「概要」タブで、条件セルを分割するデシジョン表を選択し、「編集」をクリックします。

2. 分割するセルを選択します。

3. 右クリックしてリストから「選択済セルの分割」を選択します。

5.3.4.3 デシジョン表内の条件セルについて考慮されない値を指定する方法

1. Rules Designerから、「ルールセット」ナビゲーション・タブでルール・セットを選択し、考慮されない値を設定するデシジョン表を選択します。

2. 該当する条件セルを選択します。

3. 右クリックしてリストから「考慮しない」を選択します。

5.3.4.4 すべての値セットを選択して条件セルについて考慮されない値を指定する方法

1. ルール・デザイナで、「ルールセット」ナビゲーション・タブからルールセットを選択します。「概要」タブで、「考慮しない」値を設定するデシジョン表を選択し、「編集」をクリックします。

2. 該当する条件セルを選択します。

3. ダブルクリックし、リストから可能な値すべてについて使用可能なチェック・ボックスをすべて選択します。

5.3.5 デシジョン表のギャップ・チェックの実行方法

ギャップとは、デシジョン表内で欠落しているルールです。デシジョン表にギャップが生じるのは、各条件からの1つの値の組合せが、既存のルールの対象でない場合です。Rules Designerには、ギャップをチェックするためのギャップ・チェックが用意されています。この操作を使用すると、ルール・デザイナにギャップを修正するためのウィンドウが表示されます。詳細は、「デシジョン表のギャップ・チェック」を参照してください。

ギャップがあると検証警告が表示されるように選択できます。「詳細設定」領域で「ギャップの許可」の選択を解除すると、ギャップの検出時にデシジョン表で検証警告がレポートされます。詳細は、「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

デシジョン表のギャップ・チェックを実行する手順は、次のとおりです。

1. ルール・デザイナで、「ルールセット」ナビゲーション・タブからルールセットを選択します。「概要」タブで、ギャップのチェックを実行するデシジョン表を選択し、「編集」をクリックします。

2. 「ギャップ分析」ボタンをクリックします。

5.3.6 デシジョン表の手動競合解決の実行方法

デシジョン表内のルールが競合する場合があります。2つのルールが競合するのは、両者が重複し、異なるアクションが設定されている場合です。2つのルールが重複するのは、その条件セルの1つ以上に共通する値がある場合です。詳細は、「デシジョン表の競合分析」を参照してください。

デシジョン表の競合解決を手動で実行する手順は、次のとおりです。

1. ルール・デザイナで、「ルールセット」ナビゲーション・タブからルールセットを選択します。「概要」タブで、競合をチェックするデシジョン表を選択し、「編集」をクリックします。

2. 競合ポリシーを「手動」に設定します(デフォルトの競合ポリシーです)。詳細は、「デシジョン表の競合分析」を参照してください。

3. 「条件」領域で、「競合」領域に競合が存在する場合は、競合のあるルールごとに該当する条件セルをダブルクリックして「競合解決」ダイアログを表示します。

4. 「競合解決」ダイアログで、競合するルールごとに、「解決」フィールドのリストから解決を選択します。

5.3.7 デシジョン表の自動オーバーライド競合解決ポリシーの設定方法

デシジョン表で「詳細設定」オプションを選択する際に、「自動オーバーライド」競合ポリシーを使用してデシジョン表の競合が自動的に解決されるように選択できます(これは、Oracle Business Rules自動競合解決ポリシーを使用して競合を解決可能な場合にのみ適用されます)。自動オーバーライド競合解決ポリシーでは、ルールが競合する場合に特殊ケースにより一般的なケースがオーバーライドされるポリシーが使用されます。詳細は、「デシジョン表の競合分析」を参照してください。

自動オーバーライド・ポリシーを選択する手順は、次のとおりです。

1. 無視の競合ポリシーを使用するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします。

3. 「競合ポリシー」オプションで、「自動オーバーライド」を選択します。

5.3.8 デシジョン表の競合ポリシーの無視の設定方法

デシジョン表で「詳細設定」オプションを選択する際に、「無視」の競合ポリシーを使用して、デシジョン表の競合が無視されるように設定できます。無視のポリシーにより、Oracle Business Rulesはデシジョン表での競合を無視するようになります。詳細は、「デシジョン表の競合分析」を参照してください。

無視の競合ポリシーを選択する手順は、次のとおりです。

1. 無視の競合ポリシーを使用するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」ボタンをクリックします。

3. 「競合ポリシー」オプションで、「無視」を選択します。

5.4 Oracle Business Rulesデシジョン表アプリケーションの作成と実行

注文承認アプリケーションは、SOAコンポジット・アプリケーションとOracle Business Rulesとの統合、およびデシジョン表の使用方法を示しています。

このアプリケーションでは、プロセスは次の目的でデシジョン・コンポーネントを使用するようにモデル化されています。

- XML入力(顧客の信用スコアと年間消費額、および受注分の合計コストなど)からのルールの処理

- 注文が承認されたか、拒否されたかまたは手動処理が必要であるかを判別する出力の提供

この手順を完了するには、次の作業が必要です。

- 注文承認アプリケーションのソース・ファイルの取得

- 注文承認アプリケーションの作成

- 注文承認のビジネス・ルール・サービス・コンポーネントの作成

- 注文承認のデータ・モデル要素の表示

- 注文承認のデータ・モデルへの値セットの追加

- 値セットとOrderプロパティおよびCreditScoreプロパティの関連付け

- 注文承認用デシジョン表の追加

- デシジョン表のセルの分割とアクションの追加

- デシジョン表の圧縮

- 1つの一般ルールによる複数の限定的ルールの置換

- 一般ルールの追加

- 注文承認のディクショナリ・ビジネス・ルール検証ログのチェック

- 注文承認アプリケーションのデプロイ

- 注文承認アプリケーションのテスト

5.4.1 注文承認アプリケーションのソース・ファイルの取得方法

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

注文承認アプリケーションで作業するには、order.xsdスキーマ・ファイルを取得して(オンラインで入手したサンプル・プロジェクトから取得するか、作成することもできます)、すべてのアプリケーション、プロジェクトおよびその他のファイルをOracle JDeveloperで作成する必要があります。次の例に示すスキーマ・ファイルをローカルに保存して、Oracle JDeveloperで使用可能にできます。

次の例に、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>

5.4.2 注文承認アプリケーションの作成方法

Oracle Business Rulesで作業するには、最初にOracle JDeveloperでアプリケーションを作成します。

注文承認アプリケーションを作成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。

2. 「アプリケーションの名前付け」ダイアログで、新規アプリケーションの名前および場所を入力します。

a. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、OrderApprovalAppと入力します。

b. 「ディレクトリ」フィールドで、ディレクトリ名を指定するか、またはデフォルトを使用します。

c. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞(com.example.orderなど)を入力します。
この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。

d. Oracle Business RulesでのSOAコンポジットの場合は、「アプリケーション・テンプレート」領域でアプリケーション・テンプレートとして「SOAアプリケーション」を選択します。図5-20に示す例を参照してください。

e. 「次へ」をクリックします。

図5-20 注文承認アプリケーションの追加

3. 「プロジェクトの名前付け」ページで、プロジェクトの名前および場所を入力します。

a. 「プロジェクト名」フィールドに名前を入力します。たとえば、OrderApprovalと入力します。

b. ディレクトリ名を入力または参照するか、デフォルトを使用します。

c. Oracle Business Rulesプロジェクトの場合は、図5-21に示すように、「プロジェクト・テクノロジ」タブの「選択済」領域に、「SOA」、「ADFビジネス・コンポーネント」、「Java」および「XML」が表示されていることを確認します。項目が欠落している場合は、その項目を「選択可能」ペインで選択し、「追加」ボタンを使用して「選択済」ペインに追加します。

図5-21 アプリケーションへのプロジェクトの追加

4. 「終了」をクリックします。

5.4.3 注文承認のビジネス・ルール・サービス・コンポーネントの作成方法

Oracle JDeveloperでプロジェクトを作成した後、プロジェクト内でビジネス・ルール・サービス・コンポーネントを作成する必要があります。ビジネス・ルールを追加する際、入力変数および出力変数を作成して、サービス・コンポーネントに入力を提供し、サービス・コンポーネントから結果を取得できます。

ビジネス・ルールをOracle JDeveloperで使用する手順は、次のとおりです。

- ビジネス・ルール・サービス・コンポーネントを追加します。

- サービス・コンポーネントの入力変数および出力変数を作成します。

- プロジェクト内でOracle Business Rulesディクショナリを作成します。

ビジネス・ルール・サービス・コンポーネントを作成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「OrderApproval」プロジェクト内の「SOAコンテンツ」を開き、composite.xmlをダブルクリックしてSOAコンポジット・エディタを起動します(このエディタは、プロジェクトの作成後、すでに開いている場合もあります)。

2. 「コンポーネント・パレット」で、「SOA」メニューの「サービス・コンポーネント」領域から「ビジネス・ルール」をcomposite.xmlエディタの「コンポーネント」レーンにドラッグ・アンド・ドロップします。

図5-22に示すように、Oracle JDeveloperで「ビジネス・ルールの作成」ページが表示されます。

図5-22 「ビジネス・ルールの作成」ダイアログでのビジネス・ルール・ディクショナリの追加

3. 入力を追加するには、「追加」ボタンの横にあるリストから「入力」を選択し、ビジネス・ルールを入力します。

4. 「タイプ・チューザ」ダイアログで、「スキーマ・ファイルのインポート」ボタンをクリックします。これにより、「スキーマ・ファイルのインポート」ダイアログが表示されます。

5. 「スキーマのインポート」ダイアログで「リソースの参照」をクリックし、プロセスの入力変数のXMLスキーマ要素を選択します。「SOAリソース・ルックアップ」ダイアログが表示されます。

6. 「SOAリソース・ルックアップ」ダイアログで、ナビゲートしてorder.xsdスキーマ・ファイルを検索し、「OK」をクリックします。

7. 「スキーマ・ファイルのインポート」ダイアログで、図5-23に示すように、「プロジェクトにコピー」が選択されていることを確認します。「OK」をクリックします。

図5-23 order.xsdスキーマ・ファイルのインポート

8. 「ファイルのローカライズ」ダイアログが表示される場合は、「OK」をクリックしてスキーマをコンポジット・プロセス・ディレクトリにコピーします。

9. 「タイプ・チューザ」で、「プロジェクトのスキーマ・ファイル」フォルダにナビゲートして入力変数を選択します。

この例では、入力変数として「CustomerOrder」を選択します。

「タイプ・チューザ」ウィンドウで「OK」をクリックします。図5-24に示すように、「ビジネス・ルールの作成」ダイアログが表示されます。

図5-24 CustomerOrder入力が表示されている「ビジネス・ルールの作成」ダイアログ

10. 同様の方法で、インポートしたorder.xsdから出力ファクト・タイプOrderApprovalを追加します。

11. 「ビジネス・ルールの作成」ダイアログで、図5-25に示すように、「コンポジット・サービスとして公開」を選択します。

図5-25 入力とOrderApproval出力が表示されている「ビジネス・ルールの作成」ダイアログ

「OK」をクリックします。ビジネス・ルール・コンポーネントが作成され、図5-26に示すようにOracle JDeveloperのキャンバス・ワークスペースにビジネス・ルールが表示されます。

図5-26 OrderApprovalコンポジットのビジネス・ルール・コンポーネント

ビジネス・ルール・サービス・コンポーネントを使用すると、SOAコンポジット・アプリケーションをビジネス・ルールと統合できます。これにより、ビジネス・ルール・ディクショナリが作成され、ビジネス・ルールを実行し、ルールに基づいてビジネス上の決定を下すことができます。

5.4.4 注文承認のデータ・モデル要素の表示方法

ルールを追加する前に、Oracle Business Rulesデータ・モデルを作成する必要があります。データ・モデルには、ビジネス・データの定義(タイプ)およびルールの作成に使用するファクトの定義が含まれています。たとえば、このサンプルのデータ・モデルには、ビジネス・ルール・アクティビティの入力および出力を定義する際に指定するorder.xsdからのXMLスキーマ要素が含まれています。

ルール・デザイナを使用してルールまたはデシジョン表を作成する際に、データ・モデルの要素の作成や変更が必要になる場合があります。

Oracleビジネス・ルールのデータ・モデル要素を表示する手順は、次のとおりです。

1. 値がcomposite.xmlのコンポジット・タブを選択し、「コンポーネント」レーンでビジネス・ルールを選択します(これにより、コンポーネントOracleRules1が破線の選択ボックスで囲まれます)。

2. 選択ボックスをダブルクリックしてルール・デザイナを起動します。

3. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

4. 図5-27に示すように、「ファクト」ナビゲーション・タブで「XMLファクト」タブを選択します。

図5-27 ルール・デザイナでビジネス・ルール・ディクショナリを開く様子

5.4.5 注文承認のデータ・モデルに値セットを追加する方法

デシジョン表を使用するには、デシジョン表を構成する条件の各セルについて、値の描画方法を指定する値セットを定義する必要があります。この例では、ルール・デザイナで定義する範囲のリストを使用して、値セットを定義します。

OrderAmount値セットをデータ・モデルに追加する手順は次のとおりです。

1. ルール・デザイナで、「値セット」ナビゲーション・タブを選択します。

2. 「値セットの作成」ボタンの横にあるドロップダウンから「範囲値セット」を選択します。

3. 「名前」フィールドにOrderAmountと入力します。[Enter]を押して、その名前を受け入れます。

4. OrderAmount値セット・アイコンをダブルクリックし、「範囲値セットの編集」ダイアログを表示します。

5. 「値の追加」をクリックし、値を追加します。

6. 「値の追加」を再度クリックし、別の値を追加します。

7. 「範囲値」領域で、最上位の「エンドポイント」フィールドに、エンドポイント値として1000を入力します。

8. 「範囲値」領域で、「エンドポイント」フィールドの中間バケットに、エンドポイント値として500を入力します。

9. 図5-28に示すように、各値セットの「含まれるエンドポイント」フィールドでチェック・ボックスが選択されていることを確認します。

図5-28 OrderAmount値セットの追加

10. それぞれの値の「エイリアス」フィールドを「高」、「標準」および「低」に変更します。「OK」をクリックします。

5.4.5.1 CreditScore値セットをデータ・モデルに追加する方法

CreditScore値を追加する手順は、次のとおりです。

1. ルール・デザイナで、「値セット」ナビゲーション・タブを選択します。

2. 「値セットの作成」ボタンの横にあるドロップダウンから「範囲リスト」を選択します。

3. 「名前」フィールドにCreditScoreと入力します。

4. 「CreditScore」値セット・アイコンをダブルクリックし、「値セットの編集」ダイアログを表示します。

5. 「値の追加」をクリックし、値を追加します。

6. 「値の追加」を再度クリックし、別の値を追加します。

7. 最上位値セットについて、「エンドポイント」フィールドに750と入力します。

8. 中間値セットについて、「エンドポイント」フィールドに400と入力します。

9. 各値セットの「含まれるエンドポイント」フィールドでチェック・ボックスが選択されていることを確認します。

10. 各エンドポイント値の「エイリアス」フィールドを、750は「solid」に、400は「avg」に、-Infinityは「risky」に変更します。「OK」をクリックします。

5.4.6 値セットをOrderプロパティおよびCreditScoreプロパティに関連付ける方法

デシジョン表を作成する準備のため、値セットをデータ・モデル内のファクト・プロパティに関連付けることができます。これにより、デシジョン表の作成時に、デシジョン表の「条件」領域にある条件セルで値セットを使用できるようになります。

OrderApprovalファクト・タイプがXMLスキーマからインポートされた時点で、Status値セットにOrderApproval.statusプロパティが関連付けられていることに注意してください。スキーマ内では、StatusがStringタイプに制限されるため、列挙値セットとして表されます。ルール・デザイナにより、Status値セットが作成されます。詳細は、「XMLファクトに関する必知事項」を参照してください。

値セットをOrderおよびCreditScoreプロパティに関連付ける手順は次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 図5-29に示すように、「ファクト」ナビゲーション・タブで「XMLファクト」タブを選択します。

図5-29 ルール・デザイナでビジネス・ルール・ディクショナリを開く様子

3. 変更するタイプを選択します。たとえば、「XMLファクト」表で、「CustomerOrder」エントリの横のアイコンをダブルクリックします。「XMLファクトの編集 -」ダイアログが表示されます。

4. 「XMLファクトの編集 -」ダイアログの「プロパティ」表の「値セット」列で、適切なプロパティのセルを選択し、使用する値セットをリストから選択します。たとえば、図5-30に示すように、プロパティ「order」について「OrderAmount」値セットを選択します。

図5-30 OrderAmount値セットとCustomerOrder.orderの関連付け

5. 同様の方法で、プロパティ「creditScore」について「CreditScore」値セットを選択します。

6. 「OK」をクリックします。

5.4.7 注文承認用デシジョン表の追加方法

デシジョン表を作成して、入力ファクトを処理して出力ファクトを生成するか、または暫定的な結論を生成します。暫定的な結論は、Oracle Business Rulesにより他のルールを使用するか別のデシジョン表内でさらに処理できます。

ルールを操作する際に、ルール・デザイナのルール検証機能を使用できます。ディクショナリを変更すると、ルール・デザイナではディクショナリ検証が実行されます。検証ログ・ウィンドウを表示するには、「検証」ボタンをクリックするか、または「表示」→「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。ルール検証ログを表示すると、警告メッセージが表示されます。これらの警告メッセージは、デシジョン表を作成すると削除されます。ルール検証の詳細は、「ルール検証」を参照してください。

このサンプル・アプリケーションでルールにデシジョン表を使用するには、特定の顧客および特定の注文に関して顧客の消費レベルおよび顧客の信用リスクを表すファクトを操作します。次に、デシジョン表を使用し、顧客の消費額、注文金額および顧客の信用リスクに基づくルールを作成します。

注文承認用のデシジョン表を追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブから「Ruleset_1」を選択します。

2. 「追加」ボタンをクリックし、リストから「デシジョン表の作成」を選択します。

3. デシジョン表で、「追加」ボタンをクリックし、リストから「条件」を選択します。

4. デシジョン表で、「<条件の編集>」をダブルクリックします。次に、ナビゲータで、「CustomerOrder」を開いて「creditScore」を選択します。これにより、式CustomerOrder.creditScoreがConditions列に入力されます。

5. 再度、デシジョン表で、「追加」ボタンをクリックし、リストから「条件」を選択します。

6. デシジョン表の「条件」領域で、「<条件の編集>」をダブルクリックします。次に、ナビゲータで、「CustomerOrder」を開いて「order」を選択します。これにより、式CustomerOrder.orderが入力されます。

7. 再度、デシジョン表で、「追加」ボタンをクリックし、リストから「条件」を選択します。

8. デシジョン表で、「<条件の編集>」をダブルクリックします。

9. ナビゲータで、「CustomerOrder」を開いて「annualSpending」を選択します。図5-31に示すように、テキスト入力領域で>2000を追加します。

図5-31 デシジョン表への年間消費額エントリの追加

10. 図5-32に示すように、[Enter]を押して値を受け入れます。ルール検証ログを表示すると、図5-32に示すように警告メッセージが表示されます。これらの警告メッセージは、後のステップでデシジョン表を変更すると削除されます。

図5-32 CustomerOrderデシジョン表への条件の追加

5.4.7.1 デシジョン表にアクションを作成する方法

デシジョン表にアクションを作成する手順は、次のとおりです。

1. デシジョン表で、「追加」ボタンをクリックしてリストから「アクション」→「新規アサート」を選択します。

2. 「アクション」領域で、assert new(をクリックします。これにより、「アクション・エディタ」ダイアログが表示されます。

3. 「アクション・エディタ」ダイアログの「ファクト」領域で「OrderApproval」を選択します。

4. 「アクション・エディタ」ダイアログのstatusプロパティの「プロパティ」表で、「パラメータ化」チェック・ボックスおよび「定数」チェック・ボックスを選択します。これで、各ルールでステータスを個別に設定するように指定したことになります。

5. 図5-33に示すように、「アクション・エディタ」ダイアログで「常に選択」チェック・ボックスを選択します。

図5-33 「アクション・エディタ」ダイアログを使用してデシジョン表にアクションを追加する様子

6. 「アクション・エディタ」ダイアログで「OK」をクリックします。

次に、デシジョン表にルールを追加し、ルールごとにアクションを指定する必要があります。

5.4.7.2 デシジョン表のセルの分割とアクションの追加

デシジョン表の分割操作を使用して、デシジョン表の条件行に関連付けられた値セットに関するルールを作成できます。これにより、条件値セットの組合せごとにルールが1つ作成されます。3つの注文金額値セット、3つの信用スコア値セット、および年間消費額用の2つのブール値セットがあり、ルールは合計18個(3 x 3 x 2 = 18)となります。

デシジョン表のセルを分割する手順は、次のとおりです。

1. デシジョン表を選択します。

2. デシジョン表で、「表の分割」ボタンをクリックし、リストから「表の分割」を選択します。表の分割操作により、考慮されないセルが表から消去されます。図5-34に示すように、表にはすべての範囲を対象とする18のルールが表示されています。

これらのステップでは、欠落している式があるアクション・セルに関する検証警告が生成されます。これらの警告は後のステップで修正します。

図5-34 表分割操作を使用したデシジョン表の分割

5.4.7.3 デシジョン表内のルールごとにアクションを追加する方法

デシジョン表の「アクション」領域で、各アクション・セルのOrderApprovalに関連付けられているstatusプロパティの値を指定します。可能な選択肢は、「Status.MANUAL」、「Status.REJECTED」または「Status.ACCEPTED」です。このステップでは、18のルールそれぞれについて、statusの値を入力します。入力した値は、デシジョン表の各ルールを構成する条件に対応します。

デシジョン表内のルールごとにアクションを追加する手順は、次のとおりです。

1. 図5-35に示すように、「アクション」領域で、操作するルールのアクション・セルをダブルクリックします。

図5-35 デシジョン表へのアクション・セル値の追加

2. リストで、アクション・セルの値を選択して入力します。たとえば、「Status.MANUAL」を入力します。

3. アクション・セルごとに、アプリケーションのロジックによって決定された適切な値を入力します。この例では、表5-5に示す、デシジョン表のアクションの値がアプリケーションで使用されます。

4. 「ファイル」メイン・メニューから「すべて保存」を選択し、作業内容を保存します。

表5-5 デシジョン表のアクションの値

ルール

C1 creditScore

C2順序

C3 annualSpending > 2000

A1 OrderApprovalのステータス

R1

risky

低

true

Status.MANUAL

R2

risky

低

false

Status.MANUAL

R3

risky

中

true

Status.MANUAL

R4

risky

中

false

Status.REJECTED

R5

risky

高

true

Status.MANUAL

R6

risky

高

false

Status.REJECTED

R7

avg

低

true

Status.APPROVED

R8

avg

低

false

Status.MANUAL

R9

avg

中

true

Status.APPROVED

R10

avg

中

false

Status.MANUAL

R11

avg

高

true

Status.MANUAL

R12

avg

高

false

Status.MANUAL

R13

solid

低

true

Status.APPROVED

R14

solid

低

false

Status.APPROVED

R15

solid

中

true

Status.APPROVED

R16

solid

中

false

Status.APPROVED

R17

solid

高

true

Status.APPROVED

R18

solid

高

false

Status.MANUAL

5.4.7.4 デシジョン表の圧縮

この手順では、18のルールを9つのルールにマージして圧縮します。これにより、不要なルールが自動的に消去され、デシジョン表にギャップや競合するプロパティのない状態が保持されます。

デシジョン表を圧縮する手順は、次のとおりです。

1. デシジョン表を選択します。

2. 「すべての列を同じ幅にサイズ変更」ボタンをクリックします。

3. 「表の圧縮」ボタンをクリックし、リストから「表の圧縮」を選択します。表圧縮操作により、デシジョン表からルールが消去されます。図5-36に示すように、デシジョン表には9つのルールが表示されるようになります。

図5-36 「表の圧縮」を使用したデシジョン表の圧縮

5.4.7.5 1つの一般ルールによる複数の限定的ルールの置換

残る9つのルールのうち5つでは、手動注文承認ステータスになることに注意してください。ルール数は、これら5つのルールを削除することで減らすことができます。通常は、このことは行わない、つまり、複数の限定的ルールを1つの一般ルールで置き換えないことがベスト・プラクティスです。ルール数を減らす際には、少数のルールを使用するメリットおよびルール数の減少で生じる競合の管理に伴う複雑さを比較する必要があります。

複数の限定的ルールを1つの一般ルールで置き換える手順は、次のとおりです。

1. デシジョン表を選択します。

2. デシジョン表で、OrderApproval statusのアクションが「Status.MANUAL」に設定されているルールを選択します。ルールを選択するには、列見出しをクリックします。たとえば、図5-37に示すように、ルール「R2」をクリックします。

3. 「削除」をクリックしてデシジョン表内のルールを削除します。「デシジョン表」領域でデシジョン表内のルールを削除するために「削除」ボタンをクリックする際は、慎重に行ってください(「ルールセット」領域にも、デシジョン表全体を削除する「削除」ボタンがあります)。

図5-37 デシジョン表からのルールの削除

4. 前述の手順を繰り返し、アクションが「Status.MANUAL」に設定されているすべてのルールを削除します。これにより、図5-38に示すように、デシジョン表には4つのルールが残ることになります。

図5-38 手動アクションを削除した後のデシジョン表

5.4.7.6 一般ルールの追加

これで、手動の場合を処理する単一ルールを追加できます。このルールを追加したら、競合解決に対して、「競合ポリシー」の「自動オーバーライド」オプションを使用して競合ポリシーを設定します。

一般ルールを追加する手順は、次のとおりです。

1. デシジョン表で、「追加」ボタンをクリックし、リストから「ルール」を選択します。

2. 「条件」領域で、3つの条件についてルールのセルごとに「-」(考慮されない値)を残します。

3. 「アクション」領域で、図5-39に示すように「Status.MANUAL」を入力します。「ビジネス・ルール検証」ログに、解決されない競合に関する警告「RUL-05851」が表示されることに注意してください。

図5-39 競合するルールを含むデシジョン表

4. 図5-40に示すように、競合解決の表示切替えボタンをクリックして、競合するルールを表示します。

図5-40 Status.MANUALを処理するルールの追加

5.4.7.7 自動オーバーライド競合解決ポリシーを有効にする方法

自動オーバーライド競合解決ポリシーを有効にする手順は、次のとおりです。

1. デシジョン表で、「詳細設定の表示」(デシジョン表名の横にある)をクリックします。

2. 「競合ポリシー」リストで、「自動オーバーライド」を選択します。手動の場合のルールを追加し、「自動オーバーライド」を選択すると、図5-41に示すように、競合が解決され、限定的な場合により一般的な場合がオーバーライドされることがわかります。

図5-41 自動オーバーライド競合ポリシーを使用したStatus.MANUALを処理するルールの追加

5.4.8 注文承認のビジネス・ルール検証ログのチェック方法

アプリケーションをデプロイする前に、ディクショナリが警告なしで検証されることを確認する必要があります。検証警告がある場合は、それに関連する問題を解決する必要があります。ディクショナリを検証するには、「ビジネス・ルール検証」ログで、検証警告をチェックします。警告がある場合は、適切なアクションを実行して問題を修正します。

5.4.9 注文承認アプリケーションのデプロイ方法

SOAアプリケーションで作成されたビジネス・ルールは、Oracle JDeveloperでデプロイメント・プロファイルを作成するときに、SOAコンポジットの一部としてデプロイされます。SOAコンポジット・アプリケーションをOracle WebLogic Serverにデプロイします。

注文承認アプリケーションをデプロイして実行する手順は、次のとおりです。

1. アプリケーション・サーバー・インスタンスを起動していない場合は、Oracle WebLogic Serverを起動します。

2. 「アプリケーション・ナビゲータ」で、「OrderApproval」プロジェクトを右クリックし、「デプロイ」→「OrderApproval」を選択し、該当するサーバー名を選択します。

これにより、「SOAデプロイメントと構成ダイアログ」が表示されます。すでに作成済のアプリケーション接続を選択するか、ここでそれを作成します。接続には、認証およびその他の接続情報(サーバー名、ポートなど)が含まれています。

3. 「次へ」をクリックします。

4. 「サーバーの選択」で、アプリケーション接続を選択するか、作成してから選択します。

5. 「次へ」、「次へ」をクリックし、「終了」をクリックします。

5.4.10 注文承認アプリケーションのテスト方法

アプリケーションのデプロイ後、Oracle Enterprise Manager Fusion Middleware Controlコンソールを使用して、SOAコンポジット・アプリケーションでデシジョン表をテストできます。

アプリケーションをテストする手順は、次のとおりです。

1. 図5-42に示すように、Oracle Enterprise Manager Fusion Middleware Controlコンソールでコンポジット・アプリケーションを開きます。

図5-42 注文承認アプリケーションのテスト

2. 「テスト」をクリックします。

3. 「引数を入力」領域で、「XML表示」を選択します。注文承認サンプル・アプリケーションのテストのために、次に示すサンプル入力の内容でXMLを置き換えます。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body xmlns:ns1="http://xmlns.oracle.com/OracleRules1/OracleRules1_DecisionService_1">
<ns1:callFunctionStateless name="OracleRules1_DecisionService_1">
<ns1:parameterList xmlns:ns3="http://example.com/ns/customerorder">
<ns3:CustomerOrder>
<ns3:name>Gary</ns3:name>
<ns3:creditScore>600</ns3:creditScore>
<ns3:annualSpending>2001.0</ns3:annualSpending>
<ns3:value>High</ns3:value>
<ns3:order>100.0</ns3:order>
</ns3:CustomerOrder>
</ns1:parameterList>
</ns1:callFunctionStateless>
</soap:Body>
</soap:Envelope>

4. ステップ3に示す入力値を、テスト用に必要な値に置き換えます。

5. 「Webサービスのテスト」をクリックします。

6. 「レスポンス」タブで、結果を表示します。たとえば、この入力の場合は次のようになります。

/OracleRules1_DecisionService_1" xmlns:ns2="http://xmlns.oracle.com/bpel">
<resultList>
<OrderApproval:OrderApproval      xmlns:OrderApproval="http://example.com/ns/customerorder"
xmlns="http://example.com/ns/customerorder">
<status>approved</status>
</OrderApproval:OrderApproval>
</resultList>
</callFunctionStatefulDecision>

5.5 Microsoft Excelでのデシジョン表の編集

ビジネス・ユーザーの場合は、Microsoft Excelを使用するとデシジョン表の編集が容易になることがあります。新機能を使用すると、開発者とビジネス・ユーザーのどちらも、デシジョン表をエクスポートしてExcelで編集してから、ディクショナリにデシジョン表をインポートして戻すことができます。

デシジョン表は、設計時にエクスポートして、Oracle JDeveloperまたはBusiness Process Composerで編集できます。実行時には、エクスポートしてSOAコンポーザで編集できます。ルール・ディクショナリから同じExcelワークブックに1つ以上のデシジョン表をエクスポートできます。

ディクショナリにインポートして戻すときに、新しいディクショナリを作成するか、既存のディクショナリを上書きするか、差異のマージを実行することができます。差異のマージにより、ディクショナリを比較して、任意の差異を受け入れたり(マージ)、拒否することができます。

ディクショナリの比較の詳細は、「2つ以上のディクショナリを比較またはマージする方法」を参照してください。

Excelワークブックの構造は、図5-43に示すように複数のワークシートで構成されます。これらのシートは1枚のREADMEシート、1枚の値セットシートおよびエクスポートされた各デシジョン表に対応する1枚ずつのシートです。Excelで編集できるものはルールと値セットのみです。.xlsm (デフォルト)または.xlsにエクスポートできます。

図5-43 Microsoft Excelワークブック

Excelワークブックを開く際のデフォルトではマクロが無効化されています。マクロを有効にすると、「Oracle Business Rules」という新しいタブが表示されます。このタブで、ルールの追加または削除、セルのマージまたは分割、値セットの値の追加または削除を実行できます。また、強調表示の無効化または有効化、簡易モードまたは拡張モードの使用、READMEワークシートの非表示または表示も実行できます。

マクロを無効にした状態でも編集はできますが、次のことを実行できません。

- 制限付きセルでのドロップ・リストからの値の選択

- フリー・フォーム・セルの編集

- セル範囲のコピーおよび貼付けによるルールまたは値セットの追加

- セル範囲の削除によるルールまたは値セットの削除

- セルの分割またはマージ

- 値セットの自動作成

- デシジョン表または値セットの構造の検証

事前定義済のマクロを使用すると、次の実行が可能になります。

- ルールの追加と削除

- セルの分割またはマージ

- 値セットの追加または削除

- 編集可能なセルには次が含まれます。

- ルール、条件、アクションの説明。

- 条件およびアクション・ノード。

- アクションの状態。

- アクション・パラメータのパラメータ化オプション

- 編集不可のセルには次が含まれます。

- 条件式。

- アクション式。

- アクション・パラメータ。

これらのセルを編集しようとすると、図5-44に示すようにエラー・メッセージが表示されます。

図5-44 変更不可のセル

5.5.1 エクスポートされるものの理解

SDKには、複数のデシジョン表にわたる複数の条件と関連付けることができる共有値セットがあります。ただし、Excelでは、共有値セットは存在しません。各条件に独自の値セットがあるため、Excelで変更可能な場合にエクスポート可能な値セットは1つのみになります。変更不可の値セットには、次が含まれます。

- リンク先のディクショナリ値セット。

- 列挙。

- ブール値セットなどの内部値セット。

ワークシートでは、変更不可の値セットと関連付けられた条件のドロップダウンから値を選択することのみが可能です。強調表示メカニズムによって、変更不可の値セットに関連付けられている条件が示されます。

5.5.2 デシジョン表をエクスポートする方法

図5-45に示すように、エクスポートおよびインポート機能は、ツールバー・ボタンを使用して起動できます。

図5-45 「エクスポート」および「インポート」ツールバー・ボタン

デシジョン表をエクスポートする手順は、次のとおりです。

1. ルール・デザイナで、「Excelにエクスポート」をクリックします。

2. 「Excelにエクスポート」ダイアログ・ボックスで、「形式」を選択し、ワークブックを保存するフォルダを参照します。

3. 「追加」をクリックし、エクスポートするデシジョン表(複数可)を選択し、「OK」をクリックします。

4. 「読取り専用値セット」チェック・ボックスを選択し、Excel内のすべての値セットを読取り専用にします。Excelワークブックに値セット・シートが存在しなくなります。すべての条件に、ドロップダウン・メニューがあり、それらの値は選択できますが、値を追加したり削除することはできません。

5. 「エクスポート」をクリックします。これで、ワークブックを開き、デシジョン表を編集できます。

5.5.3 編集済デシジョン表をディクショナリにインポートして戻す方法

図5-45に示すように、エクスポートおよびインポート機能は、ツールバー・ボタンを使用して起動できます。インポートできるExcelワークブックは前にエクスポートしたもののみです。

編集済デシジョン表をインポートする手順は、次のとおりです。

1. ルール・デザイナで、「Excelからインポート」をクリックします。

2. 「Excelからインポート」ダイアログ・ボックスで、「ファイル」を選択し、ワークブックを保存したフォルダを参照します。

3. 「インポート時に差異のマージを実行」チェック・ボックスはデフォルトで選択されています。ファイルを比較するベース・ディクショナリを参照します。ベース・ディクショナリは、3方向の差異のマージに必要です。

4. 「インポート時に差異のマージを実行」チェック・ボックスの選択を解除して、「新規作成」または「上書き」を選択します。

5. 「インポート」をクリックします。図5-46に示すように、デシジョン表がルール・デザイナにインポートされ、そこで変更を受け入れるか拒否できます。各変更済アーティファクトには、変更アイコンのフラグが付いています。ディクショナリのマージは注意深く実行してください。

差異のマージの使用方法の詳細は、「2つ以上のディクショナリを比較またはマージする方法」を参照してください。

図5-46 インポート時に差異のマージを実行

5.5.4 Excelでデシジョン表を編集する方法

Excelで、マクロを有効化して、「Oracle Business Rules」タブを表示します。これにより、ルールの作成、値セットの編集、およびプリファレンスの設定を行えるオプションが表示されます。

5.5.4.1 ルールの追加または削除とセルのマージまたは分割

デシジョン表ワークシートごとに、図5-47に示すように、ルールを追加したり、ルールを削除したり、セルをマージまたは分割できます。

図5-47 Excelの「Oracle Business Rules」タブ

5.5.4.2 値セットの追加または削除

図5-48に示すように、「値セット」タブで値セットを追加または削除できます。クリックしたセルに応じて、オプションが変わります(エンドポイントまたは値)。

図5-48 値セット・ワークシート

5.5.4.3 値セットの表示または非表示と説明の編集

図5-49に示すように、値セット・ワークシートで右クリックし、値の表示/非表示を選択して、値の表示と非表示を切り替えます。また、右クリックしてバケットの説明の編集を選択し、説明を変更することもできます。

図5-49 値セットの表示/非表示

5.5.4.4 プリファレンスの設定

図5-50に示すように、「値セット」タブで「強調表示の有効化」または「強調表示の無効化」をクリックします。

図5-50 強調表示の有効化

5.5.4.5 簡易または拡張モードの使用方法

ワークシートで、「簡易モード」または「拡張モード」をクリックし、2つのモード間で切り替えます。

簡易モードでは、条件およびアクションの説明のみ表示され、実際の式は表示されません。また、アクション・パラメータが表示されますが、それらを固定または可変として指定することはできません。

図5-51に示すように、拡張モードでは、条件およびアクションについて説明と式の両方が表示されます。また、アクション・パラメータ・タイプを固定または可変に指定できます。これは、SDKでパラメータ化または定数を指定することと同等です。

図5-51 拡張モード

5.5.4.6 ReadMeワークシートの非表示または表示

図5-52に示すように、「ReadMeシートの非表示」または「ReadMeシートの表示」をクリックして、モードを切り替えることができます。ReadMeワークシートは、「Oracle Business Rules」タブでの機能の使用方法に関する役立つ情報を提供します。

図5-52 ReadMeの表示/非表示

5.5.4.7 条件セルの編集

図5-53に示すように、ドロップダウンから選択するか、自動追加を使用して新しい値を追加できます。条件セルのいくつかでは、ドロップダウン・メニューから値を選択することのみが可能です。これらのセルは、色コードを使用することで区別化されています。値セットまたはデシジョン表の間で変更した条件は、すべて自動的に同期されます。

図5-53 条件の編集

5.5.4.8 アクションの編集

図5-54に示すように、ドロップダウンからアクションの状態(アクティブまたは非アクティブ)を選択できます。

図5-54 アクションの状態の編集

5.5.4.9 式の編集

アクション式のセルの値を編集できます。編集する場合は、これらのセルの妥当性が保持されるように注意してください。

5.5.4.10 アクション式のパラメータの編集

図5-55に示すように、アクション・パラメータを固定または可変にすることができます。アクション・パラメータが固定である場合、すべてのルールで、その特定のパラメータが同じ値になります。アクション・パラメータが可変である場合、ルールごとに、その特定のパラメータを異なる値にすることができます。

図5-55 アクション式のパラメータの編集

5.5.4.11 説明の編集

アクション、条件およびルールの説明を編集できます。いずれのアクション、条件またはルールに対しても説明が入力されていない場合、デフォルトでそれぞれA、CまたはRの後にデシジョン表でのその位置を示す番号が続きます。

図5-56 説明の編集

5.5.4.12 自動追加機能の使用方法

値セットの値は、次の2つの方法で追加できます。

1. 値セット・ワークシートで特定の値セットに移動します。「Oracle Business Rules」タブで、「バケットの追加」をクリックします。

2. 条件セルに、値(LOV値セットの場合)またはエンドポイント(範囲値セットの場合)を入力します。図5-57に示すように、これは、対応する値セットに値が自動的に追加されるため、自動追加と呼ばれます。

図5-57 条件セルへの値の入力

前述の値セットには、1) <18、2) [18..60)、および3) >=60の3つの値が含まれています。

3. たとえば[18..30]と(30..60)などの新しい値を追加するには、図5-58に示すようにセルに30を入力して、[Enter]を押します。

図5-58 新しい値の追加

4. [Enter]を押した後、値が値セットに追加され、図5-59に示すようにドロップダウンに表示されるようになります。

図5-59 値の自動的追加

値セットの自動追加された機能について通知するために、様々な強調表示手法が使用されています。次の例を参照してください。値のコメントおよび強調表示は、その条件の他のルールに対して別の値を選択した後、または同じ値セットに新しい値が追加された場合に、削除されます。

1つ目は、値セット・シートの新しく追加された値を強調表示することです(図5-60に示す)。

図5-60 強調表示された値セット

2つ目は、条件セルでのコメントの追加です(図5-61に示す)。

図5-61 条件セルのコメント

3つ目は、メッセージ・ボックスを表示することです(図5-62に示す)。このボックスは、最初に値が自動追加されたときにのみ表示されることに注意してください。

図5-62 メッセージ・ダイアログ

5.5.4.13 値セット・ワークシートでの値のエイリアス

値セット・シートでは、値セットごとに2つの行があります。最初の行は値を示し、2番目のものは値のエイリアスを示します。条件セルのドロップダウンに表示されるのは、値のエイリアスです。エイリアスは編集できます。エイリアスで行われた変更はすべて、即時に、対応する条件セルで使用可能になります。

5.5.4.14 値セットと条件の同期

値セットと条件セルは常に同期しています。値セットで行われた変更はすべて、どの値の追加または削除であっても、エイリアスでのどのような変更であっても条件セルとすぐに同期されます。値セットとその対応する条件セルとの間の同期は常に保持されます。

6 デシジョン関数の使用

この章では、デシジョン関数を使用して、Javaアプリケーション、コンポジットまたはBPELプロセスからルールをコールする方法について説明します。

この章の内容は以下のとおりです。

- デシジョン関数の概要

- デシジョン関数の使用

- ルール・デバッグ用の「ルール起動制限」オプションに関する必須情報

- デシジョン関数の引数に関する必須情報

- デシジョン関数の「ステートレス」オプションに関する必須情報

6.1 デシジョン関数の概要

デシジョン関数は、呼び出すと、指定されたルールセットまたは他のデシジョン関数を適用することで、入力に基づいて出力に到達できる実行のモジュールです。

デシジョン関数には次の宣言が含まれています。

- 入力ファクト。

- ルールセットおよびネストしたデシジョン関数。

- 出力ファクト。

デシジョン関数では、次の操作が実行されます。

- Oracle Business Rules Engineの作業メモリーに入力をルール・ファクトとしてアサートします。

- 現在のデシジョン関数およびネストしたデシジョン関数で構成されたルールセットを順番に実行します。

- Oracle Business Rules Engineの作業メモリーから出力ファクトを返します。

デシジョン関数を作成して、JavaアプリケーションやBPELプロセスからOracle Business Rulesを簡単に使用できます。デシジョン関数では、使用するルールを複数のルールセットとして編成し、ルールセットを規定の順序で実行できます。ファクトは最初のルールセットに進み、このルールセットで2番目以降のルールセットに進む追加のファクトをアサートでき、最後にデシジョン関数の出力としてデシジョン関数に戻ります。

6.2 デシジョン関数の使用

デシジョン関数を追加するにはルール・デザイナを使用します。

デシジョン関数を追加する手順は、次のとおりです。

1. ルール・デザイナで、「デシジョン関数」タブをクリックします。

2. 「デシジョン関数」領域で、「作成」ボタンをクリックします。

新しいデシジョン関数が作成され、図6-1のように、「デシジョン関数の編集」ダイアログが表示されます。

図6-1 「デシジョン関数の編集」ダイアログ

3. デシジョン関数の名前を「名前」フィールド、説明を「説明」フィールドに入力します。

4. 「ルール起動制限」フィールドで「無制限」または整数値を選択します。デシジョン関数をデバッグするときに、ルール起動制限の値の入力が必要になる場合があります。「ルール起動制限」は、指定数のルールを起動した後に実行を停止する場合にプライマリ・ルール処理でも使用できます。

詳細は、「ルール・デバッグ用の「ルール起動制限」オプションに関する必須情報」を参照してください。

5. 適切なデシジョン関数オプションを選択します。

- ルール起動制限がエラー: ルール起動制限がエラー条件であるかどうかを示すために使用されます。n個のルールが起動された後にルールの処理を停止するシナリオである場合は、このチェック・ボックスの選択を解除します。選択を解除すると、ルール起動制限が適用されますが、エラーとして報告されることはありません。
ルール起動制限を(たとえば、無限ループを防止する方法などとして)使用するシナリオである場合、このチェック・ボックスを選択します。起動制限に到達すると、システムがエラーをスローします。

- Webサービスとして起動: デシジョン関数をWebサービスとして起動するかどうかを選択し、Webサービス名を指定します。

- ルール・フローの確認: ルール・フローの確認により、次のものが検証され、検証警告が生成されます。

- デシジョン関数によって実行されるルールで必要とされるタイプは、デシジョン関数に対する入力であるか、他のルールによってアサートされます。

- デシジョン関数によって実行されるルールで生成されるタイプは、他のルールに対する入力であるか、デシジョン関数に対する出力です。
ルール・フローの確認では、ルールで使用されるJavaコードに広がるルール・フローの問題を特定できない場合があります。このような場合は、フロー・チェックをオフにすることで警告を無視できます。

- ステートレス: 選択した場合、このオプションは、デシジョン関数がステートレスであることを指定します。詳細は、「デシジョン関数の「ステートレス」オプションに関する必須情報」を参照してください。

6. 「入力」タブで、「追加」をクリックして入力を追加します。「入力」表で、入力ごとに適切なオプションを選択します。

- 「名前」 - 入力名を入力して[Enter]を押すか、またはデフォルト名を使用します。

- 「ファクト・タイプ」 - リストから適切なファクト・タイプを選択します。

- 「ツリー」 - 選択しない場合、入力はassert関数を使用してアサートされます。このオプションを選択した場合、入力はassertTree関数を使用してアサートされます。選択すると、ルート・オブジェクトが参照するすべてのオブジェクトがアサートされます。詳細は、「ツリー・モードのルールの使用」を参照してください。

- 「リスト」 - このオプションを選択しない場合、入力をシングル・オブジェクトにする必要があり、アサーションはそのシングル入力オブジェクトにのみ適用されます。このオプションを選択する場合、入力をオブジェクトのListにする必要があり、アサーションは入力のList (java.util.List)の各オブジェクトに適用されます。

- 「説明」 - 入力の説明です。

7. 「出力」タブで、「追加」をクリックして出力を追加します。「出力」表で、出力ごとに適切なオプションを選択します。

- 「名前」 - 出力名を入力して[Enter]を押すか、またはデフォルト名を使用します。

- 「ファクト・タイプ」 - リストから適切なファクト・タイプを選択します。

- 「ツリー」 - このオプションを選択すると、特定のデザインタイムのデシジョン関数引数チェックを有効にするフラグが設定されます。出力引数については、このオプションを選択してもランタイム動作に影響しません。ただし、デザインタイムに複数のデシジョン関数を順番にコールする場合は、1つのデシジョン関数の出力がツリーであることを明示的に指定すると有用です。これは、シーケンス内の別のデシジョン関数の入力は、入力としてツリーを予期することを意味します。詳細は、「ツリー・モードのルールの使用」を参照してください。

- 「リスト」 - このオプションを選択しない場合、出力はシングル・オブジェクトです。このオプションを選択した場合、出力はオブジェクトのグループです。出力引数の「リスト」オプションの動作の詳細は、「デシジョン関数の引数に関する必須情報」を参照してください。

- 「説明」 - 出力の説明です。

注意:

ファクト・タイプの参照可能な属性は、ファクトがルールによって照合できるかまたはアサートできるかを制御します。参照不可のファクト・タイプは、参照可能のファクト・タイプまたは変数の一部であるときは参照可能です。

デシジョン関数の入力または出力が参照不可のファクト・タイプの場合、参照可能なラッパー・ファクト・タイプが、DF.inという名前の参照不可の入力に対し、およびDF.outという名前の参照不可の出力に対して生成されます。

たとえば、iがタイプintの入力で、oがタイプintの出力の場合、次のルールにより入力を出力にコピーします。

IF
DF.in != null
THEN
assert new DF.out(o: DF.in.i)
DF.inを参照しない、またはDF.outをアサートしない場合、ルール・フローの警告が発生します。

8. 「初期アクション」タブでは、アサートする前に入力ファクトを変更したり、ルールセット・スタックを変更したり、有効日を設定したり、出力ファクトをアサートしたりするために使用できるアクションを追加できます。これらのアクションは、ルールのかわりに使用したり、ルールを実行するための環境「設定」のために使用できます。

「初期アクション」タブを使用して、1つのデシジョン関数(DF1)で別のデシジョン関数(DF2)をコールする場合を考えてみます。DF1は、Ruleset1をルールセット・スタックに追加するように構成されています。DF2は、Ruleset2を追加するように構成されています。DF1では、初期アクションを実行する前に、Ruleset1をルールセット・スタックに追加します。次に、DF2がコールされると、Ruleset2も追加されます。つまり、ルールの実行が開始されると、ルールセット・スタックによって、両方のルールセットのルールが起動します。Ruleset2を追加する場合(初期アクションでDF2をコールしているため)、DF1の初期アクションを使用して、DF2をコールする前にルールセット・スタックをクリアし、DF2をコールした後でスタックにRuleset1を追加できます。

図6-2に示すように、assert、call、modifyの範囲の必要なアクションを、if、else、elseif、while、for、if (advanced)、while (advanced)のような条件アクションにも追加できます。

図6-2 初期アクションの追加

注意:

「ルールセットおよびデシジョン関数」タブでデシジョン関数DF1にDF2が含まれている場合は、DF2には初期アクションが含まれていない可能性があります。

if (advanced)およびwhile (advanced)条件アクションは、boolean値のみを受け入れます。アクション条件ごとに異なるテスト・フォーム・タイプを追加できます。

9. 「ルールセットおよびデシジョン関数」領域で、シャトルを使用して項目を「使用可能」ボックスから「選択済」ボックスに移動します。

10. 「選択済」ボックスで項目を選択し、必要に応じて「上に移動」または「下に移動」をクリックして、ルールセットおよびデシジョン関数の順序を変更します。

6.2.1 既存のデシジョン関数を編集する方法

既存のデシジョン関数を編集する手順は、次のとおりです。

1. ルール・デザイナで、「デシジョン関数」タブをクリックします。

2. 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。

3. デシジョン関数を追加する場合と同様に、適切なデシジョン関数のフィールドを編集します。

6.2.2 入力の順序を変更する方法

入力の順序を変更する手順は、次のとおりです。

1. ルール・デザイナで、「デシジョン関数」タブをクリックします。

2. 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。

3. 移動する入力引数を選択します。「上に移動」または「下に移動」をクリックして、入力引数の順序を変更します。

6.2.3 出力の順序を変更する方法

出力の順序を変更する手順は、次のとおりです。

1. ルール・デザイナで、「デシジョン関数」タブをクリックします。

2. 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。

3. 移動する出力引数を選択します。「上に移動」または「下に移動」をクリックして、出力引数の順序を変更します。

6.2.4 デシジョン関数を編集する方法

デシジョン関数を編集する手順は、次のとおりです。

1. ルール・デザイナで、「デシジョン関数」タブをクリックします。

2. 編集対象のデシジョン関数を選択して、「編集」アイコンをクリックします。

「デシジョン関数の編集」ダイアログが表示されます。

3. デシジョン関数の新規追加に使用したプロセスを使用して、必要な変更を行います。

6.3 ルール・デバッグ用の「ルール起動制限」オプションに関する必須情報

「ルール起動制限」では、実行時に許可されるステップ(ルール起動)の最大数を設定できます。

このオプションを使用して「無制限」以外の値を指定すると、特定のルールの設計問題をデバッグしたり、場合によっては実行時のjava.lang.OutOfMemoryErrorエラーを防止できます。これは、無限に再帰するルール起動をデバッグするときに役立ちます。

無制限以外の値を選択し、「ルール起動制限がエラー」を選択した場合、制限に到達するとシステムがエラーをスローします。

6.4 デシジョン関数の引数に関する必須情報

Oracle Business Rulesでは、デシジョン関数ごとに対応するRL Language関数が生成されます。

生成されたデシジョン関数のシグネチャは次のようになります。

function <name>(InputFactType1 input1, ... InputFactTypeN inputN) returns List

デシジョン関数では、次のように、デシジョン関数の入力の「リスト」オプションに応じて各パラメータが生成されます。

- 入力引数の「リスト」オプションが選択されていない場合: FactTypei。入力をシングル・オブジェクトにする必要があり、アサーションはそのシングル入力オブジェクトにのみ適用されます。

- 入力の「リスト」オプションが選択されている場合: List<FactTypei>の場合、入力をオブジェクトのListにする必要があり、アサーションは入力のList (java.util.List)の各オブジェクトに適用されます

生成されたRL Language関数には、デシジョン関数の入力オプション「ツリー」に応じて、引数ごとにassertまたはassertTreeへのコールが含まれています。「ツリー」の選択が解除されている場合、入力はassert関数を使用してアサートされます。「ツリー」が選択されている場合、入力はassertTree関数を使用してアサートされます。選択すると、ルート・オブジェクトが参照するすべてのオブジェクトがアサートされます。

「ルールセットおよびデシジョン関数」領域の「選択済」ボックスで指定されたデシジョン関数の選択済ルールセットについて、生成されたRL Language関数には、選択されたルールセットのスタック順序に従って選択済ルールセットを指定したrun()へのコールが含まれています。

生成されたRL Language関数はリストを返します。このリストには、デシジョン関数の各出力の要素が順番に含まれています。出力がリストとして宣言された場合、対応する要素はリストになります。しかし、出力がリストとして宣言されていない場合、対応する要素は出力ファクトまたはnull(宣言されたタイプの出力ファクトが存在しない場合)になります。出力がリストとして宣言されていないときに、Oracle Business Rules Engineの作業メモリー内に指定したタイプの出力ファクトが複数見つかった場合は、例外がスローされます。

デシジョン関数を編集した後(入力と出力の変更、追加など)、変更内容は新規ビジネス・ルール・アクティビティについてBPELで参照可能になります。ただし、既存のビジネス・ルール・アクティビティでは変更内容を参照できません。詳細は、Oracle SOA SuiteでのSOAアプリケーションの開発のOracle Business Rulesのスタート・ガイドを参照してください。

6.5 デシジョン関数の「ステートレス」オプションに関する必須情報

デシジョン関数は、ステートフル操作またはステートレス操作をサポートしています。「デシジョン関数の編集」ダイアログの「ステートレス」チェック・ボックスを使用して、これらの2つの操作モードを切り替えることができます。

デフォルトでは、「ステートレス」チェック・ボックスが選択されており、ステートレス操作を示しています。ステートレス操作では、実行時に、デシジョン関数の起動が終わるたびにルール・セッションが解放されます。

「ステートレス」の選択を解除すると、基礎となるOracle Business Rulesオブジェクトはビジネス・ルール・サービス・エンジンのメモリーに保管されるため、操作の終了時にルール・セッション・プールに戻されません。これ以降にデシジョン関数を使用すると、キャッシュされているRuleSessionオブジェクトが再利用され、そのすべての状態情報が前回の起動から取得されます。したがって、「ステートレス」の選択を解除すると、ルール・セッションは以降のリクエストのために保存され、同じプロセスからの一連のデシジョン関数の起動は常にステートレス起動で終了します。

7 ビジネス・ルールのテストと検証

この章では作成または編集したルールをテストおよび検証する方法について説明します。

この章の内容は以下のとおりです。

- 概要

- JDeveloperでのルールのテスト

- Business Process Composerでのルールのテスト

- SOAコンポーザでのルールのテスト

- ルール関数を使用したデシジョン関数のテスト

- SOAコンポーザでのデシジョン・サービスのテスト

7.1 概要

テスト機能により、開発者とビジネス・ユーザーのどちらも、想定したとおりにルールが動作していること、また、変更した場合は、ルールが既存の機能を妨げていないことをすばやく確認できます。

ルールは、Oracle JDeveloperまたはBusiness Process Composerで設計時に作成およびテストできます。実行時には、SOAコンポーザでルールをテストできます。

XML、前のルール・アクションまたはJavaなどのプログラミング言語の知識がなくても、テストを宣言的に記述できます。さらに、テストでは、すべてのタイプのファクト(XML、Java、RLおよびADF-BC)がサポートされており、SOAまたは非SOAユース・ケースで実行できます。

テスト機能では、テスト・レポートに診断コメントおよび予期した値と実際の値との相違が表示され、ルールの訂正やテストの修正に使用できます。

図7-1は、JDeveloperのUIを示しています。JDeveloperの使用の詳細は、『Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発』のOracle JDeveloperの概要に関する項を参照してください。

図7-1 JDeveloperの「テスト」タブ

7.1.1 テスト機能のコンポーネント

どのUIを使用するかに関係なく、JDeveloper、BP ComposerおよびSOAコンポーザでテスト機能はほぼ同様に動作します。

デシジョン関数は、開始する前にすでに作成されている必要があります。デシジョン関数とテストの間には1対1マッピングが存在します。デシジョン関数をテスト・スイートまたはテスト・テンプレートに一度関連付けると、後から変更することはできません。

テスト機能のコンポーネントは次のとおりです。

- テスト・スイートとテスト・ケース
1つ以上のテスト・ケースでテスト・スイートを作成できます。他のテスト・ケースを作成するためのテンプレートとして機能するテンプレートを作成することもできます。

- テスト・テンプレート
テスト・テンプレートにより、いくつかのファクト・プロパティの値のみが異なる、類似したテスト・ケースを作成できます。テンプレートによって、パラメータの値を指定して非定型テストを実行することも可能になります。非定型テストにより、健全性テストを実行し、テスト・スイートでテスト・ケースとして作成する前に、特定のパラメータに対して様々な値の組合せを試してみることができます。

- テスト実行
テスト・スイートまたはテスト・ケースを実行すると、デシジョン関数が呼び出され、そのデシジョン関数で定義されているルールセットが実行され、図7-2に示すように、新しいタブに結果が表示されます。テストは、RL生成を介して実行されます。

図7-2 「テスト結果」タブ

次のことに注意してください。

- テストは、ディクショナリの「テスト」タブからでも、「デシジョン関数」タブからでも実行できます。

- テストは、リンクされているディクショナリのデシジョン関数の現行ディクショナリで定義できます。

- リンクされているディクショナリで定義されているテストは、現行ディクショナリで実行できます。リンクされているディクショナリからのテストは、読取り専用として実行に使用できます。

- デシジョン関数の入力/出力を変更すると、その変更は、定義済のテストに自動的に同期されます。テストは、そのテストで参照されるファクト・タイプに同期されます。デシジョン関数からファクトを削除すると、テスト機能によって、それらのファクトをそのテストの入力/出力ツリーから削除できるようになります。

- ファクトはテスト・データを定義するFactTypeのインスタンスであり、それぞれのFactTypeプロパティに対応するプロパティ値を持っています。プロパティ値が複雑なデータ・タイプである場合、それもファクト・インスタンスを使用して定義されます。

7.2 JDeveloperでのルールのテスト

ルールは、JDeveloperで設計する際にテストできます。

「テスト・ケース」エディタでテスト・ケースの入力および予期される出力値を定義します。ここでの値には、単純な値、グローバル、関数などを使用する式を使用できます。

入力および出力ファクト・ツリーは、デシジョン関数に指定された入力/出力に従って自動的に初期化されます。

テスト入力および出力ファクト・ツリーは、デシジョン関数に対する変更(入力または出力の追加、削除、変更)またはファクト・タイプの変更(プロパティの追加、削除、変更)とも自動的に同期します。自動同期フラグおよび強調表示によって、デシジョン関数またはファクト・タイプで変更されたファクトおよびプロパティの値が無効化されます。入力/出力に対するこれらのフラグの表示は、テスト定義の特定および問題の修正に役立ちます。

権限関連ケースのテスト

権限関連ケースをテストする前に、リフレッシュ時間を10秒に変更します。これは信頼性の高いテスト結果のための需要な前提条件です。

リフレッシュ時間を10秒に変更する手順:

1. $MW_HOME/user_projects/domains/soainfra/config/fmwconfigに移動します。

2. jps-config.xmlを開きます。

3. oracle.security.jps.ldap.policystore.refresh.intervalを10000に設定します。

<serviceInstance name="pdp.service" provider="pdp.service.provider">
<property name="oracle.security.jps.ldap.policystore.refresh.interval" value="10000"/>
</serviceInstance>

4. サーバーを再起動します。

7.2.1 テスト・スイートとケースの作成および管理方法

1つ以上のテスト・ケースでテスト・スイートを作成できます。テスト・スイートは、個別のデシジョン関数に対してのみ定義できます。

デシジョン関数の詳細は、デシジョン関数の使用を参照してください。

フィールドおよび他のUIコントロールの詳細なドキュメントは、JDeveloper内から「ヘルプ」を参照してください。

図7-3 JDeveloperの「テスト」タブ

テスト・スイートを作成する手順は、次のとおりです。

1. ルール・デザイナで、「テスト」タブをクリックします。

2. 「テスト・コンポーネント」ドロップダウンをクリックし、リストから「テスト・モデル」を選択します。

3. 「+」をクリックして、そのテスト・スイートの新しいテスト・ケースを作成します。

4. 「名前」を入力して、「デシジョン関数」を選択し、「説明」を入力します。

5. 「OK」をクリックします。テスト・スイートが表示されます。

6. 「編集」をクリックして、そのテスト・ケースの「入力」および「出力」ドキュメントを確認します。図7-4に示すように、ここでは、値を編集して入力および予期される出力を指定します。

図7-4 「入力」と「出力」

7. 起動しないルールは実行のエラーとして処理する場合は、「起動しないルールはエラー」チェック・ボックスを選択します。

8. テストの検証をオフにする場合は、「ドラフト・テスト」チェック・ボックスを選択します。

テスト・スイートおよびケースの作成が完了すると、それらを実行できます。詳細は、「テスト・スイートまたはケースの実行方法」を参照してください。

7.2.2 テスト・テンプレートの作成方法

テスト・テンプレートを使用すると、入力および出力値を再使用して、それらのフィールドおよび値のテストを反復できます。

フィールドおよび他のUIコントロールの詳細なドキュメントは、JDeveloper内から「ヘルプ」を参照してください。

テスト・テンプレートを作成する手順は、次のとおりです。

1. ルール・デザイナで、「テスト」タブをクリックします。

2. 「テスト・コンポーネント」ドロップダウンをクリックし、リストから「テスト・モデル/テンプレート」を選択します。

3. 「テンプレート」表に移動して「+」をクリックし、新しいテスト・テンプレートを作成します。

4. 「名前」を入力して、「デシジョン関数」を選択し、「説明」を入力します。

5. 「OK」をクリックします。テスト・テンプレートが表示され、そこで、入力および出力ドキュメントを表示できます。図7-5に示すように、ここでは、値を編集して入力および予期される出力を指定します。

図7-5 テスト・テンプレート

テスト・テンプレートの設定が完了すると、それらを実行できます。詳細は、「テスト・テンプレートからの非定型テストの実行方法」を参照してください。

7.2.3 テスト・スイートまたはケースの実行方法

テストを実行すると、新しいタブが開き、診断コメント、例外およびテスト結果が表示されます。テストは、スイート、複数のテスト・ケースまたは個別のテスト・ケースとして実行できます。

フィールドおよび他のUIコントロールの詳細なドキュメントは、JDeveloper内から「ヘルプ」を参照してください。

複数のテスト・スイートまたはケースを実行する手順は、次のとおりです。

1. 実行するテスト・スイートまたはテスト・ケースを選択し、「実行」をクリックします。

2. 新しいタブが開きます。新しいタブ「結果」が開きます。これをクリックして、テスト結果を表示します。

テスト・スイートの実行の場合、このタブにはデフォルトでテスト結果の概要が表示されますが、各テスト・ケースをクリックするとそれぞれのテスト結果を表示できます。テスト・ケースの実行の場合は、このタブにテスト結果が表示されます。

テストが失敗した場合、テスト結果には失敗原因に応じて診断コメント、出力差異または例外が表示されます。

「実行」ボタンは、テスト・スイートまたはテスト・ケース(またはテスト・テンプレート)が表から選択され、現在のディクショナリに検証警告が存在しない場合のみ、使用可能になります。

7.2.4 テスト・テンプレートからの非定型テストの実行方法

ここで、入力および出力ツリーのノードを編集することでテンプレートから非定型テストを実行できます。入力および出力は、デシジョン関数からのものです。

フィールドおよび他のUIコントロールの詳細なドキュメントは、JDeveloper内から「ヘルプ」を参照してください。

テスト・テンプレートから非定型テストを実行する手順は、次のとおりです。

1. 「テンプレート」表に移動し、テスト・テンプレートを選択します。図7-6に示すように、入力および出力フィールドが表示されます。

図7-6 テンプレートの入力と出力

2. 変数またはパラメータ・フィールドの値を入力し、「実行」をクリックします。「非定型テスト」ダイアログが表示されます。

次の適切なオプションを選択します。

- 起動しないルールは実行のエラーとして処理する場合は、「起動しないルールはエラー」チェック・ボックスを選択します。

- 「一覧で表示」または「ツリー表示」をクリックし、ビューを切り替えます。

- 「定数」チェック・ボックスを選択し、リストから定数を選択します。

- テスト・テンプレートの変数フィールドの「パラメータとしてマーク」チェック・ボックスを選択します。変数フィールドの値は、テンプレートがテストされるときまたはテスト・ケースの作成に使用されるときなど、テンプレートが使用されるときに入力されます。

3. 「テストの実行」をクリックして、テンプレートを実行します。

4. 新しい「結果」タブから、テスト結果を確認します。

7.2.5 特定のデシジョン関数に対するテストの実行方法

テストは、「デシジョン関数」タブから実行できます。このビューは、特定のデシジョン関数のテスト・スイートおよびテスト・ケースのみを表示します。

フィールドおよび他のUIコントロールの詳細なドキュメントは、JDeveloper内から「ヘルプ」を参照してください。

特定のデシジョン関数のテストを実行する手順は、次のとおりです。

1. ルール・デザイナで、「デシジョン関数」タブをクリックします。

2. クリックしてテスト・ケースを選択し、「テスト」ボタンをクリックします。

3. 「デシジョン関数テスト・エディタ」ダイアログが表示されます。このダイアログは、テスト機能の単なるもう1つのビューです。

7.3 Business Process Composerでのルールのテスト

ルールは、Business Process Composerで設計する際にテストできます。

Business Process Composerの使用方法の詳細は、Oracle Fusion Middleware Oracle Business Process Composerでのビジネス・プロセスの開発のOracle Business Process Composerの概要に関する項を参照してください。

7.4 SOAコンポーザでのルールのテスト

ランタイムには、SOAコンポーザを使用してルールのリグレッション・テストを実行できます。これによって、ビジネス・ユーザーは、変更後のルールで既存の機能が変更されるかどうかをすばやくチェックできます。図7-7は、SOAコンポーザの「テスト」タブを示しています。「テスト」タブは、デプロイ済コンポジットがあるか、SOAコンポーザ・セッション内である場合にのみ表示されます。「セッションの作成」をクリックしてセッションを開きます。

図7-7 SOAコンポーザの「テスト」タブ

7.4.1 テスト・スイートとケースの作成および管理方法

1つ以上のテスト・ケースでテスト・スイートを作成できます。テスト・スイートは、個別のデシジョン関数に対してのみ定義できます。

デシジョン関数の詳細は、デシジョン関数の使用を参照してください。

図7-8 「テスト・スイート」ページ

フィールドおよび他のUIコントロールの詳細なドキュメントは、SOAコンポーザ内から「ヘルプ」、「このページのヘルプ」をクリックしてください。

テスト・スイートおよびケースを管理する手順は、次のとおりです。

1. ルール・デザイナで、「テスト」タブをクリックし、「テスト・スイート」行内でクリックしてアクション・ボタンを有効化します。

テストの検証をオフにする場合は、「ドラフト・テスト」チェック・ボックスをクリックします。

2. 「+」をクリックして、新規テスト・スイートを作成します。

3. 「名前」および「説明」を入力して、「デシジョン関数」を選択します。

4. テスト・スイートが表示されます。

5. テスト・スイートの作成後にテスト・ケースを作成する必要がある場合は、「テスト・モデル」ツリーでテスト・スイートをクリックし、「+」をクリックして「テスト・ケース」を作成するか、「テンプレートからのテスト・ケース」を作成します。

6. データは、「現在のタブでの変更を保存」を随時使用して保存できます。また、変更が完了した場合は「パブリッシュ」をクリックします。

7. 「テスト・モデル」ツリーでテスト・ケースをクリックすると、そのテスト・ケースの「入力」および「出力」ドキュメントの確認もできます。図7-9に示すように、ここでは、値を編集して入力および予期される出力を指定します。

図7-9 デシジョン関数からの入力と出力

「テスト・ケース」エディタでテスト・ケースの入力および予期される出力値を定義します。ここでの値には、単純な値、グローバル、関数などを使用する式を使用できます。

テスト入力および出力ファクト・ツリーは、デシジョン関数に指定された入力および出力に従って自動的に初期化されます。

入力および出力ファクト・ツリーは、デシジョン関数に対する変更(入力または出力の追加、削除、変更)またはファクト・タイプの変更(プロパティの追加、削除、変更)とも自動的に同期します。自動同期フラグおよび強調表示によって、デシジョン関数またはファクト・タイプで変更されたファクトおよびプロパティの値が無効化されます。入力/出力に対するこれらのフラグの表示は、テスト定義の特定および問題の修正に役立ちます。

8. 「編集」をクリックして、ツリー内のすべてのノードを編集可能にします。

9. ツリー内のフィールドを編集する場合は、「値の表示」をクリックすると、それらの値のみが表示されます。

10. 起動しないルールを実行のエラーとみなす場合は、「起動しないルールをエラーとしてフラグ設定」チェック・ボックスを選択します。

テスト・スイートおよびケースの設定が完了すると、実行可能になります。詳細は、「テスト・スイートまたはケースの実行方法」を参照してください。

7.4.2 テスト・テンプレートの作成方法

テスト・テンプレートを使用すると、入力および出力値を再使用して、それらのフィールドおよび値のテストを反復できます。

フィールドおよび他のUIコントロールの詳細なドキュメントは、SOAコンポーザ内から「ヘルプ」、「このページのヘルプ」をクリックしてください。

テスト・テンプレートを作成する手順は、次のとおりです。

1. ルール・デザイナで、「テスト」タブをクリックします。

2. ナビゲーション・ツリーで「テスト・モデル」をクリックします。「テスト・テンプレート」領域で、「+」をクリックして、新規テスト・テンプレートを作成します。

3. 「名前」および「説明」を入力して、「デシジョン関数」を選択します。

4. 「保存」をクリックします。

テスト・テンプレートから非定型テストを実行するには、「テスト・テンプレートからの非定型テストの実行方法」を参照してください。

7.4.3 テスト・スイートまたはケースの実行方法

テストを実行すると、新しいタブが開き、診断コメント、例外およびテスト結果が表示されます。テストは、スイート、複数のテスト・ケースまたは個別のテスト・ケースとして実行できます。テストは、RL生成を介して実行されます。

フィールドおよび他のUIコントロールの詳細なドキュメントは、SOAコンポーザ内から「ヘルプ」、「このページのヘルプ」をクリックしてください。

1つのテスト・スイートまたはケースを実行する手順は、次のとおりです。

1. 実行するテスト・スイートまたはテスト・テンプレートを選択し、「実行」をクリックします。

「実行」ボタンは、テスト・スイートまたはテスト・ケース(またはテスト・テンプレート)が表から選択され、現在のディクショナリに検証警告が存在しない場合のみ、使用可能になります。

2. 新しい「結果」タブが表示されます。これをクリックして、テスト結果を表示します。

テスト・スイートの実行の場合、このタブにはデフォルトでテスト結果の概要が表示されますが、各テスト・ケースをクリックするとそれぞれのテスト結果を表示できます。テスト・ケースの実行の場合は、このタブにテスト結果が表示されます。

テストが失敗した場合、テスト結果には失敗原因に応じて診断コメント、出力差異または例外が表示されます。

図7-10 テスト・スイートの診断コメント

「テスト・モデル」ツリーからテスト・スイートを選択して実行した場合、図7-11に示すように「デシジョン・トレース」タブが表示されます。

図7-11 「デシジョン・トレース」UI

7.4.4 テスト・テンプレートからの非定型テストの実行方法

図7-12に示すように、入力および出力ツリーは、関連するデシジョン関数から入力および出力ファクトとともにロードされます。デシジョン関数でファクトを変更した場合、それらの変更は、入力および出力ファクトに自動的に同期されます。

図7-12 入力および出力ファクト

フィールドおよび他のUIコントロールの詳細なドキュメントは、SOAコンポーザ内から「ヘルプ」、「このページのヘルプ」をクリックしてください。

テスト・テンプレートから非定型テストを実行する手順は、次のとおりです。

1. 「入力」および「出力」ファクトを表示するには、「テスト・モデル」ツリーからテンプレートをクリックして選択します。

ここでは、値を編集して、入力と、予期される出力とを比較できます。ここで動的値を追加するか、「パラメータとしてマーク」を選択して、値が実行されるときにその値を入力できるようにすることができます。

式ビルダーの使用方法の詳細は、「ツリー・モード・ルールの使用」を参照してください。

2. 「テスト・テンプレートの実行」ボタンをクリックして、テンプレートを実行します。ダイアログ・ボックスが表示されます。

3. 変数またはパラメータ・フィールドの値を入力し、ダイアログから「実行」をクリックします。

4. 新しい「結果」タブから、テスト結果を確認します。「デシジョン・トレース」タブをクリックし、監査証跡を表示します。

7.4.5 特定のデシジョン関数に対するテストの実行方法

図7-13に示すように、特定のデシジョン関数に対してテストを実行できます。

図7-13 「デシジョン関数」タブ

フィールドおよび他のUIコントロールの詳細なドキュメントは、JDeveloper内から「ヘルプ」を参照してください。

特定のデシジョン関数のテストを実行する手順は、次のとおりです。

1. 「デシジョン関数」タブをクリックし、リストから適切なデシジョン関数を選択します。

2. 「テスト」フィールドで、ドロップダウンを使用して適切なテストを選択します。

3. 「テスト」タブにテストが開きます。テストをクリックし、「実行」をクリックしてテストを実行します。

4. 「結果」タブが表示されます。新しいタブをクリックして、テスト結果を表示します。

7.5 ルール関数を使用したデシジョン関数のテスト

デシジョン関数を作成し、そのデシジョン関数をOracle Business Rules関数を使用してルール・デザイナからコールすることで、ルールセットをテストできます。Oracle Business Rules関数本体で、入力ファクトを作成し、デシジョン関数をコールし、デシジョン関数からのファクト出力を検証します。詳細は、「デシジョン関数の概要」および「Oracle Business Rules関数の概要」を参照してください。

Oracle Business Rules関数を使用してデシジョン関数をテストする手順は、次のとおりです。

1. ディクショナリが有効であることを確認します。

ディクショナリ検証の詳細は、「ディクショナリの検証方法」を参照してください

2. Rules Designerで、「関数」ナビゲーション・タブを選択します。

3. 「関数」領域で、「作成」ボタンをクリックします。

4. 「名前」フィールドに関数名を入力するか、デフォルト名を使用します。

5. 「戻り型」のリストから戻り型を選択します。

テスト関数の場合は、「boolean」を選択します。

6. 「引数」表で、引数がないことを確認します。テスト関数の場合、引数は指定できません。

7. 「本体」領域に、テスト関数本体を入力します。

テスト関数本体で、assign newを使用してデシジョン関数をコールし、そのデシジョン関数をコールして戻り値を取得できます(テスト関数本体では、入力ファクトを作成し、デシジョン関数をコールし、デシジョン関数からのファクト出力を検証します)。

デシジョン関数のコールによって、Listが戻されます。つまり、テスト関数でデシジョン関数をテストする手順は、次のとおりです。

- 必要に応じて、デシジョン関数の入力引数用の入力データを作成します。

- テスト関数で作成した引数を使用してデシジョン関数をコールします。

- 結果をList形式にします。たとえば、次のようになります。

assign new List resultsList = DecisionFunction_1(testScore)

8. 関数を選択し、「テスト関数」ボタンをクリックします。

関数が実行されます。出力が、「関数テスト結果」ダイアログに表示されます。

9. 「OK」をクリックして「関数テスト結果」ダイアログを閉じます。

7.5.1 デシジョン関数のテストに関する必知事項

ルール・デザイナ内でOracle Business Rules関数を使用してデシジョン関数をテストできます。テスト関数を使用する際の注意事項は、次のとおりです。

- テストOracle Business Rules関数に関連付けられているディクショナリに検証警告が含まれている場合は、「テスト関数」ボタンがグレー表示されます。「テスト関数」ボタンが表示されるのは、ディクショナリが警告なしに検証された場合のみです。

- ロギングを有効化するために、RL.watch.all()をコールできます。RL Language関数の詳細は、『Oracle Business Process Managementルール言語リファレンス』を参照してください。このマニュアルでは、RL.watch.all()はRL Language関数watchAll()の別名です。

- 前述の例のかわりに、次の例に示す関数本体を入力することもできます。

call RL.watch.all()
assign new TestScore testScore = new TestScore()
modify (testScore, name: "Bill Reynolds", testName: "Math Test", testScore: 81)
assign new TestGrade testGrade = (TestGrade)DecisionFunction_1(testScore).get(0)
return testGrade.grade == Grade.B

testScore値が81の場合、この関数は、「テストに合格しました。」を返します。testScore値が91の場合、この関数は、「テストに失敗しました。」を返します。

この関数はRL.watch.all()を実行し、その出力を表示します。等級がB範囲である場合、ダイアログに「テストに合格しました。」が表示されます。アサートされた等級がB範囲でない場合、ダイアログに「テストに失敗しました。」が表示されます。

7.6 SOAコンポーザでのデシジョン・サービスのテスト

デシジョン・サービスを持つOracle Business Rulesを使用するBPMまたはSOAアプリケーションでは、Oracle Enterprise Manager Fusion Middleware Controlコンソールで、テスト用に自身のコンポジットのインスタンスを作成できる「Webサービスのテスト」ページを使用することによって、実行時にルールをテストできます。

自身のコンポジットの設計およびデプロイを終了した後にそのテスト・インスタンスを作成する方法の詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』のSOAコンポジット・アプリケーションのテスト・インスタンスの開始に関する項を参照してください。

デシジョン・サービス実行の監査証跡を表示できます。詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』のビジネス・ルール・トレースのモニタリングに関する項を参照してください。

8 スタンドアロン(非SOA/BPM)シナリオでのルールの使用

スタンドアロン(非SOA/BPM)シナリオでルールを使用する場合、RuleSessionルールを作成するか、デシジョン・ポイントAPIを使用できます。

RulesSessionオブジェクトの使用方法の詳細は、『Oracle Business Process Managementルール言語リファレンス』のRuleSessionの使用方法に関する項を参照してください。

デシジョン・ポイントAPIの使用方法の詳細は、「Rules SDKデシジョン・ポイントAPIの概要」を参照してください。

この章の内容は次のとおりです。

- リポジトリからのディクショナリのロード

- ルール・ディクショナリの実行

- Rules SDKデシジョン・ポイントAPIの概要

- デシジョン・ポイントで使用するディクショナリの作成

- Rules SDKデシジョン・ポイントを使用したJavaアプリケーションの作成

- レンタカー・サンプルの実行

- 本番環境でのデシジョン・ポイントの使用に関する必知事項

- デシジョン・ポイントとデシジョン・トレースに関する必知事項

Oracle Fusion Middleware Oracle Business Rules Java APIリファレンスも参照してください。

8.1 リポジトリからのディクショナリのロード

非SCA (SOA/BPM)アプリケーションは、そのアプリケーションによって使用されるルール・ディクショナリをパッケージ化し、そのアプリケーションがデプロイされるときにそれらがMDSリポジトリにコピーされるようにします。実行時にディクショナリを使用するためには、MDSから取得する必要があります。基本的なアクセス方法は、RuleRepository APIを使用してディクショナリにアクセスすることです。単純な仕様例を次に示します。

RuleRepository rr = RepositoryManager.getMDSRuleRepository(null);
// pkg and name are the dictionary package and name (Strings).
// Alternatively you could construct a DictionaryFQN
RuleDictionary rd = rr.load(pkg, name);
// if this is an editing session, edit session occurs and
// then save it when done.
rr.save(rd);
// when the RuleRepository will not be used again it must be closed.
rr.close();

一般的に、ディクショナリが変更されたときにアプリケーションが反応してディクショナリをリロードし、新しいルール定義の使用を開始する必要があります。リンクされたディクショナリが使用されている場合、ディクショナリのリロードの必要性の検知は複雑です。それは、ルート・ディクショナリでないものが変更されることがあるためです。

そのような場合、ルールを実行するためのディクショナリのロードに推奨されるメカニズムは、oracle.rules.sdk2.repository.DictionaryLoaderクラスです。DictionaryLoaderは、リンクされたディクショナリなどロードされたディクショナリを追跡し、ロード済のディクショナリをリロードする必要がある場合を判別できます。DictionaryLoaderは、DictionaryFinderインスタンスを使用して、すべてのディクショナリをロードします。DictionaryFinderが、ディクショナリを見つけるために呼び出される順序でaddFinderメソッドによってDictionaryLoaderインスタンスに追加されます。つまり、最初に追加されるファインダが、ディクショナリのロードを最初に試みることになります。DictionaryLoaderに目的のDictionaryFinderがすべて追加されたら、loadDictionary()メソッドが使用されてディクショナリがロードされます。reloadNeededメソッドを呼び出して、ディクショナリをリロードする必要があるかどうかを判別することができます。

//
// A RuleRepository instance is needed for its built-in DictionaryFinder
//
RuleRepository rr = RepositoryManager.getMDSRuleRepository(null);
DictionaryFinder rrf = rr.getDictionaryFinder();

//
// Create the dictionary loader
//
DictionaryLoader dloader = new DictionaryLoader();
dloader.addFinder(rrf);
//
// If the DecisionPointDictionaryFinder is required, add it
//
dloader.addFinder(new DecisionPointDictionaryFinder());

//
// Load the dictionary
//
DictionaryFQN fqn = new DictionaryFQN("somepackage", "myDictionary");
RuleDictionary rd = dloader.loadDictionary(fqn);

//
// Check if the dictionary needs to be reloaded
//
if (dloader.reloadNeeded(fqn))
rd = dloader.loadDictionary(fqn);

//
// When usage is complete, the RuleRepository must be closed.
//
rr.close();

8.2 ルール・ディクショナリの実行

RuleDictionaryからRuleSessionPoolを初期化するには、RuleSessioPoolの初期化と、デシジョン・ポイントAPIの使用の2つの方法があります。

詳細は、「Rules SDKデシジョン・ポイントAPIの概要」を参照してください

ルール実行のために初期化する場合、RuleDictionaryがロードされると、RuleSessionPoolはディクショナリから生成されたRLで初期化されます。

詳細は、『Oracle Business Process Managementルール言語リファレンス』のRuleSessionプールの使用方法に関する項を参照してください。

1つのデシジョン関数が呼び出される場合は、そのデシジョン関数によって参照されるルール・セットのみをロードすることが最も効率的です。RuleSessionPoolコンストラクタに渡されるRLテキストのリストを構築するサンプル・コードを次に示します。

簡潔にするために、エラー・チェックおよび例外処理は表示していないことに注意してください。

RuleDictionary rd;  // previously loaded dictionary
String dfAlias = "Alias for my Decision Function";
DecisionFunction df =
rd.getCombinedDataModel().getDecisionFunctionByAlias(dfAlias);
List<String> rlList = new ArrayList<String>();
//
// Add the RL for the data model
//
rlList.add(rd.dataModelRL());
//
// Add the RL for each rule set referenced by the decision function
//
Collection<String> rsal = df.getRuleSets();
for (String alias : rsal)
{
rlList.add(rd.ruleSetRL(alias));
}

同じRuleSessionPoolから複数のデシジョン関数が呼び出される場合、各デシジョン関数によって参照されるルールセットのRLを追加することでこれが可能になます。同じルールセットを2回追加しないように注意してください。

ルールを使用して実行時に実行する他のルールセットを動的に選択するなど他のシナリオでは、ディクショナリ内のルールセットをすべてロードすることが必要になります。これを実行するサンプル・コードを、次に示します。

RuleDictionary rd;  // previously loaded dictionary
List<String> rlList = new ArrayList<String>();
//
// Add the RL for the data model
//
rlList.add(rd.dataModelRL());
//
// Add the RL for each rule set referenced by the decision function
//
Collection<String> rsal = rd.getRuleSetAliases(true);
for (String alias : rsal)
{
rlList.add(rd.ruleSetRL(alias));
}

8.3 Rules SDKデシジョン・ポイントAPIの概要

この項では、Oracle Business Rules SDK (Rules SDK)を使用して、Oracle Business Rulesのディクショナリのルールにアクセスしたり、ルールを作成、変更および実行したり、ディクショナリの内容を操作するアプリケーションを記述したりする方法について説明します。Rules SDKの概要、およびRules SDKデシジョン・ポイントAPIの使用方法についても説明します。Rules SDKは、次の4つの領域で構成されています。

- エンジン: ルール実行の準備をします。

- ストレージ: ルールのディクショナリとリポジトリへのアクセスを提供します。

- 編集: ディクショナリ・コンポーネントの作成と変更をプログラムで行えるようにします。

- デシジョン・ポイント: ディクショナリにアクセスしたりデシジョン関数を実行するためのインタフェースを提供します。

説明以外の目的でRules SDKのこれらの領域が明示的に区別されることはありません。たとえば、ルールを編集するには、Rules SDKのストレージ領域を使用して、ディクショナリにもアクセスする必要があります。Rules SDKがこれらの領域に分割されているのは、個別のRules SDK APIを説明するためではなく、各種の使用モードを説明しやすくするためです。

8.3.1 デシジョン・ポイントAPIの使用

デシジョン・ポイントAPIを使用すると、ルールを簡単に実行できます。ほとんどのユーザーは、Oracle JDeveloperのルール・デザイナ拡張機能を使用して、データ・モデル要素、ルール、デシジョン表、ルールセットなどのOracle Business Rulesアーティファクトを作成します。したがって、ほとんどのユーザーは、Rules SDKのエンジン、ストレージまたは編集機能を直接使用する必要はありません。

Rules SDKのデシジョン・ポイント・パッケージを使用するには、次の3つの重要なクラスを理解する必要があります。

- DecisionPoint: ファクトリの設計パターンに従ってDecisionPointInstanceのインスタンスを作成するヘルパー・クラスです。ほとんどのアプリケーションには、すべてのアプリケーション・スレッドで共有されるDecisionPointオブジェクトが1つ必要です。コール元はDecisionPointのgetInstance()メソッドを使用して、定義済デシジョン・ポイントのコールに使用できるDecisionPointInstanceのインスタンスを取得します。

- DecisionPointBuilder: ビルダーの設計パターンに従ってデシジョン・ポイントを作成します。

- DecisionPointInstance: ユーザーはこのクラスのinvoke()をコールしてファクトをアサートし、デシジョン関数を実行します。

DecisionPointクラスでは、流れるようなインタフェース・モデルがサポートされているため、メソッドを連鎖させることができます。詳細は、次の章を参照してください。

http://www.martinfowler.com/bliki/FluentInterface.html

デシジョン・ポイントは、次のようなルール実行のいくつかの側面を管理します。

- oracle.rules.rl.RuleSessionオブジェクトの使用

- ディクショナリ更新時のディクショナリのリロード

Javaアプリケーションのデシジョン・ポイントを作成するために必要なものは次のとおりです。

- MDSリポジトリからロードするディクショナリまたは事前ロード済のoracle.rules.sdk2.dictionary.RuleDictionaryインスタンスの名前。

- 指定したディクショナリに格納されているデシジョン関数の名前。

8.3.2 レンタカー・サンプル・アプリケーションの入手方法

この章では、Rules SDKとデシジョン・ポイントAPIの使用方法を示すレンタカー・アプリケーションについて説明します。このサンプル・アプリケーションは、CarRentalApplication.zipというZIPファイルで入手できます。このZIPファイルには、完全なJDeveloperアプリケーションとプロジェクトが含まれています。

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

サンプルを使用するには、CarRentalApplication.zipを適切なディレクトリに解凍します。レンタカー・アプリケーションのプロジェクトには、ルール・ディクショナリおよびRules SDKを使用したいくつかのJavaサンプルが含まれています。

例についての詳細は、「等級サンプル・アプリケーションの概要」を参照してください。

8.3.3 レンタカー・サンプル・アプリケーションとプロジェクトを開く方法

レンタカー・サンプル・アプリケーションにより、Rules SDKデシジョン・ポイントAPIの使用方法がわかります。

レンタカー・サンプル・アプリケーションを開く手順は、次のとおりです。

1. Oracle JDeveloperを起動します。

2. サンプルを解凍したディレクトリにあるレンタカー・アプリケーションを開きます。たとえば、「ファイル」メニューから「開く」を選択し、「開く」ダイアログでCarRentalApplicationフォルダにナビゲートします。

3. 「開く」ダイアログで「CarRentalApplication.jws」を選択し、「開く」をクリックします。

4. 「アプリケーション・ナビゲータ」で「CarRentalApplication」を開き、「アプリケーション・ソース」と「リソース」を開きます。CarRental.rulesという名前のOracle Business RulesディクショナリといくつかのJavaソース・ファイルが表示されます。

8.4 デシジョン・ポイントで使用するディクショナリの作成

レンタカー・サンプルでは、事前ロード済のOracle Business RulesディクショナリまたはMDSに格納されているリポジトリでRules SDKデシジョン・ポイントAPIを使用します。開発環境で作業する場合は、事前ロード済のディクショナリ・シグネチャでデシジョン・ポイントAPIを使用できます。本番環境では、一般にMDSリポジトリ・シグネチャでデシジョン・ポイントを使用します。

CarRentalディクショナリが事前に定義されており、レンタカー・サンプル・アプリケーションで使用できます。

デシジョン・ポイントAPIを使用するには、デシジョン関数を含むディクショナリを作成する必要があります(レンタカー・サンプル・アプリケーションには、事前定義済のディクショナリとデシジョン関数が用意されています)。

ディクショナリとデシジョン関数を作成するには、次の手順を実行します。

- デシジョン・ポイントで使用するデータ・モデル要素の作成方法

- デシジョン・ポイントからコールするデシジョン関数の表示方法

- デシジョン関数のルールまたはデシジョン表の作成方法

8.4.1 デシジョン・ポイントで使用するデータ・モデル要素の作成方法

注意:

スクリーン・ショットは、前のバージョンを反映していますが、内容は現在のリリースにも当てはまります。

デシジョン・ポイントを使用してアプリケーションを作成する場合、デシジョン関数に追加する次のディクショナリが必要になります。

- ルールまたはデシジョン表の作成に使用するデータ・モデル要素を含むディクショナリ。ADFビジネス・コンポーネント・ファクト・タイプを使用する場合は、デシジョン・ポイント・サポート・ディクショナリのリンクを追加する必要があります。詳細は、データ・モデル要素の使用を参照してください。詳細は、Oracle Business RulesとADFビジネス・コンポーネントの使用を参照してください。

- ファクト定義を含むディクショナリ。詳細は、「ファクトと値セットの使用」を参照してください。

サンプル・アプリケーションのデータ・モデルを表示する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。

2. 図8-1に示すように、「Javaファクト」タブを選択します。

「Javaファクト」タブに、ディクショナリに組み込まれているファクト・タイプに加えて、インポートされた次の4つのファクト・タイプが表示されます。

Driver Javaファクトは、プロジェクト内のDriver Javaクラスからインポートされています。

Denial Javaファクトは、プロジェクト内のDenial Javaクラスからインポートされています。

LicenseTypeファクトとVehicleTypeファクトは、Driverクラスで定義されている、ネストしたenumクラスからインポートされています。

図8-1 レンタカー・サンプル・アプリケーション用に定義されているJavaファクト

Rules SDKのデシジョン・ポイントを使用する場合は、指定したディクショナリ内のデシジョン関数をコールします。コールするデシジョン関数には、デシジョン・ポイントの一部として実行される1つ以上のルールセットを含めることができます。

同じく、用意されているレンタカー・サンプル・アプリケーションのルールセットを表示するには、ルール・デザイナでCarRentalApplicationを展開します。CarRentalApplicationで、「リソース」を展開し、「CarRental.rules」をダブルクリックします

8.4.2 デシジョン・ポイントからコールするデシジョン関数の表示方法

デシジョン・ポイントAPIを使用する場合は、デシジョン関数を使用してOracle Business Rulesディクショナリを公開します。デシジョン関数の詳細は、デシジョン関数の使用を参照してください。

レンタカー・サンプル・アプリケーションのデシジョン関数を表示する手順は、次のとおりです。

1. Rules Designerで、「デシジョン関数」ナビゲーション・タブをクリックします。図8-2に示すように、CarRentalディクショナリ内の使用可能なデシジョン関数が表示されます。

図8-2 レンタカー・サンプルのデシジョン関数

2. CarRentalDecisionFunctionの行を選択し、デシジョン関数のアイコンをダブルクリックします。図8-3に示すように、「デシジョン関数の編集」ダイアログが開きます。

デシジョン関数の「入力」表には、Driverファクト・タイプの単一の引数が表示されます。

デシジョン関数の「出力」表には、Denialファクト・タイプの単一の引数が表示されます。

デシジョン関数の「ルールセットおよびデシジョン関数」領域の「選択済」ボックスには、「Denial Rules:if-then」が表示されます。

図8-3 レンタカー・サンプル・アプリケーションのレンタカー・デシジョン関数

8.4.3 デシジョン関数のルールまたはデシジョン表の作成方法

レンタカー・サンプルには2つのルールセットが含まれています。一方にはIF/THENルール、もう一方にはデシジョン表が含まれています。デシジョン・ポイントの使用時は、IF/THENルールかデシジョン表のいずれか、または両方をアプリケーションで使用できます。

レンタカー・サンプル・アプリケーションのルールを表示する手順は、次のとおりです。

1. 図8-4に示すように、ルール・デザイナで「Denial Rules:if-then」ルールセットをクリックします。

図8-4 レンタカー・サンプル・アプリケーションのIF/THENルールを含むルールセット

「Denial Rules:if-then」ルールセットには、次の2つのルールが含まれています。

- under age: このルールは、運転者の最低年齢を定義します。DriverインスタンスのageプロパティをグローバルのMinimum driver ageと比較します。運転者がこの年齢未満の場合、新しいDenialファクトがアサートされます。デシジョン関数へのコールにより、このDenialファクトが出力の定義に従って収集されます。

- too many accidents: このルールは、それを超えると運転者がレンタルを拒否される、事故回数の上限値を定義します。また、このルールは、Denialが作成された理由を示す監査出力を提供するために、ユーザー定義関数auditもコールします。

2. レンタカー・アプリケーションのデシジョン表を表示するには、図8-5に示すように、ルール・デザイナで「Denial Rules:decision table」ルールセットをクリックします。

図8-5 レンタカー・サンプル・アプリケーションのデシジョン表を含むルールセット

8.4.4 デシジョン表を使用したレンタカー・サンプルの使用に関する必知事項

レンタカー・サンプル・アプリケーションには、「Denial Rules: decision table」ルールセットが含まれています。用意されているデシジョン関数サンプルでデシジョン表を使用するように切り替えるには、図8-6に示すように、デシジョン関数の「選択済」領域から「Denial Rules:if-then」を移動し、デシジョン表を使用して同様のルールを定義する「Denial Rules: decision table」ルールセットをこの領域に追加します。

図8-6 デシジョン表ルールセットを使用したレンタカー・サンプルのデシジョン関数

8.5 Rules SDKデシジョン・ポイントを使用したJavaアプリケーションの作成

開発環境でRules SDKを使用する場合は、事前ロード済のディクショナリでデシジョン・ポイントAPIを使用できます。本番環境では、一般にMDSリポジトリ・シグネチャでデシジョン・ポイントAPIを使用し、ディクショナリはMDSに格納されます。デシジョン・ポイントの使用方法の詳細は、「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

CarRentalProjectプロジェクトには、レンタカー・サンプル・ファイルCarRentalWithDecisionPointUsingPreloadedDictionary.javaを含む、com.example.rules.demoパッケージが含まれています。このプロジェクトには、デシジョン・ポイントを使用するための様々なバリエーションをサポートする複数の.javaソース・ファイルも含まれています。表8-1に、レンタカー・サンプルの様々なバージョンのサマリーを示します。

Rules SDKデシジョン・ポイントAPIの使用方法の詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

表8-1 デシジョン・ポイント・サンプルCarRentalProject内のJavaファイル

ベースJavaファイル名

説明

CarRental

これはすべてのサンプルのベース・クラスです。CarRentalディクショナリおよびDriverクラスのインスタンスを作成するcreateDriversメソッドを使用するための定数値が含まれています。

CarRentalWithDecisionPoint

DecisionPointタイプの静的属性およびDriverクラスの指定したインスタンスでデシジョン・ポイントを起動するcheckDriver()メソッドが含まれています。これらのメソッドはサンプル・アプリケーション用に含まれているため、MDSリポジトリと事前ロード済ディクショナリの両方のサンプルで同じcheckDriver()の実装を共有できます。

CarRentalWithDecisionPointUsingMdsRepository

MDSを使用してルール・ディクショナリのアクセスとロードを行うデシジョン・ポイントの作成サンプルが含まれています。本番環境では、ほとんどのアプリケーションはデシジョン・ポイントAPIをMDSで使用します。

CarRentalWithDecisionPointUsingPreloadedDictionary

RuleDictionaryクラスのインスタンスからデシジョン・ポイントを作成するサンプルが含まれています。このサンプルには、ディクショナリを手動でロードしてRuleDictionaryインスタンスを作成するためのコードも含まれています。

CarRentalWithRuleSession

エンジンAPIの高度な使用サンプルが含まれています。詳細はコメントに記述されています。

CarRentalWithRuleSessionPool

エンジンAPIの高度な使用サンプルが含まれています。詳細はコメントに記述されています。

Denial

ルールとデシジョン表の作成に使用されるDenialファクト・タイプを定義するクラスが含まれています。

Driver

ルールとデシジョン表の作成に使用されるDriverファクト・タイプを定義するクラスが含まれています。

DriverCheckerRunnable

同時ユーザーによるデシジョン・ポイントの起動をシミュレートするスレッドとして使用できるクラスが含まれています。

8.5.1 デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法

デシジョン・ポイントを使用するには、次の例に示すように、DecisionPointBuilderを使用してDecisionPointインスタンスを作成します。

static {
try {
// specifying the Decision Function and a pre-loaded
// RuleDictionary instance
m_decisionPoint =  new DecisionPointBuilder()
.with(DF_NAME)
.with(loadRuleDictionary())
.build();
} catch (SDKException e) {
System.err.println("Failed to build Decision Point: " + e.getMessage());
e.printStackTrace();
}
}

前の例は、DecisionPointBuilderが流れるようなインタフェース・パターンをサポートしているため、デシジョン・ポイントの作成時にすべてのメソッドを容易に連鎖させることができることを示しています。DecisionPointBuilderでデシジョン・ポイントを構成するための最も一般的な3つのメソッドは、with()という名前を持つようにオーバーロードされます。各with()メソッドは、RuleDictionary型、DictionaryFQN型またはString型の単一の引数を使用します。DecisionPointBuilderは、類似のsetメソッドとgetメソッド(getDecisionFunction()、setDecisionFunction()、getDictionary()、setDictionary()、getDictionaryFQN()、setDictionaryFQN())もサポートしています。

前の例に示すこの連鎖には、次のステップが含まれています。

1. 最初のステップでは、次のようなコードでDecisionPointBuilderインスタンスを作成します。

new DecisionPointBuilder()

2. String引数を使用するwith()メソッドで、デシジョン・ポイントによって実行されるデシジョン関数の名前を定義します。このメソッドのコールは必須です。

.with(DF_NAME)

DF_NAMEには、アプリケーションで定義したデシジョン関数の名前を指定します。たとえば、レンタカー・サンプル・アプリケーションでは、DF_NAMEがCarRental.javaでCarRentalDecisionFunctionと定義されています。

3. これ以外の2つのwith()メソッドのうち、いずれか1つのみをコールします。このサンプル・コードでは、指定したデシジョン関数を含む事前ロード済のルール・ディクショナリ・インスタンスを使用しています。loadDictionary()メソッドは、ファイルからRuleDictionaryのインスタンスをロードします。例8-1に、loadDictionary()メソッドを示します。詳細は、「事前ロード済のディクショナリでデシジョン・ポイントを使用する方法」を参照してください。

.with(loadRuleDictionary())

4. DecisionPointインスタンスを作成して戻すために、build()メソッドをコールします。

DecisionPointインスタンスは、アプリケーションのすべてのインスタンス間で共有されます。このためこのインスタンスは静的な属性で、静的なブロック内で作成されます。DecisionPointを初期化する別の方法としては、DecisionPointインスタンスを作成して戻した静的なメソッドを使用して、m_decisionPoint属性を初期化することが考えられます。

8.5.2 事前ロード済のディクショナリでデシジョン・ポイントを使用する方法

例8-1に、ファイルからRuleDictionaryのインスタンスをロードするloadRuleDictionary()メソッドを示します。

例8-1に示すように、ファイルから直接ディクショナリの読取りまたは書込みを行う場合は、必ずエンコーディングをUTF-8に設定します。そうでない場合、ディクショナリで使用するUnicode文字が破損してしまいます。UTF-8オプションは、FileInputStreamまたはOutputStreamWriterコンストラクタ内で明示的に設定する必要があります。FileReaderやFileWriterなどのJavaクラスは使用できません。これらのクラスはプラットフォームのデフォルト・エンコーディングを常に使用しており、それは通常はUnicodeバリアントではなくASCIIバリアントだからです。

例8-1 ルール・ディクショナリのロード・メソッド

private static RuleDictionary loadRuleDictionary(){
RuleDictionary dict = null;
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(
new File(DICT_LOCATION)), "UTF-8"));
dict = RuleDictionary.readDictionary(reader,
new
DecisionPointDictionaryFinder(null));

List<SDKWarning> warnings = new ArrayList<SDKWarning>();

dict.update(warnings);
if (warnings.size() > 0) {
System.err.println("Validation warnings: " + warnings);
}
} catch (SDKException e){
System.err.println(e);
} catch (FileNotFoundException e){
System.err.println(e);
} catch (IOException e){
System.err.println(e);
} finally {
if (reader != null) { try { reader.close(); } catch (IOException
ioe) {ioe.printStackTrace();}}
}
return dict;
}

8.5.3 エグゼキュータ・サービスを使用してデシジョン・ポイントでスレッドを実行する方法

レンタカー・サンプルでは、Oracle Business Rulesを使用して複数の同時ユーザーをシミュレートできます。次のコード例に、JavaのExecutorServiceインタフェースを使用して、デシジョン・ポイントを起動する複数のスレッドを実行する方法を示します。ExecutorServiceは、Rules SDKデシジョン・ポイントAPIに含まれていません。

ExecutorService exec = Executors.newCachedThreadPool();
List<Driver> drivers = createDrivers();

for (int i = 0; i < NUM_CONCURRENT; i++) {
Driver driver = drivers.get(i % drivers.size());
exec.execute(new DriverCheckerRunnable(driver));
}

前の例には、サンプル・アプリケーションの次のコードが含まれています。

- エグゼキュータ・サービスを作成します。

ExecutorService exec = Executors.newCachedThreadPool();

- CarRental.javaに定義されているcreateDrivers()メソッドをコールして、Driverインスタンスのリストを作成します。

List<Driver> drivers = createDrivers();

- Driverインスタンスのリストをループしてdriverリストに運転者を格納します。

- ループでDriverCheckerRunnableインスタンスから複数のスレッドを開始します。これらのインスタンスはデシジョン・ポイントを開き、各運転者に対してルールを実行します。このコードの詳細は、「デシジョン・ポイント・インスタンスの作成および使用方法」を参照してください。

次のコード例は、スレッドの完了を待機するコードです。

try {
exec.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
exec.shutdown();
}

8.5.4 デシジョン・ポイント・インスタンスの作成および使用方法

DriverCheckerRunnableインスタンスはcheckDriver()メソッドをコールします。例8-2に、CarRentalWithDecisionPointで定義されているcheckDriver()メソッドを示します。checkDriver()メソッドは、Driverインスタンスによるデシジョン・ポイントの起動を処理します。

例8-2は、次のことを示しています。

- 次のコードにより、DecisionPointBuilderで定義された静的なDecisionPointからDecisionPointInstanceを取得します。

DecisionPointInstance instance = m_decisionPoint.getInstance();

- デシジョン・ポイントに関連付けられているデシジョン関数のシグネチャに従って入力を追加します。ここでは入力としてList型の引数を1つ定義しています。このListには、Driverインスタンスが格納されます。

instance.setInputs(new ArrayList<Object>() {
{
add(driver);
}
});

- デシジョン・ポイントを起動し、戻り値を格納します。戻り型は、デシジョン・ポイントでコールされるデシジョン関数と同じパターンに従います。

List<Object> outputs = instance.invoke();

この例では、invoke()は、DenialインスタンスのListが格納された長さ1のListを戻します。

- 1以外のサイズのListが戻された場合は、エラーが生成されます。

if (outputs.isEmpty())
System.err.println("Oops, no results");

- デシジョン・ポイントから戻される最初のエントリは、List<Denial>型のリストにキャストされます。

java.util.List<Denial> denials =
(java.util.List<Denial>)outputs.get(0);

- denialsリストが空の場合、Denialインスタンスはルールによってアサートされませんでした。これは、車を運転者に貸してもよいことを意味しています。それ以外の場合は、運転者がレンタルを拒否された理由を出力します。

if (denials.isEmpty()) {
System.out.println("Rental is allowed for " +
driver.getName());
} else {
for (Denial denial : denials) {
System.out.println("Rental is denied for " +
denial.getDriver().getName() +
" because " + denial.getReason());
}
}

8.5.4.1 getInstance()でデシジョン・ポイント・インスタンスを作成するサンプル・コード

DriverCheckerRunnableインスタンスはcheckDriver()メソッドをコールします。例8-2に、CarRentalWithDecisionPointで定義されているcheckDriver()メソッドを示します。checkDriver()メソッドは、Driverインスタンスによるデシジョン・ポイントの起動を処理します。

例8-2 getInstance()でデシジョン・ポイント・インスタンスを作成するコード

public class CarRentalWithDecisionPoint extends CarRental {

protected static DecisionPoint m_decisionPoint;

public static void checkDriver(final Driver driver) {
try {
DecisionPointInstance instance = m_decisionPoint.getInstance();
instance.setInputs(new ArrayList<Object>() {
{
add(driver);
}
});
List<Object> outputs = instance.invoke();

if (outputs.isEmpty())
System.err.println("Oops, no results");

java.util.List<Denial> denials =
(java.util.List<Denial>)outputs.get(0);
if (denials.isEmpty()) {
System.out.println("Rental is allowed for " +
driver.getName());
} else {
for (Denial denial : denials) {
System.out.println("Rental is denied for " +
denial.getDriver().getName() +
" because " + denial.getReason());
}
}
} catch (RLException e) {
e.printStackTrace();
} catch (SDKException e) {
e.printStackTrace();
}
}

}

8.6 レンタカー・サンプルの実行

システムにインストールされているレンタカー・サンプルで、例8-1に示すコードのDICT_LOCATIONの値をシステムのディクショナリの場所にあわせて変更します。

システムでレンタカー・サンプルを実行する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「編集」メニューから「パスのコピー」を選択します。

2. CarRental.javaファイルで、パスの値をDICT_LOCATIONの値に貼り付けます。

3. CarRentalProjectで、CarRentalWithDecisionPointUsingPreloadedDictionary.javaファイルを選択します。

4. 右クリックしてリストから「実行」を選択します。

8.6.1 レンタカーのサンプル出力

例8-3に、レンタカー・アプリケーションのサンプル出力を示します。

例8-3 レンタカー・サンプルの出力

Rental is allowed for Carol
Rental is allowed for Alice
Rental is allowed for Alice
Rental is allowed for Carol
Rental is denied for Bob because under age, age was 15, minimum age is 21
Mar 13, 2009 11:18:00 AM oracle.rules.rl.exceptions.LogWriter flush
INFO: Fired: under age because driver age less than minimum threshold for license number d222
Mar 13, 2009 11:18:00 AM oracle.rules.rl.exceptions.LogWriter flush
INFO: Fired: under age because driver age less than minimum threshold for license number d222
Rental is denied for Bob because under age, age was 15, minimum age is 21
Rental is allowed for Alice
Rental is allowed for Eve

8.7 本番環境でのデシジョン・ポイントの使用に関する必知事項

本番環境では、MDSリポジトリを使用してOracle Business Rulesのディクショナリを格納できます。MDSリポジトリを使用してディクショナリを格納する場合は、「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」と「事前ロード済のディクショナリでデシジョン・ポイントを使用する方法」で示したステップが、ディクショナリにアクセスするように変わります。CarRentalWithDecisionPointUsingMdsRepositoryに、MDSでデシジョン・ポイントを使用するためのサンプル・コードを示します。

デシジョン・ポイントを使用してMDSのディクショナリにアクセスする方法を示すデプロイメント・ステップの完全なサンプルは、「Rules SDKコールを含む等級アプリケーションのサーブレットの追加」を参照してください。

次のコード例は、DecisionPointBuilderと一緒にDictionaryFQNを使用してMDSリポジトリのディクショナリにアクセスする方法を示します。完全なサンプルは、CarRentalWithDecisionPointUsingMdsRepositoryのサンプル・コードにあります。

static {
try {
// specifying the Decision Function and Dictionary FQN
// loads the rules from the MDS repository.
m_decisionPoint = new DecisionPointBuilder()
.with(DF_NAME)
.with(DICT_FQN)
.build();
} catch (SDKException e) {
System.err.println("Failed to build Decision Point: " +
e.getMessage());

「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」の項の手順と同様に、前の例では次のことを示しています。

1. 最初のステップで、次のコードによりDecisionPointBuilderインスタンスを作成します。

new DecisionPointBuilder()

2. String引数を使用するwith()メソッドで、デシジョン・ポイントによって実行されるデシジョン関数の名前を定義します。このメソッドのコールは必須です。

.with(DF_NAME)

DF_NAMEには、アプリケーションで定義したデシジョン関数の名前を指定します。たとえば、レンタカー・サンプル・アプリケーションでは、これはCarRental.javaでCarRentalDecisionFunctionと定義されています。

3. これ以外の2つのwith()メソッドのうち、いずれか1つのみをコールします。このサンプル・コードでは、DictionaryFQNをコールしてMDSリポジトリにアクセスします。ステップ4のコード例は、ディクショナリ・パッケージとディクショナリ名を使用してDictionaryFQNを作成するルーティングを示します。

.with(DICT_FQN)

4. DecisionPointインスタンスを作成して戻すために、build()メソッドをコールします。

protected static final String DICT_PKG = "com.example.rules.demo";
protected static final String DICT_NAME = "CarRental";

protected static final DictionaryFQN DICT_FQN =
new DictionaryFQN(DICT_PKG, DICT_NAME);
protected static final String DF_NAME = "CarRentalDecisionFunction";

8.8 デシジョン・ポイントとデシジョン・トレースに関する必知事項

Rules SDK APIには、デシジョン・トレース処理に役立つメソッドが含まれています。これらのメソッドは、トレース内で使用されているRL名を、関連するディクショナリで使用されている別名に置き換えるよう、デシジョン・トレースを処理します。これにより、デシジョン・トレースのネーミングとOracle Business Rulesディクショナリで使用されているネーミングとの一貫性が保たれます。

デシジョン・トレースを処理するための基本APIには、RuleDictionaryオブジェクトとDecisionTraceオブジェクトが必要です。

RuleDictionary dict = ...;
DecisionTrace trace = ...;
dict.processDecisionTrace(trace);

このコードは、別名によってディクショナリ内と同じ名前を使用するように、デシジョン・トレース内のネーミングを変換する処理コールを示しています。

Rules SDKデシジョン・ポイントAPIには、デシジョン・トレースを構成し、デシジョン・ポイントの起動時に結果のトレースを取得できるようにするメソッドが含まれています。

表8-2に、デシジョン・トレース・オプションを設定するためのデシジョン・ポイントAPIメソッドを示します。これらのメソッドの詳細は、『Oracle Business Process Managementルール言語リファレンス』を参照してください。

表8-2 デシジョン・ポイントのデシジョン・トレースのメソッド

メソッド

説明

decisionTrace

起動のためのコールから作成されたデシジョン・トレースを取得します。

DecisionTraceを戻します

getDecisionTraceLevel

RuleSessionによって使用されるデシジョン・トレース・レベルを取得します。この値のデフォルトはDECISION_TRACE_OFFです。これはトレース情報が何も収集されていないことを意味しています。可能な値は、DECISION_TRACE_OFFです。

DECISION_TRACE_DEVELOPMENT

DECISION_TRACE_PRODUCTION

戻り型: String

getDecisionTraceLimit

デシジョン・トレースの制限、またはトレースのために取得されるトレース要素の最大数を取得します。

戻り型: int

setDecisionTraceLevel

RuleSessionによって使用されるデシジョン・トレース・レベルを設定します。このパラメータ値はStringです。可能な値は、DECISION_TRACE_OFFです。

DECISION_TRACE_DEVELOPMENT

DECISION_TRACE_PRODUCTION

setDecisionTraceLimit

デシジョン・トレースの制限、またはトレースのために取得されるトレース要素の最大数を設定します。

8.8.1 デシジョン・トレースの使用例

例8-4に、デシジョン・ポイントAPIによるデシジョン・トレースの使用例を示します。

デシジョン・トレースの詳細は、『Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』のFusion Middleware Controlコンソールでのルール実行のトレースに関する項参照してください。

例8-4 デシジョン・ポイントAPIからのデシジョン・トレースの使用

DecisionPoint dp = new DecisionPointBuilder()
.with(new DictionaryFQN("com.foo", "Bar"))
.with("MyDecisionFunction")
.setDecisionTraceLevel(DecisionPointBuilder.DECISION_TRACE_DEVELOPMENT)
.setDecisionTraceLimit(24000)
.build();

...

DecisionPointInstance dpi = dp.getInstance();

dpi.invoke();

DecisionTrace trace = dpi.decisionTrace();

9 ルール対応の非SOA Java EEアプリケーションの作成

この章では、Oracle JDeveloperを使用して、ルール対応非SOA Java Enterprise Edition (EE)アプリケーションを作成する方法について説明します。また、Oracle Business Rulesを使用してJava EEアプリケーションとして動作するサンプル・アプリケーションJava Servletについて説明します(SOAコンポジットなしのOracle Business Rulesの使用方法を説明します)。

この章の内容は以下のとおりです。

- 等級サンプル・アプリケーションの概要

- 等級サンプル・アプリケーション用のアプリケーションとプロジェクトの作成

- 等級サンプル・アプリケーション用のデータ・モデル要素とルールの作成

- Rules SDKコールを含む等級アプリケーションのサーブレットの追加

- 等級サンプル・アプリケーション用HTMLテスト・ページの追加

- デプロイメントのための等級サンプル・アプリケーションの準備

- 等級サンプル・アプリケーションのデプロイと実行

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

9.1 等級サンプル・アプリケーションの概要

等級アプリケーションは、Java Servlet内Oracle Business Rulesのサンプル使用を示しています。サーブレットでは、Rules SDKデシジョン・ポイントAPIが使用されます。

このサンプルは、次のことを示しています。

- データ・モデルの入力データ、出力データおよびファクトを定義するXSDスキーマを使用した、Oracle Business Rulesディクショナリへのルールの作成。この場合、ファイルgrades.xsdでXSDスキーマを指定します。

- 入力である各テスト・スコアについて、等級の判別にOracle Business Rulesを使用するサーブレットの作成。

- 入力であるテスト・スコアを提供して、データを等級サーブレットに送信するためのテスト・ページの作成。

- アプリケーションのデプロイと実行、テスト値の送信および出力の表示。

もう1つの例があります。詳細は、「レンタカー・サンプル・アプリケーションとプロジェクトを開く方法」を参照してください。

9.2 等級サンプル・アプリケーション用のアプリケーションとプロジェクトの作成

次の手順に従って、等級サンプル・アプリケーションを作成できます。

注意:

スクリーン・ショットは、前のバージョンを反映していますが、内容は現在のリリースにも当てはまります。

等級サンプル・アプリケーション用のアプリケーションおよびプロジェクトを作成する手順は、次のとおりです。

- Fusion Webアプリケーション(ADF)を作成します。

- アプリケーション内でプロジェクトを作成します。

- データ・モデルの入力、出力およびオブジェクトを定義するスキーマを追加します。

- プロジェクト内でOracle Business Rulesディクショナリを作成します。

9.2.1 等級サンプル・アプリケーション用のFusion Webアプリケーションの作成方法

Oracle Business Rulesで作業しJava EEアプリケーションを作成するには、まずOracle JDeveloperでアプリケーションを作成する必要があります。

Fusion Webアプリケーション(ADF)を作成する手順は、次のとおりです。

1. アプリケーションを作成します。そのためには、「アプリケーション・ナビゲータ」で「新規アプリケーション」を選択するか、または「アプリケーション」メニューのリストから「新規アプリケーション」を選択します。

2. 「アプリケーションの名前付け」ダイアログで、図9-1に示すようにアプリケーションのオプションを入力します。

a. 「アプリケーション・テンプレート」領域で「Fusion Web Application」を選択します。

b. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、GradeAppと入力します。

c. 「ディレクトリ」フィールドで、ディレクトリ名を指定するか、またはデフォルトを使用します。

d. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞を入力します。たとえば、com.example.gradesと入力します。
この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。

図9-1 GradeAppアプリケーションの追加

3. 「終了」をクリックします。アプリケーションを作成すると、図9-2に示すようなファイルのサマリーがOracle JDeveloperに表示されます。

図9-2 GradeAppという新しい等級アプリケーション

9.2.2 アクセス可能なADF Facesページの開発方法

Oracleソフトウェアには、http://www.oracle.com/accessibility/standards.htmlにある標準の解説を使用した、Web Content Accessibility Guidelines (WCAG) 1.0 Level AAの標準が実装されています。

ADF Facesのユーザー・インタフェース・コンポーネントには、視覚的および身体的な障害のあるユーザーのために、組込みのアクセシビリティ・サポートが用意されています。スクリーン・リーダーのような非視覚的なメディアへのレンダリングを行うWebブラウザなどのユーザー・エージェントにより、コンポーネントのテキスト説明が読み上げられ、障害を持つユーザーに有益な情報が提供されます。アクセス・キー・サポートは、キーボードのみを使用してコンポーネントやリンクにアクセスする代替の方法を提供します。ADF Facesのアクセシビリティ監査ルールにより、アクセス可能なHTMLマークアップを使用して、アクセス可能なイメージ、表、フレーム、フォーム、エラー・メッセージおよびポップアップ・ウィンドウの作成が指示されています。

アクセス可能なADF Facesページの開発方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のアクセス可能なADF Facesページの開発に関する項を参照してください。

9.2.3 Gradesプロジェクトの作成方法

等級サンプル・アプリケーションでは、ModelまたはViewControllerプロジェクトは使用しません。等級サンプル・プロジェクト用にアプリケーションでプロジェクトを作成します。

Gradesプロジェクトを作成する手順は、次のとおりです。

1. GradeAppアプリケーションで、「アプリケーション・ナビゲータ」の「アプリケーション」メニューから「新規プロジェクト」を選択します。

2. 「新規ギャラリ」の「項目」領域で、「汎用プロジェクト」を選択します。

3. 「OK」をクリックします。

4. 「プロジェクトの名前付け」ページで、図9-3に示すように値を入力します。

a. 「プロジェクト名」フィールドに名前を入力します。たとえば、Gradesと入力します。

b. ディレクトリ名を入力または参照するか、デフォルトを使用します。

c. 「プロジェクト・テクノロジ」タブを選択します。

d. 「使用可能」領域で「ADFビジネス・コンポーネント」をダブルクリックして、この項目を「選択済」領域に移動します。これにより、図9-3に示すようにJavaも「選択済」領域に追加されます。

図9-3 等級アプリケーションへの汎用プロジェクトの追加

5. 「終了」をクリックします。これにより、Gradesプロジェクトが追加されます。

9.2.4 Gradesプロジェクト内でのXMLスキーマの追加方法とJAXBクラスの生成方法

Gradesサンプル・アプリケーションを作成するには、次に示すサンプルのgrades.xsdスキーマのように、grades.xsdファイルを使用する必要があります。スキーマ・ファイルをローカルで作成し保存してから、Oracle JDeveloperを使用してファイルをプロジェクトにコピーできます。

<?xml version= '1.0' encoding= 'UTF-8' ?>
<xs:schema targetNamespace="http://example.com/grades"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://example.com/grades"
attributeFormDefault="qualified" elementFormDefault="qualified"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:extensionBindingPrefixes="xjc"
jaxb:version="2.0">

<xs:element name="TestScore">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="testName" type="xs:string"/>
<xs:element name="testScore" type="xs:double"/>
<xs:element name="testCurve" type="xs:double"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="TestGrade">
<xs:complexType>
<xs:sequence>
<xs:element name="grade" type="tns:Grade"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="Grade">
<xs:restriction base="xs:string">
<xs:enumeration value="A"/>
<xs:enumeration value="B"/>
<xs:enumeration value="C"/>
<xs:enumeration value="D"/>
<xs:enumeration value="F"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

XMLスキーマをGradesプロジェクトに追加する手順は、次のとおりです。

1. サンプルのgrades.xsdスキーマのスキーマ・ファイルを、ローカル・ファイルとしてgrades.xsdという名前を付けて保存します。

2. 「アプリケーション・ナビゲータ」で、「Grades」プロジェクトを選択します。

3. 右クリックしてコンテキスト・メニューから「新規」を選択します。

4. 「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。

5. 「カテゴリ」領域で、「一般」を開いて「XML」を選択します。

6. 「項目」領域で「XMLスキーマ」を選択します。「OK」をクリックします。

7. 「XMLスキーマの作成」ダイアログで、「ファイル名」フィールドにgrades.xsdと入力します。

8. 「XMLスキーマの作成」ダイアログの「ディレクトリ」フィールドで、図9-4に示すようにxsdディレクトリをGradesプロジェクトのパス名に追加します。

図9-4 xsdディレクトリのGradesプロジェクトへのスキーマの追加

「OK」をクリックします。

9. grades.xsdファイルで、「ソース」タブをクリックします。

10. 図9-5に示すように、前の例に示すスキーマをGradesプロジェクトのgrades.xsdにコピーします。

図9-5 Gradesプロジェクトのgrades.xsdスキーマ・ファイル

9.2.4.1 等級スキーマからJAXB 2.0コンテンツ・モデルを生成する方法

等級スキーマからJAXB 2.0コンテンツ・モデルを生成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」のGradesプロジェクトで、「リソース」を開き、grades.xsdを選択します。

2. 右クリックし、コンテキスト・メニューの「JAXB 2.0コンテンツ・モデルの生成」を選択します。

3. 「XMLスキーマからのJAXB 2.0コンテンツ・モデル」ダイアログで「OK」をクリックします。

9.2.5 Gradesプロジェクト内でのOracle Business Rulesディクショナリの作成方法

Oracle JDeveloperでプロジェクトを作成した後、Gradesプロジェクト内でビジネス・ルールを作成します。

ビジネス・ルールをOracle JDeveloperで使用する手順は、次のとおりです。

- ビジネス・ルールをプロジェクトに追加し、grades.xsdスキーマをインポートします。

- 入力変数と出力変数を作成します。

- プロジェクト内でOracle Business Rulesディクショナリを作成します。

ビジネス層にビジネス・ルール・ディクショナリを作成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「Grades」プロジェクトを選択します。

2. 右クリックし、コンテキスト・メニューで「新規...」を選択し、「すべてのテクノロジ」タブを選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で、「ビジネス層」を開いて「ビジネス・ルール」を選択します。

4. 「新規ギャラリ」の「項目」領域で、「ビジネス・ルール」を選択します。「OK」をクリックします。

図9-6に示すように、Oracle JDeveloperで「ビジネス・ルールの作成」ダイアログが表示されます。

図9-6 「ビジネス・ルールの作成」ダイアログでのGradesへのビジネス・ルールの追加

5. 「名前」フィールドに、ディクショナリを指定する名前を入力します。たとえば、GradingRulesと入力します。

6. 入力を追加するには、「追加」ボタンの横にあるリストから「入力」を選択します。

7. 「タイプ・チューザ」で「プロジェクトのスキーマ・ファイル」フォルダを開き、grades.xsdを開きます。図9-7に示すように、入力「TestScore」を選択します。

図9-7 TestScore要素を使用した「タイプ・チューザ」ダイアログ

8. 「タイプ・チューザ」ウィンドウで「OK」をクリックします。「ビジネス・ルールの作成」ダイアログが表示されます。

9. 「ビジネス・ルールの作成」ダイアログで、入力と同様の手順で出力を追加するには、「出力」を選択して、grades.xsdスキーマから要素TestGradeを追加します。

その結果、図9-8に示すような「ビジネス・ルールの作成」ダイアログが表示されます。

図9-8 gradesの入力と出力が表示されている「ビジネス・ルールの作成」ダイアログ

「OK」をクリックします。図9-9に示すように、Oracle JDeveloperでGradingRulesディクショナリが作成されます。

10. 「ファイル」メニューで「すべて保存」を選択し、作業内容を保存します。

図9-9 新しい等級ルール・ディクショナリ

新しいディクショナリのビジネス・ルール検証ログ領域に、検証警告がいくつか表示されることに注意してください。これらの検証警告メッセージは、後のステップでディクショナリを変更すると消去されます。

9.3 等級サンプル・アプリケーション用のデータ・モデル要素とルールの作成

次の手順に従って、等級サンプル・アプリケーション用のデータ・モデル要素とルールを作成します。

等級サンプル・アプリケーション用にデータ・モデルとビジネス・ルールを作成する手順は、次のとおりです。

- 等級用値セットを作成します。

- 等級用デシジョン表の追加によるルールの作成

- デシジョン表の分割およびルールに対するアクションの追加

- デフォルトのデシジョン関数名の変更

9.3.1 等級サンプル・アプリケーション用の値セットの作成方法

この例では、ファクト・タイプと値セットを関連付けます。これは、(デシジョン表の条件について)デシジョン表の各セルについて値の描画方法を指定する値セットを定義する必要があるデシジョン表の使用をサポートしています。

等級サンプル・アプリケーション用の値セットを作成する手順は、次のとおりです。

1. ルール・デザイナで、「値セット」ナビゲーション・タブを選択します。

2. 「値セットの作成」ボタンの横にあるリストから「範囲リスト」を選択します。

3. 値セットに対して、「名前」フィールド内をダブルクリックし、デフォルト名を選択します。

4. Grade Scaleと入力し、[Enter]を押してその値セット名を受け入れます。

5. 「値セット」表で、Grade Scale値セットのアイコンをダブルクリックし、「値セットの編集」ダイアログを表示します。

6. 「値セットの編集」ダイアログで「追加」をクリックして値を追加し、「追加」を3回クリックしてさらに3つの値を追加します。

7. 最上位エンドポイントについて「エンドポイント」フィールドに90と入力し、[Enter]を押して新しい値を受け入れます。

8. 次の値について「エンドポイント」フィールドに80と入力し、[Enter]を押して新しい値を受け入れます。同様に、次の2つの値について「エンドポイント」フィールドに値70および60を入力します。

9. 値ごとに、「含まれるエンドポイント」フィールドのチェック・ボックスをそれぞれ選択します。

10. 対応する各範囲について、各値の「エイリアス」フィールドに値A、B、C、DおよびFをそれぞれ入力して変更します(各エイリアスを追加するたびに[Enter]を押します)。

9.3.2 値セットをファクト・プロパティに関連付ける方法

デシジョン表を作成する準備のため、グローバル値セットをデータ・モデル内のファクト・プロパティに関連付けることができます。これにより、デシジョン表の作成時に、デシジョン表の「条件」領域にある条件セルで値セットを使用できるようになります。

値セットをファクト・プロパティに関連付ける手順は次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。

3. TestScoreファクトの「XMLファクト」アイコンをダブルクリックします。「XMLファクトの編集 -」ダイアログが表示されます。

4. 「XMLファクトの編集 -」ダイアログで「testScore」プロパティを選択します。

5. 「値セット」フィールドで、リストから「Grade Scale」を選択します。

6. 「OK」をクリックします。

9.3.3 等級サンプル・アプリケーション用のデシジョン表の追加方法

デシジョン表で、入力ファクトを処理して出力ファクトを生成するか、暫定的な結論を生成するため、ルールを作成します。暫定的な結論は、Oracle Business Rulesにより他のルールを使用するか別のデシジョン表内でさらに処理できます。

このアプリケーションでルールにデシジョン表を使用するには、テスト・スコアを表すファクトで作業します。次に、デシジョン表を使用して、テスト・スコアに基づいて等級を生成するルールを作成します。

等級アプリケーション用のデシジョン表を追加する手順は、次のとおりです。

1. ルール・デザイナで、「ルールセット」リストの下の「Ruleset_1」を選択します。

2. 「Ruleset_1」で、「概要」タブの「デシジョン表」領域から「作成」をクリックします。これにより、DecisionTable_1が作成されます。「ビジネス・ルール検証」ログ領域に表示される警告メッセージは無視できます。これらの警告メッセージは、後のステップで削除します。

3. デシジョン表DecisionTable_1で、「追加」ボタンをクリックし、リストから「条件」を選択します。

4. デシジョン表で、「<条件の編集>」をダブルクリックします。次に、変数ナビゲータで、「TestScore」を開いて「testScore」を選択します。これにより、条件C1の式TestScore.testScoreが入力されます。

ルール検証ログを表示すると、警告メッセージが表示されます。これらの警告メッセージは、後のステップでデシジョン表を変更すると削除されます。

9.3.4 デシジョン表にアクションを追加する方法

デシジョン表にアクションを追加する手順は、次のとおりです。

新しいGradeファクトをアサートするため、デシジョン表にアクションを追加します。

1. デシジョン表で、「追加」ボタンをクリックしてリストから「アクション」を選択し、「Assert New」を選択します。

2. 「アクション」領域で、「新規アサート」をダブルクリックします。

これにより、「アクション・エディタ」ダイアログが表示されます。

3. 「アクション・エディタ」ダイアログの「ファクト」領域で「TestGrade」を選択します。

4. 「アクション・エディタ」ダイアログのgradeプロパティの「プロパティ」表で、「パラメータ化」チェック・ボックスおよび「定数」チェック・ボックスを選択します。

これにより、各ルールで等級を個別に設定するよう指定したことになります。

5. 「アクション・エディタ」ダイアログで、「常に選択」チェック・ボックスを選択します。

6. 「アクション・エディタ」ダイアログで「OK」をクリックします。

7. 「ファイル」メイン・メニューから「すべて保存」を選択し、作業内容を保存します。

次に、デシジョン表にルールを追加し、ルールごとにアクションを指定します。

9.3.5 等級サンプル・アプリケーション用のデシジョン表でのルールの追加方法

デシジョン表の分割操作を使用して、デシジョン表の条件行に関連付けられた値セットに関するルールを作成できます。これにより、値ごとに1つルールが作成されます。

デシジョン表を分割するには、デシジョン表で、「表の分割」ボタンをクリックし、リストから「表の分割」を選択します。分割操作により、考慮されないセルが表から消去されます。図9-10に示すように、これで表にはすべての範囲を対象とする5つのルールが表示されています。

これらのステップでは、欠落している式があるアクション・セルに関する検証警告が生成されます。これらの問題は、後のステップで各ルールに対するアクションを定義する際に修正します。

図9-10 表分割操作を使用した等級用デシジョン表の分割

デシジョン表内のルールごとにアクションを追加する手順は、次のとおりです。

デシジョン表の「アクション」領域で、各アクション・セルのTestGradeに関連付けられているgradeプロパティの結果の値を指定します。各gradeプロパティに可能な選択肢は、有効な等級です。このステップでは、各ルールについて値を入力します。入力した値は、デシジョン表の各ルールを構成する条件に対応します。

1. 図9-11に示すように、「アクション」領域でルール「R1」のアクション・セルをダブルクリックします。

図9-11 等級デシジョン表へのアクション・セル値の追加

2. リストで、アクション・セルに対応する値を選択します。たとえば、「Grade.F」を選択します。

3. 残りの各アクション・セルで、TestScoreのD、C、BおよびAに該当する値を選択します。

9.3.6 等級サンプル・アプリケーション用のデシジョン関数名の変更方法

Rules SDKデシジョン・ポイントでデシジョン関数を使用するときに指定する名前は、ディクショナリ内のデシジョン関数の名前と一致する必要があります。名前を一致させるために、デシジョン関数を任意の名前に変更できます。この例では、デフォルトのデシジョン関数をGradesDecisionFunctionという名前に変更します。

デシジョン関数の名前を変更する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」のGradesプロジェクトで、「リソース」フォルダを開き、ディクショナリGradingRules.rulesをダブルクリックします。

2. 「デシジョン関数」ナビゲーション・タブを選択します。

3. 図9-12に示すように、「デシジョン関数」表の「名前」フィールドでデシジョン関数名を編集し、値GradesDecisionFunctionを入力して[Enter]を押します。

図9-12 ルール・デザイナでのデシジョン関数名の変更

9.4 Rules SDKコールを含む等級アプリケーションのサーブレットの追加

等級サンプル・アプリケーションには、Rules Engineを使用するサーブレットが含まれています。

このサーブレットをOracle Business Rulesで追加するには、重要なRules SDKメソッドを理解する必要があります。したがって、ルール・デザイナで作成したOracle Business Rulesディクショナリを使用する手順は、次のとおりです。

- サーブレットのinitルーチンで1度実行する初期化ステップの作成

- Rules SDKデシジョン・ポイントAPIを使用したサーブレットのserviceルーチンの作成

- サーブレット・コードをプロジェクトに追加するステップの実行

Rules SDKデシジョン・ポイントAPIの詳細は、「スタンドアロン(非SOA/BPM)シナリオでのルールの使用」を参照してください。

9.4.1 Gradesプロジェクトへのサーブレットの追加方法

「HTTPサーブレット作成」ウィザードを使用して、Gradesプロジェクトにサーブレットを追加します。

Oracle JDeveloperでGradesプロジェクトにサーブレットを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「Grades」プロジェクトを選択します。

2. Gradesプロジェクトを右クリックし、コンテキスト・メニューから「新規」を選択します。

3. 「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。

4. 「新規ギャラリ」の「カテゴリ」領域で、「Web層」を開いて「サーブレット」を選択します。

5. 「新規ギャラリ」の「項目」領域で、「HTTPサーブレット」を選択します。「OK」をクリックします。

Oracle JDeveloperによって「HTTPサーブレット作成 - ようこそ」ページが表示されます。

6. 「次へ」をクリックします。

これにより、「Webアプリケーション」ページが表示されます。

7. サーブレット2.5\JSP 2.1 (Java EE 1.5)を選択して「次へ」をクリックします。

「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」ページが表示されます。

8. 図9-13に示すように、「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」ページで次のように値を入力します。

- クラス: GradesServlet

- パッケージ: com.example.grades

- 作成するコンテンツ・タイプ: HTML

- ヘッダー・コメントの生成: 選択解除

- メソッドの実装: 「service()」は選択、他のすべてのチェック・ボックスの選択は解除

図9-13 「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」

「次へ」をクリックします。

図9-14に示すように、「HTTPサーブレット作成 - ステップ2/3: マッピング情報」ダイアログが表示されます。

図9-14 「HTTPサーブレット作成 - ステップ2 / 3: マッピング情報」

9. このダイアログを次のように構成します。

- 名前: GradesServlet

- URLパターン: /gradesservlet

完了後、「終了」をクリックします。

JDeveloperによりプロジェクトに「Webコンテンツ」フォルダが追加され、GradesServlet.javaファイルが作成されて、図9-15に示すようにエディタでファイルが開かれます。

図9-15 生成されたGradesServlet.java

10. 次の等級サンプル・アプリケーションに示すように、生成されたサーブレットをソースと置き換えます。

package com.example.grades;

import java.io.IOException;
import java.io.PrintWriter;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;

public class GradesServlet extends HttpServlet {

private static final String CONTENT_TYPE = "text/html";
private static final String DICT_PKG = "com.example.grades";
private static final String DICT_NAME = "GradingRules";
private static final DictionaryFQN DICT_FQN =
new DictionaryFQN(DICT_PKG, DICT_NAME);
private static final String DF_NAME = "GradesDecisionFunction";

private DecisionPoint m_decisionPoint = null; // init in init()

public void init(ServletConfig config) throws ServletException {
super.init(config);

try {

// specifying the Decision Function and Dictionary FQN
// load the rules from the MDS repository.
m_decisionPoint = new DecisionPointBuilder()
.with(DF_NAME)
.with(DICT_FQN)
.build();
} catch (SDKException e) {
System.err.println("Failed to build Decision Point: " +
e.getMessage());
throw new ServletException(e);
}
}

public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
// retrieve parameters
String name = request.getParameter("name");
String strScore = request.getParameter("testScore");

// open output document
StringBuilder doc = new StringBuilder();
addHeader(doc);

// create TestScore object to assert
final TestScore testScore = new TestScore();
testScore.setName(name);

try {
testScore.setTestScore(Integer.parseInt(strScore));
} catch (NumberFormatException e){ /* use default val */ }

// get DecisionPointInstance for invocation
DecisionPointInstance point = m_decisionPoint.getInstance();

// set input parameters
point.setInputs(new ArrayList() {{ add(testScore); }});

// invoke decision point and get result value
TestGrade testGrade = null;
try {

// invoke the decision point with our inputs
List<Object> result = point.invoke();
if (result.size() != 1){
error(doc, testScore.getName(), "bad result", null);
}
// decision function returns a single TestGrade object
testGrade = (TestGrade)result.get(0);
} catch (RLException e) {
error(doc, testScore.getName(), "RLException occurred: ", e);
} catch (SDKException e) {
error(doc, testScore.getName(), "SDKException occurred", e);
}

if (testGrade != null){
// create output table in document
openTable(doc);
addRow(doc, testScore.getName(), strScore, testGrade.getGrade());
closeTable(doc);
}

addFooter(doc);

// write document
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println(doc);
out.close();
}

public static void addHeader(StringBuilder doc) {
doc.append("<html>");
doc.append("<head><title>GradesServlet</title></head>");
doc.append("<body>");
doc.append("<h1>Test Results</h1>");
}

public static void addFooter(StringBuilder doc) {
doc.append("</body></html>");
}

public static void openTable(StringBuilder doc) {
doc.append("<table border=\"1\"");
doc.append("<tr>");
doc.append("<th>Name</th>");
doc.append("<th>Score</th>");
doc.append("<th>Grade</th>");
doc.append("</tr>");
}

public static void closeTable(StringBuilder doc) {
doc.append("</table>");
}

public static void addRow(StringBuilder doc, String name, String score, Grade grade){
doc.append("<tr>");
doc.append("<td>"+ name +"</td>");
doc.append("<td>"+ score +"</td>");
doc.append("<td>"+ grade.value() +"</td>");
doc.append("</tr>");
}

public static void error(StringBuilder doc, String name, String msg, Throwable t){
doc.append("<tr>");
doc.append("<td>"+ name +"</td>");
doc.append("<td colspan=2>"+ msg + " " + t +"</td>");
doc.append("</tr>");
}
}

前の例には、MDSリポジトリを使用してディクショナリにアクセスするOracle Business Rulesデシジョン・ポイントが含まれています。詳細は、「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。

等級サンプル・アプリケーションに示すようにサーブレットを追加するときは、次の点に注意します。

- init()メソッドでは、Oracle Business Rules用にサーブレットでRules SDKデシジョン・ポイントAPIが使用されます。デシジョン・ポイントAPIの使用方法の詳細は、「スタンドアロン(非SOA/BPM)シナリオでのルールの使用」を参照してください。

- DecisionPointBuilder()では、次に示すように、デシジョン関数名を含む引数が必要であり、本番環境でMDSリポジトリ内のディクショナリにアクセスするためのディクショナリFQNが必要です。

m_decisionPoint = new DecisionPointBuilder()
.with(DF_NAME)
.with(DICT_FQN)

デシジョン・ポイントAPIの使用方法の詳細は、「スタンドアロン(非SOA/BPM)シナリオでのルールの使用」を参照してください。

9.5 等級サンプル・アプリケーション用HTMLテスト・ページの追加

次の手順に従って、等級サンプル・アプリケーション用のHTMLテスト・ページを作成します。

等級サンプル・アプリケーションには、「Rules SDKコールを含む等級アプリケーションのサーブレットの追加」で作成したサーブレットを起動するために使用するHTMLテスト・ページが含まれています。

サーブレットにHTMLページを追加するには、「HTMLファイルの作成」ウィザードを使用します。

HTMLテスト・ページを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、Gradesプロジェクトの「Webコンテンツ」フォルダを選択します。

2. 「Webコンテンツ」フォルダのプロジェクトを右クリックし、コンテキスト・メニューから「新規」を選択します。

3. 「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。

4. 「新規ギャラリ」の「カテゴリ」領域で、「Web層」を開いて「HTML」を選択します。

5. 「新規ギャラリ」の「項目」領域で「HTMLページ」を選択します。「OK」をクリックします。

Oracle JDeveloperで「HTMLファイルの作成」ダイアログが表示されます。

6. 図9-16に示すように、このダイアログを次のように構成します。

- ファイル名: index.html

- ディレクトリ: C:\JDeveloper\mywork\GradeApp\Grades\public_html

図9-16 「HTMLファイルの作成」ダイアログ

「OK」をクリックします。

JDeveloperによりindex.htmlが「Webコンテンツ」フォルダに追加され、エディタが開きます。

7. index.htmlのエディタで、「ソース」タブをクリックします。

8. 次のHTMLテスト・ページ例のHTMLコードをコピーし、index.htmlファイルのコンテンツに貼り付けて置き換えます。form要素では、action属性に図9-14で指定したURLパターンが使用されていることに注意してください。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></meta>
<title>Test Grade Example Servlet</title>
</head>
<body>
<form name="names_and_scores"
method="post"
action="/grades/gradesservlet" >
<p>Name: <input type="text" name="name" /></p>
<p>Test Score: <input type="text" name="testScore"/></p>
<input type="submit" value="Submit">
</form>
</body>
</html>

9. 「ファイル」メイン・メニューから「すべて保存」を選択し、作業内容を保存します。

9.6 デプロイメントのための等級サンプル・アプリケーションの準備

ビジネス・ルールは、Oracle JDeveloperでデプロイメント・プロファイルの作成対象となるアプリケーションの一部としてデプロイされます。

アプリケーションのデプロイ先はOracle WebLogic Serverです。

9.6.1 等級サンプル・アプリケーション用のWARファイルの作成方法

JDeveloperをOracle WebLogic Serverとともに使用して、GradeAppサンプル・アプリケーションをデプロイします。

等級サンプル・アプリケーション用のWARファイルを作成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「Grades」プロジェクトを選択します。

2. Gradesプロジェクトを右クリックし、コンテキスト・メニューから「プロジェクト・プロパティ」を選択します。プロジェクトの「プロジェクト・プロパティ」ダイアログが表示されます。

3. 図9-17に示すように、「プロジェクト・プロパティ」ナビゲータで「デプロイ」項目を選択します。

図9-17 「プロジェクト・プロパティ」 - 「デプロイ」

4. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログが表示されます。

5. 「デプロイメント・プロファイルの作成」ダイアログの「アーカイブ・タイプ」で、リストから「WARファイル」を選択します。

6. 図9-18に示すように、「デプロイメント・プロファイルの作成」ダイアログの「名前」フィールドにgradesと入力します。「名前」の値には、「等級サンプル・アプリケーション用HTMLテスト・ページの追加」の手順8でform要素のaction属性に指定したパッケージ値を使用することに注意してください。

図9-18 WARファイルの「デプロイメント・プロファイルの作成」ダイアログ

7. 「OK」をクリックします。
「WARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

8. 「WARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」を選択し、図9-19に示すように「一般」ページを構成します。

a. 「WARファイル」をC:\JDeveloper\mywork\GradeApp\Grades\deploy\grades.warに設定します。

b. 「Webアプリケーションのコンテキスト・ルート」領域で、「Java EE Webコンテキスト・ルートを指定」を選択します。

c. 「Java EE Webコンテキスト・ルートを指定」のテキスト入力領域に、gradesと入力します。

d. 「デプロイメント・クライアントの最大ヒープ・サイズ[単位:MB]」で、リストから「自動」を選択します。

図9-19 WARデプロイメント・プロファイルのプロパティの編集 - 一般

9. 「WARデプロイメント・プロファイルのプロパティの編集」ダイアログで「OK」をクリックします。
図9-20に示すように、JDeveloperによりgrades (WAR File)というデプロイメント・プロファイルが作成されます。

図9-20 「プロジェクト・プロパティ」 - 作成されたデプロイメント・プロファイル

10. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

9.6.2 等級サンプル・アプリケーションへのルール・ライブラリの追加方法

Weblogicアプリケーション・ファイルにルール・ライブラリを追加する手順は、次のとおりです。

1. GradeAppアプリケーションで、「アプリケーション・ナビゲータ」で「アプリケーション・リソース」を開きます。

2. 「ディスクリプタ」および「META-INF」を順に開き、weblogic-application.xmlをダブルクリックして開きます。

3. oracle.rulesライブラリの参照をweblogic-application.xmlファイルに追加します。図9-21に示すように、次の行を追加します。

<library-ref>
<library-name>oracle.rules</library-name>
</library-ref>

図9-21 WebLogicディスクリプタへのOracle Rulesライブラリの参照の追加

4. weblogic-application.xmlファイルを保存します。

9.6.3 等級サンプル・アプリケーションへのMDSデプロイメント・ファイルの追加方法

MDSデプロイメント・ファイルを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「GradeApp」アプリケーションを選択します。

2. GradeAppアプリケーションを右クリックし、コンテキスト・メニューから「アプリケーションのプロパティ」を選択します。

「アプリケーションのプロパティ」ダイアログが表示されます。

3. 図9-22に示すように、「アプリケーションのプロパティ」ナビゲータで「デプロイ」項目を選択します。

図9-22 「アプリケーションのプロパティ」 - 「デプロイ」

4. 「アプリケーションのプロパティ」ダイアログで、「新規」をクリックします。

「デプロイメント・プロファイルの作成」ダイアログが表示されます。

5. 図9-23に示すように、このダイアログを次のように構成します。

- アーカイブ・タイプ: MARファイル

- 名前: metadata1

図9-23 MARファイルの「デプロイメント・プロファイルの作成」ダイアログ

「OK」をクリックします。

図9-24に示すように、「MARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

図9-24 「MARデプロイメント・プロファイルのプロパティの編集 - MARオプション」

6. 「メタデータ・ファイル・グループ」項目を開き、「ユーザー・メタデータ」項目を選択して「追加」をクリックします。

「コントリビュータの追加」ダイアログが表示されます。

7. 「コントリビュータの追加」ダイアログの「参照」ボタンをクリックし、GradingRules.rulesディクショナリ・ファイルがあるプロジェクトのディレクトリにナビゲートします。

この例では、C:\JDeveloper\mywork\GradeApp\Gradesにナビゲートし、「選択」をクリックします。

8. 「コントリビュータの追加」ダイアログで、「OK」をクリックしてダイアログを閉じます。図9-25に示すように、「MARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

図9-25 「MARデプロイメント・プロファイルのプロパティの編集 - ユーザー・メタデータ」

9. 「MARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「メタデータ・ファイル・グループ」および「ユーザー・メタデータ」項目を順に開いて「ディレクトリ」を選択します。

図9-26に示すように、「ディレクトリ」ページが表示されます。

図9-26 「MARデプロイメント・プロファイルのプロパティの編集 - ディレクトリ」

10. 「oracle」ディレクトリ・チェック・ボックスを選択します。これにより、GradingRules.rulesディレクトリが選択され、MARに含まれます。

「OK」をクリックします。

図9-27に示すように、JDeveloperによりmetadata1 (MAR File)というアプリケーション・デプロイメント・プロファイルが作成されます。

図9-27 「アプリケーションのプロパティ」 - 「デプロイ」 - MAR

「アプリケーション・プロパティ」ダイアログの「OK」をクリックします。

9.6.4 等級サンプル・アプリケーションへのEARファイルの追加方法

等級サンプル・アプリケーションにEARファイルを追加します。

等級サンプル・アプリケーションにEARファイルを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「GradeApp」アプリケーションを選択します。

2. 右クリックしてコンテキスト・メニューから「アプリケーションのプロパティ」を選択します。

3. 「アプリケーションのプロパティ」ダイアログで、「デプロイ」を選択して「新規」をクリックします。「デプロイメント・プロファイルの作成」ダイアログが表示されます。

4. 図9-28に示すように、このダイアログを次のように構成します。

- アーカイブ・タイプ: EAR

- 名前: grades

図9-28 EARファイルの「デプロイメント・プロファイルの作成」ダイアログ

5. 「OK」をクリックします。「EARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

6. 図9-29に示すように、「EARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲータで、「アプリケーション・アセンブリ」を選択します。

図9-29 「EARデプロイメント・プロファイルのプロパティの編集 - アプリケーション・アセンブリ」

7. このダイアログを次のように構成します。

- 「metadata1」チェック・ボックスを選択します。

- 「Grades.jpr」項目を開き、「grades」チェック・ボックスを選択します。

8. 「EARデプロイメント・プロファイルのプロパティの編集」ダイアログで「OK」をクリックします。

図9-30に示すように、JDeveloperによりgrades(EAR File)というアプリケーション・デプロイメント・プロファイルが作成されます。

図9-30 「アプリケーションのプロパティ」 - 「デプロイ」 - EAR

9. 「OK」をクリックして「アプリケーション・プロパティ」ダイアログを閉じます。

10. 「ファイル」メイン・メニューから「すべて保存」を選択し、作業内容を保存します。

9.7 等級サンプル・アプリケーションのデプロイと実行

これで、等級サンプル・アプリケーションをOracle WebLogic Serverにデプロイして実行できるようになりました。

9.7.1 等級サンプル・アプリケーションのデプロイ方法

等級サンプル・アプリケーションをデプロイする手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「GradeApp」アプリケーションを選択します。

2. GradeAppアプリケーションを右クリックしてコンテキスト・メニューから 「デプロイ」→「grades」→「至」を選択し、既存の接続または「接続の作成」を選択してデプロイ用の接続を作成します。これで、指定のOracle WebLogic Serverへのデプロイが開始します。

3. デプロイの進行に伴い、Oracle JDeveloperで「デプロイメント構成」ダイアログが表示されます。

4. 図9-28に示すように、「デプロイメント構成」ダイアログで、次の値を入力します。

- 「リポジトリ名」フィールドで、リストから「mds-soa」を選択します。

- 「パーティション名」フィールドにgradesと入力します。

図9-31 リポジトリおよびパーティションを使用したMDSの「デプロイメント構成」ダイアログ

5. 「デプロイメント構成」ダイアログ」ダイアログで「デプロイ」をクリックします。

9.7.2 等級サンプル・アプリケーションの実行方法

等級サンプル・アプリケーションをデプロイしたら、アプリケーションを実行できます。

等級サンプル・アプリケーションを実行する手順は、次のとおりです。

1. Webブラウザで次のサイトをポイントします。

http://サーバー名:ポート/grades/

図9-32に示すように、テスト・サーブレットが表示されます。

図9-32 等級サンプル・アプリケーションのサーブレット

2. 名前とテスト・スコアを入力して「送信」をクリックします。図9-33に示すような結果が戻されます。

サーブレットを初めて実行した場合、結果が戻されるまでに遅延が生じることがあります。サーブレットが初めて起動されると、サーブレットの初期化中にランタイムによってディクショナリがロードされ、ルール・セッション・プールが作成されます。以降の起動ではこのような手順が実行されないため、実行速度が大幅に増します。

図9-33 結果を含む等級サンプル・アプリケーションのサーブレット

10 Oracle Business RulesとADFビジネス・コンポーネントの使用

この章では、Oracle Business Rulesによって、Oracle ADFビジネス・コンポーネントをファクトとしてどのように使用できるのかを説明します。すべてのファクト・タイプと同様に、ファクトのツリーは、マスター/ディテール・データを表し、1単位としてアサートできます。Oracle Business Rulesには、組込みのテスト(RLcontains)および1対多リレーションシップのナビゲートをサポートするオプションのツリー・モード構文(マスター/ディテールなど)が含まれています。

この章の内容は以下のとおりです。

- Business RulesとADFビジネス・コンポーネントの使用の概要

- ADFビジネス・コンポーネント・ファクトを使用する場合のデシジョン・ポイントの使用

- ADFビジネス・コンポーネント・ファクトを使用したBusiness Rulesアプリケーションの作成

10.1 Business RulesとADFビジネス・コンポーネントの使用の概要

ADF Business Componentsルール開発プロセスは、次のようにまとめることができます。

ADFビジネス・コンポーネント・ルールを使用して、次のことができます。

1. ビュー・オブジェクト定義を作成します。

2. アクション・タイプを作成します。

3. ルール・ディクショナリを作成します。

4. ビュー・オブジェクトのファクト・タイプを登録します。

5. アクションのJavaファクト・タイプを登録します。

6. Javaから起動する場合は、次のいずれかを実行します。

- ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されている場合は、ビュー・オブジェクト・インスタンスを渡してデシジョン・ポイントの起動をコーディングします。

- ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されていない場合は、ビュー・オブジェクトのキー値を渡してデシジョン・ポイントの起動をコーディングします。

10.1.1 Oracle Business RulesのADFビジネス・コンポーネント・ファクト・タイプ

ADFビジネス・コンポーネント・ビュー・オブジェクトがOracle Business Rulesデータ・モデルにインポートされるとき、ビュー・オブジェクトの各属性に対応するプロパティを持ったADFビジネス・コンポーネント・ファクト・タイプが作成されます。

また、ADFビジネス・コンポーネント・ファクト・タイプには、次のプロパティが含まれています。

- プロパティViewRowImpl。各ファクト・インスタンスが表すoracle.jbo.Rowインスタンスを直接指します。

- プロパティkey_values。oracle.rules.sdk2.decisionpoint.KeyChainオブジェクトを指します。このプロパティは、この行と親行のキー値セットの取得に使用できます。

次の事柄に注意してください。

- ビュー・オブジェクト定義間の関係は、ビュー定義の属性、特にビュー・リンクのアクセッサである属性のイントロスペクションによって決定されます。
ADFビジネス・コンポーネント・ファクト・タイプ・インポータでは、どの関係が1対1で、どの関係が1対多であるかが正しく判別され、それに従ってディクショナリに定義が生成されます。1対多関係の場合、生成されるプロパティのタイプはListであり、実行時に示されたタイプのファクトが含まれています。

- ADFビジネス・コンポーネント・ファクト・タイプはJavaファクト・タイプではなく、ビュー・オブジェクト用に明示的に作成された実装クラスのメソッドは起動できません。
この種のメソッドをコールする必要がある場合は、ビュー・オブジェクト実装をADFビジネス・コンポーネント・ファクト・タイプのかわりにJavaファクト・タイプとしてディクショナリに追加します。この場合、すべてのgetter、setterおよびその他のメソッドが使用可能になりますが、関連するビュー・オブジェクトにアクセスできなくなり、そのオブジェクトへのアクセスが必要な場合は、これらの関係を明示的に管理する必要があるというトレードオフがあります。

- ADFビジネス・コンポーネント・ファクト・タイプを使用すると、Oracle Business Rules内部では、RLファクト・タイプのインスタンスとしてADFビジネス・コンポーネント・ファクト・タイプが作成されます。つまり、このことは、ADFビジネス・コンポーネント・ビュー・オブジェクト・インスタンスをルール・セッションに直接アサートすることはできず、かわりにMetadataHelperおよびADFBCFactTypeHelperクラスに用意されているヘルパー・メソッドを使用する必要があることを意味します。詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

10.1.2 Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ

Rules SDKでは、デシジョン・ポイント内のビュー・オブジェクトを更新する主な方法は、アクション・タイプを使用することです。アクション・タイプは、ルール・パターン・ファクト・タイプのJavaクラスをインポートするのと同じ方法でルール・ディクショナリのデータ・モデルにインポートするJavaクラスです。このアクション・タイプの新規インスタンスは、ルールのアクション内でアサートされてから、DecisionPointDictionary内の後処理ルールセットにより処理されます。

アクション・タイプとして使用するJavaクラスは、次の要件に従う必要があります。

- Javaファクト・タイプのクラスは、oracle.rules.sdk2.decisionpoint.ActionTypeまたはoracle.rules.sdk2.decisionpoint.KeyedActionTypeをサブクラス化する必要があります。
KeyedActionTypeをサブクラス化することで、Javaクラスは標準のoracle.rules.sdk2.decisionpoint.KeyChain属性を継承します。これは、ルール・ファクトの主キーおよび親キーをActionTypeインスタンスに伝えるのに使用できます。

- クラスにはデフォルト・コンストラクタが必要です。

- クラスは、ActionTypeのabstractのexecメソッドを実装します。execメソッドに、実行するメイン・アクションを含める必要があります。

- Javaクラスには、JavaBeanインタフェースに準拠するプロパティが必要です(つまり、各プロパティにはgetterメソッドおよびsetterメソッドが必要です)。

ActionType実装のサンプルは、例10-1を参照してください。

表10-1に、ActionType execを実装するアプリケーション開発者に必要と思われるDecisionPointInstanceのメソッドを示します。

表10-1 DecisionPointInstanceのメソッド

メソッド

説明

getProperties

アクション・タイプに必要な可能性がある実行時指定パラメータを含むHashMap<String,Object>オブジェクトを提供します。

デシジョン・サービスのデシジョン関数を使用する場合は、文字列値のみを使用します。

getRuleSession

ルール・ディクショナリ内の静的構成変数へのアクセス元として使用できる、Oracle Business Rules RuleSessionオブジェクトへのアクセスを提供します。

getActivationID

コール元により移入される場合、Set Controlのインダイレクトに使用する文字列値を提供します。

getTransaction

アクション・タイプがバックエンドで永続的に変更できるように、トランザクション・オブジェクトを提供します。

addResult

指定の結果を文字列キーおよびオブジェクト値の形式で出力値のリストに追加します。

出力は、純粋なマップ実装の場合と同様に、oracle.rules.sdk2.decisionpoint.DecisionPointInstance.NamedValueオブジェクトのListとしてアセンブルされます。NamedValueオブジェクトは、名前および値ごとにgetterを持つ単純なデータ伝達クラスです。あるアクション・タイプ・インスタンスの出力値が相互に上書きすることは許可されず、この点ではアクション・タイプの実装が互いに完全に独立しているものとみなす必要があります。

10.1.2.1 ActionType実装のサンプル

例10-1に、ActionType実装のサンプルと、execメソッドのパラメータとしてのoracle.rules.sdk2.decisionpoint.DecisionPointInstanceを示します。

例10-1 ActionTypeの実装

package com.example;

import oracle.jbo.domain.Number;

import oracle.rules.sdk2.decisionpoint.ActionType;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;

public class RaiseAction extends ActionType {
private double raisePercent;

public void exec(DecisionPointInstance dpi) {
Number salary = (Number)getViewRowImpl().getAttribute("Salary");
salary = (Number)salary.multiply(1.0d + getRaisePercent()).scale(100,2, new boolean[]{false});
dpi.addResult("raise for " + this.getViewRowImpl().getAttribute("EmployeeId"),
getRaisePercent() + "=>" + salary );
getViewRowImpl().setAttribute("Salary", salary);
}

public void setRaisePercent(double raisePercent) {
this.raisePercent = raisePercent;
}

public double getRaisePercent() {
return raisePercent;
}
}

ルール・デザイナを使用すると、構成中のActionTypeに適切なパラメータを選択できます。

10.2 ADFビジネス・コンポーネント・ファクトを使用する場合のデシジョン・ポイントの使用

デシジョン・ポイントを使用すると、デシジョン関数を実行できます。ADFビジネス・コンポーネント・ファクト・タイプを使用している場合にのみ適用される特定のデシジョン・ポイント・メソッドがあります。

デシジョン関数の詳細は、「デシジョン関数の使用」を参照してください。

10.2.1 ADFビジネス・コンポーネント・ファクトによるデシジョン・ポイントのコール方法

ADFビジネス・コンポーネント・ファクト・タイプを使用する場合は、Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数を起動します。

Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする手順は、次のとおりです。

1. DecisionPointBuilderを使用して、テンプレートDecisionPointインスタンスを作成し、構成します。

詳細は、「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」を参照してください。

2. DecisionPointのメソッドgetInstanceを使用して、DecisionPointInstanceを作成します。

3. DecisionPointInstanceのメソッドaddInput、setInputsまたはsetViewObjectを使用して、使用するファクト・オブジェクトをDecisionPointInstanceに追加します。これらは、ViewObjectまたはViewObjectReferenceインスタンスです。これらは、デシジョン関数の入力で宣言されるのと同じ順序で追加する必要があります。詳細は、「ADFビジネス・コンポーネント・ルールに使用するinvokeメソッドのコール」を参照してください。

4. DecisionPointInstanceで使用されるトランザクションを設定します。

詳細は、「デシジョン・ポイント・トランザクションの設定」を参照してください。

5. 以降のアプリケーション・アクションに必要なランタイム・プロパティを設定します。

詳細は、「ランタイム・プロパティの設定」を参照してください。

6. DecisionPointInstanceのメソッドinvokeをコールします。

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

- ADFビジネス・コンポーネント・ルールに使用するinvokeメソッドのコール

- デシジョン・ポイントの起動に関する必知事項

10.2.1.1 デシジョン・ポイント・トランザクションの設定

Oracle Business Rules SDKフレームワークでは、ViewObjectをロードし、トランザクション・コンテキスト内でActionTypeインスタンスを提供するには、oracle.jbo.server.DBTransactionImpl2インスタンスが必要です。oracle.jbo.server.DBTransactionImpl2クラスは、ApplicationModuleのメソッドgetTransactionをコールすることで戻される、デフォルトのJBOトランザクション・オブジェクトです。トランザクションを設定するには、パラメータにTransactionオブジェクトを指定し、DecisionPointInstanceのメソッドsetTransactionをコールする必要があります。

なんらかの理由でDBTransactionインスタンスを使用できない場合、Oracle Business Rules SDKフレームワークでは、setTransactionメソッドに用意されている3つのオーバーライドのいずれかを使用してインスタンスをブートストラップできます。

次のいずれかが必要です。

- JDBC URL、ユーザー名およびパスワード。

- JDBC接続オブジェクト。

- javax.sql.DataSourceオブジェクト、およびDataSourceがJTAトランザクションおよびローカル・トランザクションのどちらを表すかを指定するフラグ。

10.2.1.2 ランタイム・プロパティの設定

setPropertyメソッドを使用してランタイム・プロパティを提供できます。これらのプロパティは、実行中にActionTypeインスタンスにより取得できます。ランタイム・プロパティが不要な場合は、これらのコールを安全に省略できます。

10.2.1.3 ADFビジネス・コンポーネント・ルールに使用するinvokeメソッドのコール

デシジョン・ポイントの起動で使用されるViewObjectは、表10-2に示すように、2つの方法のいずれかを使用して指定できます。

表10-2 デシジョン・ポイントの起動用のビュー・オブジェクトの設定

ViewObject設定メソッド

説明

setViewObject

このデシジョン関数は、ViewObject行ごとに1回ずつ起動されます。ビュー・オブジェクトを使用する場合は、この方法をお薦めします。ルール・セッションはデシジョン関数の起動と起動の間にリセットされないため、デシジョン関数が以前に起動されたときにアサートされたファクトは、作業メモリーに残ります。通常、デシジョン関数のコールが完了する前に、アサートされたファクトを取り消すルールを記述する必要があります。たとえば、後処理デシジョン関数がコールされる前に実行されたViewObject行を取り消すクリーンアップ・ルールセットを使用できます。

この使用について詳しくは、「従業員取消しルールセットの追加方法」を参照してください。setViewObjectを使用するには、ViewObjectが、デシジョン関数InputTableの最初のエントリである必要があります。

addInput

setInputs

このデシジョン関数は、同時にロードされたすべてのViewObject行に対して1回起動されます。数多くの行が同時にロードされる場合があるため、通常、この操作はスケーラブルではありません。ViewObjectの行数が少ないことがわかっている場合は、このメソッドによるViewObjectのコールが役立つことがあります。

10.2.1.4 デシジョン・ポイントの起動に関する必知事項

JBOクラスのデフォルト動作はすべてのデータを単にロードすることであるため、大量のデータをロードするビュー・オブジェクトを使用してデシジョン・ポイントを起動する際には注意が必要です。多数の行を持ち、多数の子行も持つ可能性のあるビュー・オブジェクトがメモリーにロードされると、メモリー不足になる危険性があるのみでなく、この種の大型データに基づいて実行されるDMLアクションによってロールバック・セグメントがすべて使用されてしまう危険性があります。

10.2.1.5 setInputsメソッドを使用してデシジョン・ポイントを起動するサンプル

例10-2に、setInputsメソッドを使用するViewObjectインスタンスを使用してデシジョン・ポイントを起動する方法を示します。完全な例は、「外部マネージャ・ファインダ・クラスの追加方法」に示す例を参照してください。

例10-2 setInputsメソッドを使用したデシジョン・ポイントの起動

public class OutsideManagerFinder {
private static final String AM_DEF = "com.example.AppModule";
private static final String CONFIG = "AppModuleLocal";
private static final String VO_NAME = "EmployeesView1";

private static final DictionaryFQN DICT_FQN =
new DictionaryFQN("com.example", "Chapter10Rules");

private static final String DF_NAME = "FindOutsideManagers";

private DecisionPoint dp = null;

public OutsideManagerFinder() {
try {
dp = new DecisionPointBuilder()
.with(DICT_FQN)
.with(DF_NAME)
.build();
} catch (SDKException e) {
System.err.println(e);
}
}

public void run() {
final ApplicationModule am =
Configuration.createRootApplicationModule(AM_DEF, CONFIG);
final ViewObject vo = am.findViewObject(VO_NAME);
final DecisionPointInstance point = dp.getInstance();
point.setTransaction((DBTransactionImpl2)am.getTransaction());
point.setAutoCommit(true);
point.setInputs(new ArrayList<Object>(){{ add(vo); }});
try {
List<Object> invokeList = point.invoke();

List<DecisionPoint.NamedValue> results = point.getResults();

} catch (RLException e) {
System.err.println(e);
} catch (SDKException e) {
System.err.println(e);
}
}

10.2.1.6 setViewObjectメソッドを使用してデシジョン・ポイントを起動するサンプル

例10-3に、setViewObjectメソッドを使用してDecisionPointを起動し、ViewObjectを設定する方法を示します。

例10-3 setViewObjectメソッドを使用したデシジョン・ポイントの起動

public void run() {
final ApplicationModule am =
Configuration.createRootApplicationModule(AM_DEF, CONFIG);
final ViewObject vo = am.findViewObject(VO_NAME);
final DecisionPointInstance point = dp.getInstance();

point.setTransaction((DBTransactionImpl2)am.getTransaction());
point.setAutoCommit(true);
point.setViewObject(vo);
try {
List<Object> invokeList = point.invoke();

List<DecisionPoint.NamedValue> results = point.getResults();

} catch (RLException e) {
System.err.println(e);
} catch (SDKException e) {
System.err.println(e);
}
}

10.2.2 Javaデシジョン・ポイント・インタフェースによるデシジョン関数のコール方法

Oracle Business Rules SDKデシジョン・ポイント・インタフェースを持つADFビジネス・コンポーネント・ファクト・タイプを使用して、ルールセットを持つデシジョン関数をコールするには、特定のオプションを使用してデシジョン関数を構成する必要があります。デシジョン関数の使用の詳細は、デシジョン関数の使用を参照してください。

Javaデシジョン・ポイント・インタフェースを使用してデシジョン関数を定義する手順は、次のとおりです。

1. 「デシジョン関数」タブで、適切なデシジョン関数を選択し、「編集」ボタンをクリックします。「デシジョン関数の編集」ダイアログが表示されます。

2. 「デシジョン関数の編集」ダイアログで、デシジョン関数を構成します。

- 入力: 構成済のビジネス・ルールに使用するファクト・タイプの名前を指定します。
ADFビジネス・コンポーネント・ファクト・タイプを使用するアプリケーションを使用している場合、入力はルールで使用されるADFビジネス・コンポーネント・ビュー・オブジェクトとなります。

デシジョン・ポイントでsetViewObjectを使用する場合は、「リスト」属性の選択を解除する必要があります。デシジョン・ポイントでaddInputメソッドまたはsetInputsメソッドを使用しているときに、入力のファクト・タイプごとに「リスト」属性を選択する必要があります。ビュー・オブジェクトの使用に応じて「ツリー」属性を選択することもできます。

「リスト」: ADFビジネス・コンポーネント・ファクト・タイプのリストがデシジョン関数に渡されるように定義します。

「ツリー」: マスター/ディテール階層内の最上位レベル・オブジェクトのみでなく、すべてのオブジェクトをアサートするように定義します。

詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

- 「初期アクション」: 「<アクションの挿入>」をクリックすると、アサートする前に入力ファクトを変更したり、ルールセット・スタックを変更したり、有効日を設定したり、出力ファクトをアサートしたりするために使用できるアクションを追加できます。これらのアクションは、ルールのかわりに使用したり、ルールを実行するための環境「設定」のために使用できます。
デシジョン関数の使用の詳細は、デシジョン関数の使用を参照してください。

- 出力のファクト・タイプ: コール元が戻すファクト・タイプを定義します。
ActionTypesを使用するデシジョン関数のJavaデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする場合、次の2つの出力を返す方法を使用できます。

- 出力ファクト・タイプは、デシジョン関数の場合と同様に使用できます。これらの結果は、DecisionPointInstance.invoke()から返されます。

- ActionTypeのexecメソッドは、dpi.addResultをコールするようにオーバーライドできます(例10-1を参照)。これらの結果は、DecisionPointInstance.getResults()から返されます。

ActionTypesの使用はオプションです。通常、ActionTypesは、ルールでADFデータの変更が必要されない場合は使用されません。ActionTypesを使用しない場合、DecisionPointDictionary.PreprocessingおよびDecisionPointDictionary.Postprocessingは必要ありません。

詳細は、「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。

- 「ルールセットおよびデシジョン関数」: このデシジョン関数で実行するルールセットおよび他のデシジョン関数の順序付きリストです。DecisionPointディクショナリからのルールセットDecisionPointDictionary.PreprocessingおよびDecisionPointDictionary.Postprocessingは、それぞれアプリケーション固有のルールセットおよびデシジョン関数の前と後に実行するように追加する必要があります。

10.2.3 ADFビジネス・コンポーネントによるデシジョン関数の構成に関する必知事項

デシジョン関数の定義には、ルールセットとデシジョン関数の両方を含めることができます。アプリケーションでは、通常、配管コードとして機能するなんらかのルールまたはデシジョン関数が必要です。この配管コードは、ActionTypeを使用している場合にのみ必要です。

このようなアプリケーションには、入力データのトランスフォーメーション、補助ファクトのアサートまたは出力ファクトの処理を実行するコンポーネントが含まれます。配管コードは、アプリケーションのコア・ビジネス・ルールを含むルールの前または後に実行することが必要となる場合があります。

こうしたアプリケーションの問題とそれに関連するルールをネストしたデシジョン関数を使用して、アプリケーションの機能の問題と切り離すことができます。ネストしたデシジョン関数を使用すると、内側のデシジョン関数に管理上の配管指向の問題が含まれなくなるため、内側のデシジョン関数ではアプリケーションのコア・ロジックを定義するルールのみが示されるようになります。この設計によって、ユーザーが管理上のルールを理解する必要がなくなり、ユーザーがルールに不適切な変更を加えること(および、このことにより、システムが操作不能になる事態)を防止できます。

複数のルールセットおよびネストしたデシジョン関数を使用して構成を作成するには、2つのデシジョン関数を作成し、一方を他方に追加します。適切なネーミング方法は、ネストした内側のデシジョン関数に接尾辞Coreを付けることです。これにより、ユーザー指定のルールセットをこの内側のCoreデシジョン関数に追加できます。たとえば、DecisionPointDictionary.Preprocessingデシジョン関数、DecisionFunction_1Coreデシジョン関数およびDecisionPointDictionary.Postprocessingデシジョン関数を実行するようにDecisionFunction_1を定義できます。この例では、DecisionFunction_1Coreにコア・ビジネス・ロジック・ルールセットが含まれています。

デシジョン・ポイントの入力を、ADFビジネス・コンポーネント・オブジェクトのツリーのルートである、ADFビジネス・コンポーネントのファクト・タイプにすることも一般的です。ただし、ユーザーはツリーに存在するタイプのサブセットに一致する、ビジネス・ルールのみを記述できます。この場合、ネストしたデシジョン関数の入力を、格納されたルールセットに実際に一致するタイプのみになるよう定義することを習慣にするとよいでしょう。たとえば、ツリー・オプションが選択されたEmployeeファクト・タイプが入力である、デシジョン関数をコールするデシジョン・ポイントを考えてみます。このデシジョン関数は、Departmentファクト・タイプに一致するルールセットのみが存在する、ネストしたデシジョン関数を含むとします。この場合、ネストしたデシジョン関数には、入力としてツリー・オプションが選択されたEmployeeファクト・タイプまたはリスト・オプションが選択されたDepartmentファクト・タイプのいずれかを指定できます。この例では、ツリー・オプションにより、Employeeインスタンスの子が発生します。これにはDepartmentインスタンスのアサートも含まれます(これらのタイプ間の1対多関連のため)。Employeeが外側のデシジョン関数の入力で、ツリー・オプションが選択されている場合、Departmentファクト・タイプのインスタンスがアサートされ、内側のデシジョン関数のシグネチャをDepartmentのインスタンス(このデシジョン関数に適合された正確なタイプ)のリストとして識別できます。

10.3 ADFビジネス・コンポーネント・ファクトを使用したBusiness Rulesアプリケーションの作成

ADFビジネス・コンポーネント・サンプル・アプリケーションでは、ADFビジネス・コンポーネント・ファクト・タイプの使用を示します。

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

10.3.1 ADFビジネス・コンポーネント・ファクトを使用するアプリケーションの作成方法

Oracle Business RulesでADFビジネス・コンポーネント・ファクトを使用するには、まずOracle JDeveloperでアプリケーションおよびプロジェクトを作成する必要があります。

ADFビジネス・コンポーネント・ファクトを使用するアプリケーションを作成する手順は、次のとおりです。

1. Oracle JDeveloperを起動します。Oracle JDeveloperの開始ページが表示されます。

2. 「アプリケーション・ナビゲータ」でアプリケーション・メニューの「新規アプリケーション」をクリックします。

3. 「アプリケーションの名前付け」ページで、新規アプリケーションの名前および場所を入力します。

a. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、Chapter10と入力します。

b. 「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

c. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞を入力します。たとえば、com.exampleと入力します。
この接頭辞はグローバルで一意である必要があり、通常は自社が所有しているドメイン名を使用します。この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。

このサンプルでは、図10-1に示すように接頭辞com.exampleを使用します。

図10-1 ステップ1/6

「次へ」をクリックします。

4. 「プロジェクトの名前付け」ページ:

a. 「プロジェクト名」フィールドに、Chapter10と入力します。

b. 「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

c. 図10-2に示すように、「プロジェクトの機能」領域で、「ADFビジネス・コンポーネント」を選択します。

図10-2 ステップ2/6

「次へ」をクリックします。

5. Java設定の構成ページ:

a. 「デフォルト・パッケージ」フィールドに、com.exampleと入力します。

b. 「Javaソース・パス」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

c. 図10-3に示すように、「出力ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

図10-3 ステップ3/6

「次へ」をクリックします。

6. プロジェクト2の場合、「プロジェクトの名前付け」ページ:

a. 「プロジェクト名」フィールドに、ViewControllerと入力します。

b. 「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

c. 図10-4に示すように、「プロジェクトの機能」領域で、「ADF Faces」を選択します。

図10-4 ステップ4/6

「次へ」をクリックします。

7. プロジェクト2の場合、Java設定の構成ページ:

a. 「デフォルト・パッケージ」フィールドに、com.example.viewと入力します。

b. 「Javaソース・パス」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

c. 図10-5に示すように、「出力ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

図10-5 ステップ5/6

8. 完了後、「終了」をクリックします。

10.3.2 Business RulesのADFビジネス・コンポーネント・アプリケーションの作成方法

データベース表からADFビジネス・コンポーネントを追加する必要があります。この例では、標準のHRデータベース表を使用します。

ADFビジネス・コンポーネントを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

2. 右クリックしてメニューから「新規」を選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で、「ビジネス層」を開いて「ADFビジネス・コンポーネント」を選択します。

4. 「項目」領域で、「表からのビジネス・コンポーネント」を選択し、「OK」をクリックします。

5. 「ビジネス・コンポーネント・プロジェクトの初期化」ダイアログで、必要な接続情報を入力して、接続を追加します。「OK」をクリックします。

表からのビジネス・コンポーネントの作成ウィザードが表示されます。

6. 「エンティティ・オブジェクト」ページで、「使用可能」ボックスのオブジェクトを「選択済」ボックスに移動して、必要なオブジェクトを選択します。完成したリストを表示するために、「問合せ」をクリックすることが必要となる場合があります。たとえば、「DEPARTMENTS」と「EMPLOYEES」を選択します。

7. 「次へ」を選択します。「更新可能なビュー・オブジェクト」ページが表示されます。

8. 「更新可能なビュー・オブジェクト」ページで「Departments」および「Employees」を選択します。

9. 「次へ」を選択します。これにより、エンティティ・ベースのビュー・オブジェクト・ページが表示されます。

10. 「次へ」を選択します。「アプリケーション・モジュール」ページが表示されます。

11. 完了後、「終了」をクリックします。

10.3.3 Business Rulesサンプル・アプリケーションのビュー・オブジェクト・チューニングの更新方法

アプリケーションのパフォーマンス要件に合わせて、ViewObjectをチューニングする必要があります。

EmployeesViewまたはDepartmentsViewのチューニング・オプションを設定する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「EmployeesView」をダブルクリックして従業員のチューニング・オプションを設定するか、「DepartmentsView」をダブルクリックして部門のチューニング・オプションを設定します。

2. 「一般」ナビゲーション・タブで、「チューニング」を開きます。

3. 「チューニング」領域で「すべての行」を選択します。

4. 「チューニング」領域で、バッチ数フィールドに128と入力します。

5. 「チューニング」領域で「一度にすべて」を選択します。

10.3.4 Oracle Business Rulesのディクショナリの作成方法

Oracle JDeveloperを使用して、Oracle Business Rulesディクショナリを作成します。

ディクショナリを作成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

2. 右クリックして、リストから「新規」を選択します。

3. 「新規ギャラリ」ウィンドウで、「すべてのテクノロジ」タブを選択して「カテゴリ」領域で「ビジネス層」を開き、「ビジネス・ルール」を選択します。

4. 「新規ギャラリ」の「項目」領域で「ビジネス・ルール」を選択します。

5. 「OK」をクリックします。

6. 「ビジネス・ルールの作成」ダイアログで、ディクショナリ名とパッケージを入力します。

- たとえば、「名前」フィールドにChapter10Rulesと入力します。

- たとえば、「パッケージ」フィールドにcom.exampleと入力します。

7. 「OK」をクリックします。

JDeveloperによりルール・デザイナにディクショナリが作成され、ルール・デザイナでChapter10Rules.rulesファイルが開きます。

10.3.5 デシジョン・ポイント・ディクショナリ・リンクの追加方法

Oracle Business Rulesによって提供されているデシジョン・ポイント・ディクショナリへのディクショナリ・リンクを追加する必要があります。このディクショナリでは、ADFビジネス・コンポーネント・オブジェクトを持つデシジョン・ポイント・インタフェースで使用する機能がサポートされています。

デシジョン・ポイント・ディクショナリ・リンクを追加します。

1. Rules Designerで、「リンク」ナビゲーション・タブをクリックします。

2. 「作成」ボタンの横にあるメニューから、「デシジョン・ポイント・ディクショナリ」を選択します。この操作の完了には時間がかかる場合があります。待機した後、ルール・デザイナによってデシジョン・ポイント・ディクショナリへのリンクが追加されます。

10.3.6 ADFビジネス・コンポーネント・ファクトをインポートする方法

ルール・デザイナでADFビジネス・コンポーネント・ファクトをインポートして、ルールの作成時にこれらのオブジェクトを使用できるようにします。

ADFビジネス・コンポーネント・ファクトをインポートします。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「ADF-BCファクト」タブを選択します。

3. 「作成」ボタンをクリックします。「ADFビジネス・コンポーネント・ファクト」ページが表示されます。

4. 「接続」フィールドのリストから、ADFビジネス・コンポーネント・オブジェクトが使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。

5. 「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。たとえば、「com.example.EmployeesView」を選択します。

6. 「OK」をクリックします。これにより、「ファクト」ナビゲーション・タブが表示されます。

ADFビジネス・コンポーネント・ファクトには循環参照が含まれていることがあります。この場合は、次のような検証警告が示されます。

RUL-05037: A circular definition exists in the data model

「ビジネス・ルール」検証ログにこの警告が表示されている場合は、循環参照を手動で解決する必要があります。そのためには、循環参照に関係するいずれかのプロパティの「参照可能」チェック・ボックスの選択を解除します。

10.3.6.1 プロパティを表示不可能としてマーク付けする方法

プロパティを表示不可能としてマーク付けする手順は、次のとおりです。

1. 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。

2. 「DepartmentsView」行のアイコンをダブルクリックします。

3. 「プロパティ」表の「EmployeesView」行で、「参照可能」チェック・ボックスの選択を解除します。

4. 「OK」をクリックします。

10.3.6.2 DepartmentsViewとEmployeesViewの別名を設定する方法

DepartmentsViewおよびEmployeesViewの別名を設定する手順は、次のとおりです。

1. 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。

2. 「エイリアス」列で、EmployeesViewをEmployeeで置き換えます。

3. 「エイリアス」列で、DepartmentsViewをDepartmentで置き換えます。

10.3.7 外部マネージャ・ルールセットの追加および実行方法

外部マネージャ・ルールセットを実行するサンプル・コードは、setInputsメソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数が1回起動し、すべてのビュー・オブジェクト行がListにロードされます。この方法を使用してデシジョン・ポイントを起動する場合、すべてのビュー・オブジェクト行が同時にメモリーにロードされる必要があり、OutOfMemory例外が発生する可能性があるため、スケーラブルではありません。この起動スタイルは、既知のビュー・オブジェクト行が少数ある場合にのみ使用します。setViewObjectでデシジョン・ポイントを使用することもできます。詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

10.3.7.1 外部マネージャ・ルールセットおよびデシジョン関数の追加方法

ビュー・オブジェクトがファクトとしてインポートされた後、ルールセットの名前を変更して、アプリケーションのデシジョン関数を作成できます。

ルールセットの名前を変更するには、「ルール・デザイナ」で「Ruleset_1」ナビゲーション・タブを選択してから、ルールセット名を選択し、Outside Manager Rulesetと入力してそのルールセット名を変更します。

デシジョン関数を追加する手順は、次のとおりです。

1. 「デシジョン関数」ナビゲーション・タブをクリックします。

2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

3. デシジョン関数フィールドを次のように編集します。

- 「名前」に値FindOutsideManagersを入力します。

- 「入力」領域で、「入力の追加」ボタンをクリックして入力情報を次のように編集します。

- 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

- 「リスト」チェック・ボックスを選択します。

このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。詳細は、「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。

- 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

- DecisionPointDictionary.Preprocessing

- Outside Manager Ruleset

- DecisionPointDictionary.Postprocessing

4. 「選択済」領域のアイテムが、DecisionPointDictionary.Preprocessing、Outside Manager Ruleset、DecisionPointDictionary.PostProcessingの順序になっていることを確認します。

順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

5. 「OK」をクリックします。

複数の警告が表示されます。これらの警告は、後のステップでルールセットにルールを追加すると、削除されます。

10.3.7.2 ActionTypeのJava実装クラスの作成方法

サンプル・アプリケーションを作成し、ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionTypeのJava実装クラスを作成する必要があります。ActionTypeのすべてのサブクラスは、abstractのexecメソッドを実装する必要があります。

ActionTypeのJava実装クラスを作成する手順は、次のとおりです。

1. Oracle JDeveloperで、「Chapter10」というプロジェクトを選択します。

2. 「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」フォルダを選択します。

3. 右クリックして、リストから「新規」を選択します。

4. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

5. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

6. 「OK」をクリックします。

7. Javaクラスの作成ダイアログで、次のプロパティを構成します。

- 「名前」に値MessageActionを入力します。

- 「パッケージ」の値としてcom.exampleを入力します。

- 「拡張」に値oracle.rules.sdk2.decisionpoint.ActionTypeを入力します。

8. 「OK」をクリックします。

Oracle JDeveloperによってJavaクラスが表示されます。

9. actiontype Java実装を示す次のサンプル・コードでこのコードを置き換えます。

package com.example;

import oracle.rules.sdk2.decisionpoint.ActionType;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;

public class MessageAction extends ActionType {
public MessageAction() {
super();
}

public void exec(DecisionPointInstance decisionPointInstance) {
System.out.println(message);
}

private String message = null;

public void setMessage(String message) {
this.message = message;
}

public String getMessage() {
return message;
}
}

10. アプリケーション・ナビゲータで、「MessageAction.java」を右クリックし、リストから「メイク」を選択します。

10.3.7.3 メッセージ・アクションのJavaファクトをインポートする方法

新しいJavaクラスを作成したため、後でルールを作成するときに使用できるように、このクラスをルール・デザイナのJavaファクト・タイプとして追加する必要があります。

Javaファクト・タイプを作成する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。

2. 「Javaファクト」タブを選択します。

3. 「作成」をクリックします。

4. 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、comおよびexampleを開いて、「MessageAction」チェック・ボックスを表示します。

5. 「MessageAction」チェック・ボックスを選択します。

6. 「OK」をクリックします。これにより、ファクトが表に追加されます。

10.3.7.4 マネージャ検索ルールの追加方法

従業員とは別の部門にいるマネージャを検索するルールを追加します。

別部門のマネージャ検索ルールを追加する手順は、次のとおりです。

1. ルール・デザイナで、「Outside Manager Ruleset」タブを選択します。

2. 「追加」をクリックし、リストから「ルールの作成」を選択します。

3. デフォルトのルール名「Rule_1」を選択して、ルールの名前を変更します。これによりテキスト入力領域が表示されます。名前を入力します。たとえば、Find managers in different departmentと入力します。[Enter]を押して名前を適用します。

4. 「詳細設定の表示」をクリックします。詳細は、「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

5. ルールで「拡張モード」を選択します。

6. 図10-6に示すように、ルールを入力します。「THEN」領域に表示されているルールのアクションは、長すぎて図内に表示しきれません。作成する完全なアクションには、次の項目を含めます。

IFEmployee is EmployeeandManager is a Employee andManager.EmployeeId == Employee.ManagerId andManager.DepartmentId != Employee.DepartmentIDTHENassert new MessageAction(<add property> message: "Employee " + Employee.FirstName + " " + Employee.LastName + "(" + Employee.EmployeeId + ")"+ " in dept " + Employee.DepartmentId + " has manager outside of department, " + Manager.FirstName + " " + Manager.LastName + "(" + Manager.EmployeeId + ")" + " in dept " + Manager.DepartmentId )

図10-6 別部門のマネージャ検索ルール

10.3.7.5 外部マネージャ・ファインダ・クラスの追加方法

外部マネージャ・ファインダ・クラスを追加します。このクラスはデシジョン・ポイントを使用して、デシジョン関数を実行します。

外部マネージャ・ファインダ・クラスを追加する手順は、次のとおりです。

1. Chapter10プロジェクトを選択します。

2. 右クリックして「新規」を選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。

5. 「名前」フィールドにOutsideManagerFinderと入力します。「OK」をクリックします。

6. このクラスのコンテンツを、外部マネージャ・ファインダのJavaクラスを示す次のサンプル・コードで置き換えます。

package com.example;

import java.util.ArrayList;

import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;

import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;

public class OutsideManagerFinder {
private static final String AM_DEF = "com.example.AppModule";
private static final String CONFIG = "AppModuleLocal";
private static final String VO_NAME = "EmployeesView1";

private static final DictionaryFQN DICT_FQN =
new DictionaryFQN("com.example", "Chapter10Rules");

private static final String DF_NAME = "FindOutsideManagers";

private DecisionPoint dp = null;

public OutsideManagerFinder() {
try {
dp = new DecisionPointBuilder()
.with(DICT_FQN)
.with(DF_NAME)
.build();
} catch (SDKException e) {
System.err.println(e);
}
}

public void run() {
final ApplicationModule am =
Configuration.createRootApplicationModule(AM_DEF, CONFIG);
final ViewObject vo = am.findViewObject(VO_NAME);
final DecisionPointInstance point = dp.getInstance();
point.setInputs(new ArrayList<Object>(){{ add(vo); }});
try {
point.invoke();
} catch (RLException e) {
System.err.println(e);
} catch (SDKException e) {
System.err.println(e);
}
}

public static void main(String[] args) {
OutsideManagerFinder omf = new OutsideManagerFinder();
omf.run();
}

}

10.3.7.6 ローカル・ディクショナリ・アクセスのADF META INFの更新方法

ADF-META-INFファイルの、ディクショナリにアクセスするためのMDS情報を更新する必要があります。MDSを持つローカル・ファイルを使用して、Oracle Business Rulesディクショナリにアクセスできます。ただし、一般的に、本番環境のOracle Business Rulesでは、ディクショナリ・アクセスにこの手順を使用しません。本番環境でのデシジョン・ポイントを使用したMDSによるディクショナリへのアクセスの詳細は、「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。

ADF-META-INFを更新する手順:

1. 「アプリケーション・ナビゲータ」で「アプリケーション・リソース」を開きます。

2. 「ディスクリプタ」フォルダおよび「ADF META-INF」フォルダを開きます。

3. adf-config.xmlをダブルクリックして、このファイルを開きます。

4. 「ソース」タブをクリックして、adf-config.xmlのソースを表示します。

5. </adf-config>タグを閉じる前に、次のコード例に示すようにadf-config.xmlにMDS情報を追加します。

<adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
<mds-config version="11.1.1.000" xmlns="http://xmlns.oracle.com/mds/config">
<persistence-config>
<metadata-namespaces>
<namespace metadata-store-usage="mstore-usage_1" path="/"/>
</metadata-namespaces>
<metadata-store-usages>
<metadata-store-usage id="mstore-usage_1">
<metadata-store class-name="oracle.mds.persistence.stores.file.FileMetadataStore">
<property name="metadata-path"
value="C:\jdevinstance\mywork\Chapter10\.adf\"/>
</metadata-store>
</metadata-store-usage>
</metadata-store-usages>
</persistence-config>
</mds-config>
</adf-mds-config>

6. 属性metadata-pathを持つ<property>要素で、使用しているシステムのアプリケーションの.adfディレクトリに一致するようにパスを変更します。

10.3.7.7 MDSでアクセス可能な場所に定義/ディクショナリをコピーする方法

MDSでアクセス可能な場所に定義/ディクショナリをコピーするには:

1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーション、Chapter10プロジェクトおよびsrcフォルダにナビゲートし、comフォルダを選択およびコピーします。または、MDSでアクセス可能な場所にディクショナリをコピーする場合は、Oracle Business Rulesディクショナリを含むoracleディレクトリをコピーします。

2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

3. comフォルダをこのディレクトリにコピーするか、oracleフォルダをこのディレクトリにコピーします。

10.3.7.8 外部マネージャ・ファインダをチェックするプロジェクトの作成および実行方法

従業員が別の部門にいるマネージャの検索ルールを実行して、プロジェクトを作成しおよびテストできます。

OutsideManagerFinder構成を作成します。

1. 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、OutsideManagerFinderと入力します。

4. 「OK」をクリックします。

5. 「OutsideManagerFinder」を選択した状態で、「編集」をクリックします。

6. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

7. src\com\exampleフォルダから「OutsideManagerFinder.java」を選択します。

8. 「OK」をクリックします。

9. 「実行構成の編集」ダイアログで「OK」をクリックします。

10. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のドロップダウン・メニューで「OutsideManagerFinder」を選択します。次の例に示すように、この構成を実行すると、出力が生成されます。

Emp Shelley Higgins(205) in dept 110 manager outside of department, Neena Kochhar(101) in dept 90
Emp Hermann Baer(204) in dept 70 manager outside of department, Neena Kochhar(101) in dept 90
Emp Susan Mavris(203) in dept 40 manager outside of department, Neena Kochhar(101) in dept 90
Emp Michael Hartstein(201) in dept 20 manager outside of department, Steven King(100) in dept 90
Emp Jennifer Whalen(200) in dept 10 manager outside of department, Neena Kochhar(101) in dept 90
Emp Kimberely Grant(178) in dept null manager outside of department, Eleni Zlotkey(149) in dept 80
Emp Eleni Zlotkey(149) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp Gerald Cambrault(148) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp Alberto Errazuriz(147) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp Karen Partners(146) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp John Russell(145) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp Kevin Mourgos(124) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Shanta Vollman(123) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Payam Kaufling(122) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Adam Fripp(121) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Matthew Weiss(120) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Den Raphaely(114) in dept 30 manager outside of department, Steven King(100) in dept 90
Emp Nancy Greenberg(108) in dept 100 manager outside of department, Neena Kochhar(101) in dept 90
Emp Alexander Hunold(103) in dept 60 manager outside of department, Lex De Haan(102) in dept 90

10.3.8 部門マネージャ・ルールセットの追加および実行方法

部門マネージャ・ルールセットを実行するサンプル・コードは、setViewObjectメソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。すべてのデシジョン関数コールは、同じRuleSession内で発生します。デシジョン関数のコールとコールの間に、RuleSessionによって、以前のデシジョン関数コールのすべての状態が保存されます。このため、以前のコール時にアサートされたオブジェクトは、指定するルールセットによって明示的に取り消されない場合、次のコールの作業メモリーに残ります。状態が保持されている場合は、取消しアクションを使用するルールを持つルールセットを実行して、コールとコールの間にすべてのファクトまたは選択したファクトを取り消すことができます。このルールセットは、デシジョン・ポイントで使用する同じデシジョン関数の一部として実行されます。すべての従業員の取消しルールセットは、これらのファクトのリトラクトを示します。詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

10.3.8.1 部門マネージャ・ファインダ・ルールセットの追加方法

部門マネージャ・ファインダ・ルールセットを追加します。

部門マネージャ・ファインダ・ルールセットを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセットの作成」をクリックします。

2. 「ルールセットの作成」ダイアログで、「名前」フィールドにDepartment Manager Finder Rulesetと入力します。

3. 「OK」をクリックします。

10.3.8.2 部門マネージャ・ファインダ・ルールセットの検索ルールの追加方法

次に、部門マネージャを検索する検索ルールを追加します。このルールは、Oracle ADFビジネス・コンポーネント・ファクト・タイプでのツリー・モード・ルールの使用を示します。

部門マネージャ・ファインダ・ルールを追加します。

1. ルール・デザイナで、「Department Manager Finder Ruleset」を選択します。

2. 「追加」ボタンの横にあるドロップダウン・メニューで、「ルールの作成」をクリックします。

3. 名前「Rule_1」を選択し、Findを入力して、ルールの名前を変更します。

4. 「詳細設定の表示」をクリックします。詳細は、「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

5. ルールで、「ツリー・モード」を選択します。

6. 「検索」ルール・テストおよびアクションを入力します。次のものは、このルールの完全なテキストを示しています。

ROOT: Employee
IF
Employee/DepartmentsView.ManagerID == Employee.EmployeeID
THEN
retract Employee
assert new MessageAction ( <add property> message: Employee.FirstName + " " + Employee.LastName + " is the manager of dept "+ Employee/DepartmentsView.DepartmentName )

10.3.8.3 従業員取消しルールセットの追加方法

従業員ファクト・タイプ・インスタンスを取り消すルールセットを追加します。これにより、従業員ファクト・タイプが、デシジョン関数の起動と起動の間に削除されます。

従業員取消しルールセットを追加する手順は、次のとおりです。

1. Retract Employees Rulesetを追加します。

2. 「Retract Employees Ruleset」でルールを追加し、このルールにRetract all employeesという名前を付けます。

10.3.8.4 部門マネージャ検索デシジョン関数の追加方法

部門マネージャ・ファインダ・ルールセット用のデシジョン関数を作成します。このデシジョン関数を使用して、デシジョン・ポイントからルールセットを実行します。

部門マネージャ・ファインダ・ルールセットのデシジョン関数を追加する手順は、次のとおりです。

1. 「デシジョン関数」ナビゲーション・タブをクリックします。

2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

3. デシジョン関数フィールドを次のように更新します。

- 「名前」に値FindDepartmentManagersを入力します。

- 「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。

- 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

- 「ツリー」チェック・ボックスを選択します。

このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。

- 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

- DecisionPointDictionary.Preprocessing

- Department Manager Finder Ruleset

- Retract Employees

- DecisionPointDictionary.Postprocessing

4. 「選択済」領域のアイテムが、DecisionPointDictionary.Preprocessing、Department Manager Finder Ruleset、Retract EmployeesおよびDecisionPointDicitonary.Postprocessingの順序になっていることを確認します。

順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

5. 「OK」をクリックします。

10.3.8.5 部門マネージャ・ファインダJavaクラスの追加方法

部門マネージャ・ファインダ・クラスを追加します。このクラスには、デシジョン関数を実行するデシジョン・ポイントが指定されたコードが含まれます。

部門マネージャ・ファインダ・クラスを追加します。

1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

2. 右クリックして「新規」を選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。

5. 「名前」フィールドにDeptManagerFinderと入力します。「OK」をクリックします。

6. このクラスのコンテンツを、次の例に示すコードで置き換えます。

package com.example;

import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
import oracle.jbo.server.DBTransactionImpl2;

import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;

public class DeptManagerFinder {
private static final String AM_DEF = "com.example.AppModule";
private static final String CONFIG = "AppModuleLocal";
private static final String VO_NAME = "EmployeesView1";

private static final String DF_NAME = "FindDepartmentManagers";

private static final DictionaryFQN DICT_FQN =
new DictionaryFQN("com.example", "Chapter10Rules");

private DecisionPoint dp = null;

public DeptManagerFinder() {

try {
dp = new DecisionPointBuilder()
.with(DICT_FQN)
.with(DF_NAME)
.build();
} catch (SDKException e) {
System.err.println(e);
}
}

public void run() {
final ApplicationModule am =
Configuration.createRootApplicationModule(AM_DEF, CONFIG);
final ViewObject vo = am.findViewObject(VO_NAME);
final DecisionPointInstance point = dp.getInstance();

point.setTransaction((DBTransactionImpl2)am.getTransaction());
point.setAutoCommit(true);
point.setViewObject(vo);
try {
point.invoke();
} catch (RLException e) {
System.err.println(e);
} catch (SDKException e) {
System.err.println(e);
}
}

public static void main(String[] args) {
new DeptManagerFinder().run();
}
}

10.3.8.6 MDSでアクセス可能な場所にディクショナリをコピーする方法

MDSでアクセス可能な場所に更新したディクショナリをコピーします。

MDSでアクセス可能な場所にディクショナリをコピーします。

1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびプロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。

2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

3. oracleフォルダをこのディレクトリにコピーします。

10.3.8.7 マネージャ検索ルールをチェックするプロジェクトの作成および実行方法

部門マネージャ・ファインダ・ルールセットを実行するプロジェクトを作成およびテストできます。

プロジェクトを作成します。

1. 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、DeptManagerFinderと入力します。

4. 「設定のコピー元」フィールドにDefaultと入力します。

5. 「OK」をクリックします。

6. 「DeptManagerFinder」を選択した状態で、「編集」をクリックします。

7. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

8. src\com\exampleディレクトリでDeptManagerFinder.javaを選択し、「開く」をクリックします。

9. 「実行構成の編集」ダイアログで「OK」をクリックします。

10. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のメニューで「DeptManagerFinder」を選択します。次の例に示すように、デシジョン・ポイントを実行すると、出力が生成されます。

Michael Hartstein is the manager of dept Marketing
John Russell is the manager of dept Sales
Adam Fripp is the manager of dept Shipping
Den Raphaely is the manager of dept Purchasing
Alexander Hunold is the manager of dept IT
Shelley Higgins is the manager of dept Accounting
Hermann Baer is the manager of dept Public Relations
Susan Mavris is the manager of dept Human Resources
Jennifer Whalen is the manager of dept Administration
Nancy Greenberg is the manager of dept Finance
Steven King is the manager of dept Executive
Shelley Higgins is the manager of dept Accounting
Hermann Baer is the manager of dept Public Relations
Susan Mavris is the manager of dept Human Resources
Jennifer Whalen is the manager of dept Administration
Nancy Greenberg is the manager of dept Finance
Alexander Hunold is the manager of dept IT
Alexander Hunold is the manager of dept IT
Nancy Greenberg is the manager of dept Finance
Den Raphaely is the manager of dept Purchasing
Adam Fripp is the manager of dept Shipping
John Russell is the manager of dept Sales
Jennifer Whalen is the manager of dept Administration
Michael Hartstein is the manager of dept Marketing
Susan Mavris is the manager of dept Human Resources
Hermann Baer is the manager of dept Public Relations
Shelley Higgins is the manager of dept Accounting

この例のツリー・モード・ルールで作業しているとき、出力に重複エントリがある場合、この重複エントリは、ビュー・オブジェクトのグラフの異なる部分にある同じデータで複数のルールを起動したことによって発生したものです。

10.3.9 従業員昇給ルールセットと従業員取消しルールセットの追加および実行方法

昇給ルールセットを実行するサンプル・コードでは、setViewObjectメソッドを使用するビュー・オブジェクトを指定して、デシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。デシジョン関数のコールとコールの間にこれらのインスタンスが作業メモリーに残らないよう、従業員取消しルールセットによって、各コールでアサートされたEmployeeのインスタンスがすべて取り消されます。「昇給ActionTypeのJava実装クラスの作成方法」のアクション・タイプは、ActionTypeを使用してViewRowImpl属性の値を変更する方法を示しています。

詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

10.3.9.1 昇給ルールセットの追加方法

昇給ルールセットを追加します。

昇給ルールセットを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセットの作成」をクリックします。

2. 「ルールセットの作成」ダイアログで、「名前」フィールドにRaises Rulesetと入力します。

3. 「OK」をクリックします。

10.3.9.2 昇給ActionTypeのJava実装クラスの作成方法

サンプル・アプリケーションのこの部分を作成し、昇給ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionTypeのJava実装クラスを作成する必要があります。ActionTypeのすべてのサブクラスは、abstractのexecメソッドを実装する必要があります。

昇給ActionTypeのJava実装クラスを作成する手順は、次のとおりです。

1. Oracle JDeveloperで、「Chapter10」というプロジェクトを選択します。

2. 「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」フォルダを選択します。

3. 右クリックして、リストから「新規」を選択します。

4. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

5. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。

6. Javaクラスの作成ダイアログで、次のプロパティを構成します。

- 「名前」に値RaiseActionを入力します。

- 「パッケージ」の値としてcom.exampleを入力します。

- 「拡張」に値oracle.rules.sdk2.decisionpoint.ActionTypeを入力します。

7. 「OK」をクリックします。

Oracle JDeveloperによってJavaクラスが表示されます。

8. actiontype Java実装を示す次のサンプル・コードでこのコードを置き換えます。

package com.example;

import oracle.jbo.domain.Number;

import oracle.rules.sdk2.decisionpoint.ActionType;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;

public class RaiseAction extends ActionType {
private double raisePercent;

public void exec(DecisionPointInstance dpi) {
Number salary = (Number)getViewRowImpl().getAttribute("Salary");
salary = (Number)salary.multiply(1.0d + getRaisePercent()).scale(100,2, new boolean[]{false});
dpi.addResult("raise for " + this.getViewRowImpl().getAttribute("EmployeeId"),
getRaisePercent() + "=>" + salary );
getViewRowImpl().setAttribute("Salary", salary);
}

public void setRaisePercent(double raisePercent) {
this.raisePercent = raisePercent;
}

public double getRaisePercent() {
return raisePercent;
}
}

9. アプリケーション・ナビゲータで、「RaiseAction.java」を右クリックし、リストから「メイク」を選択します。

10.3.9.3 昇給アクションのJavaファクトをインポートする方法

新しいJavaクラスが作成されました。このクラスをルール・デザイナのJavaファクト・タイプとしてインポートし、後でルールを作成するときに使用できるようにします。

Javaファクト・タイプを作成する手順は、次のとおりです。

1. ルール・デザイナで、「ManagerRules.rules」ディクショナリを選択します。

2. 「ファクト」ナビゲーション・タブをクリックし、「Javaファクト」タブを選択します。

3. 「作成」...をクリックします。

4. 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、comおよびexampleを開いて、「RaiseAction」チェック・ボックスを表示します。

5. 「RaiseAction」チェック・ボックスを選択します。

6. 「OK」をクリックします。

「Javaファクト」表に昇給アクション・ファクト・タイプが追加されます。

10.3.9.4 12年昇給ルールの追加方法

このルールは、アクション・タイプを使用して、データベース・エントリを更新する方法を示します。

12年昇給ルールを追加する手順は、次のとおりです。

1. Rules Designerの「Raises Ruleset」で、「ルールの作成」をクリックします。

2. 名前「Rule_1」を選択し、値Longer than 12 yearsを入力して、ルールの名前を変更します。

3. 「詳細設定の表示」をクリックします。詳細は、「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

4. 「拡張モード」を選択します。

5. この例に示すように、12年昇給ルールを入力します。

IF
Employee is Employee
and
CurrentDate is a CurrentDate and
Duration.years between(Employee.HireDate, CurrentDate.date) >=12
THEN
assert new RaiseAction( <add property> raisePercent: .03, viewRowImple:Employee.ViewRowImpl)
retract Employee

10.3.9.5 従業員昇給デシジョン関数の追加方法

従業員昇給ルールセットおよびすべての従業員の取消しルールセット用のデシジョン関数を作成します。

デシジョン関数を追加する手順は、次のとおりです。

1. 「デシジョン関数」ナビゲーション・タブをクリックします。

2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

3. デシジョン関数フィールドを次のように更新します。

- 「名前」に値EmployeeRaisesを入力します。

- 「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。

- 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。

- 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

- DecisionPointDictionary.Preprocessing

- Raises Ruleset

- Retract Employees Ruleset

- DecisionPointDictionary.Postprocessing

4. 「選択済」領域のアイテムが、DecisionPointDicitonary.Preprocessing、Raises Ruleset、Retract Employees Ruleset、DecisionPointDictionary.PostProcessingの順序になっていることを確認します。

順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

5. 「OK」をクリックします。

10.3.9.6 従業員昇給Javaクラスの追加方法

従業員昇給クラスを追加します。これにより、デシジョン関数が実行されます。

従業員昇給クラスを追加する手順は、次のとおりです。

1. Chapter10プロジェクトを選択します。

2. 右クリックして「新規」を選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。

5. 「名前」フィールドにEmployeeRaisesと入力します。「OK」をクリックします。

6. このクラスのコンテンツを、次に示すdeptmanagerfinderクラス・コードで置き換えます。

package com.example;

import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
import oracle.jbo.server.DBTransactionImpl2;

import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;

public class EmployeeRaises {
private static final String AM_DEF = "com.example.AppModule";
private static final String CONFIG = "AppModuleLocal";
private static final String VO_NAME = "EmployeesView1";
private static final String DF_NAME = "EmployeeRaises";

private static final DictionaryFQN DICT_FQN =
new DictionaryFQN("com.example", "Chapter10Rules");

private DecisionPoint dp = null;

public EmployeeRaises() {

try {
dp = new DecisionPointBuilder()
.with(DICT_FQN)
.with(DF_NAME)
.build();
} catch (SDKException e) {
System.err.println(e);
}
}

public void run() {
final ApplicationModule am =
Configuration.createRootApplicationModule(AM_DEF, CONFIG);
final ViewObject vo = am.findViewObject(VO_NAME);
final DecisionPointInstance point = dp.getInstance();

point.setTransaction((DBTransactionImpl2)am.getTransaction());
point.setAutoCommit(true);
point.setViewObject(vo);
try {
point.invoke();
} catch (RLException e) {
System.err.println(e);
} catch (SDKException e) {
System.err.println(e);
}

for (DecisionPoint.NamedValue result : point.getResults()){
System.out.println(result.getName() +  " " + result.getValue());
}

}

public static void main(String[] args) {
new EmployeeRaises().run();
}
}

10.3.9.7 MDSでアクセス可能な場所にディクショナリをコピーする方法

MDSでアクセス可能な場所に更新したディクショナリをコピーします。

MDSでアクセス可能な場所にディクショナリをコピーするには:

1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10フォルダおよびChapter10プロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。

2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

3. oracleフォルダをこのディレクトリにコピーします。

10.3.9.8 昇給ルールをチェックするプロジェクトの作成および実行方法

従業員昇給ルールセットを実行して、プロジェクトを作成およびテストできます。

プロジェクトをビルドするには:

1. 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、EmployeeRaisesと入力します。

4. 「設定のコピー元」フィールドにDefaultと入力します。「OK」をクリックします。

5. 「EmployeeRaises」を選択した状態で、「編集」をクリックします。

6. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

7. src\com\exampleフォルダから「EmployeeRaises.java」を選択します。「開く」をクリックします。

8. 「実行構成の編集」ダイアログで「OK」をクリックします。

9. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のメニューで「EmployeeRaises」を選択します。次の例に示すように、Oracle JDeveloperに出力が表示されます。

raise for 100 0.03=>81.7
raise for 101 0.03=>1872.46
raise for 102 0.03=>60596.78
raise for 103 0.03=>31146.26
raise for 104 0.03=>20159.43
raise for 108 0.03=>35822.68
raise for 109 0.03=>26084.5
raise for 114 0.03=>27500.92
raise for 115 0.03=>7524.5
raise for 120 0.03=>16262.34
raise for 121 0.03=>16183.41
raise for 122 0.03=>15591.35
raise for 131 0.03=>3671.33
raise for 133 0.03=>4567.98
raise for 137 0.03=>4838.1
raise for 141 0.03=>4703.71
raise for 142 0.03=>4044.79
raise for 145 0.03=>17734.79
raise for 146 0.03=>17101.39
raise for 147 0.03=>15201.23
raise for 150 0.03=>12667.7
raise for 151 0.03=>12034.32
raise for 156 0.03=>13047.73
raise for 157 0.03=>12395.35
raise for 158 0.03=>11400.93
raise for 159 0.03=>10134.16
raise for 168 0.03=>14567.86
raise for 174 0.03=>13934.48
raise for 175 0.03=>11147.58
raise for 184 0.03=>5480.03
raise for 185 0.03=>5193.76
raise for 192 0.03=>5219.1
raise for 193 0.03=>4940.41
raise for 200 0.03=>5740.99
raise for 201 0.03=>16962.05
raise for 203 0.03=>8481.03
raise for 204 0.03=>13047.73
raise for 205 0.03=>15657.27
raise for 206 0.03=>10829.62

11 SOAアプリケーションでのデシジョン・コンポーネントの使用

この章では、Oracle Business Rulesをサポートするデシジョン・コンポーネントについて説明します。また、デシジョン・コンポーネントの使用方法について、ルールおよびルールセットを、複数のビジネス・プロセスから起動できる再利用可能なサービスとして公開するメカニズムとして説明します。

デシジョン・コンポーネントは、コンポジット内で使用でき、かつBPELコンポーネントに接続できるSCAコンポーネントです。それ以外に、デシジョン・コンポーネントはヒューマン・ワークフローでのメディエータおよび拡張ルーティング・ルールの動的ルーティング機能に使用されます。

この章の内容は次のとおりです。

- デシジョン・コンポーネントの概要

- デシジョン・コンポーネントの使用

- デシジョン・サービスのアーキテクチャ

11.1 デシジョン・コンポーネントの概要

デシジョン・コンポーネントは、基礎となるデシジョン関数にルール・セッションをラップするWebサービスです。

デシジョン・コンポーネントは、次の要素で構成されています。

- Rules Engineを使用して評価されるルールまたはデシジョン表。これらはルール・デザイナを使用して定義し、ビジネス・ルール・ディクショナリに格納します。

- 特定のルールの評価に必要なファクトを記述したメタデータ。ルールまたはデシジョン表を含むルールセットは、入力および出力であるファクトとともにサービスとして公開されます。これらのファクトは、XSD定義を介して公開される必要があります。
たとえば、信用格付ルールセットにはファクトとして顧客IDおよび過去のローン履歴が必要ですが、年金支払ルールセットにはファクトとして従業員の勤続年数、給与および年齢の値が必要です。

詳細は、「デシジョン・コンポーネント・メタデータの使用」を参照してください。

- Webサービスは、基礎となるルール・エンジンに入力、出力およびコールをラップします。
このサービスにより、ビジネス・プロセスはファクトをプロセスの一部としてアサートしたり、取り消すことができます。すべてのファクトをビジネス・プロセスから1単位としてアサートできる場合があります。また、ビジネス・プロセスでファクトを増分アサートし、最終的にルール・エンジンによる推論を参照する場合もあります。したがって、サービスではステートレスな相互作用とステートフルな相互作用の両方をサポートする必要があります。

このような多様なビジネス・ルール・サービス・コンポーネントを作成できます。

詳細は、Oracle SOAスイートによるSOAアプリケーションの開発を参照してください。

11.2 デシジョン・コンポーネントの使用

Oracle JDeveloperとルール・デザイナを使用すると、これらのツールにより必須のメタデータおよびWSDL操作すべてが自動的に生成されます。

デシジョン・コンポーネントは、次の方法でSOAコンポジット・アプリケーションに統合できます。

- SOAコンポジット・エディタで、デシジョン・コンポーネントをスタンドアロン・コンポーネントとして作成します。このシナリオでは、デシジョン・サービスはコンポジット・レベルで公開されるため、任意のWebサービス・クライアントから起動できます。
詳細は、『Oracle SOA SuiteでのSOAアプリケーションの開発』のOracle Business Rulesのスタート・ガイドを参照してください。

- SOAコンポジット・エディタでデシジョン・コンポーネントを作成し、BPELプロセスに関連付けます。このシナリオでは、デシジョン・サービスはコンポジット・レベルで公開されません。ただし、BPEL、Oracle Mediator、Oracle Human Workflowなど、コンポジット内の他の任意のコンポーネントに接続できます。
詳細は、『Oracle SOA SuiteでのSOAアプリケーションの開発』のOracle Business Rulesのスタート・ガイドを参照してください。

- ヒューマン・タスク・コンポーネントのヒューマン・タスク・エディタで、デシジョン・コンポーネントを作成します。

この統合には、次のメリットがあります。

- 動的な処理: 適切なルーティング、プロセス内のポリシーの検証および制約チェックの提供

- 非定型ヒューマン・タスクとの統合: ポリシーベースのタスクの割当て、各種エスカレーション・ポリシーおよびタスクのロード・バランシングを提供

11.2.1 デシジョン・コンポーネント・メタデータの使用

デシジョン・コンポーネントは、次のファイルで定義されています。

- デシジョン・サービス・メタデータ(.decs)ファイル

- SCAコンポーネント・タイプ(.componentType)ファイル

- composite.xml内のデシジョン・コンポーネント・エントリ

通常、これらのファイルの生成およびメンテナンスにはOracle JDeveloperを使用します。

- デシジョン・サービス・メタデータ(.decs)ファイル
コンポジット内のすべてのデシジョン・コンポーネントには、1つのビジネス・ルール・メタデータ・ファイルが含まれています。ビジネス・ルール・メタデータ・ファイルにより、コンポーネントのビジネス・ルール・ディクショナリの場所およびデシジョン・コンポーネントによって公開されるデシジョン・サービスに関する情報が提供されます。

1つのデシジョン・コンポーネントは、1つ以上のデシジョン・サービスを公開します。たとえば、CreditRatingデシジョン・コンポーネントは、2つのサービス、CheckEligibilityおよびCalculateCreditRatingを公開します。Oracle Fusion Middleware 11gリリース1 (11.1.1)以降では、デシジョン・サービス・メタデータにはWebサービスとして公開されるデシジョン関数名が含まれます。Oracle SOA Suiteの以前のリリースから移行されたプロジェクトに対し、デシジョン・サービス・メタデータは、10.1.3.xで使用された相互作用のパターンによっては、より多くの情報を保持していることが一般的です。

ビジネス・ルール・メタデータ・ファイル(business_rule_name.decs)では、ビジネス・ルールとデザインタイムおよびバックエンドOracle Rules Engineとの相互作用に関与するコンポーネント間の規定が定義されます。

このファイルは、SOAコンポジット・アプリケーションの場合、Oracle JDeveloperの「アプリケーション・ナビゲータ」の「SOAコンテンツ」領域にあります。表11-1に、デシジョン・サービスの.decsファイルの最上位レベル要素を示します。

表11-1 デシジョン・メタデータ・ファイル(.decs)の最上位レベル要素

要素

説明

ruleEngineProvider

business_rule_name.decsファイルのruleEngineProvider要素には、使用するルール・ディクショナリに関する次のような詳細が含まれています。

<ruleEngineProvider name="OracleRulesSDK" provider="Oracle_11.0.0.0.0">
<repository type="SCA-Archive">
<path>AutoLoanComposite/oracle/rules/AutoLoanRules.rules</path>
</repository>
</ruleEngineProvider>

デシジョン・コンポーネントの場合、リポジトリ・タイプはSCA-Archiveに設定されます。これは、ルール・ディクショナリがサービス・コンポーネント・アーキテクチャのアーカイブにあることを示します。パスは相対で、解釈は次のように異なります。

- デザインタイム - パスはOramds:/で始まります。ルール・ディクショナリはメタデータ・サービス(MDS) APIによりオープンされます。したがって、ディクショナリへのフルパスは次のようになります。

Oramds:/AutoLoanComposite/oracle/rules/AutoLoanRules.rules

- ランタイム(ビジネス・ルール・サービス・エンジン) - ビジネス・ルール・サービス・エンジンでは、Oracle Business Rules SDKのRuleRepository APIを使用してMDS内に置かれたルール・ディクショナリがオープンされます。たとえば、パスからコンポジット名接頭辞(AutoLoanComposite)が削除され、メタデータ・マネージャではoracle/rules/AutoLoanRules.rulesがコンポジット・ホーム・ディレクトリへの相対パスにあるものとみなされます。

decisionService

デシジョン・サービスは、ビジネス・ルールのWebサービス(SOA)イネーブラです。Webサービスという意味ではサービスであるため、サービス指向アーキテクチャ(SOA)にビジネス・ルールをもたらします。12c (12.2.1)では、デシジョン・サービスはサービスのメタデータおよびWSDL規定で構成されます。

business_rule_name.decsファイルのdecisionService要素では、Webサービスとして公開されるビジネス・ルールを記述するメタデータを定義します。

通常、デシジョン・サービスには、次の要素が含まれています。

- ターゲット・ネームスペース

- バックエンドOracle Rules Engineへの参照(ルール・ディクショナリへのリンクです)。OracleRulesSDKがruleEngineProvider要素に示したOracle Rules Engineプロバイダの名称と一致する参照名であることに注意してください。

- 名称(次の例ではCreditRatingService)。

- 使用するディクショナリ名およびルールセットに関する追加情報。

- サポート対象の操作(パターン)のリスト。

操作(パターン)とは別に、操作のパラメータ型(ファクト・タイプ)が指定されています(後で実行時に検証されます)。したがって、各デシジョン・サービスでは強い型指定を持つ規定が公開されます。

- SCAコンポーネント・タイプ(.componentType)ファイル
SCAのbusiness_rule_name.componentTypeファイルは、各デシジョン・コンポーネントとともに組み込まれています。このファイルには、ビジネス・ルール・サービス・コンポーネントにより公開されるサービスがリストされます。次の例では、2つのサービスCreditRatingServiceおよびLoanAdvisorServiceが公開されています。

<?xml version="1.0" encoding="UTF-8" ?>
<!-- Generated by Oracle SOA Modeler version 1.0 at [5/24/07 9:27 AM]. -->
<componentType xmlns="http://xmlns.oracle.com/sca/1.0">
<service name="CreditRatingService">
<interface.wsdl
interface="http://xmlns.oracle.com/creditrating/Rating#wsdl.interface(IDecisionSer
vice)"/>
</service>
<service name="LoanAdvisorService">
<interface.wsdl
interface="http://xmlns.oracle.com/loanoffer/Advisor#wsdl.interface(IDecisionServi
ce)"/>
</service>
</componentType>

- composite.xml内のデシジョン・コンポーネント・エントリ
デシジョン・コンポーネントに対してcomposite.xml内にエントリが作成されます。次に例を示します。

<component name="OracleRules1">
<implementation.decision src="OracleRules1.decs"/>
</component>

ビジネス・ルール・サービス・エンジンでは、サービス・エンジンに対するリクエストを処理するためにこの実装タイプからの情報が使用されます。SCAの視点からは、デシジョン・コンポーネントは新しい実装タイプです。

11.2.2 デシジョン関数を公開するデシジョン・コンポーネントの使用

デシジョン・サービスを使用すると、Oracle Business Rulesデシジョン関数をサービスとして公開できます。デシジョン関数は、Java EEアプリケーションまたは別のコンポーネントからルールをコールするために使用する関数です。

次のコード例に、サービスとして公開されるOracle Business Rulesデシジョン関数のメタデータを定義する、business_rule_name.decsファイルのdecisionServices要素を示します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<decisionServices xmlns="http://xmlns.oracle.com/bpel/rules" name="PurchaseItems">
<ruleEngineProvider name="OracleRulesSDK" provider="Oracle_11.0.0.0.0">
<repository type="SCA-Archive">
<path>PurchasingSampleProject/oracle/rules/com/example/PurchaseItems.rules</path>
</repository>
</ruleEngineProvider>
<decisionService targetNamespace="http://xmlns.oracle.com/PurchaseItems/PurchaseItems_DecisionService_ValidatePurchasesDF"
ruleEngineProviderReference="OracleRulesSDK" name="PurchaseItems_DecisionService_ValidatePurchasesDF">
<catalog>PurchaseItems</catalog>
<pattern name="CallFunctionStateless">
<arguments>
<call>com.example.PurchaseItems.ValidatePurchasesDF</call>
</arguments>
</pattern>
<pattern name="CallFunctionStateful">
<arguments>
<call>com.example.PurchaseItems.ValidatePurchasesDF</call>
</arguments>
</pattern>
</decisionService>
</decisionServices>

この場合、デシジョン関数ValidatePurchasesDF自体は、PurchaseItems.rulesファイルで全体が指定されています。

詳細は、デシジョン関数の使用を参照してください。

11.2.3 デシジョン・コンポーネントとのステートフルな相互作用の使用

ステートフルなデシジョン・サービスを提供するには、デシジョン関数を作成し、そのデシジョン関数をステートレスでないように指定します。そのためには、デシジョン関数の「ステートレス」チェック・ボックスの選択を解除します。

デシジョン・コンポーネントとのステートフルな相互作用については、次の詳細に注意してください(図11-2も参照)。

- キャッシュからのルール・セッションおよびプールからのルール・セッションは相互排他です。

- ルール・セッション・プールは、単純でステートレスな相互作用専用です。

- ルール・セッション・キャッシュでは、デシジョン・サービス・リクエスト間でルール・セッションの状態が維持されます。

11.2.4 デシジョン・コンポーネントとのステートフルな相互作用に関する必知事項

ビジネス・ルール・サービス・エンジンで実行されるデシジョン・コンポーネントでは、ステートフルな操作とステートレスな操作のいずれかがサポートされます。「ビジネス・ルールの作成」ダイアログの「セッションのリセット」(ステートレス)チェック・ボックスを使用して、これら2つの操作モードを切り替えることができます。

「セッションのリセット」チェック・ボックスを選択すると、ステートレスな操作が指定されます。

「セッションのリセット」(ステートレス)チェック・ボックスの選択が解除されている場合、基礎となるOracle Business Rulesオブジェクトは、(操作の終了時にルール・セッション・プールに戻されないように)別の場所にあるビジネス・ルール・サービス・エンジンのメモリー内に保持されます。このオプションが必要な場合にのみステートフルな操作を使用してください(ステートフルな操作を使用すると実行時にエラーが発生する場合があり、そのエラーによってサービス・エンジンのメモリーが大量に使用される場合があります)。

「セッションのリセット」(ステートレス)チェック・ボックスの選択が解除されている場合、デシジョン・コンポーネントがその後使用されると、キャッシュされたRuleSessionオブジェクトはcallFunctionStatefulの起動以降のすべての状態情報とともに再利用され、callFunctionStateless操作の終了後、解放されてルール・セッション・プールに戻されます。

11.3 デシジョン・サービスのアーキテクチャ

デシジョン・サービスは、サービスの記述のみで構成されます。その他のすべてのアーティファクトは、デシジョン・コンポーネント内で共有されます。

図11-1にこれを示します。

図11-1 デシジョン・サービスのアーキテクチャ

ランタイムの中心部分は、ツリー構造で編成されたデシジョン・サービス・キャッシュです。各デシジョン・コンポーネントは、そのキャッシュのサブツリーを(コンポジット識別名(DN)、コンポーネントおよびサービス名に応じて)所有します。この点では、デシジョン・コンポーネントのデシジョン・サービスは次のデータを共有していることになります。

- デシジョン・コンポーネントのメタデータ

- ファクト・タイプのメタデータ。

- 関数のメタデータ。

- ルールセットのメタデータ。

- ルール・セッション・プール

- デシジョン・コンポーネントごとにルール・セッション・プールが1つ作成されます。

- プール内のルール・セッションは、データ・モデルのOracle RLおよび実行済のルールセットのOracle RLを使用して事前に初期化されます。

- 必要に応じて新規のルール・セッションが作成されます。

- ルール・セッションは再利用でき、その回数は構成可能です。

- ルール・セッション・プールの初期サイズは構成可能です。

- ステートフルなルール・セッション・キャッシュ

- ステートフルなルール・セッションの場合は、特別なキャッシュがメンテナンスされます。
詳細は、「デシジョン・コンポーネントとのステートフルな相互作用の使用」を参照してください。

- デプロイメント・アーティファクト

- デシジョン・コンポーネントのデプロイメントにより、最終的にJAXBファクト・タイプのクラスを生成できます。これらのクラスはコンポジット間で共有できます。

図11-2に、デシジョン・サービス・リクエスト中の、ステートレスなルール・セッションおよびステートフルなルール・セッションとルール・セッション・プールの相互作用、およびステートフルなルール・セッションとステートフルなルール・セッション・キャッシュの相互作用を示します。

図11-2 デシジョン・サービス・リクエストに対するステートレスおよびステートフルなルール・セッションの使用方法

12 実行時のOracle Business RulesとのOracle SOAコンポーザの使用方法

この章では、Oracle SOAコンポーザ・アプリケーションを使用して、SOAコンポジット・アプリケーションの一部である、デプロイされたディクショナリおよびタスクを使用する方法について説明します。

この章の内容は以下のとおりです。

- Oracle SOAコンポーザの概要

- アクセシビリティ・オプションの設定

- Oracle Business Rulesディクショナリのオープンおよび表示

- ディクショナリの編集のスタート・ガイド

- Oracle Business Rulesディクショナリでのルールの編集

- Oracle SOAコンポーザのブラウザ・ウィンドウの使用

- Oracle Business Rulesディクショナリのデシジョン表の編集

- Oracle Business Rulesディクショナリの比較およびマージ

- Oracle Business Rulesのリソース名のローカライズ

- Oracle JDeveloperのルール・ディクショナリと実行時のディクショナリの更新の同期

- Oracle Business Rulesディクショナリの検証と診断

- タスクの操作

12.1 Oracle SOAコンポーザの概要

Oracle SOAコンポーザはWebベースのアプリケーションで、Oracle Business Rulesのディクショナリやタスクをデプロイされたアプリケーションで使用可能にします。Oracle SOAコンポーザは、MDSリポジトリ内のディクショナリまたはタスクにアクセスします。

Oracle SOAコンポーザは、DVMドキュメント、SOAコンポジット、Oracle Business Rulesディクショナリなど様々なタイプのメタデータ・アーティファクトの表示および編集をサポートします。図12-1に示すように、「タイプ・ビュー」または「デプロイメント・ビュー」によって様々なタイプのメタデータを表示できます。

「デプロイメント・ビュー」がデフォルトです。「タイプ・ビュー」を選択して、タイプ(「ビジネス・ルール」、「ドメイン値マップ」、「ヒューマン・タスク」または「SOAコンポジット」)別にリストされたアーティファクトを表示します。

図12-1 Oracle SOAコンポーザの「タイプ・ビュー」

「デプロイメント・ビュー」には、SOA-InfraとSharedの2つのノードがあります。デフォルト・ノードは、Enterprise Managerで作成および管理されるSOAパーティションです。Sharedフォルダには、JDeveloperで作成されて共有アーティファクトとしてデプロイされるルールまたはDVMが表示されます。

どちらのビューでも、ナビゲーション・ツリーでアーティファクトをクリックすると、それらが別のタブで開きます。

SOAコンポーザでは、BPMをインストールしていない場合は「動詞ルール」および「ビジネス・フレーズ」機能は表示されません。

「表示」ドロップダウンの上にある検索フィールドを使用して、図12-2に示すように、名前でタイプをすばやく検索し、フィルタリングします。このページからアーティファクトを開くにはクリックします。

図12-2 検索とフィルタ

12.1.1 セッションの作成とパブリッシュ

アーティファクトをクリックして読取り専用モードで開きます。アーティファクトに変更を行う予定である場合は、「セッションの編集」ボタンをクリックします。大部分のセッション・ボタンは、セッション内である場合にのみアクティブになります。変更が完了したら、「パブリッシュ」をクリックします。セッション内のすべての変更はメイン・リポジトリにコミットされ、他の人が表示できるようになり、サーバーによって実行が開始されます。検証エラーがある場合はパブリッシュできませんが、検証エラーのあるルールを保存して別のセッションで再びそれらの作業を行えます。

「破棄」ボタンで、保存する必要がない変更を取り消すことができます。セッション内でいくつか変更を行った後に、開始したときの元の状態に戻す必要がある場合は、「セッションの終了」をクリックします。「セッションの編集」を再度クリックすると、最後に保存したセッション情報が表示されます。

次のアイコンおよびボタンで、追加の情報が表示されます。

表12-1 SOAコンポーザのボタン

ボタン

説明

セッション情報

このアイコンの上にカーソルを移動すると、「セッションの詳細」が表示されます。

最大化

クリックすると、タブ・セクションが最大化します。これにより、ルールを記述または編集する際に画面領域が広くなります。再度クリックすると、ビューが元のサイズに戻ります。

検証

クリックして、変更内容を検証します。保存するときにシステムによって検証され、検証エラーのあるルールを保存できますが、パブリッシュはできません。検証の詳細は、「Oracle Business Rulesディクショナリの検証と診断」を参照してください。

ブックマーク

今後のセッションで検索/デプロイメント・ビューを回避する場合はブックマークをクリックします。詳細は、「ブックマークの作成」を参照してください。

「現在のタブでの変更を保存」または「すべてのタブでの変更を保存」

必要に応じてクリックして保存します。

状況依存ヘルプを開く

クリックすると、オンライン・ヘルプ・ファイルが表示されます。

「すべて閉じる」、「その他を閉じる」

ドロップダウンをクリックして選択し、タブを閉じます。

「アクション」ドロップダウンによって、ディクショナリの比較およびマージ、Microsoft Excelでのデシジョン表の使用、およびディクショナリ設定の確認を行えます。

「差異のマージ」によって、「ファイルシステム」、「公開済のバージョン」、または「保存済バージョン」と現在選択されているディクショナリを比較できます。差異がある場合、ディクショナリのマージを選択できます。

ディクショナリの比較またはマージの詳細は、「Oracle Business Rulesディクショナリの比較およびマージ」を参照してください。

「Excelからインポート」によって、Excelからデシジョン表をインポートできます。

「Excelにエクスポート」によって、デシジョン表をエクスポートしExcelで編集できます。

Excelの使用方法の詳細は、「Microsoft Excelでのデシジョン表の編集」を参照してください。

「ディクショナリ設定」によって、ディクショナリ・プリファレンスを設定できます。

ディクショナリ設定の確認の詳細は、「ディクショナリ設定の確認」を参照してください。

「診断」、「履歴センター」、「ログの保存」、「検証ログ」

「SOAコンポーザ」ページの下部には、「診断」、「履歴センター」、「ログの保存」および「検証ログ」の4つのタブがあります。これらのタブを使用して、ルールに対する変更を検証し、アーティファクトに対する変更を実行および解決します。

これらのタブの詳細は、「Oracle Business Rulesディクショナリの検証と診断」を参照してください。

12.1.1.1 Oracle Business Rulesディクショナリの変更のパブリッシュ

ディクショナリの変更を検証した後は、「パブリッシュ」をクリックして、MDSリポジトリに対してそれらの変更をコミットします。

Oracle Business Rulesディクショナリに変更をパブリッシュする手順は、次のとおりです。

1. 「パブリッシュ」メニュー項目をクリックします。

2. MDSリポジトリに変更を加える場合は、「確認」ダイアログで「はい」をクリックします。MDSリポジトリに変更を加えない場合は、「いいえ」をクリックします。

「リポジトリからJDeveloperへの実行時のルール変更のインポート」で説明されている作業に従い、実行時の変更をルール・エディタADFに忘れずに反映してください。

3. 編集セッションを保存して、コンポジットをデプロイした後にディクショナリを開くと、最後に保存された編集セッションが開きます。

複数ユーザーが同じディクショナリを編集している場合は、ディクショナリが別のユーザーにより編集されているというメッセージが表示され、確認を求められます。複数のユーザーが1つのディクショナリで作業した場合、最後のパブリッシュのみ持続します。

新しいディクショナリを開くには、トップ・メニューの「破棄」、「すべてのセッション編集と保存された変更をクリアします。」ボタンをクリックします。

注意:

検証エラーのあるディクショナリが保存される可能性がありますが、検証の問題の修正後でなければコミットされません。

12.1.1.2 ブックマークの作成

検索またはデプロイメント・ビューを回避するにはブックマークを作成します。

既知のURLを使用してディクショナリを開く手順は次のとおりです。

1. 開いているディクショナリで、Oracle SOAコンポーザのツールバーの「ブックマーク」をクリックします。

2. URLをコピーし、ブラウザ内に貼り付けると、ブックマークされたアーティファクトがタブに開いた状態でSOAコンポーザが起動されます。

図12-3 開いているディクショナリのURLの取得

3. ブラウザで、保存したURLを使用してディクショナリに直接アクセスします。

次に例を示します。

http://SERVER_NAME_OR_IP_ADDRESS/soa/composer?docPath=/deployed-composites/ default/BusinessRulesTest_rev1.0/oracle/rules/businessrulestest/OrderBooking.rules

前述の例では、コンポジットは次の構造に従って格納されています。deployed-composites/コンポジット名_revコンポジットのリビジョン/oracle/rules/ディクショナリ・パッケージのパス/ディクショナリ名.rules

12.1.1.3 ディクショナリ設定の確認

「ディクショナリ設定」ボタンをクリックして、プリファレンスを設定します。

図12-4 「ディクショナリ設定」ダイアログ

表12-2 ディクショナリ設定

ダイアログのセクション

設定

「実行」セクション

ルール実行アルゴリズム: 「RETE」または「非RETE」を選択します。詳細は、第1.3項「Oracle Business Rules Engineのアーキテクチャ」を参照してください。「Reteアルゴリズム」および「非Reteアルゴリズム」

「選択肢」セクション

フレーズ提案: 「ビジネス・フレーズ」、「自動提案」または「すべて」を選択します。

「データ・モデル」セクション

グローバル修飾子パターン: {member} of {fact}を確認します。

変換: クリックして、{member} of {fact}を変換します。

検証: クリックして{member} of {fact}を検証します。

12.1.2 Oracle SOAコンポーザのユーザー認証の使用

図12-5に、Oracle SOAコンポーザのログイン・ページを示します。このページは、Oracle SOAコンポーザによる指定されたユーザーの認証を可能にします。

図12-5 Oracle SOAコンポーザのログイン・ページ

Oracle SOAコンポーザにログインする手順は次のとおりです。

1. ブラウザのアドレス・バーで、次のURLを使用してOracle SOAコンポーザにアクセスします。

http://サーバー名またはIPアドレス/soa/composer

2. Oracle SOAコンポーザのログイン・ページの、「ユーザー名」フィールドで、ユーザー名を入力します。

3. 「パスワード」フィールドに、パスワードを入力します。

4. 「サインイン」をクリックします。

ユーザーとグループの作成および管理の詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプを参照してください。

12.1.3 SOAコンポーザのアクセス制御およびユーザー認証に関する必知事項

Oracle SOAコンポーザはユーザーとパスワードによるアクセス制御をサポートしており、認証されたユーザーのみがOracle SOAコンポーザを使用できます。ただし、Oracle SOAコンポーザでは、さらに粒度の高いアクセス制御は用意されていません。たとえば、Oracle SOAコンポーザでは個別のルールセットやディクショナリ内のルールに対するアクセス制御はサポートされていません。

Oracle SOAコンポーザでは、メタデータに対するアクセス制御はサポートされています。Oracle SOAコンポーザを使用する際は、SOADesignerアプリケーション・ロールを持つユーザーのみがOracle SOAコンポーザのメタデータにアクセスできます。デフォルトでは、WLS管理者権限を付与されたすべてのユーザーがこのロールを持っています。

SOADesignerロールを持たないユーザーがOracle SOAコンポーザにログインすると、ユーザーにはSOAメタデータを変更する権限がないことを示すメッセージが表示されます。

Oracle SOAコンポーザへのアクセスが必要な、非管理者ユーザーに対するSOADesignerロールの割当ての詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』のOracle Enterprise Manager Fusion Middleware Controlコンソールでのアプリケーション・ロールの管理に関する項を参照してください。

12.2 アクセシビリティ・オプションの設定

アクセシビリティの設定は、アプリケーションのすべてのコンポーネントの読取りに役立ちます。

SOAコンポーザのアクセシビリティ・オプションは、現在のインスタンスまたはすべてのインスタンスに対して設定できます。

12.2.1 ログイン前にアクセシビリティ機能を設定する方法

SOAコンポーザでは、ログイン・ページに「アクセシビリティ」メニューが用意されており、ログインする前にアクセシビリティを構成できます。この設定は、現在のセッションのみまたはすべてのセッションで保持できます。

現在のセッションにのみアクセシビリティ・オプションを設定する手順は次のとおりです。

1. SOAコンポーザを起動します。

2. ログイン・ページで、右上隅の「アクセシビリティ」をクリックします。

図12-6に示すように「アクセシビリティ設定の編集」ページが表示されます。

図12-6 「アクセシビリティ設定の編集」ページ

3. 次のオプションを選択します。

- スクリーン・リーダーの使用

- 高コントラスト色の使用。

- 大きいフォントの使用

4. このセッションに対してのみ新しい設定を保存するには、「このセッションで使用」をクリックします。すべてのセッションに対して設定を保存するには、「プリファレンスとして保存して使用」をクリックします。

12.2.2 ログイン後にアクセシビリティ・オプションを設定する方法

SOAコンポーザにログインした後は、どのページからでもアクセシビリティ・オプションを構成できます。これにより、ユーザー・プリファレンスが変更されます。これらは再度変更されるまで、すべてのセッションで保持されます。

ログイン後にアクセシビリティ・オプションを設定するには、次の手順を実行します。

1. SOAコンポーザを起動し、ログインします。

2. 任意のページから、右上隅の「プリファレンス」を選択します。

「Preferences」ダイアログが表示されます。

3. 「プリファレンス」列で、「アクセシビリティ」をクリックします。

図12-7に示すように、「アクセシビリティ・プリファレンス」が表示されます。

図12-7 「プリファレンス」ダイアログ

4. スクリーン・リーダーを使用する場合は、「モード設定」フィールドで、「スクリーン・リーダー・モードの有効化」を選択します。スクリーン・リーダーを使用しない場合、「スクリーン・リーダー・モードの無効化」を選択します。

5. 「コントラスト設定」フィールドで、コンソール上のオブジェクト間のコントラストを強めるには、「高コントラストの使用」を選択し、そのようにしない場合は「通常のコントラストの使用」を選択します。

6. 「フォント設定」フィールドで、フォント・サイズを大きくする場合は「大きいフォントの使用」を選択し、それ以外の場合は「通常フォントの使用」を選択します。

7. 「OK」をクリックします。

12.3 Oracle Business Rulesディクショナリのオープンおよび表示

Oracle SOAコンポーザを開くとMDSに接続し、ディクショナリが含まれている使用可能なコンポジット・アプリケーションが表示されます。その他に、共有ディクショナリがリストされますが、これらの共有ディクショナリも表示および編集が可能です。

図12-8に示すように、Oracle SOAコンポーザでは、左側のパネルにメタデータ・アーティファクトのリストを示すナビゲーション・ツリーが表示されます。選択された項目の詳細は、右側に表示されます。Oracle SOAコンポーザには、次のタブが含まれます。

- ルールセット

- 値セット

- グローバル

- ビジネス・フレーズ

- テスト

- エクスプローラ

- ファクト

- デシジョン関数

- リンク

- 変換

図12-8 「ルール」タブ

注意:

SOAコンポーザでは、BPMをインストールしていない場合は「動詞ルール」および「ビジネス・フレーズ」機能は表示されません。

12.3.1 ルールセットを表示および編集する方法

図12-9に示すように、Oracle SOAコンポーザではディクショナリ内のルールセットが表示されます。ルールセットを選択して、ルールセットの詳細を表示できます。ルールセットおよびルールは追加および削除できます。

図12-9 Oracle SOAコンポーザのルール・ディクショナリの「ルールセット」タブを使用したルールの表示

ルールセット・タブを使用する手順は次のとおりです。

フィールドおよび他のUIコントロールの詳細なドキュメントは、SOAコンポーザ内から「ヘルプ」、「このページのヘルプ」をクリックしてください。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 「ルールセット」タブをクリックし、「セッションの作成」ボタンをクリックします。アクション・ボタンが有効化されます。

3. 図12-9に示すように、ClaimRulesの横にある下矢印をクリックし、ルールセットを選択します。そのルールセットが表示され、編集可能になります。ツールバーから、ルールセットを追加または削除することもできます。

4. 「ルール」パネルをクリックし、デシジョン表、動詞ルール、または一般的なルールを追加します。ルールを削除、切り取り、コピー、または貼り付けることもできます。

SOAコンポーザでの動詞ルールの追加の詳細は、「SOAコンポーザでの動詞ルールの追加方法」を参照してください。

5. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

デシジョン表の詳細は、「Oracle Business Rulesディクショナリのデシジョン表の編集」を参照してください。

動詞および一般的なルールの詳細は、「Oracle Business Rulesディクショナリでのルールの編集」を参照してください。

ルールセットの詳細は、「ルールセットとルールの使用」を参照してください。

12.3.1.1 SOAコンポーザでの動詞ルールの追加方法

動詞ルールは、自然言語文を使用してルールを作成し、ドメイン固有の文でルール・ロジックを表す柔軟な方法を提供します。

SOAコンポーザで動詞ルールを追加する手順は次のとおりです。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 「ルールセット」タブをクリックし、「セッションの作成」ボタンをクリックします。アクション・ボタンが有効化されます。

3. ドロップダウン・リストから、ルールセットを選択します。

4. 「ルール」パネルをクリックし、デシジョン表、動詞ルール、または一般的なルールを追加します。
デシジョン表を追加するには、「デシジョン表の追加」を参照してください。

動詞ルールを追加する手順は次のとおりです。

a. 「追加」アイコンをクリックし、リストから「動詞ルール」を選択します。
「動詞ルール」ウィンドウが表示されます。

図12-10 「動詞ルール」ウィンドウ

b. 「If」フィールドで、テストを追加します。完了したら、「Then」フィールドでアクションを追加します。
テストまたはアクションを追加したとき、そのテストまたはアクションは編集可能になることに注意してください。「If」フィールドにフィルタ(たとえば、customer numberなど)を入力すると、すべての関連オプションがドロップダウン・リストに表示されます。

c. 上または下矢印キーを使用して選択し、選択したオプションに対して右矢印キーを使用して類似した選択肢を表示します。
リストにさらに選択肢を表示するには、ドロップダウン・リストの終わりまでスクロールし、キーボードまたはマウスを使用して「詳細」オプションを選択します。

d. リストから、既存のビジネス・フレーズを選択します。または、入力したものに基づいて新しいビジネス・フレーズをインスタンス化できます。
選択肢を設定すると、テキスト・フィールドは編集できなくなり、既存のパラメータがリンクになります。リンクは、クリックすると編集可能になります。値を設定するには、リンクをダブルクリックします。

注意:

動詞ルールのいくつかの重要なキーボードベースのインタフェースは、次のとおりです。

- コピー: [Ctrl]+[C]

- 貼付け: [Ctrl]+[V]

- 切取り: [Ctrl]+[X]

- 行を上に移動: [Ctrl]+[↑]

- 選択項目を上に移動: 上矢印

- 行を下に移動: [Ctrl]+[↓]

- 選択項目を下に移動: 下矢印

- 行の削除: [Ctrl]+[Del]

- 新規行の追加: [Ctrl]+[Enter]

- 行の編集: [Enter]

パラメータ値を設定するための重要なキーボード・ジェスチャーは次のとおりです。

- パラメータ値を指定する際は、行を選択したままにしないようにします。[Enter]によって、選択した行が編集可能になり、パラメータ値の設定を試みる可能性があるためです。

- パラメータ・テキスト・フィールド内で[Esc]ボタンを使用すると、値が設定されずにリンクに戻ります。

- タブを使用したり、キー値を入力しても。フォーカスがあるリンクは編集可能になりません。リンクをアクティブ化するには、マウスを使用するか[Enter]キーを使用する必要があります。

- パラメータ値を設定するには、パラメータ・テキスト・フィールドから[Tab]を使用して移動するか、[Enter]を押します。

5. 完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

一般的なルールを追加するには、「一般的なルールの追加方法」を参照してください。

12.3.2 値セットを表示および編集する方法

ディクショナリを開いて「値セット」タブを選択すると、ディクショナリに値セットが含まれている場合、表にすべての使用可能な値セットが表示されます。リンク先ディクショナリの値セットも表示されます。リンク先の値セットを選択し、「編集」ボタンをクリックすると、値を表示できます。ただし、リンク先の値セットは、編集モードでも編集できません。

Oracle SOAコンポーザの編集モードの詳細は、「ディクショナリの編集のスタート・ガイド」を参照してください。

Oracle SOAコンポーザで値セットを表示する手順は次のとおりです。

フィールドおよび他のUIコントロールの詳細なドキュメントは、SOAコンポーザ内から「ヘルプ」、「このページのヘルプ」をクリックしてください。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 「値セット」タブをクリックし、「セッションの作成」ボタンをクリックします。図12-11に示すように、アクション・ボタンが有効化されます。

3. 「+」をクリックし、「値セット」を選択して、ディクショナリに値セットを追加します。

4. 「+」をクリックし、「範囲値セット」を選択して、範囲値セットを作成します。

図12-11 Oracle SOAコンポーザのルール・ディクショナリの「値セット」タブの使用

5. 「+」をクリックし、表に値を追加します。行内でクリックすると、それを編集可能にすることができます。選択した行は削除したり、上下に移動することもできます。

6. 「名前」、「説明」および「データ型」を変更できないのは、列挙型の値セットに対してのみです。その他の場合、それらは編集可能です。

7. 「許可されない値をテストに含める」は、値リストからクリアされた値がテストに含まれるかどうかを制御します。

8. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.3.3 グローバルを表示および編集する方法

ディクショナリを開くと、「グローバル」タブが表示されます。グローバルは最後にすることもしないこともでき、SOAコンポーザで編集できます。

「値」フィールドでは、式ビルダーを使用して値を設定できます。妥当性をチェックするには、「検証」ボタンをクリックします。

Oracle SOAコンポーザでグローバルを表示する手順は、次のとおりです。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 図12-12に示すように、「グローバル」タブをクリックし、「セッションの作成」ボタンをクリックします。

図12-12 Oracle SOAコンポーザのルール・ディクショナリの「グローバル」タブの使用

3. 「+」をクリックし、グローバルを追加します。「名前」、「説明」および「値」を入力します。

4. ドロップダウンから「値セット」および「タイプ」を選択します。

5. 「最後」チェック・ボックスを選択し、グローバルを実行時に変更できるかどうかを示します。

6. 「定数」チェック・ボックスを選択し、グローバルが定数であるのか変更可能であるのかを示します。

7. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.3.4 ビジネス・フレーズを表示および編集する方法

「ビジネス・フレーズ」タブを使用して、ルール・プロジェクトのビジネス・フレーズを表示および管理できます。

注意:

SOAコンポーザでは、BPMをインストールしていない場合は「動詞ルール」および「ビジネス・フレーズ」機能は表示されません。

ビジネス・フレーズを編集する手順は次のとおりです。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 「ビジネス・フレーズ」タブをクリックし、「セッションの作成」ボタンをクリックします。図12-13に示すように、アクション・ボタンが有効化されます。

図12-13 Oracle SOAコンポーザのルール・ディクショナリの「ビジネス・フレーズ」タブの使用

3. アクション・ボタンをクリックし、追加、切り取り、コピーまたは貼り付けます。
ビジネス・フレーズを追加するには、次の詳細を入力します。

a. 句: フレーズはテストまたはアクションにできます。たとえば、calculate premium as {threshold} of {percentage}などの英語のフレーズにすることができます。「ドラフトの作成」ボタンを選択することで、フレーズをドラフトとしてマークし、後で編集できます。

b. パラメータ: パラメータ表のパラメータを編集、追加または削除できます。パラメータを「句」フィールドにドラッグ・アンド・ドロップできます。「パラメータの挿入」リンクを使用して、パラメータを「句」にドロップすることもできます。

c. マッピング: 「マッピング」セクションを使用して、ビジネス・フレーズを内部テストまたはアクションにマッピングします。

4. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

ビジネス・フレーズの詳細は、「動詞ルールおよびビジネス・フレーズの概要」を参照してください。

12.3.5 テストを表示および編集する方法

ランタイムには、SOAコンポーザを使用してルールのリグレッション・テストを実行できます。これによって、ビジネス・ユーザーは、変更後のルールで既存の機能が変更されるかどうかをすばやくチェックできます。「テスト」タブは、デプロイ済コンポジットがあるか、SOAコンポーザ・セッション内である場合にのみ表示されます。

テストを表示して編集する手順は、次のとおりです。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 「テスト」タブをクリックし、「セッションの作成」ボタンをクリックします。図12-14に示すように、アクション・ボタンが有効化されます。

図12-14 Oracle SOAコンポーザのルール・ディクショナリの「テスト」タブの使用

3. テスト・スイートおよびテスト・テンプレートを作成して実行できます。

実行時のルールのテストと検証の詳細は、「SOAコンポーザでのルールのテスト」を参照してください。

4. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.3.6 エクスプローラを表示する方法

「エクスプローラ」タブを表示する手順は、次のとおりです。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 図12-15に示すように、「エクスプローラ」タブをクリックします。

「エクスプローラ」タブを使用して、データ、その型および説明を表示します。「エクスプローラ」表では変更を行えません。

図12-15 Oracle SOAコンポーザのルール・ディクショナリの「エクスプローラ」タブの使用

12.3.7 ファクトを表示および編集する方法

ファクトを表示して編集する手順は、次のとおりです。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 「ファクト」タブをクリックし、「セッションの作成」ボタンをクリックします。アクション・ボタンが有効化されます。図12-16に示すように、SOAコンポーザではRLファクトのみ作成できます。

図12-16 Oracle SOAコンポーザのルール・ディクショナリの「ファクト」タブの使用

3. ファクトを選択し、「ファクトの編集」ボタンをクリックし、「ファクトの編集」ダイアログを開きます。RLおよびXMLファクトはここで編集できますが、JavaおよびADFBCファクトは読取り専用です。

4. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.3.8 デシジョン関数を表示する方法

Oracle SOAコンポーザでは、現在のディクショナリで使用可能なデシジョン関数を、「デシジョン関数」タブを使用して表示できます。現時点では、セッション内であっても、次のフィールドおよびオプションのみ変更できます。

- 説明

- ルール起動制限

- ルール・フローの確認

- ステートレスにする

- 起動する使用可能なルールセット

デシジョン関数の作成、既存のデシジョン関数の名前の変更、入力または出力の追加または削除は一切できません。

Oracle SOAコンポーザでデシジョン関数名を表示する手順は、次のとおりです。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 「デシジョン関数」タブをクリックします。

3. 図12-17に示すように、「入力」、「初期アクション」、「出力」およびルールセット・デシジョン関数のタブで情報を表示できます。

図12-17 デシジョン関数の表示

12.3.9 リンク先ディクショナリ名を表示する方法

Oracle SOAコンポーザでは、現在のディクショナリのリンク先のディクショナリの名前を、図12-18に示すように「リンク」タブを使用して表示できます。現時点では、セッション内であっても、リンク先のディクショナリ名は表示できますが、ディクショナリにリンクしたりディクショナリへの既存のリンクを削除することはできません。

Oracle SOAコンポーザでリンク先のディクショナリ名を表示する手順は、次のとおりです。

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 図12-18に示すように、「リンク」タブをクリックします。

図12-18 リンク先ディクショナリ名の表示

3. 「接頭辞リンク名」を選択します。

4. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.3.10 Oracle Business Rulesディクショナリでディクショナリ・リンクを使用する方法

Oracle Business Rulesのディクショナリは、他のディクショナリにリンクできます。ディクショナリに定義された完全なデータ・モデルとそのリンク先のディクショナリを結合ディクショナリと呼びます。同一のディクショナリに対して複数のリンクを作成できます。ただし、この場合、最初のリンク以外のすべてのリンクが無視されます。

Oracle SOAコンポーザを使用してディクショナリをリンクすることはできません。ただし、デプロイされたコンポジットにリンクされたディクショナリがすでに存在する場合は、Oracle SOAコンポーザを使用してリンク先ディクショナリ名を表示し、リンク先ディクショナリのグローバル、値セットおよびルールセットをアプリケーション間で利用できます。たとえば、Dict1というディクショナリを含むApp1というアプリケーションがあるとします。Dict1は、Dict2という別のディクショナリにリンクされているとします。Dict1がDict2にリンクされているため、Dict2のオブジェクトをApp1で利用できます。

リンク先ディクショナリ名の表示の詳細は、「リンク先ディクショナリ名を表示する方法」を参照してください。

Oracle SOAコンポーザでは、リンク表の「接頭辞リンク名」チェック・ボックスを使用して、ディクショナリ内のすべての項目(グローバル、値セット、ルールセットなど)の前にリンク先のディクショナリ名を表示するか、または非表示にすることが可能です。チェック・ボックスを選択すると、リンク先ディクショナリのファクトの前にディクショナリ名が付加され、選択を解除するとリンク先ディクショナリのファクトの接頭辞が非表示になります。デフォルトでは、図12-19に示すように、「接頭辞リンク名」チェック・ボックスは選択された状態になっています。

図12-19 「リンク」タブの使用

リンクされたディクショナリの詳細は、「ディクショナリ・リンクに関する必知事項」を参照してください。

12.3.11 変換を表示および編集する方法

「変換」タブには、選択したディクショナリに含まれるフレーズおよび変換された文字列が表示されます。

翻訳表には、現在のロケールおよび以前のロケールでの翻訳済文字列がすべて含まれています。たとえば、現在のロケールは日本語であり、いつくかの翻訳を編集してそれらを保存します。ログアウトしてから、異なるロケール、たとえば英語でログインした場合、翻訳表には、英語と日本語の両方の列が含まれるようになります。

フレーズを翻訳する手順:

1. Oracle SOAコンポーザで、ルール・ファイルを開きます。

2. 図12-20に示すように、「変換」タブをクリックします。

図12-20 Oracle SOAコンポーザの「変換」タブの使用

3. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.4 ディクショナリの編集のスタート・ガイド

ディクショナリを選択して開くと、Oracle SOAコンポーザによってそのディクショナリが読取り専用モードで表示されます。読取り専用モードの各タブで、「セッション」ボタンを使用して変更を行い、それらを作業領域に「保存」します。ディクショナリの実行時バージョンに変更を適用するには、「パブリッシュ」をクリックします。

SOAコンポーザの機能の使用方法の詳細は、「セッションの作成とパブリッシュ」を参照してください。

12.4.1 Oracle SOAコンポーザにおけるローカライズされた数値書式に関する必知事項

Oracle SOAコンポーザでは、ブラウザのロケールに基づき数値書式が変更されます。たとえば、英語(アメリカ)をブラウザ言語としてOracle SOAコンポーザを使用するとします。値として、34533223.2345などの浮動小数点データを入力します。フランス語など、その他の言語でデータを表示する場合は、次の手順を実行する必要があります。

1. ブラウザのロケールを、フランス語に対するインスタンスに合せて変更します。

2. ブラウザの「リフレッシュ」ボタンをクリックして、数値書式の変更を表示します。
フランス語では、この値は34533223,2345と表示されます。

注意:

Oracle SOAコンポーザでグルーピングおよび小数点セパレータを指定すると、ロケール固有の指定がオーバーライドされます。

12.4.2 ルール要素の切取り/コピーおよび貼付けに関する必知事項

あるディクショナリから、値セットまたはルールを切取りまたはコピーし、コンポーザで別のディクショナリを開いて貼り付けることができます。ただし、切取り/コピー/貼付けは、同一セッション内の異なるディクショナリ間で動作します。

切取り/コピーおよび貼付け機能により、最初から新規要素を作成しなくても、既存のルール要素に基づいて新規の要素をすばやく作成できます。

図12-21に示すボタンは切取り、コピーおよび貼付けに便利です。

図12-21 切取り、コピー、貼付けの各ボタン

Oracle SOAコンポーザでは、次のルールの要素を切取り/コピーおよび貼付けできます。

- ルール

- パターン

- 条件

- アクション

- 値セット

次に対しては、切取り/コピー/貼付けはサポートされていません。

- グローバル

- リンク

- 値

- デシジョン関数

注意:

複数の条件またはアクションを選択した場合、「貼付け」ボタンは無効化されます。このボタンは、単独で選択されている条件またはアクションでのみ有効化されます。貼り付ける場合、コピーまたは切り取られたアイテムはリストの最後尾に追加されます。

12.4.3 Oracle Business Rulesディクショナリでグローバルを編集する方法

図12-22に示すように、Oracle SOAコンポーザで、「グローバル」タブを選択すると、ディクショナリ内のグローバルを一覧表示した表が表示されます。グローバルを編集するには、適切な行を選択すると、行全体が編集可能になります。必要に応じて変更を加えます。

図12-22 ディクショナリ内のグローバルのリスト

グローバルを追加するには、最上位にある「グローバルの追加」ボタンをクリックします。新しい空の行が追加されます。「名前」、「説明」、「値」、「値セット」、「タイプ」、「最後」、コンセントに必要な変更を加えます。グローバルの追加の詳細は、「Oracle Business Rulesグローバルの使用」を参照してください。

グローバルを削除するには、行を選択し、「削除」ボタンをクリックします。

12.4.4 Oracle Business Rulesディクショナリで値セットを編集する方法

Oracle SOAコンポーザで、「値セット」タブを選択すると、左側に、ディクショナリ内の値セットを表示するマスター・リストと、値を表示する表が含まれた詳細セクションが表示されます。値セットを編集するには、マスター・リストで該当する値セットをクリックし、詳細セクション内で、変更する値をクリックします。

「追加」ボタンをクリックし、タイプを選択することで、範囲値セットを作成できます。これにより、マスター・リストに新しい値セットが追加されます。範囲値を追加すると、範囲のエンド・ポイントおよびLOVの値がデータ型に基づいて自動的に追加されます。新たに追加された値のエンド・ポイントや値は変更できます。エンド・ポイントまたは値を変更した場合、エイリアスが変更されることに注意してください。

値セットの追加の詳細は、「値セットの使用」および「値セットのビジネス条件との関連付け」を参照してください。

値セットを切り取りまたはコピーするには、行を選択し、「切取り」または「コピー」をクリックします。コピーした値セットを貼り付けるには、「貼付け」をクリックします。

値セットを削除するには、行を選択して「削除」をクリックします。

値セットを編集する手順は次のとおりです。

1. 値セットまたは範囲値セットを編集するには、Oracle SOAコンポーザで「値セット」タブを選択します。これにより、ディクショナリ内の値セットのマスターと詳細の両方のセクションが表示されます。

2. マスター・リストから適切な値セットを選択します。図12-23に示すように、これにより、詳細表が表示されます。

図12-23 値セットの編集

3. 表内の該当するフィールドを編集します。「値の追加」をクリックすると値を追加できます。また、行を選択して「値の削除」をクリックすると値を削除できます。

4. 値セット内の値の順序を変更するには、値を選択し、上または下矢印をクリックして、選択した値を移動します。

値の相対位置は、LOV値セットでのみ変更できます。範囲値セットでは値を並べ替えることはできません。

値の「アクションで許可済」フィールドが選択されている場合のみ、デシジョン表の条件セルのドロップダウンに値セットが表示されます。

5. 「現在のタブでの変更を保存」をクリックして、変更を確認します。

メニュー・バーの「検証」をクリックして、値セットの変更中にディクショナリを検証します。

12.4.5 Oracle Business Rulesディクショナリでデシジョン関数を編集する方法

Oracle SOAコンポーザでは、「デシジョン関数」タブに、ディクショナリで使用可能なデシジョン関数(親と子の両方)をリストした表が表示されます。

次のフィールドおよびオプションのみ変更できます。

- 説明

- ルール起動制限

- ルール・フローの確認

- ステートレスにする

- 初期アクション

- ルールセットおよびデシジョン関数

デシジョン関数を編集する手順は、次のとおりです。

1. デシジョン関数を編集するには、Oracle SOAコンポーザで「デシジョン関数」タブを選択します。これにより、左側にデシジョン関数のマスター・リストが、右側に詳細パネルが表示されます。

2. 左側で適切なデシジョン関数を選択します。図12-24に示すように、「デシジョン関数エディタ」ダイアログ・ボックスが表示されます。

図12-24 デシジョン関数の編集

3. 必要に応じて「説明」フィールドに説明を入力します。

4. 必要な数値を「ルール起動制限」リストで入力します。デフォルトで選択されている値は「無制限」です。ただし、「ルール起動制限」に整数値を入力して[Tab]キーを押すこともできます。新しく指定された値は、「ルール起動制限」リストに追加されます。

5. 適切なデシジョン関数オプションを選択します。

- ルール・フローの確認: このオプションを選択すると、ルール・フローが確認されるよう指定されます。

- ステートレスにする: 選択すると、デシジョン関数がステートレスに指定されます。

次のものは編集できません。

- 「名前」フィールド

- 「入力」タブ

- 「出力」タブ

6. 「初期アクション」タブでは、アサートする前に入力ファクトを変更したり、ルールセット・スタックを変更したり、有効日を設定したり、出力ファクトをアサートしたりするために使用できるアクションを追加できます。これらのアクションは、ルールのかわりに使用したり、ルールを実行するための環境「設定」のために使用できます。入力がアサートされてルールが実行される直前に、初期アクションが必ず実行されます。入力がアサートされる直前に、アクションに対するRLが実行されます。

「初期アクション」タブを使用して、1つのデシジョン関数(DF1)で別のデシジョン関数(DF2)をコールする場合を考えてみます。DF1は、Ruleset1をルールセット・スタックに追加するように構成されています。DF2は、Ruleset2を追加するように構成されています。DF1では、初期アクションを実行する前に、Ruleset1をルールセット・スタックに追加します。次に、DF2がコールされると、Ruleset2も追加されます。つまり、ルールの実行が開始されると、ルールセット・スタックによって、両方のルールセットのルールが起動します。Ruleset2を追加する場合(初期アクションでDF2をコールしているため)、DF1の初期アクションを使用して、DF2をコールする前にルールセット・スタックをクリアし、DF2をコールした後でスタックにRuleset1を追加できます。

assert、call、modifyの範囲の必要なアクションを、if、else、elseif、while、for、if (advanced)、while (advanced)のような条件アクションにも追加できます。

if (高度)およびwhile (高度)構造は、ブール値のみを受け付けます。アクション条件ごとに異なるテスト・フォーム・タイプを追加できます。

注意:

「ルールセットおよびデシジョン関数」タブでデシジョン関数DF1にDF2が含まれている場合は、DF2には初期アクションが含まれていない可能性があります。

7. 「ルールセットおよびデシジョン関数」タブで、左右の矢印ボタンを使用して項目を「使用可能」ボックスから「選択済」ボックスへ移動します。

8. 「選択済」ボックスで項目を選択し、上矢印または下矢印の各ボタンを適宜クリックしてルールセットおよびデシジョン関数を並べ替えます。

9. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

デシジョン関数の詳細は、デシジョン関数の使用を参照してください。

12.4.6 Oracle Business Rulesディクショナリ・エディタの宣言コンポーネントに関する必知事項

Oracle Business Rulesディクショナリ・エディタの宣言コンポーネントを使用して、あらゆるADFベースのWebアプリケーションでのルール・ディクショナリの編集機能を強化できます。Rules SDK2 APIを使用することで、グローバル、値セット、ルールセットなどのビジネス・ルール・メタデータ・アーティファクトを編集できます。

Oracle Business Rulesディクショナリ・エディタの詳細は、Oracle SOA SuiteでのSOAアプリケーションの開発のOracle Business Rulesディクショナリ・エディタの宣言コンポーネントの使用に関する項を参照してください。

12.4.7 Oracle Business Rulesディクショナリ・エディタのタスク・フローに関する必知事項

ルール・ディクショナリ・エディタのタスク・フローは、ルール・ディクショナリ・エディタの宣言コンポーネントを囲むラッパーであり、宣言コンポーネントではなくタスク・フローを必要とするADFベースのWebアプリケーションで使用されます。

Oracle Business Rulesディクショナリ・エディタの詳細は、『Oracle SOA SuiteでのSOAアプリケーションの開発』のOracle Business Rulesディクショナリのタスク・フローの使用に関する項を参照してください。

12.5 Oracle Business Rulesディクショナリでのルールの編集

SOAコンポーザでは、ディクショナリに対するインタフェースが用意されており、ほとんどのディクショナリのコンポーネントを編集できます。ただし、一部のディクショナリのコンポーネントは、設計時にOracle JDeveloperのルール・デザイナ拡張機能を使用する場合のみ作成および編集が可能です。

SOAコンポーザでは、BPMをインストールしていない場合は「動詞ルール」および「ビジネス・フレーズ」機能は表示されません。

12.5.1 「ルールセット」タブの使用方法

図12-25に示すように、「ルールセット」タブでは、現在選択されているビジネス・ルール・ディクショナリの、ルールセットおよび一般的なルール、これらに含まれている動詞ルールおよびデシジョン表を表示および編集できます。

図12-25 Oracle SOAコンポーザを使用したディクショナリ内のルールセットの編集

表12-3 「ルールセット」タブ

ボタン

説明

「ルールセット」ドロップダウン

リストからルールセットをクリックして選択します。

拡張プロパティ・エディタ

クリックして、「拡張プロパティ・エディタ」ポップアップでプロパティを編集します。

ルールセットの追加

クリックしてルールセットを追加します。

ルールセットの削除

クリックしてルールセットを削除します。

「ルール」マスター・リストで、エイリアスを入力し、ルールを検索できます。「クリア」をクリックすると、「エイリアス別検索」フィールドがクリアされます。ルールもソートできます。「昇順ソート」または「降順ソート」矢印をクリックしてIF/THEN詳細パネルをソートします。

表12-4 ルール・マスター・リストのボタン

ボタン

説明

追加

クリックして、新しいデシジョン表、動詞ルール、または一般的なルールを追加します。

削除

クリックして削除します。

「切取り」、「コピー」、「貼付け」

クリックして、切り取り、コピーまたは貼り付けます。

「昇順ソート」または「降順ソート」矢印をクリックしてIF/THEN詳細パネルをソートします。「タイプ別」をクリックし、オプションを選択し、「タイプ」、「名前」、「アクティブ」、「有効期間開始日」、「有効期間終了日」、「優先度」のいずれかのオプションでソートします。

エイリアス別検索

エイリアス名を入力し、エイリアス名でルールを検索します。

クリア

「クリア」をクリックし、検索結果をクリアします。

12.5.2 Oracle Business Rulesディクショナリでルールを編集する方法

Oracle SOAコンポーザを使用すると、ディクショナリ内のルールを編集できます。

Oracle SOAコンポーザを使用してルールを編集する手順は、次のとおりです。

1. Oracle SOAコンポーザで、Oracle Business Rulesディクショナリを開き、「ルールセット」タブをクリックします。

2. ドロップダウンから該当するルールセットを選択し、リストからルールを選択します。詳細パネルにルールが表示されます。

「ルール」ツールバーの「追加」、「削除」、「切取り」、「コピー」および「貼付け」のボタンを使用して、ルールを変更します。

注意:

複数選択した場合、「貼付け」ボタンは無効化されます。このボタンは、単独で選択されている条件またはアクションでのみ有効化されます。貼り付ける場合、コピーまたは切り取られたアイテムはリストの最後尾に追加されます。

3. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.5.3 ルールの追加方法

Oracle SOAコンポーザでは、ルールセットにルールを追加できます。

ルールセットにルールを追加する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、「ルールの追加」をクリックし、デシジョン表、動詞ルール、または一般的なルールを追加します。

3. 「IF」領域で、検索用語を入力して結果を取得し、[→]を押してそれらをさらにフィルタリングし、条件を作成します。

4. ルールのTHEN領域で、「アクションの追加」をクリックして、このルールに必要なアクションを追加します。

5. 完了したら、「現在のタブでの変更を保存」をクリックします。

6. 実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.5.4 ルールの削除方法

Oracle SOAコンポーザでは、ルールセット内のルールを削除できます。

ルールセット内のルールを削除する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルールの詳細」領域で、削除するルールを特定し、「削除」をクリックします。

3. 完了したら、「現在のタブでの変更を保存」をクリックします。

4. 実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.5.5 ルールの詳細設定を表示および編集する方法

Oracle SOAコンポーザでは、ルールセット内のルールに対する詳細設定を編集できます。詳細設定の詳細は、「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

ルールの詳細設定を表示および編集する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、詳細設定を表示または変更するルールを特定します。必要であれば、最初にルールを展開しておきます。

3. ルール名の横にある「拡張プロパティ・エディタ」ボタンをクリックします。図12-26に示すように、これにより、「詳細設定」ダイアログが表示されます。

図12-26 「拡張プロパティ・エディタ」ダイアログ

12.5.6 ルール条件の追加方法

Oracle SOAコンポーザでは、ルールセット内のルールに対する条件を追加できます。ルール内の条件では、ツリー表示が使用されます。条件ツリーの最上部にあるツールバーを使用して、追加、削除、切取り、コピーおよび貼付けを実行します。条件ツリー内で、親ノードを選択し、同様のアクションを実行できます。

条件の使用の詳細は、「ルールの使用」を参照してください。

ルール条件を追加する手順は、次のとおりです。

条件が選択されていない場合、その条件は最後尾に追加されます。条件が選択されている場合、選択されている条件の兄弟が追加されます。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、条件を追加するルールを特定します。

3. 図12-27に示すように、既存のルール条件の隣の下矢印をクリックして、条件の追加で使用可能なオプションのリストを表示します。

図12-27 条件の追加

条件の追加先のルールに既存の条件が含まれていない場合、図12-27に示すように、「テストの追加」下矢印をクリックして、使用可能な条件追加のオプションのリストを表示する必要があります。

条件の追加に使用可能なオプションのいくつかを次に示します。

- 簡易テスト: 簡易テストの条件を追加します。

- 変数: 変数の定義を追加します。変数およびその値は、インラインのビジネス条件定義と表現されることがあります。

- (...): 新しい簡易テストをネストされた小カッコ内に追加します。

- not(...): 新しい簡易テストをNOTでネストされた小カッコ内に追加します。

各ネスト・レベルで、前述のオプションのリストが用意されており、ネストされたブロックで動作するようになっています。

テストの詳細は、「拡張テストの使用方法」を参照してください。

12.5.7 ルール条件の削除方法

Oracle SOAコンポーザでは、ルールセット内のルールに対する条件を削除できます。条件の使用の詳細は、「ルールの使用」を参照してください。

ルール条件を削除する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、条件を削除するルールを特定します。

3. 削除するルール条件の隣の下矢印をクリックし、リストの中から「テストの削除」をクリックします。

ネスト・レベルごとに1つの独立したリストを使用できます。そのため削除操作は、単一の条件または1つのネストされたブロックに対して実行できます。

12.5.8 ルール条件の変更方法

Oracle SOAコンポーザを使用すると、ルール内の条件を編集できます。ネストに対してルール条件を選択することも、条件内の式の値を変更することもできます。条件の使用の詳細は、「ルールの使用」を参照してください。

ルール内の条件を変更する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、条件を変更するルールを特定します。

3. 「IF」領域で、「左の値」式ボタン、演算子のドロップダウン・リスト、「右の値」式ボタンを含む、コントロール、ボタンおよび選択ボックスを使用して条件を変更します。

式ではフィルタリングがサポートされています。たとえば、Employeeと入力すると、値がフィルタされ、Employeeを含む値がドロップダウンに表示されます。マウスまたは矢印キーを使用して値を選択します。

式ビルダー、条件ブラウザ、「日付」ブラウザおよび「右のオペランド」ブラウザを使用して、左右の側の式を編集できます。

値の変更のほか、条件のフォーム・タイプも変更できます。たとえば、簡易テストを変数定義などに変更できます。条件のフォーム・タイプを変更するには、すぐ横のチェック・ボックスを使用して条件を選択し、必要なフォーム・タイプを「選択したテスト」リストから選択します。

12.5.9 ルール・アクションの追加方法

Oracle SOAコンポーザでは、ルールにアクションを追加できます。ルール・アクションの使用の詳細は、「ルールの使用」を参照してください。

ルール・アクションを追加する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、アクションを追加するルールを特定します。

3. 図12-28に示すように、ルールの「THEN」領域で、ルール・アクションの隣の「アクションの追加」をクリックします。

図12-28 ルールセット内のルール・アクション

アクションの追加先のルールに既存のアクションが含まれていない場合、「THEN」領域の「アクションの追加」ボタンをクリックする必要があります。

12.5.10 ルール・アクションを削除する方法

Oracle SOAコンポーザでは、ルール内のアクションを削除できます。ルール・アクションの使用の詳細は、「ルールの使用」を参照してください。

ルール・アクションを削除する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、アクションを削除するルールを特定します。

3. ルールの「THEN」領域で、アクションを選択します。

「アクションの削除」をクリックします。

12.5.11 ルール・アクションを変更する方法

Oracle SOAコンポーザでは、ルール内のアクションを変更できます。ルール・アクションの使用の詳細は、「ルールの使用」を参照してください。

ルール・アクションを変更する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、アクションを変更するルールを特定します。

3. ルールの「THEN」領域で次のことを実行できます。

- 上の「追加」および「削除」ボタンを使用した、アクションの追加および削除。

- アクションを選択し、各矢印ボタンを使用して上下に移動させることができます。

- 上の「切取り」、「コピー」および「貼付け」ボタンを使用した切取り、コピーおよび貼付け。

- ドロップダウン領域の「詳細」リンクをクリックして「ターゲットの選択」ポップアップを起動し、値を選択できます。

- ルール・アクションの横にある「プロパティの編集」ボタンをクリックし、プロパティを変更します。

「プロパティ」ダイアログ・ボックスが表示され、そこでプロパティの詳細を変更できます。

ルールの数値書式の詳細は、「Oracle SOAコンポーザにおけるローカライズされた数値書式に関する必知事項」を参照してください。

12.5.12 拡張モードのルールの使用方法

Oracle SOAコンポーザでは、ルールセット内の拡張モードのルールを使用できます。

注意:

「拡張モード」機能は、下位互換性のためにのみ維持されています。簡易モードで拡張テストを使用し、必要な任意の種類の条件を作成することをお薦めします。

拡張モードで実行できることはすべて、簡易モードで実行できます。拡張モード・ルールは、単に「拡張モード」チェック・ボックスの選択を解除することで同等の簡易モードに変換できます。

詳細は、「拡張テストの使用方法」を参照してください。

拡張モードのルールを表示および変更する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、拡張モードのルールを表示または変更するルールを特定します。

3. 「拡張プロパティ・エディタ」ボタンをクリックし、詳細設定を表示します。詳細設定の表示の詳細は、「ルールの詳細設定を表示および編集する方法」を参照してください。

4. 「拡張モード」チェック・ボックスの選択が解除されている場合は、「拡張モード」チェック・ボックスを選択します。図12-29に示すように、拡張モードのルール・オプションが表示されます。

図12-29 拡張モードのルール・オプションの表示

12.5.12.1 拡張モード・オプションの使用

拡張モードのルール・オプションを使用すると、パターンに条件およびアクションを追加、変更、削除するだけでなく、パターンを作成、変更および削除できます。

拡張モードのルール・オプションを使用すると、次のことが可能です。

- パターン変数の指定および変数のファクト・タイプの選択: 「変数」フィールドに、パターン変数の名前を直接入力できます。図12-30に示すように、「ファクト・タイプ」リストを使用して、変数のファクト・タイプを指定できます。

図12-30 パターン変数およびファクト・タイプの指定

図の例では、CustomerOrderがCustomerOrderファクト・タイプのパターン変数です。

- パターンの追加: 「パターンの追加」ボタンをクリックして、既存のルールに対するパターンを作成します。図12-31は、追加済のパターンを示しています。新しく作成されたパターンは空です。

図12-31 パターンの追加

- パターンの削除: 「パターンの削除」ボタンをクリックし、ルールからパターンを削除します。

- 連結詞の指定: 2つ以上のパターンを、連結詞andまたはorで連結します。連結詞のリンクを使用して、連結詞間の切り替えを行うことができます。

- ネスト・パターンの使用: ネスト・パターンには、その内側にパターンが存在します。これらは中カッコ({})で囲まれています。「パターン演算子」リストの後ろに開き中括弧が続きます。図12-32に示すように、「パターンを括弧で囲む」ボタンをクリックして、ネスト・パターンを作成できます。また、ネストしているパターンを「パターンから括弧を削除する」ボタンをクリックして削除できます。

図12-32 ネストしたパターンの追加および削除

同じパターン・ブロックに別のパターンを追加するだけでなく、開き中括弧の中でパターンを指定してから「テストの追加」の下矢印をクリックして、ネスト・パターンに対して条件を追加できます。

ネスト・パターン・ブロックは、閉じ中括弧で終わります。ネスト・パターンは複数レベル持つことができます。つまり、あるネスト・パターンの内側に、別のネスト・パターンを持つことができます。「ネスト・パターン・ブロックの削除」ボタンをクリックすると、ネスト・パターン・ブロック全体を削除できます。

パターンをネストすると、演算子のリストには、デフォルトの演算子として「(次の各ケース)」が選択された状態で表示されます。その他の項目は「次のケースがある」、「次のケースがない」および「集計」などです。

演算子として「次のケースがある」または「次のケースがない」を選択した場合も、ユーザー・インタフェースは「(次の各ケース)」と同じままです。ただし、「集計」を選択した場合は、ユーザー・インタフェースが変更されます。集計演算子に対しては、必ず「使用可能」フィールドに変数を入力し、「関数」リストから関数を選択してください。「関数」リストには、次のものが表示されます。

- count

- average

- maximum

- minimum

- sum

- collection

count関数を除いたすべての関数では、式が必要です。「選択可能」フィールドに式を指定するか、または「条件ブラウザ」ウィンドウを起動できます。

ルールの拡張モードの「THEN」の部分では、assert、call、modifyからif、else、elseif、while、for、if (advanced)およびwhile (advanced)といった条件付きアクションにおよぶ、あらゆる必要なアクションを追加できます。

12.5.13 拡張テストの使用方法

拡張テストは、複雑なルールを構築する場合に使用する必要があります。拡張テスト、つまり簡易モードは、拡張モード・ルールを置き換えます。

注意:

「拡張モード」機能は、下位互換性のためにのみ維持されています。

拡張モードで実行できることはすべて、簡易モードで実行できるようになりました。UIは、図12-33に示すように、複雑なルールおよびテストをより簡単に作成できるように合理化され、向上しています。

図12-33 拡張テストのリスト

拡張モード・ルールは、「拡張プロパティ・エディタ」の「拡張モード」チェック・ボックスの選択を解除することで同等の簡易モードに変換できます。

拡張テストは、一般的なルール、デシジョン表、およびビジネス・フレーズの定義中にのみ適用できます。それらは、動詞ルールでは表示されません。

元の4つのテスト(表12-5の最初に示す)に加えて、次の新しいフォームがあります。

表12-5 拡張テスト

フォーム

説明

簡易テスト

これは、条件のビルディング・ブロックです。値を、別の値、範囲またはセットと比較します。

例: Emp.salary > 1000

変数

変数を初期化します。

例: age = Duration.years between(Emp.birthdate,RL.date.get current())

ネストされたテスト

包含ブロック内にテストをカプセル化します。

例: (age > 50 or Emp.salary > 50000)

否定されたテスト

テストを否定します。

例: not(age > 50 and Emp.salary > 50000)

次のすべて

次のすべてがtrueです。

例: (age > 50 and Emp.salary > 50000)

次のいずれか...

次のいくつかがtrueです。例:

IF

e is a Emp and  there is no Emp where     Emp.salary < e.salary     <insert test>  <insert test>THEN  assign e.isLowestPaid = true

は

ファクトを定義します。

例: eはEmpです

次のケースがある

このテストにはANDで接続された1つ以上の子テストがあります。

これらの子テストは、少なくとも1つのケースに対してすべてtrueです。1つのケースは、含まれる「は」テストへのファクトのバインディングです。

「は」子孫を持つ必要があります。

例:

There is a case where
e is a Emp and
d is a Dept and
e.salary > 1000000 and
d.name == "Marketing" and
d.employees contains e

次がある <factType1>,...<factTypeN> 条件#*

このテストにはANDで接続されたN個以上の子テストがあります。

非表示の「<factType>は<factType>」が最初のN個の子としてテストします。

これらの子テストは、少なくとも1つのケースに対してすべてtrueです。

表示される子テストがないことも有効です。その場合、「条件」キーワードは抑止されます。

例:

IF
there is a Emp, Dept where
Emp.salary > 1000000 and
Dept.name == "Marketing" and
Dept.employees contains Emp
THEN
call print "there is a highly paid marketer!"
IF
there is a Emp
THEN
call print "somebody works here!"

次のケースがない

このテストにはANDで接続された1つ以上の子テストがあります。

この子テストはどのケースに対してもtrueになりません(含まれている「は」テストへのファクトのバインディングは、他のどのテストも満たしません)。

「は」子孫を持つ必要があります。

次がない <factType1>,...,<factTypeN> 条件

最初のN個の子としての非表示の「<factType>は<factType>」

これらの子テストは、どのケースに対してtrueになりません。

集計

このテストにはANDで接続された0個以上の子テストがあります。

「は」子を持つ必要があります(非表示の可能性あり)。

v is the sum|average|minimum|maximum|count|collection of <expression> where

表示される子テストがない場合、「条件」句は省略されます。

IF
number of employees is the count of Emp
THEN
call print "number of employees: " + number of employees

IF
number of male employees is the count of Emp where
Emp.gender == "M"
THEN
call print "number of male employees: " + number of male employees

前述の両方のルールで、SDKによって、非表示のネストされた「は」テストがEmpに対して作成されることに注意してください。

明示的な「は」を使用することもできます。

IF
number of male employees is the count of e where
e is Emp and
e.gender == "M"
THEN
call print "number of male employees: " + number of male employees

ブール式

ブール式をキャプチャします。

例: isEligible(Emp)

図12-34は、「次のケースがある」フォームの例を示しています。

図12-34 拡張テストの例1

図12-35は、「次のケースがない」フォームの例を示しています。

図12-35 拡張テストの例2

複雑なルールの構築方法の詳細は、「ルール条件の追加方法」を参照してください。

拡張モードの詳細は、「拡張モードのルールの使用方法」を参照してください。

12.5.14 ツリー・モードのルールの使用方法

Oracle SOAコンポーザでは、ルールセット内のツリー・モードのルールを使用できます。ツリー・モードのルールの使用の詳細は、「ツリー・モードのルールの使用」を参照してください。

ツリー・モードのルールを表示および変更する手順は、次のとおりです。

1. セッションの「ルールセット」タブで、対象のルールセットを選択します。

2. 「ルール」領域で、ツリー・モードのルールを表示または変更するルールを特定します。

3. 「拡張プロパティ・エディタ」ボタンを選択し、詳細設定を表示します。

4. 「ツリー・モード」チェック・ボックスの選択が解除されている場合は、「ツリー・モード」チェック・ボックスを選択します。これにより、図12-36の「ルート」領域に示すように、ツリー・モードのルール・オプションが表示されます。

図12-36 ルールのツリー・モード・ルール領域の表示

12.5.15 Oracle Business Rulesエディタの宣言コンポーネントに関する必知事項

Oracle Business Rulesエディタのコンポジット宣言コンポーネントを使用して、あらゆるADFベースのWebアプリケーションでのビジネス・ルールの編集機能を強化できます。Rules SDK2 APIを使用することで、ルールセットで使用可能なビジネス・ルールを編集できます。

Oracle Business Rulesエディタの詳細は、『Oracle SOA SuiteでのSOAアプリケーションの開発』のOracle Business Rulesエディタの宣言コンポーネントの使用に関する項を参照してください。

12.5.16 Oracle Business Rulesディクショナリ・エディタの宣言コンポーネントに関する必知事項

Oracle Business Rulesディクショナリ・エディタは、ADFベースのWebアプリケーションに埋め込むことができるコンポジット宣言コンポーネントです。Rules SDK2 APIを使用することで、グローバル、値セット、ルールセットなどのビジネス・ルール・メタデータ・アーティファクトを編集できます。

Oracle Business Rulesディクショナリ・エディタの詳細は、Oracle SOA SuiteでのSOAアプリケーションの開発のOracle Business Rulesディクショナリ・エディタの宣言コンポーネントの使用に関する項を参照してください。

12.5.17 Oracle Business Rulesディクショナリ・エディタのタスク・フローに関する必知事項

Oracleルール・ディクショナリ・エディタのタスク・フローは、基本的にはルール・ディクショナリ・エディタの宣言コンポーネントを囲むラッパーです。このタスク・フローは、タスク・フローが必要なADFベースのWebアプリケーションで、宣言コンポーネントのかわりに使用されます。

Oracle Business Rulesディクショナリ・エディタのタスク・フローの詳細は、Oracle SOA SuiteでのSOAアプリケーションの開発のOracle Business Rulesディクショナリ・エディタのタスク・フローの使用に関する項を参照してください。

12.6 Oracle SOAコンポーザのブラウザ・ウィンドウの使用

Oracle SOAコンポーザでは、ブラウザ・ウィンドウが用意されており、ルール式、XPATH式、日付式など、様々なタイプの式での作業を支援します。

Oracle SOAコンポーザで用意されている、各タイプのブラウザは次のとおりです。

- 式ビルダー

- 条件ブラウザ

- 「日付」ブラウザ

- 「右のオペランド」ブラウザ

12.6.1 式ビルダー

式ビルダーは、XPATH式、ルール式などといった、様々なタイプの式の作成に使用されます。

式ビルダーには、式を直接入力できるフィールドがあります。また、「変数」、「関数」、「演算子」および「定数」の4つのタブがあります。これらの各タブでは、データがツリー構造で表示されます。「変数」タブでは、ルール・メタデータ内のすべての変数が表示されます。「関数」タブでは、ルール・メタデータ内のすべての関数が表示されます。「演算子」タブでは、+、-、*などといった演算子が表示されます。「定数」タブでは、ルール・メタデータ内に存在するすべての定数が表示されます。タブ間を切り替えてツリー内の項目を選択し、「式に挿入」ボタンをクリックして、選択された項目を「式」フィールドのカーソルのある位置に挿入できます。ツリー内で項目が選択されると、「コンテンツのプレビュー」および「説明」領域に、選択された項目の詳細情報が表示されます。いったん式を作成して「OK」をクリックすると、「式ビルダー」ボタンの左にある使用可能なフィールドに、新しく作成された式が表示されます。

図12-37に、「式ビルダー」ブラウザを示します。

図12-37 「式ビルダー」ブラウザ

12.6.2 条件ブラウザ

条件ブラウザは、フィールドと階層ツリーを持ち、内側に式ビルダーが埋め込まれています。フィールドに式を直接入力するか、ツリーから項目を選択できます。条件ブラウザでは、フィルタ処理がサポートされています。たとえば、customerと入力し始めると、customerと付いた項目でツリーが絞り込まれます。

ツリー内で項目が選択されると、新たに選択されたものが、ただちにフィールドに表示されます。埋め込まれている式ビルダーを使用して、式を作成することもできます。

いったん式ビルダーが起動され、式が作成されると、「条件ブラウザ」フィールドに新しい式が表示されます。いったん式を作成して条件ブラウザの「OK」ボタンをクリックすると、「条件ブラウザ」ボタンの左にあるフィールドに、新しく作成された式が表示されます。

図12-38に、条件ブラウザを示します。

図12-38 条件ブラウザ

12.6.3 「日付」ブラウザ

「日付」ブラウザは、リテラル日付または日付式の選択に使用されます。「日付」ブラウザには、リテラル日付と日付式間を切り替える2つのオプションがあります。一方のオプションが選択されている場合、もう一方は使用不可になります。

次のオプションを選択します。

- 「カレンダ」ポップアップを使用して日付を入力する「リテラル日付」オプション。

- 「日付式」フィールドに直接式を入力するか、条件ブラウザを起動して日付式を選択する「日付式」オプション

図12-39に「日付」ブラウザを示します。

図12-39 「日付」ブラウザ

12.6.4 「右のオペランド」ブラウザ

「右のオペランド」ブラウザは、右の複数の式を選択するため使用されます。オペランドは各行に表示されます。「オペランド」フィールドに式を直接入力するか、「条件ブラウザ」を起動して、式を選択できます。「+」ボタンを使用すると、現在の行の後に行が追加されます。「-」ボタンを使用すると、現在の行が削除されます。これらのボタンは選択された演算子に基づき、使用可能または使用不可になります。たとえば、in演算子では、右の複数の式が使用できます。したがって、この場合、ボタンが有効化されます。

図12-40に、「右のオペランド」ブラウザを示します。

図12-40 「右のオペランド」ブラウザ

注意:

「右のオペランド」ブラウザを使用すると、右側の式に複数の値を入力できます。ただし、「日付」ブラウザを「右のオペランド」ブラウザの外側に置くことはできますが、その場合、入力可能な式は1つのみになります。これらのどちらのブラウザでも、右側の「式」フィールドに値を直接入力することはできません。いったんブラウザを使用して値を入力後に「OK」をクリックすると、ルールのUIに値がカンマ区切りの値として追加されます。

12.7 Oracle Business Rulesディクショナリのデシジョン表の編集

Oracle SOAコンポーザがセッション内の場合、ルールセット内のデシジョン表の編集、追加、削除ができます。

セッションの使用方法の詳細は、「セッションの作成とパブリッシュ」を参照してください。

デシジョン表内のルール、条件またはアクションの説明を編集できます。条件の上にカーソルを移動すると、右矢印を使用して条件を選択します。条件値をクリックすると、ポップアップが表示され、そこで説明を編集できます。

12.7.1 デシジョン表の追加

Oracle SOAコンポーザでは、ルールセットにデシジョン表を追加できます。デシジョン表の使用の詳細は、「デシジョン表の使用の概要」を参照してください。

ルールセットにデシジョン表を追加する手順は、次のとおりです。

1. セッション内で、対象のルールセットを選択します。

2. 図12-41に示すように、「ルールセット」領域で「追加」をクリックしてから「デシジョン表の追加」をクリックします。空のデシジョン表が表示されます。

図12-41 ルールセットへのデシジョン表の追加

12.7.2 デシジョン表への条件行の追加

Oracle SOAコンポーザを使用すると、デシジョン表に条件行を追加できます。

デシジョン表に条件行を追加する手順は、次のとおりです。

1. デシジョン表のツールバーの「追加」ボタンの隣のリストから、「条件の追加」を選択すると、「条件ブラウザ」ウィンドウが表示されるので、そこで条件を指定または選択できます。

選択または指定された条件行と、ヘッダー「R1」の付いた「ルール」列が表に追加されます。「R1」の下のセルには、"?"マーク(図12-42)が付いています。"?"マークは、セルに値がまだ格納されていないことを示しています。

図12-42 新規デシジョン表に追加された新しい条件行

既存の条件行がある表に条件を追加する場合は、空のデシジョン表に条件を追加する場合と同様に、条件の詳細を指定するよう要求されます。いったん詳細が入力されると、指定された条件が最終の条件行として追加されます。新しい行の各「ルール」列の下の条件セルにも、"?"マークが付いています。

図12-43 デシジョン表の最終行として追加された新しい条件行

デシジョン表で使用されるすべての記号の詳細は、「デシジョン表のセルの編集」を参照してください。

2. 指定された条件を編集する場合は、「条件」領域で条件行をクリックしてから、ツールバーの「条件の編集」ボタンをクリックします。「条件ブラウザ」が表示されます。

3. 「条件ブラウザ」でクリックして変数を選択するか、「式ビルダー」ボタンをクリックして式ビルダーを表示し、式を入力します。

式ビルダーを使用すると、式が作成できます。

4. 各条件行には、各セルの値の取得元の値セットが必要です。選択した値に、関連付けられたグローバル値セットがある場合、デフォルトでは、その値セットが条件行に関連付けられています。

値に関連付けられているグローバル値セットがない場合、デシジョン表に条件行を追加した後、既存のグローバル値セットを指定するか、ローカル値リストまたはローカル範囲リストのいずれかの値セットを作成する必要があります。

値セットを条件と関連付けるには、次のいずれかを実行します。

- 「条件」領域で条件を選択し、既存の値セットを「値セットの選択」リストから選択します。

- 「条件」領域で条件を選択し、「ローカルの値リスト」または「ローカルの範囲リスト」のいずれか(適切なもの)を「値セットの選択」リストから選択します。

「値セットの編集」ボタンをクリックすることで、選択した条件について値セットを編集できます。

「値セット・エディタ」が表示されるので、そこで値の追加、編集または削除ができます。ローカル値リスト値セットを編集している場合、その値セット内の値を並べ替えることもできます。

値セットの数値書式の詳細は、「Oracle SOAコンポーザにおけるローカライズされた数値書式に関する必知事項」を参照してください。

5. 必要に応じて手順2から手順5を繰り返し、デシジョン表にさらに条件行を追加します。

条件行の追加の詳細は、「デシジョン表への条件行の追加方法」を参照してください。

12.7.3 デシジョン表へのアクションの追加

Oracle SOAコンポーザでは、デシジョン表にアクションを追加できます。

デシジョン表にアクションを追加する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクションを追加するデシジョン表を選択します。

2. 「追加」ボタンの横にあるリストから「アクションの追加」を選択し、リストから使用可能なアクションを選択します。たとえば、図12-44に示すように、「変更」をクリックします。

図12-44 デシジョン表へのアクションの追加

デシジョン表の使用の表5-1に、使用可能なアクションが記載されています。

3. 「アクション・エディタ」ウィンドウで、アクションの対象を選択してからアクション・セルで値を指定します。

値セットの数値書式の詳細は、「Oracle SOAコンポーザにおけるローカライズされた数値書式に関する必知事項」を参照してください。

デシジョン表へのアクションの追加の詳細は、「デシジョン表へのアクションの追加方法」を参照してください。

12.7.4 デシジョン表へのルールの追加

Oracle SOAコンポーザを使用すると、デシジョン表にルールを追加できます。

デシジョン表にルールを追加する手順は、次のとおりです。

1. セッション内で、対象のルールセットを選択し、ルールを追加するデシジョン表を選択します。

2. 「ルール」マスター・リストで、ルールを追加するデシジョン表を選択します。「追加」ボタンの横の詳細セクションで、「ルールの追加」を選択します。

追加されたルールの新しい列が表示されます。

新しいルールがデシジョン表の先頭のルールとして追加され、その他のルールは値の順序が定義どおりに保たれるように、必要に応じて移動することに注意してください。これは「バケットによるルールの順序付け」がデフォルトで有効になっているためです。これは、デシジョン表でのルールの順序付けが、条件式に関連付けられている値の相対位置によって設定されることを意味します。ルールを追加するときに「バケットによるルールの順序付け」が有効でない場合、新しいルールはデシジョン表の最後のルールとして追加されます。どちらの場合も、新しいルールの列のセルには、セルに値がまだ設定されていないことを示す「?」という記号が表示されます。

表で使用されるすべての記号の詳細は、「デシジョン表のセルの編集」を参照してください。ルールの順序についての詳細は、「デシジョン表でのルールの順序の操作」を参照してください。

3. セルをクリックして、条件セルに値を入力します。

4. 「アクション」行をクリックしてアクション・セルの値を入力します。

注意:

列幅が足りないため、デシジョン表のセルの内容の全体が表示されない場合は、マウス・ポインタを移動してセルに重ねることで内容を表示できます。また、「タブ・セクションを最大化してください」ボタンをクリックすると、ビューが広くなります。

12.7.4.1 デシジョン表のセルの編集

デシジョン表内の各ルールには、「条件」、「競合」および「アクション」の3つのセクションに属するセルが含まれます。

条件セルの使用

表示モードでは、"?"マークの付いた条件セルは、セルに条件値が格納されていないことを示します。セルに2つ以上の値が指定されている場合は、セミコロン区切りの値リストがセルに表示されます。

編集可能モードでは、条件セルに、複数選択リストで指定された条件値が表示されます。新しいルールを編集する場合や条件値が指定されていない場合は、条件セルは空になっています。

「すべて」を選択した場合は、次のように動作します。

- 特定の条件セルをクリックした場合は、セルに"All"と表示されます。

- 特定の条件セルが選択されていない場合は、セルに"-"記号が表示されます。

条件値のリストから、使用可能な任意の値を選択できます。

注意:

条件セルの編集の際に、「バケットによるルールの順序付け」が選択されている場合、デシジョン表がリフレッシュされ、編集されたルール列が選択された条件セルの値により左または右へ移動します。「ツール」ドロップダウンをクリックし、「バケットによるルールの順序付け」を選択します。

注意:

条件と関連付けられた値セットは、条件をクリックすると変更できます。これにより、値セット・リストおよび「値セットの編集」ボタンが有効化され、関連する値セットを編集できるようになります。

アクション・セルの使用

アクションを追加する際は、指定されたアクション・タイプのアクション行が作成されます。アクション・セルには、次の2つのタイプがあります。

- 「アクション・フォーム」セル。チェック・ボックスを含みます。ルールの起動の際に、選択されたアクションのみが実行されます。図12-45で、R1およびR3アクション・チェック・ボックスが選択されており、その他のアクション・チェック・ボックスの選択は解除されています。この場合、「R1」が起動するとアクションが実行されますが、「R2」が起動してもアクションは実行されません。

注意:

「アクションの編集」ボタンは、「アクション・フォーム」セルの行が選択されている場合のみ、使用可能になります。「アクションの編集」ボタンを使用すると、「アクション・エディタ」ウィンドウが起動します。

- 「アクション・パラメータ」セル。「アクション・フォーム」のパラメータが含まれます。各フィールドにアクション・パラメータ値を直接入力するか、「条件ブラウザ」ウィンドウを起動して値を選択できます。

図12-45に、「アクション・パラメータ」セルの値を選択できる、「アクション・エディタ」ウィンドウを示します。「常に選択」チェック・ボックスを選択した場合、その特定のアクション・フォームのすべてのチェック・ボックスが選択されます。指定されたアクションが常に選択のため、アクション・フォームに属するすべてのチェック・ボックスも使用不可になります。

図12-45 「アクション・エディタ」ウィンドウ

注意:

デシジョン表のすべての条件セルおよびすべてのアクション・セルは一括で削除できます。「条件」または「アクション」の各ボックスをクリックすると、デシジョン表のすべての条件またはアクションがそれぞれ選択されます。

その後、デシジョン表のツールバーにある「削除」ボタンをクリックすると、条件またはアクションを削除できます。

12.7.4.2 デシジョン表でのルールの順序の操作

デシジョン表の「バケットによるルールの順序付け」チェック・ボックスは、デフォルトで有効になっています。つまり、条件行に関連付けられている値セット内の値の順序によって条件セルの順序が決まり、それに従いルールの順序も決まります。「ツール」ドロップダウンをクリックし、「バケットによるルールの順序付け」を選択します。

デシジョン表のルールの順序を変更するには、値セット内の値の順序を変更する必要があります。たとえば、デシジョン表でのルールの順序付けは、条件行に関連付けられているLOV値セット内の値の相対位置を変更することで操作できます。ただし、範囲値セットは並べ替えできないことに注意してください。

デシジョン表で「バケットによるルールの順序付け」チェック・ボックスが選択されている状態でルールを追加すると、デフォルトで新しいルールが先頭のルール列として追加されます。つまり、その他のルール列は、値セット値の順序が定義どおりに保たれるように、必要に応じて移動します。「バケットによるルールの順序付け」チェック・ボックスが無効な状態でルールを追加すると、新しいルールが最後のルール列として追加されます。「バケットによるルールの順序付け」チェック・ボックスをこれから選択すると、新しく追加されたルールが最初の列に移動します。

12.7.5 デシジョン表でのルールの削除

デシジョン表では、1つまたは複数のルールの削除が可能です。

デシジョン表のルールを削除する手順は、次のとおりです。

1. 削除する「ルール」列を選択します。

複数のルールを削除する場合は、[Ctrl]キーを押し、キーを押したまま、その他の「ルール」列を選択します。

2. 「削除」ボタンをクリックします。

12.7.6 デシジョン表でのテストの定義

Oracle SOAコンポーザでは、ファクトに条件を追加することでデシジョン表にテストを定義できます。テストの定義とルール条件の使用方法の詳細は、「ルールの使用」を参照してください。

注意:

ファクトに複雑な条件を追加するには、「拡張テストの使用方法」を参照してください。

デシジョン表にテストを追加する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、テストを追加するデシジョン表を選択します。

2. デシジョン表名の横にある「拡張プロパティ・エディタ」ボタンをクリックします。「拡張モード」が選択されている場合は、そのチェック・ボックスの選択を解除します。

3. デシジョン表名の下にある「クリックして、テストと変数を表示します」リンクをクリックします。

4. 「追加」ボタンの横にある下矢印をクリックし、必要に応じてオプションを選択します。

5. フィールドのコントロールまたは「左の値」および「右の値」ボタン、また「演算子」リストを使用して、条件式を作成します。

注意:

デシジョン表にテスト条件がすでに含まれている場合は、既存の条件の端にある「追加」をクリックし、必要なテストのフォーム・タイプを選択して新しいテスト条件を追加できます。

12.7.7 デシジョン表の分割および圧縮

デシジョン表の内容を変更して、すべてのケースに関する完全なルールセットを含む表の作成、または複数のケースに関して最小数のルールを提供する表を作成できます。分割操作と圧縮操作によって、デシジョン表の内容を操作できます。

表分割操作では、条件間で値の組合せごとにルールが作成されます。たとえば、2つのブール条件を持つデシジョン表には、2 x 2 = 4 のルールが作成されます。20のブール条件を持つデシジョン表では、2**20から100万のルールが作成されます。したがって、作成されるルールの数が少なく、アクション・セルに十分に収まる場合は、表分割を使用するのが適切です。

Oracle SOAコンポーザを使用すると、デシジョン表全体に分割を適用できます。ただし、分割操作を個々の条件行または条件セルに対して実行することはできません。

デシジョン表を分割または圧縮する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、分割または圧縮するデシジョン表を選択します。

2. 「ツール」ドロップダウンで、「表の分割」ボタンまたは「表の圧縮」ボタンをクリックします。

Oracle SOAコンポーザを使用すると、ルールの条件を同一アクションとマージすることでデシジョン表を圧縮できます。そのため、表を圧縮するとデシジョン表から条件を削除できます。ただし、Oracle SOAコンポーザを使用する場合、2つ以上の条件セルをマージすることはできません。

デシジョン表の分割および圧縮の詳細は、「デシジョン表の操作の概要」を参照してください。

12.7.8 デシジョン表での欠落しているルールのチェック

デシジョン表では、欠落しているルールはギャップとも呼ばれます。デシジョン表にギャップが発生するのは、各条件からの1つの値の組合せの一部がルールの対象でない場合です。

Oracle SOAコンポーザを使用すると、デシジョン表の欠落しているルールをチェックできます。

欠落しているルールのチェック手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、欠落しているルールをチェックするデシジョン表を選択します。

2. 「ツール」ドロップダウンから「ギャップ分析」を選択します。

図12-46に示すように、「ギャップ分析」ウィンドウが表示されます。デシジョン表に追加する必要のあるルールを選択できます。

図12-46 「ギャップ分析」ウィンドウ

欠落しているルールのチェックの詳細は、「デシジョン表のギャップのチェック方法」を参照してください。

12.7.9 デシジョン表での競合解決の実行

デシジョン表内のルールが重複し、かつ異なるアクションが存在する場合、ルールが競合する可能性があります。2つのルールが重複するのは、その条件セルの1つ以上に共通する値がある場合です。ただし、競合のない重複は一般的であり、問題はありません。デシジョン表での競合の詳細は、「デシジョン表の競合分析」を参照してください。

Oracle SOAコンポーザを使用すると、デシジョン表内の競合を検出および解決できます。

デシジョン表の競合解決を実行する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、競合解決を実行するデシジョン表を選択します。

2. 「ツール」ドロップダウンで「競合の表示」ボタンが選択されていることを確認してください。

3. デシジョン表名の横にある「拡張プロパティ・エディタ」ボタンをクリックします。

4. 「詳細設定」領域で「競合ポリシー」が「手動」に設定されていることを確認してください。これはデフォルトの競合ポリシーです。

注意:

競合ポリシーの詳細は、「デシジョン表の競合分析」を参照してください。

5. 「競合」行を選択し、競合があるルールをクリックして、「競合解決」ウィンドウを表示します。

6. 図12-47に示すように、「競合解決」ウィンドウで、競合するルールごとに「解決」フィールドでリストから解決を選択し、「OK」をクリックします。

図12-47 「競合解決」ダイアログ

デシジョン表の競合解決オプションの詳細は、「デシジョン表の競合分析」を参照してください。

12.7.10 行から列への切替

Oracle SOAコンポーザでは、詳細領域の「行を列に切替」リンクをクリックすることで、デシジョン表の行を列に変更できます。これによりルールを行として、また条件、アクションおよび競合を列として表示できます。

デシジョン表に多数のルールが存在する場合、行を列に切り替えることにより、ナビゲーションが容易になります。これはすべてのルールが一括して表示され、ルールの表示のため列をページングする必要がなくなるためです。

図12-48に、切替操作前のデシジョン表を示します。

図12-48 サンプルのデシジョン表

図12-49に、行を列に切替後のサンプルのデシジョン表を示します。

図12-49 行を列に切替

12.7.11 デシジョン表での拡張モード・オプションの使用

Oracle SOAコンポーザでは、ルールセットで拡張モードのルールを使用できるのと同様、デシジョン表でも拡張モードのルールが使用できます。拡張モードのルール・オプションを使用すると、パターンに条件およびアクションを追加、変更、削除するだけでなく、パターンを作成、変更および削除できます。

注意:

「拡張モード」機能は、下位互換性のためにのみ維持されています。簡易モードで拡張テストを使用し、必要な任意の種類の条件を作成することをお薦めします。

拡張モードで実行できることはすべて、簡易モードで実行できます。拡張モード・ルールは、単に「拡張モード」チェック・ボックスの選択を解除することで同等の簡易モードに変換できます。

詳細は、「拡張テストの使用方法」を参照してください。

拡張モードのオプションを表示および使用する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、さらに複雑なルールを追加するデシジョン表を選択します。

2. デシジョン表名の横にある「拡張プロパティ・エディタ」ボタンをクリックします。

3. 「拡張モード」を選択します。

デシジョン表の拡張モード・オプションは、ルールセットの拡張モード・オプションとほぼ同じです。詳細は、「拡張モード・オプションの使用」を参照してください。

12.7.12 デシジョン表の削除

Oracle SOAコンポーザでは、ルールセット内のデシジョン表を削除できます。デシジョン表の使用の詳細は、「デシジョン表の使用の概要」を参照してください。

ルールセット内のデシジョン表を削除する手順は、次のとおりです。

1. セッション内で、対象のルールセットを選択します。

2. 「ルール」マスター・リストで、削除するデシジョン表をクリックします。

3. 「削除」をクリックします。

4. 変更が完了したら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

12.7.13 Microsoft Excelでのデシジョン表の編集

ビジネス・ユーザーの場合は、Microsoft Excelを使用するとデシジョン表の編集が容易になることがあります。新機能を使用すると、開発者とビジネス・ユーザーのどちらも、デシジョン表をエクスポートしてExcelで編集してから、ディクショナリにデシジョン表をインポートして戻すことができます。

Microsoft Excelにデシジョン表をエクスポートすると、「新規アサート」、「変更」、「割当て」、「リトラクト」、「コール」など、基本のアクション・タイプしかサポートされません。

デシジョン表は、設計時にエクスポートして、Oracle JDeveloperまたはBusiness Process Composerで編集できます。実行時には、エクスポートしてSOAコンポーザで編集できます。ルール・ディクショナリから同じExcelワークブックに1つ以上のデシジョン表をエクスポートできます。

ディクショナリにインポートして戻すときに、新しいディクショナリを作成するか、既存のディクショナリを上書きするか、差異のマージを実行することができます。差異のマージにより、ディクショナリを比較できます。

ディクショナリの比較の詳細は、「Oracle Business Rulesディクショナリの比較およびマージ」を参照してください。

Excelワークブックの構造は、図12-50に示すように複数のワークシートで構成されます。これらのシートは1枚のREADMEシート、1枚の値セットシートおよびエクスポートされた各デシジョン表に対応する1枚ずつのシートです。Excelで編集できるものはルールと値セットのみです。.xlsm (デフォルト)または.xlsにエクスポートできます。

図12-50 Excelワークブック

スプレッドシートを開く際のデフォルトではマクロが無効化されています。マクロを有効にすると、「Oracle Business Rules」という新しいタブが表示されます。このタブで、ルールの追加または削除、セルのマージまたは分割、値セットの値の追加または削除を実行できます。また、強調表示の無効化または有効化、簡易モードまたは拡張モードの使用、READMEシートの非表示または表示も実行できます。

マクロを無効にした状態でも編集はできますが、次のことを実行できません。

- 制限付きセルでのドロップ・リストからの値の選択

- フリー・フォーム・セルの編集

- セル範囲のコピーおよび貼付けによるルールまたは値セットの追加

- セル範囲の削除によるルールまたは値セットの削除

- セルの分割またはマージ

- 値セットの自動作成

- デシジョン表または値セットの構造の検証

事前定義済のマクロを使用すると、次の実行が可能になります。

- ルールの追加と削除

- セルの分割またはマージ

- 値セットの追加または削除

- 編集可能なセルには次が含まれます。

- ルール、条件、アクションの説明。

- 条件およびアクション・ノード。

- アクションの状態。

- アクション・パラメータのパラメータ化オプション

- 編集不可のセルには次が含まれます。

- 条件式。

- アクション式。

- アクション・パラメータ。

これらのセルを編集しようとすると、図12-51に示すようにエラー・メッセージが表示されます。

図12-51 変更不可のセル

12.7.13.1 エクスポートされるものの理解

SDKには、複数のデシジョン表にわたる複数の条件と関連付けることができる共有値セットがあります。ただし、Excelでは、共有値セットは存在しません。各条件に独自の値セットがあるため、Excelで変更可能な場合にエクスポート可能な値セットは1つのみになります。変更不可の値セットには、次が含まれます。

- リンク先のディクショナリ値セット。

- 列挙。

- ブール値セットなどの内部値セット。

ワークシートでは、変更不可の値セットと関連付けられた条件のドロップダウンから値を選択することのみが可能です。強調表示メカニズムによって、変更不可の値セットに関連付けられている条件が示されます。

12.7.13.2 デシジョン表をエクスポートする方法

図12-52に示すように、エクスポート機能は、ツールバー・オプションの「Excelにエクスポート」ボタンを使用して起動できます。

図12-52 「アクション」ツールバー

Excelフォーマットでエクスポートするには:

1. SOAコンポーザのセッション内で、「アクション」、「Excelにエクスポート」をクリックします。

2. 「デシジョン表のエクスポート」ダイアログ・ボックスで、「形式」を選択し、ワークシートを保存するフォルダを参照します。

3. エクスポートするデシジョン表を選択し、「OK」をクリックします。

4. 「読取り専用値セット」チェック・ボックスを選択し、Excel内のすべての値セットを読取り専用にします。Excelワークブックに値セット・シートが存在しなくなります。すべての条件に、ドロップダウン・メニューがあり、それらの値は選択できますが、値を追加したり削除することはできません。

5. 「エクスポート」をクリックします。これで、ワークシートを開いてデシジョン表を編集できます。

12.7.13.3 デシジョン表をディクショナリにインポートする方法

インポートできるExcelスプレッドシートは前にエクスポートしたもののみです。

編集済デシジョン表をディクショナリにインポートして戻す手順は、次のとおりです。

1. ルール・デザイナで、「アクション」、「Excelからインポート」をクリックします。

2. 「デシジョン表のインポート」ダイアログ・ボックスで、「参照」をクリックし、ワークシートを保存したフォルダを参照します。

3. 「差異のマージ」チェック・ボックスはデフォルトで選択されています。差異のマージの使用方法の詳細は、「Oracle Business Rulesディクショナリの比較およびマージ」を参照してください。必要に合せて「新規作成」または「上書き」を選択します。

4. 「インポート」をクリックします。デシジョン表がルール・デザイナにインポートされ、そこで変更の受入れるか拒否できます。各変更済アーティファクトには、変更アイコンのフラグが付いています。

注意:

マージは注意深く実行してください。「Oracle Business Rulesディクショナリの比較およびマージ」を参照してください

12.7.13.4 Excelでデシジョン表を編集する方法

Excelで、マクロを有効化して、「Oracle Business Rules」タブを表示します。これにより、ルールの作成、値セットの編集、およびプリファレンスの設定を行えるオプションが表示されます。

詳細は、「Microsoft Excelでのデシジョン表の編集」を参照してください。

12.7.14 ルール・テスト変数に関する必知事項

Oracle SOAコンポーザを使用して、テスト関数を定義できます。これはルールおよびデシジョン表の条件およびアクションで発生する、非常に長い式を短縮する手段を提供するものです。変数およびその値は、インラインのビジネス条件定義と表現されることがあります。テスト変数は、インライン・エイリアスとも呼ばれます。

したがって、次のような記述ではなく

次のように記述できます。

続いてテスト条件で、fooを式の一部として使用できます。簡単なものから複雑な式まで、あらゆる式にすることが可能です。

変数を定義するには、ルールの「IF」セクションで、「テストの追加」のすぐ横の下矢印をクリックし、リストから「変数」を選択する必要があります。

変数とは別に、簡易テスト、ネスト・テスト((...))およびNotネスト・テスト(not (...))などの、他のテスト・フォームのタイプを定義することもできます。

12.8 Oracle Business Rulesディクショナリの比較およびマージ

「差異のマージ」機能により、ディクショナリの最新バージョンと任意の旧バージョンとの差異を確認し、それ以降の変更を保存またはロールバックできます。実行時に、SOAコンポーザで、「差異のマージ」機能を使用して、「ファイルシステム」、「公開済のバージョン」、または「保存済バージョン」を、開いているディクショナリと比較できます。

SOAコンポーザは、編集済バージョンと以前に保存したバージョンとの比較、保存済バージョン以降に変更されたアイテムの選択、およびそれらをその保存されている値に戻すことのみをサポートしています。最新バージョンから見た差異が確認されます。

「マージ」機能を使用すると、2つのバージョン間との差異を確認し、それらの差異を解決またはマージできます。変更されたバージョンから見た差異が確認されます。

「差異ディクショナリ」オプションは、図12-53に示すようにルール・デザイナ・ツールバーで使用できます。

図12-53 「アクション」ドロップダウン・リスト

警告:

ディクショナリは差異またはマージ・モードになっているときは読取り専用になるため、この機能の実行を決定する前に、すべての変更を解決する準備をする必要があります。

ディクショナリのマージは注意深く実行してください。

12.8.1 ディクショナリ間の差異を調べる方法

ディクショナリを比較する場合は、新しいディクショナリを開き、「差異のマージ」を使用して、比較するディクショナリを選択します。新しい方のディクショナリに存在しないものはすべて、新しいバージョンからの削除としてフラグが指定されます。

ディクショナリ間の差異を調べる手順は、次のとおりです。

1. SOAコンポーザで、新しいディクショナリを開いたまま、「アクション」、「差異のマージ」をクリックします。

図12-54に示すように、「ディクショナリ・バージョン」ダイアログが表示されます。

図12-54 「ディクショナリ・バージョン」ダイアログ

2. 「ディクショナリの選択」フィールドで、比較するディクショナリ・バージョンの1つを選択します。

- ファイルシステム: 「ファイルシステム」バージョンでは、ユーザーは、ローカル・ファイル・システムで使用可能なルール・ファイルを、サーバーにデプロイされているコンポジットのルール・ファイルと比較できます。

- 公開済のバージョン: 「公開済のバージョン」は、バージョンが変更されたときに変更されるコンポジット・バージョンです。

- 保存済バージョン: 「保存済バージョン」は、バージョンが変更されたときに変更されるコンポジット・バージョンです。

3. 「OK」をクリックして、比較対象のディクショナリを開きます。

2つのディクショナリ間のすべての差異に変更アイコンのフラグが指定されます。

変更アイコンは、すべてのタブに対して、および各タブ内の特定のアーティファクトに対して表示されます。例を図12-55に示します。

図12-55 変更のマージと元に戻す

4. 「保持」をクリックして変更を保持するか、「元に戻す」を選択して、行った変更を破棄します。

各タブをクリックして、変更を保持するか元に戻すかを決定できます。

5. または、「アクション」ドロップダウン・リストで「すべてを受入れ」または「すべて却下」を選択し、1回のクリックですべての変更を受け入れるか却下できます。

図12-56 「アクション」ドロップダウンからの「すべてを受入れ」または「すべて却下」

「差異のマージ」機能は、JDeveloperルール・デザイナのほうが完全に機能します。詳細は、「2つ以上のディクショナリを比較またはマージする方法」を参照してください。

12.9 Oracle Business Rulesのリソース名のローカライズ

Oracle BPMを使用すると、一部のルール・コンポーネントの名前をローカライズできます。

これらのエイリアスの変換バージョンを提供することで、次のアプリケーションを使用する際に、ユーザーがこれらのエイリアスを自分のブラウザの地域の設定に基づいて表示できるようになります。

- Oracle SOA Composer

- Oracle Business Process Composer

- Oracle Process Workspace

注意:

ロケールのディクショナリは、リソース・バンドルとして格納されています。Oracle JDeveloperを使用して、リソース・バンドルを作成する必要があります。これらはSOAコンポジット・アプリケーションの一部としてデプロイする必要があります。

Oracle SOAコンポーザを使用してリソース・バンドルを作成することはできません。ただし、Oracle SOAコンポーザを使用して、リソース・バンドル内のローカライズされた文字列を編集することは可能です。

Oracle SOAコンポーザを使用すると、次のルール・コンポーネントのエイリアスをローカライズできます。

- 値

- 値セット

- デシジョン関数

- デシジョン関数のファクト

- グローバル

- リンク

- ルールセット

- ルール

- パターン

12.9.1 Oracle Business Rulesコンポーネントのエイリアスのローカライズ方法

Oracle SOAコンポーザを使用して、セッション内で、ルール・コンポーネントの特定に使用される、エイリアスおよびその詳細の翻訳バージョンを追加できます。

ルール・コンポーネントのエイリアスをローカライズする手順は、次のとおりです。

1. Oracle SOAコンポーザで、「変換」タブを選択します。「変換」タブに、複数の列を持つ表が表示されます。デフォルトでは、2つの列が存在し、一方にルール・コンポーネントの未変換の識別子が表示されています。そのほかでは、英語ロケールが表示されます。

アプリケーションに他のロケールが定義されている場合は、それらもこの表に列として表示されます。詳細は、「Oracle Business Rulesリソースのローカライズ」を参照してください。

2. 編集するロケールの列で、変換するエイリアスに対応するセルをダブルクリックします。

3. ローカライズされたエイリアスのテキストを入力します。

4. 手順2および3を繰り返して、ロケールに必要なすべてのエイリアスをローカライズします。

注意:

ロケール・ファイルのオフラインでの編集はサポートされていません。ロケールの追加の際は、生成されたxmlファイルにすべてのキーがデフォルトで含まれているわけではありません。これらは値が追加される際に追加されます。

エディタからローカライズすることもできます。エディタからローカライズするには、「変換」ボタンをクリックします。

翻訳エディタで、ルール・コンポーネントの「エイリアス」を入力し、「OK」をクリックできます。

12.10 Oracle JDeveloperのルール・ディクショナリと実行時のディクショナリの更新の同期

Oracle SOAコンポーザを使用すると、実行時にルール・ディクショナリの更新を行うことができます。ただし、Oracle SOAコンポーザを介してディクショナリに加えられた変更は、Oracle JDeveloperに自動的には反映されません。Oracle SOAコンポーザで行われたディクショナリの更新を、Oracle JDeveloperで使用可能なディクショナリに同期するには、Oracle Enterprise Manager Fusion Middleware Controlコンソールの「エクスポート」オプションを選択する必要があります。このユーティリティを使用すると、SOAコンポジット・アプリケーションをディクショナリとともにエクスポートできます。

Fusion Middleware Controlコンソールで「エクスポート」オプションを選択する手順は、次のとおりです。

1. Fusion Middleware Controlコンソールで、エクスポートされるディクショナリを含むコンポジットを選択します。

2. 図12-57に示すように、右のパネルの「SOAコンポジット」ドロップダウン・リストをクリックし、「エクスポート」を選択します。

図12-57 「エクスポート」ユーティリティの選択

3. 図12-58に示すように、「コンポジットのエクスポート」ページから、「オプション1:デプロイ後のすべての変更を有効にしてエクスポート」を選択し、「エクスポート」をクリックします。

図12-58 デプロイ後のすべての変更のエクスポート

12.11 Oracle Business Rulesディクショナリの検証と診断

Oracle SOAコンポーザで、セッション内で、下部のタブを使用して診断を確認し、エラーがないかディクショナリを検証します。セッションをパブリッシュした後、「診断」タブに移入されます。

セッションのパブリッシュ中に、別のユーザーが同じアーティファクト(ディクショナリなど)に変更を行った場合、それがこのセクションに一覧表示されます。競合を処理するために3つのオプションがあります。

12.11.1 「検証ログ」タブの理解

「検証ログ」タブでは、すべてのディクショナリ・レベルの検証エラーが一覧表示されます。

検証ログは自動的に更新されません。検証は、「検証」をクリックした場合と、変更を保存したときにのみ実行されます。

たとえば、エラーがある新しいルールが追加された場合、「検証ログ」タブは自動的には更新されません。ツールバーの「検証」ボタンをクリックすると、検証ログが新しいエラー・エントリで更新されます。

12.11.2 「診断」タブの理解

図12-59に示すように、「診断」タブを使用して、他のユーザーが同じアーティファクトを変更しているか調べ、それらの競合を解決します。

図12-59 「診断」タブ

自身または他のユーザーが行った変更を解決する手順は次のとおりです。

1. 表のアイテムごとに、「解決」ドロップダウンを使用して、変更の「無視」、「採用」または「上書き」を行います。

2. 「採用」は、変更のマージを試みます。

3. 「無視」は、自身の変更を破棄することを意味します。

4. 「上書き」は、自身の変更を行い、他のユーザーの変更を破棄することを意味します。

5. 完了したら「パブリッシュ」をクリックします。

12.11.3 「履歴センター」タブの理解

「履歴センター」タブに、現在のアクティブなセッションで自身または他のユーザーが行った保留中の変更が表示されます。たとえば、自身が行ったすべての変更を一度にすばやく元に戻す場合など、ここから、変更を破棄できます。

12.11.4 「ログの保存」タブの理解

「ログの保存」タブは、保存するたびに更新されます。正常に行われた場合、保存ログにエントリが追加されます。失敗した場合は、ここにエラー・メッセージが表示されます。

12.12 タスクの操作

Oracle SOAコンポーザを使用すると、Approval Management Extensions (AMX)のルールと関連付けされている、または関連付けされていないタスクを表示および編集できます。AMXを使用すると、作業アイテムの承認階層を決定するビジネス・ドキュメントおよび関連付けられたルールを考慮することによって、ヒューマン・ワークフローの複雑なタスク・ルーティング・スリップを定義できます。

さらに、AMXでは、スーパーバイザまたはポジション階層に基づいて関連付けられたリスト・ビルダーを使用して、複数ステージの承認を定義できます。設計時には、Oracle JDeveloperのヒューマン・タスク・エディタで承認タスクを定義し、そのタスクをBPELプロセスに関連付けることができます。Approval Managementおよびタスクの詳細は、『Oracle Fusion Middleware Oracle Business Process Managementモデリングおよび実装ガイド』のApproval Managementの使用に関する項を参照してください。

Oracle SOAにはタスク・エディタがタスク・フローとして埋め込まれているため、タスク・メタデータのライフサイクル全体の操作を表示および実行できます。

12.12.1 タスク・メタデータの表示方法

タスク・メタデータを表示する手順は、次のとおりです。

1. Oracle SOAコンポーザで、タスクまたはAMXルール・メタデータ・アーティファクトを開くには、図12-60に示すように、「タイプ・ビュー」から、「ヒューマン・タスク」フォルダを開き、アーティファクトをクリックして新しいタブにそれを開きます。

図12-60 タスクのオープン

2. 変更を行う場合は、「セッションの編集」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

セッション・ボタンの使用方法の詳細は、「セッションの作成とパブリッシュ」を参照してください。

従来のルールとAMXのルールは、ネーミング規則により区別できます。

たとえば、コンポジットに次のアーティファクトがあるとします。

- <AMXタスク名>.tsk

- <AMXルール名>Rules.rules

12.12.2 タスクまたはAMXのルール・メタデータを構成する方法

タスク構成を使用すると、ビジネス・ユーザーと管理者は、ワークフロー・デザイナが自動的に構成したルールを参照できます。この事前定義済ルールは、特定の顧客向けに、適用可能な顧客企業ポリシーに基づいて変更できます。

Oracle SOAコンポーザでタスク構成を使用すると、承認フローに関連付けられた、イベント・ドリブン(タスクのみ)およびデータ・ドリブンの各ルール(関連付けられたAMXのルールが存在するタスク)を実行時に編集できます。

図12-61 タスクの構成

12.12.2.1 イベント・ドリブンの設定の構成

イベント・ドリブンの設定を構成する手順は、次のとおりです。

1. Oracle SOAコンポーザにログオンし、必要なタスクを開きます。

2. 図12-62に示すように、Oracle SOAコンポーザのメニュー・バーの「セッションの編集」をクリックして、編集のため選択されたタスクを開きます。

図12-62 編集するタスクのオープン

3. 関連する編集を行い、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

次のオプションおよび設定を構成できます。

- タスク集計

- エラー通知

- 割当ておよびルーティング・ポリシー

- 有効期限とエスカレーションのポリシー

- 通知設定

- タスク・アクセスの設定

12.12.2.1.1 承認集計の設定要件

タスク集計の要件として、次のいずれかを指定できます。

- なし

- タスクごとに1回

- ステージごとに1回

12.12.2.1.2 エラー通知

タスクでエラーが発生した場合、通知する必要があるユーザー名およびグループ名を指定できます。「エラー通知時」検索ボタンをクリックして、「エラー割当て先の構成」ダイアログ・ボックスを表示する必要があります。そこでユーザー名またはグループ名を指定できます。

12.12.2.1.3 割当ておよびルーティング・ポリシーの設定

割当ておよびルーティング・ポリシーは、Oracle SOAコンポーザで使用可能なオプションを使用して設定できます。クリックして、割当ておよびルーティング・ポリシーの設定で使用可能なオプションを選択します。

イベント・ドリブンの構成で使用可能な、割当ておよびルーティングのオプションの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のルーティング・ポリシーの手法に関する項を参照してください。

12.12.2.1.4 有効期限とエスカレーションのポリシーの設定

タスクの有効期限とエスカレーションのポリシーは、「有効期限およびエスカレーション・ポリシー」リストにある使用可能な項目を使用して設定できます。使用可能なリスト項目は、次のとおりです。

- 期限切れなし

- 期限切れまでの時間

- エスカレートまでの時間

- 期限更新までの時間

12.12.2.1.5 通知設定の構成

タスクの通知設定は、Oracle SOAコンポーザの「通知設定」セクションで使用可能なオプションを使用して構成できます。

**INTERNAL XREF ERROR**に、タスクの通知設定を構成するのに使用できる様々なオプションを示します。

図12-63 「通知設定」の指定

12.12.2.1.6 タスク・アクセス設定の構成

アクセスルール設定は、ユーザーが実行できるアクションを制御するよう設定できます。コンテンツおよびアクションの権限も、作成者(イニシエータ)、所有者、割当て先、レビューアなどユーザーの論理上のロールに基づいて指定できます。

Oracle SOA Composerでは、**INTERNAL XREF ERROR**および***INTERNAL XREF ERROR**に示すように、「タスク・アクセス」領域およびタブにある使用できるオプションを使用して、アクセス設定を設定できます。

図12-64 タスク・アクセスの設定の指定

図12-65 「タスク・アクション」設定の指定

タスク・アクセスの構成の詳細は、『Oracle Fusion Middleware Oracle Business Process Managementモデリングおよび実装ガイド』のセキュリティ・アクセス・ルールの定義方法に関する項を参照してください。

12.12.2.2 データ・ドリブンの設定の構成(ルールまたは条件)

データ・ドリブンの設定を構成する手順は、次のとおりです。

1. Oracle SOAコンポーザにログオンし、必要なタスクを開きます。

2. 図12-66に示すように、Oracle SOAコンポーザのメニュー・バーの「セッションの編集」をクリックして、編集のため選択された、AMXのルールに関連付けられたタスクを開きます。

図12-66 ルール関連タスクの編集

3. 関連する編集を行ったら、「現在のタブでの変更を保存」をクリックします。実行時バージョンに変更を適用する準備が整ったら、「パブリッシュ」をクリックします。

実行可能な操作は次のとおりです。

- ルールの追加、更新および削除

- ルールのアサーションの変更(アサーションはルールの構成対象となったリスト・ビルダーのタイプによって異なります)

- 変数の追加

データ・ドリブンの設定の編集の詳細は、『Oracle Fusion Middleware Oracle Business Process Managementユーザーズ・ガイド』のデータ・ドリブンの設定の編集方法に関する項を参照してください。

付録

ここには、Oracle Business Rulesのファイルおよび制限、組込みクラスおよび関数についてと、Oracle Business Rulesのトラブルシューティング方法について説明する付録が含まれています。

この部は、次の付録で構成されています。

- Oracle Business Rulesの組込みクラスと関数

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

- Oracle Business Rulesに関するよくある質問

- Oracle Business Rulesのファイルと制限事項

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

A Oracle Business Rulesのファイルと制限事項

この付録では、ルール・デザイナのファイルと名前に関する既知のネーミング制約と、Rules SDKの特定の制限事項について説明します。

この付録の内容は次のとおりです。

- ルール・デザイナの命名規則

A.1 ルール・デザイナの命名規則

この項では、ルール・デザイナの命名規則について説明します。

命名規則の一部は、ルールセット、ディクショナリ、別名およびXMLスキーマのターゲット・パッケージのネーミング用です。

A.1.1 ルールセットのネーミング

ルール・デザイナではルールセット名に制限が適用されます。ルールセット名は文字で始まる必要があり、使用できるのは、文字、数字または.、-、_、"、:、/、単一スペースのみです。文字には、英文字(aからzまでとAからZまで)と数字(0から9まで)が含まれます。

A.1.2 ディクショナリのネーミング

のディクショナリ名に使用できるのは、大文字と小文字(aからzおよびAからZ)、数字(0から9)およびアンダースコア文字(_)のみです。特殊文字は使用できません。

ルール・デザイナのディクショナリ名では、大/小文字は保持されますが、区別されません。たとえば、ディクショナリ名DictionaryとDICTはどちらも有効です。Testという名前のディクショナリを作成している場合、TESTという名前の別のディクショナリは、最初にTestというディクショナリを削除した場合のみ作成できます。

A.1.3 別名のネーミング

ルール・デザイナの別名は文字で始まる必要があり、別名に使用できるのは、「.」、「-」、「_」、「"」、「:」、「/」および単一スペースのみです。

A.1.4 XMLスキーマのターゲット・パッケージのネーミング

「XMLスキーマ・セレクタ」ページ上で、XMLファクトに指定するターゲット・パッケージ名は、ASCII文字、数字およびアンダースコア文字に制限されます。

B Oracle Business Rulesの組込みクラスと関数

この付録では、テキスト文字列、リスト、数値、日付などを格納したデータを判断するのに役立つOracle Business Rules (OBR)組込みクラス、メソッド、関数の拡張ライブラリについて説明します。

ここには複数の表が用意されていますが、これらの表の各行には種類の列があります。この列にはCl、Co、M、sM、P、sPのいずれかが記載されており、これらはクラス、コンストラクタ、メソッド、静的メソッド、プロパティ、静的プロパティ(Javaの静的な最終フィールド)をそれぞれ表しています。各表の最初の行ではクラスを指定しています。Java名がOBR名(ルールSDKでは別名と呼びます)と同じ場合は、「-」が表示されます。署名の列では、メソッド、関数、プロパティの型情報が提供されています。プロパティの署名とは、実際には型のことです(たとえば、BigDecimal)。メソッドや関数の署名は、return(arg1,arg2,...)という形式になります。このreturnは戻り型で、arg1,arg2,...は引数の型です。

この付録の内容は次のとおりです。

- 文字列のクラス

- リストのクラス

- 数値のクラス

- 時間と期間のクラス

- その他のクラス

- 関数

B.1 文字列のクラス

この項では、Oracle Business Rulesで提供される文字列関連のクラスについて説明します。

表B-1に、Stringクラスを示します。

表B-1 Oracle Business Rulesで提供される文字列関連のクラス

OBR名

種類

署名

Java名

説明

参照

String

Cl

-

java.lang.String

Javaの不変文字列。文字列内の文字に対して、Javaではゼロベースの索引付けを使用しますが、XMLでは1ベースの索引付けを使用します。

http://java.sun.com/javase/6/docs/api/java/lang/String.html

charAt

S

char(int)

-

ゼロベース索引arg1のchar値を戻します。"Oracle".charAt(2)=='a'

http://java.sun.com/javase/6/docs/api/java/lang/String.html#charAt%28int%29

compareTo

M

int(String)

-

引数の文字列がこの文字列と同じ場合は値0、この文字列が文字列の引数より辞書順で小さい場合は0未満の値、この文字列が文字列の引数より辞書順で大きい場合は0より大きい値が返されます。"a".compareTo("b")<0

http://java.sun.com/javase/6/docs/api/java/lang/String.html#compareTo%28java.lang.String%29

contains

M

boolean(String)

-

この文字列がarg1を含むかどうかテストします。"Oracle".contains("rac")==true

http://java.sun.com/javase/6/docs/api/java/lang/String.html#contains%28java.lang.CharSequence%29

endsWith

M

boolean(String)

-

この文字列の末尾がarg1かどうかテストします。"Oracle".endsWith("le")==true

http://java.sun.com/javase/6/docs/api/java/lang/String.html#endsWith%28java.lang.String%29

equalsIgnoreCase

M

boolean(String)

-

この文字列がarg1と同じかどうかテストします。大文字小文字の区別は無視されます。"Oracle".equalsIgnoreCase("oRaClE")==true

http://java.sun.com/javase/6/docs/api/java/lang/String.html#equalsIgnoreCase%28java.lang.String%29

indexOf

M

int(String,int)

-

この文字列(String)内のarg1の開始位置のゼロベース索引が返されます(ただしゼロベース索引arg2より前ではないものです)。"banana".indexOf("an",2)==3

http://java.sun.com/javase/6/docs/api/java/lang/String.html#indexOf%28java.lang.String,%20int%29

lastIndexOf

M

int(String,int)

-

この文字列内でarg1が最後に出現した位置のゼロベース索引を戻します。索引arg2から開始して後方検索します。"banana".lastIndexOf("an","banana".length())==3

http://java.sun.com/javase/6/docs/api/java/lang/String.html#lastIndexOf%28java.lang.String,%20int%29

length

M

int

-

この文字列の長さを戻します。"Oracle".length()==6

http://java.sun.com/javase/6/docs/api/java/lang/String.html#length%28%29

matches

M

boolean(String)

-

この文字列が指定された正規表現と一致するかどうかテストします。"banana".matches("^b.*a$")==true

http://java.sun.com/javase/6/docs/api/java/lang/String.html#matches%28java.lang.String%29

replaceAll

M

String(String,String)

-

この文字列内でarg1(正規表現)と一致する部分文字列を、それぞれarg2に置き換えます。"banana".replaceAll(".a","xo")=="xoxoxo"

http://java.sun.com/javase/6/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29

replaceFirst

M

String(String,String)

-

この文字列の、arg1(正規表現)と一致する最初の部分文字列を、arg2に置き換えます。"banana".replaceFirst(".a","xo")=="xonana"

http://java.sun.com/javase/6/docs/api/java/lang/String.html#replaceFirst%28java.lang.String,%20java.lang.String%29

startsWith

M

boolean(String)

-

この文字列がarg1で始まるかどうかテストします。"Oracle".startsWith("Or")==true

http://java.sun.com/javase/6/docs/api/java/lang/String.html#startsWith%28java.lang.String%29

substring

M

String(int,int)

-

この文字列の、ゼロベース索引arg1で始まりゼロベース索引arg2の前で終わる部分文字列を戻します。"Oracle".substring(1,4)=="rac"

http://java.sun.com/javase/6/docs/api/java/lang/String.html#substring%28int,%20int%29

toLowerCase

M

String()

-

この文字列を小文字に変換します。"Oracle".toLowerCase()=="oracle"

http://java.sun.com/javase/6/docs/api/java/lang/String.html#toLowerCase%28%29

toUpperCase

M

String()

-

この文字列を大文字に変換します。"Oracle".toUpperCase()=="ORACLE"

http://java.sun.com/javase/6/docs/api/java/lang/String.html#toUpperCase%28%29

trim

M

String()

-

先頭および末尾の空白を削除します。"Oracle ".trim()=="Oracle"

http://java.sun.com/javase/6/docs/api/java/lang/String.html#trim%28%29

表B-2に、RLクラスの文字列のメソッドを示します。

表B-2 RLクラスの文字列のメソッド

OBR名

種類

署名

Java名

説明

参照

RL

Cl

-

oracle.rules.rl.extensions.RL

標準のJavaクラスにW3C RIF機能を補足します。

http://www.w3.org/TR/rif-dtb/

string.join

sM

String(String...)

stringJoin

最後の引数をセパレータとして、最初からn-1個の引数を連結します。RL.string.join("a","b","c","#")=="a#b#c"

http://www.w3.org/TR/rif-dtb/#func:string-join

string.substring

sM

String(String,int,int)

substring

arg1の部分文字列で、1ベース索引arg2で始まりarg3の数だけ続く部分を戻します。RL.string.substring("Oracle",2,3)=="rac"

http://www.w3.org/TR/rif-dtb/#func:substring

string.suffix

sM

String(String,int)

substring

1ベース索引arg2から始まる、arg1の接尾辞を戻します。RL.string.suffix("Oracle",5)=="le"

http://www.w3.org/TR/rif-dtb/#func:substring

string.substring before

sM

String(String,String)

substringBefore

arg2の前に出現するarg1の部分文字列を戻します。RL.string.substring before("Oracle","ac")=="Or"

http://www.w3.org/TR/rif-dtb/#func:substring-before

string.substring after

sM

String(String,String)

substringAfter

arg2の後に出現するarg1の部分文字列を戻します。RL.string.substring after("Oracle","ac")=="le"

http://www.w3.org/TR/rif-dtb/#func:substring-after

string.iri.encode path

sM

String(String)

encodeForURI

URIパスで許可されていない文字をエンコードします。RL.string.iri encode path("Oracle Business Rules")=="Oracle%20Business%20Rules"

http://www.w3.org/TR/rif-dtb/#func:encode-for-uri

string.iri.to uri

sM

String(String)

iriToUri

URIで許可されていない一部の文字をエンコードします。RL.string.iri to uri("http://www.example.com/~bébé")=="http://www.example.com/~b%C3%A9b%C3%A9"

http://www.w3.org/TR/rif-dtb/#func:iri-to-uri

string.iri.to ascii

sM

String(String)

escapeHtmlUri

非ASCII文字をエンコードします。RL.string.iri to ascii("javascript:if (navigator.browserLanguage == 'fr') window.open('http://www.example.com/~bébé');")=="javascript:if (navigator.browserLanguage == 'fr') window.open('http://www.example.com/~b%C3%A9b%C3%A9');"

http://www.w3.org/TR/rif-dtb/#func:escape-html-uri

string.is normalized

sM

boolean(String)

isNormalizedString

正規化された文字列には改行(#xD)、行送り(#xA)、タブ(#x9)の文字は含まれません。RL.string.is normalized(" Business Rules ")==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

string.is token

sM

boolean(String)

isToken

トークンは正規化された文字列で、先頭または末尾に空白は含まれず、ダブル・スペースも含まれません。RL.string.is token("Business Rules")==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

string.is language

sM

boolean(String)

isLanguage

言語識別子。RL.string.is language("en")==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

string.is Name

sM

boolean(String)

isName

名前はトークンで、スペースを(文字に対するその他いくつかの制約も)含みません。RL.string.is Name("xs:Name")==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

string.is NCName

sM

boolean(String)

isNCName

コロンを含まない名前。RL.string.is NCName("xs:NCName")==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

string.is NMTOKEN

sM

boolean(String)

isNMTOKEN

NMTOKENは、最初の文字に何も制約がない名前です。RL.string.is NMTOKEN("-Oracle")==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

string.compare

sM

int(String,String)

compare

arg1<arg2の場合は-1、arg1==arg2の場合は0、arg1>arg2の場合は1をそれぞれ戻します。RL.string.compare("foo","bar")==1.

http://www.w3.org/TR/rif-dtb/#func:compare_.28adapted_from_fn:compare.29

B.2 リストのクラス

この項では、Oracle Business Rulesで提供されるリストのクラスについて説明します。

表B-3に、Listクラスを示します。

表B-3 Listクラスの表

OBR名

種類

署名

Java名

説明

参照

List

Cl

-

java.util.List

可変および不変のリストを表します。リストではゼロベース索引を使用します。不変リストを変更しようとすると、UnsupportedOperationExceptionsが発生する場合があります。

http://java.sun.com/javase/6/docs/api/java/util/List.html

append

M

void(Object)

add

このリストにarg1を追加します。このリストを変更します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#add(E)

add

M

void(int,Object)

-

このリストのarg1の位置にarg2を挿入します。このリストを変更します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#add(int,%20E)

appendAll

M

void(java.util.Collection)

addAll

arg1の内容をこのリストに追加します。このリストを変更します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#addAll(java.util.Collection)

addAll

M

void(int,java.util.Collection)

-

このリストのarg1の位置にarg2の内容を挿入します。このリストを変更します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#addAll(int,%20java.util.Collection)

clear

M

void()

-

このリストの内容を削除します。このリストを変更します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#clear()

contains

M

boolean(Object)

-

このリストがarg1を含むかどうかテストします。RL.list.create(1,2,3).contains(2)==true

http://java.sun.com/javase/6/docs/api/java/util/List.html#contains(java.lang.Object)

containsAll

M

boolean(java.util.Collection)

-

このリストがarg1のすべての要素を含むかどうかテストします。RL.list.create(1,2,3).containsAll(RL.list.create(3,2,1))==true

http://java.sun.com/javase/6/docs/api/java/util/List.html#containsAll(java.util.Collection)

get

M

Object(int)

-

arg1の位置の要素を取得します。RL.list.create(1,2,3).get(1)==2

http://java.sun.com/javase/6/docs/api/java/util/List.html#get(int)

indexOf

M

int(Object)

-

このリストのarg1の最初の索引を戻します。RL.list.create(1,2,3).indexOf(2)==1

http://java.sun.com/javase/6/docs/api/java/util/List.html#indexOf(java.lang.Object)

remove

M

boolean(Object)

-

最初に出現するarg1をこのリストから削除します。このリストが変更されたかどうかを戻します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object)

remove by index

M

Object(int)

remove

arg1の位置の要素を削除して戻します。このリストを変更します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#remove(int)

removeAll

M

boolean(java.util.Collection)

-

arg1に含まれるすべての要素をこのリストから削除します。このリストが変更されたかどうかを戻します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#removeAll(java.util.Collection)

retainAll

M

boolean(java.util.Collection)

-

arg1に含まれ「ない」すべての要素をこのリストから削除します。このリストが変更されたかどうかを戻します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#retainAll(java.util.Collection)

set

M

Object(int,Object)

-

このリストのarg1の位置のアイテムをarg2で置き換えます。置き換えられたアイテムを戻します。このリストを変更します。

http://java.sun.com/javase/6/docs/api/java/util/List.html#set(int,%20E)

size

M

int()

-

このリストのサイズを戻します。RL.list.create(1,2,3).size()==3

http://java.sun.com/javase/6/docs/api/java/util/List.html#size()

subList

M

List(int,int)

-

このリストの、arg1(を含む)からarg2(を含まない)の間の部分のビューを戻します。RL.list.create(1,2,3,4).subList(1,3)==RL.list.create(2,3)

http://java.sun.com/javase/6/docs/api/java/util/List.html#subList(int,%20int)

表B-4に、RLクラスのリストのメソッドを示します。

表B-4 RLクラスのリストのメソッドの表

OBR名

種類

署名

Java名

説明

参照

RL

Cl

-

oracle.rules.rl.extensions.RL

-

-

list.append

sM

List(List,Object...)

append

arg1、arg2、arg3 ...の順にその内容を含む新しい不変リストを戻します。RL.list.append(RL.list.create(1),2,3)==RL.list.create(1,2,3)

http://www.w3.org/TR/rif-dtb/#func:append

list.concatenate

sM

List(List...)

concatenate

arg1、arg2 ...の連結を含む新しい不変リストを戻します。RL.list.concatenate(RL.list.create(1),RL.list.create(2))==RL.list.create(1,2)

http://www.w3.org/TR/rif-dtb/#func:concatenate

list.distinct values

sM

List(List)

distinctValues

arg1のような新しい不変リストを戻しますが、重複は削除されます。RL.list.distinct values(RL.list.create(2,2))==RL.list.create(2)

http://www.w3.org/TR/rif-dtb/#func:distinct-values

list.except

sM

List(List,List)

except

arg2には含まれていないarg1の要素を含む新しい不変リストを戻します。RL.list.except(RL.list.create(1,2,3,4),RL.list.create(1,3))==RL.list.create(2,4)

http://www.w3.org/TR/rif-dtb/#func:except

list.get

sM

Object(List,int)

get

arg1の中のarg2の位置の要素を戻します。arg2<0の場合、arg1.size()+arg2の位置の要素を戻します。RL.list.get(RL.list.create(1,2,3),-1)==3

http://www.w3.org/TR/rif-dtb/#func:get

list.index of

sM

List<Integer>(List,Object)

indexOf

arg1においてarg2が出現する索引のリストを戻します。RL.list.index of(RL.list.create(1,2,3,2),2)==RL.list.create(1,3)

http://www.w3.org/TR/rif-dtb/#func:index-of

list.insert before

sM

List(List,int,Object)

insertBefore

arg2の位置のアイテムの前にarg3が挿入された状態で、arg1を含むリストの新しい不変リストを戻します。arg2<0の場合、arg3はarg1.size()+arg2の位置の要素の前に挿入されます。RL.list.insert before(RL.list.create(1,2,3),-1,99)==RL.list.create(1,2,99,3)

http://www.w3.org/TR/rif-dtb/#func:insert-before

list.intersect

sM

List(List,List)

intersect

arg1とarg2の共通部分を含む新しい不変リストを戻します。RL.list.intersect(RL.list.create(1,2,3),RL.list.create(3,1))==RL.list.create(1,3)

http://www.w3.org/TR/rif-dtb/#func:intersect

list.create

sM

List(Object...)

リスト

引数を含む新しい不変リストを戻します。

http://www.w3.org/TR/rif-dtb/#func:make-list

list.remove

sM

List(List,int)

remove

arg2の位置の要素が削除された状態で、arg1の要素を含む新しい不変リストを戻します。arg2<0の場合、arg1.size()+arg2の位置の要素が削除されます。RL.list.remove(RL.list.create(1,2,3),0)==RL.list.create(2,3)

http://www.w3.org/TR/rif-dtb/#func:remove

list.reverse

sM

List(List)

reverse

arg1の要素が逆の順序で含まれる新しい不変リストを戻します。RL.list.reverse(RL.list.create(1,2,3))==RL.list.create(3,2,1)

http://www.w3.org/TR/rif-dtb/#func:reverse

list.union

sM

List(List)

union

重複が削除された状態で、引数の連結を含む新しい不変リストが返されます。RL.list.union(RL.list.create(1,2),RL.list.create(2,3))==RL.list.create(1,2,3)

http://www.w3.org/TR/rif-dtb/#func:union

B.3 数値のクラス

Oracle Business Rulesは、Javaのプリミティブ型の数値型であるbyte、short、int、long、float、doubleをサポートしています。

OBRは、「ボックス化」バージョンであるShort、Int、Long、Float、Doubleもサポートしています。精度の制限がない整数および小数は、JavaクラスのBigIntegerおよびBigDecimalを使用してサポートされます。OBRは、すべての数値型に対して算術式(+、-、*、/、**)をサポートしています。たとえば、*bdがBigDecimalである場合、単純にbd + 1と記述することで、1を追加できます。bd.add(BigDecimal.ONE)と記述する必要はありません。

表B-5に、Integerクラスを示します。

表B-5 Integerクラスの表

OBR名

種類

署名

Java名

説明

参照

Integer

Cl

-

java.lang.Integer

整数型オブジェクト。プリミティブ型の「int」と異なり、Integerはnullにすることも、リスト内に含むこともできます。

http://java.sun.com/javase/6/docs/api/java/lang/Integer.html

Integer

Co

Integer(int|String)

-

intまたはその字句表現から、Integerを文字列として作成します。new Integer(1)==new Integer("1")

http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#Integer(int)

MIN_VALUE

sP

int

-

プリミティブ型のintで最も小さい値。Integer.MIN_VALUE<0

http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#MIN_VALUE

MAX_VALUE

sP

int

-

プリミティブ型のintで最も大きい値。Integer.MAX_VALUE>0

http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#MAX_VALUE

intValue

M

int()

-

このIntegerをintに変換します。new Integer(1).intValue()==1

http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#intValue()

toString

M

String()

-

このIntegerをその字句表現に変換します。new Integer(1).toString()=="1"

http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#toString()

表B-6に、Longクラスを示します。

表B-6 Longクラスの表

OBR名

種類

署名

Java名

説明

参照

Long

Cl

-

java.lang.Long

長整数型オブジェクト。プリミティブ型の「long」と異なり、Longはnullにすることも、リスト内に含むこともできます。

http://java.sun.com/javase/6/docs/api/java/lang/Long.html

Long

Co

Long(long|String)

-

longまたはその字句表現から、Longを文字列として作成します。new Long(1)==new Long("1")

http://java.sun.com/javase/6/docs/api/java/lang/Long.html#Long(long)

MIN_VALUE

sP

long

-

プリミティブ型のlongで最も小さい値。Long.MIN_VALUE<0

http://java.sun.com/javase/6/docs/api/java/lang/Long.html#MIN_VALUE

MAX_VALUE

sP

long

-

プリミティブ型のlongで最も大きい値。Long.MAX_VALUE>0

http://java.sun.com/javase/6/docs/api/java/lang/Long.html#MAX_VALUE

longValue

M

long()

-

このLongをlongに変換します。new Long(1).longValue()==1

http://java.sun.com/javase/6/docs/api/java/lang/Long.html#longValue()

toString

M

String()

-

このLongをその字句表現に変換します。new Long(1).toString()=="1"

http://java.sun.com/javase/6/docs/api/java/lang/Long.html#toString()

表B-7に、Shortクラスを示します。

表B-7 Shortクラスの表

OBR名

種類

署名

Java名

説明

参照

Short

Cl

-

java.lang.Short

短整数型オブジェクト。プリミティブ型の「short」と異なり、Shortはnullにすることも、リスト内に含むこともできます。

http://java.sun.com/javase/6/docs/api/java/lang/Short.html

Short

Co

Short(short|String)

-

shortまたはその字句表現から、Shortを文字列として作成します。new Short(1)==new Short("1")

http://java.sun.com/javase/6/docs/api/java/lang/Short.html#Short(short)

MIN_VALUE

sP

short

-

プリミティブ型のshortで最も小さい値。Short.MIN_VALUE<0.

http://java.sun.com/javase/6/docs/api/java/lang/Short.html#MIN_VALUE

MAX_VALUE

sP

short

-

プリミティブ型のshortで最も大きい値。Short.MAX_VALUE>0.

http://java.sun.com/javase/6/docs/api/java/lang/Short.html#MAX_VALUE

shortValue

M

short()

-

このShortをshortに変換します。new Short(-1).shortValue()==-1

http://java.sun.com/javase/6/docs/api/java/lang/Short.html#shortValue()

toString

M

String()

-

このShortをその字句表現に変換します。new Short(-1).toString()=="-1"

http://java.sun.com/javase/6/docs/api/java/lang/Short.html#toString()

表B-8に、Floatクラスを示します。

表B-8 Floatクラスの表

OBR名

種類

署名

Java名

説明

参照

Float

Cl

-

java.lang.Float

浮動小数型オブジェクト。プリミティブ型の「float」と異なり、Floatはnullにすることも、リスト内に含むこともできます。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html

Float

Co

Float(float|double|String)

-

float、doubleまたはその字句表現から、Floatを文字列として作成します。new Float(1.1)==new Float("1.1")

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#Float(float)

infinite

P

boolean

-

このFloatの値は無限大です。new Float(Float.NEGATIVE_INFINITY).infinite==true

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#isInfinite()

naN

P

boolean

-

このFloatの値は数値ではありません。new Float(Float.NaN).naN==true

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#isNaN()()

NaN

sP

float

-

「数値でない」ことを表す値。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#NaN

NEGATIVE_INFINITY

sP

float

-

負の無限大を表す値。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#NEGATIVE_INFINITY

POSITIVE_INFINITY

sP

float

-

正の無限大を表す値。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#POSITIVE_INFINITY

floatValue

M

float()

-

このFloatをfloatに変換します。new Float(1.1f).floatValue()==1.1f

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#floatValue()

toString

M

String()

-

このFloatをその字句表現に変換します。new Float(1.1f).toString()=="1.1"

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#toString()

表B-9に、Doubleクラスを示します。

表B-9 Doubleクラスの表

OBR名

種類

署名

Java名

説明

参照

Double

Cl

-

java.lang.Double

Double型オブジェクト。プリミティブ型の「double」と異なり、Doubleはnullにすることも、リスト内に含むこともできます。

http://java.sun.com/javase/6/docs/api/java/lang/Double.html

Double

Co

Double(double|String)

-

doubleまたはその字句表現から、Doubleを文字列として作成します。new Double(1.1)==new Double("1.1")

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#Double(double)

infinite

P

boolean

-

このDoubleの値は無限大です。new Float(Float.POSITIVE_INFINITY).infinite==true

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#isInfinite()

naN

P

boolean

-

このDoubleの値は数値ではありません。new Double(double.NaN).naN==true

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#isNaN()

NaN

sP

double

-

「数値でない」ことを表す値。

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#NaN

NEGATIVE_INFINITY

sP

double

-

負の無限大を表す値。

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#NEGATIVE_INFINITY

POSITIVE_INFINITY

sP

double

-

正の無限大を表す値。

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#POSITIVE_INFINITY

doubleValue

M

double()

-

このDoubleをdoubleに変換します。new Double(1.1).doubleValue()==1.1

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#doubleValue()

toString

M

String()

-

このDoubleをその字句表現に変換します。new Double(1.1).toString()=="1.1"

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#toString()

表B-10に、BigIntegerクラスを示します。

表B-10 BigIntegerクラスの表

OBR名

種類

署名

Java名

説明

参照

BigInteger

Cl

-

java.math.BigInteger

不変の任意精度の整数。

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html

BigInteger

Co

BigInteger(String)

-

BigIntegerをその字句表現から文字列として作成します。as a String. new BigInteger("1")==1

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html#BigInteger(java.lang.String)

doubleValue

M

double()

-

このBigIntegerをdoubleに変換します。精度が失われる場合があります。new BigInteger("1").doubleValue()==1.0

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html#doubleValue()

longValue

M

long()

-

このBigIntegerをlongに変換します。精度が失われる場合があります。new BigInteger("1").longValue()==1L

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html#longValue()

max

M

BigInteger(BigInteger)

-

これとarg1のうち大きい方を戻します。new BigInteger("1").max(2)==2

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html#max(java.math.BigInteger)

min

M

BigInteger(BigInteger)

-

これとarg1のうち小さい方を戻します。new BigInteger("1").min(2)==1

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html#min(java.math.BigInteger)

toString

M

String()

-

このBigIntegerの字句表現を戻します。new BigInteger("123").toString()=="123"

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html#toString()

valueOf

sM

BigInteger(long)

-

arg1 (long)をBigIntegerに変換します。BigInteger.valueOf(123).toString()=="123"

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html#valueOf(long)

表B-11に、BigDecimalクラスを示します。

表B-11 BigDecimalクラスの表

OBR名

種類

署名

Java名

説明

参照

BigDecimal

Cl

-

java.math.BigDecimal

不変、任意精度の符号付き10進数。

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html

BigDecimal

Co

BigDecimal(long|double|String)

-

long、doubleまたはその字句表現から、BigDecimalを文字列として作成します。new BigDecimal(1.1)==new BigDecimal("1.1")

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(java.lang.String)

BigDecimal

Co

BigDecimal(BigInteger,int)

-

BigIntegerのarg1およびスケールのarg2からBigDecimalを作成します。new BigDecimal(new BigInteger("123"),2)==1.23

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(java.math.BigInteger,%20int)

doubleValue

M

double()

-

このBigDecimalをdoubleに変換します。精度が失われる場合があります。new BigDecimal("0.1").doubleValue()==0.1

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#doubleValue()

longValue

M

long()

-

このBigDecimalをlongに変換します。精度が失われる場合があります。new BigDecimal("0.1").longValue()==0L

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#longValue()

max

M

BigDecimal(BigDecimal)

-

このBigDecimalとarg1のうち大きい方を戻します。new BigDecimal("0.1").max(0.2)==0.2

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#max(java.math.BigDecimal)

min

M

BigDecimal(BigDecimal)

-

このBigDecimalとarg1のうち小さい方を戻します。new BigDecimal("0.1").min(0.2)==0.1

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#min(java.math.BigDecimal)

scale

M

int()

-

スケール(小数点の右側の桁数)を戻します。new BigDecimal("1.00").scale()==2

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#scale()

setScale

M

BigDecimal(int)

-

スケールを設定しますが、値は変更されません。new BigDecimal("1").setScale(2).toString()=="1.00"

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#setScale(int)

toEngineeringString

M

String()

-

指数が必要な場合に、工学表記を使用してこのBigDecimalのリテラル表現を戻します。new BigDecimal("123E2").toEngineeringString()=="12.3E+3"

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#toEngineeringString()

toPlainString

M

String

-

指数を使用せずにこのBigDecimalのリテラル表現を戻します。new BigDecimal("123E2").toPlainString()=="12300"

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#toPlainString()

valueOf

sM

BigDecimal(long|double)

-

arg1 (longまたはdouble)をBigDecimalに変換します。new BigDecimal(1.3)==BigDecimal.valueOf(1.3)

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#valueOf(double)

ROUND_UP

sP

int

-

divideで使用します。new BigDecimal("11").divide(2,BigDecimal.ROUND_UP)==6

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_UP

ROUND_DOWN

sP

int

-

divideで使用します。new BigDecimal("11").divide(2,BigDecimal.ROUND_DOWN)==5.

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_DOWN

divide

M

BigDecimal(BigDecimal,int)

-

これをarg1で除算した値を、このBigDecimalと同じスケールで戻します。結果のスケール内に納めるように丸めを実行する必要がある場合は、arg2 (ROUND_UPまたはROUND_DOWN)で示される丸めのモードを使用します。new BigDecimal("11").divide(2,BigDecimal.ROUND_UP)==6

http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#divide(java.math.BigDecimal,%20int)

表B-12に、Numberクラスを示します。

表B-12 Numberクラスの表

OBR名

種類

署名

Java名

説明

参照

Number

Cl

-

-

すべての数値の基本クラス(プリミティブ型を除く)。

http://java.sun.com/javase/6/docs/api/java/lang/Number.html

doubleValue

M

double()

-

この数値をdoubleに変換します。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#doubleValue()

floatValue

M

float()

-

この数値をfloatに変換します。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#floatValue()

intValue

M

int()

-

この数値をintに変換します。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#intValue()

longValue

M

long()

-

この数値をlongに変換します。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#longValue()

shortValue

M

short()

-

この数値をshortに変換します。

http://java.sun.com/javase/6/docs/api/java/lang/Float.html#shortValue()

表B-13に、RLクラスの数値のメソッドを示します。

表B-13 RLクラスの数値のメソッドの表

OBR名

種類

署名

Java名

説明

参照

RL

Cl

-

oracle.rules.rl.extensions.RL

-

-

number.is byte

sM

boolean(Number)

isByte

arg1は整数で、-128<=arg1<=127です。RL.numeric.is byte(200)==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is short

sM

boolean(Number)

isShort

arg1は整数で、-32768<=arg1<=32767です。RL.numeric.is short(0.1)==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is int

sM

boolean(Number)

isInt

arg1は整数で、-2147483648<=arg1<=2147483647です。RL.numeric.is int(-1000)==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is long

sM

boolean(Number)

isLong

arg1は整数で、-9223372036854775808<=arg1<=9223372036854775807です。RL.numeric.is integer(new BigInteger("100")**100)==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is integer

sM

boolean(Number)

isInteger

arg1は整数です。RL.numeric.is integer(new BigInteger("100")**100)==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is decimal

sM

boolean(Number)

isDecimal

arg1はDoubleでもFloatでもありません。RL.numeric.is decimal(1.1)==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is non-negative integer

sM

boolean(Number)

isNonNegativeInteger

arg1は整数で、arg1>=0です。RL.numeric.is non-negative integer(-1)==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is negative integer

sM

boolean(Number)

isNegativeInteger

arg1は整数で、arg1<0です。RL.numeric.is negative integer(-1)==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is non-positive integer

sM

boolean(Number)

isNonPositiveInteger

arg1は整数で、arg1<=0です。RL.numeric.is non-positive integer(-1)==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is positive integer

sM

boolean(Number)

isPositiveInteger

arg1は整数で、arg1>0です。RL.numeric.is positive integer(-1)==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is unsigned byte

sM

boolean(Number)

isUnsignedByte

arg1は整数で、0<=arg1<=255です。RL.numeric.is unsigned byte(200)==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is unsigned short

sM

boolean(Number)

isUnsignedShort

arg1は整数で、0<=arg1<=65535です。RL.numeric.is unsigned short(0.1)==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is unsigned int

sM

boolean(Number)

isUnsignedInt

arg1は整数で、0<=arg1<=4294967295です。RL.numeric.is unsigned int(-1000)==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

number.is unsigned long

sM

boolean(Number)

isUnsignedLong

arg1は整数で、0<=arg1<=18446744073709551615です。

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

B.4 時間と期間のクラス

この項では、Oracle Business Rulesで提供される時間と期間のクラスについて説明します。

表B-14に、Calendarクラスを示します。

表B-14 Calendarクラスの表

OBR名

種類

署名

Java名

説明

参照

Calendar

Cl

-

java.util.Calendar

Calendarは日時とタイムゾーンを表します。calendarインスタンスには、多数の可変整数フィールドがあります。add、get、isSet、roll、setの第1の引数は、フィールド番号です。このクラスでは、フィールド番号として使用する多数の静的プロパティを提供します。

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html

ERA

sP

int

-

Calendarの時代のフィールド番号。1はA.D.、0はB.C.です。((Calendar)"2010-02-01").get(Calendar.ERA)==1

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#ERA

YEAR

sP

int

-

Calendarの年のフィールド番号。((Calendar)"2010-02-01").get(Calendar.YEAR)==2010

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#YEAR

MONTH

sP

int

-

Calendarの月のフィールド番号。月はゼロベースです。((Calendar)"2010-02-01").get(Calendar.MONTH)==1

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#MONTH

WEEK_OF_YEAR

sP

int

-

Calendarの週のフィールド番号。((Calendar)"2010-02-01").get(Calendar.WEEK_OF_YEAR)==6

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#WEEK_OF_YEAR

DAY_OF_YEAR

sP

int

-

Calendarがその年の何日目かを示すフィールド番号。((Calendar)"2010-02-01").get(Calendar.DAY_OF_YEAR)==32

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#DAY_OF_YEAR

DAY_OF_MONTH

sP

int

-

Calendarがその月の何日目かを示すフィールド番号。((Calendar)"2010-02-01").get(Calendar.DAY_OF_MONTH)==1

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#DAY_OF_MONTH

DAY_OF_WEEK

sP

int

-

Calendarがその週の何日目かを示すフィールド番号。((Calendar)"2010-02-01").get(Calendar.DAY_OF_WEEK)==2

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#DAY_OF_WEEK

HOUR

sP

int

-

Calendarの時間のフィールド番号(12時間表示形式)。((Calendar)"2010-02-01T20:15:10").get(Calendar.HOUR)==8

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#HOUR

AM_PM

sP

int

-

CalendarのAM_PMフラグ。0はAM、1はPMです。((Calendar)"2010-02-01T20:15:10").get(Calendar.AM_PM)==1

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#AM_PM

HOUR_OF_DAY

sP

int

-

Calendarの時間のフィールド番号(24時間表示形式)。((Calendar)"20:15:10").get(Calendar.HOUR)==20

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#HOUR_OF_DAY

MINUTE

sP

int

-

Calendarの分のフィールド番号。JavaDate.from time string("20:15:10").get(Calendar.MINUTE)==15

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#MINUTE

SECOND

sP

int

-

Calendarの秒のフィールド番号。((Calendar)"20:15:10").get(Calendar.SECOND)==10

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#SECOND

ZONE_OFFSET

sP

int

-

タイムゾーンのフィールド番号。値は、GMTからのミリ秒単位のオフセットです。((Calendar)"20:15:10-05:30").get(Calendar.ZONE_OFFSET)==-(5*3600+30*60)*1000

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#ZONE_OFFSET

add

M

void(int,int)

add

arg2で指定した時間の長さをarg1で指定したカレンダ・フィールドに追加します。このCalendarを変更します。

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#add(int,%20int)

clear

M

void()

clear

このCalendarをクリアします(すべてのフィールドを設定解除します)。このCalendarを変更します。

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#clear()

get

M

int(int)

get

field numberフィールド番号arg1で指定されたフィールドの値を取得します。((Calendar)"20:15:10").get(Calendar.SECOND)==10

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#get(int)

getInstance

sM

Calendar()

getInstance

デフォルトのタイムゾーンとロケールで現在の時間に初期化されたカレンダを取得します。

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#getInstance()

roll

M

void(int,int)

roll

arg2で指定した時間の長さをarg1で指定したカレンダ・フィールドに追加します。その他のカレンダ・フィールドには影響しません。このCalendarを変更します。

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#roll(int,%20int)

set

M

void(int,int)

set

arg1で指定したカレンダ・フィールドをarg2で指定した値に設定します。このCalendarを変更します。

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#set(int,%20int)

time

P

java.util.Date

time

このCalendarの時間の値で表されるDateオブジェクトを戻します。((Calendar)"2010-02-01").time<((Calendar)"2010-02-02").time

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#getTime()

timeInMillis

P

long

timeInMillis

このCalendarの時間の値をミリ秒で戻します。((Calendar)"2010-02-01").timeInMillis<((Calendar)"2010-02-02").timeInMillis

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#getTimeInMillis()

表B-15に、JavaDateクラスを示します。

表B-15 JavaDateクラスの表

OBR名

種類

署名

Java名

説明

参照

JavaDate

Cl

-

oracle.rules. rl. extensions.JavaDate

Calendarを不変オブジェクトとして使用するためのヘルパー・クラス。Calendarを不変オブジェクトとして処理することでエラーを防止できます。

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html

add years to

sM

Calendar(Calendar, int)

addYearsTo

arg1よりもarg2の年数だけ後の新しいCalendarを戻します。JavaDate.add years to("2009-01-01",1)=="2010-01-01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#addYearsTo_java_util_Calendar__int_

add months to

sM

Calendar(Calendar, int)

addMonthsTo

arg1よりもarg2の月数だけ後の新しいCalendarを戻します。JavaDate.add months to("2009-01-01",1)=="2009-02-01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#addMonthsTo_java_util_Calendar__int_

add weeks to

sM

Calendar(Calendar,int)

addWeeksTo

arg1よりも7*arg2の日数だけ後の新しいCalendarを戻します。JavaDate.add weeks to("2009-01-01",1)=="2009-01-08"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#addWeeksTo_java_util_Calendar__int_

add days to

sM

Calendar(Calendar,int)

addDaysTo

arg1よりもarg2の日数だけ後の新しいCalendarを戻します。JavaDate.add days to("2009-01-01",1)=="2009-01-02"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#addDaysTo_java_util_Calendar__int_

add hours to

sM

Calendar(Calendar,int)

addHoursTo

arg1よりもarg2の時間数だけ後の新しいCalendarを戻します。JavaDate.add hours to("01:01:01",1)=="02:01:01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#addHoursTo_java_util_Calendar__int_

add minutes to

sM

Calendar(Calendar,int)

addMinutesTo

arg1よりもarg2の分数だけ後の新しいCalendarを戻します。JavaDate.add minutes to("01:01:01",1)=="01:02:01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#addMinutesTo_java_util_Calendar__int_

add seconds to

sM

Calendar(Calendar,int)

addSecondsTo

arg1よりもarg2の秒数だけ後の新しいCalendarを戻します。JavaDate.add seconds to("01:01:01",61)=="01:02:02"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#addSecondsTo_java_util_Calendar__int_

add milliseconds to

sM

Calendar(Calendar,int)

addMillisecondsTo

arg1よりもarg2のミリ秒数だけ後の新しいCalendarを戻します。JavaDate.add milliseconds to("01:01:01",61)=="01:01:01.061"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#addMillsecondsTo_java_util_Calendar__int_

add duration to

sM

Calendar(Calendar,XMLDuration)

addDurationTo

arg1よりもarg2の期間だけ後の新しいCalendarを戻します。JavaDate.add duration to("2009-12-30T23:59:00",Duration.from string("P1DT1M"))=="2010-01-01"

http://www.w3.org/TR/rif-dtb/#func:add-day TimeDuration-to-dateTime_.28adapted_from_op: add-dayTimeDuration-to-dateTime.29

http://www.w3.org/TR/rif-dtb/#func: add-yearMonthDuration-to-dateTime_.28adapted_from_op: add-yearMonthDuration-to-dateTime.29

from date string

sM

Calendar(String)

fromDateString

拡張型ISO 8601のdateリテラルでarg1のCalendarを作成します。拡張型ではYYYY-MM-DD@TimeZoneIdを使用できます。JavaDate.from date string("2010-02-06@PST")=="2010-02-06-08:00"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#fromDateString_java_lang_String_

from datetime string

sM

Calendar(String)

fromDateTimeString

拡張型ISO 8601のdatetimeリテラルでarg1のCalendarを作成します。拡張型ではYYYY-MM-DDTHH:MM:SS@TimeZoneIdを使用できます。JavaDate.from datetime string("2010-02-06T14:15:00@PST")=="2010-02-06T14:15:00-08:00"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#fromDateTimeString_java_lang_String_

from time string

sM

Calendar(String)

fromTimeString

拡張型ISO 8601のtimeリテラルでarg1のCalendarを作成します。拡張型ではHH:MM:SS@TimeZoneIdを使用できます。警告: Calendarのdate部分は現在の日付に初期化されます。JavaDate.from time string("14:15:00@PST")=="14:15:00-08:00"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#fromTimeString_java_lang_String_

subtract years from

sM

Calendar(Calendar,int)

subtractYearsFrom

arg1よりもarg2の年数だけ前の新しいCalendarを戻します。JavaDate.subtract years from("2009-01-01",1)=="2008-01-01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#subtractYearsFrom_java_util_Calendar__int_

subtract months from

sM

Calendar(Calendar,int)

subtractMonthsFrom

arg1よりもarg2の月数だけ前の新しいCalendarを戻します。JavaDate.subtract months from("2009-01-01",1)=="2008-12-01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#subtractMonthsFrom_java_util_Calendar__int_

subtract weeks from

sM

Calendar(Calendar,int)

subtractWeeksFrom

arg1よりも7*arg2の日数だけ前の新しいCalendarを戻します。JavaDate.subtract weeks from("2009-01-01",1)=="2008-12-25"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#subtractWeeksFrom_java_util_Calendar__int_

subtract days from

sM

Calendar(Calendar,int)

subtractDaysFrom

arg1よりもarg2の日数だけ前の新しいCalendarを戻します。JavaDate.subtract days from("2009-01-01",1)=="2008-12-31"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#subtractDaysFrom_java_util_Calendar__int_

subtract hours from

sM

Calendar(Calendar,int)

subtractHoursFrom

arg1よりもarg2の時間数だけ前の新しいCalendarを戻します。JavaDate.subtract hours from("01:01:01",1)=="00:01:01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#subtractHoursFrom_java_util_Calendar__int_

subtract minutes from

sM

Calendar(Calendar,int)

subtractMinutesFrom

arg1よりもarg2の分数だけ前の新しいCalendarを戻します。JavaDate.subtract minutes from("01:01:01",1)=="01:00:01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#subtractMinutesFrom_java_util_Calendar__int_

subtract seconds from

sM

Calendar(Calendar,int)

subtractSecondsFrom

arg1よりもarg2の秒数だけ前の新しいCalendarを戻します。JavaDate.subtract seconds from("01:01:01",61)=="01:00:00"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#subtractSecondsFrom_java_util_Calendar__int_

subtract milliseconds from

sM

Calendar(Calendar,int)

subtractMillisecondsFrom

arg1よりもarg2のミリ秒数だけ前の新しいCalendarを戻します。JavaDate.subtract milliseconds from("01:01:01",61)=="01:01:00.939"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#subtractMillisecondsFrom_java_util_Calendar__int_

subtract duration from

sM

Calendar(Calendar,XMLDuration)

subtractDurationFrom

arg1よりもarg2の期間だけ前の新しいCalendarを戻します。JavaDate.subtract duration from("2009-12-30T23:59:00",Duration.from string("P1DT1M"))=="20009-12-29T23:58:00"

http://www.w3.org/TR/rif-dtb/#func: add-dayTimeDuration-to-dateTime_.28adapted_from_op: subtract-dayTimeDuration-from-dateTime.29

http://www.w3.org/TR/rif-dtb/#func: subtract-yearMonthDuration-from-dateTime_.28adapted_from_op: add-yearMonthDuration-to-dateTime.29

to date string

sM

String(Calendar)

toDateString

arg1のISO 8601字句表現を戻します。timeコンポーネントは無視されます。JavaDate.to date string("2010-07-04T12:30:00Z")=="2010-07-04Z"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#toDateString_java_util_Calendar_

to datetime string

sM

String(Calendar)

toDateTimeString

arg1のISO 8601字句表現を戻します。JavaDate.to datetime string("2010-07-04T12:30:00Z")=="2010-07-04T12:30:00.000Z"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#toDateTimeString_java_util_Calendar_

to time string

sM

String(Calendar)

toTimeString

arg1のISO 8601字句表現を戻します。dateコンポーネントは無視されます。JavaDate.to time string("2010-07-04T12:30:00Z")=="12:30:00.000Z"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/JavaDate.html#toTimeString_java_util_Calendar_

表B-16に、XMLGregorianCalendarクラスを示します。

表B-16 XMLGregorianCalendarクラスの表

OBR名

種類

署名

Java名

説明

参照

XMLGregorianCalendar

Cl

-

javax.xml.datatype.XMLGregorianCalendar

W3C XMLスキーマ1.0の日付(date/time)データ型の表現。

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html

normalize

M

XMLGregorianCalendar()

-

このインスタンスをUTCに正規化します。XMLDate.from string("2000-03-04T23:00:00+03:00").normalize()==XMLDate.from string("2000-03-04T20:00:00Z")

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#normalize()

toGregorianCalendar

M

java.util.GregorianCalendar()

-

このXMLGregorianCalendarをCalendar(のサブクラス)に変換します。XMLDate.from string("2010-02-03").toGregorianCalendar()==(Calendar)"2010-02-03"

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#toGregorianCalendar()

year

P

int

-

このカレンダの年、またはInteger.MIN_VALUE(未定義の場合)。XMLDate.from string("2011-12-31").year==2011

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#getYear()

month

P

int

-

このカレンダの月、またはInteger.MIN_VALUE(未定義の場合)。月は1ベースで、Janは1月です。XMLDate.from string("2011-12-31").month==12

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#getMonth()

day

P

int

-

このカレンダの日、またはInteger.MIN_VALUE(未定義の場合)。XMLDate.from string("2011-12-31").day==31

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#getDay()

hour

P

int

-

このカレンダの時間、またはInteger.MIN_VALUE(未定義の場合)。XMLDate.from string("2011-12-31").hour==Integer.MIN_VALUE

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#getHour()

minute

P

int

-

このカレンダの分、またはInteger.MIN_VALUE(未定義の場合)。XMLDate.from string("2011-12-31T09:30:00").minute==30

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#getMinute()

second

P

int

-

このカレンダの秒、またはInteger.MIN_VALUE(未定義の場合)。XMLDate.from string("09:30:05Z").second==5

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#getSecond()

timezone

P

int

-

このカレンダの分単位のタイムゾーン・オフセット、またはInteger.MIN_VALUE(未定義の場合)。XMLDate.from string("09:30:00-09:00").timezone==-540

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#getTimezone()

表B-17に、XMLDateクラスを示します。

表B-17 XMLDateクラスの表

OBR名

種類

署名

Java名

説明

参照

XMLDate

Cl

-

oracle.rules.rl.extensions.XMLDate

XMLGregorianCalendarを不変オブジェクトとして使用するためのヘルパー・クラス。カレンダを不変オブジェクトとして処理することでエラーを防止できます。

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html

add years to

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

addYearsTo

arg1よりもarg2の年数だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add years to("2009-01-01",1)=="2010-01-01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #addYearsTo_javax_xml_datatype_XMLGregorianCalendar__int_

add months to

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

addMonthsTo

arg1よりもarg2の月数だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add months to("2009-01-01",1)=="2009-02-01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #addMonthsTo_javax_xml_datatype_XMLGregorianCalendar__int_

add weeks to

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

addWeeksTo

arg1よりも7*arg2の日数だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add weeks to("2009-01-01",1)=="2009-01-08"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #addWeeksTo_javax_xml_datatype_XMLGregorianCalendar__int_

add days to

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

addDaysTo

arg1よりもarg2の日数だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add days to("2009-01-01",1)=="2009-01-02"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #addDaysTo_javax_xml_datatype_XMLGregorianCalendar__int_

add hours to

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

addHoursTo

arg1よりもarg2の時間数だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add hours to("01:01:01",1)=="02:01:01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #addHoursTo_javax_xml_datatype_XMLGregorianCalendar__int_

add minutes to

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

addMinutesTo

arg1よりもarg2の分数だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add minutes to("01:01:01",1)=="01:02:01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #addMinutesTo_javax_xml_datatype_XMLGregorianCalendar__int_

add seconds to

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

addSecondsTo

arg1よりもarg2の秒数だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add seconds to("01:01:01",61)=="01:02:02"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #addSecondsTo_javax_xml_datatype_XMLGregorianCalendar__int_

add milliseconds to

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

addMillisecondsTo

arg1よりもarg2のミリ秒数だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add milliseconds to("01:01:01",61)=="01:01:01.061"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #addMillisecondsTo_javax_xml_datatype_XMLGregorianCalendar__int_

add duration to

sM

XMLGregorianCalendar(XMLGregorianCalendar,XMLDuration)

addDurationTo

arg1よりもarg2の期間だけ後の新しいXMLGregorianCalendarを戻します。XMLDate.add duration to("2009-12-30T23:59:00",Duration.from string("P1DT1M"))=="2010-01-01"

http://www.w3.org/TR/rif-dtb/#func:add-yearMonthDuration-to-dateTime_.28 adapted_from_op:add-yearMonthDuration-to-dateTime.29

http://www.w3.org/TR/rif-dtb/#func:add-dayTimeDuration-to-dateTime_.28 adapted_from_op:add-dayTimeDuration-to-dateTime.29

from string

sM

XMLGregorianCalendar(String)

fromString

拡張型ISO 8601のdateリテラルでarg1のXMLGregorianCalendarを作成します。XMLDate.from string("2010-02-06-08:00")=="2010-02-06-08:00"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #fromString_java_lang_String_

subtract years from

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

subtractYearsFrom

arg1よりもarg2の年数だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract years from("2009-01-01",1)=="2008-01-01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #subtractYearsFrom_javax_xml_datatype_XMLGregorianCalendar__int_

subtract months from

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

subtractMonthsFrom

arg1よりもarg2の月数だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract months from("2009-01-01",1)=="2008-12-01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #subtractMonthsFrom_javax_xml_datatype_XMLGregorianCalendar__int_

subtract weeks from

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

subtractWeeksFrom

arg1よりも7*arg2の日数だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract weeks from("2009-01-01",1)=="2008-12-25"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #subtractWeeksFrom_javax_xml_datatype_XMLGregorianCalendar__int_

subtract days from

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

subtractDaysFrom

arg1よりもarg2の日数だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract days from("2009-01-01",1)=="2008-12-31"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #subtractDaysFrom_javax_xml_datatype_XMLGregorianCalendar__int_

subtract hours from

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

subtractHoursFrom

arg1よりもarg2の時間数だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract hours from("01:01:01",1)=="00:01:01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #subtractHoursFrom_javax_xml_datatype_XMLGregorianCalendar__int_

subtract minutes from

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

subtractMinutesFrom

arg1よりもarg2の分数だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract minutes from("01:01:01",1)=="01:00:01"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #subtractMinutesFrom_javax_xml_datatype_XMLGregorianCalendar__int_

subtract seconds from

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

subtractSecondsFrom

arg1よりもarg2の秒数だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract seconds from("01:01:01",61)=="01:00:00"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #subtractSecondsFrom_javax_xml_datatype_XMLGregorianCalendar__int_

subtract milliseconds from

sM

XMLGregorianCalendar(XMLGregorianCalendar,int)

subtractMillisecondsFrom

arg1よりもarg2のミリ秒数だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract milliseconds from("01:01:01",61)=="01:01:00.939"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #subtractMillisecondsFrom_javax_xml_datatype_XMLGregorianCalendar__int_

subtract duration from

sM

XMLGregorianCalendar(XMLGregorianCalendar,XMLDuration)

subtractDurationFrom

arg1よりもarg2の期間だけ前の新しいXMLGregorianCalendarを戻します。XMLDate.subtract duration from("2009-12-30T23:59:00",Duration.from string("P1DT1M"))=="20009-12-29T23:58:00"

http://www.w3.org/TR/rif-dtb/#func:subtract-yearMonthDuration-from-dateTime_.28 adapted_from_op:subtract-yearMonthDuration-from-dateTime.29

http://www.w3.org/TR/rif-dtb/#func:subtract-dayTimeDuration-from-dateTime_.28 adapted_from_op:subtract-dayTimeDuration-from-dateTime.29

to string

sM

String(XMLGregorianCalendar)

toString

arg1のISO 8601字句表現を戻します。XMLDate.to string("2010-04-15T11:00:00-09:00")=="2010-04-15T11:00:00-09:00"

http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10663/oracle/rules/rl/extensions/XMLDate.html #toString_javax_xml_datatype_XMLGregorianCalendar_

is datetime

sM

boolean(XMLGregorianCalendar)

isDateTime

このカレンダに日付と時間の両方のフィールドが含まれていることをチェックします。XMLDate.is datetime("2009-12-30T23:59:00")==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

is datetime stamp

sM

boolean(XMLGregorianCalendar)

isDateTimeStamp

このカレンダに日付、時間、タイムゾーンのフィールドが含まれていることをチェックします。XMLDate.is datetime stamp("2009-12-30T23:59:00")==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

is date

sM

boolean(XMLGregorianCalendar)

isDate

このカレンダに日付フィールドが含まれていて、時間フィールドが含まれていないことをチェックします。XMLDate.is date("2009-12-30")==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

is time

sM

boolean(XMLGregorianCalendar)

isTime

このカレンダに時間フィールドが含まれていて、日付フィールドが含まれていないことをチェックします。XMLDate.is time("2009-12-30T23:59:00")==false

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

get timezone

sM

XMLDuration(XMLGregorianCalendar)

getTimezone

カレンダからタイムゾーンを期間として取得します。XMLDate.get timezone("11:00:00+05:30")==Duration.from string("PT5H30M")

-

get seconds

sM

BigDecimal(XMLGregorianCalendar)

getSeconds

カレンダから小数部を含む秒数をBigDecimalとして取得します。XMLDate.get seconds("00:00:12.345")==12.345

-

表B-18に、OracleDateクラスを示します。

表B-18 OracleDateクラスの表

OBR名

種類

署名

Java名

説明

OracleDate

Cl

-

oracle.rules.sdk2.extensions.OracleDate

oracle.jbo.domain.Timestampを使用するためのヘルパー・クラス。メソッドの使用方法は、同じ名前のXMLDateメソッドを参照してください。

add years to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

addYearsTo

arg1よりもarg2の年数だけ後の新しいoracle.jbo.domain.Timestampを戻します。

add months to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

addMonthsTo

arg1よりもarg2の月数だけ後の新しいoracle.jbo.domain.Timestampを戻します。

add weeks to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

addWeeksTo

arg1よりも7*arg2の日数だけ後の新しいoracle.jbo.domain.Timestampを戻します。

add days to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

addDaysTo

arg1よりもarg2の日数だけ後の新しいoracle.jbo.domain.Timestampを戻します。

add hours to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

addHoursTo

arg1よりもarg2の時間数だけ後の新しいoracle.jbo.domain.Timestampを戻します。

add minutes to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

addMinutesTo

arg1よりもarg2の分数だけ後の新しいoracle.jbo.domain.Timestampを戻します。

add seconds to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

addSecondsTo

arg1よりもarg2の秒数だけ後の新しいoracle.jbo.domain.Timestampを戻します。

add milliseconds to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

addMillisecondsTo

arg1よりもarg2のミリ秒数だけ後の新しいoracle.jbo.domain.Timestampを戻します。

add duration to

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,XMLDuration)

addDurationTo

arg1よりもarg2の期間だけ後の新しいoracle.jbo.domain.Timestampを戻します。

from string

sM

oracle.jbo.domain.Timestamp(String)

fromString

拡張型ISO 8601のdateリテラルでarg1のoracle.jbo.domain.Timestampを作成します。

subtract years from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

subtractYearsFrom

arg1よりもarg2の年数だけ前の新しいoracle.jbo.domain.Timestampを戻します。

subtract months from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

subtractMonthsFrom

arg1よりもarg2の月数だけ前の新しいoracle.jbo.domain.Timestampを戻します。

subtract weeks from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

subtractWeeksFrom

arg1よりも7*arg2の日数だけ前の新しいoracle.jbo.domain.Timestampを戻します。

subtract days from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

subtractDaysFrom

arg1よりもarg2の日数だけ前の新しいoracle.jbo.domain.Timestampを戻します。

subtract hours from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

subtractHoursFrom

arg1よりもarg2の時間数だけ前の新しいoracle.jbo.domain.Timestampを戻します。

subtract minutes from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

subtractMinutesFrom

arg1よりもarg2の分数だけ前の新しいoracle.jbo.domain.Timestampを戻します。

subtract seconds from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

subtractSecondsFrom

arg1よりもarg2の秒数だけ前の新しいoracle.jbo.domain.Timestampを戻します。

subtract milliseconds from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,int)

subtractMillisecondsFrom

arg1よりもarg2のミリ秒数だけ前の新しいoracle.jbo.domain.Timestampを戻します。

subtract duration from

sM

oracle.jbo.domain.Timestamp(oracle.jbo.domain.Timestamp,XMLDuration)

subtractDurationFrom

arg1よりもarg2の期間だけ前の新しいoracle.jbo.domain.Timestampを戻します。

to string

sM

String(oracle.jbo.domain.Timestamp)

toString

arg1のISO 8601字句表現を戻します。

表B-19に、Durationクラスを示します。

表B-19 Durationクラスの表

OBR名

種類

署名

Java名

説明

参照

Duration

Cl

-

oracle.rules.sdk2.extensions.OracleDuration

日付を比較および減算するためのヘルパー・クラス。2つの日付の差分をXMLDurationに変換できます。リテラル(文字列)表現からXMLDurationを作成することもできます。日時および年月のXMLDurationsのみがサポートされています。

-

compare

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

-

arg1<arg2の場合は-1、arg1==arg2の場合は0、arg1>arg2の場合は1をそれぞれ戻します。Duration.compare("2010-01-01","2010-02-02")==-1

http://www.w3.org/TR/rif-dtb/#pred:date Time-less-than_.28adapted_from_op:dateTime-less-than.29

years between

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

yearsBetween

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。Duration.years between("2008-01-01", "2009-02-02")==1

-

months between

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

monthsBetween

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。Duration.months between("2009-01-01","2008-02-02")==-10

-

weeks between

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

weeksBetween

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。Duration.weeks between("2000-01-01","2000-02-04")==4

-

days between

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

daysBetween

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。Duration.days between("2000-01-01","2000-02-04")==34

-

hours between

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

hoursBetween

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。Duration.hours between("2000-01-04T03:30:00","2000-01-01T00:00:00")==-75

-

minutes between

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

minutesBetween

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。Duration.minutes between("03:30:00","04:45:00")==75

-

seconds between

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

secondsBetween

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。Duration.seconds between("03:30:00","03:31:15")==75

-

milliseconds between

sM

int(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

millisecondsBetween

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。Duration.milliseconds between("03:30:00","03:31:15")==75000

between

sM

XMLDuration(Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp, Calendar|XMLGregorianCalendar|oracle.jbo.domain.Timestamp)

between

arg2からarg1を減算します。これらの引数はなんらかの種類の日付/時間です。日時の期間(Duration)を戻します。Duration.between("2009-01-01T01:15:00","2009-02-02T11:30:00")==Duration.from string("P32DT10H15M")

http://www.w3.org/TR/rif-dtb/#func:subtract-date Times_.28adapted_from_op:subtract-dateTimes.29

from string

sM

XMLDuration(String)

fromString

ISO 8601のdurationリテラルの期間を解析します。"P1DT2H3M"は、1日、2時間、3分の期間です。

http://www.w3.org/TR/xpath-functions/#duration-subtypes

compare durations

sM

int(XMLDuration,XMLDuration)

compareDurations

2つの期間を比較します。両方が日時または年月の期間の必要があります。arg1<arg2の場合は-1、arg1==arg2の場合は0、arg1>arg2の場合は1をそれぞれ戻します。Duration.compare(Duration.from string("P1Y"),Duration.from string("P13M"))==-1

http://www.w3.org/TR/rif-dtb/#pred:dayTimeDuration-less-than_.28 adapted_from_op:dayTimeDuration-less-than.29

http://www.w3.org/TR/rif-dtb/#pred:yearMonthDuration-less-than_.28 adapted_from_op:yearMonthDuration-less-than.29

is day-time duration

sM

boolean(XMLDuration)

isDayTimeDuration

arg1がday-timeの期間であることをチェックします。day-timeおよびyear-monthの期間のみがサポートされています。Duration.is day-time duration(Duration.from string("P2DT1S"))==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

is year-month duration

sM

boolean(XMLDuration)

isYearMonthDuration

arg1がyear-monthの期間であることをチェックします。day-timeおよびyear-monthの期間のみがサポートされています。Duration.is year-month duration(Duration.from string("P13M"))==true

http://www.w3.org/TR/rif-dtb/#Guard_Predicates_for_Datatypes

get seconds

sM

BigDecimal(XMLDuration)

getSeconds

期間から秒数フィールドをBigDecimalとして取得します(小数点以下の秒数を含む)。Duration.get seconds(Duraton.from string("PT12.345S"))==12.345

http://www.w3.org/TR/rif-dtb/#func:seconds-from-duration_.28 adapted_from_fn:seconds-from-duration.29

divide

sM

XMLDuration(XMLDuration,int|double)

-

整数またはdoubleの除数によって期間を除算します。Duration.divide(Duration.from string("P1Y"),4)==Duration.from string("P3M")

http://www.w3.org/TR/rif-dtb/#func:divide-dayTimeDuration_.28 adapted_from_op:divide-dayTimeDuration.29

http://www.w3.org/TR/rif-dtb/#func:divide-yearMonthDuration_.28 adapted_from_op:divide-yearMonthDuration.29

ratio

sM

BigDecimal(XMLDuration,XMLDuration)

-

2つの期間の比率をBigDecimalとして計算します。Duration.ratio(Duration.from string("P1Y"),Duration.from string("P3M"))==4

http://www.w3.org/TR/rif-dtb/#func:divide-dayTimeDuration-by-dayTimeDuration_.28 adapted_from_op:divide-dayTimeDuration-by-dayTimeDuration.29

http://www.w3.org/TR/rif-dtb/#func:divide-yearMonthDuration-by-yearMonthDuration_.28 adapted_from_op:divide-yearMonthDuration-by-yearMonthDuration.29

表B-20に、XMLDurationクラスを示します。

表B-20 XMLDurationクラスの表

OBR名

種類

署名

Java名

説明

参照

XMLDuration

Cl

-

javax.xml.datatype.Duration

W3C XMLスキーマ1.0仕様で定義された、時間範囲の不変表現。day-timeおよびyear-monthのXMLDurationのみがサポートされています。

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/Duration.html

http://www.w3.org/TR/xpath-functions/#duration-subtypes

years

P

int

-

期間の年のフィールド。Duration.from string("P2Y3M").years==2

http://www.w3.org/TR/rif-dtb/#func: years-from-duration_.28adapted_from_fn:years-from-duration.29

months

P

int

-

期間の月のフィールド。Duration.from string("P2Y3M").months==2

http://www.w3.org/TR/rif-dtb/#func: months-from-duration_.28adapted_from_fn:months-from-duration.29

days

P

int

-

期間の日のフィールド。Duration.from string("P1DT2H3M4S").days==1

http://www.w3.org/TR/rif-dtb/#func: days-from-duration_.28adapted_from_fn:days-from-duration.29

hours

P

int

-

期間の時間のフィールド。Duration.from string("P1DT2H3M4S").hours==2

http://www.w3.org/TR/rif-dtb/#func: hours-from-duration_.28adapted_from_fn:hours-from-duration.29

minutes

P

int

-

期間の分のフィールド。Duration.from string("P1DT2H3M4S").minutes==3

http://www.w3.org/TR/rif-dtb/#func: minutes-from-duration_.28adapted_from_fn:minutes-from-duration.29

seconds

P

int

-

期間の秒のフィールド。Duration.from string("P1DT2H3M4S").seconds==4

http://www.w3.org/TR/rif-dtb/#func: seconds-from-duration_.28adapted_from_fn:seconds-from-duration.29

sign

P

int

-

この期間の符号を-1、0、1のいずれかで戻します。Duration.from string("-P1Y").sign==-1

-

add

M

XMLDuration(XMLDuration)

-

2つの期間を加算します。Duration.from string("P6M").add(Duration.from string("P6M"))==Duration.from string("P1Y")

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/Duration.html#add(javax.xml.datatype.Duration)

subtract

M

XMLDuration(XMLDuration)

-

2つの期間を減算します。Duration.from string("P6M").subtract(Duration.from string("P6M"))==Duration.from string("P0Y")

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/Duration.html#subtract(javax.xml.datatype.Duration)

multiply

M

XMLDuration(BigDecimal|int)

-

arg1の期間にarg2のファクタを乗算します。Duration.from string("P6M").multiply(2)==Duration.from string("P1Y")

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/Duration.html#multiply(java.math.BigDecimal)

negate

M

XMLDuration()

-

たとえば、Duration.between(arg1,arg2)に対する引数を逆転させたりすると、期間を負にできます。Duration.from string("P6M").negate()==Duration.from string("-P6M")

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/Duration.html#negate()

to string

M

String()

toString

この期間のISO8601リテラル表現を取得します。Duration.from string("P6M").to string()=="P6M"

-

表B-21に、CurrentDateクラスを示します。

表B-21 CurrentDateクラスの表

OBR名

種類

署名

Java名

説明

CurrentDate

Cl

-

oracle.rules.rl.extensions.CurrentDate

現在の日付のホルダのファクト・タイプ。ルール・パターンで使用できます。

date

P

Calendar

-

現在の日付を戻します。

B.5 その他のクラス

この項では、Oracle Business Rulesで提供されるその他のクラスについて説明します。

表B-22に、JAXBElementクラスを示します。

表B-22 JAXBElementクラスの表

OBR名

種類

署名

Java名

説明

参照

JAXBElement

Cl

-

javax.xml.bind.JAXBElement

XMLファクト・タイプのXML要素情報を表します。

http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBElement.html

nil

P

boolean

-

nil要素は、(XMLでは)欠落要素と同じものではありません。

http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBElement.html#isNil()

value

P

Object

-

XMLファクト・タイプへの参照です。

http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBElement.html#getValue()

表B-23に、Objectクラスを示します。

表B-23 Objectクラスの表

OBR名

種類

署名

Java名

説明

参照

Object

Cl

-

java.lang.Object

すべてのJavaオブジェクトの基本クラス。

http://java.sun.com/javase/6/docs/api/java/lang/Object.html

B.6 関数

この項では、Oracle Business Rulesの関数を示します。

表B-24に、Oracle Business Rulesで提供される様々な関数を示します。

表B-24 Oracle Business Rulesで提供される様々な関数の表

OBR名

署名

RL名

説明

参照

print

void(Object)

println

arg1の文字列値を印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.assert a tree of facts

Object(Object)

assertTree

arg1の参照可能なファクト・タイプのツリーをルートとしてアサート(作業メモリーに挿入)します。arg1を戻します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.assert

Object(Object)

assert

arg1をアサート(arg1を作業メモリーに挿入)します。arg1を戻します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.retract

void(Object)

retract

オブジェクトarg1に関連付けられたファクトを作業メモリーから削除します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.get fact ID

int(Object)

id

オブジェクトarg1に関連付けられたファクトIDを戻します。arg1がファクトに関連付けられていない場合は、-1が戻されます。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.get fact by ID

Object(int)

object

特定のファクトIDに関連付けられているオブジェクトを戻します。ファクトIDがない場合は、nullが戻されます。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.get firing rule name

String

-

ルール・アクション内で呼び出される場合、現在起動しているルールの名前を返します。それ以外の場合はnullを返します。

-

RL.contains

boolean(List,Object)

contains

contains()関数はJava Collectionのcontains()メソッドに似ていますが、コレクション内のJAXBElementの存在を処理する機能を持っています。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.suppress rule test errors

boolean(boolean)

-

ルール・テストの評価中のエラーをルール・エンジンによって抑止する必要がある場合に更新します。

-

RL.are rule test errors suppressed

boolean()

-

ルール・テストの評価中のエラーをルール・エンジンによって抑止する場合に問い合せます。

-

RL.ruleset stack.push

void(String)

pushRuleset

arg1(ルールセットの名前)をルールセット・スタックに追加します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.ruleset stack.pop

String()

popRuleset

ルールセット・スタックの最上部のルールセット名をポップして戻します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.ruleset stack.get

String[]()

getRulesetStack

ルールセット・スタックを文字列配列として戻します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.ruleset stack.set

void(String[])

setRulesetStack

ルールセット・スタックをarg1(文字列配列)に設定します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.ruleset stack.clear

void()

clearRulesetStack

すべてのルールセット名をルールセット・スタックからポップします。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.date.get current

Calendar()

getCurrentDate

CurrentDateファクトに関連付けられている日付を戻します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.date.set current

void(Calendar)

setCurrentDate

エンジンが管理している現在の日付を表すファクトに基づいて判断する(CurrentDateファクトを使用)ための日付を設定します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.date.get effective

Calendar()

getEffectiveDate

有効日の現在の値を戻します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.date.set effective

void(Calendar)

setEffectiveDate

ルール・エンジンの有効日を更新します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.watch.rules

void()

watchRules

ルールの起動(アクティブ化の実行)に関する情報を印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.watch.activations

void()

watchActivations

アジェンダに対するアクティブ化の追加または削除に関する情報を印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.watch.facts

void()

watchFacts

作業メモリー内のファクトのアサート、取消しまたは変更に関する情報を印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.watch.focus

void()

watchFocus

ルールセット・スタックに対するルールセットの追加またはポップ(削除)に関する情報を印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.watch.compilations

void()

watchCompilations

既存のルールとの条件パーツの共有方法に関する情報を印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.watch.all

void()

watchAll

ルール、ファクト、アクティブ化、フォーカス、コンパイルに関する情報を印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.stop watching.rules

void()

clearWatchRules

ルールの起動に関する情報の印刷を中止します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.stop watching.activations

void()

clearWatchActivations

アジェンダに対するアクティブ化の追加または削除に関する情報の印刷を中止します

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.stop watching.facts

void()

clearWatchFacts

作業メモリー内のファクトのアサート、取消しまたは変更に関する情報の印刷を中止します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.stop watching.focus

void()

clearWatchFocus

ルールセット・スタックに対するルールセットの追加またはポップ(削除)に関する情報の印刷を中止します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.stop watching.compilations

void()

clearWatchCompilations

既存のルールとの条件パーツの共有方法に関する情報の印刷を中止します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.stop watching.all

void()

clearWatchAll

ルール、ファクト、アクティブ化、フォーカス、コンパイルに関する情報の印刷を中止します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.show.facts

void()

showFacts

作業メモリー内のすべてのファクトを印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.show.activations

void()

showActivations

アジェンダのすべてのアクティブ化を印刷します。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

C Oracle Business Rulesに関するよくある質問

この付録では、Oracle Business Rulesに関するよくある質問を紹介します。

- JavaオブジェクトをファクトとしてアサートしてからModifyアクションを使用せずに変更すると、ルールが起動しないのはなぜですか。

- Oracle Business Rules RL LanguageとJavaの相違はなんですか。

- RuleSessionでは並行性と同期化はどのように処理されますか。

- 自己結合を正しく表現するにはどうすればよいですか。

- Oracle Business Rulesではプロパティ変更リスナーをどのように使用しますか。

- Oracle Business Rulesでデシジョン・サービスを使用する場合にどのような制限がありますか。

- ルールにJavaコードを挿入するにはどうすればよいですか。

- BPELでデシジョン・サービスにJavaベース・ファクトを使用することはできますか。

- BPELデシジョン・サービスでデバッグ機能を有効化するにはどうすればよいですか。

- Oracle Business Rulesでバージョニングをサポートするにはどうすればよいですか。

- ルールおよびデシジョン表で優先度を使用する場合、優先度の順序はどうなりますか。

- xsd:string入力済要素を持つXMLスキーマをタイプJAXBElementとしてインポートするのはなぜですか。

- Javaクラスに加えた変更がデータ・モデルに反映されないのはなぜですか。

- Rules SDKを使用して式にNULLを含めるにはどうすればよいですか。

- ディクショナリを格納するためのリポジトリとしてWebDAVがサポートされていますか。

- ルール・デザイナによるソース・コード制御システムの使用

C.1 JavaオブジェクトをファクトとしてアサートしてからModifyアクションを使用せずに変更すると、ルールが起動しないのはなぜですか。

Javaオブジェクトをアサートした後でModifyアクションを使用せずに変更した場合は、オブジェクトをRules Engineに再アサートする必要があります。

したがって、変更したJavaオブジェクトに関連付けられたルールが起動しない場合は、Rules Engineでルール条件が再評価されておらず、ルールもアクティブ化されていないことを意味します。このため、Modifyアクションを使用せずにJavaオブジェクトを変更した場合には、オブジェクトをRules Engineに再アサートする必要があります。

C.2 Oracle Business Rules RL LanguageとJavaの相違はなんですか。

Oracle Business Rules RL LanguageとJavaとの間には多くの相違があります。

Oracle Business Rules RL LanguageとJavaの相違の詳細は、『Oracle Business Process Managementルール言語リファレンス』の付録Aを参照してください。

C.3 RuleSessionでは並行性と同期化はどのように処理されますか。

Oracle Business Rules RuleSessionオブジェクトに対するメソッド・コールは、複数のスレッドによるコールによって、RuleSessionレベルでの例外が発生しないようにスレッド・セーフになっています。ただし、メソッドの実行に排他性やトランザクション保証はありません。Rules Engineの最低レベルのrunメソッドは同期化されるため、共有RuleSessionを持つ2つのスレッドは同時にrunを実行できません。runへの一方のコールは、もう一方のコールが終了するまで待機する必要があります。

Oracle Business Rules関数は、デフォルトでは同期化されません。Javaメソッド同様、Oracle Business Rules関数は並行して実行可能であり、プログラマは同期化されたブロックを使用して共有データ(たとえば、結果データを含むHashMap)へのアクセスを保護する必要があります。

トランザクションのような形式で実行する必要があるアクション・セットでは、共有オブジェクトに関する同期化が必要になります。RuleSessionオブジェクトに関する同期化はできません。RuleSessionメソッドのコール時にスローされる例外で、RuleSessionオブジェクトの破棄が必要になる場合があるからです。

RuleSessionオブジェクトをOracle Business Rulesで使用するほとんどの場合、各スレッドまたはサーブレット・インスタンスは、ローカルのRuleSessionオブジェクトを作成して使用する必要があります。この使用パターンは、この方法でJDBC接続を使用した場合とおおよそ似ています。

次の例は、共有RuleSessionオブジェクトを使用する方法を示しています。

Thread-1が次のものを含む場合:

ruleSession.callFunctionWithArgument("assert", singleFact1);
ruleSession.callFunctionWithArgument("assert", singleFact2);

Thread-2が次のものを含む場合:

ruleSession.callFunction("run");
ruleSession.callFunction("clear");

このケースでは、2つのスレッドの実行が次のコード例のように進み、Oracle Business Rulesの共有rulesessionオブジェクトを示すことがあります。

Thread-1:  ruleSession.callFunctionWithArgument("assert", singleFact1);
Thread-2:  ruleSession.callFunction("run");
Thread-2:  ruleSession.callFunction("clear");
Thread-1:  ruleSession.callFunctionWithArgument("assert", singleFact2);

前の例では、Thread-1がアサートした2つのファクトの両方が、runへのコール中にRuleSessionに存在することはありません。また、1つのスレッドのみがrunメソッドをコールすることに注意してください。共有RuleSessionで複数のスレッドからrunをコールできるデザインを使用すると、非常に見つけにくい不具合が作成される可能性があり、パフォーマンス上の利点はありません。

共有RuleSessionオブジェクトに対するすべてのアクセスを同期化して、意図した動作を保証する必要があります。ただし、RuleSessionインスタンスが例外をスローして回復不能になることがあるため、このオブジェクトを同期化オブジェクトとしては使用しないでください。かわりに、別の共有オブジェクトを同期点として使用します。

候補としては、共有サーバー・プロセス・プロデューサが考えられます。RuleSession用のコンシューマ・モデルです。このモデルでは、複数のスレッドが共有のRuleSessionにファクトをアサートし、1つのスレッドが定期的にrunをコールし、結果を読み取って出力します。これにより、2つのコード・セグメントが必ずシリアルに実行され、混在できなくなるので、スレッドの競合が発生しなくなります。例C-1、例C-2、例C-3の共有オブジェクト、プロデューサ・コード、コンシューマ・コードを使用したコード例を参照してください。

C.3.1 RuleSessionのサンプル共有オブジェクト

例C-1に共有オブジェクトを含むコードを示します。

例C-1 RuleSessionの共有オブジェクト

RuleSession ruleSession;
Object ruleSessionLock = new Object();

C.3.2 RuleSessionのサンプル・プロデューサ・コード

例C-2にプロデューサ・コードを示します。

例C-2 RuleSessionのプロデューサ・コード

public String addFacts(FactTypeA fa, FactTypeB fb, FactTypeC fc){
String status = "";
synchronized(ruleSessionLock){
try {
ruleSession.callFunctionWithArgument("assert", fa);
ruleSession.callFunctionWithArgument("assert", fb);
status = "success";
} catch (Exception e) {
// a method that creates a new RuleSession loads it with rules
initializeRuleSession();
status = "failure";
}
return status;
}

C.3.3 RuleSessionのサンプル・コンシューマ・コード

例C-3にコンシューマ・コードを示します。

例C-3 RuleSessionのコンシューマ・コード

public List exec(){
synchronized(ruleSessionLock){
try {
ruleSession.callFunction("run");
List results = (List)ruleSession.callFunction("getResults");
ruleSession.callFunction("clearResults");
return results;
}  catch (Exception e) {
// a method that creates a new RuleSession loads it with rules
initializeRuleSession();
return null;
}
}
}

注意:

複数のスレッドがRuleSessionオブジェクトを共有している場合、複数のスレッドがrunメソッドをコールすると、非常に見つけにくい不具合が作成される可能性があり、パフォーマンス上の利点はありません。

C.4 自己結合を正しく表現するにはどうすればよいですか。

ファクトを使用した場合、Oracle RLのランタイム動作で極端な結果が生成されることがあります。

次の自己結合例のOracle RLコードについて考えてみます。

class F {int i; };
rule r1 {
if (fact F f1 && fact F f2) {
println("Results: " + f1.i + ", " + f2.i);
}
}
assert(new F(i:1));
assert(new F(i:2));
run();

前の例で出力される行数はいくつでしょうか。f1とf2の両方については、同じファクト・インスタンスが一致できるため、答えは4行です。

つまり、この例では次の出力が生成されます。

Results: 2, 2
Results: 2, 1
Results: 1, 2
Results: 1, 1

3番目のFのある同じ例を使用すると(たとえば、assert(new F(i:3));)、9つの行が出力されます。また同時に、3番目の語句&& fact F F3が追加されると、27の行が出力されます。

C.4.1 ファクトFのすべての組合せの検索サンプル

個別のファクトについてすべての組合せおよび順序を見つけようとしている場合は、例C-4に示すように、テスト内に追加語句が必要になります。

例C-4 ファクトFのすべての組合せの検索

rule r1 {
if (fact F F1 && fact F F2 && F1 != F2) {
println("Results: " + F1.i + ", " + F2.i);
}
}

上のコードにより、次の出力が生成されます。

Results: 2, 1
Results: 1, 2

C.4.2 ファクトFの組合せの検索サンプル

ファクトのすべての組合せを検出する最も簡単な方法は、最速ではなく順序も不同ですが、例C-5に示したコードを使用するものです。

例C-5 ファクトFの組合せの検索

rule r1 {
if (fact F F1 && fact F F2 && id(F1) < id(F2)) {
println("Results: " + F1.i + ", " + F2.i);
}
}

C.4.3 高速の完全比較サンプル

例C-5に示した関数id()をテスト・パターンで実行すると直接比較よりも時間がかかります。各オブジェクトで一意の値に対してテストするのが最も速い方法です。たとえば、整数値プロパティoidを、クラスの各インスタンスの固有値を割り当てられたクラスに追加できます。

例C-6は、oid値を使用する同じルールを示しています。

例C-6 高速の完全比較

rule r1 {
if (fact F F1 && fact F F2 && F1.oid < F2.oid) {
println("Results: " + F1.i + ", " + F2.i);
}
}

この問題は、次に示した関数を使用して、Oracle Rules Engineからすべての重複するファクトを削除しようとした場合にも生じることがあります。

rule rRemoveDups {
if (fact F F1 && fact F F2 && F1.i == F2.i) {
retract(F2);
}
}

ただしこのルールでは、重複するファクトだけでなく、タイプFのすべてのファクトが削除されます。F1とF2が同じファクト・インスタンスの可能性があるからです。次の例に、このルールの正しいバージョンを示します。

rule rRemoveDups {
if (fact F F1 && fact F F2 && F1 != F2 && F1.i == F2.i) {
retract(F2);
}
}

C.5 Oracle Business Rulesではプロパティ変更リスナーをどのように使用しますか。

Oracle Rules Engineは、Java PropertyChangeListener設計パターンをサポートしています。これにより、PropertyChangeSupportクラスを使用するJavaファクトのインスタンスは、プロパティ値が変更されたときに自動的にOracle Rules Engineに通知できます。Javaファクトは、Oracle Rules Engineで使用するこのパターンの実装に必須ではありません。

通常、Oracle Rules Engineに対して以前アサートされたJavaオブジェクトのプロパティ値が変更された場合は、新しいプロパティ値でルールを再評価するため、オブジェクトを再アサートする必要があります。PropertyChangeEventを起動するプロパティの場合、これらのプロパティの値を変更すると、値が変更されて、ファクトがOracle Rules Engineに対して再アサートされます。

PropertyChangeListener設計パターンをクラスに実装する手順は次のとおりです。

1. このパッケージをクラスにインポートします。

import java.beans.PropertyChangeSupport;

2. プライベート・メンバー変数をクラスに追加します。

private PropertyChangeSupport m_pcs = null;

3. コンストラクタで、PropertyChangeSupportオブジェクトを作成します。

m_pcs = new PropertyChangeSupport(this);

4. 次の各setterに対して、firePropertyChangeへのコールを追加します。

public void setName( String name ){
String oldVal =  m_name;
m_name = name;
m_pcs.firePropertyChange( "name", oldVal, m_name );
}

5. addPropertyChangeListenerメソッドを実装します(m_pcsに委任します)。

public void addPropertyChangeListener(PropertyChangeListener pcl){
m_pcs.addPropertyChangeListener( pcl );
}

6. removePropertyChangeListenerメソッドを実装します(m_pcsに委任します)。

public removePropertyChangeListener(PropertyChangeListener pcl){
m_pcs.removePropertyChangeListener( pcl );
}

アプリケーションの設計について、変更されたオブジェクトを常に明示的に再アサートするか、またはPropertyChangeListener設計パターンを実装するかを決定する場合は、次の点を考慮してください。

- 変更されたオブジェクトを明示的に再アサートすると、ユーザーは、一部のプロパティ変更をグループ化して、これらを一度にルールに表示できます。これは、並行スレッドがルールを実行しているときに最も便利であり、ルールにはプロパティ変更の完全なグループのみが表示されます。

- 明示的なアサートによって、複数のプロパティが変更された場合に、ルール再評価の計算コストが削減されます。複数のプロパティが同時に変更されると、ファクト・タイプを参照するルール条件の複数の再評価が生じます。これは、各プロパティ変更イベントによってオブジェクトの再アサートが生じるためです。PropertyChangeListenerパターンのかわりに明示的なアサートを使用すると、この余分な計算コストを除去できます。

- 明示的なアサートは、その条件でもテストされるファクトをルールが変更する場合に必要ですが、ガード条件プロパティが設定される前にPropertyChangeListenerで起動される自動再アサートでは、ルールがそれ自体を無限に再起動します。

- 明示的なアサートは、Oracle RLファクトおよびXMLファクトを変更する場合に使用する必要があります。これは、PropertyChangeListener設計パターンをサポートするように、これらを定義できないためです。

- PropertyChangeListener対応ファクトを使用すると、Javaアプリケーションは、アプリケーションで明示的アサートを実行するように変更しなくても、プロパティ変更をルール・エンジンに伝達できます。これはつまり、オブジェクトのプロパティを変更するコードが、範囲内のRuleSessionオブジェクトへの参照を持つ必要がないということでもあります。

- PropertyChangeListenerサポートは、プロパティ変更後のファクトの再アサートを無視するという一般的なエラーを防止します。

C.6 Oracle Business Rulesでデシジョン・サービスを使用する場合にどのような制限がありますか。

BPELプロセスでBusiness Rulesを使用する場合、いくつかの制限があります。

次のような制限があります。

- デシジョン・サービスへの入力として指定できるのは、参照可能なXMLファクト・タイプのみです。

- デシジョン・サービスの出力として指定できるのは、参照可能なXMLファクト・タイプのみです。

他の制限は、「デシジョン・サービスの入力と出力の要素タイプはどのように制限されますか。」を参照してください。

XMLファクト・タイプの参照可能オプションの設定の詳細は、「XMLファクトの使用」を参照してください。

C.7 ルールにJavaコードを挿入するにはどうすればよいですか。

実際、Javaコードをルールに挿入することはありません。

ただし、ルール条件またはアクションからJavaメソッドを起動できます。

C.8 BPELでデシジョン・サービスにJavaベース・ファクトを使用することはできますか。

Oracle BPEL PMが起動できるのは、デシジョン・サービスとして公開されたデシジョン関数のみであるため、デシジョン関数の入力および出力はXMLファクト・タイプである必要があります。

入力XMLファクトをJavaファクトに変換する場合は、Javaファクト・タイプを使用する既存のルールセットまたはデシジョン関数を使用できます。たとえば、convertFromXMLというルールセットになんらかのルールを作成し、このルールセットをデシジョン関数ルールフロー内でJavaルールセットの前に挿入できます。同様に、Javaファクトを出力XMLファクトに変換するルールセットを作成し、このルールセットをデシジョン関数ルールフロー内でJavaルールセットの後に挿入できます。

また、ルールでJavaファクト・タイプのプロパティのみを使用し、メソッドやフィールドを使用しない場合は、次の手順でJavaファクト・タイプをXMLファクト・タイプで置換できます。

1. Javaファクト・タイプを削除します(最初にファクト・タイプおよびプロパティの別名を慎重にメモしてください)。

2. 類似するXMLファクト・タイプをインポートし、そのファクト・タイプおよびプロパティの別名を、削除したJavaファクト・タイプおよびプロパティと同じになるように編集します。

C.9 BPELデシジョン・サービスでデバッグ機能を有効化するにはどうすればよいですか。

BPELデシジョン・サービスに対するルールセット実行中のデバッグ出力を有効化するには、SOAルール・ロガーを有効化します。SOAルール・ロガーがTRACEレベルに設定されていると、watchAllの出力がSOA診断ログに記録されます。Fusion Middleware Controlコンソールを使用してロギング・レベルを変更した場合、指定のレベルを使用するようにアプリケーションを再デプロイする必要はありません。

SOA oracle.soa.service.rulesおよびoracle.soa.services.rules.obrtraceロガーの使用方法の詳細は、『Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』を参照してください。

C.10 Oracle Business Rulesでバージョニングをサポートするにはどうすればよいですか。

Oracle Business Rulesでは、バージョニングがサポートされています。

次の2つの方法が考えられます。

- デザインタイムには、ディクショナリはXMLファイルとしてJDeveloperプロジェクトに格納されます。ディクショナリは、他のソース・ファイルと同じ方法を使用して、ソース・コントロール・システム内でバージョニングできます。

- 実行時には、ディクショナリはMDSに格納されます。MDSがデータベースでバックアップされる場合、バージョニングはMDSを使用してサポートされます。

注意: サーバー・アプリケーションは、ディクショナリ変更がMDS内で参照可能になると、その変更にレスポンスできます。ルール・サービス・エンジン(デシジョン・サービス)では、これが自動的に実行されます。非SCAアプリケーションの場合、これはRuleRepositoryインタフェースを使用して実行できます。この時点では、ドラフト・バージョンをサポートするには、MDSのサンドボックス機能を使用します。Oracle Business RulesのRuleRepositoryインタフェースでは、これがサポートされています。

C.11 ルールおよびデシジョン表で優先度を使用する場合、優先度の順序はどうなりますか。

ルールおよびデシジョン表の優先度は最高から最低までで、優先度の高いルールまたはデシジョン表が先に実行されます。たとえば、優先度1から4のルールを作成すると、各ルールは4、3、2、1という実行優先度の順に実行されます。

ルール・デザイナを使用して、事前定義済の名前が付いた優先度のリストから選択するか、正または負の整数を入力して独自の優先度レベルを指定できます。デフォルトの優先度はmedium(整数値0)です。詳細は、「ルールの優先度の設定方法」を参照してください。

ただし、ルールの純粋な宣言モデルが損なわれるため、できるだけ優先度の使用を避ける必要があることに注意してください。多数の優先度を使用していることに気づいた場合の最善策は、通常、競合を避けるようにルールおよびテストを再構築するか、特定の順序で実行することを意図する場合はルールフローを使用してルールを複数のルールセットに分割することです。競合は、ルールセット内の複数のルールが起動可能な場合に発生します。たとえば、gold customerルールでは$1000を超える支払がある顧客をgold customerとし、silver customerルールでは$500を超える支払がある顧客をsilver customerとする場合、顧客が$1100を支払うと競合が発生します。$500から$1000の間の支払の顧客をテストする場合、ルールに優先度を設定するよりも、silver customerルールを変更する方が明解です。こうした競合分析や競合回避は、デシジョン表を使用すると非常に簡単にできます。デシジョン表の詳細は、「デシジョン表の使用」を参照してください。

ルールセットの順序を変更するには、ルールフローを使用します(これはルールセット・スタックです)。ルールセット・スタックの使用の詳細は、『Oracle Business Process Managementルール言語リファレンス』を参照してください。

C.12 xsd:string入力済要素を持つXMLスキーマをタイプJAXBElementとしてインポートするのはなぜですか。

JAXB 2.0仕様によると、minOccurs="0"およびnillable="true"の属性がある要素のデフォルトの型マッピングは、JAXBElement<T>です。このTは、その要素に対して定義された型のデフォルト・マッピングです。たとえば、xsd:stringはJAXBElement<String>に、xsd:intはJAXBElement<Integer>に、xsd:integerはJAXBElement<BigInteger>にマップされます。

これは、nillable="true"が、ドキュメント内でminOccurs=0を使用して定義されていない(定義する必要はない)要素と、定義されているがnil="true"という属性を持つ要素の間のセマンティクスの相違が定義済であることを意味しているからです。これはわずかな相違で、不明な値と「値なし」として認識される値との相違を定義するためによく使用されます。

ルールでJAXBElementタイプのプロパティを使用するには、そのプロパティが非NULLかどうかを最初にチェックする必要があります。その後、"value"プロパティまたはgetValue()メソッドを使用して、基礎となるタイプの値を取得できます。

fact FactType1 &&
FactType1.prop1 != null &&
FactType1.prop1.value == "abc"

または、nillable要素がタイプJAXBElement<T>ではなくタイプTにマップされるように、カスタマイズしたJAXBバインディングを定義できます。ただし、これでは存在しない要素およびnil要素の違いを判別できなくなるため、無駄な変換です。この場合、nillable属性はあまり役立ちませんが、JavaでObjectタイプのフィールドがデフォルトでNULLに初期化されたり、明示的にNULLに初期化できるのと同様に、文書では要素をnilとして明示的に定義できます。

複合属性は複数の方法で指定できます。いずれの場合も、これらの属性を最上位レベルのxsd:schema要素の開始タグに追加します。

xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0"

1. すべてのプロパティでバインディングを使用するように指定するには、これをxsd:schemaの開始タグ内の先頭に追加します。

<xsd:annotation>
<xsd:appinfo>
<jaxb:globalBindings generateElementProperty="false"/>
</xsd:appinfo>
</xsd:annotation>

2. 特定のプロパティでのみバインディングを使用するように指定するには、必要な各要素に次のような注釈を追加します。

<xsd:element name="stringElement2" type="xsd:string" minOccurs="0" nillable="true">
<xsd:annotation>
<xsd:appinfo>
<jaxb:property generateElementProperty="false" />
</xsd:appinfo>
</xsd:annotation>
</xsd:element>

3. 外部カスタマイズ・ファイルに定義を追加し、スキーマをデータ・モデルに追加する際に引数として渡します。この方法は、SchemaBrowserクラスをプログラムでコールし、ルール・デザイナで公開しない場合にのみ可能です。

C.13 Javaクラスに加えた変更がデータ・モデルに反映されないのはなぜですか。

SCA-INF/classesディレクトリでコンパイルされたクラスはインポートしないでください。

このディレクトリのクラスを変更すると、データ・モデルにリロードできなくなります。

C.14 Rules SDKを使用して式にNULLを含めるにはどうすればよいですか。

Rules SDKコードを使用すると、null値を含めることができます。

次のRules SDKコードを使用できます。

SimpleTest test = pattern.getSimpleTestTable().add();

test.getLeft().setValue(attr);
test.setOperator(Util.TESTOP_NE);
test.getRight().setValue("null");

C.15 ディクショナリを格納するためのリポジトリとしてWebDAVがサポートされていますか。

Oracle Fusion Middleware 11gリリース1 (11.1.1)のOracle Business Rulesでは、ディクショナリを格納するためにWebDAV (Web Distributed Authoring and Versioning)リポジトリはサポートされていません。Oracle Business Rulesでは、MDS(ファイルまたはデータベースを使用)リポジトリを使用したディクショナリの格納がサポートされています。

C.16 ルール・デザイナによるソース・コード制御システムの使用

ルール・デザイナと、CVSまたはSubversionなどのソース制御システムを使用する場合には、特別な注意事項があります。ソース・コード制御システムとルール・デザイナを使用する場合には、プロジェクト内のルール・ディクショナリ・ファイルがテキスト・ファイルではなく、バイナリ・ファイルとして認識されるように指定する必要があります。ルール・ディクショナリ・ファイルはXML文書で、デフォルトで、ソース・コード制御システムはこれらのファイルをテキスト・ファイルとして処理します。

しかし、ルール・ディクショナリ・ファイルには、セマンティク構造が含まれているので、これらのファイルをマージすることはできません。ルール・ディクショナリ・ファイルがテキスト・ファイルとして処理され、変更された場合、ソース制御システムはトリビアル・マージによってこのファイルのマージを試行します。トリビアル・マージを使用すると、セマンティクスの無効なディクショナリ・ファイルが作成され、RuleDictionaryオブジェクトにアンマーシャリングできなくなります。

したがって、ソース・コード制御システムとルール・ディクショナリ・ファイル(.rulesファイル)を使用する場合には、必ずソース・コード制御システムがこれらのファイルをバイナリ・ファイルとして処理するように指定する必要があります。このシステムがディクショナリ・ファイルをバイナリ・ファイルとして処理するように指定するには、いくつかの構成オプションを設定する必要があります。たとえば、Subversionソース・コード制御システムでは、svn:mime-typeファイル・プロパティを使用してMIMEタイプを設定できます。詳細は、次の章を参照してください。

http://svnbook.red-bean.com/nightly/en/svn.advanced.props.file-portability.html#svn.advanced.props.special.mime-type

バイナリ・ファイル・タイプを指定するためのソース・コード制御システム・オプションを設定すると、ソース・コード制御システム(tortoiseSVNなど)が、ルール・ディクショナリ・ファイルをバイナリ・ファイルとして正しく処理できるようになります。

D Oracle Business Rulesのトラブルシューティング

この付録では、Oracle Business Rulesの使用時に発生する問題の回避策および解決方法について説明します。

この付録の内容は次のとおりです。

- 非表示のgetterメソッドとsetterメソッド

- プロパティのsetterのみを使用したJavaクラス

- 実行時のNoClassDefFoundエラー

- RL固有のキーワード・ネーミング競合エラー

- ビジネス・ルール・サービス・ランタイムからのjava.lang.IllegalAccessError

- JAXB 1.0ディクショナリとRLのMultipleInheritanceException

- アンダースコアを持つXMLスキーマでJAXBコンパイルに失敗するのはなぜですか。

- デシジョン・サービスの入力と出力の要素タイプはどのように制限されますか。

- デシジョン・サービスの入力と出力のスキーマはどのように制限されますか。

- インポートしたファクト・タイプ内のJava予約名はどのように処理したらよいですか。

D.1 非表示のgetterメソッドとsetterメソッド

ルール・デザイナでは、Java Beanプロパティをサポートしているメソッドは選択リストに表示されません。Beanプロパティのみが表示されます。たとえば、Yという名前のプロパティを持つJava Beanには、少なくとも1つのgetterメソッドgetY()が必要で、setterメソッドsetY(y-type-param)が存在する場合もあります。

Java FactTypeを表示すると、すべてのプロパティとメソッド(プロパティを構成するgetterおよびsetterを含む)が表示されます。選択リストには、Javaクラスのプロパティ(getterおよびsetterメソッドは含まない)のみが表示されます。プロパティの表示を制御しようとする場合は、プロパティの表示フラグを使用するのが最善の方法です。getterまたはsetterメソッドを非表示にマークしても、選択リストからプロパティが削除されない場合もあります。

D.2 プロパティのsetterのみを使用したJavaクラス

Javaでは、Java Beanイントロスペクタに書込み専用プロパティが組み込まれています。Oracle RLでは、ルール内で判断できないため、Beanのようなプロパティは組み込まれません。

したがって、Oracle RLでJavaファクト・タイプのBeanプロパティに正しくアクセスするには、getterおよびsetterの両方が必要です。setterがあってgetterのないプロパティ、つまり書込み専用プロパティは、Oracle RLの新しい構文では許可されません。

たとえば、Bean FooのメソッドがsetProp1(int i)のみの場合、Oracle RLでは次を使用できません。

Foo f = new Foo(prop1: 0)

D.3 実行時のNoClassDefFoundエラー

XMLファクトの使用中に、エラーを受信することがあります。

次のような形式のメッセージを受信する場合があります。

Exception in thread "main" java.lang.NoClassDefFoundError:

java.lang.NoClassDefFoundErrorの原因は、必須クラスがCLASSPATHにないことである可能性があります。次をチェックしてみてください。

- 実行時にCLASSPATHにxml.jarを追加します。

- 生成済でコンパイル済のJAXBクラスが置かれるディレクトリをCLASSPATHに追加します。

D.4 RL固有のキーワード・ネーミング競合エラー

Oracle Business Rulesでは、ルール・デザイナからRLを生成する際、RL固有のキーワードがエスケープされます。

ほとんどの場合、RL固有のキーワードはエラーなしで使用できます。ただし、クラス名としてキーワードを使用する場合は例外です。規則では、Javaクラスは大文字で始まり、RL固有のキーワードはすべて小文字であるため、これはJavaクラスにはほとんどありません。詳細は、『Oracle Business Process Managementルール言語リファレンス』を参照してください。

D.5 ビジネス・ルール・サービス・ランタイムからのjava.lang.IllegalAccessError

エラーがある可能性があります

問題: 次のようなエラーが送信されます。

java.lang.IllegalAccessError: tried to access class
com.sun.xml.bind.v2.runtime.reflect.opt.Const from class:...

理由: これは、アンマーシャリングが不正な場合(floatが必要な場合の文字など)に引き起こされるJAXB 2.1.6の問題490が原因である可能性があります。データが次のサイトで説明されています。

http://java.net/jira/browse/JAXB-490

回避策: この問題の回避策は、図D-1および図D-2に示すように、値を適切な要素に割り当てることです。図D-2では、approvalRequiredにデフォルト値false()が割り当てられています。

スクリーン・ショットは、前のバージョンを反映していますが、内容は現在のリリースにも当てはまります。

図D-1 ビジネス・ルール・サービス入力の値を初期化する式の追加

図D-2 ビジネス・ルール・サービスの入力変数に割り当てられた式

D.6 JAXB 1.0ディクショナリとRLのMultipleInheritanceException

10.1.3から移行したディクショナリでは、JAXB 2.0ではなくJAXB 1.0が使用されます。これは、Oracle Fusion Middleware 11gリリース1 (11.1.1)ディクショナリのデフォルトです。このJAXB 1.0の使用により、移行されたディクショナリには要素タイプが含まれていない場合があります。ディクショナリの要素タイプが表示にマークされている場合、生成したRLによってMultipleInheritanceExceptionをスローされることになります。

この問題の解決策は、要素ファクト・タイプを参照不可としてマーク付けするか、データ・モデルから削除することです。ルールの記述にはJAXBで生成されたタイプのクラスのみを使用する必要があるため、要素タイプを削除しても機能が損なわれることはありません。

D.7 アンダースコアを持つXMLスキーマでJAXBコンパイルに失敗するのはなぜですか。

JAXBの定義済の動作では、'_' + 数字という形式の名前が見つかったら、エラーになります。この場合、JAXBはこの文字列から明白なJavaクラス名を生成できません。JAXBのデフォルト動作では、'_' + 文字は単語の境界として処理されます(underscoreBinding="asWordSeparator")。つまり、アンダースコアが外されて、文字はUpperCamelCasedになります。たとえば、_fooBarはFooBarにマップされます。

この問題を解決するには、違う方法で名前を生成するように、直接JAXBのスキーマをカスタマイズする必要があります。underscoreBindingのデフォルト値は"asWordSeparator"に指定され、名前の先頭にアンダースコアを使用することはできません。

グローバルな注釈underscoreBinding="asCharInWord"を使用すると、クラス名および番号の後の先頭が大文字のキャメル・ケースで'_'が保持されます。

<xsd:annotation><xsd:appinfo>
<jaxb:globalBindings underscoreBinding="asCharInWord" />
</xsd:appinfo></xsd:annotation>

このグローバルな注釈を使用すると、_1foo_bar_bazのマッピングは_1Foo_Bar_Bazとなります。

D.8 デシジョン・サービスの入力と出力の要素タイプはどのように制限されますか。

デシジョン・サービスを使用して、入力を定義するXMLスキーマを含むビジネス・ルールを実行すると、XMLスキーマ・ファイルFoo.xsd内の任意のcomplexType tFooの場合、タイプtFooのXMLスキーマ要素fooを1つのみ含めることができます。

デシジョン・サービスでは、同じタイプtFooの2つの要素fooおよびbarを使用することはできません。

D.9 デシジョン・サービスの入力と出力のスキーマはどのように制限されますか。

デシジョン・サービスを使用する場合、スキーマでcomplexTypeを定義するか、complexTypeを定義する別のスキーマをインポートする必要があります。

次に示すような、complexTypeを定義しないスキーマは使用できません。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.org"
targetNamespace="http://www.example.org"
elementFormDefault="qualified">
<xsd:element name="count" type="xsd:int"/>
</xsd:schema>

D.10 インポートしたファクト・タイプ内のJava予約名はどのように処理したらよいですか。

Oracle Business Rulesでは、Java言語に同じ名前があるファクト・タイプ・プロパティをインポートすると、予約語が除外されます。

Javaの予約語の一覧は、次のページを参照してください。

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

回避策として、除外されるプロパティを作成するgetterおよびsetterメソッドのペアの名前を変更することがあげられます。これらのメソッド名を変更できない場合、メソッドが、プロパティではなくルール内で使用されているということです。

たとえば、continueという名前のプロパティが除外された場合は、プロパティを使用するかわりに、getContinue()およびsetContinue()メソッドを使用するルールを作成できます。このためには、パターンをリライトします。たとえば、次のように置換します。

fact IncrCount ic && ic.continue == "foo"

置換後:

fact IncrCount ic && ic.getContinue() == "foo"

別の例では、アクションで、次のように置換します。

[assert new] IncrCount(continue:"bar")

置換後:

[assign new] IncrCount ic = new IncrCount( )
[call] ic.setContinue("bar")
[assert] ic

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

この付録では、Java SEまたはJava EEクライアントからルール・エンジンにアクセスするための標準JavaランタイムAPIを定義するJava Rule Engine API (JSR-94)の仕様について説明します。

この付録の内容は次のとおりです。

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

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

- Oracle Business RulesでのJSR-94インタフェースの使用

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

- http://jcp.org/en/jsr/detail?id=94

- http://java.sun.com/developer/technicalArticles/J2SE/JavaRule.html

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.adminのRuleExecutionSetProviderおよび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実装クラスで提供される拡張機能について説明します。

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

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

- JSR-94でのRL Language関数の起動

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");

オラクルの法律上の注意点について

コピーライトについて

Copyright © 1994-2017, Oracle and/or its affiliates. All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracle Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

アルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のアルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが非公開の試作版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のベータ・トライアル契約のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle PartnerNetwork Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティについて

オラクルのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc を参照してください。

Oracle Supportへのアクセス

サポートをご契約のお客様には、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害のあるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。