この章では、Oracle Business Rulesにより、ADF Business Componentsのビュー・オブジェクトをファクトとして使用可能にして、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフのツリーをアサートし、Oracle Business Rulesにメイン・ビュー・オブジェクトのツリー内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させる方法について説明します。
この章の項目は、次のとおりです。
ADF Business Componentsルール開発プロセスは、次のようにまとめることができます。
ビュー・オブジェクト定義を作成します。
アクション・タイプを作成します。
ルール・ディクショナリを作成します。
ビュー・オブジェクトのファクト・タイプを登録します。
アクションのJavaファクト・タイプを登録します。
Javaから起動する場合は、次のいずれかを実行します。
ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されている場合は、ビュー・オブジェクト・インスタンスを渡してデシジョン・ポイントの起動をコーディングします。
ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されていない場合は、ビュー・オブジェクトのキー値を渡してデシジョン・ポイントの起動をコーディングします。
ADF Business Componentsビュー・オブジェクトがOracle Business Rulesデータ・モデルにインポートされるとき、図10-1に示すように、ビュー・オブジェクトの各属性に対応するプロパティを持ったADF Business Componentsファクト・タイプが作成されます。
また、ADF Business Componentsファクト・タイプには、次のプロパティが含まれています。
プロパティViewRowImpl。各ファクト・インスタンスが表すoracle.jbo.Row
インスタンスを直接指します。
プロパティkey_values。oracle.rules.sdk2.decisionpoint.KeyChain
オブジェクトを指します。このプロパティは、この行と親行のキー値セットの取得に使用できます。
次のことに注意してください。
ビュー・オブジェクト定義間の関係は、ビュー定義の属性、特にビュー・リンクのアクセッサである属性のイントロスペクションによって決定されます。
ADF Business Componentsファクト・タイプ・インポータでは、どの関係が1対1で、どの関係が1対多であるかが正しく判別され、それに従ってディクショナリに定義が生成されます。1対多関係の場合、生成されるプロパティのタイプはList
であり、実行時に示されたタイプのファクトが含まれています。
ADF Business Componentsファクト・タイプはJavaファクト・タイプではなく、ビュー・オブジェクト用に明示的に作成された実装クラスのメソッドは起動できません。
この種のメソッドをコールする必要がある場合は、ビュー・オブジェクト実装をADF Business Componentsファクト・タイプのかわりにJavaファクト・タイプとしてディクショナリに追加します。この場合、すべてのgetter、setterおよびその他のメソッドが使用可能になりますが、関連するビュー・オブジェクトにアクセスできなくなり、そのオブジェクトへのアクセスが必要な場合は、これらの関係を明示的に管理する必要があるというトレードオフがあります。
ADF Business Componentsファクト・タイプを使用すると、Oracle Business Rules内部では、RLファクト・タイプのインスタンスとしてADF Business Componentsファクト・タイプが作成されます。つまり、このことは、ADF Business Componentsビュー・オブジェクト・インスタンスをルール・セッションに直接アサートすることはできず、かわりにMetadataHelper
およびADFBCFactTypeHelper
クラスに用意されているヘルパー・メソッドを使用する必要があることを意味します。詳細は、『Oracle Fusion Middleware Java API Reference for 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のメソッド
メソッド | 説明 |
---|---|
|
アクション・タイプに必要な可能性がある実行時指定パラメータを含む デシジョン・サービスのデシジョン関数を使用する場合は、文字列値のみを使用します。 |
|
ルール・ディクショナリ内の静的構成変数へのアクセス元として使用できる、Oracle Business Rules RuleSessionオブジェクトへのアクセスを提供します。 |
|
コール元により移入される場合、Set Controlのインダイレクトに使用する文字列値を提供します。 |
|
アクション・タイプがバックエンドで永続的に変更できるように、トランザクション・オブジェクトを提供します。 |
|
指定の結果を文字列キーおよびオブジェクト値の形式で出力値のリストに追加します。 出力は、純粋なマップ実装の場合と同様に、 |
Rules Designerを使用すると、構成中のActionType
に適切なパラメータを選択できます。
デシジョン・ポイントを使用すると、デシジョン関数を実行できます。ADF Business Componentsファクト・タイプを使用している場合にのみ適用される特定のデシジョン・ポイント・メソッドがあります。デシジョン関数の詳細は、第6章「デシジョン関数の使用」を参照してください。
ADF Business Componentsファクト・タイプを使用する場合は、Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数を起動します。
Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする手順は、次のとおりです。
DecisionPointBuilder
を使用して、テンプレートDecisionPoint
インスタンスを作成し、構成します。
詳細は、第7.3.1項「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」を参照してください。
DecisionPoint
のメソッドgetInstance
を使用して、DecisionPointInstance
を作成します。
DecisionPointInstance
のメソッドaddInput
、setInputs
またはsetViewObject
を使用して、使用するファクト・オブジェクトをDecisionPointInstance
に追加します。これらは、ViewObject
またはViewObjectReference
インスタンスです。これらは、デシジョン関数の入力で宣言されるのと同じ順序で追加する必要があります。詳細は、第10.2.1.3項「ADF Business Componentsルールに使用するinvokeメソッドのコール」を参照してください。
DecisionPointInstance
で使用されるトランザクションを設定します。
詳細は、第10.2.1.1項「デシジョン・ポイント・トランザクションの設定」を参照してください。
以降のアプリケーション・アクションに必要なランタイム・プロパティを設定します。
詳細は、第10.2.1.2項「ランタイム・プロパティの設定」を参照してください。
DecisionPointInstance
のメソッドinvoke
をコールします。
詳細は、次を参照してください。
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トランザクションおよびローカル・トランザクションのどちらを表すかを指定するフラグ。
setProperty
メソッドを使用してランタイム・プロパティを提供できます。これらのプロパティは、実行中にActionType
インスタンスにより取得できます。ランタイム・プロパティが不要な場合は、これらのコールを安全に省略できます。
デシジョン・ポイントの起動で使用されるViewObject
は、表10-2に示すように、2つの方法のいずれかを使用して指定できます。
表10-2 デシジョン・ポイントの起動用のビュー・オブジェクトの設定
ViewObject設定メソッド | 説明 |
---|---|
|
このデシジョン関数は、 この使用について詳しくは、第10.3.9.3項「従業員取消しルールセットの追加方法」を参照してください。 |
|
このデシジョン関数は、同時にロードされたすべての |
例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); } }
Oracle Business Rules SDKデシジョン・ポイント・インタフェースを持つADF Business Componentsファクト・タイプを使用して、ルールセットを持つデシジョン関数をコールするには、特定のオプションを使用してデシジョン関数を構成する必要があります。デシジョン関数の使用の詳細は、第6章「デシジョン関数の使用」を参照してください。
Javaデシジョン・ポイント・インタフェースを使用してデシジョン関数を定義する手順は、次のとおりです。
「デシジョン関数」項目の左にある「デシジョン関数」アイコンをダブルクリックするか、この項目を選択して「編集」アイコンをクリックします。「デシジョン関数の編集」ダイアログが表示されます。
「デシジョン関数の編集」ダイアログで、デシジョン関数を構成します。
入力のファクト・タイプ: 構成済のビジネス・ルールに使用するファクト・タイプの名前を指定します。
ADF Business Componentsファクト・タイプを使用するアプリケーションを使用している場合、入力はルールで使用されるADF Business Componentsビュー・オブジェクトとなります。
デシジョン・ポイントでsetViewObject
を使用する場合は、「リスト」属性の選択を解除する必要があります。デシジョン・ポイントでaddInput
メソッドまたはsetInputs
メソッドを使用しているときに、入力のファクト・タイプごとに「リスト」属性を選択する必要があります。ビュー・オブジェクトの使用に応じて「ツリー」属性を選択することもできます。
「リスト」: ADF Business Componentsファクト・タイプのリストがデシジョン関数に渡されるように定義します。
「ツリー」: マスター/ディテール階層内の最上位レベル・オブジェクトのみでなく、すべてのオブジェクトをアサートするように定義します。
詳細は、第10.2.1項「ADF Business Componentsファクトによるデシジョン・コンポーネントのコール」を参照してください。
出力のファクト・タイプ: コール元が戻すファクト・タイプを定義します。
ADF Business Componentsファクト・タイプを使用するデシジョン関数のJavaデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする場合、出力のファクト・タイプは空のままにする必要があります。ビュー・オブジェクトは、ActionType
を使用して更新されます。詳細は、第10.1.2項「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。
「ルールセットおよびデシジョン関数」: このデシジョン関数で実行するルールセットおよび他のデシジョン関数の順序付きリストです。DecisionPointディクショナリからのルールセットDecisionPointDictionary.PreprocessingおよびDecisionPointDictionary.Postprocessingは、それぞれアプリケーション固有のルールセットおよびデシジョン関数の前と後に実行するように追加する必要があります。
デシジョン関数の定義には、ルールセットとデシジョン関数の両方を含めることができます。アプリケーションでは、通常、配管コードとして機能するなんらかのルールまたはデシジョン関数が必要です。このようなアプリケーションには、入力データのトランスフォーメーション、補助ファクトのアサートまたは出力ファクトの処理を実行するコンポーネントが含まれます。配管コードは、アプリケーションのコア・ビジネス・ルールを含むルールの前または後に実行することが必要となる場合があります。こうしたアプリケーションの問題とそれに関連するルールをネストしたデシジョン関数を使用して、アプリケーションの機能の問題と切り離すことができます。ネストしたデシジョン関数を使用すると、内側のデシジョン関数に管理上の配管指向の問題が含まれなくなるため、内側のデシジョン関数ではアプリケーションのコア・ロジックを定義するルールのみが示されるようになります。この設計によって、ユーザーが管理上のルールを理解する必要がなくなり、ユーザーがルールに不適切な変更を加えること(および、このことにより、システムが操作不能になる事態)を防止できます。
複数のルールセットおよびネストしたデシジョン関数を使用して構成を作成するには、2つのデシジョン関数を作成し、一方を他方に追加します。適切なネーミング方法は、ネストした内側のデシジョン関数に接尾辞Core
を付けることです。これにより、ユーザー指定のルールセットをこの内側のCore
デシジョン関数に追加できます。たとえば、DecisionPointDictionary.Preprocessingデシジョン関数、DecisionFunction_1Coreデシジョン関数およびDecisionPointDictionary.Postprocessingデシジョン関数を実行するようにDecisionFunction_1を定義できます。この例では、DecisionFunction_1Coreにコア・ビジネス・ロジック・ルールセットが含まれています。
デシジョン・ポイントの入力を、ADF Business Componentsオブジェクトのツリーのルートである、ADF Business Componentsのファクト・タイプにすることも一般的です。ただし、ユーザーはツリーに存在するタイプのサブセットに一致する、ビジネス・ルールのみを記述できます。この場合、ネストしたデシジョン関数の入力を、格納されたルールセットに実際に一致するタイプのみになるよう定義することを習慣にするとよいでしょう。たとえば、ツリー・オプションが選択されたEmployee
ファクト・タイプが入力である、デシジョン関数をコールするデシジョン・ポイントを考えてみます。このデシジョン関数は、Department
ファクト・タイプに一致するルールセットのみが存在する、ネストしたデシジョン関数を含むとします。この場合、ネストしたデシジョン関数には、入力としてツリー・オプションが選択されたEmployee
ファクト・タイプまたはリスト・オプションが選択されたDepartment
ファクト・タイプのいずれかを指定できます。この例では、ツリー・オプションにより、Employee
インスタンスの子が発生します。これにはDepartment
インスタンスのアサートも含まれます(これらのタイプ間の1対多関連のため)。Employee
が外側のデシジョン関数の入力で、ツリー・オプションが選択されている場合、Department
ファクト・タイプのインスタンスがアサートされ、内側のデシジョン関数のシグネチャをDepartment
のインスタンス(このデシジョン関数に適合された正確なタイプ)のリストとして識別できます。
ADF Business Componentsサンプル・アプリケーションでは、ADF Business Componentsファクト・タイプの使用を示します。
Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。
Oracle Business RulesでADF Business Componentsファクトを使用するには、まずOracle JDeveloperでアプリケーションおよびプロジェクトを作成する必要があります。
ADF Business Componentsファクトを使用するアプリケーションを作成する手順は、次のとおりです。
Oracle JDeveloperを起動します。Oracle JDeveloperの開始ページが表示されます。
「アプリケーション・ナビゲータ」でアプリケーション・メニューの「新規アプリケーション」をクリックします。
「アプリケーションの名前付け」ページで、新規アプリケーションの名前および場所を入力します。
「アプリケーション名」フィールドに、アプリケーション名を入力します。たとえば、Chapter10
と入力します。
「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。
「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞を入力します。たとえば、com.example
と入力します。
この接頭辞はグローバルで一意である必要があり、通常は自社が所有しているドメイン名を使用します。この接頭辞とそれに続くピリオドは、アプリケーションの初期プロジェクトで作成されるオブジェクトに適用されます。
このサンプルでは、接頭辞com.example
を使用します。
「アプリケーション・テンプレート」フィールドで「Fusion Webアプリケーション(ADF)」を選択します。
「終了」をクリックします。
Chapter10という新規プロジェクトを追加する必要があります。
新規プロジェクトを追加します。
Chapter10アプリケーションで、「アプリケーション・メニュー」を選択します。
「アプリケーション・メニュー」リストから「新規プロジェクト」を選択します。
「新規ギャラリ」の「項目」領域で、「汎用プロジェクト」を選択します。
「OK」をクリックします。
「プロジェクトの名前付け」ページで、「プロジェクト名」フィールドにChapter10
と入力します。
「終了」をクリックします。
データベース表からADF Business Componentsを追加する必要があります。この例では、標準のHRデータベース表を使用します。
ADF Business Componentsを追加する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。
右クリックしてメニューから「新規」を選択します。
「新規ギャラリ」の「カテゴリ」領域で、「ビジネス層」を開いて「ADF Business Components」を選択します。
「項目」領域で、「表からのビジネス・コンポーネント」を選択します。
「OK」をクリックします。
「ビジネス・コンポーネント・プロジェクトの初期化」ダイアログで、必要な接続情報を入力して、接続を追加します。
「OK」をクリックします。表からのビジネス・コンポーネントの作成ウィザードが表示されます。
「エンティティ・オブジェクト」ページで、「使用可能」ボックスのオブジェクトを「選択済」ボックスに移動して、必要なオブジェクトを選択します。完成したリストを表示するために、「問合せ」をクリックすることが必要となる場合があります。たとえば、図10-2に示すように、「DEPARTMENTS」および「EMPLOYEES」を選択します。
「次へ」をクリックします。「更新可能なビュー・オブジェクト」ページが表示されます。
図10-3に示すように、「更新可能なビュー・オブジェクト」ページで「Departments」および「Employees」を選択します。
「次へ」をクリックします。「読取り専用ビュー・オブジェクト」ページが表示されます。
「次へ」をクリックします。「アプリケーション・モジュール」ページが表示されます。
「終了」をクリックします。
アプリケーションのパフォーマンス要件に合わせて、ViewObject
をチューニングする必要があります。
EmployeesViewのチューニング・オプションを設定する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で「EmployeesView」をダブルクリックします。
「一般」ナビゲーション・タブで、「チューニング」を開きます。
「チューニング」領域で「すべての行」を選択します。
「チューニング」領域で、Batches of:フィールドに128と入力します。
「チューニング」領域で「一度にすべて」を選択します。
DepartmentsViewのチューニング・オプションを設定する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で「DepartmentsView」をダブルクリックします。
「一般」ナビゲーション・タブで、「チューニング」を開きます。
「チューニング」領域で「すべての行」を選択します。
「チューニング」領域で、Batches of:フィールドに128と入力します。
「チューニング」領域で「一度にすべて」を選択します。
Oracle JDeveloperを使用して、Oracle Business Rulesディクショナリを作成します。
ディクショナリを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。
右クリックして、リストから「新規」を選択します。
「新規ギャラリ」ウィンドウで、「すべてのテクノロジ」タブを選択して「カテゴリ」領域で「ビジネス層」を開き、「ビジネス・ルール」を選択します。
「新規ギャラリ」の「項目」領域で「ビジネス・ルール」を選択します。
「OK」をクリックします。
図10-4に示すように、「ビジネス・ルールの作成」ダイアログで、ディクショナリ名とパッケージを入力します。
たとえば、「名前」フィールドにChapter10Rules
と入力します。
たとえば、「パッケージ」フィールドにcom.example
と入力します。
「OK」をクリックします。
図10-5に示すように、JDeveloperによりRules Designerにディクショナリが作成され、Chapter10Rules.rules
ファイルが開きます。
Oracle Business Rulesによって提供されているデシジョン・ポイント・ディクショナリへのディクショナリ・リンクを追加する必要があります。このディクショナリでは、ADF Business Componentsオブジェクトを持つデシジョン・ポイント・インタフェースで使用する機能がサポートされています。
デシジョン・ポイント・ディクショナリ・リンクを追加します。
Rules Designerで、「リンク」ナビゲーション・タブをクリックします。
「作成」アイコンの横にあるメニューから、「デシジョン・ポイント・ディクショナリ」を選択します。この操作は、完了に時間がかかる場合があります。操作が完了した後、Rules Designerは、図10-6に示すように、デシジョン・ポイント・ディクショナリへのリンクを追加します。
Rules DesignerでADF Business Componentsファクトをインポートして、ルールの作成時にこれらのオブジェクトを使用できるようにします。
ADF Business Componentsファクトをインポートします。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
「ADF-BCファクト」タブを選択します。
「作成」アイコンをクリックします。「ADF-BCファクト」ページが表示されます。
「接続」フィールドのリストから、ADF Business Componentsオブジェクトが使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。
「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。たとえば、「com.example.EmployeesView」を選択します。
「OK」をクリックします。図10-7に示すように、「ファクト」ナビゲーション・タブが表示されます。
図10-7 Rules DesignerのADF Business Componentsファクト
ADF Business Componentsファクトには循環参照が含まれていることがあります。この場合は、次のような検証警告が示されます。
RUL-05037: A circular definition exists in the data model
「ビジネス・ルール」検証ログにこの警告が表示されている場合は、循環参照を手動で解決する必要があります。このためには、循環参照に含まれているいずれか1つのプロパティの「参照可能」チェック・ボックスの選択を解除します。
プロパティを表示不可能としてマーク付けする手順は、次のとおりです。
「ファクト」ナビゲーション・タブで、「ADF-BCファクト」タブを選択します。
「DepartmentsView」行のアイコンをダブルクリックします。
「プロパティ」表の「EmployeesView」行で、「参照可能」チェック・ボックスの選択を解除します。
「OK」をクリックします。
DepartmentsViewおよびEmployeesViewの別名を設定する手順は、次のとおりです。
「ファクト」ナビゲーション・タブで、「ADF-BCファクト」タブを選択します。
「エイリアス」列で、EmployeesViewをEmployeeで置き換えます。
「エイリアス」列で、DepartmentsViewをDepartmentで置き換えます。
外部マネージャ・ルールセットを実行するサンプル・コードは、setInputs
メソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数が1回起動し、すべてのビュー・オブジェクト行がList
にロードされます。この方法を使用してデシジョン・ポイントを起動する場合、すべてのビュー・オブジェクト行が同時にメモリーにロードされる必要があり、OutOfMemory例外が発生する可能性があるため、スケーラブルではありません。この起動スタイルは、既知のビュー・オブジェクト行が少数ある場合にのみ使用します。setViewObject
でデシジョン・ポイントを使用することもできます。詳細は、第10.2.1項「ADF Business Componentsファクトによるデシジョン・コンポーネントのコール」を参照してください。
ビュー・オブジェクトがファクトとしてインポートされた後、ルールセットの名前を変更して、アプリケーションのデシジョン関数を作成できます。
ルールセットの名前を変更する手順は、次のとおりです。
Rules Designerで、「Ruleset_1」ナビゲーション・タブを選択します。
ルールセット名を選択し、Outside Manager Ruleset
と入力して、ルールセットの名前を変更します。
デシジョン関数を追加する手順は、次のとおりです。
「デシジョン関数」ナビゲーション・タブをクリックします。
「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。
図10-8に示すように、デシジョン関数のフィールドを編集します。
「名前」に値FindOutsideManagers
を入力します。
「入力」領域で、「入力の追加」アイコンをクリックして入力情報を次のように編集します。
「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。
「リスト」チェック・ボックスを選択します。
このデシジョン関数では、ActionType
APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。詳細は、第10.1.2項「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。
「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。
DecisionPointDictionary.Preprocessing
Outside Manager Ruleset
DecisionPointDictionary.Postprocessing
「選択済」領域で、項目が図10-8に示す順序で表示されていることを確認します。
順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。
「OK」をクリックします。
複数の警告が表示されます。これらの警告は、後のステップでルールセットにルールを追加すると、削除されます。
サンプル・アプリケーションを作成し、ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionType
のJava実装クラスを作成する必要があります。ActionType
のすべてのサブクラスは、abstractのexec
メソッドを実装する必要があります。
ActionTypeのJava実装クラスを作成する手順は、次のとおりです。
Oracle JDeveloperで、「Chapter10」というプロジェクトを選択します。
「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」フォルダを選択します。
右クリックして、リストから「新規」を選択します。
「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。
「OK」をクリックします。
図10-9に示すように、「Javaクラスの作成」ダイアログで次のプロパティを構成します。
「名前」に値MessageAction
を入力します。
「パッケージ」に値com.example
を入力します。
「拡張」に値oracle.rules.sdk2.decisionpoint.ActionType
を入力します。
「OK」をクリックします。
Oracle JDeveloperによってJavaクラスが表示されます。
このコードを、例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; } }
アプリケーション・ナビゲータで、「MessageAction.java
」を右クリックし、リストから「メイク」を選択します。
新しいJavaクラスを作成したため、後でルールを作成するときに使用できるように、このクラスをRules DesignerのJavaファクト・タイプとして追加する必要があります。
Javaファクト・タイプを作成する手順は、次のとおりです。
従業員とは別の部門にいるマネージャを検索するルールを追加します。
別部門のマネージャ検索ルールを追加する手順は、次のとおりです。
Rules Designerで、「Outside Manager Ruleset」タブを選択します。
「追加」をクリックし、リストから「ルールの作成」を選択します。
デフォルトのルール名「Rule_1」を選択して、ルールの名前を変更します。これによりテキスト入力領域が表示されます。名前を入力します。たとえば、Find managers in different departmentと入力します。[Enter]を押して名前を適用します。
「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。
図10-12に示すように、ルールの「拡張モード」を選択します。
図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
外部マネージャ・ファインダ・クラスを追加します。このクラスはデシジョン・ポイントを使用して、デシジョン関数を実行します。
外部マネージャ・ファインダ・クラスを追加する手順は、次のとおりです。
Chapter10プロジェクトを選択します。
右クリックして「新規」を選択します。
「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。
「OK」をクリックします。
「名前」フィールドにOutsideManagerFinder
と入力します。
「OK」をクリックします。
このクラスのコンテンツを、例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(); } }
ADF-META-INF
ファイルの、ディクショナリにアクセスするためのMDS情報を更新する必要があります。MDSを持つローカル・ファイルを使用して、Oracle Business Rulesディクショナリにアクセスできます。ただし、一般的に、本番環境のOracle Business Rulesでは、ディクショナリ・アクセスにこの手順を使用しません。本番環境でのデシジョン・ポイントを使用したMDSによるディクショナリへのアクセスの詳細は第7.5項「本番環境でのデシジョン・ポイントの使用に関する必須情報」を参照してください。
ADF-META-INFを更新します。
「アプリケーション・ナビゲータ」で「アプリケーション・リソース」を開きます。
「ディスクリプタ」フォルダおよび「ADF META-INF」フォルダを開きます。
adf-config.xmlをダブルクリックして、このファイルを開きます。
「ソース」タブをクリックして、adf-config.xml
のソースを表示します。
</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>
属性metadata-path
を持つ<property>
要素で、使用しているシステムのアプリケーションの.adf
ディレクトリに一致するようにパスを変更します。
MDSでアクセス可能な場所に定義をコピーします。
ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーション、Chapter10プロジェクトおよびsrcフォルダにナビゲートし、comフォルダを選択およびコピーします。
Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。
comフォルダをこのディレクトリにコピーします。
MDSでアクセス可能な場所にディクショナリをコピーします。
ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびChapter10プロジェクトにナビゲートし、Oracle Business Rulesディクショナリを含むoracleディレクトリをコピーします。
Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。
oracleフォルダをこのディレクトリにコピーします。
従業員が別の部門にいるマネージャの検索ルールを実行して、プロジェクトを作成しおよびテストできます。
OutsideManagerFinder構成を作成します。
「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
「実行構成の作成」ダイアログで、名前を入力します。たとえば、OutsideManagerFinder
と入力します。
「OK」をクリックします。
「OutsideManagerFinder」を選択した状態で、「編集」をクリックします。
「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
src\com\example
フォルダから「OutsideManagerFinder.java」を選択します。
「開く」をクリックします。
「実行構成の編集」ダイアログで「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
プロジェクトを実行します。
「プロジェクトの実行」アイコンの横にあるドロップダウン・メニューから、「OutsideManagerFinder」を選択します。
例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
部門マネージャ・ルールセットを実行するサンプル・コードは、setViewObject
メソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。すべてのデシジョン関数コールは、同じRuleSession内で発生します。デシジョン関数のコールとコールの間に、RuleSessionによって、以前のデシジョン関数コールのすべての状態が保存されます。このため、以前のコール時にアサートされたオブジェクトは、指定するルールセットによって明示的に取り消されない場合、次のコールの作業メモリーに残ります。状態が保持されている場合は、取消しアクションを使用するルールを持つルールセットを実行して、コールとコールの間にすべてのファクトまたは選択したファクトを取り消すことができます。このルールセットは、デシジョン・ポイントで使用する同じデシジョン関数の一部として実行されます。図10-15では、Retract all employeesルールセットによるこれらのファクトの取消しの例を示しています。詳細は、第10.2.1項「ADF Business Componentsファクトによるデシジョン・コンポーネントのコール」を参照してください。
部門マネージャ・ファインダ・ルールセットを追加します。
部門マネージャ・ファインダ・ルールセットを追加する手順は、次のとおりです。
Rules Designerで、「ルールセットの作成」をクリックします。
「ルールセットの作成」ダイアログで、「名前」フィールドにDepartment Manager Finder Ruleset
と入力します。
「OK」をクリックします。
次に、部門マネージャを検索する検索ルールを追加します。このルールは、Oracle ADF Business Componentsファクト・タイプでのツリー・モードルールの使用を示します。
部門マネージャ・ファインダ・ルールを追加します。
Rules Designerで、「Department Manager Finder Ruleset」を選択します。
「追加」アイコンの横にあるドロップダウン・メニューで、「ルールの作成」をクリックします。
名前「Rule_1」を選択し、Find
を入力して、ルールの名前を変更します。
「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。
ルールで、「ツリー・モード」を選択します。
図10-14に示すように、Findルールのテストおよびアクションを入力します。「THEN」領域のアサートは長すぎて図に表示しきれません。図10-14に表示されていない、このルールの完全なテキストを次に示します。
Employee.FirstName + " " + Employee.LastName + " is the manager of dept " + Employee/DepartmentsView.DepartmentName
従業員ファクト・タイプ・インスタンスを取り消すルールセットを追加します。これにより、従業員ファクト・タイプが、デシジョン関数の起動と起動の間に削除されます。
従業員取消しルールセットを追加する手順は、次のとおりです。
Retract Employees Rulesetを追加します。
図10-15に示すように、「Retract Employees Ruleset」でルールを追加し、このルールにRetract all employeesという名前を付けます。
部門マネージャ・ファインダ・ルールセット用のデシジョン関数を作成します。このデシジョン関数を使用して、デシジョン・ポイントからルールセットを実行します。
部門マネージャ・ファインダ・ルールセットのデシジョン関数を追加する手順は、次のとおりです。
「デシジョン関数」ナビゲーション・タブをクリックします。
「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。
図10-16に示すように、デシジョン関数のフィールドを更新します。
「名前」に値FindDepartmentManagers
を入力します。
「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。
「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。
「ツリー」チェック・ボックスを選択します。
このデシジョン関数では、ActionType
APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。
「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。
DecisionPointDictionary.Preprocessing
Department Manager Finder Ruleset
Retract Employees
DecisionPointDictionary.Postprocessing
「選択済」領域で、項目が図10-16に示す順序で表示されていることを確認します。
順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。
「OK」をクリックします。
部門マネージャ・ファインダ・クラスを追加します。このクラスには、デシジョン関数を実行するデシジョン・ポイントが指定されたコードが含まれます。
部門マネージャ・ファインダ・クラスを追加します。
「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。
右クリックして「新規」を選択します。
「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。
「OK」をクリックします。
「名前」フィールドにDeptManagerFinder
と入力します。
「OK」をクリックします。
このクラスのコンテンツを、例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(); } }
MDSでアクセス可能な場所に更新したディクショナリをコピーします。
MDSでアクセス可能な場所にディクショナリをコピーします。
ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびプロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。
Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adf
ディレクトリにナビゲートします。
oracleフォルダをこのディレクトリにコピーします。
部門マネージャ・ファインダ・ルールセットを実行するプロジェクトを作成およびテストできます。
プロジェクトを作成します。
「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
「実行構成の作成」ダイアログで、名前を入力します。たとえば、DeptManagerFinder
と入力します。
「設定のコピー元」フィールドにDefaultと入力します。
「OK」をクリックします。
「DeptManagerFinder」を選択した状態で、「編集」をクリックします。
「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
src\com\example
ディレクトリから「DeptManagerFinder.java」を選択します。
「開く」をクリックします。
「実行構成の編集」ダイアログで「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
プロジェクトを実行します。
「プロジェクトの実行」アイコンの横にあるメニューから、「DeptManager Finder」を選択します。
例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
この例のツリー・モード・ルールで作業しているとき、出力に重複エントリがある場合、この重複エントリは、ビュー・オブジェクトのグラフの異なる部分にある同じデータで複数のルールを起動したことによって発生したものです。
昇給ルールセットを実行するサンプル・コードでは、setViewObject
メソッドを使用するビュー・オブジェクトを指定して、デシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。デシジョン関数のコールとコールの間にこれらのインスタンスが作業メモリーに残らないよう、従業員取消しルールセットによって、各コールでアサートされたEmployee
のインスタンスがすべて取り消されます。例10-10のアクション・タイプは、ActionType
を使用してViewRowImpl
属性の値を変更する方法を示しています。詳細は、第10.2.1項「ADF Business Componentsファクトによるデシジョン・コンポーネントのコール」を参照してください。
昇給ルールセットを追加します。
昇給ルールセットを追加する手順は、次のとおりです。
Rules Designerで、「ルールセットの作成」をクリックします。
「ルールセットの作成」ダイアログで、「名前」フィールドにRaises Ruleset
と入力します。
「OK」をクリックします。
サンプル・アプリケーションのこの部分を作成し、昇給ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionType
のJava実装クラスを作成する必要があります。ActionType
のすべてのサブクラスは、abstractのexec
メソッドを実装する必要があります。
昇給ActionTypeのJava実装クラスを作成する手順は、次のとおりです。
Oracle JDeveloperで、「Chapter10」というプロジェクトを選択します。
「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」フォルダを選択します。
右クリックして、リストから「新規」を選択します。
「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。
「OK」をクリックします。
図10-17に示すように、「Javaクラスの作成」ダイアログで次のプロパティを構成します。
「名前」に値RaiseAction
を入力します。
「パッケージ」に値com.example
を入力します。
「拡張」に値oracle.rules.sdk2.decisionpoint.ActionType
を入力します。
「OK」をクリックします。
Oracle JDeveloperによってJavaクラスが表示されます。
このコードを、例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; } }
アプリケーション・ナビゲータで、「RaiseAction.java
」を右クリックし、リストから「メイク」を選択します。
新しいJavaクラスが作成されました。このクラスをRules DesignerのJavaファクト・タイプとしてインポートし、後でルールを作成するときに使用できるようにします。
Javaファクト・タイプを作成する手順は、次のとおりです。
Rules Designerで、「ManagerRules.rules」
ディクショナリを選択します。
「ファクト」ナビゲーション・タブをクリックし、「Javaファクト」タブを選択します。
「作成」をクリックします。
「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、com
およびexample
を開いて、「RaiseAction」チェック・ボックスを表示します。
図10-18に示すように、「RaiseAction」チェック・ボックスを選択します。
「OK」をクリックします。
「Javaファクト」表に昇給アクション・ファクト・タイプが追加されます。
このルールは、アクション・タイプを使用して、データベース・エントリを更新する方法を示します。
12年昇給ルールを追加する手順は、次のとおりです。
Rules Designerの「Raises Ruleset」で、「ルールの作成」をクリックします。
名前「Rule_1」を選択し、値Longer than 12 years
を入力して、ルールの名前を変更します。
「詳細設定の表示」をクリックします。詳細は、第4.5.1項「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。
「拡張モード」を選択します。
図10-19に示すように、12年昇給しルールを入力します。
従業員昇給ルールセットおよびすべての従業員の取消しルールセット用のデシジョン関数を作成します。
デシジョン関数を追加する手順は、次のとおりです。
「デシジョン関数」ナビゲーション・タブをクリックします。
「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。
図10-20に示すように、デシジョン関数のフィールドを更新します。
「名前」に値EmployeeRaises
を入力します。
「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。
「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。
このデシジョン関数では、ActionType
APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。
「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。
DecisionPointDictionary.Preprocessing
Raises Ruleset
Retract Employees Ruleset
DecisionPointDictionary.Postprocessing
「選択済」領域で、項目が図10-20に示す順序で表示されていることを確認します。
順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。
「OK」をクリックします。
従業員昇給クラスを追加します。これにより、デシジョン関数が実行されます。
従業員昇給クラスを追加する手順は、次のとおりです。
Chapter10プロジェクトを選択します。
右クリックして「新規」を選択します。
「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。
「OK」をクリックします。
「名前」フィールドにEmployeeRaises
と入力します。
「OK」をクリックします。
このクラスのコンテンツを、例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(); } }
MDSでアクセス可能な場所に更新したディクショナリをコピーします。
MDSでアクセス可能な場所にディクショナリをコピーします。
ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10フォルダおよびChapter10プロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。
Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adf
ディレクトリにナビゲートします。
oracleフォルダをこのディレクトリにコピーします。
従業員昇給ルールセットを実行して、プロジェクトを作成およびテストできます。
プロジェクトを作成します。
「実行」アイコンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
「実行構成の作成」ダイアログで、名前を入力します。たとえば、EmployeeRaises
と入力します。
「設定のコピー元」フィールドにDefaultと入力します。
「OK」をクリックします。
「EmployeeRaises」を選択した状態で、「編集」をクリックします。
「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
src\com\example
フォルダから「EmployeeRaises.java」を選択します。
「開く」をクリックします。
「実行構成の編集」ダイアログで「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
プロジェクトを実行します。
「プロジェクトの実行」アイコンの横にあるメニューから、「EmployeeRaises」を選択します。
例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