Oracle® Fusion Middleware

Oracle Business Rulesユーザーズ・ガイド

11gリリース1 (11.1.1.7)

B55917-06(原本部品番号:E10228-12)

2013年6月

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

Oracle Fusion Middleware Oracle Business Rulesユーザーズ・ガイド 11g リリース1 (11.1.1.7)

B55917-06

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

原本著者:  Oracle Corporation

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

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

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

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(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の登録商標です。

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

目次

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

リリース11.1.1.7用のこのガイドでの新しい情報

1 Oracle Business Rulesの概要

- 1.1 ビジネス・ルールとは

- 1.1.1 ルール条件とは

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

- 1.1.3 デシジョン表とは

- 1.1.4 ファクトおよびバケット・セットとは

- 1.1.5 ルールセットとは

- 1.1.6 デシジョン関数とは

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

- 1.1.8 ディクショナリとは

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

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

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

- 1.2.3 Oracle Business Rules RL Language

- 1.2.4 Oracle Business Rules SDK

- 1.2.5 ルール・デザイナ

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

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

- 1.3.1 宣言ルール

- 1.3.2 Reteアルゴリズム

- 1.3.3 作業メモリーとは

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 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.5.2 Oracle Business Rules関数の追加方法

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

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

3 ファクトとバケット・セットの使用

- 3.1 ファクトとバケット・セットの使用の概要

- 3.2 XMLファクトの使用

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

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

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

- 3.2.4 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.3 バケット・セットのグローバル値との関連付け方法

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

- 4.1 ルールセットとルールの使用の概要

- 4.2 ルールセットの使用

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

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

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

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

- 4.3 ルールの使用

- 4.3.1 ルールの追加方法

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

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

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

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

- 4.3.6 ルールでのアクションの定義方法

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

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

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

- 4.4.1 データ・モデル検証

- 4.4.2 ルール検証

- 4.4.3 デシジョン表の検証

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

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

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

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

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

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

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

- 4.5.6 有効日の指定方法

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

- 4.6.1 ネスト・テストの使用方法

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

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

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

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

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

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

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

- 4.8.1 ツリー・モードのルールの概要

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

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

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

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

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

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

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

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

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

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

- 4.10 式ビルダーの使用

- 4.10.1 式ビルダーの概要

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

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

- 4.11 ルールにおけるオプション値の制約としてのバケット・セットの使用

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

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

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

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

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.2 デシジョン表の作成

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

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

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

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

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

- 5.3 デシジョン表の操作の実行

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

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

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

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

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

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

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

- 5.3.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.6 バケット・セットとOrderプロパティおよびCreditScoreプロパティを関連付ける方法

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

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

- 5.4.7.2 デシジョン表の圧縮

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

- 5.4.7.4 一般ルールの追加

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

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

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

6 デシジョン関数の使用

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

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

- 6.2.1 デシジョン関数の追加または編集方法

- 6.3 デシジョン関数に関する必知事項

- 6.3.1 ルール・デバッグ用の「ルール起動制限」オプションに関する必知事項

- 6.3.2 デシジョン関数の引数に関する必知事項

- 6.3.3 デシジョン関数の「ステートレス」オプションに関する必知事項

7 Rules SDKデシジョン・ポイントAPIの使用

- 7.1 Rules SDKとレンタカー・サンプル・アプリケーションの概要

- 7.1.1 デシジョン・ポイントAPIの概要

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8 ビジネス・ルールのテスト

- 8.1 デザインタイムでのOracle Business Rulesのテスト

- 8.1.1 ルール・テスト・フレームワークを使用してルールをテストする方法

- 8.1.1.1 デシジョン関数の作成

- 8.1.1.2 ルールのテスト

- 8.1.2 テスト・スイートの検証に関する必知事項

- 8.1.3 リンク先ディクショナリのテストに関する必知事項

- 8.1.4 テスト・スイートの失敗に関する必知事項

- 8.1.5 Oracle Business Rules関数によるデシジョン関数のテスト方法

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

- 8.2 実行時のOracle Business Rulesのテスト

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.5 Gradesプロジェクト内でのOracle Business Rulesディクショナリの作成方法

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

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

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

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

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

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

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

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

- 9.5.1 Gradesプロジェクトへの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.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.2 Javaデシジョン・ポイント・インタフェースによるデシジョン関数のコール方法

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

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

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

- 10.3.2 Chapter10汎用プロジェクトの追加方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 10.3.10.7 ディクショナリのコピー方法

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

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

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

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

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

- 11.2.1.1 デシジョン・サービス・メタデータ(.decs)ファイル

- 11.2.1.2 SCAコンポーネント・タイプ(.componentType)ファイル

- 11.2.1.3 composite.xml内のデシジョン・コンポーネント・エントリ

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

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

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

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

12 Oracle Business RulesでのOracle SOAコンポーザの使用

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

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

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

- 12.3 SOAコンポーザでのアクセシビリティ機能の有効化

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

- 12.4.1 Oracle Business Rulesディクショナリの実行時のオープン

- 12.4.2 「開くディクショナリの選択」ダイアログからディクショナリのパスを取得するための必知事項

- 12.4.3 Oracle Business Rulesディクショナリで実行時にグローバルを表示する方法

- 12.4.4 Oracle Business Rulesディクショナリで実行時にバケットセットを表示する方法

- 12.4.5 リンク先ディクショナリ名を実行時に表示する方法

- 12.4.6 Oracle Business Rulesディクショナリで実行時にデシジョン関数を表示する方法

- 12.4.7 Oracle Business Rulesディクショナリで実行時にルールセットを表示する方法

- 12.5 ディクショナリの実行時の編集および保存のスタート・ガイド

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

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

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

- 12.5.4 Oracle Business Rulesディクショナリで実行時にバケットセットを編集する方法

- 12.5.5 バケットセットの編集に関する必知事項

- 12.5.6 Oracle Business Rulesディクショナリで実行時にディクショナリ・リンクを使用する方法

- 12.5.7 Oracle Business Rulesディクショナリで実行時にデシジョン関数を編集する方法

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

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

- 12.6 Oracle Business Rulesディクショナリの実行時のルールの編集

- 12.6.1 Oracle Business Rulesディクショナリで実行時にルールを編集する方法

- 12.6.2 ルールを実行時に追加する方法

- 12.6.3 ルールを実行時に削除する方法

- 12.6.4 ルールの詳細設定の実行時の表示および編集方法

- 12.6.5 ルール条件を実行時に追加する方法

- 12.6.6 ルール条件を実行時に削除する方法

- 12.6.7 ルール条件を実行時に変更する方法

- 12.6.8 ルール・アクションを実行時に追加する方法

- 12.6.9 ルール・アクションを実行時に削除する方法

- 12.6.10 ルール・アクションを実行時に変更する方法

- 12.6.11 拡張モードのルールの実行時の使用方法

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

- 12.6.12 ツリー・モードのルールの実行時の使用方法

- 12.6.13 Oracle SOAコンポーザでのルールのページングに関する必知事項

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

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

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

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

- 12.7.1 式ビルダー

- 12.7.2 条件ブラウザ

- 12.7.3 「日付」ブラウザ

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

- 12.8 Oracle Business Rulesディクショナリのデシジョン表の実行時の編集

- 12.8.1 デシジョン表の実行時の追加

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

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

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

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

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

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

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

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

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

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

- 12.8.10 行から列への切替

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

- 12.8.12 デシジョン表の実行時の削除

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

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

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

- 12.10 Oracle Business Rulesディクショナリの変更の実行時のコミット

- 12.10.1 複数ユーザーでの実行時の編集に関する必知事項

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

- 12.12 Oracle Business Rulesディクショナリの実行時の検証

- 12.12.1 「検証」パネルの理解

- 12.12.2 「検証」パネルの更新

- 12.13 コンポジット情報およびディクショナリ情報の実行時の入手

- 12.14 タスクの実行時の使用

- 12.14.1 タスク・メタデータを実行時に表示する方法

- 12.14.2 タスクまたはAMXのルール・メタデータを実行時に構成する方法

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

- 12.14.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.4 自己結合を正しく表現するにはどうすればよいですか。

- 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関数の起動

F ルール・レポータの使用

- F.1 ルール・レポータの使用の概要

- F.1.1 ルール・レポータのHTMLスタイルシートに関する必知事項

- F.1.2 RuleReporter APIに関する必知事項

- F.1.3 ルール・レポータの依存Jarファイルに関する必知事項

- F.2 ルール・レポータのコマンドライン・インタフェースの使用

- F.2.1 ルール・レポータのコマンドラインでディクショナリの内容をリスト表示する方法

- F.3 Javaでのルール・レポータの使用

- F.3.1 Javaを使用してルール・レポータでディクショナリの内容をリスト表示する方法

索引

はじめに

ここでは、次の項目について説明します。

- 対象読者

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

- 関連ドキュメント

- 表記規則

対象読者

Oracle Fusion Middleware Oracle Business Rulesユーザーズ・ガイドは、アプリケーション・プログラマ、システム管理者および次の作業を行うその他のユーザーを対象としています。

- 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 Supportへのアクセス

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 Storeで入手できます:

http://oraclestore.oracle.com/

リリース・ノート、インストール関連ドキュメント、ホワイト・ペーパーまたはその他の関連ドキュメントは、OTN (Oracle Technology Network)から、無償でダウンロードできます。

http://www.oracle.com/technology/documentation/index.html

表記規則

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

規則

意味

太字

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

イタリック体

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

固定幅フォント

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

このガイドのリリース11.1.1.7に関する新しい内容

次の表に、追加または変更された部分をリストします。

既知の問題のリスト(リリース・ノート)は、"Known Issues for Oracle SOA Products and Oracle AIA Foundation Pack"(http://www.oracle.com/technetwork/middleware/docs/soa-aiafp-knownissuesindex-364630.html)を参照してください。

セクション

変更内容

リリース11.1.1.7.0用のこのガイドでの新しい情報

このリリースの新規内容および改訂内容をリストするために追加された章。

複数の章

次の内容が追加されています。

IF/THENルールにおける汎用ルールのUIとカスタマイズされたタスク承認UIとの結合

選択リストへのフィルタ処理サポートの追加

Rules ADFコンポーネントにおけるグローバル変数の追加/削除

デシジョン表のカスタマイズされたアクション・リージョンのサポート

MDSからプロジェクトへのディクショナリのインポート機能

1 Oracle Business Rulesの概要

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

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

- 第1.1項「ビジネス・ルールとは」

- 第1.2項「Oracle Business Rulesのランタイム要素とデザインタイム要素」

- 第1.3項「Oracle Business Rules Engineのアーキテクチャ」

詳細な情報は、次を参照してください:

- 『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

- 『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』

- 『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』

1.1 ビジネス・ルールとは

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を使用して作成したビジネス・ルール・アプリケーションでは、ビジネス・ルールが容易に変更できるようにサポートされるため、このプロセスが簡素化されます。

Oracle Business Rulesを使用すると、ビジネス・アナリストは、ほとんどプログラマの援助なしに、ビジネス・ルールで表現されたビジネス・ポリシーを変更できます。Oracle Business Rulesを使用するアプリケーションでは、新しい政府規制や、社内プロセスの改善、顧客およびサプライヤの関係の変化にアプリケーションが対応できるよう、継続的な変更がサポートされます。

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

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

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

または、デシジョン表と呼ばれるスプレッドシートに似た形式でルールを表現することもできます(第1.1.3項「デシジョン表とは」を参照)。

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

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

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

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

1.1.1 ルール条件とは

ルールのIF部分は、ファクトを参照する条件式およびルール条件で構成されています。次に例を示します。

Rental_application.driver age < 21の場合

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

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

詳細な情報は、次を参照してください:

- 第4章「ルールセットとルールの使用」

- 『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』のルール条件に関する項

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

ルールのTHEN部分には、ルールの起動時に実行されるアクションが含まれています。ルールはアクティブ化され、優先度など競合解決メカニズムを使用して他のルールのアクティブ化の中から選択された後、起動されます。ルールは、いくつかの種類のアクションを実行します。あるアクションではファクトを追加、変更、削除できます。また、あるアクションではJavaメソッドを実行したり、関数を実行してファクトのステータスを変更したり、ファクトを作成できます。

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

詳細な情報は、次を参照してください:

- 第1.3.4項「ルールの起動とルール・セッション」

- 第4章「ルールセットとルールの使用」

- 『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』のルール起動の順序付けに関する項

1.1.3 デシジョン表とは

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

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

1.1.4 ファクトおよびバケット・セットとは

Oracle Business Rulesでは、ファクトはルールの判断対象となるオブジェクトです。各ファクトはファクト・タイプのインスタンスです。ルールを作成する前に、ファクト・タイプを1つ以上インポートまたは作成する必要があります。

Oracle Business Rulesの場合、ファクトはクラスのアサートされたインスタンスです。Oracle Business Rulesランタイム、またはRL Languageを記述する開発者は、RL Languageのassert関数を使用してファクトのインスタンスをOracle Business Rules Engineに追加します。

ルール・デザイナでは、XMLスキーマ、Javaクラス、Oracle RL定義、ADFビジネス・コンポーネント・ビュー・オブジェクトに基づいて、様々なファクト・タイプを定義できます。Oracle Business Rulesランタイムでは、これらのファクト・タイプ・インスタンスはファクトと呼ばれます。

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

詳細な情報は、次を参照してください:

- 第1.3項「Oracle Business Rules Engineのアーキテクチャ」

- 第3章「ファクトとバケット・セットの使用」

1.1.5 ルールセットとは

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

詳細な情報は、次を参照してください:

- 第4章「ルールセットとルールの使用」

- 『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』のルール起動の順序付けに関する項

1.1.6 デシジョン関数とは

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

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

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

1.1.8 ディクショナリとは

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

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

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

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

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

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

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

Rules Engineには、次の機能があります。

- 高いパフォーマンス: Rules Engineは、システムで定義されたファクトに対し、特化された一致アルゴリズムを実装しています。

- パラレル処理アーキテクチャに適したスレッドセーフ実行: Rules Engineでは、あるスレッドがネットワークを評価している間も、別のスレッドでファクトをアサートできます。

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

1.2.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では、ビジネス・ルールが評価されてデシジョンまたはファクトが返され、それらがビジネス・プロセスで使用されます。

Rules Engineには、次の機能があります。

- 高いパフォーマンス: Rules Engineは、システムで定義されたファクトに対し、特化された一致アルゴリズムを実装しています。

- パラレル処理アーキテクチャに適したスレッドセーフ実行: Rules Engineでは、あるスレッドがネットワークを評価している間も、別のスレッドでファクトをアサートできます。

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

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

1.2.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プログラムを直接表示または記述する必要はありません。詳細は、第1.2.5項「ルール・デザイナ」を参照してください。

RL Languageの詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。

1.2.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』を参照してください。

詳細は、第7章「Rules SDKデシジョン・ポイントAPIの使用」を参照してください。

1.2.5 ルール・デザイナ

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

図1-1 Oracle JDeveloperとルール・デザイナ

ルール・デザイナは、ルールの作成および既存ルールの編集用にpoint-and-clickインタフェースを提供します。ルール・デザイナを使用すると、ビジネス・ルールおよびデータ・モデルを直接操作できます。ルール・デザイナで作業するためにRL Languageを理解する必要はありません。ルール・デザイナには、ビジネス・ルールを簡単に作成、表示および変更するための方法が用意されています。

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

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

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

図1-2 Oracle SOA Composerを使用した実行時のディクショナリの表示または編集

詳細は、第12章「Oracle Business RulesでのOracle SOAコンポーザの使用」を参照してください。

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

Reteアルゴリズムを使用したルールベース・システムは、Oracle Business Rulesの基盤です。ルールベース・システムは、次の要素で構成されています。

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

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

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

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

1.3.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.3.2 Reteアルゴリズム

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

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

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

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

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

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

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

1.3.3 作業メモリーとは

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

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

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

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

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

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

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

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

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

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

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

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

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

- 同じ優先度の場合、最も最近にアクティブ化されたルールが最初に起動されます。

起動されるのはスタック上にあるルールセット内のルールのみですが、ルール・セッション内のルールがすべて照合され、一致した場合はアクティブ化されます。

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

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

この章の項目は、次のとおりです。

- 第2.1項「データ・モデル要素の使用の概要」

- 第2.2項「ディクショナリとディクショナリ・リンクの使用」

- 第2.3項「Oracle Business Rulesグローバルの使用」

- 第2.4項「デシジョン関数の使用」

- 第2.5項「Oracle Business Rules関数の使用」

- 第2.6項「Oracle Business Ruleリソースのローカライズ」

詳細は、第1.1.8項「ディクショナリとは」を参照してください。

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

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

詳細な情報は、次を参照してください:

- 第3章「ファクトとバケット・セットの使用」

- 第4章「ルールセットとルールの使用」

- 第5章「デシジョン表の使用」

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

ディクショナリは、ファクト、関数、グローバル、バケット・セット、リンク、デシジョン関数およびルールセットに使用するOracle Business Rulesコンテナです。また、アプリケーションのルールセットおよびデータ・モデルが格納されているXMLファイルです。ディクショナリは他のディクショナリにリンクできます。必要な数のディクショナリを作成できます。ディクショナリには任意の数のルールセットとデータ・モデル要素を含めることができます。1つのデータ・モデルを1つ以上のディクショナリに格納できます。ルールセットで参照されるデータ・モデル要素はすべて、直接的に、またはリンクを通してディクショナリ内で使用可能である必要があります。

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

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

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

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

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

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

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

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

典型的なSOAコンポジットのデザイン・パターンでは、各アプリケーションに専用ディクショナリまたはディレクトリが用意されます。これにより、各アプリケーションは自己格納されるようになり、個別にデプロイできるようになります。様々なアプリケーションが共通データ・モデルの同一部分へのアクセスを必要とする場合は、ディクショナリ・リンクを使用して、ターゲット・アプリケーションのディクショナリをソース・アプリケーションのディクショナリに組み込むことができます。この場合、アプリケーションはターゲット・アプリケーションのディクショナリをソース・アプリケーションにコピーして、ソースにリンクされているコピーの内容を保持します。リンクされた要素を使用する場合、それらはローカル・コンテンツとして表示されます。

SOAアプリケーションの外部で、ビジネス層に使用するディクショナリを作成することもできます。詳細は、第9.2.5項「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. 入力および出力を指定する手順は、次のとおりです。

1. 「追加」アイコンをクリックし、入力を作成するには「入力」を、出力を作成するには「出力」を選択します。

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

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

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

8. 「ビジネス・ルールの作成」ダイアログで「OK」をクリックして、デシジョン・コンポーネントおよびOracle Business Rulesディクショナリを作成します。

図2-3に示すように、Oracle JDeveloperによって、拡張子.rulesが付いたディクショナリがファイル内に作成され、ルール・デザイナが起動します。

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

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

図2-4 コンポジット・エディタに表示されたデシジョン・コンポーネント

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

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

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

「ディクショナリ設定」アイコンを使用して、ディクショナリ設定を表示および編集できます。

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

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

2. Rules Designerで、「ディクショナリ設定」アイコンをクリックします。

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

図2-5 ディクショナリの別名または説明の変更に使用する「ディクショナリ設定」ダイアログ

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

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

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

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

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

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

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

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

図2-7 リソース・ピッカー

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

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

デシジョン・ポイント・ディクショナリにリンクする手順は、次のとおりです。

1. Rules Designerで、「リンク」ナビゲーション・タブをクリックします。

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

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

詳細は、付録A「Oracle Business Rulesのファイルと制限事項」を参照してください。

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

リソース・ピッカーを使用してディクショナリ・リンクを作成すると、ディクショナリはソース・プロジェクト(リンク元のディクショナリが常駐しているプロジェクト)にコピーされます。つまり、このタイプのリンクでは、ディクショナリのローカル・コピーがプロジェクトに作成されます。これは、ターゲット・ディクショナリの場所に関係なく、元のターゲットへのリンクではありません。つまり、リソース・ピッカーを使用してリンクを作成した場合、ルール・デザイナではリンクにコピー操作が使用されます。

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

ルール・デザイナを使用している場合、デプロイされたコンポジット・アプリケーションおよび関連するOracle Business RulesディクショナリをMDS接続で参照できます。ただし、MDSにデプロイされたディクショナリにディクショナリ・リンクを作成することはできません。

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

デシジョン関数の入力は、デシジョン関数の初期アクションに対する変数として使用できます。入力がファクトである場合、そのファクトは作業メモリー内にアサートされるので、ルールは、デシジョン関数の入力名ではなく、タイプおよびプロパティの値に基づいてファクトと一致する必要があります。たとえば、同じタイプに2つの入力input1およびinput2が存在する場合、ルールはこれらの入力をタイプおよびプロパティの値に基づいて識別するのであって、異なる2つの名前によって識別するわけではありません。入力が参照できないファクト(たとえば、文字列や整数)の場合、<decision function name>という名前のラッパー・タイプが作成され、ルールはこのタイプと一致する必要があります。

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-8に示すように、「グローバルの編集 -」ダイアログが表示されます。

図2-8ルール・デザイナでのグローバルの追加

3. 「名前」フィールドに名前を入力するか、またはデフォルト値を使用します。

4. 「タイプ」フィールドで、リストからタイプを選択します。

5. 「バケットセット」フィールドで、リストから値を選択することもできます。

6. 「値」フィールドで、値を入力するか、リストから値を選択するか、「式ビルダー」アイコンをクリックして式を入力します。詳細は、第4.10項「式ビルダーの使用」を参照してください。

7. グローバルが定数である場合は、「定数」チェック・ボックスを選択します。このオプションを選択することは、グローバルが定数値であることを示します。詳細は、第2.3.3項「ファイナルオプションと「定数」オプションに関する必知事項」を参照してください。

8. グローバルがファイナルでない場合は、「ファイナル」チェック・ボックスの選択を解除します。このオプションの選択を解除することは、Assignアクションなどで、グローバルを変更可能にすることを意味します。

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

ルール・デザイナを使用して、グローバルを編集できます。

グローバルを編集する手順は、次のとおりです。

1. Rules Designerで、「グローバル」ナビゲーション・タブを選択します。

2. グローバル表の行内のグローバル・アイコンをダブルクリックします。行内のグローバル・アイコンをダブルクリックすると、図2-9に示すように、「グローバルの編集 - グローバル名」ウィンドウが表示されます。このウィンドウで、グローバルを編集し、「ファイナル」フィールドや「定数」フィールド(グローバルをダブルクリックして「グローバルの編集 -」ダイアログを表示した場合は、「定数」フィールドのみ表示)などのフィールド値を変更できます。

図2-9「グローバルの編集 -」ウィンドウ

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

「グローバルの編集 -」ダイアログには、グローバルに対して選択可能な「定数」チェック・ボックスと「ファイナル」チェック・ボックスが表示されます。

グローバルを使用する場合は、次のことに注意してください。

- 「ファイナル」の選択を解除することは、Assignアクションなどで、グローバルを変更可能にすることを意味します。

- 「ファイナル」を選択することは、ルール内のテストでグローバルを使用できることを示します(ファイナルでないグローバルはルール内のテストで使用できません)。

- 「ファイナル」を選択することは、グローバルが実行時に1度初期化され、変更できないことを示します。

「グローバルの編集 -」ダイアログで「定数」オプションを選択することは、グローバルが定数であることを示します。Oracle Business Rulesでは、定数は、文字列や数値リテラル、値が定数であるファイナル・グローバル、または定数と+、-、*および/を含む単純な式です。

グローバルに対して「定数」オプションを選択すると、次の3つの影響があります。

- 文字列リテラルを二重引用符で囲む必要がありません。

- 式の値の選択リストに定数のみが表示されます。

- 式の値が有効な定数である必要があります。

「定数」オプションは、必要に応じて選択できます。バケット値、バケット範囲のエンドポイントおよびルールセット・フィルタの値は、常に定数であることに注意してください。

2.4 デシジョン関数の使用

データ・モデルにはデシジョン関数が含まれています。デシジョン関数の使用については、第6.1項「デシジョン関数の概要」を参照してください。

2.5 Oracle Business Rules関数の使用

Oracle Business Rulesには、ルール作成時の複雑さを隠すための関数が用意されています。Oracle Business Rulesでは、組込み関数またはユーザー定義関数をルールおよびデシジョン表の条件およびアクションに使用できます。

2.5.1 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関数の書式が適切で検証可能であることが保証されます。

ルール・デザイナ内で関数を使用してルールをテストすることもできます。詳細については、第8.1.5項「Oracle Business Rules関数によるデシジョン関数のテスト方法」を参照してください。

2.5.2 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-10に示す例を参照してください。

図2-10 Oracle Business Rules関数の追加

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

ルール・リソースの名前、別名、説明をローカライズできます。これにより、ワークスペースとSOAコンポーザでリソースをうまく制御できるようになります。バケット、バケット・セット、グローバル、ルールセット、ルールなど、ほとんどのリソースをローカライズできます。

これらのリソースを作成したら、「変換」タブでロケール固有の情報を追加できます。各ロケールは個別のリソース・バンドルに保存されています。

注意:

リソース・バンドルを手動で編集して、ローカライズされた文字列を追加したり編集したりすることはできません。リソース・バンドルを編集するには、JDeveloperまたはSOAコンポーザのRules Designerの「変換」タブを使用する必要があります。

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

JDeveloperのルール・デザイナを使用して、ビジネス・ルールのリソースをローカライズできます。

ビジネス・ルールのリソースをローカライズする方法は、次のとおりです。

1. Rules Designerで、「変換」タブを選択します。

2. 「リソース・バンドルの作成」アイコンをクリックします。
「リソース・バンドルの作成」画面が表示されます。

3. リストで「ロケール」を選択します。

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

図2-11 新しいロケールの追加

追加した各ロケールは、「リソース・バンドルの変換」表の列として表示されます。ビジネス・ルールの各リソースは、この表の行として表示されます。各ロケールは個別のリソース・バンドルとして保存されます。

5. リソースおよびロケールに対応する表のセルをダブルクリックして、ローカライズされたテキストを入力します。

図2-12 ルール・リソースのローカライズ

3 ファクトとバケット・セットの使用

この章では、ファクトと呼ばれるOracle Business Rulesデータ・モデル要素について説明します。ファクトはルールの判断対象となるオブジェクトです。ファクト・プロパティ値のグループ化を定義する、バケット・セットと呼ばれるもう1つの要素についても説明します。

この章の項目は、次のとおりです。

- 第3.1項「ファクトとバケット・セットの使用の概要」

- 第3.2項「XMLファクトの使用」

- 第3.3項「Javaファクトの使用」

- 第3.4項「RLファクトの使用」

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

- 第3.6項「バケット・セットの使用」

- 第3.7項「バケット・セットのビジネス条件との関連付け」

3.1 ファクトとバケット・セットの使用の概要

ルール・デザイナでは、データ・モデルの一部であるファクト・タイプを使用してOracle Business Rulesにビジネス・オブジェクトおよびそのメソッドを認識させます。

ファクト・タイプとバケット・セットはルールを作成する前に作成できます。

ルール・デザイナでは、次の種類のファクトを使用できます。

- XMLファクト: XMLファクトは、XMLスキーマを指定して既存のソースからインポートされます。インポートしたXMLファクトに別名を追加するか、XMLファクトをRLファクトと併用し、ビジネス・ニーズに応じてデータ・モデルを変更できます。
詳細は、第3.2項「XMLファクトの使用」を参照してください。

- Javaファクト: Javaファクトは既存のソースからインポートされます。Javaファクトに別名を追加するか、RLファクトと併用し、ビジネス・ニーズをデータ・モデルのターゲットにすることができます。また、Javaファクトは、作成するルールまたはデシジョン表で使用する関連Javaクラスのインポートにも使用されます。
詳細は、第3.3項「Javaファクトの使用」を参照してください。

- RLファクト: RLファクトは、ユーザーが直接作成でき、外部ソースが存在しないタイプの唯一のファクトです。他のすべてのタイプのOracle Business Rulesファクトはインポートされます。RLファクトは、リレーショナル・データベースの行またはメソッドがないJavaBeanと同じです。RLファクトには、データ・モデルで使用可能なタイプ(RLファクト、Javaファクトまたはプリミティブ・タイプ)のプロパティのリストが含まれています。RLファクトを使用すると、動的な仮想型を提供することでJavaアプリケーションのオブジェクト・モデルを拡張できます。
詳細は、第3.4項「RLファクトの使用」を参照してください。

- ADFビジネス・コンポーネント・ファクト: ADFビジネス・コンポーネント・ファクトを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます。ADFビジネス・コンポーネントのファクトを使用することで、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフをアサートし、Oracle Business Rulesにビュー・オブジェクトのグラフ内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させることができます。
詳細は、第3.5項「ADFビジネス・コンポーネント・ファクトの使用」を参照してください。

ルール対応アプリケーションのビジネス・オブジェクトを調査するルールを作成したり、結果をアプリケーションに返す場合は、通常、Javaファクト・タイプとXMLファクト・タイプを使用します。RL Languageファクト・タイプ定義を使用して、Rules Engineで他のルールを起動できる中間ファクトを作成します。ADFビジネス・コンポーネント・ファクト・タイプを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます

Oracle Business Rulesでは、ルールに対して実行できるファクトは、アサートされたデータ・オブジェクトです。各オブジェクト・インスタンスは単一のファクトに対応しています。オブジェクトが(変更済かどうかに関係なく)再アサートされると、Rules Engineが更新され、そのオブジェクトの新しい状態が反映されます。オブジェクトの再アサートによるファクトの作成はありません。特定のファクト・タイプに複数のファクトを指定するには、オブジェクト・インスタンスを個別にアサートする必要があります。

バケット・セットを作成し、指定したタイプの値リストまたは値範囲を定義できます。バケットセットを作成した後、バケットセットを一致するタイプのビジネス条件に関連付けることができます。バケット・セットがビジネス条件に関連付けられている場合、Oracle Business Rulesでは、ルールまたはデシジョン表でビジネス条件の値に対する制約として定義したバケットが使用されます。

詳細な情報は、次を参照してください:

- 第3.6項「バケット・セットの使用」

- 第3.7項「バケット・セットのビジネス条件との関連付け」

3.2 XMLファクトの使用

XMLファクト・タイプを使用すると、ルールを記述する際にXMLスキーマのタイプ、要素および属性を使用できます。XMLスキーマに定義されている要素およびタイプをデータ・モデルにインポートし、Javaファクト・タイプやRLファクト・タイプの場合と同様にルールおよびデシジョン表の作成に使用できます。XMLスキーマ定義およびXMLファクト・タイプの間のマッピングには、Java Architecture for XML Binding (JAXB)が使用されます。Oracle Business Rulesでは、デフォルトでOracle Application Serverに同梱されているJAXB 2.0を使用します。JSR-222に定義されているJAXBは、XMLスキーマ定義内のタイプ、名前、規則および、Javaで使用可能なタイプ、許可される名前、規則の間のマッピングを提供します。たとえば、xsd:integerタイプのorder-idという要素は、BigInteger型のorderIDというJava Beanプロパティにマップされます(xsd:intタイプはJavaのintにマップされます)。

したがって、Oracle Business Rulesでは、アプリケーションに関連付けられたデータを含むXML文書があり、そのXML文書に関連付けられたスキーマがある場合、ルール・デザイナを使用し、XMLスキーマから指定する要素に基づいてルールを定義できます。

XMLファクト・タイプを作成する手順は、次のとおりです。

1. XMLスキーマを定義または取得します。

2. ルール・デザイナを使用して、XMLスキーマをディクショナリにインポートします。この手順では、JAXBコンパイラを使用してXMLスキーマからJavaクラスを生成します。XMLスキーマのコンパイル後に、スキーマから必要な要素を選択し、データ・モデル内でXMLファクトを追加し、生成されたJAXBクラスをデータ・モデルにインポートします。これらの手順の詳細は、第3.2.1項「XMLスキーマをインポートしてXMLファクトを追加する方法」を参照してください。

3. データ・モデルに追加したXMLファクトに基づいて、ルールを記述するか、デシジョン表を作成します。詳細は、第4.3項「ルールの使用」および第5.2項「デシジョン表の作成」を参照してください。

XMLスキーマに定義されている要素およびタイプをデータ・モデルにインポートし、タイプのインスタンスをルールで作成、アサート、変更および取消しできます。ほとんどのXML文書では階層情報が記述されており、各要素にはサブ要素が含まれています。通常、ユーザーはこの階層内の複数の要素および要素間の階層関係に基づいて個々のルールを記述します。Oracle Business Rulesでは、ファクトをアサートする際のデフォルト動作は単一のファクト・インスタンスをアサートすることのみで、サブ要素の階層内で参照している可能性のある子オブジェクトはアサートしません。ルールまたはデシジョン表の作成時には、通常、ルート要素への参照に基づいて要素の階層全体をアサートするようにします。Oracle Business Rulesには、階層を再帰的にアサートできるようにassertTreeアクション・タイプが用意されています。詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。

3.2.1 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ファクトの作成」ダイアログの「ソース・スキーマ」領域で、「ソース・スキーマの追加」をクリックします。図3-2に示すように、「ソース・スキーマの追加」ダイアログが表示されます。

図3-2 XMLファクト: 「ソース・スキーマの追加」ダイアログ

5. 「ソース・スキーマの追加」ダイアログでは、次の操作を実行します。

- 「スキーマの場所」フィールドで、インポートするXMLスキーマの場所を入力するか、「参照」をクリックしてXMLスキーマを検索します。インポート中に、ファイルがプロジェクトにコピーされます。

注意:

通常、XMLスキーマ(xsd)ファイルは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がコンパイルされるため、スキーマのサイズによっては、この手順の完了に時間がかかる場合があります。この手順が完了すると、図3-3に示すように、Rules Designerの「XMLファクトの作成」ダイアログは、「ターゲット・クラス」領域が更新され、JAXBクラスが含まれた状態で表示されます。

6. 図3-3 XMLファクト: 「XMLファクトの作成」ダイアログ

7. 「XMLファクトの作成」ダイアログの「ターゲット・クラス」領域で、XMLファクト・タイプとしてインポートするクラスを選択します。

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

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

XMLファクトを使用するには、Rules Designerで「XMLファクトの編集 -」ダイアログを開きます。

XMLファクトを表示して編集する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。

3. 「XMLファクト」表で、編集するXMLファクトのアイコンをダブルクリックします。図3-4に示すように、「XMLファクトの編集 -」ダイアログが表示されます。

図3-4 「XMLファクトの編集 -」ダイアログ

「XMLファクトの編集 -」ダイアログには、表3-1に示すフィールドがあります。

表3-1 XMLファクト: 「XMLファクトの編集 -」ダイアログのフィールド

フィールド

説明

名前

XMLファクト名が表示されます。JAXB生成クラスの名前は変更できません。

エイリアス

XMLファクトの別名を入力します。この値は変更できます。デフォルトは、未修飾のクラス名です。

スーパー・クラス

このファクトに関連付けられているJavaスーパークラスが表示されます。

説明

XMLファクトの説明を入力します。

XML名

XMLファクトに関連付けられているXML名が表示されます。

生成元

ビジネス・ルール・データ・モデルにコピーされる際にXMLファクトのソースとなったXMLスキーマ・ファイルが表示されます。

参照可能

ルール・デザイナのリストにXMLファクトを表示する場合に選択します。XMLファクトから他のXMLファクトが参照されることによって、ツリーが形成されることがあります。ルールで参照するプロパティを含む、すべてのXMLファクト・タイプを参照可能にする必要があります。

XPathアサーションのサポート

ファクトについてXPathアサーションを有効化する場合に選択します。この機能は、下位互換性のためにのみ提供されています。通常、このオプションは使用しません。

「属性」領域

表示または編集するXMLファクトのJAXBクラスに関連付けられている、使用可能なコンストラクタ、プロパティ、メソッドまたはフィールドを選択します。

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

プロジェクト内でXMLスキーマが変更された場合、Oracle Business Rulesディクショナリにスキーマを再インポートする必要があります。スキーマを再インポートすると、Oracle Business Rulesでは、JAXBを使用してすべてのXMLファクト・タイプに対してソース・スキーマをすべて再コンパイルし、更新されたXMLスキーマ定義を使用してXMLファクト・タイプ定義を更新します。スキーマまたはクラスを変更し、実行時に変更後のスキーマまたはクラスを使用する場合、ファクトを再インポートする必要があります。

注意:

スキーマの再インポート時に、XMLファクトの変更基準となるXMLスキーマが変更された場合、ファクトが更新され、ベース・ディレクトリにインポートされます。リンクされたディクショナリ内のファクトを使用する場合は、変更されたスキーマのXMLファクトを、リンクされたディクショナリではなく、ベース・ディクショナリからリロードする必要があります。

XMLファクトを再インポートする手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。

3. 「XMLファクト」ページで、「更新されたスキーマからのXMLファクトのリロード」アイコンをクリックします。

再インポート操作が完了した後、互換性のない変更(更新されたスキーマに、ルールで参照されているプロパティを削除したという変更が含まれているなど)によって発生する検証警告があれば、訂正する必要があります。

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

XMLファクトを使用する際の注意事項は、次のとおりです。

- ルールを記述する場合、assertTreeアクション・タイプは拡張モードでのみ使用可能です。assertTreeを使用したルールの作成の詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。

- デシジョン関数を作成する場合、入力タイプのtreeオプションでは、作業メモリーに入力ファクトを入れるためにassertを使用するかassertTreeを使用するかを定義します。assertTreeの詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。

- XMLスキーマにrestriction定義が含まれていると、要素内での使用に有効なタイプを制限できます。restrictionの一般的な用途は、例3-1に示すように、要素に使用できる文字列の列挙を定義することです。

例3-1 XMLスキーマのrestrictionの例

<xs:simpleType name="status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="manual"/>
<xs:enumeration value="approved"/>
<xs:enumeration value="rejected"/>
</xs:restriction>
</xs:simpleType>

Oracle JAXB 2.0では、restrictionがJava列挙タイプにマップされます。ルール・デザイナを使用してJava列挙タイプまたは要素をXML制限とともにインポートすると、列挙を表す静的な最終フィールドを式に使用できます。また、Oracle Business Rulesでは列挙ごとに、すべての列挙値およびNULLを含むバケット・セットが作成されます。バケット・セットの詳細は、第3.6項「バケット・セットの使用」を参照してください。

- Oracle Application Serverには、デフォルト・バージョンのJAXBバインド・コンパイラが同梱されています。異なるJAXBバインド・コンパイラも使用できます。ただし、異なるJAXBバインド・コンパイラを使用する場合は、XMLスキーマ処理を手動で実行し、生成されたJavaパッケージおよびクラスをJavaファクトとしてデータ・モデルにインポートする必要があります。
JAXBの詳細は、次を参照してください。

http://java.sun.com/webservices/jaxb/

- スキーマまたはクラスを変更し、実行時に変更後のスキーマまたはクラスを使用する場合、ファクトを再インポートする必要があります。互換性のない変更(ルールで参照されているプロパティの削除など)によって発生する検証警告があれば、訂正する必要があります。詳細は、第3.2.3項「スキーマが更新されたXMLファクトをリロードする方法」を参照してください。

- ほとんどのユーザーは、ObjectFactoryを使用またはインポートする必要はありません。ObjectFactoryをインポートして使用する必要がある場合は、インポートする各XMLスキーマに異なるパッケージ名を使用しないと、異なるObjectFactoryクラスが競合します。

- minOccurs="0"およびnillable="true"を含む要素のあるXMLスキーマの使用では、JAXBでの特別な処理が発生します。詳細は、第C.12項「xsd:string入力済要素を持つXMLスキーマをタイプJAXBElementとしてインポートするのはなぜですか。」を参照してください。

- JAXBのデフォルト要素の命名規則では、XMLスキーマ要素名にアンダースコア文字を含むXMLスキーマのコンパイルに失敗します。詳細は、第D.7項「アンダースコアを持つXMLスキーマでJAXBコンパイルに失敗するのはなぜですか。」を参照してください。

- デシジョン・サービスの入力のタイプおよび名前には、特定の制限があります。詳細は、第D.8項「デシジョン・サービスの入力と出力の要素タイプはどのように制限されますか。」を参照してください。

- 組込みディクショナリには、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ファクトをインポートして定義する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 図3-5に示すように、「ファクト」ナビゲーション・タブで、「Javaファクト」タブを選択します。

図3-5 「ファクト」ナビゲーション・タブの「Javaファクト」表

3. 「Javaファクト」タブで「作成」をクリックします。図3-6に示すように、「Javaファクトの作成」ダイアログが表示されます。

図3-6 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-7に示すように、「Javaファクトの編集 -」ダイアログが表示されます。

図3-7 「Javaファクトの編集 -」ダイアログ

「Javaファクトの編集 -」ダイアログには、表3-2に示すフィールドがあります。

表3-2 「Javaファクトの編集 -」ダイアログのフィールド

フィールド

説明

クラス

Javaファクトに関連付けられているソースのJavaファクト・クラスが表示されます。

エイリアス

Javaファクトの別名を入力します。

スーパー・クラス

このファクトに関連付けられているJavaスーパークラスが表示されます。

説明

Javaファクトの説明を入力します。

参照可能

ルール・デザイナのリストにJavaファクトを表示する場合に選択します。

「属性」領域

表示または編集するJavaファクトのJavaクラスに関連付けられている、使用可能なクラス・プロパティ、コンストラクタ、メソッドまたはフィールドを選択します。

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アプリケーションのオブジェクト・モデルを拡張できます。

次に例を示します。

顧客が過去3か月間に500ドル支払った場合(IF customer spent $500 within past 3 months)

その顧客はGold Customerとなる(THEN customer is a Gold Customer)

このルールでは、顧客データを指定するJavaファクトを使用し、RLファクト(Gold Customer)を作成するアクションも使用できます。ルールは、次のように、Gold Customerファクトを使用するように定義できます。

顧客がGold Customerの場合(IF customer is a Gold customer)

10%の割引を提供する(THEN offer 10% discount)

このルールでは、Gold Customerという名前のRLファクトを使用しています。このルールは、Gold Customerファクトを使用して、過去3か月間に$500の支払があった顧客には10%割引の資格があることを示しています。ルールには、顧客がGold Customerになる他の方法も指定できます。

ルール・デザイナでテストおよびプロトタイプ化を行う場合、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-8に示すように、「ファクト」ナビゲーション・タブで、「RLファクト」タブを選択します。

図3-8 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-9に示すように、「RLファクトの編集 -」ダイアログが表示されます。

図3-9 「RLファクトの編集 -」ダイアログ

3. RLファクトのプロパティを追加するには、「RLファクトの編集 -」ダイアログの「プロパティ」領域で「作成」をクリックします。

1. 「名前」フィールドにプロパティ名を入力します。

2. 「タイプ」フィールドで、リストからタイプを選択するか、またはプロパティ・タイプを入力します。

3. プロパティにバケット・セットを関連付けるには、「バケットセット」フィールドのリストからバケット・セットを選択します。

4. プロパティに初期値を関連付けるには、「初期値」フィールドに値を入力します。

4. 必要に応じて前述の手順を繰り返し、さらにプロパティを追加します。

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

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

「RLファクトの編集 -」ダイアログを使用してRLファクトにプロパティを追加する場合、図3-10に示すように、「プロパティ」領域の「初期値」フィールドに候補値のリストが表示されます。

図3-10 RLファクトのプロパティの初期値の設定

ルール・デザイナの一部のフィールドを使用する際に、図3-11に示すように、初期値のリストや他のリストが空の場合があります。この場合、リストは空のボックスです。したがって、Rules Designerで値の入力に役立つオプションがみつからない場合、テキスト入力領域に値を直接入力するか、または「式ビルダー」アイコンをクリックして「式ビルダー」ダイアログを表示する必要があります。

図3-11 RLファクトの「初期値」フィールドの空のリスト・オプション

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

ADFビジネス・コンポーネント・ファクトを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます。ADFビジネス・コンポーネントのファクトを使用することで、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフをアサートし、Oracle Business Rulesにビュー・オブジェクトのグラフ内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させることができます。

詳細は、第10章「Oracle Business RulesとADFビジネス・コンポーネントの使用」を参照してください。

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

ADFビジネス・コンポーネント・ビュー・オブジェクトをインポートすると、ビュー・オブジェクの各属性に対応するプロパティを持つADFビジネス・コンポーネント・ファクト・タイプが作成されます。

ADFビジネス・コンポーネント・ファクトを追加する手順は、次のとおりです。

1. 「ファクト」ナビゲーション・タブをクリックし、「ADF-BCファクト」タブを選択します。図3-12に示すように、「ADF-BCファクト」表が表示されます。

図3-12 「ADFビジネス・コンポーネント・ファクト」タブ

2. 「作成」をクリックします。図3-13に示すように、「ADFビジネス・コンポーネント・ファクト」ダイアログが表示されます。

図3-13 「ADF-BCファクトの作成」ダイアログ

3. 「接続」フィールドのリストから、ADFビジネス・コンポーネント・オブジェクトで使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。詳細は、第3.5.2項「ADFビジネス・コンポーネント・ファクトのクラスパスに関する必知事項」を参照してください。

4. 「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。

5. 「OK」をクリックします。図3-14に示すように、「ファクト」ナビゲーション・タブが表示されます。インポートしたファクトには検証警告が含まれることに注意してください。この検証警告の削除の詳細は、第3.5.3項「ADFビジネス・コンポーネントの循環参照に関する必知事項」を参照してください。

図3-14ルール・デザイナでのADFビジネス・コンポーネント・ファクト

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

表示されたいずれかのクラスパスの「ADFビジネス・コンポーネント・ファクト」ダイアログの「クラスパスの検索」領域に表示されるクラスパス・リストには、プロジェクトで使用できるオブジェクト定義を表示できます。プロジェクトに使用できないクラスパスを使用する必要がある場合は、このダイアログで「クラスパスに追加」をクリックするだけで十分です(非常にまれなケース)。

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

ADFビジネス・コンポーネント・ファクトには、図3-14に示すように循環参照を含めることができます。この警告がビジネス・ルール検証ログに表示された場合は、循環参照を手動で解決する必要があります。そのためには、循環参照に関係するいずれかのプロパティの「参照可能」チェック・ボックスの選択を解除します。

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つの条件式にのみ適用するローカル・バケット・セットとして定義できます。ローカル・バケット・セットの使用の詳細は、第5.2.2項「デシジョン表への条件行の追加方法」を参照してください。

バケット・セットは次のように使用できます。

- ファクト・タイプ・プロパティをバケット・セットに関連付けることができます。これにより、ファクト・プロパティについて許容範囲内の値セットを制限できます。詳細は、第3.7.1項「バケット・セットをファクト・プロパティに関連付ける方法」を参照してください。

- デシジョン表では、バケット・セットが、デシジョン表の一部となる条件式の値リストまたは値範囲のリストを定義します。デシジョン表の各条件式では、バケット・セットの値または範囲により、複数の可能性を決定できます。バケット・セットを使用すると、条件式のそれぞれの可能性がグループまたは範囲に分けられ、それらでは1つのセルが、バケット・セットの値の1つのバケットを指定します(または、セルごとに複数バケットの値を指定することもできます)。たとえば、色について定義したバケット・セットでは、バケットに"blue"、"red"、"orange"といった文字列のリストを含むことができます。整数を含むバケット・セットでは、1未満、1から10、10より上の3つのバケットを持つことができます。詳細は、第5.2.2項「デシジョン表への条件行の追加方法」を参照してください。

- グローバル、関数および関数の引数をバケット・セットに関連付けることができます。バケット・セットをグローバルに関連付けると、割り当てられた値がバケット・セットで指定された値に制限されていることを、デザインタイムに検証できます。バケット・セットを関数の引数に関連付けると、バケット・セットの値のみを使用して関数がコールされることが検証されます。バケット・セットをこのように使用すると、ルール・デザイナでは、許可されない定数の引数値が割り当てられるか、渡されたグローバル値および関数の引数について検証警告をレポートできます。バケット・セットを関数に関連付けると、条件行の式として関数を使用した場合に、そのバケット・セットを使用するようにデシジョン表の条件式が自動的に設定されます。このタイプのバケット・セット検証は、デザインタイムの定数値のみが検証されるという意味で弱い検証です。バケット・セットに関連付けられたグローバルまたは関数の引数に基づく実行時チェックは適用されません。詳細は、第3.7.2項「バケット・セットを関数または関数の引数に関連付ける方法」を参照してください。

- デザインタイムの検証に加え、LOVバケット・セットを使用して、IF/THENルールのテストおよびアクションで式の入力時にリストに表示されるオプションを提供できます。詳細は、第4.11.3項「バケット・セットを使用してテスト式のオプションを指定する方法」を参照してください。

バケット・セットには次の3つの形式があります。

- LOV: 値リストで定義されます(第3.6.1項「値リスト・グローバル・バケット・セットの定義方法」を参照)。

- 範囲: 範囲のエンドポイントで定義される値範囲のリストで定義されます(第3.6.2項「範囲リスト・グローバル・バケット・セットの定義方法」を参照)。

- 列挙: 次のいずれかからインポートされる列挙タイプのリストで定義されます。

- XMLタイプ(第3.6.3項「XMLタイプからの列挙タイプ(列挙)バケット・セットの定義方法」を参照)。

- Javaファクト(第3.6.4項「Javaタイプからの列挙タイプ(列挙)バケット・セットの定義方法」を参照)。

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

値リスト・バケット・セットを使用すると、バケット・セットのバケットの型およびリストを指定できます。

詳細は、第3.6.5項「値リスト・バケット・セットに関する必知事項」を参照してください。

値リスト(LOV)グローバル・バケット・セットを定義する手順は、次のとおりです。

1. Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。

2. 図3-15に示すように、「バケットセットの作成」アイコンの横にあるリストから、「値リスト」を選択します。

図3-15 値リスト・バケット・セットの追加

3. バケットのバケット・アイコンをダブルクリックします。「バケットセットの編集」ダイアログが表示されます。

4. 「バケットセットの編集」ダイアログで、「名前」列にバケット・セット名を入力します。
バケット・セット名がファクトの別名と同じにならないように確認してください。これらの名前が同じだと、次のような検証エラーが発生します。

RUL-05006: The fact type "Rating" has the same alias as an unrelated bucketset.

5. 「データ型」列で、リストからデータ型を選択します。
たとえば、リストから「文字列」を選択します。

6. 「作成」アイコンをクリックして値を追加します。

7. 追加するバケットごとに、次の手順を実行します。

- 「値」フィールドに値を入力します。LOVバケットのStringタイプの値では、3回クリックすると文字列全体を選択できます。これにより、図3-16に示すように、文字列を入力し、ルール・デザイナで同じ別名が引用符で囲まれずに追加できます。

- 「エイリアス」フィールドに別名を入力します。
別名の指定方法の詳細は、第3.6.2項「範囲リスト・グローバル・バケット・セットの定義方法」を参照してください。

- 値が許可された値の場合は、「アクションで許可済」フィールドのチェック・ボックスを選択します。
「アクションで許可済」フィールドと「許可されないバケットをテストに含める」フィールドの詳細は、第3.6.7項「バケット・セットの「アクションで許可済」オプションに関する必知事項」を参照してください。

- 「説明」フィールドに説明を入力します。

8. 図3-16に示すように、必要に応じてバケット・セットの「作成」アイコンをクリックし、値をさらに追加します。

図3-16 値リスト・バケット・セットの作成

9. 「バケットセットの編集」ウィンドウで「OK」をクリックします。

デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられているLOVバケット・セット内のバケットの相対位置を変更することで管理できます。

値リスト・バケット・セット内のバケットの順序を変更する手順は、次のとおりです。

1. バケット・セットの「バケットセットの編集」ダイアログで、順序を変更するバケットを選択します。

2. バケットの順序を下位へ変更するには、「下に移動」アイコンをクリックします。

3. バケットの順序を上位へ変更するには、「上に移動」アイコンをクリックします。

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

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

範囲リスト・バケット・セットを使用すると、バケット・セットのバケットの型およびエンドポイントを指定できます。

詳細は、第3.6.6項「範囲バケット・セットに関する必知事項」を参照してください。

範囲リスト(範囲)グローバル・バケット・セットを定義する手順は、次のとおりです。

1. Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。

2. 「バケットセットの作成」アイコンの横にあるリストから、「範囲リスト」を選択します。

3. 「データ型」フィールドをダブルクリックします。図3-17に示すように、「バケットセットの編集」ダイアログが表示されます。

図3-17 「バケットセットの編集」: 範囲リスト

4. 「バケットセットの編集」ダイアログで、「名前」フィールドにバケット・セット名を入力します。

5. 「バケットセットの編集」ダイアログで、「データ型」フィールドのリストからバケット・セットに該当するデータ型を選択します。
この例では、「int」を選択します。

6. 「バケットの追加」アイコンを繰り返しクリックし、図3-18に示すようにバケット・セットに必要な数のバケットを追加します。

図3-18 「バケットセットの編集」: 必要なバケットの追加

この手順では、3つのバケットを追加します。図3-18に示すように、デフォルト値で開始します。デフォルトのバケットを変更した後、バケットには次の値が存在します。

- 1000より大きい

- 500以上1000以下

- 500未満

ルール・デザイナにより、デフォルト値50、0および負の無限大(-Infinity)でバケットが追加されます。

7. 「エンドポイント」フィールドで、最初(最上位)のバケットから始めてデフォルト値をダブルクリックし、最上位の値バケットのエンドポイントを入力して[Enter]を押します。

この例では、最初のバケットについて1000と入力します。

8. 「含まれるエンドポイント」フィールドで、該当するチェック・ボックスを選択して、バケットのエンドポイントを含めるか除外します。
この例では、バケットのエンドポイントを含めるために、このチェック・ボックスを選択状態のままにしておくことができます。

9. 「アクションで許可済」フィールドで、該当するチェック・ボックスを選択して、バケット・セットの許可された値にバケットを含めます。
「アクションで許可済」フィールドと「許可されないバケットをテストに含める」フィールドの詳細は、第3.6.7項「バケット・セットの「アクションで許可済」オプションに関する必知事項」を参照してください。

10. 「エイリアス」フィールドでデフォルト値をダブルクリックし、必要なバケット別名を入力して[Enter]を押すこともできます。
別名は、このバケット・セットを使用するデシジョン表に表示されます。別名を使用すると、バケットにデフォルト値(範囲ベースの範囲値)よりもわかりやすい名前を付けることができます。

Oracle Business Rulesのほとんどの名前と別名では、文字、数字、埋込みの単一スペース、特殊文字($、_、'、.、-、/、:.)しか使用できません。ただし、バケット別名では、[0..1]などのその他の文字を使用できます。バケット別名にこうした追加の文字が含まれている場合、デシジョン表のアクション・セル内の別名によってバケットを参照することはできません。この場合は、バケット名(バケット値とも呼ばれている)を使用できます。

「範囲」フィールドは読取り専用で、バケットに関連付けられている実際の範囲が別名値に関係なく明確に識別されます。詳細は、第3.6.6項「範囲バケット・セットに関する必知事項」を参照してください。

11. 以降のバケットごとに、バケットのリスト内で下に移動し、手順7以降を繰り返します。第2のバケットの場合、エンドポイント値500を入力します。
図3-19に、完成したバケット・セットを示します。

図3-19 「バケットセットの編集」: 完成した範囲バケット

12. 「バケットセットの編集」ダイアログで「OK」をクリックします。

3.6.3 XMLタイプからの列挙タイプ(列挙)バケット・セットの定義方法

XMLスキーマをインポートする際に、XSDに列挙値が含まれていると、ルール・デザイナでは列挙ごとに列挙タイプ・バケット・セットが自動的に作成されます。列挙タイプ・バケット・セットは読取り専用ですが、バケットの順序は変更できます。

詳細は、第3.2.4項「XMLファクトに関する必知事項」を参照してください。

XMLタイプから列挙タイプ(列挙)バケット・セットを定義する手順は、次のとおりです。

1. 必要な列挙を含むXSDを取得します。
例3-2に、列挙Statusを含むorder.xsdスキーマ・ファイルを示します。

例3-2 order.xsdスキーマ

<?xml version="1.0" ?>
<schema attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://example.com/ns/customerorder"
xmlns:tns="http://example.com/ns/customerorder"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="CustomerOrder">
<complexType>
<sequence>
<element name="name" type="string" />
<element name="creditScore" type="int" />
<element name="annualSpending" type="double" />
<element name="value" type="string" />
<element name="order" type="double" />
</sequence>
</complexType>
</element>
<element name="OrderApproval">
<complexType>
<sequence>
<element name="status" type="tns:Status"/>
</sequence>
</complexType>
</element>
<simpleType name="Status">
<restriction base="string">
<enumeration value="manual"/>
<enumeration value="approved"/>
<enumeration value="rejected"/>
</restriction>
</simpleType>
</schema>

2. ルール・デザイナでディクショナリを開き、列挙を含む指定のスキーマを使用してXMLファクトを作成します。詳細は、第3.2項「XMLファクトの使用」を参照してください。

3. 「バケットセット」ナビゲーション・タブをクリックし、Enumバケット・セットを選択して、図3-20に示すようなバケット・セットを表示します。図3-20では、例3-2に示すインポートされたStatusの列挙値がXSD指定値を含むバケットとしてインポートされていることに注意してください。

図3-20 インポートされた値を含むフォームEnumを示すバケット・セット

デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられている列挙バケット・セット内のバケットの相対位置を変更することで管理できます。

列挙バケット・セット内のバケットの順序を変更する手順は、次のとおりです。

1. バケット・セットの「バケットセットの編集」ダイアログで、順序を変更するバケットを選択します。

2. バケットの順序を下位へ変更するには、「下に移動」アイコンをクリックします。

3. バケットの順序を上位へ変更するには、「上に移動」アイコンをクリックします。

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

3.6.4 Javaタイプからの列挙タイプ(列挙)バケット・セットの定義方法

Java列挙をインポートすると、ルール・デザイナではJava列挙ごとに列挙タイプのバケット・セットが自動的に作成されます。列挙タイプ・バケット・セットは読取り専用ですが、バケットの順序は変更できます。

Javaファクトから列挙タイプ(列挙)バケット・セットを定義する手順は、次のとおりです。

1. 必要な列挙を含むJavaクラスを作成または取得します。
例3-3に、列挙OrderSizeを含むRejectPurchaseItem.javaクラスを示します。

例3-3 列挙OrderSizeを含むJavaファクト

package com.example;

public class Class1
{
public enum OrderSize { SMALL, MEDIUM, LARGE };
public Class1()
{
}
}

2. ルール・デザイナでディクショナリを開き、Javaクラスを使用してJavaファクトを作成します。詳細は、第3.3項「Javaファクトの使用」を参照してください。
図3-21に、Java列挙Class1$OrderSizeのJavaファクトの作成方法を示します。

図3-21 Javaファクトの作成

3. 図3-22に示すように、Rules Designerで「バケットセット」ナビゲーション・タブをクリックし、Enumバケット・セットを選択します。例3-3の列挙からの列挙Class1$OrderSizeが、Javaのenum指定値を含むバケット・セットになっていることに注意してください。

図3-22 Java Enumの「バケットセットの編集」ダイアログ

デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられている列挙バケット・セット内のバケットの相対位置を変更することで管理できます。

列挙タイプ(列挙)バケット・セット内のバケットの順序を変更する手順は、次のとおりです。

1. バケット・セットの「バケットセットの編集」ダイアログで、順序を変更するバケットを選択します。

2. バケットの順序を下位へ変更するには、「下に移動」アイコンをクリックします。

3. バケットの順序を上位へ変更するには、「上に移動」アイコンをクリックします。

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

3.6.5 値リスト・バケット・セットに関する必知事項

デシジョン表では、条件式に関連付けられているバケット・セット内のバケットの順序によって条件セルの順序が決まり、したがってルールの順序も決まります。デシジョン表でのルールの順序付けは、条件式に関連付けられている値リスト・バケット・セット内のバケットの相対位置を変更することで管理できますが、範囲バケットの順序は変更できません。

図3-23に、値リストを使用するcolorsというバケット・セットに関するルール・デザイナ内のバケット・セット定義を示します。

図3-23 値リストを使用したバケット・セット定義

図3-23に示すように、デフォルトの値リスト・バケット・セットでは、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型が含まれます。

Calendar

現行ロケール内のCalendar型が含まれます。

注意:

デシジョン表でブール型を使用する場合、LOVバケット・セットを指定する必要はありません。ブール型の場合、Oracle Business Rulesには可能な値(trueおよびfalse)用の組込みバケットが用意されています。

3.6.6 範囲バケット・セットに関する必知事項

範囲リスト・バケット・セットにバケットを追加すると、現在選択しているバケット値および次に上位のバケット値に基づいて値が計算されます。エンドポイント値を変更すると、値は自動的にバケット・セット内でソートされるため、新規バケットの追加先はどこでもかまいません。ただし、ルール・デザイナでは、現行のバケット・セットのエンドポイント値およびエンドポイント値の間に余地がない場合があります。この場合、ルール・デザイナでは次の書式の検証警告が表示されます。

RUL-05849: Bucketset has duplicate bucket value "4999"

この問題を解決するには、バケットのエンドポイントを変更し、重複するバケットを削除する必要があります。

図3-24に、整数intおよび範囲を持つバケット・セットの「バケットセットの編集」ウィンドウを示します。

図3-24 範囲リストと3つのエンドポイントを使用したバケット・セット定義

表3-4に、ルール・デザイナで範囲バケットについてサポートされている型を示します。

表3-4 範囲バケットについてサポートされている型

タイプ

説明

選択したプリミティブ型

int、double、short、longおよびfloatが含まれます。

Calendar

現行ロケール内のCalendar型が含まれます。

「範囲」フィールドに関する次の規則に注意してください。

- 論理演算子: 正または負の無限大に関する範囲を指定します。たとえば、>=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))のような無効な値を使用するアクションを作成しようとした場合に、デザインタイムの検証警告が提供されるためです。詳細は、第4.11項「ルールにおけるオプション値の制約としてのバケット・セットの使用」を参照してください。

2. ルールのテストやデシジョン表で、除外したバケットを検討したい場合があります。この場合、「許可されないバケットをテストに含める」を選択する必要があります。これは、Oracle Business Rules Engineの入力データがクリーンでなく、無効なデータ(無効な負の年齢など)が含まれているような場合に役立ちます。すべてのバケット・セットのアクションを提供するデシジョン表では、除外したバケットのケースを含めて、エラー・ファクトのアサートなど、適切なアクションを提供することもできます。この処理のためには、バケット・セット内のすべてのバケットの「アクションで許可済」フィールドを選択するか、「アクションで許可済」フィールドの構成をそのままにして、「許可されないバケットをテストに含める」フィールドを選択できます。「許可されないバケットをテストに含める」フィールドを使用すると、(すべてのバケットを再構成する必要がないので)便利なだけでなく、「アクションで許可済」の構成が保持されるので、このバケット・セットを再使用して簡単に最初のケースを処理できます(「許可されないバケットをテストに含める」の選択が解除されている場合)。

3.6.8 バケット値に関する必知事項

バケット・セットにバケット値を入力する場合、入力値はバケット・セットに指定されたタイプに対して有効である必要があります。入力した値がバケット・セット・タイプに無効であると、ルール・デザイナで引用符が追加され文字列になります。入力されたデータが指定タイプに対して適切でない場合、引用符を追加することによってのみ有効なリテラルとなります。たとえば、intタイプのLOVバケット・セットで2.2という値を入力すると、ルール・デザイナから次のような警告が表示されます。

RUL-05833: Invalid characters "2.2" in bucket 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-25に示す例を参照してください。

図3-25 プロパティのバケット・セットの定義

4. 「ファクトの編集」ページで「OK」をクリックします。

3.7.2 バケット・セットを関数または関数の引数に関連付ける方法

デシジョン表を作成する準備のため、グローバル・バケット・セットをデータ・モデル内の関数に関連付けることができます。

バケット・セットを関数の戻り値に関連付ける手順は、次のとおりです。

1. Rules Designerで、「関数」タブを選択します。

2. 編集する関数を選択します。これにより、選択された関数について、関数の引数および関数本体が表示されます。

3. 「関数」表の「バケットセット」の下でセルを選択し、使用するバケット・セットをリストから選択します。図3-26に示す例を参照してください。

図3-26 関数の戻り値に対するバケット・セットの定義

バケット・セットを関数の引数に関連付ける手順は、次のとおりです。

1. Rules Designerで、「関数」ナビゲーション・タブを選択します。

2. 編集する関数を選択します。これにより、選択された関数について、関数の引数および関数本体が表示されます。

3. 「関数」表の「引数」領域で、適切な引数を選択します。

4. 指定の引数について「バケットセット」の下でセルを選択し、使用するバケット・セットをリストから選択します。

3.7.3 バケット・セットのグローバル値との関連付け方法

デシジョン表を作成する準備のため、グローバル・バケット・セットをデータ・モデル内のグローバル値に関連付けることができます。

バケット・セットをグローバル値に関連付ける手順は、次のとおりです。

1. Rules Designerで、「グローバル」ナビゲーション・タブを選択します。

2. 編集対象のグローバル値を選択します。

3. 「グローバル」表の「バケットセット」の下で、適切なグローバル値のセルを選択し、グローバル値に関連付けるバケット・セットをリストから選択します。図3-27に示す例を参照してください。

図3-27 グローバル値に対するバケット・セットの定義

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

この章では、ルールセットと呼ばれるOracle Business Rulesデータ・モデル要素について説明します。ルールセットは、1つ以上のルールおよびデシジョン表をグループ化するために使用します。ディクショナリ、ネスト・テスト、拡張ツリー・モードのルール、式ビルダーの使用方法についても説明します。

この章の項目は、次のとおりです。

- 第4.1項「ルールセットとルールの使用の概要」

- 第4.2項「ルールセットの使用」

- 第4.3項「ルールの使用」

- 第4.4項「ディクショナリの検証」

- 第4.5項「ルールおよびデシジョン表での詳細設定の使用」

- 第4.6項「ネスト・テストの使用」

- 第4.7項「拡張モードのルールの使用」

- 第4.8項「ツリー・モードのルールの使用」

- 第4.9項「日付ファクトの使用、日付関数および有効日の指定」

- 第4.10項「式ビルダーの使用」

- 第4.11項「ルールにおけるオプション値の制約としてのバケット・セットの使用」

詳細は、第1.1.5項「ルールセットとは」を参照してください。

4.1 ルールセットとルールの使用の概要

ビジネス・ルールを使用すると、次のようにビジネスに関する重要なデシジョンおよびポリシーを定義できます。

- ビジネス・ポリシー: 消費ポリシーおよび承認マトリックスなど

- 制約: 有効な構成や規制上の要件など

- 計算: 割引、割増またはスコアなど

- 判断機能: 顧客の額に基づくオファーなど

Oracle Business Rulesでは、次の2つの方法でルールを使用できます。

- IF/THENルールの使用

- デシジョン表でのルールの使用

この章では、IF/THENルールの使用について説明します。デシジョン表の詳細は、第5章「デシジョン表の使用」を参照してください。

4.2 ルールセットの使用

ルールセットは、ルールおよびデシジョン表の実行単位となります。また、ルールの共有単位でもあり、ルールはルールセットに属します。複数のルールセットを順番に実行できます。この処理は、ルール・フローと呼ばれます。順序はルールセット・スタックによって決まります。この順序は、スタック上でルールセットをプッシュおよびポップするルール・アクションによって操作できます。ルールセットでは、そこに含まれるルールの起動順序を指定するために、ルールの優先度が適用されます。また、ルールセットは、ルールセットが常にアクティブであること、またはルールセットが日時の範囲や開始日時または終了日時に基づいて制限されることを識別する、有効日指定も提供します。

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

ルールおよびデシジョン表はすべて、ルールセット内に作成されます。ルールセットにより、ルールとデシジョン表が1つの実行単位として編成されます。

ルールセットを作成する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブにナビゲートします。

2. 「ルールセットの作成」アイコンをクリックします。「ルールセットの作成」ダイアログが表示されます。

3. 「名前」フィールドに名前を入力します。

4. 図4-1に示すように、「説明」フィールドに説明を入力します。

図4-1 ルールセットの追加

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

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

有効日のサポートにより、ルールセット、ルールまたはデシジョン表の開始日と終了日を指定できます。ルールセットの場合、有効日では、ルールセット内のルールおよびデシジョン表が有効な日付の範囲を定義します。有効日の詳細は、第4.9項「日付ファクトの使用、日付関数および有効日の指定」を参照してください。

ルールセットの有効日を設定する手順は、次のとおりです。

1. 「ルールセット」ナビゲーション・タブで、ルールセット名を選択します。

2. 図4-2に示すように、ルールセット名の横にあるナビゲーション・アイコンをクリックしてルールセット情報を開き、ルールセットの「名前」、「説明」および「有効日」フィールドを表示します。

図4-2 「有効日」フィールドが表示されているルールセット

3. 「有効日」エントリを選択します。図4-3に示すように、「有効日の設定」ダイアログが表示されます。

図4-3 「有効日の設定」ダイアログの使用

4. 「有効日の設定」ダイアログを使用して、ルールセットの有効日を指定します。「日付の設定」アイコンをクリックすると、「開始」および「終了」フィールドのデータ入力に役立つカレンダが表示されます。

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

ルールセット内のルール数が増加するにつれて、ルール・リストのナビゲートが困難になる可能性があります。ルール・デザイナに対して、ルール・リストをフィルタして必要なルールのみを表示するように指示できます。たとえば、アクティブなルールのみ、または検証警告のあるルールのみを表示できます。

ルール作成の詳細は、第4.3項「ルールの使用」を参照してください。

フィルタを使用してルールセット内で一致するルールを表示する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. ルールのフィルタ設定を表示するには、図4-4に示すように、ルールセット名の横にある「フィルタ問合せの表示」をクリックします。

図4-4 ルールセット内のフィルタ問合せの表示

3. 図4-5に示すように、「フィルタ問合せ」フィールドで「<テストの挿入>」をクリックしてデフォルトのテストを挿入します。

図4-5 デフォルトのフィルタ問合せテストの挿入

4. デフォルトのテストを構成します。
この場合、図4-6に示すように、「<オペランド>」をクリックすると、表4-1に示すルール固有のオプションから選択できます。

表4-1 ルールのフィルタ問合せのオペランド

オペランド

説明

name

ルール名と照合します。

description

ルールの説明と照合します。

priority

ルールの優先度と照合します。詳細は、第4.5.5項「ルールの優先度の設定方法」を参照してください。

start date

ルール開始日と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。

end date

ルール終了日と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。

minutes until start date

ルール開始日までの指定の時間(分)と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。

minutes until end date

ルール終了日までの指定の時間(分)と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。

days until start date

ルール開始日までの指定の日数と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。

days until end date

ルール終了日までの指定の日数と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。

years until start date

ルール開始日までの指定の年数と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。

years until end date

ルール終了日までの指定の年数と照合します。詳細は、第4.9.2項「ルールの有効日の設定方法」を参照してください。

is active

ルールがアクティブかどうかと照合します。詳細は、第4.5.3項「アクティブ・オプションの選択方法」を参照してください。

is valid

ルールに検証警告があるかどうかと照合します。詳細は、第4.4.2項「ルール検証」を参照してください。

referenced fact types

1つ以上のファクト・タイプと照合します。

図4-6 フィルタ問合せのオペランド

詳細は、第4.3.2項「ルールでのテストの定義方法」を参照してください。

5. 演算子を選択し、比較演算子を選択します。たとえば、「name」の場合は、オペランド・リストから「startsWith」を選択できます。

6. フィルタ・テストの右の比較オペランドを入力します。たとえば、文字列Customerを入力します。

7. フィルタ問合せが完成した後、フィルタをルールセット内のルールに適用できます。

1. フィルタを適用するには、「フィルタ・オン」チェック・ボックスを選択します。
ルール・デザイナでは、図4-7に示すように、フィルタ問合せに一致するルールのみが表示されます。

図4-7 「フィルタ・オン」オプションによるルールセットでのフィルタ問合せの有効化

2. フィルタ問合せを無効化するには、「フィルタ・オン」チェック・ボックスの選択を解除します。
ルールセット内のすべてのルールが表示されます。

3. フィルタ問合せを削除するには、対象のフィルタ問合せを選択し、[Del]を押すか「フィルタのクリア」アイコンをクリックします。

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

ルール・デザイナを使用すると、ビジネス・ルールの次のコンポーネントの値を簡単に設定できます。

- 式

- 条件

- オペランド

- アクション

これらのコンポーネントを編集するには、Rules Editorでそのコンポーネントをクリックして、ドロップダウン・リストまたはツリーから必要な値を選択します。リストの最上部にあるテキスト領域に、必要な値の名前を入力することもできます。テキストの入力を開始すると、図4-8のように、オプションのリストがフィルタされます。

図4-8 オート・コンプリート機能の使用

この図では、入力したテキストで始まるオプションのみが表示されています。

4.3 ルールの使用

ファクトを処理し、Oracle Business Rulesで処理できる暫定的な結論を取得するためのビジネス・ルールを作成します。ルールセット内にルールを作成するため、ルールを使用する前にルールセットを作成する必要があります(または、デフォルトのルールセットを使用します)。ルールセット作成の詳細は、第4.2項「ルールセットの使用」を参照してください。

デザイン中のルールは容易にテストでき、アプリケーションにデプロイする必要がありません。詳細については、第8.1.5項「Oracle Business Rules関数によるデシジョン関数のテスト方法」を参照してください。

ルールの使用時には、ルール・デザイナによるルール検証が役立ちます。検証ログ・ウィンドウを表示するには、「検証」アイコンをクリックするか、または「表示」→「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。これにより、不正または不完全なルールに関する警告が表示されます。ルールをテストまたはデプロイする前に、すべての警告を修正する必要があります。ルール検証の詳細は、第4.4.2項「ルール検証」を参照してください。

ルールセット内のルール数が増加するにつれて、ルール・リストをフィルタして必要なルールのみを表示するようにルール・デザイナを構成できます。詳細は、第4.2.3項「フィルタを使用してルールセット内で一致するルールを表示する方法」を参照してください。

4.3.1 ルールの追加方法

ルールを作成するには、まずルールをルールセットに追加してから、テストとアクションを挿入します。アクションはパターン一致と関連しています。実行時に、ルールの「IF」領域にあるテストが一致すると、Rules Engineにより「THEN」のアクションがアクティブ化され、ルールに関連付けられているアクションの実行が準備されます。

ルール・デザイナでは、デフォルトで一致したファクトごとにルールが起動するルールを作成できます。同じファクト・タイプが2回以上一致するか、まったく一致しないという他のオプションを有効化するには、「拡張モード」を選択します。拡張モードおよび詳細設定の表示の詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

ルールセットにルールを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. 「表示」フィールドで「IF/THENルール」を選択します。

3. 「追加」をクリックしてルールを追加します。たとえば、図4-9に示すように、「追加」をクリックしてRule_1というルールを追加します。

図4-9 ルールセットへのルールの追加

4.3.2 ルールでのテストの定義方法

ルール内でテストを作成するには、ファクトに対する条件を追加します。たとえば、年間消費額プロパティを持つCustomerOrderサンプル・ファクトを使用し、顧客に関連付けられている年間消費額に基づいて、顧客の注文が高額消費に関連付けられているかどうかを判別するテストを追加できます。バケット・セットを使用して、ルール内のテストおよびアクションの値を制限できます。詳細は、第4.11項「ルールにおけるオプション値の制約としてのバケット・セットの使用」を参照してください。

図4-10に、このサンプル・ルールを示します。

図4-10 ルールへのテストの追加

実行時には、このルールが処理される際に、Rules Engineにより、一致するファクトを検索するように定義したルール・パターン・テストを基準にしてファクトがチェックされます。このサンプル・ルールRule_1の場合、ファクトが一致すると、Rules Engineによりファクトが変更されて、値プロパティが「High」に変更されます。

ルール内でテストを定義する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. 「表示」フィールドで「IF/THENルール」(Rules Designerのデフォルト)を選択します。

3. 使用するルールを追加または選択します。たとえば、Rule_1を選択します。

4. 「Rule_1」の「IF」領域で、「<テストの挿入>」を選択します。

5. テストの場合、図4-11に示すように、ルールの「IF」領域には左<オペランド>と右<オペランド>が含まれています。

図4-11 左オペランドと右オペランドを使用するルール・テスト

6. テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。図4-12に示すように、テキスト入力領域とリストが表示されます。

図4-12 ルール内のテストの左オペランドの構成

1. 値を入力するには、リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。

2. リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。
対応するオペランドのタイプと一致する値を入力する必要があります。たとえば、テストIF CustomerOrder.annualSpending > <operand>の場合、<operand>に有効な値は、CustomerOrderフィールドのannualSpendingのタイプと一致する必要があります。

7. テストでは、表示される演算子を必要な論理演算子で置き換えるか、またはデフォルト(==)を受け入れます。そのためには、デフォルトの==演算子を選択します。フィールドとリストが表示されます。左オペランドのデータ型に応じて、リストには追加の演算子が含まれる場合もあります。たとえば、文字列をテストする場合、左側でStringオペランドを選択すると、図4-13に示すように、追加のString演算子(startsWithおよびequalsIgnoreCaseなど)が使用できるようになります。

図4-13 ルール内のString演算子の構成

同様に、左オペランドと右オペランドの間の論理条件をテストするには、図4-14に示すように、論理演算子==(等号)、!=(等しくない)、>(より大きい)、>=(以上)、<(より小さい)、<=(以下)から1つ選択します。演算子の詳細は、付録B「Oracle Business Rulesの組込みクラスと関数」を参照してください。

図4-14 ルール内のテストの演算子の構成

8. テストでは、右オペランドを値で置き換えます。
<オペランド>プレースホルダを、オペランドに使用できるように構成します。

たとえば、図4-15に示すように、テキスト入力領域に2000と入力し、[Enter]または[Return]を押します。

図4-15 ルール内のテストの右オペランドの構成

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

Oracle Business Rulesテスト変数を使用すると、ルールおよびデシジョン表の条件やアクションで発生する冗長な式を短縮できます。変数およびその値は、インラインのビジネス条件定義と表現されることがあります。テスト変数は、インライン・エイリアスとも呼ばれます。

テスト変数を挿入するオプションは、ルール条件セクションの<insert test>の横にリストとして表示されます。ルール条件の定義の一部として、複雑な式、数学式または関数に対するコールアウトを表す変数を定義できます。

たとえば、SongというXMLファクトがあり、composerという属性にsizeという関数があるとします。この属性を参照するときには、Song.composer.size()を毎回使用するのではなく、次のように単純な変数を定義できます。

lo = Song.composer.size()

これ以降、テストでは、式の一部にloを使用できます。簡単なものから複雑な式まで、あらゆる式にすることが可能です。たとえば、関数の本体で、<insert action>をクリックすると、使用可能なオプションの一部として式を表示できます。

図4-16は、テスト変数を表示しています。

図4-16 ルールのテスト変数

インライン・エイリアスを定義したら、それ以降のテスト条件では、オペランドのリスト内でインライン・エイリアスを使用できます。インライン・エイリアスの範囲は、そのインライン・エイリアスが定義された特定のルールにおけるそれ以降のテストに制限されます。ネスト・テストの場合でもインライン・エイリアスを使用できます。ネスト・テストは、そのエイリアスを定義したベース・テストの一部だからです。このことは、ネスト・テスト内で定義するすべてのテストにあてはまります。インライン・エイリアスの範囲は、ベース・テストとそのネスト・テストの条件に対して制限されるだけでなく、そのルールのアクションに対しても制限されます。インライン・エイリアスがネスト・テストの条件の一部として定義され、メインのテスト条件の一部としては定義されていない場合でも、このエイリアスは、メインのネスト・テスト内部または外部のそれ以降のすべてのテスト条件に対して使用できます。

ただし、ネストされていないテスト内部でインライン・エイリアスを定義した場合は、このインライン・エイリアスの範囲は、ネストされていないテスト内部のそれ以降のテストのみに制限され、ネストされていないテストの外部のどのテストにも制限されません。

インライン・エイリアスは、If-Thenルールとデシジョン表のどちらでも使用できます。デシジョン表では、拡張モードで、パターンを表示または非表示にしたり、<insert pattern>をクリックしてパターンを入力できます。パターンを挿入したら、テストを挿入できます。標準モードでは、テストを表示または非表示にしたり、<insert test>をクリックしてテストを入力できます。

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

ルール内で範囲テストを作成するには、ファクトに対する条件を追加します。たとえば、年間消費額プロパティを持つ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. 図4-17に示すように、ルールの「IF」領域のテストには左<オペランド>と右<オペランド>が含まれています。

図4-17 左オペランドと右オペランドを使用するルール・テスト

6. 範囲テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。図4-18に示すように、テキスト入力領域とリストが表示されます。

図4-18 ルールへのテストの左オペランドの追加

1. 値を入力するには、リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。

2. リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。対応するオペランドのタイプと一致する値を入力する必要があります。
たとえば、テストIF CustomerOrder.annualSpending > <operand>の場合、<operand>に有効な値は、CustomerOrderフィールドのannualSpendingのタイプと一致する必要があります。

7. 範囲テストでは、between演算子を選択します。そのためには、デフォルトの==演算子を選択します。テキスト入力領域とリストが表示されます。図4-19に示すように、「between」を選択します。

図4-19 ルール内の範囲テストの演算子の構成

これにより、図4-20に示すように、さらに2つの<オペランド>プレースホルダが追加されます。

図4-20 範囲テストのbetween演算子

8. 図4-21に示すように、<オペランド>プレースホルダをオペランドに使用できるように構成します。

図4-21 ルール内の範囲テストのオペランドの構成

このテストがtrueになるのは、左端のオペランド(CustomerOrder.annualSpending)が値100および2000の間にある場合です。

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

ルール内でセット・テストを作成するには、ファクトに対する条件を追加します。たとえば、ライン品目プロパティを持つ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. 図4-11に示すように、ルールの「IF」領域のテストには左<オペランド>と右<オペランド>が含まれています。

図4-22 左オペランドと右オペランドを使用するルール・テスト

6. セット・テストでは、左オペランドを値で置き換えます。
そのためには、左の「<オペランド>」を選択します。図4-23に示すように、テキスト入力領域とリストが表示されます。

図4-23 ルールへのテストの左オペランドの追加

1. 値を入力するには、リストを使用して、値オプションから項目を選択します。
オプションを表示するには、「一覧で表示」を選択して単一リストを使用する方法と、「ツリー表示」を選択し、ナビゲータを使用する方法があります。

2. リテラル値を入力するには、値をテキスト入力領域に入力して[Enter]を押します。

7. セット・テストでは、in演算子を使用します。そのためには、デフォルトの==演算子を選択します。テキスト入力領域とリストが表示されます。図4-24に示すように、「in」を選択します。

図4-24 ルール内のセット・テストの演算子の構成

これにより、図4-25に示すように、さらに2つの<オペランド>プレースホルダがカンマ区切りリスト形式で追加され、<挿入>プレースホルダも追加されます。

図4-25 セット・テストのin演算子

リストに別のオペランドを追加するには、「<挿入>」をクリックします。

リストからオペランドを削除するには、オペランドを右クリックして「テスト式の削除」を選択します。

8. 図4-26に示すように、<オペランド>プレースホルダをオペランドに使用できるように構成します。

図4-26 ルール内のセット・テストのオペランドの構成

このテストがtrueになるのは、左端のオペランド(CustomerOrder.lineItem.sku)の値が12345、43255または76348の場合です。

4.3.6 ルールでのアクションの定義方法

ルールを作成するには、テストおよびアクションを挿入します。アクションはパターン一致と関連しています。ルールの「IF」領域にあるテストが一致すると、Rules Engineにより「THEN」のアクションがアクティブ化され、ルールに関連付けられているアクションの実行が準備されます。

アクションを追加する場合は、表4-2に示すいずれかのフォームのアクションを使用します。表4-2に示す各フォームでは、ルール・デザイナが表示するオプションは状況依存なので、使用するリストおよび項目の数は、追加するアクション、およびアクションの入力中の選択内容に応じて異なる可能性があります。表4-2には基本のアクションが示されています。拡張モードでは追加のアクションを使用できます。拡張モードの詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

表4-2 ルール・アクションのオプション

アクション・フォーム

説明

Assert New

新規ファクトのアサート

Modify

一致したファクトに関連付けられているデータ値の変更

Retract

ファクトの取消し

Call

関数のコール

If, else, elseif, for, while

条件アクション

ルール内でアクションを定義する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. ルールの「THEN」領域で、「<アクションの挿入>」を選択します。図4-27に示すように、「アクションの追加」リストが表示されます。

図4-27 ルールへのModifyアクションの追加

3. 「アクションの追加」リストで、追加するアクションのタイプを選択します。たとえば、「modify」を選択します。テキスト領域にアクション名を入力することもできます。テキストの入力を開始すると、使用可能な選択肢のリストが自動的にフィルタされます。この機能は、使用可能なオプションの数が多い場合に便利です。
ここに示すように、assert、call、modifyの範囲の必要なアクションを、if、else、elseif、while、for、if (advanced)、while (advanced)のような条件アクションにも追加できます。

4. 「THEN」領域で、「<ターゲット>」を選択してオプション・リストを表示します。図4-28に示すように、「customerOrder」を選択します。

図4-28 ルールへのModifyアクションの追加とターゲットの選択

5. 「<プロパティの追加>」を選択します。「プロパティ」ダイアログが表示されます。

6. 図4-29に示すように、「プロパティ」ダイアログで、「値」列に"High"と(二重引用符を含めて)入力し、[Enter]を押します。

図4-29 ルールへのModifyアクションのプロパティと値の追加

7. 「プロパティ」ダイアログで、「閉じる」をクリックします。図4-30に示すように、ルールが表示されます。

図4-30 テストとアクションが追加されたルール

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

条件の値がアクションによって変更された場合に、ルールのループが発生することがあります。ループは、単一ルール内のルール間、複数のデシジョン表全体、または同一ルールセット内のルールおよびデシジョン表全体で発生する場合があります。ルール条件内で使用されるファクト・プロパティを変更するルール・アクションは作成しないようにする必要があります。このようなルールによって、実行時に無限ループが発生する場合があります。

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

ほとんどの場合、ルールを記述する際にパフォーマンスに注意を払う必要はありません。ただし、ルールのパフォーマンスを向上および最大化するのに役立つヒントがありますので、必要に応じて利用してください。

Oracle Business Rulesのパフォーマンス・チューニングの詳細は、『Oracle Fusion Middlewareパフォーマンスおよびチューニング・ガイド』の「Oracle Business Rulesパフォーマンス・チューニング」を参照してください。

4.4 ディクショナリの検証

ディクショナリを変更すると、ルール・デザイナではディクショナリ検証が実行されます。ルールまたはデシジョン表の使用時には、ルール・デザイナによる検証が役立ちます。検証ログ・ウィンドウを表示するには、「検証」アイコンをクリックするか、または「表示」→「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。これにより、不正または不完全なルールに関する警告が表示されます。ルールをテストまたはデプロイする前に、すべての警告を修正する必要があります。

ディクショナリが無効な場合、ルール・デザイナでは警告メッセージのリストが生成されて関連ディクショナリ・オブジェクトがリスト表示されます。検証メッセージ情報は、ディクショナリ・オブジェクトの検索と問題の解決に使用できます。また、検証警告のあるオブジェクトには、図4-31に示すように検証インディケータ(赤い波線による下線)のフラグが付きます。

図4-31 ログと画面に波線による下線で表示された検証警告

ディクショナリが無効な場合は、そのディクショナリを保存できます。ただし、RL Languageを生成できるのは、有効でルール・デザイナの検証ログに警告が表示されないディクショナリの場合のみです。

検証ログでは、各検証メッセージに次の情報が含まれています。

- メッセージ: メッセージは、Oracle Business Rules例外に関する問題の詳細説明を提供します。

- ディクショナリ・オブジェクト: このフィールドには、ディクショナリのコンポーネントの識別に必要な詳細を示すパスが表示されます。

- プロパティ: 警告メッセージに関連するオブジェクトの、プロパティに関する情報を提供します。

検証ログの表示中に、項目を選択し、右クリックしてリストから「エディタでオブジェクトを選択して強調表示」を選択すると、カーソルが移動し、ディクショナリ・オブジェクトが選択されます。一部の検証警告の場合、この機能を使用できないことに注意してください。

4.4.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.4.2項「ルール検証」

- 第4.4.3項「デシジョン表の検証」

- 第4.4.4項「ディクショナリの検証方法」

4.4.2 ルール検証

「検証」アイコンをクリックすると、Rules Designerにより検証ログが表示されます。ルールを初めて追加すると、図4-32のような検証警告が表示されます。

図4-32 ルール検証メッセージ

ルールに関する検証メッセージのディクショナリ・オブジェクト名部分には、検証警告に関連するルールセット、ルールおよびルール内の領域を識別できるように詳細が含まれています。たとえば、次のディクショナリ・オブジェクト指定は問題を示しています。

OracleRules1/Ruleset_2/Rules_1/Pattern[1]

検証メッセージでは、ルールのディクショナリ・オブジェクト名に1から始まる索引が使用されます。したがって、最初のパターンはPattern[1]です。

ルールを検証するのみでなく、デザイン時にルール・デザイナでテストすることもできます。詳細については、第8.1.5項「Oracle Business Rules関数によるデシジョン関数のテスト方法」を参照してください。

4.4.3 デシジョン表の検証

「検証」アイコンをクリックすると、Rules Designerにより検証ログが表示されます。デシジョン表を初めて追加すると、図4-33のような検証警告が表示されます。

図4-33 デシジョン表の検証メッセージ

デシジョン表に関する検証メッセージのディクショナリ・オブジェクト名部分には、デシジョン表のうち検証警告に関連する領域を識別できるように詳細が含まれています。たとえば、次のディクショナリ・オブジェクト指定は、デシジョン表の最初のアクション行と最初のアクション・セルに問題があることを示します。

OR1/Ruleset_1/DecisionTable_1/Action[1]/Action Cell[1]

検証メッセージでは、デシジョン表オブジェクトのディクショナリ・オブジェクト名に1から始まる索引が使用されます。たとえば、「条件」領域の第1行の第1条件セルを示すメッセージは次のようになります。

OracleRules1/Ruleset_1/DecisionTable_2/Condition[1]/Condition Cell[1]

この指定は、図4-34に示すように、デシジョン表の「条件」領域のうち、第1行にあるラベルR1が付いたルールの条件セルを示しています。

図4-34 条件セルに警告のあるデシジョン表

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

ディクショナリを変更すると、ルール・デザイナではディクショナリ検証が実行されます。

ディクショナリを検証する手順は、次のとおりです。

1. Rules Designerで、「検証」アイコン(チェックマーク)をクリックします。

2. メッセージ領域から「ビジネス・ルール検証」ログを選択します。

3. 検証ログの表示中に、項目を選択し、右クリックしてリストから「エディタでオブジェクトを選択して強調表示」を選択すると、カーソルが移動し、ディクショナリ・オブジェクトが選択されます。一部の検証警告の場合、この機能を使用できないことに注意してください。

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

ルールおよびデシジョン表の詳細設定では、詳細オプションを提供する機能を使用できます。これらのオプションは、すべてのOracle Business Rulesユーザーに必要なものではありません。次の機能が含まれます。

- 「拡張モード」: ルール内でその他のパターン一致オプションおよびネスト・テストを使用できます。
詳細な情報は、次を参照してください:

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

- 第4.5.2項「拡張モード・オプションの選択方法」

- 第4.7.5項「拡張モードのルールに関する必知事項」

- 「ツリー・モード」: マスター・ディテール階層(親子関係にマップされるネストされた要素)を容易に使用できるようにします。このようなファクト間の親子関係は、XMLおよびADFビジネス・コンポーネント・ファクト・タイプにおいて一般的です。このオプションは、「拡張モード」オプションと併用できます。
詳細は、第4.8.2項「単純ツリー・モードのルールの作成方法」を参照してください。

- 「アクティブなルール」: ルールまたはデシジョン表がアクティブであるか非アクティブであるかを指定します。「アクティブなルール」が選択されていない場合、指定したルールまたはデシジョン表はRules Designerによって検証されません。
詳細は、第4.5.3項「アクティブ・オプションの選択方法」を参照してください。

- 「論理」: ルールを起動するファクトとルールによりアサートされるファクト間の論理的な依存関係を有効化または無効化できます。
詳細は、第4.5.4項「論理オプションの選択方法」を参照してください。

- 「ギャップの許可」: (デシジョン表の詳細設定でのみ使用可能)。このチェック・ボックスでは、デシジョン表でギャップが検出された場合に検証メッセージをレポートするかどうかを指定します。その場合の検証メッセージを次に示します。

RUL-05852: Decision Table has gaps

詳細は、第5.3.1.3項「デシジョン表のギャップ・チェック」および第5.3.5項「デシジョン表のギャップ・チェックの実行方法」を参照してください。

- 「優先度」: ルールまたはデシジョン表の優先度を指定します。ルールセット内では、優先度の高いルールが実行されてから、優先度の低いルールが実行されます。
詳細は、第4.5.5項「ルールの優先度の設定方法」を参照してください。

- 「競合ポリシー」: (デシジョン表の詳細設定でのみ使用可能)。デシジョン表の競合ポリシーとして、次のいずれかを指定します。

- 手動: 競合ルールごとに競合解決を手動で指定することで、競合を解決します。

- 自動オーバーライド: 自動競合解決ポリシーを使用して、可能な場合に、オーバーライド競合解決を使用して競合を自動的に解決します。

- 無視: 競合が無視されます。

詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

- 「有効日」: ルールまたはデシジョン表の有効日を指定します。
詳細は、第4.5.6項「有効日の指定方法」を参照してください。

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

Rules Designerでは、各ルール名およびデシジョン表名の横に「詳細設定の表示」または「詳細設定の非表示」アイコンがあり、詳細設定の表示と非表示を切り替えることができます。

ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える手順は、次のとおりです。

1. 詳細設定を表示するルールセット選択します。

2. 「表示」フィールドのリストから、「IF/THENルール」を選択するか、またはデシジョン表を選択します。

1. 詳細設定を表示するには、図4-35に示すように、ルール名の横にある「詳細設定の表示」をクリックします(ルール名Rule_1の横に、選択されているアイコンがあります)。

図4-35 ルールの詳細設定の表示

2. 詳細設定を非表示にするには、図4-36に示すように、ルール名の横にある「詳細設定の非表示」をクリックします(ルール名Rule_1の横に、選択されているアイコンがあります)。

図4-36 ルールの詳細設定の非表示

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

その他のパターン一致オプションおよびその他のアクションを提供するルールまたはデシジョン表機能を使用するには、「拡張モード」を選択します。詳細は、第4.7項「拡張モードのルールの使用」を参照してください。

拡張モード・オプションを選択する手順は、次のとおりです。

1. 拡張モードを設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 図4-37に示すように、「拡張モード」を選択します。

図4-37 拡張モード・オプションの設定

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

Oracle Business Rulesには、ルールまたはデシジョン表がアクティブであるか非アクティブであるかを指定する機能が組み込まれています。アクティブ・オプションは有効日に関係なく設定され、前に指定した有効日を変更または削除せずに設定できます。「アクティブなルール」が選択されていない場合、ルールはRules Designerによって検証されません。

アクティブ・オプションを選択する手順は、次のとおりです。

1. 「アクティブなルール」オプションを設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「アクティブなルール」を選択します。

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

「論理」オプションが選択されているルールセットまたはデシジョン表では、生成されるRL Language内のルールで論理プロパティを使用するように指定されています。論理プロパティを使用すると、ルールを起動するファクトとルールによりアサートされるファクト間の論理的な依存関係を有効化または無効化できます。

論理プロパティが有効化されているルールでは、ルール内のアクション・ブロックによってアサートされた全ファクトが、ルール条件内で一致したファクトに依存します。ルールの条件が適用されなくなるなど、ルール条件で参照されていたファクトに変更があると、ルール条件によってアサートされたファクトは自動的に取り消されます。論理プロパティの詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。

ルールセットとデシジョン表の「論理」オプションを使用すると、ルールセットまたはデシジョン表内のルールに関連して生成されたRL Languageに対する論理プロパティを有効化または無効化できます。デフォルトでは、「論理」オプションは選択されません。

論理オプションを選択する手順は、次のとおりです。

1. 「論理」オプションを設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「論理」を選択します。

4.5.5 ルールの優先度の設定方法

ルールまたはデシジョン表の優先度を設定できます。表4-4に示すように事前定義済の名前が付いた優先度のリストから選択する方法と、正または負の整数を入力して独自の優先度レベルを指定する方法があります。ルールセット内では、優先度の高いルールが実行されてから、優先度の低いルールが実行されます。デフォルトの優先度はmedium(整数値0)です。

表4-4 優先度文字列と値のマッピング

名前付き優先度

整数値

最高

3000

より高い

2000

高

1000

中(デフォルトの優先度)

0

低

-1000

より低い

-2000

最低

-3000

ルールの優先度を設定する手順は、次のとおりです。

1. 優先度を設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「優先度」フィールドで、優先度値を指定します。

1. 名前付きの優先度を指定するには、図4-38に示すように、「優先度」ドロップダウン・リストから選択します。

図4-38 事前定義済の名前付き優先度の選択

2. 整数による優先度を指定するには、図4-39に示すように、「優先度」フィールドをクリックして正または負の整数値を入力し、[Enter]を押します。

図4-39 ユーザー定義の数値優先度の選択

4.5.6 有効日の指定方法

ルールセット、ルールまたはデシジョン表の有効日を指定できます。

有効日を指定する手順は、次のとおりです。

1. 有効日を設定するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「有効日」フィールドを選択します。「有効日の設定」ダイアログが表示されます。

4. 「有効日の設定」ダイアログを使用して有効日を設定します。

有効日の使用の詳細は、第4.9項「日付ファクトの使用、日付関数および有効日の指定」および第4.2.2項「ルールセットの有効日の設定方法」を参照してください。

4.6 ネスト・テストの使用

ルールまたはデシジョン表では、ネスト・テスト機能を使用して、さらに複雑なテストを作成できます。

4.6.1 ネスト・テストの使用方法

ネスト・テストを使用する手順は、次のとおりです。

1. ネスト・テストを使用するルールを選択します。

2. 「IF」領域でテストを選択します。これにより、テストはハイライトされたボックスで囲まれます。

3. 図4-40に示すように、テストを選択した状態で、右クリックしてリストを表示します。

図4-40 ルールへのネスト・テストの追加

4. ネスト・テストを追加するには、リストで「前に挿入」または「後ろに挿入」を選択して、次に「ネスト・テスト」を選択します。図4-41に、ネスト・テストを示します。

図4-41 ルールに追加されたネスト・テスト

4.7 拡張モードのルールの使用

Oracle Business Rulesでは、次のOracle Business Rules機能のサポートを追加する詳細なルールを作成できる機能が提供されます。

- その他のパターン一致オプション(第4.7.1項「拡張モードのパターン一致オプションの使用方法」を参照)

- その他の一致したファクト名オプション(第4.7.2項「拡張モードの一致したファクト名の使用方法」を参照)

- その他のサポートされるアクション・フォーム(第4.7.3項「拡張モードのアクション・フォームの使用方法」を参照)

- パターン一致の集計関数オプション(第4.7.4項「拡張モードの集計条件の使用方法」を参照)

詳細は、第4.7.5項「拡張モードのルールに関する必知事項」を参照してください。

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

拡張モードのパターン一致オプションでは、ルールの起動時期を指定します。表4-5に、使用可能なオプションを示します。

表4-5 拡張モードのパターン一致オプション

オプション

説明

次の各ケース

これは、デフォルトのパターン一致オプションです。一致が存在するたびに(一致するすべてのケースで)ルールを起動する必要があります。

次のケースがある

このオプションでは、一致が1つ以上存在する場合にルールの起動が1つ選択されます。

次のケースがない

この値では、一致がない場合にルールを1回起動するように指定します。

集計

このオプションでは、すべての一致に集計関数を適用するように指定します。詳細は、第4.7.4項「拡張モードの集計条件の使用方法」を参照してください。

拡張モードのパターン一致オプションを使用する手順は、次のとおりです。

1. パターン一致オプションを使用するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「拡張モード」を選択します。

4. 図4-42に示すように、テスト・パターンを右クリックして「囲む」を選択します。

図4-42 「囲む」オプション

図4-43に示すように、「囲む」ダイアログが表示されます。

図4-43 「囲む」ダイアログ

5. 「囲む」ダイアログからパターン・ブロック・オプションを選択し、「OK」をクリックします。
図4-44に示すように、パターンはデフォルトの「(次の各ケース)」を使用してネスト・パターンで囲まれます。

図4-44 デフォルトのパターン一致オプション: 「次の各ケース」

6. 図4-45に示すように、デフォルトの「(次の各ケース)」オプションを選択し、リストから必要なパターン一致オプションを選択します。

図4-45 詳細パターン一致オプションの追加

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

ルールまたはデシジョン表内で一致したファクト名のフィールド(パターンのバインド変数)を使用すると、1つのルールで同じタイプの複数インスタンスをテストできます。一致したファクト名を使用すると、一致したファクトについて一時的な名前を入力してテストで使用できます。たとえば、図4-46に示すルールでは、一致する帽子品目が注文に1つ以上含まれている場合に靴品目に割引が適用されるルールでの、パターンのバインド変数の使用を示しています。

図4-46 パターンのバインド変数を使用するルール

たとえば、図4-47に示すように、顧客の注文で重複している品目を検索するためのルールを作成できます。この例は、ルールでの一致の使用を示しています。

図4-47 注文で重複している品目を検索するルール

拡張モードの一致したファクト名を使用する手順は、次のとおりです。

1. 一致したファクト名を追加するルールまたはデシジョン表を選択します。

2. ルール名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「拡張モード」を選択します。

4. 「<ファクト・タイプ>」を選択し、リストからファクト・タイプを入力します。

5. 図4-48に示すように、表示される一致したファクト名を選択し、必要に応じて変更します。たとえば、一致したファクト名Order$LineItem1を入力して[Enter]を押します。

図4-48 一致したファクトの変数名の追加

6. 図4-49に示すように、ルールを作成します。一致したファクト名をオペランドとして選択できることに注意してください。オペランド「LineItem1」および「LineItem2」を必要に応じて選択し、ルールを作成します。

図4-49 一致したファクト変数名のオペランドとしての選択

図4-49では、テストによって次の行がチェックされます。

RL.get fact ID(Order$LineItem1) > RL.get fact ID(Order$LineItem2)

Order$LineItemという単一のインスタンスが、Order$LineItemファクト・タイプと一致するどのパターンとも一致しないようにします。異なるインスタンスの異なる組合せに対してルールが実行されないように、「>」が必要になります。詳細は、付録C「自己結合を正しく表現するにはどうすればよいですか。」を参照してください。

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

拡張モードでルールを作成する場合、ルール・デザイナでは表4-6に示す使用可能なアクションのリストが表示されます。表4-6に示す各フォームについて、ルール・デザイナで表示されるオプションは状況依存です。このため、アクション・タイプを使用するときに表示されるリストおよび項目の数は状況依存であり、追加するアクション、およびアクションの入力中の選択内容に応じて異なります。

表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によってアクション・ブロックを終了できます。

拡張モードのアクション・フォームを使用する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択します。

2. ルールまたはデシジョン表を選択または追加します。

3. ルールまたはデシジョン表で、ルールまたはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

4. 「拡張モード」を選択します。

5. 挿入領域が表示された状態で、ルールの「THEN」領域で、「<アクションの挿入>」を選択します。図4-50に示すように、アクション・リストが表示されます。

図4-50 拡張モードのルールへのアクションの追加

6. リストで、追加するアクションを選択します。
たとえば、「assign new」を選択します。

7. 「THEN」領域で、アクションの状況依存パラメータを選択し、適切な値を入力します。

4.7.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-51に示すように、赤色のすべての明細品目のコストの合計を計算できます。

図4-51 赤色合計コスト・ルールでの集計関数の使用

拡張モードの集計を使用する手順は、次のとおりです。

1. 集計関数を使用するルールまたはデシジョン表を選択または作成します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. 「拡張モード」を選択します。

4. 使用するファクト・タイプを入力します。

5. 「<パターンの挿入>」を選択してパターンを追加します。

6. 新規のパターンを選択します。

7. パターンを右クリックして「囲む」を選択します。「囲む」ダイアログが表示されます。

8. 「囲む」ダイアログで、パターン・ブロックを選択します。詳細は、第4.7.1項「拡張モードのパターン一致オプションの使用方法」を参照してください。

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

10. パターンで、最初のフィールドを選択します。デフォルトでは、このフィールドには図4-52に示すように「(次の各ケース)」が含まれています。

図4-52 詳細パターン一致オプションの追加

11. aggregateオプションを選択します。図4-53に示すように、集計用の状況依存フィールドが追加されます。

図4-53 ルールでの集計関数の使用

12. 「<関数>」をクリックし、リストから関数を選択します。

13. 条件で、「<ファクト・タイプ>」をクリックし、リストからファクト・タイプを選択します。

14. 「<式>」をクリックし、リストから式を選択します。

15. ルール・デザイナでは、デフォルトで集計パターンの作成時に変数名が作成されます。作成中のルールに必要な場合は、デフォルトの変数名を置き換える変数名を入力します。図4-54に、集計を使用して完成したルールを示します。この例では、わかりやすくするためにルールには変数名total_costおよびitem_xが表示されています。

図4-54 ルール内で完成した集計関数

16. 必要に応じてその他のテストを入力します。この例では、図4-55に示すように、赤色の品目のテストを入力します。

図4-55 赤色合計コスト・ルールでの集計関数の使用

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

「拡張モード」のルールを使用する際には、次のような特殊ケースに注意する必要があります。

- 集計を使用する場合、アクションにはパターン変数が表示されません。パターン変数は、「(次の各ケース...)」パターンを使用する場合のアクション・リストにのみ表示されます。したがって、「集計」、「次のケースがある」パターンまたは「次のケースがない」パターンには、パターン変数を表示できません。

- 「拡張モード」を選択すると、詳細パターン一致などの詳細オプションをルールで使用しているかぎり、「拡張モード」は選択状態のままで非アクティブ(グレー表示)になっています。「拡張モード」の選択を解除するには、拡張モード機能を削除するか、または元に戻す必要があります(拡張モードではないルールを作成することからやり直し、その後で拡張モードのルールを削除するほうが容易な場合があります)。

拡張モード・オプションの選択を解除する手順は、次のとおりです。

1. 「拡張モード」の選択を解除するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします(第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照)。

3. ルールの状態を考慮します。

- ルールを簡素化して「拡張モード」オプションを有効化(「拡張モード」アイコンがグレー表示でなくなり有効になる)できる場合は、ルールを簡素化して、「拡張モード」が有効になったら、「拡張モード」の選択を解除します。

- 「元に戻す」を使用して「拡張モード」ルールを作成するために使用した手順を元に戻し、ルールを「拡張モード」ではない状態にできる場合は、この方法を使用してルールを簡素化します。

- ルールを簡素化できない場合は、ルールを削除して再作成します。

4.8 ツリー・モードのルールの使用

ツリー・モードのルールを使用すると、親子関係にマップされるネストされた要素が存在するマスター・ディテール階層を容易に使用できます。

4.8.1 ツリー・モードのルールの概要

ツリー・モードのルールを説明するには、例を使用すると有用です。ビジネス・プロセスおよびルールを使用して小売発注書(PO)を処理するアプリケーション部分のライフサイクルについて考えます。発注書には、PO全体に適用される取引条件を含むヘッダーがあります。POには、出荷先のリストも含まれています。各宛先には、住所、宛先の住所に出荷される品目のリストおよび出荷のリストが含まれています。

すべての品目のステータスが出荷済または取消し済である場合に、POが完全に出荷済であるとする、というビジネス・ルールについて考えます。

図4-56に、POの例のサンプルXMLスキーマ表現を示します。POのXML文書はツリー構造になっています。これにより、POの自然な表現が可能になります。たとえば、PO自体は最上位レベルの文書要素であり、宛先は品目要素および出荷要素を含むネストされた要素です。出荷要素にも、注文された品目を参照する品目要素が含まれています。ステータスには、有効な値のリストがあります。

図4-56 ツリー・モードのルールのサンプルのPOスキーマ

例4-1に、図4-56で示したサンプルの発注書のXMLスキーマを示します。

例4-1 サンプルの発注書(PO)のスキーマ

<?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-2に、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-2 サンプルの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.8.1.1 ツリー・モードのルール(非拡張モード)

「拡張モード」オプションが選択されておらず、「ツリー・モード」が選択されている場合は、非拡張ツリー・モード、つまり単純ツリー・モードを使用します。このモードでは、Rules Designerにより、図4-57に示すように、ルート・ファクト・タイプを入力するROOT: 「<ファクト・タイプ>」が表示されます。

図4-57 「ツリー・モード」が選択された単純ツリー・モード・ルール

「ツリー・モード」を選択し、「拡張モード」の選択を解除してルールを作成すると、修飾名を使用してツリー内のプロパティを参照できます。次に例を示します。

- PO/destination/item.quantityはitem.quantityに似ていますが、POのdestinationである品目のみが一致します。

- PO$Destination$item.quantityはList<item>を参照します。この参照は、非ツリー・モードから変更されていません。

単純ツリー・モードでは、選択できるのは多対多結合や集計を必要としない条件のみです。

詳細は、第4.8.2項「単純ツリー・モードのルールの作成方法」を参照してください。

4.8.1.2 拡張ツリー・モードのルール

「拡張モード」オプションが選択されており、「ツリー・モード」オプションが選択されている場合は、拡張ツリー・モードを使用します。このモードでは、Rules Designerにより、図4-58に示すように、ルート・ファクト・タイプを入力するROOT: 「<ファクト・タイプ>」が表示されます。ルール・デザイナでは、ツリー構造のファクトのパターンが表示されますが、親ファクトと子ファクトを結合する単純テストは非表示です。

図4-58 拡張ツリー・モード

拡張ツリー・モードでは、ツリー・モードのパターン(ルート以外)は次のように表示されます。

<演算子> <変数> 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.8.3項「拡張ツリー・モードのルールの作成方法」を参照してください。

拡張ツリー・モードのルールを使用する場合、ルール・デザイナでは、直積を回避しながら、様々な子フォレストからの条件を同じルールに結合するために、集計パターン(有無など)を使用する必要があります。

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

次の手順では、例4-1で示したXMLスキーマと例4-2で示したスキーマ・インスタンスを使用して、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ルールを作成します。
詳細は、第4.3.1項「ルールの追加方法」を参照してください。

2. 詳細設定を表示します。
詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

3. 図4-59に示すように、「ツリー・モード」を選択します。

図4-59 単純ツリー・モードの詳細設定

4. ROOT:の横で、「<ファクト・タイプ>」プレースホルダをクリックし、図4-60に示すようにリストから「PO」を選択します。

図4-60 単純ツリー・モード: ルートの構成

5. 「<テストの挿入>」を選択します。
IF文がIF <オペランド> == <オペランド>となります。

6. 左の「<オペランド>」を選択します。

7. リストで、PO/destination/item.availabilityDateを選択します。

8. 図4-61に示すように、「式ビルダー」アイコンを選択します。

図4-61 単純ツリー・モードの式の追加

9. 「式ビルダー」ダイアログで、「式」領域に表示されている品目をコピーして削除します。

10. 式ビルダーで、「関数」タブを選択します。

11. ナビゲータで、「Duration」を開き、「daysbetween」関数をダブルクリックします。

12. 図4-62に示すように、「daysbetween」の引数テンプレートを削除します。

図4-62 式ビルダーを使用した単純ツリー・モードのルールの追加

13. 「daysbetween」関数の2番目の引数として前に切り取った値を貼り付けます。

14. 「式ビルダー」ダイアログで、「変数」タブを選択します。

15. 「daysbetween」関数の最初の引数について、ナビゲータを使用して「PO」を開き、「header」を開いて「orderDate」をダブルクリックします。

16. 「式ビルダー」ダイアログで「OK」をクリックします。

17. リストで、「式」領域で[Enter]を押します。

18. 「operator」を選択して>を入力します。

19. 図4-63に示すように、右の「<オペランド>」を選択し、値30を入力して[Enter]を押します。

図4-63 単純ツリー・モード: 右オペランドの値30

20. 「<アクションの挿入>」をクリックし、リストから「modify」を選択します。
THEN文がTHEN modify <ターゲット>となります。

21. 「<ターゲット>」をクリックし、リストから「PO/destination/item」を選択します。THEN文は次のようになります。

THEN modify PO/destination/item ( <add property> )

22. 「<プロパティの追加>」をクリックします。「プロパティ」ダイアログが表示されます。

23. 「プロパティ」ダイアログで、図4-64に示すように、status名に値"canceled"を入力します。

図4-64 単純ツリー・モード: アクション

24. 「プロパティ」ダイアログで、「閉じる」をクリックします。

25. 図4-65に示すように、完成したルールが表示されます。

図4-65 単純ツリー・モードのルールの最終的なルール

modify文では、PO/destination/itemは特定のitemインスタンス・メンバーを参照することに注意してください。

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

次の手順では、例4-1に示したXMLスキーマと例4-2に示した各ファクトのインスタンスを使用して、次のような無料出荷ルールを作成します。

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ルールを作成します。
詳細は、第4.3.1項「ルールの追加方法」を参照してください。

2. 詳細設定を表示します。
詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

3. 図4-66に示すように、「拡張モード」を選択し、「ツリー・モード」を選択します。

図4-66 無料出荷用の拡張ツリー・モードのルール

4. 「<ファクト・タイプ>」プレースホルダを選択し、リストから「PO」を選択します。

5. 図4-67に示すように、無料出荷ルールを完成します。

図4-67 拡張ツリー・モードの無料出荷ルール

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

「ツリー・モード」を選択し、ルート・ファクト・タイプを選択すると、オプション・リストには使用可能なすべてのファクト・タイプが表示されます(ルート・ファクト・タイプの子のみではありません)。これにより、ルート・ファクト・タイプの子以外にも使用可能なすべてのファクト・タイプを表示できます。選択したルート・ファクト・タイプの子のみを表示するようにオプション・リストを制限することはできません。

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

Oracle Business Rulesでは、時刻と日付の操作を容易にする機能が提供され、時刻と日付に基づいてルールがいつ有効かを決定できる有効日機能が提供されます。

- CurrentDateファクトを使用すると、現在の日付を表すファクトに基づいて判断できます。

- 「有効日」を使用すると、ルールセット内のすべてのルールとデシジョン表、個々のルールまたは個々のデシジョン表が有効な日付または日時の範囲を定義する開始日と終了日を指定できます。

表4-8に、使用可能な「有効日」のオプションを示します。

表4-8 有効日に可能な値

有効日

説明

常に有効

「開始」も「終了」も設定しないことを指定します。

開始(「終了」日付設定なし)

特定の日付から不特定の将来にかけて有効です。

終了(「開始」日付設定なし)

現在から特定の日付まで有効です。

「開始」設定と「終了」設定

2つの日付の間のみ有効です。

「常に」以外の有効日指定には、次のいずれかを使用できます。

- 日付のみ指定、時間指定なし: この場合、有効日は各タイムゾーンの指定日の午前0時とみなされます。

- 日付、タイムゾーンを指定、時間指定なし: この場合、有効日は指定のタイムゾーンの指定日の午前0時とみなされます。

- 日付、タイムゾーン、時間を指定: この場合、日付と時間を完全に指定します。

- 時間指定のみで、日付およびタイムゾーン指定なし: すべての日の指定の時間に適用されます。

- 時間とタイムゾーンを指定、日付指定なし: すべての日の指定の時間に適用されます。

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

ルールまたはデシジョン表で現在の日付ファクトを使用できます。

CurrentDateファクトを使用する手順は、次のとおりです。

1. 「ルールセット」ナビゲーション・タブで、ルールセットを選択します。

2. ルールセット内のルールを選択します。

3. 図4-68に示すように、「IF」領域で、CurrentDateファクトおよびCalendarタイプの日付メソッドを使用する条件を追加します。

図4-68 CurrentDateファクトを使用する条件を持つルール

4.9.2 ルールの有効日の設定方法

ルールセット、ルールまたはデシジョン表の有効開始日または有効終了日、あるいはその両方を指定できます。ルールセットの有効日を指定する方法は、第4.2.2項「ルールセットの有効日の設定方法」を参照してください。

ルールの有効日を設定する手順は、次のとおりです。

1. 「ルールセット」ナビゲーション・タブで、ルールセット名を選択します。

2. ルールセット内のルールを選択します。

3. 図4-69に示すように、ルール名の横にある「詳細設定の表示」をクリックします。

図4-69 ルールの詳細設定の表示

4. 「有効日」フィールドを選択します。図4-70に示すように、「有効日の設定」ダイアログが表示されます。

図4-70 ルールの有効日の設定

5. 「有効日の設定」ダイアログを使用して、ルールの有効日を指定します。「日付の設定」アイコンをクリックすると、「開始」および「終了」フィールドのデータ入力に役立つカレンダが表示されます。

6. 「有効日の設定」ダイアログで、「OK」をクリックします。

4.9.3 有効日に関する必知事項

デフォルトでは、Oracle Business Rules Engineにより、CurrentDateファクトおよび有効日に関連付けられるクロックは暗黙的に管理され、それぞれシステム日付の値に設定されます。RL Language関数setCurrentDate()およびsetEffectiveDate()を使用すると、現在の日付および有効日を明示的に設定できます。詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。

有効開始日とは、その日からルール、デシジョン表またはルールセットがルール評価と起動に関連させることができる日のことです。したがって、ルールが有効であれば条件が満たされた場合に起動でき、ルールが有効でなければ条件が満たされるかどうかに関係なく起動しません。

有効終了日とは、その日からルール、デシジョン表またはルールセットがルール評価に関連しなくなる日のことです(有効ではないということは、ルールが起動しないということを意味します)。

有効開始日と有効終了日はデシジョン表に設定できますが、デシジョン表内のルールに対して個別に設定することはできません。

ルールとデシジョン表には、「アクティブなルール」オプションも組み込まれています。このオプションは有効日に関係なく設定され、指定の有効日を変更または削除することなく日付を有効にします。「アクティブなルール」オプションの使用の詳細は、第4.5.3項「アクティブ・オプションの選択方法」を参照してください。

ルールセットとルールセット内のルールまたはデシジョン表の両方に対して有効日が定義されている場合、その優先度は次のようになります(最上位の優先度は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.9.4 Duration、JavaDate、OracleDateおよびXMLDateメソッドの使用方法

Duration、JavaDateおよびXMLDate、OracleDateおよびOracleDuration拡張メソッドをルールまたはデシジョン表で使用できます。詳細は、付録B「Oracle Business Rulesの組込みクラスと関数」を参照してください。

Durationメソッドを使用する手順は、次のとおりです。

1. 「ルールセット」ナビゲーション・タブで、ルールセットを選択します。

2. ルールセット内のルールを選択します(Durationメソッドはデシジョン表で使用することもできます)。

3. 「IF」領域で条件を追加します。

4. ルール条件のオペランドを選択します。

5. リストから「式ビルダー」を選択します。詳細は、第4.10項「式ビルダーの使用」を参照してください。

6. 式ビルダーで、「関数」タブを選択します。

7. 「式ビルダー」のナビゲータで、「Duration」フォルダを開きます。

8. 間隔テストの必要に応じて、適切なメソッドをダブルクリックして選択および挿入します。

9. 適切な引数をメソッドに指定します。図4-71に示す例を参照してください。

10. 図4-72に示すように、ルールを作成できます。

図4-71 ルールでのDurationメソッドの使用

図4-72 Duration機能を使用するルールの追加

4.10 式ビルダーの使用

式ビルダーを使用して、Oracle Business Rules用の式を作成したり編集できます。

4.10.1 式ビルダーの概要

Rules Designerの様々な部分から式ビルダーにアクセスできます。たとえば、「グローバルの編集 -」ダイアログや、デシジョン表内で条件を操作するときの「条件」領域、および自由形式の式を選択して拡張モードでルールとデシジョン表を入力するときなどです。

図4-73に、ルール・デザイナの式ビルダーを示します。

図4-73 ルール・デザイナの式ビルダー

4.10.2 式ビルダーの使用方法

式ビルダーでは、「変数」または「関数」ナビゲーション・ツリー、または「演算子」タブ、または「定数」タブで項目をダブルクリックすると、項目は「式」領域の式に挿入されます。また、「式」領域でテキストを入力して、式を直接作成または編集することもできます。

式を入力するときは、「変数」は有効な割当ターゲットであり、「定数」は有効な割当ターゲットではないことに注意してください。そのため、作成する式に追加する項目のタイプが明確ではない場合は、両方のタブを使用する必要があります。

「式」フィールド内の関数にカーソルを置き、挿入する式または関数をダブルクリックして、選択した関数の引数を指定します。たとえば、関数のカッコ内にカーソルを置いて変数を選択します。これにより、カーソル位置にある式に変数が挿入されます。

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

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 Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。

式を使用すると、任意の2つの数値タイプ間でキャストを行うことができます。たとえば、(short)((BigInteger)1 + (Long)2)のようになります。例4-3は、その他の式のサンプルをいくつか示しています。

式プロセッサは型の昇格にXPath/Xqueryルールを使用します(XML Path Language (XPath) 2.0)。たとえば、BigDecimalはfloat/doubleに昇格します。別方向へのタイプの昇格にはキャストが必要です(3.3などのリテラルを除く)。

例4-3 タイプとキャストを使用したアクションのサンプル式

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

4.11 ルールにおけるオプション値の制約としてのバケット・セットの使用

値リスト・バケット・セットと範囲リスト・バケット・セットを使用して、ルール内のビジネス条件に対する制約を指定できます。これにより、ルール・デザイナを使用して、指定値が範囲外の場合や、バケット・セットで指定された候補値セットの範囲内にない場合に、可能性のあるエラーに関する検証警告を生成できます。Oracle Business Rulesでは、バケット・セットを使用して、グローバル初期値、関数の戻り値または関数の引数値の制約を指定することもできます。詳細は、第2.3項「Oracle Business Rulesグローバルの使用」および第3.7項「バケット・セットのビジネス条件との関連付け」を参照してください。

4.11.1 範囲リスト・バケット・セットをビジネス条件の制約として使用する方法

範囲リスト・バケット・セットは、関数結果以外のビジネス条件の制約として使用できます。

値リスト・バケット・セットを制約として使用する方法の詳細は、第4.11.2項「値リスト・バケット・セットをファクト・プロパティの制約として使用する方法」を参照してください。

範囲リスト・バケット・セットをファクト・プロパティの制約として使用する手順は、次のとおりです。

1. 対象となる範囲を含んだバケット・セットを指定し、有効なすべての範囲について「アクションで許可済」を選択します。範囲を含めるには、最上部と最下部のエンドポイントについて「アクションで許可済」の選択を解除します。

2. アプリケーションに必要な場合は「含まれるエンドポイント」を選択します。

3. 「許可されないバケットをテストに含める」の選択を解除します。たとえば、有効な等級を定義し、100より大きい値または0より小さい値を許可しないバケット・セットの場合、バケット・セットのエンドポイントを図4-74のように定義します。

図4-74 ファクト・プロパティの有効等級バケット・セット

4. このバケット・セットをビジネス条件と関連付けます。たとえば、図4-75に示すように、このバケット・セットをtest_math1に関連付けます。

図4-75 バケット・セットとファクト・プロパティの関連付け

これで、このファクト・プロパティを使用するテストでルールを定義すると、値が範囲外の場合に検証警告が表示されます。たとえば、図4-76に示すように、値-10の式でルールを定義すると、ルール・デザイナに検証警告が表示されます。

図4-76 関連バケット・セットの「アクションで許可済」内にないファクト・プロパティ値の使用

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

値リスト・バケット・セットをファクト・プロパティの制約として使用できます。

範囲リスト・バケット・セットを制約として使用する方法の詳細は、第4.11.1項「範囲リスト・バケット・セットをビジネス条件の制約として使用する方法」を参照してください。

値リスト・バケット・セットをファクト・プロパティの制約として使用する手順は、次のとおりです。

1. 対象となる値を含んだLOVバケット・セットを指定し、有効なすべての値について「アクションで許可済」を選択します。詳細は、第3.6.1項「値リストのグローバル・バケット・セットの定義方法」を参照してください。

2. otherwiseバケットについて「アクションで許可済」の選択を解除します。

3. 「許可されないバケットをテストに含める」の選択を解除します。

4. このバケット・セットをファクト・プロパティに関連付けます。

4.11.3 バケット・セットを使用してテスト式のオプションを指定する方法

LOVバケット・セットを使用して、式およびアクションのオプションを指定できます。

バケット・セットを使用してルール式およびアクションのオプションを指定する方法は、次のとおりです。

1. ルール・デザイナで、ファクト・プロパティに対応するタイプのLOVバケット・セットを定義します。詳細は、第3.6.1項「値リストのグローバル・バケット・セットの定義方法」を参照してください。

2. バケット・セットをファクト・プロパティに関連付けます。詳細は、第3.7.1項「バケット・セットをファクト・プロパティに関連付ける方法」を参照してください。

3. 式を入力すると、ルール・デザイナにより「values options」にバケット値が表示されます。たとえば、ファクト・プロパティDriver.eye_testをeyesというLOVバケット・セットに値pass、failおよびglasses_requiredで関連付け、テスト式でDriver.eye_testを使用した場合、バケット値は図4-77に示すように制限されます。

図4-77 バケット・セットを使用したルール・テスト式のオプションの指定

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

この項では、SOAコンポーザで実装されているルールに対する変更をJDeveloperにインポートする方法について説明します。

SOAコンポーザのディクショナリに変更を行った場合は、第12.10項「Oracle Business Rulesディクショナリの変更の実行時のコミット」に示すように、その変更内容をMDSリポジトリにアップロードする必要があります。ただし、これらの変更はJDeveloperでは更新されません。MDSリポジトリからJDeveloperに、変更内容を手動でインポートする必要があります。

JDeveloperに変更内容をインポートする手順は、次のとおりです。

1. アプリケーション・ナビゲータで変更を行ったルールを選択します。

2. 図4-78に示すように、ルール・エディタで「MDSからインポート」ボタンをクリックします。

図4-78 MDSリポジトリからの変更内容のインポート

3. 「SOAリソース・ブラウザ」ウィンドウが開くので、MDSリポジトリを選択します。

図4-79 「SOAリソース・ブラウザ」でのMDSリポジトリの選択

4. 「OK」をクリックします。
JDeveloperで変更内容が更新され、ルール・エディタに変更内容が表示されます。

5 デシジョン表の使用

この章では、デシジョン表を使用して、IF/THENルール書式の代替となるわかりやすい書式でビジネス・ルールを作成し、使用する方法について説明します。さらに、条件、競合、アクションなど、デシジョン表の各種コンポーネントについて取り上げ、デシジョン表に対して実行できる様々な操作についても説明します。

この章の項目は、次のとおりです。

- 第5.1項「デシジョン表の使用の概要」

- 第5.2項「デシジョン表の作成」

- 第5.3項「デシジョン表の操作の実行」

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

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

企業は、自社のビジネス・プロセスを自動化するためにソフトウェアに投資しています。従来、この自動化の焦点は、データに関する意思決定を容易にするためのデータの収集、プレゼンテーションおよび操作に置かれていました。しかし、ビジネス・プロセスに関するルール詳細をソフトウェア・アーキテクチャに組み込むことで意思決定プロセスを自動化するという、ソフトウェア設計者と開発者に対する要求が大きくなってきています。また、多くの企業は、ビジネスの変化に対するソフトウェア・システムの応答性を高めようという圧力の高まりに直面しています。場合によっては、ビジネス・ルールを記述およびテストする役割が、ソフトウェア・エンジニアではなく、研修を受けたビジネス・ユーザーに割り当てられるようになりました。また、ソフトウェアのビジネス上の動作の変更を従来のソフトウェア開発サイクルから分離し、その変更内容を製品や販売サイクルのようなビジネス主導の規範に関連付ける組織もあります。

デシジョン表は、特にコンピュータ・プログラマではなくビジネス・アナリストが記述を担当する場合に、データ処理タスクを記述するためのメカニズムを提供します。

スプレッドシートに慣れたビジネス・アナリストにとって、デシジョン表の書式は直感的なものです。デシジョン表に用意されている仮の構造により、複数の類似するルールを容易に作成、理解および変更でき、ソフトウェアでルールの完全性および整合性をチェックできます。

Oracle Business Rulesデシジョン表には、次の機能があります。

- 強力な視覚化: コンパクトで構造化されたプレゼンテーション。この視覚化は、多数の表を使用し、宣言的で単純なステップに編成されるという、現実のビジネス・ポリシーの表現方法に適合しています。

- エラー防止: 不完全性や非整合性を回避します。デシジョン表は適切に構造化されているため、自動化されたツールで競合、冗長性および不完全性をチェックし、有効で整合性のあるビジネス・ルールを迅速に開発できます。

- モジュール形式の情報編成: 複数のルールが単一の表にグループ化されます。スプレッドシートのように、連携して動作するルールのグループが単一の表示可能ペインに置かれます。たとえば、申込者が適格かどうかをチェックする6つのルールがある場合、個別ではあっても関連するルールとして表示するのではなく、6つのルールすべてを表示する方が便利です。

- ルールの最適化およびパフォーマンス上のメリット: Oracle Business Rulesのデシジョン表には自動化された機能が用意されており、IF/THENルールに比べて、必要なルールの数を削減できます(これをルールの結合と呼びます)。

- ルール検証機能: デプロイメント前にルールの論理的な整合性を確認する機能が用意されています。競合、不完全性またはギャップをチェックするように自動化されたツールを使用して、有効で整合性のあるビジネス・ルールを迅速に開発できます。

デシジョン表を使用する主な理由は、検証および視覚化が容易であることです。

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

5.1.1 デシジョン表とは

デシジョン表では、スプレッドシート形式の単一ビューに複数の関連するルールが表示されます。ルール・デザイナの場合、デシジョン表には関連するビジネス・ルールのコレクション、条件行、ルールおよびアクションがわかりやすい表形式で表示されます。ビジネス・ユーザーは、各セルおよびそれぞれの値をすばやく比較し、デシジョン表のルール分析機能(ルール・デザイナでアイコンをクリックして値を選択することで使用可能)を使用し、競合するケースや欠落しているケースを識別し、訂正できます。

デシジョン表の概念を理解しやすいように、運転者に免許資格があるかどうかを判別する一連のIF/THENルールおよび、それと同等のデシジョン表を示します。運転免許の教習を受講済の運転者が受講証明を持っていることに注意してください。

このIF/THENルールは次のようになります。

if driver.age < 20 and driver.has training then driver.eligible = 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つ以上のバケットから取得されます。バケット・セットの詳細は、第3.6項「バケット・セットの使用」を参照してください。

たとえば、図5-1は、Driver.ageプロパティを持つDriverファクトの条件式を示しています。デシジョン表内の対応する行は、範囲<20および>=20のバケットを含む条件セルを示しています。セルの値は、driver_agesというグローバル・バケット・セットから取得されます。

図5-1には、Driver.has_trainingプロパティを持つDriverファクトの条件行も示されています。この条件行は、値true、falseおよび-を持つ条件セルを示しています。ハイフン(-)は、考慮されないこと(つまり、この場合はDriver.has_trainingがtrueでもfalseでもかまわないこと)を意味します。これらの条件セルの値は、ブール型に関連付けられているデフォルト・バケット・セットから取得されます(このデフォルト・バケット・セットは、値trueおよびfalseのデフォルト・バケットで構成されています)。

デシジョン表にはルールがバケット順に表示され、ルールの順序を変更するにはバケット・セット内のバケットの順序を変更する必要があります。つまり、条件行に関連付けられているバケット・セット内のバケットの順序によって条件セルの順序が決まり、したがってルールの順序も決まります。デシジョン表でのルールの順序付けは、条件行に関連付けられているLOVバケット・セット内のバケットの相対位置を変更することで管理できますが、範囲バケットの順序は変更できません。バケット・セット内のバケットの順序付けの詳細は、第3.6.1項「値リストのグローバル・バケット・セットの定義方法」を参照してください。

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

デシジョン表では、アクションはルールに関連付けられています。実行時には、条件セルについてファクトが一致すると、Rules Engineにより、そのルールに関連付けられているアクションの実行が準備されます。

表5-1に、「アクション」領域で選択できるアクションのタイプを示します。つまり、関数のコール、新規ファクトのアサート、ファクトの取消しまたは変更を行うことができます。「アクション」領域では、ルールに対する個別アクションに対応するセルをアクション・セルと呼びます。拡張モードには、アクション用の他のオプションがあります。拡張モードの詳細は、第4.5.2項「拡張モード・オプションの選択方法」を参照してください。

表5-1 アクション・セルに値するデシジョン表のアクション

アクション

説明

Assert New

新規ファクトのアサート

Call

関数のコール

Retract

ファクトの取消し

Modify

一致したファクトに関連付けられているデータ値の変更

複数のアクションを追加する場合、「アクション」領域で追加したアクションは順序付けされます。上位の行に表示されるアクションが実行されてから、下位の行のアクションが実行されます。

デシジョン表のアクション(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.3.3項「デシジョン表内の条件のマージまたは分割方法」を参照してください。

図5-4 デシジョン表の兄弟条件セル

Rules Designerでは、行を選択して「移動」アイコンをクリックすることで、行の順序を容易に変更できます。「条件」領域で行の順序を変更すると、条件セルに対する操作を必要な粒度で実行できます。つまり、条件セルの位置や、条件セルの親、子または兄弟の位置に応じて、ツリーの特定レベルでのみ適切な特定の値を分割、マージまたは割り当てる場合に、移動操作を使用できます。

5.1.2 デシジョン表の値

デフォルトでは、条件行の作成時にデシジョン表により単一の条件セルが作成され、そのセルに「?」値が割り当てられます。条件セルの値が「?」である場合は、そのセルの値がバケット・セットでは未定義であることを示しています。例として、図5-5にDriver.ageが「?」の値を示します。

図5-5 条件セルで未定義を示すサンプル・デシジョン表

デシジョン表の「アクション」領域では、あるアクション・セルが何も実行しないように指定できます。この場合は、そのアクション・セルの選択を解除します。アクション・セルのチェック・ボックスの選択が解除されている場合は、パターンがデシジョン表内で指定の条件値に一致しても、このアクションが実行されないことを意味します。つまり、アクション・セルごとに、関連付けられているルールでアクションをアクティブにする必要があるか、またはアクションを実行しないかを指定できます。

デシジョン表では、条件セルがバケット・セットから削除済のバケットを表している場合、ルール・デザイナにより次のような検証警告が表示されます。

RUL-05831: Decision table bucket reference not found

このタイプの検証警告を解決するには、次のいずれかを実行できます。

- 条件セルをダブルクリックしてリストからバケットを1つ以上選択し、値を定義します。

- 欠落しているバケットをバケット・セットに追加するか、欠落しているバケットを含む別のバケット・セットに条件を関連付けます。

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

デシジョン表のループは、条件行の値がアクションにより変更される場合に発生します。ループは、単一のデシジョン表内のルール間か、複数のデシジョン表全体か、同一ルールセット内のルールおよびデシジョン表全体で設定できます。デシジョン表のアクションとして、デシジョン表の条件で使用されるファクト・プロパティを変更するアクションは作成しないでください。このようなアクションによって、無限ループが発生する場合があります。

注意:

包含するデシジョン関数に対するルール実行制限を使用することで、無限ループを防止できます。

5.2 デシジョン表の作成

デシジョン表を追加するには、複数のステップを実行します。ステップは次のとおりです。

- デシジョン表の作成

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

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

- デシジョン表操作を使用した、デシジョン表の検証、訂正および変更

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

デシジョン表で作業するには、まずルールセット内にデシジョン表を作成します。

デシジョン表を作成する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」タブから既存のルールセットを選択するか、「ルールセットの作成」をクリックしてルールセットを作成します。

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を繰り返し、デシジョン表にさらに条件行を追加します。

ローカル・バケット・セットを使用するか、デシジョン表の条件用のバケット・セットを指定する手順は、次のとおりです。

1. 各条件行には、各セルの値を取り出すバケット・セットが必要です。選択した値にグローバル・バケット・セットが関連付けられている場合は、デフォルトでバケット・セットに条件行が関連付けられます。

2. その値に関連付けられているグローバル・バケット・セットがない場合は、デシジョン表に条件行を追加した後、条件行に関連付けるローカル値リスト・バケット・セットまたはローカル範囲リスト・バケット・セットを指定するか、既存のグローバル・バケット・セットを指定する必要があります。バケット・セットを条件に追加するには、図5-8に示すように、「条件」領域で条件を選択し、バケット・セットのリストから選択してバケット・セットを関連付けます。バケット・セット・リストには、該当するタイプの使用可能なグローバル・バケット・セットが含まれています。

図5-8 デシジョン表で条件行に使用するバケット・セットの指定

3. グローバル・バケット・セットを指定しない場合は、「ローカルの値リスト」または「範囲のローカル・リスト」を選択してローカル・バケット・セットを作成して使用し、指定したタイプのバケット・セットを作成して使用できます。

4. 必要に応じて手順2から手順3を繰り返し、デシジョン表にさらに条件行を定義します。

バケット・セットの作成の詳細は、第3.6項「バケット・セットの使用」を参照してください。

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

デシジョン表には、デシジョン表のアクションを指定するための「アクション」領域が含まれています。これにより、デシジョン表内のルールに対するアクションが決まります。

有効なデシジョン表を作成する手順は、次のとおりです。

1. デシジョン表にアクションを追加します。

2. 特定の値が適用されるアクション・セルごとに、値を設定します。

3. アクション・セルごとに、アクションがルールに適用されない場合はそのセルの選択を解除します。デフォルトでは、デシジョン表にアクションを追加すると、すべてのルールに対するアクションの選択が解除されます。

デシジョン表にアクションを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクションを追加するデシジョン表を選択します。

2. 「追加」アイコンの横にあるリストから「アクション」を選択し、リストから使用可能なアクションを選択します。表5-1に、使用可能なアクションを示します。たとえば、「Modify」を選択します。図5-9に示すように、Rules Designerの「アクション・エディタ」ダイアログが表示されます。

図5-9 デシジョン表へのアクションの追加

3. 「アクション・エディタ」ダイアログの「ターゲット」領域で、アクションのターゲットを選択します。これにより、アクションが適用されるデータ・モデル・オブジェクトが指定されます。

4. 指定したターゲットについて、必要に応じてアクションで目的の操作が実行されるように、「引数」表のフィールドを変更します。「アクション・エディタ」ダイアログの「引数」表には、表5-2に示すフィールドが含まれています。

表5-2 「アクション・エディタ」ダイアログの「引数」フィールド

フィールド

説明

プロパティ

指定したターゲットのプロパティ名が表示されます。

タイプ

プロパティのタイプが表示されます。

値

使用可能なアクションのリストから、アクションのデフォルト値を選択します。指定した値は、アクション全体にデフォルト値として適用されるか、または特定のアクション・セルを選択している場合は、選択したアクション・セルに適用されます。

パラメータ化

パラメータ化された値を指定します。パラメータ化された値は、デシジョン表のアクション・セルに表示されます。パラメータ化された値をプロパティに選択すると、通常は各ルールにより異なるパラメータ値が入力されます。

定数

定数値を指定する場合に選択します。

5. 「アクション・エディタ」ダイアログで、すべてのルールのアクション・セルを選択するには、「常に選択」チェック・ボックスを選択します。

6. 必要に応じてステップ2からステップ5を繰り返し、デシジョン表に対してさらにアクションを定義します。

デシジョン表内のアクション・セルの値を設定する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクション・セル値を指定するデシジョン表を選択します。

2. 「アクション」領域で、適切なアクション・セルが選択されていることを確認します。「アクション・エディタ」ダイアログで「常に選択」チェック・ボックスを選択した場合は、すべてのアクション・セルを選択する必要があります。「常に選択」チェック・ボックスの選択が解除されている場合は、アクション・セルのチェック・ボックスを使用して適切なアクション・セルを選択します。

3. 「アクション」領域で、選択したアクション・セルごとに、パラメータ化されたプロパティに適切な値を入力します。そのためには、アクション・セルのプロパティ・セルを選択し、値を入力するか、リストから値を選択するか、または「式ビルダー」アイコンをクリックして「式ビルダー」ダイアログを使用します。
デシジョン表からバケット・セットを参照する方法の詳細は、第3.6.2項「範囲リスト・グローバル・バケット・セットの定義方法」を参照してください。

デシジョン表のアクション・セルの選択を解除する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクション・セルの選択を解除するデシジョン表を選択します。

2. 「アクション」領域で、アクション・セルを選択し、アクション・セル内のチェック・ボックスの選択を解除します。アクションに対して「常に選択」が設定されている場合は、アクション・セル値の選択を解除できません。

アクションを追加するときに、アクションの順序変更が必要になる場合があります。Rules Designerでは、「下に移動」アイコンまたは「上に移動」アイコンを使用して、アクションの順序を変更できます。

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

デシジョン表にルールを追加できます。ルール・デザイナでは、既存のルールの左側にルールの列が追加され、各条件セルは「?」に初期化されます。これは実際には検証エラーを意味し、セルに適切な値を入力するように求めています。

デシジョン表にルールを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、ルールを追加するデシジョン表を選択します。

2. 「追加」アイコンの横にあるリストから、「ルール」を選択します。

3. 条件セルの値を入力します。新しいルールはデシジョン表の最初のルールとして左側に追加され、その他のルールは、バケット値の順序が定義どおりに保たれるように、必要に応じて移動していることに注意してください。

4. アクション・セルの値を入力します。

バケットによるルールの順序付け

デシジョン表の「詳細設定」にある「バケットによるルールの順序付け」チェック・ボックスは、デフォルトで選択されています。この場合、新しいルールを追加すると、デシジョン表のレイアウトが自動的に変更されます。

デシジョン表に新しいルールを追加すると、新しいルールはデシジョン表の最初のルールとして追加され、その他のルールは、バケット値の順序が定義どおりに保たれるように、必要に応じて移動します。これは、「バケットによるルールの順序付け」が有効になっているからです。つまり、デシジョン表のルールの順序は、条件式に関連付けられているバケットの相対位置に応じて設定されるのです。ルールを追加するときに「バケットによるルールの順序付け」が有効でない場合、新しいルールはデシジョン表の最後のルールとして追加されます。どちらの場合も、新しいルールの列のセルには、セルに値がまだ設定されていないことを示す「?」という記号が表示されます。

注意:

「バケットによるルールの順序付け」を選択すると、ルールが順序付けされ、重複ルール(厳密に同じバケットを持つルール)は結合されます。したがって、バケットを持たない2つのルールをデシジョン表に追加することはできません。この場合、ルールが重複することになり、即座に結合されてしまうからです。「バケットによるルールの順序付け」の選択を解除すると、重複ルールが許可されます。

また、ルール列に付属する「左へ移動」および「右へ移動」ボタンも有効になっており、ルールを再配置できます。拡張オプションも有効なので、ルールの切り取り、コピーまたは貼り付けも実行できます。

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

デシジョン表でテストを定義できます。テストでは、デシジョン表内のルールを起動する場合は、trueに評価する必要があります。テストの定義とルール条件の使用方法の詳細は、第4.3項「ルールの使用」を参照してください。

デシジョン表にテストを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、ルールを追加するデシジョン表を選択します。

2. デシジョン表の名前の横の「詳細設定の表示」アイコン(二重の下矢印)をクリックします。「拡張モード」が選択されている場合は、チェック・ボックスの選択を解除します。

3. デシジョン表名のすぐ下で、「<テストの挿入>」の下矢印をクリックします。

4. 次のオプションのいずれかを必要に応じて選択します。

- 簡易テスト

- 変数

- ネスト・テスト

- ネストされていないテスト

5. 左右の「<オペランド>」をクリックしてオペランド値を入力し、演算子リストをクリックして演算子を選択します。
追加したテストを図5-10に表示します。

図5-10 デシジョン表へのテストの追加

5.3 デシジョン表の操作の実行

デシジョン表の作成後、デシジョン表に対して次のような操作を実行できます。

- デシジョン表のセルの圧縮または分割

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

- デシジョン表内のルール間の競合の検出および解決

- デシジョン表内のギャップの検出および修正

5.3.1 デシジョン表の操作の概要

デシジョン表の作成後に、デシジョン表の内容を変更し、すべてのケースに関する完全なルールセットを含むデシジョン表を生成したり、複数のケースに関して最小数のルールを提供するデシジョン表を生成できます。

5.3.1.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-11を参照してください。

1つのプロパティについて複数の値を含むアクション・セルは無効です。このアクション・セルを選択すると、ルール・デザイナではアクション・セル用の単一値を選択できるように、チェック・ボックスを含むポップアップ・ウィンドウが表示されます。図5-11の検証ログに示すように、ルール・デザイナでは単一値を選択するまで検証警告が表示されます。

図5-11 マージ後のアクション・セルについて解決が必要な競合するプロパティ

5.3.1.2 デシジョン表の移動操作

デシジョン表内で条件またはアクションを移動できます。「移動」アイコンを使用すると、「条件」領域に表示される条件行や「アクション」領域に表示されるアクションの順序を変更できます。条件を上下に移動してルールの表示順序を変更できますが、これらの操作によってロジックが変わることはありません。たとえば、if (x.a == 1 and x.b == 1)は論理的にはif (x.b == 1 and x.a == 1)と同じです。

デシジョン表で作業する場合、一部の操作は兄弟である条件セルにのみ適用されます。「移動」アイコンを使用すると、デシジョン表の操作が必要な粒度でツリーに適用されるように行の順序を変更できます。たとえば、単一ルールの条件セルに対するアクションを変更する場合は、その条件セルをデシジョン表の「条件」領域の最終行に移動する必要があります。例として、図5-12に示すデシジョン表を考えてみます。

図5-12 デシジョン表内のルール

この表をDriver.ageの粒度で表示するには、図5-13に示すように、Driver.age条件を第1行から第3行に移動します。

図5-13 age条件を最終行に移動した後のデシジョン表

次に、最初の2つのルール(運転者が視覚テストをパスし、運転教習がtrueの場合)でDriver.age条件が考慮されないようにします。Driver.age条件が最終行にあるときは、これらの特定の条件に変更を簡単に適用できます。つまり、この表では、Driver.ageが最終行にあるときは、年齢に関連するルールを非常に高い粒度で、簡単に表示および変更できるようになります。一般的に、条件セルの位置や、条件セルの親、子または兄弟の位置に応じて、ツリーの特定レベルでのみ適切な特定の値を分割、マージまたは割り当てる場合に、移動操作を使用できます。

「アクション」領域内のアクションの場合は、「上へ移動」または「下に移動」をクリックするとアクションの順序を変更できます。アクションは、複数のアクションが適用される場合に最初のアクションが実行されてから以降のアクションが実行されるように順序付けされます。そのため、アプリケーションによっては、アクションに「上へ移動」または「下に移動」操作を使用することが適切な場合があります。

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

ギャップとは、デシジョン表内で欠落しているルールです。デシジョン表にギャップが生じるのは、各条件からの1つのバケットの組合せが、既存のルールの対象でない場合です。Rules Designerには、ギャップをチェックするためのギャップ・チェックが用意されています。「ギャップ分析」アイコンをクリックすると、Rules Designerによりギャップが検索され、検出されたギャップを修正するためのダイアログが表示されます。

ギャップがあると検証警告が表示されるように選択できます。「詳細設定」領域で「ギャップの許可」の選択を解除すると、ギャップの検出時にデシジョン表で検証警告がレポートされます。詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

たとえば、Driverの例では、Driver.age < 20でDriver.has_trainingがfalseのケースを対象とするルールを削除してギャップを作成してから、「ギャップ分析」をクリックすると、図5-14に示す「ギャップ分析」ダイアログが表示されます。チェック・ボックスを選択して「OK」をクリックすると、すべてのルールまたは選択したルールがデシジョン表に追加されます(この例では、追加対象として単一のルールが表示されているのみです)。

図5-14 ギャップのチェック

次のケースについては、ギャップ・チェックにより異なる新規ルールが生成されます。

- 兄弟ルール: 欠落している複数の兄弟ルールが単一の新規ルールとして追加されます。たとえば、2つの条件Driver.ageおよびDriver.hairを持つルールを考えてみます。異なる髪色に関して2つのルールが欠落しており、それらが兄弟(つまり、共通の親を持つ)ルールの場合、ギャップ・チェックでは図5-15に示すように単一ルールが表示されます。

- 非兄弟ルール: 欠落している複数の非兄弟ルールが、個別の新規ルールとして追加されます。たとえば、同じ親を持たない2つの異なるルールが欠落している場合、ギャップ・チェックでは図5-16に示すように2つのルールが表示されます。

図5-15 欠落している兄弟ルールがある場合のギャップ・チェック

図5-16 欠落している非兄弟ルールがある場合のギャップ・チェック

図5-15と図5-16に示したどちらの場合も2つのバケットが欠落していますが、兄弟ルールの場合は複数のバケットが結合されて新規の単一ルールになります。したがって、通常、ギャップ・チェックでは、多数の限定的なルールではなく少数の汎用的なルールが提案されます。

兄弟ルールの場合は、複数のルールを追加した後、必要なバケットを取得するように各セルを編集できます。または、ギャップの検索を使用してルールを追加してから、複数の値を含むセルを分割し、不要なルールを削除します。

5.3.1.4 デシジョン表の競合分析

デシジョン表内のルールが競合する場合があります。2つのルールが競合するのは、両者が重複し、異なるアクションが設定されている場合です。2つのルールが重複するのは、その条件セルの1つ以上に共通するバケットがある場合です。重複は、デシジョン表に考慮されない条件セルが含まれている場合に一般的です。競合のない重複は一般的であり、問題はありません。

Rules Designerでは競合が検出され、「競合の表示」をクリックするとデシジョン表の「競合解決」行に競合を表示できます。競合を処理して解決する方法は、指定された競合ポリシーによって異なります。競合ポリシーを選択するか、デフォルトの手動競合ポリシーを使用できます。「詳細設定」領域の「競合ポリシー」オプションを使用して競合ポリシーを設定すると、Rules Designerによってデシジョン表の競合ポリシーが設定されます。「競合ポリシー」では、デシジョン表の競合ポリシーとして、次のいずれかを指定します。

- 手動: 競合ルールごとに競合解決を手動で指定することで、競合を解決します。

- 自動オーバーライド: Oracle Business Rules自動競合解決ポリシーを使用して、可能な場合に、オーバーライド競合解決を使用して競合を自動的に解決します。

- 無視: 競合が無視されます。

詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。たとえば、図5-17に示されているデシジョン表の競合ルールは、デフォルトの手動競合ポリシーで解決されています。

図5-17 「競合」領域に競合するルールが表示されているデシジョン表

デシジョン表の「競合解決」領域でセルをクリックすると、次の方法でルール間の競合を解決できます。

- オーバーライド(「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-18に、「競合解決」領域で競合するルールを選択したときに表示される、Rules Designerの「競合解決」ダイアログを示します。このダイアログでは、オーバーライド、「RunBefore」または「RunAfter」オプションによる優先度設定および「NoConflict」オプションを選択して、ルール間の競合を解決できます。

図5-18 デシジョン表の「競合解決」ダイアログの使用

デシジョン表の「詳細設定」の「競合ポリシー」の「自動オーバーライド」オプションを使用すると、可能な場合は競合を自動的に解決するように指定できます。自動オーバーライド競合解決ポリシーでは、特殊ケースにより一般的なケースがオーバーライドされるように指定します。詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

つまり、デシジョン表に競合がある場合は、次の1つ以上を実行して競合を解決できます。

- デシジョン表の「競合ポリシー」→「自動オーバーライド」オプションを選択して、自動オーバーライド競合解決を使用します。

- デシジョン表の「競合ポリシー」→「無視」オプションを選択して、競合を無視します。

- デシジョン表の「競合ポリシー」→「手動」オプションを選択することで、手動の競合解決を使用し、「競合の表示」チェック・ボックスを選択した状態で「競合解決」領域でセルを選択することで、ダイアログ内の競合するルールごとに「競合解決」を設定します。

- デシジョン表を変更して重複を削除します。

- アクションを結合して競合を削除します。

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

「表の圧縮」アイコンおよび「表の分割」アイコンを使用して、デシジョン表を圧縮または分割します。詳細は、第5.3.1.1項「デシジョン表の分割操作と圧縮操作」を参照してください。

デシジョン表を圧縮する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、圧縮するデシジョン表を選択します。

2. 「表の圧縮」アイコンをクリックします。

デシジョン表のセルを分割する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、分割するデシジョン表を選択します。

2. 「表の分割」アイコンをクリックします。

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

条件マージ操作および条件分割操作を使用して、デシジョン表内の条件をマージまたは分割します。詳細は、第5.3.1.1項「デシジョン表の分割操作と圧縮操作」を参照してください。

デシジョン表内の条件をマージする手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件をマージするデシジョン表を選択します。

2. 「条件」領域で、マージする条件を選択します。

3. 右クリックしてリストから「条件のマージ」を選択します。

デシジョン表内の条件を分割する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件を分割するデシジョン表を選択します。

2. 「条件」領域で、分割する条件を選択します。

3. 右クリックしてリストから「分割条件」を選択します。

5.3.4 条件セルのマージ、分割および考慮されない条件セルの指定

条件セル操作を使用して、条件セルの分割、兄弟条件セルのマージまたはデシジョン表内の条件セルについて考慮されない値を指定します。詳細は、第5.3.1.1項「デシジョン表の分割操作と圧縮操作」を参照してください。

デシジョン表内の条件の兄弟セルをマージする手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件セルをマージするデシジョン表を選択します。

2. マージする兄弟条件セルを選択します。

3. 右クリックしてリストから「選択済セルのマージ」を選択します。

デシジョン表内の条件のセルを分割する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、条件セルを分割するデシジョン表を選択します。

2. 分割するセルを選択します。

3. 右クリックしてリストから「選択済セルの分割」を選択します。

デシジョン表内の条件セルについて考慮されない値を指定する手順は、次のとおりです。

1. Rules Designerから、「ルールセット」ナビゲーション・タブでルール・セットを選択し、考慮されない値を設定するデシジョン表を選択します。

2. 該当する条件セルを選択します。

3. 右クリックしてリストから「考慮しない」を選択します。

すべてのバケットを選択して条件セルについて考慮されない値を指定する手順は、次のとおりです。

1. Rules Designerから、「ルールセット」ナビゲーション・タブでルール・セットを選択し、考慮されない値を設定するデシジョン表を選択します。

2. 該当する条件セルを選択します。

3. ダブルクリックし、リストから可能な値すべてについて使用可能なチェック・ボックスをすべて選択します。

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

ギャップとは、デシジョン表内で欠落しているルールです。デシジョン表にギャップが生じるのは、各条件からの1つのバケットの組合せが、既存のルールの対象でない場合です。Rules Designerには、ギャップをチェックするためのギャップ・チェックが用意されています。この操作を使用すると、ルール・デザイナにギャップを修正するためのウィンドウが表示されます。詳細は、第5.3.1.3項「デシジョン表のギャップ・チェック」を参照してください。

ギャップがあると検証警告が表示されるように選択できます。「詳細設定」領域で「ギャップの許可」の選択を解除すると、ギャップの検出時にデシジョン表で検証警告がレポートされます。詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

デシジョン表のギャップ・チェックを実行する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、実行対象のデシジョン表を選択します。

2. 「ギャップ分析」アイコンをクリックします。

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

デシジョン表内のルールが競合する場合があります。2つのルールが競合するのは、両者が重複し、異なるアクションが設定されている場合です。2つのルールが重複するのは、その条件セルの1つ以上に共通するバケットがある場合です。詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

デシジョン表の競合解決を手動で実行する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブからルールセットを選択し、競合をチェックするデシジョン表を選択します。

2. 競合ポリシーを「手動」に設定します(デフォルトの競合ポリシーです)。詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

3. 「条件」領域で、「競合」領域に競合が存在する場合は、競合のあるルールごとに該当する条件セルをダブルクリックして「競合解決」ダイアログを表示します。

4. 「競合解決」ダイアログで、競合するルールごとに、「解決」フィールドのリストから解決を選択します。

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

デシジョン表で「詳細設定」オプションを選択する際に、「自動オーバーライド」競合ポリシーを使用してデシジョン表の競合が自動的に解決されるように選択できます(これは、Oracle Business Rules自動競合解決ポリシーを使用して競合を解決可能な場合にのみ適用されます)。自動オーバーライド競合解決ポリシーでは、ルールが競合する場合に特殊ケースにより一般的なケースがオーバーライドされるポリシーが使用されます。詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

自動オーバーライド・ポリシーを選択する手順は、次のとおりです。

1. 無視の競合ポリシーを使用するルールまたはデシジョン表を選択します。

2. ルール名またはデシジョン表名の横にある「詳細設定の表示」アイコンをクリックします。

3. 「競合ポリシー」オプションで、「自動オーバーライド」を選択します。

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

デシジョン表で「詳細設定」オプションを選択する際に、「無視」の競合ポリシーを使用して、デシジョン表の競合が無視されるように設定できます。無視のポリシーにより、Oracle Business Rulesはデシジョン表での競合を無視するようになります。詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

無視の競合ポリシーを選択する手順は、次のとおりです。

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で作成する必要があります。例5-1に示すスキーマ・ファイルをローカルに保存して、Oracle JDeveloperで使用可能にできます。

例5-1にorder.xsdスキーマ・ファイルを示します。

例5-1 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. 「アプリケーションの名前付け」ダイアログで、新規アプリケーションの名前および場所を入力します。

1. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、OrderApprovalAppと入力します。

2. 「ディレクトリ」フィールドで、ディレクトリ名を指定するか、またはデフォルトを使用します。

3. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞(com.example.orderなど)を入力します。
この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。

4. Oracle Business RulesでのSOAコンポジットの場合は、「アプリケーション・テンプレート」領域でアプリケーション・テンプレートとして「SOAアプリケーション」を選択します。図5-19に示す例を参照してください。

5. 「次へ」をクリックします。

図5-19 注文承認アプリケーションの追加

3. 「プロジェクトの名前付け」ページで、プロジェクトの名前および場所を入力します。

1. 「プロジェクト名」フィールドに名前を入力します。たとえば、OrderApprovalと入力します。

2. ディレクトリ名を入力または参照するか、デフォルトを使用します。

3. Oracle Business Rulesプロジェクトの場合は、図5-20に示すように、「プロジェクト・テクノロジ」タブの「選択済」領域に、「SOA」、「ADFビジネス・コンポーネント」、「Java」および「XML」が表示されていることを確認します。項目が欠落している場合は、その項目を「選択可能」ペインで選択し、「追加」ボタンを使用して「選択済」ペインに追加します。

図5-20 アプリケーションへのプロジェクトの追加

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

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

Oracle JDeveloperでプロジェクトを作成した後、プロジェクト内でビジネス・ルール・サービス・コンポーネントを作成する必要があります。ビジネス・ルールを追加する際、入力変数および出力変数を作成して、サービス・コンポーネントに入力を提供し、サービス・コンポーネントから結果を取得できます。

ビジネス・ルールをOracle JDeveloperで使用する手順は、次のとおりです。

- ビジネス・ルール・サービス・コンポーネントを追加します。

- サービス・コンポーネントの入力変数および出力変数を作成します。

- プロジェクト内でOracle Business Rulesディクショナリを作成します。

ビジネス・ルール・サービス・コンポーネントを作成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「OrderApproval」プロジェクト内の「SOAコンテンツ」を開き、composite.xmlをダブルクリックしてSOAコンポジット・エディタを起動します(このエディタは、プロジェクトの作成後、すでに開いている場合もあります)。

2. 「コンポーネント・パレット」で、「SOA」メニューの「サービス・コンポーネント」領域から「ビジネス・ルール」をcomposite.xmlエディタの「コンポーネント」レーンにドラッグ・アンド・ドロップします。
図5-21に示すように、Oracle JDeveloperで「ビジネス・ルールの作成」ページが表示されます。

図5-21 「ビジネス・ルールの作成」ダイアログでのビジネス・ルール・ディクショナリの追加

3. 入力を追加するには、「追加」アイコンの横にあるリストから「入力」を選択し、ビジネス・ルールを入力します。

4. 「タイプ・チューザ」ダイアログで、「スキーマ・ファイルのインポート」アイコンをクリックします。図5-22に示すように、「スキーマ・ファイルのインポート」ダイアログが表示されます。

図5-22 「スキーマ・ファイルのインポート」が表示されている「タイプ・チューザ」

5. 「スキーマのインポート」ダイアログで「リソースの参照」をクリックし、プロセスの入力変数のXMLスキーマ要素を選択します。「SOAリソース・ルックアップ」ダイアログが表示されます。

6. 「SOAリソース・ルックアップ」ダイアログで、ナビゲートしてorder.xsdスキーマ・ファイルを検索し、「OK」をクリックします。

7. 「スキーマ・ファイルのインポート」ダイアログで、図5-23に示すように、「プロジェクトにコピー」が選択されていることを確認します。

図5-23 order.xsdスキーマ・ファイルのインポート

8. 「スキーマ・ファイルのインポート」ダイアログで「OK」をクリックします。

9. 「ファイルのローカライズ」ダイアログが表示される場合は、「OK」をクリックしてスキーマをコンポジット・プロセス・ディレクトリにコピーします。

10. 「タイプ・チューザ」で、「プロジェクトのスキーマ・ファイル」フォルダにナビゲートして入力変数を選択します。
この例では、入力変数として「CustomerOrder」を選択します。

11. 「タイプ・チューザ」ウィンドウで「OK」をクリックします。図5-24に示すように、「ビジネス・ルールの作成」ダイアログが表示されます。

図5-24 CustomerOrder入力が表示されている「ビジネス・ルールの作成」ダイアログ

12. 同様の方法で、インポートしたorder.xsdから出力ファクト・タイプOrderApprovalを追加します。

13. 「ビジネス・ルールの作成」ダイアログで、図5-25に示すように、「コンポジット・サービスとして公開」を選択します。

図5-25 入力とOrderApproval出力が表示されている「ビジネス・ルールの作成」ダイアログ

14. 「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. Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。

2. 「バケットセットの作成」アイコンの横にあるドロップダウンから、「範囲リスト」を選択します。

3. 「名前」フィールドにOrderAmountと入力します(Rules Designerでは、名前を受け入れるときに必ず[Enter]を押します)。

4. 「OrderAmount」バケット・セット・アイコンをダブルクリックして「バケットセットの編集」ダイアログを表示します。

5. 「バケットの追加」をクリックしてバケットを追加します。

6. 「バケットの追加」を再度クリックしてバケットをもう1つ追加します。

7. 「範囲バケット値」領域で、最上位の「エンドポイント」フィールドに、エンドポイント値として1000を入力します。

8. 「範囲バケット値」領域で、「エンドポイント」フィールドの中間バケットに、エンドポイント値として500を入力します。

9. 図5-28に示すように、各バケットの「含まれるエンドポイント」フィールドでチェック・ボックスが選択されていることを確認します。

図5-28 OrderAmountバケット・セットの追加

10. 図5-29に示すように、それぞれの値の「エイリアス」フィールドを「高」、「標準」および「低」に変更します。

図5-29 「高」、「標準」および「低」の別名を持つOrderAmountバケット・セットの追加

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

CreditScoreバケット・セットをデータ・モデルに追加する手順は、次のとおりです。

1. Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。

2. 「バケットセットの作成」アイコンの横にあるドロップダウンから、「範囲リスト」を選択します。

3. 「名前」フィールドにCreditScoreと入力します。

4. 「CreditScore」バケット・セット・アイコンをダブルクリックして「バケットセットの編集」ダイアログを表示します。

5. 「バケットの追加」をクリックしてバケットを追加します。

6. 「バケットの追加」を再度クリックしてバケットをもう1つ追加します。

7. 最上位バケットについて、「エンドポイント」フィールドに750と入力します。

8. 中間バケットについて、「エンドポイント」フィールドに400と入力します。

9. 図5-30に示すように、各バケットの「含まれるエンドポイント」フィールドでチェック・ボックスが選択されていることを確認します。

図5-30 CreditScoreバケット・セットの追加

10. 図5-31に示すように、各エンドポイント値の「エイリアス」フィールドを、750は「solid」に、400は「avg」に、-Infinityは「risky」に変更します。

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

図5-31 risky、avgおよびsolid別名を持つCreditScoreバケット・セットの追加

5.4.6 バケット・セットとOrderプロパティおよびCreditScoreプロパティを関連付ける方法

デシジョン表を作成する準備のため、バケット・セットをデータ・モデル内のファクト・プロパティに関連付けることができます。これにより、デシジョン表の作成時に、デシジョン表の「条件」領域にある条件セルでバケット・セットを使用できるようになります。

OrderApprovalファクト・タイプがXMLスキーマからインポートされた時点で、Statusバケット・セットにOrderApproval.statusプロパティが関連付けられていることに注意してください。スキーマ内では、StatusがStringタイプに制限されるため、列挙バケット・セットとして表されます。ルール・デザイナにより、Statusバケット・セットが作成されます。詳細は、第3.2.4項「XMLファクトに関する必知事項」を参照してください。

バケット・セットをOrderプロパティおよびCreditScoreプロパティに関連付ける手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 図5-32に示すように、「ファクト」ナビゲーション・タブで「XMLファクト」タブを選択します。

図5-32ルール・デザイナでビジネス・ルール・ディクショナリを開く様子

3. 変更するタイプを選択します。たとえば、「XMLファクト」表で、「CustomerOrder」エントリの横のアイコンをダブルクリックします。「XMLファクトの編集 -」ダイアログが表示されます。

4. 「XMLファクトの編集 -」ダイアログの「プロパティ」表の「バケットセット」列で、適切なプロパティのセルを選択し、使用するバケット・セットをリストから選択します。たとえば、図5-33に示すように、プロパティ「order」について「OrderAmount」バケット・セットを選択します。

図5-33 OrderAmountバケット・セットとCustomerOrder.orderの関連付け

5. 同様の方法で、プロパティ「creditScore」について「CreditScore」バケット・セットを選択します。

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

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

デシジョン表を作成して、入力ファクトを処理して出力ファクトを生成するか、または暫定的な結論を生成します。暫定的な結論は、Oracle Business Rulesにより他のルールを使用するか別のデシジョン表内でさらに処理できます。

ルールを操作する際に、ルール・デザイナのルール検証機能を使用できます。ルール・デザイナでは、ディクショナリに変更を加えたときに、ディクショナリ検証が実行されます。検証ログ・ウィンドウを表示するには、「検証」アイコンをクリックするか、または「表示」→「ログ」を選択して、「ビジネス・ルール検証」タブを選択します。ルール検証ログを表示すると、警告メッセージが表示されます。これらの警告メッセージは、デシジョン表を作成すると削除されます。ルール検証の詳細は、第4.4.2項「ルール検証」を参照してください。

このサンプル・アプリケーションでルールにデシジョン表を使用するには、特定の顧客および特定の注文に関して顧客の消費レベルおよび顧客の信用リスクを表すファクトを操作します。次に、デシジョン表を使用し、顧客の消費額、注文金額および顧客の信用リスクに基づくルールを作成します。

注文承認用のデシジョン表を追加する手順は、次のとおりです。

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-34に示すように、テキスト入力領域で>2000を追加します。

図5-34 デシジョン表への年間消費額エントリの追加

10. 図5-35に示すように、[Enter]を押して値を受け入れます。ルール検証ログを表示すると、図5-35に示すように警告メッセージが表示されます。これらの警告メッセージは、後のステップでデシジョン表を変更すると削除されます。

図5-35 CustomerOrderデシジョン表への条件の追加

デシジョン表にアクションを作成する手順は、次のとおりです。

1. デシジョン表で、「追加」アイコンをクリックしてリストから「アクション」→「Assert New」を選択します。

2. 「アクション」領域で、assert new(をクリックします。これにより、「アクション・エディタ」ダイアログが表示されます。

3. 「アクション・エディタ」ダイアログの「ファクト」領域で「OrderApproval」を選択します。

4. 「アクション・エディタ」ダイアログで、プロパティstatusの「プロパティ」表で「パラメータ化」チェック・ボックスおよび「定数」チェック・ボックスを選択します。これで、各ルールでステータスを個別に設定するように指定したことになります。

5. 図5-36に示すように、「アクション・エディタ」ダイアログで「常に選択」チェック・ボックスを選択します。

図5-36 「アクション・エディタ」ダイアログを使用してデシジョン表にアクションを追加する様子

6. 「アクション・エディタ」ダイアログで「OK」をクリックします。

次に、デシジョン表にルールを追加し、ルールごとにアクションを指定する必要があります。

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

デシジョン表の分割操作を使用して、デシジョン表の条件行に関連付けられたバケット・セットに関するルールを作成できます。これにより、条件バケットの組合せごとにルールが1つ作成されます。3つの注文金額バケット、3つの信用スコア・バケット、および年間消費額用の2つのブール・バケットがあり、ルールは合計3 x 3 x 2 = 18となります。

デシジョン表のセルを分割する手順は、次のとおりです。

1. デシジョン表を選択します。

2. デシジョン表で、「表の分割」アイコンをクリックし、リストから「表の分割」を選択します。表の分割操作により、考慮されないセルが表から消去されます。図5-37に示すように、表にはすべての範囲を対象とする18のルールが表示されています。

これらのステップでは、欠落している式があるアクション・セルに関する検証警告が生成されます。これらの警告は後のステップで修正します。

図5-37 表分割操作を使用したデシジョン表の分割

デシジョン表内のルールごとにアクションを追加する手順は、次のとおりです。

デシジョン表の「アクション」領域で、各アクション・セルのOrderApprovalに関連付けられているstatusプロパティの値を指定します。可能な選択肢は、「Status.MANUAL」、「Status.REJECTED」または「Status.ACCEPTED」です。このステップでは、18のルールそれぞれについて、statusの値を入力します。入力した値は、デシジョン表の各ルールを構成する条件に対応します。

1. 図5-38に示すように、「アクション」領域で、操作するルールのアクション・セルをダブルクリックします。

図5-38 デシジョン表へのアクション・セル値の追加

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.2 デシジョン表の圧縮

この手順では、18のルールを9つのルールにマージして圧縮します。これにより、不要なルールが自動的に消去され、デシジョン表にギャップや競合するプロパティのない状態が保持されます。

デシジョン表を圧縮する手順は、次のとおりです。

1. デシジョン表を選択します。

2. 「すべての列を同じ幅にサイズ変更」アイコンをクリックします。

3. 「表の圧縮」アイコンをクリックし、リストから「表の圧縮」を選択します。表圧縮操作により、デシジョン表からルールが消去されます。図5-39に示すように、デシジョン表には9つのルールが表示されるようになります。

図5-39 「表の圧縮」を使用したデシジョン表の圧縮

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

残る9つのルールのうち5つでは、手動注文承認ステータスになることに注意してください。ルール数は、これら5つのルールを削除することで減らすことができます。通常は、このことは行わない、つまり、複数の限定的ルールを1つの一般ルールで置き換えないことがベスト・プラクティスです。ルール数を減らす際には、少数のルールを使用するメリットおよびルール数の減少で生じる競合の管理に伴う複雑さを比較する必要があります。

複数の限定的ルールを1つの一般ルールで置き換える手順は、次のとおりです。

1. デシジョン表を選択します。

2. デシジョン表で、OrderApproval statusのアクションが「Status.MANUAL」に設定されているルールを選択します。ルールを選択するには、列見出しをクリックします。たとえば、図5-40に示すように、ルール「R2」をクリックします。

3. 「削除」をクリックしてデシジョン表内のルールを削除します。「デシジョン表」領域でデシジョン表内のルールを削除するために「削除」アイコンをクリックする際は、慎重に行ってください(「ルールセット」領域にも、デシジョン表全体を削除する「削除」アイコンがあります)。

図5-40 デシジョン表からのルールの削除

4. 前述の手順を繰り返し、アクションが「Status.MANUAL」に設定されているすべてのルールを削除します。これにより、図5-41に示すように、デシジョン表には4つのルールが残ることになります。

図5-41 手動アクションを削除した後のデシジョン表

5.4.7.4 一般ルールの追加

これで、手動の場合を処理する単一ルールを追加できます。このルールを追加したら、競合解決に対して、「競合ポリシー」の「自動オーバーライド」オプションを使用して競合ポリシーを設定します。

一般ルールを追加する手順は、次のとおりです。

1. デシジョン表で、「追加」アイコンをクリックし、リストから「ルール」を選択します。

2. 「条件」領域で、3つの条件についてルールのセルごとに「-」(考慮されない値)を残します。

3. 「アクション」領域で、図5-42に示すように「Status.MANUAL」を入力します。「ビジネス・ルール検証」ログに、解決されない競合に関する警告「RUL-05851」が表示されることに注意してください。

図5-42 競合するルールを含むデシジョン表

4. 図5-43に示すように、競合解決の表示切替えアイコンをクリックして、競合するルールを表示します。

図5-43 Status.MANUALを処理するルールの追加

自動オーバーライド競合解決ポリシーを有効にする手順は、次のとおりです。

1. デシジョン表で、「詳細設定の表示」(デシジョン表名の横にあるアイコン)をクリックします。

2. 「競合ポリシー」リストで、「自動オーバーライド」を選択します。手動の場合のルールを追加し、「自動オーバーライド」を選択すると、図5-44に示すように、競合が解決され、限定的な場合により一般的な場合がオーバーライドされることがわかります。

図5-44 自動オーバーライド競合ポリシーを使用したStatus.MANUALを処理するルールの追加

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

アプリケーションをデプロイする前に、ディクショナリが警告なしで検証されることを確認する必要があります。検証警告がある場合は、それに関連する問題を解決する必要があります。

ディクショナリを検証する手順は、次のとおりです。

1. 「ビジネス・ルール検証」ログで、検証警告をチェックします。

2. 検証警告がある場合は、適切なアクションを実行して問題を修正します。

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

SOAアプリケーションで作成されたビジネス・ルールは、Oracle JDeveloperでデプロイメント・プロファイルを作成するときに、SOAコンポジットの一部としてデプロイされます。SOAコンポジット・アプリケーションをOracle WebLogic Serverにデプロイします。

注文承認アプリケーションをデプロイして実行する手順は、次のとおりです。

1. アプリケーション・サーバー・インスタンスを起動していない場合は、Oracle WebLogic Serverを起動します。

2. 「アプリケーション・ナビゲータ」で、「OrderApproval」プロジェクトを右クリックし、「デプロイ」→「OrderApproval」→「To」→「WLSサーバー名」を選択します。
これにより、「SOAデプロイメントと構成ダイアログ」が表示されます。

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

4. 「認証リクエスト」ダイアログで、認証を入力します。

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

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

アプリケーションのデプロイ後、Oracle Enterprise Manager Fusion Middleware Controlコンソールを使用して、SOAコンポジット・アプリケーションでデシジョン表をテストできます。

アプリケーションをテストする手順は、次のとおりです。

1. 図5-45に示すように、Oracle Enterprise Manager Fusion Middleware Controlコンソールでコンポジット・アプリケーションを開きます。

図5-45 注文承認アプリケーションのテスト

2. 「テスト」をクリックします。

3. 「引数を入力」領域で、「XML表示」を選択します。このXMLを例5-2の内容に置き換えます。

例5-2 注文承認アプリケーションのテスト用のサンプル入力

<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. 例5-2に示す入力値を、テスト用に必要な値に置き換えます。

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>

6 デシジョン関数の使用

この章では、デシジョン関数を使用して、Javaアプリケーション、コンポジットまたはBPELプロセスからルールをコールする方法について説明します。

この章の項目は、次のとおりです。

- 第6.1項「デシジョン関数の概要」

- 第6.2項「デシジョン関数の使用」

- 第6.3項「デシジョン関数に関する必知事項」

6.1 デシジョン関数の概要

デシジョン関数は、宣言的に構成される関数です。

デシジョン関数には次の宣言が含まれています。

- 入力ファクト

- ルールセットおよびネストしたデシジョン関数

- 出力ファクト

デシジョン関数では、次の操作が実行されます。

- Oracle Business Rules Engineの作業メモリーに入力をルール・ファクトとしてアサートします。

- 現在のデシジョン関数およびネストしたデシジョン関数で構成されたルールセットを順番に実行します。

- Oracle Business Rules Engineの作業メモリーから出力ファクトを返します。

デシジョン関数を作成して、JavaアプリケーションやBPELプロセスからOracle Business Rulesを簡単に使用できます。デシジョン関数では、使用するルールを複数のルールセットとして編成し、ルールセットを規定の順序で実行できます。ファクトは最初のルールセットに進み、このルールセットで2番目以降のルールセットに進む追加のファクトをアサートでき、最後にデシジョン関数の出力としてデシジョン関数に戻ります。

6.2 デシジョン関数の使用

デシジョン関数は、宣言的に構成される関数です。

6.2.1 デシジョン関数の追加または編集方法

デシジョン関数を追加するにはルール・デザイナを使用します。

デシジョン関数を追加する手順は、次のとおりです。

1. Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。

2. 「デシジョン関数」領域で、「作成」アイコンをクリックします。
新しいデシジョン関数が作成され、図6-1のように、「デシジョン関数の編集」ダイアログが表示されます。

図6-1 「デシジョン関数の編集」ダイアログ

3. 「名前」フィールドにデシジョン関数名を入力します。

4. 必要に応じて「説明」フィールドに説明を入力します。

5. 「ルール起動制限」フィールドで「無制限」または値を選択します。デシジョン関数をデバッグするときに、ルール起動制限の値の入力が必要になる場合があります。詳細は、第6.3.1項「ルール・デバッグ用の「ルール起動制限」オプションに関する必知事項」を参照してください。

6. 「ルール起動制限がエラー」を選択します。起動制限に到達すると、システムがエラーをスローします。

7. 適切なデシジョン関数オプションを選択します。

- 「Webサービスとして起動」: デシジョン関数をWebサービスとして起動するかどうかを選択し、Webサービス名を指定します。

- ルール・フローの確認: このオプションを選択すると、適切なタイプのファクトがデシジョン関数への明示的な入力になるか、ルール・フローでルールによってアサートされるように、ルール・フローが確認されます。ただし、このオプションを選択しても、常に有益な情報が作成されるわけではなく、デシジョン関数を使用するJavaコードでファクトをアサートできても、設計時にこのコードが使用できない場合もあります。この場合、「ルール・フローの確認」の選択により発生する検証の警告は役に立たない可能性があります。

- 「ステートレス」: このオプションは、デシジョン関数がステートレスの場合に選択します。詳細は、第6.3.3項「デシジョン関数の「ステートレス」オプションに関する必知事項」を参照してください。

8. 「入力」タブで、「追加」をクリックして入力を追加します。「入力」表で、入力ごとに適切なオプションを選択します。

- 「名前」 - 入力名を入力して[Enter]を押すか、またはデフォルト名を使用します。

- 「ファクト・タイプ」 - リストから適切なファクト・タイプを選択します。

- 「ツリー」 - このオプションを選択しない場合、入力はassert関数を使用してアサートされます。このオプションを選択した場合、入力はassertTree関数を使用してアサートされます。この場合、入力オブジェクトは、Listプロパティを使用して1対多関係で他のオブジェクトに接続されるオブジェクト・ツリーのルートであると予期されます。詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。

- 「リスト」 - このオプションを選択しない場合、入力をシングル・オブジェクトにする必要があり、アサーションはそのシングル入力オブジェクトにのみ適用されます。このオプションを選択する場合、入力をオブジェクトのListにする必要があり、アサーションは入力のList (java.util.List)の各オブジェクトに適用されます。

- 「説明」 - 入力の説明です。

9. 「出力」タブで、「追加」をクリックして出力を追加します。「出力」表で、出力ごとに適切なオプションを選択します。

- 「名前」 - 出力名を入力して[Enter]を押すか、またはデフォルト名を使用します。

- 「ファクト・タイプ」 - リストから適切なファクト・タイプを選択します。

- 「ツリー」 - このオプションを選択すると、特定のデザインタイムのデシジョン関数引数チェックを有効にするフラグが設定されます。出力引数については、このオプションを選択してもランタイム動作に影響しません。ただし、デザインタイムに複数のデシジョン関数を順番にコールする場合は、1つのデシジョン関数の出力がツリーであることを明示的に指定すると有用です。これは、シーケンス内の別のデシジョン関数の入力は、入力としてツリーを予期することを意味します。詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。

- 「リスト」 - このオプションを選択しない場合、出力はシングル・オブジェクトです。このオプションを選択した場合、出力はオブジェクトのグループです。出力引数の「リスト」オプションの動作の詳細は、第6.3.2項「デシジョン関数の引数に関する必知事項」を参照してください。

- 「説明」 - 出力の説明です。

10. 「初期アクション」タブでは、アサートする前に入力ファクトを変更したり、ルールセット・スタックを変更したり、有効日を設定したり、出力ファクトをアサートしたりするために使用できるアクションを追加できます。これらのアクションは、ルールのかわりに使用したり、ルールを実行するための環境「設定」のために使用できます。
「初期アクション」タブを使用して、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値のみを受け入れます。アクション条件ごとに異なるテスト・フォーム・タイプを追加できます。

11. 「ルールセットおよびデシジョン関数」領域で、シャトルを使用して項目を「使用可能」ボックスから「選択済」ボックスに移動します。

12. 「選択済」ボックスで項目を選択し、必要に応じて「上に移動」または「下に移動」をクリックして、ルールセットおよびデシジョン関数の順序を変更します。

既存のデシジョン関数を編集する手順は、次のとおりです。

1. Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。

2. 編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。

3. デシジョン関数を追加する場合と同様に、適切なデシジョン関数のフィールドを編集します。

入力の順序を変更する手順は、次のとおりです。

1. Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。

2. 編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。

3. 移動する入力引数を選択します。「上に移動」または「下に移動」をクリックして、入力引数の順序を変更します。

出力の順序を変更する手順は、次のとおりです。

1. Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。

2. 編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。

3. 移動する出力引数を選択します。「上に移動」または「下に移動」をクリックして、出力引数の順序を変更します。

デシジョン関数を編集する手順は、次のとおりです。

1. 「デシジョン関数」タブをクリックします。
図6-3に示すように、デシジョン関数が表示されます。

2. 編集対象のデシジョン関数を選択して、「編集」アイコンをクリックします。
「デシジョン関数の編集」ダイアログが表示されます。

3. デシジョン関数の新規追加に使用したプロセスを使用して、必要な変更を行います。

図6-3 デシジョン関数の編集

6.3 デシジョン関数に関する必知事項

デシジョン関数は、宣言的に構成される関数です。

6.3.1 ルール・デバッグ用の「ルール起動制限」オプションに関する必知事項

「ルール起動制限」では、実行時に許可されるステップ(ルール起動)の最大数を設定できます。このオプションを使用して「無制限」以外の値を指定すると、特定のルールの設計問題をデバッグしたり、場合によっては実行時のjava.lang.OutOfMemoryErrorエラーを防止できます。これは、無限に再帰するルール起動をデバッグするときに役立ちます。

無制限以外の値を選択し、「ルール起動制限がエラー」を選択した場合、制限に到達するとシステムがエラーをスローします。

6.3.2 デシジョン関数の引数に関する必知事項

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関数を使用してアサートされます。また、「ツリー」が選択されている場合、入力オブジェクトは、Listまたは配列型プロパティを使用して1対多関係で他のオブジェクトに接続されるオブジェクト・ツリーのルートであると予期されます。

「ルールセットおよびデシジョン関数」領域の「選択済」ボックスで指定されたデシジョン関数の選択済ルールセットについて、生成されたRL Language関数には、選択されたルールセットのスタック順序に従って選択済ルールセットを指定したrun()へのコールが含まれています。

生成されたRL Language関数はリストを返します。このリストには、デシジョン関数の各出力の要素が順番に含まれています。出力がリストとして宣言された場合、対応する要素はリストになります。しかし、出力がリストとして宣言されていない場合、対応する要素は出力ファクトまたはnull(宣言されたタイプの出力ファクトが存在しない場合)になります。出力がリストとして宣言されていないときに、Oracle Business Rules Engineの作業メモリー内に指定したタイプの出力ファクトが複数見つかった場合は、例外がスローされます。

デシジョン関数を編集した後(入力と出力の変更、追加など)、変更内容は新規ビジネス・ルール・アクティビティについてBPELで参照可能になります。ただし、既存のビジネス・ルール・アクティビティでは変更内容を参照できません。詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesのスタート・ガイドを参照してください。

6.3.3 デシジョン関数の「ステートレス」オプションに関する必知事項

デシジョン関数は、ステートフル操作またはステートレス操作をサポートしています。「デシジョン関数の編集」ダイアログの「ステートレス」チェックボックスを使用して、これらの2つの操作モードを切り替えることができます。

デフォルトでは、「ステートレス」チェックボックスが選択されており、ステートレス操作を示しています。ステートレス操作では、実行時に、デシジョン関数の起動が終わるたびにルール・セッションが解放されます。

「ステートレス」の選択を解除すると、基礎となるOracle Business Rulesオブジェクトはビジネス・ルール・サービス・エンジンのメモリーに保管されるため、操作の終了時にルール・セッション・プールに戻されません。これ以降にデシジョン関数を使用すると、キャッシュされているRuleSessionオブジェクトが再利用され、そのすべての状態情報が前回の起動から取得されます。したがって、「ステートレス」の選択を解除すると、ルール・セッションは以降のリクエストのために保存され、同じプロセスからの一連のデシジョン関数の起動は常にステートレス起動で終了します。

7 Rules SDKデシジョン・ポイントAPIの使用

この章では、Oracle Business Rules SDK (Rules SDK)を使用して、Oracle Business Rulesのディクショナリのルールにアクセスしたり、ルールを作成、変更および実行したり、ディクショナリの内容を操作するアプリケーションを記述したりする方法について説明します。Rules SDKの概要、およびRules SDKデシジョン・ポイントAPIの使用方法についても説明します。

この章の項目は、次のとおりです。

- 第7.1項「Rules SDKおよびレンタカー・サンプル・アプリケーションの概要」

- 第7.2項「デシジョン・ポイントで使用するディクショナリの作成」

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

- 第7.4項「レンタカー・サンプルの実行」

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

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

詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

7.1 Rules SDKとレンタカー・サンプル・アプリケーションの概要

Rules SDKは、次の4つの領域で構成されています。

- エンジン: ルール実行の準備をします。

- ストレージ: ルールのディクショナリとリポジトリへのアクセスを提供します。

- 編集: ディクショナリ・コンポーネントの作成と変更をプログラムで行えるようにします。

- デシジョン・ポイント: ディクショナリにアクセスしたりデシジョン関数を実行するためのインタフェースを提供します。

説明以外の目的でRules SDKのこれらの領域が明示的に区別されることはありません。たとえば、ルールを編集するには、Rules SDKのストレージ領域を使用して、ディクショナリにもアクセスする必要があります。Rules SDKがこれらの領域に分割されているのは、個別のRules SDK APIを説明するためではなく、各種の使用モードを説明しやすくするためです。

7.1.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インスタンスの名前。

- 指定したディクショナリに格納されているデシジョン関数の名前。

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

この章では、Rules SDKとデシジョン・ポイントAPIの使用方法を示すレンタカー・アプリケーションについて説明します。このサンプル・アプリケーションは、CarRentalApplication.zipというZIPファイルで入手できます。このZIPファイルには、完全なJDeveloperアプリケーションとプロジェクトが含まれています。

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

サンプルを使用するには、CarRentalApplication.zipを適切なディレクトリに解凍します。レンタカー・アプリケーションのプロジェクトには、ルール・ディクショナリおよびRules SDKを使用したいくつかのJavaサンプルが含まれています。

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

レンタカー・サンプル・アプリケーションにより、Rules SDKデシジョン・ポイントAPIの使用方法がわかります。

レンタカー・サンプル・アプリケーションを開く手順は、次のとおりです。

1. Oracle JDeveloperを起動します。

2. サンプルを解凍したディレクトリにあるレンタカー・アプリケーションを開きます。たとえば、「ファイル」メニューから「開く」を選択し、「開く」ダイアログでCarRentalApplicationフォルダにナビゲートします。

3. 「開く」ダイアログで「CarRentalApplication.jws」を選択し、「開く」をクリックします。

4. 「アプリケーション・ナビゲータ」で「CarRentalApplication」を開き、「アプリケーション・ソース」と「リソース」を開きます。CarRental.rulesという名前のOracle Business RulesディクショナリといくつかのJavaソース・ファイルが表示されます。

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

レンタカー・サンプルでは、事前ロード済のOracle Business RulesディクショナリまたはMDSに格納されているリポジトリでRules SDKデシジョン・ポイントAPIを使用します。開発環境で作業する場合は、事前ロード済のディクショナリ・シグネチャでデシジョン・ポイントAPIを使用できます。本番環境では、一般にMDSリポジトリ・シグネチャでデシジョン・ポイントを使用します。

CarRentalディクショナリが事前に定義されており、レンタカー・サンプル・アプリケーションで使用できます。

デシジョン・ポイントAPIを使用するには、デシジョン関数を含むディクショナリを作成する必要があります(レンタカー・サンプル・アプリケーションには、事前定義済のディクショナリとデシジョン関数が用意されています)。

ディクショナリとデシジョン関数を作成するには、次の手順を実行します。

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

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

- 第7.2.3項「デシジョン関数のルールまたはデシジョン表の作成方法」

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

デシジョン・ポイントを使用してアプリケーションを作成する場合、デシジョン関数に追加する次のディクショナリが必要になります。

- ルールまたはデシジョン表の作成に使用するデータ・モデル要素を含むディクショナリ。ADFビジネス・コンポーネント・ファクト・タイプを使用する場合は、デシジョン・ポイント・サポート・ディクショナリのリンクを追加する必要があります。詳細は、第2章「データ・モデル要素の使用」を参照してください。詳細は、第10章「Oracle Business RulesとADFビジネス・コンポーネントの使用」を参照してください。

- ファクト定義を含むディクショナリ。詳細は、第3章「ファクトとバケット・セットの使用」を参照してください。

用意されているレンタカー・サンプル・アプリケーションのデータ・モデルを表示する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。

2. 図7-1に示すように、「Javaファクト」タブを選択します。
「Javaファクト」タブに、ディクショナリに組み込まれているファクト・タイプに加えて、インポートされた次の4つのファクト・タイプが表示されます。

Driver Javaファクトは、プロジェクト内のDriver Javaクラスからインポートされています。

Denial Javaファクトは、プロジェクト内のDenial Javaクラスからインポートされています。

LicenseTypeファクトとVehicleTypeファクトは、Driverクラスで定義されている、ネストしたenumクラスからインポートされています。

図7-1 レンタカー・サンプル・アプリケーション用に定義されているJavaファクト

Rules SDKのデシジョン・ポイントを使用する場合は、指定したディクショナリ内のデシジョン関数をコールします。コールするデシジョン関数には、デシジョン・ポイントの一部として実行される1つ以上のルールセットを含めることができます。

用意されているレンタカー・サンプル・アプリケーションのルールセットを表示する手順は、次のとおりです。

1. ルール・デザイナで「CarRentalApplication」を開きます。

2. 「CarRentalApplication」で「リソース」を開きます。

3. 「CarRental.rules」をダブルクリックします。

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

デシジョン・ポイントAPIを使用する場合は、デシジョン関数を使用してOracle Business Rulesディクショナリを公開します。デシジョン関数の詳細は、第6章「デシジョン関数の使用」を参照してください。

レンタカー・サンプル・アプリケーションのデシジョン関数を表示する手順は、次のとおりです。

1. Rules Designerで、「デシジョン関数」ナビゲーション・タブをクリックします。図7-2に示すように、CarRentalディクショナリ内の使用可能なデシジョン関数が表示されます。

図7-2 レンタカー・サンプルのデシジョン関数

2. CarRentalDecisionFunctionの行を選択し、デシジョン関数のアイコンをダブルクリックします。図7-3に示すように、「デシジョン関数の編集」ダイアログが開きます。
デシジョン関数の「入力」表には、Driverファクト・タイプの単一の引数が表示されます。

デシジョン関数の「出力」表には、Denialファクト・タイプの単一の引数が表示されます。

デシジョン関数の「ルールセットおよびデシジョン関数」領域の「選択済」ボックスには、「Denial Rules:if-then」が表示されます。

図7-3 レンタカー・サンプル・アプリケーションのレンタカー・デシジョン関数

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

レンタカー・サンプルには2つのルールセットが含まれています。一方にはIF/THENルール、もう一方にはデシジョン表が含まれています。デシジョン・ポイントの使用時は、IF/THENルールかデシジョン表のいずれか、または両方をアプリケーションで使用できます。

レンタカー・サンプル・アプリケーションのルールを表示する手順は、次のとおりです。

1. 図7-4に示すように、ルール・デザイナで「Denial Rules:if-then」ルールセットをクリックします。

図7-4 レンタカー・サンプル・アプリケーションのIF/THENルールを含むルールセット

「Denial Rules:if-then」ルールセットには、次の2つのルールが含まれています。

- under age: このルールは、運転者の最低年齢を定義します。DriverインスタンスのageプロパティをグローバルのMinimum driver ageと比較します。運転者がこの年齢未満の場合、新しいDenialファクトがアサートされます。デシジョン関数へのコールにより、このDenialファクトが出力の定義に従って収集されます。また、このルールは、Denialが作成された理由を示す監査出力を提供するために、ユーザー定義関数auditもコールします。

- too many accidents: このルールは、それを超えると運転者がレンタルを拒否される、事故回数の上限値を定義します。また、このルールは、Denialが作成された理由を示す監査出力を提供するために、ユーザー定義関数auditもコールします。

レンタカー・アプリケーションのデシジョン表を表示する手順は、次のとおりです。

1. 図7-5に示すように、ルール・デザイナで「Denial Rules:decision table」ルールセットをクリックします。

図7-5 レンタカー・サンプル・アプリケーションのデシジョン表を含むルールセット

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

レンタカー・サンプル・アプリケーションには、「Denial Rules: decision table」ルールセットが含まれています。用意されているデシジョン関数サンプルでデシジョン表を使用するように切り替えるには、図7-6に示すように、デシジョン関数の「選択済」領域から「Denial Rules:if-then」を移動し、デシジョン表を使用して同様のルールを定義する「Denial Rules: decision table」ルールセットをこの領域に追加します。

図7-6 デシジョン表ルールセットを使用したレンタカー・サンプルのデシジョン関数

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

開発環境でRules SDKを使用する場合は、事前ロード済のディクショナリでデシジョン・ポイントAPIを使用できます。本番環境では、一般にMDSリポジトリ・シグネチャでデシジョン・ポイントAPIを使用し、ディクショナリはMDSに格納されます。デシジョン・ポイントの使用方法の詳細は、第7.5項「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

CarRentalProjectプロジェクトには、レンタカー・サンプル・ファイルCarRentalWithDecisionPointUsingPreloadedDictionary.javaを含む、com.example.rules.demoパッケージが含まれています。このプロジェクトには、デシジョン・ポイントを使用するための様々なバリエーションをサポートする複数の.javaソース・ファイルも含まれています。表7-1に、レンタカー・サンプルの様々なバージョンのサマリーを示します。

Rules SDKデシジョン・ポイントAPIの使用方法の詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

表7-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

同時ユーザーによるデシジョン・ポイントの起動をシミュレートするスレッドとして使用できるクラスが含まれています。

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

デシジョン・ポイントを使用するには、例7-1に示すように、DecisionPointBuilderを使用してDecisionPointインスタンスを作成します。

例7-1 デシジョン・ポイント・ビルダーの使用

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();
}
}

例7-1は、DecisionPointBuilderが流れるようなインタフェース・パターンをサポートしているため、デシジョン・ポイントの作成時にすべてのメソッドを容易に連鎖させることができることを示しています。DecisionPointBuilderでデシジョン・ポイントを構成するための最も一般的な3つのメソッドは、with()という名前を持つようにオーバーロードされます。各with()メソッドは、RuleDictionary型、DictionaryFQN型またはString型の単一の引数を使用します。DecisionPointBuilderは、類似のsetメソッドとgetメソッド(getDecisionFunction()、setDecisionFunction()、getDictionary()、setDictionary()、getDictionaryFQN()、setDictionaryFQN())もサポートしています。

例7-1に示すこの連鎖には、次のステップが含まれています。

1. 最初のステップでは、次のようなコードでDecisionPointBuilderインスタンスを作成します。

new DecisionPointBuilder()

2. String引数を使用するwith()メソッドで、デシジョン・ポイントによって実行されるデシジョン関数の名前を定義します。このメソッドのコールは必須です。

.with(DF_NAME)

DF_NAMEには、アプリケーションで定義したデシジョン関数の名前を指定します。たとえば、レンタカー・サンプル・アプリケーションでは、DF_NAMEがCarRental.javaでCarRentalDecisionFunctionと定義されています。

3. これ以外の2つのwith()メソッドのうち、いずれか1つのみをコールします。このサンプル・コードでは、指定したデシジョン関数を含む事前ロード済のルール・ディクショナリ・インスタンスを使用しています。loadDictionary()メソッドは、ファイルからRuleDictionaryのインスタンスをロードします。例7-2に、loadDictionary()メソッドを示します。詳細は、第7.3.2項「事前ロード済のディクショナリでデシジョン・ポイントを使用する方法」を参照してください。

.with(loadRuleDictionary())

4. DecisionPointインスタンスを作成して戻すために、build()メソッドをコールします。

DecisionPointインスタンスは、アプリケーションのすべてのインスタンス間で共有されます。このためこのインスタンスは静的な属性で、静的なブロック内で作成されます。DecisionPointを初期化する別の方法としては、DecisionPointインスタンスを作成して戻した静的なメソッドを使用して、m_decisionPoint属性を初期化することが考えられます。

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

例7-2に、ファイルからRuleDictionaryのインスタンスをロードするloadRuleDictionary()メソッドを示します。

例7-2に示すように、ファイルから直接ディクショナリの読取りまたは書込みを行う場合は、必ずエンコーディングをUTF-8に設定します。そうでない場合、ディクショナリで使用するUnicode文字が破損してしまいます。UTF-8オプションは、FileInputStreamまたはOutputStreamWriterコンストラクタ内で明示的に設定する必要があります。FileReaderやFileWriterなどのJavaクラスは使用できません。これらのクラスはプラットフォームのデフォルト・エンコーディングを常に使用しており、それは通常はUnicodeバリアントではなくASCIIバリアントだからです。

例7-2 ルール・ディクショナリのロード・メソッド

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;
}

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

レンタカー・サンプルでは、Oracle Business Rulesを使用して複数の同時ユーザーをシミュレートできます。例7-3に、JavaのExecutorServiceインタフェースを使用して、デシジョン・ポイントを起動する複数のスレッドを実行する方法を示します。ExecutorServiceは、Rules SDKデシジョン・ポイントAPIに含まれていません。

例7-3 デシジョン・ポイントを起動するスレッドによる運転者の確認

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));
}

例7-3には、サンプル・アプリケーションの次のコードが含まれています。

- エグゼキュータ・サービスを作成します。

ExecutorService exec = Executors.newCachedThreadPool();

- CarRental.javaに定義されているcreateDrivers()メソッドをコールして、Driverインスタンスのリストを作成します。

List<Driver> drivers = createDrivers();

- Driverインスタンスのリストをループしてdriverリストに運転者を格納します。

- ループでDriverCheckerRunnableインスタンスから複数のスレッドを開始します。これらのインスタンスはデシジョン・ポイントを開き、各運転者に対してルールを実行します。このコードの詳細は、第7.3.4項「デシジョン・ポイント・インスタンスの作成および使用方法」を参照してください。

例7-4に、スレッドの完了を待機するコードを示します。

例7-4 スレッドの完了を待機するコード

try {
exec.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
exec.shutdown();
}

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

DriverCheckerRunnableインスタンスはcheckDriver()メソッドをコールします。例7-5に、CarRentalWithDecisionPointで定義されているcheckDriver()メソッドを示します。checkDriver()メソッドは、Driverインスタンスによるデシジョン・ポイントの起動を処理します。

例7-5 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();
}
}

}

例7-5は、次のことを示しています。

- 次のコードにより、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());
}
}

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

システムにインストールされているレンタカー・サンプルで、例7-2に示すコードのDICT_LOCATIONの値をシステムのディクショナリの場所にあわせて変更します。

システムでレンタカー・サンプルを実行する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「編集」メニューから「パスのコピー」を選択します。

2. CarRental.javaファイルで、パスの値をDICT_LOCATIONの値に貼り付けます。

3. CarRentalProjectで、CarRentalWithDecisionPointUsingPreloadedDictionary.javaファイルを選択します。

4. 右クリックしてリストから「実行」を選択します。

例7-6にサンプル出力を示します。

例7-6 レンタカー・サンプルの出力

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

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

本番環境では、MDSリポジトリを使用してOracle Business Rulesのディクショナリを格納できます。MDSリポジトリを使用してディクショナリを格納する場合は、第7.3.1項「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」と第7.3.2項「事前ロード済のディクショナリでデシジョン・ポイントを使用する方法」で示したステップが、ディクショナリにアクセスするように変わります。CarRentalWithDecisionPointUsingMdsRepositoryに、MDSでデシジョン・ポイントを使用するためのサンプル・コードを示します。

デシジョン・ポイントを使用してMDSのディクショナリにアクセスする方法を示すデプロイメント・ステップの完全なサンプルは、第9.4項「Rules SDKコールを含む等級アプリケーションのサーブレットの追加」を参照してください。

例7-7に、DecisionPointBuilderでDictionaryFQNを使用してMDSリポジトリのディクショナリにアクセスする方法を示します。完全なサンプルは、CarRentalWithDecisionPointUsingMdsRepositoryのサンプル・コードにあります。

例7-7 MDSリポジトリでのデシジョン・ポイント・ビルダーの使用

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());

例7-1のステップと同様に、例7-7は次のことを示しています。

1. 最初のステップで、次のコードによりDecisionPointBuilderインスタンスを作成します。

new DecisionPointBuilder()

2. String引数を使用するwith()メソッドで、デシジョン・ポイントによって実行されるデシジョン関数の名前を定義します。このメソッドのコールは必須です。

.with(DF_NAME)

DF_NAMEには、アプリケーションで定義したデシジョン関数の名前を指定します。たとえば、レンタカー・サンプル・アプリケーションでは、これはCarRental.javaでCarRentalDecisionFunctionと定義されています。

3. これ以外の2つのwith()メソッドのうち、いずれか1つのみをコールします。このサンプル・コードでは、DictionaryFQNをコールしてMDSリポジトリにアクセスします。例7-8に、ディクショナリ・パッケージとディクショナリ名を使用してDictionaryFQNを作成するルーティングを示します。

.with(DICT_FQN)

4. DecisionPointインスタンスを作成して戻すために、build()メソッドをコールします。

例7-8 MDSリポジトリでのDictionaryFQNメソッドの使用

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";

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

Rules SDK APIには、デシジョン・トレース処理に役立つメソッドが含まれています。これらのメソッドは、トレース内で使用されているRL名を、関連するディクショナリで使用されている別名に置き換えるよう、デシジョン・トレースを処理します。これにより、デシジョン・トレースのネーミングとOracle Business Rulesディクショナリで使用されているネーミングとの一貫性が保たれます。

デシジョン・トレースを処理するための基本APIには、RuleDictionaryオブジェクトとDecisionTraceオブジェクトが必要です。

RuleDictionary dict = ...;
DecisionTrace trace = ...;
dict.processDecisionTrace(trace);

このコードは、別名によってディクショナリ内と同じ名前を使用するように、デシジョン・トレース内のネーミングを変換する処理コールを示しています。

Rules SDKデシジョン・ポイントAPIには、デシジョン・トレースを構成し、デシジョン・ポイントの起動時に結果のトレースを取得できるようにするメソッドが含まれています。デシジョン・ポイントから取得するトレースは、processDecisionTrace()メソッドを使用して内部処理されるので、デシジョン・ポイントからのデシジョン・トレースを使用する際、デシジョン・トレースを処理するためにこのメソッドをコールする必要はありません。

表7-2に、デシジョン・トレース・オプションを設定するためのデシジョン・ポイントAPIメソッドを示します。これらのメソッドの詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。

表7-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

デシジョン・トレースの制限、またはトレースのために取得されるトレース要素の最大数を設定します。

例7-9に、デシジョン・ポイントAPIによるデシジョン・トレースの使用例を示します。

例7-9 デシジョン・ポイント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(); // with aliases replaced

デシジョン・トレースの詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』のFusion Middleware Controlコンソールでのルール実行のトレースに関する項を参照してください。

8 ビジネス・ルールのテスト

この章では、Oracle Business Rulesで提供されるルール・テスト・フレームワークを使用して、Oracle JDeveloperのルール・デザイナのルールをテストする方法について説明します。また、Oracle Business Rules関数の作成により、ルールおよびデシジョン表をテストする方法についても説明します。さらに、デシジョン・サービスを介してOracle Business Rulesを使用するSOAアプリケーションの、Oracle Enterprise Manager Fusion Middleware Controlコンソールを使用した実行時のテスト方法についても説明します。

この章の項目は、次のとおりです。

- 第8.1項「デザインタイムでのOracle Business Rulesのテスト」

- 第8.2項「実行時のOracle Business Rulesのテスト」

8.1 デザインタイムでのOracle Business Rulesのテスト

Oracle Business Rulesには、複雑な入力パラメータを使用したルールのテストが可能な、テスト・フレームワークが用意されています。このフレームワークにより、設計時にルールをテストすることが可能になり、用件に応じたルールの検証または改良ができます。

ルールをテストする別の方法はテスト関数を定義することで、これにより入力の作成、ルールの実行、出力の検証ができます。入力の作成や出力の検証がプログラムで行われるため、テスト関数は通常、単純テストで使用され、テスト・フレームワークは総合的なテストで使用されます。また、このテスト関数は、パラメータを使用せずにブール値のみを戻す関数に対してのみアクティブです。

8.1.1 ルール・テスト・フレームワークを使用してルールをテストする方法

Oracle Business Rulesには、デフォルトの機能が用意されており、特定の一連の入力を行って、定義したルールが正常に動作するかどうかを設計時にテストできます。提供されているテストの粒度は、デシジョン関数レベルです。デシジョン関数をディクショナリに定義する場合、テスト・スイートを定義して、各デシジョン関数に対してそのテスト・スイートを実行できます。

Oracle Business Rulesでは、Javaファクト、XMLファクト、RLファクトおよびADF-BCファクトといった複数タイプのファクトがサポートされています。現在、テスト・フレームワークでは、XMLファクトのみがサポートされています。そのため、定義したデシジョン関数に、XML以外のファクトを参照する入力または出力が存在する場合、そのデシジョン関数をテストするためにテスト・フレームワークを使用することはできません。XML以外のファクトを使用すると、そのデシジョン関数に対してテスト機能が使用できないことを示す、警告メッセージまたはエラー・メッセージが表示されます。

ルールをテストするには、デシジョン関数を前提条件として作成する必要があります。

8.1.1.1 デシジョン関数の作成

1. Oracle JDeveloperを開きます。

2. アプリケーション・ナビゲータで、テスト対象のルールが存在するディクショナリを含むプロジェクト・ファイル、たとえば「Business Rules」の下の「BaseDictionary.rules」を開きます。

3. 「ディクショナリ」セクションで、「デシジョン関数」をクリックしてデシジョン関数のリストを開きます。

4. 「デシジョン関数」セクションで、「作成」アイコン(プラス記号)をクリックして「デシジョン関数の編集」ダイアログ・ボックスを表示します。

5. 「名前」フィールドに、TestDF.などのデシジョン関数の名前を入力します。

6. 「入力」タブの「名前」の下に、入力名を入力して[Enter]を押します。この例では、songsと入力します。

7. 「ファクト・タイプ」リストからファクト・タイプを選択します。必ずXMLファクトを選択してください。この例では、ファクト・タイプとして「Song」を選択します。同様に、artistsという名前の別の入力変数とArtistというファクト・タイプが追加されています。

8. 必要に応じて、「ツリー」または「リスト」を選択します。ツリー・モードまたはリスト・モードのルールの詳細は、第6.2.1項「デシジョン関数の追加または編集方法」を参照してください。

9. 「出力」タブの「名前」の下に、出力名を入力して[Enter]を押します。この例では、songsと入力します。

10. 「ファクト・タイプ」リストからファクト・タイプを選択します。必ずXMLファクトを選択してください。この例では、「Song」を選択します。

11. 「ルールセットおよびデシジョン関数」で、「使用可能」ボックスから起動するルールセットを選択し、シャトル(>)アイコンを使用して、「選択済」ボックスに移動します。この例では、「SongArtistRules」が選択済になっています。

注意:

この例では、サンプル・スキーマと対応するファクトを使用します。

12. 「OK」をクリックして、デシジョン関数を作成します。図8-1に、「デシジョン関数の編集」ダイアログ・ボックスを示します。

図8-1 「デシジョン関数の編集」ダイアログ

デシジョン関数を作成すると、デシジョン関数のテストに役立つ、2つのXMLスキーマ(xsdファイル)が自動的に生成されます。これらのスキーマには、それぞれ_TestSuite、_Typesという接尾辞が付けられています。さらに、これらのスキーマは図8-2に示すように、アプリケーション・ナビゲータに表示されている「testsuites」フォルダの下の「xsd」フォルダに格納されています。

_TestSuiteという接尾辞の付いたスキーマに基づき、デシジョン関数用に作成されるテスト・スイートを定義する必要があります。

図8-2 XSDを表示しているアプリケーション・ナビゲータ

生成されたスキーマ・ファイルは、次の命名規則に従います。

- <ディクショナリ名>_<デシジョン関数名>_TestSuite.xsd: このファイルには、デシジョン関数用のテスト・スイート・スキーマが含まれます。このデシジョン関数用に作成されたテスト・スイートは、このスキーマに準拠する必要があります。次に、TestSuite.xsdファイルのサンプルを示します。

<?xml version = '1.0' encoding = 'UTF-8'?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://xmlns.oracle.com/rules/test"
targetNamespace="http://xmlns.oracle.com/rules/test"
elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:df="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF">
<annotation>
<documentation>
Decision Function Test Suite Schema
</documentation>
</annotation>
<import namespace="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF"
schemaLocation="BaseDictionary_BaseDF_Types.xsd"/>
<element name="testSuite">
<complexType>
<sequence>
<element name="decisionFunction" type="string" minOccurs="1"
maxOccurs="1"/>
<element name="testCase" type="tns:testCaseType" minOccurs="1"
maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>

<complexType name="testCaseType">
<sequence>
<element name="testInput" type="df:parameterList" minOccurs="0"
maxOccurs="1"/>
<element name="expectedOutput" type="df:resultList" minOccurs="0"
maxOccurs="1"/>
</sequence>
<attribute name="name" type="string" use="required"/>
</complexType>
</schema>

前述のサンプルで示したように、スキーマにはマスターのtestSuite要素が含まれており、さらにその下にdecisionFunctionという要素が含まれ、ここにこのテスト・スイートが対応するデシジョン関数が定義されます。testSuite要素にはまた、1つ以上のtestCase要素も含まれます。各testCaseには、testInput要素およびexpectedOutput要素と名前が含まれます。testInput値は、テスト・ケースへの入力として使用される値で、expectedOutput値は、それと実際の出力が照合される値です。testInputおよびexpectedOutputのタイプ(それぞれparameterListおよびresultList)は、この次のXSDに定義されています。

- <ディクショナリ名>_<デシジョン関数名>_Types.xsd: このスキーマには、parameterListとresultListの、2つのcomplexType要素が含まれます。これら2つのタイプはTestSuiteスキーマで使用されますが、ここに定義されています。parameterListタイプはデシジョン関数の入力に対応し、resultListタイプはデシジョン関数の出力に対応します。これは、デシジョン関数には固有の入力および出力があるからです。デシジョン関数用にテスト・ケースを記述する場合、テスト・ケースの入力はデシジョン関数により受け取られる入力に対応する必要があり、予期される出力がデシジョン関数の出力に対応する必要があります。paramaterListとresultListは別々のcomplexTypeです。たとえば、デシジョン関数が10個の入力と5個の出力を必要とする場合、parameterListタイプはデシジョン関数の入力として用意する必要がある10の異なる要素を一括して定義する、1つのComplexTypeになります。
次に、Types.xsdのサンプルを示します。

<?xml version = '1.0' encoding = 'UTF-8'?>

<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF"
attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:tns="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:rules="http://xmlns.oracle.com/bpel/rules"
xmlns:ns1="http://xmlns.oracle.com/rulestest/datamodel">
<import namespace="http://xmlns.oracle.com/rulestest/datamodel"
schemaLocation="../../xsd/XMLFactTypes2.xsd"/>
<import namespace="http://xmlns.oracle.com/bpel/rules"
schemaLocation="DecisionFunctionPrimitiveTypes.xsd"/>
<complexType name="parameterList">
<sequence>
<element name="tSongElement" type="ns1:tSong"/>
<element ref="ns1:Artist"/>
</sequence>
</complexType>
<complexType name="resultList">
<sequence>
<element name="tSongElement" type="ns1:tSong"/>
</sequence>
</complexType>
</schema>

デシジョン関数の更新があるたびに、対応する2つのスキーマも更新されます。たとえば、デシジョン関数の名前を変更すると、関連するスキーマの名前が変更されます。デシジョン関数を削除すると、対応するスキーマも削除されます。デシジョン関数の入力および出力への変更であっても、関連するスキーマに変更が生じます。このように、デシジョン関数とそれに対応するテスト・スキーマは常に同期されます。

デシジョン関数に何か変更を加えた場合、たとえばデシジョン関数を削除した場合は、通常、スキーマも削除されます。ディクショナリのツールバーにある「元に戻す」アイコンをクリックすると、デシジョン関数が回復されます。ただし、対応するスキーマは削除されたままです。その場合は、デシジョン関数用のスキーマを手動で再生成する必要があります。このように、元に戻す操作とやり直し操作では、デシジョン関数とそれに対応するテスト・スキーマ間の同期は、サポートされていません。

次のように手動でスキーマを再生成します。

図8-3に示すように、ディクショナリのツールバーにある「すべてのデシジョン関数のテスト・スイート・スキーマを生成」アイコンをクリックします。

図8-3 テスト・スイート・スキーマの手動での再生成

テスト・スイート・スキーマを再生成するためアイコンをクリックすると、一括で再生成アクティビティが行われ、ディクショナリに存在するすべての利用可能なデシジョン関数に関連するすべてのテスト・スイート・スキーマが再生成されます。スキーマがすでに存在している場合は、上書きされます。

このアクティビティは、特に次のような場合に使用されます。

- デシジョン関数を削除または変更してから変更を取り消した場合: これにより、デシジョン関数と関連するスキーマは同期しなくなります。これらを同期させるには、このオプションを使用してスキーマを再生成し、デシジョン関数に対応するようにします。

- 古いディクショナリを移行した場合: 多数のデシジョン関数が定義された、以前のリリースのディクショナリをすでに持っており、これらのデシジョン関数用のテスト・スイートを定義する機能をテストするルールを使用してテストする状況を考えてみます。この場合は、移行後にエディタ・ウィンドウで各デシジョン関数を開いてから、「OK」ボタンをクリックする必要があります。これにより、対応するテスト・スイート・スキーマが生成されます。しかし、これではデシジョン関数が数百個存在する場合、時間が掛かり過ぎます。この場合、スキーマを再生成するオプションを使用すれば一括で生成が可能です。

注意:

移行したデシジョン関数の入力および出力としてXMLファクトを必ず含むようにしてください。そうしないと、テスト・スイート・スキーマ・ファイルに定義される入力および出力が空になります。

8.1.1.2 ルールのテスト

ルールをテストするためのデシジョン関数を一度作成すると、ルールをテストできます。

ルールをテストする手順は、次のとおりです。

1. デシジョン関数名を選択します。この場合は、たとえば「TestDF」を「ディクショナリ」ページで選択してから「テスト」ボタンをクリックし、「デシジョン関数テスト」ダイアログ・ボックスを表示します。

2. 「作成」アイコン(プラス記号)をクリックして「テスト・スイートの作成」ダイアログ・ボックスを表示します。

3. 図8-4に示すように、テスト・スイートの名前、たとえばTestDFTestSuite1を入力し、「OK」をクリックします。

図8-4 テスト・スイートの作成

4. 「デシジョン関数テスト」ダイアログ・ボックスの「閉じる」をクリックします。
テスト・スイートを作成すると、<テスト・スイート名>.xmlファイルが自動的に生成され、「testsuites」フォルダ内の「rules」フォルダの下の「<ベース・ディクショナリ名>」フォルダに格納されます。このファイルは、「アプリケーション・ナビゲータ」ウィンドウで表示できます。テスト・スイートを作成するたびに、対応するXMLファイルが生成されます。

ただし、新規に作成されたテスト・スイート・ファイルは空で、テスト・ケース、入力定義または出力定義はまったく含まれていません。

5. <テスト・スイート名>.XMLを開き、テスト・スイートのXSDファイル(この場合、「test」の下のデシジョン関数に対応するTestDF XSD)に準拠した、必要なテスト・ケースを記述します。
次に、テスト・ケースを含むテスト・スイート・ファイルのサンプルを示します。

<?xml version = '1.0' encoding = 'UTF-8'?>
<testSuite xmlns="http://xmlns.oracle.com/rules/test"
xmlns:ns1="http://xmlns.oracle.com/bpel/rules"
xmlns:ns2="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF"
xmlns:ns3="http://xmlns.oracle.com/rulestest/datamodel">
<decisionFunction>G}-733d3b8f:12f76ddad3a:-7c02</decisionFunction>
<testCase name="TestDFTestSuite1_TestCase1">
<testInput>
<ns2:tSongElement>
<ns3:Title>Come What May</ns3:Title>
<ns3:Composer>Artist</ns3:Composer>
<ns3:Length>PT3M2S</ns3:Length>
<ns3:Year>2010</ns3:Year>
<ns3:Artist>
<ns3:name>MJ</ns3:name>
<ns3:age>20</ns3:age>
<ns3:recordLabel>BMG Music</ns3:recordLabel>
</ns3:Artist>
</ns2:tSongElement>
<ns3:Artist>
<ns3:name>MJ</ns3:name>
<ns3:age>20</ns3:age>
<ns3:recordLabel>BMG Music</ns3:recordLabel>
</ns3:Artist>
</testInput>
<expectedOutput>
<ns2:tSongElement>
<ns3:Title>Come What May</ns3:Title>
<ns3:Composer>MJ</ns3:Composer>
<ns3:Publisher>BMG Music</ns3:Publisher>
<ns3:Length>PT3M2S</ns3:Length>
<ns3:Year>2010</ns3:Year>
<ns3:Artist>
<ns3:name>MJ</ns3:name>
<ns3:age>20</ns3:age>
<ns3:recordLabel>BMG Music</ns3:recordLabel>
</ns3:Artist>
</ns2:tSongElement>
</expectedOutput>
</testCase>
</testSuite>

6. テスト・スイート・ファイルを保存します。

7. 「ディクショナリ」ページを開きます。デシジョン関数名(たとえば「TestDF」)を選択してから、「テスト」ボタンをクリックし、「デシジョン関数テスト」ダイアログ・ボックスを表示します。

8. 図8-5に示すように、「テスト・スイート」リストから「TestDFTestSuite1」を選択し、「テストの実行」をクリックします。

図8-5 テストの実行

テスト・スイート・ファイル内のすべてのテスト・ケースが実行されます。

デシジョン関数のテストの詳細は、表形式で確認できます。

詳細には、テスト・スイート名、全部の結果、および次のようなテスト・ケースの詳細が含まれます。

- テスト・ケース名

- テスト・ケースの結果

- アサートされたファクト、アクティブ化されたルール、起動されたルールおよび結果として生じたファクトの変更などのトレース情報

図8-6に、テスト結果を示します。

図8-6 「結果」ページ

「結果」ページの「コメント」セクションには、テスト・ケースが失敗した場合、すべてのエラーの詳細を表示します。

8.1.2 テスト・スイートの検証に関する必知事項

テスト・スイートXMLファイルが、テスト・スイートXSDファイルに準拠していないという問題が発生することがあります。この場合、「デシジョン関数テスト」ウィンドウを開くと、「テスト・スイート」リスト内のテスト・スイート名のすぐ横に、図8-7に示すように黄色い警告の三角形が表示されます。

図8-7 無効なテスト・スイート

誤りを含むテスト・スイートを実行しようとすると、次のエラー・メッセージが表示されます。

テスト・スイートXMLファイルが不完全な形式の場合、「デシジョン関数テスト」ウィンドウのテスト・スイートのリストに、テスト・スイート名は表示されません。また、無効なディクショナリでは、デシジョン関数をテストすると次のエラー・メッセージが表示されます。

ディクショナリが無効です。検証エラーを修正して再試行してください。

8.1.3 リンク先ディクショナリのテストに関する必知事項

ベース・ディクショナリとカスタム・ディクショナリが存在する状況を考えてみます。カスタム・ディクショナリには、ベース・ディクショナリへのリンクが含まれています。

ここで、カスタム・ディクショナリの「デシジョン関数」セクションにナビゲートします。カスタム・ディクショナリのデシジョン関数のリストには、リンク先のベース・ディクショナリのデシジョン関数が含まれることに注意してください。ベース・ディクショナリのデシジョン関数は、カスタム・ディクショナリからテストできます。

8.1.4 テスト・スイートの失敗に関する必知事項

テスト・ケースが失敗した場合、「結果」ページの「コメント」セクションには、考えられる失敗の理由が表示されます。

テスト・ケースは次の理由により、失敗する場合があります。

- 次のように、テスト・ケース用に指定した予期される出力が、実際の出力と異なっている。

「コメント」セクションは、予期される出力と実際の出力の間に明らかな不一致があることを示しています。

- 次のように、テスト・ケースは実行されたが、出力が生成されなかった。

「コメント」セクションには、テストが結果を生成しなかったことと、考えられる原因についてのより詳細な情報が表示されています。

- 次のように、テスト・ケースは実行されたが、複数の出力が生成された。

「コメント」セクションには、テストの実行について複数の出力が生成されたことが、考えられる原因についての詳細な情報とともに表示されています。

- 次のように、テスト・ケースによるルールの起動がまったく行われない。

これは、アサートされたファクトがルールのアクティブ化に失敗し、結果としてルールが起動されなかったことが原因である可能性があります。そのため、「コメント」セクションには、これはルール・モデリング・エラーによる可能性があると表示されています。おそらく、用意された入力がすべてのルール条件との一致に失敗したためです。

8.1.5 Oracle Business Rules関数によるデシジョン関数のテスト方法

デシジョン関数を作成し、そのデシジョン関数をOracle Business Rules関数を使用してルール・デザイナからコールすることで、ルールセットをテストできます。Oracle Business Rules関数本体で、入力ファクトを作成し、デシジョン関数をコールし、デシジョン関数からのファクト出力を検証します。詳細は、第6.1項「デシジョン関数の概要」および第2.5項「Oracle Business Rules関数の使用」を参照してください。

Oracle Business Rules関数を使用してデシジョン関数をテストする手順は、次のとおりです。

1. ディクショナリが有効であることを確認します。
ディクショナリ検証の詳細は、第4.4.4項「ディクショナリの検証方法」を参照してください。

2. Rules Designerで、「関数」ナビゲーション・タブを選択します。

3. 「関数」領域で「作成」アイコンをクリックします。

4. 「名前」フィールドに関数名を入力するか、デフォルト名を使用します。

5. 「戻り型」のリストから戻り型を選択します。
テスト関数の場合は、「boolean」を選択します。

6. 「引数」表で、引数がないことを確認します。テスト関数の場合、引数は指定できません。

7. 「本体」領域に、テスト関数本体を入力します。
テスト関数本体で、assign newを使用してデシジョン関数をコールし、そのデシジョン関数をコールして戻り値を取得できます(テスト関数本体では、入力ファクトを作成し、デシジョン関数をコールし、デシジョン関数からのファクト出力を検証します)。

デシジョン関数のコールによって、Listが戻されます。つまり、テスト関数でデシジョン関数をテストする手順は、次のとおりです。

- 必要に応じて、デシジョン関数の入力引数用の入力データを作成します。

- テスト関数で作成した引数を使用してデシジョン関数をコールします。

- 結果をList形式にします。たとえば、次のようになります。

assign new List resultsList = DecisionFunction_1(testScore)

図8-8に、デシジョン関数をコールするテスト関数を示します。

図8-8 Listを戻すデシジョン関数をコールするテスト関数

8. 関数を選択し、「テスト関数」アイコンをクリックします。
関数が実行されます。図8-9に示すように、出力が「関数テスト結果」ダイアログに表示されます。

図8-9 Gradeテストのテスト関数の結果

9. 「OK」をクリックして「関数テスト結果」ダイアログを閉じます。

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

ルール・デザイナ内でOracle Business Rules関数を使用してデシジョン関数をテストできます。テスト関数を使用する際の注意事項は、次のとおりです。

- テストOracle Business Rules関数に関連付けられているディクショナリに検証警告が含まれている場合は、「テスト関数」アイコンがグレー表示されます。「テスト関数」アイコンが表示されるのは、ディクショナリが警告なしに検証された場合のみです。

- ロギングを有効化するために、RL.watch.all()をコールできます。RL Language関数の詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。このマニュアルでは、RL.watch.all()はRL Language関数watchAll()の別名です。

- 図8-8に示した例のかわりに、例8-1に示されている関数本体を入力することもできます。この関数はRL.watch.all()を実行し、その出力を表示します。図8-10に示すように、gradeがBの範囲内の場合、ダイアログに"Test Passed"と表示されます。図8-11に示すように、アサートされたgradeがBの範囲外の場合、ダイアログに"Test Failed"と表示されます。

例8-1 trueまたはfalseの戻り値を使用する関数本体

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に対し、この関数は図8-10に示すように、"Test Passed"を戻します。testScoreの値91に対し、この関数は図8-11に示すように、"Test Failed"を戻します。

図8-10 テストに合格したテスト関数の出力

図8-11 テストに失敗したテスト関数の出力

8.2 実行時のOracle Business Rulesのテスト

デシジョン・サービスでOracle Business Rulesを使用するSOAアプリケーションでは、Oracle Enterprise Manager Fusion Middleware Controlコンソールのテスト関数を使用して、実行時にルールのテストを行うことが可能です。

テスト関数の使用の詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』を参照してください。

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

この章では、Oracle JDeveloperを使用して、Oracle Business Rulesでルール対応の非SOA Java EEアプリケーションを作成する方法について説明します。また、Oracle Business Rules (SOAコンポジットなしのOracle Business Rulesの使用について説明)を使用してJava Enterprise Edition (EE)アプリケーションとして動作するサンプル・アプリケーションJava Servletについて説明します。

この章の項目は、次のとおりです。

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

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

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

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

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

- 第9.6項「デプロイのための等級サンプル・アプリケーションの準備」

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

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を使用するサーブレットの作成。

- 入力であるテスト・スコアを提供して、データを等級サーブレットに送信するためのテスト・ページの作成。

- アプリケーションのデプロイと実行、テスト値の送信および出力の表示。

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に示すようにアプリケーションのオプションを入力します。

1. 「アプリケーション・テンプレート」領域で「Fusion Web Application」を選択します。

2. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、GradeAppと入力します。

3. 「ディレクトリ」フィールドで、ディレクトリ名を指定するか、またはデフォルトを使用します。

4. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞を入力します。たとえば、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に示すように値を入力します。

1. 「プロジェクト名」フィールドに名前を入力します。たとえば、Gradesと入力します。

2. ディレクトリ名を入力または参照するか、デフォルトを使用します。

3. 「プロジェクト・テクノロジ」タブを選択します。

4. 「使用可能」領域で「ADFビジネス・コンポーネント」をダブルクリックして、この項目を「選択済」領域に移動します。これにより、図9-3に示すようにJavaも「選択済」領域に追加されます。

図9-3 等級アプリケーションへの汎用プロジェクトの追加

5. 「終了」をクリックします。これにより、Gradesプロジェクトが追加されます。

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

等級サンプル・アプリケーションを作成するには、例9-1に示すようにgrades.xsdファイルを使用する必要があります。スキーマ・ファイルをローカルで作成し保存してから、Oracle JDeveloperを使用してファイルをプロジェクトにコピーできます。

例9-1 grades.xsdスキーマ

<?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. 例9-1に示すスキーマ・ファイルを、grades.xsdというローカル・ファイルとして保存します。

2. 「アプリケーション・ナビゲータ」で、「Grades」プロジェクトを選択します。

3. 右クリックしてコンテキスト・メニューから「新規」を選択します。

4. 「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。

5. 「カテゴリ」領域で、「一般」を開いて「XML」を選択します。

6. 「項目」領域で「XMLスキーマ」を選択します。

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

8. 「XMLスキーマの作成」ダイアログで、「ファイル名」フィールドにgrades.xsdと入力します。

9. 「XMLスキーマの作成」ダイアログの「ディレクトリ」フィールドで、図9-4に示すようにxsdディレクトリをGradesプロジェクトのパス名に追加します。

図9-4 xsdディレクトリのGradesプロジェクトへのスキーマの追加

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

11. grades.xsdファイルで、「ソース」タブをクリックします。

12. 図9-5に示すように、例9-1に示すスキーマをGradesプロジェクトのgrades.xsdにコピーします。

図9-5 Gradesプロジェクトのgrades.xsdスキーマ・ファイル

等級スキーマから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. 「新規ギャラリ」の「カテゴリ」領域で、「ビジネス層」を開いて「ビジネス・ルール」を選択します。

5. 「新規ギャラリ」の「項目」領域で、「ビジネス・ルール」を選択します。

6. 「OK」をクリックします。図9-6に示すように、Oracle JDeveloperで「ビジネス・ルールの作成」ダイアログが表示されます。

図9-6 「ビジネス・ルールの作成」ダイアログでのGradesへのビジネス・ルールの追加

7. 「名前」フィールドに、ディクショナリを指定する名前を入力します。たとえば、GradingRulesと入力します。

8. 入力を追加するには、「追加」アイコンの横にあるリストから「入力」を選択します。

9. 「タイプ・チューザ」で「プロジェクトのスキーマ・ファイル」フォルダを開き、grades.xsdを開きます。

10. 図9-7に示すように、入力「TestScore」を選択します。

図9-7 TestScore要素を使用した「タイプ・チューザ」ダイアログ

11. 「タイプ・チューザ」ウィンドウで「OK」をクリックします。「ビジネス・ルールの作成」ダイアログが表示されます。

12. 「ビジネス・ルールの作成」ダイアログで、入力と同様の手順で出力を追加するには、「出力」を選択して、grades.xsdスキーマから要素TestGradeを追加します。
その結果、図9-8に示すような「ビジネス・ルールの作成」ダイアログが表示されます。

図9-8 gradesの入力と出力が表示されている「ビジネス・ルールの作成」ダイアログ

13. 「OK」をクリックします。図9-9に示すように、Oracle JDeveloperでGradingRulesディクショナリが作成されます。

14. 「ファイル」メニューで「すべて保存」を選択し、作業内容を保存します。

図9-9 新しい等級ルール・ディクショナリ

新しいディクショナリのビジネス・ルール検証ログ領域に、検証警告がいくつか表示されることに注意してください。これらの検証警告メッセージは、後のステップでディクショナリを変更すると削除されます。

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

等級サンプル・アプリケーション用にデータ・モデルとビジネス・ルールを作成する手順は、次のとおりです。

- 等級用のバケット・セットの作成

- 等級用デシジョン表の追加によるルールの作成

- デシジョン表の分割およびルールに対するアクションの追加

- デフォルトのデシジョン関数名の変更

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

この例では、バケット・セットをファクト・タイプに関連付けます。これは、(デシジョン表の条件について)デシジョン表の各セルについて値の描画方法を指定するバケット・セットを定義する必要があるデシジョン表の使用をサポートしています。

等級サンプル・アプリケーション用のバケット・セットを作成する手順は、次のとおりです。

1. Rules Designerで、「バケットセット」ナビゲーション・タブを選択します。

2. 「バケットセットの作成」アイコンの横にあるリストから、「範囲リスト」を選択します。

3. バケット・セットについて、「名前」フィールドをダブルクリックしてデフォルト名を選択します。

4. Grade Scaleと入力し、[Enter]を押してバケット・セット名を受け入れます。

5. 「バケットセット」表でGrade Scaleバケット・セットのバケット・アイコンをダブルクリックすると、図9-10に示すような「バケットセットの編集」ダイアログが表示されます。

図9-10 Grade Scaleバケット・セット

6. 「バケットセットの編集」ダイアログで、 「バケットの追加」をクリックしてバケットを追加します。

7. 「バケットの追加」を3回クリックし、さらに3つのバケットを追加します。

8. 最上位エンドポイントについて「エンドポイント」フィールドに90と入力し、[Enter]を押して新しい値を受け入れます。

9. 次のバケットについて「エンドポイント」フィールドに80と入力し、[Enter]を押して新しい値を受け入れます。

10. 同様に、次の2つのバケットについて「エンドポイント」フィールドに値70および60を入力します。

11. バケットごとに、「含まれるエンドポイント」フィールドのチェック・ボックスをそれぞれ選択します。

12. 図9-11に示すように、対応する各範囲について、各値の「エイリアス」フィールドに値A、B、C、DおよびFをそれぞれ入力して変更します(各別名を追加するたびに[Enter]を押します)。

図9-11 等級値が追加されたGrade Scaleバケット・セット

バケット・セットをファクト・プロパティに関連付ける手順は、次のとおりです。

デシジョン表を作成する準備のため、グローバル・バケット・セットをデータ・モデル内のファクト・プロパティに関連付けることができます。これにより、デシジョン表の作成時に、デシジョン表の「条件」領域にある条件セルでバケット・セットを使用できるようになります。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「ファクト」ナビゲーション・タブで、「XMLファクト」タブを選択します。

3. TestScoreファクトの「XMLファクト」アイコンをダブルクリックします。「XMLファクトの編集 -」ダイアログが表示されます。

4. 「XMLファクトの編集 -」ダイアログで「testScore」プロパティを選択します。

5. 「バケットセット」フィールドで、リストから「Grade Scale」を選択します。

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

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

デシジョン表で、入力ファクトを処理して出力ファクトを生成するか、暫定的な結論を生成するため、ルールを作成します。暫定的な結論は、Oracle Business Rulesにより他のルールを使用するか別のデシジョン表内でさらに処理できます。

このアプリケーションでルールにデシジョン表を使用するには、テスト・スコアを表すファクトで作業します。次に、デシジョン表を使用して、テスト・スコアに基づいて等級を生成するルールを作成します。

等級アプリケーション用のデシジョン表を追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセット」ナビゲーション・タブから「Ruleset_1」を選択します。

2. Ruleset_1で、「追加」アイコンをクリックし、リストから「デシジョン表の作成」を選択します。これにより、DecisionTable_1が作成されます。「ビジネス・ルール検証」ログ領域に表示される警告メッセージは無視できます。これらの警告メッセージは、後のステップで削除します。

3. デシジョン表DecisionTable_1で、「追加」アイコンをクリックし、リストから「条件」を選択します。

4. デシジョン表で、「<条件の編集>」をダブルクリックします。次に、変数ナビゲータで、「TestScore」を開いて「testScore」を選択します。これにより、条件C1の式TestScore.testScoreが入力されます。

ルール検証ログを表示すると、警告メッセージが表示されます。これらの警告メッセージは、後のステップでデシジョン表を変更すると削除されます。

デシジョン表にアクションを追加する手順は、次のとおりです。

新しいGradeファクトをアサートするため、デシジョン表にアクションを追加します。

1. デシジョン表で、「追加」アイコンをクリックしてリストから「アクション」を選択し、「Assert New」を選択します。

2. 「アクション」領域で「assert new」をダブルクリックします。
これにより、「アクション・エディタ」ダイアログが表示されます。

3. 「アクション・エディタ」ダイアログの「ファクト」領域で「TestGrade」を選択します。

4. 「アクション・エディタ」ダイアログで、プロパティgradeの「プロパティ」表で「パラメータ化」チェック・ボックスおよび「定数」チェック・ボックスを選択します。
これにより、各ルールで等級を個別に設定するよう指定したことになります。

5. 「アクション・エディタ」ダイアログで、「常に選択」チェック・ボックスを選択します。

6. 「アクション・エディタ」ダイアログで「OK」をクリックします。

7. 「ファイル」メイン・メニューから「すべて保存」を選択し、作業内容を保存します。

次に、デシジョン表にルールを追加し、ルールごとにアクションを指定します。

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

デシジョン表の分割操作を使用して、デシジョン表の条件行に関連付けられたバケット・セットに関するルールを作成できます。これにより、バケットごとに1つルールが作成されます。

デシジョン表を分割する手順は、次のとおりです。

1. デシジョン表を選択します。

2. 「表の分割」アイコンをクリックし、リストから「表の分割」を選択します。
分割操作により、考慮されないセルが表から消去されます。図9-12に示すように、これで表にはすべての範囲を対象とする5つのルールが表示されています。

これらのステップでは、欠落している式があるアクション・セルに関する検証警告が生成されます。これらの問題は、後のステップで各ルールに対するアクションを定義する際に修正します。

図9-12 表分割操作を使用した等級用デシジョン表の分割

デシジョン表内のルールごとにアクションを追加する手順は、次のとおりです。

デシジョン表の「アクション」領域で、各アクション・セルのTestGradeに関連付けられているgradeプロパティの結果の値を指定します。各gradeプロパティに可能な選択肢は、有効な等級です。このステップでは、各ルールについて値を入力します。入力した値は、デシジョン表の各ルールを構成する条件に対応します。

1. 図9-13に示すように、「アクション」領域でルール「R1」のアクション・セルをダブルクリックします。

図9-13 等級デシジョン表へのアクション・セル値の追加

2. リストで、アクション・セルに対応する値を選択します。たとえば、「Grade.F」を選択します。

3. 残りの各アクション・セルで、TestScoreのD、C、BおよびAに該当するバケットの値を選択します。

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

Rules SDKデシジョン・ポイントでデシジョン関数を使用するときに指定する名前は、ディクショナリ内のデシジョン関数の名前と一致する必要があります。名前を一致させるために、デシジョン関数を任意の名前に変更できます。この例では、デフォルトのデシジョン関数をGradesDecisionFunctionという名前に変更します。

デシジョン関数の名前を変更する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」のGradesプロジェクトで、「リソース」フォルダを開き、ディクショナリGradingRules.rulesをダブルクリックします。

2. 「デシジョン関数」ナビゲーション・タブを選択します。

3. 図9-14に示すように、「デシジョン関数」表の「名前」フィールドでデシジョン関数名を編集し、値GradesDecisionFunctionを入力して[Enter]を押します。

図9-14ルール・デザイナでのデシジョン関数名の変更

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

等級サンプル・アプリケーションには、Rules Engineを使用するサーブレットが含まれています。

このサーブレットをOracle Business Rulesで追加するには、重要なRules SDKメソッドを理解する必要があります。したがって、ルール・デザイナで作成したOracle Business Rulesディクショナリを使用する手順は、次のとおりです。

- サーブレットのinitルーチンで1度実行する初期化ステップの作成

- Rules SDKデシジョン・ポイントAPIを使用したサーブレットのserviceルーチンの作成

- サーブレット・コードをプロジェクトに追加するステップの実行

Rules SDKデシジョン・ポイントAPIの詳細は、第7章「Rules SDKデシジョン・ポイントAPIの使用」を参照してください。

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

「HTTPサーブレット作成」ウィザードを使用して、Gradesプロジェクトにサーブレットを追加します。

Oracle JDeveloperでGradesプロジェクトにサーブレットを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「Grades」プロジェクトを選択します。

2. Gradesプロジェクトを右クリックし、コンテキスト・メニューから「新規」を選択します。

3. 「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。

4. 「新規ギャラリ」の「カテゴリ」領域で、「Web層」を開いて「サーブレット」を選択します。

5. 「新規ギャラリ」の「項目」領域で、「HTTPサーブレット」を選択します。

6. 「OK」をクリックします。
図9-15に示すように、Oracle JDeveloperで「HTTPサーブレット作成」ウィザードの「ようこそ」ページが表示されます。

図9-15 「HTTPサーブレット作成」ウィザード - 「ようこそ」

7. 「次へ」をクリックします。
図9-16に示すように、「Webアプリケーション」ページが表示されます。

図9-16 「HTTPサーブレット作成」ウィザード - 「Webアプリケーション」

8. サーブレット2.5\JSP 2.1 (Java EE 1.5)を選択して「次へ」をクリックします。
「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」ページが表示されます。

9. 図9-17に示すように、「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」ページで次のように値を入力します。

- クラス: GradesServlet

- パッケージ: com.example.grades

- 作成するコンテンツ・タイプ: HTML

- ヘッダー・コメントの生成: 選択解除

- メソッドの実装: 「service()」は選択、他のすべてのチェック・ボックスの選択は解除

図9-17 「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」

10. 「次へ」をクリックします。
図9-18に示すように、「HTTPサーブレット作成 - ステップ2/3: マッピング情報」ダイアログが表示されます。

図9-18 「HTTPサーブレット作成 - ステップ2 / 3: マッピング情報」

11. このダイアログを次のように構成します。

- 名前: GradesServlet

- URLパターン: /gradesservlet

12. 「終了」をクリックします。
JDeveloperによりプロジェクトに「Webコンテンツ」フォルダが追加され、GradesServlet.javaファイルが作成されて、図9-19に示すようにエディタでファイルが開かれます。

図9-19 生成されたGradesServlet.java

13. 例9-2に示すように、生成されたサーブレットをソースと置き換えます。

例9-2 等級アプリケーションのサーブレットを使用したビジネス・ルール

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>");
}
}

例9-2には、MDSリポジトリを使用してディクショナリにアクセスするOracle Business Rulesデシジョン・ポイントが含まれています。詳細は、第7.5項「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。

例9-2に示すサーブレットを追加する場合、次のことに注意してください。

- init()メソッドでは、Oracle Business Rules用にサーブレットでRules SDKデシジョン・ポイントAPIが使用されます。デシジョン・ポイントAPIを使用する方法の詳細は、第7章「Rules SDKデシジョン・ポイントAPIの使用」を参照してください。

- DecisionPointBuilder()では、次に示すように、デシジョン関数名を含む引数が必要であり、本番環境でMDSリポジトリ内のディクショナリにアクセスするためのディクショナリFQNが必要です。

m_decisionPoint = new DecisionPointBuilder()
.with(DF_NAME)
.with(DICT_FQN)

デシジョン・ポイントAPIを使用する方法の詳細は、第7章「Rules SDKデシジョン・ポイントAPIの使用」を参照してください。

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

等級サンプル・アプリケーションには、第9.4項「Rules SDKコールを含む等級アプリケーションのサーブレットの追加」で作成したサーブレットを起動するために使用するHTMLテスト・ページが含まれています。

9.5.1 GradesプロジェクトへのHTMLテスト・ページの追加方法

サーブレットにHTMLページを追加するには、「HTMLファイルの作成」ウィザードを使用します。

HTMLテスト・ページを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、Gradesプロジェクトの「Webコンテンツ」フォルダを選択します。

2. 「Webコンテンツ」フォルダのプロジェクトを右クリックし、コンテキスト・メニューから「新規」を選択します。

3. 「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。

4. 「新規ギャラリ」の「カテゴリ」領域で、「Web層」を開いて「HTML」を選択します。

5. 「新規ギャラリ」の「項目」領域で「HTMLページ」を選択します。

6. 「新規ギャラリ」で「OK」をクリックします。
Oracle JDeveloperで「HTMLファイルの作成」ダイアログが表示されます。

7. 図9-20に示すように、このダイアログを次のように構成します。

- ファイル名: index.html

- ディレクトリ: C:\JDeveloper\mywork\GradeApp\Grades\public_html

図9-20 「HTMLファイルの作成」ダイアログ

8. 「OK」をクリックします。
JDeveloperによりindex.htmlが「Webコンテンツ」フォルダに追加され、エディタが開きます。

9. index.htmlのエディタで、「ソース」タブをクリックします。

10. 例9-3のHTMLコードをコピーし、index.htmlファイルのコンテンツに貼り付けて置き換えます。
form要素では、action属性に図9-18で指定したURLパターンが使用されていることに注意してください。

例9-3 HTMLテスト・ページ

<!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>

11. 「ファイル」メイン・メニューから「すべて保存」を選択し、作業内容を保存します。

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

ビジネス・ルールは、Oracle JDeveloperでデプロイメント・プロファイルの作成対象となるアプリケーションの一部としてデプロイされます。アプリケーションのデプロイ先はOracle WebLogic Serverです。

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

JdeveloperをOracle WebLogic Serverとともに使用して、GradeAppサンプル・アプリケーションをデプロイします。

等級サンプル・アプリケーション用のWARファイルを作成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「Grades」プロジェクトを選択します。

2. Gradesプロジェクトを右クリックし、コンテキスト・メニューから「プロジェクト・プロパティ」を選択します。プロジェクトの「プロジェクト・プロパティ」ダイアログが表示されます。

3. 図9-21に示すように、「プロジェクト・プロパティ」ナビゲータで「デプロイ」項目を選択します。

図9-21 「プロジェクト・プロパティ」 - 「デプロイ」

4. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログが表示されます。

5. 「デプロイメント・プロファイルの作成」ダイアログの「アーカイブ・タイプ」で、リストから「WARファイル」を選択します。

6. 図9-22に示すように、「デプロイメント・プロファイルの作成」ダイアログの「名前」フィールドにgradesと入力します。「名前」の値には、例9-3でform要素のaction属性に指定したパッケージ値を使用することに注意してください。

図9-22 WARファイルの「デプロイメント・プロファイルの作成」ダイアログ

7. 「OK」をクリックします。
「WARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

8. 「WARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」を選択し、図9-23に示すように「一般」ページを構成します。

1. 「WARファイル」をC:\JDeveloper\mywork\GradeApp\Grades\deploy\grades.warに設定します。

2. 「Webアプリケーションのコンテキスト・ルート」領域で、「Java EE Webコンテキスト・ルートを指定」を選択します。

3. 「Java EE Webコンテキスト・ルートを指定」のテキスト入力領域に、gradesと入力します。

4. 「デプロイメント・クライアントの最大ヒープ・サイズ[単位:MB]」で、リストから「自動」を選択します。

図9-23 WARデプロイメント・プロファイルのプロパティの編集 - 一般

9. 「WARデプロイメント・プロファイルのプロパティの編集」ダイアログで「OK」をクリックします。
図9-24に示すように、JDeveloperによりgrades (WAR File)というデプロイメント・プロファイルが作成されます。

図9-24 「プロジェクト・プロパティ」 - 作成されたデプロイメント・プロファイル

10. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

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

Weblogicアプリケーション・ファイルにルール・ライブラリを追加する手順は、次のとおりです。

1. GradeAppアプリケーションで、「アプリケーション・ナビゲータ」で「アプリケーション・リソース」を開きます。

2. 「ディスクリプタ」および「META-INF」を順に開き、weblogic-application.xmlをダブルクリックして開きます。

3. oracle.rulesライブラリの参照をweblogic-application.xmlファイルに追加します。図9-25に示すように、次の行を追加します。

<library-ref>
<library-name>oracle.rules</library-name>
</library-ref>

図9-25 WebLogicディスクリプタへのOracle Rulesライブラリの参照の追加

4. weblogic-application.xmlファイルを保存します。

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

MDSデプロイメント・ファイルを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「GradeApp」アプリケーションを選択します。

2. GradeAppアプリケーションを右クリックし、コンテキスト・メニューから「アプリケーションのプロパティ」を選択します。
「アプリケーションのプロパティ」ダイアログが表示されます。

3. 図9-26に示すように、「アプリケーションのプロパティ」ナビゲータで「デプロイ」項目を選択します。

図9-26 「アプリケーションのプロパティ」 - 「デプロイ」

4. 「アプリケーションのプロパティ」ダイアログで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログが表示されます。

5. 図9-27に示すように、このダイアログを次のように構成します。

- アーカイブ・タイプ: MARファイル

- 「名前」: metadata1

図9-27 MARファイルの「デプロイメント・プロファイルの作成」ダイアログ

6. 「OK」をクリックします。
図9-28に示すように、「MARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

図9-28 「MARデプロイメント・プロファイルのプロパティの編集 - MARオプション」

7. 「メタデータ・ファイル・グループ」項目を開き、「ユーザー・メタデータ」項目を選択します。

8. 「追加」をクリックします。
「コントリビュータの追加」ダイアログが表示されます。

9. 「コントリビュータの追加」ダイアログの「参照」ボタンをクリックし、GradingRules.rulesディクショナリ・ファイルがあるプロジェクトのディレクトリにナビゲートします。
この例では、C:\JDeveloper\mywork\GradeApp\Gradesにナビゲートし、「選択」をクリックします。

10. 「コントリビュータの追加」ダイアログで、「OK」をクリックしてダイアログを閉じます。図9-29に示すように、「MARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

図9-29 「MARデプロイメント・プロファイルのプロパティの編集 - ユーザー・メタデータ」

11. 「MARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「メタデータ・ファイル・グループ」および「ユーザー・メタデータ」項目を順に開いて「ディレクトリ」を選択します。
図9-30に示すように、「ディレクトリ」ページが表示されます。

図9-30 「MARデプロイメント・プロファイルのプロパティの編集 - ディレクトリ」

12. oracleディレクトリのチェック・ボックスを選択します。これにより、GradingRules.rulesディレクトリが選択され、MARに含まれます。

13. 「OK」をクリックします。
図9-31に示すように、JDeveloperによりmetadata1 (MAR File)というアプリケーション・デプロイメント・プロファイルが作成されます。

図9-31 「アプリケーションのプロパティ」 - 「デプロイ」 - MAR

14. 「アプリケーションのプロパティ」ダイアログで、「OK」をクリックします。

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

等級サンプル・アプリケーションにEARファイルを追加します。

等級サンプル・アプリケーションにEARファイルを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、「GradeApp」アプリケーションを選択します。

2. 右クリックしてコンテキスト・メニューから「アプリケーションのプロパティ」を選択します。

3. 「アプリケーションのプロパティ」ダイアログで、「デプロイ」を選択して「新規」をクリックします。「デプロイメント・プロファイルの作成」ダイアログが表示されます。

4. 図9-32に示すように、このダイアログを次のように構成します。

- アーカイブ・タイプ: EAR

- 名前: grades

図9-32 EARファイルの「デプロイメント・プロファイルの作成」ダイアログ

5. 「OK」をクリックします。「EARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

6. 図9-33に示すように、「EARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲータで、「アプリケーション・アセンブリ」を選択します。

図9-33 「EARデプロイメント・プロファイルのプロパティの編集 - アプリケーション・アセンブリ」

7. このダイアログを次のように構成します。

- 「metadata1」チェック・ボックスを選択します。

- 「Grades.jpr」項目を開き、「grades」チェック・ボックスを選択します。

8. 「EARデプロイメント・プロファイルのプロパティの編集」ダイアログで「OK」をクリックします。
図9-34に示すように、JDeveloperによりgrades(EAR File)というアプリケーション・デプロイメント・プロファイルが作成されます。

図9-34 「アプリケーションのプロパティ」 - 「デプロイ」 - 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-32に示すように、「デプロイメント構成」ダイアログで、次の値を入力します。

- 「リポジトリ名」フィールドで、リストから「mds-soa」を選択します。

- 「パーティション名」フィールドにgradesと入力します。

図9-35 リポジトリおよびパーティションを使用したMDSの「デプロイメント構成」ダイアログ

5. 「デプロイメント構成」ダイアログ」ダイアログで「デプロイ」をクリックします。

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

等級サンプル・アプリケーションをデプロイしたら、アプリケーションを実行できます。

等級サンプル・アプリケーションを実行する手順は、次のとおりです。

1. Webブラウザで次のサイトをポイントします。
http://サーバー名:ポート/grades/

図9-36に示すように、テスト・サーブレットが表示されます。

図9-36 等級サンプル・アプリケーションのサーブレット

2. 名前とテスト・スコアを入力して「送信」をクリックします。図9-37に示すような結果が戻されます。

サーブレットを初めて実行した場合、結果が戻されるまでに遅延が生じることがあります。サーブレットが初めて起動されると、サーブレットの初期化中にランタイムによってディクショナリがロードされ、ルール・セッション・プールが作成されます。以降の起動ではこのような手順が実行されないため、実行速度が大幅に増します。

図9-37 結果を含む等級サンプル・アプリケーションのサーブレット

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

この章では、Oracle Business Rulesにより、ADFビジネス・コンポーネントのビュー・オブジェクトをファクトとして使用可能にして、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフのツリーをアサートし、Oracle Business Rulesにメイン・ビュー・オブジェクトのツリー内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させる方法について説明します。

この章の項目は、次のとおりです。

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

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

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

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

ADFビジネス・コンポーネント・ルール開発プロセスは、次のようにまとめることができます。

1. ビュー・オブジェクト定義を作成します。

2. アクション・タイプを作成します。

3. ルール・ディクショナリを作成します。

4. ビュー・オブジェクトのファクト・タイプを登録します。

5. アクションのJavaファクト・タイプを登録します。

6. Javaから起動する場合は、次のいずれかを実行します。

- ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されている場合は、ビュー・オブジェクト・インスタンスを渡してデシジョン・ポイントの起動をコーディングします。

- ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されていない場合は、ビュー・オブジェクトのキー値を渡してデシジョン・ポイントの起動をコーディングします。

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

ADFビジネス・コンポーネント・ビュー・オブジェクトがOracle Business Rulesデータ・モデルにインポートされるとき、図10-1に示すように、ビュー・オブジェクトの各属性に対応するプロパティを持ったADFビジネス・コンポーネント・ファクト・タイプが作成されます。

また、ADFビジネス・コンポーネント・ファクト・タイプには、次のプロパティが含まれています。

- プロパティViewRowImpl。各ファクト・インスタンスが表すoracle.jbo.Rowインスタンスを直接指します。

- プロパティkey_values。oracle.rules.sdk2.decisionpoint.KeyChainオブジェクトを指します。このプロパティは、この行と親行のキー値セットの取得に使用できます。

図10-1 ADFビジネス・コンポーネントのサンプル・ファクト・タイプ

次のことに注意してください。

- ビュー・オブジェクト定義間の関係は、ビュー定義の属性、特にビュー・リンクのアクセッサである属性のイントロスペクションによって決定されます。
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メソッドが必要です)。

例10-1に、ActionTypeサンプル実装を示します。

例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;
}
}

例10-1では、execメソッドのパラメータとしてoracle.rules.sdk2.decisionpoint.DecisionPointInstanceが存在します。表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を持つ単純なデータ伝達クラスです。あるアクション・タイプ・インスタンスの出力値が相互に上書きすることは許可されず、この点ではアクション・タイプの実装が互いに完全に独立しているものとみなす必要があります。

ルール・デザイナを使用すると、構成中のActionTypeに適切なパラメータを選択できます。

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

デシジョン・ポイントを使用すると、デシジョン関数を実行できます。ADFビジネス・コンポーネント・ファクト・タイプを使用している場合にのみ適用される特定のデシジョン・ポイント・メソッドがあります。デシジョン関数の詳細は、第6章「デシジョン関数の使用」を参照してください。

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

ADFビジネス・コンポーネント・ファクト・タイプを使用する場合は、Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数を起動します。

Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする手順は、次のとおりです。

1. DecisionPointBuilderを使用して、テンプレートDecisionPointインスタンスを作成し、構成します。
詳細は、第7.3.1項「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」を参照してください。

2. DecisionPointのメソッドgetInstanceを使用して、DecisionPointInstanceを作成します。

3. DecisionPointInstanceのメソッドaddInput、setInputsまたはsetViewObjectを使用して、使用するファクト・オブジェクトをDecisionPointInstanceに追加します。これらは、ViewObjectまたはViewObjectReferenceインスタンスです。これらは、デシジョン関数の入力で宣言されるのと同じ順序で追加する必要があります。詳細は、第10.2.1.3項「ADFビジネス・コンポーネント・ルールに使用するinvokeメソッドのコール」を参照してください。

4. DecisionPointInstanceで使用されるトランザクションを設定します。
詳細は、第10.2.1.1項「デシジョン・ポイント・トランザクションの設定」を参照してください。

5. 以降のアプリケーション・アクションに必要なランタイム・プロパティを設定します。
詳細は、第10.2.1.2項「ランタイム・プロパティの設定」を参照してください。

6. DecisionPointInstanceのメソッドinvokeをコールします。
詳細な情報は、次を参照してください:

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

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

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行を取り消すクリーンアップ・ルールセットを使用できます。

この使用について詳しくは、第10.3.9.3項「従業員取消しルールセットの追加方法」を参照してください。setViewObjectを使用するには、ViewObjectが、デシジョン関数InputTableの最初のエントリである必要があります。

addInput

setInputs

このデシジョン関数は、同時にロードされたすべてのViewObject行に対して1回起動されます。数多くの行が同時にロードされる場合があるため、通常、この操作はスケーラブルではありません。ViewObjectの行数が少ないことがわかっている場合は、このメソッドによるViewObjectのコールが役立つことがあります。

例10-2に、setInputsメソッドを使用するViewObjectインスタンスを使用してデシジョン・ポイントを起動する方法を示します。完全な例については、例10-5を参照してください。

例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-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.1.4 デシジョン・ポイントの起動に関する必知事項

JBOクラスのデフォルト動作はすべてのデータを単にロードすることであるため、大量のデータをロードするビュー・オブジェクトを使用してデシジョン・ポイントを起動する際には注意が必要です。多数の行を持ち、多数の子行も持つ可能性のあるビュー・オブジェクトがメモリーにロードされると、メモリー不足になる危険性があるのみでなく、この種の大型データに基づいて実行されるDMLアクションによってロールバック・セグメントがすべて使用されてしまう危険性があります。

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

Oracle Business Rules SDKデシジョン・ポイント・インタフェースを持つADFビジネス・コンポーネント・ファクト・タイプを使用して、ルールセットを持つデシジョン関数をコールするには、特定のオプションを使用してデシジョン関数を構成する必要があります。デシジョン関数の使用の詳細は、第6章「デシジョン関数の使用」を参照してください。

Javaデシジョン・ポイント・インタフェースを使用してデシジョン関数を定義する手順は、次のとおりです。

1. 「デシジョン関数」項目の左にある「デシジョン関数」アイコンをダブルクリックするか、この項目を選択して「編集」アイコンをクリックします。「デシジョン関数の編集」ダイアログが表示されます。

2. 「デシジョン関数の編集」ダイアログで、デシジョン関数を構成します。

- 入力のファクト・タイプ: 構成済のビジネス・ルールに使用するファクト・タイプの名前を指定します。
ADFビジネス・コンポーネント・ファクト・タイプを使用するアプリケーションを使用している場合、入力はルールで使用されるADFビジネス・コンポーネント・ビュー・オブジェクトとなります。

デシジョン・ポイントでsetViewObjectを使用する場合は、「リスト」属性の選択を解除する必要があります。デシジョン・ポイントでaddInputメソッドまたはsetInputsメソッドを使用しているときに、入力のファクト・タイプごとに「リスト」属性を選択する必要があります。ビュー・オブジェクトの使用に応じて「ツリー」属性を選択することもできます。

- 「リスト」: ADFビジネス・コンポーネント・ファクト・タイプのリストがデシジョン関数に渡されるように定義します。

- 「ツリー」: マスター/ディテール階層内の最上位レベル・オブジェクトのみでなく、すべてのオブジェクトをアサートするように定義します。

詳細は、第10.2.1項「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

- 出力のファクト・タイプ: コール元が戻すファクト・タイプを定義します。
ADFビジネス・コンポーネント・ファクト・タイプを使用するデシジョン関数のJavaデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする場合、出力のファクト・タイプは空のままにする必要があります。ビュー・オブジェクトは、ActionTypeを使用して更新されます。詳細は、第10.1.2項「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。

- 「ルールセットおよびデシジョン関数」: このデシジョン関数で実行するルールセットおよび他のデシジョン関数の順序付きリストです。DecisionPointディクショナリからのルールセットDecisionPointDictionary.PreprocessingおよびDecisionPointDictionary.Postprocessingは、それぞれアプリケーション固有のルールセットおよびデシジョン関数の前と後に実行するように追加する必要があります。

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

デシジョン関数の定義には、ルールセットとデシジョン関数の両方を含めることができます。アプリケーションでは、通常、配管コードとして機能するなんらかのルールまたはデシジョン関数が必要です。このようなアプリケーションには、入力データのトランスフォーメーション、補助ファクトのアサートまたは出力ファクトの処理を実行するコンポーネントが含まれます。配管コードは、アプリケーションのコア・ビジネス・ルールを含むルールの前または後に実行することが必要となる場合があります。こうしたアプリケーションの問題とそれに関連するルールをネストしたデシジョン関数を使用して、アプリケーションの機能の問題と切り離すことができます。ネストしたデシジョン関数を使用すると、内側のデシジョン関数に管理上の配管指向の問題が含まれなくなるため、内側のデシジョン関数ではアプリケーションのコア・ロジックを定義するルールのみが示されるようになります。この設計によって、ユーザーが管理上のルールを理解する必要がなくなり、ユーザーがルールに不適切な変更を加えること(および、このことにより、システムが操作不能になる事態)を防止できます。

複数のルールセットおよびネストしたデシジョン関数を使用して構成を作成するには、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. 「アプリケーションの名前付け」ページで、新規アプリケーションの名前および場所を入力します。

1. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、Chapter10と入力します。

2. 「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

3. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞を入力します。たとえば、com.exampleと入力します。
この接頭辞はグローバルで一意である必要があり、通常は自社が所有しているドメイン名を使用します。この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。

このサンプルでは、接頭辞com.exampleを使用します。

4. 「アプリケーション・テンプレート」フィールドで「Fusion Webアプリケーション(ADF)」を選択します。

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

10.3.2 Chapter10汎用プロジェクトの追加方法

Chapter10という新規プロジェクトを追加する必要があります。

新規プロジェクトを追加します。

1. Chapter10アプリケーションで、「アプリケーション・メニュー」を選択します。

2. 「アプリケーション・メニュー」リストから「新規プロジェクト」を選択します。

3. 「新規ギャラリ」の「項目」領域で、「汎用プロジェクト」を選択します。

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

5. 「プロジェクトの名前付け」ページで、「プロジェクト名」フィールドにChapter10と入力します。

6. 「終了」をクリックします。

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

データベース表からADFビジネス・コンポーネントを追加する必要があります。この例では、標準のHRデータベース表を使用します。

ADFビジネス・コンポーネントを追加する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

2. 右クリックしてメニューから「新規」を選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で、「ビジネス層」を開いて「ADFビジネス・コンポーネント」を選択します。

4. 「項目」領域で、「表からのビジネス・コンポーネント」を選択します。

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

6. 「ビジネス・コンポーネント・プロジェクトの初期化」ダイアログで、必要な接続情報を入力して、接続を追加します。

7. 「OK」をクリックします。表からのビジネス・コンポーネントの作成ウィザードが表示されます。

8. 「エンティティ・オブジェクト」ページで、「使用可能」ボックスのオブジェクトを「選択済」ボックスに移動して、必要なオブジェクトを選択します。完成したリストを表示するために、「問合せ」をクリックすることが必要となる場合があります。たとえば、図10-2に示すように、「DEPARTMENTS」および「EMPLOYEES」を選択します。

図10-2 サンプル・アプリケーション用のエンティティ・オブジェクトの選択

9. 「次へ」をクリックします。「更新可能なビュー・オブジェクト」ページが表示されます。

10. 図10-3に示すように、「更新可能なビュー・オブジェクト」ページで「Departments」および「Employees」を選択します。

図10-3 サンプル・アプリケーション用の更新可能なビュー・オブジェクトの追加

11. 「次へ」をクリックします。「読取り専用ビュー・オブジェクト」ページが表示されます。

12. 「次へ」をクリックします。「アプリケーション・モジュール」ページが表示されます。

13. 「終了」をクリックします。

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

アプリケーションのパフォーマンス要件に合わせて、ViewObjectをチューニングする必要があります。

EmployeesViewのチューニング・オプションを設定する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で「EmployeesView」をダブルクリックします。

2. 「一般」ナビゲーション・タブで、「チューニング」を開きます。

3. 「チューニング」領域で「すべての行」を選択します。

4. 「チューニング」領域で、Batches of:フィールドに128と入力します。

5. 「チューニング」領域で「一度にすべて」を選択します。

DepartmentsViewのチューニング・オプションを設定する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で「DepartmentsView」をダブルクリックします。

2. 「一般」ナビゲーション・タブで、「チューニング」を開きます。

3. 「チューニング」領域で「すべての行」を選択します。

4. 「チューニング」領域で、Batches of:フィールドに128と入力します。

5. 「チューニング」領域で「一度にすべて」を選択します。

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

Oracle JDeveloperを使用して、Oracle Business Rulesディクショナリを作成します。

ディクショナリを作成する手順は、次のとおりです。

1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

2. 右クリックして、リストから「新規」を選択します。

3. 「新規ギャラリ」ウィンドウで、「すべてのテクノロジ」タブを選択して「カテゴリ」領域で「ビジネス層」を開き、「ビジネス・ルール」を選択します。

4. 「新規ギャラリ」の「項目」領域で「ビジネス・ルール」を選択します。

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

6. 図10-4に示すように、「ビジネス・ルールの作成」ダイアログで、ディクショナリ名とパッケージを入力します。

- たとえば、「名前」フィールドにChapter10Rulesと入力します。

- たとえば、「パッケージ」フィールドにcom.exampleと入力します。

図10-4 Chapter10Rulesディクショナリのビジネス・ルールの作成

7. 「OK」をクリックします。
図10-5に示すように、JDeveloperによりルール・デザイナにディクショナリが作成され、Chapter10Rules.rulesファイルが開きます。

図10-5 ルール・ディクショナリの追加

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

Oracle Business Rulesによって提供されているデシジョン・ポイント・ディクショナリへのディクショナリ・リンクを追加する必要があります。このディクショナリでは、ADFビジネス・コンポーネント・オブジェクトを持つデシジョン・ポイント・インタフェースで使用する機能がサポートされています。

デシジョン・ポイント・ディクショナリ・リンクを追加します。

1. Rules Designerで、「リンク」ナビゲーション・タブをクリックします。

2. 「作成」アイコンの横にあるメニューから、「デシジョン・ポイント・ディクショナリ」を選択します。この操作は、完了に時間がかかる場合があります。操作が完了した後、ルール・デザイナは、図10-6に示すように、デシジョン・ポイント・ディクショナリへのリンクを追加します。

図10-6 デシジョン・ポイント・ディクショナリのディクショナリ・リンクの追加

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

ルール・デザイナでADFビジネス・コンポーネント・ファクトをインポートして、ルールの作成時にこれらのオブジェクトを使用できるようにします。

ADFビジネス・コンポーネント・ファクトをインポートします。

1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。

2. 「ADF-BCファクト」タブを選択します。

3. 「作成」アイコンをクリックします。「ADFビジネス・コンポーネント・ファクト」ページが表示されます。

4. 「接続」フィールドのリストから、ADFビジネス・コンポーネント・オブジェクトが使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。

5. 「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。たとえば、「com.example.EmployeesView」を選択します。

6. 「OK」をクリックします。図10-7に示すように、「ファクト」ナビゲーション・タブが表示されます。

図10-7 ルール・デザイナのADFビジネス・コンポーネント・ファクト

ADFビジネス・コンポーネント・ファクトには循環参照が含まれていることがあります。この場合は、次のような検証警告が示されます。

RUL-05037: A circular definition exists in the data model

「ビジネス・ルール」検証ログにこの警告が表示されている場合は、循環参照を手動で解決する必要があります。このためには、循環参照に含まれているいずれか1つのプロパティの「参照可能」チェック・ボックスの選択を解除します。

プロパティを表示不可能としてマーク付けする手順は、次のとおりです。

1. 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。

2. 「DepartmentsView」行のアイコンをダブルクリックします。

3. 「プロパティ」表の「EmployeesView」行で、「参照可能」チェック・ボックスの選択を解除します。

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

DepartmentsViewおよびEmployeesViewの別名を設定する手順は、次のとおりです。

1. 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。

2. 「エイリアス」列で、EmployeesViewをEmployeeで置き換えます。

3. 「エイリアス」列で、DepartmentsViewをDepartmentで置き換えます。

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

外部マネージャ・ルールセットを実行するサンプル・コードは、setInputsメソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数が1回起動し、すべてのビュー・オブジェクト行がListにロードされます。この方法を使用してデシジョン・ポイントを起動する場合、すべてのビュー・オブジェクト行が同時にメモリーにロードされる必要があり、OutOfMemory例外が発生する可能性があるため、スケーラブルではありません。この起動スタイルは、既知のビュー・オブジェクト行が少数ある場合にのみ使用します。setViewObjectでデシジョン・ポイントを使用することもできます。詳細は、第10.2.1項「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

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

ビュー・オブジェクトがファクトとしてインポートされた後、ルールセットの名前を変更して、アプリケーションのデシジョン関数を作成できます。

ルールセットの名前を変更する手順は、次のとおりです。

1. ルール・デザイナで、「Ruleset_1」ナビゲーション・タブを選択します。

2. ルールセット名を選択し、Outside Manager Rulesetと入力して、ルールセットの名前を変更します。

デシジョン関数を追加する手順は、次のとおりです。

1. 「デシジョン関数」ナビゲーション・タブをクリックします。

2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

3. 図10-8に示すように、デシジョン関数のフィールドを編集します。

- 「名前」に値FindOutsideManagersを入力します。

- 「入力」領域で、「入力の追加」アイコンをクリックして入力情報を次のように編集します。

- 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

- 「リスト」チェック・ボックスを選択します。

このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。詳細は、第10.1.2項「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。

- 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

- DecisionPointDictionary.Preprocessing

- Outside Manager Ruleset

- DecisionPointDictionary.Postprocessing

図10-8 外部マネージャ検索デシジョン関数の追加

4. 「選択済」領域で、項目が図10-8に示す順序で表示されていることを確認します。
順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

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

複数の警告が表示されます。これらの警告は、後のステップでルールセットにルールを追加すると、削除されます。

10.3.8.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. 図10-9に示すように、「Javaクラスの作成」ダイアログで次のプロパティを構成します。

- 「名前」に値MessageActionを入力します。

- 「パッケージ」に値com.exampleを入力します。

- 「拡張」に値oracle.rules.sdk2.decisionpoint.ActionTypeを入力します。

図10-9 メッセージ・アクション・タイプのJavaクラスの作成

8. 「OK」をクリックします。
Oracle JDeveloperによってJavaクラスが表示されます。

9. このコードを、例10-4に示すコードで置き換えます。

例10-4 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.8.3 メッセージ・アクションのJavaファクトをインポートする方法

新しいJavaクラスを作成したため、後でルールを作成するときに使用できるように、このクラスをルール・デザイナのJavaファクト・タイプとして追加する必要があります。

Javaファクト・タイプを作成する手順は、次のとおりです。

1. Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。

2. 「Javaファクト」タブを選択します。

3. 「作成」をクリックします。

4. 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、comおよびexampleを開いて、「MessageAction」チェック・ボックスを表示します。

5. 図10-10に示すように、「MessageAction」チェック・ボックスを選択します。

図10-10 メッセージ・アクション・タイプによるJavaファクトの作成

6. 「OK」をクリックします。
図10-11に示すように、ファクトが表に追加されます。

図10-11 メッセージ・アクション・タイプのJavaファクトの追加

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

従業員とは別の部門にいるマネージャを検索するルールを追加します。

別部門のマネージャ検索ルールを追加する手順は、次のとおりです。

1. ルール・デザイナで、「Outside Manager Ruleset」タブを選択します。

2. 「追加」をクリックし、リストから「ルールの作成」を選択します。

3. デフォルトのルール名「Rule_1」を選択して、ルールの名前を変更します。これによりテキスト入力領域が表示されます。名前を入力します。たとえば、Find managers in different departmentと入力します。[Enter]を押して名前を適用します。

4. 「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

5. 図10-12に示すように、ルールの「拡張モード」を選択します。

図10-12 別部門のマネージャ検索ルールの追加

6. 図10-13に示すように、ルールを入力します。「THEN」領域に表示されているルールのアクションは、長すぎて図内に表示しきれません。作成する完全なアクションには、次の項目を含めます。

"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-13 別部門のマネージャ検索ルール

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

外部マネージャ・ファインダ・クラスを追加します。このクラスはデシジョン・ポイントを使用して、デシジョン関数を実行します。

外部マネージャ・ファインダ・クラスを追加する手順は、次のとおりです。

1. Chapter10プロジェクトを選択します。

2. 右クリックして「新規」を選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

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

6. 「名前」フィールドにOutsideManagerFinderと入力します。

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

8. このクラスのコンテンツを、例10-5に示すコードで置き換えます。

例10-5 デシジョン・ポイントを使用する外部マネージャ・ファインダ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.8.6 ローカル・ディクショナリ・アクセスのADF META INFの更新方法

ADF-META-INFファイルの、ディクショナリにアクセスするためのMDS情報を更新する必要があります。MDSを持つローカル・ファイルを使用して、Oracle Business Rulesディクショナリにアクセスできます。ただし、一般的に、本番環境のOracle Business Rulesでは、ディクショナリ・アクセスにこの手順を使用しません。本番環境でのデシジョン・ポイントを使用したMDSによるディクショナリへのアクセスの詳細は第7.5項「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。

ADF-META-INFを更新します。

1. 「アプリケーション・ナビゲータ」で「アプリケーション・リソース」を開きます。

2. 「ディスクリプタ」フォルダおよび「ADF META-INF」フォルダを開きます。

3. adf-config.xmlをダブルクリックして、このファイルを開きます。

4. 「ソース」タブをクリックして、adf-config.xmlのソースを表示します。

5. </adf-config>タグを閉じる前に、例10-6に示すようにadf-config.xmlにMDS情報を追加します。

例10-6 ローカル・ディクショナリ・アクセス用の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ディレクトリに一致するようにパスを変更します。

MDSでアクセス可能な場所に定義をコピーします。

1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーション、Chapter10プロジェクトおよびsrcフォルダにナビゲートし、comフォルダを選択およびコピーします。

2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

3. comフォルダをこのディレクトリにコピーします。

MDSでアクセス可能な場所にディクショナリをコピーします。

1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびChapter10プロジェクトにナビゲートし、Oracle Business Rulesディクショナリを含むoracleディレクトリをコピーします。

2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

3. oracleフォルダをこのディレクトリにコピーします。

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

従業員が別の部門にいるマネージャの検索ルールを実行して、プロジェクトを作成しおよびテストできます。

OutsideManagerFinder構成を作成します。

1. 「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、OutsideManagerFinderと入力します。

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

5. 「OutsideManagerFinder」を選択した状態で、「編集」をクリックします。

6. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

7. src\com\exampleフォルダから「OutsideManagerFinder.java」を選択します。

8. 「開く」をクリックします。

9. 「実行構成の編集」ダイアログで「OK」をクリックします。

10. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行します。

1. 「プロジェクトの実行」アイコンの横にあるドロップダウン・メニューから、「OutsideManagerFinder」を選択します。

2. 例10-7に示すように、この構成を実行すると、出力が生成されます。

例10-7 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.9 部門マネージャ・ルールセットの追加および実行方法

部門マネージャ・ルールセットを実行するサンプル・コードは、setViewObjectメソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。すべてのデシジョン関数コールは、同じRuleSession内で発生します。デシジョン関数のコールとコールの間に、RuleSessionによって、以前のデシジョン関数コールのすべての状態が保存されます。このため、以前のコール時にアサートされたオブジェクトは、指定するルールセットによって明示的に取り消されない場合、次のコールの作業メモリーに残ります。状態が保持されている場合は、取消しアクションを使用するルールを持つルールセットを実行して、コールとコールの間にすべてのファクトまたは選択したファクトを取り消すことができます。このルールセットは、デシジョン・ポイントで使用する同じデシジョン関数の一部として実行されます。図10-15では、Retract all employeesルールセットによるこれらのファクトの取消しの例を示しています。詳細は、第10.2.1項「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

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

部門マネージャ・ファインダ・ルールセットを追加します。

部門マネージャ・ファインダ・ルールセットを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセットの作成」をクリックします。

2. 「ルールセットの作成」ダイアログで、「名前」フィールドにDepartment Manager Finder Rulesetと入力します。

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

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

次に、部門マネージャを検索する検索ルールを追加します。このルールは、Oracle ADFビジネス・コンポーネント・ファクト・タイプでのツリー・モードルールの使用を示します。

部門マネージャ・ファインダ・ルールを追加します。

1. ルール・デザイナで、「Department Manager Finder Ruleset」を選択します。

2. 「追加」アイコンの横にあるドロップダウン・メニューで、「ルールの作成」をクリックします。

3. 名前「Rule_1」を選択し、Findを入力して、ルールの名前を変更します。

4. 「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

5. ルールで、「ツリー・モード」を選択します。

6. 図10-14に示すように、Findルールのテストおよびアクションを入力します。「THEN」領域のアサートは長すぎて図に表示しきれません。図10-14に表示されていない、このルールの完全なテキストを次に示します。

Employee.FirstName + " " + Employee.LastName + " is the manager of dept " + Employee/DepartmentsView.DepartmentName

図10-14 部門マネージャ・ファインダ・ルールセットへの検索ルールの追加

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

従業員ファクト・タイプ・インスタンスを取り消すルールセットを追加します。これにより、従業員ファクト・タイプが、デシジョン関数の起動と起動の間に削除されます。

従業員取消しルールセットを追加する手順は、次のとおりです。

1. Retract Employees Rulesetを追加します。

2. 図10-15に示すように、「Retract Employees Ruleset」でルールを追加し、このルールにRetract all employeesという名前を付けます。

図10-15 すべての従業員の取消しルールの追加

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

部門マネージャ・ファインダ・ルールセット用のデシジョン関数を作成します。このデシジョン関数を使用して、デシジョン・ポイントからルールセットを実行します。

部門マネージャ・ファインダ・ルールセットのデシジョン関数を追加する手順は、次のとおりです。

1. 「デシジョン関数」ナビゲーション・タブをクリックします。

2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

3. 図10-16に示すように、デシジョン関数のフィールドを更新します。

- 「名前」に値FindDepartmentManagersを入力します。

- 「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。

- 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

- 「ツリー」チェック・ボックスを選択します。

このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。

- 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

- DecisionPointDictionary.Preprocessing

- Department Manager Finder Ruleset

- Retract Employees

- DecisionPointDictionary.Postprocessing

図10-16 部門マネージャ検索デシジョン関数の追加

4. 「選択済」領域で、項目が図10-16に示す順序で表示されていることを確認します。
順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

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

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

部門マネージャ・ファインダ・クラスを追加します。このクラスには、デシジョン関数を実行するデシジョン・ポイントが指定されたコードが含まれます。

部門マネージャ・ファインダ・クラスを追加します。

1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。

2. 右クリックして「新規」を選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

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

6. 「名前」フィールドにDeptManagerFinderと入力します。

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

8. このクラスのコンテンツを、例10-8に示すコードで置き換えます。

例10-8 部門マネージャ・ファインダ・クラス

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.9.6 MDSでアクセス可能な場所にディクショナリをコピーする方法

MDSでアクセス可能な場所に更新したディクショナリをコピーします。

MDSでアクセス可能な場所にディクショナリをコピーします。

1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびプロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。

2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

3. oracleフォルダをこのディレクトリにコピーします。

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

部門マネージャ・ファインダ・ルールセットを実行するプロジェクトを作成およびテストできます。

プロジェクトを作成します。

1. 「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、DeptManagerFinderと入力します。

4. 「設定のコピー元」フィールドにDefaultと入力します。

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

6. 「DeptManagerFinder」を選択した状態で、「編集」をクリックします。

7. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

8. src\com\exampleディレクトリから「DeptManagerFinder.java」を選択します。

9. 「開く」をクリックします。

10. 「実行構成の編集」ダイアログで「OK」をクリックします。

11. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行します。

1. 「プロジェクトの実行」アイコンの横にあるメニューから、「DeptManager Finder」を選択します。

2. 例10-9に示すように、デシジョン・ポイントを実行すると、出力が生成されます。

例10-9 Department Manager Finder Rulesetの出力

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.10 従業員昇給ルールセットと従業員取消しルールセットの追加および実行方法

昇給ルールセットを実行するサンプル・コードでは、setViewObjectメソッドを使用するビュー・オブジェクトを指定して、デシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。デシジョン関数のコールとコールの間にこれらのインスタンスが作業メモリーに残らないよう、従業員取消しルールセットによって、各コールでアサートされたEmployeeのインスタンスがすべて取り消されます。例10-10のアクション・タイプは、ActionTypeを使用してViewRowImpl属性の値を変更する方法を示しています。詳細は、第10.2.1項「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

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

昇給ルールセットを追加します。

昇給ルールセットを追加する手順は、次のとおりです。

1. Rules Designerで、「ルールセットの作成」をクリックします。

2. 「ルールセットの作成」ダイアログで、「名前」フィールドにRaises Rulesetと入力します。

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

10.3.10.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. 図10-17に示すように、「Javaクラスの作成」ダイアログで次のプロパティを構成します。

- 「名前」に値RaiseActionを入力します。

- 「パッケージ」に値com.exampleを入力します。

- 「拡張」に値oracle.rules.sdk2.decisionpoint.ActionTypeを入力します。

図10-17 昇給ActionTypeのJavaクラスの作成

8. 「OK」をクリックします。
Oracle JDeveloperによってJavaクラスが表示されます。

9. このコードを、例10-10に示すコードで置き換えます。

例10-10 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;
}
}

10. アプリケーション・ナビゲータで、「RaiseAction.java」を右クリックし、リストから「メイク」を選択します。

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

新しいJavaクラスが作成されました。このクラスをルール・デザイナのJavaファクト・タイプとしてインポートし、後でルールを作成するときに使用できるようにします。

Javaファクト・タイプを作成する手順は、次のとおりです。

1. ルール・デザイナで、「ManagerRules.rules」ディクショナリを選択します。

2. 「ファクト」ナビゲーション・タブをクリックし、「Javaファクト」タブを選択します。

3. 「作成」をクリックします。

4. 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、comおよびexampleを開いて、「RaiseAction」チェック・ボックスを表示します。

5. 図10-18に示すように、「RaiseAction」チェック・ボックスを選択します。

図10-18 昇給アクション・クラスからのJavaファクトの作成

6. 「OK」をクリックします。
「Javaファクト」表に昇給アクション・ファクト・タイプが追加されます。

10.3.10.4 12年昇給ルールの追加方法

このルールは、アクション・タイプを使用して、データベース・エントリを更新する方法を示します。

12年昇給ルールを追加する手順は、次のとおりです。

1. Rules Designerの「Raises Ruleset」で、「ルールの作成」をクリックします。

2. 名前「Rule_1」を選択し、値Longer than 12 yearsを入力して、ルールの名前を変更します。

3. 「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。

4. 「拡張モード」を選択します。

5. 図10-19に示すように、12年昇給しルールを入力します。

図10-19 昇給ルールセットへの12年より長いルールの追加

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

従業員昇給ルールセットおよびすべての従業員の取消しルールセット用のデシジョン関数を作成します。

デシジョン関数を追加する手順は、次のとおりです。

1. 「デシジョン関数」ナビゲーション・タブをクリックします。

2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。

3. 図10-20に示すように、デシジョン関数のフィールドを更新します。

- 「名前」に値EmployeeRaisesを入力します。

- 「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。

- 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。

- 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

- DecisionPointDictionary.Preprocessing

- Raises Ruleset

- Retract Employees Ruleset

- DecisionPointDictionary.Postprocessing

図10-20 従業員昇給デシジョン関数の追加

4. 「選択済」領域で、項目が図10-20に示す順序で表示されていることを確認します。
順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

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

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

従業員昇給クラスを追加します。これにより、デシジョン関数が実行されます。

従業員昇給クラスを追加する手順は、次のとおりです。

1. Chapter10プロジェクトを選択します。

2. 右クリックして「新規」を選択します。

3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

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

6. 「名前」フィールドにEmployeeRaisesと入力します。

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

8. このクラスのコンテンツを、例10-11に示すコードで置き換えます。

例10-11 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.10.7 ディクショナリのコピー方法

MDSでアクセス可能な場所に更新したディクショナリをコピーします。

MDSでアクセス可能な場所にディクショナリをコピーします。

1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10フォルダおよびChapter10プロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。

2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。

3. oracleフォルダをこのディレクトリにコピーします。

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

従業員昇給ルールセットを実行して、プロジェクトを作成およびテストできます。

プロジェクトを作成します。

1. 「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。

3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、EmployeeRaisesと入力します。

4. 「設定のコピー元」フィールドにDefaultと入力します。

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

6. 「EmployeeRaises」を選択した状態で、「編集」をクリックします。

7. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。

8. src\com\exampleフォルダから「EmployeeRaises.java」を選択します。

9. 「開く」をクリックします。

10. 「実行構成の編集」ダイアログで「OK」をクリックします。

11. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行します。

1. 「プロジェクトの実行」アイコンの横にあるメニューから、「EmployeeRaises」を選択します。

2. 例10-12に示すように、Oracle JDeveloperに出力が表示されます。

例10-12 Raises Rulesetの出力

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項「デシジョン・コンポーネントの概要」

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

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

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

デシジョン・コンポーネントは、基礎となるデシジョン関数にルール・セッションをラップするWebサービスです。

デシジョン・コンポーネントは、次の要素で構成されています。

- Rules Engineを使用して評価されるルールまたはデシジョン表。これらはルール・デザイナを使用して定義し、ビジネス・ルール・ディクショナリに格納します。

- 特定のルールの評価に必要なファクトを記述したメタデータ。ルールまたはデシジョン表を含む各ルールセットは、入力および出力であるファクトとともにサービスとして公開されます。これらのファクトは、XSD定義を介して公開される必要があります。
たとえば、信用格付ルールセットにはファクトとして顧客IDおよび過去のローン履歴が必要ですが、年金支払ルールセットにはファクトとして従業員の勤続年数、給与および年齢の値が必要です。

詳細は、第11.2.1項「デシジョン・コンポーネント・メタデータの使用」を参照してください。

- Webサービスは、基礎となるルール・エンジンに入力、出力およびコールをラップします。
このサービスにより、ビジネス・プロセスはファクトをプロセスの一部としてアサートしたり、取り消すことができます。すべてのファクトをビジネス・プロセスから1単位としてアサートできる場合があります。また、ビジネス・プロセスでファクトを増分アサートし、最終的にルール・エンジンによる推論を参照する場合もあります。したがって、サービスではステートレスな相互作用とステートフルな相互作用の両方をサポートする必要があります。

このような多様なビジネス・ルール・サービス・コンポーネントを作成できます。

詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』を参照してください。

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

Oracle JDeveloperとルール・デザイナを使用すると、これらのツールにより必須のメタデータおよびWSDL操作すべてが自動的に生成されます。デシジョン・コンポーネントは、次の方法でSOAコンポジット・アプリケーションに統合できます。

- SOAコンポジット・エディタで、デシジョン・コンポーネントをスタンドアロン・コンポーネントとして作成します。このシナリオでは、デシジョン・サービスはコンポジット・レベルで公開されるため、任意のWebサービス・クライアントから起動できます。
詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesのスタート・ガイドを参照してください。

- SOAコンポジット・エディタでデシジョン・コンポーネントを作成し、BPELプロセスに関連付けます。このシナリオでは、デシジョン・サービスはコンポジット・レベルで公開されません。ただし、BPEL、Oracle Mediator、Oracle Human Workflowなど、コンポジット内の他の任意のコンポーネントに接続できます。
詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesのスタート・ガイドを参照してください。

- ヒューマン・タスク・コンポーネントのヒューマン・タスク・エディタで、デシジョン・コンポーネントを作成します。

この統合には、次のメリットがあります。

- 動的な処理: 適切なルーティング、プロセス内のポリシーの検証および制約チェックの提供

- 非定型ヒューマン・タスクとの統合: ポリシーベースのタスクの割当て、各種エスカレーション・ポリシーおよびタスクのロード・バランシングを提供

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

デシジョン・コンポーネントは、次のファイルで定義されています。

- デシジョン・サービス・メタデータ(.decs)ファイル

- SCAコンポーネント・タイプ(.componentType)ファイル

- composite.xml内のデシジョン・コンポーネント・エントリ

通常、これらのファイルの生成およびメンテナンスにはOracle JDeveloperを使用します。

11.2.1.1 デシジョン・サービス・メタデータ(.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)にビジネス・ルールをもたらします。11g リリース1 (11.1.1.7)では、デシジョン・サービスはサービスのメタデータおよびWSDL規定で構成されます。

business_rule_name.decsファイルのdecisionService要素では、Webサービスとして公開されるビジネス・ルールを記述するメタデータを定義します。

通常、デシジョン・サービスには、次の要素が含まれています。

- ターゲット・ネームスペース。

- バックエンドOracle Rules Engineへの参照(ルール・ディクショナリへのリンクです)。OracleRulesSDKがruleEngineProvider要素に示したOracle Rules Engineプロバイダの名称と一致する参照名であることに注意してください。

- 名称(次の例ではCreditRatingService)。

- 使用するディクショナリ名およびルールセットに関する追加情報。

- サポート対象の操作(パターン)のリスト。

操作(パターン)とは別に、操作のパラメータ型(ファクト・タイプ)が指定されています(後で実行時に検証されます)。したがって、各デシジョン・サービスでは強い型指定を持つ規定が公開されます。

11.2.1.2 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>

11.2.1.3 composite.xml内のデシジョン・コンポーネント・エントリ

デシジョン・コンポーネントに対してcomposite.xml内にエントリが作成されます。次に例を示します。

<component name="OracleRules1">
<implementation.decision src="OracleRules1.decs"/>
</component>

ビジネス・ルール・サービス・エンジンでは、サービス・エンジンに対するリクエストを処理するためにこの実装タイプからの情報が使用されます。SCAの視点からは、デシジョン・コンポーネントは新しい実装タイプです。

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

デシジョン・サービスを使用すると、Oracle Business Rulesデシジョン関数をサービスとして公開できます。デシジョン関数は、Java EEアプリケーションやBPELプロセスからルールをコールするためのRL Languageプログラミングを使用せずに、宣言的に構成される関数です。

例11-1に、サービスとして公開されるOracle Business Rulesデシジョン関数のメタデータを定義する、business_rule_name.decsファイルのdecisionServices要素を示します。

例11-1 デシジョン関数実行用のdecisionService

<?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ファイルで全体が指定されています。

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

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を使用して事前に初期化されます。

- 必要に応じて新規のルール・セッションが作成されます。

- ルール・セッションは再利用でき、その回数は構成可能です。

- ルール・セッション・プールの初期サイズは構成可能です。

- ステートフルなルール・セッション・キャッシュ

- ステートフルなルール・セッションの場合は、特別なキャッシュがメンテナンスされます。
詳細は、第11.2.3項「デシジョン・コンポーネントとのステートフルな相互作用の使用」を参照してください。

- デプロイメント・アーティファクト

- デシジョン・コンポーネントのデプロイメントにより、最終的にJAXBファクト・タイプのクラスを生成できます。これらのクラスはコンポジット間で共有できます。

図11-2に、デシジョン・サービス・リクエスト中の、ステートレスなルール・セッションおよびステートフルなルール・セッションとルール・セッション・プールの相互作用、およびステートフルなルール・セッションとステートフルなルール・セッション・キャッシュの相互作用を示します。

図11-2 デシジョン・サービス・リクエストに対するステートレスおよびステートフルなルール・セッションの使用方法

12 Oracle Business RulesでのOracle SOAコンポーザの使用

この章では、Oracle SOAコンポーザ・アプリケーション(Oracle SOAコンポーザ)を使用して、SOAコンポジット・アプリケーションの一部である、デプロイされたディクショナリおよびタスクを実行時に使用する方法について説明します。

この章の項目は、次のとおりです。

- 第12.1項「Oracle SOAコンポーザの概要」

- 第12.2項「Oracle SOAコンポーザのユーザー認証の使用」

- 第12.3項「SOAコンポーザでのアクセシビリティ機能の有効化」

- 第12.4項「Oracle Business Rulesディクショナリの実行時のオープンおよび表示」

- 第12.5項「ディクショナリの実行時の編集および保存のスタート・ガイド」

- 第12.6項「Oracle Business Rulesディクショナリの実行時のルールの編集」

- 第12.7項「Oracle SOAコンポーザのブラウザ・ウィンドウの使用」

- 第12.8項「Oracle Business Rulesディクショナリのデシジョン表の実行時の編集」

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

- 第12.10項「Oracle Business Rulesディクショナリの変更の実行時のコミット」

- 第12.11項「Oracle JDeveloperのルール・ディクショナリと実行時のディクショナリの更新の同期」

- 第12.12項「Oracle Business Rulesディクショナリの実行時の検証」

- 第12.13項「コンポジット情報およびディクショナリ情報の実行時の入手」

- 第12.14項「タスクの実行時の使用」

12.1 Oracle SOAコンポーザの概要

Oracle SOAコンポーザはWebベースのアプリケーションで、Oracle Business Rulesのディクショナリやタスクをデプロイされたアプリケーションで使用可能にします。図12-1に、Oracle SOAコンポーザが、MDSリポジトリ内のディクショナリやタスクにアクセスする方法を示します。

図12-1 Oracle SOAコンポーザ・アーキテクチャ

アプリケーションの作成中にアクセシビリティを作成できます。SOAコンポーザ用のアプリケーションの作成の詳細は、第9章「ルール対応の非SOA Java EEアプリケーションの作成」を参照してください。

アクセス可能なADF Facesページの開発方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のアクセス可能なADF Facesページの開発に関する項を参照してください。

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

図12-2に、Oracle SOAコンポーザのログイン・ページを示します。このページは、Oracle SOAコンポーザによる指定されたユーザーの認証を可能にします。

図12-2 Oracle SOAコンポーザのログイン・ページ

Oracle SOAコンポーザにログインする手順は次のとおりです。

1. ブラウザのアドレス・バーで、次のURLを使用してOracle SOAコンポーザにアクセスします。
http://サーバー名またはIPアドレス/soa/composer

2. Oracle SOAコンポーザのログイン・ページの、「ユーザー名」フィールドで、ユーザー名を入力します。

3. 「パスワード」フィールドに、パスワードを入力します。

4. 「ログイン」をクリックします。

ユーザーとグループの作成および管理の詳細は、Oracle Fusion Middleware Oracle WebLogic Server管理コンソール・オンライン・ヘルプを参照してください。

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

Oracle SOAコンポーザはユーザーとパスワードによるアクセス制御をサポートしており、認証されたユーザーのみがOracle SOAコンポーザを使用できます。ただし、Oracle SOAコンポーザでは、さらに粒度の高いアクセス制御は用意されていません。たとえば、Oracle SOAコンポーザでは個別のルールセットやディクショナリ内のルールに対するアクセス制御はサポートされていません。

Oracle SOAコンポーザでは、メタデータに対するアクセス制御はサポートされています。Oracle SOAコンポーザを使用する際は、SOADesignerアプリケーション・ロールを持つユーザーのみがOracle SOAコンポーザのメタデータにアクセスできます。デフォルトでは、WLS管理者権限を付与されたすべてのユーザーがこのロールを持っています。

SOADesignerロールを持たないユーザーがOracle SOAコンポーザにログインすると、図12-3に示すように、ユーザーにはSOAメタデータを変更する権限がないことを示すメッセージが表示されます。

図12-3 SOAコンポーザの認証を受けていないメタデータへのアクセスに対するメッセージ

Oracle SOAコンポーザへのアクセスが必要な、非管理者ユーザーに対するSOADesignerロールの割当ての詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』のOracle Enterprise Manager Fusion Middleware Controlコンソールでのアプリケーション・ロールの管理に関する項を参照してください。

12.3 SOAコンポーザでのアクセシビリティ機能の有効化

SOAコンポーザには、スクリーン・リーダー・オプションが用意されています。このオプションを使用すると、スクリーン・リーダーでアプリケーションのすべてのコンポーネントに対するアクセスおよび読取りができるようになります。

スクリーン・リーダーを有効にする手順は次のとおりです。

1. 右上隅にある「スクリーン・リーダー・モードの有効化」リンクをクリックします。

2. 確認メッセージ、「これにより、現行セッションのスクリーン・リーダー・モードが有効化されます。続行しますか。」という確認メッセージが、図12-4に示すように表示されます。

図12-4 スクリーン・リーダーの有効化確認メッセージ

3. 「はい」をクリックして確認します。

12.4 Oracle Business Rulesディクショナリの実行時のオープンおよび表示

Oracle SOAコンポーザへのログイン後は、ドキュメントを選択して開くことができます。Oracle SOAコンポーザでは、DVMドキュメントやOracle Business Rulesディクショナリを含む、様々なタイプのメタデータの表示および編集がサポートされています。Oracle SOAコンポーザでは、図12-5で示すように、「開く」メニューを使用してOracle Business RulesディクショナリまたはDVMファイルを開くことができます。

図12-5 Oracle SOAコンポーザの「開く」メニューのオプション

12.4.1 Oracle Business Rulesディクショナリの実行時のオープン

「開く」メニューを使用して、Oracle Business Rulesのディクショナリを開く手順は、次のとおりです。

1. Oracle SOAコンポーザの「開く」メニューから、「ルールを開く」を選択します。

2. 「ルールを開く」を選択すると、MDSに接続され、「開くディクショナリの選択」ダイアログ・ボックスが表示されます。このダイアログ・ボックスには、図12-6に示すように、ディクショナリを含む使用可能なコンポジット・アプリケーションが表示されます。その他に、共有ディクショナリがリストされますが、これらの共有ディクショナリも表示および編集が可能です。

図12-6 Oracle Business Rulesディクショナリを表示したOracle SOAコンポーザ

3. ディクショナリを開くには、表のエントリを選択して「開く」をクリックするか、項目をダブルクリックします。ディクショナリが図12-7に示すように、表示モードで開かれます。

図12-7 Oracle SOAコンポーザの表示モードで開かれたOracle Business Rulesディクショナリ

図12-7に示すように、Oracle SOAコンポーザの左側のパネルにタブおよびリンクのリストが付いた、ディクショナリが表示されます。選択された項目に対するディクショナリの詳細は、右側に表示されています。Oracle SOAコンポーザには、次のタブが含まれます。

- グローバル

- バケットセット

- リンク

- デシジョン関数

- ルールセット

注意:

Oracle SOAコンポーザでは、関数はサポートされていません。

デフォルトでは、ディクショナリは表示モードで開かれます。ディクショナリを以前、編集モードで開き、もしあれば変更を行って元に戻さなかった場合は、次回ディクショナリを開く際に、編集モードで開かれます。編集モードの詳細は、第12.5項「ディクショナリの実行時の編集および保存のスタート・ガイド」を参照してください。

Oracle Business Rulesのディクショナリを、既知のURLを使用して直接開く手順は、次のとおりです。

1. Oracle Business Rulesのディクショナリを格納するドキュメントのURLを、Oracle SOAコンポーザで「ブックマーク可能なリンク」を使用して取得します。

1. 開いているディクショナリで、図12-8に示すように、「ブックマーク可能なリンク」をクリックして、ディレクトリのURL情報を取得します。

図12-8 リンク・ダイアログを使用した開いているディクショナリのURLの取得

2. 後で使用するため、URL情報をコピーして保存します。

2. ブラウザで、保存した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

「ユーザー編集」オプションを使用して、最近編集したディクショナリを開いて編集する手順は、次のとおりです。

ディクショナリを最近編集した場合は、「開く」メニューの「ユーザー編集」オプションを使用して、ディクショナリを開いて編集できます。

1. 図12-9に示すように、Oracle SOAコンポーザの「開く」メニューから「ユーザー編集」を選択し、リストからディクショナリを選択します。

図12-9 「開く」の「ユーザー編集」オプションを使用したディクショナリのオープン

2. 指定された辞書が編集モードで開きます。

12.4.2 「開くディクショナリの選択」ダイアログからディクショナリのパスを取得するための必知事項

「開くディクショナリの選択」ダイアログには、「ルール・ファイル」フィールドが含まれます。「ルール・ファイル」フィールドの値の上でマウスを保持すると、図12-10に示すように、ディクショナリのパスを含む「完全パス」ポップアップが表示されます。

図12-10 「開くディクショナリの選択」ダイアログからのディクショナリのルール・ファイルの完全パスの表示

12.4.3 Oracle Business Rulesディクショナリで実行時にグローバルを表示する方法

ディクショナリを開くと、「グローバル」タブが表示されます。「グローバル」タブには、最後のグローバル変数(「最後」オプションが選択されたグローバル変数)のみが表示されます。リンクされたディクショナリの最後のグローバル変数も「グローバル」タブに表示されます。ただし、これらのリンクされたグローバル変数は、編集モードでも編集できません。

グローバル変数を作成したり削除することはできません。「グローバル」タブから、編集モードで「名前」、「説明」および「値」の各フィールドを変更できます。「値」フィールドでは、式ビルダーを使用して値を設定できます。有効性をチェックするには、Oracle SOAコンポーザの「メニュー・バー」にある「検証」ボタンをクリックします。表示モードでは、編集操作はできません。Oracle SOAコンポーザの編集モードの使用の詳細は、第12.5項「ディクショナリの実行時の編集および保存のスタート・ガイド」を参照してください。

Oracle SOAコンポーザでグローバルを表示する手順は、次のとおりです。

1. Oracle SOAコンポーザの「開く」メニューから、「ルールを開く」を選択します。

2. ディクショナリを開いた後に、左側のペインから「グローバル」タブを選択します。図12-11に示すように、グローバル表が表示されます。

図12-11 Oracle SOAコンポーザのルール・ディクショナリの「グローバル」タブの使用

12.4.4 Oracle Business Rulesディクショナリで実行時にバケットセットを表示する方法

ディクショナリを開き、「バケットセット」タブを選択すると、ディクショナリにバケットセットが含まれている場合、表にすべてのバケットセットが表示されます。リンク先ディクショナリのバケットセットもバケットセット表に表示されます。リンクされたバケットセットを選択し、「編集」ボタンをクリックしてバケットを表示できます。ただし、リンクされたバケットセットは、編集モードでも編集できません。

Oracle SOAコンポーザの編集モードの詳細は、第12.5項「ディクショナリの実行時の編集および保存のスタート・ガイド」を参照してください。

Oracle SOAコンポーザでバケットセットを表示する手順は、次のとおりです。

1. Oracle SOAコンポーザの「開く」メニューから、「ルールを開く」を選択します。

2. ディクショナリを開いた後に、左側のペインから「バケットセット」タブを選択します。図12-12に示すように、バケットセット表が表示されます。

図12-12 Oracle SOAコンポーザのルール・ディクショナリの「バケットセット」タブの使用

12.4.5 リンク先ディクショナリ名を実行時に表示する方法

Oracle SOAコンポーザでは、現在のディクショナリのリンク先のディクショナリの名前を、図12-13に示すように左側のパネルの「リンク」タブを使用して表示できます。現在、編集モードで可能なのは、リンクされたディクショナリ名の表示のみで、ディクショナリに対してのリンクやディクショナリへの既存のリンクの削除はできません。

Oracle SOAコンポーザでリンク先のディクショナリ名を表示する手順は、次のとおりです。

1. Oracle SOAコンポーザの「開く」メニューから、「ルールを開く」を選択します。

2. ディクショナリを開いた後に、左側のペインから「リンク」タブを選択します。図12-13に示すように、リンク表が表示されます。

図12-13 リンク先ディクショナリ名の表示

リンク表にはリンク先のディクショナリの名前(この場合はCreditRatingRules)が表示されます。

12.4.6 Oracle Business Rulesディクショナリで実行時にデシジョン関数を表示する方法

Oracle SOAコンポーザでは、現在のディクショナリで使用可能なデシジョン関数を、図12-14に示すように、左側のパネルの「デシジョン関数」タブを使用して表示できます。現在、編集モードで可能なのは、次のフィールドおよびオプションの変更のみです。

- 説明

- ルール起動制限

- ルール・フローの確認

- ステートレスにする

- 起動する使用可能なルールセット

デシジョン関数の作成、既存のデシジョン関数の名前の変更、入力または出力の追加または削除は一切できません。

Oracle SOAコンポーザでデシジョン関数名を表示する手順は、次のとおりです。

1. Oracle SOAコンポーザの「開く」メニューから、「ルールを開く」を選択します。

2. ディクショナリを開いた後に、左側のペインから「デシジョン関数」タブを選択します。図12-14に示すように、デシジョン関数表が表示されます。

図12-14 デシジョン関数名の表示

デシジョン関数表にはすべての使用可能なデシジョン関数の名前(親とリンク先の両方、この場合はDecisionFunction_0とCreditRatingRules.DecisionFunction_0)が表示されます。

12.4.7 Oracle Business Rulesディクショナリで実行時にルールセットを表示する方法

図12-15に示すように、左側のパネルに、ディクショナリ内のルールセットが表示されます。ルールセットを選択して、ルールセットの詳細を表示できます。表示モードでは、ルールセットにあるすべてのルールが表示されますが、編集はできません。Oracle SOAコンポーザの編集モードの詳細は、第12.5項「ディクショナリの実行時の編集および保存のスタート・ガイド」を参照してください。

注意:

Oracle SOAコンポーザを編集モードで使用しても、ルールセットの作成または削除はできません。ルールセットの表示および変更は可能です。

図12-15 Oracle SOAコンポーザのルール・ディクショナリの「ルールセット」タブを使用したルールの表示

次のルールセットまたは前のルールセットを選択する手順は、次のとおりです。

1. Oracle SOAコンポーザで、ディクショナリを開いてルールセットを選択します。

2. ルールセットを表示している場合は、図12-16に示すように、「次のルールセットの選択」または「前のルールセットの選択」をクリックして次または前のルールセットを表示できます。

図12-16 Oracle SOAコンポーザのルール・ディクショナリの「ルールセット」タブを使用した、次のルールセットの選択

新しいルールセットを追加するには、左のナビゲーション・メニューの「ルールセット」の隣にある「ルールセットの追加」アイコンをクリックします。ルールセットの詳細は、第4章「ルールセットとルールの使用」を参照してください。

12.5 ディクショナリの実行時の編集および保存のスタート・ガイド

ディクショナリを選択して開くと、読取り専用モードで表示されます。表示モードの各タブから、「編集」メニューを選択して、ディクショナリ項目の編集モードを開始します。編集モードで変更を行った後、「保存」をクリックして、変更を保存します。変更を保存すると、ディクショナリが作業領域に保存されます。ディクショナリの実行時バージョンに変更を適用するには、「コミット」をクリックします。

変更を適用しない場合は、次のいずれかを選択して変更を元に戻すことができます。

- Oracle SOAコンポーザのメニューで「元に戻す」をクリックしてから、「未保存のすべての変更をクリアします。」を選択します。
未保存の変更のみがクリアされます。

- SOAコンポーザのメニューで「元に戻す」をクリックしてから、「すべてのセッション編集と保存された変更をクリアします。」を選択します。
既存の編集セッションの一部として行われた、すべての変更を中止します。

コンポジットを編集し、既存のコンポジットの上書きにより再デプロイする場合、その編集セッションは保存されます。ディクショナリを再度開くと、SOAコンポーザのダイアログ・ボックスが表示され、前の編集セッションに戻るかどうか確認されます。前の編集セッションに戻る場合は、このダイアログ・ボックスを利用します。

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

Oracle SOAコンポーザでは、ブラウザのロケールに基づき数値書式が変更されます。たとえば、英語(アメリカ)をブラウザ言語としてOracle SOAコンポーザを使用するとします。値として、34533223.2345などの浮動小数点データを入力します。フランス語など、その他の言語でデータを表示する場合は、次の手順を実行する必要があります。

1. ブラウザのロケールを、フランス語に対するインスタンスに合せて変更します。

2. ブラウザの「リフレッシュ」ボタンをクリックして、数値書式の変更を表示します。
フランス語では、この値は34533223,2345と表示されます。

注意:

Oracle SOAコンポーザでグルーピングおよび小数点セパレータを指定すると、ロケール固有の指定がオーバーライドされます。

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

あるディクショナリから、バケットセットまたはルールを切取りまたはコピーし、コンポーザで別のディクショナリを開いて貼り付けることができます。ただし、切取り/コピー/貼付けは、同一セッション内の異なるディクショナリ間で動作します。

切取り/コピーおよび貼付け機能により、最初から新規要素を作成しなくても、既存のルール要素に基づいて新規の要素をすばやく作成できます。

図12-17に示すアイコンの切取り、コピーおよび貼付けを選択して使用できます。

図12-17 切取り、コピー、貼付けの各アイコン

Oracle SOAコンポーザでは、次のルールの要素を切取り/コピーおよび貼付けできます。

- ルール

- パターン

- 条件

- アクション

- バケットセット

次に対しては、切取り/コピー/貼付けはサポートされていません。

- グローバル

- リンク

- バケット

- デシジョン関数

12.5.3 Oracle Business Rulesディクショナリで実行時にグローバルを編集する方法

Oracle SOAコンポーザで、「グローバル」タブを選択すると、ディクショナリ内のグローバルを一覧表示した表が表示されます。グローバルを編集するには、適切な行を選択すると、行全体が編集可能になります。必要に応じて変更を加えます。

図12-18 ディクショナリ内のグローバルのリスト

グローバルを追加するには、上にある「グローバルの追加」アイコンをクリックします。新しい空の行が追加されます。「名前」、「説明」、「値」、「バケットセット」、「タイプ」、「最後」、「定数」に必要な変更を加えます。グローバルの追加の詳細は、第2.3項「Oracle Business Rulesグローバルの使用」を参照してください。

グローバルを削除するには、行を選択して「削除」アイコンをクリックします。

12.5.4 Oracle Business Rulesディクショナリで実行時にバケットセットを編集する方法

Oracle SOAコンポーザで、「バケットセット」タブを選択すると、ディクショナリ内のバケットセットを一覧表示した表が表示されます。バケットセットを編集するには、適切な行を選択して「バケットセットの編集」アイコンをクリックし、バケットセット・エディタを表示します。バケットセットのタイプ、範囲、列挙またはLOVに応じて、対応する「バケットセットの編集」ページが表示されます。

「バケットセットの追加」アイコンをクリックし、タイプを選択して範囲バケットセットを作成できます。これにより、バケットセット表に新規行が追加されます。たとえば、日付、日時または時間などのDate型には、日付、時間およびタイムゾーンの選択用に「カレンダ」が表示されます。バケットを追加すると、範囲バケットのエンド・ポイントおよびLOVバケットの値がデータ型に基づいて自動的に追加されます。新たに追加されたバケットのエンド・ポイントや値は変更できます。エンド・ポイントまたは値を変更した場合、エイリアスが変更されることに注意してください。

バケットセットの追加の詳細は、第3.6項「バケットセットの使用」および第3.7項「バケットセットのビジネス条件との関連付け」を参照してください。

バケットセットを切取りまたはコピーするには、行を選択して「切取り」または「コピー」をクリックします。コピーしたバケットセットを貼り付けるには、「貼付け」をクリックします。

バケットセットを削除するには、行を選択して「削除」をクリックします。

範囲バケットセットを編集する手順は、次のとおりです。

1. Oracle SOAコンポーザで範囲バケットセットを編集するには、「バケットセット」タブを選択します。ディクショナリ内のバケットセットを一覧表示した表が表示されます。

2. 範囲バケットセットを編集するには、範囲バケットセットの適切な行を選択して「バケットセットの編集」アイコンをクリックします。図12-19に示すように、「バケットセット・エディタ」ページが表示されます。

図12-19 バケットセット・エディタを使用した範囲バケットセットの編集

3. バケットセット・エディタを使用して、バケットセットの適切なフィールドを編集します。「バケットの追加」をクリックしてバケットを追加することも、行を選択して「バケットの削除」をクリックし、バケットを削除することもできます。

4. 「OK」をクリックして、変更を確認します。

LOVバケットセットを編集する手順は、次のとおりです。

1. Oracle SOAコンポーザでLOVバケットセットを編集するには、「バケットセット」タブを選択します。ディクショナリ内のバケットセットを一覧表示した表が表示されます。

2. LOVバケットセットを編集するには、LOVバケットセットの適切な行を選択して「バケットセットの編集」アイコンをクリックします。図12-20に示すように、「バケットセット・エディタ」ページが表示されます。

図12-20 「バケットセット・エディタ」ダイアログによるLOVバケットセットの編集

3. バケットセット・エディタを使用して、バケットセットの適切なフィールドを編集します。「バケットの追加」をクリックしてバケットを追加することも、行を選択して「バケットの削除」をクリックし、バケットを削除することもできます。

4. バケットセット内のバケットの順番を変更するには、バケットを選択してから上矢印または下矢印を使用して、選択されたバケットを移動します(図12-21)。
バケットの相対位置を変更できるのはLOVバケット・セット内のみです。範囲バケットセット内のバケットを並べ替えることはできません。

図12-21 バケットセット内のバケットの移動による値の順番の変更

5. 「OK」をクリックして、変更を確認します。

12.5.5 バケットセットの編集に関する必知事項

バケットの「アクションで許可済」フィールドが選択されている場合のみ、デシジョン表の条件セルのドロップダウンにバケットセットが表示されます。

メニュー・バーの「検証」をクリックして、バケットセットの変更中にディクショナリを検証します。

12.5.6 Oracle Business Rulesディクショナリで実行時にディクショナリ・リンクを使用する方法

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

Oracle SOAコンポーザを使用してディクショナリをリンクすることはできません。ただし、デプロイされたコンポジットにリンクされたディクショナリがすでに存在する場合は、Oracle SOAコンポーザを使用してリンク先ディクショナリ名を表示し、リンク先ディクショナリのグローバル、バケットおよびルールセットをアプリケーション間で利用できます。たとえば、Dict1というディクショナリを含むApp1というアプリケーションがあるとします。Dict1は、Dict2という別のディクショナリにリンクされているとします。Dict1がDict2にリンクされているため、Dict2のオブジェクトをApp1で利用できます。

リンク先ディクショナリ名の表示の詳細は、第12.4.5項「リンク先ディクショナリ名を実行時に表示する方法」を参照してください。

Oracle SOAコンポーザの編集モードでは、リンク表の「接頭辞リンク名」チェック・ボックスを使用して、ディクショナリ内のすべての項目(グローバル、バケットセット、ルールセットなど)の前にリンク先のディクショナリ名を表示するか、または非表示にすることが可能です。チェック・ボックスを選択すると、リンク先ディクショナリのファクトの前にディクショナリ名が付加され、選択を解除するとリンク先ディクショナリのファクトの接頭辞が非表示になります。デフォルトでは、図12-22に示すように、「接頭辞リンク名」チェック・ボックスは選択された状態になっています。

図12-22 「リンク」タブ

図12-23には、3つのバケットセットが示されています。現在のディクショナリの「Rating」と、ベース・ディクショナリである「CreditRatingRules」の「Bucketset_1」および「Bucketset_2」です。「Bucketset_1」、「Bucketset_2」とも前に「CreditRatingRules」が付加されています。

図12-23 接頭辞として付加されたリンク先ディクショナリ名の表示

図12-24に、「リンク」タブで「接頭辞リンク名」チェック・ボックスの選択を解除した後の「Rating」バケットセット名を示します。この場合、バケットセット名の前に、リンクされたディクショナリ名は付加されていません。

図12-24 接頭辞として付加されたリンク先ディクショナリ名の非表示

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

12.5.7 Oracle Business Rulesディクショナリで実行時にデシジョン関数を編集する方法

Oracle SOAコンポーザの編集モードで、「デシジョン関数」タブを選択すると、親とリンク先の両方のディクショナリで利用可能なデシジョン関数を一覧表示した表が表示されます。

現在、編集モードで可能なのは、次のフィールドおよびオプションの変更のみです。

- 説明

- ルール起動制限

- ルール・フローの確認

- ステートレスにする

- 初期アクション

- ルールセットおよびデシジョン関数

デシジョン関数を編集する手順は、次のとおりです。

1. デシジョン関数を編集するには、Oracle SOAコンポーザで「デシジョン関数」タブを選択します。ディクショナリ内のデシジョン関数を一覧表示した表が表示されます。

2. 適切なデシジョン関数の行を選択して、表の上にある「デシジョン関数の編集」アイコンをクリックします。図12-25に示すように、「デシジョン関数エディタ」ダイアログ・ボックスが表示されます。

図12-25 「デシジョン関数エディタ」

3. 必要に応じて「説明」フィールドに説明を入力します。

4. 必要な数値を「ルール起動制限」リストで入力します。デフォルトで選択されている値は「無制限」です。ただし、「ルール起動制限」に整数値を入力して[Tab]キーを押すこともできます。新しく指定された値は、「ルール起動制限」リストに追加されます。

5. 適切なデシジョン関数オプションを選択します。

- ルール・フローの確認: このオプションを選択すると、ルール・フローが確認されるよう指定されます。

- ステートレスにする: 選択すると、デシジョン関数がステートレスに指定されます。

次のものは編集できません。

- 「名前」フィールド

- 「入力」タブ

- 「出力」タブ

6. 「初期アクション」タブでは、アサートする前に入力ファクトを変更したり、ルールセット・スタックを変更したり、有効日を設定したり、出力ファクトをアサートしたりするために使用できるアクションを追加できます。これらのアクションは、ルールのかわりに使用したり、ルールを実行するための環境「設定」のために使用できます。入力がアサートされてルールが実行される直前に、初期アクションが必ず実行されます。入力がアサートされる直前に、アクションに対するRLが実行されます。
「初期アクション」タブを使用して、1つのデシジョン関数(DF1)で別のデシジョン関数(DF2)をコールする場合を考えてみます。DF1は、Ruleset1をルールセット・スタックに追加するように構成されています。DF2は、Ruleset2を追加するように構成されています。DF1では、初期アクションを実行する前に、Ruleset1をルールセット・スタックに追加します。次に、DF2がコールされると、Ruleset2も追加されます。つまり、ルールの実行が開始されると、ルールセット・スタックによって、両方のルールセットのルールが起動します。Ruleset2を追加する場合(初期アクションでDF2をコールしているため)、DF1の初期アクションを使用して、DF2をコールする前にルールセット・スタックをクリアし、DF2をコールした後でスタックにRuleset1を追加できます。

図12-26に示すように、assert、call、modifyからif、else、elseif、while、for、if (高度)およびwhile (高度)といった条件付きアクションにおよぶ、あらゆる必要なアクションを追加できます。

図12-26 初期アクションの追加

if (高度)およびwhile (高度)構造は、ブール値のみを受け付けます。アクション条件ごとに異なるテスト・フォーム・タイプを追加できます。

注意:

「ルールセットおよびデシジョン関数」タブでデシジョン関数DF1にDF2が含まれている場合は、DF2には初期アクションが含まれていない可能性があります。

7. 「ルールセットおよびデシジョン関数」タブで、左右の矢印ボタンを使用して項目を「使用可能」ボックスから「選択済」ボックスへ移動します。

8. 「選択済」ボックスで項目を選択し、上矢印または下矢印の各ボタンを適宜クリックしてルールセットおよびデシジョン関数を並べ替えます。

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

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

Oracle Business Rulesディクショナリ・エディタのコンポジット宣言コンポーネントを使用して、あらゆるADFベースのWebアプリケーションでのルール・ディクショナリの編集機能を強化できます。Rules SDK2 APIを使用することで、グローバル、バケットセット、ルールセットなどのビジネス・ルール・メタデータ・アーティファクトを編集できます。

Oracle Business Rulesディクショナリ・エディタの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesディクショナリ・エディタの宣言コンポーネントの使用に関する項を参照してください。

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

ルール・ディクショナリ・エディタのタスク・フローは、ルール・ディクショナリ・エディタの宣言コンポーネントを囲むラッパーであり、宣言コンポーネントではなくタスク・フローを必要とするADFベースのWebアプリケーションで使用されます。

Oracle Business Rulesディクショナリ・エディタの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesディクショナリのタスク・フローの使用に関する項を参照してください。

12.6 Oracle Business Rulesディクショナリの実行時のルールの編集

Oracle SOAコンポーザの編集モードを使用して、ルールセット内のルールを編集、追加および削除できます。編集モードの使用方法の詳細は、第12.5項「ディクショナリの実行時の編集および保存のスタート・ガイド」を参照してください。

12.6.1 Oracle Business Rulesディクショナリで実行時にルールを編集する方法

Oracle SOAコンポーザを使用すると、ディクショナリ内のルールを編集できます。

Oracle SOAコンポーザを使用してルールを編集する手順は、次のとおりです。

1. Oracle SOAコンポーザで、Oracle Business Rulesディクショナリを開き、ルールセットを選択します。

2. 「編集」メニュー項目をクリックします。

3. 同じディクショナリを別のユーザーが現在編集中の場合、確認ダイアログが表示されます。確認ダイアログで、ドキュメントを編集するかどうかによって「いいえ」または「はい」をクリックします(「はい」をクリックすると、変更が他のユーザーの変更と競合する可能性があります)。詳細は、第12.10.1項「複数ユーザーでの実行時の編集に関する必知事項」を参照してください。

4. ディクショナリに対して加えられたすべての変更を保存する領域が作成され、「編集」メニューが「保存」メニューに変わります。

注意:

編集ビューではディクショナリに対するインタフェースが用意されており、ほとんどのディクショナリのコンポーネントを編集できます(一部のディクショナリのコンポーネントは、設計時にOracle JDeveloperのルール・デザイナ拡張機能を使用する場合のみ作成および編集が可能です)。

5. ディクショナリ内の項目を編集するには、ナビゲーション・タブで対象の項目を選択します。たとえば、図12-27では、ルールセットSetupRulesが選択されていることがわかります。

図12-27 Oracle SOAコンポーザを使用したディクショナリ内のルールセットの編集

6. 「保存」メニュー項目をクリックして、作業領域の変更を保存します。

12.6.2 ルールを実行時に追加する方法

Oracle SOAコンポーザでは、ルールセットにルールを追加できます。

ルールセットにルールを追加する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、図12-28に示すように「ルールの追加」をクリックします。ルールが現在のルールの次に、ただちに追加されます。これは、新しいルールが最後に追加されるルール・デザイナとは異なります。

図12-28 ルールセットへのルールの追加

新しいルールの追加先のルールセットに、既存のルールが含まれていない場合、次のいずれかを行うことができます。

- 「追加」アイコンのすぐ横の下矢印をクリックして、ルールセット領域の「ルールの追加」を選択します。

- ルール領域の「ルールの追加」アイコンをクリックします。

図12-29に、「追加」および「ルールの追加」の各アイコンを示します。

図12-29 新規ルールの追加

12.6.3 ルールを実行時に削除する方法

Oracle SOAコンポーザでは、ルールセット内のルールを削除できます。

ルールセット内のルールを削除する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 図12-30に示すように、「ルール」領域で削除するルールを特定し、「ルールの削除」をクリックします。

図12-30 ルールセット内のルールの削除

12.6.4 ルールの詳細設定の実行時の表示および編集方法

Oracle SOAコンポーザでは、ルールセット内のルールに対する詳細設定を編集できます。詳細設定の詳細は、第4.5項「ルールおよびデシジョン表での詳細設定の使用」を参照してください。

ルールの詳細設定を表示および編集する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、詳細設定を表示または変更するルールを特定します。必要であれば、最初にルールを展開しておきます。

3. ルール名の横にある「詳細設定の表示」アイコンをクリックします。図12-31に示すように、詳細設定が表示されます。

図12-31 ルールの詳細設定の表示および編集

12.6.5 ルール条件を実行時に追加する方法

Oracle SOAコンポーザでは、ルールセット内のルールに対する条件を追加できます。条件の使用の詳細は、第4.3項「ルールの使用」を参照してください。

ルール条件を追加する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、条件を追加するルールを特定します。

3. 図12-32に示すように、既存のルール条件の隣の下矢印をクリックして、条件の追加で使用可能なオプションのリストを表示します。

図12-32 ルールセットへの新規ルール条件の追加

条件の追加先のルールに既存の条件が含まれていない場合、図12-33に示すように、「テストの追加」下矢印をクリックして、使用可能な条件追加のオプションのリストを表示する必要があります。

図12-33 空白のルールに対する条件の追加

条件の追加に使用可能なオプションは、次のとおりです。

- 簡易テスト: 簡易テストの条件を追加します。

- 変数: 変数の定義を追加します。変数およびその値は、インラインのビジネス条件定義と表現されることがあります。

- (...): 新しい簡易テストをネストされた小カッコ内に追加します。

- not(...): 新しい簡易テストをNOTでネストされた小カッコ内に追加します。

各ネスト・レベルで、前述のオプションのリストが用意されており、ネストされたブロックで動作するようになっています。

12.6.6 ルール条件を実行時に削除する方法

Oracle SOAコンポーザでは、ルールセット内のルールに対する条件を削除できます。条件の使用の詳細は、第4.3項「ルールの使用」を参照してください。

ルール条件を削除する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、条件を削除するルールを特定します。

3. 図12-34に示すように、削除するルール条件の隣の下矢印をクリックし、リストの中から「テストの削除」をクリックします。

図12-34 ルールセット内のルール条件の削除

ネスト・レベルごとに独立したリストが使用できます。そのため削除操作は、単一の条件または1つのネストされたブロックに対して実行できます。

12.6.7 ルール条件を実行時に変更する方法

Oracle SOAコンポーザを使用すると、ルール内の条件を編集できます。ネストに対してルール条件を選択することも、条件内の式の値を変更することもできます。条件の使用の詳細は、第4.3項「ルールの使用」を参照してください。

ルール内の条件を変更する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、条件を変更するルールを特定します。

3. 「IF」領域で、「左の値」式アイコン、演算子のドロップダウン・リスト、「右の値」式アイコンを含む、コントロール、アイコンおよび選択ボックスを使用して条件を変更します。
式ではフィルタリングがサポートされています。たとえば、Employeeと入力すると、値がフィルタされ、Employeeを含む値がドロップダウンに表示されます。マウスまたは矢印キーを使用して値を選択します。

式ビルダー、条件ブラウザ、「日付」ブラウザおよび「右のオペランド」ブラウザを使用して、左右の側の式を編集できます。

値の変更のほか、条件のフォーム・タイプも変更できます。たとえば、簡易テストを変数定義などに変更できます。条件のフォーム・タイプを変更するには、図12-35に示すように、すぐ横のチェック・ボックスを使用して条件を選択し、必要なフォーム・タイプを「選択したテスト」リストから選択します。

図12-35 条件タイプの変更

12.6.8 ルール・アクションを実行時に追加する方法

Oracle SOAコンポーザでは、ルールにアクションを追加できます。ルール・アクションの使用の詳細は、第4.3項「ルールの使用」を参照してください。

ルール・アクションを追加する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、アクションを追加するルールを特定します。

3. 図12-36に示すように、ルールの「THEN」領域で、ルール・アクションの隣の「アクションの追加」をクリックします。

図12-36 ルールセットへのルール・アクションの追加

アクションの追加先のルールに既存のアクションが含まれていない場合、図12-37に示すように、「THEN」領域の「アクションの追加」アイコンをクリックする必要があります。

図12-37 アクションの追加

12.6.9 ルール・アクションを実行時に削除する方法

Oracle SOAコンポーザでは、ルール内のアクションを削除できます。ルール・アクションの使用の詳細は、第4.3項「ルールの使用」を参照してください。

ルール・アクションを削除する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、アクションを削除するルールを特定します。

3. ルールの「THEN」領域で、アクションを選択します。
図12-38に示すように、「アクションの削除」をクリックします。

図12-38 ルールセット内のルール・アクションの削除

12.6.10 ルール・アクションを実行時に変更する方法

Oracle SOAコンポーザでは、ルール内のアクションを変更できます。ルール・アクションの使用の詳細は、第4.3項「ルールの使用」を参照してください。

ルール・アクションを変更する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、アクションを変更するルールを特定します。

3. 図12-39に示すルールの「THEN」領域では、次のことが可能です。

- 上の「追加」および「削除」アイコンを使用した、アクションの追加および削除。

- アクションを選択し、各矢印アイコンを使用して上下に移動させることができます。

- 上の「切取り」、「コピー」および「貼付け」アイコンを使用した切取り、コピーおよび貼付け。

- ドロップダウン領域の「詳細....」リンクをクリックして「ターゲットの選択」ポップアップを起動し、値を選択できます。

- ルール・アクションの隣の「プロパティの編集」アイコンをクリックして、プロパティを変更できます。

図12-39 「プロパティの編集」アイコン

図12-40に示すように、「プロパティ」ダイアログ・ボックスが表示され、そこでプロパティの詳細を変更できます。

図12-40 「プロパティ」ダイアログ・ボックス

ルールの数値書式の詳細は、第12.5.1項「Oracle SOAコンポーザにおけるローカライズされた数値書式に関する必知事項」を参照してください。

12.6.11 拡張モードのルールの実行時の使用方法

Oracle SOAコンポーザでは、ルールセット内の拡張モードのルールを使用できます。拡張モードのルールの使用の詳細は、第4.7項「拡張モードのルールの使用」を参照してください。

拡張モードのルールを表示および変更する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、拡張モードのルールを表示または変更するルールを特定します。

3. 「詳細設定の表示」アイコンをクリックし、詳細設定を表示します。詳細設定の表示の詳細は、第12.6.4項「ルールの詳細設定の実行時の表示および編集方法」を参照してください。

4. 「拡張モード」アイコンが選択されていない場合は、「拡張モード」アイコンを選択します。図12-41に示すように、拡張モードのルール・オプションが表示されます。

図12-41 拡張モードのルール・オプションの表示

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

拡張モードのルール・オプションを使用すると、パターンに条件およびアクションを追加、変更、削除するだけでなく、パターンを作成、変更および削除できます。

拡張モードのルール・オプションを使用すると、次のことが可能です。

- パターン変数の指定および変数のファクト・タイプの選択: 「変数」フィールドに、パターン変数の名前を直接入力できます。図12-42に示すように、「ファクト・タイプ」リストを使用して、変数のファクト・タイプを指定できます。

図12-42 パターン変数およびファクト・タイプの指定

図の例では、CustomerOrderがCustomerOrderファクト・タイプのパターン変数です。

- パターンの追加: 「パターンの追加」アイコンをクリックして、既存のルールに対するパターンを作成します。図12-43は、追加済のパターンを示しています。新しく作成されたパターンは空です。

図12-43 パターンの追加

- パターンの削除: 「パターンの削除」アイコンをクリックし、ルールからパターンを削除します。図12-44に、パターンの削除方法を示します。

図12-44 パターンの削除

- 連結詞の指定: 2つ以上のパターンを、連結詞andまたはorで連結します。連結詞のリンクを使用して、連結詞間の切り替えを行うことができます。

- ネスト・パターンの使用: ネスト・パターンには、その内側にパターンが存在します。これらは中カッコ({})で囲まれています。「パターン演算子」リストの後ろに開き中括弧が続きます。図12-45に示すように、「パターンを括弧で囲む」アイコンをクリックして、ネスト・パターンを作成できます。また、ネストしているパターンを「パターンから括弧を削除する」アイコンをクリックして削除できます。

図12-45 ネストしたパターンの追加および削除

同じパターン・ブロックに別のパターンを追加するだけでなく、図12-46に示すように、開き中括弧の中でパターンを指定してから「テストの追加」の下矢印をクリックして、ネスト・パターンに対して条件を追加できます。

図12-46 パターン条件の挿入

ネスト・パターン・ブロックは、閉じ中括弧で終わります。ネスト・パターンは複数レベル持つことができます。つまり、あるネスト・パターンの内側に、別のネスト・パターンを持つことができます。図12-47に示すように、「ネスト・パターン・ブロックの削除」アイコンをクリックすると、ネスト・パターン・ブロック全体を削除できます。

図12-47 ネスト・パターン・ブロックの削除

パターンをネストすると、演算子のリストには、デフォルトの演算子として「(次の各ケース)」が選択された状態で表示されます。図12-48に示すように、その他の項目は「次のケースがある」、「次のケースがない」および「集計」です。

図12-48 パターン演算子の選択

演算子として「次のケースがある」または「次のケースがない」を選択した場合も、ユーザー・インタフェースは「(次の各ケース)」と同じままです。ただし、「集計」を選択した場合は、ユーザー・インタフェースが変更されます。集計演算子に対しては、必ず「使用可能」フィールドに変数を入力し、「関数」リストから関数を選択してください。「関数」リストには、次のものが表示されます。

- count

- average

- maximum

- minimum

- sum

- collection

count関数を除いたすべての関数では、式が必要です。「選択可能」フィールドに式を指定するか、または「条件ブラウザ」ウィンドウを起動できます。

図12-49に、ネスト・パターンを示します。ここでnumPriceyは変数名、countは関数名です。

図12-49 Count集計演算子

ルールの拡張モードの「THEN」の部分では、図12-50に示すように、assert、call、modifyからif、else、elseif、while、for、if (高度)およびwhile (高度)といった条件付きアクションにおよぶ、あらゆる必要なアクションを追加できます。

図12-50 手続き型ルール

12.6.12 ツリー・モードのルールの実行時の使用方法

Oracle SOAコンポーザでは、ルールセット内のツリー・モードのルールを使用できます。ツリー・モードのルールの使用の詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。

ツリー・モードのルールを表示および変更する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルール」領域で、ツリー・モードのルールを表示または変更するルールを特定します。

3. 詳細設定アイコンを選択し、詳細設定を表示します。詳細設定の表示の詳細は、第12.6.4項「ルールの詳細設定の実行時の表示および編集方法」を参照してください。

4. 「ツリー・モード」アイコンが選択されていない場合は、「ツリー・モード」アイコンを選択します。図12-51に示すように、ツリー・モードのルール・オプションが表示されます。

図12-51 ルールのツリー・モード・ルール領域の表示

12.6.13 Oracle SOAコンポーザでのルールのページングに関する必知事項

多数のルールを持つルールセットでは、ナビゲーションを容易にするため、Oracle SOAコンポーザのUIで複数ページにルールが表示されます。各ページには、6つで1セットのルールが含まれます。このページング機能により、ルールセットの持つ多数のルールがロードされた場合のパフォーマンスが確実に向上します。

Oracle SOAコンポーザではリストが用意されており、そこから選択対象のルールが存在するページに直接アクセスできます。また、リストの両側にある「前へ」および「次へ」ボタンをクリックして、前後のルールのセットに移動できます。

図12-52に、Oracle SOAコンポーザのルールのページング機能を示します。

図12-52 ルールのページング

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

Oracle Business Rulesエディタのコンポジット宣言コンポーネントを使用して、あらゆるADFベースのWebアプリケーションでのビジネス・ルールの編集機能を強化できます。Rules SDK2 APIを使用することで、ルールセットで使用可能なビジネス・ルールを編集できます。

Oracle Business Rulesエディタの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesエディタの宣言コンポーネントの使用に関する項を参照してください。

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

Oracle Business Rulesディクショナリ・エディタは、ADFベースのWebアプリケーションに埋め込むことができるコンポジット宣言コンポーネントです。Rules SDK2 APIを使用することで、グローバル、バケットセット、ルールセットなどのビジネス・ルール・メタデータ・アーティファクトを編集できます。

Oracle Business Rulesディクショナリ・エディタの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesディクショナリ・エディタの宣言コンポーネントの使用に関する項を参照してください。

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

Oracleルール・ディクショナリ・エディタのタスク・フローは、基本的にはルール・ディクショナリ・エディタの宣言コンポーネントを囲むラッパーです。このタスク・フローは、タスク・フローが必要なADFベースのWebアプリケーションで、宣言コンポーネントのかわりに使用されます。

Oracle Business Rulesディクショナリ・エディタのタスク・フローの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesディクショナリ・エディタのタスク・フローの使用に関する項を参照してください。

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

Oracle SOAコンポーザでは、ブラウザ・ウィンドウが用意されており、ルール式、XPATH式、日付式など、様々なタイプの式での作業を支援します。

Oracle SOAコンポーザで用意されている、各タイプのブラウザは次のとおりです。

- 式ビルダー

- 条件ブラウザ

- 「日付」ブラウザ

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

12.7.1 式ビルダー

式ビルダーは、XPATH式、ルール式などといった、様々なタイプの式の作成に使用されます。

式ビルダーには、式を直接入力できるフィールドがあります。また、「変数」、「関数」、「演算子」および「定数」の4つのタブがあります。これらの各タブでは、データがツリー構造で表示されます。「変数」タブでは、ルール・メタデータ内のすべての変数が表示されます。「関数」タブでは、ルール・メタデータ内のすべての関数が表示されます。「演算子」タブでは、+、-、*などといった演算子が表示されます。「定数」タブでは、ルール・メタデータ内に存在するすべての定数が表示されます。タブ間を切り替えてツリー内の項目を選択し、「式に挿入」ボタンをクリックして、選択された項目を「式」フィールドのカーソルのある位置に挿入できます。ツリー内で項目が選択されると、「コンテンツのプレビュー」および「説明」領域に、選択された項目の詳細情報が表示されます。いったん式を作成して「OK」をクリックすると、「式ビルダー」アイコンの左にある使用可能なフィールドに、新しく作成された式が表示されます。

図12-53に、「式ビルダー」ブラウザを示します。

図12-53 「式ビルダー」ブラウザ

12.7.2 条件ブラウザ

条件ブラウザは、フィールドと階層ツリーを持ち、内側に式ビルダーが埋め込まれています。フィールドに式を直接入力するか、ツリーから項目を選択できます。条件ブラウザでは、フィルタ処理がサポートされています。たとえば、customerと入力し始めると、customerと付いた項目でツリーが絞り込まれます。

ツリー内で項目が選択されると、新たに選択されたものが、ただちにフィールドに表示されます。埋め込まれている式ビルダーを使用して、式を作成することもできます。

いったん式ビルダーが起動され、式が作成されると、「条件ブラウザ」フィールドに新しい式が表示されます。いったん式を作成して条件ブラウザの「OK」ボタンをクリックすると、「条件ブラウザ」アイコンの左にあるフィールドに、新しく作成された式が表示されます。

図12-54に、条件ブラウザを示します。

図12-54 条件ブラウザ

12.7.3 「日付」ブラウザ

「日付」ブラウザは、リテラル日付または日付式の選択に使用されます。「日付」ブラウザには、リテラル日付と日付式間を切り替える2つのオプションがあります。一方のオプションが選択されている場合、もう一方は使用不可になります。

次のいずれかを選択します。

- 「カレンダ」ポップアップを使用して日付を入力する「リテラル日付」オプション

- 「日付式」フィールドに直接式を入力するか、条件ブラウザを起動して日付式を選択する「日付式」オプション

図12-55に「日付」ブラウザを示します。

図12-55 「日付」ブラウザ

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

「右のオペランド」ブラウザは、右の複数の式を選択するため使用されます。オペランドは各行に表示されます。「オペランド」フィールドに式を直接入力するか、「条件ブラウザ」を起動して、式を選択できます。「+」アイコンを使用すると、現在の行の後に行が追加されます。「-」アイコンを使用すると、現在の行が削除されます。これらのアイコンは選択された演算子に基づき、使用可能または使用不可になります。たとえば、in演算子では、右の複数の式が使用できます。そのため、この場合はアイコンが使用可能になります。

図12-56に、「右のオペランド」ブラウザを示します。

図12-56 「右のオペランド」ブラウザ

注意:

「右のオペランド」ブラウザを使用すると、右側の式に複数の値を入力できます。ただし、「日付」ブラウザを「右のオペランド」ブラウザの外側に置くことはできますが、その場合、入力可能な式は1つのみになります。これらのどちらのブラウザでも、右側の「式」フィールドに値を直接入力することはできません。いったんブラウザを使用して値を入力後に「OK」をクリックすると、ルールのUIに値がカンマ区切りの値として追加されます。

12.8 Oracle Business Rulesディクショナリのデシジョン表の実行時の編集

Oracle SOAコンポーザが編集モードの場合、ルールセット内のデシジョン表の編集、追加、削除を行うことができます。編集モードの使用方法の詳細は、第12.5項「ディクショナリの実行時の編集および保存のスタート・ガイド」を参照してください。

12.8.1 デシジョン表の実行時の追加

Oracle SOAコンポーザでは、ルールセットにデシジョン表を追加できます。デシジョン表の使用の詳細は、第5.1項「デシジョン表の使用の概要」を参照してください。

ルールセットにデシジョン表を追加する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 図12-57に示すように、「ルールセット」領域で「追加」をクリックしてから「デシジョン表の追加」をクリックします。

図12-57 ルールセットへのデシジョン表の追加

図12-58に示すように、空のデシジョン表が表示されます。

図12-58 空のデシジョン表

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

Oracle SOAコンポーザを使用すると、デシジョン表に条件行を追加できます。

デシジョン表に条件行を追加する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、「ビュー」ボックスから条件を追加するデシジョン表を選択します(例: Decision Table 1)。

2. デシジョン表のツールバーの「追加」アイコンの隣のリストから、「条件の追加」を選択すると、「条件ブラウザ」ウィンドウが表示されるので、そこで条件を指定または選択できます。
選択または指定された条件行と、ヘッダー「R1」の付いた「ルール」列が表に追加されます。「R1」の下のセルには、"?"マーク(図12-59)が付いています。"?"マークは、セルに値がまだ格納されていないことを示しています。

図12-59 新規デシジョン表に追加された新しい条件行

既存の条件行がある表に条件を追加する場合は、空のデシジョン表に条件を追加する場合と同様に、条件の詳細を指定するよう要求されます。いったん詳細が入力されると、指定された条件が最終の条件行として追加されます。図12-60に示すように、新しい行の各「ルール」列の下の条件セルにも、"?"マークが付いています。

図12-60 デシジョン表の最終行として追加された新しい条件行

デシジョン表で使用されるすべての記号の詳細は、第12.8.4.1項「デシジョン表のセルの編集」を参照してください。

3. 指定された条件を編集する場合は、図12-61に示すように、「条件」領域で条件行をクリックしてから、ツールバーの「条件の編集」アイコンをクリックします。「条件ブラウザ」が表示されます。

図12-61 デシジョン表に対する条件の編集

4. 「条件ブラウザ」でクリックして変数を選択するか、「式ビルダー」アイコンをクリックして「式ビルダー」を表示し、式を入力します。
式ビルダーを使用すると、式が作成できます。

5. 各条件行には、各セルの値を取り出すバケット・セットが必要です。選択した値にグローバル・バケット・セットが関連付けられている場合は、デフォルトでバケット・セットに条件行が関連付けられます。
その値に関連付けられているグローバル・バケットセットがない場合は、デシジョン表に条件行を追加した後、既存のグローバル・バケットセットを指定するか、ローカル値リスト・バケットセットまたはローカル範囲リスト・バケットセットを作成する必要があります。

バケットセットを条件と関連付けるには、次のいずれかを実行します。

- 図12-62に示すように、「条件」領域で条件を選択し、既存のバケットセットを「バケットセットの選択」リストから選択します。

図12-62 既存のバケットセットと条件行の関連付け

- 図12-63に示すように、「条件」領域で条件を選択し、「ローカルの値リスト」または「ローカルの範囲リスト」のいずれか(適切なもの)を「バケットセットの選択」リストから選択します。

図12-63 「ローカルの値リスト」または「ローカルの範囲リスト」の条件行との関連付け

図12-64に示すように、選択された条件用のバケットセットを、「バケットセットの編集」アイコンをクリックして編集できます。

図12-64 バケットセットの編集

「バケットセット・エディタ」が表示されるので、そこでバケットの追加、編集または削除ができます。「ローカルの値リスト」バケットセットを編集する場合は、バケットセット内のバケットの並べ替えも行えます。

バケットセットの数値書式の詳細は、第12.5.1項「Oracle SOAコンポーザにおけるローカライズされた数値書式に関する必知事項」を参照してください。

6. 必要に応じて手順2から手順5を繰り返し、デシジョン表にさらに条件行を追加します。

条件行の追加の詳細は、第5.2.2項「デシジョン表への条件行の追加方法」を参照してください。

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

Oracle SOAコンポーザでは、デシジョン表にアクションを追加できます。

デシジョン表にアクションを追加する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、アクションを追加するデシジョン表を選択します。

2. 「追加」アイコンの横にあるリストから「アクションの追加」を選択し、リストから使用可能なアクションを選択します。たとえば、図12-65に示すように、「変更」をクリックします。

図12-65 デシジョン表へのアクションの追加

図12-66に示すように、「アクション・エディタ」ウィンドウが表示されます。

図12-66 「アクション・エディタ」ウィンドウ

第5章「デシジョン表の使用」の表5-1に、使用可能なアクションが記載されています。

3. 「アクション・エディタ」ウィンドウで、アクションの対象を選択してからアクション・セルで値を指定します。
バケットセットの数値書式の詳細は、第12.5.1項「Oracle SOAコンポーザにおけるローカライズされた数値書式に関する必知事項」を参照してください。

デシジョン表へのアクションの追加の詳細は、第5.2.3項「デシジョン表へのアクションの追加方法」を参照してください。

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

Oracle SOAコンポーザを使用すると、デシジョン表にルールを追加できます。

デシジョン表にルールを追加する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、ルールを追加するデシジョン表を選択します。

2. 図12-67に示すように、「追加」アイコンの横にあるリストから「ルールの追加」を選択します。

図12-67 デシジョン表へのルールの追加

図12-68に示すように、追加されたルール用の新しい列が表示されます。

図12-68 デシジョン表内の追加されたルール

注意:

空のデシジョン表にルールを追加する場合は、「条件ブラウザ」ウィンドウが表示され、条件を選択または指定後に条件行が自動的に追加されます。

新しいルールがデシジョン表の先頭のルールとして追加され、その他のルールはバケット値の順序が定義どおりに保たれるように、必要に応じて移動することに注意してください。これは「バケットによるルールの順序付け」がデフォルトで有効になっているためです。これは、デシジョン表でのルールの順序付けが、条件式に関連付けられているバケットの相対位置によって設定されることを意味します。ルールを追加するときに「バケットによるルールの順序付け」が有効でない場合、新しいルールはデシジョン表の最後のルールとして追加されます。どちらの場合も、新しいルールの列のセルには、セルに値がまだ設定されていないことを示す「?」という記号が表示されます。

表で使用されるすべての記号の詳細は、第12.8.4.1項「デシジョン表のセルの編集」を参照してください。ルールの順序付けの詳細は、第12.8.4.2項「デシジョン表でのルールの順序の操作」を参照してください。

3. セルをダブルクリックして、条件セルに値を入力します。

注意:

条件セル(また、その他すべてのセル)への値の入力は、セルのダブルクリックによってのみ可能です。

4. 「アクション」行をダブルクリックしてアクション・セルの値を入力します。

注意:

列幅が足りないため、デシジョン表のセルの内容の全体が表示されない場合は、マウス・ポインタを移動してセルに重ねることで内容を表示できます。

12.8.4.1 デシジョン表のセルの編集

デシジョン表内の各ルールには、「条件」、「競合」および「アクション」の3つのセクションに属するセルが含まれます。

条件セルの使用

表示モードでは、"?"マークの付いた条件セルは、セルに条件値が格納されていないことを示します。セルに2つ以上の値が指定されている場合は、セミコロン区切りの値リストがセルに表示されます。

編集モードでは、(つまり、条件セルをダブルクリックした場合)指定された条件値が、複数選択リストで条件セルに表示されます。図12-69に示すように、新しいルールを編集する場合や条件値が指定されていない場合は、条件セルは空になっています。

図12-69 未指定の条件値

「すべて」を選択した場合は、次のように動作します。

- 特定の条件セルをダブルクリックした場合は、セルに"All"と表示されます。

- 特定の条件セルが選択されていない場合は、セルに"-"記号が表示されます。

図12-70に、デシジョン表の編集モードで値"All"が表示されている条件セル、"-"記号が表示されているセル、およびセミコロン区切りの値リストが表示されているセルを示します。

図12-70 条件に対するAll値の表示

条件値のリストから、使用可能な任意の値を選択できます。

注意:

条件セルの編集の際に、「バケットによるルールの順序付け」が選択されている場合、デシジョン表がリフレッシュされ、編集されたルール列が選択された条件セルの値により左または右へ移動します。

注意:

条件と関連付けられたバケットセットは、条件をクリックすると変更できます。バケットセット・リストと「バケットセットの編集」アイコンが使用可能になり、関連したバケットセットの編集ができるようになります。

アクション・セルの使用

アクションを追加する際は、指定されたアクション・タイプのアクション行が作成されます。アクション・セルには、次の2つのタイプがあります。

- 「アクション・フォーム」セル。チェック・ボックスを含みます。ルールの起動の際に、選択されたアクションのみが実行されます。図12-71では、「R1」および「R3」アクション・チェック・ボックスが選択されているのに対し、その他のアクション・チェック・ボックスは選択解除されています。この場合、「R1」が起動するとアクションが実行されますが、「R2」が起動してもアクションは実行されません。

注意:

「アクションの編集」アイコンは、「アクション・フォーム」セルの行が選択されている場合のみ、使用可能になります。「アクションの編集」アイコンを使用すると、「アクション・エディタ」ウィンドウが起動します。

- 「アクション・パラメータ」セル。「アクション・フォーム」のパラメータが含まれます。各フィールドにアクション・パラメータ値を直接入力するか、「条件ブラウザ」ウィンドウを起動して値を選択できます。

図12-71に、両方のタイプのアクション・セルを示します。編集モードの「アクション・パラメータ」セルには、「編集」フィールドがあり、その隣に「条件ブラウザ」アイコンが付いているのがわかります。

図12-71 デシジョン表のアクション・セル

図12-72に、「アクション・パラメータ」セルの値を選択できる、「アクション・エディタ」ウィンドウを示します。「常に選択」チェック・ボックスを選択した場合は、特定のアクション・フォーム用のチェック・ボックスがすべて選択されます。指定されたアクションが常に選択のため、アクション・フォームに属するすべてのチェック・ボックスも使用不可になります。

図12-72 「アクション・エディタ」ウィンドウ

注意:

デシジョン表のすべての条件セルおよびすべてのアクション・セルは一括で削除できます。次の図に示すように、「条件」または「アクション」の各ボックスをクリックすると、デシジョン表のすべての条件またはアクションがそれぞれ選択されます。

その後、デシジョン表のツールパーにある「削除」アイコンをクリックすると、条件またはアクションを削除できます。

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

図12-68に示すように、デシジョン表の「バケットによるルールの順序付け」チェック・ボックスは、デフォルトで有効になっています。つまり、条件行に関連付けられているバケット・セット内のバケットの順序によって条件セルの順序が決まり、それに従いルールの順序も決まります。

デシジョン表のルールの順序を変更するには、バケットセット内のバケットの順序を変更する必要があります。たとえば、デシジョン表でのルールの順序付けは、条件行に関連付けられているLOVバケット・セット内のバケットの相対位置を変更することで操作できます。ただし、範囲バケットは並べ替えできないことに注意してください。

デシジョン表で「バケットによるルールの順序付け」チェック・ボックスが選択されている状態でルールを追加すると、デフォルトで新しいルールが先頭のルール列として追加されます。つまり、その他のルール列は、バケット値の順序が定義どおりに保たれるように、必要に応じて移動します。「バケットによるルールの順序付け」チェック・ボックスが無効な状態でルールを追加すると、新しいルールが最後のルール列として追加されます。「バケットによるルールの順序付け」チェック・ボックスをこれから選択すると、新しく追加されたルールが最初の列に移動します。

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

デシジョン表では、1つまたは複数のルールの削除が可能です。

デシジョン表のルールを削除する手順は、次のとおりです。

1. 削除する「ルール」列を選択します。

2. 「削除」アイコンをクリックします。

デシジョン表の複数のルールを削除する手順は、次のとおりです。

1. 削除する「ルール」列を選択します。

2. [Ctrl]キーを押し、キーを押したまま図12-73に示すように、その他の「ルール」列を選択します。

図12-73 複数のルールの選択

3. 「削除」をクリックします。

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

Oracle SOAコンポーザでは、ファクトに条件を追加することでデシジョン表にテストを定義できます。テストの定義とルール条件の使用方法の詳細は、第4.3項「ルールの使用」を参照してください。

注意:

さらに複雑な条件をファクトに追加するには、第12.8.11項「デシジョン表での拡張モード・オプションの使用」を参照して下さい。

デシジョン表にテストを追加する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、テストを追加するデシジョン表を選択します。

2. デシジョン表の名前の横の「詳細設定の表示」アイコン(二重の下矢印)をクリックします。「拡張モード」が選択されている場合は、チェック・ボックスの選択を解除します。

図12-74 デシジョン表で展開された「詳細設定」領域

3. デシジョン表のツールバーのすぐ上の、「テストの追加」の下矢印をクリックします。

4. 図12-75に示すように、次のいずれかのオプションを必要に応じて選択します。

- 簡易テスト

- 変数

- ネスト・テスト

- ネストされていないテスト

図12-75 テストの追加

5. フィールドのコントロールまたは「左の値」および「右の値」アイコン、また「演算子」リストを使用して、条件式を作成します。

図12-76 デシジョン表に追加された簡易テスト

注意:

デシジョン表にテスト条件がすでに含まれている場合は、既存の条件の端にある下矢印をクリックし、必要なテストのフォーム・タイプを選択して新しいテスト条件を追加できます。

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

デシジョン表の内容を変更して、すべてのケースに関する完全なルールセットを含む表の作成、または複数のケースに関して最小数のルールを提供する表を作成できます。分割操作と圧縮操作によって、デシジョン表の内容を操作できます。

表分割操作では、条件間でバケットの組合せごとにルールが作成されます。たとえば、2つのブール条件を持つデシジョン表には、2 x 2 = 4 のルールが作成されます。20のブール条件を持つデシジョン表では、2**20から100万のルールが作成されます。したがって、作成されるルールの数が少なく、アクション・セルに十分に収まる場合は、表分割を使用するのが適切です。

Oracle SOAコンポーザを使用すると、デシジョン表全体に分割を適用できます。ただし、分割操作を個々の条件行または条件セルに対して実行することはできません。

デシジョン表を分割する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、分割するデシジョン表を選択します。

2. 図12-77に示すように、「表の分割」アイコンをクリックします。

図12-77 デシジョン表の分割

Oracle SOAコンポーザを使用すると、ルールの条件を同一アクションとマージすることでデシジョン表を圧縮できます。そのため、表を圧縮するとデシジョン表から条件を削除できます。ただし、Oracle SOAコンポーザを使用する場合、2つ以上の条件セルをマージすることはできません。

デシジョン表を圧縮する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、圧縮するデシジョン表を選択します。

2. 図12-78に示すように、「表の圧縮」アイコンを選択します。

図12-78 デシジョン表の圧縮

デシジョン表の分割および圧縮の詳細は、第5.3項「デシジョン表の操作の実行」を参照してください。

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

デシジョン表では、欠落しているルールはギャップと呼ばれます。デシジョン表にギャップが発生するのは、各条件からの1つのバケットの組合せの一部がルールの対象でない場合です。

Oracle SOAコンポーザを使用すると、デシジョン表の欠落しているルールをチェックできます。

欠落しているルールのチェック手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、欠落しているルールをチェックするデシジョン表を選択します。

2. 図12-79に示すように、「デシジョン表」メニューの「ギャップ分析」アイコンをクリックします。

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

図12-80に示すように、「ギャップ分析」ウィンドウが表示されます。デシジョン表に追加する必要のあるルールを選択できます。

図12-80 「ギャップ分析」ウィンドウ

欠落しているルールのチェックの詳細は、第5.3.5項「デシジョン表のギャップのチェック方法」を参照してください。

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

デシジョン表内のルールが重複し、かつ異なるアクションが存在する場合、ルールが競合する可能性があります。2つのルールが重複するのは、その条件セルの1つ以上に共通するバケットがある場合です。ただし、競合のない重複は一般的であり、問題はありません。デシジョン表での競合の詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

Oracle SOAコンポーザを使用すると、デシジョン表内の競合を検出および解決できます。

デシジョン表の競合解決を実行する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、競合解決を実行するデシジョン表を選択します。

2. デシジョン表のツールバーで、「競合の表示」アイコンが選択されていることを確認してください。

3. デシジョン表の名前の横の「詳細設定の表示」アイコン(二重の下矢印)をクリックします。

4. 図12-81に示すように、「詳細設定」領域で「競合ポリシー」が「手動」に設定されていることを確認してください。これはデフォルトの競合ポリシーです。

図12-81 「競合ポリシー」の設定

注意:

競合ポリシーの詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

5. 図12-82に示すように、「競合解決」の下の「競合」行を選択してから、競合が存在しているルールをクリックして「競合解決」ウィンドウを表示します。

図12-82 「競合解決」ウィンドウ

6. 図12-83に示すように、「競合解決」ウィンドウで、競合するルールごとに「解決」フィールドでリストから解決を選択し、「OK」をクリックします。

図12-83 競合解決のオプション

デシジョン表の競合解決オプションの詳細は、第5.3.1.4項「デシジョン表の競合分析」を参照してください。

12.8.10 行から列への切替

Oracle SOAコンポーザでは、デシジョン表のツールバーの「行を列に切替」アイコンをクリックすることで、デシジョン表の行を列に変更できます。これによりルールを行として、また条件、アクションおよび競合を列として表示できます。

デシジョン表に多数のルールが存在する場合、行を列に切り替えることにより、ナビゲーションが容易になります。これはすべてのルールが一括して表示され、ルールの表示のため列をページングする必要がなくなるためです。

図12-84に、切替操作前のデシジョン表を示します。

図12-84 サンプルのデシジョン表

図12-85に、行を列に切替後のサンプルのデシジョン表を示します。

図12-85 行を列に切替

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

Oracle SOAコンポーザでは、ルールセットで拡張モードのルールを使用できるのと同様、デシジョン表でも拡張モードのルールが使用できます。拡張モードのルール・オプションを使用すると、パターンに条件およびアクションを追加、変更、削除するだけでなく、パターンを作成、変更および削除できます。拡張モードのルールの詳細は、第4.7項「拡張モードのルールの使用」を参照してください。

注意:

デシジョン表の上の<テストの挿入>リンクを使用して簡易テストを追加するには、第12.8.6項「デシジョン表でのテストの定義」を参照してください。

拡張モードのオプションを表示および使用する手順は、次のとおりです。

1. Oracle SOAコンポーザで、「ルールセット」ナビゲーション・タブからルールセットを選択し、さらに複雑なルールを追加するデシジョン表を選択します。

2. デシジョン表の名前の横の「詳細設定の表示」アイコン(二重の下矢印)をクリックします。

3. 「拡張モード」を選択します。

図12-86 デシジョン表で使用可能になった拡張モード

デシジョン表の拡張モード・オプションは、ルールセットの拡張モード・オプションとほぼ同じです。詳細は、第12.6.11.1項「拡張モード・オプションの使用」を参照してください。

12.8.12 デシジョン表の実行時の削除

Oracle SOAコンポーザでは、ルールセット内のデシジョン表を削除できます。デシジョン表の使用の詳細は、第5.1項「デシジョン表の使用の概要」を参照してください。

ルールセット内のデシジョン表を削除する手順は、次のとおりです。

1. 編集モードで、対象のルールセットを選択します。

2. 「ルールセット」領域の「ビュー」フィールドのリストから、削除するデシジョン表を選択します。

3. 図12-87に示すように、「デシジョン表の削除」をクリックします。

図12-87 「デシジョン表の削除」アイコンの選択

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

Oracle SOAコンポーザを使用して、テスト関数を定義できます。これはルールおよびデシジョン表の条件およびアクションで発生する、非常に長い式を短縮する手段を提供するものです。変数およびその値は、インラインのビジネス条件定義と表現されることがあります。テスト変数は、インライン・エイリアスとも呼ばれます。

したがって、次のような記述ではなく

次のように記述できます。

続いてテスト条件で、fooを式の一部として使用できます。簡単なものから複雑な式まで、あらゆる式にすることが可能です。

変数を定義するには、ルールの「IF」セクションで、「テストの追加」のすぐ横の下矢印をクリックし、リストから「変数」を選択する必要があります。

変数とは別に、簡易テスト、ネスト・テスト((...))およびNotネスト・テスト(not (...))などの、他のテスト・フォームのタイプを定義することもできます。

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

Oracle BPMを使用すると、一部のルール・コンポーネントの名前をローカライズできます。これらのエイリアスの変換バージョンを提供することで、次のアプリケーションを使用する際に、ユーザーがこれらのエイリアスを自分のブラウザの地域の設定に基づいて表示できるようになります。

- Oracle SOAコンポーザ

- 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つの列が存在し、一方にルール・コンポーネントの未変換の識別子が表示されています。図12-88に示すように、もう一方には英語のロケールが表示されています。

図12-88 Oracle SOAコンポーザの「変換」タブ

アプリケーションに他のロケールが定義されている場合は、それらもこの表に列として表示されます。詳細は、第2.6項「Oracle Business Rulesリソースのローカライズ」を参照してください。

2. 編集するロケールの列で、変換するエイリアスに対応するセルをダブルクリックします。

3. ローカライズされたエイリアスのテキストを入力します。

4. 手順2および3を繰り返して、ロケールに必要なすべてのエイリアスをローカライズします。

注意:

ロケール・ファイルのオフラインでの編集はサポートされていません。ロケールの追加の際は、生成されたxmlファイルにすべてのキーがデフォルトで含まれているわけではありません。これらは値が追加される際に追加されます。

エディタからローカライズすることもできます。エディタからローカライズを行うには、図12-89に示すように、「変換」アイコンをクリックします。

図12-89 エディタからローカライズを行うための「変換」アイコン

図12-90に示すように、「変換」ポップアップが表示されます。ルール・コンポーネントのエイリアスを入力し、「OK」をクリックします。

図12-90 「変換」エディタ

12.10 Oracle Business Rulesディクショナリの変更の実行時のコミット

ディクショナリの変更を検証した後は、MDSリポジトリに対してそれらの変更をコミットできます。

Oracle Business Rulesディクショナリに対して変更をコミットする手順は、次のとおりです。

1. 「コミット」メニュー項目をクリックします。

2. MDSリポジトリに変更を加えない場合は、「確認」ダイアログで「いいえ」をクリックします。

3. MDSリポジトリに変更を加える場合は、「確認」ダイアログで「はい」をクリックします。
第4.12項「リポジトリからJDeveloperへの実行時のルール変更のインポート」で説明されている作業に従い、実行時の変更をルール・エディタADFに忘れずに反映してください。

4. 編集セッションを保存して、コンポジットをデプロイした後にディクショナリを開くと、最後に保存された編集セッションが開きます。新しいディクショナリを開くには、トップ・メニューの「元に戻す」、「すべてのセッション編集と保存された変更をクリアします。」とボタンをクリックします。

注意:

検証エラーのあるディクショナリが保存される可能性がありますが、検証の問題の修正後でなければコミットされません。

12.10.1 複数ユーザーでの実行時の編集に関する必知事項

複数ユーザーが同じディクショナリを編集している場合は、ディクショナリが別のユーザーにより編集されているというメッセージが表示され、確認を求められます。複数のユーザーが1つのディクショナリで作業した場合、最後のコミットのみ持続します。

12.11 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コンソールで、エクスポートされるディクショナリを含むコンポジットを選択します。図12-91に、Fusion Middleware Controlコンソールで選択されたコンポジットを示します。

図12-91 SOAコンポジットを開く

2. 図12-92に示すように、右のパネルの「SOAコンポジット」ドロップダウン・リストをクリックし、「エクスポート」を選択します。

図12-92 「エクスポート」ユーティリティの選択

3. 図12-93に示すように、「コンポジットのエクスポート」ページから、「オプション1:デプロイ後のすべての変更を有効にしてエクスポート」を選択し、「エクスポート」をクリックします。

図12-93 デプロイ後のすべての変更のエクスポート

12.12 Oracle Business Rulesディクショナリの実行時の検証

Oracle SOAコンポーザでは、編集モードでディクショナリのエラーを検証できます。図12-94に示すように、ディクショナリ・レベルの検証エラーがOracle SOAコンポーザ・ウィンドウの下部の「検証」パネルに表示されます。

図12-94 「検証」パネル

注意:

Oracle SOAコンポーザでルールを開いても、「検証」パネルは閉じられたままです。Oracle SOAコンポーザのツールバーの「検証」ボタンをクリックすると、「検証」パネルが開き、その後のユーザーとの対話処理中も開かれた状態が維持されます。

ただし、「検証」パネルを手動で閉じたり、パネルのセパレータをドラッグしたりした場合は、自動での開閉機能は保証されません。

12.12.1 「検証」パネルの理解

「検証」パネルでは、すべてのディクショナリ・レベルの検証エラーがリストされます。「検証」パネルで行をダブルクリックすると、エラーになったコンポーネントが示されます。たとえば、「検証」パネルでバケットまたはバケットセットのエラーをダブルクリックすると、「バケットセット」タブに切り替わり、バケットセット名の隣に「無効」アイコンが表示されます。図12-95に示すように、「無効」アイコンの上にマウス・カーソルを移動して、バケットセットのエラー・メッセージのリストを表示できます。

図12-95 バケットセットの検証エラー・メッセージ

図12-96に示すように、「バケットセット・エディタ」ウィンドウが表示されると、エディタ内で無効なフィールドがハイライトされ、エラー・メッセージを含むポップアップが表示されます。

図12-96 バケットセット・エディタ内でハイライトされたエラーのエントリ

デシジョン表に属するエラーをダブルクリックした場合、図12-97に示すように、UIがデシジョン表のUIに切り替わり、「無効」アイコンの上にマウス・カーソルを移動すると、エラー・メッセージが表示されます。

図12-97 エラーになったコンポーネントへのアクセス

同様に、「検証」パネルで、ルールセット内のルールに属するエラーをダブルクリックすると、UIがルールが属するルールセットのものに切り替わり、ルールでエラーが起きているフィールドがハイライトされます。さらに、図12-98に示すように、ルールに属するすべてのエラーがポップアップに表示されます。

図12-98 ルールの検証

12.12.2 「検証」パネルの更新

「検証」パネルは、自動的には更新されないので、ディクショナリのコンポーネントになんらかの変更があったために生成される、新たな検証エラーは表示されません。

たとえば、なんらかのエラーがある新しいルールが追加された場合、「検証」パネルは自動的には更新されません。図12-99に示すように、Oracle SOAコンポーザ・メニューの「検証」ボタンをクリックして「検証」パネルを更新し、新たなエラーのエントリを表示する必要があります。

図12-99 「検証」ボタン

12.13 コンポジット情報およびディクショナリ情報の実行時の入手

ディクショナリが開かれている場合、「情報」ダイアログからディクショナリおよびコンポジットの詳細を入手できます。

ディクショナリの情報を入手する手順は、次のとおりです。

1. ドキュメントを開いた状態で、「情報」をクリックすると、ドキュメント・タイプ、コンポジットの詳細およびドキュメント・パスを入手できます。これにより図12-100に示すように、Oracle SOAコンポーザで開いているファイルの情報が表示されます。

図12-100 ダイアログを使用した、開いているディクショナリのドキュメント・パスの入手

12.14 タスクの実行時の使用

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.14.1 タスク・メタデータを実行時に表示する方法

Oracle SOAコンポーザでは、タスクまたはAMXのルールのメタデータを「開く」メニューを使用して開くことができます。

「開く」メニューを使用して、タスクまたはAMXのルールを開く手順は、次のとおりです。

1. Oracle SOAコンポーザの「開く」メニューから、図12-101に示すように「タスクを開く」を選択します。MDSに接続され、「開くタスクの選択」ダイアログ・ボックスが表示されます。このダイアログ・ボックスには、タスクおよびAMXのルールを含む、使用可能なコンポジット・アプリケーションがリストされます。

図12-101 タスクのオープン

注意:

従来のルールとAMXのルールは、命名規則により区別できます。

たとえば、コンポジットが次のアーティファクトを持つとします。

- <AMXタスク名>.tsk

- <AMXルール名>Rules.rules

この場合、Rules.rulesファイルがAMXのタスクと関連付けられたAMXのルール・ファイルなので、「開くタスクの選択」リストに、AMXタスクの一部として表示され、通常のOracle Business Rulesのリストの一部としては、表示されません。

2. 「開くタスクの選択」ダイアログ・ボックスで、タスクまたはAMXのルールを開くには、図12-102に示すように、表のエントリを選択して「開く」をクリックするか、項目をダブルクリックします。

図12-102 開くタスクの選択

選択したコンポジットにタスクのみが存在し、関連付けられたAMXのルールまたはルールセットがない場合、図12-103に示すように、「タスク」ウィンドウが表示されます。

図12-103 タスクのみが表示されたOracle SOAコンポーザ

コンポジットにタスクおよび関連付けられたAMXのルールまたはルールセットが含まれる場合は、図12-104に示すように、タスクとルールまたはルールセットの両方が、タブ付きのウィンドウに表示されます。

図12-104 タスクとAMXのルールの両方を表示したOracle SOAコンポーザ

12.14.2 タスクまたはAMXのルール・メタデータを実行時に構成する方法

タスク構成を使用すると、ビジネス・ユーザーと管理者は、ワークフロー・デザイナが自動的に構成したルールを参照できます。この事前定義済ルールは、特定の顧客向けに、適用可能な顧客企業ポリシーに基づいて変更できます。

Oracle SOAコンポーザでタスク構成を使用すると、承認フローに関連付けられた、イベント・ドリブン(タスクのみ)およびデータ・ドリブンの各ルール(関連付けられたAMXのルールが存在するタスク)を実行時に編集できます。

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

イベント・ドリブンの設定を構成する手順は、次のとおりです。

1. Oracle SOAコンポーザにログオンし、必要なタスクを開きます。

2. 図12-105に示すように、Oracle SOAコンポーザのメニュー・バーの「編集」をクリックして、編集のため選択されたタスクを開きます。

図12-105 編集するタスクのオープン

3. 図12-106に示すように、適切な編集を行い、「保存」をクリックします。

図12-106 タスクの構成の保存

次のオプションおよび設定を構成できます。

- タスク集計

- エラー通知

- 割当ておよびルーティング・ポリシー

- 有効期限とエスカレーションのポリシー

- 通知設定

- タスク・アクセス設定

承認集計の設定要件

タスク集計の要件として、次のいずれかを指定できます。

- なし

- タスクごとに1回

- ステージごとに1回

エラー通知

タスクでエラーが発生した場合、通知する必要があるユーザー名およびグループ名を指定できます。図12-107に示すように、「エラー通知時」検索アイコンをクリックして、「エラー割当て先の構成」ダイアログ・ボックスを表示する必要があります。そこでユーザー名またはグループ名を指定できます。

図12-107 エラー割当て先の指定

割当ておよびルーティング・ポリシーの設定

割当ておよびルーティング・ポリシーは、Oracle SOAコンポーザで使用可能なオプションを使用して設定できます。図12-111に、割当ておよびルーティング・ポリシーの設定で使用可能なオプションを示します。

図12-108 割当ておよびルーティング・ポリシーの設定

イベント・ドリブンの構成で使用可能な、割当ておよびルーティングのオプションの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のルーティング・ポリシーの手法に関する項を参照してください。

有効期限とエスカレーションのポリシーの設定

タスクの有効期限とエスカレーションのポリシーは、「有効期限およびエスカレーション・ポリシー」リストにある使用可能な項目を使用して設定できます。使用可能なリスト項目は、次のとおりです。

- 期限切れなし

- 期限切れまでの時間

- エスカレートまでの時間

- 期限更新までの時間

図12-109に、「有効期限およびエスカレーション・ポリシー」の設定用オプションのリストを示します。

図12-109 「有効期限およびエスカレーション・ポリシー」の設定

通知設定の構成

タスクの通知設定は、Oracle SOAコンポーザの「通知設定」セクションで使用可能なオプションを使用して構成できます。

図12-110に、タスクの通知設定の構成で使用可能な、様々なオプションを示します。

図12-110 「通知設定」の指定

タスク・アクセス設定の構成

アクセスルール設定は、ユーザーが実行できるアクションを制御するよう設定できます。コンテンツおよびアクションの権限も、作成者(イニシエータ)、所有者、割当て先、レビューアなどユーザーの論理上のロールに基づいて指定できます。

Oracle SOAコンポーザでは、図12-111に示すように、「タスク・アクセス」の下の使用可能なオプションを使用して、アクセス設定を設定できます。

図12-111 タスク・アクセスの設定の指定

タスク・アクセスの構成の詳細は、『Oracle Fusion Middleware Oracle Business Process Managementモデリングおよび実装ガイド』のセキュリティ・アクセス・ルールの定義方法に関する項を参照してください。

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

データ・ドリブンの設定を構成する手順は、次のとおりです。

1. Oracle SOAコンポーザにログオンし、必要なタスクを開きます。

2. 図12-112に示すように、Oracle SOAコンポーザのメニュー・バーの「編集」をクリックして、編集のため選択された、AMXのルールに関連付けられたタスクを開きます。

図12-112 編集のためのAMXルールのオープン

3. 図12-113に示すように、適切な編集を行い、「保存」をクリックします。

図12-113 AMXルールの構成の保存

実行可能な操作は次のとおりです。

- ルールの追加、更新および削除

- ルールのアサーションの変更(アサーションはルールの構成対象となったリスト・ビルダーのタイプによって異なります)

- 変数の追加

データ・ドリブンの設定の編集の詳細は、『Oracle Fusion Middleware Oracle Business Process Managementユーザーズ・ガイド』のデータ・ドリブンの設定の編集方法に関する項を参照してください。

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

この付録では、ルール・デザイナのファイルと名前に関する既知のネーミング制約と、Rules SDKの特定の制限事項について説明します。

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

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

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

この項では、ルール・デザイナの命名規則について説明します。

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項「文字列のクラス」

- B.2項「リストのクラス」

- B.3項「数値のクラス」

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

- B.5項「その他のクラス」

- B.6項「関数」

B.1 文字列のクラス

この項では、Oracle Business Rulesで提供される文字列関連のクラスについて説明します。

表B-1に、Stringクラスを示します。

表B-1 Stringクラス

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...)

list

引数を含む新しい不変リストを戻します。

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")

http://www.w3.org/TR/rif-dtb/ #func:timezone-from-dateTime_.28adapted_from_fn:timezone-from-dateTime.29

get seconds

sM

BigDecimal(XMLGregorianCalendar)

getSeconds

カレンダから小数部を含む秒数をBigDecimalとして取得します。XMLDate.get seconds("00:00:12.345")==12.345

http://www.w3.org/TR/rif-dtb/ #func:seconds-from-dateTime_.28adapted_from_fn:seconds-from-dateTime.29

表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"

http://www.w3.org/TR/xpath-functions/ #duration-subtypes

表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 関数

表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の参照可能なファクト・タイプのツリーをルートとしてアサート(作業メモリーに挿入)します。Returns arg1.

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

RL.assert

Object(Object)

assert

arg1をアサート(arg1を作業メモリーに挿入)します。Returns 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.contains

boolean(List,Object)

contains

contains()関数はJava Collectionのcontains()メソッドに似ていますが、コレクション内のJAXBElementの存在を処理する機能を持っています。

『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』

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に関するよくある質問を紹介します。

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

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

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

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

- 付録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「入力済要素を持つXMLスキーマをタイプJAXBElementとしてインポートするのはなぜですか。」

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

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

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

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

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 Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』の付録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つのスレッドの実行は、例C-1に示すように進むことがあります。

例C-1 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);

例C-1では、Thread-1がアサートした2つのファクトの両方が、runへのコール中にRuleSessionに存在することはありません。また、1つのスレッドのみがrunメソッドをコールすることに注意してください。共有RuleSessionで複数のスレッドからrunをコールできるデザインを使用すると、非常に見つけにくい不具合が作成される可能性があり、パフォーマンス上の利点はありません。

共有RuleSessionオブジェクトに対するすべてのアクセスを同期化して、意図した動作を保証する必要があります。ただし、RuleSessionインスタンスが例外をスローして回復不能になることがあるため、このオブジェクトを同期化オブジェクトとしては使用しないでください。かわりに、別の共有オブジェクトを同期点として使用します。

候補としては、共有サーバー・プロセス・プロデューサが考えられます。RuleSession用のコンシューマ・モデルです。このモデルでは、複数のスレッドが共有のRuleSessionにファクトをアサートし、1つのスレッドが定期的にrunをコールし、結果を読み取って出力します。これにより、2つのコード・セグメントが必ずシリアルに実行され、混在できなくなるので、スレッドの競合が発生しなくなります。例C-2、例C-3、例C-4の共有オブジェクト、プロデューサ・コード、コンシューマ・コードを使用したコード例を参照してください。

例C-2 RuleSessionの共有オブジェクト

RuleSession ruleSession;
Object ruleSessionLock = new Object();

例C-3 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-4 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のランタイム動作で極端な結果が生成されることがあります。

例C-5のOracle RLコードについて考えます。

例C-5 ファクトFを使用した自己結合

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();

例C-5で行がいくつ出力されるか考えます。f1とf2の両方については、同じファクト・インスタンスが一致できるため、答えは4行です。

したがって、例C-5では次の出力が生成されます。

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-6に示すように、テスト内に追加語句が必要になります。

例C-6 ファクトFのすべての組合せの検索

rule r1 {
if (fact F F1 && fact F F2 && F1 != F2) {
println("Results: " + F1.i + ", " + F2.i);
}
}

例C-6のコードでは、次の出力が生成されます。

Results: 2, 1
Results: 1, 2

ファクトのすべての組合せを検出する最も簡単な方法は、最速ではなく順序も不同ですが、例C-7に示したコードを使用するものです。

例C-7 ファクトFの組合せの検索

rule r1 {
if (fact F F1 && fact F F2 && id(F1) < id(F2)) {
println("Results: " + F1.i + ", " + F2.i);
}
}

例C-7に示した関数id()をテスト・パターンで実行すると直接比較よりも時間がかかるため、各オブジェクトで一意の値に対してテストするのが最も速い方法になります。たとえば、整数値プロパティoidを、クラスの各インスタンスの固有値を割り当てられたクラスに追加できます。

例C-8は、oid値を使用する同じルールを示しています。

例C-8 高速の完全比較

rule r1 {
if (fact F F1 && fact F F2 && F1.oid < F2.oid) {
println("Results: " + F1.i + ", " + F2.i);
}
}

この問題は、例C-9に示した関数を使用して、Oracle Rules Engineからすべての重複するファクトを削除しようとした場合にも生じることがあります。

例C-9 重複するファクトを取り消す不正な例

rule rRemoveDups {
if (fact F F1 && fact F F2 && F1.i == F2.i) {
retract(F2);
}
}

ただしこのルールでは、重複するファクトだけでなく、タイプFのすべてのファクトが削除されます。F1とF2が同じファクト・インスタンスの可能性があるからです。例C-10に、このルールの正しいバージョンを示します。

例C-10 重複するファクトを取り消す修正された例

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ファクト・タイプのみです。

他の制限は、付録D「デシジョン・サービスの入力と出力の要素タイプはどのように制限されますか。」を参照してください。

XMLファクト・タイプの参照可能オプションの設定の詳細は、第3.2項「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 Fusion Middleware 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)です。詳細は、第4.5.5項「ルールの優先度の設定方法」を参照してください。

ただし、ルールの純粋な宣言モデルが損なわれるため、できるだけ優先度の使用を避ける必要があることに注意してください。多数の優先度を使用していることに気づいた場合の最善策は、通常、競合を避けるようにルールおよびテストを再構築するか、特定の順序で実行することを意図する場合はルールフローを使用してルールを複数のルールセットに分割することです。競合は、ルールセット内の複数のルールが起動可能な場合に発生します。たとえば、gold customerルールでは$1000を超える支払がある顧客をgold customerとし、silver customerルールでは$500を超える支払がある顧客をsilver customerとする場合、顧客が$1100を支払うと競合が発生します。$500から$1000の間の支払の顧客をテストする場合、ルールに優先度を設定するよりも、silver customerルールを変更する方が明解です。こうした競合分析や競合回避は、デシジョン表を使用すると非常に簡単にできます。デシジョン表の詳細は、第5章「デシジョン表の使用」を参照してください。

ルールセットの順序を変更するには、ルールフローを使用します(これはルールセット・スタックです)。ルールセット・スタックの使用方法の詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。

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値を含めることができます。

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の使用時に発生する問題の回避策および解決方法について説明します。

内容は次のとおりです。

- 第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予約名はどのように処理したらよいですか。」

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 Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。

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)の仕様について説明します。

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

- 付録E.1「Oracle Business RulesとJSR-94実行セットの概要」

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

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

詳細な情報は、次を参照してください:

- 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ルール・セッションを作成できます。詳細は、付録E.2「Oracle Business RulesルールセットからのJSR-94ルール実行セットの作成」を参照してください。

Oracle Business Rulesルールセットにアクセスし、JSR-94 APIを使用してOracle Business Rules Engineに対して実行できます。詳細は、付録E.3「JSR-94インタフェースをOracle Business Rulesとともに使用」を参照してください。

Oracle Business Rulesには、便利なJSR-94 APIの拡張機能も用意されています。詳細は、付録E.3.4「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インタフェースを使用し、プログラム上で登録する必要があります。

詳細は、付録E.3.1「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に、ルール実行セットの作成に必要なマッピング要素を示します。例E-1には、RL LanguageテキストをJSR-94ルール実行セットにマッピングするためのサンプルのXML文書を示します。

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-1 Oracle RLプログラムで定義されたルールセットの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>

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

JSR-94は、URLを使用して指定したOracle RLルールセットとともに使用できます。URLを指定する際に使用できるJSR-94拡張機能の詳細は、「拡張されたcreateRuleExecutionSetを使用したルール実行セットの作成」を参照してください。

URLで指定したOracle RLテキストからルール実行セットを作成する手順は、次のとおりです。

1. Oracle RLのマッピング情報をXML文書に指定します。表E-2に、ルール実行セットの作成に必要なマッピング要素を示します。例E-2には、Oracle RLテキストをJSR-94ルール実行セットにマッピングするためのサンプルのXML文書を示します。

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 URLで定義されたルールセットのXMPマッピング・ファイル

<?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>

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固有の事項を説明します。

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メソッドにアクセスできます。

例E-3に、JSR-94 StatefulRuleSessionで引数なしのRL Language関数を起動する方法を示します。

例E-3 StatefulRuleSessionでのCallFunctionの使用

import javax.rules.*;
...
StatefulRuleSession session;
...
((oracle.rules.jsr94.RLStatefulRuleSession) session).callFunction("myFunction");

F ルール・レポータの使用

この付録では、ルール・レポータAPIを使用して、ルール・ディクショナリの内容のリストまたはレポートを作成する方法について説明します。

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

- 第F.1項「ルール・レポータの使用の概要」

- 第F.2項「ルール・レポータのコマンドライン・インタフェースの使用」

- 第F.3項「Javaでのルール・レポータの使用」

F.1 ルール・レポータの使用の概要

Oracle Business Rulesディクショナリが大きくなり、複雑さが増すと、ディクショナリの文書化およびルール・ディクショナリの内容についての他のユーザーとの伝達が重要になります。RuleReporterクラスを使用すると、ルール・ディクショナリの内容に関するリストまたはレポートを作成できます。これらのレポートを使用して設計を文書化し、ディクショナリの内容について伝達できます。

ルール・レポータを使用するには、次の2つの方法があります。

- コマンドラインでRuleReporterを実行します。

- JavaプログラムでRuleReporter APIを使用して、カスタム・レポートを作成します。

ルール・レポータはMarkupBuilderクラスを使用してGroovyプログラミング言語で記述されているため、単にフォーマットが異なるHTMLが必要か、またはまったく別のマークアップ言語を使用するかに関係なく、カスタム・レポータを容易に作成できます。GroovyはJavaに類似した動的言語であり、JVM上で実行され、Javaオブジェクトとシームレスに相互作用します。

F.1.1 ルール・レポータのHTMLスタイルシートに関する必知事項

JDEV_INSTALL/jdeveloper/soa/modules/oracle.rules_11.1.1/reporter.jarファイルには、スタイルシートoracle/rules/tools/reporter/style.cssが含まれています。このファイルをルール・レポータによって生成されるHTML出力ファイルと同じディレクトリに置くと、ページのレンダリングに使用される定義が提供されます。スタイルシートを変更して、HTMLレイアウトを変更できます。

F.1.2 RuleReporter APIに関する必知事項

RuleReporter APIの詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

F.1.3 ルール・レポータの依存Jarファイルに関する必知事項

コマンドラインまたはJava APIでルール・レポータを使用するには、クラスパスに必須JARファイルがすべて含まれている必要があります。

F.2 ルール・レポータのコマンドライン・インタフェースの使用

コマンドライン・スクリプトを実行すると、ディクショナリの内容をルール・レポートを使用して表示できます。

F.2.1 ルール・レポータのコマンドラインでディクショナリの内容をリスト表示する方法

コマンドライン・スクリプトを実行すると、ディクショナリの内容をルール・レポートを使用して表示できます。

コマンドラインを使用してルール・レポータでディクショナリの内容をリスト表示する手順は、次のとおりです。

1. システム上でターミナル・シェル・ウィンドウを開きます。

2. 例F-1に示すように、クラスパスを更新してRuleReporterの依存性を含めます。
詳細は、第F.1.3項「ルール・レポータの依存Jarファイルに関する必知事項」を参照してください。

3. 例F-1に示すように、次のコマンドラインでRuleReporterを実行します。
java oracle.rules.tools.reporter.RuleReporter DICT-NAME DEST-FILE LINK-PATHS

各項目の意味は次のとおりです。

- DICT-NAME: レポートの生成対象となるルール・ディクショナリの名前。
例: C:\JDeveloper\mywork\GradeApp\Grades\oracle\rules\grades\OracleRules1.rules

- DEST-FILE: 生成されたルール・レポータ出力の宛先ファイルの名前。通常は拡張子.htmlが付きます。
例: C:\Temp\report.html

- LINK-PATHS: ファイル・システムにおいて、DICT-NAME のリンク先となるディクショナリが含まれている可能性のある場所のリスト。
例: C:\Temp

DICT-NAMEがどのディクショナリにもリンクしない場合でも、パスは1つ以上指定する必要があります。

例F-1に、ディクショナリに関するレポートの生成方法を示します。

例F-1 コマンドラインでのRuleReporterの実行

C:\> set CLASSPATH=%CLASSPATH%;C:\Oracle\Middleware\jdeveloper\modules\oracle.adf.model_
11.1.1\adfm.jar;C:\Oracle\Middleware\jdeveloper\modules\oracle.adf.model_
11.1.1\groovy-all-1.5.4.jar;C:\Oracle\Middleware\wlserver_
10.3\server\lib\ojdbc6.jar;C:\Oracle\Middleware\jdeveloper\soa\modules\oracle.rules_
11.1.1\rules.jar;C:\Oracle\Middleware\jdeveloper\modules\oracle.xdk_11.1.1\xmlparserv2.jar

C:\> java oracle.rules.tools.reporter.RuleReporter
C:\JDeveloper\mywork\GradeApp\Grades\oracle\rules\grades\OracleRules1.rules C:\Temp\report.html C:\Temp

4. 必要に応じて、JDEV_INSTALL/jdeveloper/soa/modules/oracle.rules_11.1.1\reporter.jarファイルのoracle/rules/tools/reporter/style.cssを
HTML出力ファイルと同じディレクトリにコピーします。この例では、style.cssファイルをC:/Tempにコピーします。

これにより、Webブラウザでは、この定義を使用してページがレンダリングされます。図F-1に示すように、このスタイルシートを変更してHTMLの視覚的レイアウトを変更できます。

図F-1 style.cssを使用したRuleReporter report.html

F.3 Javaでのルール・レポータの使用

oracle.rules.tools.reporter.RuleReporterクラスを使用すると、Javaアプリケーションを使用してディクショナリの内容に関する基本的なレポートをすばやく容易に作成できます。

F.3.1 Javaを使用してルール・レポータでディクショナリの内容をリスト表示する方法

RuleReporterクラスを使用すると、ディクショナリの内容をリスト表示できます。このクラスoracle.rules.tools.reporter.RuleReporterは、次に示すように、いくつかの引数を使用します。

RuleReporter ruleReporter = new RuleReporter(
DICT-NAME,
DEST-FILE,
LINK-PATHS
);

各項目の意味は次のとおりです。

- DICT-NAME: レポートの生成対象となるルール・ディクショナリの名前。
例: C:\\JDeveloper\\mywork\\GradeApp\\Grades\\oracle\\rules\\grades\\OracleRules1.rules

- DEST-FILE: 生成されたルール・レポータ出力の宛先ファイルの名前。通常は拡張子.htmlが付きます。
例: C:\\Temp\\report.html

- LINK-PATHS: ファイル・システムにおいて、DICT-NAME のリンク先となるディクショナリが含まれている可能性のある場所のリスト。
例: new ArrayList<String>(Arrays.asList("C:\\Temp"))

DICT-NAMEがどのディクショナリにもリンクしない場合でも、パスは1つ以上指定する必要があります。

これらの引数を指定してRuleReporter.report()メソッドを呼び出すと、指定したディクショナリのディクショナリ・レポートが生成されます。

Javaを使用してルール・レポータでディクショナリの内容をリスト表示する手順は、次のとおりです。

1. Oracle JDeveloperを起動します。Oracle JDeveloperの開始ページが表示されます。

2. 「アプリケーション・ナビゲータ」で、アプリケーションを作成していない場合は「新規アプリケーション」をクリックします。アプリケーションを作成している場合は、「アプリケーション」をクリックしてリストから「新規アプリケーション」を選択します。

3. 「アプリケーションの作成」ウィザードで、アプリケーションの名前と場所を入力します。

1. 「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、ReportApplicationと入力します。

2. ディレクトリ名を入力または参照するか、デフォルトを使用します。

3. アプリケーション・パッケージ接頭辞を入力するか、デフォルトの接頭辞なしを受け入れます。
この接頭辞はグローバルで一意である必要があり、通常は自社が所有しているドメイン名を使用します。この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。

このサンプルでは、接頭辞com.exampleを使用します。

4. このOracle Business Rulesプロジェクトの場合、図F-2に示すように、アプリケーション・テンプレートとして「汎用アプリケーション」を選択します。

図F-2 レポート・アプリケーションの追加

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

5. 図F-3に示すように、「汎用アプリケーションの作成 - 「汎用」プロジェクトの名前付け」ページで、プロジェクトの名前および場所を入力します。

- 「プロジェクト名」フィールドに、アプリケーション名を入力します。たとえば、ReportProjectと入力します。

- ディレクトリ名を入力または参照するか、デフォルトを使用します。

- 「プロジェクト・テクノロジ」タブの「選択可能」リストで「Java」を選択し、「追加」をクリックして「選択済」領域に追加します。

図F-3 プロジェクトでのテクノロジの指定

6. 「終了」をクリックします。

7. Oracle JDeveloperで、「ReportProject」というプロジェクトを選択します。

8. 右クリックしてリストから「プロジェクト・プロパティ」を選択します。

9. 「ライブラリとクラスパス」項目を選択します。

10. ライブラリのAdfm Designtime API、JAXB、ADF Model Runtime、Oracle XML Parser v2、Oracle JDBCおよびOracle Rulesを追加します。

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

12. Oracle JDeveloperで、「ReportProject」というプロジェクトを選択します。

13. 右クリックし、リストから「新規」を選択します。

14. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。

15. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。

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

17. 図F-4に示すように、「Javaクラスの作成」ウィンドウで次のプロパティを構成します。

- 「名前」に値Reportを入力します。

- 次のチェック・ボックスを選択します。

- パブリック

- mainメソッド

図F-4 Report.javaクラスの作成

18. 「OK」をクリックします。
例F-2に示すように、Oracle JDeveloperにJavaクラスが表示されます。

例F-2 新規のReport.javaクラス用に作成されたコード

package com.example;

public class Report {
public static void main(String[] args) {
Report report = new Report();
}
}

19. 例F-3に示すように、RuleReporterクラスを使用します。RuleReporterコンストラクタの最初の引数を、ディクショナリの場所で置き換えます。

例F-3 完成したReport.java

package com.example;

import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;

import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.tools.reporter.RuleReporter;

public class Report {
public Report() throws SDKException {
try {

RuleReporter ruleReporter = new RuleReporter(
"C:\\JDeveloper\\mywork\\GradeApp\\Grades\\oracle\\rules\\grades\\OracleRules1.rules",
"C:\\Temp\\report.html",
Arrays.asList("C:\\Temp")
);

ruleReporter.report();

} catch (Exception e) {
System.out.println(e);
}
}

public static void main(String[] args) throws SDKException {
Report report = new Report();
}
}

20. 「アプリケーション・ナビゲータ」で、「ReportProject」を右クリックして「メイク」を選択します。

21. 「アプリケーション・ナビゲータ」で、「Report.java」を右クリックして「実行」を選択します。
この例では、Report.javaクラスでC:\Temp\report.htmlにレポートが生成されます。

22. 必要に応じて、JDEV_INSTALL/jdeveloper/soa/modules/oracle.rules_11.1.1\reporter.jarファイルのoracle/rules/tools/reporter/style.cssスタイルシートをHTML出力ファイルと同じディレクトリにコピーします。この例では、style.cssファイルをC:/Tempにコピーします。
これにより、Webブラウザでは、この定義を使用してページがレンダリングされます。図F-5に示すように、このスタイルシートを変更してHTMLの視覚的レイアウトを変更できます。

図F-5 style.cssを使用したRuleReporter report.html

索引
A B C D E F G H I J K L M N O P R S T U V W X

A

アクション

拡張, 4.7.3

領域, 5.1.1.2

セル, 5.1.1.2

デシジョン表, 5.1.1.2

定義, 4.3.6

何もしない値, 5.1.2

ファクト・タイプ, 10.1.2

アクティブ・オプション, 4.5.3 ADFビジネス・コンポーネント・ファクト

アクション・ファクト・タイプ, 10.1.2

作成, 10.3

定義, 10.1

インポート, 3.5.1

キー値, 3.5.4, 10.1.1

タイプ, 3.5

ADFビジネス・コンポーネント・ファクトViewRowImpl, 3.5 拡張アクション, 4.7.3 拡張モード, 4.5.2 詳細設定, 4.5 集計

平均, 4.7.4

コレクション, 4.7.4

件数, 4.7.4

最大, 4.7.4

最小, 4.7.4

sum, 4.7.4

別名, A.1.3 「ギャップの許可」オプション, 5.3.1.3, 5.3.5 自動オーバーライド競合解決

オプション設定, 5.3.7, 5.3.8

average集計, 4.7.4

B

バッチ起動, 10.2.1.4

BigDecimalタイプ, 3.2.4

BigIntegerタイプ, 3.2.4

BPEL

デシジョン関数, 6.3.2

ヒューマン・タスク, 11.2

java.lang.IllegalAccessError, D.5

サービス・コンポーネント, 11.2

バケット・セット

列挙タイプの追加, 3.6.3

範囲リスト(範囲)の追加, 3.6.2

値リスト(LOV)の追加, 3.6.1

「アクションで許可済」フィールド, 3.6.7

ファクトとの関連付け, 3.7

作成, 3.6

定義, 1.1.4, 3.1

重複するバケット値, 3.6.6

グローバル, 3.6

「許可されないバケットをテストに含める」フィールド, 3.6.7

値リスト(LOV)の追加, 3.6.1

ローカル, 3.6

組込みディクショナリ

Javaラッパー, 3.2.4

ビジネス・ルール

アクティビティ, 6.3.2

デシジョン関数, 6.3.2

定義, 1.1

デプロイメントおよびランタイム, 9.6

ディクショナリ, 1.1.8

Java EEアプリケーション内, 9.1

RL言語, 1.2.3

C

calendar型

CurrentDateファクト, 4.9

「ルール・フローの確認」オプション, 6.2.1 クラスパス

Javaファクト, 3.3.1

ルール・レポータ, F.2.1

collection集計, 4.7.4 結合ディクショナリ, 2.2.1, 12.5.6 com.sun.xml.bind.v2.runtime.reflect.opt.Constエラー, D.5 条件ブラウザ, 12.7.2, 12.8.2 条件式

セル, 5.1.1.1

定義, 5.1.1.1

競合分析, 5.3.1.4, 12.8.9

デシジョン表, 5.3.6

競合ポリシー・オプション, 5.3.1.4, 12.8.9 競合解消, 5.3.1.4, 12.8.9 グローバルの「定数」オプション, 2.3.3 count集計, 4.7.4 CurrentDateファクト, 4.9

D

データ・モデル

定義, 2.1

共有, 2.2.7

データ型

バケット・セット, 1.1

ファクト・プロパティ, 1.1

日付ブラウザ, 12.7.3 日付

CurrentDateファクトに基づく判断, 4.9

デシジョン関数, 6.1, 6.3

追加, 6.2

ディクショナリへの追加, 6.2.1

デシジョン・サービスとして, 11.2.2

BPEL, 6.3.2

ビジネス・ルール・アクティビティ, 6.3.2

Javaデシジョン・ポイント・インタフェースでのコール, 10.2.2

「ルール・フローの確認」オプション, 6.2.1

定義, 1.1.6

「ルール起動制限」オプション, 6.3.1

「ステートレス」オプション, 6.2.1

概要, 6.1

Webサービス, 6.2.1, 6.2.1

デシジョン・ポイントAPI

バッチ起動, 10.2.1.4

定義, 1.1.7

本番ディクショナリ, 7.5

Rules SDK, 7.1.1

ランタイム・プロパティ, 10.2.1.2

トランザクション, 10.2.1.1

MDSリポジトリでの, 7.5

デシジョン・サービス

デシジョン関数, 11.2.2

デシジョン表

アクション・セル, 5.1.1.2

何もしない値, 5.1.2

アクション, 拡張, 4.7.3 アクティブ・オプション, 4.5.3 ルールの追加, 5.2.4 アクションの追加, 5.2.3 条件式の追加, 5.2.2 拡張モード, 4.5.2 詳細設定, 4.5 集計, 4.7.4 「ギャップの許可」オプション, 5.3.1.3, 5.3.5 自動オーバーライド競合解決, 5.3.7, 5.3.8 セル値, 5.1.2 条件式, 5.1.1.1 条件式のセル, 5.1.1.1 競合分析, 5.3.1.4, 5.3.6, 12.8.9 競合ポリシー・オプション, 5.3.1.4, 12.8.9 競合解消, 5.3.1.4, 12.8.9 作成, 5.2 デシジョン・ツリー, 5.1.1.3 定義, 1.1.3 考慮されない値, 5.1.2 有効日, 4.5.6 式ビルダー, 4.10 ギャップの検索, 5.3.1.3, 5.3.5 ギャップ分析, 5.3.1.3, 5.3.5 論理オプション, 4.5.4 移動操作, 5.3.1.2 優先度, 4.5.5 ルール, 5.1.1.3 競合の表示, 5.3.1.4, 12.8.9 兄弟セル, 5.3.1.1 概要, 5.1 検証, 4.4.3 デシジョン・ツリー, 5.1.1.3 DecisionPointクラス, 7.1.1 DecisionPointBuilderクラス, 7.1.1 DecisionPointInstanceクラス, 7.1.1 .decsファイル, 11.2.1.1 デプロイメント

EARファイル, 9.6.4

MARファイル, 9.6.3

ディクショナリ

結合, 2.2.1, 12.5.6

データ・モデルの共有, 2.2.7

デシジョン関数, 6.1, 6.2.1, 6.3

定義, 1.1.8, 1.1.8, 2.1, 2.2

グローバル, 2.3

リンク, 12.5.6

命名規則, 2.2.7, A.1.2

パッケージ, 2.2.7

読取り

UTF-8キャラクタ・エンコーディング, 7.3.2

検証, 4.4, 4.4.1, 4.4.4 設定の表示および編集, 2.2.4 ディクショナリ・リンク

更新, 2.2.6

何もしない値, 5.1.2 Double型, 3.2.4 重複するバケット値, 3.6.6

E

EARファイル, 9.6.4

有効日, 4.2.2, 4.5.6

式

定数, 2.3.3

式ビルダー, 12.7.1, 12.8.2 式ビルダー

説明, 4.10

F

ファクト・タイプ

ADFビジネス・コンポーネント, 3.5

Java, 3.3

RL, 3.4

XML, 3.2.1

ファクト

作業メモリー, 1.3.3

バケット・セットとの関連付け, 3.7

定義, 1.1.4, 3.1

FileInputStream

UTF-8, 7.3.2

ルールのフィルタ処理, 4.2.3 グローバルの「ファイナル」オプション, 2.3.3 Float型, 3.2.4 前向き連鎖システム, 1.3 よくある質問, C 関数

デシジョン, 6.3

Oracle Business Rules, 2.5

テスト, 8

G

ギャップ分析, 5.3.1.3, 5.3.5

グローバル・バケット・セット, 3.6

グローバル

「定数」オプション, 2.3.3

定義済, 2.3

「ファイナル」オプション, 2.3.3

H

ヒューマン・タスク, 11.2

I

XMLスキーマのインポート, 3.2.3

「許可されないバケットをテストに含める」オプション, 3.6.7

推論サイクル, 1.3, 1.3

整数型3.2.4

J

Java EEアプリケーション

ビジネス・ルール, 9.1

Javaファクト

追加, 3.3.1

getterメソッドの表示可能性, D.1

setterメソッドの表示可能性, D.1

タイプ, 3.3

プロパティ変更リスナーを使用, C.5

java.lang.IllegalAccessError, D.5 java.lang.NoClassDefFoundError, D.3 JAXB

生成クラス, 3.2.1

問題490のトラブルシューティング, D.5

XMLファクトの制限, 3.2.4

XMLファクト, 3.2

JSR-94

定義, E

拡張機能, E.3.4

ルール実行セット, E.2

RL Languageテキストとともに使用, E.2.1

URLとともに使用, E.2.2

K

キー値, 3.5.4, 10.1.1

L

リンク

ディクショナリ, 12.5.6

同じアプリケーション内のディクショナリに, 2.2.5

リストのテスト, 4.8 ローカル・バケット・セット, 3.6 論理オプション, 4.5.4, 4.5.4 LONG型, 3.2.4

M

MARファイル, 9.6.3

一致したファクト名, 4.7.2

maximum集計, 4.7.4

メタデータ

.decsファイル, 11.2.1.1

EARファイル, 9.6.4

MARファイル, 9.6.3

サービス・コンポーネント, 11.1, 11.2.1.1

minimum集計, 4.7.4 移動操作, 5.3.1.2

N

名前付き優先度, 4.5.5

命名規則

別名, A.1.3

ディクショナリ, 2.2.7, A.1.2

一致したファクト, 4.7.2

RL Languageのキーワード, D.4

ルール・デザイナ, A.1.1

ルールセット, A.1.1

XMLスキーマのターゲット・パッケージ名, A.1.4

ネスト・テスト, 4.6 数値優先度, 4.5.5

O

Oracle Business Rules関数, 2.5

テスト, 8

Oracle Business Rules関数

作成, 2.5.2

Oracle Business Rules RL Language,「RL言語」を参照 Oracle Business Rules Rules Engine,「Rules Engine」を参照 Oracle Business Rules SDK2,「SDK」を参照 Oracle Business Rulesサービス・コンポーネント,「サービス・コンポーネント」を参照

P

パターンのバインド変数, 4.7.2

パターン一致, 4.7.1

優先度

デフォルト, 4.5.5

定義, 4.5.5

高, 4.5.5

より高い, 4.5.5

最高, 4.5.5

整数値, 4.5.5

低, 4.5.5

より低い, 4.5.5

最低, 4.5.5

中, 4.5.5

名前付き, 4.5.5

数値, 4.5.5

順序, C.11

プロパティ変更リスナー, C.5 プロトタイプ化

ルール, 3.4

R

範囲テスト, 4.3.4

更新されたスキーマからのXMLファクトのリロード, 3.2.3

Reteアルゴリズム, 1.3.2

「右のオペランド」ブラウザ, 12.7.4

RLファクト

追加, 3.4.1

タイプ, 3.4

RL言語

定義, 1.2.3, 1.2.3

自己結合, C.4

ルール言語,「RL言語」を参照 ルール・レポータ

クラスパス, コマンドライン, F.2.1

コマンドライン, F.2.1

RuleDictionary

UTF-8キャラクタ・エンコーディング, 7.3.2

ルール

アクション, 1.1.2, 4.3.6

アクティブ・オプション, 4.5.3

アクションの追加, 4.3.6, 4.3.6

拡張モード, 4.5.2

アクション, 4.7.3

集計, 4.7.4

一致したファクト名, 4.7.2

パターン一致, 4.7.1

設定, 4.7.5

単純ツリー・モード, 4.8.1.1

ツリー・モード, 4.8.1

詳細設定, 4.5, 4.5 集計, 4.7.1 競合, C.11 作成, 4.3.1 データドリブン, 1.3 定義, 1.1, 4.1 有効日, 4.5.6 エンジン, 1.2.1 式ビルダー, 4.10 フィルタ処理, 4.2.3 起動, 1.3 次の各ケース, 4.7.1 前向き連鎖, 1.3 SDKを使用したレポートの生成, F.1 リストのテスト, 4.8 論理オプション, 4.5.4 ネスト・テスト, 4.6 パターンのバインド変数, 4.7.2 パターン・ブロック, 4.7.1 優先度, 4.5.5, C.11 プロトタイプ化, 3.4 範囲テスト, 4.3.4 レポータ, F.1 ルール・アクション, 1.1 ルール条件, 1.1, 1.1.1 SDK, 1.2.4 サービス・コンポーネント, 11.1 セット・テスト, 4.3.5 テスト, 8 テスト, 4.3.2 次のケースがある, 4.7.1 次のケースがない, 4.7.1 ツリー・モード, 4.8.1 検証, 4.4.2 ルール・デザイナ

概要, 1.2.5

ルール・アクション, 1.1.2

ルール条件, 1.1.1

ルール, 1.1

サービス・コンポーネントのメタデータ, 11.2

WSDL, 11.2

Rules Engine

アーキテクチャ, 1.3

定義, 1.2.1

ルールのページング, 12.6.13 Rules SDK

デシジョン・ポイントAPI, 7.1.1

定義, 1.2.4

ルールセット

作成, 4.2.1

定義, 1.1.5, 4.1

有効日, 4.2.2

フィルタ処理, 4.2.3

ネーミング, A.1.1

S

SDK

定義, 1.2.4, 1.2.4

レポートの生成, F.1

ルール・レポータ, F.1

Oracle RLでの自己結合, C.4 サービス・コンポーネント

BPEL, 11.2

定義, 1.2.1, 11

ヒューマン・タスク, 11.2

メタデータ, 11.1, 11.2.1.1

ルール, 11.1

SOAコンポジット・アプリケーションの統合, 11.2

スタンドアロン・コンポーネント, 11.2

Webサービス, 11.1, 11.1

セット・テスト, 4.3.5 Short型, 3.2.4 単純ツリー・モード, 4.8.1.1 SOAコンポーザ

ルール・アクションを追加, 12.6.8

ルール条件を追加, 12.6.5

ルールの追加, 12.6.2

ブックマーク可能なリンク, 12.4.1

ブラウザ・ウィンドウ

条件ブラウザ, 12.7.2, 12.8.2

日付ブラウザ, 12.7.3

式ビルダー, 12.7.1, 12.8.2

「右のオペランド」ブラウザ, 12.7.4

ブラウザ・ウィンドウ, 12.7 コミット・メニュー, 12.10 競合解消, 12.8.9 デシジョン表, 12.8

アクションの追加, 12.8.3

条件行の追加, 12.8.2

デシジョン表の追加, 12.8.1

ルールの追加, 12.8.4

表の圧縮, 12.8.7

デシジョン表の削除, 12.8.12

ギャップ分析, 12.8.8

分割および圧縮, 12.8.7

表の分割, 12.8.7

行を列に切替, 12.8.10

ルール・アクションを削除, 12.6.9 ルール条件を削除, 12.6.6 ルールの削除, 12.6.3 ディクショナリのパス, 12.4.2 編集メニュー, 12.5 バケットセットの編集, 12.5.3, 12.5.4

範囲バケットセットの編集, 12.5.4

LOVバケットセットの編集, 12.5.4

デシジョン関数の編集, 12.5.7 ルールの編集, 12.6 リンク先ディクショナリ, 12.5.6 ルール・アクションの変更, 12.6.10 ルール条件の変更, 12.6.7 「ユーザー編集」オプション, 12.4.1 コンポジット情報およびディクショナリ情報の入手, 12.13 「開く」メニュー, 12.4 ルールの詳細設定, 12.6.4 ルールのページング, 12.6.13 ルール・ディクショナリの同期, 12.11 ツリー・モードのルール, 12.6.12 「検証」パネルの更新, 12.12.2 ルール・ディクショナリの検証, 12.12

「検証」パネル, 12.12.1

「検証」パネル, 12.12.1

「検証」パネルの更新, 12.12.2

バケットセットの表示, 12.4.4 グローバルの表示, 12.4.3 ルール・セットの表示, 12.4.7 SOADesignerロール

SOAコンポーザ

認証とSOADesignerロール, 12.2.1

「ステートレス」オプション

デシジョン関数, 6.2.1

sum集計, 4.7.4

T

テスト

ルール, 8

テスト関数を使用, 8

テスト

ルールで, 4.3.2

リスト, 4.8

範囲, 4.3.4

セット, 4.3.5

トランザクション, 10.2.1.1 ツリー・モード

ツリー・モードのルールの作成, 4.8.2

単純, 4.8.1.1

デシジョン表, 4.8.1

ルール, 4.8.1

トラブルシューティング, D

getterメソッドの表示可能性, D.1

java.lang.IllegalAccessError, D.5

java.lang.NoClassDefFoundError, D.3

setterメソッドの表示可能性, D.1

U

Unicode文字, 7.3.2

更新されたXMLスキーマとXMLファクト, 3.2.3

UTF-8キャラクタ, 7.3.2

V

検証

データ・モデル, 4.4.1

デシジョン表, 4.4.3

ディクショナリ, 4.4, 4.4.1, 4.4.4

ルール, 4.4.2

変数, 4.7.2 表示可能性

getterメソッド, D.1

setterメソッド, D.1

W

Webサービス

デシジョン関数, 6.2.1, 6.2.1

サービス・コンポーネント, 11.1, 11.1

WSDL, 11.1, 11.2

WebDAVリポジトリ・サポート, C.15 作業メモリー, 1.3.3 WSDL

ルール・デザイナ, 11.2

サービス・コンポーネントのメタデータ, 11.1

X

XMLファクト

追加, 3.2.1

java.lang.NoClassDefFoundError, D.3

JAXB生成クラス, 3.2.1

更新されたスキーマからのXMLファクトのリロード, 3.2.3

XPathアサーションのサポート, 3.2.2

XPath, 3.2.2

XPath

RLプログラム, E.2.1

アサーションのサポート, 3.2.2

XMLファクト, 3.2.2

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2014, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

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の登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

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

保証免責

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

制限付権利

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

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）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

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

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。