Oracle® Mobile Application Framework

Oracle Mobile Application Frameworkでのモバイル・アプリケーションの開発

2.1.3.0.0

E67370-01(原本部品番号:E63410-01)

2015年7月

Oracle JDeveloperを使用して、デバイス上でネイティブに実行するモバイル・アプリケーションを作成する方法について説明するドキュメント。

Oracle Mobile Application Framework Oracle Mobile Application Frameworkでのモバイル・アプリケーションの開発 2.1.3.0.0

E67370-01

Copyright © 2014, 2015, Oracle and/or its affiliates. All rights reserved.

原本著者: Liza Rekadze、Cindy Hall、Walter Egan

原本協力者: Ralph Gordon

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

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

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

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

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

目次

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

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

1 Oracle Mobile Application Frameworkの概要

- 1.1 モバイル・アプリケーション・フレームワークの概要

- 1.2 MAFランタイム・アーキテクチャについて

- 1.3 MAFを使用したアプリケーションの開発について

- 1.3.1 接続アプリケーションおよび切断されたアプリケーションについて

- 1.4 サンプル・アプリケーション

2 MAFアプリケーション開発のスタート・ガイド

- 2.1 MAFアプリケーションの宣言的な開発の概要

- 2.2 MAFアプリケーションの作成

- 2.2.1 MAFアプリケーションの作成方法

- 2.2.2 MAFアプリケーションの作成時に行われる処理

- 2.3 MAFアプリケーションのアプリケーション機能の定義

- 2.3.1 アプリケーション機能の定義方法

- 2.4 アプリケーション機能へのコンテンツの追加

- 2.5 MAFアプリケーションへのアプリケーション機能の追加

- 2.5.1 MAFアプリケーションへのアプリケーション機能の追加方法

- 2.5.2 機能参照IDと機能IDに関する必知事項

- 2.6 MAF AMXページおよびMAFタスク・フローの作成

- 2.6.1 MAF AMXページの作成方法

- 2.6.2 MAFタスク・フローの作成方法

- 2.6.3 MAF AMXページおよびタスク・フローの作成時に行われる処理

- 2.7 エンタープライズ配布に対応するためのMAFアプリケーションのコンテナ化

3 MAFアプリケーションのコンテンツの構成

- 3.1 MAFアプリケーションの表示情報の構成の概要

- 3.2 MAFアプリケーションの表示プロパティの設定

- 3.3 アプリケーション機能の表示プロパティの設定

4 アプリケーションのナビゲーションの構成

- 4.1 MAFアプリケーションの表示動作の概要

- 4.2 アプリケーションのナビゲーションの構成

- 4.2.1 ナビゲーション・バーの表示動作の設定方法

- 4.2.2 Springboardの表示動作の設定方法

- 4.2.3 Springboardのスライドアウト動作の設定方法

- 4.2.4 アプリケーション機能の表示順序の設定方法

- 4.3 ナビゲーション・オプションの構成時の処理

- 4.4 Springboardにアニメーションを設定する場合の処理

- 4.5 HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項

- 4.6 MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項

- 4.7 Springboardの実行時動作に関する必知事項

- 4.8 MAFアプリケーションでのスライディング・ウィンドウの作成

5 MAFアプリケーション機能のコンテンツ・タイプの定義

- 5.1 アプリケーション機能のコンテンツ・タイプの概要

- 5.2 アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法

- 5.3 アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法

- 5.4 外部リソースの選択に関する必知事項

6 MAFアプリケーションのローカライズ

- 6.1 MAFアプリケーションのローカライズの概要

- 6.2 MAFアプリケーションのリソース・バンドル・オプションの設定

- 6.2.1 MAFアプリケーションのリソース・バンドル・オプションの設定方法

- 6.3 ベース・リソース・バンドルでのテキスト・リソースの定義

- 6.3.1 ベース・リソース・バンドルにテキスト・リソースを定義する方法

- 6.3.2 ベース・リソース・バンドルにテキスト・リソースを定義した場合の処理

- 6.4 ロケール固有のリソース・バンドルの作成

- 6.4.1 ロケール固有のリソース・バンドルの作成方法

- 6.5 リソース・バンドルのリソースの編集

- 6.6 MAFアプリケーションのイメージ・ファイルのローカライズ

- 6.7 ローカライズ可能なMAFプロパティ

7 MAFアプリケーションのスキニング

- 7.1 MAFアプリケーション・スキンの概要

- 7.1.1 maf-config.xmlファイルについて

- 7.1.2 maf-skins.xmlファイルについて

- 7.2 アプリケーションへのカスタム・スキンの追加

- 7.3 アプリケーションが使用するスキンの指定

- 7.4 カスタム・スキンの登録

- 7.5 MAFスキンのバージョニング

- 7.6 スキンのバージョニング時に行われる処理

- 7.7 デフォルト・スキン・スタイルのオーバーライド

- 7.8 スキンのアプリケーション機能への適用時に行われる処理

- 7.9 スキニングに関する必知事項

- 7.10 スキンへの新しいスタイル・シートの追加

- 7.11 エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化

- 7.12 実行時に行われる処理: エンド・ユーザーによるアプリケーションのスキンの変更方法

8 MAFアプリケーション・コンテンツの再使用

- 8.1 機能アーカイブ・ファイルの概要

- 8.2 MAFアプリケーションでのFARコンテンツの使用方法

- 8.3 FARのライブラリとしての追加時に行われる処理

- 8.4 FARのビュー・コントローラ・プロジェクトとしての追加時に行われる処理

- 8.5 機能アーカイブ・リソースの再使用の有効化に関する必知事項

9 MAFアプリケーションでのプラグインの使用方法

- 9.1 MAFアプリケーションでのプラグインの使用方法の概要

- 9.2 MAFアプリケーションでのコア・プラグインの有効化

- 9.2.1 MAFアプリケーションでコア・プラグインを有効にする方法

- 9.2.2 MAFアプリケーションでコア・プラグインを有効にする場合の処理

- 9.3 MAFアプリケーションでの追加プラグインの登録

- 9.3.1 追加プラグインを登録する方法

- 9.3.2 MAFアプリケーションに追加プラグインを登録する場合の処理

- 9.4 MAFアプリケーション組込みプラグインのデプロイ

- 9.5 機能アーカイブ・ファイルからのプラグインのインポート

10 MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ

- 10.1 MDSカスタマイズをMAFファイルに適用する方法の概要

- 10.2 MDSによるMAFアプリケーションのカスタマイズ

- 10.3 カスタマイズ・レイヤーの構成

- 10.3.1 レイヤー値をグローバルに構成する方法

- 10.3.2 アプリケーションレベルのレイヤー値の構成方法

- 10.3.2.1 Studio開発者ロールの使用方法

- 10.3.2.2 「カスタマイズ開発者」ロールの使用方法

- 10.4 カスタマイズ・クラスの作成

- 10.5 カスタマイズ・クラスの使用

- 10.6 「カスタマイズ開発者」ロールの理解

- 10.6.1 JDeveloperでの「カスタマイズ開発者」ロールへの切替え

- 10.6.2 ヒント・レイヤーに関する必知事項

- 10.7 Webサービス・データ・コントロールとカスタマイズしたアプリケーションのデプロイメントに関する必知事項

- 10.8 リソース・バンドルでのカスタマイズの有効化

- 10.8.1 アプリケーション・リソース・バンドルの作成方法

- 10.8.2 プロジェクト・リソース・バンドルの作成方法

- 10.9 カスタマイズを使用したMAFアプリケーションのアップグレード

- 10.9.1 アプリケーションをアップグレードする場合のJDeveloperでの処理

- 10.9.2 FARのアップグレードに関する必知事項

11 MAFアプリケーションでのライフサイクル・リスナーの使用方法

- 11.1 MAFアプリケーションのライフサイクル・リスナーの概要

- 11.2 MAFアプリケーションまたはアプリケーション機能のライフサイクル・リスナーの登録

- 11.3 ライフサイクル・リスナー登録時の処理

12 MAF AMXページの作成

- 12.1 MAF AMXアプリケーション機能の概要

- 12.2 タスク・フローの作成

- 12.2.1 タスク・フローの作成方法

- 12.2.1.1 新しいバインド・タスク・フローの動作に関する必知事項

- 12.2.2 タスク・フロー・アクティビティと制御フローに関する必知事項

- 12.2.3 ViewController-task-flow.xmlファイルに関する必知事項

- 12.2.4 MAFタスク・フロー・ダイアグラマに関する必知事項

- 12.2.5 タスク・フロー・アクティビティの追加方法と使用方法

- 12.2.5.1 ビュー・アクティビティの追加

- 12.2.5.2 ルーター・アクティビティの追加

- 12.2.5.3 メソッド・コール・アクティビティの追加

- 12.2.5.4 タスク・フロー・コール・アクティビティの追加

- 12.2.5.5 タスク・フロー・リターン・アクティビティの追加

- 12.2.5.6 ページ定義ファイルのあるタスク・フロー・アクティビティの使用

- 12.2.6 制御フローの定義方法

- 12.2.6.1 制御フロー・ケースの定義

- 12.2.6.2 ワイルドカード制御フロー・ルールの追加

- 12.2.6.3 制御フロー・ルールのメタデータに関する必知事項

- 12.2.6.4 制御フロー・ルールの評価に関する必知事項

- 12.2.7 MAFの戻るナビゲーションのサポートに関する必知事項

- 12.2.8 ドラッグによりページ・ナビゲーションを有効にする方法

- 12.2.9 UIコンポーネントを使用したアクション結果の指定方法

- 12.2.10 マネージドBeanの作成および参照方法

- 12.2.11 ページ遷移スタイルの指定方法

- 12.2.12 バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項

- 12.2.12.1 バインドなしタスク・フロー

- 12.2.12.2 バインド・タスク・フロー

- 12.2.12.3 タスク・フローのパラメータの使用

- 12.3 ビューの作成

- 12.3.1 MAF AMXページの使用方法

- 12.3.1.1 MAF AMXページ構造の解釈

- 12.3.1.2 MAF AMXページの作成

- 12.3.1.3 MAF AMXページの作成時に行われる処理

- 12.3.1.4 UIエディタの使用方法

- 12.3.1.5 ページ定義ファイルへのアクセス

- 12.3.1.6 ページ・コンテンツの共有

- 12.3.2 MAF AMXページにUIコンポーネントを追加する方法

- 12.3.2.1 「プレビュー」の使用方法

- 12.3.2.2 UIコンポーネントの構成

- 12.3.2.3 要素識別子とその監査に関する必知事項

- 12.3.3 MAF AMXページへのデータ・コントロールの追加方法

- 12.3.3.1 属性のドラッグ・アンド・ドロップ

- 12.3.3.2 操作のドラッグ・アンド・ドロップ

- 12.3.3.3 コレクションのドラッグ・アンド・ドロップ

- 12.3.3.4 生成されるバインディングに関する必知事項

- 12.3.3.5 生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項

- 12.3.3.6 MAF AMXエディタの「バインディング」タブの使用方法

- 12.3.3.7 使用されないバインディングの削除に関する必知事項

- 12.3.4 サーバー通信に関する必知事項

13 MAF AMXユーザー・インタフェースの作成

- 13.1 MAF AMXページのユーザー・インタフェースの作成の概要

- 13.2 ページ・レイアウトの設計

- 13.2.1 表示コンポーネントの使用方法

- 13.2.2 パネル・ページ・コンポーネントの使用方法

- 13.2.3 パネル・グループ・レイアウト・コンポーネントの使用方法

- 13.2.3.1 スクロール動作のカスタマイズ

- 13.2.4 パネル・フォーム・レイアウト・コンポーネントの使用方法

- 13.2.5 パネル・ストレッチ・レイアウト・コンポーネントの使用方法

- 13.2.6 パネル・ラベルおよびメッセージ・コンポーネントの使用方法

- 13.2.7 ファセット・コンポーネントの使用方法

- 13.2.8 ポップアップ・コンポーネントの使用方法

- 13.2.9 パネル・スプリッタ・コンポーネントの使用方法

- 13.2.10 スペーサ・コンポーネントの使用方法

- 13.2.11 表のレイアウト・コンポーネントの使用方法

- 13.2.12 メーソンリー・レイアウト・コンポーネントの使用方法

- 13.2.13 デッキ・コンポーネントの使用方法

- 13.2.14 フラグメント・コンポーネントの使用方法

- 13.3 UIコンポーネントの作成と使用方法

- 13.3.1 入力テキスト・コンポーネントの使用方法

- 13.3.1.1 入力テキスト・コンポーネントのカスタマイズ

- 13.3.2 入力数値スライダ・コンポーネントの使用方法

- 13.3.3 入力日コンポーネントの使用方法

- 13.3.4 出力テキスト・コンポーネントの使用方法

- 13.3.5 ボタンの使用方法

- 13.3.5.1 デフォルト・スタイル・ボタンの表示

- 13.3.5.2 戻るスタイル・ボタンの表示

- 13.3.5.3 強調表示スタイル・ボタンの表示

- 13.3.5.4 アラート・スタイル・ボタンの表示

- 13.3.5.5 追加のボタン・スタイルの使用方法

- 13.3.5.6 アプリケーション内でのボタンの使用方法

- 13.3.5.7 戻るボタン・ナビゲーションの有効化

- 13.3.5.8 操作と属性の処理順序に関する必知事項

- 13.3.6 リンクの使用方法

- 13.3.7 イメージの表示方法

- 13.3.8 チェックボックス・コンポーネントの使用方法

- 13.3.8.1 iOSプラットフォームでのチェックボックス・コンポーネントのサポート

- 13.3.8.2 Androidプラットフォームでのチェックボックス・コンポーネントのサポート

- 13.3.9 チェックボックスを複数選択コンポーネントの使用方法

- 13.3.9.1 チェックボックスを複数選択コンポーネントとユーザーとの対話に関する必知事項

- 13.3.10 選択肢コンポーネントの使用方法

- 13.3.10.1 iOSプラットフォームでの選択肢コンポーネントとユーザーとの対話に関する必知事項

- 13.3.10.2 Androidプラットフォームでの選択肢コンポーネントとユーザーとの対話に関する必知事項

- 13.3.10.3 アイテムの選択コンポーネントの違いに関する必知事項

- 13.3.11 選択肢を複数選択コンポーネントの使用方法

- 13.3.12 ブール・スイッチ・コンポーネントの使用方法

- 13.3.12.1 iOSプラットフォームでのブール・スイッチ・コンポーネントのサポートに関する必知事項

- 13.3.12.2 Androidプラットフォームでのブール・スイッチ・コンポーネントのサポートに関する必知事項

- 13.3.13 選択ボタン・コンポーネントの使用方法

- 13.3.14 ラジオ・ボタン・コンポーネントの使用方法

- 13.3.15 リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法

- 13.3.15.1 ページングおよび動的スクロールの構成

- 13.3.15.2 MAF AMX UIコンポーネントによるメモリー消費に関する必知事項

- 13.3.15.3 リスト・ビュー・アイテムの再配置

- 13.3.15.4 リスト・ビュー・レイアウトの構成

- 13.3.15.5 静的リスト・ビューの使用に関する必知事項

- 13.3.16 カルーセル・コンポーネントの使用方法

- 13.3.17 フィルム・ストリップ・コンポーネントの使用方法

- 13.3.17.1 フィルム・ストリップ・レイアウトに関する必知事項

- 13.3.17.2 フィルム・ストリップ・ナビゲーションに関する必知事項

- 13.3.18 Verbatimコンポーネントの使用方法

- 13.3.18.1 JavaScriptおよびAJAXをVerbatimコンポーネントとともに使用する方法に関する必知事項

- 13.3.19 出力HTMLコンポーネントの使用方法

- 13.3.20 反復の有効化方法

- 13.3.21 リソース・バンドルのロード方法

- 13.3.22 アクション・リスナーの使用方法

- 13.3.22.1 アクション・リスナー・コンポーネントと属性間の違いに関する必知事項

- 13.3.23 プロパティ・リスナーの設定の使用方法

- 13.3.24 クライアント・リスナーの使用方法

- 13.3.25 日時の変換方法

- 13.3.25.1 日時パターンに関する必知事項

- 13.3.26 数値の変換方法

- 13.3.27 ドラッグ・ナビゲーションを有効にする方法

- 13.3.27.1 disabled属性に関する必知事項

- 13.3.28 ロード・インジケータの使用方法

- 13.4 ジェスチャーの有効化

- 13.5 データ視覚化の指定

- 13.5.1 面グラフの作成方法

- 13.5.2 棒グラフの作成方法

- 13.5.3 バブル・チャートの作成方法

- 13.5.4 コンボ・チャートの作成方法

- 13.5.5 線グラフの作成方法

- 13.5.6 円グラフの作成方法

- 13.5.6.1 円グラフをドーナツ・グラフとして構成

- 13.5.6.2 円グラフのスタイル設定

- 13.5.7 散布図の作成方法

- 13.5.8 スパーク・チャートの作成方法

- 13.5.9 ファンネル・チャートの作成方法

- 13.5.10 チャート・コンポーネントのスタイル設定方法

- 13.5.11 チャート・コンポーネントでのイベントの使用方法

- 13.5.12 LEDゲージの作成方法

- 13.5.13 ステータス・メーター・ゲージの作成方法

- 13.5.14 ダイアル・ゲージの作成方法

- 13.5.15 評価ゲージの作成方法

- 13.5.15.1 評価ゲージ・コンポーネントへのカスタム・スタイルの適用

- 13.5.16 チャートおよびゲージ・コンポーネントの子要素の定義方法

- 13.5.16.1 チャートのデータ・アイテムの定義

- 13.5.16.2 凡例の定義および構成

- 13.5.16.3 X軸、Y軸およびY2軸の定義および構成

- 13.5.16.4 円グラフのデータ・アイテムの定義

- 13.5.16.5 スパーク・チャートのデータ・アイテムの定義

- 13.5.16.6 ファンネル・データ・アイテムの定義

- 13.5.16.7 しきい値の定義

- 13.5.17 地理マップ・コンポーネントの作成方法

- 13.5.17.1 地理プロバイダ情報を指定した地理マップ・コンポーネントの構成

- 13.5.17.2 地理マップ・コンポーネントのルート表示

- 13.5.18 テーマ・マップ・コンポーネントの作成方法

- 13.5.18.1 カスタム・マーカーの定義

- 13.5.18.2 分離領域レイヤーの定義

- 13.5.18.3 分離領域の定義

- 13.5.18.4 初期ズームの有効化

- 13.5.18.5 カスタム・ベース・マップの定義

- 13.5.18.6 イベント・リスナーのマーカー・サポートに関する必知事項

- 13.5.18.7 テーマ・マップ・コンポーネントへのカスタム・スタイルの適用

- 13.5.19 マップ・コンポーネントでのイベントの使用方法

- 13.5.20 ツリーマップ・コンポーネントの作成方法

- 13.5.20.1 ツリーマップ・コンポーネントへのカスタム・スタイルの適用

- 13.5.21 サンバースト・コンポーネントの作成方法

- 13.5.21.1 サンバースト・コンポーネントへのカスタム・スタイルの適用

- 13.5.22 時系列コンポーネントの作成方法

- 13.5.22.1 時系列コンポーネントへのカスタム・スタイルの適用

- 13.5.23 NBoxコンポーネントの作成方法

- 13.5.24 マップ・コンポーネント、サンバースト、ツリーマップ、時系列およびNBoxの子要素の定義方法

- 13.5.25 データバインドされたデータ視覚化コンポーネントの作成方法

- 13.5.25.1 データバインドされたチャート・コンポーネントの系列スタイルの設定に関する必知事項

- 13.5.26 静的データに基づくデータ視覚化コンポーネントの作成方法

- 13.5.27 チャート・コンポーネントでインタラクティブ性を有効にする方法

- 13.5.28 極チャートの作成方法

- 13.6 UIコンポーネントのスタイル設定

- 13.6.1 コンポーネント属性を使用したスタイルの定義方法

- 13.6.2 スキニングに関する必知事項

- 13.6.3 スキニング用のCSS IDセレクタの使用に関する必知事項

- 13.6.4 データ視覚化コンポーネントのスタイル設定方法

- 13.7 UIコンポーネントのローカライズ

- 13.8 MAFのアクセシビリティのサポートの理解

- 13.8.1 アクセシビリティのためのUIおよびデータ視覚化コンポーネントの構成方法

- 13.8.1.1 アクセシビリティ監査ルールの構成

- 13.8.2 基本的なWAI-ARIA用語に関する必知事項

- 13.8.3 Oracle Global HTML Accessibility Guidelinesに関する必知事項

- 13.9 入力の検証

- 13.10 イベント・リスナーの使用方法

- 13.10.1 イベント・リスナーの制約付きタイプ属性に関する必知事項

14 MAF AMXでのバインディングの使用とデータ・コントロールの作成

- 14.1 バインディングおよびデータ・コントロールの概要

- 14.2 オブジェクト・スコープ・ライフサイクルについて

- 14.2.1 オブジェクト・スコープとタスク・フローに関する必知事項

- 14.3 EL式の作成

- 14.3.1 データ・バインディングEL式について

- 14.3.2 EL式の作成方法

- 14.3.2.1 メソッド式ビルダーについて

- 14.3.2.2 非ELプロパティについて

- 14.3.3 MAFバインディング・プロパティに関する必知事項

- 14.3.4 イテレータ間でデータ・プロバイダの状態の保持を有効にする方法

- 14.3.5 バインディング・コンテナを参照する方法

- 14.3.6 式ビルダーのカテゴリについて

- 14.3.6.1 バインディング・カテゴリについて

- 14.3.6.2 マネージドBeanカテゴリについて

- 14.3.6.3 モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて

- 14.3.7 ELイベントについて

- 14.3.8 EL式のマネージドBean内での使用方法

- 14.4 マネージドBeanの作成と使用

- 14.4.1 JDeveloperでのマネージドBeanの作成方法

- 14.4.2 JDeveloperを使用してマネージドBeanを作成する場合の処理

- 14.5 データ・コントロールを使用したビジネス・サービスの公開

- 14.5.1 データ・コントロールの作成方法

- 14.5.2 データ・コントロール作成時のプロジェクト内の処理

- 14.5.2.1 DataControls.dcx概要エディタ

- 14.5.2.2 データ・コントロール・パネル

- 14.5.3 データ・コントロールの組込み操作

- 14.6 「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成

- 14.6.1 「データ・コントロール」パネルの使用方法

- 14.6.2 「データ・コントロール」パネルの使用時の処理

- 14.7 実行時に行われる処理: バインディング・コンテキストの動作方法

- 14.8 データ・コントロールの構成

- 14.8.1 データ・コントロールの編集方法

- 14.8.2 データ・コントロール編集時の処理

- 14.8.3 データ・コントロールのMDSカスタマイズに関する必知事項

- 14.9 属性の使用

- 14.9.1 属性を主キーとして指定する方法

- 14.9.2 属性の静的なデフォルト値を定義する方法

- 14.9.3 属性へのUIヒントの設定方法

- 14.9.4 属性へのUIヒントの設定時の処理

- 14.9.5 EL式を使用してUIヒントにアクセスする方法

- 14.10 Beanデータ・コントロールの作成および使用

- 14.10.1 Beanクラス変数のシリアライズに関する必知事項

- 14.11 DeviceFeaturesデータ・コントロールの使用方法

- 14.11.1 getPictureメソッドを使用して写真撮影を可能にする方法

- 14.11.2 SendSMSメソッドを使用してテキスト・メッセージングを可能にする方法

- 14.11.3 sendEmailメソッドを使用して電子メールを可能にする方法

- 14.11.4 createContactメソッドを使用してコンタクト先の作成を可能にする方法

- 14.11.5 findContactsメソッドを使用してコンタクト先の検索を可能にする方法

- 14.11.6 updateContactメソッドを使用してコンタクト先の更新を可能にする方法

- 14.11.7 removeContactメソッドを使用してコンタクト先の削除を可能にする方法

- 14.11.8 startLocationMonitorメソッドを使用して地理的位置を有効にする方法

- 14.11.9 displayFileメソッドを使用してファイルの表示を可能にする方法

- 14.11.10 addLocalNotificationおよびcancelLocalNotificationメソッドを使用してローカル通知を管理する方法

- 14.11.11 デバイス・プロパティに関する必知事項

- 14.12 属性の検証

- 14.12.1 検証ルールの追加方法

- 14.12.2 バリデータのメタデータに関する必知事項

- 14.13 データ変更イベントについて

15 MAF AMXでのWebサービスの使用方法

- 15.1 MAFアプリケーションでのWebサービスの使用方法の概要

- 15.2 RESTを使用したWebサービス・データ・コントロールの作成

- 15.3 SOAPを使用したWebサービス・データ・コントロールの作成

- 15.3.1 SOAPヘッダーのカスタマイズ方法

- 15.3.2 SOAPコールによって返されたオブジェクトへのアクセス方法

- 15.4 Webサービス・データ・コントロールに関する必知事項

- 15.5 新しいWebサービス接続の作成

- 15.6 Webサービス・データ・コントロールのエンド・ポイントの調整

- 15.7 セキュアなWebサービスへのアクセス

- 15.7.1 Webサービスへのアクセスを有効にする方法

- 15.7.2 Webサービスへのアクセスを有効にする場合の処理

- 15.7.3 Webサービスとコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項

- 15.7.4 資格証明の挿入に関する必知事項

- 15.7.5 Cookieの挿入に関する必知事項

- 15.7.6 セキュアなWSDLファイルの使用制限

- 15.8 JavaからのWebサービスの起動

- 15.8.1 Webサービス・オブジェクトの行を追加および削除する方法

- 15.8.2 REST Webサービス・アダプタの使用方法

- 15.8.2.1 入力および出力ストリームへのアクセス

- 15.8.2.2 非テキスト・レスポンスのサポート

- 15.8.3 RESTレスポンスの厳密な検証を有効にする方法

- 15.8.4 JSONレスポンスの処理方法

- 15.8.5 データ・コントロール操作の起動に関する必知事項

- 15.9 MAFのJavaScriptのサポートに関する制限の理解

- 15.10 ブラウザ・プロキシ情報の構成

16 MAFアプリケーションで使用されるエンド・ポイントの構成

- 16.1 MAFアプリケーションで使用されるエンド・ポイントの構成の概要

- 16.2 構成サービスのエンド・ポイントの定義

- 16.3 構成サービスのユーザー・インタフェースの作成

- 16.4 URLの構築について

- 16.5 サーバー上での構成サービスの設定

- 16.6 ADFモバイルからの構成サービスの移行

17 MAF AMXでのローカル・データベースの使用方法

- 17.1 ローカルSQLiteデータベースの使用方法の概要

- 17.1.1 SQLiteと他のリレーショナル・データベースとの相違点

- 17.1.1.1 同時実行性

- 17.1.1.2 SQLのサポートおよび解釈

- 17.1.1.3 データ型

- 17.1.1.4 外部キー

- 17.1.1.5 データベース・トランザクション

- 17.1.1.6 認証

- 17.2 ローカルSQLiteデータベースの使用方法

- 17.2.1 データベースへの接続方法

- 17.2.2 SQLスクリプトを使用してデータベースを初期化する方法

- 17.2.3 デスクトップ上でデータベースを初期化する方法

- 17.2.4 コミット処理に関する必知事項

- 17.2.5 MAFでのSQLite JDBCドライバの制限

- 17.2.6 VACUUMコマンドの使用方法

- 17.2.7 データベースを暗号化および復号化する方法

- 17.2.7.1 独自のパスワードでのデータベースの暗号化

- 17.2.7.2 独自のパスワードで暗号化されたデータベースの永久的な復号化

- 17.2.7.3 MAFで生成されたパスワードでのデータベースの暗号化

- 17.2.7.4 MAFで生成されたパスワードで暗号化されたデータベースの復号化

- 17.2.8 StockTrackerサンプル・アプリケーションに関する必知事項

18 MAF AMXアプリケーション機能アーティファクトのカスタマイズ

- 18.1 MAF AMXページおよびアーティファクトのカスタマイズの概要

- 18.2 MAF AMXページおよびアーティファクトのカスタマイズ

19 カスタムMAF AMX UIコンポーネントの作成

- 19.1 カスタムUIコンポーネントの作成の概要

- 19.2 MAF APIを使用したカスタム・コンポーネントの作成

- 19.2.1 静的APIの使用方法

- 19.2.2 AmxEventクラスの使用方法

- 19.2.3 TypeHandlerの使用方法

- 19.2.4 AmxNodeの使用方法

- 19.2.5 AmxTagの使用方法

- 19.2.6 VisitContextの使用方法

- 19.2.7 AmxAttributeChangeの使用方法

- 19.2.8 AmxDescendentChangesの使用方法

- 19.2.9 AmxCollectionChangeの使用方法

- 19.2.10 AmxNodeChangeResultの使用方法

- 19.2.11 AmxNodeStatesの使用方法

- 19.2.12 AmxNodeUpdateArgumentsの使用方法

- 19.3 カスタム・コンポーネントの作成

20 リモートURLを使用したアプリケーション機能コンテンツの実装

- 20.1 リモートURLアプリケーションの概要

- 20.1.1 ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化

- 20.1.2 リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化

- 20.1.3 ホワイトリストされたドメインによるデバイス機能へのアクセス方法

- 20.1.4 ホワイトリストを作成(またはドメインを制限)する方法

- 20.1.5 ホワイトリストにドメインを追加する場合の処理

- 20.1.6 リモートURLに関する必知事項

- 20.2 アプリケーション・コンポーネントのホワイトリストの作成

- 20.3 リモートURLページでのブラウザ・ナビゲーション・バーの有効化

- 20.3.1 リモートURLアプリケーション機能へのナビゲーション・バーの追加方法

- 20.3.2 リモートURLアプリケーション機能のブラウザ・ナビゲーション・ボタンを有効にする場合の処理

- 20.4 カスタムURLスキームを使用したMAFアプリケーションの起動

21 ユーザー・プリファレンスの有効化

- 21.1 モバイル・アプリケーションのユーザー・プリファレンス・ページの作成

- 21.1.1 モバイル・アプリケーションレベルのプリファレンス・ページの作成方法

- 21.1.1.1 新しいユーザー・プリファレンス・ページの作成方法

- 21.1.1.2 プリファレンス・ページを追加する場合の処理

- 21.1.1.3 ユーザー・プリファレンス・リストの作成方法

- 21.1.1.4 プリファレンス・リストを作成する場合の処理

- 21.1.1.5 ブール型のプリファレンス・リストの作成方法

- 21.1.1.6 ブール型のプリファレンスを追加する場合の処理

- 21.1.1.7 テキストのプリファレンスの追加方法

- 21.1.1.8 テキストのプリファレンスを定義する場合の処理

- 21.1.2 アプリケーションレベルのプリファレンス・ページを作成する場合の処理

- 21.2 アプリケーション機能のユーザー・プリファレンス・ページの作成

- 21.3 ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法

- 21.3.1 preferenceScopeに関する必知事項

- 21.3.2 iOSネイティブ・ビューでのプリファレンス値の読取り

- 21.4 プラットフォームによる表示の差異

22 アプリケーション機能に関する制約の設定

- 22.1 制約の概要

- 22.1.1 制約を使用したアプリケーション機能の表示または非表示

- 22.1.2 制約を使用した特定のコンテンツ・タイプの配信

- 22.2 アプリケーション機能の制約の定義

- 22.2.1 アプリケーション機能に制約を定義する方法

- 22.2.2 制約を定義する場合の処理

- 22.2.3 property属性について

- 22.2.4 ユーザー制約とアクセス制御について

- 22.2.5 ハードウェア関連の制約について

- 22.2.6 アプリケーション機能およびコンテンツに関する動的制約の作成

- 22.2.6.1 静的制約とEL定義制約の結合について

- 22.2.6.2 動的コンテンツの定義方法

23 Oracle Cloud上のデータへのアクセス

- 23.1 Oracle CloudでホストされるデータへのMAFアプリケーションによるアクセスの有効化

- 23.1.1 Oracle Cloudの認証方法

- 23.1.2 Oracle Java CloudにアクセスするためのWebサービス・データ・コントロールの作成方法

- 23.1.2.1 SOAPベースのWebサービスにおけるポリシーの構成

- 23.1.3 Oracle Java Cloud ServiceにアクセスするMAFアプリケーションのデプロイ時に行われる処理

24 通知の有効化と使用方法

- 24.1 通知の概要

- 24.2 プッシュ通知の有効化

- 24.2.1 プッシュ通知ペイロードに関する必知事項

- 24.3 ローカル通知の管理

- 24.3.1 Javaを使用したローカル通知の管理方法

- 24.3.2 JavaScriptを使用したローカル通知の管理方法

- 24.3.3 DeviceFeaturesデータ・コントロールを使用したローカル通知の管理方法

- 24.3.4 ローカル通知の処理方法

- 24.3.5 ローカル通知オプションとアプリケーションの動作に関する必知事項

25 データのキャッシュ

- 25.1 データ・キャッシュの概要

- 25.1.1 sync-config.xmlファイルを使用したデータ・キャッシュの実装

- 25.1.2 データ・キャッシュを有効にする方法

- 25.1.3 キャッシュ・ポリシーについて

- 25.1.4 FARを使用したsync-config.xmlファイルの更新に関する必知事項

26 MAFアプリケーションでのエラー・メッセージの表示

- 26.1 MAFアプリケーションでのエラー処理の概要

- 26.2 エラー・メッセージの表示およびバックグラウンド・スレッドの停止

- 26.2.1 アプリケーションによるバックグラウンド・スレッド例外のエラー・メッセージの表示方法

- 26.3 エラー・メッセージのローカライズ

27 MAFアプリケーションのデプロイ

- 27.1 MAFアプリケーションのデプロイメントの概要

- 27.1.1 MAFデプロイメント・オプション

- 27.1.1.1 プロジェクト・ライブラリのデプロイメント

- 27.1.1.2 JVMライブラリのデプロイメント

- 27.2 デプロイメント・プロファイルでの作業

- 27.2.1 自動的に生成されるデプロイメント・プロファイルについて

- 27.2.2 デプロイメント・プロファイルの作成方法

- 27.2.3 デプロイメント・プロファイルの作成時の処理

- 27.2.4 Androidデプロイメント・プロファイルの作成方法

- 27.2.4.1 アプリケーションの詳細オプションの設定

- 27.2.4.2 デプロイメント・オプションの設定

- 27.2.4.3 Android署名オプションの定義

- 27.2.4.4 資格証明の格納に関する必知事項

- 27.2.4.5 Androidアプリケーションへのカスタム・イメージの追加方法

- 27.2.4.6 JDeveloperによってAndroidアプリケーション用のイメージがデプロイされる場合の処理

- 27.2.5 iOSデプロイメント・プロファイルの作成方法

- 27.2.5.1 iOSビルド・オプションの定義

- 27.2.5.2 デバイス署名オプションの設定

- 27.2.5.3 iOSアプリケーションへのカスタム・イメージの追加

- 27.2.5.4 iTunesアートワークに関する必知事項

- 27.2.5.5 表示をデバイスの特定の向きに制限する方法

- 27.2.5.6 デバイスの向きを選択解除する場合の処理

- 27.3 Androidアプリケーションのデプロイ

- 27.3.1 AndroidエミュレータへのAndroidアプリケーションのデプロイ方法

- 27.3.2 Androidデバイスへのアプリケーションのデプロイ方法

- 27.3.3 Androidアプリケーションの公開方法

- 27.3.4 .apkファイル作成時のJDeveloperでの処理

- 27.3.5 最近使用されたデプロイメント・プロファイルの選択

- 27.3.6 Androidデバッグ・ブリッジの使用方法に関する必知事項

- 27.4 iOSアプリケーションのデプロイ

- 27.4.1 iOSシミュレータへのiOSアプリケーションのデプロイ方法

- 27.4.2 iOSデバイスへのアプリケーションのデプロイ方法

- 27.4.3 iOSデバイスにアプリケーションをデプロイする場合の処理

- 27.4.4 iOSデバイスへのアプリケーションのデプロイに関する必知事項

- 27.4.4.1 iOS開発用証明書の作成

- 27.4.4.2 テストおよびデバッグ用のAppleデバイスの登録

- 27.4.4.3 アプリケーションIDの登録

- 27.4.5 App StoreへのiOSアプリケーションの配布方法

- 27.5 機能アーカイブ・ファイル(FAR)のデプロイ

- 27.5.1 機能アーカイブのデプロイメント・プロファイルの作成方法

- 27.5.2 機能アーカイブのデプロイメント・プロファイルのデプロイ方法

- 27.5.3 機能アーカイブ・ファイルのデプロイメント・プロファイルをデプロイする場合の処理

- 27.6 モバイル・アプリケーション・アーカイブ・ファイルの作成

- 27.6.1 モバイル・アプリケーション・アーカイブ・ファイルの作成方法

- 27.7 署名されていないデプロイメント・パッケージの作成

- 27.7.1 署名されていないアプリケーションの作成方法

- 27.7.2 MAFアプリケーション・アーカイブ・ファイルのインポート時に行われる処理

- 27.8 コマンド行からのMAFアプリケーションのデプロイ

- 27.8.1 OJDeployを使用したモバイル・アプリケーションのデプロイ

- 27.9 Oracle Mobile Security Suite (OMSS)でのデプロイ

- 27.9.1 OMSSでアプリケーションをコンテナ化する場合の処理

28 セキュアなモバイル開発方法の理解

- 28.1 脆弱なサーバー側コントロール

- 28.2 デバイス上のセキュアでないデータ格納

- 28.2.1 SQLiteデータベースの暗号化

- 28.2.2 デバイスのローカル・データ・ストアの保護

- 28.2.3 セキュリティ・ログとアプリケーション・ログについて

- 28.3 トランスポート・レイヤーの不十分な保護

- 28.4 サイドチャネルによるデータの漏えい

- 28.5 脆弱な認可および認証

- 28.6 不適切な暗号化

- 28.7 クロスサイト・スクリプティングのクライアント側インジェクション

- 28.7.1 ホワイトリストによるXSSからのアプリケーションの保護

- 28.7.2 デバイス・アクセス権限を使用したインジェクション攻撃からのMAFアプリケーションの保護

- 28.7.3 カスタムHTMLコンポーネントからのインジェクション攻撃リスクについて

- 28.7.4 SQLインジェクションおよびXMLインジェクションについて

- 28.8 信頼できない入力のセキュリティ判断

- 28.9 不適切なセッション処理

- 28.10 バイナリ保護の欠如による機密情報の開示

29 MAFアプリケーションの保護

- 29.1 MAFセキュリティの概要

- 29.2 ユーザー・ログイン・プロセスについて

- 29.3 MAFアプリケーションの認証プロセスの概要

- 29.4 コンテナ化されたMAFアプリケーションの認証プロセスの概要

- 29.5 MAF接続の構成

- 29.5.1 MAFログイン接続の作成方法

- 29.5.2 マルチテナント対応MAFログイン接続の作成方法

- 29.5.3 Basic認証の構成方法

- 29.5.4 Oracle Mobile and Social Identity Managementを使用して認証を構成する方法

- 29.5.5 OAuth認証の構成方法

- 29.5.6 Web SSO認証の構成方法

- 29.5.7 MAFアプリケーション・ログイン用プレースホルダ接続の構成方法

- 29.5.8 実行時に名前付き接続の接続属性を更新する方法

- 29.5.9 ログイン資格証明の格納方法

- 29.5.10 MAFアプリケーションの接続の作成時に行われる処理

- 29.5.11 マルチテナント対応の接続の作成時に行われる処理

- 29.5.12 ログイン接続構成に関する必知事項

- 29.5.13 ログイン接続とコンテナ化されたMAFアプリケーションに関する必知事項

- 29.5.14 ローカルおよびハイブリッド・ログイン接続の場合の複数のアイデンティティに関する必知事項

- 29.5.15 MAFアプリケーションおよび認証モードの移行に関する必知事項

- 29.5.16 カスタム・ヘッダーに関する必知事項

- 29.5.17 実行時に行われる処理: MAFがREST Webサービスをコールした場合

- 29.5.18 基本認証ヘッダーの挿入に関する必知事項

- 29.5.19 Webサービス・セキュリティに関する必知事項

- 29.5.20 アクセス制御の構成方法

- 29.5.21 アクセス制御サービスに関する必知事項

- 29.5.22 アプリケーションのロード順序の変更方法

- 29.5.23 認証の前にログイン資格証明をプログラムで構成する方法

- 29.6 MAFアプリケーションのセキュリティの構成

- 29.6.1 認証を要求するようにアプリケーション機能を設定する方法

- 29.6.2 ログイン・ページの指定方法

- 29.6.3 カスタム・ログインHTMLページまたはカスタムKBAページの作成方法

- 29.6.4 ログイン・ページに関する必知事項

- 29.6.4.1 デフォルト・ログイン・ページ

- 29.6.4.2 カスタム・ログイン・ページ

- 29.6.5 ログイン・ページ要素に関する必知事項

- 29.6.6 アプリケーション機能用セキュリティの構成時のJDeveloperでの処理

- 29.7 デバイス機能へのアクセスの許可

- 29.8 アプリケーション機能からのユーザーのログアウトの有効化

- 29.9 SSLのサポート

30 MAFアプリケーションのテストおよびデバッグ

- 30.1 MAFアプリケーションのテストおよびデバッグの概要

- 30.2 MAFアプリケーションのテスト

- 30.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

- 30.3 MAFアプリケーションのデバッグ

- 30.3.1 デバッグ構成に関する必知事項

- 30.3.1.1 実行構成の作成と構成

- 30.3.2 iOSプラットフォームでのデバッグ方法

- 30.3.3 Androidプラットフォームでのデバッグ方法

- 30.3.4 MAF AMXコンテンツのデバッグ方法

- 30.3.5 JavaコードおよびJavaScriptのデバッグを有効にする方法

- 30.3.5.1 iOS 7およびiOS 8プラットフォーム上でのiOSデバイス・シミュレータを使用したJavaScriptのデバッグに関する必知事項

- 30.4 ロギングの使用方法と構成

- 30.4.1 プロパティ・ファイルを使用したロギングの構成方法

- 30.4.2 JavaScriptのロギングの使用方法

- 30.4.3 埋込みロギングの使用方法

- 30.4.4 iOSプラットフォームでのデバッグおよびロギングにXcodeを使用する方法

- 30.4.5 アプリケーション・ログへのアクセス方法

- 30.4.6 ロギングを無効にする方法

A トラブルシューティング

- A.1 iOSシミュレータでの入力コンポーネントの問題

- A.2 アドレス・ポイント数を制限する地理マップ・コンポーネント

- A.3 コード署名が原因でデプロイメントが失敗する

- A.4 credentials属性によりデプロイメントが失敗する

B ローカルHTMLおよびアプリケーション・コンテナAPI

- B.1 MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成

- B.1.1 カスタムHTMLページ内のコードの実行について

- B.2 MAFコンテナ・ユーティリティAPI

- B.2.1 JavaScriptコールバックの使用方法

- B.2.2 コンテナ・ユーティリティAPIの使用方法

- B.2.3 getApplicationInformation

- B.2.4 gotoDefaultFeature

- B.2.5 gotoFeature

- B.2.6 getFeatures

- B.2.7 getFeatureByName

- B.2.8 getFeatureById

- B.2.9 resetFeature

- B.2.10 resetApplication

- B.2.11 gotoSpringboard

- B.2.12 showSpringboard

- B.2.13 hideSpringboard

- B.2.14 showNavigationBar

- B.2.15 hideNavigationBar

- B.2.16 showPreferences

- B.2.17 invokeMethod

- B.2.18 invokeContainerMethod

- B.2.19 invokeContainerJavaScriptFunction

- B.2.20 sendEmail

- B.2.21 sendSMS

- B.2.22 アプリケーション・アイコンへのバッジ設定

- B.3 getDirectoryPathRootメソッドを使用したファイル・アクセス

- B.3.1 プラットフォームに依存しないダウンロード場所へのアクセス

C MAFアプリケーションとプロジェクト・ファイル

- C.1 MAFアプリケーションとプロジェクト・ファイルの概要

- C.2 アプリケーション・コントローラ・プロジェクト・レベルのリソースについて

- C.3 ビュー・コントローラ・プロジェクトのリソースについて

- C.4 MAFアプリケーションの構成ファイルについて

- C.5 MAFアプリケーション機能の構成ファイルについて

D デプロイメントでのプリファレンスの変換

- D.1 プリファレンスのネーミング・パターン

- D.2 Android用のプリファレンスの変換

- D.2.1 maf_references.xml

- D.2.1.1 プリファレンス要素のマッピング

- D.2.1.2 プリファレンス属性のマッピング

- D.2.1.3 属性のデフォルト値

- D.2.1.4 プリファレンス画面ルート要素

- D.2.2 maf_arrays.xml

- D.2.3 maf_strings.xml

- D.3 iOS用のプリファレンスの変換

E MAFアプリケーションの使用方法

- E.1 MAFアプリケーションの使用方法の概要

- E.2 モバイル・デバイスへのMAFアプリケーションのインストール

- E.2.1 iOSデバイスへのMAFアプリケーションのインストール方法

- E.2.2 AndroidデバイスへのMAFアプリケーションのインストール方法

- E.2.3 MAFアプリケーションのアンインストール方法

- E.3 アプリケーション機能間の移動

- E.3.1 iOSデバイスでのアプリケーション機能間の移動方法

- E.3.1.1 Springboardを使用した移動

- E.3.1.2 単一機能アプリケーションの使用

- E.3.2 Androidデバイス上での移動方法

- E.4 プリファレンスの設定

- E.4.1 iOSデバイスでのプリファレンスの設定方法

- E.4.2 Androidデバイスでのプリファレンスの設定方法

- E.5 ログ・ファイルの表示

- E.6 アプリケーションの使用方法の制限

- E.6.1 リスト・ビュー・コンポーネントの制限

- E.6.2 データ視覚化コンポーネントの制限

- E.6.3 Androidプラットフォームでのデバイスの「戻る」ボタンの制限

- E.6.4 アクセシビリティ・サポートの制限

F XMLの解析

- F.1 kXMLライブラリを使用したXMLの解析

G サンプルのMAFアプリケーション

- G.1 サンプルのMAFアプリケーションの概要

はじめに

『Oracle Mobile Application Frameworkでのモバイル・アプリケーションの開発』へようこそ

対象読者

このドキュメントは、デバイス上でネイティブに実行するクロス・プラットフォーム・モバイル・アプリケーションの作成を担当する開発者を対象としています。

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

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートを購入したオラクル社のお客様は、My Oracle Supportを介して電子的なサポートにアクセスできます。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info) か、聴覚に障害のあるお客様は (http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

関連ドキュメント

詳細は、次のドキュメントを参照してください。

- Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール

- Oracle Fusion Middleware Oracle JDeveloperインストレーション・ガイド

- Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発

- Oracle Fusion Middleware Oracle JDeveloper Extensions開発者ガイド

- Oracle Fusion Middleware Oracle ADF FacesによるWebユーザー・インタフェースの開発

- Oracle Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護

- Oracle Fusion Middleware Oracle Web Services Managerの理解

- Oracle Fusion Middleware Webサービスの管理

- Oracle Fusion Middleware Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理

- Oracle Mobile Application Framework Oracle Fusion Middleware Java APIリファレンス

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- Oracle Fusion Middleware Oracle Mobile Application Framework JSDocリファレンス

- Oracle Fusion Middleware Oracle Web Services Manager Java APIリファレンス

- Oracle JDeveloper 12cオンライン・ヘルプ

- Oracle JDeveloper 12cリリース・ノート(Oracle JDeveloper 12cインストール内のリンクおよびOracle Technology Networkから入手)

表記規則

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

規則

意味

太字

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

イタリック体

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

固定幅フォント

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

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

項

変更内容

第2.7項「エンタープライズ配布に対応するためのMAFアプリケーションのコンテナ化」

OMSS (Oracle Mobile Security Suite)のコンテナ化によってMAFアプリケーション開発がどのようにサポートされているかを説明するために追加された項。

第14.10項「Beanデータ・コントロールの作成および使用」

Beanデータ・コントロールの追加について詳細な手順を説明するために更新された項。

第15.7項「セキュアなWebサービスへのアクセス」

OWSMセキュリティ・ポリシーでSOAPサービスとRESTサービスを保護するためのmaf-application.xmlエディタのデザインタイム・サポートを説明するために更新された項。

第25.1.3項「キャッシュ・ポリシーについて」

データ・キャッシュ・ポリシーを説明するために追加された項。

第27.2.4.1項「アプリケーションの詳細オプションの設定」

UIの変更点を反映し、OMSSでのAndroidのサポートについて追加するために更新された項。

第27.2.4.2項「デプロイメント・オプションの設定」

UIの変更点を反映し、OMSSでのAndroidのサポートについて追加するために更新された項。

第27.9項「Oracle Mobile Security Suite (OMSS)でのデプロイ」

OMSSでのAndroidのサポートについて追加するために更新された項。

第27.9.1項「OMSSでアプリケーションをコンテナ化する場合の処理」

OMSS暗号化およびデータ漏えい防止ポリシーの適用方法を説明するために追加された項。

第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」

OMSSのコンテナ化に伴う認証の変更点を説明するために追加された項。

第29.5.2項「マルチテナント対応MAFログイン接続の作成方法」

マルチテナント環境に対応してユーザーにドメイン名の入力を要求するデフォルトのログイン・ページの作成方法を説明するために追加された項。

第29.5.3項「Basic認証の構成方法」

基本認証を使用したログイン接続の作成時にカスタム・ヘッダーを構成する方法を説明するために更新された項。

第29.5.23項「認証の前にログイン資格証明をプログラムで構成する方法」

実行時のカスタム・ヘッダー値のオーバーライドに対応する方法を説明するために追加された項。

第G.1項「サンプルのMAFアプリケーションの概要」

新しいMCS Sampleアプリケーションについて説明し、StockTrackerアプリケーションへの変更点を反映するために改訂された項。

1 Oracle Mobile Application Frameworkの概要

この章では、Oracle Mobile Application Framework (MAF)の概要を紹介し、iOSとAndroidの両方の電話およびタブレット上でネイティブに実行するモバイル・アプリケーションを作成可能なソリューションについて説明します。

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

- 第1.1項「モバイル・アプリケーション・フレームワークの概要」

- 第1.2項「MAFランタイム・アーキテクチャについて」

- 第1.3項「MAFを使用したアプリケーションの開発について」

- 第1.4項「サンプル・アプリケーション」

1.1 モバイル・アプリケーション・フレームワークの概要

MAFは、ハイブリッド・モバイル・アーキテクチャで、ユーザー・インタフェースのレンダリングにHTML5およびCSSを使用し、アプリケーション・ビジネス・ロジックにJavaを使用し、GPSアクティビティや電子メールなどのデバイス機能へのアクセスにApache Cordovaを使用します。MAFではこれらのクロス・プラットフォーム・テクノロジを使用するため、プラットフォーム固有のツールを使用する必要なく、AndroidとiOSの両方のデバイス上で動作するアプリケーションを構築できます。MAFアプリケーションをデバイスにデプロイすると、そのアプリケーションはObjective CやAndroid SDKなどのプラットフォーム固有のツールを使用して作成されたアプリケーションと同じように動作します。さらに、MAFを使用すると、スマートフォンまたはタブレット用に同じアプリケーションを構築できるため、同じアプリケーションのビジネス・ロジックを再利用して、様々なタイプのデバイス、画面サイズおよび機能をターゲットにできます。開発環境の設定、構成および移行の詳細は、『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』を参照してください。

MAFアプリケーションは1つ以上のアプリケーション機能で構成され、それらは図1-1に示すように、アプリケーションのSpringboardまたはナビゲーション・バー内にアイコンとして表示されます。

図1-1 MAFアプリケーションのSpringboard

アプリケーション機能は再利用可能な、アプリケーションの機能性を持つ自己完結型モジュールです。各アプリケーション機能によって一連の特定のタスクが実行され、これらの機能をグループ化して、相互の機能が補完されるようにできます。たとえば、顧客のコンタクト先を提供するアプリケーション機能を、製品在庫用のアプリケーション機能と組み合せることができます。各アプリケーション機能には独自クラス・ローダーおよびWebビュー(基本的には、ブラウザとして機能するネイティブUIコンポーネント)があるため、機能は相互に独立しており、1つのMAFアプリケーションを、いくつかの異なる開発チームにより作成されたアプリケーション機能が集められたものとすることができます。また、アプリケーション機能を他のMAFアプリケーションで再利用することもできます。MAFアプリケーション自体を別のアプリケーションのベースとして再利用できることにより、ISV (独立系ソフトウェア・ベンダー)は、特定の顧客が構成できるアプリケーションを作成できます。

デバイス上でローカルに実行するハイブリッド・モバイル・アプリケーションに加え、モバイル・アプリケーションおよび使用可能なリソースの要件に応じて、アプリケーション機能を次のモバイル・アプリケーション・タイプのいずれかとして実装できます。

- モバイルWebアプリケーション: これらのアプリケーションはサーバー上でホストされます。プラットフォーム間でコードを移植できるものの、これらのアプリケーションはデバイスのブラウザによって管理されるため、アプリケーションからのデバイス機能およびローカル記憶域へのアクセスは制限される可能性があります。

- ネイティブ・アプリケーション: これらのアプリケーションはXcodeまたはAndroid SDKのいずれかを使用して作成されているため、両方のプラットフォームへの対応には制限があります。コードの再利用も同様に制限されます。

1.2 MAFランタイム・アーキテクチャについて

図1-2に示すように、MAFはデバイスにデプロイされたシン・ネイティブ・コンテナです。MAFは、モデル・レイヤーとコントローラ・ロジックからプレゼンテーションを区別するmodel-view-controller (MVC)開発アプローチに従っています。シン・ネイティブ・コンテナによって、MAFアプリケーションが両方のプラットフォーム(iOSとAndroid)でネイティブ・アプリケーションとして機能できます。プッシュ通知も有効になります。

図1-2 MAFランタイム・アーキテクチャ

- Webビュー: モバイル・デバイスのWebエンジンを使用して、Webベースのコンテンツを表示および処理します。MAFアプリケーションでは、アプリケーション・マークアップをHTML 5としてレンダリングすることにより、Webビューからユーザー・インタフェースが配信されます。次のコンテンツ・タイプのいずれかを実装して、MAFアプリケーション機能用のユーザー・インタフェースを作成できます。様々なコンテンツ・タイプから実装されたアプリケーション機能は、同じMAFアプリケーション内に共存でき、相互作用することもできます。

- MAF AMXビュー: コンテンツがMAFアプリケーション・モバイルXML (AMX)ビューとして実装されたアプリケーションは、デバイスのプラットフォームに固有の言語で作成されたアプリケーションと同様、デバイス上に常駐して非常に標準的かつデバイス・ネイティブなユーザー操作を提供します。MAFでは、モバイル・デバイスのフォーム・ファクタに合わせたコンポーネントからユーザー・インタフェースを宣言的に作成できる、一連のコード・エディタが提供されています。これらのコンポーネントを使用して、リスト・ビューなどのページ・レイアウトおよび入力テキストなどの入力コンポーネントを作成できます。MAF AMXビューを開発する場合、データ・コントロールを利用できます。これらのコンポーネントを使用すると、データ・バインドされたユーザー・インタフェース・コンポーネントを宣言的に作成したり、Webサービスやモバイル・デバイスのサービス(カメラ、GPS、電子メールなど)にアクセスできます。実行時、MAF AMXビュー定義が、WebビューのJavaScriptエンジンによってHTML5およびJavaScriptにレンダリングされます。詳細は、次を参照してください。

- 第12章「MAF AMXページの作成」

- 第13章「MAF AMXユーザー・インタフェースの作成」

- 第14章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」

- 第15章「MAF AMXでのWebサービスの使用方法」

- 第16章「MAFアプリケーションで使用されるエンド・ポイントの構成」

- 第17章「MAF AMXでのローカル・データベースの使用方法」

- 第18章「MAF AMXアプリケーション機能アーティファクトのカスタマイズ」

- 第19章「カスタムMAF AMX UIコンポーネントの作成」

タスク・フロー: コントローラは、MAFアプリケーションのページ間のフローを制御し、アプリケーションのフローをより小さい再利用可能なタスク・フローに分割でき、メソッド・コールや決定点などの非ビジュアル・コンポーネントを含めることができます。詳細は、第12.2項「タスク・フローの作成」を参照してください。

- サーバーHTML: このコンテンツ・タイプでは、ユーザー・インタフェースは、アプリケーション機能のWebビュー内で開くことができる、サーバーが生成したWebページから提供されます。MAFのコンテキストにおいて、このコンテンツ・タイプはリモートURLと呼ばれます。これらのブラウザベースのページのリソースは、デバイス上には存在しません。かわりに、ユーザー・インタフェース、ページ・フロー・ロジックおよびビジネス・ロジックはリモート・サーバーから配信されます。リモートでホストされたこれらのWebページのいずれかがWebビュー内で開くことを許可されている場合、Cordova JavaScript APIを使用して、指定されたデバイス・ネイティブな機能またはサービス(カメラやGPS機能など)にアクセスできます。リモートURLコンテンツを使用した機能を実装する場合、モバイル使用に最適化された既存のブラウザベース・アプリケーションを活用したり、特定のタイプのモバイル・デバイスにあわせて特別に記述されたブラウザベース・アプリケーションを使用できます。デスクトップまたはタブレットのいずれかのブラウザ内で実行可能なアプリケーションの場合は、Oracle ADF Facesのリッチ・クライアント・ベースのコンポーネントを介して作成されたアプリケーションを使用して、リモートURLコンテンツを実装できます。詳細は、第20章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

注意:
コンテンツはリモートで提供されるため、リモートURLを使用する機能はサーバー接続がアクティブな場合にのみ使用できます。

- ローカルHTML: MAFアプリケーションの一部としてデバイス上で実行されるHTMLページです。ローカルHTMLファイルは、CordovaおよびJavaScript APIを介して、デバイス・ネイティブな機能サービスにアクセスできます。

- Cordova: デバイスのネイティブ機能およびサービスをMAFアプリケーションに統合するApache Cordova JavaScript APIです。これらのAPIには、Javaコードからプログラムで(またはMAFアプリケーションをローカルHTMLとして実装している場合にはJavaScriptを使用して)アクセスできますが、これらのAPIはMAFによってデータ・コントロールとしてパッケージ化されるため、MAF AMXページを作成するときにデバイス統合を宣言的に追加できます。

- Java仮想マシン: JavaではMAFアプリケーション用のJava Runtime Environmentが提供されます。このJava仮想マシン(JVM)はデバイス・ネイティブなコードで実装され、ネイティブ・アプリケーション・バイナリの一部として、MAFアプリケーションの各インスタンスに埋め込まれます(コンパイルされます)。JVMは、JavaME Connected Device Configuration (CDC)仕様に基づいています。

- ビジネス・ロジック: MAFアプリケーション内のビジネス・ロジックはJavaで記述できます。マネージドBeanは、サーバーから戻されたデータを処理するための追加のビジネス・ロジックを提供するなど、MAFの機能拡張のために作成できるJavaクラスです。マネージドBeanは埋込みのJavaサポートによって実行され、JavaME CDC仕様に準拠しています。詳細は、第14章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」を参照してください。

- モデル: ビジネス・ロジック・コンポーネントをユーザー・インタフェースに接続するバインディング・レイヤーが含まれます。また、このバインディング・レイヤーでは、RESTまたはSOAPベースのWebサービスを起動するための実行ロジックが提供されます。詳細は、第1.3.1項「接続アプリケーションおよび切断されたアプリケーションについて」を参照してください。

- JDBC: JDBC APIでは、CRUD (作成、読取り、更新および削除)操作を介して、暗号化されているSQLiteデータベースのデータにアクセスできます。

- アプリケーション構成: WebサービスのURLエンド・ポイントやリモートURL接続など、アプリケーション構成をダウンロードおよびリフレッシュできるサービスのことです。アプリケーション構成サービスは、WebDavベースのサーバー側サービスから構成情報をダウンロードします。詳細は、第16章「MAFアプリケーションで使用されるエンド・ポイントの構成」を参照してください。

- 資格証明管理、シングル・サインオン(SSO)およびアクセス制御: MAFでは、Oracle Access Management Mobile and Social (OAMMS) IDM SDKを使用して、ユーザー認証および資格証明管理を処理します。MAFアプリケーションではオフライン認証が実行される(つまり、接続中にユーザーがアプリケーションにログインすると、MAFによってユーザー名とパスワードがデバイス上にローカルに保持される)ため、ユーザーは、認証サーバーへの接続を使用できなくなった場合でも、アプリケーションへのアクセスを続行できます。MAFでは、ローカルに格納されているユーザー情報およびローカルSQLiteデータベースに格納されているデータが暗号化されます。ログイン・サーバーに対して認証した後、ユーザーはこの接続によって保護されるすべてのアプリケーション機能にアクセスできます。また、MAFでは、ユーザー・ロールと権限を適用してアプリケーション機能(またはアプリケーション機能の特定機能)へのアクセスを制限することにより、アクセス制御の概念もサポートしています。リモートで供給されるWebコンテンツの場合、MAFでは、ホワイトリストを使用して、アプリケーション機能のWebビュー内では意図したURIのみを開くことができ、かつそのURIのみがデバイス機能にアクセスできるようにします。詳細は、第29章「MAFアプリケーションの保護」を参照してください。

- プッシュ・ハンドラ: MAFアプリケーションがiOSまたはAndroidの通知サーバーからイベントを受信できるようにします。通知処理は、Javaレイヤーで処理されます。

ネイティブ・コンテナと相互作用するリソースは、次のとおりです。

- 暗号化されたSQLiteデータベース: 埋込みSQLiteデータベースは、軽量のクロスプラットフォームのリレーショナル・データベースで、ローカルに格納されているデータを保護し、JDBCを使用してコールされます。このデータベースは暗号化されるため、デバイスを紛失したり盗難された場合にデータが保護されます。正しいユーザー名とパスワードを入力したユーザーのみが、ローカル・データベース内のデータにアクセスできます。詳細は、第17章「MAF AMXでのローカル・データベースの使用方法」を参照してください。

- デバイス・サービス: デバイスにネイティブな、Cordova APIによってアプリケーション機能に統合されたサービスと機能です。

デバイス・ネイティブ・コンテナを使用すると、次のサーバー側リソースにアクセスできます。

- 構成サーバー: アプリケーション構成サービスによって使用される構成ファイルをホストするWebDavベースのサーバーです。構成サーバーは、リファレンス実装として提供されます。J2EEサーバー上でホストされている共通のWebDavサービスはどれでも、この目的のために使用できます。詳細は、第16章「MAFアプリケーションで使用されるエンド・ポイントの構成」を参照してください。

- サーバー生成されたHTML: ブラウザベースのアプリケーション機能に使用される、リモート・サーバー上でホストされたWebコンテンツです。詳細は、第20章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

- APNおよびGCMのプッシュ・サービス: Apple Push Notification Service (APNs)およびGoogle Cloud Messaging (GCM)は、通知イベントをMAFアプリケーションに送信する通知プロバイダです。

- SOAPおよびRESTサービス: リモートでホストされているSOAPベースまたはRESTベースのWebサービスで、Javaレイヤーまたはデータ・コントロールを介してアクセスできます。詳細は、第15章「MAF AMXでのWebサービスの使用方法」を参照してください。

1.3 MAFを使用したアプリケーションの開発について

MAFアプリケーションのコンポーネントは単一の開発者が作成できますが、アプリケーションは、様々な開発ロールによって提供されたリソースから構築することが一般的です。アプリケーション開発者は、アプリケーション・データおよびユーザー・インタフェース・ロジックを、アプリケーションまたはアプリケーション機能で使用できる再利用可能なプログラムとして構築します。アプリケーション・アセンブラでは様々なアプリケーション機能を収集して単一のアプリケーションにし、ナビゲート可能なわかりやすい順序に配置します。アプリケーション・デプロイメントは、アプリケーション・デプロイヤによって制御されます。たとえば、MAFアプリケーションのデプロイメントで、証明書およびApple App StoreやGooglePlayなどのパブリック・ベンダー・サイトへのアップロードが必要となる場合があります。

注意:
アプリケーション開発チームのサイズや所属する組織に応じて、1人の個人に複数の異なるロールが割り当てられる場合があります。

一般的に、MAFアプリケーションを構築するときには、次のアクティビティを実行します。

- 要件の収集

- 設計

- 開発

- デプロイ

- テストおよびデバッグ

- 保護

- サーバー側データへのアクセスの有効化

- 再デプロイ

- 再テストおよびデバッグ

- 公開

MAFアプリケーションを構築するために実行する手順は、次のようなものです。

1. 要件の収集: ユーザーが誰で、その不可欠なタスクは何か、およびこれらのタスクはどのような場所やコンテキストで実行するかを説明するユーザー・データを収集して、モバイル・ユースケース(またはユーザー・シナリオ)を作成します。タスクの実行に必要な情報のタイプ、ユーザーが使用できる情報、情報のアクセス方法や提供方法などの要因を考慮します。

2. 設計: ユースケースを作成した後、アプリケーションのタスク・フロー内のすべてのステップ(および関連するユーザー・ビュー)を示すワイヤフレームを作成します。タスク・フローを作成するときには、ユーザー間でいつどのように相互作用が発生するかを考慮します。データの表示(プッシュ通知など)は、タスクを実行するのに十分ですか。そうでない場合、このタスクにはどの程度のデータ入力量が必要でしょうか。モバイル・コンテキスト内でこれらのタスクを構成するには、デスクトップ・アプリケーションを使用したタスクの実行とモバイル・アプリケーションを使用したタスクの実行とを比較します。単一のデスクトップ・アプリケーションで、複数の異なるモバイル・アプリケーション(または、MAFのコンテキストでは、MAFアプリケーションに埋め込まれた複数の異なるアプリケーション機能)にパーティション化された複数の機能を有効化できます。一般的に、モバイル・アプリケーションは短時間(一度に2分程度)で集中的に使用されるため、簡単にナビゲートでき、モバイル・デバイスの制限されたデータ入力に対応している必要があります。
設計および開発段階中は、モバイル・アプリケーションは、複雑なWebサービスから提供されるデータ量を消費できない場合があるため、モバイル固有のサーバー側リソースのセットが必要な場合があることに注意してください。さらに、モバイル・アプリケーションには、サービスによって戻されるデータを処理するための広範なクライアント側ロジックが必要になる場合もあります。サーバー側のモバイル・アプリケーションに送られてくるデータの形状を指定して、大量すぎるデータを強制的にクライアントで処理させないことが、通常は最適です。

3. 開発: アプリケーションに最適なテクノロジを選択します。MAF WebビューがApache TrinidadまたはADF Facesリッチ・クライアント・コンポーネントを使用して作成されたリモート・コンテンツをサポートしているときには、これらのアプリケーションはオフラインの使用をサポートしません。MAF AMXで作成されたアプリケーションは、クライアント上で実行されますが、デバイス・サービスに統合されているため、エンド・ユーザーは、ファイルを表示したりGPSサービスを利用できるだけでなく、電話番号をタップして電話を発信したりテキストを送信して、相互に共同作業を行うこともできます。MAF AMXコンポーネント・セットにはデータ視覚化ツール(DVT)が含まれており、このツールを使用すると、分析を追加してモバイル画面上で適切にレンダリングできます。MAF AMXアプリケーションでは、リモート・ソースからデータを転送してローカルで格納することでオフライン使用をサポートしているため、エンド・ユーザーは、接続されていないときに情報を表示できます。
MAFでは、基本的なアプリケーション自体だけでなく、MAF AMXやローカルHTMLコンテンツから実装されるアプリケーション機能も構築する、一連のウィザードおよびエディタが提供されています。これらのツールを使用すると、MAFアプリケーションの構成やそのアプリケーション機能の組込みのためのディスクリプタ・ファイル、スプラッシュ画面用の一連のデフォルト・イメージ、Springboard、サポートされているプラットフォームのフォーム・ファクタに適切なナビゲーション・バー・アイテムなどのアーティファクトが提供されます。

詳細は、次を参照してください。

- 第2章「MAFアプリケーション開発のスタート・ガイド」

- 第3章「MAFアプリケーションのコンテンツの構成」

- 第12章「MAF AMXページの作成」

- 第13章「MAF AMXユーザー・インタフェースの作成」

4. デプロイ: MAFアプリケーションは、デバイスまたはシミュレータにデプロイされるまで実行できないため、エンド・ユーザーへの公開というコンテキストだけでなく、テストおよびデバッグ目的でもデプロイします。開発のフェーズに応じて、資格証明署名オプション(デバッグまたはリリース)を指定します。テストの場合は、アプリケーションをモバイル・デバイスまたはシミュレータにデプロイします。本番の場合は、Apple App StoreやGoogle Playなど、アプリケーション・マーケットへの配布用にパッケージ化します。
アプリケーションをデプロイするには、最初に、ターゲット・プラットフォームおよびそのデバイスとシミュレータを記述するデプロイメント・プロファイルを作成します。デプロイメント・プロファイルの作成には、異なる向き(縦または横)や異なるデバイス(電話またはタブレット)でアプリケーションに使用する、スプラッシュ画面および起動アイコンの選択が含まれます。詳細は、第27章「MAFアプリケーションのデプロイ」を参照してください。

5. テストおよびデバッグ: テストおよびデバッグのステージでは、アプリケーションを様々なシミュレータとデバイスにデバッグ・モードでデプロイした後、JDeveloperおよびプラットフォーム固有のツールで提供されるデバッグ出力を確認して、アプリケーションを最適化します。詳細は、第30章「MAFアプリケーションのテストおよびデバッグ」を参照してください。

6. 保護: アプリケーションの開発プロセス全体を通して、セキュリティ上のリスクを評価します。モバイル・アプリケーションには固有のセキュリティ上の問題が存在すると同時に、リモートで供給されるデータにアクセスするすべてのアプリケーションと同じ脆弱性も共有しています。クライアント側のセキュリティを保証するために、MAFでは次のような機能を提供しています。

- クロスサイト・スクリプティング(XSS)やクロスサイト・リクエスト・フォージェリ(CSRF)などのインジェクション攻撃を防ぐホワイトリスト

- SQLiteデータベースへのアクセスを保護する強いパスワードを生成し、そのデータを暗号化および復号化するAPI

- SSLをサポートする一連のWebサービス・ポリシー

- SSLでのデプロイメントを強制する、信頼性のある認証局のcacertsファイル

MAFのセキュリティ構成には、Oracle Access Mobile and Socialサーバーなどのログイン・サーバーまたは基本的なHTTP認証メカニズムによって保護されているいずれかのWebページの選択や、セッション管理(セッション・タイムアウトおよびアイドル・タイムアウト)の構成が含まれ、また、アプリケーションのユーザー・ロールをホストするアクセス制御サービスのWebサービスへのエンド・ポイントの設定も含まれます。詳細は、第29章「MAFアプリケーションの保護」を参照してください。

7. サーバー側データへのアクセスの有効化: 基本レベルで想定どおりにアプリケーションが機能することを確認したら、サーバー側データにアクセスするためにJavaコードを実装したり、データ・コントロールを使用できます。詳細は、第1.3.1項「接続アプリケーションおよび切断されたアプリケーションについて」を参照してください。

8. 再デプロイ: 後続のデプロイメントでは、アプリケーションにセキュリティを追加し、サーバー側データへのアクセスを有効にした後、アプリケーション・デプロイメントが想定どおりに実行され、アプリケーションで最後のテストおよびデバッグを行う準備ができていることを確認します。

9. 再テストおよびデバッグ: 最終回のテストとデバッグでは、セキュリティとサーバー側データのアクセス機能に重点を置き、これらの機能をアプリケーションと統合したときに、エラーや予期しない動作が発生しないことを確認します。

10. 公開: アプリケーションを本番環境にデプロイする場合、通常は、エンタープライズ・サーバー、Apple App StoreまたはGoogle Playへの公開が行われます。MAFアプリケーションを公開すると、エンド・ユーザーは自分のモバイル・デバイスにダウンロードしたり、指定されたアイコンをタッチしてアクセスできるようになります(付録E「MAFアプリケーションの使用方法」を参照)。アプリケーション機能は指定された表示アイコンで表され、エンド・ユーザーやユーザーのデバイスに適した表示が行われます。

1.3.1 接続アプリケーションおよび切断されたアプリケーションについて

MAFアプリケーションは、ネットワークへの接続中に機能しますが、携帯電話の信号がないような切断モードでも機能します。次に例を示します。

- Webサービス・データ・コントロールによって直接支えられているユーザー・インタフェースを含む基本的な接続アプリケーション(このWebサービス・データ・コントロールは、サーバーでホストされているWebサービスを起動します)。

- 中程度の(または複雑な)データ・サービスを使用する接続アプリケーション。このタイプのアプリケーションの場合、データ・コントロールにより公開されたJavaクラス(POJO)は、ユーザー・インタフェースとサービス・データ・ソースの間のデータ問合せをディスパッチします。

- SQLiteデータベースに格納されたデータを操作する、切断されたアプリケーションでは、アプリケーション・ユーザーがオフラインで作業できます。アプリケーションはWebサービスからデータを取得する必要がある場合がありますが、接続が失われている場合、接続がリストアされると、データはローカルに格納され、同期されます。

1.4 サンプル・アプリケーション

デプロイメント環境の設定(『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』を参照)が完了したら、jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにあるMAFサンプル・アプリケーションを実行できます。

図1-3に示すようなWorkBetterアプリケーションなどのサンプル・アプリケーションは、アプリケーションでWebサービスを使用してリモート・データと連動させたり、SQLiteデータベースと相互作用する方法など、MAFアプリケーション機能の範囲を示しています。サンプル・アプリケーションは次の方法を示しています。

- 基本的なHello Worldアプリケーションの作成方法

- アプリケーションがライフサイクル・イベントに反応できるようにする方法

- スキニングの使用方法

- MAF AMXアプリケーション機能の開発方法(ユーザー・インタフェース、ナビゲーション、マネージドBean、データ変更イベントなど)

詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

図1-3 WorkBetterサンプル・アプリケーション

2 MAFアプリケーション開発のスタート・ガイド

この章では、JDeveloperでのMAFアプリケーションの作成方法と、アプリケーション作成時にJDeveloperによって生成されるファイルやその他のアーティファクトについて説明します。

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

- 第2.1項「MAFアプリケーションの宣言的な開発の概要」

- 2.2項「MAFアプリケーションの作成」

- 第2.3項「MAFアプリケーションのアプリケーション機能の定義」

- 第2.4項「アプリケーション機能へのコンテンツの追加」

- 第2.5項「MAFアプリケーションへのアプリケーション機能の追加」

- 第2.6項「MAF AMXページおよびMAFタスク・フローの作成」

- 第2.7項「エンタープライズ配布に対応するためのMAFアプリケーションのコンテナ化」

2.1 MAFアプリケーションの宣言的な開発の概要

JDeveloperのOracle Mobile Application Framework (MAF)拡張機能には、MAFアプリケーションの開発、テストおよびデプロイメントを容易にする様々な概要エディタやその他のウィザードが用意されています。これらのウィザードを使用すると、MAFアプリケーションの作成、1つ以上のアプリケーション機能の定義、アプリケーション機能へのコンテンツの追加、およびMAFアプリケーションのテスト環境またはデバイスへのデプロイを比較的短時間に行えます。

図2-1は、JDeveloperの「アプリケーション」ウィンドウにWorkBetterサンプル・アプリケーションを表示したもので、このウィンドウではMAFアプリケーションの開発に使用する様々なアイテムを特定します。

1. MAFアプリケーションを新規作成すると、デフォルトでmaf-features.xmlファイルの概要エディタが開きます。この概要エディタを使用して、MAFアプリケーションに含めるアプリケーション機能を定義します。

2. maf-application.xmlファイルの概要エディタは、特にMAFアプリケーションの名前、アプリケーション用にレンダリングされるデフォルトのナビゲーション・メニュー(ナビゲーション・バーまたはSpringboard)、セキュリティ、およびアプリケーションのデバイス・アクセス・オプションを指定する場合に使用します。

3. デフォルトで、JDeveloperはMAFアプリケーションを2つのデータ・コントロール(ApplicationFeaturesとDeviceFeatures)とともに作成します。これらのデータ・コントロールでは、MAF AMXページにドラッグ可能な操作を公開し、ユーザーがその操作をページにドロップすると、操作の構成を実行するためのコンテキスト・メニューがJDeveloperによって表示されます。たとえば、hideNavigationBar()操作をページにドラッグすると、エンド・ユーザーがアプリケーションのナビゲーション・バーを非表示にするコントロールを構成するためのコンテキスト・メニューが、JDeveloperによって表示されます。

WorkBetterサンプル・アプリケーションは、MAFに用意されている様々なサンプル・アプリケーションの1つで、MAFを使用したモバイル・アプリケーションの作成方法を示します。詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

JDeveloperによってウィザードにデフォルト・オプションが提示されるので、次のように実行すると、1つのMAF AMXページを表示する、1つのアプリケーション機能を備えたMAFアプリケーションを作成できます。

1. 第2.2項「MAFアプリケーションの作成」の説明に従って、MAFアプリケーションを作成します。

2. 第2.3項「MAFアプリケーションのアプリケーション機能の定義」の説明に従って、MAFアプリケーションのアプリケーション機能を定義します。

3. 第2.4項「アプリケーション機能へのコンテンツの追加」の説明に従って、アプリケーション機能にコンテンツを追加します。

図2-1 アプリケーション機能とアプリケーションの概要エディタ

2.2 MAFアプリケーションの作成

MAFアプリケーションを作成するには、事前にJDeveloperにMAF拡張機能をダウンロード、インストールおよび構成する必要があります。詳細は、『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』を参照してください。このタスクを完了したら、JDeveloperの作成ウィザードを使用してMAFアプリケーションを作成します。

2.2.1 MAFアプリケーションの作成方法

アプリケーションの作成ウィザードを使用して、JDeveloperでMAFアプリケーションを作成します。

MAFアプリケーションの作成手順:

1. メイン・メニューで「ファイル」を選択し、次に「アプリケーション」→「新規」を選択します。

2. 「新規ギャラリ」の「アイテム」リストで、「モバイル・アプリケーション・フレームワーク・アプリケーション」をダブルクリックします。

3. モバイル・アプリケーション・フレームワーク・アプリケーションの作成ウィザードで、名前、ディレクトリ、デフォルトのパッケージなど、アプリケーションとプロジェクトの詳細情報を入力します。ウィザードのヘルプを参照するには、[F1]を押すか「ヘルプ」をクリックします。

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

2.2.2 MAFアプリケーションの作成時に行われる処理

JDeveloperは、MAFアプリケーションを2つのプロジェクト(ApplicationControllerとViewController)および2つのデータ・コントロール(ApplicationFeaturesとDeviceFeatures)とともに作成します。また、MAFアプリケーションの構成用ファイルと、MAFアプリケーションをAndroidまたはiOSプラットフォームにデプロイする際にそのアプリケーションで必要になるファイルも作成されます。

デフォルトで、新規作成したMAFアプリケーションのViewControllerプロジェクト内にあるmaf-features.xmlファイルの概要エディタが表示されます(図2-2を参照)。この概要エディタを使用して、1つ以上のアプリケーション機能をMAFアプリケーションに追加します。MAFアプリケーションには、少なくとも1つのアプリケーション機能が必要です。MAFアプリケーションへのアプリケーション機能の追加の詳細は、第2.3項「MAFアプリケーションのアプリケーション機能の定義」を参照してください。

MAFアプリケーションの作成時にJDeveloperによって生成されるファイルおよびアーティファクトの詳細は、付録C「MAFアプリケーションとプロジェクト・ファイル」を参照してください。

図2-2 新規作成したMAFアプリケーション内のアプリケーション機能の概要エディタ

2.3 MAFアプリケーションのアプリケーション機能の定義

MAFアプリケーションには、少なくとも1つのアプリケーション機能が必要です。たとえば、WorkBetterサンプル・アプリケーションには4つのアプリケーション機能(ダッシュボード、人々、組織およびSpringboard)が含まれています。図2-3は、これらのうち3つのアプリケーション機能が、そのアプリケーションのカスタムSpringboardに表示されている様子を示しています。

図2-3 WorkBetterアプリケーションのSpringboardに表示されるアプリケーション機能

2.3.1 アプリケーション機能の定義方法

MAFアプリケーションのアプリケーション機能を定義するには、maf-features.xmlファイルの概要エディタを使用します。

MAFアプリケーションのアプリケーション機能を定義する手順:

1. 「Application」ウィンドウで、ViewControllerプロジェクトを展開し、「アプリケーション・ソース」およびMETA-INFを展開します。

2. maf-feature.xmlファイルをダブルクリックします。

3. 「機能」ページで「追加」アイコンをクリックします。

4. 次のようにして、「MAF機能の作成」ダイアログに必要な情報を入力します。

- 機能名: アプリケーション機能の表示名を入力します。

- 機能ID: アプリケーション機能の一意のIDを入力するか、JDeveloperによって生成される値をそのまま使用します。

- ディレクトリ: アプリケーション機能のディレクトリを指定するか、JDeveloperによって生成される値をそのまま使用します。

- 「対応する機能参照をmaf-application.xmlに追加」チェック・ボックスを選択し、アプリケーション機能をMAFアプリケーションに追加します。このチェック・ボックスはデフォルトで選択されています。

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

2.4 アプリケーション機能へのコンテンツの追加

アプリケーション機能を定義した後で行うタスクの1つに、アプリケーション機能へのコンテンツの追加があります。アプリケーション機能のコンテンツのレンダリング・タイプを次の中から選択します。

- MAF AMXページ: アプリケーション機能をMAF AMXページとしてレンダリングする場合は、このコンテンツ・タイプを選択します。

- MAFタスク・フロー: アプリケーション機能を、タスク・フローを構成するアクティビティのコレクションとしてレンダリングする場合は、このコンテンツ・タイプを選択します。タスク・フローに含めることのできるアクティビティには、ビュー(MAF AMXページの表示)、メソッド・コール(マネージドBeanのメソッドの起動)、タスク・フロー・コール(別のタスク・フローのコール)などがあります。

- ローカルHTML: アプリケーション機能をHTMLページとしてレンダリングする場合に選択します。

- リモートURL: アプリケーション機能をリモートURLからのコンテンツでレンダリングする場合に選択します。

アプリケーション機能にコンテンツ・タイプを追加する一般的な手順は、すべてのコンテンツ・タイプで同じです。具体的には、maf-features.xmlファイルの概要エディタにある「機能」ページの「コンテンツ」タブで、アプリケーション機能に追加するコンテンツのタイプを選択します。各コンテンツ・タイプに固有の手順については、第5章「MAFアプリケーション機能のコンテンツ・タイプの定義」を参照してください。

2.5 MAFアプリケーションへのアプリケーション機能の追加

定義時にアプリケーション機能がMAFアプリケーションへ自動的に追加されるようにするには、「MAF機能の作成」ダイアログで「対応する機能参照をmaf-application.xmlに追加」チェック・ボックスを選択します(第2.3.1項「アプリケーション機能の定義方法」を参照)。

作成時にMAFアプリケーションへ追加しなかったアプリケーション機能を追加する場合は、maf-application.xmlファイルの概要エディタの「機能参照」ページを使用し、maf-application.xmlファイルの概要エディタの「機能参照」ページを使用します。

アプリケーション機能を機能アーカイブ(FAR)ファイルからインポートして、MAFアプリケーションに追加することもできます。MAFアプリケーションにアプリケーション機能を追加するには、事前にそのアプリケーション機能をMAFアプリケーションにインポートする必要があります。FARファイルからのインポートの詳細は、第8章「MAFアプリケーション・コンテンツの再使用」を参照してください。

図2-4は、「機能参照」ページを示したもので、このページを使用してMAFアプリケーションにアプリケーション機能を追加します。

図2-4 「機能参照」ページを使用したアプリケーション機能の追加

2.5.1 MAFアプリケーションへのアプリケーション機能の追加方法

MAFアプリケーションにアプリケーション機能を追加するには、maf-application.xmlファイルの概要エディタの「機能参照」ページを使用します。

MAFアプリケーションにアプリケーション機能を追加する手順:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開きます。

2. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

3. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「機能参照」ナビゲーション・タブをクリックします。

4. 「機能参照」ページで「追加」アイコンをクリックします。

5. 「機能参照の挿入」ダイアログで、ドロップダウン・リストからアプリケーション機能のIDを選択します。

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

2.5.2 機能参照IDと機能IDに関する必知事項

MAFアプリケーションに追加するアプリケーション機能を参照するためのエントリが、JDeveloperによってmaf-application.xmlファイルに書き込まれます。

maf-application.xmlファイルの<adfmf:featureReference>要素のrefId属性は、maf-feature.xmlファイル内の対応するアプリケーション機能を特定します。このため、maf-application.xmlファイル内の<adfmf:featureReference>要素のrefId属性の値は、maf-feature.xmlファイル内の<adfmf:feature>要素に対して定義されたid属性の値と一致する必要があります。

一貫した命名規則を使用して、アプリケーション機能IDの一意性を確保します。アプリケーション機能IDはMAFアプリケーション全体を通して一意である必要があります。

例2-1に、WorkBetterサンプル・アプリケーションのmaf-application.xmlファイルとmaf-feature.xmlファイルに含まれている人々アプリケーション機能のエントリを示します。

例2-1 WorkBetterアプリケーションに含まれているアプリケーション機能の機能参照と機能ID

<!-- Feature Reference ID in maf-application.xml File -->
<adfmf:featureReference id="fr2" refId="People"/>
...
<!-- Feature ID in maf-feature.xml File -->
<adfmf:feature id="People" name="People" icon="images/people.png" image="images/people.png">
...

2.6 MAF AMXページおよびMAFタスク・フローの作成

第12章「MAF AMXページの作成」で説明されているように、MAF AMXコンポーネントを使用すると、プラットフォーム固有の言語で作成されたページとまったく同じように実行されるページを作成できます。MAF AMXページでは、豊富なコンポーネント・セットを使用して、ユーザー・インタフェースを宣言的に作成できます。図2-5に、MAF AMXページの宣言的な開発を示します。

図2-5 MAF AMXページの作成

これらのページは、(MAFアプリケーションを作成し、その中にアプリケーション機能を埋め込む)アプリケーション・アセンブラによって作成される場合や、別の開発者によって作成され、アプリケーション機能またはMAFアプリケーションに対するリソースとしてMAFアプリケーションに組み込まれる場合もあります。

MAF AMXページを作成するプロジェクトによって、このページが単一のアプリケーション機能のユーザー・インタフェース・コンテンツの配信に使用されるのか、またはMAFアプリケーション全体に対するリソースとして使用されるのかが決まります。たとえば、図2-9に示すような、アプリケーション・コントローラ・プロジェクト内で作成されたページは、アプリケーション全体のリソースとして使用されます。

ヒント:
ページの保守を容易にするために、ページをページ・フラグメントと呼ばれる再利用可能なセグメントに分割できます。MAF AMXページは、1つ以上のページ・フラグメントで構成されます。

MAFでは、MAFタスク・フローを介してMAF AMXビュー・ページおよび他のアクティビティを配置して適切なシーケンスにすることができます。第12.2項「タスク・フローの作成」で説明されているように、MAFタスク・フローはアプリケーションのフローの視覚的に表現したものです。これは、(図2-6に示すWorkBetterサンプル・アプリケーションのデフォルトのListページやDetailページなどのビュー・アクティビティのような) MAF AMXで作成されるユーザー・インタフェース・ページや、マネージドBeanでメソッドをコールできる非視覚的なアクティビティで構成されます。タスク・フローの非視覚的な要素は、EL式を評価したり、別のタスク・フローをコールするために使用できます。図2-6で示されるように、MAFではタスク・フロー・コンポーネントをダイアグラマにドラッグしてタスク・フローを宣言的に作成できます。MAFには、バインド・タスク・フローとバインドなしタスク・フローという2種類のタスク・フローがあり、バインド・タスク・フローにはWorkBetterサンプル・アプリケーションのListページのような単一のエントリ・ポイントが含まれ、バインドなしタスク・フローにはアプリケーション・フローとなる複数のエントリ・ポイントが含まれることがあります。WorkBetterサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリのPublicSamples.zipファイル内にあります。

図2-6 MAFタスク・フロー

図2-7に、MAFタスク・フロー、AMXページ、MAFページ・フラグメントと呼ばれるMAF AMXページの再利用可能な部分、およびアプリケーション機能を追加するためにMAFに提供されているウィザードを示します。これらのウィザードにアクセスするには、「アプリケーション」ウィンドウでビュー・コントローラ・プロジェクトまたはアプリケーション・コントローラ・プロジェクトを選択して、「ファイル」→「新規」を選択します。「クライアント層」内の「モバイル・アプリケーション・フレームワーク」を選択した後、いずれかのウィザードを選択します。

図2-7 アプリケーション機能のリソースを作成するウィザード

2.6.1 MAF AMXページの作成方法

MAF AMXページ・ウィザードを使用して、アプリケーション機能のユーザー・インタフェースに使用されるAMXページや、MAFアプリケーションを構成するアプリケーション機能の間で共有可能なアプリケーション・レベルのリソース(ログイン・ページなど)として使用されるAMXページを作成できます。アプリケーション機能コンテンツの詳細は、第5章「MAFアプリケーション機能のコンテンツ・タイプの定義」を参照してください。

アプリケーション機能のコンテンツとしてMAF AMXページを作成するには:

1. 「アプリケーション」ウィンドウで、ビュー・コントローラ・プロジェクトを右クリックします。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAF AMXページ」を選択して、「OK」をクリックします。

4. 「ファイル名」フィールドに名前を入力して、「MAF AMXページの作成」ダイアログの入力を完了します(図2-8を参照)。「ディレクトリ」フィールドに、ファイルの場所を入力します。この場所は、ビュー・コントローラ・プロジェクトのpublic_htmlフォルダ内である必要があります。

図2-8 ビュー・コントローラ・プロジェクト内でのMAF AMXページの作成

5. 「パネル・ページ」内で、ヘッダーおよびフッターの作成に使用する「ファセット」を選択(または選択解除)します。「OK」をクリックします。
詳細は、第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

6. MAF AMXページを作成します。AMXコンポーネントの使用方法の詳細は、第12.3.1.2項「MAF AMXページの作成」を参照してください。第5.3項「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」も参照してください。

MAF AMXアプリケーションに対するリソースとしてMAF AMXページを作成するには:

1. 「アプリケーション」ウィンドウで、アプリケーション・コントローラ・プロジェクトを選択します。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAF AMXページ」を選択して、「OK」をクリックします。

4. 「ファイル名」フィールドに名前を入力して、「MAF AMXページの作成」ダイアログの入力を完了します(図2-9を参照)。「ディレクトリ」フィールドに、ファイルの場所を入力します。この場所は、アプリケーション・コントローラ・プロジェクトのpublic_htmlフォルダ内である必要があります。「OK」をクリックします。

図2-9 アプリケーション・コントローラ・プロジェクト内でのMAF AMXページの作成

5. MAF AMXページを作成します。詳細は、第12.3.1.2項「MAF AMXページの作成」を参照してください。

2.6.2 MAFタスク・フローの作成方法

アプリケーション機能のコンテンツをMAFタスク・フローとして配信できます。

アプリケーション機能のコンテンツとしてMAFタスク・フローを作成するには:

1. 「アプリケーション」ウィンドウで、ビュー・コントローラ・プロジェクトを選択します。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAFタスク・フロー」を選択して、「OK」をクリックします。

4. 「ファイル名」フィールドに名前を入力して、「MAFタスク・フローの作成」ダイアログの入力を完了します(図2-10を参照)。「ディレクトリ」フィールドに、ファイルの場所を入力します。この場所は、ビュー・コントローラ・プロジェクトのpublic_htmlフォルダ内である必要があります。「OK」をクリックします。

図2-10 ビュー・コントローラ・プロジェクト内でのMAFタスク・フローの作成

5. タスク・フローを構築します。第12.2項「タスク・フローの作成」も参照してください。

2.6.3 MAF AMXページおよびタスク・フローの作成時に行われる処理

JDeveloperは、MAF AMXページとタスク・フローを、ビュー・コントローラ・プロジェクトの「Webコンテンツ」ノードに配置します(図2-11のcustom_springboard.amxおよびViewController-task-flow.xmlを参照。これらは、このプロジェクト内で作成されるタスク・フローのデフォルト名です)。これらのアーティファクトはmaf-feature.xmlファイル内で参照されています。カスタマイズされたアプリケーション・スプラッシュ画面(または起動)イメージやナビゲーション・バー・イメージなどの他のリソースも「Webコンテンツ」ノードにあります。バインドなしタスク・フローを管理するために、JDeveloperではadfc-mobile-config.xmlファイルが生成されます。このファイルを使用して、ビュー(ユーザー・インタフェース・ページ)、様々なアクティビティ間の遷移を定義する制御ルール、タスク・フローのレンダリング・ロジックを管理するマネージドBeanなど、様々なタスク・フロー・コンポーネントを追加することにより、タスク・フローを宣言的に作成または更新できます。

図2-11 アプリケーション・コントローラ・プロジェクトおよびビュー・コントローラ・プロジェクト内のMAF AMXページとタスク・フロー

JDeveloperは、MAF AMXページとタスク・フローを、MAFアプリケーションに対するアプリケーション・リソースとして、アプリケーション・コントローラ・プロジェクトの「Webコンテンツ」ノードに配置します。図2-11に示すように、MAF AMXページ用のファイルはapplication_resource.amxという名前で、タスク・フローのファイルはApplicationController-task-flow.xmlという名前です(デフォルト名)。

2.7 エンタープライズ配布に対応するためのMAFアプリケーションのコンテナ化

デプロイ時に、MAFアプリケーションをOMSS (Oracle Mobile Security Suite)でラップしてOMSSのエンタープライズ・モバイル・アプリケーション管理機能を活用するように選択できます。OMSSを使用すると、優れたユーザー操作性を維持しつつ、社内のアプリケーションやデータにモバイル・デバイスから安全にアクセスできます。Mobile Security Containerでは、企業または個人が所有しているiOSやAndroidモバイル・デバイス上で、エンタープライズ・ワークスペースを作成します。従業員は、企業向けのセキュリティとシングル・サインオン認証を使用して、イントラネット、企業データおよびアプリケーションにシームレスにアクセスできます。

モバイル・セキュリティ・アプリケーション・コンテナ化ツールを使用すると、標準化されたセキュリティ・レイヤーをネイティブ・モバイル・アプリケーションに追加できます。コンテナ化プロセスはシンプルで、次のセキュリティ・サービスをアプリケーションに追加します。

- セキュアなデータ転送: エンタープライズ・ファイアウォールの背後にあるアプリケーション・バックエンド・リソースへのモバイル・セキュリティ・アクセス・サーバーを介した暗号化済AppTunnel。

- 認証: Secure Workspaceアプリケーションによって管理され、セキュア・ワークスペースの複数のアプリケーションにまたがって、シングル・サインオンを提供します。

- セキュアなデータ記憶域: ファイル、データベース、アプリケーション・キャッシュおよびユーザー・プリファレンスなどのアプリケーション・データの暗号化済記憶域。

- データ・リークの制御: 他の信頼できるアプリケーションに対してファイル共有とコピーおよび貼付けを制限する機能。これにより、電子メール、メッセージ送信、出力および保存などのデータ共有を制限できます。

- 動的ポリシー・エンジン: 認証頻度、ジオフェンスとタイム・フェンスおよびリモート・ロックとワイプなどの50を超える詳細なアプリケーション制御。

OMSSシングル・サインオン認証とMAFアプリケーション・サービスへのユーザー・アイデンティティの伝播は、ログイン接続にWeb SSO認証サーバー・タイプを使用するよう構成されているアプリケーションに対してのみサポートされます。コンテナ認証に成功した後、HTTP基本認証、OAuth認証またはMobile-Social認証を使用するアプリケーションでMAFアプリケーションにログインする必要があります。これらの認証タイプとOMSSでのその役割の詳細は、第29.5.13項「ログイン接続とコンテナ化されたMAFアプリケーションに関する必知事項」を参照してください。

コンテナ化の手順は単純で、コンテナ化によってMAFアプリケーションの開発工程が変わることはありません。実際、コンテナ化を考慮してアプリケーション・コードを特別に変更する必要はありません。MAFアプリケーションは、OMSSコンテナ化を有効にしてデプロイするかどうかに関係なく、同じように開発できます。

OMSSコンテナ化を有効にしてプリケーションをデプロイする場合、JDeveloperではOMSSが提供するモバイル・セキュリティ・アプリケーション・コンテナ化ツールを実行して、MAFアプリケーションをコンテナ化します。

デプロイ後、MAFアプリケーションの開発者はOMSSのシステム管理者と協力して、アプリケーションをOMSSモバイル・アプリケーション・カタログに追加し、適切なポリシーを構成します。詳細は、『Oracle Mobile Security Suiteの管理』のモバイル・アプリケーションの管理を参照してください。

ユーザーがコンテナ化されたMAFアプリケーションを起動すると、Secure WorkspaceアプリケーションがMobile Security Containerにリダイレクトし、そこでSSO認証を実行してから、セッションをMAFアプリケーションに戻します。コンテナ化されたMAFアプリケーションでは、内部Webサイトやサービスへの接続にVPNは必要ありません。かわりに、アプリケーションとモバイル・セキュリティ・アクセス・サーバー(MSAS)との間にセキュアなAppTunnelが構築され、これにより、モバイル・デバイス・ユーザーがアクセス登録した内部サイトおよびサービスへのアクセスにセキュアなトランスポートが提供されます。

OMSSコンテナ化がMAFアプリケーションにどのような影響を与えるかについては、次の各項を参照してください。

- OMSSでMAFアプリケーションをコンテナ化するためのJDeveloperの手順は、第27.9項「Oracle Mobile Security Suite (OMSS)でのデプロイ」を参照してください。

- 社内ファイアウォールの背後にあるセキュアなWebサービスへのアクセスの詳細は、第15.7.3項「Webサービスとコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項」を参照してください。

- コンテナ化されたMAFアプリケーションの認証プロセスの詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

モバイル・デバイスおよびワークスペース・コンテナに関連するOMSS管理タスクの詳細は、OMSSドキュメント・ライブラリで、次の一連のリソースを参照してください。

- OMSSのバックグラウンド情報は、『Oracle Mobile Security Suiteの管理』のOracle Mobile Security Suiteの理解を参照してください。

- システム管理者がOMSSモバイル・セキュリティ・マネージャのコンソールを使用して、MAFアプリケーション・ユーザーのモバイル・デバイスとワークスペースをエンロールする方法の詳細は、『Oracle Mobile Security Suiteの管理』のデバイスとワークスペースのエンロールを参照してください。

- システム管理者がOMSSモバイル・アプリケーション・カタログを使用して、デバイスとワークスペースにプロビジョニングされたMAFアプリケーションを管理する方法の詳細は、『Oracle Mobile Security Suiteの管理』のモバイル・アプリケーションの管理を参照してください。

- システム管理者がOMSSモバイル・セキュリティ・マネージャのコンソールを使用して、MAFアプリケーション機能によって共有されている社内ファイルへのアクセスを管理する方法の詳細は、『Oracle Mobile Security Suiteの管理』のモバイル・セキュリティ・ポリシーの管理を参照してください。

リソースの保護と認証に関連するMSAS管理タスクの詳細は、OMSSドキュメント・ライブラリで、次の一連のリソースを参照してください。

- MSASのバックグラウンド情報は、『Oracle Mobile Security Access Serverの管理』のモバイル・セキュリティ・アクセス・サーバーの開始を参照してください。

- システム管理者がプロキシ・アプリケーションを作成して、MAFアプリケーションがアクセスする保護されたリソースの転送プロキシURLを定義する方法の詳細は、『Oracle Mobile Security Access Serverの管理』のモバイル・セキュリティ・アクセス・サーバー・アプリケーションの管理を参照してください。

- システム管理者が事前定義済のセキュリティ・ポリシーを転送プロキシURLにアタッチし、保護されたWebサービスへのMAFアプリケーションによるアクセスを保護する方法の詳細は、『Oracle Mobile Security Access Serverの管理』のモバイル・セキュリティ・アクセス・サーバー・リソースの保護を参照してください。

- システム管理者がMSASの認証エンドポイントを構成し、Secure WorkspaceアプリケーションでMAFアプリケーション・ユーザーのモバイル・デバイスの認証が処理されるようにする方法の詳細は、『Oracle Mobile Security Access Serverの管理』のモバイル・セキュリティ・アクセス・サーバー・インスタンスの構成を参照してください。

3 MAFアプリケーションのコンテンツの構成

この章では、maf-application.xmlファイルとmaf-features.xmlファイルを構成して、MAFアプリケーションのアプリケーション名やMAFアプリケーションに含めるアプリケーション機能などの情報を定義する方法について説明します。

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

- 第3.1項「MAFアプリケーションの表示情報の構成の概要」

- 第3.2項「MAFアプリケーションの表示プロパティの設定」

- 第3.3項「アプリケーション機能の表示プロパティの設定」

3.1 MAFアプリケーションの表示情報の構成の概要

MAFアプリケーションのエンド・ユーザーに表示される表示情報を構成するには、maf-application.xmlファイルの概要エディタで値を設定します。アプリケーションに関して入力する情報の種類には、表示名、アプリケーションの説明、アプリケーションのバージョン番号などがあります。MAFアプリケーションに含めたり、他のMAFアプリケーションで使用するために配布したりする個々のアプリケーション機能には、同じような情報を入力できます。また、MAFアプリケーションのナビゲーション・バーやSpringboardへのレンダリング時にアプリケーション機能によって表示されるアイコンを指定することもできます。

3.2 MAFアプリケーションの表示プロパティの設定

図3-1は、maf-application.xmlファイルの概要エディタの「アプリケーション」ページを示したもので、このページではMAFアプリケーションの表示名やアプリケーションIDを設定します。

図3-1 MAFアプリケーションの基本情報の設定

MAFアプリケーションの基本情報を設定する手順:

1. 「アプリケーション」ページを選択します。

2. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開きます。

3. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

4. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「アプリケーション」ナビゲーション・タブをクリックします。

5. 「名前」フィールドに、アプリケーションの表示名を入力します。
アプリケーションをローカライズする場合は、リソース・バンドルから値を選択できます。詳細は、第6.1項「MAFアプリケーションのローカライズの概要」を参照してください。

注意:
MAFでは、このフィールドに入力した値をiOSアーカイブ(.ipaまたは.app)ファイルの名前として使用します。このファイルは、iOSデバイスまたはシミュレータにアプリケーションをデプロイすると作成されます。詳細は、第27.2.5項「iOSデプロイメント・プロファイルの作成方法」を参照してください。

6. 「ID」フィールドに、一意のIDを入力します。
名前の競合を避けるため、AndroidとiOSでは、リバース・パッケージ名が使用されます(例: com.company.application)。JDeveloperによって、アプリケーション名の前には、com.companyがリバースパッケージとして付加されますが、この値は別の値で上書きできます。ただし、上書きする値は一意で、iOSとAndroidの両方のデバイスのIDガイドラインを順守するものでなくてはなりません。iOSアプリケーションについては、『iOS Team Administration Guide』 (http://developer.apple.com/library/iosのiOS Developer Libraryで入手可能)の「Creating and Configuring App IDs」を参照してください。Androidについては、Android開発者のWebサイト(http://developer.android.com/guide/topics/manifest/manifest-intro.html)で入手可能な「The AndroidManifest.xml File」を参照してください。第27.2.4項「Androidデプロイメント・プロファイルの作成方法」および第27.2.5項「iOSデプロイメント・プロファイルの作成方法」で説明するように、このIDはデプロイメント・プロファイル内で上書きできます。

注意:
Androidデバイスまたはエミュレータにアプリケーションが正しくデプロイされるようにするには、IDの先頭を数字やピリオドではなく、文字にする必要があります。たとえば、IDが925090のように(com.company.925090)完全に数値で構成されている場合はデプロイに失敗します。hello925090 (com.company.hello925090)のように先頭が文字列のIDは正常にデプロイされます。

7. 「説明」フィールドで、アプリケーション関する説明を入力します。

8. 「バージョン」フィールドに、バージョンを入力します。

9. 「ベンダー」フィールドに、このアプリケーションを最初に作成したベンダーの名前を入力します。

10. 「ライフサイクル・イベント・リスナー」フィールドで、MAFアプリケーションのライフサイクル・イベントに応じて実行されるコードが記述されたクラスを入力します。新規作成したMAFアプリケーションには、デフォルトでapplication.LifeCycleListenerImplが指定されます。
詳細は、第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

3.3 アプリケーション機能の表示プロパティの設定

各MAFアプリケーションには、少なくとも1つのアプリケーション機能が必要です。アプリケーション機能はそれぞれ別個に(MAFアプリケーション自体からも独立して)開発できます。maf-feature.xmlファイルの概要エディタでは、<adfmf:features>の子要素を定義して、アプリケーション機能ごとにそれぞれの名前とIDを割り当て、コンテンツの実装方法を設定することで、アプリケーション機能を区別できます。アプリケーション機能の概要エディタを使用すると、MAFアプリケーション内のアプリケーション機能のランタイム表示を制御したり、アプリケーション機能がユーザー認証を必要とするタイミングを指定することもできます。

図3-2に、WorkBetterサンプル・アプリケーションで使用される人々アプリケーション機能の概要エディタの「一般」タブを示します。このタブを使用して、アプリケーション機能の名前や、Springboardとナビゲーション・バーに表示されるアイコンなどの情報を指定します。

図3-2 maf-feature.xmlファイル内のアプリケーション機能の「一般」タブ

始める前に

アプリケーション機能で、MAFによって提供されるデフォルト・イメージではなく、ナビゲーション・バーやSpringboardのカスタム・イメージを使用する場合、これらのイメージは、Android開発者のWebサイト(http://developer.android.com/design/style/iconography.html)および、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手できる『iOS Human Interface Guidelines』の「Custom Icon and Image Creation Guidelines」の章に示されている仕様に従って作成する必要があります。

これらのイメージは、ビュー・コントローラ・プロジェクトのpublic_htmlディレクトリに配置します。第5.4項「外部リソースの選択に関する必知事項」も参照してください。

さらに、maf-feature.xmlファイルを開いて、「一般」タブを選択する必要があります。

アプリケーション機能の基本情報を設定するには:

1. 「一般」タブを選択します。

2. 「機能」セクションで「追加」アイコンをクリックします。

3. 「MAF機能の作成」ダイアログに必要な情報を入力し、「OK」をクリックします。
「MAF機能の作成」ダイアログに入力する手順:

- 「機能名」フィールドに、アプリケーション機能の表示名を入力します。

- 「機能ID」フィールドに、アプリケーション機能の一意の識別子を入力します。

- 必要に応じて、アプリケーション機能の場所を、public_htmlディレクトリ(デフォルトの親ディレクトリ)内の任意のディレクトリに変更します。この場所を「ディレクトリ」フィールドに入力します。

- 「対応する機能参照をmaf-application.xmlに追加」チェック・ボックスを選択し、新しく定義したアプリケーション機能をMAFアプリケーションに追加します。

4. (オプション)概要エディタの「一般」タブで、「ベンダー」フィールドに、アプリケーション機能を最初に作成したベンダーの名前を入力します。

5. (オプション)「バージョン」フィールドに、アプリケーション機能のバージョン番号を入力します。

6. (オプション)「説明」フィールドに、アプリケーションの目的の簡単な説明を入力します。

7. (オプション)「ライフサイクル・イベント・リスナー」の「クラスおよびパッケージ・ブラウザ」を使用して、完全修飾クラス名(oracle.adfmf.featureのようにパッケージを含む)を入力して、イベントを起動、停止、休止および休止から戻すためのランタイム・コールを有効にします。詳細は、第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

8. (オプション)「ナビゲーション・バー・アイコン」および「Springboardイメージ」フィールドで、ナビゲーション・バーのアイコンとして使用するイメージと、Springboardの表示アイコンとして使用するイメージを、プロジェクトから参照して選択します。「アプリケーション」ウィンドウから「ファイルの場所」フィールドにイメージ・ファイルをドラッグ・アンド・ドロップすることもできます。

4 アプリケーションのナビゲーションの構成

この章では、MAFアプリケーションのSpringboardとナビゲーション・バーを使用して、アプリケーションのナビゲーションを構成する方法について説明します。

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

- 第4.1項「MAFアプリケーションの表示動作の概要」

- 第4.2項「アプリケーションのナビゲーションの構成」

- 第4.3項「ナビゲーション・オプションの構成時の処理」

- 第4.4項「Springboardにアニメーションを設定する場合の処理」

- 第4.5項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」

- 第4.6項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」

- 第4.7項「Springboardの実行時の動作に関する必知事項」

- 第4.8項「MAFアプリケーションでのスライディング・ウィンドウの作成」

4.1 MAFアプリケーションの表示動作の概要

Springboardとナビゲーション・バーの表示動作を次のように制御するよう、MAFアプリケーションを構成できます。

- Springboardとナビゲーション・バーを表示または非表示にすることで、モバイル・デバイスのインタフェースを最適に使用できるようになります。これらのオプションは、ナビゲーション・バーのデフォルトの表示動作をオーバーライドします。ナビゲーション・バーは、アプリケーション機能によって別の状態に指定されていないかぎり、デフォルトで表示されます。

- Springboardを右からスライドできるようにします。デフォルトでは、Springboardは表示全体を占有せず、そのかわりに左からスライドして、アクティブ・コンテンツ(ナビゲーション・バーの「ホーム」ボタンとアプリケーション機能を含む)を右へプッシュします。

4.2 アプリケーションのナビゲーションの構成

「アプリケーション」ページの「ナビゲーション」のオプション(図4-1を参照)を使用して、ナビゲーション・バーを表示または非表示にしたり、アプリケーションによって使用されるSpringboardのタイプを選択したり、ユーザーがアプリケーションをめくるように見ていくときのSpringboardの反応方法を定義できます。

図4-1 「アプリケーション」ページの「ナビゲーション」のオプション

4.2.1 ナビゲーション・バーの表示動作の設定方法

MAFアプリケーションのデフォルトの動作では、アプリケーション起動時にナビゲーション・バーが表示されます。このデフォルトの動作は、maf-application.xmlファイルの概要エディタの「アプリケーション」ページで変更できます。

ナビゲーション・バーの表示動作を設定するには:

1. 「アプリケーションの起動時にナビゲーション・バーを表示」を選択して、MAFアプリケーションで、デフォルトで、Springboardではなくナビゲーション・バーが表示されるようにします(図4-2を参照)。

図4-2 デフォルトでナビゲーション・バーを表示

このオプションをオフにすると、アプリケーションの起動時にナビゲーション・バーが表示されなくなり、ユーザーにはSpringboardがナビゲーションの唯一の方法として提示されます。ナビゲーション・バーはSpringboardと同じ目的を果たすものなので、これを非表示にすることで冗長な機能を削除できる場合もあります。

2. 「ナビゲーション・バー・トグル・ボタンの表示」を選択して、選択したアプリケーション機能のコンテンツが表示されているときにはナビゲーション・バーを非表示にします。図4-3はこのオプションを示したもので、図4-2に示されているナビゲーション・バーを、アプリケーション機能のコンテンツによって非表示にする方法が示されています。

図4-3 ナビゲーション・バーを非表示

このオプションはデフォルトで選択されており、アプリケーション機能によって表示/非表示状態が指定されていなければ、ナビゲーション・バーはデフォルトで表示されます。

4.2.2 Springboardの表示動作の設定方法

デフォルトでは、MAFアプリケーションはアプリケーション起動時にSpringboardを表示しません。このデフォルトの動作は、maf-application.xmlファイルの概要エディタの「アプリケーション」ページで変更できます。

Springboardの表示動作を設定するには:

1. Springboardのタイプを選択します(存在する場合)。

- なし: アプリケーションにSpringboardを表示しない場合は、このオプションを選択します。

- デフォルト: MAFによって提供されるデフォルトのSpringboardを表示する場合に選択します。デフォルトのSpringboardは、MAF AMXページとして実装されます。詳細は、第4.6項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

- カスタム: カスタマイズされたSpringboardを使用する場合に選択します。たとえば、埋込みアプリケーション機能をグリッド・レイアウト・パターンに配置するカスタムSpringboardを作成したり、検索機能や共通タスク(「マイ・レポート」、マイ・リードなど)のリストなどのデータを含めることができます。HTMLページまたはMAFモバイルAMXページとして実装できるこのアプリケーションは、maf-feature.xmlファイル(ビュー・コントローラ・プロジェクト内にあります)内でアプリケーション機能として宣言されます。詳細は、第3.3項「アプリケーション機能の表示プロパティの設定」を参照してください。HTMLで記述されたカスタマイズ済Springboard内でナビゲーションを有効にする方法の詳細は、付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」を参照してください。

- 機能: Springboardとして使用するアプリケーション機能を選択します(図4-4を参照)。カスタムSpringboardの例は、APIDemoサンプル・アプリケーションを参照してください。詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

注意:
アプリケーション機能をカスタムSpringboardとして指定する場合、MAFのデザインタイムによって、「ナビゲーション・バーに表示」および「Springboardに表示」オプションをfalseに設定することが求められます。これにより、ページがユーザーによってナビゲーション・バーまたはSpringboardから起動されるアプリケーション機能としてではなく、カスタムSpringboardとして動作します。

図4-4 カスタムSpringboardとしてのアプリケーション機能の選択

2. 「アプリケーションの起動時にSpringboardを表示」を選択して、MAFアプリケーションの起動後にエンド・ユーザーに対してSpringboardを表示できるようにします。(このオプションは、「デフォルト」または「カスタム」オプションでのみ使用できます。)

3. 「Springboardトグル・ボタンの表示」を選択して、Springboardのボタンを表示できるようにします(図4-5を参照)。このボタンはアプリケーション機能内に表示されます。図4-2「デフォルトでナビゲーション・バーを表示」では、アプリケーション機能のコンテキスト内にこのボタンが表示されています。このオプションは、「デフォルト」または「カスタム」オプションでのみ使用できます。

図4-5 Springboardトグル・ボタン

4.2.3 Springboardのスライドアウト動作の設定方法

Springboardを使用するようにMAFアプリケーションを構成する場合、maf-application.xmlファイルの概要エディタの「アプリケーション」ページでSpringboardのスライドアウト動作を設定できます。

Springboardのスライドアウト動作を設定するには:

1. 「Springboardアニメーション」を選択して、「右にスライド」を選択します。Springboardは、「スライドアウト幅」オプションで入力したピクセル数値(またはパーセント)によって指定された領域を占有します。「なし」を選択した場合、Springboardは右からスライドできません(つまり、MAFではこのアクションを有効にするためのアニメーションが提供されません)。Springboardが表示領域全体を占有します。

注意:
スライドアウト・オプションは、Springboardの「カスタム」または「デフォルト」オプションを選択した場合のみ適用できます。

2. 幅を設定します(ピクセル単位)。iOSデバイスのSpringboardのデフォルト幅は320ピクセルです。Androidデバイスでは、デフォルトでSpringboardは画面全体を占有するので、使用可能な幅がすべて占有されます。

注意:
Springboardが表示領域全体を占有しない場合は、アクティブなアプリケーション機能が残りの表示領域を占有します。詳細は、第4.4項「Springboardにアニメーションを設定する場合の処理」を参照してください。

4.2.4 アプリケーション機能の表示順序の設定方法

maf-application.xml概要エディタの「機能参照」ページのアプリケーション機能の表示順序を設定します。

アプリケーション機能の表示順序を設定するには:

1. maf-application.xmlの概要エディタの「機能参照」ページをクリックします。

2. 上矢印と下矢印を使用して機能参照の表示順序を調整するか、「機能ID」列の行にあるドロップダウン・リストを使用して機能参照の順序を変更します。最上位のアプリケーション機能が、デフォルトのアプリケーション機能です。このアプリケーションのセキュリティ構成に応じて、MAFではユーザーが匿名でログインして保護されていないコンテンツを表示したり、ユーザーに認証資格証明を提供するように求めることができます。

注意:
「機能参照」表の最上位のIDが、MAFアプリケーション内で最初に表示されるアプリケーション機能です。たとえば、WorkBetterサンプル・アプリケーションのダッシュボード・アプリケーション機能を参照してください。

3. 「ナビゲーション・バーに表示」列および「Springboardに表示」列の行のドロップダウン・リストから、 「true」または「false」を選択することで、Springboardとナビゲーション・バーのアプリケーション機能に対する表示動作を設定します。図4-6は、アプリケーション機能がナビゲーション・バーに表示されなくなるオプションの選択状態を示しています。

ヒント:
アプリケーションによってカスタムSpringboardが使用される場合、またはアプリケーション機能がスライディング・ウィンドウとして表示される場合は、これらのオプションをfalseに設定します。

図4-6 ナビゲーション・オプションの変更

デフォルトでは、Springboardとナビゲーション・バーが表示されます(つまり、これらの属性はtrueに設定されます)。ナビゲーション・バーとSpringboardの両方の属性をfalseに設定すると、アプリケーション機能は最初の位置にある場合のみ表示されるようになります。

注意:
Springboardアプリケーションは、ナビゲーション・バー上またはMAFアプリケーションのSpringboard内には表示されないので、カスタムSpringboardアプリケーション機能として使用される機能参照については、「ナビゲーション・バーに表示」および「Springboardに表示」を両方ともfalseに設定する必要があります。

4.3 ナビゲーション・オプションの構成時の処理

Springboardおよびナビゲーション・バーのオプションを設定すると、adfmf:application.xmlファイルの<adfmf:navigation>要素に対して要素の更新や追加が行われます。たとえば、「なし」を選択すると、<springboard enabled="false">によってコードが更新されます(次の例を参照)。

<adfmf:application>
...
<adfmf:navigation>
<adfmf:navigationBar enabled="true"/>
<adfmf:springboard enabled="false"/>
</adfmf:navigation>
</adfmf:application>

ヒント:
デフォルトでは、ナビゲーション・バーは有効ですが、Springboardは有効ではありません。XMLを手動で更新すると、次のようにSpringboardを有効化できます。

<adfmf:application>
...
<adfmf:navigation>
<adfmf:springboard enabled="true"/>
</adfmf:navigation>
...
</adfmf:application>

例4-1は、デフォルトを選択したときに、enabled属性がtrueに設定される様子を示しています。

注意:
Springboardはデバイスの画面全体を占有するので、ナビゲーション・バーとSpringboardは同時には表示されません。

「カスタム」を選択して、Springboardとして使用するアプリケーション機能を選択すると、エディタでは<adfmf:navigation>要素(例4-2を参照)が移入されます。id属性は、maf-feature.xmlファイルで定義された、カスタムSpringboardとして使用するアプリケーション機能を指しています。

例4-1 デフォルトのSpringboardの表示の有効化

<adfmf:application>
...
<adfmf:navigation>
<adfmf:navigationBar enabled="true"/>
<adfmf:springboard enabled="true"/>
</adfmf:navigation>
</adfmf:application>

例4-2 カスタムSpringboardの構成

<adfmf:navigation>
<adfmf:springboard enabled="true">
<adfmf:springboardFeatureReference id="springboard"/>
</adfmf:springboard>
</adfmf:navigation>

4.4 Springboardにアニメーションを設定する場合の処理

例4-3は、maf-application.xmlファイルのナビゲーション・ブロックを示しており、ここでは、Springboardはスライドアウトし、指定された表示領域(213ピクセル)を占有するように設定されています。

次の行ではアニメーションを無効にしています。

<adfmf:springboard enabled="true" animation="none"/>

次の行では、Springboardが表示領域の左から100ピクセル分を占有するように設定し、アクティブなアプリケーション機能が表示領域の残りの部分を占有できるようにしています。

<adfmf:springboard enabled="true" animation="slideright" width="100px"/>

アニメーション以外に、例4-3は次の処理を示しています。

- showSpringboardAtStartup属性の使用。アプリケーションの起動時にSpringboardを表示するかどうかを定義します。(デフォルトでは、Springboardは表示されます。)

- navigationBarのdisplayHideShowNavigationBarControl属性の使用。

Springboardが表示されないようにするには、enabled属性をfalseに設定します。

例4-3 Springboardアニメーションの構成

<adfmf:navigation>
<adfmf:navigationBar enabled="true"
displayHideShowNavigationBarControl="true"/>
<!-- default interpretation of width is pixels -->
<adfmf:springboard enabled="true"
animation="slideright"
width="213"
showSpringbaordAtStartup="true"/>
</adfmf:navigation>

4.5 HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項

MAFによって提供されるデフォルトのHTML Springboardページでは、次のテクノロジが使用されています。これらは、カスタマイズしたログイン・ページに含めることもできます。

- CSS: 色およびレイアウトを定義します。

- JavaScript: Springboardページ内に埋め込まれた<script>タグには、付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」で説明するメソッド(Apache Cordova APIをコールする)への参照が格納されています。また、HTMLページはJavaScriptを使用して、コールバックに応答したり、ページ・スワイプを検出します。スワイプ・イベントが検出されたら、JavaScriptでは、スタイル・シートの動的変更によってページ・モーションをアニメートできるようになります。
HTML(または任意のカスタムHTMLページ)を使用して作成されたSpringboardでは、base.jsライブラリを参照する<script>タグを含めることによって、Apache Cordova APIを活用できます。このライブラリ(または他のJavaScriptライブラリ)の場所を特定するには、まずMAFアプリケーションをデプロイした後、deployディレクトリに格納されたプラットフォーム固有のアーティファクト内にあるwww/jsディレクトリを探します。Androidアプリケーションの場合、www/jsディレクトリは、Androidアプリケーション・パッケージ(.apk)ファイル内にあります。その場所を次に示します。

application workspace directory/deploy/deployment profile name/deployment profile name.apk/assets/www/js

iOSの場合、このライブラリは次の場所にあります。

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/js

詳細は、第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」を参照してください。

- WebKit: レイアウト間および異なるSpringboardページ間での遷移時に、アイコンのなめらかなアニメーションが提供されます。WebKitレンダリング・エンジンの詳細は、http://www.webkit.org/を参照してください。

HTMLで記述されるSpringboardは、maf-feature.xmlファイルで宣言され、maf-application.xmlファイルで参照されるアプリケーション機能です。

4.6 MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項

HTMLの場合と同様に、MAF AMXを使用して記述されたSpringboardは、MAFアプリケーションによって参照されるアプリケーション機能です。通常、Springboardはタスク・フローではなく単一のMAF AMXページとして記述されるため、埋込みアプリケーション機能の起動には、gotoFeatureメソッドが使用されます。

注意:
カスタムSpringboardページ(HTMLまたはMAF AMXによって作成されたもの)は、ビュー・コントローラ・プロジェクト内に配置する必要があります。ビュー・コントローラ・プロジェクト内にはmaf-feature.xmlファイルも格納されています。

デフォルトのSpringboard (jdev_install\jdeveloper\jdev\extensions\oracle.maf\libにあるadfmf.default.springboard.jar)は、MAF AMXページであり、機能アーカイブ(FAR) JARファイルにバンドルされ、MAFアプリケーションに含まれる別のFARとともにデプロイされます。JARファイルには、DataBindings.cpxファイルやPageDef.xmlファイルなど、Springboardに関連付けられたすべてのアーティファクトが含まれます。このファイルは、maf-application.xmlファイルのSpringboardオプションで「デフォルト」が選択された後のみ使用できます。このオプションを選択すると、このFARもアプリケーション・クラスパスに追加されます。詳細は、第27.5項「機能アーカイブ・ファイル(FAR)のデプロイ」を参照してください。

デフォルトのSpringboard (次の例に示すspringboard.amx)は、MAF AMXアプリケーション機能として実装されます。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="#{bindings.name.inputValue}" id="ot3"/>
</amx:facet>
<amx:listView var="row"
value="#{bindings.features.collectionModel}"
fetchSize="#{bindings.features.rangeSize}"
id="lv1"
styleClass="amx-springboard">
<amx:listItem showLinkIcon="false"
id="li1"
actionListener="#{bindings.gotoFeature.execute}">
<amx:tableLayout id="tl1"
width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf11"
width="46px"
halign="center">
<amx:image source="#{row.image}"
id="i1"
inlineStyle="width:36px;height:36px"/>
</amx:cellFormat>
<amx:cellFormat id="cf12"
width="100%"
height="43px">
<amx:outputText value="#{row.name}"
id="ot2"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
<amx:setPropertyListener from="#{row.id}"
to="#{pageFlowScope.FeatureId}"/>
</amx:listItem>
</amx:listView>
</amx:panelPage>
</amx:view>

図4-7に示すように、MAF AMXファイルでは、リスト・アイテムがMAFアプリケーションの埋込みアプリケーション機能であるリスト・ビューを使用してSpringboardを定義します。これらのアプリケーション機能は、デプロイ後は、名前と関連アイコンによって表示されます。AdfmfContainerUtilities APIのgotoFeatureメソッドでは、ページのナビゲーション機能が提供されます。このメソッドを使用した特定のアプリケーション機能の表示の詳細は、第B.2.5項「gotoFeature」を参照してください。また、第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」も参照してください。

図4-7 デフォルトのSpringboard

MAFでは、ApplicationFeaturesデータ・コントロール内にカスタムSpringboardを作成(またはデフォルトのSpringboardを拡張)するための基本ツールが提供されています。このデータ・コントロール(図4-8を参照)により、MAFアプリケーションとそのアプリケーション機能の両方を記述する属性のデータ・コレクションを使用して、Springboardページを宣言的に構築できます。カスタムSpringboardページの例は、APIDemoサンプル・アプリケーションを参照してください。このアプリケーション(およびMAFに付属の他のサンプル)の詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

図4-8 ApplicationFeaturesデータ・コントロール

ApplicationFeaturesデータ・コントロールでは、次のパッケージのAdfmfContainerUtilitiesクラスによって提供される、MAFアプリケーションにナビゲーションを実装するメソッドを公開します。

oracle.adfmf.framework.api

表4-1に、ApplicationFeaturesデータ・コントロールからドラッグしてMAF AMXページ上にドロップ可能な、MAFアプリケーションのナビゲーションに対応したメソッドをいくつか示します。

データ・コントロールの使用方法の詳細は、第14章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」を参照してください。AdfmfContainerUtilitiesクラスの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

表4-1 アプリケーション機能メソッド

メソッド

説明

gotoDefaultFeature

デフォルトのアプリケーション機能に移動します。

gotoFeature

このメソッドに渡されたパラメータによって指定される特定のアプリケーションに移動します。

gotoPreferences

プリファレンス・ページに移動します。

gotoSpringboard

Springboardに移動します。

hideNavigationbar

ナビゲーション・バーを非表示にします。

showNavigationbar

ナビゲーション・バーを表示します(非表示になっている場合)。

resetFeature

このメソッドに渡されたパラメータによって指定されるアプリケーション機能をリセットします。

hideSpringboard

Springboardを非表示にします。

showSpringboard

Springboardを表示します。

4.7 Springboardの実行時の動作に関する必知事項

「アプリケーションの起動時にSpringboardを表示」オプションを選択して、スライドアウト幅を画面の最大サイズに定義すると、MAFでは、起動時にバックグラウンドでデフォルトのアプリケーション機能がロードされます。MAFアプリケーションが休止している場合、MAFはSpringboardを非表示にします。

4.8 MAFアプリケーションでのスライディング・ウィンドウの作成

アプリケーション機能をスライディング・ウィンドウとしてレンダリングできます。これにより、ナビゲーション・バーまたはSpringboard内に表示される他のアプリケーション機能と同時にアプリケーション機能が表示されます。スライディング・ウィンドウは、アプリケーション内に常に存在しているコンテンツ(グローバル・ツール・バーなど)を表示するために使用したり、一時的な(ポップアップ)コンテンツ(ヘルプ・ウィンドウなど)を表示するために使用できます。

図4-9は、SlidingWindowサンプル・アプリケーションのSlidingDrawerアプリケーション機能を示しています(第G項「サンプルのMAFアプリケーション」を参照)。このアプリケーション機能は、他のアプリケーション機能に重なりながら、アプリケーション画面の右側に表示されます。

図4-9 他のアプリケーション機能に重なるスライディング・ウィンドウ

アプリケーション機能をスライディング・ウィンドウとしてレンダリングする場合、Show on Navigation BarプロパティおよびShow on Springboardプロパティをfalseに設定する必要があります。

スライディング・ウィンドウを作成するには、oracle.adfmf.framework.api.AdfmfSlidingWindowOptionsクラスとAdfmfSlidingWindowUtilitiesクラスの組合せを、アプリケーション内のマネージドBeanまたはライフサイクル・リスナーから起動します。

次の例は、SlidingWindowサンプル・アプリケーションで、LifeCycleListenerImpl.javaのactivateメソッドから、図4-9に示すスライディング・ウィンドウを作成する方法を示しています。スライディング・ウィンドウの作成後、SlidingWindowサンプル・アプリケーションではSlidingDrawerBean.javaを使用してスライディング・ウィンドウの表示を管理します。

...
public void activate()  {
// The argument you pass to the create method is the refId of the
// feature in the maf-application.xml. For example,
// <adfmf:featureReference id="fr4" refId="SlidingDrawer" showOnNavigationBar="false"
// showOnSpringboard="false"/>
String slidingWindowDrawer = AdfmfSlidingWindowUtilities.create("SlidingDrawer");

// Note also that both showOn... values must be set to false in the config
// file for the sliding window to appear

SlidingDrawerBean.slidingDrawerWindow=slidingWindowDrawer;
AdfmfSlidingWindowOptions options = new AdfmfSlidingWindowOptions();
options.setDirection(AdfmfSlidingWindowOptions.DIRECTION_RIGHT);
options.setStyle(AdfmfSlidingWindowOptions.STYLE_OVERLAID);
options.setSize("0");

}

ここで説明しているSlidingWindowサンプル・アプリケーション全体にアクセスする方法は、第G項「サンプルのMAFアプリケーション」を参照してください。

AdfmfSlidingWindowUtilitiesおよびAdfmfSlidingWindowOptionsの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework用のJava APIリファレンスを参照してください。ライフサイクル・リスナーの使用方法の詳細は、第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

5 MAFアプリケーション機能のコンテンツ・タイプの定義

この章では、MAFアプリケーションのアプリケーション機能で使用可能なコンテンツ・タイプの概要と、アプリケーション機能でサポートされている各コンテンツ・タイプの作成方法について説明します。

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

- 第5.1項「アプリケーション機能のコンテンツ・タイプの概要」

- 第5.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」

- 第5.3項「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」

- 第5.4項「外部リソースの選択に関する必知事項」

5.1 アプリケーション機能のコンテンツ・タイプの概要

アプリケーション機能のコンテンツ・タイプには、ユーザー・インタフェースの形式が記述されます。このコンテンツ・タイプは、MAF AMXコンポーネントまたはHTML(5)タグを使用して構成できます。また、アプリケーション機能では、モバイル・コンテキストに適したコンテンツを含む、リモートでホストされたページから、自身のコンテンツを導出することもできます。このようなWebページとして考えられるのは、スマートフォン向けのApache Trinidadで作成されたJavaServerページや、タブレット・デバイス上で実行されるアプリケーション向けのADF Facesコンポーネントから構成されたページです。MAFアプリケーションに埋め込まれた各アプリケーション機能では、様々なコンテンツ・タイプを保持できます。

MAFアプリケーションには、様々なコンテンツ・タイプを持つアプリケーション機能が含まれますが、アプリケーション機能自体も、ユーザーおよびデバイス固有の要件に応じた様々なコンテンツ・タイプを保持する場合があります。アプリケーション機能によって、様々なコンテンツ・タイプがどのように提供されるかについては、第22章「アプリケーション機能に対する制約の設定」を参照してください。例5-1のように、子要素を<adfmf:content>要素に追加すると、アプリケーション機能にユーザー・インタフェースをどのように実装するかを定義できます。

概要エディタの「コンテンツ」タブ(図5-1を参照)には、例5-1に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。このタブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できる制約を設定できます。

各コンテンツ・タイプには、独自のパラメータ・セットがあります。たとえば、図5-1に示すように、MAF AMXコンテンツとして実装するアプリケーション機能のMAF AMXページまたはタスク・フローの場所を指定する必要があります。さらにオプションで、アプリケーション機能に他のアプリケーション機能(またはMAFアプリケーション自体)とは異なるルック・アンド・フィールを設定するCSSファイルを選択したり、MAF AMXコンポーネントのアクションを制御するJavaScriptファイルを選択することもできます。

図5-1 アプリケーション機能の実装の定義

例5-1 <adfmf:content>要素

<adfmf:content id="Feature1">
<adfmf:amx file="FeatureContent.amx">
</adfmf:content>

5.2 アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法

概要エディタの「コンテンツ」タブ(図5-1を参照)には、例5-1に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。このタブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できる制約を設定できます。

始める前に

各コンテンツ・タイプには、次のような独自の前提条件があります。

- リモートURL: Webアプリケーションへの参照。既存のWebアプリケーションをモバイル用に拡張し、さらにデバイス・サービスを拡張できます。リモート・コンテンツでは、ローカル・データ・キャッシュや、サーバー側データおよび機能の一式を提供することによって、MAF AMXおよびローカルHTMLコンテンツの両方を補完できます。リモートURL実装には、有効なWebアドレスが必要です。詳細は、第20章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

- ローカルHTML: MAFアプリケーション内にパッケージ化されたHTMLページを参照します。HelloWorldサンプル・アプリケーション(付録G「サンプルのMAFアプリケーション」を参照)で示したようなHTMLページでJavaScriptを参照できます。MAFがアプリケーション機能の実装に最適ではない場合、このコンテンツ・タイプを使用し、Cordova JavaScript APIを使用してアプリケーション機能を実装することを検討してください。JavaScript APIおよびMAFの詳細は、付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」を参照してください。

アプリケーション・コンテンツをリモートURLまたはローカルHTMLとして定義するには:

1. maf-feature.xmlファイルの「機能」表にリストされているアプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 「追加」をクリックして、「コンテンツ」表に新しい行を作成します。

4. 次のいずれかのコンテンツ・タイプで、生成されたIDに対応するものを選択します。

- リモートURL

- ローカルHTML

5. コンテンツ固有のパラメータを定義します。

- リモートURLコンテンツの場合は、図5-2のように接続を選択します。これは、サーバー上のWebページのアドレス(および起動ページの場所)を表しています。

図5-2 ホスト・アプリケーションの接続の選択

この接続を作成するには、まず「追加」をクリックして、次に「URL接続の作成」ダイアログに入力します(図5-3を参照)。このダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。この接続は、connections.xmlファイルに格納されます。

注意:
この接続は、アプリケーション・リソースとしてのみ作成できます。

図5-3 URL接続の作成

- ローカルHTMLコンテンツの場合は、ローカル・バンドルの場所を入力します。または、「URL」フィールドで「追加」をクリックし、図5-4に示すダイアログに入力して、JDeveloperのHTMLエディタを使用してページを構築することで、HTMLページを作成します。これはアプリケーション機能なので、このページはビュー・コントローラ・プロジェクトのWeb Contentフォルダに格納されます。

図5-4 アプリケーション機能のコンテンツとしてのローカルHTMLページの作成

6. 必要に応じて、次の手順を実行します。

- このコンテンツをユーザーが使用できるようになるための条件を示す制約を入力します。詳細は、第22章「アプリケーション機能に関する制約の設定」を参照してください。

- ナビゲーション・バーとSpringboardのイメージを選択します。

5.3 アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法

概要エディタの「コンテンツ」タブ(図5-1を参照)には、例5-1に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。このタブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できる制約を設定できます。

始める前に

各コンテンツ・タイプには、次のような独自の前提条件があります。

- MAF AMX: アプリケーション機能に対するデフォルトのコンテンツ・タイプ。MAF AMXページの詳細は、第12章「MAF AMXページの作成」を参照してください。
MAF AMXとして実装されるアプリケーション機能には、ビュー(単一のMAF AMXページ)か、バインド・タスク・フローまたはバインドなしタスク・フローが必要です。JavaScriptファイルを追加すると、MAF AMXコンポーネントに対するレンダリング・ロジックが提供されるか、既存のレンダリング・ロジックがオーバーライドされます。アプリケーション機能に対するカスタムのルック・アンド・フィールを指定するセレクタを持つスタイル・シート(CSS)を含めます。これは、MAFアプリケーション・レベルで定義されたスタイル(アプリケーション機能にデフォルトで使用されるスタイル)をオーバーライドします。つまり、アプリケーション機能全体で確実に独自のルック・アンド・フィールを持つようになります。

MAF AMXページとこれらを格納するMAFアプリケーションは、両方とも「新規ギャラリ」のウィザードを使用して作成できます。これらのウィザードにアクセスするには、まず「アプリケーション」ウィンドウでビュー・コントローラ・プロジェクトを強調表示してから、次に「新規」を選択します。

注意:
maf-feature.xmlファイル内にある、タスク・フロー、MAF AMXページ、CSSおよびJavaScriptファイルへの参照を手動で編集する場合、デバイスで使用されているファイル・システムによって大文字と小文字が区別され、特殊文字が許可されない可能性があることに注意してください。これらのファイルを確実に参照できるようにするには、モバイル・デバイスの仕様を確認してください。

- MAFタスク・フロー: アプリケーション機能の制御フローの定義にモジュール型アプローチを提供します。タスク・フローを使用して、1つのタスクを構成する一連のアクティビティを定義します。タスク・フローに含めることのできるアクティビティには、ビュー(MAF AMXページの表示に使用)、メソッド・コール(マネージドBeanのメソッドの起動に使用)、タスク・フロー・コール(別のタスク・フローのコールに使用)などがあります。タスク・フローの詳細は、第12.2項「タスク・フローの作成」を参照してください。

MAF AMXページまたはタスク・フローをアプリケーション機能のコンテンツとして使用する手順:

1. アプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 必要に応じて、「追加」をクリックして「コンテンツ」表に行を作成し、「タイプ」列のドロップダウン・リストから「MAF AMXページ」または「MAFタスク・フロー」を選択します(次の図を参照)。

図5-5 「MAF AMXページ」または「MAFタスク・フロー」をコンテンツ・タイプとして選択

4. 「ファイル」フィールドで、該当するオプションを選択します。

- MAF AMXページまたはタスク・フローを作成済の場合は、「参照」アイコンをクリックしてページまたはタスクの場所を選択します。

- 新しいMAF AMXページを作成するには、「追加」アイコンをクリックして、新しいMAF AMXページまたはタスク・フローの作成が可能なダイアログを起動します。

5. 必要に応じて、次の手順を実行します。

- 「包含」表で「追加」をクリックしてJavaScriptファイルを入力し、「JavaScript」を選択し、ファイルの場所を参照します。詳細は、第7.7項「デフォルト・スキン・スタイルのオーバーライド」を参照してください。

- 最初に「追加」をクリックして、次に「スタイルシート」を選択することで、maf-config.xmlで指定されているデフォルトのスタイルシートをオーバーライドします。ファイルの場所を参照します。詳細は、第7章「MAFアプリケーションのスキニング」を参照してください。

- 制約を入力します(第22章「アプリケーション機能に関する制約の設定」を参照)。

- ナビゲーション・バーとSpringboardのイメージを選択します。

注意:
イメージ、スタイルシートおよびJavaScriptファイルは、デプロイ可能にするために、public_htmlフォルダ内に配置する必要があります。第5.4項「外部リソースの選択に関する必知事項」を参照してください。

5.4 外部リソースの選択に関する必知事項

デプロイメントを可能にするために、次の属性によって参照されるすべてのリソースは、ビュー・コントローラ・プロジェクトのpublic_htmlディレクトリ内に配置する必要があります。

- <adfmf:feature>のiconおよびimage属性(例: <adfmf:feature id="PROD" name="Products" icon="feature_icon.png" image="springboard.png">)。第3.3項「アプリケーション機能の表示プロパティの設定」も参照してください。

- <adfmf:content>のiconおよびimage属性(例: <adfmf:content id="PROD" icon="feature_icon.png" image="springboard_image.png">)。第5.1項「アプリケーション機能のコンテンツ・タイプの概要」も参照してください。

- <adfmf:amx>のfile属性(例: <adfmf:amx file="PRODUCT/home.amx" />)。第5.1項「アプリケーション機能のコンテンツ・タイプの概要」も参照してください。

- <adfmf: localHTML>のurl属性(例: <adfmf:localHTML url="oracle.hello/index.html"/>)。第5.1項「アプリケーション機能のコンテンツ・タイプの概要」および第29.6.4.2項「カスタム・ログイン・ページ」も参照してください。

- <adfmf:includes>のtype=stylesheetおよびtype=JavaScriptに対して定義するファイル属性(例: <adfmf:include type="JavaScript" file="myotherfile.js"/>または<adfmf:include type="StyleSheet" file="resources/css/stylesheet.css" id="i3"/>)。第7章「MAFアプリケーションのスキニング」も参照してください。

MAFは、別の場所から参照されるリソースをサポートしていません。つまり、たとえば、../を接頭辞として使用して、public_htmlディレクトリ外部に値を入力することはできません。public_html外部のリソースを参照しないようにする安全策として、MAFには、「ファイルがpublic_htmlディレクトリにありません」と呼ばれる監査ルールが含まれています。MAFの監査プロファイル(図5-6を参照)には、「ツール」→「プリファレンス」→「監査」→「プロファイル」と選択することで、「プリファレンス」の「監査」の下の「プロファイル」ノードからアクセスできます。

図5-6 MAFの監査プロファイル

このプロファイルを選択した場合、リソースの場所を変更すると、JDeveloperによって警告が発行されます。図5-7に示すように、デフォルト値がオーバーライドされると、JDeveloperはこうした警告を表示します。監査の詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発の「Javaプロジェクトの監査とモニタリング」の章を参照してください。

図5-7 外部リソースの警告

6 MAFアプリケーションのローカライズ

この章では、複数の言語を使用するデバイスでMAFアプリケーションを実行する場合にレンダリングするテキストおよびイメージ・リソースを定義できるリソース・バンドルの使用方法について説明します。この章では、リソース・バンドルを作成および編集するためにJDeveloperが提供する設計時サポートについても説明します。

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

- 第6.1項「MAFアプリケーションのローカライズの概要」

- 第6.2項「MAFアプリケーションのリソース・バンドル・オプションの設定」

- 第6.3項「ベース・リソース・バンドルでのテキスト・リソースの定義」

- 第6.4項「ロケール固有のリソース・バンドルの作成」

- 第6.5項「リソース・バンドルのリソースの編集」

- 第6.6項「MAFアプリケーションのイメージ・ファイルのローカライズ」

- 第6.7項「ローカライズ可能なMAFプロパティ」

6.1 MAFアプリケーションのローカライズの概要

ローカライズは、アプリケーションを1つ以上のロケールで使用可能にするプロセスです。モバイル・アプリケーションの場合、これは一般にユーザーが使用しているモバイル・デバイスと同じ言語でMAFアプリケーションを使用することを意味します。たとえば、ユーザーのデバイスでデバイス言語としてフランス語が設定されている場合、ローカライズされたMAFアプリケーションのテキスト・リソースはフランス語で表示されます。

MAFは、1つ以上のリソース・バンドルのユーザー・インタフェースに表示されるテキスト・リソースを定義できるようにする設計時メニューを提供することで、ローカライズ・プロセスを促進します。MAFアプリケーションのテキスト・リソースはベース・リソース・バンドルで定義します。アプリケーションにデバイスのロケールに固有のリソース・バンドルが含まれない場合、これらのテキスト・リソースは、ユーザーのデバイス上のアプリケーションのユーザー・インタフェースでレンダリングされます。その後、サポートするロケールごとにロケール固有のリソース・バンドルを作成します。これらのロケール固有リソース・バンドルでは、ベース・リソース・バンドルで定義したテキスト・リソースの翻訳を提供します。

図6-1に、アプリケーションでcommandButtonおよびoutputTextコンポーネントをレンダリングする例を示します。コンポーネントに表示されるテキストおよびイメージ・リソースは、モバイル・デバイスの言語設定によって異なります。左側では、リソース・バンドルに英語の値を持つテキスト・リソースが含まれ、アプリケーションが実行されるデバイスでは英語(またはフランス語以外の言語)が使用されるため、コンポーネントはテキスト・リソースを英語でレンダリングします。右側では、ベース・リソース・バンドルに値の翻訳を含むロケール固有のリソース・バンドル(_fr)がMAFアプリケーションに含まれ、モバイル・デバイスの言語設定はフランス語であるため、同じコンポーネントがテキスト・リソースをフランス語でレンダリングします。

図6-1 ローカライズされたテキスト・リソース

MAFアプリケーションをローカライズする場合は、次のワークフローの使用を検討してください。

1. 第6.2項「MAFアプリケーションのリソース・バンドル・オプションの設定」の説明に従って、MAFアプリケーションのリソース・バンドル数を決定します。

2. ロケール固有のリソース・バンドルを提供しないロケールでMAFアプリケーションを実行する場合にレンダリングされるベース・リソース・バンドルのテキスト・リソースを定義します。
詳細は、第6.3項「ベース・リソース・バンドルでのテキスト・リソースの定義」を参照してください。

3. ベース・リソース・バンドルで定義したテキスト・リソースの翻訳を提供するロケール固有リソース・バンドルを作成します。
詳細は、第6.4項「ロケール固有のリソース・バンドルの作成」を参照してください。

4. MAFアプリケーションのローカライズを完了するために必要なイメージ・ファイルとその他のリソースのロケール固有バージョンを作成します。
詳細は、第6.6項「MAFアプリケーションのイメージ・ファイルのローカライズ」を参照してください。

6.2 MAFアプリケーションのリソース・バンドル・オプションの設定

MAFアプリケーションのリソース・バンドルでは、XMLローカリゼーション・ファイル形式(XLIFF)を使用する必要があります。JDeveloperでは、ローカライズされた値をサポートするプロパティごとに起動できる「テキスト・リソースの選択」ダイアログに表示値を初めて入力したときに.xlfファイル・リソース・バンドルが作成されます。

MAFアプリケーションのデフォルトの動作では、2つのリソース・バンドルがあります。プロジェクトレベルのリソース・バンドル(デフォルト名はViewControllerController.xlf)が1つと、アプリケーションレベルのリソース・バンドルが1つです。アプリケーションレベルのリソース・バンドルのネーミング規則では、アプリケーション名と追加のBundle.xlfが使用されます。つまり、MyLocalizedMAFappという名前のMAFアプリケーションは、MyLocalizedMAFappBundle.xlfという名前のアプリケーションレベルのリソース・バンドルを持ちます。アプリケーションレベルのリソース・バンドルには、アプリケーションレベルのテキスト・リソースが含まれます。たとえば、アプリケーション名を別の言語に翻訳する場合は、このリソース・バンドルでアプリケーション名をテキスト・リソースとして指定します。プロジェクトレベルのリソース・バンドルには、プロジェクトのAMXページにレンダリングされるテキスト・リソースまたはアプリケーション機能プロパティのテキスト・リソースが含まれます。これらのプロパティの詳細は、第6.7項「ローカライズ可能なMAFプロパティ」を参照してください。

プロジェクトのリソース・バンドル・オプションを設定することで、1つのプロジェクトレベル・リソース・バンドルを持つMAFアプリケーションのデフォルトの動作を変更できます。MAFアプリケーションは、アプリケーションレベルのリソース・バンドルを1つのみ持つことができます。

6.2.1 MAFアプリケーションのリソース・バンドル・オプションの設定方法

「プロジェクト・プロパティ」ダイアログの「リソース・バンドル」ページを使用して、ビュー・コントローラ・プロジェクトおよびアプリケーション・コントローラ・プロジェクトのリソース・バンドル・オプションを設定します。設定できるオプションには、JDeveloperで作成されるプロジェクトレベル・リソース・バンドルの数が含まれます。

プロジェクトのリソース・バンドル・オプションを設定するには:

1. 「アプリケーション」ウィンドウで、プロジェクトをダブルクリックします。

2. 図6-2に示すように、「プロジェクト・プロパティ」ダイアログで、「リソース・バンドル」を選択して「リソース・バンドル」ページを表示します。

図6-2「プロジェクト・プロパティ」の「リソース・バンドル」ページ

3. ダイアログにテキスト・リソースの説明を入力する前に「テキスト・リソースの選択」ダイアログが閉じないようにする場合は、「常に説明の入力を要求」を選択します。

4. 次に示すいずれかのリソース・バンドル・ファイル・オプションを選択します。

- 1プロジェクト当たり1バンドル: JDeveloperは、<ProjectName>.xlfという名前のファイルに1つのリソース・バンドルを作成します。

- 1ファイル当たり1バンドル: ファイル(maf-feature.xml、maf-application.xmlまたは.amxファイル)のテキスト・リソースを定義するたびにリソース・バンドルを作成します。このオプションによりリソース・バンドルの数が各ファイル1つに制限されるため、このオプションを選択した場合、JDeveloperでは2つ目のバンドルを作成できません。

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

6.3 ベース・リソース・バンドルでのテキスト・リソースの定義

JDeveloperは、エンド・ユーザーに表示されるMAFアプリケーション、アプリケーション機能およびAMX UIコンポーネントのテキスト・リソースの値をリソース・バンドルに定義できる「テキスト・リソースの選択」ダイアログを提供します。「テキスト・リソースの選択」ダイアログにアクセスするには、リソース・バンドルで定義されたテキスト・リソースを参照できる、JDeveloperがプロパティに対して公開するメニュー・オプションを使用します。通常、これらはユーザーが参照できるテキストを表示するプロパティです。例として、コマンド・ボタン、コマンド・リンク、入力テキストなどのAMX UIコンポーネントが公開するラベル、テキストおよびhintTextプロパティに加えて、MAFアプリケーションとアプリケーション機能の名前プロパティがあります。これらのプロパティの詳細は、第6.7項「ローカライズ可能なMAFプロパティ」を参照してください。

図6-3にMAFアプリケーションの名前、アプリケーション機能の名前およびinputTextコンポーネントの「ラベル」プロパティの「テキスト・リソースの選択」コンテキスト・メニューを表示する方法を示します。

図6-3 「テキスト・リソースの選択」ダイアログを表示するコンテキスト・メニュー

6.3.1 ベース・リソース・バンドルにテキスト・リソースを定義する方法

リソース・バンドルにテキスト・リソースを定義するには、EL式を使用してリソース・バンドルに定義されたテキスト・リソースを参照するプロパティについて起動できる「テキスト・リソースの選択」ダイアログを使用します。

リソース・バンドルにテキスト・リソースを定義するには:

1. テキスト・リソースを定義するプロパティを持つアーティファクトを選択します。これは、MAFアプリケーション自体、アプリケーション機能またはAMX UIコンポーネントにすることができます。

2. 「プロパティ」ウィンドウで、テキスト・リソースを定義するプロパティの横のアイコンをクリックし、表示されるコンテキスト・メニューで「テキスト・リソースの選択」を選択します。

3. 「テキスト・リソースの選択」ダイアログで、表示名とキーを入力し、「保存して選択」をクリックしてテキスト・リソースを定義します。

6.3.2 ベース・リソース・バンドルにテキスト・リソースを定義した場合の処理

入力した表示値とキーはJDeveloperによってリソース・バンドルに書き込まれます。今回初めてMAFアプリケーションまたはプロジェクトのテキスト・リソースを定義する場合、JDeveloperではリソース・バンドルが作成されます。定義するテキスト・リソースがアプリケーションレベルのプロパティ(MAFアプリケーションの名前プロパティなど)に対するものである場合、JDeveloperは、「アプリケーション・リソース」パネルに表示できるアプリケーションレベルのリソース・バンドル(ApplicationNameBundle.xlf)を作成します(図6-4を参照)。定義するテキスト・リソースがプロジェクトレベルのプロパティ(アプリケーション機能の名前プロパティなど)の場合、JDeveloperは、「プロジェクト」パネルに表示できるプロジェクトレベルのリソース・バンドル(ViewControllerBundle.xlf)を作成します(図6-4を参照)。

図6-4 新規に作成したリソース・バンドル

JDeveloperはMAFアプリケーション当たり1つのアプリケーションレベル・リソース・バンドルを作成しますが、第6.2項「MAFアプリケーションのリソース・バンドル・オプションの設定」で説明するように、設定するオプションに応じて追加のプロジェクトレベル・リソース・バンドルを作成できます。

次の例に示すように、リソース・バンドルがアプリケーションレベルとプロジェクトレベルのどちらのリソース・バンドルかにかかわらず、JDeveloperがキーおよび表示値のリソース・バンドルに書き込むXMLの構文は同じです。

...
<!-- The value of the id attribute is the value you enter in the Key input field of the
Select Text Resource Dialog -->
<trans-unit id="FEATURE_ONE">
<!-- The value of the source element is the value you enter in the Display Value input
field of the Select  Text Resource Dialog -->
<source>Feature Name</source>
<target/>
</trans-unit>
<trans-unit id="HEADER_VALUE_IN_PANEL">
<source>Header Value in Panel Page</source>
<target/>
</trans-unit>
<trans-unit id="COMMAND_BUTTON">
<source>Text Display Value for a Command Button</source>
<target/>
</trans-unit>
...

リソース・バンドルで定義するテキスト・リソースを参照するためのプロパティを構成するファイルに対して、JDeveloperは例6-1に示す変更を加えます。

- 属性を最初にローカライズすると、JDeveloperによって<adfmf:loadbundle>要素が追加されます。この要素のbasename属性が、新しく作成したリソース・バンドルを参照します。

- JDeveloperは、ローカライズされた属性文字列を、リソース・バンドル内で定義されたテキスト・リソースのキーを参照するEL式に変更します。

- アプリケーション・レベルにはリソース・バンドル・ファイルが1つしか存在しないので、JDeveloperは、ローカライズされた各文字列を同じリソース・バンドル・ファイルに追加します。プロジェクト・レベルでの動作は、第6.2項「MAFアプリケーションのリソース・バンドル・オプションの設定」で選択したリソース・バンドル設定によって異なります。

例6-1 AMXページとMAF構成ファイルのリソース・バンドルの参照

<!-- maf-application.xml where a text resource has been defined for the MAF application's name -->
<adfmf:application ....name="#{mylocalizedmafappBundle.MY_LOCALIZED_MAF_APPLICATION}"
...
<adfmf:loadBundle basename="MyLocalizedMAFappBundle" var="mylocalizedmafappBundle"/>

<!-- maf-feature.xml where a text resource has been defined for the application feature's name -->
<adfmf:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle"/>
...
<adfmf:feature id="feature1" name="#{viewcontrollerBundle.FEATURE_ONE}">

<!-- AMX page where a text resource has been defined for a command button's text attribute -->
<amx:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle" id="lb1"/>
...
<amx:commandButton id="cb1" text="#{viewcontrollerBundle.COMMAND_BUTTON}"/>

6.4 ロケール固有のリソース・バンドルの作成

MAFアプリケーションで特定のロケールに異なるテキスト・リソースをレンダリングする場合は、ロケール固有のリソース・バンドルを作成します。たとえば、フランス語またはアラビア語に設定された言語を持つデバイスでMAFアプリケーションを実行する場合にベース・リソース・バンドルのテキスト・リソースの翻訳を提供する場合は、フランス語とアラビア語両方のロケール固有リソース・バンドルを作成する必要があります。

図6-5に、アラビア語とフランス語のロケールをサポートするためにロケール固有バージョンのアプリケーションレベル(MyLocalizedMAFappBundle.xlf)リソース・バンドルとプロジェクトレベル(ViewControllerBundle.xlf)リソース・バンドルが作成されたMAFアプリケーションを示します。次の形式を使用するファイル名でベース・リソース・バンドルと同じディレクトリにロケール固有リソース・バンドルを作成する必要があります。

<BASE_RESOURCE_BUNDLE_NAME>_<LANGUAGE_TOKEN>.xlf

説明:

- <BASE_RESOURCE_BUNDLE_NAME>はベース・リソース・バンドル名です

- <LANGUAGE_TOKEN>は<ISO-639-lowercase-language-code>の形式です

注意:
MAFは、国または地域をサポートしていません。

図6-5 ベース・リソース・バンドルとロケール固有のリソース・バンドル

6.4.1 ロケール固有のリソース・バンドルの作成方法

JDeveloperは、「新規ギャラリ」の「一般」→「XML」カテゴリで新規XMLローカリゼーション・ファイル(XLIFF)を作成するオプションを提供することで、プロジェクトレベルのリソース・バンドルの作成を容易にします。

または、ロケール固有のリソース・バンドルを作成するベース・バンドルを開き、ファイル名に適切な言語コードを指定してファイルのコピーを保存します。後者のオプションには次のメリットがあります。

- ベース・リソース・バンドルと同じディレクトリにロケール固有のリソース・バンドルを作成します。これは必須です。

- ベース・リソース・バンドル内のすべてのテキスト・リソースのコピーが、翻訳された値を提供できるロケール固有のリソース・ベース・バンドルに表示されます。

ロケール固有のリソース・バンドルを作成するには:

1. ロケール固有バージョンを作成するベース・リソース・バンドルを開きます。

- アプリケーションレベルのベース・リソース・バンドル: 「アプリケーション・リソース」パネルの「ディスクリプタ」→「ADF META-INF」ノードで、.xlfファイルをダブルクリックします。

- プロジェクトレベルのベース・リソース・バンドル: 「プロジェクト」パネルの「ViewController」→「アプリケーション・ソース」ノードで、.xlfファイルをダブルクリックします。

2. JDeveloperで、「ファイル」→「別名保存」をクリックし、サポートするロケールの言語コードを追加します。
たとえば、MAFアプリケーションでフランス語ロケールをサポートする場合は、_frを追加します。

3. 適切な言語コードを含むように、新規に作成したロケール固有のリソース・バンドルを編集します。
次の例は、アプリケーションレベルおよびプロジェクトレベルのリソース・バンドルのフランス語ロケールをサポートするために必要な編集を示しています。

<!-- Application-level French locale-specific resource bundle -->
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
<file source-language="fr" original="this" datatype="x-oracle-adf">

<!-- Project-level French locale-specific resource bundle -->
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
<file source-language="fr" original="mobile.ViewControllerBundle_fr"
datatype="x-oracle-adf">

4. リソース・バンドルを編集して、ターゲット・ロケールに表示する各テキスト・リソースの翻訳を提供します。
リソース・バンドルの編集の詳細は、第6.5項「リソース・バンドルのリソースの編集」を参照してください。

6.5 リソース・バンドルのリソースの編集

JDeveloperには、MAFアプリケーションに含まれるリソース・バンドル内のリソースを追加、削除または編集できる「リソース・バンドルの編集」ダイアログが用意されています。

リソース・バンドルのテキスト・リソースを編集するには:

1. JDeveloperで、テキスト・リソースを編集するリソース・バンドルをダブルクリックします。

2. JDeveloperのメイン・メニューで、「アプリケーション」→「リソース・バンドルの編集」を選択します。
手順1で選択したリソース・バンドルの「リソース・バンドルの編集」ダイアログが開きます。図6-6に、フランス語のロケール固有リソース・バンドルについて開くダイアログを示します。「表示値」および「説明」フィールドをダブルクリックして、既存のテキスト・リソースを編集します。コントロール(「追加」、「削除」および「検索」)を使用して、MAFアプリケーションのテキスト・リソースの追加と削除を行うか、または他のリソース・バンドルを検索して開きます。

図6-6 リソース・バンドルのテキスト・リソースの編集

3. 「OK」をクリックし、ダイアログを閉じて変更を保存します。

6.6 MAFアプリケーションのイメージ・ファイルのローカライズ

ロケールに応じて、MAFアプリケーションに異なるイメージ・ファイルをレンダリングすることが必要な場合があります。たとえば、図6-7に示すように、イメージにはテキストまたは国旗の図を含めることができます。

図6-7 ロケールに基づいて異なるイメージのレンダリング

イメージを参照するコンポーネント属性のEL式をリソース・バンドルのエントリに書き込みます。リソース・バンドル・エントリにはイメージへのパスが含まれます。たとえば、図6-7に示すcommandButtonコンポーネントは、コンポーネントをレンダリングするAMXページのアイコン属性に次の値を定義します。

<amx:commandButton id="cb1" text="#{viewcontrollerBundle.YES}"
icon="#{viewcontrollerBundle.IMAGE_PATH}"/>

ベース・リソース・バンドル(ViewControllerBundle.xlf)には、MAFアプリケーションがフランス語以外のロケールで実行される場合に表示するイメージのパスを持つ次のエントリが含まれます。

<trans-unit id="IMAGE_PATH">
<source>/images/uk.png</source>
<target/>
<note>Path to image file</note>
</trans-unit>

フランス語のリソース・バンドル(ViewControllerBundle_fr.xlf)では、次の例に示すように、MAFアプリケーションがフランス語ロケールで実行されたときにレンダリングする別のイメージを指定します。

<trans-unit id="IMAGE_PATH">
<source>/images/fr.png</source>
<target/>

第6.5項「リソース・バンドルのリソースの編集」の説明に従って、イメージへのパスを定義するエントリをリソース・バンドルに手動で書き込むか、「リソース・バンドルの編集」ダイアログを使用します。

ソース・バンドルにイメージのパスを定義した後で、図6-8に示すように式ビルダーを使用して、リソース・バンドルのエントリを参照するEL式を作成します。

図6-8 リソース・バンドルのイメージを参照しているEL式

6.7 ローカライズ可能なMAFプロパティ

maf-application.xmlおよびmaf-feature.xmlファイルは、どちらもリソース・バンドルのテキスト・リソースを参照できるプロパティを公開します。表6-1と表6-2に、これらのプロパティをリストします。これらの構成ファイルはアプリケーション・ライフサイクルの初期に読み取られるので、これらの文字列は実行時にはEL文として評価されません。そのかわり、これらの文字列は、ネイティブ・デバイス変換インフラストラクチャにおいて変換された文字列の完全なキーとして取得されます。

表6-3に、テキスト・リソースを参照できるMAF AMX UIコンポーネントの属性をリストします。

アプリケーション・レベルでは、アプリケーション名やプリファレンス・ページのラベルなどの属性の文字列をローカライズできます。表6-1にこれらを示します。

表6-1 MAFアプリケーションのローカライズ可能な属性

要素

属性

<adfmf:Application>

name

<adfmf:PreferenceGroup>

label

<adfmf:PreferencePage>

label

<adfmf:PreferenceBoolean>

label

<adfmf:PreferenceText>

label

<adfmf:PreferenceNumber>

label

<adfmf:PreferenceList>

label

<adfmf:PreferenceValue>

name

プロジェクト(ビュー・コントローラ)レベルでは、表6-2に示すような、アプリケーション機能関連の属性をローカライズできます。

表6-2 アプリケーション機能のローカライズ可能な属性

要素

属性

<adfmf:Feature>

name

<adfmf:Constraint>

value

<adfmf:Parameter>

value

<adfmf:PreferencePage>

label

<adfmf:PrefrenceGroup>

label

<adfmf:PreferenceBoolean>

label

<adfmf:PreferenceText>

label

<adfmf:PreferenceNumber>

label

<adfmf:PreferenceList>

label

<adfmf:PreferenceValue>

name

ボタン・コンポーネント(<amx:commandButton>)のtext属性のようなMAF AMX UIコンポーネントの属性には、リソース・バンドルを作成できます。表6-3に、これらのMAF AMX UIコンポーネントを示します。

表6-3 MAF AMX UIコンポーネントのローカライズ可能な属性

コンポーネント

属性

<amx:inputDate>

label

<amx:inputNumberSlider>

label

<amx:panelLabelAndMessage>

label

<amx:selectBooleanCheckBox>

label

<amx:selectBooleanSwitch>

label

<amx:selectItem>

label

<amx:selectManyCheckBox>

label

<amx:selectManyChoice>

label

<amx:selectOneButton>

label

<amx:selectOneChoice>

label

<amx:selectOneRadio>

label

<amx:commandButton>

text

<amx:commandLink>

text

<amx:goLink>

text

<amx:inputText>

label、value、hintText

<amx:outputText>

value

7 MAFアプリケーションのスキニング

この章では、スキンを使用してMAFアプリケーションの外観をカスタマイズする方法について説明します。

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

- 第7.1項「MAFアプリケーション・スキンの概要」

- 第7.2項「アプリケーションへのカスタム・スキンの追加」

- 第7.3項「アプリケーションが使用するスキンの指定」

- 第7.4項「カスタム・スキンの登録」

- 第7.5項「MAFスキンのバージョニング」

- 第7.6項「スキンのバージョニング時に行われる処理」

- 第7.7項「デフォルト・スキン・スタイルのオーバーライド」

- 第7.8項「スキンのアプリケーション機能への適用時に行われる処理」

- 第7.9項「スキニングに関する必知事項」

- 第7.10項「スキンへの新しいスタイル・シートの追加」

- 第7.11項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」

- 第7.12項「実行時の処理: エンド・ユーザーによるアプリケーション・スキンの変更方法」

7.1 MAFアプリケーション・スキンの概要

MAFではCascading Style Sheet (CSS)言語ベースのスキンを使用するので、MAFアプリケーション内の(その要素のアプリケーション機能で使用されるものを含む)すべてのアプリケーション・コンポーネントが一貫したルック・アンド・フィールを確実に共有するようになっています。MAF AMXまたはHTMLコンポーネントを再構成してMAFアプリケーションの外観を変更するかわりに、コンポーネントの表示方法を変更するスキンを作成または拡張できます。

MAF AMXページの外観を決定するセレクタを定義するためにMAFで使用されるサポート済のスキンのファミリとバージョンは、次のとおりです。

amx
mobileAlta-1.0
mobileAlta-1.1
mobileAlta-1.2
mobileAlta-1.3
mobileFusionFx-1.0
mobileFusionFx-1.1

デフォルトで、新規作成したMAFアプリケーションでは最新バージョンのmobileAltaスキン・ファミリが使用されます。アプリケーションを以前のリリースから最新リリースに移行すると、そのアプリケーションでは移行前に使用するよう構成されていたスキンが引き続き使用されます。移行後のアプリケーションで別のスキン(たとえば最新バージョンのmobileAlta)を使用する場合は、第7.3項「アプリケーションが使用するスキンの指定」の説明に従って、maf-config.xmlファイルを編集する必要があります。

図7-1は、異なるスキンを使用して同じアプリケーション画面のレンダリングを示すことによって、mobileAltaスキン・ファミリとmobileFusionFxスキン・ファミリのルック・アンド・フィールの違いを示しています。

図7-1 mobileAltaとmobileFusionFxのルック・アンド・フィールの比較

図7-3は、これらのスキンのファミリとバージョンの継承関係を示しています。

図7-2 MAFのスキン・ファミリの継承関係

MAFアプリケーションの最初のデプロイ後に作成されるwww\cssディレクトリには、これらのCSSファイルが格納されます。このディレクトリにアクセスするには、MAFアプリケーションをシミュレータまたはデバイスにデプロイし、deployディレクトリ(例: C:\JDeveloper\mywork\app_name\deploy)に移動します。www\cssディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリはtemporary_xcode_projectディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(.apk)ファイルのassetsディレクトリ内にあります。

注意:
MAF DOM構造に依存するスタイルを記述しないでください。また、これらのファイル内で定義されている一部のセレクタは、サポートされていない場合があります。

maf-config.xmlファイル(第7.1.1項「maf-config.xmlファイルについて」を参照)とmaf-skins.xmlファイル(第7.1.2項「maf-skins.xmlファイルについて」を参照)を使用して、MAFアプリケーションのスキニングを制御します。maf-config.xmlファイルでは、アプリケーション・コンポーネントのレンダリングに使用するデフォルトのスキン・ファミリを指定し、maf-skins.xmlファイルでは、デフォルトのスキン・ファミリをカスタマイズしたり、新しいスキン・ファミリを定義することができます。

7.1.1 maf-config.xmlファイルについて

MAFアプリケーションを作成すると、JDeveloperによって、maf-config.xmlファイルがMAFアプリケーションのMETA-INFノードに移入されます。このファイル自体には、ベースMAFスキン・ファミリであるmobileAltaが移入されます(次の例を参照)。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-config xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-family>mobileAlta</skin-family>
<skin-version>v1.3</skin-version>
....
</adfmf-config>

注意:
EL式を使用して実行時にスキンの値を決定できます。詳細は、第7.11項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。

MAFでは階層としてスキンが適用されます。最上位にはデバイス固有のスキン、その後にプラットフォーム固有のスキン、ベース・スキンmobileAltaと続きます。MAFのmobileAltaスキン・ファミリの場合、この階層は次のように表されます。

1. mobileAlta.<DeviceModel> (例: mobileAlta.iPhone5,3)

2. mobileAlta.iOSまたはmobileAlta.Android

3. mobileAlta

図7-3は、実行時にMAFでスキンのこの階層が適用される様子をイラストレーションで示しています。SkinningDemoサンプル・アプリケーション(付録G「サンプルのMAFアプリケーション」を参照)でも、この実装を示しています。

MAFでは、この階層のデバイス固有のレベルで定義されたセレクタを優先します。つまり、MAFでは、mobileAlta.iOSで定義されたセレクタを、mobileAlta.iPhoneで定義された同じセレクタで上書きします。<extends>要素(第7.1.2項「maf-skins.xmlファイルについて」を参照)によって、この階層がMAFランタイム用に定義されます。様々なレベルでのスキンの適用方法の詳細は、第7.9項「スキニングに関する必知事項」を参照してください。

図7-3 実行時のMAFのスキン階層の適用

7.1.2 maf-skins.xmlファイルについて

アプリケーション・コントローラ・プロジェクトのMETA-INFノードにあるmaf-skins.xmlファイルによって、既存のスキンを拡張して新しいスキンを定義したり、既存のスキンに新しいスタイル・シートを追加することができます。

デフォルトでは、このファイルは空ですが、表7-1に示されている要素によって子要素を記述します。これらの子要素をこのファイルに移入することで、mobileAltaを拡張したり、アプリケーションで使用できるCSSファイルを定義できます。新しいスキンを作成したり、既存のスキンを拡張するには、<skin>要素を使用します。

表7-1 <skin>要素の子要素

の子要素。" title="<skin>要素の子要素" width="100%">

要素

説明

<id>

maf-skins.xmlファイルのスキンを識別する必須要素。指定する値は、次のいずれかの形式に従う必要があります。

- skinFamily-version

- skinFamily-version.platform

たとえば、Apple iPadまたはiPhoneへのデプロイ時に、ユーザーのアプリケーションの外観を定義するスキンをユーザーのアプリケーションに登録するには、mySkin-v1.iOSを指定します。登録するスキンによってiPadまたはiPhoneのいずれかのデバイスのアプリケーションの外観が定義される場合、iOSはiPadまたはiPhoneによって置き換えられます。Androidプラットフォームへのデプロイ時に、アプリケーションの外観を定義するスキンを登録する場合、.androidを指定します。

<family>

スキン・ファミリを識別する必須要素。

<extends>

この要素を使用して、拡張するスキンのスキンIDを指定することによって既存のスキンを拡張します。

<skin>
<id>mySkin-v1</id>
<family>mySkin</family>
<extends>mobileAlta-v1.3</extends>
<style-sheet-name>styles/myskin.css</style-sheet-name>
<version>
<name>v1</name>
</version>
</skin>

<style-sheet-name>

MAFアプリケーションのプロジェクト内のCSSファイルの場所を指定するには、相対URLを使用します。たとえば、SkinningDemoサンプル・アプリケーションのmaf-skins.xmlファイルには、アプリケーション・コントローラ・プロジェクトのcssディレクトリのv1.cssスタイルシートへの次の参照が含まれます。

<style-sheet-name>css/v1.css</style-sheet-name>

<version>

スキンの異なるバージョンを指定します。詳細は、第7.5項「MAFスキンのバージョニング」を参照してください。

表7-2に、スタイルシートを既存のスキンに統合する場合に、MAF CSS内で<skin-addition>要素を定義するために使用できる要素を示しています。

表7-2 <skin-addition>の子要素

の要素を示しています。" title="<skin-addition>の子要素" width="100%">

要素

説明

<skin-id>

スタイルシートをさらに追加する必要があるスキンのIDを指定します。指定可能な値には、MAFによって提供されるスキン(たとえば、mobileAlta-v1.3.iOS)またはユーザーによって作成されるカスタム・スキンなどがあります。

<style-sheet-name>

MAFアプリケーションのプロジェクト内のCSSファイルの場所を指定するには、相対URLを使用します。たとえば、SkinningDemoサンプル・アプリケーションのmaf-skins.xmlファイルには、アプリケーション・コントローラ・プロジェクトのcssディレクトリのv1.cssスタイルシートへの次の参照が含まれます。

<style-sheet-name>css/v1.css</style-sheet-name>

次の例では、<style-sheet-name>要素でCSSファイルの場所を、<skin-id>でターゲット・スキン・ファミリを指定しています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-addition>
<skin-id>mobileAlta-v1.3.iOS</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
</skin-addition>
</adfmf-skins>

<skin-id>および<style-sheet-name>要素を使用して特定のiOSまたはAndroidデバイスにレンダリングしたり、これらの要素を定義してすべてのデバイスのプラットフォームに対するスタイルを処理することもできます。表7-3に、iOSプラットフォームに属するすべてのデバイス、および特定のiOSデバイス・タイプ(タブレット、電話、シミュレータ)をターゲットにするこれらの要素の使用例を示します。

ヒント:
デバイス・モデルに関する情報を取得するには、付録G「サンプルのMAFアプリケーション」に記載されているDeviceDemoサンプル・アプリケーションの使用を検討してください。

表7-3 プラットフォームおよびデバイス固有のスタイル

デバイス

例

iPhone

<skin-addition>
<skin-id>mobileAlta-v1.3.iPhone5,1</skin-id>
<style-sheet-name>iPhoneStylesheet.css</style-sheet-name>
</skin-addition>

iPad

<skin-addition>
<skin-id>mobileAlta-v1.3.iPad4,2</skin-id>
<style-sheet-name>iPadStylesheet.css</style-sheet-name>
</skin-addition>

iPhoneシミュレータ

<skin-addition>
<skin-id>mobileAlta-v1.3.iPhone Simulator x86_64</skin-id>
<style-sheet-name>iPhoneSimStylesheet.css</style-sheet-name>
</skin-addition>

すべてのiOSデバイス

<skin-addition>
<skin-id>mobileAlta-v1.3.iOS</skin-id>
<style-sheet-name>iOSSimStylesheet.css</style-sheet-name>
</skin-addition>

7.2 アプリケーションへのカスタム・スキンの追加

アプリケーションにカスタム・スキンを追加するには、JDeveloper内にCSSファイルを作成します。CSSはアプリケーションとともにデプロイするために、JDeveloperによりプロジェクトのソース・ファイルに配置されます。

カスタム・スキンをアプリケーションに追加する手順:

1. 「アプリケーション」ウィンドウで、ApplicationControllerプロジェクトを右クリックして、「新規」→「CSSファイル」を選択します。

2. 「Cascading Style Sheetの作成」ダイアログで、CSSファイルの名前およびディレクトリを指定します。

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

これで、CSSエディタにCSSを開いて、アプリケーションのスタイルを定義できます。

7.3 アプリケーションが使用するスキンの指定

maf-config.xmlファイルで値を構成して、アプリケーションで使用するスキンを決定します。

使用するアプリケーションのスキンを指定するには:

1. 「アプリケーション」ウィンドウで、maf-config.xmlファイルをダブルクリックします。デフォルトでは、これは、「アプリケーション・リソース」ペインの「ディスクリプタ」および「ADF META-INF」ノードの下にあります。

2. maf-config.xmlファイルで、使用するスキンの<skin-family>要素、および<skin-version>要素(オプション)の値を指定します。
例7-1は、MAFアプリケーションでmobileAlta-v1.3スキンを使用するのに必要な構成を示しています。

注意:
アプリケーションが実行時に使用するスキンを動的に選択する場合、EL式を<skin-family>要素の値として設定します。詳細は、第7.11項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。

例7-1 アプリケーションのスキンを指定する構成

<adfmf-config xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-family>mobileAlta</skin-family>
<skin-version>v1.3</skin-version>
</adfmf-config>

7.4 カスタム・スキンの登録

maf-skins.xmlファイルにカスタム・スキンを識別するプロパティ値を追加することで、ユーザーのアプリケーションにカスタム・スキンを登録します。

カスタム・スキンを登録する手順:

1. 「アプリケーション」ウィンドウで、「ApplicationController」→「アプリケーション・ソース」→「META-INF」を開き、「maf-skins.xml」をダブルクリックします。

2. 「構造」ウィンドウで、「adfmf-skins」ノードを右クリックし、「adfmf-skinsの中に挿入」→「skin」を選択します。

3. 「skinの挿入」ダイアログで、次のようにフィールドに入力します。

- ファミリ: スキンのファミリ名の値を入力します。
新しい名前を入力するか、既存のファミリ名を指定できます。既存のファミリ名を指定した場合は、第7.5項「MAFスキンのバージョニング」に示すように、スキンをバージョニングして、同じファミリ値を持つスキンを区別します。

入力する値は、作成するスキンを登録するmaf-skins.xmlの<family>要素の値として設定されます。アプリケーションのmaf-config.xmlの<skin-family>要素では、実行時にこの値を使用してアプリケーションで使用されるスキンを識別します。

- ID: skinFamily-versionまたはskinFamily-version.platformのいずれかの名前書式を使用してスキンのIDを入力します。たとえば、mySkinFamily-v1.1.32.androidのように指定します。

- 拡張対象: 拡張する親スキンの名前を入力します。たとえば、カスタム・スキンでmobileAlta-v1.3スキンを拡張する場合は、mobileAlta-v1.3と入力します。

- スタイルシート名: スタイルシートの名前を入力または選択します。

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

7.5 MAFスキンのバージョニング

<version>要素を使用して、maf-skins.xmlファイルでスキンのバージョン番号を指定できます。maf-skins.xmlファイル内の<family>要素の値が同じスキンを区別する場合はこのオプション機能を使用します。この機能は、いくつかの既存の動作を変更するために既存のスキンの新規バージョンを作成する場合に役立ちます。特定のスキンを使用するようにアプリケーションを構成する場合は、第7.3項「アプリケーションが使用するスキンの指定」に説明されているように、maf-config.xmlファイルで値を指定してください。

maf-skins.xmlファイル内の<version>要素に値を入力して、スキンのバージョンを指定します。

ベスト・プラクティス:
アプリケーションのmaf-skins.xmlファイルに登録する各スキンのバージョン情報を指定します。

MAFスキンをバージョニングするには:

1. 「アプリケーション」ウィンドウで、maf-skins.xmlファイルをダブルクリックします。デフォルトでは、これは、アプリケーション・コントローラ・プロジェクトのMETA-INFノードにあります。

2. 「構造」ウィンドウで、バージョニングするスキンのskinノードを右クリックし、「skinの中に挿入」→「version」を選択します。

3. maf-config.xmlファイルの<skin-version>要素に値が指定されていない場合に、このバージョンのスキンがアプリケーションで使用されるようにするには、「バージョンの挿入」ダイアログで、デフォルト・リストからtrueを選択します(第7.3項「アプリケーションが使用するスキンの指定」を参照)。

4. 名前フィールドに値を入力します。たとえば、これがスキンの最初のバージョンである場合はv1と入力します。

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

7.6 スキンをバージョニングした場合の処理

スキン用に構成するバージョン情報は、実行時にアプリケーションでスキンが適用されるときに、プラットフォーム値およびデバイス値より優先されます。実行時に、MAFアプリケーションでは、プラットフォーム固有のスキンが適用される前にデバイス固有のスキンが適用されます。スキンのバージョン情報が指定されている場合、アプリケーションでは最初に、指定したスキンのバージョン値と一致するスキンを検索します。スキン・バージョン値およびデバイス値と一致するスキンが見つかると、アプリケーションではこのスキンが適用されます。指定したスキン・バージョンのスキンがデバイス固有のスキン内で見つからなかった場合、アプリケーションでは指定したバージョンのスキンをプラットフォーム固有のスキン内で検索します。使用可能なプラットフォーム固有のスキン内で、指定したバージョンと一致するスキンが見つからない場合、アプリケーションではベース・スキンを検索します。

例7-2は、3つのスキン(customFamily-v1.iphone5,3、customFamily-v2.iPhoneおよびcustomFamily-v3.iPhone)を参照するmaf-skins.xmlの例を示しています。これらの各スキンの<family>要素は同じ値(customFamily)になっています。<version>要素の子要素の値によって、これらのスキンがそれぞれ区別されます。

実行時に、アプリケーションのmaf-config.xmlファイルにおける<skin-family>要素の値としてcustomFamilyが指定されたアプリケーションでは、customFamily-v1.iphone5,3を使用します。これは、このスキンがmaf-skins.xmlファイルでデフォルト・スキンとして構成されているためです(<default>true</default>)。この動作は、第7.3項「アプリケーションが使用するスキンの指定」で説明されているように、maf-config.xmlファイル内の<skin-version>要素に値を指定してオーバーライドできます。たとえば、maf-config.xmlファイル内の<skin-version>要素の値としてv2を指定した場合、アプリケーションはmaf-skins.xmlファイル内でデフォルトとして定義されているcustomFamily-v1.iphone5,3ではなくcustomFamily-v2.iPhoneを使用します。

(maf-config.xmlファイル内の<skin-version>要素を使用して)取得するスキンのバージョンを指定しない場合、アプリケーションはmaf-skins.xmlファイル内の<default>true</default>要素を使用してデフォルトとして定義されているスキンを使用します。デフォルトのスキンを指定しない場合、アプリケーションはmaf-skins.xmlファイル内で定義される最後のスキンを使用します。例7-2において、定義される最後のスキンはcustomFamily-v3.iPhoneです。

例7-2 バージョニングされたスキン・ファイルが含まれたmaf-skins.xmlファイル

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skin">
<skin id="s1">
<family>customFamily</family>
<id>customFamily-v1.iphone5,3</id>
<extends>customFamily-v1.iOS</extends>
<style-sheet-name>iphone.css</style-sheet-name>
<version>
<default>true</default>
<name>v1</name>
</version>
</skin>
<skin id="s2">
<family>customFamily</family>
<id>customFamily-v2.iPhone</id>
<extends>customFamily-v1.iOS</extends>
<style-sheet-name>iphone-v2.css</style-sheet-name>
<version>
<name>v2</name>
</version>
</skin>
<skin id="s3">
<family>customFamily</family>
<id>customFamily-v3.iPhone</id>
<extends>customFamily-v1.iOS</extends>
<style-sheet-name>iphone-v3.css</style-sheet-name>
<version>
<name>v3</name>
</version>
</skin>
</adfmf-skins>

7.7 デフォルト・スキン・スタイルのオーバーライド

MAF AMXアプリケーションでは、MAF AMXとして実装されたアプリケーション機能に対して特定のスタイルを指定し、それによって、maf-config.xmlおよびmaf-skins.xmlファイル内のアプリケーション・レベルで設定されているデフォルトのスキン・スタイルをオーバーライドできます。アプリケーション機能に個別のスタイルを追加するには、CSSファイルを包含ファイルとして使用します。

maf-feature.xmlファイルの概要エディタの「包含」表では、MAF AMXアプリケーション機能にCSSを追加できます。

図7-4 「包含」表

始める前に

第12.2項「タスク・フローの作成」の説明に従って、MAFタスク・フローを作成します。スキンのCSSファイルを作成または追加します。ビュー・コントローラ・プロジェクトを選択し、「新規」→「CSSファイル」を選択してCSSファイルを作成できます。または、次のようにCSSファイルをJARファイルにパッケージ化することもできます。

1. メイン・メニューから「アプリケーション」→「プロジェクト・プロパティ」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」ページを選択し、「JAR/ディレクトリの追加」をクリックします。

3. 「アーカイブまたはディレクトリの追加」ダイアログで、インポートするADFスキンが含まれているJARファイルに移動し、「選択」をクリックします。
JARファイルが「クラスパス・エントリ」リストに表示されます。

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

アプリケーション機能にスタイル・シートを追加する方法:

1. 「追加」をクリックして、「包含」表に新しい行を作成します。

2. 「インクルードの挿入」ダイアログで、次のフィールドに値を入力します。

- ファイル: 追加するCSSスタイル・シートを参照して選択します。

- タイプ: ドロップダウン・リストから「スタイルシート」を選択します。

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

注意:
選択したスタイル・シートの.CSSファイルがビュー・コントローラ・プロジェクト内に存在する必要があります。

7.8 スキンのアプリケーション機能への適用時に行われる処理

CSS (またはJavaScriptファイル)を「包含」表に追加すると、MAF AMXエディタの「プレビュー」ペインにある機能コンテンツのドロップダウン・メニュー(図7-5を参照)からアプリケーション機能を選択することで、アプリケーション機能に追加されたCSSページを、MAF AMXページに適用できます。

図7-5 機能コンテンツのドロップダウン・メニュー

7.9 スキニングに関する必知事項

maf-skins.xmlファイルで定義されるCSSファイル(例7-3を参照)は、Apple iPhoneとiPadの異なる表示要件に適応するようにスキンを拡張する方法を示します。これらのスタイルは降順に適用されます。SkinningDemoサンプル・アプリケーションでは、アプリケーションを異なるデバイスにデプロイするときに、カスタマイズされたスタイルを適用できるようにする方法のデモが提供されています。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

たとえば、iOSレベルでは、スタイルシート(例7-3のmobileAlta)がiPhoneまたはiPadのどちらにも適用されます。デバイス固有のスタイル用には、iPhoneおよびiPadのスキンに対して<skin-id>要素を定義します。スキニングのデモ・アプリケーションでは、この要素によって定義されたカスタム・スキンの使用方法が示されています。

例7-3 maf-skins.xmlファイルで定義されるスキニング・レベル

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skins">
<skin>
<id>mobileAlta-v1.3.iPhone</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.3.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.3.iphone.css</style-sheet-name>
</skin>
<skin>
<id>mobileAlta-v1.3.iPad</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.3.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.3.ipad.css</style-sheet-name>
</skin>
<skin>
<id>mobileAlta-v1.3.iPod</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.3.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.3.ipod.css</style-sheet-name>
</skin>
<!--  Skin Additions -->
<skin-addition>
<skin-id>mobileAlta-v1.3.iPhone</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.3.iPhone</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition2.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.3.iOS</skin-id>
<style-sheet-name>skins/mystyles.ios.addition2.css</style-sheet-name>
</skin-addition>
</adfmf-skins>

7.10 スキンへの新しいスタイル・シートの追加

スキンを拡張するかわりに、CSSファイルを既存のスキンに追加できます。

新しいスタイルシートをスキンに追加するには:

1. 「コンポーネント」ウィンドウから「構造」ウィンドウに、<skin-addition>要素をドラッグ・アンド・ドロップします。

2. 「skin-additionの挿入」ダイアログ(図7-6を参照)に入力を行うことで、表7-2で説明した要素を<skin-addition>要素に移入します。

- 新しいスタイルを追加するスキンの識別子を入力します。

- CSSファイルの場所を取得します。

図7-6 「skin-additionの挿入」ダイアログ

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

注意:
DOM変更構造を使用するカスタム・スタイルを作成すると、MAFアプリケーションがハングする可能性があります。特に、displayプロパティでは、MAF AMXから変換されたHTMLでレンダリングに問題が発生します。このプロパティは、table、table-row、table-cellなどの値を使用してコンポーネントを表に変換しており、適切な親の表オブジェクト内に含まれていない表関連の構造が作成される可能性があります。この問題はアプリケーションのユーザー・インタフェース自体には表示されないことがありますが、ロギング・コンソールではSignal 10の例外によってレポートされます。

7.11 エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化

エンド・ユーザーが実行時に他のスキンを選択できるように、アプリケーションを構成できます。エンド・ユーザーが必要により適したスキンを使用して、アプリケーションをレンダリングできるようにする場合に、この機能を構成します。

図7-7では、ボタンを表示して、エンド・ユーザーが実行時にアプリケーションで使用されるスキンを変更できるようにすることで、この機能をどのように実装するかを示しています。ページ上のボタンを構成して、後からアプリケーションのmaf-config.xmlファイルのskin-familyプロパティにより評価されるscope値を設定します。

図7-7 実行時におけるアプリケーションのスキンの変更(iOSの場合)

アプリケーションのmaf-config.xmlファイルのskin-familyプロパティの値の更新を可能にするコンポーネントを公開することにより、エンド・ユーザーがアプリケーションのスキンを変更できるようにします。

エンド・ユーザーが実行時にアプリケーションのスキンを変更できるようにするには:

1. maf-config.xmlファイルでスキン・ファミリ・プロパティを設定するために使用するコンポーネントを構成するページを開きます。

2. エンド・ユーザーが実行時に多数の使用可能なスキンの1つを選択できるようにする多数のコンポーネント(ボタン・コンポーネントなど)を構成します(図7-7を参照)。
次の例は、エンド・ユーザーが実行時に使用可能なスキンの1つを選択できるようにするamx:commandButtonコンポーネントの構成方法を示しています(図7-7を参照)。各amx:commandButtonコンポーネントにより、actionListener属性の値を指定します。エンド・ユーザーがボタンをクリックすると、この属性でactionEventがskinsというマネージドBean上のメソッド(skinMenuAction)に渡されます。

...
<amx:commandButton text="Switch to Alta"
actionListener="#{applicationScope.SkinBean.switchToMobileAlta}" id="cb1"/>
<amx:commandButton text="Switch to Fusion Fx"
actionListener="#{applicationScope.SkinBean.switchToMobileFusionFx}" id="cb2"/>
...

3. エンド・ユーザーによって選択されたスキンの値を格納するには、アプリケーションのビュー・コントローラ・プロジェクトにマネージドBeanを記述します。例7-4は、エンド・ユーザーが選択した値をとり、それをマネージドBean内のskinFamilyの値の設定に使用するメソッドを示しています。例7-4は、新しいスキンを使用するためにアプリケーションのすべての機能をリセットするメソッドも示しています。

4. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開き、「ディスクリプタ」→「ADF Meta-INF」ノードを開き、maf.config.xmlファイルをダブルクリックします。

5. maf-config.xmlファイルで、EL式を記述してスキン・ファミリを動的に評価します。
<skin-family>#{applicationScope.SkinBean.skinFamily}</skin-family>

例7-4 アプリケーションのスキンを変更するためのマネージドBean

package application;

import javax.el.ValueExpression;
import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.FeatureInformation;
import oracle.adfmf.framework.api.AdfmfContainerUtilities;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;

public class SkinBean {

private String skinFamily = "mobileAlta";
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

public void setSkinFamily(String skinFamily) {
String oldSkinFamily = this.skinFamily;
this.skinFamily = skinFamily;
propertyChangeSupport.firePropertyChange("skinFamily", oldSkinFamily, skinFamily);
}

public String getSkinFamily() {
return skinFamily;
}

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public void switchToMobileAlta(ActionEvent ev){
this.switchSkinFamily("mobileAlta");
}

public void switchToMobileFusionFx(ActionEvent ev) {
this.switchSkinFamily("mobileFusionFx");
}

public void switchSkinFamily(String family) {
this.setSkinFamily(family);
// reset all the features individually as follows to load the new skin
FeatureInformation[] features = AdfmfContainerUtilities.getFeatures();
for (int i = 0; i < features.length; i++) {
AdfmfContainerUtilities.resetFeature(features[i].getId());
}
}
}

7.12 実行時の処理: エンド・ユーザーによるアプリケーション・スキンの変更方法

実行時に、エンド・ユーザーは公開されたコンポーネントを使用して、別のスキンを選択します。このコンポーネントは、エンド・ユーザーが選択した値をマネージドBeanに発行し、次にこれがマネージドBeanのプロパティ(skinFamily)の値を設定します。実行時に、maf-config.xmlファイルの<skin-family>プロパティでは、EL式を使用してマネージドBeanから値を読み取ります。また、例7-4のマネージドBeanは、新しく指定したスキンを使用するアプリケーションに機能を再ロードします。

ヒント:
<skin-family>プロパティと同様に、EL式を使用して、実行時にmaf-config.xmlファイルの<skin-version>プロパティの値を設定できます。

アプリケーションの機能を個別にリセットして新しいスキンをロードするかわりに、次のクラスからresetApplicationメソッドを起動することもできます(例7-4を参照)。

oracle.adfmf.framework.api.AdfmfContainerUtilities

詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスを参照してください。

8 MAFアプリケーション・コンテンツの再使用

この章では、機能アーカイブ(FAR)ファイルの概要と、これらのファイルにアプリケーション機能のコンテンツをパッケージ化して、1つ以上のMAFアプリケーションで再利用する方法について説明します。

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

- 第8.1項「機能アーカイブ・ファイルの概要」

- 第8.2項「MAFアプリケーションでのFARコンテンツの使用方法」

- 第8.3項「FARのライブラリとしての追加時に行われる処理」

- 第8.4項「FARのビュー・コントローラ・プロジェクトとしての追加時に行われる処理」

- 第8.5項「機能アーカイブ・リソースの再使用の有効化に関する必知事項」

8.1 機能アーカイブ・ファイルの概要

アプリケーション機能は、機能アーカイブ・ファイル(FAR)と呼ばれるJARファイルにパッケージ化されると、他のMAFアプリケーションが使用できる再利用可能なコンテンツを提供します。MAFアプリケーションは1つ以上のFARファイルを使用できます。FARファイルには、アイコンのイメージ、リソース・バンドル、HTMLファイル、JavaScriptファイル、その他の実装固有のファイルなど、アプリケーション機能が必要とするすべてのものが格納されています。

また、FARには、パッケージ化された各アプリケーション機能を一意のIDで識別する、1つのmaf-feature.xmlファイルも含まれています。このファイルを編集することで、コンテンツ実装(MAF AMX、ローカルHTML、リモートURL)などのアプリケーション機能プロパティを更新し、ユーザー・ロールや権限またはデバイス・プロパティなどのファクタに基づいてプロパティを表示できます。

FARをアプリケーション・ライブラリまたはビュー・コントローラ・プロジェクトとして追加できます。FARのコンテンツをプロジェクト・ライブラリとして追加する場合、FARのコンテンツをカスタマイズすることも、その個別のアーティファクトを再利用することもできません。FARがライブラリ・ファイルとして追加される場合、MAアプリケーションではFAR全体が使用されます。たとえば、FARのタスク・フローは、タスク・フロー・コール・アクティビティのターゲットにすることはできません。ただし、FARをビュー・コントローラ・プロジェクトとして追加すると、そのアーティファクトをカスタマイズできるようになります(第10章「MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ」を参照)。

8.2 MAFアプリケーションでのFARコンテンツの使用方法

アプリケーション機能を、それを使用するアプリケーションのクラスパスに追加することで、MAFアプリケーションで使用できるようにします。

注意:
FARは、アプリケーション・コントローラ・プロジェクトにのみ追加でき、ビュー・コントローラ・プロジェクトにFARを追加することはできません。

始める前に

アプリケーション機能を機能アーカイブ・ファイルとしてデプロイします(第27.5.2項「機能アーカイブのデプロイメント・プロファイルのデプロイ方法」を参照)。

アプリケーション機能コンテンツをライブラリとしてMAFアプリケーションに追加するには:

1. 「リソース」ウィンドウを開き、「新規」→「IDE接続」を選択して、「ファイルシステム」を選択します。

2. 「ファイルシステム接続」ダイアログに入力し、機能アーカイブJARファイルを格納するディレクトリへのファイル接続を作成します。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

3. 「リソース」ウィンドウで、機能アーカイブ・ファイル(JARファイルとして示されている)を右クリックします。

4. 「名前を付けてアプリケーションに追加」を選択して、「ライブラリ」を選択し、これを使用するアプリケーションのクラスパスを追加します(図8-1を参照)。

図8-1 ライブラリとしてのFARのMAFアプリケーションへの追加

ヒント:
使用するアプリケーションのクラスパスから機能アーカイブJARを削除するには、「ライブラリをアプリケーションから削除」を選択します。

FARをビュー・コントローラ・プロジェクトとして追加するには:

1. 「リソース」ウィンドウを開き、「新規」→「IDE接続」を選択して、「ファイルシステム」を選択します。

2. 「ファイルシステム接続」ダイアログに入力し、機能アーカイブJARファイルを格納するディレクトリへのファイル接続を作成します。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

3. 「リソース」ウィンドウで、機能アーカイブ・ファイル(JARファイルとして示されている)を右クリックします。

4. 「名前を付けてアプリケーションに追加」を選択して、「ViewControllerプロジェクト」を選択します(図8-2を参照)。

図8-2 ビュー・コントローラ・プロジェクトとしてのFARのMAFアプリケーションへの追加

8.3 FARのライブラリとしての追加時に行われる処理

FARをライブラリとして(または手動でアプリケーションのクラスパスに)追加した場合:

- FARのコンテンツが、「アプリケーション・リソース」の「ライブラリ」ノードの下に表示されます(図8-3を参照)。

図8-3 使用するアプリケーションの「アプリケーション・リソース」に表示されるFAR JARファイル

- JARに含まれるmaf-feature.xmlファイルで宣言されたすべてのアプリケーション機能は、アプリケーションで使用できるようになります(図8-4を参照。ドロップダウンには、JAR内の使用可能なアプリケーション機能のIDと、アプリケーション内で定義済のIDが表示されています)。

図8-4 様々なmaf-feature.xmlファイルで定義されたアプリケーション機能の参照

ヒント:
機能アーカイブJARをアプリケーションのクラスパスに手動で追加すると、アプリケーション機能が機能参照の挿入ダイアログにも表示されるようになります。

または、次のように「リソース」ウィンドウからアプリケーション機能を追加したり、削除することもできます。

1. 「リソース」ウィンドウで、機能アーカイブJARを開きます。

2. 「MAF機能」フォルダから、アプリケーション機能を右クリックします。

3. 「機能参照をmaf-application.xmlに追加」(図8-5を参照)、または「機能参照をmaf-application.xmlから削除」(図8-6を参照)を選択します。図8-5に、MAF_DevGuideExample.jarからの人々というアプリケーション機能の追加を示しています。

図8-5 機能参照の追加

図8-6に、maf-application.xmlファイルからのアプリケーション機能参照の削除を示しています。

図8-6 機能参照の削除

- 機能アーカイブJARにあるconnections.xmlファイル内の情報は、使用するアプリケーションのconnections.xmlファイルにマージされます。図8-7に示す「ログ」ウィンドウには、名前の競合が表示されています。

注意:
使用するアプリケーションで接続が有効であることを確認する必要があります。

図8-7 接続での名前の競合を示すメッセージ・ログ・ウィンドウ

8.4 FARのビュー・コントローラ・プロジェクトとしての追加時に行われる処理

FARをビュー・コントローラ・プロジェクトとして追加する場合:

- MAFは、インポートしたFARと同じ名前のビュー・コントローラ・プロジェクトを生成します。図8-8に、MAFで、StockTracker (図8-2のStockTrackerFAR.jarを参照)というインポートしたFARファイルに対してビュー・コントローラ・プロジェクト(.jprファイル)を作成する方法を示しています。このビュー・コントローラ・プロジェクトには、MAFビュー・コントローラ・プロジェクトのデフォルト構造およびメタデータ・ファイルが含まれます(第C.3項「ビュー・コントローラ・プロジェクトのリソースについて」を参照)。特に、FARビュー・コントローラ・プロジェクトには、maf-feature.xmlファイルが含まれます。MAFアプリケーションに他のビュー・コントローラ・プロジェクトが含まれている場合、いずれのプロジェクトにもIDが同じアプリケーション機能が含まれていないことを確認する必要があります。第8.5項「機能アーカイブ・リソースの再使用の有効化に関する必知事項」も参照してください。

図8-8 MAFアプリケーション内のビュー・コントローラ・プロジェクトとしてインポートしたFAR

- ライブラリとしてインポートしたFARと同様に、機能アーカイブJARにあるconnections.xmlファイル内の情報は、使用するアプリケーションのconnections.xmlファイルにマージされます。ターゲット・アプリケーションにconnections.xmlファイルが存在しない場合、MAFではこのファイルが作成されます。

- MAFでは、FARに含まれる.classおよびJARファイルをビュー・コントローラ・プロジェクトでライブラリとして使用できるように、これらをそのlibディレクトリ(C:\jdeveloper\mywork\application\FAR view controller project\libなど)にコピーします。MAFでは、これらのファイルをclassesFromFar.jarというファイルにコンパイルします。

- ライブラリとしてインポートしたFARとは異なり、ビュー・コントローラ・プロジェクトのファイルはカスタマイズできます。

注意:
FARに含まれる元のリソース・バンドルは、生成されたビュー・コントローラ・プロジェクトでは使用できない可能性があるため、このプロジェクト内に新しいリソース・バンドルを作成する必要があります(第10.8項「リソース・バンドルでのカスタマイズの有効化」を参照)。

- ライブラリとしてインポートしたFARと同様に、FARのmaf-feature.xmlファイル内で宣言されたすべてのアプリケーション機能は、使用するアプリケーションで使用できるようになります。

8.5 機能アーカイブ・リソースの再使用の有効化に関する必知事項

FARのリソースをアプリケーションで使用可能にするためには、FARの名前とその機能参照IDが両方ともグローバルに一意である必要があるため、maf-application.xmlファイル内に機能参照IDの重複がないことを確認してください。FARの内部では、DataControl.dcxファイルが一意のパッケージ・ディレクトリ内に存在する必要があります。これらのパッケージ・ディレクトリのデフォルト名をそのまま使用するのではなく、プロジェクト用に一意のパッケージ階層を作成する必要があります。さらに機能参照IDについても、同じようなパッケージ・ネーミング・システムを使用する必要があります。

9 MAFアプリケーションでのプラグインの使用方法

この章では、MAFに用意されているコア・プラグインを有効にしてMAFアプリケーションで使用する方法、追加プラグインを登録する方法、FARからプラグインをインポートする方法、およびMAFアプリケーションのプラグインをパッケージ化してデプロイする方法について説明します。

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

- 第9.1項「MAFアプリケーションでのプラグインの使用方法の概要」

- 第9.2項「MAFアプリケーションでのコア・プラグインの有効化」

- 第9.3項「MAFアプリケーションでの追加プラグインの登録」

- 第9.4項「MAFアプリケーション組込みプラグインのデプロイ」

- 第9.5項「機能アーカイブ・ファイルからのプラグインのインポート」

9.1 MAFアプリケーションでのプラグインの使用方法の概要

MAFには様々なCordovaプラグインがパッケージ化されているので、MAFアプリケーションはこのプラグインを使用してデプロイ先のデバイスと対話できます。MAFに用意されているデフォルトのプラグインはコア・プラグインと呼ばれます。これらのプラグインはmaf-application.xmlファイルの概要エディタで確認できます。たとえば、MAFアプリケーションでデバイスの電子メール機能やコンタクト先機能へのアクセスに使用する電子メールプラグインやコンタクト先プラグインなどがあります。

MAFには、プラグインを使用するMAFアプリケーション用に、次のバージョンのApache Cordovaが含まれています。

- AndroidプラットフォームのMAFアプリケーション用Apache Cordova 3.6.3

- iOSプラットフォームのMAFアプリケーション用Apache Cordova 3.7.0

各プラグインの説明を表示するには、「コア・プラグイン」リスト(図9-1を参照)でプラグインを選択します。新規作成したMAFアプリケーションでは、1つのコア・プラグイン(ネットワーク情報プラグイン)のみがデフォルトで有効になっています。第9.2項「MAFアプリケーションでのコア・プラグインの有効化」の説明に従って、これらのコア・プラグインを有効または無効にします。

注意:
iOSデバイス上のすべてのアプリケーションにネットワーク・アクセスがデフォルトで許可されます。この動作は変更できません。Androidデバイスにデプロイするアプリケーションについては、Androidデバイス上でネットワーク・アクセスを許可しない場合、ネットワーク情報プラグインを無効にします。

MAFに用意されているデフォルトのコア・プラグインではMAFアプリケーションの要件を満たさない場合は、独自に開発した追加プラグインを登録できます。詳細は、第9.3項「MAFアプリケーションでの追加プラグインの登録」を参照してください。

追加プラグインを登録するとMAFアプリケーションがデプロイできなくなる場合、MAFアプリケーションで使用されているプラグイン間でファイル名が競合している可能性があります。または、登録した追加プラグインが正常に機能するために必要な依存プラグインが存在しないことが原因の可能性もあります。詳細は、第9.4項「MAFアプリケーション組込みプラグインのデプロイ」を参照してください。

以前のリリースのMAFで作成したMAFアプリケーションを移行する場合は、アプリケーションで使用されているすべてのプラグインをmaf-plugins.xmlファイルに登録する必要があります。詳細は、『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』のCordovaプラグインの旧リリースからMAFへの移行に関する項を参照してください。

注意:
アプリケーションのプラグインを管理するにはmaf-application.xmlファイルを編集しますが、変更を加えるとmaf-plugins.xmlファイルのリビジョンが作成されます。「アプリケーション・リソース」ペインのADF-META-INFノードから、両方のファイルにアクセスします(図9-1を参照)。

図9-1 maf-application.xmlファイルの概要エディタに表示されたプラグイン

9.2 MAFアプリケーションでのコア・プラグインの有効化

新規作成したMAFアプリケーションでは、1つのコア・プラグイン(ネットワーク情報プラグイン)のみがデフォルトで有効になっています。他のコア・プラグインを有効または無効にして、関連するデバイスの機能にMAFアプリケーションがアクセスできるようにしてください。

9.2.1 MAFアプリケーションでコア・プラグインを有効にする方法

コア・プラグインを有効にするには、MAFアプリケーションのmaf-application.xmlファイルの概要エディタを使用します。

MAFアプリケーションでコア・プラグインを有効にする手順:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開きます。

2. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

3. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「プラグイン」ナビゲーション・タブをクリックします。

4. 「コア・プラグイン」セクションを展開し、アプリケーションが機能にアクセスできるようにするプラグインを選択します。
たとえば、MAFアプリケーションでSMSメッセージを送信できるようにするには、SMSプラグインのチェック・ボックスを選択します。

9.2.2 MAFアプリケーションでコア・プラグインを有効にする場合の処理

概要エディタでプラグインを有効にすると、JDeveloperによってアプリケーションのmaf-plugins.xmlファイルが編集され、MAFアプリケーションで有効なプラグインを特定するエントリが追加されます。例9-1に、電子メール、PushPluginおよびネットワーク情報の各プラグインが有効になっているMAFアプリケーションのエントリを示します。デバイスの電子メール・クライアントを使用し、インターネットにアクセスして、デバイスからプッシュ通知を受信しているMAFアプリケーションでは、これらのプラグインの有効化は必須です。

例9-1 maf-plugins.xmlファイル内の有効なコア・プラグイン

<?xml version="1.0" encoding="UTF-8" ?>
<maf-plugins xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/adf/mf">
<cordova-plugins>
<core-cordova-plugin id="c1" pluginId="org.apache.cordova.network-information"/>
<core-cordova-plugin id="c2" pluginId="com.oracle.maf.email"/>
<core-cordova-plugin id="c3" pluginId="com.phonegap.plugins.PushPlugin"/>
</cordova-plugins>
</maf-plugins>

9.3 MAFアプリケーションでの追加プラグインの登録

MAFに用意されたコア・プラグインでは提供されていない機能がMAFアプリケーションで必要な場合は、MAFアプリケーションに追加プラグインを登録します。

9.3.1 追加プラグインを登録する方法

MAFアプリケーションで使用する追加プラグインを登録するには、MAFアプリケーションのmaf-application.xmlファイルの概要エディタを使用します。

始める前に、プラグインを登録するアプリケーションと同じドライブに、対象のプラグインが格納されていることを確認します。たとえば、Windows環境でC:ドライブにアプリケーションが格納されている場合、そのアプリケーションに登録するプラグインもC:ドライブに格納する必要があります。これにより、JDeveloperでは相対パスを使用してアプリケーションにプラグインを正常に登録できます。

MAFアプリケーションに追加プラグインを登録する手順:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開きます。

2. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

3. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「プラグイン」ナビゲーション・タブをクリックします。

4. 「追加のプラグイン」セクションを展開し、「追加」アイコンをクリックしてダイアログを表示し、アプリケーションに登録するプラグインが格納されているディレクトリを参照して選択します。

9.3.2 MAFアプリケーションに追加プラグインを登録する場合の処理

MAFアプリケーションで使用するプラグインのソース・ファイルを選択すると、JDeveloperによってアプリケーションのmaf-plugins.xmlファイルが編集され、MAFアプリケーションで有効なプラグインを特定するエントリが追加されます。例9-2は、MAFアプリケーションにカレンダプラグイン(図9-2を参照)が登録されている場合のmaf-plugins.xmlファイル内のエントリを示したものです。

図9-2 maf-application.xmlファイルの概要エディタに表示された追加プラグイン

例9-2 maf-plugins.xmlファイル内の追加プラグイン

<?xml version="1.0" encoding="UTF-8" ?>
<maf-plugins xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/adf/mf">
<cordova-plugins>
<core-cordova-plugin id="c1" pluginId="org.apache.cordova.network-information"/>
<cordova-plugin id="c2" pluginId="nl.x-services.plugins.calendar"
path="../../../../../z_plugins/Calendar-PhoneGap-Plugin-master/">
<platform id="p1" name="android" enabled="true"/>
<platform id="p2" name="ios" enabled="true"/>
</cordova-plugin>
</cordova-plugins>
</maf-plugins>

9.4 MAFアプリケーション組込みプラグインのデプロイ

MAFアプリケーション組込みプラグインのデプロイメントは、選択したデプロイメント方法によって異なります。

FARへのデプロイメント

FARへのデプロイメントには、アプリケーションのmaf-plugins.xmlファイルのコピー(ファイル名: jar-maf-plugins.xml)が含まれます。これは、アプリケーションのmaf-plugins.xmlファイルと同じですが、各プラグインのpath属性値が空の文字列である点が異なります。FARデプロイメントにはプラグインのソース・ファイルは含まれません。

モバイル・アプリケーション・アーカイブ・ファイルへのデプロイメント

モバイル・アプリケーション・アーカイブ・ファイルへのデプロイメントには、すべてのpath属性が空の文字列に設定された、アプリケーションのmaf-plugins.xmlファイルのコピーが含まれます。

AndroidまたはiOSデプロイメント・プロファイルを使用したデプロイメント

AndroidまたはiOSデプロイメント・プロファイルを使用してデプロイする場合は、JDeveloperがmaf-helperコマンドライン・ツールを起動して、構成済プラグインをデプロイします。maf-helperコマンドライン・ツールでは、プラグイン・アーティファクトがそれぞれのソースの場所からAndroidまたはiOSのデプロイメント・フォルダにデプロイされます。コマンドライン・ツールでプラグインがデプロイされると、デプロイメントではそのプラグインをプラットフォーム固有のアプリケーションに組み込みます。

プラグイン間における名前の競合の解決

MAFアプリケーションで使用されている複数のプラグインに同じ名前のリソース・ファイルが含まれている場合、名前の競合が原因でデプロイメントに失敗する可能性があります。たとえば、MAFアプリケーションで2つのプラグインを使用し、両方のリソース・ファイルがarrays.xmlである場合、デプロイメントは失敗します。

このような名前の競合を解決するには、2番目のプラグインのリソース・ファイル名と競合している1番目のプラグインのリソース・ファイル名を変更します。1番目のプラグインのplugin.xmlファイル内で、リソース・ファイルへの参照を更新します。この例では、1番目のプラグインのarray.xmlリソース・ファイル名をpluginone_arrays.xmlに変更して、プラグインのplugin.xmlファイルを次のように編集する必要があります。

<source-file src="src/android/LibraryProject/res/values/pluginone_arrays.xml"
target-dir="res/values"/>

不足している依存プラグインの追加

MAFアプリケーションで使用する追加プラグインに必要なプラグイン(依存プラグイン)が検出されないと、デプロイメントに失敗する場合があります。このシナリオは、ファイアウォールで保護されている場合に発生する可能性があり、その原因は、デプロイ時にJDeveloperがApache Cordovaのツールを起動してプラグインの依存性を管理するためです。後者のツールは、依存プラグインのダウンロードを許可するようにプロキシ設定が構成されていないと、依存プラグインのダウンロードに失敗する場合があります。このシナリオを回避するには、不足している依存プラグインをダウンロードして、MAFアプリケーションに追加します。不足している依存プラグインの追加は、MAFアプリケーションに他のプラグインを追加する場合と同じ方法で行います。詳細は、第9.3項「MAFアプリケーションでの追加プラグインの登録」を参照してください。依存プラグインを追加したら、maf-plugins.xmlファイルで、必要とされるプラグインの前にこのプラグインが表示されていることを確認してください(例9-3を参照)。

例9-3 MAFアプリケーションへの依存プラグインの追加

<maf-plugins xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/adf/mf">
<cordova-plugins>
....
<cordova-plugin id="c2" pluginId="com.example.dependent.dependentPlugin"
path="../../../../../plugins/Dependent-Plugin-Required-By-PluginWithID_c3/">
...
<cordova-plugin id="c3" pluginId="com.example.plugin"
path="../../../../../plugins/AdditionalPlugin/">
...
</cordova-plugins>
</maf-plugins>

9.5 機能アーカイブ・ファイルからのプラグインのインポート

jar-maf-plugins.xmlファイルが格納されたFARをアプリケーションにインポートすると、jar-maf-plugins.xmlファイルの内容は使用するアプリケーションのmaf-plugins.xmlファイルにマージされます。JDeveloperではマージに関する情報を「メッセージ」ウィンドウに記録します。FARからインポートするプラグインがすでにコンシューマ・アプリケーションのmaf-plugins.xmlファイルに存在する場合、プラグインはアプリケーションに存在するのでマージされないというメッセージがJDeveloperによってログに記録されます。FARからインポートするプラグインがコンシューマ・アプリケーションのmaf-plugins.xmlファイルに存在しない場合、JDeveloperはそのプラグインをアプリケーションのmaf-plugins.xmlファイルに追加します。このシナリオでは、第9.3項「MAFアプリケーションでの追加プラグインの登録」の説明に従って、新しくインポートしたプラグインへのパスを設定する必要があります。

10 MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ

この章では、Oracle Metadata Services (MDS)を使用してMAFアプリケーション・レベルのアーティファクトのカスタマイズを実行する方法について説明します。

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

- 第10.1項「MDSカスタマイズをMAFファイルに適用する方法の概要」

- 第10.3項「カスタマイズ・レイヤーの構成」

- 第10.4項「カスタマイズ・クラスの作成」

- 第10.5項「カスタマイズ・クラスの使用」

- 第10.6項「「カスタマイズ開発者」ロールの理解」

- 第10.7項「Webサービス・データ・コントロールとカスタマイズしたアプリケーションのデプロイメントに関する必知事項」

- 第10.8項「リソース・バンドルでのカスタマイズの有効化」

- 第10.9項「カスタマイズを使用したMAFアプリケーションのアップグレード」

10.1 MDSカスタマイズをMAFファイルに適用する方法の概要

Oracle Metadata Services (MDS)を使用すると、実行時にアプリケーションの再ブランディング、カスタマイズおよびパーソナライズを行うことができます。MDSでは、単一のアプリケーションを様々な産業、場所またはユーザー・グループに適応させることができます。後者の場合、たとえば、MDSを使用して、ユーザー・グループまたはユーザー職責にあわせてルック・アンド・フィールを調整できます。

カスタマイズしたアプリケーションは、ベース・アプリケーションとカスタマイズの1つ以上のレイヤーで構成されます。1つのアプリケーションで複数のカスタマイズ・レイヤーを使用でき、各レイヤーでは複数のレイヤー値を使用できます。これらのレイヤー値を、指定の優先順位に従ってベース・メタデータの最上位に適用できます。MDSでは、これらのカスタマイズをMDSリポジトリに格納し、実行時に取得します。MDSは、作成されたカスタマイズを別のMDSリポジトリに保存するため、ベース・アプリケーションは変更されません。メタデータ・サービス・リポジトリの構成の詳細は、『Oracle Fusion Middleware管理者ガイド』のOracle Metadata Repositoryの管理に関する項を参照してください。

MDSでは、次の2つのカスタマイズ・パターンを使用できます。

- シード・カスタマイズ: シード・カスタマイズとは、実行時に適用されるカスタマイズ・レイヤーを定義して、汎用アプリケーションを特定のグループ(特定の産業やサイトなど)に適応させます。これらのシード・カスタマイズはデプロイされたアプリケーションの一部として存在し、特定のデプロイの存続期間中保持されます。

- ユーザー・カスタマイズ(変更永続性): エンド・ユーザーは実行時に個々のプリファレンス(表にどの列を表示するかなどの選択が可能)にあわせてアプリケーションのコンテンツをパーソナライズできます。これらの変更はユーザーのセッション間で保持され、ユーザーがアプリケーションにアクセスするたびに一貫して表示されます。

MDSを使用して、MAFアプリケーションの次のアーティファクトをカスタマイズできます。

- maf-feature.xmlファイル

- maf-skins.xmlファイル

- maf-application.xmlファイル

- maf-config.xmlファイル

- MAF AMXファイルおよびメタデータ・ファイル(第18章「MAF AMXアプリケーション機能アーティファクトのカスタマイズ」を参照)

10.2 MDSによるMAFアプリケーションのカスタマイズ

MDSを使用してMAFアプリケーションをカスタマイズするには、次を実行します。

1. 1つ以上のグローバルまたはアプリケーション固有のカスタマイズ・レイヤーを定義します。詳細は、第10.3項「カスタマイズ・レイヤーの構成」を参照してください。

2. MDSでベース・アプリケーションに適用するカスタマイズの決定に使用するカスタマイズ・クラスを作成します。各カスタマイズ・クラスは、ベース・カスタマイズ・レイヤーを定義します。詳細は、第10.4項「カスタマイズ・クラスの作成」を参照してください。

3. カスタマイズ・クラス(.javaファイル)をJARファイルとしてパッケージ化した後、そのJARファイルをMAFアプリケーションのどちらかのプロジェクトに追加することにより、JDeveloperデザインタイムがカスタマイズにアクセスできるようにします。詳細は、第10.5項「カスタマイズ・クラスの使用」を参照してください。

4. adf-config.xmlファイルのcust-configセクションにカスタマイズ・クラスを追加して、優先順位に従ってカスタマイズ・クラスを登録します。

5. 「カスタマイズ開発者」ロールでJDeveloperを起動するか、そのロールに切り替えます。詳細は、第10.6項「「カスタマイズ開発者」ロールの理解」を参照してください。

6. ファイルに必要な変更を加えます。変更はMDSにより、ViewControllerプロジェクトのmdssysディレクトリに記録されます。

7. 「カスタマイズ・コンテキスト」ウィンドウからカスタマイズ・レイヤーを選択します(図10-1を参照)。

図10-1 カスタマイズ・レイヤーの選択(ヒント・レイヤー)

注意:
「カスタマイズ開発者」ロールで作業する際、「カスタマイズ・コンテキスト」ウィンドウで選択したレイヤーとレイヤー値をヒント・レイヤーと呼びます。「カスタマイズ開発者」ロールで作業中に行った変更は、このレイヤーにのみ適用されます。

8. アプリケーションを、デバイス、エミュレータにデプロイするか、プラットフォーム固有のアプリケーション・パッケージとしてデプロイします。カスタマイズしたアプリケーションをデプロイするには、次のように「カスタマイズ開発者」ロールを使用する必要があります。

1. 「カスタマイズ開発者」ロールで、アプリケーションを起動します。

2. 「カスタマイズ・コンテキスト」ウィンドウ(図10-1)で、カスタマイズを実装するレイヤーと値を選択します。

3. デプロイメント・オプションから選択します(「アプリケーション」→「デプロイ」を選択し、デプロイメント・プロファイルを選択してアクセスします)。詳細は、第27章「MAFアプリケーションのデプロイ」を参照してください。

4. 各カスタマイズ・コンテキストに対して別のデプロイメントを実行します。

デプロイメント時に、ベース・ファイルおよびデルタ・ファイルがマージされ、実行時のアプリケーションのカスタマイズ・バージョンが作成されます。デプロイされたアプリケーションには、MDSの依存性はありません。

ヒント:
カスタマイズしたアプリケーションをMAFアプリケーション・アーカイブ(.maa)ファイルとしてデプロイして、このファイルをアプリケーションにインポートし、別のカスタマイズを実行したり、アップグレードすることもできます。.maaファイルに含まれるデルタ・ファイルは、デプロイメント後にベース・ファイルとマージされます。詳細は、第10.9項「カスタマイズを使用したMAFアプリケーションのアップグレード」を参照してください。

カスタマイズ・プロセスが完了すると、JDeveloperにより該当するカスタマイズ用のメタデータ・ファイルとこれらを格納するサブパッケージが作成されます。メタデータ・ファイルにはカスタマイズしたオブジェクトのカスタマイズが含まれ、これらは実行時にベース・メタデータに適用されます。JDeveloperでは、新しいメタデータ・ファイルにオブジェクトのベース・ファイルと同じ名前が付けられますが、.xml拡張子が追加されます(図10-2のmaf-feature.xml.xmlを参照)。

図10-2 maf-feature.xmlメタデータ・ファイル

10.3 カスタマイズ・レイヤーの構成

アプリケーションをカスタマイズするには、JDeveloperで認識できるように、CustomizationLayerValues.xmlファイルでカスタマイズ・レイヤーとその値を指定する必要があります。

カスタマイズ可能なアプリケーションを「カスタマイズ開発者」ロールで開くと、JDeveloperによりadf-config.xmlファイルが読み取られ、使用するカスタマイズ・クラスと優先順位が判別されます。また、CustomizationLayerValues.xmlファイルも読み取られ、「カスタマイズ・コンテキスト」ウィンドウで使用可能にするレイヤー値が判別されます。CustomizationLayerValues.xmlファイルで定義されたレイヤー値がカスタマイズ・クラス(adf-config.xmlファイルにリストされている)で定義されていない場合、これらは「カスタマイズ・コンテキスト」ウィンドウに表示されません。

したがって、CustomizationLayerValues.xmlファイルにすべてのカスタマイズ・プロジェクトの包括的なレイヤー値リストを含めて、現在のアプリケーションに適したもののみを「カスタマイズ・コンテキスト」ウィンドウに表示できます。逆に、MAFアプリケーションの包括的なカスタマイズ・クラスのリストをadf-config.xmlファイルに含めて、作業するレイヤー値のサブセットのみをCustomizationLayerValues.xmlファイルに含めることもできます。

注意:
デザインタイムには、JDeveloperはCustomizationLayerValues.xmlファイルからカスタマイズ・レイヤー値を取得します。ただし、ランタイムには、レイヤー値はカスタマイズ・クラスから取得されます。

CustomizationLayerValues.xmlファイルに入力するレイヤー名およびレイヤー値は、カスタマイズ・クラスで指定されたものと一致する必要があります。次の例は、サンプルのCustomizationLayerValues.xmlファイルの内容を示しています。

<cust-layers  xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer name="industry" id-prefix="i">
<cust-layer-value value="financial"
display-name="Financial"
id-prefix="f"/>
<cust-layer-value value="healthcare"
display-name="Healthcare"
id-prefix="h"/>
</cust-layer>
<cust-layer name="site" id-prefix="s">
<cust-layer-value value="headquarters"
display-name="HQ"
id-prefix="hq"/>
<cust-layer-value value="remoteoffices"
display-name="Remote"
id-prefix="rm"/>
</cust-layer>
</cust-layers>

各レイヤーとレイヤー値に、id-prefixトークンを追加できます。これによりidの一意性を確保し、カスタマイズを正確に適用できます。カスタマイズ中に新規要素を追加すると、(選択したヒント・レイヤーで決定された)レイヤーとレイヤー値のid-prefixが要素の自動生成識別子に追加され、カスタマイズ・メタデータ・ファイルで新たに追加された要素のidが作成されます。前述の例では、siteレイヤーにsというid-prefixが付けられ、headquartersレイヤー値にhqというid-prefixが付けられています。 したがって、ヒント・レイヤーとしてsite/headquartersを選択して要素を追加すると、その要素のidはメタデータ・カスタマイズ・ファイルでshqelに設定されます。

各レイヤー値にdisplay-nameトークンを追加して、レイヤー値に人間が判読可能な名前を指定することもできます。「カスタマイズ開発者」ロールで作業する際、そのレイヤー値のdisplay-nameトークンの値が「カスタマイズ・コンテキスト」ウィンドウに表示されます。

レイヤーごとに、カスタマイズ・レイヤーに対する値セットのサイズを定義するvalue-set-sizeトークンを、オプションで設定できます。これは、たとえば、設計時にアプリケーション固有のCustomizationLayerValues.xmlファイルを使用する場合などに役立ちます。value-set-sizeをno_valuesに設定することで、デザインタイムにランタイムのみのレイヤーを除外できます。

<cust-layer name="runtime_only_layer" value-set-size="no_values"/>

カスタマイズ・レイヤー値はJDeveloper用にグローバルにまたはアプリケーション固有ファイルで定義できます。アプリケーション固有ファイルを使用する場合、このファイルはグローバル・ファイルより優先されます。JDeveloper用にグローバルにレイヤー値を構成する方法の詳細は、第10.3.1項「レイヤー値をグローバルに構成する方法」を参照してください。アプリケーション固有のレイヤー値を構成する方法の詳細は、第10.3.2.1項「Studio開発者ロールの使用方法」を参照してください。

10.3.1 レイヤー値をグローバルに構成する方法

始める前に

- 第10.4項「カスタマイズ・クラスの作成」の説明に従って、カスタマイズ・クラスを作成します。

- 第10.5項「カスタマイズ・クラスの使用」の説明に従って、クラスをJDeveloperで使用できるようにします。

JDeveloper用にデザインタイム・カスタマイズ・レイヤー値をグローバルに構成するには:

1. JDeveloperインストール・ディレクトリのjdevサブディレクトリにあるCustomizationLayerValues.xmlファイル(jdev_install\jdev\CustomizationLayerValues.xml)を開きます。

2. 各レイヤーについて、次の例に示すようにcust-layer要素を入力します。

<cust-layers  xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer name="industry" id-prefix="i">
<cust-layer-value value="financial"
display-name="Financial"
id-prefix="f"/>
<cust-layer-value value="healthcare"
display-name="Healthcare"
id-prefix="h"/>
</cust-layer>
<cust-layer name="site" id-prefix="s">
<cust-layer-value value="headquarters"
display-name="HQ"
id-prefix="hq"/>
<cust-layer-value value="remoteoffices"
display-name="Remote"
id-prefix="rm"/>
</cust-layer>
</cust-layers>

3. 各レイヤー値に、前の例に示したようにcust-layer-value要素を入力します。

4. CustomizationLayerValues.xmlファイルを保存して閉じます。

5. グローバルなCustomizationLayerValues.xmlファイルに変更を加えたら、JDeveloperを再起動します。

10.3.2 アプリケーションレベルのレイヤー値の構成方法

アプリケーションのレイヤー値を構成する場合、Studio開発者ロール(第10.3.2.1項「Studio開発者ロールの使用方法」を参照)または「カスタマイズ開発者」ロール(第10.3.2.2項「「カスタマイズ開発者」ロールの使用方法」を参照)のいずれかを使用できます。アプリケーション固有のCustomizationLayerValues.xmlファイルを構成する場合、レイヤー値を作成および変更できますが、追加のカスタマイズ・レイヤーを作成できません。アプリケーション固有のレイヤー値に対して行った変更を適用するためにJDeveloperを再起動する必要はありません。

アプリケーション固有のCustomizationLayerValues.xmlファイルを作成すると、JDeveloperはこのファイルをアプリケーション・レベルのディレクトリに格納します(workspace-directory\.mds\dt\customizationLayerValues\CustomizationLayerValues.xmlなど)。このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」ウィンドウのMDS DTノードの下にあります。

10.3.2.1 Studio開発者ロールの使用方法

次に、Studio開発者ロールで特定アプリケーションのCustomizationLayerValues.xmlファイルを構成する手順について説明します。

始める前に

- 第10.4項「カスタマイズ・クラスの作成」の説明に従って、カスタマイズ・クラスを作成します。

- 第10.5項「カスタマイズ・クラスの使用」の説明に従って、クラスをJDeveloperで使用できるようにします。

Studio開発者ロールからワークスペース・レベルでデザインタイム・カスタマイズ・レイヤー値を構成するには:

1. 「アプリケーション・リソース」ウィンドウで、「ディスクリプタ」→「ADF META-INF」ノードを開き、adf-config.xmlをダブルクリックします。

2. 概要エディタで、「MDS構成」ナビゲーション・タブをクリックします。

3. カスタマイズ・クラスの表の下の「MDS構成」ページで、「デザインタイム・カスタマイズ・レイヤー値の構成」をクリックして、ワークスペース・レベルのCustomizationLayerValues.xmlファイルをソース・エディタで開きます。

注意:
オーバーライド・ファイルが存在しない場合、JDeveloperは、確認ダイアログを表示します。「はい」をクリックして、グローバル・ファイルのコピーを作成して開きます。

4. このファイルで、第10.3項「カスタマイズ・レイヤーの構成方法」の説明に従って、必要なレイヤー値を指定します。

5. 変更を保存します。

10.3.2.2 「カスタマイズ開発者」ロールの使用方法

次に、「カスタマイズ開発者」ロールで特定アプリケーションのCustomizationLayerValues.xmlファイルを構成する手順について説明します。

始める前に

- 第10.4項「カスタマイズ・クラスの作成」の説明に従って、カスタマイズ・クラスを作成します。

- 第10.5項「カスタマイズ・クラスの使用」の説明に従って、クラスをJDeveloperで使用できるようにします。

「カスタマイズ開発者」ロールからワークスペース・レベルでデザインタイム・カスタマイズ・レイヤー値を構成するには:

1. 「カスタマイズ・コンテキスト」ウィンドウで、「アプリケーション・レイヤー値の構成」をクリックし、CustomizationLayerValues.xmlファイルをソース・エディタで開きます。

注意:
オーバーライド・ファイルが存在しない場合、JDeveloperは、確認ダイアログを表示します。「はい」をクリックして、グローバル・ファイルのコピーを作成して開きます。

2. このファイルで、第10.3項「カスタマイズ・レイヤーの構成方法」の説明に従って、必要なレイヤー値を指定します。

3. 変更を保存します。

「カスタマイズ開発者」ロールの間にアプリケーション固有のCustomizationLayerValues.xmlファイルに対して変更を行った後、「カスタマイズ・コンテキスト」ウィンドウで選択したヒント・レイヤーが選択解除されます。必要なヒント・レイヤーを選択できます。

10.4 カスタマイズ・クラスの作成

カスタマイズ・クラスはoracle.mds.cust.CustomizationClassを拡張するPOJOクラスです。現在のコンテキストが評価されてStringの結果が戻されます。このStringの結果を使用してカスタマイズ・レイヤーが検索されます。

カスタマイズ・クラスによって、次の情報が提供されます。

- レイヤー名を表す名前。

- レイヤーで作成されたオブジェクトのIDPrefix。カスタマイズ・レイヤーで新しいオブジェクトを作成する場合、一意のIDが必要です。オブジェクトの自動生成IDにIDPrefixが追加されて、新たに追加されたオブジェクトのIDが作成されます。異なるカスタマイズ・レイヤーで作成されたオブジェクトに一意のIDを指定するために、各レイヤーに一意のIDPrefixを指定する必要があります。

- カスタマイズ・クラスによって定義されたレイヤーのキャッシュ・ヒント(CacheHint)。MAFでは、キャッシュ・ヒントによって静的なカスタマイズ・レイヤーが定義され、getCacheHintメソッドは常にALL_USERSを返し、これは特定のデプロイメントに対しカスタマイズがグローバルに(無条件で)適用されることを意味します。

注意:
カスタマイズ・クラスは頻繁に実行されることが多いため(レイヤー名とレイヤー値を取得するために、アクセスされるドキュメントごとに1回)、効率性を確保するようにしてください。

カスタマイズを使用して、特定の業種ドメインにあわせてMAFアプリケーションを調整できます(垂直統合)。このようなドメインはそれぞれカスタマイズ・レイヤーを表しており、カスタマイズ・クラスを使用して示されます。

静的なカスタマイズには、アプリケーションのすべての実行に適用されるレイヤー値が1つのみあります。静的なカスタマイズでは、アプリケーションを実行するすべてのユーザーでカスタマイズの値が同じです。

MAFアプリケーションで使用されるカスタマイズ・クラスでは、getCacheHintメソッドは常にALL_USERSを返し、これはカスタマイズ・レイヤーが常に静的であることを意味します。

カスタマイズ・クラスの実装方法によっては、すべてのオブジェクトが静的なカスタマイズ・レイヤーを持つことができます。

カスタマイズするMAFアプリケーション内にカスタマイズ・ファイルを作成しないでください。かわりに、カスタマイズ・クラスに対して別のJavaアプリケーションを作成します。Javaクラスの作成が完了した後で、カスタマイズするMAFアプリケーションにそのクラスをインポートします。

カスタマイズ・クラスを作成するには:

1. Javaアプリケーションを作成します。

2. 「ファイル」→「新規」→「プロジェクト」をクリックします。

3. 「新規ギャラリ」で、「Javaアプリケーション・プロジェクト」を選択し、ウィザードを完了します。

4. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックして、「プロジェクト・プロパティ」を選択します。

5. 「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」をクリックしてから「ライブラリの追加」を選択します。

6. 「ライブラリの追加」ダイアログで、MDSランタイムを選択し、「OK」をクリックします。「OK」をクリックして、「プロジェクト・プロパティ」ダイアログを閉じます。

7. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「新」→「Javaクラス」を選択します。

8. 「Javaクラスの作成」ダイアログで、クラスの名前およびパッケージを入力します。

9. 「拡張」フィールドで、クラス階層を参照し、oracle.mds.cust.CustomizationClassを取得してから(図10-3を参照)、「OK」をクリックします。

注意:
「抽象メソッドの実装」(デフォルトの設定)を「Javaクラスの作成」ダイアログで選択する必要があります。

図10-3 カスタマイズ・クラスの作成

10. スタブ・ファイルを更新します。次の例は、カスタマイズ・クラスを示しています。

package mobile;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import oracle.mds.core.MetadataObject;
import oracle.mds.core.RestrictedSession;
import oracle.mds.cust.CacheHint;
import oracle.mds.cust.CustomizationClass;

public class SiteCC extends CustomizationClass {
private static final String DEFAULT_LAYER_NAME = "site";
private String mLayerName = DEFAULT_LAYER_NAME;

public SiteCC() {}

public SiteCC (String layerName) {
mLayerName = layerName;
}

public CacheHint getCacheHint() {
return CacheHint.ALL_USERS;
}

public String getName() {
return mLayerName;
}

public String[] getValue(RestrictedSession restrictedSession, MetadataObject metadataObject) {
// This needs to return te site value at runtime.
// For now, it's always null
Properties properties = new Properties();
String configuredValue = null;
Class clazz = SiteCC.class;
InputStream is  = clazz.getResourceAsStream("/customization.properties");

if (is != null){
try {
properties.load(is);
String propValue = properties.getProperty(mLayerName);
if (propValue != null){
configuredValue = propValue;
}
}
catch (IOException e) {
e.printStackTrace();
}
}

return new String[] {configuredValue};
}
}

11. Javaアプリケーション・プロジェクトを再ビルドします。

10.5 カスタマイズ・クラスの使用

カスタマイズ・クラスを作成後、これらをデザインタイムに「カスタマイズ開発者」ロールで、およびランタイムにアプリケーションで使用できます。アプリケーションまたはJDeveloperで使用するには、クラスを適切にパッケージ化する必要があります。

カスタマイズ・クラスは再利用可能コンポーネントであるため、別個のプロジェクトを作成してこれにカスタマイズ・クラスを含めて、独自のJARファイルにパッケージ化できます。その後、使用するアプリケーションにJARをインポートし、カスタマイズ・クラスをJDeveloperで使用できます。

最初に、カスタマイズ・クラスをJARファイルとしてパッケージ化し、このクラスをMAFアプリケーションに登録する必要があります。カスタマイズ・クラスおよび関連するアーティファクトをJARファイルにパッケージ化するには、「デプロイメント・プロファイルの作成」ウィザードを使用してデプロイメント・プロファイルを作成する必要があります。詳細は、第27.2.1項「自動的に生成されるデプロイメント・プロファイルについて」を参照してください。

JARにカスタマイズ・クラスを追加する手順:

1. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「新」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「一般」を展開し、「デプロイメント・プロファイル」、「JARファイル」の順に選択して、「OK」をクリックします。

ヒント:
「カテゴリ」ツリーに「デプロイメント・プロファイル」ノードが表示されない場合、「すべての機能」タブをクリックします。

3. 「デプロイメント・プロファイルの作成」 -- 「JARファイル」ダイアログで、プロジェクト・デプロイメント・プロファイルの名前(図10-4のSiteCCなど)を入力して、「OK」をクリックします。

図10-4 カスタマイズ・クラスのデプロイメント・プロファイルの作成

4. 「JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「JARオプション」を選択します。

5. 必要に応じて、JARファイルの場所を入力します。または、デフォルトの場所を使用します。

6. ファイル・グループ→「プロジェクトの出力」→「フィルタ」を開き、JARに含むように選択できるファイルを一覧表示します。

7. 「フィルタ」ページの「ファイル」タブで、JARファイルに追加するカスタマイズ・クラスを選択します(図10-5を参照)。

図10-5 カスタマイズ・クラスをJARファイルに含める

8. 「OK」をクリックして、「JARデプロイメント・プロファイルのプロパティの編集」ダイアログを終了します。

9. 「OK」を再度クリックして、プロジェクト・プロパティのダイアログを終了します。

10. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「デプロイメント・プロファイル」を選択します。「デプロイメント・アクション」ページ(図10-6を参照)では、「JARにデプロイ」がデフォルトで選択されています。「次へ」をクリックします。

図10-6 カスタマイズ・クラスのJARファイルへのデプロイ

11. JARファイルの出力場所の確認メッセージを確認します。「OK」をクリックします。

図10-7「サマリー」ページ(JARファイルの出力場所を示す)

「ログ・ファイル」ウィンドウ(図10-8)では、デプロイメントのステータスが表示されます。

図10-8 デプロイメント・ログ

次の手順を使用してアプリケーションでカスタマイズ・クラスを表示できるようにしてから、カスタマイズ・クラスをadf-config.xmlファイルのcust-configセクションに追加します。

注意:
使用するアプリケーションのデータ・モデル・プロジェクトでカスタマイズ・クラスを作成した場合、次の手順は不要です。

始める前に

- 外部プロジェクトにカスタマイズ・クラスを作成します。

- カスタマイズ・クラスを含むJARファイルを作成します。

- Studio開発者ロールを使用してJDeveloperを起動し、カスタマイズするアプリケーションを開きます。

カスタマイズ・クラスをMAFアプリケーションに登録する手順:

1. 「アプリケーション」ウィンドウで、「アプリケーション・メニュー」アイコンをクリックして、「アプリケーションのプロパティ」を選択します。

2. 「アプリケーションのプロパティ」ダイアログで、「ライブラリとクラスパス」を選択し、「JAR/ディレクトリの追加」をクリックします。

3. 「アーカイブまたはディレクトリの追加」ダイアログで、カスタマイズ・クラスを含む作成済JARファイルを選択して、「開く」をクリックします。

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

次に、カスタマイズ・クラスをadf-config.xmlファイルに追加します。アプリケーションのadf-config.xmlファイルでは、mds-configセクションで適切なcust-config要素が指定されている必要があります。クライアントはcust-config要素を使用して、順序付けされ、名前が付けられたカスタマイズ・クラスのリストを定義できます。adf-config.xmlファイルの概要エディタを使用して、カスタマイズ・クラスを追加します(図10-9を参照)。

adf-config.xmlファイルでカスタマイズ・クラスを識別するには:

1. 「アプリケーション・リソース」ウィンドウで、「ディスクリプタ」→「ADF META-INF」ノードを開き、adf-config.xmlをダブルクリックします。

2. 概要エディタで、「MDS」ナビゲーション・タブを選択し、「追加」(+)をクリックします。

3. 「カスタマイズ・クラスの編集」ダイアログで、作成済のカスタマイズ・クラスを検索するか、作成済のカスタマイズ・クラスに移動します。

4. 適切なクラスを選択して、「OK」をクリックします。

5. カスタマイズ・クラスをすべて追加した後、矢印アイコンを使用して適切な順序で配置できます。

図10-9は、2つのカスタマイズ・クラスが追加されたadf-config.xmlファイルの概要エディタを示しています。

図10-9 adf-config.xmlの概要エディタ

customization-class要素の順序により、カスタマイズ・レイヤーの優先順位が指定されます。たとえば、adf-config.xmlファイルのカスタマイズ・クラス順序を表す次のコードでは、IndustryCCクラスはSiteCCクラスの前にリストされています。これは、industryレイヤーでのカスタマイズがベース・アプリケーションに適用されてから、siteレイヤーでのカスタマイズが適用されることを示します。

<adf-config xmlns="http://xmlns.oracle.com/adf/config">
<adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
<mds-config xmlns="http://xmlns.oracle.com/mds/config" version="11.1.1.000">
<cust-config>
<match path="/">
<customization-class name="com.mycompany.IndustryCC"/>
<customization-class name="com.mycompany.SiteCC"/>
</match>
</cust-config>
</mds-config>
</adf-mds-config>
</adf-config>

完了したら、JDeveloperでプロジェクトをローカルに実行するためやカスタマイズのために、カスタマイズ・クラスを使用できます。またこれらは、アプリケーションをパッケージ化するときに、EARクラス・パスにパッケージ化されます。

10.6 「カスタマイズ開発者」ロールの理解

JDeveloperでは、「カスタマイズ開発者」ロールを使用して、プロジェクトのメタデータをカスタマイズします。カスタマイズ機能は、このロールでのみ使用できます。「カスタマイズ開発者」ロールでは、次の作業を実行できます。

- カスタマイズの作成および更新

- カスタマイズしたアプリケーションのヒント・レイヤーの選択および編集

- 既存のカスタマイズの削除

「カスタマイズ開発者」ロールでJDeveloperを使用する場合、ソース・エディタは読取り専用になり、次のJDeveloperの機能が無効になります。

- ワークスペースの移行

- アプリケーションおよびIDE接続の作成、削除および変更「カスタマイズ開発者」ロールでアプリケーションを開く前に、デフォルト・ロールで接続を構成する必要があります。

「カスタマイズ開発者」ロールでアプリケーションを使用する場合、新規オブジェクトやファイルは作成できず、カスタマイズ不能オブジェクトは変更できません。また、Javaクラス、リソース・バンドル、セキュリティ・ポリシー、デプロイメント・ディスクリプタ、構成ファイルなどのカスタマイズ不能ファイルの編集もできません。

注意:
「カスタマイズ開発者」ロールで作業している際、カスタマイズ不能ファイルはロック・アイコンで示されます。

また、プロジェクト設定も変更できないので、カスタマイズ不能ファイルの変更が必要になる場合には、カスタマイズ可能ファイルのリファクタや変更もできません。

詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のJDeveloperロールの操作に関する項を参照してください。

10.6.1 JDeveloperでの「カスタマイズ開発者」ロールへの切替え

「カスタマイズ開発者」ロールでは、JDeveloperのカスタマイズ機能を使用できます。このロールで作業するには、JDeveloperの起動時に選択するか、JDeveloperがすでに実行されている場合は「ロールの切替え」メニューで「カスタマイズ開発者」ロールに切り替えます。

JDeveloperで「カスタマイズ開発者」ロールに切り替えるには:

JDeveloperのメイン・メニューで「ツール」→「ロールの切替え」→「カスタマイズ開発者」の順に選択します。

オプションで、「ツール」→「ロールの切替え」→「起動時にロール選択を常に要求」メニューを切り替え、JDeveloper起動時にロールを選択するかどうかを指定できます。この選択を解除すると、JDeveloperは、最後に閉じたときのロールで起動します。

10.6.2 ヒント・レイヤーに関する必知事項

「カスタマイズ開発者」ロールで作業する際、「カスタマイズ・コンテキスト」ウィンドウで選択したレイヤーとレイヤー値の組合せをヒント・レイヤーと呼びます。このレイヤーには、「カスタマイズ開発者」ロールで作業中に行った変更が適用されます。

注意:
「カスタマイズ開発者」ロールで作業している場合、「カスタマイズ・コンテキスト」ウィンドウが表示されない場合は、JDeveloperの「ウィンドウ」メニューからアクセスできます。

JDeveloperのエディタに表示されるメタデータは、ベース・メタデータと(adf-config.xmlで設定された優先順位に従った)ヒント・レイヤーまでのカスタマイズ・レイヤーを組み合せたもので、各レイヤーの値は「カスタマイズ・コンテキスト」ウィンドウで指定したものです。

「カスタマイズ開発者」ロールでの作業時には、アプリケーションのカスタマイズされていない状態も確認できます。「カスタマイズ・コンテキスト」ウィンドウで「カスタマイズなしで表示」が選択されている場合、現在使用しているヒント・レイヤーはありません。したがって、表示されているのはカスタマイズされていない状態です。このビューでは、(「アプリケーション」ウィンドウの)カスタマイズ可能ファイルすべてにロック・アイコンが表示され、これらのファイルが読取り専用であることが示されます。

ヒント・レイヤーで行ったカスタマイズは、「プロパティ」ウィンドウではオレンジのアイコンで示されます。緑のアイコンは、ヒント以外のレイヤーのカスタマイズを示します。プロパティの横にオレンジのアイコンが表示されている場合、そのプロパティのドロップダウン・メニューから「カスタマイズ・アクションの削除」を選択して、そのカスタマイズを削除できます。

10.7 Webサービス・データ・コントロールとカスタマイズしたアプリケーションのデプロイメントに関する必知事項

WebサービスJava Bean定義(JBD)ファイルは、カスタマイズ・デプロイメントでは作成できないため、カスタマイズ・デプロイメントの実行前に、次のように非カスタマイズ・デプロイメントを実行してこれらのファイルを作成する必要があります。

1. Studio開発者ロールで、アプリケーションを起動します。

2. 「ビルド」→「すべてクリーン」を選択し、以前のデプロイメント以降に廃止されている可能性があるWebサービスJDBファイルを削除します。

3. デプロイメント・オプションから選択します(「アプリケーション」→「デプロイ」を選択し、デプロイメント・プロファイルを選択してアクセスします)。詳細は、第27章「MAFアプリケーションのデプロイ」を参照してください。

4. 「カスタマイズ開発者」ロールで、アプリケーションを起動します。

5. 手順3で選択したデプロイメント・プロファイルと同じものを選択すると、カスタマイズ・デプロイメントが、非カスタマイズ・デプロイメントで作成されたJBDファイルにアクセスできるようになります。

10.8 リソース・バンドルでのカスタマイズの有効化

リソース・キーのカスタマイズを実装する場合、追加のリソース・バンドル・ファイルを作成する必要があります(ベース・リソース・バンドル・ファイルは使用できません)。

Studio Developerロールで、次のいずれかを作成します。

- アプリケーション・リソース・バンドル(第10.8.1項「アプリケーション・リソース・バンドルの作成方法」を参照)。

- プロジェクト・リソース・バンドル(第10.8.2項「プロジェクト・リソース・バンドルの作成方法」を参照)。

作成するバンドルを編集して、リソース・キーの文字列値を定義します。

始める前に

Oracle Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発の複数のリソース・バンドルの使用方法に関する項を理解しておいてください。

10.8.1 アプリケーション・リソース・バンドルの作成方法

アプリケーション・リソース・バンドルを作成するには:

1. Studio開発者ロールで、「アプリケーション」→「アプリケーションのプロパティ」→「リソース・バンドル」をクリックします。

2. 「リソース・バンドル」ページで、「アプリケーション・バンドル検索」をクリックし、「バンドルの追加」アイコンの右にあるドロップダウン・メニューをクリックして、「アプリケーション・バンドルの作成」を選択します(図10-10を参照)。

図10-10 アプリケーション・リソース・バンドルの作成

3. 表示された「Xliffファイルの作成」ダイアログで、リソース・バンドルの名前を入力し、「OK」をクリックします。

4. 第6.5項「リソース・バンドルのリソースの編集」の説明に従って、リソース・バンドルを編集します。

注意:
MAFは、アプリケーション・レベルの「リソース・バンドル」ページではオーバーライドされたプロパティをサポートしていません。

5. 「カスタマイズ開発者」ロールで、「テキスト・リソースの選択」ダイアログを開き、適切な文字列を含むリソース・バンドルから選択します。「カスタマイズ開発者」ロールでは文字列の変更または新しい文字列の作成ができないため、選択したバンドルの文字列から選択することのみが可能です。

注意:
「カスタマイズ開発者」ロールで、ベース・リソース・バンドルから文字列を選択すると、アプリケーションのアップグレード時に問題が発生する可能性があるため選択しないでください。

10.8.2 プロジェクト・リソース・バンドルの作成方法

プロジェクト・リソース・バンドルを作成するには:

1. Studio開発者ロールで、リソース・バンドルを作成するプロジェクトを右クリックして、「新」→「ギャラリから」→「一般」→「XML」→「XMLローカライゼーション・ファイル(XLIFF)」を選択します。

2. 表示された「Xliffファイルの作成」ダイアログで、リソース・バンドルの名前を入力し、「OK」をクリックします。

3. 第6.5項「リソース・バンドルのリソースの編集」の説明に従って、リソース・バンドルを編集します。

4. 「リソース・バンドル」ページの「バンドル検索」タブで、プロジェクト(.jpr)ファイルを選択してリソース・バンドルを登録します(図10-11を参照)。

図10-11 リソース・バンドルの選択

リソース・バンドルを登録すると、「テキスト・リソースの選択」ダイアログに表示されます(図10-12を参照)。

図10-12 テキスト・リソースのリソース・バンドルの選択

5. 「テキスト・リソースの選択」ダイアログを使用して、次のようにキーを定義します。

1. 「リソース・バンドル」ドロップダウン・リストからバンドルを選択します。
ダイアログには、選択したリソース・バンドルで現在定義されている文字列が表示されます。

2. 新しい文字列を入力して、「保存して選択」をクリックします。
JDeveloperでは、選択したリソース・バンドルに文字列を書き込みます。

6. 「カスタマイズ開発者」ロールで、「テキスト・リソースの選択」ダイアログを開き、適切な文字列を含むリソース・バンドルから選択します。「カスタマイズ開発者」ロールでは文字列の変更または新しい文字列の作成ができないため、選択したバンドルの文字列から選択することのみが可能です。

注意:
「カスタマイズ開発者」ロールで、ベース・リソース・バンドルから文字列を選択すると、アプリケーションのアップグレード時に問題が発生する可能性があるため選択しないでください。

10.9 カスタマイズを使用したMAFアプリケーションのアップグレード

カスタマイズはベース・アプリケーションとは別に保存されているため、安全にアップグレートができます。カスタマイズは変更を保持するため、これらの変更をアプリケーションの新しいバージョンに適用して、アプリケーションをアップグレードできます。MAFアプリケーション・アーカイブ(.maa)ファイルによって、MAFアプリケーションをアップグレードするためのメカニズムが提供されます。.maaファイルからアプリケーションを作成する場合、.maaファイルの更新バージョンを使用してアプリケーションをアップグレードできます。

「アーカイブからモバイル・アプリケーションをアップグレード」ウィザードを使用すると、アップグレードの前に行われたカスタマイズを保持しながら新しいバージンにアプリケーションをアップグレードできます。

始める前に

MAFアプリケーション・アーカイブ(.maa)ファイルについて理解しておいてください。詳細は、第27.6項「モバイル・アプリケーション・アーカイブ・ファイルの作成」および第27.7項「署名のないデプロイメント・パッケージの作成」を参照してください。

.maaファイルにパッケージ化され、アップグレードに使用されるアプリケーションのアプリケーションIDが、適用されるアプリケーションと同じであることを確認してください。また、アップグレードの対象となるアプリケーションより新しいバージョン番号である必要があります。

MAFアプリケーションのアップグレード手順:

1. .maaファイルからMAFアプリケーションを作成します。

2. 第10.8項「リソース・バンドルでのカスタマイズの有効化」の説明に従って、MAFアプリケーションにカスタマイズを適用します。

3. 「アプリケーション」をクリックして、アーカイブからモバイル・アプリケーションを選択を選択します。

4. .maaファイルを参照して選択します。.maaにパッケージ化されたアプリケーションが、現在のアプリケーションと同じ(または古い)バージョンであったり、異なるアプリケーションIDである場合、ウィザードによりアップグレードは中止されます。

図10-13 .maaファイルの選択

5. 手動マージが必要なファイルの「サマリー」ページを確認します。図10-14に示すように、MAFでは、Tempディレクトリにアプリケーションの初期バージョン(バージョン1)が保存されます。「サマリー」ページにもログ・ファイルの一時的な場所が表示されます。

図10-14 アプリケーションのアップグレード情報

6. アップグレードが正常に完了すると、JDeveloperは再起動します。異なるバージョンの構成ファイルに調整が必要な場合、JDeveloperにより通知されます(図10-15を参照)。

図10-15 手動マージ通知

アップグレード中に、MAFでは、バージョン1のアプリケーションとバージョン2 (アップグレードしたバージョンのアプリケーション)の両方に対してカスタマイズできないファイル・セットがコピーされます。これらのファイルには、connections.xmlファイル、adf-config.xmlファイルなどがあります。MAFによって、バージョン1とバージョン2のconnections.xmlファイルとadf-config.xmlファイルに差異が検出されると、これらのファイルの両方のコピーを保持し、マージ・ログ・ファイルに対してエントリを記述します。バージョン番号がある場合、MAFではファイル名にバージョン番号を追加してバージョン1を区別します。バージョン番号がない場合、MAFでは_oldをファイル名に追加します(図10-15のconnections_old.xmlを参照)。必要に応じて、この差異を新しいバージョンに手動でマージできます。図10-16に示すように、MAFでは、「サマリー」ページに表示された一時的な場所にマージ・ファイル・ログを配置します。MAFでは、ファイルにworkspace name_timestampという名前を付けます。

図10-16 マージ・ログ・ファイル

10.9.1 アプリケーションをアップグレードする場合のJDeveloperでの処理

Tempディレクトリへのバージョン1のコピー、およびバージョン1とバージョン2のアップグレード不可の構成ファイルのコピーの作成に加えて、「アーカイブからモバイル・アプリケーションをアップグレード」ウィザードを使用してアプリケーションをアップグレードする場合、MAFでは次のことも実行します。

- 各プロジェクトのライブラリおよびリソース・バンドル設定を、に保存します。プロジェクト・ファイル名が入力されたマップに保存します。

- ワークスペースのリソース・バンドル設定を保存します。

- 登録したカスタマイズ・クラスをadf-config.xmlファイルに保存します。

- バージョン2の.maaファイルを一時ディレクトリにインポートします。

- バージョン1へのアップグレードに使用される.maaファイルからアプリケーションをコピーします。

- バージョン2の各プロジェクト(.jpr)ファイルを、登録したリソース・バンドルおよびライブラリ依存マップで更新します。ライブラリの新しいバージョンにより以前のバージョンがオーバーライドされます。ただし、バージョン1で使用されるライブラリと同じ名前を共有している場合、バージョン1ライブラリは変更されません。

- バージョン2のワークスペース(.jws)ファイルを、登録したリソース・バンドル設定で更新します。

- バージョン2のadf-config.xmlファイルを更新し、カスタマイズ・クラスを登録します。

10.9.2 FARのアップグレードに関する必知事項

アプリケーションの作成に使用された元の.maaファイル内にパッケージ化されていないFARファイルがアプリケーションに含まれる場合(または、アプリケーションのアップグレードに使用される.maaファイルに含まれる場合)、FARファイルを個別にアップグレードする必要があります。たとえば、.maaファイルからアプリケーションを作成し、FARファイルを追加してカスタマイズを実行できます。「リソース」ウィンドウから更新したFARを追加することによって新しいバージョンのFARを使用するために、アプリケーションをアップグレードできます(第8.2項「MAFアプリケーションでのFARコンテンツの使用方法」を参照)。

11 MAFアプリケーションでのライフサイクル・リスナーの使用方法

この章では、MAFアプリケーションまたはアプリケーション機能のイベントに応じて実行可能なコードを記述するための、MAFに用意されているライフサイクル・リスナーについて説明します。

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

- 第11.1項「MAFアプリケーションのライフサイクル・リスナーの概要」

- 11.2「MAFアプリケーションまたはアプリケーション機能のライフサイクル・リスナーの登録」

- 第11.3項「ライフサイクル・リスナー登録時の処理」

11.1 MAFアプリケーションのライフサイクル・リスナーの概要

ライフサイクル・リスナーは、アプリケーションの固有のイベントに応じて実行されるコードを記述するために便利な場所です。MAFは、アプリケーションまたはアプリケーション機能イベントに応じたコードを記述できるライフサイクル・リスナーを備えています。アプリケーション・ライフサイクル・リスナー・メソッドの標準的な実装としては、第17.2項「ローカルSQLiteデータベースの使用方法」に示されているように、アプリケーションの起動時にアプリケーションのデータベースを初期化するコードを記述するか、または第29.5.8項「実行時に名前付き接続の接続属性を更新する方法」に示されているように、URLパラメータからセキュリティ構成を更新します。

MAFは、イベント通知と通信するために実装できる次の2つのインタフェースを備えています。

- oracle.adfmf.application.LifeCycleListener
このインタフェースには、アプリケーション・ライフサイクル・リスナーが実装する必要のある次のメソッドを指定します。

- activate()

- deactivate()

- start()

- stop()

- oracle.adfmf.feature.LifeCycleListener
このインタフェースには、機能ライフサイクル・リスナーが実装する必要のある次のメソッドを指定します。

- activate()

- deactivate()

ライフサイクル・リスナーを作成するには、適切なインタフェースを実装するJavaクラスを作成し、第11.2項「MAFアプリケーションまたはアプリケーション機能のライフサイクル・リスナーの登録」に示されているように、MAFアプリケーションの実装を登録します。

新規作成するMAFアプリケーションは、図11-1に示されているように、アプリケーションのApplicationControllerプロジェクトにapplication.LifeCycleListenerImpl.javaクラスをデフォルトで作成することによって、oracle.adfmf.application.LifeCycleListenerインタフェースを実装します。

図11-1 アプリケーション・ライフサイクル・リスナーの実装

アプリケーション・ライフサイクル・リスナーは、匿名ユーザーによって実行されます(つまり、そのリスナーのメソッドにはどのユーザーも関連付けられず、セキュアなWebサービスもコールされません)。

表11-1は、アプリケーションの起動時、シャットダウン時および休止時にアプリケーション・ライフサイクル・メソッドをMAFが起動する特定の時刻を示しています。

表11-1 MAFによるアプリケーション・ライフサイクル・メソッドの起動タイミング

メソッド

タイミング

いつコールされるか

使用方法

start

MAFアプリケーションがアプリケーション機能を完全にロードした後、ユーザーに最初のアプリケーション機能またはSpringboardを表示する直前にコールされます。これはブロック化コールです。

アプリケーションの処理が開始されたとき。

次の使用方法があります。

- MAFアプリケーションの更新があるかどうかを確認する。

- ローカル・データベースにデータをダウンロードするよう、リモート・サーバーにリクエストする。

stop

MAFアプリケーションがシャットダウンを開始するときにコールされます。

アプリケーションの処理が終了したとき。

次の使用方法があります。

- 任意のリモート・サービスからログオフする。

- アプリケーションが終了する前に、データの変更をサーバーにアップロードする。

activate

MAFアプリケーションを背景にある(休止)状態からアクティブ化するときにコールされます。これはブロック化コールです。

startメソッドがコールされた後。

次の使用方法があります。

- キャッシュ・ストアを読み取り、再移入する。

- Webサービス・リクエストを処理する。

- 必要なリソースを取得する。

deactivate

MAFアプリケーションを非アクティブ化し、背景に移動(休止)するときにコールされます。これはブロック化コールです。

stopメソッドがコールされる前。

次の使用方法があります。

- リストア可能な状態を書き込む。

- データベース・カーソルとデータベース接続を閉じる。

表11-2は、機能のアクティブ化および非アクティブ化時にMAFが機能ライフサイクル・メソッドを起動する特定のタイミングを示しています。

表11-2 MAFによる機能ライフサイクル・メソッドの起動のタイミング

メソッド

タイミング

いつコールされるか

使用方法

activate

現在のアプリケーション機能がアクティブ化される前にコールされます。

ユーザーがMAFアプリケーションの起動後に初めてアプリケーション機能を選択したとき、またはアプリケーション機能が再選択されたとき(つまり、フォアグラウンドに戻されたとき)にコールされます。

次の使用方法があります。

- applicationScope変数を読み取る。

- 最初のMAF AMXビューにおける現在の行を設定する。

deactivate

次のアプリケーション機能がアクティブ化される前、またはアプリケーション機能が終了する前にコールされます。

ユーザーが別のアプリケーション機能を選択したときにコールされます。

たとえば、deactivateイベントを使用して、applicationScope変数や、次のアプリケーション機能が使用するその他の状態情報を記述できます。

oracle.adfmf.application.LifeCycleListenerインタフェースおよびoracle.adfmf.feature.LifeCycleListenerインタフェースの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework用Java APIリファレンスを参照してください。

LifecycleEventsサンプル・アプリケーションは、アプリケーション・インタフェースと機能インタフェースの両方を実装し、これらをMAFアプリケーションのmaf-application.xmlファイルとmaf-feature.xmlファイルに登録するリスナー・クラスの宣言を示しています。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install\jdeveloper\jdev\extensions\oracle.maf\Samples

サンプル・アプリケーションの詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

11.2 MAFアプリケーションまたはアプリケーション機能のライフサイクル・リスナーの登録

アプリケーション・ライフサイクル・リスナーの登録は、maf-application.xmlファイルの概要エディタを使用して行い、機能ライフサイクル・リスナーの登録は、maf-features.xmlファイルの概要エディタを使用して行います。

アプリケーション・ライフサイクル・リスナーを登録するには:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開きます。

2. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

3. maf-application.xmlをダブルクリックします。

4. 「Application」ナビゲーション・タブで、oracle.adfmf.application.LifeCycleListenerインタフェースを実装するJavaクラスをLifecycle Event Listenerフィールドに指定します。デフォルトでは、これはapplication.LifeCycleListenerImplに設定されています。
MAFに用意されているデフォルト実装と異なるカスタム・クラスを使用するシナリオは、別のところで使用するために配布されるJARライブラリにアプリケーション・ライフサイクル・リスナーをパッケージ化するときのためのものです。

アプリケーション機能ライフサイクル・リスナーを登録する手順:

1. 「Application」ウィンドウで、ViewControllerプロジェクトを展開し、「アプリケーション・ソース」およびMETA-INFを展開します。

2. maf-feature.xmlファイルをダブルクリックします。

3. 機能ライフサイクル・リスナーを登録する機能を「機能」リストで選択します。

4. 「ライフサイクル・イベント・リスナー」フィールドに、oracle.adfmf.feature.LifeCycleListenerインタフェースを実装するJavaクラスを指定します。

11.3 ライフサイクル・リスナー登録時の処理

デフォルトでは、作成するMAFアプリケーションは、アプリケーションのApplicationControllerプロジェクトでのapplication.LifeCycleListenerImpl.javaクラスの作成を介して、アプリケーション・ライフサイクル・リスナーを実装します。maf-application.xmlファイルのlistener-class属性は、次の例に示されているように、このクラスを登録します。

<adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
version="1.0" name="NewMAFapp" id="com.company.NewMAFapp"
appControllerFolder="ApplicationController" listener-class="application.LifeCycleListenerImpl">
...
</adfmf:application>

機能ライフサイクル・リスナーを登録すると、JDeveloperでは、listener-class属性用のmaf-feature.xmlファイルにエントリを書き込みます。次の例は、付録G「サンプルのMAFアプリケーション」で説明されているLifecycleEventsサンプル・アプリケーションのエントリを示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf">
<adfmf:feature id="Feature1" name="Feature1"
listener-class="mobile.Feature1Handler">
<adfmf:description>This is a sample feature to show the feature lifecycle handlers.
</adfmf:description>
<adfmf:content id="Feature1.1">
<adfmf:amx file="Feature1/feature1.amx"/>
</adfmf:content>
</adfmf:feature>
...
</adfmf:features>

12 MAF AMXページの作成

この章では、ビューとタスク・フローを含む、MAF AMXアプリケーション機能の作成方法について説明します。

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

- 第12.1項「MAF AMXアプリケーション機能の概要」

- 第12.2項「タスク・フローの作成」

- 第12.3項「ビューの作成」

12.1 MAF AMXアプリケーション機能の概要

MAF AMXはモバイル・アプリケーション・フレームワーク(MAF)内のサブフレームワークであり、サポートされるすべてのプラットフォームで動作が同一となるアプリケーション機能を作成できる一連のUIコンポーネントを備えています。MAF AMXを使用すると、UIコンポーネントをページ・エディタにドラッグして、宣言的に使用できます。通常、MAF AMXアプリケーション機能には相互に接続された複数のページがあり、様々なパスを経由してこれらのページ間を移動できます。

注意:
モバイル・デバイスのインタフェースを開発する際には、画面領域が非常に限られているということを常に意識する必要があります。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

詳細は、次を参照してください。

- 第2章「MAFアプリケーション開発のスタート・ガイド」

- 第13章「MAF AMXユーザー・インタフェースの作成」

- 第14章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」

12.2 タスク・フローの作成

タスク・フローにより、MAF AMXページ間のナビゲーションを定義できます。JDeveloperのアプリケーション・ワークスペース(第2.2項「MAFアプリケーションの作成」を参照)を使用して、タスク・フローを設計することにより、MAF AMXアプリケーション機能のユーザー・インタフェースの作成を開始できます。MAF AMXでは、ナビゲーション・ケースとナビゲーション・ルールを使用してタスク・フローを定義します。これらの定義は、ViewController-task-flow.xmlというデフォルト名のファイルに格納されています(第12.2.3項「ViewController-task-flow.xmlファイルに関する必知事項」を参照)。

(開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにある) NavigationというMAFサンプル・アプリケーションには、循環ナビゲーション、ルーターなど様々なナビゲーション技術の使用方法が示されています。

MAFでは、バインド・タスク・フローとバインドなしタスク・フローの両方を持つMAF AMXアプリケーション機能を作成できます。第12.2.12項「バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項」で説明しているように、バインド・タスク・フローはタスク・フロー定義とも呼ばれ、アプリケーションの再利用可能な部分を表します。MAFでは、バインド・タスク・フローにはエントリ・ポイントが1つありますが、終了ポイントはありません。バインド・タスク・フローには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。他のバインド・タスク・フロー特性として、入力パラメータの受入れ(第12.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」)や戻り値の生成(第12.2.12.3.2項「バインド・タスク・フローの戻り値の構成」)などがあります。

アプリケーション機能にバインド・タスク・フローを作成するには、MAF AMXタスク・フロー・デザイナを使用します。タスク・フローの概要エディタと同様、このツールにはダイアグラマ(第12.2.4,項「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)が含まれており、ここで、「コンポーネント」ウィンドウからアクティビティと制御フローをドラッグ・アンド・ドロップすることにより(第12.2.2項「タスク・フロー・アクティビティと制御フローに関する必知事項」)、タスク・フローを構築します。その後、「プロパティ」ウィンドウを使用して、これらのアクティビティとそれらの間の遷移を定義します。

タスク・フローがすでに作成されている場合を除き、新しいMAF AMXページが作成されると、MAFでは自動的にデフォルトのバインドなしタスク・フロー(adfc-mobile-config.xmlファイル)が生成されます。

各タスク・フローはアプリケーション機能としてMAFアプリケーションに追加できます。詳細は、第5.3項「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」を参照してください。

12.2.1 タスク・フローの作成方法

タスク・フローはタスク・フロー自体と、複数のアクティビティ、そしてそれらのアクティビティ間の制御フロー・ルールで構成されています(第12.2.2項「タスク・フロー・アクティビティと制御フローに関する必知事項」を参照)。通常、アクティビティの大半は、フロー内の異なるページを示すビュー・アクティビティです。メソッドや操作をコールする必要がある場合(ページのレンダリング前など)は、メソッド・コール・アクティビティをそのアクティビティから次の適切なアクティビティまでの制御フロー・ケースとともに使用します。別なタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティを使用します。フローにブランチ化が必要な場合は、ルーター・アクティビティを使用します。バインド・タスク・フローの最後で、リターン・アクティビティを使用してフローを終了し、そのバインド・タスク・フローをコールしたフローに制御を戻します。

ナビゲーション・ダイアグラマを使用して、MAF AMXアプリケーション機能のバインド・タスク・フローを宣言的に作成します。ダイアグラマを使用すると、JDeveloperによって、MAF AMXアプリケーション機能でナビゲーションが機能するために必要なXMLメタデータがViewController-task-flow.xmlファイル(デフォルト)に作成されます。

始める前に

タスク・フローを設計するには、MAFアプリケーションにビュー・コントローラ・プロジェクト・ファイル(第2章「MAFアプリケーション開発のスタート・ガイド」を参照)が含まれている必要があります。

MAFでタスク・フローを作成するには、次の2つの方法があります。

- バインド・タスク・フローはmaf-feature.xmlファイルから作成できます。詳細は、第5.3項「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」を参照してください。

- JDeveloperの「新規ギャラリ」を使用できます。詳細は、次の手順を参照してください。

「新規ギャラリ」からタスク・フローを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」→「MAFタスク・フロー」の順に選択します(図12-1を参照)。「OK」をクリックします。

図12-1 新しいMAFタスク・フローの作成

3. 「MAFタスク・フローの作成」ダイアログ(図12-2を参照)で、新しいタスク・フローのファイル名と場所を指定して「OK」をクリックし、図12-3に示すナビゲーション・ダイアグラマで新しい<Name>-flow.xmlファイルを開きます。

注意:
タスク・フローは、MAFアプリケーションのビュー・コントローラ・プロジェクトのHTMLルート内に作成する必要があります。

注意:
同じパターンですでに存在するバインド・タスク・フローの数に従って、JDeveloperによってタスク・フローの数が増分されます。

図12-2 「MAFタスク・フローの作成」ダイアログ

図12-3 新しい空白のタスク・フロー

4. 「コンポーネント」ウィンドウで、「MAFタスク・フロー」を選択します。

ヒント:
「コンポーネント」ウィンドウが表示されていない場合は、メイン・メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」ウィンドウはJDeveloperの右上部に表示されます。

5. 「MAFタスク・フロー」→「コンポーネント」を選択し、使用するコンポーネントを選択してダイアグラムにドラッグ・アンド・ドロップします。図12-4に示すように、JDeveloperでは新たに追加されたコンポーネントを使用してダイアグラムが再描画されます。

図12-4 タスク・フローへのコンポーネントの追加

タスク・フローへのアクティビティの追加方法の詳細は、第12.2.5項「タスク・フロー・アクティビティの追加方法と使用方法」を参照してください。

制御フローの追加方法の詳細は、第12.2.6項「制御フローの定義方法」を参照してください。

新しいタスク・フローの動作を定義する方法の詳細は、第12.2.1.1項「新しいバインド・タスク・フローの動作に関する必知事項」を参照してください。

「概要」タブを開き、概要エディタを使用してナビゲーション・ルールとナビゲーション・ケースの作成することもできます。概要エディタを使用したナビゲーション作成の詳細は、[F1]キーで参照できます。

また、「ソース」エディタでページを直接編集して、タスク・フロー・ファイルに手動で要素を追加することもできます。「ソース」エディタでファイルを開くには、「ソース」タブをクリックします。

注意:
手動でタスク・フロー・ファイルを編集する場合は、MAF AMXページ、JavaScriptファイルおよびCSSファイルを参照するすべてのドキュメント・ファイル名で大文字と小文字が区別されることに注意してください。
特殊文字(アンダースコアなど)がファイル名に使用されている場合は、モバイル・デバイスの仕様を参照して、その文字の使用がサポートされているかどうかを確認する必要があります。

MAF AMXアプリケーション機能にナビゲーションを定義した後は、ページを作成したり、ナビゲーションを使用するコンポーネントを追加することができます。ページでのナビゲーション・コンポーネントの使用方法の詳細は、第12.2.6項「制御フローの定義方法」を参照してください。

MAF AMXアプリケーション機能にタスク・フローを定義した後は、ビュー・ファイルをダブルクリックしてMAF AMXビューにアクセスできます。詳細は、第12.3項「ビューの作成」を参照してください。

12.2.1.1 新しいバインド・タスク・フローの動作に関する必知事項

新しいバインド・タスク・フローが作成されると、MAFは自動的にpage-flow-scope-behavior要素を<Name>-flow.xmlファイルに追加します。この要素は、最上位のtask-flow-definition要素の子として追加されます。

注意:
page-flow-scope-behavior要素は、新規作成したタスク・フローが以前のバージョンのMAFを使用して構築されたプロジェクトに作成された場合でも、すべてのタスク・フローに追加されます。

page-flow-scope-behavior要素の値はデフォルトでpush-newに設定され、新しいタスク・フローの概要エディタとソース・エディタ、およびtask-flow-definition要素の「プロパティ」ウィンドウに表示されます(図12-5を参照)。

図12-5 タスク・フローの「ページ・フロー・スコープの動作」

「ページ・フロー・スコープの動作」がpush-newに設定されている場合、新しいページ・フロー・スコープが作成され、古いpageFlowScopeの変数は保存されて、スタックにプッシュされます。これにより、タスク・フロー・・リターン実行時に、以前のページ・フロー・スコープをリストアできます。「ページ・フロー・スコープの動作」がpreserveに設定されている場合、タスク・フロー・コールを実行してタスク・フローが開始されたときに、pageFlowScopeの変数はクリアされないので、新しいタスク・フローの変数には古い値が格納されます。

既存のタスク・フローにpage-flow-scope-behavior要素が存在しない場合は、この要素をpush-newまたはpreserveとして定義する必要があります。

pageFlowScopeの詳細は、第14.3.6.2項「マネージドBeanカテゴリについて」を参照してください。

12.2.2 タスク・フロー・アクティビティと制御フローに関する必知事項

タスク・フローは、アクティビティ、およびアクティビティ間の遷移を定義する制御フロー・ケースで構成されます。

MAFタスク・フロー・デザイナは表12-1に示すアクティビティをサポートしています。

表12-1 タスク・フロー・アクティビティ

アクティビティ

説明

表示

MAF AMXページを表示します。詳細は、第12.2.5.1項「ビュー・アクティビティの追加」を参照してください。

メソッド・コール

メソッド(通常はマネージドBean上のメソッド)を起動します。メソッド・コール・アクティビティをMAF AMXアプリケーション機能の制御フローの任意の位置に配置して、制御フロー・ルールに基づいてロジックを起動できます。詳細は、第12.2.5.3項「メソッド・コール・アクティビティの追加」を参照してください。

タスク・フローに含まれるメソッド・コールに渡すパラメータを指定することもできます。これらには、MAF AMXタスク・フロー内のメソッド・コール・アクションの標準パラメータが含まれます。デザイナを使用してメソッドを生成する場合、デザイナにより必要な引数およびタイプが追加されます。

実行時にタスク・フロー内のメソッド・コールのパラメータを定義し、メソッド・コール自体にパラメータを渡してこれを使用できます。詳細は、「タスク・フロー・アクティビティの追加および使用方法」の部を参照してください。

ルーター

式言語(EL)式を評価し、その式の値に基づいて結果を戻します。その後、このような結果を使用して、タスク・フローの他のアクティビティに制御をルーティングします。詳細は、第12.2.5.2項「ルーター・アクティビティの追加」を参照してください。

タスク・フロー・コール

バインドなしタスク・フローまたはバインド・タスク・フローからバインド・タスク・フローをコールします。タスク・フロー・コール・アクティビティでは、同じMAF AMXアプリケーション機能内にあるバインド・タスク・フローをコールできますが、別のMAF AMXアプリケーション機能またはライブラリに追加された機能アーカイブ・ファイル(FAR) (第8章「MAFアプリケーション・コンテンツの再使用」を参照)からバインド・タスク・フローをコールすることもできます。

タスク・フロー・コール・アクティビティは、タスク・フロー入力パラメータおよび戻り値をサポートします。

詳細は、第12.2.5.4項「タスク・フロー・コール・アクティビティの追加」を参照してください。

タスク・フロー・リターン

アプリケーションの制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターンは、バインド・タスク・フロー内でのみ使用できます。詳細は、第12.2.5.5項「タスク・フロー・リターン・アクティビティの追加」を参照してください。

MAFタスク・フロー・デザイナでは、表12-2にリストされた制御フローがサポートされています。

表12-2 制御フロー

制御フロー

説明

制御フロー・ケース

MAF AMXアプリケーション機能内で、あるアクティビティから次のアクティビティに制御を渡す方法を指定します。詳細は、第12.2.6.1項「制御フロー・ケースの定義」を参照してください。

ワイルドカード制御フロー・ルール

IDがワイルドカード式と一致するアクティビティからの制御フロー・ケースを表します。詳細は、第12.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照してください。

12.2.3 ViewController-task-flow.xmlファイルに関する必知事項

ViewController-task-flow.xmlファイルを使用すると、「コンポーネント」ウィンドウからMAF AMXタスク・フロー・コンポーネントをダイアグラマにドラッグ・アンド・ドロップすることにより、ビュー(MAF AMXページ)間の相互作用を設計できます。

図12-6に、Products-flow.xmlというタスク・フロー・ファイル例を示します。このファイルでは、制御フローはproductsページからproductdetailsページに方向付けられます。productdetailsページからproductsページに戻るには、組込みの__backナビゲーションが使用されます(第12.2.7項「MAFの戻るナビゲーションのサポートに関する必知事項」を参照)。

図12-6 タスク・フロー・ファイル

12.2.4 MAFタスク・フロー・ダイアグラマに関する必知事項

図12-6に示すように、MAFタスク・フロー作成ユーティリティを使用してタスク・フローを作成すると、タスク・フロー・ダイアグラムおよび「コンポーネント」ウィンドウが自動的に表示されます。タスク・フロー・ダイアグラムはビジュアル・エディタであり、「コンポーネント」ウィンドウまたは「アプリケーション」ウィンドウからのアクティビティとタスク・フローをここにドラッグ・アンド・ドロップできます。詳細は、第12.2.5項「タスク・フロー・アクティビティの追加方法と使用方法」を参照してください。

12.2.5 タスク・フロー・アクティビティの追加方法と使用方法

タスク・フロー・ダイアグラマを使用して、アクティビティ、ビューおよび制御フローをドラッグ・アンド・ドロップします。

始める前に

図12-7に示すように、「コンポーネント」ウィンドウから「MAFタスク・フロー」を選択する必要があります。

MAFタスク・フローにアクティビティを追加するには:

1. 「アプリケーション」ウィンドウで、タスク・フロー・ソース・ファイル(ViewController-task-flow.xmlなど)をダブルクリックして、図12-7に示すようなタスク・フロー・ダイアグラムおよび「コンポーネント」ウィンドウを表示します。ダイアグラマにはタスク・フロー・エディタが表示されます。「コンポーネント」ウィンドウには、MAFタスク・フローで使用できるコンポーネントが自動的に表示されます。

2. 「コンポーネント」ウィンドウからダイアグラムにアクティビティをドラッグします。ダイアグラムにビュー・アクティビティをドラッグしてダブルクリックすると、MAF AMXページの作成ウィザードを起動できます(第12.2.5.1項「ビュー・アクティビティの追加」を参照)。

図12-7 タスク・フロー・エディタのダイアグラマ

注意:
各バインド・タスク・フローに関連付けられているデフォルトのアクティビティがあります。

12.2.5.1 ビュー・アクティビティの追加

タスク・フロー・アクティビティの主要なタイプの1つに、MAF AMXページを表示するビュー・アクティビティがあります。

タスク・フローのソース・ファイル内のXMLメタデータは、ビュー・アクティビティを物理MAF AMXページと関連付けます。id属性ではビュー・アクティビティが識別されます。

タスク・フローのビュー・アクティビティは、実行中に相互に制御を受け渡すように構成できます。たとえば、あるビュー・アクティビティ(ビュー・アクティビティA)から次のビュー・アクティビティ(ビュー・アクティビティB)に制御を渡すには、ビュー・アクティビティAと関連付けられたページ上にコマンド・コンポーネント(ボタンやリンクなど)を構成します。これを行うには、コマンド・コンポーネントのAction属性を、起動するタスク・フロー・アクティビティ(ビュー・アクティビティBなど)に対応する制御フロー・ケースfrom-outcomeに設定します。実行時に、エンド・ユーザーは、コマンド・コンポーネントを起動することで制御フロー・ケースを初期化します。UIコンポーネントのAction属性の定数値または動的値のいずれかを使用して、あるビュー・アクティビティから別のアクティビティに移動できます。

- コンポーネントのAction属性の定数値は、常に同じ制御フロー・ケースをトリガーするアクション結果です。エンド・ユーザーがコンポーネントをクリックすると、その制御フロー・ケースに指定されているアクティビティが実行されます。代替の制御フローはありません。

- コンポーネントのAction属性の動的値はマネージドBeanまたはメソッドにバインドされます。メソッド・バインディングにより返される値によって、次に起動する制御フロー・ケースが決定されます。たとえば、メソッドはページ上でユーザー入力を検証し、入力が有効な場合はある値を返し、入力が無効な場合は別の値を返します。これらの異なるアクション値はそれぞれ別個のナビゲーション・ケースをトリガーするため、アプリケーションが移動可能なターゲット・ページは2つのいずれかになります。

詳細は、第12.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

また、ターゲット・ビュー・アクティビティに制御を渡す前に、値が必ずtrueになるEL式を記述できます。タスク・フローにある制御フロー・ケースの<if>子要素の値としてEL式を記述します。

次の2つの例は、表示アクティビティ間で制御を渡すときの処理を示しています。

1. この例は、バインド・タスク・フローまたはバインドなしタスク・フローのXMLソース・ファイルに定義された制御フロー・ケースを示しています。

<control-flow-rule>
<from-activity-id>Start</from-activity-id>
<control-flow-case>
<from-outcome>toOffices</from-outcome>
<to-activity-id>WesternOffices</to-activity-id>
</control-flow-case>
</control-flow-rule>

2. この例では、Startビュー・アクティビティに関連付けられているMAF AMXページ上のボタンで、action属性としてtoOfficesが指定されます。エンド・ユーザーがボタンをクリックすると、制御フロー・メタデータでto-activity-idとして指定されたWesternOfficesアクティビティに制御フローが渡されます。

<amx:commandButton text="Go" id="b1" action="toOffices">

詳細は、次を参照してください。

- 第12.2.5.1項「ビュー・アクティビティの追加」

- 第12.3.1.2項「MAF AMXページの作成」

前述のとおり、ビュー・アクティビティは、メタデータ内で実際のMAF AMXページと関連付けられており、タスク・フローに追加されるとこのページが表示されます。ビュー・アクティビティを追加するには、「コンポーネント」ウィンドウからドラッグ・アンド・ドロップします。実際のMAF AMXページを作成するには、「ダイアグラム」ウィンドウでビュー・アクティビティをダブルクリックして、表示されたダイアログでページの特性を定義します(図12-30「「MAF AMXページの作成」ダイアログ」を参照)。ビュー・アクティビティは、「アプリケーション」ウィンドウ内のMAF AMXファイルを概要エディタの「ダイアグラム」タブにドラッグ・アンド・ドロップして作成することもできます。

バインド・タスク・フローを作成する場合、特定のアクティビティをデフォルト・アクティビティとして指定できます(第12.2.12項「バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項」を参照)。これにより、バインド・タスク・フローが実行されるたびに、この特定のアクティビティが最初に実行されます。デフォルトでは、JDeveloperはタスク・フローに追加した最初のアクティビティをデフォルトにします。別のアクティビティに変更する場合は、「ダイアグラム」ウィンドウ内で該当するアクティビティを右クリックし、「アクティビティのマーク」→「デフォルト・アクティビティ」の順に選択します(図12-8を参照)。

図12-8 デフォルト・アクティビティの定義

12.2.5.2 ルーター・アクティビティの追加

EL式の実行時の評価に基づいて、ルーター・アクティビティを使用し、制御をアクティビティにルーティングします。

各制御フローは、異なるルーター・ケースに対応できます。各ルーター・ケースでは、次の要素を使用して、制御が次にルーティングされるアクティビティを選択します。

- expression: 実行時の値がtrueまたはfalseになるEL式
ルーター・アクティビティは、trueを返すEL式に対応する結果を返します。

- outcome: EL式がtrueに評価された場合にルーター・アクティビティから返される値
制御フロー・ケース上でルーター・ケースのoutcomeがfrom-outcomeと一致する場合は、制御フロー・ケースがポイントするアクティビティに制御が渡されます。ルーター・アクティビティのケースがいずれもtrueに評価されない場合、またはルーター・アクティビティのケースが指定されていない場合は、ルーターの「デフォルト結果」フィールドで指定されているoutcomeが使用されます(存在する場合)。

ルーティング条件をEL式で表現できる場合は、ルーター・アクティビティを使用することを検討してください。ルーター・アクティビティを使用すると、タスク・フローの条件に関するより多くの情報を示すことができます。

ルーター・アクティビティをダイアグラム上にドラッグすると、「プロパティ」ウィンドウを使用して式を作成し、その式の評価によりどの制御フロー・ルールに従うかを決定できます。「プロパティ」ウィンドウを使用して、ルーター・アクティビティの「アクティビティID」および「デフォルト結果」を構成し、ルーター・ケースをルーター・アクティビティに追加します。

「アクティビティID」属性を定義する際は、タスク・フローのソース・ファイル内にルーター・アクティビティを識別する値を記述します。

「デフォルト結果」属性を定義する際は、いずれの制御フロー・ケースの値もtrueに評価されない場合、または制御フロー・ケースが指定されていない場合に、ルーター・アクティビティが制御を渡すアクティビティを指定します。

追加するルーター・ケースごとに、図12-49に示す「ケース」セクションで「追加」(+)をクリックして、値を指定します。

図12-9 ルーター・アクティビティの構成

- 式: 実行時の値がtrueまたはfalseになるEL式。
たとえば、ビュー・アクティビティの入力テキスト・フィールドにある値を参照するには、次のようなEL式を記述します。

#{pageFlowScope.value=='view2'}

このEL式がtrueを返すと、「結果」フィールドで指定した結果がルーター・アクティビティによって呼び出されます。

- 結果: 「式」で指定したEL式がtrueを返す場合にルーター・アクティビティによって呼び出される結果。
タスク・フロー・ダイアグラムの結果ごとに制御フロー・ケースまたはワイルドカード制御フロー・ルールを作成します。たとえば、制御フロー・ケースの結果ごとに、対応するfrom-outcomeがあることを確認します。

ルーター・アクティビティを使用して制御フローを構成すると、JDeveloperによって、ルーター・アクティビティのプロパティに指定した値に基づいて、値がタスク・フローのソース・ファイルに書き込まれます。

12.2.5.3 メソッド・コール・アクティビティの追加

メソッド・コール・アクティビティをダイアグラム上にドラッグすると、「プロパティ」ウィンドウを使用して、コールするメソッドを構成できます。

メソッド・コール・アクティビティを使用して、アプリケーション機能の制御フロー内のどこからでもMAF AMXアプリケーション機能ロジックを起動する、カスタム・メソッドまたは組込みメソッドをコールします。ページ表示前の初期化、ページ終了後のクリーンアップ、例外処理などのタスクを実行するメソッドを指定できます。

制御フロー・ケースを指定してメソッドの終了後に制御を渡すメソッドに対して結果を設定できます。結果は次のいずれかとして指定できます。

- fixed-outcome: 正常完了時に、メソッドから常に戻される単一の結果(例: success)。メソッドが正常に完了しないと結果は戻されません。メソッド・タイプがvoidの場合、to-stringではなくfixed-outcomeを指定する必要があります。
この結果を定義するには、「プロパティ」ウィンドウで「固定結果」フィールドを設定します(図12-10を参照)。

- to-string: trueとして指定した場合、メソッドによって戻されたJavaオブジェクトに対してtoString()メソッドがコールされ、それに基づく結果が得られます。たとえば、toStringメソッドからeditBasicInfoが戻された場合、ナビゲーションはeditBasicInfoという名前の制御フロー・ケースに移動します。
この結果を定義するには、「プロパティ」ウィンドウで「toString()」フィールドを設定します(図12-10を参照)。

「データ・コントロール」ウィンドウからタスク・フロー・ダイアグラム内のメソッド・コール・アクティビティにデータ・コントロール操作を直接ドロップして、メソッド・コール・アクティビティを既存のメソッドに関連付けることができます。また、メソッドおよび操作をタスク・フロー・ダイアグラムに直接ドラッグすることもできます。これを行うと、新しいメソッド・コール・アクティビティが自動的に作成されます。メソッドにEL式およびその他のオプションを指定できます。

デフォルト値を変更する場合は、「アクティビティID」フィールドでそのアクティビティ識別子を変更して、メソッド・コールを構成します。新規の値を入力すると、ダイアグラムのメソッド・コール・アクティビティの下に新しい値が表示されます。

「メソッド」フィールドには、コールするメソッドを識別するEL式を入力します。

注意:
EL式内のバインディング変数は現在のバインディング・コンテナからバインディングを参照します。バインディング変数を指定するには、バインディング・コンテナ定義またはページ定義を指定する必要があります。詳細は、第12.3.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

図12-10 メソッド・コール・アクティビティの構成

式ビルダーを使用してメソッドのEL式を作成することもできます。

- 「メソッド」フィールドのプロパティ・エディタから、「メソッド式ビルダー」を選択します。

- 「式ビルダー」ダイアログで、起動するメソッドにナビゲートして選択します。
メソッド・コール・アクティビティでマネージドBeanメソッドを起動する場合は、ダイアログでメソッド・コール・アクティビティをダブルクリックします。これによってダイアログが呼び出され、そこで起動するマネージドBeanメソッドを指定できます。

メソッドのパラメータおよび戻り値を指定するには、「プロパティ」ウィンドウの「パラメータ」セクションを使用します(図12-10を参照)。メソッド・コール・アクティビティを既存のメソッドに関連付けることによってパラメータをまだ作成していない場合は、「追加」(+)をクリックして次のように設定することにより、パラメータを追加します。

- クラス: パラメータ・クラスを入力します。たとえば、java.lang.Doubleのように指定します。

- 値: パラメータの値を取得するEL式を入力します。次に例を示します。

#{pageFlowScope.shoppingCart.totalPurchasePrice}

- 戻り値: メソッドの戻り値を格納する場所を識別するEL式を入力します。次に例を示します。

#{pageFlowScope.Return}

12.2.5.4 タスク・フロー・コール・アクティビティの追加

タスク・フロー・コール・アクティビティを使用して、バインドなしタスク・フロー(第12.2.12.1項「バインドなしタスク・フロー」を参照)またはバインド・タスク・フロー(第12.2.12.2項「バインド・タスク・フロー」を参照)からバインド・タスク・フローをコールできます。このアクティビティによって、同じMAF AMXアプリケーション機能内または別のMAF AMXアプリケーション機能にあるバインド・タスク・フローをコールできます。

コールされたバインド・タスク・フローでは、デフォルト・アクティビティが最初に実行されます。バインド・タスク・フロー・コールの数に制限はありません。たとえば、コール先のバインド・タスク・フローから別のバインド・タスク・フローをコールでき、さらにそこから次々にコールできるため、各タスク・フローが一連のタスク内のリンクとなっている連鎖タスク・フローが作成されます。

バインド・タスク・フローにパラメータを渡すには、タスク・フロー・コール・アクティビティに入力パラメータの値を指定する必要があります。これらの値は、コール先のバインド・タスク・フローの入力パラメータ定義と一致している必要があります。詳細は、第12.2.5.4.2項「タスク・フロー・コール・アクティビティへの入力パラメータの指定」を参照してください。

注意:
タスク・フロー・コール・アクティビティの入力パラメータの値は、コール元のタスク・フロー内で値を取得する場所を指定します。
コール先のタスク・フローの入力パラメータ定義の値は、値が渡されたときにコール先のバインド・タスク・フロー内で値を格納する場所を指定します。

注意:
バインド・タスク・フローがタスク・フロー・コール・アクティビティに関連付けられると、バインド・タスク・フローで設定されている入力パラメータ定義に基づいて、自動的に入力パラメータがタスク・フロー・コール・アクティビティに挿入されます。したがって、実行する必要があるのは、タスク・フロー・コール・アクティビティの入力パラメータへの値の割当てのみです。

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

バインド・タスク・フローからコール元に戻り値が渡される方法は、入力パラメータが渡される方法と類似しています。詳細は、第12.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照してください。

タスク・フロー・コール・アクティビティを使用するには:

1. タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールします(第12.2.5.4.1項「タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール」を参照)。

2. パラメータをバインド・タスク・フローに渡す場合は、入力パラメータをタスク・フロー・コール・アクティビティに指定します(第12.2.5.4.2項「タスク・フロー・コール・アクティビティへの入力パラメータの指定」を参照)。

12.2.5.4.1 タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール

コール側のバインドまたはバインド・タスク・フローまたはバインドなしタスク・フローにタスク・フロー・コール・アクティビティを追加し、バインド・タスク・フローをコールします。

バインド・タスク・フローをコールする手順:

1. 「ダイアグラム」ビューで、バインド・タスク・フロー・ファイルを開きます。

2. 「コンポーネント」ウィンドウで、「コンポーネント」→「アクティビティ」を選択します。

3. タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

4. 次のオプションのいずれかを選択して、コール先タスク・フローを識別します。

- 新しくドロップしたタスク・フロー・コール・アクティビティをダブルクリックして、新しいバインド・タスク・フローの設定を定義するための「MAFタスク・フローの作成」を開きます(図12-2「MAFタスク・フローの作成」ダイアログを参照)。

- 「アプリケーション」ウィンドウから既存のバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップします。

- 起動するバインド・タスク・フローの名前がわかっている場合は、次の手順を実行します。

1. 「ダイアグラム」ビューで、タスク・フロー・コール・アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストから「静的」を選択します。

3. 「ドキュメント」フィールドに、コールするバインド・タスク・フローのソース・ファイル名を入力します。

4. 「ID」フィールドには、コール先のバインド・タスク・フローのXMLソース・ファイルに含まれているバインド・タスク・フローIDを入力します(図12-11を参照)。

図12-11 バインド・タスク・フローを起動するタスク・フロー・コール・アクティビティ

- 起動するバインド・タスク・フローの名前がわからない場合、実行時のエンド・ユーザーによって異なる場合は、次の手順を実行します。

1. 「ダイアグラム」ビューで、タスク・フロー・コール・アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストから「動的」を選択します。

3. 式ビルダーを使用して、「動的タスク・フロー参照」プロパティ・フィールドの値を設定します。実行時に起動するバインド・タスク・フローのIDを識別するEL式を記述します。

12.2.5.4.2 タスク・フロー・コール・アクティビティへの入力パラメータの指定

タスク・フロー・コール・アクティビティとそのコール先のバインド・タスク・フローの間でパラメータをマップするには、まずコール先のバインド・タスク・フローの入力パラメータ定義を指定する方法をお薦めします。その後、「アプリケーション」ウィンドウからバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップできます。タスク・フロー・コール・アクティビティの入力パラメータは、バインド・タスク・フローの入力パラメータ定義に基づいて自動的に作成されます。詳細は、第12.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

当然ながら、最初にタスク・フロー・コール・アクティビティに入力パラメータを指定することも可能です。最初に定義した場合にも、コール先のバインド・タスク・フローの入力パラメータ定義がタスク・フロー・コール・アクティビティに関連付けられた時点で、その入力パラメータ定義に基づいて自動的に置換されます。

コール先のバインド・タスク・フローをまだ作成していない場合にも、タスク・フロー・コール・アクティビティに入力パラメータを指定する方法は便利です。この時点で指定することで、バインド・タスク・フローのコール時にタスク・フロー・コール・アクティビティが最終的にマップされる予定の入力パラメータを特定できます。

入力パラメータを指定するには:

1. 「ダイアグラム」ビューで、タスク・フロー・ファイルを開き、タスク・フロー・コール・アクティビティを選択します。

2. 「プロパティ」ウィンドウで「パラメータ」セクションを開き、「追加」(+)をクリックして、「入力パラメータ」リストで次のように新しい入力パラメータを指定します。

- 名前: 入力パラメータを識別する名前を入力します。

- 値: パラメータ値を識別するEL式を入力します。EL式は、コール元のタスク・フロー内で値を取得する場所を指定します。たとえば、次のようにEL式を入力します。

#{pageFlowScope.callingTaskflowParm}

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

3. 入力パラメータを指定すると、対応する入力パラメータ定義をコール先のバインド・タスク・フローに指定できます。詳細は、第12.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

12.2.5.5 タスク・フロー・リターン・アクティビティの追加

タスク・フロー・リターン・アクティビティは、MAF AMXアプリケーション機能の制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターン・アクティビティは、バインド・タスク・フロー内でのみ使用できます。

タスク・フロー・リターン・アクティビティ・アイコンを囲むグレーの円は、そのアクティビティがバインド・タスク・フローの終了ポイントであることを示します。各バインド・タスク・フローには、0以上のタスク・フロー・リターン・アクティビティを指定できます。

各タスク・フロー・リターン・アクティビティには、コール元のタスク・フローに戻されるoutcomeを指定します。

起動するタスク・フローに戻されるoutcomeは、エンド・ユーザー・アクションによって異なります。起動元のタスク・フローによって次のアクションを決定するように、起動元のタスク・フローの制御フロー・ケースを構成できます。制御フロー・ケースの「結果(自)」プロパティをタスク・フロー・リターン・アクティビティのoutcomeからの戻り値に設定し、結果に基づくアクションを起動します。これにより、コール先タスク・フローからの戻り値に基づいて制御フローが決まります。

タスク・フロー・リターン・アクティビティを追加するには:

1. 「ダイアグラム」ビューで、バインド・タスク・フロー・ファイルを開きます。

2. 「コンポーネント」ウィンドウで、「コンポーネント」→「アクティビティ」を選択します。

3. タスク・フロー・リターン・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

4. 「プロパティ」ウィンドウ(図12-12を参照)で、「一般」セクションを開き、「名前」フィールドに結果を入力します。
タスク・フロー・リターン・アクティビティは、現在のバインド・タスク・フローが存在する場合に、この結果をコール元タスク・フローに返します。タスク・フロー・リターン・アクティビティごとに1つのみ結果を指定できます。コール元のタスク・フローには、戻された時点の制御フローを処理する制御フロー・ルールを定義する必要があります。詳細は、第12.2.6項「制御フローの定義方法」を参照してください。

5. 「動作」セクションを開き、「再入力」リストでいずれかのオプションを選択します。
バインド・タスク・フローにreentry-not-allowedを指定した場合も、エンド・ユーザーはモバイル・デバイスの戻るボタンをクリックするとバインド・タスク・フロー内のページに戻ることができます。ただし、エンド・ユーザーがそのページでボタンのアクティブ化などのなんらかの操作を行うと、バインド・タスク・フローを不正に再開したことを示す例外(InvalidTaskFlowReentryなど)がスローされます。

6. 「トランザクションの終了」ドロップダウン・リストから、次のいずれかのオプションを選択します。

- コミット: 選択すると、既存のトランザクションをデータベースにコミットします。

- ロールバック: 選択したトランザクションをコール先のタスク・フローの以前のエントリまでロールバックします。これを指定すると、新しいトランザクションはバインド・タスク・フローに入って開始された当初の状態までロールバックされるため、トランザクションを取り消すのと同じ効果があります。
commitとrollbackのいずれも指定しないと、トランザクションはコール元のバインド・タスク・フローによって閉じられるまで開いたままになります。

図12-12 タスク・フロー・リターン・アクティビティの構成

12.2.5.6 ページ定義ファイルのあるタスク・フロー・アクティビティの使用

ページ定義ファイルは、実行時にデータを移入するバインディング・オブジェクトを定義します。通常、MAF AMXアプリケーション機能で、ページUIコンポーネントをデータ・コントロールにバインドするために使用されます。次のタスク・フロー・アクティビティも、ページ定義ファイルを使用してデータ・コントロールにバインドできます。

- メソッド・コール: 「データ・コントロール」ウィンドウからタスク・フローにデータ・コントロール操作をドラッグ・アンド・ドロップして、メソッド・コール・アクティビティを作成したり、既存のメソッド・コール・アクティビティにドロップすることができます。いずれの場合も、メソッド・コール・アクティビティが、データ・コントロール操作にバインドされます。

- ルーター: ページ定義ファイルをルーター・アクティビティと関連付けることで、バインディング・コンテナが作成されます。このバインド・コンテナは実行時にルーター・アクティビティ・ケースのEL式を評価し、ルーター・アクティビティが正しいバインド値を参照していることを確認します。各ルーター・アクティビティ・ケースは、EL式がtrueに評価された場合に戻される結果を指定します。そのため、ページ定義ファイルには、trueまたはfalseの評価結果となるデータ・コントロール操作だけを追加します。

- タスク・フロー・コール: ページ定義ファイルをタスク・フロー・コール・アクティビティと関連付けることで、バインディング・コンテナが作成されます。実行時にタスク・フロー・コール・アクティビティから入力パラメータが渡されると、バインド・コンテナが起動します。バインド・コンテナはタスク・コール元のタスク・フローからコール先のタスク・フローに入力パラメータが渡される際に、フロー・コール・アクティビティがバインド値を参照する場合は、正しい値を参照していることを確認します。

- ビュー: ビュー・アクティビティをページ定義ファイルと直接関連付けることはできません。かわりに、ビュー・アクティビティが参照するページを関連付けます。

タスク・フローの「ダイアグラム」ウィンドウで、前述のタスク・フロー・アクティビティ(ビュー・アクティビティを除く)のいずれかを右クリックすると、ページ定義ファイルが存在しない場合にページ定義ファイルを作成できるオプションがポップアップ・メニューに表示されます。ページ定義ファイルが存在する場合、JDeveloperではページ定義ファイルに移動するためのすべてのタスク・フロー・アクティビティのポップアップ・メニュー・オプションが表示されます(第12.3.1.5項「ページ定義ファイルへのアクセス」を参照)。また、ページ定義ファイルに関連付けられたメソッド・コール・アクティビティを右クリックすると、JDeveloperで「バインディングの編集」ポップアップ・メニュー・オプションが表示されます。

ページ定義ファイルに関連付けられたタスク・フロー・アクティビティでは、タスク・フロー・アクティビティ・アイコンの右下にアイコンが表示されます。

タスク・フロー・アクティビティにページ定義ファイルを関連付けるには:

1. 「ダイアグラム」ビューで、ページ定義ファイルを作成するタスク・フロー・アクティビティを右クリックし、ポップアップ・メニューから「ページ定義の作成」を選択します。

2. 作成されたページ定義ファイルに、タスク・フロー・アクティビティの実行時に参照させたいバインドを追加します。

ページ定義ファイルの詳細は、第12.3.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

前述の手順を完了すると、デザインタイムに、タスク・フロー・アクティビティのページ定義ファイルがJDeveloperによって生成されます。ページ定義ファイルのファイル名は、元のタスク・フローと、タスク・フロー・アクティビティ名または起動するデータ・コントロール操作から構成されます。JDeveloperは作成されたページ定義ファイル内で、タスク・フロー・アクティビティからバインドへのEL式も生成します。実行時にバインディング・コンテナは、タスク・フロー・アクティビティのEL式が正しい値を参照していることを確認します。

12.2.6 制御フローの定義方法

MAF AMXアプリケーション機能内で制御フローを定義するには、次のタスク・フロー・コンポーネントを使用します。

- 制御フロー・ケース(第12.2.6.1項「制御フロー・ケースの定義」を参照)

- ワイルドカード制御フロー・ルール(第12.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照)

12.2.6.1 制御フロー・ケースの定義

制御がアクティビティから次のアクティビティに渡される方法を指定する制御フロー・ケース・コンポーネントを使用してナビゲーションを作成できます。制御フローを作成するには、「コンポーネント」ウィンドウから「制御フロー・ケース」を選択します。次に、制御フロー・ケースをソース・アクティビティに接続し、さらにターゲット・アクティビティに接続します。ソースおよびターゲット・アクティビティを接続すると、JDeveloperでは、次のものが作成されます。

- control-flow-rule: from-activity-idを使用してソース・アクティビティを識別します。

- control-flow-case: to-activity-idを使用してターゲット・アクティビティを識別します。

MAFタスク・フロー・ダイアグラムで制御フロー・ケースを直接定義するには:

1. 「ダイアグラム」ビューで、タスク・フロー・ソース・ファイルを開きます。

2. 「コンポーネント」ウィンドウから「制御フロー・ケース」を選択します。

3. ダイアグラムで、ソース・アクティビティをクリックし、次にターゲット・アクティビティをクリックします。ダイアグラムに制御フロー・ケースが追加されます。アクティビティ間に追加された各線は、制御フロー・ケースを表します。from-outcomeには、MAF AMX UIコンポーネントのaction属性に指定された値と照合される値が含まれています。

4. from-outcomeを変更するには、ダイアグラムの制御フローの隣のテキストを選択します。デフォルトでは、これはワイルドカード文字です。

5. from-activity-id(ソース・アクティビティの識別子)やto-activity-id(ターゲット・アクティビティの識別子)を変更するには、ダイアグラムの矢印のどちらかの端を新規のアクティビティにドラッグします。

12.2.6.2 ワイルドカード制御フロー・ルールの追加

MAFタスク・フローでは、後方ワイルドカード(foo*)や単一ワイルドカード文字を含む制御フローfrom-activity-idを表すワイルドカード制御フロー・ルールがサポートされています。ワイルドカード制御フロー・ルールは、「コンポーネント」ウィンドウからドラッグ・アンド・ドロップすることにより、バインドなしタスク・フローまたはバインド・タスク・フローに追加できます。ワイルドカード制御フロー・ルールを構成するには、「プロパティ」ウィンドウを使用します。

ワイルドカード制御フロー・ルールを追加するには:

1. 「ダイアグラム」ビューで、タスク・フロー・ソース・ファイルを開きます。

2. 「コンポーネント」ウィンドウで「ワイルドカード制御フロー・ルール」を選択して、ダイアグラムにドロップします。

3. 「コンポーネント」ウィンドウで、「制御フロー・ケース」を選択します。

4. タスク・フロー・ダイアグラムで、制御フロー・ケースをワイルドカード制御フロー・ルールから(任意のアクティビティ・タイプの)ターゲット・アクティビティにドラッグします。

5. デフォルトでは、ワイルドカード制御フロー・ルールの後のラベルは*です。これは、「アクティビティID(自)」要素の値です。この値を変更するには、ダイアグラムでワイルドカード制御フロー・ルールを選択します。ワイルドカード制御フロー・ルールの「プロパティ」ウィンドウで、 「アクティビティID(自)」フィールドに新しい値を入力します。便利な規則は、ワイルドカード制御フロー・ルールをその目的を表す形式でキャストすることです。たとえば、project*と入力します。新しいラベルでは、ワイルドカードは後続の文字である必要があります。

ヒント:
タスク・フロー・ダイアグラムの概要エディタで、「アクティビティID(自)」の値も変更できます。

6. オプションで、「プロパティ」ウィンドウで、「動作」セクションを開き、「If」フィールドにEL式を記述します(このEL式がtrueに評価されると、「アクティビティID(至)」にで指定されたアクティビティに制御が渡されます)。

12.2.6.3 制御フロー・ルールのメタデータに関する必知事項

次の例は、タスク・フロー・ソース・ファイルの制御フロー・ルール要素の一般的な構文を示しています。

<control-flow-rule>
<from-activity-id>from-view-activity</from-activity-id>
<control-flow-case>
<from-action>actionmethod</from-action>
<from-outcome>outcome</from-outcome>
<to-activity-id>destinationActivity</to-activity-id>
<if>#{myBean.someCondition}</if>
</control-flow-case>
<control-flow-case>
...
</control_flow-case>
</control-flow-rule>

制御フロー・ルールは、次のメタデータで構成されます。

- control-flow-rule: 制御フロー・ケース要素の必須ラッパー要素。

- from-activity-id: 制御フロー・ルールの発生元となるアクティビティの識別子(sourceなど)。
from-activity-idの後方ワイルドカード(*)文字がサポートされています。ルールは、ワイルドカードのパターンに一致するすべてのアクティビティに適用されます。たとえば、login*は、リテラルloginで始まるすべての論理アクティビティID名と一致します。メタデータに(後方ワイルドカードではなく)単一のワイルドカード文字を指定すると、ダイアグラムで、制御フローが自動的にワイルドカード制御フロー・ルール・アクティビティに変換されます。詳細は、第12.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照してください。

- control-flow-case: 制御フロー・ルールの各ケースの必須ラッパー要素。それぞれのケースで、同じソース・アクティビティに対して異なる制御フローを定義します。制御フロー・ルールには、少なくとも1つの制御フロー・ケースが必要です。

- from-action: 指定されたアクション・メソッドからの結果にのみルールの適用を制限するオプション要素。アクション・メソッドは、ELバインディング式(#{backing_bean.cancelButton_action}など)として指定されます。
前の例では、結果がactionmethodから戻された場合にのみ制御がdestinationActivityに渡されます。

from-actionの値は、ビュー・アクティビティから発生する制御フローのみに適用され、その他のアクティビティ・タイプからのものには適用されません。from-actionでは、ワイルドカードはサポートされていません。

- from-outcome: 特定の元のアクティビティ結果に基づき、続いて起こる制御フロー・ケースを識別する要素。考えられるすべての元のアクティビティの結果は、制御フロー・ケースと適合する必要があります。
from-action要素とfrom-outcome要素の両方を空のままにすると、ケースはアクティビティに対して定義されたその他の制御フロー・ケースでは識別されないすべての結果に適用されるため、アクティビティのデフォルト・ケースが作成されます。from-outcomeでは、ワイルドカードはサポートされていません。

- to-activity-id: 制御フロー・ケースが実行される場合にナビゲーションのルーティング先となるアクティビティの完全な識別子が含まれる必須要素。各制御フロー・ケースは、異なるto-activity-idを指定できます。

- if: EL式の値を受け取るオプション要素。実行時にEL式の値がtrueの場合は、to-activity-id要素によって識別されたアクティビティに制御フローを渡します。

12.2.6.4 制御フロー・ルールの評価に関する必知事項

実行時、タスク・フローは、最も具体的な一致から最も具体的でない一致まで制御フロー・ルールを評価して、アクティビティ間の次の遷移を決定します。評価は次の優先度に基づいて行われます。

1. from-activity-id、from-action、from-outcome: 最初に3つの要素すべてで一致の検索が実行されます。

2. from-activity-id、from-outcome: 3つの要素すべてで一致が見つからなかった場合は、これらの要素で検索が実行されます。

3. from-activity-id: 前述の組合せでの検索で一致が見つからなかった場合、この要素のみで検索が実行されます。

12.2.7 MAFの戻るナビゲーションのサポートに関する必知事項

図12-13に示すタスク・フロー例では、アクション結果の値に基づいて、viewA→viewB→viewDまたはviewA→viewC→viewDという2つの別のパスを経由してviewDに到達する可能性があります(第12.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照)。

図12-13 戻るナビゲーションのあるタスク・フロー

どちらのナビゲーション・パスを経由したかを追跡した後、__backナビゲーション・フローを直接実装することも理論的には可能ですが、特に、モバイル・デバイスでは画面領域が限られているためにナビゲーション順序に従わない遷移が非常に頻繁に起こる事実を考慮すると、手間がかかり、エラーも発生しやすくなります。MAFでは、組込みの__backナビゲーションがサポートされているため、タスク・フロー全体にわたる後方移動が可能です。つまり、経由したパスに関する情報を適用することにより、同じパスを経由する後方ナビゲーションを実行します。たとえば、最初のナビゲーションがviewA→viewC→viewDというパスで行われた場合、ViewDで__backオプションを実行すると、MAFは自動的に、ViewB経由ではなくViewAからViewCにエンド・ユーザーを移動します。

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

- 第12.2.3項「ViewController-task-flow.xmlファイルに関する必知事項」

- 第12.2.10項「マネージドBeanの作成および参照方法」

- 第13.3.5.7項「戻るボタン・ナビゲーションの有効化」

12.2.8 ドラッグによりページ・ナビゲーションを有効にする方法

ナビゲーション・ドラッグ動作の操作を使用することによって、異なるMAF AMXページ間のナビゲーションを有効にできます。詳細は、第13.3.27項「ドラッグ・ナビゲーションを有効にする方法」を参照してください。

12.2.9 UIコンポーネントを使用したアクション結果の指定方法

「プロパティ」ウィンドウを使用して、次のUIコンポーネントのいずれかのaction属性を該当する制御フロー・ケースfrom-outcomeに設定して次のタスク・フロー・アクティビティに導くことにより、アクション結果を指定できます。

- コマンド・ボタン(第13.3.5項「ボタンの使用方法」を参照)

- コマンド・リンク(第13.3.6項「リンクの使用方法」を参照)

- リスト・アイテム

UIコンポーネントの「アクション」フィールド(図12-14を参照)を使用して、特定のMAF AMXページの1つ以上のタスク・フローで定義される可能性のあるアクション結果のリストから選択を行います。

図12-14 アクションの設定

戻るアクション(__back)は、各リストに自動的に追加され、前に参照したページへのナビゲーションを可能にします。

注意:
MAF AMXページは、バインド・タスク・フローとバインドなしタスク・フローの両方で参照でき、その場合、両方のタスク・フローからのアクション結果が「アクション」選択リストに含まれます。

12.2.10 マネージドBeanの作成および参照方法

MAFアプリケーションでマネージドBeanを作成および使用して、追加データを格納したり、カスタム・コードを実行することができます。JDeveloperの通常の編集メカニズムを使用して、マネージドBeanを参照したり、適用可能なフィールドに対してマネージドBeanへの参照を作成できます。詳細は、第14.4項「マネージドBeanの作成と使用」を参照してください。

図12-15に、「プロパティ」ウィンドウのactionプロパティに対する「編集」オプションを示します。このオプションをクリックすると、図12-16に示す「プロパティの編集」ダイアログが表示されます。

図12-15 「編集」ダイアログ

図12-16 アクションの「プロパティの編集」ダイアログ

表12-7には、「プロパティ」ウィンドウで「編集」オプションを選択できるMAF AMX属性がリストされています。

表12-3 編集可能な属性

プロパティ

要素

action

amx:commandButton

action

amx:commandLink

action

amx:listItem

action

amx:navigationDragBehavior

action

dvtm:chartDataItem

action

dvtm:ieDataItem

action

dvtm:timelineItem

action

dvtm:area

action

dvtm:marker

actionListener

amx:listItem

actionListener

amx:commandButton

actionListener

amx:commandLink

binding

amx:actionListener

mapBoundsChangeListener

dvtm:geographicMap

mapInputListener

dvtm:geographicMap

moveListener

amx:listView

rangeChangeListener

amx:listView

selectionListener

amx:listView

selectionListener

amx:filmStrip

selectionListener

dvtm:areaDataLayer

selectionListener

dvtm:pointDataLayer

selectionListener

dvtm:treemap

selectionListener

dvtm:sunburst

selectionListener

dvtm:timelineSeries

selectionListener

dvtm:nBox

selectionListener

dvtm:areaChart

selectionListener

dvtm:barChart

selectionListener

dvtm:bubbleChart

selectionListener

dvtm:comboChart

selectionListener

dvtm:lineChart

selectionListener

dvtm:funnelChart

selectionListener

dvtm:pieChart

selectionListener

dvtm:scatterChart

valueChangeListener

amx:inputDate

valueChangeListener

amx:inputNumberSlider

valueChangeListener

amx:inputText

valueChangeListener

amx:selectBooleanCheckbox

valueChangeListener

amx:selectBooleanSwitch

valueChangeListener

amx:selectManyCheckbox

valueChangeListener

amx:selectManyChoice

valueChangeListener

amx:selectOneButton

valueChangeListener

amx:selectOneChoice

valueChangeListener

amx:selectOneRadio

valueChangeListener

dvtm:statusMeterGauge

valueChangeListener

dvtm:dialGauge

valueChangeListener

dvtm:ratingGauge

viewportChangeListener

dvtm:areaChart

viewportChangeListener

dvtm:barChart

viewportChangeListener

dvtm:comboChart

viewportChangeListener

dvtm:lineChart

その他のどのプロパティに対しても「編集」をクリックすると同様のダイアログが表示されますが、図12-17に示すように「アクション結果」オプションはありません。

図12-17 アクション・リスナーの「プロパティの編集」ダイアログ

このダイアログは、マネージドBeanを作成するか、actionプロパティに使用可能なアクション結果を選択できることを示しています。

図12-16に示す「アクション結果」リストには、特定のMAF AMXページが属するすべてのタスク・フローからのアクション結果が含まれています。また、このリストには、前に参照したページに戻るための__backナビゲーション結果が含まれています(詳細は第12.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください)。ページがタスク・フローの一部ではない場合、__backが「アクション結果」リストで使用可能な唯一の結果です。使用可能なアクション結果のいずれかを選択し、「OK」をクリックすると、アクション・プロパティ値は、適切なEL式(commandButtonの場合、次のとおり)で更新されます。

<amx:commandButton action="goHome"/>

「メソッド・バインディング」オプション(図12-16を参照)では、新しいマネージドBeanクラスを作成したり、既存のマネージドBeanクラスを選択することができます。

新しいマネージドBeanクラスを作成するには:

1. 「マネージドBean」フィールドの横にある「新規」をクリックし、図12-18に示す「マネージドBeanの作成」ダイアログを開きます。

図12-18 「マネージドBeanの作成」ダイアログ・ボックス

MAFでは、次のスコープがサポートされています。

- application

- view

- pageFlow

MAFアプリケーションまたはMAF AMXアプリケーション機能に対してマネージドBeanを宣言すると、マネージドBeanはインスタンス化されて適切なスコープ内で識別され、Beanのプロパティが解決されてそのメソッドがELを介してコールされます。詳細は、第14.3項「EL式の作成」を参照してください。

2. マネージドBeanおよびクラス名を指定し(図12-19を参照)、「OK」をクリックします。

図12-19 マネージドBean名およびクラスの設定

次の例は、新規に作成されたマネージドBeanクラスを示しています。このMAF AMXページが含まれるタスク・フローが、Beanを参照するように更新されます。

<managed-bean id="__3">
<managed-bean-name>MyBean</managed-bean-name>
<managed-bean-class>mobile.MyBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

注意:
特定のMAF AMXページがバインド・タスク・フローおよびバインドなしタスク・フローの一部である場合、これら両方のタスク・フローがマネージドBeanエントリで更新されます。

3. 「メソッド」フィールドの横にある「新規」をクリックして(図12-16および図12-17を参照)、図12-20に示す「メソッドの作成」ダイアログを開きます。

図12-20 「メソッドの作成」ダイアログ

このダイアログを使用して、マネージドBeanメソッド名を指定します(図12-21を参照)。

図12-21 マネージドBeanメソッドのネーミング

完了すると、選択したプロパティ値が適切なEL式で更新されます(commandButtonの場合は次のようになります)。

<amx:commandButton action="#{MyBean.getMeHome}"/>

また、マネージドBeanクラスは、次の例に示すように、新規に作成されたメソッドを含むように更新されます。

package mobile;

public class MyBean {
public MyBean() {
}

public String getMeHome() {
// Add event code here...
return null;
}
}

既存のマネージドBeanを選択するには:

1. 図12-22に示す「マネージドBean」リストから選択を行います。

図12-22 マネージドBeanの選択

アクション結果と同様、「マネージドBean」リストには、このMAF AMXページが含まれるすべてのタスク・フローからのマネージドBeanが移入されます。

注意:
MAF AMXページがどのタスク・フローにも属していない場合でも、マネージドBeanは作成できます。

詳細は、次を参照してください。

- 第14.3.6.2項「マネージドBeanカテゴリについて」

- APIDemo (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているMAFサンプル・アプリケーション)。

12.2.11 ページ遷移スタイルの指定方法

タスク・フローでページ遷移スタイルを定義することにより、ビューから別のビューへのMAF AMXページの遷移方法を指定できます。MAF AMXページの遷移動作は次のとおりです。

- フェード・イン

- 左からスライド・イン

- 右からスライド・イン

- 下からスライド・アップ

- 上からスライド・ダウン

- 始点からスライド・イン

- 終点からスライド・イン

- 下からフリップ・アップ

- 上からフリップ・ダウン

- 左からフリップ

- 右からフリップ

- 始点からフリップ

- 終点からフリップ

- なし

始点および終点からスライド・インと、始点および終点からフリップは、iOSプラットフォームおよびAndroid 4.2以降のプラットフォームで右から左(RTL)のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点の遷移スタイルを使用することをお薦めします。

次の例のようにcontrol-flow-case(制御フロー・ケース・コンポーネント)のtransition属性を変更することによって、遷移スタイルを設定します。

<control-flow-rule id="__1">
<from-activity-id>products</from-activity-id>
<control-flow-case id="__2">
<from-outcome>details</from-outcome>
<to-activity-id>productdetails</to-activity-id>
<transition>fade</transition>
</control-flow-case>
</control-flow-rule>

図12-23に示すように、「プロパティ」ウィンドウでは、transition属性は「動作」の下にあります。デフォルトの遷移スタイルはslideLeftです。

図12-23 「プロパティ」ウィンドウでの遷移スタイルの設定

ヒント:
タスク・フローを定義する際は、control-flow-caseのtransition値を論理的になるように指定する必要があります。たとえば、戻るナビゲーションの目的で左から右への遷移が発生する場合、右にスライドすることにより遷移が前のページに戻る必要があります。

12.2.12 バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項

タスク・フローでは、MAF AMXアプリケーション機能内で制御フローを定義するためのモジュールのアプローチが提供されています。アプリケーション機能は単一の大規模なページ・フローとして表すのではなく、再利用可能な一連のタスク・フローに分割できます。各タスク・フローには、アプリケーション機能のナビゲーション・グラフの一部が含まれます。タスク・フロー内のノードはアクティビティを表しています。アクティビティ・ノードは、ページの表示、アプリケーション・ロジックの実行、別のタスク・フローのコールなど、シンプルな論理的操作を表しています。アクティビティ間の遷移は制御フロー・ケースと呼ばれます。

MAF AMXでは、次の2種類のタスク・フローがあります。

1. バインドなしタスク・フロー: 対話によってユーザーがタスクを完了できるようにする一連のアクティビティ、制御フロー・ルールおよびマネージドBeanです。バインドなしタスク・フローは、バインド・タスク・フローに含まれていない、MAF AMXアプリケーション機能内のすべてのアクティビティおよび制御フローで構成されています。

2. バインド・タスク・フロー: タスク・フローの特殊な形式であり、バインドなしタスク・フローとは異なり、単一エントリ・ポイントが存在し、終了ポイントは存在しません。これには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。

バインドなしタスク・フローまたはバインド・タスク・フローに追加可能なアクティビティ・タイプの説明は、第12.2.2項「タスク・フロー・アクティビティと制御フローに関する必知事項」を参照してください。

通常のMAF AMXアプリケーション機能には、アプリケーション機能の作成時に作成された1つのバインドなしタスク・フローと、1つ以上のバインド・タスク・フローの組合せが含まれます。実行時、MAFアプリケーションは、バインドなしタスク・フローに追加されたアクティビティからバインド・タスク・フローをコールできます。

12.2.12.1 バインドなしタスク・フロー

各MAF AMXアプリケーション機能には必ず、そのアプリケーション機能に対する1つ以上のエントリ・ポイントを提供するバインドなしタスク・フローが1つ含まれています。エントリ・ポイントはビュー・アクティビティによって表されます。デフォルトでは、バインドなしタスク・フローのソース・ファイルはadfc-mobile-config.xmlファイルです。

図12-24に、MAF AMXアプリケーション機能からのバインドなしタスク・フローのダイアグラムを示します。このタスク・フローにはいくつかのビュー・アクティビティが含まれており、いずれもアプリケーション機能へのエントリ・ポイントになっています。

図12-24 バインドなしタスク・フローのダイアグラム

次のことが該当する場合、バインドなしタスク・フローを使用することを検討してください。

- タスク・フローを別のタスク・フローによってコールする必要がない場合

- MAF AMXアプリケーション機能に複数のエントリ・ポイントがある場合

- 指定されたアクティビティをタスク・フロー内で最初に実行する(デフォルト・アクティビティ)必要がない場合

バインドなしタスク・フローはバインド・タスク・フローをコールできますが、別のタスク・フローからバインドなしタスク・フローをコールすることはできません。

12.2.12.2 バインド・タスク・フロー

デフォルトでは、IDEによって、バインド・タスク・フローのソース・ファイルのファイル名が提案されます(第12.2.1項「タスク・フローの作成方法」を参照)。このファイル名は、実行するタスクの目的を表す名前に変更できます。

バインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそこからも次々にコールできます。コールに深さ制限はありません。

図12-25に、MAF AMXアプリケーション機能からのバインド・タスク・フローのダイアグラムを示します。

図12-25 バインド・タスク・フローのダイアグラム

バインド・タスク・フローを作成する理由は次のとおりです。

- バインド・タスク・フローでは常に、バインド・タスク・フローの開始直後に実行する必要のある単一エントリ・ポイントとなるデフォルト・アクティビティが指定されます。

- 同じMAF AMXアプリケーション機能または他のMAF AMXアプリケーション機能内で再利用可能です。

- バインド・タスク・フロー内で使用するマネージドBeanはいずれも、ページ・フロー・スコープで指定できるため、残りのMAF AMXアプリケーション機能からは分離されます。これらのマネージドBean(およびページ・フロー・スコープ)は、タスク・フローが完了した際に自動的に解放されます。

バインド・タスク・フローの主な特性の概要を次に示します。

- 明確に定義された境界: バインド・タスク・フローは、プライベート制御フロー・ルール、アクティビティおよびマネージドBeanの独自のセットで構成されます。コール元は、バインド・タスク・フロー境界内におけるページ名、メソッド・コール、子バインド・タスク・フロー、マネージドBean、制御フロー・ルールの内部知識を必要としません。データ・コントロールはタスク・フロー間で共有できます。

- 単一のエントリ・ポイント: バインド・タスク・フローには、タスク・フロー内の他のすべてのアクティビティより前に実行されるデフォルト・アクティビティである単一のエントリ・ポイントがあります。

- ページ・フロー・メモリー・スコープ: バインド・タスク・フロー内のアクティビティ間でデータを受け渡すためのメモリー・スコープとして、ページ・フロー・スコープを指定できます。ページ・フロー・スコープは、バインド・タスク・フローの各インスタンスに対する一意の記憶域を定義します。その存続期間はバインド・タスク・フローであり、requestスコープより長く、sessionスコープより短くなっています。

- 指定可能: バインド・タスク・フローには、バインド・タスク・フローのXMLソース・ファイル内の一意の識別子とXMLソース・ファイルのファイル名を指定することによりアクセスできます。

- 再利用可能: アクティビティ・グループ全体を単一のエンティティ、つまりバインド・タスク・フローとして指定し、そのバインド・タスク・フローをMAFアプリケーション内の別のMAF AMXアプリケーション機能で再利用できます。
また、既存のバインド・タスク・フローは、コールすることにより再利用できます。

さらに、タスク・フロー・テンプレートを使用して、様々なバインド・タスク・フローで再利用するための共通の動作を取得できます。

- パラメータおよび戻り値: コール元は、入力パラメータをバインド・タスク・フローに渡し、そこから戻り値を受け入れることができます(第12.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」および第12.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照)。
また、バインド・タスク・フロー間でデータ・コントロールを共有できます。

- メタデータのオンデマンド・ロード: バインド・タスク・フローのメタデータは、バインド・タスク・フローの開始時にオンデマンドでロードされます。

12.2.12.3 タスク・フローのパラメータの使用

タスク・フローには入力パラメータを受け入れてパラメータ値を戻す機能があるため、タスク・フローのデータを操作できる他、タスク・フロー間でデータを共有できます。これらの機能を使用して、MAF AMXアプリケーション機能でのタスク・フローの再利用を最適化できます。

図12-26に、pageFlowスコープ内のユーザーに関する情報を保持する入力パラメータ定義を指定するタスク・フローを示します。

図12-26 タスク・フローの入力パラメータ

タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールする場合、標準のEL式を使用してパラメータ値を指定できます。たとえば、次のEL式の構文を使用してパラメータを指定できます。

- #{bindings.bindingId.inputValue}

- #{CustomerBean.zipCode}

inputValueをEL式に追加することで、実際のバインディング・オブジェクトではなく、バインディングの値をパラメータに確実に割り当てることができます。

12.2.12.3.1 バインド・タスク・フローへのパラメータ渡し

コール先のバインド・タスク・フローは、コール元のタスク・フローまたはタスク・フロー・バインディングから入力パラメータを受け取ることができます。

入力パラメータをバインド・タスク・フローに渡すには、次のうち1つ以上を指定します。

- コール元のタスク・フローにあるタスク・フロー・コール・アクティビティの入力パラメータ: 入力パラメータは、コール元のタスク・フローでパラメータ値が格納される場所を指定します。

- コール先のバインド・タスク・フローの入力パラメータ定義: 入力パラメータ定義は、コール先のバインド・タスク・フローで実行時にパラメータ値を取得できる場所を指定します。

コール元のタスク・フローにあるタスク・フロー・コール・アクティビティで定義する入力パラメータおよびコール先のバインド・タスク・フローの入力パラメータ定義と同じ名前を指定します。これを行うことで、コール先のバインド・タスク・フローに入力パラメータ値をマップできます。

入力パラメータの値を参照するEL式を指定しない場合は、valueのEL式のデフォルト値を実行時に次のように設定します。

#{pageFlowScope.parmName}

ここで、parmNameは、入力パラメータ名に入力した値です。

コール先のバインド・タスク・フローの入力パラメータ定義では、必要に応じて入力パラメータを指定できます。入力パラメータが実行時またはデザインタイムに値を受け取らない場合、タスク・フローは、そのタスク・フローを含むMAFアプリケーションのログ・ファイル内に警告を生成します。必要に応じて指定しない入力パラメータは、タスク・フロー・コール・アクティビティの作成時に無視できます。

タスク・フロー・コール・アクティビティを使用してタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティの入力パラメータを参照渡しまたは値渡しにできます(第12.2.5.4.2項「タスク・フロー・コール・アクティビティへの入力パラメータの指定」を参照)。デフォルトでは、プリミティブ・タイプ(int、long、booleanなど)が値渡し(pass-by-value)されます。

コール先のタスク・フローは、終了時にコール元のタスク・フローに値を戻すことができます。詳細は、第12.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照してください。

入力パラメータをバインド・タスク・フローに渡す場合、コール元のタスク・フローとコール先のタスク・フローの両方で値を定義します。

始める前に

- コール元のタスク・フローとコール先のタスク・フローを作成します。コール元のタスク・フローはバインド・タスク・フローにすることも、バインドなしタスク・フローにすることもできます。コール先のタスク・フローはバインドにする必要があります。タスク・フローの作成の詳細は、第12.2.1項「タスク・フローの作成方法」を参照してください。

- タスク・フロー・コール・アクティビティをコール元のタスク・フローに追加します。

図12-27には、ビュー・アクティビティがタスク・フロー・コール・アクティビティに制御を渡す例が示されています。

図12-27 コール元のタスク・フロー

入力パラメータをバインド・タスク・フローに渡すには:

1. エンド・ユーザーが実行時にバインド・タスク・フローにパラメータとして渡される値を入力する際に使用する入力コンポーネントを含むMAF AMXページを開きます。

注意:
開いたMAF AMXページは、コール元のタスク・フローにあるビュー・アクティビティによって参照される必要があります。

2. MAF AMXページで、エンド・ユーザーが実行時に値を入力する入力テキスト・コンポーネントを選択します。

3. 「プロパティ」ウィンドウで、「共通」セクションを開き、「値」フィールドに入力テキスト・コンポーネントの値を入力します。
手動で、または式ビルダーを使用して、EL式としての値を指定できます(例: #{pageFlowScope.inputValue})。

4. 「アプリケーション」ウィンドウで、コールするタスク・フローをダブルクリックして開いた後、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

5. 「入力パラメータの定義」セクションで、「追加」(+)をクリックして新しいエントリを指定します(図12-26を参照)。

- 「名前」フィールドに、パラメータの名前(inputParm1など)を入力します。

- 「値」フィールドに、手動で、または式ビルダーを使用して、パラメータ値を格納および参照するEL式(#{pageFlowScope.inputValue}など)を入力します。

6. 「アプリケーション」ウィンドウで、コール先のバインド・タスク・フローを起動するタスク・フロー・コール・アクティビティを含むコール元タスク・フローをダブルクリックします。

7. 「アプリケーション」ウィンドウで、コール元のタスク・フローのダイアグラムにあるタスク・フロー・コール・アクティビティの最上部に、コール先のバインド・タスク・フローをドラッグ・アンド・ドロップします。これにより、バインド・タスク・フローへのタスク・フロー参照が自動的に作成されます。図12-28に示すように、タスク・フロー参照には次のものが含まれます。

- バインド・タスク・フローのID (id): バインド・タスク・フローのtask-flow-definition要素の属性

- IDを含むタスク・フローのソース・ファイルを指すドキュメント名

図12-28 タスク・フローの参照

8. タスク・フロー・コール・アクティビティの「プロパティ」ウィンドウで、「パラメータ」を開いて、「入力パラメータ」セクションを表示します。

- 入力パラメータを識別する名前の入力: 入力パラメータが定義されているタスク・フロー・コール・アクティビティにバインド・タスク・フローをドロップしたため、名前はすでに指定されています。同じ入力パラメータ名を維持する必要があります。

- パラメータ値(#{pageFlowScope.param1}など)の入力: タスク・フロー・コール・アクティビティの入力パラメータの値によって、コール元のタスク・フローでパラメータ値が格納される場所が指定されます。コール先のタスク・フローの入力パラメータ定義の値は、値が渡された後にコール先のバインド・タスク・フロー内で使用するために値が取得される場所を指定します。

実行時、コール先のタスク・フローは入力パラメータを使用できます。コール先のタスク・フローの入力パラメータ定義で値としてpageFlowScopeを指定した場合、コール先のバインド・タスク・フローのどこでもパラメータ値を使用できます。たとえば、コール先のバインド・タスク・フローのビュー・アクティビティにパラメータ値を渡すことができます。

完了すると、選択した値に基づいて、コール元のタスク・フローとコール先のタスク・フローのソース・ファイルにエントリが書き込まれます。

次の例は、バインド・タスク・フローで指定された入力パラメータ定義を示しています。

<task-flow-definition id="sourceTaskflow">
...
<input-parameter-definition>
<name>inputParameter1</name>
<value>#{pageFlowScope.parmValue1}</value>
<class>java.lang.String</class>
</input-parameter-definition>
...
</task-flow-definition>

次の例は、前の例に示したバインド・タスク・フローをコールするタスク・フロー・コール・アクティビティの入力パラメータ・メタデータを示しています。

<task-flow-call id="taskFlowCall1">
...
<input-parameter>
<name>inputParameter1</name>
<value>#{pageFlowScope.newCustomer}</value>
<pass-by-value/>
</input-parameter>
...
</task-flow-call>

実行時に、タスク・フロー・コール・アクティビティはバインド・タスク・フローをコールして、そのvalue要素で指定された値を渡します。

12.2.12.3.2 バインド・タスク・フローの戻り値の構成

コール先のタスク・フローにある戻り値の定義を構成し、実行時に戻り値を取得するコール元のタスク・フローのタスク・フロー・コール・アクティビティにパラメータを追加します。

始める前に

バインド・タスク・フローまたはバインドなしタスク・フローを(コール元のタスク・フローに対して)作成し、バインド・タスク・フローを(コール先のタスク・フローに対して)作成します。詳細は、第12.2.1項「タスク・フローの作成方法」を参照してください。

コール先のバインド・タスク・フローの戻り値を構成するには:

1. 「アプリケーション」ウィンドウで、コールするタスク・フローをダブルクリックして開いた後、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

2. 「戻り値の定義」セクションで、「追加」(+)をクリックして戻り値を指定します(図12-26を参照)。

- 「名前」フィールドに、戻り値を識別する名前(returnValue1など)を入力します。

- 「クラス」フィールドに、戻り値のデータ型を定義するJavaクラスを入力します。デフォルト値はjava.lang.Stringです。

- 「値」フィールドに、手動で、または式ビルダーを使用して、戻り値を読み取る場所を指定するEL式(#{pageFlowScope.ReturnValueDefinition}など)を入力します。

3. 「アプリケーション」ウィンドウで、コール元のタスク・フローをダブルクリックします。

4. 「ダイアグラム」ビューでタスク・フロー・ページを開いた状態で、「コンポーネント」ウィンドウから「コンポーネント」→「アクティビティ」を選択し、タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

5. タスク・フロー・コール・アクティビティの「プロパティ」ウィンドウで、「パラメータ」セクションを開き、「戻り値」エントリの「追加」(+)をクリックして、戻り値を定義する次の値を追加します。

- 戻り値を識別する名前(たとえばreturnValue1)。これは、手順2で戻り値の定義を定義したときに「名前」フィールドに入力した値と一致している必要があります。

- 戻り値を格納する場所を指定する、EL式としての値(#{pageFlowScope.ReturnValueDefinition}など)。

完了すると、構成したコール元のタスク・フローのソース・ファイルにエントリが書き込まれます。

次の例では、コール元のタスク・フローのソース・ファイルに対してJDeveloperで記述したサンプル・エントリを示しています。

<task-flow-call id="taskFlowCall1">
<return-value id="__3">
<name id="__4">returnValue1</name>
<value id="__2">#{pageFlowScope.ReturnValueDefinition}</value>
</return-value>
</task-flow-call>

次の例では、コール先のタスク・フローのソース・ファイルに対してJDeveloperで記述したサンプル・エントリを示しています。

<return-value-definition id="__2">
<name id="__3">returnValue1</name>
<value>#{pageFlowScope.ReturnValueDefinition}/</value>
<class>java.lang.String</class>
</return-value-definition>

実行時に、コール先のタスク・フローが値を返します。この構成の場合は、コール元のタスク・フローにあるタスク・フロー・コール・アクティビティがその値を取得します。

12.3 ビューの作成

MAF AMXビューの作成は、次のことから開始できます。

- MAF AMXページ構造に関する理解(第12.3.1.1項「MAF AMXページ構造の解釈」)

- MAF AMXページの編集とプレビュー(第12.3.1.4項「UIエディタの使用方法」を参照)

- MAF AMXページへのコンポーネントのドラッグ・アンド・ドロップ(第12.3.2項「MAF AMXページにUIコンポーネントを追加する方法」を参照)

- ビューへのデータ・コントロールの追加(第12.3.3項「MAF AMXページへのデータ・コントロールの追加方法」を参照)

12.3.1 MAF AMXページの使用方法

MAF AMXページは、構造がページのプレゼンテーションと機能を定義している階層化要素から構成されるXMLファイルで表現されています。

12.3.1.1 MAF AMXページ構造の解釈

MAF AMXファイルの基本構造は次のとおりです。

<amx:view>
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
…
</amx:facet>
</amx:panelPage>
</amx:view>

データ可視化コンポーネント(第13.5項「データ視覚化の指定」を参照)を除き、UI要素は<amx>名前空間の下で宣言されます。

詳細は、第12.3.1.3項「MAF AMXページの作成時に行われる処理」を参照してください。

12.3.1.2 MAF AMXページの作成

MAF AMXファイルは、MAFアプリケーションのビュー・コントローラ・プロジェクトに含まれています。これらのファイルは、「MAF AMXページの作成」ダイアログを使用して作成します。

MAFでは、MAF AMXページの作成方法がこれ以外に2通りあります。

- 「新規ギャラリ」から

- 既存のタスク・フローから

始める前に

MAF AMXページを作成するには、MAFアプリケーションにビュー・コントローラ・プロジェクト・ファイルが含まれている必要があります(第2章「MAFアプリケーション開発のスタート・ガイド」を参照)。

「新規ギャラリ」からMAF AMXページを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」の順に選択します(図12-29を参照)。「OK」をクリックします。

図12-29 MAF AMXページの作成

3. 図12-30に示すように、「MAF AMXページの作成」ダイアログで、新しいファイルの名前および(必要な場合は)場所を入力します。

4. オプションで、ページ・レイアウトの一部としてどのファセットを新しいMAF AMXページに含めるかを選択することもできます。

- ヘッダー

- プライマリ

- セカンダリ

- フッター

詳細は、第12.3.1.3項「MAF AMXページの作成時に行われる処理」および第13.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

注意:
ファセットを選択または選択解除すると、変更されたページの外観を反映するよう、ページを表すイメージは動的に変わります。

図12-30 「MAF AMXページの作成」ダイアログ

注意:
ファセットの選択はMAFによって保持され、それ以降に「MAF AMXページの作成」ダイアログが開かれるたびにその選択が適用されます。

5. 「MAF AMXページの作成」ダイアログで、「OK」をクリックします。

タスク・フローのビュー・コンポーネントからMAF AMXページを作成するには:

1. ダイアグラマでタスク・フロー・ファイルを開きます(図12-7「タスク・フロー・エディタのダイアグラマ」、第12.2.1項「タスク・フローの作成方法」および第12.2.4項「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)。

2. タスク・フローのビュー・コンポーネントをダブルクリックして、図12-30に示す「MAF AMXページの作成」ダイアログを開き、新しいファイルの名前および(必要な場合は)場所を入力します。「OK」をクリックします。

12.3.1.3 MAF AMXページの作成時に行われる処理

「MAF AMXページの作成」ダイアログを使用してMAF AMXページを作成すると、JDeveloperによって物理ファイルが作成されて、ビュー・コントローラ・プロジェクトのWeb Contentディレクトリに追加されます。

図12-31に示す「アプリケーション」ウィンドウでは、「Webコンテンツ」ノードに、新たに作成されたdepartment.amxというMAF AMXファイルが含まれています。

図12-31 「アプリケーション」ウィンドウのMAF AMXファイル

JDeveloperは、コンポーネント・ライブラリをインポートし、ページを表示するために必要なコードの追加も行います。このコードは、図12-31に示す「ソース」エディタに表示されます。

図12-33に、ページの作成時に「MAF AMXページの作成」ダイアログの「ページ・ファセット」セクションにリストされたすべてのファセット・タイプを選択した場合に(図12-32を参照)、「プレビュー」ペインおよび生成されたMAF AMXコードがどのようになるかを示します。

図12-32 すべてのファセットが選択された「MAF AMXページの作成」ページ

図12-33 すべてのファセットが含まれるMAF AMXページ

すべてのファセットを選択して作成したページ(図12-32および図12-33を参照)では、次の点に注意してください。

- ヘッダーは出力テキスト・コンポーネントで作成されます。これはこのコンポーネントが通常ページ・タイトルに使用されるためです。

- プライマリおよびセカンダリのアクションは、ボタン・コンポーネントで作成されます。これは、これが通常のパターンであるためです。

- フッターの場合、1つだけ群を抜いているパターンはないため、デフォルトでは出力テキスト・コンポーネントで作成されます。これは、このコンポーネントがいくつかのパターンで使用されており、JDeveloperが監査違反のある初期コードを生成することを回避できるためです。

- ヘッダー・ファセットを追加せずにプライマリ・アクションまたはセカンダリ・アクションのいずれかを追加しても、ヘッダー・セクションは「MAF AMXページの作成」ダイアログの「ページ・ファセット」セクションに表示されます。

図12-34に、いずれのファセットも選択していない「MAF AMXページの作成」ページの「ページ・ファセット」セクションを示し、図12-35に、「プレビュー」ペインおよび生成されたMAF AMXコードを示します。

図12-34 ファセットが選択されていない「MAF AMXページの作成」ページ

図12-35 ファセットを含まないMAF AMXページ

12.3.1.4 UIエディタの使用方法

最初にJDeveloperに表示されるとき、ページは「ソース」エディタに表示されます。WYSIWYG環境でページを表示するには、「プレビュー」ペイン(「プレビュー」タブをクリックしてアクセスします)を使用します。

図12-36に、新たに作成されたdepartment.amxというMAF AMXページに対して選択された「プレビュー」タブを示します。まだMAF AMX UIコンポーネントやデータ・コントロールが移入されていないため、このページは空白です。

図12-36 新たに作成されたページの「プレビュー」ペイン

図12-36に示す「プレビュー」ペインのツールバーを使用すると、次のことができます。

- 「ページのリフレッシュ」をクリックすると、MAF AMXページの表示をリフレッシュできます。

- 「ページのロードを中止」をクリックすると、ページのロードを中止できます。

- ドロップダウンリストから別のフォーム・ファクタを選択すると、ページのフォーム・ファクタを変更できます。フォーム・ファクタの詳細は、『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』のフォーム・ファクタに応じた開発環境の構成に関する項を参照してください。

- ドロップダウン・リストから別のパーセント値を選択すると、表示のスケーリングを変更できます。モバイル・デバイスは様々なサイズおよび密度で表示されるため、「プレビュー」ペインでは、MAF AMXページでのスケーリングの効果を確認できます。

注意:
スケーリングは縦と横の両方のモードで使用できます。

- 「縦向きの表示」または「横向きの表示」を選択することにより、表示の向きをそれぞれ横または縦に変更できます。

- 使用可能なアプリケーション機能のドロップダウン・リストから、MAF AMXページの機能コンテンツを選択します。デフォルトでは、「機能コンテンツが選択されていません」が表示されます。

ソース・エディタでページのソースを表示するには、図12-31 「「アプリケーション」ウィンドウのMAF AMXファイル」に示された「ソース」タブをクリックします。JDeveloperの左下部にある「構造」ウィンドウ(図12-31および図12-36を参照)には、ページが階層形式で表示されます。詳細は、第12.3.2.1項「「プレビュー」の使用方法」を参照してください。

12.3.1.5 ページ定義ファイルへのアクセス

MAF AMXでは、JDeveloperの「ページ定義に移動」機能がサポートされているため(図12-37および第12.3.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照)、バインディング情報をすばやく見つけて編集できるようにするポップアップ・メニューを使用することで、MAF AMXページ定義に移動できます。

図12-37 「ページ定義に移動」を使用してアクセスしたページ定義ファイル

次の場所から「ページ定義に移動」オプションを含むポップアップ・メニューを起動できます。

- ソース・エディタ(図12-38)

図12-38 「ソース」エディタからの「ページ定義に移動」

- 「アプリケーション」ウィンドウ(図12-39)

図12-39 「アプリケーション」ウィンドウからの「ページ定義に移動」

- 「構造」ウィンドウ(図12-40)

図12-40 「構造」ペインからの「ページ定義に移動」

さらに、図12-41のように、メイン・メニューの「ツール」→「プリファレンス」の下で定義されている「ページ定義に移動」ショートカット・キーを使用して、ページ定義ファイルを開くこともできます。

図12-41 「プリファレンス」から「ページ定義」を開く

12.3.1.6 ページ・コンテンツの共有

MAF AMXページのコンテンツの共有を有効にできます。フラグメント(fragment)は、MAF AMXページ要素の再利用可能な部分(属性やファセットなど)をテンプレートで表されるコンテンツに挿入できるようにする動的な宣言コンポーネントです。これにより、アプリケーション内の様々なページでフラグメント・テンプレートを再利用することで、アプリケーションのルック・アンド・フィールを標準化できます。

MAF AMXフラグメント・ファイル(.amxf)をMAF AMXページまたは別のフラグメント・ファイルにドラッグ・アンド・ドロップして、フラグメントへの参照を作成し、その属性を定義できます(第12.3.1.6.1項「フラグメント・コンテンツの構成」を参照)。フラグメント・ファイルはプロジェクト内部に存在し、「アプリケーション」ウィンドウからドロップできます。

始める前に

MAFアプリケーションにビュー・コントローラ・プロジェクトが含まれていることを確認してください。

ビュー・コントローラ・プロジェクトに、MAF AMXページも、ページの作成元のMAF AMXページ・タスク・フローも含まれない場合は、タスク・フロー・ダイアグラムで「表示」アイコンをダブルクリックするか、「新規ギャラリ」から「クライアント層」→「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」を選択することにより、「MAF AMXページの作成」ダイアログを起動できます(第12.3.1.2項「MAF AMXページの作成」を参照)。

「新規ギャラリ」からフラグメントを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ・フラグメント」の順に選択します(図12-42を参照)。「OK」をクリックします。

図12-42 新しいフラグメントの作成

3. 図12-43に示すように、「MAF AMXページ・フラグメントの作成」ダイアログに新しいフラグメントのファイル名と場所を入力します。「OK」をクリックします。

図12-43 「MAF AMXページ・フラグメントの作成」ダイアログ

ダイアログへの入力が完了すると、新しく作成したファイルがJDeveloperのソース・エディタ内に開きます(図12-44を参照)。

図12-44 フラグメント・ファイル

4. 「構造」ウィンドウで「フラグメント」を右クリックし、「フラグメントの中に挿入」を選択します。新しいフラグメントに移入する要素として、「属性」、属性リスト、「説明」、「ファセット」または「ポップアップ」を選択します(図5-45を参照)。

図12-45 フラグメントへの移入

5. 引き続き、「構造」ビューでフラグメントの子を右クリックして適切な値を選択することにより、フラグメントの「属性」および他の子を定義します(図12-46を参照)。

図12-46 フラグメントの属性の定義

フラグメントを定義するには、「コンポーネント」ウィンドウで「MAF AMXフラグメント」を選択して、その要素をMAF AMXフラグメント・ファイルにドラッグ・アンド・ドロップする方法もあります(図12-47を参照)。

図12-47 フラグメント要素のドラッグ・アンド・ドロップ

次の例は、fragment1.amxfという名前のMAF AMXフラグメント・ファイルを示しています。

<amx:fragmentDef
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment" id="f1">
<description id="d1">Description of the fragment</description>
<facet id="f2">
<description id="d4">Description of the facet</description>
<facet-name id="f3">facet1</facet-name>
</facet>
<attribute id="a1">
<description id="d2">Description of an attribute</description>
<attribute-name id="a2">text</attribute-name>
<attribute-type id="at1">String</attribute-type>
<default-value id="d3">defaultValue</default-value>
</attribute>
</fragment>
<amx:panelGroupLayout id="pgl1">
<amx:facetRef facetName="facet1" id="fr1"/>
<amx:outputText value="#{text}" id="ot1"/>
</amx:panelGroupLayout>
</amx:fragmentDef>

フラグメントのコンテンツをMAF AMXページに含めるには、フラグメント・コンポーネントを作成し(第13.2.14項「フラグメント・コンポーネントの使用方法」を参照)、そのsrc属性を任意のフラグメント・ファイルに設定します。次の例は、MAF AMXページに追加されたfragment要素を示しています。この要素は、そのページ・コンテンツとしてfragment1.amxfを指しています。同時に、ファセット定義MAF AMXコンポーネントに対応するfacetRef要素は、そのfacet (MAF AMXファセット・コンポーネント)としてfacet1を指しています。facetRef要素は、.amxfファイルのfragmetDef内でのみ指定できます。MAF AMX attribute要素を子として指定することにより、属性をfacetRefに渡すことができ、これにより、attributeの値を介してフラグメントからファセットにEL変数を渡すことができます。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:panelGroupLayout layout="vertical"
id="itemPgl"
styleClass="amx-style-groupbox">
<amx:fragment id="f1"
src="/simpleFragment.amxf"
<amx:attribute id="a1"
name="text"
value="defaultValue" />
<amx:facet name="facet">
<amx:outputText id="ot5" value="Fragment"/>
</amx:facet>
</amx:fragment>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

フラグメントは、その属性を介してすべての情報を受け取ります。個々の属性を定義する以外に、フラグメントにリストとして渡す一連の属性を定義でき、それらをフラグメント定義で繰り返し使用できます。詳細は、第12.3.1.6.2項「フラグメントへの属性リストおよびメタデータの受渡し」を参照してください。

注意:
フラグメント・ファイル(.amxf)内で使用されるEL式は検証されません。

フラグメントでは、次のものがサポートされています。

- 埋込みポップアップ(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

- 1つ以上の他の親ページまたはフラグメントに配置できる再利用可能なユーザー・インタフェース。これにより、バインディングを含まず他のコンポーネントで構成されるコンポーネントを作成できます。

- 独自のファセットの定義。これにより、ヘッダー・ファセット、サマリー・ファセットおよび詳細ファセットを定義するレイアウト・コンポーネントなどのコンポーネントを作成し、各ファセットに独自のスタイル・クラスとルック・アンド・フィールを設定できます。

- 属性とコレクションの両方を持つデータ・モデル。

MAFサンプル・アプリケーション(FragmentDemoおよびCompGallery)によって、フラグメントの作成方法と使用方法を示します。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリのPublicSamples.zipファイル内にあります。

12.3.1.6.1 フラグメント・コンテンツの構成

MAF AMXフラグメント・ファイル(.amxf)をMAF AMXページまたは別のフラグメント・ファイルにドラッグ・アンド・ドロップすると、「フラグメント・コンテンツの構成」ダイアログ(図12-48を参照)が表示されます。このダイアログが表示されると、フラグメントの直接の子として定義されたすべてのフラグメント属性を指定できます。

注意:
「フラグメント・コンテンツの構成」ダイアログでは、ファセット・コンポーネント、ポップアップ・コンポーネント、属性リストおよびそのアーティファクトは使用できません。

図12-48 「フラグメント・コンテンツの構成」ダイアログ

図12-49は、MAF AMXフラグメント・ファイル(そのコンテンツは次の例を参照)をMAF AMXファイルにドラッグ・アンド・ドロップしたときに表示される「フラグメント・コンテンツの構成」ダイアログを示しています。

<amx:fragmentDef
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment" id="f1">
<description id="d1">Description of the fragment</description>
<facet id="f2">
<description id="d4">Description of the facet</description>
<facet-name id="f3">facet1</facet-name>
</facet>
<attribute id="a1">
<description id="d2">Description of an attribute</description>
<attribute-name id="a2">text</attribute-name>
<attribute-type id="at1">String</attribute-type>
<default-value id="d3">defaultValue</default-value>
</attribute>
</fragment>
<amx:panelGroupLayout id="pgl1">
<amx:facetRef facetName="facet1" id="fr1"/>
<amx:outputText value="#{text}" id="ot1"/>
</amx:panelGroupLayout>
</amx:fragmentDef>

図12-49 値が表示された「フラグメント・コンテンツの構成」ダイアログ

ダイアログに入力する際は、次の点を考慮してください。

- フラグメントで必須として定義された属性を構成する場合は、属性名の末尾にアスタリスク(*)が表示されます。

- 必須の属性値をすべて定義するまで、ダイアログの「OK」ボタンは無効です。

- フラグメント属性のデフォルト値が指定されており、同時にrequiredプロパティが定義されていてtrueに設定されている場合、この属性は必須として扱われません(デフォルト値が優先されます)。この場合は、次のようになります。

- フラグメントに監査警告が表示されます。

- 「フラグメント・コンテンツの構成」ダイアログで、属性の名前にアスタリスクが追加されず、この属性は必須として扱われません。

- 「タイプ」列に、フラグメントからのattribute-type要素の値が表示されます。これは、(Javaクラスとは異なり)属性タイプの説明として使用されます。

注意:
attribute-typeはフラグメントで必須要素ですが、その値を定義しなかった場合は、ドロップするフラグメントで未指定として表示されることがあります。この場合、ダイアログにデフォルト値として「文字列」が表示されます。

- 「値」列では、フラグメントの属性に渡す値を指定できます。値を入力するには、タイピングするか、省略記号(…)をクリックしてELビルダーを起動し、EL式を指定します。フラグメント内の特定の属性にdefault要素が存在する場合、このデフォルト値はその属性の「値」列で指定されています。デフォルト値はオーバーライドできます。

- フラグメント内にこの属性に対するdescription要素が存在する場合、異なる属性の行を切り替えると、ダイアログの下部に「属性の説明」フィールドが表示されます。description要素が定義されていない場合、「属性の説明」フィールドは空白になります。

- 「フラグメント・コンテンツの構成」ダイアログを使用して属性の追加、削除または並替えを行うことはできません。

12.3.1.6.2 フラグメントへの属性リストおよびメタデータの受渡し

フラグメント属性を定義する場合、MAFでは次の操作を実行できます。

- 動的属性の受渡し

- 各属性とメタデータとの関連付け(第12.3.1.6.2項「フラグメントへの属性リストおよびメタデータの受渡し」を参照)

- フラグメント定義内の属性に対するループ処理

- 属性内での動的属性のネスト

- あるフラグメントから埋込みフラグメントへの動的属性の受渡し

表12-4には、属性のリストを渡すことを可能にする、MAF AMX fragmentの直接および間接の子要素がリストされています。

表12-4 フラグメントの属性関連の子要素

子属性名

説明

attributeList

フラグメントに渡す属性リストを定義します。MAF AMX fragment要素またはattributeSet要素の直接の子にすることができます。

親要素には、子attributeList要素をいくつでも定義できます。

attributeList要素は、そのref属性を介して別のattributeListから参照できます。

異なるフラグメント間で属性リストを参照渡しできますが、この場合は、両方の属性リストに同じメタデータが含まれている必要があります。

attributeSet

MAF AMX attributeListの子として指定できます。

MAF AMX attributeListIteratorの繰り返し中に使用される属性のセットを定義します。配列内の1つのアイテムとして考えることができます。

親attributeList要素には、子attributeList要素をいくつでも定義できます。

attributeListIterator

MAF AMX attributeListを使用します。スタンプ設定に関してMAF AMXイテレータと同様の動作をしますが、属性の公開方法は異なり、そのname属性によってイテレータはattributeListに結合されます。

あるattributeListIteratorが別のattributeListIterator内でネストされている場合、nameは(attributeListIteratorにより現在処理中のattributeSetの子である) attributeListを指している必要があります。

繰り返しの間、定義された属性名がEL変数として公開されます。コール元から属性が提供されていない場合や、属性にデフォルト値がない場合は、値adf.mf.api.OptionalFragmentArgumentがEL変数として使用されます。この条件は、空のELキーワードを使用することによりテストできます(例: rendered="#{not (empty myAttribute)}")。

属性およびその値の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、属性リストをMAF AMXフラグメントに渡す基本的な方法を示しています。

<amx:fragment src="something.amxf">
<amx:attributeList name="attributeToPass" ref="nameOfAnOuterAttributeList" />
</amx:fragment>

次の例は、MAF AMXファイルで定義された子attributeListを持つfragment要素を示しています。

<amx:fragment src="summaryView.amxf">
<amx:attributeList name="attrs">
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.firstName}"/>
<amx:attribute name="displayType" value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.lastName}"/>
<amx:attribute name="displayType" value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.homePhone}"/>
<amx:attribute name="displayType" value="phone" />
</amx:attributeSet>
</amx:attributeList>
</amx:fragment>

次の例は、MAF AMXファイルのfragment要素内で定義されているネストされたattributeList要素を示しています。

<amx:fragment src="summaryView.amxf">
<amx:attributeList name="attrs">
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.firstName}"/>
<amx:attribute name="displayType" value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.lastName}"/>
<amx:attribute name="displayType" value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.homePhone}"/>
<amx:attribute name="displayType" value="phone" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attributeList name="subAttributes">
<amx:attributeSet>
<amx:attribute name="attribute"
value="#{bindings.spouseFirstName}"/>
<amx:attribute name="displayType"
value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute"
value="#{bindings.spouseLastName}"/>
<amx:attribute name="displayType"
value="string" />
</amx:attributeSet>
</amx:attributeList>
<amx:attribute name="label" value="Spouse"/>
</amx:attributeSet>
</amx:attributeList>
</amx:fragment>

次の例は、定義済の属性リスト・コンポーネントがフラグメント定義内でどのように使用されるかを示しています。amxf:attribute-listタグは、属性リストのメタデータを定義しています。このタグは、amxf:fragmentまたは別のamxf:attribute-listタグの子として宣言する必要があり、その有効な子タグはamxf:name、amxf:description、amxf:attribute-listおよびamxf:attributeです。子nameは必須であり、現在のXMLノード内で一意である必要があります。nameを同じレベルで宣言されているamxf:attributeと同一にすることもできますが、このようなネーミング慣例はお薦めしません。

<amx:fragmentDef
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment">
<attribute-list>
<name>attributes</name>
<attribute>
<attribute-name>attribute</attribute-name>
</attribute>
<attribute>
<attribute-name>displayType</attribute-name>
</attribute>
<attribute>
<attribute-name>label</attribute-name>
</attribute>
<attribute-list>
<name>subAttributes</name>
<attribute>
<attribute-name>attribute</attribute-name>
</attribute>
<attribute>
<attribute-name>displayType</attribute-name>
</attribute>
</attribute-list>
</attribute-list>
</fragment>
...
<amx:attributeListIterator name="attributes">
<amx:panelLabelAndMessage label="#{attribute.hints.label}"
id="plam1"
rendered="#{not (empty attribute)}">
<amx:outputText value="#{attribute.inputValue}" id="ot1"/>
</amx:panelLabelAndMessage>
<amx:outputText value="#{label}"
id="ot2"
rendered="#{not (empty label)}"/>
<amx:attributeListIterator name="subAttributes"
rendered="#{not (empty subAttributes)}">
<amx:panelLabelAndMessage label="#{attribute.hints.label}"
id="plam2"
rendered="#{not (empty attribute)}">
<amx:outputText value="#{attribute.inputValue}" id="ot3"/>
</amx:panelLabelAndMessage>
</amx:attributeListIterator>
</amx:attributeListIterator>
...
</amx:fragmentDef>

attribute-list、attribute-setおよびattributeの各タグは、fragmentノード内で次のものを定義するために使用できます。

- 使用できる属性リスト・コンポーネント

- フラグメントのコール元のページを検証するために必要な情報

12.3.2 MAF AMXページにUIコンポーネントを追加する方法

MAF AMXページの作成後は、ページへのMAF AMX UIコンポーネントの追加を開始できます。

「コンポーネント」ウィンドウを使用して、MAF AMXコンポーネントおよびMAF AMXデータ視覚化コンポーネントをページにドラッグ・アンド・ドロップできます。コンポーネントを追加すると、必要な宣言的ページ・コードが追加され、各コンポーネント属性に特定の値が設定されます。

「コンポーネント」ウィンドウには、MAF AMXコンポーネントがカテゴリ別に表示されます(図12-50を参照)。

- 一般コントロール

- テキストおよび選択

- データ・ビュー

- レイアウト。次のサブカテゴリがあります。

- 対話型コンテナおよびヘッダー

- セカンダリ・ウィンドウ

- コア構造

- 操作。次のサブカテゴリがあります。

- 動作

- リスナー

- バリデータおよびコンバータ

特定のコンポーネントの追加および使用については、第13.3項「UIコンポーネントの作成と使用方法」を参照してください。

また、「コンポーネント」ウィンドウには、MAF AMXデータ視覚化コンポーネントもカテゴリ別に表示されます(図12-50を参照)。

- 共通: 次のサブカテゴリがあります。

- チャート

- ゲージ

- マップ

- その他

- 共有子タグ

- その他のタイプ固有の子タグ: 次のサブカテゴリがあります。

- チャート

- ゲージ

- NBox

- テーマ・マップ

- 時系列

- サンバーストおよびツリーマップ

始める前に

MAFアプリケーションには、ビュー・コントローラ・プロジェクトが含まれている必要があり、このプロジェクトには、MAF AMXページまたはページの作成元のMAF AMXページのタスク・フローが含まれている場合と含まれていない場合があります。

第12.3.1.2項「MAF AMXページの作成」で説明したように、タスク・フロー・ダイアグラムで「表示」アイコンをダブルクリックするか、「新規ギャラリ」から「クライアント層」→「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」を選択することにより、「MAF AMXページの作成」ダイアログを起動できます。

UIコンポーネントをページに追加するには:

1. ソース・エディタでMAF AMXページを開きます(デフォルト)。

2. 図12-50に示すように、「コンポーネント」ウィンドウで、メニューを使用して「MAF AMX」を選択します。

ヒント:
「コンポーネント」ウィンドウが表示されていない場合は、JDeveloperのメイン・メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」はJDeveloperの右上部に表示されます。

図12-50 MAF AMXの「コンポーネント」ウィンドウ

3. 使用するコンポーネントを選択し、「ソース」エディタまたは「構造」ウィンドウにドラッグ・アンド・ドロップします。「プレビュー」ペインにコンポーネントをドロップすることはできません。

注意:
MAF AMXページを作成する際、UIコンポーネントは、「パネル・グループ・レイアウト」などのUIコンテナにのみドロップできます。

新たに追加されたコンポーネントを使用して、JDeveloperで「プレビュー」ペインのページが再描画されます。

あるいは、次のようにして、「構造」ウィンドウからUIコンポーネントおよびデータ視覚化コンポーネントを追加することもできます。

1. 「構造」ウィンドウで、別のコンポーネントを挿入するための開始ポイントとして使用する既存のコンポーネントを選択します。

2. 図12-51に示すように、選択したコンポーネントを右クリックして、「<コンポーネント>の前に挿入」、「<コンポーネント>の中に挿入」または「<コンポーネント>の後ろに挿入」のいずれかのオプションを選択します。

図12-51 「構造」ウィンドウからのコンポーネントの挿入

3. ポップアップ・メニューから、「MAF AMX」または「MAF AMXデータ視覚化」を選択します。

- 図12-52に示すように、「MAF AMX」を選択すると、「MAF AMXアイテムの挿入」ダイアログが開き、ページに追加するUIコンポーネントを選択できます。

図12-52 MAF AMXコンポーネントの挿入

- 図12-53に示すように、「MAF AMXデータ視覚化」を選択すると、「MAF AMXデータ視覚化アイテムの挿入」ダイアログが開き、ページに追加するデータ視覚化コンポーネントを選択できます。

図12-53 MAF AMXデータ視覚化コンポーネントの挿入

新たに追加されたコンポーネントを使用して、JDeveloperで「プレビュー」ペインのページが再描画されます。

12.3.2.1 「プレビュー」の使用方法

MAF AMXファイルを使用してユーザー・インタフェースを構築する際、JDeveloperの「プレビュー」では、iOSとAndroidの両方のプラットフォームに対してWYSIWYGサポートを提供します。図12-54に示すように、ビューを分割した状態で、MAF AMXコンポーネントをMAF AMXファイルに追加すると、コード・ビューはソース・エディタから、UIビューは「プレビュー」ペインから同時に確認できます。これにより、ソースを変更してすぐに、iOSとAndroidの両方のプラットフォームで、そのアプリケーションの変更されたルック・アンド・フィールを表示できます。

図12-54 デザイン・ビューとソース・ビューの分割

デザイン・ビューとソース・ビューを同時に確認できる以外に、複数のデザイン・ビューを同時に開いて使用し、それぞれを異なるプラットフォームおよび画面サイズに設定できます。様々なデバイスのデザイン・ビューの組合せを開くことで、様々なプラットフォームおよびフォーム・ファクタに対し、同時に、異なる向きでアプリケーションを開発できます。図12-55は、上段がiPhone、下段が75%のスケーリングのiPadの分割画面を示しています。「プレビュー」ペインは、JDeveloperのデフォルトの分割機能を使用して分割できます。

図12-55 複数のデザイン・ビュー

注意:
無効なMAF AMXファイルであっても、MAF AMXページはレンダリングされます。エラーはコンポーネントのエラー・アイコンで示されます。マウスをエラー・アイコンの上に移動すると、エラーの詳細を表示できます。

12.3.2.2 UIコンポーネントの構成

UIコンポーネントをページにドロップした後、「プロパティ」ウィンドウ(デフォルトではJDeveloperの右下部に表示)を使用して、各コンポーネントの属性値を設定できます。

ヒント:
「プロパティ」ウィンドウが表示されていない場合は、JDeveloperのメイン・メニューから「ウィンドウ」→「プロパティ」を選択します。

図12-56に、出力テキスト・コンポーネントの属性が表示された「プロパティ」ウィンドウを示します。

図12-56 「プロパティ」ウィンドウ

コンポーネント属性の設定手順:

1. 属性を設定するコンポーネントを選択します。「構造」ウィンドウでコンポーネントを選択するか、「ソース」エディタで直接そのタグを選択することができます。

2. 「プロパティ」ウィンドウで、設定する属性が含まれているセクションを開きます。

ヒント:
一部の属性は、複数のセクションに表示されます。あるセクションで値を入力または変更すると、他のセクションでもその値が変更されます。「プロパティ」ウィンドウの最上部の検索フィールドに属性名を入力して、属性を検索できます。

3. 「プロパティ」ウィンドウで、フィールドに値を直接入力するか、フィールドにリストがある場合はそのリストを使用して、値を選択します。フィールドの右にあるリストを使用して、値の設定に使用できるツールを含むポップアップを起動することもできます。これらのツールは、特定のプロパティ・エディタ(「編集」を選択して開く)または値のEL式の作成に使用できる式ビルダー(「式ビルダー」または該当する場合は「メソッド式ビルダー」を選択して開く)です。式ビルダーの使用の詳細は、第14.3.2項「EL式の作成方法」を参照してください。

「プロパティ」ウィンドウを使用して属性値を設定または変更すると、入力された値に合致するように、属性のページ・ソースがJDeveloperで自動的に変更されます。

ヒント:
「ソース」エディタでページを直接編集することで、いつでも属性値を変更できます。「ソース」エディタにページを表示するには、ページの下部の「ソース」タブをクリックします。

12.3.2.3 要素識別子とその監査に関する必知事項

「コンポーネント」ウィンドウからコンポーネントをドロップするか、データ・コントロールをドラッグ・アンド・ドロップすることにより要素を追加すると、MAFによって一意の要素識別子(id)が生成され、自動的にMAF AMXページに挿入されます。これは、MAF AMXページ内で、同じページ内の類似したコンポーネントでもそれぞれを識別する有効な識別子となります。

MAFには、次のことを行う識別子監査ユーティリティが用意されています。

- MAF AMXページにおける識別子の存在と一意性を確認する。

- 識別子が存在しない場合、または一意でない場合は、要素の必須id属性ごとにエラーを報告する。

- 自動修正により、識別子の問題が報告されると、要素の一意のidが生成される。

図12-57および図12-58に、ソース・エディタと「構造」ペインの識別子エラー・レポートをそれぞれ示します。

図12-57 「ソース」エディタの要素識別子監査

図12-58 「構造」ペインの要素識別子監査

idに加え、監査ユーティリティでは「ポップアップ表示動作」操作のpopupIdおよびalignId属性をチェックします(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

図12-59および図12-60に、ソース・エディタの「ポップアップ表示動作」の「ポップアップID」属性と「位置合せID」属性のエラー・レポートをそれぞれ示します。

図12-59 「ソース」エディタのポップアップID属性監査

図12-60 「ソース」エディタの位置合せID属性監査

詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のJavaプロジェクトの監査とモニタリングに関する項を参照してください。

12.3.3 MAF AMXページへのデータ・コントロールの追加方法

MAF AMXページの作成後は、ページへのデータ・コントロールの追加を開始できます。

データ・コントロール要素を「データ・コントロール」ウィンドウからドラッグして「構造」ウィンドウまたはソース・エディタのいずれかにドロップすることで、MAF AMXビューでデータバインドされたUIコンポーネントを作成できます。「データ・コントロール」ウィンドウからこれらのいずれかの場所にアイテムをドラッグすると、ドロップしたアイテムに対して使用できるデフォルトのUIコンポーネントのポップアップ・メニューが表示されます。目的のUIコンポーネントを選択すると、そのコンポーネントがMAF AMXページに挿入されます。また、関連ページ定義ファイルにバインディング情報が作成されます。そのようなファイルが存在しない場合は、JDeveloperによって作成されます。MAFには、新しいデータ・コントロールの場所を知らせる、データ・コントロールのドロップ用のビジュアル・インジケータが用意されています。

注意:
データ・コントロールは、基礎となるXMLスキーマで許可された場所にのみドロップできます。

方法によっては、様々なタイプのデータ・コントロールをMAF AMXページの「構造」ウィンドウに挿入できます。

コレクションの属性をドロップすることにより、様々な入力および出力コンポーネントを作成できます。ページにデータ・コントロール操作をドロップすることにより、ボタンおよびリンク・コンポーネントも作成できます。

これらの各操作に対し、MAF AMXボタンにそれぞれのアクション・リスナーが追加されます。

データ・コントロールの属性および操作は、次の1つ以上のMAF AMX UIコンポーネントとしてドロップできます(第13.3項「UIコンポーネントの作成と使用方法」を参照)。

- ボタン

- リンク

- 入力日

- ラベル付入力日

- 入力テキスト

- ラベル付入力テキスト

- 出力テキスト

- ラベル付出力テキスト

- イテレータ

- リスト・アイテム

- リスト・ビュー

- ブール・チェックボックスの選択

- ブール・スイッチの選択

- ボタンを1つ選択

- 選択肢を1つ選択

- ラジオ・ボタンを1つ選択

- チェックボックスを複数選択

- 選択肢を複数選択

- 日時の変換

- 数値の変換

- フォーム

- 読取り専用フォーム

- パラメータ・フォーム

次の日付および数値タイプがサポートされています。

- java.util.Date

- java.sql.Timestamp

- java.sql.Date

- java.sql.Time

- java.lang.Number

- java.lang.Integer

- java.lang.Long

- java.lang.Float

- java.lang.Double

JDeveloperでの「データ・コントロール」ウィンドウの使用方法の詳細は、第14.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。

12.3.3.1 属性のドラッグ・アンド・ドロップ

MAF AMXページにすでにパネル・フォーム・レイアウト・コンポーネントが含まれているか、すべてのフィールドを追加する必要がない場合は、データ・コントロールから個別の属性をドロップできます。属性タイプに応じて、次のように異なるデータ・バインディング・メニュー・オプションが提供されます。

12.3.3.1.1 日付

このカテゴリは、MAF入力日およびラベル付MAF入力日のコントロールを作成するためのオプションを提供します。図12-61に、属性を「データ・コントロール」ウィンドウからMAF AMXページのソース・エディタまたは「構造」ウィンドウにドラッグすると表示される日付コントロールを追加するためのポップアップ・メニューを示します。

図12-61 日付コントロールのポップアップ・メニュー

12.3.3.1.2 単一選択

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAFボタンを1つ選択

- MAF選択肢を1つ選択

- MAFラジオ・ボタンを1つ選択

- MAFブール・チェックボックスの選択

- MAFブール・スイッチの選択

図12-62に、属性を「データ・コントロール」ウィンドウからMAF AMXページのソース・エディタまたは「構造」ウィンドウにドラッグすると表示される選択コントロールを追加するためのポップアップ・メニューを示します。

図12-62 選択コントロールのポップアップ・メニュー

既存のMAF AMXページを使用している場合、「MAFボタンを1つ選択」オプションまたは「MAF選択肢を1つ選択」オプションを選択すると、適切な「リスト・バインディングの編集」ダイアログが表示されます(図12-63を参照)。まったく新しいMAF AMXページにコントロールをドロップした場合には、かわりに「アクション・バインディングの編集」ダイアログが開かれます。「OK」をクリックすると、「リスト・バインディングの編集」が開かれます。

注意:
単一選択またはブール選択のコンポーネントとして任意のデータ・コントロール属性をドロップするたびに、それぞれ「リスト・バインディングの編集」または「Booleanバインディングの編集」が表示されます。

図12-63 ボタンを1つ選択コントロールおよび選択肢を1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFラジオ・ボタンを1つ選択」オプションを選択すると、図12-64に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図12-64 ラジオ・ボタンを1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFブール・チェックボックスの選択」オプションまたは「MAFブール・スイッチの選択」オプションを選択すると、図12-65に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図12-65 ブール・チェック・ボックスおよびスイッチの選択コントロールの「リスト・バインディングの編集」ダイアログ

12.3.3.1.3 テキスト

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

図12-66に、属性を「データ・コントロール」ウィンドウからMAF AMXページのソース・エディタまたは「構造」ウィンドウにドラッグすると表示されるテキスト・コントロールを追加するためのポップアップ・メニューを示します。

図12-66 テキスト・コントロールのポップアップ・メニュー

12.3.3.2 操作のドラッグ・アンド・ドロップ

属性に加え、操作とカスタム・メソッドもドラッグ・アンド・ドロップできます。操作やメソッドのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

12.3.3.2.1 操作

これはデータ・コントロール操作のカテゴリです。次のオプションがあります(図12-67を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図12-67 操作のポップアップ・メニュー

注意:
操作またはメソッドを、リスト・ビュー・コントロールの子としてドロップすると、ポップアップ・メニューは表示されず、リスト・アイテムが自動的に作成されます。これは、リスト・ビュー・コントロールの直接の子としてドロップできる有効なコントロールが他にないためです。生成されるリスト・アイテムに対して、JDeveloperにより次のようなバインディングが作成されます。

<amx:listItem actionListener="#{bindings.getLocation.execute}"/>

12.3.3.2.2 メソッド

これはカスタム・メソッドのカテゴリです。次のオプションがあります(図12-68を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図12-68 メソッドのポップアップ・メニュー

「MAFパラメータ・フォーム」オプションでは、フォームに挿入するメソッドまたは操作の引数に加え、各引数に対してそれぞれのコントロールも選択できます(図12-69を参照)。

図12-69 「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:inputText id="it1"
value="#{bindings.empId.inputValue}"
label="#{bindings.empId.hints.label}" />
</amx:panelFormLayout>
<amx:commandButton id="cb1"
actionListener="#{bindings.ExecuteWithParams1.execute}"
text="ExecuteWithParams1"
disabled="#{!bindings.ExecuteWithParams1.enabled}"/>

生成されるバインディングの詳細は、第12.3.3.4項「生成されるバインディングに関する必知事項」を参照してください。

MAFパラメータ・フォームでサポートされるコントロールのタイプは次のとおりです。

- MAF入力日

- ラベル付MAF入力日

- MAF入力テキスト

- ラベル付MAF入力テキスト

- ラベル付MAF出力テキスト

12.3.3.3 コレクションのドラッグ・アンド・ドロップ

MAF AMXページにコレクションをドラッグ・アンド・ドロップできます。コレクションのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

- 複数選択

- フォーム

- イテレータ

- リスト・ビュー

12.3.3.3.1 複数選択

このカテゴリは、複数選択コントロールを作成するためのオプションを提供します。このカテゴリでは次のコントロールが作成されます(図12-70を参照)。

- MAFチェックボックスを複数選択

- MAF選択肢を複数選択

図12-70 複数選択コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAF選択肢を複数選択」または「MAFチェックボックスを複数選択」を選択すると、「リスト・バインディングの編集」ダイアログが表示されます(図12-71を参照)。

図12-71 複数選択コントロールの「リスト・バインディングの編集」ダイアログ

12.3.3.3.2 フォーム

このカテゴリは、MAF AMXパネル・フォームのコントロールを作成する場合に使用します。このカテゴリでは次のコントロールが作成されます(図12-72を参照)。

- MAFフォーム

- MAF読取り専用フォーム

図12-72 フォーム・コントロールのポップアップ・メニュー

作成するフォームのタイプとして「MAFフォーム」を選択すると、JDeveloperウィザードが起動され、ここで、フォームに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(図12-73を参照)。

図12-73 MAFフォームの「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:panelLabelAndMessage id="plam1" label="#{bindings.jobId.hints.label}">
<amx:outputText id="ot1" value="#{bindings.jobId.inputValue}" />
</amx:panelLabelAndMessage>
<amx:inputText id="it4"
value="#{bindings.title.inputValue}"
label="#{bindings.title.hints.label}" />
<amx:inputText id="it5"
value="#{bindings.minSalary.inputValue}"
simple="true" />
<amx:inputText id="it3"
value="#{bindings.maxSalary.inputValue}"
simple="true" />
</amx:panelFormLayout>

生成されるバインディングの詳細は、第12.3.3.4項「生成されるバインディングに関する必知事項」を参照してください。

MAFフォームでサポートされるコントロールのタイプは次のとおりです。

- MAF入力日

- ラベル付MAF入力日

- MAF入力テキスト

- ラベル付MAF入力テキスト

- ラベル付MAF出力テキスト

注意:
MAF出力テキストは、MAFスキーマで定義される有効なパネル・フォーム・レイアウトの子要素ではないため、サポートされていません。

作成するフォームのタイプとして「MAF読取り専用フォーム」を選択すると、JDeveloperウィザードが起動され、ここで、フォームに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(図12-74を参照)。

図12-74 MAF読取り専用フォームの「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:panelLabelAndMessage id="plam4"
label="#{bindings.jobId.hints.label}">
<amx:outputText id="ot4" value="#{bindings.jobId.inputValue}" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plam1"
label="#{bindings.title.hints.label}">
<amx:outputText id="ot1" value="#{bindings.title.inputValue}" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plam3"
label="#{bindings.minSalary.hints.label}">
<amx:outputText id="ot3" value="#{bindings.minSalary.inputValue}" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage  id="plam2"                               label="#{bindings.maxSalary.hints.label}">
<amx:outputText id="ot2" value="#{bindings.maxSalary.inputValue}" />
</amx:panelLabelAndMessage>
</amx:panelFormLayout>

生成されるバインディングの詳細は、第12.3.3.4項「生成されるバインディングに関する必知事項」を参照してください。

MAF読取り専用フォームでは、ラベル付MAF出力テキストのみがサポートされています。

12.3.3.3.3 イテレータ

これは、子コンポーネントのあるMAF AMXイテレータを作成するためのオプションを提供します(図12-75を参照)。

図12-75 イテレータ・コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAFイテレータ」を選択すると、JDeveloperウィザードが起動され、ここで、イテレータに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(デフォルトの選択は「ラベル付MAF出力テキスト」です。図12-76を参照してください)。

図12-76 MAFイテレータの編集ダイアログ

「イテレータの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:iterator id="i1"
var="row"
value="#{bindings.jobs.collectionModel}">
<amx:panelLabelAndMessage id="plam6"
label="#{bindings.jobs.hints.jobId.label}">
<amx:outputText id="ot6" value="#{row.jobId}" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plam5"
label="#{bindings.jobs.hints.title.label}">
<amx:outputText id="ot5" value="#{row.title}" />
</amx:panelLabelAndMessage>
<amx:inputText id="it1"
value="#{row.bindings.minSalary.inputValue}"
label="#{bindings.jobs.hints.minSalary.label}" />
<amx:inputText id="it2"
value="#{row.bindings.maxSalary.inputValue}"
label="#{bindings.jobs.hints.maxSalary.label}" />
</amx:iterator>

生成されるバインディングの詳細は、第12.3.3.4項「生成されるバインディングに関する必知事項」を参照してください。

MAFイテレータでサポートされるコントロールのタイプは次のとおりです。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

12.3.3.3.4 リスト・ビュー

これは、子コンポーネントのあるMAF AMXリスト・ビューを作成するためのオプションを提供します(図12-77を参照)。

図12-77 リスト・ビュー・コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAFリスト・ビュー」を選択すると、図12-78に示すような「ListViewギャラリ」が開かれ、リスト・ビューに特定のレイアウトを選択できます。

図12-78 ListViewギャラリ

表12-5は、「ListViewギャラリ」に表示される、サポートされるリスト・フォーマットを示しています。

表12-5 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」(図12-78を参照)は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表(図12-79を参照)に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルトの「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプション(図12-78を参照)では、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログ(図12-79を参照)の状態は変更されません。影響するのは、生成されるMAF AMXマークアップのみです。

- 凹枠リストのあるスタイルを選択すると、生成されたMAF AMXマークアップのlistView要素にadfmf-listView-insetListスタイル・クラスが設定されます。

次に、凹枠リストのあるシンプル・フォーマットの例を示します。

<amx:listView var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
styleClass="adfmf-listView-insetList"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
id="listView2">
<amx:listItem id="li2">
<amx:outputText value="#{row.employeename}" id="ot3"/>
</amx:listItem>
</amx:listView>

「ListViewギャラリ」の「説明」ペインは、現在選択されているバリエーションに基づいて更新されます。フォーマットには、メイン・スタイルの簡単な説明が示され、その後に選択したバリエーションの詳細が続きます。4つのリスト・フォーマットに、それぞれ4つのバリエーションがあり、表12-6に示す16の固有の説明が提供されています。

表12-6 リスト・ビューのフォーマットとバリエーション

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドは、リスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドは、リスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「ListViewギャラリ」で選択し、「OK」をクリックすると、「リスト・ビューの編集」ウィザードが起動され、ここで図12-79に示すように、バインディング属性を選択したリスト・ビュー・フォーマットの要素にマップすることにより、リスト・アイテムのコンテンツを作成できます。

図12-79 MAF AMXリスト・ビューの編集ダイアログ

図12-79に示すダイアログに入力する際は、次の点を考慮してください。

- 最初のイメージは、選択したリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映し、略図から基礎となる表の名前付き要素へのマッピングを提供します。

- 「要素」列の読取り専用セルは、選択したリスト・ビュー・フォーマットから導出されます。

- 「値バインディング」列の編集可能セルは、ドロップされたデータ・コントロール・ノードに基づいています。

- リスト・アイテムは、その特定要素に対してどちらが適切であるかによって、出力テキストまたはイメージ・コンポーネントのいずれかとして生成されます。

- 要素(行)数は選択したリスト・ビュー・フォーマットであらかじめ決まっているため、行を追加または削除することはできません。

- 要素の順序は変更できません。

- 「リスト・アイテム選択」は選択モードを示し、単一のアイテム選択(デフォルト)または選択なしのいずれかにできます。リスト・ビューのshowLinkIcon属性は、選択モードに基づいて更新されます。選択モードが「なし」に設定されると、showLinkIcon属性はfalseに設定されます。それ以外の場合、showLinkIcon属性は変更されません(たとえば、デフォルトのtrueにデフォルト設定されます)。
listViewの次の属性を使用すると、選択モードの機能を有効にできます。

- selectionListener: 選択リスナーへのメソッド参照を定義します。

- selectedRowKeys: このコンポーネントの選択状態を示します。

「単一アイテム」オプションを選択した場合、「リスト・ビューの編集」ダイアログでは自動的にこれらの属性が次のように設定されます。

- selectionListenerは"bindings.treebinding.collectionModel.makeCurrent"に設定されます。

- selectedRowKeysは"bindings.treebinding.collectionModel.selectedRow"に設定されます。

selectionListener属性には「編集」オプションがあり、これを「プロパティ」ウィンドウから使用して、マネージドBeanクラスおよび適切なマネージドBeanメソッドを他のリスナー属性と同様の方法で作成できます(図12-80および図12-81を参照)。

図12-80 選択リスナー属性の編集

図12-81 選択リスナーの編集ダイアログ

次の例は、MAF AMXファイルでのlistView要素の選択関連属性を示しています。「リスト・ビューの編集」ダイアログで「単一アイテム」を選択すると、この宣言が生成されます(図12-79を参照)。

<amx:listView id="listView1"
var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
selectionListener=
"#{bindings.employees.collectionModel.makeCurrent}"
selectedRowKeys=
"#{bindings.employees.collectionModel.selectedRow}">
<amx:listItem id="listItem1">
...
</amx:listItem>
</amx:listView>

「リスト・ビューの編集」ダイアログで「リスト・アイテム選択」オプションとして「なし」を選択した場合、selectionListener属性とselectedRowKeys属性は、デフォルト値がなく、MAF AMXファイル内に出現しないため、設定されません。同時に、リスト・アイテムのshowLinkIcon属性はfalseに設定されます。次の例は、リスト・ビューの選択属性の省略を示しています。

<amx:listView id="listView1"
var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="listItem1" showLinkIcon="false">
...
</amx:listItem>
</amx:listView>

MAF AMXページとの間でナビゲーションが発生すると、リスト・ビューの選択状態が保持されます。

注意:
MAF AMXページ間で同じイテレータIDがある場合、選択されている行が考慮されます。たとえば、あるページに、イテレータがemployeesIteratorであるリスト・ビューとしてEmployeesコレクションをドラッグした後、「詳細」ページを追加し、その「詳細」ページの従業員イテレータのIDがemployeesIteratorに設定されている場合は、選択されている行のみが考慮されます。

- 「区切り属性」フィールドのデフォルト値は「区切りなし」であり、この場合、「区切りモード」フィールドは無効です。デフォルト以外の値を選択する場合は、図12-82および図12-83に示すように、「区切りモード」パラメータを指定する必要があります。

図12-82 区切り属性の指定

図12-83 区切りモードの指定

リスト・ビューの区切りの詳細は、第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

「リスト・ビューの編集」ダイアログで適切なオプションを選択すると、次のMAF AMXマークアップおよびデータ・バインディングが生成されます。

<amx:listView id="listView1"
var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
dividerAttribute="key"
dividerMode="firstLetter"
selectionListener=
"#{bindings.employees.collectionModel.makeCurrent}"
selectedRowKeys=
"#{bindings.employees.collectionModel.selectedRow}">
<amx:listItem id="listItem1" >
<amx:outputText value="#{row.key}"
styleClass="adfmf-listItem-subtext"
id="outputText1"/>
</amx:listItem>
</amx:listView>

生成されるバインディングの詳細は、第12.3.3.4項「生成されるバインディングに関する必知事項」を参照してください。

MAFリスト・ビューでサポートされるコントロールは次のとおりです。

- MAF出力テキスト

- MAFイメージ

12.3.3.4 生成されるバインディングに関する必知事項

表12-7に、コンポーネントがドロップされたときにMAF AMXページに追加されるサンプル・バインディングを示します。

表12-7 サンプル・データ・バインディング

コンポーネント

データ・バインディング

ボタン

<amx:commandButton id="commandButton1"
actionListener="#{bindings.FindContacts.execute}"
text="FindContacts"
disabled="#{!bindings.FindContacts.enabled}">
</amx:commandButton>

リンク

<amx:commandLink id="commandLink1"
actionListener="#{bindings.FindContacts.execute}"
text="FindContacts"
disabled="#{!bindings.FindContacts.enabled}">
</amx:commandLink>

ラベル付入力日

<amx:inputDate id="inputDate1"
value="#{bindings.timeStamp.inputValue}"
label="#{bindings.timeStamp.hints.label}">
</amx:inputDate>

入力日

<amx:inputDate id="inputDate1"
value="#{bindings.timeStamp.inputValue}">
</amx:inputDate>

ラベル付入力テキスト

<amx:inputText id="inputText1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.hints.label}">
</amx:inputText>

入力テキスト

<amx:inputText id="inputText1"
value="#{bindings.contactData.inputValue}"
simple="true">
</amx:inputText>

出力テキスト

<amx:outputText id="outputText1"
value="#{bindings.contactData.inputValue}">
</amx:outputText>

ラベル付出力テキスト

<amx:panelLabelAndMessage id="panelLabelAndMessage1"
label="#{bindings.contactData.hints.label}">
<amx:outputText id="outputText1"
value="#{bindings.contactData.inputValue}"/>
</amx:panelLabelAndMessage>

ブール・チェックボックスの選択

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}">
</amx:selectBooleanCheckbox>

ブール・スイッチの選択

<amx:selectBooleanSwitch id="selectBooleanSwitch"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}">
</amx:selectBooleanSwitch>

ボタンを1つ選択

<amx:selectOneButton id="selectOneButton1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"
required="#{bindings.contactData.hints.mandatory}">
<amx:selectItems value="#{bindings.contactData.items}"/>
</amx:selectOneButton>

選択肢を1つ選択

<amx:selectOneChoice id="selectOneChoice1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}">
<amx:selectItems id="selectItems1"
value="#{bindings.contactData.items}"/>
</amx:selectOneChoice>

チェックボックスを複数選択

<amx:selectManyCheckbox id="selectManyCheckbox1"
value="#{bindings.AssetView.inputValue}"
label="#{bindings.AssetView.label}">
<amx:selectItems id="selectItems1"
value="#{bindings.AssetView.items}"/>
</amx:selectManyCheckbox>

ラジオ・ボタンを1つ選択

<amx:selectOneRadio id="selectOneRadio1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"
<amx:selectItems id="selectItems1"
value="#{bindings.contactData.items}"/>
</amx:selectOneRadio>

選択肢を複数選択

<amx:selectManyChoice id="selectManyChoice1"
value="#{bindings.AssetView.inputValue}"
label="#{bindings.AssetView.label}">
<amx:selectItems id="selectItems1"
value="#{bindings.AssetView.items}"/>
</amx:selectManyChoice>

12.3.3.5 生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項

最初のドラッグ・アンド・ドロップ・イベントにより、次のディレクトリとファイルが生成されます。

図12-84に、ドラッグ・アンド・ドロップ時に生成されるDataBindings.cpxファイル例を示します。

図12-84 ソース・ビューでのDataBindings.cpxファイル

DataBindings.cpxファイルでは、MAF AMXアプリケーション機能全体のバインディング・コンテキストが定義され、実行時にはこのメタデータからバインディング・オブジェクトが作成されます。コンポーネントがプロジェクトの外部で作成された後にインポートされた場合は、MAF AMXアプリケーション機能に2つ以上のDataBindings.cpxファイルが存在する可能性があります。これらのファイルは個々のMAF AMXページをページ定義ファイルにマップし、どのデータ・コントロールをMAF AMXアプリケーション機能で使用するかを宣言します。実行時には、DataBindings.cpxファイルにリストされたデータ・コントロールのみが、現在のMAF AMXアプリケーション機能で使用可能になります。

初めて「データ・コントロール」ウィンドウを使用してコンポーネントをページに追加した場合、または操作をアクティビティに追加した場合、JDeveloperによって自動的に、ViewControllerプロジェクトのデフォルト・パッケージ内にDataBindings.cpxファイルが作成されます。DataBindings.cpxファイルが作成されると、最初のページまたはタスク・フロー・アクティビティ用のエントリが自動的に追加されます。その後、「データ・コントロール」ウィンドウを使用するたびに、そのページまたはアクティビティ用のエントリがまだない場合は、エントリがDataBindings.cpxに追加されます。

JDeveloperによりDataBindings.cpxファイルが作成されると、そのファイルを「ソース」ビュー(図12-84を参照)または概要エディタで開くことができます。

ファイルの「ページ・マッピング」(pageMap)セクションにより、IDを使用して各MAF AMXページまたはタスク・フロー・アクティビティが対応するページ定義ファイルにマップされます。「ページ定義の使用方法」(pageDefinitionUsages)セクションにより、ページ定義IDはMAF AMXアプリケーション機能内のページ定義ファイルの絶対パスにマップされます。「データ・コントロールの使用方法」(dataControlUsages)セクションは、ページ定義ファイル内で定義されているバインディング・オブジェクトによって使用されるデータ・コントロールを識別します。これらのマッピングにより、ページの起動時にバインディング・コンテナを初期化できます。

概要エディタを使用して、現在のID名をダブルクリックし、インラインで編集することで、ページ定義ファイルまたはデータ・コントロールのID名を変更できます。これを行うと、MAF AMXアプリケーション機能内のすべての参照が更新されます。ただし、JDeveloperで更新されるのはID名のみであり、ファイル名は更新されません。データ・コントロール名を予約語に変更しないようにしてください。

また、「構造」ウィンドウでDataBindings.cpxファイルの要素をクリックし、「プロパティ」ウィンドウを使用してプロパティ値を変更することもできます。

図12-85に、ドラッグ・アンド・ドロップ時に生成されるPageDefファイル例を示します。

図12-85 PageDefファイル

ページ定義ファイルでは、実行時にMAF AMX UIコンポーネントにデータを移入するバインディング・オブジェクトを定義します。バインディングを使用するMAF AMXページにはそれぞれ、そのページで使用されるバインディング・オブジェクトを定義する、対応するページ定義ファイルが存在する必要があります。ページ定義ファイルによって、すべてのバインディングへのデザインタイム・アクセスが提供されます。実行時には、ページ定義ファイルによって定義されたバインディング・オブジェクトが、ページ定義ファイルの実行時インスタンスであるバインディング・コンテナ内でインスタンス化されます。

初めて「データ・コントロール」ウィンドウを使用してページにコンポーネントを追加すると、JDeveloperによって自動的に、そのページのページ定義ファイルが作成され、コンポーネントにより参照される各バインディング・オブジェクトの定義が追加されます。それ以降、ページにデータバインド・コンポーネントを追加するたびに、JDeveloperによって、必要なバインディング・オブジェクト定義がページ定義ファイルに自動的に追加されます。

デフォルトでは、ページ定義ファイルは、ViewControllerプロジェクトのApplication Sourcesノードにあるmobile.PageDefsパッケージに含まれています。対応するMAF AMXページがデフォルト以外のディレクトリ、またはデフォルトのサブディレクトリに保存されると、ページ定義も同じ名前のパッケージに保存されます。

ページ定義ファイルを開く方法の詳細は、第12.3.1.5項「ページ定義ファイルへのアクセス」を参照してください。概要エディタでページ定義ファイルを開いた場合、次のタブを使用して、MAF AMXページのバインディング、コンテキスト・イベントおよびパラメータを表示および構成できます。

- バインディングと実行可能ファイル: このタブには、3種類のオブジェクト(バインディング、実行可能ファイル、および関連付けられたデータ・コントロール)が表示されます。

注意:
BindingsとExecutablesは、選択しないかぎりデータ・コントロールには表示されません。

デフォルトでは、モデル・バインディング・オブジェクトは、そのオブジェクトを作成するために使用されたデータ・コントロール・オブジェクトの名前が付けられます。データ・コントロール・オブジェクトが1ページ内で何度も使用される場合、JDeveloperではデフォルトのバインディング・オブジェクト名に数字を追加して、それぞれが一意になるようにします。

- コンテキスト・イベント: MAF AMXアプリケーション機能内のアーティファクトが登録可能なコンテキスト・イベントを作成できます。

- パラメータ: パラメータ・バインディング・オブジェクトは、リクエストの開始時にページが評価するパラメータを宣言します。静的値または静的値を割り当てるEL式を使用して、ページ定義ファイルのパラメータ値を定義できます。

概要エディタのアイテム(または「構造」ウィンドウの関連付けられたノード)をクリックすると、「プロパティ」ウィンドウを使用してそのアイテムの属性値を表示および編集したり、「ソース」タブをクリックしてXMLソースを直接編集することができます。

12.3.3.6 MAF AMXエディタの「バインディング」タブの使用方法

JDeveloperの「バインディング」タブ(図12-86を参照)は、MAF AMXエディタで使用可能です。ここには、特定のMAF AMXページに対して定義されたデータ・バインディングが表示されます。バインディングを選択すると、基盤となるデータ・コントロールへのリレーションシップが示され、PageDefファイルへのリンクが提供されます。

図12-86 「バインディング」タブ

12.3.3.7 使用されないバインディングの削除に関する必知事項

「構造」ウィンドウからMAF AMXコンポーネントを削除または切り取ると、使用されないバインディングは自動的にページから削除されます。

注意:
「ソース」エディタからコンポーネントを削除した場合には、バインディングは削除されません。

図12-87は、バインディングを参照するリスト・ビュー・コンポーネントの削除を示しています。削除すると、関連するバインディング・エントリが、対応するPageDef.xmlファイルから自動的に削除されます。

図12-87 バインドされたコンポーネントのページからの削除

図12-88では、ページからリスト・ビュー・コンポーネントを切り取ることにより、これを削除しています。

図12-88 バインドされたコンポーネントのページからの切取り

「切取り」をクリックすると、図12-89に示すような「ADFバインディングの削除の確認」ダイアログが表示され、該当するバインディングを削除するかどうかを選択するよう求められます。

図12-89 「ADFバインディングの削除の確認」ダイアログ

12.3.4 サーバー通信に関する必知事項

MAFで使用されるセキュリティ・アーキテクチャでは、MAF AMXページをホストするブラウザに、セキュア・サーバーに接続してそのリソースを取得するために必要なセキュリティ情報へのアクセス権がないことを保証しています。これは、MAF AMXページから行うAJAXコールに直接的な影響があります。これらのコールはサポートされていないため、MAF AMX UIコンポーネント内からのJavaScriptの使用には制約があります。サーバーとの通信は、埋込みのJavaコード・レイヤーから行う必要があります。

13 MAF AMXユーザー・インタフェースの作成

この章では、MAF AMXページのユーザー・インタフェースを作成する方法について説明します。

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

- 第13.1項「MAF AMXページのユーザー・インタフェースの作成の概要」

- 第13.2項「ページ・レイアウトの設計」

- 第13.3項「UIコンポーネントの作成と使用方法」

- 第13.4項「ジェスチャーの有効化」

- 第13.5項「データ視覚化の指定」

- 第13.6項「UIコンポーネントのスタイル設定」

- 第13.7項「UIコンポーネントのローカライズ」

- 第13.8項「MAFのアクセシビリティのサポートの理解」

- 第13.9項「入力の検証」

- 第13.10項「イベント・リスナーの使用方法」

13.1 MAF AMXページのユーザー・インタフェースの作成の概要

MAFは、iOSとAndroidのどちらのユーザー操作性に対しても適切に動作するMAF AMXページの作成を可能にする一連のUIコンポーネントおよび操作を提供します。

MAF AMXは、標準的なJDeveloper開発エクスペリエンスに準拠して、「コンポーネント」ウィンドウまたは「データ・コントロール」ウィンドウのいずれからもソース・エディタや「構造」ウィンドウにUIコンポーネントおよび操作をドラッグできるようになっています。実質的には、iOSおよびAndroidのプラットフォーム上のネイティブ・コンポーネントのHTML相当物がMAF AMX UIコンポーネントによってレンダリングされ、JDeveloperでのそれらのデザインタイムの動作は、その他のテクノロジで使用されるコンポーネントに似たものとなります。さらに、これらのUIコンポーネントは、宣言ナビゲーションおよびデータ・バインディングのためにMAFのコントローラおよびモデルと統合されます。

注意:
モバイル・デバイス用のインタフェースを開発する場合は、画面領域が非常に限られていることに常に注意してください。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

詳細は、次を参照してください。

- 第12章「MAF AMXページの作成」

- 第14章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」

- 第19章「カスタムMAF AMX UIコンポーネントの作成」

13.2 ページ・レイアウトの設計

MAF AMXは、ページ内へのUIコンポーネントの配置を可能にするレイアウト・コンポーネント(表13-1にリスト)を提供します。通常、これらのコンポーネントを使用してページの構築を開始し、次にこれらのコンテナ内で、または子コンポーネントとして、他の機能を提供する他のコンポーネントを、レイアウト・コンポーネントに追加します。これらのコンポーネントのいくつかは、拡大するコンポーネント内に配置されたときに拡大する機能などの形状管理機能を提供します。

表13-1 MAF AMXのページ管理、レイアウトおよび間隔調整コンポーネント

コンポーネント

タイプ

説明

表示

コア・ページ構造コンポーネント

MAF AMXファイル内にview要素を作成します。ファイルが作成されるときにファイルに自動的に挿入されます。詳細は、第13.2.1項「表示コンポーネントの使用方法」を参照してください。

パネル・ページ

コア・ページ構造コンポーネント

MAF AMXファイル内にpanelPage要素を作成します。ページ内の中央領域(ヘッダー領域とフッター領域の間を垂直方向にスクロールする)を定義します。詳細は、第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

MAF AMXファイルの詳細は、第12.3.1.2項「MAF AMXページの作成」を参照してください。

ファセット

コア・ページ構造コンポーネント

MAF AMXファイル内にfacet要素を作成します。任意の名前のファセットを親コンポーネントに定義します。詳細は、第13.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

フラグメント

コア・ページ構造コンポーネント

MAF AMXファイル内にfragment要素を作成します。ページ・コンテンツの共有を可能にします。詳細は、第13.2.14項「フラグメント・コンポーネントの使用方法」を参照してください。

ファセット定義

コア・ページ構造コンポーネント

MAF AMXフラグメント・ファイル内にfacetRef要素を作成します。ページ・フラグメント使用方法で定義されたファセットを参照するために、ページ・フラグメント定義(fragmentDef)内で使用されます。詳細は、第13.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

パネル・グループ・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelGroupLayout要素を作成します。子コンポーネントを縦または横にグループ化します。詳細は、第13.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・フォーム・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelFormLayout要素を作成します。入力テキストなどのコンポーネントを、それらのラベルおよびフィールドが水平に、または各コンポーネントの上に整列するように配置します。詳細は、第13.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・ラベルおよびメッセージ

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelLabelAndMessage要素を作成します。ラベルおよびその子をレイアウトします。詳細は、第13.2.6項「パネル・ラベルおよびメッセージ・コンポーネントの使用方法」を参照してください。

パネル・ストレッチ・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelStretchLayout要素を作成します。1つのパネルを別のパネルの両側に配置できるようにします。詳細は、第13.2.5項「パネル・ストレッチ・レイアウト・コンポーネントの使用方法」を参照してください。

ポップアップ

セカンダリ・ウィンドウ

MAF AMXファイル内にpopup要素を作成します。ポップアップ・ウィンドウを表示します。詳細は、第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照してください。

パネル・スプリッタ

インタラクティブ・ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelSplitter要素を作成します。左側ナビゲーション・ペインで制御できる複数のコンテンツ領域を表示できます。詳細は、第13.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

パネル・アイテム

インタラクティブ・ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelItem要素を作成します。パネル・スプリッタのコンテンツ領域を表しています。詳細は、第13.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

デッキ

ページ・レイアウト・コンポーネント

MAF AMXファイル内にdeck要素を作成します。一度に子コンポーネントの1つを表示します。詳細は、第13.2.13項「デッキ・コンポーネントの使用方法」を参照してください。

スペーサ

ページ・レイアウト・コンポーネント

MAF AMXファイル内にspacer要素を作成します。MAF AMXファイル内のspacer要素によって表される空白の領域を作成します。詳細は、第13.2.10項「スペーサ・コンポーネントの使用方法」を参照してください。

表のレイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にtableLayout要素を作成します。行で構成された表を表します。詳細は、第13.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

行のレイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にrowLayout要素を作成します。表のレイアウト・コンポーネント内でセルで構成されている行を表します。詳細は、第13.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

セル・フォーマット

ページ・レイアウト・コンポーネント

MAF AMXファイル内にcellFormat要素を作成します。行のレイアウト・コンポーネント内のセルを表します。詳細は、第13.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

レイアウト・コンポーネントを追加するには、それを「コンポーネント」ウィンドウからMAF AMXページにドラッグ・アンド・ドロップします(第12.3.2項「MAF AMXページにUIコンポーネントを追加する方法」を参照)。次に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します(第12.3.2.2項「UIコンポーネントの構成」を参照)。特定のコンポーネントごとの属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されているいくつかのページ・レイアウト要素を示しています。

注意:
ページ・レイアウト要素は<amx>ネームスペースの下で宣言します。

<amx:panelPage id="pp1">
<amx:outputText id="outputText1"
value="Sub-Section Title 1"
styleClass="adfmf-text-sectiontitle"/>
<amx:panelFormLayout id="panelFormLayout1" labelPosition="start">
<amx:panelLabelAndMessage id="panelLabelAndMessage1" label="Name">
<amx:commandLink id="commandLink1" text="Jane Don" action="editname" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="panelLabelAndMessage2" label="Street Address">
<amx:commandLink id="commandLink2"
text="123 Main Street"
action="editaddr" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="panelLabelAndMessage3" label="Phone">
<amx:outputText id="outputText2" value="212-555-0123" />
</amx:panelLabelAndMessage>
</amx:panelFormLayout>
<amx:outputText id="outputText3"
value="Sub-Section Title 2"
styleClass="adfmf-text-sectiontitle" />
<amx:panelFormLayout id="panelFormLayout2" labelPosition="start">
<amx:panelLabelAndMessage id="panelLabelAndMessage4" label="Type">
<amx:commandLink id="commandLink3" text="Personal" action="edittype" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage label="Anniversary">
<amx:outputText id="outputText4" value="November 22, 2005" />
</amx:panelLabelAndMessage>
</amx:panelFormLayout>
<amx:panelFormLayout id="panelFormLayout3" labelPosition="start">
<amx:panelLabelAndMessage id="panelLabelAndMessage5" label="Date Created">
<amx:outputText id="outputText5" value="June 20, 2011" />
</amx:panelLabelAndMessage>
</amx:panelFormLayout>
</amx:panelPage>

図13-1 デザインタイムのページ・レイアウト・コンポーネント

レイアウト・コンポーネントのビジュアル・プレゼンテーションを管理するには、標準Cascading Style Sheet (CSS)を使用します。CSSは、ViewControllerプロジェクトのWeb Content/cssディレクトリに、MAFによって提供されているデフォルトCSSとともに配置されています。詳細は、第13.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

MAF AMXを使用して作成されたユーザー・インタフェースは、言語環境が左から右(LTR)、右から左(RTL)のいずれであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。ポップアップ(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)、パネル・アイテム、パネル・スプリッタ(第13.2.9項「パネル・スプリッタ・コンポーネントの使用方法」)など、一部のMAF AMXレイアウト・コンポーネントは、特定のRTL動作を有効化するように構成できます。MAF AMXページのRTL構成の詳細は、第13.4項「ジェスチャーの有効化」および第12.2.11項「ページ遷移スタイルの指定方法」を参照してください。

注意:
右から左のテキスト方向は、バージョン4.2より前のAndroidではサポートされていません。

UIDemoという名前のMAFサンプル・アプリケーションは、ボタンなどのMAF AMX UIコンポーネントとともにレイアウト・コンポーネントを使用して一般的なパターンに従った一般的なレイアウトのいくつかを実現する方法を示しています。さらに、このサンプル・アプリケーションは、スタイルを使用してページ・レイアウトを特定のパターンに合せる方法を示します。UIDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

13.2.1 表示コンポーネントの使用方法

表示(MAF AMXファイルのview要素)は、コア・ページ構造コンポーネントであり、MAF AMXファイルの作成時にそのファイルに自動的に挿入されます。このコンポーネントは、ページおよびその構造の階層表現を提供し、単一のMAF AMXページを表します。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.2.2 パネル・ページ・コンポーネントの使用方法

パネル・ページ(MAF AMXファイルのpanelPage要素)は、他のコンポーネントをレイアウトする画面のスクロール可能領域の定義を可能にするコンポーネントです。

デフォルトでは、MAF AMXページを作成するときに、JDeveloperによってパネル・ページ・コンポーネントが自動的に作成され、そのページに挿入されます。そのページにコンポーネントを追加すると、それらはパネル・ページ・コンポーネント内に挿入されます。

特定の領域(ページのヘッダーやフッターなど)をスクロールできないようにし、向きが変更されたときのストレッチを有効化するには、パネル・ページに対してファセット・コンポーネントを指定します。パネル・ページのヘッダー・ファセットには、各ページのナビゲーション・バーに配置されるタイトルが含まれています。パネル・ページに含めることができる他のタイプのファセット・コンポーネントの詳細は、第13.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

次の例は、MAF AMXファイルで定義されたpanelPage要素を示しています。このパネル・ページには、ヘッダー・ファセットが含まれています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
</amx:facet>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.2.3 パネル・グループ・レイアウト・コンポーネントの使用方法

パネル・グループ・レイアウト・コンポーネントは、基本レイアウト・コンポーネントであり、その子を垂直方向または水平方向に配置します。また、子コンポーネントを横に配置し、ページの端に達したら下に配置する、折返しレイアウトのオプションもあります。

パネル・グループ・レイアウト・コンポーネントを作成するには、「コンポーネント」ウィンドウを使用します。

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、パネル・グループ・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 目的の子コンポーネントをパネル・グループ・レイアウト・コンポーネントに挿入します。

3. 隣接する子コンポーネント間に間隔を追加するには、スペーサ(spacer)コンポーネントを挿入します。

4. 「プロパティ」ウィンドウを使用して、コンポーネント属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたpanelGroupLayout要素を示しています。

<amx:panelGroupLayout styleClass="prod" id="pgl1">
<amx:outputText styleClass="prod-label" value="Screen Size:" id="ot1"/>
</amx:panelGroupLayout>

13.2.3.1 スクロール動作のカスタマイズ

パネル・グループ・レイアウト・コンポーネントのスクロール動作はscrollPolicy属性により定義され、これはauto (デフォルト)、noneまたはscrollに設定できます。デフォルトでは、この動作はアクティブ・スキンで定義されているものに一致します。

アクティブ・スキンで定義されている動作とは関係なくスクロールを無効にするには、scrollPolicy属性をnoneに設定します。パネル・グループ・レイアウト・コンポーネントがスクロール可能でない場合、コンテンツは制約を受けません。

アクティブ・スキンで定義されている動作とは関係なくスクロールを有効にするには、scrollPolicy属性をscrollに設定します。パネル・グループ・レイアウト・コンポーネントがスクロール可能である場合は、コンポーネントのディメンションが制約されているとスクロールが提供されます。

スクロールは多量のメモリーを消費し、アプリケーションをクラッシュさせる可能性があるため、使用は最小限に抑える必要があります。mobileAltaスキン(第13.6.2項「スキニングに関する必知事項」を参照)では、パネル・グループ・レイアウト、パネル・フォーム・レイアウト(第13.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照)および表のレイアウト(第13.2.11項「表のレイアウト・コンポーネントの使用方法」を参照)のスクロールは無効です。アプリケーションにmobileAltaスキンを使用し、scrollPolicyは必要な場合にのみscrollに設定することをお薦めします。パネル・フォーム・レイアウトおよび表のレイアウトのスクロール動作をシミュレートするには、スクロールが必要になったときに、スクロール可能なパネル・グループ・レイアウト・コンポーネントでそれらを囲みます。

詳細は、第13.3.15.2項「MAF AMX UIコンポーネントによるメモリー消費に関する必知事項」を参照してください。

13.2.4 パネル・フォーム・レイアウト・コンポーネントの使用方法

パネル・フォーム・レイアウト(panelFormLayout)コンポーネントは、コンポーネントをそれらのラベルおよびフィールドが水平方向に整列するように配置します。一般的に、パネル・フォーム・レイアウト・コンポーネントのメイン・コンテンツは、入力コンポーネント(入力テキストなど)および選択コンポーネント(選択肢など)で構成されています。label属性が定義されている子コンポーネントをパネル・フォーム・レイアウト・コンポーネント内に配置すると、その子コンポーネントのラベルおよびフィールドはパネル・フォーム・レイアウトの定義に基づいて整列およびサイズ設定されます。パネル・フォーム・レイアウト内では、ラベル領域は、フィールド領域の開始側上またはフィールド領域の上の独立した線上のどちらにも表示できます。独立した線は、パネル・フォーム・レイアウトのlabelPosition属性がtopStart、topCenterまたはtopEndに設定されている場合に使用されます。それ以外の場合は、ラベル領域はフィールド領域の開始側上に表示されます。ラベル領域内では、labelPosition属性によって、次のようにラベル・テキストを整列できる位置が制御されます。

- 開始側(labelPosition="start"またはlabelPosition="topStart")

- 中央(labelPosition="center"またはlabelPosition="topCenter")

- 終了側(labelPosition="end"またはlabelPosition="topEnd")

フィールド領域内では、fieldHalign属性によって、次のようにフィールド・コンテンツを整列できる位置が制御されます。

- 開始側(fieldHalign="start")

- 中央(fieldHalign="center")

- 終了側(fieldHalign="end")

パネル・フォーム・レイアウト内では、maxColumnsおよびrows属性を使用して1つ以上の列に子コンポーネントを配置できます。最適な複数列レイアウトを実現するためには、これらの属性をlabelWidth、fieldWidth、labelPositionおよびshowHorizontalDividers属性とともに使用する必要があります。

注意:
単一列から複数列にレイアウトを切り替えるには、maxColumns属性に設定されている値に関係なく、rows属性の値を1より大きくする必要があります。rows属性を指定すると、maxColumns属性の値がレイアウトの最大列数に設定されますが、子コンポーネントのレイアウトに必要なだけの行数が含まれています。

パネル・フォーム・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、パネル・フォーム・レイアウト・コンポーネントをMAF AMXページにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたpanelFormLayout要素を示しています。

<amx:panelFormLayout styleClass="prod" id="pfl1">
<amx:panelLabelAndMessage label="Type" id="plm1">
<amx:commandLink text="Personal" action="edittype" id="cl1"/>
</amx:panelLabelAndMessage>
</amx:panelFormLayout>

13.2.5 パネル・ストレッチ・レイアウト・コンポーネントの使用方法

パネル・ストレッチ・レイアウト(panelStretchLayout)コンポーネントは、top、bottomおよびcenterの3つの子ファセット・コンポーネントを管理します(次の例を参照)。これらのファセットは、任意の組合せでいくつでも使用できます。

<amx:panelStretchLayout id="psl1">
<amx:facet name="top">
</amx:facet>
<amx:facet name="center">
</amx:facet>
<amx:facet name="bottom">
</amx:facet>
</amx:panelStretchLayout>

3つの矩形が上下に重なった状態のパネル・ストレッチ・レイアウト・コンポーネントを表現しようとした場合は、次のことが該当します。

- 最上部の矩形の高さは、topファセットの通常の高さにより定義されます。

- 最下部の矩形の高さは、bottomファセットの通常の高さにより定義されます。

- 残りの垂直スペースは、中間の矩形に配分されます。この矩形の高さがCenter.heightに定義された値よりも小さく、panelStretchLayoutのscrollPolicy属性がscrollまたはautoのいずれかに設定されている場合、スクロールバーが追加されます。

パネル・ストレッチ・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、パネル・ストレッチ・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 作成された子ファセット・コンポーネントを確認し、必要に応じてその一部を削除します。

3. 「プロパティ」ウィンドウを使用して、コンポーネント属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.2.6 パネル・ラベルおよびメッセージ・コンポーネントの使用方法

パネル・ラベルおよびメッセージ(panelLabelAndMessage)コンポーネントは、label属性が定義されていないコンポーネントを配置するために使用します。これらのコンポーネントとしては、通常、出力テキスト、ボタンまたはリンクがあります。

パネル・ラベルおよびメッセージ・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、パネル・ラベルおよびメッセージ・コンポーネントをパネル・グループ・レイアウト・コンポーネントにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたpanelLabelAndMessage要素を示しています。label属性が、子コンポーネントに対して使用されています。

<amx:panelLabelAndMessage label="Phone" id="plm1">
<amx:outputText value="212-555-0123" id="ot1"/>
</amx:panelLabelAndMessage>

13.2.7 ファセット・コンポーネントの使用方法

ファセット(facet)コンポーネントは、親レイアウト・コンポーネント上に、ヘッダーやフッターなど任意の名前のファセットを定義するために使用します。ファセットの位置およびレンダリングは、親コンポーネントによって決定されます。

MAF AMXページのヘッダーは、通常、ヘッダー、プライマリおよびセカンダリ・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- ヘッダー・ファセット: ページ・タイトルが含まれています。

- プライマリ・アクション・ファセット: ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセット: ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

MAF AMXページのフッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- フッター・ファセット: コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

次の例は、パネル・ページ・コンテナ内で宣言されているfacet要素を示しています。ファセットのタイプは、常にそのname属性で定義されます(表13-2を参照)。

<amx:panelPage id="pp1">
<amx:facet name="footer">
<amx:commandButton id="cb2" icon="folder.png"
text="Move (#{myBean.mailcount})"
action"move"/>
</amx:facet>
</amx:panelPage>

表13-2には、特定の親コンポーネントとともに使用できる事前定義済ファセット・タイプがリストされています。

表13-2 ファセット・タイプと親コンポーネント

親コンポーネント

ファセット・タイプ(名前)

パネル・ページ(panelPage)

header、footer、primary、secondary

リスト・ビュー(listView)

header、footer

カルーセル(carousel)

nodeStamp

パネル・スプリッタ(panelSplitter)

navigator

パネル・ストレッチ・レイアウト(panelStretchLayout)

top、center、bottom

データ視覚化コンポーネント。

詳細は、第13.5項「データ視覚化の指定」を参照してください。

dataStamp、seriesStamp、overview、rows (NBoxに適用可能)、columns (NBoxに適用可能)、cells (NBoxに適用可能)、icon (NBoxノードに適用可能)、indicator (NBoxノードに適用可能)

ファセット・コンポーネントを追加するには:

「構造」ウィンドウまたはソース・エディタに表示されるポップアップ・メニューを使用して、ファセット・コンポーネントを別のコンポーネントの子として追加できます。ポップアップ・メニューには、選択している親コンポーネントに有効なファセットのみが表示されます。ファセットを追加するには、最初に「構造」ウィンドウまたはソース・エディタで親コンポーネントを選択してから右クリックし、次のうちの1つを選択します。

- 親コンポーネントがパネル・ページである場合、図13-2に示すように、「ファセット-パネル・ページ」を選択し、リストからファセットのタイプを選択します。

図13-2 パネル・ページにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがリスト・ビューである場合、図13-3に示すように、「ファセット-リスト・ビュー」を選択し、リストからファセットのタイプを選択します。

図13-3 リスト・ビューにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがカルーセルである場合、図13-4に示すように、「ファセット-カルーセル」→「ノード・スタンプ」を選択します。

図13-4 カルーセルにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがパネル・スプリッタである場合、図13-5に示すように、「ファセット-パネル・スプリッタ」→「ナビゲータ」を選択します。

図13-5 パネル・スプリッタにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがパネル・ストレッチ・レイアウトである場合、図13-6に示すように、「ファセット-パネル・ストレッチ・レイアウト」を選択し、リストからファセットのタイプを選択します。

図13-6 パネル・ストレッチ・レイアウトにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがデータ視覚化コンポーネントの1つである場合、図13-7に示すように、「ファセット」→「<MAF AMXデータ視覚化コンポーネント名>」を選択し、リストからファセットのタイプを選択します。

図13-7 データ視覚化コンポーネントにファセットを追加するためのポップアップ・メニューの使用方法

データ視覚化コンピュータとされらの属性の詳細は、第13.5項「データ視覚化の指定」を参照してください。

別の方法:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」→「コア構造」を選択し、表13-2にリストされた別のコンポーネントにファセット・コンポーネントをドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.2.8 ポップアップ・コンポーネントの使用方法

ポップアップ(popup)コンポーネントを使用して、ポップアップ・ウィンドウを表示します。このコンポーネントは、ビュー・コンポーネントの子として宣言できます。

ポップアップ・コンポーネントとともに次の操作を使用できます。

- ポップアップを閉じる動作(closePopupBehavior)の操作は、ポップアップを閉じる動作のtype属性を使用して指定したクライアントによってトリガーされるイベントに応じてポップアップを閉じる宣言的な方法を表しています。
ポップアップを閉じる動作コンポーネントの属性およびその値の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

- ポップアップ表示動作(showPopupBehavior)の操作は、ポップアップ表示動作のtype属性を使用して指定されたクライアントによってトリガーされるイベントに応答してポップアップを表示する宣言的な方法です。
ポップアップ表示動作のpopupId属性は、その親コンポーネントに関連するポップアップ・コンポーネントの一意の識別子を指定します。ポップアップ表示動作のalignId属性は、そのポップアップを整列する基準となるUIコンポーネントの一意の識別子を指定します。識別子を手動で設定するのは、手間がかかり、さらに無効な参照が発生する可能性もあるため、これらの2つの属性の値は標準「プロパティ」ウィンドウと統合されているエディタを使用して設定します(図13-9を参照)。これらの識別子を検証するために特別に定義されている監査ルールがあります(第12.3.2.3章「要素識別子とその監査に関する必知事項」を参照)。

ポップアップ表示動作のdecoration属性を使用すると、指定されたalignIdに一致するコンポーネントを指すアンカーを持つようにポップアップを構成できます。これを行うには、decoration属性をanchorに設定します(デフォルト値はsimpleです)。

注意:
alignId属性を使用するためにdecoration="anchor"を定義する必要はありません。decoration="anchor"を使用する場合にalignId属性が指定されていないか、alignIdの一致が見つからない場合、decorationはデフォルトでsimpleに設定され、ポップアップ・コンポーネントには最小限の装飾のみが行われます。

ポップアップ表示動作のalign属性に設定する値は、ポップアップ・コンポーネントの配置を示します(その配置を行うのに十分なスペースがある場合)。十分なスペースがない場合は、代替の配置がMAFによって選択されます。

ヒント:
ポップアップを画面中央に配置するには、パネル・ページ・コンポーネントのalignId属性を設定してから、align="center"を使用します。

ポップアップ表示動作コンポーネントの属性およびその値の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたpopupと、そのshowPopupBehaviorおよびclosePopupBehavior要素を示しています。

<amx:view>
<amx:panelPage id="panelPage1">
<amx:commandButton id="commandButton1" text="Show Popup">
<amx:showPopupBehavior popupId="popup1" type="action"
align="topStart" alignId="panelPage1"
decoration="anchor"/>
</amx:commandButton>
</amx:panelPage>
<amx:popup id="popup1"
animation="slideUp"
autoDismiss="true"
backgroundDimming="off">
<amx:panelGroupLayout id="pgl2" layout="vertical">
<amx:commandButton id="commandButton3" text="Close Popup">
<amx:closePopupBehavior type="action" popupId="popup1"/>
</amx:commandButton>
</amx:panelGroupLayout>
</amx:popup>
</amx:view>

ポップアップ・コンポーネントは、ユーザー入力エラーが発生したときに検証メッセージを表示できます。詳細は、第13.9項「入力の検証」を参照してください。

ポップアップID属性を設定するには:

1. 「ソース」エディタまたは「構造」ウィンドウで、showPopupBehavior要素またはcloseopupBehavior要素を選択します。

2. 「ポップアップID」フィールドの右側にある下矢印をクリックし、使用可能なポップアップ・コンポーネントのリストから選択するか(図13-8を参照)、「ポップアップID」フィールドの右側にある「プロパティ・メニュー」アイコンをクリックして「ポップアップID」プロパティ・エディタを開きます(図13-9を参照)。

図13-8 リストからのポップアップIDの選択

図13-9 ポップアップID属性の設定

3. プロパティ・エディタを使用する場合は、「ポップアップID」プロパティ・エディタで「編集」を選択し、図13-10に示す「プロパティの編集: ポップアップID」ダイアログを開きます。

図13-10 ポップアップIDのプロパティの編集ダイアログ

4. ポップアップ表示動作またはポップアップを閉じる動作を起動したときに表示されるポップアップ・コンポーネントまたはポップアップを閉じるコンポーネントを選択します。

位置合せID属性を設定するには:

1. ソース・エディタまたは「構造」ウィンドウでshowPopupBehavior要素を選択します。

2. 「位置合せID」フィールドの右側にある「プロパティ・メニュー」アイコンをクリックし、図13-11に示すように「位置合せID」プロパティ・エディタを開きます。

図13-11 位置合せID属性の設定

3. 「位置合せID」プロパティ・エディタで「編集」を選択し、図13-12に示す「プロパティの編集: 位置合せID」ダイアログを開きます。

図13-12 位置合せIDのプロパティの編集ダイアログ

4. ポップアップ表示動作操作の親コンポーネントを選択します。

iOSプラットフォームとAndroid 4.2以降のプラットフォームの両方に対応した開発を行う場合、右から左(RTL)の言語環境に対応するようにポップアップを構成するには、そのanimation属性をslideStartまたはslideEndに設定します。

UIDemoという名前のMAFサンプル・アプリケーションは、ポップアップ・コンポーネントの使用方法と、スタイルを適用して、特定のパターンに従ってページ・レイアウトを調整する方法を示しています。UIDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

13.2.9 パネル・スプリッタ・コンポーネントの使用方法

パネル・スプリッタ(panelSplitter)コンポーネントは、左側にあるナビゲーション・ペインで制御可能な複数のコンテンツ領域を表示するために使用します。パネル・スプリッタ・コンポーネントは、通常、表示サイズが大きいタブレット・デバイスで使用されます。これらのコンポーネントは、通常、表示領域の左側にリストが、右側にコンテンツがある場合に使用されます。

パネル・スプリッタには、MAF AMXページにパネル・スプリッタをドラッグ・アンド・ドロップすると自動的に生成されるナビゲータ・ファセット(第13.2.7項「ファセット・コンポーネントの使用方法」を参照)およびパネル・アイテム・コンポーネントを含めることができます。パネル・アイテム(panelItem)コンポーネントは、パネル・スプリッタのコンテンツ領域を表します。各パネル・スプリッタ・コンポーネントには少なくとも1つのパネル・アイテムが必要なため、パネル・スプリッタが作成されるときにパネル・アイテムがパネル・スプリッタに自動的に追加されます。各パネル・アイテム・コンポーネントには、パネル・グループ・レイアウトに含めることができるどのようなコンポーネントも含めることができます(第13.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照)。

「パネル・スプリッタ」の左側は、ナビゲータ・ファセット(navigator)によって表されます。これは、アニメーション付きの複数のコンテンツのみが必要とされる場合(たとえば、異なるボタンを選択してコンテンツを切り替えるときにアニメーションを必要とする選択ボタン付きの複数コンテンツ領域を描画する場合)のオプションです。横モードの場合、このファセットがレンダリングされます。縦モードの場合、ボタンはコンテンツ領域の上に配置され、クリックされたときにこのファセットのコンテンツがポップアップ内で起動されます。

iOSプラットフォームとAndroid 4.2以降のプラットフォームの両方に対応した開発を行う場合、右から左(RTL)の言語環境に対応するようにパネル・スプリッタとパネル・アイテムを構成するには、それらのanimation属性をslideStart、slideEnd、flipStart、flipEndのいずれかに設定します。パネル・アイテム・コンポーネントのanimation属性は、パネル・スプリッタのanimation属性をオーバーライドします。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたpanelSplitter要素と、子コンポーネントとして使用されるnavigatorファセットを示しています。

<amx:panelSplitter id="ps1"
selectedItem="#{bindings.display.inputValue}"
animation="flipEnd">
<amx:facet name="navigator">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row"
showMoreStrategy="autoScroll"
bufferStrategy="viewport>
...
</listView>
</facet>
<amx:panelItem id="x">
<amx:panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
<amx:panelItem id="y">
<amx:panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
</panelSplitter>

その他の例は、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるUIDemoアプリケーションを参照してください。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.2.10 スペーサ・コンポーネントの使用方法

スペーサ(spacer)コンポーネントは、MAF AMXページ上でコンポーネントを区分するための空白の領域を作成するために使用します。spacerのheight属性(垂直空白用)およびwidth属性(水平空白用)を使用して、縦または横の空白をページに組み込むことができます。

スペーサ・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、「スペーサ」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたspacer要素とその子を示しています。

<amx:outputText id="ot1" value="This is a long piece of text for this page..."/>
<amx:spacer id="s1" height="10"/>
<amx:outputText id="ot2" value="This is some more lengthy text..."/>

13.2.11 表のレイアウト・コンポーネントの使用方法

表のレイアウト(tableLayout)コンポーネントは、セルを含む行で構成される一般的な表のフォーマットでデータを表示するために使用します。

行のレイアウト(rowLayout)コンポーネントは、表のレイアウトの単一の行を表します。表のレイアウト・コンポーネントには、1つ以上の行のレイアウト・コンポーネント、または行のレイアウト・コンポーネントを生成できるイテレータ・コンポーネントのいずれかが含まれている必要があります。

セル・フォーマット(cellFormat)コンポーネントは、行のレイアウトのセルを表します。行のレイアウト・コンポーネントには、1つ以上のセル・フォーマット・コンポーネント、イテレータ・コンポーネント、属性リスト・イテレータ・コンポーネントまたはセル・フォーマット・コンポーネントを生成できるファセット定義コンポーネントのいずれかが含まれている必要があります。

表のレイアウト構造では、セル・コンテンツで割合による高さを使用したり、表構造全体に高さをまとめて割り当てることはできません。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスで次の属性の説明を参照してください。

- 表のレイアウト・コンポーネントのlayoutおよびwidth属性

- 行のレイアウト・コンポーネントのwidthおよびheight属性

表のレイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、「表のレイアウト」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の行のレイアウト、イテレータ、属性リスト・イテレータまたはファセット定義子コンポーネントを表のレイアウト・コンポーネントに挿入します。

3. セル・フォーマット、イテレータ、属性リスト・イテレータまたはファセット定義子コンポーネントをそれぞれの行のレイアウト・コンポーネントに挿入します。

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたtableLayout要素とその子を示しています。

<amx:tableLayout id="tableLayout1"
rendered="#{pageFlowScope.pRendered}"
styleClass="#{pageFlowScope.pStyleClass}"
inlineStyle="#{pageFlowScope.pInlineStyle}"
borderWidth="#{pageFlowScope.pBorderWidth}"
cellPadding="#{pageFlowScope.pCellPadding}"
cellSpacing="#{pageFlowScope.pCellSpacing}"
halign="#{pageFlowScope.pHalign}"
layout="#{pageFlowScope.pLayoutTL}"
shortDesc="#{pageFlowScope.pShortDesc}"
summary="#{pageFlowScope.pSummary}"
width="#{pageFlowScope.pWidth}">
<amx:rowLayout id="rowLayout1">
<amx:cellFormat id="cellFormatA" rowSpan="2" halign="center">
<amx:outputText id="otA" value="Cell A"/>
</amx:cellFormat>
<amx:cellFormat id="cellFormatB" rowSpan="2" halign="center">
<amx:outputText id="otB" value="Cell B (wide content)"/>
</amx:cellFormat>
<amx:cellFormat id="cellFormatC" rowSpan="2" halign="center">
<amx:outputText id="otC" value="Cell C"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rowLayout2">
<amx:cellFormat id="cellFormatD" halign="end">
<amx:outputText id="otD" value="Cell D"/>
</amx:cellFormat>
<amx:cellFormat id="cellFormatE">
<amx:outputText id="otE" value="Cell E"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>

13.2.12 メーソンリー・レイアウト・コンポーネントの使用方法

メーソンリー・レイアウト(masonryLayout)は、ダッシュボードと同様に列と行に配置されたタイルとして子コンポーネントを提示するコンテナタイプのコンポーネントです。各列と行のサイズは固定で、CSSで定義されます。このサイズは、メーソンリー・レイアウト・コンポーネント自体のサイズから独立しています。表示される列数はメーソンリー・レイアウト・サイズに応じて変化する場合がありますが、タイル・サイズは変化しません。また、タイル・サイズはコンテンツに依存しません。

タイルは、コンテンツが様々なMAF AMX UIコンポーネントによって提供されるメーソンリー・レイアウト・アイテム(masonryLayoutItem)コンポーネントによって表現されます。1つのタイルは複数の行および列を占めることができます(たとえば、タイルは3列と1行を占めることができます)。MAF AMXは、masonryLayoutItemのdimension属性を通じて使用可能な次のタイル・サイズの定義済セットを提供します。

- 1x1: 1列と1行。

- 1x2: 1列と2行。

- 1x3: 1列と3行。

- 2x1: 2列と1行。

- 2x2: 2列と2行。

- 2x3: 2列と3行。

- 3x1: 3列と1行。

- 3x2: 3列と2行。

CSSの.amx-masonryLayoutItemセクションで追加のサイズを作成することにより、メーソンリー・レイアウト・コンポーネントの外観を再定義できます。

行と列の間のスペースも、CSSで指定されます。

メーソンリー・レイアウト・コンポーネントは、レイアウト内に以前に残された間隔を埋め、適合するタイルを配置することで、使用可能なスペースの最大限の利用を試みます。エンド・ユーザーがモバイル・デバイスを回転すると、タイルが再配置され、スペースが最適に埋められます。この機能は、メーソンリー・レイアウト・アイテムの配置を変更するたびに、メーソンリー・レイアウト・コンポーネントによって起動されるMasonryReorderEventを介して有効になります。

メーソンリー・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、メーソンリー・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 目的の数のメーソンリー・レイアウト・アイテム・コンポーネントとその子UIコンポーネントをメーソンリー・レイアウト・コンポーネントに挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたmasonryLayout要素およびmasonryLayoutItem要素とそれらの子を示しています。

<amx:masonryLayout id="ml1"
initialOrder="#{pageFlowScope.componentProperties.order}">
<amx:masonryLayoutItem id="mt1"
dimension="#{pageFlowScope.componentProperties.myTeamExpanded ? '3x1' : '1x1'}"
rendered="#{pageFlowScope.componentProperties.myTeam}">
<amx:panelGroupLayout id="pgl9"
layout="vertical"
inlineStyle="margin: 6px; padding: 0px; border: none">
<amx:outputText value="My Team"
id="ot4"
inlineStyle="color: gray"/>
<amx:panelGroupLayout id="pgl1"
layout="horizontal"
scrollPolicy="scroll"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:panelGroupLayout id="pgl10"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i8"
source="/images/people/TerryLuca.png"
shortDesc="Terry Luca"/>
<amx:outputText value="Terry Luca"
id="ot9"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
<amx:panelGroupLayout id="pgl11"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i9"
source="/images/people/SusanWong.png"
shortDesc="Susan Wong"/>
<amx:outputText value="Susan Wong"
id="ot12"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
<amx:panelGroupLayout id="pgl12"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i10"
source="/images/people/RaviChouhan.png"
shortDesc="Ravi Chouhan"/>
<amx:outputText value="Ravi Chouhan"
id="ot11"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
<amx:panelGroupLayout id="pgl13"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i11"
source="/images/people/KathyGreen.png"
shortDesc="Kathy Green"/>
<amx:outputText value="Kathy Green"
id="ot10"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
<amx:panelGroupLayout id="pgl16"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i5"
source="/images/people/StellaBaumgardner.png"
shortDesc="Stella Baum"/>
<amx:outputText value="Stella Baum"
id="ot3"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
</amx:panelGroupLayout>
</amx:panelGroupLayout>
</amx:masonryLayoutItem>
<amx:masonryLayoutItem id="mt2"
dimension="#{pageFlowScope.componentProperties.socialExpanded ? '3x1' : '1x1'}"
rendered="#{pageFlowScope.componentProperties.social}">
<amx:panelGroupLayout id="pgl2"
inlineStyle="margin: 6px; padding: 0px; border: none">
<amx:panelGroupLayout id="pgl22"
layout="vertical"
inlineStyle="margin: 0px; padding: 0px; border: none">
<amx:outputText value="Social"
id="ot2"
inlineStyle="color: gray"/>
<amx:spacer id="s5" height="6"/>
<amx:outputText value="New Conversations"
id="ot14"
inlineStyle="color: gray; font-size: 15px"/>
<amx:outputText value="6"
id="ot15"
inlineStyle="font-size:34px; color: #EE8A11"/>
<amx:outputText value="New Followers"
id="ot17"
inlineStyle="color: gray; font-size: 15px"/>
<amx:outputText value="5"
id="ot16"
inlineStyle="font-size:34px; color: #EE8A11"/>
</amx:panelGroupLayout>
</amx:panelGroupLayout>
</amx:masonryLayoutItem>
<amx:masonryLayoutItem id="mt3"
...
</amx:masonryLayoutItem>
</amx:masonryLayout>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.2.13 デッキ・コンポーネントの使用方法

デッキ(deck)コンポーネントは、その子コンポーネントを一度に1つ表示するコンテナを表します。表示される子コンポーネント(displayedChild属性によって定義)の別の子コンポーネントへの遷移は、アニメーションの形式をとる遷移(transition)操作により有効になります。遷移は、フェードイン、スライディングおよび別の方向からのフリップと、子コンポーネントの非表示および表示によって発生します。

デッキは、前後に移動できます。

デッキ・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、デッキをMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の遷移操作および子UIコンポーネントをデッキ・コンポーネントに挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されたdeck要素とその子を示しています。デッキ・コンポーネントのdisplayedChild属性は、表示する子コンポーネントIDを定義します。通常、ボタンを1つ選択などの選択コンポーネントによってこのことが制御されます。

<amx:deck id="deck1"
rendered="#{pageFlowScope.pRendered}"
styleClass="#{pageFlowScope.pStyleClass}"
inlineStyle="width:95px;height:137px;overflow:hidden;
#{pageFlowScope.pInlineStyle}"
landmark="#{pageFlowScope.pLandmark}"
shortDesc="#{pageFlowScope.pShortDesc}"
displayedChild="#{pageFlowScope.pDisplayedChild}">

<amx:transition triggerType="#{pageFlowScope.pTriggerType}"
transition="#{pageFlowScope.pTransition}"/>
<amx:transition triggerType="#{pageFlowScope.pTriggerType2}"
transition="#{pageFlowScope.pTransition2}"/>
<amx:commandLink id="linkCardBack1" text="Card Back">>
<amx:setPropertyListener from="linkCardA"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardA1" text="Card Front A">
<amx:setPropertyListener id="setPL1"
from="linkCardB"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardB1" text="Card Front B">
<amx:setPropertyListener id="setPL2"
from="linkCardC"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardC1" text="Card Front C">
<amx:setPropertyListener id="setPL3"
from="linkCardD"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardD1" text="Card Front D">
<amx:setPropertyListener id="setPL4"
from="linkCardE"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardE1" text="Card Front E">
<amx:setPropertyListener id="setPL5"
from="linkCardBack"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
</amx:deck>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.2.14 フラグメント・コンポーネントの使用方法

フラグメント(fragment)コンポーネントは、MAF AMXページ・コンテンツの共有を有効にします。このコンポーネントは、MAF AMXフラグメント・ファイルと組み合せて使用されます。詳細は、第12.3.1.6項「ページ・コンテンツの共有」を参照してください。

フラグメント・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、フラグメントをMAF AMXページにドラッグ・アンド・ドロップします。

2. 「フラグメントの挿入」ダイアログを使用して、フラグメントのSrc属性をフラグメント・ファイル(.amxf)に設定します。

3. オプションで、「構造」ビューを使用して、属性、属性リストまたはファセットなどの子コンポーネントを追加します。

図13-13 フラグメントへの移入

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

5. フラグメントにコンテンツを含めるMAF AMXフラグメント・ファイルにファセット定義(facetRef)を追加し、facetRefのfacetName属性をファセットの名前に設定します。

次の例は、MAF AMXページに追加されたfragment要素を示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:panelGroupLayout layout="vertical"
id="itemPgl"
styleClass="amx-style-groupbox">
<amx:fragment id="f1"
src="/simpleFragment.amxf"
<amx:attribute id="a1"
name="text"
value="defaultValue" />
<amx:facet name="facet">
<amx:outputText id="ot5" value="Fragment"/>
</amx:facet>
</amx:fragment>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

次の例は、対応するMAF AMXフラグメント・ファイルを示しています。

<amx:fragmentDef
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment" id="f1">
<description id="d1">Description of the fragment</description>
<facet id="f2">
<description id="d4">Description of the facet</description>
<facet-name id="f3">facet1</facet-name>
</facet>
<attribute id="a1">
<description id="d2">Description of an attribute</description>
<attribute-name id="a2">text</attribute-name>
<attribute-type id="at1">String</attribute-type>
<default-value id="d3">defaultValue</default-value>
</attribute>
</fragment>
<amx:panelGroupLayout id="pgl1">
<amx:facetRef facetName="facet1" id="fr1"/>
<amx:outputText value="#{text}" id="ot1"/>
</amx:panelGroupLayout>
</amx:fragmentDef>

FragmentDemoという名前のMAFサンプル・アプリケーションは、フラグメントの作成方法および使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

13.3 UIコンポーネントの作成と使用方法

MAF AMXアプリケーション機能を開発する際は、次のUIコンポーネントを使用できます。

- 入力テキスト(第13.3.1項「入力テキスト・コンポーネントの使用方法」を参照)

- 入力数値スライダ(第13.3.2項「入力数値スライダ・コンポーネントの使用方法」を参照)

- 入力日(第13.3.3項「入力日コンポーネントの使用方法」を参照)

- 出力テキスト(第13.3.4項「出力テキスト・コンポーネントの使用方法」を参照)

- ボタン(第13.3.5項「ボタンの使用方法」を参照)

- リンク(第13.3.6項「リンクの使用方法」を参照)

- イメージ(第13.3.7項「イメージの表示方法」を参照)

- チェックボックス(第13.3.8項「チェックボックス・コンポーネントの使用方法」を参照)

- チェックボックスを複数選択(第13.3.9項「チェックボックスを複数選択コンポーネントの使用方法」を参照)

- 選択肢を複数選択(第13.3.11項「選択肢を複数選択コンポーネントの使用方法」を参照)

- ブール・スイッチ(第13.3.12項「ブール・スイッチ・コンポーネントの使用方法」を参照)

- 選択肢(第13.3.10項「選択肢コンポーネントの使用方法」を参照)

- 選択ボタン(第13.3.13項「選択ボタン・コンポーネントの使用方法」を参照)

- ラジオ・ボタン(第13.3.14項「ラジオ・ボタン・コンポーネントの使用方法」を参照)

- リスト・ビュー(第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)

- カルーセル(第13.3.16項「カルーセル・コンポーネントの使用方法」を参照)

- フィルム・ストリップ(第13.3.17項「フィルム・ストリップ・コンポーネントの使用方法」を参照)

- Verbatim (第13.3.18項「Verbatimコンポーネントの使用方法」を参照)

- 出力HTML (第13.3.19項「出力HTMLコンポーネントの使用方法」を参照)

- イテレータ(第13.3.20項「反復の有効化方法」を参照)

MAF AMXアプリケーション機能を開発する際は、UIコンポーネントの子として、操作、リスナー・タイプ・コンポーネントおよびコンバータなど、次のその他のコンポーネントも使用できます。

- バンドルのロード(第13.3.21項「リソース・バンドルのロード方法」を参照)

- アクション・リスナー(第13.3.22項「アクション・リスナーの使用方法」を参照)

- プロパティ・リスナーの設定(第13.3.23項「プロパティ・リスナーの設定の使用方法」を参照)

- クライアント・リスナー(第13.3.24項「クライアント・リスナーの使用方法」を参照)

- 日時の変換(第13.3.25項「日時の変換方法」を参照)

- 数値の変換(第13.3.26項「数値の変換方法」を参照)

- ナビゲーション・ドラッグ動作(第13.3.27項「ドラッグ・ナビゲーションを有効にする方法」を参照)

- ロード・インジケータ動作(第13.3.28項「ロード・インジケータの使用方法」を参照)

UIコンポーネントを追加するには、それを「コンポーネント」ウィンドウからMAF AMXページにドラッグ・アンド・ドロップします(第12.3.2項「MAF AMXページにUIコンポーネントを追加する方法」を参照)。次に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します(第12.3.2.2項「UIコンポーネントの構成」を参照)。特定のコンポーネントごとの属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

注意:
MAF AMXページで、レイアウト・コンポーネント内にUIコンポーネントを配置します(第13.2項「ページ・レイアウトの設計」を参照)。UI要素は、<dvtm>ネームスペースの下で宣言されるデータ視覚化コンポーネントを除き、<amx>ネームスペースの下で宣言されます。

いくつかのUIコンポーネントにはイベント・リスナーを追加できます。詳細は、第13.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもMAF AMXランタイムの記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

これらのUIコンポーネントにおけるアクセシビリティのサポートの詳細は、第13.8項「MAFのアクセシビリティのサポートの理解」を参照してください。

注意:
MAFでは、デザインタイムにEL式を評価しません。コンポーネントの属性の値が式に設定されている場合、この値はJDeveloperのプレビューでは式として表示され、実行時のコンポーネントの表示は異なる場合があります。

MAF AMXを使用してiOSプラットフォームとAndroid 4.2以降のプラットフォームの両方に対応して作成されたユーザー・インタフェースは、言語環境が左から右(LTR)、右から左(RTL)のいずれであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。

CompGalleryという名前のMAFサンプル・アプリケーションは、MAF AMX UIコンポーネントの作成方法および構成方法を示しています。UIDemoという名前のもう1つのサンプル・アプリケーションは、MAF AMXページでのコンポーネントのレイアウト方法を示しています。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

13.3.1 入力テキスト・コンポーネントの使用方法

入力テキスト(inputText)コンポーネントは、編集可能テキスト・フィールドを表します。使用可能な入力テキスト・コンポーネントのタイプは次のとおりです。

- 標準単一行入力テキスト。これは、MAF AMXファイルのinputText要素で宣言されます。

<amx:inputText id="text1"
label="Text Input:"
value="#{myBean.text}" />

- パスワード入力テキスト:

<amx:inputText id="text1"
label="Password Input:"
value="#{myBean.text}"
secret="true" />

- 複数行入力テキスト(テキスト領域とも呼ばれる):

<amx:inputText id="text1"
label="Textarea:"
value="#{myBean.text}"
simple="true"
rows="4" />

図13-14は、「プレビュー」ペインに表示されている入力テキスト・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputText id="inputText1"
label="Input Text"
value="text"/>

図13-14 デザインタイムの入力テキスト

inputType属性によって、コンポーネントでユーザー入力がどのように(テキスト(デフォルト)、電子メール・アドレス、数値、電話銀号、URLのいずれかとして)解釈されるのかを定義できます。これらの入力タイプは、HTML5によって許容される値に基づいています。

入力テキスト・コンポーネントに入力される日時値とともに数値の変換を有効にするには、数値の変換(第13.3.26項「数値の変換方法」を参照)および日時の変換(第13.3.25項「日時の変換方法」を参照)コンポーネントを使用します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery。

いくつかのモバイル・デバイスでは、エンド・ユーザーが入力テキスト・フィールドをタップすると、キーボードが表示(スライドアップ)されます。入力テキストがMAF AMXページの唯一のコンポーネントである場合、ページがロードされるときに、デフォルトで入力フォーカスはこのフィールド上に配置され、キーボードが表示されます。

複数行入力テキストは、それが唯一のコンポーネントである場合、セカンダリ・ページに表示されることがあります。その場合、ページがロードされてキーボードが表示されたときに複数行入力テキストがフォーカスを受け取ります。

iOSデバイスとAndroidデバイスでは、入力テキスト・コンポーネントのレンダリングおよび動作は異なります。iPhoneおよびiPadでは、入力テキスト・コンポーネントが表示されるときに境界線がある場合とない場合があります。

入力テキスト・コンポーネントを作成する際は、次の点を考慮してください。

- コンテンツを入力または編集するには、エンド・ユーザーはフィールド内をタップする必要があります。それにより、タップした場所に点滅する挿入カーソルが表示され、エンド・ユーザーがコンテンツを編集できるようになります。フィールドにコンテンツが含まれていない場合、挿入カーソルはフィールドの先頭に配置されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、通常、プロンプトとして使用されるデフォルト・テキストが含まれていることがあります。エンド・ユーザーがそのようなフィールド内でキーボードのキーをタップすると、編集モードになったときにそのデフォルト・テキストがクリアされます。この動作は入力テキストのhintText属性により有効にされ、構成されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、選択済の外観はありません。選択は、フィールド内の点滅する挿入カーソルによって示されます。

- エンド・ユーザーがフィールドに収まる数を超えたテキストを入力すると、タイピングの続行に従って一度に1文字ずつテキスト・コンテンツが左にシフトします。

- 複数行入力テキスト・コンポーネントは、任意の高さの矩形としてレンダリングされます。このコンポーネントでは、コンテンツが大きすぎてフィールドの境界内に収まらない場合のスクロールがサポートされています。テキスト領域が一杯になるとテキストの行が上にスクロールし、新しい行のテキストが追加されます。指定された表示領域に表示できる数よりも多くの行がある場合、エンド・ユーザーは上または下にフリックしてテキストの行をスクロールできます。コンポーネント内にスクロールバーが表示されてその領域がスクロール可能であることを示します。

- パスワード・フィールドは入力された各文字を一時的にエコーし、その後、その文字をドットに変換してパスワードを保護します。

- iOSでの入力テキスト・コンポーネントの外観および動作はカスタマイズ可能です(第13.3.1.1項「入力テキスト・コンポーネントのカスタマイズ」を参照)。

13.3.1.1 入力テキスト・コンポーネントのカスタマイズ

MAF AMXは、iOSデバイスでの入力時の先頭大文字化および修正のサポートを提供します。また、フィールドを移動用に使用するか、検索用に使用するかを示すことができます。使用中のオペレーティング・システムとキーボードのバージョンによっては、モバイル・デバイスのソフト・キーパッドの右下にある「return」ボタン(図13-15を参照)の表示が「Go」または「Search」ボタンに変更される場合があります(図13-16を参照)。また、ボタンがアクティブ化されると、単一行入力テキスト・コンポーネントに対して、DataChangeEventがトリガーされます。

図13-15 実行時のiOSデバイスの「Return」ボタン

図13-16 実行時のiOS 7の「Go」および「Search」ボタン

表13-3には、入力テキスト・コンポーネントの属性(そのコンポーネントの外観と動作、および入力テキストによって表されるフィールドへの値の入力に使用するソフト・キーパッドの外観と動作をカスタマイズできるようにする)がリストされています。

表13-3 入力テキスト・コンポーネントの入力カスタマイズ属性

属性

値

説明

keyboardDismiss

- normal: オペレーティング・システムのデフォルトを使用します。

- go: フィールドが動作のトリガーとして動作するよう要求します。

- search: フィールドが参照をトリガーする検索フィールドとして動作するよう要求します。

テキスト・フィールドをどのように使用するかを示します。

goまたはsearchを指定した場合、キーパッドを終了すると入力があいまいになります。

一部のオペレーティング・システムまたはキーボードでは、キーボードへの特別な処理を行う場合があります。それ以外では視覚的な区別が示されないためです。たとえば、単一行入力テキスト・フィールドについては、「return」ボタンが表示されるかわりに、「Go」または「Search」ボタンに置き換えられます。スキンによって、入力フィールドの外観も変更される場合があります。

autoCapitalize

- auto: オペレーティング・システムのデフォルトを使用します。

- sentences: 入力を構成する文の先頭を大文字にすることを要求します。

- none: 入力に先頭大文字化が自動的に適用されないことを要求します。

- words: 入力を構成する単語が大文字で始まることを要求します。

- characters: 入力されたすべての文字が大文字化されることを要求します。

入力テキストによって表されるフィールドの編集中に、iOSによる、値の大文字化に関する特別な処理を要求します。

Androidでは、このプロパティを設定しても影響がないことに注意してください。

autoCorrect

- auto: オペレーティング・システムのデフォルトを使用します。

- on: 入力の自動修正サポートを要求します。

- off: 入力の自動修正を無効にするよう要求します。

入力テキストによって表されるフィールドの編集中に、iOSによる、値の修正に関する特別な処理を要求します。

Androidでは、このプロパティを設定しても影響がないことに注意してください。

iOSによって提供される、デバイス・シミュレータでの自動大文字化および自動修正のサポートは限定的であるため、iOSデバイスでこの機能をテストする必要があります。

13.3.2 入力数値スライダ・コンポーネントの使用方法

入力数値スライダ(inputNumberSlider)コンポーネントは、キーを使用して値を入力するかわりにスライダを使用して値の範囲から数値を選択できるようにします。スライダの溝またはトラックの塗り潰されている部分が、現在の値を視覚的に表しています。

スライダの値を数値的に示すには、出力または入力テキスト・コンポーネントとともに入力数値スライダを使用できます。入力テキスト・コンポーネントではスライダ値を直接入力することもできます。エンド・ユーザーが入力テキスト・フィールドをタップすると、数値モードのキーボードがスライドアップします。このキーボードは、スライドダウン・ボタンを使用するか、スライダ・コンポーネントからタップすることにより消去できます。

入力数値スライダ・コンポーネントは、常に、コンポーネントの定義済範囲内の最大値および最小値を表示します。

注意:
入力数値スライダ・コンポーネントは、正確な数値入力が必要な場合や値の範囲が広い場合(たとえば、0から1000)は使用しないでください。

次の例は、MAF AMXファイルで定義されたinputNumberSlider要素を示しています。

<amx:inputNumberSlider id="slider1" value="#{myBean.count}"/>

図13-17は、「プレビュー」ペインに表示されている入力数値スライダ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputNumberSlider id="inputNumberSlider1"
label="Input Number"
minimum="0"
maximum="20"
stepSize="1"
value="10"/>

図13-17 デザインタイムの入力数値スライダ

入力数値スライダ・コンポーネントに入力される数値の変換を有効にするには、数値の変換コンポーネント(第13.3.26項「数値の変換方法」を参照)を使用します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery。

他のMAF AMX UIコンポーネントと同様に、入力数値スライダ・コンポーネントには通常の状態と選択済状態があります。コンポーネントは、いつでもタッチされたときに選択済状態になります。エンド・ユーザーは、スライダ値を変更するには、タッチしてからスライダ・ボタンを操作します。

入力数値スライダ・コンポーネントには、エンド・ユーザーに追加情報を提供するためにスライダのいずれかの側に表示できるイメージを指すオプションのimageLeftおよびimageRight属性があります。

13.3.3 入力日コンポーネントの使用方法

入力日(inputDate)コンポーネントは、日付を入力するためのポップアップ入力フィールドを提示します。デフォルトの日付フォーマットは、現在のロケールに適切な省略の日付フォーマットです。たとえば、米語(ENU)のデフォルトの書式はmm/dd/yyです。inputType属性によって、コンポーネントが入力として日付、時刻または日時を受け入れるのかどうかが定義されます。タイムゾーンは、モバイル・デバイスに対して構成されているタイムゾーンに依存します。したがって、デバイスに関連しています。実行時、入力日コンポーネントのルック・アンド・フィールはそのデバイスのネイティブのものになります。

次の例は、MAF AMXファイルで定義されたinputDate要素を示しています。このコンポーネントのinputType属性は、デフォルト値のdateに設定されています。value属性が読取り専用の場合、これはEL式またはその他の任意のタイプの値のいずれかに設定でき、value属性が読取り専用でない場合は、EL式としてのみ指定できます。

<amx:inputDate id="inputDate1" label="Input Date" value="#{myBean.date}"/>

詳細は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- W3Cによって定義されているHTML5のグローバル日付と時刻

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.4 出力テキスト・コンポーネントの使用方法

MAF AMXは、テキストを表示するラベルとして使用するために出力テキスト(outputText)コンポーネントを提供しています。

次の例は、MAF AMXファイルで定義されたoutputText要素を示しています。

<amx:outputText id="ot1"
value="output"
styleClass="#{pageFlowScope.pStyleClass}"/>

図13-18は、「プレビュー」ペインに表示されている出力テキスト・コンポーネントを示しています。

図13-18 デザインタイムの出力テキスト

出力テキスト・コンポーネントの数値および日時関連データの変換を容易にするには、数値の変換(第13.3.26項「数値の変換方法」を参照)および日時の変換(第13.3.25項「日時の変換方法」を参照)コンバータを使用します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGalleryおよびUIDemo

13.3.5 ボタンの使用方法

ボタン(commandButton)コンポーネントは、アクション(たとえば、保存、取消し、送信)をトリガーするため、およびアプリケーション内で他のページへのナビゲーション(たとえば、戻る。第13.3.5.7項「戻るボタン・ナビゲーションの有効化」を参照)を有効化するために使用します。

ボタンは、次の方法のいずれかで使用できます。

- テキスト・ラベル付きボタン。

- テキスト・ラベルおよびイメージ・アイコン付きボタン。

注意:
アイコン・イメージと配置(テキスト・ラベルの左または右)を定義できます。

- イメージ・アイコンのみが付いたボタン(たとえば、レコードを追加または削除するための + および - ボタン)。

MAFでは、次の3つの表示領域に対して1つのデフォルト・ボタン・タイプがサポートされています。

1. 最上部ヘッダー・バーに表示されるボタン。MAF AMXページでは、ヘッダーは、ヘッダー、プライマリおよびセカンダリ・ファセットと組み合せたパネル・ページ・コンポーネントによって表され、iPhoneではこれが一般的です(第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- ヘッダー・ファセットには、ページ・タイトルが含まれています。

- プライマリ・アクション・ファセットは、 ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセットは、ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

2. ページのコンテンツ領域に表示されるボタン。

3. ページのフッター・バーに表示されるボタン。MAF AMXページでは、フッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- フッター・ファセットは、コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

どのタイプでも、すべてのボタン・コンポーネントには次の3つの状態があります。

1. 標準。

2. アクティブ: ボタンがエンド・ユーザーによってタップまたはタッチされたときの外観を表します。ボタンがタップされた(タッチされてリリースされた)ときに、ボタン・アクションが実行されます。タッチしたときにアクティブ化された外観が表示され、リリースしたときにアクションが実行されます。エンド・ユーザーがボタンにタッチした後、指をドラッグしてボタンから離した場合、アクションは実行されません。ただし、ボタンにタッチしている間中、アクティブ化された外観が表示されます。

3. 無効。

ボタン・コンポーネントの外観は、adfmf-commandButton-<style>に設定したそのstyleClass属性によって定義されます。表13-4に示すどのスタイルでも、MAF AMXページ内の有効な任意の場所に配置されているボタンに適用できます。

表13-4 主なボタン・スタイル

ボタン・スタイル名

説明

デフォルト

次の場所に配置されているボタンのデフォルト・スタイル

- いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)内。詳細は、第13.3.5.1項「デフォルト・スタイル・ボタンの表示」を参照してください

- MAF AMXページのコンテンツ領域内の任意の場所。このスタイルは、ページ内のボタンの場所またはコンテキストに基づいてそのページ内で特定のアクションを実行するためのボタンに対して使用されます。

戻る

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)に配置されるボタンの戻るスタイル。このスタイルを、デフォルト・ボタンに適用すると、ページに戻るという外観を表示できます。このボタン・スタイルは、Springboardに戻るまたはページに戻るボタンによく使用されます。

詳細は、第13.3.5.2項「戻るスタイル・ボタンの表示」を参照してください

強調表示

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)またはMAF AMXページのコンテンツ領域に配置されるボタンの強調表示スタイル。このスタイルをボタンに追加すると、保存(または完了)ボタンで一般的なiPhoneボタンの外観を提供できます。

詳細は、第13.3.5.3項「強調表示スタイル・ボタンの表示」を参照してください

アラート

アラート・スタイルは削除の外観をボタンに追加します。詳細は、第13.3.5.4項「アラート・スタイル・ボタンの表示」を参照してください

ボタンに適用して太い角丸の境界線でボタンを修飾できる角丸スタイル(adfmf-commandButton-rounded)があります(図13-19を参照)。このスタイルは他のどのようなスタイルとも組み合せて定義できます。

図13-19 デザインタイムの角丸ボタン

MAF AMXでは、追加の装飾スタイルがいくつか提供されています(第13.3.5.5項「追加のボタン・スタイルの使用方法」を参照)。

MAF AMXにおけるボタン・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第13.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

13.3.5.1 デフォルト・スタイル・ボタンの表示

パネル・ページ・ファセットまたはコンテンツ領域内に配置できる、次のような様々なタイプのデフォルト・スタイル・ボタンがあります。

- テキスト・ラベルのみが示される標準、アクティブまたは無効ボタン

- イメージ・アイコンのみが示される標準、アクティブまたは無効ボタン

次の例は、MAF AMXファイルで宣言されたcommandButton要素を示しています。この要素は、テキスト・ラベルの付いたデフォルトのボタンを表します。

<amx:panelPage id="pp1">
<amx:facet name="primary">
<amx:commandButton id="cb1"
text="Cancel"
action="cancel"
actionListener="#{myBean.rollback}"/>
</amx:facet>
</amx:panelPage>

次の例も、MAF AMXファイルで宣言されたcommandButton要素を示しています。この要素は、イメージ・アイコンの付いたデフォルトのボタンを表します。

<amx:panelPage id="pp1">
<amx:facet name="primary">
<amx:commandButton id="cb1"
icon="plus.png"
action="add"
actionListener="#{myBean.AddItem}"/>
</amx:facet>
</amx:panelPage>

次の例は、パネル・ページのフッター・ファセット内で宣言されているcommandButton要素を示しています。この要素は、テキスト・ラベルとイメージ・アイコンの付いたデフォルトのボタンを表します。

<amx:panelPage id="pp1">
<amx:facet name="footer">
<amx:commandButton id="cb2"
icon="folder.png"
text="Move (#{myBean.mailcount})"
action="move"/>
</amx:facet>
</amx:panelPage>

次の例は、パネル・ページのコンテンツ領域の一部で宣言されているcommandButton要素を示しています。この要素は、テキスト・ラベルの付いたデフォルトのボタンを表します。

<amx:panelPage id="pp1">
<amx:commandButton id="cb1"
text="Reply"
actionListener="#{myBean.share}"/>
</amx:panelPage>

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.5.2 戻るスタイル・ボタンの表示

パネル・ページ・ファセットまたはコンテンツ領域内に配置される、次のような様々なタイプの戻るスタイル・ボタンがあります。

- テキスト・ラベルのみが示される標準、アクティブまたは無効ボタン

- イメージ・アイコンのみが示される標準、アクティブまたは無効ボタン

次の例は、MAF AMXファイルで宣言されたcommandButton要素を示しています。この要素は、テキスト・ラベルの付いた戻るボタンを表します。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="Details" id="ot1"/>
</amx:facet>
<amx:facet name="primary">
<amx:commandButton id="cb1"
text="Back"
action="__back"/>
</amx:facet>
...
</amx:panelPage>

プライマリ・ファセット内にボタン・コンポーネント配置し、そのaction属性を__backに設定した場合は常に、図13-20のように、MAF AMXによって戻る矢印スタイリングがそれに自動的に適用されます。

図13-20 デザインタイムの戻るボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.5.3 強調表示スタイル・ボタンの表示

他のタイプのボタンと同様に、パネル・ページ・ファセットまたはコンテンツ領域内に配置される強調表示スタイル・ボタンは、標準、アクティブまたは無効の状態を取ることができます。

次の例は、MAF AMXファイルで宣言されたcommandButton要素を示しています。この要素は、テキスト・ラベルの付いたハイライト表示ボタンを表します。

<amx:panelPage id="pp1">
<amx:facet name="secondary">
<amx:commandButton id="cb2"
text="Save"
action="save"
styleClass="adfmf-commandButton-highlight"/>
</amx:facet>
</amx:panelPage>

図13-21 デザインタイムの強調表示ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.5.4 アラート・スタイル・ボタンの表示

パネル・ページ内に配置されるアラート・スタイル・ボタンは、標準、アクティブまたは無効の状態を取ることができます。

次の例は、MAF AMXファイルで宣言されたcommandButton要素を示しています。この要素は、テキスト・ラベルの付いたアラート・ボタンを表します。

<amx:commandButton id="cb1"
text="Delete"
actionListener="#{myBean.delete}"
styleClass="adfmf-commandButton-alert" />

図13-22 デザインタイムのアラート・ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.5.5 追加のボタン・スタイルの使用方法

MAF AMXでは、次の追加のボタン・スタイルが提供されます。

- 暗いスタイル

- 明るいスタイル

- 小さいスタイル

- 大きいスタイル

- 強調表示スタイル

- 確認スタイル

- 代替スタイルの2つのバリエーション

図13-23 追加のボタン・スタイル

13.3.5.6 アプリケーション内でのボタンの使用方法

MAFアプリケーションでは、次のコンテキスト内でボタン・コンポーネントを使用できます。

- ナビゲーション・バー

- 特定のアクションを実行するためのコンテンツ領域

- アクション・シート

- ポップスタイル・アラート・メッセージ

13.3.5.6.1 ナビゲーション・バー

MAFでは、ナビゲーション・バーで使用する標準ボタンを作成できます。

- 編集ボタンで、エンド・ユーザーは編集またはコンテンツ操作モードに入ることができます。

- 取消ボタンで、エンド・ユーザーは、変更を保存することなく編集またはコンテンツ操作モードを終了できます。

- 保存ボタンで、エンド・ユーザーは、変更を保存して編集またはコンテンツ操作モードを終了できます。

- 完了ボタンで、エンド・ユーザーは、変更があれば保存して現在のモードを終了できます。

- 元に戻すボタンで、エンド・ユーザーは最後のアクションを元に戻すことができます。

- やり直しボタンで、エンド・ユーザーは最後の元に戻したアクションをやり直すことができます。

- 戻るボタンで、エンド・ユーザーはSpringboardに戻ることができます。

- ページに戻るボタンで、エンド・ユーザーはボタン・テキスト・ラベルによって識別されるページに戻ることができます。

- 追加ボタンで、エンド・ユーザーは新しいオブジェクトを追加または作成できます。

13.3.5.6.2 コンテンツ領域

ページのコンテンツ領域内に配置されたボタンは、そのページ内のボタンの場所およびコンテキストに指定されている特定のアクションを実行します。これらのボタンは、ナビゲーション・バーに配置されているボタンとは異なる外観を持っている場合があります。

13.3.5.6.3 アクション・シート

アクション・シート内に配置されるボタンの例は、ノートの削除ボタンおよび取消ボタンのグループです。

アクション・シート・ボタンは画面の幅まで拡大されます。

13.3.5.6.4 アラート・メッセージ

OKボタンは、パスワード入力の失敗後のログイン検証など、検証メッセージ内に配置できます。

13.3.5.7 戻るボタン・ナビゲーションの有効化

MAF AMXでは、前に訪問したページに戻るデフォルト動作を持つ戻るボタンを使用した移動がサポートされています。詳細は、第12.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

__backナビゲーションを備えたパネル・ページのプライマリ・ファセットにボタン・コンポーネントを追加すると、そのボタンには、戻る矢印の視覚的スタイリングが自動的に設定されます(第13.3.5.2項「戻るスタイル・ボタンの表示」を参照)。スタイル設定を無効にするには、styleClass属性をamx-commandButton-normalに設定します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.5.8 操作と属性の処理順序に関する必知事項

ボタン、リンク、リスト・アイテムなどのコンポーネントがアクティブになっている場合に、MAF AMXによって操作および属性が処理される順序は、次のとおりです。

1. 次の子操作は、XMLファイルに表示される順序で処理されます。

- プロパティ・リスナーの設定

- アクション・リスナー

- ポップアップ表示動作

- ポップアップを閉じる動作

2. アクション・リスナー(actionListener)属性が処理されて関連付けられたJavaメソッドが起動されます。

3. アクション(action)属性が処理されて、ナビゲーション・ケースがあればそれに従います。

13.3.6 リンクの使用方法

リンク(commandLink)コンポーネントは、アクションをトリガーするためおよび他のビューへのナビゲーションを有効化するために使用します。

リンク・コンポーネントは、その子として任意のタイプのコンポーネントを定義できます。プロパティ・リスナーの設定(第13.3.23項「プロパティ・リスナーの設定の使用方法」を参照)、アクション・リスナー(第13.3.22項「アクション・リスナーの使用方法」を参照)、ポップアップ表示動作、ポップアップを閉じる動作(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)および検証動作(第13.9項「入力の検証」を参照)などのコンポーネントをリンク・コンポーネントの子として使用することで、クリックおよびジェスチャーを実行できるアクション可能な領域を作成できます。

リンク内にイメージ・コンポーネントを配置することで(第13.3.7項「イメージの表示方法」を参照)、クリック可能イメージを作成できます。

次の例は、MAF AMXファイルで宣言された基本的なcommandLink要素を示しています。

<amx:commandLink id="cl1"
text="linked"
action="gotolink"
actionListener="#{myBean.doSomething}"/>

図13-24は、「プレビュー」ペインに表示されている基本的なリンク・コンポーネントを示しています。

図13-24 デザインタイムのリンク

次の例は、MAF AMXファイルで宣言されたcommandLink要素を示しています。このコンポーネントはpanelFormLayoutおよびpanelLabelAndMessageコンポーネント内に配置されます。

<amx:panelPage id="pp1">
<amx:panelFormLayout id="form">
<amx:panelLabelAndMessage id="panelLabelAndMessage1" label="Label">
<amx:commandLink id="cl1"
text="linked"
action="gotolink"
actionListener="#{myBean.doSomething}"/>
</amx:panelLabelAndMessage>
</amx:panelFormLayout>
</amx:panelPage>

図13-25は、フォーム内に配置され、「プレビュー」ペインに表示されているリンク・コンポーネントを示しています。

図13-25 デザインタイムのフォーム内リンク

MAF AMXにおけるリンク・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第13.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

MAF AMXでは、リンクに類似しているが、ページ間のナビゲーションは許可されない別のコンポーネントであるリンク(実行) (goLink)コンポーネントが提供されています。このコンポーネントを使用して、外部ページへのリンクを有効化できます。図13-26は、「プレビュー」ペインに表示されているリンク(実行)コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:goLink id="goLink1"
text="Go Link"
url="http://example.com"/>

図13-26 デザインタイムのリンク(実行)

イメージは、リンク(実行)コンポーネントの子として指定できる唯一のコンポーネントです。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.7 イメージの表示方法

MAF AMXでは、ビットマップによって表されるイメージ(image)コンポーネントを使用してiOSおよびAndroidデバイス上にイメージを表示できます。

ボタンおよびリスト・ビューにイメージを配置するだけでなく、それをリンク・コンポーネント内に配置して(第13.3.6項「リンクの使用方法」を参照)クリック可能イメージを作成できます。

次の例は、MAF AMXファイルのimage要素定義を示しています。

<amx:image id="i1"
styleClass="prod-thumb"
source="images/img-big-#{pageFlowScope.product.uid}.png" />

イメージ・ファイルのURIに加えて、ソースには、REST Webサービスからロードされたイメージに必要なbase 64でエンコードされたイメージ・データを含めることができます。data:image/gif;base64,接頭辞を使用して、このようなイメージのソースを定義し、image要素のsource属性を次のように設定します。

<amx:image id="i2" source="data:image/gif;base64,#{row.ImageBase64}" />

GIFファイルに提供される値は、イメージ・タイプによって異なります。

Androidプラットフォームでサポートされているフォーマットは次のとおりです。

- GIF

- JPEG

- PNG

- BMP

iOSプラットフォームでサポートされているフォーマットは次のとおりです。

- PNG

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGalleryおよびUIDemo

13.3.8 チェックボックス・コンポーネントの使用方法

チェックボックス(selectBooleanCheckbox)コンポーネントは、trueまたはfalseの値からの単一選択(選択済状態と選択解除状態の間で切り替えできる)を可能にするために作成するチェックボックスを表します。

チェックボックス・コンポーネントのlabel属性を使用するとチェックボックスの左側にテキストを配置でき、text属性を使用すると右側にテキストを配置できます。

次の例は、MAF AMXファイルで宣言されたselectBooleanCheckbox要素を示しています。

<amx:selectBooleanCheckbox id="check1"
label="Agree to the terms:"
value="#{myBean.bool1}"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-27は、「プレビュー」ペインに表示される選択解除されたチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="false"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-27 デザインタイムの選択解除されたチェックボックス

「プレビュー」ペインに表示される選択済のチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="true"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-28 選択済のチェックボックスの定義

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.8.1 iOSプラットフォームでのチェックボックス・コンポーネントのサポート

iOSでは、ネイティブ・チェックボックス・コンポーネントはサポートされていません。ブール・スイッチは、通常、プロパティ・ページで使用され、ブール選択を可能にします(第13.3.12項「ブール・スイッチ・コンポーネントの使用方法」を参照)。

13.3.8.2 Androidプラットフォームでのチェックボックス・コンポーネントのサポート

Androidでは、ネイティブ・チェックボックス・コンポーネントがサポートされています。このコンポーネントは、設定ページで広く使用され、個々の設定値のオンとオフを切り替えます。

13.3.9 チェックボックスを複数選択コンポーネントの使用方法

チェックボックスを複数選択(selectManyCheckbox)コンポーネントは、trueまたはfalseの値の複数選択を可能にするために使用するチェックボックスのグループを表します。これにより、グループ内の各チェックボックスの選択済と選択解除の切替えが可能になります。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
チェックボックスを複数選択コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

次の例は、MAF AMXファイルで宣言されたselectManyCheckbox要素を示しています。

<amx:selectManyCheckbox id="selectManyCheckbox1"
label="Select shipping options"
value="#{myBean.shipping}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1"
label="Air"
value="#{myBean.shipping.air}"/>
<amx:selectItem id="selectItem2"
label="Rail"
value="#{myBean.shipping.rail}"/>
<amx:selectItem id="selectItem3"
label="Water"
value="#{myBean.shipping.water}"/>
</amx:selectManyCheckbox>

図13-29は、「プレビュー」ペインに表示されているチェックボックスを複数選択コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectManyCheckbox id="selectManyCheckbox1"
label="Select Many Checkbox"
value="value2"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Selection 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Selection 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Selection 3" value="value3"/>
</amx:selectManyCheckbox>

図13-29 デザインタイムのチェックボックスを複数選択

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.9.1 チェックボックスを複数選択コンポーネントとユーザーとの対話に関する必知事項

MAF AMXでは、チェックボックスを複数選択コンポーネントを表示するための2つの代替方法が提供されています。ポップアップ・スタイル(デフォルト)とリスト・スタイル(使用可能な選択肢の数がデバイスの画面サイズを超えている場合に使用される)です。

iPhoneとiPadの両方でのポップアップスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストがポップアップに表示されます。選択を行うには、エンド・ユーザーは1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーはポップアップの外をタップするか、閉じるボタン( x )を使用してポップアップを閉じます。

ポップアップを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

選択肢の数がデバイスのサイズを超える場合、スクロール可能なリスト・ビュー(第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)を含むフルページ・ポップアップが生成されます。

iPhoneとiPadの両方でのリストスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照し、1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーは閉じるボタン( x )をタップします。

リストを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

注意:
どちらの場合も、選択を取り消すメカニズムは提供されていません。

13.3.10 選択肢コンポーネントの使用方法

選択肢(selectOneChoice)コンポーネントは、リストからの単一の値の選択を可能にするために使用するコンボ・ボックスを表します。この選択メカニズムは、選択肢コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
選択肢コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

次の例は、MAF AMXファイルのselectOneChoice要素の定義をselectItemsサブ要素とともに示しています。

<amx:selectOneChoice id="choice1"
label="Your state:"
value="#{myBean.myState}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Alaska" value="AK"/>
<amx:selectItem id="selectItem2" label="Alabama" value="AL"/>
<amx:selectItem id="selectItem3" label="California" value="CA"/>
<amx:selectItem id="selectItem4" label="Connecticut" value="CT"/>
</amx:selectOneChoice>

<amx:selectOneChoice id="choice1"
label="Your state:"
value="#{myBean.myState}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItems id="selectItems1" value="myBean.allStates"/>
</amx:selectOneChoice>

図13-30は、「プレビュー」ペインに表示されている選択肢コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneChoice id="selectOneChoice1"
label="Choice"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneChoice>

図13-30 デザインタイムの選択肢

selectOneChoice要素の初期値はnullにできません。かわりに、選択肢を1つ選択コンポーネントに表示された値に設定する必要があります。これを行うには、必ず、モデル(Beanまたはバインディング)の値を、JDeveloperのデザインタイムで表示されるデフォルト値と同一にする必要があります。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.10.1 iOSプラットフォームでの選択肢コンポーネントとユーザーとの対話に関する必知事項

MAF AMXでは、選択肢コンポーネントを表示するため、ポップアップ・スタイルとドロップダウン・スタイルの2つの代替方法が提供されています。

iPhoneでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、選択肢のリストが、デフォルトで最初のオプションが選択された状態で表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照します。選択内容を保存するには、エンド・ユーザーはツール・バーの「終了」をタップします。

iPadでは、ユーザーの対話は、次の点を除いてiPhoneにおける対話と同様です。

- 選択のリストは、ポップアップ・ダイアログに表示されます。

- iPadのスタイリングが選択のリストの周囲に実装され、リストのソースを示すためにノッチが使用されます。

アイテムを選択しないで選択のリストを閉じるには、エンド・ユーザーはポップアップ・ダイアログの外をタップする必要があります。

注意:
選択のリストおよびツール・バーを表示するためのUIは、ブラウザにネイティブであり、CSSを使用してスタイリングすることはできません。

選択肢コンポーネント内のリスト値は、無効として表示できます。

選択肢の数がデバイスの表示サイズを超える場合、ネイティブな方法でスクロール可能なリスト・ページが生成されます。

13.3.10.2 Androidプラットフォームでの選択肢コンポーネントとユーザーとの対話に関する必知事項

Androidデバイスでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、ポップアップ・ダイアログ形式の選択肢のリストが表示されます。選択肢の数がデバイスのサイズ内に収まる場合は単純なポップアップが表示されます。この場合次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- ポップアップの外で1回タップするか戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

表示される選択肢の数がデバイス・サイズ内に収まらない場合は、ポップアップにスクロール可能リストが含まれます。その場合は次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- 戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

13.3.10.3 アイテムの選択コンポーネントの違いに関する必知事項

アイテムの選択(selectItems)コンポーネントは、複数選択コンポーネントおよび単一選択コンポーネントの両方で選択できるオブジェクトのリストを提供します。

アイテムの選択(selectItem)コンポーネントは、選択コンポーネントの単一選択可能なアイテムを表します。

13.3.11 選択肢を複数選択コンポーネントの使用方法

選択肢を複数選択(selectManyChoice)コンポーネントは、リストの複数の値の選択を可能にします。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
チェックボックスを複数選択コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

次の例は、MAF AMXファイルで宣言されたselectManyChoice要素を示しています。このコンポーネントは、アイテムの選択(selectItem)コンポーネントを子として使用します。

<amx:selectManyChoice id="check1"
label="Select Option:"
value="#{myBean.shipping}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1"
label="Signature Required"
value="signature" />
<amx:selectItem id="selectItem2"
label="Insurance"
value="insurance" />
<amx:selectItem id="selectItem3"
label="Delivery Confirmation"
value="deliveryconfirm"/>
</amx:selectManyChoice>

図13-31 デザインタイムの選択肢を複数選択

<amx:selectManyChoice id="check1"
label="Select Shipping Options:"
value="#{myBean.shipping}">
<amx:selectItems id="selectItems1" value="#{myBean.shippingOptions}"/>
</amx:selectManyChoice>

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

すべてのサポートされているデバイス上の選択肢を複数選択コンポーネントの外観と動作は、チェックボックスを複数選択コンポーネントとほとんど同一です(詳細は、第13.3.9項「チェックボックスを複数選択コンポーネントの使用方法」を参照してください)。

13.3.12 ブール・スイッチ・コンポーネントの使用方法

ブール・スイッチ(selectBooleanSwitch)コンポーネントは、チェックボックスのかわりのスイッチ・メタファーとしてのブール値の編集を可能にします。

他のMAF AMX UIコンポーネントと同様に、このコンポーネントには標準および選択済の状態があります。値を切り替えるには、エンド・ユーザーはスイッチを1回タップ(タッチしてリリース)します。タップするたびにスイッチが切り替わります。

次の例は、MAF AMXファイルで定義されたselectBooleanSwitch要素を示しています。

<amx:selectBooleanSwitch id="switch1"
label="Flip switch:"
onLabel="On"
offLabel="Off"
value="#{myBean.bool1}"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-32は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanSwitch id="selectBooleanSwitch1"
label="Switch"
value="value1"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-32 デザインタイムのブール・スイッチ

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.12.1 iOSプラットフォームでのブール・スイッチ・コンポーネントのサポートに関する必知事項

iOSでは、プール・スイッチ・コンポーネントは、属性値を有効化または無効化するために設定ページでよく使用されます。

13.3.12.2 Androidプラットフォームでのブール・スイッチ・コンポーネントのサポートに関する必知事項

Androidプラットフォームでは、ブール・スイッチ・コンポーネントは直接サポートされていません。かわりに、Androidでは、タップすると選択済状態と選択解除状態が切り替わるトグル・ボタンが提供されています。

13.3.13 選択ボタン・コンポーネントの使用方法

選択ボタン(selectOneButton)コンポーネントは、常に1つのボタンがアクティブになっている、アクションをリストするボタン・グループを表します。この選択メカニズムは、選択ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
選択ボタン・コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

次の例は、MAF AMXファイルで定義されたselectOneButton要素を示しています。

<amx:selectOneButton id="bg1"
value="#{myBean.myState}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Yes" value="yes"/>
<amx:selectItem id="selectItem2" label="No" value="no"/>
<amx:selectItem id="selectItem3" label="Maybe" value="maybe"/>
</amx:selectOneButton>

図13-33は、「プレビュー」ペインに表示されている選択ボタン・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneButton id="selectOneButton1"
label="Select Button"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneButton>

図13-33 デザインタイムの選択ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.14 ラジオ・ボタン・コンポーネントの使用方法

ラジオ・ボタン(selectOneRadio)コンポーネントは、使用可能な選択肢をリストするラジオ・ボタンのグループを表します。この選択メカニズムは、ラジオ・ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
ラジオ・ボタン・コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

次の例は、MAF AMXファイルのselectOneRadio要素定義を示しています。このコンポーネントは、アイテムの選択(selectItems)コンポーネントをその子として使用します。

<amx:selectOneRadio id="radio1"
label="Choose a pet:"
value="#{myBean.myPet}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Cat" value="cat"/>
<amx:selectItem id="selectItem2" label="Dog" value="dog"/>
<amx:selectItem id="selectItem3" label="Hamster" value="hamster"/>
<amx:selectItem id="selectItem4" label="Lizard" value="lizard"/>
</amx:selectOneRadio>

次の例も、MAF AMXファイルのselectOneRadio要素定義を示しています。このコンポーネントは、アイテムの選択(selectItems)コンポーネントをその子として使用します。

<amx:selectOneRadio id="radio1"
label="Choose a pet:"
value="#{myBean.myPet}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItems id="selectItems1" value="myBean.allPets"/>
</amx:selectOneRadio>

図13-34は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneRadio id="selectOneRadio1"
label="Radio Button"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneRadio>

図13-34 デザインタイムのラジオ・ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.15 リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法

リスト・ビュー(listView)・コンポーネントを使用して、エンド・ユーザーが1つのオプションを選択できる選択肢のリストとしてデータを表示します。

通常、リスト・アイテム(listItem)・コンポーネントは、リスト・ビュー・コンポーネント内の1つのアイテムを表しており、リスト・アイテム・コンポーネントをリスト・ビュー内に配置して、データ・アイテムのリストのレイアウト設定またはスタイル設定をします。各アイテムは複数のリスト・アイテム・コンポーネントを含むことができ、この場合、リスト・アイテム・コンポーネントはアイテム(行)を満たし、過剰なリスト・アイテム・コンポーネントは後続行に折り返します。これを構成するには、リスト・ビューのlayout属性をcardsに設定します(デフォルトのレイアウトはrowsであり、リスト内の1つのアイテム当たり1つのリスト・アイテム・コンポーネントが表示されます)。詳細は、第13.3.15.4項「リスト・ビュー・レイアウトの構成」を参照してください。

リスト・ビューによって、次のうち1つを定義できます。

- リスト(コレクション)内のアイテム数に基づいてレプリケートされる選択可能なアイテム。

- リスト・ビューのvar属性およびvalue属性を指定することなく子リスト・アイテム・コンポーネントを追加することによって生成される静的アイテム。これらの静的アイテムは必要な数を追加できます。これは、設計時にリストのコンテンツがわかっている場合に便利です。この場合、リストは編集可能ではなく、メニュー・アイテムのセットのように動作します。

リスト・アイテム・コンポーネントは、実行時にスワイプ・ジェスチャーに応答します(第13.4項「ジェスチャーの有効化」を参照)。

次のタイプのリスト・ビュー・コンポーネントを作成できます。

- 基本リスト
次の例は、MAF AMXファイルで定義されたlistView要素を示しています。この定義は、基本コンポーネントに対応しています。

<amx:listView id="listView1"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="listItem1">
<amx:outputText id="outputText1" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem2">
<amx:outputText id="outputText3" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem3">
<amx:outputText id="outputText5" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem4">
<amx:outputText id="outputText7"
value="This is really long text to test how it is handled"/>
</amx:listItem>
</amx:listView>

図13-35は、デザインタイムの基本リスト・ビュー・コンポーネントを示しています。

図13-35 デザインタイムの基本リスト・ビュー

次の例は、MAF AMXファイルでのlistView要素の別の定義を示しています。この定義も基本コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

<amx:listView id="list1"
value="#{myBean.listCollection}"
var="row"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem actionListener="#{myBean.selectRow}"
showLinkIcon="false"
id="listItem1">
<amx:outputText value="#{row.name}" id="outputText1"/>
</amx:listItem>
</amx:listView>

注意:
現在は、リスト・アイテム内の出力テキストに含まれるテキスト文字列が長すぎて1行に収まらない場合、そのテキストは行の端で折り返されません。この動作を回避するには、件名の出力テキスト子コンポーネントのinlineStyle属性に、"white-space: normal;"を追加します。

- アイコン付きリスト
次の例は、MAF AMXファイルで定義されたlistView要素を示しています。この定義は、アイコン付きコンポーネントに対応しています。

<amx:listView id="list1"
value="#{myBean.listCollection}"
var="row"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="listItem1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf11" width="40px" halign="center">
<amx:image id="image1" source="#{row.image}"/>
</amx:cellFormat>
<amx:cellFormat id="cf12" width="100%" height="43px">
<amx:outputText id="outputText1" value="#{row.desc}"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図13-36は、デザインタイムのアイコンおよびテキスト付きリスト・ビュー・コンポーネントを示しています。

図13-36 デザインタイムのアイコン付きリスト・ビュー

- 検索付きリスト

- 区切り付きリスト。このタイプのリストでは、データをグループ化して順序を示すことができます。リスト・ビュー・コンポーネントの属性によって、各区切りの特性が定義されます。属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。
MAF AMXでは、次のことを実行できるリスト区切りが提供されています。

- そのコンテンツを個別に閉じます。

- 各区切り内のアイテム数を表示します。

- 同時に閉じます。

次の例は、MAF AMXファイルで定義されたlistView要素を示しています。この定義は、折りたたみ可能な区切りおよびアイテム数付きのコンポーネントに対応しています。

<amx:listView id="list1"
value="#{bindings.data.collectionModel}"
var="row"
collapsibleDividers="true"
collapsedDividers="#{pageFlowScope.mylistDisclosedDividers}"
dividerMode="all"
dividerAttribute="type"
showDividerCount="true"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
fetchSize="10">
<amx:listItem>
<amx:outputText id="ot1" value="#{row.name}">
</amx:listItem>
</amx:listView>

注意:
区切り付きリストでは、受け取ったデータがすでにソートされていることを想定し、データをソートしないため、このリストのデータはdividerAttributeによってソートする必要があります。

注意:
リスト・ビュー・コンポーネントが編集モードになっている(つまり、そのeditMode属性が指定されている)場合、区切りは表示されません。

区切りが表示されている場合、エンド・ユーザーは、dividerMode属性がfirstLetterに設定されているリスト・ビュー・コンポーネントで使用できる、リスト・ビューのローカライズ済アルファベット順索引ユーティリティを使用して、特定の区切りにすばやく移動できます。sectionIndex属性をoffに設定すると、このユーティリティを無効にできます。

索引ユーティリティ(インデクサ)は索引バーおよび索引アイテムで構成され、次の特徴があります。

- リストに未ソートのデータまたは重複する区切りが含まれている場合、索引アイテムはリスト内で最初にあるものを指します。

- 使用可能な文字は索引で強調表示されているもののみで、強調表示されている文字のみがアクティブになります。これは、データ・モデルの変更(たとえば、エンド・ユーザーが「次へ」行アイテムをタップした場合)によってトリガーされます。

- 索引では大/小文字は区別されません。

- 不明な文字はハッシュ( # )記号で隠されます。

インデクサ文字は、リストにロード済の行でのみアクティブ化(タップ)できます。たとえば、リスト・ビューでfetchSize属性を使用して文字Cまでの行をロードしている場合は、AからCまでの文字がインデクサによって有効化されます。その他の文字は、インデクサにさらに行がロードされると表示されるようになります。

表13-5は、索引ユーティリティに定義できるスタイルを示しています。

表13-5 リスト・ビューの索引スタイル

styleClass名

説明

adfmf-listView-index

索引バーのスタイルを定義します。

adfmf-listView-indexItem

索引バーの1つのアイテムのスタイルを定義します。

adfmf-listView-indexItem-active

関連する区切りへのリンクを持つ索引バーのアイテムのスタイルを定義します。

adfmf-listView-indexCharacter

索引バーの文字のスタイルを定義します。

adfmf-listView-indexBullet

索引バーの2つの文字間の黒丸のスタイルを定義します。

adfmf-listView-indexOther

索引バーのすべての不明文字を表す文字のスタイルを定義します。

区切りが表示されているリスト・ビュー・コンポーネントがスクロールを提供するコンテナとして機能し、スクロール対象となった場合、区切りはビューの上部に固定されます。この場合は、リスト・ビュー・コンポーネントの高さを明示的に設定する必要があります。その他のすべての場合で、リスト・ビュー自体ではスクロールを実行せず、かわりに親コンテナ(パネル・ページなど)のスクロールを使用する場合は、リスト・ビューに高さの制約は設定されず、その子コンポーネントによって高さが決定されます。明確な高さの制約がないことにより、実質的に、アニメーション化された遷移および区切りの固定が無効になります。

- 凹枠リスト
次の例は、MAF AMXファイルで定義されたlistView要素を示しています。この定義は、凹枠コンポーネントに対応しています。

<amx:listView id="listView1"
styleClass="adfmf-listView-insetList"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="listItem1">
<amx:outputText id="outputText1" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem2">
<amx:outputText id="outputText3" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem3">
<amx:outputText id="outputText5" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem4">
<amx:outputText id="outputText7"
value="This is really long text to test how it is handled"/>
</amx:listItem>
</amx:listView>

図13-37は、デザインタイムの凹枠リスト・ビュー・コンポーネントを示しています。

図13-37 デザインタイムの凹枠リスト・ビュー

次の例は、MAF AMXファイルでのlistView要素の別の定義を示しています。この定義も凹枠コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

<amx:listView id="list1"
value="#{CarBean.carCollection}"
var="row"
styleClass="adfmf-listView-insetList"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
fetchSize="10">
<amx:listItem id="li1" action="go">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:listItem>
</amx:listView>

MAF AMXにおけるリスト・アイテム・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第13.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

他のMAF AMXコンポーネントとは異なり、リスト・ビューをMAF AMXページにドラッグ・アンド・ドロップすると、「ListViewギャラリ」というダイアログが表示されます(図13-38を参照)。このダイアログでリスト・ビューに対して特定のレイアウトを選択できます。

図13-38 「ListViewギャラリ」ダイアログ

表13-6は、「ListViewギャラリ」に表示される、サポートされるリスト・フォーマットを示しています。

表13-6 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」(図13-38を参照)は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表(図13-39を参照)に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルトの「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプション(図13-38を参照)では、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログ(図13-39を参照)の状態は変更されません。影響するのは、生成されるMAF AMXマークアップのみです。

- 凹枠リストのあるスタイルを選択すると、生成されたMAF AMXマークアップのlistView要素にadfmf-listView-insetListスタイル・クラスが設定されます。

次に、凹枠リストのあるシンプル・フォーマットの例を示します。

<amx:listView var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
styleClass="adfmf-listView-insetList"
id="listView2"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="li2">
<amx:outputText value="#{row.employeename}" id="ot3"/>
</amx:listItem>
</amx:listView>

「ListViewギャラリ」の「説明」ペインは、現在選択されているバリエーションに基づいて更新されます。フォーマットには、メイン・スタイルの簡単な説明が示され、その後に選択したバリエーションの詳細が続きます。4つのメイン・スタイルに、それぞれ4つのバリエーションがあり、表13-7に示す16の固有の説明が提供されています。

表13-7 リスト・ビューのバリエーションとスタイル

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドがリスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドがリスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「ListViewギャラリ」で選択し、「OK」をクリックすると、リスト・ビューの編集ウィザードが起動されます。それを使用して、リスト・アイテム子コンポーネントに静的テキストを表示するバインドなしリスト・ビュー・コンポーネント(図13-39を参照)を作成するか、または動的バインディングのデータソースを選択(図13-40を参照)できます。

図13-39 バインドなしリスト・ビューの作成

図13-39に示すダイアログに入力する際は、次の点を考慮してください。

- 「リスト・データ・コレクション」および「要素タイプ」フィールドは、「データのバインド」チェックボックスが選択解除された状態のときは無効化されています。

- 左側にあるイメージは、選択されているリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映しています。

- 「値」列の編集可能セルには、静的テキスト文字列が移入されます(表13-8を参照)。

- 「リスト・アイテム・コンテンツ」セルにイメージが含まれている場合、「値」セルはデフォルトで<add path to your image>文字列になります。この場合、それをイメージのパスに置き換える必要があります。

- 「リスト・アイテム選択」は選択モードを示します。詳細は、図12-79「MAF AMXリスト・ビューの編集ダイアログ」でこのオプションの説明を参照してください。

- リスト・ビューに、データがバインドされているのではなく、リスト・アイテム子コンポーネントが含まれている場合、区切り属性を設定できないため、「区切り属性」と「区切りモード」の両方のフィールドは無効化されています。

表13-8 リスト・ビューの静的テキスト文字列

リスト・フォーマット

要素行の値

出力テキストの値

シンプル

- テキスト

- 'ListItem Text'

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

- 'Main Text'

- 'This is the subordinate text.'

開始-終了

- 開始テキスト

- 終了テキスト

- 'Start Text'

- 'End Text'

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

- 'Upper Start Text'

- 'Upper End Text'

- 'Lower Start Text'

- 'Lower End Text'

図13-40は、リスト・ビュー・コンポーネントをデータにバインドすることを選択した場合の「リスト・ビューの作成」ダイアログを示しています。

図13-40 バインド済リスト・ビューの作成

図13-40に示すダイアログに入力する際は、次の点を考慮してください。

- 「データのバインド」チェックボックスを選択した場合、「リスト・データ・コレクション」フィールドが有効になります。「要素タイプ」フィールドは、式ビルダーを使用して「リスト・データ・コレクション」フィールドをEL式に設定すると有効になります。「DataControl定義」タブからデータ・コントロールを選択すると、「要素タイプ」フィールドは無効なままになります。

- データソースを選択するには、「参照」をクリックします。これによって「リスト・ビュー・データ・コレクションの選択」ダイアログが開きます。そこで、データ・コントロール定義を選択するか(図13-41を参照)、ELビルダーを使用して適切なEL式を選択できます(図13-42を参照)。

図13-41 データ・コントロール定義の選択

図13-42 EL式の選択

- 「要素タイプ」フィールドを使用してデータ・コレクションのタイプを宣言できます(図13-40を参照)。

- 有効なデータ・コレクションを選択すると、「リスト・アイテム・コンテンツ」表の「値」列が「値バインディング」に変更され、その編集可能なセルにはデータコレクションから属性のリストが移入されます。特別な場合の設定の説明は、図13-43を参照してください。

- 左側のイメージは、選択したリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映し、略図から基礎となる表の名前付き要素へのマッピングを提供します。

- リスト・アイテムは、その特定要素に対してどちらが適切であるかによって、出力テキストまたはイメージ・コンポーネントのいずれかとして生成されます。

- 要素(行)数は選択したリスト・ビュー・フォーマットであらかじめ決まっているため、行を追加または削除することはできません。

- 要素の順序は変更できません。

- 「区切り属性」フィールドのデフォルト値は「区切りなし」です。この場合、「区切りモード」フィールドは無効です。デフォルト以外の値を選択する場合は、「区切りモード」パラメータを指定する必要があります。さらに、「ListViewギャラリ」で区切りを含むバリエーションを選択した場合、デフォルト値はリストの最初の属性に設定されます。

バインド済リスト・ビューを作成するときに考慮する特殊な場合は次のとおりです。

- Java Beanメソッドによって汎用性がないリストが戻される場合、図13-40に示すように「要素タイプ」フィールドを使用して、リスト・アイテム・コンテンツを作成する必要があります。

- 入力されているリスト・データ・コレクション値がコレクションベースではない場合、図13-43に示すように、「値」列が空白の値を持つ「値バインディング」列に置換されます。

図13-43 非コレクションベース値の入力

詳細は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 第13.3.15.4項「リスト・ビュー・レイアウトの構成」

- 第12.3.3.3項「コレクションのドラッグ・アンド・ドロップ」

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのUIDemo。このサンプルは、様々なタイプのリスト・ビュー・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。

- 付録E「アプリケーションの使用方法の制限」

13.3.15.1 ページングおよび動的スクロールの構成

リスト・ビュー・コンポーネントを構成して、任意の長さのリストにデータを表示するには、ユーザー・ジェスチャーによる要求に応じて、リストの下部にデータを追加します。

fetchSize属性によって、リスト・ビュー・コンポーネントが最初にロードする行数が決定されます。fetchSizeで定義されているよりも多くの使用可能な行がある場合、リスト・ビューでは特定のユーザー・ジェスチャーを待ってから、さらに行をロードして表示します(第13.3.15.1.1項「リスト・ビューのスクロール方法」を参照)。fetchSize属性は、ユーザーがさらに行を表示するジェスチャを実行するたびにロードおよび表示される行数を決定する場合にも使用されます。

fetchSize属性が-1に設定されている場合は、すべてのレコードの取得と表示が行われるので、ページングも動的スクロール動作も発生しません。

「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグしてリスト・ビュー・コンポーネントが作成されると、fetchSize属性はデフォルトでPageDefイテレータのrangeSizeを指すEL式を使用するように設定され、これを変更することはできません。PageDefファイルの詳細は、第12.3.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」および図12-85「PageDefファイル」を参照してください。

次の例は、データ・コントロールのtestResultsというコレクションから作成されたlistView要素を示しています(第12.3.3項「MAF AMXページへのデータ・コントロールの追加方法」を参照)。

<amx:listView var="row"
value="#{bindings.testResults.collectionModel}"
fetchSize="#{bindings.testResults.rangeSize}">

前述の例では、fetchSize属性はbindings.testResultsのrangeSizeを指しています。次の例は、このMAF AMXページのPageDefファイルの行を示しています。このPageDefファイルには、testResultsかバインドされるtestResultsIteratorというaccessorIterator要素が含まれています。

<accessorIterator MasterBinding="Class1Iterator"
Binds="testResults"
RangeSize="25"
DataControl="Class1"
BeanClass="mobile.Test"
id="testResultsIterator"/>

13.3.15.1.1 リスト・ビューのスクロール方法

リスト・ビュー・コンポーネントの次の属性によってスクロール動作が有効になります。

- showMoreStrategy: リスト・ビュー・コンポーネントの、必要に応じて追加の行をロードする戦略を定義します。
リスト・ビュー・コンポーネントが独自のスクロールを提供している場合(第13.3.15.1.2.項「リスト・ビューの独自のスクロール」を参照)、そのリスト・ビューが末尾までスクロールされると、次のように属性の値に基づいてshowMoreStrategyが自動的に起動されます。

- autoLink: モデルからさらに行を使用できる場合、リスト・ビューには、表示されたリストの下部に「さらに行をロード」リンクが表示されます(図13-44を参照)。

図13-44 リスト・ビューの「さらに行をロード」

リスト・ビューに追加の行をロードして表示するには、エンド・ユーザーがこのリンクをタップする必要があります。

- autoScroll: モデルからさらに行を使用できる場合、リスト・ビューには、表示する追加の行をロードしている間、ロード・インジケータが表示されます。

- forceLink: 「さらに行をロード」リンクが表示されます(図13-44を参照)。エンド・ユーザーがリンクをタップすると、リスト・ビューでは追加の行をロードして表示しようとします。

- off: リスト・ビューでは何のアクションも実行されません。最初にロードされた行のみが表示されます。

- bufferStrategy: 表示された行をバッファリングする、リスト・ビュー・コンポーネントの方法を定義します。
リスト・ビューの高さが制限されており、独自のスクロールを提供できる場合(第13.3.15.1.2項「リスト・ビューの独自のスクロール」を参照)、リスト・ビューでは、次に示すbufferStrategy属性の値に基づいて、レンダリング・エンジンのバッファ内に行を保持します。

- additive: 新しい行がレンダリング・エンジンのバッファに追加され、すべての行がバッファ内に保持されます。このオプションは、メモリー消費量を考慮する必要のない短いリストに使用できます。

- viewport: 行は、リスト・ビューのビューポート内で表示されるようになった場合にのみ、レンダリング・エンジンのバッファに追加されます。行が表示されなくなると、リスト・ビューのbufferSize属性に基づいて行がバッファから削除されます。このオプションは、長いリストを表示する場合に、メモリー消費量の削減に役立ちます。

- bufferSize: bufferStrategyがviewportに設定されている場合、bufferSize属性は、行が非表示になる、行のビューポートからの距離(ピクセル単位)を定義します。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.3.15.1.2 リスト・ビューの独自のスクロール

デフォルトで、リスト・ビュー・コンポーネントのスクロール動作は、親コンテナによって制御されます(つまり、親コンテナのスクロールがデフォルトで設定されるなどです)。

リスト・ビュー・コンポーネント独自のスクロールが提供されるようにするには、次のいずれかを実行します。

- リスト・ビューを、パネル・ページの唯一の非ファセット子にします。

- リスト・ビューに固定の高さを設定します。次に例を示します。

inlineStyle="height: 200px;"

13.3.15.1.3 サーバー側ページング

リスト・ビュー・コンポーネントでは、oracle.adfmf.amx.event.RangeChangeEventなどのイベントを介してサーバー側ページングをサポートしています。

「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグしてリスト・ビュー・コンポーネントが作成されると、リスト・ビュー・コンポーネントはバンディング・イテレータから行を取得します(第13.3.15.1項「ページングおよび動的スクロールの構成」を参照)バインディング・イテレータは、AttributeIteratorのRangeSize属性によって定義された単位で、データ・コントロールのコレクションから行を取得します。使用可能なデータがすべて取得されると、RangeChangeEventが起動されます。このイベントを捕捉するには、データ・コントロールのプロバイダ・コードにoracle.adfmf.amx.event.RangeChangeListenerを実装して、rangeChangeメソッドを提供する必要があります。このメソッドでは、サーバーからさらにデータをロードして、それをコレクションに追加できます。これらの行がリスト・ビュー・コンポーネントによって表示されるようにするには、AdfmfJavaUtilitiesクラスのaddDataControlProvidersメソッドをコールして、新たに追加された行をデータ・コントロール・フレームワークに通知する必要があります。

public class Departments implements RangeChangeListener {
public void rangeChange(RangeChangeEvent rce) {
List newRows = null;
if (rangeChangeEvent.isDataExhausted()) {
newRows = loadMoreData(rangeChangeEvent.getFetchSize());
AdfmfJavaUtilities.addDataControlProviders("Departments",
rangeChangeEvent.getProviderKey(),
rangeChangeEvent.getKeyAttribute(),
newRows,
newRows.size() > 0);
}
}
...
}

注意:
データ・コントロールのプロバイダ・クラスをインスタンス化する際、サーバーからのデータの初期ロードでは、バインディング・イテレータのRangeSize属性で定義されている行数と同じ数の行を要求する必要があります。

マネージドBeanを使用してリスト・ビューのモデルを提供している場合、リスト・ビュー・コンポーネントのrangeChangeListener属性(第13.10項「イベント・リスナーの使用方法」を参照)では、エンド・ユーザーがさらに行をロードするジェスチャーを実行したときにコールされるJavaハンドラ・メソッドをバインドできます。このメソッドはoracle.adfmf.amx.event.RangeChangeEventオブジェクトをパラメータとして使用し、図13-45および図13-46に示すように、「プロパティ」ウィンドウから「プロパティの編集: 範囲変更リスナー」ダイアログを起動すると作成されます。

図13-45 「範囲変更リスナー」属性の編集

図13-46 「プロパティの編集」ダイアログ

ダイアログで「OK」をクリックすると、MAF AMXページのlistView要素に次の設定が追加されます。

<amx:listView id="listView1" rangeChangeListener="#{pageFlowScope.HRBean.goGet}" >

また、次の例に示すJavaメソッドは、サンプルのHRBeanクラスに追加されます。

public void goGet(RangeChangeEvent rangeChangeEvent) {
// Add event code here
...
}

注意:
RangeChangeEventを使用してサーバー側ページングをサポートしている場合、リスト・ビューのfetchSize属性は-1に設定できません。

13.3.15.2 MAF AMX UIコンポーネントによるメモリー消費に関する必知事項

リスト・ビューを含む、すべてのスクロール可能なMAF AMX UIコンポーネントは、メモリーが不足した状態でモバイル・デバイスを実行している場合にリソースを節約するよう最適化されています。このようなコンポーネントでは、フリック機能が無効化され、慣性スクロールが機能します(つまり、エンド・ユーザーが画面から指を離した後もコンポーネントがスクロールし続けるようにするため、エンド・ユーザーはコンポーネントを指でフリックできなくなります)。

13.3.15.3 リスト・ビュー・アイテムの再配置

リスト・ビューのアイテムは再配置できます。この機能は、iOSとAndroidのプラットフォームで類似しており、どちらも各リスト・アイテムの右マージンに沿って整列した再配置アイコンが表示されます。再配置操作は、エンド・ユーザーがハンドルとして再配置アフォーダンスを使用してリスト・アイテムにタッチしてドラッグしたときに開始されます。この操作は、エンド・ユーザーが表示画面から指を離したときに完了します。

注意:
エンド・ユーザーがリスト・アイテム上の他の場所をタッチしてドラッグした場合は、リストが上下にスクロールします。

再配置ドラッグ操作によって、リスト・アイテムがドッキング解除され、エンド・ユーザーがリスト内でリスト・アイテムを上下に移動できるようになります。

そのアイテムを再配置可能にするには、リスト・ビューが静的ではなく編集モードになっており、移動を許容可能になっている必要があります。

次の例は、MAF AMXファイルで定義されたlistView要素を示しています。この定義によって、リスト・モードを編集可能と読取り専用の間で切り替えることができる「編集」および編集停止ボタンが上部に表示されたリストが提示されます。

<amx:panelPage id="pp1">
<amx:commandButton id="edit"
text="Edit"
rendered="#{!bindings.inEditMode.inputValue}">
<amx:setPropertyListener id="spl1"
from="true"
to="#{bindings.inEditMode.inputValue}"
type="action"/>
</amx:commandButton>
<amx:commandButton id="stop"
text="Stop Editing"
rendered="#{bindings.inEditMode.inputValue}">
<amx:setPropertyListener id="spl2"
from="false"
to="#{bindings.inEditMode.inputValue}"
type="action"/>
</amx:commandButton>
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row"
editMode="#{bindings.inEditMode.inputValue}"
moveListener="#{MyBean.Reorder}">
<amx:listItem id="li1">
<amx:outputText id= "ot1" value="#{row.description}">
</amx:listItem>
</amx:listView>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.3.15.4 リスト・ビュー・レイアウトの構成

リスト・ビュー・コンポーネントは、各行が1つのリスト・アイテム・コンポーネントを含んでいる行のセット(デフォルト)として、または各カードが1つ以上のリスト・アイテム・コンポーネントを含んでいるカードのセットとしてレイアウトできます。

レイアウトを定義するには、リスト・ビューのlayout属性を使用し、これをrowsまたはcardsに設定します。cardsレイアウトを使用する場合は、次の点を考慮してください。

- 各リスト・アイテム・コンポーネントは、水平方向に並べられたカードのグループのカードとして表されます。

- 使用可能なすべてのスペースが消費された場合、次のカードは新しい行に折り返されます。

- リスト・ビュー内でリスト・アイテム・コンポーネント(カード)の水平方向配置を制御するには、リスト・ビューのhalign属性をstart、centerまたはendに設定します。

- リスト・ビューの外観を一般的にカスタマイズするには:

- スキン内でデフォルトで定義されているカード・サイズをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しい幅を指定します。詳細は、第13.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

注意:
値をautoに設定することも、パーセント単位を使用することもできません。

あるいは、スキニングを使用して.amx-listView-cards .amx-listItemセレクタから幅をオーバーライドできます(第13.6.2項「スキニングに関する必知事項」を参照)。

- スキン内でデフォルトで定義されているカードの周りのスペースをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しいmargin-topおよびmargin-leftを指定し(第13.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照)、リスト・ビューのcontentStyle属性を使用して新しいpadding-bottomおよびpadding-rightを指定します。
あるいは、スキニングを使用して、.amx-listView-cards .amx-listItemセレクタからmargin-topおよびmargin-leftをオーバーライドし、.amx-listView-cards .amx-listView-contentセレクタからpadding-bottomおよびpadding-rightをオーバーライドします(第13.6.2項「スキニングに関する必知事項」を参照)。

rowsレイアウトの場合、halign属性を使用してわずかなリスト・アイテム・コンテンツの配置を変更できます。ただし、この属性を使用すると、視覚的な効果を生まないことがあります。

カード・レイアウトを備えたリスト・ビュー・コンポーネントが編集モードにあると、そのレイアウトはrowsモードに切り替わります。

特定のパターンに従ってMAF AMXページ・レイアウトを調整するには、一連の事前定義済スタイルを使用するstyleClass属性(第13.6項「UIコンポーネントのスタイル設定」を参照)を介して定義される様々なタイプのリスト・ビュー・コンポーネントおよびスタイルを組み合せて使用します。

UIDemoという名前のMAFサンプル・アプリケーションは、各コンポーネントおよびその関連レンダリングのすべてのオプション・スタイルを示します。UIDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-startTextに設定すると、出力テキスト・コンポーネントが行の開始(左)側に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-endTextに設定すると、出力テキスト・コンポーネントが行の終了(右)側に配置され、そのテキストに青いフォントが適用されます。右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この属性のデフォルト値はtrueであるため、この例にはこの設定は含まれていません。

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1s1" width="10px"/>
<amx:cellFormat id="cf11" width="60%" height="43px">
<amx:outputText id="outputText11" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputText12"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図13-47は、各行の開始(左)側と終了(右)側に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図13-47 デザインタイムの開始および終了テキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-startTextに設定すると、出力テキスト・コンポーネントが行の開始に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-endTextに設定すると、出力テキスト・コンポーネントが行の終了に配置され、そのテキストに青いフォントが適用されます。それぞれの特定の行に右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この例では、この属性はすべてのlistItem要素に対してfalseに設定されているため、右向き矢印は表示されません。

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1" showLinkIcon="false">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1s1" width="10px"/>
<amx:cellFormat id="cf11" width="60%" height="43px">
<amx:outputText id="outputText11" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputText12"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図13-48は、各行の開始と終了に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、リンクを表す右向き矢印は含まれていません。

図13-48 デザインタイムの拡張リンクのない開始および終了テキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、終了テキストの下に配置されるサブテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左側に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右側に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-upperStartTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl11">
<amx:cellFormat id="cf1s1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf11" width="60%" height="28px">
<amx:outputText id="outputTexta1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputTexta2"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl12">
<amx:cellFormat id="cf13" columnSpan="3" width="100%" height="12px">
<amx:outputText id="outputTexta3"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図13-49は、各行の開始と終了に異なるスタイルのテキストが追加され、左側の終了テキストの下にサブテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図13-49 デザインタイムの開始および終了テキストとサブテキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、メイン・テキストおよびサブテキストを含む行が移入されます。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-mainTextに設定すると、出力テキスト・コンポーネントが行の開始に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-mainTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1">
<amx:tableLayout id="tla1" width="100%">
<amx:rowLayout id="rla1">
<amx:cellFormat id="cf1s1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cfa1" width="100%" height="28px">
<amx:outputText id="outputTexta1" value="#{row.name}"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rla2">
<amx:cellFormat id="cfa2" width="100%" height="12px" >
<amx:outputText id="outputTexta2"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図13-50は、各行にメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図13-50 デザインタイムのメイン・テキストとサブテキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、アイコン、メイン・テキストおよびサブテキストを含むセルが移入されます。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-mainTextに設定すると、出力テキスト・コンポーネントが行の左側に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-mainTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。image要素の位置は、それが囲むcellFormatによって定義されます。

<amx:listView id="lv1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="li1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1" rowSpan="2" width="40px" halign="center">
<amx:image id="i1" source="#{row.image}"/>
</amx:cellFormat>
<amx:cellFormat id="cf2" width="100%" height="28px">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl2">
<amx:cellFormat id="cf3" width="100%" height="12px">
<amx:outputText id="ot2"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図13-51は、各行に、アイコンおよびメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図13-51 デザインタイムのアイコン、メイン・テキストおよびサブテキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、各行の両側に配置されている2つの異なるタイプのテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左上隅に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右上隅に配置され、そのテキストに大きいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerStartTextに設定すると、出力テキスト・コンポーネントが行の左下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerEndTextに設定すると、出力テキスト・コンポーネントが行の右下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この属性のデフォルト値はtrueであるため、この例にはこの設定は含まれていません。

<amx:listView id="lv1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="li1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf2" width="60%" height="28px">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf3" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf4" width="40%" halign="end">
<amx:outputText id="ot2"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rla2">
<amx:cellFormat id="cf5" width="60%" height="12px">
<amx:outputText id="ot3"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
<amx:cellFormat id="cf6" width="40%" halign="end">
<amx:outputText id="ot4"
value="#{row.priority}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図13-52は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図13-52 デザインタイムの4つのタイプのテキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、各行の両側に配置されている2つの異なるタイプのテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左上隅に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右上隅に配置され、そのテキストに大きいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerStartTextNoChevronに設定すると、出力テキスト・コンポーネントが行の左下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerEndTextNoChevronに設定すると、出力テキスト・コンポーネントが行の右下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。それぞれの特定の行に右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この例では、この属性はすべてのlistItem要素に対してfalseに設定されているため、右向き矢印は表示されません。

<amx:listView id="lv1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="li1" showLinkIcon="false">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf2" width="60%" height="28px">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf3" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf4" width="40%" halign="end">
<amx:outputText id="ot2"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl2">
<amx:cellFormat id="cf5" width="60%" height="12px">
<amx:outputText id="ot3"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
<amx:cellFormat id="cf6" width="40%" halign="end">
<amx:outputText id="ot4"
value="#{row.priority}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図13-53は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図13-53 デザインタイムの拡張リンクのない4つのタイプのテキストを持つリスト・ビュー

13.3.15.5 静的リスト・ビューの使用に関する必知事項

モデルからではなくハードコード化された値によって移入されるリスト・ビュー・コンポーネントを作成する場合、このリスト・ビューは静的になり、デザインタイムに設定するそのプロパティのいくつか(たとえばdividerAttribute、dividerMode、fetchSize、moveListener)が実行時に無視されるようになります。

MAF AMXでは、リスト・ビュー・コンポーネントのvalue属性が設定されていない場合、そのコンポーネントを静的であると見なします。そのようなリストは編集できません(つまり、リストのeditMode属性を指定できません)。

13.3.16 カルーセル・コンポーネントの使用方法

カルーセル(carousel)コンポーネントは、回転カルーセルにイメージなどの他のコンポーネントを表示するために使用します。エンド・ユーザーは、スライダを使用するか、別のイメージを正面にドラッグすることでアクティブなアイテムを変更できます。

カルーセル・コンポーネントにはカルーセル・アイテム(carouselItem)コンポーネントが含まれ、text属性によって表されるそのテキストは、それがそのカルーセルのアクティブなアイテムであるときに表示されます。通常、カルーセル・アイテムにはイメージ・コンポーネントが含まれていますが、他のコンポーネントを使用することもできます。たとえば、イメージを囲む子としてリンクを使用することもできます。表示する各オブジェクトにカルーセル・アイテム・コンポーネントを作成し、これらのコンポーネントを各オブジェクトにバインドするかわりに、カルーセル・コンポーネントを完全なコレクションにバインドします。その後、コンポーネントは各アイテムに値をスタンプ設定し、1つのカルーセル・アイテム・コンポーネントを繰り返しレンダリングします。各アイテムにスタンプが設定されると、現在のアイテムのデータが、カルーセル・コンポーネントのvar属性を使用するEL式を使用して特定可能なプロパティにコピーされます。カルーセルのレンダリングが完了したら、このプロパティは削除されるか前の値に戻ります。カルーセル・コンポーネントには、テキストの表示に使用されるカルーセル・アイテムのホルダと各アイテムの短い説明の両方であり、各アイテムについて表示されるイメージの親コンポーネントでもあるnodeStampという名前のファセットが含まれます。

カルーセル・アイテムは、その単一の子コンポーネントを拡大します。カルーセル・アイテム内に1つのイメージ・コンポーネントを配置する場合、アイテムに割り当てられた正方形に収まるように、イメージが拡大されます(エンド・ユーザーがカルーセルを動かすと、寸法が拡大または縮小されます)。

ヒント:
アプリケーションのパフォーマンスの低下を最小限に抑えるは、重いコンポーネントを子として使用しないようにします。複雑な構造にすると、いくつかのカルーセル・アイテム・スタンプが同時に表示されるため、その影響が倍増します。

デフォルトでは、カルーセルは水平に表示されます。カルーセルの水平方向のオブジェクトは垂直方向中央揃え、カルーセル自体はそのコンテナに対して水平方向中央揃えとなります。参照ローロデックス(回転式カード・ファイル)が必要な場合は、垂直に表示されるようにカルーセルを構成できます。デフォルトでは、垂直方向のカルーセルの中のオブジェクトは水平方向中央揃え、カルーセル自体は垂直方向中央揃えとなります。カルーセルのorientation属性を使用して配置を変更できます。

前および次のイメージを部分的に表示するかわりに、displayItems属性を使用して、フィルム・ストリップ・デザインまたは循環デザインでイメージを表示するようにカルーセルを構成できます。

デフォルトでは、カルーセルが循環モードで表示されるように構成されている場合、エンド・ユーザーが補助アイテム(現在、中央に表示されていないアイテム)にポインタを置くと、そのアイテムが枠で囲まれ、選択可能であることが示されます。auxiliaryPopOut属性を使用すると、アイテムが移動し、最大サイズで表示されるように、カルーセルを構成できます。

JDeveloperでは、「カルーセル」は「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図13-54を参照)。

図13-54 「コンポーネント」ウィンドウの「カルーセル」

カルーセル・コンポーネントを作成するには、まず表示するイメージを含むデータ・モデルを作成してから、そのモデルにカルーセルをバインドし、カルーセル・アイテム・コンポーネントをカルーセルのnodeStampファセットに挿入する必要があります。最後に、イメージ・コンポーネント(または、イメージ・コンポーネントが含まれる他のコンポーネント)を子としてカルーセル・アイテム・コンポーネントに挿入します。

次の例は、MAF AMXファイルのcarousel要素定義を示しています。carousel要素を定義するときは、carousel要素のnodeStampファセット内にcarouselItem要素を配置する必要があります。

<amx:carousel id="carousel1"
value="#{bindings.products.collectionModel}"
var="item"
auxiliaryOffset="0.9"
auxiliaryPopOut="hover"
auxiliaryScale="0.8"
controlArea="full"
displayItems="circular"
halign="center"
valign="middle"
disabled="false"
shortDesc="spin"
orientation="horizontal"
styleClass="AMXStretchWidth"
inlineStyle="height:250px;background-color:#EFEFEF;">
<amx:facet name="nodeStamp">
<amx:carouselItem id="item1" text="#{item.name}"
shortDesc="Product: #{item.name}">
<amx:commandLink id="link1" action="goto-productDetails"
actionListener="#{someMethod()}">
<amx:image id="image1" styleClass="prod-thumb"
source="images/img-big-#{item.uid}.png"/>
<amx:setPropertyListener id="spl1"
from="#{item}"
to="#{pageFlowScope.product}"
type="action"/>
</amx:commandLink>
</amx:carouselItem>
</amx:facet>
</amx:carousel>

カルーセル・コンポーネントでは、CollectionModelクラスを使用して基礎となるコレクションのデータにアクセスします。java.util.Listやarrayなどの他のモデル・クラスを使用することもでき、この場合はカルーセルによりインスタンスがCollectionModelクラスに自動的に変換されますが、機能は追加されません。

エンド・ユーザーはスライダを使用してカルーセル・コレクションを移動できます。通常、スライダのサムは総オブジェクト数の中の現在のオブジェクト番号を表示します。総オブジェクト数が大きすぎて計算できない場合、スライダのサムは現在のオブジェクト番号のみを表示します。

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.17 フィルム・ストリップ・コンポーネントの使用方法

フィルム・ストリップ(filmStrip)は、一連のグループ(ページ)間に分散されたデータを、垂直または水平ストリップ形式で視覚化するコンテナです。グループに含まれる表示アイテム(filmStripItem)を表すUIコンポーネントは同じサイズとタイプである必要があり、一度に1つのグループのみが表示されます。エンド・ユーザーは、フィルム・ストリップのページを移動し、アイテムを選択してタップすることでアクションを生成できます。

JDeveloperでは、フィルム・ストリップは「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図13-55を参照)。

図13-55 「コンポーネント」ウィンドウのフィルム・ストリップ

次の例は、MAF AMXファイルのfilmStrip要素定義を示しています。

<amx:filmStrip id="fs1"
var="item"
value="#{bindings.contacts.collectionModel}"
rendered="#{pageFlowScope.pRendered}"
styleClass="#{pageFlowScope.pStyleClass}"
inlineStyle="#{pageFlowScope.pInlineStyle}"
shortDesc="#{pageFlowScope.pShortDesc}"
halign="#{pageFlowScope.pFsHalign}"
valign="#{pageFlowScope.pFsValign}"
itemsPerPage="#{pageFlowScope.pMaxItems}"
orientation="#{pageFlowScope.pOrientation}"
pageControlPosition="#{pageFlowScope.pageControlPosition}">
<amx:filmStripItem id="fsi1"
inlineStyle="text-align:center; width:200px;">
<amx:commandLink id="ciLink"
action="details"
shortDesc="Navigate to details">
<amx:image id="ciImage" source="images/people/#{item.first}.png"/>
<amx:setPropertyListener id="spl1"
from="#{item.rowKey}"
to="#{pageFlowScope.currentContact}"
type="action"/>
<amx:setPropertyListener id="spl2"
from="#{item.first}"
to="#{pageFlowScope.currentContactFirst}"
type="action"/>
<amx:setPropertyListener id="spl3"
from="#{item.last}"
to="#{pageFlowScope.currentContactLast}"
type="action"/>
</amx:commandLink>
</amx:filmStripItem>
</amx:filmStrip>

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.17.1 フィルム・ストリップ・レイアウトに関する必知事項

垂直方向にレイアウトされたフィルム・ストリップでは、表示アイテムは上から下に向けて配置されます。テキストの方向に応じて、ページ・コントロールは次のように配置されます。

- 左から右のテキスト方向の場合は、ページ・コントロールは右側に配置されます。

- 右から左のテキスト方向の場合は、ページ・コントロールは左側に配置されます。

水平に配置されたフィルム・ストリップでは、テキストの方向モードを反映する必要があり、左から右モードでは最初のアイテムが左に置かれ、右から左モードでは最初のアイテムは右に置かれます。どちらの場合でも、ページ・コントロールは一番下にあります。

13.3.17.2 フィルム・ストリップ・ナビゲーションに関する必知事項

フィルム・ストリップ・コンポーネントのナビゲーションは、デッキ(第13.2.13項「デッキ・コンポーネントの使用方法」を参照)およびパネル・スプリッタ・コンポーネント(第13.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照)と似ています。一度に1つのページが表示され、ページIDまたは番号を選択するとページの変更がトリガーされます。

子フィルム・ストリップ・アイテム・コンポーネントは、他のMAF AMXページへの移動で使用されることを想定していないため、action属性をサポートしていません。必要な場合は、ネストされたコマンド・リンク・コンポーネントを介したナビゲーションを有効にできます。

13.3.18 Verbatimコンポーネントの使用方法

該当するコンポーネントが存在しない場合や自身でHTMLを使用してレイアウトする必要がある場合は、Verbatim (verbatim)操作を使用して独自のHTMLをページに挿入できます。

JDeveloperでは、「Verbatim」は、「コンポーネント」ウィンドウの「一般コントロール」の下にあります(図13-58を参照)。

図13-56 「コンポーネント」ウィンドウの「Verbatim」

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.18.1 JavaScriptおよびAJAXをVerbatimコンポーネントとともに使用する方法に関する必知事項

JavaScriptを(amx:verbatim要素内の) verbatimコンテンツに直接挿入することは、現在サポートされているプラットフォームの将来のバージョンまたは将来MAFでサポートされる可能性のある他のプラットフォームで適切に実行されない可能性があるため、お薦めしません。かわりに、maf-feature.xmlファイル内の既存のadfmf:include要素を使用してJavaScriptおよびCSSを含めることで、MAF AMXアプリケーション機能の起動時にページにスクリプトが挿入されるようにすることをお薦めします。

また、JavaScriptをVerbatimコンポーネントとともに使用することは、AMXページからのサーバーに対するAJAXコールはサポートされていないという事実の影響を受けます。これは、MAF AMXページをホストするブラウザが、セキュア・サーバーに接続してそのリソースを取得するために必要なセキュリティ情報にアクセスできないようにするためのセキュリティ・アーキテクチャが原因です。かわりに、サーバーとの通信は、埋込みJavaコード・レイヤーから発生する必要があります。

13.3.19 出力HTMLコンポーネントの使用方法

出力HTML (outputHtml)コンポーネントを使用すると、MAF AMXページで表示するために、HTMLコンテンツをELバインド・プロパティまたはメソッドから動的かつ安全に取得できます。出力HTMLコンポーネントはVerbatimコンポーネント(第13.3.18「Verbatimコンポーネントの使用方法」を参照)と同様に動作し、JavaScriptおよびAJAXの使用に関して同じ制限が適用されます(第13.3.18.1項「JavaScriptおよびAJAXをVerbatimコンポーネントとともに使用する方法に関する必知事項」を参照)。

JDeveloperでは、出力HTMLは、「コンポーネント」ウィンドウの「一般コントロール」の下にあります(図13-57を参照)。

図13-57 「コンポーネント」ウィンドウの出力HTML

次の例は、MAF AMXファイルのoutputHtml要素定義を示しています。value属性は、MAF AMXページの最終レンダリングでoutputHTMLとして表示するHTMLコンテンツを取得するために使用される文字列プロパティにELバインディングを提供します。

<amx:tableLayout id="t1" width="100%">
<amx:rowLayout id="r1">
<amx:cellFormat id="cf1" width="100%">
<amx:outputHtml id="ReceiptView"
value="#{pageFlowScope.purchaseBean.htmlReceiptView}"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="r2">
<amx:cellFormat id="cf2" width="100%">
<amx:outputHtml id="CheckView"
value="#{pageFlowScope.purchaseBean.htmlCheckView}"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>

次の例は、前の例に示したHTMLの出力コンポーネントにHTMLを提供するMyPurchaseBeanというJava Beanからのコードを示しています。

// The property accessor that gets the receipt view HTML
public String getHtmlReceiptView() {
// Perform some URL remote call to get the HTML to be
// inserted as a view of the Receipt and return that value
return obtainReceiptHTMLFromServer();
}
// The property accessor that gets the check view HTML
public String getHtmlCheckView() {
// Perform some URL remote call to get the HTML to be
// inserted as a view of the Check and return that value
return obtainCheckHTMLFromServer();
}

出力HTMLコンポーネントはそのHTMLコンテンツをリモート・ソースから直接ダウンロードするのではなく、Java Beanプロパティから取得するため、動的に提供されるHTMLの取得または生成をコーディングする場合は、既存のMAFセキュリティ機能を使用することを検討してください。詳細は、第29章「MAFアプリケーションの保護」および第28.7.3項「カスタムHTMLコンポーネントからのインジェクション攻撃のリスクについて」を参照してください。また、提供されるHTMLが信頼できるソースから取得されることと、HTMLに脅威が含まれていないことを確認してください。

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.20 反復の有効化方法

イテレータ(iterator)操作を使用して、同じ種類のデータを持つ任意の数のアイテムをスタンプします。これによりデータを繰り返し処理して各要素のUIを作成できます。

JDeveloperでは、「イテレータ」は「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図13-58を参照)。

図13-58 「コンポーネント」ウィンドウの「イテレータ」

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.3.21 リソース・バンドルのロード方法

バンドルのロード(loadBundle)操作により、ページ上のMAF AMX UIコンポーネントのローカライズ済テキストを提供するリソース・バンドルを指定できます。詳細は、第13.7項「UIコンポーネントのローカライズ」を参照してください。

JDeveloperでは、「バンドルのロード」は「コンポーネント」ウィンドウの「操作」の下にあります(図13-59を参照)。

図13-59 「コンポーネント」ウィンドウの「バンドルのロード」

MAF AMXファイル内で、loadBundle要素をview要素の子として宣言します。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.3.22 アクション・リスナーの使用方法

アクション・リスナー(actionListener)コンポーネントにより、親コンポーネントが使用するタイプに基づいてELを介して宣言でコマンドを呼び出すことができます。

アクション・リスナー・コンポーネントを使用する主な理由は、親コンポーネントにジェスチャー対応アクションを追加すること、およびタップなどの単一ジェスチャーに対して複数の操作を実行できるためです。詳細は、第13.3.22.1項「アクション・リスナー・コンポーネントと属性間の違いに関する必知事項」を参照してください。

JDeveloperでは、アクション・リスナー・コンポーネントは「コンポーネント」ウィンドウの「操作」→「リスナー」の下にあります(図13-60を参照)。

図13-60 「コンポーネント」ウィンドウの「アクション・リスナー」

0個以上のアクション・リスナー・コンポーネントを、任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム、フィルム・ストリップ・アイテム)の子として追加できます。アクション・リスナー・コンポーネントのtype属性は、swipeLeft、swipeRight、tapHoldなどのジェスチャーのいずれによってActionEventが起動するかを定義します。

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- 第13.3.23項「プロパティ・リスナーの設定の使用方法」

- 第13.4項「ジェスチャーの有効化」

- 第13.3.22.1項「アクション・リスナー・コンポーネントと属性間の違いに関する必知事項」

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

13.3.22.1 アクション・リスナー・コンポーネントと属性間の違いに関する必知事項

ボタン、リンクおよびリスト・アイテムなどのコンポーネントはactionListener属性を持つため、アクション・リスナー・コンポーネントの重複の原因となると考えられます。ただし、アクション・リスナー・コンポーネントとは異なり、これらのコンポーネントはジェスチャーをサポートするtype属性を持たないため、MAFで親コンポーネントのactionListener属性に加えてアクション・リスナー・コンポーネントが提供されます。

13.3.23 プロパティ・リスナーの設定の使用方法

プロパティ・リスナーの設定(setPropertyListener)コンポーネントにより、コンポーネントに対するエンド・ユーザー・アクションの結果として、1つの場所(コンポーネントのfrom属性で定義)から別の場所(コンポーネントのto属性で定義)に宣言で値をコピーできるため、これと同じ結果を得るためにJavaコードを作成する必要がなくなります。

JDeveloperでは、プロパティ・リスナーの設定コンポーネントは「コンポーネント」ウィンドウの「操作」→「リスナー」の下にあります(図13-61を参照)。

図13-61 「コンポーネント」ウィンドウの「プロパティ・リスナーの設定」

次の例は、MAF AMXファイルのsetPropertyListener要素定義を示しています。

<amx:listView value="#{bindings.products.collectionModel}" var="row" id="lv1">
<amx:listItem id="li1" action="details">
<amx:outputText value="#{row.name}" id="ot1" />
<amx:setPropertyListener id="spl1"
from="#{row}"
to="#{pageFlowScope.product}"
type="action"/>
</amx:listItem>
</amx:listView>

0個以上のプロパティ・リスナーの設定コンポーネントを、任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム、フィルム・ストリップ・アイテムおよびデータ視覚化コンポーネントのサブセットとその子コンポーネント)の子として追加できます。プロパティ・リスナーの設定コンポーネントのtype属性は、swipeLeft、swipeRight、tapHoldなどのジェスチャーのいずれによってActionEventが起動するかを定義します。

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- 第13.3.22項「アクション・リスナーの使用方法」

- 第13.4項「ジェスチャーの有効化」

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

13.3.24 クライアント・リスナーの使用方法

クライアント・リスナー(clientListener)コンポーネントを使用すると、特定のイベント・タイプの起動時に実行されるJavaScriptリスナー・スクリプトを宣言的に登録できます。

ナビゲーション・ドラッグ動作やポップアップ表示動作など、既存の動作コンポーネントにはスクリプトが不要なものもあるため、クライアント・リスナー・コンポーネントを使用する前に、このようなコンポーネントがMAF AMXに含まれているかどうかを確認する必要があります。

JDeveloperでは、クライアント・リスナー・コンポーネントは「コンポーネント」ウィンドウの「操作」→「リスナー」の下にあります(図13-62を参照)。

図13-62 「コンポーネント」ウィンドウの「クライアント・リスナー」

次の例は、MAF AMXファイルのclientListener要素定義を示しています。両方の属性が必要で、次のように指定されている必要があります。

- method: 指定タイプのイベントでトリガーされると起動する、クライアント側のJavaScriptメソッド名を定義します。

- type: リスニング対象のクライアント側コンポーネント・イベントのタイプを定義します。必ずしもすべてのイベント・タイプがすべてのコンポーネントに存在するわけではなく、すべてのイベントがプラットフォーム間または同じプラットフォームのバージョン間で常に動作しているわけではありません。イベントの例としては、action (親コンポーネントがボタンの場合)、valueChange (親コンポーネントが入力テキストの場合)などがあります。親コンポーネントによっては、touchstart、touchend、tap、tapholdなど、いくつかのDOMイベントを使用できる場合があります。また、ビュー・コンポーネントのshowpagecomplete、mafviewvisible、mafviewhidden、amxnavigatestart、amxnavigateend (これらのイベントの詳細は、第14.11.11項「デバイス・プロパティに関する必知事項」を参照)など、特別なDOMイベントを持つコンポーネントもあります。
type属性は初期宣言のELはサポートしていますが、そのEL値への変更はサポートしていません(つまり、親コンポーネントを再レンダリングするアクションが実行されないかぎり、式に関連付けられた値は変更できません)。

<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:clientListener type="showpagecomplete" method="handleClientListenerBlue"/>
<amx:clientListener type="mafviewvisible" method="handleClientListenerBlue"/>
<amx:clientListener type="mafviewhidden" method="handleClientListenerBlue"/>
<amx:clientListener type="amxnavigatestart" method="handleClientListenerBlue"/>
<amx:clientListener type="amxnavigateend" method="handleClientListenerBlue"/>
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="header" value="clientListener"/>
</amx:facet>
<amx:facet name="primary">
<amx:commandButton id="back" action="__back" text="Back"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="props" text="Properties" action="properties"/>
</amx:facet>
<amx:commandButton id="button1" text="Click Me">
<amx:clientListener type="#{bindings.pType}"
method="#{bindings.pMethod}"/>
</amx:commandButton>
<amx:verbatim id="v1"><![CDATA[
<script type="text/javascript">
function handleClientListenerGray(clientEvent) {
_handleClientListener(clientEvent, "gray");
}
function handleClientListenerBlue(clientEvent) {
_handleClientListener(clientEvent, "blue");
}
function handleClientListenerOrange(clientEvent) {
_handleClientListener(clientEvent, "orange");
}
function clearRecentEvents(clientEvent) {
for (var i=9; i>=0; --i) {
var row = document.getElementsByClassName("recent"+i)[0];
row.textContent = "n/a";
row.style.color = "";
}
}
function _handleClientListener(clientEvent, color) {
try {
for (var i=9; i>0; --i) {
var currentRow = document.getElementsByClassName("recent"+i)[0];
var olderRow = document.getElementsByClassName
("recent"+(i-1))[0];
currentRow.textContent = olderRow.textContent;
currentRow.style.color = olderRow.style.color;
}
document.getElementsByClassName("recent0")[0].
textContent = clientEvent;
document.getElementsByClassName("recent0")[0].style.color = color;
console.log("Handled clientListener: " + clientEvent, clientEvent);
}
catch (problem) {
console.log("Error in verbatim code: " +
clientEvent, clientEvent, problem);
alert("Error in verbatim code: " + clientEvent + "\n\n" + problem);
}
}
</script>
<style type="text/css">
.recentLine {
white-space: normal;
word-wrap: break-word;
font-size: 12px;
color: gray;
}
</style>
<fieldset style="min-width: 50px;">
<legend style="color: gray;">Recent Events</legend>
<div id="recent0" class="recent0 recentLine">n/a</div>
<div id="recent1" class="recent1 recentLine">n/a</div>
<div id="recent2" class="recent2 recentLine">n/a</div>
<div id="recent3" class="recent3 recentLine">n/a</div>
<div id="recent4" class="recent4 recentLine">n/a</div>
<div id="recent5" class="recent5 recentLine">n/a</div>
<div id="recent6" class="recent6 recentLine">n/a</div>
<div id="recent7" class="recent7 recentLine">n/a</div>
<div id="recent8" class="recent8 recentLine">n/a</div>
<div id="recent9" class="recent9 recentLine">n/a</div>
</fieldset>
]]></amx:verbatim>
</amx:panelPage>
</amx:view>

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

13.3.25 日時の変換方法

日時の変換(convertDateTime)は、独立したUIコンポーネントではありません。これは、出力テキストおよび入力テキスト・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された日付、時刻または日時の組合せを表示するコンバータ操作です。

JDeveloperでは、「日時の変換」は「コンポーネント」ウィンドウの「バリデータおよびコンバータ」の下にあります(図13-63を参照)。

図13-63 「コンポーネント」ウィンドウの「日時の変換」

次の例は、MAF AMXファイルで宣言されたconvertDateTime要素を示しています。

<amx:panelPage id="pp1">
<amx:inputText styleClass="ui-text" value="Order Date" id="it1" >
<amx:convertDateTime id="cdt1" type="both"/>
</amx:inputText>
</amx:panelPage>

日時値を変換するには:

1. 「コンポーネント」ウィンドウから、「日時の変換」コンポーネントをドラッグし、それを出力テキストまたは入力テキスト・コンポーネント内に挿入し、それをそのコンポーネントの子要素にします。

2. 日時の変換コンポーネントの「プロパティ」ウィンドウを開き、その属性を定義します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

注意:
日時の変換コンポーネントは、デザインタイムには何の効果も持ちません。

日時の変換コンポーネントでは、入力値文字列を日付に変換する際に一定レベルの寛容性があります。

- 月に対して関連付けられたパターンMMMを持つコンバータは、値のホルダーに添付されると、MMまたはMの形で指定された月の値を有効な値として受け入れます。

- 関連付けられたパターンで指定されているセパレータに関係なく、ダッシュ( - )、ピリオド( . )、スラッシュ( / )などのセパレータを使用できます。

- パターン定義における寛容性は、pattern属性で設定します。

たとえば、コンバータのパターンが"MMM/d/yyyy"に設定されている場合、次の入力はコンバータにより有効なものとして許容されます。

Jan/4/2004
Jan-4-2004
Jan.4.2004
01/4/2004
01-4-2004
01.4.2004
1/4/2004
1-4-2004
1.4.2004

コンバータでは、java.text.SimpleDateFormat (dateStyle、timeStyleおよびpattern属性を使用して指定される)と同じ解析および書式設定規則がサポートされています。ただし、タイムゾーンが、timeStyle=fullなどの長い表示またはzzzzで設定されるパターンを持つように指定されている場合は例外です。タイムゾーンは太平洋標準時のような長い説明の文字列ではなく、一般的なタイムゾーン形式(GMT +/-オフセット)またはRFC-822タイムゾーンで表示されます。

変換の正確な結果は、ロケールによって異なりますが、一般的に次のルールが適用されます。

- SHORTは、12.13.52や3:30pmなど完全に数値です。

- MEDIUMはそれより長いJan 12、1952などです。

- LONGは、それよりも長いJanuary 12、1952、3:30:32pmなどです。

- FULLは、完全に指定されたTuesday, April 12, 1952 ADや3:30:42pm PSTなどです。

13.3.25.1 日時パターンに関する必知事項

java.text.SimpleDateFormat定義に従って、日時書式を、日時パターン文字列で指定します。日時パターン文字列では、引用符で囲まれていないAからZおよびaからzの文字は、日付または時間の文字列のコンポーネントを表すパターン文字と認識されます。テキストは、解釈されないように一重引用符(')で囲むことができます。" ' ' "は一重引用符を表します。すべてのその他の文字は解釈されません。かわりに、それらは書式設定中に単に出力文字列にコピーされるか、解析中に入力文字列と照合されます。

表13-9は、定義済パターン文字を示しています(AからZおよびaからzのすべてのその他の文字は予約されています)。

表13-9 日時パターン文字

文字

日付または時刻のコンポーネント

表示内容

例

G

紀元

テキスト

- AD

y

年

年

- 1996

- 96

M

年における月

月

- 7月

- Jul

- 07

w

年における週

数値

- 27

W

月における週

数値

- 2

D

年における日

数値

- 189

d

月における日

数値

- 10

F

月における曜日

数値

- 2

E

曜日

テキスト

- 火曜日

- Tue

a

午前/午後

テキスト

- PM

H

1日における時(0-23)

数値

- 0

k

1日における時(1-24)

数値

- 24

K

午前/午後の時(0 - 11)

数値

- 0

h

午前/午後の時(1 - 12)

数値

- 12

m

1時間における分

数値

- 30

s

1分における秒

数値

- 55

S

ミリ秒

数値

- 978

z

タイムゾーン

一般的なタイムゾーン

- 太平洋標準時

- PST

- GMT-08:00

Z

タイムゾーン

RFC 822タイムゾーン

- -0800

パターン文字は通常繰り返されます。これは、それらの数が正確な表示を決定するためです。

13.3.26 数値の変換方法

数値の変換(convertNumber)は、独立したUIコンポーネントではありません。これは、出力テキスト、入力テキストおよび入力数値スライダ・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された数値または通貨値を表示するコンバータ操作です。

数値の変換コンポーネントは、次のタイプの操作を提供します。

- 値から文字列。表示目的です。

- 書式設定された文字列から値。書式設定された入力値が、基礎となっている値に解析される場合です。

数値の変換が、入力テキスト・コンポーネントの子として指定されている場合、デフォルトで、モバイル・デバイスに数字キーボードが表示されます。

JDeveloperでは、「数値の変換」は「コンポーネント」ウィンドウの「バリデータおよびコンバータ」の下にあります(図13-64を参照)。

図13-64 「コンポーネント」ウィンドウの「数値の変換」

次の例は、MAF AMXファイルで定義されたconvertNumber要素を示しています。

<amx:panelPage id="pp1">
<amx:inputText styleClass="ui-text" value="Product Price" id="it1" >
<amx:convertNumber id="cn1"
type="percent"
groupingUsed="false"
integerOnly="true"/>
</amx:inputText>
</amx:panelPage>

数値を変換するには:

1. 「コンポーネント」ウィンドウから、「数値の変換」コンポーネントをドラッグし、それを出力テキスト、入力テキストまたは入力数値スライダ・コンポーネント内に挿入し、それをそのコンポーネントの子要素にします。

2. 数値の変換コンポーネントの「プロパティ」ウィンドウを開き、その属性を定義します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

注意:
数値の変換コンポーネントは、デザインタイムには何の効果も持ちません。

13.3.27 ドラッグ・ナビゲーションを有効にする方法

ナビゲーション・ドラッグ動作(navigationDragBehavior)操作を使用すると、モバイル・デバイス画面の一部を指定した方向(左または右)にドラッグすることによって、次または前のMAF AMXページに移動するアクションを起動できます。指定された方向へのドラッグが発生すると、画面の適切な側にインジケータが表示され、インジケータがすべて表示されるとすぐに、ドラッグが続いた後停止すると、アクションが実行されることが示されます。インジケータがすべて表示される前にドラッグが放された場合、インジケータはスライドされ、アクションは起動されません。

注意:
別のより近いコンテナによってドラッグ・ジェスチャーが消費されている場合、この動作は発生しません。

MAF AMXページには、1つはdirection属性がbackに設定され、1つはforwardに設定された、navigationDragBehavior要素のインスタンスを3つ以上含めることはできません。

JDeveloperでは、ナビゲーション・ドラッグ動作は「コンポーネント」ウィンドウの「操作」の下にあります(図13-65を参照)。

図13-65 「コンポーネント」ウィンドウのナビゲーション・ドラッグ動作

次の例は、MAF AMXファイルで定義されたnavigationDragBehavior要素を示しています。この要素は、view要素の子にのみできます。

<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:navigationDragBehavior id="ndb1"
direction="forward"
action="gotoDetail"/> Foot 1
<amx:panelPage id="pp1">
<amx:facet name="header">
...
</amx:panelPage>
</amx:view>

図13-66は、実行時のナビゲーション・ドラッグ動作を示しています(mobileFusionFxスキンを使用して表示されています)。

図13-66 実行時のナビゲーション・ドラッグ動作操作

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.3.27.1 disabled属性に関する必知事項

disabled属性の値は、次のいずれかが発生した場合に計算されます。

- MAF AMXページがレンダリングされる。

- PropertyChangeListenerによるコンポーネントの更新。エンド・ユーザーがナビゲーション・ドラッグ動作を起動できる機能を動的に有効または無効にするには、PropertyChangeListenerを使用します(Beanからの更新が必要なその他のコンポーネントで使用する場合と同様の方法)。

次の例は、disabled属性が定義されているnavigationDragBehavior要素を含むMAF AMXページを示しています。アクティブ化された場合に、disabled属性がその値を読み取るバッキングBeanのboolean値(MyBeanの例のnavDisabled)を変更するボタン(commandButton)によって機能が駆動されます。バッキングBeanは、プロパティ変更リスナーを使用します。

<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="Header1" id="ot1"/>
</amx:facet>
<amx:commandButton id="cb1"
text="commandButton1"
actionListener="#{pageFlowScope.myBean.doSomething}"/>
</amx:panelPage>
<amx:navigationDragBehavior id="ndb1"
direction="forward"
action="goView2"
disabled="#{pageFlowScope.myBean.navDisabled}"/>
</amx:view>

次の例は、navigationDragBehaviorのdisabled属性の値を提供するバッキングBean(navigationDragBehaviorの例のmyBean)を示します。

public class MyBean {
boolean navDisabled = true;
private PropertyChangeSupport propertyChangeSupport =
new PropertyChangeSupport(this);

public void setNavDisabled(boolean navDisabled) {
boolean oldNavDisabled = this.navDisabled;
this.navDisabled = navDisabled;
propertyChangeSupport.firePropertyChange("navDisabled",
oldNavDisabled,
navDisabled);
}

public boolean isNavDisabled() {
return navDisabled;
}

public void doSomething(ActionEvent actionEvent) {
setNavDisabled(!navDisabled);
}

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}
}

13.3.28 ロード・インジケータの使用方法

ロード・インジケータ動作(loadingIndicatorBehavior)操作を使用すると、次のものをオーバーライドすることでロード・インジケータの動作を定義できます。

- フェイルセーフ・タイマーの期間(ミリ秒単位)。

- フェイルセーフしきい値に達したときの一連のアクションを決定するために起動できるオプションのJavaScript関数名。

詳細は、表19-1「静的API」のadf.mf.api.amx.showLoadingIndicatorを参照してください。

JDeveloperでは、ロード・インジケータ動作は「コンポーネント」ウィンドウの「操作」の下にあります(図13-67を参照)。

図13-67 「コンポーネント」ウィンドウのロード・インジケータ動作

次の例は、MAF AMXファイルで定義されたloadingIndicatorBehavior要素を示しています。この要素は、view要素の子にのみできます。

<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:loadingIndicatorBehavior id="lib1"
failSafeDuration="3000"
failSafeClientHandler="window.customFailSafeHandler"/>
<amx:panelPage id="pp1">
<amx:facet name="header">
<!-- The loading indicator custom fail safe handler will appear
if the long running operation runs longer than 3 seconds -->
<amx:commandButton id="cb1"
text="longRunningOperation"
actionListener=
"#{pageFlowScope.myBean.longRunningOperation} />
</amx:panelPage>
</amx:view>

前述の例では、commandButtonが長時間実行されるメソッドにバインドされて、(ページ自体のロードに長時間かかる場合ではなく)ページがロードされた場合に、長時間実行される操作にロード・インジケータが適用されることを示しています。

次の例は、アプリケーション機能に含まれるcustom.jsファイルを示しています。これは、loadingIndicatorBehaviorページのfailSafeClientHandlerのクライアント・ハンドラを定義します。API要件に従って、この関数はhide、repeatまたはfreezeいずれかのStringを返します。詳細は、表19-1「静的API」のadf.mf.api.amx.showLoadingIndicatorを参照してください。

window.customFailSafeHandler = function() {
var answer =
prompt(
"This is taking a long time.\n\n" +
"Use \"a\" to hide the indicator.\n" +
"Use \"z\" to wait for it.\n" +
"Otherwise, give it more time.");

if (answer == "a")
return "hide"; // don't ask again; hide the indicator
else if (answer == "z")
return "freeze" // don't ask again; wait for it to finish
else
return "repeat"; // ask again after another duration
};

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

13.4 ジェスチャーの有効化

次のジェスチャーに反応するように、ボタン、リンク、リスト・アイテムおよびいくつかのデータ視覚化コンポーネントを構成できます。

- 右方向にスワイプ

- 左方向にスワイプ

- 上方向にスワイプ

- 下方向にスワイプ

- タップしたまま押さえる

- アクション: ジェスチャーとしては、アクションは基本的なタップを表します。

- 始点方向にスワイプ: このジェスチャーは、右から左(RTL)のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、左方向にスワイプします。

- テキスト方向が右から左である場合、右方向にスワイプします。

- 終点方向にスワイプ: このジェスチャーは、右から左(RTL)のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、右方向にスワイプします。

- テキスト方向が右から左である場合、左方向にスワイプします。

次の操作のtype属性に対して、swipeRight、swipeLeft、swipeUp、swipeDown、swipeStart、swipeEnd、actionおよびtapHold値を定義できます。

- プロパティ・リスナーの設定(第13.3.23項「プロパティ・リスナーの設定の使用方法」を参照)

- アクション・リスナー(第13.3.22項「アクション・リスナーの使用方法」を参照)

- ポップアップ表示動作(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- ポップアップを閉じる動作(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

type属性の値は親コンポーネントに基づいて制限され、リンク(commandLink)およびリスト・アイテム(listItem)コンポーネントに対してのみサポートされています。

注意:
リンク(実行) (linkGo)コンポーネントに対するジェスチャー・サポートはありません。

始点方向にスワイプと終点方向にスワイプは、右から左(RTL)のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点のスワイプ・スタイルを設定することをお薦めします。

次の例は、MAF AMXファイルのtype属性のtapHold値の使用を示しています。この例では、タップしたまま押さえるジェスチャーによってポップアップ・コンポーネントの表示がトリガーされます。

<amx:panelPage id="pp1">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row">
<amx:listItem id="li1" action="gosomewhere">
<amx:outputText id="ot1" value="#{row.description}"/>
<amx:setPropertyListener id="spl1"
from="#{row.rowKey}"
to="#{mybean.currentRow}"
type="tapHold"/>
<amx:showPopupBehavior id="spb1"
type="tapHold"
alignid="pp1"
popupid="pop1"
align="startAfter"/>
</amx:listItem>
</amx:listView>>
</amx:panelPage>
<amx:popup id="pop1">
<amx:panelGroupLayout id="pgl1" layout="horizontal">
<amx:commandLink id="cm1" actionListener="#{mybean.doX}">
<amx:image id="i1" source="images/x.png"/>
<amx:closePopupBehavior id="cpb1" type="action" popupid="pop1"/>
</amx:commandLink>
<amx:commandLink id="cm2" actionListener="#{mybean.doY}">
<amx:image id="i2" source="images/y.png"/>
<amx:closePopupBehavior id="cpb2" type="action" popupid="pop1"/>
</amx:commandLink>
<amx:commandLink id="cm3" actionListener="#{mybean.doZ}">
<amx:image id="i3" source="images/y.png"/>
<amx:closePopupBehavior id="cpb3" type="action" popupid="pop1"/>
</amx:commandLink>
</amx:panelGroupLayout>
</amx:popup>

次の例は、MAF AMXファイル内のswipeRightジェスチャーの使用方法を示しています。

<amx:panelPage id="pp1">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row">
<amx:listItem id="li1" action="gosomewhere">
<amx:outputText id="ot1" value="#{row.description}"/>
<amx:setPropertyListener id="spl1"
from="#{row.rowKey}"
to="#{mybean.currentRow}"
type="swipeRight"/>
<actionListener id="al1" binding="#{mybean.DoX}" type="swipeRight"/>
</amx:listItem>
</amx:listView>>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

GestureDemoという名前のMAFサンプル・アプリケーションは、様々なMAF AMX UIコンポーネントでのジェスチャーの使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

13.5 データ視覚化の指定

MAFでは、MAF AMXアプリケーション機能でデータを表すための様々なチャート、ゲージおよびマップを作成するために使用できる一連のデータ視覚化コンポーネントを採用しています。MAF AMXファイルの<dvtm>ネームスペースの下で次の要素を宣言できます。

- areaChart (第13.5.1項「面グラフの作成方法」を参照)

- barChart (第13.5.2項「棒グラフの作成方法」を参照)

- bubbleChart (第13.5.3項「バブル・チャートの作成方法」を参照)

- comboChart (第13.5.4項「コンボ・チャートの作成方法」を参照)

- lineChart (第13.5.5項「線グラフの作成方法」を参照)

- pieChart (第13.5.6項「円グラフの作成方法」を参照)

- scatterChart (第13.5.7項「散布図の作成方法」を参照)

- sparkChart (第13.5.8項「スパーク・チャートの作成方法」を参照)

- funnelChart (第13.5.9項「ファンネル・チャートの作成方法」を参照)

- ledGauge (第13.5.12項「LEDゲージの作成方法」を参照)

- statusMeterGauge (第13.5.13項「ステータス・メーター・ゲージの作成方法」を参照)

- dialGauge (第13.5.14項「ダイアル・ゲージの作成方法」を参照)

- ratingGauge (第13.5.15項「評価ゲージの作成方法」を参照)

- geographicMap (第13.5.17項「地理マップ・コンポーネントの作成方法」を参照)

- thematicMap (第13.5.18項「テーマ・マップ・コンポーネントの作成方法」を参照)

- treemap (第13.5.20項「ツリーマップ・コンポーネントの作成方法」を参照)

- sunburst (第13.5.21項「サンバースト・コンポーネントの作成方法」を参照)

- timeline (第13.5.22項「時系列コンポーネントの作成方法」を参照)

- nBox (第13.5.23項「NBoxコンポーネントの作成方法」を参照)

チャート、ゲージ、マップおよび拡張コンポーネントの要素には、それらのすべてまたはほとんどに共通する複数の属性があります。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

JDeveloperでは、データ視覚化コンポーネントは「コンポーネント」ウィンドウの次の場所にあります。

- チャート・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「チャート」の下にあります。

- ゲージ・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「ゲージ」の下にあります。

- マップ・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「マップ」の下にあります。

- ツリーマップ、サンバースト、時系列およびNBoxは、「MAF AMXデータ視覚化」→「共通」→「その他」の下にあります。

図13-68 「コンポーネント」ウィンドウのデータ視覚化コンポーネント

データ視覚化コンポーネントをドラッグ・アンド・ドロップすると、次のいずれかに似たダイアログが開き、作成しているコンポーネントのタイプに関する情報が表示されます。

- モバイル・チャートの作成 (図13-69を参照)

図13-69 チャートの作成コンポーネント

- モバイル・ゲージの作成 (図13-70を参照)

図13-70 ゲージの作成コンポーネント

- コンポーネント・ギャラリ (図13-71を参照)

図13-71 マップの作成コンポーネント

- 「サンバーストの作成」または「ツリーマップ」(図13-70を参照)

図13-72 サンバーストの作成

注意:
コンポーネントの作成後、ソース・エディタまたは「構造」ビューでそのコンポーネントを選択し、「プロパティ」ウィンドウで「コンポーネント定義の編集」をクリックすることによって、作成ダイアログを再起動できます。
「プロパティ」ウィンドウで提供される同一の編集機能を使用すると、いくつかのデータ視覚化コンポーネントの子コンポーネント(データ・ポイント・レイヤーなど)を編集できます。

CompGalleryという名前のMAFサンプル・アプリケーションは、MAF AMXアプリケーション機能での様々なデータ視覚化コンポーネントの使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

MAF AMXデータ視覚化コンポーネントの詳細は、次を参照してください。

- イベント・リスナーをデータ視覚化コンポーネントに追加する方法の詳細は、第13.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもMAF AMXランタイムの記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

- 「データ・コントロール」ウィンドウから作成されるデータバインドされたデータ視覚化コンポーネントの詳細は、第13.5.25項「データバインドされたデータ視覚化コンポーネントの作成方法」を参照してください。

- チャートやその他のデータ視覚化コンポーネント用の静的データの提供方法の詳細は、第13.5.26項「静的データに基づいたデータ視覚化コンポーネントの作成方法」」を参照してください。

- チャート・コンポーネントのインタラクティブ性の詳細は、第13.5.27項「チャート・コンポーネントのインタラクティブ性の有効化方法」を参照してください。

- 極チャートの作成の詳細は、第13.5.28項「極チャートの作成方法」を参照してください。

- データ視覚化コンポーネントにおけるアクセシビリティのサポートの詳細は、第13.8項「MAFのアクセシビリティのサポートの理解」を参照してください。

- MAF AMXデータ視覚化コンポーネントの使用上の制約の詳細は、第E.6.2項「データ視覚化コンポーネントの制限」を参照してください。

13.5.1 面グラフの作成方法

面グラフ(areaChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けれされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、面の色やパターンなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。カスタム系列スタイルの定義の詳細は、第13.5.5項「線グラフの作成方法」を参照してください。

面グラフは、そのX軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

次の例は、MAF AMXファイルで定義されたareaChart要素を示しています。デフォルト系列スタイルで基本的な面グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

<dvtm:areaChart id="areaChart1"
value="#{bindings.lineData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
animationOnDisplay="auto"
animationDuration="1500" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="areaChartItem1"                          series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<dvtm:yAxis id="yAxis1"
axisMaxValue="80.0"
majorIncrement="20.0"
title="yAxis Title" />
<dvtm:legend id="l1" position="end" />
</dvtm:areaChart>

図13-73 デザインタイムの面グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: このデータ・アイテムが属する系列の名前。

- group: このデータ・アイテムが属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやmarkerShapeなどの他のプロパティも含めることもできます。

次の例に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、chartDataItemのcolor属性およびmarkerShape属性は、追加のグループ化式に基づいて設定されます。

attributeGroups設定はデータ視覚化コンポーネント間で共有でき、属性値は対象のコンポーネント全体に自動的に適用されます。この機能を有効にするには、attributeGroupsのdiscriminant属性を設定します。同じdiscriminant値を持つコンポーネントは各自の設定(attributeGroupsのattributeMatchRule子要素の値など)を共有します。

attributeGroupsは、次の子要素を持つことができます。

- dvtmネームスペースのattributeExceptionRule: 特定のブール条件が満たされる場合に、属性値を別の値に置き換えます。

- dvtmネームスペースのattributeMatchRule: データが特定の値に一致する場合に属性を置き換えます。

- amxネームスペースのattribute。

<dvtm:areaChart id="areaChart1"
value="#{bindings.lineData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
title="Chart Title"
animationOnDisplay="auto"
animationDuration="1500" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
<dvtm:attributeGroups id="ag1"
type="color"
value="#{row.brand}" />
</amx:facet>
<dvtm:yAxis id="yAxis1"
axisMaxValue="80.0"
majorIncrement="20.0"
title="yAxis Title" />
<dvtm:legend id="l1" position="end" />
</dvtm:areaChart>

注意:
前の例および図13-73では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

orientation属性では、面グラフを水平方向または垂直方向として定義できます。

このコンポーネントに定義できるareaChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、面グラフ・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-areaChart
- supported properties: all

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.2 棒グラフの作成方法

棒グラフ(barChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを垂直の棒として視覚的に表すために使用します。系列は、個々のデータ・アイテムごとではなく系列レベルで適用する必要があるいくつかの一般的なスタイル・プロパティを持つグラフィカル要素を使用して視覚化されます。

棒グラフは、そのX軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

次の例は、MAF AMXファイルで定義されたbarChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。

<dvtm:barChart id="barChart1"
value="#{bindings.barData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
animationOnDisplay="zoom"
animationDuration="3000" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<dvtm:yAxis id="yAxis1"
axisMaxValue="80.0"
majorIncrement="20.0"
title="yAxis Title" />
<dvtm:legend id="l1" position="start" />
</dvtm:barChart>

図13-74 デザインタイムの棒グラフ

棒グラフのデータ・モデルは、個々の棒を記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- series: この棒が属する系列の名前。

- group: この棒が属するグループの名前。

- value: データ・アイテムの値(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

orientation属性では、棒グラフを水平方向または垂直方向として定義できます。

このコンポーネントに定義できるbarChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、棒グラフ・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-barChart
- supported properties: all

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.3 バブル・チャートの作成方法

バブル・チャート(bubbleChart)は、各データ・アイテムがx、y座標とサイズ(バブル)を持つ一連のデータ・アイテムを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(第13.5.5項「線グラフの作成方法」を参照)や面グラフ(第13.5.1項「面グラフの作成方法」を参照)と異なり、バブル・チャートには系列およびグループの厳密な概念がありません。

バブル・チャートは、そのXおよびY軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

次の例は、MAF AMXファイルで定義されたbubbleChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。各データ・アイテムのcolorおよびmarkerShape属性は、データ・モデルで提供されている値に基づいて個別に設定されます。また、基礎となるデータ・コントロールでは、row.label、row.sizeおよびrow.shapeの変数参照がそれぞれサポートされている必要があります。

<dvtm:bubbleChart id="bubbleChart1"
value="#{bindings.bubbleData.collectionModel}"
inlineStyle="width: 400px; height: 300px;"
dataSelection="multiple"
rolloverBehavior="dim"
animationOnDisplay="auto"
var="row">
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
group="#{row.group}"
x="#{row.x}"
y="#{row.y}"
markerSize="#{row.size}"
color="#{row.color}"
markerShape="#{row.shape}" />
</amx:facet>
</dvtm:bubbleChart>

図13-75 デザインタイムのバブル・チャート

次の例では、attributeGroups要素はデータ・アイテムの関連グループの共通スタイル属性の設定に使用されます。

<dvtm:bubbleChart id="bubbleChart1"
value="#{bindings.bubbleData.collectionModel}"
dataSelection="multiple"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Bubble Chart"
var="row">
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
group="#{row.label}"
x="#{row.x}"
y="#{row.y}" >
<dvtm:attributeGroups id="ag1" type="color" value="#{row.category}" />
<dvtm:attributeGroups id="ag2" type="shape" value="#{row.brand}" />
</dvtm:chartDataItem>
</amx:facet>
</dvtm:bubbleChart>

バブル・チャートのデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- label: データ・アイテム・ラベル(オプション)。

- x、y: 値の座標(必須)。

- z: データ・アイテムのサイズ(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

このコンポーネントに定義できるbubbleChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、バブル・チャート・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-bubbleChart
- supported properties: all

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.4 コンボ・チャートの作成方法

コンボ・チャート(comboChart)は、折れ線と棒のグラフなど、2つ以上の異なるグラフを重ねたものを表します。

次の例は、MAF AMXファイルで定義されたcomboChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。seriesStampファセットは、系列のデフォルト・スタイル・プロパティをオーバーライドし、seriesStyle要素を使用してカスタム系列スタイルを設定します。

<dvtm:comboChart id="comboChart1"
value="#{bindings.barData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
animationOnDisplay="auto"
animationDuration="1500" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle id="seriesStyle1"
series="#{row.series}"
type="bar"
rendered="#{(row.series eq 'Series 1') or
(row.series eq 'Series 2') or
(row.series eq 'Series 3')}" />
<dvtm:seriesStyle id="seriesStyle2"
series="#{row.series}"
type="line"
lineWidth="5"
rendered="#{(row.series eq 'Series 4') or
(row.series eq 'Series 5')}" />
</amx:facet>
<dvtm:yAxis id="yAxis1"
axisMaxValue="80.0"
majorIncrement="20.0"
title="yAxis Title" />
<dvtm:legend position="start" id="l1" />
</dvtm:comboChart>

図13-76 デザインタイムのコンボ・チャート

orientation属性では、コンボ・チャートを水平方向または垂直方向として定義できます。

このコンポーネントに定義できるcomboChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、コンボ・チャート・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-comboChart
- supported properties: all

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.5 線グラフの作成方法

線グラフ(lineChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、線の色、太さ、スタイルなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。

線グラフは、そのX軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

次の例は、MAF AMXファイルで定義されたlineChart要素を示しています。デフォルト系列スタイルで基本的な線グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}"
color="#{row.color}" />
</amx:facet>
</dvtm:lineChart>

図13-77 デザインタイムの線グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: この線が属する系列の名前。

- group: この線が属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやmarkerShapeなどの他のプロパティも含めることもできます。

次の例に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、データ・アイテムのcolorおよびshape属性が、追加のグループ化式に基づいて設定されます。attributeGroupsは、次の子要素を持つことができます。

- dvtmネームスペースのattributeExceptionRule: 特定のブール条件が満たされる場合に、属性値を別の値に置き換えます。

- dvtmネームスペースのattributeMatchRule: データが特定の値に一致する場合に属性を置き換えます。

- amxネームスペースのattribute。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
<dvtm:attributeGroups id="ag1"
type="color"
value="#{row.brand}" />
</dvtm:chartDataItem>
</amx:facet>
</dvtm:lineChart>

注意:
次の2つの例では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

系列のデフォルト・スタイル・プロパティをオーバーライドするには、次の例に示すように、オプションのseriesStampファセットを定義し、seriesStamp要素を使用してカスタム系列スタイルを設定します。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="#{row.series}"
lineStyle="#{row.lineStyle}"
lineWidth="#{row.lineWidth}" />
</amx:facet>
</dvtm:lineChart>

前述の例では、seriesStyle要素がseries属性の値に基づいてグループ化されています。同じ名前を持つ系列は、seriesStyleの他の属性(color、lineStyle、lineWidthなど)によって定義された、同じプロパティ・セットを共有する必要があります。MAF AMXでは、同じ系列名を持つ異なる属性値を検出した場合、前回処理された値を適用します。

かわりに、次の例に示すように、seriesStyle要素のrendered属性を使用して、MAF AMXチャートで系列スタイルを制御できます。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}"
color="#{row.color}" />
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="#{row.series}"
color="red"
lineWidth="3"
lineStyle="solid"
rendered="#{row.series == 'Coke'}" />
<dvtm:seriesStyle series="#{row.series}"
color="blue"
lineWidth="2"
lineStyle="dotted"
rendered="#{row.series == 'Pepsi'}" />
</amx:facet>
</dvtm:lineChart>

orientation属性では、線グラフを水平方向または垂直方向として定義できます。

このコンポーネントに定義できるlineChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、線グラフ・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-lineChart
- supported properties: all

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.6 円グラフの作成方法

円グラフ(pieChart)は、各データ・アイテムを円セグメント(区分)で表したデータの比率による区分を示すために使用します。区分はサイズ別に(最大から最小へと)ソートでき、小さい区分は他の単一の区分に集約できます。

次の例は、MAF AMXファイルで定義されたpieChart要素を示しています。dataStampファセットは、ネストされたpieDataItem要素とともに指定されます。

<dvtm:pieChart id="pieChart1"
inlineStyle="width: 400px; height: 300px;"
value="#{bindings.pieData.collectionModel}"
var="row"
animationOnDisplay="zoom"
animationDuration="3000" >
<amx:facet name="dataStamp">
<dvtm:pieDataItem id="pieDataItem1"
label="#{row.name}"
value="#{row.data}" />
</amx:facet>
<dvtm:legend position="bottom" id="l1" />
</dvtm:pieChart>

図13-78 デザインタイムの円グラフ

円グラフの区分ラベルの位置を構成するには、sliceLabelPosition属性を使用します。デフォルト(auto)で、区分内にラベルが収まる場合、ラベルは区分の内側に配置されます。それ以外は、区分の外側に配置されます。

selectionEffect属性を設定することにより、円グラフ・コンポーネントの展開(区分の間隔)効果を定義することもできます。

円グラフのデータ・モデルは、個々の円データ・アイテムを定義するアイテムのコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- label: 区分ラベル。

- value: 区分の値。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: 区分の境界線の色。

- color: 区分の色。

- explode: 区分を開くときのオフセット。

このコンポーネントに定義できるpieChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、pieDataItemを子として含めることができます(第13.5.16.4項「円グラフのデータ・アイテムの定義」を参照)。

13.5.6.1 円グラフをドーナツ・グラフとして構成

中心が空洞のドーナツのような円グラフ・コンポーネントを作成できます。空いている領域(と、結果的にはドーナツの幅)のサイズを構成するには、pieChartのinnerRadius属性を使用します。また、ドーナツの中心部のテキストを指定するには、centerLabel属性を設定します。

図13-79 デザインタイムのドーナツ・グラフ

13.5.6.2 円グラフのスタイル設定

dvtm-pieChart、dvtm-chartPieLabel、dvtm-chartPieCenterLabelおよびdvtm-chartSliceLabelクラスで定義されているデフォルトのCSS設定を上書きすることで、円グラフ・コンポーネントのスタイルを設定できます。

- 最上位要素のスタイルは、次のものを使用して設定できます。

.dvtm-pieChart
- supported properties: all

- 円グラフのラベルのスタイルは、次のものを使用して設定できます。

.dvtm-chartPieLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

- 円グラフの区分のラベルのスタイルは、次のものを使用して設定できます。

.dvtm-chartSliceLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

- ドーナツ・グラフの中心部のラベルのスタイルは、次のものを使用して設定できます。

.dvtm-chartPieCenterLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.7 散布図の作成方法

散布図(scatterChart)は、各アイテムがx、y座標とサイズを持つデータ・アイテムを表す連続しないドットでデータを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(第13.5.5項「線グラフの作成方法」を参照)や面グラフ(第13.5.1項「面グラフの作成方法」を参照)と異なり、散布図には系列およびグループの厳密な概念がありません。

散布図は、そのXおよびY軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

次の例は、MAF AMXファイルで定義されたscatterChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。各データ・アイテムのcolorおよびmarkerShape属性は、データ・モデルで提供されている値に基づいて個別に設定されます。

<dvtm:scatterChart id="scatterChart1"
inlineStyle="width: 400px; height: 300px;"
animationOnDisplay="zoom"
animationDuration="3000"
value="#{bindings.scatterData.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
group="#{row.group}"
color="#{row.color}"
markerShape="auto"
x="#{row.data.x}"
y="#{row.data.y}">
<dvtm:attributeGroups type="color"
value="#{row.series}"
id="ag1" />
</dvtm:chartDataItem>
</amx:facet>
<dvtm:xAxis id="xAxis1" title="X Axis Title" />
<dvtm:yAxis id="xAxis2" title="Y Axis Title" />
<dvtm:legend position="bottom" id="l1" />
</dvtm:scatterChart>

図13-80 デザインタイムの散布図

散布図のデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。各データ・アイテムの属性は、スタンプ(dataStamp)によって定義され、通常、次のものがあります。

- x、y: 値の座標(必須)。

- markerSize: マーカーのサイズ(オプション)。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: データ・アイテムの境界線の色。

- color: データ・アイテムの色。

このコンポーネントに定義できるscatterChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、散布図コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-scatterChart
- supported properties: all

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.8 スパーク・チャートの作成方法

スパーク・チャート(sparkChart)は、傾向や変化を、多くの場合、表の列内で表す簡単な縮小グラフです。このチャートは、多くの場合、データ密度の濃い表示に追加のコンテキストを提供するためにダッシュボードで使用されます。

次の例は、MAF AMXファイルで定義されたsparkChart要素を示しています。dataStampファセットは、ネストされたsparkDataItem要素とともに指定されます。

<dvtm:sparkChart id="sparkChart1"
value="#{bindings.sparkData.collectionModel}"
var="row"
type="line"
inlineStyle="width:400px; height:300px; float:left;">
<amx:facet name="dataStamp">
<dvtm:sparkDataItem id="sparkDataItem1" value="#{row.value}" />
</amx:facet>
</dvtm:sparkChart>

図13-81 デザインタイムのスパーク・チャート

スパーク・チャートのデータ・モデルは、個々のスパーク・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: スパーク値。

sparkChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、sparkDataItemを子として含めることができます(第13.5.16.5項「スパーク・チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、スパーク・チャート・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-sparkChart
- supported properties: all

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.9 ファンネル・チャートの作成方法

ファンネル・チャート(funnelChart)コンポーネントは、プロセスのステップに関するデータを視覚的に表現します。ステップは、横向きの円柱に対する縦向きのスライスとして表されます。特定のステップ(スライス)の実際の値がそのスライスの割当てに近づいた分、スライスが塗りつぶされます。通常、ファンネル・チャートには、時間などのステージ値に対する実績値と目標値が必要です。

次の例は、MAF AMXファイルで定義されたfunnelChart要素を示しています。dataStampファセットは、ネストされたfunnelDataItem要素とともに指定されます。

<dvtm:funnelChart id="funnelChart1"
var="row"
value="#{bindings.funnelData.collectionModel}"
styleClass="dvtm-gallery-component"
sliceGaps="on"
threeDEffect="#{pageFlowScope.threeD ? 'on' : 'off'}"
orientation="#{pageFlowScope.orientation}"
dataSelection="#{pageFlowScope.dataSelection}"
footnote="#{pageFlowScope.footnote}"
footnoteHalign="#{pageFlowScope.footnoteHalign}"
hideAndShowBehavior="#{pageFlowScope.hideAndShowBehavior}"
rolloverBehavior="#{pageFlowScope.rolloverBehavior}"
seriesEffect="#{pageFlowScope.seriesEffect}"
subtitle="#{pageFlowScope.titleDisplay ?
pageFlowScope.subtitle : ''}"
title="#{pageFlowScope.titleDisplay ? pageFlowScope.title : ''}"
titleHalign="#{pageFlowScope.titleHalign}"
animationOnDataChange="#{pageFlowScope.animationOnDataChange}"
animationDuration="#{pageFlowScope.animationDuration}"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
shortDesc="#{pageFlowScope.shortDesc}">
<amx:facet name="dataStamp">
<dvtm:funnelDataItem id="funnelDataItem1"
label="#{row.label}"
value="#{row.value}"
targetValue="#{row.targetValue}"
color="#{row.color}"
shortDesc="This is a tooltip">
</dvtm:funnelDataItem>
</amx:facet>
<dvtm:legend id="l1"
position="#{pageFlowScope.legendPosition}"
rendered="#{pageFlowScope.legendDisplay}"/>
</dvtm:funnelChart>

図13-82 デザインタイムのファンネル・チャート

ファンネル・チャートのデータ・モデルは、個々のファンネル・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: ファンネル値

- label: ファンネル区分ラベル

funnelChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、funnelDataItemを子として含めることができます(第13.5.16.6項「ファンネル・データ・アイテムの定義」を参照)。

dvtm-funnelChartおよびdvtm-funnelDataItemクラスで定義されているデフォルトのCSS設定を上書きすることで、ファンネル・チャート・コンポーネントのスタイルを設定できます。

- 最上位要素のスタイルは、次のものを使用して設定できます。

.dvtm-funnelChart
- supported properties: all

- ファンネル・チャート・データ・アイテムのスタイルは、次のものを使用して設定できます。

.dvtm-funnelDataItem
- supported properties: border-color, background-color

チャートのスタイル設定の詳細は、第13.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.10 チャート・コンポーネントのスタイル設定方法

スパーク・チャートを除き、次のクラスで定義されているデフォルトのCSS設定を上書きすることで、チャート・コンポーネントのスタイルを設定できます。

- チャート・コンポーネントの凡例のスタイルは、次のものを使用して設定できます。

.dvtm-legend
- supported properties used for text styling:
font-family, font-size, font-weight, color, font-style
- supported properties used for background styling: background-color
- supported properties used for border styling:
border-color (used when border width > 0)

.dvtm-legendTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-legendSectionTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

- チャート・コンポーネントのタイトルやサブタイトルなどのスタイルは、次のものを使用して設定できます。

.dvtm-chartTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartSubtitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartFootnote
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartTitleSeparator
- supported properties:
visibility (is title separator rendered),
border-top-color, border-bottom-color

- チャート・コンポーネントの軸のスタイルは、次のものを使用して設定できます。

.dvtm-chartXAxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartYAxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartY2AxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartXAxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartYAxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartY2AxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

チャート・コンポーネントの最上位要素のスタイル設定に加えて、一部のチャートでは特定の子要素のスタイルを設定できます。

13.5.11 チャート・コンポーネントでのイベントの使用方法

ViewportChangeEventを使用して、チャート・コンポーネントのズームおよびスクロールを操作できます。ズームまたはスクロールのいずれかが発生すると、新しいビューポートを定義する情報がロードされたイベントがコンポーネントによって起動されます。

viewportChangeListenerは、面グラフ、棒グラフ、コンボ・チャートおよび線グラフ・コンポーネントの属性として指定できます。

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- Oracle Mobile Application Framework Oracle Fusion Middleware Java APIリファレンス

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

13.5.12 LEDゲージの作成方法

チャートと異なり、ゲージでは、単一のデータ・ポイントを重視し、そのポイントを最小、最大およびしきい値インジケータと比較して問題領域を識別します。LED(電光表示)ゲージ(ledGauge)は、重要業績評価指標(KPI)などの測定値をグラフィカルに表します。LEDゲージには、いくつかのスタイルがあります。矢印付きのものは、よい(上矢印)、普通(右または左矢印)および悪い(下矢印)を示すために使用されます。ゲージのしきい値はいくつでも指定できます。ただし、一部のLEDゲージ(矢印または三角形のインジケータを持つものなど)では、指し示す有効な方向の数が限られているため、サポートされるしきい値の数にかぎりがあります。矢印または三角形のインジケータの場合、しきい値の最大数は3です。

次の例は、MAF AMXファイルで定義されたledGauge要素を示しています。

<dvtm:ledGauge id="ledGauge1"
value="65"
type="circle"
inlineStyle="width: 100px; height: 80px; float: left;
border-color: navy; background-color: lightyellow;">
<dvtm:threshold id="threshold1" text="Low" maxValue="40" />
<dvtm:threshold id="threshold2" text="Medium" maxValue="60" />
<dvtm:threshold id="threshold3" text="High" maxValue="80" />
</dvtm:ledGauge>

図13-83 デザインタイムのLEDゲージ

LEDゲージのデータ・モデルは、value属性で指定される単一のメトリック値で表されます。

このコンポーネントに定義できるledGaugeの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次のamx子要素を定義できます。

- showPopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第13.9項「入力の検証」を参照)

13.5.13 ステータス・メーター・ゲージの作成方法

ステータス・メーター・ゲージ(statusMeterGauge)は、矩形の水平バーまたは円に沿ってタスクの進捗状況または測定値のレベルを示します。コンポーネントのある部分が、別の部分に示されている範囲に対する現在の測定値のレベルを示します。また、しきい値は、サイズ変更が可能なインジケータの背後に表示できます。

MAF AMXのデータ視覚化のステータス・メーター・ゲージ・コンポーネントでは、参照線(referenceLine)のサポートが提供されます。この参照線を使用して、ブレット・グラフを生成できます。

次の例は、MAF AMXファイルで定義されたstatusMeterGauge要素を示しています。

<dvtm:statusMeterGauge id="meterGauge1"
value="65"
animationOnDisplay="auto"
animationDuration="1000"
inlineStyle="width: 300px;
height: 30px;
float: left;
border-color: black;
background-color: lightyellow;"
minValue="0"
maxValue="100">
<dvtm:metricLabel/>
<dvtm:threshold id="threshold1" text="Low" maxValue="40" />
<dvtm:threshold id="threshold2" text="Medium" maxValue="60" />
<dvtm:threshold id="threshold3" text="High" maxValue="80" />
</dvtm:statusMeterGauge>

図13-84 デザインタイムの矩形のステータス・メーター・ゲージ

垂直の矩形で表したステータス・メーター・ゲージを作成するには、そのorientation属性をverticalに設定します。デフォルトでは、この属性はhorizontalに設定されており、横長の矩形が表示されます。

円で表されるステータス・メーター・ゲージを作成するには(図13-85を参照)、そのorientation属性をcircularに設定します。

図13-85 デザインタイムの円形のステータス・メーター・ゲージ

ステータス・メーター・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに定義できるstatusMeterGaugeの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次のamx子要素を定義できます。

- showPopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第13.9項「入力の検証」を参照)

13.5.14 ダイアル・ゲージの作成方法

ダイアル・ゲージ(dialGauge)は、悪いからよいまで変化する値(しきい値)の範囲を指定します。ゲージのインジケータではメトリックの現在の値が示される一方、図形によってその値のステータスを評価できます。

次の例は、MAF AMXファイルで定義されたdialGauge要素を示しています。

<dvtm:dialGauge id="dialGauge1"
background="#{pageFlowScope.background}"
indicator="#{pageFlowScope.indicator}"
value="#{pageFlowScope.value}"
minValue="#{pageFlowScope.minValue}"
maxValue="#{pageFlowScope.maxValue}"
animationDuration="1000"
animationOnDataChange="auto"
animationOnDisplay="auto"
shortDesc="#{pageFlowScope.shortDesc}"
inlineStyle="#{pageFlowScope.inlineStyle}"
styleClass="#{pageFlowScope.styleClass}"
readOnly="true">
</dvtm:dialGauge>

図13-86 デザインタイムのダイアル・ゲージ

ダイアル・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに定義できるdialGaugeの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次の例は、暗い背景テーマと、-5000から5000の範囲を設定するカスタム・ティック・ラベルを備えたdialGauge要素の定義を示しています。

<dvtm:dialGauge id="dialGauge1"
background="circleDark"
indicator="needleDark"
value="#{pageFlowScope.value}"
minValue="-5000"
maxValue="5000"
readOnly="false">
<dvtm:metricLabel id="metricLabel1"
scaling="thousand"
labelStyle="font-family: Arial, Helvetica;
font-size: 20; color: white;"/>
<dvtm:tickLabel id="tickLabel1"
scaling="thousand"
labelStyle="font-family: Arial, Helvetica;
font-size: 18; color: white;"/>
</dvtm:dialGauge>

図13-87 デザインタイムのメトリックとティック・ラベル付きダイアル・ゲージ

dialGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第13.9項「入力の検証」を参照)

13.5.15 評価ゲージの作成方法

評価ゲージ(ratingGauge)を使用すると、事前定義された視覚スケールに評価を表示したり、その評価を変更できます。デフォルトの評価単位は、星で表されます。ratingGaugeのshape属性を設定することによって、この単位を円、矩形、星形、三角形またはひし形として構成できます。

次の例は、MAF AMXファイルで定義されたratingGauge要素を示しています。

<dvtm:ratingGauge id="ratingGauge1"
value="#{pageFlowScope.value}"
minValue="0"
maxValue="5"
inputIncrement="full"
shortDesc="#{pageFlowScope.shortDesc}"
inlineStyle="#{pageFlowScope.inlineStyle}"
readOnly="true"
shape="circle"
unselectedShape="circle">
</dvtm:ratingGauge>

図13-88 デザインタイムの評価ゲージ

評価ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに定義できるratingGaugeの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

ratingGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第13.9項「入力の検証」を参照)

13.5.15.1 評価ゲージ・コンポーネントへのカスタム・スタイルの適用

エンド・ユーザーが評価ゲージ・コンポーネントに対して実行したアクションに応じて、評価単位(イメージ)は次のいずれかの状態を取得できます。

- selected: 単位を選択した場合。

- unselected: 単位を選択しなかった場合。

- changed: 単位を変更した場合。

- hover: 単位にマウスを置いた場合。

注意:
タッチ・インタフェースを使用するモバイル・デバイスでは、hover状態はタップしたまま押さえるジェスチャーを通じて呼び出されます。

各状態は、独自のイメージの配列と、色および枠線の色を定義するプロパティで表現できます。

デフォルトでは、ratingGaugeのshape属性によって、hoverおよびchanged状態の選択内容が決まります。unselected状態は、ratingGaugeのunselectedShape属性を使用して個別に設定できます。

デフォルトCSS設定を上書きすることで、評価ゲージ・コンポーネントをスタイル設定できます。CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次に、評価ゲージ単位の各状態のcolorおよびborderColorに対するデフォルトCSSスタイル定義を示します。

.dvtm-ratingGauge {
}

.dvtm-ratingGauge .dvtm-ratingGaugeSelected {
border-width: 1px;
border-style: solid;
border-color: #FFC61A;
color: #FFBB00;
}

.dvtm-ratingGauge .dvtm-ratingGaugeUnselected {
border-width: 1px;
border-style: solid;
border-color: #D3D3D3;
color: #F4F4F4;
}

.dvtm-ratingGauge .dvtm-ratingGaugeHover {
border-width: 1px;
border-style: solid;
border-color: #6F97CF;
color: #7097CF;
}

.dvtm-ratingGauge .dvtm-ratingGaugeChanged {
border-width: 1px;
border-style: solid;
border-color: #A8A8A8;
color: #FFBB00;
}

13.5.16 チャートおよびゲージ・コンポーネントの子要素の定義方法

チャートおよびゲージには様々な子要素を定義できます。それらの子要素のいくつかを次に示します。

- chartDataItem (第13.5.16.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (see 第13.5.16.3項「X軸、Y軸およびY2軸の定義および構成」を参照)

- legend (第13.5.16.2項「凡例の定義および構成」を参照)

- pieDataItem (第13.5.16.4項「円グラフのデータ・アイテムの定義」を参照)

- sparkDataItem (第13.5.16.5項「スパーク・チャートのデータ・アイテムの定義」を参照)

- threshold (第13.5.16.7項「しきい値の定義」を参照)

- funnelDataItem

これらおよびその他の子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

JDeveloperでは、データ視覚化コンポーネントの子コンポーネントは、「コンポーネント」ウィンドウの「MAF AMXデータ視覚化」→「共有子タグ」の下および「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」の下にあります(図13-68を参照)。

図13-89 チャートおよびゲージの子コンポーネントの作成

13.5.16.1 チャートのデータ・アイテムの定義

チャート・データ・アイテム(chartDataItem)要素は、円グラフを除くすべてのサポートされているチャートでチャート・データ・アイテムが使用するパラメータを指定します。

chartDataItem要素の関連する属性およびチャート自体のdataLabelPosition属性を設定して、特定のチャートのすべてのデータ・ラベルの位置を指定することにより、チャート・データ・アイテムのテキスト表示を有効にし、そのラベル、ラベル位置およびラベル・スタイルを制御できます。

注意:
スパーク・チャート、円グラフおよびファンネル・チャート・コンポーネントでは、dataLabelPosition属性はサポートされません。

chartDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.16.2 凡例の定義および構成

凡例(legend)要素は、凡例パラメータを指定します。

凡例用のグラフ領域のサイズをカスタマイズするには、凡例コンポーネントのsize属性とmaxSize属性を使用します。

legend要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.16.3 X軸、Y軸およびY2軸の定義および構成

X軸(xAxis)およびY軸(yAxis)要素は、チャートのX軸とY軸を定義します。Y2軸(y2Axis)は、オプションのY2軸を定義します。これらの要素は、MAF AMXファイルで次のように宣言されます。

<dvtm:xAxis id="xAxis1" scrolling="on" axisMinValue="0.0" axisMaxValue="50.0" />

軸用のグラフ領域のサイズをカスタマイズするには、X軸、Y軸およびY2軸コンポーネントのsize属性とmaxSize属性を使用します。また、軸ベースラインの色、幅およびスタイルをカスタマイズするには、その主ティック子要素を構成します。

属性と、xAxis、yAxisおよびy2Axis要素の子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.16.4 円グラフのデータ・アイテムの定義

円グラフのデータ・アイテム(pieDataItem)要素は、円グラフの区分のパラメータを指定します(第13.5.6項「円グラフの作成方法」を参照)。

pieDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.16.5 スパーク・チャートのデータ・アイテムの定義

スパーク・チャートのデータ・アイテム(sparkDataItem)要素は、スパーク・チャート・アイテムのパラメータを指定します(第13.5.8項「スパーク・チャートの作成方法」を参照)。

sparkDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.16.6 ファンネル・データ・アイテムの定義

ファンネル・データ・アイテム(funnelDataItem)要素は、ファンネル・チャート・アイテムのパラメータを指定します(第13.5.9項「ファンネル・チャートの作成方法」を参照)。

funnelDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.16.7 しきい値の定義

しきい値(threshold)要素は、ゲージのしきい値範囲を指定します(第13.5.12項「LEDゲージの作成方法」および第13.5.13項「ステータス・メーター・ゲージの作成方法」を参照)。

threshold要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.17 地理マップ・コンポーネントの作成方法

地理マップ(geographicMap)は、1つのマップに重ね合せた1つ以上のインタラクティブな情報レイヤーでビジネス・データを表します。このコンポーネントを構成して、GoogleマップまたはOracleマップのいずれかをマップ・プロバイダとして 使用できます(第13.5.17.1項「地理プロバイダ情報を指定した地理マップ・コンポーネントの構成」を参照)。

次の例は、MAF AMXファイルで定義されたgeographicMap要素を示しています。

<dvtm:geographicMap id="g1" mapType="ROADMAP"
centerX="-98.57" centerY="39.82"
zoomLevel="2" initialZooming="auto">
<dvtm:pointDataLayer id="pdl1"
var="row"
value="#{bindings.locationData.collectionModel}"
dataSelection="multiple"
selectionListener="#{myBean.doSomeGood}">
<dvtm:pointLocation id="pl1" type="address" address="#{row.address}">
<dvtm:marker shortDesc="#{row.shortDesc}" id="m1" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:geographicMap>

図13-90 デザインタイムの地理マップ

geographicMapに対してpointDataLayer子要素を定義できます。pointDataLayerによって、マップ上の点と関連付けられたデータを表示できます。pointDataLayerは子要素としてpointLocationを持つことができます。pointLocationは、データ・ポイントの位置を決定するデータ・レイヤーのモデル内の列を指定します。これらの位置は、住所またはX座標とY座標で表すことができます。

pointLocationは、子要素としてmarkerを持つことができます。markerは、マップ上のデータ・ポイントに関連付けられた組込み形状またはカスタム形状をスタンプ・アウトするために使用します。markerでは、マーカーとしてレンダリングされるイメージのURIを指定するための一連のプロパティがサポートされています。マーカーは子要素としてconvertNumberを持つことができます(第13.3.26項「数値の変換方法」を参照)。また、ポップアップ(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)を有効にして、geographicMapのmarkerに表示されるようにできます。そのためには、次の例に示すように、showPopupBehavior要素をmarker要素の子として宣言し、showPopupBehaviorのalignId属性をmarkerのid属性の値に設定します。

<dvtm:geographicMap id="geographicMap_1" shortDesc="#{pageFlowScope.shortDesc}">
<dvtm:pointDataLayer id="pdl1"
var="row"
value=
"#{bindings.geographicMapPointData.collectionModel}">

<dvtm:pointLocation id="pl1"
pointX="#{row.pointX}"
pointY="#{row.pointY}">
<dvtm:marker id="marker1"
shortDesc="#{row.shortDesc}"
rendered="true">
<amx:showPopupBehavior id="spb1"
popupId="popup1"
alignId="marker1"
align="topCenter"
decoration="anchor"/>
<amx:setPropertyListener from="#{row.shortDesc}"
to="#{pageFlowScope.currentCity}"
type="action"/>
</dvtm:marker>
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:geographicMap>
...
<amx:popup id="popup1" backgroundDimming="off" autoDismiss="true">
<amx:outputText id="otTest" value="City: #{pageFlowScope.currentCity}"/>
...
</amx:popup>

geographicMap要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

地理マップ・コンポーネントでは、タッチ・ジェスチャーを使用したピンの挿入(マップ上での点の作成)が可能です。この機能を構成するには、mapInputListenerを使用します。詳細は、第13.5.19項「マップ・コンポーネントでのイベントの使用方法」を参照してください。

13.5.17.1 地理プロバイダ情報を指定した地理マップ・コンポーネントの構成

基礎となるマップに特定のプロバイダ(GoogleまたはOracle)を使用するように地理マップ・コンポーネントを構成するには、アプリケーションのadf-config.xmlファイルに名前と値のペアとして次のプロパティを設定します。

- mapProvider: oraclemapsまたはgooglemapsを指定します。

- geoMapKey: mapProviderがgooglemapsに設定されている場合は、ライセンス・キーを指定します。

- geoMapClientId: mapProviderがgooglemapsに設定されている場合は、Googleマップ・ビジネス・ライセンスのクライアントIDを指定します。

- mapViewerUrl: mapProviderがoraclemapsに設定されている場合は、Oracleマップのマップ・ビューアURLを指定します。

- baseMap: mapProviderがoraclemapsに設定されている場合は、Oracleマップとともに使用するベース・マップを指定します。

注意:
Googleマップを使用するように地理マップ・コンポーネントを構成するには、Googleから該当するライセンスを取得する必要があります。

次の例は、Googleマップ用の構成を示しています。

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="googlemaps"/>
<adf-property name="geoMapKey" value="your key"/>
</adf-properties-child>

次の例は、Oracleマップ用の構成を示しています。

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="oraclemaps"/>
<adf-property name="mapViewerUrl"
value="http://elocation.oracle.com/mapviewer"/>
<adf-property name="baseMap" value="ELOCATION_MERCATOR.WORLD_MAP"/>
</adf-properties-child>

マップ・プロバイダ情報を指定しない場合、MAF AMX地理マップ・コンポーネントは、そのマップとしてGoogleマップを使用しますがライセンス・キーはありません。

マップ・プロバイダとしてのGoogleマップの使用に関する問題の詳細は、第A.2項「アドレス・ポイント数を制限する地理マップ・コンポーネント」を参照してください。

adf-config.xmlファイルの詳細は、第C.2項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」を参照してください。

13.5.17.2 地理マップ・コンポーネントのルート表示

Googleマップを地理マップ・コンポーネントのプロバイダとして使用する場合、ルート(route)子コンポーネントを追加すると、想定されるウェイポイントを設定して、2点間のルート(経路)を指定できます。

各地理マップ・コンポーネントには、ルートの子要素を複数設定して、それぞれに1つのルートを指定できます。ルートの出発点、目的地およびオプションでウェイポイントを指定するには、地理マップの点の位置子コンポーネントを使用します。慣例的に、セット内の最初の点の位置は出発点を、最後の点の位置は目的地をそれぞれ定義します。この2つの点の位置に挟まれているすべての点がルートのウェイポイントです。

マップ上のルート表示に使用する線の色、幅および不透明度を定義できます。また、車、自転車または徒歩のうち、どの手段のルートを優先するか、ヒントを指定することも可能です。

次の例は、MAF AMXページのroute要素の定義方法を示しています。

<dvtm:geographicMap id="gm1">

<!-- route defined using a collection model -->
<dvtm:route travelMode="driving" id="d1">
<amx:iterator value="#{el.collectionModel}" var="row">
<dvtm:pointLocation address="#{row.address}" type="address"/>
</amx:iterator>
</dvtm:route>

<!-- route with explicitly defined start and destination -->
<dvtm:route travelMode="driving|walking|bicycling" id="d2">
<!-- route origin -->
<dvtm:pointLocation address="#{pageFlowScope.origin}" type="address">
<!-- route destination -->
<dvtm:pointLocation address="#{pageFlowScope.destination}" type="address"/>
</dvtm:route/>

<dvtm:pointDataLayer id="pdl1">
...
</dvtm:pointDataLayer>

<dvtm:pointDataLayer id="pdl2">
...
</dvtm:pointDataLayer>

</dvtm:geographicMap>

エンド・ユーザーがルートを表す線の上でクリックまたはタップすると、ActionEventが起動します。このイベントを使用すると、action属性を経由してナビゲーションを開始したり、actionListener属性を使用してJavaレイヤーのハンドラを起動したりできます。このアクションは、setPropertyListener、actionListener、showPopupBehaviorおよびshowPopupBehavior子要素で指定されたイベント・リスナーと動作をトリガーする場合にも使用できます。詳細は、第13.10項「イベント・リスナーの使用方法」を参照してください。

13.5.18 テーマ・マップ・コンポーネントの作成方法

テーマ・マップ(thematicMap)では、ビジネス・データをスタイル設定された領域内のパターンまたは関連付けられたマーカーとして表します。テーマ・マップでは、地理的な詳細なしで、データに焦点を合せます。

次の例は、MAF AMXファイルで定義されたthematicMap要素とその子を示しています。

<dvtm:thematicMap id="tm1"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
animationOnMapChange="#{pageFlowScope.animationOnMapChange}"
animationDuration="#{pageFlowScope.animationDuration}"
basemap="#{pageFlowScope.basemap}"
tooltipDisplay="#{pageFlowScope.tooltipDisplay}"
inlineStyle="#{pageFlowScope.inlineStyle}"
zooming="#{pageFlowScope.zooming}"
panning="#{pageFlowScope.panning}"
initialZooming="#{pageFlowScope.initialZooming}">
<dvtm:areaLayer id="areaLayer1"
layer="#{pageFlowScope.layer}"
animationOnLayerChange=
"#{pageFlowScope.animationOnLayerChange}"
areaLabelDisplay="#{pageFlowScope.areaLabelDisplay}"
labelType="#{pageFlowScope.labelType}"
areaStyle="background-color"
rendered="#{pageFlowScope.rendered}">
<dvtm:areaDataLayer id="areaDataLayer1"
animationOnDataChange=
"#{pageFlowScope.dataAnimationOnDataChange}"
animationDuration=
"#{pageFlowScope.dataAnimationDuration}"
dataSelection="#{pageFlowScope.dataSelection}"
var="row"
value="#{bindings.thematicMapData.collectionModel}">
<dvtm:areaLocation id="areaLoc1" name="#{row.name}">
<dvtm:area action="sales" id="area1" shortDesc="#{row.name}">
<amx:setPropertyListener id="spl1"
to=
"#{DvtProperties.areaChartProperties.dataSelection}"
from="#{row.name}"
type="action"/>
<dvtm:attributeGroups id="ag1" type="color" value="#{row.cat1}" />
</dvtm:area>
</dvtm:areaLocation>
</dvtm:areaDataLayer>
</dvtm:areaLayer>
<dvtm:legend id="l1" position="end">
<dvtm:legendSection id="ls1" source="ag1"/>
</dvtm:legend>
</dvtm:thematicMap>

図13-91 デザインタイムのテーマ・マップ

markerZoomBehavior属性を使用すると、マップがズームされたときにテーマ・マップのマーカーのスケーリングを有効にできます。マーカーのrotation属性を設定することでマーカーの回転を有効にできます。この属性の値は、マーカーが、イメージの中心を基準として時計回りに回転する角度を表します。

MAF AMXテーマ・マップでは、次の拡張機能をサポートしています。

- カスタム・マーカー(第13.5.18.1項「カスタム・マーカーの定義」を参照)

- 領域の分離(第13.5.18.3項「分離領域の定義」を参照)

- 初期ズーム(第13.5.18.4項「初期ズームの有効化」を参照)

- カスタム・ベース・マップ(第13.5.18.5項「カスタム・ベース・マップの定義」を参照)

thematicMap要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.18.1 カスタム・マーカーの定義

MAF AMXテーマ・マップでは、MAF AMXイメージ・コンポーネントはサポートされていません。マップのpointLocation内でイメージを使用するには、pointLocationのmarker子要素で、そのsource属性を使用してイメージを指定します。source属性がマーカーに対して設定されている場合、そのshape属性はMAF AMXによって無視されます。

sourceHover、sourceSelectedおよびsourceHoverSelected属性で、ホバーおよび選択効果のイメージを指定できます。これらの1つが指定されていない場合、その特定のマーカー状態に対してはsource属性によって指定されているイメージが使用されます。sourceSelectedが指定されている場合、sourceHoverSelectedが指定されていないときはその値が使用されます。イメージは、PNG、JPG、SVGなどモバイル・デバイスのブラウザでサポートされている任意のフォーマットで構いません。

13.5.18.2 分離領域レイヤーの定義

リージョンの枠は、常にデータの地理的位置を示す必要はありません。かわりに、テーマ・マップ・コンポーネントには領域内の中心にイメージまたはマーカーを配置するオプションがあるため、リージョンの枠が描画されない非表示の領域レイヤーを定義できます。

非表示の領域レイヤーを定義するには、background-colorおよびborder-colorのCSS値を受け入れるareaLayerのareaStyle属性を次のように使用します。

<dvtm:areaLayer id="areaLayer1"
...
areaStyle="background-color:transparent;border-color:transparent">

この属性を使用すると、dvtm-areaスキニング・キーを使用しないで、デフォルトの領域レイヤーの色および境界線の処理をオーバーライドできます。

13.5.18.3 分離領域の定義

MAF AMXテーマ・マップ・コンポーネントを構成し、areaDataLayerのisolatedRowKey属性を使用してマップの単一の分離領域に収まるようにレンダリングおよびズームできます。この場合、その領域または領域データ・レイヤーの残りの領域はレンダリングされません。

注意:
分離できるのは、1つのマップで1つの領域のみです。

13.5.18.4 初期ズームの有効化

初期ズームでは、マップ・コンポーネントを通常どおりレンダリングし、その後、マーカーと領域の両方を含むデータ・オブジェクトにズームして合せることができます。この機能を有効にするには、テーマ・マップのinitialZooming属性を使用します。

13.5.18.5 カスタム・ベース・マップの定義

カスタム・ベース・マップ・サポートの一部として、MAF AMXでは、テーマ・マップ・コンポーネントに対して次のものを指定できます。

- 様々な解像度のイメージを持つレイヤー。

- 点の位置(pointLocation)から参照できる名前付きの点を持つ点レイヤー。

- カスタム・ベース・マップ・メタデータXMLファイルを指すテーマ・マップのsource属性。

注意:
MAF AMXでは、カスタム・ベース・マップの次のものはサポートされていません。

- スタイル設定された領域: 領域レイヤーはカスタム・ベース・マップには定義できないため、ポイント・レイヤーを使用します。

- リソース・バンドル: ロケール固有のツールチップを追加するには、マーカー(marker)のshortDesc属性でELを使用します。

カスタム・ベース・マップを作成するには、メタデータ・ファイルの定義を指す領域レイヤーを指定します(次の例を参照)。基本的なカスタム・ベース・マップを定義するには、背景レイヤーおよびポインタ・データ・レイヤーを指定します。MAF AMXゲージ・コンポーネントと同様に、メタデータ・ファイルで、画面解像度および表示方向ごとに異なるイメージを指定できます。ゲージタイプ・コンポーネントと同様に、テーマ・マップでは、画面解像度および方向に基づいてレイヤーに適切なイメージが選択されます。表示方向は左から右です。

レイヤーはいくつでも定義できます。すべてのレイヤーではすべての名前付きポイントにアクセスできます。名前付きポイントのX位置とY位置は、最初のイメージのイメージ・サイズにマッピングされます。次のいずれかが起きると、テーマ・マップ・コンポーネントはポイントの位置を計算します。

- ズーム・インが実行されます。

- 違ったイメージが違った解像度で表示されます。

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
</layer>
</basemap>

次の例は、点によってカスタム領域レイヤーを宣言するMAF AMXファイルを示しています。このMAF AMXファイルは、使用可能なイメージ(実際は、同じイメージの拡大縮小されたバージョン)のリストを含む、前の例に示したメタデータ・ファイルを指しています。

<dvtm:thematicMap id="tm1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" >
<dvtm:pointDataLayer id="pdl1"
var="row"
value="{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1"
type="pointXY"
pointX="#{row.x}"
pointY="#{row.y}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:areaLayer>
</dvtm:thematicMap>

前述の例では、ベース・マップIDはthematicMapのbasemap属性と照合され、レイヤーIDはareaLayerのlayer属性と照合されます。点は(前述のベース・マップの場合と同様に)X座標とY座標で定義され、データが更新されたときに変更される可能性がある動的な点に対応します。

次の例は、点によってカスタム領域レイヤーを宣言するもう1つの方法を示しています。この例では、pointDataLayerは、thematicMapの直接の子です。方法は異なりますが、前の例で示した宣言と同じ結果がレンダリングされます。

<dvtm:thematicMap id="demo1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" />
<dvtm:pointDataLayer id="pdl1"
var="row"
value="{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1"
type="pointXY"
pointX="#{row.x}"
pointY="#{row.y}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:thematicMap>

静的な点を含むカスタム・ベース・マップを作成するには、次の例に示すメタデータ・ファイルで点を名前で指定します。このプロセスは、事前定義済ベース・マップに市区町村のマーカーを追加する場合に類似しています。

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-800x800-rtl.png"
width="2560"
height="1920"
dir="rtl" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
<image source="/maps/car-200x200-rtl.png"
width="640"
height="480"
dir="rtl" />
</layer>
<points >
<point name="hood" x="219.911" y="329.663" />
<point name="frontLeftTire" x="32.975" y="32.456" />
<point name="frontRightTire" x="10.334" y="97.982" />
</points>
</basemap>

名前付きの点のXおよびY位置は、layerの最初のimage要素のイメージ・ディメンションにマップされると想定されます。

注意:
これらの点はベース・マップ内のスコープでグローバルで、すべてのレイヤーに適用されるため、特定のレイヤーおよびそのイメージに点を定義することはできません。

次の例は、指定した点によってカスタム領域レイヤーを宣言するMAF AMXファイルを示しています。

<dvtm:thematicMap id="demo1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" />
<dvtm:pointDataLayer id="pdl1"
var="row"
value="#{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1" type="pointName" pointName="#{row.name}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:thematicMap>

前のMAF AMXファイルは、点とその名前のリストを含む、次の例に示すメタデータ・ファイルを指しています。

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
</layer>
</basemap>

13.5.18.6 イベント・リスナーのマーカー・サポートに関する必知事項

MAF AMXのデータ視覚化では、markerのactionListener属性はサポートされていません。かわりに、action属性を使用することで同じ機能を実現できます。

13.5.18.7 テーマ・マップ・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、テーマ・マップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、テーマ・マップ・コンポーネントのデフォルトCSSスタイルを示しています。

.dvtm-thematicMap {
background-color: #FFFFFF;
-webkit-user-select: none;
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}

.dvtm-areaLayer {
background-color: #B8CDEC;
border-color: #FFFFFF;
border-width: 0.5px;
/* border style and color must be set when setting border width */
border-style: solid;
color: #000000;
font-family: tahoma, sans-serif;
font-size: 13px;
font-weight: bold;
font-style: normal;
}

.dvtm-area {
border-color: #FFFFFF;
border-width: 0.5px;
/* border style and color must be set when setting border width */
border-style: solid;
}

.dvtm-marker {
background-color: #61719F;
opacity: 0.7;
color: #FFFFFF;
font-family: tahoma, sans-serif;
font-size: 13px;
font-weight: bold;
font-style: normal;
border-style: solid
border-color: #FFCC33
border-width: 12px
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。次の例は、CSSを使用しないでテーマ・マップ・コンポーネントにカスタム・スタイルを適用する方法を示しています。

my-custom.js:

CustomThematicMapStyle = {
// selected area properties
'areaSelected': {
// selected area border color
'borderColor': "#000000",
// selected area border width
'borderWidth': '1.5px'
},

// area properties on mouse hover
'areaHover': {
// area border color on hover
'borderColor': "#FFFFFF",
// area border width on hover
'borderWidth': '2.0px'
},

// marker properties
'marker': {
// separator upper color
'scaleX': 1.0,
// separator lower color
'scaleY': 1.0,
// should display title separator
'type': 'circle'
},

// thematic map legend properties
'legend': {
// legend position, such as none, auto, start, end, top, bottom
'position': "auto"
}
};

})();

注意:
CustomThematicMapStyleオブジェクトの名前およびプロパティ名は変更できません。かわりに、特定のプロパティ値を、アプリケーションのニーズに合わせて変更できます。カスタムCSSおよびJavaScriptファイルをアプリケーションに追加する方法の詳細は、第5.3項「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」を参照してください。

attributeGroups属性がテーマ・マップ・コンポーネント用に定義されている場合、CustomThematicMapStyleを使用して、そのコンポーネントの図形と色のデフォルト・セットを定義できます。この場合、CustomThematicMapStyleオブジェクトの構造は、次の例のようになっている必要があります。styleDefaultsは、次のフィールドを含むネストされたオブジェクトです。

- colors: 領域とマーカーに使用される色のセットを表します。

- shapes: マーカーに使用される図形のセットを表します。

window['CustomThematicMapStyle'] =
{
// custom style values
'styleDefaults': {
// custom color palette
'colors': ["#000000", "#ffffff"],
// custom marker shapes
'shapes' : ['circle', 'square']
}
};

13.5.19 マップ・コンポーネントでのイベントの使用方法

MapBoundsChangeEventを使用して、地理マップ・コンポーネントでの次のマップ・ビュー・プロパティの変更を処理できます。

- ズーム・レベルの変更。

- マップ境界の変更。

- マップ中心の変更。

これらの変更が発生した場合、新しいマップ・ビュー・プロパティ値がロードされたイベントがコンポーネントによって起動されます。

地理マップの属性としてmapBoundsChangeListenerを定義できます。

地理マップ・コンポーネントで、MapInputEventを使用してタップおよびマウス・クリックなどのエンド・ユーザー・アクションを処理できます。これらのアクションが発生すると、マップの緯度および経度の情報およびアクションのタイプ(たとえば、マウス・ボタンが押された、マウス・ボタンが放された、クリックなど)がロードされたイベントが、コンポーネントによって起動されます。

地理マップ・コンポーネントの属性としてmapInputListenerを定義できます。

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- Oracle Mobile Application Framework Oracle Fusion Middleware Java APIリファレンス

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

13.5.20 ツリーマップ・コンポーネントの作成方法

ツリーマップ(treemap)は、ノード(treemapNode)のサイズと色で表された、2つのディメンションにまたがる階層データを表示します。

「コンポーネント」ウィンドウで、「ツリーマップ」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「サンバーストおよびツリーマップ」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図13-92を参照)。

図13-92 「コンポーネント」ウィンドウのツリーマップおよびその他の拡張コンポーネント

次の例は、MAF AMXファイルで定義されたtreemap要素とその子を示しています。

<dvtm:treemap id="treemap1"
value="#{bindings.treemapData.collectionModel}"
var="row"
animationDuration="#{pageFlowScope.animationDuration}"
animationOnDataChange="#{pageFlowScope.animationOnDataChange}"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
layout="#{pageFlowScope.layout}"
nodeSelection="#{pageFlowScope.nodeSelection}"
rendered="#{pageFlowScope.rendered}"
emptyText="#{pageFlowScope.emptyText}"
inlineStyle="#{pageFlowScope.inlineStyle}"
sizeLabel="#{pageFlowScope.sizeLabel}"
styleClass="dvtm-gallery-component"
colorLabel="#{pageFlowScope.colorLabel}"
sorting="#{pageFlowScope.sorting}"
selectedRowKeys="#{pageFlowScope.selectedRowKeys}"
isolatedRowKey="#{pageFlowScope.isolatedRowKey}"
legendSource="ag1">
<dvtm:treemapNode id="node1"
fillPattern="#{pageFlowScope.fillPattern}"
label="#{row.label}"
labelDisplay="#{pageFlowScope.labelDisplay}"
value="#{row.marketShare}"
labelHalign="#{pageFlowScope.labelHalign}"
labelValign="#{pageFlowScope.labelValign}">
<dvtm:attributeGroups id="ag1"
type="color"
value="#{row.deltaInPosition}"
attributeType="continuous"
minLabel="-1.5%"
maxLabel="+1.5%"
minValue="-1.5"
maxValue="1.5" >
<amx:attribute id="a1" name="color1" value="#ed6647" />
<amx:attribute id="a2" name="color2" value="#f7f37b" />
<amx:attribute id="a3" name="color3" value="#68c182" />
</dvtm:attributeGroups>
</dvtm:treemapNode>
</dvtm:treemap>

図13-93 デザインタイムのツリーマップ

attributeGroups要素のattributeType属性をcontinuousに設定することで、色の濃さが指定された範囲内での相対値を表すグラデーション色を使用した、ツリーマップ・アイテムに関連付けられた値の視覚化を有効にできます。

treemap要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.20.1 ツリーマップ・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、ツリーマップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、オーバーライドできるツリーマップ・コンポーネントのデフォルトのCSSスタイルを示しています。

.dvtm-treemap {
border-style: solid;
border-color: #E2E8EE;
border-radius: 3px;
background-color: #EDF2F7;
...
}

次の例は、オーバーライドできるツリーマップ・ノードのデフォルトのCSSスタイルを示しています。

.dvtm-treemapNodeSelected {
// Selected node outer border color
border-top-color: #E2E8EE;
// Selected node inner border color
border-bottom-color: #EDF2F7;
}

次の例は、カスタムCSSを使用してスタイルを設定できる、ツリーマップ・ノードのlabelテキストCSSプロパティを示しています。

.dvtm-treemapNodeLabel {
font-family: Helvetica, sans-serif;
font-size: 14px;
font-style: normal;
font-weight: normal;
color: #7097CF;
...
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。次の例は、CSSを使用しないでツリーマップ・コンポーネントにカスタム・スタイルを適用する方法を示しています。

my-custom.js:

window["CustomTreemapStyle"] = {

// treemap properties
"treemap" : {
// Specifies the animation effect when the data changes - none, auto
"animationOnDataChange": "auto",

// Specifies the animation that is shown on initial display - none, auto
"animationOnDisplay": "auto",

// Specifies the animation duration in milliseconds
"animationDuration": "500",

// The text of the component when empty
"emptyText": "No data to display",

// Specifies the layout of the treemap -
// squarified, sliceAndDiceHorizontal, sliceAndDiceVertical
"layout": "squarified",

// Specifies the selection mode - none, single, multiple
"nodeSelection": "multiple",

// Specifies whether or not the nodes are sorted by size - on, off
"sorting": "on"
},

// treemap node properties
"node" : {
// Specifies the label display behavior for nodes - node, off
"labelDisplay": "off",

// Specifies the horizontal alignment for labels displayed
// within the node - center, start, end
"labelHalign": "end",

// Specifies the vertical alignment for labels displayed
// within the node - center, top, bottom
"labelValign": "center"
},

}

13.5.21 サンバースト・コンポーネントの作成方法

サンバースト(sunburst)は、ノード(sunburstNode)のサイズと色で表された、2つのディメンションにまたがる階層データを表示します。

「コンポーネント」ウィンドウで、「サンバースト」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「サンバーストおよびツリーマップ」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図13-92「「コンポーネント」ウィンドウのツリーマップおよびその他の拡張コンポーネント」を参照)。

次の例は、MAF AMXファイルで定義されたsunburst要素とその子を示しています。

<dvtm:sunburst id="sunburst1"
value="#{bindings.sunburstData.collectionModel}"
var="row"
animationDuration="#{pageFlowScope.animationDuration}"
animationOnDataChange="#{pageFlowScope.animationOnDataChange}"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
colorLabel="#{pageFlowScope.colorLabel}"
emptyText="#{pageFlowScope.emptyText}"
inlineStyle="#{pageFlowScope.inlineStyle}"
nodeSelection="#{pageFlowScope.nodeSelection}"
rendered="#{pageFlowScope.rendered}"
rotation="#{pageFlowScope.rotation}"
shortDesc="#{pageFlowScope.shortDesc}"
sizeLabel="#{pageFlowScope.sizeLabel}"
sorting="#{pageFlowScope.sorting}"
rotationAngle="#{pageFlowScope.startAngle}"
styleClass="#{pageFlowScope.styleClass}"
legendSource="ag1">
<dvtm:sunburstNode id="node1"
fillPattern="#{pageFlowScope.fillPattern}"
label="#{row.label}"
labelDisplay="#{pageFlowScope.labelDisplay}"
value="#{pageFlowScope.showRadius ? 1 : row.marketShare}"
labelHalign="#{pageFlowScope.labelHalign}"
radius="#{pageFlowScope.showRadius ? row.booksCount : 1}">
<dvtm:attributeGroups id="ag1"
type="color"
value="#{row.deltaInPosition}"
attributeType="continuous"
minLabel="-1.5%"
maxLabel="+1.5%"
minValue="-1.5"
maxValue="1.5">
<amx:attribute id="a1" name="color1" value="#ed6647" />
<amx:attribute id="a2" name="color2" value="#f7f37b" />
<amx:attribute id="a3" name="color3" value="#68c182" />
</dvtm:attributeGroups>
</dvtm:sunburstNode>
</dvtm:sunburst>

図13-94 デザインタイムのサンバースト

attributeGroups要素のattributeType属性をcontinuousに設定することで、色の濃さが指定された範囲内での相対値を表すグラデーション色を使用した、サンバースト・アイテムに関連付けられた値の視覚化を有効にできます。

sunburst要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.21.1 サンバースト・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、サンバースト・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、オーバーライドできるサンバースト・コンポーネントのデフォルトのCSSスタイルを示しています。

.dvtm-sunburst {
border-style: solid;
border-color: #E2E8EE;
border-radius: 3px;
background-color: #EDF2F7;
...
}

次の例は、オーバーライドできるサンバースト・ノードのデフォルトのCSSスタイルを示しています。

.dvtm-sunburstNode {
// Node border color
border-color: "#000000";
}

.dvtm-sunburstNodeSelected {
// Selected node border color
border-color: "#000000";
}

次の例は、カスタムCSSを使用してスタイルを設定できる、サンバースト・ノードのlabelテキストCSSプロパティを示しています。

.dvtm-sunburstNodeLabel {
font-family: Helvetica, sans-serif;
font-size: 14px;
font-style: normal;
font-style: normal;
color: #7097CF;
...
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。次の例は、CSSを使用しないでサンバースト・コンポーネントにカスタム・スタイルを適用する方法を示しています。

my-custom.js:

window["CustomSunburstStyle"] = {
// sunburst properties
"sunburst" : {
// Specifies whether or not the client side rotation is enabled - on, off
"rotation": "off",

// The text of the component when empty
"emptyText": "No data to display",

// Specifies the selection mode - none, single, multiple
"nodeSelection": "multiple",

// Animation effect when the data changes - none, auto
"animationOnDataChange": "auto",

// Specifies the animation that is shown on initial display - none, auto
"animationOnDisplay": "auto",

// Specifies the animation duration in milliseconds
"animationDuration": "500",

// Specifies the starting angle of the sunburst
"startAngle": "90",

// Specifies whether or not the nodes are sorted by size - on, off
"sorting": "on"
},

// sunburst node properties
"node" : {
// Specifies whether or not the label is displayed - on, off
"labelDisplay": "off"
}
}

13.5.22 時系列コンポーネントの作成方法

時系列(timeline)は、イベントを時系列で表示できるインタラクティブ・コンポーネントであり、定義されていてまだ調整可能な時間範囲(ズームに使用可能)内を前後に移動できます。

イベントは、タイトル、説明および継続時間の塗りつぶしの色を含む、時系列アイテム・コンポーネント(timelineItem)で表されます。2つの時系列を構成して2系列のイベントを表示し、関連する情報を並べて比較できます。

注意:
MAF AMXは、時系列に似たコンポーネントで多くの場合使用可能な次の機能、子要素およびプロパティをサポートしていません。

- ネストされたUIコンポーネント

- アニメーション

- 属性および時間範囲の変更の検出

- 時間のフェッチ

- カスタム・タイム・スケール

- 時間通貨

- 部分トリガー

- データのソート

- 書式設定された時間範囲

- タイムゾーン

- 可視性

「コンポーネント」ウィンドウで、「時系列」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「時系列」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図13-92「「コンポーネント」ウィンドウのツリーマップおよびその他の拡張コンポーネント」を参照)。

次の例は、MAF AMXファイルで定義されたtimeline要素とその子を示しています。

<dvtm:timeline id="tl"
itemSelection="#{pageFlowScope.itemSelection}"
startTime="#{pageFlowScope.startTime}"
endTime="#{pageFlowScope.endTime}">
<dvtm:timelineSeries id="ts1"
label="#{pageFlowScope.s1Label}"
value="#{bindings.series1Data.collectionModel}"
var="row"
selectionListener=
"#{PropertyBean.timelineSeries1SelectionHandler}">
<dvtm:timelineItem id="ti1"
startTime="#{row.startDate}"
endTime="#{row.endDate}"
title="#{row.title}"
description="#{row.description}"
durationFillColor="#AAAAAA"/>
</dvtm:timelineSeries>
<dvtm:timeAxis id="ta1" scale="#{pageFlowScope.scale}"/>
</dvtm:timeline>

図13-95 デザインタイムの時系列

durationFillColor属性を使用して、特定の時系列アイテムの継続時間バーの塗りつぶしの色を制御できます。

時系列で同時に2つのタイム・スケールを表示するには、2番目の軸のスケールを決定する時間軸のscale属性を使用します。

時系列は、水平および垂直にスクロールできます。コンポーネントがスクロール可能である場合(つまり、表示されている表示領域の外側にデータが含まれている場合)、このことはスクロールの方向を指す矢印によって示されます。

ヒント:
時系列開始時間は、最初の時系列アイテムの開始時間と同じ値に設定されている場合、対応する時系列アイテム・コンポーネントのバブルは切り捨てられて表示されることがあります。また、時系列終了時間が最後の時系列アイテムの終了時間と同じ値に設定されている場合、対応する時系列アイテム・コンポーネントのバブルは切り捨てられて表示されることがあります。時系列アイテムのバブルが完全に見られるように、時系列コンポーネントの開始時間と終了時間を設定する必要があります。

timeline要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.22.1 時系列コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、時系列コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

オーバーライド可能な次のCSSスタイル・クラスが、時系列およびその子コンポーネントに定義されています。

- .dvtm-timeline
サポートされるプロパティ: all

- .timelineSeries-backgroundColor
サポートされるプロパティ: color

.timelineSeries-labelStyle

サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

.timelineSeries-emptyTextStyle

サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

- .timelineItem-backgroundColor
サポートされるプロパティ: color

.timelineItem-selectedBackgroundColor

サポートされるプロパティ: color

.timelineItem-borderColor

サポートされるプロパティ: color

.timelineItem-selectedBorderColor

サポートされるプロパティ: color

.timelineItem-borderWidth

サポートされるプロパティ: width

.timelineItem-selectedBorderWidth

サポートされるプロパティ: width

.timelineItem-feelerColor

サポートされるプロパティ: color

.timelineItem-selectedFeelerColor

サポートされるプロパティ: color

.timelineItem-feelerWidth

サポートされるプロパティ: width

.timelineItem-selectedFeelerWidth

サポートされるプロパティ: width

.timelineItem-descriptionStyle

- サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

.timelineItem-titleStyle

- サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

- .timeAxis-separatorColor
サポートされるプロパティ: color

.timeAxis-backgroundColor

サポートされるプロパティ: color

.timeAxis-borderColor

サポートされるプロパティ: color

.timeAxis-borderWidth

サポートされるプロパティ: width

.timeAxis-labelStyle

- サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

次の例は、時系列コンポーネントのデフォルト・スタイルをオーバーライドするために使用できるカスタムJavaScriptファイルを示しています。

// Custom timeline style definition with listing
// of all properties that can be overriden
window["CustomTimelineStyle"] = {
// Determines if items in the timeline are selectable
"itemSelection": none

// Timeline properties
"timelineSeries" : {
// Duration bars color palette
"colors" : [comma separated list of hex colors]
}
}

13.5.23 NBoxコンポーネントの作成方法

NBox (nBox)コンポーネントは、2つのディメンションにまたがるデータを表し、各ディメンションは複数の範囲に分割され、その交点が各データ・アイテムが配置される個別のセルになります。

「コンポーネント」ウィンドウで、「NBox」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「NBox」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図13-92「「コンポーネント」ウィンドウのツリーマップおよびその他の拡張コンポーネント」を参照)。

次の例は、MAF AMXファイルで定義されたnBox要素とその子を示しています。

<dvtm:nBox id="nBox1"
var="item"
value="#{bindings.NBoxNodesDataList.collectionModel}"
columnsTitle="#{pageFlowScope.columnsTitle}"
emptyText="#{pageFlowScope.emptyText}"
groupBy="#{pageFlowScope.groupBy}"
groupBehavior="#{pageFlowScope.groupBehavior}"
highlightedRowKeys="#{pageFlowScope.showHighlightedNodes ?
pageFlowScope.highlightedRowKeys : ''}"
inlineStyle="#{pageFlowScope.inlineStyle}"
legendDisplay="#{pageFlowScope.legendDisplay}"
maximizedColumn="#{pageFlowScope.maximizedColumn}"
maximizedRow="#{pageFlowScope.maximizedRow}"
nodeSelection="#{pageFlowScope.nodeSelection}"
rowsTitle="#{pageFlowScope.rowsTitle}"
selectedRowKeys="#{pageFlowScope.selectedRowKeys}"
shortDesc="#{pageFlowScope.shortDesc}">
<amx:facet name="rows">
<dvtm:nBoxRow value="low" label="Low" id="nbr1"/>
<dvtm:nBoxRow value="medium" label="Med" id="nbr2"/>
<dvtm:nBoxRow value="high" label="High" id="nbr3"/>
</amx:facet>
<amx:facet name="columns">
<dvtm:nBoxColumn value="low" label="Low" id="nbc2"/>
<dvtm:nBoxColumn value="medium" label="Med" id="nbc1"/>
<dvtm:nBoxColumn value="high" label="High" id="nbc3"/>
</amx:facet>
<amx:facet name="cells">
<dvtm:nBoxCell row="low"
column="low"
label=""
background="rgb(234,153,153)"
id="nbc4"/>
<dvtm:nBoxCell row="medium"
column="low"
label=""
background="rgb(234,153,153)"
id="nbc5"/>
<dvtm:nBoxCell row="high"
column="low"
label=""
background="rgb(159,197,248)"
id="nbc6"/>
<dvtm:nBoxCell row="low"
column="medium"
label=""
background="rgb(255,229,153)"
id="nbc7"/>
<dvtm:nBoxCell row="medium"
column="medium"
label=""
background="rgb(255,229,153)"
id="nbc8"/>
<dvtm:nBoxCell row="high"
column="medium"
label=""
background="rgb(147,196,125)"
id="nbc9"/>
<dvtm:nBoxCell row="low"
column="high"
label=""
background="rgb(255,229,153)"
id="nbc10"/>
<dvtm:nBoxCell row="medium"
column="high"
label=""
background="rgb(147,196,125)"
id="nbc11"/>
<dvtm:nBoxCell row="high"
column="high"
label=""
background="rgb(147,196,125)"
id="nbc12"/>
</amx:facet>
<dvtm:nBoxNode id="nbn1"
row="#{item.row}"
column="#{item.column}"
label="#{item.name}"
labelStyle="font-style:italic"
secondaryLabel="#{item.job}"
secondaryLabelStyle="font-style:italic"
shortDesc="#{item.name + ': ' + item.job}">
<dvtm:attributeGroups id="ag1"
type="indicatorShape"
value="#{item.indicator1}"
rendered="#{pageFlowScope.showIndicator}"/>
<dvtm:attributeGroups id="ag2"
type="indicatorColor"
value="#{item.indicator2}"
rendered="#{pageFlowScope.showIndicator}"/>
<dvtm:attributeGroups id="ag3"
type="color"
value="#{item.group}"
rendered="#{pageFlowScope.showColors}"/>
</dvtm:nBoxNode>
</dvtm:nBox>

図13-96 デザインタイムのNBox

nBox要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.5.24 マップ・コンポーネント、サンバースト、ツリーマップ、時系列およびNBoxの子要素の定義方法

マップ・コンポーネント、サンバースト、ツリーマップ、時系列およびNBoxの様々な子要素を定義できます。使用可能な子要素およびその属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

JDeveloperでは、マップ、サンバースト、ツリーマップ、時系列およびNBoxの子コンポーネントは、「コンポーネント」ウィンドウの「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図13-97を参照)。

図13-97 マップ、サンバースト、ツリーマップ、時系列およびNBoxの子コンポーネントの作成

13.5.25 データバインドされたデータ視覚化コンポーネントの作成方法

「データ・コントロール」ウィンドウから挿入されたデータ・コレクションを使用して、データバインドされたデータ視覚化コンポーネントを宣言的に作成できます(第12.3.3項「MAF AMXページへのデータ・コントロールの追加方法」を参照)。図13-111に示す「コンポーネント・ギャラリ」ダイアログで、いくつかのデータ視覚化コンポーネント・カテゴリ、タイプおよびレイアウトのオプションの中から選択できます。

図13-98 チャート・コンポーネントを作成するコンポーネント・ギャラリ

図13-99 ゲージ・コンポーネントを作成するコンポーネント・ギャラリ

図13-100 テーマ・マップ・コンポーネントを作成するコンポーネント・ギャラリ

注意:
いくつかのデータ視覚化コンポーネント・タイプには、特別な種類のデータが必要です。選択したコンポーネントのタイプの表示に十分なデータが含まれていないデータ・コレクションにコンポーネントをバインドすると、コンポーネントは表示されず、データが不十分であることを示すメッセージが表示されます。

「コンポーネント・ギャラリ」の表示をトリガーするには、「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグ・アンド・ドロップし、表示されるポップアップ・メニューから「MAFチャート」、「MAFゲージ」または「MAFテーマ・マップ」のいずれかを選択します(図13-101を参照)。

図13-101 データバインドされたデータ視覚化コンポーネントの作成

「コンポーネント・ギャラリ」から新しいデータバインド・コンポーネントのカテゴリ、タイプおよびレイアウトを選択し、「OK」をクリックすると、データ・バインディング・ダイアログを使用してデータ視覚化コンポーネントのデータ・コレクション属性のバインディングを開始できます。ダイアログの名前と、入力フィールド・ラベルは、選択したデータ視覚化コンポーネントのカテゴリおよびタイプによって異なります。図13-102に示すように、たとえば、カテゴリとして「棒」を、タイプとして「棒」を選択した場合、表示されるダイアログの名前は「モバイル棒チャートの作成」で、入力フィールドには「棒」というラベルが付けられます。

図13-102 データバインドされたチャートのデータ値の指定

データ・コレクション内の属性には、データ値またはデータ値のカテゴリを指定できます。データ値は、棒の高さなどのマーカーまたは散布図のポイントで示される数字です。データ値のカテゴリは、軸ラベルとして表されるメンバーです。バインディング内で属性が担うロール(データ値またはID)は、データ型(グラフには数値データ値が必要)およびマップされる場所(棒やX軸など)の両方によって決まります。

「コンポーネント・ギャラリ」を使用してデータバインド・ゲージ・コンポーネントを作成し、カテゴリとして「LED」を選択し、タイプとして「星形LED」を選択した場合、表示されるダイアログの名前は図13-103に示すように「モバイル星形LEDゲージの作成」になります。

図13-103 データバインド・ゲージのデータ値の指定

データバインドされたテーマ・マップ・コンポーネントを作成する場合に、「コンポーネント・ギャラリ」を使用すると、選択内容に関係なく、表示されるダイアログの名前は「データ・レイヤーの作成」になりますが、表示されるフィールドは「コンポーネント・ギャラリ」での選択内容に応じて異なります。たとえば、ベース・マップとして「すべてのユーザー」を選択し、領域レイヤーとして「世界(大陸)」を選択した場合、図13-103に示すダイアログが開きます。

図13-104 「データ・レイヤーの作成」ダイアログ

1つ以上のデータ・バインディング・ダイアログの完了後は、「プロパティ」ウィンドウを使用してコンポーネント属性の設定を指定できます。コンポーネントと関連付けられた子要素を使用して、さらにカスタマイズすることもできます(第13.5.16項「チャートおよびゲージ・コンポーネントの子要素の定義方法」を参照)。

コレクションをMAF AMXページにドロップすると表示されるポップアップ・メニューから「MAF地理マップ」、「MAFサンバースト」、「MAF NBox」、「MAFタイムライン」または「MAFツリーマップ」を選択すると、次のいずれかのダイアログが表示されます。

図13-105 データバインドされた地理マップの作成

図13-106 データバインドされたサンバーストの作成

図13-107 データバインドされた時系列の作成

図13-108 データバインドされたツリーマップの作成

図13-109 データバインドされたNBoxの作成

「NBoxの作成」ダイアログを完了するには、まず行および列の数を定義します。次に図13-110に示すように、ボックス上のセルを選択して、ダイアログの下部で行または列全体の値を指定できます。

図13-110 データバインドされたNBoxの行および列の値の設定

「次へ」をクリックして一連のダイアログのすべてのページを完了すると、NBoxコンポーネントが作成されます。

各ダイアログの各フィールドの値の詳細は、「ヘルプ」をクリックするか[F1]を押してオンライン・ヘルプを参照してください。

13.5.25.1 データバインドされたチャート・コンポーネントの系列スタイルの設定に関する必知事項

「データ・コントロール」ウィンドウからデータバインドされたチャート・コンポーネントを作成するとき、seriesStyle要素を追加し、「プロパティ」ウィンドウを使用してseriesStyle要素のseries属性のリストを開くことによって、チャート系列データのスタイル設定情報を宣言的に指定できます。このリストには、dataStampファセット内のchartDataItem要素の値に基づくseries属性の値がすでに移入されています。

13.5.26 静的データに基づくデータ視覚化コンポーネントの作成方法

チャート、ツリーマップ、サンバーストおよび時系列の場合、そのvar属性もvalue属性も指定しないことができます。かわりに、データ・アイテムに対応している要素を列挙することによって、コンポーネント構造を静的に定義できます(例: チャートのcharDataItem要素や時系列の系列のtimelineItems)。これらの静的アイテムは必要な数を追加できます。これは、設計時にデータがわかっている場合に便利です。

次の例は、pieDataItem子コンポーネントを通じて定義された静的データを使用する円グラフ・コンポーネントを示しています。

<dvtm:pieChart id="pieChart1" >
<amx:facet name="dataStamp">
<dvtm:pieDataItem id="di1" value="80000" label="Salary"/>
<dvtm:pieDataItem id="di2" value="7500" label="Bonus"/>
<dvtm:pieDataItem id="di3" value="12000" label="Commision"/>
</amx:facet>
<dvtm:legend position="none" id="l1"/>
</dvtm:pieChart>

次の例は、コレクションではなく属性バインディングに基づいて値が指定されているpieDataItem子コンポーネントを示します。

<dvtm:pieDataItem id="di1" value="#{bindings.Salary.inputValue}" label="Salary"/>

13.5.27 チャート・コンポーネントでインタラクティブ性を有効にする方法

チャートの次の子コンポーネントのイベントドリブン・トリガーを定義することによって、チャート・コンポーネントのタップによるエンド・ユーザーの操作おが可能になります。

- チャートのデータ・アイテム

- 円グラフのデータ・アイテム

- 系列スタイル

プロパティ設定リスナーやポップアップ表示動作などのサポートされている操作を使用するのに加え(完全なリストは、表13-16「サポートされているイベント・リスナーおよびイベント・タイプ」を参照)、action属性を設定して、起動するアクションのタイプを定義できます。

<amx:panelPage id="pp1" styleClass="dvtm-gallery-panelPage">
...
<dvtm:lineChart id="lineChart1"
var="row"
value="#{bindings.lineData1.collectionModel}"
... >
<amx:facet name="dataStamp">
<dvtm:chartDataItem group="#{row.group}"
value="#{row.value}"
series=" #{row.series}"
label="#{pageFlowScope.labelDisplay ?
row.value : ''}" >
<amx:showPopupBehavior popupId="pAdvancedOptions"
type="action"
align="overlapTopCenter"
alignId="pflOptionsForm"
decoration="anchor"/>
</dvtm:chartDataItem>
</amx:facet>
...
</dvtm:lineChart>
...
</amx:panelPage>
<amx:popup id="pAdvancedOptions" styleClass="dvtm-gallery-options-dialog">
...

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.28 極チャートの作成方法

coordinateSystem属性をpolarに設定することによって、次のチャート・コンポーネントの極ビューを有効にできます。

- 面グラフ

- 棒グラフ

- コンボ・チャート

- バブル・チャート

- 線グラフ

- 散布図

極設定が、棒グラフを除く前述のチャートのいずれかに適用される場合、polarGridShape属性を使用することによって、極グリッドを循環またはポリゴンとして定義できます。

極チャートの放射軸は、Y軸の子コンポーネントを使用してカスタマイズでき、接線軸は、X軸の子コンポーネントを使用してカスタマイズできます。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.6 UIコンポーネントのスタイル設定

MAFでは、CSSを使用してUIコンポーネントにスタイルを適用できます。

13.6.1 コンポーネント属性を使用したスタイルの定義方法

次の属性を設定することで、UIコンポーネントをスタイル設定できます。

- styleClass属性は、レイアウト・コンポーネントに対して使用するCSSスタイル・クラスを定義します。

<amx:panelPage styleClass="#{pageFlowScope.pStyleClass}">

MAF AMXページまたはスキニングCSSファイルでレイアウト、コマンドおよび入力コンポーネントのスタイル・クラスを定義できます。その場合、特定のスタイルがMAF AMXアプリケーション機能内のすべてのコンポーネントに適用されます(第13.6.2項「スキニングに関する必知事項」を参照)。かわりに、MAFによって提供されるパブリック・スタイル・クラスを使用できます。

注意:
CSSファイルは、JDeveloperからアクセスできません。かわりに、MAFによって、ビルドまたはデプロイ時に、このファイルがパッケージに注入され、そのときにCSSファイルがWeb Contentルート・ディレクトリの下のcssディレクトリに表示されます。

- inlineStyle属性は、任意のUIコンポーネントに使用するCSSスタイルを定義し、コンポーネントのルートDOM要素に適用される一連のCSSスタイルを表します。

<amx:outputText inlineStyle="color:red;">

この属性は、基本スタイルの変更が必要な場合に使用してください。

注意:
いくつかのUIコンポーネントは、HTML div要素やさらに複雑なマークアップなどのサブ要素でレンダリングされます。その結果、親コンポーネントにinlineStyle属性を設定しても、目的の効果が得られないことがあります。そのような場合、生成されたマークアップを調べ、inlineStyle属性を定義するかわりに、サブ要素にスタイルを伝播するCSSクラスを適用します。
JavaScriptのデバッグ方法の詳細は、第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

これらの属性は、図13-111に示すように「プロパティ」ウィンドウの「スタイル」セクションに表示されます。

図13-111 「プロパティ」ウィンドウの「スタイル」セクション

MAF AMXでは、「プロパティ」ウィンドウ内に、inlineStyle属性の様々なプロパティを設定するために使用できるドロップダウン・エディタが提供されています(図13-112を参照)。

図13-112 「インライン・スタイル」エディタ

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

13.6.2 スキニングに関する必知事項

スキニングによって、MAF AMXアプリケーション機能内のすべてのUIコンポーネントに均一なスタイルを定義および適用し、機能全体に対するテーマを作成できます。

MAFのデフォルト・スキン・ファミリはmobileAltaという名前で、デフォルト・バージョンはそのスキンの最新バージョンです。詳細は、第7章「MAFアプリケーションのスキニング」を参照してください。

13.6.3 スキニング用のCSS IDセレクタの使用に関する必知事項

MAF AMXでは、スキニング要素でのCSS IDセレクタの使用はサポートしていません。その結果、次のようなマークアップによって、MAF AMXページ遷移が粗くなります。

#tb1 {
position:absolute;
overflow:hidden;
width: 300px;
background-color: rgb(90,148,0);
}

この状況の理由は、MAF AMXページ間で遷移が発生すると、同時に画面上で2つのページがレンダリングされるということです。したがって、IDの衝突を防止するために、遷移の直前に、遷移の発生元ページからすべてのIDが削除されます。

CSS IDセレクタを使用するかわりに、クラス名を使用する必要があります。次の例は、MAF AMXページで定義されたMAF AMX UIコンポーネントと、特定のカスタム・クラスに設定されたそのstyleClass属性を示しています。

<amx:panelPage styleClass="MySpecialClassName"/>

次の例は、スキニング用のカスタム・クラスの使用方法を示しています。

.MySpecialClassName {
height: 420px;
}

13.6.4 データ視覚化コンポーネントのスタイル設定方法

MAF AMXデータ視覚化コンポーネントのスタイル・プロパティの大部分は、cssディレクトリにあるdvtm.cssファイルで定義されます。アプリケーション機能レベルでのカスタム・スタイル定義を持つカスタムCSSファイルを追加することでデフォルト値をオーバーライドできます(第7.7章「デフォルト・スキン・スタイルのオーバーライド」を参照)。

スタイル・プロパティのいくつかは、CSSにマップできないため、カスタムJavaScriptファイルで定義する必要があります。それらのプロパティは、次のとおりです。

- ダイアル・ゲージ・コンポーネントの背景および針のイメージ(第13.5.14章「ダイアル・ゲージの作成方法」を参照)。

- 時系列コンポーネントの継続時間バーのカラー・パレット(第13.5.22項「時系列コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのベース・マップ(第13.5.18.5項「カスタム・ベース・マップの定義」を参照)。

- 地理マップ・コンポーネントのスタイル・プロパティ(第13.5.17項「地理マップ・コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのスタイル・プロパティ(第13.5.18.7項「テーマ・マップ・コンポーネントへのカスタム・スタイルの適用」を参照)。

- 評価ゲージ・コンポーネントのselectedおよびunselected状態(第13.5.15.1項「評価ゲージ・コンポーネントへのカスタム・スタイルの適用」を参照)。

これらのカスタムJavaScriptファイルは、アプリケーション機能レベルの「包含」セクションで指定する必要があります(第5.3項「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」を参照)。それによって、XMLスタイル・テンプレートで定義したデフォルト・スタイル値をオーバーライドします。次の例は、CSSを使用してスタイル設定できないプロパティのカスタム・スタイル設定を必要とするデータ視覚化コンポーネントを持つMAF AMXアプリケーション機能を含むMAFプロジェクトに追加する場合のようなJavaScriptファイルを示しています。

my-custom.js:

CustomChartStyle = {

// common chart properties
'chart': {
// text to be displayed, if no data is provided
'emptyText': null,
// animation effect when the data changes
'animationOnDataChange': "none",
// animation effect when the chart is displayed
'animationOnDisplay': "none",
// time axis type - disabled, enabled, mixedFrequency
'timeAxisType': "disabled"
},

// chart title separator properties
'titleSeparator': {
// separator upper color
'upperColor': "#74779A",
// separator lower color
'lowerColor': "#FFFFFF",
// should display title separator
'rendered': false
},

// chart legend properties
'legend': {
// legend position - none, auto, start, end, top, bottom
'position': "auto"
},

// default style values
'styleDefaults': {
// default color palette
'colors': ["#003366", "#CC3300", "#666699", "#006666", "#FF9900",
"#993366", "#99CC33", "#624390", "#669933", "#FFCC33",
"#006699", "#EBEA79"],
// default shapes palette
'shapes': ["circle", "square", "plus", "diamond",
"triangleUp", "triangleDown", "human"],
// series effect
'seriesEffect': "gradient",
// animation duration in ms
'animationDuration': 1000,
// animation indicators - all, none
'animationIndicators': "all",
// animation up color
'animationUpColor': "#0099FF",
// animation down color
'animationDownColor': "#FF3300",
// default line width for line chart
'lineWidth': 3,
// default line style for line chart - solid, dotted, dashed
'lineStyle': "solid",
// should markers be displayed for line and area charts
'markerDisplayed': false,
// default marker color
'markerColor': null,
// default marker shape
'markerShape': "auto",
// default marker size
'markerSize': 8,
// pie feeler color for pie chart
'pieFeelerColor': "#BAC5D6",
// slice label position and text type for pie chart
'sliceLabel': {
'position': "outside",
'textType': "percent" }
}
};

CustomGaugeStyle = {
// default animation duration in milliseconds
'animationDuration': 1000,
// default animation effect on data change
'animationOnDataChange': "none",
// default animation effect on gauge display
'animationOnDisplay': "none",
// default visual effect
'visualEffects': "auto"
};

CustomTimelineStyle = {
'timelineSeries' : {
// duration bars color palette
'colors' : ["#267db3", "#68c182", "#fad55c", "#ed6647"]
};
...
}

JavaScriptファイルを定義した後、任意の値をコメント解除および変更できます。次の例に示すように、maf-feature.xmlファイルに含める機能としてこのファイルを追加します。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf">
<adfmf:feature id="feature1" name="feature1">
<adfmf:content id="feature1.1">
<adfmf:amx file="feature1/untitled1.amx">
<adfmf:includes>
<adfmf:include type="StyleSheet" file="css/custom.css"/>
<adfmf:include type="JavaScript" file="feature1/js/my-custom.js"/>
</adfmf:includes>
</adfmf:amx>
</adfmf:content>
</adfmf:feature>
</adfmf:features>

13.7 UIコンポーネントのローカライズ

MAF AMXページで、JDeveloperによって提供される標準リソース・バンドルを使用することで、UIコンポーネントによって表示されるテキストをローカライズできます。これを行うには、コンポーネントおよびそのテキスト表示プロパティのうちローカライズする値を持つものを1つ選択し、「プロパティ」ウィンドウの該当するボックスで「テキスト・リソースの選択」を選択します(図13-113を参照)。

図13-113 テキスト・リソースの選択

これによって図13-114に示す標準の「テキスト・リソースの選択」ダイアログが表示されます。このダイアログを使用して、変更するプロパティの文字列参照を入力または検索します。

図13-114 「テキスト・リソースの選択」ダイアログ

ローカライズ済文字列リソースを定義すると、その参照のELが「テキスト・リソースの選択」ダイアログの起動元のプロパティに自動的に入力されます。XLIFF (XML Localization Interchange File Format)ファイルが存在しない場合は、このファイルが作成されます。存在する場合は、既存のXLIFFファイルに新しいエントリが追加されます。さらに、対応するバンドルのロード(loadBundle)コンポーネントが、ViewControllerBundle.xlfファイル(デフォルト名ですが、基本的にはプロジェクトの名前に一致します)を指す表示コンポーネントの子として作成されます。

注意:
ViewControllerBundle.xlfはデフォルト・ファイル名です。この名前はプロジェクトの名前と一致します。

図13-115は、MAF AMXファイルの変更を示しています。

図13-115 MAF AMXファイル内のローカライズ済文字列

詳細は、第6章「MAFアプリケーションのローカライズ」を参照してください。

13.8 MAFのアクセシビリティのサポートの理解

MAFアプリケーションを開発する際は、アクセシビリティの問題に対処することで視覚的および身体的に障害があるユーザーに対応する必要があります。非視覚的なメディアへのレンダリングを行うWebブラウザなどのユーザー・エージェント(スクリーン・リーダーなど)により、UIコンポーネントのテキスト説明が読み上げられ、障害を持つユーザーに有益な情報が提供されます。MAF AMX UIおよびデータ視覚化コンポーネントは、次のアクセシビリティ標準に準拠するように設計されています。

- Accessible Rich Internet Applications (WAI-ARIA) 1.0仕様。
詳細は、次を参照してください。

- WAI-ARIA 1.0仕様の「Introduction」(http://www.w3.org/TR/wai-aria/introduction)

- 「Using WAI-ARIA」(http://www.w3.org/TR/wai-aria/usage)

- 第13.8.2項「基本的なWAI-ARIA用語に関する必知事項」

- Oracle Global HTML Accessibility Guidelines (OGHAG)。
詳細は、第13.8.3項「Oracle Global HTML Accessibility Guidelinesに関する必知事項」を参照してください。

- iOSのアクセシビリティ・ガイドライン。
詳細は、『Accessibility Programming Guide for iOS』を参照してください。

そのようなコンポーネントの導入によって、アクセス可能なコンポーネントの外観の変更されたり、アプリケーション・ロジックが影響受けることがありません。

MAF AMXアプリケーション機能のアクセシビリティが適切に機能するようにするには、次のガイドラインに従ってください。

- ナビゲーションの深さは3レベル以内にして、ユーザーが簡単にホーム画面に戻れるようにする必要があります。

- スクリプトを最小限に維持します。

- DOMとの直接対話を提供しないでください。

- JavaScriptのタイムアウトは使用しないでください。

- フォーカスの不要な変更は回避します。

- ポップアップ・トリガーを明示的に指定する

- 必要に応じて、WAI-ARIAライブ・リージョンを使用します(第13.8.2項「基本的なWAI-ARIA用語に関する必知事項」を参照)。

- CSSの使用を最小限に維持します。

- デフォルト・コンポーネントの外観をオーバーライドしないようにしてください。

- 拡大縮小が可能なサイズ単位を選択します。

- CSSの位置設定は使用しないでください。

詳細は、次を参照してください。

- 『Mobile Accessibility』(http://www.w3.org/WAI/mobile)

- 『Web Content Accessibility and Mobile Web: Making a Web Site Accessible Both for People with Disabilities and for Mobile Devices』(http://www.w3.org/WAI/mobile)

13.8.1 アクセシビリティのためのUIおよびデータ視覚化コンポーネントの構成方法

MAF AMX UIおよびデータ視覚化コンポーネントには、組込みのアクセシビリティ・サポートが備えられており、ほとんどのコンポーネントがアクセシビリティ監査の対象となっています(図13-118を参照)。

表13-10には、「プロパティ」ウィンドウの「アクセシビリティ」セクションで設定できるコンポーネントとそれらの属性がリストされています。

表13-10 構成可能なアクセシビリティ属性を持つUIコンポーネント

コンポーネント

アクセシビリティ属性

アクセシビリティ監査メッセージ

ボタン(commandButton)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

選択ボタン(selectOneButton)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リンク(commandLink)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リンク(実行) (goLink)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

カルーセル(carousel)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

カルーセル・アイテム(carouselItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リスト・アイテム(listItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ポップアップ(popup)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

イメージ(image)

短い説明(shortDesc)

shortDesc属性を指定する必要があります。イメージが装飾目的で使用されている場合、それを空にすることができます。

入力テキスト(inputText)

ヒント・テキスト(hintText)

hintText属性が存在し、フィールドに何が含まれているのかを説明する必要があります。

パネル・グループ・レイアウト(panelGroupLayout)

ランドマーク(landmark)

NA脚注 1

デッキ(deck)

ランドマーク(landmark)

NA (脚注1を参照)

表のレイアウト(tableLayout)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

セル・フォーマット(cellFormat)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

フィルム・ストリップ(filmStrip)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

フィルム・ストリップ・アイテム(filmStripItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

面グラフ(areaChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

棒グラフ(barChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

バブル・チャート(bubbleChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

コンボ・チャート(comboChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

線グラフ(lineChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

散布図(scatterChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

スパーク・チャート(sparkChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

円グラフ(pieChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

NBoxノード(nBoxNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照オブジェクト(referenceObject)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照面(referenceArea)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照線(referenceLine)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

チャートのデータ・アイテム(chartDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

円グラフのデータ・アイテム(pieDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ファンネル・データ・アイテム(funnelDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

面(area)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

マーカー(marker)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ツリーマップ・ノード(treemapNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

サンバースト・ノード(sunburstNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

LEDゲージ(ledGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ステータス・メーター・ゲージ(statusMeterGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ダイアル・ゲージ(dialGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

評価ゲージ(ratingGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

地理マップ(geographicMap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

テーマ・マップ(thematicMap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ファンネル・チャート(funnelChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

NBox (nBox)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

サンバースト(sunburst)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

時系列(timeline)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ツリーマップ(treemap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

脚注 1 ランドマーク属性にはデフォルト値(none)があり、アクセシビリティ監査の対象ではありません。

shortDesc属性は、コンポーネントごとに異なる目的で使用します。たとえば、イメージ・コンポーネントにshortDesc属性を設定すると、MAF AMXファイルでそれはimage要素のalt属性の値として表示されます。

shortDesc属性の値はローカライズできます。

パネル・グループ・レイアウトおよびデッキ・コンポーネントの場合、ページのコンテキストに従って適用可能なランドマーク・ロール・タイプ(表13-15「ランドマーク・ロール」を参照)を定義します。landmark属性に次の値の1つを設定できます。

- デフォルト(なし)

- application

- banner

- complementary

- contentinfo

- form

- main

- navigation

- search

表13-11は、WAI-ARIA仕様によって定義されるそのアクセシビリティ属性が実行時に自動的に適用され、変更できないUIコンポーネントを示しています。

表13-11 静的アクセシビリティ属性を持つUIコンポーネント

コンポーネント

アクセシビリティ属性

アクセシビリティ監査メッセージ

入力日(inputDate)

ラベル(label)

inputDateはラベルが付きません。inputDateのラベル属性は指定する必要があります。

入力数値スライダ(inputNumberSlider)

ラベル(label)

inputNumberSliderはラベルが付きません。inputNumberSliderのラベル属性は指定する必要があります。

パネル・ラベルおよびメッセージ(panelLabelAndMessage)

ラベル(label)

panelLabelAndMessageはラベルが付きません。panelLabelAndMessageのラベル属性は指定する必要があります。

アイテムの選択(selectItem)

ラベル(label)

selectItemはラベルが付きません。selectItemのラベル属性は指定する必要があります。

チェックボックス(selectBooleanCheckbox)

ラベル(label)

selectBooleanCheckboxはラベルが付きません。selectBooleanCheckboxのラベル属性は指定する必要があります。

ブール・スイッチ(selectBooleanSwitch)

ラベル(label)

selectBooleanSwitchはラベルが付きません。selectBooleanSwitchのラベル属性は指定する必要があります。

ラジオ・ボタン(selectOneRadio)

ラベル(label)

selectOneRadioはラベルが付きません。selectOneRadioのラベル属性は指定する必要があります。

チェックボックスを複数選択(selectManyCheckbox)

ラベル(label)

selectManyCheckboxはラベルが付きません。selectManyCheckboxのラベル属性は指定する必要があります。

選択肢を複数選択(selectManyChoice)

ラベル(label)

selectManyChoiceはラベルが付きません。selectManyChoiceのラベル属性は指定する必要があります。

選択肢(selectOneChoice)

ラベル(label)

selectOneChoiceはラベルが付きません。selectOneChoiceのラベル属性は指定する必要があります。

出力テキスト(outputText)

値(value)

NA脚注 1

脚注 1 値属性はアクセシビリティ監査の対象外です。

アクセシビリティ監査ルールの構成方法は、第13.8.1.1項「アクセシビリティ監査ルールの構成」を参照してください。

13.8.1.1 アクセシビリティ監査ルールの構成

JDeveloperの「プリファレンス」ダイアログを使用して次のようにアクセシビリティ監査ルールを構成できます。

1. (Windowsコンピュータ上の) JDeveloperで、メイン・メニューから「ツール」→「プリファレンス」を選択します。

2. プリファレンスのリストから、「監査」を選択します(図13-116を参照)。

3. 図13-116に示す「監査」ペインで、「プロファイルの管理」をクリックして「監査プロファイル」ダイアログを開きます。

図13-116 アクセシビリティ監査ルールの設定

4. 図13-117に示す「監査プロファイル」ダイアログで、ルールのツリーから「モバイル・アプリケーション・フレームワーク」ノードを展開し、次に「アクセシビリティ」を展開します。

図13-117 「監査プロファイル」ダイアログ

5. 図13-117に示すように、アクセシビリティ監査ルールを選択し、アプリケーションに適用します。

図13-118は、JDeveloperに表示されるアクセシビリティ監査警告を示しています。

図13-118 アクセシビリティ監査警告

アクセス可能なMAF AMXアプリケーション機能をテストする方法の詳細は、第30.2.1項「iOSデバイス上でアクセシビリティのテストを実行する方法」を参照してください。

注意:
Androidでは、WAI-ARIAアクセシビリティ機能はデータ視覚化コンポーネントに対してサポートされません。
その他のMAF AMX UIコンポーネントは、アプリケーションがAndroidスクリーン・リーダー・モードで実行された場合、正しく動作しない可能性があります。

13.8.2 基本的なWAI-ARIA用語に関する必知事項

WAI-ARIA 1.0仕様に述べられているように、複雑なWebアプリケーションは、支援テクノロジがドキュメントの部分の背後にあるセマンティクスを判別できない場合や、ユーザーが、使用可能な方法で実際にそのすべての部分を移動できない場合に、アクセス不可能になります。WAI-ARIAでは、セマンティクスがロール(ユーザー・インタフェース要素を定義するタイプ)と、ロールによってサポートされている状態およびプロパティに分割されています。次のセマンティクス・アソシエーションによって、WAI-ARIA用語の基礎が形成されています。

- ロール

- ランドマーク

- ライブ・リージョン

詳細は、『Important Terms』(http://www.w3.org/TR/wai-aria/terms)を参照してください。

次の表には、MAFに適用可能なロールのカテゴリ(WAI-ARIA 1.0仕様での定義)がリストされています。

表13-12は、全般的なロール概念を定義する目的でWAI-ARIAのロールの分類をサポートするために使用される抽象ロールを示しています。

表13-12 抽象ロール

抽象ロール

説明

input

ユーザー入力を可能にする一般的なタイプのウィジェット。

landmark

ナビゲーショナル・ランドマークを意図したページのリージョン。

select

ユーザーが一連の選択肢から選択を行えるフォーム・ウィジェット。

widget

グラフィカル・ユーザー・インタフェースのインタラクティブ・コンポーネント。

表13-13は、スタンドアロン・ユーザー・インタフェース・ウィジェットまたは大きい複合ウィジェットの一部として機能するウィジェット・ロールを示しています。

表13-13 ウィジェット・ロール

ウィジェット・ロール

説明

ウィジェットで必要とされるステート

alertdialog

アラート・メッセージを含むダイアログのタイプ。最初のフォーカスはそのダイアログ内の要素に移動します。

aria-labelledby、aria-describedby

button

クリックまたは押されたときにユーザーによってトリガーされるアクションを可能にする入力。

aria-expanded (ステート)、aria-pressed (ステート)

checkbox

true、falseまたはmixedの3つの使用可能な値を持つチェック可能な入力。

aria-checked (ステート)

dialog

応答を要求するためにアプリケーションの現在の処理を中断するように設計されているアプリケーション・ウィンドウによって表されるダイアログ。

aria-labelledby、aria-describedby

link

内部または外部リソースへのインタラクティブな参照。アクティブ化されるとユーザー・エージェントがそのリソースにナビゲートします。

aria-disabled (ステート)、aria-describedby

option

選択リスト内の選択可能アイテム。

aria-labelledby、aria-checked (ステート)、aria-selected (ステート)

radio

ラジオ・ロールのグループ内のチェック可能入力。同時にチェックできるのはそれらのうち1つのみです。

aria-checked (ステート)、aria-disabled (ステート)

slider

指定された範囲内からユーザーが値を選択するユーザー入力。

aria-valuemax、aria-valuemin、aria-valuenow、aria-disabled (ステート)

listbox

選択肢のリストからユーザーが1つ以上のアイテムを選択できるウィジェット。

aria-live

radiogroup

ラジオ・ボタンのグループ。

aria-disabled (ステート)

listitem

リストまたはディレクトリ内の単一アイテム。

aria-describedby

textbox

その値として自由形式のテキストを使用できる入力。

aria-labelledby、aria-readonly、aria-required、aria-multiline、aria-disabled (ステート)

表13-14は、ページ内のコンテンツを編成する構造を記述するドキュメント構造ロールを示しています。通常、ドキュメント構造はインタラクティブではありません。

表13-14 ドキュメント構造ロール

ドキュメント構造ロール

説明

img

イメージを形成する要素のコレクションのコンテナ。

list

非インタラクティブ・リスト・アイテムのグループ。

listitem

リストまたはディレクトリ内の単一アイテム。

表13-15は、ナビゲーショナル・ランドマークを意図したページのリージョンを表すランドマーク・ロールを示しています。

表13-15 ランドマーク・ロール

ランドマーク・ロール

説明

application

Webアプリケーション(Webドキュメントではなく)として宣言されるリージョン.

banner

ほとんどサイト指向のコンテンツ(ページ固有のコンテンツではなく)を含むリージョン。

complementary

DOM階層の類似したレベルにあるメイン・コンテンツを補足するように設計ているが、メイン・コンテンツから切り離しても意味を持つドキュメントのサポート・セクション。

contentinfo

親ドキュメントに関する情報が含まれている大きな認識可能なリージョン。

form

全体として結合されてフォームを作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

main

ドキュメントのメイン・コンテンツ。

navigation

ドキュメントまたは関連ドキュメントをナビゲートするためのナビゲーショナル要素(通常はリンク)のコレクション。

search

全体として結合されて検索機能を作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

MAF UIコンポーネントの大部分では、アクセス可能なWAI-ARIA属性は変更できません。いくつかのコンポーネントでは、デザインタイムに特別なアクセス可能な属性を設定できます。また、パネル・グループ・レイアウトおよびデッキには、WAI-ARIAランドマーク・ロール・タイプを使用できます。詳細は、第13.8.1項「アクセシビリティのためのUIおよびデータ視覚化コンポーネントの構成方法」を参照してください。

13.8.3 Oracle Global HTML Accessibility Guidelinesに関する必知事項

Oracle Global HTML Accessibility Guidelines (OGHAG)は、オラクル社が準拠しているHTMLの一連のスクリプト標準です。これらの標準は、Section 508 (http://www.section508.govを参照)とWeb Content Accessibility Guidelines (WCAG) 1.0 level AA (http://www.w3.org/TR/WCAG10を参照)を組み合せ、言い回しとチェックポイントの測定を改善したものです。

詳細は、http://www.oracle.com/us/corporate/accessibility/policies/index.htmlのOracleのアクセシビリティについての考え方とポリシーを参照してください。

13.9 入力の検証

MAFでは、データ入力エラーおよびデータ入力中に発生するその他の状態に関して、エンド・ユーザーに通知できます。それらのタイプ(エラーまたは警告)に応じて、検証メッセージのルック・アンド・フィールが異なります。

ユーザー入力の検証は、入力が送信されたときにトリガーされます。入力テキスト・コンポーネントは、エンド・ユーザーがフィールドから離れたときに自動的に検証されます。チェックボックスや選択肢などの選択コンポーネントの場合は、エンド・ユーザー選択を行ったときに検証が行われます。検証のために、MAF AMXページのUIコンポーネントは、検証グループ操作(validationGroup)内にまとめられ、送信操作が実行されたときに入力が検証されるコンポーネントが定義されます。検証動作(validationBehavior)コンポーネントは、コマンド・コンポーネントのアクションが実行される前にどの検証グループが検証されるのかを定義します。1つのコマンド・コンポーネントが、複数の子検証動作コンポーネントを持つことができます。コンポーネントに検証動作が定義されていない場合、検証は行われません。

注意:
ネストされた検証グループ操作を定義することはできません。
検証グループの無効な定義は次のとおりです。

<amx:view>
<amx:panelPage>
<amx:validationGroup>
<amx:panelGroupLayout>
<amx:validationGroup/>
<amx:panelGroupLayout/>
</amx:validationGroup>
</amx:panelPage>
</amx:view>

有効な定義は次のとおりです。

<amx:view>
<amx:panelPage>
<amx:validationGroup>
</amx:panelPage>
<amx:popup>
<amx:validationGroup>
</amx:popup>
</amx:view>

MAF AMXページに検証エラー・メッセージが含まれている場合、リスト・アイテム、リンクおよびボタンなどのコマンド・コンポーネントを使用して、エンド・ユーザーがそのページから移動できないようにすることができます。警告を含むメッセージでは、ナビゲーションが停止されることはありません。

次の例は、MAF AMXファイルでの複数の検証グループおよび検証動作操作など検証要素の定義方法を示しています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="outputText1" value="Validate"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="commandButton2" action="go" text="Save">
<amx:validationBehavior id="vb1"
disabled="#{pageFlowScope.myPanel ne 'panel1'}"
group="group1"/>
<amx:validationBehavior id="vb2"
disabled="#{pageFlowScope.myPanel ne 'panel2'}"
group="group2"/>
<!-- invalid, should be caught by audit rule but for any reason
if group not found at run time, this validate is ignored -->
<amx:validationBehavior id="vb3" disabled="false" group="groupxxx"/>
<!-- group is not found at run time, this validate is ignored -->
<amx:validationBehavior id="vb4" disabled="false" group="group3"/>
</amx:commandButton>
</amx:facet>
<amx:panelSplitter id="ps1" selectedItem="#{pageFlowScope.myPanel}">
<amx:panelItem id="pi1">
<amx:validationGroup id="group1">
<amx:panelFormLayout id="pfl1">
<amx:inputText value="#{bindings.first.inputValue}"
required="true"
label="#{bindings.first.hints.label}"
id="inputText1"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText2"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panelItem>
<amx:panelItem id="pi2">
<amx:validationGroup id="group2">
<amx:panelFormLayout id="pfl2">
<amx:inputText value="#{bindings.salary.inputValue}"
label="#{bindings.first.hints.label}"
id="inputText3"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText4"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panelItem>
</amx:panelSplitter>
<amx:panelGroupLayout id="pgl1" rendered="false">
<amx:validationGroup id="group3">
<amx:panelFormLayout id="pfl4">
<amx:inputText value="#{bindings.salary.inputValue}"
label="#{bindings.first.hints.label}"
id="inputText5"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText6"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panelGroupLayout>
</amx:panelPage>

次の例は、MAF AMXファイルのポップアップに表示される確認メッセージの定義方法を示しています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="outputText1" value="Login Demo"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="btnBack" action="__back" text="Back"/>
</amx:facet>
<amx:panelGroupLayout id="panelGroupLayout1">
<amx:validationGroup id="group1">
<amx:panelGroupLayout id="panelGroupLayout2">
<amx:inputText value="#{bindings.userName.inputValue}"
label="#{bindings.userName.hints.label}"
id="inputText1"
showRequired="true"
required="true"/>
<amx:inputText value="#{bindings.password.inputValue}"
label="#{bindings.password.hints.label}"
id="inputText2"
required="true"
showRequired="true"
secret="true"/>
<amx:outputText id="outputText2"
value="#{bindings.timeToStayLoggedIn.hints.label}:
#{bindings.timeToStayLoggedIn.inputValue} minutes"/>
</amx:panelGroupLayout>
</amx:validationGroup>
<amx:commandButton id="commandButton2"
text="Login"
action="navigationSuccess">
<amx:validationBehavior id="validationBehavior2" group="group1"/>
</amx:commandButton>
</amx:panelGroupLayout>
</amx:panelPage>

検証メッセージはポップアップ・コンポーネントに表示されます(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。検証ポップアップのタイトルを構成することはできません。それは、相対的なメッセージ重大度によって自動的に決定されます。現在のメッセージのうちの最も重大なものが検証ポップアップのタイトルになります。つまり、すべての検証メッセージがWARNINGタイプである場合は、そのタイトルは「警告」になります。メッセージのいくつかがWARNINGタイプで、その他はERRORタイプの場合はタイトルは「エラー」に設定されます。

図13-119は、実行時に生成されるポップアップ検証メッセージを示しています。

図13-119 iPhoneでの検証メッセージ

13.10 イベント・リスナーの使用方法

MAF AMXページからJavaコードを呼び出し、アプリケーション・ロジックを実行するには、次のいずれかの方法でUIコンポーネントの属性としてリスナーを定義します。

- MAF AMXファイルのソースでの手動による方法。

- 選択したコンポーネントの「プロパティ」から。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次のリスナーを使用して、MAF AMXページにUIトリガー・イベントの検出機能を追加できます。

- valueChangeListener: 次のパラメータで作成されるValueChangeEventをリスニングします。

- 古い値を表すjava.lang.Object

- 新しい変更済の値を表すjava.lang.Object

- actionListener: パラメータなしで作成されるActionEventをリスニングします。

- selectionListener: 次のパラメータで作成されるSelectionEventをリスニングします。

- 古い行キーを表すjava.lang.Object

- 選択済行キーを表すjava.lang.String[]

- moveListener: 古い行キーを表すRowKeyタイプの次のパラメータで作成されるMoveEventをリスニングします。

- 移動済行キーを表すjava.lang.Object

- 移動済行キーがその前に挿入された行キーを表すjava.lang.String[]

- rangeChangeListener: パラメータなしで作成されるRangeChangeEventをリスニングします。

- mapBoundsChangeListener: 次のパラメータで作成されるMapBoundsChangeEventをリスニングします。

- 最小マップ境界のX座標(緯度)を表すjava.lang.Object

- 最小マップ境界のY座標(経度)を表すjava.lang.Object

- 最大マップ境界のX座標(緯度)を表すjava.lang.Object

- 最大マップ境界のY座標(経度)を表すjava.lang.Object

- マップ中心のX座標(緯度)を表すjava.lang.Object

- マップ中心のY座標(経度)を表すjava.lang.Object

- 現在のズーム・レベルを表すint

- mapInputListener: 次のパラメータで作成されるMapInputEventをリスニングします。

- イベント・タイプを表すjava.lang.String

- イベント・ポイントのX座標を表すjava.lang.Object

- イベント・ポイントのY座標を表すjava.lang.Object

- viewportChangeListener: 次のパラメータで作成されるViewportChangeEventをリスニングします。

- 最小X座標を表すjava.lang.Object

- 最大X座標を表すjava.lang.Object

- 最小Y座標を表すjava.lang.Object

- 最大Y座標を表すjava.lang.Object

- 最初の表示可能グループを表すjava.lang.Object

- 最後の表示可能グループを表すjava.lang.Object

リスナーの値は、パターン#{*}に一致している必要があり、次の要件を満たしている必要があります。

- タイプ名: EL式

- ベース・タイプ: 文字列

- プリミティブ・タイプ: 文字列

ELイベントの詳細は、第14.3.7項「ELイベントについて」を参照してください。

大部分のMAF AMXイベント・クラスは、oracle.adfmf.amx.event.AMXEventクラスの拡張です。Javaコードでイベント・リスナーを定義するときは、oracle.adfmf.amx.event.AMXEventクラスを渡す必要があります。

詳細は、次を参照してください。

- Oracle Mobile Application Framework Oracle Fusion Middleware Java APIリファレンス

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 第19.2.2項「AmxEventクラスの使用方法」

MAFでは、マネージドBeanメソッドがMAF AMX固有のイベント・クラスを使用するように、リスナーに対してマネージドBeanメソッドを作成できます。次の3つの例は、同じマネージドBeanメソッドをコールするボタンおよびリンク・コンポーネントを示しています。AMXEventのソース値は、コンポーネントのIDを含むメッセージ・ボックスを表示することでどのオブジェクトがイベントを起動したのかを判別します。

次の例は、MAF AMXファイルからBeanメソッドをコールする方法を示しています。

<amx:commandButton text="commandButton1"
id="commandButton1"
actionListener="#{applicationScope.Bean.actionListenerMethod}">
</amx:commandButton>
<amx:commandLink text="commandLink1"
id="commandLink1"
actionListener="#{applicationScope.Bean.actionListenerMethod}">
</amx:commandLink>

次の例は、AMXEventの使用方法を示しています。

private void actionListenerMethod(AMXEvent amxEvent) {
// Some Java handling
}

次の例は、イベント・メソッドを起動する方法を示しています。

public Object invokeMethod(String methodName, Object[] params) {
if (methodName.equals("actionListenerMethod")) {
actionListenerMethod((AMXEvent) params[0]);
}
return null;
}

追加の例は、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているAPIDemoというMAFサンプル・アプリケーションを参照してください。このサンプルは、Java Beanからリスナーをコールする方法を示しています。

13.10.1 イベント・リスナーの制約付きタイプ属性に関する必知事項

イベント・リスナーは、いくつかのMAF AMX UIコンポーネントの子として定義できます。リスナーのtype属性によって、それらがどのイベントを処理するために登録されるのかが識別されます。各親UIコンポーネントでは(親コンポーネントに適した)イベントのサブセットのみがサポートされているため、これらのサポートされているイベントは、リスナーに対して選択できる限られたタイプのリストに提示されます。

表13-16は、親UIコンポーネント、それが子として持つことができるイベント・リスナー、およびそれらがサポートしているイベント・タイプを示しています。

表13-16 サポートされているイベント・リスナーとイベント・タイプ

UIコンポーネント(親)

アクション・リスナー(子コンポーネント)

プロパティ・リスナーの設定(子コンポーネント)

クライアント・リスナー(子コンポーネント)

ポップアップ表示動作(子コンポーネント)

ポップアップを閉じる動作(子コンポーネント)

検証動作(子コンポーネント)

actionListener (属性)

valueChangeListener (属性)

moveListener (属性)

selectionListener (属性)

mapBoundsChangeListener (属性)

mapInputListener (属性)

viewportChangeListener (属性)

rangeChangeListener (属性)

drillListener (属性)

ボタン

サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

リンク

サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

リスト・アイテム

サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

入力日

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

入力数値スライダ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

入力テキスト

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

出力テキスト

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

リスト・ビュー

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

サポート

未サポート

チェックボックス

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

スイッチ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

チェックボックス(複数選択)

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

選択肢(複数選択)

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

選択肢

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

選択ボタン

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ラジオ・ボタン

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

リンク(実行)

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

カルーセル

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

カルーセル・アイテム

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

イメージ

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

表示

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

フィルム・ストリップ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

フィルム・ストリップ・アイテム

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

面グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

サポート

棒グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

サポート

バブル・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

サポート

コンボ・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

サポート

線グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

サポート

円グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

サポート

円グラフのデータ・アイテム

未サポート

サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

散布図

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

サポート

スパーク・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

ファンネル・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

サポート

ファンネル・データ・アイテム

未サポート

サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

チャートのデータ・アイテム

未サポート

サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

系列スタイル

未サポート

サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

LEDゲージ

未サポート

未サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ダイアル・ゲージ

未サポート

未サポート

未サポート

サポート

サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

評価ゲージ

未サポート

未サポート

未サポート

サポート

サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ステータス・メーター・ゲージ

未サポート

未サポート

未サポート

サポート

サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

地理マップ

未サポート

サポート済脚注 1

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート済脚注 2

サポート

サポート

未サポート

未サポート

未サポート

テーマ・マップ

未サポート

サポート済脚注 3

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート済脚注 4

未サポート

未サポート

未サポート

未サポート

未サポート

面

未サポート

サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ルート

サポート

サポート

未サポート

サポート

サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

マーカー

未サポート

サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

面データ・レイヤー

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ポイント・データ・レイヤー

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サンバースト

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ツリーマップ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

時系列

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

時系列の系列

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

時系列アイテム

未サポート

サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

NBox

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

脚注 1 プロパティ・リスナーの設定は、地理マップの領域のマーカーの子として指定できます。

脚注 2 selectionListener属性は、地理マップの面データ・レイヤーまたは点データ・レイヤーに設定できます。

脚注 3 プロパティ・リスナーの設定は、テーマ・マップの領域のマーカーの子として指定できます。

脚注 4 selectionListener属性は、テーマ・マップの面データ・レイヤーまたは点データ・レイヤーに設定できます。

子イベント・リスナーそれぞれのtype属性(図13-120を参照)には、リスナー・イベントと一致する値の基本セットがあります。これらの値は表13-16に示す情報に基づいてフィルタ処理され、それによって、子イベント・リスナーが、識別された親UIコンポーネントのコンテキスト内にある場合に、その親によってサポートされているイベントのみが表示されるようになります。たとえば、ボタン・コンポーネントの下にあるアクション・リスナーまたはプロパティ・リスナーの設定の子では、actionタイプの値およびジェスチャーのみか表示されます。

図13-120は、親リスト・アイテム・コンポーネントのプロパティ・リスナーの設定のかぎられたタイプ・リストにおいて使用可能な値を示しています。

図13-120 イベント・タイプの選択

脚注の説明

脚注 1: 詳細は、第13.3.27.1項「disabled属性に関する必知事項」を参照してください。

14 MAF AMXでのバインディングの使用とデータ・コントロールの作成

この章では、MAF AMXアプリケーション機能内でデータ・バインディング、データ・コントロールおよびデータ・バインディング式言語(EL)を使用する方法について説明します。また、オブジェクト・スコープ・ライフサイクル、マネージドBean、UIヒント、検証およびデータ変更イベントについても説明します。

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

- 第14.1項「バインディングおよびデータ・コントロールの概要」

- 第14.2項「オブジェクト・スコープ・ライフサイクルについて」

- 第14.3項「EL式の作成」

- 第14.4項「マネージドBeanの作成と使用」

- 第14.5項「データ・コントロールを使用したビジネス・サービスの公開」

- 第14.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」

- 第14.7項「実行時に行われる処理: バインディング・コンテキストの動作方法」

- 第14.8項「データ・コントロールの構成」

- 第14.9項「属性の使用」

- 第14.10項「Beanデータ・コントロールの作成および使用」

- 第14.11項「DeviceFeaturesデータ・コントロールの使用方法」

- 第14.12項「属性の検証」

- 第14.13項「データ変更イベントについて」

14.1バインディングおよびデータ・コントロールの概要

モバイル・アプリケーション・フレームワークによって、ユーザー・インタフェース(UI)・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロールと宣言的バインディング)が実装されています。データ・コントロールでは、関連するプロパティ、メソッド、タイプの情報を含め、サービスの操作とデータ・コレクションを表す標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化します。JDeveloperを使用すると、その情報をアイコンとして表示し、ページ上にドラッグ・アンド・ドロップできます。宣言的なバインディングによって、データ・コントロール内のデータ・コレクションからのデータ・アクセスとその操作の実行の詳細が抽象化されます。実行時に、モデル・レイヤーによって、適切なXMLファイルからデータ・コントロールおよびバインディングを記述した情報が読み取られ、ユーザー・インタフェースとビジネス・サービスの双方向の結合が実装されます。

ページのユーザー・インタフェース・コンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。モデル・レイヤーでは実行時にこのファイルが使用され、ページのバインディングがインスタンス化されます。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持され、EL式#{bindings}を使用して各ページ・リクエスト中にアクセスできます。この式により、現在のページのバインディング・コンテナが常に評価されます。「データ・コントロール」パネルから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインドされたユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。

モバイル・アプリケーション・フレームワークには、即時利用可能な2つのデータ・コントロール(DeviceFeaturesデータ・コントロールとApplicationFeaturesデータ・コントロール)が用意されています。JDeveloperの「データ・コントロール」パネル内に表示されるDeviceFeaturesデータ・コントロールを使用すると、データ・コントロールの主なデータ属性を(テキスト)フィールドとして、またデータ・コントロールの操作をコマンド・オブジェクト(ボタン)として、アプリケーションにドラッグ・アンド・ドロップできます。これらのドラッグ・アンド・ドロップ・アクションによって、アプリケーション内のELバインディングおよび作成されるコントロールに適したプロパティが生成されます。バインディングは、データ・コントロール・ソースを指すために、DataControls.dcxファイルによって表され、ページ・バインディングによって、特定のページの参照がデータ・コントロールにリンクされます。ApplicationFeaturesデータ・コントロールの詳細は、第4.6項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

データ・コントロールおよびバインディングの詳細は、次を参照してください。

- 第14.5項「データ・コントロールを使用したビジネス・サービスの公開」

- 第14.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」

- 第14.7項「実行時に行われる処理: バインディング・コンテキストの動作方法」

- 第14.8項「データ・コントロールの構成」

- 第14.9項「属性の使用」

- 第14.10項「Beanデータ・コントロールの作成および使用」

- 第14.11項「DeviceFeaturesデータ・コントロールの使用方法」

14.2 オブジェクト・スコープ・ライフサイクルについて

実行時、ページがデータにアクセスできるオブジェクト・スコープに必要なデータを格納することで、データをページに渡します。スコープによってオブジェクトの存続期間が決まります。オブジェクトをスコープに置くと、EL式を使用してスコープからアクセスできます。たとえば、fooという名前のマネージドBeanを作成し、Beanをビュー・スコープに存続させるよう定義するとします。このBeanにアクセスするには、#{viewScope.foo}という式を使用します。

モバイル・アプリケーション・フレームワーク変数とマネージドBean参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。MAFは、次のスコープ(可視性が高い順に表示)をサポートしています。

- アプリケーション・スコープ: オブジェクトは、アプリケーションが存続するかぎり(複数の機能にまたがって)使用可能です。

- ページ・フロー・スコープ: オブジェクトは、ページ・フロー・スコープのマネージドBeanがどこに定義されているかによって、機能(単一の機能の境界)またはタスク・フローが存続するかぎり使用できます。Beanがバインドなしタスク・フローに定義されている場合、そのスコープは機能です。Beanがバインド・タスク・フローに定義されている場合、そのスコープはタスク・フローに限定されます。

- ビュー・スコープ: オブジェクトは、ビューが存続するかぎり(機能の単一ページ内で)使用可能です。

オブジェクト・スコープは、プログラミング言語のグローバル変数およびローカル変数のスコープに相当します。スコープが広いほど、オブジェクトの可用性が高くなります。存続期間の間、これらのオブジェクトで特定のインタフェースの公開、情報の保持および他のオブジェクトへの変数とパラメータの受渡しを行うことができます。たとえば、アプリケーション・スコープに定義されているマネージドBeanは、アプリケーションが存続するかぎり、複数のページ・リクエストの間使用できます。ただし、ビュー・スコープに定義されているマネージドBeanは、1つの機能で1つのページ・リクエストの間のみ使用できます。

アプリケーション・スコープの名前空間で定義されたEL式は、アプリケーションが存続するかぎり、複数の機能にまたがって使用できます。アプリケーションの一方のビューでアプリケーション・スコープを定義し、そのスコープをもう一方のビューで参照できます。ページ・フロー・スコープの名前空間で定義されたEL式は、機能が存続するかぎり、単一の機能内で使用できます。ビュー・スコープの名前空間で定義されたEL式は、ビューが存続するかぎり、機能の単一ページ内で使用できます。このような変数を含むスコープに加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。詳細は、第14.3.6.2項「マネージドBeanカテゴリについて」および第14.3.6.3項「モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて」を参照してください。

マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。アプリケーション・スコープは、ユーザー情報やコンテキスト情報などのアプリケーション全体に関係する情報にのみ使用します。アプリケーション・スコープは、ページ間での値の受渡しには使用しないでください。

注意:
メモリー・スコープに配置するすべてのオブジェクトは、JSON DataChangeEventにシリアライズされ、このオブジェクト内のgetterメソッドによって返されるオブジェクトもシリアライズされます。これによって、シリアライズされたオブジェクト・ツリーが深くネストされることがあり、パフォーマンスが低下します。一連のネストされたオブジェクトをシリアライズしないようにするには、それらを一時オブジェクトとして定義する必要があります。詳細は、第14.10.1項「Beanクラス変数のシリアライズに関する必知事項」を参照してください。

14.2.1 オブジェクト・スコープとタスク・フローに関する必知事項

タスク・フロー内の変数にどのスコープを使用するかを決定するときは、ビュー・スコープまたはページ・フロー・スコープのみを使用する必要があります。アプリケーション・スコープは、タスク・フローの存続期間を超えてオブジェクトをメモリーに保存するため、タスク・フローのカプセル化および再利用で障害が発生します。さらに、アプリケーション・スコープでは、オブジェクトがメモリーに必要以上に長い時間保持されるため、不要なオーバーヘッドが発生します。

タスク・フロー内のアクティビティ間でデータ値を渡す必要がある場合は、ページ・フロー・スコープを使用する必要があります。現在のビュー・アクティビティ内でのみ必要とされ、ビュー・アクティビティ間にまたがっていない変数の場合、ビュー・スコープを使用する必要があります。

14.3 EL式の作成

EL式は、属性と実行時に決まるオブジェクト値をバインドするために、MAFアプリケーションで使用されます。たとえば、#{UserList.selectedUsers}は選択したユーザーのセットを参照でき、#{user.name}は特定のユーザー名を参照でき、#{user.role == 'manager'}はユーザーがマネージャかどうかを判断します。実行時、汎用式エバリュエータによって、これらの式に対してそれぞれList、Stringおよびbooleanの値が返され、コードなしで自動的に各オブジェクトとそのプロパティにアクセスします。

式は、値のレンダリングに必要になるまで評価されません。MAF AMXでは遅延評価のみがサポートされるため、即時構成式(${})を使用する式は解析を行いますが、その動作は遅延式(#{})と同じになります。実行時、特定のUIコンポーネント(inputTextコンポーネント、outputTextコンポーネントなど)の値は、そのvalue属性によって決まります。コンポーネントにはその値として静的テキストを割り当てることができますが、通常、value属性には、表示データを決定するために実行時インフラストラクチャにより評価されるEL式が含まれます。たとえば、現在ログイン中のユーザーの名前を表示するoutputTextコンポーネントには、value属性に#{UserInfo.name}という式を設定できます。コンポーネントの任意の属性(value属性だけでなく)にEL式を使用して値を割り当てることができるため、動的、かつデータ駆動型のユーザー・インタフェースの作成が容易になります。たとえば、UIコンポーネントのrendered属性に#{not empty UserList.selectedUsers}などのブール値の式を使用すると、表示するオブジェクト・セットが空のときにはそのコンポーネントを非表示にできます。UserListというオブジェクトの選択ユーザーのリストが空の場合、rendered属性はfalseと評価されるため、コンポーネントはページに表示されません。

通常のアプリケーションでは、UserListのようなオブジェクトはマネージドBeanとして作成します。ランタイムでは、EL式でBeanを最初に参照した際に、Beanのオンデマンドのインスタンス化が管理されます。値を表示する場合、ページを表示する際にランタイムでEL式が評価され、マネージドBeanから値を得て、コンポーネントにデータが移入されます。ユーザーがUIコンポーネントのデータを更新すると、同じEL式に基づいて、ランタイムで該当するマネージドBeanに値が戻されます。マネージドBeanの作成および使用の詳細は、第14.4項「マネージドBeanの作成および使用」を参照してください。EL式の詳細は、http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

注意:
EL式を編集可能コンポーネントのvalue属性に使用している場合は、そのコンポーネントに対応するsetメソッドが必要です。そうでないと、EL式は読取り専用と評価され、値の更新は許可されません。
たとえば、ページにinputTextコンポーネント(IDはit1)があり、その値が#{myBean.inputValue}に設定されているとします。inputText値を更新するには、myBeanマネージドBeanに次のようなgetメソッドとsetメソッドが必要です。

public void setIt1(RichInputText it1) {
this.it1 = it1;
}

public RichInputText getIt1() {
return it1;
}

14.3.1 データ・バインディングEL式について

「データ・コントロール」パネルを使用してコンポーネントを作成すると、MAFデータ・バインディング式が自動的に作成されます。この式は、バインディング・オブジェクトのデータを表示するか、バインディング・オブジェクトのプロパティを参照する、すべてのコンポーネント属性に追加されます。事前作成済のそれぞれの式は、ページ定義ファイルで定義された、適切なバインディング・オブジェクトを参照します。これらのバインディング式は編集可能ですが、MAFバインディング式の基本構文に従っていれば、独自に作成することもできます。MAFデータ・バインディング式は、属性がELをサポートする場合、バインディング・オブジェクトからのデータを移入する任意のコンポーネント属性に追加できます。

一般的なMAFデータ・バインディングEL式は、次の構文を使用して、バインディング・コンテナ内のタイプの異なるバインディング・オブジェクトを参照します。

#{bindings.BindingObject.propertyName}

ここでは、次のようになります。

- bindingsは、式によって参照されているバインディング・オブジェクトが現在のページのバインディング・コンテナにあることを識別する変数です。すべてのMAFデータ・バインディングEL式は、bindings変数で始まる必要があります。

- BindingObjectは、ページ定義ファイルで定義される、バインディング・オブジェクトのID、または属性については名前です。バインディングobjectIDまたは名前は、そのページ定義ファイル内で一意なものです。EL式は、パラメータ・バインディング、実行可能バインディングまたは値バインディングなど、ページ定義ファイル内のどのバインディング・オブジェクトでも参照できます。

- propertyNameは、各データバインドUIコンポーネントのデフォルトの表示方法を決定し、実行時のバインディング・オブジェクトのプロパティを設定する変数です。各タイプのバインディング・オブジェクトに対して、異なるバインディング・プロパティがあります。バインディング・プロパティの詳細は、第14.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

たとえば、次の式を例にしてみます。

#{bindings.ProductName.inputValue}

bindings変数は、現在のページのバインディング・コンテナでバインドされた値を参照します。参照されているバインディング・オブジェクトはProductNameであり、これは属性バインディング・オブジェクトです。バインディング・プロパティはinputValueで、最初のProductName属性の値を戻します。

ヒント:
ページ定義ファイルのバインディング式ではドル記号($)またはハッシュ記号(#)の接頭辞を使用できますが、MAFページのEL式で使用できるのは、ハッシュ記号(#)の接頭辞のみです。

前述のように、「データ・コントロール」パネルを使用してUIコンポーネントを作成する場合、これらの式が組み込まれます。ただし、必要に応じて手動で式を作成することもできます。JDeveloperの式ビルダーは、UIコンポーネントがバインドされるその他の有効なオブジェクトに加え、ページ定義ファイルに定義されたバインディング・オブジェクトのリストを提供することにより、EL式の構築を支援するダイアログです。また、MAFバインディング・オブジェクトの階層リストやMAFバインディング・オブジェクトの最も一般的に使用されるプロパティが提供されるため、MAFデータバインド式の作成や編集に特に便利です。バインディング・プロパティの詳細は、第14.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

14.3.2 EL式の作成方法

JDeveloperの式ビルダーを使用してEL式を宣言的に作成できます。「プロパティ」ウィンドウから「式ビルダー」にアクセスできます。

始める前に

EL式に関する知識が役立つ場合があります。詳細は、第14.3項「EL式の作成」を参照してください。

式ビルダーの使用手順:

1. 「プロパティ」ウィンドウで、変更する属性を見つけて、右端のドロップダウン・メニューを使用して「式ビルダー」を選択します。

2. 次の機能を使用して式を作成します。

- 「変数」ドロップダウンを使用して、式に含める項目を選択します。これらの項目は、階層形式のバインディング・オブジェクトであるツリーに表示されます。ツリーの各アイコンは、式で使用できる各種タイプのバインディング・オブジェクトを表します。
ツリーの絞り込みには、ドロップダウン・フィルタを使用するか、検索フィールドに検索条件を入力します。MAFで公開されているELでアクセス可能なオブジェクトは、「ADFマネージドBean」ノードの「モバイル・アプリケーション・フレームワーク・オブジェクト」ノードにあります。

ヒント:
これらのオブジェクトの詳細は、MAF Javadocを参照してください。第14.3.6項「式ビルダーのカテゴリについて」も参照してください。

ツリーで項目を選択すると、その項目がEL式内の「式」ボックスに移動されます。「式」ボックスに式を直接入力することもできます。

- 演算子ボタンを使用して、式に論理演算子または算術演算子を追加します。

図14-1は、「ADFマネージドBean」カテゴリからEL式を作成する方法の例を示しています。第14.3.6項「式ビルダーのカテゴリについて」で説明するカテゴリのいずれかからEL式を作成できます。

図14-1 「式ビルダー」ダイアログ

ヒント:
EL式を作成する正しい構文の使用の詳細は、http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

表14-1 式ビルダーのバインディング・ノードの下にあるアイコン

アイコン

説明

現在のページのバインディング・コンテナを参照する、bindingsコンテナ変数を示します。bindingsノードを開くと、現在のページのすべてのバインディング・オブジェクトが公開されます。

バインディング・コンテキスト全体を参照する、dataバインディング変数を示します(アプリケーション内の.cpxファイルから作成)。dataノードを開くと、アプリケーション内のページ定義ファイルが公開されます。

アクション・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なアクション・バインディング・プロパティのリストが公開されます。

イテレータ・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なイテレータ・バインディング・プロパティのリストが公開されます。

属性バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な属性バインディング・プロパティのリストが公開されます。

リスト・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なリスト・バインディング・プロパティのリストが公開されます。

表バインディング・オブジェクトまたはツリー・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な表バインディング・プロパティおよびツリー・バインディング・プロパティのリストが公開されます。

MAFバインディング・オブジェクト・プロパティを表します。MAFプロパティの詳細は、第14.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

パラメータ・バインディング・オブジェクトを表します。

Beanクラスを表します。

メソッドを表します。

14.3.2.1 メソッド式ビルダーについて

表14-2は、「プロパティ」ウィンドウで「式ビルダー」オプションではなく「メソッド式ビルダー」オプションが提供されるプロパティを示しています。これらの唯一の違いは、メソッド式ビルダーが、選択されたプロパティに応じてマネージドBeanをフィルタして除外することです。

表14-2 メソッド式ビルダーのプロパティ

プロパティ

要素

action

amx:commandButton

action

amx:commandLink

action

amx:listItem

action

amx:navigationDragBehavior

action

dvtm:chartDataItem

action

dvtm:ieDataItem

action

dvtm:timelineItem

action

dvtm:area

action

dvtm:marker

actionListener

amx:listItem

actionListener

amx:commandButton

actionListener

amx:commandLink

binding

amx:actionListener

mapBoundsChangeListener

dvtm:geographicMap

mapInputListener

dvtm:geographicMap

moveListener

amx:listView

rangeChangeListener

amx:listView

selectionListener

amx:listView

selectionListener

amx:filmStrip

selectionListener

dvtm:areaDataLayer

selectionListener

dvtm:pointDataLayer

selectionListener

dvtm:treemap

selectionListener

dvtm:sunburst

selectionListener

dvtm:timelineSeries

selectionListener

dvtm:nBox

selectionListener

dvtm:areaChart

selectionListener

dvtm:barChart

selectionListener

dvtm:bubbleChart

selectionListener

dvtm:comboChart

selectionListener

dvtm:horizontalBarChart

selectionListener

dvtm:lineChart

selectionListener

dvtm:funnelChart

selectionListener

dvtm:pieChart

selectionListener

dvtm:scatterChart

valueChangeListener

amx:inputDate

valueChangeListener

amx:inputNumberSlider

valueChangeListener

amx:inputText

valueChangeListener

amx:selectBooleanCheckbox

valueChangeListener

amx:selectBooleanSwitch

valueChangeListener

amx:selectManyCheckbox

valueChangeListener

amx:selectManyChoice

valueChangeListener

amx:selectOneButton

valueChangeListener

amx:selectOneChoice

valueChangeListener

amx:selectOneRadio

valueChangeListener

dvtm:statusMeterGauge

valueChangeListener

dvtm:dialGauge

valueChangeListener

dvtm:ratingGauge

viewportChangeListener

dvtm:areaChart

viewportChangeListener

dvtm:barChart

viewportChangeListener

dvtm:comboChart

viewportChangeListener

dvtm:horizontalBarChart

viewportChangeListener

dvtm:lineChart

14.3.2.2 非ELプロパティについて

表14-3は、ELに対応していないため「プロパティ」ウィンドウでEL式ビルダー・オプションが提供されないプロパティを示しています。

表14-3 非ELプロパティ

プロパティ

要素

id

すべての要素

facetName

amx:facetRef

failSafeClientHandler

amx:loadingIndicatorBehavior

failSafeDuration

amx:loadingIndicatorBehavior

group

amx:validationBehavior

name

amx:attribute

name

amx:attributeList

name

amx:attributeListIterator

name

amx:facet

ref

amx:attributeList

type

dvtm:attributeGroups

var

amx:carousel

var

amx:filmStrip

var

amx:iterator

var

amx:listView

var

amx:loadBundle

var

dvtm:areaChart

var

dvtm:barChart

var

dvtm:bubbleChart

var

dvtm:comboChart

var

dvtm:funnelChart

var

dvtm:horizontalBarChart

var

dvtm:lineChart

var

dvtm:pieChart

var

dvtm:scatterChart

var

dvtm:sparkChart

var

dvtm:geographicMap

varStatus

amx:attributeListIterator

14.3.3 MAFバインディング・プロパティに関する必知事項

式ビルダーを使用してデータバインドされたコンポーネントを作成すると、EL式によって、特定のMAFバインディング・プロパティが参照される場合があります。実行時には、これらのバインディング・プロパティによって、データバインドUIコンポーネントのデフォルトの表示方法や、イテレータ・バインディング固有のパラメータなどが定義されます。バインディング・プロパティは、Oracle APIによって定義されます。各バインディング・タイプで使用可能なプロパティの完全なリストは、表14-4「MAFバインディングの実行時ELプロパティ」を参照してください。

特定のプロパティに割り当てられる値は、ページ定義ファイルで定義されます。たとえば、イテレータ・バインディングには、イテレータが一度に表示する行数を指定する、RangeSizeというプロパティがあります。RangeSizeに割り当てられた値は、次の例に示すようにページ定義ファイルで指定されます。

<iterator Binds="ItemsForOrder" RangeSize="25"
DataControl="BackOfficeAppModuleDataControl"
id="ItemsForOrderIterator" ChangeEventPolicy="ppr"/>

14.3.4 イテレータ間でデータ・プロバイダの状態の保持を有効にする方法

同じデータ・コントロールに対してデータ・プロバイダの複数のインスタンスを作成できます。特定のイテレータで使用するデータ・プロバイダ・インスタンスを定義します。デフォルトのデータ・プロバイダ・インスタンスと同様に、新規データ・プロバイダ・インスタンスはデータ・コントロールのスコープに対して存在します。これにより、ページのメイン・リストをフィルタすると同時にフィルタされていないリストを含む別のコレクションを持つなどの操作を実行できます。

この機能を使用するには、同じデータ・コレクション・インスタンスにアクセスする各ページの最上位レベル・イテレータ(iterator)に同じRSIName属性を指定します。

次の例は、pageDefファイルのイテレータの階層を示しています。最後の2つのアクセサ・イテレータでは、第2コレクションの従業員オブジェクトとそれらの従業員の電話番号を反復できます。

<iterator Binds="root"
RangeSize="25"
DataControl="BusinessManager"
id="BusinessManagerIterator"
RSIName="secondCollection" />
<accessorIterator id="companyIterator"/
MasterBinding="BusinessManagerIterator"
Binds="company"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.Company"/>
<accessorIterator id="employeesIterator"
MasterBinding="companyIterator"
Binds="employees"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.Employee"/>
<accessorIterator id="phoneNumbersIterator"
MasterBinding="employeesIterator"
Binds="phoneNumbers"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.PhoneNumber"/>
<accessorIterator id="employeesIterator2"
MasterBinding="companyIterator"
Binds="employees"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.Employee"
RSIName="secondCollection" />
<accessorIterator id="phoneNumbersIterator2"
MasterBinding="employeesIterator2"
Binds="phoneNumbers"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.PhoneNumber" />

14.3.5 バインディング・コンテナを参照する方法

ルートEL式#{bindings}で、アクティブな画面のバインディング・コンテナを参照できます。式#{data.PageDefName}で、別の画面のバインディング・コンテナを参照できます。MAFAMXバインディング・オブジェクトは、バインディング・コンテナ"#{bindings.Name}"から名前で参照されます。

表14-4は、実行時に、EL式でMAF AMXバインディング・オブジェクトの値にアクセスするために使用できるプロパティのリストの一部を示しています。プロパティは、アルファベット順に並んでいます。

表14-4 MAFバインディングの実行時ELプロパティ

実行時プロパティ

説明

イテレータ

アクション

属性値

ツリー

class

実行時バインディング用のJavaクラス・オブジェクトを戻します。

はい

はい

はい

はい

collectionModel

データのコレクションを公開します。collectionModelにバインドされているコンポーネント内で使用するEL式は、コレクションの各要素の式を解決するrow変数脚注 1 を使用して参照できます。

いいえ

いいえ

いいえ

はい

collectionModel.makeCurrent

このバインディングのイテレータ内で、選択した行を現在の行にします。

いいえ

いいえ

いいえ

はい

collectionModel.selectedRow

選択した行への参照を戻します。

いいえ

いいえ

いいえ

はい

currentRow

イテレータが指している現在の行またはデータ・オブジェクト(組込みナビゲーション・アクションなど)への参照を戻します。

はい

いいえ

いいえ

いいえ

currentRow.dataprovider

イテレータが指している現在の行またはデータ・オブジェクトへの参照を戻します。(これはcurrentRowから戻されるものと同じオブジェクトで、構文のみが異なります)。

はい

いいえ

いいえ

いいえ

enabled

アクション・バインディングの状態に応じて、trueまたはfalseを戻します。たとえば、アクション・バインディングは、ユーザーが「先頭へ」、「次へ」、「前へ」、「最後へ」などのナビゲーション・ボタンをクリックした場合に決定される現在位置に基づいて、有効化(true)または無効化(false)されます。

いいえ

はい

いいえ

いいえ

execute

解決されたときに、名前付きアクションまたはmethodActionバインディングを起動します。

いいえ

はい

いいえ

いいえ

format

これはhints.formatのショートカットです。

いいえ

いいえ

はい

はい

hints

バインディングが関連付けられているすべての表示属性について、UIヒントの名前/値ペアのリストを戻します。

いいえ

いいえ

はい

はい

inputValue

バインディングが関連付けられている最初の属性の値を戻します。

いいえ

いいえ

はい

いいえ

items

現在のリストの有効な属性に関連付けられた値のリストを戻します。

いいえ

いいえ

はい

いいえ

label

hintsの子または属性の直接の子として使用できます。バインディングの最初の属性のラベルを戻します(コントロール・ヒントで指定されている場合)。

いいえ

いいえ

はい

はい

name

PageDef.xmlファイル内で宣言されたバインディングのidを戻します。

はい

はい

はい

はい

rangeSize

イテレータ・バインディングの行セットの範囲サイズを戻します。これにより、データソースからバインドされるデータ・オブジェクトの数を確認できます。

はい

いいえ

いいえ

はい

result

メソッド・アクション・バインディングによりバインドおよび起動されるメソッドの結果を戻します。

いいえ

はい

いいえ

いいえ

updateable

hintsの子または属性の直接の子として使用できます。バインディングが関連付けられている最初の属性が更新可能である場合、trueを戻します。それ以外の場合はfalseを戻します。

いいえ

いいえ

はい

はい

viewable

Treeの子として使用できます。このバインディングおよび関連コンポーネントをレンダリングするかどうかを実行時に解決します。

いいえ

いいえ

いいえ

はい

脚注 1 EL語句のrowは、コレクション・コンポーネントのコンテキスト内で使用されます。rowは単に、コレクションをレンダリングするときに、MAF AMXバインディング・オブジェクトからアクセスできる属性を含むコレクションの各要素に対する反復変数として機能します。属性とリスト・バインディングには、row変数を使用してアクセスできます。そのような式の構文は、コレクションに含まれないバインディング・オブジェクトへのアクセスに使用される構文と同じで、#{row.bindings.Name.property}のようにrow変数を先頭の語句として追加します。

14.3.6 式ビルダーのカテゴリについて

MAF AMXページの式ビルダーでは、次のカテゴリを使用できます。

- バインディング・カテゴリについて

- マネージドBeanカテゴリについて

- モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて

14.3.6.1 バインディング・カテゴリについて

この項では、「バインディング」カテゴリで使用できるオプションを表示します。bindingsノードとdataノードは、同じ一連のサポートされているバインディングとプロパティを表示します。表14-5に、使用できるバインディング・タイプと、各バインディング・タイプでサポートされるプロパティをリストします。securityContextノードは次のプロパティをサポートしています。

- authenticated

- userGrantedPrivilege

- userInRole

- userName

次に例を示します。

#{securityContext.authenticated}
#{securityContext.userGrantedPrivilege['submit_privilege']}
#{securityContext.userInRole[&rsquor;manager_role']}
#{securityContext.userName}

表14-5 サポートされるバインディング・タイプ

バインディング・タイプ

プロパティ

accessorIterator

class

currentRow: dataProvider

name

rangeSize

action

class

enabled

execute

name

attributeValues

autoSubmit

category

class

controlType

displayHeight

displayHint

displayWidth

filedorder

format

hints: allows.read, allows.update, autoSubmit, category, controlType, displayHeight, displayHint, displayWidth, filedorder, format, label, mandatory, precision, tooltip, updateable

inputValue

items

iteratorBinding

label

mandatory

name

precision

tooltip

updateable

button

autoSubmit

category

class

controlType

displayHeight

displayHint

displayWidth

filedorder

format

hints: allows.read, allows.update, autoSubmit, category, controlType, displayHeight, displayHint, displayWidth, filedorder, format, label, mandatory, precision, tooltip, updateable

inputValue

items

iteratorBinding

label

mandatory

name

precision

tooltip

updateable

invokeAction

always

deferred

iterator

class

currentRow: dataProvider

name

rangeSize

list

autoSubmit

category

class

controlType

displayHeight

displayHint

displayWidth

filedorder

format

hints: format, allows.read, allows.update, autoSubmit, category, controlType, displayHeight, displayHint, displayWidth, filedorder, format, label, mandatory, precision, tooltip, updateable

inputValue

items

iteratorBinding

label

mandatory

name

precision

tooltip

updateable

methodAction

class

enabled

execute

name

operationEnabled

operationInfo

paramsMap

result

methodIterator

class

currentRow: dataProvider

name

rangeSize

searchAction

class

enabled

execute

name

operationEnabled

operationInfo

paramsMap

result

tree

category

class

collectionModel: bindings, makeCurrent, selectedRow, <AttrName>

displayHeight

displayHint

displayWidth

filedorder

format

hints: category, displayHeight, displayHint, displayWidth, filedorder, format, label, mandatory, precision, tooltip, updateable, <AttrName>

iteratorBinding

label

mandatory

name

precision

rangeSize

tooltip

updateable

viewable

variable

class

currentRow: dataProvider

name

variableIterator

class

currentRow: dataProvider

name

14.3.6.2 マネージドBeanカテゴリについて

この項では、「マネージドBean」カテゴリで使用できるオプションを表示します。

- applicationScope: 「マネージドBean」のapplicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーション・スコープのマネージドBeanなど)。

- pageFlowScope: 「マネージドBean」のpageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロー・スコープのマネージドBeanなど)。

- viewScope: 「マネージドBean」のviewScopeノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュー・スコープのマネージドBeanなど)。

MAFランタイムでは、自身をマネージドBeanプロパティの変更通知のリスナーとして登録することによって、Beanプロパティを参照するUIコンポーネントにバインドされたEL式が、プロパティの値が変更されたときに自動的に更新されるようにします。これらの通知をソースとして参照するには、Beanのプロパティ・アクセッサにコードを追加する必要があります。必要なコードを自動的に生成するには、「アクセサの生成」ダイアログ(図14-2を参照)の「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します。

図14-2 プロパティの変更時にリスナーに通知

ELを通じてBeanメソッドまたはプロパティを参照する場合、このコードを追加する必要はありませんが、Beanに格納された値が変化する場合や、特にその変更が、プロパティ値を変更するBeanメソッドの実行による二次的な影響など、間接的なものである場合、それらの値に依存するEL式のアクティブ・フォームへのレンダリングを最新の状態に保つ必要があります。プロパティの変更とPropertyChangeSupportクラスについては、第14.13項「データ変更イベントについて」を参照してください。

次の例は、別のマネージドBeanの属性にバインドされている値をプログラムで取得する方法を示しています。

public void someMethod()
{
Object value = AdfmfJavaUtilities.evaluateELExpression("#{applicationScope.MyManagedBean.someProperty}");

次の例は、マネージドBeanからバインディングをプログラムで実行する方法を示しています。

public void someMethod()
{
Object value = AdfmfJavaUtilities.evaluateELExpression("#{bindings.someDataControlMethod.execute}");

注意:
機能のapplicationScope内でマネージドBeanを宣言し、デザインタイムで別の機能のELを通じてそのBeanを参照しようとすると、そのデザインタイムで無効なELに関する警告が表示されます。この警告は、デザインタイムがそのBeanの現在のプロジェクトで参照を検出できないことが原因で表示されます。そのBeanを実行時に参照できるのは、Beanが宣言されている最初の機能に初めてアクセスし、さらに別の機能のELを通じてアクセスする前にそのBeanをインスタンス化した場合のみです。これは、Name属性の値をノード・ラベルとして使用するPreferenceValue要素には当てはまりません。

14.3.6.3 モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリには、オブジェクト・スコープなどのELを使用して参照できるMAFに定義されている様々なオブジェクトが一覧表示されます。

MAF変数とマネージドBean参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。これらのスコープには、可視性が高い順に、アプリケーション・スコープ、ページ・フロー・スコープおよびビュー・スコープがあります。様々なオブジェクト・スコープの詳細は、第14.2項「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

このような変数を含むスコープに加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリで使用できるものは、次のとおりです。

- applicationScope: applicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーション・スコープのマネージドBeanなど)。アプリケーション・スコープで定義されたEL変数は、アプリケーションが存続するかぎり、複数の機能にまたがって使用できます。

- pageFlowScope: pageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロー・スコープのマネージドBeanなど)。ページ・フロー・スコープの名前空間で定義されたEL変数は、ページ・フロー・スコープのマネージドBeanがどこに定義されているかによって、機能またはタスク・フローが存続するかぎり使用できます。Beanがバインドなしタスク・フローに定義されている場合、そのスコープは機能です。Beanがバインド・タスク・フローに定義されている場合、そのスコープはタスク・フローに限定されます。

- preferenceScope: preferenceScopeノードには、アプリケーションと機能のすべてのプリファレンスが含まれます。
プリファレンス要素では、PreferenceValue要素を除き、Id属性の値を式ビルダーのノード・ラベルとして使用します。PreferenceValue要素では、Name属性の値を式ビルダーのノード・ラベルとして使用します。

注意:
EL式の文字列トークンにドット(.)や特殊文字またはdefaultなどの予約語が含まれている場合、式ビルダーではそのような文字列トークンを一重引用符と大カッコで囲みます。機能IDやプリファレンス・コンポーネントIDにドットが含まれている場合、式ビルダーでは、ドットによって区切られたIDの各部分を別のプロパティとしてpreferenceScope階層に表示します。生成された式でも、ドットによって区切られたIDの各部分を別のプロパティとして認識します。

preferenceScopeのいくつかのサンプルEL式を次に示します。

"#{preferenceScope.feature.oracle.hello.SampleGroup1.label}"

"#{preferenceScope.application.OracleMobileApp.Edition['default']}"

- viewScope: このノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュー・スコープのマネージドBeanなど)。ビュー・スコープの名前空間で定義されたEL変数は、ビューが存続するかぎり、機能の単一ページ内で使用できます。

- row: rowオブジェクトは、collectionModelに含まれる単一のプロバイダへのショートカットである中間変数です。その名前は、親コンポーネント(リスト・ビューまたはカルーセルなど)のvar属性の値です。

注意:
AdfmfJavaUtilities.evaluateELExpressionを使用して#{row}またはrowのプロパティを評価することはできません。これらの式は、Null値を返します。

- viewControllerBundle
これは、プロジェクト・レベルで定義されたリソース・バンドルを指すリソース・バンドル変数の名前です。このノードは、amx:loadBundle要素がドロップされ、リソース・バンドルが作成された後にのみ表示されます。このノードの名前は、amx:loadBundleの変数名によって異なります。このノードには、バンドル内で宣言されたすべての文字列が表示されます。

次の例は、viewControllerBundleのAMXコードの例を示しています。

<amx:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle"/>

14.3.7 ELイベントについて

ELイベントは、共通語句を含む式が相互に同期して更新できるようにするため、MAF AMX UIの動作において重要な役割を果たします。

EL式は、様々なコンテキストで値を参照できます。次の例は、各コンポーネントがapplicationScope値に関連付けられた2つの入力数値スライダ・コンポーネントの作成方法を示しています。出力テキストでは、ELを使用して単純な追加式を計算結果とともに表示します。フレームワークでは、出力テキスト・ラベル内のEL式を解析するときに、その式に2つの値への参照が含まれていることを確認し、それら2つの値に基づく出力テキストのイベント・リスナー(第13.10項「イベント・リスナーの使用方法」を参照)を作成します。基礎となる式の値が変化すると、イベントがその値のすべてのリスナーに対して生成されます。

注意:
(スコープ・オブジェクトではなく)マネージドBeanのプロパティを参照している場合、リスナーを追加する必要があります。詳細は、第14.3.6.2項「マネージドBeanカテゴリについて」を参照してください。

<amx:inputNumberSlider id="slider1" label="X" value="#{applicationScope.X}"/>
<amx:inputNumberSlider id="slider2" label="Y" value="#{applicationScope.Y}"/>
<amx:outputText id="ot1" value="#{applicationScope.X} +
#{applicationScope.Y} = #{applicationScope.X + applicationScope.Y}"/>

前述の例では、2つのコンポーネントがそれぞれ1つの値を更新し、1つのコンポーネントが両方の値を使用します。次の例は、いずれかの既存の値を参照する3つ目の入力数値スライダ・コンポーネントが追加された場合、動作は同じになることを示しています。

<amx:inputNumberSlider id="slider1" label="X" value="#{applicationScope.X}"/>
<amx:inputNumberSlider id="slider2" label="Y" value="#{applicationScope.Y}"/>
<amx:outputText id="ot1" value="#{applicationScope.X} +
#{applicationScope.Y} = #{applicationScope.X + applicationScope.Y}"/>
<amx:inputNumberSlider id="slider3" label="X" value="#{applicationScope.X}"/>

前述の例では、いずれかの入力数値スライダ・コンポーネントが#{applicationScope.X}を更新すると、もう一方が出力テキストとともに自動的に更新されます。

14.3.8 EL式のマネージドBean内での使用方法

必要なEL式はJDeveloperで作成され、作成されない式は式ビルダーを使用して作成できますが、マネージドBean内でEL式にアクセスしたり、EL式を設定または起動する必要がある場合もあります。

次の例に、EL式への参照を取得し、適合するオブジェクトを返す(または作成する)方法を示します。

public static Object resolveExpression(String expression) {
return AdfmfJavaUtilities.evaluateELExpression(expression);
}

次の例に、メソッド式を解決する方法を示します。

public static Object resloveMethodExpression(String expression,
Class returnType,
Class[] argTypes,
Object[] argValues) {
MethodExpression methodExpression = AdfmfJavaUtilities.getMethodExpression(expression,
returnType,
argTypes);
return methodExpression.invoke(AdfmfJavaUtilities.getAdfELContext(), argValues);
}

次の例に、マネージドBeanに新規オブジェクトを設定する方法を示します。

public static void setObject(String expression, Object newValue) {
AdfmfJavaUtilities.setELValue(expression, newValue);
}

14.4 マネージドBeanの作成と使用

マネージドBeanは、様々な構成ファイルを使用してアプリケーションに登録するJavaクラスです。MAFアプリケーションを起動すると、これらの構成ファイルが解析されてBeanが使用可能になり、EL式で参照できるため、Beanのプロパティとメソッドにアクセスできます。マネージドBeanが初めて参照されたときにまだ存在していない場合、マネージドBean作成機能によりBeanのデフォルトのコンストラクタ・メソッドがコールされて、Beanがインスタンス化されます。また、プロパティが宣言されると、宣言されたデフォルトの値が移入されます。

多くの場合、マネージドBeanは、フロント・エンドで処理することが最適なイベントやデータ操作を処理します。マネージドBeanの使用方法の詳細は、http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

ベスト・プラクティス:
マネージドBeanを使用して、現在のユーザーなどのブックキーピング情報のみを格納します。すべてのアプリケーション・データおよび処理データは、アプリケーションのビジネス・レイヤーのロジックによって処理される必要があります。

注意:
EL式には、Beanを参照するために明示的にスコープを指定する必要があります。たとえば、pageFlowScopeスコープからMyBeanマネージドBeanを参照するには、#{pageFlowScope.MyBean}という式になります。

14.4.1 JDeveloperでのマネージドBeanの作成方法

adfc-mobile-config.xmlファイルに概要エディタを使用して、マネージドBeanの作成とMAFアプリケーションへの登録を同時に行うことができます。

始める前に

マネージドBeanに関する知識が役立つ場合があります。詳細は、第14.4項「マネージドBeanの作成と使用」を参照してください。

マネージドBeanの作成および登録手順:

1. 「アプリケーション」ウィンドウで、adfc-mobile-config.xmlをダブルクリックします。

2. エディタ・ウィンドウで、「概要」タブをクリックします。

3. 概要エディタで、「マネージドBean」ナビゲーション・タブをクリックします。
図14-3は、adfc-mobile-config.xmlファイルのエディタを示しています。

図14-3 adfc-mobile-config.xmlファイル内のマネージドBean

4. 「追加」アイコンをクリックして「マネージドBean」表に行を追加します。

5. 「マネージドBeanの作成」ダイアログで値を入力します。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。JDeveloperでクラス・ファイルを作成する場合は、「クラスが存在しない場合は生成」オプションを選択します。リスナー・プロパティのいずれかを選択して「編集」ボタンをクリックすることで、「プロパティ」ウィンドウから「マネージドBeanの作成」ダイアログを開くこともできます。そこから、新しいマネージドBeanと対応するメソッドを作成できます。

注意:
マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。様々なオブジェクト・スコープの詳細は、第14.2項「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

6. オプションでBeanに管理プロパティを追加できます。Beanがインスタンス化される際、指定した値が管理プロパティに設定されます。「Managed Bean」表でBeanを選択した状態で「新規」アイコンをクリックし、「管理プロパティ」表に行を追加します。「プロパティ」ウィンドウで、プロパティ名を入力します(他のフィールドはオプションです)。

注意:
このエディタを使用して管理プロパティを宣言することはできますが、対応するコードはJavaクラスで生成されません。適切なタイプのプライベート・メンバー・フィールドを作成し、コード・エディタのポップアップ・メニューの「アクセッサの生成」メニュー項目を選択して、これらのBeanプロパティに対応するgetおよびsetメソッドを生成することにより、コードを追加する必要があります。

14.4.2 JDeveloperを使用してマネージドBeanを作成する場合の処理

マネージドBeanを作成する際、Javaファイルを生成するよう選択すると、指定された名前とデフォルト・コンストラクタを使用してスタブ・クラスが自動的に作成されます。次の例に、ビュー・パッケージに格納されたMyBeanクラスに追加されるコードを示します。

package view;

public class MyBean {
public MyBean() {
}
}

ここでページに必要なロジックを追加する必要があります。このロジックは、マネージドBeanのmanaged-bean-nameを参照するEL式を使用して参照できます。たとえば、my_beanマネージドBeanのmyInfoプロパティにアクセスする場合、EL式は次のようになります。

#{my_bean.myInfo}

JDeveloperでは、managed-bean要素もadfc-mobile-config.xmlファイル(または編集されるタスク・フロー・ファイル)に追加されます。次の例に、MyBeanクラスに対して作成されたmanaged-bean要素を示します。

<managed-bean>
<managed-bean-name>my_bean</managed-bean-name>
<managed-bean-class>view.MyBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

14.5 データ・コントロールを使用したビジネス・サービスの公開

アプリケーションのサービスの準備ができたら、JDeveloperを使用して、UIコンポーネントとサービスとの宣言的バインドに必要な情報を提供するデータ・コントロールを作成できます。

データ・コントロールの生成には、「データ・コントロールの作成」メニュー・アイテムを使用します。データ・コントロールは、1つ以上のXMLメタデータ・ファイルで構成され、これらのファイルでは、実行時にバインディングと連動するサービスの機能が定義されます。データ・コントロールは、基礎となるサービスと連動します。

14.5.1 データ・コントロールの作成方法

データ・コントロールは、JDeveloperの「アプリケーション」ウィンドウ内で作成します。

始める前に

データ・コントロールの一般的な知識があると役立ちます。詳細は、第14.5項「データ・コントロールを使用したビジネス・サービスの公開」を参照してください。

次のタスクを完了する必要があります。

アプリケーション・ワークスペースを作成し、データ・コントロールの基礎にするビジネス・サービスを追加します。アプリケーション・ワークスペースの作成の詳細は、第2.2項「MAFアプリケーションの作成」を参照してください。

データ・コントロールを作成する手順は、次のとおりです。

1. アプリケーション・ワークスペース内でデータ・モデル・プロジェクトの最上位ノードを右クリックして、「新規」を選択し、「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「ビジネス層」を展開し、「データ・コントロール」を選択して、作成するデータ・コントロールのタイプを選択し、「OK」をクリックします。

3. ウィザードの残りのステップを完了します。

注意:
場合によっては、データ・コントロールの基礎にするクラスまたはオブジェクトを右クリックし、「データ・コントロールの作成」を選択することによってデータ・コントロールを作成できます。

14.5.2 データ・コントロール作成時のプロジェクト内の処理

データ・コントロールを作成する際に、JDeveloperによってデータ・コントロール定義ファイル(DataControls.dcx)が作成され、概要エディタでファイルが開き、ファイルの階層が「データ・コントロール」パネルに表示されます。このファイルにより、データ・コントロールがサービスおよびバインディングと直接連動して動作することが可能になります。

エディタ・ウィンドウの「ソース」タブをクリックすることによって、対応するXMLファイルからのコードを表示できます。

14.5.2.1 DataControls.dcx概要エディタ

DataControls.dcxファイルの概要エディタは、データ・コントロール・オブジェクトの階層と、データ・モデルの公開メソッドを表示します。

概要エディタおよび「データ・コントロール」パネルで使用されるアイコンの説明は、表14-6を参照してください。

データ・コントロール・オブジェクトの設定を変更するには、オブジェクトを選択し、「編集」アイコンをクリックします。データ・コントロールの編集方法の詳細は、第14.8.1項「データ・コントロールの編集方法」を参照してください。

図14-4は、概要エディタでのDataControls.dcxファイルを示しています。

図14-4 概要エディタでのDataControls.dcxファイル

14.5.2.2 データ・コントロール・パネル

「データ・コントロール」パネルはパレットとして機能し、ノードを「データ・コントロール」パネルからページのデザイン・エディタにドラッグすることにより、データバインドされたUIコンポーネントを作成できます。データ・コントロールを作成した後、「データ・コントロール」パネルが「アプリケーション」ウィンドウに表示されます。図14-5は、サンプル・アプリケーションの「データ・コントロール」パネルを示しています。

図14-5 「データ・コントロール」パネル

14.5.3 データ・コントロールの組込み操作

データ・コントロール・フレームワークは、データ・コントロールの標準操作のセットを定義します。これらの操作は、基礎となるビジネス・サービスの機能を使用して実装されます。実行時に、これらのデータ・コレクション操作の1つがデータ・バインディング・レイヤーによって名前を指定して起動されると、データ・コントロールは、組込み機能を処理する適切なサービス・メソッドにそのコールを委譲します。たとえば、Beanデータ・コントロールでは、Next操作はBeanコレクションのイテレータに依存します。

ほとんどの組込み操作は、現在の行に作用します。ただし、execute操作がデータ・コントロール自体をリフレッシュします。

使用可能な操作は、データ・コントロールのタイプと、基礎となるビジネス・サービスの機能によって異なります。次に、組込み操作すべてのリストを示します。

- Create: 現在の行になる新規行を作成。この新規行は、行セットにも追加されます。

- CreateInsert: 現在の行となる新規行を作成し、その行を行セットに挿入。

- Create With Parameters: 名前付きパラメータを使用して現在の行になる新規行を作成し、その行を行セットに挿入。

- Delete: 現在の行を削除。

- Execute: アクセッサ・メソッドを実行または再実行することによって、データ・コレクションをリフレッシュします。
ExecuteWithParams: パラメータとして渡された変数に新しい値を割り当てた後で、関連した問合せを実行または再実行することにより、データ・コレクションをリフレッシュ。この操作は、パラメータ化された問合せに基づくデータ・コントロール・コレクション・オブジェクトに対してのみ使用できます。

- First: 行セット内の最初の行を現在の行に設定します。

- Last: 行セット内の最後の行を現在の行に設定します。

- Next: 行セット内の次の行を現在の行に設定します。

- Next Set: 1つ後の行のセットに移動します。

- Previous: 行セット内の前の行を現在の行に設定します。

- Previous Set: 1つ前の行のセットに移動します。

- removeRowWithKey: パラメータとして渡された行キーのシリアライズされた文字列表現を使用して行の検索を試行します。検出されると、その行が削除されます。

- setCurrentRowWithKey: パラメータとして渡された行キーのシリアライズされた文字列表現を使用して行の検索を試行します。検出されると、その行が現在の行になります。

- setCurrentRowWithKeyValue: パラメータとして渡された主キーの属性値を使用して行の検索を試行します。検出されると、その行が現在の行になります。

14.6 「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成

「データ・コントロール」パネルから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインドされたユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要な、様々なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。

「データ・コントロール」パネルでは、各データ・コントロール・オブジェクトが特定のアイコンで表されます。表14-6は、各アイコンが表すデータ・コントロール・オブジェクト、「データ・コントロール」パネルの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。

表14-6 「データ・コントロール」パネルのアイコンおよびオブジェクト階層

アイコン

名前

説明

作成できるコンポーネント

データ・コントロール

データ・コントロールを表します。

他のオブジェクトのコンテナとして機能し、作成には使用されません。

コレクション

アクセッサ・メソッドまたは操作から返される名前付きデータ・コレクションを表します。

フォーム、表、グラフ、ツリー、レンジ・ナビゲーションの各コンポーネント、マスター/ディテール・コンポーネントおよび選択リストの各コンポーネント。

構造化された属性

Javaプリミティブ・タイプ(属性として示される)または任意のタイプのコレクションのいずれでもない、戻りオブジェクトを示します。

フォーム、ラベル、テキスト・フィールド、日付、値リストおよび選択リストの各コンポーネント。

属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。

キー属性

データ・コントロール構造ファイル、またはビジネス・サービス自体で、主キー属性として宣言されたオブジェクト属性を表します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。

メソッド

データ・コントロールのメソッドまたは操作、またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはコレクションを戻したりすることができます。

コマンド・コンポーネント。

パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。

メソッド戻り値

メソッドまたはその他の操作から返されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、または親コレクションで実行できる操作などです。

単一の値の場合: テキスト・フィールドおよび選択リスト。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント。

単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するために、対応するメソッドをボタンとしてドロップできます。フォームがタスク・フローの一部の場合、メソッドを起動するためのメソッド・アクティビティを作成できます。

操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。

ボタンおよびリンクなどのUIコマンド・コンポーネント。

パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。

ラベル、テキストおよび選択リストの各コンポーネント。

14.6.1 「データ・コントロール」パネルの使用方法

JDeveloperは、ドロップするデータ・コントロール項目に対してそれぞれ選択できるUIコンポーネントの事前定義済セットを備えています。

始める前に

「データ・コントロール」パネルの各種オブジェクトに関する知識があると役立つ場合があります。詳細は、第14.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。

次のタスクを完了する必要があります。

- 第14.5.1項「データ・コントロールの作成方法」の説明に従って、データ・コントロールを作成します。

- 第12.3.1.2項「MAF AMXページの作成」の説明に従って、MAF AMXページを作成します。

「データ・コントロール」パネルを使用してUIコンポーネントを作成するには:

1. 「データ・コントロール」パネルで項目を選択し、ページのビジュアル・エディタにその項目をドラッグします。パネル内の各アイテムの定義は、表14-6「「データ・コントロール」パネルのアイコンおよびオブジェクト階層」を参照してください。

2. ポップアップ・メニューから、UIコンポーネントを選択します。
「データ・コントロール」パネルから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのポップアップ・メニューが表示されます。表示されるコンポーネントは、プロジェクト内のライブラリに基づきます。

図14-6は、「データ・コントロール」パネルのデータ・コレクションがページにドロップされる際に表示されるポップアップ・メニューを示しています。

図14-6 「データ・コントロール」パネルからのコンポーネントのドロップ

ポップアップ・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログが自動的に表示されます。たとえば、ポップアップ・メニューから「フォーム」を選択すると、「フォーム・フィールドの編集」ダイアログが開きます。コンポーネントを選択すると、JDeveloperではビジュアル・エディタのページにそのUIコンポーネントが挿入されます。

デフォルトで選択されたUIコンポーネントはまず、対応するビジネス・オブジェクト上で設定されているUIヒントで決定されます。UIヒントが設定されていない場合、JDeveloperでは標準のフォームおよび表の入力コンポーネントと読取り専用のフォームおよび表の出力コンポーネントが使用されます。リストのコンポーネントは、データ・コントロール・オブジェクトをドロップするときに選択するリストの型に基づいて決定されます。

デフォルトでは、データ・コントロールの使用時に作成されるUIコンポーネントは、MAFデータ・コントロール内の属性にバインドされ、次のような組込み機能を装備できます。

- データバインド・ラベル

- ツールチップ

- 書式設定

- 基本的なナビゲーション・ボタン

- 検証(検証規則が特定の属性にアタッチされている場合。)

デフォルトのコンポーネントは、そのまま使用しても十分機能します。ただし、特定のニーズに合せて変更することができます。

ヒント:
ページで使用するMAFデータバインド・コンポーネントのタイプを変更する場合は、ビジュアル・エディタまたは構造ウィンドウを使用してそのコンポーネントを削除し、「データ・コントロール」パネルから新しいコンポーネントをドラッグ・アンド・ドロップする方法が最も簡単です。データバインドされたコンポーネントをページから削除するときにビジュアル・エディタまたは構造ウィンドウを使用する場合、ページ定義ファイルの関連するバインディング・オブジェクトが他のどのコンポーネントからも参照されていなければ、これらのバインディング・オブジェクトはJDeveloperによって自動的に削除されます(ソース・エディタを使用する場合は、バインディング・オブジェクトの自動削除は行われません)。

14.6.2 「データ・コントロール」パネルの使用時の処理

「データ・コントロール」パネルを使用してアプリケーションを構築すると、JDeveloperによって次の処理が行われます。

- DataBindings.cpxファイルがプロジェクトのデフォルト・パッケージに作成されます(このファイルが存在しない場合のみ)。また、そのページ用にエントリが追加されます。
DataBindings.cpxファイルは、アプリケーションのバインディング・コンテキストを定義します。バインディング・コンテキストはコンテナ・オブジェクトの1つで、使用可能なデータ・コントロールおよびデータ・バインディング・オブジェクトのリストを含みます。DataBindings.cpxファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。詳細は、第12.3.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

- META-INFディレクトリにadfm.xmlファイルが作成されます。このファイルにより、DataBindings.cpxファイルのレジストリが作成され、バインディング・コンテキストを作成できるように、実行時にアプリケーションで特定できます。

- パッケージ定義ファイルがページ定義サブパッケージに追加されます(ページに対してファイルが存在しない場合)。デフォルトのサブパッケージは、adfmsrcディレクトリにあるmobile.pageDefsです。

ヒント:
「プロジェクト・プロパティ」ダイアログ(プロジェクト・ノードをダブルクリックするとアクセスできる)のADFモデル設定ページで、パッケージ構成(名前と場所など)を設定できます。

ページ定義ファイル(pageNamePageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのバインディング・コンテナを定義します。バインディング・コンテナでは、ページのすべてのバインディング・オブジェクトへのランタイム・アクセスが行われます。ページ定義ファイルの詳細は、第12.3.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

ヒント:
現在のバインディング・コンテナは、プログラム的なアクセス用のAdfContextからも入手できます。

- ページ定義ファイルが構成されます。この処理では、ページによって参照されるバインディング・オブジェクトの定義も追加されます。

- ページに指定のコンポーネントを追加します。
これらの事前作成済のコンポーネントには、ページ定義ファイルのバインディング・オブジェクトを参照するデータ・バインディング式言語(EL)式が含まれます。詳細は、第14.3.1項「データ・バインディングEL式について」を参照してください。

- UIコンポーネントが必要とするすべてのライブラリ、ファイル、および構成要素が追加されます。データバインドされたコンポーネントに必要なアーティファクトの詳細は、第2.2.2項「MAFアプリケーションの作成時に行われる処理」を参照してください。

14.7 実行時に行われる処理: バインディング・コンテキストの動作方法

ページにMAFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、バインディング・コンテキストと呼ばれるシングル・オブジェクトを介して、アプリケーションによって管理されます。バインディング・コンテキストは、アプリケーション内のすべてのデータ・コントロールおよびページ定義のランタイム・マップ(名前付きdataでEL式#{data}を使用してアクセス可能)です。

図14-7に示すように、MAFでは、アプリケーション、DataBindings.cpxおよびページ定義ファイルからバインディング・コンテキストが作成されます。設計時に使用可能なデータ・コントロールは、すべてのDataControls.dcxファイルとワークスペース内のすべてのアプリケーション・モジュールの集合体によって定義されますが、実行時にアプリケーションで使用可能なデータ・コントロールは、DataBindings.cpxファイルで定義されます。DataBindings.cpxファイルは、アプリケーションのページで使用されているすべてのデータ・コントロールを一覧表示し、ページ定義ファイルに定義したバインディング・オブジェクトが格納されているバインディング・コンテナをWebページのURLにマップします。ページ定義ファイルは、アプリケーション・ページで使用するバインディング・オブジェクトを定義します。各ページにページ定義ファイルが1つあります。

バインディング・コンテキストには、これらのオブジェクトのライブ・インスタンスは含まれません。かわりに、マップには必要に応じてデータ・コントロールまたはバインディング・コンテナ・オブジェクトになる参照が含まれます。たとえば、オブジェクト(ページ定義など)がアプリケーションから解放されるか、タスク・フローが終了するか、リクエストの終了時にバンディング・コンテナまたはデータ・コントロールが解放されると、データ・コントロールおよびバンディング・コンテナは参照オブジェクトに戻ります。DataBindings.cpxファイルの詳細は、第12.3.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

図14-7 ファイル・バインディング・コンテキストの実行時の使用

注意:
コンポーネントを構成するときは、使用するバインディング・スタイルを十分に考慮してください。より具体的に言うと、標準的なバインディングをマネージドBeanバインディングと組み合せると、解釈を誤った動作が発生することがよくあります。これは、バインディング・インフラストラクチャとマネージドBeanインフラストラクチャとの間でクラス・インスタンスが一致する可能性が低いためです。バインディングが混在すると、UIに直接リンクされていないインスタンスの動作がコールされる場合があります。

MAFでのバインディングの使用の詳細は、次の項を参照してください。

- 第12.3.3.4項「生成されるバインディングに関する必知事項」

- 第12.3.3.6項「MAF AMXエディタの「バインディング」タブの使用方法」

- 第12.3.3.7項「未使用のバインディングの削除に関する必知事項」

14.8 データ・コントロールの構成

データ・コントロールを作成すると、データ・コントロールについて、値と動作の標準的なセットが設定されます。たとえば、属性のラベルのクライアントでの表示方法がデータ・コントロールによって決定されます。データ・コントロールの要素に対応するデータ・コントロール構造ファイルを作成および変更することによって、これらの値と動作を構成できます。まず、.dcxファイルの概要エディタを使用して、データ・コントロール構造ファイルを生成します。

14.8.1 データ・コントロールの編集方法

データ・コントロールを構成可能にするには、DataControls.dcxファイルの概要エディタを使用し、データ・コントロールに含まれるオブジェクトに対応するデータ・コントロール構造ファイルを作成します。個別のデータ・コントロール構造ファイルを編集できるようになります。

始める前に

データ・コントロール構成の一般的な知識があると役立ちます。詳細は、第14.8項「データ・コントロールの構成」を参照してください。

次のタスクを完了する必要があります。

第14.5.1項「データ・コントロールの作成方法」の説明に従って、データ・コントロールを作成します。

データ・コントロールを編集するには:

1. 「アプリケーション」ウィンドウで、DataControls.dcxをダブルクリックします。

2. 概要エディタで、構成するオブジェクトを選択し、「編集」アイコンをクリックしてデータ・コントロール構造ファイルを生成します(図14-8を参照)。

図14-8 データ・コントロール・レジストリの「編集」ボタン

3. データ・コントロール構造ファイルの概要エディタで、必要な変更を加えます。

14.8.2 データ・コントロール編集時の処理

データ・コントロールを編集すると、JDeveloperにより、影響を受けたコレクションのメタデータが含まれているデータ・コントロール構造ファイルが作成され、そのファイルが概要エディタで開かれます。このファイルには、そのコレクション固有のデータ・コントロールの構成データ(データ・オブジェクトに対して指定したUIヒントまたはバリデータなど)が保存されています。

データ・コントロール構造ファイルのベース名は、対応するデータ・オブジェクトのものと同じです。たとえば、Customer.javaエンティティBeanに対応するコレクション・ノードが選択されている状態で「編集」アイコンをクリックすると、データ・コントロール構造ファイルの名前はCustomer.xmlとなります。データ・コントロール構成ファイルはBeanクラスのパッケージに対応するパッケージに生成され、パッケージ名にpersdefが付加されます。たとえば、Customer.java Beanがmodelパッケージ内にある場合、Customer.xmlデータ・コントロール定義ファイルはpersdef.modelパッケージ内に生成されます。データ・コントロール構成ファイルが生成された後、概要エディタを使用してそのファイルをさらに構成できます。

データ・コントロール構造ファイルには、次の情報が含まれます。

- 属性: サービスのすべての属性を表します。たとえば、エンティティBeanの場合は、データベース列にマップされたBeanプロパティごとに属性が存在します。また、一時属性も追加できます。これらの属性のUIでの表示方法を定義するUIヒントを設定できます。属性値が必須か、一意である必要があるか、表示可能かどうかなどの他のプロパティを設定することもできます。詳細は、第14.9項「属性の使用」を参照してください。
属性の検証を設定したり、カスタム・プロパティを作成することもできます。検証の詳細は、第14.12項「属性の検証」を参照してください。

- アクセッサ: 結果セットを返すデータ・コントロール要素を表します。

- 操作: データ・コントロールの組込み操作で使用されるデータ・オブジェクト上のメソッドを表します。たとえば、それぞれ「作成」および「削除」組込み操作で使用されるaddおよびremoveメソッドなどです。

図14-9に、Item Beanのデータ・コントロール構造ファイルを示します。

図14-9 概要エディタでのデータ・コントロール構造ファイル

注意:
データ・コントロール構造ファイルの概要エディタには、データ・オブジェクトに関連付けられているすべての属性、アクセッサおよび操作が表示されます。ただし、データ・コントロール構造ファイルのXMLソースには、編集した要素の定義のみが含まれます。基本要素は、データ・オブジェクトからイントロスペクションされます。また、基礎となるデータ・オブジェクトに変更を加えると、データ・コントロールはそれらの変更を継承します。

14.8.3 データ・コントロールのMDSカスタマイズに関する必知事項

データ・コントロールに含まれるすべてのオブジェクトをOracle Metadata Services (MDS)カスタマイズ可能にする必要がある場合は、パッケージされたアプリケーションにこれらのオブジェクトのデータ・コントロール構造ファイルが含まれている必要があります。

アダプタ・フレームワークに基づくデータ・コントロールを作成する際には、データ・コントロール構造ファイルはデフォルトでは生成されません。これは、特定のオブジェクトにメタデータを追加しない場合、データ・コントロールにこれらのファイルは必要ないからです。通常、データ・コントロール構造ファイルがデータ・コントロール・オブジェクトに対して生成されるのは、データ・コントロールを編集して宣言的メタデータ(UIヒントやバリデータなど)をそのオブジェクトに追加した後のみです(第14.8.1項「データ・コントロールを編集する方法」を参照)。データ・コントロール・オブジェクトごとにデータ・コントロール構造ファイルを作成するには、データ・コントロール・オブジェクトごとにその手順を繰り返す必要があります。

MDSの詳細は、第10章「MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ」を参照してください。

14.9 属性の使用

ビジネス・サービスのデータ・コントロールを作成する際、個々のデータ・オブジェクトについて作成するデータ・コントロール構造ファイルで宣言的にデータ・オブジェクトの永続属性の機能を拡張できます。たとえば、UIコンポーネントの属性のデフォルト表示を制御する検証ルールを作成し、UIヒントを設定できます。

これらのプロパティはデータ・コントロール構造ファイルの概要エディタの「属性」ページで設定します。データ・コントロール構造ファイルの作成の詳細は、第14.8.1項「データ・コントロールの編集方法」を参照してください。

14.9.1 属性を主キーとして指定する方法

データ・オブジェクトのデータ・コントロール構造ファイルの概要エディタで、そのデータ・オブジェクトの主キーとして属性を指定できます(データ・オブジェクトの基礎クラスでまだ指定していない場合)。

始める前に

属性プロパティの設定方法の知識があると役立ちます。詳細は、第14.9項「属性の使用」を参照してください。

次のタスクを完了する必要があります。

第14.8.1項「データ・コントロールの編集方法」の説明に従って、必要なデータ・コントロール構造ファイルを作成します。

属性を主キーとして設定する手順は次のとおりです。

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで、主キーとして指定する属性を選択して、「詳細」タブをクリックします。

4. 「詳細」ページで、「キー属性」プロパティを設定します。

注意:
属性がクラス内ですでに主キーとして指定されている場合、データ・コントロールはその設定を継承し、「キー属性」チェックボックスが選択されます。ただし、この場合は、「キー属性」オプションを選択解除することはできません。

14.9.2 属性の静的なデフォルト値を定義する方法

値のタイプが「リテラル」に設定されている場合、「詳細」セクションの「値」フィールドには、属性のデフォルト値を静的に指定できます。たとえば、ServiceRequestエンティティBeanのStatus属性のデフォルト値をOpenに設定したり、User BeanのUserRole属性のデフォルト値をuserに設定できます。

始める前に

属性プロパティの設定方法の知識があると役立ちます。詳細は、第14.9項「属性の使用」を参照してください。

属性の静的なデフォルト値を定義する手順:

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで編集する属性を選択し、「詳細」タブをクリックします。

4. 「詳細」ページで、「リテラル」オプションを選択します。

5. 「リテラル」オプションの下のテキスト・フィールドに、属性のデフォルト値を入力します。

14.9.3 属性へのUIヒントの設定方法

属性のUIヒントを設定し、それらの属性を使用するすべてのUIコンポーネントでそれらの属性が一貫したローカライズ可能な方法で表示およびラベル付けされるように設定できます。UIヒントにより、属性、ラベル、ツールチップ、フィールドを自動的に送信する必要があるかどうかを表示するために使用するUIコンポーネントのタイプなどが決定されます。指定された属性を表示するか非表示にするかも決定できます。属性に対してUIヒントを作成するには、「アプリケーション」ウィンドウからアクセス可能な、データ・オブジェクトのデータ・コントロール構造ファイルの概要エディタを使用します。

始める前に

属性プロパティの設定方法の知識があると役立ちます。詳細は、第14.9項「属性の使用」を参照してください。

次のタスクを完了する必要があります。

第14.8.1項「データ・コントロールの編集方法」の説明に従って、必要なデータ・コントロール構造ファイルを作成します。

UIヒントを設定する手順:

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで編集する属性を選択し、「UIヒント」タブをクリックします。

4. 「UIヒント」セクションで、目的のUIヒントを設定します。

14.9.4 属性へのUIヒントの設定時の処理

属性に対してUIヒントを設定すると、それらのヒントはプロパティとして格納されます。プロパティのタグがデータ・オブジェクトのデータ・コントロール構造ファイルに追加され、プロパティの値はリソース・バンドル・ファイルに保存されます。リソース・バンドル・ファイルが存在しない場合は、データ・コントロールのパッケージに生成され、初めてUIヒントを設定した際にプロジェクト名に従って名前が設定されます。

次の例に、Item.xmlデータ・コントロール構造ファイルにおけるprice属性のコードを示します。属性に対して設定されているラベルおよびフォーマット・タイプ・ヒントのタグも含まれます。

<PDefAttribute
Name="price">
<Properties>
<SchemaBasedProperties>
<LABEL
ResId="${adfBundle['model.ModelBundle']['model.Item.price_LABEL']}"/>
<FMT_FORMATTER ResId="${adfBundle['model.ModelBundle']
['model.Item.price_FMT_FORMATTER']}"/>
</SchemaBasedProperties>
</Properties>
</PDefAttribute>

次の例に、ModelBundle.propertiesリソース・バンドル・ファイルにおけるラベルおよびフォーマット・タイプ・ヒントの対応するエントリを示します。これらにはプロジェクトのローカライズ可能なプロパティすべての値も含まれています。

model.Item.price_LABEL=Price
. . .
model.Item.price_FMT_FORMATTER=oracle.jbo.format.DefaultCurrencyFormatter

14.9.5 EL式を使用してUIヒントにアクセスする方法

EL式を使用してUIヒントにアクセスし、ページにデータとしてヒント値を表示できます。UIヒントには、データバインドされたコンポーネントをページにドロップした後に作成するバインディング・インスタンスを通じてアクセスできます。

次の例は、DeviceFeaturesデータ・コントロールを使用して生成されました。この例は、MAFフォームとして接続をドラッグ・アンド・ドロップし、displayNameフィールドとnicknameフィールドのみを保持することによって生成されるEL式を示しています。太字で表示されるラベルは、ELを使用したUIヒント取得の例です。

<amx:panelFormLayout id="pfl2">
<amx:inputText value="#{row.bindings.displayName.inputValue}"
label="#{bindings.Contact.hints.displayName.label}" id="it9"/>
<amx:inputText value="#{row.bindings.nickname.inputValue}"
label="#{bindings.Contact.hints.nickname.label}"
id="it10"/>
</amx:panelFormLayout>af:panelHeader id="ph1"

14.10 Beanデータ・コントロールの作成および使用

Beanデータ・コントロールは、Beanクラスのメタデータ・ラッパーとして機能し、データ・コントロール・オブジェクトとしてBeanのコード要素を公開します。このオブジェクトを使用して、これらのコード要素をUIコンポーネントにバインドできます。Java Beanデータ・コントロールでは、POJO (Plain Old Java Object)から自身のデータ構造を取得します。Java Beanのデータ・コントロールは、JDeveloperの「アプリケーション」ウィンドウ内で作成します。

始める前に

データ・コントロールの一般的な知識があると役立ちます。詳細は、第14.5.1項「データ・コントロールの作成方法」を参照してください。

次のタスクを完了する必要があります。

アプリケーション・ワークスペースを作成し、データ・コントロールの基礎にするビジネス・サービスを追加します。アプリケーション・ワークスペースの作成の詳細は、第2.2項「MAFアプリケーションの作成」を参照してください。

Beanデータ・コントロールを作成する手順は次のとおりです。

1. 「アプリケーション」ウィンドウで、Beanデータ・コントロールの作成対象のJavaクラス・ファイルを右クリックし、「データ・コントロールの作成」を選択します。

2. 「Beanデータ・コントロールの作成」ウィザードの「Beanクラスの選択」ページで、データ・コントロール・インスタンスの名前を指定します。

3. 「Beanデータ・コントロールのオプション」ページで、追加オプションのいずれかを選択します。

- アクセス・モード。データ・コントロールがデータをフェッチしてメモリーに格納する方法を設定できます。

- メタデータの生成。このオプションを選択すると、データ・コントロールの作成時に、そのデータ・コントロールによって表現されるすべてのBeanのメタデータ・ファイルを自動的に生成できます。メタデータ・ファイルは、データ・コントロールを編集する際にオンデマンドで作成されるので、このオプションは不要です。ただし、アプリケーションのMDSカスタマイズを可能にする場合は、このオプションが役に立つことがあります。詳細は、第10.1項「MDSカスタマイズをMAFファイルに適用する方法の概要」を参照してください。

注意:
Java Beanがバックグラウンド・スレッドを使用してUI内のデータを更新する場合、手動でoracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventをコールする必要があります。flushDataChangeEventメソッドの詳細は、第14.13項「データ変更イベントについて」を参照してください。

ヒント:
最適なパフォーマンスを実現するには、参照を戻す際に、コレクション内の既存のオブジェクトに対して同じ参照を使用します。

14.10.1 Beanクラス変数のシリアライズに関する必知事項

MAFでは、一時変数として宣言されたJavaScript Object Notation (JSON)データBeanクラス変数にはシリアライズしません。一連のネストされたオブジェクトをシリアライズしないようにするには、それらを一時オブジェクトとして定義する必要があります。この方法を使用すると、オブジェクトのネストが原因で循環オブジェクトが作成されるのを防ぐこともできます。

次のシナリオを考えてみましょう。Employeeオブジェクトが、その子として従業員の上司を表すEmployeeオブジェクトを保持しているとします。その子を一時オブジェクトとして宣言しなかった場合、実行時に子のEmployeeオブジェクトを計算しようとすると、一連のネストされたシリアライズ・オブジェクトが作成されます。

JavaオブジェクトをJSONオブジェクトにシリアライズおよびシリアライズ解除するには、JSONBeanSerializationHelperクラスを使用します。JSONBeanSerializationHelperクラスを使用すると、独自のカスタムJSONシリアライズおよびシリアライズ解除を実装できます。また、このクラスでは、JSONシリアライズ(およびシリアライズ解除)処理後にJSONオブジェクトを変更するためのフックが提供されます。JSONBeanSerializationHelperクラスはGenericTypeSerializationHelperクラスに似ており、RESTおよびSOAPベースのWebサービス内で、GenericTypeオブジェクトのシリアライズおよびシリアライズ解除に使用できます。詳細は、MAF Javadocのoracle.adfmf.framework.api.JSONBeanSerializationHelperクラスを参照してください。

MAFでは、GregorianCalendarクラスのオブジェクトのシリアライズはサポートされません。JSONBeanSerializationHelperクラスでは、GregorianCalendarクラスのオブジェクトをシリアライズできません。これは、GregorianCalendarクラスに循環参照が含まれるためです。かわりに、java.util.Dateまたはjava.sql.Dateをデータ操作に使用します。次の例は、java.util.Dateを使用してGregorianCalendarオブジェクトを変換する方法を示しています。

Calendar calDate = new GregorianCalendar();
calDate.set(1985, 12, 1); // "January 1, 1986"
Date date = calDate.getTime();

14.11 DeviceFeaturesデータ・コントロールの使用方法

MAFでは、アプリケーション内でDeviceFeaturesデータ・コントロールを通じて使用できるデバイス固有の機能が公開されます。DeviceFeaturesデータ・コントロールは、新しいMAFアプリケーションを作成するときに「データ・コントロール」パネルに表示されるコンポーネントです。Cordova Java APIは、このデータ・コントロールを通じて抽象化されます。これにより、MAF AMXとして実装されたアプリケーション機能から、デバイスに埋め込まれた様々なサービスにアクセスできるようになります。DeviceFeaturesデータ・コントロールから提供される操作をMAF AMXページ内にドラッグ・アンド・ドロップすることによって、デバイスに格納されたユーザーのコンタクト先を管理する機能の追加、電子メール・メッセージとSMSテキスト・メッセージの両方の作成と送信、デバイスの位置の確認、デバイスのカメラの使用およびデバイスのファイル・システムに格納されたイメージの取得を行うことができます。次の項では、これらの操作を宣言的に使用する方法や、JavaコードとJavaScriptを使用して実装する方法など、各操作について詳しく説明します。

図14-10 概要エディタでのMAFのDeviceFeaturesデータ・コントロール

MAFアプリケーション・テンプレートを使用してアプリケーションを作成すると、自動的にDeviceFeaturesデータ・コントロールが「データ・コントロール」パネルに表示されます。図14-10は、「概要」エディタ内のDeviceFeaturesデータ・コントロールを示しています。次のメソッドを使用できます。

- addLocalNotification

- cancelLocalNotification

- createContact

- displayFile

- findContacts

- getPicture

- removeContact

- sendEmail

- sendSMS

- startLocationMonitor

- updateContact

ページを作成したら、DeviceFeaturesデータ・コントロールのメソッド(またはそれらのメソッド内にネストされたその他のオブジェクト)を「データ・コントロール」パネルからMAF AMXビューにドラッグして、関連する機能にバインドされたコマンド・ボタンやその他のコンポーネントを作成できます。デフォルトのバインディングを受け入れるか、ELを使用してそれらのバインディングを変更できます。また、JavaScriptやJavaを使用して、機能を実装または構成することもできます。データ・コントロールをMAFアプリケーションに含める方法については、第12.3.3項「MAF AMXページへのデータ・コントロールの追加方法」を参照してください。

DeviceManagerは、デバイスの機能へのアクセスを可能にするオブジェクトです。このオブジェクトのハンドルは、DeviceManagerFactory.getDeviceManagerをコールすることによって取得できます。次の項では、DeviceManagerオブジェクトを使用してgetPictureやcreateContactなどのメソッドを起動する方法について説明します。

ネットワーク・アクセスを除き、すべてのApache Cordova対応デバイス機能へのアクセスは、MAFアプリケーションの場合デフォルトでは有効になっていません。DeviceFeaturesデータ・コントロールによって公開されている操作が実行時に正常に機能するには、関連するプラグインがMAFアプリケーションで有効になっている必要があります。たとえば、DeviceFeaturesデータ・コントロールのsendSMS操作を使用する場合は、MAFアプリケーションでSMSプラグインを有効にする必要があります。プラグインは手動で有効にするか、MAFアプリケーションで関連するプラグインが有効になっていない操作をドラッグ・アンド・ドロップしたときにJDeveloperによって表示されるダイアログで該当するオプションを選択して有効にすることができます。たとえば、まだSMSプラグインが有効になっていないMAFアプリケーションのMAF AMXページにsendSMS操作をドラッグ・アンド・ドロップすると、JDeveloperによって図14-11のダイアログが表示されます。

図14-11 DeviceFeaturesデータ・コントロールの操作用プラグインの有効化

操作に必要なプラグインが有効になっていない場合、MAF AMXページのソース・ファイル内に警告メッセージが表示されます。たとえば、MAFアプリケーションでSMSプラグインが有効になっていないと仮定しましょう。MAF AMXページの、アプリケーションがsendSMS操作を起動する箇所に、図14-12に示した警告メッセージが表示されます。この問題を解決するには、第9章「MAFアプリケーションでのプラグインの使用方法」の説明に従って、プラグインを手動で有効にします。

図14-12 DeviceFeaturesデータ・コントロールの操作に必要なプラグイン

14.11.1 getPictureメソッドを使用して写真撮影を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるgetPictureメソッドをMAFアプリケーションで使用すると、デバイスのカメラとフォト・ライブラリを活用し、エンド・ユーザーが写真を撮影したり、既存のイメージを取得できるようにすることが可能です。この項の終わりに、次のことを示す例があります。

- ユーザーがデバイスのカメラで写真を撮影することを可能にするデバイスのcamera.Javaコードでエンド・ユーザーが写真を撮影できるようにするJavaScriptコード。

- ユーザーが保存済イメージを取得することを可能にするJavaコード。

getPictureメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

次のパラメータによって、イメージの取得元と、そのイメージを戻す方法が制御されます。

注意:
撮影される写真にtargetWidth、targetHeightおよびqualityを指定しないと、使用されるデフォルト値が最大値となり、メモリー障害が発生する可能性があります。

- quality: 保存済イメージの質を設定します。範囲は1から100 (100を含む)です。大きい数値を指定すると質は高くなりますが、ファイル・サイズも増大します。JPEGイメージ(encodingTypeで指定します)にのみ適用されます。

- destinationType: 戻り値の形式を次から選択します。

- DeviceManager.CAMERA_DESTINATIONTYPE_DATA_URL (0): Base64でエンコードされた文字列としてイメージを戻します。この値は、プログラムで使用される場合、DeviceManager.CAMERA_DESTINATION_DATA_URLを使用してenumとしても指定されます。イメージをイメージ・コンポーネント内に表示するには、戻された値の前にdata:image/gif;base64を付ける必要があります。

- DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI (1): イメージ・ファイルのパスを戻します。この値は、プログラムで使用される場合、DeviceManager.CAMERA_DESTINATION_FILE_URIを使用する列挙としても指定されます。

注意:
ファイルURIがgetPictureメソッドによって戻される場合、ファイルのサイズを決定するために使用する前にファイルURIから問合せパラメータを削除する必要があります。次に例を示します。
String fileURI = ...getPicture(...);

fileURI = fileURI.substring(0, result.lastIndexOf("?"));

- sourceType: 写真のソースを次から選択して設定します。

- DeviceManager.CAMERA_SOURCETYPE_PHOTOLIBRARY (0): ユーザーは保存済のイメージから選択できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_PHOTOLIBRARYを使用する列挙としても指定されます。

- DeviceManager.CAMERA_SOURCETYPE_CAMERA (1): ユーザーはデバイスのカメラを使用して写真を撮影できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_CAMERAを使用する列挙としても指定されます。

- DeviceManager.CAMERA_SOURCETYPE_SAVEDPHOTOALBUM (2): ユーザーは既存のフォト・アルバムから選択できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_SAVEDPHOTOALBUMを使用する列挙としても指定されます。

- allowEdit: 選択する前にイメージの単純な編集を許可するかどうかを選択します(ブール)。

- encodingType: 戻されるイメージ・ファイルのエンコーディングを次から選択します。

- DeviceManager.CAMERA_ENCODINGTYPE_JPEG (0): 戻されるイメージをJPEGファイルとしてエンコードします。この値は、プログラムで使用される場合、DeviceManager.CAMERA_ENCODINGTYPE_JPEGを使用する列挙としても指定されます。

- DeviceManager.CAMERA_ENCODINGTYPE_PNG (1): 戻されるイメージをPNGファイルとしてエンコードします。この値は、プログラムで使用される場合、DeviceManager.CAMERA_ENCODINGTYPE_PNGを使用する列挙としても指定されます。

- targetWidth: 幅をピクセル単位で設定してイメージのスケールを変更します。アスペクト比は維持されます。負の値または0の場合、イメージの元のディメンションが使用されます。

- targetHeight: 高さをピクセル単位で設定してイメージのスケールを変更します。アスペクト比は維持されます。負の値または0の場合、イメージの元のディメンションが使用されます。

DeviceFeaturesデータ・コントロールを使用してgetPicture操作をカスタマイズするには:

1. 「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからgetPicture操作をドラッグし、ボタンとしてページにドロップします。
ユーザーがよりきめ細かく制御できるようにするには、getPicture操作をパラメータ・フォームとしてドロップします。これにより、エンド・ユーザーは写真を撮影したり既存のイメージを選択する前に、設定を指定できるようになります。

2. アクションの編集ダイアログで、前述のすべてのパラメータの値を設定します。イメージがファイル名として戻されるように、destinationType = 1を指定するようにします。

3. getPictureの戻り値をドラッグし、それを出力テキストとしてページ上にドロップします。

4. 「共通コンポーネント」パネルで、「コンポーネント・パレット」から「イメージ」をドラッグし、ページ上にドロップします。

5. イメージのsource属性を、getPicture操作の戻り値に設定します。バインディングの式は、#{bindings.Return.inputValue}である必要があります。

図14-13は、エンド・ユーザーのフォト・ライブラリからイメージを表示するためのバインディングを示しています。

図14-13 デザインタイムでフォト・ライブラリからイメージを表示するためのバインディング

このアプリケーションを実行すると、イメージ・チューザが自動的に表示され、エンド・ユーザーは表示するイメージを選択できます。イメージ・チューザが自動的に表示される理由は、イメージ・コントロールがgetPicture操作の戻り値にバインドされており、それによってgetPicture操作が起動するためです。

注意:
getPictureメソッドのタイムアウト値は、5分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

次に示すプラットフォーム固有の問題に留意してください。

- iOS

- いくつかのデバイスでメモリー・エラーが発生しないようにするには、qualityを50未満に設定します。

- destinationType FILE_URIを使用すると、写真はアプリケーションの一時ディレクトリに保存されます。

- アプリケーションの一時ディレクトリの内容は、アプリケーションの終了時に削除されます。記憶域の空き領域が問題になる場合は、navigator.fileMgr APIを使用してこのディレクトリの内容を削除することもできます。

- targetWidthとtargetHeightを使用するには、これらを両方とも指定する必要があります。一方または両方の値が負の値または0の場合、イメージの元のディメンションが使用されます。

- Android

- allowEditパラメータを無視します。

- Camera.PictureSourceType.PHOTOLIBRARYとCamera.PictureSourceType.SAVEDPHOTOALBUMでは、どちらも同じフォト・アルバムが表示されます。

- Camera.EncodingTypeはサポートされていません。パラメータは無視され、常にJPEGイメージが生成されます。

- targetWidthとtargetHeightは、個別に指定できます。一方のパラメータが正の値で、もう一方が負の値またはゼロを使用して元のサイズを表す場合、正の値がそのディメンションに使用され、もう一方のディメンションは元のアスペクト比を維持するようにスケール変更されます。

- destinationType DATA_URLを使用すると、イメージが大きい場合は使用可能なメモリーがすべて使用され、メモリー不足のエラーが発生する場合があります。通常は、デフォルトのイメージ・サイズを使用すると、この動作が発生します。targetWidthとtargetHeightを設定してイメージ・サイズを制限します。

次の例は、ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaScriptコードを示しています。結果は、保存済イメージへのフルパスになります。

// The camera, like many other device-specific features, is accessed
// from the global 'navigator' object in JavaScript.
// Note that in the Cordova JavaScript APIs, the parameters are passed
// in as a dictionary, so it is only necessary to provide key-value pairs
// for the parameters you want to specify.

navigator.camera.getPicture(onSuccess, onFail, { quality: 50 });

function onSuccess(imageURI) {
var image = document.getElementById('myImage');
image.src = imageURI;
}

function onFail(message) {
alert('Failed because: ' + message);
}

次の例は、ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaコードを示しています。結果は、保存済イメージへのフルパスになります。

import oracle.adf.model.datacontrols.device;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Take a picture with the device's camera.
// The result will be the full path to the saved PNG image.
String imageFilename = DeviceManagerFactory.getDeviceManager().getPicture(100,
DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI,
DeviceManager.CAMERA_SOURCETYPE_CAMERA, false,
DeviceManager.CAMERA_ENCODINGTYPE_PNG, 0, 0);

次の例は、ユーザーが保存済イメージを取得することを可能にするJavaコードを示しています。結果は、Base64でエンコードされたJPEGになります。

import oracle.adf.model.datacontrols.device;

// Retrieve a previously-saved image. The result will be a base64-encoded JPEG.
String imageData = DeviceManagerFactory.getDeviceManager().getPicture(100,
DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URL,
DeviceManager.CAMERA_SOURCETYPE__PHOTOLIBRARY, false,
DeviceManager.CAMERA_ENCODINGTYPE_JPEG, 0, 0);

14.11.2 SendSMSメソッドを使用してテキスト・メッセージングを可能にする方法

DeviceFeaturesデータ・コントロールに含まれるsendSMSメソッドをMAFアプリケーションで使用すると、デバイスのショート・メッセージ・サービス(SMS)テキスト・メッセージング・インタフェースを活用し、エンド・ユーザーがSMSメッセージを送受信できるようにすることが可能です。MAFでは、デバイスのSMSインタフェースを表示し、必要に応じて次のフィールドに事前にデータを移入できます。

- to: 受信者をリストします(カンマ区切り)。

- body: メッセージの本文を追加します。

SMSテキスト・メッセージング・インタフェースが表示されたら、エンド・ユーザーはSMSを送信するか、それを取り消すことができます。デバイスとキャリアの制限により、SMSは自動的に送信できません。実際にSMSを送信できるのは、エンド・ユーザーのみです。

注意:
sendSMSメソッドのタイムアウト値は、5分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

注意:
Androidでは、エンド・ユーザーがSMSメッセージの編集中にアプリケーションを切り替えて、その後戻すと、SMS編集画面は表示されなくなります。かわりに、そのメッセージは下書きとして保存され、手動で選択して編集を続けることができます。

DeviceFeaturesデータ・コントロールを使用してsendSMS操作をカスタマイズするには:

SMSの送信のためページに対話型フォームを表示するには、sendSMS操作を「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからドラッグし、ページ・デザイナ上にパラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスのSMSインタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに事前に値が移入され、送信準備が整ったSMSが表示されます。

図14-14は、ページ上の編集可能なフォームを使用してSMSを送信するためのバインディングを示しています。

図14-14 デザインタイムで編集可能なフォームを使用してSMSを送信するためのバインディング

次の例は、エンド・ユーザーがデバイスのテキスト・メッセージング・インタフェースを使用してSMSメッセージを送信することを可能にするコード例を示しています。

sendSMSメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

次の例は、エンド・ユーザーがSMSメッセージを送信することを可能にするJavaScriptコードを示しています。

adf.mf.api.sendSMS({to: "5551234567", body: "This is a test message"});

次の例は、エンド・ユーザーがSMSメッセージを送信することを可能にするJavaコードを示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Send an SMS to the phone number "5551234567"
DeviceManagerFactory.getDeviceManager().sendSMS("5551234567", "This is a test message");

14.11.3 sendEmailメソッドを使用して電子メールを可能にする方法

DeviceFeaturesデータ・コントロールに含まれるsendEmailメソッドをMAFアプリケーションで使用すると、デバイスの電子メール・メッセージング・インタフェースを活用し、エンド・ユーザーが電子メール・メッセージを送受信できるようにすることが可能です。MAFでは、デバイスの電子メール・インタフェースを表示し、必要に応じて次のフィールドに事前にデータを移入できます。

- to: 受信者をリストします(カンマ区切り)。

- cc: CC受信者をリストします(カンマ区切り)。

- subject: メッセージの件名を追加します。

- body: メッセージの本文を追加します。

- bcc: BCC受信者をリストします(カンマ区切り)。

- attachments: 電子メールに添付するファイルの名前をリストします(カンマ区切り)。

- mimeTypes: 添付ファイルに使用するMIMEタイプをリストします(カンマ区切り)。MAFで自動的にMIMEタイプを決定するには、nullを指定します。この項の最後にある例に示すように、選択した添付ファイルのMIMEタイプのみを指定することもできます。

デバイスの電子メール・インタフェースが表示されたら、ユーザーは電子メールを送信するか、それを取り消すことができます。デバイスとキャリアの制限により、電子メールは自動的に送信できません。実際に電子メールを送信できるのは、エンド・ユーザーのみです。また、電子メールを送信するには、1つ以上の電子メール・アカウントを構成する必要があります。アカウントが構成されていない場合、電子メール・アカウントが見つからないことを示すエラーが表示されます。

注意:
sendEmailメソッドのタイムアウト値は、5分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

注意:
Androidでは、エンド・ユーザーが電子メールの編集中にアプリケーションを切り替えて、その後元に戻すと、電子メールの編集画面は表示されなくなります。かわりに、そのメッセージは下書きとして保存され、手動で選択して編集を続けることができます。

DeviceFeaturesデータ・コントロールを使用してsendEmail操作をカスタマイズするには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからsendEmail操作をページ・デザイナ上にドラッグし、パラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスの電子メール・インタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに事前に値が移入され、送信準備が整った電子メールが表示されます。

図14-15は、ページ上の編集可能なフォームを使用して電子メールを送信するためのバインディングを示しています。

図14-15 デザインタイムで編集可能なフォームを使用して電子メールを送信するためのバインディング

次に、エンド・ユーザーがデバイスの電子メール・インタフェースを使用して電子メール・メッセージを送信することを可能にするコード例を示します。

sendEmailメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

次の例は、エンド・ユーザーが電子メール・メッセージを送信することを可能にするJavaScriptコードを示しています。

// Populate an email to 'ann.li@example.com',
// copy 'joe.jones@example.com', with the
// subject 'Test message', and the body 'This is a test message'
// No BCC recipients or attachments
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});

// Populate the same email as before, but this time, also BCC
// 'john.smith@example.com' & 'jane.smith@example.com' and attach two files.
// By not specifying a value for the mimeTypes parameter, you are telling
// ADFMobile to automatically determine the MIME type for each of the attachments.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});

// For iOS only: Same as previous email, but this time, explicitly specify
// all the MIME types.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: "text/plain,image/png"});

// For iOS only: Same as previous email, but this time, only specify
// the MIME type for the second attachment and let the system determine
// the MIME type for the first one.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: ",image/png"});

// For Android only: Same as previous e-mail, but this time, explicitly specify
// the MIME type.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: "image/*"});
// You can also use "plain/text" as the MIME type as it just determines the type
// of applications to be filtered in the application chooser dialog.

次の例は、エンド・ユーザーが電子メール・メッセージを送信することを可能にするJavaコードを示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Populate an email to 'ann.li@example.com', copy 'joe.jones@example.com', with the
// subject 'Test message', and the body 'This is a test message'.
// No BCC recipients or attachments.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
null,
null,
null);

// Populate the same email as before, but this time, also BCC
// 'john.smith@example.com' & 'jane.smith@example.com' and attach two files.
// By specifying null for the mimeTypes parameter, you are telling
// ADFMobile to automatically determine the MIME type for each of the attachments.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
null);

// Same as previous email, but this time, explicitly specify all the MIME types.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
"text/plain,image/png");

// Same as previous email, but this time, only specify the MIME type for the
// second attachment and let the system determine the MIME type for the first one.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
",image/png");

14.11.4 createContactメソッドを使用してコンタクト先の作成を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるcreateContactメソッドをMAFアプリケーションで使用すると、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーが新しいコンタクト先を作成してデバイスのアドレス帳に保存できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてContactのフィールドに事前にデータを移入できます。この項の最後の例に示すように、createContactメソッドはContactオブジェクトをパラメータとして使用し、作成されたContactオブジェクトを戻します。

createContactメソッドとContactオブジェクトの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。Contactのプロパティについては、第14.11.5項「findContactsメソッドを使用してコンタクト先の検索を可能にする方法」も参照してください。

注意:
createContactメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

注意:
nullのContactオブジェクトがメソッドに渡された場合、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してcreateContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからcreateContact操作をドラッグし、リンクまたはボタンとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、createContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、Java BeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してcreateContact操作を実行できます。次のコード例は、Contactオブジェクトを作成するマネージドBeanコードの例を示しています。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるcreateContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。createContact操作を実行すると、結果がこのフォームに表示されます。

private Contact contactToBeCreated;

public void setContactToBeCreated(Contact contactToBeCreated) {
this.contactToBeCreated = contactToBeCreated;
}

public Contact getContactToBeCreated() {
String givenName = "Mary";
String familyName = "Jones";
String note = "Just a Note";
String phoneNumberType = "mobile";
String phoneNumberValue = "650-555-0111";
String phoneNumberNewValue = "650-555-0199";
String emailType = "home";
String emailTypeNew = "work";
String emailValue = "Mary.Jones@example.com";
String addressType = "home";
String addressStreet = "500 Barnacle Pkwy";
String addressLocality = "Redwood Shores";
String addressCountry = "USA";
String addressPostalCode = "94065";
ContactField[] phoneNumbers = null;
ContactField[] emails = null;
ContactAddresses[] addresses = null;

/*
* Create contact
*/
this.contactToBeCreated = new Contact();

ContactName name = new ContactName();
name.setFamilyName(familyName);
name.setGivenName(givenName);
this.contactToBeCreated.setName(name);

ContactField phoneNumber = new ContactField();
phoneNumber.setType(phoneNumberType);
phoneNumber.setValue(phoneNumberValue);

phoneNumbers = new ContactField[] { phoneNumber };

ContactField email = new ContactField();
email.setType(emailType);
email.setValue(emailValue);

emails = new ContactField[] { email };

ContactAddresses address = new ContactAddresses();
address.setType(addressType);
address.setStreetAddress(addressStreet);
address.setLocality(addressLocality);
address.setCountry(addressCountry);

addresses = new ContactAddresses[] { address };

this.contactToBeCreated.setNote(note);
this.contactToBeCreated.setPhoneNumbers(phoneNumbers);
this.contactToBeCreated.setEmails(emails);
this.contactToBeCreated.setAddresses(addresses);

return this.contactToBeCreated;
}

次の例は、エンド・ユーザーがデバイスにコンタクト先を作成することを可能にするコード例を示しています。

次の例は、createContactのJavaScriptコードを示しています。

// Contacts, like many other device-specific features,
// are accessed from the global 'navigator' object in JavaScript
var contact = navigator.contacts.create();

var name = new ContactName();
name.givenName = "Mary";
name.familyName = "Jones";

contact.name = name;

// Store contact phone numbers in ContactField[]
var phoneNumbers = [1];
phoneNumbers[0] = new ContactField('home', '650-555-0123', true);

contact.phoneNumbers = phoneNumbers;

// Store contact email addresses in ContactField[]
var emails = [1];
emails[0] = new ContactField('work', 'Mary.Jones@example.com');

contact.emails = emails;

// Save
contact.save(onSuccess, onFailure);

function onSuccess()
{
alert("Create Contact successful.");
}

function onFailure(Error)
{
alert("Create Contact failed: " + Error.code);
}

次の例は、createContactのJavaコードを示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

import oracle.adf.model.datacontrols.device.ContactAddresses;
import oracle.adf.model.datacontrols.device.ContactField;
import oracle.adf.model.datacontrols.device.ContactName;

String givenName = "Mary";
String familyName = "Jones";
String note = "Just a Note";
String phoneNumberType = "mobile";
String phoneNumberValue = "650-555-0111";
String phoneNumberNewValue = "650-555-0199";
String emailType = "home";
String emailTypeNew = "work";
String emailValue = "Mary.Jones@example.com";
String addressType = "home";
String addressStreet = "500 Barnacle Pkwy";
String addressLocality = "Redwood Shores";
String addressCountry = "USA";
String addressPostalCode = "91234";
ContactField[] phoneNumbers = null;
ContactField[] emails = null;
ContactAddresses[] addresses = null;
ContactField[] emails = null;

/*
* Create contact
*/
Contact aContact = new Contact();

ContactName name = new ContactName();
name.setFamilyName(familyName);
name.setGivenName(givenName);
aContact.setName(name);

ContactField phoneNumber = new ContactField();
phoneNumber.setType(phoneNumberType);
phoneNumber.setValue(phoneNumberValue);

phoneNumbers = new ContactField[] { phoneNumber };

ContactField email = new ContactField();
email.setType(emailType);
email.setValue(emailValue);

emails = new ContactField[] { email };

ContactAddresses address = new ContactAddresses();
address.setType(addressType);
address.setStreetAddress(addressStreet);
address.setLocality(addressLocality);
address.setCountry(addressCountry);

addresses = new ContactAddresses[] { address };

aContact.setNote(note);
aContact.setPhoneNumbers(phoneNumbers);
aContact.setEmails(emails);
aContact.setAddresses(addresses);

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Invoking the createContact method, using the DeviceDataControl object.
Contact createdContact = DeviceManagerFactory.getDeviceManager()
.findContacts.createContact(aContact);

14.11.5 findContactsメソッドを使用してコンタクト先の検索を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるfindContactsメソッドをMAFアプリケーションで使用すると、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳から1つ以上のコンタクト先を検索できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてfindContactsのフィールドに事前にデータを移入できます。findContactsメソッドでは、フィルタ文字列と検索する(そして、見つかったコンタクト先の一部として戻す)フィールド名のリストを使用します。フィルタ文字列には、コンタクト先内の検索する任意の項目を指定できます。findContactsメソッドの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

findContacts操作では、次の引数を使用します。

- contactFields: 必須パラメータ。このパラメータは、findContacts操作によって生成されるContactオブジェクトに含めるフィールドを指定するために使用します。フィールドはカンマで区切ります(スペースの有無は関係ありません)。

- filter: コンタクト先をフィルタするために使用する検索文字列。(文字列) (デフォルト: "")

- multiple: findContacts操作から複数のコンタクト先を戻すかどうかを決定します。(ブール) (デフォルト: false)

注意:
次のリストに含まれていないフィールド名を渡すと、findContacts操作の戻り値がnullになる場合があります。また、Contactのフィールドの引数に指定したフィールドのみが、Contactオブジェクトの一部として戻されます。

次のリストに示すContactのプロパティを渡して、検索に使用し、見つかったコンタクト先の一部として戻すことができます。

- id: グローバルに一意な識別子

- displayName: エンド・ユーザーへの表示に適した、このコンタクト先の名前

- name: 人物名のすべてのコンポーネントを含むオブジェクト

- nickname: コンタクト先のカジュアルな名前。このフィールドをnullに設定した場合は、空の文字列として保存されます。

- phoneNumbers: コンタクト先のすべての電話番号の配列

- emails: コンタクト先のすべての電子メール・アドレスの配列

- addresses: コンタクト先のすべての住所の配列

- ims: すべてのコンタクト先のインスタント・メッセージング(IM)アドレスの配列(imsプロパティは、このリリースではサポートされていません。)

注意:
MAFのこのリリースでは、Contactプロパティのimsはサポートされていません。imsプロパティを使用してコンタクト先を作成すると、MAFではimsプロパティなしでコンタクト先が保存されます。そのため、ユーザーがimsに基づいて検索を実行しようとした場合は、そのコンタクト先を検索できません。また、ユーザーが検索フィールドにimsを入力しようとすると、imsはnullとして戻されます。

- organizations: コンタクト先のすべての組織の配列

- birthday: コンタクト先の誕生日。プログラムでコンタクト先の誕生日フィールドを設定したり、アドレス帳に永続化することはできませんが、オペレーティング・システムのアドレス帳アプリケーションを使用してこのフィールドを手動で設定できます。

- note: コンタクト先に関するメモ。このフィールドをnullに設定した場合は、空の文字列として保存されます。

- photos: コンタクト先の写真の配列

- categories: すべてのコンタクト先のユーザー定義カテゴリの配列

- urls: コンタクト先に関連付けられたWebページの配列

注意:
findContactsメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

DeviceFeaturesデータ・コントロールを使用してfindContacts操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからfindContacts操作をドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、findContacts操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してfindContacts操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが前述のContactの様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してfindContacts操作を実行できます。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるfindContacts操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。findContacts操作を実行すると、結果がこのフォームに表示されます。

次の例は、findContactsメソッドに指定できる引数値を示しています。

// This will return just one contact with only the ID field:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("", "", false);

// This will return all contacts with only ID fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("", "", true);

// This will return just one contact with all fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("*", "", false);

// This will return all contacts with all fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("*", "", true);

// These will throw an exception as contactFields is a required argument and cannot be null:
DeviceManagerFactory.getDeviceManager().findContacts(null, "", false);
DeviceManagerFactory.getDeviceManager().findContacts(null, "", true);

// These will throw an exception as the filter argument cannot be null:
DeviceManagerFactory.getDeviceManager().findContacts("", null, false);
DeviceManagerFactory.getDeviceManager().findContacts("", null, true);

注意:
渡されるContactのフィールドは、文字列(カンマで区切られたフィールドを含む)です。いずれかの引数がnullとしてメソッドに渡された場合、例外がスローされます。

次のJavaScript例は、姓でコンタクト先を検索し、コンタクト先の名前、電話番号、電子メール、住所およびメモを取得する方法を示しています。

var filter = ["name", "phoneNumbers", "emails", "addresses", "note"];

var options = new ContactFindOptions();
options.filter="FamilyName";

// Contacts, like many other device-specific features, are accessed from
// the global 'navigator' object in JavaScript.
navigator.contacts.find(filter, onSuccess, onFail, options);

function onSuccess(contacts)
{
alert ("Find Contact call succeeded! Number of contacts found = " + contacts.length);
}

function onFail(Error)
{
alert("Find Contact failed: " + Error.code);
}

次のJava例は、姓でコンタクト先を検索し、コンタクト先の名前、電話番号、電子メール、住所およびメモを取得する方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Find Contact - Find contact by family name.
*
* See if we can find the contact that we just created.
*/

String familyName = "FamilyName"

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses,note", familyName, true);

14.11.6 updateContactメソッドを使用してコンタクト先の更新を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるupdateContactメソッドをMAFアプリケーションで使用すると、コンタクト先を管理するためにデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳に含まれるコンタクト先を更新できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてupdateContactのフィールドに事前にデータを移入できます。この項の最後の例に示すように、updateContactメソッドはContactオブジェクトをパラメータとして使用し、更新されたupdateContactオブジェクトを戻します。

updateContactメソッドとContactオブジェクトの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。Contactのプロパティについては、第14.11.5項「findContactsメソッドを使用してコンタクト先の検索を可能にする方法」も参照してください。

注意:
入力パラメータとして必要なContactオブジェクトは、第14.11.5項「findContactsメソッドを使用してコンタクト先の検索を可能にする方法」の説明に従ってfindContactsメソッドを使用することによって検索できます。nullのContactオブジェクトがメソッドに渡された場合、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してupdateContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからupdateContact操作をドラッグし、リンクまたはボタンとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、updateContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、Java BeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してupdateContact操作を実行できます。第14.11.4項「createContactメソッドを使用してコンタクト先の作成を可能にする方法」に、Contactオブジェクトを作成するマネージドBeanコードの例を示しています。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるupdateContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。updateContact操作を実行すると、結果がこのフォームに表示されます。

次の例は、コンタクト先の電話番号を更新および追加する方法を示しています。

次のJavaScript例は、updateContactの使用方法を示しています。

function updateContact(contact)
{
try
{
if (null != contact.phoneNumbers)
{
alert("Number of phone numbers = " + contact.phoneNumbers.length);
var numPhoneNumbers = contact.phoneNumbers.length;
for (var j = 0; j < numPhoneNumbers; j++)
{
alert("Type: " + contact.phoneNumbers[j].type + "\n" +
"Value: "  + contact.phoneNumbers[j].value + "\n" +
"Preferred: "  + contact.phoneNumbers[j].pref);

contact.phoneNumbers[j].type = "mobile";
contact.phoneNumbers[j].value = "408-555-0100";
}

// save
contact.save(onSuccess, onFailure);
}
else
{
//alert ("No phone numbers found in the contact.");
}
}
catch(e)
{
alert("updateContact - ERROR: " + e.description);
}
}

function onSuccess()
{
alert("Update Contact successful.");
}

function onFailure(Error)
{
alert("Update Contact failed: " + Error.code);
}

次のJavaScript例は、updateContactを使用して既存の電話番号に電話番号を追加する方法を示しています。

function updateContact(contact)
{
try
{
var phoneNumbers = [1];
phoneNumbers[0] = new ContactField('home', '650-555-0123', true);
contact.phoneNumbers = phoneNumbers;

// save
contact.save(onSuccess, onFailure);
}
catch(e)
{
alert("updateContact - ERROR: " + e.description);
}
}

function onSuccess()
{
alert("Update Contact successful.");
}

function onFailure(Error)
{
alert("Update Contact failed: " + Error.code);
}

次のJavaコード例は、updateContactを使用してコンタクト先の電話番号、電子メール・タイプおよび郵便番号を更新する方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Update Contact - Updating phone number, email type, and adding address postal code
*/
String familyName = "FamilyName";
String phoneNumberNewValue = "650-555-0123";
String emailTypeNew = "work";
String addressPostalCode = "91234";

Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses,note", familyName, true);

// Assuming there was only one contact returned, we can use the first contact in the array.
// If more than one contact is returned then we have to filter more to find the exact contact
// we need to update.

foundContacts[0].getPhoneNumbers()[0].setValue(phoneNumberNewValue);
foundContacts[0].getEmails()[0].setType(emailTypeNew);
foundContacts[0].getAddresses()[0].setPostalCode(addressPostalCode);

Contact updatedContact = DeviceManagerFactory.getDeviceManager().updateContact(foundContacts[0]);

次のJava例は、updateContactを使用して既存の電話番号に電話番号を追加する方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

String additionalPhoneNumberValue = "408-555-0123";
String additionalPhoneNumberType = "mobile";
// Create a new phoneNumber that will be appended to the previous one.
ContactField additionalPhoneNumber = new ContactField();
additionalPhoneNumber.setType(additionalPhoneNumberType);
additionalPhoneNumber.setValue(additionalPhoneNumberValue);

foundContacts[0].setPhoneNumbers(new ContactField[] { additionalPhoneNumber });

// Access device features in Java code by acquiring an instance of the DeviceManager
// from the DeviceManagerFactory.
Contact updatedContact = DeviceManagerFactory.getDeviceManager().updateContact(foundContacts[0]);

注意:
updateContactメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

14.11.7 removeContactメソッドを使用してコンタクト先の削除を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるremoveContactメソッドをMAFアプリケーションで使用すると、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳からコンタクト先を削除できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてremoveContactのフィールドに事前にデータを移入できます。この項の最後の例に示すように、removeContactメソッドはContactオブジェクトをパラメータとして使用します。

注意:
入力パラメータとして必要なContactオブジェクトは、第14.11.5項「findContactsメソッドを使用してコンタクト先の検索を可能にする方法」の説明に従ってfindContactsメソッドを使用することによって検索できます。

DeviceFeaturesデータ・コントロールを使用してremoveContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからremoveContact操作をドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、removeContact操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してremoveContact操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なContactのフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してremoveContact操作を実行できます。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるremoveContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。removeContact操作を実行すると、結果がこのフォームに表示されます。

この項の最後にある例は、findContactsを使用して見つかったコンタクト先を削除する方法を示しています。removeContactメソッドとContactオブジェクトについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

注意:
Androidでは、removeContact操作を実行しても完全にはコンタクト先が削除されません。removeContactメソッドをコールしてコンタクト先を削除すると、「(不明)」の付いた名前がアプリケーション内のコンタクト先リストに表示されます。

次のJavaScriptコード例は、removeContactの使用方法を示しています。

// Remove the contact from the device
contact.remove(onSuccess,onError);

function onSuccess()
{
alert("Removal Success");
}

function onError(contactError)'
{
alert("Error = " + contactError.code);
}

次のJavaコード例は、removeContactの使用方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Remove the contact from the device
*/
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses", familyName, true);

// Assuming there is only one contact returned, we can use the first contact in the array.
// If more than one contact is returned we will have to filter more to find the
// exact contact we want to remove.

// Access device features in Java code by acquiring an instance of the DeviceManager
// from the DeviceManagerFactory.
DeviceManagerFactory.getDeviceManager().removeContact(foundContacts[0]);

注意:
removeContactメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

14.11.8 startLocationMonitorメソッドを使用して地理的位置を有効にする方法

DeviceFeaturesデータ・コントロールに含まれるstartLocationMonitorメソッドをMAFアプリケーションで使用すると、デバイスの地理的位置サービスを活用して、デバイスの場所を取得および追跡することが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてstartLocationMonitorのフィールドに事前にデータを移入できます。

MAFで公開されているAPIを使用すると、デバイスの現在の位置を取得できるため、特定の時点におけるデバイスの現在の位置を取得したり、定期的にその情報をサブスクライブできます。この項の最後にある例は、地理的位置を使用してデバイスの位置の変更をサブスクライブする方法と、デバイスの位置を取得する方法を示しています。startLocationMonitorメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

注意:
Android 2.nシミュレータは、enableHighAccuracyオプションがtrueに設定されていなければ、地理的位置の結果を返しません。
altitudeAccuracyプロパティは、Androidデバイスでサポートされていません。

Androidプラットフォームでは、iOSほど頻繁に更新が行われません。

DeviceFeaturesデータ・コントロールを使用してデバイスの位置の変更をリスニングするには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからstartLocationMonitor操作をページ・デザイナ上にドラッグし、リンクまたはボタンとしてドロップします。アクションの編集ダイアログによって要求されたら、次のようにフィールドに値を移入します。

- enableHighAccuracy: trueの場合、位置の修正を最も正確に取得できるメソッドを使用します。これは単なるヒントであり、オペレーティング・システムでは考慮されない場合があります。多くの場合、デバイスには、携帯電話基地局の三角測量、Wi-Fiホットスポットの参照、実際のGPSなど、位置の修正を取得するためのいくつかの異なるメカニズムがあります。falseを指定すると、正確性の低い位置を受け入れることになりますが、この場合、レスポンスの速度が向上し、消費電力が低下する可能性があります。

- updateInterval: 更新の受信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムでは、デバイスの位置の大きな変更が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。

- locationListener: 次のシグネチャを含むBeanメソッドに解決されるEL式。

void methodName(Location newLocation)

このEL式は、位置の更新を受信するたびに評価されます。たとえば、viewScope.LocationListenerBean.locationUpdated(#{}で囲みません)と入力した後、LocationListenerBeanというBeanをviewScope内に定義し、次のシグネチャを含むメソッドを実装します。

public void locationUpdated(Location currentLocation) {
System.out.println(currentLocation);
// To stop subscribing to location updates, invoke the following:
// DeviceManagerFactory.getDeviceManager().clearWatchPosition(
//     currentLocation.getWatchId());
}

注意:
EL式の評価結果としてlocationListenerの名前が必要でないかぎり、locationListenerを指定するためにEL構文#{LocationListenerBean.locationUpdate}を使用しないでください。

この項の最後にある例は、次のパラメータを受け取るDeviceManager.startUpdatingPositionを使用してデバイスの位置の変更をサブスクライブする方法を示しています。

- int updateInterval: 位置の更新の配信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムでは、デバイスの位置の大きな変更が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。逆に言えば、位置の更新は指定した頻度で配信されることもありますが、デバイスの位置が大きく変更されるまで、配信される位置が変化しない場合があります。

- boolean enableHighAccuracy: trueに設定された場合、位置の修正を最も正確に取得できるメソッドを使用します。

- String watchID: 後から位置の更新のサブスクライブを停止するために使用できる一意のIDを定義します。

- GeolocationCallback: GeolocationCallbackインタフェースの実装。この項の最後にある例に示すように、この実装のlocationUpdatedメソッドは、位置が更新されるたびに起動されます。

JavaScriptを使用してデバイスの位置の変更をサブスクライブする方法の例は、Cordovaのドキュメント(http://cordova.apache.org/)を参照してください。

locationListenerによって指定されたコールバック関数内に戻されるパラメータは、次のとおりです。

- double getAccuracy: m単位の緯度と経度を示す座標の精度レベル。

- double getAltitude: m単位の楕円体高度。

- double getLatitude: 10進度単位の緯度。

- double getLongitude: 10進度単位の経度。

- double getAltitudeAccuracy: m単位の高度座標の精度レベル。

- double getHeading: 真北から時計回りに計測した度単位で示される進行方向

- double getSpeed: m/秒単位で指定される、デバイスの現在の対地速度

- long getTimestamp: Unixエポックからのミリ秒単位の経過時間で示されるタイムスタンプの作成

- String getWatchId: 定期的な位置の更新をサブスクライブするときのみ使用します。後から位置の更新のサブスクライブを停止するために使用できる一意のID

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;
import oracle.adf.model.datacontrols.device.GeolocationCallback;
import oracle.adf.model.datacontrols.device.Location;

// Subscribe to location updates that will be delivered every 20 seconds, with high accuracy.
// As you can have multiple subscribers, let's identify this one as 'MyGPSSubscriptionID'.
// Notice that this call returns the watchID, which is usually the same as the watchID passed in.
// However, it may be different if the specified watchID conflicts with an existing watchID,
// so be sure to always use the returned watchID.
String watchID = DeviceManagerFactory.getDeviceManager().startUpdatingPosition(20000, true, "
"MyGPSSubscriptionID", new GeolocationCallback() {
public void locationUpdated(Location position) {
System.out.println("Location updated to: " + position);
}
});

// The previous call returns immediately so that you can continue processing.
// When the device's location changes, the locationUpdated() method specified in
// the previous call will be invoked in the context of the current feature.

// When you wish to stop being notified of location changes, call the following method:
DeviceManagerFactory().getDeviceManager().clearWatchPosition(watchID);

startLocationMonitorメソッドとstartHeadingMonitorメソッドの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

注意:
startLocationMonitorメソッドとstartHeadingMonitorメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

DeviceFeaturesデータ・コントロールを使用してデバイスの位置を取得するには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからstartLocationMonitor操作をページ・デザイナ上にドラッグし、リンクまたはボタンとしてドロップします。前の例に従ってデバイスの位置の変更をサブスクライブしますが、最初の位置の更新を受信した後、リスニングを停止します。

次の例は、次のパラメータを受け取るDeviceManager.getCurrentPositionを使用してデバイスの現在位置を(1回)取得する方法を示しています。

- int maximumAge: ミリ秒単位で指定したこの値より古くないキャッシュ値を受け入れます。位置の修正をこの時間内に取得した場合、その情報がすぐに戻されますが、それ以外の場合、コールは新しい位置の修正が確定するまでブロックされます。maximumAgeパラメータの値は、1000ミリ秒以上である必要があります。これより小さい値は、自動的に1000ミリ秒に設定されます。

- boolean: enableHighAccuracy trueに設定された場合、位置の修正を最も正確に取得できるメソッドを使用します。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;
import oracle.adf.model.datacontrols.device.Location;

// Get the device's current position, with highest accuracy, and accept a cached location that is
// no older than 60 seconds.
Location currentPosition = DeviceManagerFactory.getDeviceManager().getCurrentPosition(60000, true);
System.out.println("The device's current location is: latitude=" + currentPosition.getLatitude() +
", longitude=" + currentPosition.getLongitude());

14.11.9 displayFileメソッドを使用してファイルの表示を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるdisplayFileメソッドを使用すると、MAFアプリケーションでデバイスのローカル・ファイルを表示できます。プラットフォームに応じて、アプリケーション・ユーザーはPDF、イメージ・ファイル、Microsoft Officeドキュメントおよびその他の様々なファイル・タイプを表示できます。iOSでは、アプリケーション・ユーザーは、サポートされているファイルをMAFアプリケーション内でプレビューできます。またユーザーは、それらのファイルをサードパーティ・アプリケーションで開く、電子メールで送信する、プリンタに送信するなどの操作を行うこともできます。Androidでは、すべてのファイルがサードパーティ・アプリケーション内で開かれます。つまり、アプリケーション・ユーザーは、ファイルを表示しながらMAFアプリケーションから離れることができます。ユーザーは、Androidの戻るボタンを押すことによって、MAFアプリケーションに戻ることができます。所定のファイルを開くことができるアプリケーションがデバイス内に存在しない場合は、エラーが表示されます。displayFileメソッドを使用してiOSデバイスとAndroidデバイスの両方でファイルを開く方法の例は、DeviceDemoサンプル・アプリケーションを参照してください。このアプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内で次の場所にあるPublicSamples.zipファイルから入手できます。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

displayFileメソッドの機能は、デバイスのローカル・ファイルを表示することのみです。つまり、リモート・ファイルは最初にダウンロードする必要があります。ダウンロードされたファイルの格納先であるディレクトリ・ルートに戻るには、AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory)をコールします。iOSでは、この場所はアプリケーションによって異なりますが、Androidでは、この場所として外部ストレージ・ディレクトリが参照されます。この外部ストレージ・ディレクトリは公的にアクセス可能であるため、サードパーティ・アプリケーションを使用して、そこに格納されているファイルを読み取ることができます。

表14-7 サポートされるファイル・タイプ

iOS

Android

サポートされるファイル・タイプの詳細は、Apple iOS開発サイト(http://developer.apple.com/library/ios/navigation/)にある、Quick Lookプレビュー・コントローラに関するドキュメントを参照してください。

特定のMIMEタイプがデバイスにインストールされている場合、このMAFによって、そのタイプに関連付けられたビューアが起動されます。特定のファイル・タイプを表示するためのフレームワークは組み込まれていません。そのファイル・タイプを開くことができるアプリケーションがデバイスにインストールされていない場合は、MAFアプリケーションによってエラーが表示されます。

iWorkドキュメント

Microsoft Officeドキュメント(Office 97以降)

リッチ・テキスト・フォーマット(RTF)ドキュメント

PDFファイル

イメージ

Uniform Type Identifier (UTI)がpublic.text typeに準拠しているテキスト・ファイル

カンマ区切り(csv)ファイル

DeviceFeaturesデータ・コントロールを使用してdisplayFile操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからdisplayFile操作をドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、displayFile操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してdisplayFile操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してdisplayFile操作を実行できます。

次の例は、displayFileメソッドを使用してファイルを表示する方法を示しています。displayFileメソッドの詳細は、MAF JavadocのDeviceDataControlクラスを参照してください。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

URL remoteFileUrl;
InputStream is;
BufferedOutputStream fos;
try {

// Open connection to remote file; fileUrl here is a String containing the URL to the remote file.
remoteFileUrl = new URL(fileUrl);
URLConnection connection = remoteFileUrl.openConnection();
is = new BufferedInputStream(connection.getInputStream());
// Saving the file locally as 'previewTempFile.<extension>'
String fileExt = fileUrl.substring(fileUrl.lastIndexOf('.'), fileUrl.length());
String tempFile = "/previewTempFile" + fileExt;
File localFile = null;
// Save the file in the DownloadDirectory location
localFile = new File(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory) + tempFile);
if (localFile.exists()) {
localFile.delete();
}
// Use buffered streams to download the file.
fos = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] data = new byte[1024];
int read = 0;
while ((read = is.read(data)) != -1) {
fos.write(data, 0, read);
}
is.close();
fos.close();

// displayFile takes a URL string which has to be encoded on iOS.
// iOS does not handle "+" as an encoding for space (" ") but
// expects "%20" instead.  Also, the leading slash MUST NOT be
// encoded to "%2F".  We will revert it to a slash after the
// URLEncoder converts it to "%2F".
StringBuffer buffer = new StringBuffer();
String path = URLEncoder.encode(localFile.getPath(), "UTF-8");
// replace "+" with "%20"
String replacedString = "+";
String replacement = "%20";
int index = 0, previousIndex = 0;
index = path.indexOf(replacedString, index);
while (index != -1) {
buffer.append(path.substring(previousIndex, index)).append(replacement);
previousIndex = index + 1;
index = path.indexOf(replacedString, index + replacedString.length());
}
buffer.append(path.substring(previousIndex, path.length()));
// Revert the leading encoded slash ("%2F") to a literal slash ("/").
if (buffer.indexOf("%2F") == 0) {
buffer.replace(0, 3, "/");
}

// Create URL and invoke displayFile with its String representation.
URL localURL = null;
if (Utility.getOSFamily() == Utility.OSFAMILY_ANDROID) {
localURL = new URL("file", "localhost", localFile.getAbsolutePath());
}
else if (Utility.getOSFamily() == Utility.OSFAMILY_IOS)
{
localURL = new URL("file", "localhost", buffer.toString());
}
DeviceManagerFactory.getDeviceManager().displayFile(localURL.toString(), "remote file");
} catch (Throwable t) {
System.out.println("Exception caught: " + t.toString());
}

14.11.10 addLocalNotificationおよびcancelLocalNotificationメソッドを使用してローカル通知を管理する方法

DeviceFeaturesデータ・コントロールには、エンド・ユーザーがローカル通知をスケジュールまたは取り消すことができるようにMAFアプリケーションが管理対象通知にデバイスのインタフェースを利用できるようにするaddLocalNotificationおよびcancelLocalNotificationメソッドが含まれます。

DeviceFeaturesデータ・コントロールを使用してaddLocalNotificationまたはcancelLocalNotification操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからaddLocalNotificationまたはcancelLocalNotification操作をドラッグし、ボタン、リンク、リスト・アイテムまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
ボタン、リンクまたはリスト・アイテム: 「アクション・バインディングの編集」ダイアログが表示され、addLocalNotificationまたはcancelLocalNotification操作の引数の値を入力するよう求められます。このダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。実行時にページに表示されるボタン、リンクまたはリスト・アイテムをクリックすると、入力した値を使用してaddLocalNotificationまたはcancelLocalNotification操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。このダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。実行時に、アプリケーション・ユーザーが様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してaddLocalNotificationまたはcancelLocalNotification操作を実行できます。

図14-16に、選択した操作のパラメータを構成するために使用する「アクション・バインディングの編集」ダイアログを示します。この例では、cancelLocalNotification操作のnotificationIDがaddLocalNotification操作の結果にバインドされます。

図14-16 ローカル通知のスケジュール用のバインドの設定

図14-17に、式ビルダーを使用してaddLocalNotification操作の結果をcancelLocalNotification操作にバインドする方法を示します。

図14-17 addLocalNotificationの結果へのcancelLocalNotificationのバインド

addLocalNotificationおよびcancelLocalNotificationメソッドの詳細は、MAF JavadocのDeviceDataControlクラスを参照してください。コード例を含むローカル通知の管理の詳細は、第24.3項「ローカル通知の管理」を参照してください。通知の全般情報は、第24.1項「通知の概要」を参照してください。

14.11.11 デバイス・プロパティに関する必知事項

アプリケーションには、特定のデバイスの特性や機能に依存する機能が含まれる場合があります。たとえば、デバイスの画面の向きによって異なるユーザー・インタフェースを提示したり、デバイスで地理的位置がサポートされる場合のみマッピング機能を有効にすることなどが考えられます。MAFでは、このような動的な動作をサポートするためにJava、JavaScriptおよびELからアクセスできる、様々なプロパティが提供されます。表14-8に、これらのプロパティをリストし、問合せ方法、予期される戻り値およびアプリケーションのライフサイクル中にそのプロパティが変更される可能性があるかどうかに関する情報も提供します。この項の最後にある例は、JavaScriptを使用してこれらのプロパティにアクセスする方法を示しています。

注意:
デバイス・プロパティのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

表14-8 デバイス・プロパティと対応するEL式

プロパティ

静的/
動的

EL式

サンプル値

Java API

device.name

静的

#{deviceScope.device.name}

"iPhone Simulator"、"Joe Smith's iPhone"

DeviceManager.getName()

device.platform

静的

#{deviceScope.device.platform}

"iPhone Simulator"、"iPhone"

DeviceManager.getPlatform()

device.version

静的

#{deviceScope.device.version}

"4.3.2"、"5.0.1"

DeviceManager.getVersion()

device.os

静的

#{deviceScope.device.os}

"iOS"

DeviceManager.getOs()

device.model

静的

#{deviceScope.device.model}

"x86_64"、"i386"、"iPhone3,1"

DeviceManager.getModel()

device.phonegap

静的

#{deviceScope.device.phonegap}

"1.0.0"

DeviceManager.getPhonegap()

hardware.hasCamera

静的

#{deviceScope.hardware.hasCamera}

"true"、"false"

DeviceManager.hasCamera()

hardware.hasContacts

静的

#{deviceScope.hardware.hasContacts}

"true"、"false"

DeviceManager.hasContacts()

hardware.hasTouchScreen

静的

#{deviceScope.hardware.hasTouchScreen}

"true"、"false"

DeviceManager.hasTouchScreen()

hardware.hasGeolocation

静的

#{deviceScope.hardware.hasGeolocation}

"true"、"false"

DeviceManager.hasGeolocation()

hardware.hasAccelerometer

静的

#{deviceScope.hardware.hasAccelerometer}

"true"、"false"

DeviceManager.hasAccelerometer()

hardware.hasCompass

静的

#{deviceScope.hardware.hasCompass}

"true"、"false"

DeviceManager.hasCompass()

hardware.hasFileAccess

静的

#{deviceScope.hardware.hasFileAccess}

"true"、"false"

DeviceManager.hasFileAccess()

hardware.hasLocalStorage

静的

#{deviceScope.hardware.hasLocalStorage}

"true"、"false"

DeviceManager.hasLocalStorage()

hardware.hasMediaPlayer

静的

#{deviceScope.hardware.hasMediaPlayer}

"true"、"false"

DeviceManager.hasMediaPlayer()

hardware.hasMediaRecorder

静的

#{deviceScope.hardware.hasMediaRecorder}

"true"、"false"

DeviceManager.hasMediaRecorder()

hardware.networkStatus

動的

#{deviceScope.hardware.networkStatus}

"wifi"、"2g"、"unknown"、"none"脚注 1

DeviceManager.getNetworkStatus()

hardware.screen.width

動的

#{deviceScope.hardware.screen.width}

320、480

DeviceManager.getScreenWidth()

hardware.screen.height

動的

#{deviceScope.hardware.screen.height}

480、320

DeviceManager.getScreenHeight()

hardware.availableWidth

動的

#{deviceScope.hardware.screen.availableWidth}

<= 320、<= 480

DeviceManager.getAvailableScreenWidth()

hardware.availableHeight

動的

#{deviceScope.hardware.screen.availableHeight}

<= 480、<= 320

DeviceManager.getAvailableScreenHeight()

hardware.screen.dpi

静的

#{deviceScope.hardware.screen.dpi}

160、326

DeviceManager.getScreenDpi()

hardware.screen.diagonalSize

静的

#{deviceScope.hardware.screen.diagonalSize}

9.7、6.78

DeviceManager.getScreenDiagonalSize()

hardware.screen.scaleFactor

静的

#{deviceScope.hardware.screen.scaleFactor}

1.0、2.0

DeviceManager.getScreenScaleFactor()

脚注 1 wifiと2Gの両方が有効になっている場合、wifiが2Gよりも優先されるため、ネットワーク・ステータスはwifiになります。

次の例は、JavaScriptを使用してデバイス・プロパティにアクセスする方法を示しています。

<!DOCTYPE html>
<html>
<head>
<title>Device Properties Example</title>

<script type="text/javascript" charset="utf-8" src="cordova-2.2.0.js"></script>
<script type="text/javascript" charset="utf-8">

// Wait for Cordova to load
//
//document.addEventListener("deviceready", onDeviceReady, false);
document.addEventListener("showpagecomplete",onDeviceReady,false);

// Cordova is ready
//
function onDeviceReady() {
adf.mf.api.getDeviceProperties(properties_success, properties_fail);
}

function properties_success(response) {
try {
var element = document.getElementById('deviceProperties');
var device = response.device;
var hardware = response.hardware;
element.innerHTML = 'Device Name:              ' + device.name            + '<br />' +
'Device Platform:          ' + device.platform        + '<br />' +
'Device Version:           ' + device.version         + '<br />' +
'Device OS:                ' + device.os              + '<br />' +
'Device Model:             ' + device.model           + '<br />' +
'Hardware Screen Width:    ' + hardware.screen.width  + '<br />' +
'Hardware Screen Height:   ' + hardware.screen.height + '<br />' +
} catch (e) {alert("Exception: " + e);}
}

function properties_fail(error) {
alert("getDeviceProperties failed");
}

</script>
</head>
<body>
<p id="deviceProperties">Loading device properties...</p>
</body>
</html>

注意:
JavaScript関数をshowpagecompleteイベントに宣言的にバインドするには、次の例のように、amx:clientListenerタグを<amx:view>の直接の子として追加します。

<amx:clientListener type="showpagecomplete" method="myShowPageCompleteHandler"/>

クライアント・リスナー(clientListener)コンポーネントの詳細は、第13.3.24項「クライアント・リスナーの使用方法」を参照してください。

14.12 属性の検証

モバイル・アプリケーション・フレームワークでは、バインディング属性に設定された検証ルールを使用してデータ・コントロール・レイヤーで検証が行われます。属性の検証は、バインディングに対するsetValue操作中に、システム内の単一点で実行されます。

データ・コントロールによって公開される属性に対して、次のバリデータを定義できます。

- 比較バリデータ

- 長さバリデータ

- リスト・バリデータ

- 範囲バリデータ

特定の属性に対してすべてのバリデータが実行され、成功しないすべてのバリデータに対してネストされた例外がスローされます。属性の検証メッセージを定義し、実行時に検証ルールを起動するときに表示できます。詳細は、第13.9項「入力の検証」と第14.12.1項「検証ルールの追加方法」を参照してください。

バリデータの追加方法の詳細は、『Oracle Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の組込みの宣言的な検証規則の使用に関する項を参照してください。

注意:
JSONの制限により、BigDecimalが保持できる値はDoubleの範囲内となり、BigIntegerが保持できる値はLongの範囲内となります。許可された値よりも大きい数値を使用するには、toStringをBigDecimalまたはBigIntegerでコールし、値をStringとしてシリアライズ(解除)します。

表14-9に、長さバリデータでサポートされる検証の組合せをリストします。

表14-9 長さの検証

比較タイプ

バイト

文字

Equals

サポート

サポート

Not Equals

サポート

サポート

Less Than

サポート

サポート

Greater Than

サポート

サポート

Less Than Equal To

サポート

サポート

Greater Than Equal To

サポート

サポート

Between

サポート

サポート

表14-10と表14-11に、範囲バリデータでサポートされる検証の組合せを示します。

表14-10 範囲検証

比較タイプ

バイト

文字

倍精度

浮動小数

整数

長整数

短整数

Between

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Not Between

サポート

サポート

サポート

サポート

サポート

サポート

サポート

表14-11 範囲検証: math、sqlおよびutilパッケージ

比較タイプ

java.math.BigDecimal

java.math.BigInteger

java.sql.Date

java.sql.Time

java.sql.Timestamp

java.util.Date

Between

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Not Between

サポート

サポート

未サポート

未サポート

未サポート

未サポート

表14-12に、リスト・バリデータでサポートされる検証の組合せをリストします。

表14-12 リスト検証

比較タイプ

文字列

In

サポート

Not In

サポート

表14-13と表14-14に、比較バリデータでサポートされる検証の組合せを示します。

表14-13 比較検証

比較タイプ

バイト

文字

倍精度

浮動小数

整数

長整数

短整数

文字列

Equals

サポート

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Not Equals

サポート

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Less Than

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Greater Than

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Less Than Equal To

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Greater Than Equal To

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

表14-14 比較検証: java.math、java.sqlおよびjava.utilパッケージ

比較タイプ

java.math.BigDecimal

java.math.BigInteger

java.sql.Date

java.sql.Time

java.sql.Timestamp

java.util.Date

Equals

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Not Equals

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Less Than

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Greater Than

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Less Than Equal To

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Greater Than Equal To

サポート

サポート

未サポート

未サポート

未サポート

未サポート

14.12.1 検証ルールの追加方法

検証ルールは、様々なユース・ケースに合わせて定義できます。宣言的検証ルールをエンティティ・オブジェクトに追加するには、データ・コントロール構造ファイルの「概要」エディタにある「属性」ページを使用します。

検証規則を追加するには:

1. 「データ・コントロール」パネルで、データ・コントロール・オブジェクトを右クリックして「定義の編集」を選択します。

2. データ・コントロール構造ファイルの「概要」エディタで、「属性」ページを選択します。

3. ページの下部にある「検証ルール」タブを選択し、「追加」をクリックします。表示された「検証ルールの追加」ダイアログで、検証ルールと失敗処理を定義します。

14.12.2 バリデータのメタデータに関する必知事項

バリデータのメタデータは、設計時にデータ・コントロール構造のメタデータXMLファイル内に配置されます。次の例は、サンプルの長さバリデータを示しています。

<?xml version="1.0" encoding="windows-1252" ?>
<!DOCTYPE PDefViewObject SYSTEM "jbo_03_01.dtd">
<PDefViewObject
xmlns="http://xmlns.oracle.com/bc4j"
Name="Product"
Version="12.1.1.61.36"
xmlns:validation="http://xmlns.oracle.com/adfm/validation">
<DesignTime>
<Attr Name="_DCName" Value="DataControls.ProductListBean"/>
<Attr Name="_SDName" Value="mobile.Product"/>
</DesignTime>
<PDefAttribute
Name="name">
<validation:LengthValidationBean
Name="nameRule0"
OnAttribute="name"
CompareType="GREATERTHAN"
DataType="BYTE"
CompareLength="5"
Inverse="false"/>
</PDefAttribute>
</PDefViewObject>

14.13 データ変更イベントについて

JDeveloperでは、データ変更イベントを単純化するために、プロパティ変更リスナー・パターンを使用します。多くの場合、JDeveloperを使用して、Beanのプロパティ・アクセッサから通知をソースとして参照するために必要なコードを生成できます。これを行うには、「アクセッサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェックボックスを選択します(詳細は第14.3.6.2項「マネージドBeanカテゴリについて」を参照)。PropertyChangeSupportオブジェクトが自動的に生成され、新たに生成されたsetterメソッドにfirePropertyChangeへのコールが含まれます。また、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドが追加されるため、プロパティ変更リスナーは、このオブジェクトを使用して自身を登録および登録解除できます。これを使用してフレームワークはクライアント・キャッシュにプッシュする変更を取得し、データが変更されたことをユーザー・インタフェース・レイヤーに通知します。

注意:
PropertyChangeSupportオブジェクトを手動でクラスに追加する場合は、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドも(これらの明示的なメソッド名を使用して)含める必要があります。

プロパティ変更のみでは、すべてのデータ変更通知は解決されません。たとえば、データ・コントロールによってラップされたBeanがあり、アイテムのコレクションの公開が必要な場合が考えられます。リストの個々のアイテムが変更されたときはプロパティ変更で十分ですが、カーディナリティが変更されたときは十分ではありません。この場合、コレクション全体のプロパティ変更を起動すると、パフォーマンスが低下する可能性があるため、かわりにコレクションのデルタのみを更新します。これを行うには、ProviderChangeSupportクラスを使用して、単純なプロパティ変更に必要なデータよりも多くのデータを公開する必要があります。プロバイダ変更イベントはプロパティ変更イベントと似ていますが、個別のプロパティのみを対象とするのではなく、プロバイダ全体に適用されます。

注意:
ProviderChangeSupportオブジェクトは、自動的には生成されません。このオブジェクトは、手動でaddProviderChangeListenerおよびremoveProviderChangeListenerメソッドとともに(これらの明示的なメソッド名を使用して)クラスに追加する必要があります。

プロバイダ変更は、データ・コントロールによってラップされたBeanで公開されている動的なコレクションを保持しているときのみ必要になるため、起動するプロバイダ変更イベントは、次のいくつかのタイプのみになります。

- fireProviderCreate: 新しい要素をコレクションに追加する場合

- fireProviderDelete: 要素をコレクションから削除する場合

- fireProviderChange: コレクション内の1つの要素を変更する場合(リスト全体のリフレッシュを回避するのに必要です)

- fireProviderRefresh: 同時に複数の変更をコレクションに加え、単純にクライアントにコレクション全体のリフレッシュを要求した方がよいと判断した場合(これは一括操作でのみ使用する必要があります)

ProviderChangeSupportクラスは、コレクション要素に関連する通知を送信するために使用され、これによって、Java Beanデータ・コントロール内で変更が発生したときにコンポーネントを適切に更新できます。このクラスが従うパターンは、自動的に生成されるPropertyChangeSupportクラスと似ていますが、ProviderChangeSupportとともに使用されるイベント・オブジェクトでは、操作のタイプや変更された要素のキーと位置などの詳細情報を送信します。ProviderChangeSupportでは、コレクションに対する要素(プロバイダ)の追加や削除など、コレクションに対する構造的な変更を取得します。PropertyChangeSupportでは、コレクション内の個々のアイテムに対する変更を取得します。

次の例は、ProviderChangeSupportを使用して、コレクションの要素に対する構造的な変更(子を追加または削除する場合など)に関する通知を送信する方法を示しています。ProviderChangeListeneインタフェースとProviderChangeEventクラスおよびProviderChangeSupportクラスの詳細は、MAF Javadocを参照してください。

public class NotePad {
private static List s_notes = null;

/* manually adding property change listener as well as provider change listener. */
protected transient PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);
protected transient ProviderChangeSupport
providerChangeSupport = new ProviderChangeSupport(this);

public NotePad() {
…
}

public  mobile.Note[] getNotes() {
mobile.Note n[] = null;

synchronized (this) {
if(s_notes.size() > 0) {
n = (mobile.Note[])
s_notes.toArray(new mobile.Note[s_notes.size()]);
}
else {
n = new mobile.Note[0];
}
}

return n;
}

public void addNote() {
System.out.println("Adding a note ....");
Note n = new Note();
int s = 0;

synchronized (this) {
s_notes.add(n);
s = s_notes.size();
}

System.out.println("firing the events");
providerChangeSupport.fireProviderCreate("notes", n.getUid(), n);
}

public void removeNote() {
System.out.println("Removng a note ....");
if(s_notes.size() > 0) {
int end = -1;
Note n = null;

synchronized (this) {
end = s_notes.size() - 1;
n = (Note)s_notes.remove(end);
}

System.out.println("firing the events");
providerChangeSupport.fireProviderDelete("notes", n.getUid());
}
}

public void RefreshNotes() {
System.out.println("Refreshing the notes ....");

providerChangeSupport.fireProviderRefresh("notes");
}

public void addProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.addProviderChangeListener(l);
}

public void removeProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.removeProviderChangeListener(l);
}

protected String   status;

/* --- JDeveloper generated accessors --- */

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public void setStatus(String status) {
String oldStatus = this.status;
this.status = status;
propertyChangeSupport.firePropertyChange("status", oldStatus, status);
}

public String getStatus() {
return status;
}
}

データ変更は、JVMレイヤーからのレスポンス・メッセージや戻り値とともに、クライアントに(キャッシュするために)戻されます。これにより、JDeveloperではユーザー・インタフェースに対してリフレッシュするイベントと更新の数を縮小し、可能なかぎりフレームワークの効率を上げることができます。

ただし、バックグラウンド・スレッドで実行時間の長い処理(Webサービスの相互作用、データベースの相互作用、コストのかかる計算など)に対処し、ユーザー・アクションに依存しないユーザー・インタフェースへの通知を行うことが必要になる場合もあります。AMXページのデータを更新して、値が変更されたデータ・フィールドの現在の値を反映させる場合、AdfmfJavaUtilities.flushDataChangeEventをコールして現在キューに入っているデータ変更をクライアントに強制することによって、AMXページ全体のリロードによるパフォーマンスの低下を回避できます。

注意:
flushDataChangeEventメソッドは、バックグラウンド・スレッドからのみ実行できます。

次の例は、flushDataChangeEventメソッドを使用してクライアントへの保留中のデータ変更を強制する方法を示しています。oracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

/* Note – Simple POJO used by the NotePad managed bean or data control wrapped bean */

package mobile;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;

/**
* Simple note object
* uid   - unique id - generated and not mutable
* title - title for the note - mutable
* note  - note comment - mutable
*/
public class Note {
/* standard JDeveloper generated property change support */
protected transient PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);

private static boolean s_backgroundFlushTestRunning = false;

public Note() {
this("" + (System.currentTimeMillis() % 10000));
}

public Note(String id) {
this("UID-"+id, "Title-"+id, "");
}

public Note(String uid, String title, String note) {
this.uid     = uid;
this.title   = title;
this.note    = note;
}

/* update the current note with the values passed in */
public void updateNote(Note n) {
if (this.getUid().compareTo(n.getUid()) == 0) {
this.setTitle(n.getTitle());
this.setNote(n.getNote());
}
else {
throw new IllegalArgumentException("note");
}
}

/* background thread to simulate some background process that make changes */
public void startNodeBackgroundThread(ActionEvent actionEvent) {
Thread backgroundThread   = new Thread() {
public void run() {
System.out.println("startBackgroundThread enter - " +
s_backgroundFlushTestRunning);

s_backgroundFlushTestRunning = true;
for(int i = 0; i <= iterations; ++i) {
try {
System.out.println("executing " + i + " of " + iterations + "
" iterations.");

/* update a property value */
if(i == 0) {
setNote("thread starting");
}
else if( i == iterations) {
setNote("thread complete");
s_backgroundFlushTestRunning = false;
}
else {
setNote("executing " + i + " of " + iterations + " iterations.");
}
setVersion(getVersion() + 1);
setTitle("Thread Test v" + getVersion());
AdfmfJavaUtilities.flushDataChangeEvent();  /* key line */
}
catch(Throwable t) {
System.err.println("Error in the background thread: " + t);
}

try {
Thread.sleep(delay);  /* sleep for 6 seconds */
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
};

backgroundThread.start();
}

protected String uid;
protected String title;
protected String note;
protected int    version;

protected int iterations = 10;
protected int delay = 500;

/* --- JDeveloper generated accessors --- */

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public String getUid() {
return uid;
}

public void setTitle(String title) {
String oldTitle = this.title;
this.title = title;
propertyChangeSupport.firePropertyChange("title", oldTitle, title);
}

public String getTitle() {
return title;
}

public void setNote(String note) {
String oldNote = this.note;
this.note = note;
propertyChangeSupport.firePropertyChange("note", oldNote, note);
}

public String getNote() {
return note;
}

public void setVersion(int version) {
int oldVersion = this.version;
this.version = version;
propertyChangeSupport.firePropertyChange("version", oldVersion, version);
}

public int getVersion() {
return version;
}

public void setIterations(int iterations) {
int oldIterations = this.iterations;
this.iterations = iterations;
propertyChangeSupport.
firePropertyChange("iterations", oldIterations, iterations);
}

public int getIterations() {
return iterations;
}

public void setDelay(int delay) {
int oldDelay = this.delay;
this.delay = delay;
propertyChangeSupport.
firePropertyChange("delay", oldDelay, delay);
}

public int getDelay() {
return delay;
}
}

/* NotePad – Can be used as a managed bean or wrapped as a data control */

package mobile;

import java.util.ArrayList;
import java.util.List;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;
import oracle.adfmf.java.beans.ProviderChangeListener;
import oracle.adfmf.java.beans.ProviderChangeSupport;

public class NotePad {
private static List s_notes = null;
private static boolean s_backgroundFlushTestRunning = false;

protected transient PropertyChangeSupport propertyChangeSupport =
new PropertyChangeSupport(this);

protected transient ProviderChangeSupport
providerChangeSupport = new ProviderChangeSupport(this);

public NotePad() {
if (s_notes == null) {
s_notes = new ArrayList();

for(int i = 1000; i < 1003; ++i) {
s_notes.add(new Note(""+i));
}
}
}

public  mobile.Note[] getNotes() {
mobile.Note n[] = null;

synchronized (this) {
if(s_notes.size() > 0) {
n = (mobile.Note[])s_notes.
toArray(new mobile.Note[s_notes.size()]);
}
else {
n = new mobile.Note[0];
}
}

return n;
}

public void addNote() {
System.out.println("Adding a note ....");
Note  n = new Note();
int   s = 0;

synchronized (this) {
s_notes.add(n);
s = s_notes.size();
}

System.out.println("firing the events");

/* update the note count property on the screen */
propertyChangeSupport.
firePropertyChange("noteCount", s-1, s);

/* update the notes collection model with the new note */
providerChangeSupport.
fireProviderCreate("notes", n.getUid(), n);

/* to update the client side model layer */
AdfmfJavaUtilities.flushDataChangeEvent();
}

public void removeNote() {
System.out.println("Removing a note ....");
if(s_notes.size() > 0) {
int end = -1;
Note n = null;

synchronized (this) {
end = s_notes.size() - 1;
n = (Note)s_notes.remove(end);
}

System.out.println("firing the events");

/* update the client side model layer */
providerChangeSupport.fireProviderDelete("notes", n.getUid());

/* update the note count property on the screen */
propertyChangeSupport.firePropertyChange("noteCount", -1, end);
}
}

public void RefreshNotes() {
System.out.println("Refreshing the notes ....");

/* update the entire notes collection on the client */
providerChangeSupport.fireProviderRefresh("notes");
}

public int getNoteCount() {
int size = 0;

synchronized (this) {
size = s_notes.size();
}
return size;
}

public void addProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.addProviderChangeListener(l);
}

public void removeProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.removeProviderChangeListener(l);
}

public void startListBackgroundThread(ActionEvent actionEvent) {
for(int i = 0; i < 10; ++i) {
_startListBackgroundThread(actionEvent);
try {
Thread.currentThread().sleep(i * 1234);
}
catch (InterruptedException e) {
}
}
}

public void
_startListBackgroundThread(ActionEvent actionEvent) {
Thread backgroundThread = new Thread() {
public void run() {
s_backgroundFlushTestRunning = true;

for(int i = 0; i <= iterations; ++i) {
System.out.println("executing " + i +
" of " + iterations + " iterations.");

try {
/* update a property value */
if(i == 0) {
setStatus("thread starting");
addNote();  // add a note
}
else if( i == iterations) {
setStatus("thread complete");
removeNote();  // remove a note
s_backgroundFlushTestRunning = false;
}
else {
setStatus("executing " + i + " of " +
iterations + " iterations.");

synchronized (this) {
if(s_notes.size() > 0) {
Note n =(Note)s_notes.get(0);

n.setTitle("Updated-" +
n.getUid() + " v" + i);
}
}
}
AdfmfJavaUtilities.flushDataChangeEvent();
}
catch(Throwable t) {
System.err.
println("Error in bg thread - " + t);
}

try {
Thread.sleep(delay);
}
catch (InterruptedException ex) {
setStatus("inturrpted " + ex);
ex.printStackTrace();
}
}
}
};

backgroundThread.start();
}

protected int iterations = 100;
protected int delay      = 750;

protected String   status;

/* --- JDeveloper generated accessors --- */

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public void setStatus(String status) {
String oldStatus = this.status;
this.status = status;
propertyChangeSupport.firePropertyChange("status", oldStatus, status);
}

public String getStatus() {
return status;
}

public void setIterations(int iterations) {
int oldIterations = this.iterations;
this.iterations = iterations;
propertyChangeSupport.firePropertyChange("iterations", oldIterations, iterations);
}

public int getIterations() {
return iterations;
}

public void setDelay(int delay) {
int oldDelay = this.delay;
this.delay = delay;
propertyChangeSupport.firePropertyChange("delay", oldDelay, delay);
}

public int getDelay() {
return delay;
}
}

StockTrackerサンプル・アプリケーションでは、データ変更イベントでJavaを使用してデータ変更をユーザー・インタフェースに反映する方法の例を示します。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

サンプル・アプリケーションの詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

15 MAF AMXでのWebサービスの使用方法

この章では、サード・パーティのWebサービスをMAF AMXアプリケーション機能の実装に統合する方法について説明します。

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

- 第15.1項「MAFアプリケーションでのWebサービスの使用方法の概要」

- 第15.2項「RESTを使用したWebサービス・データ・コントロールの作成」

- 第15.3項「SOAPを使用したWebサービス・データ・コントロールの作成」

- 第15.4項「Webサービス・データ・コントロールに関する必知事項」

- 第15.5項「新しいWebサービス接続の作成」

- 第15.6項「Webサービス・データ・コントロールのエンド・ポイントの調整」

- 第15.7項「セキュアなWebサービスへのアクセス」

- 第15.8項「JavaからのWebサービスの起動」

- 第15.9項「MAFのJavaScriptのサポートに関する制限の理解」

- 第15.10項「ブラウザ・プロキシ情報の構成」

15.1 MAFアプリケーションでのWebサービスの使用方法の概要

Webサービスでは、アプリケーションおよびその機能は、定義済のアプリケーション・プログラミング・インタフェースを使用してデータと情報を交換できます。Webサービスを使用すると、元のアプリケーションのプラットフォームや言語に関係なくビジネス機能を公開できます。これは、ビジネス機能を、他のアプリケーションでも認識され、使用可能な標準XMLコンストラクトで構成されるメッセージに抽象化して公開するからです。

MAFアプリケーションでは、Webサービスを使用してリモート・データ・ソースと対話します。具体的には、次のとおりです。

- リモート・データ・ソース内のデータの問合せ。

- リモート・データ・ソースとの双方向のデータ書込み。

MAFアプリケーションでWebサービスを使用する最も一般的なユース・ケースの一部を次に示します。

- Webサービスとしてはすぐに利用できるが、アプリケーション内で開発するには時間がかかる機能を追加するため

- 異なるアーキテクチャで実行されるアプリケーションへのアクセスを提供するため

MAFアプリケーションでWebサービスを使用すると、次の手順を実行できます。

- Webサービス上で公開されている機能のサブセットからの選択。Webサービスによって提供されているエンタープライズ・データ以外はリクエストできないので、Webサービス・データ・コントロールで公開しているアプリケーション機能の数を減らすことにより、エンタープライズ・データに対するアクセス可能またはアクセス不可の制限設定に対応できます。

- モバイル・デバイスのリソースにとっては処理に時間がかかりすぎる機能を提供します。この原因として考えられるのは、デバイスが行う必要がある実際の作業量か、または機能が基づくデータ・セットがデバイス上でローカルに使用可能なものよりもはるかに大きいことです。

注意:
CPU負荷の高い機能はサービス(サーバー側)にアウトソースするよう検討することをお薦めします。

MAFでは、SOAP WebサービスとREST Webサービスの両方の消費をサポートしています。使用するタイプを決定する前に、次の点を考慮してください。

- 大規模なペイロードや冗長なXML Schemaを使用しているSOAPは、MAFアプリケーションのパフォーマンスに影響する可能性があります。REST Webサービス(利用可能な場合)を使用するか、Oracle Service Bus (http://www.oracle.com/technetwork/middleware/service-bus/overview/index.htmlを参照)のようなミドルウェア・ソリューションを挿入して、ペイロードをSOAPからREST JSONに変換することをお薦めします。

- MAFはETL (抽出、変換、ロード)ツールではないので、複雑なWebサービスのペイロードに対応するにはコードを記述する必要があり、その結果、コードが複雑になるだけでなく、パフォーマンスも低下する可能性があります。Oracle Service Busのようなミドルウェア・ソリューションを使用することで、モバイル環境に適したデータ・ペイロードの形成が可能になります。

次のWebサービス使用のシナリオでは、データ・アクセス(シナリオ1)の他に、計算およびデータ駆動型の機能(シナリオ2および3)を示します。

- エンタープライズ・データ・ストアから一連の商談データをフェッチして、エンド・ユーザーがデバイスでそのデータを操作し、Webサービスを介してエンタープライズ・データ・ストアに変更をポストできるようにします。

- 一部のエンタープライズ・データに対して生成されるレポートを要求し、そのレポートをフェッチします。

- 顧客サイトへのルートのマップ・イメージを取得します。

MAFを使用して開発されたアプリケーション機能でWebサービスを使用する場合、外部Webサービスのデータ・コントロールを作成するのが最も一般的な方法です。詳細については、次の情報を参照してください。

- 第15.2項「RESTを使用したWebサービス・データ・コントロールの作成」

- 第15.3項「SOAPを使用したWebサービス・データ・コントロールの作成」

- 第15.4項「Webサービス・データ・コントロールに関する必知事項」

- 第14.1項「バインディングおよびデータ・コントロールの概要」

15.2 RESTを使用したWebサービス・データ・コントロールの作成

JDeveloperでは、既存のREST Webサービスのデータ・コントロールを作成できます。このREST Webサービスは、XMLレスポンスを戻します。

注意:
ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、JDeveloperで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、第15.10項「ブラウザ・プロキシ情報の構成」を参照してください。

同じ接続を使用して、REST Webサービス・データ・コントロールに1つ以上のHTTPメソッドを関連付けることができます。RESTサービスにより公開されたカスタム操作にアクセスできます。これらのカスタム操作は、HTTPメソッドの1つにマップされ、データ・コントロールを作成することでクライアントに公開できます。

モバイル・デバイスでセキュリティおよび通知機能を使用する場合は、RESTデータ・コントロールによって公開された特定の操作で使用する標準のHTTPヘッダーにカスタム・ヘッダーおよびカスタム値を追加できます。

始める前に

データ・コントロールがアクセスするREST Webサービスへのアクセス権があることを確認します。

REST Webサービス・データ・コントロールを作成するには:

1. 「アプリケーション」ウィンドウで、アプリケーション名を右クリックし、JDeveloperのメイン・メニューから「ファイル」→「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」ダイアログで、左側の「ビジネス層」ノードを開いて「Webサービス」を選択します。右側の「アイテム」リストから「Webサービス・データ・コントロール(SOAP/REST)」を選択して(図15-4を参照)、「OK」をクリックします。

3. Webサービス・データ・コントロールの作成ウィザードの「データ・ソース」ページで、「REST」を選択します(図15-1参照)。

図15-1 REST Webサービス・データ・コントロールのデータ・ソースの定義

4. 「Webサービス・データ・コントロールの作成」ウィザードの説明に従って、次の点に注意しながらデータ・コントロールの作成を完了します。

- MAFでは、Webサービスに対して基本認証のみをサポートしています(第15.7項「セキュアなWebサービスへのアクセス」を参照)。新しい接続の作成時に、「URL接続の作成」ダイアログの「認証タイプ」フィールドで、「基本」を選択します。

- MAFでは、GET、POST、PUTおよびDELETEのすべてのHTTPメソッド・タイプをサポートしています。「リソース」ページの「メソッド表示名」フィールドへの入力時に、これらのメソッド・タイプのいずれかを選択できます(図15-2を参照)。

注意:
同じ接続および同じREST Webサービス・データ・コントロールを使用して4つのメソッドをすべて追加できます。

図15-2 REST Webサービス・データ・コントロールのリソースの定義

- 「メソッドの詳細」ページ(図15-3を参照)のリソース・メソッドごとに、XMLペイロードとレスポンス・コンテンツに使用するXSDのファイル参照を指定する必要があります。XSDは、ViewControllerプロジェクト内のファイルとして使用できる必要があります。

図15-3 REST Webサービス・データ・コントロールのメソッド詳細の定義

注意:
MAFではコンパイル時にXSD構造の内部定義を作成するため、アプリケーションのコンパイル後はXSDを変更しないようにします。そのため、XSDファイルをローカルに参照することをお薦めします(これには、MAFアプリケーションをオフラインで使用できるという利点もあります)。
リモートXSDの使用がパフォーマンスに悪影響を与えるのは、MAFではアプリケーションを実行するたびにXSDを取得するためです。

前述の手順に従ってREST Webサービス・データ・コントロールを作成すると、そのコントロールは、JDeveloper経由で使用可能な他の技術によって提供される、対応するコントロールとまったく同じように動作します。

RESTDemoという名前のMAFサンプル・アプリケーション(開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリにあるPublicSamples.zipファイルにあります)は、MAFアプリケーションでのREST Webサービスの使用方法を示しています。

データ・コントロールを使用しないJavaによるREST Webサービスの使用方法の詳細は、第15.8.2項「REST Webサービス・アダプタの使用方法」を参照してください。

15.3 SOAPを使用したWebサービス・データ・コントロールの作成

JDeveloperでは、そのサービスのWeb Services Description Language (WSDL)ファイルのみを使用して、既存のSOAP Webサービスのデータ・コントロールを作成します。ローカル・ファイル・システムでWSDLファイルを参照するか、Universal Description, Discovery and Integration (UDDI)レジストリでWSDLファイルを検索するか、WSDL URLを直接入力することができます。

注意:
ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、JDeveloperで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、第15.10項「ブラウザ・プロキシ情報の構成」を参照してください。

SOAP Webサービス・データ・コントロールを作成するには:

1. 「アプリケーション」ウィンドウで、アプリケーション名を右クリックし、JDeveloperのメイン・メニューから「ファイル」→「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」ダイアログで、左側の「ビジネス層」ノードを開いて「Webサービス」を選択します。右側の「アイテム」リストから「Webサービス・データ・コントロール(SOAP/REST)」を選択して(図15-4を参照)、「OK」をクリックします。

図15-4 新しいSOAP Webサービス・データ・コントロールの作成

3. 「Webサービス・データ・コントロールの作成」ウィザードの「データ・ソース」ページで、「SOAP」を選択します。

4. ウィザードの指示に従って、データ・コントロールの作成を完了します。

注意:
MAFでは、SOAP 1.1および1.2の両方のバージョンで次のエンコーディング・スタイルをサポートしています。

- ドキュメント/リテラル

- ドキュメント/ラップ

- RPC

15.3.1 SOAPヘッダーのカスタマイズ方法

MAFでは、DataControls.dcxファイルにカスタムのプロバイダ・クラスを指定できます。このカスタム・クラスでは、oracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProviderを拡張します。これは、SoapHeader[] getAdditionalSoapHeaders()メソッドの実装の指定に使用できます。

次の例は、SOAPProviderを拡張して、その次の例に示すカスタム・ヘッダーを作成する方法を示しています。

package provider.ebs.soap;

import oracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProvider;
import oracle.adfinternal.model.adapter.webservice.provider.soap.SoapHeader;

public class EBSSOAPProvider extends SOAPProvider {

public SoapHeader[] getAdditionalSoapHeaders() {
SoapHeader header[] = new SoapHeader[2];
SoapHeader token = null;
SoapHeader user = null;
SoapHeader pass = null;

header[0] = new SoapHeader("http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"SOAHeader");
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"Responsibility",
"SYSTEM_ADMINISTRATOR"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"RespApplication",
"SYSADMIN"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"SecurityGroup",
"STANDARD"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"NLSLanguage",
"AMERICAN"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"Org_Id",
"0"));

header[1] = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Security");
token = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"UsernameToken");
user = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Username",
"sysadmin");
pass = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Password",
"sysadmin");

header[1].addChild(token);
token.addChild(user);
token.addChild(pass);

return header;
}
}

次の例は、新規カスタム・ヘッダーを示しています。

<soap:Header xmlns:ns1="http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/">
<ns1:SOAHeader>
<ns1:Responsibility>SYSTEM_ADMINISTRATOR</ns1:Responsibility>
<ns1:RespApplication>SYSADMIN</ns1:RespApplication>
<ns1:SecurityGroup>STANDARD</ns1:SecurityGroup>
<ns1:NLSLanguage>AMERICAN</ns1:NLSLanguage>
<ns1:Org_Id>0</ns1:Org_Id>
</ns1:SOAHeader>
<wsse:Security xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
soap:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Username>sysadmin</wsse:Username>
<wsse:Password Type=
http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-username-token-profile-1.0#PasswordText">sysadmin</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>

@return

注意:
SOAPProviderを拡張するクラスに変数を渡す事前定義済のメカニズムはありません。Javaの標準的な手法で十分に対応できます。たとえば、メンバー変数とアクセッサをクラスに追加すれば、getAdditionalSoapHeaders()メソッドによって返されたSoapHeader[]のコンテンツの設定時に、それらを参照できます。

次の例は、SOAPProvider登録に関するDataControls.dcxファイルのサンプル・エントリを示しています。

<definition xmlns="http://xmlns.oracle.com/adfm/adapter/webservice"
name="SoapService" version="1.0"
provider="provider.ebs.soap.EBSSOAPProvider"
wsdl="http://@SRG_WS_HOST@:@SRG_WS_PORT@/SoapService/SoapServicePort?wsdl" >
<service name="SoapService" namespace="http://model/"
connection="SoapService">
<port name="SoapServicePort">
<operation name="echoSoapHeader"/>
</port>
</service>
</definition>

注意:
MAFを使用して動的SOAPヘッダーを指定することはできません。

15.3.2 SOAPコールによって返されたオブジェクトへのアクセス方法

JDeveloperでは、SOAPサービス参照から作成されたすべてのWebサービス・データ・コントロールについて、DataControls.dcxファイルにdcStructureVersionプロパティを追加します。デフォルトでは、このプロパティは2に設定されています。

ヒント:
以前のバージョンのMAFを使用してアプリケーションを開発し、引き続き同じコードを使用してJavaからのレスポンスにアクセスする場合は、このプロパティを削除するか、その値を1に変更する必要があります。

dcStructureVersionプロパティはカスタマイズ目的で使用され、Webサービス・データ・コントロールによって返された結果の構造に影響します。

SOAPコールから返されたオブジェクトにアクセスするには、次のようなコードを使用してください。

result = (GenericType)AdfmfJavaUtilities.invokeDataControlMethod("WeatherSOAP",
null,
"GetCityWeatherByZIP",
pnames,
pvals,
ptypes);
// access SOAP object to obtain information about the returned object
result.get("City");

コレクションを使用する場合は、次のようなコードの使用を検討してください。

result = (GenericType)AdfmfJavaUtilities.invokeDataControlMethod("WeatherSOAP",
null,
"GetCityWeatherByZIP",
pnames,
pvals,
ptypes);
result = result!=null && result.getParent()!=null ? result.getParent() : result;

15.4 Webサービス・データ・コントロールに関する必知事項

Webサービス・データ・コントロールの作成後は、図15-5に示すように、Webサービスの操作およびその操作の戻り値が「データ・コントロール」ウィンドウに表示されます。

図15-5 Webサービス・データ・コントロール

他のデータ・コントロールと同じく、Webサービス操作から返されたオブジェクトをドラッグ・アンド・ドロップして、MAF AMXページでユーザー・インタフェース・コンポーネントを作成できます。詳細は、第12.3.3項「MAF AMXページへのデータ・コントロールの追加方法」を参照してください。Webサービスの操作から戻されたデータが表示されると、次のオブジェクト・タイプが処理されます。

- コレクション

- Webサービスの操作により戻された複合オブジェクト

- Webサービスの操作により戻された、ネストされた複合オブジェクト

Webサービスの操作を使用して、標準データ型と複合データ型の両方を更新および削除できます。

図15-5に示すように、各データ・コントロール・オブジェクトはアイコンで表されます。表15-1は、各アイコンが表すもの、「データ・コントロール」パネルの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。詳細は、第14.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。

表15-1 Webサービスの「データ・コントロール」パネルのアイコンおよびオブジェクト階層

アイコン

名前

説明

作成できるコンポーネント

データ・コントロール

データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。通常、各Webサービスに対するデータ・コントロールは1つです。

他のオブジェクトのコンテナとして機能し、コンポーネント作成には使用されません。

コレクション

サービスの操作から返されるデータ・コントロールを表現します。コレクションは、メソッド戻りオブジェクト、他のコレクション、または構造化属性の下の子としても表示されます。コレクションの下の子は、属性、他のコレクション、カスタム・メソッド、コレクションに対して実行できる組込み操作などです。

フォーム、表、グラフ、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・コンポーネント。第13.5項「データ視覚化の指定」も参照してください。

属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。属性は、自分の属するコレクションまたはメソッド戻りの下に、子として表示されます。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第13.2項「ページ・レイアウトの設計」も参照してください。

構造化された属性

複合型でありコレクションではない、返されたオブジェクトを表します。たとえば、構造化属性は、現在のサービス・リクエストに割り当てられた単一のユーザーを表現します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第13.2項「ページ・レイアウトの設計」も参照してください。

メソッド

データ・コントロールの操作またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはそれらのコレクションを戻すことができます。

コマンド・コンポーネント。

パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。また、第13.3項「UIコンポーネントの作成と使用方法」も参照してください。

メソッド戻り値

Webサービス・メソッドによって戻されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッドの戻りオブジェクトの下の子として表示されるオブジェクトは、該当コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、および親コレクション上で実行可能な操作です。

単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するために、対応するメソッドをボタンとしてドロップする必要があります。また、タスク・フローを使用している場合は、メソッド・アクティビティを作成できます。

コレクションと属性、および問合せフォームの場合と同じコンポーネント。

操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションの下の「操作」ノードにあります。1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「パラメータ」ノードにリストされます。

現在行のナビゲーションと設定のために、First、Last、Next、Previous、setCurrentRowWithKey、およびSetCurrentRowWithKeyValueの各操作がサポートされます。問合せをリフレッシュするために、Executeがサポートされます。Webサービス操作に応じて、CreateおよびDeleteが使用可能です。Webサービス・データ・コントロールはトランザクション方式ではないので、CommitおよびRollbackはサポートされません。

ボタン、リンク、メニューなどのユーザー・インタフェース・コマンド・コンポーネント。詳細は、第13.3項「UIコンポーネントの作成と使用方法」を参照してください。

パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。

配列および構造化パラメータは、データ・コントロールの下の更新可能な構造化属性およびコレクションとして公開され、UI上にADFフォームまたは更新可能な表としてドロップできます。UIを使用して配列または複合オブジェクト(標準のJava型ではない)のパラメータを作成できます。

ラベル、テキストおよび選択リストの各コンポーネント。詳細は、第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

15.5 新しいWebサービス接続の作成

Webサービスの接続情報は、アプリケーション内の他の接続とともにconnections.xmlファイルに保存されます。このファイルは、Webサービス・データ・コントロールの作成時に新しいWebサービス・データ・コントロールウィザードによってadf/META-INFディレクトリに生成されるため、明示的に作成する必要はありません(第15.2項「RESTを使用したWebサービス・データ・コントロールの作成」および第15.3項「SOAPを使用したWebサービス・データ・コントロールの作成」を参照)。

接続設定を変更するには、connections.xmlファイルを編集します。

15.6 Webサービス・データ・コントロールのエンド・ポイントの調整

Webサービス・データ・コントロールを作成すると、URIのエンド・ポイントを変更できます。これは、テスト環境から本番環境にアプリケーション機能を移行するような場合に便利です。

エンド・ポイントを変更するには、connections.xmlファイルを編集します。

15.7 セキュアなWebサービスへのアクセス

MAFは、保護されたWebサービスと保護されていないWebサービスの両方をサポートしています。詳細は、第29章「MAFアプリケーションの保護」を参照してください。

SOAP Webサービスが保護されている場合、SOAP Webサービスをサポートする事前定義済のセキュリティ・ポリシーにSOAP接続を関連付ける必要があります。表15-2に、SOAP Webサービスに関連付けることができる事前定義済のセキュリティ・ポリシーを示します。

表15-2 SOAPベースのWebサービスでサポートされるセキュリティ・ポリシー

認証タイプ

SOAPポリシー

説明

HTTP Basic

oracle/http_basic_auth_over_ssl_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含めます。このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアント・エンドポイントで実行できます。

HTTP Basic

oracle/wss_http_token_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含めます。このポリシーは、HTTPベースまたはHTTPSベースのクライアントで実行できます。

HTTP Basic

oracle/wss_http_token_over_ssl_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含め、Oracle Platform Security Servicesアイデンティティ・ストアに対してユーザーを認証します。また、このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアントで実行できます。

HTTP Basic

oracle/wss_username_token_client_policy

このポリシーは、すべてのアウトバウンドSOAPリクエスト・メッセージにWS-Security UsernameToken SOAPヘッダーの資格証明を含めます。プレーン・テキストとダイジェストの両方のメカニズムがサポートされます。このポリシーは、SOAPベースのすべてのクライアントに添付できます。

HTTP Basic

oracle/wss_username_token_over_ssl_client_policy

このポリシーは、アウトバウンドSOAPリクエスト・メッセージにWS-Security UsernameTokenヘッダーの資格証明を含めます。このポリシーは、トランスポート・プロトコルでSSLメッセージの保護が提供されていることを検証します。プレーン・テキストとダイジェストの両方のメカニズムがサポートされます。このポリシーは、SOAPベースのすべてのクライアントに添付できます。

REST Webサービスが保護されている場合、REST Webサービスをサポートする事前定義済のセキュリティ・ポリシーにREST接続を関連付ける必要があります。表15-3に、REST Webサービスに関連付けることができる事前定義済のセキュリティ・ポリシーを示します。

表15-3 RESTベースのWebサービスでサポートされるセキュリティ・ポリシー

認証タイプ

RESTポリシー

説明

HTTP Basic

oracle/http_basic_auth_over_ssl_client_policy

このポリシーでは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を組み込んで、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアント・エンドポイントで実行できます。

HTTP Basic

oracle/wss_http_token_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含めます。このポリシーは、HTTPベースのクライアントで実行できます。

HTTP Basic

oracle/wss_http_token_over_ssl_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含め、Oracle Platform Security Servicesアイデンティティ・ストアに対してユーザーを認証します。また、このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアントで実行できます。

HTTP Basic

Web SSOおよび

Mobile&Social

oracle/http_cookie_client_policy

このポリシーは、認証後に取得したCookieをHTTPリクエスト・ヘッダーに挿入します(例: OAM Webgateリソースへのアクセス)。また、レスポンスCookieも設定します。このポリシーは、RESTベースのクライアントで実行できます。

OAuth

oracle/http_oauth2_token_mobile_client_policy

このポリシーは、エンドポイントとの通信中に、bearerトークン(OAuthアクセス・トークン)をHTTPリクエスト・ヘッダーに挿入します。このトークンは、任意のOAuth2サーバーから取得できます。このポリシーは、RESTベースのクライアントで実行できます。

これらのポリシーとその使用法の詳細は、『Oracle Fusion Middleware Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』の「使用する事前定義済ポリシーの決定」と「事前定義済ポリシー」の各章を参照してください。

15.7.1 Webサービスへのアクセスを有効にする方法

Webサービスが保護され、認証トークンが必要な場合、Webサービスをサポートする事前定義済のセキュリティ・ポリシーに接続を関連付ける必要があります。

SOAPベースおよびRESTベースのWebサービスで使用可能な認証タイプに対応する事前定義済のセキュリティ・ポリシーのリストは、第15.7項「セキュアなWebサービスへのアクセス」を参照してください。

始める前に

新規Webサービス・データ・コントロール・ウィザードを実行して、Webサービス接続を作成します。ウィザードの実行の詳細は、第15.3項「SOAPを使用したWebサービス・データ・コントロールの作成」および第15.2項「RESTを使用したWebサービス・データ・コントロールの作成」を参照してください。

maf-application.xml概要エディタの「MAFログイン接続の作成」ダイアログを使用して、ログイン・サーバー接続を作成します。ログイン・サーバー接続の作成の詳細は、第29.5.1項「MAFログイン接続の作成方法」を参照してください。

Webサービスにセキュリティ・ポリシーを関連付けるには:

1. ナビゲータで、「ディスクリプタ」ノード、「ADF META-INF」と開き、maf-application.xmlをダブルクリックします。次に、maf-application.xmlファイルの概要エディタで「セキュリティ - Webサービス・セキュリティ・ポリシー」セクションを展開し、作成済のWebサービス接続を「名前」フィールドで選択します。

2. 「ログイン・サーバー接続」フィールドで、定義したログイン・サーバー接続を選択します。

3. 「ポリシー」フィールドで「ポリシーの編集」アイコン・ボタンをクリックし、「データ・コントロール・ポリシーの編集」ダイアログで現在のWebサービス接続のサービスに関連付けるポリシーを選択して、「OK」をクリックします。
図15-6は、RESTConnection1、RESTConnection2およびSOAPConnection1に関連付けられているポリシーを示しています。

「データ・コントロールの編集」ダイアログで選択でき、SOAPベースのWebサービスまたはRESTベースのWebサービスのいずれかに関連付けられているセキュリティ・ポリシーのリストは、第15.7項「セキュアなWebサービスへのアクセス」を参照してください。

図15-6 Webサービス接続へのセキュリティ・ポリシーの関連付け

15.7.2 Webサービスへのアクセスを有効にする場合の処理

JDeveloperは、Webサービス・ポリシー定義をwsm-assembly.xmlファイル(アプリケーション・ワークスペースのMETA-INFディレクトリにあります)に格納します。

「データ・コントロール・ポリシーの編集」ダイアログ(図15-7を参照)を使用して、REST Webサービスにすでに関連付けられているセキュリティ・ポリシーを表示できます。このダイアログを開くには、ポリシーの横にある鉛筆アイコン(図15-6を参照)をダブルクリックします。

図15-7 Webサービス・データ・コントロール・ポリシーの編集

15.7.3 Webサービスとコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項

デプロイ時にMAFアプリケーションがコンテナ化されると、社内ファイアウォールの背後にある保護されたWebサービスへのアクセスには、Oracle Mobile Security Suite (OMSS)のコンポーネントであるモバイル・セキュリティ・アクセス・サーバー(MSAS)によって集中アクセス・ポイントが提供され、モバイル・デバイスから社内リソースへのトラフィックが保護されます。この場合、MSASインスタンスを構成して認証エンドポイントを適用し、これを使用して最初のユーザー認証が行われます。

また、バックエンド・サービスのエンドポイントが次のものに関連付けられている必要があります:　1) MSASプロキシ・アプリケーション(MSASが適用するアクセス・ポリシーによってリソースのURLを確実に保護)、2) プロキシされたリクエストにMSASが追加するクライアント・ポリシー(シングル・サインオン(SSO)など)。

MAFアプリケーションがMSASと通信できるようにするには、MSASインスタンスに対して構成されている認証タイプに対応したSecure Workspaceアプリケーションを、ユーザーがインストールして登録します。その後でユーザーが保護されたリソースにアクセスを試みると、MAFアプリケーションとSecure Workspaceでは、MSAS生成のプロキシ自動構成ファイルを基に、MSAS AppTunnelを使用してプロキシするリクエストを決定します。

コンテナ化されたMAFアプリケーションの認証プロセスでMSAS AppTunnelが担う役割の詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

コンテナ化されたMAFアプリケーションに対するOMSSのサポートの概要は、第2.7項「エンタープライズ配布に対応するためのMAFアプリケーションのコンテナ化」を参照してください。

MSASの事前定義済セキュリティ・ポリシーと管理ポリシーの参照情報は、OMSSドキュメント・ライブラリで、Oracle Mobile Security Access Serverのポリシーとアサーション・テンプレート参照を参照してください。

15.7.4 資格証明の挿入に関する必知事項

保護されたWebサービスにおけるユーザーの資格証明は、Webサービス・リクエストの起動時にそのリクエストに動的に挿入されます。このプロセスは、SOAP WebサービスとREST Webサービスで似ています。

MAFは、Oracle Web Services Manager (OWSM)モバイル・エージェントを使用して、Webサービス・リクエスト経由でユーザー・アイデンティティを伝播します。

Webサービスを起動する前に、ユーザーは、保護されたMAFアプリケーション機能の呼出しを試みるユーザーによってトリガーされた認証プロンプトに応答する必要があります。ユーザーの資格証明は、資格証明ストアに格納されます。この資格証明ストアは、認証プロバイダのサーバーURLおよびユーザーと関連付けられた資格証明の格納に使用される、デバイス・ネイティブかつローカルなリポジトリです。実行時に、MAFでは、すべての資格証明がその使用前にIDM Mobile資格証明ストアに格納されているものとみなします。

connections.xmlファイルには、Webサービスの接続参照のadfCredentialStoreKey属性に、ログイン・サーバー接続のadfCredentialStoreKeyの値を指定して、ログイン・サーバーをWebサービスのセキュリティに関連付ける必要があります(次の2つの例を参照)。

注意:
JDeveloperではconnections.xmlファイルの概要エディタが提供されないため、「プロパティ」ウィンドウを使用して、<Reference>要素のadfcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新できます。または、「ソース」エディタを使用して属性を追加または更新できます。

次の例は、adfCredentialStoreKey="MyAuth"として参照されるWebサービス接続の定義を示しています。ここで、MyAuthとは、ログイン接続の参照名です。

<Reference name="URLConnection1"
className="oracle.adf.model.connection.url.HttpURLConnection"
adfCredentialStoreKey="MyAuth"
xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="URLConnection1">
<Contents>
<urlconnection name="URLConnection1"
url="http://myhost.us.example.com:7777/
SecureRESTWebService1/Echo">
<authentication style="challange">
<type>basic</type>
<realm>myrealm</realm>
</authentication>
</urlconnection>
</Contents>
</XmlRefAddr>
<SecureRefAddr addrType="username"/>
<SecureRefAddr addrType="password"/>
</RefAddresses>
</Reference>

次の例は、ログイン接続の定義を示しています。ここでのMyAuthは、ログイン・サーバー接続における資格証明ストア・キーの値として使用されます。

<Reference name="MyAuthName"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="MyAuth"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://172.31.255.255:7777/
SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<logout url="http://172.31.255.255:7777/
SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<accessControl url="http://myhost.us.example.com:7777/
UserObjects/jersey/getUserObjects" />
<idleTimeout value="10"/>
<sessionTimeout value="36000"/>
<userObjectFilter>
<role name="testuser1_role1"/>
<role name="testuser2_role1"/>
<privilege name="testuser1_priv1"/>
<privilege name="testuser2_priv1"/>
<privilege name="testuser2_priv2"/>
</userObjectFilter>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

認証の失敗によってWebサービス・リクエストが拒否された場合は、MAFにより適切な例外が戻され、適切なアクションが起動されます(第30.4項「ロギングの使用方法と構成」を参照)。既存の例外で状況を適切に示せない場合は、新しい例外が追加されます。

connections.xmlファイルは構成サービスの下でデプロイされ、管理されています。詳細は、第16章「MAFアプリケーションで使用されるエンド・ポイントの構成」を参照してください。

FAR内のconnections.xmlファイルは、MAFアプリケーションのデプロイ時に集約されます。資格証明はデプロイメント固有のデータを表しており、FAR内に格納することは想定されていません。

15.7.5 Cookieの挿入に関する必知事項

Cookieベースの認可のためにMAFアプリケーションがREST Webサービスを要求するたびに、MAFのセキュリティ・フレームワークは、REST Webサービスのトランスポート・レイヤーが、REST WebサービスのURLエンドポイントに関連付けられているログイン接続に対してCookieの挿入を実行できるようにします。これは実行時に処理され、MAF開発者がMAFアプリケーションを構成することはありません。

15.7.6 セキュアなWSDLファイルの使用制限

MAFアプリケーションではWSDLファイルへのアクセスを実行時に認証なしに行えるようにする必要があるため、基本認証によって保護されたSOAP WebサービスでセキュアなWSDLファイルを使用することはできません。

WSDLの保護が目的の場合は次の点を考慮してください。WSDLファイルはWebサービスのGETメソッドによってフェッチされるため、GETメソッドを除く各Webサービス・メソッドを保護する場合は、セキュアなWSDLを使用できます。GETメソッドを保護する場合は、WSDLを保護しないようにします。

15.8 JavaからのWebサービスの起動

MAFアプリケーションでは、JavaコードからWebサービス層(RESTおよびSOAPの両方)を起動して、その結果をJavaメソッドで使用できます。

MAFでは、使用可能なGenericTypeBeanSerializationHelperユーティリティ・クラスが提供され、POJO (JavaBeansオブジェクト)とMAFのGenericTypeオブジェクトとの間で次の変換ルールのセットに基づいて変換が実行されます。

1. POJOからGenericTypeオブジェクトに変換する場合:

- プロパティの決定に標準JavaBeansの反映ルールが使用されます。

- 変換プロセスでは一時プロパティが無視されます。

- 読取り可能プロパティはGenericType属性に変換されます。

- 配列プロパティはGenericType内で繰返し属性として表されます。

- マッピング・プロパティはGenericType内で個別の属性として表されます。

- 非プリミティブ・プロパティはネストされたGenericTypeオブジェクトとして表されます。

2. GenericTypeオブジェクトからPOJOに変換される場合:

- プロパティの決定に標準JavaBeansの反映ルールが使用されます。

- 変換プロセスでは一時プロパティが無視されます。

- 書込み可能プロパティはGenericType属性に変換されます。

- GenericType内の繰返し属性は配列オブジェクトに変換されます。

- POJOにMapインタフェースが実装されている場合は、標準アクセッサを介して設定できないすべてのプロパティがMapのsetメソッドを介してPOJOに設定されます。

- 非プリミティブ属性はネストされたPOJOオブジェクトとして表されます。

このヘルパーAPIを使用する利点は、Webサービスから受け取ったレスポンスを取得して、1回のコールでJavaBeanに変換できることです。

たとえば、Webサービスは、ビジネス・ロジック全体で再利用する必要があるEmployeeオブジェクトを渡したり戻したりします。このオブジェクトには次のプロパティ・セットがあります。

- String型のname

- address (street、city、stateおよびzipcodeの各属性を持つ複合オブジェクト)

- long型のid

- float型のsalary

- String型のphone(複数のphoneになる可能性もある)

- String型のpassword(このpasswordはバックエンドのWebサービスに送信しないでください)

次の例は、考えられるEmployeeオブジェクトのコードを示しています。

public class Employee {

protected String name;
protected Address address;
protected long id;
protected float salary;
protected String[] phone;
protected transient String password;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Address getAddress() {
return address;
}

public void setAddress(Address address) {
this.address = address;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public float getSalary() {
return salary;
}

public void setSalary(float salary) {
this.salary = salary;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public void setPassword(String password) {
this.password = password;
}

public String[] getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

次の例は、EmployeeクラスのAddressオブジェクトのコードとして考えられるものを示しています。

public class Address {

protected String street;
protected String city;
protected String state;
protected String zipcode;

public String getStreet() {
return street;
}

public void setStreet(String street) {
this.street = street;
}

public String getCity() {
return city;
}

public void setCity(String city)  {
this.city = city;
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public String getZipcode() {
return zipcode;
}

public void setZipcode(String zipcode)  {
this.zipcode = zipcode;
}

変換ルールについては次に注意します。

1. passwordは一時的に定義されるため、変換アルゴリズムに対しては無視されます。

2. name、address、idおよびsalaryにはすべてgetメソッドおよびsetメソッドがあるため、それらはすべてGenericTypeとの間で変換が行われます。

3. プロパティ・タイプに基づき、oracle.adfmf.misc.ConverterクラスのcoerceToType(Object, Class)メソッドの定義に従って、プロパティをタイプ間で強制変換できます。

4. addressなどの複合オブジェクトは、変換アルゴリズムによって再帰的に処理することで、変換の方向により、子であるGenericTypeを構築するか、POJO複合オブジェクトを作成してデータを移入します。

5. phoneはStringオブジェクトの配列で、それぞれが一意の電話番号を表しており、またこの要素のカーディナリティは2以上のため、変換アルゴリズムによってGenericTypeオブジェクト内のphone属性におけるすべての組合せが検索され、それらが配列として表される他、Bean上ではsetPhoneメソッドが起動されます。GenericTypeBeanSerializationHandlerのtoGenericTypeメソッドでは各配置要素が取得され、個別のphone属性としてtoGenericTypeに追加されます。

次のように定義されている場合:

final String EMPLOYEE_VIRTUAL_BEAN_NAME = "EmployeeDC.Types.Employee";
Employee emp = getEmployee();
GenericType gt = null;

- Employeeオブジェクトは、次のようにGenericTypeに変換されます。

gt = GenericTypeBeanSerializationHelper.toGenericType
(EMPLOYEE_VIRTUAL_BEAN_NAME, emp);

- GenericTypeは次のようにEmployeeオブジェクトに変換されます。

emp = GenericTypeBeanSerializationHelper.fromGenericType
(Employee.class, gt, null);

正常に変換するには次の点を考慮します。

- POJOでは通常、それらに関連付けられたGenericType構造に厳密に従います。

- GenericType構造から外れた場合は、次のいずれかの方法に従います。

1. 追加のBeanプロパティを一時的に宣言します。

2. 操作パラメータとして使用されたときに欠落データをバッキング・サービスが処理できる場合は、POJOからオプション・プロパティを除外できます。

- GenericTypeは、SOAPデータ・コントロールにのみ公開されます。仮想タイプには、toGenericTypeメソッドに渡される、関連付けられた仮想Bean名があります。JDeveloperの「データ・コントロール」ウィンドウで仮想タイプ上にカーソルを置くことによって仮想Bean名にアクセスできます。通常の名前フォーマットは、<DCName>.Types.<methodName>.<argName>です。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

15.8.1 Webサービス・オブジェクトの行を追加および削除する方法

MAFを使用すると、プログラムからWebサービス・オブジェクトのイテレータにアクセスして、そのオブジェクトの行を挿入および削除できます。これを行うには、oracle.adfmf.bindings.iterator.BasicIteratorクラスのcreateRowおよびdeleteRowメソッドを使用します。

次の例は、Webサービス・オブジェクトに行を追加する方法を示しています。

String keyFieldNames[] = {"EMPLID","ACAD_CAREER","INSTITUTION"};
String keyFieldValues[] = {"SR12030","UGRD","PSUNV"};
AmxAccessorIteratorBinding  acIter =
(AmxAccessorIteratorBinding)((AdfmfJavaUtilities.getValueExpression
("#{bindings.KEYIterator}", Object.class))
.getValue(AdfmfJavaUtilities.getAdfELContext()));

BasicIterator iter = acIter.getIterator();
GenericType key = (GenericType)iter.getDataProvider();
key.setAttribute("FIELDNAME", keyFieldNames[0]);
key.setAttribute("FIELDVALUE", keyFieldValues[0]);

int totalRowCount = 0;
int currIndex = 0;

for (int i = 1; i < keyFieldNames.length; i++) {
totalRowCount = iter.getTotalRowCount();
currIndex = iter.getCurrentIndex();

System.out.println("Starting to add rows.. \n\t Total Row Count: " +
totalRowCount + "\n\t Current Row Index: " + currIndex);

// Create rows for key iterator
iter.createRow();

totalRowCount = iter.getTotalRowCount();
System.out.println("\t Total Row Count after creating row: " + totalRowCount);

if (iter.hasNext()) {
iter.next();
}

currIndex = iter.getCurrentIndex();
System.out.println("\t Current Row Index after setting current
index to newly added row: " + currIndex);

GenericType key1 = (GenericType)iter.getDataProvider();
key1.setAttribute("FIELDNAME", keyFieldNames[i]);
key1.setAttribute("FIELDVALUE", keyFieldValues[i]);
}

// Execute method

// Add call to execute the action binding to execute the action.
// If this is a web service call, the modified GenericType object
// will be sent to the server and the server will respond appropriately

注意:
ブール入力パラメータの有無にかかわらず、createRowメソッドのシグネチャを使用できます。パラメータを指定せずにこのメソッドを使用した場合、ブール・パラメータの値をtrueに設定してcreateRowを使用した場合と同じ結果が生成されます。createRow()とcreateRow(true)では、どちらも新しい行を作成し、それをイテレータに挿入します。

15.8.2 REST Webサービス・アダプタの使用方法

oracle.adfmf.dc.ws.rest.RestServiceAdapterインタフェースを使用して、RESTコールで送信されるデータにアクセスできます(このデータは、JavaScript Object Notationと表される場合があります)。RestServiceAdapterインタフェースによって、Webサービス・データ・コントロールを作成したり、それと直接やりとりする必要なしに、Webサービス操作の実行をトリガーできます。

MAFアプリケーションでRestServiceAdapterインタフェースを使用するには、connections.xmlファイルに接続が存在することを確認し(第15.5項「新しいWebサービス接続の作成」を参照)、次の例で示すようにコードをBeanクラスに追加します。

次の例は、GETリクエストに対するRestServiceAdapterの使用方法を示しています。

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

// Clear any previously set request properties, if any
restServiceAdapter.clearRequestProperties();

// Set the connection name
restServiceAdapter.setConnectionName("RestServerEndpoint");

// Specify the type of request
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_GET);

// Specify the number of retries
restServiceAdapter.setRetryLimit(0);

// Set the URI which is defined after the endpoint in the connections.xml.
// The request is the endpoint + the URI being set
restServiceAdapter.setRequestURI("/WebService/Departments/100");

String response = "";

// Execute SEND and RECEIVE operation
try {
// For GET request, there is no payload
response = restServiceAdapter.send("");
}
catch (Exception e) {
e.printStackTrace();
}

次の例は、POSTリクエストに対するRestServiceAdapterの使用方法を示しています。

String id = "111";
String name = "TestName111";
String location = "TestLocation111";
RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_POST);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments");

String response = "";

// Execute SEND and RECEIVE operation
try {
String postData = makeDepartmentPost("DEPT", id, name, location);
response = restServiceAdapter.send(postData);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + response);

private String makeDepartmentPost(String rootName, String id,
String name, String location) {
String ret = "<" + rootName + ">";
ret += "<DEPTID>" + id + "</DEPTID>";
ret += "<NAME>" + name + "</NAME>";
ret += "<LOCATION>" + location + "</LOCATION>";
ret += "</" + rootName + ">";
return ret;
}

次の例は、PUTリクエストに対するRestServiceAdapterの使用方法を示しています。

String id = "111";
String name = "TestName111";
String location = "TestLocation111";
RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_PUT);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments");

String response = "";

// Execute SEND and RECEIVE operation
try {
String putData = makeDepartmentPut("DEPT", id, name, location);
response = restServiceAdapter.send(putData);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + response);

private String makeDepartmentPut(String rootName, String id,
String name, String location) {
String ret = "<" + rootName + ">";
ret += "<DEPTID>" + id + "</DEPTID>";
ret += "<NAME>" + name + "</NAME>";
ret += "<LOCATION>" + location + "</LOCATION>";
ret += "</" + rootName + ">";
return ret;
}

次の例は、DELETEリクエストに対するRestServiceAdapterの使用方法を示しています。

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_DELETE);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments/44");

String response = "";

// Execute SEND and RECEIVE operation
try {
// For DELETE request, there is no payload
response = restServiceAdapter.send("");
}
catch (Exception e) {
e.printStackTrace();
}

System.out.println("The response is:  " + response);

RestServiceAdapterを使用する場合は、AcceptヘッダーとContent-Typeヘッダーを設定して、MIMEタイプの不一致が原因でリクエストおよびレスポンスのペイロードが無効と判断されないようにします。

注意:
REST Webサービス・アダプタでは、MAFアプリケーション上の文字セットとしてUTF-8のみをサポートします。UTF-8は、アダプタのプログラムに埋め込まれています。

15.8.2.1 入力および出力ストリームへのアクセス

次のRestServiceAdapterメソッドを使用すると、javax.microedition.io.HttpConnectionを取得およびカスタマイズでき、さらに接続の入力と出力ストリームへのアクセスおよびやり取りが可能になり、これによってHttpConnectionからデータを読み取り、今後のサーバーへのアップロードのためにそれに書き込むことができます。

- HttpConnectionを取得します。

HttpConnection getHttpConnection(String requestMethod,
String request,
Object httpHeadersValue)

- HttpConnectionのOutputStreamを取得します。

OutputStream getOutputStream(HttpConnection connection)

- HttpConnectionのInputStreamを取得します。

InputStream getInputStream(HttpConnection connection)

- HttpConnectionを閉じます。

void close (HttpConnection connection)

- connections.xmlファイルで接続名を検索し、接続のエンド・ポイントを返します。

String getConnectionEndPoint(String connecionName)

これらのメソッドは、RestServiceAdaperのsendメソッドおよびsendReceiveメソッドと同じ機能を実現しつつ、接続をカスタマイズする機会と、リクエストを送信し、レスポンスを受信するというプロセスを提供します。

次の例では、指定されたリクエスト・メソッド、リクエストおよびHTTPヘッダー値を使用して、HttpConnectionを初期化して返しています。また、資格証明ストアから基本認証をリクエスト・ヘッダーに挿入し、入力ストリームを取得し、接続を閉じます。

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();

// Specify the type of request
String requestMethod = RestServiceAdapter.REQUEST_TYPE_GET;

// Get the connection end point from connections.xml
String requestEndPoint = restServiceAdapter.getConnectionEndPoint("GeoIP");

// Get the URI which is defined after the end point
String requestURI = "/xml/" + someIpAddress;

// The request is the end point + the URI being set
String request = requestEndPoint + requestURI;

// Specify some custom request headers
HashMap httpHeadersValue = new HashMap();
httpHeadersValue.put("Accept-Language", "en-US");
httpHeadersValue.put("My-Custom-Header-Item", "CustomItem1");

// Get the connection
HttpConnection connection =
restServiceAdapter.getHttpConnection(requestMethod,
request,
httpHeadersValue);

// Get the input stream
InputStream inputStream = restServiceAdapter.getInputStream(connection);

// Define data
ByteArrayOutputStream byStream = new ByteArrayOutputStream();

int res = 0;
int bufsize = 0, bufread = 0;

byte[] data = (bufsize > 0) ? new byte[bufsize] : new byte[1024];

// Use the input stream to read data
while ((res = inputStream.read(data)) > 0) {
byStream.write(data, 0, res);
bufread = bufread + res;
}
data = byStream.toByteArray();

// Use data
...

restServiceAdapter.close(connection);
...

15.8.2.2 非テキスト・レスポンスのサポート

Webサービス・コールから受け取ったバイナリ(非テキスト)レスポンスを処理するには、RestServiceAdapterを使用できます。これらのレスポンスには、PDFファイルやビデオ・ファイルなど、どの種類のバイナリ・データでも含めることができます。使用するRestServiceAdapterメソッドはsendReceiveです。

次の例は、RESTサーバーにファイルのリクエストを送信し、ファイルをディスクに保存する方法を示しています。

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("JagRestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_GET);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/ftaServer/v1/kpis/123/related/1");

// Set credentials needed to access the REST server
String theUsername = "hr_spec_all";
String thePassword = "Welcome1";
String userPassword = theUsername + ":" + thePassword;
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes());

restServiceAdapter.addRequestProperty("Authorization", "Basic " + encoding);

// Execute the SEND and RECEIVE operation.
// Since it is a GET request, there is no payload.
try {
this.responseRaw = restServiceAdapter.sendReceive("");
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + this.responseRaw);

// Write the response to a file
writeByteArrayToFile(this.responseRaw);

次の例は、前の例のコードによってコールされたメソッドを示しています。このメソッドでは、ファイルに対するbyte[]レスポンスをディスクに保存します。

public void writeByteArrayToFile(byte[] fileContent) {
BufferedOutputStream bos = null;
try {
FileOutputStream fos = new FileOutputStream(new File(fileToSavePath));
bos = new BufferedOutputStream(fos);
// Write the byte [] to a file
System.out.println("Writing byte array to file");
bos.write(fileContent);
System.out.println("File written");
}
catch(FileNotFoundException fnfe) {
System.out.println("Specified file not found" + fnfe);
}
catch (IOException ioe) {
System.out.println("Error while writing file" + ioe);
}
finally {
if(bos != null) {
try {
// Flush the BufferedOutputStream
bos.flush();
// Close the BufferedOutputStream
bos.close();
}
catch (Exception e) {
}
}
}
}

15.8.3 RESTレスポンスの厳密な検証を有効にする方法

maf-config.xmlファイルを使用すると、RESTレスポンスに予期しないまたはXSDで定義されていない子または属性が含まれていた場合のMAFの動作を指定できます。

- 厳密な検証が有効になっている場合、MAFでは例外をスローします。

- 厳密な検証が無効になっている場合は、条件がログに記録され、例外をスローすることなく実行が継続されます。

次の例は、validatedパラメータの設定方法を示しています。このパラメータの値をtrueに定義した場合、厳密な検証が行われます。値がfalse (デフォルト)の場合、厳密な検証は行われません。

<generic-type>
<conversion>
<validated>true</validated>
</conversion>
</generic-type>

15.8.4 JSONレスポンスの処理方法

XMLだけでなく、MAFアプリケーションで使用しているREST WebサービスもJavaScript Object Notation (JSON)形式で指定されたメッセージに対応できます。

RESTDemoという名前のMAFサンプル・アプリケーション(開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリにあるPublicSamples.zipファイルにあります)にはRESTJSONBean.javaファイルが含まれ、RestServiceAdapter (詳細は第15.8.2項「REST Webサービス・アダプタの使用方法」を参照)を使用してJSONをREST Webサービスのメッセージ形式として使用できるようにする方法を示しています。

このRESTDemoにはRESTJSONResponse.javaファイルも含まれており、このファイルはJSONメッセージで表現され、JSONBeanSerializationHelperクラスのfromJSONメソッドを使用して適切な形式に変換されます。

RESTJSONBeanのloadDataメソッド(次の例を参照)では、関連APIの使用方法を示します。

public class RESTJSONBean {
...
public void setResponse(RESTJSONResponse response) {
RESTJSONResponse oldResponse = this.response;
this.response = response;
propertyChangeSupport.firePropertyChange("response", oldResponse, response);
}

public void loadData() {
RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

// Clear previously set request properties, if any
restServiceAdapter.clearRequestProperties();

// Set the connection name
restServiceAdapter.setConnectionName("GeoIP");

// Specify the type of request
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_GET);

// Specify the number of retries
restServiceAdapter.setRetryLimit(0);

// Set the URI which is defined after the endpoint in the connections.xml
// The request is the endpoint + the URI being set
restServiceAdapter.setRequestURI("/json/" + getSearchIp());

setJsonResponse("");

// Execute SEND and RECEIVE operation
try {
// For GET request, there is no payload
setJsonResponse(restServiceAdapter.send(""));

// Create a new RESTJSONResponse object and
// parse the returned JSON string into this class
RESTJSONResponse res = new RESTJSONResponse();
res = (RESTJSONResponse)JSONBeanSerializationHelper.
fromJSON(RESTJSONResponse.class, getJsonResponse());
setResponse(res);
}
catch (Exception e) {
e.printStackTrace();
}
}
...
}

追加情報と例については、Oracle Mobile Application Frameworkを使用したモバイル・アプリケーションでのREST-JSON Webサービスの使用方法というチュートリアルを参照してください。

15.8.5 データ・コントロール操作の起動に関する必知事項

AdfmfJavaUtilitiesのinvokeDataControlMethodメソッドを使用することで、PageDefファイルのmethodActionとして明示的に追加する必要がないデータ・コントロール操作を起動できます。

詳細および例については、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

15.9 MAFのJavaScriptのサポートに関する制限の理解

MAFのREST Webサービス・クライアントはJavaScriptをサポートしていないため、MAFアプリケーションではJavaScriptの実行が必要なREST変換を正常に処理できません。つまり、クライアント側でJavaScriptを実行する必要があるサーバー・レスポンスは完了できません。元のリクエストの完了にJavaScriptのサポートが必要なWebページをリダイレクト経由で間接的に取得するコードは、MAFアプリケーションに含めることはできません。

次に示すのは、ほとんどのWebブラウザがJavaScriptをサポートしている場合に、受け入れ可能なシナリオです。ただし、MAFアプリケーション内で使用された場合は、期待どおりの結果にならない可能性があります。

アプリケーションがREST Webサービスを使用してデータをリクエストし、アプリケーション・サーバーがそのリクエストを認証サーバーにリダイレクトします。認証サーバーによって提供されるページは、さらに別のページにリダイレクトされ、その後で元のRESTエンド・ポイントに戻ります。この一連のリダイレクトでは、認証サーバーによって提供されるWebページのいずれかで、クライアントがJavaScriptを実行し、エンド・ユーザーがアプリケーション・サーバーに対して認証されることになります。

15.10 ブラウザ・プロキシ情報の構成

コール対象のWebサービスが自社ファイアウォールの外部にある場合は、HTTPプロキシ・サーバーを使用できるような適切な構成にJavaシステム・プロパティが設定されていることを確認する必要があります。

デフォルトでは、MAFはiOSおよびAndroidプラットフォームのシステム設定を使用してプロキシ情報を判別します。たとえば、iOSデバイスの設定ユーティリティを使用してプロキシ情報が設定されている場合、JVMは自動的にその情報を取り込みます。

注意:
MAFアプリケーションごとに異なるプロキシを定義できます。

デバイス設定からプロキシ情報を取得しない場合は、まず-Dcom.oracle.net.httpProxySourceシステム・プロパティを追加する必要があります。このプロパティのデフォルト値は「native」であり、プロキシ情報はデバイス設定から取得されます。userなど別の値(たとえば、-Dcom.oracle.net.httpProxySource=user)を指定して、それを無効にする必要があります。

JVMは2つの異なるメカニズムを使用してネットワーク接続を有効にします。

1. 汎用接続フレームワーク(GCF)。このメカニズムが使用された場合、プロキシはシステム・プロパティ-Dcom.sun.cdc.io.http.proxy=<host>:<port>によって定義されます。

2. java.net API。このメカニズムが使用された場合、プロキシは標準のhttp.proxyHostおよびhttp.proxyPortによって定義されます。

いずれの場合でも、maf.propertiesファイルに3つすべてのプロパティを定義することをお薦めしますが、そうすると次のようになります。

java.commandline.argument=-Dcom.oracle.net.httpProxySource=user
java.commandline.argument=-Dcom.sun.cdc.io.http.proxy=www-proxy.us.mycompany.com:80
java.commandline.argument=-Dhttp.proxyHost=www-proxy.us.mycompany.com
java.commandline.argument=-Dhttp.proxyPort=80

注意:
これらのプロパティはネットワーク・コールのJVM側のみに影響します。

16 MAFアプリケーションで使用されるエンド・ポイントの構成

この章では、構成サービスを使用して、MAFアプリケーションで使用できるエンド・ポイントを構成する方法について説明します。

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

- 第16.1項「MAFアプリケーションで使用されるエンド・ポイントの構成の概要」

- 第16.2項「構成サービスのエンド・ポイントの定義」

- 第16.3項「構成サービスのユーザー・インタフェースの作成」

- 第16.4項「URLの構築について」

- 第16.5項「サーバー上での構成サービスの設定」

- 第16.6項「ADFモバイルからの構成サービスの移行」

16.1 MAFアプリケーションで使用されるエンド・ポイントの構成の概要

構成サービスは、Webサービス、ログイン・ユーティリティおよびMAFアプリケーションのその他の部分で使用されるエンド・ポイントを構成できるツールです。

16.2 構成サービスのエンド・ポイントの定義

エンド・ポイントURLは、connections.xmlファイルに定義されており、新しい接続エントリはそのファイルに追加する必要があります。この新しい接続はタイプをHttpURLConnectionにし、そのurl値は構成サーバーのエンド・ポイントURLを指し、そのnameは最終的にJava Beanコードで参照される任意の値に設定されている必要があります。

次の例は、connections.xmlファイルの構成サービス・エンド・ポイントを定義する方法を示しています。

<RefAddresses>
<XmlRefAddr addrType="ConfigServiceConnection">
<Contents>
<urlconnection name="ConfigServiceConnection" url="http://127.0.0.1"/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

<!-- Login Server connection for secured configuration service -->
<Reference name="ConfigServerLogin" className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="ConfigServerLogin" partial="false"
manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://127.0.0.1"/>
<logout url="http://127.0.0.1"/>
<authenticationMode value="remote"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<maxFailuresBeforeCredentialCleared value="3"/>
<rememberCredentials>
<enableRememberUserName value="true"/>
<rememberUserNameDefault value="true"/>
<enableRememberPassword value="false"/>
<enableStayLoggedIn value="false"/>
</rememberCredentials>
<accessControl/>
<userObjectFilter/>
</Contents>
</XmlRefAddr>
</RefAddresses>

構成サーバーに対してセキュリティが有効である場合、connections.xmlファイルにはURL接続と同じエンド・ポイントURLを指すログイン接続を含める必要があります。前の例に示したように、ログイン接続とHttpURLConnectionは、同じadfCredentialStoreKeyを共有する必要があります。

多くの場合、エンド・ポイントURLはエンド・ユーザーから取得する必要があります。このユース・ケースに対処するには、エンド・ユーザーからエンド・ポイントURLの値を取得するためのユーザー・インタフェースを作成し、それをアプリケーション・プリファレンスに設定します。その後、取得した値をJava Beanメソッドで使用して、接続URL値をオーバーライドできます(例16-1を参照)。

例16-1 接続定義のオーバーライド

AdfmfJavaUtilities.clearSecurityConfigOverrides(<ConfigService_ConnectionName>);
AdfmfJavaUtilities.overrideConnectionProperty(<ConfigService_ConnectionName>, "urlconnection",
"url", <ConfigService_EndpointURL>);
AdfmfJavaUtilities.addWhiteListEntry(AdfmfJavaUtilities.getFeatureId(),
<ConfigService_EndpointURL>, false);

// Required if Config Service is secured and the authentication endpoints are input by the user
AdfmfJavaUtilities.clearSecurityConfigOverrides(<ConfigService_AuthenticationConnectionName>);
AdfmfJavaUtilities.overrideConnectionProperty(<ConfigService_AuthenticationConnectionName>,
"login", "url", <Login_EndpointURL>);
AdfmfJavaUtilities.overrideConnectionProperty(<ConfigService_AuthenticationConnectionName>,
"logout", "url", <Logout_EndpointURL>);
AdfmfJavaUtilities.addWhiteListEntry(<Login_EndpointURL>, false);
AdfmfJavaUtilities.addWhiteListEntry(<Logout_EndpointURL>, false);

// Final step to apply the changes
AdfmfJavaUtilities.updateApplicationInformation(false);

16.3 構成サービスのユーザー・インタフェースの作成

構成サービス・ユーザー・インタフェースの要件がある場合は、それを新規または既存のアプリケーション機能に作成する必要があります。

MAFでは、サーバー上での新たな変更をチェックし、更新をダウンロードできるAPIセットがoracle.adfmf.config.client.ConfigurationServiceクラス内に用意されています。これらのAPIをJava Beanで使用すると、構成サービス・アプリケーション機能を介して該当するメソッドをアクティブ化できます。

次のAPIリストとその使用例では、_configservice変数はoracle.adfmf.config.client.ConfigurationServiceクラスのインスタンスを表します。

- setDeliveryMechanismメソッドは、構成サービスの配信メカニズムを設定します。以前のリリースの構成サーバーとの通信がHTTPを介して有効であるため、httpはこのメソッドの引数として渡されます。

_configservice.setDeliveryMechanism("http");

注意:
このメソッド引数は構成サービスに対して使用されるWebトランスポートを表しており、HTTPまたはHTTPSと混同しないでください。エンド・ポイントがHTTPS URLである場合、トランスポートをhttpに設定することは引き続き有効です。

- setDeliveryMechanismConfigurationメソッドは、構成サーバー接続とエンド・ポイントURLを関連付ける追加の属性を構成サービスに対して設定します。

_configservice.setDeliveryMechanismConfiguration("connectionName",
<ConfigService_ConnectionName>);

- isThereAnyNewConfigurationChangesメソッドは、サーバー上でダウンロード可能な変更があるかどうかをチェックし、ある場合はtrueを返します。

_configservice.isThereAnyNewConfigurationChanges(<APPLICATION_ID>, <VERSION>);

- stageAndActivateVersionメソッドは、構成サービスによる更新のダウンロードをトリガーします。アプリケーションのバージョンが、ハードコードされた値またはApplication.getApplicationVersion APIから取得された値として、このメソッドに引数として渡されます。

_configservice.stageAndActivateVersion("1.0");

_configservice.stageAndActivateVersion(Application.getApplicationVersion);

- addProgressListenerメソッドは、構成サービスに更新進捗リスナーを登録して、更新メッセージおよび進捗状況を受信します。基礎クラスは、ProgressListenerインタフェースおよび構成サービスから呼び出されるupdateProgressメソッドを実装している必要があります。updateProgressメソッドは、進捗更新メッセージおよび更新完了率を受信します。

_configservice.addProgressListener(this);

- removeProgressListenerメソッドは、更新進捗リスナーを登録解除します。

_configservice.removeProgressListener(this);

ConfigServiceDemoサンプル・アプリケーションは、これらのAPIを使用して構成サーバーと通信する方法を示しています。ConfigServiceDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

oracle.adfmf.config.client.ConfigurationServiceクラスの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

16.4 URLの構築について

構成サービスは、ユーザーが指定した、またはconnections.xmlファイルに指定されているエンド・ポイントURLを取得し、それを使用してconnections.xmlファイルをダウンロードするためのURLを構築します。

たとえば、アプリケーションIDの値がcom.mycompany.appnameのアプリケーションに対して、ユーザーが次のエンド・ポイントURLを指定している場合、

http://my.server.com:port/SomeLocation

構成サーバーは、次のURLを構築してconnections.xmlファイルをダウンロードします。

http://my.server.com:port/SomeLocation/com.mycompany.appname/connections.xml

16.5 サーバー上での構成サービスの設定

構成サービスは、HTTP GETリクエストを受け入れてconnections.xmlファイルを返すサービスとして実装できます。

構成サービス・クライアントによって使用されるURLの形式は、次のとおりです。

url configured in /connections.xml

構成サービスのエンド・ポイントは、HTTPおよびHTTPSを経由する基本認証(BASIC_AUTH)を使用して保護できます。

16.6 ADFモバイルからの構成サービスの移行

ADFモバイルを使用して作成したアプリケーションをMAFリリース2.0以降に移行する場合は、構成サービスを手動で移行する必要があります。

MAFリリース2.0では、構成サービスの機能を有効にする次のAPI、プロパティおよびユーティリティのサポートが解除されました。

- use-configuration-service-at-startupプロパティを設定して構成サービスを有効にしたり、adfmf-configuration-service-seed-urlプロパティを使用してエンド・ポイントURLを指定するために、adf-config.xmlファイルを使用できなくなりました。

- 構成サービスの更新のチェック機能を提供していたcheckForUpdates APIは非推奨になりました。

- 構成サービスは、ADFモバイルに用意されているUIから開始しました。

第16.2項「構成サービスのエンド・ポイントの定義」の説明に従って、エンド・ポイントURLをadf-config.xmlファイルからconnections.xmlファイルに移動し、新しい接続要素をconnections.xmlファイルに追加する必要があります。

このMAFリリースへの移行では、ユーザーからエンド・ポイントURLを取得するためのユーザー・インタフェースの作成や、構成サービスAPIを起動するためのバッキングBeanの追加を行います。詳細は、第16.3項「構成サービスのユーザー・インタフェースの作成」を参照してください。

ConfigServiceDemoという名前のMAFサンプル・アプリケーションは、APIを使用して構成サーバーと通信する方法を示しています。ConfigServiceDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

17 MAF AMXでのローカル・データベースの使用方法

この章では、MAF AMXアプリケーション機能でローカルSQLiteデータベースを使用する方法について説明します。

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

- 第17.1項「ローカルSQLiteデータベースの使用方法の概要」

- 第17.2項「ローカルSQLiteデータベースの使用方法」

17.1 ローカルSQLiteデータベースの使用方法の概要

SQLiteは、特に埋込みアプリケーション用に設計されたリレーショナル・データベース管理システム(RDBMS)です。

SQLiteには次の特性があります。

- ACID準拠: 他の従来のデータベース・システムと同様に、原子性、一貫性、独立性および永続性という特性を備えています。

- 軽量: アプリケーション内に直接埋め込むように設計された小さなCライブラリでデータベース全体が構成されています。

- 移植性: 様々な範囲のコンピュータ・アーキテクチャおよびオペレーティング・システム間でバイナリ互換性がある単一ファイルでデータベースは自己完結型となります。

詳細は、SQLite Webサイト(http://www.sqlite.org)を参照してください。

ローカルのSQLiteデータベースの使用例は、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにあるStockTrackerというMAFサンプル・アプリケーションを参照してください。詳細は、第17.2.8項「StockTrackerサンプル・アプリケーションに関する必知事項」を参照してください。

17.1.1 SQLiteと他のリレーショナル・データベースとの相違点

SQLiteは、埋込みデータベース・システムとして使用する設計になっており、通常は1人のユーザーによって使用され、アプリケーションに直接リンクされることも多くあります。他方、エンタープライズ・データベースは、クライアントとサーバーの分散された環境における高い同時実行性を求めて設計されています。このような違いがあるため、Oracleデータベースと比較して複数の制約が存在します。最も重要な相違点を次に示します。

- 同時実行性

- SQLのサポートおよび解釈

- データ型

- 外部キー

- データベース・トランザクション

- 認証

詳細は、次を参照してください。

- SQLite Webサイト(http://www.sqlite.org/docs.html)のドキュメント・セクション

- SQLite Webサイトのドキュメント・セクションで入手可能な『Limits In SQLite』(http://www.sqlite.org/limits.html)

17.1.1.1 同時実行性

SQLiteデータベースの単一インスタンスは、常に、単一の読取り/書込み接続または複数の読取り専用接続のいずれかを持つことができます。

ロック・メカニズムが粗いため、SQLiteでは、同一のデータベース・インスタンスに対する複数の読取り/書込み接続がサポートされていません。詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『File Locking And Concurrency In SQLite Version 3』(http://www.sqlite.org/lockingv3.html)を参照してください。

17.1.1.2 SQLのサポートおよび解釈

SQLiteはSQL92標準でコンパイルされますが、サポートされていない構成が次を含めていくつか存在します。

- RIGHT OUTER JOIN

- FULL OUTER JOIN

- GRANT

- REVOKE

詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『SQL Features That SQLite Does Not Implement』(http://www.sqlite.org/omitted.html)を参照してください。

SQLiteによるSQLの解釈の方法の詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『SQL As Understood by SQLite』(http://www.sqlite.org/lang_createtable.html)を参照してください。

17.1.1.3 データ型

大部分のデータベース・システムは強く型指定をしているのに対して、SQLiteは動的な型指定のため、宣言された型とは無関係にどの列にどの値を格納することもできます。たとえば、数値列に文字列値が間違って格納された場合でも、SQLiteではエラーは戻されません。詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『Datatypes In SQLite Version 3』(http://www.sqlite.org/datatype3.html)を参照してください。

17.1.1.4 外部キー

SQLiteでは、外部キーをサポートしています。外部キー制約を解析および適用します。詳細は、http://www.sqlite.org/foreignkeys.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『SQLite Foreign Key Support』を参照してください。

17.1.1.5 データベース・トランザクション

SQLiteはACID準拠であるためトランザクションをサポートしていますが、SQLiteとOracleのトランザクション・サポートの間には基本的な相違点がいくつか存在します。

- ネストされたトランザクション: SQLiteでは、ネストされたトランザクションをサポートしません。単一のトランザクションのみを常時アクティブにできます。

- コミット: SQLiteは、任意の指定されたデータベースに対し、複数の読取り専用接続または単一の読取り/書込み接続のいずれかを許容します。したがって、同一のデータベースに対して複数の接続がある場合は、データベースの変更を試みる最初の接続のみが成功します。

- ロールバック: SQLiteでは、開いているすべてのResultSetsを閉じるまではトランザクションのロールバックができません。

詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『Distinctive Features of SQLite』(http://www.sqlite.org/different.html)を参照してください。

17.1.1.6 認証

SQLiteでは、ロールベースまたはユーザーベースの認証はどの形式もサポートしていません。デフォルトで、どのユーザーもファイル内のすべてのデータにアクセスできます。ただし、MAFでは、使用可能な暗号化ルーチンを提供することで、データを保護し、有効な資格証明セットを持たないユーザーによるアクセスを防ぎます。詳細は、第17.2.7項「データベースを暗号化および復号化する方法」を参照してください。

17.2 ローカルSQLiteデータベースの使用方法

MAFには、暗号化されたSQLite 3.8.5データベースが含まれています。

通常SQLiteを使用する場合は、次のことを知っておく必要があります。

- データベースへの接続方法

- SQLスクリプトを使用してデータベースを初期化する方法またはデスクトップ上でデータベースを初期化する方法

- データベースを暗号化および復号化する方法

- VACUUMコマンドの使用方法

17.2.1 データベースへの接続方法

SQLiteデータベースへの接続は、Oracleデータベースへの接続を開く場合とは少し異なります。つまり、最初の接続を取得すると、同じJDBC APIおよびSQL構文の大部分が使用可能になり、データベースの問合せと変更が可能になります。

ユーザーのアプリケーションに関連付けられたjava.sql.Connectionオブジェクトを使用して、SQLiteデータベースに接続します。接続を作成する場合は、どのSQLite JDBC URLもjdbc:sqlite:というテキストで始まるようにします。

次の例は、暗号化されていないデータベースと接続を開く方法を示しています。接続を取得する前に、JDBCドライバをロードする必要があります。

public static Connection getConnection() throws Exception {
if (conn == null) {
try {
// create a database connection
String Dir = AdfmfJavaUtilities.getDirectoryPathRoot(
AdfmfJavaUtilities.ApplicationDirectory);
String connStr = "jdbc:sqlite:" + Dir + "/portfolio.db";
// Load the driver
Class.forName("SQLite.JDBCDriver");
conn = DriverManager.getConnection(connStr);
}
catch (SQLException e) {
// If the error message is "out of memory", it probably
// means that no database file is found
System.err.println(e.getClass().getName() + ": " + e.getMessage() );
e.printStackTrace();
}
}
return conn;
}

その他の例は、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにあるStockTrackerというMAFサンプル・アプリケーションを参照してください。

次の例は、暗号化されたデータベースと接続を開く方法を示しています。

java.sql.Connection connection = new SQLite.JDBCDataSource(
"jdbc:sqlite:/path/to/database").getConnection(null,"password");

前述の例では、getConnectionメソッドの最初のパラメータがユーザー名となっていますが、SQLiteではユーザーベースのセキュリティがサポートされないため、この値は無視されます。

注意:
SQLiteでは、不正なパスワードで暗号化されたデータベースを開いた場合でも、エラー・メッセージが表示されません。同様に、暗号化されていないデータベースをパスワードで誤って開いた場合でも警告は表示されません。そのかわりに、データの読取りまたは変更を試みた場合は、「エラー: ファイルが暗号化されているか、ファイルがデータベースではありません。」というメッセージとともにSQLExceptionがスローされます。

17.2.2 SQLスクリプトを使用してデータベースを初期化する方法

通常、アプリケーションの起動時にSQLスクリプトを使用してデータベースを初期化できます。次の例は、サポートされたSQL構文(第17.1.1.2項「SQLのサポートおよび解釈」で説明)の一部を示すSQL初期化スクリプトを示しています。この構文では、DROP TABLE、CREATE TABLEおよびINSERTの各コマンドとNUMBERおよびVARCHAR2の各データ型が使用されています。

DROP TABLE IF EXISTS PERSONS;

CREATE TABLE PERSONS
(
PERSON_ID NUMBER(15) NOT NULL,
FIRST_NAME VARCHAR2(30),
LAST_NAME VARCHAR2(30),
EMAIL VARCHAR2(25) NOT NULL
);

INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 100, 'David', 'King', 'steven@king.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 101, 'Neena', 'Kochhar', 'neena@kochhar.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 102, 'Lex', 'De Haan', 'lex@dehaan.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 103, 'Alexander', 'Hunold', 'alexander@hunold.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 104, 'Bruce', 'Ernst', 'bruce@ernst.net');

SQLスクリプトを使用するには、それをMAFアプリケーションのApplicationControllerプロジェクトにリソースとして追加します。サンプル・スクリプトは、META-INFディレクトリでinitialize.sqlとして保存されているものとします。次の例は、SQLスクリプトを解析し、文を実行するために追加する必要のあるコードを示しています。

private static void initializeDatabaseFromScript() throws Exception {
InputStream scriptStream = null;
Connection conn = null;
try {
// ApplicationDirectory returns the private read-write sandbox area
// of the mobile device's file system that this application can access.
// This is where the database is created
String docRoot = AdfmfJavaUtilities.getDirectoryPathRoot
(AdfmfJavaUtilities.ApplicationDirectory);
String dbName = docRoot + "/sample.db";

// Verify whether or not the database exists.
// If it does, then it has already been initialized
// and no furher actions are required
File dbFile = new File(dbName);
if (dbFile.exists())
return;

// If the database does not exist, a new database is automatically
// created when the SQLite JDBC connection is created
conn = new SQLite.JDBCDataSource("jdbc:sqlite:" + docRoot +
"/sample.db").getConnection();

// To improve performance, the statements are executed
// one at a time in the context of a single transaction
conn.setAutoCommit(false);

// Since the SQL script has been packaged as a resource within
// the application, the getResourceAsStream method is used
scriptStream = Thread.currentThread().getContextClassLoader().
getResourceAsStream("META-INF/initialize.sql");
BufferedReader scriptReader = new BufferedReader
(new InputStreamReader(scriptStream));
String nextLine;
StringBuffer nextStatement = new StringBuffer();

// The while loop iterates over all the lines in the SQL script,
// assembling them into valid SQL statements and executing them as
// a terminating semicolon is encountered
Statement stmt = conn.createStatement();
while ((nextLine = scriptReader.readLine()) != null) {
// Skipping blank lines, comments, and COMMIT statements
if (nextLine.startsWith("REM") ||
nextLine.startsWith("COMMIT") ||
nextLine.length() < 1)
continue;
nextStatement.append(nextLine);
if (nextLine.endsWith(";")) {
stmt.execute(nextStatement.toString());
nextStatement = new StringBuffer();
}
}
conn.commit();
}
finally {
if (conn != null)
conn.close();
}
}

注意:
前の例では、わかりやすくするためにエラー処理が省略されました。

次の例に示すように、データベース初期化コード(前の例を参照)をLifeCycleListenerImplのstartメソッドから起動します。

public void start() {
try {
initializeDatabaseFromScript();
}
catch (Exception e) {
Trace.log(Utility.FrameworkLogger,
Level.SEVERE,
LifeCycleListenerImpl.class,
"start",
e);
}
}

17.2.3 デスクトップ上でデータベースを初期化する方法

SQLiteデータベースは自己完結型でプラットフォーム間のバイナリ互換性があるため、同じデータベース・ファイルをiOS、Android、Windows、LinuxおよびMac OSの各プラットフォームで使用できます。複雑なケースでは、サード・パーティのツール(MesaSQLite、SQLiteManager、SQLite Database Browserなど)を使用してデスクトップ上でデータベースを初期化し、結果ファイルをアプリケーション内のリソースとしてパッケージ化できます。

データベースを使用するには、それをMAFアプリケーションのApplicationControllerプロジェクトにリソースとして追加します。データベースは、META-INFディレクトリにsample.dbとして保存されているものとします。次の例は、アプリケーションからモバイル・デバイスのファイル・システムにデータベースをコピーしてデータベースへのアクセスを可能にするために追加する必要のあるコードを示しています。

private static void initializeDatabase() throws Exception {
InputStream sourceStream = null;
FileOutputStream destinationStream = null;
try {
// ApplicationDirectory returns the private read-write sandbox area
// of the mobile device's file system that this application can access.
// This is where the database is created
String docRoot = AdfmfJavaUtilities.getDirectoryPathRoot
(AdfmfJavaUtilities.ApplicationDirectory);
String dbName = docRoot + "/sample.db";

// Verify whether or not the database exists.
// If it does, then it has already been initialized
// and no furher actions are required
File dbFile = new File(dbName);
if (dbFile.exists())
return;

// Since the database has been packaged as a resource within
// the application, the getResourceAsStream method is used
sourceStream = Thread.currentThread().getContextClassLoader().
getResourceAsStream("META-INF/sample.db");
destinationStream = new FileOutputStream(dbName);
byte[] buffer = new byte[1000];
int bytesRead;
while ((bytesRead = sourceStream.read(buffer)) != -1) {
destinationStream.write(buffer, 0, bytesRead);
}
}
finally {
if (sourceStream != null)
sourceStream.close();
if (destinationStream != null)
destinationStream.close();
}
}

注意:
前の例では、わかりやすくするためにエラー処理が省略されました。

次の例に示すように、データベース初期化コード(前の例を参照)をLifeCycleListenerImplのstartメソッドから起動します。

public void start() {
try {
initializeDatabase();
}
catch (Exception e) {
Trace.log(Utility.FrameworkLogger,
Level.SEVERE,
LifeCycleListenerImpl.class,
"start",
e);
}
}

17.2.4 コミット処理に関する必知事項

Commit文があってもこれは無視されます。各文は、SQLスクリプトから読み込まれる際にコミットされます。この自動コミット機能は、デフォルトでSQLiteデータベースによって提供されます。アプリケーションのパフォーマンスを向上させるために、ConnectionのsetAutoCommit(false)メソッドを使用して自動コミットを無効化し、commit文の標準的な実行を許可できます。

17.2.5 MAFでのSQLite JDBCドライバの制限

java.sqlパッケージからの次のメソッドは、MAF内では制限があるか、サポートされていません。

- ResultSetのgetByteメソッドはサポートされていません。このメソッドを使用した場合は、実行時にメソッドからSQLExceptionがスローされます。

- (ResultSetを戻す文に対してのみtrueを戻すのとは対照的に)Statementのexecuteメソッドは常にtrueを戻します。

17.2.6 VACUUMコマンドの使用方法

レコードがSQLiteデータベースから削除された場合、そのサイズは変更されません。このことは断片化の原因となり、最終的には、パフォーマンスが低下します。VACUUMコマンドを定期的に実行することによって、このことを回避できます。

注意:
VACUUMは、大規模データベースに対して実行される場合、かなりの時間がかかる場合があります(SQLiteがデプロイされているLinuxコンピュータ上ではMB当たり約0.5秒)。また、実行中は、元のファイルの最大2倍の一時ディスク領域を使用する可能性があります。

通常、VACUUMコマンドは、適切に登録されたLifeCycleListener実装から実行する必要があります(第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照)。

17.2.7 データベースを暗号化および復号化する方法

MAFでは、様々なAPIを使用して、初期またはそれ以降に暗号化したSQLiteデータベースを提供できます。これらのAPIの一部では、データベースを暗号化するために独自のパスワードを指定できます。その他は、MAFによってパスワードを生成し、オプションでパスワードを管理する場合に使用されます。

17.2.7.1 独自のパスワードでのデータベースの暗号化

独自のパスワードでデータベースを暗号化するには:

1. データベース接続を確立します(第17.2.1項「データベースへの接続方法」を参照)。

2. 次のユーティリティ・メソッドを使用して、データベースを新しいキーで暗号化します。

AdfmfJavaUtilities.encryptDatabase(connection, "newPassword");

17.2.7.2 独自のパスワードで暗号化されたデータベースの永久的な復号化

独自のパスワードで暗号化されたデータベースを永続的に復号化するには:

1. 暗号化されたデータベースを正しいパスワードで開きます。

2. 次のユーティリティ・メソッドを使用します。

AdfmfJavaUtilities.decryptDatabase(connection);

注意:
データベースを不正に開いて(不正なパスワードを使用して暗号化されたデータベースを開くなど)、再び暗号化した場合は、以前の正しいパスワード、不正なパスワード、新しいパスワードのいずれでもデータベースのロックを解除できなくなり、取り返しのつかないデータの損失につながります。

17.2.7.3 MAFで生成されたパスワードでのデータベースの暗号化

MAFによって生成されたパスワードを使用してデータベースを暗号化するには:

1. 次のメソッドを使用してパスワードを生成します。

GeneratedPassword.setPassword("databasePasswordID", "initialSeedValue");

このメソッドでは、暗号関数で強力なパスワードを生成できるように、一意の識別子と初期シード値の両方が必要です。

2. 前に指定したIDを使用して、作成したパスワードを次のように取得します。

char[] password = GeneratedPassword.getPassword("databasePasswordID");

3. データベース接続を確立します(第17.2.1項「データベースへの接続方法」を参照)。

4. データベースを次のように暗号化します。

AdfmfJavaUtilities.encryptDatabase(connection, new String(password));

17.2.7.4 MAFで生成されたパスワードで暗号化されたデータベースの復号化

データベースを復号化し、MAFによって生成されたパスワードを削除するには:

1. 正しいパスワードを次のように取得します。

char[] password = GeneratedPassword.getPassword("databasePasswordID");

2. データベース接続を確立し、データベースを次のように復号化します。

java.sql.Connection connection =
SQLite.JDBCDataSource("jdbc:sqlite:/path/to/database").
getConnection(null, new String(password));

3. オプションで、次のメソッドを使用して、生成されたパスワードを削除します。

GeneratedPassword.clearPassword("databasePasswordID");

17.2.8 StockTrackerサンプル・アプリケーションに関する必知事項

StockTrackerサンプル・アプリケーションは、カスタムSQLiteデータベース・ファイル(このアプリケーション内にパッケージ化されています)を使用します。データベース・ファイルには、4つの株に関する情報が含まれる4つのレコードのある表が含まれています。アプリケーションは、アクティブ化されると、この表からデータを読み取り、4つの株を表示します。株に関する情報は、CRUD操作の対象にできます。株は、ユーザー・インタフェースを介して、作成、並替え、更新および削除できます。株の並替えを含むすべてのCRUD操作が、SQLiteデータベースで更新されます。

18 MAF AMXアプリケーション機能アーティファクトのカスタマイズ

この章では、既存のMAF AMXページ、タスク・フローおよびページ定義ファイルのカスタマイズの実行方法について説明します。

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

- 第18.1項「MAF AMXページおよびアーティファクトのカスタマイズの概要」

- 第18.2項「MAF AMXページおよびアーティファクトのカスタマイズ」

18.1 MAF AMXページおよびアーティファクトのカスタマイズの概要

JDeveloperおよびOracle Metadata Service (MDS)により提供される標準のカスタマイズ・メカニズムを使用して、次のものを含む既存のMAF AMXアプリケーション機能アーティファクトおよびメタデータ・ファイルをカスタマイズできます。

- MAF AMXファイル(.amx)。

- タスク・フロー・ファイル(ViewController-task-flow.xmlなど)。

- ページ定義ファイル(<ページ名>.PageDef.xml)。

- データ・コントロールXMLファイル(データ・コントロール構造ファイルを含むパッケージ・ファイル(つまり、データ・コントロール名の前にpersdef.が付加された名前のパッケージ・ファイル))。

デザインタイムに行ったカスタマイズの変更は、デプロイメント中にファイルに適用され、ランタイムに表示されるようになります。MAF AMXは、特定のカスタマイズ・コンテキストの最終バージョンがデプロイメント中にシードされ、そのカスタマイズ・コンテキストに対してランタイムに静的に動作する、静的シード・カスタマイズをサポートしています。カスタマイズ・コンテキストごとに個別のMAFアプリケーションをデプロイする必要があります。

注意:
MAF AMXでは、ランタイムにカスタマイズの作成および適用の両方を実行するユーザー・カスタマイズをサポートしていません。

MAFアプリケーション・レベルのアーティファクトのカスタマイズの詳細は、第10章「MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ」を参照してください。

18.2 MAF AMXページおよびアーティファクトのカスタマイズ

MAF AMXページとアーティファクトをカスタマイズするには、第10.1項「MDSカスタマイズをMAFファイルに適用する方法の概要」で説明している手順に従います。

カスタマイズ・レイヤーを構成する際は、IDの一意性を確保してカスタマイズが正確に適用されるように、id-prefixトークンを追加できます。カスタマイズ中に新規要素(commandButtonなど)をMAF AMXページに追加すると、レイヤーとレイヤー値のid-prefixが要素の自動生成識別子に追加され、カスタマイズ・メタデータ・ファイルで新たに追加された要素のidが作成されます。次の例に示すように、siteレイヤーに" s "というid-prefixが付けられ、headquartersレイヤー値に" hq "というid-prefixが付けられています。

<cust-layers  xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer name="industry" id-prefix="i">
<cust-layer-value value="financial"
display-name="Financial"
id-prefix="f"/>
<cust-layer-value value="healthcare"
display-name="Healthcare"
id-prefix="h"/>
</cust-layer>
<cust-layer name="site" id-prefix="s">
<cust-layer-value value="headquarters"
display-name="HQ"
id-prefix="hq"/>
<cust-layer-value value="remoteoffices"
display-name="Remote"
id-prefix="rm"/>
</cust-layer>
</cust-layers>

ヒント・レイヤーとしてsite/headquartersを選択して、MAF AMXボタン・コンポーネントをページに追加すると、メタデータ・カスタマイズ・ファイルでcommandButton要素に shqcb1 というidが設定されます。

カスタマイズ・プロセスが完了すると、JDeveloperによりカスタマイズ用のメタデータ・ファイルとこれらを格納するサブパッケージが作成されます。メタデータ・ファイルにはカスタマイズしたオブジェクトのカスタマイズが含まれ、これらは実行時にベース・メタデータに適用されます。図18-1、図18-2、図18-3および図18-4に示すとおり、JDeveloperにより、オブジェクトのベース・ファイルと同じ名前に.xml拡張子を追加した名前が新しいメタデータ・ファイルに付けられます。

図18-1 MAF AMXページのカスタマイズ・ファイル

図18-2 タスク・フローのカスタマイズ・ファイル

図18-3 ページ定義のカスタマイズ・ファイル

図18-4 データ・コントロールXMLファイルのカスタマイズ・ファイル

19 カスタムMAF AMX UIコンポーネントの作成

この章では、カスタムMAF AMX UIコンポーネントを作成し、それらを開発環境の一部として指定する方法について説明します。

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

- 第19.1項「カスタムUIコンポーネントの作成の概要」

- 第19.2項「MAF APIを使用したカスタム・コンポーネントの作成」

- 第19.3項「カスタム・コンポーネントの作成」

19.1 カスタムUIコンポーネントの作成の概要

MAFによって提供されるJavaScriptとAPIの組合せを使用して、完全に機能する新しいインタラクティブなUIコンポーネントを作成し、それらをタグ・ライブラリに追加して、MAF AMXアプリケーション機能で使用できます。

19.2 MAF APIを使用したカスタム・コンポーネントの作成

MAFでは、カスタム・コンポーネントの作成用に次のAPIが提供されています。

- 静的API (第19.2.1項「静的APIの使用方法」を参照)

- AmxEventクラス(第19.2.2項「AmxEventクラスの使用方法」を参照)

- TypeHandler (第19.2.3項「TypeHandlerの使用方法」を参照)

- AmxNode (第19.2.4項「AmxNodeの使用方法」を参照)

- AmxTag (第19.2.5項「AmxTagの使用方法」を参照)

- VisitContext (第19.2.6項「VisitContextの使用方法」を参照)

- AmxAttributeChange (第19.2.7項「AmxAttributeChangeの使用方法」を参照)

- AmxDescendentChanges (第19.2.8項「AmxDescendentChangesの使用方法」を参照)

- AmxCollectionChange (第19.2.9項「AmxCollectionChangeの使用方法」を参照)

- AmxNodeChangeResult (第19.2.10項「AmxNodeChangeResultの使用方法」を参照)

- AmxNodeStates (第19.2.11項「AmxNodeStatesの使用方法」を参照)

- AmxNodeUpdateArguments (第19.2.12項「AmxNodeUpdateArgumentsの使用方法」を参照)

19.2.1 静的APIの使用方法

表19-1に、カスタムUIコンポーネントの作成に使用できる静的APIを示します。

表19-1 静的API

戻り型

関数名

パラメータ

説明

Function

adf.mf.api.amx.TypeHandler.register

String namespaceUrl、

String tagName、

adf.mf.api.amx.TypeHandler precreatedClass

タグの名前空間および名前を指定してTypeHandlerクラスを登録します。

プロトタイプ関数を追加できるように、登録されているadf.mf.api.amx.TypeHandlerサブクラスを返します。

precreatedClassはオプションですが、adf.mf.api.amx.TypeHandlerから継承するクラスを最初に作成する場合に使用できます。

void

adf.mf.api.amx.addBubbleEventListener

Node domNode、

String eventType、

Function listener、

Object eventData

バブル・イベント・リスナー(tap、taphold、keydown、touchstart、touchmove、touchend、focus、blur、resizeなど)を登録します。

Webブラウザが、すべてのDOMノードのすべてのイベント・タイプをサポートしているわけではないことに注意してください(詳細は、ブラウザのドキュメントを参照)。

eventDataはオプションで、リスナー関数に使用できる追加データとして機能します。

void

adf.mf.api.amx.removeBubbleEventListener

Node domNode、

String eventType、

Function listener

adf.mf.api.amx.addBubbleEventListenerで追加されたバブル・イベント・リスナーを登録解除します。

メタ・イベントtapおよびtapholdを削除すると、指定されたリスナーだけが削除されるのではなく、すべてのtouchstartおよびtouchendリスナー(他のメタ・イベントのこれらのリスナーも含む)が要素から削除されることに注意してください。

void

adf.mf.api.amx.addDragListener

Node domNode、

Object payload、

Object eventData

要素に対して、MAF AMXドラッグ・イベントのトリガーを許可します。

Object payloadでは、3つのメンバー関数(start、drag、end)を定義します。各関数の最初のパラメータはDOMイベントで、2番目のパラメータは次のメンバーが含まれるdragExtra Objectです。

- eventSource: DOMイベント・ソース。

- pageX: イベントのx座標。

- pageY: イベントのy座標。

- startPageX: 元のpageX。

- startPageY: 元のpageY。

- deltaPageX: pageXの変更。

- deltaPageY: pageYの変更。

- originalAngle: 定義されている場合は、ドラッグの元の角度(度)で、0度は東、90は北、-90は南、180は西です。

次の変更可能なメンバー・フラグがあります。

- preventDefault

- stopPropagation

eventDataはオプションで、リスナー関数に使用できる追加データとして機能します。

void

adf.mf.api.amx.removeDomNode

Node domNode

DOMノードおよびその子を削除しますが、その前に、adf.mf.api.amx.addBubbleEventListenerで追加されたイベント・リスナーを削除します。

void

adf.mf.api.amx.emptyHtmlElement

Node domNode

子DOMノードを削除し、それらの各子ノードでadf.mf.api.amx.removeDomNodeをコールすることで、HTML要素を空にします。

void

adf.mf.api.amx.processAmxEvent

adf.mf.api.amx.AmxNode amxNode、

String amxEventType、

String attributeValueName、

String newValue、

AmxEvent amxEvent、

Function successCallback

Function failureCallback

AmxEventを処理します。

attributeValueNameが定義されている場合は値を変更し、適切なsetPropertyListenerおよびactionListenerサブタグを処理し、次に[amxEventType]Listener属性を処理します。

イベントが正常に処理されると、成功コールバックが起動されます。そうでない場合は、失敗コールバックが起動されます。successCallbackとfailureCallbackの両方はオプションです。

void

adf.mf.api.amx.acceptEvent

なし

adf.mf.api.amx.processAmxEventに渡す必要がある可能性があるすべてのものを準備しなくても済むように、この関数の呼出しを続行しても安全であるかどうかを判断します(たとえば、ページ遷移の途中や、デザインタイム・プレビューなどの環境の場合)。

void

adf.mf.api.amx.invokeEl

String expression、

Array<String> params、

String returnType、

Array<String> paramTypes、

Function successCallback、

Function failureCallback

ELメソッドを呼び出す点でadf.mf.el.invoke()に類似しており、デザインタイム・プレビューなどの環境では実行を控える点が異なるユーティリティを表します。

void

adf.mf.api.amx.enableAmxEvent

adf.mf.api.amx.AmxNode amxNode、

Node domNode、

String eventType

DOMノードに対して、amx:showPopupBehavior、amx:setPropertyListenerなどのカスタムMAF AMXイベント(tapHoldやswipeなど)のトリガーを許可します。

void

adf.mf.api.amx.doNavigation

String outcome

指定された結果へのナビゲーションを実行することをコントローラに指示します。

void

adf.mf.api.amx.validate

Node domNode、

Function successCallback

不十分なバリデータ(必須またはamx:validationBehavior)がある場合、ナビゲーションなどの操作を阻止します。

続行が許可されると、successCallbackが呼び出されます。

void

adf.mf.api.amx.showLoadingIndicator

Number failSafeDuration、

Function failSafeClientHandler

ビジー・インジケータを示します。

パラメータは次のとおりです。

- failSafeDuration: ローディング・インジケータの表示および非表示の間にMAFが待機するおよその期間(ミリ秒を表す負でない整数) (他のトリガーがすでにインジケータを表示していないと仮定した場合)。このパラメータが指定されていないか、またはnullに設定されている場合、MAFは10000 (10秒)の値を使用します。

- failSafeClientHandler: failSafeDurationに達した場合に起動されるオプションのJavaScript関数。この関数を使用して、続行方法を決定できます。この関数は、次のいずれかの値で定義されているStringを返す必要があります。
- hide: デフォルトのフェイルセーフのようにインジケータを非表示にします。

- repeat: 関数を再度呼び出せるように新たな期間についてタイマーを再起動します。

- freeze: インジケータを稼働させたまま無期限に待機させ、ページは再起動されるまでフリーズ状態で停止します。

インジケータが必要以上に表示されるのを回避するには、非表示にします。

void

adf.mf.api.amx.hideLoadingIndicator

なし

ローディング・インジケータの1つのインスタンスを非表示にします。

Object

adf.mf.api.amx.createIterator

Object dataItems

3ノード・イテレータ(コレクション・モデル)に対するオブジェクトのJavaScript配列またはイテレータをサポートするイテレータを作成します。

next、hasNextおよびisTreeNodeIterator関数でイテレータObjectを返しますが、ここで、nextは、使用可能なオブジェクトがそれ以上ない場合、undefinedを返します。

void

adf.mf.api.amx.bulkLoadProviders

Object treeNodeIterator、

Number startingPoint、

Number maximumNumberOfRowsToLoad、

Function successCallback、

Function failCallback

一連のデータ・プロバイダをバルクロードして、これらがキャッシュされてローカルでアクセスできるようにします。

String

adf.mf.api.amx.buildRelativePath

String url

現在のMAF AMXページに対して相対的であると想定して、指定されたリソースに基づく相対パスを作成します。リソース上にプロトコルがある場合は、絶対パスであると想定され、変更されません。

void

adf.mf.api.amx.markNodeForUpdate

adf.mf.api.amx.AmxNodeUpdateArguments args

AmxNodeに対する状態変更(AmxNode階層がそのノード以下で更新される必要がある)をMAFに通知する、TypeHandlerインスタンスの関数。

カスタムcreateChildrenNodesメソッドがTypeHandlerに存在する場合は、これらのAmxNodeインスタンス対して再度コールされます。これにより、子にスタンプ設定するAmxNodeインスタンスは、ユーザー変更による新しいスタンプを追加できます。refreshメソッドは、AmxNodeがレンダリングする準備ができた場合、指定されたプロパティを使用してAmxNodeでコールされます。AmxNodeがレンダリングする準備ができていない場合、MAFはELが解決されるのを待機し、すべてのデータが使用可能になった後にrefreshメソッドがコールされます。

注意:
adf.mf.elパッケージのその他のパブリックAPIは、ロギング、変換およびデータ・チャネルに使用できます。

19.2.2 AmxEventクラスの使用方法

表19-2に、カスタムUIコンポーネントの作成時に使用できるAMXEventクラスをリストします。

表19-2 AMXEventクラス

クラス名

パラメータ

説明

adf.mf.api.amx.ActionEvent

なし

結果ベースのナビゲーションをトリガーするイベント。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.ActionEventも参照してください。

adf.mf.api.amx.MoveEvent

Object rowKeyMoved、

Object rowKeyInsertedBefore

指定された行が移動されたことを通知するイベント。移動された行のキー、および移動済行がその前に挿入された行のキーが含まれます。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.MoveEventも参照してください。

adf.mf.api.amx.SelectionEvent

Object oldRowKey、

Array<Object> selectedRowKeys

コンポーネントの選択変更のイベント。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.SelectionEventも参照してください。

adf.mf.api.amx.ValueChangeEvent

Object oldValue、

Object newValue

コンポーネントの値変更のイベント。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.ValueChangeEventも参照してください。

19.2.3 TypeHandlerの使用方法

表19-3に、カスタムUIコンポーネントの作成に使用できるTypeHandler APIを示します。

表19-3 TypeHandler API

戻り型

関数名

パラメータ

説明

HTMLElement

render

adf.mf.api.amx.AmxNode amxNode、

String id

初期DOM構造を作成し、その構造のルート要素を返します。

このメンバー関数は必須であり、定義されている必要があります。

void

init

HTMLElement rootElement、

adf.mf.api.amx.AmxNode amxNode

このコンポーネントで作成される一連のコンポーネントに属するすべてのcreate関数が呼び出された後に呼び出されるハンドラを表します。

void

postDisplay

HTMLElement rootElement、

adf.mf.api.amx.AmxNode amxNode

このコンポーネントで作成される一連のコンポーネントに属するすべてのinit関数が呼び出された後に呼び出されるハンドラを表します。

Boolean

createChildrenNodes

adf.mf.api.amx.AmxNode amxNode

処理する子AmxNodeを選択して追加します。いずれかの子が示されている場合、この関数を使用すると、他の子が処理されなくなることに注意してください。

MAFがカスタム実装ではなく子ノードを作成する場合は、falseを返す必要があります。

この関数はオプションです。

adf.mf.api.amx.AmxNodeChangeResult

updateChildren

adf.mf.api.amx.AmxNode amxNode、

adf.mf.api.amx.AmxAttributeChange attributeChanges

次のいずれかのハンドラを表します。

- 古い子をすべて削除し、新しい子を作成してAmxNodeに追加します。

- 戻り値を介して、実行する必要があるadf.mf.api.amx.AmxNodeChangeResultアクションを宣言します。

この関数はオプションです。

adf.mf.api.amx.AmxNodeChangeResult

getDescendentChangeAction

adf.mf.api.amx.AmxNode amxNode、

adf.mf.api.amx.AmxDescendentChanges descendentChanges

タイプ・ハンドラに対して、子孫AmxNodeインスタンスへの変更処理のカスタマイズを許可します。

void

refresh

adf.mf.api.amx.AmxAttributeChange attributeChanges、

adf.mf.api.amx.AmxDescendentChanges descendentChanges

タイプ・ハンドラに対して、変更に応答したHTMLの選択的リフレッシュを許可します。このメソッドは、updateChildrenメソッドの後にコールされます。

attributeChangesは変更された属性を定義します。descendentChangesがnullでない場合は、リフレッシュする必要があるすべての子孫ノードに対する変更を定義します。

Boolean

isFlattenable

なし

AmxNodeがフラット化可能であるかどうかを宣言します。フラット化されたAmxNodeにはレンダリング関連の動作がない可能性がある(フラット化されたAmxNodeのタイプ・ハンドラは子ノードの作成とアクセスのみを制御でき、レンダリングには影響を与えない)ことに注意してください。

Boolean

visit

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

このAmxNodeから始まるAmxNodeツリー・アクセスを処理します。

アクセスでパラメータvisitContextおよびAmxNodeを使用する場合に呼び出すvisitCallback関数。アクセスが完了し、続行する必要がないかどうかを返します。

Boolean

visitChildren

adf.mf.api.amx.AmxNode amxNode、

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

このAmxNodeの子から始まるAmxNodeツリー・アクセスを処理します。

アクセスでパラメータvisitContextおよびAmxNodeを使用する場合に呼び出すvisitCallback関数。アクセスが完了し、続行する必要がないかどうかを返します。

void

preDestroy

HTMLElement rootElement、

adf.mf.api.amx.AmxNode amxNode

現在のビューが破棄される直前、つまり新しいビューに移動しようとするときにすべてを処理します。通常は、スクロール位置などのクライアント状態を保存するために使用されます(adf.mf.api.amx.setClientStateを参照)。

void

destroy

HTMLElement rootElement、

adf.mf.api.amx.AmxNode amxNode

新しいビューが表示され、古いビューが削除された後にすべてを処理します。

19.2.4 AmxNodeの使用方法

表19-4に、カスタムUIコンポーネントの作成に使用できるAmxNode APIを示します。

表19-4 AmxNode API

文字列

関数名

パラメータ

説明

String

getId

なし

このAmxNodeの一意の識別子を取得します。この値はルートDOM要素のIDに寄与します。

adf.mf.api.amx.AmxTag

getTag

なし

このAmxNodeを作成したAmxTagを取得します。

adf.mf.api.amx.TypeHandler

getTypeHandler

なし

このAmxNodeに関連付けられたTypeHandlerオブジェクトを取得します。

void

setClientState

Object payloadJsonObject

指定されたAmxNode IDのクライアント状態を格納または置換します。

タイプ・ハンドラは、状態変更が発生するたびにこの関数をコールする必要があります(たとえば、ある状態をキャッシュしておき、ユーザーが新しいページに移動してから戻ってきたときに、スクロール位置のように復元できるようにする必要があります)。つまり、状態変更の発生を常に検出できるとはかぎらないため、ビューが破棄される直前にコンポーネントの状態を更新する必要がある場合があります。考慮する必要があるシナリオとして次の2つが考えられます。

1. refresh: (同じビュー内の)DOM構造部分の再描画用。

2. preDestroy: 新しいビューに移動し、後で戻ったときのため。

payloadJsonObjectは、このビュー・インスタンスのライフタイム用に格納するクライアント状態データです。

Object

getClientState

なし

このビュー・インスタンス時にsetClientState関数を介して以前に格納されたpayloadJsonObjectを取得します(取得できない場合はundefined)。

void

setVolatileState

Object payloadJsonObject

指定されたAmxNode IDのクライアント状態を格納または置換します。タイプ・ハンドラは、揮発状態変更が発生するたびに、この関数をコールする必要があります(たとえば、新しいMAF AMXページへの移動時に忘れられたが、コンポーネントの再描画時に備えて保持しておく必要があるものなどです)。

payloadJsonObjectは、ナビゲーションが発生するまで格納する揮発状態データです。

Object

getVolatileState

なし

最後のナビゲーション以降、setVolatileState関数を介して以前に格納されたpayloadJsonObjectを取得します(取得できない場合はundefined)。

Object

getConverter

なし

適用可能な場合、このAmxNodeのコンバータを取得します。

void

setConverter

Object converter

このAmxNodeのコンバータを設定します。

String

storeModifyableEl

String nameOfTheAttribute

属性に関して、EL値をモデルに設定するために使用できるEL式を作成して格納します。

この値は状況非依存で、値を設定するためにいつでも使用できます。一般的な用途は、ユーザーとの対話に基づいて値を設定することです。

この関数は、タイプ・ハンドラによってコールされる場合があります。

サブジェクト属性がEL値にバインドされていない場合は、nullを返します。

Object

getStampKey

なし

AmxNodeのスタンプ・キーを取得します。スタンプ・キーは、反復コンテナの内部で生成されたAmxNodeインスタンスを特定します。

これは、親AmxNodeによって提供されます。スタンプ・キーを使用するタグの例として、amx:iteratorタグがあります。

AmxNodeがスタンプ設定されていない場合は、nullを返します。

Array<String>

getDefinedAttributeNames

なし

このノードに定義された属性名のリストを取得します。

Object

getAttribute

String name

指定された名前の属性の属性値を取得します。

戻り値はnullである可能性があります。

属性が設定されていない、またはまだロードされていない場合は、undefinedを返します。

void

setAttributeResolvedValue

String name、

Object value

タイプ・ハンドラまたはMAFが属性の属性値をAmxNodeに格納するために使用されます。

この関数では、モデルは更新されません。

void

setAttribute

String name、

String value

モデルの属性の値を設定します。

この値は、EL値を更新するためにJava側に送信されます。AmxNodeの値はこのコールでは更新されません。かわりに、データ変更イベントがAmxNodeを更新することが想定されます。

Boolean

isAttributeDefined

String name

属性がユーザーによって定義されているかどうかをチェックします。

adf.mf.api.amx.AmxNode

getParent

なし

最上位の場合は、親AmxNodeまたはnullを取得します。

void

addChild

adf.mf.api.amx.AmxNode child、

String facetName

このAmxNodeに子AmxNodeを追加します。

子がファセットに属していない場合、facetNameはnullになります。

Boolean

removeChild

adf.mf.api.amx.AmxNode child

このAmxNodeから子AmxNodeを削除します。

子は階層から削除されますが、そのDOMは削除されないことに注意してください。DOMの削除は、コール元の責任です。

これにより、タイプ・ハンドラは、DOMの置換時にアニメーションやその他の遷移を処理できます。

子が検出されて削除されたかどうかを返します。

Boolean

replaceChild

adf.mf.api.amx.AmxNode oldChild、

adf.mf.api.amx.AmxNode newChild

既存の子を別の子に置換します。

古いものが検出されて置換されたかどうかを返します。

Array<adf.mf.api.amx.AmxNode>

getChildren

String facetName、

Object stampKey

子AmxNodeを取得します。

これら2つのパラメータはオプションです。facetNameには、非ファセットの子を取得するためにnullを指定できます。

子が存在しないか、または指定された修飾子の子が存在しない場合は、空の配列を返します。

Map<String, Array<adf.mf.api.amx.AmxNode>>

getFacets

Object stampKey

AmxNodeのすべてのファセットを取得します。

stampKeyはオプションで、指定された場合は、指定されたスタンプ・キーのファセットAmxNodeインスタンスを取得します。

Boolean

visit

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

このAmxNodeから開始するツリー・アクセスを実行します。

visitCallback関数は、引数としてvisitContextおよびAmxNodeを受け入れる必要があります。

アクセスが完了し、続行する必要がないかどうかを返します。

Boolean

visitChildren

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

このAmxNodeの子から開始するツリー・アクセスを実行します。

visitCallback関数は、引数としてvisitContextおよびAmxNodeを受け入れる必要があります。

アクセスが完了し、続行する必要がないかどうかを返します。

Boolean

visitStampedChildren

Object stampKey、

Array<String> facetNamesToInclude、

Function filterCallback、

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

カスタムvisitChildren関数内から子AmxNodeにアクセスするよう子にスタンプ設定するタイプ・ハンドラ用の便利な関数。

facetNamesToIncludeが空の場合、このスタンプのファセットは処理されません。facetNamesToIncludeがnullの場合、このスタンプのすべてのファセットが処理されます。

filterCallbackにnullを指定できます。filterCallbackは、true (子の作成にタグを使用)またはfalse (タグが処理されない)のBooleanを返す必要があります。

visitCallbackは、引数としてvisitContextおよびAmxNodeを受け入れる必要があります。

アクセスが完了し、続行する必要がないかどうかを返します。

Array<adf.mf.api.amx.AmxNode>

getRenderedChildren

String facetName、

Object stampKey

AmxNodeのレンダリングされた子を取得します。

facetNameは、レンダリングされた子の取得元となるファセットを示し、非ファセットの子の場合はnullになります。

stampKeyが指定されている場合は、指定されたスタンプ・キーの子AmxNodeインスタンスを取得します。

指定されたスタンプ・キーでレンダリングされる子を返します。フラット化できる(フラット化可能な)あらゆるコンポーネントをフラット化し、レンダリングされないコンポーネントは返しません。

Boolean

isFlattenable

なし

AmxNodeがフラット化可能であるかどうかを決定します。

フラット化されたAmxNodeにはレンダリング関連の動作が含まれていない可能性があること、つまり、フラット化されたAmxNodeのタイプ・ハンドラは子の作成およびアクセスのみを制御でき、レンダリングには影響しないことに注意してください。

adf.mf.api.amx.AmxNodeStates

getState

なし

AmxNodeの現在の状態を(adf.mf.api.amx.AmxNodeStatesの定数値として)取得します。

void

setState

state

AmxNodeのadf.mf.api.amx.AmxNodeStates状態を移行します。MAFまたはAmxNodeのタイプ・ハンドラによってのみコールされる必要があります。

HTMLElement

render

なし

AmxNodeをレンダリングします。

レンダリングされたルート要素、またはnull (子がレンダリングされない場合、またはこのAmxNodeのタイプ・ハンドラがない場合)を返します。

Array<HTMLElement>

renderDescendants

String facetName、

Object key

このAmxNodeのサブノードをレンダリングします(適用可能な場合、最も近い子孫にフラット化します)。

facetNameがnullでない場合は、ファセットの子をレンダリングします。facetNameがnullの場合は、非ファセットの子がレンダリングされます。

オプションのキーが、そのスタンプ・キーの子AmxNodeインスタンスのレンダリングに使用されます。

各subNodeのルート要素の配列を返します。

void

rerender

なし

AmxNodeを再レンダリングします。

Boolean

isRendered

なし

AmxNodeの状態をチェックして、レンダリングする必要があるかどうかを確認します。

AmxNodeは、ABLE_TO_RENDER、RENDEREDまたはPARTIALLY_RENDERED状態である場合、レンダリング可能であるとみなされます。

void

refresh

adf.mf.api.amx.AmxAttributeChange attributeChanges、

adf.mf.api.amx.AmxDescendentChanges descendentChanges

AmxNodeのDOMをリフレッシュします。

このメソッドは、updateChildrenメソッドの後にコールされ、変更に応答してタイプ・ハンドラのDOMを更新する必要があるタイプ・ハンドラによって実装される必要があります。

void

createStampedChildren

Object stampKey、

Array<String> facetNamesToInclude、

Function filterCallback

カスタムcreateChildrenNodes関数内から子AmxNodeインスタンスを作成するよう子にスタンプ設定するタイプ・ハンドラ用の便利な関数。

この関数では、任意のUIタグの子が作成されます。

facetNamesToIncludeが空の場合、このスタンプのファセットは処理されません。facetNamesToIncludeがnullの場合、すべてのファセットが処理されます。facetNamesToIncludeでnull値が配列内に含まれる場合、非ファセット・タグの子が作成されます。

filterCallbackは、作成された子をフィルタ処理するオプションの関数です。filterCallback関数は、AmxNode、stampKey、子タグおよびファセット名(または、非ファセットの場合はnull)を設定して呼び出されます。filterCallback関数はbooleanを返す必要があります。trueの場合、タグを使用して子が作成され、falseの場合、タグは処理されません。

19.2.5 AmxTagの使用方法

表19-5に、カスタムUIコンポーネントの作成に使用できるAmxTag APIを示します。

表19-5

戻り型

関数名

パラメータ

説明

String

getNamespace

なし

タグのXML名前空間URIを取得します。

String

getNsPrefixedName

なし

(ローカルxmlns接頭辞ではなく)名前空間をその接頭辞として含むタグ名を返します。

これは、"http://xmlns.example.com/custom:custom"などの完全なXML名です。

String

getName

なし

タグ名を取得します。

これは、接頭辞がないローカルXMLタグ名です。

adf.mf.api.amx.AmxTag

getParent

なし

親タグ、またはnull (最上位タグである場合)を取得します。

String

getTextContent

なし

タグのテキスト・コンテンツを返します。

Array<adf.mf.api.amx.AmxTag>

findTags

String namespace、

String tagName

指定された名前空間とタグ名を使用して、タグのタグ階層を再帰的に検索します。

一致した場合は現在のタグを返します。

Array<adf.mf.api.amx.AmxTag>

getChildren

String namespace、

String tagName

タグの子を取得します。

子の名前空間およびタグ名のオプションのフィルタリングを提供します。名前空間がnullの場合は、すべての子が返されます。tagNameがnullの場合、子はタグ名でフィルタリングされません。

Array<adf.mf.api.amx.AmxTag>

getChildrenFacetTags

なし

すべての子ファセット・タグを取得します。

この関数の目的は、AmxNodeプロセスの作成を支援することです。

adf.mf.api.amx.AmxTag

getChildFacetTag

String name

指定された名前のファセット・タグを取得します。

この関数の目的は、ファセットの存在によりタイプ・ハンドラの動作が変更される場合のコードを支援することです。

ファセットが見つからない場合はnullを返します。

Array<adf.mf.api.amx.AmxTag>

getChildrenUITags

なし

UIタグであるすべての子タグを取得します。

この関数の目的は、AmxNodeプロセスの作成を支援することです。

この関数では、ファセット・タグは返されません。

Array<String>

getAttributeNames

なし

タグで指定されている属性のすべての属性名を取得します。

Boolean

isAttributeElBound

String name

指定された属性が(静的値ではなく) EL式にバインドされているかどうかを決定します。

String

getAttribute

String name

指定された名前の属性の属性値(EL文字列である場合があります)を取得します。

属性が指定されていない場合はundefinedを返します。

Map<String, String>

getAttributes

なし

属性およびその値のキー/値ペア・マップを取得します。

Boolean

isUITag

なし

ノードがタイプ・ハンドラを持つUIタグであるかどうかを決定し、コンテンツをレンダリングします。

Object{name:string, children:Array<adf.mf.api.amx.AmxTag>}

getFacet

なし

このファセットの子のタグ、およびこのタグがファセット・タグである場合はファセットの名前を取得します。

これは、AmxNodeツリーを構築する場合に便利な関数です。

そのファセットの名前、およびファセットの子タグを持つオブジェクトを返します。タグがamx:facetタグでない場合は、nullを返します。

adf.mf.api.amx.AmxNode

buildAmxNode

adf.mf.api.amx.AmxNode parentNode、

Object stampKey

スタンプIDを設定してこのタグのAmxNodeの新しいインスタンスを作成します。

タグがファセット・タグである場合、タグは子タグのAmxNodeを作成します。

この関数では、AmxNodeは初期化されません。かわりに、初期化されていないAmxNode、または非UIタグの場合はnullを返します。

adf.mf.api.amx.TypeHandler

getTypeHandler

なし

このタグのタイプ・ハンドラを取得します。

19.2.6 VisitContextの使用方法

表19-6に、カスタムUIコンポーネントの作成時に使用できるVisitContext APIを示します。

表19-6 VisitContext API

戻り型

関数名

パラメータ

説明

Boolean

isVisitAll

なし

すべてのノードがアクセスされるかどうかを決定します。

Array<adf.mf.api.amx.AmxNode>

getNodesToWalk

なし

アクセス時に移動する必要があるノードを取得します。

このリストには、アクセスされる(コールバックが呼び出される)必要があるノードは必ずしも含まれていません。

Array<adf.mf.api.amx.AmxNode>

getNodesToVisit

なし

アクセスするノードのリストを取得します。

Array<adf.mf.api.amx.AmxNode>

getChildrenToWalk

adf.mf.api.amx.AmxNode parentAmxNode

指定された親AmxNodeから移動する必要がある子AmxNodeインスタンス(ある場合はファセットを含む)を決定します。

タイプ・ハンドラに対して、すべての子に移動するわけではない場合に、子への移動方法の最適化を許可します。

nullを返す場合があります。

19.2.7 AmxAttributeChangeの使用方法

表19-7に、カスタムUIコンポーネントの作成時に使用できるAmxAttributeChange APIを示します。

表19-7 AmxAttributeChange API

戻り型

関数名

パラメータ

説明

Array<String>

getChangedAttributeNames

なし

現在の変更時に影響を受けた属性の名前を取得します。

Boolean

isCollectionChange

String name

属性の変更がコレクション変更であるかどうかを決定します。

adf.mf.api.amx.AmxCollectionChange

getCollectionChange

String name

属性のコレクション・モデル変更情報を取得します。使用可能な変更オブジェクトがない場合はnullを返します。

String

getOldValue

String name

変更が行われる前に、属性の値を取得します。

Boolean

hasChanged

String name

指定された名前の属性が変更されたかどうかを決定します。

Number

getSize

なし

属性の変更数を取得します。

19.2.8 AmxDescendentChangesの使用方法

表19-8に、カスタムUIコンポーネントの作成時に使用できるAmxAttributeChange APIを示します。

表19-8 AmxDescendentChanges API

戻り型

関数名

パラメータ

説明

Array<adf.mf.api.amx.AmxNode>

getAffectedNodes

なし

レンダリング前の変更済の子孫AmxNodeインスタンスを取得します。

adf.mf.api.amx.AmxAttributeChange

getChanges

adf.mf.api.amx.AmxNode amxNode

指定されたAmxNodeの変更を取得します。

adf.mf.api.amx.AmxNodeStates

getPreviousNodeState

adf.mf.api.amx.AmxNode amxNode

変更が適用される前の子孫AmxNodeの状態を取得します。

19.2.9 AmxCollectionChangeの使用方法

表19-9に、カスタムUIコンポーネントの作成時に使用できるAmxCollectionChange APIを示します。

表19-9 AmxCollectionChange API

戻り型

関数名

パラメータ

説明

Boolean

isItemized

なし

コレクションに対する変更を項目化できるかどうか、つまりそのコレクションのキーと要素が特定されることで、TypeHandlerが最初からリスト全体を再レンダリングするのではなく、適切な項目だけを更新できるようにするかどうかを決定します。

Array<String>

getCreatedKeys

なし

作成されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getDeletedKeys

なし

削除されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getUpdatedKeys

なし

更新されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getDirtiedKeys

なし

ダーティにされたキーの配列、または変更を項目化できない場合はnullを取得します。

19.2.10 AmxNodeChangeResultの使用方法

表19-10に、カスタムUIコンポーネントの作成時に使用できるAmxNodeChangeResult APIを示します。

表19-10 AmxNodeChangeResult API

メンバー

説明

adf.mf.api.amx.AmxNodeChangeResult["NONE"]

レンダリング前の子孫AmxNodeでの属性変更に対してアクションを実行しません。

adf.mf.api.amx.AmxNodeChangeResult["REFRESH"]

属性およびその子AmxNodeインスタンスがタイプ・ハンドラによって更新済で、DOMはタイプ・ハンドラのrefresh関数によって更新されます。

adf.mf.api.amx.AmxNodeChangeResult["RERENDER"]

AmxNodeおよびその子AmxNodeインスタンスがタイプ・ハンドラによって更新済ですが、DOMは、AmxNode階層を変更する必要がないため、refresh関数がタイプ・ハンドラでコールされない場合にのみ再作成する必要があります。

adf.mf.api.amx.AmxNodeChangeResult["REPLACE"]

タイプ・ハンドラは変更を処理できません。DOMおよびAmxNode階層が再作成される必要があります。

この値は、タイプ・ハンドラのupdateChildrenメソッドからのみ返され、getDescendentChangeActionメソッドからは返されません。

19.2.11 AmxNodeStatesの使用方法

表19-11に、カスタムUIコンポーネントの作成時に使用できるAmxNodeStates APIを示します。

表19-11 AmxNodeStates API

メンバー

説明

adf.mf.api.amx.AmxNodeStates["INITIAL"]

初期状態。AmxNodeが作成されていますが、移入されていません。

adf.mf.api.amx.AmxNodeStates["WAITING_ON_EL_EVALUATION"]

レンダリングに必要なELベースの属性がまだ完全にロードされていません。

adf.mf.api.amx.AmxNodeStates["ABLE_TO_RENDER"]

EL属性がロードされていますが、AmxNodeはまだレンダリングされていません。

adf.mf.api.amx.AmxNodeStates["PARTIALLY_RENDERED"]

ELはまだ完全にロードされていませんが、AmxNodeはそれ自体を部分的にレンダリングしています(今後使用するために予約されています)。

adf.mf.api.amx.AmxNodeStates["RENDERED"]

AmxNodeは完全にレンダリングされています。

adf.mf.api.amx.AmxNodeStates["UNRENDERED"]

AmxNodeはレンダリングされません。

19.2.12 AmxNodeUpdateArgumentsの使用方法

表19-12に、カスタムUIコンポーネントの作成時に使用できるAmxNodeUpdateArgumentsのAPIをリストします。

表19-12 AmxNodeUpdateArguments API

戻り型

関数名

パラメータ

説明

Array<adf.mf.api.amx.AmxNode>

getAffectedNodes

なし

影響を受けるAmxNodeインスタンスの配列を取得します。

Map<String,Boolean>

getAffectedAttributes

String amxNodeId

指定されたAmxNode IDの影響を受ける属性を表すオブジェクトを取得します。

Map<String,adf.mf.api.amx.AmxCollectionChange>

getCollectionChanges

String amxNodeId

指定されたAmxNodeおよびプロパティのコレクション変更を取得します。

返されるマップは属性名によってキー設定されます。

AmxNodeに変更がない場合はundefinedを返します。

void

setAffectedAttribute

adf.mf.api.amx.AmxNode amxNode、

String attributeName

影響を受けたとしてAmxNodeの属性をマークします。

void

setCollectionChanges

String amxNodeId、

String attributeName、

adf.mf.api.amx.AmxCollectionChange collectionChanges

指定されたAmxNodeの属性のコレクション変更を設定します。

19.3 カスタム・コンポーネントの作成

JavaScriptおよびMAF APIを使用して、カスタムUIコンポーネントを作成できます。このコンポーネントのJavaScriptファイルは、アプリケーション機能レベル包含を使用して、プロジェクトに追加できます。カスタム・タグ・ライブラリを追加すると、タグ・ライブラリの「コンポーネント」ウィンドウのリストに入力され、このライブラリが選択された場合は、カスタム・コンポーネントが「コンポーネント」ウィンドウで使用可能になり、その属性が「プロパティ」ウィンドウに表示されます。

始める前に

第19.2項「MAF APIを使用したカスタム・コンポーネントの作成」で説明されているAPIについて理解しておいてください。

カスタム・コンポーネントを作成するには、次の手順を実行します。

1. adf.mf.api.amx.TypeHandler.register API (表19-1「静的API」およびこの手順の後の例を参照)を使用して、タグ名前空間および1つ以上の一連のタイプ・ハンドラを登録するJavaScriptファイルを生成します。

2. 各タイプ・ハンドラで、レンダリング・メンバー関数を実装します。

3. オプションで、他の関数を実装します。

4. 1つ以上のJavaScriptおよびCSSファイルをMAF AMXアプリケーション機能に添付します。たとえば、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルに配置されている、次のサンプル・アプリケーションを参照してください。

- CompGalleryという名前のMAFサンプル・アプリケーションに含まれるcustom.jsおよびcustom.cssファイル。

- WorkBetterサンプル・アプリケーションにはカスタム検索コンポーネントが含まれています。

または、デザインタイム・パッケージングを実行できます。

5. いずれかのカスタム・コンポーネントを使用する各MAF AMXページで、view要素のxmlnsエントリを追加します。

xmlns:custom="http://xmlns.example.com/custom"

次の例は、カスタム・コンポーネントを宣言するJavaScriptファイルを示しています。

(function() {
// TypeHandler for custom "x" elements
var x = adf.mf.api.amx.TypeHandler.register("http://xmlns.example.com/custom",
"x");
x.prototype.render = function(amxNode) {
var rootElement = document.createElement("div");
rootElement.appendChild(document.createTextNode("Hello World"));
return rootElement;
};

// TypeHandler for custom "y" elements
var y = adf.mf.api.amx.TypeHandler.register("http://xmlns.example.com/custom",
"y");

y.prototype.render = function(amxNode) {
var rootElement = document.createElement("div");
rootElement.appendChild(document.createTextNode("Goodbye World"));
return rootElement;
};

})();

カスタムUIコンポーネントの作成方法の例については、CompGalleryという名前のMAFサンプル・アプリケーションに含まれるcustom.amx、customOther.amx、exampleEvents.amxおよびexampleList.amxの各ファイルを参照してください。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

20 リモートURLを使用したアプリケーション機能コンテンツの実装

この章では、リモートURLからのコンテンツを使用するアプリケーション機能をデバイス・サービスにアクセス可能(またはアクセス不可)にする方法、ナビゲーション・バーを有効にする方法、およびMAFアプリケーションを起動する方法について説明します。

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

- 第20.1項「リモートURLアプリケーションの概要」

- 第20.2項「アプリケーション・コンポーネントのホワイトリストの作成」

- 第20.3項「リモートURLページでのブラウザ・ナビゲーション・バーの有効化」

- 第20.4項「カスタムURLスキームを使用したMAFアプリケーションの起動」

20.1 リモートURLアプリケーションの概要

図20-1に示すように、maf-feature.xmlファイルの概要エディタにあるアプリケーション機能のコンテンツ・タイプをリモートURLとして構成することで、指定されたURLから供給されるブラウザベースのアプリケーションを作成します。このようなサーバー・ホスト型のアプリケーションは、偶発的な使用を目的としている点およびデバイスのメモリーまたはサービス(カメラ、コンタクト先、GPSなど)に直接アクセスできない点で、MAF AMX、ローカルHTML、またはObjective-Cなどのプラットフォーム固有言語で記述されたクライアント・アプリケーションとは異なります。かわりに、これらのやり取りはデバイスのブラウザの機能によって異なります。リモートURLコンテンツの構成の詳細は、第5.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」を参照してください。

図20-1 リモートURLコンテンツの構成

20.1.1 ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化

リモートで供給されるコンテンツのセキュリティを確保するために、MAFはホワイトリスト(GPS、カメラ、ファイル・システムなどの様々なデバイス・サービスにアクセスするためにアプリケーションのWebビュー内で開いているURLのレジストリ)の概念をサポートしています。Webページがホワイトリストに含まれていない(つまりホワイトリストされていない)場合は、そのかわりに、MAFのApache Cordova実装によってデバイス・ブラウザ(Safariなど)でWebページが開かれます。ホワイトリストがない場合、リモートWebページはMAF Webビュー内で開くことができないため、埋込みデバイス機能へのアクセスが制限されます。図20-2に示すように、MAF Webビュー内で開いているURLはアプリケーション機能として示されます。

図20-2 デバイス・ブラウザおよびMAF Webビュー内のURL

20.1.2 リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化

MAFのWebビュー内で開かれるリモートURLアプリケーションは、Apache Cordova JavaScript APIを使用してデバイス機能にアクセスし、MAF JavaScript APIを使用してMAFコンテナ・サービスにアクセスします。このアクセスを可能にするには、base.jsライブラリを参照するJavaScriptの<script>タグ使用します。

サーバーによってレンダリングされたWebアプリケーション内からMAFまたはCordova JavaScript APIにアクセスするには(たとえば、EL式の取得と設定、アプリケーションに関する情報の取得、写真の撮影、コンタクト先へのアクセスなど)、base.jsのインクルード時に仮想パス/~maf.device~/を使用して、ブラウザがリクエストをリモート・サーバーではなくMAFリソースに対するものとして識別できるようにする必要があります。このアプローチはリモートとローカルの両方のHTMLページで機能するので、(提供元にかかわらず) base.jsをHTML機能にインクルードする方法として最適です。次の例は、デバイスのHTMLページまたはリモートのHTMLページからbase.jsをインクルードする方法を示しています。

<html>
<head>
<script src="/~maf.device~/www/js/base.js"></script>
...

コンテナ・コードでは、リクエストされたURLの/~maf.device~/を読み取ると、そのURLをローカルに解決してネイティブ・リクエストとして処理します。次に、MAFがコンテナ・コード内のファイル・システムからファイルを読み取って、ローカル・ファイル・コンテンツをWebビューに送信します。詳細は、第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」を参照してください。

20.1.3 ホワイトリストされたドメインによるデバイス機能へのアクセス方法

デフォルトでは、connections.xmlファイルに定義されているドメイン(モバイル・アプリケーションに定義されているすべての接続のリポジトリ)は、自動的にホワイトリストされます。リモートURLコンテンツのこれらのドメインは、図20-3に示すように、「URL接続の作成」ダイアログを使用して作成されます。MAFでは、各接続文字列からドメインを解析して、これらのドメインをホワイトリストに追加します。

図20-3 リモートURLアプリケーション機能のコンテンツを取得するための接続の作成

次に、JDeveloperは、「アプリケーション・リソース」パネルにあるconnections.xmlファイルに接続情報を入力し、さらに接続リソースも作成します。

maf-application.xmlファイルにホワイトリストされたドメインを構成することで、MAFがconnections.xmlファイルから含めるドメインの他に、MAF Webビューで開くリモートURLコンテンツを有効化(または制限)できます。

20.1.4 13.1.4 ホワイトリストを作成(またはドメインを制限)する方法

図20-4に示すとおり、maf-application.xmlの「セキュリティ」ページでホワイトリストを構成します。

図20-4 ホワイトリストの構成

始める前に

モバイル・アプリケーションで構成された一部のURLが他のドメインで開かれる可能性があることに注意してください。

ホワイトリストを作成するには:

1. maf-application.xmlファイルを開いて、「セキュリティ」タブを選択します。

2. 「リモートURL Whitelist」セクションで「追加」をクリックし、アプリケーション機能のWebビュー内からコールできるドメインを入力します。これらのドメインには、ドメイン名にアスタリスク( * )を含めることができますが、アスタリスクを最後に置くことはできません。たとえば、*.example.comは有効ですが、*.example.*は無効です。ドメイン名の前にhttp://またはhttps://を含めることが必要な場合があります。

注意:
ワイルドカードのみを入力すると、Webビューではすべてのドメインをリクエストできるため、セキュリティ上のリスクを招く可能性があります。また、すべてのドメインをホワイトリストに追加すると、それらのすべてがWebビュー内で開けるのみではなく、それらのすべてがデバイスにアクセスできるようになります(そのように意図しているかどうかは無関係に)。

20.1.5 ホワイトリストにドメインを追加する場合の処理

ドメインを追加すると、JDeveloperでは、次の例に示すとおり<adfmf:remoteURLWhiteList>要素が更新されます。

...
<adfmf:remoteURLWhiteList>
<adfmf:domain id="domain_1">*.oracle.com</adfmf:domain>
<adfmf:domain id="domain_2">http://*.example.com</adfmf:domain>
</adfmf:remoteURLWhiteList>
...

20.1.6 リモートURLに関する必知事項

一部のURLは、ホワイトリスト・ドメインの一部ではない可能性のあるURLにリダイレクトされます。これらのURLは、アプリケーションのWebビューよりもデバイス・ブラウザで開かれる可能性があります。たとえば、www.oracle.com (<adfmf:domain>www.oracle.com<adfmf:domain>)をホワイトリストした場合、MAFはこのサイトのモバイル・バージョン(www.m.oracle.com)をデバイス・ブラウザに開きますが、これはモバイル・バージョンがホワイトリストを通過しないためです。図20-5は、ホワイトリストに追加されていないWebページをデバイス・ブラウザ内で開いたものを示しています。

図20-5 MAF Webビューではなくデバイス・ブラウザで開かれたWebページ

www.oracle.comをアプリケーションWebビューに開けるようにするには、第20.1.5項「ホワイトリストにドメインを追加する場合の処理」に示すように*.oracle.comまたはwww.oracle.comを指定する必要があります。

MAFのホワイトリストはドメインレベルのため、アプリケーション機能のWebビューで開くことをホワイトリストされたドメイン内の個々のページについて制限することはできず、すべてのページが許可されます。

20.2 アプリケーション・コンポーネントのホワイトリストの作成

別のドメインを指すURLへのリンクを含むページにホワイトリストを使用します。このようなページは、MAF Webビューではなくデバイス・ブラウザで別途開かれます。このような場合、次の例の<goLink2>にあるurl属性など、アプリケーションの外部を指す<amx:goLink>コンポーネントのurl属性を使用して、アンカー・タグまたは<amx:goLink>コンポーネントを作成できます。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:panelGroupLayout id="panelGroupLayout1">
<amx:goLink text="This opens in the device browser"
id="golink1"
url="http://www.example.com"
shortDesc="Opens in device browser"/>
<amx:goLink text="This opens in the web view"
id="golink2"
url="http://www.example2.com"
shortDesc="Accesses device services"/>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

また、第13.3項「UIコンポーネントの作成と使用方法」も参照してください。

20.3 リモートURLページでのブラウザ・ナビゲーション・バーの有効化

MAFでは、図20-6に示すように、MAF Webビュー内で開く、リモートで供給されるWebコンテンツとして実装されるアプリケーション機能に対して、戻る、進むおよびリフレッシュの各アクション用のボタンが付いたナビゲーション・バーを追加できます。進むまたは戻るのいずれかの移動が不可能な場合は、進むと戻るのボタンが無効になります。

注意:
戻るボタンは、Androidデバイスでは無効になります。

図20-6 ナビゲーション・ボタンとリフレッシュ・ボタンを表示するリモートWebページ

20.3.1 リモートURLアプリケーション機能へのナビゲーション・バーの追加方法

maf-feature.xmlファイルの概要エディタの「コンテンツ」タブで、ユーザーがリモート・コンテンツを移動またはリフレッシュできるようにします。

始める前に

第5.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」の説明に従って、まず「リモートURL」を選択し、次にホスト・サーバーへの接続を作成することにより、リモートでホストされるアプリケーションから配信されるアプリケーション機能のコンテンツを指定します。

ドメインがホワイトリストに含まれていることを確認します。

ナビゲーション・バーを有効にするには:

1. maf-feature.xmlファイルの「機能」表にリストされている「リモートURL」アプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 図20-7に示すとおり、「ブラウザ・ナビゲーション・ボタンの表示」を選択します。

図20-7 ナビゲーション・オプションの選択

20.3.2 リモートURLアプリケーション機能のブラウザ・ナビゲーション・ボタンを有効にする場合の処理

JDeveloperでは、showNavButtonsと呼ばれる属性でadfmf:remoteURL要素を更新します。次の例に示すとおり、ここではtrueに設定されています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf">
<adfmf:feature id="oraclemobile" name="oraclemobile">
<adfmf:content id="oraclemobile.1">
<adfmf:remoteURL connection="connection1"
showNavButtons="true"/>
</adfmf:content>
</adfmf:feature>
</adfmf:features>

アプリケーションをデプロイすると、図20-8に示すとおり、MAFでは、進む、戻るおよびリフレッシュの各ボタンがリモートURLアプリケーション機能のホームページから移動されるWebページに適用されます。

Figure 20-8 リモートURLアプリケーション機能での移動

20.4 カスタムURLスキームを使用したMAFアプリケーションの起動

カスタムURLスキームを使用して、他のアプリケーションからネイティブ・アプリケーションを起動できます。

別のアプリケーションからMAFモバイル・アプリケーションを起動するには、次の手順を実行します。

1. カスタムURLスキームを登録します。このURLスキームは、maf-application.xmlファイルの概要エディタで、「URLスキーム」フィールドを使用して構成します。このスキームを持つURLを使用すれば、MAFモバイル・アプリケーションを起動し、そのアプリケーションにデータを渡すことができます。

2. アプリケーション・コントローラ・プロジェクトで、URLを通知されるカスタムURLイベント・リスナー・クラス(CustomURLEventListenerなど)を作成します。このクラスには、イベント・リスナーを定義するoracle.adfmf.framework.event.EventListenerインタフェースを実装する必要があります。oracle.adfmf.framework.event.EventListenerインタフェースの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。
MAFモバイル・アプリケーションの起動に使用されるURLで呼び出されるonMessage(Event e)メソッドをオーバーライドおよび実装します。Eventオブジェクトを使用して、URLペイロードおよびアプリケーションの状態に関する有用な情報を取得できます。URLペイロードを取得するには、Event.getPayloadメソッドを使用します。URLイベント発生時にアプリケーションの状態を取得するには、Event.getApplicationStateメソッドを使用します。詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスのEventクラスを参照してください。

3. アプリケーション・ライフサイクル・イベント・リスナー(ALCL)クラスを登録します。
詳細は、第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

ALCLクラスのstartメソッド内の、カスタムURLイベントのソースを表すEventSourceオブジェクトを取得します。

EventSource openURLEventSource = EventSourceFactory.getEventSource(EventSourceFactory.OPEN_URL_EVENT_SOURCE_NAME);

カスタムURLイベント・リスナー・クラスのオブジェクトを作成し、イベント・ソースに追加します。

openURLEventSource.addListener(new CustomURLEventListener());

MAFアプリケーションでは、次の方法を使用して別のネイティブ・アプリケーションを起動することができます。

- ネイティブ・アプリケーションによって登録されたカスタムURLスキームで始まるURLを持つMAF AMXページでamx:goLinkを使用します。次に例を示します。

<amx:goLink text="Open App" id="gl1" url="mycustomurlscheme://somedata"/>

- ネイティブ・アプリケーションによって登録されたカスタムURLスキームで始まるhref属性値を持つHTMLページで、HTMLリンク要素を使用します。次に例を示します。

<a href="mycustomurlscheme://somedata">Open App</a>

21 ユーザー・プリファレンスの有効化

この章では、アプリケーションレベルとアプリケーション機能レベルの両方のユーザー・プリファレンス・ページを作成する方法について説明します。

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

- 第21.1項「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」

- 第21.2項「アプリケーション機能のユーザー・プリファレンス・ページの作成」

- 第21.3項「ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法」

- 第21.4項「プラットフォームによる表示の差異」

21.1 モバイル・アプリケーションのユーザー・プリファレンス・ページの作成

プリファレンスによって、エンド・ユーザーが構成可能な設定を追加できます。maf-application.xmlおよびmaf-feature.xmlの両方のファイル内で、<adfmf:preferences>要素を使用してユーザー・プリファレンス・ページを定義します。また、<adfmf:preferences>要素を使用して、各アプリケーション機能内でユーザーが管理するプリファレンスを作成します。

次の例に示すとおり、<adfmf:preferenceGroup>と呼ばれる<adfmf:preferences>の子要素とその子要素によってユーザー・プリファレンスを定義し、これには、テキスト文字列、ドロップダウン・メニューや、このケースのようにアプリケーション設定の追加オプションをユーザーに提示する子ページなど、様々な形でオプションを提示するページを作成します。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
name="MobileApplication"
id="com.company.MobileApplication"
appControllerFolder="ApplicationController"
version="1"
vendor="oracle"
listener-class="application.LifeCycleListenerImpl">
<adfmf:description>This app created by Mobile Application Framework</adfmf:description>
<adfmf:featureReference id="PROD"/>
<adfmf:featureReference id="HCM"/>
<adfmf:featureReference id="Customers"/>
<adfmf:preferences>
<adfmf:preferenceGroup id="a" label="Prefs Group A">
<adfmf:preferenceBoolean id="a1_sound" label="Sound Effects"/>
<adfmf:preferenceNumber id="a2_retries" label="Retries" default="3"/>
<adfmf:preferenceList id="a3_background" label="Background" default="3">
<adfmf:preferenceValue name="None" value="0" id="pv4"/>
<adfmf:preferenceValue name="Field" value="1" id="pv1"/>
<adfmf:preferenceValue name="Galaxy" value="2" id="pv5"/>
<adfmf:preferenceValue name="Mountain" value="3" id="pv6"/>
</adfmf:preferenceList>
<adfmf:preferenceText id="a4_name" label="Default Name"/>
<adfmf:preferencePage id="aa" label="Prefs SubGroup AA">
<adfmf:preferenceGroup id="aa_sec" label="Security">
<adfmf:preferenceBoolean id="aa_sec_useSec" label="Use Security"/>
<adfmf:preferenceNumber id="aa_sec_timeout" label="Timeout (secs)" default="120"/>
</adfmf:preferenceGroup>
</adfmf:preferencePage>
</adfmf:preferenceGroup>
<adfmf:preferenceGroup id="b" label="Prefs Group B">
<adfmf:preferenceBoolean id="b_cloudSync" label="Cloud Sync"/>
<adfmf:preferenceList id="b_dispUsage" label="Display Usage As" default="1">
<adfmf:preferenceValue name="Percent" value="1" id="pv2"/>
<adfmf:preferenceValue name="Minutes" value="2" id="pv3"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:application>

図21-1では、子ユーザー・プリファレンス・ページを開くことでそれに続くオプションを提供する方法の例を示しています。

図21-1 ユーザー・プリファレンス・ページ

プリファレンス・ページは<adfmf:preferenceGroup>要素内で定義され、次の子要素が存在します。

- <adfmf:preferencePage>: ユーザー・インタフェースに新しいページを指定します。

- <adfmf:preferenceList>: ユーザーに特定のオプション・セットを提供します。

- <adfmf:preferenceValue>: リスト要素を定義する子要素です。

- <adfmf:preferenceBoolean>: ブール設定です。

- <adfmf:preferenceText>: テキスト・プリファレンス設定です。

これらの要素とその属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

アプリケーションおよびアプリケーション機能レベルの両方のプリファレンス・ページを作成する例については、PrefDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内で次の場所にあるPublicSamples.zipファイルに置かれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

PrefDemoアプリケーションは、アプリケーションレベルの設定ページと、MAF AMXとして実装されている3つのアプリケーション機能のプリファレンス・ページで構成されています。図21-2は、通常の設定ページから起動する、PrefDemoアプリケーションの設定ページを示しています。この図では、プリファレンス設定ページをiOSの設定アプリケーションから起動しています。

図21-2 PrefDemoアプリケーションの設定ページ

図21-3で「App」、「Feature1」(これが選択されています)および「Feature 2」と表示されているアプリケーション機能のプリファレンス・ページでは、MAF AMXブール・スイッチ、入力テキストおよび出力テキストの各コンポーネントから構築されたプリファレンス・ページの例が示されており、これらのコンポーネントは、EL (式言語)を使用してアプリケーション機能やその内部に構成されている様々な<adfmf:preferences>コンポーネントにアクセスします。詳細は、第21.3項「ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法」を参照してください。

図21-3 PrefDemoアプリケーションに表示されたアプリケーション機能のプリファレンス・ページ

PrefDemoアプリケーションでは、ビュー・アクティビティとページ・リフレッシュが可能な制御フロー・ケースで構成される単一のバインド・タスク・フローによって、MAF AMXの各プリファレンス・ページが参照されます。

21.1.1 モバイル・アプリケーションレベルのプリファレンス・ページの作成方法

maf-application.xml概要エディタの「プリファレンス」ページ(図21-4を参照)では、<adfmf:preferenceGroup>内の子プリファレンス・ページ要素をネストすることでアプリケーションレベルのプリファレンス・ページ・セットを構築できます。このページでは、<adfmf:preferenceGroup>およびその子要素が同様に名付けられたオプション(「プリファレンス・ページ」、「プリファレンス・リスト」、「ブール型のプリファレンス」など)として示され、JDeveloperの「構造」ウィンドウと同様にこれらを階層(またはツリー)にアセンブルします。

図21-4 「プリファレンス・ページ」を使用したモバイル・アプリケーションレベルのプリファレンスの追加

maf-application.xmlファイルを正しく構成するには、図21-4に示す「プリファレンス」ページの「追加」ドロップダウン・リストを使用してユーザー・プリファレンス・ページを構築します。また、図21-5に示す「プリファレンス」パレットからコンポーネントをドラッグして、エディタ、「ソース」ウィンドウまたは「構造」ウィンドウのいずれかにドロップできる一方で、そのページのドロップダウン・リストには、選択されたプリファレンス要素に対して、適切な親、子または兄弟の関係を持つことができる要素のみが提示されます。たとえば、図21-4には、プリファレンス・グループ要素であるMobileApp内に挿入できるコンポーネントのみが示されています。また、このエディタでは、各プリファレンス要素に固有の属性に対して値を入力できます。

図21-5 「コンポーネント・パレット」内の「プリファレンス」

プリファレンス・ページを作成するには:

1. maf-application.xml概要エディタで「プリファレンス」をクリックします。

2. 「追加」をクリックして、親である<adfmf:preferenceGroup>要素を作成します。

3. 次の情報を「プリファレンス・グループの挿入」ダイアログ(図21-6を参照)に入力します。

図21-6 親プリファレンス・グループ要素の定義

- プリファレンス・グループ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。ユーザー・インタフェースにこのテキストを表示する方法の例は、図21-1の例を参照してください。

4. 「追加」をクリックし、「前に挿入」、「内部に挿入」、「後ろに挿入」の各オプションを使用してさらにプリファレンス・ページを定義し、XML文書が正しく構成されるようにします。

21.1.1.1 新しいユーザー・プリファレンス・ページの作成方法

プリファレンス・ページ・コンポーネントでは新しいユーザー・インタフェース・ページを作成できます。「前に挿入」、「内部に挿入」、「後ろに挿入」の各オプションを使用してプリファレンス・ページを作成します。

始める前に

プリファレンス・グループ要素を作成する必要があります。

新しいユーザー・プリファレンス・ページを作成するには:

1. maf-application.xml概要エディタの「プリファレンス」ページで「プリファレンス・グループ」要素を選択します。この例では、プリファレンス・グループはMobileAppと呼ばれています。

2. 「追加」をクリックして「プリファレンス・グループの中に挿入」→「プリファレンス・ページ」を選択します(図21-7を参照)。

図21-7 プリファレンス・ページ・コンポーネントの選択

3. 「プリファレンス・ページの挿入」ダイアログ(図21-8を参照)に次のプリファレンス・ページ属性を定義します。

- プリファレンス・ページ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-8 「プリファレンス・ページの挿入」ダイアログ

4. プリファレンス・ページを選択し、図21-9に示すとおり、「プリファレンス・ページの中に挿入」→「プリファレンス・グループ」と選択することで、子プリファレンス・グループ要素を挿入し、プリファレンス・ページの本体を作成します。子プリファレンス・グループの一意の識別子と表示名を定義すると、これにプリファレンス・リスト要素などの他の要素を移入できます(第21.1.1.2項「プリファレンス・ページを追加する場合の処理」を参照)。

図21-9 プリファレンス・グループのプリファレンス・ページへの追加

21.1.1.2 プリファレンス・ページを追加する場合の処理

概要エディタでプリファレンス・ページとその子プリファレンス・グループ・コンポーネントを定義すると、JDeveloperでは、次の例に示すように、属性を使用して<adfmf:preferencePage>が生成されます。<adfmf:preferencePage>は、親<adfmf:preferenceGroup>要素内にネストされます。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen"
label="MobileApp">
<adfmf:preferencePage id="application_version"
label="Version">
<adfmf:preferenceGroup id="version_select"
label="Select Your Version">
<adfmf:preferenceList id="edition"
label="Edition"
default="PERSONAL">
adfmf:preferenceValue name="Enterprise"
id="pv2"/>
<adfmf:preferenceValue name="Personal"
value="PERSONAL"
id="pv1"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferencePage>
</adfmf:preferences>

21.1.1.3 ユーザー・プリファレンス・リストの作成方法

プリファレンス・リスト・コンポーネントを追加してオプションのリストを作成します。

始める前に

プリファレンス・リストまたは他のすべてのリストに関連するコンポーネントの親としてプリファレンス・グループを作成する必要があります。

ユーザー・プリファレンス・リストを作成するには:

1. 「プリファレンス・グループ」または「プリファレンス・ページ」を選択して、「追加」→「内部に挿入」→「プリファレンス・リスト」の順にクリックします。例21-0には、Select Your Versionという名前のプリファレンス・グループ・コンポーネントの子としてプリファレンス・リストを追加する例が示されています。

図21-10 プリファレンス・リスト・コンポーネントのプリファレンス・グループへの追加

2. 「プリファレンス・リストの挿入」ダイアログ(図21-0を参照)を使用して次の属性を定義し、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-11 「プリファレンス・リストの挿入」ダイアログ

3. 「プリファレンス値」表(図21-12を参照)で「追加」をクリックし、アイテムのリストを定義します。プリファレンス値を選択してから「削除」をクリックすることで、この値を削除することもできます。プリファレンス値の表示順番を変更するには、プリファレンス値を選択してから上および下の矢印を使用します。
ユーザーにデフォルト設定を提供するには、「デフォルト」を選択します。第21.1.1.2項「プリファレンス・ページを追加する場合の処理」に示すように、<adfmf:preferenceList>要素内でデフォルト・ステータスは、default="ENTERPIRSE"と定義されています。

ヒント:
「追加」をクリックする他、それらをドラッグして「構造」ウィンドウまたは「ソース」ウィンドウのいずれかにドロップしても、プリファレンス値コンポーネントを追加できます。

図21-12 プリファレンス値の追加

21.1.1.4 プリファレンス・リストを作成する場合の処理

プリファレンス・リスト・コンポーネントをプリファレンス・グループに追加し、一連のプリファレンス値を定義すると、第21.1.1.2項「プリファレンス・ページを追加する場合の処理」に示すように、JDeveloperでは<adfmf:preferenceList>要素を使用して<adfmf:preferences>セクションが更新されます。

21.1.1.5 ブール型のプリファレンス・リストの作成方法

たとえば、第21.1項「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」を参照してください。

始める前に

<adfmf:preferenceBoolean>要素は<adfmf:preferenceGroup>要素内にネストされる必要があるため、まずプリファレンス・グループ・コンポーネントを階層に挿入する必要があります。

ユーザー・ブール型リストを作成するには:

1. 図21-13のGPS設定など、プリファレンス・グループ要素を選択します。

図21-13 ブール型プリファレンスのプリファレンス・グループへの追加

2. 「ブール型のプリファレンスの挿入」ダイアログ(図21-14を参照)を使用して次の属性を定義し、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-14 「ブール型のプリファレンスの挿入」ダイアログ

3. デフォルト値のfalseをそのまま使用するか、trueを選択します。

21.1.1.6 ブール型のプリファレンスを追加する場合の処理

ブール型のプリファレンスを追加してそのデフォルト値を指定した場合、次の例に示すように、JDeveloperでは、<adfmf:preferenceBoolean>要素を使用してmaf-application.xmlファイルの<adfmf:preferences>セクションが更新されます。

<adfmf:preferencePage id="gps_tracking"
label="Your_GPS_Locations">
<adfmf:preferenceGroup id="gps"
label="GPS Settings">
<adfmf:preferenceBoolean id="track_gps"
label="Automatically Track Location"
default="true"/>
</adfmf:preferencePage>

21.1.1.7 テキストのプリファレンスの追加方法

図21-15に示すように、挿入オプションを使用して、ユーザーが情報を格納したりデフォルト・テキストを閲覧できるようにする「テキストのプリファレンス」というダイアログを作成します。図21-15は、「セキュリティ」という名前のプリファレンス・グループ内にテキストのプリファレンスを作成する例を示しています。

図21-15 「テキストのプリファレンス」の挿入

始める前に

プリファレンス・グループ要素を作成します。

テキストのプリファレンスを作成するには:

1. プリファレンス・グループ要素を選択します。

2. 「内部に挿入」→「テキストのプリファレンス」を選択します。

3. 「テキストのプリファレンスの挿入」ダイアログ(図21-16を参照)に次の情報を入力して、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-16 「テキストのプリファレンスの挿入」ダイアログ

4. テキストのプリファレンス・ダイアログに次を定義します。

- デフォルトのテキスト値を入力します。

- テキストのプリファレンスを非表示にするには、「機密」を選択します。

図21-17 テキストのプリファレンスの定義

21.1.1.8 テキストのプリファレンスを定義する場合の処理

テキストのプリファレンスを追加してそのデフォルト値を指定した場合、次の例に示すように、JDeveloperでは、<adfmf:preferenceText>要素を使用してmaf-application.xmlファイルの<adfmf:preferences>セクションが更新されます。

<adfmf:preferenceGroup id="security" label="Security">
<adfmf:preferenceText id="serviceURL"
label="Security URL"
default="http://security.example.com/provider"/>
<adfmf:preferenceText  id="username"
label="User Name"/>
<adfmf:preferenceText  id="password"
label="Password"
secret="true"/>
</adfmf:preferenceGroup>

セキュリティURL、ユーザー名およびパスワードのプリファレンス設定を定義するプリファレンス・グループ要素は図21-18のように表示されます。

図21-18 テキストのプリファレンス

図21-18は、セキュリティURLがシードされた値、ユーザー名が入力値の<adfmf:preferenceText>要素を示しています。MAFのプリファレンスはiOS設定アプリケーションと統合されているため、パスワード入力テキストのsecret="true"属性により、ユーザーの入力を黒丸で覆うiOSの表記規則に従うアプリケーションとなります。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『Settings Application Schema Reference』のisSecureテキスト・フィールド要素の説明および第21.4項「プラットフォームによる表示の差異」を参照してください。

21.1.2 アプリケーションレベルのプリファレンス・ページを作成する場合の処理

モバイル・アプリケーションをデプロイすると、アプリケーション全体のプリファレンス設定ページがiOSデバイスの設定アプリケーションなど、デバイスのグローバル設定アプリケーションに伝播されます。詳細は、付録D「デプロイメントでのプリファレンスの変換」を参照してください。

21.2 アプリケーション機能のユーザー・プリファレンス・ページの作成

第8章「MAFアプリケーション・コンテンツの再使用」で説明するように、アプリケーション機能をモバイル・アプリケーションと別個に配布するには、そのアプリケーション機能を含む機能アプリケーション・アーカイブ(FAR) .jarファイルを、別のモバイル・アプリケーションに追加します。その後、このアプリケーション機能を、アプリケーションのmaf-application.xmlファイル内で参照します。アプリケーション機能において、使用先のアプリケーション用に定義した全般的なプリファレンスだけでなく、特定のユーザー・プリファレンスのセットが必要になる場合は、maf-feature.xmlの概要エディタの「プリファレンス」タブを使用して、該当するプリファレンスを定義できます(図21-19を参照)。第21.1項「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」の説明に従い、アプリケーション・レベルのプリファレンスを構築する方法で、アプリケーション機能のプリファレンスを構築します。maf-feature.xmlファイル内でプリファレンスを定義したら、次は第13.3項「UIコンポーネントの作成と使用方法」で説明したブール・スイッチ、入力および出力の各コンポーネントに埋め込むMAF AMXページを参照するアプリケーション機能を作成することによって実際のプリファレンス・ページを作成します。

図21-19 アプリケーション機能レベルのプリファレンスの設定

21.3 ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法

アプリケーション機能レベルのプリファレンス・ページを作成する場合、次の例の入力テキスト・コンポーネントなど、MAF AMXコンポーネントに対してEL式を追加します。

<amx:inputText label="Number" id="it1" inputType="number"
value="#{preferenceScope.feature.Feature1.f1top.f1Number}"/>

この例に示すとおり、EL式では、preferenceScopeオブジェクトを使用して、アプリケーションがアプリケーション機能レベルのプリファレンスにアクセスできるようにします。これらのEL式の書式は次のとおりです。

preferenceScope.feature.feature-id.group-id.property-id

図21-20は、式ビルダーを使用したEL式の作成について説明しています。アプリケーション機能(<adfmf:feature id="Feature1">)のID、プリファレンス・グループ(<adfmf:preferenceGroup id="f1top">)のID、プリファレンス・プロパティ(<adfmf:preferenceNumber id="f1Number">)のIDなど、maf-feature.xml内の様々なコンポーネントに対して構成されるIDによってプリファレンス自体が指定されています。

EL式には、ゼロ個以上のgroup-id要素およびproperty-id要素が含まれる可能性があります。

図21-20 プリファレンスに対するEL式の構築

21.3.1 preferenceScopeに関する必知事項

EL式には次の解決パターンがあります。

- JavaScriptレイヤーから、次のJavaScript関数を使用してEL値式を解決します。

adf.mf.el.getValue(expression, success, failed)

adf.mf.el.getValueの解決では、まずJS-ELパーサーとJavaScriptコンテキスト・キャッシュをローカルで使用して式の解決を試みます。式がローカルで解決できない場合は、その式を埋込みJavaレイヤーに評価用として渡し、そこでJava ELパーサーによって解決されます。これは、モデルのgetValueメソッドに対するGenericInvokeRequestを使用して処理されます。

- Javaレイヤーで、次の手法を使用してEL値式を解決します。

String val = AdfmfJavaUtilities.evaluateELExpression("#{preferenceScope.feature.f0.vendor}");

setValueメソッドでは、次のように式を解決します。

ValueExpression ve = AdfmfJavaUtilities.getValueExpression("#{preferenceScope.feature.f0.vendor}");
ve.setValue(AdfmfJavaUtilities.getADFELContext(), value);

EL式の評価には、preferenceScopeオブジェクトの検索が含まれます。評価は左から右に行われ、各トークンは別個に解決されます。トークンが解決されると、これは次の(その右側の)トークンの解決に使用されます。

preferenceScopeオブジェクトがない場合は、プリファレンスを公開できません。preferenceScopeオブジェクトの詳細は、第14.3.6.3項「モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて」を参照してください。

21.3.2 iOSネイティブ・ビューでのプリファレンス値の読取り

MAFでは、ネイティブUI (UIView、UIViewControllerなど)に提供されているAPIが統合され、iOSプラットフォームで一定の構成が可能です。

ネイティブUIを初期化すると、ADFSession オブジェクトのインスタンスが利用可能になります。そのgetPreferencesメソッドを使用して、MAFに対し、maf-application.xmlファイルで定義されているアプリケーションで利用可能なプリファレンスのリストを提供するように命令できます。次の例に示すとおり、このメソッドでは、プリファレンスにid、valueおよびlabelを含めることができるプリファレンス・プロパティ・オブジェクトのNSArray*が戻されます。このAPIコールでは、エンド・ユーザーによって特定のプリファレンスの値が提供されたこと、またはプリファレンスのデフォルト値が戻されていることのいずれかを確認します。

//...
-(id) initWithADFSession:(id<ADFSession>) providedSession
{
id me = [self init];
session = providedSession;
//...
// Dump the preferences to the data display
NSArray* prefsArray = [session getPreferences];
NSString* prefs = [prefsArray JSONRepresentation];
self.theData.text = [[NSString alloc ] initWithFormat:
:@"%@\nUser Preferences = --> %@ <--", self.theData.text, prefs];
//...
return me;
}

21.4 プラットフォームによる表示の差異

MAFのプリファレンス・ページでは、iOSおよびAndroidの両プラットフォームでネイティブのルック・アンド・フィールが維持されます。その結果、MAFのプリファレンス・ページの表示は2つのプラットフォームで異なります。表21-1に示すとおり、iOSプラットフォームではプリファレンスがインラインで表示されるため、そのシステムではダイアログ・ページを起動しません。いくつかの例外を除いて、Androidプラットフォームではこれらのコンポーネントがダイアログで表示されます。

表21-1 プラットフォームごとのプリファレンス・コンポーネントの比較

コンポーネント

iOS

iOSの表示例

Android

Androidの表示例

プリファレンス・グループ(カテゴリ選択)

iOSでは、その親プリファレンス・グループ内にプリファレンス要素が表示されます。

Androidでは、その親プリファレンス・グループ内にプリファレンス要素が表示されます。

ブール型のプリファレンス・リスト

ブール型のプリファレンスは、onとoffなどのペアの値で表示されます。

Androidでは、ブール型のプリファレンスをチェック・ボックスで表示します。

テキスト・プリファレンス

iOSはテキストをインラインで表示します。

Androidは、入力フィールド内にデフォルト・テキストを表示します。

テキストのプリファレンス(機密入力テキスト)

iOSプラットフォームでは、ユーザーはテキストをインラインで入力し、各文字はその入力後に黒丸で覆われます。詳細は、第21.1.1.8項「テキストのプリファレンスを定義する場合の処理」を参照してください。

Androidでは、入力テキスト・ダイアログが起動し、各文字はその入力後に黒丸で覆われます。

単一のアイテム選択リスト(プリファレンス・リストから)

iOSプラットフォームでは別のプリファレンス・ページに単一のアイテム選択リストが表示されます。

Androidでは、ダイアログ内に単一のアイテム選択リストが表示されます。

プリファレンス・ページ

iOSでは、プリファレンス・グループから子プリファレンス・ページを起動します。

Androidでは、プリファレンス・グループから子プリファレンス・ページを起動します。

iOSおよびAndroidのプラットフォームには設定アプリケーションがありますが、図21-21のプリファレンスで示すように、設定アプリケーションへのアプリケーション・レベルのプリファレンスの統合はiOSプラットフォームのみでサポートされます。

図21-21 iOS設定アプリケーションでのOracleモバイル・プリファレンス

Androidデバイスでは、ユーザーは、アプリケーションが実行されている場合のみ、図21-22のようなアプリケーション固有のプリファレンス・ページにアクセスします。

図21-22 Androidデバイスのプリファレンス・メニュー

22 アプリケーション機能に関する制約の設定

この章では、ユーザーのアクセス権限またはデバイス要件に基づいてアプリケーション機能を制限できる制約の設定方法について説明します。

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

- 第22.1項「制約の概要」

- 第22.2項「アプリケーション機能の制約の定義」

22.1 制約の概要

制約には、アプリケーション機能またはアプリケーション・コンテンツを使用するタイミングが記述されています。制約では、ユーザーとユーザー・ロール、モバイル・アプリケーションの実行対象となるデバイス、およびデバイス上で使用可能なハードウェアに基づいて、アクセスを制限できます。制約は2つのレベルで設定できます。1つ目のアプリケーション機能レベルでは、ユーザーのデバイスにおけるアプリケーション機能の可視性を制御し、2つ目のコンテンツ・レベルでは、アプリケーション機能に対して配信できるMAFコンテンツのタイプを指定できます。maf-feature.xmlファイルの概要エディタでは、これら両方のタイプの制約を設定できます。制約はMAFランタイムによって評価され、エンド・ユーザーが特定のコンテンツを表示または使用したり、アプリケーション機能自体にアクセスできるようにするには、trueに評価される必要があります。

22.1.1 制約を使用したアプリケーション機能の表示または非表示

「制約」タブ(図22-1を参照)では、アプリケーション機能レベルの制約を設定できます。たとえば、デバイスのカメラを使用するアプリケーション機能は、そのデバイスに実際にカメラ機能があることがMAFランタイムによって確認された場合のみ、モバイル・アプリケーションのナビゲーション・バーまたはSpringboard内に表示されます。また、機能レベルの制約を使用すると、ユーザー・ロールと権限に基づいてアプリケーションを保護することもできます。図22-1に、MAFランタイムによって制約がtrueに評価されたときに、管理者権限を持つユーザーのみにアプリケーション機能への
アクセスを許可する制約を作成する方法を示します。制約がランタイムによってfalseと評価された場合、アプリケーション機能はナビゲーション・バーまたはSpringboard内に表示されないため、エンド・ユーザーはそのアプリケーション機能にアクセスできません。

図22-1 アプリケーション機能レベルの制約の設定

22.1.2 制約を使用した特定のコンテンツ・タイプの配信

デバイス・ハードウェア・プロパティやユーザー権限などのファクタに対応するため、単一のアプリケーション機能に複数のコンテンツ・タイプを指定し、ユーザー・インタフェースの様々なバージョンを配信できます。アプリケーション機能のコンテンツに関する制約を設定することによって、アプリケーション・ページを表示できるエンド・ユーザーや、そのページの使用方法を特定する条件を指定できます。

たとえば、「コンテンツ」タブ(図22-2を参照)を使用して、管理権限を付与されたユーザーに特定のタイプのユーザー・インタフェースを表示し、基本的なユーザー権限を持つユーザーに別のユーザー・インタフェースを表示できます。また、コンテンツ・レベルの制約によって、デバイスのレイアウトに関する考慮事項に対応できます。図22-2は、この例として、サンプル・アプリケーションで、デバイスの画面幅に基づく制約を使用して、iPhoneとiPadのレイアウトにあわせて調整されたページをコールするAMXモバイル・タスク・フローを配信する方法を示しています。エンド・ユーザーがサンプル・アプリケーションを起動すると、MAFランタイムによって、Employeesアプリケーション機能に対して設定された制約が評価されます。デバイス画面の対角線幅が6インチを超えることがランタイムによって確認されると、Employees_pad_taskflow.xmlファイルが選択され、このファイルによって、iPad用に設計されたMAF AMXページがコールされます。この制約がfalseに評価された(つまり、画面の対角線幅が6インチ未満の)場合は、ランタイムによって、iPhone固有のページをコールするMAFタスク・フローであるEmployees_phone_taskflow.xmlが選択されます。さらに、「コンテンツ」タブを使用すると、ランタイムによって特定のコンテンツが選択されたときに表示されるナビゲーション・バーとSpringboardのイメージを選択できます。コンテンツ固有のイメージを選択しなかった場合、MAFでは、「一般」タブで指定されたアプリケーション機能レベルのイメージが使用されます。

注意:
第3.3項「アプリケーション機能の表示プロパティの設定」で説明されているように、イメージはプラットフォーム固有のガイドラインに準拠している必要があります。

図22-2 コンテンツ・レベルの制約の設定

サンプル・アプリケーションの詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

22.2 アプリケーション機能の制約の定義

アプリケーション機能レベルの制約を設定する際、<adfmf:constraint>要素(<adfmf:constraints>の子要素)のproperty、operatorおよびvalue属性を使用すると、ユーザー、デバイスまたはハードウェアに基づいてアプリケーションの使用を制限できます。次の例に示すこれらの属性の定義の例は、アプリケーション機能へのアクセスをField Repに制限し、さらにiOSデバイスでのみアプリケーションを実行するように制限する属性の定義を示しています。

<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="contains"
value="Field Rep"/>
<adfmf:constraint property="device.model"
operator="contains"
value="ios"/>
</adfmf:constraints>

22.2.1 アプリケーション機能に制約を定義する方法

図22-2に示すように、「機能」ページの「制約」タブを使用して、選択したアプリケーション機能の制約を宣言的に構成します。

アプリケーション機能の制約を定義するには:

1. 「制約」タブをクリックします。

2. 「追加」をクリックします。

3. プロパティと適切な演算子を選択し、値を入力します。プロパティの使用の詳細は、第22.2.3項「property属性について」を参照してください。

22.2.2 制約を定義する場合の処理

第22.2項「アプリケーション機能の制約の定義」に示されている例と同様に、「制約」タブに値を入力すると、定義された<adfmf:constraint>要素を使用して、識別子ファイルの<adfmf:constraints>要素が更新されます。

22.2.3 property属性について

MAFでは、ユーザー、デバイスおよびハードウェアの各プロパティを反映する一連のproperty属性が提供されています。これらのプロパティを次の演算子と組み合せて使用することでアプリケーション機能の使用方法が決定されます。

- contains

- equal

- less

- more

- not

22.2.4 ユーザー制約とアクセス制御について

ユーザーがモバイル・アプリケーションにログインすると、MAFモバイル・ランタイムでは、アプリケーション機能ごとに構成されたユーザー・ロール・ベースの制約を、アクセス制御サービス(ACS)によって取得されたユーザー・ロールと権限に対して調整します。その後、MAFでは、制約を満たす権限を持つエンド・ユーザーにのみ、アプリケーション機能(またはアプリケーション機能のコンテンツ)を提供します。このようなユーザー権限とロールに関する制約を設定するだけでなく、「MAFログイン接続の作成」ダイアログに次の項目を入力することによって、モバイル・アプリケーション用のアクセス制御を作成できます(図22-3および第29.6.2項「ログイン・ページの指定方法」を参照)。

- ユーザー・ロールと権限を送信するREST WebサービスのURL。

- アプリケーション機能によってチェックされるユーザー・ロールのリスト。

- 権限のリスト。

第29.5.21項「アクセス制御サービスに関する必知事項」も参照してください。

図22-3 ユーザー・ロールと権限の取得の構成

user.rolesおよびuser.privilegesに基づく制約を使用してアプリケーション機能へのアクセスを制御します。たとえば、アプリケーション機能へのアクセスをmanagerロールを持つユーザーのみに許可するには、user.roles contains managerの制約をアプリケーション機能の定義に追加する必要があります。

user.rolesおよびuser.privilegesでは、containsおよびnotの演算子を次のように使用します。

- contains: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれる場合、ランタイムではその制約をtrueに評価します。次の例には、contains演算子を使用したuser.rolesプロパティの使用方法が示されています。ユーザーのロールに従業員のロールが含まれている場合は、モバイル・アプリケーションにアプリケーション機能が表示されます。

<feature ...>
...
<constraints>
<constraint property="user.roles"
operator="contains"
value="employee" />
</constraints>
...
</feature>

- not: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれない場合、ランタイムではその制約をtrueに評価します。次の例では、ユーザーの権限にマネージャ権限が含まれる場合はアプリケーション機能が含まれません。

<feature ...>
...
<constraints>
<constraint property="user.privileges"
operator="not"
value="manager" />
</constraints>
...
</feature>

22.2.5 ハードウェア関連の制約について

ハードウェア・オブジェクトは、カメラの有無、コンパス向首方向情報提供機能、ファイルの保存機能など、デバイスで使用可能なハードウェアを参照します。次のプロパティではequal演算子が使用されます。

- hardware.networkStatus: アプリケーションの起動時にネットワークの状態が表示されます。NotReachable、CarrierDataConnectionおよびWiFiConnectionの3つの属性値を使用してこのプロパティを変更できます。次の例は、後者の値を示しています。その例に示すとおり、この値を設定することで、デバイス・ハードウェアがWi-Fi接続があることを示している場合にのみモバイル・アプリケーションにこのモバイル・アプリケーション機能が表示されることになります。つまり、デバイスにWi-Fi接続がない場合は、モバイル・アプリケーションをロードしても、そのアプリケーション機能は表示されません。

<feature ...>
...
<constraints>
<constraint property="hardware.networkStatus"
operator="equal"
value="WiFiConnection" />
</constraints>
...
</feature>

注意:
この制約は、iOSデバイスの起動時に評価されます。起動時にデバイスにWi-Fi接続がなく、その後その接続を取得した場合(ユーザーがWi-Fiのホットスポットに入った場合など)、アプリケーション機能は無効のままとなり、ユーザーがモバイル・アプリケーションを停止し再起動するまで利用できません。

- hardware.hasAccelerometer: デバイスに加速度計があるかどうかを示します。このプロパティは、trueまたはfalseの値で定義します。次の例は、trueの値を示しており、ハードウェアに加速度計がある場合にのみこのアプリケーション機能が利用可能なことを示しています。

<feature ...>
...
<constraints>
<constraint property="hardware.hasAccelerometer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
iOSベースのハードウェアにはすべて加速度計があるため、このプロパティは常にtrueの値にして、iOSデバイスでアプリケーション機能が利用できるようにしておく必要があります。

- hardware.hasCamera: デバイスにカメラがあるかどうかを示します。この制約は、trueまたはfalseの属性値を使用して定義します。次の例では、値がtrueに設定され、デバイスにカメラが含まれる場合にのみアプリケーション機能が利用可能なことを示しています。

<feature ...>
...
<constraints>
<constraint property="hardware.hasCamera"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
すべてのiOSベース・ハードウェアにカメラが搭載されているわけではありません。この値は、iOSデバイスでモバイル・アプリケーションを起動したときに動的に評価されます。そのときに、モバイル・アプリケーションでは、trueに評価されないアプリケーション機能が削除されます。

- hardware.hasCompass: デバイスにコンパスがあるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseの属性値で定義します。

<feature ...>
...
<constraints>
<constraint property="hardware.hasCompass"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
すべてのiOSデバイスにコンパスがあるわけではありません。この値は、iOSデバイスでモバイル・アプリケーションを起動したときに動的に評価されます。そのときに、モバイル・アプリケーションでは、trueに評価されないアプリケーション機能が削除されます。

- hardware.hasContacts: デバイスにアドレス帳またはコンタクト先があるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseの属性値で定義します。

<feature ...>
...
<constraints>
<constraint property="hardware.hasContacts"
operator="equal"
value"=true" />
</constraints>
...
</feature>

注意:
iOSベースのハードウェアのコンタクト先はApache Cordova経由でアクセスされるため、iOSデバイスに対してはvalue属性は常にtrueに設定されます。

- hardware.hasFileAccess: デバイスでファイル・アクセスが可能かどうかを示します。次の例に示すように、この制約をtrueまたはfalseの属性値で定義します。ランタイムがこの制約をtrueに評価した場合にのみ、アプリケーション機能を利用できます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasFileAccess"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
iOSベースのハードウェアのファイル・アクセスはApache Cordova経由でアクセスされるため、iOSデバイスに対してはvalue属性は常にtrueになります。

- hardware.hasGeoLocation: デバイスが地理的位置情報サービスを提供しているかどうかを示します。次の例に示すように、この制約をtrueまたはfalseの属性値で定義します。デバイスが地理的位置情報をサポートする場合にのみ、アプリケーション機能を利用できます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasGeoLocation"
operator="equal"
value="true"/>
</constraints>
...
</feature>

注意:
Apache Cordovaでは、すべてのiOSデバイスに対して地理的位置情報サービスへのアクセスを提供しているわけではありません。デバイスによっては、制約がランタイムにより評価された場合に、アプリケーション機能が利用できない可能性があります。

- hardware.hasLocalStorage: デバイスがファイルのローカル記憶域を提供するかどうかを示します。次の例に示すように、この制約をtrueまたはfalseのvalue属性で定義します。デバイスがローカルでのファイルの格納をサポートする場合にのみ、アプリケーション機能が表示されます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasLocalStorage"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
Apache CordovaではすべてのiOSハードウェアでローカル・ファイル記憶域へのアクセスが提供されるため、iOSデバイスに対するvalue属性は常にtrueになります。

- hardware.hasMediaPlayer: デバイスにメディア・プレーヤがあるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseのvalue属性で定義します。デバイスにメディア・プレーヤがある場合にのみ、アプリケーション機能が表示されます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasMediaPlayer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
Apache CordovaではiOSベースのハードウェアでメディア・プレーヤへのアクセスを提供しているため、iOSデバイスではvalue属性は常にtrueになります。

- hardware.hasMediaRecorder: デバイスにメディア・レコーダがあるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseのvalueで定義します。デバイス・ハードウェアがメディア・レコーダをサポートする場合にのみ、アプリケーション機能が含まれます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasMediaRecorder"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
すべてのiOSベースのハードウェアにApache Cordovaからアクセス可能なメディア・レコーダがあるため、すべてのiOSデバイスでこの値をtrueに設定します。Apple iTouchなどのいくつかのデバイスにはマイクがありませんが、エンド・ユーザーは外部マイクを取り付けることでレコーディングが可能になります。

- hardware.hasTouchScreen: ハードウェアにタッチ・スクリーン機能があるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseのvalue属性で定義します。デバイス・ハードウェアがタッチ・スクリーンをサポートする場合にのみ、アプリケーション機能が含められます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasTouchScreen"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
すべてのiOSベースのハードウェアにタッチ・スクリーン機能があるため、iOSデバイスのvalue属性をtrueに設定します。

- hardware.screen.width: デバイスの現在の向きでの画面幅を示します。画面幅を、デバイスに表示される実際のピクセルを表す物理デバイス・ピクセル単位ではなく、論理デバイス・ピクセル単位(次の例では320)で示す数値を入力します。この値はデバイスの向きによって異なります。

<feature ...>
...
<constraints>
<constraint property="hardware.screen.width"
operator="equal"
value="320" />
</constraints>
...
</feature>

注意:
この値はモバイル・アプリケーションの起動時に評価され、その際にランタイムが制約を評価し、trueに評価されない制約を持つアプリケーション機能は削除されます。アプリケーション機能の設定はモバイル・アプリケーションの起動後に固定されるため、モバイル・アプリケーションの起動後にユーザーがデバイスを回転した場合、この制約はMAFのランタイムによって再評価されません。

- hardware.screen.height: デバイスの現在の位置における画面高さを示します。次の例に示すように、320や480などの画面高さ(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

<feature ...>
...
<constraints>
<constraint property="hardware.screen.height"
operator="equal"
value="480" />
</constraints>
...
</feature>

注意:
モバイル・アプリケーションの起動時に、trueに評価されない制約を持つアプリケーション機能を削除するプロセスの一部として、この制約の画面高さの値がMAFランタイムによって評価されます。アプリケーション機能の設定はモバイル・アプリケーションの起動後に固定されるため、モバイル・アプリケーションの起動後にユーザーがデバイスの向きを変えた場合、この制約はランタイムによって再評価されません。

- hardware.screen.availableWidth: デバイスの現在の向きで利用可能な画面幅を示します。次の例に示すように、320や480などの画面幅(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

<feature ...>
...
<constraints>
<constraint property="hardware.screen.availableWidth"
operator="equal"
value"320" />
</constraints>
...
</feature>

- hardware.screen.availableHeight: デバイスの現在の位置で利用可能な画面高さを示します。次の例に示すように、320や480などの画面幅(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

<feature ...>
...
<constraints>
<constraint property="hardware.screen.availableHeight"
operator="equal"
value"480" />
</constraints>
...
</feature>

22.2.6 アプリケーション機能およびコンテンツに関する動的制約の作成

name、operatorおよびvalue属性で定義された静的制約に基づいてアプリケーション機能またはユーザー・インタフェースの表示と非表示を設定する以外にも、EL式を使用して制約を定義することにより、アプリケーション機能およびコンテンツを動的にレンダリングできるようにモバイル・アプリケーションを設定できます。EL式に基づいて制約を動的に評価すると、独自のBeanロジックをコールできる式を記述したり、複雑なEL式を記述したり、アプリケーション・プリファレンスにアクセスするロジックを記述することもできます。制約をEL式として定義することで柔軟性が向上し、MAFランタイムで、EL式がfalseとして評価された場合は最初にアプリケーション機能を非表示にするが、後で同じEL式がtrueとして評価されたときには表示するようにできます。次の例の遅延メソッド式に示しているように、<adfmf:constraintExpression>要素を使用すると、EL式を使用してアプリケーション機能に対する制約を定義できます。

<adfmf:constraints>
<adfmf:constraint id="c1" property="hardware.screen.dpi" operator="more" value="120"/>
<adfmf:constraint id="c2" property="device.model" operator="equal" value="iPad"/>
<adfmf:constraintExpression id="c3" value="#{myBean.checkConstraint}"/>
</adfmf:constraints>

この例は、maf-feature.xmlファイルの<adfmf:constraints要素内で定義された静的制約間で<adfmf:constraintExpression要素をネストする方法を示しています。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

22.2.6.1 静的制約とEL定義制約の結合について

MAFランタイムによる表示を有効にするには、静的制約のすべての条件がtrueに評価される必要があります。制約EL式がtrueとして評価された場合はアプリケーション機能およびコンテンツが表示され、式がfalseとして評価された場合はそれらが非表示になります。

22.2.6.2 動的コンテンツの定義方法

静的制約とは異なり、動的制約の作成(または更新)を行う場合は、maf-feature.xml概要エディタを使用しません。かわりに、制約式コンポーネントをソース・エディタまたは「構造」ウィンドウにドラッグし、式ビルダーを使用してこのコンポーネントにEL式を移入することにより、<adfmf:constraintExpression>を作成します。

制約式コンポーネントを定義するには:

1. maf-feature.xmlファイルのソース・エディタを選択します。

2. <adfmf-constraints>要素に移動します。

3. 「コンポーネント」ウィンドウで、「共通」コンポーネントを選択します(図22-4を参照)。

図22-4 制約式コンポーネント

4. 制約式コンポーネントを選択し、次のいずれかの方法を使用して<adfmf-constraints>要素に追加します。

- 「コンポーネント」ウィンドウで、制約式コンポーネントをダブルクリックします。

- 制約式コンポーネントをソース・エディタの<adfmf-constraints>要素にドラッグします。

- 制約式コンポーネントを「構造」ウィンドウの「制約」ノードにドラッグします。

5. 図22-5に示すように、「constraintExpressionの挿入」ダイアログでEL式を入力するか、式ビルダー(このダイアログ内の「プロパティ・メニュー」アイコン(ギア)をクリックしてアクセス)を使用してEL式を作成します。

図22-5 InsertconstraintExpessionダイアログを使用したEL制約の定義

例22-0は、「ADFマネージドBean」カテゴリからのEL式の作成を示しています。ただし、制約のEL式は、第14.3.6項「式ビルダーのカテゴリについて」で説明されているカテゴリのいずれからでも作成できます。

注意:
adfc-mobile-config.xmlに定義されているアプリケーション・スコープのマネージドBeanのみが制約のEL式に使用できます。

図22-6 制約のEL式の作成

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

23 Oracle Cloud上のデータへのアクセス

この章では、Oracle Java Cloud ServiceでホストされるデータへのMAFアプリケーションによるアクセス方法について説明します。

この章には次の項が含まれます:

- 第23.1項「Oracle CloudでホストされるデータへのMAFアプリケーションによるアクセスの有効化」

23.1 Oracle CloudでホストされるデータへのMAFアプリケーションによるアクセスの有効化

MAFアプリケーションでは、Oracle CloudでホストされるSOAPおよびRESTの両方のWebサービスにアクセスできます。ホストされるSOAP Webサービスへのアクセスを有効にするには、第15.3項「SOAPを使用したWebサービス・データ・コントロールの作成」の説明に従ってWebサービス・データ・コントロールを作成します。REST Webサービスへのアクセスを有効にするには、第15.2項「RESTを使用したWebサービス・データ・コントロールの作成」の説明に従ってWebサービス・データ・コントロールを作成します。MAFアプリケーションがクラウド・データにアクセスできる方法はコンテンツ・タイプによって異なり、第12.3.2項「MAF AMXページにUIコンポーネントを追加する方法」の説明に従ってデータ・コントロールをMAF AMX UIコンポーネントにドラッグ・アンド・ドロップする方法、コンテンツがリモートWebサーバーまたはローカルに格納されたHTMLファイルのいずれかから配信されるアプリケーションの場合はプログラムを使用する方法があります。

23.1.1 Oracle Cloudの認証方法

「MAFログイン・サーバー接続」ダイアログを使用して、Oracle Cloudに対して認証するためのログイン・サーバー接続を作成します。

始める前に

ログイン・サーバー接続に使用するOracle Cloud URLを取得します。

Oracle Cloudのエンド・ポイントを使用してログインURLを作成するには:

1. 「アプリケーション」→「新規」→「接続」の順に選択します。

2. MAFサーバー・ログイン接続を選択します。

3. 次の項目を入力して、図23-1に示すMAFログイン接続の接続ダイアログの入力を完了します。

- 「名前」フィールド: 接続名

- 「ログインURL」フィールド: Oracle CloudのURL

詳細は、Oracle JDeveloperオンライン・ヘルプおよび第29.6.2項「ログイン・ページの指定方法」を参照してください。

図23-1 Oracle Cloudへのログインの作成

23.1.2 Oracle Java CloudにアクセスするためのWebサービス・データ・コントロールの作成方法

データ・サービス・コントロールの作成ウィザードでは、ホストされたデータにアクセスするデータ・コントロールを作成できます。Oracle Java CloudにデプロイされたSOAP WebサービスのWSDL URLを使用してこのデータ・コントロールを作成します。このURLがわからない場合は、アプリケーションのコンテキスト・ルートにWebサービスのポート名および?wsdlを追加して、WSDLドキュメントへのURLを作成する必要があります。

始める前に

Oracle Java Cloud ServiceにデプロイされているSOAP Webサービス・アプリケーションへのアクセス権を持つ必要があります。このアプリケーションは、Oracle Java Cloud Service Controlホームページにある「アプリケーション」ペインを経由して利用可能にする必要があります。さらに、図23-2のHCMMobileServiceアプリケーションで示されるように、その「ステータス」および「状態」それぞれが「↑」および「アクティブ」である必要があります。

図23-2 Java Cloud Services Controlホームページ

Webサービス・データ・コントロールを作成するには:

1. Oracle Cloud上でホストされたWebサービスのアプリケーション・コンテキスト・ルートを次のように取得します。

1. 「アプリケーション」ペイン(図23-2を参照)のアプリケーションをクリックして、図23-3に示すアプリケーション・ホームページに移動します。

2. 図23-3に示すように、URLをコピーします。このURLは、WSDLドキュメントのアプリケーション・コンテキスト・ルートになります。

図23-3 Webサービスのアプリケーション・コンテキスト・ルートのコピー

2. 第15.3項「SOAPを使用したWebサービス・データ・コントロールの作成」の説明に従い、JDeveloperで、「アプリケーション・ナビゲータ」のビュー・コントローラ・プロジェクトを右クリックしてWebサービス・データ・コントロールの作成ウィザードを開きます。

3. 図23-4に示す「データソース」ページで、データ・コントロールの名前を入力します。

図23-4 WSDLドキュメントのURLの入力

4. 「URL」フィールドで、Oracle Cloud Java Serviceにデプロイされている(さらに現在実行されている)SOAPベースのWebサービスのURLを貼り付けます。

5. 図23-4のHCMServicePort?wsdlなど、アプリケーション・コンテキスト・ルートにWebサービスのポート名と?wsdlを追加することで、データ・コントロールによるWSDLへのアクセスを可能にします。

6. 図23-5に示すとおり、「データ・コントロール操作」ページで、アプリケーション機能がデータの取得に使用できるWebサービス操作を選択し、「終了」クリックします。

図23-5 Webサービス操作の選択

図23-5に、MAFデザインタイムにより戻される、MAFアプリケーションで使用可能なWebサービス操作を示します。この例で、デザインタイムは、人事管理データをホストするWebサービスに問合せを行い、経費の承認を含む従業員データを取得するための操作を戻します。

23.1.2.1 SOAPベースのWebサービスにおけるポリシーの構成

Oracle Cloud上で保護されるSOAPベースのWebサービスに対してポリシーを構成する必要があります。第15.7項「セキュアなWebサービスへのアクセス」の説明に従い、データ・サービス・コントロール・ポリシーの編集ダイアログを使用して、oracle/wss_http_token_over_ssl_client_policyを選択できます。この(および他の)ポリシーの詳細は、Oracle Fusion Middleware Oracle Web Services Managerを使用したWebサービスの保護とポリシーの管理の「使用する優先ポリシーの決定」および「事前定義済ポリシー」の各章を参照してください。

注意:
SOAPベースのWebサービスには、oracle/wss_http_token_over_ssl_client_policyのみがサポートされます。RESTベースのWebサービスについては、MAFでは基本認証とSSLポリシーの両方がサポートされています。

23.1.3 Oracle Java Cloud ServiceにアクセスするMAFアプリケーションのデプロイ時に行われる処理

アプリケーションをデプロイすると、Webサービス・データ・コントロールの操作によって、Oracle Java Cloud Serviceインスタンス上で実行されるWebサービスからデータが取得されます。

24 通知の有効化と使用方法

この章では、MAFアプリケーションでローカル通知を表示する方法と、プッシュ通知メッセージを登録および処理する方法を説明します。

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

- 第24.1項「通知の概要」

- 第24.2項「プッシュ通知の有効化」

- 第24.3項「ローカル通知の管理」

24.1 通知の概要

通知は、モバイル・アプリケーションの標準のユーザー・インタフェースの外部のエンド・ユーザーに提供されるシグナルです。これらの通知は、アプリケーションの状態とユーザー設定に応じて、アラート・メッセージやバナーとして表示できます。通知は、視覚的に表示するか、音声として、またはその両方として提示できます。

次に、2つの主なタイプの通知を示します。

- プッシュ通知は、サーバーなどの外部ソースからモバイル・デバイス上のアプリケーションに送信されます。通知を受信したエンド・ユーザーは、アプリケーションを起動するか、その通知を無視でき、無視した場合はアプリケーションがアクティブになりません。
図24-1は、iOSデバイスにおけるプッシュ通知アラートを示しています。

図24-1 プッシュ通知

プッシュ通知を受信するには、アプリケーションを通知サービスに登録する必要があります。登録が成功すると、通知サービスからアプリケーションにトークンが発行されます。アプリケーションでは、このトークンを(リモート・サーバー上の)プロバイダと共有します。これにより、プロバイダから、通知サービスを通じてアプリケーションに通知を送信できるようになります。MAFでは、アプリケーションによって提供された登録構成を使用して、そのアプリケーションのかわりに登録を行います(第24.2項「プッシュ通知の有効化」を参照)。登録は、MAFアプリケーションが起動するたびに、トークンの有効性を保証する目的で行われます。登録が成功すると、MAFでは、プラットフォーム固有の通知サービスから取得したトークンをプロバイダと共有します。iOSの場合、この通知サービスはApple Push Notification Service (APNs)です。Google Cloud Messaging (GCM) for Androidでは、Androidデバイスにインストールされたアプリケーション用の通知サービスが提供されます。

MAFアプリケーションでは、その状態にかかわらずプッシュ通知を受信できます。これらのメッセージは、アプリケーションがフォアグラウンドで実行されていなくても表示される場合があり、その表示形式はMAFアプリケーションの状態とユーザー設定によって異なります。表24-1では、iOSオペレーティング・システムで、MAFアプリケーションの状態に応じて、どのようにプッシュ通知が処理されるかを説明します。

表24-1 iOSデバイスにおけるプッシュ通知の処理

状態

アクション

MAFアプリケーションはインストールされているが、実行されていない。

通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、MAFアプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。

MAFアプリケーションがバックグラウンドで実行されている。

通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、MAFアプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。

MAFアプリケーションがフォアグラウンドで実行されている。

通知メッセージは表示されません。アプリケーション通知ハンドラが呼び出されます。

iOSおよびAndroidプラットフォームでは、アプリケーションがフォアグラウンドで実行されていない場合、そのアプリケーションに関連付けられているすべてのプッシュ通知メッセージが、iOS Notification CenterやAndroidデバイス上の通知ドロワーなど、特定の場所に格納されます。

- ローカル通知は、モバイル・アプリケーション内で発生し、同じアプリケーションによって受信されます。通知は、モバイル・デバイス・プラットフォームによってサポートされる標準メカニズム(バナーやサウンドなど)を通じてエンド・ユーザーに配信されます。
MAFが提供するローカル通知抽象化APIを使用して、通知を即時に起動するか、将来の日時に通知をスケジュールするようにアプリケーションを構成できます。また、通知の繰返しパターン(毎日や毎週など)を設定したり、スケジュールされた通知をキャンセルできます。

iOSとAndroidプラットフォームの両方で、MAFアプリケーションがフォアグラウンドで実行されている場合、通知はエンド・ユーザーとの対話なしでアプリケーションに直接配信されます。アプリケーションがバックグラウンドで実行されているか、まったく実行されていない場合、通知はエンド・ユーザーが通知をタップした後でアプリケーションに配信されます。

24.2 プッシュ通知の有効化

次のタスクを実行することで、プッシュ通知を有効にできます。

1. 図24-2に示すとおりに、maf-application.xml概要エディタの「デバイス・アクセス」ページで「プッシュ通知」を選択し、MAFアプリケーションでプッシュ通知を受信できるようにします。

注意:
デフォルトでは、MAFアプリケーションはプッシュ通知を許可しません(また、いずれのデバイス・タイプのデバイス・アクセスも許可しません)。

図24-2 プッシュ通知の許可

2. アプリケーション・コントローラ・プロジェクトで、アプリケーション・ライフサイクル・イベント・リスナー(ALCL)・クラスを登録します。詳細は、第3.3項「アプリケーション機能の表示プロパティの設定」および第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

3. ALCLにoracle.adfmf.application.PushNotificationConfigインタフェースを実装します。このインタフェースにより、プッシュ通知サービスに正常に登録するために必要な構成が提供されます。
PushNotificationConfigインタフェースのgetNotificationStyleおよびgetSourceAuthorizationIdメソッドをオーバーライドおよび実装します。getNotificationStyleメソッドにより、アプリケーションを登録する通知スタイルを指定できます。getSourceAuthorizationIdメソッドを使用すると、MAFアプリケーションへのメッセージの送信を許可されたアカウントのGoogleプロジェクト番号を入力できます。詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

4. アプリケーション・コントローラ・プロジェクトで、プッシュ通知イベントを処理するプッシュ通知イベント・リスナー・クラス(NativePushNotificationListenerなど)を作成します。このクラスには、イベント・リスナーを定義するoracle.adfmf.framework.event.EventListenerインタフェースを実装する必要があります。oracle.adfmf.framework.event.EventListenerインタフェースの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。
通知イベントに登録して通知イベントを受信するには、onOpen、onMessageおよびonErrorメソッドをオーバーライドおよび実装します。プッシュ通知サービスへの登録が成功すると、MAFでは、アプリケーション開発者がプロバイダと共有する必要がある登録トークンを使用して、onOpenメソッドをコールします。通知サービスへの登録時にエラーが発生した場合は、プッシュ通知サービスにより戻されるAdfExceptionとしてカプセル化されたエラーを使用して、onErrorメソッドが呼び出されます。

MAFでは、アプリケーションが通知を受信するたびに、通知ペイロードを使用してonMessage(Event e)メソッドをコールします。Eventオブジェクトを使用すると、通知ペイロードおよびアプリケーションの状態に関する有用な情報を取得できます。通知ペイロードを取得するには、Event.getPayloadメソッドを使用します。通知時のアプリケーションの状態を取得するには、Event.getApplicationStateメソッドを使用します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのEventクラスに関する項を参照してください。

5. ALCLクラスのstartメソッド内にある、ネイティブ・プッシュ通知イベントのソースを表すEventSourceオブジェクトを取得します。

EventSource evtSource = EventSourceFactory.getEventSource(
EventSourceFactory.NATIVE_PUSH_NOTIFICATION_REMOTE_EVENT_SOURCE_NAME);

6. プッシュ通知イベント・リスナー・クラスのオブジェクトを作成し、イベント・ソースに追加します。

evtSource.addListener(new NativePushNotificationListener());

MAFサンプル・アプリケーション(PushDemoおよびPushServer)によって、プッシュ通知の処理方法を示します。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリのPublicSamples.zipファイル内にあります。

24.2.1 プッシュ通知ペイロードに関する必知事項

MAFでは、JSON形式のペイロードに対して、次のキーを尊重します。

- alert: 通知プロンプトに表示されるテキスト・メッセージ。

- sound: 通知を受信したときに再生されるサウンド。

- badge: iOSのアプリケーション・アイコンに表示する番号。

注意:
Androidでは、ペイロードをキーと値のペアを持つJSONオブジェクトにすることができます。GCMサーバーではアプリケーションに値を送信する前に、文字列以外の値を文字列に変換するため、値は常に文字列化されます。APNでは値のタイプが保持されるため、これは当てはまりません。詳細は、『Google Cloud Messaging』の「Implementing GCM Server」で、dataメッセージ・パラメータの説明を参照してください。このドキュメントは、http://developer.android.com/index.htmlにあるAndroid開発者のWebサイトまたはAndroid SDKドキュメントから入手できます。

24.3 ローカル通知の管理

次のものを使用して、ローカル通知を管理できます。

- MAFによって提供されるJava API (第24.3.1項「Javaを使用したローカル通知の管理方法」を参照)。

- MAFによって提供されるJavaScript API (第24.3.2項「JavaScriptを使用したローカル通知の管理方法」を参照)。

- アプリケーション設計時にすべてのMAFアプリケーションで使用可能なDeviceFeaturesデータ・コントロールのメソッド(第24.3.3項「DeviceFeaturesデータ・コントロールを使用したローカル通知の管理方法」を参照)。

LocalNotificationDemoというMAFサンプル・アプリケーションは、ローカル通知のスケジュールおよび処理方法を示します。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

24.3.1 Javaを使用したローカル通知の管理方法

oracle.adfmf.framework.api.AdfmfContainerUtilitiesクラスの次のメソッドを使用して、ローカル通知をスケジュールできます。

- addLocalNotification(MafNativeLocalNotificationOptions options)。このメソッドは、スケジュールされる通知のIDを表すStringを戻します。
Javaコードでは、このメソッドは次のような方法で使用します。

try {
// Configure local notification
MafNativeLocalNotificationOptions options =
new MafNativeLocalNotificationOptions();

options.setTitle("some title text");
options.setAlert("some alert text");

// Set the date in UTC
options.setDate(LocalDateTime.now(Clock.systemUTC()).plusSeconds(5));
// Set the notification to repeat every minute
options.setRepeat(MafNativeLocalNotificationOptions.RepeatInterval.MINUTELY);
// Set the application badge to be '1' everytime notification is triggered
options.setBadge(1);
// Play the default system sound when notification triggers
options.setSound(MafNativeLocalNotificationOptions.SYSTEM_DEFAULT_SOUND);
// Vibrate using default system vibration motion when notification triggers
options.setVibration(
MafNativeLocalNotificationOptions.SYSTEM_DEFAULT_VIBRATION);

// Add custom payload that is to be delivered through the local notification
HashMap<String,Object> payload = new HashMap<String, Object>();

payload.put("somenumber", 1);
payload.put("somestring", "value2");
payload.put("someboolean", true);
options.setPayload(payload);

// Schedule local notification
String notificationID = AdfmfContainerUtilities.
addLocalNotification(options);
System.out.println("Notification added successfully. ID is "+notificationID);
}
catch(Exception e) {
System.err.println("There was a problem adding notification");
}

通知オプションがアプリケーションの動作に与える影響は、ターゲット・プラットフォームによって異なります。詳細は、第24.3.5項「ローカル通知オプションとアプリケーションの動作に関する必知事項」を参照してください。

- cancelLocalNotification(String notificationId)。このメソッドは、正常に取り消された通知のIDを表すStringを戻します。
Javaコードで、次のような方法でこのメソッドを使用します。

try {
String cancelledNotificationId = AdfmfContainerUtilities.
cancelLocalNotification("a83b696d-53e7-4242-ab4d-4a771d8d178f");
System.out.println("Notification successfully canceled");
}
catch(AdfException e) {
System.err.println("There was a problem canceling notification");
}

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

24.3.2 JavaScriptを使用したローカル通知の管理方法

MAFでは、adf.mf.api.localnotificationネームスペースでJavaScript APIを使用してローカル通知を管理できます。次のメソッドを使用できます。

- 次のように定義されるadd。

/**
* Schedule a local notification
*
* @param {Object} options - notification options
* @param {string} options.title - notification title
* @param {string} options.alert - notification alert
* @param {Date} options.date - date at which notification is to be triggered
* @param {Number} options.badge - application icon is to be badged by this
*                                 number when notification is triggered
* @param {string} options.sound - set it to 'SYSTEM_DEFAULT' to play the
*                                 default system sound upon a notification
* @param {string} options.vibration - set it to 'SYSTEM_DEFAULT' for default
*                                     system vibration upon a notification
* @param {Object} options.payload - custom payload to be sent via notification
* @param {successCallback} scb - success callback
* @param {errorCallback} ecb - error callback
*/
adf.mf.api.localnotification.add(options,scb,ecb);

{Object} options : json representing notification options
{
// notification title (only Android and iOS 8.2 or later)
"title" : String,
// notification alert text
"alert" : String,
// date-time at which notification should be fired (UTC time zone)
"date" : Date,
// either 'minutely', 'hourly', 'daily',
// 'weekly', 'monthly', or 'yearly'
"repeat" : String,
// badge application icon with this number (iOS only)
"badge" : Number,
// if set, the default system sound is played
"sound" : "SYSTEM_DEFAULT",
// if set to "SYSTEM_DEFAULT", the default vibration is
// enabled upon an incoming notification (Android only)
"vibration" : String,
// custom JSON data to be passed through the notification
"payload" : Object,
}

/**
* Success Callback
*
* @param {Object} request - request
* @param {Object} response - response
* @param {string} response.id - id of the scheduled notification
*/
function scb(request, response) {}

/**
* Error Callback
*
* @param {Object} request - request
* @param {Object} response - response
*/
function fcb(request, response) {}

通知オプションがアプリケーションの動作に及ぼす影響は、ターゲット・プラットフォームによって異なります。詳細は、第24.3.5項「ローカル通知のオプションとアプリケーションの動作に関する必知事項」を参照してください。

- 次のように定義されるcancel。

/**
* Cancel a scheduled local notification
*
* @param {string} notificationId - id of the scheduled notification
*                                  that needs to be canceled
* @param {successCallback} scb - success callback
* @param {errorCallback} ecb - error callback
*/
adf.mf.api.localnotification.cancel(notificationId, scb, ecb);

{var} notificationId : id of notification that is to be canceled.

/**
* Success Callback
*
* @callback successCallback
* @param {Object} request - request
* @param {Object} response - response
* @param {string} response.id - id of the notification
*/

/**
* Error Callback
*
* @callback errorCallback
* @param {Object} request - request
* @param {Object} response - response
*/

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework JSDocリファレンスを参照してください。

24.3.3 DeviceFeaturesデータ・コントロールを使用したローカル通知の管理方法

図24-3に示すDeviceFeaturesデータ・コントロールのaddLocalNotificationおよびcancelLocalNotificationメソッドを使用してローカル通知をスケジュールおよび取消しできます。

図24-3 DeviceFeaturesデータ・コントロールのメソッド

DeviceFeaturesデータ・コントロールの詳細は、第14.11項「DeviceFeaturesデータ・コントロールの使用方法」を参照してください。

24.3.4 ローカル通知の処理方法

ローカル通知の処理を有効にするために、MAFは次のものを提供しています。

- ローカル通知イベントのリスナーを作成するために実装する必要があるEventListenerインタフェース。通知がトリガーされると、onMessageメソッドは通知詳細を指定してコールされます。

NativeLocalNotificationListener implements EventListener {
@Override
public void onOpen(String id) {
}

@Override
public void onMessage(Event event) {
//Application state at the time of this notification
int appState = event.getApplicationState();

//Get local notification event details
if (event instanceof NativeLocalNotificationEvent) {
NativeLocalNotificationEvent localNotificationEvent =
(NativeLocalNotificationEvent) event;
HashMap<String, Object> notification =
localNotificationEvent.getPayloadObject();

// do something with the notification payload, such as navigate
// to an application feature, call a web service, and so on
}

@Override
public void onError(AdfException error) {
}
}

- oracle.adfmf.framework.event.Eventを拡張するNativeLocalNotificationEventクラス。

ローカル通知に関連するイベントを受け取るには、次のように、登録されたApplicationLifeCycleEventListener#startメソッドにリスナーを追加する必要があります。

EventSource evtSource = EventSourceFactory.getEventSource(
EventSourceFactory.NATIVE_LOCAL_NOTIFICATION_EVENT_SOURCE_NAME);
evtSource.addListener(new NativeLocalNotificationListener());

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

24.3.5 ローカル通知オプションとアプリケーションの動作に関する必知事項

表24-2に、ローカル通知オプションをリストし、各オプションに対する特定の値の設定と不適切な設定がMAFアプリケーションの通知動作に与える影響を説明します。

表24-2 ローカル通知オプション

オプション

値

iOSでの動作

Androidでの動作

title

次のいずれかです。

- null

- 未指定

アプリケーション名が通知タイトルとして表示されます。

通知センターの通知タイトルは空白で表示されます。

alert

次のいずれかです。

- null

- 未指定

通知にbadgeやsoundなどの他のプロパティが指定されている場合、通知はオペレーティング・システムに配信されるため、サウンドの再生やアプリケーション・アイコン・バッジの更新が行われますが、通知は通知センターに表示されません。

通知の配信時にアプリケーションがフォアグラウンドで実行されている場合、通知はアプリケーションのローカル通知リスナーに配信されます。

通知はタイトルのあるバナーとして表示されますが、アラート・テキストはありません。

date

次のいずれかです。

- null

- 未指定

- 過去の時刻または日付

通知は即時にトリガーされます。

通知は即時トリガーされます。

repeat

次のいずれかです。

- null

- 未指定

通知は繰り返されません。

通知は繰り返されません。

badge

次のいずれかです。

- null

- 未指定

- 負の数値

通知はアプリケーション・アイコンのバッジを設定しません。

既存のバッジが維持されます。

NA脚注 1

badge

0

既存のバッジがアプリケーション・アイコンから削除されます。

NA 脚注2

sound

SYSTEM_DEFAULT_SOUND以外

エラー・メッセージが表示されます。

通知はサウンドを再生しません。

エラー・メッセージが表示されます。

サウンドは再生されません。

sound

未指定

通知はサウンドを再生しません。

通知はサウンドを再生しません。

vibration

SYSTEM_DEFAULT_VIBRATION以外

NA 脚注3

エラー・メッセージが表示されます。

通知はモバイル・デバイスのバイブレーションをトリガーしません。

vibration

未指定

NA 脚注4

通知はモバイル・デバイスのバイブレーションをトリガーしません。

脚注1 アプリケーション・バッジ設定の概念はありません。設定は無視されます。

脚注2 アプリケーション・バッジ設定の概念はありません。設定は無視されます。

脚注3 バイブレーションは制御できません。設定は無視されます。ただし、通知の受信時にデフォルトのシステム・サウンドを再生することを指定した場合、また、エンド・ユーザーがモバイル・デバイスの「着信時のバイブレーション」設定を有効にした場合、デバイスは通知の受信時にバイブレーションも適用します。

脚注4 バイブレーションは制御できません。設定は無視されます。ただし、通知の受信時にデフォルトのシステム・サウンドを再生することを指定した場合、また、エンド・ユーザーがモバイル・デバイスの「着信時のバイブレーション」設定を有効にした場合、デバイスは通知の受信時にバイブレーションも適用します。

25 データのキャッシュ

この章では、MAFアプリケーションでデータのキャッシュを有効にする方法を説明します。

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

- 第25.1項「データ・キャッシュの概要」

25.1 データ・キャッシュの概要

データのキャッシュは、モバイル・アプリケーションのユーザーに優れたユーザー操作性を提供するための重要な要素です。ユーザーは、モバイル・アプリケーションがいつでも使用でき、機能することを期待します。実際には、モバイル・アプリケーションの接続の信頼性が低いことはよく知られており、ネットワーク接続を使用できなかったり、接続の確立時につながったり切れたりを繰り返し、最終的に切断されることがあります。モバイル・アプリケーションで最適なユーザー操作性を実現するため、MAFには、オフライン時でも継続して機能するアプリケーションを開発できるAPIが用意されているので、モバイル・アプリケーションでの最適なユーザー操作性が保証されます。ネットワーク接続が使用できない場合、モバイル・アプリケーションではローカルに格納されているキャッシュ・データにアクセスして、シームレスなユーザー操作を確保します。

中央からオフラインへのデータ格納はポリシーのセットで、ユーザーのモバイル・アプリケーションがローカル・キャッシュに格納されているRESTリソースをリフレッシュする方法を示すことによって、ユーザー操作性を向上させます。これらのポリシーは、Sync Client SDKにリクエストの処理方法を指示し、サーバーからデータを取得するよりも、オフライン読取りを使用してデバイス上に格納されているデータをフェッチする方がアプリケーションには高速なため、アプリケーションのパフォーマンスを改善できます。また、アプリケーション・キャッシュを有効にし、インタネット接続が使用できない場合にオフライン読取りを有効にすることで、最適なユーザー操作性を維持することもできます。

25.1.1 sync-config.xmlファイルを使用したデータ・キャッシュの実装

MAFに含まれる同期クライアントは、デバイスのMAFアプリケーション内に存在します。同期クライアントは、データをキャッシングするときに特定のポリシーを採用して、URLによって識別されるリソースごとに定義された特定のポリシーを観察することで異なるリソースをキャッシュできるようにします。同期クライアントは、sync-config.xmlファイルで設定されたポリシーを使用してデータをローカルにキャッシュします。データ格納およびキャッシュのポリシー設定を構成する方法の詳細は、第25.1.3項「キャッシュ・ポリシーについて」を参照してください。データ・キャッシュを有効にする方法の詳細は、第25.1.2項「データ・キャッシュを有効にする方法」を参照してください。

sync-config.xmlファイルにより、モバイル・アプリケーションが、JSONペイロードによるRESTを介してアクセスされるサーバー側リソースから取得されたデータをキャッシュできるようになるだけでなく、キャッシュ内のこのデータおよびサーバー側リソースも更新できるようになります。

キャッシュ機能は、アプリケーション・コード内に実装しなくても、sync-config.xmlファイル内のプロパティを編集することで構成可能です。アプリケーションを作成すると、デフォルト・バージョンのsync-config.xmlファイルが格納されます(図25-1を参照)。sync-config.xmlファイルには「アプリケーション・リソース」ペインのADF-META-INFノードからアクセスでき、このファイルを変更するには、JDeveloperのソース・エディタを使用します。MAFランタイムは、デプロイ後にこのファイルを読み取ります。

注意:
これはアプリケーション全体のリソースですが、sync-config.xmlファイルを機能アーカイブ(FAR)ファイルに含めることができます。FARをMAFアプリケーションに追加する場合は、FARのsync-config.xmlファイルがアプリケーションのsync-config.xmlとマージされます。詳細は、第25.1.4項「FARを使用したsync-config.xmlファイルの更新に関する必知事項」を参照してください。

図25-1 sync-config.xmlファイルの概要エディタにおけるデータ格納のポリシー設定

次の例は、デフォルトのsync-config.xmlファイルを示します。

<?xml version="1.0" encoding="UTF-8"?>
<Settings xmlns="http://xmlns.oracle.com/sync/config">
<BaseUri>http://127.0.0.1</BaseUri>
<AppId/>
<LazyPersistence/>
<RefreshPolicy/>
<DbStorageFolderPath/>
<FileStorageFolderPath/>
<Policies>
<DefaultPolicy>
<FetchPolicy>FETCH_FROM_SERVICE</FetchPolicy>
<UpdatePolicy>UPDATE_IF_ONLINE</UpdatePolicy>
<ExpirationPolicy>NEVER_EXPIRE</ExpirationPolicy>
<EvictionPolicy>MANUAL_EVICTION</EvictionPolicy>
</DefaultPolicy>
</Policies>
</Settings>

次の例は、sync-config.xmlファイル内でキャッシュ属性を定義する方法を示します。リクエストは、使用するポリシーを決定するときに、baseUri属性とPath要素を使用して照合されます。

<?xml version="1.0" encoding="UTF-8"?>
<Settings xmlns="http://xmlns.company.com/sync/config">
<BaseUri>http://name.loc.company.com:9100</BaseUri>
<AppId>1</AppId>
<LazyPersistence>false</LazyPersistence>
<MaxCachedFileSize>1024000</MaxCachedFileSize>
<EnableEncryption>false</EnableEncryption>
<Policies>
<ServerGroup id="fusion" baseUri="http://name.loc.company.com:7100/"
<Policy id="fs01">
<Path>/stable/rest/latest/Employees</Path>
<FetchPolicy>FETCH_FROM_SERVICE_ON_CACHE_MISS_OR_EXPIRY</FetchPolicy>
<UpdatePolicy>QUEUE_IF_OFFLINE</UpdatePolicy>
<ExpirationPolicy>NEVER_EXPIRE</ExpirationPolicy>
<EvictionPolicy>EVICT_ON_EXPIRY_AT_STARTUP</EvictionPolicy>
</Policy>
</ServerGroup>
<DefaultPolicy>
<FetchPolicy>FETCH_FROM_SERVICE_ON_CACHE_MISS_OR_EXPIRY</FetchPolicy>
<UpdatePolicy>QUEUE_IF_OFFLINE</UpdatePolicy>
<ExpirationPolicy>EXPIRE_AFTER</ExpirationPolicy>
<ExpireAfter>700</ExpireAfter>
<EvictionPolicy>EVICT_ON_EXPIRY_AT_STARTUP</EvictionPolicy>
</DefaultPolicy>
</Policies>
</Settings>

sync-config.xmlファイル内のプロパティを使用してキャッシュ・ポリシーを構成可能なユース・ケースの一例を次に示します。

- ほとんど変更されない静的リスト(FETCH_FROM_SERVICE_ON_CACHE_MISS_OR_EXPIRY)

- 高度に動的なデータ。結果の文脈依存性が高いため、キャッシュを使用せずにリフレッシュする必要があります(FETCH_FROM_CACHE_SCHEDULE_REFRESHまたはFETCH_FROM_SERVICE_IF_ONLINE)

- 検索結果など、リクエストごとに変更される可能性が高いデータ(FETCH_FROM_SERVICE)

25.1.2 データ・キャッシュを有効にする方法

同期クライアントは、データをキャッシングするときに特定のポリシーを採用して、URLによって識別されるリソースごとに定義された特定のポリシーを観察することで異なるリソースをキャッシュできるようにします。データ・キャッシュを有効にすると、デフォルトのsync-config.xmlファイル内のポリシーが使用されます(ただし、上書きしている場合を除く)。

データ・キャッシュを有効にするには、maf.propertiesファイルで次の行のコメントを外します。

#java.commandline.argument=-DsyncEnabled=true

注意:
データ・キャッシュを有効にすると、ネットワーク経由で渡されたすべてのデータがキャッシュされます。キャッシュを有効にしてアプリケーションをデプロイした後、実行時にオフにする方法はありません。

データ・ストレージ・ポリシー設定の構成の詳細は、第25.1.1項「sync-config.xmlファイルを使用したデータ・キャッシュの実装」を参照してください。

25.1.3 キャッシュ・ポリシーについて

モバイル・アプリケーションのキャッシュ・ポリシーはsync-config.xmlファイルで定義します。ポリシーを組み合せて、あらゆるモバイル・アプリケーションに適切なコンテンツを提供します。

データ・ストレージ・ポリシー設定の構成の詳細は、第25.1.1項「sync-config.xmlファイルを使用したデータ・キャッシュの実装」を参照してください。

アプリケーションのキャッシュ動作を構成できるポリシーは、次のグループの配下にあります。

- フェッチ・ポリシー: Sync Client SDKに対して、(サーバー、ローカル・キャッシュ、この2つの組合せなどから)リソースをフェッチするように指示します。該当するポリシーのリストは、表25-1を参照してください。

- 有効期限ポリシー: Sync Client SDKがローカル・キャッシュに格納されているリソースを期限切れまたは失効しているものとして注記し、これにより、更新ポリシー(表25-4を参照)に従って更新するか、削除ポリシー(表25-3を参照)に従ってローカル・キャッシュから削除する必要が生じるまでの期間(秒単位)を設定します。有効期限ポリシーの詳細は、表25-2を参照してください。

- 削除ポリシー: Sync Client SDKがローカル・キャッシュに格納されているリソースを削除するタイミングを指定します。削除ポリシーが適用されるのはローカル・キャッシュ内のデータのみで、サーバー側のリソースには適用されません。ポリシーのリストは、表25-3を参照してください。

- 更新ポリシー: ローカル・キャッシュに格納されている有効期限切れのリソースを更新するタイミングを定義します。ポリシーのリストは、表25-4を参照してください。

表25-1 フェッチ・ポリシー

ポリシー

説明

キャッシュからフェッチ

サーバーからではなく、キャッシュからのみデータをフェッチするよう、Sync Client SDKに指示します。キャッシュ内でデータが見つからない場合、Sync Client SDKはエラーまたはNULLオブジェクトを返します。このポリシーを適用すると、Sync Client SDKはデータをキャッシュから直接取得するので、クライアント・アプリケーションがオンラインでもオフラインでも、このポリシーを実行できます。

サービスからフェッチ

キャッシュからではなく、サーバーからのみデータを直接フェッチするよう、Sync Client SDKに指示します。Sync Client SDKがこのポリシーを適用できるのは、クライアント・アプリケーションがオンラインの場合のみです。それ以外は、クライアント・アプリケーションにエラーまたはNULLオブジェクトを返します。

サービスからフェッチ(オンラインの場合)

クライアント・アプリケーションがオンラインの場合はサーバーからデータをフェッチし、アプリケーションがオフラインの場合はキャッシュからデータをフェッチするよう、Sync Client SDKに指示します。

サービスからフェッチ(キャッシュ・ミス時)

キャッシュからデータをフェッチするよう、Sync Client SDKに指示します。リクエスト・データが見つからない場合、Sync Client SDKはそのデータをサーバーからフェッチします。

サービスからフェッチ(キャッシュ・ミスまたは失効時)

データがキャッシュ内にあり、失効(有効期限切れ)していない場合はキャッシュ内のデータをフェッチするよう、Sync Client SDKに指示します。それ以外は、Sync Client SDKはリクエスト・データをサーバーからフェッチします。

キャッシュからフェッチ(リフレッシュのスケジュール)

キャッシュからデータをフェッチし、サーバーの最新のコピーからキャッシュを更新するためのバックグラウンド・リフレッシュをスケジュールするよう、Sync Client SDKに指示します。キャッシュ・ミス(キャッシュにリクエスト・データが存在しないこと)が発生した場合、Sync Client SDKはクライアント・アプリケーションにNULLオブジェクトを返します。

フェッチとリフレッシュ

Sync Client SDKに、次のように指示します。

- リクエスト・データがあり、有効期限が切れていない場合は、キャッシュからデータをフェッチします。

- サーバーの最新のコピーからキャッシュを更新するためのバックグラウンド・リフレッシュをスケジュールします。

キャッシュ・ミス(キャッシュにリクエスト・データが存在しないこと)が発生した場合、またはデータが期限切れの場合、Sync Client SDKはサービスからフェッチポリシーの場合と同様に、サーバーから直接データをフェッチします。

表25-2 有効期限ポリシー

ポリシー

説明

再起動時に失効

クライアント・アプリケーションの再起動時に、任意のURIのデータを有効期限切れとして注記するか、クライアント・アプリケーションがローカル・データを次回呼び出したときに、そのデータをサーバー・コピーで更新するよう、Sync Client SDKに指示します。

失効までの時間

失効までの存続期間ポリシーで設定されている指定の時間(秒単位)が経過した後にデータを有効期限切れにするよう、Sync Client SDKに指示します。このポリシーは、定期的にリフレッシュされるデータに使用します。

失効までの存続期間

キャッシュ内のデータが期限切れになったことをSync Client SDKが注記するまでの秒数。

有効期限なし

ローカル・データを有効期限切れとして指定できないことをClient Sync SDKに指示します。

表25-3 削除ポリシー

ポリシー

説明

起動時に有効期限切れで削除

クライアント・アプリケーションの再起動時に、有効期限切れのデータをキャッシュから削除するか、クライアント・アプリケーションがローカル・データを次回呼び出したときに、そのデータをサーバー・コピーで更新するよう、Sync Client SDKに指示します。

手動削除

Sync Client SDKではローカル・キャッシュから自動的にデータを削除できません。手動でデータを削除するには、APIを使用します。

表25-4 更新ポリシー

ポリシー

説明

オンラインの場合に更新

クライアント・アプリケーションがオンラインの場合のみ、ローカル・キャッシュをサーバー側のデータで更新するよう、Sync Client SDKに指示します。それ以外は、Sync Client SDKがエラーを返します。

オフラインの場合にキューに格納

クライアント・アプリケーションがオンラインの場合に、ローカル・キャッシュをサーバー側のデータで更新するよう、Sync Client SDKに指示します。クライアント・アプリケーションがオフラインの場合、Sync Client SDKは操作をキューに格納して、クライアント・アプリケーションが再度オンラインになったときにローカル・キャッシュを更新できるようにします。

注意: このポリシーは現在サポートされていません。

25.1.4 FARを使用したsync-config.xmlファイルの更新に関する必知事項

ビュー・コントローラ・プロジェクトがFARとしてデプロイされると、sync-config.xmlファイルは機能アーカイブ・ファイルに含まれます。connections.xmlファイルと同様に、FARをアプリケーションに追加すると、MAFではFAR (jar-sync-config.xml)内のsync-config.xmlファイルの内容と、使用するアプリケーションのsync-config.xmlファイルの内容をマージします。sync-config.xmlファイルは、モバイル・アプリケーションによって使用されるWebサービスのエンドポイントを記述するため、モバイル・アプリケーションを構成するアプリケーション機能によって使用されるすべてのWebサービスのエンドポイントを、FARを追加することで更新できます(第8.4項「FARのビュー・コントローラ・プロジェクトとしての追加時に行われる処理」を参照)。

FARをアプリケーションに追加すると、MAFでは、アプリケーションのsync-config.xmlファイルおよびconnections.xmlファイルを確認し、必要に応じて変更するように求めるメッセージがログに記録されます。図25-2に示すように、これらのメッセージは、使用するアプリケーションのsync-config.xmlファイルの状態を反映します。

図25-2 メッセージ・ログ

使用するアプリケーションにsync-config.xmlファイルがない場合、MAFではこのファイルをアプリケーションに追加し、次のようなメッセージを書き込みます。

oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logNoSyncConfigInAppUsingFar
WARNING: The application does not contain a synchronization file, "sync-config.xml". Creating one
containing the synchronization configuration in the Feaure Archive.

sync-config.xmlファイルの<ServerGroup>要素に、使用するアプリケーションのconnections.xmlファイルで定義された対応する<Reference>要素がない場合、MAFでは接続の確認(または作成)をリクエストする次のようなログ・メッセージを書き込みます。

oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logAddedServerGroups
WARNING: The following server groups were added sync-config.xml by the Add to Application
operation:
{
ServerGroup1 - there is no existing application connection defined for this server group.
Please create the connection.

ServerGroup2 - verify its configuration.
}

使用するアプリケーションのsync-config.xmlファイルの<ServerGroup>定義が、FAR内の対応するsync-config.xmlファイルの定義を複製する場合、MAFでは次のSEVEREレベルのメッセージをログに書き込みます。

oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logDuplicateServerGroups
SEVERE: Cannot merge the server groups from the Feature Archive because the following definitions
already exist:
ServerGroup1
ServerGroup2

26 MAFアプリケーションでのエラー・メッセージの表示

この章では、AdfExceptionクラスを使用してエラーを呼び出す方法とエラー・メッセージをローカライズする方法について説明します。

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

- 第26.1項「MAFアプリケーションでのエラー処理の概要」

- 第26.2項「エラー・メッセージの表示およびバックグラウンド・スレッドの停止」

- 第26.3項「エラー・メッセージのローカライズ」

26.1 MAFアプリケーションでのエラー処理の概要

モバイル・アプリケーションから発生するエラーは、リモート・サーバーへの接続の失敗のように予期しないものである場合と、アプリケーション・ビジネス・ルールの違反のように予期されるものである場合があります。エラーまたは例外は、プライマリ・リクエスト・スレッド内またはバックグラウンド・タスクで実行されるセカンダリ・スレッド内で発生する可能性があります。アプリケーションで複数言語がサポートされている場合、エラー・メッセージはユーザーの言語で表示される必要があります。

MAFアプリケーションが例外をスローできるようにするには、oracle.adfmf.framework.exception.AdfExceptionクラスを使用します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

次のコードにより、MAFで例外を正常に処理できるようになります。図26-1に示すようなポップアップ・メッセージがアプリケーション内に表示され、メッセージの重大度と説明テキストが示されます。

throw new AdfException("My error message", AdfException.ERROR);

図26-1 エラー・メッセージ

注意:
マネージドBeanまたはデータ・コントロールBean内で例外がスローされると、アプリケーション内に類似のエラー・メッセージが表示されます。

26.2 エラー・メッセージの表示およびバックグラウンド・スレッドの停止

次の例に示すMessageUtilsクラスを使用すると、アプリケーションで最初にJavaScriptコール(invokeContainerJavaScriptFunction)を実行してから例外をスローすることにより、スレッドを停止してエラーを表示することができます。addMessageメソッドは、エラーを表示できるようにします。詳細は、第26.2.1項「アプリケーションによるバックグラウンド・スレッド例外のエラー・メッセージの表示方法」を参照してください。また、第B.2.19項「invokeContainerJavaScriptFunction」も参照してください。

MessageUtilsクラスはBundleFactoryおよびUtilityメソッドを使用してリソース・バンドルおよびエラー・メッセージを取得し、バックグラウンドでスレッドが実行されているかどうかを動的にチェックします。このクラスを使用すると、メイン・スレッドからバックグラウンド・スレッドにコードを移動できます。

package oracle.errorhandling.demo.mobile;

import java.util.ResourceBundle;

import oracle.adfmf.framework.api.AdfmfContainerUtilities;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.framework.exception.AdfException;
import oracle.adfmf.util.BundleFactory;
import oracle.adfmf.util.Utility;

public class MessageUtils {

public static void handleError(AdfException ex) {
handleMessage(ex.getSeverity(), ex.getMessage());
}

public static void handleError(String message) {
handleMessage(AdfException.ERROR, message);
}
public static void handleError(Exception ex) {
handleMessage(AdfException.ERROR, ex.getLocalizedMessage());
}

public static void handleMessage(String severity, String message) {
if (AdfmfJavaUtilities.isBackgroundThread()) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(
AdfmfJavaUtilities.getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {severity,
null,
null});
if (AdfException.ERROR.equals(severity)) {
// need to throw an exception to stop background thread processing
throw new AdfException(message,severity);
}
}
else {
throw new AdfException(message,severity);
}
}

public static void addJavaScriptMessage(String severity, String message) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(
AdfmfJavaUtilities.getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {severity,
message,
null,
null });
}

}

26.2.1 アプリケーションによるバックグラウンド・スレッド例外のエラー・メッセージの表示方法

アプリケーションは、バックグラウンド・スレッドに対して例外がスローされたときにエラー・メッセージを表示しません。このような状況でエラー・メッセージを表示できるようにするために、アプリケーションはaddMessageメソッドをコールします。addMessageメソッドは次のパラメータを取ります。

- エラーの重大度

- サマリー・メッセージ

- 詳細メッセージ

- clientComponentId

次の例は、addMessageメソッドを使用して、バックグラウンドでエラーが発生したときにアプリケーションがユーザーにアラートを出せるようにする方法を示しています。

Runnable runnable = new Runnable() {
public void run() {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(
AdfmfJavaUtilities.getFeatureName(),
"adf.mf.api.amx.addMessage", new Object[] {AdfException.ERROR,
"My error message for background thread",
null,
null });
}
};
Thread thread = new Thread(runnable);
thread.start();

adf.mf.api.amx.addMessage JavaScript関数は、アプリケーションがプライマリ・リクエスト・スレッドでAdfExceptionをスローするときに使用されるメソッドと同じであるため、エラー・メッセージがメイン・スレッドの例外またはバックグラウンド・スレッドからの例外のいずれを参照しているかにかかわらず、ユーザーは同じポップアップ・エラー・メッセージを受け取ります。

注意:
前の例に示したとおり、詳細メッセージおよびclientComponentIdはNull値にすることができます。詳細メッセージは、サマリー・メッセージと同じフォント・サイズで、新しい行に表示されます。

ただし、次の例に示されているように、バックグラウンド・スレッドで実行されるJavaロジック内にコードを配置すると、エラー・メッセージを表示しないようにできます。第26.3項「エラー・メッセージのローカライズ」の最初の例に示すメソッドを使用すると、ユーザーに通知せずにバックグラウンド・スレッドをサイレントに停止できます。

Runnable runnable = new Runnable() {
public void run() {
// this exception will be lost because no popup error
// message will display in the MAF application
throw new AdfException("My (lost) error message in background",
AdfException.ERROR);
}
};
Thread thread = new Thread(runnable);
thread.start();

26.3 エラー・メッセージのローカライズ

MAFは標準Javaリソース・バンドルを使用して、アプリケーション・ユーザーの言語で例外エラー・メッセージを表示します。次の例に示すとおり、リソース・バンドル名(.xlfファイル)およびバンドル・メッセージ・キーがAdfExceptionコンストラクタ・メソッドに渡され、リソース・バンドルからエラー・メッセージを読み取ることができるようになります。

private static final String XLF_BUNDLE_NAME=
"oracle.errorhandling.mobile.ViewControllerBundle";
throw new AdfException(AdfException.ERROR,
XLF_BUNDLE_NAME,
"MY_ERROR_MESSAGE",
null);

アプリケーションがMissingResourceExceptionエラーをスローしないようにするには、oracle.adfmf.util.BundleFactoryメソッドを使用してリソース・バンドルを取得してから、oracle.adfmf.util.Utilityメソッドを使用してエラー・メッセージを取得します(次の例を参照)。

ResourceBundle bundle = BundleFactory.getBundle(XLF_BUNDLE_NAME);
String message = Utility.getResourceString(bundle, "MY_ERROR_MESSAGE",null);
throw new AdfException(message,AdfException.ERROR);

次の例は、adf.mf.api.amx.addMessage JavaScript関数を使用して、バックグラウンド・スレッドから例外がスローされたときにローカライズされたエラー・メッセージを表示する方法を示しています。

ResourceBundle bundle = BundleFactory.getBundle(XLF_BUNDLE_NAME);
String message = Utility.getResourceString(bundle, "MY_ERROR_MESSAGE_BG",null);
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(
AdfmfJavaUtilities.getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {AdfException.ERROR,
message,
null,
null });

27 MAFアプリケーションのデプロイ

この章では、テストと公開のためのMAFアプリケーションのデプロイ方法について説明します。

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

- 第27.1項「MAFアプリケーションのデプロイメントの概要」

- 第27.2項「デプロイメント・プロファイルでの作業」

- 第27.3項「Androidアプリケーションのデプロイ」

- 第27.4項「iOSアプリケーションのデプロイ」

- 第27.5項「機能アーカイブ・ファイル(FAR)のデプロイ」

- 第27.6項「モバイル・アプリケーション・アーカイブ・ファイルの作成」

- 第27.7項「署名されていないデプロイメント・パッケージの作成」

- 第27.8項「コマンド行からのMAFアプリケーションのデプロイ」

- 第27.9項「Oracle Mobile Security Suite (OMSS)でのデプロイ」

27.1 MAFアプリケーションのデプロイメントの概要

エンド・ユーザーに配布するためにアプリケーションを公開する前に、シミュレータまたは実際のデバイスでこれをテストして、その動作と使いやすさを評価する必要があります。MAFでは、iOSアプリケーション・バンドル(.ipaまたは.appファイル)またはAndroidアプリケーション・パッケージ(.apk)・ファイルをプラットフォームに適したデバイスまたはシミュレータにデプロイすることで、App Store (Apple iTunes)またはアプリケーション・マーケットプレイス(Google Playなど)に公開する前にアプリケーションをテストできます。

27.1.1 MAFデプロイメント・オプション

MAFでは、プロジェクトをデプロイする場合、プラットフォーム固有のテンプレート・アプリケーションを一時的な場所にコピーした後、MAFプロジェクト内で定義されたコード、リソースおよび構成を使用して、そのアプリケーションを更新します。その後、MAFでは、ターゲット・プラットフォームのツールを使用して、アプリケーションをビルドおよびデプロイします。モバイル・アプリケーションをプラットフォーム固有パッケージ(iOSの場合は.ipa、Androidの場合は.h)としてデプロイでき、このパッケージは、ダウンロード・サイトや、Apple App Store、Google Playなどのアプリケーション・マーケットプレイスから利用できるようにします。テストおよびデバッグの目的で、シミュレータまたはデバイスにデプロイできます。ビュー・コントローラ・プロジェクトを機能アーカイブ(FAR)としてデプロイすることで、アプリケーション機能を再利用できます。また、モバイル・アプリケーション・アーカイブ(.maa)ファイルとしてデプロイすることで、モバイル・アプリケーション全体を再利用することもできます。

27.1.1.1 プロジェクト・ライブラリのデプロイメント

「ライブラリとクラスパス」ダイアログ(図27-1を参照)を使用してプロジェクトに宣言するライブラリは、そのプロジェクトのデプロイメント・アーティファクトに含まれます。このダイアログにより、アプリケーション機能は実行時にこれらのライブラリにアクセスすることが可能になります。

図27-1 プロジェクトへのライブラリの追加

27.1.1.2 JVMライブラリのデプロイメント

AndroidアプリケーションとiOSアプリケーションのどちらの場合も、それぞれのMAFデプロイメントには、デプロイメントのタイプ(リリースまたはデバッグ)とデプロイメント・ターゲット(シミュレータまたは実際のデバイス)の組合せに固有の異なるライブラリのセットが含まれています。さらに、それぞれのライブラリ・セットには、JVMのJARファイルが含まれます。アプリケーションのバインディング・レイヤーは、Objective-Cライブラリのコレクションであるこの仮想マシン内にあります。たとえば、MAFは、iOSシミュレータをターゲットとするデバッグ・デプロイメントに対して、JVM JARファイルと一連のライブラリをデプロイしますが、実際のiOSデバイスをターゲットとするデバッグ・デプロイメントに対しては、異なるJVM JARファイルと一連のライブラリをデプロイします。

27.2 デプロイメント・プロファイルでの作業

デプロイメントのためにモバイル・アプリケーションを準備する際は、最初に、プラットフォーム固有のデプロイメント・プロファイルを作成します。デプロイメント・プロファイルでは、iOSデバイス、Androidデバイス、iOSシミュレータまたはAndroidエミュレータにデプロイするアプリケーションをアーカイブにパッケージ化する方法を定義します。デプロイメント・プロファイルは次を行います。

- アーカイブの形式と内容を指定します。iOSのアーカイブ形式は、アプリケーション・バンドルとして知られている.ipaファイルになります。Androidのアーカイブ形式は、Androidアプリケーション・パッケージ(.apk)・ファイルになります。

注意:
.apkファイルはアーカイブ互換です。つまり、WinZipまたは7-Zipのようなアーカイブ・ツールを使用して、その内容を表示できます。

- アーカイブ・ファイルへのパッケージ対象となるソース・ファイル、デプロイメント・ディスクリプタおよびその他の補助ファイルをリストします。

- 作成されるアーカイブ・ファイルのタイプおよび名前を記述します。

- 依存情報、プラットフォーム固有の指示およびその他の情報を示します。

27.2.1 自動的に生成されるデプロイメント・プロファイルについて

アプリケーションを作成すると、MAFによって、デフォルトの設定とイメージ・ファイルでシードされたデプロイメント・プロファイルが生成されます。環境を正しく構成した場合、これらのプロファイルを使用して、MAFアプリケーションを作成直後にデプロイできます。これを行うには、図27-2に示すように、「アプリケーション」を選択した後、「デプロイ」を選択します。

図27-2 デフォルトのデプロイメント・プロファイル

その後、「デプロイメント・アクション」ページ(図27-3を参照)を使用し、適切なデプロイメント・ターゲットを選択します。

図27-3 デプロイメント・ターゲットの選択

注意:
iOSおよびAndroidアプリケーションをデプロイする場合、それらの環境設定と構成に関する要件はそれぞれ異なります。詳細は、第27.3項「Androidアプリケーションのデプロイ」および第27.4項「iOSアプリケーションのデプロイ」を参照してください。

図27-2に示すように、MAFでは、サポートされる両方のプラットフォーム(iOSとAndroid)に対応したアプリケーション・レベルのプロファイルが作成され、それらにiOS1およびAndroid1という名前が付けられます。

注意:
MAFでは、新しいデプロイメント・プロファイルが作成されるたびに、その名前に付加される数字が1ずつ増加します。たとえば、iOS2、iOS3のようになります。

これらのプロファイルに使用されているデフォルト値をそのまま使用するか、編集します。MAFアプリケーション・プロファイル用に構成する値の詳細は、第27.2.4項「Androidデプロイメント・プロファイルの作成方法」および第27.2.5項「iOSデプロイメント・プロファイルの作成方法」を参照してください。

図27-4 デフォルトのデプロイメント・プロファイルの編集

MAFでは、アプリケーション・コントローラ・プロジェクトとビュー・コントローラ・プロジェクトは、別々の機能アーカイブ(FAR)ファイルとしてパッケージ化されます。このようなMAFファイルのJARファイルは、他のアプリケーションのリソースとして使用されます(第27.5項「機能アーカイブ・ファイル(FAR)のデプロイ」を参照)。MAFでは、これらのFARファイルがMAFアプリケーション・プロファイルへの依存性として作成されるため、「アプリケーションのプロパティ」ダイアログの「プロファイルの依存性」ページを使用して、これらのファイルを追加または除外できます(図27-5を参照)。

注意:
アプリケーション・コントローラ・プロジェクトに含まれるFARプロファイルの依存性は1つである必要があります。そうでない場合、デプロイメントは失敗します。

図27-5 MAFプロジェクトからのFARコンテンツの編集

「プロジェクト・プロパティ」ダイアログのファイル・グループに関連するページを使用すると、ビュー・コントローラのFARファイルに含まれるコンテンツをカスタマイズできます(図27-6を参照)。「プロジェクト・プロパティ」ダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプおよびOracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のデプロイメント・プロファイルの構成に関する項を参照してください。

図27-6 ビュー・コントローラ・プロジェクトのFARの編集

MAFでは、プラットフォーム固有のデプロイメント・プロファイルに加えて、MAFアプリケーションをMAFアプリケーション・アーカイブ(.maa)・ファイルとしてパッケージ化するために使用できるデプロイメント・プロファイルも作成されます。このファイルを使用すると、.maaファイルとしてパッケージ化された既存のアプリケーションを使用する新しいMAFアプリケーションを作成できます。詳細は、第27.6項「モバイル・アプリケーション・アーカイブ・ファイルの作成」および第27.7項「署名のないデプロイメント・パッケージの作成」を参照してください。

このデプロイメント・ファイルには、MAFアプリケーション名に_archiveが続く形式の名前がデフォルトで付けられます。図27-2に示すように、このプロファイルはEmployees_archiveと呼ばれ、必要に応じ、「アプリケーションのプロパティ」ダイアログを使用して編集できます。

図27-7 「アプリケーションのプロパティ」ダイアログを使用したデフォルトのデプロイメント・プロファイルの編集

「アプリケーションのプロパティ」ダイアログのページを使用したデプロイメント・プロファイルの編集の詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のデプロイメント・プロファイルのプロパティの表示と変更に関する項と、Oracle JDeveloperオンライン・ヘルプの「アプリケーションのプロパティ」および「プロジェクト・プロパティ」ダイアログに関する項を参照してください。

27.2.2 デプロイメント・プロファイルの作成方法

第27.2.1項「自動的に生成されたデプロイメント・プロファイルについて」に記載されているとおり、MAFでは、モバイル・アプリケーションが作成されたときに、デプロイメント・プロファイルのセットを作成します。これらのプロファイルを使用してアプリケーションをデプロイしたり、それらのプロファイルを編集したり、MAF固有のデプロイメント・プロファイル・ページを使用して新しいプロファイルを構成できます。デプロイメント・プロファイルの作成ウィザード(図27-8を参照)を使用して、それらのページからデフォルトのデプロイメント・プロファイルを作成できます。デプロイメント・プロファイルは、必要な数だけ作成できます。これらの標準デプロイメント・プロファイル・ページの詳細は、「ヘルプ」をクリックしてJDeveloperオンライン・ヘルプを参照してください。

注意:
MAFアプリケーションのデプロイメントでは、アプリケーションレベルのデプロイメント・プロファイルの作成のみが必要とされるので、ビュー・コントローラレベルのデプロイメント・プロファイルを作成する必要はありません。

始める前に

JDeveloperでモバイル・アプリケーションをデプロイできるようにするには、『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』のプラットフォームとフォーム・ファクタに応じた開発環境の構成に関する項の説明に従って、ターゲット・プラットフォーム用のSDKを指定する必要があります。

ヒント:
iOSデプロイメントの場合は、iTunesおよびiOSシミュレータを1回以上実行してから、それらのディレクトリの場所を構成します。

デプロイメント・プロファイルを作成する手順は、次のとおりです。

1. 「アプリケーション」→「デプロイ」を選択します。

2. 「新規デプロイメント・プロファイル」を選択します。

3. ターゲット・プラットフォームに応じて、「Android用MAF」、「iOS用MAF」または「MAFアプリケーション・アーカイブ」を選択します(図27-8を参照)。

4. プロファイルのデフォルト名をそのまま使用するか、新しい名前を入力します。「OK」をクリックします。

5. 必要な場合は、「オプション」ページと「アプリケーション・イメージ」ページを適宜使用して、「OK」をクリックします。

図27-8 「デプロイメント・プロファイルの作成」ウィザード

27.2.3 デプロイメント・プロファイルの作成時の処理

ウィザードが完了すると、JDeveloperによってデプロイメント・プロファイルが作成され、デプロイメント・プロファイルのプロパティ・エディタが開きます。

表27-1に、デプロイメント・プロファイルのプロパティ・エディタのMAFに固有のページ(図27-10を参照)をリストします。

表27-1 MAF固有のデプロイメント・プロファイル・ページ

ページ

機能

iOSオプション

iOSデバイスまたはiOSシミュレータにデプロイされるアプリケーションの設定を変更できます。

Androidオプション

AndroidデバイスまたはAndroidエミュレータにデプロイされるアプリケーションの設定を変更できます。

アプリケーション・イメージ

適切なグラフィックス・ファイルを追加することで、アプリケーションにカスタム・アイコンを割り当てられます。

デバイスの向き

アプリケーションの表示をデバイスの特定の向きに制限できます。このページはiOSデプロイメント・プロファイルのみに使用されます。

注意:
デプロイメントはアプリケーションのニーズによって異なります。表27-1にリストされたページにシードされたデフォルト値を使用してアプリケーションをデプロイできます。

アプリケーションをデプロイすると、JDeveloperによってデプロイメント・ディレクトリと関連するサブディレクトリが作成されます。さらに、ビュー・コントローラ・プロジェクト(異なる名前が付いている必要があります)とアプリケーション・コントローラ・プロジェクトの両方の機能アーカイブ・ファイル(FAR)が作成されます。これら2つのFARに加え、プロジェクトにインポートされたすべてのFARのコピーがJDeveloperによって作成されます。コンパイル・プロファイルを変更する際は、デプロイメント・ディレクトリを削除する必要があります。「ビルド」→「すべてクリーン」を選択することで、このディレクトリに加え、FARを含むビュー・コントローラ・プロジェクト内のデプロイメント・ディレクトリを削除できます。

27.2.4 Androidデプロイメント・プロファイルの作成方法

デプロイメント・プロファイルによって、Androidデバイスまたはエミュレータへのアプリケーション・デプロイメントのためのテンプレートまたはAndroidアプリケーション・パッケージ(.apk)・ファイルとしてアプリケーションを作成するためのテンプレートが作成されます。Androidのデプロイメント・プロファイルを作成するには、アプリケーションの署名オプションとjavacコンパイラの動作を定義し、必要な場合はアプリケーション・アイコンに使用されるデフォルトOracleイメージをカスタム・イメージでオーバーライドします。

始める前に

『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』のAndroid SDKのインストール方法に関する項の説明に従って、Android SDKをダウンロードしてインストールします。

Androidエミュレータにデプロイする場合は、Android開発者のWebサイト(http://developer.android.com/tools/devices/index.html)で入手可能な「Managing Virtual Devices」の説明に従い、Android Virtual Device Managerを使用して各エミュレータ・インスタンスの仮想デバイスを作成する必要があります。

SDKおよびプラットフォーム用の場所のMAFプリファレンスも設定する必要があり、これはAndroid SDKパッケージ・ダウンロードの一部になっています。

AndroidプラットフォームSDK用のMAFプリファレンスを設定するには、次の手順を実行します。

1. JDeveloperのメイン・メニューから「ツール」→「プリファレンス」を選択して、「プリファレンス」を開きます。

2. 図27-9に示すように、「プリファレンス」ダイアログのツリーから「モバイル・アプリケーション・フレームワーク」→「Androidプラットフォーム」を選択し、Androidのプリファレンス・ページを開きます。

- 次の項目を指定します。

- コンピュータ上のAndroid SDKの場所。

- ターゲットのAndroidプラットフォームのローカル・ディレクトリ。

- コンピュータ上のAndroidビルド・ツールの場所。

- 署名資格証明に関する情報。

図27-9 Android SDK、プラットフォームおよび署名プロパティの設定

注意:
プッシュ通知には、Android 4.0.3 (API 15)プラットフォーム(またはそれ以降)を実行しているデバイスとエミュレータが必要です。エミュレータ上でプッシュ通知を有効にするには、Google Playストアがこれらのデバイスにインストールされ、Google APIがSDKにインストールされている必要があります。ユーザーはGoogleアカウントを作成(およびログイン)している必要があります。
Android開発者のWebサイト(http://developer.android.com/index.html)で入手可能な『Google Cloud Messaging for Android』の「GCM Architectural Overview」も参照してください。

「Androidプラットフォーム」ページを使用して、AndroidプラットフォームにデプロイするMAFアプリケーションの署名に使用されるキーのデバッグおよびリリース・プロパティも定義します。続いて、デプロイメント・プロファイル内で、モバイル・アプリケーションのリリース・タイプをデバッグまたはリリースに指定します。署名キー・プロパティは一度定義するのみでかまいません。詳細は、第27.2.4.3項「Android署名オプションの定義」を参照してください。また、Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で入手可能な「Signing Your Applications」で、アプリケーションの公開に関する情報も参照してください。

27.2.4.1 アプリケーションの詳細オプションの設定

Androidの「アプリケーションの詳細」ページ(図27-10を参照)では、アプリケーション・バンドルID、アーカイブ名、バージョン名およびバージョン・コードを指定できます。

図27-10 デプロイメント・プロファイルのプロパティ・エディタ(Androidの「アプリケーションの詳細」)

アプリケーションの詳細を設定するには:

1. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

2. 「デプロイメント」ページで、デプロイメント・プロファイルをダブルクリックします。

3. 「Androidオプション」→「アプリケーションの詳細」を選択します(図27-10を参照)。

4. デフォルト値をそのまま使用するか、次のオプションを定義します。

- アプリケーション・バンドルID: maf-application.xmlファイルのid属性で設定されるアプリケーションの一意のID。Androidデバイスにデプロイされる各アプリケーションには、一意のIDがあります。このIDを数字から始めたり、空白を含めることはできません。必要に応じて、この値を別の値で上書きできます(ただし、値が一意でIDのガイドラインに準拠している必要があります)。詳細は、第3.2項「MAFアプリケーションの表示プロパティの設定」を参照してください。

注意:
Androidデバイスまたはエミュレータにアプリケーションが正しくデプロイされるようにするには、IDの先頭を数字やピリオドではなく、文字にする必要があります。たとえば、IDが925090のように(com.company.925090)完全に数値で構成されている場合、アプリケーションはデプロイできません。hello925090などの文字で始まるIDであれば(com.company.hello925090)、デプロイメントは正常に実行できます。

- アプリケーション・アーカイブ名: 必要に応じて、MAFによって作成された.apkファイルの名前を入力します。または、デフォルトの名前を使用します。
MAFのデフォルトでは、.apkファイルの名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第3.2項「MAFアプリケーションの表示プロパティの設定」を参照してください。

- バージョン名: ユーザーに表示されるアプリケーション・コードのリリース・バージョン。たとえば、これがアプリケーションの2番目のバージョンである場合は、「2.0」と入力します。デバイスまたはデバイス・シミュレータにアプリケーションをデプロイすると、ここで入力した値がアプリケーション情報ダイアログに表示されます(Androidデバイスの「App Info」画面など)。

- バージョン・コード: アプリケーション・コードのバージョンを表す整数値。これは、他のアプリケーションによってプログラムで、アップグレードかダウングレードかチェックされます。デフォルトは1で、これが最小の値です。任意の値を選択し、リリースごとに1つずつ値を増やすことができます。

注意:
バージョン名とバージョン・コードの詳細は、Android開発者のWebサイト(http://developer.android.com/tools/publishing/versioning.html)で入手可能な「Versioning Your Applications」ドキュメントを参照してください。

27.2.4.2 デプロイメント・オプションの設定

「オプション」ページ(図27-4を参照)では、javacコンパイラ・ツール・オプションによって渡される値、zipalignオプションおよびAndroid APIレベルを設定できます。

Androidデプロイメント・オプションを設定するには:

1. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

2. 「デプロイメント」ページで、デプロイメント・プロファイルをダブルクリックします。

3. 「Androidオプション」(図27-4を参照)を選択します。

4. デフォルト値をそのまま使用するか、次のオプションを定義します。

- ソース・ファイル: ドロップダウン・リストからJDK互換性レベルを選択します。この値は、デプロイメントでjavacツールを実行し、javac -sourceオプションを使用してR.java (アプリケーション・リソースの参照用にAndroidによって生成されたファイル)をコンパイルする際に指定されます。
R.javaの詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/resources/accessing-resources.html)で入手可能な「Accessing Resources」を参照してください。

- クラス・ファイル: ドロップダウン・リストから、コンパイルされた.classファイルのJDKバージョンの互換性を選択します。この値は、デプロイメントでjavacツールを実行し、javac -targetオプションを使用してR.javaファイルをコンパイルする際に指定されます。

- 文字エンコーディング: コンパイラがASCII文字セット以外の文字を解釈する方法を制御するネイティブエンコーディング名を選択します。デフォルトは、UTF-8です。

- Zipアラインメントの最適化: .apkファイルのパッケージングを最適化するバイト位置合せ(32ビットまたは64ビット)を選択します。32ビット(デフォルト)を選択すると、4バイト境界の位置合せが提供されます。データ・マニフェストなど、各アプリケーション・パッケージに格納されるデータ・ファイルは、Androidオペレーティング環境内の複数プロセスによって絶えずアクセスされます。詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/zipalign.html)で入手可能な「zipalign」を参照してください。

- 優先記憶域の場所: デプロイ済アプリケーションの記憶域オプションを選択します。デフォルトでは、モバイル・アプリケーションは、JDeveloperからデバイスにデプロイされた後またはGoogle Playなどのアプリケーション・マーケットプレイスからダウンロードされた後、デバイスの内部記憶域に格納されます。次のオプションでは、モバイル・アプリケーションの優先記憶域の場所を指定できます。
内部: モバイル・アプリケーションをデバイスの内部記憶域に強制的にインストールします。

外部: アプリケーションをデバイスのSDカードにインストールできます。ただし、Androidシステムは、SDカードにアプリケーションをインストールできないことを検出した場合(たとえば、SDカードがマウントされていない場合や、SDカードは存在するものの十分な領域がない場合)、かわりにアプリケーションをデバイスの内部記憶域にインストールします。モバイル・デバイス・ユーザーは、システム設定を使用して、内外の記憶域間でアプリケーションを移動できます。

自動: アプリケーションをデバイスの外部記憶域または内部記憶域にインストールできることを指定します。モバイル・デバイス・ユーザーは、システム設定を使用して、内外の記憶域間でアプリケーションを移動できます。

「外部」オプションまたは「自動」オプションを選択すると、デプロイメント・フレームワークによってAndroidManifest.xmlファイルの<manifest>要素がandroid:installLocation属性、および"preferExternal"または"auto"という値で更新されるようにすることができます。AndroidManifest.xmlファイルにこの属性を入力すると、モバイル・アプリケーションを外部SDカードまたは内部記憶域に格納できます。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/data/install-location.html)またはAndroid SDKのドキュメントから入手できる『Data Storage Guide』の「App Install Location」を参照してください。

- 詳細出力: .apkのビルド時にデプロイメントによって起動される各コマンド行ツールによって提供される全出力をログに記録する場合に選択します。このオプションを選択しないと、デプロイメントですべての出力がログに記録されません。

- ビルド・モード: 次のビルド・オプションから選択します。
デバッグ: 開発用のビルドの場合はこのオプションを選択します。デバッグ・ビルドを指定すると、デバッグ・シンボルが含まれます。第30.3.3項「Androidプラットフォームでのデバッグ方法」と第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

リリース: リリース・ビットおよびライブラリを使用してビルドをコンパイルする場合に選択します。

ヒント:
アプリケーションのパフォーマンスをテストするには、デバッグ・モードではなくリリース・モードを使用します。

Oracleモバイル・セキュリティ・スイートの有効化: Oracle Mobile Security Suiteによるコンテナ化を有効にする場合に選択します。詳細は、第27.9項「Oracle Mobile Security Suite (OMSS)でのデプロイ」を参照してください。

- ターゲットSDK APIレベル: アプリケーションを実行できる最小APIレベルを選択します。最小(デフォルト)値は15で、これはAndroid 4.0.3プラットフォームに対応します。最小SDKのバージョンを上げると、旧バージョンのAndroidを実行しているデバイスをアプリケーションのインストール対象から除外できます。

- 最小SDK APIレベル: アプリケーションが実行される最小APIレベルが表示されます。この値は変更できません。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/manifest/manifest-intro.html)で入手可能な「The AndroidManifest.xml File」で、<uses-sdk>属性の説明を参照してください。

27.2.4.3 Android署名オプションの定義

アプリケーションは、Androidデバイスまたはエミュレータにデプロイする前に、署名する必要があります。Androidでは、認証局は不要です。アプリケーションは自己署名できます。

デプロイメントにおけるモバイル・アプリケーションの署名方法の定義は、2つの手順で構成されます。まず、「MAF」の「プラットフォーム」プリファレンス・ページで、Androidアプリケーションの署名に使用されるキーのデバッグおよびリリース・プロパティを定義します。デバッグおよびリリースの署名プロパティは、一度構成するのみでかまいません。これらのオプションを定義したら、デプロイメント・プロファイルを構成して、デバッグ・モードとリリース・モードのどちらでアプリケーションをデプロイするかを指定します。

始める前に

キーストア・ファイルが存在しない場合は、keytoolユーティリティを使用して、キーストア・ファイルを作成できます(次の例を参照)。

keytool -genkeypair
-v
-keystore c:\jdeveloper\mywork\releasesigning.keystore
-alias releaseKeyAlias
-keyalg RSA
-keysize 2048
-validity 10000

この例のキーストアには、10,000日間有効な単一のキーが含まれています。Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で入手可能な「Signing Your Applications」で説明されているとおり、keytoolでは、キーストアを生成する前に、キーストアとキーのパスワード、およびキーの識別名フィールドを入力することを求められます。keytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

デバッグ・モードのキー・オプションを構成するには:

1. 「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」→「Androidプラットフォーム」を選択します。

2. 「デバッグ」タブ(図27-11を参照)を選択します。

図27-11 デバッグ・デプロイメントの構成

3. 「キーとキーストア・パスワード」フィールドに、デバッグ・デプロイメントに必要なキーストア・ファイルとキーを作成するためにデプロイメントで使用されるパスワードを入力します。Androidデバイスまたはエミュレータへのデプロイメント用のキーストアとキーファイルを生成するこのパスワードには、6文字以上の長さであれば、任意の値を指定できます。デフォルトのパスワードはAndroidです。

リリース・モードのキー・オプションを構成するには:

1. 「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」→「Androidプラットフォーム」を選択します。

2. 「リリース」タブを選択して、次を定義します。

- キーストアの場所: 配布するアプリケーションの署名に使用する秘密鍵を含むキーストアのディレクトリを入力、参照および取得します。

- キーストア・パスワード: キーストアのパスワードを入力します。このパスワードを使用すると、物理ファイルにアクセスできます。

- キーの別名: キーの別名を入力します。これはkeytoolの-alias引数に使用する値セットです。別名の最初の8文字のみが使用されます。

- キー・パスワード: キーのパスワードを入力します。このパスワードを使用すると、キーストア内のキー(別名によって識別される)にアクセスできます。

ヒント:
keytoolユーティリティによるキーストアの生成前に、keytoolユーティリティが要求するパスワードとキー・パスワードを入力します。

これらのパラメータでは、アプリケーションの署名方法の指定に加え、R.Javaクラスのコンパイル方法も指定します。

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

Androidビルド・モードを設定するには:

1. 「オプション」ページで、ビルド・モードとして「デバッグ」または「リリース」を選択します。

- アプリケーションの開発やテスト(JavaやJavaScriptのデバッグなど)を行う際は「デバッグ」を選択します。このオプションを使用すると、秘密鍵を提供しなくても、Androidプラットフォーム上でアプリケーションをデプロイできます。Androidエミュレータまたはテスト用のAndroidデバイスにアプリケーションをする場合は、このオプションを使用します。第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

注意:
デバッグ・キーストアおよびキーで署名されたアプリケーションは公開できません。デバッグ・キーストアおよびキーは、テストのみに使用され、エンド・ユーザーへのアプリケーションの公開には使用できません。

- アプリケーションを公開する準備ができた場合は、「リリース」を選択します。このオプションは、アプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開する準備ができた場合に使用します。

ヒント:
アプリケーションのパフォーマンスをテストするには、デバッグ・モードではなくリリース・モードを使用します。

2. 「OK」をクリックします。
デバッグ・モードまたはリリース・モードで署名された.apkファイルは、デバイスまたはエミュレータにデプロイできます。実行時に、MAFは、図27-12に示すように、赤の三角形内に感嘆符で表されるデバッグ・シンボルを重ねることで、アプリケーションがデバッグ・モードでデプロイされたことを示します。

図27-12 デプロイメント・モード

27.2.4.4 資格証明の格納に関する必知事項

MAFは、キーおよびキーストアのパスワードをファイルベースの資格証明ストア(cwallet.sso)に格納します。資格証明の格納および取得を管理するこのファイルは、ユーザーのJDeveloperシステム・フォルダのo.mafフォルダ内に存在します。たとえば、Windows 7環境では、cwallet.ssoファイルはC:\Users\jsmith\AppData\Roaming\JDeveloper\system12.1.3\o.mafに存在します。

詳細は、『Oracle Fusion Middleware管理者ガイド』の「Oracleウォレットについて」の項、および『Oracle Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護』の資格証明ストアの基本の項を参照してください。

注意:
MAFは、キーおよびキーストア資格証明をproduct-preferences.xmlというファイルに格納します。JDeveloperおよびMAFの現在のバージョンのインストール・プロセス時に「インポート・プリファレンスの確認」ダイアログの「はい」をクリックしてプリファレンス設定を保持した場合、MAFはこれらの資格証明をcwallet.ssoファイルに移行します。ただし、cwallet.ssoファイルは、現在のバージョンのOracle JDeveloperとMAFの他のインストールには移行されません。再インストールした場合(または別のインストールを作成した場合)は、cwallet.ssoファイルをo.mafフォルダにコピーするか、または「プラットフォーム」プリファレンス・ページでリリース・モードの資格証明を再構成する必要があります。

27.2.4.5 Androidアプリケーションへのカスタム・イメージの追加方法

サイズや解像度の異なるAndroidデバイス上でMAFアプリケーション・アイコンが適切に表示されるようにするには、同じイメージの低密度、中密度および高密度バージョンを用意する必要があります。MAFは、これらの表示要件を満たすデフォルトOracleイメージを提供します。ただし、アプリケーションでカスタム・アイコンが必要とされる場合は、「アプリケーション・イメージ」ページ(図27-13を参照)を使用して、アプリケーション・アイコンとスプラッシュ画面用のPNG形式のイメージを選択することで、デフォルト・イメージをオーバーライドできます。スプラッシュ画面には、縦向きと横向きのイメージを追加できます。カスタム・イメージ・ファイルを追加しない場合は、デフォルトのOracleアイコンが使用されます。カスタム・イメージを作成するには、Android開発者のWebサイト(http://developer.android.com/design/style/iconography.html)から入手可能な『Iconography』を参照してください。

図27-13 Androidアプリケーション用のカスタム・イメージの設定

始める前に

Androidテーマに適しており、複数の画面タイプをサポートできるディメンション、密度およびコンポーネントを使用するPNG、JPEGまたはGIFファイル形式のイメージを取得します。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/practices/screens_support.html)で入手可能な「Supporting Multiple Screens」を参照してください。

カスタム・イメージを追加するには:

1. 「アプリケーション・イメージ」をクリックします。

2. 「参照」機能を使用して、プロジェクト・ファイルからスプラッシュ画面およびアイコン・イメージ・ファイルを選択します。図27-13には、低密度、中密度、高密度および超高密度ディスプレイを装備するデバイスでの表示にアプリケーションで使用されるアプリケーション・アイコンのイメージと縦向きのスプラッシュ画面用のイメージを選択する様子が示されています。

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

27.2.4.6 JDeveloperによってAndroidアプリケーション用のイメージがデプロイされる場合の処理

デプロイメントの際、MAFにより、JDeveloperは、ソースの場所から一時デプロイメント・フォルダにイメージをコピーできます。MAF拡張機能に付属のデフォルト・イメージ(アプリケーション・ワークスペース・ディレクトリ\Application Resources\Resources\images内)の場合は、JDeveloperはシードされた場所から、ビュー・コントローラ・プロジェクトのデプロイメント・サブディレクトリ(アプリケーション・ワークスペース\ViewController\deploy)にコピーします。表27-2に示されているように、各イメージ・ファイルは、drawableオブジェクトにちなんで名付けられたdrawableというサブディレクトリにコピーされます。詳細は、Android開発者のWebサイト(http://developer.android.com/reference/android/graphics/drawable/Drawable.html)を参照してください。それぞれのdrawableディレクトリは、イメージ密度(ldpi、mdpi、hdpiおよびxhdpi)と向き(port、land)に対応します。これらのディレクトリ内で、JDeveloperは、各アイコン・イメージ・ファイルの名前をadfmf_icon.pngに、各スプラッシュ画面イメージの名前をadfmf_loading.pngに変更します。

表27-2 シードされたアプリケーション・イメージのデプロイメント・ファイルの場所

ソース・ファイル(...\resource\Android)

一時デプロイメント・ファイル(...ViewController\deploy)

display-ldpi-icon.png

drawable-ldpi\adfmf_icon.png

display-mdpi-icon.png

drawable-mdpi\adfmf_icon.png

display-hdpi-icon.png

drawable-hdpi\adfmf_icon.png

display-xhdpi-icon.png

drawable-xhdpi\adfmf_icon.png

display-port-ldpi-splashscreen.png

drawable-port-ldpi\adfmf_loading.png

display-port-mdpi-splashscreen.png

drawable-port-mdpi\adfmf_loading.png

display-port-hdpi-splashscreen.png

drawable-port-hdpi\adfmf_loading.png

display-port-xhdpi-splashscreen.png

drawable-port-xhdpi\adfmf_loading.png

display-land-ldpi-splashscreen.png

drawable-land-ldpi\adfmf_loading.png

display-land-mdpi-splashscreen.png

drawable-land-mdpi\adfmf_loading.png

display-land-hdpi-splashscreen.png

drawable-land-hdpi\adfmf_loading.png

display-land-xhdpi-splashscreen.png

drawable-land-xhdpi\adfmf_loading.png

カスタム・イメージの場合、JDeveloperは、アプリケーション・アイコンのセットを指定の場所から一時デプロイメントの場所の対応する密度と向きのサブディレクトリにコピーします。

27.2.5 iOSデプロイメント・プロファイルの作成方法

iOSの場合は、デプロイメント・プロファイルのプロパティ・エディタを使用して、iOSアプリケーションのビルド構成と、スプラッシュ画面イメージおよびアプリケーション・アイコンの場所を定義します。

始める前に

JDeveloperも実行されているAppleコンピュータに、Xcodeをダウンロードします(Xcodeには、Xcode IDE、パフォーマンス分析ツール、iOSシミュレータ、Mac OS XおよびiOS SDKが含まれています)。

ヒント:
アプリケーションのコンパイルに最低限必要なサポート対象のバージョンについては、Oracle Technology Network (http://www.oracle.com/technetwork/developer-tools/maf/documentation)で動作保証とサポートのマトリクスを参照してください。

Xcodeはデプロイメント時に使用されるので、JDeveloperからモバイル・アプリケーションをデプロイする前にAppleコンピュータにインストールする必要があります。

ヒント:
Xcodeの最新バージョンはApp Storeから入手できますが、次のサイトから以前のバージョンをダウンロードできます。
https://developer.apple.com/xcode/

このサイトにアクセスするには、Apple IDおよびApple開発者としての登録が必要です。

Xcodeをダウンロードしたら、「iOSプラットフォーム」プリファレンス・ページで、そのxcodebuildツールの場所を入力する必要があります。iOSシミュレータへのデプロイメントの場合は、iOSシミュレータのSDKの場所を入力します。詳細は、『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』のプラットフォームとフォーム・ファクタに応じた開発環境の構成に関する項を参照してください。

注意:
iTunesとiOSシミュレータの両方を1回以上実行してから、それらの場所を「iOSプラットフォーム」プリファレンス・ページに入力します。

モバイル・アプリケーションを(iOSシミュレータではなく) iOSデバイスにデプロイするには、iOSプロビジョニング・プロファイルからプロビジョニング・プロファイルと証明書の両方を取得する必要があります。詳細は、第27.2.5.2項「デバイス署名オプションの設定」を参照してください。

デプロイメント・プロファイルを作成する手順は、次のとおりです。

1. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

2. 「デプロイメント」ページで、デプロイメント・プロファイルをダブルクリックします。

3. 「iOSオプション」(図27-14を参照)を選択します。

4. デフォルト値をそのまま使用するか、次を定義します。

- アプリケーション・バンドルID: 会社のドメイン名を特定する、アプリケーションの一意のID。デプロイされるバンドルIDは、iOSデバイスにインストールされているアプリケーションごとに一意である必要があり、逆パッケージ・スタイル命名規則(つまり、com.<organization name>.<company name>)に準拠している必要があります。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』を参照してください。必要に応じて、この値を別の値で上書きできます(ただし、値が一意でIDのガイドラインに準拠している必要があります)。詳細は、第3.2項「MAFアプリケーションの表示プロパティの設定」を参照してください。iOS Provisioning Portalを使用したバンドル・シードIDの取得の詳細は、第27.4.4.3項「アプリケーションIDの登録」を参照してください。

注意:
デプロイされるバンドルIDを数字から始めたり、空白を含めることはできません。

それぞれのアプリケーション・バンドルIDは一意であるため、複数のモバイル・アプリケーションを同じデバイスにデプロイできます。アプリケーション・バンドルIDさえ異なっていれば、2つのアプリケーションに同じ名前を指定できます。同じデバイスにデプロイされるモバイル・アプリケーションは、それぞれ別のサンドボックスに配置されます。アプリケーションが相互に認識したり、データを共有することはありません(デバイス・スコープのみが共通になります)。

- アプリケーション・アーカイブ名: 必要に応じて、.ipaファイルまたは.appファイルの名前を入力します。「デプロイメント・アクション」ダイアログ(図27-24を参照)で「配布パッケージにデプロイ」または「デバイスとの同期のためにiTunesにデプロイ」オプションを選択すると、MAFによって.ipaファイルが作成されます。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、.appファイルが作成されます。または、デフォルトの名前を使用します。詳細は、第27.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」と第27.4.5項「App StoreへのiOSアプリケーションの配布方法」を参照してください。
MAFのデフォルトでは、.ipaファイル(または.appファイル)の名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第3.3項「アプリケーション機能の表示プロパティの設定」を参照してください。

- 最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

- シミュレータ: アプリケーションをデプロイするシミュレータのハードウェアとiOSバージョンを選択します。ドロップダウン・リストに使用可能なバージョンが表示されます。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『iOS Simulator User Guide』を参照してください。

- ファミリ: アプリケーションを実行するiOS製品ファミリを選択します。デフォルト・オプションはiPadとiPhoneの両方です。

図27-14 iOSオプションの設定

27.2.5.1 iOSビルド・オプションの定義

iOSビルド・オプションでは、デバッグまたはリリース・ビットとライブラリによりアプリケーションをデプロイできます。「iOSオプション」ページでは、Oracle Mobile Security Suite (OMSS)によるコンテナ化を有効にすることも可能です。

始める前に

iOSアプリケーション(.ipaファイル)をiOSデバイスにデプロイするには、インストールの必須コンポーネントであるプロビジョニング・プロファイルと、デバイス上の開発者とアプリケーションを特定する署名済証明書が必要です。これらはiOS Provisioning Portalから取得する必要があります。詳細は、第27.4.4項「iOSデバイスへのアプリケーションのデプロイに関する必知事項」を参照してください。さらに、「iOSプラットフォーム」プリファレンス・ページで、プロビジョニング・プロファイルの場所と証明書の名前を入力する必要があります。詳細は、第27.2.5.2項「デバイス署名オプションの設定」を参照してください。

ビルド・オプションを設定するには:

1. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

2. 「デプロイメント」ページで、iOSデプロイメント・プロファイルをダブルクリックします。

3. 「iOSオプション」(図27-14を参照)を選択します。

4. 次のビルド・オプションから選択します。

- デバッグ: 開発用のビルドの場合はこのオプションを選択します。デバッグ・ビルドを指定すると、デバッグ・シンボルが含まれます。第30.3.2項「iOSプラットフォームでのデバッグ方法」と第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

- リリース: リリース・ビットおよびライブラリを使用してビルドをコンパイルする場合に選択します。

ヒント:
アプリケーションのパフォーマンスをテストするには、デバッグ・モードではなくリリース・モードを使用します。

- Oracleモバイル・セキュリティ・スイートの有効化: Oracle Mobile Security Suiteによるコンテナ化を有効にする場合に選択します。このオプションを適用できるのはiTunesへのデプロイのみで、パッケージまたはシミュレータへのデプロイでは無視されます。詳細は、第27.9項「Oracle Mobile Security Suite (OMSS)でのデプロイ」を参照してください。

実行時に、MAFは、第27.2.4.3項「デプロイメント・モード」に示すように、赤の三角形内に感嘆符で表されるデバッグ・シンボルを重ねることで、アプリケーションがデバッグ・モードでデプロイされたことを示します。

27.2.5.2 デバイス署名オプションの設定

「iOSプラットフォーム」プリファレンス・ページには、開発コンピュータ上でのプロビジョニング・プロファイルの場所と署名アイデンティティの名前のフィールドが含まれています。アプリケーションを配布パッケージにデプロイしたり、デバイスとの同期のためにiTunesにデプロイする場合は、これらのパラメータを定義する必要があります。署名アイデンティティはアプリケーションのコード署名に使用します。Xcodeで開発用証明書が必要な場合、証明書とその公開鍵はメンバー・センターに格納され、署名アイデンティティ(公開鍵と秘密鍵を保持する証明書)は開発者のキー・チェーンに格納されます。この秘密鍵がないとコード署名できません。

注意:
モバイル・アプリケーションをiOSシミュレータにデプロイする場合は、署名アイデンティティとプロビジョニング・プロファイルのいずれも不要です。

署名オプションを設定するには:

1. 「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」→「iOSプラットフォーム」を選択します。

2. 「プロビジョニング・プロファイル」ドロップダウン・リストからプロビジョニング・プロファイルを選択します。

3. 「署名アイデンティティ」フィールドに、コードの作成者(開発者や会社など)を特定する開発者または配布証明書の名前を入力します。証明書の名前は、Keychain Accessユーティリティ(Applicationsフォルダからアクセス)を使用して表示できます。Keychain Accessユーティリティから名前全体をコピーしてください。このフィールドに入力された名前は、次の例のように表示されます。

iPhone Developer: John Smith (Oracle123)

図27-15 iOSプラットフォームの「プリファレンス」ページの「デバイス署名」セクション

注意:
プロビジョニング・プロファイルには、アプリケーションの開発バージョン用とリリース・バージョン用の両方があります。アプリケーションのリリース・バージョンに使用されるプロビジョニング・プロファイルは、あらゆるデバイスにインストールできます。一方、開発バージョン用のプロビジョニング・プロファイルは、IDがプロファイルに埋め込まれたデバイスのみにインストールできます。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』を参照してください。

27.2.5.3 iOSアプリケーションへのカスタム・イメージの追加

「アプリケーション・イメージ」ページでは、アプリケーション・アイコンおよびアートワークに使用されるデフォルトのOracleイメージをカスタム・イメージでオーバーライドして、アプリケーションを再ブランディングできます。図27-16に示されているこのページのオプションでは、様々な状況、デバイスの向きおよびデバイスの解像度で使用されるカスタム・イメージの場所を入力できます。iOSアプリケーション・アイコン・イメージの詳細は、『iOS Human Interface Guidelines』の「Icon and Image Design」を参照してください。これらのドキュメントは、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)から入手できます。

注意:
すべてのイメージはPNG形式であることが必要です。

カスタム・イメージを追加するには:

1. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

2. 「デプロイメント」ページで、iOSデプロイメント・プロファイルをダブルクリックします。

3. iOS用デプロイメント・プロファイルのプロパティ・エディタの左側にあるツリーから、「iOSオプション」→「アプリケーション・イメージ」を選択します。

4. 「参照」を選択し、アイコン・イメージを選択して、iTunesによって.ipaファイルに割り当てられるデフォルトのAppleイメージをオーバーライドします。このイメージはすべてのアプリケーションに必要とされ、iPhoneアプリケーションとiPadアプリケーションのどちらも512 x 512ピクセルであることが必要です。詳細は、第27.2.5.4項「iTunesアートワークに関する必知事項」を参照してください。

5. 使用可能なイメージ・タイプをツリーに表示するデバイス・タイプを選択します。デフォルトでは、MAFはiPadおよびiPhoneデバイスで使用可能なすべてのイメージ・スタイルおよびイメージ・タイプを表示します。ただし、図27-16に示すように、デバイス・タイプを選択して選択を絞り込むことができます。「アイコン・フォルダ」フィールドには、MAFによって、これらのイメージ・ファイルが格納されている、アプリケーションのResourcesディレクトリ内の場所が表示されます。

図27-16 アプリケーション・イメージの選択

6. ツリーからイメージ・タイプを選択します。

7. 別のイメージを選択するには、「ファイル」フィールドで「参照」を選択します。このイメージ・ファイルは、現在のアプリケーション内に存在する必要があります。
デプロイメント時に、JDeveloperはカスタム・イメージ・ファイルをデプロイメント・プロファイルにコピーし、その名前をデフォルト・イメージの名前に一致するように変更します。

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

27.2.5.4 iTunesアートワークに関する必知事項

デフォルトでは、iTunesを通してiOSデバイスにデプロイされる、またはダウンロード用のアーカイブ(.ipaファイル)としてデプロイされるモバイル・アプリケーションでは、別途指定されていないかぎり、デフォルトのOracleイメージが使用されます。

デプロイされるアプリケーションのアイコンとしてiTunesアートワーク・イメージを選択することで、デフォルトのイメージをオーバーライドします。イメージを使用してアプリケーションのバージョンを区別できます。図27-17に、デフォルト・イメージとユーザーが選択したイメージの違いを示します。Application4にはデフォルト・イメージが、Application6にはユーザーが選択したイメージ(512 x 512ピクセルにスケールを変更したOracleアイコン)が表示されています。

図27-17 カスタムとデフォルトのアプリケーション・アイコン

デプロイメント時に、MAFは、.ipaファイルのトップレベルのiTunesArtworkというファイルにそのiTunesアートワーク・イメージを追加することで、iTunesでそのアイコンが表示されるようにします。

注意:
iTunesアートワークがアプリケーションにパッケージ化されるのは、デバイスとの同期のためにiTunesにデプロイというデプロイメント・タイプを選択した場合のみです。

27.2.5.5 表示をデバイスの特定の向きに制限する方法

デフォルトで、MAFは、iPhoneとiPadの両方ですべての向きをサポートします。たとえば、iPads上で上下逆の縦向きでのみ表示する必要があるアプリケーションでは、「デバイスの向き」ページ(図27-18を参照)を使用して、アプリケーションの回転をこれらの向きのみに制限できます。

図27-18 デバイスの向きの選択

アプリケーションの表示をデバイスの特定の向きに制限するには:

1. 「デバイスの向き」を選択します(図27-18を参照)。

2. 表27-3にリストされた向きの中から、不要な向きをすべて消去します。デフォルトでは、MAFは、これらすべてのデバイスの向きにデプロイします。デフォルトでは、これらの向きがすべて選択されています。

表27-3 iPhoneデバイスの向き

アイコン

説明

iPad、縦: ホーム・ボタンは画面の下部。

iPad、上下逆: ホーム・ボタンは画面の上部。

iPad、横左: ホーム・ボタンは画面の左側。

iPad、横右: ホーム・ボタンは画面の右側。

iPhone、縦: ホーム・ボタンは画面の下部。

iPhone、上下逆: ホーム・ボタンは画面の上部。

iPhone、横左: ホーム・ボタンは画面の左側。

iPhone、横右: ホーム・ボタンは画面の右側。

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

27.2.5.6 デバイスの向きを選択解除する場合の処理

デバイスの向きを選択解除すると、ソース.plistファイルが更新されます。

27.3 Androidアプリケーションのデプロイ

デプロイメント・プロファイルを定義したら、「デプロイメント・アクション」ダイアログ(図27-19を参照)を使用してAndroidプラットフォームにモバイル・アプリケーションをデプロイできます。このダイアログを使用すると、完了したアプリケーションを、Androidエミュレータまたはテスト用のAndroidデバイスにデプロイできます。アプリケーションのテストとデバッグが完了したら、このダイアログを使用して、モバイル・アプリケーションをAndroidアプリケーション・パッケージ(.apk)・ファイルとしてバンドルできます。これによって、アプリケーション・マーケットプレイス(Google Playなど)を通して、アプリケーションをエンド・ユーザーに公開することが可能になります。

ヒント:
「デプロイメント・アクション」ダイアログのかわりに、OJDeployコマンド行ツールを使用してモバイル・アプリケーションをAndroidプラットフォームにヘッドレス・モードでデプロイすることもできます。詳細は、第27.8項「コマンド行からのMAFアプリケーションのデプロイ」を参照してください。

図27-19 Androidアプリケーションの「デプロイメント・アクション」ダイアログ

27.3.1 AndroidエミュレータへのAndroidアプリケーションのデプロイ方法

モバイル・アプリケーションはAndroidエミュレータ(Android Virtual Device (AVD)とも呼ばれる)に直接デプロイできます。

始める前に

Androidエミュレータにデプロイするには、次を行う必要があります。

- Androidプラットフォーム・バージョン21 (Android 5.0)をインストールします。

- Android Virtual Deviceインスタンスの構成にARMまたはIntel Atom x86のシステム・イメージが反映されていることを確認します。

- デプロイメント・プロファイルの「Androidオプション」ページで、次を行います。

1. 「デバッグ」が選択されていることを確認します。

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

注意:
「Androidプラットフォーム」プリファレンス・ページは、デバッグ・モードのデプロイメント用のキーストアとキーの生成に使用されるパスワードで構成する必要があります。詳細は、第27.2.4.3項「Android署名オプションの定義」を参照してください。

- アプリケーションをデプロイする前にAndroidエミュレータ(Android Virtual Device)を起動します。
エミュレータは、Android Virtual Device Manager(図27-20を参照)またはコマンド行を使用して起動できます。コマンド行から起動する場合は、toolsディレクトリ(Android\android-sdk内)に移動し、emulator -avdに続けてエミュレータ名を入力することで(例: -avd AndroidEmulator1)、エミュレータを起動します。

注意:
デプロイメント時にはAndroidエミュレータを1つのみ実行できます。

図27-20 Android Virtual Device Managerを使用したエミュレータの起動

アプリケーションをAndroidエミュレータにデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのエミュレータへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図27-8を参照)をレビューし、「戻る」を選択して別のデプロイメント・アクティビティを選択するか、「終了」を選択します。「サマリー」ページには、デプロイメント・プロファイルの次のパラメータが表示されます。

- アプリケーション・バンドルID: アプリケーションを特定する、Java言語のような一意のパッケージ名。

注意:
図27-21の「サマリー」ページには、アプリケーション・バンドルIDが、エミュレータへのデプロイメントの成功に必要なリバースパッケージ書式であることが示されています。リバースパッケージ書式に従わないアプリケーションをデプロイすると、エミュレータが停止して、デプロイメントを完了できなくなります。

- ファイル: Androidターゲットにデプロイされる.apkの名前。

- デプロイ・モード: ビルド・モード。この値は、デプロイメント・プロファイルに設定されている値に応じて、「リリース」と「デバッグ」のいずれかになります。

図27-21 Androidエミュレータ・デプロイメントのサマリー

4. デプロイメント・ログをレビューします(図27-22を参照)。デプロイメント・ログには、デプロイヤがAndroidエミュレータの実行中インスタンスを検出し、Androidデバッグ・ブリッジ・サーバーを起動したことが示されます。第27.3.6項「Androidデバッグ・ブリッジの使用方法に関する必知事項」も参照してください。

図27-22 デプロイメント・ログ

27.3.2 Androidデバイスへのアプリケーションのデプロイ方法

モバイル・アプリケーションは、API 15以降(プラットフォーム4.0.3)で動作するAndroidデバイスに直接デプロイできます。

始める前に

Androidデバイスに直接デプロイするためには、JDeveloperをホストする開発コンピュータにデバイスを接続し、そのデバイスを開発モードに設定して、USBデバッグを有効にします。詳細は、『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』のAndroidデバイスの設定方法に関する項を参照してください。

「Androidオプション」ページで、ビルド・モードとして「デバッグ」を選択します。「Androidプラットフォーム」プリファレンス・ページでデバッグ署名資格証明が構成されていることを確認します。詳細は、第27.2.4.1項「アプリケーションの詳細オプションの設定」を参照してください。

Androidデバイスにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのデバイスへのデプロイ」→「次へ」を選択します。

3. 「概要」ページを確認します。「戻る」または「次へ」をクリックします。

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

27.3.3 Androidアプリケーションの公開方法

第30章「MAFアプリケーションのテストおよびデバッグ」の説明に従ってアプリケーションのテストとデバッグが完了したら、Android開発者のWebサイト(http://developer.android.com/tools/publishing/publishing_overview.html)の説明に従ってアプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開できます。

始める前に

デプロイメント・プロファイルの「Androidオプション」ページで、ビルド・モードとして「リリース」を選択します。

注意:
第27.2.4.3項「Android署名オプションの定義」の説明に従って、「Androidプラットフォーム」プリファレンス・ページ(「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択してアクセス)で署名オプションを構成する必要があります。

アプリケーションを.apkファイルとしてデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのパッケージへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図27-21を参照)をレビューします。「戻る」または「次へ」をクリックします。

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

5. アプリケーション・マーケットプレイスにアプリケーションを公開します。

27.3.4 .apkファイル作成時のJDeveloperでの処理

アプリケーションをデプロイすると、次のものが.apkファイルにデプロイされます。

- adfmsrcの内容

- .adfフォルダの内容

- maf-application.xmlファイルおよびmaf-feature.xmlファイル

- logging.propertiesファイル

- JVMファイル

27.3.5 最近使用されたデプロイメント・プロファイルの選択

デプロイメント・アクションを選択すると、JDeveloperによって「デプロイ」メニューにショートカットが作成されます。このショートカットを使用すると、同じデプロイメント・アクションを使用してアプリケーションを簡単に再デプロイできます。

27.3.6 Androidデバッグ・ブリッジの使用方法に関する必知事項

デプロイメントでは、デバイス(デバイスにデプロイする場合)またはエミュレータ(Androidエミュレータにデプロイする場合)が検出されるまで、Androidデバッグ・ブリッジ・サーバーが5回再起動されます。どちらも検出されない場合、図27-23に示すとおり、デプロイメント・プロセスは終了します。

図27-23 終了されたデプロイメント

デプロイメント前にAndroidデバッグ・ブリッジ・コマンド行ツールを使用する場合は、デプロイメントの完了後に同じコマンドを再度入力する必要があります。たとえば、デプロイメントの前にエミュレータまたはデバイスのロギング情報を表示するためにadb logcatと入力した場合、ロギング出力の取得を再開するには、アプリケーションがデプロイされた後で再度adb logcatと入力する必要があります。Androidデバッグ・ブリッジ・コマンド行ツールは、Android SDKインストールのplatform-toolsディレクトリ内に配置され、ここから実行されます。このツールの詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/adb.html)を参照してください。

27.4 iOSアプリケーションのデプロイ

図27-24に示された「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイするか、iTunesを通してデバイスにデプロイできます。iOSアプリケーションはAppleコンピュータからのみデプロイできます。iOSシミュレータへのデプロイメントを行うために、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップを取得する必要はありません。Apple開発者として登録されていれば、App Storeから入手できないXcodeのバージョンにアクセスできるので、問題ありません。iOSデバイスへのデプロイメントに必要なiOS開発者プログラム(第27.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」と第27.4.5項「App StoreへのiOSアプリケーションの配布方法」で説明されています)の詳細は、https://developer.apple.com/programs/を参照してください。

図27-24 「デプロイメント・アクション」ダイアログ(iOSアプリケーション用)

ヒント:
「デプロイメント・アクション」ダイアログのかわりに、OJDeployコマンド行ツールを使用してモバイル・アプリケーションをiOSプラットフォームに手動でデプロイすることもできます。詳細は、第27.8項「コマンド行からのMAFアプリケーションのデプロイ」を参照してください。

27.4.1 iOSシミュレータへのiOSアプリケーションのデプロイ方法

「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイできます。

始める前に

iOSシミュレータへのデプロイメントを可能にするには、次のタスクを実行する必要があります。

- Xcodeをインストールして実行し、ライセンス契約を受諾して、指示に従ってインストール後のその他のタスクを実行します。

注意:
アプリケーションをiOSシミュレータにデプロイする前に、最低1回はXcodeを実行する必要があります。これを行わないと、デプロイメントに失敗します。

- デプロイメント・プロファイルの「iOSオプション」ページで、「デバッグ」を選択し、「OK」をクリックします。

- アプリケーションをデプロイする前に、iOSシミュレータが実行されている場合は、そのシミュレータを停止します。シミュレータを停止しなかった場合は、デプロイメント中にその処理が実行されます。

- iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『iOS Simulator User Guide』を参照してください。iOSシミュレータはXcodeとともにインストールされます。

iOSシミュレータにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「アプリケーションのシミュレータへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図27-25を参照)をレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- シグネチャ: アプリケーションを作成した開発者または会社。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:
iOSシミュレータへのデプロイメントでは、署名アイデンティティとプロビジョニング・プロファイルの値を定義する必要はありません。このデプロイメント・シナリオでは、「サマリー」ページでこれらの値について<指定なし>と表示されます。

図27-25 デプロイメント・アクションの「サマリー」ダイアログ

27.4.2 iOSデバイスへのアプリケーションのデプロイ方法

「デバイスとの同期のためにiTunesにデプロイ」オプションを使用すると、モバイル・アプリケーションをデバッグおよびテスト用のiOSデバイスにデプロイできます。iOSデバイスまたは配布サイトへのデプロイメントには、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップが必要です。詳細は、https://developer.apple.com/programs/を参照してください。

始める前に

JDeveloperからiOSデバイスにアプリケーションを直接デプロイすることはできません。アプリケーションは、Apple iTunesのApplicationsフォルダからデプロイする必要があります。そのためには、次のタスクを実行する必要があります。

- Apple iTunesを開発コンピュータにダウンロードし、それを1回以上実行して、必要なフォルダとディレクトリを作成します。

- 「iOSプラットフォーム」プリファレンス・ページで、Automatically Add to iTunesフォルダの場所(アプリケーションのデプロイメントに使用される場所)を設定します(図27-26を参照)。

ヒント:
ユーザーのホーム・ディレクトリ(/User/<username>/Music/iTunes/iTunes Media/Automatically Add to iTunes.localized)は、iTunes Mediaフォルダのデフォルト・ディレクトリですが、このフォルダの場所は次のように変更できます。

1. iTunesで、「Edit」→「Preferences」→「Advanced」を選択します。

2. 「Change」をクリックし、新しい場所を参照します。

3. ライブラリを統合します。

4. 元のiTunes Mediaフォルダを削除します。

手順の詳細は、Apple Support (http://support.apple.com)を参照してください。

「iOSプラットフォーム」プリファレンス・ページでも場所を更新する必要があります。

図27-26 iTunes Mediaフォルダの場所の設定

- プロビジョニング・プロファイルおよび署名アイデンティティの名前と場所を「iOSプラットフォーム」プリファレンス・ページで入力します。iOS Provisioning Portalによって、iOSデバイスへのデプロイメントまたはApp Storeや内部ダウンロード・サイトへの.ipaファイルの公開に必要な証明書とプロビジョニング・プロファイルが生成されます。

注意:
デバイスまたはアーカイブにデプロイするようにiOSプロビジョニング・プロファイルと署名アイデンティティを設定しないと、デプロイメントは失敗します。MAFでは、このような状況でデプロイできなかったアプリケーションがログに記録されます。詳細は、第27.4.4項「iOSデバイスへのアプリケーションのデプロイに関する必知事項」を参照してください。

- デプロイメント・プロファイルの「iOSオプション」ページで、ビルド・モードとして「デバッグ」を選択し、「OK」を選択します。

- iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』を参照してください。

iOSデバイスにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「デバイスとの同期のためにiTunesにデプロイ」→「次へ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- シグネチャ: アプリケーションを作成した開発者(または会社)。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:
iTunesへのデプロイメントを可能にするには、「オプション」ページでシグネチャとプロビジョニング・プロファイルの値を指定する必要があります。

4. iOSデバイスを開発コンピュータに接続します。

5. iTunesを開いてデバイスを同期化します。

27.4.3 iOSデバイスにアプリケーションをデプロイする場合の処理

デプロイメントに成功すると、図27-17のようにアプリケーションがiTunesの「Apps」フォルダに表示されます。

27.4.4 iOSデバイスへのアプリケーションのデプロイに関する必知事項

iOS Developer Programのメンバーのみがアクセス可能なiOS Provisioning Portalを使用して最初にプロビジョニング・プロファイルを作成しないかぎり、iOSアプリケーション(つまり、.ipaファイル)をiOSデバイスにデプロイしたり、App Storeまたは内部のホストされたダウンロード・サイトに公開することはできません。第27.2.5.2項「デバイス署名オプションの設定」の説明に従って、「オプション」ページでプロビジョニング・プロファイルの場所と証明書の名前を入力します。

iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』で説明されているように、プロビジョニング・プロファイルによって開発用証明書、デバイスおよびアプリケーションIDが関連付けられます。iOS Provisioning Portalでは、これらのエンティティとプロビジョニング・プロファイルを作成できます。

ヒント:
プロビジョニング・プロファイルをダウンロードしたら、このファイルをダブルクリックしてLibrary/MobileDevice/Provisioning Profileディレクトリに追加してください。

図27-27 iOS Provisioning Portal

27.4.4.1 iOS開発用証明書の作成

証明書は、開発者のアイデンティティに関する情報と公開鍵および秘密鍵が結合された電子的なドキュメントです。iOS開発用証明書がOS開発者として識別し、デプロイメントのためのアプリケーションの署名を有効にするので、証明書をダウンロードしたら、基本的に開発者自身のアイデンティティを開発コンピュータにインストールします。iOSオペレーティング環境では、すべての証明書がKeychainによって管理されます。

iOS Provisioning Portalの「Certificates」ページを使用して、CSR(証明書署名リクエスト)をログに記録します。CSRを完了すると、iOS Provisioning PortalによってiOS開発用証明書が発行されます。

27.4.4.2 テストおよびデバッグ用のAppleデバイスの登録

開発コンピュータに証明書をインストールしたら、「Current Available Devices」タブ(iOS Provisioning Portalの「Devices」ページ内)をレビューして、開発者自身(またはその会社)がテストやデバッグに使用するAppleデバイスを特定します。シリアル番号のような一意のデバイス識別子(UDID)によって各デバイスを識別するこのリストにデバイスが含まれていないかぎり、アプリケーションはデプロイできません。

27.4.4.3 アプリケーションIDの登録

アプリケーションIDは、デバイス上のアプリケーションの一意の識別子です。アプリケーションIDは、第3.2項「MAFアプリケーションの表示プロパティの設定」で説明されている書式の、バンドルIDと呼ばれる管理者が作成したリバース・ドメイン名の前に、バンドル・シードと呼ばれるAppleが生成した10文字の英数字文字列が付加された構成になります。図27-28には、他のアプリケーションとファイルやKeychainを共有しない、一意のアプリケーションIDが示されています。

図27-28 明示的なアプリケーションID

8E549T7128.com.oracle.*のように、アプリケーション名にワイルドカード文字(*)を使用すると、一連のアプリケーション間でアプリケーションIDを共有できます。たとえば、iOS Provisioning Portal上で管理者がcom.oracle.MAF.*という名前を付けた場合は、異なるアプリケーション(com.oracle.MAF.application1とcom.oracle.MAF.application2)を指定できます。

注意:
アプリケーションでプッシュ通知を受信する場合、アプリケーションIDは、ワイルドカード文字ではなく、完全な一意のIDである必要があります。ワイルドカードによって識別されるアプリケーションでは、プッシュ通知を受信できません。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『Local and Push Notification Programming Guide』の「Provisioning and Development」を参照してください。

アプリケーション間で8E549T7128などの同じ接頭辞を共有する場合、それらのアプリケーションでは、ファイルまたはキー・チェーンを共有できます。

注意:
バンドルIDは、デプロイメント・プロファイルの「オプション」ページで設定されたアプリケーションIDと一致している必要があります。

27.4.5 App StoreへのiOSアプリケーションの配布方法

iOSデバイス上でのアプリケーションのテストとデバッグが終了したら、App Storeまたは内部ダウンロード・サイトを通してより広範なオーディエンスにアプリケーションを配布できます。App Storeにアプリケーションを公開するには、.ipaファイルをiTunes Connectに送信する必要があります。これによって、.ipaファイルをiTunesに追加して、アプリケーションを更新し、テスト・ユーザーを作成することが可能になります。

始める前に

アプリケーションを配布する前に、次のタスクを実行する必要があります。

- 「iOSプラットフォーム」プリファレンス・ページ(図27-26を参照)で、Automatically Add to iTunesディレクトリの場所を入力します。

ヒント:
この場所を入力する前に、iTunesを1回以上実行します。第27.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- 実際のiOSデバイス上でアプリケーションをテストします。第27.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- iOS Provisioning Portalを通して配布証明書を取得します。

注意:
配布証明書を作成できるのは、チーム・エージェントのみです。

- .ipaファイルをiTunesに配布するための、iTunes Connectアカウントを取得します。詳細は、http://developer.apple.com/のApp Store配布ガイドラインを参照してください。

- iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『iTunes Connect Developer Guide』を参照してください。

- デプロイメント・プロファイルの「iOSオプション」ページで、ビルド・モードとして『App Distribution Guide』「リリース」を選択し、「OK」をクリックします。

iOSアプリケーションをApp Storeに配布するには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「配布パッケージにデプロイ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- シグネチャ: アプリケーションの作成者。デプロイメント・プロファイルの「iOSプラットフォーム」プリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。「iOSプラットフォーム」プリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:
.ipaファイルがiTunesで受け入れられるようにするには、「オプション」ページで「シグネチャ」と「プロビジョニング・プロファイル」の値を指定する必要があります。

4. iTunes Connectにログインします。

5. .ipaファイルをiTunes Connectに送信して検討します。詳細は、『iTunes Connect Developer Guide』(http://developer.apple.com/library/ios/navigation/)を参照してください。

6. バイナリの更新の詳細は、『iTunes Connect Developer Guide』(http://developer.apple.com/library/ios/navigation/)を参照してください。

27.5 機能アーカイブ・ファイル(FAR)のデプロイ

MAFのビュー・コントローラ・プロジェクトによる再利用を可能にするために、アプリケーション機能(一般的に、MAF AMXまたはローカルHTMLとして実装されるもの)は、機能アーカイブ(FAR)というアーカイブにバンドルされます。第8章「MAFアプリケーション・コンテンツの再使用」で説明しているように、FARは、モバイル・アプリケーションで使用できる、アプリケーション機能アーティファクト(アイコン・イメージ、リソース・バンドル、HTML、JavaScriptまたは他の実装固有のファイルなど)が含まれているJARファイルです。(FARには、Javaクラスを含めることも可能ですが、これらのクラスはコンパイルする必要があります。)次の例は、1つのmaf-feature.xmlファイルと1つのconnections.xmlファイルを含むFARの内容を示しています。connections.xmlの詳細は、第16章「MAFアプリケーションで使用されるエンド・ポイントの構成」を参照してください。

/* Contents of a Feature Archive File */
connections.xml (or some form of connection metadata)

META-INF
adfm.xml
maf-feature.xml
MANIFEST.MF
task-flow-registry.xml

oracle
application1
mobile
Class1.class
DataBindings.cpx
pageDefs
view1PageDefs

model
adfc-mobile-config.adfc.diagram
ViewController-task-flow.adfc.diagram

public_html
adfc-mobile-config.xml
index.html
navbar-icon.html
springboard-icon.html
view1.amx
ViewController-task-flow.xml

機能アーカイブ・ファイルでの作業には、次のタスクがあります。

1. 機能アーカイブ・ファイルの作成: 機能アプリケーションをライブラリJARファイルとしてデプロイすることで機能アーカイブを作成します。

2. モバイル・アプリケーション作成時の機能アーカイブ・ファイルの使用: これにはFARのインポートと、インポートされた接続の再マッピングが含まれます。

3. FARの機能を含むモバイル・アプリケーションのデプロイ: これには、デプロイメント・テンプレート内の一意の名前が付けられたフォルダへのFARの解凍が含まれます。

注意:
デプロイメント・プロセス時に、MAFによってFARが生成されます。別のアプリケーションでこのFARを使用する場合は、ビュー・コントローラ・プロジェクトのみをデプロイすればすみます。

27.5.1 機能アーカイブのデプロイメント・プロファイルの作成方法

「デプロイメント・プロファイルの作成」ダイアログを使用します(図27-29を参照)。

図27-29 MAF機能アーカイブ・ダイアログの作成

始める前に

アプリケーションの適切な接続を作成します。FARは接続要件が異なる様々なMAFアプリケーションで使用できるため、接続ソースまたは実際に標準化された接続名を表す接続名を選択します。

機能アーカイブのデプロイメント・プロファイルを作成するには:

1. ビュー・コントローラ・プロジェクトを右クリックし、「新規」→「デプロイ」→「新規デプロイメント・プロファイル」を選択します。

注意:
アプリケーションレベルの別個のデプロイメント・プロファイルを作成する必要はありません。

2. 「デプロイメント・プロファイルの作成」ダイアログで「MAF機能アーカイブ」を選択します。

3. プロファイル名を入力するか、デフォルトを受け入れて、「OK」をクリックします。

注意:
プロファイルには適切な名前を付けてください。そうしないと、アーカイブ名が同じアプリケーション機能を複数アップロードしたときに、問題が発生する可能性があります。詳細は、第8.5項「機能アーカイブ・リソースの再使用の有効化に関する必知事項」を参照してください。

4. 機能アーカイブJARファイルに含める接続を選択します(図27-30を参照)。

図27-30 FARの接続の選択

5. 「次へ」をクリックしてオプションをレビューし、「終了」をクリックします。

27.5.2 機能アーカイブのデプロイメント・プロファイルのデプロイ方法

「デプロイメント・アクション」ダイアログでは、FARをJARファイルとしてデプロイできます。図27-31に示すこのダイアログには、「機能アーカイブJARファイルへデプロイします。」という1つのデプロイメント・オプションのみがあります。

図27-31 デプロイメント・アクション

機能アーカイブのデプロイメント・プロファイルをデプロイするには:

1. ビュー・コントローラ・プロジェクトを右クリックして、機能アーカイブのデプロイメント・プロファイルを選択します。

2. 「終了」をクリックします。「サマリー」ページ(図27-32を参照)に、機能アーカイブ・ファイルのJARパスがデプロイされるフルパスが表示されます。

図27-32 デプロイメントの「サマリー」ページ

27.5.3 機能アーカイブ・ファイルのデプロイメント・プロファイルをデプロイする場合の処理

「デプロイメント・アクション」ダイアログを完了すると、MAFによって、「サマリー」ページに示されたパスにライブラリJARが作成されます。他のアプリケーションでこのJARを使用できるようにするには、最初に、図27-33に示す「リソース・パレット」(第8.2項「MAFアプリケーションでのFARコンテンツの使用方法」で説明)で機能アーカイブJARの場所への接続を作成することでこれを利用可能にする必要があります。図27-33は、ファイル・システム接続によりモバイル・アプリケーション使用可能となる機能アーカイブを示します。

図27-33 「リソース・パレット」のデプロイされた機能アーカイブJAR

27.6 モバイル・アプリケーション・アーカイブ・ファイルの作成

新しいモバイル・アプリケーションを既存のモバイル・アプリケーションから作成するには、まず元のモバイル・アプリケーションをモバイル・アプリケーション・アーカイブ(.maa)ファイルとしてパッケージ化した後、このファイルから新しいモバイル・アプリケーションを導出します。.maaファイルは、サード・パーティによる使用が可能です(第27.7項「署名されていないデプロイメント・パッケージの作成」を参照)。

.maaファイルによって、モバイル・アプリケーションの構造が保持されます。表27-4に、このファイルの内容を示します。

表27-4 モバイル・アプリケーション・アーカイブ・ファイルの内容

ディレクトリ

説明

adf

次のようなメタデータ・ファイルを含むMETA-INFディレクトリが格納されます。

- adf-config.xmlファイル

- maf-application.xmlファイル

- maf-config.xmlファイル

- その他の該当するアプリケーション・レベルのファイル(connections.xmlファイルなど)

Projects

ワークスペース内の各プロジェクトに対応するJARファイルが格納されます。たとえば、デフォルトのモバイル・アプリケーションを.maaファイルにデプロイすると、ViewController.jarファイルとApplicationController.jarファイルはこのディレクトリに配置されます。.maaファイルのProjectsディレクトリには、元のプロジェクトの.javaファイルは格納されません。かわりに、.javaファイルはコンパイルされ、その結果生成された.classファイルが、プロジェクトJARファイル(ApplicationController.JAR/classlib/mobileApplicationArchive.jarなど)に含まれる別のJARファイル内に配置されます。

ExternalLibs

元のモバイル・アプリケーションの外部にあるアプリケーション・レベルのライブラリ(FARを含む)が格納されます。

META-INF

maf.propertiesおよびlogging.propertiesファイルが格納されます。

resources

次のディレクトリが含まれます。

- android: アプリケーション・アイコンやスプラッシュ画面に使用される、Android固有のイメージ・ファイルが格納されます。

- ios: アプリケーション・アイコンやスプラッシュ画面に使用される、iOS固有のイメージ・ファイルが格納されます。

- security: cacertsファイル(キーストア・ファイル)が格納されます。

表27-4にリストされたアーティファクトに加えて、.maaファイルには、元のモバイル・アプリケーションの内部にあるFARまたはJARファイル、およびその制御(.jws)ファイルが格納されたフォルダが含まれます。第27.7.2項「MAFアプリケーション・アーカイブ・ファイルのインポート時に行われる処理」も参照してください。

27.6.1 モバイル・アプリケーション・アーカイブ・ファイルの作成方法

モバイル・アプリケーションの作成後、JDeveloperによって、デフォルトのMAFアプリケーション・アーカイブ・デプロイメント・プロファイルが作成されます。モバイル・アプリケーション・アーカイブ・ウィザードを使用すると、.maaファイルを作成できます。

ヒント:
また、OJDeployを使用して.maaファイルを作成することもできます(第27.8項「コマンド行からのMAFアプリケーションのデプロイ」を参照)。

モバイル・アプリケーション・アーカイブ・ファイルを作成するには:

1. 「アプリケーション」→「デプロイ」→「新規デプロイメント・プロファイル」をクリックします。

2. 「デプロイメント・プロファイルの作成」ダイアログで、「MAFアプリケーション・アーカイブ」→「OK」をクリックします(図27-34を参照)。

図27-34 MAAデプロイメント・プロファイルの作成

3. 必要に応じて、「アプリケーション・アーカイブ・オプション」ページでモバイル・アプリケーション・アーカイブの名前を入力する(図27-35を参照)か、デフォルトの名前(およびパス)をそのまま使用します。「OK」をクリックします。

図27-35 モバイル・アプリケーション・アーカイブ・ファイルの名前とパスの入力

4. 必要に応じて、次を実行します。

1. 「アプリケーション・ディスクリプタ」ページ(図27-36を参照)で、META-INFフォルダ(application_workspace\src\META-INF)の内容に付けるファイル・グループ名を入力します(またはデフォルトの名前をそのまま使用します)。

図27-36 META-INFの内容に付けるファイル・グループ名の入力

2. この「アプリケーション・ディスクリプタ」ページの「コントリビュータ」サブページを選択して、ファイル・グループの内容を提供するディレクトリとJARファイルのリストを編集します。

図27-37 モバイル・アプリケーション・アーカイブ・ファイルへのコントリビュータの編集

3. 「フィルタ」ページ(図27-38を参照)を使用して、.maaファイルに含めるファイルを編集したり、コンテンツの組込みまたは除外ルールを設定したりします。

図27-38 ファイルとディレクトリの組込み(または除外)

4. 「プロファイルの依存性」ページ(図27-39を参照)を使用して、プロジェクト内の依存プロファイルを指定します。

図27-39 デプロイメント・プロファイルの選択

モバイル・アプリケーションをMAFアプリケーション・アーカイブ・ファイルとしてパッケージ化するには:

1. 「アプリケーション」→「デプロイ」を選択し、「MAFアプリケーション・アーカイブ」デプロイメント・プロファイルを選択します。

2. 「デプロイメント・アクション」ウィザードで、「アプリケーションのMAAへのデプロイ」を選択します(図27-40を参照)。

図27-40 MAFアプリケーション・アーカイブ・ファイルへのデプロイメント

3. 「次へ」をクリックして、デプロイメント・サマリーを確認します(図27-41を参照)。

図27-41 MAFアプリケーション・アーカイブのデプロイメント・サマリー

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

27.7 署名されていないデプロイメント・パッケージの作成

MAFアプリケーション・アーカイブ(.maa)・ファイル形式を使用すると、署名されていないモバイル・アプリケーションをサード・パーティに提供できます。インポートした.maaファイルからモバイル・アプリケーションを導出することによって、次のような様々なカスタマイズが可能になります。

- アプリケーションへの一意のアプリケーションIDの付与(プッシュ通知を有効にする場合など)。

- 企業固有の資格証明または証明書を使用した、アプリケーションへの署名。

- カスタマイズされたスプラッシュ画面とアプリケーション・アイコンによる、リソースの置換え。

注意:
.maaファイルを既存のアプリケーションにインポートすると、ワークスペースとプロジェクトのコンテナ・ファイル(それぞれ.jwsファイルと.jprファイル)が上書きされます。このため、MAF AMXページと構成ファイル(maf-application.xml、maf-config.xml、connections.xml、adf-config.xmlなど)に対して以前加えた変更の一部は保持されません。

27.7.1 署名されていないアプリケーションの作成方法

署名されていないアプリケーションを作成するには、.maaファイルを新しいモバイル・アプリケーションにインポートします。

署名されていないアプリケーションを作成するには:

1. 「ファイル」を選択し、「新規」を選択します。

2. 「新規ギャラリ」で、「アプリケーション」→「アーカイブ・ファイルからのMAFアプリケーション」を選択します。

注意:
または、「ファイル」→「インポート」→「アーカイブ・ファイルからのMAFアプリケーション」を選択します。

3. 「場所」ページで、「MAAファイル」フィールドの「参照」を選択します。

4. 「インポートするMAAファイルの選択」ページで、.maaファイルを強調表示し(図27-42を参照)、「開く」をクリックします。

図27-42 .maaファイルの選択

5. 必要に応じて、次を実行するか、デフォルト値をそのまま使用します。

1. .maaファイルから導出したモバイル・アプリケーションの名前を「アプリケーション・ファイル」フィールドに入力します(図27-43を参照)。

2. 「参照」をクリックして、モバイル・アプリケーションのディレクトリを取得します。

図27-43 ディレクトリの場所の入力

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

7. インポートのサマリー情報を確認し、「終了」をクリックします。

図27-44 MAFアプリケーション・アーカイブの内容のサマリー

27.7.2 MAFアプリケーション・アーカイブ・ファイルのインポート時に行われる処理

MAFでは、.maaファイルがインポートされた後、次を実行します。

1. アプリケーション・フォルダを作成します。

2. ワークスペース・コンテナ(.jws)・ファイルを.maaファイルからアプリケーション・ファイルに解凍し、ユーザー指定の値に従ってその名前を変更します。

3. adfディレクトリとその内容をアプリケーション・フォルダに解凍します。このディレクトリの名前は、.adfに変更されます。

4. META-INFディレクトリとその内容をアプリケーション・フォルダに解凍し、アプリケーション・フォルダのsrcディレクトリ内に配置します。

5. ExternalLibsディレクトリとその内容をアプリケーション・フォルダに解凍します。

注意:
このディレクトリに格納された外部リソースはすべて、.maaファイルとしてパッケージ化された(そしてアプリケーションにインポートされた)モバイル・アプリケーション内で使用できますが、これらのリソースへの参照は、.maaファイルから導出されたモバイル・アプリケーションに対しては無効になります。

6. resourcesディレクトリをアプリケーション・フォルダに解凍します。

7. 元のモバイル・アプリケーションの内部にあるFAR (またはその他のライブラリ)を含む、すべてのフォルダを解凍します。MAFによって、これらのアーティファクトの元の場所が保持されます。

8. MAFでは、元のモバイル・アプリケーションのProjectsディレクトリ内にあるJARファイルごとに、次を実行します。

- JARファイルの名前(.jar拡張子を除く)に対応するアプリケーション・ディレクトリの下に、プロジェクト・フォルダを作成します。

- JARファイルの内容を、適切なプロジェクト・フォルダ内に解凍します。MAFによって、これらのプロジェクト・フォルダ内に次のものが格納されます。

- 元の.jprファイル。

- META-INF、public_html、src、adfmsrcなどの標準的なディレクトリ。

- ExternalLibsディレクトリの内容。

注意:
このディレクトリに格納された外部リソースはすべて、インポート済の.maaファイルを使用してパッケージ化されたMAFプロジェクト内で使用できますが、これらのリソースへの参照は、既存のプロジェクト、または.maaファイルをインポートすることによって作成されたプロジェクトに対しては無効になります。

- JARファイル内にパッケージ化されたすべてのJavaクラスを含むclasslibディレクトリ。

注意:
.maaファイルにclasslibディレクトリが含まれている場合、MAFでは、このディレクトリのすべてのJARファイルを、新しく作成されたモバイル・アプリケーションにライブラリ依存性として追加します。

27.8 コマンド行からのMAFアプリケーションのデプロイ

JDeveloper IDEを起動しなくても、OJDeployコマンド行ツールを使用して、JDeveloperからiOSまたはAndroidアプリケーションをデプロイできます。コマンド行のデプロイメントは、テストのためのツールとして機能すると同時に、スクリプトを使用したアプリケーションのデプロイ方法として機能します。

デプロイメント・プロファイルのプロパティ・エディタを使用してiOSまたはAndroidデプロイメント・ファイルを作成したら、OJDeployを使用してiOSシミュレータと(iTunes経由で)iOSデバイスに、またはiOSバンドル(.ipaおよび.appファイル)として、あるいは機能アーカイブJARファイルとして、ヘッドレス・モードでアプリケーションをデプロイできます。同様に、OJDeployを使用すると、AndroidエミュレータとAndroidデバイスの両方に、またはAndroidアプリケーション・パッケージ(.apk)・ファイルとして、あるいは機能アーカイブJARファイルとして、アプリケーションをデプロイできます。

注意:
OJDeployをMac上で使用するには、次の行をojdeploy.confファイルに追加してください。
SetSkipJ2SDKCheck true

このファイルはjdev_install/jdeveloper/jdev/binにあります。

27.8.1 OJDeployを使用したモバイル・アプリケーションのデプロイ

次のコマンドを使用して、MAFのデプロイメント・プロファイルをデプロイできます。

- deployToDevice: iOSデバイスまたはAndroidデバイスにアプリケーションをデプロイします。iOSアプリケーションの場合、このコマンドは、iTunesを使用してアプリケーションがデバイスにデプロイされるデバッグ・シナリオで使用されます。詳細は、第27.4.5項「App StoreへのiOSアプリケーションの配布方法」を参照してください。

- deployToSimulator: アプリケーションをiOSシミュレータに(.appファイルとして)デプロイするか、Androidエミュレータにデプロイします。モバイル・アプリケーションはAppleコンピュータ上のiOSシミュレータにのみデプロイできます。

- deployToPackage: iOSアプリケーションを.ipaファイルとして、またはAndroidアプリケーションを.apkファイルとしてデプロイします。アプリケーションは、Appleコンピュータでのみ、.ipaファイルとしてパッケージ化できます。

- deployToFeatureArchive: 機能アーカイブをJARファイルにデプロイします。

- deployToApplicationArchive: モバイル・アプリケーションをMAFアプリケーション・アーカイブ・ファイル(.maa)としてパッケージ化します。

これらのコマンドは、ojdeployコマンド行ツール、OJDeployの引数およびそのオプションとともに、次のように使用します。

ojdeploy deployToSimulator -profile <profile name> -workspace <jws file location>

注意:
OJDeployコマンドと引数では大文字と小文字が区別されます。

表27-5に、MAFのデプロイメント・コマンドを変更するために使用するOJDeploy引数をリストします。

ヒント:
-helpオプションを任意のコマンドで使用すると(例: ojdeploy deployToSimulator -help)、使用方法と構文に関する情報を取得できます。

表27-5 MAFのデプロイメント用のOJDeploy引数

引数

説明

-profile

AndroidまたはiOSデプロイメント・プロファイルの名前。次に例を示します。

ojdeploy deployToSimulator -profile iosDeployProfile ...

-workspace

モバイル・アプリケーション・ワークスペースのコンテナ(.jws)・ファイルへのフルパス。次に例を示します。

... -workspace /usr/jsmith/mywork/Application1/Application1.jws

モバイル・アプリケーションをモバイル・アプリケーション・アーカイブとしてパッケージ化するには:

ojdeploy deployToApplicationArchive
-profile applicationArchiveProfile
-workspace /usr/jdoe/Application1/application1.jws

-project

deployToFeatureArchiveコマンドの場合は、機能アーカイブのデプロイメント・プロファイルを含むプロジェクト(ビュー・コントローラ・プロジェクト)の名前を指定する必要があります。次に例を示します。

ojdeploy deployToFeatureArchive
-profile farProfileName
-project ViewController
...

-buildfile

バッチ・デプロイ用のビルド・ファイルへのフルパス。

-buildfileschema

ビルドファイルの出力XMLスキーマ。

表27-5に示した引数の他に、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のコマンドの使用方法の項で説明されているOJDeployオプションを使用することもできます。

注意:
次のオプションはサポートされていません。

- -forcerewrite

- -nocompile

- -nodatasources

- -nodepdendents

- -outputfile

- -updatewebxmlejbrefs

表27-6に、MAFのデプロイメント・コマンドでOJDeployオプションを使用する方法の例を示します。

表27-6 MAFのデプロイメント用のOJDeployオプション

オプション

説明

-clean

コンパイルの前に、プロジェクト出力ディレクトリからすべてのファイルを削除します。次に例を示します。

ojdeploy deployToSimulator
-profile iosDeployProfile
-workspace /usr/jsmith/jdeveloper/mywork/Application1.jws
-clean

-stdout, -stderr

標準出力とエラー・ロギングのストリームを、それぞれのプロファイルとプロジェクトのファイルにリダイレクトします。次に例を示します。

ojdeploy deployToSimulator -profile iosDeployProfile
-workspace /usr/jsmith/jdeveloper/mywork/Application1.jws
-clean
-stdout /usr/jsmith/stdout/stdout.log
-stderr /usr/jsmith/stderr/stderr.log

表27-7は、deployToApplicationArchiveコマンドとともに使用するマクロを示しています。

表27-7 MAFアプリケーション・アーカイブのパッケージ化に使用するマクロ

マクロ

説明

workspace.name

アプリケーション・ワークスペースのコンテナ・ファイルの名前(.jws拡張子を除く)。

workspace.dir

アプリケーション・ワークスペースのコンテナ(.jws)・ファイルのディレクトリ。

profile.name

デプロイするプロファイルの名前。

profile.dir

プロファイルのデフォルトのデプロイメント・ディレクトリ。

base.dir

このパラメータを使用して、現在のojdeployディレクトリをオーバーライドします。ビルド・スクリプトでbasedir属性を使用して、現在のojdeployディレクトリをオーバーライドできます。

27.9 Oracle Mobile Security Suite (OMSS)でのデプロイ

Oracle Mobile Security Suite (OMSS)は、モバイル・アプリケーション向けにエンタープライズレベルのセキュリティを備えています。デプロイ時にはコンテナ化を通して、データ漏えい防止と、アプリケーション・データおよびデータベース・コンテンツの暗号化を提供します。OMSSによるMAFアプリケーションのコンテナ化の詳細は、第2.7項「エンタープライズ配布に対応するためのMAFアプリケーションのコンテナ化」を参照してください。

始める前に

OMSSコンテナ化ツールがインストールされている必要があります。このツールは、c14nというファイル名のコマンドライン・ユーティリティです。OMSSをダウンロードし、Oracle Technology Networkでインストールに関する説明を読んでください。

http://www.oracle.com/technetwork/middleware/id-mgmt/overview/default-2099033.html

注意:
iOSの場合、第27.2.5.2項「デバイス署名オプションの設定」の説明に従って、「iOSプラットフォーム」プリファレンス・ページでプロビジョニング・プロファイルの名前を選択しておく必要もあります。

Oracle Mobile Security Suiteを使用してアプリケーションをコンテナ化する手順:

1. 「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択します。

2. 「コンテナ化」を選択します。

3. 「参照」アイコンをクリックし、ローカル・ファイル・システムでOracle Mobile Securityのc14nコンテナ化ツールの場所を探します(図27-45を参照)。

図27-45 コンテナ化ツールの場所の指定

4. 「OK」をクリックしてコンテナ化ツールを選択します。

5. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

6. 「デプロイメント」ページで、デプロイメント・プロファイルをダブルクリックしてから、「オプション」を選択します。

7. 「オプション」ページの下部で、「Oracleモバイル・セキュリティ・スイートの有効化」を選択します。

Oracle Mobile Security Suiteを使用してアプリケーションをデプロイする手順:

1. 「アプリケーション」、「デプロイ」の順に選択してから、デプロイメント・プロファイルを選択します。

2. 「デプロイメント・アクション」ダイアログで、アプリケーションのデプロイ方法を選択します。

注意:
iOSの場合、コンテナ化は、iTunesデプロイメントでのみサポートされています。配布パッケージまたはシミュレータへのデプロイメントでは、コンテナ化された.ipaファイルを作成することはありません。
Androidの場合、コンテナ化は、デバイスまたは配布パッケージへのデプロイメントでのみサポートされています。エミュレータへのデプロイメントでは、コンテナ化されたhファイルを作成することはありません。

3. アプリケーションをデプロイします。Oracle Mobile Security Suiteによって保護されたプラットフォーム固有のファイル(iOSの場合は.ipa、Androidの場合は.h)が作成されます。コンテナ化されたアプリケーションをデバイスに追加すると、そのアプリケーションにロック・アイコンが表示されます(図27-46を参照)。

図27-46 コンテナ化を表すロック・アイコンが表示されたモバイル・アプリケーション

27.9.1 OMSSでアプリケーションをコンテナ化する場合の処理

Oracle Mobile Security Suite (OMSS)でコンテナ化されたMAFアプリケーションは、デプロイした後で、現在使用可能なアプリケーションのリストが表示されるOMSSモバイル・アプリケーション・カタログにアップロードできます。アプリケーションをエンド・ユーザーに公開する前に、OMSS管理者は様々なポリシーをアプリケーションに適用して、その機能を管理します。特定のポリシーをOMSSのサーバー側に適用することで、OMSS管理者はOracle Mobile Security App Containerization Toolでコンテナ化されたアプリケーションのセキュリティと共有の要件を管理できます。遷移中のデータと、モバイル・デバイス上のコンテナ化されたアプリケーション内でローカルに格納されているデータは暗号化されます。暗号化されたデータ記憶域には、ファイル、データベース、アプリケーション・キャッシュ、ユーザー・プリファレンスなどのアプリケーション・データが格納されます。

OMSSのデータ漏えい防止および暗号化を適用した後、ユーザーがダウンロード・サイトからアプリケーションを利用できるようにすることが可能です。

注意:
OMSSでコンテナ化されたiOS MAFアプリケーションは、内部ダウンロード・サイトまたはエンタープライズ・アプリケーション・ストアを通してのみユーザーに配布できます。コンテナ化されたiOS MAFアプリケーションはApple社のApp Storeにはアップロードできません。
この制限は、OMSSでコンテナ化されたAndroid MAFアプリケーションには適用されません。これらのアプリケーションは、内部ダウンロード・サイト、エンタープライズ・アプリケーション・ストアまたはGoogle Playを通して配布できます。

システム管理者がOMSSモバイル・アプリケーション・カタログを使用して、デバイスとワークスペースにプロビジョニングされたMAFアプリケーションを管理する方法の詳細は、『Oracle Mobile Security Suiteの管理』のデバイスとワークスペースの管理を参照してください。

次のOMSSデータ漏えい防止ポリシーでは、ユーザーがアプリケーション内でデータを共有する方法とその条件を制限します。

- 電子メールを許可: アプリケーションから電子メールを送信する機能を制限できます。

- インスタント・メッセージを許可: アプリケーションからインスタント・メッセージを送信する機能を制限できます。

- ビデオ・チャットを許可: FaceTimeなどのサービス経由で情報を共有する機能を制限します。

- ソーシャル共有を許可: FacebookやTwitterなどのサービス経由で情報を共有する機能を制限します。

- 印刷を許可: ユーザーの印刷機能を制限します。

- ファイル共有を制限: セキュア・エンタープライズ・ワークスペースの外部で、ユーザーがファイルを共有する機能を制限します。

- コピー/貼付けを制限: セキュア・エンタープライズ・ワークスペース外部のアプリケーション以外のセキュア・コンテナ内、コンテナ化されたアプリケーション内またはコンテナ化されたアプリケーション間でのコピー/貼付けを許可します。

- コンテナへのリダイレクトを許可: Mobile Security Containerワークスペース外部のアプリケーションがURLをコンテナにリダイレクトできないようにします。

- メディア・ギャラリへの保存を許可: 画像、動画および音声ファイルがメディア・ギャラリや写真ストアに保存されないようにします。

- ローカルの連絡先への保存を許可: セキュア・エンタープライズ・ワークスペース・アプリケーション内の連絡先がネイティブ・デバイスの連絡先アプリケーションに保存されないようにします。

- コンテナからのリダイレクトを許可: Mobile Security ContainerワークスペースのvAppまたはコンテナ化されたアプリケーションが、Mobile Security Containerワークスペースまたはコンテナ化されたアプリケーションの外部にURLをリダイレクトできないようにします。

28 セキュアなモバイル開発方法の理解

この章では、モバイル・アプリケーション・フレームワークが、Open Web Application Security Project (OWASP)によって示された一般的なセキュリティ・リスクに対する保護を提供するしくみについて説明します。

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

- 第28.1項「サーバー側の不十分な制御」

- 第28.2項「デバイスでの安全でないデータ格納」

- 第28.3項「不十分なトランスポート・レイヤー保護」

- 第28.4項「サイドチャネルによるデータ漏えい」

- 第28.5項「不十分な認可および認証」

- 第28.6項「不適切な暗号化」

- 第28.7項「クロスサイト・スクリプティングからのクライアント側インジェクション」

- 第28.8項「信頼できない入力に対するセキュリティ決定」

- 第28.9項「不適切なセッション処理」

- 第28.10項「バイナリ保護の欠如による機密情報の漏えい」

28.1 脆弱なサーバー側コントロール

モバイル・アプリケーションにセキュリティを組み込みます。モバイル・アプリケーションの設計における最も初期の段階でも、モバイル・アプリケーションに固有のリスクだけでなく、モバイル・アプリケーションがアクセスするサーバー側リソースに共通するリスクも評価する必要があります。同等のデスクトップ・アプリケーションと同様に、モバイル・アプリケーションは、データを格納するバックエンド・サービスへの攻撃によって脆弱になる可能性があります。このリスクはモバイル・アプリケーションに固有のものではないため、「OWASP Top Ten Project」(https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)に示されている基準は、モバイル・アプリケーションの作成時にも当てはまります。モバイル・デバイスで実行されているクライアント・アプリケーションは脆弱である可能性があるため、これらを使用してアクセス制御を適用しないでください。この機能はサーバー側アプリケーションによって実行される必要があるため、MAFは、クライアントから送信されるデータを検証するための即時利用可能な機能は提供していません。モバイル・アプリケーションに送信されるデータが有効であることを確認する必要があります。詳細は、次を参照してください。

- Oracle Fusion Middleware Oracle Web Services Managerの理解にある、「Webサービスのセキュリティ概念の理解」

- Oracle Fusion Middleware Oracle Web Services Managerの理解にある、「Webサービスのセキュリティ標準」

- Oracle Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護

28.2 デバイスでの安全でないデータ格納

モバイル・アプリケーションの設計に欠陥があれば、ローカル・ファイルがユーザーからアクセス可能となり、デバイスのローカル・ファイル・システムに格納された機密データが公開されてしまう可能性があります。このデータには、ユーザー名とパスワード、Cookie、認証トークンなどがあります。ほとんどのユーザーは自分のデータが脆弱であること、さらにはデバイス自体に格納されていることを認識していませんが、悪意のあるユーザーがツールを使用してローカル・データベースを開き、資格証明を表示することで、この状況を利用する可能性があります。アプリケーションのセキュリティ要件を評価するときは、電話が悪者の手に渡る可能性を想定する必要があります。MAFは、デバイス・データベースおよびローカル・データ・ストアを暗号化することによってデバイスに格納されたデータを保護するAPIを提供しています。

28.2.1 SQLiteデータベースの暗号化

MAFの埋込みSQLiteデータベースは、ローカルに格納されたデータを保護します。MAFアプリケーションは、SQLiteデータバースを共有しません。データベースにアクセスできるアプリケーションは、データベースを作成するアプリケーションのみです。さらに、このデータベースには、正しいユーザー名とパスワードを持つユーザーのみがアクセスできます。AdfmfJavaUtilitiesクラスを使用すると、このデータベースのパスワードを保護するキーを作成するとともに、データベース内に格納されたデータを暗号化することができます。データベースに安全なキーを提供するために、AdfmfJavaUtilitiesクラスには、強力なパスワードを生成してから安全に格納するGeneratedPasswordユーティリティ・クラスが含まれます。また、AdfmfJavaUtilitiesクラスは、パスワードを使用してデータベースを暗号化するためのencryptDatabaseメソッドも提供します。SQLiteデータベースの一般的な情報は、第17章「MAF AMXでのローカル・データベースの使用方法」を参照してください。GeneratedPassword、encryptDatabase (およびこれに対応するdecryptDatabase)の詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスおよび第17.2.7項「データベースを暗号化および復号化する方法」を参照してください。サンプル・アプリケーションについては、PublicSamples.zipのStockTrackerサンプルを参照してください(付録G「サンプルのMAFアプリケーション」を参照)。

注意:
必ずGeneratedPasswordユーティリティを使用してください。キーをハードコード化しないでください。

28.2.2 デバイスのローカル・データ・ストアの保護

adfmfJavaUtiltiesクラスのgetDirectoryPathRootメソッドを使用して、iOSプラットフォームとAndroidプラットフォームの両方で、プログラムによりファイルをローカル・ファイル・システムに格納できます。このメソッドを使用すると、デバイスでのアプリケーション・データの格納に対して、プラットフォームに依存しないアクセスが可能になります。このメソッドには、次のオプションを使用できます。

- 一時ディレクトリ

- アプリケーション・ディレクトリ

- キャッシュ・ディレクトリ

- ダウンロード・ディレクトリ

ヒント:
ユーザーがデバイスをデスクトップ・コンピュータに同期すると、デバイスのアプリケーション・ディレクトリに格納されたデータが、そのデータを公開できるデスクトップ・システムに転送されます。データを一時ディレクトリに格納してください。iOSでは、iTunesを使用してデバイスが同期されるときに、一時ディレクトリに格納されたデータはデスクトップと同期されません。

セキュリティを必要とするすべてのファイルに対して、Java暗号化API (javax.crypto)を使用して暗号化および復号化を行うことができます。javax.cryptoパッケージの詳細は、Java Platform, Standard Edition 1.4 APIを参照してください。詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスおよび第B.3項「getDirectoryPathRootメソッドを使用したファイル・アクセス」を参照してください。また、iOS Developer Library (https://developer.apple.com/library/)から入手できる『ファイル・システム・プログラミング・ガイド』の「ファイル・システムの基礎」の項も参照してください。

28.2.3 セキュリティおよびアプリケーション・ログについて

デスクトップ・コンピュータと同期された場合に表示できるので、いずれの機密データもログ・ファイルに書込みできないことを確認してください。ユーザーがiOSデバイスをデスクトップ・システムに接続してデータを同期すると、アプリケーション・ログ・ファイルは最終的に、暗号化されていない形式でデスクトップ上に格納されます。Androidデバイスから同期されたログ・ファイルは、Android Device Monitorツールを使用して表示できます。第28.4項「サイドチャネルによるデータ漏えい」も参照してください。

28.3 不十分なトランスポート・レイヤー保護

モバイル・アプリケーションは、プロバイダ・ネットワークを介してデータにアクセスするときにSSL/TLSを使用し、WiFiを使用する場合はこれらのどちらのプロトコルも使用しないことがあります。プロバイダ・ネットワークはハッキングされる可能性があるため、安全であることを想定しないようにしてください。したがって、アプリケーションが機密データをトランスポートするときはSSLを強制し、すべての証明書が有効で公的機関によって署名されていることを確認する必要があります。

モバイル・アプリケーションによって使用されるすべてのエンド・ポイントはSSLによって保護される必要があるため、MAFは、SSLをサポートする一連のWebサービス・ポリシーを提供します。SOAP WebサービスまたはREST Webサービスのいずれかに関連付けられるポリシーのリストは、第15.7項「セキュアなWebサービスへのアクセス」を参照してください。

MAFは、信頼性のある既知の認証局のエントリによってシードされたcacertsファイルを提供します。アプリケーション開発者は、必要に応じてこのファイルに他の証明書を追加できます。詳細は、第29.9項「SSLのサポート」を参照してください。

28.4 サイドチャネルによるデータの漏えい

意図しないデータ漏えいは、次のような原因で発生する可能性があります。

- スクリーン・ショットの無効化(バックグラウンド実行): iOSおよびAndroidは、アプリケーションの再アクティブ化の認識されるパフォーマンスを高めるために、アプリケーションをバックグラウンドで実行する前にアプリケーションのスクリーン・ショットを取得します。しかし、顧客データの漏えいの可能性があるため、これらのスクリーン・ショットはセキュリティ上の問題の原因となります。

- キー・ストローク・ロギング: iOSおよびAndroidでは、キーボードを使用して入力した情報の一部が、先行入力機能で使用するためにアプリケーション・ディレクトリに自動的に記録されます。この機能は、顧客データの潜在的な漏えいにつながる可能性があります。

- デバッグ・メッセージ: アプリケーションでは、機密データをデバッグ・ログに書き込むことができます。ロギング・レベルを「FINE」に設定すると、ユーザーのデバイスとサーバーの間で転送されるすべてのデータに関してログ・メッセージが書き込まれます。

- アプリケーションの一部として表示される機密ドキュメントに関して、クリップボード・コピーおよび「Open In」機能を無効にします。MAFでは現在、コピーおよびOpen In機能を無効にする機能は提供されておらず、今後のリリースで提供が予定されています。

- 一時ディレクトリ: 機密データが含まれる場合があります。

- サード・パーティ・ライブラリ: これらのライブラリ(adライブラリなど)により、ユーザー、デバイス、ユーザーの場所に関するユーザー情報が漏えいする可能性があります。

データ漏えいを防止するには:

- 資格証明、個人情報(PII)などの機密データをアプリケーション・ログに記録しないようにします。すべての機密情報をネイティブ・キー・チェーン、暗号化データベースまたはファイル・システムに格納します。

- アプリケーションのデバッグ時に、作成されたすべてのファイルおよびそれらのファイルに書き込まれたすべての内容を確認します。

- アプリケーションを公開する前に、デバッグ・メッセージを削除します。

28.5 不十分な認可および認証

不十分な認証メカニズムとクライアント側アクセス制御は両方とも、セキュリティを脅かします。

エンド・ユーザーはユーザー名とパスワードよりも、電話番号またはなんらかのタイプの識別子(IMEI、IMSIまたはUUID)を使用してデバイスを認証する方が簡単ですが、これらの識別子は総当たり攻撃によって容易に検出される可能性があるため、唯一のオーセンティケータとして使用しないようにしてください。かわりにモバイル・アプリケーションは、機密データにアクセスするときは強力な資格証明を使用する必要があります。認証は、デバイスではなくユーザーを反映する必要があります。さらに、コンテキスト識別子(場所など)、音声、フィンガープリントまたは動作情報を使用して認証を強化できます。

開発者は、MAFで提供されているデフォルトのログイン・ページまたは開発者が作成するカスタム・ログイン・ページのいずれかを使用できます。詳細は、第29.6.2項「ログイン・ページの指定方法」を参照してください。

第29.6.1項「認証を要求するようにアプリケーション機能を設定する方法」で説明されているように、安全なアクセスを必要とするMAFアプリケーションのすべての機能は、セキュリティを有効にする必要があります。

さらに、クライアントではなくサーバーによってアクセス制御を強制する必要があります。クライアント・モバイル・アプリケーションがこの機能を担うと、安全性が低下します。アクセス制御サービス(ACS)を使用すると、開発者は、サーバー上で定義されたロール/権限を使用してモバイル・アプリケーションでアクセス制御を強制することができます。アクセス制御サービスは、アプリケーションで有効なユーザー・ロール/権限をフィルタリングするためにアプリケーション開発者が実装できる、RESTfulサービスです。アプリケーションでは数千のユーザー・ロールがサポートされている場合がありますが、このサービスは、モバイル・アプリケーションに対して指定したロールのみを返します。詳細は、第29.5.20項「アクセス制御の構成方法」を参照してください。

28.6 不適切な暗号化

次の理由により、暗号化は不確実なものになります。

1. アプリケーションで間違った実装を使用しているか、または既知のアルゴリズムを不正に使用している。

2. 暗号が容易に解読されるために、データが安全でない。

さらに、Base-64エンコーディング、不明瞭化およびシリアライズは暗号化ではありません(暗号化と誤解しないようにしてください)。

データを正常に暗号化するには:

- 暗号化データと一緒にキーを格納しないでください。

- プラットフォーム固有のファイル暗号化APIまたは別の信頼できるソースを使用します。暗号を自分で作成しないでください。

第28.2項「デバイスでの安全でないデータ格納」に示す暗号化方法を使用して、埋込みSQLiteデータベースを保護するのに加えて、SSLを適用して安全なWebサービス・コールを作成します(第28.3項「不十分なトランスポート・レイヤー保護」を参照)。MAFは資格証明を安全に処理するために、Mobile and Social IDM SDK用にOracle Access Managerを使用します。

28.7 クロスサイト・スクリプティングからのクライアント側インジェクション

モバイル・アプリケーションは様々なソースからコンテンツおよびデータを取り出すため、ユーザー・セッションを乗っ取るクロスサイト・スクリプティング(XSS)インジェクションに対して脆弱である可能性があります。MAFは主にエンコーディングによってXSSを防止しますが、追加の安全策としてホワイトリストを使用します。

ホワイトリストは、許可されたドメインのみがアプリケーション機能のWebビュー内で開くことができるようにして、MAFアプリケーションをCSRF攻撃から保護します。リストに含まれないURIは、自動的にデバイスのブラウザ内、つまりモバイル・アプリケーションのサンドボックス外で開かれます。

インジェクション攻撃に加えて、モバイル・アプリケーションはクロスサイト・リクエスト・フォージェリ(CSRF)に対して脆弱であり、この攻撃では、悪意のあるページが、ユーザーIDを格納するWebブラウザにキャッシュされたCookieを使用して、ユーザーに代わってターゲット・アプリケーションで意図しないアクションを実行します。ホワイトリストとアプリケーション・サンドボックスを組み合せることで、CSRFの問題に対応します。

28.7.1 ホワイトリストを使用したXSSに対するアプリケーションの保護

MAFアプリケーションでは、リモート・サーバーを介してユーザー・インタフェースが配信されるアプリケーションで、XSSおよびCSRF攻撃が発生する場合があります。リモートURLからコンテンツを取得するようにモバイル・アプリケーションを構成するときは、MAFで提供されている概要エディタを使用して、コンテンツを配信するURLのホワイトリストを作成できます。ホワイトリスト内のURLはMAF Webビューで開かれ、指定したデバイス機能およびサービスにアクセスできます。第20.1.1項「ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化」に示すように、ワイルドカードを使用してホワイトリストされたURIを構成できます。

注意:
意図しないURIがデバイス機能にアクセスするのを防止するには、特定のターゲット・ドメインに対してのみホワイトリストを定義します。ホワイトリスト内のドメインを定義するときは、ワイルドカードを慎重に使用してください。広範囲のURIを指定できるワイルドカードベースのホワイトリスト構成の定義は避けてください(たとえば、<adfmf:domain>*.*</adfmf:domain>などの構成は避けてください)。また、ドメイン名にワイルドカード・アスタリスク(*)を含めることはできますが、これらを末尾に指定することは表示できません(例: <adfmf:domain>example.*</adfmf:domain>)。

28.7.2 デバイス・アクセス権限を使用したインジェクション攻撃からのMAFアプリケーションの保護

ホワイトリストに含めたURIは、ユーザーのデバイスに格納されたデータの他、カメラやアドレス帳などの様々なデバイス機能にアクセスできます。第9.2項「MAFアプリケーションでのコア・プラグインの有効化」に示すようなアクセスは、デフォルトでは付与されていませんが、MAFアプリケーションを構成して、ホワイトリストに含まれるURIがアクセスできるデバイスの機能を次のいずれかに制限できます。

- オープン・ネットワーク・ソケット(ユーザー認証の構成時に許可する必要がある)

- GPSおよびネットワークベースの位置情報サービス

- 連絡先

- 電子メール

- SMS

- 電話

- プッシュ通知

- ローカルに格納されたファイル

ヒント:
ホワイトリスト構成に加えて、updateSecurityConfigWithURLParametersメソッド(ログイン構成の変更を検出してから、再認証によって変更を確認するようにユーザーに求める)を使用して、XSSによって挿入された偽のログイン・ページなどのセキュリティ・リスクから、プログラムによりユーザーを保護することができます(「実行時に名前付き接続の接続属性を更新する方法」を参照)。さらに、MAFはユーザーが保護されたアプリケーション機能を開くたびに、ユーザーに通知します。デフォルト・アプリケーションにセキュリティが適用されないと、認証が遅延する可能性があります。詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスを参照してください。

28.7.3 カスタムHTMLコンポーネントからのインジェクション攻撃のリスクについて

HTMLを使用してMAF AMXページでカスタム・ユーザー・インタフェース・コンポーネントを作成すると、アプリケーションがインジェクション攻撃を受けやすい状態になる可能性があります。MAFは、MAF AMXページのHTMLコンテンツに対して、<amx:verbatim>と<amx:outputHTML>の2つのコンポーネントを提供しています。<amx:verbatim>コンポーネントでは動的HTMLが許可されないため、インジェクション攻撃を受けにくくなります。ただし、ELバインディングによって動的HTMLコンテンツを配信する<amx:outputHTML>コンポーネントは、そのsecurity属性をnoneに構成すると脆弱になる可能性があります。デフォルトでは、onClickイベントなど、フレームワークが様々なHTMLタグをエスケープしてJavaScriptを削除できるように、この属性はhighに設定されています。この属性をnoneに設定すると、iFrameコンポーネントおよびJavaScriptが有効になる(これにより、AMXベージ内でAJAXリクエストが可能になる)ため、HTMLおよびJavaScriptが適切にエンコードされていることを確認する必要があります。詳細は、第13.3.18項「Verbatimコンポーネントの使用方法」および第13.3.19項「出力HTMLコンポーネントの使用方法」を参照してください。また、第28.8項「信頼できない入力に対するセキュリティ決定」も参照してください。

28.7.4 SQLインジェクションおよびXMLインジェクションについて

モバイル・アプリケーションはSQLインジェクションに対して脆弱であるため、攻撃者は埋込みSQLiteデータベースに格納されたデータを読取りできる可能性があります。

SQLインジェクションを防止するには:

- アプリケーション開発者は、ローカル・データベースに格納されたすべてのデータを検証し、エンコードする必要があります。

- アプリケーション開発者は、アプリケーションによって処理されるXMLおよびHTMLコンテンツをエンコードし、検証することが想定されています。

28.8 信頼できない入力に対するセキュリティ決定

iOSプラットフォームとAndroidプラットフォームの両方において、アプリケーション(Skypeなど)は必ずしも外部からの許可をリクエストするとは限らないため、攻撃者にエントリ・ポイントを提供して、悪意のあるアプリケーションがセキュリティを回避してしまう可能性があります。その結果、アプリケーションはクライアント側のインジェクションおよびデータ漏えいに対して脆弱になります。必ず追加の認可を求めるプロンプトを表示するか、あるいは追加の認可が可能でない場合は、保護を必要とするアプリケーションを起動するための追加のステップを提供してください。

アプリケーションが信頼できないサードパーティ・アプリケーションから受信する(またはこれらのアプリケーションに送信する)すべてのデータが、入力検証の対象となっていることを確認する必要があります。アプリケーションに対するクライアント側のXML入力を、エンコードおよび検証する必要があります。MAF AMXコンポーネントではユーザー入力を検証できますが、データはサーバー上で検証する必要があり、サーバーはクライアントから受信するデータを信頼しないようにする必要があります。つまり、サーバーとクライアントの間で送受信されるXML、JSONおよびJavaScriptが適切にエンコードされていることを確認する役割は、サーバーが担います。

別のアプリケーションからMAFアプリケーションを起動するURLスキームを構成するときは、URLを介して送信されるパラメータを検証して、悪意のあるデータまたはURIがMAFアプリケーションに渡される可能性がないことを確認する必要があります。詳細は、第20.4項「カスタムURLスキームを使用したMAFアプリケーションの起動」を参照してください。また、第28.1項「脆弱なサーバー側コントロール」も参照してください。

JSON解析について

可能であれば、MAFのJSONエンコーディングAPIを使用します。カスタムJSON構成を必要とするシナリオでは、ユーザー入力データを使用してJSONを構成するときには注意が必要です。JSONデータの処理の詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスを参照してください。

28.9 不適切なセッション処理

モバイル・アプリケーションのユーザビリティ要件では、多くの場合、長期にわたって継続するセッションが求められます。モバイル・アプリケーションは、セッション管理にCookie、SSOサービスおよびOAUTHトークンを使用します。Oracle Access Management Mobile and Social (OAMMS)では、OAuthトークンがサポートされています。

注意:
OAuthアクセス・トークンは、リモートで取り消すことができます。

適切なセッション処理を有効にするには:

- ログイン・サーバー接続のセッション・タイムアウトを、サーバー側のセッション・タイムアウトよりも小さい値に構成します。
デバイスIDは期限切れになることがないため、セッション・トークンとして使用しないでください。アプリケーションでは、ユーザーが再認証を行う必要が生じても、トークンを期限切れにする必要があります。

- サーバーでのトークン生成時に、適切なベスト・プラクティス(https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Projectの「OWASP Top Ten Project」を参照)に従っていることを確認してください。
容易に予測できるか、または適切に生成されていないセッション・トークンを使用しないでください。セッション・トークンは予測不能で、エントロピが高い必要があります。

Oracle Identity Management (IDM)スタックでは、モバイル・アプリケーションで使用するための標準ベースのトークン(OAuthアクセス・トークン、JWTトークンなど)がサポートされています。MAFでは、Oracle IDM OAuthサーバーに対して即時利用可能なサポートが提供されており、MAFアプリケーションでこのような標準ベースの認証メカニズムを使用することをお薦めします。

第29.5.3項「基本認証の構成方法」で説明されているように、ユーザーがログイン・サーバーに対して認証を行う必要があるアプリケーションの構成には、セッションの持続時間およびアイドル・タイムアウトを設定するオプションが含まれます。デフォルトでは、アプリケーション機能セッションの持続時間は8時間です。アプリケーション機能がアイドル状態にあるデフォルト時間は、5分間です。MAFでは、いずれかの構成期間が過ぎるとユーザー資格証明が期限切れになり、ユーザーに再認証を求めるプロンプトが表示されます。

28.10 バイナリ保護の欠如による機密情報の漏えい

攻撃者はリバース・エンジニアリングを使用して、APIキー、パスワード、機密ビジネス・ロジックなどの機密データを検出できます。この情報を保護するには:

- APIキーおよび機密ビジネス・ロジックをサーバー上に格納します。

- パスワードをアプリケーション・バイナリに格納しないでください。

- パスワードをハードコード化しないでください。かわりに、第28.2項「デバイスでの安全でないデータ格納」で説明されているGeneratedPasswordユーティリティを使用します。

- ログ・ファイルをモニターできるので、アプリケーションが機密情報をログ・ファイルに書き込まないことを確認します。第28.4項「サイドチャネルによるデータ漏えい」も参照してください。

- 情報がファイル・システム上に格納される(つまり、モバイル・アプリケーションの外部に格納される)ことに注意してください。機密データを暗号化されたデータベースまたはファイル・システム、あるいはネイティブ・キー・チェーンに格納します。リスク1:「デバイスでの安全でないデータ格納」も参照してください。

29 MAFアプリケーションの保護

この章では、MAF内のセキュリティ・フレームワークの概要と、セキュリティが適用されるようにMAFアプリケーションを構成する方法について説明します。

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

- 第29.1項「MAFセキュリティの概要」

- 第29.2項「ユーザー・ログイン・プロセスについて」

- 第29.3項「MAFアプリケーションの認証プロセスの概要」

- 第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」

- 第29.5項「MAF接続の構成」

- 第29.6項「MAFアプリケーションのセキュリティの構成」

- 第29.7項「デバイス機能へのアクセスの許可」

- 第29.8項「アプリケーション機能からのユーザーのログアウトの有効化」

- 第29.9項「SSLのサポート」

29.1 MAFセキュリティの概要

保護されているアプリケーション機能がアクティブ化されているとき、MAFによってログイン・ページがユーザーに対して表示されます。たとえば、アプリケーション機能がWebビュー内に表示されようとしているときやオペレーティング・システムがアプリケーションをフォアグラウンドに戻したときなどに、ログイン・ページがユーザーに表示されます。MAFは、アプリケーション機能が認証サーバーによって保護されている場合や、アプリケーション機能にユーザー・ロールまたは権限に基づく制約が含まれる場合に、アプリケーション機能へのアクセスで認証が必要かどうかを判断します。MAFは、ユーザーが有効な資格証明を入力した場合にのみ、目的のWebビュー、UIコンポーネントまたはアプリケーション・ページをレンダリングします。

アプリケーション機能のいずれかにこれらの条件がある場合、ユーザーはログインに成功しないとMAFアプリケーションにアクセスできないことがありますが、保護されておらず、かつアクセス関連の制約がないデフォルトのアプリケーション機能を含めることによって、保護されているアプリケーション機能と保護されていないアプリケーション機能の両方を含むMAFアプリケーションに、ユーザーがアクセスできるようにできます。この状況では、ユーザーは認証なしでMAFアプリケーションにアクセスできます。デフォルトのアプリケーション機能によって、これらの匿名ユーザーに、MAFアプリケーションへのエントランス・ポイントが提供され、これらのユーザーは保護されていないデータを表示でき、保護されたアプリケーション機能にアクセスするときには、リモート・サーバーに対して認証されます。保護されていないデフォルトのアプリケーション機能は、次のように指定できます。

- デフォルトのアプリケーション機能を介して公開情報にアクセスすることを匿名ユーザーに許可するが、保護された情報には権限のあるユーザーのみがアクセスできるようにします。

- 保護されたアプリケーション機能にアクセスする必要がある場合にのみユーザーを認証するようにします。そうでない場合、ユーザーは匿名ユーザーとしてMAFアプリケーションにアクセスでき、保護された機能に移動するにはログインします。

- 保護されたアクセスが必要でない場合は保護されたアプリケーション機能からログアウトすることをユーザーに許可することで、権限のないユーザーが保護されたアプリケーション機能にアクセスすることを明示的に禁止します。

注意:
MAFでは、アプリケーション・ログイン・プロセスがアプリケーションの初期化フローから切り離されているため、匿名ユーザーが可能となり、ユーザーは認証資格証明を提供する必要なく、匿名ユーザーとしてMAFアプリケーションを起動し、保護されていないアプリケーション機能にアクセスできます。このような場合、MAFは権限を持つUIコンポーネントを無効化することによって、ユーザーのアクションを制限します。

詳細は、第29.6.1項「認証を要求するようにアプリケーション機能を設定する方法」および第22.2.4項「ユーザー制約とアクセス制御について」を参照してください。

MAFアプリケーションでは、デフォルト・ページまたはHTMLで記述されたカスタマイズ済のログイン・ページが使用されます。ログイン・ページ以外での認証が必要な場合、ナレッジベース認証(KBA)がOAMサーバー上に構成されていると、ナレッジベース認証ページを有効にできます。KBA画面では、母の旧姓などの追加情報を要求することで、追加のチャレンジがユーザーに表示されます。ログイン・ページと同様、KBA画面はカスタマイズできます。

user.rolesまたはuser.privileges制約を使用して定義されたアプリケーション機能には、特定のロールおよび権限が付与されたユーザーのみがアクセスできます。ユーザーがそのようなアプリケーション機能にログインする場合、アクセス制御サービス(ACS)と呼ばれるWebサービスが、このアプリケーション機能へのアクセスをユーザーに許可するユーザー・オブジェクトを戻します。ACSの詳細は、第29.5.21項「アクセス制御サービスに関する必知事項」を参照してください。

開発者は、デプロイ時にMAFアプリケーションのコンテナ化を選択できます。コンテナ化によって、アプリケーションは、Oracle Mobile Security Suite (OMSS)で構成されているエンタープライズ・ネットワーク・プラットフォームのセキュア・ネットワーク機能とネットワーク・トンネリング機能を利用できます。コンテナ化されたアプリケーションの配布は、Oracle Mobile Security Access Server (MSAS)コンポーネントのアプリケーション・カタログとSecure Workspaceコンテナの各機能を使用して、OMSS管理者が管理します。ユーザーの認証は、必要な認証タイプに対して構成されたMSASが実行します。MAFアプリケーションの開発とOMSSコンテナ化の詳細は、第2.7項「エンタープライズ配布に対応するためのMAFアプリケーションのコンテナ化」を参照してください。

29.2 ユーザー・ログイン・プロセスについて

エンド・ユーザーの視点からは、ログイン・プロセスは次のようなものになります。

注意:
MAFアプリケーションのコンテナ化に伴うログイン・プロセスの変更点の詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

1. ユーザーが保護されたアプリケーション機能にアクセスしようとすると、常に、図29-1に示すログイン・ページのWebビューがMAFによって表示されます。保護されたアプリケーション機能がデフォルトである場合は、ユーザーがアプリケーションを起動すると、MAFによってデフォルトのログイン・ページが表示されます。

図29-1 デフォルトのログイン・ページ

注意:
第29.6.4.2項「カスタム・ログイン・ページ」で説明されているとおり、MAFでは、デフォルト・ログイン・ページを表示するだけでなく、カスタム・ログイン・ページおよびオプションのカスタム・ナレッジベース認証(KBA)画面の使用もサポートされています。

2. ユーザーがユーザー名とパスワードを入力し、「サインイン」をクリックします。

注意:
MAFでは、複数のユーザーが同じアプリケーションを使用できます。ユーザーは、前のユーザーのログアウト後、自由にアプリケーションにログインできます。

3. ユーザー名とパスワードが検証されると、MAFによって、目的のWebビュー、ページまたはユーザー・インタフェース・コンポーネントが表示されます。

4. MAFは、ユーザーが正常にログインするまで、ユーザー名とパスワードの入力を求めます。ユーザーがログインできない場合、別のアプリケーション機能に移動することのみが可能です。

5. ユーザー名とパスワードの認証後、追加の質問による資格証明をチャレンジするナレッジベース認証(KBA)画面がユーザーに表示される場合があります。KBAが構成されている場合、ログイン・プロセスを完了するには、ユーザーが質問に正しく答える必要があります。KBAはオプションの構成で、OAMサーバー上での適切な構成が必要となります。

注意:
アプリケーション機能が最後にアクティブ化されて以降、事前定義された時間が経過すると、認証はタイムアウトになります。MAFでは、認証サーバーへの接続を使用するアプリケーション機能のいずれかがアクティブ化されたときのみ、アイドル・タイムアウトのタイマーの期限が更新されます。

29.3 MAFアプリケーションの認証プロセスの概要

MAFアプリケーションでは、リモート・ログイン・サーバー(Oracle ADF Fusion Webアプリケーションによって使用されるOracle Access Managerアイデンティティ・サーバーなど)、またはユーザーのデバイス上に存在するローカル資格証明ストアに対するユーザー資格証明の検証が必要になる場合があります。ローカルおよびリモート接続モードをサポートするため、MAFでは次の認証プロトコルがサポートされています。

- HTTP Basic

- Mobile-Social

- OAuth

- Web SSO

注意:
MAFアプリケーションのコンテナ化に伴う認証プロセスの変更点の詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

デフォルトでは、MAFアプリケーション・ユーザーの認証は、デザインタイムに選択された認証プロトコルに関係なく、リモート・ログイン・サーバーに対して行われます。開発者は、Oracle Access Management Mobile and Social (OAMMS)およびBasic認証の場合に、ローカル認証を有効化するようアプリケーションを構成できます。ただし、最初は、ローカル資格証明ストアに資格証明が移入されていないため、ログインして保護されたアプリケーション機能にアクセスする場合、リモート・ログイン・サーバーに対する認証が必要となります。リモート認証に成功すると、以降は(デバイス上の認証サーバーからのユーザーのログイン資格証明が格納されている)ローカル資格証明ストアを使用できるようになります。このように、ユーザーが同じアプリケーション・セッション内(つまり、アプリケーション実行のライフサイクル内)でサーバーに対して認証されると、MAFはこの認証コンテキストをローカルに格納し、以降の認証試行に使用できるようにします。この場合、ローカルの認証コンテキストで問題なくユーザーを認証できるときには、MAFはサーバーに接続しません。最初の認証では認証サーバーへの接続が必要ですが、ローカル認証を使用するアプリケーションの場合はそのサーバーに頻繁にアクセスする必要はありません。

ヒント:
ローカル資格証明ストアに対する認証は、リモート・ログイン・サーバーに対する認証よりも高速で実行できますが、リモート接続のみをサポートするOAuthやWeb SSO認証プロトコルを使用した認証をお薦めします。

表29-1に、MAFアプリケーションのログイン構成オプションをまとめます。接続モードは、選択した認証プロトコルによって異なります。

表29-1 MAFの接続モードおよびサポートされている認証プロトコル

接続モード

サポートされているプロトコル

モードの説明

ローカル

- HTTP Basic

- Mobile-Social

ローカルに格納されている資格証明がデバイスで使用不可能な場合にのみ、アプリケーションでリモート・ログイン・サーバーに対する認証を行う必要があります。最初のログインは、常にリモート・ログイン・サーバーに対して行われます。最初のログインが成功すると、MAFは、資格証明をデバイスの資格証明ストア内にローカルに保持します。アプリケーション機能への以降のアクセスでは、それらの資格証明が使用されます。第29.5.19項「Webサービス・セキュリティに関する必知事項」も参照してください。

リモート

- HTTP Basic

- Mobile-Social

- OAuth

- Web SSO

アプリケーションで、Oracle Access Manager (OAM)アイデンティティ・サーバーなどのリモート・ログイン・サーバーまたは保護されているWebアプリケーションに対する認証が必要です。ユーザーがログインするたびに、リモート・サーバーに対する認証が求められます。デバイスがサーバーに接続できない場合、ユーザーは、前回は正常に認証されていても、保護されたMAF機能にアクセスできません。

ハイブリッド

- HTTP Basic

- Mobile-Social

ネットワーク接続が使用可能である場合は、デバイス上のローカル資格証明がで使用可能でも、アプリケーションでリモート・ログイン・サーバーに対する認証を行う必要があります。ネットワーク接続が切断されてログイン・サーバーにアクセスできない場合にのみ、デバイス上のローカル資格証明が使用されます。

例として、次のプロセスは、Mobile-Social認証プロトコルがリモート認証サーバーに対してユーザー資格証明を確認するようにMAFアプリケーションが構成されている場合に、セキュリティのフローを表しています。

1. MAFは、(図29-1のような)ログイン・ページ、またはナレッジベース認証画面をユーザーに表示します。

2. Oracle Access Management Mobile and Social (OAMMS)クライアントSDKのAPIは、認証サーバーと、デバイス上の資格証明ストア(保存済のユーザー・オブジェクトが格納されている場合があります)の両方に対する資格証明認証を処理します。認証に成功すると、APIは有効なユーザー・オブジェクトをMAFに戻します。それ以外の場合は、失敗を戻します。

3. ログインに成功すると、MAFは、Cookieで使用されるOAMトークンを受け取ります。各ログイン接続にCookieが設定されます。

4. OAMMSクライアントSDK APIは、デバイスのローカル資格証明キーストアに資格証明をキャッシュします。アプリケーション・セッション・タイムアウトまたはアイドル・タイムアウトのしきい値を超えると、MAFはローカル資格証明キーストアを消去します。

5. ログインに失敗した場合、ログイン・ページまたはKBA画面が表示されたままになり、ユーザーは先に進むことができません。

29.4 コンテナ化されたMAFアプリケーションの認証プロセスの概要

MAFアプリケーションを開発するときは、ログイン接続を定義してセキュア機能を開発およびテストする必要があります。テストでは、保護されたリソースにアクセスする前に、MAFのログイン・ページを使用して認証が行われます。デプロイ時に、MAFアプリケーションをコンテナ化してOracle Mobile Security Suite (OMSS)で構成されているエンタープライズ・ネットワーク・プラットフォームのセキュア・ネットワーク機能とネットワーク・トンネリング機能を利用するように選択すると、モバイルVPNは不要になります。

コンテナ化されたMAFアプリケーションのデプロイ後、社内ファイアウォールの背後にあるバックエンド・リソースへのアクセスには、OMSSのコンポーネントであるモバイル・セキュリティ・アクセス・サーバー(MSAS)によって集中アクセス・ポイントが提供され、モバイル・デバイスから社内リソースへのトラフィックが保護されます。この場合、MSASインスタンスを構成して認証エンドポイントを適用し、これを使用して最初のユーザー認証が行われます。

ユーザー認証は、MSASが登録済のMAFアプリケーションに対して提供する、コンテナのシングル・サインオン(SSO)統合によって処理されます。MAFアプリケーションがMSASと通信できるようにするには、MSASインスタンスに対して構成されている認証タイプに対応したSecure Workspaceアプリケーションを、ユーザーがインストールして登録します。その後でユーザーが保護されたリソースにアクセスを試みると、MAFのログイン・ページは表示されずに、ユーザーのモバイル・デバイス上にあるSecure Workspaceアプリケーションを通してMSAS独自のログインが表示されます。

注意:
MSASによる認証を有効にしてAppTunnelを使用するには、MAFアプリケーションで定義されているログインURLまたは認証エンドポイントをプロキシするようにMSASインスタンスを構成する必要があります。MAFログイン接続に対応してMSASを構成する方法の詳細は、第29.5.13項「ログイン接続とコンテナ化されたMAFアプリケーションに関する必知事項」を参照してください。

MSAS AppTunnelを使用してバックエンド・リソース・リクエストをプロキシするかどうかは、MAFアプリケーションとSecure Workspaceアプリケーションが使用するMSAS生成のプロキシ自動構成ファイルによって決まります。AppTunnelは、各Secure Workspaceアプリケーションからの相互認証されたSSLトンネルで、コンテナ化されたMAFアプリケーションへのセキュアなアクセスを提供します。AppTunnelは遷移中のすべてのデータを暗号化し、ユーザーのモバイル・デバイス上にある統制外のアプリケーションから保護して、デバイス・レベルのモバイルVPNに対応します。

コンテナ化されたMAFアプリケーションに対するOMSSのサポートの概要は、第2.7項「エンタープライズ配布に対応するためのMAFアプリケーションのコンテナ化」を参照してください。

29.5 MAF接続の構成

セキュリティが適用されるアプリケーション機能用に、アプリケーション・ログイン・サーバーへの接続を少なくとも1つ定義する必要があります。アプリケーション・ログイン・サーバーへの定義済の接続が存在しないと、無効な構成になります。その結果、アプリケーションは正しく機能しません。

29.5.1 MAFログイン接続の作成方法

図29-2に示すように、「MAFログイン接続の作成」ダイアログを使用して接続タイプを選択し、接続タイプに応じて、ローカルおよびリモート認証の両方を有効化します(ハイブリッド)。アプリケーション要件に応じて、次の認証プロトコルをサポートするサーバーへの接続を構成できます。

- HTTP Basic

- Mobile-Social

- OAuth

- Web SSO

注意:
OAuthまたはWeb SSO接続タイプを使用したログイン・サーバーへの接続を構成することをお薦めします。OAuthおよびWeb SSOでは、リモート・ログイン・サーバーに対する認証が必要となり、デバイス上でのローカル資格証明ストアからの認証をユーザーに許可しません。

図29-2 認証の構成

ログイン・サーバー接続を作成するには:

1. 次のアクションのいずれかを実行します。

- ナビゲータで、「ディスクリプタ」ノード、「ADF META-INF」と開き、maf-application.xmlをダブルクリックします。次に、maf-application.xmlファイルの概要エディタで、「セキュリティ - 認証とアクセス制御」セクションを展開し、「作成」をクリックします(図29-3を参照)。

図29-3 サーバー接続の追加

- または、「新規ギャラリ」で「接続」を選択し、「MAFログイン・サーバー接続」を選択します。

2. 「MAFログイン接続の作成」ダイアログで、目的の「認証サーバー・タイプ」を選択します。

3. 次の項の説明に従って接続タイプを構成します。
ダイアログに表示される、アスタリスクが付いたオプションは必須フィールドであることに注意してください。このダイアログでは、すべての必須フィールドが入力された後にのみ「接続のテスト」ボタンが有効になります。このボタンは、Basic認証がダイアログで選択されている場合にのみ表示されます。

29.5.2 マルチテナント対応MAFログイン接続の作成方法

図29-4に示すように、「MAFログイン接続の作成」ダイアログを使用して、1つのアプリケーションに異なる組織(テナント)で共有可能な1つのホスト・アプリケーション機能が含まれ、それが特定のテナントによって所有されているように見える、マルチテナントの概念がサポートされたMAFアプリケーション接続を作成できます。次の認証プロトコルをサポートするサーバーへのマルチテナント対応の接続を構成できます。

- HTTP Basic

- Mobile-Social

図29-4 マルチテナント対応の接続の構成

図29-5に示すように、MAFアプリケーションで表示されるマルチテナント対応の接続が定義されたデフォルトのログイン・ページでは、HTTPリクエストでテナント値を伝播するため、ドメインIDの入力をユーザーに要求します。

図29-5 マルチテナント対応の接続用のデフォルト・ログイン・ページ

マルチテナント対応のログイン・サーバー接続を作成するには:

1. 次のアクションのいずれかを実行します。

- ナビゲータで、「ディスクリプタ」ノード、「ADF META-INF」と開き、maf-application.xmlをダブルクリックします。次に、maf-application.xmlファイルの概要エディタで、「セキュリティ - 認証とアクセス制御」セクションを展開し、「作成」をクリックします(図29-6を参照)。

図29-6 サーバー接続の追加

- または、「新規ギャラリ」で「接続」を選択し、「MAFログイン・サーバー接続」を選択します。

2. 「MAFログイン接続の作成」ダイアログで、マルチテナント・ログインに対応している「認証サーバー・タイプ」を選択します。

3. 図29-4に示すように、「カスタム・ヘッダー」タブをクリックして、次を構成します。

- マルチテナント対応: MAFアプリケーション接続にマルチテナント対応を定義する場合に選択します。第29.5.11項「マルチテナント対応の接続の作成時に行われる処理」も参照してください。

- マルチテナント対応スキーム: テナントのドメインIDを認証サーバーに伝播する場合に使用するスキームを選択します。個別のヘッダーとして送信するには、「カスタム・ヘッダー」(デフォルト)を選択します。「ユーザー名」オプションは下位互換性をサポートし、テナントIDをユーザーIDの一部として送信します(ユーザー名の混在と呼ばれます)。

- ヘッダー名: 認証サーバーで必要とされるテナント・ヘッダー名を入力します。たとえば、ログイン時にテナントIDの入力をエンド・ユーザーに要求するには、マルチテナント・ヘッダー名「X-ID-TENANT-NAME」を入力します。図29-5に示すように、デフォルトのログイン・ページでは、ドメイン名の入力をユーザーに要求します。

- カスタム・ヘッダー: オプションで、認証の実行に必要な追加のカスタム・ヘッダー名を入力します。これらは、マルチテナント・ヘッダーの他に構成される場合があります。第29.5.16項「カスタム・ヘッダーに関する必知事項」も参照してください。
カスタム・ヘッダーのヘッダー値を把握している場合は、その値を入力します。指定したカスタム・ヘッダーの値がログイン時にオーバーライドされる場合は、対応する「値」フィールドを空のままにします。実行時にヘッダー値を指定する場合は、OverrideConnectionHandler APIを使用して値をプログラムで設定する必要があります。APIを使用してヘッダーを構成する方法の詳細は、第29.5.23項「認証の前にログイン資格証明をプログラムで構成する方法」を参照してください。

4. 次の項の説明に従って接続タイプを構成します。
ダイアログに表示される、アスタリスクが付いたオプションは必須フィールドであることに注意してください。このダイアログでは、すべての必須フィールドが入力された後にのみ「接続のテスト」ボタンが有効になります。このボタンは、Basic認証がダイアログで選択されている場合にのみ表示されます。

29.5.3 Basic認証の構成方法

図29-7に示すように、「MAFログイン接続の作成」ダイアログで「HTTP基本」認証サーバー・タイプを選択して、Basic認証の接続を構成できます。

図29-7 Basic認証の構成

Basic認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「HTTP基本」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第29.5.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を定義します。

- 接続モード: 表29-1に示すように、認証のタイプを選択します。

- 接続名: 接続の名前を入力します。

- アイドル・タイムアウト: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:
MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を実行しますが、セッション・タイムアウト後にこの認証を実行することはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- ログイン最大試行回数: ローカル資格証明がクリアされるまでにユーザーに許可する最大ログイン試行失敗回数を設定します。デフォルトで、MAFは、ユーザーに3回のログイン試行の失敗を許可しており、それを超えると、ローカルに格納されているそのユーザーの資格証明をクリアし、以降のログイン試行では、リモート・ログイン・サーバーに接続します。リモート・サーバーに接続した後は、そのユーザーに許可されるログイン試行回数は無制限になります。
ユーザーがログイン試行を指定した回数失敗すると、ローカル資格証明がクリアされるため、MAFはサーバーに対して認証を実行します。これにより、ユーザーは、管理者がユーザーのパスワードを変更した後、パスワードがデバイス上にまだ格納されていない状態で、この新しいパスワードを使用してログインできるようになります。ローカル認証が許可されている場合、ユーザーがサーバー接続へのログインに成功するとパスワードはデバイス上に安全に格納されます。

注意:
アプリケーション機能がローカル認証を使用するように構成されている場合でも、MAFは、ローカルに格納されているユーザー資格証明をクリアします。

3. 図29-8に示すように、「HTTP基本」タブをクリックして、次を構成します。

- ログインURL: ログイン・ページのログインURLを入力します。
ログインURLには、リモート・サーバー上のログイン・ページではなく、HTTP基本認証のユーザー名/パスワードのチャレンジを表示する、保護されたページを指定します。ログインURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースを指すことはできません。

- ログアウトURL: 認証サーバーのログアウトURLを入力します。
ログアウトURLはログインURLと同じ場合もあれば、セッションで追加アクション(無効化など)を実行するリモート・サーバーへのURLの場合もあります。ログアウトURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースを指すことはできません。

図29-8 Basic認証の構成

4. オプションで、図29-4に示すように、「カスタム・ヘッダー」タブをクリックして、次を構成します。

- カスタム・ヘッダー: 認証の実行に必要な任意のカスタム・ヘッダー名を入力します。第29.5.16項「カスタム・ヘッダーに関する必知事項」も参照してください。
カスタム・ヘッダーのヘッダー値を把握している場合は、その値を入力します。指定したカスタム・ヘッダーの値がログイン時にオーバーライドされる場合は、対応する「値」フィールドを空のままにします。実行時にヘッダー値を指定する場合は、OverrideConnectionHandler APIを使用して値をプログラムで設定する必要があります。APIを使用してヘッダーを構成する方法の詳細は、第29.5.23項「認証の前にログイン資格証明をプログラムで構成する方法」を参照してください。

- マルチテナント対応: このオプションを選択して、MAFアプリケーション接続にマルチテナント対応を定義できます。詳細は、第29.5.2項「マルチテナント対応MAFログイン接続の作成方法」を参照してください。

5. 「自動ログイン」タブをクリックし、第29.5.9項「ログイン資格証明の格納方法」の説明に従って、パラメータを構成します。

6. 「認可」タブをクリックし、第29.5.20項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

7. 「一般」タブをクリックし、「接続のテスト」をクリックします。

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

29.5.4 Oracle Mobile and Social Identity Managementを使用して認証を構成する方法

図29-9に示すように、「MAFログイン接続の作成」ダイアログで「Mobile-Social」認証サーバー・タイプを選択して、Oracle Access Manager (OAM)サーバーで認証を行うようにMAFアプリケーションの接続を構成できます。この接続タイプのOAMバックエンドでは、Oracle Mobile and Socialサーバーおよび10g WebGate (リソースに対するHTTPリクエストを捕捉して、認証と認可のためにOAMサーバーに転送するWebサーバー・プラグイン)を実行している必要があります。

図29-9 Mobile-Socialでの認証の構成

始める前に

OAMバックエンドがOracle Mobile and Socialサーバーおよび10g Webgateを実行していることを確認します。

OM_PROP_OAMMS_URLプロパティ・キーを使用するようにサーバーを構成します。このURL (プロトコル、ホスト名およびポート番号を含む)は、Mobile and Socialサーバーにアクセスするために必要です。HTTPおよびHTTPSプロトコルのみがサポートされています。OAM_ID CookieをWebサーバー・リクエスト・ヘッダーに挿入するようにサーバーを構成する必要もあります。

注意:
この接続タイプでは、KBA (ナレッジベース認証)が必要です。詳細は、第29.6.2項「ログイン・ページの指定方法」を参照してください。

Oracle Mobile and Socialサーバーを介したOracle Access Managementでの認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「Mobile-Social」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第29.5.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を定義します。

- 接続モード: 表29-1に示すように、認証のタイプを選択します。

- 接続名: 接続の名前を入力します。

- アイドル・タイムアウト: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:
MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を実行しますが、セッション・タイムアウト後にこの認証を実行することはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- ログイン最大試行回数: ローカル資格証明がクリアされるまでにユーザーに許可する最大ログイン試行失敗回数を設定します。デフォルトで、MAFは、ユーザーに3回のログイン試行の失敗を許可しており、それを超えると、ローカルに格納されているそのユーザーの資格証明をクリアし、以降のログイン試行では、リモート・ログイン・サーバーに接続します。リモート・サーバーに接続した後は、そのユーザーに許可されるログイン試行回数は無制限になります。
ユーザーがログイン試行を指定した回数失敗すると、ローカル資格証明がクリアされるため、MAFはサーバーに対して認証を実行します。これにより、ユーザーは、管理者がユーザーのパスワードを変更した後、パスワードがデバイス上にまだ格納されていない状態で、この新しいパスワードを使用してログインできるようになります。ローカル認証が許可されている場合、ユーザーがサーバー接続へのログインに成功するとパスワードはデバイス上に安全に格納されます。

注意:
アプリケーション機能がローカル認証を使用するように構成されている場合でも、MAFは、ローカルに格納されているユーザー資格証明をクリアします。

3. 「Mobile-Social」タブをクリックし、Oracle Access Management Mobile and SocialサーバーへのURLを入力し、MAFアプリケーション・サービス・ドメインを入力します。
また、図29-10に示すように、デバイスでの位置の更新をサーバーで有効化するように接続を構成することもできます。

図29-10 OAM認証の構成

4. オプションで、図29-4に示すように、「カスタム・ヘッダー」タブをクリックして、次を構成します。

- カスタム・ヘッダー: 認証の実行に必要な任意のカスタム・ヘッダー名を入力します。第29.5.16項「カスタム・ヘッダーに関する必知事項」も参照してください。
カスタム・ヘッダーのヘッダー値を把握している場合は、その値を入力します。指定したカスタム・ヘッダーの値がログイン時にオーバーライドされる場合は、対応する「値」フィールドを空のままにします。実行時にヘッダー値を指定する場合は、OverrideConnectionHandler APIを使用して値をプログラムで設定する必要があります。APIを使用してヘッダーを構成する方法の詳細は、第29.5.23項「認証の前にログイン資格証明をプログラムで構成する方法」を参照してください。

- マルチテナント対応: このオプションを選択して、MAFアプリケーション接続にマルチテナント対応を定義できます。詳細は、第29.5.2項「マルチテナント対応MAFログイン接続の作成方法」を参照してください。

5. 「自動ログイン」タブをクリックし、第29.5.9項「ログイン資格証明の格納方法」の説明に従って、パラメータを構成します。

6. 「認可」タブをクリックし、第29.5.20項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

29.5.5 OAuth認証の構成方法

図29-11に示すように、「MAFログイン接続の作成」ダイアログを使用して、サードパーティ・アプリケーション(クライアント)がリモート・サーバーに格納されている保護されたデータまたはサービスへの制限付きアクセスを取得する方法を構成できます。Oracle Mobile and Socialサーバーが提供するリライイング・パーティ認証では、アプリケーションがサードパーティOAuthプロバイダに対する認証を実行できます。Oracle Web Services Manager (OWSM) Lite MobileのADFアプリケーション・エージェントは、Webサービス・コールのセキュリティ・ヘッダーにCookieを挿入します。

図29-11 OAuthの構成

始める前に

OM_PROP_OAUTH_OAUTH20_SERVERプロパティ・キーを使用するようにサーバーを構成します。

OAuthサーバーでの認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「OAuth」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第29.5.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を構成します。

- 接続名: 接続の名前を入力します。

3. 「OAuth」タブをクリックし、図29-12に示すように、次を構成します。

- 「権限タイプ」を選択し、アプリケーションがログイン・ページを取得する場所を決定します。サーバー・ログイン・ページを表示する場合は、「認可コード」を選択します。MAFアプリケーションでデフォルト・ログイン・ページまたはカスタム・ログイン・ページ(構成されている場合)を表示する場合は、「リソース所有者の資格証明」を選択します。

- 「クライアント識別子」を入力し、オプションで、「クライアント・シークレット」フィールドに接続パスワード値を入力します。

- 認可サーバーの「リダイレクト・エンドポイント」およびそのエンドポイントのURIを認可サーバー・エンドポイント自体および「トークン・エンドポイント」に入力します。

- ユーザーのログアウト時にリダイレクトされる「ログアウトURL」を入力します。このフィールドは必須入力で、URLパラメータは特定の認証プロバイダによって決まります。

- アプリケーション内の組込みブラウザにログイン・ページを表示する場合は、「埋込みブラウザ・モードの有効化」を選択します。外部ブラウザにログイン・ページを表示する場合は選択を解除します。シングル・サインオン(SSO)が必要となる場合は、このオプションを選択解除して、アプリケーションによって外部ブラウザが使用されるようにします。

図29-12 クライアントIDおよびエンド・ポイントの構成

4. 「認可」タブをクリックし、第29.5.20項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

29.5.6 Web SSO認証の構成方法

図29-13に示すように、「MAFログイン接続の作成」ダイアログを使用して、クロスドメイン・シングル・サインオンを構成できます。

図29-13 フェデレーテッドSSO認証の構成

Web SSOサーバーでの認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「Web SSO」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第29.5.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を構成します。

- 接続名: 接続の名前を入力します。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

3. 「Web SSO」タブをクリックし、図29-14に示すように、成功したログインおよび失敗したログインを有効化する次のURLを構成します。

- ログインURL: 訪問時にユーザーに対して資格証明の入力を要求するURLを入力します。ログインURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースを指すことはできません。

- ログアウトURL: サーバー・セッションを終了してユーザーをログアウトする、サーバー側URLを入力します。ログアウトURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースを指すことはできません。

- ログイン成功URL: ユーザーが認証成功後にリダイレクトされるターゲットURLを入力します。
ログイン成功URLはログインURLと同じにできます。たとえば、ログインURLとログイン成功URLがhttp://www.mysite.comの場合、ユーザーがブラウザでhttp://www.mysite.comを指定すると、ブラウザはまずサイトのログイン・ページにリダイレクトされ、そこで認証に成功するとhttp://www.mysite.comに再びリダイレクトされます。その後、MAFでは、ログイン成功URLによって指定されたページを検出すると、ログイン・プロセスを完了してリクエストされた機能をアクティブにします。このようにして、ログイン成功URLページの内容がユーザーに表示されることなく、ユーザーはMAF機能にアクセスできるようになります。

- ログイン失敗URL: ユーザーが認証失敗後にリダイレクトされるURLを入力します。失敗用のURLがない場合は、任意のURLを入力します。
ブラウザにログイン失敗URLがロードされると、MAFはまずエラーを検出してから、アプリケーションに制御を戻します。これは、MAFアプリケーションによってユーザーの最大ログイン試行回数が制限されている場合に有用です。この場合、ユーザーが許容回数の最後の試行で認証に失敗すると、MAFによってログイン失敗URLにリダイレクトされます。

失敗用のURLがない場合は、任意のURLを入力しても構いません。この場合、ユーザーがログイン・ページのキャンセル・ボタンをクリックするか、所定の期間内にユーザーアクションが行われなかったためにログインがタイム・アウトすると(非アクティブのタイムアウトは2分)、認証が終了します。

図29-14 認証URLの構成

4. 「認可」タブをクリックし、第29.5.20項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

29.5.7 MAFアプリケーション・ログイン用プレースホルダ接続の構成方法

図29-15に示すように、「MAFログイン接続の作成」ダイアログを使用して、開発時に名前付き接続を作成し、実行時にログイン属性を移入してこの接続の定義を完成させることができます。この接続タイプは、デザインタイムに接続属性の一部がわからない場合に特に便利です。

アプリケーション開発者は、AdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIを使用して、第29.5.8項「実行時に名前付き接続の接続属性を更新する方法」の説明に従って、デザインタイムに作成されたプレースホルダ接続を完全に定義する必要があります。

図29-15 プレースホルダ接続の構成

実行時に定義するためのプレースホルダ接続を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「実行時に値を指定」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第29.5.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで接続名を入力します。
アプリケーション開発者はこの識別子を使用して、第29.5.8項「実行時に名前付き接続の接続属性を更新する方法」の説明に従って、更新する接続を識別します。

3. 「認可」タブをクリックし、第29.5.20項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

29.5.8 実行時に名前付き接続の接続属性を更新する方法

アプリケーション開発者は、AdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIを使用して、プレースホルダ(図29-15に示すように「MAFログイン接続の作成」ダイアログで「実行時に値を指定」を選択した場合)、または完全に設定された接続定義のいずれかによって、すでに存在する接続の接続属性を定義または再定義できます。

注意:
通常のタイミングでは、アプリケーション・ライフサイクル・リスナー内のstart()メソッド実装でAdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIをコールします。このメソッドを機能ライフサイクル・リスナー内からコールしないでください。

configUrlParamパラメータに関連付けられた接続属性を更新するには、updatedSecurityConfigWithURLParametersメソッドを次のようにコールします。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.updateSecurityConfigWithURLParameters(configUrlParam,
key, message, showConfirmation);

keyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして設定されます。このメソッドをshowConfirmationパラメータをtrueに設定して呼び出すと、MAFが既存の接続の属性に対する接続構成の変更を検出した場合にエンド・ユーザーに確認のプロンプトを表示できるようになります。

oracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスおよびconfigUrlParamパラメータの使用の詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

29.5.9 ログイン資格証明の格納方法

セキュリティが重要でない場合、MAFではユーザー資格証明を格納することがサポートされており、これを(ログイン接続で定義したモードに応じて)ログイン・サーバーに対してリプレイしたり、ユーザーのローカル認証に使用することができます。資格証明を格納すると、ユーザーはログインしないでMAFアプリケーションにアクセスできるようになるため、ユーザーの操作性が向上します。IDM Mobile SDKにより、MAFは次のモードをサポートできるようになります。

- ユーザー名を記憶: MAFはユーザー名をキャッシュし、ログイン・ページのユーザー名フィールドに移入します。ユーザーがパスワードを入力し、ログイン・ボタンをタップして確認すると、MAFはこれらの資格証明を認証サーバーに対してリプレイします。

- 資格証明を記憶: MAFはユーザー資格証明をキャッシュし、ログイン・ページのユーザー名フィールドとパスワード・フィールドに移入します。ユーザーがログイン・ボタンをタップしてこれらの資格証明を確認すると、MAFはそれらを認証サーバーに対してリプレイします。

- 自動ログイン: MAFは、ユーザー資格証明をキャッシュし、これらを以降の認証で認証サーバーに対してリプレイします。このモードでは、ユーザーは、MAFによって資格証明の入力や確認を求められることなくアプリケーションを起動できます。ただし、MAFは新しいアプリケーション・セッションが開始されたことをユーザーに知らせることができます。

注意:
ユーザーは、これらの資格証明をMAFが格納するかどうかを決定できます。

図29-16に示すように、「MAFログイン接続の作成」ダイアログの「自動ログイン」ページを使用して、資格証明格納オプションを選択できます。資格証明オプションを選択すると、ユーザー名とパスワードを記憶するオプションによってログイン・ページが設定されるため、デバイスを複数のエンド・ユーザーが共有する場合は選択しないでください。

図29-16 ユーザー資格証明のキャッシュ

29.5.10 MAFアプリケーションの接続の作成時に行われる処理

MAFでは、connections.xmlファイル内のすべての接続情報が集約されます(このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」パネルの「ディスクリプタ」および「ADF META-INF」ノードの下にあります)。次の例に示すこのファイルは、アプリケーションにバンドルするか、構成サービスにホストできます。後者の場合、MAFは、アプリケーションが起動されるたびに、更新済の構成情報があるかどうかをチェックします。

注意:
MAFアプリケーションの認証の要件として、JDeveloperではadfCredentialStoreKey属性をログイン接続参照と同じ名前に設定します(例: Connection_1)。connections.xmlファイルのadfCredentialStoreKey属性またはログイン接続名を編集する場合、それぞれ同じ値になるように設定してください。同じ値を維持できないと、MAFのランタイム例外が発生します。

<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="Connection_1"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="Connection_1"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://10.0.0.0/SecuredWebServicelogin/login"/>
<logout url="http://10.0.0.0/SecuredWebServicelogout/logout"/>
<accessControl url="http://10.0.0.0/Identity/Authorize"/>
<isAcsCalledAutomatically value="false"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<isMultiTenantAware value="true"/>
<multiTenantHeaderName value="Oracle_Multi_Tenant"/>
<injectCookiesToRESTHttpHeader value="true"/>
<userObjectFilter>
<role name="manager"/>
<privilege name="account manager"/>
<privilege name="supervisor"/>
<privilege name=""/>
</userObjectFilter>
<rememberCredentials>
<enableRememberUserName value="true"/>
<rememberUserNameDefault value="true"/>
<enableRememberPassword value="true"/>
<rememberPasswordDefault value="true"/>
<enableStayLoggedIn value="true"/>
<stayLoggedInDefault value="true"/>
</rememberCredentials>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

詳細は、Oracle Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発のconnections.xmlファイルで定義されている参照に関する項を参照してください。

29.5.11 マルチテナント対応の接続の作成時に行われる処理

「マルチテナント対応」オプションを有効にして、「MAFログイン接続の作成」ダイアログへの入力が完了すると、MAFはtrueに設定された<isMultiTenantAware>要素をconnections.xmlファイルに移入します。マルチテナント接続では、ユーザー名はテナント名とユーザー名の組合せです。

ログイン・ページでは、JavaScriptユーティリティを使用して、接続がマルチテナント対応であるかどうかを識別します。ログイン・ページでそのような接続が検出されると、追加フィールドが表示され、ユーザーは、「MAFログイン接続の作成」(図29-5を参照)で構成したテナント名をそのフィールドに入力する必要があります。(正しいテナントIDの入力を含む)ログインに成功すると、MAFはテナントIDをローカル資格認証ストアに格納します。

29.5.12 ログイン接続構成に関する必知事項

保護されたMAF機能へのアクセス権を付与するためのログインURLをconnections.xmlファイルまたはプログラムを使用して定義する場合、ログインURLはmydocument.txtのようなファイル・リソースを指すことはできません。このログインURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースが使用されていると、MAFアプリケーションがハングするかログインに失敗して、ユーザーが保護されたMAF機能にアクセスできない場合があります。

29.5.13 ログイン接続とコンテナ化されたMAFアプリケーションに関する必知事項

Oracle Mobile Security Suite (OMSS)のAppTunnel機能を使用して社内リソースにアクセスするには、MAFアプリケーションがリソースにアクセスする場合に使用するURIまたはエンドポイントをプロキシするようにモバイル・セキュリティ・アクセス・サーバー(MSAS)インスタンスを構成する必要があります。詳細は、『Oracle Mobile Security Access Serverの管理』のモバイル・セキュリティ・アクセス・サーバー・アプリケーションの管理およびモバイル・セキュリティ・アクセス・サーバー・インスタンスの構成の各章を参照してください。

HTTP基本認証はOMSSでサポートされていますが、MAFログイン・ページはOMSSの認証プロセスによって非表示にならないため、ユーザーは2回認証を行う必要があります。

コンテナ化されたMAFアプリケーションでの認証の詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

29.5.14 ローカルおよびハイブリッド・ログイン接続の場合の複数のアイデンティティに関する必知事項

リモート接続と同様、ローカルおよびハイブリッド・ログイン接続モードでは、ユーザーは、アプリケーション・ライフサイクル内で、任意の数のアイデンティティを使用してログインおよびログアウトできます。これらの接続モードを使用するようにログイン接続を定義すると、現在のセッションのタイムアウト期間内に、保護されているアプリケーション機能に前にログインしたユーザーは、ローカル資格証明ストアを使用して、保護されているアプリケーション機能に再びログインできます。この場合、明示的にログアウトしたユーザー、またはアイドル・タイムアウトが経過したためにログアウトしたユーザーは、保護されているアプリケーション機能(またはそのアプリケーション機能を保護しているログイン・サーバーにより保護されている他のアプリケーション機能)に再びログインできます。

注意:
ローカルおよびハイブリッド接続は、Basic認証、およびOracle Access Management Mobile and Social (OAMMS)への認証にのみ使用できます。OAuthおよびフェデレーテッドSSOは、リモート認証を使用するため、アプリケーション・ユーザーは、認証に成功しないかぎり、再びログインすることはできません。

29.5.15 MAFアプリケーションおよび認証モードの移行に関する必知事項

MAFアプリケーションを移行する場合、maf-feature.xmlで定義されている認証モード(<adfmf:feature id="feature1" name="feature1" credentials="remote">など)が、connections.xmlファイルのauthenticationMode属性で定義されていることを確認する必要があります。credentials属性の存在を検出するJDeveloperの監査ルールを使用すると、その属性をmaf-feature.xmlから削除するのに役立ちます。

connections.xmlファイルのauthenticationMode属性は、remoteまたはlocalとしてのみ定義できるため、none (<adfmf:feature id="feature1" name="feature1" credentials="none">)の値を移行しないでください(移行すると、デプロイメントが失敗します)。

29.5.16 カスタム・ヘッダーに関する必知事項

カスタム・ヘッダーを定義して、「MAFログイン接続の作成」ダイアログへの入力が完了すると、MAFはcustomAuthHeaders要素と各headerサブ要素をconnections.xmlファイルに移入します。

カスタム・ヘッダーの値が実行時に指定される場合、MAFアプリケーションはoracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスのOverrideConnectionHandler APIを使用してヘッダー値を構成できます。oracle.adfmf.framework.api.AdfmfAuthConnectionクラスには、connection.xmlの各XML要素にアクセスし、オーバーラドする場合には最新の値を取得する便利なメソッドが用意されています。APIを使用してヘッダーを構成する方法の詳細は、第29.5.23項「認証の前にログイン資格証明をプログラムで構成する方法」を参照してください。

(正しいヘッダー値を入力して)ログインに成功すると、MAFはヘッダーの詳細をローカル資格証明ストアに格納し、RESTサービスに対して行われるような安全な呼出しを許可して、カスタム・ヘッダーをHTTPリクエストに追加します。

29.5.17 実行時に行われる処理: MAFがREST Webサービスをコールした場合

ユーザーがローカルに認証されると、MAFはMAFアプリケーションがREST Webサービスをコールしたときにログイン・サーバーに対してユーザーをサイレントに認証します。ユーザーの資格証明が認証されると、MAFはREST Webサービスに対するアプリケーションのリクエストを実行します。REST Webサービスが401ステータス・コード(未許可)を戻した場合、MAFはユーザーに再度の認証を指示します。REST Webサービスが302コード(検出または一時的に移動されました)を戻した場合、MAFはログイン・サーバーをチェックして、ユーザーが認証されているかどうかを確認します。そうである場合、コードは302リダイレクトとして処理されます。

ユーザーがログイン・サーバーに対して認証されていない場合、MAFはユーザーに再度の認証を指示します。場合によっては、ログイン・サーバーが、302ステータス・コードを戻したときに、サーバー独自のWebページを使用した認証をユーザーに指示する場合があります。MAFでは、このような場合のリダイレクションをサポートしておらず、かわりにMAFログイン・ページを使用して再度ログインすることをユーザーに指示します。

29.5.18 基本認証ヘッダーの挿入に関する必知事項

アプリケーション機能のWebビューで発行されたHTTPリクエスト内に基本認証ヘッダーを挿入することによって、アプリケーション機能がセキュア・リソースにアクセスすることを可能にします。これは、リモートのWebリソースが基本認証によって保護され、Cookieでは認証に不十分な場合、またはサーバーがCookieをまったく受け付けない場合に有用です。「MAFログイン接続の作成」ダイアログの「認可」タブにある「レルム」入力フィールドにリクエスト・レルムを指定します(開発時に把握している場合)。開発時に把握していない場合は、実行時にAdfmfJavaUtilities.overrideConnectionPropertyを使用してリクエスト・レルムを変更できます。

次の例は、「レルム」入力フィールド(realm要素)に値を指定した場合、connections.xmlファイルに表示されるエントリを示しています。

<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="connection1"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="connection1"
partial="false" manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className=
"oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://www.us.example.com/userInfo"/>
<logout url="http://www.us.example.com/userInfo"/>
<accessControl url="http://10.0.0.0/identity/authorize"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<cookieNames/>
<realm value="Secure Area"/>
<userObjectFilter/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

29.5.19 Webサービス・セキュリティに関する必知事項

Webサービス用のログイン・ページはなく、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービス・コールのヘッダーに資格証明が挿入されます。Webサービスは、ローカルに格納されている資格証明(ユーザーによる認証サーバーへの最初のログインの成功後、MAFによって保持されている資格証明)を使用してアプリケーション・データにアクセスします。

ローカル資格証明ストアの名前は、ログイン・サーバー接続のadfCredentialStoreKey属性に反映されます(第29.5.10項「MAFアプリケーションの接続の作成時に行われる処理」のadfCredentialStoreKey="Connection_1"など)。Webサービスがこの資格証明ストアを使用できるようにするには、SOAPまたはREST Webサービス接続のadfCredentialStoreKey属性に対して定義されている名前が、ログイン・サーバーのadfCredentialStoreKey属性に対して定義されている名前と一致する必要があります。connections.xmlファイルのadfCredentialStoreKey属性またはログイン接続名を編集する場合、それぞれ同じ値になるように設定してください。同じ値を維持できないと、MAFのランタイム例外が発生します

注意:
connections.xmlファイルの概要エディタはないため、「プロパティ」ウィンドウを使用して、<Reference>要素のadfcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新できます。または、「ソース」エディタを使用して属性を追加または更新できます。

詳細は、第15.7.4項「資格証明の挿入に関する必知事項」を参照してください。

29.5.20 アクセス制御の構成方法

アクセス制御サービス(ACS)は、JSONを使用したRESTful Webサービスであり、オプションでMAFアプリケーションとは別の外部サーバー上にデプロイすることができます。通常は、アプリケーション機能に保護されたコンポーネントが含まれている場合に、ユーザーが単一のHTTP POSTメッセージを介して自身のユーザー・ロールと権限をダウンロードできるよう、MAFアプリケーションにACSサービスを提供します。このサービスをアプリケーションに提供する場合は、ACSサービスを実装してホストする必要があります(MAでは、このサービスは提供されません)。図29-17は、「MAFログイン接続の作成」ダイアログの「認可」ページを示したもので、このページを使用してMAFアプリケーションのアクセス制御を構成します。

図29-17 アクセス制御の構成

アプリケーション・ログイン・サーバーによって付与されるアクセス制御は、第22.2.4項「ユーザー制約とアクセス制御について」で説明されているとおり、そのアプリケーション機能用に構成されているuser.rolesおよびuser.privileges制約の評価に基づきます。たとえば、manager_roleロールを持つユーザーにのみアプリケーション機能へのアクセスを許可するには、maf-feature.xmlファイル内の<adfmf:constraints>要素を次のように定義する必要があります。

<adfmf:constraint property="user.roles"
operator="contains"
value="manager_role"/>
</adfmf:constraints>

アプリケーションの起動時、アプリケーション・ログイン・サーバー接続のために、アクセス制御サービス(ACS)として知られているRESTful Webサービスが呼び出され、そのユーザーに割り当てられているロールと権限がフェッチされます。その後、MAFは、アプリケーション・ログイン・サーバー接続に対してログインするようにユーザーに要求します。

MAFは、取得されたユーザー・ロールと権限に照らして各アプリケーション用に構成されている制約を評価し、関連付けられているすべての制約を満たすユーザーのみがアプリケーション機能を使用できるようにします。

アクセス制御を構成するには:

1. 「MAFログイン接続の作成」ダイアログで、「認可」タブをクリックします。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第29.5.1項「MAFログイン接続の構成方法」を参照してください。

2. 「認可」ページで、図29-17に示すように、認可要件を入力します。

- レルム: 開発時に把握している場合は、基本認証ヘッダーに追加するリクエスト・レルムを指定します(MAFはこの基本認証ヘッダーをHTTPリクエストに挿入します)。
詳細は、第29.5.18項「基本認証ヘッダーの挿入に関する必知事項」を参照してください。

- アクセス制御サービスURL: アクセス制御サービス(ACS)のエンド・ポイントであるURLを入力します。

- ユーザー・ロールのフィルタ・リスト: アプリケーション機能によってチェックされるユーザー・ロールを入力します。セキュリティ・システムには、数千もの定義済のユーザー・ロールおよび権限が存在する可能性があるため、アプリケーション機能に固有のロールが記載されているマニフェスト(これは、アプリケーション機能の開発者によって提供されます)を使用して、このリストを作成します。

- 権限のフィルタ・リスト: アプリケーション機能によってチェックされる権限を入力します。

29.5.21 アクセス制御サービスに関する必知事項

アクセス制御サービス(ACS)は、ユーザーが単一のHTTP POSTメッセージを介して自身のユーザー・ロールと権限をダウンロードできるようにする、JSONを使用したRESTful Webサービスです。これは、特定のユーザーのロールまたは権限(あるいはその両方)を戻すリクエスト・メッセージです。必要なロールと権限のリストを提供することで、特定のロールと権限を戻すこともできます。リクエスト・メッセージは、次のもので構成されています。

- リクエスト・ヘッダー・フィールド: If-Match、Accept-Language、User-Agent、Authorization、Content-Type、Content Length。

- リクエスト・メッセージ本文: ユーザー情報のリクエスト。

- 次のものが含まれている、リクエストされたJSONオブジェクト:

- userId: ユーザーID。

- filterMask: ユーザー・ロールと権限のいずれのフィルタを使用する必要があるのかを判断するために使用される"role"要素と"privilege"要素の組合せ。

- roleFilter: ユーザー情報をフィルタ処理するために使用されるロールのリスト。

- privilegeFilter: ユーザー情報をフィルタ処理するために使用される権限のリスト。

注意:
すべてのロールを戻す必要がある場合は、filterMask配列に"role"要素を含めないでください。
すべての権限を戻す必要がある場合は、filterMask配列に"privilege"要素を含めないでください。

次の例は、HTTP POSTメッセージを示しています。この例では、JSONオブジェクトをペイロードとして識別し、John Smithというユーザーに割り当てられているすべてのフィルタとロールをリクエストします。

Protocol: POST
Authoization: Basic xxxxxxxxxxxx
Content-Type: application/json

{
"userId": "johnsmith",
"filterMask": ["role", "privilege"],
"roleFilter": [ "role1", "role2" ],
"privilegeFilter": ["priv1", "priv2", "priv3"]
}

レスポンスは、次のもので構成されています。

- 次のフィールドを持つレスポンス・ヘッダー: Last-Modified、Content-TypeおよびContent-Length。

- ユーザー情報の詳細を含むレスポンス・メッセージ本文。

- 戻されるJSONオブジェクト。これには次のものが含まれます。

- userId: ユーザーのID。

- roles: ユーザー・ロールのリスト。これは、リクエスト内のroleFilter配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられているロールのリスト全体が戻されます。

- privileges: ユーザーの権限のリスト。これは、リクエスト内のprivilegeFilter配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられている権限のリスト全体が戻されます。

次の例は、ユーザーJohn Smithに割り当てられたユーザー名およびロールと権限を含む、戻されるJSONオブジェクトを示します。

Content-Type: application/json

{
"userId": "johnsmith",
"roles": [ "role1" ],
"privileges": ["priv1", "priv3"]
}

注意:
Webサービスでは、ログイン・ページはありませんが、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービスのヘッダーに自動的に資格証明が追加されます。詳細は、第15.7.4項「資格証明の挿入に関する必知事項」を参照してください。

注意:
ACSサービスを実装してホストする必要があります(MAFモバイルでは、このサービスは提供されません)。

29.5.22 アプリケーションのロード順序の変更方法

MAFは、図29-17に示すように、http://10.0.0.0/Identity/Authorizeなどのアクセス制御サービス(ACS)・エンドポイントを定義するログイン接続に対する認証にユーザーが成功した後にACSを起動します。この動作を変更して、ログインの成功後すぐにACSが呼び出されないようにすることで、ログインとACSの起動との間にカスタム・プロセスを挿入できます。この追加ロジックは、アプリケーションの詳細に基づく、またはユーザーの職責、組織またはセキュリティ・グループに関連する、MAFによってコールされるセキュリティ・コンテキストです。

connections.xmlファイルを<isAcsCalledAutomatically value = "false"/>で更新し、AdfmfJavaUtilitiesクラスの次のメソッド(MAFアプリケーション機能がACSを必要に応じていつでも呼び出すことができるようにする)を使用して、シーケンスを変更できます。

invokeACS(String key, String OptionalExtraPayLoad, boolean appLogin)

invokeACSメソッドにより、追加のペイロードをACSリクエストに挿入できます。第29.5.18項「基本認証ヘッダーの挿入に関する必知事項」に示すように、keyパラメータはconnections.xmlファイルのadfCredentialStoreKeyパラメータに対して定義された値からStringオブジェクトとして戻されます。appLoginパラメータは、ACSが機能アクセスを再評価するようにtrueに設定できます。OptionalExtraPayLoadパラメータは今後使用するために予約されており、使用されていません。

invokeACSメソッドまたはisAcsCalledAutomaticallyパラメータを使用してACSを呼び出すと、アプリケーションのロールベース制約が取得されます。

注意:
MAFは、<isAcsCalledAutomatically value = "false"/>がconnections.xmlファイルに含まれていない場合、ログインの成功後、ACSを自動的に呼び出します。

保護されているアプリケーション機能がinvokeACSメソッドをコールすると、MAFは、アプリケーション・ログイン接続に関連付けられたすべてのアプリケーション機能のユーザー制約(保護されているアプリケーション機能に構成されている制約を含む)をフェッチします。保護されていないアプリケーション機能がこのメソッドをコールすると、MAFはログイン接続に関連付けられた制約のみを取得します。

注意:
invokeACSメソッドに加え、AdfmfJavaUtilitiesクラスには次のライフサイクル・メソッドが含まれます。

- applicationLogout: アプリケーション・ログイン接続をログアウトします。

- featureLogout(<feature_ID>): アプリケーション機能に関連付けられたログイン接続をログアウトします。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

29.5.23 認証の前にログイン資格証明をプログラムで構成する方法

MAFアプリケーションがログイン接続を起動してユーザーを認証する前に、プログラムを使用して接続値を設定できます。この方法は通常、「MAFログイン接続の作成」ダイアログでカスタム・ヘッダー名を定義し、値は実行時に指定する場合に必要になります。接続の詳細をプログラムで構成するには、MAFアプリケーションでoracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスのOverrideConnectionHandler APIを呼び出すことができます。このAPIは現在の接続プロパティ値を新しい値でオーバーライドし、アプリケーションがオーバーライドされた値でログインを開始できるようにします。

接続値をプログラムでオーバーライドするには、一般的に次のプロセスを伴います。

1. オーバーライドするプロパティを定義するXML要素の名前をconnections.xmlファイルから取得します。

2. 認証の前にオーバーライド値を取得します。たとえばMAFアプリケーションでは、これに対応して、エンド・ユーザーに値の入力を要求するようにAMXページを定義できます。

3. オーバーライド・メソッドを(接続プロパティのオーバーライドごとに1つずつ)実装して接続プロパティのgetterメソッドとsetterメソッドを定義するマネージドBeanを起動します。たとえば、AMXページの場合、エンド・ユーザーがコマンド・ボタンをクリックすると、そのユーザーの入力値がマネージドBean上で送信されます。

接続プロパティのオーバーライドを指定するには、connections.xmlファイルを調べて、次のXML要素の定義を取得します。

- 接続参照名。たとえば、ConnWithCustomHeaderなどです。

- オーバーライドする属性を定義するプロパティのXML要素名。たとえば、テナントのドメイン名を伝播する場合に使用するスキームのmultiTenantSchemeなどです。

- オーバーライドするプロパティの属性のXMLサブ要素名。一意の接続プロパティの場合、これは常にvalue要素です。

注意:
カスタム・ヘッダーの場合、すべてのカスタム・ヘッダー定義で同じ要素名を使用して値を指定するため、XML要素のheaderとvalueは使用しないでください。かわりに、カスタム・ヘッダーでは、オーバーライド・メソッドに渡すプロパティと属性に、それぞれContentsとcustomAuthHeadersを使用します。

たとえば、カスタム・ヘッダーの値をオーバーライドするには、次のconnections.xmlファイルで、接続名ConnWithCustomHeader、Contents要素およびcustomAuthHeadersサブ要素を渡して、ヘッダー名/値ペアを定義します。

package mobile;

<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="ConnWithCustomHeader"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="ConnWithCustomHeader" partial="false"
manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
...
<isMultiTenantAware value="true"/>
<multiTenantScheme value="custom_header"/>
<multiTenantHeaderName value="X-ID-TENANT-NAME"/>
<customAuthHeaders>
<header name="State" value="Georgia"/>
<header name="City" value="Atlanta"/>
</customAuthHeaders>
...
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

実行時に接続値のオーバーライドを実行する場合、MAFアプリケーションでは、デフォルトの保護されていない機能を使用し、値のプロンプトおよび値を送信するためのコマンド・ボタンを備えたAMXページを起動して、値の入力を要求することができます。次のサンプルは、マネージドBeanのオーバーライド・メソッドをトリガーするアクション・リスナーを定義するコマンド・ボタンを示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="Home" id="ot1"/>
</amx:facet>
<amx:facet name="primary">
<amx:commandButton id="cb1"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="cb2"/>
</amx:facet>
<amx:inputText label="Name1" id="it1" value="#{applicationScope.OverrideBean.headerName1}"/>
<amx:inputText label="Value1" id="it2" value="#{applicationScope.OverrideBean.headerValue1}"/>
<amx:inputText label="Name2" id="it3" value="#{applicationScope.OverrideBean.headerName2}"/>
<amx:inputText label="Value1" id="it4" value="#{applicationScope.OverrideBean.headerValue2}"/>
<amx:inputText label="TenantHeader" id="it5"
value="#{applicationScope.TestBean.tenantHeaderName}"/>
<amx:inputText label="Scheme" id="it6" value="#{applicationScope.OverrideBean.scheme}"/>
<amx:commandButton text="Override headers" id="cb3"
actionListener="#{OverrideBean.overrideAndGotoOverrideFeature}"/>
</amx:panelPage>
</amx:view>

接続プロパティ値をプログラムでオーバーライドするには、マネージドBeanで接続プロパティのオーバーライドごとにオーバーライド・メソッドを実装します。次の例では、headers HashMapを作成してカスタム・ヘッダー値を渡します。他のプロパティ(MultiTenantHeaderNameなど)の値はconnections.xml定義のXML要素によって一意に定義されているため、マップが必要なのはオーバーライドするカスタム・ヘッダーのみです。

package mobile;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;

import java.util.HashMap;

public class OverrideBean {

private String headerName1 = "", headerName2 = "", headerValue1 = "", headerValue2 = "";
private String tenantHeaderName = "";
private String scheme = "";

// Bean setter and getter methods omitted for brevity
...

// Command button action listener invokes override method implementation
public void overrideAndGotoOverrideFeature(ActionEvent e) {
overrideAndGotoOverrideFeature();
}

// Override method implementation configures custom headers and other connection properties
public void overrideAndGotoOverrideFeature()
{
AdfmfJavaUtilities.clearSecurityConfigOverrides("ConnWithCustomHeader");
HashMap<String, String> headers = new HashMap<String, String>();
headers.put(headerName1, headerValue1);
headers.put(headerName2, headerValue2);
AdfmfJavaUtilities.overrideConnectionProperty("ConnWithCustomHeader", "Contents",
"customAuthHeaders", headers);
AdfmfJavaUtilities.overrideConnectionProperty("ConnWithCustomHeader",
"multiTenantHeaderName", "value",
tenantHeaderName);
AdfmfJavaUtilities.overrideConnectionProperty("ConnWithCustomHeader", "multiTenantScheme",
"value", scheme);
AdfmfJavaUtilities.updateApplicationInformation(false);

}

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}
}

29.6 MAFアプリケーションのセキュリティの構成

maf-feature.xmlとmaf-application.xmlファイルの概要エディタ、および「MAFログイン接続の作成」ダイアログを使用して、セキュリティを構成します。概要エディタを使用すると、認証を必要とするアプリケーション機能をユーザーが選択したときにMAFによって表示されるログイン・ページのタイプ(デフォルトまたはカスタム)を指定したり、ユーザー・ロールまたはユーザー権限ベースの制約を含めることができます。また、セキュリティが必要な埋込みアプリケーション機能を選択することもできます。

29.6.1 認証を要求するようにアプリケーション機能を設定する方法

セキュリティが適用されるように各アプリケーション機能を定義できます。残りのセキュリティ構成は、maf-application.xmlの概要エディタの「セキュリティ」ページを使用して実行します。アプリケーション機能のコンテンツがリモートURLから提供される場合に、この概要エディタを使用すると、リモートURLのコンテンツをMAFのWebビューに表示できるように、ドメインをホワイトリストできます。詳細は、第20章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

図29-18に示されているmaf-feature.xml概要エディタでは、セキュリティを適用するアプリケーション機能を指定できます。

図29-18 アプリケーション機能に対するユーザー資格証明オプションの指定

始める前に

機能のセキュリティを有効にすると、アプリケーションでは、ユーザーを認証するためにネットワークにアクセスする必要があります。ネットワーク・ソケットへのアプリケーション・アクセス権の付与の詳細は、第9.2項「MAFアプリケーションでのコア・プラグインの有効化」を参照してください。

アプリケーション機能に対するユーザー・アクセスを指定するには:

1. ナビゲータのユーザー・インタフェース・プロジェクトで、「アプリケーション・ソース」および「META-INF」フォルダ・ノードを開いてから、maf-feature.xmlをダブルクリックします。

2. maf-feature.xmlファイルの概要エディタで、「機能」表にリストされているアプリケーション機能を選択するか、または「追加」をクリックしてアプリケーション機能を追加します。

3. ログインが必要なすべてのアプリケーション機能に「セキュリティ有効化」を選択します。

ヒント:
このオプションをデフォルト・アプリケーションに適用しない場合、ユーザーは匿名でログインできます(つまり、ログイン資格証明を提示する必要がありません)。ユーザーは、保護されていないデータや機能にアクセスでき、必要に応じてログインできます(認証されたユーザーは保護されたデータと保護されていないデータの両方にアクセスできます)。MAFアプリケーション内に保護されていないアプリケーション機能を提供すると、ユーザーは保護されているアプリケーション機能からログアウトするが、アプリケーション自体に残って、保護されていないアプリケーション機能とデータの両方に引き続きアクセスできます。

29.6.2 ログイン・ページの指定方法

アプリケーション機能のセキュリティを指定したら、図29-19に示されているmaf-application.xml概要エディタの「セキュリティ」ページを使用して、セキュリティが適用される各アプリケーション機能に対して、ログイン・ページの構成およびログイン・サーバーへの接続の作成と割当てを行います。このページにリストされているすべてのアプリケーション機能は、maf-feature.xmlファイルで、セキュリティが必要なものとして指定されています。

通常、アプリケーション機能のグループは、同じログイン・サーバー接続で保護され、ユーザーは、MAFから再度ログインを求められることなく、これらのアプリケーションをどれでも開くことが可能です。ただし、場合によっては、あるアプリケーション機能のセットを保護しているログイン・サーバーと、別のアプリケーション機能のセットを保護しているログイン・サーバーが異なるため、アプリケーション機能で要求される資格証明がそれぞれ異なる可能性があります。このような状況に対応するために、MAFアプリケーション用のログイン・サーバーへの接続をいくつも定義できます。maf-application.xmlファイルでは、機能参照に関連付けられている認証サーバー接続は、次のようにloginConnRefId属性を使用して指定されます。

<adfmf:featureReference refId="feature1" loginConnRefId="BasicAuthentication"/>
<adfmf:featureReference refId="feature2" loginConnRefId="OAMMS"/>

MAFアプリケーションは、HTTPまたはHTTPS経由のBasic認証をサポートしている標準のログイン・サーバーなら、どのログイン・サーバーに対しても認証を受けることが可能です。MAFはまた、Oracle Identity Managementに対する認証もサポートしています。特定のアプリケーション機能用のカスタム・ログイン・ページを選択することもできます。詳細は、第29.6.4項「ログイン・ページに関する必知事項」を参照してください。

注意:
デフォルトでは、保護されているすべてのアプリケーション機能が同じ接続を共有します。この接続は、図29-19に示されているように、<application login server>と表示されます。「機能参照」の「プロパティ」ウィンドウには、このデフォルト・オプションが「ログイン・サーバー接続」ドロップダウン・メニューに<default> (application login server)と表示されます。「MAFログイン接続の作成」ダイアログを使用して、MAFアプリケーション用に定義されている他の接続を選択できます。

図29-19 maf-application.xmlの概要エディタの「セキュリティ」ページ

始める前に

MAFアプリケーションでカスタム・ログイン・ページを使用する場合は、アプリケーション・コントローラ・プロジェクトのpublic_htmlディレクトリ(JDeveloper\mywork\Application\ApplicationController\public_html)にファイルを追加して、図29-20に示されているように「アプリケーション・ナビゲータ」の「Webコンテンツ」ノードからそれを使用できるようにします。第29.6.3項「カスタム・ログインHTMLページまたはカスタムKBAページの作成方法」および第5.4項「外部リソースの選択に関する必知事項」も参照してください。

第22.2.4項「ユーザー制約とアクセス制御について」の説明に従って、ユーザー権限とロール用の制約を追加します。

アクセス制御サービス(ACS)・サーバーをプロビジョニングします。詳細は、第29.5.21項「アクセス制御サービスに関する必知事項」を参照してください。

図29-20 カスタム・ログイン・ページの追加

ログイン・ページおよびKBAページを指定するには:

1. ナビゲータで、「アプリケーション・リソース」パネルを開き、「ディスクリプタ」および「ADF META-INF」フォルダ・ノードを開いて、maf-application.xmlをダブルクリックします。

2. maf-application.xmlファイルの概要エディタで、「セキュリティ」ナビゲーション・タブをクリックします。

3. 「セキュリティ」ページで、ログイン・ページのタイプを指定します。

- ユーザー名とパスワードを受け入れるビューの「ログイン・ページ」を選択します。

- 資格証明に対するチャレンジをユーザーに表示し、ユーザーの答えを受け入れるナレッジベース認証(KBA)ビューの場合は、「KBAページ」を選択します。ナレッジベース認証はOAAMサーバー上に構成でき、別のページで、母の旧姓などの追加の質問に対する入力をユーザーに求めることができます。この機能は、Mobile-Social認証タイプでのみ使用できます。

4. 次のように、選択したログイン・ページ、およびオプションで選択したKBAページのコンテンツ(またはユーザー・インタフェース)を選択します。

- デフォルト: 選択されたすべての埋込みアプリケーション機能で使用されるデフォルト・ログイン・ページまたはKBA画面。詳細は、第29.6.4.1項「デフォルト・ログイン・ページ」を参照してください。デフォルト・ログイン・ページおよびデフォルトKBAページは、MAFによって提供されているものです。

- カスタム: 「参照」をクリックして、アプリケーション・コントローラ・プロジェクト内のファイルのパスの場所を検索します。または、「新規」をクリックして、ログイン・ページまたはKBAページ用のカスタムHTMLページをアプリケーション・コントローラ・プロジェクト内に作成します。詳細は、第29.6.4.2項「カスタム・ログイン・ページ」および第29.6.3項「カスタム・ログインHTMLページまたはカスタムKBAページの作成方法」を参照してください。

ヒント:
「参照」機能を使用してログイン・ページの場所を検索するのではなく、「アプリケーション・ナビゲータ」からログイン・ページをフィールドにドラッグできます。

29.6.3 カスタム・ログインHTMLページまたはカスタムKBAページの作成方法

ログイン・ページ以外での認証が必要な場合、ナレッジベース認証(KBA)がOAMサーバー上に構成されていると、ナレッジベース認証ページを有効にできます。KBA画面では、母の旧姓などの追加情報を要求することで、追加のチャレンジがユーザーに表示されます。ログイン・ページと同様、KBA画面はカスタマイズできます。

MAFのデプロイメントによってwwwディレクトリ内に生成されるアーティファクトであるデフォルトのログイン・ページ(adf.login.htmlまたはadf.kba.html)を変更すると、カスタム・ログイン・ページを作成できます。

始める前に

wwwディレクトリ内のログイン・ページにアクセスするには、MAFアプリケーションをデプロイした後、deployディレクトリに移動します。iOSデプロイメントの場合、ページは次の場所にあります。

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/adf.login.html

および

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/adf.kba.html

Androidデプロイメントの場合、ページは、次の場所にあるAndroidアプリケーション・パッケージ(.apk)ファイル内に配置されます。

application workspace directory/application name/deploy/deployment profile name/deployment profile name.apk/assets/www/adf.login.html

および

application workspace directory/application name/deploy/deployment profile name/deployment profile name.apk/assets/www/adf.kba.html

カスタム・ログイン・ページを作成するには:

1. デフォルト・ログイン・ページを、ユーザー・インタフェース・プロジェクトのpublic_htmlディレクトリ内の場所(JDeveloper\mywork\application name\ApplicationController\public_htmlなど)にコピーします。

2. ログイン・ページの名前を変更します。

3. ページを更新します。

4. maf-application.xmlファイルの概要エディタの「セキュリティ」ページで、「カスタム」を選択し、「参照」をクリックしてログイン・ページの場所を検索します。

29.6.4 ログイン・ページに関する必知事項

アプリケーション機能の認証プロセスのエントリ・ポイントは、activateライフサイクル・イベントです(第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照)。アプリケーション機能がアクティブ化されるたびに(つまり、アプリケーション機能のactivateイベント・ハンドラがコールされるたびに)、アプリケーション機能ログイン・プロセスは実行されます。このプロセスは、ログイン・ページ(デフォルトまたはカスタムのログイン・ページのいずれか)に移動し、そこでユーザー認証が必要かどうかを判断します。ただし、プロセスがログイン・ページに移動する前に、本来意図されていたアプリケーション機能をMAFに登録する必要があります。認証が成功すると、ログイン・ページは、MAFから本来意図されていた宛先を取得し、そこに移動します。

29.6.4.1 デフォルト・ログイン・ページ

MAFによって提供されるデフォルトのログイン・ページは、ログイン・ボタンと、ユーザー名、パスワード、マルチテナント名(オプション)用の入力テキスト・フィールド、およびエラー・メッセージ・セクションから構成されます。これは、HTMLで記述されたクロス・プラットフォーム・ページです。図29-21は、デザインタイムでマルチテナント対応オプションを有効にしたデフォルトのログイン・ページを示し、このページでは、ユーザー名とパスワードの他、テナントのドメイン名の入力が要求されます。

図29-21 マルチテナント・ドメイン・フィールドを備えたデフォルトのログイン・ページ

29.6.4.2 カスタム・ログイン・ページ

maf-application.xmlファイルの概要エディタを使用して、選択したアプリケーション機能用のカスタム・ログイン・ページを追加すると、JDeveloperは、次の例に示されているように、<adfmf:login>要素を追加し、その子要素<adfmf:LocalHTML>を設定します。すべての<adfmf:LocalHTML>要素と同様に、そのurl属性は、public_htmlディレクトリ内の場所を参照します。ユーザー認証メカニズムとナビゲーション・コントロールは、デフォルトのログイン・ページと同じものになります。

<adfmf:login defaultConnRefId="Connection_1">
<adfmf:localHTML url="newlogin.html"/>
</adfmf:login>

カスタム・ログイン・ページはHTMLで記述されています。ログイン・ページとナレッジベース(KBA)・ページの両方のフィールドには、具体的に定義された<input>要素および<label>要素を含める必要があります。

ヒント:
カスタム・ログイン・ページを作成するためのガイドとしてMAFアプリケーションのデプロイ時に生成されたデフォルトのログイン・ページを使用します。wwwディレクトリ内のログイン・ページにアクセスするには、MAFアプリケーションをデプロイした後、deployディレクトリに移動します(第29.6.3項「カスタム・ログインHTMLページまたはカスタムKBAページの作成方法」を参照)。

次の例は、デフォルト・ログイン・ページに必要な<input>および<label>要素を示しています。

<input type="text"
autocorrect="off"
autocapitalize="none"
name="oracle_access_user_id"
id="oracle_access_user_id" value="">
</input>

<input type="text"
autocorrect="off"'
autocapitalize="none"
name="oracle_access_iddomain_id"
id="oracle_access_iddomain_id" value="">
</input>

<input type="password"
name="oracle_access_pwd_id"
id="oracle_access_pwd_id" value="">
</input>

<input type="checkbox"
class="message-text"
name="oracle_access_auto_login_id"
id="oracle_access_auto_login_id">
</input>Keep me logged in

<input type="checkbox"
class="message-text"
name="oracle_access_remember_username_id"
id="oracle_access_remember_username_id">
</input>Remember my username

<input type="checkbox"
class="message-text"
name="oracle_access_remember_credentials_id"
id="oracle_access_remember_credentials_id">
</input>Remember my password

<label id="oracle_access_error_id"
class="error-text">
</label>

<input class="commandButton"
type="button"
onclick="oracle_access_sendParams(this.id)"
value="Login" id="oracle_access_submit_id"/>

次の例は、KBAログイン・ページの必須要素を示しています。

<input type="text"

<label id="oracle_access_kba_ques_id" >Question</label><br>

<input class="field-value"
name="oracle_access_kba_ans_id"
id="oracle_access_kba_ans_id">
</input>

<label id="oracle_access_error_id"
class="error-text">
</label>

<label id="message_id"
class="message-text">
</label>

<input type="button"
onclick="oracle_access_sendParams(this.id)"
value="Login"
id="oracle_access_submit_id"/>

29.6.5 ログイン・ページ要素に関する必知事項

各HTMLログイン・ページに、表29-2にリストされたユーザー・インタフェース要素が含まれている必要があります。

表29-2 ログイン・ページのフィールドおよび関連するID

ページ要素

ID

ユーザー名フィールド

oracle_access_user_id

パスワード・フィールド

oracle_access_pwd_id

ログイン・ボタン

oracle_access_submit_id

取消ボタン

oracle_access_cancel_id

アイデンティティ・ドメイン/テナント名フィールド

oracle_access_iddomain_id

KBA質問フィールド(読取り専用/ラベル)

oracle_access_kba_ques_id

KBA回答フィールド

oracle_access_ans_id

エラー・フィールド

oracle_access_error_id

自動ログイン・チェックボックス

oracle_access_auto_login_id

資格証明を記憶チェックボックス

oracle_access_remember_credentials_id

ユーザー名を記憶チェックボックス

oracle_access_remember_username_id

表29-3には、OnClickイベントで使用される、推奨のJavaScriptコードがリストされています。

表29-3 OnClickイベントで使用されるJavaScript

ボタン

JavaScript

ログイン・ボタン

oracle_access_sendParams(this.id)

取消ボタン

oracle_access_sendParams(this.id)

KBA送信ボタン

oracle_access_sendParams(this.id)

KBA取消ボタン

oracle_access_sendParams(this.id)

29.6.6 アプリケーション機能用セキュリティの構成時のJDeveloperでの処理

セキュリティが適用されるようにアプリケーション機能が指定されると、JDeveloperは、図29-19に示されているように、対応する機能参照で「セキュリティが有効な機能」の表を更新します。参照される各アプリケーション機能が、connections.xmlファイル内に定義されている同じログイン・サーバー接続に対して認証を行うと、JDeveloperは、defaultConnRefId属性を使用して定義されている単一の<adfmf:login>要素(<adfmf:login defaultConnRefId="Connection_1">など)でmaf-application.xmlファイルを更新します。

connections.xmlファイル内に定義されている別のログイン・サーバー接続を使用するように構成されているアプリケーション機能の場合は、JDeveloperは、参照される各アプリケーション機能をloginConnReference属性(<adfmf:featureReference refId="feature2" loginConnRefId="Connection2"/)で更新します。詳細は、第29.6.1項「認証を要求するようにアプリケーション機能を設定する方法」を参照してください。また、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスも参照してください。

29.7 デバイス機能へのアクセスの許可

デバイス機能へのアクセスは、MAFアプリケーションに組み込まれているCordovaプラグインによって定義されます。コア・プラグインのセットはMAFによって提供されます。これらのプラグインの1つを有効にすると、そのプラグインに必要なすべてのデバイス・アクセス権限が有効になります。MAFアプリケーションに組み込まれている他のCordovaプラグインも、必要なデバイス・アクセス権限を有効にします。

MAFアプリケーションの大多数ではネットワーク・アクセスが必要なため、ネットワークにアクセスする権限はデフォルトで有効になっています(デフォルトで有効になっている唯一のデバイス機能)。

- ネットワーク情報: アプリケーションによるネットワーク・ソケットのオープンを許可します。少なくとも1つのデバイス機能のセキュリティが有効な場合、ネットワーク・アクセス機能は有効にしておく必要があります。

デバイス機能の有効化または制限が可能なため、デプロイメント・フレームワークによって更新されるプラットフォーム固有の様々な構成ファイルやマニフェスト・ファイルでは、使用中のデバイス機能(または、MAFアプリケーションに使用が登録されているプラグイン)のみがリストされます。これらのファイルにより、MAFはこれらの機能の使用に関する情報を他のアプリケーションと共有できます。たとえば、AppStoreやGoogle Playに対して、MAFアプリケーションで場所ベースの機能が(搭載されていても)使用されていないことを通知できます。

MAFアプリケーションのCordovaプラグインの詳細は、第9章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

29.8 アプリケーション機能からのユーザーのログアウトの有効化

MAFでは、保護された内容が含まれるか、制約により制限されているアプリケーション機能からユーザーがログアウトした場合、アプリケーション機能は終了されず、ユーザーはアプリケーション内に残り、匿名ユーザーとして保護されていない内容や機能にアクセスできます。MAFでは制約を再度初期化できるため、ユーザーは同じアイデンティティを使用してアプリケーションに繰り返しログインできます。また、ユーザーが異なるアイデンティティを使用してログインできることにより、複数のアイデンティティでアプリケーションへのアクセスを共有することもできます。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスで説明しているAdfmfJavaUtilitiesクラスのlogoutFeatureおよびlogoutメソッドにより、ユーザーはアプリケーションの起動後、認証サーバーに対する明示的なログインおよびログアウトを実行できます。また、これらにより、ユーザーは保護されたアプリケーション機能を呼び出した後に認証サーバーにログインできます。ユーザーは個々のアプリケーション機能からログアウトできますが、同じ接続によって保護されているアプリケーション機能からも同時にログアウトすることになります。

これらのメソッドを使用して、ユーザーは次のことを実行できます。

- アプリケーション機能からログアウトするが、保護されていないコンテンツへのアクセスを継続します(つまり、MAFはアプリケーションを終了しません)。

- ログイン・サーバーで認証する一方、アプリケーションで、保護されているそのコンテンツおよびUIコンポーネントを有効化します。

- MAFアプリケーションまたはアプリケーション機能からログアウトし、別のアイデンティティを使用して再びログインします。

- MAFアプリケーションまたはアプリケーション機能からログアウトし、ロールと権限が更新された同じアイデンティティを使用して再びログインします。

現在の認証サーバーからのログアウトを有効にするには、次のようにAdfmfJavaUtilitiesクラスのlogoutメソッドをコールします。次に例を示します。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.logout();

keyパラメータに関連付けられた認証サーバーからのログアウトを有効にするには、次のようにlogoutFeatureメソッドをコールします。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.logoutFeature(adfCrendentialStorykey);

adfCredentialStorykeyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして戻されます。AdfmfJavaUtiltiesクラスおよびkeyパラメータの使用方法の詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

29.9 SSLのサポート

MAFは、cacerts証明書ファイル(クライアント・アプリケーションとサーバー間のHTTPSハンドシェイクのJavaメカニズム)を提供します。JDeveloperは、アプリケーション・リソースのSecurityフォルダ内にこのファイルを作成します(JDeveloper\mywork\application name\resources\Security\cacertsにあります)。MAFのcacertsファイルにより、信頼できる既知のソースからの一連の証明書がJVMに対して識別され、デプロイメントが可能になります。カスタム証明書を必要とするアプリケーションでは(RSA暗号化が使用されていない場合など)、アプリケーションをデプロイする前にプライベート証明書を追加する必要があります。

始める前に

cacertsファイルの内容を理解しておくと役立ちます。詳細は、『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』のMAFの新しいSSL用cacertsファイルへの移行に関する項を参照してください。

JDeveloperによるcacertsファイルの作成方法についても理解しておくと役立ちます。詳細は、第C.2項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」を参照してください。

cacertsファイルおよびkeytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

プライベート証明書を追加するには:

1. プライベート証明書を作成します。たとえば、new_certという証明書ファイルを作成します。

2. 次のようにして、プライベート証明書をアプリケーションに追加します。

1. シードされたcacertsファイル(cp cacerts cacerts.org)のコピーを作成します。

2. Java SE keytoolユーティリティを使用して、cacertsファイルに証明書を追加します。次の例は、new_certというcacertsファイルへの単一の資格証明の追加を示しています。

keytool -importcert
-keystore cacerts
-file new_cert
-storepass changeit
-noprompt

各証明書に対して同じ手順を繰り返します。表29-4には、keytoolのオプションがリストされています。

表29-4 証明書の追加に関するオプション

オプション

説明

-importcert

証明書をインポートします。

-keystore cacerts file

インポートされた証明書のファイルの場所を特定します。

-file certificate file

新しい証明書を含むファイルを特定します。

-storepass changeit

cacertsファイルのパスワードを提供します。デフォルトでは、パスワードはchangeitです。

-noprompt

証明書を信頼するかどうかを(stdinを介して)ユーザーに確認しないように、keytoolに指示します。

3. 新しいcacertsファイルの内容を目で見て調べて、すべてのフィールドが正しいことを確認します。次のコマンドを使用します。

keytool -list -v -keystore cacerts | more

4. 証明書が指定のホスト名に対するものであることを確認します。

注意:
証明書の共通名(CN)は、ホスト名と正確に一致している必要があります。

5. JVMが読み取れるようにするために、カスタマイズされた証明書ファイルはSecurityディレクトリ(JDeveloper\mywork\application name\resources\Security)に確実に配置してください。

3. アプリケーションをデプロイします。

注意:
デプロイメント時、証明書ファイルがSecurityディレクトリに存在している場合、MAFは、それをAndroidまたはXcodeテンプレート・プロジェクトにコピーし、cacertsファイルのデフォルト・コピーを置き換えます。

4. 保護されているリソースにSSL経由でアクセスできることを確認します。

30 MAFアプリケーションのテストおよびデバッグ

この章では、iOSとAndroidの両方のプラットフォーム用に開発されたMAFアプリケーションのテストとデバッグに関する情報を行う方法について説明します。

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

- 第30.1項「MAFアプリケーションのテストおよびデバッグの概要」

- 第30.2項「MAFアプリケーションのテスト」

- 第30.3項「MAFアプリケーションのデバッグ」

- 第30.4項「ロギングの使用方法と構成」

30.1 MAFアプリケーションのテストおよびデバッグの概要

MAFアプリケーションのテストとデバッグを開始する前に、そのアプリケーションを次のいずれかにデプロイする必要があります。

- iOSデバイス

- iOSデバイス・シミュレータ

- Androidデバイス

- Androidデバイス・エミュレータ

MAFアプリケーションは、デプロイしないと実行できません。詳細は、第27章「MAFアプリケーションのデプロイ」を参照してください。

MAFアプリケーションのテストとデバッグを行うには、通常、次の手順を実行します。

1. スプラッシュ画面、アプリケーション機能のナビゲーション、認証、プリファレンスなど、アプリケーションのインフラストラクチャをテストして、うたわれているすべてのアプリケーション機能が使用可能であることを確認します。

2. アプリケーションにMAF AMXコンテンツが含まれている場合は、このアプリケーション機能のロジック、ページ・フロー、データ・コントロールおよびUIコンポーネントをテストします。

3. 必要に応じてアプリケーションに変更を加えます。

4. モバイル・デバイスを再接続するか、シミュレータを再起動し、さらなるテストおよびデバッグのためにアプリケーションをデプロイして実行します。

30.2 MAFアプリケーションのテスト

MAFアプリケーションをテストするには、次の2つの方法があります。

1. モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。

2. モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。

通常、両方の方法を組み合せて使用することで、最良の結果が得られます。

30.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

iOSデバイス用に開発されたMAFアプリケーションのアクセシビリティをテストするには、次の方法を組み合せて使用してください。

- iOSデバイス・シミュレータ上でアクセシビリティ・インスペクタを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Testing the Accessibility of Your iPhone Application」を参照してください。

- iOSデバイス上でVoiceOverを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Using VoiceOver to Test Your Application」を参照してください。

30.3 MAFアプリケーションのデバッグ

JDeveloperには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してアプリケーションの実行をモニターおよび制御することを可能にするデバッグ・メカニズムが備わっています。詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のアプリケーションのデバッグに関する項を参照してください。

MAFアプリケーションはJDeveloper内部で実行できないため、デバッグの方法が異なります。JDeveloperデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン・インスタンスに接続し、デプロイ済のMAFアプリケーションのJavaの部分を制御します。

MAFは、デバッグ用にプロジェクト・プロパティを自動的に構成します(第30.3.1項「デバッグ構成に関する必知事項」を参照)。JDeveloperを使用してMAFアプリケーション内のJavaコードをデバッグするために実行する必要のある手順は、次のとおりです。

アプリケーションをテストまたはデバッグするには:

1. JDeveloperのメイン・メニューから、「実行」→「アクティブな実行構成を選択」をクリックして、アクティブな実行構成を選択します。

2. 「アプリケーション」ウィンドウで、テストするファイルを右クリックし、「実行」を選択します。
あるいは、デバッグを有効にした状態でアプリケーションを実行する場合は、「デバッグ」を選択します。

ヒント:
「ソース」ビューでMAFアプリケーションのファイルを開き、右クリックして、「実行」または「デバッグ」を選択します。

注意:
事前定義済の実行構成セットを持たない既存のアプリケーションを使用する場合は、新しい実行構成を作成します(第30.3.1項「デバッグ構成に関する必知事項」を参照)。

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

- 第27.1.1.2項「JVMライブラリのデプロイメント」

- 第30.3.1項「デバッグ構成に関する必知事項」

30.3.1 デバッグ構成に関する必知事項

新しいMAFアプリケーションを作成する場合、作成ウィザードでは、デバッグ用にアプリケーション・プロパティが自動的に構成されます。これには、iOSシミュレータまたはAndroidエミュレータやデバイスでMAFアプリケーションの実行またはデバッグを行うために使用できるデフォルトの実行構成の作成が含まれます。これらの実行構成では、JDeveloperの「実行」または「デバッグ」ボタンをクリックすると、MAFアプリケーションの構築、デプロイ、実行またはデバッグができます。JDeveloperの「実行」または「デバッグ」ボタンをクリックし、MAF実行構成を選択すると、実行構成に関連付けられたデプロイメント・プロファイルが実行され、アプリケーションが構築されてターゲット・デバイスにデプロイされます。アプリケーションはデプロイされると、自動的に起動します。「デバッグ」ボタンを選択すると、アプリケーションがデバッガとともに起動します。

実行構成の作成および編集方法の詳細は、第30.3.1.1項「実行構成の作成と構成」を参照してください。

30.3.1.1 実行構成の作成と構成

新しい構成を作成するか、既存の構成を変更するには、次のように「実行構成の編集」ダイアログに入力します(図30-1を参照)。

1. JDeveloperのメイン・メニューで、「アプリケーション」→「プロジェクト・プロパティ」をクリックして、「プロジェクト・プロパティ」ダイアログを開きます。

2. 「プロジェクト・プロパティ」ダイアログで、左側のツリーから「実行/デバッグ」を選択します。
あるいは、「実行」→「アクティブな実行構成を選択」→「実行構成の管理」を選択します。

3. 新しい実行構成を作成するか、既存の実行構成を変更します。
共有設定を使用する場合、「共有設定の編集」をクリックして、新しいMAF実行構成の作成または編集ができるダイアログを開きます。プロジェクト設定を使用する場合は、「新規作成」または「編集」をクリックします。共有設定の場合、実行構成はすべてのプロジェクトで共有されます。「共有設定の使用」はデフォルトのオプションであり、この場合、プロジェクトの追加時に存在するMAF実行構成を使用できます。

4. 次のように、「実行構成の編集」ダイアログに入力します。

- 左側のツリーから「モバイル実行構成」を選択します。

- ターゲット・プラットフォームを選択します。

- デプロイメント・プロファイルを選択します。

- 最大5桁の長さでポート番号を入力します。この数字は、当初はmaf.propertiesファイルに含まれているjava.debug.port propertyの値によってシードされ、ヒント・テキストとして表示されます。ポートに値が指定されていない場合は、シードされた値が使用されます。

- iOSの場合、次のオプションを設定します。

- 「アプリケーション引数」: アプリケーションの実行時の動作をカスタマイズするために、起動時のMAFアプリケーションに渡すことができる引数を入力します。たとえば、-consoleRedirect=/<path>/<to>/log.txtでは、指定されたファイルにログが出力されます。ログ・ファイルを取得するには、パスは絶対パスである必要があります。場所は、現在のユーザーにとって書込み可能である必要があります。

- 「シミュレータ」: アプリケーションをデプロイする先のシミュレータを選択します。オプションは、インストールされているiOS SDKのバージョンによって異なります。

- 「iOSバージョン」: シミュレータが使用するiOSのバージョンを選択します。ドロップダウン・メニューには、選択したデバイスがサポートしているiOSのバージョンが表示されます。

- Androidの場合、次のオプションを設定します。

- 「ターゲット」: デプロイメント・ターゲット(「エミュレータ」または「デバイス」)を選択します。

- 「最大試行回数」: 許可する接続試行の最大回数を選択します。

- 「間隔」(秒): 接続試行間の間隔の長さを秒単位で選択します。

ヒント:
Androidデバイスまたはエミュレータの動作が遅いか、またはタイムアウトになる場合、「最大試行回数」または「間隔」を増やして、Javaが初期化し、Androidスターターを強制的に長く待機させるために十分な時間を確保するか、終了する前に試行を増やしてください。

図30-1 「モバイル実行構成」ダイアログ

30.3.2 iOSプラットフォームでのデバッグ方法

iOSプラットフォームでJDeveloperを使用してMAFアプリケーションをデバッグするには、第30.3項「MAFアプリケーションのデバッグ」で説明されているデバッグ手順に従います。

iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、次を参照してください。

- 第27.4.1項「iOSシミュレータへのiOSアプリケーションのデプロイ方法」

- 第27.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」

- 第27.4.4.2項「テストおよびデバッグ用のAppleデバイスの登録」

30.3.3 Androidプラットフォームでのデバッグ方法

AndroidプラットフォームでJDeveloperを使用してMAFアプリケーションをデバッグするには、第30.3項「MAFアプリケーションのデバッグ」で説明されているデバッグ手順に従います。

Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、第27.3.1項「AndroidエミューレータへのAndroidアプリケーションのデプロイ方法」を参照してください。

Androidデバイスまたはエミュレータで実行中のMAFアプリケーションのデバッグを可能にするには、図30-2のように、maf-application.xmlファイルの「ネットワーク」デバイス・アクセスのオプションを有効にします。

図30-2 Androidによるデバッグの有効化

30.3.4 MAF AMXコンテンツのデバッグ方法

MAFアプリケーションにMAF AMXコンテンツが含まれている場合は、デバイスまたはエミュレータの構成後、JDeveloperの他のアプリケーションをデバッグするときと同じように、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックのインスペクトを行うことができます。

注意:
デバッグできるのは、JavaコードおよびJavaScriptのみです(第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。

30.3.5 JavaコードおよびJavaScriptのデバッグを有効にする方法

maf.propertiesファイルでは、JVMの起動パラメータおよびMAFのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。maf.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置されます(第30.4項「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>/src/META-INFの場所に対応しています。

MAF実行構成を実行すると、maf.propertiesファイルに次のデバッグ・プロパティが自動的に設定されます。

- java.debug.enabled: デバッグ・セッションを行う場合はtrueに設定し、実行セッションを行う場合はfalseに設定します。

注意:
java.debug.enabledがtrueに設定されている場合、JVMは、デバッガが接続を確立するのを待ちます。デバッガが接続に失敗すると、MAF AMXアプリケーション機能のロードが失敗します。

- java.debug.port: 実行対象のMAF実行構成で構成されているポート番号に設定します。

- javascript.debug.enabled: デバッグ・セッションを行う場合はtrueに設定し、実行セッションを行う場合はfalseに設定します。Androidにのみ適用されます。

注意:
iOSシミュレータまたはiOSデバイスでMAFアプリケーションが実行されている場合、JavaScriptデバッグを有効にするためにはjavascript.debug.enabledプロパティは必要ありません。

maf.propertiesファイルの内容は、次のようなものです。

java.debug.enabled=true
java.debug.port=8000

javascript.debug.enabled=true

JDeveloperを使用してJavaコードをデバッグする方法については、第30.3項「MAFアプリケーションのデバッグ」を参照してください。

30.3.5.1 iOS 7およびiOS 8プラットフォーム上でのiOSデバイス・シミュレータを使用したJavaScriptのデバッグに関する必知事項

iOS 7またはiOS 8プラットフォームで作業している場合、Safariブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariのプリファレンスを開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします(図30-3を参照)。

図30-3 Safariブラウザ・オプションの有効化

「Develop」メニューが有効になったら、「iPhone Simulator」または「iPad Simulator」を選択し(図30-4および図30-5を参照)、デバッグするUIWebViewを選択します(図30-6を参照)。

注意:
「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。

図30-4 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ

図30-5 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ

図30-6 Safariブラウザの「Develop」メニューを使用したUIWebViewの選択

図30-7および図30-8に、CSS、DOMおよびHTMLをデバッグ中のSafariのリモートWebインスペクタを示します。

図30-7 リモートWebインスペクタ

図30-8 実行時にリモートWebインスペクタによって解析されたAMXページ

図30-9および図30-10に、Safariブラウザでのブレークポイントを使用したJavaScriptのデバッグを示します。

図30-9 SafariブラウザでのJavaScriptのデバッグ

図30-10 実行時にデバッグされたAMXページ

30.4 ロギングの使用方法と構成

サポートされるすべてのプラットフォームでMAFアプリケーションのロギングを有効にするには、JavaScript (第30.4.2項「JavaScriptのロギングの使用方法」を参照)および埋込みコード(第30.4.3項「埋込みロギングの使用方法」)で、単一ファイルへのログ出力を含む単一構成を使用します。このログ出力には、System.out.printlnおよびSystem.err.println文によって生成された出力が含まれます。

デフォルトのMAFのロギング・プロセスは、次のとおりです。

- アプリケーションの起動時、ロギングが開始されます。

- アプリケーションの以前の実行で生成された既存のログ・ファイルが削除され、現在の実行の内容のみが使用可能になります。

- アプリケーションをiOSデバイス・シミュレータ上で実行している場合、Javaロギング出力へのアクセスに使用できるファイルは、出力のリダイレクションに伴って生成された直後に、その名前と場所が通知されるファイルのみです。このファイルの一般的な場所として、/Users/<userid>/Library/Developer/CoreSimulator/Devices/<device_id>/data/Containers/Data/Application/<container_id>/application.log (<device_id>と<container_id>の参照は、アプリケーションのインストール時にiOSによって作成されたUUIDの長い文字列を表します)などがあります。これらの参照の値は予測できないので、複数のシミュレータまたはアプリケーションがインストールされている場合は、デプロイメント時に使用されるシミュレータに対応するフォルダを特定することは困難です。そのため、-consoleRedirect=/<path>/<to>/log.txtを使用して、既知の場所にログを出力することをお薦めします。

注意:
ログ・ファイルを取得するには、パスは絶対パスである必要があり、場所は現在のユーザーにとって書込み可能である必要があります。

iOSデバイス上でアプリケーションを実行している場合、コンソール出力は、アプリケーションのDocuments/logsディレクトリにあるapplication.logファイルにリダイレクトされます。

Androidでは、出力は、アプリケーションと同じ名前のテキスト・ファイルにフォワードされます。出力ファイルの場所は/sdcardです。この場所が存在していないか、読取り専用として構成されている場合、ログ出力は、アプリケーションの書込み可能データ・ディレクトリに再ルーティングされます。

- logging.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置されます(第30.4項「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>/src/META-INFの場所に対応しています。このファイルでは、すべてのログ出力でjava.util.logging.ConsoleHandlerおよびSimpleFormatterを使用することが定義され、ログ・レベルがSEVEREに設定されます。このファイルを編集して、別のロギング動作を指定できます(第30.4.1項「プロパティ・ファイルを使用したロギングの構成方法」を参照)。

注意:
MAFアプリケーションでは、java.util.loggingパッケージからのロガーを使用することはできません。

MAFのロガーは、次のとおりoracle.adfmf.util.Utilityクラスで宣言されます。

public static final String APP_LOGNAME = "oracle.adfmf.application";
public static final Logger ApplicationLogger = Logger.getLogger(APP_LOGNAME);

public static final String FRAMEWORK_LOGNAME = "oracle.adfmf.framework";
public static final Logger FrameworkLogger = Logger.getLogger(FRAMEWORK_LOGNAME);

MAFアプリケーションで使用するロガーは、ApplicationLoggerです。

oracle.adfmf.util.logging.Traceクラスのメソッドを使用することもできます。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

30.4.1 プロパティ・ファイルを使用したロギングの構成方法

次の例は、ロギングの構成で使用するlogging.propertiesファイルを示しています。

# default - all loggers to use the ConsoleHandler
.handlers=java.util.logging.ConsoleHandler
# default - all loggers to use the SimpleFormatter
.formatter=java.util.logging.SimpleFormatter

oracle.adfmf.util.logging.ConsoleHandler.formatter=
oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.PatternFormatter.pattern=
[%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

#configure the framework logger to only use the adfmf ConsoleHandler
oracle.adfmf.framework.useParentHandlers=false
oracle.adfmf.framework.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.framework.level=SEVERE

#configure the application logger to only use the adfmf ConsoleHandler
oracle.adfmf.application.useParentHandlers=false
oracle.adfmf.application.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.application.level=SEVERE

oracle.adfmf.util.logging.ConsoleHandlerは、カスタム・フォーマッタの受信者としての役割を果たします。

oracle.adfmf.util.logging.PatternFormatterでは、ログ・メッセージの出力を可能にする、次の高度なフォーマット・トークンが許可されています。

- %LEVEL%: ロギング・レベル。

- %LOGGER%: 出力が書き込まれるロガーの名前。

- %CLASS%: ログに記録されるクラス。

- %METHOD%: ログに記録されるメソッド。

- %TIME%: ロギング・メッセージが送信された時間。

- %MESSAGE%: 実際のメッセージ。

使用可能なロギング・レベルは、次のとおりです。

- SEVERE: 重大な障害を示すメッセージ・レベルです。

- WARNING: 潜在的な問題を示すメッセージ・レベルです。

- INFO: 情報メッセージのメッセージ・レベルです。

- FINE: トレース情報を提供するメッセージ・レベルです。

- FINER: このレベルは、かなり詳細なトレース・メッセージを示します。

- FINEST: このレベルは、非常に詳細なトレース・メッセージを示します。

注意:
ロギング・レベルの詳細度を選択するときは、SEVERE、WARNINGおよびINFOレベルで出力の詳細度を上げると、アプリケーションのパフォーマンスに悪影響を及ぼすことに留意してください。

logging.propertiesファイルで定義されているロガーは、oracle.adfmf.util.Utilityクラスから取得されるロガーと一致します(第30.4項「ロギングの使用方法と構成」を参照)。ロギング・レベルも一致します。INFOよりも詳細なロギング・レベルを使用する場合は、ConsoleHandlerのロギング・レベルを、次の例に示されているものと同じレベルに変更する必要があります。

oracle.adfmf.util.logging.ConsoleHandler.formatter=
oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.ConsoleHandler.level=FINEST
oracle.adfmf.util.logging.PatternFormatter.pattern=
[%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

30.4.2 JavaScriptのロギングの使用方法

JavaScriptは、console.log or.error/.warn/.infoに出力を書き込みます。この出力は、System.outユーティリティによってファイルにリダイレクトされます。

メッセージを指定することで、ログの出力をカスタマイズできます。次のJavaScriptコードでは、"Message from JavaScript"出力が生成されます。

<script type="text/javascript" charset="utf-8">
function test_function() { console.log("Message from JavaScript"); }
</script>

ロギング・ファイルに定義されているプロパティを利用するには、adf.mf.logパッケージ、およびそれによって提供されるApplicationロガーを使用する必要があります。

使用可能なロギング・レベルは、次のとおりです。

- adf.mf.log.level.SEVERE

- adf.mf.log.level.WARNING

- adf.mf.log.level.INFO

- adf.mf.log.level.CONFIG

- adf.mf.log.level.FINE

- adf.mf.log.level.FINER

- adf.mf.log.level.FINEST

ロギングをトリガーするには、adf.mf.log.Applicationロガーのlogpメソッドを使用し、そのメソッドのパラメータで次のものを指定します。

- ロギング・レベル

- 文字列としての現在のクラス名

- 文字列としての現在のメソッド

- 文字列としてのメッセージ文字列

次の例は、MAFアプリケーションでlogpメソッドを使用する方法を示しています。

adf.mf.log.Application.logp(adf.mf.log.level.WARNING,
"myClass",
"myMethod",
"My Message");

logpメソッドを実行すると、次の出力が生成されます。

[WARNING - oracle.adfmf.application - myClass - myMethod] My Message

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework JSDocリファレンスを参照してください。

30.4.3 埋込みロギングの使用方法

埋込みロギングでは、次の例に示されているとおり、java.util.logging.Loggerを使用します。EmbeddedClassはプロジェクトで定義されるJavaクラスを表します。

import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.adfmf.util.logging.*;
...
Utility.ApplicationLogger.logp(Level.WARNING,
EmbeddedClass.class.getName(),
"onTestMessage",
"embedded warning message 1");
Logger.getLogger(Utility.APP_LOGNAME).logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 2");
Logger.getLogger("oracle.adfmf.application").logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 3");

このコードによって生成される出力は、次のとおりです。

[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 1
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 2
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 3

30.4.4 iOSプラットフォームでのデバッグおよびロギングにXcodeを使用する方法

MAFプロジェクトの操作にXcodeを使用することは、JDeveloperを使用した次回のデプロイメント中に一部またはすべての変更を失う可能性があるため推奨されませんが、例外的な状況ではこれを使用できます。

始める前に

アプリケーションをJDeveloperからiOSシミュレータにデプロイします。

生成されたプロジェクトを直接Xcodeで開く手順は次のとおりです。

1. workspace_directory\deploy\デプロイメント・プロファイル名\temporary_xcode_project\に移動します。

2. Oracle_ADFmc_Container_Template.xcodeprojというXcodeプロジェクトを開きます。

開発用コンピュータでMac OS 10.8.nを実行し、Xcodeを使用してMAFアプリケーションをデバッグしている場合、IDE内(JDeveloperコンソールまたはXcodeコンソール上)にはJavaを表示できません。この出力は、ファイルにリダイレクトされます(第30.4項「ロギングの使用方法と構成」を参照)。アプリケーションのスキーマに次の引数を追加すると、この動作を無効にし、iOSデバイスまたはそのシミュレータ上でデバッグを実行するときに、XcodeからJava、JavaScriptおよびObjective-Cのログ出力にリアルタイムでアクセスできるようになります。

-consoleRedirect=FALSE

30.4.5 アプリケーション・ログへのアクセス方法

次のAPIを使用して、アプリケーションのログ情報にアクセスできます。

- oracle.adfmf.framework.api.PerfMon

- oracle.adfmf.framework.api.LogEntry

- oracle.adfmf.util.HOTS

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

30.4.6 ロギングを無効にする方法

ロギングの出力がアプリケーション・ログ・ファイルに送られないようにすることができます。この場合、ログ・ファイルは空白のままになるか、作成されません。ロギングが無効になっている場合、アプリケーション・ログにトレース文がなく、stderrおよびstdoutに送られた出力はnullの場所またはエンド・ユーザーがアクセスできないその他の場所にリダイレクトされます。

すべてのロギングを無効にするには、アプリケーションのadf-config.xmlファイルで次のようにdisableLoggingプロパティをtrueに設定します。

<adf-property name="disableLogging" value="true"/>

デフォルトでは、ロギングはMAFアプリケーションで有効化され、disableLoggingプロパティはfalseに設定されます。

adf-config.xmlファイルの詳細は、付録C「MAFアプリケーションとプロジェクト・ファイルの概要」を参照してください。

A トラブルシューティング

この付録では、MAFアプリケーションの様々な側面の問題、およびそれらの問題の診断方法と解決方法について説明します。

この付録の構成は、次のとおりです。

- 第A.1項「iOSシミュレータでの入力コンポーネントの問題」

- 第A.2項「アドレス・ポイント数を制限する地理マップ・コンポーネント」

- 第A.3項「コード署名が原因でデプロイメントが失敗する」

- 第A.4項「credentials属性によりデプロイメントが失敗する」

A.1 iOSシミュレータでの入力コンポーネントの問題

問題:

iOSシミュレータにデプロイされたMAFアプリケーションでは、マウスを使用してあるフィールドから別のフィールドに移動すると、<amx:inputText>コンポーネント・フィールドに入力されたテキストが、その別のフィールドに入力されたテキストの先頭に添付されます。たとえば、名、ミドル・ネーム、姓を入力するテキスト・フィールドがあるページで、名のフィールドにJohnと入力し、ミドル・ネームのフィールドをクリックしてPと入力すると、テキストはJohnPと表示されます。同様に、姓のフィールドをクリックしてSmithと入力すると、そのフィールドのテキストは、図A-1に示されているように、JohnPSmithと表示されます。

図A-1 以降の<amx:inputText>フィールドにおけるテキスト値の連結

注意:
この動作は、iOSシミュレータとWebページでのみ発生し、実際のデバイスでは発生ません。

解決策:

シミュレータで、入力テキスト・フィールド間を移動する場合は、マウスではなく、キーボードを使用します。

A.2 アドレス・ポイント数を制限する地理マップ・コンポーネント

問題:

Googleマップがマップ・プロバイダとして使用されているときは、地理マップ・コンポーネントはすべてのアドレス・ポイントを解決できるわけではありません。この問題の原因には、ビジネス・ライセンスを持たないユーザーのみが、アドレス解決を可能にするジオコーディング・サービスに制限付きアクセスができるというライセンスがあります。

解決策:

MAFは、ジオコーディング・サービスによって生成されるエラー・メッセージ用のハンドラを提供します。アドレス・ポイントの最大許容数を超過する場合、実行時にこれらのメッセージは表示されます。1秒当たり10リクエストに制限されているリクエストの数、および冗長リクエストの数はジオコーディングAPIに送られません。

表A-1に示すエラー・メッセージは、モニタリングする必要があります。

表A-1

エラーID

メッセージ

説明

OVER_QUERY_LIMIT

GeoCoder割当て制限を超過しました。

割当て制限を超過していることを示しています。

REQUEST_DENIED

リクエストが拒否されました。APIキーおよびクライアントIDを確認します。

リクエストにはresult_typeまたはlocation_typeパラメータが入っていても、APIキーもクライアントIDも入っていないため、リクエストが拒否されたことを示しています。

A.3 コード署名が原因でデプロイメントが失敗する

問題:

iOS開発環境では、コード署名エラーにより、MAFアプリケーションのデプロイメントが失敗する場合があります。

解決策:

確実にMAFアプリケーションに署名するには、CODESIGN_ALLOCATEを使用して環境を構成することによって、コード署名データをMach-O (Machオブジェクト)ファイルに追加します。たとえば、ターミナルから次の文字列を入力します。

export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/usr/bin/codesign_allocate"

詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『codesign_allocate(1) OS X Manual Page』および『OS X ABI Mach-O File Format Reference』を参照してください。

A.4 credentials属性によりデプロイメントが失敗する

問題:

maf-feature.xmlファイルのadfmf:feature要素に定義されたcredentials属性が存在すると、JDeveloperではデプロイメントが取り消され、デプロイメント・ログに次のようなエラーが書き込まれます。

XML validation failed for file
/Users/jsmith/jdeveloper/mywork/MobileApplication/ViewController/src/META-INF/maf-feature.xml.
[12:26:44 PM] The file contains the following errors:
Error (Line 3, Column 44): Attribute credentials not defined on element adfmf:feature
Error (Line 10, Column 49): Attribute credentials not defined on element adfmf:feature
Error (Line 19, Column 51): Attribute credentials not defined on element adfmf:feature
Error (Line 35, Column 69): Attribute credentials not defined on element adfmf:feature
Error (Line 50, Column 65): Attribute credentials not defined on element adfmf:feature
[12:26:50 PM] Deployment canceled.
[12:26:50 PM] ----  Deployment incomplete  ----.
[12:26:50 PM] XML validation failed.

解決策:

ADFモバイルで作成したアプリケーションを移行する場合、maf-feature.xml (<adfmf:feature id="feature1" name="feature1" credentials="remote">など)で一度定義された認証モードが、connections.xmlファイルのauthenticationMode属性を使用して定義されていることを確認する必要があります。JDeveloperの監査ルールにより、credentials属性が存在することを検出し、maf-feature.xmlファイルからこの属性を削除することができます。

autneticationMode属性に対して有効な値はlocalおよびremoteのみであるため、none (<adfmf:feature id="feature1" name="feature1" credentials="none">)の値をauthenticateionMode属性に移行するとデプロイメントが失敗するため、移行しないでください。詳細は、第29.3項「MAFアプリケーションの認証プロセスの概要」を参照してください。

B ローカルHTMLおよびアプリケーション・コンテナAPI

この章では、MAF JavaScript API拡張機能、MAFコンテナ・ユーティリティAPI、およびカスタムHTML SpringboardアプリケーションなどのHTMLアプリケーション機能を対象としたAdfmfJavaUtilities APIの使用方法について説明します。

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

- 第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」

- 第B.2項「MAFコンテナ・ユーティリティAPI」

- 第B.3項「getDirectoryPathRootメソッドを使用したファイル・アクセス」

B.1 MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成

JavaScriptを使用してJavaScript API拡張機能をコールすることで、HTMLで作成されたカスタムSpringboardページにナビゲーション機能を追加できます。第4.5項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」で説明したように、JavaScript <script>タグにメソッドを追加することで、コールバックを有効にしてApache Cordovaを使用できます。次の例は、このタグを使用したCordovaのコール方法を示しています。

...
<script type="text/javascript">if (!window.adf) window.adf = {};
adf.wwwPath = "/~maf.device~/www/js/base.js";</script>
<script type="text/javascript" src="/~maf.device~/www/js/base.js"></script>
...

base.jsのインクルード時に仮想パス/~maf.device~/を使用して、ブラウザがリクエストをリモート・サーバーではなくMAFリソースに対するものとして識別できるようにすることをお薦めします。このアプローチはリモートとローカルの両方のHTMLページで機能するので、(提供元にかかわらず) base.jsをHTML機能にインクルードする方法として最適です。詳細は、第20.1.2項「リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化」を参照してください。

注意:
MAFでbase.jsライブラリ・ファイルの前にJQueryのカスタム・バージョンがロードされている場合、MAFではJQuery JavaScriptファイルはロードされません。

ヒント:
www/jsディレクトリにアクセス(およびその場所を確認)するには、まずMAFアプリケーションをデプロイした後、deployディレクトリに移動する必要があります。www/jsディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリはtemporary_xcode_projectディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(.apk)ファイルのassetsディレクトリ内にあります。第4.5項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」も参照してください。

注意:
デザインタイムにはパスが存在しないので、JavaScriptインクルードは、JDeveloperによってソース・エディタ内ではエラーとして赤い波型の下線で強調表示されます。このパスは実行時に解決されます。

Cordova APIに対するMAF拡張機能では、モバイル・デバイスのAPIによってmaf-feature.xmlおよびmaf-application.xmlファイルの構成メタデータにアクセスできるようになります。これにより、モバイル・デバイスとMAFのインフラストラクチャ間の通信が確立します。これらの拡張機能は、アプリケーション機能の表示動作も指示します。

デフォルトのMAF Springboardページ、springboard.amx、およびカスタマイズされたSpringboardの構築に使用できるApplicationFeaturesデータ・コントロールの詳細は、第4.6項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

B.1.1 カスタムHTMLページ内のコードの実行について

次の例は、handlePageShownコールバック関数のshowpagecompleteイベントを定義するスクリプトを示しています。カスタムHTMLページ(ログイン・ページなど)では、MAFによって初めてそのページがロードおよび表示された後、標準的なDOM (Document Object Model)イベント・リスニングを使用してこのイベントをリスニングすることによって、ページに含まれる独自のコードを呼び出すことができます。

<script>
function handlePageShown()
{
console.log("Page is shown!");
}
document.addEventListener("showpagecomplete", handlePageShown, false);
</script>

注意:
showpagecompleteイベントを使用すると、MAFの適切な状態が保証されます。loadやCordovaのdevicereadyなど、他のブラウザやサード・パーティのイベントを使用した場合、この状態は保証されない可能性があります。これらは使用しないでください。

B.2 MAFコンテナ・ユーティリティAPI

MAFコンテナ・ユーティリティAPIのメソッドは、ナビゲーション・バーへの移動、Springboardの表示、アプリケーション機能の表示などの機能をMAFアプリケーションに提供します。これらのメソッドは、MAFのJavaおよびJavaScriptレイヤーで使用できます。

Javaでは、コンテナ・ユーティリティAPIは、静的メソッドとしてAdfmfContainerUtilitiesクラスに実装されます。このクラスはoracle.adfmf.framework.apiパッケージにあります。次の例では、gotoSpringboardメソッドをコールしています。oracle.adfmf.framework.api.AdfmfContainerUtilitiesの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

import oracle.adfmf.framework.api.AdfmfContainerUtilities;
...
AdfmfContainerUtilities.gotoSpringboard();
...

B.2.1 JavaScriptコールバックの使用方法

JavaとJavaScriptのシグネチャは一致します。Javaでは、シグネチャは同期化され、直接結果が戻されます。JavaScriptは非同期なので、結果を返すsuccessコールバックと、スローされた例外を戻すfailedコールバック2つのコールバック関数が各関数に追加されます。Javaメソッドでは、success値は関数またはメソッドから戻され、例外はメソッドから直接スローされます。次の例の疑似コードは、引数を使用しないコールpublic static functionName() throwsが、Java内でtryおよびcatchブロックを使用してどのように実行されるかを示しています。

...
try {
result = AdfmfContainerUtilities.functionName();
}
catch() {
...
}

...

JavaScriptのコールは非同期なので、関数の実行が完了した時点で、コールバック・メカニズムを通して戻す必要があります。次の例の疑似コードは、JavaScriptコールのシグネチャを示しています。

adf.mf.api.functionName(
function(successFunction, failureFunction ) { alert("functionName complete"); },
function(successFunction, failureFunction ) { alert("functionName failed with " +
adf.mf.util.stringify(failureFunction); }
);

JavaScriptのコールは非同期なので、結果を戻すことができません。そのかわりに、関数の実行の完了時にコールバック・メカニズムが必要になります。成功および失敗のコールバックのシグネチャは、どちらもfunction(request, response)です。ここでrequest引数は実際のリクエストのJSON表現です。responseはメソッドから戻されたもののJSON表現です(successコールバック関数の場合)。failedコールバック関数の場合は、スローされた例外のJSON表現になります。

注意:
JavaScriptコールを呼び出して、スタックの深度や競合状態などの問題を回避するには、その前にコールバック関数を呼び出す必要があります。

次の例の疑似コードは、public static <return value> <function name>(<arg0>, <arg1>, ...) throws <exceptions>など、1つ以上の引数を使用するコールが、Java内でtry-catchブロックを使用してどのように実行されるかを示しています。

try {
result = AdfmfContainerUtilities.<function_name>(<arg0>, <arg1>, ...);
}
catch(<exception>) {
...
}

ローカルHTMLまたはリモートURLとして定義されたページからMAF JavaScript APIを起動する方法の詳細は、第20.1.2項「リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化」を参照してください。

B.2.2 コンテナ・ユーティリティAPIの使用方法

コンテナ・ユーティリティAPIでは、次のメソッドが提供されます。

- getApplicationInformation: MAFアプリケーションのメタデータを取得します。

- gotoDefaultFeature: デフォルトのアプリケーション機能をアクティブ化します。

- gotoFeature: 特定のアプリケーション機能をアクティブ化します。

- getFeatures: アプリケーション機能を取得します。

- getFeatureByName: アプリケーション機能の名前を使用して、アプリケーション機能に関する情報を取得します。

- getFeatureById: IDを使用してアプリケーション機能を取得します。

- resetFeature: アプリケーション機能をロード時の状態にリセットします。

- resetApplication: アプリケーションをリセットします。

- gotoSpringboard: Springboardをアクティブ化します。

- showSpringboard: Springboardを表示します。

- hideSpringboard: Springboardを非表示にします。

- showNavigationBar: ナビゲーション・バーを表示します。

- hideNavigationBar: ナビゲーション・バーを非表示にします。

- showPreferences: プリファレンス・ページを表示します。

- invokeMethod: Javaメソッドを起動します。

- invokeContainerMethod: 特定の引数を使用して、指定されたクラス上でネイティブ・メソッドを起動します。

- invokeContainerJavaScriptFunction: JavaScriptメソッドを起動します。

- sendEmail: モバイル・デバイスの電子メール・インタフェースを表示します。

- sendSMS: モバイル・デバイスのテキスト・メッセージ(SMS)インタフェースを表示します。

コンテナ・ユーティリティAPIには、アプリケーションにバッジおよびバッジ番号を設定するためのメソッドが含まれています。詳細は、第B.2.22項「アプリケーション・アイコンへのバッジ設定」を参照してください。

B.2.3 getApplicationInformation

このメソッドは、アプリケーションに関する情報を格納したApplicationInformationオブジェクトを戻します。このメソッドでは、アプリケーションID、アプリケーション名、バージョン、アプリケーションのベンダーといったメタデータが戻されます。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.ApplicationInformation
getApplicationInformation()
throws oracle.adfmf.framework.exception.AdfException

次の例は、このメソッドのコール方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
ApplicationInformation ai = AdfmfContainerUtilities.getApplicationInformation();
String applicationId = ai.getId();
String applicationName = ai.getName();
String vendor = ai.getVendor();
String version = ai.getVersion();
...
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getApplicationInformation(success, failed)

successコールバックはfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値が格納されます。この戻り値は、アプリケーション・レベルのメタデータを格納するApplicatiaonInformationオブジェクトです。ここには、アプリケーション名、ベンダー、バージョンおよびアプリケーションIDが含まれます。

failedコールバックはfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーション情報を取得する方法を示しています。

adf.mf.api.getApplicationInformation(
function(req, res) { alert("getApplicationInformation complete"); },
function(req, res) { alert("getApplicationInformation failed with " +
adf.mf.util.stringify(res); }
);

B.2.4 gotoDefaultFeature

このメソッドは、MAFがデフォルトのアプリケーション機能を表示するようにリクエストします。デフォルトのアプリケーション機能とは、MAFプリケーションの起動時に表示されるアプリケーション機能です。

注意:
認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoDefaultFeature(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数にはエラーが格納されます。

次の例は、これらのコールバック関数を使用してデフォルトのアプリケーション機能をコールする方法を示しています。

adf.mf.api.gotoDefaultFeature(
function(req, res) { alert("gotoDefaultFeature complete"); },
function(req, res) { alert("gotoDefaultFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.5 gotoFeature

このメソッドは、MAFが、IDによって識別されたアプリケーション機能を表示するようにリクエストします。

注意:
認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

Javaでは、このメソッドは次のようにコールされます。

public static void gotoFeature(java.lang.String featureId)
throws oracle.adfmf.framework.exception.AdfException

次の例に示すメソッドのパラメータは、アプリケーション機能のIDです。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.gotoFeature("feature.id");
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoFeature(featureId, success, failed)

featureIdパラメータは、アプリケーション機能IDです。このパラメータはsuccessコールバック関数をアクティブ化します。このコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーション機能をコールする方法を示しています。

adf.mf.api.gotoFeature("feature0",
function(req, res) { alert("gotoFeature complete"); },
function(req, res) { alert("gotoFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.6 getFeatures

このメソッドは、使用可能なアプリケーション機能を表すFeatureInformationオブジェクトの配列を戻します。戻されるメタデータには、機能ID、アプリケーション機能名およびアプリケーション・アイコンに使用するイメージ・ファイルの場所が含まれます。このコールにより、カスタムSpringboardの実装は、制約の適用後に使用可能になるアプリケーション機能のリストにアクセスできるようになります。(これらのアプリケーション機能もデフォルトのSpringboardに表示されることがあります。)

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation[] getFeatures()
throws oracle.adfmf.framework.exception.AdfException

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
FeatureInformation[] fia = null;
fia = AdfmfContainerUtilities.getFeatures();

for(int f = 0; f < fia.length; ++f) {
FeatureInformation fi = fia[i];
String featureId = fi.getId();
String featureName = fi.getName();
String featureIconPath = = fi.getIcon();
String featureImagePath = fi.getImage();
...
}
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getFeatures(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値(FeatureInformationオブジェクトの配列)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数にはエラー(AdfException)が格納されます。

adf.mf.api.getFeatures(
function(req, res) { alert("getFeatures complete"); },
function(req, res) { alert("getFeatures failed with " +
adf.mf.util.stringify(res); }
);

B.2.7 getFeatureByName

このメソッドは、渡されたアプリケーション機能の名前を使用して、アプリケーション機能に関する情報を戻します。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation getFeatureByName(java.lang.String
featureName)
throws oracle.adfmf.framework.exception.AdfException

次の例に示すメソッドのパラメータは、アプリケーション機能の名前です。

...
try {
FeatureInformation fi = AdfmfContainerUtilities.getFeatureByName("feature.name");
String featureId = fi.getId();
String featureName = fi.getName();
String featureIconPath = = fi.getIcon();
String featureImagePath = fi.getImage();
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getFeatureByName(featureName, success, failed)

featureNameパラメータは、アプリケーション機能の名前です。successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.getFeatureByName("feature.name",
function(req, res) { alert("getFeatureByName complete"); },
function(req, res) { alert("getFeatureByName failed with " +
adf.mf.util.stringify(res); }
);

B.2.8 getFeatureById

このメソッドは、アプリケーションIDを使用してアプリケーション機能を取得します。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation getFeatureById(String featureId)
throws oracle.adfmf.framework.exception.AdfException

次の例に示すメソッドのパラメータは、アプリケーション機能のIDです。

try {
FeatureInformation fi = AdfmfContainerUtilities.getFeatureById("feature.id");
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getFeatureById(featureId, success, failed)

featureIdパラメータは、アプリケーション機能のIDです。successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーション機能を取得する方法を示しています。

adf.mf.api.getFeatureById("feature.id",
function(req, res) { alert("getFeatureById complete"); },
function(req, res) { alert("getFeatureById failed with " +
adf.mf.util.stringify(res); }
);

B.2.9 resetFeature

このメソッドは、アプリケーション機能の状態をリセットします。このメソッドでは、アプリケーション機能のJava側のモデルをリセットして、MAFアプリケーションがロードされ、最初にアプリケーション機能が表示されたときのようにユーザー・インタフェース・プレゼンテーションを再起動します。

Javaでは、このメソッドは次のようにコールされます。

public static void resetFeature(java.lang.String featureId)
throws oracle.adfmf.framework.exception.AdfException

次の例に示すメソッドのパラメータは、リセットするアプリケーション機能のIDです。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.resetFeature("feature.id");
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void resetFeature(featureId, success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(アプリケーション機能のID)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーション機能をコールする方法を示しています。

adf.mf.api.resetFeature("feature0",
function(req, res) { alert("resetFeature complete"); },
function(req, res) { alert("resetFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.10 resetApplication

このメソッドは、実行中のアプリケーションをリセットするので、個別のアプリケーション機能をリセットするだけでは不十分な場合にのみ使用してください。詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスを参照してください。

Javaでは、このメソッドは次のようにコールされます。

public static void resetApplication(java.lang.String message)

メソッドのパラメータ(次の例を参照)は、アプリケーションを再起動する理由が記載されたメッセージか、null (メッセージが不要な場合)のいずれかです。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.resetApplication("New content is available");
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void resetApplication(message, success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(アプリケーション機能のID)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーションをコールする方法を示しています。

adf.mf.api.resetApplication("message1",
function(req, res) { alert("resetApplication complete"); },
function(req, res) { alert("resetApplication failed with " +
adf.mf.util.stringify(res); }
);

B.2.11 gotoSpringboard

このメソッドは、MAFがSpringboardをアクティブ化するようにリクエストします。

注意:
maf-application.xmlファイルで機能参照として指定されていない場合や、認証関連または許可関連の問題が発生している場合、このメソッドではSpringboardを表示できないことがあります。第4.2項「アプリケーションのナビゲーションの構成方法」も参照してください。

Javaでは、このメソッドは次のようにコールされます。

public static void gotoSpringboard()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.gotoSpringboard();
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoSpringboard(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.gotoSpringboard(
function(req, res) { alert("gotoSpringboard complete"); },
function(req, res) { alert("gotoSpringboard failed with " +
adf.mf.util.stringify(res); }
);

B.2.12 showSpringboard

このメソッドは、MAFがSpringboardを表示するようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void showSpringboard()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.showSpringboard();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void showSpringboard(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.showSpringboard(
function(req, res) { alert("showSpringboard complete"); },
function(req, res) { alert("showSpringboard failed with " +
adf.mf.util.stringify(res); }
);

B.2.13 hideSpringboard

このメソッドは、MAFがSpringboardを非表示にするようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void hideSpringboard()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.hideSpringboard();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void hideSpringboard(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.hideSpringboard(
function(req, res) { alert("hideSpringboard complete"); },
function(req, res) { alert("hideSpringboard failed with " +
adf.mf.util.stringify(res); }
);

B.2.14 showNavigationBar

このメソッドは、MAFがナビゲーション・バーを表示するようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void showNavigationBar()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.showNavigationBar();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void showNavigationBar(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.showNavigationBar(
function(req, res) { alert("showNavigationBar complete"); },
function(req, res) { alert("showNavigationBar failed with " +
adf.mf.util.stringify(res); }
);

B.2.15 hideNavigationBar

このメソッドは、MAFがナビゲーション・バーを非表示にするようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void hideNavigationBar()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.hideNavigationBar();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void hideNavigationBar(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.hideNavigationBar(
function(req, res) { alert("hideNavigationBar complete"); },
function(req, res) { alert("hideNavigationBar failed with " +
adf.mf.util.stringify(res); }
);

B.2.16 showPreferences

このメソッドは、MAFがプリファレンス・ページを表示するようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void showPreferences()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.showPreferences();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void showPreferences(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.showPreferences(
function(req, res) { alert("showPreferences complete"); },
function(req, res) { alert("showPreferences failed with " +
adf.mf.util.stringify(res); }
);

B.2.17 invokeMethod

このメソッドは、Javaでは提供されません。次の例は、JavaScriptのコールバック・メソッドを使用して、クラスパスに含まれる任意のクラスからJavaメソッドを起動する方法を示しています。

adf.mf.api.invokeMethod(classname,
methodname,
param1,
param2,
...
paramN,
successCallback,
failedCallback);

表B-1に、このメソッドによって取得されるパラメータを示します。

表B-1 invokeMethodに渡されるパラメータ

パラメータ

説明

classname

Javaメソッドのコール時にMAFがインスタンスを作成するために使用するクラス名(パッケージ情報を含む)

methodname

classnameパラメータによって指定されたクラスのインスタンスで起動させるメソッドの名前

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

複数のパラメータによるこのメソッドの使用例は次のとおりです。

- adf.mf.api.invokeMethod("TestBean", "setStringProp", "foo", success, failed);

- adf.mf.api.invokeMethod("TestBean", "getStringProp", success, failed)

整数パラメータの使用例は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testSimpleIntMethod", "101", success, failed);

複合パラメータの使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testComplexMethod",
{"foo":"newfoo","baz":"newbaz",".type":"TestBeanComplexSubType"}, success, failed);

パラメータが存在しない場合の使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "getComplexColl", success, failed);

Stringパラメータの使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testMethodStringStringString", "Hello ",
"World", success, failed);

B.2.18 invokeContainerMethod

invokeContainerMethodは、特定の引数を使用して、指定されたクラス上でネイティブ・メソッドを起動します。表B-2に、このメソッドによって渡されるパラメータを示します。

表B-2 invokeContainerMethodに渡されるパラメータ

パラメータ

説明

className

MAFがインスタンスを作成するために使用するクラス名(パッケージ情報を含む)。

methodName

起動させるメソッドの名前。

args

メソッドに渡される引数の配列。この配列内で、これらの引数はメソッドが期待する順序で並べられます。

このメソッドは、Objectを戻します。

public static java.lang.Object invokeContainerMethod(java.lang.String className,
java.lang.String methodName)
java.lang.Object[] args)

B.2.19 invokeContainerJavaScriptFunction

invokeContainerJavaScriptFunctionは、JavaScriptメソッドを起動します。表B-3に、このメソッドによって渡されるパラメータを示します。

表B-3 invokeContainerJavaScriptFunctionに渡されるパラメータ

パラメータ

説明

featureId

JavaScriptの起動コンテキストを決定するためにMAFによって使用されるアプリケーション機能のID。このIDによって、このメソッドがコールされるWebビューが決まります。

method

起動させるメソッドの名前。

args

メソッドに渡される引数の配列。この配列内で、これらの引数はメソッドが期待する順序で並べられます。

このメソッドは、JSONオブジェクトを戻します。

注意:
invokeContainerJavaScriptFunction APIは、アプリケーションがAndroidデバイスまたはエミュレータ上で実行される場合、JavaScript関数が15秒以内に完了することを予期します。完了しなかった場合は、タイムアウト・エラーを戻します。

public static java.lang.Object invokeContainerJavaScriptFunction(java.lang.String featureId,
java.lang.Object[] args)
throws oracle.adfmf.framework.exception.AdfException

次の例の疑似コードは、feature1という名前のアプリケーション機能に含まれるappFunctions.jsという名前のJavaScriptファイルを示しています。このファイル内で記述されているJavaScriptメソッド、application.testFunctionは、invokeContainerJavaScriptFunctionメソッドによってコールされます(次の例を参照)。

(function()
{
if (!window.application) window.application = {};

application.testFunction = function()
{
var args = arguments;

alert("APP ALERT " + args.length + " ");
return "application.testFunction - passed";
};
})();

アプリケーションには、この関数をコールするアクション・リスナーで構成されるコマンド・ボタンが含まれているので、エンド・ユーザーがこのボタンをクリックすると、次のようなアラートが表示されます。

- APP ALERT 0

- APP ALERT 1

- APP ALERT 2

次の例の疑似コードは、invokeApplicationJavaScriptFunctionメソッドによって、前の例で記述されているJavaScriptメソッド(application.testFunction)をコールする方法を示しています。

invokeApplicationJavaScriptFuntions
public void invokeApplicationJavaScriptFuntions(ActionEvent actionEvent) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {} );
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {"P1"} );
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {"P1", "P2"} );
}

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスおよびAPIDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

B.2.20 sendEmail

詳細は、第14.11.3項「sendEmailメソッドを使用して電子メールを可能にする方法」を参照してください。

B.2.21 sendSMS

詳細は、第14.11.2項「SendSMSメソッドを使用してテキスト・メッセージングを可能にする方法」を参照してください。

B.2.22 アプリケーション・アイコンへのバッジ設定

AdfmfContainerUtilitiesクラスには、MAFアプリケーション・アイコンにバッジ番号を設定したり、その番号を取得するためのメソッドが含まれています。表B-4に、これらのメソッドを示します。

表B-4 アイコンへのバッジ設定メソッド

メソッド

説明

パラメータ

getApplicationIconBadgeNumber

MAFアプリケーションのアイコンに現在設定されているバッジの値を取得します。アプリケーション・アイコンにバッジが設定されていない場合は、ゼロ(0)を戻します。

なし

setApplicationIconBadgeNumber

MAFアプリケーションのアイコンにバッジ番号を設定します。

バッジの値(int badge)。

注意:
アプリケーション・アイコンへのバッジ設定は、Androidではサポートされていません。

B.3 getDirectoryPathRootメソッドを使用したファイル・アクセス

AdfmfJavaUtilties APIには、getDirectoryPathRootメソッドが含まれています。このメソッドはJavaレイヤーからのみコールでき、iOSシステムとAndroidシステムの両方にあるファイルへのアクセスを可能にします。次の例に示すように、このメソッドを使用すると、デバイス上の一時ファイル、アプリケーション・ファイル(iOSシステム上)およびキャッシュ・ディレクトリの場所に、TemporaryDirectory、ApplicationDirectoryおよびDeviceOnlyDirectory定数を使用してそれぞれアクセスできます。DeviceOnlyDirectoryの場所に格納されたファイルは、デバイスの接続時には同期されません。

注意:
アプリケーションからディレクトリまたはファイルへのアクセスを試みる前に、それらのディレクトリまたはファイルが存在することを確認してください。

oracle.adfmf.framework.api.AdfmfJavaUtilitiesの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;

...

public void getDirectoryPathRoot() {
// returns the directory for storing temporary files
String tempDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.TemporaryDirectory);

// returns the directory for storing application files
String appDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.ApplicationDirectory);

// returns the directory for storing cache files
String deviceDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DeviceOnlyDirectory);

// returns the directory for storing downloaded files
String downloadDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory);
}

B.3.1 プラットフォームに依存しないダウンロード場所へのアクセス

ファイル記憶域の要件は、プラットフォームによって異なります。Androidプラットフォームでは、アプリケーションからファイルへのアクセス元となる単一の場所が規定されていません。そのかわり、アプリケーションでは、権限が付与された任意の場所にファイルを書き込むことができます。一方、iOSプラットフォームでは通常、アプリケーション・ディレクトリ内にファイルを格納します。このような違いにより、ApplicationDirectoryをgetDirectoryPathRootメソッドに渡すと、AndroidデバイスではなくiOSデバイス上で実行されているアプリケーションの添付ファイルを表示するために必要なファイルの場所を戻すことができます。アプリケーションをiOSデバイスとAndroidデバイスの両方で実行する場合、プラットフォーム固有のコードを記述してこれらの場所を取得するのではなく、getDirectoryPathRootメソッドにDownloadDirectoryを渡すことによって、外部記憶域の場所とデフォルトの添付ファイル・ディレクトリへのパスを両方戻すことができます。この定数(列挙型)には、DeviceManager APIのdisplayFileメソッドで使用する場所が反映されます。このメソッドでは、プラットフォーム固有の機能を使用してこれらの場所を検索することによって、添付ファイルを表示します。

Androidの場合、DownloadDirectoryでは、Environment.getExternalStorageDirectoryメソッド(SDカードなどのAndroid用外部記憶域ディレクトリを取得する)によって戻されるパスを参照します。iOSデバイス上で実行されるMAFアプリケーションの場合は、ApplicationDirectoryと同じ場所が戻されます。getExternalStorageDirectoryの詳細は、Android開発者のWebサイト(http://developer.android.com/reference/packages.html)で入手できる、パッケージのリファレンス・ドキュメントを参照してください。また、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手できる『Files System Programming Guide』も参照してください。

C MAFアプリケーションとプロジェクト・ファイル

この付録では、モバイル・アプリケーション・フレームワークのアプリケーション・テンプレートを使用してMAFアプリケーションを作成する際に、JDeveloperによって生成されるファイルについて説明します。

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

- 第C.1項「MAFアプリケーションとプロジェクト・ファイルの概要」

- 第C.2項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」

- 第C.3項「ビュー・コントローラ・プロジェクトのリソースについて」

- 第C.4項「MAFアプリケーションの構成ファイルについて」

- 第C.5項「MAFアプリケーション機能の構成ファイルについて」

C.1 MAFアプリケーションとプロジェクト・ファイルの概要

デフォルトで、JDeveloperはMAFアプリケーションを2つのプロジェクト(ApplicationControllerとViewController)とともに作成します。MAFアプリケーションのセキュリティを構成する場合、ApplicationControllerプロジェクトにはアプリケーション全体のリソース(ログイン・ページなど)が格納されます。ViewControllerプロジェクトには、アプリケーション機能のコンテンツとしてレンダリングされる、アプリケーション機能のリソース(HTML、AMX、タスク・フロー・ファイルなど)が格納されます。

複数のMAFアプリケーションで使用するアーティファクトを作成または格納するにはViewControllerプロジェクトを使用します。たとえば、MAFアプリケーションのルック・アンド・フィールを決定するMAFスキンについて考えます。このアーティファクトは複数のMAFアプリケーションで再利用する場合があります。同様に、複数のMAFアプリケーションで複数のデータ・コントロールを共有することが必要な場合があります。このため、MAFアプリケーションに追加のViewControllerプロジェクトを作成して、複数のMAFアプリケーション間で共有するこのようなアーティファクトを格納します。この追加のViewControllerプロジェクトは、第8章「MAFアプリケーション・コンテンツの再使用」で説明するようにFARにパッケージ化することで再使用できます。

これらのプロジェクトの詳細は、第C.2項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」および第C.3項「ビュー・コントローラ・プロジェクトのリソースについて」を参照してください。

これらのプロジェクト内には、MAFアプリケーションとアプリケーション機能の構成用ファイル、またはMAFアプリケーションをターゲット・プラットフォームにデプロイする際にそのアプリケーションで必要になるファイルもJDeveloperによって生成されます。例C-1に、新規作成したMAFアプリケーションに対してJDeveloperによって生成されるファイルを示します。

MAFアプリケーションの開発時に最もよく使用されるファイルは、maf-application.xmlファイル(アプリケーションの構成)とmaf-features.xmlファイル(機能の構成)の2つです。これらのファイルの詳細は、第C.4項「MAFアプリケーションの構成ファイルについて」および第C.5項「MAFアプリケーション機能の構成ファイルについて」を参照してください。

例C-1 新規作成したMAFアプリケーションのファイル

RootApplicationDirectory
|   MAFApplication.jws
|
+---.adf
|   \---META-INF
|           adf-config.xml
|           maf-application.xml
|           maf-config.xml
|           maf-plugins.xml
|           sync-config.xml
|
+---.data
|   \---00000000
|           00000000.jdb
|           je.lck
|
+---ApplicationController
|   |   ApplicationController.jpr
|   |
|   +---adfmsrc
|   |   +---application
|   |   |       DataControls.dcx
|   |   |
|   |   \---META-INF
|   |           adfm.xml
|   |
|   +---public_html
|   \---src
|       +---application
|       |       LifeCycleListenerImpl.java
|       |
|       \---META-INF
|               maf-skins.xml
|
+---resources
|   +---android
|   |       display-hdpi-icon.png
|   |       // Additional image files omitted for brevity
|   |       display-xhdpi-icon.png
|   |
|   +---default
|   |       MissingIcon_144x144.png
|   |
|   +---ios
|   |       Default-1104h@2x.png
|   |       // Additional image files omitted for brevity
|   |       iTunesArtwork.png
|   |
|   \---security
|           cacerts
|
+---src
|   \---META-INF
|           logging.properties
|           maf.properties
|
\---ViewController
|   ViewController.jpr
|
+---public_html
\---src
\---META-INF
maf-feature.xml

C.2 アプリケーション・コントローラ・プロジェクト・レベルのリソースについて

JDeveloperでは、アプリケーション・コントローラ・プロジェクト内にMAFアプリケーション用のファイルが生成されます。これらのファイル(表C-1を参照)は、MAFアプリケーションのメタデータを記述した構成情報を含んでいます。これらのファイルには、「アプリケーション」ウィンドウの「アプリケーション・リソース」ペイン(図C-1を参照)からアクセスします。

図C-1 「アプリケーション・リソース」ペインからアクセスされるMAFアプリケーション・アーティファクト

アプリケーション全体のリソースが含まれるアプリケーション・コントローラ・プロジェクトは、モバイル・デバイスでのアプリケーションの表示方法を構成するためのメタデータ・ファイルが含まれるという点で、MAFアプリケーションのプレゼンテーション・レイヤーを提供しています。このプロジェクトはMAFアプリケーションのセキュリティを指定するもので、アプリケーションのログイン・ページ、およびアプリケーション全体のリソースを含めることができます。アプリケーション・コントローラ・プロジェクトは、本質的には、アプリケーション機能とそのコンテンツを定義するビュー・コントローラ・プロジェクトのコンシューマです。詳細は、第C.3項「ビュー・コントローラ・プロジェクトのリソースについて」を参照してください。

表C-1 アプリケーション・リソースを介してアクセスされるMAFアプリケーション・レベルのアーティファクト

アーティファクト

ファイルの場所

説明

maf-application.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\Meta-INF

次に例を示します。

JDevloper\mywork\アプリケーション名\.adf\META-INF

アプリケーションレベルの情報を定義するXMLファイル。アプリケーションの内容、ナビゲーションの動作およびそのユーザー認証要件を定義できます。

maf-config.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\Meta-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

MAFアプリケーションに使用されるデフォルト・スキンの構成に使用されます。詳細は、第7章「MAFアプリケーションのスキニング」を参照してください。

アプリケーション・イメージ

アプリケーション・ワークスペース・ディレクトリ\Application Resources\resources\ios

次に例を示します。

JDeveloper\mywork\アプリケーション名\resources\ios

iOSおよびAndroidアプリケーションのデプロイメントに必要とされる一連のイメージ。ここには、アプリケーション・アイコンやスプラッシュ画面のPNGイメージも含まれます。iPhoneなどのiOSデバイスへのデプロイメントでは、様々なサイズのイメージ・セットが必要です。

プロジェクトで提供されるデフォルトのiOSイメージは次のとおりです。

- デバイスが縦方向と横方向の両方の場合に使用されるイメージ。

- Retinaディスプレイに使用されるイメージ(つまり、icon.pngおよびicon@2x.png)

- iPadイメージ(icon-72.png)

これらのイメージをオーバーライドするには、第27.2.5.3項「iOSアプリケーションへのカスタム・イメージの追加」を参照してください。

cacerts

アプリケーション・ワークスペース・ディレクトリ\Application Resources\resources\Security\cacerts

次に例を示します。

JDeveloper\mywork\アプリケーション名\resources\Security\cacerts

システム全体のキーストアであるcacerts証明書ファイル。Java仮想マシン(JVM)に対するCA証明書を識別します。このファイルは、Java keytoolユーティリティを使用して更新できます。第29.9項「SSLのサポート」で説明するように、keytoolを使用してカスタム証明書ファイルを作成できます。証明書ファイルはすべてSecurityディレクトリ内に配置する必要があります。

logging.properties

アプリケーション・ワークスペース・ディレクトリ\ src\.META-INF\logging.properties

次に例を示します。

JDeveloper\mywork\アプリケーション名\src\META-INF\logging.properties

ロギング・レベルやロギング・コンソールなど、アプリケーション・エラーのロギングを設定できます。詳細は、第30.4項「ロギングの使用方法と構成」を参照してください。

maf.properties

アプリケーション・ワークスペース・ディレクトリ\src\.META-INF\maf.properties

次に例を示します。

JDeveloper\mywork\アプリケーション名\src\META-INF\maf.properties

JVMの構成ファイル。このファイルを使用して、アプリケーションの起動やヒープ領域の割当て、JavaおよびJavaScriptのデバッグ・オプションを構成します。詳細は、第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

adf-config.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\META-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

構成サービス・パラメータなど、アプリケーション・レベルの設定の構成に使用します。第16章「MAFアプリケーションで使用されるエンド・ポイントの構成」も参照してください。

connections.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\META-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

MAFアプリケーションで定義されているすべての接続のリポジトリ。

wsm-assembly.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\META-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

保護されたWebサービスに使用されるWebサービス・ポリシー定義を格納します。

ヒント:
アプリケーション・コントローラ・プロジェクト内には、アプリケーション・レベルのライフサイクル・リスナーなど、アプリケーション全体の機能をサポートするコードを配置してください。

JDeveloperでは、アプリケーション・コントローラ・プロジェクト自体の中に、表C-2にリストされたアーティファクトが作成されます。

表C-2 アプリケーション・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

LifeCycleListenerImpl.java

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\application

次に例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\src\application

MAFアプリケーションのデフォルトのアプリケーション・ライフサイクル・リスナー(ALCL)。

詳細は、第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

maf-skins.xml

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\META-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\src\META-INF

使用可能なスキンを定義するもので、新しいスキンを定義することもできます。

詳細は、第7章「MAFアプリケーションのスキニング」を参照してください。

adfm.xml

アプリケーション・ワークスペース・ディレクトリ \ApplicationController\adfmsrc\META-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\adfmsrc\META-INF

.cpx、.dcx、.jpxおよび.xcfgファイル(メタデータのレジストリ)のパス(および相対パス)を維持します。

DataControls.dcx

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\adfmsrc\

次に例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\adfmsrc\

データ・コントロールのレジストリ。デバイスのサービスを活用するDeviceFeaturesデータ・コントロールの使用方法の詳細は、第14項「MAF AMXでのバインディングの使用とデータ・コントロールの作成」を参照してください。埋込みアプリケーション機能をコールするSpringboardページを作成できるようにするApplicationFeaturesデータ・コントロールの詳細は、第4.6項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

C.3 ビュー・コントローラ・プロジェクトのリソースについて

ビュー・コントローラ・プロジェクト(ViewControllというデフォルト名で生成されます)には、アプリケーション機能のリソースが格納されます。アプリケーション・コントローラ・プロジェクトとは異なり、ビュー・コントローラ・プロジェクトのメタデータ・ファイルでは、アプリケーション機能レベルのリソース、特に、実行時にモバイル・デバイスでMAFアプリケーション自体のSpringboard内またはそのナビゲーション・バーに表示できるように1つのMAFアプリケーションに集約可能な様々なアプリケーション機能が記述されます。さらに、アプリケーション機能のメタデータ・ファイルでは、アプリケーション機能をHTMLページとMAF AMXページのどちらで構成するのかが記述されます。また、ビュー・コントローラ・プロジェクトには、これらのアプリケーション・ページと、アプリケーション機能レベルのリソース(MAFアプリケーション用に定義された、Springboardおよびナビゲーション・バー上のアプリケーション機能を表すアイコン・イメージなど)を含めることができます。

ヒント:
ビュー・コントローラ・プロジェクト内には、アプリケーション機能に固有のコードを格納します。アプリケーション・コントローラ・プロジェクトは、(特に別々のビュー・コントローラ・プロジェクト内で定義されている)アプリケーション機能間で共有されるコードの場所として使用してください。

ビュー・コントローラ・プロジェクトはアプリケーション・コントローラ・プロジェクトと分離して、別のMAFアプリケーションで再使用できるように、アーカイブ・ファイルとしてデプロイできます(第8章「MAFアプリケーション・コンテンツの再使用」を参照)。また、稀なケースとして、アプリケーション・コントローラ・プロジェクトが複数のビュー・コントローラ・プロジェクトを使用することもできます。

注意:
MAFビュー・コントローラ・プロジェクトを別のMAFビュー・コントローラ・プロジェクトの依存性またはMAFアプリケーション・コントローラ・プロジェクトの依存性として追加すると、MAFアプリケーションをデプロイできなくなります。詳細は、第2.5.2項「機能参照IDと機能IDに関する必知事項」を参照してください。

表C-3に示すように、これらのリソースには、maf-feature.xmlという名前のアプリケーション機能の構成ファイルが含まれます。

表C-3 ビュー・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

maf-feature.xml

アプリケーション・ワークスペース・ディレクトリ\src\META_INF\maf-feature.xml

次に例を示します。

JDeveloper\mywork\アプリケーション名\ViewController\src\META-INF

アプリケーション機能を定義できるようにする、スタブXMLの識別子ファイル。『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』の説明に従ってモバイル・プリファレンスを構成したら、デフォルトのデプロイメント・プロファイル設定を使用してこのアプリケーションをデプロイできます。詳細は、第27章「MAFアプリケーションのデプロイ」を参照してください。

アプリケーション固有のコンテンツ

アプリケーション・ワークスペース・ディレクトリ\ViewController\public_html

次に例を示します。

JDeveloper\mywork\アプリケーション名\ViewController\public_html

maf-feature.xmlで定義されたアプリケーション機能は、public_htmlディレクトリに表示されます。モバイル・コンテンツには、MAF AMXページ、CSSファイルおよびタスク・フローを含めることができます。アプリケーション機能に追加するカスタム・イメージは、このディレクトリ内に配置する必要があります。詳細は、第5.4項「外部リソースの選択に関する必知事項」を参照してください。

C.4 MAFアプリケーションの構成ファイルについて

maf-application.xmlファイルでは、表示名と一意のアプリケーションID (名前の競合を防ぐ)を指定し、実行時にMAFアプリケーションのSpringboardに表示するアプリケーション機能を選択することで、MAFアプリケーションの基本構成を指定します。さらに、maf-application.xmlファイルでは、MAFアプリケーションのユーザー・プリファレンス・ページも作成できます。

このファイルは、第2.2項「MAFアプリケーションの作成」で説明したように、アプリケーション作成ウィザードの完了後にJDeveloperによって生成されるもので、表C-4に示す要素が含まれています。

表C-4 アプリケーション識別子ファイルの要素

要素

説明

<adfmf:application>

maf-application.xmlのルート要素。

<adfmf:description>

アプリケーションの説明。

<adfmf:featureReference>

機能参照は、FAR (機能アーカイブ・ファイル)にパッケージ化されているか、maf-feature.xmlファイルで定義されているアプリケーション機能のうち、MAFアプリケーションのコンテンツに関連するものを指定します。機能参照を選択することで、MAFアプリケーションの特性とコンテンツを定義します。FARの詳細は、第8章「MAFアプリケーション・コンテンツの再使用」を参照してください。

<adfmf:preferences>

ユーザー・プリファレンスのオプションおよび動作をアプリケーション・レベルで設定できます。maf-feature.xmlファイル内のアプリケーション機能に対するユーザー・プリファレンスの表示および動作方法も設定できます。詳細は、第21章「ユーザー・プリファレンスの有効化」を参照してください。

<adfmf:login>

アプリケーション機能のログイン・ページを設定できます。詳細は、第29章「MAFアプリケーションの保護」を参照してください。

<adfmf:navigation>

ナビゲーション・バーとSpringboardの動作を定義できます。Springboardはホーム・ページで、ここには、埋め込まれたアプリケーション機能のすべてのアプリケーション・アイコンとラベルがリスト・ビューに整理されて表示されます。Springboardには、ユーザーが使用可能なすべてのアプリケーションの最上位のビューが表示されます。ユーザーは内容に目を通してアプリケーションを選択できます。詳細は、第4章「アプリケーションのナビゲーションの構成方法」を参照してください。

C.5 MAFアプリケーション機能の構成ファイルについて

maf-feature.xmlファイルでは、MAFアプリケーションのmaf-application.xmlファイル内の<adfmf:featureReference>要素によって参照されるアプリケーション機能を構成します。例C-2は、WorkBetterサンプル・アプリケーションのmaf-feature.xmlファイル内に含まれている、人々および組織というアプリケーション機能を示しています。

maf-feature.xmlファイル内の<adfmf:features>ルート要素では、1つ以上の<adfmf:feature>要素を使用して、MAFアプリケーションのアプリケーション機能のプロパティを定義します。例C-2では、WorkBetterサンプル・アプリケーションの人々および組織アプリケーション機能の名前とID、およびアイコン(Springboardとナビゲーション・バーでこれらのアプリケーション機能を表す)を定義するプロパティの値を指定します。さらに、<adfmf:feature>要素では、アプリケーション機能用にレンダリングされるコンテンツも参照します。人々および組織アプリケーション機能では、タスク・フロー、.CSSおよび.JSの各ファイルを参照しています。

MAFアプリケーションはアプリケーション機能レベルでセキュリティを実装します。アプリケーション機能を保護するための1つの手段は、エンド・ユーザーがアプリケーション機能へアクセスできるようになる前に認証を要求することです。これを行うには、maf-feature.xmlファイルでアプリケーション機能の「セキュリティ有効化」プロパティ(securityEnabled)を構成します。詳細は、第29.6項「MAFアプリケーションのセキュリティの構成」を参照してください。

表C-5 <Feature>要素の子要素

要素の子要素" width="100%">

要素

説明

<adfmf:content>

特定のデバイスやユーザーに対してアプリケーション機能で使用される形式を記述します。アプリケーション機能のコンテンツ(通常はユーザー・インタフェース)は、MAF AMXページやHTML5ページとして記述することも、リモートWebサーバー上でホストされるWebページから配信することもできます。コンテンツをWebアプリケーションとして指定する方法の詳細は、第20章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

<adfmf:constraint>

指定したアプリケーション機能を実行時にアプリケーションに表示できるようにするかどうかを決定します。制約を使用すると、ユーザー・ロールやデバイスのプロパティなどの基準に基づいてアプリケーション機能の使用を許可または回避できます。詳細は、第22章「アプリケーション機能に関する制約の設定」を参照してください。

例C-2 WorkBetterサンプル・アプリケーションのmaf-feature.xmlファイル

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adfmf="http://xmlns.oracle.com/adf/mf">
<adfmf:feature id="People" name="People" icon="images/people.png" image="images/people.png">
<adfmf:content id="People.1">
<adfmf:amx file="People/taskflow.xml#taskflow">
<adfmf:includes>
<adfmf:include type="StyleSheet" file="css/WorkBetter.css" id="i1"/>
<adfmf:include type="JavaScript" file="js/customsearch.js" id="i2"/>
</adfmf:includes>
</adfmf:amx>
</adfmf:content>
</adfmf:feature>
<adfmf:feature id="Organizations" name="Organizations" icon="images/departments.png"
image="images/departments.png">
<adfmf:content id="Organizations.1">
<adfmf:amx file="Organizations/taskflow.xml#taskflow">
<adfmf:includes>
<adfmf:include type="StyleSheet" file="css/WorkBetter.css" id="i3"/>
<adfmf:include type="JavaScript" file="js/customsearch.js" id="i4"/>
</adfmf:includes>
</adfmf:amx>
</adfmf:content>
</adfmf:feature>
...
</adfmf:features>

D デプロイメントでのプリファレンスの変換

この付録では、デプロイメント時、MAFがどのようにユーザー・プリファレンスを変換するかについて説明します。

このドキュメントには次の項が含まれます。

- 第D.1項「プリファレンスのネーミング・パターン」

- 第D.2項「Android用のプリファレンスの変換」

- 第D.3項「iOS用のプリファレンスの変換」

D.1 プリファレンスのネーミング・パターン

デプロイメント・ターゲットが呼び出されると、MAFアプリケーション・プリファレンスの、モバイル・プラットフォーム表現への変換が行われます。変換後、表D-1で説明されているネーミング・パターンにより、モバイル・プラットフォーム上で各プリファレンスを一意に識別できるようになります。maf-application.xmlおよびmaf-feature.xmlファイル内の各プリファレンス要素は、デプロイメントの前に、その兄弟要素の範囲内で一意に識別される必要があります。

識別子値の例は、次のとおりです。

- application.gen.gps.trackGPS

- feature.f0.gen.gps.trackGPS

表D-1は、完全修飾されたプリファレンス識別子の生成方法を示しています。

表D-1 プリファレンスに対するMAFのネーミング・パターン

式

説明

構文

PreferenceIdentifier

モバイル・プラットフォーム表現に変換されたプリファレンス要素の識別子値を表します。

ApplicationPreferences | FeaturePreferences

ApplicationPreferences

maf-application.xmlファイルから生成されるプリファレンス識別子値をビルドするには、この式を使用します。

application.ApplicationElementPath

ApplicationElementPathは、最上位の親要素である<adfmf:preferences>で始まり、識別対象の要素で終わる、id属性値のドット区切りのリストを表します。maf-application.xmlファイルの次のセグメントで、生成されたこの識別子は、application.gen.gps.trackGPSとしてコメント内に示されています。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen">
<adfmf:preferenceGroup id="gps">
<!-- The mobile-platform identifier would be "application.gen.gps.trackGPS" -->
<adfmf:preferenceBoolean id="trackGPS"/>
</adfmf:preferenceGroup>
</adfmf:preferenceGroup>
</adfmf:preferences>

FeaturePreferences

maf-feature.xmlファイルから生成されるプリファレンス識別子値をビルドするには、この式を使用します。

feature.FeatureElementPath

FeatureElementPathは、最上位の親要素である<adfmf:feature>で始まり、識別対象の要素で終わる、id属性値のドット区切りのリストを表します。maf-feature.xmlファイルの次のセグメントで、生成されたこの識別子は、feature.f0.gen.gps.trackGPSとしてコメント内に示されています。

<adfmf:feature id="f0">
<adfmf:preferences>
<adfmf:preferenceGroup id="gen">
<adfmf:preferenceGroup id="gps">
<!-- The mobile-platform identifier would be "feature.f0.gen.gps.trackGPS" -->
<adfmf:preferenceBoolean id="trackGPS"/>
</adfmf:preferenceGroup>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>

表D-1のコード例で引用されている<adfmf:preferences>要素にはid属性がなく、そのため、これはどのプリファレンス識別子でも表されません。

D.2 Android用のプリファレンスの変換

MAFのデプロイメントでは、XMLとXLSを使用して、アプリケーション機能とアプリケーション・レベルの両方で定義されているユーザー・プリファレンス・ページを、次の3つのXMLドキュメントに変換します。

- maf_preferences.xml

- maf_arrays.xml

- maf_strings.xml

D.2.1 maf_references.xml

このファイルには、maf-feature.xmlとmaf-application.xmlの両方のファイルからの変換済のプリファレンスが含まれています。

D.2.1.1 プリファレンス要素のマッピング

表D-2は、MAFのプリファレンス定義の、Androidテンプレート・プリファレンスおよびAndroidネイティブ・プリファレンスへのマッピングを示しています。

表D-2 MAFプリファレンスの、Androidプリファレンスへのマッピング

MAFプリファレンス定義

カスタムまたはAndroidネイティブ・プリファレンス定義(MAFのデプロイメントで使用される)

Androidネイティブ・プリファレンス定義(MAFのデプロイメントで使用されない)

<adfmf:preferenceBoolean>

oracle.adfmf.preferences.AdfMFPreferenceBoolean

CheckBoxPreference

<adfmf:preferenceNumber>

oracle.adfmf.preferences.AdfMFPreferenceText

EditPreferenceText

<adfmf:preferenceText>

oracle.adfmf.preferences.AdfMFPreferenceText

EditTextPreference

<adfdmf:preferenceList>

oracle.adfmf.preferences.AdfMFPreferenceList

ListPreference

<adfmf:PreferenceGroup>

PreferenceCategory

PreferenceCategory

<adfmf:PreferencePage>

PreferenceScreen

PreferenceScreen

D.2.1.2 プリファレンス属性のマッピング

maf_preferences.xmlファイルには、maf_strings.xmlおよびmaf_arrays.xmlファイルの両方に格納されている文字列リソースへの参照が含まれています。Android SDKでは、XMLファイル内のリソースの構文を@[<package_name>:]<resource_type>/<resource_name>と定義しています。このファイルには、文字列値への参照だけでなく、リスト・プリファレンスの名前と値のペアも含まれています。XSLは、文字列とリスト・プリファレンスに対して次のものを作成します。

- <package_name> は、リソースが存在するパッケージの名前です(同じパッケージのリソースを参照するときは必要ありません)。参照のこのコンポーネントは使用されません。

- <resource_type>は、リソース・タイプのRサブクラスです。このコンポーネントは、文字列参照の作成時はstring、リスト・プリファレンスの作成時はarrayの値を持ちます。

- <resource_name>は、XML要素内のandroid:name属性値です。android:title属性を指定する場合、このコンポーネントの値は、<PreferenceIdentifier>_titleになります(<PreferenceIdentifier>の定義については、第D.1項「プリファレンスのネーミング・パターン」を参照してください)。

表D-3と表D-4は、特定のMAFプリファレンスに対するMAF属性の、Androidプリファレンスへのマッピングを示しています。

この表では、

- {X}というフォームのエントリ(表D-3の{default}など)は、Xという名前のMAF属性の値を示しています。

- <PreferenceIdentifier>があるエントリは、第D.1項「プリファレンスのネーミング・パターン」で説明されているとおり、プリファレンス識別子の値を示しています。

- アスタリスク(*)が付いている属性は、MAFの名前空間で定義されているカスタムのテンプレート属性であり、maf_preferences.xmlファイルにadfmf:<attributeName>というフォームで存在している必要があります。それ以外の属性は、Androidの名前空間の一部であり、maf_preferences.xmlファイルにandroid:<attributeName>として存在している必要があります。

表D-3 MAFプリファレンス属性の、Androidプリファレンスへのマッピング

MAFの属性定義

テンプレート・カスタムまたはAndroidネイティブ・プリファレンス属性

Android属性値

適用対象

id

key

<PreferenceIdentifier>

AdfMFPreferenceBoolean、AdfMFPreferenceText、AdfMFPreferenceList、PreferenceScreen、PreferenceCategory

default

defaultValue

{default}

AdfMFPreferenceBoolean、AdfMFPreferenceText、AdfMFPreferenceList

label

title

指定された{label}値が文字列リソース・バンドルへの参照でない場合は、@string/<PreferenceIdentifier>___title。指定された{label}を持つ、maf_strings.xml内の文字列を参照します。

AdfMFPreferenceBooleanAdfM、FPreferenceNumber、AdfMFPreferenceText、AdfMFPreferenceList、PreferenceScreen、PreferenceCategory

secret

password

{secret}

AdfMFPreferenceText

min

min*

{min}

AdfMFPreferenceText

max

max*

{max}

AdfMFPreferenceText

name

entryValues

@array/<PreferenceIdentifier>___entryValues

AdfMFPreferenceList

value

entries

@array/<PreferenceIdentifier>___entries

AdfMFPreferenceList

D.2.1.3 属性のデフォルト値

次の場合、maf-application.xmlおよびmaf-feature.xmlファイル用の概要エディタでは、XMLからの属性名と値は除外されます。

- 属性タイプがxsd:booleanである。

- 属性値に<default>値オプションがある。

- ユーザーが値として<default>を指定している。

XSLは、ブール・タイプのMAF属性と、対応するデフォルト値を認識している必要があります。XSLはその後、適切なAndroidまたはテンプレート・カスタム属性値を指定します(ユーザーによって選択された場合)。

表D-4は、変換されるMAFプリファレンスにdefault属性が含まれていない場合に、デプロイメントでandroid:defaultValue属性に対して指定されるものを示しています。

表D-4 デフォルト以外の値を持つ属性の変換

MAFプリファレンス要素

等価のAndroidプリファレンス

デフォルトの属性値

preferenceBoolean

AdfMFPreferenceBoolean

false

preferenceText

AdfMFPreferenceText

空の文字列

preferenceList

AdfMFPreferenceList

空の文字列

D.2.1.4 プリファレンス画面ルート要素

maf_preferences.xmlファイルには、<PreferenceScreen>と呼ばれるルート要素があります。Androidテンプレートでは、この要素に次のXML名前空間定義が存在している必要があります。

xmlns:adfmf="http://schemas.android.com/apk/res/<Application Package Name>

ここで、<Application Package Name>要素は、AndroidManifest.xmlファイル内にあるものと同じアプリケーション・パッケージ名として定義されます。<Android Package Name>は、AndroidManifest.xmlファイルで指定されているAndroidパッケージ名を定義します。詳細は、第3.2項「MAFアプリケーションの表示プロパティの設定」を参照してください。

デプロイメントでは、Androidデプロイメント・プロファイルのアプリケーション・バンドルID値が使用されます(存在する場合)。プロファイルにアプリケーション・バンドルID値が存在しない場合は、maf-application.xmlファイルに含まれているアプリケーションの表示名およびアプリケーションIDからこの値が取得されます。デプロイメントJavaコードは、この値をXSLドキュメントにパラメータとして渡します。

次の例は、maf-feature.xmlファイルに含まれているMAFプリファレンスを示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf">
<adfmf:feature id="oracle.hello"
name="Hello"
icon="oracle.hello/navbar-icon.png"
image="oracle.hello/springboard-icon.png">
<adfmf:content id="Hello.Generic">
<adfmf:localHTML url="oracle.hello/index.html"/>
</adfmf:content>
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup"
label="preference group">
<adfmf:preferenceBoolean id="boolPref"
label="boolPref perference"
default="true"/>
<adfmf:preferenceNumber id="numPref"
label="numPref preference"
default="1"
min="1"
max="10"/>
<adfmf:preferenceText id="textPref"
label="textPref preferences"
default="Foo"/>
<adfmf:preferenceList id="listPref"
label="listPref preference"
default="value2">
<adfmf:preferenceValue name="name1"
value="value1"/>
<adfmf:preferenceValue name="name2"
value="value2"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>
</adfmf:features>

D.2.2 maf_arrays.xml

maf_arrays.xmlファイルは、maf_preferences.xmlファイルから参照されるリスト・プリファレンスの名前と値を列挙する文字列配列要素で構成されています。maf-application.xmlおよびmaf-feature.xmlファイルに含まれている各<preferenceList>要素は、2つの文字列配列要素(1つは名前用、もう1つは値用)に変換されます。次の例は、MAF preferenceListの定義を示しています。

<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf">

<adfmf:feature id="oracle.hello" name="Hello" icon="oracle.hello/navbar-icon.png" image="oracle.hello/springboard-icon.png">
...
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup">
<adfmf:preferenceList id="MyList" label="My List">
<adfmf:preferenceValue name="name1" value="value1"/>
<adfmf:preferenceValue name="name2" value="value2"/>
<adfmf:preferenceValue name="name3" value="value3"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>
...

次の例は、maf_arrays.xmlファイルに含まれている、<preferenceList>要素から変換された文字列配列要素のペアを示しています。前の例のMAFのpreferenceList定義は、次の例に示されているように、maf_arrays.xmlファイル内の<string-array name="feature.oracle.hello.prefGroup.MyList___entry_values">および<string-array name="feature.oracle.hello.prefGroup.MyList___entries">に変換されます。

<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:adfmf="http://schemas.android.com/apk/res/oracle.myandroidapp">

<string-array name="feature_oracle_hello_prefGroup.MyList___entry_values">
<item>name1</item>
<item>name2</item>
<item>name3</item>
</string-array>

<string-array name="feature_oracle_hello_prefGroup.MyList___entries">
<item>value1</item>
<item>value2</item>
<item>value3</item>
</string-array>
</resources>

次の例は、maf_preferences.xmlで参照されている<string-arrays>を示しています。

<oracle.adfmf.preferences.AdfMFPreferenceList android:key="feature.oracle.hello.MyList"
android:title="@string/feature_oracle_hello_prefGroup.MyList___title"
android:entries="@array/feature_oracle_hello_prefGroup.MyList___entries"
android:entryValues="@array/feature_oracle_hello_prefGroup.MyList___entry_values" />

D.2.3 maf_strings.xml

次の例で示されているmaf_strings.xmlファイルは、maf_preferences.xmlファイルによって参照される文字列要素、およびmaf-application.xmlおよびmaf-feature.xmlファイルで定義されているリソース・バンドル参照で構成されています。各文字列要素には、文字列および文字列値を一意に識別するname属性があります。

<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:adfmf="http://schemas.android.com/apk/res/oracle.myandroidapp">
...
<string name="feature.PROD.bundle.FeatureName">Products</string>
<string name="feature.oracle.hello.prefGroup.MyBooleanPreference___title">My feature boolean pref</string>
...
</resources>

文字列のソースがリソース・バンドル文字列への参照でない場合、name属性の命名規則は<PreferenceIdentifier>___<androidAttributeName>です。

<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf">
<adfmf:loadBundle basename="mobile.ViewControllerBundle"
var="bundle"/>
<adfmf:feature id="oracle.hello"
name="Hello"
icon="oracle.hello/navbar-icon.png"
image="oracle.hello/springboard-icon.png">
<adfmf:feature id="PROD"
name="#{bundle.FeatureName}"
icon="openMore.png"
image="G.png"
credentials="none">
...
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup">
<adfmf:preferenceBoolean default="true"
id="MyBooleanPreference"
label="My feature boolean pref"/>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>

D.3 iOS用のプリファレンスの変換

MAFデプロイメントは、表D-4に記載されているMAFプリファレンスを、iOS設定アプリケーションで必要なプリファレンス・リスト(.plist)ファイル表現に変換します。

表D-5 MAFプリファレンスと、対応するiOS表現

MAFプリファレンス・コンポーネント

iOS表現

<adfmf:preferencePage>

PSChildPaneSpecifier

<adfmf:preferenceGroup>

PSGroupSpecifier

<adfmf:preferenceBoolean>

PSToggleSwitchSpecifier

<adfmf:preferenceList>

PSMultiValueSpecifier

<adfmf:preferenceText>

PSTextFieldSpecifier

<adfmf:preferenceNumber>

PSTextFieldSpecifier

プリファレンス・リスト( .plist )ファイルのiOS要件については、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)にある『Preferences and Settings Programming Guide』を参照してください。

次の例は、maf-application.xmlファイルに基づくMAFプリファレンスのXMLを示しています。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen"
label="Oracle Way Cool Mobile App">
<adfmf:preferenceGroup id="SubPage01"
label="Child Page">
</adfmf:preferenceGroup>
</adfmf:preferences>

E MAFアプリケーションの使用方法

この付録には、MAFのユーザーの操作性に関する初歩的な情報が記載されています。

この付録の構成は、次のとおりです。

- 第E.1項「MAFアプリケーションの使用方法の概要」

- 第E.2項「モバイル・デバイスへのMAFアプリケーションのインストール」

- 第E.3項「アプリケーション機能間の移動」

- 第E.4項「プリファレンスの設定」

- 第E.5項「ログ・ファイルの表示」

- 第E.6項「アプリケーションの使用方法の制限」

E.1 MAFアプリケーションの使用方法の概要

MAFアプリケーションをインストールしたら(第E.2項「モバイル・デバイスへのMAFアプリケーションのインストール」を参照)、エンド・ユーザーは、モバイル・デバイスのホーム画面でアプリケーション・アイコンを選択して(図E-1を参照)、MAFアプリケーションの使用を開始できます。アプリケーションの起動時、ホーム画面にはスプラッシュ画面が表示されます。起動が完了したら、エンド・ユーザーは、アプリケーション機能間を移動したり(第E.3項「アプリケーション機能間の移動」を参照)、プリファレンスを設定したり(第E.4項「プリファレンスの設定」を参照)、他のすべてのタスクを実行することが可能になります。

ユーザー・ログインの詳細は、第29.2項「ユーザー・ログイン・プロセスについて」を参照してください。

図E-1 iPhone上のアプリケーション・アイコン

E.2 モバイル・デバイスへのMAFアプリケーションのインストール

エンド・ユーザーは、通常のアプリケーション・プロビジョニング・メカニズムを通じてMAFアプリケーションをダウンロードおよびインストールできます。

インストール時、アプリケーションのプリファレンスにはデフォルト設定が移入されます。デフォルトの変更方法については、第E.4項「プリファレンスの設定」および第E.2.2項「AndroidデバイスへのMAFアプリケーションのインストール方法」を参照してください。

モバイル・デバイスからMAFアプリケーションを削除することは、他のアプリケーションのアンインストールと変わりません(第E.2.3項「MAFアプリケーションのアンインストール方法」を参照)。

E.2.1 iOSデバイスへのMAFアプリケーションのインストール方法

iOSデバイスのユーザーは、次のいずれかの方法でMAFアプリケーションをダウンロードおよびインストールします。

- エンタープライズ固有の配布メカニズムから

- iTunesを使用

- iPhone構成ユーティリティを通じてデプロイ

- Webサーバー上でワイヤレスにホスティング

- AppleのApp Storeから

E.2.2 AndroidデバイスへのMAFアプリケーションのインストール方法

アプリケーション・マーケットプレイスで利用可能なMAFアプリケーションをインストールすることに加えて、エンド・ユーザーは、アプリケーション・マーケットプレイスの外部で利用可能なアプリケーションをダウンロードできます。これを実行する方法については、Webで情報を検索することをお薦めします。

E.2.3 MAFアプリケーションのアンインストール方法

MAFアプリケーションは、他のアプリケーションと同様にモバイル・デバイスから削除されます。アンインストール・プロセスでは、アプリケーションとともにすべてのアプリケーション・データおよびすべての外部プリファレンスが削除されます。

E.3 アプリケーション機能間の移動

各アプリケーション機能へのアクセスを提供するために、MAFアプリケーションは、ナビゲーション・バーまたはSpringboardを使用して、有効なアプリケーション機能間の移動を可能にします。

アプリケーション開発時のナビゲーションの構成については、第4章「アプリケーションのナビゲーションの構成方法」を参照してください。

E.3.1 iOSデバイスでのアプリケーション機能間の移動方法

図E-2は、iPhone上に表示されるMAFのUI要素を示しています。

図E-2 iPhone上のUI要素

UIは、ナビゲーション・アイテム(アイコン)が移入されたナビゲーション・バーで構成されています。最初のナビゲーション・アイテムは強調表示されており、これが選択されていることを示しています。

注意:
アプリケーションに対してSpringboardが定義されている場合は、オーバーレイ形式で「ホーム」ナビゲーション・ボタンがナビゲーション・バーの上に表示されますが、このボタンはその一部ではありません。このボタンにより、エンド・ユーザーは、アプリケーション・コンテンツからSpringboardに戻ることができます。
アプリケーションに対してSpringboardが指定されていない場合、「ホーム」アイコンは表示されません。

詳細は、第4章「アプリケーションのナビゲーションの構成方法」を参照してください。

図E-2で示されている例のナビゲーション・バーには、6つのナビゲーション・アイテムが含まれていますが、iPhone上のスペースが限られているため、すべてのナビゲーション・アイテムを同時に表示することはできません。そのため、5つ目のアイコンは、「次へ」機能になっています。「次へ」機能がアクティブ化されると、ナビゲーション・バーが展開され、残りのナビゲーション・アイテムが表示されます。iPad上では、すべてのナビゲーション・アイテムが表示されます。ナビゲーション・バーの上のコンテンツ領域には、この特定のソリューションに固有のコンテンツが表示されます。前述の例では、アプリケーションにバンドルされている発注の承認ツールです。

注意:
ナビゲーション・バーに少なくとも1つのアプリケーション機能のアイコンが表示されている場合、エンド・ユーザーに対して、「非表示」ボタン(ナビゲーション・バーが表示されている場合にそれを非表示にするボタン)と「表示」ボタン(ナビゲーション・バーが非表示の場合にそれを表示するボタン)が表示されます。
アプリケーションXMLファイル(adfmf-application.xml)で1つのアプリケーション機能のみが定義されている場合、または制約(または条件)で1つのアプリケーション機能のみの表示が許可されている場合、ナビゲーション・バーは非表示になります。

adfmf-application.xmlファイルで、ナビゲーション・バーに表示されるアプリケーション機能が参照されていない場合、「非表示」と「表示」のボタンがエンド・ユーザーに表示されず、ナビゲーション・バーが最初は非表示になっている可能性があります。この場合、Springboardが定義されているときは、それがアプリケーションに対する唯一のナビゲーション・ツールになります。

詳細は、第E.3.1.2項「単一機能アプリケーションの使用」を参照してください。

図E-3は、「次へ」アイコンがアクティブ化され、残りのナビゲーション・アイテムがリストとして表示された後のiPhone画面を示しています。エンド・ユーザーは「次へ」リスト内でアイテムを再配置できます。

図E-3 iPhone上のすべてのナビゲーション・アイテムの表示

アプリケーションの起動時にナビゲーション・バーに表示されるナビゲーション・アイテムを変更するには、図E-4に示すとおり、「編集」を選択して「構成」モードにします。

図E-4 iPhone上の「構成」モード

「構成」モードでは、コンテンツ領域からアイコンをドラッグし、それをナビゲーション・バーにドロップできます。この例では、図E-5に示すとおり、ナビゲーション・バーで「送信」ナビゲーション・アイテムがGleナビゲーション・アイテムに置き換えられ、「送信」は「次へ」アイテムの下にリストされています。構成モードを終了するには、「終了」を選択して「次へ」画面に戻ります。

図E-5 iPhone上のナビゲーション・バー表示の変更

エンド・ユーザーがナビゲーション・バーで新たに再配置されたGleナビゲーション・アイテムを選択すると、図E-6に示すとおり、コンテンツ領域にGleページが表示されます。

図E-6 iPhone上の再配置されたナビゲーション・アイテムのアクティブ化

E.3.1.1 Springboardを使用した移動

MAFでは、デフォルトでSpringboardナビゲーションは無効になっています。これは、開発時にadfmf-application.xmlファイルを構成することで有効化されます(第4章「アプリケーションのナビゲーションの構成方法」を参照)。

Springboardを使用したナビゲーションに対してMAFアプリケーションが有効である場合、アプリケーションの起動時、エンド・ユーザーに、図E-7に示すような画面が表示されます。

図E-7 Springboard画面

上の図では、MAFで提供されているデフォルトのSpringboardがデフォルトの縦レイアウトでiPhone上に表示されています(開発時にカスタムSpringboardを作成する方法については、第4章「アプリケーションのナビゲーションの構成方法」を参照してください)。エンド・ユーザーが利用可能なアプリケーション・コンテンツ機能が3ページあり、画面の下部に3つのドットで示されています。エンド・ユーザーは、3つのページの最初のページを表示しています。最初のドットが明るく示されており、ユーザーが最初のページを表示していることがわかります。

機能の2番目のページを開く(図E-8を参照)には、iPhoneの画面を右から左にスワイプします。すると、最初のページが左に移動し、右から2番目のページが現れます。最初のページが左に移動してフェードアウトし、2番目のページが現れてフェードインします。

図E-8 Springboard: 2番目のページ

上の図では、エンド・ユーザーは3つのページの2番目のページを表示しています。2番目のドットが明るく示されていることで、それがわかります。

エンド・ユーザーがモバイル・デバイスを横方向に回転すると、それに応じてSpringboardアイコンの位置が変わります(図E-9を参照)。

図E-9 横表示のSpringboard画面

表示の方向が変わってもページは変わらず、ページ2が表示されていることに注意してください。

横方向の表示になっている間に機能の最初のページに戻る(図E-10を参照)には、iPhoneの画面を左から右にスワイプします。すると、2番目のページが右に移動し、左から最初のページが現れます。

図E-10 横表示のSpringboard: 最初のページ

1ページ目にある特定の機能(「コンタクト先」など)を表示するには、「コンタクト先」アイコンまたは該当するテキストをタッチします。

iOSデバイスでは、エンド・ユーザーは、デバイス・シェイク・ジェスチャーによって、どのアプリケーション機能からもSpringboardに戻ることができます。

Androidデバイスでは、エンド・ユーザーは、メニュー項目を使用していつでもSpringboardに戻ることができます。

E.3.1.2 単一機能アプリケーションの使用

アプリケーションには、単一の機能しか持たないものもあります。その機能は、Springboardまたはナビゲーション・バーに表示されるようには構成されません。この場合、その単一の機能のみがエンド・ユーザーに表示され、ナビゲーション・バーの表示を制御したり、Springboardに戻ったりするための特殊なボタンは表示されません。

E.3.2 Androidデバイス上での移動方法

Androidデバイスでのアプリケーション機能のナビゲーションは、「次へ」機能を除いて、iOSデバイスでのナビゲーションとほぼ同じです(第E.3.1項「iOSデバイスでのアプリケーション機能間の移動方法」を参照)。Androidデバイスでは、「次へ」機能がアクティブ化されると、残りのナビゲーション・アイテムのリストが表示されます。ナビゲーション・バーの外観は変わりません。

E.4 プリファレンスの設定

エンド・ユーザーは、モバイル・プラットフォームによって規定されている方法でアプリケーションのプリファレンスを構成できます。

アプリケーション開発時のプリファレンスの構成については、第21章「ユーザー・プリファレンスの有効化」を参照してください。

E.4.1 iOSデバイスでのプリファレンスの設定方法

エンド・ユーザーは、iOSデバイスで「設定」アプリケーションを開き、MAFアプリケーションの「設定」アイコンを選択して、そのアプリケーションで使用可能なすべての設定にアクセスできます。変更された設定は、「設定」アプリケーションを終了すると有効になります。これは、iOSデバイス上のすべてのアプリケーションの通常の動作です。

起動時、プリファレンスにはデフォルト値が移入されています。それらの値は、adf-feature.xmlファイルで定義されています。プリファレンスの値を設定するための標準的な方法に加えて、次の方法で値を定義できます。

- 値のリストから選択する。

- 読取り不可の値として(パスワードなどを入力する場合)。

- バイナリ値として。

プリファレンスは、カスケード・ページに表示されます。変更可能なプリファレンスと変更できないプリファレンスは、容易に区別できます。

プリファレンスを使用して、ユーザーの資格証明をグローバルに設定できます(第29章「MAFアプリケーションの保護」を参照)。

E.4.2 Androidデバイスでのプリファレンスの設定方法

Androidデバイスでのプリファレンスの設定は、iOSデバイスでのプリファレンスの設定と同じです(第E.4.1項「iOSデバイスでのプリファレンスの設定方法」を参照)。プリファレンスには、「プリファレンス」メニュー項目からアクセスできます。

注意:
そのアプリケーションに対して定義されているプリファレンスが存在しない場合は、メニューに「プリファレンス」メニュー項目が表示されることはありません。

E.5 ログ・ファイルの表示

診断とサポートの目的で、有効化されたアプリケーション機能のアプリケーション・ログ・ファイルをデバイス上に表示できます。

iOSデバイスの場合、ログ・ファイルは~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>にあります。ログ・ファイルにアクセスする前に、デバイスを同期する必要があります。

Androidデバイスにおけるログ出力の検索および表示の詳細は、http://developer.android.com/tools/help/logcat.htmlを参照してください。

ロギングの詳細は、第30.4項「ロギングの使用方法と構成」を参照してください。

E.6 アプリケーションの使用方法の制限

一般的なMAFアプリケーションの様々なモジュールの使用方法には、多くの制限があります。

E.6.1 リスト・ビュー・コンポーネントの制限

MAF AMXリスト・ビュー・コンポーネントを使用する際に(第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- リスト・ビュー・コンポーネントが編集モードの場合、エンド・ユーザーが実行可能なのは、(リスト・アイテム・コンポーネントによって表示されている)行の並替えのみであり、行を選択またはハイライトすることはできません。

E.6.2 データ視覚化コンポーネントの制限

MAF AMXデータ視覚化コンポーネントを使用する際に(第13.5項「データ視覚化の指定」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- 地理マップ(第13.5.17項「地理マップ・コンポーネントの使用方法」を参照)を除いて、MAF AMXデータ視覚化コンポーネントは、Android 2.nプラットフォームで相互作用をサポートしていません。

- Androidでは、WAI-ARIAアクセシビリティ機能はデータ視覚化コンポーネントに対してサポートされません。

E.6.3 Androidプラットフォームでのデバイスの「戻る」ボタンの制限

Android 4.nでは、エンド・ユーザーは、デバイスの戻るボタンによって、前にアクセスしたアプリケーション機能に戻ります。エンド・ユーザーがアプリケーションの起動時に最初にアクセスしたアプリケーション機能に到達するまでデバイスの戻るボタンをアクティブ化し続けても、アプリケーションは存在しています。

ビュー間の移動の構成方法は、第13.3.5.7項「戻るボタン・ナビゲーションの有効化」を参照してください。

E.6.4 アクセシビリティ・サポートの制限

アクセシビリティが必要な際に(第13.8項「MAFのアクセシビリティのサポートの理解」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- MAF AMX UIコンポーネントは、アプリケーションがAndroidスクリーン・リーダー・モードで実行された場合、正しく動作しない可能性があります。

- Androidでは、WAI-ARIAアクセシビリティ機能はDVTコンポーネントに対してサポートされません。

F XMLの解析

この付録では、XMLの解析で使用できるライブラリについて説明します。

この付録には次の項が含まれます:

- 第F.1項「kXMLライブラリを使用したXMLの解析」

F.1 kXMLライブラリを使用したXMLの解析

コアMAFライブラリの1つであるkXMLは、XMLの解析に使用できるAPIを提供します。このライブラリは、JDKプロファイラ・インタフェース(JVMPI)を通じてアプリケーションに公開されます。

詳細は、kXMLのドキュメントを参照してください。

- http://kxml.sourceforge.net/kxml2

- http://kxml.sourceforge.net/kxml2/javadoc

G サンプルのMAFアプリケーション

この付録では、サンプルのMAFアプリケーションについて説明します。

この付録には次の項が含まれます:

- 第G.1項「サンプルのMAFアプリケーションの概要」

G.1 サンプルのMAFアプリケーションの概要

MAFは、基本的なアーティファクトの作成、デバイス・ネイティブな機能(SMSや電子メールなど)へのアクセス、ローカルのSQLiteデータベース上でのCRUD (作成/読取/更新/削除)操作の実行など、様々な開発シナリオを提供するサンプル・アプリケーションのセットとともに出荷されています。これらのアプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内の次の場所に存在するPublicSamples.zipファイルにあります。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

これらのアプリケーションを表示するには、PublicSamples.zipファイルをJDeveloper作業ディレクトリ(これは通常、User Home Directory/jdeveloper/myworkです)に抽出します。

これらのアプリケーションについては、すべて表G-1で説明されています。特に断りがないかぎり、これらのアプリケーションは、開発環境を構成した後でシミュレータにデプロイできます(『Oracle Mobile Application Framework Oracle Mobile Application Frameworkのインストール』を参照)。

表G-1 サンプルのMAFアプリケーション

アプリケーション名

説明

サンプル・アプリケーションの実行に必要な追加のリソース

HelloWorld

フレームワークの基本的な構造を示す、MAFのhello worldアプリケーション。この基本アプリケーションには、ローカルのHTMLファイルによって実装される単一のアプリケーション機能があります。このアプリケーションを使用して、開発環境が、アプリケーションのコンパイルとデプロイのために正しく設定されていることを確認します。第2.2.2項「MAFアプリケーションの作成時に行われる処理」も参照してください。

ACS

このアプリケーションは、SecurityDemoアプリケーション内で使用されてログイン・サーバーとアクセス制御サービスを構成するRESTサービスを提供します。

このWebアプリケーションは、WebLogic Serverにデプロイする必要があります。

APIDemo

このアプリケーションは、MAF AMXページ内からカスタムJavaScriptメソッドを起動する方法を示します。この方法を使用して、DeviceFeaturesデータ・コントロールには含まれていないApache Cordova APIを起動します。また、この方法を使用してカスタムJavaScriptメソッドをアプリケーションに追加し、これらのメソッドを起動することもできます。このアプリケーションは、JavaScriptメソッドからJavaへのコールバック方法も示します。詳細は、第3.3項「アプリケーション機能の表示プロパティの設定」および第B.2項「MAFコンテナ・ユーティリティAPI」を参照してください。

BarcodeDemo

このアプリケーションは、バッキングBeanから起動される埋込みJavaScriptからBarcodeScannerプラグインをコールすることによって、Cordovaプラグインを活用する方法を示しています。詳細は、第9章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

CompGallery

このアプリケーションは、これらのコンポーネントのすべてを示すことによって、MAF AMX UIコンポーネントを紹介する役割を果たします。このアプリケーションを使用して、これらのコンポーネントの属性を変更し、その変更の効果をリアルタイムで確認できます。変更を行うたびにアプリケーションを再コンパイルして再デプロイする必要はありません。一般的な情報については、第13章「MAF AMXユーザー・インタフェースの作成」を参照してください。

ConfigServiceDemo

このアプリケーションは、Configuration Serviceを使用して、MAFアプリケーションで使用されているエンド・ポイントを変更する方法を示しています。connections.xml内のエンド・ポイントの変更は、デバイス上のアプリケーションに伝播され、アプリケーションは再初期化されて新しいエンド・ポイントを消費します。詳細は、第16.1項「MAFアプリケーションで使用されるエンド・ポイントの構成の概要」を参照してください。

DeviceDemo

このアプリケーションは、DeviceFeaturesデータ・コントロールを使用して、地理的位置、電子メール、SMS、コンタクト先などのデバイス機能を公開する方法、およびデバイスにそのプロパティを問い合せる方法を示します。このアプリケーションは、DeviceFeaturesデータ・コントロールからdisplayFileメソッドを使用して、.doc、.ppt、.xls、.pngなどの様々なタイプのファイルを表示する方法も示します。詳細は、第14.11項「DeviceFeaturesデータ・コントロールの使用方法」および第14.11.9項「displayFileメソッドを使用してファイルの表示を可能にする方法」を参照してください。

SMSおよび一部のデバイス・プロパティはiOSシミュレータまたはAndroidエミュレータ上で機能しないため、このアプリケーションを実際のデバイス上で実行する必要があります。

ExpandCollapseComponent

このアプリケーションは、どのタイプのAMXコンポーネントのコンテナとしても機能するカスタム・コンポーネントの作成方法を示しています。また、展開機能と縮小機能の例も提供します。詳細は、jsフォルダ内のcardview.jsファイルを参照してください。このJavaScriptファイルには、コンポーネントのUIをレンダリングするメソッド(expandcollapse.prototype.render)が含まれています。さらに、カスタム・コンポーネントの子コンポーネントをレンダリングする方法を示すメソッドも含まれています。詳細は、第19.1項「カスタムUIコンポーネントの作成の概要」を参照してください。

FragmentDemo

このアプリケーションは、フラグメントを使用して、テンプレートとして使用できる再利用可能なアーティファクトを定義する方法を示します。各機能に対して複数のコンテンツ・タイプ(1つはタブレット用、もう1つは電話用)を含める方法、および毎回リスト/フォームをコード化する必要がないようにフラグメントを使用する方法を示します。

GestureDemo

このアプリケーションは、MAFアプリケーションにおいてジェスチャーをどのように実装および使用できるかを示します。第13.4項「ジェスチャーの有効化」も参照してください。

LifecycleEvents

このアプリケーションは、MAFアプリケーション自体およびその埋込みアプリケーション機能にライフサイクル・イベント・ハンドラを実装します。このアプリケーションは、アプリケーションがライフサイクルの特定の時点で自身のロジックを実行できるようにするためのコードを挿入する場所を示します。第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」も参照してください。

iOSの場合、LifecycleEventsサンプル・アプリケーションは、/Applications/Utilities/Console.appにあるコンソール・アプリケーションにデータを記録します。

LocalNotificationDemo

このアプリケーションは、MAFアプリケーション内のローカル通知のスケジュール方法と受信方法を示します。第24章「通知の有効化と使用方法」も参照してください。

MCS Sample

このアプリケーションは、MAF MCSユーティリティを使用して、Oracle Mobile Cloud Service (MCS)にアクセスする方法を示しています。AndroidおよびiOSタブレットでの使用向けに最適化されています。このアプリケーションに付属のMAF MCSユーティリティJARには一連のAPIが用意され、これを使用することで、MAF開発者はMCSのコア・サービス(分析、診断、記憶域収集など)をより簡単に使用できるようになります。参照用にユーティリティ・クラスのソースが含まれています。

このサンプル・アプリケーションを実行するには、Oracle MCSをサブスクライブしてOracle Mobile Cloud Serviceに接続できるようにする必要があります。Oracle MCSインスタンス内には、1人以上のモバイル・ユーザー、テスト対象のモバイル・バックエンド(MBE)、およびMBEに割り当てる1つ以上のサンプル記憶域収集を作成する必要があります。

Navigation

このアプリケーションは、バインドされたタスク・フローやルーターを含む、MAFの様々なナビゲーション技術を示します。様々なページ遷移についても示します。第12.2項「タスク・フローの作成」も参照してください。

このアプリケーションは、Samplesディレクトリから開く必要があります。「デフォルト」のSpringboardオプションは、maf-application.xmlの概要エディタの「アプリケーション」ページでいったんクリアし、再度選択する必要があります。

PrefDemo

このアプリケーションは、アプリケーション全体のユーザー設定ページおよびアプリケーション機能固有のユーザー設定ページを示します。一般的な情報については、第21章「ユーザー・プリファレンスの有効化」を参照してください。

PushDemo

このアプリケーションは、Apple Push NotificationサーバーとGoogle Could Messagingサーバーを対象としたプッシュ通知の登録方法と受信方法を示します。詳細は、24.2項「プッシュ通知の有効化」を参照してください。

このアプリケーションは、プッシュ通知を開始する機能を提供するPushServerサンプル・アプリケーションとともに使用します。

PushServer

このアプリケーションは、PushDemoサンプル・アプリケーションで受信するプッシュ通知を開始する機能を提供します。詳細は、24.2項「プッシュ通知の有効化」を参照してください。

このWebアプリケーションは、Weblogic Serverにデプロイする必要があります。このアプリケーションは、Apple Push NotificationサーバーとGoogle Could Messagingサーバーを対象としたプッシュ通知の登録方法と受信方法を示すPushDemoサンプル・アプリケーションとともに使用します。

RangeChangeDemo

リスト・ビューが新しいデータを外部ソースからフェッチしてくる必要がある場合に、このアプリケーションは、RangeChangeEventを使用してJavaハンドラ メソッドを起動する方法を示しています。また、その属性を使用してリスト・ビューのスクロールとバッファの動作を構成する方法も示しています。詳細は、第13.3.15.1項「ページングおよび動的スクロールの構成」を参照してください。

RESTDemo

このアプリケーションは、REST Webサービスの使用方法を示します。REST-JSONアプリケーション機能は、一般に公開されているWebサービスを使用して任意のIPアドレスの地理座標を取得します。このサービスはJSON形式のデータを戻します。REST-JSON機能では、URL接続はWebサービスを呼び出すためにRESTServiceAdapterヘルパー・クラスによって直接使用され、このレスポンスはJSONSerializationHelperクラスを使用して解析され、Beanデータ・コントロールに移入されます。ユーザー・インタフェースはこのBeanにバインドされます。アプリケーション機能では、Webサービス・コールの結果としてフォームまたはマップが生成されます。後者は、戻された地理座標が含まれるマーカーとともに中央に配置されます。

SecurityDemo

このアプリケーションは、MAFアプリケーションを保護する方法、認証およびログイン・サーバーを構成する方法、アクセス制御サービスを使用する方法、セキュアなWebサービスにアクセスする方法を示しています。詳細は、第29.1項「MAFセキュリティの概要」を参照してください。

このアプリケーションは、ACSサンプル・アプリケーションで使用され、ログイン・サーバーとアクセス制御サービスの構成に使用されるRESTサービスを提供します。

SkinningDemo

このアプリケーションでは、提供されているスタイル・シートをオーバーライドするか、独自のスタイル・シートを使用して拡張することで、アプリケーションにスキンを適用し、固有のルック・アンド・フィールを追加する方法を示します。また、このアプリケーションは、スキンがどのようにして、デバイスのタイプに基づいてMAF AMX UIコンポーネントのスタイルを制御するかも示します。実行時にスキン・ファミリ(初期状態またはカスタム)を変更する機能も示します。第7章「MAFアプリケーションのスキニング」も参照してください。

SlidingWindows

このアプリケーションは、AdfmfSlidingWindowUtilities APIの使用方法を示しています。このAPIを使用すると、画面に複数の機能を同時に表示できます。この例は、AdfmfSlidingWindowUtilities APIを使用してカスタムSpringboardまたはグローバル・ナビゲーション・バーを作成する方法を示しています。

StockTracker

このサンプルは、データ変更イベントがどのようにJavaを使用して、データ変更をユーザー・インタフェースに反映できるかを示します。様々なレイアウト・ユースケース、ジェスチャーおよび基本的なモバイル・パターンがあります。このサンプルでは、amx:validationGroupコンポーネントによるクライアント・サイド検証の使用方法も示します。詳細は、Portfolio機能でeditStock.amxを参照してください。また、第14.13項「データ変更イベントについて」も参照してください。

UIDemo

このアプリケーションは、ユーザー・インタフェース・レイアウトと、MAFアプリケーションで一般的に使用される様々なリストおよびボタン・スタイルの作成方法を示します。また、ポップアップ・コンポーネントのアクション・シート・スタイルの作成方法、および様々なチャートおよびゲージ・コンポーネントの使用方法も示します。第13.3項「UIコンポーネントの作成と使用方法」および第13.5項「データ視覚化の指定」も参照してください。

このアプリケーションは、Samplesディレクトリから開く必要があります。「デフォルト」のSpringboardオプションは、maf-application.xmlの概要エディタの「アプリケーション」ページでいったんクリアし、再度選択する必要があります。

URLSchemeDemo

このアプリケーションは、ブラウザまたは電子メールのURLリンクから起動できるようにアプリケーションのカスタムURLスキームを定義する方法を示します。第20.4項「カスタムURLスキームを使用したMAFアプリケーションの起動」も参照してください。

WorkBetter

この人事管理アプリケーションには個人と組織の2つの機能があり、個人機能には、個人の検索ができる検索コンポーネントが含まれます。また、カスタム・コンポーネントの作成機能、再利用可能なレイアウトをフラグメントとして構築する方法、および異なる機能間でこのフラグメントを使用する方法も示します。業績、報酬および時系列関連の情報を表示する各種のDVT視覚化コンポーネントの使用方法を示しています。Organizations: People機能と同様に、フラグメントとして再利用可能なレイアウトを構築する方法およびそれを様々な機能間で使用する方法を示しています。また、異なるフォーム・ファクタのビューを作成し、これらのビューを構成する方法も示します。

このアプリケーションは、様々なUI技術および使用可能なコンポーネントのエンドツーエンドのデモとして設計されています。様々なレイアウト・パターンを示し、一般的なコンポーネントとより複雑なコンポーネントの様々な使用方法について説明します。このアプリケーションは、アプリケーション全体のショーケースではなく、ユーザー・インタフェースに重点を置いています。データ・モデル、Webサービスなどについては、他のサンプルを参照してください。

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2015, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

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

保証免責

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

制限付権利

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

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

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

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。