10 Oracle Business RulesとADFビジネス・コンポーネントの使用
Oracle Business Rulesでは、Oracle ADF Business Componentsビュー・オブジェクトをファクトとして使用できます。すべてのファクト・タイプと同様に、ファクトのツリーは、マスター/ディテール・データを表し、1単位としてアサートできます。Oracle Business Rulesには、組込みのテスト(RLcontains)および1対多リレーションシップのナビゲートをサポートするオプションのツリー・モード構文(マスター/ディテールなど)が含まれています。
10.1 Business RulesとADFビジネス・コンポーネントの使用の概要
ADF Business Componentsルール開発プロセスは、次のようにまとめることができます。
ADFビジネス・コンポーネント・ルールを使用して、次のことができます。
-
ビュー・オブジェクト定義を作成します。
-
アクション・タイプを作成します。
-
ルール・ディクショナリを作成します。
-
ビュー・オブジェクトのファクト・タイプを登録します。
-
アクションのJavaファクト・タイプを登録します。
-
Javaから起動する場合は、次のいずれかを実行します。
-
ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されている場合は、ビュー・オブジェクト・インスタンスを渡してデシジョン・ポイントの起動をコーディングします。
-
ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されていない場合は、ビュー・オブジェクトのキー値を渡してデシジョン・ポイントの起動をコーディングします。
-
10.1.1 Oracle Business RulesのADFビジネス・コンポーネント・ファクト・タイプ
ADFビジネス・コンポーネント・ビュー・オブジェクトがOracle Business Rulesデータ・モデルにインポートされるとき、ビュー・オブジェクトの各属性に対応するプロパティを持ったADFビジネス・コンポーネント・ファクト・タイプが作成されます。
また、ADFビジネス・コンポーネント・ファクト・タイプには、次のプロパティが含まれています。
-
プロパティViewRowImpl。各ファクト・インスタンスが表す
oracle.jbo.Row
インスタンスを直接指します。 -
プロパティkey_values。
oracle.rules.sdk2.decisionpoint.KeyChain
オブジェクトを指します。このプロパティは、この行と親行のキー値セットの取得に使用できます。
次の点に注意してください。
-
ビュー・オブジェクト定義間の関係は、ビュー定義の属性、特にビュー・リンクのアクセッサである属性のイントロスペクションによって決定されます。
ADFビジネス・コンポーネント・ファクト・タイプ・インポータでは、どの関係が1対1で、どの関係が1対多であるかが正しく判別され、それに従ってディクショナリに定義が生成されます。1対多関係の場合、生成されるプロパティのタイプは
List
であり、実行時に示されたタイプのファクトが含まれています。 -
ADFビジネス・コンポーネント・ファクト・タイプはJavaファクト・タイプではなく、ビュー・オブジェクト用に明示的に作成された実装クラスのメソッドは起動できません。
この種のメソッドをコールする必要がある場合は、ビュー・オブジェクト実装をADFビジネス・コンポーネント・ファクト・タイプのかわりにJavaファクト・タイプとしてディクショナリに追加します。この場合、すべてのgetter、setterおよびその他のメソッドが使用可能になりますが、関連するビュー・オブジェクトにアクセスできなくなり、そのオブジェクトへのアクセスが必要な場合は、これらの関係を明示的に管理する必要があるというトレードオフがあります。
-
ADFビジネス・コンポーネント・ファクト・タイプを使用すると、Oracle Business Rules内部では、RLファクト・タイプのインスタンスとしてADFビジネス・コンポーネント・ファクト・タイプが作成されます。つまり、このことは、ADFビジネス・コンポーネント・ビュー・オブジェクト・インスタンスをルール・セッションに直接アサートすることはできず、かわりに
MetadataHelper
およびADFBCFactTypeHelper
クラスに用意されているヘルパー・メソッドを使用する必要があることを意味します。詳細は、Oracle Business Rules Java APIリファレンスを参照してください。
10.1.2 Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ
Rules SDKでは、デシジョン・ポイント内のビュー・オブジェクトを更新する主な方法は、アクション・タイプを使用することです。アクション・タイプは、ルール・パターン・ファクト・タイプのJavaクラスをインポートするのと同じ方法でルール・ディクショナリのデータ・モデルにインポートするJavaクラスです。このアクション・タイプの新規インスタンスは、ルールのアクション内でアサートされてから、DecisionPointDictionary
内の後処理ルールセットにより処理されます。
アクション・タイプとして使用するJavaクラスは、次の要件に従う必要があります。
-
Javaファクト・タイプのクラスは、
oracle.rules.sdk2.decisionpoint.ActionType
またはoracle.rules.sdk2.decisionpoint.KeyedActionType
をサブクラス化する必要があります。KeyedActionType
をサブクラス化することで、Javaクラスは標準のoracle.rules.sdk2.decisionpoint.KeyChain
属性を継承します。これは、ルール・ファクトの主キーおよび親キーをActionType
インスタンスに伝えるのに使用できます。 -
クラスにはデフォルト・コンストラクタが必要です。
-
クラスは、
ActionType
のabstractのexec
メソッドを実装します。exec
メソッドに、実行するメイン・アクションを含める必要があります。 -
Javaクラスには、
JavaBean
インタフェースに準拠するプロパティが必要です(つまり、各プロパティにはgetterメソッドおよびsetterメソッドが必要です)。
ActionType
実装のサンプルは、例10-1を参照してください。
表10-1に、ActionType
exec
を実装するアプリケーション開発者に必要と思われるDecisionPointInstance
のメソッドを示します。
表10-1 DecisionPointInstanceのメソッド
方法 | 説明 |
---|---|
|
アクション・タイプに必要な可能性がある実行時指定パラメータを含む デシジョン・サービスのデシジョン関数を使用する場合は、文字列値のみを使用します。 |
|
ルール・ディクショナリ内の静的構成変数へのアクセス元として使用できる、Oracle Business Rules RuleSessionオブジェクトへのアクセスを提供します。 |
|
コール元により移入される場合、Set Controlのインダイレクトに使用する文字列値を提供します。 |
|
アクション・タイプがバックエンドで永続的に変更できるように、トランザクション・オブジェクトを提供します。 |
|
指定の結果を文字列キーおよびオブジェクト値の形式で出力値のリストに追加します。 出力は、純粋なマップ実装の場合と同様に、 |
10.1.2.1 ActionType実装のサンプル
例10-1に、ActionType
実装のサンプルと、exec
メソッドのパラメータとしてのoracle.rules.sdk2.decisionpoint.DecisionPointInstance
を示します。
例10-1 ActionTypeの実装
package com.example; import oracle.jbo.domain.Number; import oracle.rules.sdk2.decisionpoint.ActionType; import oracle.rules.sdk2.decisionpoint.DecisionPointInstance; public class RaiseAction extends ActionType { private double raisePercent; public void exec(DecisionPointInstance dpi) { Number salary = (Number)getViewRowImpl().getAttribute("Salary"); salary = (Number)salary.multiply(1.0d + getRaisePercent()).scale(100,2, new boolean[]{false}); dpi.addResult("raise for " + this.getViewRowImpl().getAttribute("EmployeeId"), getRaisePercent() + "=>" + salary ); getViewRowImpl().setAttribute("Salary", salary); } public void setRaisePercent(double raisePercent) { this.raisePercent = raisePercent; } public double getRaisePercent() { return raisePercent; } }
ルール・デザイナを使用すると、構成中のActionType
に適切なパラメータを選択できます。
10.2 ADFビジネス・コンポーネント・ファクトを使用する場合のデシジョン・ポイントの使用
デシジョン・ポイントを使用すると、デシジョン関数を実行できます。ADFビジネス・コンポーネント・ファクト・タイプを使用している場合にのみ適用される特定のデシジョン・ポイント・メソッドがあります。
デシジョン関数の詳細は、「デシジョン関数の使用」を参照してください。
10.2.1 ADFビジネス・コンポーネント・ファクトによるデシジョン・ポイントのコール方法
ADFビジネス・コンポーネント・ファクト・タイプを使用する場合は、Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数を起動します。
Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールするには:
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設定メソッド | 説明 |
---|---|
|
このデシジョン関数は、 この使用について詳しくは、「従業員取消しルールセットの追加方法」を参照してください。 |
|
このデシジョン関数は、同時にロードされたすべての |
10.2.1.4 デシジョン・ポイントの起動に関する必知事項
JBOクラスのデフォルト動作はすべてのデータを単にロードすることであるため、大量のデータをロードするビュー・オブジェクトを使用してデシジョン・ポイントを起動する際には注意が必要です。多数の行を持ち、多数の子行も持つ可能性のあるビュー・オブジェクトがメモリーにロードされると、メモリー不足になる危険性があるのみでなく、この種の大型データに基づいて実行されるDMLアクションによってロールバック・セグメントがすべて使用されてしまう危険性があります。
10.2.1.5 setInputsメソッドを使用してデシジョン・ポイントを起動するサンプル
例10-2に、setInputs
メソッドを使用するViewObject
インスタンスを使用してデシジョン・ポイントを起動する方法を示します。完全な例は、「外部マネージャ・ファインダ・クラスの追加方法」に示す例を参照してください。
例10-2 setInputsメソッドを使用したデシジョン・ポイントの起動
public class OutsideManagerFinder { private static final String AM_DEF = "com.example.AppModule"; private static final String CONFIG = "AppModuleLocal"; private static final String VO_NAME = "EmployeesView1"; private static final DictionaryFQN DICT_FQN = new DictionaryFQN("com.example", "Chapter10Rules"); private static final String DF_NAME = "FindOutsideManagers"; private DecisionPoint dp = null; public OutsideManagerFinder() { try { dp = new DecisionPointBuilder() .with(DICT_FQN) .with(DF_NAME) .build(); } catch (SDKException e) { System.err.println(e); } }
public void run() { final ApplicationModule am = Configuration.createRootApplicationModule(AM_DEF, CONFIG); final ViewObject vo = am.findViewObject(VO_NAME); final DecisionPointInstance point = dp.getInstance(); point.setTransaction((DBTransactionImpl2)am.getTransaction()); point.setAutoCommit(true); point.setInputs(new ArrayList<Object>(){{ add(vo); }}); try { List<Object> invokeList = point.invoke();
List<DecisionPoint.NamedValue> results = point.getResults();
} catch (RLException e) { System.err.println(e); } catch (SDKException e) { System.err.println(e); } }
10.2.1.6 setViewObjectメソッドを使用してデシジョン・ポイントを起動するサンプル
例10-3に、setViewObject
メソッドを使用してDecisionPoint
を起動し、ViewObject
を設定する方法を示します。
例10-3 setViewObjectメソッドを使用したデシジョン・ポイントの起動
public void run() { final ApplicationModule am = Configuration.createRootApplicationModule(AM_DEF, CONFIG); final ViewObject vo = am.findViewObject(VO_NAME); final DecisionPointInstance point = dp.getInstance(); point.setTransaction((DBTransactionImpl2)am.getTransaction()); point.setAutoCommit(true); point.setViewObject(vo); try { List<Object> invokeList = point.invoke();
List<DecisionPoint.NamedValue> results = point.getResults();
} catch (RLException e) { System.err.println(e); } catch (SDKException e) { System.err.println(e); } }
10.2.2 Javaデシジョン・ポイント・インタフェースによるデシジョン関数のコール方法
Oracle Business Rules SDKデシジョン・ポイント・インタフェースを持つADFビジネス・コンポーネント・ファクト・タイプを使用して、ルールセットを持つデシジョン関数をコールするには、特定のオプションを使用してデシジョン関数を構成する必要があります。デシジョン関数の使用の詳細は、デシジョン関数の使用を参照してください。
Javaデシジョン・ポイント・インタフェースを使用してデシジョン関数を定義するには:
10.2.3 ADFビジネス・コンポーネントによるデシジョン関数の構成に関する必知事項
デシジョン関数の定義には、ルールセットとデシジョン関数の両方を含めることができます。アプリケーションでは、通常、配管コードとして機能するなんらかのルールまたはデシジョン関数が必要です。この配管コードは、ActionTypeを使用している場合にのみ必要です。
このようなアプリケーションには、入力データのトランスフォーメーション、補助ファクトのアサートまたは出力ファクトの処理を実行するコンポーネントが含まれます。配管コードは、アプリケーションのコア・ビジネス・ルールを含むルールの前または後に実行することが必要となる場合があります。
こうしたアプリケーションの問題とそれに関連するルールをネストしたデシジョン関数を使用して、アプリケーションの機能の問題と切り離すことができます。ネストしたデシジョン関数を使用すると、内側のデシジョン関数に管理上の配管指向の問題が含まれなくなるため、内側のデシジョン関数ではアプリケーションのコア・ロジックを定義するルールのみが示されるようになります。この設計によって、ユーザーが管理上のルールを理解する必要がなくなり、ユーザーがルールに不適切な変更を加えること(および、このことにより、システムが操作不能になる事態)を防止できます。
複数のルールセットおよびネストしたデシジョン関数を使用して構成を作成するには、2つのデシジョン関数を作成し、一方を他方に追加します。適切なネーミング方法は、ネストした内側のデシジョン関数に接尾辞Core
を付けることです。これにより、ユーザー指定のルールセットをこの内側のCore
デシジョン関数に追加できます。たとえば、DecisionPointDictionary.Preprocessingデシジョン関数、DecisionFunction_1Coreデシジョン関数およびDecisionPointDictionary.Postprocessingデシジョン関数を実行するようにDecisionFunction_1を定義できます。この例では、DecisionFunction_1Coreにコア・ビジネス・ロジック・ルールセットが含まれています。
デシジョン・ポイントの入力を、ADFビジネス・コンポーネント・オブジェクトのツリーのルートである、ADFビジネス・コンポーネントのファクト・タイプにすることも一般的です。ただし、ユーザーはツリーに存在するタイプのサブセットに一致する、ビジネス・ルールのみを記述できます。この場合、ネストしたデシジョン関数の入力を、格納されたルールセットに実際に一致するタイプのみになるよう定義することを習慣にするとよいでしょう。たとえば、ツリー
・オプションが選択されたEmployeeファクト・タイプが入力である、デシジョン関数をコールするデシジョン・ポイントを考えてみます。このデシジョン関数は、Department
ファクト・タイプに一致するルールセットのみが存在する、ネストしたデシジョン関数を含むとします。この場合、ネストしたデシジョン関数には、入力としてツリー
・オプションが選択されたEmployeeファクト・タイプまたはリスト
・オプションが選択されたDepartmentファクト・タイプのいずれかを指定できます。この例では、ツリー・オプションにより、Employee
インスタンスの子が発生します。これにはDepartment
インスタンスのアサートも含まれます(これらのタイプ間の1対多関連のため)。Employee
が外側のデシジョン関数の入力で、ツリー・オプションが選択されている場合、Department
ファクト・タイプのインスタンスがアサートされ、内側のデシジョン関数のシグネチャをDepartment
のインスタンス(このデシジョン関数に適合された正確なタイプ)のリストとして識別できます。
10.3 ADFビジネス・コンポーネント・ファクトを使用したBusiness Rulesアプリケーションの作成
ADFビジネス・コンポーネント・サンプル・アプリケーションでは、ADFビジネス・コンポーネント・ファクト・タイプの使用を示します。
Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプルおよびチュートリアル・ページからオンラインで入手できます。
10.3.1 ADFビジネス・コンポーネント・ファクトを使用するアプリケーションの作成方法
Oracle Business RulesでADFビジネス・コンポーネント・ファクトを使用するには、まずOracle JDeveloperでアプリケーションおよびプロジェクトを作成する必要があります。
ADFビジネス・コンポーネント・ファクトを使用するアプリケーションを作成するには:
-
Oracle JDeveloperを起動します。Oracle JDeveloperの開始ページが表示されます。
-
「アプリケーション・ナビゲータ」でアプリケーション・メニューの「新規アプリケーション」をクリックします。
-
「アプリケーションの名前付け」ページで、新規アプリケーションの名前および場所を入力します。
-
「アプリケーション名」フィールドで、アプリケーション名を入力します。たとえば、
Chapter10
と入力します。 -
「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。
-
「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞を入力します。たとえば、
com.example
と入力します。この接頭辞はグローバルで一意である必要があり、通常は自社が所有しているドメイン名を使用します。接頭辞に続いてピリオドが、アプリケーションの初期プロジェクト内に作成されたオブジェクトに付加されます。
このサンプルでは、
図10-1
に示すように接頭辞com.exampleを使用します。「次へ」をクリックします。
-
-
「プロジェクトの名前付け」ページ:
-
「プロジェクト名」フィールドに、
Chapter10
と入力します。 -
「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。
-
図10-2に示すように、「プロジェクトの機能」領域で、「ADFビジネス・コンポーネント」を選択します。
「次へ」をクリックします。
-
-
Java設定の構成ページ:
-
「デフォルト・パッケージ」フィールドに、
com.example
と入力します。 -
「Javaソース・パス」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。
-
図10-3に示すように、「出力ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。
「次へ」をクリックします。
-
-
プロジェクト2の場合、「プロジェクトの名前付け」ページ:
-
「プロジェクト名」フィールドに、
ViewController
と入力します。 -
「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。
-
図10-4に示すように、「プロジェクトの機能」領域で、「ADF Faces」を選択します。
「次へ」をクリックします。
-
-
プロジェクト2の場合、Java設定の構成ページ:
-
「デフォルト・パッケージ」フィールドに、
com.example.view
と入力します。 -
「Javaソース・パス」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。
-
図10-5に示すように、「出力ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。
-
-
完了後、「終了」をクリックします。
10.3.2 Business RulesのADFビジネス・コンポーネント・アプリケーションの作成方法
データベース表からADFビジネス・コンポーネントを追加する必要があります。この例では、標準のHRデータベース表を使用します。
ADFビジネス・コンポーネントを追加するには:
10.3.3 Business Rulesサンプル・アプリケーションのビュー・オブジェクト・チューニングの更新方法
アプリケーションのパフォーマンス要件に合わせて、ViewObject
をチューニングする必要があります。
EmployeesViewまたはDepartmentsViewのチューニング・オプションを設定するには:
- 「アプリケーション・ナビゲータ」で、「EmployeesView」をダブルクリックして従業員のチューニング・オプションを設定するか、「DepartmentsView」をダブルクリックして部門のチューニング・オプションを設定します。
- 「一般」ナビゲーション・タブで、「チューニング」を開きます。
- 「チューニング」領域で「すべての行」を選択します。
- 「チューニング」領域で、バッチ数フィールドに128と入力します。
- 「チューニング」領域で「一度にすべて」を選択します。
10.3.4 Oracle Business Rulesのディクショナリの作成方法
Oracle JDeveloperを使用して、Oracle Business Rulesディクショナリを作成します。
ディクショナリを作成するには:
10.3.5 デシジョン・ポイント・ディクショナリ・リンクの追加方法
Oracle Business Rulesによって提供されているデシジョン・ポイント・ディクショナリへのディクショナリ・リンクを追加する必要があります。このディクショナリでは、ADFビジネス・コンポーネント・オブジェクトを持つデシジョン・ポイント・インタフェースで使用する機能がサポートされています。
デシジョン・ポイント・ディクショナリ・リンクを追加します。
- Rules Designerで、「リンク」ナビゲーション・タブをクリックします。
- 「作成」ボタンの横にあるメニューから、「デシジョン・ポイント・ディクショナリ」を選択します。この操作の完了には時間がかかる場合があります。待機した後、ルール・デザイナによってデシジョン・ポイント・ディクショナリへのリンクが追加されます。
10.3.6 ADFビジネス・コンポーネント・ファクトをインポートする方法
ルール・デザイナでADFビジネス・コンポーネント・ファクトをインポートして、ルールの作成時にこれらのオブジェクトを使用できるようにします。
ADFビジネス・コンポーネント・ファクトをインポートします。
- Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
- 「ADF-BCファクト」タブを選択します。
- 「作成」ボタンをクリックします。「ADFビジネス・コンポーネント・ファクト」ページが表示されます。
- 「接続」フィールドのリストから、ADFビジネス・コンポーネント・オブジェクトが使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。
- 「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。たとえば、「com.example.EmployeesView」を選択します。
- 「OK」をクリックします。これにより、「ファクト」ナビゲーション・タブが表示されます。
ADFビジネス・コンポーネント・ファクトには循環参照が含まれていることがあります。この場合は、次のような検証警告が示されます。
RUL-05037: A circular definition exists in the data model
「ビジネス・ルール」検証ログにこの警告が表示されている場合は、循環参照を手動で解決する必要があります。そのためには、循環参照に関係するいずれかのプロパティの「参照可能」チェック・ボックスをクリアします。
10.3.6.1 プロパティを表示不可能としてマーク付けする方法
プロパティを表示不可能としてマーク付けするには:
- 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。
- 「DepartmentsView」行のアイコンをダブルクリックします。
- 「プロパティ」表の「EmployeesView」行で、「参照可能」チェック・ボックスをクリアします。
- 「OK」をクリックします。
10.3.7 外部マネージャ・ルールセットの追加および実行方法
外部マネージャ・ルールセットを実行するサンプル・コードは、setInputs
メソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数が1回起動し、すべてのビュー・オブジェクト行がList
にロードされます。この方法を使用してデシジョン・ポイントを起動する場合、すべてのビュー・オブジェクト行が同時にメモリーにロードされる必要があり、OutOfMemory例外が発生する可能性があるため、スケーラブルではありません。この起動スタイルは、既知のビュー・オブジェクト行が少数ある場合にのみ使用します。setViewObject
でデシジョン・ポイントを使用することもできます。詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。
10.3.7.1 外部マネージャ・ルールセットおよびデシジョン関数の追加方法
ビュー・オブジェクトがファクトとしてインポートされた後、ルールセットの名前を変更して、アプリケーションのデシジョン関数を作成できます。
ルールセットの名前を変更するには、「ルール・デザイナ」で「Ruleset_1」ナビゲーション・タブを選択してから、ルールセット名を選択し、Outside Manager Ruleset
と入力してそのルールセット名を変更します。
デシジョン関数を追加するには:
複数の警告が表示されます。これらの警告は、後のステップでルールセットにルールを追加すると、削除されます。
10.3.7.2 ActionTypeのJava実装クラスの作成方法
サンプル・アプリケーションを作成し、ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionType
のJava実装クラスを作成する必要があります。ActionType
のすべてのサブクラスは、abstractのexec
メソッドを実装する必要があります。
ActionTypeのJava実装クラスを作成するには:
10.3.7.3 メッセージ・アクションのJavaファクトをインポートする方法
新しいJavaクラスを作成したため、後でルールを作成するときに使用できるように、このクラスをルール・デザイナのJavaファクト・タイプとして追加する必要があります。
Javaファクト・タイプを作成するには:
- Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。
- 「Javaファクト」タブを選択します。
- 「作成...」をクリックします。
- 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、
com
およびexample
を開いて、「MessageAction」チェック・ボックスを表示します。 - 「MessageAction」チェック・ボックスを選択します。
- 「OK」をクリックします。これにより、ファクトが表に追加されます。
10.3.7.5 外部マネージャ・ファインダ・クラスの追加方法
外部マネージャ・ファインダ・クラスを追加します。このクラスはデシジョン・ポイントを使用して、デシジョン関数を実行します。
外部マネージャ・ファインダ・クラスを追加するには:
- Chapter10プロジェクトを選択します。
- 右クリックして「新規」を選択します。
- 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
- 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。
- 「名前」フィールドに、
xcelerate.OutsideManagerFinder
と入力します。「OK」をクリックします。 - このクラスのコンテンツを、外部マネージャ・ファインダのJavaクラスを示す次のサンプル・コードで置き換えます。
package com.example; import java.util.ArrayList; import oracle.jbo.ApplicationModule; import oracle.jbo.ViewObject; import oracle.jbo.client.Configuration; import oracle.rules.rl.exceptions.RLException; import oracle.rules.sdk2.decisionpoint.DecisionPoint; import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder; import oracle.rules.sdk2.decisionpoint.DecisionPointInstance; import oracle.rules.sdk2.exception.SDKException; import oracle.rules.sdk2.repository.DictionaryFQN; public class OutsideManagerFinder { private static final String AM_DEF = "com.example.AppModule"; private static final String CONFIG = "AppModuleLocal"; private static final String VO_NAME = "EmployeesView1"; private static final DictionaryFQN DICT_FQN = new DictionaryFQN("com.example", "Chapter10Rules"); private static final String DF_NAME = "FindOutsideManagers"; private DecisionPoint dp = null; public OutsideManagerFinder() { try { dp = new DecisionPointBuilder() .with(DICT_FQN) .with(DF_NAME) .build(); } catch (SDKException e) { System.err.println(e); } } public void run() { final ApplicationModule am = Configuration.createRootApplicationModule(AM_DEF, CONFIG); final ViewObject vo = am.findViewObject(VO_NAME); final DecisionPointInstance point = dp.getInstance(); point.setInputs(new ArrayList<Object>(){{ add(vo); }}); try { point.invoke(); } catch (RLException e) { System.err.println(e); } catch (SDKException e) { System.err.println(e); } } public static void main(String[] args) { OutsideManagerFinder omf = new OutsideManagerFinder(); omf.run(); } }
10.3.7.6 ローカル・ディクショナリ・アクセスのADF META INFの更新方法
ADF-META-INF
ファイルの、ディクショナリにアクセスするためのMDS情報を更新する必要があります。MDSを持つローカル・ファイルを使用して、Oracle Business Rulesディクショナリにアクセスできます。ただし、一般的に、本番環境のOracle Business Rulesでは、ディクショナリ・アクセスにこの手順を使用しません。本番環境でのデシジョン・ポイントを使用したMDSによるディクショナリへのアクセスの詳細は、「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。
ADF-META-INFを更新するには:
10.3.7.7 MDSでアクセス可能な場所に定義/ディクショナリをコピーする方法
MDSでアクセス可能な場所に定義/ディクショナリをコピーするには:
- ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーション、Chapter10プロジェクトおよびsrcフォルダにナビゲートし、comフォルダを選択およびコピーします。または、MDSでアクセス可能な場所にディクショナリをコピーする場合は、Oracle Business Rulesディクショナリを含むoracleディレクトリをコピーします。
- Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。
- comフォルダをこのディレクトリにコピーするか、oracleフォルダをこのディレクトリにコピーします。
10.3.7.8 外部マネージャ・ファインダをチェックするプロジェクトの作成および実行方法
従業員が別の部門にいるマネージャの検索ルールを実行して、プロジェクトを作成しおよびテストできます。
OutsideManagerFinder構成を作成します。
- 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
- 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
- 「実行構成の作成」ダイアログで、名前を入力します。たとえば、
OutsideManagerFinder
と入力します。 - 「OK」をクリックします。
- 「OutsideManagerFinder」を選択した状態で、「編集」をクリックします。
- 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
- src\com\exampleフォルダから
「OutsideManagerFinder.java」
を選択します。 - 「開く」をクリックします。
- 「実行構成の編集」ダイアログで「OK」をクリックします。
- 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のドロップダウン・メニューで「OutsideManagerFinder」を選択します。次の例に示すように、この構成を実行すると、出力が生成されます。
Emp Shelley Higgins(205) in dept 110 manager outside of department, Neena Kochhar(101) in dept 90 Emp Hermann Baer(204) in dept 70 manager outside of department, Neena Kochhar(101) in dept 90 Emp Susan Mavris(203) in dept 40 manager outside of department, Neena Kochhar(101) in dept 90 Emp Michael Hartstein(201) in dept 20 manager outside of department, Steven King(100) in dept 90 Emp Jennifer Whalen(200) in dept 10 manager outside of department, Neena Kochhar(101) in dept 90 Emp Kimberely Grant(178) in dept null manager outside of department, Eleni Zlotkey(149) in dept 80 Emp Eleni Zlotkey(149) in dept 80 manager outside of department, Steven King(100) in dept 90 Emp Gerald Cambrault(148) in dept 80 manager outside of department, Steven King(100) in dept 90 Emp Alberto Errazuriz(147) in dept 80 manager outside of department, Steven King(100) in dept 90 Emp Karen Partners(146) in dept 80 manager outside of department, Steven King(100) in dept 90 Emp John Russell(145) in dept 80 manager outside of department, Steven King(100) in dept 90 Emp Kevin Mourgos(124) in dept 50 manager outside of department, Steven King(100) in dept 90 Emp Shanta Vollman(123) in dept 50 manager outside of department, Steven King(100) in dept 90 Emp Payam Kaufling(122) in dept 50 manager outside of department, Steven King(100) in dept 90 Emp Adam Fripp(121) in dept 50 manager outside of department, Steven King(100) in dept 90 Emp Matthew Weiss(120) in dept 50 manager outside of department, Steven King(100) in dept 90 Emp Den Raphaely(114) in dept 30 manager outside of department, Steven King(100) in dept 90 Emp Nancy Greenberg(108) in dept 100 manager outside of department, Neena Kochhar(101) in dept 90 Emp Alexander Hunold(103) in dept 60 manager outside of department, Lex De Haan(102) in dept 90
10.3.8 部門マネージャ・ルールセットの追加および実行方法
部門マネージャ・ルールセットを実行するサンプル・コードは、setViewObject
メソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。すべてのデシジョン関数コールは、同じRuleSession内で発生します。デシジョン関数のコールとコールの間に、RuleSessionによって、以前のデシジョン関数コールのすべての状態が保存されます。このため、以前のコール時にアサートされたオブジェクトは、指定するルールセットによって明示的に取り消されない場合、次のコールの作業メモリーに残ります。状態が保持されている場合は、取消しアクションを使用するルールを持つルールセットを実行して、コールとコールの間にすべてのファクトまたは選択したファクトを取り消すことができます。このルールセットは、デシジョン・ポイントで使用する同じデシジョン関数の一部として実行されます。すべての従業員の取消しルールセットは、これらのファクトのリトラクトを示します。詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。
10.3.8.1 部門マネージャ・ファインダ・ルールセットの追加方法
部門マネージャ・ファインダ・ルールセットを追加します。
部門マネージャ・ファインダ・ルールセットを追加するには:
- Rules Designerで、「ルールセットの作成」をクリックします。
- 「ルールセットの作成」ダイアログで、「名前」フィールドに
Department Manager Finder Ruleset
と入力します。 - 「OK」をクリックします。
10.3.8.2 部門マネージャ・ファインダ・ルールセットの検索ルールの追加方法
次に、部門マネージャを検索する検索ルールを追加します。このルールは、Oracle ADFビジネス・コンポーネント・ファクト・タイプでのツリー・モード・ルールの使用を示します。
部門マネージャ・ファインダ・ルールを追加します。
10.3.8.3 従業員取消しルールセットの追加方法
従業員ファクト・タイプ・インスタンスを取り消すルールセットを追加します。これにより、従業員ファクト・タイプが、デシジョン関数の起動と起動の間に削除されます。
従業員取消しルールセットを追加するには:
- Retract Employees Rulesetを追加します。
- 「Retract Employees Ruleset」でルールを追加し、このルールにRetract all employeesという名前を付けます。
10.3.8.4 部門マネージャ検索デシジョン関数の追加方法
部門マネージャ・ファインダ・ルールセット用のデシジョン関数を作成します。このデシジョン関数を使用して、デシジョン・ポイントからルールセットを実行します。
部門マネージャ・ファインダ・ルールセットのデシジョン関数を追加するには:
10.3.8.5 部門マネージャ・ファインダJavaクラスの追加方法
部門マネージャ・ファインダ・クラスを追加します。このクラスには、デシジョン関数を実行するデシジョン・ポイントが指定されたコードが含まれます。
部門マネージャ・ファインダ・クラスを追加します。
- 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。
- 右クリックして「新規」を選択します。
- 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
- 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。
- 「名前」フィールドに、
DeptManagerFinder
と入力します。「OK」をクリックします。 - このクラスのコンテンツを、次の例に示すコードで置き換えます。
package com.example; import oracle.jbo.ApplicationModule; import oracle.jbo.ViewObject; import oracle.jbo.client.Configuration; import oracle.jbo.server.DBTransactionImpl2; import oracle.rules.rl.exceptions.RLException; import oracle.rules.sdk2.decisionpoint.DecisionPoint; import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder; import oracle.rules.sdk2.decisionpoint.DecisionPointInstance; import oracle.rules.sdk2.exception.SDKException; import oracle.rules.sdk2.repository.DictionaryFQN; public class DeptManagerFinder { private static final String AM_DEF = "com.example.AppModule"; private static final String CONFIG = "AppModuleLocal"; private static final String VO_NAME = "EmployeesView1"; private static final String DF_NAME = "FindDepartmentManagers"; private static final DictionaryFQN DICT_FQN = new DictionaryFQN("com.example", "Chapter10Rules"); private DecisionPoint dp = null; public DeptManagerFinder() { try { dp = new DecisionPointBuilder() .with(DICT_FQN) .with(DF_NAME) .build(); } catch (SDKException e) { System.err.println(e); } } public void run() { final ApplicationModule am = Configuration.createRootApplicationModule(AM_DEF, CONFIG); final ViewObject vo = am.findViewObject(VO_NAME); final DecisionPointInstance point = dp.getInstance(); point.setTransaction((DBTransactionImpl2)am.getTransaction()); point.setAutoCommit(true); point.setViewObject(vo); try { point.invoke(); } catch (RLException e) { System.err.println(e); } catch (SDKException e) { System.err.println(e); } } public static void main(String[] args) { new DeptManagerFinder().run(); } }
10.3.8.6 MDSでアクセス可能な場所にディクショナリをコピーする方法
MDSでアクセス可能な場所に更新したディクショナリをコピーします。
MDSでアクセス可能な場所にディクショナリをコピーします。
- ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびプロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。
- Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、
.adf
ディレクトリにナビゲートします。 - oracleフォルダをこのディレクトリにコピーします。
10.3.8.7 マネージャ検索ルールをチェックするプロジェクトの作成および実行方法
部門マネージャ・ファインダ・ルールセットを実行するプロジェクトを作成およびテストできます。
プロジェクトを作成します。
- 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
- 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
- 「実行構成の作成」ダイアログで、名前を入力します。たとえば、
DeptManagerFinder
と入力します。 - 「設定のコピー元」フィールドにDefaultと入力します。
- 「OK」をクリックします。
- 「DeptManagerFinder」を選択した状態で、「編集」をクリックします。
- 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
src\com\example
ディレクトリでDeptManagerFinder.javaを選択し、「開く」をクリックします。- 「実行構成の編集」ダイアログで「OK」をクリックします。
- 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のメニューで「DeptManagerFinder」を選択します。次の例に示すように、デシジョン・ポイントを実行すると、出力が生成されます。
Michael Hartstein is the manager of dept Marketing John Russell is the manager of dept Sales Adam Fripp is the manager of dept Shipping Den Raphaely is the manager of dept Purchasing Alexander Hunold is the manager of dept IT Shelley Higgins is the manager of dept Accounting Hermann Baer is the manager of dept Public Relations Susan Mavris is the manager of dept Human Resources Jennifer Whalen is the manager of dept Administration Nancy Greenberg is the manager of dept Finance Steven King is the manager of dept Executive Shelley Higgins is the manager of dept Accounting Hermann Baer is the manager of dept Public Relations Susan Mavris is the manager of dept Human Resources Jennifer Whalen is the manager of dept Administration Nancy Greenberg is the manager of dept Finance Alexander Hunold is the manager of dept IT Alexander Hunold is the manager of dept IT Nancy Greenberg is the manager of dept Finance Den Raphaely is the manager of dept Purchasing Adam Fripp is the manager of dept Shipping John Russell is the manager of dept Sales Jennifer Whalen is the manager of dept Administration Michael Hartstein is the manager of dept Marketing Susan Mavris is the manager of dept Human Resources Hermann Baer is the manager of dept Public Relations Shelley Higgins is the manager of dept Accounting
この例のツリー・モード・ルールで作業しているとき、出力に重複エントリがある場合、この重複エントリは、ビュー・オブジェクトのグラフの異なる部分にある同じデータで複数のルールを起動したことによって発生したものです。
10.3.9 従業員昇給ルールセットと従業員取消しルールセットの追加および実行方法
昇給ルールセットを実行するサンプル・コードでは、setViewObject
メソッドを使用するビュー・オブジェクトを指定して、デシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。デシジョン関数のコールとコールの間にこれらのインスタンスが作業メモリーに残らないよう、従業員取消しルールセットによって、各コールでアサートされたEmployee
のインスタンスがすべて取り消されます。「昇給ActionTypeのJava実装クラスの作成方法」のアクション・タイプは、ActionType
を使用してViewRowImpl
属性の値を変更する方法を示しています。
詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。
10.3.9.1 昇給ルールセットの追加方法
昇給ルールセットを追加します。
昇給ルールセットを追加するには:
- Rules Designerで、「ルールセットの作成」をクリックします。
- 「ルールセットの作成」ダイアログで、「名前」フィールドに
Raises Ruleset
と入力します。 - 「OK」をクリックします。
10.3.9.2 昇給ActionTypeのJava実装クラスの作成方法
サンプル・アプリケーションのこの部分を作成し、昇給ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionType
のJava実装クラスを作成する必要があります。ActionType
のすべてのサブクラスは、abstractのexec
メソッドを実装する必要があります。
昇給ActionTypeのJava実装クラスを作成するには:
10.3.9.3 昇給アクションのJavaファクトをインポートする方法
新しいJavaクラスが作成されました。このクラスをルール・デザイナのJavaファクト・タイプとしてインポートし、後でルールを作成するときに使用できるようにします。
Javaファクト・タイプを作成するには:
10.3.9.6 従業員昇給Javaクラスの追加方法
従業員昇給クラスを追加します。これにより、デシジョン関数が実行されます。
従業員昇給クラスを追加するには:
- Chapter10プロジェクトを選択します。
- 右クリックして「新規」を選択します。
- 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
- 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。
- 「名前」フィールドに、「
EmployeeRaises
」と入力します。「OK」をクリックします。 - このクラスのコンテンツを、次に示す
deptmanagerfinder
クラス・コードで置き換えます。
package com.example; import oracle.jbo.ApplicationModule; import oracle.jbo.ViewObject; import oracle.jbo.client.Configuration; import oracle.jbo.server.DBTransactionImpl2; import oracle.rules.rl.exceptions.RLException; import oracle.rules.sdk2.decisionpoint.DecisionPoint; import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder; import oracle.rules.sdk2.decisionpoint.DecisionPointInstance; import oracle.rules.sdk2.exception.SDKException; import oracle.rules.sdk2.repository.DictionaryFQN; public class EmployeeRaises { private static final String AM_DEF = "com.example.AppModule"; private static final String CONFIG = "AppModuleLocal"; private static final String VO_NAME = "EmployeesView1"; private static final String DF_NAME = "EmployeeRaises"; private static final DictionaryFQN DICT_FQN = new DictionaryFQN("com.example", "Chapter10Rules"); private DecisionPoint dp = null; public EmployeeRaises() { try { dp = new DecisionPointBuilder() .with(DICT_FQN) .with(DF_NAME) .build(); } catch (SDKException e) { System.err.println(e); } } public void run() { final ApplicationModule am = Configuration.createRootApplicationModule(AM_DEF, CONFIG); final ViewObject vo = am.findViewObject(VO_NAME); final DecisionPointInstance point = dp.getInstance(); point.setTransaction((DBTransactionImpl2)am.getTransaction()); point.setAutoCommit(true); point.setViewObject(vo); try { point.invoke(); } catch (RLException e) { System.err.println(e); } catch (SDKException e) { System.err.println(e); } for (DecisionPoint.NamedValue result : point.getResults()){ System.out.println(result.getName() + " " + result.getValue()); } } public static void main(String[] args) { new EmployeeRaises().run(); } }
10.3.9.7 MDSでアクセス可能な場所にディクショナリをコピーする方法
MDSでアクセス可能な場所に更新したディクショナリをコピーします。
MDSでアクセス可能な場所にディクショナリをコピーするには:
- ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10フォルダおよびChapter10プロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。
- Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、
.adf
ディレクトリにナビゲートします。 - oracleフォルダをこのディレクトリにコピーします。
10.3.9.8 昇給ルールをチェックするプロジェクトの作成および実行方法
従業員昇給ルールセットを実行して、プロジェクトを作成およびテストできます。
プロジェクトをビルドするには:
- 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
- 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
- 「実行構成の作成」ダイアログで、名前を入力します。たとえば、
EmployeeRaises
と入力します。 - 「設定のコピー元」フィールドにDefaultと入力します。「OK」をクリックします。
- 「EmployeeRaises」を選択した状態で、「編集」をクリックします。
- 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
- src\com\exampleフォルダから
「EmployeeRaises.java」
を選択します。「開く」をクリックします。 - 「実行構成の編集」ダイアログで「OK」をクリックします。
- 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のメニューで「EmployeeRaises」を選択します。次の例に示すように、Oracle JDeveloperに出力が表示されます。
raise for 100 0.03=>81.7 raise for 101 0.03=>1872.46 raise for 102 0.03=>60596.78 raise for 103 0.03=>31146.26 raise for 104 0.03=>20159.43 raise for 108 0.03=>35822.68 raise for 109 0.03=>26084.5 raise for 114 0.03=>27500.92 raise for 115 0.03=>7524.5 raise for 120 0.03=>16262.34 raise for 121 0.03=>16183.41 raise for 122 0.03=>15591.35 raise for 131 0.03=>3671.33 raise for 133 0.03=>4567.98 raise for 137 0.03=>4838.1 raise for 141 0.03=>4703.71 raise for 142 0.03=>4044.79 raise for 145 0.03=>17734.79 raise for 146 0.03=>17101.39 raise for 147 0.03=>15201.23 raise for 150 0.03=>12667.7 raise for 151 0.03=>12034.32 raise for 156 0.03=>13047.73 raise for 157 0.03=>12395.35 raise for 158 0.03=>11400.93 raise for 159 0.03=>10134.16 raise for 168 0.03=>14567.86 raise for 174 0.03=>13934.48 raise for 175 0.03=>11147.58 raise for 184 0.03=>5480.03 raise for 185 0.03=>5193.76 raise for 192 0.03=>5219.1 raise for 193 0.03=>4940.41 raise for 200 0.03=>5740.99 raise for 201 0.03=>16962.05 raise for 203 0.03=>8481.03 raise for 204 0.03=>13047.73 raise for 205 0.03=>15657.27 raise for 206 0.03=>10829.62