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ビジネス・コンポーネント・ルールを使用して、次のことができます。

  1. ビュー・オブジェクト定義を作成します。

  2. アクション・タイプを作成します。

  3. ルール・ディクショナリを作成します。

  4. ビュー・オブジェクトのファクト・タイプを登録します。

  5. アクションのJavaファクト・タイプを登録します。

  6. Javaから起動する場合は、次のいずれかを実行します。

    • ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されている場合は、ビュー・オブジェクト・インスタンスを渡してデシジョン・ポイントの起動をコーディングします。

    • ビュー・オブジェクトがデシジョン・ポイントでインスタンス化されていない場合は、ビュー・オブジェクトのキー値を渡してデシジョン・ポイントの起動をコーディングします。

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

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

また、ADFビジネス・コンポーネント・ファクト・タイプには、次のプロパティが含まれています。

  • プロパティViewRowImpl。各ファクト・インスタンスが表すoracle.jbo.Rowインスタンスを直接指します。

  • プロパティkey_valuesoracle.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のメソッド

方法 説明

getProperties

アクション・タイプに必要な可能性がある実行時指定パラメータを含むHashMap<String,Object>オブジェクトを提供します。

デシジョン・サービスのデシジョン関数を使用する場合は、文字列値のみを使用します。

getRuleSession

ルール・ディクショナリ内の静的構成変数へのアクセス元として使用できる、Oracle Business Rules RuleSessionオブジェクトへのアクセスを提供します。

getActivationID

コール元により移入される場合、Set Controlのインダイレクトに使用する文字列値を提供します。

getTransaction

アクション・タイプがバックエンドで永続的に変更できるように、トランザクション・オブジェクトを提供します。

addResult

指定の結果を文字列キーおよびオブジェクト値の形式で出力値のリストに追加します。

出力は、純粋なマップ実装の場合と同様に、oracle.rules.sdk2.decisionpoint.DecisionPointInstance.NamedValueオブジェクトのListとしてアセンブルされます。NamedValueオブジェクトは、名前および値ごとにgetterを持つ単純なデータ伝達クラスです。あるアクション・タイプ・インスタンスの出力値が相互に上書きすることは許可されず、この点ではアクション・タイプの実装が互いに完全に独立しているものとみなす必要があります。

10.1.2.1 ActionType実装のサンプル

例10-1に、ActionType実装のサンプルと、execメソッドのパラメータとしてのoracle.rules.sdk2.decisionpoint.DecisionPointInstanceを示します。

例10-1 ActionTypeの実装

package com.example;
 
import oracle.jbo.domain.Number;
 
import oracle.rules.sdk2.decisionpoint.ActionType;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
 
public class RaiseAction extends ActionType {
    private double raisePercent;
 
    public void exec(DecisionPointInstance dpi) {
        Number salary = (Number)getViewRowImpl().getAttribute("Salary");
        salary = (Number)salary.multiply(1.0d + getRaisePercent()).scale(100,2, new boolean[]{false});
        dpi.addResult("raise for " + this.getViewRowImpl().getAttribute("EmployeeId"),
                      getRaisePercent() + "=>" + salary );
        getViewRowImpl().setAttribute("Salary", salary);
    }
 
    public void setRaisePercent(double raisePercent) {
        this.raisePercent = raisePercent;
    }
 
    public double getRaisePercent() {
        return raisePercent;
    }
}

ルール・デザイナを使用すると、構成中のActionTypeに適切なパラメータを選択できます。

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

デシジョン・ポイントを使用すると、デシジョン関数を実行できます。ADFビジネス・コンポーネント・ファクト・タイプを使用している場合にのみ適用される特定のデシジョン・ポイント・メソッドがあります。

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

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

ADFビジネス・コンポーネント・ファクト・タイプを使用する場合は、Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数を起動します。

Rules SDKデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールするには:

  1. DecisionPointBuilderを使用して、テンプレートDecisionPointインスタンスを作成し、構成します。
  2. DecisionPointのメソッドgetInstanceを使用して、DecisionPointInstanceを作成します。
  3. DecisionPointInstanceのメソッドaddInputsetInputsまたはsetViewObjectを使用して、使用するファクト・オブジェクトをDecisionPointInstanceに追加します。これらは、ViewObjectまたはViewObjectReferenceインスタンスです。これらは、デシジョン関数の入力で宣言されるのと同じ順序で追加する必要があります。詳細は、「ADFビジネス・コンポーネント・ルールに使用するinvokeメソッドのコール」を参照してください。
  4. DecisionPointInstanceで使用されるトランザクションを設定します。
  5. 以降のアプリケーション・アクションに必要なランタイム・プロパティを設定します。

    詳細は、「ランタイム・プロパティの設定」を参照してください。

  6. DecisionPointInstanceのメソッドinvokeをコールします。
10.2.1.1 デシジョン・ポイント・トランザクションの設定

Oracle Business Rules SDKフレームワークでは、ViewObjectをロードし、トランザクション・コンテキスト内でActionTypeインスタンスを提供するには、oracle.jbo.server.DBTransactionImpl2インスタンスが必要です。oracle.jbo.server.DBTransactionImpl2クラスは、ApplicationModuleのメソッドgetTransactionをコールすることで戻される、デフォルトのJBOトランザクション・オブジェクトです。トランザクションを設定するには、パラメータにTransactionオブジェクトを指定し、DecisionPointInstanceのメソッドsetTransactionをコールする必要があります。

なんらかの理由でDBTransactionインスタンスを使用できない場合、Oracle Business Rules SDKフレームワークでは、setTransactionメソッドに用意されている3つのオーバーライドのいずれかを使用してインスタンスをブートストラップできます。

次のいずれかが必要です。

  • JDBC URL、ユーザー名およびパスワード。

  • JDBC接続オブジェクト。

  • javax.sql.DataSourceオブジェクト、およびDataSourceがJTAトランザクションおよびローカル・トランザクションのどちらを表すかを指定するフラグ。

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

setPropertyメソッドを使用してランタイム・プロパティを提供できます。これらのプロパティは、実行中にActionTypeインスタンスにより取得できます。ランタイム・プロパティが不要な場合は、これらのコールを安全に省略できます。

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

デシジョン・ポイントの起動で使用されるViewObjectは、表10-2に示すように、2つの方法のいずれかを使用して指定できます。

表10-2 デシジョン・ポイントの起動用のビュー・オブジェクトの設定

ViewObject設定メソッド 説明

setViewObject

このデシジョン関数は、ViewObject行ごとに1回ずつ起動されます。ビュー・オブジェクトを使用する場合は、この方法をお薦めします。ルール・セッションはデシジョン関数の起動と起動の間にリセットされないため、デシジョン関数が以前に起動されたときにアサートされたファクトは、作業メモリーに残ります。通常、デシジョン関数のコールが完了する前に、アサートされたファクトを取り消すルールを記述する必要があります。たとえば、後処理デシジョン関数がコールされる前に実行されたViewObject行を取り消すクリーンアップ・ルールセットを使用できます。

この使用について詳しくは、「従業員取消しルールセットの追加方法」を参照してください。setViewObjectを使用するには、ViewObjectが、デシジョン関数InputTableの最初のエントリである必要があります。

addInput

setInputs

このデシジョン関数は、同時にロードされたすべてのViewObject行に対して1回起動されます。数多くの行が同時にロードされる場合があるため、通常、この操作はスケーラブルではありません。ViewObjectの行数が少ないことがわかっている場合は、このメソッドによるViewObjectのコールが役立つことがあります。

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

JBOクラスのデフォルト動作はすべてのデータを単にロードすることであるため、大量のデータをロードするビュー・オブジェクトを使用してデシジョン・ポイントを起動する際には注意が必要です。多数の行を持ち、多数の子行も持つ可能性のあるビュー・オブジェクトがメモリーにロードされると、メモリー不足になる危険性があるのみでなく、この種の大型データに基づいて実行されるDMLアクションによってロールバック・セグメントがすべて使用されてしまう危険性があります。

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

例10-2に、setInputsメソッドを使用するViewObjectインスタンスを使用してデシジョン・ポイントを起動する方法を示します。完全な例は、「外部マネージャ・ファインダ・クラスの追加方法」に示す例を参照してください。

例10-2 setInputsメソッドを使用したデシジョン・ポイントの起動

public class OutsideManagerFinder {
    private static final String AM_DEF = "com.example.AppModule";
    private static final String CONFIG = "AppModuleLocal";
    private static final String VO_NAME = "EmployeesView1";
 
    private static final DictionaryFQN DICT_FQN = 
                  new DictionaryFQN("com.example", "Chapter10Rules");
 
    private static final String DF_NAME = "FindOutsideManagers";
 
    private DecisionPoint dp = null;
 
    public OutsideManagerFinder() {
        try {
            dp = new DecisionPointBuilder()
                              .with(DICT_FQN)
                              .with(DF_NAME)
                              .build();
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
    public void run() {
        final ApplicationModule am = 
                  Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);        
        final DecisionPointInstance point = dp.getInstance();
        point.setTransaction((DBTransactionImpl2)am.getTransaction());
        point.setAutoCommit(true);
        point.setInputs(new ArrayList<Object>(){{ add(vo); }});
        try {
            List<Object> invokeList = point.invoke();
List<DecisionPoint.NamedValue> results = point.getResults();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
10.2.1.6 setViewObjectメソッドを使用してデシジョン・ポイントを起動するサンプル

例10-3に、setViewObjectメソッドを使用してDecisionPointを起動し、ViewObjectを設定する方法を示します。

例10-3 setViewObjectメソッドを使用したデシジョン・ポイントの起動

    public void run() {
        final ApplicationModule am = 
                Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);
        final DecisionPointInstance point = dp.getInstance();
        
        point.setTransaction((DBTransactionImpl2)am.getTransaction());
        point.setAutoCommit(true);
        point.setViewObject(vo);
        try {
            List<Object> invokeList = point.invoke();
List<DecisionPoint.NamedValue> results = point.getResults();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
    }

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

Oracle Business Rules SDKデシジョン・ポイント・インタフェースを持つADFビジネス・コンポーネント・ファクト・タイプを使用して、ルールセットを持つデシジョン関数をコールするには、特定のオプションを使用してデシジョン関数を構成する必要があります。デシジョン関数の使用の詳細は、デシジョン関数の使用を参照してください。

Javaデシジョン・ポイント・インタフェースを使用してデシジョン関数を定義するには:

  1. 「デシジョン関数」タブで、適切なデシジョン関数を選択し、「編集」ボタンをクリックします。「デシジョン関数の編集」ダイアログが表示されます。
  2. 「デシジョン関数の編集」ダイアログで、デシジョン関数を構成します。
    • 入力: 構成済のビジネス・ルールに使用するファクト・タイプの名前を指定します。

      ADFビジネス・コンポーネント・ファクト・タイプを使用するアプリケーションを使用している場合、入力はルールで使用されるADFビジネス・コンポーネント・ビュー・オブジェクトとなります。

      デシジョン・ポイントでsetViewObjectを使用する場合は、「リスト」属性をクリアする必要があります。デシジョン・ポイントでaddInputメソッドまたはsetInputsメソッドを使用しているときに、入力のファクト・タイプごとに「リスト」属性を選択する必要があります。ビュー・オブジェクトの使用に応じて「ツリー」属性を選択することもできます。

      「リスト」: ADFビジネス・コンポーネント・ファクト・タイプのリストがデシジョン関数に渡されるように定義します。

      「ツリー」: マスター/ディテール階層内の最上位レベル・オブジェクトのみでなく、すべてのオブジェクトをアサートするように定義します。

      詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

    • 「初期アクション」: 「<アクションの挿入>」をクリックすると、アサートする前に入力ファクトを変更したり、ルールセット・スタックを変更したり、有効日を設定したり、出力ファクトをアサートしたりするために使用できるアクションを追加できます。これらのアクションは、ルールのかわりに使用したり、ルールを実行するための環境「設定」のために使用できます。

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

    • 出力のファクト・タイプ: コール元が戻すファクト・タイプを定義します。

      ActionTypesを使用するデシジョン関数のJavaデシジョン・ポイント・インタフェースを使用してデシジョン関数をコールする場合、次の2つの出力を返す方法を使用できます。

      • 出力ファクト・タイプは、デシジョン関数の場合と同様に使用できます。これらの結果は、DecisionPointInstance.invoke()から返されます。

      • ActionTypeのexecメソッドは、dpi.addResultをコールするようにオーバーライドできます(例10-1を参照)。これらの結果は、DecisionPointInstance.getResults()から返されます。

      ActionTypesの使用はオプションです。通常、ActionTypesは、ルールでADFデータの変更が必要されない場合は使用されません。ActionTypesを使用しない場合、DecisionPointDictionary.PreprocessingおよびDecisionPointDictionary.Postprocessingは必要ありません。

      詳細は、「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。

    • 「ルールセットおよびデシジョン関数」: このデシジョン関数で実行するルールセットおよび他のデシジョン関数の順序付きリストです。DecisionPointディクショナリからのルールセットDecisionPointDictionary.PreprocessingおよびDecisionPointDictionary.Postprocessingは、それぞれアプリケーション固有のルールセットおよびデシジョン関数の前と後に実行するように追加する必要があります。

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

デシジョン関数の定義には、ルールセットとデシジョン関数の両方を含めることができます。アプリケーションでは、通常、配管コードとして機能するなんらかのルールまたはデシジョン関数が必要です。この配管コードは、ActionTypeを使用している場合にのみ必要です。

このようなアプリケーションには、入力データのトランスフォーメーション、補助ファクトのアサートまたは出力ファクトの処理を実行するコンポーネントが含まれます。配管コードは、アプリケーションのコア・ビジネス・ルールを含むルールの前または後に実行することが必要となる場合があります。

こうしたアプリケーションの問題とそれに関連するルールをネストしたデシジョン関数を使用して、アプリケーションの機能の問題と切り離すことができます。ネストしたデシジョン関数を使用すると、内側のデシジョン関数に管理上の配管指向の問題が含まれなくなるため、内側のデシジョン関数ではアプリケーションのコア・ロジックを定義するルールのみが示されるようになります。この設計によって、ユーザーが管理上のルールを理解する必要がなくなり、ユーザーがルールに不適切な変更を加えること(および、このことにより、システムが操作不能になる事態)を防止できます。

複数のルールセットおよびネストしたデシジョン関数を使用して構成を作成するには、2つのデシジョン関数を作成し、一方を他方に追加します。適切なネーミング方法は、ネストした内側のデシジョン関数に接尾辞Coreを付けることです。これにより、ユーザー指定のルールセットをこの内側のCoreデシジョン関数に追加できます。たとえば、DecisionPointDictionary.Preprocessingデシジョン関数、DecisionFunction_1Coreデシジョン関数およびDecisionPointDictionary.Postprocessingデシジョン関数を実行するようにDecisionFunction_1を定義できます。この例では、DecisionFunction_1Coreにコア・ビジネス・ロジック・ルールセットが含まれています。

デシジョン・ポイントの入力を、ADFビジネス・コンポーネント・オブジェクトのツリーのルートである、ADFビジネス・コンポーネントのファクト・タイプにすることも一般的です。ただし、ユーザーはツリーに存在するタイプのサブセットに一致する、ビジネス・ルールのみを記述できます。この場合、ネストしたデシジョン関数の入力を、格納されたルールセットに実際に一致するタイプのみになるよう定義することを習慣にするとよいでしょう。たとえば、ツリー・オプションが選択されたEmployeeファクト・タイプが入力である、デシジョン関数をコールするデシジョン・ポイントを考えてみます。このデシジョン関数は、Departmentファクト・タイプに一致するルールセットのみが存在する、ネストしたデシジョン関数を含むとします。この場合、ネストしたデシジョン関数には、入力としてツリー・オプションが選択されたEmployeeファクト・タイプまたはリスト・オプションが選択されたDepartmentファクト・タイプのいずれかを指定できます。この例では、ツリー・オプションにより、Employeeインスタンスの子が発生します。これにはDepartmentインスタンスのアサートも含まれます(これらのタイプ間の1対多関連のため)。Employeeが外側のデシジョン関数の入力で、ツリー・オプションが選択されている場合、Departmentファクト・タイプのインスタンスがアサートされ、内側のデシジョン関数のシグネチャをDepartmentのインスタンス(このデシジョン関数に適合された正確なタイプ)のリストとして識別できます。

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

ADFビジネス・コンポーネント・サンプル・アプリケーションでは、ADFビジネス・コンポーネント・ファクト・タイプの使用を示します。

Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプルおよびチュートリアル・ページからオンラインで入手できます。

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

Oracle Business RulesでADFビジネス・コンポーネント・ファクトを使用するには、まずOracle JDeveloperでアプリケーションおよびプロジェクトを作成する必要があります。

ADFビジネス・コンポーネント・ファクトを使用するアプリケーションを作成するには:

  1. Oracle JDeveloperを起動します。Oracle JDeveloperの開始ページが表示されます。

  2. 「アプリケーション・ナビゲータ」でアプリケーション・メニューの「新規アプリケーション」をクリックします。

  3. 「アプリケーションの名前付け」ページで、新規アプリケーションの名前および場所を入力します。

    1. 「アプリケーション名」フィールドで、アプリケーション名を入力します。たとえば、Chapter10と入力します。

    2. 「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

    3. 「アプリケーション・パッケージの接頭辞」フィールドに、アプリケーション・パッケージの接頭辞を入力します。たとえば、com.exampleと入力します。

      この接頭辞はグローバルで一意である必要があり、通常は自社が所有しているドメイン名を使用します。接頭辞に続いてピリオドが、アプリケーションの初期プロジェクト内に作成されたオブジェクトに付加されます。

      このサンプルでは、図10-1に示すように接頭辞com.exampleを使用します。

      「次へ」をクリックします。

  4. 「プロジェクトの名前付け」ページ:

    1. 「プロジェクト名」フィールドに、Chapter10と入力します。

    2. 「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

    3. 図10-2に示すように、「プロジェクトの機能」領域で、「ADFビジネス・コンポーネント」を選択します。

    「次へ」をクリックします。

  5. Java設定の構成ページ:

    1. 「デフォルト・パッケージ」フィールドに、com.exampleと入力します。

    2. 「Javaソース・パス」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

    3. 図10-3に示すように、「出力ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

      「次へ」をクリックします。

  6. プロジェクト2の場合、「プロジェクトの名前付け」ページ:

    1. 「プロジェクト名」フィールドに、ViewControllerと入力します。

    2. 「ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

    3. 図10-4に示すように、「プロジェクトの機能」領域で、「ADF Faces」を選択します。

      「次へ」をクリックします。

  7. プロジェクト2の場合、Java設定の構成ページ:

    1. 「デフォルト・パッケージ」フィールドに、com.example.viewと入力します。

    2. 「Javaソース・パス」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

    3. 図10-5に示すように、「出力ディレクトリ」フィールドで、ディレクトリ名を入力または参照するか、デフォルトを使用します。

  8. 完了後、「終了」をクリックします。

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

データベース表からADFビジネス・コンポーネントを追加する必要があります。この例では、標準のHRデータベース表を使用します。

ADFビジネス・コンポーネントを追加するには:

  1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。
  2. 右クリックしてメニューから「新規」を選択します。
  3. 「新規ギャラリ」の「カテゴリ」領域で、「ビジネス層」を開いて「ADFビジネス・コンポーネント」を選択します。
  4. 「項目」領域で、「表からのビジネス・コンポーネント」を選択し、「OK」をクリックします。
  5. 「ビジネス・コンポーネント・プロジェクトの初期化」ダイアログで、必要な接続情報を入力して、接続を追加します。「OK」をクリックします。

    表からのビジネス・コンポーネントの作成ウィザードが表示されます。

  6. 「エンティティ・オブジェクト」ページで、「使用可能」ボックスのオブジェクトを「選択済」ボックスに移動して、必要なオブジェクトを選択します。完成したリストを表示するために、「問合せ」をクリックすることが必要となる場合があります。たとえば、「DEPARTMENTS」「EMPLOYEES」を選択します。
  7. 「次へ」をクリックします。「更新可能なビュー・オブジェクト」ページが表示されます。
  8. 「更新可能なビュー・オブジェクト」ページで「Departments」および「Employees」を選択します。
  9. 「次へ」をクリックします。これにより、エンティティ・ベースのビュー・オブジェクト・ページが表示されます。
  10. 「次へ」をクリックします。「アプリケーション・モジュール」ページが表示されます。
  11. 完了後、「終了」をクリックします。

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

アプリケーションのパフォーマンス要件に合わせて、ViewObjectをチューニングする必要があります。

EmployeesViewまたはDepartmentsViewのチューニング・オプションを設定するには:

  1. 「アプリケーション・ナビゲータ」で、「EmployeesView」をダブルクリックして従業員のチューニング・オプションを設定するか、「DepartmentsView」をダブルクリックして部門のチューニング・オプションを設定します。
  2. 「一般」ナビゲーション・タブで、「チューニング」を開きます。
  3. 「チューニング」領域で「すべての行」を選択します。
  4. 「チューニング」領域で、バッチ数フィールドに128と入力します。
  5. 「チューニング」領域で「一度にすべて」を選択します。

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

Oracle JDeveloperを使用して、Oracle Business Rulesディクショナリを作成します。

ディクショナリを作成するには:

  1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。
  2. 右クリックして、リストから「新規」を選択します。
  3. 「新規ギャラリ」ウィンドウで、「すべてのテクノロジ」タブを選択して「カテゴリ」領域で「ビジネス層」を開き、「ビジネス・ルール」を選択します。
  4. 「新規ギャラリ」の「項目」領域で「ビジネス・ルール」を選択します。
  5. 「OK」をクリックします。
  6. 「ビジネス・ルールの作成」ダイアログで、ディクショナリ名とパッケージを入力します。
    • たとえば、「名前」フィールドにChapter10Rulesと入力します。

    • たとえば、「パッケージ」フィールドにcom.exampleと入力します。

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

    JDeveloperによりルール・デザイナにディクショナリが作成され、ルール・デザイナでChapter10Rules.rulesファイルが開きます。

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

Oracle Business Rulesによって提供されているデシジョン・ポイント・ディクショナリへのディクショナリ・リンクを追加する必要があります。このディクショナリでは、ADFビジネス・コンポーネント・オブジェクトを持つデシジョン・ポイント・インタフェースで使用する機能がサポートされています。

デシジョン・ポイント・ディクショナリ・リンクを追加します。

  1. Rules Designerで、「リンク」ナビゲーション・タブをクリックします。
  2. 「作成」ボタンの横にあるメニューから、「デシジョン・ポイント・ディクショナリ」を選択します。この操作の完了には時間がかかる場合があります。待機した後、ルール・デザイナによってデシジョン・ポイント・ディクショナリへのリンクが追加されます。

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

ルール・デザイナでADFビジネス・コンポーネント・ファクトをインポートして、ルールの作成時にこれらのオブジェクトを使用できるようにします。

ADFビジネス・コンポーネント・ファクトをインポートします。

  1. Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
  2. 「ADF-BCファクト」タブを選択します。
  3. 「作成」ボタンをクリックします。「ADFビジネス・コンポーネント・ファクト」ページが表示されます。
  4. 「接続」フィールドのリストから、ADFビジネス・コンポーネント・オブジェクトが使用する接続を選択します。「クラスパスの検索」領域にはクラスパスのリストが表示されます。
  5. 「ビュー定義」フィールドで、インポートするビュー・オブジェクトの名前を選択します。たとえば、「com.example.EmployeesView」を選択します。
  6. 「OK」をクリックします。これにより、「ファクト」ナビゲーション・タブが表示されます。

ADFビジネス・コンポーネント・ファクトには循環参照が含まれていることがあります。この場合は、次のような検証警告が示されます。

RUL-05037: A circular definition exists in the data model

「ビジネス・ルール」検証ログにこの警告が表示されている場合は、循環参照を手動で解決する必要があります。そのためには、循環参照に関係するいずれかのプロパティの「参照可能」チェック・ボックスをクリアします。

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

プロパティを表示不可能としてマーク付けするには:

  1. 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。­
  2. 「DepartmentsView」行のアイコンをダブルクリックします。
  3. 「プロパティ」表の「EmployeesView」行で、「参照可能」チェック・ボックスをクリアします。
  4. 「OK」をクリックします。
10.3.6.2 DepartmentsViewとEmployeesViewの別名を設定する方法

DepartmentsViewおよびEmployeesViewの別名を設定するには:

  1. 「ファクト」ナビゲーション・タブで、「ADFビジネス・コンポーネント・ファクト」タブを選択します。
  2. 「エイリアス」列で、EmployeesViewEmployeeで置き換えます。
  3. 「エイリアス」列で、DepartmentsViewDepartmentで置き換えます。

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

外部マネージャ・ルールセットを実行するサンプル・コードは、setInputsメソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数が1回起動し、すべてのビュー・オブジェクト行がListにロードされます。この方法を使用してデシジョン・ポイントを起動する場合、すべてのビュー・オブジェクト行が同時にメモリーにロードされる必要があり、OutOfMemory例外が発生する可能性があるため、スケーラブルではありません。この起動スタイルは、既知のビュー・オブジェクト行が少数ある場合にのみ使用します。setViewObjectでデシジョン・ポイントを使用することもできます。詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

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

ビュー・オブジェクトがファクトとしてインポートされた後、ルールセットの名前を変更して、アプリケーションのデシジョン関数を作成できます。

ルールセットの名前を変更するには、「ルール・デザイナ」で「Ruleset_1」ナビゲーション・タブを選択してから、ルールセット名を選択し、Outside Manager Rulesetと入力してそのルールセット名を変更します。

デシジョン関数を追加するには:

  1. 「デシジョン関数」ナビゲーション・タブをクリックします。
  2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。
  3. デシジョン関数フィールドを次のように編集します。
    • 「名前」に値FindOutsideManagersを入力します。

    • 「入力」領域で、「入力の追加」ボタンをクリックして入力情報を次のように編集します。

      • 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

      • 「リスト」チェック・ボックスを選択します。

      このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。詳細は、「Oracle Business Rulesのデシジョン・ポイントのアクション・タイプ」を参照してください。

    • 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

      • DecisionPointDictionary.Preprocessing

      • Outside Manager Ruleset

      • DecisionPointDictionary.Postprocessing

  4. 「選択済」領域のアイテムが、DecisionPointDictionary.Preprocessing、Outside Manager Ruleset、DecisionPointDictionary.PostProcessingの順序になっていることを確認します。

    順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

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

複数の警告が表示されます。これらの警告は、後のステップでルールセットにルールを追加すると、削除されます。

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

サンプル・アプリケーションを作成し、ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionTypeのJava実装クラスを作成する必要があります。ActionTypeのすべてのサブクラスは、abstractのexecメソッドを実装する必要があります。

ActionTypeのJava実装クラスを作成するには:

  1. Oracle JDeveloperで、「Chapter10」というプロジェクトを選択します。
  2. 「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」フォルダを選択します。
  3. 右クリックして、リストから「新規」を選択します。
  4. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
  5. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。
  6. 「OK」をクリックします。
  7. Javaクラスの作成ダイアログで、次のプロパティを構成します。
    • 「名前」に値MessageActionを入力します。

    • 「パッケージ」に値com.exampleを入力します。

    • 「拡張」に値oracle.rules.sdk2.decisionpoint.ActionTypeを入力します。

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

    Oracle JDeveloperによってJavaクラスが表示されます。

  9. actiontype Java実装を示す次のサンプル・コードでこのコードを置き換えます。
    package com.example;
     
    import oracle.rules.sdk2.decisionpoint.ActionType;
    import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
     
    public class MessageAction extends ActionType {
        public MessageAction() {
            super();
        }
     
        public void exec(DecisionPointInstance decisionPointInstance) {
            System.out.println(message);
        }
        
        private String message = null;
     
        public void setMessage(String message) {
            this.message = message;
        }
     
        public String getMessage() {
            return message;
        }
    }
    
  10. アプリケーション・ナビゲータで、「MessageAction.java」を右クリックし、リストから「メイク」を選択します。
10.3.7.3 メッセージ・アクションのJavaファクトをインポートする方法

新しいJavaクラスを作成したため、後でルールを作成するときに使用できるように、このクラスをルール・デザイナのJavaファクト・タイプとして追加する必要があります。

Javaファクト・タイプを作成するには:

  1. Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。
  2. 「Javaファクト」タブを選択します。
  3. 「作成...」をクリックします。
  4. 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、comおよびexampleを開いて、「MessageAction」チェック・ボックスを表示します。
  5. 「MessageAction」チェック・ボックスを選択します。
  6. 「OK」をクリックします。これにより、ファクトが表に追加されます。
10.3.7.4 マネージャ検索ルールの追加方法

従業員とは別の部門にいるマネージャを検索するルールを追加します。

別部門のマネージャ検索ルールを追加するには:

  1. ルール・デザイナで、「Outside Manager Ruleset」タブを選択します。
  2. 「追加」をクリックし、リストから「ルールの作成」を選択します。
  3. デフォルトのルール名「Rule_1」を選択して、ルールの名前を変更します。これによりテキスト入力領域が表示されます。名前を入力します。たとえば、Find managers in different departmentと入力します。[Enter]を押して名前を適用します。
  4. 「詳細設定の表示」をクリックします。詳細は、「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。
  5. ルールで「拡張モード」を選択します。
  6. 図10-6に示すように、ルールを入力します。「THEN」領域に表示されているルールのアクションは、長すぎて図内に表示しきれません。作成する完全なアクションには、次の項目を含めます。

    IFEmployee is EmployeeandManager is a Employee andManager.EmployeeId == Employee.ManagerId andManager.DepartmentId != Employee.DepartmentIDTHENassert new MessageAction(<add property> message: "Employee " + Employee.FirstName + " " + Employee.LastName + "(" + Employee.EmployeeId + ")"+ " in dept " + Employee.DepartmentId + " has manager outside of department, " + Manager.FirstName + " " + Manager.LastName + "(" + Manager.EmployeeId + ")" + " in dept " + Manager.DepartmentId )

    図10-6 別部門のマネージャ検索ルール

    図10-6の説明が続きます
    「図10-6 別部門のマネージャ検索ルール」の説明
10.3.7.5 外部マネージャ・ファインダ・クラスの追加方法

外部マネージャ・ファインダ・クラスを追加します。このクラスはデシジョン・ポイントを使用して、デシジョン関数を実行します。

外部マネージャ・ファインダ・クラスを追加するには:

  1. Chapter10プロジェクトを選択します。
  2. 右クリックして「新規」を選択します。
  3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
  4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。
  5. 「名前」フィールドに、xcelerate.OutsideManagerFinderと入力します。「OK」をクリックします。
  6. このクラスのコンテンツを、外部マネージャ・ファインダのJavaクラスを示す次のサンプル・コードで置き換えます。
package com.example;
 
import java.util.ArrayList;
 
import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
 
import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;
 
public class OutsideManagerFinder {
    private static final String AM_DEF = "com.example.AppModule";
    private static final String CONFIG = "AppModuleLocal";
    private static final String VO_NAME = "EmployeesView1";
 
    private static final DictionaryFQN DICT_FQN = 
                  new DictionaryFQN("com.example", "Chapter10Rules");
 
    private static final String DF_NAME = "FindOutsideManagers";
 
    private DecisionPoint dp = null;
 
    public OutsideManagerFinder() {
        try {
            dp = new DecisionPointBuilder()
                              .with(DICT_FQN)
                              .with(DF_NAME)
                              .build();
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
    
    public void run() {
        final ApplicationModule am = 
                  Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);        
        final DecisionPointInstance point = dp.getInstance();
        point.setInputs(new ArrayList<Object>(){{ add(vo); }});
        try {
            point.invoke();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
 
    public static void main(String[] args) {
        OutsideManagerFinder omf = new OutsideManagerFinder();
        omf.run();
    }
 
}
10.3.7.6 ローカル・ディクショナリ・アクセスのADF META INFの更新方法

ADF-META-INFファイルの、ディクショナリにアクセスするためのMDS情報を更新する必要があります。MDSを持つローカル・ファイルを使用して、Oracle Business Rulesディクショナリにアクセスできます。ただし、一般的に、本番環境のOracle Business Rulesでは、ディクショナリ・アクセスにこの手順を使用しません。本番環境でのデシジョン・ポイントを使用したMDSによるディクショナリへのアクセスの詳細は、「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。

ADF-META-INFを更新するには:

  1. 「アプリケーション・ナビゲータ」で「アプリケーション・リソース」を開きます。
  2. 「ディスクリプタ」フォルダおよび「ADF META-INF」フォルダを開きます。
  3. adf-config.xmlをダブルクリックして、このファイルを開きます。
  4. 「ソース」タブをクリックして、adf-config.xmlのソースを表示します。
  5. </adf-config>タグを閉じる前に、次のコード例に示すようにadf-config.xmlにMDS情報を追加します。
       <adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
        <mds-config version="11.1.1.000" xmlns="http://xmlns.oracle.com/mds/config">
          <persistence-config>
            <metadata-namespaces>
              <namespace metadata-store-usage="mstore-usage_1" path="/"/>
            </metadata-namespaces>
            <metadata-store-usages>
              <metadata-store-usage id="mstore-usage_1">
                <metadata-store class-name="oracle.mds.persistence.stores.file.FileMetadataStore">
                  <property name="metadata-path"
                            value="C:\jdevinstance\mywork\Chapter10\.adf\"/>
                </metadata-store>
              </metadata-store-usage>
            </metadata-store-usages>
          </persistence-config>
        </mds-config>
      </adf-mds-config>
    
  6. 属性metadata-pathを持つ<property>要素で、使用しているシステムのアプリケーションの.adfディレクトリに一致するようにパスを変更します。
10.3.7.7 MDSでアクセス可能な場所に定義/ディクショナリをコピーする方法

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

  1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーション、Chapter10プロジェクトおよびsrcフォルダにナビゲートし、comフォルダを選択およびコピーします。または、MDSでアクセス可能な場所にディクショナリをコピーする場合は、Oracle Business Rulesディクショナリを含むoracleディレクトリをコピーします。
  2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。
  3. comフォルダをこのディレクトリにコピーするか、oracleフォルダをこのディレクトリにコピーします。
10.3.7.8 外部マネージャ・ファインダをチェックするプロジェクトの作成および実行方法

従業員が別の部門にいるマネージャの検索ルールを実行して、プロジェクトを作成しおよびテストできます。

OutsideManagerFinder構成を作成します。

  1. 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
  2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
  3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、OutsideManagerFinderと入力します。
  4. 「OK」をクリックします。
  5. 「OutsideManagerFinder」を選択した状態で、「編集」をクリックします。
  6. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
  7. src\com\exampleフォルダから「OutsideManagerFinder.java」を選択します。
  8. 「開く」をクリックします。
  9. 「実行構成の編集」ダイアログで「OK」をクリックします。
  10. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のドロップダウン・メニューで「OutsideManagerFinder」を選択します。次の例に示すように、この構成を実行すると、出力が生成されます。

Emp Shelley Higgins(205) in dept 110 manager outside of department, Neena Kochhar(101) in dept 90
Emp Hermann Baer(204) in dept 70 manager outside of department, Neena Kochhar(101) in dept 90
Emp Susan Mavris(203) in dept 40 manager outside of department, Neena Kochhar(101) in dept 90
Emp Michael Hartstein(201) in dept 20 manager outside of department, Steven King(100) in dept 90
Emp Jennifer Whalen(200) in dept 10 manager outside of department, Neena Kochhar(101) in dept 90
Emp Kimberely Grant(178) in dept null manager outside of department, Eleni Zlotkey(149) in dept 80
Emp Eleni Zlotkey(149) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp Gerald Cambrault(148) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp Alberto Errazuriz(147) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp Karen Partners(146) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp John Russell(145) in dept 80 manager outside of department, Steven King(100) in dept 90
Emp Kevin Mourgos(124) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Shanta Vollman(123) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Payam Kaufling(122) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Adam Fripp(121) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Matthew Weiss(120) in dept 50 manager outside of department, Steven King(100) in dept 90
Emp Den Raphaely(114) in dept 30 manager outside of department, Steven King(100) in dept 90
Emp Nancy Greenberg(108) in dept 100 manager outside of department, Neena Kochhar(101) in dept 90
Emp Alexander Hunold(103) in dept 60 manager outside of department, Lex De Haan(102) in dept 90

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

部門マネージャ・ルールセットを実行するサンプル・コードは、setViewObjectメソッドを使用するビュー・オブジェクト・セットを持つデシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。すべてのデシジョン関数コールは、同じRuleSession内で発生します。デシジョン関数のコールとコールの間に、RuleSessionによって、以前のデシジョン関数コールのすべての状態が保存されます。このため、以前のコール時にアサートされたオブジェクトは、指定するルールセットによって明示的に取り消されない場合、次のコールの作業メモリーに残ります。状態が保持されている場合は、取消しアクションを使用するルールを持つルールセットを実行して、コールとコールの間にすべてのファクトまたは選択したファクトを取り消すことができます。このルールセットは、デシジョン・ポイントで使用する同じデシジョン関数の一部として実行されます。すべての従業員の取消しルールセットは、これらのファクトのリトラクトを示します。詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

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

部門マネージャ・ファインダ・ルールセットを追加します。

部門マネージャ・ファインダ・ルールセットを追加するには:

  1. Rules Designerで、「ルールセットの作成」をクリックします。
  2. 「ルールセットの作成」ダイアログで、「名前」フィールドにDepartment Manager Finder Rulesetと入力します。
  3. 「OK」をクリックします。
10.3.8.2 部門マネージャ・ファインダ・ルールセットの検索ルールの追加方法

次に、部門マネージャを検索する検索ルールを追加します。このルールは、Oracle ADFビジネス・コンポーネント・ファクト・タイプでのツリー・モード・ルールの使用を示します。

部門マネージャ・ファインダ・ルールを追加します。

  1. ルール・デザイナで、「Department Manager Finder Ruleset」を選択します。
  2. 「追加」ボタンの横にあるドロップダウン・メニューで、「ルールの作成」をクリックします。
  3. 名前「Rule_1」を選択し、Findを入力して、ルールの名前を変更します。
  4. 「詳細設定の表示」をクリックします。詳細は、「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。
  5. ルールで、「ツリー・モード」を選択します。
  6. 「検索」ルール・テストおよびアクションを入力します。次のものは、このルールの完全なテキストを示しています。
    ROOT: Employee
    IF 
    Employee/DepartmentsView.ManagerID == Employee.EmployeeID
    THEN
    retract Employee
    assert new MessageAction ( <add property> message: Employee.FirstName + " " + Employee.LastName + " is the manager of dept "+ Employee/DepartmentsView.DepartmentName )
10.3.8.3 従業員取消しルールセットの追加方法

従業員ファクト・タイプ・インスタンスを取り消すルールセットを追加します。これにより、従業員ファクト・タイプが、デシジョン関数の起動と起動の間に削除されます。

従業員取消しルールセットを追加するには:

  1. Retract Employees Rulesetを追加します。
  2. 「Retract Employees Ruleset」でルールを追加し、このルールにRetract all employeesという名前を付けます。
10.3.8.4 部門マネージャ検索デシジョン関数の追加方法

部門マネージャ・ファインダ・ルールセット用のデシジョン関数を作成します。このデシジョン関数を使用して、デシジョン・ポイントからルールセットを実行します。

部門マネージャ・ファインダ・ルールセットのデシジョン関数を追加するには:

  1. 「デシジョン関数」ナビゲーション・タブをクリックします。
  2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。
  3. デシジョン関数フィールドを次のように更新します。
    • 「名前」に値FindDepartmentManagersを入力します。

    • 「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。

      • 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

      • 「ツリー」チェック・ボックスを選択します。

      このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。

    • 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

      • DecisionPointDictionary.Preprocessing

      • Department Manager Finder Ruleset

      • Retract Employees

      • DecisionPointDictionary.Postprocessing

  4. 「選択済」領域のアイテムが、DecisionPointDictionary.Preprocessing、Department Manager Finder Ruleset、Retract EmployeesおよびDecisionPointDicitonary.Postprocessingの順序になっていることを確認します。

    順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

  5. 「OK」をクリックします。
10.3.8.5 部門マネージャ・ファインダJavaクラスの追加方法

部門マネージャ・ファインダ・クラスを追加します。このクラスには、デシジョン関数を実行するデシジョン・ポイントが指定されたコードが含まれます。

部門マネージャ・ファインダ・クラスを追加します。

  1. 「アプリケーション・ナビゲータ」で、Chapter10プロジェクトを選択します。
  2. 右クリックして「新規」を選択します。
  3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
  4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。
  5. 「名前」フィールドに、DeptManagerFinderと入力します。「OK」をクリックします。
  6. このクラスのコンテンツを、次の例に示すコードで置き換えます。
package com.example;
 
import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
import oracle.jbo.server.DBTransactionImpl2;
 
import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;
 
public class DeptManagerFinder {
    private static final String AM_DEF = "com.example.AppModule";
    private static final String CONFIG = "AppModuleLocal";
    private static final String VO_NAME = "EmployeesView1";
 
    private static final String DF_NAME = "FindDepartmentManagers";
 
    private static final DictionaryFQN DICT_FQN = 
                    new DictionaryFQN("com.example", "Chapter10Rules");
 
    private DecisionPoint dp = null;
 
    public DeptManagerFinder() {
    
        try {
            dp = new DecisionPointBuilder()
                              .with(DICT_FQN)
                              .with(DF_NAME)
                              .build();
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
 
    public void run() {
        final ApplicationModule am = 
                Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);
        final DecisionPointInstance point = dp.getInstance();
        
        point.setTransaction((DBTransactionImpl2)am.getTransaction());
        point.setAutoCommit(true);
        point.setViewObject(vo);
        try {
            point.invoke();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
    
    public static void main(String[] args) {
        new DeptManagerFinder().run();
    }
}
10.3.8.6 MDSでアクセス可能な場所にディクショナリをコピーする方法

MDSでアクセス可能な場所に更新したディクショナリをコピーします。

MDSでアクセス可能な場所にディクショナリをコピーします。

  1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10アプリケーションおよびプロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。
  2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。
  3. oracleフォルダをこのディレクトリにコピーします。
10.3.8.7 マネージャ検索ルールをチェックするプロジェクトの作成および実行方法

部門マネージャ・ファインダ・ルールセットを実行するプロジェクトを作成およびテストできます。

プロジェクトを作成します。

  1. 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
  2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
  3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、DeptManagerFinderと入力します。
  4. 「設定のコピー元」フィールドにDefaultと入力します。
  5. 「OK」をクリックします。
  6. 「DeptManagerFinder」を選択した状態で、「編集」をクリックします。
  7. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
  8. src\com\exampleディレクトリでDeptManagerFinder.javaを選択し、「開く」をクリックします。
  9. 「実行構成の編集」ダイアログで「OK」をクリックします。
  10. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のメニューで「DeptManagerFinder」を選択します。次の例に示すように、デシジョン・ポイントを実行すると、出力が生成されます。

Michael Hartstein is the manager of dept Marketing
John Russell is the manager of dept Sales
Adam Fripp is the manager of dept Shipping
Den Raphaely is the manager of dept Purchasing
Alexander Hunold is the manager of dept IT
Shelley Higgins is the manager of dept Accounting
Hermann Baer is the manager of dept Public Relations
Susan Mavris is the manager of dept Human Resources
Jennifer Whalen is the manager of dept Administration
Nancy Greenberg is the manager of dept Finance
Steven King is the manager of dept Executive
Shelley Higgins is the manager of dept Accounting
Hermann Baer is the manager of dept Public Relations
Susan Mavris is the manager of dept Human Resources
Jennifer Whalen is the manager of dept Administration
Nancy Greenberg is the manager of dept Finance
Alexander Hunold is the manager of dept IT
Alexander Hunold is the manager of dept IT
Nancy Greenberg is the manager of dept Finance
Den Raphaely is the manager of dept Purchasing
Adam Fripp is the manager of dept Shipping
John Russell is the manager of dept Sales
Jennifer Whalen is the manager of dept Administration
Michael Hartstein is the manager of dept Marketing
Susan Mavris is the manager of dept Human Resources
Hermann Baer is the manager of dept Public Relations
Shelley Higgins is the manager of dept Accounting

この例のツリー・モード・ルールで作業しているとき、出力に重複エントリがある場合、この重複エントリは、ビュー・オブジェクトのグラフの異なる部分にある同じデータで複数のルールを起動したことによって発生したものです。

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

昇給ルールセットを実行するサンプル・コードでは、setViewObjectメソッドを使用するビュー・オブジェクトを指定して、デシジョン・ポイントを起動します。これにより、デシジョン関数がビュー・オブジェクト内の各行に対して1回ずつ起動します。デシジョン関数のコールとコールの間にこれらのインスタンスが作業メモリーに残らないよう、従業員取消しルールセットによって、各コールでアサートされたEmployeeのインスタンスがすべて取り消されます。「昇給ActionTypeのJava実装クラスの作成方法」のアクション・タイプは、ActionTypeを使用してViewRowImpl属性の値を変更する方法を示しています。

詳細は、「ADFビジネス・コンポーネント・ファクトによるデシジョン・コンポーネントのコール」を参照してください。

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

昇給ルールセットを追加します。

昇給ルールセットを追加するには:

  1. Rules Designerで、「ルールセットの作成」をクリックします。
  2. 「ルールセットの作成」ダイアログで、「名前」フィールドにRaises Rulesetと入力します。
  3. 「OK」をクリックします。
10.3.9.2 昇給ActionTypeのJava実装クラスの作成方法

サンプル・アプリケーションのこの部分を作成し、昇給ルールのビュー・オブジェクトを変更するには、抽象クラスoracle.rules.sdk2.decisionpoint.ActionTypeのJava実装クラスを作成する必要があります。ActionTypeのすべてのサブクラスは、abstractのexecメソッドを実装する必要があります。

昇給ActionTypeのJava実装クラスを作成するには:

  1. Oracle JDeveloperで、「Chapter10」というプロジェクトを選択します。
  2. 「アプリケーション・ナビゲータ」で、「アプリケーション・ソース」フォルダを選択します。
  3. 右クリックして、リストから「新規」を選択します。
  4. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
  5. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。
  6. Javaクラスの作成ダイアログで、次のプロパティを構成します。
    • 「名前」に値RaiseActionを入力します。

    • 「パッケージ」に値com.exampleを入力します。

    • 「拡張」に値oracle.rules.sdk2.decisionpoint.ActionTypeを入力します。

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

    Oracle JDeveloperによってJavaクラスが表示されます。

  8. actiontype Java実装を示す次のサンプル・コードでこのコードを置き換えます。
    package com.example;
     
    import oracle.jbo.domain.Number;
     
    import oracle.rules.sdk2.decisionpoint.ActionType;
    import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
     
    public class RaiseAction extends ActionType {
        private double raisePercent;
     
        public void exec(DecisionPointInstance dpi) {
            Number salary = (Number)getViewRowImpl().getAttribute("Salary");
            salary = (Number)salary.multiply(1.0d + getRaisePercent()).scale(100,2, new boolean[]{false});
            dpi.addResult("raise for " + this.getViewRowImpl().getAttribute("EmployeeId"),
                          getRaisePercent() + "=>" + salary );
            getViewRowImpl().setAttribute("Salary", salary);
        }
     
        public void setRaisePercent(double raisePercent) {
            this.raisePercent = raisePercent;
        }
     
        public double getRaisePercent() {
            return raisePercent;
        }
    }
    
  9. アプリケーション・ナビゲータで、「RaiseAction.java」を右クリックし、リストから「メイク」を選択します。
10.3.9.3 昇給アクションのJavaファクトをインポートする方法

新しいJavaクラスが作成されました。このクラスをルール・デザイナのJavaファクト・タイプとしてインポートし、後でルールを作成するときに使用できるようにします。

Javaファクト・タイプを作成するには:

  1. ルール・デザイナで、「ManagerRules.rules」ディクショナリを選択します。
  2. 「ファクト」ナビゲーション・タブをクリックし、「Javaファクト」タブを選択します。
  3. 「作成...」をクリックします。
  4. 「Javaファクトの作成」ダイアログの「クラス」領域でツリーをナビゲートし、comおよびexampleを開いて、「RaiseAction」チェック・ボックスを表示します。
  5. 「RaiseAction」チェック・ボックスを選択します。
  6. 「OK」をクリックします。

    「Javaファクト」表に昇給アクション・ファクト・タイプが追加されます。

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

このルールは、アクション・タイプを使用して、データベース・エントリを更新する方法を示します。

12年昇給ルールを追加するには:

  1. Rules Designerの「Raises Ruleset」で、「ルールの作成」をクリックします。
  2. 名前「Rule_1」を選択し、値Longer than 12 yearsを入力して、ルールの名前を変更します。
  3. 「詳細設定の表示」をクリックします。詳細は、「ルールまたはデシジョン表の詳細設定の表示と非表示を切り替える方法」を参照してください。
  4. 「拡張モード」を選択します。
  5. この例に示すように、12年昇給ルールを入力します。
    IF
    Employee is Employee
    and
    CurrentDate is a CurrentDate and
    Duration.years between(Employee.HireDate, CurrentDate.date) >=12
    THEN
    assert new RaiseAction( <add property> raisePercent: .03, viewRowImple:Employee.ViewRowImpl)
    retract Employee
10.3.9.5 従業員昇給デシジョン関数の追加方法

従業員昇給ルールセットおよびすべての従業員の取消しルールセット用のデシジョン関数を作成します。

デシジョン関数を追加するには:

  1. 「デシジョン関数」ナビゲーション・タブをクリックします。
  2. 「デシジョン関数」領域で「作成」をクリックします。これにより、「デシジョン関数の編集」ダイアログが表示されます。
  3. デシジョン関数フィールドを次のように更新します。
    • 「名前」に値EmployeeRaisesを入力します。

    • 「入力」領域で、「入力の追加」をクリックして入力情報を次のように編集します。

      • 「ファクト・タイプ」フィールドをクリックし、リストから「Employee」を選択します。

      このデシジョン関数では、ActionType APIは出力の作成ではなくアクションの実行に使用されるため、出力は定義しません。

    • 「ルールセットおよびデシジョン関数」領域で、次の項目を指定されている順序で「使用可能」領域から「選択済」領域に移動します。

      • DecisionPointDictionary.Preprocessing

      • Raises Ruleset

      • Retract Employees Ruleset

      • DecisionPointDictionary.Postprocessing

  4. 「選択済」領域のアイテムが、DecisionPointDicitonary.Preprocessing、Raises Ruleset、Retract Employees Ruleset、DecisionPointDictionary.PostProcessingの順序になっていることを確認します。

    順序が異なっている場合は、項目を選択し、「上に移動」および「下に移動」ボタンを使用して正しい順序になるように移動します。

  5. 「OK」をクリックします。
10.3.9.6 従業員昇給Javaクラスの追加方法

従業員昇給クラスを追加します。これにより、デシジョン関数が実行されます。

従業員昇給クラスを追加するには:

  1. Chapter10プロジェクトを選択します。
  2. 右クリックして「新規」を選択します。
  3. 「新規ギャラリ」の「カテゴリ」領域で「一般」を選択します。
  4. 「新規ギャラリ」の「項目」領域で「Javaクラス」を選択します。「OK」をクリックします。
  5. 「名前」フィールドに、「EmployeeRaises」と入力します。「OK」をクリックします。
  6. このクラスのコンテンツを、次に示すdeptmanagerfinderクラス・コードで置き換えます。
package com.example;
 
import oracle.jbo.ApplicationModule;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
import oracle.jbo.server.DBTransactionImpl2;
 
import oracle.rules.rl.exceptions.RLException;
import oracle.rules.sdk2.decisionpoint.DecisionPoint;
import oracle.rules.sdk2.decisionpoint.DecisionPointBuilder;
import oracle.rules.sdk2.decisionpoint.DecisionPointInstance;
import oracle.rules.sdk2.exception.SDKException;
import oracle.rules.sdk2.repository.DictionaryFQN;
 
 
public class EmployeeRaises {
    private static final String AM_DEF = "com.example.AppModule";
    private static final String CONFIG = "AppModuleLocal";
    private static final String VO_NAME = "EmployeesView1";
    private static final String DF_NAME = "EmployeeRaises";
 
    private static final DictionaryFQN DICT_FQN =
        new DictionaryFQN("com.example", "Chapter10Rules");
 
    private DecisionPoint dp = null;
 
    public EmployeeRaises() {
 
        try {
            dp = new DecisionPointBuilder()
                    .with(DICT_FQN)
                    .with(DF_NAME)
                    .build();
        } catch (SDKException e) {
            System.err.println(e);
        }
    }
 
    public void run() {
        final ApplicationModule am =
            Configuration.createRootApplicationModule(AM_DEF, CONFIG);
        final ViewObject vo = am.findViewObject(VO_NAME);
        final DecisionPointInstance point = dp.getInstance();
 
        point.setTransaction((DBTransactionImpl2)am.getTransaction());
        point.setAutoCommit(true);
        point.setViewObject(vo);
        try {
            point.invoke();
        } catch (RLException e) {
            System.err.println(e);
        } catch (SDKException e) {
            System.err.println(e);
        }
        
        for (DecisionPoint.NamedValue result : point.getResults()){
            System.out.println(result.getName() +  " " + result.getValue());
        }
        
    }
 
    public static void main(String[] args) {
        new EmployeeRaises().run();
    }
}
10.3.9.7 MDSでアクセス可能な場所にディクショナリをコピーする方法

MDSでアクセス可能な場所に更新したディクショナリをコピーします。

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

  1. ファイル・システム・ナビゲータで、Oracle JDeveloperの外側からChapter10フォルダおよびChapter10プロジェクトにナビゲートし、ディクショナリを含むoracleディレクトリをコピーします。
  2. Chapter10プロジェクトの上のChapter10のアプリケーション・ディレクトリで、.adfディレクトリにナビゲートします。
  3. oracleフォルダをこのディレクトリにコピーします。
10.3.9.8 昇給ルールをチェックするプロジェクトの作成および実行方法

従業員昇給ルールセットを実行して、プロジェクトを作成およびテストできます。

プロジェクトをビルドするには:

  1. 「実行」ボタンの横にあるドロップダウン・メニューから、「実行構成の管理」を選択します。
  2. 「プロジェクト・プロパティ」ダイアログで、「新規」をクリックします。
  3. 「実行構成の作成」ダイアログで、名前を入力します。たとえば、EmployeeRaisesと入力します。
  4. 「設定のコピー元」フィールドにDefaultと入力します。「OK」をクリックします。
  5. 「EmployeeRaises」を選択した状態で、「編集」をクリックします。
  6. 「デフォルトの実行ターゲット」フィールドで、「参照」をクリックします。
  7. src\com\exampleフォルダから「EmployeeRaises.java」を選択します。「開く」をクリックします。
  8. 「実行構成の編集」ダイアログで「OK」をクリックします。
  9. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

プロジェクトを実行するには、「プロジェクトの実行」ボタンの横のメニューで「EmployeeRaises」を選択します。次の例に示すように、Oracle JDeveloperに出力が表示されます。

raise for 100 0.03=>81.7
raise for 101 0.03=>1872.46
raise for 102 0.03=>60596.78
raise for 103 0.03=>31146.26
raise for 104 0.03=>20159.43
raise for 108 0.03=>35822.68
raise for 109 0.03=>26084.5
raise for 114 0.03=>27500.92
raise for 115 0.03=>7524.5
raise for 120 0.03=>16262.34
raise for 121 0.03=>16183.41
raise for 122 0.03=>15591.35
raise for 131 0.03=>3671.33
raise for 133 0.03=>4567.98
raise for 137 0.03=>4838.1
raise for 141 0.03=>4703.71
raise for 142 0.03=>4044.79
raise for 145 0.03=>17734.79
raise for 146 0.03=>17101.39
raise for 147 0.03=>15201.23
raise for 150 0.03=>12667.7
raise for 151 0.03=>12034.32
raise for 156 0.03=>13047.73
raise for 157 0.03=>12395.35
raise for 158 0.03=>11400.93
raise for 159 0.03=>10134.16
raise for 168 0.03=>14567.86
raise for 174 0.03=>13934.48
raise for 175 0.03=>11147.58
raise for 184 0.03=>5480.03
raise for 185 0.03=>5193.76
raise for 192 0.03=>5219.1
raise for 193 0.03=>4940.41
raise for 200 0.03=>5740.99
raise for 201 0.03=>16962.05
raise for 203 0.03=>8481.03
raise for 204 0.03=>13047.73
raise for 205 0.03=>15657.27
raise for 206 0.03=>10829.62