静的な値セットに基づくビュー・オブジェクトの作成

ビュー・オブジェクトは、通常は1つ以上の基礎となるエンティティ・オブジェクトに基づいています。ただし、他のデータソースに基づくビュー・オブジェクトも作成できます。これは、このリリースの新機能です。この場合、ビュー・オブジェクト問合せはSQL文ではないため、ビュー・オブジェクトの実装クラスのコードをオーバーライドし、データを収集および処理する必要があります。このタイプのビュー・オブジェクトは、次のような任意のデータソースから作成できます。

このトピックでは、静的な値セットに基づくビュー・オブジェクトの作成方法を説明します。HRスキーマに基づくビジネス・コンポーネント・プロジェクトを使用します。

ビジネス・コンポーネント・プロジェクトを作成するには、次のようにします。

  1. 新規のワークスペースを作成する場合は、「ファイル」->「新規」を選択し、新規ダイアログで「General」->「ワークスペース」を選択します。
  2. 「ファイル」->「新規」を選択し、カテゴリから「General」->「Projects」を選択します。
  3. 項目から、「新規ビジネス・コンポーネントを含むプロジェクト」を選択し「OK」をクリックします。
  4. ウィザードを実行し、情報を変更するかデフォルトを受け入れ、「終了」をクリックします。
  5. ビジネス・コンポーネント・パッケージ・ウィザードが開いた後、「初期画面」ページで情報を確認し、「次へ」をクリックします。
  6. ウィザードのステップ1で、HRスキーマを含むデータベース接続を指定します(ユーザー名とパスワードの両方にHRを入力します)。「次へ」をクリックします。
  7. ウィザードのステップ2で、パッケージ名を入力するかデフォルトを受け入れ、「次へ」をクリックします。
  8. ウィザードのステップ3で、LOCATIONS表を「選択済」リストに移動し、「終了」をクリックします。

これで、Locations表のデフォルト・ビューが作成されました。このビューは、LocationId属性に基づいてスクロールできます。ここで、レコードを国名ごとに参照する必要があるとします。次の2つの問題があります。

新規のビュー・オブジェクトの作成

ここで、CountryNameおよびAbbreviationという2つの属性を含む新規ビュー・オブジェクトを作成します。これらの属性は一時属性であり、データベース表にマップされません。したがって、ビュー・オブジェクトの基礎としてエンティティ・オブジェクトを使用しないか、ウィザードで問合せ文を作成します。

2つの一時属性を含むビュー・オブジェクトを作成するには、次のようにします。

  1. ナビゲータで、パッケージ・ノードを右クリックし、「新規ビュー・オブジェクト」を選択します。
  2. ビュー・オブジェクト・ウィザードが開いた後、「初期画面」ページで情報を確認し、「次へ」をクリックします。
  3. 「名前」ページで、ビュー・オブジェクトの名前にCountryCodesViewを入力し、「次へ」をクリックします。
  4. 「エンティティ・オブジェクト」ページで、「次へ」を選択します。このビュー・オブジェクトはエンティティ・オブジェクトに基づきません。
  5. 「属性」ページで、「新規」をクリックして新規属性を作成します。
    1. 「新規ビュー属性」ダイアログで、「名前」フィールドにCountryNameと入力します。「OK」をクリックします。
    2. 「新規」をもう一度クリックし、今度はAbbreviationという属性を作成します。
  6. このウィザードの残りの部分では、デフォルト値を変更する必要はありません。ウィザードを続けることも、ここで「終了」をクリックすることもできます。

ビュー・オブジェクトのコードの変更

2つの一時(マップされない)属性を含むビュー・オブジェクトを作成しました。ビュー・オブジェクトの問合せに国および略称のリストを移入するには、ビュー・オブジェクトの実装クラスのコードを編集して次のいずれかを行う必要があります。

実装クラスを編集するには、次のようにします。

  1. ナビゲータで、「CountryCodesView」のノードを展開します。
  2. CountryCodesViewImpl.java」をダブルクリックし、ソース・エディタで開きます。

コンストラクタでのベクターの宣言および初期化

ビュー・オブジェクトには、2つの一時属性が含まれています。最初に、コンストラクタ・メソッドにコードを追加し、国の名前および略称を含むベクターを宣言および初期化します。完成したコードは次のようになります。

public class CountryCodesViewImpl extends oracle.jbo.server.ViewObjectImpl {

  static final String [] countryStr = {
    "AR,Argentina",
    "AU,Australia",
    "BE,Belgium",
    "BR,Brazil",
    "CA,Canada",
    "CH,Switzerland",
    "CN,China",
    "DE,Germany",
    "DK,Denmark",
    "EG,Egypt",
    "FR,France",
    "HK,HongKong",
    "IL,Israel",
    "IN,India",
    "IT,Italy",
    "JP,Japan",
    "KW,Kuwait",
    "MX,Mexico",
    "NG,Nigeria",
    "NL,Netherlands",
    "SG,Singapore",
    "UK,United Kingdom",
    "US,United States of America",
    "ZM,Zambia",
    "ZW,Zimbabwe" };

    static Vector countries = new Vector(countryStr.length);

  /**
    * This is the default constructor (do not remove)
    */
  public CountryCodesViewImpl() {
    if (countries.isEmpty()) {
      for (int i=0; i<countryStr.length; i++) {
      countries.add(i, countryStr[i]);
      }
    }
  }

問合せコレクションへのベクターの内容の移入

次に、executeQueryForCollection()をオーバーライドすることにより、ビュー・オブジェクトの問合せの結果を問合せコレクションに移入します。この場合、問合せ結果は静的ベクターの内容です。完成したコードは次のようになります。

protected void executeQueryForCollection(
  Object qc, Object[] params, int noUserParams) {
  super.executeQueryForCollection(qc, params, noUserParams);
  // associate relevant data with this query collection: our
  // countries Vector, its size, and an index we'll use when
  // populating the rowset
  setUserDataForCollection(qc,
    new Object[] {countries, new Integer(countries.size()), new Integer(0)});
}

結果セットに行が残っているかどうかの判断

次に、結果セットに行が残っているかどうかを判断します。これを行うには、hasNextForCollection()をオーバーライドします。このメソッドは、結果セットのサイズを次の行の索引と比較し、結果セットに他にも行があるかどうかを判断します。完成したコードは次のようになります。

protected boolean hasNextForCollection(Object qc) {
  Object[] userData = (Object[])getUserDataForCollection(qc);

  // userData[0] is the result set
  // userData[1] is the number of rows in the result set
  // userData[2] is the index of the next row
  if (userData == null || userData[0] == null) {
    return false;
  }

  // has the index moved beyond the end of the list of countries?
  int index = ((Integer)userData[2]).intValue();
  if (index >= ((Integer)userData[1]).intValue()) {
    setFetchCompleteForCollection(qc, true);
    return false;
  }
  return true;
}

結果セット内の次の行を返す

最後に、結果セット内の次の行を返します。これを行うには、createRowFromResultSet()をオーバーライドします。このメソッドは、結果セット内の次の行を返します。完成したコードは次のようになります。

protected ViewRowImpl createRowFromResultSet(Object qc, ResultSet resultSet) {
  Object[] userData = (Object[])getUserDataForCollection(qc);

  if (userData == null || userData[0] == null) {
    return null;
  }

  // are there any more rows to fetch? 
  int index = ((Integer)userData[2]).intValue();
  if (index >= ((Integer)userData[1]).intValue()) {
    setFetchCompleteForCollection(qc, true);
    return null;
  }

  // Create and populate a new row
  ViewRowImpl vRow = createNewRowForCollection(qc);
  Vector data = (Vector)userData[0];
  StringTokenizer st =
    new StringTokenizer((String)data.get(index), ",");
  populateAttributeForRow(vRow, 0, st.nextToken());
  populateAttributeForRow(vRow, 1, st.nextToken());
  userData[2] = new Integer(++index);
  return vRow;
} 

ビュー・オブジェクトのテスト

これで、実装クラスに国の名前および略称がリストされた新規ビュー・オブジェクトが完成しました。この時点で、ビュー・オブジェクトをテストし、その動作を確認できます。

ビュー・オブジェクトをテストする方法

  1. ナビゲータで、アプリケーション・モデルのノードを右クリックし、「テスト」を選択します。
  2. 「Business Component Browser」ダイアログが表示されたら、「接続」をクリックします。
  3. 「CountryCodesView」をダブルクリックします。
  4. Business Component Browserを使用してレコードのスクロールを制御し、国の名前および略称を参照します。

国の名前および略称は、読取り専用モードであることに注意してください。ビュー・オブジェクトがエンティティ・オブジェクトに基づいている場合とは異なり、ここで値を変更することはできません。値は実装クラスで変更する必要があります。

ビュー・オブジェクトと別のビュー・オブジェクトのリンク

これでビュー・オブジェクトが完成しました。次に、このビュー・オブジェクトに便利な機能を追加できます。たとえば、このビュー・オブジェクトをLocationsViewにリンクできます。これにより、レコードを国ごとにスクロールできるようになります。これを行うには、新規ビュー・リンクを作成し、アプリケーション・モジュールのデータ・モデルを編集する必要があります。

CountryCodesViewからLocationsViewへのビュー・リンクを作成するには、次のようにします。

  1. ナビゲータで、パッケージ・ノードを右クリックし、「新規ビュー・リンク」を選択します。
  2. ビュー・リンク・ウィザードが開いた後、「初期画面」ページで情報を確認し、「次へ」をクリックして続けます。
  3. 「名前」ページで、名前CountriesToLocationsLinkを入力します。「次へ」をクリックします。
  4. 「ビュー・オブジェクト」ページで、リンク元として「CountryCodesView」を選択し、リンク先として「LocationsView」を選択します。「次へ」をクリックします。
  5. 「リンク元の属性」ページで、リンク元属性として「Abbreviation」を選択します。「次へ」をクリックします。
  6. 「リンク先の属性」ページで、リンク先属性として「CountryId」を選択します。「次へ」をクリックします。
  7. 「終了」をクリックします。

アプリケーション・モジュールを編集するには、次のようにします。

  1. ナビゲータで、アプリケーション・モデルのノードを右クリックし、「編集」を選択します。
  2. 「データ・モデル」ページで、「CountryCodesView」を選択し、これを「データ・モデル」ペインに移動します。
  3. 右側の「データ・モデル」ペインで、「CountryCodesView」をクリックして選択します。
  4. 「LocationsView経由CountriesToLocationsLink」を「データ・モデル」ペインに移動します。これは「CountryCodesView」の下に表示されます。これで、LocationsViewはデータ・モデルの制限ビューになりました。
  5. 「終了」をクリックします。

アプリケーション・モジュールをテストするには、次のようにします。

  1. ナビゲータで、アプリケーション・モデルのノードを右クリックし、「テスト」を選択します。
  2. 「Business Component Browser」ダイアログが表示されたら、「接続」をクリックします。
  3. 「CountriesToLocationsLink」をダブルクリックします。場所情報を国ごとに参照できます。

まとめ

ビュー・オブジェクトは、必ずしもデータベース問合せに基づく必要はありません。実装クラスのメソッドをオーバーライドすることにより、任意のデータソースを使用できます。このビュー・オブジェクトは、他のビュー・オブジェクトと同様に使用できます。レコードのスクロール、別のビュー・オブジェクトへのリンク、ユーザー・インタフェース・コンポーネントのバインドを行うことができます。