Oracle Enterprise Pack for Eclipse

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

リリース2.3.0

E77213-01(原本部品番号:E68520-01)

2016年6月

Oracle Enterprise Pack for Eclipse開発者を対象に、Oracle Enterprise Pack for Eclipseを使用して、デバイス上でネイティブに実行するモバイル・アプリケーションを作成する方法を説明します。

Oracle Enterprise Pack for Eclipse Oracle Mobile Application Framework (OEPE Edition)でのモバイル・アプリケーションの開発 リリース2.3.0

E77213-01

Copyright © 2014, 2016,  Oracle and/or its affiliatesAll rights reserved.

原本著者: Catherine Pickersgill

原本協力者: Walter Egan、Sujatha Joseph

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

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

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

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の登録商標です。

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

目次

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

このガイドでのMAFリリース2.3.0の新機能

- MAFリリース2.3.0の新機能と変更された機能

- MAFリリース2.3.0に関するこのドキュメントにおけるその他の大きな変更

1 Oracle Mobile Application Frameworkの概要

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

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

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

- 1.3.1 接続アプリケーションおよび非接続アプリケーションについて

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

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

- 2.1 MAFの開発環境の概要

- 2.1.1 MAFアプリケーション・エディタについて

- 2.1.2 MAF機能エディタについて

- 2.2 Oracle MAFパースペクティブの使用

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

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

- 2.3.2 MAFアプリケーションを作成する場合の処理

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

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

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

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

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

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

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

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

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

- 2.7.3 MAF AMXページおよびタスク・フロー作成時の処理

- 2.8 エンタープライズ配布のためのMAFアプリケーションのコンテナ化

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

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

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

- 3.3 iOSでのMAFアプリケーションの起動画面の変更

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

4 MAFアプリケーション機能の構成

- 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 Androidの戻るボタンを使用したMAFアプリケーションの移動

- 4.8.1 Androidシステムの戻るボタンの動作を構成する方法

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

- 4.10 MAFアプリケーションでのカスタムURLスキームの使用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 6.7 MAFでの言語のサポート

- 6.8 ローカライズ可能な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 実行時の処理: エンド・ユーザーによるアプリケーション・スキンの変更方法

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

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

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

- 8.3 FARの追加時に行われる処理

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

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 機能アーカイブ・ファイルからのプラグインのインポート

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

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

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

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

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

11 MAF AMXページの作成

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

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

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

- 11.2.2 タスク・フロー・アクティビティおよび制御フローに関する必知事項

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

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

- 11.2.5 タスク・フロー・アクティビティの追加および使用方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 11.3 ビューの作成

- 11.3.1 MAF AMXページの操作方法

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

- 11.3.1.2 MAF AMXページの作成

- 11.3.1.3 MAF AMXページの作成時の処理

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

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

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

- 11.3.2 MAF AMXページへのUIコンポーネントおよびデータ・コントロールの追加方法

- 11.3.2.1 UIコンポーネントの追加

- 11.3.2.2 プレビューの使用

- 11.3.2.3 データ・コントロールのビューへの追加

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 12.2.13 アクセサリ・レイアウト・コンポーネントの使用方法

- 12.2.14 デック・コンポーネントの使用方法

- 12.2.15 フレックス・レイアウト・コンポーネントの使用方法

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

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

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

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

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

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

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

- 12.3.5 ボタンの使用方法

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

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

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

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

- 12.3.5.5 追加のボタン・スタイルの使用

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

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

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

- 12.3.6 リンクの使用方法

- 12.3.7 イメージの表示方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 12.3.18.1 JavaScriptおよびAJAXのVerbatimコンポーネントでの使用に関する必知事項

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

- 12.3.20 反復の有効化方法

- 12.3.21 UIコンポーネントのコンテンツのリフレッシュ方法

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

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

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

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

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

- 12.3.26 日時の変換方法

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

- 12.3.27 数値の変換方法

- 12.3.28 ドラッグ・ナビゲーションの有効化

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

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

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

- 12.5 データ視覚化の指定

- 12.5.1 面グラフの作成方法

- 12.5.2 棒グラフの作成方法

- 12.5.3 レンジ・チャートの作成方法

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

- 12.5.5 コンポ・チャートの作成方法

- 12.5.6 線グラフの作成方法

- 12.5.7 円グラフの作成方法

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

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

- 12.5.8 散布図の作成方法

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

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

- 12.5.11 株価チャートの作成方法

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

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

- 12.5.14 チャート・ツールチップのカスタマイズに関する必知事項

- 12.5.15 カテゴリ軸でのチャートのソートを有効にする方法

- 12.5.16 チャートの初期ズームを定義する方法

- 12.5.17 特定のチャート系列のスタックを定義する方法

- 12.5.18 チャートの二重-Y軸分割を有効にする方法

- 12.5.19 LEDゲージの作成方法

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

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

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

- 12.5.22.1 shortDesc属性の上書き

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

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

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

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

- 12.5.23.3 X軸、Y軸およびY2軸の定義

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

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

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

- 12.5.23.7 株価のデータ・アイテムの定義

- 12.5.23.8 しきい値の定義

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

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

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

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

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

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

- 12.5.25.3 分離領域の定義

- 12.5.25.4 初期ズームの有効化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 12.5.35 極チャートを作成する方法

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

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

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

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

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

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

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

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

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

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

- 12.9 入力の検証

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

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

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

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

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

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

- 13.3 EL式の作成

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

- 13.3.2 EL式の作成方法

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

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

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

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

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

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

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

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

- 13.3.6 ELイベントについて

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

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

- 13.4.1 OEPEでのマネージドBeanの作成方法

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

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

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

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

- 13.5.2.1 データ制御マネージャ

- 13.5.2.2 パレット

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

- 13.6 データ・コントロール・パレットからのデータバインドUIコンポーネントの作成

- 13.6.1 データ・コントロール・パレットの使用方法

- 13.6.2 データ・コントロール・パレットの使用時に行われる処理

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

- 13.8 データ・コントロール属性の使用

- 13.8.1 属性へのUIヒントの設定

- 13.9 Beanデータ・コントロールの作成と使用

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

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

- 13.10.1 撮影を有効にするためのgetPictureメソッドの使用方法

- 13.10.2 テキスト・メッセージを有効にするためのSendSMSメソッドの使用方法

- 13.10.3 電子メールを有効にするためのsendEmailメソッドの使用方法

- 13.10.4 連絡先の作成を有効にするためのcreateContactメソッドの使用方法

- 13.10.5 連絡先の検索を有効にするためのfindContactsメソッドの使用方法

- 13.10.6 連絡先の更新を有効にするためのupdateContactメソッドの使用方法

- 13.10.7 連絡先の削除を有効にするためのremoveContactメソッドの使用方法

- 13.10.8 地理的位置を有効にするためのstartLocationMonitorメソッドの使用方法

- 13.10.9 ファイルの表示を有効にするためのdisplayFileメソッドの使用方法

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

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

- 13.11 属性の検証

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

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

- 14.1 エンド・ポイントの構成の概要

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

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

- 14.4 URLの構造について

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

15 MAFアプリケーションでのWebサービスの使用方法

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

- 15.2 WebサービスにアクセスするためのRESTサービス・アダプタの作成

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

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

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

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

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

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

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

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

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

16 RESTサービスの使用

- 16.1 RESTサービスの使用の概要

- 16.1.1 RESTクライアント・ページ

- 16.1.2 REST APIページ

- 16.1.3 「データ型」ページ

- 16.1.4 認証の使用

- 16.1.5 RESTサービス・エディタを開く方法

- 16.1.6 RESTサービス記述を作成する方法

- 16.2 RESTクライアントの使用

- 16.2.1 RESTサービス接続の指定

- 16.2.1.1 単純なURIを入力する方法

- 16.2.1.2 RESTサービスのアドレスを構成する方法

- 16.2.1.3 リクエストに問合せを含める方法

- 16.2.1.4 リクエストにフラグメントを含める方法

- 16.2.1.5 アプリケーションの接続名を使用する方法

- 16.2.1.6 永続接続を作成する方法

- 16.2.1.7 OWSMポリシーのオーバーライド

- 16.2.1.8 認証を使用する方法

- 16.2.2 RESTサービスへのリクエストの送信

- 16.2.3 リクエストを送信する場合の処理

- 16.2.4 レスポンス・タイプの生成

- 16.3 リクエスト・コンテンツの変更

- 16.3.1 リクエストでRESTヘッダーを使用する方法

- 16.3.2 問合せパラメータを使用してレスポンスを構成する方法

- 16.3.3 入力を送信する方法

- 16.3.4 出力を指定する方法

- 16.4 REST APIのインポートおよびモデル化

- 16.4.1 RESTクライアント情報のインポート

- 16.4.2 RESTクライアント情報をインポートする場合の処理

- 16.4.3 手動によるREST APIのモデル化

- 16.4.3.1 新しいリクエストを作成する方法

- 16.4.3.2 新しいパスを作成する方法

- 16.4.4 パス変数タイプの使用

- 16.4.4.1 パス変数タイプを編集する方法

- 16.4.4.2 アーティファクト生成のパス変数タイプ

- 16.4.4.3 パス変数タイプおよびRESTクライアント

- 16.5 データ型のインポートおよびモデル化

- 16.5.1 データ型を作成する方法

- 16.5.2 データ型をインポートする方法

- 16.6 RESTサービスに対するモデル化されたリクエストのテスト

- 16.7 RESTサービス・アーティファクトの作成

- 16.7.1 RESTサービス用のJavaアーティファクトを生成する方法

- 16.7.2 Javaアーティファクトを生成する場合の処理

- 16.7.3 RESTサービスに対して生成されるアーティファクトについて

- 16.7.3.1 生成されるデータ型アーティファクト

- 16.7.3.2 生成されるREST APIアーティファクト

- 16.7.3.3 生成されるサービス・アーティファクト

- 16.7.4 生成されたアーティファクトをMAFアプリケーションで使用する方法

- 16.8 「接続」ビューの使用

- 16.8.1 「接続」ビューを開く方法

- 16.8.2 接続を編集する方法

- 16.8.3 接続を再利用する方法

- 16.8.4 connections.xmlを開く方法

17 Oracle Cloudサービスの使用

- 17.1 Oracle Cloudサービスの使用の概要

- 17.2 MCSの使用の概要

- 17.2.1 MCSの開始

- 17.2.1.1 MAFアプリケーションでのMCSサービスの使用

- 17.2.1.2 MCSモバイル・サービスのモバイル・クライアントの開発

- 17.2.1.3 モバイル・バックエンドの使用

- 17.2.1.4 REST APIのインポート

- 17.3 Oracle Cloudでホストされるデータへのモバイル・アプリケーションによるアクセスの有効化

- 17.3.1 Oracle Cloudの認証方法

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

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

- 17.3.3 Oracle Java Cloud Serviceにアクセスするモバイル・アプリケーションをデプロイする場合の処理

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

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

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

- 18.2.1 静的APIの使用方法

- 18.2.2 AmxEventクラスの使用方法

- 18.2.3 TypeHandlerの使用方法

- 18.2.4 AmxNodeの使用方法

- 18.2.5 AmxTagの使用方法

- 18.2.6 VisitContextの使用方法

- 18.2.7 AmxAttributeChangeの使用方法

- 18.2.8 AmxDescendentChangesの使用方法

- 18.2.9 AmxCollectionChangeの使用方法

- 18.2.10 AmxNodeChangeResultの使用方法

- 18.2.11 AmxNodeStatesの使用方法

- 18.2.12 AmxNodeUpdateArgumentsの使用方法

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

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

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

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

- 19.1.1.1 同時実行性

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

- 19.1.1.3 データ型

- 19.1.1.4 外部キー

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

- 19.1.1.6 認証

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

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

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

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

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

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

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

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

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

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

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

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

- 20.3 MAFアプリケーションでのリモートURLのホワイトリストへの追加

- 20.3.1 AndroidプラットフォームでリモートURLをホワイトリストに追加する方法

- 20.3.2 iOSプラットフォームでリモートURLをホワイトリストに追加する方法

- 20.3.3 ユニバーサルWindowsプラットフォームでリモートURLをホワイトリストに追加する方法

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

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

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

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 MAFアーティファクトでのAppXrayの使用

- 23.1 MAFアーティファクトでのAppXray使用の概要

- 23.2 AppXrayの使用

- 23.2.1 AppXaminerのオープン方法

- 23.2.1.1 AppXaminerについて

- 23.2.2 AppXaminerの使用

- 23.3 AppXrayによるリファクタリング

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 MAFアプリケーションでのデータのキャッシュ

- 25.1 MAFアプリケーションでのデータ・キャッシュの概要

- 25.2 MAFアプリケーションでのデータ・キャッシュの有効化

- 25.3 sync-config.xmlファイルでのキャッシュ・リソースおよびキャッシュ・ポリシーの指定

- 25.4 MAFで提供されるキャッシュ・ポリシー

- 25.5 sync-config.xmlファイルでの構成サービス・エンド・ポイントの使用

- 25.6 MAFアプリケーションでのキャッシュ・データの暗号化

- 25.7 FARでのsync-config.xmlファイルのパッケージ化

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

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

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

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

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

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

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

- 27.2 デプロイメント構成の使用

- 27.2.1 デプロイメント構成について

- 27.2.2 構成の実行とデバッグの相違点

- 27.2.3 デプロイメント構成の作成方法

- 27.2.4 デプロイメント構成の作成時の処理

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

- 27.3.1 Androidデプロイメント構成の作成方法

- 27.3.1.1 詳細オプションの設定

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

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

- 27.3.1.4 資格証明の保存に関する必知事項

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

- 27.3.1.6 OEPEがAndroidアプリケーションにイメージをデプロイした場合の処理

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

- 27.3.3 アプリケーションをAPKファイルとしてローカルにデプロイする方法

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

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

- 27.3.6 .apkファイルを作成する場合のOEPEでの処理

- 27.3.7 最近使用されたデプロイメント構成の選択

- 27.3.8 コンソールでのデバイス/エミュレータ・ログインの表示

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

- 27.4.1 iOSデプロイメント構成の作成方法

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

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

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

- 27.4.5 iOSアプリケーションでのイメージの使用

- 27.4.5.1 構成でのデフォルトのOracleイメージのオーバーライド

- 27.4.5.2 デフォルト・イメージの置換

- 27.4.5.3 カスタム・イメージの追加

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

- 27.4.6.1 クイック・デプロイの使用

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

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

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

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

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

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

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

- 27.5 ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ

- 27.5.1 ユニバーサルWindowsプラットフォームのデプロイメント構成の作成方法

- 27.5.2 Windowsプラットフォームの署名オプションの定義

- 27.5.3 ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ方法

- 27.5.4 ユニバーサルWindowsプラットフォームにMAFアプリケーションをデプロイする場合の処理

- 27.5.5 アプリケーションをパッケージとしてローカルにデプロイする方法

- 27.5.6 パッケージとしてローカルにデプロイする場合の処理

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

- 27.6.1 モバイル機能アーカイブ・ファイルの作成方法

- 27.6.2 機能アーカイブのデプロイ方法

- 27.6.3 機能アーカイブ・ファイルを作成する場合の処理

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

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

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

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

- 27.8.2 MAFアプリケーション・アーカイブ・ファイルをインポートする場合の処理

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

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

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

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

- 28.8 信頼できない入力に対するセキュリティ決定

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

- 28.10 バイナリ保護の欠如による機密情報の漏えい

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

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

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

- 29.3 モバイル・アプリケーションの認証プロセスの概要

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

- 29.5 MAF接続の構成

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

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

- 29.5.3 基本認証の構成方法

- 29.5.4 OAuth認証の構成方法

- 29.5.5 Web SSO認証の構成方法

- 29.5.6 実行時の名前付き接続の接続属性の更新方法

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

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

- 29.5.9 マルチテナント対応接続を作成する場合の処理

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

- 29.5.11 ログイン接続およびコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項

- 29.5.12 ローカル接続およびハイブリッド・ログイン接続のための複数IDに関する必知事項

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

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

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

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

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

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

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

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

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

- 29.6 モバイル・アプリケーションのセキュリティの構成

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

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

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

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

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

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

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

- 29.6.6 アプリケーション機能用にセキュリティを構成する場合のOEPEでの処理

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

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

- 29.9 MAF認証APIの使用

- 29.10 SSL用の自己署名証明書を使用するサーバーにアクセスするための証明書の作成

- 29.11 認証に双方向SSLを有効にするためのMAFアプリケーションの構成

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

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

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

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

- 30.3 コードをデバッグするためのOEPEおよびMAFアプリケーションの構成

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

- 30.3.1.1 デバッグ構成の作成と構成

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

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

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

- 30.4 AndroidプラットフォームにデプロイされたMAFアプリケーションのデバッグ

- 30.4.1 AndroidプラットフォームでのJavaコードのデバッグ方法

- 30.4.1.1 adbのトラブルシューティング

- 30.4.2 AndroidプラットフォームでのUIコードのデバッグ方法

- 30.5 iOSプラットフォームにデプロイされたMAFアプリケーションのデバッグ

- 30.5.1 iOSプラットフォームでのJavaコードのデバッグ方法

- 30.5.2 iOSプラットフォームでのUIコードのデバッグ方法

- 30.6 MAFアプリケーションでのロギングの使用および構成

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

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

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

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

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

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

- 30.7 MAFアプリケーションのパフォーマンスの測定

- 30.8 Oracle Mobile Cloud Serviceへの診断情報の送信

- 30.9 Oracle Mobile Cloud Serviceへの分析情報の送信

- 30.9.1 Oracle Mobile Cloud Serviceへの分析の転送を構成する方法

- 30.9.2 Oracle Mobile Cloud Serviceにプログラムで分析を送信する方法

- 30.9.3 Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法

- 30.9.4 他のリポジトリに分析を送信する方法

- 30.9.5 分析情報を取得するMAFフレームワーク・イベント

A MAFアプリケーションのトラブルシューティング

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

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

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 ビュー・プロジェクト・リソースについて

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

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

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

- D.2.1 maf_preferences.xml

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

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

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

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

- D.2.2 arrays.xml

- D.2.3 Strings.xml

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

- D.4 Windows用のプリファレンスの変換

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

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

はじめに

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

対象読者

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

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

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

Oracle Supportへのアクセス

サポートをご購入のOracleのお客様は、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 Enterprise Pack Oracle Enterprise Pack for Eclipseのインストール

- Oracle Enterprise Pack for Eclipseのユーザーズ・ガイド

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

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

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

表記規則

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

規則

意味

太字

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

イタリック体

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

固定幅フォント

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

このガイドでのMAFリリース2.3.0の新機能

次のトピックはOracle Mobile Application Development Framework (Oracle MAF)の新機能と変更された機能、およびこのガイドで説明されているその他の重要な変更点について概要を示しています。

MAFリリース2.3.0の新機能と変更された機能

Oracle MAFリリース2.3.0には、このガイドで説明されている次の新規および変更された開発機能が含まれています。

- ユニバーサルWindowsプラットフォーム(UWP)へのMAFアプリケーションのデプロイメントのサポート。詳細は、次を参照してください。

- Oracle Enterprise Pack Oracle Enterprise Pack for EclipseのインストールのユニバーサルWindowsプラットフォームのアプリケーションを開発するための必要事項に関する項。

- Oracle Enterprise Pack Oracle Enterprise Pack for EclipseのインストールのユニバーサルWindowsプラットフォームの開発ツールの設定に関する項。

- アプリケーションをローカル・マシン、またはサポートされているUWPデバイス上へのアプリケーションのインストールに使用するインストール・パッケージにデプロイします。詳細は、第27.5項「ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ」を参照してください。

- このリリースのMAFでは、新しいバージョンのCordova (4.x)を使用します。MAFアプリケーション・エディタの「プラグイン」ページは、MAFがサポートする各プラットフォームについてMAFで使用するCordovaのバージョンを表示するように強化されています。詳細は、第9章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

- このリリースを使用して作成したMAFアプリケーションのデフォルトである、新しいバージョンのmobileAltaスキン(mobileAlta-1.5)。詳細は、第7章「MAFアプリケーションのスキニング」を参照してください。

- RestServiceAdapter。新しいファクトリ・クラス(RestServiceAdapterFactory)が、REST Webサービス・アダプタを作成するために導入されました。RestServiceAdapterFactory.createRestServiceAdapter() APIを使用して、REST Webサービス・アダプタを作成します。RestServiceAdapterインタフェースでは、新しいパッケージの場所(oracle.maf.api.dc.ws.rest)が使用されています。このインタフェースで指定される機能は変わりません。REST Webサービス・アダプタの作成の詳細は、第15.2項「WebサービスにアクセスするためのRESTサービス・アダプタの作成」を参照してください。

- データ視覚化コンポーネント

- areaChartまたはbarChartコンポーネントを使用してレンダリングできる新しいチャート(レンジ)。詳細は、第12.5.3項「レンジ・チャートの作成方法」を参照してください。

- iOS 9を使用するデバイスにアプリケーションをデプロイする場合、geographicMapコンポーネントでOracleマップをレンダリングするには、コンポーネントでHTTPSを使用するよう、アプリケーションのadf-config.xmlファイルにエントリを構成する必要があります。詳細は、第12.5.24.1項「地理プロバイダ情報を指定した地理マップ・コンポーネントの構成」を参照してください。

- このリリースでは、ゲージ・コンポーネントが様々な方法で機能強化されました。たとえば、人間の形、ratingGaugeコンポーネントの垂直方向のサポートに加えて、これらのコンポーネントをカスタマイズするその他の属性の範囲が導入されました。詳細は、付録E「サンプルのMAFアプリケーション」のCompGalleryサンプル・アプリケーションにおけるゲージ・コンポーネントの実装に関する説明、Oracle Mobile Application Frameworkタグ・リファレンスおよび第12.5.22項「評価ゲージの作成方法」を参照してください。

- アプリケーションのlogging.propertiesファイル内のプロパティは、アプリケーションのパフォーマンスをモニターするように構成できます。MAFには、このタスクを行う場合に役立つAPIも多数用意されています。詳細は、第30.7項「MAFアプリケーションのパフォーマンスの測定」を参照してください。

- MAFアプリケーションは、診断情報および分析情報をOracle Mobile Cloud Serviceに送信して、このサービスによる分析を受けることができます。

- MAFがこの目的のために導入したアダプタ(McsRestServiceAdapter)を使用して、診断情報(デバイスID、セッションIDおよびリクエスト時間)をMobile Cloud Serviceに送信します。詳細は、第30.8項「Oracle Mobile Cloud Serviceへの診断情報の送信」を参照してください。

- logging.propertiesファイルを構成して、またはMAFがこの目的のために導入したAPIを使用して、分析情報を送信します。詳細は、第30.9項「Oracle Mobile Cloud Serviceへの分析情報の送信」を参照してください。

- MAFには、認証関連のタスクを行う場合に役立つ新しいAPIが多数用意されています。詳細は、第29.9項「MAF認証APIの使用」を参照してください。

- エンド・ユーザーは、デジタル証明書(クライアント証明書)をMAFアプリケーションのキーストアに自動的にインストールして、クライアント証明書を必要とするサーバーで認証用の双方向SSLセッションを確立できるようになりました。クライアント証明書の自動インストールが有効となるようにMAFアプリケーションを構成する方法の詳細は、第29.11項「認証に双方向SSLを有効にするためのMAFアプリケーションの構成」を参照してください。

- AdfmfContainerUtilities.resetApplication() APIは、構成サービスからダウンロードしたすべてのカスタマイズを、アプリケーションを再起動することなく適用できるようになりました。詳細は、Oracle Mobile Application Framework Java APIリファレンスおよび第14章「MAFアプリケーションで使用するエンド・ポイントの構成」を参照してください。

- コンテナ・サービスにアクセスするリモートURLアプリケーション機能用のホワイトリスト作成
MAFアプリケーションにホワイトリストを実装するアプリケーション開発者は、第20.3項「MAFアプリケーションでのリモートURLのホワイトリストへの追加」の説明に従って、Cordovaプラグインを使用できます。

このリリースのMAFでは、以前のリリースでOEPEにより提供されていたデザインタイム・サポートが削除されました。たとえば、「リモートURL Whitelist」入力フィールドは、MAFアプリケーション・エディタから削除されました。AdfmfJavaUtilities.addWhiteList APIの使用は非推奨になりました。

MAFリリース2.3.0に関するこのドキュメントにおけるその他の大きな変更

このドキュメントは、このリリース用に一部が更新されています。次の表に、追加または変更された項を示します。

- Android上のMAFアプリケーションのUIコード(JavaScript、HTMLおよびCSS)をデバッグする方法に関する情報が追加されました。詳細は、第30.4.2項「AndroidプラットフォームでのUIコードのデバッグ方法」を参照してください。

- Mobile-Social認証サーバー・タイプの使用方法を説明する内容が削除されました。この認証サーバー・タイプは、前のリリースのMAFで非推奨になり、現在はサポートされていません。

- SOAP Webサービス・データ・コントロールの使用方法を説明する内容が削除されました。この機能は前のリリースのMAFで非推奨になり、現在はサポートされていません。REST WebサービスとJSONオブジェクトを使用することをお薦めします。詳細は、第15章「MAFアプリケーションでのWebサービスの使用方法」を参照してください。

- MAFがサポートする言語を説明する情報が追加されました。詳細は、第6.7項「MAFでの言語のサポート」を参照してください。

1 Oracle Mobile Application Frameworkの概要

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

この章には次の項が含まれます:

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

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

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

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

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

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

MAFアプリケーションは、ユーザーのデバイスのその他のアプリケーションと同様にデバイスにインストールします。

図1-1 デバイスにインストールされたMAFアプリケーション

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

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

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

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

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

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

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

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

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

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

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

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

- 第15章「MAFアプリケーションでのWebサービスの使用方法」

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

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

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

タスク・フロー: コントローラは、MAFアプリケーションのページ間のフローを制御し、アプリケーションのフローをより小さい再利用可能なタスク・フローに分割でき、メソッド・コールや決定点などの非ビジュアル・コンポーネントを含めることができます。詳細は、第11.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仕様に準拠しています。詳細は、第13章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」を参照してください。

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

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

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

- 資格証明管理、シングル・サインオン(SSO)およびアクセス制御: MAFでは、Oracle Identity ManagementからモバイルセキュリティSDKを使用して、ユーザー認証および資格証明管理を処理します。MAFアプリケーションはオフライン認証を実行するので、接続されているときにユーザーがアプリケーションにログインすると、MAFがユーザー名およびパスワードをデバイスのローカルで管理するため、認証サーバーへの接続が不可になった場合にもユーザーはアプリケーションへのアクセスを継続できます。MAFは、ローカルに保存された情報およびローカルのSQLiteデータベースに保存されたデータを暗号化します。ログイン・サーバーに対する認証後、ユーザーはこの接続によって保護されているすべてのアプリケーション機能にアクセスできるようになります。MAFは、アプリケーション機能(またはアプリケーション機能の特定のファンクション)へのアクセスを制限することによって、アクセス・コントロールの概念もサポートします。

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

ネイティブ・コンテナと相互作用するリソースには次のものがあります。

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

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

デバイス・ネイティブ・コンテナは、次のサーバー側リソースへのアクセスを可能にします。

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

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

- APNSおよびGCMプッシュ・サービス: Apple Push Notification Service (APNS)およびGoogle Cloud Messaging (GCM)は、MAFアプリケーションに通知イベントを送信する通知プロバイダです。プッシュ通知は、ユニバーサルWindowsプラットフォームにデプロイしたMAFアプリケーションではサポートされません。

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

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

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

注意:
アプリケーション開発チームの規模および組織に応じて、一人の人が多くの異なるロールを務める場合があります。

一般的に、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アプリケーションのコンテンツの構成」

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

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

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

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

6. 保護: アプリケーション開発プロセス全体においてセキュリティ・リスクを評価します。モバイル・アプリケーションには独自のセキュリティ懸念事項があり、リモートで提供されるデータにアクセスするアプリケーションと同じ脆弱性を共有します。クライアント側のセキュリティを確保するため、MAFは次のような機能を提供します。

- 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アプリケーションを公開すると、エンド・ユーザーは自分のモバイル・デバイスにダウンロードしたり、指定されたアイコンをタッチしてアクセスできるようになります。アプリケーション機能は指定された表示アイコンで表され、エンド・ユーザーやユーザーのデバイスに適した表示が行われます。

1.3.1 接続アプリケーションおよび非接続アプリケーションについて

MAFはネットワークに接続された状態で機能できますが、携帯信号がない場合のように切断モードでも機能できます。これには次のような例があります。

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

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

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

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

MAFでは、様々なユースケースを実装するサンプル・アプリケーションを幅広く提供しています。これらのサンプル・アプリケーションをOEPEで開き、ソースコードを参照したり、デバイスまたはエミュレータ/シミュレータにデプロイして実行時の動作を確認できます。デバイス・ネイティブ機能へのアクセス、ローカル・データベースでの操作の実行、ジェスチャーの実装といった様々なMAFアプリケーションの機能の実装方法を示すサンプル・アプリケーションが存在します。

HelloWorldサンプル・アプリケーションは、ローカルHTMLファイルを使用して単一のアプリケーション機能を実装する方法を示します。HelloWorldアプリケーションを使用して、アプリケーションをコンパイルおよびデプロイするために開発環境が正しく設定されていることを確認することをお薦めします。

初心者向けに役立つその他のサンプル・アプリケーションには、次のようなものがあります。

- CompGallery (コンポーネント・ギャラリ)は、これらのコンポーネントのすべてを示すことによって、MAF AMX UIコンポーネントを紹介する役割を果たします。このアプリケーションをデバイスまたはエミュレータ/シミュレータで使用して、コンポーネントの属性を変更し、変更の影響をリアルタイムで確認できます。

- WorkBetterサンプル・アプリケーション(図1-3を参照)は、MAF AMX UI機能を示します。また、プログラム的にRESTサービスにアクセスする方法も示します。

開発環境を設定した後(Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールを参照)、サンプルのMAFアプリケーションを開くことができます。ほとんどの場合、アプリケーションのディレクトリの名前がアプリケーションの目的をよく表しています。たとえば、SkinningDemoディレクトリにあるアプリケーションは、MAFアプリケーションのスキンを変更する方法を示します。

MAFサンプルのリストを確認して、1つ以上のサンプルを選択し、次のように開きます。

1. OEPEで、Oracle MAFパースペクティブを選択します。

2. 「ファイル」→「新規」→MAFサンプルを選択して、MAFサンプル・ダイアログを開きます。

3. サンプル・アプリケーションの説明を表示するには、該当サンプル・アプリケーションを強調表示します。
サンプル・アプリケーションを開くには、チェック・ボックスを選択して、「終了」をクリックします。

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

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

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

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

この章には次の項が含まれます:

- 第2.1項「MAF開発環境の概要」

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

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

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

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

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

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

2.1 MAFの開発環境の概要

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

図2-1は、OEPEのMAFアプリケーション・エディタにWorkBetterサンプル・アプリケーションを表示したもので、ここにはMAFアプリケーションの開発に使用される様々なアイテムが含まれます。

1. MAFアプリケーション・エディタ(アセンブリ・プロジェクトから起動)は、MAFアプリケーションの名前、アプリケーションにレンダリングされるデフォルトのナビゲーション・メニュー(ナビゲーション・バーまたはSpringboard)、セキュリティ、およびアプリケーションのデバイス・アクセス・オプションを指定する場合に使用します。

2. MAF機能エディタ(ビュー・プロジェクトから起動)では、MAFアプリケーションに含まれるアプリケーション機能を定義します。

3. デフォルトでは、OEPEにより、アプリケーション・プロジェクトapplicationApplicationとビュー・プロジェクトapplicationView内に1つずつ存在する2つのデータ・コントロールを含む、MAFアプリケーションが作成されます。これらのデータ・コントロールでは、MAF AMXページにドラッグ可能な操作を公開し、ユーザーがその操作をページにドロップすると、操作の構成を実行するためのコンテキスト・メニューがOEPEによって表示されます。たとえば、hideNavigationBar()操作をページにドラッグすると、エンド・ユーザーがアプリケーションのナビゲーション・バーを非表示にするコントロールを構成するためのコンテキスト・メニューが、OEPEによって表示されます。

WorkBetterサンプル・アプリケーションは、MAFに用意されている様々なサンプル・アプリケーションの1つで、MAFを使用したモバイル・アプリケーションの作成方法を示します。詳細は、第1.4項「サンプルのMAFアプリケーション」を参照してください。

OEPEによってウィザードにデフォルト・オプションが提示されるので、次のように実行すると、1つのMAF AMXページを表示する、1つのアプリケーション機能を備えたMAFアプリケーションを作成できます。

1. 第2.3項「MAFアプリケーションの作成」の説明に従って、MAFアプリケーションを作成します。

2. 第2.4項「MAFアプリケーションのアプリケーション機能の定義」の説明に従って、MAFアプリケーションのアプリケーション機能を定義し、コンテンツを追加します。

3. 第2.5項「アプリケーション機能へのコンテンツの追加」の説明に従って、アプリケーション機能にコンテンツを追加します。

図2-1 MAFアプリケーション・エディタ

OEPEのMAF機能エディタおよびMAFアプリケーション・エディタは、作成中にMAFアプリケーションとやり取りするために使用する主要なツールです。これらの2つのエディタは相互作用し、また、編集中の選択に影響するかもしれない方法で、開発しているアプリケーションを構成しているファイルと相互作用します。

図2-1に示すように、MAFアプリケーション・エディタはプロジェクト・エクスプローラのアプリケーションおよび「MAF」ノードの下にあります。これにより、maf-application.xmlファイルを編集します。

MAF機能エディタは、エクスプローラのビュー・プロジェクトおよびMAFノードの下にあります。これにより、maf-feature.xmlファイルを編集します。

2.1.1 MAFアプリケーション・エディタについて

MAFアプリケーション・エディタでは、maf-application.xmlファイルを構成して、表示名と一意のアプリケーションID (名前の競合を防ぐ)を指定し、アプリケーションのSpringboard (スマートフォンのホームページに相当)に表示するアプリケーション機能を選択することで、モバイル・アプリケーションの基本構成を設定できます。さらに、このエディタでは、モバイル・アプリケーションのユーザー・プリファレンス・ページも作成できます。エディタについては、第2.3項「MAFアプリケーションの作成」を参照してください。

図2-2 モバイル・アプリケーションのスプリングボードに表示されるアプリケーション機能

これらの要素は、MAFアプリケーション・エディタを使用して宣言的に変更するか(図2-3を参照)、XMLエディタまたはソース・エディタを使用して手動で変更できます。これらのアプローチは、いずれも同じように使用できます。

図2-3 maf-application.xmlファイルのMAFアプリケーション・エディタ

2.1.2 MAF機能エディタについて

MAF機能エディタでは、アプリケーションに機能を追加できます。このエディタを使用して機能を作成し、その特性(ID、名前、説明、ベンダー情報、バージョン、ライフサイクル・イベント・リスナー、セキュリティ、ナビゲーションおよびspringboard用のイメージ)を指定します。

2.2 Oracle MAFパースペクティブの使用

Eclipseのパースペクティブとは、特定のタイプの開発に適した特定のレイアウトで配置されるビューのコレクションです。MAFには、MAFアプリケーションを開発する際に使用する必要がある独自のパースペクティブがあります。それによって、このマニュアルの他の場所で説明するメニューおよびツールバーのオプションへのアクセスが可能になります。

Oracle MAFパースペクティブを変更するには:

1. IDEで、「ウィンドウ」→「パースペクティブを開く」→「その他」をクリックします。
または、をクリックします。

2. パースペクティブを開くダイアログ・ボックスで、「Oracle MAF」を選択します。「OK」をクリックします。

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

OEPEの作成ウィザードを使用して、MAFアプリケーションを作成します。

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

アプリケーションの作成ウィザードを使用して、OEPEでMAFアプリケーションを作成します。

MAFアプリケーションの作成手順:

1. メイン・メニューで「ファイル」→「新規」を選択し、次にMAFアプリケーションを選択します。

2. MAFアプリケーション・ウィザードで、名前やデプロイメント・ターゲットなどのアプリケーションの詳細を入力します。

3. 「終了」をクリックします。

2.3.2 MAFアプリケーションを作成する場合の処理

OEPEにより、図2-4に示すように、3つのプロジェクトおよび(アプリケーション機能用とデバイス機能用の) 2つのデータ・コントロールを含むMAFアプリケーションが作成されます。また、MAFアプリケーションの構成用ファイルと、MAFアプリケーションをAndroidまたはiOSプラットフォームにデプロイする際にそのアプリケーションで必要になるファイルも作成されます。

MAFアプリケーションの作成時にOEPEによって生成されるファイルおよびアーティファクトの詳細は、付録C「MAFアプリケーションとプロジェクト・ファイル」を参照してください。

図2-4 生成されたMAFアプリケーション・アーティファクト

注意:
MAFアプリケーションの作成時にエラー・ログを開くと、次のようなメッセージが記録されています。

org.eclipse.core.runtime.CoreException: Illegal install location
D:\p4\depots\OEPE\tools-eclipse\annex\maf-2.1\install for vmInstall
oracle.eclipse.tools.maf.JVMCDCv201 contributed by
oracle.eclipse.tools.maf.dt.v201: Associated MAF runtime is not installed.

OEPEによるMAFのリリースごとに1つのエントリが存在します。これらは無視しても問題ありません。

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

MAFアプリケーションには、少なくとも1つのアプリケーション機能が必要です。たとえば、WorkBetterサンプル・アプリケーションには4つのアプリケーション機能(ダッシュボード、人々、組織およびSpringboard)が含まれています。図2-5は、これらのうち3つのアプリケーション機能が、そのアプリケーションのカスタム・スプリングボードに表示されている様子を示しています。

図2-5 WorkBetterアプリケーションのSpringboardに表示されるアプリケーション機能

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

MAFアプリケーション・エディタを使用して、MAFアプリケーションのアプリケーション機能を定義します。

MAFアプリケーションのアプリケーション機能を定義する手順:

1. プロジェクト・エクスプローラで、ビュー・プロジェクトapplicationViewおよびMAFを展開し、MAF機能エディタをダブルクリックします。

2. モバイル機能ページで「追加」アイコンをクリックします。

3. 「新規オブジェクト」ダイアログで「機能」を選択し、
次のように、「新規オブジェクト」ダイアログにエントリを入力します。

- 新規オブジェクトのタイプ: 機能

- 機能ID: アプリケーション機能の一意のIDを入力するか、OEPEによって生成される値をそのまま使用します。

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

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

アプリケーション機能を定義した後で行うタスクの1つに、アプリケーション機能へのコンテンツの追加があります。エディタの「アウトライン」セクションで、機能の新規ノードを展開し、「追加」アイコンをクリックします。新規機能のタイプを選択して、必要な情報を入力します。

- MAF AMXページ: アプリケーション機能をMAF AMXページとしてレンダリングする場合は、このコンテンツ・タイプを選択します。

- MAFタスク・フロー: アプリケーション機能を、タスク・フローを構成するアクティビティのコレクションとしてレンダリングする場合は、このコンテンツ・タイプを選択します。タスク・フローに含めることのできるアクティビティには、ビュー(MAF AMXページの表示)、メソッド・コール(マネージドBeanのメソッドの起動)、タスク・フロー・コール(別のタスク・フローのコール)などがあります。

- ローカルHTML: アプリケーション機能をHTMLページとしてレンダリングする場合に選択します。

- リモートURL: アプリケーション機能をリモートURLからのコンテンツでレンダリングする場合に選択します。

アプリケーション機能にコンテンツ・タイプを追加する一般的な手順は、すべてのコンテンツ・タイプで同じです。具体的には、maf-features.xmlファイルの概要エディタにある「機能」ページの「コンテンツ」タブで、アプリケーション機能に追加するコンテンツのタイプを選択します。各コンテンツ・タイプに固有の手順については、第5章「MAFアプリケーション機能のコンテンツ・タイプの定義」を参照してください。

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

アプリケーション機能は、MAF機能エディタを使用してこれらの機能を作成すると、MAFアプリケーションに自動的に追加されます。

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

アプリケーション内の機能を使用するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトapplicationおよびMAFを展開して、MAFアプリケーション・エディタをダブルクリックします。

2. 「アウトライン」で、登録された機能を選択します。

3. 登録された機能ペインでは、アプリケーションに関連付けられている機能を表示できます。

アプリケーションでの動作を定義する機能を選択します。たとえば、その機能をナビゲーション・バーまたはスプリングボードで使用できるようにすることを指定できます。

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

MAFアプリケーションに追加するアプリケーション機能を参照するためのエントリが、OEPEによって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アプリケーション全体を通して一意である必要があります。

次の例は、WorkBetterサンプル・アプリケーションのmaf-application.xmlファイルとmaf-feature.xmlファイルに含まれている人々アプリケーション機能のエントリを示しています。

<!-- 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.7 MAF AMXページおよびMAFタスク・フローの作成

第11章「MAF AMXページの作成」に示すように、MAF AMXコンポーネントを使用すると、プラットフォーム固有の言語で作成されたページとまったく同じように実行されるページを構築できます。MAF AMXページでは、コンポーネントのリッチなセットを使用してユーザー・インタフェースを宣言的に作成できます。図2-6は、MAF AMXページの宣言的な開発を示しており、ここでは「パレット」のオプションを選択して、それらをMAF AMXページに追加しています。

図2-6 MAF AMXページの作成

これらのページは、(MAFアプリケーションを作成し、その中にアプリケーション機能を埋め込む)アプリケーション・アセンブラによって作成される場合もあります。または、別の開発者によって作成され、アプリケーション機能またはMAFアプリケーションに対するリソースとして、MAFアプリケーションに組み込まれる場合もあります。

MAF AMXページを作成するプロジェクトによって、このページが単一のアプリケーション機能のユーザー・インタフェース・コンテンツ配信に使用されるのか、またはMAFアプリケーション全体に対するリソースとして使用されるのかが決まります。たとえば、図2-7に示すような、アプリケーション・コントローラ・プロジェクト内で作成されたページは、アプリケーション全体のリソースとして使用されます。

ヒント:
ページの管理を容易にするために、これをページ・フラグメントとして知られる再利用可能なセグメントに分割できます。MAF AMXページは、1つ以上のページ・フラグメントで構成できます。

MAFでは、MAFタスク・フローによりMAF AMXビュー・ページおよび他のアクティビティを適切な順序に配置できます。図11-0に示すように、MAFタスク・フローは、アプリケーションのフローの視覚的な表現です。これは、MAF AMXで作成された(図2-8に、WorkBetterサンプル・アプリケーションのデフォルトのListページおよびDetailページなどのビュー・アクティビティとして示される)ユーザー・インタフェース・ページと、マネージドBeanのメソッドを呼び出すことができる非ビジュアル・アクティビティで構成できます。タスク・フローの非ビジュアル的な要素は、EL式の評価または別のタスク・フローの呼出しに使用できます。図2-8で示されるように、MAFではタスク・フロー・コンポーネントをダイアグラマにドラッグしてタスク・フローを宣言的に作成できます。MAFには、WorkBetterサンプル・アプリケーションのListページなどの単一のエントリ・ポイントを持つバインド・タスク・フローと、アプリケーション・フローへの複数のエントリ・ポイントを持つバインドなしタスク・フローの2つのタイプのタスク・フローがあります。WorkBetterサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

図2-7 MAFタスク・フロー

MAFには、MAFページ、MAFページ・フラグメントと呼ばれるMAF AMXページの再利用可能な部分、およびアプリケーション機能を追加する多くのダイアログおよびウィザードがあります。図2-8は、「ファイル」メニューから使用できるメニュー・オプションを示しています。

図2-8 アプリケーション機能のリソースを作成するオプション

他のオプションは、「ファイル」→「新」→「その他」(図2-9を参照)にあります。「新」ダイアログで、「Oracle」を展開し、次に「モバイル・アプリケーション・フレームワーク」を展開します。

図2-9 アプリケーション機能のリソースを作成するウィザード

2.7.1 MAF AMXページの作成方法

「MAFページ」ダイアログを使用して、アプリケーション機能のユーザー・インタフェースまたはMAFアプリケーションを構成するMAF機能で共有できるアプリケーション・レベル・リソース(ログイン・ページなど)に使用されるAMXページを作成できます。アプリケーション機能のコンテンツの詳細は、第5.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」を参照してください。

アプリケーション機能のコンテンツとしてMAF AMXページを作成するには:

1. 「ファイル」→「新」を選択し、次に「MAFページ」を選択します。

2. 図2-10に示される「新規MAFページ」ダイアログに、たとえばViewContentなどの親フォルダを選択し、「ファイル名」フィールドに名前を入力します。

図2-10 アプリケーション・コントローラ・プロジェクト内でのMAF AMXページの作成

3. プライマリおよびセカンダリのヘッダーおよびフッターに使用される「ページ・ファセット」を選択(選択解除)します。「OK」をクリックします。
詳細は、第12.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

4. 「終了」をクリックします。AMXコンポーネントの使用の詳細は、第11.3.1.2項「MAF AMXページの作成」を参照してください。また、第5.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」も参照してください。

MAFアプリケーションに対するリソースとしてMAF AMXページを作成するには:

1. 「ファイル」→「新」を選択し、次に「MAFページ」を選択します。

2. 「ファイル名」フィールドに名前を入力して、「MAF AMXページの作成」ダイアログの入力を完了します(図2-10を参照)。「ディレクトリ」フィールドに、ファイルの場所を入力します。この場所は、アプリケーション・コントローラ・プロジェクトのpublic_htmlフォルダ内である必要があります。「OK」をクリックします。

3. MAF AMXページを構築します。詳細は、第11.3.1.2項「MAF AMXページの作成」を参照してください。

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

アプリケーション機能のコンテンツをMAFタスク・フローとして配信できます。

アプリケーション機能のコンテンツとしてMAFタスク・フローを作成するには:

1. 「ファイル」→「新」→「その他」を選択します。

2. 「新」ダイアログで、「Oracle」を展開し、次に「モバイル・アプリケーション・フレームワーク」を展開します。「MAFタスク・フロー」を選択し、「次へ」をクリックします。

3. 「ファイル名」フィールドに名前を入力して、「新規のMAFタスク・フロー」ダイアログの入力を完了します(図2-11を参照)。「OK」をクリックします。

図2-11 ビュー・コントローラ・プロジェクト内でのMAFタスク・フローの作成

4. 「終了」をクリックして、タスク・フローを構築します。第11.2.3項「タスク・フロー・ファイル」も参照してください。

2.7.3 MAF AMXページおよびタスク・フロー作成時の処理

OEPEは、MAF AMXページおよびタスク・フローを、図2-12のようにビュー・プロジェクトのViewContentノードにemployeeList.amxおよびemp-task-flow-definition.xmlとして配置します。これらのアーティファクトはmaf-feature.xmlファイル内で参照されています。

タスク・フローは、ビュー・プロジェクトの「MAF」ノードにもリストされます。

カスタマイズされたアプリケーション・スプラッシュ画面(または起動)イメージやナビゲーション・バー・イメージなどの他のリソースもViewContentノードにあります。

バインドなしタスク・フローを管理するために、OEPEではadfc-mobile-config.xmlファイルが生成されます。このファイルを使用して、ビュー(ユーザー・インタフェース・ページ)、様々なアクティビティ間の遷移を定義する制御ルール、およびタスク・フローのレンダリング・ロジックを管理するマネージドBeanなどの様々なタスク・フロー・コンポーネントを追加することで、タスク・フローを宣言的に作成または更新できます。

図2-12 ビュー・プロジェクト内のMAF AMXページおよびタスク・フロー

OEPEは、MAF AMXページとタスク・フローを、モバイル・アプリケーションに対するアプリケーション・リソースとして、アプリケーション・コントローラ・プロジェクトのViewContentノードに配置します。図2-12に示すように、MAF AMXページ用のファイルはapplication_resource.amxという名前で、タスク・フローのファイルはApplicationController-task-flow.xmlという名前です(デフォルト名)。

2.8 エンタープライズ配布のためのMAFアプリケーションのコンテナ化

デプロイメント時に、エンタープライズ・モバイル・アプリケーション管理機能を利用できるように、MAFアプリケーションをOMSS (Oracle Mobile Security Suite)でラップするように選択できます。OMSSにより、優れたユーザー操作性を維持しながら、企業のアプリケーションとデータにモバイル・デバイスから安全にアクセスできます。そのMobile Security Containerでは、企業または個人が所有しているiOSまたはAndroidデバイス上で、エンタープライズ・ワークスペースを作成します。従業員は、企業向けのセキュリティおよびシングル・サインオン認証により、企業データおよびアプリケーションにシームレスにアクセスできます。

Mobile Security Appコンテナ化ツールを使用すると、標準化されたセキュリティ・レイヤーをネイティブ・モバイル・アプリケーションに追加できます。コンテナ化プロセスはシンプルで、次のセキュリティ・サービスをアプリケーションに追加します。

- セキュアなデータ転送: エンタープライズ・ファイアウォールの背後にあるアプリケーション・バックエンド・リソースへのモバイル・セキュリティ・アクセス・サーバーを介した暗号化済AppTunnel。

- 認証: Secure Workspaceアプリケーションによって管理され、セキュア・ワークスペースのアプリケーション間でシングル・サインオンが提供されます。

- セキュアなデータ記憶域: ファイル、データベース、アプリケーション・キャッシュおよびユーザー・プリファレンスなどのアプリケーション・データの暗号化済記憶域。

- データ・リークの制御: 他の信頼できるアプリケーションに対してファイル共有とコピーおよび貼付けを制限する機能。これにより、電子メール、メッセージ送信、出力および保存などのデータ共有を制限できます。

- 動的ポリシー・エンジン: 認証頻度、ジオフェンスとタイム・フェンスおよびリモート・ロックとワイプなどの50を超える詳細なアプリケーション制御。

MAFアプリケーション・サービスへのOMSSシングル・サインオン認証およびユーザー・アイデンティティ伝播は、ログイン接続にSSO認証サーバー・タイプを使用するように構成されたアプリケーションに対してのみサポートされます。HTTP基本認証およびOAuth認証を使用するアプリケーションでは、コンテナ認証が成功した後にMAFアプリケーションにログインする必要があります。これらの認証タイプおよびこれらがOMSSで果す役割の詳細は、第29.5.11項「ログイン接続およびコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項」を参照してください。

コンテナ化プロセスは単純で、MAFアプリケーションを開発する方法は変更されません。実際は、コンテナ化に注意して、アプリケーション・コードを具体的に変更しないでください。MAFアプリケーションは、OMSSコンテナ化を有効にしてデプロイするかどうかに関係なく、同じ方法で開発します。

OMSSコンテナ化を有効にしてアプリケーションをデプロイすると、OEPEは、OMSSによって提供されるMobile Security Appコンテナ化ツールを実行して、MAFアプリケーションをコンテナ化します。

デプロイメント後、MAFアプリケーション開発者は、OMSSシステム管理者と連携して、OMSSモバイル・アプリケーション・カタログに追加されたアプリケーションを取得し、適切なポリシーを構成します。詳細は、『Oracle Mobile Security Suiteの管理』の「モバイル・アプリケーションの管理」を参照してください。

コンテナ化されたMAFアプリケーションをユーザーが起動すると、Secure WorkspaceアプリケーションはMobile Security Containerにリダイレクトし、セッションがMAFアプリケーションに戻される前に、SSO認証を実行します。コンテナ化されたMAFアプリケーションでは、内部Webサイトまたはサービスとの接続にVPNは不要です。かわりに、アプリケーションとMobile Security Access Server (MSAS)間でセキュアAppTunnelが確立され、モバイル・デバイス・ユーザーによるアクセス用に登録された、内部サイトおよびサービスにアクセスするためのセキュアなトランスポートが提供されます。

OMSSコンテナ化によるMAFアプリケーションへの影響の詳細は、次の各項を参照してください。

- OMSSのMAFアプリケーションをコンテナ化するためのOEPE手順は、第27.9項「Oracle Mobile Security Suiteでのデプロイ」を参照してください。

- コンテナ化されたMAFアプリケーションによる企業ファイアウォールの背後にあるセキュアなWebサービスへのアクセスの詳細は、第15.3.3項「Webサービスおよびコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項」を参照してください。

- コンテナ化されたMAFアプリケーションの認証プロセスの詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

モバイル・デバイスおよびワークスペース・コンテナに関連するOMSS管理タスクの詳細は、OMSSドキュメント・ライブラリの次のリソースのリストを参照してください。

- OMSSの背景情報は、『Oracle Mobile Security Suiteの管理』の「Oracle Mobile Security Suiteの理解」を参照してください。

- MAFアプリケーション・ユーザーのモバイル・デバイスおよびワークスペースを登録するために、システム管理者がOMSS Mobile Security Managerコンソールをどのように使用するかの詳細は、『Oracle Mobile Security Suiteの管理』の「デバイスおよびワークスペースの登録」を参照してください。

- デバイスおよびワークスペースにプロビジョニングされたMAFアプリケーションを管理するために、システム管理者がOMSSモバイル・アプリケーション・カタログをどのように使用するかの詳細は、『Oracle Mobile Security Suiteの管理』の「モバイル・アプリケーションの管理」を参照してください。

- MAFアプリケーション機能によって共有される企業ファイルへのアクセスを管理するために、システム管理者がOMSS Mobile Security Managerコンソールをどのように使用するかの詳細は、『Oracle Mobile Security Suiteの管理』の「モバイル・セキュリティ・ポリシーの管理」を参照してください。

リソースおよび認証の保護に関連するMSAS管理タスクの詳細は、OMSSドキュメント・ライブラリの次のリソースのリストを参照してください。

- MSASの背景情報は、『Oracle Mobile Security Access Serverの管理』の「Mobile Security Access Serverの使用開始」を参照してください。

- MAFアプリケーションによってアクセスされる保護されたリソースの転送プロキシURLを定義するために、システム管理者がプロキシ・アプリケーションをどのように作成するかの詳細は、『Oracle Mobile Security Access Serverの管理』の「Mobile Security Access Serverアプリケーションの管理」を参照してください。

- 事前定義済のセキュリティ・ポリシーをシステム管理者が転送プロキシURLにどのように添付し、保護されているWebサービスへのMAFアプリケーションによるアクセスをどのように保護するかの詳細は、『Oracle Mobile Security Access Serverの管理』の「Mobile Security Access Serverリソースの保護」を参照してください。

- Secure WorkspaceアプリケーションによってMAFアプリケーション・ユーザーのデバイスで認証を処理するために、システム管理者がMSAS認証エンドポイントをどのように構成するかの詳細は、『Oracle Mobile Security Access Serverの管理』の「Mobile Security Access Serverインスタンスの構成」を参照してください。

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

この章では、MAFアプリケーション・エディタとMAF機能エディタを使用してモバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義し、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

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

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

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

- 第3.3項「iOSでのMAFアプリケーションの起動画面の変更」

- 第3.4項「アプリケーション機能の表示プロパティの設定」

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

MAFアプリケーションのエンド・ユーザーに表示される表示情報を構成するには、maf-application.xmlファイルを編集するための宣言的なインタフェースを提供する、MAFアプリケーション・エディタで値を設定します。アプリケーションに関して入力する情報の種類には、表示名、アプリケーションの説明、アプリケーションのバージョン番号などがあります。MAFアプリケーションに含めたり、他のMAFアプリケーションで使用するために配布したりする個々のアプリケーション機能には、同じような情報を入力できます。また、MAFアプリケーションのナビゲーション・バーやSpringboardへのレンダリング時にアプリケーション機能によって表示されるアイコンを指定することもできます。

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

図3-1は、MAFアプリケーション・エディタを示したもので、ここでMAFアプリケーションの表示名およびアプリケーションIDを設定します。

始める前に:

MAFアプリケーション・エディタ(図3-1に示すように「プロジェクト・エクスプローラ」パネル内のアセンブリ・プロジェクトのMAFノードにあります)をダブルクリックして、MAFアプリケーション・エディタを開きます。

図3-1 プロジェクト・エクスプローラでのMAFアプリケーション・エディタの選択

モバイル・アプリケーションの基本情報を設定するには:

1. 「アウトライン」でアプリケーションの名前を選択して、「アプリケーション」ページを選択します。

注意:
エディタでは、デフォルトで「アプリケーション」ページが開きます。

図3-2は、「アプリケーション」ページの基本情報を定義する部分を示しています。

図3-2 モバイル・アプリケーションの基本情報の設定

2. 「名前」フィールドに、アプリケーションの表示名を入力します。この属性はローカライズ可能です。詳細は、第6.1項「MAFアプリケーションのローカライズの概要」を参照してください。

注意:
MAFでは、このフィールドに入力した値をiOSアーカイブ(.ipaまたは.app)ファイルの名前として使用します。このファイルは、iOSデバイスまたはシミュレータにアプリケーションをデプロイすると作成されます。詳細は、第27.4.1項「iOSデプロイメント構成の作成方法」を参照してください。

3. デフォルト値を使用するか、または「ID」フィールドに一意のIDを入力します。
名前の競合を避けるため、AndroidとiOSでは、リバースパッケージ名が使用されます(例: com.company.application)。OEPEによって、アプリケーション名の前には、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.3.1項「Androidデプロイメント構成の作成方法」および第27.4.1項「iOSデプロイメント構成の作成方法」で説明するデプロイメント・プロファイル内でこのIDを上書きできます。

注意:
Androidデバイスまたはエミュレータにアプリケーションが正しくデプロイされるようにするには、IDの先頭を数字やピリオドではなく、文字にする必要があります。たとえば、IDが925090のように(com.company.925090)完全に数値で構成されている場合、アプリケーションはデプロイできません。hello925090などの文字で始まるIDであれば(com.company.hello925090)、デプロイメントは正常に実行できます。

4. 「説明」フィールドに、アプリケーションの目的を説明した、短いけれども詳細な要約を入力します。

5. 「バージョン」フィールドに、バージョンを入力します。

6. 「ベンダー」フィールドに、このアプリケーションを最初に作成したベンダーの名前を入力します。

7. 「ライフサイクル・イベント・リスナー」フィールドで、MAFアプリケーションのライフサイクル・イベントに応じて実行されるコードが記述されたクラスを入力します。新規作成したMAFアプリケーションには、デフォルトでapplication.LifeCycleListenerImplが指定されます。
詳細は、第10章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

デフォルトのアプリケーション・リスナー・クラスは、application.LifeCycleListenerImplです。MAFでは、デフォルトではこのクラスは登録されません。このクラスはJVMを起動するため、各モバイル・アプリケーションには適さない可能性があるからです。かわりに、「クラスの選択」ダイアログ(図3-2を参照)を使用して、手動でこのクラスを登録する必要があります。このダイアログを閉じると、OEPEにより、<adfmf:application>要素がlistener-class属性によって更新されます(listener-class属性を追加する次の例を参照)。

注意:
アプリケーション・ライフサイクル・リスナーは引き続き、アプリケーション・コントローラ・プロジェクト(デフォルトの場所)内に存在している必要があります。

<adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
name="OracleMobileApplication"
id="com.company.OracleMobileApplication"
appControllerFolder="ApplicationController"
listener-class="application.LifeCycleListenerImpl"
version="1.1"
vendor="Oracle">
<adfmf:description>This is a mobile application</adfmf:description>
<adfmf:featureReference id="feature1"/>
</adfmf:application>

詳細は、第10.1項「MAFアプリケーションのライフサイクル・リスナーの概要」を参照してください。

3.3 iOSでのMAFアプリケーションの起動画面の変更

MAFによってHTMLページが用意され、MAFアプリケーションがiOSデバイスで起動する際に起動画面としてエンド・ユーザーに表示されます。

このHTMLページは、MAFアプリケーションが実行するiOSデバイス上でレスポンシブにレンダリングされるように設計されています。つまり、このページは、用意されている画面を使用して、著作権情報やロゴをデバイスに適したサイズで表示します。

かわりの起動画面を定義する場合はカスタムHTMLページを作成できます。これは、MAFアプリケーション・エディタの「ナビゲーション」タブの「起動画面」セクションから行います。作成したHTMLページは、MAFアプリケーションのapplication project/ViewContentディレクトリに保存されます。起動画面として使用するHTMLページを作成した場合、次のXMLエントリがmaf-application.xmlファイルのソースに表示されます。

...
<adfmf:configuration>
<adfmf:launchScreen url="custom-launch-screen.html"/>
</adfmf:configuration>
...

URL属性では、application project/ViewContentディレクトリに対して相対的にパスを定義し、アプリケーションではこのパスを使用して、起動画面として作成したHTMLページを検索します。

iOSデバイス用のデフォルト起動画面としてMAFがレンダリングするHTMLページを確認して、起動画面としてレンダリングされるカスタムHTMLページを作成するヒントを得ることができます。デフォルト起動画面(maf-launch-screen.html)は、最初にMAFアプリケーションをデプロイするために使用するデプロイメント・プロファイルの次のサブディレクトリにあります。

.../FARs/OracleStandardADFmfUiComponents/public_html/

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

各MAFアプリケーションには、少なくとも1つのアプリケーション機能が必要です。アプリケーション機能はそれぞれ別個に(MAFアプリケーション自体からも独立して)開発できます。MAF機能エディタを使用すると、maf-feature.xmlファイルの<adfmf:features>の子要素を定義して、アプリケーション機能ごとに名前とIDを割り当て、コンテンツの実装方法を設定することにより、アプリケーション機能を区別できます。アプリケーション機能の概要エディタを使用すると、MAFアプリケーション内のアプリケーション機能のランタイム表示を制御したり、アプリケーション機能がユーザー認証を必要とするタイミングを指定することもできます。

図3-3は、WorkBetterサンプル・アプリケーションのMAF機能エディタを示しています。このタブを使用して、アプリケーション機能の名前や、Springboardとナビゲーション・バーに表示されるアイコンなどの情報を指定します。

図3-3 MAF機能エディタのアプリケーション機能

4 MAFアプリケーション機能の構成

この章では、アプリケーション機能について紹介し、それをMAFアプリケーションに追加する方法や、アプリケーション機能を構成してスライディング・ウィンドウとしてレンダリングする方法について説明します。

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

- 第4.1項「MAFアプリケーション機能の概要」

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

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

- 第4.4項「スプリングボードにアニメーションを設定する場合の処理」

- 第4.5項「HTMLコンテンツによるカスタム・スプリングボード・アプリケーション機能に関する必知事項」

- 第4.6項「MAF AMXコンテンツによるカスタム・スプリングボード・アプリケーション機能に関する必知事項」

- 第4.7項「スプリングボードの実行時の動作に関する必知事項」

- 第4.8項「Androidの戻るボタンを使用したMAFアプリケーションの移動」

- 第4.9項「MAFアプリケーションでのスライディング・ウィンドウの作成」

- 第4.10項「MAFアプリケーションでのカスタムURLスキームの使用」

4.1 MAFアプリケーション機能の概要

Springboardとナビゲーション・バーの表示動作を次のように制御するよう、MAFアプリケーションを構成できます。

- Springboardとナビゲーション・バーを表示または非表示にすることで、モバイル・デバイスのインタフェースを最適に使用できるようになります。これらのオプションは、ナビゲーション・バーのデフォルトの表示動作をオーバーライドします。ナビゲーション・バーは、アプリケーション機能によって別の状態に指定されていないかぎり、デフォルトで表示されます。

- Springboardを右からスライドできるようにします。デフォルトでは、Springboardは表示全体を占有せず、そのかわりに左からスライドして、アクティブ・コンテンツ(ナビゲーション・バーの「ホーム」ボタンとアプリケーション機能を含む)を右へプッシュします。

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

「アプリケーション」ページの「ナビゲーション」のオプション(第4.2「「アプリケーション」ページの「ナビゲーション」のオプション」を参照)を使用して、ナビゲーション・バーを表示または非表示にしたり、アプリケーションによって使用されるスプリングボードのタイプを選択したり、ユーザーがアプリケーションをめくるように見ていくときのスプリングボードの反応方法を定義できます。

図4-1 「アプリケーション」ページの「ナビゲーション」のオプション

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

MAFアプリケーションのデフォルトの動作では、アプリケーション起動時にナビゲーション・バーが表示されます。MAFアプリケーション・エディタでのこのデフォルト動作は、変更可能です。

ナビゲーション・バーの表示動作を設定するには:

1. 「ナビゲーション・バーを表示」を選択して、MAFアプリケーションがデフォルトで、スプリングボードではなくナビゲーション・バーを表示するようにします(図4-2を参照)。

図4-2 デフォルトでナビゲーション・バーを表示

このオプションをオフにすると、アプリケーションの起動時にナビゲーション・バーが表示されなくなり、ユーザーにはSpringboardがナビゲーションの唯一の方法として提示されます。ナビゲーション・バーはSpringboardと同じ目的を果たすものなので、これを非表示にすることで冗長な機能を削除できる場合もあります。

2. 選択したアプリケーション機能のコンテンツが表示されているときにナビゲーション・バーを非表示にするには、トグル・ボタンの表示を選択します。図4-3はこのオプションを示したもので、図4-2に示されているナビゲーション・バーを、アプリケーション機能のコンテンツによって非表示にする方法が示されています。

図4-3 ナビゲーション・バーを非表示

このオプションはデフォルトで選択されており、アプリケーション機能によって表示/非表示状態が指定されていなければ、ナビゲーション・バーはデフォルトで表示されます。

4.2.2 スプリングボードの表示動作の設定方法

デフォルトでは、MAFアプリケーションはアプリケーション起動時にSpringboardを表示しません。MAFアプリケーション・エディタでのこのデフォルト動作は、変更可能です。

Springboardの表示動作を設定するには:

1. MAFアプリケーション・エディタで「ナビゲーション」を選択し、「ナビゲーション」タブでスプリングボードの表示を選択します。

2. MAFで提供されているデフォルトのスプリングボードが表示されます。デフォルトのSpringboardは、MAF AMXページとして実装されます。

3. アプリケーションの起動時に表示を選択して、MAFアプリケーションの起動後にエンド・ユーザーに対してスプリングボードを表示できるようにします。

4. スプリングボード・ボタンの表示を有効にするには、トグル・ボタンの表示を選択します。図4-4では、アプリケーション機能のコンテキスト内にこのボタンが表示されています。

図4-4 スプリングボード・トグル・ボタン

4.2.3 スプリングボードのスライドアウト動作の設定方法

スプリングボードを使用するようにMAFアプリケーションを構成する場合、MAFアプリケーション・エディタでスプリングボードのスライドアウト動作を設定できます。

Springboardのスライドアウト動作を設定するには:

1. アニメーションについては、「右にスライド」を選択します。Springboardは、「幅」オプションで入力したピクセル数値(またはパーセント)によって指定された領域を占有します。アニメーションについて<なし>を選択した場合、スプリングボードは右からスライドできません(つまり、MAFではこのアクションを有効にするためのアニメーションが提供されません)。Springboardが表示領域全体を占有します。

2. 幅を設定します(ピクセル単位)。iOSデバイスのSpringboardのデフォルト幅は320ピクセルです。Androidデバイスでは、デフォルトでSpringboardは画面全体を占有するので、使用可能な幅がすべて占有されます。

注意:
Springboardが表示領域全体を占有しない場合は、アクティブなアプリケーション機能が残りの表示領域を占有します。詳細は、第4.4項「スプリングボードにアニメーションを設定する場合の処理」を参照してください。

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

maf-application.xml概要エディタの「機能参照」ページのアプリケーション機能の表示順序を設定します。

アプリケーション機能の表示順序を設定するには:

1. MAFアプリケーション・エディタで、登録された機能を選択します。

2. 表示される上矢印と下矢印を使用して、登録された機能の表示順序を配置します。最上位のアプリケーション機能が、デフォルトのアプリケーション機能です。このアプリケーションのセキュリティ構成に応じて、MAFではユーザーが匿名でログインして保護されていないコンテンツを表示したり、ユーザーに認証資格証明を提供するように求めることができます。

ヒント:
「機能参照」表の最上位のIDが、MAFアプリケーション内で最初に表示されるアプリケーション機能です。たとえば、WorkBetterサンプル・アプリケーションのダッシュボード・アプリケーション機能を参照してください。

3. 「ナビゲーション・バーに表示」および「スプリングボードに表示」を使用して、スプリングボードおよびナビゲーション・バーでのアプリケーション機能の表示動作を設定します。図4-5は、アプリケーション機能がナビゲーション・バーに表示されなくなるオプションの選択状態を示しています。

図4-5 ナビゲーション・オプションの変更

スプリングボードおよびナビゲーション・バーは、デフォルトで表示されます。ナビゲーション・バーとスプリングボードのオプションがどちらも選択されていない場合、アプリケーション機能は、最初の位置に配置されているときにのみ表示されます。

注意:
スプリングボード・アプリケーションは、ナビゲーション・バー上またはMAFアプリケーションのスプリングボード内には表示されないため、カスタム・スプリングボード・アプリケーション機能として使用される機能参照については、「ナビゲーション・バーに表示」と「スプリングボードに表示」の両方の選択を解除する必要があります。

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

スプリングボードおよびナビゲーション・バーのオプションを設定すると、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-5は、オプションを選択すると、有効な属性がどのようにtrueに設定されるかを示しています。

ヒント:
Springboardはデバイスの画面全体を占有するので、ナビゲーション・バーとSpringboardは同時には表示されません。

「カスタム」を選択して、スプリングボードとして使用するアプリケーション機能を選択すると、エディタでは、図4-5に示すように<adfmf:navigation>要素が移入されます。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 スプリングボードにアニメーションを設定する場合の処理

図4-5は、maf-application.xmlファイルのナビゲーション・ブロックを示しており、ここでは、スプリングボードはスライドアウトし、指定された表示領域(213ピクセル)を占有するように設定されています。

次の行ではアニメーションを無効にしています。

<adfmf:springboard enabled="true" animation="none"/>

次の行では、Springboardが表示領域の左から100ピクセル分を占有するように設定し、アクティブなアプリケーション機能が表示領域の残りの部分を占有できるようにしています。

<adfmf:springboard enabled="true" animation="slideright" width="100px"/>

アニメーション以外に、図4-5は次の処理を示しています。

- 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コンテンツによるカスタム・スプリングボード・アプリケーション機能に関する必知事項

MAFによって提供されるデフォルトのHTML Springboardページでは、次のテクノロジが使用されています。これらは、カスタマイズしたログイン・ページに含めることもできます。

- CSS: 色およびレイアウトを定義します。

- JavaScript: スプリングボード・ページ内に埋め込まれた<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コンテンツによるカスタム・スプリングボード・アプリケーション機能に関する必知事項

HTMLの場合と同様に、MAF AMXを使用して記述されたSpringboardは、MAFアプリケーションによって参照されるアプリケーション機能です。通常、スプリングボードはタスク・フローではなく単一のMAF AMXページとして記述されるため、埋込みアプリケーション機能の起動には、gotoFeatureメソッドが使用されます。

注意:
カスタム・スプリングボード・ページ(HTMLまたはMAF AMXによって作成されたもの)は、ビュー・プロジェクト内に配置する必要があります。ビュー・コントローラ・プロジェクト内にはmaf-feature.xmlファイルも格納されています。

デフォルトの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}"T
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-6に示すように、MAF AMXファイルでは、リスト・アイテムがMAFアプリケーションの埋込みアプリケーション機能であるリスト・ビューを使用してスプリングボードを定義します。これらのアプリケーション機能は、デプロイ後は、名前と関連アイコンによって表示されます。AdfmfContainerUtilities APIのgotoFeatureメソッドでは、ページのナビゲーション機能が提供されます。このメソッドを使用した特定のアプリケーション機能の表示の詳細は、第B.2.5項「gotoFeature」を参照してください。また、第12.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」も参照してください。

図4-6 デフォルトのスプリングボード

MAFでは、ApplicationFeaturesデータ・コントロール内にカスタムSpringboardを作成(またはデフォルトのSpringboardを拡張)するための基本ツールが提供されています。このデータ・コントロール(図4-7を参照)により、MAFアプリケーションとそのアプリケーション機能の両方を記述する属性のデータ・コレクションを使用して、スプリングボード・ページを宣言的に構築できます。カスタムSpringboardページの例は、APIDemoサンプル・アプリケーションを参照してください。このアプリケーション(およびMAFに付属の他のサンプル)の詳細は、第1.4「サンプルのMAFアプリケーション」を参照してください。

図4-7 ApplicationFeaturesデータ・コントロール

ApplicationFeaturesデータ・コントロールでは、次のパッケージのAdfmfContainerUtilitiesクラスによって提供される、MAFアプリケーションにナビゲーションを実装するメソッドを公開します。

oracle.adfmf.framework.api

表4-1 に、ApplicationFeaturesデータ・コントロールからドラッグしてMAF AMXページ上にドロップ可能な、MAFアプリケーションのナビゲーションに対応したメソッドをいくつか示します。

データ・コントロールの使用方法の詳細は、第13章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」を参照してください。AdfmfContainerUtilitiesクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

表4-1 アプリケーション機能メソッド

メソッド

説明

gotoDefaultFeature

デフォルトのアプリケーション機能に移動します。

gotoFeature

このメソッドに渡されたパラメータによって指定される特定のアプリケーションに移動します。

gotoPreferences

プリファレンス・ページに移動します。

gotoSpringboard

Springboardに移動します。

hideNavigationbar

ナビゲーション・バーを非表示にします。

showNavigationbar

ナビゲーション・バーを表示します(非表示になっている場合)。

resetFeature

このメソッドに渡されたパラメータによって指定されるアプリケーション機能をリセットします。

hideSpringboard

スプリングボードを非表示にします。

showSpringboard

スプリングボードを表示します。

toggleSpringboard

Springboardの表示と非表示を切り替えます。

4.7 スプリングボードの実行時の動作に関する必知事項

アプリケーションの起動時に表示オプションを選択し、スライドアウト幅を画面のフル・サイズに指定している場合は、起動時にMAFによってバックグラウンドにデフォルトのアプリケーション機能がロードされます。MAFアプリケーションが休止している場合、MAFはSpringboardを非表示にします。

4.8 Androidの戻るボタンを使用したMAFアプリケーションの移動

エンド・ユーザーは、Androidシステムの戻るボタンを使用してMAFアプリケーション上で後ろに戻ることができます。

図4-8は、Androidのナビゲーション・バーまたはAndroidデバイス自体に表示されるAndroidシステムの戻るボタンを示しています。図4-8は、このボタンが表示されるAndroid 4.xおよびAndroid 5.xバージョンのナビゲーション・バーを示しています。

図4-8 Androidの戻るボタン

図4-9は、Billingアプリケーション機能の「Billing Page 3」ページまで、エンド・ユーザーが3つのアプリケーション機能(Customer、SalesおよびBilling)間をナビゲートするMAFアプリケーションのナビゲーション・フローを示しています。

図4-9 MAFアプリケーションのアプリケーション機能間のナビゲーション・フロー

エンド・ユーザーのAndroidシステムの戻るボタンのタップに応答するMAFアプリケーションのデフォルトの動作:

- 「Billing Page 3」は「Billing Page 2」にナビゲート

- 「Billing Page 2」は「Billing Page 1」にナビゲート

- 「Billing Page 1」はMAFアプリケーションを休止

エンド・ユーザーは、アクション属性の値が__backのUIとして公開されるMAF AMXボタンのかわりに、Androidシステムの戻るボタンのタップを選択できます。動作は、どちらのシナリオでも同じです。たとえば、Billingアプリケーション機能の3ページのすべてで、アクション属性に__backを設定したボタン・コンポーネントが公開されているものと仮定します。このシナリオでは、前に戻るナビゲーション・フローは、ページ3からページ2、ページ2からページ1、そしてエンド・ユーザーがページ1のコマンド・ボタンをタップした場合に、MAFアプリケーションが休止状態になります。

エンド・ユーザーによるAndroidシステムの戻るボタンのタップの応答となるデフォルトのMAFアプリケーションの動作をオーバーライドして、MAFアプリケーションの他の場所にナビゲートしたり、または前に戻る前になんらかのロジックを実行したりできます。MAFでは、JavaScript APIおよびMAF AMXシステムのアクション動作(systemActionBehavior)コンポーネントが提供されており、MAFアプリケーションのデフォルトの動作のオーバーライドに使用できます。systemActionBehaviorコンポーネントは、アプリケーション機能のコンテンツがMAF AMXページの場合のみ使用できます。JavaScriptは、MAF AMXページ、ローカルのHTML、またはリモートのURLを使用するアプリケーション機能のデフォルトの動作のオーバーライドに使用できます。JavaScriptのregisterSystemActionOverrideメソッドを使用すると、エンド・ユーザーがAndroidの戻るボタンをタップしたときに起動されるハンドラを登録できます。起動されるハンドラを削除するには、JavaScriptのunregisterSystemActionOverrideメソッドを使用します。どちらのメソッドもadf.mf.apiネームスペースにあります。詳細は、Oracle Mobile Application Framework JSDocリファレンスを参照してください。

systemActionBehaviorコンポーネントの使用の詳細は、第4.8.1項「Androidシステムの戻るボタンの動作を構成する方法」を参照してください。

MAF 2.2.0より前のリリースを使用して作成されたMAFアプリケーションでは、エンド・ユーザーによるAndroidシステムの戻るボタンのタップの応答となるデフォルトのMAFアプリケーションの動作は、アプリケーション機能の間で前に戻る動作でした。これは、たとえば図4-8で、エンド・ユーザーはBillingアプリケーション機能からSalesアプリケーション機能にナビゲートし、MAFアプリケーションを休止する前に、Customerアプリケーション機能にまでナビゲートすることを意味します。このリリースのMAFを使用して作成するMAFアプリケーションでは、Oracle Enterprise Pack Oracle Enterprise Pack for EclipseのインストールのAndroidの戻るボタンを使用してMAFアプリケーションをナビゲートする場合のレガシー動作の保持に関する項で説明されているように、maf-config.xmlファイルでパラメータを構成することで、このレガシーな動作を実装できます。このレガシーな動作を実装することにより、MAFアプリケーションでは、ここで説明したsystemActionBehaviorコンポーネントおよびJavaScriptのregisterSystemActionOverrideメソッドの使用が無視されます。

4.8.1 Androidシステムの戻るボタンの動作を構成する方法

システム・アクション動作(systemActionBehavior)操作により、Androidデバイスの戻るボタンのデフォルトの動作をオーバーライドして、タスク・フローで定義されたMAF AMXアプリケーション機能の前のページに移動する前に、カスタム・ロジックの処理を実行できます。

OEPEでは、システムのアクション動作は、図4-10に示すように、「パレット」ウィンドウのMAF AMXの下にあります。

図4-10 「パレット」のシステムのアクション動作

次の例は、MAF AMXファイルで定義されたsystemActionBehavior要素を示しています。この要素は、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:systemActionBehavior id="sab1"
type="back"
actionListener="#{MyBean.onBackButton}"
action="#{MyBean.getNavAction}"/>
...
</amx:view>

前述の例のsystemActionBehaviorのactionListenerおよびaction属性は、次の例に示すようにJava Beanメソッドを起動します。onBackButtonメソッドにより、戻るナビゲーションが発生する前にカスタム・ロジックの処理が実行されます。getNavActionメソッドにより、戻る動作が無効になります。

システムのアクション動作のMAF AMXコンポーネントおよびJava Beanに加え、JavaScriptを使用してAndroidシステムの戻るボタンの動作を構成できます。次の例は、アプリケーション機能に含まれるfeature.jsファイルを示しています。これは、戻るナビゲーションが発生する前に実行されるなんらかの処理を可能にする、Androidシステムの戻るボタンのハンドラを定義しています。

handleSystemBack = function()
{
// do some processing, invoke a Java bean
adf.mf.api.amx.doNavigation("__back");
};
adf.mf.api.registerSystemActionOverride("back", handleSystemBack);

次の例に示すハンドラでは、戻るナビゲーションの発生が止められます。

handleSystemBack = function()
{
// do nothing
};
adf.mf.api.registerSystemActionOverride("back", handleSystemBack);

次の例に示すハンドラでは、標準の戻るナビゲーションが可能になります。

handleSystemBack = function()
{
adf.mf.api.amx.doNavigation("__back");
};
adf.mf.api.registerSystemActionOverride("back", handleSystemBack);

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

アプリケーション機能をスライディング・ウィンドウとしてレンダリングできます。これにより、ナビゲーション・バーまたはSpringboard内に表示される他のアプリケーション機能と同時にアプリケーション機能が表示されます。スライディング・ウィンドウは、アプリケーション内に常に存在しているコンテンツ(グローバル・ツール・バーなど)を表示するために使用したり、一時的な(ポップアップ)コンテンツ(ヘルプ・ウィンドウなど)を表示するために使用できます。

図4-11は、SlidingWindowサンプル・アプリケーションのSlidingDrawerアプリケーション機能を示しています(付録E「サンプルのMAFアプリケーション」を参照)。このアプリケーション機能は、他のアプリケーション機能に重なりながら、アプリケーション画面の右側に表示されます。

図4-11 他のアプリケーション機能に重なるスライディング・ウィンドウ

アプリケーション機能をスライディング・ウィンドウとしてレンダリングする場合、Show on Navigation BarプロパティおよびShow on Springboardプロパティをfalseに設定する必要があります。

スライディング・ウィンドウを作成するには、oracle.adfmf.framework.api.AdfmfSlidingWindowOptionsクラスとAdfmfSlidingWindowUtilitiesクラスの組合せを、アプリケーション内のマネージドBeanまたはライフサイクル・リスナーから起動します。

次の例は、SlidingWindowサンプル・アプリケーションで、LifeCycleListenerImpl.javaのactivateメソッドから、図4-11に示すスライディング・ウィンドウを作成する方法を示しています。スライディング・ウィンドウの作成後、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サンプル・アプリケーション全体にアクセスする方法は、付録E「サンプルのMAFアプリケーション」を参照してください。

AdfmfSlidingWindowUtilitiesおよびAdfmfSlidingWindowOptionsの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。ライフサイクル・リスナーの使用方法の詳細は、第10章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

4.10 MAFアプリケーションでのカスタムURLスキームの使用

カスタムURLスキームを使用して、他のアプリケーションからネイティブ・アプリケーションを起動できます。

別のアプリケーションからMAFモバイル・アプリケーションを起動するには、次の手順を実行します。

1. カスタムURLスキームを登録します。このURLスキームは、MAFアプリケーション・エディタの「セキュリティ」タブで「URLスキーム」フィールドを使用して構成します。このスキームを持つURLを使用すれば、MAFモバイル・アプリケーションを起動し、そのアプリケーションにデータを渡すことができます。

2. アセンブリ・プロジェクトで、URLを通知されるカスタムURLイベント・リスナー・クラス(CustomURLEventListenerなど)を作成します。このクラスには、イベント・リスナーを定義するoracle.adfmf.framework.event.EventListenerインタフェースを実装する必要があります。oracle.adfmf.framework.event.EventListenerインタフェースの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
MAFモバイル・アプリケーションの起動に使用されるURLで呼び出されるonMessage(Event e)メソッドをオーバーライドおよび実装します。Eventオブジェクトを使用して、URLペイロードおよびアプリケーションの状態に関する有用な情報を取得できます。URLペイロードを取得するには、Event.getPayloadメソッドを使用します。URLイベント発生時にアプリケーションの状態を取得するには、Event.getApplicationStateメソッドを使用します。詳細は、Oracle Mobile Application Framework Java APIリファレンスでEventクラスを参照してください。

3. アプリケーション・ライフサイクル・イベント・リスナー(ALCL)クラスを登録します。
詳細は、第10章「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>

MAFアプリケーションがネイティブ・アプリケーションの起動に使用する任意のカスタムURLスキームを、MAFアプリケーション・エディタの「セキュリティ」ページの「許可されるスキーム」リストに追加します。この変更点は、アプリケーションが他のアプリケーションの起動に使用するURLスキームを宣言するというiOS 9の要件に対応しています。図4-12に示すように、「セキュリティ」ページの「許可されるスキーム」セクションの「追加」アイコンをクリックして、カスタムURLスキームを追加します。

図4-12 別のアプリケーションを起動するためにMAFアプリケーションが使用するカスタムURLスキームの登録

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

この章では、MAFアプリケーション・エディタとMAF機能エディタを使用してモバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義し、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

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

- 第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>要素に追加すると、アプリケーション機能にユーザー・インタフェースをどのように実装するかを定義できます。

MAF機能エディタの「コンテンツ」タブ(図5-1を参照)には、例5-1に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。このタブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できる制約を設定できます。

図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ページを参照します。「サンプルのMAFアプリケーション」で説明されているHelloWorldサンプル・アプリケーションが示すように、このようなHTMLページはJavaScriptを参照できます。MAFが自分のアプリケーションの機能の実装に最適ではない場合に、Cordova JavaScript APIの使用によるアプリケーション機能を実装するため、このコンテンツ・タイプの使用を検討してください。JavaScript APIおよびMAFの詳細は、付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」を参照してください。

アプリケーション・コンテンツをリモートURLまたはローカルHTMLとして定義するには:

1. MAF機能エディタにリストされているアプリケーション機能を右クリックして、「追加」を選択します。

2. 「新規オブジェクト」ダイアログで、ローカルURLまたはリモートHTMLを選択し、「OK」をクリックします。

3. コンテンツ固有のパラメータを定義します。

- ローカルHTMLコンテンツの場合は、ローカル・バンドルの場所を入力するか、または「URL」フィールドで「追加」をクリックし、新規モバイルHTMLページ・ダイアログにHTMLファイルの名前を入力して、OEPEのHTMLエディタを使用してページを作成します。これはアプリケーション機能であるため、このページはビュー・プロジェクトのViewContentフォルダに格納されます。

- リモートURLコンテンツの場合は、サーバー上のWebページのアドレス(および起動ページの場所)を表す接続を選択します。
この接続を作成するには、まず「追加」をクリックして、次に「URL接続の作成」ダイアログに入力します。この接続は、connections.xmlファイルに格納されます。

4. 必要に応じて、次の手順を実行します。

- このコンテンツをユーザーが使用できるようになるための条件を示す制約を入力します。詳細は、第22章「アプリケーション機能に関する制約の設定」を参照してください。

- ナビゲーション・バーとSpringboardのイメージを選択します。

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

概要エディタの「コンテンツ」タブ(図5-1を参照)には、例5-1に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。このタブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できる制約を設定できます。

始める前に:

各コンテンツ・タイプには、次のような独自の前提条件があります。

- AMXページ: アプリケーション機能に対するデフォルトのコンテンツ・タイプ。MAF AMXページの詳細は、第11章「MAF AMXページの作成」を参照してください。
MAF AMXとして実装されるアプリケーション機能には、ビュー(単一のMAF AMXページ)か、バインド・タスク・フローまたはバインドなしタスク・フローが必要です。JavaScriptファイルを追加すると、MAF AMXコンポーネントに対するレンダリング・ロジックが提供されるか、既存のレンダリング・ロジックがオーバーライドされます。アプリケーション機能に対するカスタムのルック・アンド・フィールを指定するセレクタを持つスタイル・シート(CSS)を含めます。これは、MAFアプリケーション・レベルで定義されたスタイル(アプリケーション機能にデフォルトで使用されるスタイル)をオーバーライドします。つまり、アプリケーション機能全体で確実に独自のルック・アンド・フィールを持つようになります。

MAF AMXページとこれらを格納するMAFアプリケーションは、両方とも「新規ギャラリ」のウィザードを使用して作成できます。これらのウィザードには、「ファイル」→「新規」からアクセスします。プロジェクト・エクスプローラでビュー・プロジェクトを右クリックして「新」を選択したときに表示されるポップアップ・メニュー(図5-2を参照)を使用してMAF AMXページを作成することもできます。

注意:
MAF機能エディタ内にある、タスク・フロー、MAF AMXページ、CSSおよびJavaScriptファイルへの参照を手動で編集する場合、デバイスで使用されているファイル・システムによって大文字と小文字が区別され、特殊文字が許可されない可能性があることに注意してください。これらのファイルを確実に参照できるようにするには、モバイル・デバイスの仕様を確認してください。

図5-2 MAFページを作成するためのポップアップ・メニュー

- タスク・フロー: アプリケーション機能の制御フローの定義にモジュール型アプローチを提供します。タスク・フローを使用して、1つのタスクを構成する一連のアクティビティを定義します。タスク・フローに含めることのできるアクティビティには、ビュー(MAF AMXページの表示に使用)、メソッド・コール(マネージドBeanのメソッドの起動に使用)、タスク・フロー・コール(別のタスク・フローのコールに使用)などがあります。タスク・フローの詳細は、第11.2項「タスク・フローの作成」を参照してください。

MAF AMXページまたはタスク・フローをアプリケーション機能のコンテンツとして使用する手順:

1. MAF機能エディタの「アウトライン」にリストされているアプリケーション機能を選択します。

2. 右マウス・ボタンをクリックし、「新」を選択します(図5-3を参照)。

図5-3 新しい機能のためのポップアップ・メニュー

3. 「新規オブジェクト」ダイアログで「コンテンツ」ノードを展開し、必要に応じて、次のコンテンツ・タイプのいずれかを選択し、「OK」をクリックします。

- AMXページ

- 「タスク・フロー」

4. コンテンツ固有のパラメータを定義します。

- AMXページの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規MAFページ・ダイアログを開き、新しいAMXページの親フォルダを選択します。

- タスク・フローの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規MAFタスク・フロー・ダイアログを開きます。

5. モバイル・アプリケーションでの作業時に簡単に識別できるよう説明的な名前をページに付けます。

6. 「終了」をクリックしてページを保存します。

注意:
イメージ、スタイルシートおよびJavaScriptファイルは、デプロイ可能にするために、ViewContentフォルダ内に配置する必要があります。第5.4項「外部リソースの選択に関する必知事項」を参照してください。

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

デプロイメントを可能にするために、次の属性によって参照されるすべてのリソースは、ビュー・プロジェクトのViewContentフォルダ内に配置する必要があります。

- <adfmf:feature>のiconおよびimage属性(例: <adfmf:feature id="PROD" name="Products" icon="feature_icon.png" image="springboard.png">)。第3.4項「アプリケーション機能の表示プロパティの設定」も参照してください。

- <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は、別の場所から参照されるリソースをサポートしていません。つまり、たとえば、../を接頭辞として使用して、ViewContentディレクトリ外部に値を入力することはできません。

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

この章では、複数の言語を使用するデバイスでMAFアプリケーションを実行する場合にレンダリングするテキストおよびイメージ・リソースを定義できるリソース・バンドルの使用方法について説明します。この章では、リソース・バンドルを作成および編集するためにOEPEが提供するデザインタイム・サポートについても説明します。

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

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

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

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

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

- 第6.5項「リソース・バンドルのリソースの編集」

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

- 第6.7項「MAFでの言語のサポート」

- 第6.8項「ローカライズ可能なMAFプロパティ」

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

ローカリゼーションとは、特定ロケールに製品を適応させるプロセスのことです。ローカリゼーションにより、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)を使用します。「文字列の外部化」ダイアログに初めて表示値を入力する際に、OEPEにより、.xlfファイル・リソース・バンドルが作成されます。ローカライズした値をサポートする各プロパティで「テキスト・リソースの選択」を呼び出します。

デフォルトでは、MAFアプリケーションには次の2つのリソース・バンドルがあります。

- プロジェクトレベルのリソース・バンドル(デフォルト名はViewControllerController.xlf)

- アプリケーションレベルのリソース・バンドル(デフォルト名mafapplication.xlf)

アプリケーションレベルのリソース・バンドルには、アプリケーションレベルのテキスト・リソースが含まれます。たとえば、アプリケーション名を別の言語に翻訳する場合は、このリソース・バンドルでアプリケーション名をテキスト・リソースとして指定します。プロジェクトレベルのリソース・バンドルには、プロジェクトのMAF AMXページにレンダリングされるテキスト・リソース、またはアプリケーション機能のプロパティのテキスト・リソースが含まれます。これらのプロパティの詳細は、第6.8項「ローカライズ可能なMAFプロパティ」を参照してください。

プロジェクトのリソース・バンドル・オプションを設定することで、1つのプロジェクトレベル・リソース・バンドルを持つMAFアプリケーションのデフォルトの動作を変更できます。MAFアプリケーションは、アプリケーションレベルのリソース・バンドルを1つのみ持つことができます。

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

OEPEでは、エンド・ユーザーに表示されるMAFアプリケーション、アプリケーション機能およびMAF AMX UIコンポーネントのテキスト・リソースの値をリソース・バンドルに定義できる外部化文字列ダイアログが提供されます。外部化文字列ダイアログには、MAFアプリケーション・エディタまたはMAF機能エディタで、テキスト・リソースを定義するプロパティの横にあるアイコンをクリックしてアクセスします。通常、これらのプロパティはユーザーが参照できるテキストを表示するプロパティです。たとえば、ボタン、リンク、入力テキストなどのMAF AMX UIコンポーネントにより表示されるラベル、テキストおよびhintTextプロパティに加えて、MAFアプリケーションおよびアプリケーション機能の名前プロパティがあります。これらのプロパティの詳細は、第6.8項「ローカライズ可能なMAFプロパティ」を参照してください。

図6-2は、MAF機能の名前の外部化コンテキスト・メニューを表示する方法を示しています。アプリケーション機能の名前についても、同じボタンを使用します。

図6-2 外部化文字列の編集ダイアログの選択

<amx:commandButton>のtext属性のようなMAF AMXコンポーネントの属性には、リソース・バンドルを作成できます。表6-4に、これらのMAF AMX (amx)コンポーネントを示します。

MAF AMXコンポーネントの文字列を使用するには:

1. 図6-3のように<amx:selectOneButton>コンポーネントに定義されている値属性などの属性をAMXエディタで選択します。

図6-3 プロパティによる文字列の外部化

2. 右マウス・ボタンをクリックし、「ソース」→「文字列の外部化」を選択します。「文字列の外部化」ダイアログが表示されます(図6-4を参照)。

3. 「文字列の外部化」ダイアログで、表示名、キーを入力することで文字列リソースを編集し、「終了」をクリックします。

図6-4 リソース・バンドルへの文字列の追加

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

リソース・バンドルにテキスト・リソースを定義するには、EL式を使用してリソース・バンドルに定義されたテキスト・リソースを参照するプロパティについて起動できる「文字列の外部化」ダイアログを使用します。

リソース・バンドルにテキスト・リソースを定義するには:

1. テキスト・リソースを定義するプロパティを持つアーティファクトを選択します。これは、MAFアプリケーション自体、アプリケーション機能またはMAF AMX UIコンポーネントが可能です。
たとえば、MAF機能エディタで属性を選択し(図6-2の「名前」など)、外部化をクリックします。これによって文字列の外部化ダイアログが開きます。

2. 文字列の外部化ダイアログ(図6-5を参照)で、「新規プロパティの作成」をクリックして新しい文字列ソースを作成します。表示値、キー、説明を入力して、「OK」をクリックします。
初めて新規文字列リソースを作成してワークスペースを保存する際に、リソース・ファイルが作成されます。その後、「文字列の外部化」ダイアログを開くと、そのリソース・ファイルへのリンクが表示されます。

図6-5 外部化文字列の編集ダイアログの選択

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

入力した表示値とキーは、OEPEによってリソース・バンドルに書き込まれます。今回初めてMAFアプリケーションまたはプロジェクトのテキスト・リソースを定義する場合、OEPEによりリソース・バンドルが作成されます。定義するテキスト・リソースがアプリケーションレベルのプロパティ(MAFアプリケーションの名前プロパティなど)用である場合、OEPEでは、アプリケーションレベルのリソース・バンドル(mafapplication.xlf)が作成されます。定義するテキスト・リソースがプロジェクトレベルのプロパティ(アプリケーション機能の名前プロパティなど)用である場合、OEPEでは、プロジェクトレベルのリソース・バンドル(ViewControllerBundle.xlf)が作成されます(図6-6 を参照)。

図6-6 新規に作成したリソース・バンドル

OEPEでは、MAFアプリケーションごとに、アプリケーションレベルのリソース・バンドルとプロジェクトレベルのリソース・バンドルがそれぞれ1つ作成されます。

次の例に示すように、リソース・バンドルがアプリケーションレベルとプロジェクトレベルのどちらのリソース・バンドルかにかかわらず、OEPEがキーおよび表示値のリソース・バンドルに書き込む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>
...

リソース・バンドルで定義するテキスト・リソースを参照するためのプロパティを構成するファイルに対して、OEPEは図6-6に示す変更を加えます。

- 属性を最初にローカライズすると、OEPEによって<adfmf:loadbundle>要素が追加されます。この要素のbasename属性が、新しく作成したリソース・バンドルを参照します。

- OEPEは、ローカライズされた属性文字列を、リソース・バンドル内で定義されたテキスト・リソースのキーを参照するEL式に変更します。

例6-1 MAF 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}">

<!-- MAF 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-7に、アラビア語とフランス語のロケールをサポートするために、ロケール固有バージョンのアプリケーションレベル(mafapplication.xlf)のリソース・バンドルとプロジェクトレベルの(ViewControllerBundle.xlf)リソース・バンドルが作成されたMAFアプリケーションを示します。次の形式を使用するファイル名でベース・リソース・バンドルと同じディレクトリにロケール固有リソース・バンドルを作成する必要があります。

<BASE_RESOURCE_BUNDLE_NAME>_<LANGUAGE_TOKEN>.xlf

ここでは、次のようになります。

- <BASE_RESOURCE_BUNDLE_NAME>はベース・リソース・バンドル名です

- <LANGUAGE_TOKEN>は<ISO-639-lowercase-language-code>の形式です
MAFでサポートされる言語のリストは、第6.7項「MAFでの言語のサポート」を参照してください。

図6-7 ベース・リソース・バンドルとロケール固有のリソース・バンドル

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

ロケール固有のリソース・バンドルを作成するベース・バンドルを開き、ファイル名に適切な言語コードを指定してファイルのコピーを保存します。このページでは、次の処理を実行できます。

- ベース・リソース・バンドルと同じディレクトリにロケール固有のリソース・バンドルを作成します。これは必須です。

- ベース・リソース・バンドル内のすべてのテキスト・リソースのコピーが、翻訳された値を提供できるロケール固有のリソース・ベース・バンドルに表示されます。

ロケール固有のリソース・バンドルを作成するには:

1. ロケール固有バージョンを作成するベース・リソース・バンドルを開きます。

- アプリケーションレベルのベース・リソース・バンドル: アセンブリ・プロジェクトのADF > META-INFノードで、.xlfファイルをダブルクリックします。

- プロジェクトレベルのベース・リソース・バンドル: ビュー・プロジェクトのsrc > mobileノードで、.xlfファイルをダブルクリックします。

2. OEPEで、「ファイル」→「別名保存」をクリックして、サポートするロケールの言語コードを追加します。
たとえば、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 リソース・バンドルのリソースの編集

XLIFFファイルまたはJavaクラス・ファイルを作成したら、ソース・エディタを使用して編集できます。MAFエディタのいずれかを使用する場合は、ファイル上でExternalizeコマンドを呼び出すことができます。

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

ロケールに応じて、MAFアプリケーションに異なるイメージ・ファイルをレンダリングすることが必要な場合があります。たとえば、図6-8に示すように、イメージにはテキストまたは国旗の図を含めることができます。

図6-8 ロケールに基づいて異なるイメージのレンダリング

イメージを参照するコンポーネント属性のEL式をリソース・バンドルのエントリに書き込みます。リソース・バンドル・エントリにはイメージへのパスが含まれます。たとえば、図6-8に示すcommandButtonコンポーネントは、コンポーネントをレンダリングするMAF 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/>

手動で、イメージへのパスを定義するエントリをリソース・バンドルに記述します。

ソース・バンドルにイメージへのパスを定義した後、式ビルダーを使用できます。詳細は、第13.3.2項「EL式の作成方法」を参照してください。

6.7 MAFでの言語のサポート

図6-1は、MAFでサポートされる言語を示しています。ユーザーのデバイスがこれらの言語のいずれかを使用するように構成されている場合、エラー・メッセージなどのシステム・メッセージは、これらの言語で表示されます。MAFでは、国および地域用の言語トークンをサポートしています。ただし、フルサポートが提供されるのは、言語のリストに表示されている場合のみです。MAFからのエラー・メッセージでは、リストに示されている言語のうちで最も近いものが使用されます。通常、表内のいずれかの言語またはこれらのいずれかの言語のより固有のバリアントを使用するようにデバイスが構成されていないかぎり、言語は英語になります。

これらの言語で追加リソース文字列をアプリケーションでレンダリングする場合は、それらの文字列を定義する必要があります。表6-1にリストされている言語トークンを使用して、ロケール固有のリソース・バンドルを作成します。たとえば、ポルトガル語(ブラジル)のリソース文字列を定義する場合は、BASE_RESOURCE_BUNDLE_NAME_pt_BR.xlfという名前のリソース・バンドルを作成します。リストに含まれていない言語のリソース・バンドルを作成するには、BASE_RESOURCE_BUNDLE_NAME_lowercase-ISO-639-1-language-code.xlfという名前フォーマットでリソース・バンドルを作成します。命名規則の詳細は、第6.4項「ロケール固有のリソース・バンドルの作成」を参照してください。

デプロイメントでは、OEPEにより、アプリケーションがデプロイされているプラットフォームで必要な値に、言語トークンが変換されます。たとえば、iOSプラットフォームにデプロイされるMAFアプリケーションは、言語トークンpt_BRをpt (iOSプラットフォームで予期される言語ID)に変換します。

表6-1 MAFでサポートされる言語のリソース・バンドル名

言語

追加のUI文字列を指定するためのリソース・バンドル名

アラビア語

BASE_RESOURCE_BUNDLE_NAME_ar.xlf

ポルトガル語(ブラジル)

BASE_RESOURCE_BUNDLE_NAME_pt_BR.xlf

カタロニア語

BASE_RESOURCE_BUNDLE_NAME_ca.xlf

チェコ語

BASE_RESOURCE_BUNDLE_NAME_cs.xlf

デンマーク語

BASE_RESOURCE_BUNDLE_NAME_da.xlf

オランダ語

BASE_RESOURCE_BUNDLE_NAME_nl.xlf

フィンランド語

BASE_RESOURCE_BUNDLE_NAME_fit.xlf

フランス語

BASE_RESOURCE_BUNDLE_NAME_fr.xlf

ドイツ語

BASE_RESOURCE_BUNDLE_NAME_de.xlf

ギリシャ語(近代)

BASE_RESOURCE_BUNDLE_NAME_el.xlf

ヘブライ語

BASE_RESOURCE_BUNDLE_NAME_iw.xlf

ハンガリー語

BASE_RESOURCE_BUNDLE_NAME_hu.xlf

イタリア語

BASE_RESOURCE_BUNDLE_NAME_it.xlf

日本語

BASE_RESOURCE_BUNDLE_NAME_ja.xlf

韓国語

BASE_RESOURCE_BUNDLE_NAME_ko.xlf

ノルウェー語

BASE_RESOURCE_BUNDLE_NAME_no.xlf

ポーランド語

BASE_RESOURCE_BUNDLE_NAME_pl.xlf

ポルトガル語

BASE_RESOURCE_BUNDLE_NAME_pt.xlf

ルーマニア語

BASE_RESOURCE_BUNDLE_NAME_ro.xlf

ロシア語

BASE_RESOURCE_BUNDLE_NAME_ru.xlf

簡体字中国語

BASE_RESOURCE_BUNDLE_NAME_zh_CN.xlf

スロバキア語

BASE_RESOURCE_BUNDLE_NAME_sk.xlf

スペイン語

BASE_RESOURCE_BUNDLE_NAME_es.xlf

スウェーデン語

BASE_RESOURCE_BUNDLE_NAME_sv.xlf

繁体字中国語

BASE_RESOURCE_BUNDLE_NAME_zh_TW.xlf

トルコ語

BASE_RESOURCE_BUNDLE_NAME_tr.xlf

タイ語

BASE_RESOURCE_BUNDLE_NAME_th.xlf

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

maf-application.xmlおよびmaf-feature.xmlファイルは、どちらもリソース・バンドルのテキスト・リソースを参照できるプロパティを公開します。表6-2と表6-3に、これらのプロパティをリストします。これらの構成ファイルはアプリケーション・ライフサイクルの初期に読み取られるので、これらの文字列は実行時にはEL文として評価されません。そのかわり、これらの文字列は、ネイティブ・デバイス変換インフラストラクチャにおいて変換された文字列の完全なキーとして取得されます。

表6-4に、テキスト・リソースを参照できるMAF AMX UIコンポーネントの属性をリストします。

アプリケーションレベルでは、アプリケーション名やプリファレンス・ページのラベルなどの属性の文字列をローカライズできます。表6-2にこれらを示します。

表6-2 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

プロジェクト(ビュー・コントローラ)レベルでは、MAF機能エディタを使用して、表6-3に示すアプリケーション機能関連の属性をローカライズできます。

表6-3 アプリケーション機能のローカライズ可能な属性

要素

属性

<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-4は、これらのMAF AMX UIコンポーネントを示しています。

表6-4 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.1 MAFアプリケーション・スキンの概要

MAFではCascading Style Sheet (CSS)言語ベースのスキンを使用するので、MAFアプリケーション内の(その要素のアプリケーション機能で使用されるものを含む)すべてのアプリケーション・コンポーネントが一貫したルック・アンド・フィールを確実に共有するようになっています。MAF AMXまたはHTMLコンポーネントを再構成してMAFアプリケーションの外観を変更するかわりに、コンポーネントの表示方法を変更するスキンを作成または拡張できます。

MAFアプリケーションのルック・アンド・フィールを変更するためのスキンの作成または編集は、反復的プロセスです。スキンを作成し、それをデバイスにデプロイして結果を表示できます。このプロセスを、スキンのレンダリング結果が希望どおりになるまで続行できます。ユーザー・インタフェース・コード(CSS、HTML、JavaScriptなど)をインスペクトおよびデバッグするためにAndroidおよびiOSプラットフォームが提供する開発者ツールは、このタスクでの重要なリソースです。MAFアプリケーションでこれらのツールを使用する方法の詳細は、第30.4.2項「AndroidプラットフォームでのUIコードのデバッグ方法」および第30.5.2項「iOSプラットフォームでのUIコードのデバッグ方法」を参照してください。

MAF AMXページの外観を決定するセレクタを定義するためにMAFで使用されるサポート済のスキンのファミリとバージョンは、次のとおりです。

amx
mobileAlta-1.0
mobileAlta-1.1
mobileAlta-1.2
mobileAlta-1.3
mobileAlta-1.4
mobileAlta-1.5

デフォルトで、新規作成したMAFアプリケーションでは最新バージョンのmobileAltaスキン・ファミリが使用されます。アプリケーションを以前のリリースから最新リリースに移行すると、そのアプリケーションでは移行前に使用するよう構成されていたスキンが引き続き使用されます。移行後のアプリケーションで別のスキン(たとえば最新バージョンのmobileAlta)を使用する場合は、第7.3項「アプリケーションが使用するスキンの指定」の説明に従って、maf-config.xmlファイルを編集する必要があります。

図7-1は、異なるスキンを使用して同じアプリケーション画面のレンダリングを示すことによって、mobileAltaスキン・ファミリとmobileFusionFxスキン・ファミリのルック・アンド・フィールの違いを示しています。

図7-1 mobileAltaとmobileFusionFxのルック・アンド・フィールの比較

MAFアプリケーションをデバイス、エミュレータまたはシミュレータにデプロイすることにより、MAFアプリケーションの使用するスキンのすべてのリソース(CSSファイルおよびイメージ)を表示できます。デプロイメントでは、これらのリソースは、デプロイメント処理で生成されるプラットフォーム固有のアーティファクト内で作成されるwww\cssディレクトリに移動されます。iOSデプロイメントの場合、www\cssディレクトリはtemporary_xcode_projectディレクトリ内にあります。iOSデプロイメントでは、これらのリソースは、作成された.IPAファイルに追加されるOracle_ADFmc_Container_Template.zipファイルにパッケージされます。Androidデプロイメントの場合、ディレクトリ・パスは%app%\deploy\Android1\framework\build\java_res\assets\www\cssとなり、Android1はデプロイメント・プロファイルの名前です。Androidデプロイメントでは、これらのリソースは、作成された.APKファイルに追加されるassets.zipファイルにパッケージされます。OEPEの「プロジェクト」→「クリーン」→「すべてクリーン」コマンドにより、deployディレクトリ、およびwww\cssディレクトリを含むそのサブディレクトリが削除されることに注意してください。

注意:
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アプリケーションを作成すると、OEPEによって、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.10項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。
<skin-family>または<skin-version>タグの値を指定しない場合は、MAFアプリケーションで自動的に最新のスキン・ファミリまたはスキン・バージョンが使用されます。

MAFでは階層としてスキンが適用されます。最上位にはデバイス固有のスキン、その後にプラットフォーム固有のスキン、ベース・スキンmobileAltaと続きます。MAFのmobileAltaスキン・ファミリの場合、この階層は次のように表されます。

1. mobileAlta.<DeviceModel> (例: mobileAlta.iPhone5,3)

2. mobileAlta.iOSまたはmobileAlta.Android

3. mobileAlta

ヒント:
デバイス固有またはプラットフォーム固有のスキンを作成する予定の場合は、その値を取得する必要があるデバイスまたはプラットフォームにDeviceDemoサンプル・アプリケーションをデプロイします。DeviceDemoサンプル・アプリケーションの「プロパティ」アプリケーション機能には、デバイス・モデルおよびアプリケーションが実行されているプラットフォームの値が表示されます。詳細は、付録E「サンプルのMAFアプリケーション」を参照してください。

図7-2は、実行時にMAFでスキンのこの階層が適用される様子をイラストレーションで示しています。SkinningDemoサンプル・アプリケーション(付録E「サンプルのMAFアプリケーション」を参照)でも、この実装を示しています。

MAFでは、この階層のデバイス固有のレベルで定義されたセレクタを優先します。つまり、MAFでは、mobileAlta.iOSで定義されたセレクタを、mobileAlta.iPhoneで定義された同じセレクタで上書きします。<extends>要素(第7.1.2項「maf-skins.xmlファイルについて」を参照)によって、この階層がMAFランタイム用に定義されます。様々なレベルでのスキンの適用方法の詳細は、第7.8項「スキニングに関する必知事項」を参照してください。

図7-2 実行時の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.4</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.4.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.4.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デバイス・タイプ(タブレット、電話、シミュレータ)をターゲットにするこれらの要素の使用例を示します。

ヒント:
デバイス・モデルに関する情報を取得するには、付録E「サンプルのMAFアプリケーション」に記載されているDeviceDemoサンプル・アプリケーションの使用を検討してください。

表7-3 プラットフォームおよびデバイス固有のスタイル

デバイス

例

iPhone

<skin-addition>
<skin-id>mobileAlta-v1.4.iPhone5,1</skin-id>
<style-sheet-name>iPhoneStylesheet.css</style-sheet-name>
</skin-addition>

iPad

<skin-addition>
<skin-id>mobileAlta-v1.4.iPad4,2</skin-id>
<style-sheet-name>iPadStylesheet.css</style-sheet-name>
</skin-addition>

iPhoneシミュレータ

<skin-addition>
<skin-id>mobileAlta-v1.4.iPhone Simulator x86_64</skin-id>
<style-sheet-name>iPhoneSimStylesheet.css</style-sheet-name>
</skin-addition>

すべてのiOSデバイス

<skin-addition>
<skin-id>mobileAlta-v1.4.iOS</skin-id>
<style-sheet-name>iOSSimStylesheet.css</style-sheet-name>
</skin-addition>

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

アプリケーションにカスタム・スキンを追加するには、OEPE内にCSSファイルを作成します。CSSはアプリケーションとともにデプロイするために、OEPEによりプロジェクトのソース・ファイルに配置されます。

カスタム・スキンをアプリケーションに追加する手順:

1. 「アプリケーション」ウィンドウで、ViewContentを展開し、cssフォルダを右クリックして「新」→「その他」を選択します。「新規ギャラリ」ダイアログで、「Web」を展開し、「CSSファイル」を選択します。「次へ」をクリックします。

2. ウィザードの新規CSSファイル・ページで、CSSファイルの名前を指定します。

3. 「終了」をクリックします。

Eclipseに新しいCSSファイルが開かれ、アプリケーション用のスタイルを定義できます。

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

maf-config.xmlファイルで値を構成して、アプリケーションで使用するスキンを決定します。

使用するアプリケーションのスキンを指定するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクト、adf、META-INFの順に展開し、maf-config.xmlファイルをダブルクリックしてXMLエディタで開きます。

2. 次の例に示すように、使用するスキンの<skin-family>要素およびオプションで<skin-version>要素の値を、maf-config.xmlファイルに指定します
ソース・エディタにファイルを表示するには、XMLエディタの下部にある「ソース」タブをクリックします。次の例に、モバイル・アプリケーションでmobileAlta-v1.4スキンを使用するために必要な構成を示します。

<adfmf-config xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-family>mobileAlta</skin-family>
<skin-version>v1.2</skin-version>
</adfmf-config>

注意:
アプリケーションが実行時に使用するスキンを動的に選択する場合、EL式を<skin-family>要素の値として設定します。詳細は、第7.10項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。

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

maf-skins.xmlファイルにカスタム・スキンを識別するプロパティ値を追加することで、ユーザーのアプリケーションにカスタム・スキンを登録します。

カスタム・スキンを登録する手順:

1. プロジェクト・エクスプローラで、「アプリケーション・プロジェクト」→「src」→「META-INF」の順に展開し、maf-skins.xmlをダブルクリックしてXMLエディタで開きます。

2. 「設計」タブに切り替えます。adfmf-skinsタグを選択し、右クリックします。「子を追加」→「skin」を選択します。

3. skinノードを展開し、デフォルトでidタグとfamilyタグが作成されていることを確認してください。右クリックしてから、「子を追加」→「extends」を選択してextendsを作成するか、または「子を追加」→「style-sheet-name」を選択してstyle-sheet-nameを作成することができます。

4. 次のフィールドのいずれかを選択し、値を次のように編集するために「コンテンツ」列に進みます。

- ファミリ: スキンのファミリ名の値を入力します。
新しい名前を入力するか、既存のファミリ名を指定できます。既存のファミリ名を指定した場合は、第7.5項「MAFスキンのバージョニング」に示すように、スキンをバージョニングして、同じファミリ値を持つスキンを区別します。

入力する値は、作成するスキンを登録するmaf-skins.xmlの<family>要素の値として設定されます。アプリケーションのmaf-config.xmlの<skin-family>要素では、実行時にこの値を使用してアプリケーションで使用されるスキンを識別します。

- ID: skinFamily-versionまたはskinFamily-version.platformのいずれかの名前書式を使用してスキンのIDを入力します。たとえば、mySkinFamily-v1.2.androidです。

- 拡張対象: 拡張する親スキンの名前を入力します。たとえば、カスタム・スキンでmobileAlta-v1.4スキンを拡張する場合は、mobileAlta-v1.4と入力します。

- スタイルシート名: スタイルシートの名前を入力または選択します。

5. ファイルmaf-skins.xmlを保存します。

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. プロジェクト・エクスプローラで、「アプリケーション・プロジェクト」→「src」→「META-INF」の順に展開し、maf-skins.xmlをダブルクリックしてXMLエディタで開きます。

2. 「設計」タブに切り替えます。skinタグを選択し、右クリックします。「子を追加」→「version」を選択します。

3. 「version」を右クリックし、「子を追加」→「default」を選択します。第7.5項「MAFスキンのバージョニング」に示すように、maf-config.xmlファイルの<skin-version>要素に値が指定されていないときアプリケーションでスキンのこのバージョンを使用する場合には、defaultタグを選択し、「コンテンツ」列に移動し、defaultの値をtrueとして設定します。

4. skinタグの下のnameタグを選択し、「コンテンツ」列に進みます。「名前」フィールドの値を入力します。たとえば、これがスキンの最初のバージョンである場合はv1と入力します。

5. ファイルmaf-skins.xmlを保存します。

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

スキン用に構成するバージョン情報は、実行時にアプリケーションでスキンが適用されるときに、プラットフォーム値およびデバイス値より優先されます。実行時に、MAFアプリケーションでは、プラットフォーム固有のスキンが適用される前にデバイス固有のスキンが適用されます。スキンのバージョン情報が指定されている場合、アプリケーションでは最初に、指定したスキンのバージョン値と一致するスキンを検索します。スキン・バージョン値およびデバイス値と一致するスキンが見つかると、アプリケーションではこのスキンが適用されます。指定したスキン・バージョンのスキンがデバイス固有のスキン内で見つからなかった場合、アプリケーションでは指定したバージョンのスキンをプラットフォーム固有のスキン内で検索します。使用可能なプラットフォーム固有のスキン内で、指定したバージョンと一致するスキンが見つからない場合、アプリケーションではベース・スキンを検索します。

次の例は、3つのスキン(customFamily-v1.iphone5,3、customFamily-v2.iPhone5,3およびcustomFamily-v3.iPhone5,3)を参照する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ファイル内で定義される最後のスキンを使用します。次の例で、定義される最後のスキンはcustomFamily-v3.iPhoneです。

<?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-3 「包含」セクション

始める前に:

第11.2項「タスク・フローの作成」の説明に従って、MAFタスク・フローを作成します。スキンのCascading Style Sheet (CSS)ファイルを作成または追加します。CSSファイルを作成するには、ビュー・コントローラ・プロジェクトのViewContentフォルダを右クリックし、「ファイル」→「新規」→「その他」を選択し、フィルタにCSSと入力します。「Web」→「CSSファイル」を選択します。

アプリケーション機能にスタイルを追加するには:

1. MAF機能エディタを開きます。コンテンツ・タイプとして「AMXページ」を持つ機能があることを確認します。

2. 「アウトライン」セクションで、「機能」→機能名→「コンテンツ」→「機能ID」の順に展開し、「包含」を選択します。選択時に、「包含」セクションはエディタの右側に表示されます(図7-4を参照)。

図7-4 「スタイルシート」オプションの選択

3. 「参照」ボタンを選択し、「包含」セクションに含めるファイルを選択します。これによって、CSSスタイルシートまたはJavaScriptファイルの選択ダイアログが開きます(図7-5)。

4. ビュー・コントローラ・プロジェクトのViewContentディレクトリの下で、以前に作成したCSSファイルを選択します。

注意:
.cssファイルは、ビュー・コントローラ・プロジェクト内に配置する必要があり、アプリケーション・コントローラ・プロジェクト内に配置されている.cssファイルを含めることはできません。

図7-5 アプリケーション機能のCSSの選択

5. 変更をモバイル機能エディタに保存します。

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

maf-skins.xmlファイルで定義されるCSSファイル(次の例を参照)は、Apple iPhoneとiPadの異なる表示要件に適応するようにスキンを拡張する方法を示します。これらのスタイルは降順に適用されます。SkinningDemoサンプル・アプリケーションでは、アプリケーションを異なるデバイスにデプロイするときに、カスタマイズされたスタイルを適用できるようにする方法のデモが提供されています。この例を確認するには、「ファイル」→「新」→「MAFサンプル」を選択し、MAFサンプル・ページからSkinningDemoを選択します。

たとえば、iOSレベルでは、スタイルシート(次の例のmobileAlta)がiPhoneまたはiPadのどちらにも適用されます。デバイス固有のスタイル用には、iPhoneおよびiPadのスキンに対して<skin-id>要素を定義します。スキニングのデモ・アプリケーションでは、この要素によって定義されたカスタム・スキンの使用方法が示されています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skins">
<skin>
<id>mobileAlta-v1.4.iPhone5,3</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.4.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.4.iphone.css</style-sheet-name>
</skin>
<skin>
<id>mobileAlta-v1.4.iPad iPad4,1</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.4.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.4.ipad.css</style-sheet-name>
</skin>
<!--  Skin Additions -->
<skin-addition>
<skin-id>mobileAlta-v1.4.iPhone5,3</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.4.iPhone5,3</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition2.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.4.iOS</skin-id>
<style-sheet-name>skins/mystyles.ios.addition2.css</style-sheet-name>
</skin-addition>
</adfmf-skins>

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

スキンを拡張するかわりに、CSSファイルを既存のスキンに追加できます。

新しいスタイルシートをスキンに追加するには:

1. プロジェクト・エクスプローラで、「アプリケーション・プロジェクト」→「src」→「META-INF」フォルダの順に展開し、maf-skins.xmlファイルをダブルクリックしてXMLエディタで開きます。

2. 「設計」タブに切り替えます。adfmf-skinsタグを選択し、右クリックします。「子の追加」→「skin-addition」を選択します。

- skin-additionタグの下でskin-idタグを選択します。「コンテンツ」列に移動し、新しいスタイルを追加するスキンの識別子を入力します(たとえば、mobileAlta-v1.4)。

- skin-additionタグを右クリックし、「子を追加」→「style-sheet-name」を選択します。style-sheet-nameタグを選択し、「コンテンツ」列に進みます。ViewContentフォルダに対するcssファイルの相対パスを指定します。たとえば、ViewContent/css/myaddedcss.cssにcssファイルを作成した場合は、値としてcss/myaddedcss.cssを入力します。

3. ファイルmaf-skins.xmlを保存します。

注意:
DOM変更構造を使用するカスタム・スタイルを作成すると、MAFアプリケーションがハングする可能性があります。特に、displayプロパティでは、MAF AMXから変換されたHTMLでレンダリングに問題が発生します。このプロパティは、table、table-row、table-cellなどの値を使用してコンポーネントを表に変換しており、適切な親の表オブジェクト内に含まれていない表関連の構造が作成される可能性があります。この問題はアプリケーションのユーザー・インタフェース自体には表示されないことがありますが、ロギング・コンソールではSignal 10の例外によってレポートされます。

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

エンド・ユーザーが実行時に他のスキンを選択できるように、アプリケーションを構成できます。エンド・ユーザーが必要により適したスキンを使用して、アプリケーションをレンダリングできるようにする場合に、この機能を構成します。

図7-6では、ボタンを表示して、エンド・ユーザーが実行時にアプリケーションで使用されるスキンを変更できるようにすることで、この機能をどのように実装するかを示しています。ページ上のボタンを構成して、後からアプリケーションのモバイル・アプリケーション・エディタでskin-familyプロパティにより評価されるscope値を設定します。

図7-6 実行時におけるアプリケーションのスキンの変更(iOSの場合)

アプリケーションのモバイル・アプリケーション・エディタでskin-familyプロパティの値の更新を可能にするコンポーネントを公開することにより、エンド・ユーザーがアプリケーションのスキンを変更できるようにします。

エンド・ユーザーが実行時にアプリケーションのスキンを変更できるようにするには:

1. モバイル・アプリケーション・エディタでスキン・ファミリ・プロパティを設定するために使用する1つ以上のコンポーネントを構成するページを開きます。

2. エンド・ユーザーが実行時に多数の使用可能なスキンの1つを選択できるようにする多数のコンポーネント(ボタン・コンポーネントなど)を構成します(図7-6を参照)。
次の例に、図7-6のようにエンド・ユーザーが実行時に使用可能なスキンを選択できるようにする、amx:commandButtonコンポーネントの構成方法を示します。各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-1は、エンド・ユーザーが選択した値をとり、それをマネージドBean内のskinFamilyの値の設定に使用するメソッドを示しています。例7-1は、新しいスキンを使用するためにアプリケーションのすべての機能をリセットするメソッドも示しています。例7-1でも、第13.12項「データ変更イベントについて」で説明されているPropertyChangeSupportおよびPropertyChangeListenerオブジェクトが使用されます。

4. プロジェクト・エクスプローラで、「アプリケーション・リソース」パネルを展開し、「ディスクリプタ」→ADF Meta-INFノードの順に展開し、maf.config.xmlファイルをダブルクリックします。

5. maf-config.xmlファイルで、EL式を記述してスキン・ファミリを動的に評価します。
<skin-family>#{applicationScope.SkinBean.skinFamily}</skin-family>

例7-1 アプリケーションのスキンを変更するためのマネージド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.11 実行時に行われる処理: エンド・ユーザーによるアプリケーションのスキンの変更方法

実行時に、エンド・ユーザーは公開されたコンポーネントを使用して、別のスキンを選択します。このコンポーネントは、エンド・ユーザーが選択した値をマネージドBeanに発行し、次にこれがマネージドBeanのプロパティ(skinFamily)の値を設定します。実行時に、maf-config.xmlファイルの<skin-family>プロパティでは、EL式を使用してマネージドBeanから値を読み取ります。また、例7-1のマネージドBeanは、新しく指定したスキンを使用するアプリケーションに機能を再ロードします。

ヒント:
<skin-family>プロパティと同様に、EL式を使用して、実行時にmaf-config.xmlファイルの<skin-version>プロパティの値を設定できます。

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

この章では、機能アーカイブ(FAR)ファイルの概要と、これらのファイルにアプリケーション機能のコンテンツをパッケージ化して、1つ以上のMAFアプリケーションで再利用する方法について説明します。

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

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

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

- 第8.3項「FARの追加時に行われる処理」

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

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のタスク・フローは、タスク・フロー・コール・アクティビティのターゲットにすることはできません。

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

FARをインポートして、MAFアプリケーションからその機能にアクセスできるようにすることができます。

始める前に:

アプリケーション機能を機能アーカイブ・ファイルとしてデプロイします(第27.6.2項「機能アーカイブのデプロイ方法」を参照)。

アプリケーション機能コンテンツをMAFアプリケーションに追加するには:

1. プロジェクト・エクスプローラで、最上位のアセンブリ・プロジェクトのフォルダを展開し、MAFフォルダを展開します。

2. 「MAFアプリケーション・エディタ」をダブルクリックして開きます。

3. 機能アーカイブ・フォルダを右クリックし、「新」→「機能アーカイブ」を選択します。

4. 「URI」フィールドの「参照」ボタンをクリックして、モバイル機能のアーカイブ場所ダイアログを開き、FARを配置できるURIを入力します。OEPEによって、選択したファイルに機能の定義が含まれているかどうか、および場所がアクセス可能かどうかが検証されます。

5. URIを指定し、OEPEによってそれが確認されたら、「OK」をクリックします。

8.3 FARの追加時に行われる処理

MAFアプリケーションにFARを追加した後に行われる処理は、次のとおりです。

- 図8-1に示すように、FARがMAFアプリケーション・エディタに表示されます。

図8-1 MAFアプリケーションにインポートされた機能アーカイブ

- JARに含まれるmaf-feature.xmlファイルで宣言されたすべてのアプリケーション機能は、アプリケーションで使用できるようになります(図8-2を参照。ドロップダウンには、JAR内の使用可能なアプリケーション機能のIDと、アプリケーション内で定義済のIDが表示されています)。

図8-2 利用可能なFAR機能

- 機能アーカイブJARにあるconnections.xmlファイル内の情報は、使用するアプリケーションのconnections.xmlファイルにマージされます。競合がある場合は、「ログ」ウィンドウに表示されます。

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

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.6項「MAFアプリケーションでのプラグインの使用方法」

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

MAFには様々なCordovaプラグインがパッケージ化されています。MAFアプリケーションはこれらのプラグインを使用してデプロイ先のデバイスと対話できます。コア・プラグインは、MAFに用意されているデフォルトのプラグインです。これらのプラグインは、MAFアプリケーション・エディタで表示します。たとえば、MAFアプリケーションでデバイスの電子メール機能やコンタクト先機能へのアクセスに使用する電子メールプラグインやコンタクト先プラグインなどがあります。

Android、iOSおよびWindowsプラットフォームで使用されるCordovaバージョンは、MAFアプリケーション・エディタで外部プラグインを選択して表示します。

各プラグインの説明を表示するには、「コア・プラグイン」リスト(図9-1を参照)でプラグインを選択します。新規作成したMAFアプリケーションでは、1つのコア・プラグイン(ネットワーク情報プラグイン)のみがデフォルトで有効になっています。第9.2項「MAFアプリケーションでのコア・プラグインの有効化」の説明に従って、これらのコア・プラグインを有効にします。

注意:
iOSデバイス上のすべてのアプリケーションにネットワーク・アクセスがデフォルトで許可されます。この動作は変更できません。Androidデバイスにデプロイされたアプリケーションでネットワーク・アクセスが不要な場合は、ネットワーク情報プラグインを無効にします。ネットワーク情報プラグインは、Androidエミュレータまたはデバイス上で実行されているアプリケーションのリモート・デバッグを容易にする場合は有効にする必要があります。

MAFに用意されているデフォルトのコア・プラグインではMAFアプリケーションの要件を満たさない場合は、追加プラグインを登録できます。詳細は、「カスタムCordovaプラグイン開発の概要」(http://blogs.oracle.com/mobile/entry/introduction_to_custom_cordova_plugin)および第9.3項「MAFアプリケーションでの追加プラグインの登録」を参照してください。MAFアプリケーションについてコア・プラグインを有効にするか、または任意の追加のプラグインを登録した場合は、プラグインの機能にアクセスするアプリケーション機能のコンテンツを作成します。詳細は、第9.6項「MAFアプリケーションでのプラグインの使用方法」を参照してください。

MAFアプリケーションのデプロイメントは、追加プラグインの登録後、次の理由で失敗する場合があります。

- MAFアプリケーションが使用するプラグイン間でファイル名の競合があります。

- 登録した追加プラグインは、適切に機能するために依存プラグインが必要です。

詳細は、第9.4項「MAFアプリケーション組込みプラグインのデプロイ」を参照してください。

以前のリリースのMAFで作成したMAFアプリケーションを移行する場合は、アプリケーションで使用されているすべてのプラグインをMAFアプリケーション・エディタに登録する必要があります。詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールの以前のリリースからのプラグインの移行に関する項を参照してください。

図9-1 MAFアプリケーション・エディタのプラグイン

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

新規作成したMAFアプリケーションでは、1つのコア・プラグイン(ネットワーク情報プラグイン)のみがデフォルトで有効になっています。他のコア・プラグインを有効または無効にして、関連するデバイスの機能にMAFアプリケーションがアクセスできるようにしてください。

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

MAFアプリケーション・エディタを使用してコア・プラグインを有効にします。

MAFアプリケーションでコア・プラグインを有効にする手順:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクト・フォルダを展開し、次にMAFを展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

2. 「アウトライン」の下のエディタで、「コア・プラグイン」を展開してプラグイン有効化を選択します。アプリケーションに対してすでに有効化されているプラグインがリストされます。

3. をクリックしてモバイル・プラグイン選択ダイアログを開き、使用するコア・プラグインを選択します。「OK」をクリックします。
たとえば、MAFアプリケーションでSMSメッセージを送信できるようにするには、SMSプラグインを選択します。

4. MAFアプリケーション・エディタのプラグイン有効化領域でコア・プラグインが選択された状態で、そのプラグインをAndroidまたはiOS (あるいはその両方)で使用できるように選択します。変更を保存します。
メモを追加することもできます(プラグインは有効になっているがそれに関連付けられた機能がないなど)。

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

MAFアプリケーション・エディタでコア・プラグインを有効にすると、そのプラグインがエディタのプラグイン有効化にリストされます。プラグイン有効化領域の「使用を宣言している登録された機能」で、選択されたプラグインを使用しているアプリケーションの機能を確認できます。例9-1に、電子メールおよびネットワーク情報の各プラグインが有効になっている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="cordova-plugin-network-information"/>
<core-cordova-plugin id="c2" pluginId="com.oracle.maf.email"/>
</cordova-plugins>
</maf-plugins>

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

MAFに用意されたコア・プラグインでは提供されていない機能がMAFアプリケーションで必要な場合は、MAFアプリケーションに追加プラグインを登録します。

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

MAFアプリケーション・エディタを使用して、MAFアプリケーションで使用する追加プラグインを登録します。

開始する前に、アプリケーション、およびアプリケーションに登録されるプラグインが同じドライブに格納されていることを確認します。たとえば、Windows環境でC:ドライブにアプリケーションが格納されている場合、そのアプリケーションに登録するプラグインもC:ドライブに格納する必要があります。これにより、OEPEでは、相対パスを使用して、プラグインがアプリケーションに正常に登録されます。

MAFアプリケーションに追加プラグインを登録するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクト・フォルダを展開し、次にMAFを展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

2. 「アウトライン」の下のエディタで、「外部プラグイン」を右クリックして「新」→外部Cordovaプラグインを選択します。

3. 「URI」にプラグインの場所を入力します。をクリックしてモバイル・プラグインの場所ダイアログを開きます。Eclipseワークスペース・コンテナを入力するか、プラグインを含む外部フォルダに移動します。

4. URIのコンテンツが変更されている場合にプラグインを再検査して情報を更新するには、をクリックします。これにより、現在のプラグインのメタデータから使用可能な情報が取得されます。次のものが含まれます。

- ID

- 名前

- 説明

- バージョン

- プラットフォームのサポート。これは、必要に応じてプラットフォームの可用性をオーバーライドするように編集できます。

- メモ。アプリケーションに登録した履歴を確認しやすくするなど、様々な目的で情報を追加できます。

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

MAFアプリケーションで使用するプラグインのソース・ファイルを選択すると、OEPEによってアプリケーションのmaf-plugins.xmlファイルが編集され、MAFアプリケーションで有効なプラグインを特定するエントリが追加されます。例9-2は、MAFアプリケーションにグローバリゼーション・プラグイン(図9-2を参照)が登録されている場合のmaf-plugins.xmlファイル内のエントリを示したものです。

図9-2 MAFアプリケーション・エディタの追加プラグイン

例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="cordova-plugin-network-information"/>
<cordova-plugin id="c2" pluginId="cordova-plugin-globalization"
path="../../../../CordovaPlugins/cordova-plugin-globalization/">
<platform id="p1" name="android" enabled="true"/>
<platform id="p2" name="ios" enabled="true"/>
<platform id="p3" name="windows" 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またはWindowsのデプロイメント構成を使用したデプロイメント

Android、iOSまたはWindowsのデプロイメント構成を使用したデプロイメントでは、OEPEにより、アプリケーションを構築およびデプロイするツールが起動されます。次に、これらのツールがCordovaプラグイン・ツールを起動して、構成済のプラグインをそのソースの場所からデプロイメント・フォルダにインストールします。

プラグイン間における名前の競合の解決

MAFアプリケーションで使用されている複数のプラグインに同じ名前のリソース・ファイルが含まれている場合、名前の競合が原因でデプロイメントに失敗する可能性があります。たとえば、MAFアプリケーションで2つのプラグインを使用し、両方のリソース・ファイルがarrays.xmlである場合、デプロイメントは失敗します。

このような名前の競合を解決するには、他のプラグインのリソース・ファイル名と競合しているプラグインのリソース・ファイル名を変更します。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アプリケーションで使用する追加プラグインに必要なプラグイン(依存プラグイン)が検出されないと、デプロイメントに失敗する場合があります。このシナリオは、ファイアウォールの内側で作業している場合に発生する可能性があります。デプロイメント時には、OEPEにより、プラグインの依存性を管理する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ファイルにマージされます。OEPEでは、マージに関する情報を「メッセージ」ウィンドウに記録します。

FARからインポートするプラグインがすでにコンシューマ・アプリケーションのmaf-plugins.xmlファイルに存在する場合、プラグインはアプリケーションに存在するためマージされないというメッセージがOEPEによってログに記録されます。

FARからインポートするプラグインがコンシューマ・アプリケーションのmaf-plugins.xmlファイルに存在しない場合、OEPEはそのプラグインをアプリケーションのmaf-plugins.xmlファイルに追加します。このシナリオでは、第9.3項「MAFアプリケーションでの追加プラグインの登録」の説明に従って、新しくインポートしたプラグインへのパスを設定する必要があります。

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

MAFアプリケーションでプラグインを登録する、またはコア・プラグインを有効にすると、MAFアプリケーションでプラグインを使用するコンテンツを作成できます。

Java、MAF AMXページおよびローカルHTMLからプラグインを起動する方法の詳細は、「カスタムCordovaプラグインのMAFアプリへの統合」(http://blogs.oracle.com/mobile/entry/integrating_a_custom_cordova_plugin)を参照してください。

BarcodeDemoサンプル・アプリケーションでは、このタスクを実現する方法も示しています。

図9-3 プラグインにアクセスするためのプラットフォーム固有コンテンツ

図9-3は、BarcodeDemoサンプル・アプリケーションの実行時にエンド・ユーザーのデバイス上にレンダリングされるMAF AMXページのボタン(Scan)を示しています。このボタンは、管理対象Beanのメソッドを起動し、その管理対象のBeanメソッドは、BarcodeScannerプラグインをコールするJavaScript関数を起動します。

図9-4 プラグインにアクセスする管理対象Beanのメソッドを起動するコマンド・ボタン

例9-4に、BarcodeDemoサンプル・アプリケーションから抽出したいくつかのコードを示します。

BarcodeDemoサンプル・アプリケーション以外に、MAFアプリケーションで追加プラグインを使用する方法を示すその他のサンプル・アプリケーションとして、BeaconDemoおよびDatePickerがあります。これらのサンプル・アプリケーションの入手方法や使用方法の詳細は、付録E「サンプルのMAFアプリケーション」を参照してください。

例9-4 バーコード・スキャナ・プラグインの使用方法

<!--  The following code snippet from the scanner.amx file shows how the Scan button invokes the scanBarcode method in the managed bean -->
<amx:commandButton text="Scan" id="cl2" actionListener="#{viewScope.BarcodeBean.scanBarcode}"/>

<!--  The following code snippet from the BarcodeBean.java file shows how the scanBarcode managed bean method invokes a JavaScript function -->
public void scanBarcode (ActionEvent event)
{
// Invokes a JavaScript function named ”scanBarcodeFromJavaBean”
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.getFeatureId(),
"scanBarcodeFromJavaBean",
new Object[] { });
}

<!--  The following code snippet from the scanner.js file shows how the JavaScript function accesses the barcode scanner and sets the resulting value in a managed bean field.-->
function scanBarcodeFromJavaBean(options)
{
cordova.plugins.barcodeScanner.scan(
function(result)
function onSuccess(result) {
adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeError}",
"value": ""},
function() {},
function() {});

adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeResult}",
"value": result.text},
function() {},
function() {});

adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeFormat}",
"value": result.format},
function() {},
function() {});

adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeCancelled}",
"value": result.cancelled == 1 ? "Yes" : "No"},
function() {},
function() {});
}

function onError(error) {
adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeError}",
"value": "ERROR: " + error.text},
function() {},
function() {});
}

// Callable externally
scanBarcodeFromJavaBean = function() {
cordova.plugins.barcodeScanner.scan(onSuccess, onError);
}

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

この章では、MAFアプリケーション・エディタとMAF機能エディタを使用してモバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義し、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

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

- 第10.1項「MAFアプリケーションのライフサイクル・リスナーの概要」

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

- 第10.3項「ライフサイクル・リスナー登録時の処理」

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

ライフサイクル・リスナーは、アプリケーションの固有のイベントに応じて実行されるコードを記述するために便利な場所です。MAFは、アプリケーションまたはアプリケーション機能イベントに応じたコードを記述できるライフサイクル・リスナーを備えています。アプリケーション・ライフサイクル・リスナー・メソッドの標準的な実装としては、第19章「MAF AMXでのローカル・データベースの使用方法」に示されているように、アプリケーションの起動時にアプリケーションのデータベースを初期化するコードを記述するか、または第29.5.6項「実行時の名前付き接続の接続属性の更新方法」に示されているように、URLパラメータからセキュリティ構成を更新します。

MAFは、イベント通知と通信するために実装できる次の2つのインタフェースを備えています。

- oracle.adfmf.application.LifeCycleListener
このインタフェースには、アプリケーション・ライフサイクル・リスナーが実装する必要のある次のメソッドを指定します。

- activate()

- deactivate()

- start()

- stop()

- oracle.adfmf.feature.LifeCycleListener
このインタフェースには、機能ライフサイクル・リスナーが実装する必要のある次のメソッドを指定します。

- activate()

- deactivate()

ライフサイクル・リスナーを作成するには、適切なインタフェースを実装するJavaクラスを作成し、第10.2項「MAFアプリケーションまたはアプリケーション機能のライフサイクル・リスナーの登録」に示されているように、MAFアプリケーションの実装を登録します。

新規作成するMAFアプリケーションは、図10-1に示されているように、アプリケーション・プロジェクトにapplication.LifeCycleListenerImpl.javaクラスをデフォルトで作成することによって、oracle.adfmf.application.LifeCycleListenerインタフェースを実装します。

図10-1 アプリケーション・ライフサイクル・リスナーの実装

アプリケーション・ライフサイクル・リスナーは、匿名ユーザーによって実行されます(つまり、そのリスナーのメソッドにはどのユーザーも関連付けられず、セキュアなWebサービスもコールされません)。

表10-1は、アプリケーションの起動時、シャットダウン時および休止時にアプリケーション・ライフサイクル・メソッドをMAFが起動する特定の時刻を示しています。

表10-1 MAFによるアプリケーション・ライフサイクル・メソッドの起動タイミング

メソッド

タイミング

いつコールされるか

使用方法

start

MAFアプリケーションがアプリケーション機能を完全にロードした後、ユーザーに最初のアプリケーション機能またはSpringboardを表示する直前にコールされます。これはブロック化コールです。

アプリケーションの処理が開始されたとき。

次の使用方法があります。

- MAFアプリケーションの更新があるかどうかを確認する。

- ローカル・データベースにデータをダウンロードするよう、リモート・サーバーにリクエストする。

stop

MAFアプリケーションがシャットダウンを開始するときにコールされます。

アプリケーションの処理が終了したとき。

次の使用方法があります。

- 任意のリモート・サービスからログオフする。

- アプリケーションが終了する前に、データの変更をサーバーにアップロードする。

activate

MAFアプリケーションを背景にある(休止)状態からアクティブ化するときにコールされます。これはブロック化コールです。

startメソッドがコールされた後。

次の使用方法があります。

- キャッシュ・ストアを読み取り、再移入する。

- Webサービス・リクエストを処理する。

- 必要なリソースを取得する。

deactivate

MAFアプリケーションを非アクティブ化し、背景に移動(休止)するときにコールされます。これはブロック化コールです。

stopメソッドがコールされる前。

次の使用方法があります。

- リストア可能な状態を書き込む。

- データベース・カーソルとデータベース接続を閉じる。

表10-2は、機能のアクティブ化および非アクティブ化時にMAFが機能ライフサイクル・メソッドを起動する特定のタイミングを示しています。

表10-2 MAFによる機能ライフサイクル・メソッドの起動のタイミング

メソッド

タイミング

いつコールされるか

使用方法

activate

現在のアプリケーション機能がアクティブ化される前にコールされます。

ユーザーがMAFアプリケーションの起動後に初めてアプリケーション機能を選択したとき、またはアプリケーション機能が再選択されたとき(つまり、フォアグラウンドに戻されたとき)にコールされます。

次の使用方法があります。

- applicationScope変数を読み取る。

- 最初のMAF AMXビューにおける現在の行を設定する。

deactivate

次のアプリケーション機能がアクティブ化される前、またはアプリケーション機能が終了する前にコールされます。

ユーザーが別のアプリケーション機能を選択したときにコールされます。

たとえば、deactivateイベントを使用して、applicationScope変数や、次のアプリケーション機能が使用するその他の状態情報を記述できます。

oracle.adfmf.application.LifeCycleListenerインタフェースおよびoracle.adfmf.feature.LifeCycleListenerインタフェースの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

LifecycleEventsサンプル・アプリケーションは、アプリケーションおよび機能の両方のインタフェースを実装するリスナー・クラスの宣言を示しています。これらのリスナー・クラスはMAFアプリケーションのmaf-application.xmlファイルとmaf-feature.xmlファイルに登録されます。このサンプル・アプリケーションおよびその他のサンプル・アプリケーションの詳細は、第1.4項「サンプルのMAFアプリケーション」を参照してください。

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

MAFアプリケーション・エディタを使用してアプリケーション・ライフサイクル・リスナーを登録し、MAF機能エディタを使用して機能ライフサイクル・リスナーを登録します。

アプリケーション・ライフサイクル・リスナーを登録するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを展開してMAFを展開し、MAFアプリケーション・エディタをダブルクリックします。

2. 「アウトライン」でアプリケーション・ノードを選択し、「アプリケーション」タブの「ライフサイクル・イベント・リスナー」フィールドで、oracle.adfmf.application.LifeCycleListenerインタフェースを実装するJavaクラスを指定します。

注意:
ライフサイクル・イベント・リスナーのラベルにマウス・ポインタを置くと、リスナー・クラスを説明するツールチップが表示されます。

図10-2 アプリケーション・イベント・リスナーの取得

アプリケーション機能ライフサイクル・リスナーを登録する手順:

1. プロジェクト・エクスプローラで、ビュー・プロジェクトを展開してMAFを展開し、MAF機能エディタをダブルクリックします。

2. 機能ライフサイクル・リスナーを登録する機能を「機能」リストで選択します。

3. 「ライフサイクル・イベント・リスナー」フィールドに、oracle.adfmf.feature.LifeCycleListenerインタフェースを実装するJavaクラスを指定します。

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

デフォルトでは、作成するMAFアプリケーションは、アプリケーションのアプリケーション・プロジェクトでの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>

機能ライフサイクル・リスナーを登録すると、OEPEでは、listener-class属性用のmaf-feature.xmlファイルにエントリを書き込みます。次の例は、付録E「サンプルの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>

11 MAF AMXページの作成

この章では、ビューとタスク・フローを含む、MAF AMXアプリケーション機能の作成方法について説明します。

この章には次の項が含まれます:

- 第11.1項「MAF AMXアプリケーション機能の概要」

- 第11.2項「タスク・フローの作成」

- 第11.3項「ビューの作成」

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

MAF AMXは、サポートされるすべてのプラットフォームで動作が同一となるアプリケーション機能を作成できる一連のUIコンポーネントを提供するモバイル・アプリケーション・フレームワーク(MAF)内のサブフレームワークです。MAF AMXでは、ページ・エディタへのドラッグにより、UIコンポーネントを宣言的に使用できます。一般的なMAF AMXアプリケーション機能には、様々なパス経由でナビゲートできる、相互に接続されたいくつかのページが含まれます。

注意:
モバイル・デバイスのインタフェースを開発する際には、画面領域が非常に限られているということを常に意識する必要があります。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

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

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

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

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

注意:
MAF機能エディタを使用してアプリケーションの一部としてオブジェクトを作成する場合、OEPEにより、後で変更できないオブジェクトのIDが作成されます。

11.2 タスク・フローの作成

タスク・フローにより、MAF AMXページ間のナビゲーションを定義できます。OEPEのアプリケーション・ワークスペース(第2.3項「MAFアプリケーションの作成」を参照)を使用して、タスク・フローを設計することにより、MAF AMXアプリケーション機能のユーザー・インタフェースの作成を開始できます。MAF AMXでは、ナビゲーション・ケースおよびルールを使用してタスク・フローを定義します。これらの定義は、task-flow-definition.xmlというデフォルト名のファイルに格納されています(第11.2.3項「task-flow-definition.xmlファイルに関する必知事項」を参照)。

NavigationというMAFサンプル・アプリケーション(「ファイル」→「新」→「MAFサンプル」を選択してから「Navigation」を選択)には、循環ナビゲーション、ルーターなど様々なナビゲーション技術の使用方法が示されています。

MAFでは、バインド・タスク・フローとバインドなしタスク・フローの両方を持つMAF AMXアプリケーション機能を作成できます。11.2.12項「バインド・タスク・フローとバインドなしタスク・フローに関する必知事項」で説明しているとおり、バインド・タスク・フローはタスク・フロー定義とも呼ばれ、アプリケーションの再利用可能な部分を表します。MAFでは、バインド・タスク・フローにはエントリ・ポイントが1つありますが、終了ポイントはありません。バインド・タスク・フローには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。バインド・タスク・フローのその他の特性には、入力パラメータの受け取り(第11.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照)と、戻り値の生成(第11.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照)が含まれます。

独自のアプリケーション機能のバインド・タスク・フローを作成するには、MAF AMXタスク・フロー・デザイナを使用します。このツールにはダイアグラマ(第11.2.4項「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)が含まれており、ここで、パレットからアクティビティと制御フロー(第11.2.2項「タスク・フロー・アクティビティおよび制御フローに関する必知事項」を参照)をドラッグ・アンド・ドロップすることにより、タスク・フローを構築します。その後、「プロパティ」ウィンドウを使用して、これらのアクティビティとそれらの間の遷移を定義します。

タスク・フローがすでに作成されている場合を除き、MAFは、新しいMAF AMXページが作成されると、自動的にデフォルトのバインドなしタスク・フロー(adfc-mobile-config.xmlファイル)を生成します。

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

タスク・フローはタスク・フロー自体と、複数のアクティビティ、そしてそれらのアクティビティ間の制御フロー・ルールで構成されています(第11.2.2項「タスク・フロー・アクティビティおよび制御フローに関する必知事項」を参照)。通常、アクティビティの多くがフロー内の異なるページを示すビュー・アクティビティです。たとえば、ページのレンダリング前などにメソッドや操作をコールする必要がある場合は、メソッド・コール・アクティビティをそのアクティビティから次の適切なアクティビティまでの制御フロー・ケースとともに使用します。別なタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティを使用します。フローにブランチ化が必要な場合は、ルーター・アクティビティを使用します。バインド・タスク・フローの最後で、リターン・アクティビティを使用してフローを終了し、そのバインド・タスク・フローをコールしたフローに制御を戻します。

パレットで、タスク・フロー要素をドラッグしてフロー構造内に配置することで、独自のMAF AMXアプリケーション機能のバインド・タスク・フローを宣言的に作成できます。それらの要素を相互に関連付けて配置すると、OEPEは、ナビゲーションがMAF AMXアプリケーション機能で動作するために必要なXMLメタデータをtask-flow-definition.xmlファイル(デフォルト)に作成します。タスク・フロー定義ファイルのソースを編集することもできます。

始める前に:

タスク・フローを設計するには、MAFアプリケーションにビュー・コントローラ・プロジェクト・ファイル(第2章「MAFアプリケーション開発のスタート・ガイド」を参照)が含まれている必要があります。

OEPEでタスク・フローを作成するには、MAF機能エディタでバインド・タスク・フローを作成します。詳細は、第5.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」を参照してください。

図11-1 MAF機能エディタでのタスク・フロー・ファイルの作成

また、「ソース」エディタでページを直接編集して、タスク・フロー・ファイルに手動で要素を追加することもできます。「ソース」エディタでファイルを開くには、「ソース」タブをクリックします。

注意:
手動でタスク・フロー・ファイルを編集する場合は、MAF AMXページ、JavaScriptファイルおよびCSSファイルを参照するすべてのドキュメント・ファイル名で大文字と小文字が区別されることに注意してください。
特殊文字(アンダースコアなど)がファイル名に使用されている場合は、モバイル・デバイスの仕様を参照して、その文字の使用がサポートされているかどうかを確認する必要があります。

MAF AMXアプリケーション機能のナビゲーションを定義したら、次はページを作成したり、ナビゲーションを使用するコンポーネントを追加したりできます。ページでのナビゲーション・コンポーネントの使用の詳細は、第11.2.6項「制御フローの定義方法」を参照してください。

MAF AMXアプリケーション機能のタスク・フローを定義すると、ビュー・ファイルをダブルクリックしてMAF AMXビューにアクセスできます。詳細は、第11.3項「ビューの作成」を参照してください。

11.2.2 タスク・フロー・アクティビティおよび制御フローに関する必知事項

タスク・フローは、アクティビティ、およびアクティビティ間の遷移を定義する制御フロー・ケースで構成されます。

MAFタスク・フロー・デザイナは表11-1に示すアクティビティをサポートしています。

表11-1 タスク・フロー・アクティビティ

アクティビティ

説明

表示

MAF AMXページを表示します。詳細は、第11.2.5.1項「ビュー・アクティビティの追加」を参照してください。

メソッド・コール

メソッド(通常はマネージドBean上のメソッド)を起動します。メソッド・コール・アクティビティは、MAF AMXアプリケーション機能の制御フローの任意の位置に配置し、制御フロー・ルールに基づいてロジックを起動できます。詳細は、第11.2.5.3項「メソッド・コール・アクティビティの追加」を参照してください。

タスク・フローに含まれるメソッド・コールに渡すパラメータを指定することもできます。これらには、MAF AMXタスク・フロー内メソッド・コール・アクションの標準パラメータが含まれます。デザイナを使用してメソッドを生成する場合、デザイナにより必要な引数およびタイプが追加されます。

実行時にタスク・フローのメソッド・コールのパラメータを定義し、メソッド・コール自体にパラメータを渡してこれを使用できます。詳細は、「タスク・フロー・アクティビティの追加および使用方法」の部を参照してください。

ルーター

式言語(EL)式を評価し、その式の値に基づいて結果を戻します。その後、このような結果を使用して、タスク・フローの他のアクティビティに制御をルーティングします。詳細は、第11.2.5.2項「ルーター・アクティビティの追加」を参照してください。

タスク・フロー・コール

バインドなしタスク・フローまたはバインド・タスク・フローからバインド・タスク・フローをコールします。タスク・フロー・コール・アクティビティでは、同じMAF AMXアプリケーション機能内にあるバインド・タスク・フローをコールできますが、別のMAF AMXアプリケーション機能またはライブラリに追加された機能アーカイブ・ファイル(FAR)からバインド・タスク・フローをコールすることもできます。

タスク・フロー・コール・アクティビティは、タスク・フロー入力パラメータおよび戻り値をサポートします。

詳細は、第11.2.5.4項「タスク・フロー・コール・アクティビティの追加」を参照してください。

タスク・フロー・リターン

アプリケーションの制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターンは、バインド・タスク・フロー内でのみ使用できます。詳細は、第11.2.5.5項「タスク・フロー・リターン・アクティビティの追加」を参照してください。

MAFタスク・フロー・デザイナは表11-2に示す制御フローをサポートしています。

表11-2 制御フロー

制御フロー

説明

制御フロー・ケース

MAF AMXアプリケーション機能内で、あるアクティビティから次のアクティビティに制御を渡す方法を指定します。詳細は、第11.2.6.1項「制御フロー・ケースの定義」を参照してください。

ワイルドカード制御フロー・ルール

IDがワイルドカード式と一致するアクティビティからの制御フロー・ケースを表します。詳細は、第11.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照してください。

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

task-flow-definition.xmlファイルを使用すると、タスク・フロー・コンポーネントをパレットからダイアグラマにドラッグ・アンド・ドロップすることで、ビュー(MAF AMXページ)間の相互作用を設計できます。

図11-2に、task-flow-definition.xmlというタスク・フロー・ファイル例を示します。このファイルでは、制御フローはタスク・フロー・コールCallFlowによってCall1からCall2に方向付けられます。(第11.2.7項「「戻る」ナビゲーションのMAFサポートに関する必知事項」を参照)。

図11-2 タスク・フロー・ファイル

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

MAFタスク・フロー作成ユーティリティを使用してタスク・フローを作成すると、図11-2に示すように、タスク・フロー・ダイアグラムおよびパレットが自動的に表示されます。タスク・フロー・ダイアグラムは、そこにパレットからのアクティビティおよびタスク・フローをドラッグ・アンド・ドロップできるビジュアル・エディタです。図11-2に示す「ソース」タブをクリックしてタスク・フロー・ファイルを直接編集することもできます。詳細は、第11.2.5項「タスク・フロー・アクティビティの追加および使用方法」を参照してください。

11.2.5 タスク・フロー・アクティビティの追加および使用方法

タスク・フロー・ダイアグラマを使用してパレットからオプションを選択し、アクティビティ、ビューおよび制御フローをドラッグ・アンド・ドロップします。

アクティビティをMAFタスク・フローに追加するには:

1. プロジェクト・エクスプローラで、タスク・フロー・ソース・ファイル(task-flow-definition.xmlなど)をダブルクリックし、タスク・フロー・ダイアグラムとパレットを表示します。ダイアグラマにはタスク・フロー・エディタが表示されます。「パレット」には、MAFタスク・フローで使用できるコンポーネントが自動的に表示されます。

2. アクティビティを「パレット」からダイアグラムにドラッグします。

注意:
各バインド・タスク・フローに関連付けられているデフォルトのアクティビティがあります。

11.2.5.1 ビュー・アクティビティの追加

タスク・フロー・アクティビティの主要なタイプの1つに、MAF AMXページを表示するビュー・アクティビティがあります。

タスク・フローのソース・ファイルにあるXMLメタデータでは、ビュー・アクティビティが物理MAF AMXページと関連付けられています。id属性ではビュー・アクティビティが識別されます。

タスク・フローのビュー・アクティビティは、実行中に相互に制御を受け渡すように構成できます。たとえば、あるビュー・アクティビティ(ビュー・アクティビティA)から次のビュー・アクティビティ(ビュー・アクティビティB)に制御を渡すには、ビュー・アクティビティAと関連付けられたページ上にコマンド・コンポーネント(ボタンやリンクなど)を構成できます。これを行うには、コマンド・コンポーネントのAction属性を、起動が必要なタスク・フロー・アクティビティ(前述の例のビュー・アクティビティB)に相当する制御フロー・ケースのfrom-outcomeに設定します。実行時に、エンド・ユーザーは、コマンド・コンポーネントを起動することで制御フロー・ケースを初期化します。UIコンポーネントのAction属性の定数値または動的値のいずれかを使用して、あるビュー・アクティビティから別のアクティビティに移動できます。

- コンポーネントのAction属性の定数値は、常に同じ制御フロー・ケースをトリガーするアクション結果です。エンド・ユーザーがコンポーネントをクリックすると、その制御フロー・ケースに指定されているアクティビティが実行されます。代替の制御フローはありません。

- コンポーネントのAction属性の動的値はマネージドBeanまたはメソッドにバインドされます。メソッド・バインディングにより返される値によって、次に起動する制御フロー・ケースが決定されます。たとえば、メソッドはページ上でユーザー入力を検証し、入力が有効な場合はある値を返し、入力が無効な場合は別の値を返します。これらの異なるアクション値はそれぞれ別個のナビゲーション・ケースをトリガーするため、アプリケーションが移動可能なターゲット・ページは2つのいずれかになります。

詳細は、第11.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

また、ターゲット・ビュー・アクティビティに制御を渡す前に、値が必ずtrueになるEL式を記述できます。タスク・フローにある制御フロー・ケースの<if>子要素の値としてEL式を記述します。

例11-1および例11-2に、ビュー・アクティビティ間で制御を渡した場合の処理内容を示します。

例11-1は、バインド・タスク・フローまたはバインドなしタスク・フローのXMLソース・ファイルに定義された制御フロー・ケースを示しています。

例11-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>

例11-2に示すように、Startビュー・アクティビティに関連付けられているMAF AMXページ上のボタンで、action属性としてtoOfficesが指定されます。エンド・ユーザーがボタンをクリックすると、制御フロー・メタデータでto-activity-idとして指定されたWesternOfficesアクティビティに制御フローが渡されます。

例11-2 ビュー・アクティビティで定義された静的ナビゲーション・ボタン

<amx:commandButton text="Go" id="b1" action="toOffices">

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

- 第11.2.5.1項「ビュー・アクティビティの追加」

- 第11.3.1.2項「MAF AMXページの作成」

前述のとおり、ビュー・アクティビティは、メタデータで、タスク・フローへの追加時に表示される実際のMAF AMXページに関連付けられています。ビュー・アクティビティは、「パレット」からドラッグ・アンド・ドロップすることによって追加します。「ダイアグラム」ウィンドウで「ビュー」アクティビティを右クリックして実際のMAF AMXページを作成し、次に表示されるダイアログ(図11-15「新しいMAFページ作成ダイアログ」を参照)でページの特性を定義できます。

バインド・タスク・フローを作成する場合、特定のアクティビティをデフォルト・アクティビティに指定できます(第11.2.12項「バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項」を参照)。それにより、バインド・タスク・フローの実行時は常にこの特定のアクティビティを最初に実行できます。デフォルトでは、OEPEはタスク・フローに追加した最初のアクティビティをデフォルトにします。別のアクティビティに変更する場合は、「ダイアグラム」ウィンドウで該当するアクティビティを右クリックし、「ページ定義の作成」を選択します(図11-3を参照)。

図11-3 デフォルト・アクティビティの定義

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

EL式の実行時の評価に基づいて、ルーター・アクティビティを使用し、制御をアクティビティにルーティングします。

各制御フローは、異なるルーター・ケースに対応できます。各ルーター・ケースでは、次の要素を使用して、制御が次にルーティングされるアクティビティを選択します。

- expression: 実行時の値がtrueまたはfalseになるEL式
ルーター・アクティビティは、trueを返すEL式に対応する結果を返します。

- outcome: EL式の値がtrueの場合にルーター・アクティビティから返される値
制御フロー・ケース上でルーター・ケースのoutcomeがfrom-outcomeと一致する場合は、制御フロー・ケースがポイントするアクティビティに制御が渡されます。ルーター・アクティビティのケースの値がtrueでない場合、またはルーター・アクティビティのケースが指定されていない場合は、ルーターの「デフォルト結果」フィールドで指定されているoutcomeが使用されます。

ルーティング条件をEL式で表すことができる場合は、ルーター・アクティビティの使用を検討してください(ルーター・アクティビティにより、タスク・フローの条件について、より詳しい情報を示すことができます)。

ルーター・アクティビティをダイアグラム上にドラッグすると、「プロパティ」ウィンドウを使用して式を作成し、その式の評価によりどの制御フロー・ルールに従うかを決定できます。「プロパティ」ウィンドウを使用して、ルーター・アクティビティの「アクティビティID」および「デフォルト結果」プロパティを構成し、ルーター・ケースをルーター・アクティビティに追加します。

「アクティビティID」属性を定義する場合は、タスク・フローのソース・ファイルにルーター・アクティビティを識別する値を記述します。

「デフォルト結果」属性を定義する場合は、どの制御フロー・ケースの値もtrueでないとき、または制御フロー・ケースが指定されていないときに、ルーター・アクティビティが制御を渡すアクティビティを指定します。

追加するルーター・ケースごとに、図11-4に示すように、「制御フロー・ケース」セクションの「追加」( + )をクリックして値を指定します。

図11-4 ルーター・アクティビティの構成

- 式: 実行時の値がtrueまたはfalseになるEL式。
たとえば、ビュー・アクティビティの入力テキスト・フィールドにある値を参照するには、次のようなEL式を記述します。

#{pageFlowScope.value=='view2'}

EL式がtrueを返す場合は、ルーター・アクティビティによって「結果」フィールドで指定した結果が呼び出されます。

- 結果: 「式」によって指定されたEL式がtrueを返す場合にルーター・アクティビティが呼び出す結果。
タスク・フロー・ダイアグラムの結果ごとに制御フロー・ケースまたはワイルドカード制御フロー・ルールを作成します。たとえば、制御フロー・ケースの結果ごとに、対応するfrom-outcomeがあることを確認します。

ルーター・アクティビティを使用して制御フローを構成する場合に、OEPEでは、ルーター・アクティビティのプロパティに指定した値に基づいて、タスク・フローのソース・ファイルに値を記述します。

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

メソッド・コール・アクティビティをダイアグラム上にドラッグすると、「新規オブジェクト」ダイアログを使用して、コールするメソッドを構成できます。

メソッド・コール・アクティビティを使用して、アプリケーション機能の制御フロー内のどこからでもMAF AMXアプリケーション機能ロジックを起動する、カスタム・メソッドまたは組込みメソッドをコールします。ページ表示前の初期化、ページ終了後のクリーンアップ、例外処理などのタスクを実行するメソッドを指定できます。

制御フロー・ケースを指定してメソッドの終了後に制御を渡すメソッドに対して結果を設定できます。結果は次のいずれかとして指定できます。

- fixed-outcome: 正常完了時に、メソッドから常に戻される単一の結果(例: success)。メソッドが正常に完了しないと結果は戻されません。メソッド・タイプがvoidの場合、fixed-outcomeを指定する必要があり、to-stringを指定することはできません。
この結果は、「プロパティ」ウィンドウの「固定結果」フィールドを設定することで定義します。

- to-string: trueとして指定されると、メソッドによって戻されたJavaオブジェクトに対してtoStringメソッドがコールされ、それに基づく結果が得られます。たとえば、toStringメソッドからeditBasicInfoが戻された場合、ナビゲーションはeditBasicInfoという名前の制御フロー・ケースに移動します。
この結果は、「プロパティ」ウィンドウの「toString()フィールドを設定することで定義します。

メソッド・コール・アクティビティは、「データ・コントロール」ウィンドウからタスク・フロー・ダイアグラム内のメソッド・コール・アクティビティにデータ・コントロール操作を直接ドロップして、既存のメソッドに関連付けることができます。また、メソッドおよび操作をタスク・フロー・ダイアグラムに直接ドラッグすることもでき、その場合、新しいメソッド・コール・アクティビティが自動的に作成されます。メソッドにEL式およびその他のオプションを指定できます。

メソッド・コールを構成する場合、デフォルト値を変更するには、そのアクティビティの識別子を「アクティビティID」フィールドで変更します。新規の値を入力すると、ダイアグラムのメソッド・コール・アクティビティの下に新しい値が表示されます。

「メソッド」フィールドには、コールするメソッドを識別するEL式を入力します。EL式のバインディング変数は、現在のバインディング・コンテナからバインディングを参照することに注意してください。バインディング変数を指定するには、バインディング・コンテナ定義またはページ定義を指定する必要があります。詳細は、第11.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

また、式ビルダーを使用してメソッドのEL式を作成することもできます。

- プロパティ・エディタから「メソッド」に「メソッド式ビルダー」を選択します。

- 「式ビルダー」ダイアログで、起動するメソッドにナビゲートして選択します。
メソッド・コール・アクティビティでマネージドBeanメソッドを起動する場合は、ダイアログでメソッド・コール・アクティビティをダブルクリックします。これによってダイアログが呼び出され、そこで起動するマネージドBeanメソッドを指定できます。

「プロパティ」ウィンドウの「パラメータ」セクションを使用して、メソッドのパラメータおよび戻り値を指定できます。メソッド・コール・アクティビティを既存のメソッドに関連付けることによってパラメータをまだ作成していない場合は、「追加」( + )をクリックし、次の内容を設定してパラメータを追加します。

- クラス: パラメータ・クラスを入力します。たとえば、java.lang.Doubleのように指定します。

- 値: パラメータの値を取得するEL式を入力します。次に例を示します。

#{pageFlowScope.shoppingCart.totalPurchasePrice}

- 戻り値: メソッドの戻り値を格納する場所を特定するEL式を入力します。次に例を示します。

#{pageFlowScope.Return}

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

タスク・フロー・コール・アクティビティを使用して、バインドなしタスク・フロー(第11.2.12.1項「バインドなしタスク・フロー」を参照)またはバインド・タスク・フロー(第11.2.12.2項「バインド・タスク・フロー」を参照)のいずれかからバインド・タスク・フローをコールできます。このアクティビティによって、同じまたは別のMAF AMXアプリケーション機能内にあるバインド・タスク・フローをコールできます。

コールされたバインド・タスク・フローでは、デフォルト・アクティビティが最初に実行されます。バインド・タスク・フロー・コールの数に制限はありません。たとえば、コール先のバインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそのバインド・タスク・フローからも次々にコールできるため、各タスク・フローがタスク間を結び付けるタスク・フロー・チェーンを作成できます。

バインド・タスク・フローにパラメータを渡すには、タスク・フロー・コール・アクティビティに入力パラメータの値を指定する必要があります。これらの値は、コール先のバインド・タスク・フローの入力パラメータ定義と一致している必要があります。詳細は、第11.2.5.4.2項「タスク・フロー・コール・アクティビティでの入力パラメータの指定」を参照してください。

注意:
タスク・フロー・コール・アクティビティの入力パラメータの値は、コール元のタスク・フロー内で値が取得される場所を指定します。
コール先のタスク・フローの入力パラメータの定義の値は、それが渡されたときにコール先のバインド・タスク・フローで値が格納される場所を指定します。

注意:
バインド・タスク・フローがタスク・フロー・コール・アクティビティに関連付けられると、バインド・タスク・フローで設定されている入力パラメータ定義に基づいて、入力パラメータが自動的にタスク・フロー・コール・アクティビティに挿入されます。したがって、実行する必要があるのは、タスク・フロー・コール・アクティビティの入力パラメータへの値の割当てのみです。

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

バインド・タスク・フローからコール元に戻り値が渡される方法は、入力パラメータが渡される方法と類似しています。詳細は、第11.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照してください。

タスク・フロー・コール・アクティビティを使用するには:

1. タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールします(第11.2.5.4.1項「タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール」を参照)。

2. バインド・タスク・フローにパラメータを渡す場合は、タスク・フロー・コール・アクティビティへの入力パラメータを指定します(第11.2.5.4.2項「タスク・フロー・コール・アクティビティへの入力パラメータの指定」を参照)。

11.2.5.4.1 タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール

コール側のバインドまたはバインド・タスク・フローまたはバインドなしタスク・フローにタスク・フロー・コール・アクティビティを追加し、バインド・タスク・フローをコールします。

バインド・タスク・フローをコールする手順:

1. ダイアグラム・ビューでバインド・タスク・フロー・ファイルを開きます。

2. パレットの「アクティビティ」ペインから、タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

3. 次のオプションのいずれかを選択して、コール先タスク・フローを識別します。

- 新しくドロップしたタスク・フロー・コール・アクティビティをダブルクリックして、新しいバインド・タスク・フローの設定を定義できる「MAFタスク・フローの作成」ダイアログを開きます。

- プロジェクト・エクスプローラから既存のバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップします。

- 起動するバインド・タスク・フローの名前がわかっている場合は、次の手順を実行します。

1. ダイアグラム・ビューで、「タスク・フロー・コール」アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストで「静的」を選択します。

3. 「ドキュメント」フィールドに、コールするバインド・タスク・フローのソース・ファイル名を入力します。

4. 「ID」フィールドには、コール先のバインド・タスク・フローのXMLソース・ファイルに含まれているバインド・タスク・フローIDを入力します(図11-5を参照)。

図11-5 バインド・タスク・フローを起動するタスク・フロー・コール・アクティビティ

- 起動するバインド・タスク・フローの名前がわからない場合、実行時のエンド・ユーザーによって異なる場合は、次の手順を実行します。

1. ダイアグラム・ビューで、「タスク・フロー・コール」アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストで「動的」を選択します。

3. 式ビルダーを使用して、「動的タスク・フロー参照」プロパティ・フィールドの値を設定します(実行時に起動するバインド・タスク・フローのIDを識別するEL式を記述します)。

11.2.5.4.2 タスク・フロー・コール・アクティビティでの入力パラメータの指定

タスク・フロー・コール・アクティビティとそのコール先のバインド・タスク・フローの間でパラメータをマップするには、まずコール先のバインド・タスク・フローの入力パラメータ定義を指定する方法をお薦めします。その後、プロジェクト・エクスプローラからバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップできます。タスク・フロー・コール・アクティビティの入力パラメータは、バインド・タスク・フローの入力パラメータ定義に基づいて自動的に作成されます。詳細は、第11.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

当然ながら、最初にタスク・フロー・コール・アクティビティに入力パラメータを指定することも可能です。最初に定義した場合にも、コール先のバインド・タスク・フローの入力パラメータ定義がタスク・フロー・コール・アクティビティに関連付けられた時点で、その入力パラメータ定義に基づいて自動的に置換されます。

コール先のバインド・タスク・フローをまだ作成していない場合にも、タスク・フロー・コール・アクティビティに入力パラメータを指定する方法は便利です。この時点で指定することで、バインド・タスク・フローのコール時にタスク・フロー・コール・アクティビティが最終的にマップされる予定の入力パラメータを特定できます。

入力パラメータを指定する手順:

1. ダイアグラム・ビューでタスク・フロー・ファイルを開き、「タスク・フロー・コール」アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「パラメータ」セクションを開き、「追加」( + )をクリックして、「入力パラメータ」リストで次のように新しい入力パラメータを指定します。

- 名前: 入力パラメータを識別する名前を入力します。

- 値: パラメータ値を識別するEL式を入力します。このEL式では、コール元のタスク・フロー内でパラメータ値が取得される場所を指定します。たとえば、次のようにEL式を入力します。

#{pageFlowScope.callingTaskflowParm}

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

3. 入力パラメータを指定すると、対応する入力パラメータ定義をコール先のバインド・タスク・フローに指定できます。詳細は、第11.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

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

タスク・フロー・リターン・アクティビティは、MAF AMXアプリケーション機能の制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターン・アクティビティは、バインド・タスク・フロー内でのみ使用できます。

タスク・フロー・リターン・アクティビティ・アイコンを囲むグレーの円は、そのアクティビティがバインド・タスク・フローの終了ポイントであることを示します。各バインド・タスク・フローには、ゼロから複数のタスク・フロー・リターン・アクティビティを指定できます。

各タスク・フロー・リターン・アクティビティには、コール元のタスク・フローに戻されるoutcomeを指定します。

起動するタスク・フローに戻されるoutcomeは、エンド・ユーザー・アクションによって異なります。起動元のタスク・フローによって次のアクションを決定するように、起動元のタスク・フローの制御フロー・ケースを構成できます。制御フロー・ケースの「結果(自)」プロパティをタスク・フロー・リターン・アクティビティのoutcomeからの戻り値に設定し、結果に基づくアクションを起動します。これにより、コール先タスク・フローからの戻り値に基づいて制御フローが決まります。

タスク・フロー・リターン・アクティビティを追加する手順:

1. ダイアグラム・ビューでバインド・タスク・フロー・ファイルを開きます。

2. パレットの「アクティビティ」ペインから、タスク・フロー・リターン・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

3. 「プロパティ」ウィンドウで、「一般」セクションを開き、「名前」フィールドに結果を入力します。
タスク・フロー・リターン・アクティビティは、現在のバインド・タスク・フローが存在する場合に、この結果をコール元タスク・フローに返します。タスク・フロー・リターン・アクティビティごとに1つのみ結果を指定できます。コール元のタスク・フローには、戻された時点の制御フローを処理する制御フロー・ルールを定義する必要があります。詳細は、第11.2.6項「制御フローの定義方法」を参照してください。

4. 「動作」セクションを開き、「再入力」リストでいずれかのオプションを選択します。
バインド・タスク・フローにreentry-not-allowedを指定しても、エンド・ユーザーはモバイル・デバイスの「戻る」ボタンをクリックするとバインド・タスク・フロー内のページに戻れます。ただし、エンド・ユーザーがそのページでボタンの作動などなんらかの操作を行うと、バインド・タスク・フローを不正に再開したことを示す例外(InvalidTaskFlowReentryなど)がスローされます。

5. 「トランザクションの終了」ドロップダウン・リストから、次のいずれかのオプションを選択します。

- commit: 選択すると、既存のトランザクションをデータベースにコミットします。

- rollback: 選択したトランザクションをコール先のタスク・フローの以前のエントリまでロールバックします。これを指定すると、新しいトランザクションはバインド・タスク・フローに入って開始された当初の状態までロールバックされるため、トランザクションを取り消すのと同じ効果があります。
commitとrollbackのいずれも指定しないと、トランザクションはコール元のバインド・タスク・フローによって閉じられるまで開いたままになります。

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

ページ定義ファイルは、実行時にデータを移入するバインディング・オブジェクトを定義します。通常、MAF AMXアプリケーション機能で、ページのUIコンポーネントとデータ・コントロールをバインドするために使用されます。次のタスク・フロー・アクティビティでも、ページ定義ファイルを使用してデータ・コントロールへのバインドが可能です。

- メソッド・コール: 「データ・コントロール」ウィンドウからタスク・フローにデータ・コントロール操作をドラッグ・アンド・ドロップして、メソッド・コール・アクティビティを作成したり、既存のメソッド・コール・アクティビティにドロップすることができます。いずれの場合も、メソッド・コール・アクティビティが、データ・コントロール操作にバインドされます。

- ルーター: ルーター・アクティビティにページ定義ファイルを関連付けることで、バインド・コンテナが作成されます。このバインド・コンテナは実行時にルーター・アクティビティ・ケースのEL式を評価し、ルーター・アクティビティが正しいバインド値を参照していることを確認します。各ルーター・アクティビティ・ケースは、EL式の評価結果がtrueの場合に返される結果を指定します。そのため、ページ定義ファイルには、trueまたはfalseの評価結果となるデータ・コントロール操作だけを追加します。

- タスク・フロー・コール: タスク・フロー・コール・アクティビティにページ定義ファイルを関連付けることで、バインド・コンテナが作成されます。実行時にタスク・フロー・コール・アクティビティから入力パラメータが渡されると、バインド・コンテナが起動します。バインド・コンテナはタスク・コール元のタスク・フローからコール先のタスク・フローに入力パラメータが渡される際に、フロー・コール・アクティビティがバインド値を参照する場合は、正しい値を参照していることを確認します。

- ビュー: ビュー・アクティビティをページ定義ファイルに直接関連付けることはできません。かわりに、ビュー・アクティビティが参照するページを関連付けます。

タスク・フローの「ダイアグラム」ウィンドウ内で、前述のタスク・フロー・アクティビティ(ビュー・アクティビティを除く)のいずれかを右クリックすると、OEPEがポップアップ・メニューにオプションを表示します(ページ定義ファイルが作成されていない場合は、これを使用して作成できます)。ページ定義ファイルがある場合は、OEPEはページ定義ファイルに移動するためのすべてのタスク・フロー・アクティビティのポップアップ・メニュー・オプションを表示します(第11.3.1.5項「ページ定義ファイルへのアクセス」を参照)。ページ定義ファイルに関連付けられたメソッド・コール・アクティビティを右クリックして、OEPEでポップアップ・メニュー・オプション(「バインディングの編集」)を表示することもできます。

ページ定義ファイルに関連付けられたタスク・フロー・アクティビティでは、タスク・フロー・アクティビティ・アイコンの右下にアイコンが表示されます。

タスク・フロー・アクティビティにページ定義ファイルを関連付けるには:

1. ダイアグラム・ビューで、ページ定義ファイルを作成するタスク・フロー・アクティビティを右クリックし、ポップアップ・メニューから「ページ定義の作成」を選択します。

2. 作成されたページ定義ファイルに、タスク・フロー・アクティビティの実行時に参照させたいバインドを追加します。

ページ定義ファイルの詳細は、第11.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

前述の手順が完了すると、OEPEは、設計時にタスク・フロー・アクティビティのページ定義ファイルを生成します。ページ定義ファイルのファイル名は、元のタスク・フローおよびタスク・フロー・アクティビティまたは起動するデータ・コントロール操作から構成されます。OEPEは作成されたページ定義ファイル内で、タスク・フロー・アクティビティからバインドへのEL式も生成します。実行時にバインド・コンテナは、タスク・フロー・アクティビティのEL式が正しい値を参照していることを確認します。

11.2.6 制御フローの定義方法

MAF AMXアプリケーション機能で制御フローを定義するには、次のタスク・フロー・コンポーネントを使用します。

- 制御フロー・ケース(第11.2.6.1項「制御フロー・ケースの定義」を参照)

- ワイルドカード制御フロー・ルール(第11.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照)

11.2.6.1 制御フロー・ケースの定義

制御がアクティビティから次のアクティビティに渡される方法を指定する制御フロー・ケース・コンポーネントを使用してナビゲーションを作成できます。制御フローを作成するには、「パレット」から「制御フロー・ケース」を選択します。次に、制御フロー・ケースをソース・アクティビティに接続し、さらにターゲット・アクティビティに接続します。ソースおよびターゲット・アクティビティを接続すると、OEPEでは、次のものが作成されます。

- 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(ターゲット・アクティビティの識別子)を変更するには、ダイアグラムの矢印のどちらかの端を新規のアクティビティにドラッグします。

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

MAFタスク・フローではワイルドカード制御フロー・ルールをサポートし、これは、後方ワイルドカード(foo*)や単一ワイルドカード文字のある制御フローfrom-activity-idを表します。ワイルドカード制御フロー・ルールは、「パレット」からドラッグ・アンド・ドロップしてバインドなしまたはバインド・タスク・フローに追加できます。ワイルドカード制御フロー・ルールを構成するには、「プロパティ」ウィンドウを使用します。

ワイルドカード制御フロー・ルールを追加するには:

1. ダイアグラム・ビューでタスク・フロー・ソース・ファイルを開きます。

2. 「パレット」で「ワイルドカード制御フロー・ルール」を選択し、ダイアグラムにドロップします。

3. 「パレット」で「制御フロー・ケース」を選択します。

4. タスク・フロー・ダイアグラムで、制御フロー・ケースをワイルドカード制御フロー・ルールからターゲット・アクティビティ(任意のアクティビティ・タイプ)にドラッグします。

5. デフォルトでは、ワイルドカード制御フロー・ルールの後のラベルは*です。これは、「アクティビティID(自)」要素の値です。この値を変更するには、ダイアグラムでワイルドカード制御フロー・ルールを選択します。ワイルドカード制御フロー・ルールの「プロパティ」ウィンドウで、 「アクティビティID(自)」フィールドに新しい値を入力します。便利な規則は、ワイルドカード制御フロー・ルールをその目的を表す形式でキャストすることです。たとえば、project*と入力します。新しいラベルでは、ワイルドカードは後続の文字である必要があります。

ヒント:
タスク・フロー・ダイアグラムで、「アクティビティID(自)」の値も変更できます。

6. オプションとして、「プロパティ」ウィンドウでは、「動作」セクションを開いて、値がtrueになる必要がある、「If」フィールド内のEL式を記述した後に、「アクティビティID(至)」によって識別されたアクティビティに制御を渡すことができます。

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

例11-3に、タスク・フロー・ソース・ファイルの制御フロー・ルール要素の一般的な構文を示します。

例11-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名と一致します。メタデータに(後方ワイルドカードではなく)単一のワイルドカード文字を指定すると、ダイアグラムで、制御フローが自動的にワイルドカード制御フロー・ルール・アクティビティに変換されます。詳細は、第11.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照してください。

- control-flow-case: 制御フロー・ルールの各ケースの必須ラッパー要素。それぞれのケースで、同じソース・アクティビティに対して異なる制御フローを定義します。制御フロー・ルールには、少なくとも1つの制御フロー・ケースが必要です。

- from-action: 指定されたアクション・メソッドからの結果のみにルールの適用を制限する任意の要素。アクション・メソッドは、ELバインディング式(#{backing_bean.cancelButton_action}など)として指定されます。
例11-3では、outcomeが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要素によって識別されたアクティビティに制御フローを渡します。

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

実行時、タスク・フローは、最も具体的な一致から最も具体的でない一致まで制御フロー・ルールを評価して、アクティビティ間の次の遷移を決定します。評価は次の優先度に基づきます。

1. from-activity-id、from-action、from-outcome: 最初に、3つの要素すべての一致を検索します。

2. from-activity-id、from-outcome: 3つすべての要素で一致がない場合は、これらの要素を検索します。

3. from-activity-id: 前述の組合せの検索で一致がなかった場合は、この要素のみで検索します。

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

図11-6に示すタスク・フローの例では、アクション結果の値(第11.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照)に基づき、viewDに達するための2つの異なるパス(viewAからviewBを経由してviewD、またはviewAからviewCを経由してviewDのいずれか)を受け取ることができます。

図11-6 「戻る」ナビゲーションを使用したタスク・フロー

理論上は、どのナビゲーション・パスが使用されたかを追跡して__backナビゲーション・フローを直接実装することもできますが、特にモバイル・デバイスの画面領域が限られていてナビゲーション・シーケンスに従っていない遷移が非常に頻繁に発生するため、これは複雑なうえに間違いが発生しやすくなります。MAFでは、組込みの__backナビゲーションがサポートされているため、タスク・フロー全体にわたる後方移動が可能で、つまり、経由したパスに関する情報を適用することにより、同じパスを経由する後方ナビゲーションを実行します。たとえば、最初のナビゲーションでviewAからviewCを経由してviewDに達していた場合、ViewDで__backオプションを実行すると、エンド・ユーザーは、ViewB経由ではなくViewC経由で、ViewAに自動的に戻ります。

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

- 11.2.3項「task-flow-definition.xmlファイルに関する必知事項」

- 第11.2.10項「マネージドBeanの作成および参照方法」

- 第12.3.5.7項「戻るボタン・ナビゲーションの有効化」

11.2.8 ドラッグでページ・ナビゲーションを有効にする方法

ナビゲーションのドラッグ動作を使用することで、いずれかのMAF AMXページから別のページへのナビゲーションを有効化できます。詳細は、第12.3.28項「ドラッグ・ナビゲーションの有効化」を参照してください。

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

「プロパティ」ウィンドウを使用して、次に示すUIコンポーネントのいずれかのaction属性を該当する制御フロー・ケースfrom-outcomeに設定して次のタスク・フロー・アクティビティに導くことにより、アクション結果を指定できます。

- コマンド・ボタン(第12.3.5項「ボタンの使用方法」を参照)

- コマンド・リンク(第12.3.6項「リンクの使用方法」を参照)

- リスト・アイテム

UIコンポーネントの「アクション」フィールドを使用して、特定のMAF AMXページの1つ以上のタスク・フローで定義される可能性のあるアクション結果のリストから選択を行います。

戻るアクション(__back)は、各リストに自動的に追加され、前に参照したページへのナビゲーションを可能にします。

注意:
MAF AMXページは、バインド・タスク・フローとバインドなしタスク・フローの両方で参照でき、その場合、両方のタスク・フローからのアクション結果がアクション選択リストに含まれます。

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

独自のMAFアプリケーションでマネージドBeanを作成および使用して、追加データを格納したり、カスタム・コードを実行できます。通常の編集メカニズムを使用して、マネージドBeanを参照したり、適用可能なフィールドに対してそれらへの参照を作成できます。詳細は、第13.4項「マネージドBeanの作成と使用」を参照してください。

タスク・フローの(アイコンではなく)名前をクリックすると、図11-7に示す「プロパティの編集」ダイアログが表示されます。

図11-7 アクションの「プロパティの編集」ダイアログ

表11-5には、「プロパティ」ウィンドウで「編集」オプションを選択できるMAF AMX属性がリストされています。

表11-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: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

その他のどのプロパティに対しても「編集」をクリックすると同様のダイアログが表示されますが、「アクション結果」オプションはありません。

このダイアログは、マネージドBeanを作成するか、actionプロパティに使用可能なアクション結果を選択できることを示しています。

図11-7に示された「アクション結果」リストには、特定のMAF AMXページが属するすべてのタスク・フローからのアクション結果が含まれています。また、このリストには、前に参照したページに戻るための__backナビゲーション結果が含まれています(詳細は第11.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください)。ページがタスク・フローの一部ではない場合、__backが「アクション結果」リストで使用可能な唯一の結果です。使用可能なアクション結果のいずれかを選択し、「OK」をクリックすると、アクション・プロパティ値は、適切なEL式(commandButtonの場合、次のとおり)で更新されます。

<amx:commandButton action="goHome"/>

「メソッド・バインディング」オプション(図11-7を参照)では、新しいマネージドBeanクラスを作成するか、既存のものを選択できます。

新しいマネージドBeanクラスを作成するには:

1. 「マネージドBean」フィールドの横にある「新」をクリックし、図11-8に示す「マネージドBeanの作成」ダイアログを開きます。

図11-8 「マネージドBeanの作成」ダイアログ・ボックス

MAFでは、次のスコープがサポートされています。

- application

- view

- pageFlow

MAFアプリケーションまたはMAF AMXアプリケーション機能に対してマネージドBeanを宣言すると、マネージドBeanはインスタンス化されて適切なスコープ内で識別され、Beanのプロパティが解決されてそのメソッドがELを介してコールされます。詳細は、第13.3項「EL式の作成」を参照してください。

2. [Tab]キーを押して「名前」フィールドから「クラス」名前フィールドに進みます(図11-9を参照)。クラス名を入力するか、「参照」ボタンをクリックして選択します。

図11-9 マネージドBeanの名前およびクラスの設定

例11-4に、新たに作成されたマネージドBeanクラスを示します。MAF AMXページが含まれるタスク・フローが、Beanを参照するように更新されます。

例11-4 新しいマネージド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. 選択したプロパティ値を、次のcommandButtonなどの適切なEL式で編集します。

<amx:commandButton action="#{MyBean.getMeHome}"/>

マネージドBeanクラスも、例11-5に示すとおり、新たに作成されたメソッドを含むように更新されます。

例11-5 マネージドBeanクラスの新しいメソッド

package mobile;

public class MyBean {
public MyBean() {
}

public String getMeHome() {
// Add event code here...
return null;
}
}

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

- 第13.3.5.2項「マネージドBeanカテゴリについて」

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

タスク・フローでページ遷移スタイルを定義することにより、ビューから別のビューへのMAF AMXページの遷移方法を指定できます。MAF AMXページの遷移動作は次のようにできます。

- フェード・イン

- 左からスライド・イン

- 右からスライド・イン

- 下からスライド・アップ

- 上からスライド・ダウン

- 始点からスライド・イン

- 終点からスライド・イン

- 下からフリップ・アップ

- 上からフリップ・ダウン

- 左からフリップ

- 右からフリップ

- 始点からフリップ

- 終点からフリップ

- なし

始点および終点からスライド・インと、始点および終点からフリップは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点の遷移スタイルを使用することをお薦めします。

注意:
Androidプラットフォームではフリップを有効にできません。

例11-6のようにcontrol-flow-case(制御フロー・ケース・コンポーネント)のtransition属性を変更することによって、遷移スタイルを設定します。

例11-6 遷移スタイルの設定

<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>

「プロパティ」ウィンドウで、transition属性は「動作」の下にあります。デフォルトの遷移スタイルはslideLeftです。

ヒント:
タスク・フローを定義する場合、control-flow-caseのtransition値が論理的になるように指定する必要があります。たとえば、戻るナビゲーションのために左から右に遷移が発生する場合、右にスライドして前のページに戻る必要があります。

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

タスク・フローを使用すると、モジュール単位でMAF AMXアプリケーション機能に制御フローを定義できます。アプリケーション機能は単一の大規模なページ・フローとして表すのではなく、再利用可能な一連のタスク・フローに分割できます。各タスク・フローには、アプリケーション機能のナビゲーション・グラフの一部が含まれます。タスク・フロー内のノードは、アクティビティを表します。アクティビティ・ノードでは、ページの表示、アプリケーション・ロジックの実行または別のタスク・フローのコールなど、シンプルな論理的操作が表示されます。アクティビティ間の遷移は制御フロー・ケースと呼ばれます。

MAF AMXのタスク・フローには、バインドとバインドなしの2種類があります。

1. バインドなしタスク・フロー: エンド・ユーザーがタスクを完了できるように対話する一連のアクティビティ、制御フロー・ルールおよびマネージドBeanです。バインドなしタスク・フローは、バインド・タスク・フローに含まれていない、MAF AMXアプリケーション機能内のすべてのアクティビティおよび制御フローで構成されています。

2. バインド・タスク・フロー: タスク・フローの特殊な形式であり、バインドなしタスク・フローとは異なり、単一エントリ・ポイントと0以上の終了ポイントがあります。これには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。

バインドなしタスク・フローまたはバインド・タスク・フローに追加可能なアクティビティ・タイプの説明は、第11.2.2項「タスク・フロー・アクティビティおよび制御フローに関する必知事項」を参照してください。

一般的なMAF AMXアプリケーション機能には、アプリケーション機能作成時に作成された1つのバインドなしタスク・フローと、1つ以上のバインド・タスク・フローの組合せが含まれます。実行時、MAFアプリケーションでは、バインドなしタスク・フローに追加したアクティビティからバインド・タスク・フローをコールできます。

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

MAF AMXアプリケーション機能には常に、そのアプリケーション機能に1つ以上のエントリ・ポイントを提供する1つのバインドなしタスク・フローが含まれます。エントリ・ポイントは、ビュー・アクティビティによって表されます。デフォルトでは、バインドなしタスク・フローのソース・ファイルはadfc-mobile-config.xmlファイルです。

注意:
バインドなしタスク・フローに対して追加ソース・ファイルを作成できますが、MAF AMXアプリケーション機能では、実行中のすべてのソース・ファイルがadfc-mobile-config.xmlファイルにまとめられます。

図11-10は、MAF AMXアプリケーション機能からのバインドなしタスク・フローのダイアグラムを示しています。このタスク・フローにはいくつかのビュー・アクティビティが含まれており、いずれもアプリケーション機能へのエントリ・ポイントになっています。

図11-10 バインドなしモバイル・タスク・フローのダイアグラム

次の場合、バインドなしタスク・フローを使用することを検討してください。

- タスク・フローを別のタスク・フローからコールする必要がない。

- MAF AMXアプリケーション機能に複数のエントリ・ポイントがある。

- タスク・フローで最初に実行するアクティビティ(デフォルト・アクティビティ)を特に指定する必要がない。

バインドなしタスク・フローは、バインド・タスク・フローをコールできますが、別のタスク・フローからコールできません。

11.2.12.2 バインド・タスク・フロー

デフォルトでは、IDEは、バインド・タスク・フローのソース・ファイルのファイル名を提案します(第11.2.1項「タスク・フローの作成方法」を参照)。実行するタスクの目的を表すようにこのファイル名を変更できます。

バインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそのバインド・タスク・フローからも次々にコールできます。コールに深さ制限はありません。

図11-11は、MAF AMXアプリケーション機能からのバインド・タスク・フローのダイアグラムを示しています。

図11-11 バインド・モバイル・タスク・フローのダイアグラム

バインド・タスク・フローを作成する理由は次のとおりです。

- バインド・タスク・フローでは、常にバインド・タスク・フローの開始直後に実行する必要のある単一エントリ・ポイントとなる、デフォルト・アクティビティを指定します。

- これは、同一または別のMAF AMXアプリケーション機能内で再利用可能です。

- バインド・タスク・フロー内で使用するマネージドBeanは、ページ・フロー・スコープで指定できるため、残りのMAF AMXアプリケーション機能からは分離されます。これらのマネージドBean(およびページ・フロー・スコープ)は、タスク・フローが完了した際に自動的に解放されます。

次に、バインド・タスク・フローの主な特性のサマリーを示します。

- 適切に定義された境界: バインド・タスク・フローは、プライベート制御フロー・ルール、アクティビティおよびマネージドBeanの独自のセットで構成されます。コール元は、バインド・タスク・フロー境界内におけるページ名、メソッド・コール、子バインド・タスク・フロー、マネージドBean、制御フロー・ルールの内部知識を必要としません。データ・コントロールはタスク・フロー間で共有できます。

- 単一のエントリ・ポイント: バインド・タスク・フローには、タスク・フロー内の他のすべてのアクティビティの前に実行されるデフォルト・アクティビティである、単一のエントリ・ポイントがあります。

- ページ・フロー・メモリー・スコープ: バインド・タスク・フロー内のアクティビティ間でデータを受け渡すためのメモリー・スコープとしてページ・フロー・スコープを指定できます。ページ・フロー・スコープは、バインド・タスク・フローの各インスタンスに対する一意の記憶域を定義します。その存続期間はバインド・タスク・フローであり、requestスコープより長く、sessionスコープより短くなっています。

- 指定可能: バインド・タスク・フローにアクセスするには、バインド・タスク・フローのXMLソース・ファイルに記述されている一意の識別子とXMLソース・ファイルのファイル名を指定します。

- 再利用可能: アクティビティ・グループ全体を単一のエンティティ、つまりバインド・タスク・フローとして識別し、そのバインド・タスク・フローをMAFアプリケーション内の別のMAF AMXアプリケーション機能で再利用できます。
また、既存のバインド・タスク・フローは、コールすることで再利用できます。

さらに、タスク・フロー・テンプレートを使用して、様々なバインド・タスク・フローで再利用するための共通の動作を取得できます。

- パラメータおよび戻り値: コール元は、バインド・タスク・フローに入力パラメータを渡し、戻り値を受け取ることができます(第11.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」および第11.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照)。
また、バインド・タスク・フロー間でデータ・コントロールを共有できます。

- メタデータのオンデマンド・ロード: バインド・タスク・フロー・メタデータは、バインド・タスク・フローの開始時にオンデマンドでロードされます。

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

入力パラメータを受け取り、パラメータ値を戻すタスク・フローの機能によって、タスク・フローのデータを操作できる他、タスク・フロー間でデータを共有できます。この機能を使用して、MAF AMXアプリケーション機能でのタスク・フローの再利用を最適化できます。

図11-12は、pageFlowスコープ内のユーザーについての情報を保持する入力パラメータ定義を指定するタスク・フローを示しています。

図11-12 タスク・フローの入力パラメータ

タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールする場合、標準EL式を使用してパラメータ値を指定できます。たとえば、次のEL式の構文を使用してパラメータを指定できます。

- #{bindings.bindingId.inputValue}

- #{CustomerBean.zipCode}

inputValueをEL式に追加することで、実際のバインディング・オブジェクトではなく、バインディングの値をパラメータに確実に割り当てられます。

11.2.12.3.1 バインド・タスク・フローへのパラメータ渡し

コール先のバインド・タスク・フローは、コール元のタスク・フローまたはタスク・フロー・バインディングから入力パラメータを受け取ることができます。

バインド・タスク・フローに入力パラメータを渡すには、次のうちの1つまたは複数を指定します。

- コール元のタスク・フローでのタスク・フロー・コール・アクティビティの入力パラメータ: 入力パラメータによって、パラメータ値を格納するコール元のタスク・フローの場所が指定されます。

- コール元のバインド・タスク・フローの入力パラメータ定義: 入力パラメータ定義によって、実行時にコール先のバインド・タスク・フローがパラメータ値を取得できる場所が指定されます。

コール元のタスク・フローにあるタスク・フロー・コール・アクティビティで定義する入力パラメータおよびコール先のバインド・タスク・フローの入力パラメータ定義と同じ名前を指定します。これを行うことで、コール先のバインド・タスク・フローに入力パラメータ値をマップできます。

入力パラメータの値を参照するEL式を指定しない場合は、valueのEL式のデフォルト値を実行時に次のように設定します。

#{pageFlowScope.parmName}

ここで、parmNameは、入力パラメータ名に入力した値です。

コール先のバインド・タスク・フローの入力パラメータ定義では、必要に応じて入力パラメータを指定できます。入力パラメータが実行時または設計時に値を受け取らない場合、タスク・フローは、そのタスク・フローを含むMAFアプリケーションのログ・ファイル内に警告を生成します。必要に応じて指定しない入力パラメータは、タスク・フロー・コール・アクティビティの作成時に無視できます。

タスク・フロー・コール・アクティビティを使用してタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティの入力パラメータを参照渡しまたは値渡しにできます(第11.2.5.4.2項「タスク・フロー・コール・アクティビティでの入力パラメータの指定」を参照)。デフォルトでは、プリミティブ・タイプ(int、long、booleanなど)が値渡し(pass-by-value)されます。

コール先のタスク・フローは、終了時にコール元のタスク・フローに値を戻すことができます。詳細は、第11.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照してください。

入力パラメータをバインド・タスク・フローに渡す場合、コール元のタスク・フローとコール先のタスク・フローの両方で値を定義します。

始める前に:

- コール元およびコール先のタスク・フローを作成します(コール元のタスク・フローはバインドまたはバインドなしにすることができます)。コール先のタスク・フローはバインドにする必要があります。タスク・フローの作成に関する詳細は、第11.2.1項「タスク・フローの作成方法」を参照してください。

- タスク・フロー・コール・アクティビティをコール元のタスク・フローに追加します。

図11-13には、ビュー・アクティビティがタスク・フロー・コール・アクティビティに制御を渡す例が示されています。

図11-13 コール元のタスク・フロー

入力パラメータをバインド・タスク・フローに渡すには:

1. エンド・ユーザーが実行時にパラメータとしてバインド・タスク・フローに渡される値を入力する入力コンポーネントを含むMAF AMXページを開きます。コール元のタスク・フローにあるビュー・アクティビティによって、開いたMAF AMXページを参照する必要があることに注意してください。

2. エンド・ユーザーが実行時に値を入力するMAF AMXページで入力テキスト・コンポーネントを選択します。

3. 「プロパティ」ウィンドウで、「共通」セクションを開いて、「値」フィールドに入力テキスト・コンポーネントの値を入力します。
値はEL式として(たとえば#{pageFlowScope.inputValue})、手動で、または式ビルダーを使用して指定できます。

4. コールするタスク・フローをプロジェクト・エクスプローラでダブルクリックして開き、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

5. 「入力パラメータの定義」セクションで、「追加」( + )をクリックして新しいエントリを指定します(図11-12を参照)。

- 「名前」フィールドで、パラメータ名(inputParm1など)を入力します。

- 「値」フィールドで、パラメータ値を格納および参照するEL式(たとえば#{pageFlowScope.inputValue})を手動で、または式ビルダーを使用して入力します。

6. プロジェクト・エクスプローラで、コール先のバインド・タスク・フローを起動するタスク・フロー・コール・アクティビティを含むコール元タスク・フローをダブルクリックします。

7. プロジェクト・エクスプローラで、コール先のバインド・タスク・フローをドラッグし、コール元のタスク・フローのダイアグラム内のタスク・フロー・コール・アクティビティの上にドロップします。これにより、バインド・タスク・フローに対するタスク・フローの参照が自動的に作成されます。図11-14に示すように、タスク・フローの参照には次のものが含まれています。

- バインド・タスク・フローのID (id): バインド・タスク・フローのtask-flow-definition要素の属性。

- IDを含むタスク・フローのソース・ファイルを指すドキュメント名。

図11-14 タスク・フローの参照

8. タスク・フロー・コール・アクティビティの「プロパティ」ウィンドウで、「パラメータ」を開いて、「入力パラメータ」セクションを表示します。

- 入力パラメータを識別する名前を入力します(入力パラメータを定義済のタスク・フロー・コール・アクティビティの上にバインド・タスク・フローをドロップしたため、名前はすでに指定されています)。同じ入力パラメータ名を維持する必要があります。

- パラメータ値(たとえば#{pageFlowScope.param1})を入力します(タスク・フロー・コール・アクティビティの入力パラメータの値によって、コール元のタスク・フローがパラメータ値を格納する場所が指定されます)。コール先のタスク・フローの入力パラメータ定義の値は、渡された後にコール先のバインド・タスク・フロー内で使用する値が取得される場所を指定します。

実行時、コール先のタスク・フローは入力パラメータを使用できます。コール先のタスク・フローの入力パラメータ定義で値としてpageFlowScopeを指定したため、コール先のバインド・タスク・フローのどこでもパラメータ値を使用できます。たとえば、コール先のバインド・タスク・フローのビュー・アクティビティにパラメータ値を渡すことができます。

完了すると、OEPEでは、選択した値に基づいて、コール元のタスク・フローとコール先のタスク・フローのソース・ファイルに対しエントリを記述します。

例11-7は、バインド・タスク・フローで指定された入力パラメータ定義を示しています。

例11-7 入力パラメータ定義

<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>

例11-8は、例11-7に示したバインド・タスク・フローをコールするタスク・フロー・コール・アクティビティの入力パラメータ・メタデータを示しています。実行時に、タスク・フロー・コール・アクティビティはバインド・タスク・フローをコールして、そのvalue要素で指定された値を渡します。

例11-8 タスク・フロー・コール・アクティビティの入力パラメータ

<task-flow-call id="taskFlowCall1">
...
<input-parameter>
<name>inputParameter1</name>
<value>#{pageFlowScope.newCustomer}</value>
<pass-by-value/>
</input-parameter>
...
</task-flow-call>

11.2.12.3.2 バインド・タスク・フローの戻り値の構成

コール先のタスク・フローにある戻り値の定義を構成し、実行時に戻り値を取得するコール元のタスク・フローのタスク・フロー・コール・アクティビティにパラメータを追加します。

始める前に:

バインド・タスク・フローまたはバインドなしタスク・フローを(コール元のタスク・フローに対して)作成し、バインド・タスク・フローを(コール先のタスク・フローに対して)作成します。詳細は、第11.2.1項「タスク・フローの作成方法」を参照してください。

コール先のバインド・タスク・フローの戻り値を構成するには:

1. コールするタスク・フローをプロジェクト・エクスプローラでダブルクリックして開き、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

2. 「戻り値の定義」セクションで、「追加」( + )をクリックして戻り値を定義します(図11-12を参照)。

- 「名前」フィールドで、戻り値を識別する名前(たとえばreturnValue1)を入力します。

- 「クラス」フィールドで、戻り値のデータ型を定義するJavaクラスを入力します。デフォルト値はjava.lang.Stringです。

- 「値」フィールドで、戻り値を読み取る場所を指定するEL式(たとえば#{pageFlowScope.ReturnValueDefinition})を手動で、または式ビルダーを使用して入力します。

3. プロジェクト・エクスプローラで、コール元のタスク・フローをダブルクリックします。

4. ダイアグラム・ビューでタスク・フロー・ページを開いた状態で、「パレット」から「コンポーネント」→「アクティビティ」を選択してから、タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

5. タスク・フロー・アクティビティの「プロパティ」ウィンドウで、「パラメータ」セクションを開いて、「戻り値」エントリの「追加」( + )をクリックし、戻り値を定義する次の値を追加します。

- 戻り値を識別する名前(たとえばreturnValue1)。手順2で戻り値の定義を定義した場合は、「名前」フィールドに入力した値と一致する必要があります。

- 戻り値を格納する場所を指定するEL式で表した値(たとえば#{pageFlowScope.ReturnValueDefinition})。手順2で戻り値の定義を定義した場合は、「値」フィールドに入力した値と一致する必要があります。

完了すると、OEPEでは、構成したコール元のタスク・フローのソース・ファイルに対しエントリを記述します。

例11-9では、コール元のタスク・フローのソース・ファイルに対してOEPEで記述したエントリの例を示しています。

例11-9 戻り値を構成するためのコール元のタスク・フローのメタデータ

<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>

例11-10では、コール先のタスク・フローのソース・ファイルに対してOEPEで記述したエントリの例を示しています。

例11-10 戻り値を構成するためのコール先のタスク・フローのメタデータ

<return-value-definition id="__2">
<name id="__3">returnValue1</name>
<value>#{pageFlowScope.ReturnValueDefinition}/</value>
<class>java.lang.String</class>
</return-value-definition>

実行時に、コール先のタスク・フローが値を返します。この構成の場合は、コール元のタスク・フローにあるタスク・フロー・コール・アクティビティがその値を取得します。

11.3 ビューの作成

MAFアプリケーションを作成すると、OEPEは、アセンブリ・プロジェクトおよびアプリケーション・プロジェクトと連動するビュー・プロジェクトを自動的に作成します。追加のビュー・プロジェクトを作成することもできます。次のセクションでは、ビューの作成および操作に関する重要な側面について説明します。

- MAF AMXページ構造の理解(第11.3.1.1項「MAF AMXページ構造の解釈」を参照)

- MAF AMXページの編集およびプレビュー(第11.3.1.4項「UIエディタの使用方法」を参照)

- MAF AMXページへのコンポーネントのドラッグ・アンド・ドロップ(第11.3.2.1項「UIコンポーネントの追加」を参照)

- データ・コントロールのビューへの追加(第11.3.2.3項「データ・コントロールのビューへの追加」を参照)

11.3.1 MAF AMXページの操作方法

MAF AMXページはXMLファイルによって表されます。

11.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>

データ可視化コンポーネント(第12.5項「データ視覚化の指定」を参照)を除き、UI要素は<amx>名前空間の下で宣言されます。

詳細は、第11.3.1.3項「MAF AMXページの作成時の処理」を参照してください。

11.3.1.2 MAF AMXページの作成

MAF AMXファイルは、MAFアプリケーションのビュー・プロジェクトに含まれています。これらのファイルは、「新規MAFページ」ダイアログを使用して作成します。

MAFでは、MAF AMXページを作成する別の方法を2通り提供しています。

- 「新」メニューから(「ファイル」→「新」→「MAFページ」)

- ビュー・プロジェクトの「内容の表示」フォルダを右クリックして、「新」→「MAFページ」を選択

始める前に:

MAF AMXページを作成するには、MAFアプリケーションにビュー・プロジェクト・フォルダ(第2章「MAFアプリケーション開発のスタート・ガイド」を参照)が含まれている必要があります。ビュー・プロジェクトの「内容の表示」フォルダ以外に作成したファイルは、デプロイされたアプリケーションに含められません。

「ファイル」メニューからMAF AMXページを作成するには:

1. OEPEのトップレベル・メニューから「ファイル」をクリックし、「新」→「MAFページ」を選択します。

2. 「新規MAFページ」ダイアログで、AMXページを作成するMAFアプリケーションの「ビュー」フォルダを参照します。(1つのアプリケーションに複数のビュー・プロジェクトが存在する場合があることに注意してください。)

3. 新しいファイルの名前と必要に応じて場所を入力(またはデフォルトをそのまま使用)します。

4. オプションで、ページ・レイアウトの一部としてどのファセットを新しいMAF AMXページに含めるかを選択することもできます。

- ヘッダー

- プライマリ

- セカンダリ

- フッター

詳細は、第11.3.1.3項「MAF AMXページの作成時の処理」および第12.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

ファセットを選択または選択解除すると、変更されたページの外観を反映するよう、ページを表すイメージは動的に変わります。

図11-15 新しいMAFページ作成ダイアログ

注意:
MAFでは、ページのファセットの選択を保持し、後に続く「新規MAF AMXページ」ダイアログが開かれるたびに適用します。

5. 「新規MAF AMXページ」ダイアログの「終了」をクリックします。

タスク・フローのビュー・コンポーネントからMAF AMXページを作成するには:

1. ダイアグラマでタスク・フロー・ファイルを開きます(第11.2.1項「タスク・フローの作成方法」および第11.2.4項「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)

2. タスク・フローのビュー・コンポーネントをダブルクリックして図11-15に示す「MAF AMXページの作成」ダイアログを開き、新しいファイルの名前と必要に応じて場所を入力します。「OK」をクリックします。

11.3.1.3 MAF AMXページの作成時の処理

「MAF AMXページの作成」ダイアログを使用してMAF AMXページを作成すると、OEPEによって物理ファイルが作成されて、ビュー・コントローラ・プロジェクトのViewContentディレクトリに追加されます。

図11-16に示すプロジェクト・エクスプローラでは、ViewContentノードに、新しく作成されたdepartment.amxというMAF AMXファイルが含まれています。

図11-16 プロジェクト・エクスプローラのMAF AMXファイル

OEPEは、コンポーネント・ライブラリをインポートし、ページを表示するために必要なコードの追加も行います。このコードは、図11-16に示す「ソース」エディタに表示されます。

すべてのファセットを選択してページを作成した場合、次の点に注意してください。

- ヘッダーは出力テキスト・コンポーネントで作成されます。これはこのコンポーネントが通常ページ・タイトルに使用されるためです。

- プライマリおよびセカンダリのアクションは、ボタン・コンポーネントで作成されます。これは、これが通常のパターンであるためです。

- フッターの場合、1つだけ群を抜いているパターンはないため、デフォルトでは出力テキスト・コンポーネントで作成されますが、これは、このコンポーネントがいくつかのパターンで使用されており、OEPEが監査違反のある初期コードを生成することを回避できるためです。

- ヘッダー・ファセットを追加せずにプライマリまたはセカンダリのいずれかのアクションを追加しても、ヘッダー・セクションは「MAF AMXページの作成」ダイアログのページ・ファセット・セクションに表示されます。

図11-17は、いずれのファセットも選択していない「MAF AMXページの作成」ページの「ページ・ファセット」セクションを示し、図11-18は、「プレビュー」ペインおよび生成されたMAF AMXコードを示しています。

図11-17 ファセットが選択されていないMAF AMXページの作成

図11-18 ファセットがないMAF AMXページ

11.3.1.4 UIエディタの使用方法

注意:
この機能は、OEPE実行時のみに利用でき、手動で実行する必要があります。設計時の機能としては利用できません。

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

MAF AMXでは、OEPEの「ページ定義に移動」機能がサポートされているため(図11-19および第11.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照)、バインディング情報をすばやく見つけて編集できるようにするポップアップ・メニューを使用することで、MAF AMXページ定義に移動できます。

図11-19 「ページ定義」エディタ

次の場所から「ページ定義に移動」オプションを含むポップアップ・メニューを起動できます。

- ソース・エディタ(図11-20)

図11-20 「ソース」エディタからの「ページ定義に移動」

- アプリケーション・ウィンドウ(図11-21に示すとおり、ページを右クリックして「次で開く」→「その他」を選択し、次に「ページ定義エディタ」を選択)

図11-21 アプリケーション・ウィンドウからページ定義への移動

11.3.1.6 ページ・コンテンツの共有

MAF AMXページのコンテンツの共有を有効にできます。フラグメント(fragment)は、MAF AMXページ要素(属性やファセットなど)の再利用可能な部分を、テンプレートによって表されるコンテンツに挿入できるようにする動的宣言コンポーネントです。アプリケーションの様々なページでFragmentテンプレートを再利用することで、アプリケーションのルック・アンド・フィールを標準化できます。

MAF AMXフラグメント・ファイル( .amxf)をMAF AMXページまたは別のフラグメント・ファイルにドラッグ・アンド・ドロップすることで、フラグメントへの参照を作成し、その属性を定義できます。フラグメント・ファイルはプロジェクト内にあり、プロジェクト・エクスプローラ・ウィンドウから、「ソース」エディタで開いているターゲット・ソース・ファイルにドロップできます。

始める前に:

MAFアプリケーションにビュー・プロジェクトが含まれていることを確認します。

ビュー・プロジェクトに、MAF AMXページまたはMAF AMXページのタスク・フロー(ここからページを作成します)が含まれていない場合、タスク・フロー・ダイアグラムのビュー・アイコンをダブルクリックして「MAF AMXページの作成」ダイアログを開くことができます(第11.3.1.2項「MAF AMXページの作成」を参照)。

「ファイル」メニューからフラグメントを作成するには:

1. OEPEのトップレベル・メニューから「ファイル」をクリックし、「新」→「MAFページ」を選択します。

2. 「新規MAFページ」ダイアログで、「ページ・フラグメント」ボタンをクリックして選択します。「内容の表示」ノードを開き、必要に応じてわかりやすいファイル名を入力してから、「終了」をクリックします(図11-22を参照)。ページ・フラグメントではファセットは選択できないことに注意してください。

図11-22 新しいフラグメントの作成

3. ダイアログへの入力が完了すると、新しく作成したファイルがOEPEのソース・エディタ内に開きます(図11-23を参照)。

図11-23 フラグメント・ファイル

例11-11は、fragment1.amxfというMAF AMXのフラグメント・ファイルを示しています。

例11-11 フラグメント定義

<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ページにフラグメントのコンテンツを含めるには、Fragmentコンポーネントを作成して(第12.2.16項「Fragmentコンポーネントの使用方法」を参照)、選択したフラグメント・ファイルにそのsrc属性を設定します。例11-12は、MAF AMXページに追加されたfragment要素を示しています。この要素は、そのページ・コンテンツとしてfragment1.amxfを指します。同時に、ファセット定義MAF AMXコンポーネントに対応するfacetRef要素は、そのfacet (MAF AMX Facetコンポーネント)としてfacet1を指します。facetRef要素は、.amxfファイルのfragmentDef内でのみ指定できます。MAF AMXのattribute要素を子として指定することで、属性をfacetRefに渡すことができ、これにより、attributeの値を介してフラグメントからファセットにEL変数を渡すことができます。

例11-12 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: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.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

- 1つ以上の別の親ページまたはフラグメントに配置できる再利用可能なユーザー・インタフェースこれにより、バインドなしで他のコンポーネントから成るコンポーネントを作成できます。

- 独自のファセットの定義。これにより、ヘッダー・ファセット、サマリー・ファセットおよび詳細ファセットをファセットごとに独自のスタイル・クラスとルック・アンド・フィールを設定しながら定義するレイアウト・コンポーネントなどのコンポーネントを作成できます。

- 属性とコレクションの両方を備えたデータ・モデル。

FragmentDemoおよびCompGalleryというMAFサンプル・アプリケーションでは、フラグメントの作成および使用方法を示します。これらのサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」から利用できます。

11.3.2 MAF AMXページへのUIコンポーネントおよびデータ・コントロールの追加方法

MAF AMXページを作成すると、ページへのMAF AMX UIコンポーネントおよびデータ・コントロールの追加を開始できます。

11.3.2.1 UIコンポーネントの追加

「パレット」を使用して、MAF AMXコンポーネントおよびMAF AMXデータ視覚化コンポーネントをページにドラッグ・アンド・ドロップできます。OEPEによって必要な宣言的ページ・コードが追加され、各コンポーネント属性に特定の値が設定されます。

「パレット」には、MAF AMXコンポーネントがカテゴリ別に表示されます。

- 制御フロー

- アクティビティ

特定のコンポーネントの追加および使用については、第12.3項「UIコンポーネントの作成と使用方法」を参照してください。

「パレット」には、MAF AMXデータ視覚化コンポーネントもカテゴリ別に表示されます。

- 共通: 次のサブカテゴリがあります。

- チャート

- ゲージ

- マップ

- その他

- 共有子タグ

- その他のタイプ固有の子タグ: 次のサブカテゴリがあります。

- チャート

- ゲージ

- NBox

- テーマ・マップ

- 時系列

- サンバーストおよびツリーマップ

始める前に:

MAFアプリケーションには、ビュー・プロジェクトが含まれている必要があり、これには、MAF AMXページまたはMAF AMXページのタスク・フロー(ここからページを作成します)が含まれている場合と含まれていない場合があります。

「MAF AMXページの作成」ダイアログを起動するには、第11.3.1.2項「MAF AMXページの作成」で説明するように、タスク・フロー・ダイアグラムでビュー・アイコンをダブルクリックするか、「新」→「MAFページ」を選択します。

UIコンポーネントをページに追加するには:

1. 「ソース」エディタでMAF AMXページを開きます(デフォルト)。

2. 「パレット」の「タグ」パネルで、「MAF AMX」を選択します。

ヒント:
「パレット」が(閉じられているために)表示されていない場合、メインOEPEメニューから「ウィンドウ」→「新規ウィンドウ」を選択します。これにより、「パレット」を表示するOEPEの新しいインスタンスが作成されます。デフォルトでは、「パレット」はOEPEの左下角に表示されます。

3. 使用するコンポーネントを選択し、「ソース」エディタまたは「構造」ウィンドウにドラッグ・アンド・ドロップします。「プレビュー」ペインにコンポーネントをドロップすることはできません。

注意:
MAF AMXページの構築の際、UIコンポーネントは、「パネル・グループ・レイアウト」などのUIコンテナにのみドロップできます。

新たに追加されたコンポーネントを使用して、OEPEで「プレビュー」ペインのページが再描画されます。

11.3.2.2 プレビューの使用

注意:
この機能は、OEPE実行時のみに利用でき、手動で実行する必要があります。設計時の機能としては利用できません。

11.3.2.3 データ・コントロールのビューへの追加

データ・コントロール要素を「データ・コントロール」ウィンドウからドラッグし、「構造」ウィンドウまたは「ソース」エディタのいずれかにドロップすることで、MAF AMXビューでデータバインドされたUIコンポーネントを作成できます。「データ・コントロール」ウィンドウからアイテムをドラッグしてこれらのいずれかの場所にドロップすると、ドロップしたアイテムに使用できるデフォルトUIコンポーネントのポップアップ・メニューが表示されます。目的のUIコンポーネントを選択すると、そのコンポーネントがMAF AMXページに挿入されます。また、関連ページ定義ファイルにバインディング情報が作成されます。そのようなファイルが存在しない場合は、OEPEによって作成されます。MAFには、データ・コントロールのドロップ用のビジュアル・インジケータが用意されており、新しいデータ・コントロールの場所を知らせます。

注意:
データ・コントロールは、基礎となるXMLスキーマで許可された場所にのみドロップできます。

方法によっては、様々なタイプのデータ・コントロールをMAF AMXページの「構造」ウィンドウに挿入できます。図11-24に、「パレット」の「タグ」ペインで利用できるデータ・コントロールを示します。

図11-24 「パレット」のHTMLコントロール・タグ

コレクションの属性をドロップすることにより、様々な入力および出力コンポーネントを作成できます。ページにデータ・コントロール操作をドロップすることにより、ボタンおよびリンク・コンポーネントも作成できます。

これらの各操作に対し、MAF AMXボタンにそれぞれのアクション・リスナーが追加されます。

データ・コントロールの属性および操作は、次の1つ以上のMAF AMX UIコンポーネントとしてドロップできます(第12.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

OEPEの「データ・コントロール」ウィンドウの使用方法の詳細は、第13.6項「データ・コントロール・パレットからのデータバインドされたコンポーネントUIコンポーネントの作成」を参照してください。

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

MAF AMXページにすでにパネル・フォーム・レイアウト・コンポーネントが含まれているか、すべてのフィールドを追加する必要がない場合は、データ・コントロールから個別の属性をドロップできます。属性タイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

日付

このカテゴリは、MAF入力日およびラベル付MAF入力日のコントロールを作成するためのオプションを提供します。図11-25は、属性を「データ・コントロール」ウィンドウからMAF AMXページの「ソース」エディタまたは「構造」ウィンドウにドラッグすると表示される日付コントロールを追加するためのポップアップ・メニューを示しています。

図11-25 日付コントロールのポップアップ・メニュー

単一選択

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAFボタンを1つ選択

- MAF選択肢を1つ選択

- MAFラジオ・ボタンを1つ選択

- MAFブール・チェックボックスの選択

- MAFブール・スイッチの選択

既存のMAF AMXページを使用していて、「MAFボタンを1つ選択」または「MAF選択肢を1つ選択」オプションを選択すると、適切な「リスト・バインディングの編集」ダイアログが表示されます(図11-26を参照してください)。新しいMAF AMXページにコントロールをドロップした場合には、かわりに「アクション・バインディングの編集」ダイアログが開かれます。「OK」をクリックすると、「リスト・バインディングの編集」が開かれます。

注意:
単一選択またはブール選択のコンポーネントとして任意のデータ・コントロール属性をドロップするたびに、それぞれ「リスト・バインディングの編集」または「Booleanバインディングの編集」が表示されます。

図11-26 ボタンを1つ選択コントロールおよび選択肢を1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFラジオ・ボタンを1つ選択」オプションを選択すると、図11-27に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図11-27 ラジオ・ボタンを1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFブール・チェックボックスの選択」または「MAFブール・スイッチの選択」オプションを選択すると、図11-28に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図11-28 ブール・チェック・ボックスおよびスイッチの選択コントロールの「リスト・バインディングの編集」ダイアログ

テキスト

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

図11-29は、属性を「データ・コントロール」ウィンドウからMAF AMXページの「ソース」エディタまたは「構造」ウィンドウにドラッグすると表示されるテキスト・コントロールを追加するためのポップアップ・メニューを示しています。

図11-29 テキスト・コントロールのポップアップ・メニュー

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

属性に加え、操作およびカスタム・メソッドもドラッグ・アンド・ドロップできます。操作やメソッドのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

操作

データ・コントロール操作のカテゴリです。次のオプションがあります(図11-30を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図11-30 操作のポップアップ・メニュー

注意:
操作またはメソッドを、リスト・ビュー・コントロールの子としてドロップすると、ポップアップ・メニューは表示されず、リスト・アイテムが自動的に作成されます。これは、リスト・ビュー・コントロールの直接の子としてドロップできる有効なコントロールが他にないためです。生成されるリスト・アイテムに対して、OEPEにより次のようなバインディングが作成されます。

<amx:listItem actionListener="#{bindings.getLocation.execute}"/>

メソッド

カスタム・メソッドのカテゴリです。次のオプションがあります(図11-31を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図11-31 「プロパティ」ペインの「一般」タブでのメソッド・コールの編集

「MAFパラメータ・フォーム」オプションでは、フォームに挿入するメソッドまたは操作の引数に加え、各引数に対してそれぞれのコントロールも選択できます(図11-32を参照)。

図11-32 「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<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}"/>

生成されるバインディングの詳細は、第11.3.2.3.4項「生成されるバインディングに関する必知事項」を参照してください。

次にMAFパラメータ・フォームでサポートされるコントロールのタイプを示します。

- MAF入力日

- ラベル付MAF入力日

- MAF入力テキスト

- ラベル付MAF入力テキスト

- ラベル付MAF出力テキスト

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

コレクションをドラッグ・アンド・ドロップできます。コレクションのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

複数選択

このカテゴリは、複数選択コントロールを作成するためのオプションを提供します。このカテゴリでは次のコントロールが作成されます(図11-33を参照)。

- MAFチェックボックスを複数選択

- MAF選択肢を複数選択

図11-33 複数選択コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「選択肢を複数選択」または「チェックボックスを複数選択」のいずれかを選択すると、「リスト・バインディングの編集」ダイアログが表示されます(図11-34を参照)。

図11-34 複数選択コントロールの「リスト・バインディングの編集」ダイアログ

フォーム

このカテゴリは、MAF AMXパネル・フォーム・コントロールを作成するために使用されます。「パレット」の「HTML」ペインから「フォーム」を選択すると、OEPEには「新規フォーム」ダイアログが表示されます(図11-35を参照)。

図11-35 「新規フォーム」ダイアログ

メソッド(getまたはpost)を選択し、目的のアクションを入力します。OEPEでは基本HTMLフォーム・タグがソースに追加され、「プロパティ」ペインから「値」フィールドを編集できます(図11-36を参照)。

図11-36 MAFフォームの「フォーム・フィールドの編集」ダイアログ

イテレータ

これは、子コンポーネントのあるMAF AMXイテレータを作成するためのオプションを提供します(図11-37を参照)。

図11-37 イテレータ・コントロールのポップアップ・メニュー

「データ・コントロールのコンテンツでイテレータの生成」を選択すると、コンテンツが含まれるファイルを選択するための「参照」リンクが表示されます。

「イテレータの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<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>

生成されるバインディングの詳細は、第11.3.2.3.4項「生成されるバインディングに関する必知事項」を参照してください。

次にMAFイテレータでサポートされるコントロールを示します。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

リスト・ビュー

これは、子コンポーネントのあるMAF AMXリスト・ビューを作成するためのオプションを提供します(図11-38を参照)。

図11-38 リスト・ビュー・コントロールのポップアップ・メニュー

表11-4は、「ListViewギャラリ」に表示される、サポートされるリスト・フォーマットを示しています。

表11-4 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

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

表11-5は、コンポーネントがドロップされたときにMAF AMXページに追加されるサンプル・バインディングを示しています。

表11-5 サンプル・データ・バインディング

コンポーネント

データ・バインディング

ボタン

<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>

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

最初のドラッグ・アンド・ドロップ・イベントにより、次のディレクトリとファイルが生成されます。

図11-39に、ドラッグ・アンド・ドロップ時に生成されるDataBindings.cpxファイル例を示します。

図11-39 ソース・ビューのDataBindings.cpxファイル

DataBindings.cpxファイルでは、MAF AMXアプリケーション機能全体のバインディング・コンテキストが定義され、実行時にはこのメタデータから、バインディング・オブジェクトが作成されます。コンポーネントがプロジェクトの外で作成され、インポートされた場合は、MAF AMXアプリケーション機能に複数のDataBindings.cpxファイルが存在することがあります。これらのファイルは個々のMAF AMXページをページ定義ファイルにマップし、どのデータ・コントロールをMAF AMXアプリケーション機能で使用するかを宣言します。実行時には、DataBindings.cpxファイルにリストされたデータ・コントロールのみが、現在のMAF AMXアプリケーション機能で使用可能になります。

OEPEでは、「データ・コントロール」ウィンドウを使用して初めてコンポーネントをページに(または操作をアクティビティに)追加するときに、「ViewController」プロジェクトのデフォルト・パッケージにDataBindings.cpxファイルが自動的に作成されます。DataBindings.cpxファイルが作成されると、最初のページまたはタスク・フロー・アクティビティ用のエントリが追加されます。その後、「データ・コントロール」ウィンドウを使用するたびに、そのページまたはアクティビティ用のエントリがまだない場合は、エントリがDataBindings.cpxに追加されます。

OEPEによりDataBindings.cpxファイルが作成されると、それをソース・ビュー(図11-39を参照)またはエディタで開くことができます。

ファイルの「ページ・マッピング」(pageMap)セクションにより、IDを使用して各MAF AMXページまたはタスク・フロー・アクティビティが対応するページ定義ファイルにマップされます。「ページ定義の使用方法」(pageDefinitionUsages)セクションにより、ページ定義IDはMAF AMXアプリケーション機能のページ定義ファイルの絶対パスにマップされます。「データ・コントロールの使用方法」(dataControlUsages)セクションは、ページ定義ファイル内で定義済のバインディング・オブジェクトによって使用されるデータ・コントロールを識別します。これらのマッピングにより、ページの起動時にバインディング・コンテナを初期化できます。

エディタで、現在のID名をダブルクリックし、インラインで編集することで、ページ定義ファイルまたはデータ・コントロールのID名を変更できます。そうすることで、MAF AMXアプリケーション機能のすべての参照が更新されます。ただし、OEPEで更新されるのはID名のみであり、ファイル名は更新されません。データ・コントロール名を予約語に変更しないようにしてください。

「構造」ウィンドウでDataBindings.cpxファイルの要素をクリックし、「プロパティ」ウィンドウを使用してプロパティ値を変更することもできます。

図11-40に、ドラッグ・アンド・ドロップ時に生成されるPageDefファイル例を示します。

図11-40 PageDefファイル

ページ定義ファイルでは、実行時にMAF AMX UIコンポーネントにデータを移入するバインディング・オブジェクトを定義します。バインディングを持つすべてのMAF AMXページには、そのページで使用するバインディング・オブジェクトの定義が含まれる、対応するページ定義ファイルが必要です。ページ定義ファイルによって、すべてのバインディングに設計時アクセスが提供されます。実行時には、ページ定義ファイルによって定義されたバインディング・オブジェクトが、ページ定義ファイルの実行時インスタンスであるバインディング・コンテナ内でインスタンス化されます。

「データ・コントロール」ウィンドウを初めて使用してページにコンポーネントを追加する際には、OEPEによって、そのページのページ定義ファイルが自動的に作成され、コンポーネントが参照する各バインディング・オブジェクトの定義が自動的に追加されます。それ以降、ページにデータバインド・コンポーネントを追加するたびに、OEPEによって、必要なバインディング・オブジェクト定義がページ定義ファイルに自動的に追加されます。

デフォルトでは、ページ定義ファイルは、「ViewController」プロジェクトのApplication Sourcesノードにあるmobile.PageDefsパッケージに含まれています。対応するMAF AMXページがデフォルト以外のディレクトリ、またはデフォルトのサブディレクトリに保存されると、ページ定義も同じ名前のペッケージに保存されます。

ページ定義ファイルを開く方法の詳細は、第11.3.1.5項「ページ定義ファイルへのアクセス」を参照してください。ページ定義ファイルをエディタで開くと、次のタブを使用してMAF AMXページのバインディング、コンテキスト・イベントおよびパラメータを表示し、構成できます。

- バインディングと実行可能ファイル: このタブでは、バインディング、実行可能ファイルおよび関連付けられたデータ・コントロールの3つの異なるタイプのオブジェクトが表示されます。バインディングと実行可能ファイルは、選択しないかぎりデータ・コントロールには表示されないことに注意してください。
デフォルトでは、モデル・バインディング・オブジェクトは、そのオブジェクトを作成するために使用されたデータ・コントロール・オブジェクトの名前が付けられます。データ・コントロール・オブジェクトが1ページ内で何度も使用される場合、OEPEではデフォルトのバインディング・オブジェクト名に数字を追加して、それぞれが一意になるようにします。

- コンテキスト・イベント: MAF AMXアプリケーション機能内のアーティファクトが登録可能なコンテキスト・イベントを作成できます。

- パラメータ: パラメータ・バインディング・オブジェクトは、リクエストの開始時にページが評価するパラメータを宣言します。静的値または静的値を割り当てるEL式を使用して、ページ定義ファイルのパラメータ値を定義できます。

エディタの項目(または「構造」ウィンドウの関連付けられたノード)をクリックすると、「プロパティ」ウィンドウを使用してその項目の属性値を表示および編集したり、「ソース」タブをクリックしてXMLソースを直接編集できます。

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

OEPEの「バインディング」タブ(図11-41を参照)は、MAF AMXエディタにあります。ここには、特定のMAF AMXページに対して定義されたデータ・バインディングが表示されます。バインディングを選択すると、基盤となるデータ・コントロールへのリレーションシップが示され、PageDefファイルへのリンクが提供されます。

図11-41 「バインディング」タブ

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

「構造」ウィンドウからMAF AMXコンポーネントを削除または切り取ると、使用されないバインディングは自動的にページから削除されます。

注意:
「ソース」エディタからコンポーネントを削除した場合には、バインディングは削除されません。

図11-42は、バインディングを参照するリスト・ビュー・コンポーネントの削除を示しています。削除すると、関連するバインディング・エントリが、対応するPageDef.xmlファイルから自動的に削除されます。

図11-42 バインドされたコンポーネントのページからの削除

図11-43では、ページからリスト・ビュー・コンポーネントを切り取ることにより、これを削除しています。

図11-43 バインドされたコンポーネントのページからの切取り

「切取り」をクリックすると、図11-44に示すような「ADFバインディングの削除の確認」ダイアログが表示され、該当するバインディングを削除するかどうかを選択するよう求められます。

図11-44 「ADFバインディングの削除の確認」ダイアログ

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

「パレット」からコンポーネントをドロップするか、データ・コントロールをドラッグ・アンド・ドロップすることにより、要素が追加されると、MAFは一意の要素識別子(id)を生成し、自動的にこれをMAF AMXページに挿入します。これにより、同じページ内の類似したコンポーネントでもそれぞれを識別する、MAF AMXページ内の有効な識別子となります。

MAFは、次のことを行う識別子監査ユーティリティを提供しています。

- MAF AMXページにおける識別子の存在と一意性を確認する。

- 識別子が存在しない場合または一意でない場合、要素の必須id属性ごとにエラーが報告される。

- 自動修正により、識別子の問題が報告されると、要素の一意のidが生成される。

図11-45および図11-46は、ソース・エディタと「構造」ペインの識別子エラー・レポートをそれぞれ示しています。

図11-45 「ソース」エディタの要素識別子監査

図11-46 「構造」ペインの要素識別子監査

idに加え、監査ユーティリティでは「ポップアップ表示動作」操作のpopupIdおよびalignId属性をチェックします(第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

図11-47および図11-48は、ソース・エディタの「ポップアップ表示動作」の「ポップアップID」と「位置合せID」属性のエラー・レポートをそれぞれ示しています。

図11-47 「ソース」エディタのポップアップID属性監査

図11-48 「ソース」エディタの位置合せID属性監査

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

MAFによって使用されるセキュリティ・アーキテクチャでは、MAF AMXページをホストしているブラウザが、リソース取得のためにセキュア・サーバーへの接続に必要なセキュリティ情報にアクセスしないことが保証されます。これはMAF AMXページから行われるAJAXコールに直接影響し、これらのコールはサポートされていないため、MAF AMX UIコンポーネント内からのJavaScriptの使用は制限されます。サーバーとの通信は、埋込みJavaコード層から行う必要があります。

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

この章では、MAF AMXページのユーザー・インタフェースを作成する方法について説明します。

この章には次の項が含まれます:

- 第12.1項「MAF AMXページのユーザー・インタフェースの作成の概要」

- 第12.2項「ページ・レイアウトの設計」

- 第12.3項「UIコンポーネントの作成と使用方法」

- 第12.4項「ジェスチャーの有効化」

- 第12.5項「データ視覚化の指定」

- 第12.6項「UIコンポーネントのスタイル設定」

- 第12.7項「UIコンポーネントのローカライズ」

- 第12.8項「MAFのアクセシビリティのサポートの理解」

- 第12.9項「入力の検証」

- 第12.10項「イベント・リスナーの使用方法」

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

MAFは、iOSとAndroidのどちらのユーザー操作性に対しても適切に動作するMAF AMXページの作成を可能にする一連のUIコンポーネントおよび操作を提供します。

MAF AMXは、UIコンポーネントおよび操作をエディタ・ウィンドウで追加できることにより、通常のOEPEの開発環境を維持しています。本質的には、MAF AMX UIコンポーネントは、iOSおよびAndroidのプラットフォームでネイティブ・コンポーネントのHTML相当物をレンダリングし、OEPEでのそれらのデザインタイムの動作は、その他のテクノロジで使用されるコンポーネントに似ています。さらに、これらのUIコンポーネントは、宣言ナビゲーションおよびデータ・バインディングのためにMAFのコントローラおよびモデルと統合されています。

注意:
モバイル・デバイス用のインタフェースを開発する場合は、画面領域が非常に限られていることに常に注意してください。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

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

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

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

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

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

MAF AMXは、ページ内へのUIコンポーネントの配置を可能にするレイアウト・コンポーネント(表12-1に記載)を提供します。通常、これらのコンポーネントを使用してページの構築を開始し、次にこれらのコンテナ内で、または子コンポーネントとして、他の機能を提供する他のコンポーネントを、レイアウト・コンポーネントに追加します。これらのコンポーネントのいくつかは、拡大するコンポーネント内に配置されたときに拡大する機能などの形状管理機能を提供します。

表12-1 MAF AMXのページ管理、レイアウトおよび間隔調整コンポーネント

コンポーネント

タイプ

説明

表示

コア・ページ構造コンポーネント

MAF AMXファイル内にview要素を作成します。ファイルが作成されるときにファイルに自動的に挿入されます。詳細は、第12.2.1項「表示コンポーネントの使用方法」を参照してください。

パネル・ページ

コア・ページ構造コンポーネント

MAF AMXファイル内にpanelPage要素を作成します。ページ内の中央領域(ヘッダー領域とフッター領域の間を垂直方向にスクロールする)を定義します。詳細は、第12.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

MAF AMXファイルの詳細は、第11.3.1.2項「MAF AMXページの作成」を参照してください。

ファセット

コア・ページ構造コンポーネント

MAF AMXファイル内にfacet要素を作成します。任意の名前のファセットを親コンポーネントに定義します。詳細は、第12.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

フラグメント

コア・ページ構造コンポーネント

MAF AMXファイル内にfragment要素を作成します。ページ・コンテンツの共有を可能にします。詳細は、第12.2.16項「フラグメント・コンポーネントの使用方法」を参照してください。

ファセット定義

コア・ページ構造コンポーネント

MAF AMXファイル内にfacetRef要素を作成します。ページ・フラグメントの定義(fragmentDef)で、ページ・フラグメントの使用箇所で定義されたファセットを参照するために使用します。詳細は、第12.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

パネル・グループ・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelGroupLayout要素を作成します。子コンポーネントを縦または横にグループ化します。詳細は、第12.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・フォーム・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelFormLayout要素を作成します。入力テキストなどのコンポーネントを、それらのラベルおよびフィールドが水平に、または各コンポーネントの上に整列するように配置します。詳細は、第12.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・ラベルおよびメッセージ

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelLabelAndMessage要素を作成します。ラベルおよびその子をレイアウトします。詳細は、第12.2.6項「パネル・ラベルおよびメッセージ・コンポーネントの使用方法」を参照してください。

パネル・ストレッチ・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelStretchLayout要素を作成します。別のパネルの両側にパネルを配置できます。詳細は、第12.2.5項「パネル・ストレッチ・レイアウト・コンポーネントの使用方法」を参照してください。

ポップアップ

セカンダリ・ウィンドウ

MAF AMXファイル内にpopup要素を作成します。詳細は、第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照してください。

パネル・スプリッタ

インタラクティブ・ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelSplitter要素を作成します。詳細は、第12.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

パネル・アイテム

インタラクティブ・ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelItem要素を作成します。詳細は、第12.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

デック

ページ・レイアウト・コンポーネント

MAF AMXファイル内にdeck要素を作成します。詳細は、第12.2.14項「デック・コンポーネントの使用方法」を参照してください。

フレックス・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にflexLayout要素を作成します。使用可能なスペースに応じて、コンポーネントの柔軟なフローを提供します。詳細は、第12.2.15項「フレックス・レイアウト・コンポーネントの使用方法」を参照してください。

スペーサ

ページ・レイアウト・コンポーネント

MAF AMXファイル内のspacer要素によって表される空白の領域を作成します。

詳細は、第12.2.10項「スペーサ・コンポーネントの使用方法」を参照してください。

表のレイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にtableLayout要素を作成します。行で構成された表を表します。詳細は、第12.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

行のレイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にrowLayout要素を作成します。表のレイアウト・コンポーネント内でセルで構成されている行を表します。詳細は、第12.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

セル・フォーマット

ページ・レイアウト・コンポーネント

MAF AMXファイル内にcellFormat要素を作成します。行のレイアウト・コンポーネント内のセルを表します。詳細は、第12.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

メーソンリー・レイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にmasonryLayout要素を作成します。列と行に配置されたタイルとしてその子コンポーネントを表示します。詳細は、第12.2.12項「メーソンリー・レイアウト・コンポーネントの使用方法」を参照してください。

アクセサリ・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にaccessoryLayout要素を作成します。リスト・ビュー・コンポーネント内で使用され、オプションのコンテンツ領域を明らかにするコンテンツの左や右へのドラッグを有効にします。詳細は、第12.2.13項「アクセサリ・レイアウト・コンポーネントの使用方法」を参照してください。

レイアウト・コンポーネントを追加するには、それを「パレット」からMAF AMXページにドラッグ・アンド・ドロップします(第11.3.2.1項「UIコンポーネントの追加」を参照)。その後に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。各特定コンポーネントの属性の詳細は、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>

図12-1 デザインタイムのページ・レイアウト・コンポーネント

レイアウト・コンポーネントのビジュアル・プレゼンテーションを管理するには、標準Cascading Style Sheet (CSS)を使用します。CSSは、アプリケーション・プロジェクトのView Content/cssディレクトリにあり、デフォルトのCSSはMAFによって提供されています。詳細は、第12.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

MAF AMXを使用してiOSプラットフォーム用に作成されたユーザー・インタフェースは、言語環境が左から右、右から左のどちらであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。ポップアップ(第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)、パネル・アイテム、パネル・スプリッタ(第12.2.9項「パネル・スプリッタ・コンポーネントの使用方法」)などの一部のMAF AMXレイアウト・コンポーネントは、特定の右から左の動作を有効化するように構成できます。MAF AMXページの右から左の構成の詳細は、第12.4項「ジェスチャーの有効化」および第11.2.11項「ページ遷移スタイルの指定方法」を参照してください。

注意:
右から左のテキスト方向は、バージョン4.2より前のAndroidではサポートされていません。

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

表示(MAF AMXファイルのview要素)は、コア・ページ構造コンポーネントであり、MAF AMXファイルの作成時にそのファイルに自動的に挿入されます。このコンポーネントは、ページおよびその構造の階層表現を提供し、単一のMAF AMXページを表します。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

パネル・ページ(MAF AMXファイルのpanelPage要素)は、他のコンポーネントをレイアウトする画面のスクロール可能領域の定義を可能にするコンポーネントです。

デフォルトでは、MAF AMXページを作成するときに、OEPEによってパネル・ページ・コンポーネントが自動的に作成され、そのページに挿入されます。そのページにコンポーネントを追加すると、それらはパネル・ページ・コンポーネント内に挿入されます。

特定の領域(ページのヘッダーやフッターなど)をスクロールできないようにし、向きが変更されたときのストレッチを有効化するには、パネル・ページに対してファセット・コンポーネントを指定します。パネル・ページのヘッダー・ファセットには、各ページのナビゲーション・バーに配置されるタイトルが含まれています。パネル・ページに含めることができる他のタイプのファセット・コンポーネントの詳細は、第12.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

次の例は、MAF AMXファイルに定義されたpanelPage要素を示しています。このパネル・ページには、ヘッダー・ファセットが含まれています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
</amx:facet>
</amx:panelPage>

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

パネル・グループ・レイアウト・コンポーネントは、基本レイアウト・コンポーネントであり、その子を垂直方向または水平方向に配置します。また、子コンポーネントをページの横および下に流すラッピング・レイアウト・オプションがあります。

パネル・グループ・レイアウト・コンポーネントを作成するには、「パレット」を使用します。

パネル・グループ・レイアウト・コンポーネントを追加するには:

1. 「パレット」で、「MAF AMX」ペインを開き、MAF AMXページに「パネル・グループ・レイアウト」をドラッグ・アンド・ドロップします。

2. 目的の子コンポーネントをパネル・グループ・レイアウト・コンポーネントに挿入します。

3. 隣接する子コンポーネント間に間隔を追加するには、スペーサ(spacer)コンポーネントを挿入します(「パレット」のMAF AMXペインからも可能です)。

4. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。詳細は、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>

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

パネル・グループ・レイアウト・コンポーネントのスクロール動作は、scrollPolicy属性によって定義され、auto(デフォルト)、noneまたはscrollに設定できます。この動作は、デフォルトでは、アクティブ・スキンに定義されているものになります。

アクティブ・スキンに定義されている動作にかかわらずスクロールを無効にするには、scrollPolicy属性をnoneに設定します。パネル・グループ・レイアウト・コンポーネントがスクロール可能でない場合は、この内容は制限されません。

アクティブ・スキンに定義されている動作にかかわらずスクロールを有効にするには、scrollPolicy属性をscrollに設定します。パネル・グループ・レイアウト・コンポーネントがスクロール可能な場合は、コンポーネントのサイズが制限されるときにスクロールが提供されます。

スクロールでは大量のメモリーが消費され、アプリケーションがクラッシュする可能性があるため、スクロールの使用は最小限にする必要があります。mobileAltaスキン(第12.6.2項「スキニングに関する必知事項」を参照)では、パネル・グループ・レイアウト、パネル・フォーム・レイアウト(第12.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照)および表のレイアウト(第12.2.11項「表のレイアウト・コンポーネントの使用方法」を参照)のスクロールは無効化されています。アプリケーションではmobileAltaスキンを使用し、インスタンスでscrollPolicyをscrollに設定するのは必要な場合に限定することをお薦めします。パネル・フォーム・レイアウトおよび表のレイアウトのスクロール動作をシミュレートするには、スクロールが必要になったときに、スクロール可能なパネル・グループ・レイアウト・コンポーネントでそれらを囲みます。

12.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ページにドラッグ・アンド・ドロップします。

2. 「新規パネル・フォーム・レイアウト」ダイアログで、コンポーネントの属性を設定します。詳細は、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>

12.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ページにドラッグ・アンド・ドロップします。

2. 作成した子ファセット・コンポーネントを確認し、必要に応じて、一部を削除します。

3. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

パネル・ラベルおよびメッセージ(panelLabelAndMessage)コンポーネントは、label属性が定義されていないコンポーネントを配置するために使用します。これらのコンポーネントとしては、通常、出力テキスト、ボタンまたはリンクがあります。

パネル・ラベルおよびメッセージ・コンポーネントを追加するには:

1. 「パレット」のMAF AMXペインで、「パネル・ラベルおよびメッセージ」コンポーネントを「パネル・グループ・レイアウト」コンポーネントにドラッグ・アンド・ドロップします。

2. 「新規パネル・ラベルおよびメッセージ」ダイアログで、コンポーネントの属性を設定します。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されているpanelLabelAndMessage要素を示しています。label属性が、子コンポーネントに対して使用されています。

<amx:panelLabelAndMessage label="Phone" id="plm1">
<amx:outputText value="212-555-0123" id="ot1"/>
</amx:panelLabelAndMessage>

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

ファセット(facet)コンポーネントは、親レイアウト・コンポーネント上に、ヘッダーやフッターなど任意の名前のファセットを定義するために使用します。ファセットの位置およびレンダリングは、親コンポーネントによって決定されます。

MAF AMXページのヘッダーは、通常、ヘッダー、プライマリおよびセカンダリの各ファセットと組み合せたパネル・ページ・コンポーネント(第12.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます。

- ヘッダー・ファセット: ページ・タイトルが含まれています。

- プライマリ・アクション・ファセット: ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセット: ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

MAF AMXページのフッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネント(第12.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます。

- フッター・ファセット: コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

次の例は、パネル・ページ・コンテナ内で宣言されているfacet要素を示しています。ファセットのタイプは、常にそのname属性で定義されます(表12-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>

表12-2は、特定の親コンポーネントとともに使用できる事前定義済ファセット・タイプを示しています。

表12-2 ファセット・タイプと親コンポーネント

親コンポーネント

ファセット・タイプ(名前)

パネル・ページ(panelPage)

header、footer、primary、secondary

リスト・ビュー(listView)

header、footer

カルーセル(carousel)

nodeStamp、carouselItem

パネル・スプリッタ(panelSplitter)

navigator

パネル・ストレッチ・レイアウト(panelStretchLayout)

top、center、bottom

データ視覚化コンポーネント。

詳細は、第12.5項「データ視覚化の指定」を参照してください。

dataStamp、seriesStamp、overview、rows (NBoxに適用可能)、columns (NBoxに適用可能)、cells (NBoxに適用可能)、icon (NBoxNodeに適用可能)、indicator (NBoxNodeに適用可能)

ファセット・コンポーネントを追加するには:

「アウトライン」ペインに表示されるコンテキスト・メニューを使用して、ファセット・コンポーネントを別のコンポーネントの子として追加できます。コンテキスト・メニューには、選択した親コンポーネントで有効なオプションが表示されます。

ファセットを追加するには、「アウトライン」または「ソース」エディタで親コンポーネントを選択してから、次のいずれかの手順を実行します。

- 図12-2に示すとおり、「アウトライン」でamx:PanelPageエントリを右クリックすると、ファセットを入力できます。

図12-2 パネル・ページにファセットを追加するためのポップアップ・メニューの使用方法

あるいは、次のようにします。

1. 「パレット」で、ファセット・コンポーネントを表12-2に示す別のコンポーネントにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

ポップアップ(popup)コンポーネントを使用して、ポップアップ・ウィンドウを表示します。このコンポーネントは、ビュー・コンポーネントの子として宣言できます。

ポップアップ・コンポーネントとともに次の操作を使用できます。

- ポップアップを閉じる動作(closePopupBehavior)の操作は、クライアントによってトリガーされるイベントに応答してポップアップを閉じる宣言的な方法です。

- ポップアップ表示動作(showPopupBehavior)の操作は、ポップアップ表示動作のtype属性を使用して指定されたクライアントによってトリガーされるイベントに応答してポップアップを表示する宣言的な方法です。
ポップアップ表示動作のpopupId属性には、その親コンポーネントに関連するポップアップ・コンポーネントの一意の識別子を指定します。ポップアップ表示動作のalignId属性には、そのポップアップの位置合せを行う際の基準となるUIコンポーネントの一意の識別子を指定します。識別子を手動で設定するのは、手間がかかり、さらに無効な参照が発生する可能性もあるため、これらの2つの属性の値は標準の「プロパティ」ウィンドウと統合されているエディタを使用して設定します。これらの識別子を検証するために特別に定義されている監査ルールがあります(第11.3.2.4章「要素識別子とその監査に関する必知事項」を参照)。

ポップアップ表示動作のdecoration属性では、指定されているalignIdと一致するコンポーネントを指すアンカーを持つようにポップアップを構成できます。これは、decoration属性をanchorに設定することで実行します(デフォルト値はsimple)。

注意:
alignId属性を使用するためにdecoration="anchor"を定義する必要はありません。decoration="anchor"を使用する際に、alignId属性が指定されていないかalignIdで一致するものが見つからない場合は、decorationはsimpleにデフォルト設定されるため、ポップアップ・コンポーネントには最小限の装飾が行われます。

ポップアップ表示動作のalign属性に設定する値は、ポップアップ・コンポーネントの配置を示します(その配置を行うのに十分なスペースがある場合)。十分な領域がない場合は、MAFによって別の位置が選択されます。

ヒント:
ポップアップを画面の中央に配置するには、パネル・ページ・コンポーネントのalignId属性を設定してから、align="center"を使用してください。

ポップアップ表示動作コンポーネントの属性とその値の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されているpopupおよびshowPopupBehavior要素を示しています。

<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:view>

ポップアップ・コンポーネントは、ユーザー入力エラーが発生したときに検証メッセージを表示できます。詳細は、第12.9項「入力の検証」を参照してください。

ポップアップの子を設定するには、次の手順を実行します。

1. 「アウトライン」ペインでpopup要素を選択し、マウスの右ボタンをクリックします。

2. ポップアップ・コンポーネントのリストから「子の追加」を選択します(図12-3を参照)。

図12-3 ポップアップの子属性のリストからの選択

3. このポップアップ表示動作が起動したときに表示されるポップアップ・コンポーネントを選択します。

UIDemoという名前のMAFサンプル・アプリケーションは、ポップアップ・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。UIDemoアプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

パネル・スプリッタ(panelSplitter)コンポーネントは、左側にあるナビゲーション・ペインで制御可能な複数のコンテンツ領域を表示するために使用します。パネル・スプリッタ・コンポーネントは、通常、表示サイズが大きいタブレット・デバイスで使用されます。これらのコンポーネントは、通常、表示領域の左側にリストが、右側にコンテンツがある場合に使用されます。

パネル・スプリッタには、MAF AMXページにパネル・スプリッタをドラッグ・アンド・ドロップすると自動的に生成されるナビゲータ・ファセット(第12.2.7項「ファセット・コンポーネントの使用方法」を参照)、およびパネル・アイテム・コンポーネントを含めることができます。パネル・アイテム(panelItem)コンポーネントは、パネル・スプリッタのコンテンツ領域を表します。各パネル・スプリッタ・コンポーネントには少なくとも1つのパネル・アイテムが必要なため、パネル・スプリッタが作成されるときにパネル・アイテムがパネル・スプリッタに自動的に追加されます。各パネル・アイテム・コンポーネントには、パネル・グループ・レイアウトに含めることができるどのようなコンポーネントも含めることができます(第12.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照)。

「パネル・スプリッタ」の左側は、ナビゲータ・ファセット(navigator)によって表されます。これは、アニメーション付きの複数のコンテンツのみが必要とされる場合(たとえば、異なるボタンを選択してコンテンツを切り替えるときにアニメーションを必要とする選択ボタン付きの複数コンテンツ領域を描画する場合)のオプションです。横モードの場合、このファセットがレンダリングされます。縦モードの場合、ボタンはコンテンツ領域の上に配置され、クリックされたときにこのファセットのコンテンツがポップアップ内で起動されます。

iOSプラットフォーム用の開発を行う場合、右から左の言語環境に対応するようにパネル・スプリッタとパネル・アイテムを構成するには、それらのanimation属性をslideStart、slideEnd、flipStart、flipEndのいずれかに設定します。パネル・アイテム・コンポーネントのanimation属性は、パネル・スプリッタのanimation属性をオーバーライドします。詳細は、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>

その他の例は、「ファイル」→「新」→「MAFサンプル」にあるUIDemoアプリケーションを参照してください。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

スペーサ(spacer)コンポーネントを使用して、MAF AMXページでコンポーネントを区切るために空白領域を作成します。spacerのheight属性(垂直空白用)およびwidth属性(水平空白用)を使用して、縦または横の空白をページに組み込むことができます。

スペーサ・コンポーネントを追加するには、次の手順を実行します。

1. 「コンポーネント」ウィンドウで、「スペーサ」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。詳細は、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..."/>

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

表のレイアウト(tableLayout)コンポーネントは、セルを含む行で構成される一般的な表のフォーマットでデータを表示するために使用します。

行のレイアウト(rowLayout)コンポーネントは、表のレイアウトの単一の行を表します。表のレイアウト・コンポーネントには、1つ以上の行のレイアウト・コンポーネント、または行のレイアウト・コンポーネントを生成できるイテレータ・コンポーネントのいずれかが含まれている必要があります。

セル・フォーマット(cellFormat)コンポーネントは、行のレイアウトのセルを表します。行のレイアウト・コンポーネントには、1つ以上のセル・フォーマット・コンポーネント、セル・フォーマット・コンポーネントを生成できるイテレータ・コンポーネント、属性リスト・イテレータ・コンポーネントまたはファセット定義コンポーネントのいずれかが含まれている必要があります。

表のレイアウト構造では、セル・コンテンツで割合による高さを使用したり、表構造全体に高さをまとめて割り当てることはできません。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスの次の属性の説明を参照してください。

- 表のレイアウト・コンポーネントのlayout属性およびwidth属性

- 行のレイアウト・コンポーネントのwidth属性およびheight属性

表のレイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、「表のレイアウト」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の行のレイアウト・コンポーネント、イテレータ・コンポーネント、属性リスト・イテレータ・コンポーネントまたはファセット定義の子コンポーネントを表のレイアウト・コンポーネントに挿入します。

3. セル・フォーマット・コンポーネント、イテレータ・コンポーネント、属性リスト・イテレータ・コンポーネントまたはファセット定義の子コンポーネントをそれぞれの行のレイアウト・コンポーネントに挿入します。

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、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>

12.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ページにドラッグ・アンド・ドロップします。

2. 目的の数のメーソンリー・レイアウト・アイテム・コンポーネントとその子UIコンポーネントをメーソンリー・レイアウト・コンポーネントに挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、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 Mobile Application Frameworkタグ・リファレンスを参照してください。

12.2.13 アクセサリ・レイアウト・コンポーネントの使用方法

リスト・アイテム子コンポーネント内のリスト・ビューのアクセサリ・レイアウト(accessoryLayout)コンポーネントを使用して、オプションのコンテンツ領域を明らかにするコンテンツの左や右へのドラッグを有効にします。

通常、アクセサリ・レイアウトには、開始および終了の2つの子ファセット・コンポーネントを格納します。ドラッグ・ジェスチャーがファセットの幅を十分に超える場合、そのコンテンツ領域の子コンポーネントの1つのタップをトリガーするようなジェスチャーができます。別のアクセサリ・レイアウトのコンテンツが表示されるとき、または他のコンポーネントにフォーカスが移動したときには、通常、表示されているファセット・コンテンツは非表示になります。ただし、コンテンツがアクセシビリティのトリガーを使用して表示された場合は、フォーカスが移動しても非表示にはなりません。そうでないと、エンド・ユーザーがそのコンテンツ領域内のリンクを使用できません。

アクセサリ・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、「デック」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の遷移操作および子UIコンポーネントをデック・コンポーネントに挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されているaccessoryLayout要素と、その子コンポーネントとして使用されている開始と終了のファセットを示しています。

amx:listView id="lv1">
<amx:listItem id="liSimple">
<amx:showPopupBehavior popupId="itemPopup"
type="action"
alignId="pp1"
align="overlapMiddleCenter"/>
<amx:accessoryLayout id="alSimple"
rendered="#{pageFlowScope.componentProperties.rendered}"
inlineStyle="#{pageFlowScope.componentProperties.inlineStyle}"
styleClass="#{pageFlowScope.componentProperties.styleClass}"
contentStyle="#{pageFlowScope.componentProperties.contentStyle}"
contentClass="#{pageFlowScope.componentProperties.contentClass}"
startDesc="#{pageFlowScope.componentProperties.startDesc}"
startWidth="#{pageFlowScope.componentProperties.startWidth}"
startStyle="#{pageFlowScope.componentProperties.startStyle}"
startClass="#{pageFlowScope.componentProperties.startClass}"
startFullTriggerSelector="#{pageFlowScope.componentProperties.
startFullTriggerSelector}"
endDesc="#{pageFlowScope.componentProperties.endDesc}"
endWidth="#{pageFlowScope.componentProperties.endWidth}"
endStyle="#{pageFlowScope.componentProperties.endStyle}"
endClass="#{pageFlowScope.componentProperties.endClass}"
endFullTriggerSelector="#{pageFlowScope.componentProperties.
endFullTriggerSelector}">
<amx:facet name="start">
<amx:commandLink id="clStartSimple"
text="Start"
styleClass="full-trigger">
<amx:showPopupBehavior popupId="startPopup"
type="action"
alignId="pp1"
align="overlapMiddleCenter"/>
</amx:commandLink>
</amx:facet>
<amx:facet name="end">
<amx:commandLink id="clEndSimple"
text="End"
styleClass="full-trigger">
<amx:showPopupBehavior popupId="endPopup"
type="action"
alignId="pp1"
align="overlapMiddleCenter"/>
</amx:commandLink>
</amx:facet>
<outputText id="otContentSimple" value="Simple example"/>
</amx:accessoryLayout>
</amx:listItem>
...
</amx:listView>

ジェスチャーの完了でリンクのいくつかを非表示にするのが目的ならば、commandLink要素のstyleClass属性をadfmf-accessoryLayout-hideWhenFullに設定します。

その他の例は、CompGalleryサンプル・アプリケーションを参照してください(サンプル・アプリケーションは、「ファイル」→「新規」→MAFサンプルにあります)。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

12.2.14 デック・コンポーネントの使用方法

デック(deck)コンポーネントは、一度に1つの子コンポーネントを示すコンテナを表します。表示される子コンポーネント(displayedChild属性によって定義)の別の子コンポーネントへの遷移は、アニメーションの形式をとる遷移(transition)操作により有効になります。遷移は、フェードイン、スライディングおよび別の方向からのフリップと、子コンポーネントの非表示および表示によって発生します。

デックは、前後に移動できます。

デック・コンポーネントを追加するには、次の手順を実行します。

1. 「コンポーネント」ウィンドウで、「デック」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の遷移操作および子UIコンポーネントをデック・コンポーネントに挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、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 Mobile Application Frameworkタグ・リファレンスを参照してください。

12.2.15 フレックス・レイアウト・コンポーネントの使用方法

フレックス・レイアウト(flexLayout)コンポーネントは、使用可能なスペースに応じて、その子コンポーネントの拡大、縮小、およびラップを可能とする水平または垂直いずれかの柔軟なフローを提供します。ネストされたフレックス・レイアウト・コンポーネントを作成できます。

このコンポーネントは、CSSで定義されている柔軟なボックス・レイアウトに基づいており、そのプロパティのサブセットをサポートしています。詳細は、W3CのWebサイト(http://www.w3.org/TR/css-flexbox-1/)を参照してください。

フレックス・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、フレックス・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. フレックス・レイアウト・コンポーネントに、他のフレックス・レイアウト・コンポーネントを含め、必要な数の子UIコンポーネントを挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルで定義されているflexLayout要素とその子を示しています。

<amx:flexLayout id="fl1"
itemFlexibility="equal"
orientation="#{pageFlowScope.componentProperties.layoutOrientation}"
rendered="#{pageFlowScope.componentProperties.fl1Rendered}">

<amx:panelStretchLayout inlineStyle="background-color: #ff0000; text-align: center;"
rendered="#{pageFlowScope.componentProperties.p1Rendered}">
<amx:facet name="center">
<amx:outputText value="1" inlineStyle="font-size: 36px"/>
</amx:facet>
</amx:panelStretchLayout>

<amx:panelStretchLayout inlineStyle="background-color: #00ff00; text-align: center;"
rendered="#{pageFlowScope.componentProperties.p2Rendered}">
<amx:facet name="center">
<amx:outputText value="2" inlineStyle="font-size: 36px"/>
</amx:facet>
</amx:panelStretchLayout>

</amx:flexLayout>

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

フラグメント(fragment)コンポーネントによってMAF AMXページ・コンテンツの共有が可能になります。このコンポーネントは、MAF AMXフラグメント・ファイルとともに使用されます。詳細は、第11.3.1.6項「ページ・コンテンツの共有」を参照してください。

フラグメント・コンポーネントを追加するには、次の手順を実行します。

1. 「コンポーネント」ウィンドウで、「フラグメント」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 「フラグメントの挿入」ダイアログを使用して、フラグメントのSrc属性をフラグメント・ファイル(.amxf)に設定します。

3. オプションで、「構造」ビューを使用して、属性、属性リスト、ファセットなどの子コンポーネントを追加します。

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、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サンプル・アプリケーションは、フラグメントの作成および使用方法を示しています。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

MAF AMXアプリケーション機能を開発する際に、次のUIコンポーネントを使用できます。

- 入力テキスト(第12.3.1項「入力テキスト・コンポーネントの使用方法」を参照)

- 入力数値スライダ(第12.3.2項「入力数値スライダ・コンポーネントの使用方法」を参照)

- 入力日(第12.3.3項「入力日コンポーネントの使用方法」を参照)

- 出力テキスト(第12.3.4項「出力テキスト・コンポーネントの使用方法」を参照)

- ボタン(第12.3.5項「ボタンの使用方法」を参照)

- リンク(第12.3.6項「リンクの使用方法」を参照)

- イメージ(第12.3.7項「イメージの表示方法」を参照)

- チェックボックス(第12.3.8項「チェックボックス・コンポーネントの使用方法」を参照)

- チェックボックスを複数選択(第12.3.9項「チェックボックスを複数選択コンポーネントの使用方法」を参照)

- 選択肢を複数選択(第12.3.11項「選択肢を複数選択コンポーネントの使用方法」を参照)

- ブール・スイッチ(第12.3.12項「ブール・スイッチ・コンポーネントの使用方法」を参照)

- 選択肢(第12.3.10項「選択肢コンポーネントの使用方法」を参照)

- 選択ボタン(第12.3.13項「選択ボタン・コンポーネントの使用方法」を参照)

- ラジオ・ボタン(第12.3.14項「ラジオ・ボタン・コンポーネントの使用方法」を参照)

- リスト・ビュー(第12.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)

- カルーセル(第12.3.16項「カルーセル・コンポーネントの使用方法」を参照)

- フィルム・ストリップ(第12.3.17項「フィルム・ストリップ・コンポーネントの使用方法」を参照)

- Verbatim (第12.3.18項「Verbatimコンポーネントの使用方法」を参照)

- 出力HTML (第12.3.19項「出力HTMLコンポーネントの使用方法」を参照)

- イテレータ(第12.3.20項「反復の有効化方法」を参照)

- リフレッシュ・コンテナ(第12.3.21項「UIコンポーネントのコンテンツのリフレッシュ方法」を参照)

MAF AMXアプリケーション機能を開発する際は、UIコンポーネントの子として、操作、リスナー・タイプ・コンポーネント、コンバータなど、次のその他のコンポーネントも使用できます。

- バンドルのロード(第12.3.22項「リソース・バンドルのロード方法」を参照)

- アクション・リスナー(第12.3.23項「アクション・リスナーの使用方法」を参照)

- プロパティ・リスナーの設定(第12.3.24項「プロパティ・リスナーの設定の使用方法」を参照)

- クライアント・リスナー(参照

- 日時の変換(第12.3.26項「日時の変換方法」を参照)

- 数値の変換(第12.3.27項「数値の変換方法」を参照)

- ナビゲーション・ドラッグ動作(第12.3.28項「ドラッグ・ナビゲーションの有効化」を参照)

- ロード・インジケータ動作(第12.3.29項「ロード・インジケータの使用方法」を参照)

- システムのアクション動作(参照

UIコンポーネントを追加するには、「パレット」からMAF AMXページにそのコンポーネントをドラッグ・アンド・ドロップします(第11.3.2.1項「UIコンポーネントの追加」を参照)。その後に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。各特定コンポーネントの属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

注意:
MAF AMXページで、レイアウト・コンポーネント内にUIコンポーネントを配置します(第12.2項「ページ・レイアウトの設計」を参照)。<dvtm>ネームスペースの下で宣言するデータ視覚化コンポーネントを除き、UI要素は<amx>>ネームスペースの下で宣言します。

いくつかのUIコンポーネントにはイベント・リスナーを追加できます。詳細は、第12.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもMAF AMX実行時の記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

これらのUIコンポーネントにおけるアクセシビリティのサポートの詳細は、第12.8項「MAFのアクセシビリティのサポートの理解」を参照してください。

MAF AMXを使用してiOSプラットフォーム用に作成されたユーザー・インタフェースは、言語環境が左から右、右から左のどちらであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。

注意:
MAFは、デザインタイムにEL式を評価しません。コンポーネントの属性の値が式に設定されている場合、この値はOEPEのプレビューでは式として表示され、実行時のコンポーネントの表示は異なる場合があります。

CompGalleryという名前のMAFサンプル・アプリケーションは、MAF AMX UIコンポーネントの作成および構成方法を示しています。UIDemoという名前のもう1つのサンプル・アプリケーションは、MAF AMXページでのコンポーネントのレイアウト方法を示しています。これらのサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

12.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" />

図12-4は、「プレビュー」ペインに表示されている入力テキスト・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputText id="inputText1"
label="Input Text"
value="text"/>

図12-4 デザインタイムの入力テキスト

inputType属性によって、コンポーネントでユーザー入力がどのように(テキスト(デフォルト)、電子メール・アドレス、数値、電話番号、URLのいずれかとして)解釈されるのかを定義できます。これらの入力タイプは、HTML5によって許容される値に基づいています。

入力テキスト・コンポーネントに入力される日時値とともに数値の変換を有効にするには、数値の変換(第12.3.27項「数値の変換方法」を参照)および日時の変換(第12.3.26項「日時の変換方法」を参照)コンポーネントを使用します。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

いくつかのモバイル・デバイスでは、エンド・ユーザーが入力テキスト・フィールドをタップすると、キーボードが表示(スライドアップ)されます。入力テキストがMAF AMXページの唯一のコンポーネントである場合、ページがロードされるときに、デフォルトで入力フォーカスはこのフィールド上に配置され、キーボードが表示されます。

複数行入力テキストは、それが唯一のコンポーネントである場合、セカンダリ・ページに表示されることがあります。その場合、ページがロードされてキーボードが表示されたときに複数行入力テキストがフォーカスを受け取ります。

iOSデバイスとAndroidデバイスでは、入力テキスト・コンポーネントのレンダリングおよび動作は異なります。iPhoneおよびiPadでは、入力テキスト・コンポーネントが表示されるときに境界線がある場合とない場合があります。

入力テキスト・コンポーネントを作成する際は、次の点を考慮してください。

- コンテンツを入力または編集するには、エンド・ユーザーはフィールド内をタップする必要があります。それにより、タップした場所に点滅する挿入カーソルが表示され、エンド・ユーザーがコンテンツを編集できるようになります。フィールドにコンテンツが含まれていない場合、挿入カーソルはフィールドの先頭に配置されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、通常、プロンプトとして使用されるデフォルト・テキストが含まれていることがあります。エンド・ユーザーがそのようなフィールド内でキーボードのキーをタップすると、編集モードになったときにそのデフォルト・テキストがクリアされます。この動作は、入力テキストのhintText属性を使用して有効化および構成されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、選択済の外観はありません。選択は、フィールド内の点滅する挿入カーソルによって示されます。

- エンド・ユーザーがフィールドに収まる数を超えたテキストを入力すると、タイピングの続行に従って一度に1文字ずつテキスト・コンテンツが左にシフトします。

- 複数行入力テキスト・コンポーネントは、任意の高さの長方形としてレンダリングされます。このコンポーネントでは、コンテンツが大きすぎてフィールドの境界内に収まらない場合のスクロールがサポートされています。テキスト領域が一杯になるとテキストの行が上にスクロールし、新しい行のテキストが追加されます。指定された表示領域に表示できる数よりも多くの行がある場合、エンド・ユーザーは上または下にフリックしてテキストの行をスクロールできます。コンポーネント内にスクロールバーが表示されてその領域がスクロール可能であることを示します。

- パスワード・フィールドは入力された各文字を一時的にエコーし、その後、その文字をドットに変換してパスワードを保護します。

- iOSでの入力テキスト・コンポーネントの外観および動作は、カスタマイズできます(第12.3.1.1項「入力テキスト・コンポーネントのカスタマイズ」を参照)。

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

MAF AMXでは、iOSデバイスでの入力の大文字化および修正をサポートしており、さらに「実行」ボタンまたは「検索」ボタンとして表示および機能し(図12-6参照)、単一行入力テキスト・コンポーネントではDataChangeEventをトリガーするモバイル・デバイスのソフト・キーパッドの右下にある「return」ボタン(図12-5を参照)をオーバーライドする機能もサポートしています。

図12-5 実行時のiOSデバイスの「return」ボタン

図12-6 実行時のiOSの「Go」および「Search」ボタン

表12-3に、入力テキスト・コンポーネントの属性をリストしますが、これらの属性を使用して、そのコンポーネントの外観および動作と、入力テキストによって表されるフィールドへの値の入力に使用されるソフト・キーパッドをカスタマイズできます。

表12-3 入力テキスト・コンポーネントの入力およびカスタマイズ属性

属性

値

説明

keyboardDismiss

- normal: オペレーティング・システムのデフォルトを使用します。

- go: 動作のトリガーのように動作するフィールドをリクエストします。

- search: 参照をトリガーする検索フィールドのように動作するフィールドをリクエストします。

テキスト・フィールドを使用する方法を示します。

goまたはsearchを指定した場合、キーパッドを無効にすることで、iOSおよびAndroidの両方のプラットフォームで入力がぼやけた状態になります。

iOSの「実行」ボタンおよび「検索」ボタンのサポートは変更されたり、任意の時点で終了される可能性がありますが、一部のiOSデバイスのキーパッドは強化機能を備えています。たとえば、単一行テキスト・フィールドに「return」ボタンを表示するかわりに、「実行」ボタンまたは「検索」ボタンですでに置き換えられている可能性があります。

autoCapitalize

- auto: オペレーティング・システムのデフォルトを使用します。

- sentences: 入力する文を大文字で始めるようにリクエストします。

- none: 入力に大文字化が自動的に適用されないようにリクエストします。

- words: 入力する単語を大文字で始めるようにリクエストします。

- characters: 入力として入力された各文字が大文字化されるようにリクエストします。

入力テキストによって表されるフィールドの編集中に、iOSで値を大文字表記するための特別な処理をリクエストします。

このプロパティの設定はAndroidには影響しません。

autoCorrect

- auto: オペレーティング・システムのデフォルトを使用します。

- on: 入力の自動修正サポートをリクエストします。

- off: 入力の自動修正の無効化をリクエストします。

入力テキストによって表されるフィールドの編集中に、iOSで値を修正するための特別な処理をリクエストします。

このプロパティの設定はAndroidには影響しません。

iOSデバイスのシミュレータでは、自動大文字化および自動修正のサポートが限定されているため、この機能をiOSデバイスでテストする必要があります。

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

入力数値スライダ(inputNumberSlider)コンポーネントは、キーを使用して値を入力するかわりにスライダを使用して値の範囲から数値を選択できるようにします。スライダの溝またはトラックの塗り潰されている部分が、現在の値を視覚的に表しています。

スライダの値を数値的に示すには、出力または入力テキスト・コンポーネントとともに入力数値スライダを使用できます。入力テキスト・コンポーネントではスライダ値を直接入力することもできます。エンド・ユーザーが入力テキスト・フィールドをタップすると、数値モードのキーボードがスライドアップします。このキーボードは、スライドダウン・ボタンを使用するか、スライダ・コンポーネントからタップすることにより消去できます。

入力数値スライダ・コンポーネントは、常に、コンポーネントの定義済範囲内の最大値および最小値を表示します。

注意:
入力数値スライダ・コンポーネントは、正確な数値入力が必要な場合や値の範囲が広い場合(たとえば、0から1000)は使用しないでください。

次の例は、MAF AMXファイルで定義されているinputNumberSlider要素を示しています。

<amx:inputNumberSlider id="slider1" value="#{myBean.count}"/>

図12-7は、「プレビュー」ペインに表示されている入力数値スライダ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputNumberSlider id="inputNumberSlider1"
label="Input Number"
minimum="0"
maximum="20"
stepSize="1"
value="10"/>

図12-7 デザインタイムの入力数値スライダ

入力数値スライダ・コンポーネントに入力される数値の変換を有効にするには、数値の変換コンポーネント(第12.3.27項「数値の変換方法」を参照)を使用します。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

他のMAF AMX UIコンポーネントと同様に、入力数値スライダ・コンポーネントには通常の状態と選択済状態があります。コンポーネントは、いつでもタッチされたときに選択済状態になります。エンド・ユーザーは、スライダ値を変更するには、タッチしてからスライダ・ボタンを操作します。

入力数値スライダ・コンポーネントには、オプションのimageLeft属性およびimageRight属性があり、これらは、エンド・ユーザーに追加情報を提供するためにスライダのいずれかの側に表示可能なイメージを示します。

12.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 Mobile Application Frameworkタグ・リファレンス

- W3Cによって定義されているHTML5のグローバル日付と時刻

- 「ファイル」→「新」→「MAFサンプル」にあるCompGallery

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

MAF AMXは、テキストを表示するラベルとして使用するための出力テキスト(outputText)コンポーネントを提供しています。

次の例は、MAF AMXファイルで定義されているoutputText要素を示しています。

<amx:outputText id="ot1"
value="output"
styleClass="#{pageFlowScope.pStyleClass}"/>

図12-8は、「プレビュー」ペインに表示されている出力テキスト・コンポーネントを示しています。

図12-8 デザインタイムの出力テキスト

出力テキスト・コンポーネントの数値および日時関連データの変換を容易にするには、数値の変換(第12.3.27項「数値の変換方法」を参照)および日時の変換(第12.3.26項「日時の変換方法」を参照)コンバータを使用します。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGalleryおよびUIDemo

12.3.5 ボタンの使用方法

ボタン(commandButton)コンポーネントは、アクション(たとえば、保存、取消し、送信)をトリガーするため、およびアプリケーション内で他のページへのナビゲーション(たとえば、戻る。第12.3.5.7項「戻るボタン・ナビゲーションの有効化」を参照)を有効化するために使用します。

ボタンは、次の方法のいずれかで使用できます。

- テキスト・ラベル付きボタン。

- テキスト・ラベルおよびイメージ・アイコン付きボタン。

注意:
アイコン・イメージと配置(テキスト・ラベルの左または右)を定義できます。

- イメージ・アイコンのみが付いたボタン(たとえば、レコードを追加または削除するための + および - ボタン)。

MAFでは、次の3つの表示領域に対して1つのデフォルト・ボタン・タイプがサポートされています。

1. 最上部ヘッダー・バーに表示されるボタンで、MAF AMXページでは、ヘッダーは、ヘッダー、プライマリおよびセカンダリの各ファセットと組み合せたパネル・ページ・コンポーネント(第12.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます(iPhoneではこれが一般的です)。

- ヘッダー・ファセットには、ページ・タイトルが含まれています。

- プライマリ・アクション・ファセットは、 ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセットは、ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

2. ページのコンテンツ領域に表示されるボタン。

3. ページのフッター・バーに表示されるボタン。MAF AMXページでは、フッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネント(第12.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます。

- フッター・ファセットは、コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

どのタイプでも、すべてのボタン・コンポーネントには次の3つの状態があります。

1. 標準。

2. アクティブ: ボタンがエンド・ユーザーによってタップまたはタッチされたときの外観を表します。ボタンがタップされた(タッチされてリリースされた)ときに、ボタン・アクションが実行されます。タッチしたときにアクティブ化された外観が表示され、リリースしたときにアクションが実行されます。エンド・ユーザーがボタンにタッチした後に指をドラッグしてボタンから離した場合、アクションは実行されません。ただし、ボタンにタッチしている間中、アクティブ化された外観が表示されます。

3. 無効。

ボタン・コンポーネントの外観は、adfmf-commandButton-<style>に設定したそのstyleClass属性によって定義されます。表12-4に示すどのスタイルでも、MAF AMXページ内の有効な任意の場所に配置されているボタンに適用できます。

表12-4 主なボタン・スタイル

ボタン・スタイル名

説明

デフォルト

次の場所に配置されているボタンのデフォルト・スタイル

- いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)内。詳細は、第12.3.5.1項「デフォルト・スタイル・ボタンの表示」を参照してください

- MAF AMXページのコンテンツ領域内の任意の場所。このスタイルは、ページ内のボタンの場所またはコンテキストに基づいてそのページ内で特定のアクションを実行するためのボタンに対して使用されます。

戻る

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)に配置されるボタンの戻るスタイル。このスタイルを、デフォルト・ボタンに適用すると、ページに戻るという外観を表示できます。このボタン・スタイルは、Springboardに戻るまたはページに戻るボタンによく使用されます。

詳細は、第12.3.5.2項「戻るスタイル・ボタンの表示」を参照してください

強調表示

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)またはMAF AMXページのコンテンツ領域に配置されるボタンの強調表示スタイル。このスタイルをボタンに追加すると、保存(または完了)ボタンで一般的なiPhoneボタンの外観を提供できます。

詳細は、第12.3.5.3項「強調表示スタイル・ボタンの表示」を参照してください

アラート

アラート・スタイルは削除の外観をボタンに追加します。詳細は、第12.3.5.4項「アラート・スタイル・ボタンの表示」を参照してください

ボタンに適用して太い角丸の境界線でボタンを修飾できる角丸スタイル(adfmf-commandButton-rounded)があります(図12-9を参照)。このスタイルは他のどのようなスタイルとも組み合せて定義できます。

図12-9 デザインタイムの角丸ボタン

MAF AMXには、多数の追加の装飾スタイルが用意されています(第12.3.5.5項「追加のボタン・スタイルの使用」参照)。

MAF AMXでのボタン・コンポーネントの子の操作および属性の処理には、特定の順序があります。詳細は、第12.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

12.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>

次の例は、イメージ・アイコン付きのデフォルト・ボタンの定義を示しています。

<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 Mobile Application Frameworkタグ・リファレンス

- MAFサンプル・アプリケーションであるCompGalleryは、「ファイル」→「新」→「MAFサンプル」にあります。

12.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に設定した場合は常に、MAF AMXによって戻る矢印スタイル設定が自動的に適用されます(図12-10参照)。

図12-10 デザインタイムの戻るボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

12.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>

図12-11 デザインタイムの強調表示ボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

「パネル・ページ」内に配置されるアラート・スタイル・ボタンには、「標準」、「アクティブ」または「無効」の状態があります。

次の例は、MAF AMXファイルで宣言されているcommandButton要素を示しています。

<amx:commandButton id="cb1"
text="Delete"
actionListener="#{myBean.delete}"
styleClass="adfmf-commandButton-alert" />

図12-12 デザインタイムのアラート・ボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

12.3.5.5 追加のボタン・スタイルの使用

MAF AMXには、次の追加のボタン・スタイルが用意されています。

- 「暗い」スタイル

- 「明るい」スタイル

- 「小規模」スタイル

- 「大規模」スタイル

- 「強調表示」スタイル

- 「確認」スタイル

- 2種類の「代替」スタイル

図12-13 追加のボタン・スタイル

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

MAFアプリケーションでは、次のコンテキスト内でボタン・コンポーネントを使用できます。

- ナビゲーション・バー

- 特定のアクションを実行するためのコンテンツ領域

- アクション・シート

- ポップスタイル・アラート・メッセージ

ナビゲーション・バー

MAFでは、ナビゲーション・バーで使用する標準ボタンを作成できます。

- 編集ボタンで、エンド・ユーザーは編集またはコンテンツ操作モードに入ることができます。

- 取消ボタンで、エンド・ユーザーは、変更を保存することなく編集またはコンテンツ操作モードを終了できます。

- 保存ボタンで、エンド・ユーザーは、変更を保存して編集またはコンテンツ操作モードを終了できます。

- 完了ボタンで、エンド・ユーザーは、変更があれば保存して現在のモードを終了できます。

- 元に戻すボタンで、エンド・ユーザーは最後のアクションを元に戻すことができます。

- やり直しボタンで、エンド・ユーザーは最後の元に戻したアクションをやり直すことができます。

- 戻るボタンで、エンド・ユーザーはSpringboardに戻ることができます。

- ページに戻るボタンで、エンド・ユーザーはボタン・テキスト・ラベルによって識別されるページに戻ることができます。

- 追加ボタンで、エンド・ユーザーは新しいオブジェクトを追加または作成できます。

コンテンツ領域

ページのコンテンツ領域内に配置されたボタンは、そのページ内のボタンの場所およびコンテキストに指定されている特定のアクションを実行します。これらのボタンは、ナビゲーション・バーに配置されているボタンとは異なる外観を持っている場合があります。

アクション・シート

アクション・シート内に配置されるボタンの例には、「ノートの削除」ボタンおよび「取消」ボタンのグループがあります。

アクション・シート・ボタンでは、表示の幅が拡張されます。

アラート・メッセージ

「OK」ボタンは、パスワード入力に失敗した後のログイン検証などの検証メッセージ内に配置できます。

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

MAF AMXでは、前に訪問したページに戻るデフォルト動作を持つ戻るボタンを使用した移動がサポートされています。詳細は、第11.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

__backナビゲーションを備えたパネル・ページのプライマリ・ファセットにボタン・コンポーネントを追加すると、そのボタンには、戻る矢印の視覚的スタイリングが自動的に設定されます(第12.3.5.2項「戻るスタイル・ボタンの表示」を参照)。これを無効にするには、styleClass属性をamx-commandButton-normalに設定します。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

ボタン、リンク、リスト・アイテムなどのコンポーネントがアクティブになっている場合に、MAF AMXによって操作および属性が処理される順序は、次のとおりです。

1. 次の子操作は、XMLファイルに表示される順序で処理されます。

- プロパティ・リスナーの設定

- アクション・リスナー

- ポップアップ表示動作

- ポップアップを閉じる動作

2. アクション・リスナー(actionListener)属性が処理されて関連付けられたJavaメソッドが起動されます。

3. アクション(action)属性が処理されて、ナビゲーション・ケースがあればそれに従います。

12.3.6 リンクの使用方法

リンク(commandLink)コンポーネントは、アクションをトリガーするためおよび他のビューへのナビゲーションを有効化するために使用します。

リンク・コンポーネントは、その子として任意のタイプのコンポーネントを定義できます。プロパティ・リスナーの設定(第12.3.24項「プロパティ・リスナーの設定の使用方法」を参照)、アクション・リスナー(第12.3.23項「アクション・リスナーの使用方法」を参照)、ポップアップ表示動作、ポップアップを閉じる動作(第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)、検証動作(第12.9項「検証の入力」を参照)などのコンポーネントをリンク・コンポーネントの子として使用することで、クリックおよびジェスチャーを実行できるアクション可能な領域を作成できます。

リンク内にイメージ・コンポーネントを配置することで(第12.3.7項「イメージの表示方法」を参照)、クリック可能イメージを作成できます。

次の例は、MAF AMXファイルで宣言されているcommandLink要素を示しています。

<amx:commandLink id="cl1"
text="linked"
action="gotolink"
actionListener="#{myBean.doSomething}"/>

図12-14は、「プレビュー」ペインに表示されている基本的なリンク・コンポーネントを示しています。

図12-14 デザインタイムのリンク

次の例は、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>

図12-15は、フォーム内に配置され、「プレビュー」ペインに表示されているリンク・コンポーネントを示しています。

図12-15 デザインタイムのフォーム内のリンク

MAF AMXでのリンク・コンポーネントの子の操作および属性の処理には、特定の順序があります。詳細は、第12.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

MAF AMXでは、リンクと類似していますが、ページ間のナビゲーションは許可されない別のコンポーネントであるリンク(実行) (goLink)コンポーネントが提供されています。このコンポーネントを使用して、外部ページへのリンクを有効化できます。図12-16は、「プレビュー」ペインに表示されているリンク(実行)コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:goLink id="goLink1"
text="Go Link"
url="http://example.com"/>

図12-16 デザインタイムのリンク(実行)

イメージは、リンク(実行)コンポーネントの子として指定できる唯一のコンポーネントです。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

12.3.7 イメージの表示方法

MAF AMXでは、ビットマップによって表されるイメージ(image)コンポーネントを使用して、iOSおよびAndroidデバイス上にイメージを表示できます。

ボタンおよびリスト・ビューにイメージを配置するだけでなく、それをリンク・コンポーネント内に配置して(第12.3.6項「リンクの使用方法」を参照)クリック可能イメージを作成できます。

次の例は、MAF AMXファイル内のimage要素定義を示しています。

<amx:image id="i1"
styleClass="prod-thumb"
source="images/img-big-#{pageFlowScope.product.uid}.png" />

Androidプラットフォームでサポートされているフォーマットは次のとおりです。

- GIF

- JPEG

- PNG

- BMP

iOSプラットフォームでサポートされているフォーマットは次のとおりです。

- PNG

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGalleryおよびUIDemo

12.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}"/>

図12-17は、「プレビュー」ペインに表示されている選択解除されたチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="false"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図12-17 デザインタイムの選択解除されたチェックボックス

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="true"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図12-18は、「プレビュー」ペインに表示されている選択されたチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

図12-18 選択されたチェックボックスの定義

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

iOSでは、ネイティブ・チェックボックス・コンポーネントはサポートされていません。ブール・スイッチは、通常、プロパティ・ページで使用され、ブール選択を可能にします(第12.3.12項「ブール・スイッチ・コンポーネントの使用方法」を参照)。

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

Androidでは、ネイティブ・チェックボックス・コンポーネントがサポートされています。このコンポーネントは、設定ページで広く使用され、個々の設定値のオンとオフを切り替えます。

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

チェックボックスを複数選択(selectManyCheckbox)コンポーネントは、trueまたはfalseの値の複数選択を可能にするために使用するチェックボックスのグループを表します。これにより、グループ内の各チェックボックスの選択済と選択解除の切替えが可能になります。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第12.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
チェックボックスの複数選択コンポーネントには、アイテムの選択コンポーネントを1つ以上含めることができます。

次の例は、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>

図12-19は、「プレビュー」ペインに表示されているチェックボックスを複数選択コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<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>

図12-19 デザインタイムのチェックボックスを複数選択

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

MAF AMXでは、ポップアップ・スタイル(デフォルト)とリスト・スタイル(使用可能な選択肢の数がデバイスの画面サイズを超えている場合に使用される)の、チェックボックスを複数選択コンポーネントを表示するための2つの代替方法が提供されています。

iPhoneとiPadの両方でのポップアップスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストがポップアップに表示されます。選択を行うには、エンド・ユーザーは1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーはポップアップの外をタップするか、閉じるボタン( x )を使用してポップアップを閉じます。

ポップアップを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

選択肢の数がデバイスのサイズを超える場合、スクロール可能なリスト・ビュー(第12.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)を含むフルページ・ポップアップが生成されます。

iPhoneとiPadの両方でのリストスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照し、1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーは閉じるボタン( x )をタップします。

リストを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

注意:
どちらの場合も、選択を取り消すメカニズムは提供されていません。

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

選択肢(selectOneChoice)コンポーネントは、リストからの単一の値の選択を可能にするために使用するコンボ・ボックスを表します。この選択メカニズムは、選択肢コンポーネントに含まれているアイテムの選択コンポーネント(第12.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
選択肢コンポーネントには、アイテムの選択コンポーネントを1つ以上含めることができます。

次の例は、MAF AMXファイルのselectOneChoice要素の定義をselectItemサブ要素とともに示しています。

<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>

次の例は、MAF AMXファイルのselectOneChoice要素の定義をselectItemsサブ要素とともに示しています。

<amx:selectOneChoice id="choice1"
label="Your state:"
value="#{myBean.myState}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItems id="selectItems1" value="myBean.allStates"/>
</amx:selectOneChoice>

図12-20は、「プレビュー」ペインに表示されている選択肢コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<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>

図12-20 デザインタイムの選択肢

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

MAF AMXでは、選択肢コンポーネントを表示するため、ポップアップ・スタイルとドロップダウン・スタイルの2つの代替方法が提供されています。

iPhoneでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが、デフォルトで最初のオプションが選択された状態で表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照します。選択内容を保存するには、エンド・ユーザーはツール・バーの「終了」をタップします。

iPadでは、ユーザーの対話は、次の点を除いてiPhoneにおける対話と同様です。

- 選択のリストは、ポップアップ・ダイアログに表示されます。

- iPadのスタイリングが選択のリストの周囲に実装され、リストのソースを示すためにノッチが使用されます。

アイテムを選択しないで選択のリストを閉じるには、エンド・ユーザーはポップアップ・ダイアログの外をタップする必要があります。

注意:
選択のリストおよびツール・バーを表示するためのUIは、ブラウザにネイティブであり、CSSを使用してスタイリングすることはできません。

選択肢コンポーネント内のリスト値は、無効として表示できます。

選択肢の数がデバイスの表示サイズを超える場合、ネイティブな方法でスクロール可能なリスト・ページが生成されます。

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

Androidデバイスでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、ポップアップ・ダイアログ形式の選択肢のリストが表示されます。選択肢の数がデバイスのサイズ内に収まる場合は単純なポップアップが表示されます。この場合次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- ポップアップの外で1回タップするか戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

表示される選択肢の数がデバイス・サイズ内に収まらない場合は、ポップアップにスクロール可能リストが含まれます。その場合は次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- 戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

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

アイテムの選択(selectItems)コンポーネントは、複数選択コンポーネントと単一選択コンポーネントの両方で選択できるオブジェクトのリストを提供します。

アイテムの選択(selectItem)コンポーネントは、選択コンポーネントの単一選択可能なアイテムを表しています。

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

選択肢を複数選択(selectManyChoice)コンポーネントは、リストの複数の値の選択を可能にします。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第12.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
チェックボックスを複数選択コンポーネントには、アイテムの選択コンポーネントを1つ以上含めることができます。

次の例は、MAF AMXファイルで宣言されているselectManyChoice要素を示しています。

<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>

図12-21 デザインタイムの選択肢を複数選択

<amx:selectManyChoice id="check1"
label="Select Shipping Options:"
value="#{myBean.shipping}">
<amx:selectItems id="selectItems1" value="#{myBean.shippingOptions}"/>
</amx:selectManyChoice>

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

すべてのサポートされているデバイス上の選択肢を複数選択コンポーネントの外観と動作は、チェックボックスを複数選択コンポーネントとほとんど同一です(詳細は、第12.3.9項「チェックボックスを複数選択コンポーネントの使用方法」を参照してください)。

12.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}"/>

図12-22は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanSwitch id="selectBooleanSwitch1"
label="Switch"
value="value1"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図12-22 デザインタイムのブール・スイッチ

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

iOSでは、プール・スイッチ・コンポーネントは、属性値を有効化または無効化するために設定ページでよく使用されます。

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

選択ボタン(selectOneButton)コンポーネントは、常に1つのボタンがアクティブになっている、アクションをリストするボタン・グループを表します。この選択メカニズムは、選択ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第12.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
選択ボタン・コンポーネントには、アイテムの選択コンポーネントを1つ以上含めることができます。

次の例は、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>

図12-23は、「プレビュー」ペインに表示されている選択ボタン・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<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>

図12-23 デザインタイムの選択ボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

ラジオ・ボタン(selectOneRadio)コンポーネントは、使用可能な選択肢をリストするラジオ・ボタンのグループを表します。この選択メカニズムは、ラジオ・ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第12.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:
ラジオ・ボタン・コンポーネントには、アイテムの選択コンポーネントを1つ以上含めることができます。

次の例は、MAF AMXファイル内のselectOneRadio要素定義を示しています。最初の例は、アイテムの選択コンポーネントを使用したラジオ・ボタンの定義を示しています。

<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>

次の例は、アイテムの選択コンポーネントを使用したラジオ・ボタンの定義を示しています。

<amx:selectOneRadio id="radio1"
label="Choose a pet:"
value="#{myBean.myPet}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItems id="selectItems1" value="myBean.allPets"/>
</amx:selectOneRadio>

図12-24は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<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>

図12-24 デザインタイムのラジオ・ボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

リスト・ビュー(listView)コンポーネントを使用して、エンド・ユーザーが1つ以上のオプションを選択できる選択肢のリストとしてデータを表示します。

通常、リスト・アイテム(listItem)・コンポーネントは、リスト・ビュー・コンポーネント内の1つのアイテムを表しており、リスト・アイテム・コンポーネントをリスト・ビュー内に配置して、データ・アイテムのリストのレイアウト設定およびスタイル設定を行います。各アイテムには複数のリスト・アイテム・コンポーネントが含めることができ、この場合、リスト・アイテム・コンポーネントがアイテム(行)を満たすと、超過リスト・アイテム・コンポーネントは後続行に折り返します。これを構成するには、リスト・ビュー・レイアウト属性をカードに設定します(デフォルト・レイアウトは行で、リスト内の1つのアイテム当たり1つのリスト・アイテム・コンポーネントを表示します)。詳細は、第12.3.15.3項「リスト・ビュー・レイアウトの構成」を参照してください。

リスト・ビューによって、次のうち1つを定義できます。

- リスト(コレクション)内のアイテム数に基づいてレプリケートされる選択可能アイテム。

- リスト・ビューのvar属性およびvalue属性を指定することなく子リスト・アイテム・コンポーネントを追加することによって生成される静的アイテム。これらの静的アイテムは必要な数を追加できます。これは、設計時にリストのコンテンツがわかっている場合に便利です。この場合、リストは編集可能ではなく、メニュー・アイテムのセットのように動作します。

次のタイプのリスト・ビュー・コンポーネントを作成できます。

- 基本リスト
次の例は、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>

図12-25は、デザインタイムの基本リスト・ビュー・コンポーネントを示しています。

図12-25 デザインタイムの基本リスト・ビュー

次の例は、MAF AMXファイル内のlistView要素のもう1つの定義を示しています。この定義も基本コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

<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>

図12-26は、デザインタイムのアイコンおよびテキスト付きリスト・ビュー・コンポーネントを示しています。

図12-26 デザインタイムのアイコン付きリスト・ビュー

- 検索付きリスト

- 区切り付きリスト。このタイプのリストでは、データをグループ化して順序を示すことができます。リスト・ビュー・コンポーネントの属性によって、各区切りの特性が定義されます。属性の詳細は、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に設定することで無効化できます。

インデックス・ユーティリティ(indexer)は、インデックス・バーおよびインデックス・アイテムで構成され、次の特性があります。

- リストにソートされていないデータまたは重複した区切りが含まれている場合、インデックス・アイテムは、リスト内の最初に出現したものを指します。

- 使用可能な文字のみがインデックスで強調表示され、その強調表示されたもののみがアクティブになります。これは、データ・モデルでは変更によってトリガーされます(エンド・ユーザーが「次へ」行アイテムをタップしたときなど)。

- インデックスの大/小文字は区別されません。

- 不明な文字は、ハッシュ( # )記号で隠されます。

インデクサ文字は、リストにロードされた行でのみアクティブ化(タップ)できます。たとえば、リスト・ビューで、fetchSize属性を使用して、文字Cまでの行がロードされた場合、インデクサではAからCまでの文字が有効になります。その他の文字は、行がさらにロードされるとインデクサに表示されます。

表12-5は、インデックス・ユーティリティに定義可能なスタイルを示しています。

表12-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>

図12-27は、デザインタイムの凹枠リスト・ビュー・コンポーネントを示しています。

図12-27 デザインタイムの凹枠リスト・ビュー

次の例は、MAF AMXファイル内のlistView要素のもう1つの定義を示しています。この定義も凹枠コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

<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でのリスト・アイテム・コンポーネントの子の操作および属性の処理には、特定の順序があります。詳細は、第12.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

他のMAF AMXコンポーネントとは異なり、リスト・ビューをMAF AMXページにドラッグ・アンド・ドロップし、データ・コントロールからのコンテンツでlistViewを生成すると、「コンポーネント・ギャラリ」というダイアログが表示されます。このダイアログでリスト・ビューに対して特定のレイアウトを選択できます。図12-28は、リスト・ビュー・コンポーネント・ギャラリを示しています。

図12-28 リスト・ビュー形式のコンポーネント・ギャラリ

表12-6には、リスト・ビュー・コンポーネント・ギャラリに表示されるサポート済のリスト・フォーマットが一覧表示されています。

表12-6 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルトの「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプションでは、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログの状態は変更されません。影響されるのは、生成される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つのバリエーションがあり、表12-7に示す16の固有の説明が提供されています。

表12-7 リスト・ビューのバリエーションとスタイル

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドがリスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドがリスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「パレット」→「データ」→「データ・コントロール」ペインからデータ・バインディングを選択した後、エディタにドロップすると、OEPEにはリストビュー・ギャラリが表示されます(図12-29を参照)。

ダイアログに入力する際は、次の点を考慮してください。

- 左側にあるイメージは、選択されているリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映しています。

- 「値」列の編集可能セルには、静的テキスト文字列が移入されます(表12-8を参照)。

- 「リスト・アイテム・コンテンツ」セルにイメージが含まれている場合、「値」セルはデフォルトで<add path to your image>文字列になります。この場合、それをイメージのパスに置き換える必要があります。

- 「リスト・アイテム選択」は選択モードを示します。

- リスト・ビューに、データがバインドされているのではなく、リスト・アイテム子コンポーネントが含まれている場合、区切り属性を設定できないため、「区切り属性」と「区切りモード」の両方のフィールドは無効化されています。

表12-8 リスト・ビューの静的テキスト文字列

リスト・フォーマット

要素行の値

出力テキストの値

シンプル

- テキスト

- 'ListItemテキスト'

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

- 'メイン・テキスト'

- 'これは従属テキストです。'

開始-終了

- 開始テキスト

- 終了テキスト

- '開始テキスト'

- '終了テキスト'

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

- '上部の開始テキスト'

- '上部の終了テキスト'

- '下部の開始テキスト'

- '下部の終了テキスト'

図12-29は、リスト要素のレイアウトを指定できる「リスト・ビューの構成」ダイアログを示しています。

図12-29 「リスト・ビューの構成」ダイアログ

バインド済リスト・ビューを作成するときに考慮する特殊な場合は次のとおりです。

- JavaBeanメソッドによって汎用性がないリストが戻される場合、図12-29に示すように「要素タイプ」フィールドを使用して、リスト・アイテム・コンテンツを作成する必要があります。

- 用意されているデータ・コレクション値がコレクションベースでない場合、「値」列によって、「値バインディング」列が空白値と置き換えられます。

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

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

- 第12.3.15.3項「リスト・ビュー・レイアウトの構成」

- 第11.3.2.3.3項「コレクションのドラッグ・アンド・ドロップ」

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるUIDemo。このサンプルは、様々なタイプのリスト・ビュー・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。

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

リスト・ビュー・コンポーネントを構成して、任意の長さのリストにデータを表示できます。これは、リストの下部にデータを追加することによって行います。

fetchSize属性によって、リスト・ビュー・コンポーネントが最初にロードする行数が決定されます。fetchSizeで定義されているよりも多くの使用可能な行がある場合は、最後にフェッチされた行の後にクリック可能領域が表示されます。この領域内をクリックすると、fetchSizeに等しい行のバッチがさらにロードされます。表示する行がなくなるとクリック可能領域は表示されなくなります。

fetchSize属性はロード済行の数を表していません。かわりに、何行ずつ増加するのかを表しています。リスト・ビュー・コンポーネントの作成時には、fetchSize属性は、デフォルトでPageDefイテレータのrangeSizeを指すEL式を使用するように設定されています。PageDefファイルの詳細は、第11.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」および図11-40「PageDefファイル」を参照してください。fetchSizeをrangeSizeと同じ値に設定するとアプリケーションのパフォーマンスが向上します。

次の例は、データ・コントロールのtestResultsと呼ばれるコレクションから作成されたlistView要素を示しています(第11.3.2.3項「データ・コントロールのビューへの追加」を参照)。

<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"/>

fetchSize属性が-1に設定されている場合、すてのレコードが取得されます。

リスト・ビュー・コンポーネントの次の2つの属性は、スクロール動作を有効化します。

- showMoreStrategy: 必要な場合にさらに行をロードするためのリスト・ビュー・コンポーネントの計画を定義します。
リスト・ビュー・コンポーネントが親コンテナの1つによるスクロールの対象となるのではなく、独自にスクロールを提供する場合(「リスト・ビューで独自のスクロールを強制するには:」を参照)で、リスト・ビューが最後までスクロールされた場合は、showMoreStrategyが自動的に起動され、レコードの次のセットのフェッチが可能になります。

実行時に、この属性は自身をデフォルトで「さらに行をロード」リンクとして表します。

showMoreStrategy属性の値を設定してリスト・ビューのスクロールおよび行表示動作を構成する方法の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

- bufferStrategy: 行に対するユーザー・インタフェースの保存方法を定義します。
リスト・ビューの高さが制限されており、親コンテナのいずれかによるスクロールの対象になるのではなく、独自のスクロールを提供できる場合(「リスト・ビューに独自のスクロールを適用するには:」を参照)、リスト・ビューには、以前は非表示だった行とそのコンテンツがフェッチされて表示されます。リスト・ビューは、次のいずれかの方法でこれを実現します。

- 隠し行の増加分を継続的にリストに追加する。

- レンダリング・エンジン内で使用可能な追加行の数を制限し、リスト・ビューの表示可能領域(ビューポート)にある行のみを保存することで、MAFアプリケーションが使用するメモリーを減らします。

この機能は、listViewのbufferStrategy属性を使用し、additive (メモリー消費を気にしない場合)またはviewport (メモリー使用量を減らそうとしている場合)のいずれかに設定することによって構成できます。後者の場合、スクロール中に新しい行の内容が表示されるまでに遅延が生じる可能性があります。空白行が表示される数を最小にするために、listViewのbufferSize属性を設定できます。この属性は、行が存在している必要のある、ビューポートから非表示になるまでの距離(ピクセル単位)を決定します。

リスト・ビューで独自のスクロールを強制するには:

- リスト・ビューを、パネル・ページの唯一の非ファセットの子にする。

- リスト・ビューに固定の高さを設定する。次に例を示します。

inlineStyle="height: 200px;"

リスト・ビュー・コンポーネントのrangeChangeListener属性(第12.10項「イベント・リスナーの使用方法」を参照)では、「さらに行をロード」リンクがアクティブ化されている場合またはリスト・ビューが最後までスクロールされている場合のJavaハンドラ・メソッドをバインドできます。このメソッドは、oracle.adfmf.amx.event.RangeChangeEventオブジェクトをパラメータとして使用し、「プロパティ」ウィンドウから「プロパティの編集 - 範囲変更リスナー」ダイアログを起動したときに作成されます。

ダイアログの「OK」をクリックすると、この設定がMAF AMXページのlistView要素に追加されます。

<amx:listView id="listView1" rangeChangeListener="#{pageFlowScope.HRBean.goGet}" >

また、次の例に示すJavaメソッドがサンプルのHRBeanクラスに追加されます。

public void goGet(RangeChangeEvent rangeChangeEvent) {
// Add event code here...
}

注意:
rangeChangeListenerは、リスト・ビューによって新しいデータがフェッチされるたびにコールされます。RangeChangeEventを使用して、さらにデータが使用可能かどうかを定義できます(第12.10項「イベント・リスナーの使用方法」を参照)。

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

リスト・ビューのアイテムは再配置できます。この機能は、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 Mobile Application Frameworkタグ・リファレンスを参照してください。

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

リスト・ビュー・コンポーネントは、各行が1つのリスト・アイテム・コンポーネントを含んでいる(デフォルト)行のセットとして、または、各カードが1つ以上のリスト・アイテム・コンポーネントを含んでいるカードのセットとしてレイアウトできます。

レイアウトを定義するには、リスト・ビューのlayout属性を使用し、これをrowsまたはcardsに設定します。カード・レイアウトを使用する場合は、次の点について考慮してください。

- 各リスト・アイテム・コンポーネントは、水平に並べられたカードのグループ内のカードとして表示されます。

- 使用可能なスペースがすべて消費されると、次のカードが新しい行で折り返されます。

- リスト・ビュー内でリスト・アイテム・コンポーネント(カード)の水平配置を制御するには、リスト・ビューのhalign属性をstart、centerまたはendに設定します。

- リスト・ビューの外観を一般的にカスタマイズするには、次の手順を実行します。

- スキン内でデフォルトで定義されているカード・サイズをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しい幅を指定します。詳細は、第12.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

注意:
値をautoにしたり、パーセント単位を使用することはできません。

あるいは、スキニングを使用して.amx-listView-cards .amx-listItemセレクタから幅をオーバーライドできます(第12.6.2項「スキニングに関する必知事項」を参照)。

- スキン内でデフォルトで定義されているカードの周囲のスペースをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しいmargin-topおよびmargin-leftを指定し(第12.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をオーバーライドします(第12.6.2項「スキニングに関する必知事項」を参照)。

レイアウトの場合、halign属性を使用して、わずかなリスト・アイテム・コンテンツの配置を変更します。ただし、この属性を使用しても、視覚的な効果がないことがあります。

カード・レイアウトを備えたリスト・ビュー・コンポーネントが編集モードにあると、レイアウトはrowsモードに切り替わります。

MAF AMXページ・レイアウトを特定のパターンに合せるために、一連の事前定義済スタイルを使用するstyleClass属性(第12.6項「UIコンポーネントのスタイル設定」を参照)を介して定義される様々なタイプのリスト・ビュー・コンポーネントおよびスタイルを組み合せて使用できます。

UIDemoという名前のMAFサンプル・アプリケーションは、各コンポーネントのすべてのオプションのスタイルおよびそれに関連するレンダリングを示しています。UIDemoアプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

次の例は、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>

図12-30は、各行の開始(左)側と終了(右)側に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図12-30 デザインタイムの開始および終了テキストを持つリスト・ビュー

次の例は、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>

図12-31は、各行の開始と終了に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、リンクを表す右向き矢印は含まれていません。

図12-31 デザインタイムの拡張リンクのない開始および終了テキストを持つリスト・ビュー

次の例は、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>

図12-32は、各行の開始と終了に異なるスタイルのテキストが追加され、左側の終了テキストの下にサブテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図12-32 デザインタイムの開始および終了テキストとサブテキストを持つリスト・ビュー

次の例は、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>

図12-33は、各行にメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図12-33 デザインタイムのメイン・テキストとサブテキストを持つリスト・ビュー

次の例は、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>

図12-34は、各行に、アイコンおよびメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図12-34 デザインタイムのアイコン、メイン・テキストおよびサブテキストを持つリスト・ビュー

次の例は、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>

図12-35は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図12-35 デザインタイムの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>

図12-36は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図12-36 デザインタイムの拡張リンクのない4つのタイプのテキストを持つリスト・ビュー

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

モデルからではなくハードコード化された値によって移入されるリスト・ビュー・コンポーネントを作成する場合、このリスト・ビューは静的になり、デザインタイムに設定するそのプロパティのいくつか(たとえばdividerAttribute、dividerMode、fetchSize、moveListener)がランタイムに無視されるようになります。

MAF AMXでは、リスト・ビュー・コンポーネントのvalue属性が設定されていない場合、そのコンポーネントを静的であるとみなします。そのようなリストは編集できません(つまり、リストのeditMode属性を指定できません)。

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

カルーセル(carousel)コンポーネントは、回転カルーセルにイメージなどの他のコンポーネントを表示するために使用します。エンド・ユーザーは、スライダを使用するか、別のイメージを正面にドラッグすることでアクティブなアイテムを変更できます。

カルーセル・コンポーネントにはカルーセル・アイテム(carouselItem)コンポーネントが含まれており、text属性によって表されるそのテキストは、それがそのカルーセルのアクティブなアイテムであるときに表示されます。通常、カルーセル・アイテムにはイメージ・コンポーネントが含まれていますが、他のコンポーネントを使用することもできます。たとえば、イメージを囲む子としてリンクを使用することもできます。表示するオブジェクトごとにカルーセル・アイテム・コンポーネントを作成し、これらのコンポーネントを個々のオブジェクトにバインドするかわりに、カルーセル・コンポーネントを完全なコレクションにバインドします。その後、コンポーネントは各アイテムに値をスタンプすることで、1つのカルーセル・アイテム・コンポーネントを繰り返しレンダリングします。各アイテムがスタンプされると、現在のアイテムのデータが、EL式でカルーセル・コンポーネントのvar属性を使用して特定可能なプロパティにコピーされます。カルーセルのレンダリングが完了したら、このプロパティは削除されるか前の値に戻ります。カルーセル・コンポーネントにはnodeStampというファセットが含まれており、これは、各アイテムのテキストと短い説明の両方を表示するために使用されるカルーセル・アイテムのホルダーであり、各アイテムに表示されるイメージに対する親コンポーネントでもあります。

カルーセル・アイテムは、その子コンポーネントのみ拡大します。単一のイメージ・コンポーネントをカルーセル・アイテムの内部に配置する場合、イメージはそのアイテムに割り当てられた四角形に合せて拡大されます(エンド・ユーザーがカルーセルをスピンすると、これらのサイズが縮小または拡大されます)。

ヒント:
アプリケーションのパフォーマンスの低下を最小限に抑えるは、重いコンポーネントを子として使用しないようにします。複雑な構造にすると、いくつかのカルーセル・アイテム・スタンプが同時に表示されるため、その影響が倍増します。

デフォルトでは、カルーセルは水平に表示されます。水平方向のカルーセル内にあるオブジェクトは中央に垂直に配置され、カルーセル自体はコンテナの中心に水平に配置されます。参照ローロデックスが必要な場合は、垂直に表示されるようにカルーセルを構成できます。デフォルトでは、垂直方向のカルーセル内にあるオブジェクトは中心に水平に配置され、カルーセル自体は中央に垂直に配置されます。カルーセルのorientation属性を使用してこの配置を変更できます。

前後のイメージを部分的に表示するかわりに、displayItems属性を使用して、フィルムストリップ・デザインまたは循環デザインでイメージを表示するようにカルーセルを構成することができます。

デフォルトでは、カルーセルが循環モードで表示するように構成されている場合、エンド・ユーザーが補助アイテム(現在、中央に表示されていないアイテム)にポインタを置くと、そのアイテムが枠で囲まれ選択可能であることが示されます。auxiliaryPopOut属性を使用すると、アイテムが移動し、最大サイズで表示されるように、カルーセルを構成できます。

OEPEでは、「カルーセル」は「パレット」のMAF AMXの下にあります(図12-37を参照)。

図12-37 「パレット」の「カルーセル」

カルーセル・コンポーネントを作成するには、表示するイメージを含むデータ・モデルを作成してから、カルーセルをそのモデルにバインドし、カルーセル・アイテム・コンポーネントをカルーセルの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 Mobile Application Frameworkタグ・リファレンス

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

フィルム・ストリップ(filmStrip)は、グループ(ページ)のセット内に分散されたデータを垂直方向または水平方向に視覚化するコンテナ・コンポーネントです。グループに含まれるディスプレイ・アイテム(filmStripItem)を表すUIコンポーネントは、同じサイズおよびタイプである必要があり、一度に1つのグループのみを表示できます。エンド・ユーザーは、フィルム・ストリップのページを移動でき、アイテムを選択してタップすることでアクションを生成できます。

OEPEでは、フィルム・ストリップは「パレット」のMAF AMXの下にあります(図12-38を参照)。

図12-38 「パレット」の「フィルム・ストリップ」

次の例は、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}">
<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 Mobile Application Frameworkタグ・リファレンス

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

垂直に配置されたフィルム・ストリップでは、ディスプレイ・アイテムは上から下に配置されます。テキストの方向に応じて、ページ制御は次のように配置されます。

- テキストの方向が左から右の場合、ページ制御は右側に置かれます。

- テキストの方向が右から左の場合、ページ制御は左側に置かれます。

水平に配置されたフィルム・ストリップでは、テキストの方向モードを反映する必要があり、左から右モードでは最初のアイテムが左に置かれ、右から左モードでは最初のアイテムは右に置かれます。どちらの場合でも、ページ・ステータス・コンポーネントは一番下にあります。

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

フィルム・ストリップ・コンポーネントのナビゲーションはデック(第12.2.14項「デック・コンポーネントの使用方法」を参照)およびパネル・スプリッタ・コンポーネント(第12.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照)と同様で、一度に1ページが表示され、ページの変更はページIDまたは番号の選択によってトリガーされます。

子フィルム・ストリップ・アイテム・コンポーネントは、他のMAF AMXページに移動するための使用は想定されていないため、action属性をサポートしていません。必要な場合は、ネストされているコマンド・リンク・コンポーネントを介してナビゲーションを有効化できます。

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

該当するコンポーネントが存在しない場合や自身でHTMLを使用してレイアウトする必要がある場合は、Verbatim (verbatim)操作を使用して独自のHTMLをページに挿入できます。

OEPEでは、「Verbatim」は「パレット」のMAF AMXの下にあります(図12-39を参照)。

図12-39 「パレット」の「Verbatim」

詳細および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

12.3.18.1 JavaScriptおよびAJAXのVerbatimコンポーネントでの使用に関する必知事項

JavaScriptを直接Verbatimコンテンツ(amx:verbatim要素内)に挿入することは、現在サポートされているプラットフォームの今後のバージョンまたはMAFが今後サポートする可能性のあるその他のプラットフォームで正しく実行されない可能性があるため推奨されていません。かわりに、maf-feature.xmlファイルにある既存のadfmf:include要素を介してJavaScriptおよびCSS包含を実行する必要があり、これにより、MAF AMXアプリケーション機能の起動時にスクリプトが確実にページに挿入されます。

さらに、VerbatimコンポーネントでのJavaScriptの使用は、AMXページからサーバーへのAJAXコールがサポートされていないために影響を受けます。これは、セキュリティ・アーキテクチャによるもので、これによってMAF AMXページをホストするブラウザが、そのリソースを取得するためにセキュア・サーバーに接続するために必要なセキュリティ情報に対してアクセス権を持たないことが保証されます。かわりに、サーバーとの通信は、埋込みJavaコード層から発生する必要があります。

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

出力HTML (outputHtml)コンポーネントでは、HTMLコンテンツをMAF AMXページに表示するために、ELでバインドされたプロパティまたはメソッドから動的および安全に取得できます。出力HTMLコンポーネントはVerbatimコンポーネント(第12.3.18項「Verbatimコンポーネントの使用方法」を参照)と同様に動作し、JavaScriptおよびAJAXの使用に関して同じ制限が適用されます(第12.3.18.1項「JavaScriptおよびAJAXのVerbatimコンポーネントでの使用に関する必知事項」を参照)。

OEPEでは、出力HTMLは「パレット」のMAF AMXの下にあります(図12-40を参照)。

図12-40 「コンポーネント」ウィンドウの出力HTML

次の例は、MAF AMXファイル内のoutputHtml要素定義を示しています。value属性は、文字列プロパティに対してELバインディングを提供し、これは、MAF AMXページの最終レンダリングのoutputHTMLとして表示されるHTMLコンテンツを取得するために使用されます。

<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という名前のJavaBeanのコードを示しています。

// 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コンテンツをリモート・ソースから直接ダウンロードするのではなく、JavaBeanプロパティから取得するため、動的に提供されるHTMLの取得または生成をコーディングする場合は、既存のMAFセキュリティ機能を使用することを検討してください。詳細は、第29章「MAFアプリケーションの保護」を参照してください。さらに、提供されるHTMLが信頼できるソースのものであり、脅威がないことを確認してください。

詳細および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

12.3.20 反復の有効化方法

イテレータ(iterator)操作を使用して、同じ種類のデータを持つ任意の数のアイテムをスタンプします。これによりデータを繰り返し処理して各要素のUIを作成できます。

OEPEでは、「イテレータ」は「パレット」のMAF AMXの下にあります。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

12.3.21 UIコンポーネントのコンテンツのリフレッシュ方法

リフレッシュ・コンテナ(refreshContainer)コンポーネントには、エンド・ユーザーのプルダウン・ジェスチャーによってステータス・インジケータが表示され、リフレッシュできるコンテンツが格納されます。

プルダウン・ジェスチャーが解放されるか、またはそのしきい値に到達したときにコンテンツの更新が開始され、リスト・アイテムのインスタンスなどのコンテンツがリフレッシュされるまでステータス・インジケータが変化します。

つまり、リフレッシュ・コンテナ・コンポーネントでは、リフレッシュをジェスチャーとして公開でき、MAF AMXページにリフレッシュ・ボタンを追加する必要がなくなります。エンド・ユーザーにとって望ましくないスクロールを発生させることになるため、リフレッシュ・コンテナをスクロール可能な親コンポーネント内で配置しないように注意してください。そのかわりに、リフレッシュ・コンテナの内側にリスト・ビューなどのスクロール可能なコンポーネントを配置できます。エンド・ユーザーがリフレッシュ・コンテナ内の任意の場所でプルダウン・ジェスチャーを実行すると、MAF AMXにより、リフレッシュ・コンテナとエンド・ユーザーの指の間で、その上にスクロールされているUIコンポーネントがないか確認されます。その上にスクロールされているコンポーネントがない場合は、エンド・ユーザーが通常どおりにコンテンツをスクロールできるように、リフレッシュ・コンテナはジェスチャーを無視します。すべてのコンポーネントがその上にスクロールされている場合は、リフレッシュ・コンテナは、エンド・ユーザーがコンテンツをプルダウンすることを許し、以前非表示にされた情報ポケットがリフレッシュ・コンテナの上に表示されます。必要なしきい値(スキンに指定された高さ)に到達する前に指が離された場合は、そのポケットは再び非表示になります。エンド・ユーザーがそのしきい値を超えて指を下にドラッグした場合は、アクション・イベントが発生してアプリケーションは操作を実行でき、データがリフレッシュされます。このポケットは、処理が完了するか、またはリフレッシュ・コンテナのオプションのrefreshCompleteExpression属性が指定されていれば、データの変更イベントが発生するまで、開いたままです。

次の例は、MAF AMXファイルのrefreshContainer要素の定義を示しています。このコンポーネントでは、リスト・ビューのコンテンツがリフレッシュされます。pullText、busyText、subTextの各属性は、アクティブ化されたリフレッシュ・コンテナの様々な段階で表示されるテキストを定義します。

OEPEでは、リフレッシュ・コンテナは「パレット」のMAF AMXの下にあります。

<amx:refreshContainer id="rc1"
refreshDesc="#{pageFlowScope.componentProperties.refreshDesc}"
pullText="#{pageFlowScope.componentProperties.pullText}"
busyText="#{pageFlowScope.componentProperties.busyText}"
subText="#{pageFlowScope.componentProperties.subText}"
actionListener="#{PropertyBean.RefreshActionHandler}">
<amx:setPropertyListener type="action"
from="Last updated: Recently"
to="#{pageFlowScope.componentProperties.subText}"/>
<amx:listView id="listView1"
var="row"
value="#{bindings.contacts.collectionModel}"
bufferStrategy="viewport"
collapsibleDividers="true"
dividerAttribute="last"
dividerMode="firstLetter"
rendered="#{pageFlowScope.componentProperties.rendered}"
showDividerCount="true"
showMoreStrategy="autoScroll">
<amx:listItem id="listItem1" action="details">
<amx:outputText id="outputText1"
value="#{row.first} #{row.last}"/>
<amx:setPropertyListener from="#{row.rowKey}"
to="#{pageFlowScope.currentContact}"
type="action"/>
<amx:setPropertyListener from="#{row.first}"
to="#{pageFlowScope.currentContactFirst}"
type="action"/>
<amx:setPropertyListener from="#{row.last}"
to="#{pageFlowScope.currentContactLast}"
type="action"/>
<amx:setPropertyListener from="#{row.address}"
to="#{pageFlowScope.currentContactAddress}"
type="action"/>
<amx:setPropertyListener from="#{row.city}"
to="#{pageFlowScope.currentContactCity}"
type="action"/>
<amx:setPropertyListener from="#{row.state}"
to="#{pageFlowScope.currentContactState}"
type="action"/>
<amx:setPropertyListener from="#{row.zip}"
to="#{pageFlowScope.currentContactZip}"
type="action"/>
<amx:setPropertyListener from="#{row.phone}"
to="#{pageFlowScope.currentContactPhone}"
type="action"/>
<amx:setPropertyListener from="#{row.mobile}"
to="#{pageFlowScope.currentContactMobile}"
type="action"/>
</amx:listItem>
</amx:listView>
</amx:refreshContainer>

詳細および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

バンドルのロード(loadBundle)操作によって、ページ上のMAF AMX UIコンポーネントにローカライズ済テキストを提供するリソース・バンドルを指定できます。詳細は、第12.7項「UIコンポーネントのローカライズ」を参照してください。

OEPEでは、「バンドルのロード」は「パレット」のMAF AMXの下にあります(図12-41を参照)。

図12-41 「パレット」の「バンドルのロード」

MAF AMXファイル内で、loadBundle要素をview要素の子として宣言します。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

アクション・リスナー(actionListener)コンポーネントにより、親コンポーネントが使用するタイプに基づいてELを介して宣言でコマンドを呼び出すことができます。

アクション・リスナー・コンポーネントを使用する重要な理由は、ジェスチャー・サポート・アクションを親コンポーネントに追加できること、および1つのジェスチャー(タップを含む)で複数の操作を実行できる機能です。詳細は、第12.3.23.1項「アクション・リスナー・コンポーネントと属性間の相違点に関する必知事項」を参照してください。

OEPEでは、「アクション・リスナー」コンポーネントは「パレット」のMAF AMXの下にあります(図12-42を参照)。

図12-42 「パレット」の「アクション・リスナー」

0(ゼロ)以上のアクション・コンポーネントを任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム、フィルム・ストリップ・アイテムおよびデータ視覚化コンポーネントのサブセット)の子として追加できます。アクション・リスナー・コンポーネントのtype属性は、ActionEventを作動させるジェスチャー(swipeLeft、swipeRight、tapHoldなど)を定義します。

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

- 第12.10項「イベント・リスナーの使用方法」

- 第12.3.24項「プロパティ・リスナーの設定の使用方法」

- 第12.4項「ジェスチャーの有効化」

- 第12.3.23.1項「アクション・リスナー・コンポーネントと属性間の相違点に関する必知事項」

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

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

ボタン、リンク、リスト・アイテムなどのコンポーネントにはactionListener属性があり、これは、アクション・リスナー・コンポーネントを冗長にする可能性があります。ただし、アクション・リスナー・コンポーネントとは異なり、これらのコンポーネントにはジェスチャーをサポートするtype属性がないため、MAFでは、親コンポーネントのactionListener属性に加えて、アクション・リスナー・コンポーネントが提供されています。

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

プロパティ・リスナーの設定(setPropertyListener)コンポーネントによって、コンポーネントでのエンド・ユーザー・アクションを受けて、1つの場所(コンポーネントのfrom属性で定義)から別の場所(コンポーネントのto属性で定義)に宣言的に値をコピーできるため、同じ結果を得るためにJavaコードを記述する必要がありません。

OEPEでは、「プロパティ・リスナーの設定」コンポーネントは「パレット」のMAF AMXの下にあります(図12-43を参照)。

図12-43 「パレット」の「プロパティ・リスナーの設定」

次の例は、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属性は、ActionEventを作動させるジェスチャー(swipeLeft、swipeRight、tapHoldなど)を定義します。

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

- 第12.10項「イベント・リスナーの使用方法」

- 第12.3.23項「アクション・リスナーの使用方法」

- 第12.4項「ジェスチャーの有効化」

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

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

クライアント・リスナー(clientListener)コンポーネントを使用すると、特定のイベント・タイプの起動時に実行されるJavaScriptリスナー・スクリプトを宣言的に登録できます。

ナビゲーション・ドラッグ動作やポップアップ表示動作など、既存の動作コンポーネントにはスクリプトが不要なものもあるため、クライアント・リスナー・コンポーネントを使用する前に、このようなコンポーネントがMAF AMXに含まれているかどうかを確認する必要があります。

OEPEでは、プロパティ・リスナーの設定コンポーネントは「パレット」のMAF AMXの下にあります。

次の例は、MAF AMXファイルのclientListener要素定義を示しています。両方の属性が必要で、次のように指定されている必要があります。

- method: 指定タイプのイベントでトリガーされると起動する、クライアント側のJavaScriptメソッド名を定義します。

- type: リスニング対象のクライアント側コンポーネント・イベントのタイプを定義します。必ずしもすべてのイベント・タイプがすべてのコンポーネントに存在するわけではなく、すべてのイベントがプラットフォーム間または同じプラットフォームのバージョン間で常に動作しているわけではありません。イベントの例としては、action (親コンポーネントがボタンの場合)、valueChange (親コンポーネントが入力テキストの場合)などがあります。親コンポーネントによっては、touchstart、touchend、tap、tapholdなど、いくつかのDOMイベントを使用できる場合があります。また、ビュー・コンポーネントのshowpagecomplete、mafviewvisible、mafviewhidden、amxnavigatestart、amxnavigateend (これらのイベントの詳細は、第13.10.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>

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

- 第12.10項「イベント・リスナーの使用方法」

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

12.3.26 日時の変換方法

日時の変換(convertDateTime)は、独立したUIコンポーネントではありません。これは、出力テキストおよび入力テキスト・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された日付、時刻または日時の組合せを表示するコンバータ操作です。

OEPEでは、「日時の変換」は「パレット」のMAF AMXの下にあります(図12-44を参照)。

図12-44 「パレット」の「日時の変換」

次の例は、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 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などです。

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

java.text.SimpleDateFormat定義に従って、日時書式を、日時パターン文字列で指定します。日時パターン文字列では、引用符で囲まれていないAからZおよびaからzの文字は、日付または時間の文字列のコンポーネントを表すパターン文字と認識されます。テキストは、解釈されないように一重引用符(')で囲むことができます。" ' ' "は一重引用符を表します。すべてのその他の文字は解釈されません。かわりに、それらは書式設定中に単に出力文字列にコピーされるか、解析中に入力文字列と照合されます。

表12-9は、定義済パターン文字を示しています(AからZおよびaからzのすべてのその他の文字は予約されています)。

表12-9 日時パターン文字

文字

日付または時刻のコンポーネント

表示内容

例

G

紀元

テキスト

- AD

y

年

年

- 1996

- 96

M

年における月

月

- July

- Jul

- 07

w

年における週

数値

- 27

W

月における週

数値

- 2

D

年における日

数値

- 189

d

月における日

数値

- 10

F

月における曜日

数値

- 2

E

曜日

テキスト

- Tuesday

- 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

パターン文字は通常繰り返されます。これは、それらの数が正確な表示を決定するためです。

12.3.27 数値の変換方法

数値の変換(convertNumber)は、独立したUIコンポーネントではなく、出力テキストおよび入力テキスト、入力テキストおよび入力数値スライダの各コンポーネントと組み合せて使用して、次の指定されたパターンに従った様々な書式で、変換された数値または通貨値を表示するコンバータ操作です。

数値の変換コンポーネントは、次のタイプの操作を提供します。

- 値から文字列。表示目的です。

- 書式設定された文字列から値。書式設定された入力値が、基礎となっている値に解析される場合です。

数値の変換が、入力テキスト・コンポーネントの子として指定されている場合、デフォルトで、モバイル・デバイスに数字キーボードが表示されます。

OEPEでは、「数値の変換」は「パレット」のMAF AMXの下にあります(図12-45を参照)。

図12-45 「コンポーネント」ウィンドウの「数値の変換」

次の例は、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 Mobile Application Frameworkタグ・リファレンスを参照してください。

注意:
数値の変換コンポーネントは、デザインタイムには何の効果も持ちません。

12.3.28 ドラッグ・ナビゲーションの有効化

ナビゲーション・ドラッグ動作(navigationDragBehavior)の処理では、モバイル・デバイスの画面を指定された方向(左または右)にドラッグすることで、次または前のMAF AMXページに移動するアクションを起動できます。指定された方向へのドラッグが発生するとインジケータが画面の適切な側に表示され、引き続きドラッグしてインジケータが完全に表示されたときに停止するとアクションが実行されることを示します。インジケータが完全に表示される前にドラッグを放すと、インジケータがスライドされ、アクションは起動されません。

注意:
ドラッグ・ジェスチャーを消費する近いコンテナが他にない場合、この動作は発生しません。

MAF AMXページには、navigationDragBehavior要素の3つ以上のインスタンスを含むことはできず、1つはdirection属性をbackに設定したもので、もう1つはforwardに設定したものです。

OEPEでは、ナビゲーション・ドラッグ動作は「パレット」のMAF AMXの下にあります(図12-46を参照)。

図12-46 「パレット」の「ナビゲーション・ドラッグ動作」

次の例は、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>

図12-47は、実行時のドラッグ・ナビゲーション動作を示しています(mobileFusionFxスキンを使用して表示)。

図12-47 実行時のドラッグ・ナビゲーション動作の処理

詳細および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

12.3.28.1 disabled属性に関する必知事項

disabled属性の値(次の2つの例を参照)は、次のいずれかのことが発生したときに計算されます。

- MAF AMXページがレンダリングされる。

- PropertyChangeListenerがコンポーネントを更新する: エンド・ユーザーのナビゲーション・ドラッグ動作を起動する機能を動的に有効化または無効化する場合、PropertyChangeListenerを使用します(Beanからの更新が必要な他のコンポーネントで使用される方法と同様)。

次の最初の例は、disabled属性が定義されているnavigationDragBehavior要素を含むMAF AMXページを示しています。アクティブ化された場合に、disabled属性がその値を読み取るバッキングBeanのboolean値(次の2番目の例のnavDisabled)を変更するボタン(commandButton)によって機能が駆動されます。その後、バッキングBeanはPropertyChangeListenerを使用します。

<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 (前述の例の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);
}
}

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

ロード・インジケータ動作(loadingIndicatorBehavior)の処理では、次のことをオーバーライドすることで、ロード・インジケータの動作を定義できます。

- フェイルセーフ・タイマーの持続時間(ミリ秒単位)。

- フェイルセーフしきい値に達した場合に、アクションの方針の決定するために起動できるオプションのJavaScript関数名。

詳細は、adf.mf.api.amx.showLoadingIndicatorを参照してください。

OEPEでは、ロード・インジケータ動作は「パレット」のMAF AMXの下にあります(図12-48を参照)。

図12-48 「パレット」の「ロード・インジケータ動作」

次の例は、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を返します。詳細は、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 Mobile Application Frameworkタグ・リファレンス

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

12.4 ジェスチャーの有効化

次のジェスチャーに反応するために、ボタン、リンク、リスト・アイテムおよび多数のデータ視覚化の各コンポーネントを構成できます。

- 右方向にスワイプ

- 左方向にスワイプ

- 上方向にスワイプ

- 下方向にスワイプ

- タップしたまま押さえる

- 始点方向にスワイプ: このジェスチャーは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、左方向にスワイプします。

- テキスト方向が右から左である場合、右方向にスワイプします。

- 終点方向にスワイプ: このジェスチャーは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、右方向にスワイプします。

- テキスト方向が右から左である場合、左方向にスワイプします。

次の操作のtype属性に対して、swipeRight、swipeLeft、swipeUp、swipeDown、swipeStart、swipeEndおよびtapHold値を定義できます。

- プロパティ・リスナーの設定(第12.3.24項「プロパティ・リスナーの設定の使用方法」を参照)

- アクション・リスナー(第12.3.23項「アクション・リスナーの使用方法」を参照)

- ポップアップ表示動作(第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- ポップアップを閉じる動作(第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

type属性の値は親コンポーネントに基づいて制限されており、リンク(commandLink)およびリスト・アイテム(listItem)のコンポーネントに対してのみサポートされています。

注意:
リンク(実行) (linkGo)コンポーネントに対するジェスチャー・サポートはありません。

始点方向にスワイプと終点方向にスワイプは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点のスワイプ・スタイルを設定することをお薦めします。

次の例は、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 Mobile Application Frameworkタグ・リファレンスを参照してください。

GestureDemoという名前のMAFサンプル・アプリケーションは、様々なMAF AMX UIコンポーネントでのジェスチャーの使用方法を示しています。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあるアプリケーションです。

12.5 データ視覚化の指定

MAFでは、データ視覚化コンポーネントのセットを様々なチャート、ゲージおよびマップの作成に使用して、MAF AMXアプリケーション機能のデータを表すことができます。MAF AMXファイルの<dvtm>ネームスペースの下で次の要素を宣言できます。

- areaChart (第12.5.1項「面グラフの作成方法」を参照)

- barChart (第12.5.2項「棒グラフの作成方法」を参照

- bubbleChart (第12.5.4項「バブル・チャートの作成方法」を参照)

- comboChart (第12.5.5項「コンポ・チャートの作成方法」を参照)

- lineChart (第12.5.6項「線グラフの作成方法」を参照)

- pieChart (第12.5.7項「円グラフの作成方法」を参照)

- scatterChart (第12.5.8項「散布図の作成方法」を参照)

- sparkChart (第12.5.9項「スパーク・チャートの作成方法」を参照)

- funnelChart (第12.5.10項「ファンネル・チャートの作成方法」を参照)

- stockChart (第12.5.11項「株価チャートの作成方法」を参照)

- ledGauge (第12.5.19項「LEDゲージの作成方法」を参照)

- statusMeterGauge (第12.5.20項「ステータス・メーター・ゲージの作成方法」を参照)

- dialGauge (第12.5.21項「ダイアル・ゲージの作成方法」を参照)

- ratingGauge (第12.5.22項「評価ゲージの作成方法」を参照)

- geographicMap (第12.5.24項「地理マップ・コンポーネントの作成方法」を参照)

- thematicMap (第12.5.25項「テーマ・マップ・コンポーネントの作成方法」を参照)

- treemap (第12.5.27項「ツリーマップ・コンポーネントの作成方法」を参照)

- sunburst (第12.5.28項「サンバースト・コンポーネントの作成方法」を参照)

- timeline (第12.5.29項「時系列コンポーネントの作成方法」を参照)

- nBox (第12.5.30項「NBoxコンポーネントの作成方法」を参照)

チャート、ゲージ、マップおよび拡張コンポーネント要素には、すべてまたはほとんどに共通の多数の属性があります。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

OEPEでは、データ視覚化コンポーネントは「パレット」の「MAF AMXデータ視覚化」の下にあります。すべてのデータ視覚化コンポーネントを表示するには、スクロール・バーを使用します。

図12-49 「パレット」のデータ視覚化コンポーネント

データ視覚化コンポーネントをドラッグ・アンド・ドロップすると、ダイアログが開き、作成するコンポーネントのタイプに関連付けられた情報に応じたコンテンツが表示されます。

- モバイル・チャートの作成

- モバイル・ゲージの作成

- 地理マップ

- サンバーストの作成またはツリーマップ

注意:
コンポーネントの作成後、ソース・エディタまたは構造ビューでそのコンポーネントを選択し、「プロパティ」ウィンドウで「コンポーネント定義の編集」をクリックすることによって、作成ダイアログを再起動できます。
「プロパティ」ウィンドウで提供される同一の編集機能を使用すると、いくつかのデータ視覚化コンポーネントの子コンポーネント(データ・ポイント・レイヤーなど)を編集できます。

CompGalleryというMAFサンプル・アプリケーションは、MAF AMXアプリケーション機能での様々なデータ視覚化コンポーネントの使用方法を示しています。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

MAF AMXデータ視覚化コンポーネントの詳細は、次を参照してください:

- イベント・リスナーをデータ視覚化コンポーネントに追加する方法の詳細は、第12.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもMAF AMX実行時の記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

- 「データ・コントロール」ウィンドウから作成されるデータバインドされたデータ視覚化コンポーネントの詳細は、第12.5.32項「データバインドされたデータ視覚化コンポーネントの作成方法」を参照してください。

- チャートやその他のデータ視覚化コンポーネント用の静的データの提供方法の詳細は、第12.5.33項「静的データに基づくデータ視覚化コンポーネントの作成方法」を参照してください。

- チャート・コンポーネントのインタラクティブ性の詳細は、第12.5.34項「チャート・コンポーネントのインタラクティブ性を有効にする方法」を参照してください。

- 極チャートの作成の詳細は、第12.5.35項「極チャートを作成する方法」を参照してください。

- データ視覚化コンポーネントにおけるアクセシビリティのサポートの詳細は、第12.8項「MAFのアクセシビリティのサポートの理解」を参照してください。

12.5.1 面グラフの作成方法

面グラフ(areaChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けれされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、面の色やパターンなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。カスタム系列スタイルの定義の詳細は、第12.5.6項「線グラフの作成方法」を参照してください。

面グラフは、X軸に沿ってズームおよびスクロールできます。これはzoomAndScroll属性を使用して有効化されます。

面グラフの向き(垂直または水平)は、orientation属性と、値verticalおよびhorizontalによって制御されます。

次の例は、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>

図12-50 デザインタイムの面グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: このデータ・アイテムが属する系列の名前。

- group: このデータ・アイテムが属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやshapeなどの他のプロパティも含めることができます。

次の例に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、データ・アイテムのcolorおよびshape属性が、追加のグループ化式に基づいて設定されます。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>

注意:
この項の最初の方にある例と図12-48では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

このコンポーネントに対して定義できるareaChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第12.5.23.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、面グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-areaChart
- supported properties: all

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

12.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>

図12-51 デザインタイムの棒グラフ

棒グラフのデータ・モデルは、個々の棒を記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- series: この棒が属する系列の名前。

- group: この棒が属するグループの名前。

- value: データ・アイテムの値(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

このコンポーネントに対して定義できるbarChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第12.5.23.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、棒グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-barChart
- supported properties: all

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

12.5.3 レンジ・チャートの作成方法

レンジ・チャートによって、データ・アイテムの低値および高値をチャートに表示できます。

レンジ・チャートとしてレンダリングするように面グラフまたは棒グラフを構成するには、<dvtm:chartDataItem>子コンポーネントがサポートするlowおよびhigh属性の値を指定します。次の例は、レンジ・チャートをレンダリングするように面グラフを構成する方法を示しています。図12-52は、棒グラフ・コンポーネントによってレンダリングされたレンジ・チャートの例を示しています。

図12-52 棒グラフでレンダリングされたレンジ・チャート

1つの範囲属性の値(lowまたはhigh)のみを指定している場合、MAFはデータ・アイテムをnullとして処理し、チャート上でそのアイテムをレンダリングしません。レンジ・チャートをレンダリングするには、lowとhighの両方の属性の値を指定する必要があります。ツールチップおよびデータ・カーソルは、データの高値および低値を表示します。

チャートのスタイル設定の詳細は、次の項目を参照してください。

- 第12.5.2項「棒グラフの作成方法」

- 第12.5.1項「面グラフの作成方法」

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

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

バブル・チャート(bubbleChart)は、各データ・アイテムがx座標、y座標およびサイズ(バブル)を持つ一連のデータ・アイテムを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(第12.5.6項「線グラフの作成方法」を参照)や面グラフ(第12.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>

図12-53 デザインタイムのバブル・チャート

次の例では、データ・アイテムからなる関連する1つのグループに対して一般的なスタイル属性を設定するために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 Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第12.5.23.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、バブル・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-bubbleChart
- supported properties: all

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

12.5.5 コンポ・チャートの作成方法

コンボ・チャート(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>

図12-54 デザインタイムのコンポ・チャート

このコンポーネントに対して定義できるcomboChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

コンボ・チャートの向き(垂直または水平)は、orientation属性と、値verticalおよびhorizontalによって制御できます。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第12.5.23.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、コンボ・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-comboChart
- supported properties: all

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

12.5.6 線グラフの作成方法

線グラフ(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>

図12-55 デザインタイムの線グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: この線が属する系列の名前。

- group: この線が属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやshapeなどの他のプロパティも含めることができます。

次の例に示すように、属性グループ(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ファセットを定義し、seriesStyle要素を使用してカスタム系列スタイルを設定します。

<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 Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第12.5.23.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、線グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-lineChart
- supported properties: all

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

12.5.7 円グラフの作成方法

円グラフ(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>

図12-56 デザインタイムの円グラフ

円グラフの区分ラベルの位置を構成するには、sliceLabelPosition属性を使用します。デフォルト(auto)で、区分内にラベルが収まる場合、ラベルは区分の内側に配置されます。それ以外は、区分の外側に配置されます。

selectionEffect属性を設定することにより、円グラフ・コンポーネントの展開(区分の間隔)効果を定義することもできます。

sliceGaps属性を使用すると、次の図に示すような、隣接する区分の間にギャップのある円グラフ・コンポーネントを作成できます。sliceGapsの値は、チャートにギャップのない0(デフォルト)から、最大のギャップを可能にする1の範囲です。

円グラフのデータ・モデルは、個々の円データ・アイテムを定義するアイテムのコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- label: 区分ラベル。

- value: 区分の値。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: 区分の境界線の色。

- color: 区分の色。

- explode: 区分を開くときのオフセット。

このコンポーネントに対して定義できるpieChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、pieDataItemを子として含めることができます(第12.5.23.4項「円グラフのデータ・アイテムの定義」を参照)。

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

中心が空洞のドーナツのような円グラフ・コンポーネントを作成できます。

空いている領域(と、結果的にはドーナツの幅)のサイズを構成するには、pieChartのinnerRadius属性を使用します。また、ドーナツの中心部のテキストを指定するには、centerLabel属性を設定します。

図12-57 デザインタイムのドーナツ・グラフ

12.5.7.2 円グラフのスタイル設定

クラスdvtm-pieChart、dvtm-chartPieLabelおよび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

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

12.5.8 散布図の作成方法

散布図(scatterChart)は、各アイテムがx座標、y座標およびサイズを持つデータ・アイテムを表す連続しないドットでデータを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(第12.5.6項「線グラフの作成方法」を参照)や面グラフ(第12.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>

図12-58 デザインタイムの散布図

散布図のデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。各データ・アイテムの属性は、スタンプ(dataStamp)によって定義され、通常、次のものがあります。

- x、y: 値の座標(必須)。

- markerSize: マーカーのサイズ(オプション)。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: データ・アイテムの境界線の色。

- color: データ・アイテムの色。

- tooltip: カスタム・ツールチップ。

このコンポーネントに対して定義できるscatterChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第12.5.23.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、散布図コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-scatterChart
- supported properties: all

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

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

スパークチャート(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>

図12-59 デザインタイムのスパーク・チャート

スパーク・チャートのデータ・モデルは、個々のスパーク・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: スパーク値。

sparkChartの属性およびdvtm子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、sparkDataItemを子として含めることができます(第12.5.23.5項「スパーク・チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、スパーク・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-sparkChart
- supported properties: all

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

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

ファンネル・チャート(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>

図12-60 デザインタイムのファンネル・チャート

ファンネル・チャートのデータ・モデルは、個々のファンネル・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: ファンネル値

- label: ファンネル区分ラベル

funnelChartの属性およびdvtm子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、funnelDataItemを子として含めることができます(第12.5.23.6項「ファンネル・データ・アイテムの定義」を参照)。

クラスdvtm-funnelChartおよびdvtm-funnelDataItemで定義されているデフォルトCSS設定を上書きすることで、ファンネル・チャート・コンポーネントをスタイル設定できます。

- トップレベル要素は次を使用してスタイル設定できます。

.dvtm-funnelChart
- supported properties: all

- ファンネル・チャートのデータ・アイテムは次を使用してスタイル設定できます。

.dvtm-funnelDataItem
- supported properties: border-color, background-color

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

12.5.11 株価チャートの作成方法

株価チャート(stockChart)コンポーネントは、特定の日の様々な時点での株価の始値、終値、安値および高値を表示します。始値および終値を表示するローソク・バーは、通常、その日に株価が上昇したときに緑色で、終値が始値より低い場合に赤色で表示されます。

次の例は、MAF AMXファイルで定義されたstockChart要素を示しています。dataStampファセットにはstockDataItem要素が含まれています。

<dvtm:stockChart id="stockChart1"
dataCursor="#{pageFlowScope.dataCursor}"
dataCursorBehavior="#{pageFlowScope.dataCursorBehavior}"
dataSelection="#{pageFlowScope.dataSelection}"
emptyText="No data found"
footnote=""
footnoteHalign="#{pageFlowScope.footnoteHalign}"
inlineStyle="width: 100%; height:#{DvtProperties.hostedMode ?
'400px' : deviceScope.hardware.screen.availableHeight-200}px"
shortDesc="Stock Chart"
styleClass="dvtm-gallery-component"
subtitle="#{pageFlowScope.subtitle}"
title="#{pageFlowScope.title}"
titleHalign="#{pageFlowScope.titleHalign}"
value="#{bindings.stockChartData.collectionModel}"
var="row"
volumeColor="#{pageFlowScope.volumeColor}"
zoomAndScroll="#{pageFlowScope.zoomAndScroll}"
timeAxisType="mixedFrequency"
animationOnDataChange="auto"
animationOnDisplay="auto"
viewportChangeListener="#{StockChartDataList.ViewportListener}">
<amx:facet name="dataStamp">
<dvtm:stockDataItem id="cdi1
close="#{row.close}"
high="#{row.high}"
low="#{row.low}"
open="#{row.open}"
volume="#{row.volume}"
x="#{row.x}"
series="BTC"
shortDesc="Stock Data Item">
</dvtm:stockDataItem>
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="BTC"
type="#{pageFlowScope.seriesType}"
id="ss1">
</dvtm:seriesStyle>
</amx:facet>
<amx:facet name="overview">
<dvtm:overview id="ovw" rendered="#{pageFlowScope.overview}">
</dvtm:overview>
</amx:facet>
<dvtm:xAxis id="xAxis"
viewportMinValue="#{pageFlowScope.viewportMinValue}"
viewportMaxValue="#{pageFlowScope.viewportMaxValue}">
</dvtm:xAxis>
<dvtm:y2Axis id="y2Axis">
<dvtm:tickLabel id="y2TickLabel"
rendered="#{pageFlowScope.showY2}"
scaling="none">
<amx:convertNumber id="cn5"
type="number"
minFractionDigits="1"
maxFractionDigits="1"/>
</dvtm:tickLabel>
</dvtm:y2Axis>
<dvtm:chartValueFormat id="cvf2label"
type="close">
<amx:convertNumber id="closeConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2label1"
type="high"
scaling="none">
<amx:convertNumber id="highConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2label2"
type="low"
scaling="none">
<amx:convertNumber id="lowConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2label3"
type="open"
scaling="none">
<amx:convertNumber id="openConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2label4"
type="volume"
scaling="none">
<amx:convertNumber id="cn6"
type="number"
minFractionDigits="1"
maxFractionDigits="1"/>
</dvtm:chartValueFormat>
<dvtm:yAxis id="yAxis">
<dvtm:tickLabel id="tc1" scaling="none">
<amx:convertNumber id="yAxisConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:tickLabel>
<dvtm:referenceLine id="rl2"
color="rgb(255,128,0)"
lineWidth="1"
lineStyle="solid"
location="front"
lineType="straight"
text="Technical analysis"
shortDesc="Technical Analysis"
displayInLegend="off"
rendered="#{pageFlowScope.technicalAnalysis}">
<amx:iterator var="ref"
value="#{bindings.stockReferenceData2.collectionModel}"
id="i2">
<dvtm:referenceLineItem value="#{ref.value}" x="#{ref.x}" id="rli2"/>
</amx:iterator>
</dvtm:referenceLine>
<dvtm:referenceLine id="rl1"
color="#008000"
lineWidth="1"
lineStyle="solid"
location="front"
lineType="straight"
text=""
shortDesc="Total Transaction Fees"
displayInLegend="off"
rendered="#{pageFlowScope.transactionFees}">
<amx:iterator var="ref"
value="#{bindings.stockReferenceData.collectionModel}"
id="i1">
<dvtm:referenceLineItem value="#{ref.value}" x="#{ref.x}" id="rli1"/>
</amx:iterator>
</dvtm:referenceLine>
</dvtm:yAxis>
<dvtm:chartValueFormat id="cvf1"
type="y"
scaling="none"/>
</dvtm:stockChart>

図12-61 設計時の株価チャート

株価チャートのデータ・モデルは、個々の株価データ・アイテムを記述するアイテム(行)のコレクションによって表されます。

stockChartの属性およびdvtm子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、stockDataItemを子として含めることができます(第12.5.23.7項「株価のデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、株価コンポーネントのスタイルを設定できます。

- dvtm-stockChart-rising

- dvtm-stockChart-falling

- dvtm-stockChart-range

グラフのスタイル設定の詳細は、第12.5.12項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

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

スパーク・チャートを除き、次のクラスで定義されているデフォルト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

チャート・コンポーネントのトップレベル要素のスタイル設定に加え、一部のチャートの特定の子要素をスタイル設定できます。

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

ViewportChangeEventを使用して、チャート・コンポーネントのズームおよびスクロールを処理できます。ズームまたはスクロールのいずれかが発生すると、コンポーネントは、新しいビューポートを定義する情報でロードされるイベントを起動します。

面グラフ、棒グラフ、横棒グラフ、コンボ・チャートおよび線グラフのコンポーネントの属性としてviewportChangeListenerを指定できます。

DrillEventを使用して、グラフ・コンポーネントのドリルを処理できます。ドリルが発生すると、コンポーネントはこのイベントを起動します。

drillListenerは、任意のチャート・コンポーネントの属性として指定できます。さらに、詳細なドリル制御を指定するため、chartDataItem、funnelDataItem、pieDataItemおよびseriesStyleのdrilling属性を使用できます。

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

- 第12.10項「イベント・リスナーの使用方法」

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

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

12.5.14 チャート・ツールチップのカスタマイズに関する必知事項

MAF AMXのチャート値フォーマット(chartValueFormat)子コンポーネントでは、次の例に示すように、ラベルを指定してツールチップ内の値の表示を無効にすることによって、チャート・コンポーネントのツールチップをカスタマイズできます。

<dvtm:barChart id="bc1" var="row" value="bindings.Data.collectionModel">
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="cdi1"
series="row.series"
group="row.group"
value="row.value"/>
</amx:facet>
<dvtm:chartValueFormat id="cvf1" type="value" tooltipLabel="Revenue">
<amx:convertNumber ... />
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2" type="series" tooltipLabel="Region"/>
<dvtm:chartValueFormat id="cvf3" type="groups" tooltipLabel="Product Type"/>
</dvtm:barChart>

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

12.5.15 カテゴリ軸でのチャートのソートを有効にする方法

棒グラフ、線グラフ、面グラフおよびコンボ・チャート・コンポーネントのsorting属性を使用すると、その値によるチャート・カテゴリのソートを有効にできます。たとえば、棒グラフのバーで表される国々をそのGDPの昇順または降順で表示できます。デフォルトでは、ソートは無効になっています。

12.5.16 チャートの初期ズームを定義する方法

棒グラフ、線グラフ、面グラフおよびコンボ・チャート・コンポーネントのinitialZooming属性を使用すると、現在のチャートのサイズで使用可能なチャートのズーム・レベルを自動的に設定しながら、グラフの初期状態で最初または最後のいずれのデータ・ポイントを表示するかを指定できます。デフォルトでは、初期ズームは無効になっています。

12.5.17 特定のチャート系列のスタックを定義する方法

棒グラフ、横棒グラフ、線グラフ、面グラフおよびコンボ・チャート・コンポーネントでは、stack属性がサポートされており、データ系列を積み重ねて表示できます。この属性を単独で使用する場合は、チャート内のデータ系列のすべてにスタックを適用するか、またはすべてに適用しないかのいずれかです。チャート内のいくつかの系列のスタックを有効にして、その他を無効にするには、子コンポーネントである系列スタイル(seriesStyle)のstackCategory属性と、親チャートのstack属性を同時に使用します。チャートのstack属性をonに設定し、系列スタイルのstackCategory属性を指定して、チャート内の特定の系列をどのようにスタックするかを定義します。

12.5.18 チャートの二重-Y軸分割を有効にする方法

棒グラフ、線グラフ、面グラフおよびコンボ・チャート・コンポーネントのsplitDualY属性を使用すると、Y2軸を使用するチャートで、同じX軸を共有するスタックされたプロット領域に2つのデータ・セットを別々に表示できます。デフォルトでは、この機能は無効になっています。

12.5.19 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>

図12-62 デザインタイムのLEDゲージ

LEDゲージのデータ・モデルは、value属性で指定される単一のメトリック値で表されます。

このコンポーネントに対して定義できるledGauge子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次のamx子要素を定義できます。

- showPopupBehavior (第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第12.9項「入力の検証」を参照)

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

ステータス・メーター・ゲージ(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>

図12-63 デザインタイムの長方形のステータス・メーター・ゲージ

円形で表される(図12-64を参照)ステータス・メーター・ゲージを作成するには、orientation属性をcircularに設定します。デフォルトでは、この属性はhorizontalに設定されいるため、横向きの長方形になります。

円形で表される(図12-64を参照)ステータス・メーター・ゲージを作成するには、orientation属性をcircularに設定します。

図12-64 デザインタイムの円形のステータス・メーター・ゲージ

ステータス・メーター・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに対して定義できるstatusMeterGauge子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次のamx子要素を定義できます。

- showPopupBehavior (第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第12.9項「入力の検証」を参照)

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

ダイヤル・ゲージ(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>

図12-65 デザインタイムのダイヤル・ゲージ

ダイヤル・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに対して定義できるdialGauge子要素およびdvtm子要素の属性の詳細は、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>

図12-66 メトリック・ラベルおよびティック・ラベルの付いたデザインタイムのダイアル・ゲージ

dialGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第12.9項「入力の検証」を参照)

12.5.22 評価ゲージの作成方法

評価ゲージ(ratingGauge)を使用すると、事前定義された視覚スケールに評価を表示したり、その評価を変更できます。デフォルトの評価単位は、星で表されます。ratingGaugeのshape属性を設定することによって、これを円、人間、矩形、星形、三角形またはひし形として構成できます。そのorientationプロパティの値を設定することで、垂直または水平にレンダリングすることもできます。デフォルトでは、水平にレンダリングされます。

次の例は、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>

図12-67 デザインタイムの評価ゲージ

評価ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに対して定義できるratingGauge子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

ratingGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第12.9項「入力の検証」を参照)

12.5.22.1 shortDesc属性の上書き

ratingGaugeのshortDesc属性の値は、threshold子要素のshortDesc属性を設定することによって上書きできます。指定されると、ratingGaugeのvalue属性が指定されたしきい値に到達するたびに、thresholdのshortDescによって親のshortDescが置き換えられます。

次の例は、評価ゲージ・コンポーネントのshortDesc属性を上書きする方法を示しています。

<dvtm:ratingGauge id="ratingGauge1"
value="#{pageFlowScope.value}"
minValue="#{pageFlowScope.minValue}"
maxValue="#{pageFlowScope.maxValue}"
shortDesc="#{pageFlowScope.shortDesc}"
inputIncrement="#{pageFlowScope.inputIncrement}"
inlineStyle="#{pageFlowScope.inlineStyle}"
<dvtm:threshold id="tr1" maxValue="2" shortDesc="Performance: Poor"/>
<dvtm:threshold id="tr2" maxValue="3" shortDesc="Performance: Average"/>
<dvtm:threshold id="tr3" maxValue="4" shortDesc="Performance: Good"/>
<dvtm:threshold id="tr4" maxValue="5" shortDesc="Performance: Excellent"/>
</dvtm:ratingGauge>

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

ユーザーが評価ゲージ・コンポーネントに対して実行したアクションに応じて、評価単位(イメージ)は次のいずれかの状態を取得できます。

- selected: 単位を選択した場合。

- unselected: 単位を選択しなかった場合。

- changed: 単位を変更した場合。

- hover: 単位にマウスを置いた場合。

注意:
タッチ・インタフェースを使用するモバイル・デバイスでは、hover状態はタップしたまま押さえるジェスチャーを通じて呼び出されます。

各状態は、独自のイメージの配列と、色および枠線の色を定義するプロパティで表現できます。

デフォルトでは、ratingGaugeのshape属性によって、hoverおよびchanged状態の選択内容が決まります。unselected状態は、ratingGaugeのunselectedShape属性を使用して個別に設定できます。

デフォルトCSS設定を上書きすることで、評価ゲージ・コンポーネントをスタイル設定できます。CSSファイルの拡張方法の詳細は、第12.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;
}

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

チャートおよびゲージには様々な子要素を定義できます。それらの子要素のいくつかを次に示します。

- chartDataItem (第12.5.23.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第12.5.23.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第12.5.23.2項「凡例の定義および構成」を参照)

- pieDataItem (第12.5.23.4項「円グラフのデータ・アイテムの定義」を参照)

- sparkDataItem (第12.5.23.5項「スパーク・チャートのデータ・アイテムの定義」を参照)

- threshold (第12.5.23.8項「しきい値の定義」を参照)

- funnelDataItem (第12.5.23.6項「ファンネルのデータ・アイテムの定義」を参照)

- stockDataItem (第12.5.23.7項「株価のデータ・アイテムの定義」を参照)

これらのおよびその他の子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

OEPEでは、データ視覚化コンポーネントの子コンポーネントは、それぞれの視覚化タイプの下にあります(図12-68を参照)。

図12-68 チャートおよびゲージの子コンポーネントの作成

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

チャート・データ・アイテム(chartDataItem)要素は、円グラフを除くすべてのサポートされているチャートでチャート・データ・アイテムが使用するパラメータを指定します。

チャート・データ・アイテムでのテキスト表示を有効化でき、chartDataItem要素の関連する属性を設定することで、そのラベル、ラベル位置およびラベル・スタイルを制御でき、さらに、チャート自体のdataLabelPosition属性を設定することで指定されたチャートのすべてのデータ・ラベルの位置を指定できます。

注意:
散布図、円グラフおよびファンネル・チャートのコンポーネントでは、dataLabelPosition属性はサポートされていません。

chartDataItem要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

12.5.23.2 凡例の定義および構成

凡例(legend)要素は、凡例パラメータを指定します。

凡例用のグラフ領域のサイズをカスタマイズするには、凡例コンポーネントのsize属性とmaxSize属性を使用します。

legend要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

12.5.23.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 Mobile Application Frameworkタグ・リファレンスを参照してください。

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

円グラフのデータ・アイテム(pieDataItem)要素は、円グラフの区分のパラメータを指定します(第12.5.7項「円グラフの作成方法」を参照)。

pieDataItem要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

スパーク・チャートのデータ・アイテム(sparkDataItem)要素は、スパーク・チャート・アイテムのパラメータを指定します(第12.5.9項「スパーク・チャートの作成方法」を参照)。

sparkDataItem要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

ファンネルのデータ・アイテム(funnelDataItem)要素は、ファンネル・チャート・アイテムのパラメータを指定します(第12.5.10項「ファンネル・チャートの作成方法」を参照)。

funnelDataItem要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

12.5.23.7 株価のデータ・アイテムの定義

株価データ・アイテム(stockDataItem)要素は、株価チャート・アイテムのパラメータを指定します(第12.5.11項「株価チャートの作成方法」を参照)。

12.5.23.8 しきい値の定義

しきい値(threshold)要素は、ゲージのしきい値範囲を指定します(第12.5.19項「LEDゲージの作成方法」および第12.5.20項「ステータス・メーター・ゲージの作成方法」を参照)。

threshold要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

地理マップ(geographicMap)は、1つのマップに重ね合せた1つ以上のインタラクティブな情報レイヤーでデータを表します。GoogleマップまたはOracle Maps Cloudサービス(Oracleマップ)のいずれかを基本のマップ・プロバイダとして使用するようにこのコンポーネントを構成します。マップ・プロバイダを指定しない場合、コンポーネントはGoogleマップを使用します。

次の例は、CompGalleryサンプル・アプリケーションでのgeographicMapコンポーネントを示しています。

図12-69 CompGalleryサンプル・アプリケーションでの地理マップ

geographicMapに対してpointDataLayer子要素を定義できます。pointDataLayerによって、マップ上の点と関連付けられたデータを表示できます。pointDataLayerは子要素としてpointLocationを持つことができます。pointLocationは、データ・ポイントの位置を決定するデータ・レイヤーのモデル内の列を指定します。これらの位置は、住所またはX座標とY座標で表すことができます。

pointLocationは、子要素としてmarkerを持つことができます。markerは、マップ上のデータ・ポイントに関連付けられた組込み形状またはカスタム形状をスタンプ・アウトするために使用します。markerでは、マーカーとしてレンダリングされるイメージのURIを指定するための一連のプロパティがサポートされています。マーカーは子要素としてconvertNumberを持つことができます(第12.3.27項「数値の変換方法」を参照)。また、ポップアップ(第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)がgeographicMapのマーカーの上に表示されるようにできます。そのためには、次の例に示すように、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 Mobile Application Frameworkタグ・リファレンスを参照してください。

地理マップ・コンポーネントでは、タッチ・ジェスチャーを使用してピン(マップ上のポイントの作成)を挿入できます。この機能は、mapInputListenerを使用して構成できます。詳細は、第12.5.26項「Mapコンポーネントでのイベントの使用方法」を参照してください。

地理マップ・コンポーネントに関連するタスクの詳細は、次を参照してください。

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

- 第12.5.24.2項「地理マップ・コンポーネントのルート表示」

12.5.24.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>

Googleマップのライセンスがないと、アドレス解決を可能にするジオコーディング・サービスへのアクセスが制限されます。許可されている制限を超過すると、MAFは、ジオコーディング・サービスによって生成されるエラー・メッセージ用のハンドラを提供します。アドレス・ポイントの最大許容数を超過する場合、実行時にこれらのメッセージは表示されます。1秒当たり10リクエストに制限されているリクエストの数、および冗長リクエストの数はジオコーディングAPIに送られません。

次の表に示されたエラー・メッセージをモニターします。

表12-10 エラー・メッセージ

エラーID

メッセージ

説明

OVER_QUERY_LIMIT

GeoCoder割当て制限を超過しました。

割当て制限を超過していることを示しています。

REQUEST_DENIED

リクエストが拒否されました。APIキーおよびクライアントIDを確認します。

リクエストに、result_typeまたはlocation_typeパラメータは入っていても、APIキーもクライアントIDも入っていないため、リクエストが拒否されたことを示しています。

注意:
Oracleマップを使用するには、「使用条件」および「業者向け通知」を順守する必要があります。Oracleマップを使用して開発されたアプリケーションは、「使用条件」および「業者向け通知」をドキュメント形式またはアプリケーションからアクセス可能なリンクとしてエンド・ユーザーに提示する必要があります。

次の例は、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>

iOS 9以降を使用するデバイス上で実行されるMAFアプリケーションでは、Apple iOSのアプリケーション・トランスポート・セキュリティ(ATS)・ポリシーの要件を満たすために、アプリケーションからサービスへのすべての接続に関してHTTPSを使用する必要があります。MAFアプリケーションをiOS 9以降にデプロイしている場合は、次のいずれかのオプションを使用してアプリケーションを構成し、geographicMapコンポーネントがOracleマップをiOS 9デバイスでレンダリングできるようにします。

1. MAFアプリケーションをデプロイする場合はATSを無効にします。詳細は、第27.4.1項「iOSデプロイメント構成の作成方法」を参照してください。このオプションはお薦めできません。

2. HTTPSリクエストを受け入れるようにOracleマップ・サービスを構成し、geographicMapコンポーネントがHTTPSを使用するようにMAFアプリケーションを構成します。後者は、アプリケーションのadf-config.xmlファイルで構成します。次の例は、geographicMapコンポーネントによりiOS 9デバイスでOracleマップをレンダリングできるように、アプリケーションのadf-config.xmlファイルを構成する方法を示しています。

<adf:adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="oracleMaps"/>
<adf-property name="mapViewerUrl" value="https://elocation.myserver.com/mapviewer"/>
<adf-property name="eLocationUrl" value="https://elocation.myserver.com/elocation"/>
</adf:adf-properties-child>
. . .
</adf-config>

adf-config.xmlファイルの詳細は、第C.2項「アセンブリ・レベルのリソースについて」を参照してください。

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

GoogleマップをgeographicMapコンポーネントのプロバイダとして使用する場合、ルート(route)子コンポーネントを追加すると、想定されるウェイポイントを設定して、2点間のルート(経路)を指定できます。

各geographicMapコンポーネントには、ルートの子コンポーネントを複数設定して、それぞれに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子要素で指定されたイベント・リスナーと動作をトリガーする場合にも使用できます。詳細は、第12.10項「イベント・リスナーの使用方法」を参照してください。

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

テーマ・マップ(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>

図12-70 デザインタイムのテーマ・マップ

markerZoomBehavior属性を使用すると、マップがズームされるとテーマ・マップのマーカーのスケール変更が有効化されます。rotation属性を設定することで、マーカーの回転を有効化でき、この属性の値は、イメージの中心に対してマーカーが回転する(時計回りの度数)角度を表します。

MAF AMXテーマ・マップは、次の拡張機能をサポートしています。

- カスタム・マーカー(第12.5.25.1項「カスタム・マーカーの定義」を参照)

- 領域の分離(第12.5.25.3項「分離領域の定義」を参照)

- 初期ズーム(第12.5.25.4項「初期ズームの有効化」を参照)

- カスタム・ベース・マップ(第12.5.25.5項「カスタム・ベース・マップの定義」を参照)

thematicMap要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

12.5.25.1 カスタム・マーカーの定義

MAF AMXテーマ・マップでは、MAF AMXイメージ・コンポーネントはサポートされていません。マップのpointLocation内でイメージを使用するには、pointLocationのmarker子要素で、そのsource属性を使用してイメージを指定します。source属性がマーカーに対して設定されている場合、そのshape属性はMAF AMXで無視されます。

sourceHover、sourceSelectedおよびsourceHoverSelected属性で、ホバーおよび選択効果のイメージを指定できます。これらの1つが指定されていない場合、その特定のマーカー状態に対してはsource属性によって指定されているイメージが使用されます。sourceSelectedが指定されている場合、sourceHoverSelectedが指定されていないときはその値が使用されます。イメージは、PNG、JPG、SVGなどモバイル・デバイスのブラウザでサポートされている任意のフォーマットで構いません。

12.5.25.2 分離領域レイヤーの定義

データの地理的場所の伝達にリージョン・アウトラインが常に必要であるわけではありません。かわりに、テーマ・マップ・コンポーネントには、領域内でイメージやマーカーをセンタリングするためのオプションがあるため、リージョン・アウトラインが描画されない見えない領域レイヤーを定義するオプションがあります。

見えない領域レイヤーを定義するには、CSS値のbackground-colorおよびborder-colorを受け入れるareaLayerのareaStyle属性を使用します。

<dvtm:areaLayer id="areaLayer1"
...
areaStyle="background-color:transparent;border-color:transparent">

この属性によって、dvtm-areaスキニング・キーを使用することなく、デフォルトの領域レイヤーの色および枠線の形状をオーバーライドできます。

12.5.25.3 分離領域の定義

MAF AMXテーマ・マップ・コンポーネントを構成し、areaDataLayerのisolatedRowKey属性を使用してマップの単一の分離領域に収まるようにレンダリングおよびズームできますが、この場合、その領域または領域データ・レイヤーの残りの領域はレンダリングされません。

注意:
分離できるのは、1つのマップで1つの領域のみです。

12.5.25.4 初期ズームの有効化

初期ズームでは、マップ・コンポーネントを通常どおりレンダリングし、その後、マーカーと領域の両方を含むデータ・オブジェクトにズームして合せることができます。この機能を有効にするには、テーマ・マップのinitialZooming属性を使用します。

12.5.25.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>

静的な点を含むカスタム・ベース・マップを作成するには、次の例に示すメタデータ・ファイルで点を名前で指定します。このプロセスは、事前定義済ベース・マップに市区町村のマーカーを追加する場合に類似しています。

<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>

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

MAF AMXデータ視覚化では、markerのactionListener属性はサポートされていません。かわりに、action属性を使用することで、同じ機能を実現できます。

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

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、テーマ・マップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第12.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オブジェクトの名前およびプロパティ名は変更できません。かわりに、特定のプロパティ値を、アプリケーションのニーズに合わせて変更できます。

attributeGroups属性がテーマ・マップ・コンポーネント用に定義されている場合、CustomThematicMapStyleを使用して、そのコンポーネントの図形と色のデフォルト・セットを定義できます。この場合、CustomThematicMapStyleオブジェクトの構造は、次の例のようになっている必要があります。styleDefaultsは、次のフィールドを含むネストされたオブジェクトです。

- colors: 領域とマーカーに使用される色のセットを表します。

- shapes: マーカーに使用される図形のセットを表します。

window['CustomThematicMapStyle'] =
{
// custom style values
'styleDefaults': {
// custom color palette
'colors': ["#000000", "#ffffff"],
// custom marker shapes
'shapes' : ['circle', 'square']
}
};

12.5.26 Mapコンポーネントでのイベントの使用方法

MapBoundsChangeEventを使用して、地図マップ・コンポーネントでの次のマップ・ビューのプロパティ変更を処理できます。

- ズーム・レベルに対する変更。

- マップ境界に対する変更。

- マップの中心に対する変更。

これらの変更が発生すると、コンポーネントは、新しいマップ・ビューのプロパティ値でロードされるイベントを起動します。

mapBoundsChangeListenerを地理マップの属性として定義できます。

MapInputEventを使用して、地理マップ・コンポーネントおよびテーマ・マップ・コンポーネントで、タップやマウス・クリックなどのエンド・ユーザー・アクションを処理できます。これらのアクションが発生すると、コンポーネントは、マップの緯度および経度、およびアクションのタイプ(マウス・ダウン、マウス・アップ、クリックなど)に関する情報でロードされるイベントを起動します。

mapInputListenerを地理マップ・コンポーネントの属性として定義できます。

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

- 第12.10項「イベント・リスナーの使用方法」

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

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

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

ツリーマップ(treemap)は、2つのディメンションに渡って(そのノードのサイズおよび色で)階層データを表示します(treemapNode)。

「パレット」では、「MAF AMXデータ視覚化」→「ツリーマップ」にツリーマップはあります(図12-71を参照)。

図12-71 「パレット」でのツリーマップの場所

次の例は、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>

図12-72 デザインタイムのツリーマップ

attributeGroups要素のattributeType属性をcontinuousに設定することで、グラデーション色を使用してツリーマップ・アイテムに関連付けられている値の視覚化を有効にでき、この色の強度は指定された範囲内の相対値を表します。

treemap要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、ツリーマップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第12.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"
},
}

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

サンバースト(sunburst)は、2つのディメンションに渡って(そのノードのサイズおよび色で)階層データを表示します(sunburstNode)。

「パレット」で、「サンバースト」は「MAF AMXデータ視覚化」の下にあります(子ノードもあります)。

次の例は、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>

図12-73 デザインタイムのサンバースト

attributeGroups要素のattributeType属性をcontinuousに設定することで、グラデーション色を使用してサンバースト・アイテムに関連付けられている値の視覚化を有効にでき、この色の強度は指定された範囲内の相対値を表します。

sunburst要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、サンバースト・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第12.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"
}
}

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

時系列(timeline)は、イベントを時系列で表示できるインタラクティブ・コンポーネントであり、定義されていてまだ調整可能な時間範囲(ズームに使用可能)内を前後に移動できます。

イベントは、時系列アイテム・コンポーネント(timelineItem)によって表され、これにはタイトル、説明および継続時間の塗りつぶし色が含まれます。時系列コンポーネントを構成して、すべての使用可能なイベントを表示するサマリー・ウィンドウ(overviewの子要素)を表示できます。エンド・ユーザーは、モバイル・デバイス上のピンチおよびスプレッドのジェスチャーを使用して、イベントをズーム・インおよびズーム・アウトできます。さらに、2つの時系列を構成して2系列のイベントを表示し、関連する情報を並べて比較できます。

orientation属性を使用して、時系列コンポーネントを水平または垂直のいずれかで定義できます。

注意:
MAF AMXでは、時系列と同様のコンポーネントで使用できることが多い次の機能、子要素およびプロパティはサポートしていません。

- ネストしたUIコンポーネント

- アニメーション

- 属性および時間範囲の変更検出

- フェッチ時間

- カスタム・タイム・スケール

- 時間の現行性

- 部分トリガー

- データのソート

- 書式設定された時間範囲

- タイムゾーン

- 可視性

「パレット」で、「時系列」は「MAF AMXデータ視覚化」の下にあり、その子コンポーネントである「時系列アイテム」および「時系列の系列」もここにあります。

次の例は、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>

図12-74 デザインタイムの時系列

時系列アイテムのdurationFillColor属性を使用して、継続時間バーの塗りつぶし色を制御できます。

時系列で2つの時間スケールを同時に表示するには、2番目の軸のスケールを決定する時間軸のscale属性を使用します。

時系列は水平および垂直にスクロールできます。コンポーネントがスクロール可能な(表示可能な表示領域の外側にデータが含まれている)場合、スクロールの方向を指す矢印によって示されます。

ヒント:
時系列開始時間は、最初の時系列アイテムの開始時間と同じ値に設定されている場合、対応する時系列アイテム・コンポーネントのバブルは切り捨てられて表示されることがあります。また、時系列終了時間が最後の時系列アイテムの終了時間と同じ値に設定されている場合、対応する時系列アイテム・コンポーネントのバブルは切り捨てられて表示されることがあります。時系列アイテムのバブルが完全に見られるように、時系列コンポーネントの開始時間と終了時間を設定する必要があります。

timeline要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、時系列コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第12.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

オーバーライド可能な次のCSSスタイル・クラスは、時系列およびその子コンポーネント用に定義されます。

- .dvtm-timeline
サポートされているプロパティ: all

- .timelineSeries-backgroundColor
サポートされているプロパティ: color

.timelineSeries-labelStyle

サポートされているプロパティ: 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]
}
}

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

NBox (nBox)コンポーネントは、2つのディメンションに渡ってデータを表し、各ディメンションは多数の範囲に分かれ、その交点は各データが配置される個別のセルを形成します。

「パレット」で、「NBox」は「MAF AMXデータ視覚化」の下にあります。

次の例は、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>

図12-75 デザインタイムのNBox

nBox要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

マップ・コンポーネント、サンバースト、ツリーマップ、時系列およびNBoxの様々な子要素を定義できます。使用可能な子要素およびその属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

OEPEでは、マップ、サンバースト、ツリーマップ、時系列およびNBoxの子コンポーネントは「パレット」の「MAF AMXデータ視覚化」の下にあります(図12-76を参照)。この図では、「パレット」→「レイアウト」から「詳細」オプションが選択されています。ここでは、「MAF AMXデータ視覚化」リストの各アイコンの隣にツールチップ・コンテンツが表示されています。

図12-76 マップ、サンバースト、ツリーマップ、時系列およびNBoxの子コンポーネントの作成

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

「データ・コントロール」ウィンドウ(第11.3.2.3項「データ・コントロールのビューへの追加」を参照)から挿入されるデータ・コレクションを使用して、データバインドされたデータ視覚化コンポーネントを宣言的に作成できます。パレット選択(図12-87を参照)では、見出し「MAF AMXデータ視覚化」の下にある数多くのデータ視覚化コンポーネント・カテゴリ、タイプおよびレイアウト・オプションから選択できます。

図12-77 チャート・コンポーネントを作成するためのパレット選択

注意:
いくつかのデータ視覚化コンポーネント・タイプには、特別な種類のデータが必要です。選択したコンポーネントのタイプの表示に十分なデータが含まれていないデータ・コレクションにコンポーネントをバインドすると、コンポーネントは表示されず、データが不十分であることを示すメッセージが表示されます。

「コンポーネント・ギャラリ」の表示をトリガーするには、「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグ・アンド・ドロップし、表示されるコンテキスト・メニューから「MAFチャート」、「MAFゲージ」または「MAFテーマ・マップ」のいずれかを選択します。(図12-78を参照)。

図12-78 データバインドされたデータ視覚化コンポーネントの作成

データバインドされている新しいコンポーネント用にカテゴリ、タイプおよびレイアウトをコンポーネント・ギャラリから選択し、「OK」をクリックすると、データ視覚化コンポーネントのデータ収集属性の設定値を起動できます。ギャラリ、ダイアログおよび入力フィールドのラベルの名前は、選択したデータ視覚化コンポーネントのカテゴリおよびタイプに応じて異なります。たとえば、タイプchartDataのデータ・コントロールをアプリケーションにドラッグし、タイプとして「チャート」→「横棒」を選択すると、表示されるダイアログの名前は「横棒グラフのバインド」になり、バインドされたデータ要素(age、totalContribution、totalSavingsおよびshortDesc)を選択できるようになり、棒またはY軸に適用できます(図12-79を参照)。

図12-79 データバインドされたチャートのデータ値の指定

データ・コレクション内の属性には、データ値またはデータ値のカテゴリを指定できます。データ値は、棒の高さなどのマーカーまたは散布図のポイントで示される数字です。データ値のカテゴリは、軸ラベルとして表されるメンバーです。バインディング内で属性が担うロール(データ値またはID)は、データ型(グラフには数値データ値が必要)およびマップされる場所(棒やX軸など)の両方によって決まります。

コンポーネント・ギャラリを使用してデータバインドされているテーマ・マップ・コンポーネントを作成する場合、表示されるダイアログの名前は「'thematicMap'のバインド」になり、コンポーネント・ギャラリでは、エリア・レイヤーとして詳細な選択項目を持ったベース・マップを選択できます。たとえば、ベース・マップとして「すべてのユーザー」を選択し、エリア・レイヤーとして「世界(大陸)」を選択すると、ダイアログ(図12-80を参照)が開きます。

図12-80 「'thematicMap'のバインド」ダイアログ

1つ以上のデータ・バインディング・ダイアログの完了後に、「プロパティ」ウィンドウを使用して、コンポーネントの属性の設定を指定できます。コンポーネントと関連付けられた子要素を使用して、さらにカスタマイズすることもできます(第12.5.23項「チャートおよびゲージ・コンポーネントの子要素の定義方法」を参照)。

MAF AMXページにコレクションをドロップする際にコンテキスト・メニューから「MAF地理マップ」、「MAFサンバースト」、「MAF NBox」、「MAFタイムライン」または「MAFツリーマップ」を選択すると、次のいずれかのダイアログが表示されます。

図12-81 地理マップの作成

図12-82 サンバーストの作成

図12-83 データバインドされた時系列の作成

図12-84 データバインドされたツリーマップの作成

図12-85 データバインドされたNBoxの作成

「NBoxの作成」ダイアログへの入力は、行および列の数を定義することから始めます。その後、ボックス上のセルを選択して、ダイアログの下部で行または列全体の値を指定できます(図12-86を参照)。

図12-86 データバインドされたNBoxの行および列の値の設定

NBoxコンポーネントは、「次へ」をクリックして一連のダイアログのすべてのページを入力すると作成されます。

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

「データ・コントロール」ウィンドウからデータバインドされたチャート・コンポーネントを作成する場合、seriesStyle要素を追加することでチャートの一連のデータに対するスタイル設定情報を宣言的に指定した後に、「プロパティ」ウィンドウを使用してseriesStyle要素のseries属性用のエディタを開くことができます。また、seriesStyle要素のactionプロパティを使用すると、チャート・コンポーネントをクリック可能にできます。このエディタには、dataStampファセット内のchartDataItem要素の値に基づいたseries属性の値がすでに移入されています。

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

チャート、ツリーマップ、サンバーストおよび時系列の場合、その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"/>

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

チャートの次の子コンポーネント用イベントドリブン・トリガーを定義すると、いくつかのチャート・コンポーネントのタップを介してエンド・ユーザーによるインタラクティブ性を有効にできます。

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

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

- 系列スタイル

プロパティ設定リスナーやポップアップ表示動作(詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照)など、サポートされている操作を使用する以外に、起動されるアクションのタイプを定義するように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 Mobile Application Frameworkタグ・リファレンスを参照してください。

12.5.35 極チャートを作成する方法

次のチャート・コンポーネントについて、そのcoordinateSystem属性をpolarに設定すると、極ビューを有効にできます。

- 面グラフ

- 棒グラフ

- バブル・チャート

- コンボ・チャート

- 線グラフ

- 散布図

極設定が前述のいずれのチャート・タイプにも適用される場合(棒を除き)、polarGridShape属性を使用して極グリッドを循環またはポリゴンとして定義できます。

極チャートの放射軸は、そのY軸子コンポーネントを使用してカスタマイズできます。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

MAFでは、UIコンポーネントにスタイルを適用するためにCSSを使用できます。

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

次の属性を設定することで、UIコンポーネントをスタイル設定できます。

- styleClass属性は、レイアウト・コンポーネントに対して使用するCSSスタイル・クラスを定義します。

<amx:panelPage styleClass="#{pageFlowScope.pStyleClass}">

MAF AMXページまたはスキニングCSSファイルでレイアウト、コマンドおよび入力の各コンポーネントのスタイル・クラスを定義できますが、その場合、特定のスタイルがMAF AMXアプリケーション機能内のすべてのコンポーネントに適用されます(第12.6.2項「スキニングに関する必知事項」を参照)。かわりに、MAFによって提供されるパブリック・スタイル・クラスを使用できます。

注意:
OEPEからCSSファイルにはアクセスできません。かわりに、MAFによって、ビルドまたはデプロイ時にこのファイルがパッケージに注入され、ViewContentルート・ディレクトリの下のcssディレクトリにCSSファイルが表示されます。

- inlineStyle属性は、任意のUIコンポーネントに使用するCSSスタイルを定義し、コンポーネントのルートDOM要素に適用される一連のCSSスタイルを表します。

<amx:outputText inlineStyle="color:red;">

この属性は、基本スタイルの変更が必要な場合に使用してください。

注意:
いくつかのUIコンポーネントは、HTML div要素やさらに複雑なマークアップなどのサブ要素でレンダリングされます。その結果、親コンポーネントにinlineStyle属性を設定しても、目的の効果が得られないことがあります。そのような場合、生成されたマークアップを調べ、inlineStyle属性を定義するかわりに、サブ要素にスタイルを伝播するCSSクラスを適用します。
JavaScriptのデバッグ方法の詳細は、第30.3.2項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

これらの属性は、「プロパティ」ウィンドウの「プロパティ」セクションに表示されます(図12-87を参照)。Value列を使用して、スタイル・シートを定義するために各プロパティ値を指定します。

図12-87 「プロパティ」ウィンドウの「スタイル」セクション

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

スキニングによって、MAF AMXアプリケーション機能内のすべてのUIコンポーネントに均一なスタイルを定義および適用し、機能全体に対するテーマを作成できます。

MAFのデフォルトのスキン・ファミリはmobileAltaで、デフォルト・バージョンはそのスキンの最新バージョンです。詳細は、第7章「MAFアプリケーションのスキニング」を参照してください。

12.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;
}

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

MAF AMXデータ視覚化コンポーネントのスタイル・プロパティの大部分は、cssディレクトリにあるdvtm.cssファイルで定義されます。デフォルト値をオーバーライドするには、アプリケーション機能レベルでカスタム・スタイル定義を含むカスタムCSSファイルを追加します。

スタイル・プロパティのいくつかは、CSSにマップできないため、カスタムJavaScriptファイルで定義する必要があります。それらのプロパティは、次のとおりです。

- ダイヤル・ゲージ・コンポーネントの背景および針のイメージ(第12.5.21章「ダイアル・ゲージの作成方法」を参照)。

- 時系列コンポーネントの経過時間バーのカラー・パレット(第12.5.29項「時系列コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのベース・マップ(第12.5.25.5項「カスタム・ベース・マップの定義」を参照)。

- 地理マップ・コンポーネントのスタイル・プロパティ(第12.5.24項「地理マップ・コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのスタイル・プロパティ(第12.5.25.7項「テーマ・マップ・コンポーネントへのカスタム・スタイルの適用」を参照)。

- 評価ゲージ・コンポーネントのselectedおよびunselected状態(第12.5.22.2項「評価ゲージ・コンポーネントへのカスタム・スタイルの適用」を参照)。

アプリケーション機能レベルで「包含」セクションにこれらのカスタムJavaScriptファイルを指定する必要があります。それによって、XMLスタイル・テンプレートで定義したデフォルト・スタイル値をオーバーライドします。次の例はJavaScriptファイルを示していますが、これは、CSSを使用してスタイル設定できないプロパティのカスタム・スタイル設定を必要とするデータ視覚化コンポーネントを持つMAF AMXアプリケーション機能を含むMAFプロジェクトに追加するファイルと似ています。

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>

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

「MAF AMXページ」で、OEPEが提供する標準XLIFFを使用すると、UIコンポーネントに表示されるテキストをローカライズできます。これを行うには、.amxファイルを選択し、文字列を右クリックしてコンテキスト・メニューの「ソース」→「文字列の外部化」を選択します。これで、「文字列の外部化」ダイアログが表示されます(図12-88を参照)。

注意:
プロジェクト・エクスプローラでファイルを右クリックし、「ソース」→「文字列の外部化」を選択すると、ファイルを外部化することもできます。

図12-88 「文字列の外部化」ダイアログ

外部化する値/キー・ペアを選択し、「編集」を選択して値を変更します。目的のすべてのペアを編集したら、「終了」をクリックしてXLIFFファイルを作成します。XLIFFファイルのデフォルト名が表示され、これを変更するには、「構成」をクリックします。XLIFFファイルを作成したら、図12-89のようにこのファイルを編集し、外部化された文字列の値を変更します。

図12-89 「テキスト・リソースの選択」ダイアログ

XLIFF (XML Localization Interchange File Format)ファイルが存在しない場合は、このファイルが作成されます。存在する場合は、新しいエントリが既存のXLIFFファイルに追加されます。さらに、ViewControllerBundle.xlfファイル(デフォルト名ですが、名前は基本的にプロジェクトと一致します)を指す表示コンポーネントの子として、対応するバンドルのロード(loadBundle)コンポーネントが作成されます。

注意:
ViewControllerBundle.xlfはデフォルトのファイル名です。この名前はプロジェクトの名前と一致します。

図12-90は、MAF AMXファイルでの変更を示しています。

図12-90 MAF AMXファイル内のローカライズ済文字列

詳細は、第6章「MAFアプリケーションのローカライズ」を参照してください。

12.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)

- 第12.8.2項「基本的なWAI-ARIA用語に関する必知事項」

- Oracle Global HTML Accessibility Guidelines (OGHAG)。
詳細は、第12.8.3項「Oracle Global HTML Accessibility Guidelinesに関する必知事項」を参照してください。

- iOSのアクセシビリティ・ガイドライン。
詳細は、『Accessibility Programming Guide for iOS』を参照してください。

そのようなコンポーネントの導入によって、アクセス可能なコンポーネントの外観の変更されたり、アプリケーション・ロジックが影響受けることがありません。

MAF AMXアプリケーション機能のアクセシビリティが適切に機能するために、次のガイドラインに従ってください。

- ナビゲーションの深さは3レベル以内にして、ユーザーが簡単にホーム画面に戻れるようにする必要があります。

- スクリプトを最小限に維持します。

- DOMとの直接対話を提供しないでください。

- JavaScriptのタイムアウトは使用しないでください。

- フォーカスの不要な変更は回避します。

- ポップアップ・トリガーを明示的に指定する

- 必要に応じて、WAI-ARIAライブ・リージョンを利用します(第12.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)

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

MAF AMX UIおよびデータ視覚化コンポーネントには、組込みのアクセシビリティ・サポートが備えられており、ほとんどのコンポーネントがアクセシビリティ監査の対象となっています(図12-91を参照)。

表12-11は、「プロパティ」の「アクセシビリティ」セクションで設定できるコンポーネントおよびそれらの属性を示しています。

表12-11 構成可能なアクセシビリティ属性を持つ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

フレックス・レイアウト(flexLayout)

ランドマーク(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属性が存在し、実行されるアクションを説明する必要があります。

しきい値(threshold)

短い説明(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属性の値はローカライズできます。

パネル・グループ・レイアウト・コンポーネントおよびデック・コンポーネントの場合、ページのコンテキストに従って適用可能なランドマーク・ロール・タイプ(表12-16「ランドマーク・ロール」を参照)を定義します。landmark属性に次の値の1つを設定できます。

- デフォルト(なし)

- アプリケーション

- banner

- complementary

- contentinfo

- form

- main

- navigation

- search

表12-12は、WAI-ARIA仕様によって定義されるそのアクセシビリティ属性が実行時に自動的に適用され、変更できないUIコンポーネントを示しています。

表12-12 静的アクセシビリティ属性を持つ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

図12-91は、OEPEに表示されるアクセシビリティ監査警告を示しています。

図12-91 アクセシビリティ監査警告

アクセス可能なMAF AMXアプリケーション機能をテストする方法の詳細は、第30.2.1項「iOSデバイス上でアクセシビリティのテストを実行する方法」を参照してください。

注意:
Androidでは、WAI-ARIAアクセシビリティ機能はデータ視覚化コンポーネントに対してサポートされません。
その他のMAF AMX UIコンポーネントは、アプリケーションがAndroidスクリーン・リーダー・モードで実行された場合、正しく動作しない可能性があります。

12.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仕様での定義)を示しています。

表12-13は、全般的なロール概念を定義する目的でWAI-ARIAのロールの分類をサポートするために使用される抽象ロールを示しています。

表12-13 抽象ロール

抽象ロール

説明

input

ユーザー入力を可能にする一般的なタイプのウィジェット。

landmark

ナビゲーショナル・ランドマークを意図したページのリージョン。

select

ユーザーが一連の選択肢から選択を行えるフォーム・ウィジェット。

widget

グラフィカル・ユーザー・インタフェースのインタラクティブ・コンポーネント。

表12-14は、スタンドアロン・ユーザー・インタフェース・ウィジェットまたは大きい複合ウィジェットの一部として機能するウィジェット・ロールを示しています。

表12-14 ウィジェット・ロール

ウィジェット・ロール

説明

ウィジェットで必要とされる状態

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 (ステート)

表12-15は、ページ内のコンテンツを編成する構造を記述するドキュメント構造ロールを示しています。通常、ドキュメント構造はインタラクティブではありません。

表12-15 ドキュメント構造ロール

ドキュメント構造ロール

説明

img

イメージを形成する要素のコレクションのコンテナ。

list

非インタラクティブ・リスト・アイテムのグループ。

listitem

リストまたはディレクトリ内の単一アイテム。

表12-16は、ナビゲーショナル・ランドマークを意図したページのリージョンを表すランドマーク・ロールを示しています。

表12-16 ランドマーク・ロール

ランドマーク・ロール

説明

アプリケーション

Webアプリケーション(Webドキュメントではなく)として宣言されるリージョン.

banner

ほとんどサイト指向のコンテンツ(ページ固有のコンテンツではなく)を含むリージョン。

complementary

DOM階層の類似したレベルにあるメイン・コンテンツを補足するように設計ているが、メイン・コンテンツから切り離しても意味を持つドキュメントのサポート・セクション。

contentinfo

親ドキュメントに関する情報が含まれている大きな認識可能なリージョン。

form

全体として結合されてフォームを作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

main

ドキュメントのメイン・コンテンツ。

navigation

ドキュメントまたは関連ドキュメントをナビゲートするためのナビゲーショナル要素(通常はリンク)のコレクション。

search

全体として結合されて検索機能を作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

MAF UIコンポーネントの大部分では、アクセス可能なWAI-ARIA属性は変更できません。一部のコンポーネントでは、デザインタイムで特別なアクセス可能な属性を設定でき、パネル・グループ・レイアウトおよびデックには、WAI-ARIAランドマーク・ロール・タイプを使用できます。詳細は、第12.8.1項「アクセシビリティのためのUIコンポーネントおよびデータ視覚化コンポーネントの構成方法」を参照してください。

12.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のアクセシビリティについての考え方とポリシーを参照してください。

12.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>

検証メッセージはポップアップ・コンポーネントに表示されます(第12.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。検証ポップアップのタイトルを構成することはできません。それは、相対的なメッセージ重大度によって自動的に決定されます。現在のメッセージのうちの最も重大なものが検証ポップアップのタイトルになります。つまり、すべての検証メッセージがWARNINGタイプである場合は、そのタイトルは「警告」になります。メッセージのいくつかがWARNINGタイプで、その他はERRORタイプの場合はタイトルは「エラー」に設定されます。

図12-92は、実行時に生成されるポップアップ検証メッセージを示しています。

図12-92 iPhoneでの検証メッセージ

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

MAF AMXページからJavaコードを呼び出し、アプリケーション・ロジックを実行するには、次のいずれかの方法でUIコンポーネントの属性としてリスナーを定義します。

- MAF AMXファイルのソースでの手動による方法。

- 選択したコンポーネントの「プロパティ」エディタから行う方法。詳細は、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

- drillListener: 次のパラメータで作成されるDrillEventをリスニングします。

- ドリル済オブジェクトのIDを表すjava.lang.Object

- ドリル・データ・アイテムのrowkeyを表すjava.lang.Object

- ドリル済オブジェクトのグループ名を表すjava.lang.Object

- ドリル済オブジェクトの系列名を表すjava.lang.Object

リスナーの値は、パターン#{*}に一致している必要があり、次の要件を満たしている必要があります。

- タイプ名: EL式

- ベース・タイプ: 文字列

- プリミティブ・タイプ: 文字列

ELイベントの詳細は、第13.3.6項「ELイベントについて」を参照してください。

ほとんどのMAF AMXイベント・クラスは、oracle.adfmf.amx.event.AMXEventクラスを拡張します。Javaコードでイベント・リスナーを定義するときは、oracle.adfmf.amx.event.AMXEventクラスを渡す必要があります。

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

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

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

- 第18.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;
}

その他の例については、「ファイル」→「新」→「MAFサンプル」にあるAPIDemoアプリケーションというMAFサンプル・アプリケーションを参照してください。このサンプルは、JavaBeansからリスナーをコールする方法を示しています。

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

イベント・リスナーは、一部のMAF AMX UIコンポーネントの子として定義できます。リスナーのtype属性によって、それらがどのイベントを処理するために登録されるのかが識別されます。各親UIコンポーネントでは(親コンポーネントに適した)イベントのサブセットのみがサポートされているため、これらのサポートされているイベントは、リスナーに対して選択できる限られたタイプのリストに提示されます。

親UIコンポーネント、親UIコンポーネントに子として含めることができるイベント・リスナーおよびサポートされるイベント・タイプの詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

子イベント・リスナーのそれぞれのtype属性には、リスナー・イベントと一致する値の基本セットがあります。これらの値はOracle Mobile Application Frameworkタグ・リファレンスに示す情報に基づいてフィルタ処理され、それによって、子イベント・リスナーが、識別された親UIコンポーネントのコンテキスト内にある場合に、その親によってサポートされているイベントのみが表示されるようになります。たとえば、ボタン・コンポーネントの下にあるアクション・リスナーまたはプロパティ・リスナーの設定の子では、actionタイプの値およびジェスチャーのみか表示されます。

図12-93は、親リスト・アイテム・コンポーネントのプロパティ・リスナーの設定のかぎられたタイプ・リストにおいて使用可能な値を示しています。

図12-93 イベント・タイプの選択

脚注の凡例

脚注 1: 詳細は、第12.3.28.1項「disabled属性に関する必知事項」を参照してください。

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

この章では、モバイル・アプリケーション・フレームワーク(MAF)でデータ・バインディング、データ・コントロールおよびデータ・バインディング式言語(EL)を使用する方法について説明します。また、オブジェクト・スコープ・ライフサイクル、マネージドBean、UIヒント、検証およびデータ変更イベントについても説明します。

この章には次の項が含まれます:

- 第13.1項「バインディングおよびデータ・コントロールの概要」

- 第13.2項「オブジェクト・スコープ・ライフサイクルについて」

- 第13.3項「EL式の作成」

- 第13.4項「マネージドBeanの作成と使用」

- 第13.5項「データ・コントロールを使用したビジネス・サービスの公開」

- 第13.6項「データ・コントロール・パレットでのデータバインドUIコンポーネントの作成」

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

- 第13.8項「データ・コントロール属性の使用」

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

- 第13.10項「DeviceFeaturesデータ・コントロールの使用方法」

- 第13.11項「属性の検証」

- 第13.12項「データ変更イベントについて」

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

モバイル・アプリケーション・フレームワークによって、ユーザー・インタフェース(UI)・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロールと宣言的バインディング)が実装されています。データ・コントロールでは、関連するプロパティ、メソッド、タイプの情報を含め、サービスの操作とデータ・コレクションを表す標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化します。OEPEを使用すると、ページにドラッグ・アンド・ドロップできるアイコンとしてその情報を表示できます。宣言的なバインディングによって、データ・コントロール内のデータ・コレクションからのデータ・アクセスとその操作の実行の詳細が抽象化されます。実行時に、モデル・レイヤーによって、適切なXMLファイルからデータ・コントロールおよびバインディングを記述した情報が読み取られ、ユーザー・インタフェースとビジネス・サービスの双方向の結合が実装されます。

ページのユーザー・インタフェース・コンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。モデル・レイヤーでは実行時にこのファイルが使用され、ページのバインディングがインスタンス化されます。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持され、EL式#{bindings}を使用して各ページ・リクエスト中にアクセスできます。この式により、現在のページのバインディング・コンテナが常に評価されます。パレットから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインド・ユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要なコードおよびオブジェクトがOEPEによって自動的に作成されます。

モバイル・アプリケーション・フレームワークには、即時利用可能な2つのデータ・コントロール(DeviceFeaturesデータ・コントロールとApplicationFeaturesデータ・コントロール)が付属しています。OEPEのパレット内に表示されるDeviceFeaturesデータ・コントロールを使用すると、データ・コントロールの主なデータ属性を(テキスト)フィールドとして、またデータ・コントロールの操作をコマンド・オブジェクト(ボタン)として、アプリケーションにドラッグ・アンド・ドロップできます。これらのドラッグ・アンド・ドロップ・アクションによって、アプリケーション内のELバインディングおよび作成されるコントロールに適したプロパティが生成されます。バインディングは、データ・コントロール・ソースを指すために、ページ定義ファイルによって表され、ページ・バインディングによって、特定のページの参照がデータ・コントロールにリンクされます。

データ・コントロールとバインディングの詳細は、次を参照してください。

- 第13.5項「データ・コントロールを使用したビジネス・サービスの公開」

- 第13.6項「データ・コントロール・パレットでのデータバインドUIコンポーネントの作成」

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

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

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

- 第13.10項「DeviceFeaturesデータ・コントロールの使用方法」

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

実行時、ページがデータにアクセスできるオブジェクト・スコープに必要なデータを格納することで、データをページに渡します。スコープによってオブジェクトの存続期間が決まります。オブジェクトをスコープに置くと、EL式を使用してスコープからアクセスできます。たとえば、fooという名前のマネージドBeanを作成し、Beanをビュー・スコープに存続させるよう定義するとします。このBeanにアクセスするには、#{viewScope.foo}という式を使用します。

モバイル・アプリケーション・フレームワーク変数とマネージドBean参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。MAFは、可視性の減る順序で一覧表示されている次のスコープをサポートしています。

- アプリケーション・スコープ: オブジェクトは、アプリケーションが存続するかぎり(複数の機能にまたがって)使用可能です。

- ページ・フロー・スコープ: オブジェクトは、機能が存続するかぎり(その機能内でのみ)使用可能です。

- ビュー・スコープ: オブジェクトは、ビューが存続するかぎり(機能の単一ページ内で)使用可能です。

オブジェクト・スコープは、プログラミング言語のグローバル変数およびローカル変数のスコープに相当します。スコープが広いほど、オブジェクトの可用性が高くなります。存続期間の間、これらのオブジェクトで特定のインタフェースの公開、情報の保持および他のオブジェクトへの変数とパラメータの受渡しを行うことができます。たとえば、アプリケーション・スコープに定義されているマネージドBeanは、アプリケーションの存続期間中、複数のページ・リクエスト間で使用できます。ただし、ビュー・スコープに定義されているマネージドBeanは、機能内の1つのページ・リクエストの存続期間中にのみ使用できます。

アプリケーション・スコープの名前空間で定義されたEL式は、アプリケーションが存続するかぎり、複数の機能にまたがって使用できます。アプリケーションの一方のビューでアプリケーション・スコープを定義し、そのスコープをもう一方のビューで参照できます。ページ・フロー・スコープの名前空間で定義されたEL式は、機能が存続するかぎり、単一の機能の境界内で使用できます。ビュー・スコープの名前空間で定義されたEL式は、ビューが存続するかぎり、機能の単一ページの境界内で使用できます。スコープを含むこのような変数に加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。詳細は、第13.3.5.2項「マネージドBeanのカテゴリについて」および第13.3.5.3項「モバイル・アプリケーション・フレームワークのオブジェクト・カテゴリについて」を参照してください。

マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。アプリケーション・スコープは、ユーザー情報やコンテキスト情報など、アプリケーション全体に関係する情報にのみ使用します。ページ間での値の受渡しにアプリケーション・スコープを使用しないでください。

注意:
メモリー・スコープに入れる各オブジェクトはJSON DataChangeEventに対してシリアライズされ、このオブジェクト内のゲッター・メソッドによって戻されるオブジェクトもシリアライズされます。これは、ネストが深いシリアライズされたオブジェクト・ツリーにつながることがあり、パフォーマンスが低下します。一連のネストされたオブジェクトのシリアライズを避けるには、それらを一時オブジェクトとして定義する必要があります。詳細は、第13.9.1項「Beanクラス変数のシリアライズに関する必知事項」を参照してください。

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

タスク・フロー内の変数に使用するスコープを決めるときは、ビューまたはページ・フロー・スコープのみを使用する必要があります。アプリケーション・スコープは、タスク・フローの存続期間を超えてオブジェクトをメモリーに保存するため、タスク・フローのカプセル化および再利用で障害が発生します。さらに、アプリケーション・スコープでは、オブジェクトがメモリーに必要以上に長い時間保持されることがあるため、不要なオーバーヘッドが発生します。

タスク・フロー内のアクティビティ間でデータ値を渡す必要がある場合は、ページ・フロー・スコープを使用する必要があります。現在のビュー・アクティビティ内でのみ必要とされ、ビュー・アクティビティ間にまたがっていない変数の場合、ビュー・スコープを使用する必要があります。

13.3 EL式の作成

MAFアプリケーションのEL式を使用して、属性と実行時に決まるオブジェクト値とをバインドします。たとえば、#{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の作成および使用の詳細は、第13.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;
}

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

パレットを使用してコンポーネントを作成すると、MAFデータ・バインディング式が作成されます。この式は、バインディング・オブジェクトのデータを表示するか、バインディング・オブジェクトのプロパティを参照する、すべてのコンポーネント属性に追加されます。事前作成済のそれぞれの式は、ページ定義ファイルで定義された、適切なバインディング・オブジェクトを参照します。これらのバインディング式は編集可能ですが、MAFバインディング式の構文に従っていれば、独自に作成することもできます。MAFデータ・バインディング式は、属性がELをサポートしている場合、バインディング・オブジェクトからのデータを移入する任意のコンポーネント属性に追加できます。

一般的なMAFデータ・バインディングEL式は、次の構文を使用して、バインディング・コンテナ内のタイプの異なるバインディング・オブジェクトを参照します。

#{bindings.BindingObject.propertyName}

ここで、

- bindingsは、式によって参照されているバインディング・オブジェクトが現在のページのバインディング・コンテナにあることを識別する変数です。すべてのMAFデータ・バインディングEL式は、bindings変数で始まる必要があります。

- BindingObjectは、ページ定義ファイルで定義される、バインディング・オブジェクトのID、または属性については名前です。バインディングobjectIDまたは名前は、そのページ定義ファイル内で一意なものです。EL式は、パラメータ・バインディング、実行可能バインディングまたは値バインディングなど、ページ定義ファイル内のどのバインディング・オブジェクトでも参照できます。

- propertyNameは、各データバインドUIコンポーネントのデフォルトの表示方法を決定し、実行時のバインディング・オブジェクトのプロパティを設定する変数です。各タイプのバインディング・オブジェクトに対して、異なるバインディング・プロパティがあります。バインディング・プロパティの詳細は、第13.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

たとえば、次の式を例にしてみます。

#{bindings.ProductName.inputValue}

bindings変数は、現在のページのバインディング・コンテナでバインドされた値を参照します。参照されているバインディング・オブジェクトはProductNameであり、これは属性バインディング・オブジェクトです。バインディング・プロパティはinputValueで、最初のProductName属性の値を戻します。

ヒント:
ページ定義ファイルのバインディング式ではドル記号($)またはハッシュ記号(#)の接頭辞を使用できますが、MAFページのEL式で使用できるのは、ハッシュ記号(#)の接頭辞のみです。

前述のように、パレットを使用してUIコンポーネントを作成する場合、これらの式が組み込まれます。ただし、必要に応じて手動で式を作成することもできます。OEPEの式ビルダーは、UIコンポーネントがバインドされるその他の有効なオブジェクトに加え、ページ定義ファイルに定義されたバインディング・オブジェクトのリストを提供することにより、EL式の構築を支援するダイアログです。また、MAFバインディング・オブジェクトの階層リストやMAFバインディング・オブジェクトの最も一般的に使用されるプロパティが提供されるため、MAFデータバインド式の作成や編集に特に便利です。バインディング・プロパティの詳細は、第13.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

13.3.2 EL式の作成方法

OEPEの式ビルダーを使用すると、EL式を宣言的に作成できます。エディタ、ダイアログまたはページ・エディタ・プロパティにが表示される式ビルダーにアクセスできます。

始める前に

EL式に関する知識が役立つ場合があります。詳細は、第13.3項「EL式の作成」を参照してください。

式ビルダーの使用手順:

1. MAF機能エディタで、変更する機能を展開し、「制約」を右クリックします。「新」→「制約式」を選択します。

2. 「制約式」の下で、をクリックして「式ビルダー」ダイアログを開きます。

3. 次の機能を使用して式を作成します。

- 「変数」フィルタを使用して、式に含める項目を選択します。これらの項目は、階層形式のバインディング・オブジェクトであるツリーに表示されます。ツリーの各アイコンは、式で使用できる各種タイプのバインディング・オブジェクトを表します。
ツリーを絞り込むには、「変数」に検索条件を入力します。MAFで公開されているELでアクセス可能なオブジェクトは、MAFオブジェクト・ノードの下、「マネージドBean」ノードにあります。

ヒント:
これらのオブジェクトの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。第13.3.5項「式ビルダーのカテゴリについて」も参照してください。

ツリーの項目をダブルクリックすると、項目はEL式内の「式」ボックスに移動します。「式」ボックスに式を直接入力することもできます。

- 演算子ボタンを使用して、式に論理演算子または算術演算子を追加します。

- ツリーのフォルダおよび変数に関する詳細を表示するには、その上にマウスを置きます。

図13-1は、「マネージドBean」カテゴリからEL式を作成する方法の例を示しています。ただし、EL式は、第13.3.5項「式ビルダーのカテゴリについて」で説明されているどのカテゴリからも作成できます。

図13-1 「式ビルダー」ダイアログ

ヒント:
EL式を作成する正しい構文の使用の詳細は、http://download.oracle.com/javaee/index.html">>http://download.oracle.com/javaee/index.htmlのJava EEチュートリアルを参照してください。

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

表13-1は、「プロパティ」ウィンドウで「式ビルダー」オプションではなく「メソッド式ビルダー」オプションが提供されるプロパティを示しています。これらの唯一の違いは、メソッド式ビルダーが、選択されたプロパティに応じてマネージドBeanをフィルタして除外することです。

表13-1 メソッド式ビルダーのプロパティ

プロパティ

要素

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

13.3.2.2 非ELプロパティについて

表13-2は、ELに対応していないため「プロパティ」ウィンドウで使用可能なEL「式ビルダー」オプションを持たないプロパティを示しています。

表13-2 非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

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

式ビルダーを使用してデータバインド・コンポーネントを作成すると、EL式によって、特定のMAFバインディング・プロパティが参照される場合があります。実行時には、これらのバインディング・プロパティによって、データバインドUIコンポーネントのデフォルトの表示方法や、イテレータ・バインディング固有のパラメータなどが定義されます。ADFバインディング・プロパティは、Oracle APIによって定義されます。各バインディング・タイプで使用可能なプロパティの完全なリストは、表13-3 MAFバインディングのランタイムELプロパティを参照してください。

特定のプロパティに割り当てられる値は、ページ定義ファイルで定義されます。たとえば、イテレータ・バインディングには、イテレータが一度に表示する行数を指定する、RangeSizeというプロパティがあります。次のように、RangeSizeに割り当てられる値は、ページ定義ファイルで指定されます。

<iterator Binds="ItemsForOrder" RangeSize="25"
DataControl="BackOfficeAppModuleDataControl"
id="ItemsForOrderIterator" ChangeEventPolicy="ppr"/>

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

ルートEL式#{bindings}によってアクティブな画面のバインディング・コンテナを参照でき、式#{data.PageDefName}を使用して別の画面のバインディング・コンテナを参照できます。モバイル・アプリケーション・フレームワークAMXバインディング・オブジェクトは、バインディング・コンテナ#{bindings.Name}からの名前によって参照されます。

表13-3は、実行時にモバイル・アプリケーション・フレームワークAMXバインディング・オブジェクトの値にアクセスするためにEL式で使用できるプロパティの一部を示しています。プロパティは、アルファベット順に並んでいます。

表13-3 MAFバインディングのランタイムELプロパティ

ランタイム・プロパティ

説明

イテレータ

アクション

attributeValues

ツリー

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の子または属性の直接の子として使用できます。バインディングの最初の属性のラベルを戻します(コントロール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変数を先頭の語句として追加します。

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

MAF AMXページ用の式ビルダーでは、次のカテゴリが使用できます。

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

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

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

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

この項では、バインディング・カテゴリで使用できるオプションを示します。bindingsノードとdataノードは、サポートされているバインディングとプロパティの同じセットを表示します。表13-4に、使用できるバインディング・タイプと、各バインディング・タイプでサポートされるプロパティをリストします。securityContextノードは、次のプロパティをサポートしています。

- authenticated

- userGrantedPrivilege

- userInRole

- userName

次に例を示します。

#{securityContext.authenticated}
#{securityContext.userGrantedPrivilege['submit_privilege']}
#{securityContext.userInRole['manager_role']}
#{securityContext.userName}

表13-4 サポートされるバインディング・タイプ

バインディング・タイプ

プロパティ

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

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

この項では、「マネージドBean」カテゴリの下で使用できるオプションを示します。

- applicationScope: 「マネージドBean」のapplicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーションスコープのマネージドBeanなど)。

- pageFlowScope: 「マネージドBean」のpageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロースコープのマネージドBeanなど)。

- viewScope: 「マネージドBean」のviewScopeノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュースコープのマネージドBeanなど)。

MAFランタイムでは、自身をマネージドBeanプロパティの変更通知のリスナーとして登録することによって、Beanプロパティを参照するUIコンポーネントにバインドされたEL式が、プロパティの値変更時に自動的に更新されるようにします。これらの通知をソースとして参照するには、Beanのプロパティ・アクセッサにコードを追加する必要があります。Beanのプロパティ・アクセッサから、通知をソースとして参照するために必要なコードを自動的に生成するには、「取得メソッドと設定メソッドの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します(図13-2を参照)。

図13-2 プロパティの変更時にリスナーに通知

ELを通じて単にBeanメソッドまたはプロパティを参照する場合、このコードを追加する必要はありませんが、Beanに格納された値が変化する場合や、特にその変更が、1つ以上のプロパティ値を変更するBeanメソッドの実行による二次的な影響など、間接的なものである場合、それらの値に依存するEL式のアクティブ・フォームへのレンダリングを最新の状態に保つ必要があります。プロパティの変更とPropertyChangeSupportクラスの詳細は、第13.12項「データ変更イベントについて」を参照してください。

次の例は、別のマネージド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要素には当てはまりません。

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

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリには、オブジェクト・スコープなどのELを使用して参照できるモバイル・アプリケーション・フレームワーク・オブジェクトに定義されている様々なオブジェクトが一覧表示されます。

MAF変数とマネージドBean参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。これらのスコープには、可視性が高い順に、アプリケーション・スコープ、ページ・フロー・スコープおよびビュー・スコープがあります。様々なオブジェクト・スコープの詳細は、第13.2項「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

スコープを含むこのような変数に加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。

次のものは、「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリの下で使用できます。

- applicationScope: applicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーション・スコープのマネージドBeanなど)。アプリケーション・スコープで定義されたEL変数は、アプリケーションが存続するかぎり、機能の境界にまたがって使用できます。

- pageFlowScope: pageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロー・スコープのマネージドBeanなど)。ページ・フロー・スコープで定義されたEL変数は、機能が存続するかぎり、単一の機能の境界内で使用できます。

- preferenceScope: preferenceScopeノードには、アプリケーションと機能のすべてのプリファレンスが含まれます。
プリファレンス要素では、PreferenceValue要素を除き、Id属性の値を式ビルダーのノード・ラベルとして使用します。PreferenceValue要素では、Name属性の値を式ビルダーのノード・ラベルとして使用します。

注意:
EL式の文字列トークンにドット(.)や特殊文字またはdefaultなどの予約語が含まれている場合、式ビルダーではそのような文字列トークンを一重引用符と大カッコで囲みます。機能IDやプリファレンス・コンポーネントIDにドットが含まれている場合、式ビルダーでは、ドットによって区切られたIDの各部分を別のプロパティとしてpreferenceScope階層に表示します。生成された式でも、ドットによって区切られたIDの各部分を別のプロパティとして認識します。

preferenceScopeのいくつかのサンプルEL式を次に示します。

"#{preferenceScope.application.OracleMobileApp.Edition['default']}"

- viewScope: このノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュー・スコープのマネージドBeanなど)。ビュー・スコープの名前空間で定義されたEL変数は、ビューが存続するかぎり、機能の単一ページの境界内で使用できます。

- row: rowオブジェクトは、collectionModelに含まれる単一のプロバイダへのショートカットである中間変数です。その名前は、親コンポーネントのvar属性の値です(List ViewやCarouselなど)。

注意:
AdfmfJavaUtilities.evaluateELExpressionを使用して、#{row}、またはrowのプロパティを評価することはできません。これらの式はnull値を戻します。

- viewControllerBundle
これは、プロジェクト・レベルで定義されているリソース・バンドルを指すリソース・バンドル変数の名前です。このノードが表示されるのは、amx:loadBundle要素が削除され、リソース・バンドルが作成された後のみです。このノードの名前は、amx:loadBundleの変数名によって異なります。このノードには、バンドル内で宣言されたすべての文字列が表示されます。

次の例は、viewControllerBundleのAMXコードの例を示しています。

<amx:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle"/>

13.3.6 ELイベントについて

ELイベントは、共通語句を含む式が相互に同期して更新できるようにするため、MAF AMX UIの動作において重要な役割を果たします。

EL式は、様々なコンテキストで値を参照できます。次の例は、2つの入力数値スライダ・コンポーネントの作成を示しており、各コンポーネントはapplicationScopeの値に関連付けられています。出力テキストでは、ELを使用して単純な追加式を計算結果とともに表示します。フレームワークでは、出力テキスト・ラベル内のEL式を解析するときに、その式に2つの値への参照が含まれていることを確認し、それら2つの値に基づく出力テキストのイベント・リスナー(第12.10項「イベント・リスナーの使用方法」を参照)を作成します。基礎となる式の値が変化すると、イベントがその値のすべてのリスナーに対して生成されます。

注意:
(スコープ・オブジェクトではなく)マネージドBeanのプロパティを参照している場合、リスナーを追加する必要があります。詳細は、第13.3.5.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}を更新すると、もう一方が出力テキストとともに自動的に更新されます。

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

必要なEL式はOEPEで作成され、作成されない式は式ビルダーを使用して作成できますが、マネージドBean内での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);
}

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

マネージドBeanは、様々な構成ファイルを使用してアプリケーションに登録するJavaクラスです。MAFアプリケーションを起動すると、これらの構成ファイルが解析されて、Beanが使用可能になり、EL式での参照やBeanのプロパティおよびメソッドへのアクセスが可能になります。マネージドBeanが初めて参照されたときにまだ存在していない場合、マネージドBean作成機能によりBeanのデフォルトのコンストラクタ・メソッドがコールされて、Beanがインスタンス化されます。また、プロパティが宣言されると、宣言されたデフォルトの値が移入されます。

多くの場合、マネージドBeanは、フロント・エンドで処理することが最適なイベントやデータ操作を処理します。マネージドBeanの使用方法の詳細は、http://www.oracle.com/technetwork/java/index.html">>http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

ベスト・プラクティス:
マネージドBeanを使用して、現在のユーザーなどのブックキーピング情報のみを格納します。すべてのアプリケーション・データおよび処理データは、アプリケーションのビジネス・レイヤーのロジックによって処理される必要があります。

注意:
EL式は、Beanを参照するために明示的にスコープを含める必要があります。たとえば、pageFlowScopeスコープからMyBeanマネージドBeanを参照するには、#{pageFlowScope.MyBean}という式になります。

13.4.1 OEPEでのマネージドBeanの作成方法

エディタを使用して、マネージドBeanを作成し、同時にそれをMAFアプリケーションに登録できます。

始める前に

マネージドBeanに関する知識が役立つ場合があります。詳細は、第13.4項「マネージドBeanの作成と使用」を参照してください。

マネージドBeanの作成および登録手順:

1. プロジェクト・エクスプローラで、ビュー・プロジェクトを展開してViewContentを展開し、adfc-mobile-config.xmlをダブルクリックします。

2. エディタ・ウィンドウで、「概要」タブをクリックします。

3. 概要エディタで、「マネージドBean」ナビゲーション・タブをクリックします。
図13-3は、adfc-mobile-config.xmlファイル用のエディタを示しています。

図13-3 adfc-mobile-config.xmlファイルのマネージドBean

4. 図13-4のように、マネージドBeanを選択し、マネージドBeanの追加をクリックします。

図13-4 マネージドBeanの作成

5. マネージドBeanを定義するには、次の手順を実行します。

- Beanの名前を入力します。

- 既存のクラスを参照するか、新しいクラスの名前を入力して、をクリックします。新しいJavaクラスが作成され、エディタで開きます。

- Beanのスコープを選択します。オプションは次のとおりです。

- アプリケーション

- ページ・フロー

- ビュー

注意:
マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。様々なオブジェクト・スコープの詳細は、第13.2項「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

6. オプションでBeanに管理プロパティを追加できます。Beanがインスタンス化される際、指定した値が管理プロパティに設定されます。「マネージドBean」表でBeanが選択された状態で、をクリックして行を「管理プロパティ」表に追加します。「プロパティ」ウィンドウで、プロパティ名を入力します(他のフィールドはオプションです)。

注意:
このエディタを使用して管理プロパティを宣言することはできますが、対応するコードはJavaクラスで生成されません。適切な型のprivateメンバー・フィールドを作成し、コード・エディタのコンテキスト・メニューの「ソース」→MAF用のゲッターとセッターを生成メニュー・アイテムを選択して、これらのBeanプロパティに対応するgetおよびsetメソッドを生成することで、そのコードを追加する必要があります。

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

マネージドBeanを作成し、Javaファイルを生成するよう選択すると、OEPEによって、指定された名前とデフォルト・コンストラクタを持ったスタブ・クラスが作成されます。次の例に、viewパッケージに格納されたMyBeanクラスに追加されるコードを示します。

package view;

public class MyBean {
public MyBean() {
}
}

ここでページに必要なロジックを追加する必要があります。このロジックは、マネージドBeanのmanaged-bean-nameを参照するEL式を使用して参照できます。たとえば、my_beanマネージドBeanのmyInfoプロパティにアクセスする場合、EL式は次のようになります。

#{my_bean.myInfo}

OEPEでは、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>

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

アプリケーションのサービスの準備ができたら、OEPEを使用して、UIコンポーネントとサービスとの宣言的バインドに必要な情報を提供するデータ・コントロールを作成できます。

「ファイル」→「新」→「その他」を選択することで表示される「新」ダイアログからデータ・コントロールを生成します。データ・コントロールは、1つ以上のXMLメタデータ・ファイルで構成され、これらのファイルでは、実行時にバインディングと連動するサービスの機能が定義されます。データ・コントロールは、基礎となるサービスと連動します。

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

OEPEのプロジェクト・エクスプローラ内からアダプタ・ベースのデータ・コントロールを作成します。

始める前に:

データ・コントロール使用の一般的な知識があると役立ちます。詳細は、第13.5項「データ・コントロールを使用したビジネス・サービスの公開」を参照してください。

次のタスクを完了する必要があります。

アプリケーション・ワークスペースを作成し、データ・コントロールの基礎にするビジネス・サービスを追加します。アプリケーション・ワークスペースの作成の詳細は、第2.3項「MAFアプリケーションの作成」を参照してください。

データ・コントロールを作成する手順は、次のとおりです。

1. プロジェクト・エクスプローラで、ビュー・プロジェクトのトップレベル・ノードを右クリックし、「新」→「データ・コントロール」を選択します。

2. 「新」ダイアログで、「Oracle」を展開して「モバイル・アプリケーション・フレームワーク」を展開し、「データ・コントロール」を選択します。「次へ」をクリックします。

3. 「データ・コントロール・ソース」ページ:

- プロジェクトを選択します。

- データ・コントロールのタイプを選択します。

- をクリックし、「データ・コントロール・ソース」ダイアログでクラスを選択します。

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

4. ウィザードの残りのステップを完了します。

注意:
場合によっては、データ・コントロールの基礎にするクラスまたはオブジェクトを右クリックし、「データ・コントロールの作成」を選択することによってデータ・コントロールを作成できます。
オブジェクトがBeanクラス、つまりWSDLファイルの場合、右クリックしてモデル・コンポーネント→「データ・コントロールの作成」を選択します。

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

データ・コントロールを作成すると、OEPEによって、データ・コントロール定義ファイル(DataControls.dcx)が作成され、このファイルがデータ・コントロール・マネージャで開かれ、パレットにファイルの階層が表示されます。このファイルにより、データ・コントロールがサービスおよびバインディングと直接連動して動作することが可能になります。

エディタ・ウィンドウの「ソース」タブをクリックすることによって、対応するXMLファイルからのコードを表示できます。

13.5.2.1 データ・コントロール・マネージャ

データ・コントロール・マネージャは、データ・コントロール・オブジェクトの階層のビューと、DataControls.dcxファイルのデータ・モデルの公開メソッドを提供します。プロジェクト・エクスプローラからデータ・コントロール・マネージャを開くには、アプリケーション・オブジェクト・ノードを展開してMAFを展開し、データ・コントロール・マネージャをダブルクリックします。

データ・コントロール・マネージャおよびパレットで使用されているアイコンの説明の詳細は、表13-5を参照してください。

図13-5に示すように、オブジェクトを選択し、構造定義の編集リンクをクリックすることで、データ・コントロール・オブジェクトのラベルおよびツールチップを変更できます。

図13-5 データ・コントロール・マネージャ

13.5.2.2 パレット

デフォルトでは、IDEの左下隅にパレットが表示されます。ノードをパレットからページのデザイン・エディタにドラッグすることで、データバインドUIコンポーネントを作成できます。パレットでダブルクリックすることで、タグおよびタグ・バインディングを作成でき、タグをページにドラッグした場合、式ビルダーを使用してバインドできます。

13.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: パラメータとして渡された主キーの属性値を使用して行の検索を試行します。検出されると、その行が現在の行になります。

13.6 データ・コントロール・パレットからのデータバインドUIコンポーネントの作成

パレットから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインド・ユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要な様々なコードおよびオブジェクトがOEPEによって自動的に作成されます。

パレットでは、各データ・コントロール・オブジェクトは特定のアイコンによって表されます。表13-5は、各アイコンが表すデータ・コントロール・オブジェクト、パレットの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。

表13-5 パレット・アイコンおよびオブジェクト階層

アイコン

名前

説明

作成する対象

データ・コントロール

データ・コントロールを表します。

他のオブジェクトのコンテナとして機能し、作成には使用されません。

コレクション

アクセッサ・メソッドまたは操作から返される名前付きデータ・コレクションを表します。

フォーム、表、グラフ、ツリー、レンジ・ナビゲーション・コンポーネント、マスター/ディテール・コンポーネントおよび選択リスト・コンポーネント

構造化属性

Javaプリミティブ・タイプ(属性として示される)または任意のタイプのコレクションのいずれでもない、戻りオブジェクトを示します。

フォーム、ラベル、テキスト・フィールド、日付、値のリストおよび選択リスト・コンポーネント。

属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。

メソッド

データ・コントロールのメソッドまたは操作、またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはコレクションを戻したりすることができます。

コマンド・コンポーネント。

パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。

メソッド戻り

メソッドまたはその他の操作から返されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、または親コレクションで実行できる操作などです。

単一の値の場合: テキスト・フィールドおよび選択リスト。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント。

単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するには、対応するメソッドをボタンとしてドロップします。フォームがタスク・フローの一部の場合、メソッド・アクティビティを作成してメソッドを起動できます。

操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。

ボタンやリンクなどのUIコマンド・コンポーネント。

パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。

ラベル、テキストおよび選択リストの各コンポーネント。

13.6.1 データ・コントロール・パレットの使用方法

OEPEは、ドロップするデータ・コントロール項目に対してそれぞれ選択できるUIコンポーネントの事前定義済セットを備えています。

始める前に:

パレットの各種オブジェクトに関する知識があると役立つ場合があります。詳細は、第13.6項「データ・コントロール・パレットでのデータバインドUIコンポーネントの作成」を参照してください。

次のタスクを完了する必要があります。

- 第13.5.1項「データ・コントロールの作成方法」の説明に従って、データ・コントロールを作成します。

- 第11.3.1.2項「MAF AMXページの作成」の説明に従って、MAF AMXページを作成します。

パレットを使用してUIコンポーネントを作成するには、次の手順を実行します。

1. パレットで項目を選択し、ページのビジュアル・エディタにドラッグします。パネル内の各項目の定義の詳細は、表13-5 パレット・アイコンおよびオブジェクト階層を参照してください。

2. ポップアップ・メニューから、UIコンポーネントを選択します。
パレットから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのコンテキスト・メニューが表示されます。表示されるコンポーネントは、プロジェクト内のライブラリに基づきます。

図13-6は、パレットのデータ・コレクションをページにドロップしたときに表示されるコンテキスト・メニューを示しています。

図13-6 パレットのコンポーネントのドロップ

コンテキスト・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログがOEPEによって表示されます。たとえば、コンテキスト・メニューから「フォーム」を選択すると、「フォーム・フィールドの編集」ダイアログが表示されます。コンポーネントを選択したら、OEPEによって、ビジュアル・エディタでページにUIコンポーネントが挿入されます。

デフォルトで選択されたUIコンポーネントはまず、対応するビジネス・オブジェクト上で設定されているUIヒントで決定されます。UIヒントが設定されない場合、OEPEによって、標準のフォームと表には入力コンポーネントが使用され、読取り専用のフォームと表には出力コンポーネントが使用されます。リストのコンポーネントは、データ・コントロール・オブジェクトをドロップするときに選択するリストの型に基づいて決定されます。

デフォルトでは、データ・コントロールの使用時に作成されるUIコンポーネントは、MAFデータ・コントロール内の属性にバインドされ、次のような組込み機能を装備できます。

- データバインド・ラベル

- ツールチップ

- 書式設定

- 基本的なナビゲーション・ボタン

- 検証(検証規則が特定の属性にアタッチされている場合。)

デフォルトのコンポーネントは、そのまま使用しても十分機能します。ただし、特定のニーズに合せて変更することができます。

ヒント:
ページで使用するMAFデータバインド・コンポーネントのタイプを変更する場合は、ビジュアル・エディタまたは構造ウィンドウを使用してそのコンポーネントを削除し、パレットから新しいコンポーネントをドラッグ・アンド・ドロップする方法が最も簡単です。データバインド・コンポーネントをページから削除するときにビジュアル・エディタまたは構造ウィンドウを使用する場合、ページ定義ファイルの関連するバインディング・オブジェクトが他のどのコンポーネントからも参照されていなければ、これらのバインディング・オブジェクトはOEPEによって自動的に削除されます(ソース・エディタを使用する場合は、バインディング・オブジェクトの自動削除は行われません)。

13.6.2 データ・コントロール・パレットの使用時に行われる処理

パレットを使用してアプリケーションを作成した場合、OEPEによって次のことが実行されます。

- DataBindings.cpxファイルがプロジェクトのadfmsrc/mobileパッケージに作成され(このファイルが存在しない場合のみ)、そのページ用にエントリが追加されます。
DataBindings.cpxファイルは、アプリケーションのバインディング・コンテキストを定義します。バインディング・コンテキストはコンテナ・オブジェクトの1つで、使用可能なデータ・コントロールおよびデータ・バインディング・オブジェクトのリストを含みます。DataBindings.cpxファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。詳細は、第11.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

- META-INFディレクトリにadfm.xmlファイルが作成されます。このファイルにより、DataBindings.cpxファイルのレジストリが作成され、バインディング・コンテキストを作成できるように、実行時にアプリケーションで特定できます。

- パッケージ定義ファイルがページ定義サブパッケージに追加されます(ページに対してファイルが存在しない場合)。デフォルトのサブパッケージは、adfmsrcディレクトリにあるmobile.pageDefsです。
ページ定義ファイル(pageNamePageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのバインディング・コンテナを定義します。バインディング・コンテナでは、ページのすべてのバインディング・オブジェクトへのランタイム・アクセスが行われます。ページ定義ファイルの詳細は、第11.3.2.3.5項「生成されたドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

ヒント:
現在のバインディング・コンテナは、プログラム的なアクセス用のAdfContextからも入手できます。

- ページ定義ファイルが構成されます。この処理では、ページによって参照されるバインディング・オブジェクトの定義も追加されます。

- ページに指定のコンポーネントを追加します。
これらの事前作成済コンポーネントには、ページ定義ファイルのバインディング・オブジェクトを参照するデータ・バインディング式言語(EL)式が含まれます。詳細は、第13.3.1項「データ・バインディングEL式について」を参照してください。

- UIコンポーネントが必要とするすべてのライブラリ、ファイル、および構成要素が追加されます。データバインド・コンポーネントに必要なアーティファクトの詳細は、第2.3.2項「MAFアプリケーションを作成する場合の処理」を参照してください。

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

ページにMAFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、バインディング・コンテキストと呼ばれる単一オブジェクトを介して、アプリケーションによって管理されます。バインディング・コンテキストは、アプリケーション内のすべてのデータ・コントロールおよびページ定義のランタイム・マップ(名前付きdataでEL式#{data}を使用してアクセス可能)です。

図13-7に示すように、MAFでは、アプリケーション、DataBindings.cpxおよびページ定義ファイルからバインディング・コンテキストが作成されます。設計時に使用可能なデータ・コントロールは、すべてのDataControls.dcxファイルとワークスペース内のすべてのアプリケーション・モジュールの集合体によって定義されますが、実行時にアプリケーションで使用可能なデータ・コントロールは、DataBindings.cpxファイルで定義されます。DataBindings.cpxファイルは、アプリケーションのページで使用されているデータ・コントロールをすべて一覧表示し、ページ定義ファイルに定義されたバインディング・オブジェクトが格納されているバインディング・コンテナをWebページのURLにマップします。ページ定義ファイルは、アプリケーション・ページで使用するバインディング・オブジェクトを定義します。各ページにページ定義ファイルが1つあります。

バインディング・コンテキストには、これらのオブジェクトの実際のインスタンスは含まれていません。かわりに、マップには必要に応じてデータ・コントロールまたはバインディング・コンテナ・オブジェクトになる参照が含まれます。たとえば、オブジェクト(ページ定義など)がアプリケーションから解放されるか、タスク・フローが終了するか、リクエストの終了時にバンディング・コンテナまたはデータ・コントロールが解放されると、データ・コントロールおよびバンディング・コンテナは参照オブジェクトに戻ります。DataBindings.cpxファイルの詳細は、第11.3.2.3.5項「生成されたドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

図13-7 ファイル・バインディング・コンテキストの実行時の使用

注意:
コンポーネントを構成するときは、使用するバインディング・スタイルを十分に考慮してください。より具体的に言うと、標準的なバインディングをマネージドBeanバインディングと組み合せると、解釈を誤った動作が発生することがよくあります。これは、バインディング・インフラストラクチャとマネージドBeanインフラストラクチャとの間でクラス・インスタンスが一致する可能性が低いためです。バインディングが混在すると、UIに直接リンクされていないインスタンスの動作がコールされる場合があります。

MAFでのバインディングの操作の詳細は、次の項を参照してください。

- 第11.3.2.3.4項「生成されるバインディングに関する必知事項」

- 第11.3.2.3.6項「MAF AMXエディタ・バインディング」タブの使用方法

- 第11.3.2.3.7項「未使用のバインディングの削除に関する必知事項」

13.8 データ・コントロール属性の使用

ビジネス・サービスのデータ・コントロールを作成する際、個々のデータ・オブジェクトについて作成するデータ・コントロール構造ファイルでデータ・オブジェクトの永続属性のUIヒントを設定できます。

13.8.1 属性へのUIヒントの設定

属性のUIヒントを設定し、それらの属性を使用するすべてのUIコンポーネントでそれらの属性が一貫したローカライズ可能な方法で表示およびラベル付けされるように設定できます。UIヒントにより、属性、ラベル、ツールチップ、フィールドを自動的に送信する必要があるかどうかを表示するために使用するUIコンポーネントのタイプなどが決定されます。特定の属性を表示するか非表示にするかも決定できます。属性に対してUIヒントを作成するには、プロジェクト・エクスプローラからアクセス可能な、データ・オブジェクトのデータ・コントロール構造ファイルのデータ・コントロール・マネージャを使用します(図13-8を参照)。

UIヒントの1つに対して値が入力された属性はアイコンを使用します。

図13-8 データ・コントロール属性UIヒントの編集

UIヒントを設定する手順:

1. プロジェクト・エクスプローラで、アセンブリまたはビュー・プロジェクト・ノードを展開し、MAFノードを展開します。

2. 「データ・コントロール・マネージャ」をダブルクリックします。
> 3. 「アウトライン」の下で、mobile.Departmentを展開します。選択することで属性を編集できます。アイコンに鉛筆が載っている属性は、2つの編集可能なフィールドの1つにすでにエントリがあり、添付のイメージを参照してください。

3. エディタの「アウトライン」の下で、編集する属性を選択します。

4. 必要に応じて、「属性」を展開し、「UIヒント」を展開し、「ラベル」および「ツール・チップ・テキスト」に対応した値を入力します。

13.9 Beanデータ・コントロールの作成と使用

Beanデータ・コントロールは、Beanクラスのメタデータ・ラッパーとして機能し、データ・コントロール・オブジェクトとしてBeanのコード要素を公開します。このオブジェクトを使用して、これらのコード要素をUIコンポーネントにバインドできます。Java Beanデータ・コントロールでは、POJO (Plain Old Java Object)から自身のデータ構造を取得します。

始める前に:

データ・コントロールの一般的な知識があると役立ちます。詳細は、第13.5.1項「データ・コントロールの作成方法」を参照してください。

次のタスクを完了する必要があります。

アプリケーション・ワークスペースを作成し、データ・コントロールの基礎にするビジネス・サービスを追加します。アプリケーション・ワークスペースの作成の詳細は、第2.3項「MAFアプリケーションの作成」を参照してください。

Beanデータ・コントロールを作成する手順は次のとおりです。

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを右クリックして、OEPEのメイン・メニューから「ファイル」→「新」→「その他」を選択します。

2. 「新」ダイアログで、「Oracle」を展開し、「モバイル・アプリケーション・フレームワーク」を展開して「データ・コントロール」を選択します。「次へ」をクリックします。

図13-9 新規データ・コントロールの作成

3. ウィザードの「データ・コントロール・ソース」ページで、プロジェクトを選択して、データ・ソースJava Beanを選択します。

4. をクリックし、「データ・コントロール・ソース」ダイアログで、データ・コントロールのソースとして使用するクラスを選択します。ダイアログの「OK」をクリックして、ウィザードの「次へ」をクリックします。

5. データ・コントロールの詳細ページで、データ・コントロールのIDを入力し、「次へ」をクリックします。

6. 「サマリー」ページでデータ・コントロールの詳細を確認して、「終了」をクリックします。

注意:
JavaBeanがバックグラウンド・スレッドを使用してUI内のデータを更新する場合、手動でoracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventをコールする必要があります。flushDataChangeEventメソッドの詳細は、第13.12項「データ変更イベントについて」を参照してください。

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

MAFでは、一時変数として宣言されたJavaScript Object Notation (JSON)データBeanクラス変数にはシリアライズしません。一連のネストされたオブジェクトのシリアライズを避けるには、それらを一時オブジェクトとして定義する必要があります。この方法を使用すると、オブジェクトのネストが原因で循環オブジェクトが作成されるのを防ぐこともできます。

次のシナリオを考えてみましょう。Employeeオブジェクトが、その子として従業員の上司を表すEmployeeオブジェクトを保持しているとします。その子を一時オブジェクトとして宣言しなかった場合、実行時に子のEmployeeオブジェクトを計算しようとすると、一連のネストされたシリアライズ・オブジェクトが作成されます。

JavaオブジェクトをJSONオブジェクトにシリアライズおよびシリアライズ解除するには、JSONBeanSerializationHelperクラスを使用します。JSONBeanSerializationHelperクラスを使用すると、独自のカスタムJSONシリアライズおよびシリアライズ解除を実装できます。また、このクラスでは、JSONシリアライズ(およびシリアライズ解除)処理後にJSONオブジェクトを変更するためのフックが提供されます。JSONBeanSerializationHelperクラスはGenericTypeSerializationHelperクラスに似ており、REST Webサービス内で、GenericTypeオブジェクトのシリアライズおよびシリアライズ解除に使用できます。詳細は、Oracle Mobile Application Framework Java APIリファレンスの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();

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

MAFでは、アプリケーション内でDeviceFeaturesデータ・コントロールを通じて使用できるデバイス固有の機能が公開され、DeviceFeaturesデータ・コントロールは、新しいMAFアプリケーションを作成するときにデータ・コントロール・マネージャに表示されるコンポーネントです。Cordova Java APIは、このデータ・コントロールを通じて抽象化され、これにより、MAF AMXとして実装されたアプリケーション機能から、デバイスに埋め込まれた様々なサービスにアクセスできるようになります。DeviceFeaturesデータ・コントロールから提供される操作をMAF AMXページ内にドラッグ・アンド・ドロップすることによって、デバイスに格納されたユーザーのコンタクト先を管理する機能の追加、電子メール・メッセージとSMSテキスト・メッセージの両方の作成と送信、デバイスの位置の確認、デバイスのカメラの使用およびデバイスのファイル・システムに格納されたイメージの取得を行うことができます。次の項では、これらの操作を宣言的に使用する方法や、JavaコードとJavaScriptを使用して実装する方法など、各操作について詳しく説明します。

図13-10 エディタでのMAF DeviceFeaturesデータ・コントロール

MAFアプリケーション・テンプレートを使用してアプリケーションを作成すると、自動的にDeviceFeaturesデータ・コントロールがデータ・コントロール・マネージャに表示されます。図13-10は、データ・コントロール・マネージャでのDeviceFeaturesデータ・コントロールを示しています。次のメソッドを使用できます。

- addLocalNotification

- cancelLocalNotification

- createContact

- displayFile

- findContacts

- getPicture

- removeContact

- sendEmail

- sendSMS

- startLocationMonitor

- updateContact

ページを作成したら、DeviceFeaturesデータ・コントロール・メソッド(またはそれらのメソッド内にネストされたその他のオブジェクト)をパレットからMAF AMXビューにドラッグして、関連する機能にバインドされたコマンド・ボタンやその他のコンポーネントを作成できます。デフォルトのバインディングを受け入れるか、ELを使用してそれらのバインディングを変更できます。また、JavaScriptやJavaを使用して、機能を実装または構成することもできます。MAFアプリケーションにデータ・コントロールを含める方法の詳細は、第11.3.2項「MAF AMXページへのUIコンポーネントおよびデータ・コントロールの追加方法」を参照してください。

DeviceManagerは、デバイスの機能へのアクセスを可能にするオブジェクトです。このオブジェクトのハンドルは、DeviceManagerFactory.getDeviceManagerをコールすることによって取得できます。次の項では、DeviceManagerオブジェクトを使用してgetPictureやcreateContactなどのメソッドを起動する方法について説明します。

ネットワーク・アクセスを除き、すべてのApache Cordova対応デバイス機能へのアクセスは、MAFアプリケーションの場合デフォルトでは有効になっていません。DeviceFeaturesデータ・コントロールによって公開されている操作が実行時に正常に機能するには、関連するプラグインがMAFアプリケーションで有効になっている必要があります。たとえば、DeviceFeaturesデータ・コントロールのsendSMS操作を使用する場合は、MAFアプリケーションでSMSプラグインを有効にする必要があります。プラグインは手動で有効にするか、MAFアプリケーションで関連するプラグインが有効になっていない操作をドラッグ・アンド・ドロップしたときにOEPEによって表示されるダイアログで該当するオプションを選択して有効にすることができます。たとえば、まだSMSプラグインが有効になっていないMAFアプリケーションのMAF AMXページにsendSMS操作をドラッグ・アンド・ドロップすると、OEPEによって図13-11のダイアログが表示されます。

図13-11 DeviceFeaturesデータ・コントロールの操作用プラグインの有効化

操作に必要なプラグインが有効になっていない場合、MAF AMXページのソース・ファイル内に警告メッセージが表示されます。たとえば、MAFアプリケーションでSMSプラグインが有効になっていないと仮定しましょう。MAF AMXページの、アプリケーションがsendSMS操作を起動する箇所に、図13-12に示した警告メッセージが表示されます。この問題を解決するには、第9章「MAFアプリケーションでのプラグインの使用方法」の説明に従って、プラグインを手動で有効にします。

図13-12 DeviceFeaturesデータ・コントロールの操作に必要なプラグイン

13.10.1 撮影を有効にするためのgetPictureメソッドの使用方法

DeviceFeaturesデータ・コントロールにはgetPictureメソッドが含まれており、このメソッドを使用すると、MAFアプリケーションはデバイスのカメラとフォト・ライブラリを活用することができ、エンド・ユーザーが写真を撮影したり、既存のイメージを取得できるようになります。この項の最後の方に3つの例があります。最初の例は、エンド・ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaScriptコードを示しています。2番目と3番目の例は、エンド・ユーザーが写真を撮影したり、保存済イメージを取得することを可能にするJavaコードを示しています。getPictureメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスの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メソッドによって戻された場合、ファイルのサイズを求めるために使用する前に、問合せパラメータを削除する必要があります。次に例を示します。
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. 「パレット」→「データ」タブ→「データ・コントロール」を選択して、ここからgetPicture操作をドラッグし、ボタンとしてページにドロップします(図13-13を参照)。

図13-13 getPicture操作のカスタマイズ

ユーザーがよりきめ細かく制御できるようにするには、getPicture操作をパラメータ・フォームとしてドロップします。これにより、エンド・ユーザーは写真を撮影したり既存のイメージを選択する前に、設定を指定できるようになります。

2. アクションの編集ダイアログで、前述のすべてのパラメータの値を設定します。イメージがファイル名として戻されるように、destinationType = 1を指定するようにします。

3. getPictureの戻り値をドラッグして、「イメージ」としてページにドロップします。

4. 「共通コンポーネント」パネルで、「コンポーネント・パレット」から「イメージ」をドラッグし、ページ上にドロップします。

図13-14は、エンド・ユーザーのフォト・ライブラリからイメージを表示するためのバインディングを示しています。

図13-14 デザインタイムでフォト・ライブラリからイメージを表示するためのバインディング

このアプリケーションを実行すると、イメージ・チューザが自動的に表示され、エンド・ユーザーは表示するイメージを選択できます。イメージ・チューザが自動的に表示される理由は、イメージ・コントロールが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);

13.10.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が表示されます。

図13-15は、ページ上の編集可能なフォームを使用してSMSを送信するためのバインディングを示しています。

図13-15 デザインタイムで編集可能なフォームを使用してSMSを送信するためのバインディング

次の各例は、エンド・ユーザーがデバイスのテキスト・メッセージング・インタフェースを使用してSMSメッセージを送信することを可能にするコード例を示しています。

sendSMSメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項およびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

sendSMSのJavaScriptコード・サンプル。

adf.mf.api.sendSMS({to: "5551234567", body: "This is a test message"});

sendSMSの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");

13.10.3 電子メールを有効にするためのsendEmailメソッドの使用方法

DeviceFeaturesデータ・コントロールにはsendEmailメソッドが含まれており、このメソッドを使用すると、MAFアプリケーションではデバイスの電子メール・メッセージング・インタフェースを活用し、エンド・ユーザーが電子メール・メッセージを送受信できるようにすることが可能です。MAFでは、デバイスの電子メール・インタフェースを表示し、必要に応じて次のフィールドに事前にデータを移入できます。

- to: 受信者をリストします(カンマ区切り)。

- cc: CC受信者をリストします(カンマ区切り)。

- subject: メッセージの件名を追加します。

- body: メッセージの本文を追加します。

- bcc: BCC受信者をリストします(カンマ区切り)。

- attachments: 電子メールに添付するファイルの名前をリストします(カンマ区切り)。

- mimeTypes: 添付ファイルに使用するMIMEタイプをリストします(カンマ区切り)。MAFで自動的にMIMEタイプを決定するには、nullを指定します。この項の最後にある2つの例のように、選択した添付ファイルのMIMEタイプのみを指定することもできます。

デバイスの電子メール・インタフェースが表示されたら、ユーザーは電子メールを送信するか、それを取り消すことができます。デバイスとキャリアの制限により、電子メールは自動的に送信できません。実際に電子メールを送信できるのは、エンド・ユーザーのみです。また、電子メールを送信するには、デバイスに1つ以上の電子メール・アカウントが構成されている必要があり、アカウントが構成されていない場合、電子メール・アカウントが見つからないことを示すエラーが表示されます。

注意:
sendEmailメソッドのタイムアウト値は5分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

注意:
Androidでは、エンド・ユーザーが電子メールの編集中にアプリケーションから離れ、その後戻ってきたときには、もはや電子メール編集画面にはなっていません。かわりに、メッセージを下書きとして保存すると、手動で選択して編集を続行できます。

DeviceFeaturesデータ・コントロールを使用してsendEmail操作をカスタマイズするには:

OEPEで、sendEmail操作をパレットのDeviceFeaturesデータ・コントロールからページ・デザイナにドラッグし、パラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスの電子メール・インタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに事前に値が移入され、送信準備が整った電子メールが表示されます。

図13-16は、ページ上の編集可能なフォームを使用して電子メールを送信するためのバインディングを示しています。

図13-16 デザインタイムで編集可能なフォームを使用して電子メールを送信するためのバインディング

次の各例は、エンド・ユーザーがデバイスの電子メール・インタフェースを使用して電子メール・メッセージを送信することを可能にするコード例を示しています。

sendEmailメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項およびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

sendEmailの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.

sendEmailの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");

13.10.4 コンタクト先の作成を有効にするためのcreateContactメソッドの使用方法

DeviceFeaturesデータ・コントロールにはcreateContactメソッドが含まれており、これにより、MAFアプリケーションでは、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーが新しいコンタクト先を作成してデバイスのアドレス帳に保存できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてContactのフィールドに事前にデータを移入できます。この項の最後にある3つの例のうちの2番目の例のように、createContactメソッドはContactオブジェクトをパラメータとして使用し、作成されたContactオブジェクトを戻します。

createContactメソッドおよびContactオブジェクトの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項およびCordovaのドキュメント(http://cordova.apache.org)を参照してください。Contactのプロパティの詳細は、第13.10.5項「コンタクト先の検索を可能にするfindContactsメソッドの使用方法」も参照してください。

注意:
createContactメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

注意:
null Contactオブジェクトがメソッドに渡された場合、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してcreateContact操作をカスタマイズするには:

1. OEPEで、createContact操作をパレットのDeviceFeaturesデータ・コントロールからドラッグし、リンクまたはボタンとしてページ・デザイナにドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、createContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、JavaBeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してcreateContact操作を実行できます。次の例は、Contactオブジェクトを作成するためのマネージドBeanコードの例を示しています。

2. パレットのcreateContact操作の下からContact戻りオブジェクトをドラッグして、フォームとしてページにドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。createContact操作を実行すると、結果がこのフォームに表示されます。

次の例は、Contactオブジェクトを作成するためのマネージドBeanコードを示しています。

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);

13.10.5 コンタクト先の検索を有効にするためのfindContactsメソッドの使用方法

DeviceFeaturesデータ・コントロールにはfindContactsメソッドが含まれており、これにより、MAFアプリケーションは、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳から1つ以上のコンタクト先を検索できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてfindContactsのフィールドに事前にデータを移入できます。findContactsメソッドでは、フィルタ文字列と検索する(そして、見つかったコンタクト先の一部として戻す)フィールド名のリストを使用します。フィルタ文字列には、コンタクト先内の検索する任意の項目を指定できます。findContactsメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスの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. OEPEで、findContacts操作をパレットのDeviceFeaturesデータ・コントロールからドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナにドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、findContacts操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してfindContacts操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが前述のContactの様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してfindContacts操作を実行できます。

2. パレットのfindContacts操作の下からContact戻りオブジェクトをドラッグして、フォームとしてページにドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。findContacts操作を実行すると、結果がこのフォームに表示されます。

最初の例は、findContactsメソッドに指定できる引数値を示しています。2番目と3番目の例は、姓でコンタクト先を検索し、コンタクト先の名前、電話番号、電子メール、住所およびメモを取得する方法を示しています。

次の例は、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としてメソッドに渡された場合、例外がスローされます。

次の例は、findContactsの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);
}

次の例は、findContactsの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);

13.10.6 コンタクト先の更新を有効にするためのupdateContactメソッドの使用方法

DeviceFeaturesデータ・コントロールにはupdateContactメソッドが含まれており、これにより、MAFアプリケーションでは、コンタクト先を管理するためにデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳に含まれるコンタクト先を更新できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてupdateContactのフィールドに事前にデータを移入できます。この項の最後にある3つの例のうちの2番目の例のように、updateContactメソッドはContactオブジェクトをパラメータとして使用し、更新されたContactオブジェクトを戻します。

updateContactメソッドおよびContactオブジェクトの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項およびCordovaのドキュメント(http://cordova.apache.org)を参照してください。Contactのプロパティの詳細は、第13.10.5項「コンタクト先の検索を可能にするfindContactsメソッドの使用方法」も参照してください。

注意:
入力パラメータとして必要なContactオブジェクトは、第13.10.5項「コンタクト先を検索するfindContactsメソッドの使用方法」で説明するように、findContactsメソッドを使用して検索できます。null Contactオブジェクトがメソッドに渡されると、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してupdateContact操作をカスタマイズするには:

1. OEPEで、パレットのDeviceFeaturesデータ・コントロールからupdateContact操作をドラッグし、リンクまたはボタンとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、updateContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、JavaBeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してupdateContact操作を実行できます。第13.10.4項「コンタクト先の作成を有効にするためのcreateContactメソッドの使用方法」の最初の例は、Contactオブジェクトを作成するためのマネージドBeanコードの例を示しています。

2. パレットのupdateContact操作の下からContact戻りオブジェクトをドラッグして、フォームとしてページにドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。updateContact操作を実行すると、結果がこのフォームに表示されます。

次の最初の例と3番目の例は、コンタクト先の電話番号を更新する方法を示しています。次の2番目と4番目の例は、コンタクト先に別の電話番号を追加する方法を示しています。

次の例は、updateContactのJavaScriptを示しています。

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);

次の例は、updateContactを使用して電話番号を追加するJavaScriptコードで、既存の電話番号に別の電話番号を追加する方法を示しています。

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);
}

次の例は、updateContactのJavaコードで、コンタクト先の電話番号、電子メール・タイプおよび郵便番号を更新する方法を示しています。

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]);

次の例は、updateContactを使用して電話番号を追加するJavaコードで、既存の電話番号に別の電話番号を追加する方法を示しています。

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分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

13.10.7 コンタクト先の削除を有効にするためのremoveContactメソッドの使用方法

DeviceFeaturesデータ・コントロールにはremoveContactメソッドが含まれており、これにより、MAFアプリケーションでは、コンタクト先を管理するためのデバイスの・インタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳からコンタクト先を削除できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてremoveContactのフィールドに事前にデータを移入できます。この項の最初の例のように、removeContactメソッドはContactオブジェクトをパラメータとして使用します。

注意:
入力パラメータとして必要なContactオブジェクトは、第13.10.5項「コンタクト先の検索を有効にするためのfindContactsメソッドの使用方法」に説明するように、findContactsメソッドを使用して検索できます。

DeviceFeaturesデータ・コントロールを使用してremoveContact操作をカスタマイズするには:

1. OEPEで、removeContact操作をパレットのDeviceFeaturesデータ・コントロールからドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナにドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、removeContact操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してremoveContact操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なContactのフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してremoveContact操作を実行できます。

2. パレットのremoveContact操作の下からContact戻りオブジェクトをドラッグして、フォームとしてページにドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。removeContact操作を実行すると、結果がこのフォームに表示されます。

次の各例は、findContactsを使用して検索したコンタクト先を削除する方法を示しています。removeContactメソッドおよびContactオブジェクトの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項およびCordovaのドキュメント(http://cordova.apache.org)を参照してください。

注意:
Androidでは、removeContact操作を実行しても完全にはコンタクト先が削除されません。removeContactメソッドをコールしてコンタクト先を削除すると、「(不明)」の付いた名前がアプリケーション内のコンタクト先リストに表示されます。

次の例は、removeContactのJavaScriptを示しています。

// Remove the contact from the device
contact.remove(onSuccess,onError);

function onSuccess()
{
alert("Removal Success");
}

function onError(contactError)'
{
alert("Error = " + contactError.code);
}

次の例は、removeContactのJavaコードを示しています。

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分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

13.10.8 地理的位置を有効にするためのstartLocationMonitorメソッドの使用方法

DeviceFeaturesデータ・コントロールにはstartLocationMonitorメソッドが含まれており、これにより、MAFアプリケーションは、デバイスの場所を取得および追跡するためにデバイスの地理的位置情報サービスを活用できます。MAFでは、デバイスのインタフェースを表示し、必要に応じてstartLocationMonitorのフィールドに事前にデータを移入できます。

MAFで公開されているAPIを使用すると、デバイスの現在の位置を取得できるため、特定の時点におけるデバイスの現在の位置を取得したり、定期的にその情報をサブスクライブできます。この項の最後にある例は、アプリケーションでデバイスの位置の取得を可能にするコード例を示しています。startLocationMonitorメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項およびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

注意:
altitudeAccuracyプロパティは、Androidデバイスではサポートされていません。
iOSと比べて、Androidプラットフォームでは更新は頻繁には実行されません。

DeviceFeaturesデータ・コントロールを使用してデバイスの位置の変更をリスニングするには:

OEPEで、startLocationMonitor操作をパレットのDeviceFeaturesデータ・コントロールからドラッグし、リンクまたはボタンとしてページ・デザイナにドロップします。「アクションの編集」ダイアログで入力を要求されたら、次のリストまたはOracle Mobile Application Framework Java APIリファレンスでDeviceDataControlクラスの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を使用してデバイスの位置の変更をサブスクライブする方法を示しています。このメソッドが受け取るパラメータの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

JavaScriptを使用してデバイスの位置の変更をサブスクライブする方法の例は、Cordovaのドキュメント(http://cordova.apache.org/)を参照してください。

locationListenerによって指定されたコールバック関数内に戻されるパラメータは、次のとおりです。

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メソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項およびCordovaのドキュメント(http://cordova.apache.org)を参照してください。

次の例は、DeviceManager.getCurrentPositionを使用してデバイスの現在位置を(1回)取得する方法を示しています。このメソッドが受け取るパラメータの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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());

13.10.9 ファイルの表示を有効にするためのdisplayFileメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるdisplayFileメソッドを使用すると、デバイスのローカル・ファイルを表示できます。プラットフォームに応じて、アプリケーション・ユーザーはPDF、イメージ・ファイル、Microsoft Officeドキュメントおよびその他の様々なファイル・タイプを表示できます。iOSでは、アプリケーション・ユーザーは、サポートされているファイルをMAFアプリケーション内でプレビューできます。またユーザーは、それらのファイルをサードパーティ・アプリケーションで開く、電子メールで送信する、プリンタに送信するなどの操作を行うこともできます。Androidでは、すべてのファイルがサードパーティ・アプリケーション内で開かれます。つまり、アプリケーション・ユーザーは、ファイルを表示しながらMAFアプリケーションから離れることができます。ユーザーは、Androidの戻るボタンを押すことによって、MAFアプリケーションに戻ることができます。所定のファイルを開くことができるアプリケーションがデバイス内に存在しない場合は、エラーが表示されます。displayFileメソッドがiOSデバイスとAndroidデバイスの両方でファイルを開く例の詳細は、DeviceDemoサンプル・アプリケーションを参照してください。このアプリケーションを使用するには、「ファイル」→「新」→「MAFサンプル」を選択します。

displayFileメソッドの機能は、デバイスのローカル・ファイルを表示することのみです。つまり、リモート・ファイルは最初にダウンロードする必要があります。ダウンロードしたファイルを保存する必要のあるディレクトリ・ルートに戻るには、コールAdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory)を使用します。iOSでは、この場所はアプリケーションによって異なりますが、Androidでは、この場所として外部ストレージ・ディレクトリが参照されます。この外部ストレージ・ディレクトリは公的にアクセス可能であるため、サードパーティ・アプリケーションを使用して、そこに格納されているファイルを読み取ることができます。

表13-6 サポートされるファイル・タイプ

iOS

Android

サポートされるファイル・タイプの詳細は、Apple iOS開発サイト(http://developer.apple.com/library/ios/navigation/)にある、Quick Lookプレビュー・コントローラに関するドキュメントを参照してください。

特定のMIMEタイプがデバイスにインストールされている場合、このフレームワークによって、そのタイプに関連付けられたビューアが起動されます。特定のファイル・タイプを表示するためのフレームワークは組み込まれていません。そのファイル・タイプを処理できるアプリケーションがデバイスにインストールされていない場合は、MAFアプリケーションによってエラーが表示されます。

iWorkドキュメント

Microsoft Officeドキュメント(Office 97以降)

リッチ・テキスト・フォーマット(RTF)ドキュメント

PDFファイル

イメージ

Uniform Type Identifier (UTI)がpublic.text typeに準拠しているテキスト・ファイル

カンマ区切り(csv)ファイル

DeviceFeaturesデータ・コントロールを使用してdisplayFile操作をカスタマイズするには:

1. OEPEで、displayFile操作をパレットのDeviceFeaturesデータ・コントロールからドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナにドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、displayFile操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してdisplayFile操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してdisplayFile操作を実行できます。

次の2つの例は、displayFileメソッドを使用してファイルを表示する方法を示しています。displayFileメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。

displayFileのJavaコードを示した例。

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());
}

13.10.10 addLocalNotificationメソッドとcancelLocalNotificationメソッドを使用してローカル通知を管理する方法

DeviceFeaturesデータ・コントロールには、addLocalNotificationメソッドとcancelLocalNotificationメソッドが含まれており、これらのメソッドによって、MAFアプリケーションは、通知を管理するためにデバイスのインタフェースを利用できるようになり、エンド・ユーザーはローカル通知のスケジュールや取消しを行うことができます。

addLocalNotificationおよびcancelLocalNotificationメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。コード例を含むローカル通知の管理の詳細は、第24.3項「ローカル通知の管理」を参照してください。通知の全般情報は、第24.1項「通知の概要」を参照してください。

LocalNotificationDemoサンプル・アプリケーションでは、MAFアプリケーション内でローカル通知のスケジュールおよび受信を行う方法の例が提供されます。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

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

アプリケーションには、特定のデバイスの特性や機能に依存する機能が含まれる場合があります。たとえば、デバイスの画面の向きによって異なるユーザー・インタフェースを提示したり、デバイスで地理的位置がサポートされる場合のみマッピング機能を有効にすることなどが考えられます。MAFでは、このような動的な動作をサポートするために、Java、JavaScriptおよびELからアクセスできる様々なプロパティが用意されています。表13-7に、これらのプロパティをリストし、問合せ方法、予期される戻り値およびアプリケーションのライフサイクル中にそのプロパティが変更される可能性があるかどうかに関する情報も提供します。この項の最後にある例は、JavaScriptを使用してこれらのプロパティにアクセスする方法の例を示しています。

注意:
デバイス・プロパティのタイムアウト値は、1分に設定されています。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

表13-7 デバイス・プロパティと対応する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>

13.11 属性の検証

モバイル・アプリケーション・フレームワークでは、バインディング属性で検証ルールが設定された状態で、データ・コントロール・レイヤーで検証が実行されます。属性の検証は、バインディングに対するsetValue操作中に、システム内の単一点で実行されます。

データ・コントロールによって公開される属性に対して、次のバリデータを定義できます。

- 比較バリデータ

- 長さバリデータ

- リスト・バリデータ

- 範囲バリデータ

特定の属性に対してすべてのバリデータが実行され、成功しないすべてのバリデータに対してネストされた例外がスローされます。属性の検証メッセージを定義し、実行時に検証ルールを起動するときに表示できます。詳細は、第12.9項「入力の検証」を参照してください。

注意:
JSONの制限により、BigDecimalが保持できる値はDoubleの範囲内となり、BigIntegerが保持できる値はLongの範囲内となります。許可された値よりも大きい数値を使用するには、toStringをBigDecimalまたはBigIntegerでコールし、値をStringとしてシリアライズ(解除)します。

表13-8に、長さバリデータでサポートされる検証の組合せをリストします。

表13-8 長さの検証

比較タイプ

バイト

文字

Equals

サポート対象

サポート対象

Not Equals

サポート対象

サポート対象

Less Than

サポート対象

サポート対象

Greater Than

サポート対象

サポート対象

Less Than Equal To

サポート対象

サポート対象

Greater Than Equal To

サポート対象

サポート対象

Between

サポート対象

サポート対象

表13-9と表13-10に、範囲バリデータでサポートされる検証の組合せをリストします。

表13-9 範囲検証

比較タイプ

バイト

Char

Double

Float

Integer

Long

Short

Between

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

Not Between

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

表13-10 範囲検証: math、sqlおよびutilパッケージ

比較タイプ

java.math.BigDecimal

java.math.BigInteger

java.sql.Date

java.sql.Time

java.sql.Timestamp

java.util.Date

Between

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

Not Between

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

表13-11に、リスト・バリデータでサポートされる検証の組合せをリストします。

表13-11 リスト検証

比較タイプ

String

In

サポート対象

Not In

サポート対象

表13-12と表13-13に、比較バリデータでサポートされる検証の組合せをリストします。

表13-12 比較検証

比較タイプ

バイト

Char

Double

Float

Integer

Long

Short

String

Equals

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

Not Equals

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

Less Than

サポート対象外

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

Greater Than

サポート対象外

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

Less Than Equal To

サポート対象外

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

Greater Than Equal To

サポート対象外

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

表13-13 比較検証: 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

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

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

データ変更イベントを単純化するために、OEPEではプロパティ変更リスナー・パターンを使用します。多くの場合、OEPEを使用して、Beanのプロパティ・アクセッサから通知をソースとして参照するために必要なコードを生成でき、これを行うには、「アクセサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します(詳細は第13.3.5.2項「マネージドBeanカテゴリについて」を参照)。PropertyChangeSupportオブジェクトが自動的に生成され、新たに生成されたsetterメソッドにfirePropertyChangeへのコールが含まれます。また、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドが追加されるため、プロパティ変更リスナーは、このオブジェクトを使用して自身を登録および登録解除できます。これを使用してフレームワークはクライアント・キャッシュにプッシュする変更を取得し、データが変更されたことをユーザー・インタフェース・レイヤーに通知します。

注意:
PropertyChangeSupportオブジェクトを手動でクラスに追加する場合は、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドも(これらの明示的なメソッド名を使用して)含める必要があります。

プロパティ変更のみでは、すべてのデータ変更通知は解決されません。たとえば、データ・コントロールによってラップされたBeanがあり、アイテムのコレクションの公開が必要な場合が考えられます。リストの個々のアイテムが変更されたときはプロパティ変更で十分ですが、カーディナリティが変更されたときは十分ではありません。この場合、コレクション全体のプロパティ変更を起動すると、パフォーマンスが低下する可能性があるため、かわりにコレクションのデルタのみを更新します。これを行うには、ProviderChangeSupportクラスを使用して、単純なプロパティ変更に必要なデータよりも多くのデータを公開する必要があります。

注意:
ProviderChangeSupportオブジェクトは、自動的には生成されません。このオブジェクトは、手動でaddProviderChangeListenerおよびremoveProviderChangeListenerメソッドとともに(これらの明示的なメソッド名を使用して)クラスに追加する必要があります。

プロバイダ変更は、データ・コントロールによってラップされたBeanで公開されている動的なコレクションを保持しているときのみ必要になるため、起動するプロバイダ変更イベントは、次のいくつかのタイプのみになります。

- fireProviderCreate: 新しい要素をコレクションに追加する場合

- fireProviderDelete: 要素をコレクションから削除する場合

- fireProviderRefresh: 同時に複数の変更をコレクションに加え、単純にクライアントにコレクション全体のリフレッシュを要求した方がよいと判断した場合(これは一括操作でのみ使用する必要があります)

ProviderChangeSupportクラスは、コレクション要素に関連する通知を送信するために使用され、これによって、JavaBeanデータ・コントロール内で変更が発生したときにコンポーネントを適切に更新できます。このクラスが従うパターンは、自動的に生成されるPropertyChangeSupportクラスと似ていますが、ProviderChangeSupportとともに使用されるイベント・オブジェクトでは、操作のタイプや変更された要素のキーと位置などの詳細情報を送信します。ProviderChangeSupportでは、コレクションに対する要素(プロバイダ)の追加や削除など、コレクションに対する構造的な変更を取得します。PropertyChangeSupportでは、コレクション内の個々のアイテムに対する変更を取得します。

次の例は、ProviderChangeSupportを使用して、コレクションの要素に対する構造的な変更(子を追加または削除する場合など)に関する通知を送信する方法を示しています。ProviderChangeListenerインタフェースおよびProviderChangeEventクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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;

/* --- OEPE 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レイヤーからのレスポンス・メッセージや戻り値とともに、クライアントに(キャッシュするために)戻されます。これにより、OEPEでは次が可能です

ユーザー・インタフェースに対してリフレッシュするイベントと更新の数を減らし、可能なかぎりフレームワークの効率を上げることができます。

ただし、バックグラウンド・スレッドで実行時間の長い処理(Webサービスの相互作用、データベースの相互作用、コストのかかる計算など)に対処し、ユーザー・アクションに依存しないユーザー・インタフェースへの通知を行うことが必要になる場合もあります。AMXページのデータを更新して、値が変更されたデータ・フィールドの現在の値を反映させる場合、AdfmfJavaUtilities.flushDataChangeEventをコールして現在キューに入っているデータ変更をクライアントに強制することによって、AMXページ全体のリロードによるパフォーマンスの低下を回避できます。

注意:
flushDataChangeEventメソッドは、バックグラウンド・スレッドからのみ実行できます。

次の例は、flushDataChangeEventメソッドを使用して保留中のデータ変更をクライアントに強制する方法を示しています。oracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventの詳細は、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 OEPE 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;

/* --- OEPE 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;

/* --- OEPE 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を使用してデータ変更をユーザー・インタフェースに反映する方法の例を示します。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

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

この章では、構成サービスを使用して、MAFアプリケーションで使用するエンド・ポイントを構成する方法について説明します。

この章には次の項が含まれます:

- 第14.1項「エンド・ポイントの構成の概要」

- 第14.2項「構成サービス・エンド・ポイントの定義」

- 第14.3項「構成サービス用のユーザー・インタフェースの作成」

- 第14.4項「URLの構造について」

- 第14.5項「サーバーでの構成サービスの設定」

14.1 エンド・ポイントの構成の概要

構成サービスは、Webサービス、ログイン・ユーティリティ、MAFアプリケーションのその他の部分によって使用されるエンド・ポイントを構成できるツールです。

注意:
ユニバーサルWindowsプラットフォーム上のMAFアプリケーションは、構成サービスの使用をサポートしていません。

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

エンド・ポイント(またはシード) URLはconnections.xmlファイルで定義され、新しい接続エントリをそのファイルに追加する必要があります。新しい接続は、HttpURLConnection型で、url値が構成サーバー・エンド・ポイント(またはシード) URLを指し、nameが最終的にJavaBeanコードで参照される任意の値に設定されている必要があります。

次の例は、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値をオーバーライドできます(例14-1を参照)。

例14-1 接続定義のオーバーライド

AdfmfJavaUtilities.clearSecurityConfigOverrides(<ConfigService_ConnectionName>);
AdfmfJavaUtilities.overrideConnectionProperty(<ConfigService_ConnectionName>, "urlconnection",
"url", <ConfigService_EndpointURL>);

// 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>);

// Final step is to apply the changes.
AdfmfJavaUtilities.updateApplicationInformation(false);

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

構成サービスのユーザー・インタフェースが必要な場合は、新規または既存のアプリケーション機能内に作成する必要があります。

MAFでは、oracle.adfmf.config.client.ConfigurationServiceクラス内で一連のAPIが提供され、サーバー上の新しい変更を確認して更新内容をダウンロードできます。Java BeanでこれらのAPIを使用して、構成サービスのアプリケーション機能を介してそれぞれのメソッドをアクティブ化できます。

次のAPIの一覧とその使用例では、_configservice変数はoracle.adfmf.config.client.ConfigurationServiceクラスのインスタンスを表しています。

- setDeliveryMechanismメソッドは構成サービスの配信メカニズムを設定します。旧リリースの構成サービスとの通信はHTTPを使用することで可能になるので、このメソッドの引数としてhttpが渡されます。

_configservice.setDeliveryMechanism("http");

注意:
メソッドの引数は構成サービスに使用するWebトランスポートを参照するため、HTTPまたはHTTPSと混同しないでください。エンド・ポイントがHTTPS URLの場合でも、トランスポートをhttpに設定することはできます。

- setDeliveryMechanismConfigurationメソッドは、構成サービスに追加の属性を設定し、構成サーバー接続とエンド・ポイントURLを関連付けできます。

_configservice.setDeliveryMechanismConfiguration("connectionName",
"ConfigServerConnection");
_configservice.setDeliveryMechanismConfiguration("root", <Endpoint_URL);

- 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を使用して構成サーバーと通信する方法を示しています。詳細は、付録E「サンプルのMAFアプリケーション」を参照してください。

oracle.adfmf.config.client.ConfigurationServiceクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

14.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

14.5 サーバーでの構成サービスの設定

構成サービスは、HTTP GETリクエストを受け入れてconnections.xmlファイルを返すサービスとして実装できます。

構成サービス・クライアントによって使用されるURLの形式は、次のとおりです。

url configured in /connections.xml

構成サービスのエンド・ポイントは、HTTPおよびHTTPSを経由する基本認証(BASIC_AUTH)を使用して保護できます。

15 MAFアプリケーションでのWebサービスの使用方法

この章では、MAFアプリケーションからREST Webサービスにアクセスする方法について説明します。

この章には次の項が含まれます:

- 第15.1項「MAFアプリケーションでのWebサービス使用の概要」

- 第15.2項「WebサービスにアクセスするためのRESTサービス・アダプタの作成」

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

- 第15.4項「ブラウザ・プロキシ情報の構成」

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

MAFは、MAFアプリケーションにおけるJSONオブジェクトを使用したREST Webサービス(REST-JSON)の消費をサポートしています。MAFでこのタイプのWebサービスが他のWebサービスよりも推奨される理由は、REST-JSON Webサービスが生成するペイロードが通常は少ないため、アプリケーションと、アプリケーションがアクセスするサービスとの間の通信のレスポンス時間が短くなるからです。

MAFアプリケーションでREST-JSON Webサービスを使用する場合は、WebサービスのURLエンド・ポイントへの接続をアプリケーションで構成する必要があります。MAFは、このエンド・ポイントをアプリケーションのconnections.xmlファイルに格納します。また、connections.xmlに構成した値をとるアダプタ(RESTServiceAdapter)を記述し、それを使用して、Webサービスに送信するリクエストURIを構築します。Webサービスが返すデータをモデル化するJavaクラスを記述する必要もあります。これらのクラスを使用して、WebサービスがアクセスするデータにアプリケーションのAMXページをバインドするデータ・コントロールを生成します。アプリケーションが保護されたWebサービスにアクセスする場合は、そのWebサービスのURLエンド・ポイントへの接続にセキュリティ・ポリシーを関連付ける必要があります。アプリケーションが、企業ファイアウォール外部でホストされているサービスにアクセスする必要がある場合は、アプリケーションのmaf.propertiesファイル(assembly_project/META-INFにあります)にエントリを構成することが必要になる場合もあります。

WorkBetterサンプル・アプリケーションは、RESTServiceAdapterを使用してRESTサービスをプログラムで消費する例を示します。WorkBetterサンプル・アプリケーションのソース・コードにアクセスする方法の詳細は、付録E「サンプルのMAFアプリケーション」を参照してください。

15.2 WebサービスにアクセスするためのRESTサービス・アダプタの作成

RESTサービス・アダプタRestServiceAdapterを使用して、RESTコールにより送信されたデータにアクセスし、Webサービス操作の実行をトリガーします。oracle.maf.api.dc.ws.restパッケージからのRestServiceAdapterFactory.createRestServiceAdapter() APIは、RestServiceAdapterを実装するアダプタを作成します。

サービスのURLエンド・ポイントへの接続がconnections.xmlファイルに存在することを確認し、次の例で示すようにコードをBeanクラスに追加します。

Mobile Cloud Serviceに診断情報を送信するアダプタを作成する場合は、第30.8項「Oracle Mobile Cloud Serviceへの診断情報の送信」の説明に従って、RestServiceAdapterFactory.createMcsRestServiceAdapter() APIを使用します。

RestServiceAdapterFactoryおよびRestServiceAdapterの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

....
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;
....
RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter restServiceAdapter = factory.createRestServiceAdapter();

// Clear any previously set request properties, if any
restServiceAdapter.clearRequestProperties();

// Set the connection name
restServiceAdapter.setConnectionName("RestServerEndpoint");

// Specify the type of request
restServiceAdapter.setRequestMethod(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.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestMethod(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.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestMethod(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.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestMethod(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.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)

これらのメソッドは、RestServiceAdapterのsendメソッドおよびsendReceiveメソッドと同じ機能を実現しつつ、接続をカスタマイズする機会と、リクエストを送信し、レスポンスを受信するというプロセスを提供します。

次の例では、指定されたリクエスト・メソッド、リクエストおよびHTTPヘッダー値を使用して、HttpConnectionを初期化して返しています。また、資格証明ストアから基本認証をリクエスト・ヘッダーに挿入し、入力ストリームを取得し、接続を閉じます。

....
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;
....

RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter restServiceAdapter = factory.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.2.2 非テキスト・レスポンスのサポート

Webサービス・コールから受け取ったバイナリ(非テキスト)レスポンスを処理するには、RestServiceAdapterを使用できます。これらのレスポンスには、PDFファイルやビデオ・ファイルなど、どの種類のバイナリ・データでも含めることができます。使用するRestServiceAdapterメソッドはsendReceiveです。

次の例は、RESTサーバーにファイルのリクエストを送信し、ファイルをディスクに保存する方法を示しています。

estServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter restServiceAdapter = factory.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("JagRestServerEndpoint");
restServiceAdapter.setRequestMethod(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.3 セキュアなWebサービスへのアクセス

MAFでは保護されたWebサービスと保護されていないWebサービスの両方がサポートされます。REST Webサービスが保護されている場合、第15.3.1項「Webサービスへのアクセスを有効にする方法」の説明に従って、REST Webサービスをサポートする事前定義済のセキュリティ・ポリシーにREST接続を関連付ける必要があります。

表15-1に、REST Webサービスへの接続に関連付けることができる事前定義済のセキュリティ・ポリシーを示します。

表15-1 RESTベースのWebサービスでサポートされるセキュリティ・ポリシー

認証タイプ

RESTポリシー

説明

HTTP基本

oracle/http_basic_auth_over_ssl_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含め、Oracle Platform Security Servicesアイデンティティ・ストアに対してユーザーを認証します。また、このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアントで実行できます。

HTTP基本

oracle/wss_http_token_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含めます。このポリシーは、HTTPベースまたはHTTPSベースのクライアントで実行できます。

HTTP基本

oracle/wss_http_token_over_ssl_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含め、Oracle Platform Security Servicesアイデンティティ・ストアに対してユーザーを認証します。また、このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアントで実行できます。

HTTP基本

Web SSO

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.3.1 Webサービスへのアクセスを有効にする方法

Webサービスが保護されており、認証トークンが予想される場合、Webサービスをサポートする事前定義済のセキュリティ・ポリシーにログイン接続を関連付ける必要があります。RESTベースのWebサービスに使用可能な認証タイプでサポートされている事前定義済のセキュリティ・ポリシーのリストは、第15.3項「セキュアなWebサービスへのアクセス」を参照してください。

MAFアプリケーション・エディタのモバイル・ログイン・サーバー接続ダイアログを使用して、ログイン・サーバー接続を作成します。ログイン・サーバー接続の作成の詳細は、第29.5.1項「MAFログイン接続の作成方法」を参照してください。

Webサービスにセキュリティ・ポリシーを関連付けるには:

永続接続を作成する手順:

1. RESTサービス・エディタのRESTクライアント・ページで、をクリックして接続の管理ウィザードを開きます。

2. ダイアログで、図15-1に示すように、「ポリシーの表示」をクリックして適切なポリシーを選択します。

図15-1 Webサービス・データ・コントロール・ポリシーの編集

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

OEPEでは、Webサービス・ポリシーの定義は(アプリケーション・ワークスペースのMETA-INFディレクトリにある) wsm-assembly.xmlファイルに格納されます。

「データ・コントロールの編集」ダイアログ(図15-1を参照)を使用して、REST Webサービスにすでに関連付けられているセキュリティ・ポリシーを表示できます。

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

デプロイメント時にMAFアプリケーションがコンテナ化されると、企業ファイアウォールの背後にある保護されたWebサービスは、Oracle Mobile Security Suite (OMSS)のコンポーネントであるMobile Security Access Server (MSAS)を利用して、モバイル・デバイスから企業のリソースへのトラフィックを保護する集中アクセス・ポイントを提供します。この場合、ユーザーの最初の認証で使用するために認証エンドポイントを実行するようにMSASインスタンスが構成されます。

また、バックエンド・サービス・エンドポイントは、1.) MSASで実行されるアクセス・ポリシーによってリソースのURLが保護されるようにするMSASプロキシ・アプリケーション、2.)シングル・サインオン(SSO)などのプロキシされたリクエストにMSASで追加されるクライアント・ポリシーに関連付ける必要があります。

MAFアプリケーションがMSASと通信できるようにするには、MSASインスタンスに構成されている認証のタイプのSecure Workspaceアプリケーションをインストールおよび登録します。次に、保護されたリソースへのアクセスをユーザー試みると、MAFアプリケーションおよびSecure Workspaceは、MSASにより生成されたプロキシ自動構成ファイルを利用して、MSAS AppTunnelを使用するプロキシに対するリクエストを決定します。

コンテナ化されたMAFアプリケーションの認証プロセスでMSAS AppTunnelが果す役割の詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

コンテナ化されたMAFアプリケーションのOMSSサポートの概要は、第2.8項「エンタープライズ配布のためのMAFアプリケーションのコンテナ化」を参照してください。

MSASの事前定義済のセキュリティおよび管理ポリシーの詳細は、OMSSドキュメント・ライブラリのOracle Mobile Security Access Serverのポリシーおよびアサーション・テンプレート・リファレンスを参照してください。

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

保護されたWebサービスにおけるユーザーの資格証明は、Webサービス・リクエストの起動時にそのリクエストに動的に挿入されます。

MAFではOracle Web Services Manager (OWSM) Mobile Agentを使用してWebサービス・リクエストによってユーザーIDを伝播させます。

Webサービスを起動する前に、ユーザーは、保護されたMAFアプリケーション機能の呼出しを試みるユーザーによってトリガーされた認証プロンプトに応答する必要があります。ユーザーの資格証明は、資格証明ストアに格納されます。この資格証明ストアは、認証プロバイダのサーバーURLおよびユーザーと関連付けられた資格証明の格納に使用される、デバイス・ネイティブかつローカルなリポジトリです。実行時に、MAFでは、すべての資格証明がその使用前にIDM Mobile資格証明ストアに格納されているものとみなします。

connections.xmlファイルには、Webサービスの接続参照のadfCredentialStoreKey属性に、ログイン・サーバー接続のadfCredentialStoreKey属性の値を指定して、ログイン・サーバーをWebサービスのセキュリティに関連付ける必要があります(次の2つの例を参照)。

次の例は、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.6項「MAFアプリケーションでのロギングの使用および構成」を参照)。既存の例外で状況を適切に示せない場合は、新しい例外が追加されます。

connections.xmlファイルは構成サービスの下でデプロイされ、管理されています。詳細は、第14章「MAFアプリケーションで使用するエンド・ポイントの構成」を参照してください。

FAR内のconnections.xmlファイルは、MAFアプリケーションのデプロイ時に集約されます。資格証明はデプロイメント固有のデータを表しており、FAR内に格納することは想定されていません。

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

Cookieベースの認可のためにMAFアプリケーションがREST Webサービスを要求するたびに、MAFのセキュリティ・フレームワークは、REST Webサービスのトランスポート・レイヤーが、REST WebサービスのURLエンド・ポイントに関連付けられているログイン接続に対してCookieを挿入できるようにします。これは実行時に処理され、MAF開発者によるMAFアプリケーションの構成は不要です。

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

呼び出すWebサービスが自社ファイアウォールの外部にある場合は、HTTPプロキシ・サーバーを使用できるような適切な構成にJavaシステム・プロパティが設定されていることを確認する必要があります。

デフォルトでは、MAFはアプリケーションのデプロイ先であるプラットフォームのシステム設定を使用してプロキシ情報を決定します。

注意:
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ファイル(assembly_project/META-INFにあります)に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 RESTサービスの使用

この章では、コードの生成に使用可能なREST APIおよびデータ型の作成、RESTサービスのアクセス、使用およびテスト、Oracle Mobile Cloud Serviceを使用したモバイル・アプリケーションの開発を可能にする、RESTサービス・エディタについて説明します。

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

- 第16.1項「RESTサービスの使用の概要」

- 第16.2項「RESTクライアントの使用」

- 第16.3項「リクエスト・コンテンツの変更」

- 第16.4項「REST APIのインポートおよびモデル化」

- 第16.5項「データ型のインポートおよびモデル化」

- 第16.6項「RESTサービスに対するモデル化されたリクエストのテスト」

- 第16.7項「RESTサービス・アーティファクトの作成」

- 第16.8項「「接続」ビューの使用」

16.1 RESTサービスの使用の概要

RESTサービス・エディタにより、REST APIとデータ型を作成し、そこからアプリケーションで使用するコードを生成できます。これにより、REST APIと相互作用するアプリケーションを開発したり、開発中のREST APIがどのように動作するかをテストできます。RESTサービスとともに使用するアプリケーションの開発中に、そのアプリケーションによるRESTリクエストの処理方法を確認するためにエディタを使用できます。

次のことが可能です。

- ライブRESTサービスに接続してリクエストを送信し、サーバーから戻されるレスポンスを調査できます。

- REST APIおよびデータ型を、すべて最初から作成するか、インポートしたライブ・サービスのREST APIおよびデータ型に基づいて独自のREST APIをモデル化することで作成できます。

エディタは、RESTサービス記述(Webサービスの説明を格納したXMIファイル)とともに動作します。

エディタには、次の3つのページがあり、エディタの左下にあるタブを使用してそれぞれ移動できます。

- RESTクライアント

- REST API

- データ型

RESTサービス・エディタには、元に戻す/やり直しサポートがあります。各ページは連携して動作しますが、RESTクライアントのみライブRESTサービスと相互作用します。他の2つのページでは、REST APIとそのデータ型をモデル化できます。エディタを保存すると、REST APIページと「データ型」ページのみが保存されます。

16.1.1 RESTクライアント・ページ

図16-1のRESTクライアント・ページでは、REST APIを公開している既存のアプリケーションを試すことができます。たとえば、アプリケーションがREST APIと相互作用する方法を調査し、サービスにリクエストを送信してサーバーからのレスポンスを確認できます。このページは、RESTサービス記述の永続状態の一部ではないため、変更によりエディタが不適切な状態になることも、エディタの保存時にそれらが永続化されることもありません。

図16-1 RESTクライアント・ページ

(インポートすつ場所を選択するRESTクライアント情報のインポート・ダイアログを開きます)を使用して、RESTクライアント情報をインポートできます。

リクエストは次の操作によって変更できます。

- メソッドを選択します。「GET」、「POST」、「PUT」およびDELETEを選択できます。

- URIのフラグメントを使用してサービスの一部のみをアドレス指定します。

- 一致するレスポンスのみが戻されるようにリクエストの一部として問合せを送信します。

- ヘッダーを使用してレスポンスで戻される内容を定義します(コンテンツ・タイプの指定など)。

- 問合せパラメータを使用してレスポンスを構成します(verbose=falseなど)。

- POSTまたはPUTを使用する場合はリクエストの一部として情報を入力し、GETを使用する場合は情報を出力します。

また、RESTクライアント・ページで、RESTサービスからRESTクライアント情報をインポートできます。

16.1.2 REST APIページ

REST APIページでは、図16-2に示すように、REST APIをモデル化したり、MCSバックエンドからRAML定義をインポートできます。

REST APIをモデル化しており、RESTクライアントを使用してRESTサービスに接続した場合、サーバーからRESTクライアント情報をインポートできます。REST APIはこのページに表示され、その変更をモデル化できます。

MCS APIを使用している場合、RAML定義をローカル・ファイル・システム上のファイルまたはモバイル・バックエンドのAPIからインポートして、REST APIとしてモデル化できます。

図16-2 REST APIページ

パスはパス・セグメントで構成されており、{variable-name}の形式の変数が含まれる場合があります。図16-2では、変数{id}のパスは、アウトラインに示されているパス・セグメントで構成され、http://130.35.103.104:7101/hrrest/resources/hrappsrvc/departments/{id}を形成します。

Javaドメインの場合、変数のデフォルト値はjava.lang.Objectです。

パス・セグメントまたは変数の上にマウスを置くと、詳細を確認できます。

をクリックして、RAMLファイルまたはMobile Cloud ServiceバックエンドからREST APIをインポートできます。詳細は、第17.2.1.4.2項「RESTサービス・エディタを使用したREST APIのインポート」を参照してください。

「アウトライン」領域には、サービスのREST API仕様が表示されます。右側の領域のコンテンツは、仕様で選択されている内容に応じて変化します。アウトラインは、図16-3のように、OEPE IDEの「アウトライン」ウィンドウに反映されます。各操作は、RESTサービス・エディタのREST APIページで実行するか、REST APIページがエディタで選択されている場合は「アウトライン」ウィンドウで実行できます。

図16-3 「アウトライン」ウィンドウ

REST APIページで、次の操作によってREST APIを変更できます。

- サービスへの新しいパスを指定します。

- 新しいリクエストを作成し、HTTPヘッダーと問合せパラメータの使用や、入力および出力パラメータの指定によってそれらを変更します。

REST APIが完成したら、変更内容をRESTクライアント・ページにコピーして、ライブRESTサービスに対してリクエストを試行できます。

RESTサービスと連携して動作するMAFアプリケーションを開発している場合、アプリケーションで使用するREST APIに基づいてJAVAアーティファクトを生成できます。

16.1.3 「データ型」ページ

図16-4の「データ型」ページでは、REST APIで使用されるデータ型をモデル化できます。インポートしたデータ型はこのページに表示され、その変更をモデル化できます。

RESTクライアントを使用してRESTサービスに接続した場合、サーバーからRESTクライアント情報をインポートできます。

MCS APIを使用している場合、ローカル・ファイル・システム上のモバイル・バックエンドまたはRAMLファイルに関連付けられているデータ型をインポートできます。ファイルに定義されているJSONサンプルまたはJSONスキーマをローカル・ファイル・システムからインポートすることもできます。

図16-4 「データ型」ページ

「アウトライン」領域には、モデル化されたREST APIで使用されるデータ型が表示されます。右側の領域のコンテンツは、仕様で選択されている内容に応じて変化します。アウトラインは、図16-5のように、OEPE IDEの「アウトライン」ウィンドウに反映されます。各操作は、RESTサービス・エディタの「データ型」ページで実行するか、「データ型」ページがエディタで選択されている場合は「アウトライン」ウィンドウで実行できます。

図16-5 「アウトライン」ウィンドウ

「データ型」ページで、次の操作によってローカル・データ型を変更できます。

- 新しい属性を作成します。

- 新しい複合データ型または単純データ型を指定します。

データ型はファイルからインポートできます。

RESTサービスと連携して動作するMAFアプリケーションを開発している場合、アプリケーションで使用するデータ型に基づいてJAVAアーティファクトを生成できます。

16.1.4 認証の使用

RESTサービス・エディタでは、認証を使用するRESTサービスへの接続がサポートされます。使用できる認証のタイプは次のとおりです。

- HTTP (Basic、Digest、Universal)

- OAuth2 (コード権限タイプ)

- OAuth2 (リソース所有者パスワード資格証明タイプ)

RESTサービスへの接続を作成するときに、認証の詳細を設定します。詳細は、第16.2.1.8項「認証を使用する方法」を参照してください。

16.1.5 RESTサービス・エディタを開く方法

RESTサービス・エディタは次の場合に開かれます。

- OEPEアプリケーションで既存のRESTサービス記述を開く場合。

- OEPEで新しいRESTサービス記述を作成する場合。詳細は、第16.1.6項「RESTサービス記述を作成する方法」を参照してください。

16.1.6 RESTサービス記述を作成する方法

RESTサービス記述を作成して、作成済またはMAF 2.1以上に移行済のMAFアプリケーション用にモデル化されたREST APIを含めることができます。記述は、適切なフォルダのビュー・プロジェクトに格納されます。

RAML定義をMCS APIからインポートしてRESTサービス記述を作成することもできます。詳細は、第17.2.1.4.1項「「Oracle Cloud」ビューからのREST APIのインポート」を参照してください。

始める前に:

- Oracle MAFパースペクティブを選択します。

- MAFアプリケーションを開くか作成します。

RESTサービス記述を作成する手順:

1. OEPEのメイン・メニューまたはMAFアプリケーションのいずれかのプロジェクトのコンテキスト・メニューから、「ファイル」→「新」→RESTサービス記述を選択します。
または:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを右クリックして、OEPEのメイン・メニューから「ファイル」→「新」→「その他」を選択します。

2. 「新」ダイアログで、「Oracle」を展開してRESTサービス記述を選択します。「新」ダイアログで、「次へ」をクリックします。

2. RESTサービス記述ページで、記述を格納するアプリケーションのビュー・プロジェクトの親フォルダを選択します。たとえば、src.restというビュー・プロジェクトのフォルダを選択します。
記述に名前を指定し、「終了」をクリックします。RESTサービス記述がRESTサービス・エディタで開かれます。

16.2 RESTクライアントの使用

図16-1のRESTクライアントでは、ライブRESTサービスに接続して連携動作できます。

16.2.1 RESTサービス接続の指定

RESTクライアントの一番上にある「リソース」領域で、接続に使用するメソッドとRESTサービスのURIを指定します(図16-6を参照)。ここで定義した接続は、「接続」ビューで使用可能で、接続を編集したり、モバイル・アプリケーションの他の場所で使用できます。詳細は、第16.8,項「「接続」ビューの使用」を参照してください。

図16-6 RESTサービス接続

RESTクライアントは、次のHTTPメソッドを使用できます。

- GET: リソースの表現を取得します。

- POST: 新しいリソースの作成に使用します。作成する新しいリソースの親にPOST操作を行うと、サービスで作成と新しいIDの割当てが考慮されます。

- PUT: リソースの表現の更新に使用します。更新を指定する入力がリクエストの本文で送信されます。

- DELETE: リソースの削除に使用します。

RESTサービスへの接続は、URIによって指定されます。通常、URIは、現在のセッションのみで使用できますが、将来のセッションで使用できる永続URIを定義できます。複数のURIを使用した場合、有効な接続が作成されたものはすべて「アドレス」ドロップダウンから使用できます。

接続は次のように複数の方法で定義できます。

- 「アドレス」にREST APIの有効なアドレスをそのまま入力できます。詳細は、第16.2.1.1項「単純なURIを入力する方法」を参照してください。

- アドレス構成機能では、個別にセグメント、問合せ、およびアドレスのフラグメントを入力でき、自動でエンコーディングが処理されます。詳細は、第16.2.1.2項「RESTサービスのアドレスを構成する方法」および第16.2.1.4項「リクエストにフラグメントを含める方法」を参照してください。

- アプリケーションで定義された接続(アプリケーションのconnections.xmlファイルの接続)を使用できます。詳細は、第16.2.1.5項「アプリケーションの接続名を使用する方法」を参照してください。

- 将来のセッションで使用できる永続URIを定義できます。詳細は、次を参照してください。

16.2.1.1 単純なURIを入力する方法

RESTサービス・エディタのRESTクライアント・ページからRESTサービスに接続します。

RESTサービスへの単純なURIを入力する手順:

- 「アドレス」フィールドにURIを入力します。エディタへの入力を開始すると、同じセッション中の以前のエントリに基づいてURI候補が表示されます。

16.2.1.2 RESTサービスのアドレスを構成する方法

RESTサービス・エディタのRESTクライアント・ページからRESTサービスに接続します。ダイアログによって、URIで直接表現できない任意の文字のエンコーディングが実行されます。

アドレスを構成する手順:

1. をクリックしてアドレス構成ダイアログを開きます。

2. 「セグメント」に、URIを入力します。
別の方法として、アプリケーションの接続名を使用してURIを作成できます。詳細は、第16.2.1.5項「アプリケーションの接続名を使用する方法」を参照してください。

3. サーバーが問合せの結果のみを戻すように問合せを使用するには、第16.2.1.3項「リクエストに問合せを含める方法」を参照してください。

4. 宛先の特定の場所を指定するフラグメントを使用するには、第16.2.1.4項「リクエストにフラグメントを含める方法」を参照してください。

5. 認証が必要な場合、「リソース」セクションでをクリックして認証情報ウィザードを開きます。詳細は、第16.2.1.8項「認証を使用する方法」を参照してください。

16.2.1.3 リクエストに問合せを含める方法

サーバーが問合せの結果のみを戻すようにURIの一部として問合せを送信できます。問合せ値を入力するか、接続の作成時に指定した変数を使用できます。

問合せを入力する手順:

1. をクリックしてアドレス構成ダイアログを開きます。

2. 問合せを入力するには、「問合せ」に値を入力します。
たとえば、http://server:port/hrrest/resources/hrappsrvc/departmentsへのリクエストの送信時に、特にid=10である部門の詳細を取得する場合、アドレスhttp://server:port/hrrest/resources/hrappsrvc/departments/10を使用してこのオブジェクトのみに関するレスポンスを戻すことができます。

問合せとして変数を使用することもできます。{ }で区切られた変数を入力します({id}など)。リクエストを送信するときに、変数の置換ダイアログが表示され、変数ごとに値を入力できます。

16.2.1.4 リクエストにフラグメントを含める方法

サーバーが宛先の特定の場所を指定するようにURIの一部としてフラグメントを使用できます。

フラグメントを使用する手順:

1. をクリックしてアドレス構成ダイアログを開きます。

2. 宛先の特定の場所を指定するフラグメントを使用するには、「フラグメント」にフラグメント名を入力します。

16.2.1.5 アプリケーションの接続名を使用する方法

接続URIは、RESTクライアントで使用可能な特定のタイプのURIです。接続URIの書式はconnection://connection-nameです。

次の例では、名前がrest_connの接続によって、http://localhost:7101" name="rest_connへの接続を指定します。

<Reference className="oracle.adf.model.connection.url.HttpURLConnection" name="rest_conn" xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="rest_conn">
<Contents>
<urlconnection url="http://localhost:7101" name="rest_conn"/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

RESTクライアントでこの接続に基づくURIを使用するには、「アドレス」にcと入力します。エディタに使用可能なURIのリストが表示され、そのうちの1つにconnection://rest_connがあります。リクエストを実行すると、この接続は実際のURIであるhttp://localhost:7101に解決されます。

場合によっては、次の例のように、有効なレスポンスを戻すためにパスの別の部分を追加する必要もあります。たとえば、connection://rest_conn/departmentsのように指定します。

アプリケーションに基づいてURIを作成する手順:

1. アプリケーションのconnections.xmlファイルを開き、使用する接続名を特定します。「接続」ビューのメニュー・バーで、をクリックすると、connections.xmlがOEPEソース・エディタで開きます。

2. RESTサービス・エディタのRESTクライアント・ページで、「アドレス」に接続名の入力を開始します。

3. 使用可能な接続のリストから使用する接続を選択し、必要に応じてパスの別の部分を追加します。

アプリケーションで設定された認証を持つ接続に対して接続URIを使用できます。connections.xmlファイルで、接続のHttpURLConnectionに、値の設定されたadfCredentialStoreKeyがあります。

をクリックすると、「認証情報」ダイアログが表示され、接続に関連付けられたユーザー名とパスワードを入力できます。

16.2.1.6 永続接続を作成する方法

現在のセッションのみでなく、いつでも使用できる永続接続を作成できます。永続アドレスは、それらに入力する名前から使用できます。

永続接続は「接続」ビューに表示されます。詳細は、第16.8,項「「接続」ビューの使用」を参照してください。

永続接続を作成する手順:

1. RESTサービス・エディタのRESTクライアント・ページで、をクリックして接続の管理ウィザードを開きます。

2. 図16-7のダイアログで、接続の名前とURLを入力します。ウィザードのこのページでは次のことが可能です。

- をクリックしてURIをテストします。

- をクリックしてブラウザでURIを開きます。

- 接続の認証の詳細を指定する必要がある場合、「認証が必要」を選択してウィザードの残りのページで認証値を入力します。詳細は、第16.2.1.8項「認証を使用する方法」を参照してください。

- セキュリティ・ポリシーを指定するには、ポリシーの表示をクリックして、該当するポリシーを選択します。詳細は、第15.3項「セキュアなWebサービスへのアクセス」を参照してください。

16.2.1.7 OWSMポリシーのオーバーライド

OWSMモバイル・エージェントの一部のプロパティをオーバーライドして、実施中のOWSMポリシーの基礎となる動作を変更できます。これは、次のポリシーに対してのみ使用できます。

- oracle/http_basic_auth_over_ssl_client_policy

- oracle/wss_http_token_over_ssl_client_policy

- oracle/wss_http_token_client_policy

preemptiveをtrueまたはfalseのいずれかに設定できます。これらのポリシーでpreemptiveをtrueに設定すると、保護されたREST Webサービスへの最初のリクエストに基本認証ヘッダーが挿入されます

図16-7 永続接続の作成

オーバーライド・プロパティを使用してOWSMポリシーを変更する手順:

1. 接続の管理ダイアログで、オーバーライド・プロパティを設定するOWSMポリシーを選択します。

2. をクリックして、「プロパティのオーバーライド」ダイアログを開きます。

3. をクリックして、オーバーライド・プロパティの選択ダイアログを開きます。使用可能なプロパティのリストから選択して、「OK」をクリックします。

4. 「プロパティのオーバーライド」ダイアログで、プロパティの値を選択します。「OK」クリックして、接続の管理ダイアログに戻ります。

16.2.1.8 認証を使用する方法

認証で保護されているRESTサービスに接続する場合、接続情報の一部として認証を入力します。RESTクライアント・ページで、これは次のいずれかの場合です。

- 「アドレス」フィールドにURIを入力してセッション接続を作成する場合、またはをクリックしてアドレス構成ダイアログを開く場合。この場合、をクリックします。
または、すでに適用された認証があるアプリケーション接続を指す接続URIを使用できます。詳細は、第16.2.1.5項「アプリケーションの接続名を使用する方法」を参照してください。

- をクリックして接続の管理ウィザードを開き、永続接続を作成する場合。この場合、HTTP URL接続の作成ページで「認証が必要」を選択します。

RESTサービス・エディタでは、HTTP BasicおよびOAUTH 2接続がサポートされます(第16.2.1.8項「RESTサービス認証」を参照)。

図16-8 RESTサービス認証

- HTTP Basic、Digest、Universal: サーバーへのリクエスト送信時に使用するユーザー名とパスワードを入力します。

- OAuth 2 (コード権限タイプ): 認可URIを使用したOAuth 2認証。

- OAuth 2 (リソース所有者パスワード資格証明タイプ): ユーザー名とパスワードを使用したOAuth 2認証。

- OAuth 2 ("クライアント資格証明"権限タイプ): クライアント資格証明を使用したOAuth 2認証。

RESTサービス接続の認証を入力する手順:

1. RESTクライアント・ページで、次の操作を実行します。

- 「アドレス」フィールドにURIを入力するか、をクリックしてアドレス構成ダイアログを開き、セッション接続を作成する場合、をクリックして「認証情報」ダイアログを開きます。

- をクリックして接続の管理ウィザードを開き、永続接続を作成する場合、HTTP URL接続の作成ページで「認証が必要」を選択します。

2. 「認証タイプ」ページで、使用する認証タイプを選択し、「次へ」をクリックします。

3. 接続の認証の詳細を入力して「終了」をクリックします。

モデル化されたREST APIからMAFアプリケーションとともに使用するJavaアーティファクトを作成する場合も、状況によっては認証を使用する必要があります。詳細は、第16.7.1項「RESTサービス用のJavaアーティファクトを生成する方法」を参照してください。

16.2.2 RESTサービスへのリクエストの送信

URIを指定したら、サーバーにリクエストを送信できます。

RESTサービスにリクエストを送信する手順:

1. 使用するメソッドを選択します。

2. 正しいURIが「アドレス」に指定されていることを確認します。

3. 次のいずれかの方法でリクエストを実行します。

- カーソルを「アドレス」に置いた状態で[Enter]を押します。

- をクリックします。

16.2.3 リクエストを送信する場合の処理

リクエストを送信すると、サーバーからクライアントに戻されたHTTPレスポンスが「レスポンス」領域に表示されます(図16-9を参照)。

レスポンスのHTTPステータス・コードが表示されます。

レスポンス自体は、次の3つのタブに表示されます。

- 「ヘッダー」には、ヘッダーの名前と関連する値が表示されます(Content-Length、ContentType、Dateなど)。

- RAWコンテンツには、サーバーから取得された文字列が表示されます。をクリックして行を折り返すことができます。コンテンツがバイナリの場合、をクリックするとそれを文字列として表示できます。

- レンダリング・コンテンツには、コンテンツ・タイプ(JSON、XML、HTMLまたはイメージ)に従って書式設定されたレスポンスが表示されます。他のコンテンツ・タイプは、このタブには表示されません。カーソルをノードの上に置くと、REST APIの理解に役立つ追加情報が表示されます。

図16-9 レスポンスのコンテンツ

をクリックすると、「レスポンス」領域にデータ型を表示できます。

16.2.4 レスポンス・タイプの生成

REST APIリクエストは出力を指定しないため、コード生成時にOEPEは生成されたJava戻りタイプとしてoracle.eclipse.tools.rest.runtime.client.ResponseObjectを返します。これにより、アプリケーションに最も適した方法でリクエスト・レスポンス情報を処理できます。

メディアタイプが次のいずれかである状況ではコードを明確に処理します。

- ワイルドカード(*/*)

- イメージ(image/*

ResponseObjectでは次のものにアクセスできます。

- レスポンス・ヘッダー: レスポンス・ヘッダーのあるnot-<code>null</code>マップ。

- メディアタイプ: メディア・タイプ情報がない場合は長さがゼロ、または最初の要素が完全メディア・タイプ文字列(application/jsonなど)、2番目の要素がメディア・タイプ'type' (application)、3番目がサブタイプ(json)の長さ3のnot-<code>null</code>配列。

- 文字セット: <code>null</code>またはレスポンスのメディア・タイプに適用される文字セット。

- エンティティ: <code>null</code>、空でない文字列またはレスポンスのエンティティを表す任意のオブジェクト(エンティティは通常、サーバーが返すコンテンツの表現です)。

- Rawエンティティ: <code>null</code>またはサーバーが返したままのオブジェクトで、通常は入力ストリームまたはバイト配列です。このオブジェクトのエンティティが{@link #isBufferedEntity() buffered}ではない場合、このメソッドはbyte配列を返します。

16.3 リクエスト・コンテンツの変更

リクエスト・メッセージのコンテンツを変更して、サーバーからレスポンスで戻される内容を決定できます。これは、RESTクライアント・ページのリクエストに対して実行するか、REST APIページでREST APIをモデル化する場合に実行できます。

次のものを使用できます。

- HTTPヘッダー

- 問合せパラメータ

- 入力(メソッドがPUTまたはPOSTの場合)

- 出力(メソッドがGETまたはPOSTの場合)

16.3.1 リクエストでRESTヘッダーを使用する方法

HTTPヘッダーを追加して、サーバーがリクエストに応答する方法を変更できます。たとえば、戻されるコンテンツ・タイプを指定できます(GETでのAccept=application/jsonまたはPOSTでのContent-Type=application/jsonなど)。

サーバーから戻されるコンテンツ・タイプを指定する手順:

1. リクエストの詳細領域の「ヘッダー」タブを選択したまま、をクリックして「ヘッダーの追加」ダイアログを開きます。

2. ダイアログで、リクエスト・ヘッダーの値を入力して「OK」をクリックします。名前と値のフィールドではコンテンツ・アシストが使用可能で、入力を開始すると使用可能なオプションが表示されます。

3. リクエストの詳細領域の「ヘッダー」タブで、適切なボタンを使用して、選択したヘッダーの編集または削除、並替え、または複数のヘッダーの削除を行うことができます。

16.3.2 問合せパラメータを使用してレスポンスを構成する方法

問合せパラメータを使用して、サーバーから戻されるレスポンスを構成できます(verbose=falseなど)。

問合せパラメータを使用する手順:

1. リクエストの詳細領域の「問合せパラメータ」タブを選択したまま、をクリックして「問合せパラメータの追加」ダイアログを開きます。

2. ダイアログで、問合せパラメータの値を入力して「OK」をクリックします。

3. リクエストの詳細領域の「問合せパラメータ」タブで、適切なボタンを使用して、選択した問合せパラメータの編集または削除、並替え、または複数の問合せパラメータの削除を行うことができます。

16.3.3 入力を送信する方法

PUTまたはPOSTメソッドを使用している場合、リクエスト・メッセージの本文で入力を送信できます。

注意:
RESTクライアントでの入力のみがリクエストの本文に含まれます。

入力を送信する手順:

1. 「入力」タブを選択し、「本体」または「表現」を選択します。

2. 本文の場合、テキスト領域に直接入力を指定します。次に例を示します。

{"name":"demo department"}

をクリックして行を折り返すことができます。

3. または、「パラメータ・リストとして表示」をクリックし、をクリックして本文パラメータの追加ダイアログを開きます。名前と値のペアを入力し、「OK」をクリックします。
リクエストの詳細領域の「入力」タブ、リクエストの詳細領域の「問合せパラメータ」タブで、適切なボタンを使用して、選択した入力パラメータの編集または削除、並替え、または複数の入力パラメータの削除を行うことができます。

4. 表現の場合、をクリックして「表現」ダイアログを開き、入力のデータ型を選択します。
必要に応じて、「すべての属性」を選択解除し、使用する属性のみを選択します。サーバーが戻すことのできるデータ型および属性を選択することが重要です。

16.3.4 出力を指定する方法

GETまたはPOSTメソッドを使用している場合、戻される出力を指定できます。たとえば、データ型の使用可能な属性のうちの一部のみをレスポンスで戻すように指定できます。

出力を指定する手順:

1. 「出力」タブを選択します。

2. 出力が表現とリダイレクションのいずれであるかを選択します。

3. 表現の場合、をクリックして「表現」ダイアログを開き、レスポンスのデータ型を選択します。
必要に応じて、「すべての属性」を選択解除し、戻す属性のみを選択します。サーバーが戻すことのできるデータ型および属性を選択することが重要です。

4. リダイレクションの場合、必要なHTTPヘッダーを入力し、表現を入力します。

16.4 REST APIのインポートおよびモデル化

RESTサービス・エディタのREST APIページと「データ型」ページでは、REST APIをモデル化できます。まず、アプリケーションを開発してその実行対象とする既存のライブRESTサービスからRESTクライアント情報をインポートします。または、完全に新しいREST APIを作成できます(たとえば、提案されたRESTサービスに対してどのようにアプリケーションが実行されるかをテストするなど)。

RAML定義をMCS APIからインポートできます。これは、ローカルREST APIとして保存され、それを使用できます。

REST APIが完成したら、変更内容をRESTクライアント・ページにコピーして、ライブRESTサービスに対してリクエストを実行し、戻されるレスポンスを調査できます。

16.4.1 RESTクライアント情報のインポート

既存のRESTサービスに対してREST APIをモデル化する前に、サービスからRESTクライアント情報をインポートする必要があります。リクエストまたはデータ型(あるいはその両方)をインポートできます。

始める前に、次のことを実行しておく必要があります。

- RESTサービス・エディタのRESTクライアント・ページでRESTサービスへの接続を作成します(第16.2.1項「RESTサービス接続の指定」を参照)。

- データ型をインポートする場合、HTTPヘッダーを設定してレスポンスがJSONペイロードであることを指定します(第16.3.1項「リクエストでRESTヘッダーを使用する方法」を参照)。

- RESTサービスに対してリクエストを実行します(第16.2.2項「RESTサービスへのリクエストの送信」を参照)。

RESTクライアント情報をインポートする手順:

1. RESTサービス・エディタのRESTクライアント・ページで、をクリックしてRESTクライアント情報のインポート・ウィザードを開きます。

2. ウィザードのRESTクライアント情報のインポート・ページで、インポートする内容を選択して「次へ」をクリックします。

3. リクエストをインポートする場合のみ、リクエストのインポート・ページが表示されます。リクエストのルート・パスと名前を入力します(図16-10を参照)。「次へ」をクリックします。

図16-10 リクエストのインポート

4. データ型をインポートする場合のみ、データ型のインポート・ページが表示されます。ウィザードによって表のデータ型が推測され、図16-11のように表示されます。情報をインポートするには、「終了」をクリックします。

図16-11 データ型のインポート

16.4.2 RESTクライアント情報をインポートする場合の処理

リクエスト(またはリクエストとデータ型)をインポートする場合、RESTサービス・エディタはREST APIページに戻り、REST APIのモデル化を続行できます。

ウィザードで指定したパスはノードとして表示され、入力したリクエストはその下にリストされます(図16-12を参照)。

図16-12 インポートされたリクエスト

リクエスト(この例ではgetDepartments)を選択すると、次の内容が表示されます。

- HTTPヘッダーがインポートされます(図16-13を参照)。

図16-13 インポートされたヘッダー

- 出力がインポートされます(図16-14を参照)。

図16-14 インポートされた出力

また、データ型をインポートした場合、「データ型」ページには、エディタがRESTサービスから推測したデータ型および属性が表示されます。

16.4.3 手動によるREST APIのモデル化

REST APIをインポートすることは、ライブ・サービスに対してREST APIをモデル化する場合の安全で確実な方法です。別の方法として、すべて最初からREST APIをモデル化できます。次の方法でAPIのモデル化を続行することもできます。

- RESTサービス・セグメントのアドレスであるパスを指定します。

- サーバーのレスポンスを戻すことのできるリクエストを作成し、HTTPヘッダーと問合せパラメータの使用や、入力および出力パラメータの指定によってそれらを変更します。

- エディタの「データ型」ページで新しいデータ型と属性を作成します。

REST APIが完成したら、変更内容をRESTクライアント・ページにコピーして、ライブRESTサービスに対してリクエストを実行し、戻されるレスポンスを調査できます。詳細は、第16.6項「RESTサービスに対するモデル化されたリクエストのテスト」を参照してください。

適切なノードを選択してさらにリクエストを定義します。

「HTTPヘッダー」タブでは、次のことが可能です。

- リクエスト・ヘッダーの名前/値ペアを定義するには、をクリックして「ヘッダーの追加」ダイアログにそれらを入力します。

- ボタンを使用して、選択したヘッダーの編集または削除、または複数のヘッダーの並替えを行うことができます。

「問合せパラメータ」タブでは、次のことが可能です。

- 問合せパラメータの名前/値ペアを定義するには、をクリックして「問合せパラメータ」ダイアログにそれらを入力します。

- ボタンを使用して、選択した問合せパラメータの編集または削除、または問合せパラメータの並替えを行うことができます。

「入力」タブを使用して、PUTまたはPOSTリクエストで入力を送信します。

「出力」タブでは、リクエストから戻される結果に対する処理を選択できます。

1. タイプを「なし」、「表現」またはリダイレクションから選択します。

2. 表現の場合、をクリックして表現の追加ダイアログを開き、データ型を指定します。
リダイレクションの場合、をクリックして「ヘッダー」タブにヘッダーの名前/値ペアを入力し、「表現」タブを選択してデータ型を指定します。

16.4.3.1 新しいリクエストを作成する方法

新しいリクエストを作成する手順:

1. 「アウトライン」でノードを右クリックし、「新」および「リクエスト」を選択します。

2. 右側の「リクエスト」の下で、メソッドを選択して名前を追加し、リクエストの残りを定義します。

16.4.3.2 新しいパスを作成する方法

異なるURIに対する新しいパスを作成できます。

新しいパスを作成する手順:

1. 「アウトライン」でノードを右クリックし、「新」および「パス」を選択します。

2. 右側の「パス」の下で、次のいずれかの操作を行います。

- { }を使用して変数を入力します({id}など)。

- URIを入力します。

- をクリックしてアドレス構成ダイアログを開き、URIを定義します。

16.4.4 パス変数タイプの使用

図16-15に示すように、RESTサービス・エディタのREST APIページでは、パス・セグメントに{variable-name}の形式の変数が含まれる場合があります。タイプを変数に割り当てることができます(この変数はを生成されるコードで適用されます)。

図16-15 パス変数の使用

Javaドメインの場合、変数のデフォルト値はjava.lang.Objectです。

同じ名前のパス・セグメントに変数がある場合、それらをデフォルト値にのみ割り当てることができます。

サポートされているデータ型は次のとおりです。

- <default>

- java.boolean

- java.byte

- java.char

- java.double

- java.float

- java.int

- java.long

- java.short

- java.lang.String

- java.math.BigInteger

- java.math.BigDecimal

- java.util.Date

- java.net.URI

- java.lang.Object

- java.time.LocalDateTime

- java.time.LocalDate

- java.time.LocalTime

- json.String

- json.Number

- json.TRUE

- json.FALSE

- json.NULL

注意:
デフォルトの型以外のデータ型が変数に割り当てられており、その変数の名前が変更されている場合、データ型の割当ては失われ、アクションを元に戻すか、データ型を再度割り当てることができます。

16.4.4.1 パス変数タイプを編集する方法

パス編集タイプを編集する手順:

1. REST APIページの右側の「パス」の「変数」セクションで、変数をダブルクリックします。変数タイプの編集ダイアログが開きます。

2. 変数の新しいデータ型をリストから選択します。

16.4.4.2 アーティファクト生成のパス変数タイプ

パス変数のタイプは、RESTサービス・エディタのアーティファクト生成機能で使用され、生成されたメソッド・シグネチャで使用されるときにコードがどのように生成されるかをきめ細かく制御できます。パス変数および生成の詳細は、第16.7.1,項「RESTサービス用のJavaアーティファクトを生成する方法」を参照してください。

パス変数のタイプを指定した場合、このタイプは生成されたメソッド・シグネチャで使用されます。パス変数の文字列値表現によって、対応する変数テンプレート値が置き換えられます。{id}/{id2}/{id}などの重複パス変数の場合、メソッド・シグネチャには、パス変数idおよびid2のマッピング情報が含まれ、idパラメータによって表されるタイプに相当する文字列値によって、このパス・セグメント内の一致する値がすべて置き換えられ、id2に相当する文字列値によって、指定したパス・セグメント内の値が置き換えられます。

パラメータ変数のデフォルトのタイプの動作を制御できます。次に示すアーティファクトの生成ウィザードで、パススルーのデフォルトの動作により、パラメータ・タイプがjava.lang.Objectに設定されます。このため、REST APIデータ型が<default>で、ウィザードの生成設定ページでパラメータ・デフォルト・タイプなしが選択されている場合、Javaメソッド・パラメータ・タイプ・シグネチャはjava.lang.Objectに設定されます。生成設定UIページで、java.lang.Stringまたはjava.lang.Objectを明示的に設定することで、パラメータ・デフォルト・タイプを制御できます。この選択は、注釈としてREST記述.xmi内で永続化されるため、アーティファクトの生成ウィザードに再入力すると、ステートフルな選択になります。

16.4.4.3 パス変数タイプおよびRESTクライアント

重複した名前で変数のタイプを指定した場合、RESTサービス・エディタのRESTクライアント・ページからリクエストを送信すると、変数の置換ダイアログが表示され、図16-16に示すように、リクエスト変数ごとに値を指定できます。

図16-16 RESTクライアントの変数の置換

変数の置換ダイアログでタイプ情報を使用できます。

- たとえば、パス変数にjava.boolean typeがある場合、ダイアログにはチェック・ボックスが表示されます。

- たとえば、タイプjava.floatのパス変数に入力した値がJava浮動小数点数の形式に順序していることを検証できます。

変数の置換ダイアログで、<default>、java.lang.Stringおよびjava.lang.Objectは文字列と同様に扱われます。JSON型はJava型にマップされます。

- json.Stringはjava.lang.Stringにマップされます

- json.Numberはjava.math.BigDecimalにマップされます

- json.Trueおよびjson.FALSEはjava.booleanにマップされます

- json.NULLはjava.lang.Objectにマップされます(ダイアログでjava.lang.Stringとして扱われます)。

Boolean型および日時型(java.util.Date、java.time.LocalDateTime、java.time.LocalDateおよびjava.time.LocalTime)の場合、図16-17に示すように、変数の置換ダイアログにこれらの変数が表示され、java.time.LocalDateTimeおよびjava.util.Dateが示されます。

図16-17 日付および時刻の変数が表示される変数の置換ダイアログ

16.5 データ型のインポートおよびモデル化

RESTサービス・エディタの「データ型」ページでは、データ型を操作できます。RESTクライアントを使用してRESTサービスに接続する場合、エディタによって、接続先のサービスで使用されるデータ型が推測され、ここに表示されます。

RESTサービス・エディタの「データ型」ページを使用して、MCSバックエンドのAPIおよびローカル・ファイル・システム上のRAMLファイルに関連付けられているデータ型をインポートできます。

図16-18 REST APIのデータ型

図16-18で、Departmentsは、右側にリストされた属性を持つローカル・データ型です。

「データ型」ページの左側の「アウトライン」は、「アウトライン」ウィンドウでも使用できます(図16-19を参照)。

図16-19 「アウトライン」ウィンドウ

16.5.1 データ型を作成する方法

新しい複合データ型または単純データ型を作成できます。

複合データ型を作成する手順:

1. 「ローカル・データ型」を右クリックし、「新」および「複合タイプ」を選択します。

2. 「複合タイプ」で、型の名前を入力します。

3. 「アウトライン」で、新しい型を右クリックし、「新」および「属性」を選択します。

4. 右側の「複合タイプ」の下の「属性」領域で、をクリックしてデータ型の選択ダイアログを開き、使用可能なデータ型のリストから選択できます。

単純データ型を作成する手順:

1. 「ローカル・データ型」を右クリックし、「新」および単純タイプを選択します。

2. 単純タイプで、型の名前を入力します。

16.5.2 データ型をインポートする方法

データ型は次からインポートできます。

- Eclipseワークスペース

- 外部ファイル

- MCSバックエンドAPI

- ローカル・ファイル・システムのRAMLファイル

データ型をインポートする手順:

1. RESTサービス・エディタの「データ型」ページで、をクリックしてデータ型情報のインポート・ウィザードを開きます。

2. RESTインポート・メカニズムの選択で、データ型のソースを選択します。オプションは次のとおりです。
JSONスキーマ。JSONスキーマ定義からデータ型をインポートする場合に選択します。

JSONテキスト。JSONサンプル・テキストからデータ型をインポートする場合に選択します。

モバイル・バックエンドのデータ型。データ型がMCSバックエンドのAPIに関連付けられている場合に選択します。

RAMLファイル。ローカル・ファイル・システムのRAMLファイルに使用されるデータ型をインポートする場合に選択します。

3. 「JSONスキーマ」またはJSONテキストを選択した場合は、「参照」をクリックし、コンテンツ・ファイルの選択で、JSONペイロードを含むファイルの場所に移動します。別の方法として、JSONペイロードをコピーし、それを直接「コンテキスト」テキスト領域に貼り付けることができます。

4. コンテンツ・ファイルの選択ダイアログで、JSONペイロードの文字セットを入力します(UTF-8など)。

5. データ型情報のインポート・ウィザードで、「次へ」をクリックします。

6. データ型のインポート・ページに、インポートまたはマージされるデータ型のサマリーが表示されます。
既存のドメイン・タイプに一致する型をマージするには、該当するオプションを選択します。

「終了」をクリックします。

16.6 RESTサービスに対するモデル化されたリクエストのテスト

モデル化されたREST APIからRESTサービス・エディタのRESTクライアント・ページにリクエストをコピーして、ライブRESTサービスに対してそれらを実行できます。

注意:
OWSMモバイル・エージェントが必要なRESTサービスに対して、保護およびモデル化されたすべてのリクエストをテストできない場合があります。ただし、OWSMポリシーを使用したBasic認可はサポートされています。

モデル化されたAPIからリクエストを実行する手順:

1. REST APIページで、実行するリクエストを選択します。

2. 「リクエスト」領域の右上にあるをクリックします。

3. RESTクライアント・ページが開き、実行準備の整ったリクエストが表示されます。

4. をクリックします。

16.7 RESTサービス・アーティファクトの作成

Oracle Enterprise Pack for Eclipseでは、Javaアーティファクトを作成して、RESTサービスに対して実行するMAF AMXアプリケーションを作成できます。

RESTサービス・エディタを使用して(第16.1項「RESTサービスの使用の概要」を参照)、使用するRESTサービスに接続し、利用可能な機能を使用して適切な結果が得られるようにREST APIをモデル化します。

MAFアプリケーションで使用できるJavaアーティファクトを生成する前に実行する手順は、次のとおりです。

1. RESTサービス記述を作成します(第16.1.6項「RESTサービス記述を作成する方法」を参照)。

2. RESTサービスに接続します(第16.2.1項「RESTサービス接続の指定」を参照)。

3. 希望する機能を表現するようにREST APIをモデル化します(第16.4項「REST APIのインポートおよびモデル化」を参照)。

16.7.1 RESTサービス用のJavaアーティファクトを生成する方法

Javaアーティファクトは、RESTサービス・エディタのREST APIページまたは「データ型」ページで生成できます。

始める前に、リクエストとデータ型をRESTサービスのライブ・バージョンに対してテストし、サーバーからのレスポンスが期待どおりの内容であることを確認してください。

Javaアーティファクトを生成する手順:

1. RESTサービス・エディタで、REST APIページまたは「データ型」ページを選択します。

2. をクリックしてアーティファクト生成ウィザードを開きます。

3. アーティファクト・ジェネレータの生成ページで、アプリケーション開発の対象であるOracle MAFランタイムと互換性のあるコードを選択します。「次へ」をクリックします。

4. ベースURL選択ページで、次の操作を実行します。

- ベース・リソース・パスは、REST API仕様のベースのパスです。

- 「名前」と「URL」は、永続接続です。をクリックして接続の管理ウィザードを開きます。

5. 接続の管理ダイアログで、接続の名前とURLを入力します。ウィザードのこのページでは次のことが可能です。

- をクリックしてURIをテストします。

- をクリックしてブラウザでURIを開きます。

- 接続の認証の詳細を指定する必要がある場合、「認証が必要」を選択してウィザードの残りのページで認証値を入力します。

「終了」をクリックしてRESTful Webサービス・ウィザードに戻り、「次へ」をクリックします。

6. Javaクラス名とパッケージ名ページで、次の操作を実行します。

- REST APIモデル・パスを展開してそれが正しいことを確認します。

- 必要に応じてJava名を変更します。

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

7. 生成設定ページで、次の操作を実行します。

- 使用可能なソース・フォルダを選択します。

- パッケージ接頭辞を受け入れるか、新しい名前を入力するか、または別の名前を参照して指定します。

注意:
このパッケージの場所になんらかのコンテンツが存在すると、それらは上書きされる可能性があります。複数のベースURL選択は異なるパッケージ・スキームに書き込むことをお薦めします。

- パラメータ・デフォルト・タイプ: REST APIデータ型が<default>の場合、デフォルトはjava.lang.Objectです。必要な場合は、java.lang.Stringに設定します。

- サービス・クラスの生成がデフォルトで選択されます。独自のものを記述する場合は選択解除します。

- MAF RESTクラスパス: MCSで使用するAPIを生成しており、プロジェクト・クラスパスおよびランタイム・デプロイメントに依存関係が追加される場合に選択します。

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

8. サービス・クラス・ページで、次の操作を実行します。

- リストされているリクエストと、それが関連付けられているメソッド名を調査します。メソッド名を変更するには、リクエストを選択して「メソッド名」でメソッド名を編集します。

- 新しいリクエストを追加するには、をクリックしてリクエストの選択ダイアログを開きます。1つ以上のリクエストを選択し(複数選択の場合は[Shift]と[Ctrl]を使用)、「OK」をクリックします。

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

9. 「サマリー」ページで、指定したオプションを確認します。問題なければ、「終了」をクリックします。「変更の確認」ダイアログが表示されます。続行して問題ない場合、「OK」をクリックします。

16.7.2 Javaアーティファクトを生成する場合の処理

RESTサービスに対して選択されたリクエスト用にコードが生成されます。アーティファクトをすでに生成済で、差異が存在する場合、「Diff」ウィンドウが表示され、保持する変更を調整できます。

生成されたファイルは、プロジェクト・エクスプローラの指定したパッケージ名の下にリストされます(図16-20を参照)。

16.7.3 RESTサービスに対して生成されるアーティファクトについて

RESTサービス・エディタで、モデル化されたREST APIからJAVAアーティファクトを生成する場合、生成されるパッケージには次の3つのタイプがあります。

- datatypes

- restapi

- services

図16-20は、hrというパッケージに作成された、hrrestというアプリケーション用に生成された複数のパッケージを示しています。

図16-20 生成されたファイル

16.7.3.1 生成されるデータ型アーティファクト

datatypeパッケージ(図16-20のhr.datatype)には、次のものがあります。

- データ型ごとに1つのインタフェース。

- データ型インタフェースは、ゲッターおよびセッターとしてモデル化された属性を公開します。

- データ型のインスタンスはリフレクションをサポートします。

- オブジェクト・ファクトリ。

これは図16-21で確認できます(各データ型のインタフェースとオブジェクト・ファクトリがあります)。

図16-21 生成されたデータ型アーティファクト

データ型インタフェースには、ゲッターとセッターが含まれます。この例では、DepartmentObject.javaに次の内容が含まれます。

public interface DepartmentObject extends ObjectType {
BigDecimal getDepartmentId();
void setDepartmentId(BigDecimal value);
String getDepartmentName();
void setDepartmentName(String value);
BigDecimal getLocationId();
void setLocationId(BigDecimal value);
BigDecimal getManagerId();
void setManagerId(BigDecimal value);
}

16.7.3.2 生成されるREST APIアーティファクト

生成されたREST APIアーティファクトには、リクエストをJavaメソッドとして公開するネストされたインタフェースを含むパス・インタフェースがあります。図16-22のように、複数のREST APIパッケージが生成されます。

図16-22 生成されたREST APIアーティファクト

リクエスト・インタフェースには次のものが含まれます。

- RESTサービスに対する各リクエストのメソッド(createDepartmentJSONなど)

- クラスを公開するInvokeメソッド

たとえば、hr.restapi.hrservice.hrrest.resources.hrappsrvc.departmentsのIdPath.javaには次の内容が含まれます。

public interface IdPath extends PathObject {
@RequestAccessor
public static interface Request {
@Action(HTTPMethod.GET)
@Header(name="Accept", value="application/json")
@Output(representations=@Representation(type=DepartmentsObject.class))
DepartmentsObject getDepartmentById() throws RequestException;
}
@Override
DepartmentsPath parent();
/**
* @return creates a new object that exposes the requests
*         defined for this path
*/
Request invoke();
}

これは、図16-23に示すとおり、RESTサービス・エディタのREST APIページのgetDepartmentsリクエストに反映されます(ここで、HTTPヘッダーはAccept=application/jsonで、出力はデータ型Departmentsの表現です)。

図16-23 REST APIページのgetDepartments

16.7.3.3 生成されるサービス・アーティファクト

生成されたサービス・パッケージ(図16-24を参照)には、リクエストを定義するパスごとに1つのPOJOが含まれます(リクエストを含まないルートは除く)。POJOは、データ・コントロールで使用できるクラスで、他のパッケージのコンテンツを使用する方法に関するガイダンスになります。

図16-24 生成されたサービス・アーティファクト

この例で、DepartmentsService.javaはPOJOであり、REST APIパスのリクエスト・メソッドごとに1つのメソッドが含まれます。

public class DepartmentsService {
public DepartmentsObject getDepartments() throws Exception {
try (ClientContext context = LocalClientContextFactory.INSTANCE.create(ServiceUtil.CONNECTION_NAME)) {
return PathFactory.INSTANCE.createHrservicePath(context).path(context.getConnectionPath())
.getHrrestPath()
.getResourcesPath()
.getHrappsrvcPath()
.getDepartmentsPath()
.invoke()
.getDepartments();
}
}
public DepartmentObject addDepartment(DepartmentObject department) throws Exception {
try (ClientContext context = LocalClientContextFactory.INSTANCE.create(ServiceUtil.CONNECTION_NAME)) {
return PathFactory.INSTANCE.createHrservicePath(context).path(context.getConnectionPath())
.getHrrestPath()
.getResourcesPath()
.getHrappsrvcPath()
.getDepartmentsPath()
.invoke()
.addDepartment(department);
}
}
public DepartmentObject updateDepartment(DepartmentObject department) throws Exception {
try (ClientContext context = LocalClientContextFactory.INSTANCE.create(ServiceUtil.CONNECTION_NAME)) {
return PathFactory.INSTANCE.createHrservicePath(context).path(context.getConnectionPath())
.getHrrestPath()
.getResourcesPath()
.getHrappsrvcPath()
.getDepartmentsPath()
.invoke()
.updateDepartment(department);
}
}
}

16.7.4 生成されたアーティファクトをMAFアプリケーションで使用する方法

MAFアプリケーションがRESTサービスと相互作用できるようにするには、RESTサービス・エディタを使用してREST APIをモデル化し、アプリケーションで使用するアーティファクトを生成します。

データ・ロジックは、生成されたサービスPOJOから作成されるJavaBeanデータ・コントロールを通じて公開されます。

RESTサービス用のJavaBeanデータ・コントロールを作成する手順:

1. 生成されたサービスPOJOを選択します(第16.7.3.3項「生成されるサービス・アーティファクト」を参照)。

2. プロジェクト・エクスプローラまたはパッケージ・エクスプローラで、サービス・ファイルを右クリックしてモデル・コンポーネント→「データ・コントロールの作成」を選択し、新規データ制御ウィザードを開きます。

3. ウィザードを完了します。JavaBeanデータ・コントロールが作成され、それをMAFアプリケーションで使用できます。

16.8 「接続」ビューの使用

「接続」ビューには、MAFアプリケーションのエディタおよびアーティファクト間で共有される、MAFアプリケーションによって定義される接続が表示されます。たとえば、セキュリティのためにRESTクライアントで使用される接続などです。

たとえば、RESTクライアント・ウィンドウで最初に使用される接続をエディタまたはツールで作成し、「接続」ビューを使用して、接続を後で編集したり、MAFアプリケーションの他の場所で接続を再利用します。

図16-25 「接続」ビューのMAFアプリケーション接続

「接続」ビューには、接続をホストできるすべてのプロジェクトがリストされます。このため、MAF 2.0.2ランタイム以降を使用するMAFアプリケーションがビューにリストされます。以前のランタイムを使用するADFアプリケーションまたはMAFアプリケーションはリストされません。図16-25に示すように、アプリケーションのノードの下に接続がリストされます。これらは次のとおりです。

- アイコンを使用するタイプURLの接続。

- HTTP基本、Webシングル・サインオンおよびOAuth2の使用可能な認証タイプのいずれかを使用するモバイル・ログイン接続。これらはを使用します。

接続名をダブルクリックすると、接続の管理ウィザードが開き、接続の様々な設定を編集できます。

これらの接続のコンテンツは、プロジェクトのconnections.xmlに格納され、そのファイルは、「接続」ビューから変更すると更新されます。プロジェクトを削除すると、そのプロジェクトのノードは「接続」ビューから削除されます。

16.8.1 「接続」ビューを開く方法

「接続」ビューは、Oracle MAFパースペクティブで使用できます。閉じている場合は、メイン・メニューから「ウィンドウ」→「ビューの表示」→「接続」を使用して開くことができます。

16.8.2 接続を編集する方法

「接続」ビューで、プロジェクトのノードを展開して、編集する接続をダブルクリックします。

または、接続を選択してをクリックします。

認証の詳細が有効でない場合など、接続が無効の場合、赤の十字が接続のノードに表示されます。接続を編集して正しい詳細を指定できます。

16.8.3 接続を再利用する方法

「接続」ビューで、プロジェクトのノードを展開して、対象の接続を選択します。

接続を再利用するフィールドに接続をドラッグします。

16.8.4 connections.xmlを開く方法

「接続」ビューで、プロジェクトのノードを選択して、をクリックします。

connections.xmlファイルがOEPEソース・エディタで開きます。

17 Oracle Cloudサービスの使用

この章では、モバイル・サービスおよびモバイル・アプリケーションを開発するために、Oracle Mobile Cloud Serviceに接続して使用する方法について説明します。また、Oracle Java Cloud Serviceでホストされるデータへのモバイル・アプリケーションによるアクセス方法についても説明します

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

- 第17.1項「Oracle Cloudサービスの使用の概要」

- 第17.2項「MCSの使用の概要」

- 第17.3項「Oracle Cloudでホストされるデータへのモバイル・アプリケーションによるアクセスの有効化」

17.1 Oracle Cloudサービスの使用の概要

OEPEでOracle Cloudサービスを使用して、特定のセットのアプリケーションをサポートするように設計されているAPIのグループ化を開発およびデプロイできます。

17.2 MCSの使用の概要

Oracle Mobile Cloud Serviceでは、特定のセットのアプリケーションをサポートするように設計されているAPIのグループ化を開発およびデプロイできます。これらのAPIは、MCSモバイル・バックエンドで使用できます。モバイル・バックエンドに関連付けるモバイル・アプリケーションを開発して、これらのAPIにアクセスできます。

図17-1に、Oracle Mobile Cloud Serviceの全体のアーキテクチャと、モバイル・アプリケーションおよびエンタープライズ・サービスでどのように機能するかを示します。

図17-1 MCSアーキテクチャ

MCSのモバイル・バックエンドには、プラットフォームAPI、カスタムAPIおよびコネクタ(RESTなど)が含まれます。

MCSの詳細は、http://cloud.oracle.com/mobileを参照してください

17.2.1 MCSの開始

OEPEにより、MCSバックエンドで提供されるサービスを使用するモバイル・アプリケーションを作成できます。

Oracle Cloudサービスにサインインする前に、資格証明(ユーザー名、パスワードおよびアイデンティティ・ドメイン)を定義するユーザー・アカウントとサービスのアクセス権限が必要です。

Oracle Cloudサービスのトライアル・サブスクリプションのリクエストおよびOracle Cloudサービスのサブスクリプションの購入の詳細は、『Oracle Cloudスタート・ガイド』を参照してください。

Oracle Cloudサービスがアクティブ化されると、指定した管理者にサインイン資格証明とURLが送信されます。管理者は、サービスへのアクセスが必要なユーザーごとにアカウントを作成します。電子メールを確認するか、アカウント資格証明およびサービスURLを管理者に問い合せます。

MCSのサブスクリプションがある場合は、Oracle Enterprise Pack for Eclipseのユーザーズ・ガイドのOracle Cloudサービスの統合に関する項の手順に従い、MCSへの接続を作成します。

17.2.1.1 MAFアプリケーションでのMCSサービスの使用

MCSに作成されたサービスを使用してモバイル・アプリケーションを構築できます。

この場合、通常使用するMCS APIには次のものが含まれます。

- 次のツールAPI:

- アセット・カタログ(API、API実装、モバイル・バックエンド、コネクタ用)

- 通知

- モバイルAPIテスト起動用のUIツール

- ロール、ユーザー名のユーザー管理(サービスのテストに使用)

- 接続API(カスタム・コードからアクセス)

- カスタム・コードからの通知を統合するためのシステムAPI

実行手順は次のとおりです。

1. 使用するAPIを検索します。

2. APIを実装します。

1. scaffoldingをダウンロードします。

2. Javascriptファイルを解凍し、OEPEで開きます。

3. Javascriptファイルのメソッドを編集して、エンドポイントをOEPEに実装します。
使用するカスタム・コードに使用可能なコネクタを取得します。

カスタム・コード内の統合用の通知APIを取得します。

4. scaffoldingを再圧縮し、サービスの実装にアップロードします。

3. モバイル・バックエンドおよびバックエンド・バージョンを選択して、IDEからAPIエンドポイントをテストします。未認証アクセスを許可するようにAPIが設定されていないかぎり、ユーザー名とパスワードを使用する必要があります。

17.2.1.2 MCSモバイル・サービスのモバイル・クライアントの開発

MCSバックエンドで提供されるサービスを使用するモバイル・アプリケーションを作成できます。

- 次のツールAPI:

- アセット・カタログ(API、ポリシー、通知用)

- 記憶域

- モバイルAPIテスト起動用のUIツール

- ロール、ユーザー名のユーザー管理(サービスのテストに使用)

- 記憶域収集用のプラットフォームAPI

- カスタマによってMCSに定義されているサービスのランタイムURLのカスタムAPI

実行手順は次のとおりです。

1. MCSで認証します。

2. Mobile Cloud Service SDKをダウンロードして、プロジェクトを開始します。

3. 使用するモバイル・バックエンドを検索します。

4. URL情報、およびRAMLまたはSwagger記述のいずれかを含む、モバイル・バックエンドに選択したAPIを取得します。

5. モバイル・バックエンドの記憶域収集を取得します。

6. REST APIおよびモバイル・クライアントのJavaクライアントを開発します。

7. OEPEでJavaクライアントをテストします。未認証アクセスを許可するようにAPIが設定されていないかぎり、ユーザー名とパスワードを使用する必要があります

8. モバイル・クライアントを実行およびテストします。

17.2.1.3 モバイル・バックエンドの使用

APIを含むモバイル・アプリケーションのリソースは、モバイル・バックエンドと呼ばれるコンテナに格納されます。モバイル・バックエンド内で、モバイル・バックエンドにアクセスできるアプリケーションを登録し、これらのアプリケーションに使用可能にするPAIを選択します。

複数のバックエンドが使用可能で、それぞれアプリケーションのセットが提供されます。その他にも、複数のバックエンドで使用されるAPIを使用できます。

アプリケーションがMCS経由でAPIにアクセスすると、常にモバイル・バックエンドのコンテキストに存在します。アプリケーションは、モバイル・バックエンドの資格証明および、ユーザー名とパスワード(または匿名アクセス・キー)で認証します。コールされたAPIに、バックエンド内の他のAPIへのコールが含まれている場合、コール元のアイデンティティおよび資格証明はコールのチェーンを通して伝播されます。

モバイル・バックエンドの詳細およびOracle Mobile Cloud Serviceをプラットフォームとして使用する方法の詳細は、『Oracle Mobile Cloud Serviceの使用』のOracle Mobile Cloud Serviceの使用に関する項を参照してください

17.2.1.4 REST APIのインポート

REST APIを使用するには、RAML定義をMCS APIからインポートする必要があります。このためには2つの方法があります。

- 「Oracle Cloud」ビューの接続から。

- RESTサービス・エディタを使用。

始める前に:

「Oracle Cloud」ビューではOEPEからMCSの接続が必要です。

17.2.1.4.1 「Oracle Cloud」ビューからのREST APIのインポート

定義をインポートする手順:

1. 「Oracle Cloud」ビューで、接続およびOracle Cloudサービスを展開します。
定義をAPIからインポートするには、そのノードを展開して、対象のAPIを表示します。

定義をMCSモバイル・バックエンドからインポートするには、図17-2に示すように、そのノードを展開し、対象のバックエンドを選択してAPIノードを表示します。

図17-2 REST APIのインポート

2. 右クリックして「定義のインポート」を選択します。
「定義のインポート」ダイアログが開きます。

3. ウィザードのRESTサービス記述で、RESTサービス記述ファイルが作成される親フォルダを選択し、ファイル名を入力します。

4. バックエンド情報ページで、APIに関連付けられているバックエンドを選択します。このページには、基本認証が有効になっている場合に、匿名アクセスがサポートされているかどうかが表示されます。
APIノードからAPIを選択した場合は、APIに関連付けられているもののリストからバックエンドを選択します。

特定のバックエンドからAPIを選択した場合、そのバックエンドが表示され、変更できません。

5. RAMLプレビュー・ページでは、REST APIのインポート中に使用するオプションを選択できます。これには次のものがあります。

- (APIからインポートする場合のみ) RAML定義を既存のRESTサービス記述ファイルにインポートしているときに競合が発生した場合に、使用するメソッドです。
マージ: 既存のメソッドをRAML定義からの新しいメソッドとマージする必要がる場合に使用します。

置換: 新しいメソッドで既存のメソッドを置き換える必要がある場合に使用します。

作成: 既存のメソッドと競合がある場合に、新しい名前で新しいメソッドを作成する必要がある場合に使用します。

- インポートするリソースおよびメソッド。ウィザードには、APIのRAML定義の情報から作成されたツリーが表示されます。デフォルトでは、すべてのリソースおよびメソッドが選択されます。インポートしないものの選択を解除します。

- ベースURIを編集して、情報をconnections.xmlに格納する場合は、接続ウィザードを起動できます。接続ウィザードは、「終了」をクリックすると開きます。
接続ウィザードには、RESTサービス記述のルート・パスを作成するために、MCS APIからフェッチされたデータが移入され、ウィザードで定義された接続が使用されます。

17.2.1.4.2 RESTサービス・エディタを使用したREST APIのインポート

RAML定義を次からインポートできます。

- Mobile Cloud ServiceバックエンドのAPI。Oracle Mobile Cloud Serviceへの接続が必要です。

- RAMLファイル。

RESTサービス・エディタの詳細は、第16項「RESTサービスの使用」を参照してください。

REST APIをインポートする手順:

1. 図17-3に示すように、RESTサービス・エディタのREST APIタブで、をクリックして、APIまたはデータのインポート・ダイアログを開きます。

図17-3 RAML定義のインポート

2. RAML定義のソース(モバイル・バックエンドまたはRAMLファイル)を選択します。

3. 「次へ」をクリックしてウィザードを完了します。

- モバイル・バックエンド。
バックエンド情報ページで、APIに関連付けられているバックエンドを選択します。このページには、基本認証が有効になっている場合に、匿名アクセスがサポートされているかどうかが表示されます。

APIノードからAPIを選択した場合は、APIに関連付けられているもののリストからバックエンドを選択します。

特定のバックエンドからAPIを選択した場合、そのバックエンドが表示され、変更できません。

- RAMLファイル。RAML定義を含むファイルをファイル・システムから選択します。

4. RAMLプレビュー・ページでは、REST APIのインポート中に使用するオプションを選択できます。これには次のものがあります。

- RAML定義を既存のRESTサービス記述ファイルにインポートしているときに競合が発生した場合に、使用するメソッドです。
マージ: 既存のメソッドをRAML定義からの新しいメソッドとマージする必要がる場合に使用します。

置換: 新しいメソッドで既存のメソッドを置き換える必要がある場合に使用します。

作成: 既存のメソッドと競合がある場合に、新しい名前で新しいメソッドを作成する必要がある場合に使用します。

- インポートするリソースおよびメソッド。ウィザードには、APIのRAML定義の情報から作成されたツリーが表示されます。デフォルトでは、すべてのリソースおよびメソッドが選択されます。インポートしないものの選択を解除します。

- ベースURIを編集して、情報をconnections.xmlに格納する場合は、接続ウィザードを起動できます。接続ウィザードは、「終了」をクリックすると開きます。
接続ウィザードには、RESTサービス記述のルート・パスを作成するために、MCS APIからフェッチされたデータが移入され、ウィザードで定義された接続が使用されます。

17.3 Oracle Cloudでホストされるデータへのモバイル・アプリケーションによるアクセスの有効化

モバイル・アプリケーションでは、Webサービス・データ・コントロールを作成してRESTful Webサービスにアクセスできます。コンテンツ・タイプにより、第11.3.2項「MAF AMXページへのUIコンポーネントおよびデータ・コントロールの追加方法」の説明に従い、データ・コントロールをドラッグしてMAF AMXユーザー・インタフェースにドロップするか、コンテンツがリモートWebサーバーまたはローカルに格納されたHTMLファイルのいずれかから配信されるアプリケーションの場合はプログラムによって、モバイル・アプリケーションによるクラウド・データへのアクセスが可能になります。

17.3.1 Oracle Cloudの認証方法

「MAFログイン・サーバー接続」ダイアログを使用して、Oracle Cloudに対して認証するためのログイン・サーバー接続を作成します。

始める前に:

ログイン・サーバー接続に使用するOracle Cloud URLを取得します。

Oracle Cloudのエンド・ポイントを使用してログインURLを作成するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを展開してMAFを展開し、MAFアプリケーション・エディタをダブルクリックします。

2. エディタで、アウトラインの「セキュリティ」を選択し、デフォルト・ログイン・サーバーの横の「作成」をクリックします。

3. 図17-4に示すように、「接続名」フィールドに接続の名前を入力することで、モバイル・ログイン・サーバー接続ダイアログの「一般オプション」ページの入力を完了します。

図17-4 Oracle Cloudへのログインの作成

4. 「次へ」をクリックします。HTTP基本オプション・ページで、Oracle CloudのURLを「ログインURL」フィールドに入力します。
「テスト」をクリックして接続をテストします。

詳細は、第29.6.2項「ログイン・ページの指定方法」を参照してください。

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

データ・サービス・コントロールの作成ウィザードでは、ホストされたデータにアクセスするデータ・コントロールを作成できます。Oracle Java CloudにデプロイされたWebサービスのWSDL URLを使用して、このデータ・コントロールを作成します。このURLがわからない場合は、アプリケーションのコンテキスト・ルートにWebサービスのポート名および?wsdlを追加して、WSDLドキュメントへのURLを作成する必要があります。

始める前に:

Oracle Java Cloud ServiceにデプロイされているWebサービス・アプリケーションへのアクセス権を持つ必要があります。このアプリケーションは、Oracle Java Cloud Service Controlホームページにある「アプリケーション」ペインを経由して利用可能にする必要があります。さらに、図17-5のHCMMobileServiceアプリケーションで示されるように、その「ステータス」および「状態」それぞれが「↑」および「アクティブ」である必要があります。

図17-5 Java Cloud Services Controlホームページ

Webサービス・データ・コントロールを作成するには:

1. Oracle Cloud上でホストされたWebサービスのアプリケーション・コンテキスト・ルートを次のように取得します。

1. 「アプリケーション」ペイン(図17-5に表示)のアプリケーションをクリックして、図17-6に示されるアプリケーションのホームページに移動します。

2. 図17-6に示すように、URLをコピーします。このURLは、WSDLドキュメントのアプリケーション・コンテキスト・ルートになります。

図17-6 Webサービスのアプリケーション・コンテキスト・ルートのコピー

2. 「ファイル」→「新」→「その他」を選択して、「新」ダイアログを開きます。

3. 「Oracle」→「モバイル・アプリケーション・フレームワーク」を展開し、「データ・コントロール」を選択して「次へ」をクリックします。

4. 図17-7に示すように、「新規データ制御」ウィザードでプロジェクトを選択し、「Webサービス」を「タイプ」として選択します。

図17-7 データ・コントロールの作成

5. 図17-8に示すように、「URL」の横のをクリックして、データ・コントロール・ソース・ダイアログを開きます。

図17-8 WSDLドキュメントのURLの入力

6. 「URL」フィールドで、Oracle Cloud Java Serviceにデプロイされている(さらに現在実行されている) WebサービスのURLを貼り付けて「OK」をクリックし、「データ・コントロール・ソース」ページで「次へ」をクリックします。

7. ウィザードのデータ・コントロールの詳細ページで、新規データ・コントロールのIDを設定し、「次へ」をクリックします。

8. ウィザードの「Webサービス・データ・コントロール」ページで、目的のサービスを選択し、「次へ」をクリックします。

9. ウィザードの「サマリー」ページで、選択したオプションを確認し、「終了」をクリックします。

17.3.2.1 Webサービスにおけるポリシーの構成

Oracle Cloud上で保護されるWebサービスに対してポリシーを構成する必要があります。第15.3項「セキュアなWebサービスへのアクセス」の説明に従い、データ・サービス・コントロール・ポリシーの編集ダイアログを使用して、oracle/wss_http_token_over_ssl_client_policyを選択できます。この(および他の)ポリシーの詳細は、Oracle Fusion Middleware Oracle Web Services Managerを使用したWebサービスの保護とポリシーの管理の「使用する優先ポリシーの決定」および「事前定義済ポリシー」の各章を参照してください。

17.3.3 Oracle Java Cloud Serviceにアクセスするモバイル・アプリケーションをデプロイする場合の処理

アプリケーションをデプロイすると、Webサービス・データ・コントロールの操作によって、Oracle Java Cloud Serviceインスタンス上で実行されるWebサービスからデータが取得されます。

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

この章では、カスタムMAF AMX UIコンポーネントの作成方法および開発環境の一環としてそれらを指定する方法について説明します。

この章には次の項が含まれます:

- 第18.1項「カスタムUIコンポーネントの作成の概要」

- 第18.2項、「MAF APIを使用したカスタム・コンポーネントの作成」

- 第18.3項「カスタム・コンポーネントの作成」

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

JavaScriptおよびMAFで提供されるAPIの組合せを使用して、新しい完全に機能するインタラクティブUIコンポーネントを作成でき、MAF AMXアプリケーション機能で使用されるタグ・ライブラリにそれらを追加できます。

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

MAFには、カスタム・コンポーネントを作成するための次のAPIが用意されています。

- 静的API (第18.2.1項「静的APIの使用方法」を参照)

- AmxEventクラス(第18.2.2項「AmxEventクラスの使用方法」を参照)

- TypeHandler (第18.2.3項「TypeHandlerの使用方法」を参照)

- AmxNode (第18.2.4項「AmxNodeの使用方法」を参照)

- AmxTag (第18.2.5項「AmxTagの使用方法」を参照)

- VisitContext (第18.2.6項「VisitContextの使用方法」を参照)

- AmxAttributeChange (第18.2.7項「AmxAttributeChangeの使用方法」を参照)

- AmxDescendentChanges (第18.2.8項「AmxDescendentChangesの使用方法」を参照)

- AmxCollectionChange (第18.2.9項「AmxCollectionChangeの使用方法」を参照)

- AmxNodeChangeResult (第18.2.10項「AmxNodeChangeResultの使用方法」を参照)

- AmxNodeStates (第18.2.11項「AmxNodeStatesの使用方法」を参照)

- AmxNodeUpdateArguments (第18.2.12項「AmxNodeUpdateArgumentsの使用方法」を参照)

18.2.1 静的APIの使用方法

表18-1に、カスタムUIコンポーネントの作成に使用できる静的APIをリストします。

表18-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は、start、drag、endの3つのメンバー関数を定義します。各関数の最初のパラメータは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 finishedCallback

AmxEventを処理します。

attributeValueNameが定義されている場合は値を変更し、適切なsetPropertyListenerサブタグおよびactionListenerサブタグを処理した後に[amxEventType]Listener属性を処理します。完了コールバックが指定されている場合は、イベントが処理されると起動されます。

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などのtapHold、swipeなどのカスタムMAF AMXイベントのトリガーを許可します。

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

オブジェクトのJavaScript配列またはツリー・ノード・イテレータ(コレクション・モデル)を反復するイテレータのいずれかをサポートするイテレータを作成します。

next、hasNextおよびisTreeNodeIteratorの関数でイテレータのObjectを返しますが、ここで、これ以上のオブジェクトが使用可能でない場合にnextは未定義を返します。

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インスタンスに対して、ユーザー変更に起因する新しいスタンプの追加が許可されます。AmxNodeのレンダリングの準備ができると、refreshメソッドはAmxNode上で指定されたプロパティを使用してコールされます。AmxNodeでレンダリングの準備が完了していない場合は、MAFはすべてのELが解決されるまで待機し、すべてのデータが使用可能になるとrefreshメソッドがコールされます。

注意:
その他のパブリックAPIはadf.mf.elパッケージにあり、ロギング、変換およびデータ・チャネルに使用できます。

18.2.2 AmxEventクラスの使用方法

表18-2に、カスタムUIコンポーネントの作成時に使用できるAMXEventクラスをリストします。

表18-2 AMXEventクラス

クラス名

パラメータ

説明

adf.mf.api.amx.ActionEvent

なし

結果ベースのナビゲーションをトリガーするイベント。

Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.ActionEventも参照してください。

adf.mf.api.amx.MoveEvent

Object rowKeyMoved,

Object rowKeyInsertedBefore

指定された行が移動されたことを通知するイベント。移動された行のキーが、これが挿入される前の行のキーとともに含まれています。

Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.MoveEventも参照してください。

adf.mf.api.amx.SelectionEvent

Object oldRowKey,

Array<Object> selectedRowKeys

コンポーネントの選択の変更についてのイベント。

Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.SelectionEventも参照してください。

adf.mf.api.amx.ValueChangeEvent

Object oldValue,

Object newValue

コンポーネントの値の変更についてのイベント。

Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.ValueChangeEventも参照してください。

18.2.3 TypeHandlerの使用方法

表18-3に、カスタムUIコンポーネントの作成に使用できるTypeHandlerのAPIをリストします。

表18-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の子を選択的に追加します。子のうちの1つが表示されている場合、この関数を使用すると他の子が処理されないことに注意してください。

カスタム実装ではなく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

新しいビューが表示された後および古いビューが削除された後のすべてを処理します。

18.2.4 AmxNodeの使用方法

表18-4に、カスタムUIコンポーネントの作成に使用できるAmxNodeのAPIをリストします。

表18-4 AmxNode API

String

関数名

パラメータ

説明

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を取得します(使用できない場合は未定義)。

void

setVolatileState

Object payloadJsonObject

指定されたAmxNode IDのクライアント状態を格納および置換します。揮発状態変更が発生した場合に、タイプ・ハンドラはこの関数をコールする必要があります(たとえば、新しいMAF AMXページに移動する際に無視する必要があるが、コンポーネントの再描画に備えて保持する必要のあるもの)。

payloadJsonObjectは、ナビゲーションが発生するまで格納する揮発状態データです。

Object

getVolatileState

なし

最後のナビゲーション以降にsetVolatileState関数を介して以前に格納されたpayloadJsonObjectを取得します(使用できない場合は未定義)。

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の場合があります。

属性が設定されていないかまだロードされていない場合は、未定義が返されます。

void

setAttributeResolvedValue

String name,

Object value

AmxNode上の属性の属性値を格納するためにタイプ・ハンドラまたはMAFによって使用されます。

この関数はモデルを更新しません。

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は、Booleanのtrue(子の作成にタグが使用される)またはfalse(タグは処理されない)を返す必要があります。

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をレンダリングします。

レンダリングされたルート要素または子がレンダリングされていない場合やこのAmxNodeのタイプ・ハンドラがない場合はnullが返されます。

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の場合、タグは処理されません。

18.2.5 AmxTagの使用方法

表18-5に、カスタムUIコンポーネントの作成に使用できるAmxTagのAPIをリストします。

表18-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文字列の場合があります)を取得します。

属性が指定されていない場合は、未定義が返されます。

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

このタグのAmxNodeの新しいインスタンスを指定されたスタンプIDで作成します。

タグがファセット・タグの場合、このタグは子タグのAmxNodeを作成します。

この関数はAmxNodeを初期化しません。かわりに、初期化されていないAmxNodeまたは非UIタグの場合はnullを返します。

adf.mf.api.amx.TypeHandler

getTypeHandler

なし

このタグのタイプ・ハンドラを取得します。

18.2.6 VisitContextの使用方法

表18-6に、カスタムUIコンポーネントの作成時に使用できるVisitContextのAPIをリストします。

表18-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を返す場合があります。

18.2.7 AmxAttributeChangeの使用方法

表18-7に、カスタムUIコンポーネントの作成時に使用できるAmxAttributeChangeのAPIをリストします。

表18-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

なし

属性の変更数を取得します。

18.2.8 AmxDescendentChangesの使用方法

表18-8に、カスタムUIコンポーネントの作成時に使用できるAmxAttributeChangeのAPIをリストします。

表18-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の状態を取得します。

18.2.9 AmxCollectionChangeの使用方法

表18-9に、カスタムUIコンポーネントの作成時に使用できるAmxCollectionChangeのAPIをリストします。

表18-9 AmxCollectionChange API

戻り型

関数名

パラメータ

説明

Boolean

isItemized

なし

コレクションに対する変更が項目化される可能性があるかどうかを特定しますが、そのコレクションのキーおよび要素は識別されているため、TypeHandlerは、リスト全体を最初から再レンダリングするのではなく、適切な項目のみを更新できます。

Array<String>

getCreatedKeys

なし

作成されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getDeletedKeys

なし

削除されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getUpdatedKeys

なし

更新されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getDirtiedKeys

なし

ダーティな状態のキーの配列、または変更を項目化できない場合はnullを取得します。

18.2.10 AmxNodeChangeResultの使用方法

表18-10に、カスタムUIコンポーネントの作成時に使用できるAmxNodeChangeResultのAPIをリストします。

表18-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メソッドからは返すことができません。

18.2.11 AmxNodeStatesの使用方法

表18-11に、カスタムUIコンポーネントの作成時に使用できるAmxNodeStates APIを示します。

表18-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はレンダリングされません。

18.2.12 AmxNodeUpdateArgumentsの使用方法

表18-12に、カスタムUIコンポーネントの作成時に使用できるAmxNodeUpdateArgumentsのAPIをリストします。

表18-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に変更がない場合は未定義が返されます。

void

setAffectedAttribute

adf.mf.api.amx.AmxNode amxNode,

String attributeName

AmxNodeの属性を影響を受けたとマークします。

void

setCollectionChanges

String amxNodeId,

String attributeName,

adf.mf.api.amx.AmxCollectionChange collectionChanges

指定されたAmxNodeの属性のコレクション変更を設定します。

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

JavaScriptおよびMAF APIを使用して、カスタムUIコンポーネントを作成できます。このコンポーネントのJavaScriptファイルは、アプリケーション機能レベルの包含を介して、プロジェクトに追加できます。カスタム・タグ・ライブラリを追加すると、「コンポーネント」ウィンドウのタグ・ライブラリのリストに組み込まれ、このライブラリが選択されると、カスタム・コンポーネントが「コンポーネント」ウィンドウで使用可能になり、その属性が「プロパティ」ウィンドウに表示されます。

始める前に:

第18.2項、「MAF APIを使用したカスタム・コンポーネントの作成」に記載されているAPIを確認してください。

カスタム・コンポーネントを作成するには、次の手順を実行します。

1. adf.mf.api.amx.TypeHandler.register APIを使用して、タグ・ネームスペースおよび一連の1つ以上のタイプ・ハンドラを登録するJavaScriptファイルを作成します(表18-1「静的API」およびこの項の後続の例を参照)。

2. タイプ・ハンドラごとにレンダリング・メンバー関数を実装します。

3. オプションで、その他の関数を実装します。

4. 1つ以上のJavaScriptファイルおよびCSSファイルをMAF AMXアプリケーション機能にアタッチします。たとえば、「ファイル」→「新」→「MAFサンプル」にある次のサンプル・アプリケーションを参照してください。

- CompGalleryというMAFサンプル・アプリケーションに含まれているcustom.jsファイルおよびcustom.cssファイル。

- WorkBetterサンプル・アプリケーションには、カスタムの検索コンポーネントが含まれています。

または、デザインタイム・パッケージングを実行できます。

5. カスタム・コンポーネントのうちの1つを使用するMAF AMXページごとに、次のようにxmlnsエントリをview要素に追加します。

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の各ファイルを参照してください。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

この章では、MAFモバイル・アプリケーションを使用したローカルSQLiteデータベースの使用方法について説明します。

この章には次の項が含まれます:

- 第19.1項「ローカルSQLiteデータベースの使用方法の概要」

- 第19.2項「ローカルSQLiteデータベースの使用方法」

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

SQLiteは、特に埋込みアプリケーション用に設計されたリレーショナル・データベース管理システム(RDBMS)です。

SQLiteには次の特性があります。

- ACID準拠: 他の従来のデータベース・システムと同様に、原子性、一貫性、独立性および永続性という特性を備えています。

- 軽量: アプリケーション内に直接埋め込むように設計された小さなCライブラリでデータベース全体が構成されています。

- 移植性: 様々な範囲のコンピュータ・アーキテクチャおよびオペレーティング・システム間でバイナリ互換性がある単一ファイルでデータベースは自己完結型となります。

詳細は、SQLite Webサイト(http://www.sqlite.org)を参照してください。

ローカルSQLiteデータベースの使用例は、StockTrackerと呼ばれるMAFのサンプル・アプリケーションを参照してください(「ファイル」→「新」→「MAFサンプル」にあります)。詳細は、第19.2.8項「StockTrackerサンプル・アプリケーションに関する必知事項」を参照してください。

19.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)

19.1.1.1 同時実行性

SQLiteデータベースの単一インスタンスは、常に、単一の読取り/書込み接続または複数の読取り専用接続のいずれかを持つことができます。

ロック・メカニズムが粗いため、SQLiteでは、同一のデータベース・インスタンスに対する複数の読取り/書込み接続がサポートされていません。詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『File Locking And Concurrency In SQLite Version 3』(http://www.sqlite.org/lockingv3.html)を参照してください。

19.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)を参照してください。

19.1.1.3 データ型

大部分のデータベース・システムは強く型指定をしているのに対して、SQLiteは動的な型指定のため、宣言された型とは無関係にどの列にどの値を格納することもできます。たとえば、数値列に文字列値が間違って格納された場合でも、SQLiteではエラーは戻されません。詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『Datatypes In SQLite Version 3』(http://www.sqlite.org/datatype3.html)を参照してください。

19.1.1.4 外部キー

SQLiteは外部キーをサポートします。これは、外部キー制約を解析および強制します。詳細は、http://www.sqlite.org/foreignkeys.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『SQLite Foreign Key Support』を参照してください。

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

SQLiteはACID準拠であるためトランザクションをサポートしていますが、SQLiteとOracleのトランザクション・サポートの間には基本的な相違点がいくつか存在します。

- ネストされたトランザクション: SQLiteでは、ネストされたトランザクションをサポートしません。単一のトランザクションのみを常時アクティブにできます。

- コミット: SQLiteは、任意の指定されたデータベースに対し、複数の読取り専用接続または単一の読取り/書込み接続のいずれかを許容します。したがって、同一のデータベースに対して複数の接続がある場合は、データベースの変更を試みる最初の接続のみが成功します。

- ロールバック: SQLiteでは、開いているすべてのResultSetsを閉じるまではトランザクションのロールバックができません。

詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『Distinctive Features of SQLite』(http://www.sqlite.org/different.html)を参照してください。

19.1.1.6 認証

SQLiteでは、ロールベースまたはユーザーベースの認証はどの形式もサポートしていません。デフォルトで、どのユーザーもファイル内のすべてのデータにアクセスできます。ただし、MAFでは、使用可能な暗号化ルーチンを提供することで、データを保護し、有効な資格証明セットを持たないユーザーによるアクセスを防ぎます。詳細は、第19.2.7項「データベースの暗号化および復号化する方法」を参照してください。

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

MAFには、暗号化されたSQLite 3.7.9データベースが含まれています。

通常SQLiteを使用する場合は、次のことを知っておく必要があります。

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

- SQLスクリプトを使用してデータベースを初期化する方法またはデスクトップ上でデータベースを初期化する方法

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

- VACUUMコマンドの使用方法

19.2.1 データベースへの接続方法

SQLiteデータベースへの接続は、Oracleデータベースへの接続を開く場合とは少し異なります。つまり、最初の接続を取得すると、同じJDBC APIおよびSQL構文の大部分が使用可能になり、データベースの問合せと変更が可能になります。

ユーザーのアプリケーションに関連付けられたjava.sql.Connectionオブジェクトを使用して、SQLiteデータベースに接続します。接続を作成する場合は、どのSQLite JDBC URLもjdbc:sqlite:というテキストで始まるようにします。

次の例は、暗号化されていないデータベースと接続を開く方法を示しています。

java.sql.Connection connection = new SQLite.JDBCDataSource
("jdbc:sqlite:/path/to/database").getConnection();

次の例は、暗号化されたデータベースと接続を開く方法を示しています。

java.sql.Connection connection = new SQLite.JDBCDataSource
("jdbc:sqlite:/path/to/database").getConnection(null,"password");

前述の例では、getConnectionメソッドの最初のパラメータがユーザー名となっていますが、SQLiteではユーザーベースのセキュリティがサポートされないため、この値は無視されます。

注意:
SQLiteでは、不正なパスワードで暗号化されたデータベースを開いた場合でも、エラー・メッセージが表示されません。同様に、暗号化されていないデータベースをパスワードで誤って開いた場合でも警告は表示されません。そのかわりに、データの読取りまたは変更を試みた場合は、「エラー: ファイルが暗号化されているか、ファイルがデータベースではありません。」というメッセージとともにSQLExceptionがスローされます。

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

通常、アプリケーションの起動時にSQLスクリプトを使用してデータベースを初期化できます。次の例は、サポートされたSQL構文(第19.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アプリケーションのアプリケーション・プロジェクトにリソースとして追加します。サンプル・スクリプトは、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);
}
}

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

SQLiteデータベースは自己完結型でプラットフォーム間のバイナリ互換性があるため、同じデータベース・ファイルをiOS、Android、Windows、LinuxおよびMac OSの各プラットフォームで使用できます。複雑なケースでは、サード・パーティのツール(MesaSQLite、SQLiteManager、SQLite Database Browserなど)を使用してデスクトップ上でデータベースを初期化し、結果ファイルをアプリケーション内のリソースとしてパッケージ化できます。

データベースを使用するには、そのデータベースをMAFアプリケーションのアプリケーション・プロジェクトにリソースとして追加します。データベースは、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);
}
}

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

Commit文があってもこれは無視されます。各文は、SQLスクリプトから読み込まれる際にコミットされます。この自動コミット機能は、SQLiteデータベースによってデフォルトで提供されます。アプリケーションのパフォーマンスを向上させるには、自動コミットを無効にして、ConnectionのsetAutoCommit(false)メソッドを使用することによるcommit文の通常の実行を可能にします。

19.2.5 MAFでのSQLite JDBCドライバの制限

java.sqlパッケージからの次のメソッドは、MAF内では制限があるか、サポートされていません。

- ResultSetのgetByteメソッドはサポートされていません。このメソッドを使用した場合は、実行時にメソッドからSQLExceptionがスローされます。

- (ResultSetを戻す文に対してのみtrueを戻すのとは対照的に)Statementのexecuteメソッドは常にtrueを戻します。

19.2.6 VACUUMコマンドの使用方法

SQLiteデータベースからレコードが削除される場合、そのサイズは変更されません。これにより断片化が発生し、最終的にはパフォーマンスが低下します。これを防ぐには、定期的にVACUUMコマンドを実行します。

注意:
大規模なデータベースに対してVACUUMを実行すると、非常に長い時間がかかる場合があります(SQLiteが開発されたLinuxコンピュータで1MB当たり約0.5秒)。さらに、このコマンドの実行中は、元のファイルの2倍の一時ディスク領域が使用されます。

通常、VACUUMコマンドは、適切に登録されているLifeCycleListener実装から実行されます。

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

MAFでは、初期またはそれ以降に各種APIを使用して暗号化したSQLiteデータベースを提供できます。一部のAPIでは、データベースの暗号化に独自のパスワードを指定できます。MAFにパスワードを生成させる場合、または(オプションで)管理させる場合は、他のAPIを使用します。

独自のパスワードでデータベースを暗号化するには、次の手順を実行します。

1. データベース接続を確立します(第19.2.1項「データベースへの接続方法」を参照)。

2. 次のユーティリティ・メソッドを使用して、新しいキーでデータベースを暗号化します。

AdfmfJavaUtilities.encryptDatabase(connection, "newPassword");

独自のパスワードで暗号化されたデータベースを永久的に復号化するには、次の手順を実行します。

1. 正しいパスワードを使用して暗号化されたデータベースを開きます。

2. 次のユーティリティ・メソッドを使用します。

AdfmfJavaUtilities.decryptDatabase(connection);

注意:
データベースを不正に開いて(不正なパスワードを使用して暗号化されたデータベースを開くなど)、再び暗号化した場合は、以前の正しいパスワード、不正なパスワード、新しいパスワードのいずれでもデータベースのロックを解除できなくなり、取り返しのつかないデータの損失につながります。

MAF生成のパスワードでデータベースを暗号化するには、次の手順を実行します。

1. 次のメソッドを使用して、パスワードを生成します。

GeneratedPassword.setPassword("databasePasswordID", "initialSeedValue");

このメソッドには、暗号化機能が強力なパスワードを生成できるように、一意の識別子および初期シード値の両方が必要です。

2. 次のように事前に指定したIDを使用して、作成されたパスワードを取得します。

char[] password = GeneratedPassword.getPassword("databasePasswordID");

3. データベース接続を確立します(第19.2.1項「データベースへの接続方法」を参照)。

4. データベースを次のように暗号化します。

AdfmfJavaUtilities.encryptDatabase(connection, new String(password));

データベースを復号化して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");

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

StockTrackerサンプル・アプリケーションは、このアプリケーション内にパッケージ化されているカスタムのSQLiteデータベース・ファイルを使用します。このデータベース・ファイルには4つのレコードが含まれた表があり、そこには4つの株価に関する情報が含まれてます。アプリケーションがアクティブ化されると、表からデータを読み取り、4つの株価を表示します。この株価に関する情報はCRUD操作の対象となるため、ユーザー・インタフェースから、株価を作成、並替え、更新および削除できます。株価の並替えを含むすべてのCRUD操作は、SQLiteデータベースで更新されます。

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

この章では、デバイス・サービスに対して、リモートURLからのコンテンツを使用するアプリケーション機能をアクセス可能(または制限可能)にする方法について説明します。また、MAFにホワイトリストを実装する方法、およびMAFアプリケーションのWebビューでレンダリングされるリモートURLページ上でナビゲーション・バーを有効にする方法についても説明します。

この章には次の項が含まれます:

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

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

- 第20.3項「MAFアプリケーションでのリモートURLのホワイトリストへの追加」

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

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

図20-1のように、MAF機能エディタでアプリケーション機能のコンテンツ・タイプをリモートURLとして構成することで、指定されたURLから供給されるブラウザベースのアプリケーションを作成します。このようなサーバー・ホスト型のアプリケーションは、偶発的な使用を目的としている点およびデバイスのメモリーまたはサービス(カメラ、コンタクト先、GPSなど)に直接アクセスできない点で、MAF AMX、ローカルHTML、またはObjective-Cなどのプラットフォーム固有言語で記述されたクライアント・アプリケーションとは異なります。そのかわりに、これらのやり取りはデバイス・ブラウザの機能に左右されます。リモートURLコンテンツの構成の詳細は、第5.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」を参照してください。

図20-1 リモートURLコンテンツの構成

20.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をローカルに解決してネイティブ・リクエストとして処理します。

<script src="http://your.domain.ip/~maf.device~/www/js/base.js"></script>

your.domain.ipは、リモートURLからのドメインです。

次に、MAFがコンテナ・コード内のファイル・システムからファイルを読み取って、ローカル・ファイル・コンテンツをWebビューに送信します。

すでに説明したように、仮想パス/~maf.device~/の使用に加え、そのコンテンツ・タイプとしてリモートURLのアプリケーションを指定するアプリケーション機能のmaf-application.xmlファイルで、ネイティブ・アクセスを許可するプロパティ(allowNativeAccess)がデフォルト値のtrueに設定されていることを確認します。次の例は、maf-application.xmlソース・ファイル内のこのプロパティを示しています。

<adfmf:featureReference refId="remoteAppfeature1" id="fr1" allowNativeAccess="true"/>

このプロパティがfalseの場合、リモートURLアプリケーション機能はコンテナ・サービスにアクセスできません。

20.3 MAFアプリケーションでのリモートURLのホワイトリストへの追加

リモートURLアプリケーション機能にコンテナ・サービスへのアクセスを許可し、サービスにアクセスできるURLのリストを制限する場合に、ホワイトリストを使用します。

このタスクを実行することを一般に、ホワイトリストに追加すると言います。たとえば、図20-2には、http://www.oracle.comをレンダリングするリモートURLアプリケーションが示されています。図20-2のオンデマンドでWebcastを見るリンクを使用すると、oracle.com以外のURLにナビゲートされると仮定します。oracle以外のURLにコンテナ・サービスへのアクセスを許可した場合、そのURLがどのようなアクションを実行するかわからず、また信頼できないため、これは望ましくありません。MAFアプリケーションでホワイトリストを実装すると、oracle.com URLへのアクセスを制限し、リモートURLアプリケーション機能にコンテナ・サービスへのアクセスを許可している場合に、信頼できないURLがコンテナ・サービスにアクセスできないようにすることができます。

MAFアプリケーションでホワイトリストを実装する場合は、Cordovaプラグインを使用します。Cordovaプラグインによるホワイトリストの実装方法の概要は、Apache Cordovaのドキュメント(https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/index.html)でホワイトリストのガイドを参照してください。

Apache Cordovaからは、AndroidにデプロイするMAFアプリケーションでホワイトリストを実装するように構成できるプラグイン(cordova-plugin-whitelist)が提供されています。このプラグインをダウンロードし、変更し、ホワイトリスト・エントリを構成して、MAFアプリケーションに登録します。iOSおよびUWPの場合は、自分で開発または変更したプラグインのplugin.xmlでホワイトリスト・エントリを構成します。

ヒント:
Android用のApache Cordovaプラグイン(cordova-plugin-whitelist)のplugin.xmlファイルを、Android、iOSおよびUWPそれぞれについてホワイトリスト・エントリを使用して構成します。このアプローチでは、MAFアプリケーションをデプロイするすべてのプラットフォームのホワイトリストを実装する1つのプラグインをMAFアプリケーションに登録します。次の各項では、各プラットフォームのホワイトリストの実装方法を示す、サンプルplugin.xmlエントリを示します。

具体的な情報は次のリンクを参照してください。

- Androidプラットフォームは、第20.3.1項「AndroidプラットフォームでリモートURLをホワイトリストに追加する方法」を参照してください。

- iOSプラットフォームは、第20.3.2項「iOSプラットフォームでリモートURLをホワイトリストに追加する方法」を参照してください。

- ユニバーサルWindowsプラットフォームは、第20.3.3項「ユニバーサルWindowsプラットフォームでリモートURLをホワイトリストに追加する方法」を参照してください。

図20-2 MAF WebビューのリモートURL

20.3.1 AndroidプラットフォームでリモートURLをホワイトリストに追加する方法

AndroidにデプロイするMAFアプリケーションでホワイトリストを実装するには、Cordovaプラグインを作成します。

または、cordova-plugin-whitelistプラグインをダウンロードして、次のように変更します。

- テキスト・エディタでファイルsrc/android/WhitelistPlugin.javaを開きます。

- 次の各メソッドで、return null;をreturn false;に変更します。

- shouldAllowNavigation(String url)

- shouldAllowRequest(String url)

- shouldOpenExternalUrl(String url)

- 変更したファイルを保存します

plugin.xmlファイルでホワイトリスト・エントリを構成し、このファイルをMAFアプリケーションに登録します。cordova-plugin-whitelistの詳細は、https://cordova.apache.org/docs/en/latest/cordova-plugin-whitelist/でApache Cordovaドキュメントを参照してください。後者のドキュメントでは、プラグインを使用して、ナビゲーションおよびネットワーク・リクエスト・ホワイトリストを実装する方法およびコンテンツ・セキュリティ・ポリシーを実装する方法を示すサンプルが提供されます。

次のサンプルは、oracle.comドメインからのHTTPおよびHTTPS URLをホワイトリストに追加するようにplugin.xmlファイルを構成する方法を示しています。

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-whitelist" version="1.2.2">

<name>Whitelist</name>
<description>Cordova Network Whitelist Plugin</description>
<license>Apache 2.0</license>
<keywords>cordova,whitelist,policy</keywords>

<engines>
<engine name="cordova-android" version=">=4.0.0" />
</engines>

<platform name="android">
<config-file target="res/xml/config.xml" parent="/*">
<allow-navigation href="http://*.oracle.com/*"/>
<allow-navigation href="https://*.oracle.com/*"/>
<feature name="Whitelist" >
<param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin"/>
<param name="onload" value="true" />
</feature>
</config-file>

<source-file src="src/android/WhitelistPlugin.java" target-dir="src/org/apache/cordova/whitelist" />

<info>
This plugin is only applicable for versions of cordova-android greater than 4.0. If you have a previous
platform version, you do *not* need this plugin since the whitelist will be built in.
</info>
</platform>
</plugin>

必要なホワイトリストの実装を完了した後、第9.3項「MAFアプリケーションでの追加プラグインの登録」の説明に従って、プラグインをMAFアプリケーションに追加します。

MAFアプリケーションで使用するためのプラグイン開発の詳細は、第9.1項「MAFアプリケーションでのプラグインの使用方法の概要」を参照してください。

20.3.2 iOSプラットフォームでリモートURLをホワイトリストに追加する方法

iOSにデプロイするMAFアプリケーションでホワイトリストを実装するには、Cordovaプラグインを作成します。

ホワイトリストを有効にするMAFアプリケーションで、Cordovaプラグインを開発または登録するか、その両方を行います。次のサンプルは、oracle.comドメインからのHTTPおよびHTTPS URLをホワイトリストに追加するために使用できるプラグインを示しています。

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="maf-ios-whitelist-plugin" version="1.0.0">

<name>Whitelisting</name>
<description>Plugin to white list remote URLs in a MAF app on iOS.</description>

<platform name="ios">
<config-file target="config.xml" parent="/*">
<allow-navigation href="http://*.oracle.com/*"/>
<allow-navigation href="https://*.oracle.com/*"/>
<feature name="CDVIntentAndNavigationFilter">
<param name="ios-package" value="CDVIntentAndNavigationFilter"/>
<param name="onload" value="true"/>
</feature>
</config-file>
</platform>
</plugin>

ホワイトリストは、ハイパーリンクおよび最上位レベルのURIに対して機能します。ホワイトリストは、XMLHttpRequestsを含むリソース・ローディングおよびHTML src属性で使用されるURIに対しては機能しません。

MAFアプリケーションで使用するプラグインの開発の詳細は、第9.1項「MAFアプリケーションでのプラグインの使用方法の概要」を参照してください。プラグインの開発を完了した後、第9.3項「MAFアプリケーションでの追加プラグインの登録」の説明に従って、そのプラグインをMAFアプリケーションに登録します。

20.3.3 ユニバーサルWindowsプラットフォームでリモートURLをホワイトリストに追加する方法

UWPにデプロイするMAFアプリケーションでホワイトリストを実装するには、Cordovaプラグインを作成します。

ホワイトリストを有効にするMAFアプリケーションで、Cordovaプラグインを開発または登録するか、その両方を行います。

次の注釈付きサンプルで、プラグインでホワイトリストを実装する方法を示すいくつかの例を参照してください。

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns=http://apache.org/cordova/ns/plugins/1.0 xmlns:uap=http://schemas.microsoft.com/appx/manifest/uap/windows10
id="maf-cordova-plugin-windows-whitelist" version="1.0.0">

<name>MAF Windows Whitelist</name>
<description>MAF Windows Plugin to whitelist URLs that have Window RT access</description>
<keywords>cordova,whitelist</keywords>

<!-- windows 10 -->
<platform name="windows">

<!-- In a MAF application, local package URLs have access to all Windows Runtime(RT) API. Access to Windows RT API is essential
for Cordova plugins that need to make device calls. External website URLs like: http:// and https:// do NOT have access to
Windows RT API by default in MAF. This plugin allows modifications to the application manifest so that Windows RT API
access and hence Cordova device access can be granted to external URLs.
-->

<config-file target="package.appxmanifest" parent="/Package/Applications/Application/uap:ApplicationContentUriRules">

<!-- The following example provides access to the Window RT API to a single page -->
<uap:Rule Match="http://example.com/crmapp/contacts/contact.html" Type="include" WindowsRuntimeAccess="all" />

<!-- The following example denies access to Window RT API to specific directories inside the package -->
<uap:Rule Match="ms-appx-web:///FARs/ViewController/public_html/noNativeAcessFeature/*" Type="include" WindowsRuntimeAccess="none" />

<!— The following example allows everything in the oracle.com domain to access the Windows RT API in the application-->
<uap:Rule Match="http://*.oracle.com/*" Type="include" WindowsRuntimeAccess="all" />

</config-file>
</platform>
</plugin>

必要なホワイトリストの実装を完了した後、第9.3項「MAFアプリケーションでの追加プラグインの登録」の説明に従って、プラグインをMAFアプリケーションに追加します。

MAFアプリケーションで使用するためのプラグイン開発の詳細は、第9.1項「MAFアプリケーションでのプラグインの使用方法の概要」を参照してください。

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

MAFでは、図20-3に示すように、MAFのWebビュー内で開く、リモートで供給されるWebコンテンツとして実装されるアプリケーション機能に対して、戻る、進むおよびリフレッシュの各アクション用のボタンが付いたナビゲーション・バーを追加できます。進むまたは戻るのいずれかの移動が不可能な場合は、進むと戻るのボタンが無効になります。

注意:
戻るボタンは、Androidデバイスでは無効になります。

図20-3 ナビゲーション・ボタンとリフレッシュ・ボタンを表示するリモートWebページ

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

MAF機能エディタの「コンテンツ」タブで、ユーザーがリモート・コンテンツを移動またはリフレッシュできるようにします。

始める前に:

第5.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」の説明に従って、まず「リモートURL」を選択し、次にホスト・サーバーへの接続を作成することにより、リモートでホストされるアプリケーションから配信されるアプリケーション機能のコンテンツを指定します。

ナビゲーション・バーを有効にするには:

1. MAF機能エディタのアウトラインの「機能」にリストされているリモートURLアプリケーション機能を選択します。

2. 「コンテンツ」を展開してリモートURLコンテンツを選択します。

3. 図20-4のように、「コンテンツ」セクションで、「ボタンの表示」を選択します。

図20-4 ナビゲーション・オプションの選択

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

OEPEでは、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-5に示すとおり、MAFでは、進む、戻るおよびリフレッシュの各ボタンがリモートURLアプリケーション機能のホームページから移動されるWebページに適用されます。

Figure 20-5 リモートURLアプリケーション機能での移動

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 Mobile Application Frameworkタグ・リファレンスを参照してください。

アプリケーションおよびアプリケーション機能レベルの両方のプリファレンス・ページを作成する例については、PrefDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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アプリケーション機能エディタの「プリファレンス」セクション(図21-4を参照)では、<adfmf:preferenceGroup>内の子プリファレンス・ページ要素をネストすることでアプリケーションレベルのプリファレンス・ページ・セットを構築できます。このセクションでは、<adfmf:preferenceGroup>およびその子要素が同様に名付けられたオプション(「プリファレンス・ページ」、「プリファレンス・リスト」、「ブール型のプリファレンス」など)として示され、これらを階層(またはツリー)に編成します。

図21-4 プリファレンス・ページを使用したモバイル・アプリケーションレベルのプリファレンスの追加

maf-application.xmlファイルを正しく構成するには、図21-4に示すMAFアプリケーション・エディタを使用してユーザー・プリファレンス・ページを構築します。そうすることで、選択したプリファレンス要素に対して適切な親、子、または兄弟関係を設定できる要素のみを選択できます。たとえば、図21-5には、プリファレンス・グループ要素であるMyMobile内に挿入できるコンポーネントのみが示されています。また、このエディタでは、各プリファレンス要素に固有の属性に対して値を入力できます。

図21-5 プリファレンス・タイプの選択

プリファレンス・ページを作成するには:

1. MAFアプリケーション・エディタで、「プリファレンス」を右クリックして「新」→「プリファレンス・グループ」を選択し、親<adfmf:preferenceGroup>要素を作成します。

2. 新しいプリファレンス・グループに関して次の情報を入力します(図21-6を参照)。

図21-6 親プリファレンス・グループ要素の定義

- プリファレンス・グループID要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。ユーザー・インタフェースにこのテキストを表示する方法の例は、図21-1の例を参照してください。

注意:
ELで無効な識別子とみなされる文字がプリファレンスIDに含まれている場合、ランタイムでそれを適切にサポートできないため、OEPEによって警告が表示されます。機能コンテンツ・ページでELを使用してプリファレンスを参照しようとしないかぎり、問題はありません。

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

プリファレンス・ページ・コンポーネントでは新しいユーザー・インタフェース・ページを作成できます。

始める前に:

プリファレンス・グループ要素を作成する必要があります。

新しいユーザー・プリファレンス・ページを作成するには:

1. 「プリファレンス・グループ」要素を選択します。

2. 右クリックして「新」→「プリファレンス・ページ」を選択します(図21-7を参照)。

図21-7 プリファレンス・ページ・コンポーネントの選択

3. 「プリファレンス・ページの挿入」ダイアログ(図21-8を参照)に次のプリファレンス・ページ属性を定義します。

- プリファレンス・ページ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-8 プリファレンス・ページの挿入

4. 子プリファレンス・グループ要素を挿入することでプリファレンス・ページのボディを作成します。
プリファレンス・ページを右クリックして「新」→「プリファレンス・グループ」を選択します。図21-8の場合、application_versionを右クリックします。

5. 子プリファレンス・グループの一意の識別子と表示名を定義すると、これにプリファレンス・リスト要素などの他の要素を移入できます。

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

概要エディタでプリファレンス・ページとその子プリファレンス・グループ・コンポーネントを定義すると、OEPEでは、次の例と同様の属性を使用して<adfmf:preferencePage>が生成されます。<adfmf:preferencePage>は、親<adfmf:preferenceGroup>要素内にネストされます。

次の例は、<adfmf:PreferencePage>要素を追加する方法を示しています。

<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-9 プリファレンス・リスト・コンポーネントのプリファレンス・グループへの追加

2. 図21-10のように、リスト・プリファレンスに使用する次の属性を定義します。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-10 プリファレンス・リストの挿入

3. リスト・プリファレンス(図21-10ではリスト・プリファレンスはedition)を右クリックして「プリファレンス値」を選択することで、アイテムのリストを定義します。

4. これで、リストの値を定義できます。図21-11に示すように、「ID」、「値」、「ラベル」に入力します。
ユーザーにデフォルト設定を提供するには、「デフォルト」を選択します。前の項の例に示されているとおり、デフォルト・ステータスは、<adfmf:preferenceList>要素内にdefault="ENTERPRISE"として定義されています。

図21-11 プリファレンス値の追加

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

プリファレンス・リスト・コンポーネントをプリファレンス・グループに追加し、一連のプリファレンス値を定義すると、第21.1.1.2項「プリファレンス・ページを追加する場合の処理」に示すように、OEPEでは<adfmf:preferenceList>要素を使用して<adfmf:preferences>セクションが更新されます。

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

第21.1項「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」の例を参照してください。

始める前に:

<adfmf:preferenceBoolean>要素は<adfmf:preferenceGroup>要素内にネストされる必要があるため、まずプリファレンス・グループ・コンポーネントを階層に挿入する必要があります。

ブール型のプリファレンス・リストを作成するには:

1. 図21-12のGPS設定など、プリファレンス・グループ要素を選択します。

図21-12 ブール型プリファレンスのプリファレンス・グループへの追加

2. 右クリックして「新」→「ブール型のプリファレンス」を選択します。
図21-13のように、次の属性を定義して、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-13 ブール型のプリファレンスの挿入

3. デフォルト値のfalseをそのまま使用するか、trueを選択します。

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

ブール型のプリファレンスを追加してそのデフォルト値を指定すると、次の例に示すように、OEPEでは、<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-14に示すように、挿入オプションを使用して、ユーザーが情報を格納したりデフォルト・テキストを閲覧できるようにする「テキストのプリファレンス」というダイアログを作成します。

図21-14 「テキストのプリファレンス」の挿入

始める前に:

プリファレンス・グループ要素を作成します。

テキストのプリファレンスを作成するには:

1. プリファレンス・グループ要素を選択します。

2. 右クリックして「新」→「テキストのプリファレンス」を選択します。

3. 「テキストのプリファレンスの挿入」ダイアログ(図21-15を参照)に次の情報を入力して、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

- デフォルトのテキスト値を入力します。

図21-15 「テキストのプリファレンスの挿入」ダイアログ

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

テキストのプリファレンスを追加してそのデフォルト値を指定すると、次の例に示すように、OEPEでは、<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-16のように表示されます。

図21-16 テキストのプリファレンス

図21-16は、セキュリティ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 アプリケーション機能のユーザー・プリファレンス・ページの作成

アプリケーション機能をモバイル・アプリケーションと別個に配布するには、そのアプリケーション機能を含む機能アプリケーション・アーカイブ(FAR) .jarファイルを、別のモバイル・アプリケーションのライブラリに追加します。その後、このアプリケーション機能を、アプリケーションのmaf-application.xmlファイル内で参照します。アプリケーション機能において、使用先のアプリケーション用に定義した全般的なプリファレンスだけでなく、特定のユーザー・プリファレンスのセットが必要になる場合は、MAF機能エディタの「プリファレンス」タブを使用して、該当するプリファレンスを定義できます(図21-17を参照)。第21.1項「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」の説明に従い、アプリケーション・レベルのプリファレンスを構築する方法で、アプリケーション機能のプリファレンスを構築します。MAF機能エディタでプリファレンスを定義したら、次は第12.3項「UIコンポーネントの作成と使用方法」で説明したブール・スイッチ、入力および出力の各コンポーネントに埋め込むMAF AMXページを参照するアプリケーション機能を作成することによって実際のプリファレンス・ページを作成します。

図21-17 アプリケーション機能レベルのプリファレンスの設定

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

アプリケーション機能レベルのプリファレンス・ページを作成する場合、この項の後続の例にある入力テキスト・コンポーネントなど、MAF AMXコンポーネントに対してEL式を追加します。

機能レベルのプリファレンス・ページを作成するには:

1. ページのAMXエディタを開きます。

2. XML要素を選択します(たとえば、次の例の場合は<amx:inputTest ...>)。

3. 「プロパティ」ペインを開きます。

4. 「プロパティ」ペインで「共通」タブを選択します。

5. Value属性の「バインディング」ボタンをクリックします。これにより、OEPEのEL式ビルダーが開かれます。

次の例は、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-18は、式ビルダーを使用した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-18 プリファレンスに対する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オブジェクトの詳細は、第13.3.5.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-19のプリファレンスで示すように、設定アプリケーションへのアプリケーション・レベルのプリファレンスの統合はiOSプラットフォームのみでサポートされます。

図21-19 iOS設定アプリケーションでのOracleモバイル・プリファレンス

Androidデバイスでは、ユーザーは、アプリケーションが実行されている場合のみ、図21-20のようなアプリケーション固有のプリファレンス・ページにアクセスします。

図21-20 Androidデバイスのプリファレンス・メニュー

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

この章では、ユーザーのアクセス権限またはデバイス要件に基づいてアプリケーション機能を制限できる制約の設定方法について説明します。

この章には次の項が含まれます:

- 第22.1項「制約の概要」

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

22.1 制約の概要

制約には、アプリケーション機能またはアプリケーション・コンテンツを使用するタイミングが記述されています。制約では、ユーザーとユーザー・ロール、モバイル・アプリケーションの実行対象となるデバイス、およびデバイス上で使用可能なハードウェアに基づいて、アクセスを制限できます。制約は2つのレベルで設定でき、1つ目のアプリケーション機能レベルでは、ユーザーのデバイスにおけるアプリケーション機能の可視性を制御し、2つ目のコンテンツ・レベルでは、アプリケーション機能に対して配信できるMAFコンテンツのタイプを指定できます。maf-feature.xmlファイルの概要エディタを使用すると、これら両方のタイプの制約を設定できます。制約はMAFランタイムによって評価され、エンド・ユーザーが特定のコンテンツを表示または使用したり、アプリケーション機能自体にアクセスできるようにするには、trueに評価される必要があります。

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

図22-1に示すように、MAF機能エディタの「コンテンツ」フォルダの下の「制約」フォルダを使用すると、アプリケーション機能レベルの制約を設定できます。たとえば、デバイスのカメラを使用するアプリケーション機能は、そのデバイスに実際にカメラ機能があることがMAFランタイムによって確認された場合にのみ、モバイル・アプリケーションのナビゲーション・バーまたはスプリングボード内に表示されます。また、機能レベルの制約を使用すると、ユーザー・ロールと権限に基づいてアプリケーションを保護することもできます。図22-1は、MAFランタイムによって制約がtrueに評価されたときに、管理者権限を持つユーザーのみにアプリケーションへの
アクセスを許可する制約の作成方法を示しています。制約がランタイムによってfalseと評価された場合、アプリケーション機能はナビゲーション・バーまたはスプリングボード内に表示されないため、エンド・ユーザーはそのアプリケーション機能にアクセスできません。

図22-1 アプリケーション機能レベルの制約の設定

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

デバイス・ハードウェア・プロパティやユーザー権限などのファクタに対応するため、単一のアプリケーション機能に複数のコンテンツ・タイプを指定し、ユーザー・インタフェースの様々なバージョンを配信できます。アプリケーション機能のコンテンツに関する制約を設定することによって、アプリケーション・ページを表示できるエンド・ユーザーや、そのページの使用方法を特定する条件を指定できます。

たとえば、「コンテンツ」フォルダ(図22-2を参照)を使用して、管理権限を付与されたユーザーに1つのタイプのユーザー・インタフェースを表示し、基本的なユーザー権限を持つユーザーに別のユーザー・インタフェースを表示するコンテンツを指定できます。また、コンテンツ・レベルの制約によって、デバイスのレイアウトに関する考慮事項に対応できます。図22-2は、アプリケーションが、デバイスの画面幅に基づく制約を使用して、iPhoneとiPadのレイアウトに合ったページをコールするAMXモバイル・タスク・フローを提供する方法を示しています。エンド・ユーザーがアプリケーションを起動すると、MAFランタイムによって、Employeesアプリケーション機能用に設定された制約が評価されます。ランタイムは、デバイスの画面の対角線が6インチを超えることを確認した場合、Employees_pad_taskflow.xmlファイルを選択し、これにより、iPad用に設計されたMAF AMXページがコールされます。この制約がfalseに評価された(つまり、画面の対角線が6インチ未満である)場合、ランタイムは、iPhone固有ページであるEmployees_phone_taskflow.xmlをコールするMAFタスク・フローを選択します。また、「コンテンツ」フォルダを使用すると、ランタイムが特定のコンテンツを選択したときに表示されるナビゲーション・バーおよびスプリングボード・イメージを選択できます。コンテンツ固有のイメージを選択しなかった場合、MAFでは、機能レベル・フォルダで指定されたアプリケーション機能レベルのイメージを使用します。

注意:
第3.2項「MAFアプリケーションの表示プロパティの設定」で説明されているように、イメージはプラットフォーム固有のガイドラインに準拠している必要があります。

図22-2 コンテンツ・レベルの制約の設定

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

アプリケーション機能レベルの制約を設定する際、<adfmf:constraint>要素(<adfmf:constraints>の子要素)のproperty、operatorおよびvalue属性を使用すると、ユーザー、デバイスまたはハードウェアに基づいてアプリケーションの使用を制限できます。次の例に示すように、これらの属性の定義例は、アプリケーション機能へのアクセスをField Repに制限し、さらにiOSデバイスでのみアプリケーションを実行するように制限する属性の定義を示しています。

次の例は、<adfmf:constraint>要素を示しています。

<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に示すように、MAF機能エディタの「制約」フォルダを使用して、選択したアプリケーション機能の制約を宣言的に構成します。

アプリケーション機能の制約を定義するには:

1. 図22-3に示すように、「制約」フォルダを右クリックして「新」を選択し、「制約」を選択します。

図22-3 新規制約の作成

2. プロパティと適切な演算子を選択し、値を入力します。プロパティの使用の詳細は、第22.2.3項「property属性について」を参照してください。

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

この項の最初の方にある例と同様に、「制約」フォルダに値を入力すると、定義された<adfmf:constraint>要素によってディスクリプタ・ファイルの<adfmf:constraints>要素が更新されます。

22.2.3 property属性について

MAFには、ユーザー、デバイスおよびハードウェアの各プロパティを反映するproperty属性のセットが用意されています。これらのプロパティを次の演算子と組み合せて使用することでアプリケーション機能の使用方法が決定されます。

- contains

- equal

- less

- more

- not

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

ユーザーがモバイル・アプリケーションにログインした後、MAFランタイムでは、アプリケーション機能ごとに構成されたユーザー・ロールベースの制約を、アクセス制御サービス(ACS)によって取得されたユーザー・ロールと権限に対して調整します。その後MAFでは、制約を満たす権限を持つエンド・ユーザーにのみ、アプリケーション機能(またはアプリケーション機能のコンテンツ)を提供します。このようなユーザー権限とロールに関する制約を設定するだけでなく、図22-4に示すように、モバイル・ログイン・サーバー接続ダイアログに次の項目を入力することで、モバイル・アプリケーション用のアクセス制御を作成できます(第29.6.2項「ログイン・ページの指定方法」を参照)。

- ユーザー・ロールと権限のリストを送信するREST WebサービスのURL。

- アプリケーション機能によってチェックされるユーザー・ロールのリスト。

- 権限のリスト。

第29.5.19項「アクセス制御サービスに関する必知事項」も参照してください。

図22-4 ユーザー・ロールと権限の取得の構成

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に評価します。次の例では、ユーザーの権限に管理者権限が含まれる場合はアプリケーション機能が含められません。
次の例は、not演算子とuser.privilegesプロパティを使用してアプリケーション機能へのアクセスを制限する方法を示しています。

<feature ...>
...
<constraints>
<constraint property="user.privileges"
operator="not"
value="manager" />
</constraints>
...
</feature>

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

ハードウェア・オブジェクトは、カメラの有無、コンパス向首方向情報提供機能、ファイルの保存機能など、デバイスで使用可能なハードウェアを参照します。次のプロパティではequal演算子が使用されます。

- hardware.networkStatus: アプリケーションの起動時にネットワークの状態が表示されます。NotReachable、CarrierDataConnectionおよびWiFiConnectionの3つの属性値を使用してこのプロパティを変更できます。次の例は、この3つ目の値を示しています。その例に示すとおり、この値を設定することで、デバイス・ハードウェアがWi-Fi接続があることを示している場合にのみモバイル・アプリケーションにこのモバイル・アプリケーション機能が表示されることになります。つまり、デバイスにWi-Fi接続がない場合は、モバイル・アプリケーションをロードしても、そのアプリケーション機能は表示されません。
次の例は、hardware.networkStatusプロパティを定義する方法を示しています。

<feature ...>
...
<constraints>
<constraint property="hardware.networkStatus"
operator="equal"
value="WiFiConnection" />
</constraints>
...
</feature>

注意:
この制約は、iOSデバイスの起動時に評価されます。起動時にデバイスにWi-Fi接続がなく、その後その接続を取得した場合(ユーザーがWi-Fiのホットスポットに入った場合など)、アプリケーション機能は無効のままとなり、ユーザーがモバイル・アプリケーションを停止し再起動するまで利用できません。

- hardware.hasAccelerometer: デバイスに加速度計があるかどうかを示します。このプロパティは、trueまたはfalseの値で定義します。次の例は、trueの値を示しており、ハードウェアに加速度計がある場合にのみこのアプリケーション機能が利用可能なことを示しています。
次の例は、hardware.hasAccelerometerプロパティを使用する方法を示しています。

<feature ...>
...
<constraints>
<constraint property="hardware.hasAccelerometer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:
iOSベースのハードウェアにはすべて加速度計があるため、このプロパティは常にtrueの値にして、iOSデバイスでアプリケーション機能が利用できるようにしておく必要があります。

- hardware.hasCamera: デバイスにカメラがあるかどうかを示します。この制約は、trueまたはfalseの属性値を使用して定義します。次の例は、値がtrueに設定されており、デバイスにカメラが含まれている場合にのみアプリケーション機能が利用可能なことを示しています。
次の例は、hardware.hasCameraプロパティを使用する方法を示しています。

<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式として定義すると、EL式がfalseとして評価されたとき、MAFランタイムは、アプリケーション機能を当初は非表示にできますが、同じEL式がtrueとして評価されたときには後で表示することができます。EL式を使用した動的制約の定義方法に関する次の例の遅延メソッド式に示すように、<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要素内に定義された静的な制約の中でネストできます。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

22.2.6.1 静的な制約とEL定義の制約の組合せについて

表示を可能にするためにMAFランタイムが静的な制約のすべての条件をtrueに評価しなければならないのに対して、制約のEL式がtrueとして評価されると、同様にアプリケーション機能とコンテンツが表示されますが、式がfalseとして評価されると、アプリケーション機能とコンテンツは非表示になります。

22.2.6.2 動的な制約の定義方法

静的な制約とは異なり、maf-feature.xml概要エディタで動的な制約を作成(または更新)することはありません。かわりに、制約式コンポーネントをソース・エディタまたは構造ウィンドウにドラッグすることで<adfmf:constraintExpression>を作成し、次に式ビルダーを使用してこのコンポーネントにEL式を移入します。

制約式コンポーネントを定義するには、次の手順を実行します。

1. 図22-5のように、「制約」フォルダを右クリックして新規を選択し、「制約式」を選択します。

図22-5 制約式の作成

2. 図22-6に示すように、をクリックして「式ビルダー」ダイアログを開きます。

図22-6 制約のEL式の構築

3. 「式ビルダー」ダイアログで、リストの中のオブジェクトをダブルクリックし、演算子をダブルクリックし、式を完結させることによって式を作成します。

4. 終了したら、「OK」をクリックします。

23 MAFアーティファクトでのAppXrayの使用

この章では、依存性トラッキング、検証、視覚化およびリファクタのサポートのためにOEPEにより提供されるソリューションであるAppXRayについて説明します。AppXrayは、maf-application.xml、maf-feature.xml、AMXページ、MAFタスク・フローおよびデータ・コントロールを含むすべてのMAFアーティファクトで有効です。

この章には次の項が含まれます:

- 第23.1項「MAFアーティファクトでのAppXray使用の概要」

- 第23.2項「AppXrayの使用」

- 第23.3項「AppXrayによるリファクタリング」

23.1 MAFアーティファクトでのAppXray使用の概要

OEPEにより提供されるAppXrayテクノロジは、アプリケーションのMAFアーティファクトを分析し、この情報を使用してアプリケーションの多くのレイヤー全体にわたる検証および一貫性を提供します。

AppXrayは利用しているMAFアプリケーションで使用でき、これはデフォルトで有効にされています。AppXrayは、アーティファクトを追跡し移入することができるアプリケーション・データベースを構築します。MAFアーティファクトは検出され、このデータベースに追加されます。アプリケーションでの作業時、AppXrayはアプリケーション・データベースを自動的に管理します。これによりパフォーマンスが低下する場合、自動管理を選択的に無効にして、必要に応じてアプリケーション・データベースを構築することができます。

AppXrayにより検出されたエラーは、「問題」ビューに表示され、依存性はAppXaminerにグラフィカルに表示されます。

AppXrayは次のような情報を収集します。

- maf-application.xml

- maf-feature.xml

- AMXページ

- MAFタスク・フロー

- データ・コントロール

- リソース・バンドル

- CSS

- イメージ・ファイル

23.2 AppXrayの使用

AppXrayを使用する際、依存性を表示するツールはAppXaminerと呼ばれます。

23.2.1 AppXaminerのオープン方法

AppXrayでは、OEPEによるMAFアーティファクト全体にわたるリファクタのサポートが可能です。リファクタ・オプションでは、アプリケーションが使用するアーティファクトの名前の変更、移動および削除ができます。これらのリファクタ・オプションは、行った変更と、その変更に依存するアプリケーションの他の部分とを同期させます。

AppXaminerは、プロジェクト・エクスプローラのMAFアーティファクトのコンテキスト・メニューから開きます。

依存性の関係を表示するには次の手順を実行します。

1. プロジェクト・エクスプローラでアセンブリ・プロジェクト・ノードを展開し、「MAF」 >「MAFアプリケーション・エディタ」にナビゲートします。MAFアプリケーション・エディタを右クリックし、コンテキスト・メニューから「AppXray依存性の表示」を選択します。MAFノードの下の任意のエディタおよびプロジェクトの任意のファイル・アーティファクト上で依存性を見ることができます。

2. 図23-1に示すように、「MAFアプリケーション・エディタ」ノードを右クリックし、「AppXray依存性の表示」を選択します。

図23-1 AppXaminerを開く

MAFノードの下の任意のエディタのおよびプロジェクトの任意のファイル・アーティファクト上のコンテキスト・メニューから、「AppXrayの依存性を表示」を選択して、依存性を見ることができます。

23.2.1.1 AppXaminerについて

AppXrayのUIビューアであるAppXaminerは、図23-2に示すように、選択されたアーティファクトと他のコンポーネントとの関係を表示するエディタで開きます。

図23-2 AppXaminerウィンドウ

23.2.2 AppXaminerの使用

AppXaminerでは、アーティファクト間の関係を即座に見ることができます。次に、図23-2について説明します。

- 数値は、コンポーネントが他のコンポーネントとの間に持つ参照の数を示します。

- ノードを展開して他のコンポーネントとの関係を見ることができます。

AppXaminerのコンテキスト・メニューから次のことを実行できます。

- 「AppXrayの依存性の表示」を選択してそのアーティファクトの依存性を表示する。

- 「参照詳細の表示」を選択する。関係する詳細なコンポーネントを表示するポップアップ・ウィンドウが開きます。

- 「開く」を選択してエディタでファイルを表示する。

23.3 AppXrayによるリファクタリング

AppXrayでは、OEPEによるMAFアーティファクト全体にわたるリファクタのサポートの提供が可能なため、アプリケーションが使用するアーティファクトの名前の変更、移動および削除ができます。

これらのリファクタ・オプションは、行った変更と、その変更に依存するアプリケーションの他の部分とを同期させます。

アーティファクトをリファクタする際には、AppXRayにより「リソースの名前変更」ダイアログが表示され、ここで変更内容をチェックおよび確認きます。図23-3を参照してください。

図23-3 AppXrayによるリファクタリング

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. モバイル・アプリケーションでプッシュ通知を受信できるようにするには、MAFアプリケーション・エディタのプラグイン有効化セクションでコア・プラグインのPushPluginを有効化し、そのプラグインを1つ以上のアプリケーション機能に関連付けます。詳細は、第9章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

注意:
デフォルトでは、MAFアプリケーションはプッシュ通知を許可しません(また、いずれのデバイス・タイプのデバイス・アクセスも許可しません)。

2. アプリケーション・コントローラ・プロジェクトで、アプリケーション・ライフサイクル・イベント・リスナー(ALCL)・クラスを登録します。詳細は、第3.2項「MAFアプリケーションの表示プロパティの設定」および第10.1項「MAFアプリケーションのライフサイクル・リスナーの概要」を参照してください。

3. ALCLにoracle.adfmf.application.PushNotificationConfigインタフェースを実装します。このインタフェースは、プッシュ通知サービスに正常に登録するのに必要な構成を提供します。
PushNotificationConfigインタフェースのgetNotificationStyleおよびgetSourceAuthorizationIdメソッドをオーバーライドおよび実装します。getNotificationStyleメソッドを使用すると、アプリケーションが登録する通知スタイルを指定できます。getSourceAuthorizationIdメソッドを使用すると、モバイル・アプリケーションへのメッセージの送信を許可されたアカウントのGoogleプロジェクト番号を入力できます。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

4. アプリケーション・コントローラ・プロジェクトで、プッシュ通知イベントを処理するプッシュ通知イベント・リスナー・クラス(NativePushNotificationListenerなど)を作成します。このクラスには、イベント・リスナーを定義するoracle.adfmf.framework.event.EventListenerインタフェースを実装する必要があります。oracle.adfmf.framework.event.EventListenerインタフェースの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
通知イベントを登録および受信するために、onOpen、onMessageおよびonErrorメソッドをオーバーライドおよび実装します。プッシュ通知サービスへの登録が成功すると、MAFでは、アプリケーション開発者がプロバイダと共有する必要がある登録トークンを使用して、onOpenメソッドをコールします。通知サービスへの登録時にエラーが発生した場合、onErrorメソッドが呼び出され、プッシュ通知サービスによって返されるエラーがAdfExceptionとしてカプセル化されます。

MAFでは、アプリケーションが通知を受信するたびに、通知ペイロードを使用してonMessage(Event e)メソッドをコールします。Eventオブジェクトは、通知ペイロードおよびアプリケーションの状態に関する有用な情報を取得するために使用できます。通知ペイロードを取得するには、Event.getPayloadメソッドを使用します。通知時にアプリケーションの状態を取得するには、Event.getApplicationStateメソッドを使用します。詳細は、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());

PushDemoというMAFサンプル・アプリケーションは、プッシュ通知の処理方法を示しています。これは、「ファイル」→「新規」→MAFサンプルにあります(付録E「サンプルのMAFアプリケーション」を参照)。

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

MAFでは、JSON形式のペイロードに対して、次のキーを尊重します。

- alert: 通知プロンプトに表示されるテキスト・メッセージ。

- sound: 通知を受信したときに再生されるサウンド。

- badge: iOSのアプリケーション・アイコンに表示する番号。

注意:
Androidでは、ペイロードはキー値ペアを持つJSONオブジェクトである可能性があります。GCMサーバーは非文字列値をアプリケーションに送信する前に文字列に変換するため、値は常に文字列化されます。これは、値の型を保持するAPNには当てはまりません。詳細は、「Google Cloud Messaging」の「Implementing GCM Server」の項にある、「data」メッセージ・パラメータの説明を参照してください。このドキュメントは、Android開発者のWebサイト(http://developer.android.com/index.html)またはAndroid SDKドキュメントから入手できます。

24.3 ローカル通知の管理

ローカル通知は、次のものを使用して管理できます。

- MAFの提供するJava API (第24.3.1項「Javaを使用してローカル通知を管理する方法」を参照)。

- MAFの提供するJavaScript API (第24.3.2項「JavaScriptを使用してローカル通知を管理する方法」を参照)。

- アプリケーションの設計時にすべてのMAFアプリケーションで使用できるDeviceFeaturesデータ・コントロールのメソッド(第24.3.3項「DeviceFeaturesデータ・コントロールを使用してローカル通知を管理する方法」を参照)。

LocalNotificationというMAFサンプル・アプリケーションは、ローカル通知のスケジュール方法と処理方法を示しています。これは、「ファイル」→「新規」→MAFサンプルにあります(付録E「サンプルのMAFアプリケーション」を参照)。

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 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
{
"title" : String,  // notification title (Android only)
"alert" : String,  // notification alert text
"date" : Date,  // date-time at which notification
// should be fired (UTC time zone)
"repeat" : String,  // either 'minutely', 'hourly', 'daily',
// 'weekly', 'monthly', or 'yearly'
"badge" : Number,  // badge application icon on iOS with this number
"sound" : "SYSTEM_DEFAULT",  // if set, the default system
// sound is played
"vibration" : String,  // if set to "SYSTEM_DEFAULT", the default
// vibration is enabled upon
// an incoming notification (Android only)
"payload" : Object,  // custom JSON data to be passed
// through the notification
}

/**
* 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 Mobile Application Framework JSDocリファレンスを参照してください。

24.3.3 DeviceFeaturesデータ・コントロールを使用してローカル通知を管理する方法

ローカル通知は、DeviceFeaturesデータ・コントロールのaddLocalNotificationおよびcancelLocalNotificationメソッドを使用して、スケジュールしたり取り消すことができます。

DeviceFeaturesデータ・コントロールの詳細は、第13.10項「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 Mobile Application Framework Java APIリファレンスを参照してください。

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

表24-2に、ローカル通知オプションをリストし、各オプションに対する特定の値の設定と不適切な設定がMAFアプリケーションの通知動作に与える影響を説明します。

表24-2 ローカル通知オプション

オプション

値

iOSでの動作

Androidでの動作

title

次のいずれか:

- null

- 指定しない

NA脚注 1

通知センターの通知タイトルは、空白で表示されます。

alert

次のいずれか:

- null

- 指定しない

アプリケーションがバックグラウンドで実行されているか、まったく実行されていない場合、通知は表示されず、通知センターのキューにも格納されません。

アプリケーションがフォアグラウンドで実行されている場合、通知の詳細は、アプリケーションのローカル通知リスナーに直接渡されます。

通知は、タイトル付きのバナーとして表示されますが、アラート・テキストは表示されません。

date

次のいずれか:

- null

- 指定しない

- 過去の時刻または日付

通知は即座にトリガーされます。

通知は即座にトリガーされます。

repeat

次のいずれか:

- null

- 指定しない

通知は繰り返されません。

通知は繰り返されません。

badge

次のいずれか:

- null

- 指定しない

- 負の数値

通知では、アプリケーション・アイコンにバッジが設定されません。

既存のバッジは維持されます。

NA 脚注2

badge

0

既存のバッジがアプリケーション・アイコンから削除されます。

NA 脚注3

sound

次のいずれか:

- SYSTEM_DEFAULT_SOUND以外

- 指定しない

通知では、サウンドが再生されません。

通知では、サウンドが再生されません。

vibration

SYSTEM_DEFAULT_VIBRATION以外

NA 脚注4

通知では、モバイル・デバイスのバイブレーションがトリガーされません。

脚注1 タイトルは常にアプリケーション名であるため、通知は影響を受けません。

脚注2 アプリケーションのバッジ設定の概念がありません。設定は無視されます。

脚注3 アプリケーションのバッジ設定の概念がありません。設定は無視されます。

脚注4 バイブレーションを制御することはできません。設定は無視されます。ただし、デフォルトのシステム・サウンドを通知の着信時に再生するように指定している場合や、エンド・ユーザーがモバイル・デバイスで着信時にバイブレートする設定を有効にしている場合、デバイスは通知を受信するとバイブレートします。

25 MAFアプリケーションでのデータのキャッシュ

この章では、MAFアプリケーションでデータをキャッシュする方法について説明します。

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

- 第25.1項「MAFアプリケーションでのデータ・キャッシュの概要」

- 第25.2項「MAFアプリケーションでのデータ・キャッシュの有効化」

- 第25.3項「sync-config.xmlファイルでのキャッシュ・リソースおよびキャッシュ・ポリシーの指定」

- 第25.4項「MAFで提供されるキャッシュ・ポリシー」

- 第25.5項「sync-config.xmlファイルでの構成サービス・エンド・ポイントの使用」

- 第25.6項「MAFアプリケーションでのキャッシュ・データの暗号化」

- 第25.7項「FARでのsync-config.xmlファイルのパッケージ化」

25.1 MAFアプリケーションでのデータ・キャッシュの概要

データ・キャッシュは、モバイル・アプリケーションのユーザーに優れたユーザー操作性を提供するための重要な要素です。ユーザーは、モバイル・アプリケーションがいつでも使用でき、機能することを期待します。残念なことに、モバイル・アプリケーションの接続性は信頼できない場合もあり、ネットワーク接続を使用できなかったり、接続の確立時につながったり切れたりを繰り返し、最終的に切断されることがあります。MAFでは、エンド・ユーザーのデバイスがオフラインのときも作業を継続できるMAFアプリケーションの開発を可能とする、いくつかの機能が提供されています。ネットワーク接続が使用できない場合、MAFアプリケーションではローカルに格納されているキャッシュ・データにアクセスして、シームレスなユーザー操作を確保します。

図25-1は、MAFのキャッシュの仕組みを示しています。キャッシュ・レイヤーは、ビジネス・ロジック・レイヤーで発生したRESTコールをインターセプトします。キャッシュ・レイヤーは、sync-config.xmlファイルを読み取り、ファイルのエントリに基づいて、RESTサービスからのレスポンスをキャッシュ・データ・ストアに格納します。sync-config.xmlファイルでは、キャッシュするURI (エンド・ポイント)とURIのキャッシュ・ポリシーを指定します。キャッシュ・レイヤーでは、指定したURIがキャッシュ内の特定のリソースを識別するキーとして使用されます。

図25-1 MAFアプリケーションでのデータのキャッシュ

MAFには、キャッシュ内のデータのリフレッシュ頻度および有効期限を決定するために適用および構成できるポリシーのセットが用意されています。これらのポリシーは、リクエストの処理方法をキャッシュ・レイヤーに指示します。その結果、アプリケーションがオフライン読取りを使用してデバイスに格納されているデータをフェッチする方がサーバーからデータを取得するよりも速いため、アプリケーション・パフォーマンスを向上させることができます。これらのポリシーでは、インターネットに接続できなくなった場合にオフライン読取りを有効にすることで、アプリケーション・キャッシュで最適なユーザー操作性を維持することもできます。

説明されている機能をMAFアプリケーションで実装するには、次のことが必要です。

- 第25.2項「MAFアプリケーションでのデータ・キャッシュの有効化」

- 第25.3項「sync-config.xmlファイルでのキャッシュ・リソースおよびキャッシュ・ポリシーの指定」

- 第25.6項「MAFアプリケーションでのキャッシュ・データの暗号化」

注意:
MAFアプリケーションでは、JSONペイロードでRESTサービスによって取得されるデータのキャッシュのみサポートされます。

25.2 MAFアプリケーションでのデータ・キャッシュの有効化

データ・キャッシュを有効にするには、maf.propertiesファイル(assembly_project/META-INFにあります)内の次の行をコメント解除します。

#java.commandline.argument=-DsyncEnabled=true

注意:
データ・キャッシュを有効にすると、ネットワーク上で渡されるデータがキャッシュされます。キャッシングを有効にしてアプリケーションをデプロイした後、実行時にオフにする方法はありません。

キャッシュするリソースと使用するキャッシュ・ポリシーの構成の詳細は、第25.3項「sync-config.xmlファイルでのキャッシュ・リソースおよびキャッシュ・ポリシーの指定」を参照してください。

25.3 sync-config.xmlファイルでのキャッシュ・リソースおよびキャッシュ・ポリシーの指定

OEPEは、MAFアプリケーションの作成時に、デフォルトでアセンブリ・プロジェクトの/adf/META-INFディレクトリにsync-config.xmlファイルを作成します。このファイルを使用して、指定したエンド・ポイント(URI)をMAFアプリケーションがコールする際に適用するキャッシュ・ポリシーを指定します。デフォルトで、sync-config.xmlファイルには、キャッシュを有効にすると適用されるデフォルトのポリシーが含まれています。このデフォルト・キャッシュ・ポリシーは、sync-config.xmlファイルで指定するエンド・ポイント以外のすべてのエンド・ポイントに適用されます。

例25-1は、同じサーバーから生成される2つのエンド・ポイント(URI)に対する2つの個別のポリシー(policy1およびpolicy2)を定義する方法を示しています。例では、policy1およびpolicy2に対して指定したURI以外のすべてのURIに対してMAFアプリケーションがRESTコールを行うときに適用されるデフォルト・ポリシーも示しています。最後に、例では暗号化を有効にする方法を示します。

WorkBetterサンプル・アプリケーションのsync-config.xmlファイルで、キャッシュ・ポリシーの別の使用例を表示できます。サンプル・アプリケーションの詳細は、付録E「サンプルのMAFアプリケーション」を参照してください。

例25-1で、sync-config.xmlのBaseURI要素のTaskConnは、MAFアプリケーションのconnections.xmlファイルで次のように定義されている接続の参照です。

<Reference name="TaskConn" className="oracle.adf.model.connection.url.HttpURLConnection" xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="TaskConn">
<Contents>
<urlconnection name="TaskConn" url="http://localhost:7101/TaskService/rest/v1"/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

この構成の利点は、接続詳細が変更された場合(たとえばホスト名の変更など)に、connections.xmlファイルの変更のみ必要なことです。sync-config.xmlファイルを変更する必要はありません。

例25-1 2つのポリシーを定義しているサンプルsync-config.xmlファイル

<Settings xmlns="http://xmlns.oracle.com/sync/config">
<!-- The connection.xml file defines the URL that the value of the BaseURI element references. -->
<BaseUri>TaskConn</BaseUri>

...
<EnableEncryption>true</EnableEncryption>
<Policies>
<ServerGroup id="tasklist" baseUri="TaskConn">
<Policy id="policy1">
<Path>/taskservice1/rest/v1/TaskList/*</Path>

<!-- This caching policy applies to a REST service accessed by a call to an end point constructed from
a concatenation of the baseURI value for TaskConn and the <Path> element's value. That is,
http://localhost:7101/TaskService/rest/v1/taskservice1/rest/v1/TaskList/*

When the end point above is used by the business logic layer in the MAF application, the cache layer checks sync-config.xml
to see if there is a cache policy defined for the end point. If it finds the policy, it applies the policy. -->

<FetchPolicy>FETCH_FROM_SERVICE_ON_CACHE_MISS_OR_EXPIRY</FetchPolicy>
<UpdatePolicy>QUEUE_IF_OFFLINE</UpdatePolicy>
<ExpirationPolicy>EXPIRE_AFTER</ExpirationPolicy>
<ExpireAfter>30</ExpireAfter>
<EvictionPolicy>EVICT_ON_EXPIRY_AT_STARTUP</EvictionPolicy>
</Policy>
</ServerGroup>

<ServerGroup id="taskdetail" baseUri="TaskConn">
<Policy id="policy2">
<Path>/taskservice1/rest/v1/TaskDetail/*</Path>

<!-- This caching policy applies to a different REST service accessed by a call to an end point constructed from
a concatenation of the baseURI value for TaskConn and the <Path> element's value. That is,
http://localhost:7101/TaskService/rest/v1/taskservice1/rest/v1/TaskDetail/*

When the end point above is used by the business logic layer in the MAF app, the cache layer checks sync-config.xml
to see if there is a cache policy defined for the end point. If it finds the policy, it applies the policy. -->

<FetchPolicy>FETCH_FROM_SERVICE_IF_ONLINE</FetchPolicy>
<UpdatePolicy>UPDATE_IF_ONLINE</UpdatePolicy>
<ExpirationPolicy>EXPIRE_AFTER</ExpirationPolicy>
<ExpireAfter>30</ExpireAfter>
<EvictionPolicy>EVICT_ON_EXPIRY_AT_STARTUP</EvictionPolicy>
</Policy>
</ServerGroup>

<DefaultPolicy>
<FetchPolicy>FETCH_FROM_SERVICE_IF_ONLINE</FetchPolicy>
<UpdatePolicy>UPDATE_IF_ONLINE</UpdatePolicy>
<ExpirationPolicy>NEVER_EXPIRE</ExpirationPolicy>
<EvictionPolicy>MANUAL_EVICTION</EvictionPolicy>
</DefaultPolicy>
</Policies>
</Settings>

25.4 MAFで提供されるキャッシュ・ポリシー

sync-config.xmlファイルに、モバイル・アプリケーションのキャッシュ・ポリシーを定義します。ポリシーを結合して、モバイル・アプリケーションに適した内容を提供します。

データ・ストレージ・ポリシー設定の構成の詳細は、第25.3項「sync-config.xmlファイルでのキャッシュ・リソースおよびキャッシュ・ポリシーの指定」を参照してください。

アプリケーションのキャッシング動作の構成を可能にするポリシーは、次のグループに分類されます。

- フェッチ・ポリシー: リソースをフェッチすることをキャッシュ・レイヤーに指示します(サーバーから、ローカル・キャッシュから、2つの組合せなど)。該当するポリシーのリストは、表25-1を参照してください。

- 有効期限ポリシー - キャッシュ・レイヤーが、ローカル・キャッシュに格納されているリソースが古くなり失効し、更新ポリシー(表25-4で説明)によって更新する必要があるか、または削除ポリシー(表25-3を参照)によってローカル・キャッシュから削除する必要があるかを確認するまでの期間(秒単位)を設定します。有効期限ポリシーの詳細は、表25-2を参照してください。

- 削除ポリシー: ローカル・キャッシュに格納されているリソースをキャッシュ・レイヤーがいつ削除するかを指定します。削除ポリシーは、サーバー側のリソースではなく、ローカル・キャッシュのデータのみに適用されます。ポリシーのリストは、表25-3を参照してください。

- 更新ポリシー — ローカル・キャッシュに格納されている期限切れのポリシーの更新のタイミングを定義します。ポリシーのリストは、表25-4を参照してください。

表25-1 フェッチ・ポリシー

ポリシー

説明

キャッシュからフェッチ

キャッシュ・レイヤーに、サーバーからではなくキャッシュからのみデータをフェッチするよう指示します。キャッシュ・レイヤーは、キャッシュにデータが見つからない場合に、エラーまたはnullオブジェクトを返します。キャッシュ・レイヤーは、このポリシーを適用するときにキャッシュから直接データを取得するため、このポリシーは、クライアント・アプリケーションがオンラインまたはオフラインのときに実行できます。

サービスからフェッチ

キャッシュ・レイヤーに、キャッシュからではなくサーバーのみからデータを直接フェッチするよう指示します。キャッシュ・レイヤーは、クライアント・アプリケーションがオンラインの場合にのみこのポリシーを適用できます。それ以外の場合は、エラーまたはNULLオブジェクトがクライアント・アプリケーションに返されます。

サービスからフェッチ(オンラインの場合)

キャッシュ・レイヤーに、クライアント・アプリケーションがオンラインの場合にサーバーからデータをフェッチするか、アプリケーションがオフラインの場合にキャッシュからデータをフェッチするよう指示します。

サービスからフェッチ(キャッシュミス)

キャッシュ・レイヤーに、キャッシュからデータをフェッチするよう指示します。リクエストされたデータが見つからない場合、キャッシュ・レイヤーはサーバーからフェッチします。

サービスからフェッチ(キャッシュミスまたは有効期限)

キャッシュ・レイヤーに、キャッシュに存在し、失効していない(有効期限切れでない)場合にキャッシュ内のデータをフェッチするよう指示します。それ以外の場合、キャッシュ・レイヤーはリクエスト・データをサーバーからフェッチします。

キャッシュからフェッチ(更新をスケジュール)

キャッシュ・レイヤーに、キャッシュからデータをフェッチし、サーバーの最新コピーからキャッシュを更新するバックグラウンド・リフレッシュをスケジュールするよう指示します。キャッシュミスがある(キャッシュにリクエストされたデータがない)場合、キャッシュ・レイヤーはクライアント・アプリケーションにnullオブジェクトを返します。

更新でフェッチ

キャッシュ・レイヤーに次のことを指示します。

- リクエストしたデータが存在し、期限切れでない場合、キャッシュからデータをフェッチします。

- バックグラウンドのリフレッシュをスケジュールして、サーバーの最新コピーからキャッシュを更新します。

キャッシュミスがある(リクエストされたデータがキャッシュにない)場合、またはデータが有効期限切れの場合、キャッシュ・レイヤーはサービスからフェッチ・ポリシーと同様にデータをサーバーから直接フェッチします。

表25-2 有効期限ポリシー

ポリシー

説明

再起動時に期限切れ

キャッシュ・レイヤーに、クライアント・アプリケーションの再起動時にURIのデータを期限切れとみなすか、クライアント・アプリケーションによって次回コールされたときにサーバー・コピーでローカル・データを更新するかを指示します。

期限切れまでの時間

キャッシュ・レイヤーに、期限切れにするまでの時間ポリシーで設定された指定時間(秒単位)の経過後にデータを期限切れにするよう指示します。このポリシーは、定期的に更新されるデータに使用されます。

期限切れにするまでの時間

キャッシュ・レイヤーがキャッシュ内のデータを有効期限切れとみなすまでの秒数。

期限切れなし

キャッシュ・レイヤーに、ローカル・データを有効期限切れとして指定できないことを指示します。

表25-3 削除ポリシー

ポリシー

説明

起動時に期限切れを削除

キャッシュ・レイヤーに、クライアント・アプリケーションの再起動時にキャッシュの有効期限切れデータを削除するか、クライアント・アプリケーションによって次回コールされたときにサーバー・コピーでローカル・データを更新するよう指示します。

手動削除

キャッシュ・レイヤーは、ローカル・キャッシュからデータを自動的には削除できません。データを手動で削除するには、APIを使用します。

表25-4 更新ポリシー

ポリシー

説明

オンラインの場合に更新

キャッシュ・レイヤーに、クライアント・アプリケーションがオンラインの場合にのみサーバー側データでローカル・キャッシュを更新するよう指示します。それ以外の場合、キャッシュ・レイヤーはエラーを戻します。

25.5 sync-config.xmlファイルでの構成サービス・エンド・ポイントの使用

sync-config.xmlのBaseUri要素およびServerGroup要素のbaseUri属性は、connections.xmlで定義されたエンド・ポイントを参照できます。この機能を利用するには、次のように、URL以外の有効な接続参照を指すように値を置換します。

baseUri="<connection_reference_name_in_connections_xml>"

エンド・ポイントが接続オーバーライドを使用して実行時に変更された場合、キャッシュ・ポリシーは新規URLに対しても同じになります。詳細は、第14章「MAFアプリケーションで使用されるエンド・ポイントの構成」を参照してください。WorkBetterサンプル・アプリケーションは、この構成の実装を示しています。このサンプルおよびその他のサンプル・アプリケーションにアクセスする方法は、付録E「サンプルのMAFアプリケーション」を参照してください。

25.6 MAFアプリケーションでのキャッシュ・データの暗号化

MAFには、MAFアプリケーションがキャッシュするデータを暗号化する機能が用意されています。

有効にすると、MAFアプリケーションでキャッシュされたすべてのデータが暗号化されます。このオプションはデフォルトでは無効にされています。次の例に示すように、暗号化を有効にするようにsync-config.xmlファイルを構成します。

<?xml version="1.0" encoding="UTF-8"?>
<Settings xmlns="http://xmlns.oracle.com/sync/config">
<BaseUri>TaskConn</BaseUri>
...
<EnableEncryption>true</EnableEncryption>
<Policies>
...
</Settings>

25.7 FARでのsync-config.xmlファイルのパッケージ化

ビュー・コントローラ・プロジェクトがFARとしてデプロイされると、sync-config.xmlファイルは機能アーカイブ・ファイルに含まれます。connections.xmlファイルと同様に、FARをアプリケーションに追加すると、MAFではFAR (jar-sync-config.xml)内のsync-config.xmlファイルの内容と、使用するアプリケーションのsync-config.xmlファイルの内容をマージします。第8.2項「MAFアプリケーションでのFARコンテンツの使用方法」で説明されているように、sync-config.xmlファイルには、モバイル・アプリケーションによって使用されるWebサービスのエンド・ポイントが記述されているため、FARを追加することで、モバイル・アプリケーションを構成するアプリケーション機能によって使用されるすべてのWebサービスのエンド・ポイントを更新できます。

FARをアプリケーションに追加すると、MAFでは、アプリケーションのsync-config.xmlファイルおよびconnections.xmlファイルを確認し、必要に応じて変更するように求めるメッセージがログに記録されます。これらのメッセージは、使用するアプリケーションのsync-config.xmlファイルの状態を反映します。

使用するアプリケーションに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.3項「エラー・メッセージのローカライズ」

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

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

モバイル・アプリケーションで発生するエラーには、リモート・サーバーへの接続失敗などの予想外のエラーと、アプリケーション・ビジネス・ルールの違反などの想定されるエラーがあります。エラーまたは例外は、プライマリ・リクエスト・スレッド、またはバックグラウンド・タスクを実行するセカンダリ・スレッドで発生する場合があります。アプリケーションで複数の言語がサポートされている場合、エラー・メッセージはユーザーの言語で表示される必要があります。

モバイル・アプリケーションが例外をスローできるようにするには、oracle.adfmf.framework.exception.AdfExceptionクラスを使用します。詳細は、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,                                                                                message,
null,
null});

if (AdfException.ERROR.equals(severity))      {        // we still need to throw execption 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アプリケーションのデプロイ

この章では、テストと公開のためのモバイル・アプリケーションのデプロイ方法について説明します。

この章には次の項が含まれます:

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

- 第27.2項「デプロイメント構成の使用」

- 第27.3項「Androidアプリケーションのデプロイ」

- 第27.4項「iOSアプリケーションのデプロイ」

- 第27.5項「ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ」

- 第27.6項「機能アーカイブ・ファイル(FAR)のデプロイ」

- 第27.7項「モバイル・アプリケーション・アーカイブ・ファイルの作成」

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

- 第27.9項「Oracle Mobile Security Suiteでのデプロイ」

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

エンド・ユーザーに配布するためにアプリケーションを公開する前に、デバイスまたは仮想デバイスでこれをテストして、その動作と使いやすさを評価する必要があります。MAFアプリケーションをテストするデバイスまたは仮想デバイス(エミュレータまたはシミュレータ)にMAFアプリケーションをデプロイするために使用するデプロイメント構成を作成します。

MAFでは、デプロイメント構成を使用してアプリケーションをデプロイする場合、プラットフォーム固有のテンプレート・アプリケーションを一時的な場所にコピーした後、MAFプロジェクト内で定義されたコード、リソースおよび構成を使用して、そのアプリケーションを更新します。その後、MAFでは、ターゲット・プラットフォームのツールを使用して、アプリケーションをビルドおよびデプロイします。ダウンロード・サイトまたはアプリケーション・マーケットプレイス(Apple App Storeなど)から入手可能なプラットフォーム固有のパッケージとして、モバイル・アプリケーションをデプロイできます。テストおよびデバッグの目的で、デバイスまたは仮想デバイスにデプロイできます。ビュー・プロジェクトを機能アーカイブ(FAR)としてデプロイすることで、アプリケーション機能を再利用できます。また、モバイル・アプリケーション全体は、モバイル・アプリケーション・アーカイブ(.maa)・ファイルとしてデプロイすることで再利用することもできます。

それぞれのMAFデプロイメント構成(Android、iOS、Windows)には、デプロイメントのタイプ(リリースまたはデバッグ)とデプロイメント・ターゲット(シミュレータまたは実際のデバイス)の組合せに固有の異なるライブラリのセットが含まれています。さらに、それぞれのライブラリ・セットには、JVMのJARファイルが含まれます。アプリケーションのバインディング・レイヤーは、Objective-Cライブラリのコレクションであるこの仮想マシン内にあります。たとえば、MAFは、iOSシミュレータをターゲットとするデバッグ・デプロイメントに対して、JVM JARファイルと一連のライブラリをデプロイしますが、実際のiOSデバイスをターゲットとするデバッグ・デプロイメントに対しては、異なるJVM JARファイルと一連のライブラリをデプロイします。プロジェクトに宣言したライブラリが、プロジェクトのデプロイメント・アーティファクトに含まれています。

27.2 デプロイメント構成の使用

アプリケーションを実行するプラットフォーム(Android、iOS、Windows)のデプロイメント構成を作成します。デプロイメント構成では、プラットフォーム・デバイス(Androidデバイス、Androidエミュレータなど)にデプロイするアプリケーションをアーカイブにパッケージ化する方法を定義します。デプロイメント構成は次のことを実行します。

- パッケージ化およびデプロイするアセンブリ・プロジェクトを選択します。

- デプロイ先のターゲットを選択します。ターゲットは、プラットフォーム(Androidなど)とMAFランタイムの固有バージョンの組合せです。

- デプロイ先のデバイス・プロファイル(エミュレータまたはデバイス)を選択します。

- プラットフォーム固有の拡張オプションを選択します。

- デプロイするアプリケーションを指定します。

プラットフォーム固有のデプロイメント構成に加えて、MAFでは、MAFアプリケーションをMAFアプリケーション・アーカイブ(.maa)ファイルとしてパッケージ化することもできます。このファイルを使用すると、.maaファイルとしてパッケージ化された既存のアプリケーションを使用する新しいMAFアプリケーションを作成できます。このデプロイメント・ファイルには、MAFアプリケーション名に_archiveが続く形式の名前がデフォルトで付けられます。詳細は、第27.7項「モバイル・アプリケーション・アーカイブ・ファイルの作成」を参照してください。

27.2.1 デプロイメント構成について

図27-1に示すように、「実行」ボタンを使用してデプロイメント構成を作成した直後にその構成を使用してMAFアプリケーションをデプロイできます。

図27-1 実行構成の作成

27.2.2 実行構成とデバッグ構成の相違点

実行構成およびデバッグ構成は両方とも「実行」メニューから起動でき、これらは、デバッグ構成が、デバッグ・オプションを設定する追加のタブである「デバッグ」タブを持っている点で違います。詳細は、第30章「MAFアプリケーションのテストおよびデバッグ」を参照してください。

- デバッグ - 開発ビルドにはこのオプションを選択します。デバッグ・ビルドを指定すると、デバッグ・シンボルが含まれます。
デプロイメントの間は、デフォルト・キーストアを使用するためにデバッグを選択する必要があります。

注意:
デバッグは、UWPアプリケーションには使用できません。

実行時、赤い三角形の中の感嘆符で表されるデバッグ・シンボルを重ねることで、デバッグ・モードにアプリケーションがデプロイされたことをMAFは示しています。

- 実行 - リリースの準備ができたビルドをライブラリなどとともに、リリース・ビットやライブラリなどとともにビルドします。

ヒント:
アプリケーションがリリース用にコンパイルされているかどうかは、デバッグ・モードではなく、実行モードを使用して、アプリケーションのパフォーマンスをテストします。

27.2.3 デプロイメント構成の作成方法

アプリケーションを作成するときに、アプリケーションのデプロイメント・ターゲットを選択します。後でデプロイメント構成を作成するときに、使用するデプロイメント・ターゲットを選択します。これらの構成を使用してアプリケーションをデプロイしたり、MAF固有の構成ダイアログを使用してアプリケーションを編集したり、新規構築することができます。「実行構成」ダイアログと「デバッグ構成」ダイアログでは、デフォルトのデプロイメント構成を作成できます。デプロイメント構成は、必要な数だけ作成できます。

始める前に:

OEPEでモバイル・アプリケーションをデプロイできるようにするには、Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールのモバイル・アプリケーション・フレームワークの構成に関する項の説明に従って、ターゲット・プラットフォーム用のSDKを指定する必要があります。

OEPEでモバイル・アプリケーションをデプロイできるようにするには、MAFの「プリファレンス」ページを使用してターゲット・プラットフォームのSDKを指定する必要があります。

ヒント:
iOSデプロイメントの場合は、iTunesおよびiOSシミュレータを1回以上実行してから、それらのディレクトリの場所をMAFプラットフォームのプリファレンス・ページで構成します。

デプロイメント構成を作成するには、次の手順を実行します。

1. 開発の場合、「実行」→「デバッグ構成」を選択します。
本番の場合、「実行」→「実行構成」を選択します。

2. MAFアプリケーションに移動し、「新規」を選択して新しい構成を作成します(図27-1を参照)。

3. 次の手順を実行します。

- 構成のデフォルト名をそのまま使用するか、新しい構成名を入力します。

- アセンブリ・プロジェクトを選択します。

- 使用可能なもののリストからターゲットを選択し、使用可能なもののリストからデバイスまたはエミュレータを選択します。必要に応じて、リストをリフレッシュします。

- 必要に応じて、デプロイ先にするデバイスのキーストアおよびキーの別名を選択します。

4. ただちにデプロイする場合は、「実行」をクリックします。構成を保存するには、「適用」をクリックします。または、「変更の保存」ダイアログで「閉じる」をクリックし、「はい」をクリックします。

27.2.4 デプロイメント構成の作成時の処理

「実行」または「デバッグ」をクリックしてアプリケーションをデプロイするとき、アプリケーションのパッケージングおよびデプロイメントがトリガーされます。OEPEによって、デプロイメント・ディレクトリおよび関連するサブディレクトリが作成されます。ビュー・プロジェクト(違った名前である必要があります)およびアセンブリ・プロジェクト用に機能アーカイブ・ファイル(FAR)も作成されます。これら2つのFARに加え、プロジェクトにインポートされたFARのコピーが、OEPEによって作成されます。最後に、パッケージがデバイスまたはエミュレータにデプロイされます。

デプロイ・アーティファクトをクリーンアップするには、一部のプロジェクトまたはすべてのプロジェクトに対して「クリーン」ダイアログを使用します。クリーンアップの対象:

- 一部のプロジェクト。これが、クリーンリビルドを行うのに最速の方法です。
下で選択したプロジェクトのクリーンアップを選択し、クリーンアップするアセンブリ・プロジェクトを選択し、「OK」をクリックします。

- すべてのプロジェクト。これにより、すべてのユーザー・アーティファクトは、再ステージングおよびデプロイ前にリビルドされます。
すべてのプロジェクトのクリーンアップを選択し、「OK」をクリックします。

実行構成を作成すると、メニュー・バーから緑色の実行矢印をクリックしてそれを選択できます。矢印をクリックすると、最後に使用された実行構成が選択されます。緑色の矢印の隣のドロップダウン・セレクタをクリックし、コンテキスト・メニューから実行する構成を選択することによって、別の実行構成を選択できます。

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

図27-2に示すように、デプロイメント構成を定義した後、実行構成ダイアログまたはデバッグ構成ダイアログからモバイル・アプリケーションをAndroidプラットフォームにデプロイできます。

デバッグ構成ダイアログを使用すると、完成したアプリケーションをAndroidエミュレータまたはテスト用のAndroidデバイスにデプロイできます。アプリケーションのテストおよびデバッグの終了後、実行構成ダイアログを使用してモバイル・アプリケーションをAndroidアプリケーション・パッケージ(.apk)・ファイルにバンドルし、Google Playなどのアプリケーション・マーケットプレイスなどを介してエンド・ユーザーに公開できます。

図27-2 Androidアプリケーションの「デプロイメント構成」ダイアログ

27.3.1 Androidデプロイメント構成の作成方法

Androidのデプロイメント構成を作成するには、アプリケーションの署名オプションとjavacコンパイラの動作を定義し、必要な場合はアプリケーション・アイコンに使用されるデフォルトOracleイメージをカスタム・イメージでオーバーライドします。

始める前に:

Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールの説明に従って、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. 「ウィンドウ」メニュー(MacOSではEclipseメニュー)から「プリファレンス」ダイアログを開き、図27-3に示すように、「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Android」を選択してAndroidのプリファレンス・ページを開きます。

図27-3 Androidプリファレンスの設定

2. 「追加」をクリックして「SDKの選択」ダイアログを開き、Android SDKの場所に移動します。「OK」をクリックします。

SDK information for Android 4.4.2 (API 19)は、図27-4に示すとおり、前のバージョンとは異なります。

注意:
プッシュ通知には、Android 2.2プラットフォーム(またはそれ以降)を実行しているデバイスとエミュレータが必要です。これらのデバイスには、Google Playストアがインストールされている必要があります。エミュレータ上でプッシュ通知を有効にするには、Google APIがSDKにインストールされている必要があります。ユーザーは、4.0.3 (API 15)以前のプラットフォームを実行しているデバイス上で、Googleアカウントを作成(およびログイン)する必要があります。
Android開発者のWebサイト(http://developer.android.com/index.html)で入手可能な『Google Cloud Messaging for Android』の「GCM Architectural Overview」および第27.3.1項「Androidデプロイメント構成の作成方法」も参照してください。

構成を作成するには、次の手順を実行します。

1. 「実行」→「実行構成」を選択して、「構成」ダイアログを開きます。

2. 図27-4に示すように、「構成」ダイアログで、構成の名前を入力します。

3. 利用可能なプロジェクトのリストからアセンブリ・プロジェクトを選択します。

4. アプリケーションIDを変更する場合は、デプロイされるバンドルIDに新しいIDを入力します。

注意:
Androidデバイスまたはエミュレータにアプリケーションが正しくデプロイされるようにするには、IDの先頭を数字やピリオドではなく、文字にする必要があります。たとえば、IDが925090のように(com.company.925090)完全に数値で構成されている場合、アプリケーションはデプロイできません。hello925090などの文字で始まるIDであれば(com.company.hello925090)、デプロイメントは正常に実行できます。

5. プラットフォーム・バージョンとMAFランタイム・バージョンの組合せであるターゲットを選択します。

6. ターゲット構成を選択します。つまり、アプリケーションをデプロイするデバイスまたはエミュレータのことです。

注意:
場合によってはOEPEは、Androidエミュレータを検出できません。adbサーバーに関連付けられたデーモンが動作していないためです。デーモンが動作していないときは、OEPEはエラー・メッセージを表示します。
ターゲット・デバイスが設定されていないか、選択したデバイスが無効です。デバイスがドロップダウンに表示されない場合は、「リフレッシュ」をクリックします。デバイスが見えない場合は、コマンドadb devicesを実行してデバイスのステータスを確認してください。

SDK/platform-toolsディレクトリからadb devicesを実行すると、次のようにデーモンが起動します。

<sdk-install>\adt-bundle-windows-x86_64-20130717\sdk\platform-tools>adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
emulator-5554 device

OEPEによってエミュレータが検出されます。

7. キーストアを入力します。必要に応じて、「キーストアを選択」をクリックすると、「プリファレンス」ダイアログのAndroidキーストア・ページが開き、キーストアを追加できます。詳細は、第27.3.1.3項「Android署名オプションの定義」を参照してください。また、Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で入手可能な「Signing Your Applications」で、アプリケーションの公開に関する情報も参照してください。

図27-4 Android SDKおよび署名プロパティの設定

注意:
Androidエミュレータにアプリケーションをデプロイするには、API 14以降(Platform 4.0.n)をインストールする必要があります。

27.3.1.1 詳細オプションの設定

Android詳細オプション・ページでは、図27-4に示すように、次のことができます。

- 「最小SDK APIレベル」、「ターゲットSDK APIレベル」、「バージョン・コード」、「ソース・ファイル」、「クラス・ファイル」、「Zipアラインメント」、「優先記憶域の場所」など、数多くの高度なオプションを設定します(図27-5を参照)。

図27-5 SDKレベルの設定

- 図27-6に示すように、デフォルトのアプリケーション・イメージを変更します。

図27-6 アプリケーション・イメージの設定

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

デプロイメント構成ダイアログの「メイン」タブと「共通」タブ、そして「詳細オプション」ボタンから起動するAndroid詳細オプション・ダイアログでは、javacコンパイラ・ツール・オプションの中で渡す値およびAndroid APIリビジョンも設定できます。

R.javaファイルと.classファイルのJDK互換性レベルを設定するには:

1. デプロイメント構成ダイアログで、「オプション」をクリックして「詳細オプション」ダイアログを開きます。

2. 「最小SDK APIレベル」ドロップダウン・リストから、アプリケーションが実行できる最小APIレベルを選択します。最小デフォルト値は15で、Android 4.0.3プラットフォームに対応しています。

3. 「ターゲットSDK APIレベル」ドロップダウン・リストから、アプリケーションが実行されるAPIレベルを選択します。最小(デフォルト)値はAPIレベル9で、これはAndroid 2.3.nプラットフォームに対応します。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/manifest/manifest-intro.html)で入手可能な「The AndroidManifest.xml File」で、<uses-sdk>属性の説明を参照してください。

27.3.1.3 Android署名オプションの定義

アプリケーションは、Androidデバイスまたはエミュレータにデプロイする前に、署名する必要があります。Androidでは、認証局は不要です。アプリケーションは自己署名できます。

始める前に:

キーストアが存在しない場合、OEPEによって作成されます。また、次の例に示すように、keytoolユーティリティを使用して1つ作成できます。

アプリケーションは、Androidデバイスまたはエミュレータにデプロイする前に、署名する必要があります。Androidでは、認証局は不要です。アプリケーションは自己署名できます。

デプロイメントにおけるモバイル・アプリケーションの署名方法の定義は、2つの手順で構成されており、MAFプラットフォーム・プリファレンス・ページで、Androidアプリケーションの署名に使用するキーのリリース・プロパティをまず定義します。リリースの署名プロパティは、一度構成するのみでかまいません。これらのオプションを定義したら、デプロイメント構成を構成して、リリース・モードでアプリケーションをデプロイするかどうかを指定します。

keytool -genkey
-v
-keystore c:\oepe\workspace\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テクニカル・ドキュメント(https://download.oracle.com/javase/index.html)を参照してください。

キー・オプションを構成するには、次の手順を実行します。

1. 「ウィンドウ」→「プリファレンス」→「Oracle」→「モバイル・アプリケーション・フレームワーク」→Androidキーストアを選択します。

2. 図27-7に示すように、クリックして「キーストアを選択」ダイアログでキーストアの場所に移動し、「OK」をクリックします。

図27-7 キーストアの場所の選択

3. キーストアのパスワードを入力します。正しいパスワードを入力すると、「追加」ボタンが有効になります。

4. 図27-8に示すように、「追加」をクリックしてキーの別名の選択ダイアログを開きます。

図27-8 キーの別名の選択

5. キーの別名のパスワードを入力し、「OK」をクリックします。
これで、キーストアおよびキーの別名が、デプロイメント構成ダイアログで使用できます。

Androidビルド・モードを設定するには:

1. 次のいずれかを実行します。

- 「実行」メニューから、「デバッグ構成」を選択します。アプリケーションの開発やテスト(JavaやJavaScriptのデバッグなど)を行う際は「デバッグ」を選択します。このオプションを使用すると、秘密鍵を提供しなくても、Androidプラットフォーム上でアプリケーションをデプロイできます。Androidエミュレータまたはテスト用のAndroidデバイスにアプリケーションをする場合は、このオプションを使用します。第30.3.2項「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

注意:
デバッグ・キーストアおよびキーで署名されたアプリケーションは公開できません。デバッグ・キーストアおよびキーは、テストのみに使用され、エンド・ユーザーへのアプリケーションの公開には使用できません。

- 「実行」メニューから、「実行構成」を選択します。アプリケーションを公開する準備ができた場合は、「リリース」を選択します。このオプションは、アプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開する準備ができた場合に使用します。

2. 「デプロイメント構成」ダイアログで、.apkファイルがデバッグ・モードまたはリリース・モードで署名された後は、デバイスまたはエミュレータにデプロイできます。図27-9に示すように、実行時にMAFは、赤い三角形の中の感嘆符で表されるデバッグ・シンボルをオーバーレイすることで、アプリケーションがデバッグ・モードでデプロイされたことを示しています。

図27-9 デプロイメント・モード

27.3.1.4 資格証明の保存に関する必知事項

キーストア・アクセス用の資格証明は、Eclipse Secure Storageに保存され、ここには、ワークスペース外のデータが保存されます。場所は通常ホーム・ディレクトリですが、OSプラットフォームに応じて特定の場所は変わります。

Secure Storageの場所を探すには、次の手順を実行します。

1. 「ウィンドウ」メニュー(MacOSではEclipseメニュー)から「プリファレンス」ダイアログを開き、「一般」→「セキュリティ」→Secure Storageに移動してSecure Storageページを表示します。

2. 「コンテンツ」タブをクリックします。たとえば、user-home/.eclipse/org.elipse.equinox.security/secure_storageのように、ストレージの場所がダイアログの下部に表示されます。

3. ノード「Oracle」→「Eclipse」→「ツール」→「oepe」→「maf」→「Android」→「キーストア」を展開すると、保存されているパスワードを確認できます。
「プリファレンス」ダイアログの「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Android」→「Androidキーストア」ページに、宣言されているキーストアごとにノードがあります。

ノードをクリックしてデータを表示します(パスワードは不明瞭化されています)。

注意:
iOSのキーはMac固有のものであるため、キーをEclipseに保存する必要はありません。iOS XcodeBuildは、起動時に指定されるmobileprovisionに基づいてMac Keychainから直接抽出します(「プリファレンス」ダイアログの「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Android」→「Androidキーストア」ページから構成されます)。

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

サイズや解像度の異なるAndroidデバイス上でMAFアプリケーション・アイコンが適切に表示されるようにするには、同じイメージの低密度、中密度および高密度バージョンを用意する必要があります。MAFは、これらの表示要件を満たすデフォルトのOracleイメージを提供します。ただし、アプリケーションでカスタム・アイコンが必要とされる場合は、「アプリケーション・イメージ」ページ(図27-10を参照)を使用して、アプリケーション・アイコンとスプラッシュ画面用のPNG形式のイメージを選択することで、デフォルト・イメージをオーバーライドできます。スプラッシュ画面には、縦向きと横向きのイメージを追加できます。カスタム・イメージ・ファイルを追加しない場合は、デフォルトのOracleアイコンが使用されます。カスタム・イメージを作成するには、『Iconography』ドキュメントを参照してください。このドキュメントは、Android開発者のWebサイト(http://developer.android.com/design/style/iconography.html)にあります。

図27-10 Androidアプリケーション用のカスタム・イメージの設定

図27-10には、低密度、中密度、高密度および超高密度ディスプレイを装備するデバイスでの表示にアプリケーションで使用されるアプリケーション・アイコンのイメージと縦向きのスプラッシュ画面用のイメージを選択する様子が示されています。

始める前に:

Androidテーマに適しており、複数の画面タイプをサポートできるディメンション、密度およびコンポーネントを使用するPNG、JPEGまたはGIFファイル形式のイメージを取得します。イメージのデフォルトの場所はassembly directory\res\androidにあります。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/practices/screens_support.html)にある『Supporting Multiple Screens』ドキュメントを参照してください。

カスタム・イメージを追加するには:

1. 「実行」→「実行構成」をクリックして、デプロイメント構成ダイアログを開きます。

2. 「オプション」をクリックしてAndroid詳細オプション・ダイアログを開き、「アプリケーション・イメージ」タブをクリックします。
変更するイメージの密度を選択して適切なノードを展開し、変更するイメージを選択します。

3. 「参照」をクリックして使用する新しいイメージを選択し、「OK」をクリックします。

27.3.1.6 OEPEがAndroidアプリケーションにイメージをデプロイした場合の処理

表27-1に示されているように、各イメージ・ファイルは、drawableオブジェクトにちなんで名付けられたdrawableというサブディレクトリにコピーされます。詳細は、Android開発者のWebサイト(http://developer.android.com/reference/android/graphics/drawable/Drawable.html)を参照してください。それぞれのdrawableディレクトリは、イメージ密度(ldpi、mdpi、hdpiおよびxhdpi)と向き(port、land)に対応します。これらのディレクトリ内で、OEPEは、各アイコン・イメージ・ファイルの名前をadfmf_icon.pngに、各スプラッシュ画面イメージの名前をadfmf_loading.pngに変更します。

注意:
assembly project\.main.androidの内容を表示するには、プロジェクト・エクスプローラのデフォルトのビューを変更する必要があります。詳細は、第2.3.2項「MAFアプリケーションを作成する場合の処理」を参照してください。

表27-1 シードされたアプリケーション・イメージのデプロイメント・ファイルの場所

ソース・ファイル(...\res\android)

一時デプロイメント・ファイル(...\.main.android\build\release\res)

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

カスタム・イメージの場合、OEPEは、アプリケーション・アイコンのセットを指定の場所から一時デプロイメントの場所の対応する密度と向きのサブディレクトリにコピーします。

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

モバイル・アプリケーションは、Androidエミュレータに直接デプロイできます。

始める前に:

Androidエミュレータにデプロイするには、次を行う必要があります。

- Androidプラットフォームの「プリファレンス」ページでキーストア・パスワードおよびキーの別名の詳細を構成します(「ウィンドウ」→「プリファレンス」→「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Android」→Androidキーストアを選択してアクセスします)。

注意:
Android 4.0.nプラットフォーム(API 14以降)をインストールする必要があります。

- Android Virtual Deviceインスタンスの構成にARMシステム・イメージが反映されていることを確認します。

- アプリケーションをデプロイする前にAndroidエミュレータを起動します。
エミュレータは、Android Virtual Device Manager(図27-11を参照)またはコマンド行を使用して起動できます。コマンド行から起動する場合は、toolsディレクトリ(Android\android-sdk内)に移動し、emulator -avdに続けてエミュレータ名を入力することで(例: -avd AndroidEmulator1)、エミュレータを起動します。

注意:
Androidエミュレータは一度に1つのみ実行できます。

図27-11 Android Virtual Device Managerを使用したエミュレータの起動

アプリケーションをAndroidエミュレータにデプロイするには:

1. 「実行」→「実行構成」を選択するか、「実行」→「デバッグ構成」を選択します。MAFアプリケーション・ノードの下で、Androidデプロイメント構成を選択します。

2. ターゲットが使用するものであることを確認し、「実行」または「デバッグ」をクリックします。
状況により、デプロイメント・プロセスがハングすることがあります。その場合、adbサーバーを強制終了してから再起動し、デプロイメントを再試行してください。

3. 図27-12に示すように、コンソールでデプロイメント・ログを確認します。デプロイメント・ログには、デプロイヤがAndroidエミュレータの実行中インスタンスを検出し、Androidデバッグ・ブリッジ・サーバーを起動したことが示されます。

図27-12 デプロイメント・ログ

27.3.3 アプリケーションをAPKファイルとしてローカルにデプロイする方法

アプリケーションは、ローカル・ファイルシステムに.apkファイルとしてデプロイできます。

注意:
第27.3.1.3項「Android署名オプションの定義」の説明に従って、Androidプラットフォームの「プリファレンス」ページで署名オプションを構成する必要があります(「ウィンドウ」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択してアクセスします)。

Androidアプリケーションをローカル・ファイルにデプロイする手順:

1. 「実行」→「実行構成」を選択して「実行構成」ダイアログを開きます。MAFアプリケーション・ノードの下で、Androidデプロイメント構成を選択します。

2. 「ターゲット構成」で、「APKのみを生成」を選択し、APKファイルが生成される場所を入力します。

3. 「実行」をクリックします

4. 図27-12に示すように、コンソールでデプロイメント・ログを確認します。デプロイメント・ログには、アプリケーションのソースが記録され、宛先が表示されます。

図27-13 デプロイメント・ログ

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

モバイル・アプリケーションは、2.n (APIレベル9)以上のプラットフォームで動作するAndroidデバイスに直接デプロイできます。

始める前に:

Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールの説明に従って、OEPEをホストする開発コンピュータにデバイスを接続します。

図27-4に示すように、デバッグ署名資格証明がAndroidプラットフォームの「プリファレンス」ページで構成されていることを確認します。

Androidデバイスにアプリケーションをデプロイするには:

1. 「実行」→「実行構成」を選択して「実行構成」ダイアログを開きます。MAFアプリケーション・ノードの下で、Androidデプロイメント構成を選択します。

2. 使用するターゲットを確認し、「実行」をクリックします。

3. 図27-12に示すように、コンソールでデプロイメント・ログを確認します。デプロイメント・ログには、デプロイヤがAndroidエミュレータの実行中インスタンスを検出し、Androidデバッグ・ブリッジ・サーバーを起動したことが示されます。

図27-14 デプロイメント・ログ

1. 「実行」→「実行構成」を選択するか、「実行」→「デバッグ構成」を選択します。MAFアプリケーション・ノードの下で、Androidデプロイメント構成を選択します。

2. ターゲットが使用するものであることを確認し、「実行」または「デバッグ」をクリックします。

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

第30章「MAFアプリケーションのテストとデバッグ」の説明に従ってアプリケーションのテストとデバッグが完了したら、Android開発者のWebサイト(http://developer.android.com/tools/publishing/publishing_overview.html)の説明に従ってアプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開できます。

始める前に:

実行構成を作成します。

注意:
第27.3.1.3項「Android署名オプションの定義」の説明に従って、Androidプラットフォームの「プリファレンス」ページで署名オプションを構成する必要があります(「ウィンドウ」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択してアクセスします)。

.apkファイルとしてアプリケーションをデプロイするには:

1. 「実行」→「実行構成」を選択して実行構成を作成します。MAFアプリケーション・ノードの下で、Androidデプロイメント構成を選択します。

2. 使用するターゲットを確認し、「実行」をクリックします。

3. コンソールでデプロイメント・ログを確認します。

4. アプリケーション・マーケットプレイスにアプリケーションを公開します。

27.3.6 .apkファイルを作成する場合のOEPEでの処理

アプリケーションをデプロイすると、次のものが.apkファイルにデプロイされます。

- adfmsrcの内容

- .adfフォルダの内容

- maf-application.xmlおよびmaf-feature.xmlファイル

- logging.propertiesファイル

- JVM 1.4ファイル

表27-2 .apkファイルの内容

内容

.apkファイル内の場所

.adfフォルダの内容

Androidアプリケーション・ファイルのルート・フォルダ([apkRoot]\.adf)

adfmsrcフォルダの内容

デプロイメントでは、adfmsrcフォルダの内容が、userフォルダ([apkRoot]\user)内のデフォルトJARファイルにパッケージ化されます。このJARファイルはAndroid Asset Packaging Tool (AAPT)を使用して.apkに追加され、ANDROID_MOBILE_NATIVE_archiveNという書式のデフォルト名を持ちます。デフォルト名のNは、何番目のAndroid作成プロファイルであるかを示します(この名前はプロファイルの作成時にオーバーライドできます)。

このJARファイルには次が含まれます。

- .javaファイルから生成された任意の.classファイル。これは、ビュー・コントローラ・プロジェクトとadfmsrcの内容に追加されます。.javaファイルはJVM 1.4 JDK javacツールを使用してコンパイルされます。

- データ・バインディングおよびpagedefメタデータ・ファイルが含まれます。

このJARファイルはDalvik仮想マシンによって処理されません。.classファイルはJDK内で実行されるので、Dalvikバイトコード形式(.dex)への変換は不要です。

adfmf_application.xmlファイルとadfmf_feature.xmlファイル

Configurationというファイル([apkRoot]\Configuration)内にあります。

logging.propertiesファイル

アプリケーション・ファイルのルートにあります。

JVM 1.4ファイル

JVMファイルは次の2つの別個のフォルダにパッケージ化されます。

- テンプレート内のライブラリ・ファイル(\framework\build\java_res\libs\)は、APK - [apkRoot]\lib内のlibフォルダにパッケージ化されます。

- \framework\build\java_res\assets\storageファイルは、APK - [apkRoot]\assets\storage内のassets\storageディレクトリにパッケージ化されます。

27.3.7 最近使用されたデプロイメント構成の選択

デプロイメント・アクションを選択した後、OEPEによって、メイン・ツールバーに「デバッグ」ボタンおよび「実行」ボタンへのショートカットが作成されます(図27-15を参照)。下向き矢印をクリックし、同じデプロイメント・アクションを使用してアプリケーションを簡単に再デプロイできるようにする構成を選択します。

図27-15 最近使用した構成の選択

27.3.8 コンソールでのデバイス/エミュレータ・ログインの表示

OEPEでは、デバイスまたはエミュレータからのログ出力は、図27-16に示すように、コンソール内にストリームされます。これはデバッグにきわめて有効です。詳細は、第30.6.1項「プロパティ・ファイルを使用したロギングの構成方法」を参照してください。

図27-16 デバイスまたはエミュレータのログの表示

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

図27-17に示すように、デプロイメント構成ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイしたり、iTunesを使用してデバイスにデプロイできます。iOSアプリケーションはAppleコンピュータからのみデプロイできます。iOSシミュレータへのデプロイメントを行うために、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップを取得する必要はありません。Apple開発者として登録されていれば、App Storeから入手できないXcodeのバージョンにアクセスできるので、問題ありません。iOSデバイスへのデプロイメントに必要なiOS開発者プログラム(第27.4.7項「iOSデバイスへのアプリケーションのデプロイ方法」と第27.4.10項「App StoreへのiOSアプリケーションの配布方法」で説明されています)の詳細は、https://developer.apple.com/programs/を参照してください。

図27-17 「デプロイメント構成」ダイアログ(iOSアプリケーション用)

27.4.1 iOSデプロイメント構成の作成方法

iOSの場合は、「デバッグ構成」ダイアログを使用して、iOSアプリケーションのビルド構成と、スプラッシュ画面イメージおよびアプリケーション・アイコンの場所を定義します。

始める前に:

Xcode (Xcode IDE、パフォーマンス分析ツール、iOSシミュレータ、Mac OS X、iOS SDKを含む)を、OEPEが実行されているAppleコンピュータにダウンロードします。

ヒント:
アプリケーションのコンパイルに最低限必要なサポート対象のバージョンについては、Oracle Technology Network (http://www.oracle.com/technetwork/developer-tools/maf/documentation/index.html)で動作保証とサポートのマトリクスを参照してください。

Xcodeはデプロイメント時に使用されるため、OEPEからモバイル・アプリケーションをデプロイする前に、Appleコンピュータにインストールする必要があります。

ヒント:
Xcodeの最新バージョンはApp Storeから入手できますが、次のサイトから以前のバージョンをダウンロードできます。
https://developer.apple.com/xcode/

このサイトにアクセスするには、Apple IDおよびApple開発者としての登録が必要です。

Xcodeをダウンロードしたら、iOSプラットフォームの「プリファレンス」ページで、そのxcodebuildツールの場所を入力する必要があり、iOSシミュレータへのデプロイメントの場合は、iOSシミュレータのSDKの場所も入力します。詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールを参照してください。

注意:
iTunesとiOSシミュレータの両方を1回以上実行してから、それらの場所をiOSプラットフォームの「プリファレンス」ページに入力します。

第27.4.2項「デバイス署名オプションの設定」で説明されているように、モバイル・アプリケーションを(iOSシミュレータへのデプロイメントとは対照的に) iOSデバイスにデプロイするには、iOSプロビジョニング・プロファイルからプロビジョニング・プロファイルと証明書の両方を取得する必要があります。

デプロイメント構成を作成するには、次の手順を実行します。

1. 図27-18に示すように、「実行」→「デバッグ構成」を選択します。

図27-18 iOSオプションの設定

2. デフォルト値をそのまま使用するか、次を定義します。

- アセンブリ・プロジェクト - 使用可能なプロジェクトのリストから選択します。

- デプロイされるバンドルID - 必要に応じて、会社のドメイン名を特定し、このアプリケーションに使用するバンドルIDを入力します。デプロイされるバンドルIDは、iOSデバイスにインストールされているアプリケーションごとに一意である必要があり、逆パッケージ・スタイル命名規則(つまり、com.<organization name>.<company name>)に準拠している必要があります。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で利用できる『App Distribution Guide』を参照してください。iOS Provisioning Portalを使用したバンドル・シードIDの取得の詳細は、第27.4.9.3項「アプリケーションIDの登録」を参照してください。また、第3.2項「MAFアプリケーションの表示プロパティの設定」も参照してください。

注意:
デプロイされるバンドルIDにはスペースは使用できません。

デプロイされる各バンドルIDは一意なため、複数のモバイル・アプリケーションを同じデバイスにデプロイできます。デプロイされるバンドルIDが異なっているかぎり、2つのアプリケーションに同じ名前を指定できます。同じデバイスにデプロイされるモバイル・アプリケーションは、それぞれ別のサンドボックスに配置されます。アプリケーションが相互に認識したり、データを共有することはありません(デバイス・スコープのみが共通になります)。

- 「ターゲット」 - 「プリファレンス」ダイアログの構成されているターゲットのリストから選択するか、「ターゲット」をクリックして新規ターゲットを追加します。

- 「ターゲットの構成」

- iOSデプロイ・ターゲット - デバイスまたはシミュレータを選択します。

- iOSシミュレータ・バージョン - デプロイ・ターゲットとして「シミュレータ」を選択した場合、アプリケーションをデプロイする先のエミュレータのバージョンを選択します。使用可能なターゲット・バージョンを確認するには、iPhoneシミュレータで「Hardware」→「Version」を選択します。最低バージョンは6.0です。デフォルト設定は「最大使用可能」です。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で利用できる『iOS Simulator User Guide』を参照してください。

注意:
通常は、iOSターゲット・バージョンより古いバージョンをテスト用のシミュレータで使用できます。

- モバイル・プロビジョニング・プロファイルの選択 -

- iOS配布パッケージ(ipa) - 必要に応じて、.ipaファイルまたは.appファイルの名前を入力します。「デプロイメント・アクション」ダイアログ(図27-17を参照)で「配布パッケージにデプロイ」または「デバイスとの同期のためにiTunesにデプロイ」オプションを選択すると、MAFによって.ipaファイルが作成されます。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、.appファイルが作成されます。または、デフォルトの名前を使用します。詳細は、第27.4.7項「iOSデバイスへのアプリケーションのデプロイ方法」と第27.4.10項「App StoreへのiOSアプリケーションの配布方法」を参照してください。
MAFのデフォルトでは、.ipaファイル(または.appファイル)の名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第3.2項「MAFアプリケーションの表示プロパティの設定」を参照してください。

- 「詳細オプション」 - 「オプション」をクリックして「詳細オプション」ダイアログを開き、ここで図27-19に示すように、様々なオプションを設定できます。

図27-19 最小iOSバージョンの設定

最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

- ターゲット・ファミリ: アプリケーションを実行するiOS製品ファミリを選択します。デフォルト・オプションはiPadとiPhoneの両方です。

- Advanced Build Options - XcodeでMAFアプリケーションをビルドするときに使用できる追加の引数を指定します。

- アプリケーション・トランスポート・セキュリティの無効化—アプリケーション・トランスポート・セキュリティ(ATS)は、アプリケーションからのネットワーク・リクエストを制限して、承認されたセキュア・トランスポート・プロトコルのみを使用するセキュリティ・ポリシーです。MAFではATSはデフォルトで有効になっています。「アプリケーション・トランスポート・セキュリティの無効化」を選択すると、ATSが無効な状態でMAFアプリケーションがデプロイされます。

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

iOSプラットフォームの「プリファレンス」ページには、開発コンピュータ上でのプロビジョニング・プロファイルの場所と証明書の名前のフィールドが含まれています。アプリケーションをiOSデバイスにデプロイするか、MAFアプリケーション・アーカイブとしてデプロイする場合は、これらのパラメータを定義する必要があります。

注意:
モバイル・アプリケーションをiOSシミュレータにデプロイする場合は、証明書もプロビジョニング・プロファイルも不要です。

署名オプションを設定するには:

1. 「ウィンドウ」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択します。

2. 「iOS」→iOSモバイル・プロビジョニングを選択します。

3. 図27-20に示すように、ページのモバイル・プロビジョニング情報セクションのモバイル・プロビジョニング・ファイルにプロビジョニング・プロファイルの場所を入力します。

4. OEPEによって「証明書」が入力されます。

図27-20 iOSプラットフォームの「プリファレンス」ページの「デバイス署名」セクション

注意:
プロビジョニング・プロファイルには、アプリケーションの開発バージョン用とリリース・バージョン用の両方があります。アプリケーションのリリース・バージョンに使用されるプロビジョニング・プロファイルは、あらゆるデバイスにインストールできます。一方、開発バージョン用のプロビジョニング・プロファイルは、IDがプロファイルに埋め込まれたデバイスのみにインストールできます。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)にある『App Distribution Guide』を参照してください。

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

デフォルトでは、MAFは、iPhoneとiPadの両方ですべての向きをサポートしています。たとえば、iPads上で上下逆の縦向きでのみ表示する必要があるアプリケーションでは、「デバイスの向き」ページ(図27-21を参照)を使用して、アプリケーションの回転をこれらの向きのみに制限できます。

図27-21 デバイスの向きの選択

アプリケーションの表示をデバイスの特定の向きに制限するには:

1. 「デバイスの向き」を選択します(図27-21を参照)。

2. 表27-3にリストされた向きの中から、不要な向きをすべて消去します。デフォルトでは、MAFは、これらすべてのデバイスの向きにデプロイします。デフォルトでは、これらの向きがすべて選択されています。

表27-3 iPhoneデバイスの向き

アイコン

説明

iPad、縦: ホーム・ボタンは画面の下部。

iPad、上下逆: ホーム・ボタンは画面の上部。

iPad、横左: ホーム・ボタンは画面の左側。

iPad、横右: ホーム・ボタンは画面の右側。

iPhone、縦: ホーム・ボタンは画面の下部。

iPhone、上下逆: ホーム・ボタンは画面の上部。

iPhone、横左: ホーム・ボタンは画面の左側。

iPhone、横右: ホーム・ボタンは画面の右側。

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

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

デバイスの向きを選択解除すると、ソース.plistファイルが更新されます。

27.4.5 iOSアプリケーションでのイメージの使用

デフォルトでは、iTunesを通してiOSデバイスにデプロイされる、またはダウンロード用のアーカイブ(.ipaファイル)としてデプロイされるモバイル・アプリケーションでは、別途指定されていないかぎり、デフォルトのOracleイメージが使用されます。

デプロイされるアプリケーションのアイコンとしてiTunesアートワーク・イメージを選択することで、デフォルトのイメージをオーバーライドします。イメージを使用してアプリケーションのバージョンを区別できます。図27-22は、デフォルト・イメージとユーザーが選択したイメージの違いを示しており、Application4にはデフォルト・イメージが、Application6にはユーザーが選択したイメージ(512 x 512ピクセルにスケールを変更したOracleアイコン)が表示されています。

デプロイメント時に、MAFは、.ipaファイルのトップレベルのiTunesArtworkというファイルにそのiTunesのアートワーク・イメージを追加することで、iTunesでそのアイコンが表示されるようにします。

図27-22 カスタムとデフォルトのアプリケーション・アイコン

iOSアプリケーション・アイコン・イメージの詳細は、『iOS Human Interface Guidelines』の「Icon and Image Design」セクションを参照してください。このドキュメントは、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)から入手できます。

アプリケーション・アイコン、およびカスタム・イメージ付きのアートワークに使用されているデフォルトのOracleイメージをオーバーライドすることで、アプリケーションをリブランドできます。独自のカスタム・イメージをアプリケーションで使用できる方法は3つあります。

- デフォルトのOracleイメージを、実行/デバッグ構成の一部としてオーバーライドする方法が最も簡単です。第27.4.5.1項「構成でのデフォルトのOracleイメージのオーバーライド」を参照してください。

- それぞれのカスタム・イメージのデフォルト・ファイルを各自で上書きできます。第27.4.5.2項「デフォルト・イメージの置換」を参照してください。

- カスタム・アイコンを、デフォルト・アイコンと同じフォルダにコピーして、各イメージのデバイス・プロファイルのプロパティ・ファイルを変更できます。第27.4.5.3項「カスタム・イメージの追加」を参照してください。

注意:
すべてのイメージはPNG形式であることが必要です。

アプリケーションごとに、イメージ・ファイルを含むイメージ・フォルダと、事前定義の鍵をそのフォルダの特定のイメージにマップするプロパティ・ファイルがあります。

- イメージ・フォルダは、application/res/iosです。

- プロパティ・ファイルios-resources.propertiesは、同じフォルダ内にあります。

プロパティ・ファイルでは、カスタム・イメージをどのようにデプロイするかを構成します。たとえば、次のようになります。

# iPad (76 x 76 px)
# Appears on home screen on iPad (later than iOS 6.1)
# deploys to Icon-76.png
oepe.adfmf.res.source.icon76=Icon-76.png

# iPad (152 x 152 px)
# Appears on home screen on iPad with retina display (later than iOS 6.1)
# deploys to Icon-76@2x.png
oepe.adfmf.res.source.icon76@2x=Icon-76@2x.png

# All devices  (40 x 40 px)
# Spotlight on all devices (later than iOS 6.1)
# deploys to Icon-40.png
oepe.adfmf.res.source.icon40=Icon-40.png

27.4.5.1 構成でのデフォルトのOracleイメージのオーバーライド

「アプリケーション・イメージ」ページでは、アプリケーション・アイコン、およびカスタム・イメージ付きのアートワークに使用されているデフォルトのOracleイメージをオーバーライドすることで、アプリケーションをリブランドできます。図27-23に示されているこのページのオプションでは、様々な状況およびデバイスの解像度で使用されるカスタム・イメージの場所を入力できます。

注意:
アイコンを変更すると、そのアイコンが使用されるすべてのデバイスに対して変更されます。

図27-23 デフォルト・イメージのオーバーライド

デフォルト・イメージをオーバーライドする手順:

1. 「実行」→「デバッグ構成」を選択して、デプロイメント構成を開きます。

2. 「オプション」をクリックしてiOS詳細オプション・ダイアログを開きます。

3. 「アプリケーション・イメージ」タブをクリックし、iPhoneまたはiPodのイメージを変更するかどうかを選択します。

4. 変更するイメージを選択し、「参照」を選択して使用するイメージ・ファイルを選択します。このイメージ・ファイルは、現在のアプリケーション内に存在している必要があります。
デプロイメント時に、OEPEは、カスタム・イメージ・ファイルをデプロイメント構成にコピーし、デフォルト・イメージの名前と一致するように名前を変更します。

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

27.4.5.2 デフォルト・イメージの置換

デフォルト・イメージの上書きで対応可能な場合、イメージ・ディレクトリ内のそれらを、各自のカスタム・イメージで上書きできます。

イメージを上書きする手順:

1. アプリケーションのイメージを含むフォルダapplication/res/iosに移動します。

2. 置き換えるイメージを特定し、イメージのサイズと、それが同じフォルダ内のプロパティ・ファイルios-resources.propertiesのどこで使用されるかを確認します。

3. デフォルト・イメージをカスタム・イメージに置き換えます。

27.4.5.3 カスタム・イメージの追加

アプリケーションのイメージを含むフォルダにカスタム・イメージを追加し、各イメージのデバイス・プロファイルに一致するように、プロパティ・ファイルを編集して鍵/値の各ペアを変更できます。

カスタム・イメージを追加するには:

1. アプリケーションのイメージを含むフォルダapplication/res/iosにカスタム・イメージを追加します。
たとえば、myicon.pngと呼ばれる、iPhoneの57 x 57ピクセルのカスタム・イメージがある場合、それをこのフォルダに追加します。

2. 同じフォルダ内のプロパティ・ファイルios-resources.propertiesを開き、カスタム・アイコンを追加するように編集します。
たとえば、myicon.pngを使用できるようにするには、鍵を次のように変更します。

oepe.adfmf.res.source.icon57@2x=myicon.png

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

「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイできます。

始める前に:

iOSシミュレータへのデプロイメントを可能にするには、次のタスクを実行する必要があります。

iOSシミュレータにアプリケーションをデプロイするには:

1. 図27-24に示すように、「実行」→「実行構成」を選択して、「実行構成」ダイアログを開きます。

図27-24 「実行構成」ダイアログ

2. デフォルト値をそのまま使用するか、次を定義します。

- アセンブリ・プロジェクト - 使用可能なプロジェクトのリストから選択します。

- デプロイされるバンドルID - 必要に応じて、会社のドメイン名を特定し、このアプリケーションに使用するバンドルIDを入力します。デプロイされるバンドルIDは、iOSデバイスにインストールされているアプリケーションごとに一意である必要があり、逆パッケージ・スタイル命名規則(つまり、com.<organization name>.<company name>)に準拠している必要があります。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で利用できる『App Distribution Guide』を参照してください。iOS Provisioning Portalを使用したバンドル・シードIDの取得の詳細は、第27.4.9.3項「アプリケーションIDの登録」を参照してください。また、第3.2項「MAFアプリケーションの表示プロパティの設定」も参照してください。

注意:
デプロイされるバンドルIDにはスペースは使用できません。

デプロイされる各バンドルIDは一意なため、複数のモバイル・アプリケーションを同じデバイスにデプロイできます。デプロイされるバンドルIDが異なっているかぎり、2つのアプリケーションに同じ名前を指定できます。同じデバイスにデプロイされるモバイル・アプリケーションは、それぞれ別のサンドボックスに配置されます。アプリケーションが相互に認識したり、データを共有することはありません(デバイス・スコープのみが共通になります)。

- 「ターゲット」 - 「プリファレンス」ダイアログの構成されているターゲットのリストから選択するか、「ターゲット」をクリックして新規ターゲットを追加します。

- 「ターゲットの構成」

- iOSデプロイ・ターゲット - 「シミュレータ」を選択します。

- iOSシミュレータ・バージョン - アプリケーションをデプロイするシミュレータのバージョンを選択します。使用可能なターゲット・バージョンを確認するには、iPhoneシミュレータで「Hardware」→「Version」を選択します。最低バージョンは6.0です。デフォルト設定は「最大使用可能」です。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で利用できる『iOS Simulator User Guide』を参照してください。

注意:
通常は、iOSターゲット・バージョンより古いバージョンをテスト用のシミュレータで使用できます。

- クイック・デプロイの有効化 - OEPEでアプリケーションをビルド後にiOSシミュレータに自動的に再デプロイする場合に選択します。詳細は、第27.4.6.1項「クイック・デプロイの使用」を参照してください。

- モバイル・プロビジョニング・プロファイルの選択 -

- iOS配布パッケージ(ipa) - 必要に応じて、.appファイルの名前を入力します。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、MAFによって.appファイルが作成されます。または、デフォルトの名前を使用します。
デフォルトのMAFでは、.ipaファイルの名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第3.2項「MAFアプリケーションの表示プロパティの設定」を参照してください。

- 「詳細オプション」 - 「オプション」をクリックして「詳細オプション」ダイアログを開き、様々なオプションを設定します。
最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

27.4.6.1 クイック・デプロイの使用

OEPEでは、アプリケーションをiOSシミュレータに自動的に再デプロイできます。これは、アプリケーションに加えた変更を追跡し、ビルド後に再デプロイすることで実行されます。

更新は、リソースの変更時ではなく、アプリケーションのビルド時に行われます。自動ビルドを設定していない場合は、ビルドおよび再デプロイ前にすべてのリソースがコミットされるように、「プリファレンス」ダイアログの「一般」→「ワークスペース」ページでビルド前に自動保存を選択する必要があります。

アプリケーションが再起動されるまで数秒の遅延が生じるため、ビルドの間隔が短い場合、アプリケーションはビルドごとに再デプロイされません。デフォルトは6秒ですが、OEPEのプリファレンスで変更できます。アプリケーションが頻繁に再起動される場合は、クイック・デプロイまでの最小時間を変更できます。

クイック・デプロイの最小遅延を変更するには:

1. 「ウィンドウ」メニュー(MacOSではEclipseメニュー)から「プリファレンス」ダイアログを開き、図27-25に示すように、「Oracle」→「モバイル・アプリケーション・フレームワーク」→「起動」を選択して起動のプリファレンス・ページを開きます。

図27-25 クイック・デプロイの遅延

2. クイック・デプロイが設定されている場合にアプリケーションを再デプロイするまでの秒数(3から120まで)を入力します。デフォルトでは6秒です。

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

「デバイスとの同期のためにiTunesにデプロイ」オプションを使用すると、モバイル・アプリケーションをデバッグおよびテスト用のiOSデバイスにデプロイできます。iOSデバイスまたは配布サイトへのデプロイメントには、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップが必要です。詳細は、https://developer.apple.com/programs/を参照してください。

始める前に:

アプリケーションをOEPEから直接iOSデバイスにデプロイすることはできず、かわりにアプリケーションをApple iTunesのApplicationsフォルダからデプロイする必要があります。そのためには、次のタスクを実行する必要があります。

- Apple iTunesを開発コンピュータにダウンロードし、それを1回以上実行して、必要なフォルダとディレクトリを作成します。

- iOSプラットフォームのプリファレンス・ページで、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プラットフォームの「プリファレンス」ページで、場所を更新する必要もあります。

- xcodebuildツールが起動されるXcodeフォルダの場所を設定します(例: 図27-26の/Developer/usr/bin)。

図27-26 iTunes Mediaフォルダとxcodebuildシステムの場所の設定

- 証明書の名前とプロビジョニング・プロファイルの場所を、iOSプラットフォームの「プリファレンス」ページで入力します。iOS Provisioning Portalによって、iOSデバイスへのデプロイメントまたはApp Storeや内部ダウンロード・サイトへの.ipaファイルの公開に必要な証明書とプロビジョニング・プロファイルが生成されます。

注意:
デバイスまたはアーカイブにデプロイするようにiOSプロビジョニング・プロファイルと証明書を設定しないと、デプロイメントは失敗します。MAFでは、このような状況でデプロイに失敗したアプリケーションがログに記録されます。詳細は、第27.4.9項「iOSデバイスへのアプリケーションのデプロイに関する必知事項」を参照してください。

- デプロイメン構成の「iOSオプション」ページで、ビルド・モードとして「実行」を選択し、「OK」を選択します。

- iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)から入手できる『App Distribution Guide』を参照してください。

iOSデバイスにアプリケーションをデプロイするには:

1. 図27-18に示すように、「実行」→「デバッグ構成」を選択します。

図27-27 iOSオプションの設定

2. デフォルト値をそのまま使用するか、次を定義します。

- アセンブリ・プロジェクト - 使用可能なプロジェクトのリストから選択します。

- デプロイされるバンドルID - 必要に応じて、会社のドメイン名を特定し、このアプリケーションに使用するバンドルIDを入力します。デプロイされるバンドルIDは、iOSデバイスにインストールされているアプリケーションごとに一意である必要があり、逆パッケージ・スタイル命名規則(つまり、com.<organization name>.<company name>)に準拠している必要があります。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で利用できる『App Distribution Guide』を参照してください。iOS Provisioning Portalを使用したバンドル・シードIDの取得の詳細は、第27.4.9.3項「アプリケーションIDの登録」を参照してください。また、第3.2項「MAFアプリケーションの表示プロパティの設定」も参照してください。

注意:
デプロイされるバンドルIDにはスペースは使用できません。

デプロイされる各バンドルIDは一意なため、複数のモバイル・アプリケーションを同じデバイスにデプロイできます。デプロイされるバンドルIDが異なっているかぎり、2つのアプリケーションに同じ名前を指定できます。同じデバイスにデプロイされるモバイル・アプリケーションは、それぞれ別のサンドボックスに配置されます。アプリケーションが相互に認識したり、データを共有することはありません(デバイス・スコープのみが共通になります)。

- 「ターゲット」 - 「プリファレンス」ダイアログの構成されているターゲットのリストから選択するか、「ターゲット」をクリックして新規ターゲットを追加します。

- 「ターゲットの構成」

- iOSデプロイ・ターゲット - デバイスまたはシミュレータを選択します。

- iOSシミュレータ・バージョン - デプロイ・ターゲットとして「シミュレータ」を選択した場合、アプリケーションをデプロイする先のエミュレータのバージョンを選択します。使用可能なターゲット・バージョンを確認するには、iPhoneシミュレータで「Hardware」→「Version」を選択します。最低バージョンは6.0です。デフォルト設定は「最大使用可能」です。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で利用できる『iOS Simulator User Guide』を参照してください。

注意:
通常は、iOSターゲット・バージョンより古いバージョンをテスト用のシミュレータで使用できます。

- モバイル・プロビジョニング・プロファイルの選択 -

- iOS配布パッケージ(ipa) - 必要に応じて、.ipaファイルまたは.appファイルの名前を入力します。「デプロイメント・アクション」ダイアログ(図27-17を参照)で「配布パッケージにデプロイ」または「デバイスとの同期のためにiTunesにデプロイ」オプションを選択すると、MAFによって.ipaファイルが作成されます。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、.appファイルが作成されます。または、デフォルトの名前を使用します。詳細は、第27.4.7項「iOSデバイスへのアプリケーションのデプロイ方法」と第27.4.10項「App StoreへのiOSアプリケーションの配布方法」を参照してください。
MAFのデフォルトでは、.ipaファイル(または.appファイル)の名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第3.2項「MAFアプリケーションの表示プロパティの設定」を参照してください。

- 「詳細オプション」 - 「オプション」をクリックして「詳細オプション」ダイアログを開き、ここで図27-19に示すように、様々なオプションを設定できます。

図27-28 最小iOSバージョンの設定

最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

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

デプロイメントに成功すると、図27-22のようにアプリケーションがiTunesの「Apps」フォルダに表示されます。

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

iOS Developer Programのメンバーのみがアクセス可能なiOS Provisioning Portalを使用して最初にプロビジョニング・プロファイルを作成しないかぎり、iOSアプリケーション(つまり、.ipaファイル)をiOSデバイスにデプロイしたり、App Storeまたは内部のホストされたダウンロード・サイトに公開することはできません。第27.4.2項「デバイス署名オプションの設定」の説明に従って、「オプション」ページでプロビジョニング・プロファイルの場所と証明書の名前を入力します。

『App Distribution Guide』(iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)から入手可能)で説明されているように、プロビジョニング・ファイルは、開発証明書、デバイスおよびアプリケーションIDを関連付けます。iOS Provisioning Portalでは、これらのエンティティとプロビジョニング・プロファイルを作成できます。

ヒント:
プロビジョニング・プロファイルをダウンロードしたら、このファイルをダブルクリックしてLibrary/MobileDevice/Provisioning Profileディレクトリに追加してください。

図27-29 iOS Provisioning Portal

27.4.9.1 iOS開発用証明書の作成

証明書は、開発者のアイデンティティに関する情報と公開鍵および秘密鍵が結合された電子的なドキュメントです。iOS開発用証明書がOS開発者として識別し、デプロイメントのためのアプリケーションの署名を有効にするので、証明書をダウンロードしたら、基本的に開発者自身のアイデンティティを開発コンピュータにインストールします。iOSオペレーティング環境では、すべての証明書がKeychainによって管理されます。

iOS Provisioning Portalの「Certificates」ページを使用して、CSR(証明書署名リクエスト)をログに記録します。CSRを完了すると、iOS Provisioning PortalによってiOS開発用証明書が発行されます。

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

開発コンピュータに証明書をインストールしたら、「Current Available Devices」タブ(iOS Provisioning Portalの「Devices」ページ内)をレビューして、開発者自身(またはその会社)がテストやデバッグに使用するAppleデバイスを特定します。シリアル番号のような一意のデバイス識別子(UDID)によって各デバイスを識別するこのリストにデバイスが含まれていないかぎり、アプリケーションはデプロイできません。

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

アプリケーションIDは、デバイス上のアプリケーションの一意の識別子です。アプリケーションIDは、第3.2項「MAFアプリケーションの表示プロパティの設定」で説明されている書式の、バンドルIDと呼ばれる管理者が作成したリバース・ドメイン名の前に、バンドル・シードと呼ばれるAppleが生成した10文字の英数字文字列が付加された構成になります。図27-30には、他のアプリケーションとファイルやKeychainを共有しない、一意のアプリケーションIDが示されています。

図27-30 明示的なアプリケーションID

8E549T7128.com.oracle.*のように、アプリケーション名にワイルドカード文字(*)を使用すると、一連のアプリケーション間でアプリケーションIDを共有できます。たとえば、com.oracle.MAF.*という管理者名がiOSプロビジョニング・ポータルにある場合、これにより、異なるアプリケーション(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.10 App StoreへのiOSアプリケーションの配布方法

iOSデバイス上でのアプリケーションのテストとデバッグが終了したら、App Storeまたは内部ダウンロード・サイトを通してより広範なオーディエンスにアプリケーションを配布できます。App Storeにアプリケーションを公開するには、.ipaファイルをiTunes Connectに送信する必要があります。これによって、.ipaファイルをiTunesに追加して、アプリケーションを更新し、テスト・ユーザーを作成することが可能になります。

始める前に:

アプリケーションを配布する前に、次のタスクを実行する必要があります。

- 図27-26に示すように、iOSプラットフォームの「プリファレンス」ページで、自動的にiTunesに追加ディレクトリの名前を入力します。

ヒント:
この場所を入力する前に、iTunesを1回以上実行します。第27.4.7項「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- 実際のiOSデバイス上でアプリケーションをテストします。第27.4.7項「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- iOS Provisioning Portalを通して配布証明書を取得します。

注意:
配布証明書を作成できるのは、チーム・エージェントのみです。

- .ipaファイルをiTunesに配布するための、iTunes Connectアカウントを取得します。詳細は、iOS Development CenterのApp Store Resource Centerにある『Prepare App Submission』を参照してください。具体的には、『App Store Review Guidelines』を確認して、App Review Teamに確実に受け入れられるようにしてください。

- 『iTunes Connect Developer Guide』を参照したいことがあります。どちらのガイドも、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)から入手できます。

- デプロイメント構成の「iOSオプション」ページで、ビルド・モードとしてアプリケーション配布ガイド・リリースを選択し、「OK」をクリックします。

iOSアプリケーションをApp Storeに配布するには:

1. 「実行」→「実行構成」を選択し、iOSデプロイメント構成を選択します。

2. 「配布パッケージにデプロイ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- デプロイされるバンドルID - Java言語のようなパッケージ名を含む一意な名前で、iOSプロビジョニング・ポータルから生成されるバンドル・シードの接頭辞が付いたもの(com.<organization name>.<application name>)。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- 証明書: アプリケーションの作成者。デプロイメント構成のiOSプラットフォームのプリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。iOSプラットフォームの「プリファレンス」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:
証明書とプロビジョニング・プロファイルの値は、<指定なし>にはできません。.ipaファイルがiTunesで受け入れられるようにするには、「オプション」ページでこれらの値を指定する必要があります。

4. iTunes Connectにログインします。

5. 『iTunes Connect Developer Guide』の「Adding New Apps」と「Using Application Loader」の項で説明されているManage Your ApplicationsモジュールとApplication Loaderを使用して、検討用に.ipaファイルをiTunes Connectに送信します。

6. アプリケーションが承認されたら、『iTunes Connect Developer Guide』の「Creating Test Users」の項でManage Usersモジュールの使用方法を参照してください。多言語アプリケーションをテストするには、アプリケーションのローカライズ対象地域のテスト・ユーザー・アカウントを作成します。

7. Managing Your Applicationモジュールを使用したバイナリの更新については、『iTunes Connect Developer Guide』の「Editing and Updating App Information」の項を参照してください。

27.5 ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ

MAFアプリケーションは、アプリケーションを開発するローカル・マシン、またはサポートされているUWPデバイス上へのアプリケーションのインストールに使用するインストール・パッケージにデプロイできます。

注意:
UWPのデバッグは、このリリースではサポートされていません。

図27-31 UWPアプリケーションの「デプロイメント構成」ダイアログ

27.5.1 ユニバーサルWindowsプラットフォームのデプロイメント構成の作成方法

リリースの準備が完了したアプリケーションは、Windowsストアに公開できません。別のメカニズムを選択して、アプリケーションを配布します。MAFではPowerShellスクリプトがインストール・パッケージに含まれており、これを実行するとアプリケーションがUWPデバイスにインストールされます。

UWPへのアプリケーションのデプロイを試行する前に、次の設定タスクと構成タスクを実行します。

1. 開発マシンが、MAFアプリケーションをUWPにデプロイするための要件を満たしていることを確認します。これらの要件には、マシンがUWPデバイスであることが含まれます。つまり、Windows 10オペレーティング・システムを実行していることを意味します。このマシンで開発者モードを有効にする必要があります。
詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for EclipseのインストールのアプリケーションをユニバーサルWindowsプラットフォーム用に開発するために必要なことに関する項を参照してください。

2. MicrosoftのVisual Studioソフトウェアをインストールします。このソフトウェアには、UWPへのデプロイを可能にするWindows SDKが含まれています。
詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for EclipseのインストールのユニバーサルWindowsプラットフォーム用の開発ツールの設定に関する項を参照してください。

3. デプロイするアプリケーションにデジタル署名するための証明書(個人情報交換ファイル)を作成します。
詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for EclipseのインストールのMAFアプリケーションのPFXファイルの作成方法に関する項を参照してください。

4. 図27-32に示す「プリファレンス」ダイアログの「Windows」ページに、次の値を入力します。

- MicrosoftのVisual StudioソフトウェアとともにインストールされるWindows SDKの場所。

- (Windows証明書ページ)アプリケーションに署名するために使用する証明書の場所とパスワード(必要な場合)。

図27-32に示すように、「ウィンドウ」メニュー(MacOSではEclipseメニュー)から「プリファレンス」ダイアログにアクセスします。

アプリケーションをデプロイする前に、デプロイメントを妨げる可能性のある次の問題に注意してください。

- Microsoft Windowsでは、ディレクトリおよびファイルのパスの最大長が設定されています。MAFアプリケーションのデプロイメントは、MAFアプリケーションのパスが最大パス長を超過すると失敗します。この問題を回避するには、ディレクトリのパスの長さがWindowsで規定されている最大長未満の場所にMAFアプリケーションを配置します。最大パス長の制限の詳細は、Microsoftのドキュメントを参照してください。

- 「アプリケーションのローカル・マシンへのデプロイ」オプションを使用してMAFアプリケーションをデプロイする前に、他のプロセスでMAFアプリケーションのデータ・フォルダが使用されていないことを確認してください。アプリケーションのデータ・フォルダは、通常、C:\Users\[userName]\AppData\Local\Packages\[appBundleId]_[id]にあります。別のプロセスがこのフォルダを使用しているシナリオの例には、メモ帳などのアプリケーションでフォルダ内のファイルを開いている場合があります。どのアプリケーション・プロセスがディレクトリやファイルを使用しているか判別できない場合は、問題を解決するためにマシンを再起動します。

UWPプラットフォームSDK用のMAFプリファレンスを設定するには:

1. 「ウィンドウ」メニュー(MacOSではEclipseメニュー)から「プリファレンス」ダイアログを開きます。

2. 図27-32に示すように、「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Windows」を選択し、Windowsのプリファレンス・ページを開きます。

図27-32 UWPプリファレンスの設定

3. 「追加」をクリックして「SDKの選択」ダイアログを開き、UWP SDKの場所に移動します。「OK」をクリックします。

構成を作成するには、次の手順を実行します。:

1. 「実行」→「実行構成」を選択して、「構成」ダイアログを開きます。

2. 図27-31に示すように、「構成」ダイアログで、構成の名前を入力します。

3. 利用可能なプロジェクトのリストからアセンブリ・プロジェクトを選択します。

4. アプリケーションIDを変更する場合は、デプロイされるバンドルIDに新しいIDを入力します。

5. プラットフォーム・バージョンとMAFランタイム・バージョンの組合せであるターゲットを選択します。

6. パッケージのみをビルド

- ローカル・マシンにデプロイする場合は、未選択のままにします。

- パッケージをビルドして他のマシンまたはタブレットにデプロイする場合は選択します。

27.5.2 Windowsプラットフォームの署名オプションの定義

アプリケーションは、Windowsデバイスにデプロイする前に署名する必要があり、このためにはWindows Personal Information Exchange (.pfx)ファイルの場所を指定します。

詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for EclipseのインストールのMAFアプリケーションのPFXファイルの作成方法に関する項を参照してください。

.pfxファイルの場所を指定するには:

1. 「ウィンドウ」メニュー(MacOSではEclipseメニュー)から「プリファレンス」ダイアログを開き、「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Windows」→Windows証明書に移動します。

2. 証明書の場所を入力し、必要に応じてパスワードを入力します。

27.5.3 ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ方法

アプリケーションをUWPにデプロイするWindowsデプロイメント構成用のMAFを使用してアプリケーションをデプロイします。

MAFアプリケーションをUWPにデプロイするには:

1. 「実行」を選択し、「実行構成」を選択します。MAFアプリケーション・ノードの下で、UWPデプロイメント構成を選択します。

2. 使用するターゲットを確認し、「実行」をクリックします。

3. コンソールでデプロイメント・ログを確認します。

27.5.4 ユニバーサルWindowsプラットフォームにMAFアプリケーションをデプロイする場合の処理

MAFは、アプリケーションを使用中のマシンにデプロイし、そこにアプリケーションをインストールします。図27-33の前景には、ローカル・マシンにリリース・モードでデプロイされたWorkBetterサンプル・アプリケーションのインスタンスがあります。図27-33の背景では、Windows 10マシンの「アプリと機能」ページのインストール済アプリケーションの中にWorkBetterサンプル・アプリケーションがリストされています。

図27-33 Windowsローカル・マシンにリリース・モードでデプロイされたMAFアプリケーション

27.5.5 アプリケーションをパッケージとしてローカルにデプロイする方法

デフォルトのデプロイメント起動構成設定では、常にアプリケーションをローカル・マシンにデプロイします。ただし、他のUWP互換マシンやタブレットにデプロイする方法もあります。そのためには、第27.5.6項「パッケージとしてローカルにデプロイする場合の処理」の説明に従って、パッケージをビルドするように起動構成を変更する必要があります。

パッケージとしてデプロイするには:

1. 「実行」を選択し、「実行構成」を選択します。MAFアプリケーション・ノードの下で、UWPデプロイメント構成を選択します。

2. パッケージのみをビルドを選択し、生成されたパッケージの場所を入力します。

27.5.6 パッケージとしてローカルにデプロイする場合の処理

パッケージは、デプロイメント構成内の場所に生成されます。ディレクトリには、別のディレクトリ(MafTemplate_*_Test)が含まれます。この後者のディレクトリの内容を、サポートされているUWPデバイスを持ち、MAFアプリケーションをインストールする必要があるエンド・ユーザーに配布します。このディレクトリにはPowerShellスクリプト(Add-AppDevPackage.ps1)が含まれており、エンド・ユーザーはこれを実行して、アプリケーションをインストールします。このスクリプトに加えて、このディレクトリにはアプリケーション・パッケージ、依存パッケージ、およびアプリケーションに署名した証明書が含まれます。次の例では、これらの内容をリストします。

Add-AppDevPackage.ps1
Add-AppDevPackage.resources
Dependencies
MafTemplate_1.0.0.0_x64.appx
MafTemplate_1.0.0.0_x64.appxsym
MafTemplate_1.0.0.0_x64.cer

MafTemplate_*_Testディレクトリの名前とファイルは、バージョン番号によって異なります。

たとえば、バージョン番号として3を指定し、リリース・ビルド・モードを選択した場合、ディレクトリ名はMafTemplate_3.0.0.0_x64_Testとなります。

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

MAFビュー・コントローラ・プロジェクトによる再利用を可能にするために、アプリケーション機能(一般的に、MAF AMXまたはローカルHTMLとして実装されるもの)は、機能アーカイブ(FAR)というアーカイブにバンドルされます。FARは、モバイル・アプリケーションが使用できるアプリケーション機能のアーティファクトを格納したJARファイルです。FARには、Javaクラスを含めることも可能ですが、これらのクラスはコンパイルする必要があります。次の例は、1つのmaf-feature.xmlファイルと1つのconnections.xmlファイルを含むFARの内容を示しています。

connections.xml (or some form of connection metadata)

META-INF
jar-connections.xml
jar-adf-config.xml
adfm.xml
maf-feature.xml
MANIFEST.MF
task-flow-registry.xml

oracle
application1
mobile
DataControls.dcx
DataBindings.cpx
pageDefs
view1PageDefs

model
Class1.class

public_html
adfc-mobile-config.xml
index.html
navbar-icon.html
springboard-icon.html
view1.amx
task-flow-definition.xml

機能アーカイブ・ファイルでの作業には、次のタスクがあります。

1. 機能アーカイブ・ファイルの作成 - ビュー・プロジェクトをFARとしてエクスポートすることで、機能アーカイブを作成します。

2. モバイル・アプリケーション作成時の機能アーカイブ・ファイルの使用 - これには、アプリケーションへのFARの登録、およびアプリケーションへのFAR内の機能の登録が含まれます。

3. FARの機能を含むモバイル・アプリケーションのデプロイ - これには、デプロイメント・テンプレート内の一意の名前が付けられたフォルダへのFARの解凍が含まれます。

注意:
デプロイメント・プロセス時にMAFはFARを生成します。別のアプリケーションでこのFARを使用する場合は、ビュー・プロジェクトのみをデプロイすればすみます。

27.6.1 モバイル機能アーカイブ・ファイルの作成方法

OEPEのエクスポート・ウィザードを使用して.farファイルを作成します。

始める前に:

アプリケーションの適切な接続を作成します。FARは様々な接続要件を持つ様々なアプリケーションで使用できるため、接続ソースまたは標準化された実際の接続名を表す接続名を選択します。

モバイル機能を機能アーカイブ・ファイルとしてパッケージ化する方法

1. 「ファイル」をクリックし、「エクスポート」を選択します。

2. 図27-34に示すように、「エクスポート」ウィザードで、「Oracle」→「モバイル・アプリケーション・フレームワーク」を展開し、モバイル機能アーカイブ(FAR)を選択します。

図27-34 モバイル機能アーカイブ・ファイルの作成

3. 図27-35に示すように、「次へ」をクリックし、アーカイブする機能を含んでいるビュー・プロジェクトを選択し、アーカイブ・ファイルの名前を入力します。

注意:
プロファイルには適切な名前を付けてください。そうしないと、アーカイブ名が同じアプリケーション機能を複数アップロードしたときに、問題が発生する可能性があります。

図27-35 モバイル機能アーカイブ・ファイルの名前とパスの入力

4. 「終了」をクリックします。「サマリー」ページ(図27-36を参照)に、機能アーカイブ・ファイルのJARパスがデプロイされるフルパスが表示されます。

27.6.2 機能アーカイブのデプロイ方法

「デプロイメント・アクション」ダイアログでは、FARをJARファイルとしてデプロイできます。このダイアログには、1つのみのデプロイメント・オプション「機能アーカイブJARファイルへのデプロイ」があります。

機能アーカイブのデプロイメント・プロファイルをデプロイするには:

1. ビュー・プロジェクトを右クリックして、機能アーカイブのデプロイメント・プロファイルを選択します。

2. 「終了」をクリックします。「サマリー」ページ(図27-36を参照)に、機能アーカイブ・ファイルのJARパスがデプロイされるフルパスが表示されます。

図27-36 「ファイル・エクスポートのサマリー」ページ

27.6.3 機能アーカイブ・ファイルを作成する場合の処理

外部アプリケーションからFARを使用するには、FARをアプリケーションのmaf-application.xmlファイルに登録する必要があります。図27-37は、ファイル・システム接続によりモバイル・アプリケーションで使用可能となる機能アーカイブを示しています。

図27-37 MAFアプリケーション・エディタにデプロイされた機能アーカイブJAR

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

MAFアプリケーション・アーカイブ(.maa)・ファイル形式を使用すると、署名されていないモバイル・アプリケーションをサード・パーティに提供できます。インポートした.maaファイルからモバイル・アプリケーションを導出することによって、次のような様々なカスタマイズが可能になります。

- アプリケーションへの一意のアプリケーションIDの付与(プッシュ通知を有効にする場合など)。

- 企業固有の資格証明または証明書を使用した、アプリケーションへの署名。

- カスタマイズされたスプラッシュ画面とアプリケーション・アイコンによる、リソースの置換え。

新しいモバイル・アプリケーションを既存のモバイル・アプリケーションから作成するには、まず元のモバイル・アプリケーションをモバイル・アプリケーション・アーカイブ(.maa)ファイルとしてパッケージ化した後、このファイルから新しいモバイル・アプリケーションを導出します。.maaファイルは、サード・パーティによる使用が可能です(第27.8項「署名されていないデプロイメント・パッケージの作成」を参照)。

.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ファイル内に配置されます。

OEPEで作成された.maaファイルは、OEPEでのみインポートできます。OEPEにはインポートできません。

ExternalLibs

元のモバイル・アプリケーションの外部にあるアプリケーション・レベルのライブラリ(FARを含む)が格納されます。

META-INF

maf.propertiesおよびlogging.propertiesファイルが格納されます。

resources

次のディレクトリが含まれます。

- android: アプリケーション・アイコンやスプラッシュ画面に使用される、Android固有のイメージ・ファイルが格納されます。

- ios: アプリケーション・アイコンやスプラッシュ画面に使用される、iOS固有のイメージ・ファイルが格納されます。

- security: cacertsファイル(キーストア・ファイル)が格納されます。

表27-4に一覧表示されたアーティファクトに加えて、.maaファイルには、元のモバイル・アプリケーションの内部にあるFARまたはJARファイルが格納されたフォルダが含まれます。第27.8.2項「MAFアプリケーション・アーカイブ・ファイルをインポートする場合の処理」も参照してください。

注意:
.maaファイルを既存のアプリケーションにインポートすると、ワークスペースとプロジェクトのコンテナ・ファイル(それぞれ.jwsファイルと.jprファイル)が上書きされます。このため、MAF AMXページと構成ファイル(maf-application.xml、maf-config.xml、connections.xml、adf-config.xmlなど)に対して以前加えた変更の一部は保持されません。

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

MAFアプリケーション・アーカイブ(.maa)・ファイル形式を使用すると、署名されていないモバイル・アプリケーションをサード・パーティに提供できます。インポートした.maaファイルからモバイル・アプリケーションを導出することによって、次のような様々なカスタマイズが可能になります。

- アプリケーションへの一意のアプリケーションIDの付与(プッシュ通知を有効にする場合など)。

- 企業固有の資格証明または証明書を使用した、アプリケーションへの署名。

- カスタマイズされたスプラッシュ画面とアプリケーション・アイコンによる、リソースの置換え。

新しいモバイル・アプリケーションを既存のモバイル・アプリケーションから作成するには、まず元のモバイル・アプリケーションをモバイル・アプリケーション・アーカイブ(.maa)ファイルとしてパッケージ化した後、このファイルから新しいモバイル・アプリケーションを導出します。.maaファイルは、サード・パーティによる使用が可能です(第27.8項「署名されていないデプロイメント・パッケージの作成」を参照)。

.maaファイルによって、モバイル・アプリケーションの構造が保持されます。表27-4に、このファイルの内容を示します。

表27-5 モバイル・アプリケーション・アーカイブ・ファイルの内容

ディレクトリ

説明

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ファイル内に配置されます。

OEPEで作成された.maaファイルは、OEPEでのみインポートできます。JDeveloperにはインポートできません。

ExternalLibs

元のモバイル・アプリケーションの外部にあるアプリケーション・レベルのライブラリ(FARを含む)が格納されます。

META-INF

maf.propertiesおよびlogging.propertiesファイルが格納されます。

resources

次のディレクトリが含まれます。

- android: アプリケーション・アイコンやスプラッシュ画面に使用される、Android固有のイメージ・ファイルが格納されます。

- ios: アプリケーション・アイコンやスプラッシュ画面に使用される、iOS固有のイメージ・ファイルが格納されます。

- windows - アプリケーション・アイコンやスプラッシュ画面に使用される、iOS固有のイメージ・ファイルが格納されます。

- security - cacertsファイル(キーストア・ファイル)が格納されます。

表27-4に一覧表示されたアーティファクトに加えて、.maaファイルには、元のモバイル・アプリケーションの内部にあるFARまたはJARファイルが格納されたフォルダが含まれます。第27.8.2項「MAFアプリケーション・アーカイブ・ファイルをインポートする場合の処理」も参照してください。

モバイル・アプリケーションをMAFアプリケーション・アーカイブ・ファイルにパッケージ化するには、次の手順を実行します。

1. 「ファイル」をクリックし、「エクスポート」を選択します。

2. 図27-38のように、「エクスポート」ウィザードで、「Oracle」→「モバイル・アプリケーション・フレームワーク」を展開し、モバイル・アプリケーション・アーカイブ(MAA)を選択します。

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

3. 図27-39に示すように、「Next」をクリックし、アーカイブするアプリケーションの名前を選択し、モバイル・アプリケーション・アーカイブの名前を入力します。

図27-39 モバイル・アプリケーション・アーカイブ・ファイルの名前とパスの入力

4. 「終了」をクリックします。

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

MAFアプリケーション・アーカイブ(.maa)・ファイル形式を使用すると、署名されていないモバイル・アプリケーションをサード・パーティに提供できます。インポートした.maaファイルからモバイル・アプリケーションを導出することによって、次のような様々なカスタマイズが可能になります。

- アプリケーションへの一意のアプリケーションIDの付与(プッシュ通知を有効にする場合など)。

- 企業固有の資格証明または証明書を使用した、アプリケーションへの署名。

- カスタマイズされたスプラッシュ画面とアプリケーション・アイコンによる、リソースの置換え。

注意:
.maaファイルは、1つ以上の同じプロジェクトをすでに含んだワークスペースにはインポートできません。かわりに、.maaファイルを異なるワークスペースにインポートする必要があります。

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

署名されていないアプリケーションを作成するには、.maaファイルを新しいモバイル・アプリケーションにインポートします。

署名されていないアプリケーションを作成するには:

1. 「File」→「インポート」を選択します。

2. 「インポート」ウィザードで、「Oracle」を展開し、モバイル・アプリケーション・アーカイブ(MAA)を選択します。「次へ」をクリックします。

3. 「モバイル・アプリケーション・アーカイブ(MAA)のインポート」ページで、「参照」をクリックし、MAAファイルに移動します。「次へ」をクリックします。

4. デプロイメント・ターゲットの構成ページで、デプロイする先のターゲットを選択し、「終了」をクリックします。

27.8.2 MAFアプリケーション・アーカイブ・ファイルをインポートする場合の処理

MAFでは、.maaファイルのインポート後に次のことを実行します。

1. アセンブリ・プロジェクト、アプリケーション・プロジェクトおよびビュー・プロジェクトごとにプロジェクトが作成されます。

2. .maaファイルからファイルが解凍されます。

27.9 Oracle Mobile Security Suiteでのデプロイ

Oracle Mobile Security Suite (OMSS)は、モバイル・アプリケーション向けにエンタープライズレベルのセキュリティを備えています。デプロイメント時のコンテナ化により、データ漏えいを防止し、アプリケーション・データおよびデータベース・コンテンツを暗号化します。OMSSによるMAFアプリケーションのコンテナ化の詳細は、第2.8項「エンタープライズ配布のためのMAFアプリケーションのコンテナ化」を参照してください。

iOSプラットフォームおよびAndroidプラットフォームにデプロイするMAFアプリケーションをOMSSを使用してコンテナ化できます。ユニバーサルWindowsプラットフォームにデプロイするMAFアプリケーションは、OMSSを使用してコンテナ化することはできません。

始める前に:

OMSSコンテナ化ツールをインストールしている必要があります。このツールは、c14nというファイル名のコマンドライン・ユーティリティです。OMSSをダウンロードし、Oracle Technology Networkでインストールに関する説明を読んでください。

http://www.oracle.com/technetwork/middleware/id-mgmt/overview/default-2099033.html

注意:
iOSの場合は、第27.4.2項「デバイス署名オプションの設定」の説明に従って、iOSプラットフォームのプリファレンス・ページでプロビジョニング・プロファイルの名前も選択している必要があります。
コンテナ化はAndroidまたはWindowsではサポートされていません。

OEPEでは、OMSSでコンテナ化されたモバイル・アプリケーションをデフォルト名のエミュレータにデプロイできません。

1. 「実行」→「実行構成」を選択します。

2. 「ターゲットの構成」ペインで、MAFアプリケーションを選択し、新規の実行構成を作成するか、既存の実行構成を選択します。

3. 「メイン」タブの下部にある「コンテナ化」ペインで、「Oracleモバイル・セキュリティ・スイートの有効化」を選択して、コンテナ化ツールの場所をクリックします。これにより、「プリファレンス」メニューから「コンテナ化」ダイアログが表示されます(図27-40を参照)。

図27-40 コンテナ化ツールの場所の指定

4. 「参照」アイコンをクリックし、ローカル・ファイル・システムでOracle Mobile Security Appコンテナ化ツールの場所を探します。

5. 「OK」をクリックしてコンテナ化ツールを選択します。

6. 「実行構成」ダイアログで、「実行」を選択します。

注意:
iOSの場合、コンテナ化はiTunesデプロイメントでのみサポートされています。配布パッケージまたはシミュレータへのデプロイメントでは、コンテナ化された.ipaファイルを作成することはありません。

Oracle Mobile Security Suiteにより保護されたプラットフォーム固有のファイル(Androidの場合)が作成されます。

- iOSの場合は.ipa。

- Androidの場合は.apk。OMSSにより、アプリケーションにコンパイルされる中間の.hヘッダー・ファイルが作成される場合があります。

コンテナ化されたアプリケーションをデバイスに追加すると、そのアプリケーションにロック・アイコンが表示されます(図27-41を参照)。

図27-41 コンテナ化を表すロック・アイコンが表示されたモバイル・アプリケーション

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

Oracle Mobile Security Suite (OMSS)でコンテナ化されたMAFアプリケーションをデプロイすると、現在利用可能なアプリケーションのリストが表示されるOMSSモバイル・アプリケーション・カタログにアップロードできます。アプリケーションをエンド・ユーザーに公開する前に、OMSS管理者は様々なポリシーをアプリケーションに適用して、その機能を管理します。OMSSサーバー側で特定のポリシーを適用する前に、OMSS管理者は、Oracle Mobile Security Appコンテナ化ツールでコンテナ化されたアプリケーションのセキュリティおよび共有の要件を管理できます。遷移中のデータ、およびモバイル・デバイス上でコンテナ化されたアプリケーション内にローカルに格納されているデータが暗号化されます。暗号化されたデータの格納には、ファイル、データベース、アプリケーション・キャッシュおよびユーザー・プリファレンスなどのアプリケーション・データが含まれます。

OMSSデータ漏洩保護および暗号化を適用すると、ユーザーがアプリケーションをダウンロード・サイトから利用可能な状態にすることができます。

注意:
OMSSでコンテナ化されるiOS MAFアプリケーションは、内部ダウンロード・サイトまたはエンタープライズ・アプリケーション・ストア経由でしかユーザーに配信できません。コンテナ化されたiOS MAFアプリケーションは、Apple App Storeにアップロードできません。この制限は、OMSSでコンテナ化されたAndroid MAFアプリケーションには適用されません。これらのアプリケーションは、内部ダウンロード・サイト、エンタープライズ・アプリケーション・ストアまたはGoogle Play経由で配信できます。

デバイスおよびワークスペースにプロビジョニングされたMAFアプリケーションを管理するために、システム管理者がOMSSモバイル・アプリケーション・カタログをどのように使用するかの詳細は、『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データベースの一般的な情報は、第19章「MAF AMXでのローカル・データベースの使用方法」を参照してください。GeneratedPassword、encryptDatabase (およびこれに対応するdecryptDatabase)の詳細は、Oracle Mobile Application Framework Java APIリファレンスおよび第19.2.7項「データベースを暗号化および復号化する方法」を参照してください。サンプル・アプリケーションについては、PublicSamples.zipのStockTrackerサンプルを参照してください(付録E「サンプルの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 Mobile Application Framework Java APIリファレンスおよび第B.3項「getDirectoryPathRootメソッドを使用したファイル・アクセス」を参照してください。iOS Developer Library (https://developer.apple.com/library/)にある『File System Programming Guide』の「File System Basics」も参照してください。

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

デスクトップ・コンピュータと同期された場合に表示できるので、いずれの機密データもログ・ファイルに書込みできないことを確認してください。ユーザーがiOSデバイスをデスクトップ・システムに接続してデータを同期すると、アプリケーション・ログ・ファイルは最終的に、暗号化されていない形式でデスクトップ上に格納されます。Androidデバイスから同期されたログ・ファイルは、Android Device Monitorツールを使用して表示できます。第28.4項「サイドチャネルによるデータ漏えい」も参照してください。

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

モバイル・アプリケーションは、プロバイダ・ネットワークを介してデータにアクセスするときにSSL/TLSを使用し、WiFiを使用する場合はこれらのどちらのプロトコルも使用しないことがあります。プロバイダ・ネットワークはハッキングされる可能性があるため、安全であることを想定しないようにしてください。したがって、アプリケーションが機密データをトランスポートするときはSSLを強制し、すべての証明書が有効で公的機関によって署名されていることを確認する必要があります。

モバイル・アプリケーションによって使用されるすべてのエンドポイントはSSLによって保護される必要があるため、MAFは、SSLをサポートする一連のWebサービス・ポリシーを提供します。REST Webサービスに関連付けることができるポリシーのリストは、第15.3項「セキュアなWebサービスへのアクセス」を参照してください。

MAFは、信頼性のある既知の認証局のエントリによってシードされたcacertsファイルを提供します。アプリケーション開発者は、必要に応じてこのファイルに他の証明書を追加できます。詳細は、第29.11項「認証に双方向SSLを有効にするためのMAFアプリケーションの構成」を参照してください。

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.18項「アクセス制御の構成方法」を参照してください。

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に対する保護を行います。

インジェクション攻撃に加えて、モバイル・アプリケーションはクロスサイト・リクエスト・フォージェリ(CSRF)に対して脆弱であり、この攻撃では、悪意のあるページが、ユーザーIDを格納するWebブラウザにキャッシュされたCookieを使用して、ユーザーに代わってターゲット・アプリケーションで意図しないアクションを実行します。アプリケーションのサンドボックス化により、CSRFの問題に対処します。

ネイティブ・コンテナにアクセスするアプリケーション機能(特に、リモートURLコンテンツのあるアプリケーション機能)を無効にすることも検討してください。MAFアプリケーション内の選択したアプリケーション機能がネイティブ・コンテナにアクセスできないようにすることもできます。たとえば、MAFアプリケーションには、信頼していないWebアプリケーションからリモート・コンテンツを参照するアプリケーション機能が含まれます(リモートURLコンテンツ・アプリケーション機能)。このシナリオでは、次の例に示すように、この特定のアプリケーション機能がネイティブ・コンテナにアクセスできないようにします。

<adfmf:featureReference refId="remoteAppfeature1" id="fr1" allowNativeAccess="false"/>

allowNativeAccessプロパティのデフォルト値はtrueです。

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

URIは、ユーザーのデバイスに格納されたデータの他、カメラやアドレス帳などの様々なデバイス機能にアクセスできます。第9.2項「MAFアプリケーションでのコア・プラグインの有効化」に示すようなアクセスは、デフォルトでは付与されていませんが、MAFアプリケーションを構成して、URIがアクセスできるデバイスの機能を次のいずれかに制限できます。

- オープン・ネットワーク・ソケット(ユーザー認証の構成時に許可する必要がある)

- GPSおよびネットワークベースの位置情報サービス

- 連絡先

- 電子メール

- SMS

- 電話

- プッシュ通知

- ローカルに格納されたファイル

ヒント:
updateSecurityConfigWithURLParametersメソッド(ログイン構成の変更を検出してから、再認証によって変更を確認するようにユーザーに求める)を使用して、XSSによって挿入された偽のログイン・ページなどのセキュリティ・リスクから、プログラムによりユーザーを保護できます(第29.5.6項「実行時の名前付き接続の接続属性の更新方法」を参照)。さらに、MAFはユーザーが保護されたアプリケーション機能を開くたびに、ユーザーに通知します。デフォルト・アプリケーションにセキュリティが適用されないと、認証が遅延する可能性があります。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

28.7.2 カスタム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が適切にエンコードされていることを確認する必要があります。詳細は、第12.3.18項「Verbatimコンポーネントの使用方法」および第12.3.19項「出力HTMLコンポーネントの使用方法」を参照してください。また、第28.8項「信頼できない入力に対するセキュリティ決定」も参照してください。

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

モバイル・アプリケーションはSQLインジェクションに対して脆弱であるため、攻撃者は埋込みSQLiteデータベースに格納されたデータを読取りできる可能性があります。

SQLインジェクションを防止するには:

- アプリケーション開発者は、ローカル・データベースに格納されたすべてのデータを検証し、エンコードする必要があります。

- アプリケーション開発者は、アプリケーションによって処理されるXMLおよびHTMLコンテンツをエンコードし、検証することが想定されています。

28.8 信頼できない入力に対するセキュリティ決定

iOSプラットフォームとAndroidプラットフォームの両方において、アプリケーション(Skypeなど)は必ずしも外部からの許可をリクエストするとは限らないため、攻撃者にエントリ・ポイントを提供して、悪意のあるアプリケーションがセキュリティを回避してしまう可能性があります。その結果、アプリケーションはクライアント側のインジェクションおよびデータ漏えいに対して脆弱になります。必ず追加の認可を求めるプロンプトを表示するか、あるいは追加の認可が可能でない場合は、保護を必要とするアプリケーションを起動するための追加のステップを提供してください。

アプリケーションが信頼できないサードパーティ・アプリケーションから受信する(またはこれらのアプリケーションに送信する)すべてのデータが、入力検証の対象となっていることを確認する必要があります。アプリケーションに対するクライアント側のXML入力を、エンコードおよび検証する必要があります。MAF AMXコンポーネントではユーザー入力を検証できますが、データはサーバー上で検証する必要があり、サーバーはクライアントから受信するデータを信頼しないようにする必要があります。つまり、サーバーとクライアントの間で送受信されるXML、JSONおよびJavaScriptが適切にエンコードされていることを確認する役割は、サーバーが担います。

別のアプリケーションからMAFアプリケーションを起動するURLスキームを構成するときは、URLを介して送信されるパラメータを検証して、悪意のあるデータまたはURIがMAFアプリケーションに渡される可能性がないことを確認する必要があります。詳細は、第4.10項「MAFアプリケーションでのカスタムURLスキームの使用」を参照してください。また、第28.1項「脆弱なサーバー側コントロール」も参照してください。

JSON解析について

可能な場合は、MAFのJSONエンコーディングAPIを使用します。カスタムJSON構成を必要とするシナリオでは、ユーザー入力データを使用してJSONを構成するときには注意が必要です。JSONデータの処理の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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

モバイル・アプリケーションのユーザビリティ要件では、多くの場合、長期にわたって継続するセッションが求められます。モバイル・アプリケーションは、セッション管理にCookie、SSOサービスおよび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項「モバイル・アプリケーションの認証プロセスの概要」

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

- 第29.5項「MAF接続の構成」

- 第29.6項「モバイル・アプリケーションのセキュリティの構成」

- 第29.7項「デバイス機能へのアクセスの許可」

- 第29.8項「ユーザーによるアプリケーション機能からのログアウトの有効化」

- 第29.9項「MAF認証APIの使用」

- 第29.10項「SSL用の自己署名証明書を使用するサーバーにアクセスするための証明書の作成」

- 第29.11項「認証に双方向SSLを有効にするためのMAFアプリケーションの構成」

29.1 MAFセキュリティの概要

MAFは、保護されているアプリケーション機能がアクティブ化されたときに、ユーザーにログイン・ページを表示します。たとえば、アプリケーション機能がWebビュー内に表示されようとしているときやオペレーティング・システムがアプリケーションをフォアグラウンドに戻したときに、ユーザーにログイン・ページを表示します。MAFは、アプリケーション機能が認証サーバーによって保護されているときや、アプリケーション機能にユーザー・ロールまたはユーザー権限に基づいた制約が含まれているときに、アプリケーション機能へのアクセスにユーザー認証を必要とするかどうかを決定します。MAFは、ユーザーが有効な資格証明を入力した場合のみ、目的のWebビュー、UIコンポーネントまたはアプリケーション・ページをレンダリングします。

いずれかのアプリケーション機能にこれらの条件を設定すると、ユーザーがログインに成功しないとモバイル・アプリケーションにアクセスできないようにできる一方、保護されておらず、またアクセスに関連する制約も含んでいないデフォルトのアプリケーション機能を含めることで、保護されているアプリケーション機能と保護されていないアプリケーション機能の両方を含むモバイル・アプリケーションに、ユーザーがアクセスできるようにすることもできます。この状況では、ユーザーは認証せずにMAFアプリケーションにアクセスできます。デフォルトのアプリケーション機能は、保護されていないデータを表示することも、保護されているアプリケーション機能にアクセスする際にリモート・サーバーに対して認証することもできるこのような匿名ユーザーに対して、モバイル・アプリケーションの入口として機能します。次の方法により、保護されていないデフォルトのアプリケーション機能を指定できます。

- デフォルトのアプリケーション機能を通じて公共の情報にアクセスすることを匿名ユーザーに許可する一方、認可されたユーザーのみが保護された情報にアクセスできるようにする。

- ユーザーが、保護されているアプリケーション機能にアクセスする必要がある場合にのみ、ユーザーに認証を許可する。これ以外の場合、ユーザーは匿名ユーザーとしてモバイル・アプリケーションにアクセスするか、ログインして保護されている機能に移動できます。

- アクセスを保護する必要がない場合に、保護されているアプリケーション機能からログアウトすることをユーザーに許可し、それにより権限のないユーザーが保護されているアプリケーション機能にアクセスすることを明示的に禁止する。

注意:
アプリケーション・ログイン・プロセスはアプリケーションの初期化フローから切り離されるため、MAFは匿名ユーザーを有効化し、ユーザーは、認証資格証明を入力しなくても、匿名ユーザーとしてモバイル・アプリケーションを起動し、保護されていないアプリケーション機能にアクセスできます。このような場合、MAFは、権限が必要なUIコンポーネントを無効化して、ユーザーの操作を制限します。

詳細は、第29.6.1項「認証を要求するようにアプリケーション機能を設定する方法」および第22.2.4項「ユーザー制約とアクセス制御について」を参照してください。

MAFアプリケーションでは、デフォルト・ページまたはHTMLで記述されたカスタマイズ済のログイン・ページが使用されます。

特定のロールおよび権限を付与されたユーザーのみが、user.rolesまたはuser.privileges制約で定義されるアプリケーション機能にアクセスできます。ユーザーがこのようなアプリケーション機能にログインすると、アクセス制御サービス(ACS)として知られるWebサービスは、アプリケーション機能へのアクセス権を付与するユーザー・オブジェクトをユーザーに返します。ACSの詳細は、第29.5.19項「アクセス制御サービスに関する必知事項」を参照してください。

開発者は、デプロイメント時にMAFアプリケーションをコンテナ化するように選択できます。コンテナ化により、Oracle Mobile Security Suite (OMSS)で構成されたエンタープライズ・ネットワーキング・プラットフォームのセキュア・ネットワーキングおよびネットワーク・トンネリング機能をアプリケーションで利用できます。コンテナ化されたアプリケーションの配布は、Oracle Mobile Security Access Server (MSAS)コンポーネントのアプリケーション・カタログおよびSecure Workspaceコンテナ機能を使用して、OMSS管理者によって管理されます。ユーザーの認証は、対象の認証タイプに構成されたMSASによって実行されます。MAFアプリケーションおよびOMSSコンテナ化の開発の詳細は、第2.8項「エンタープライズ配布のためのMAFアプリケーションのコンテナ化」を参照してください。

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

エンド・ユーザーの視点からは、ログイン・プロセスは次のようなものになります。

注意:
MAFアプリケーションのコンテナ化によりログイン・プロセスがどのように変更されるかの詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

1. ユーザーが保護されたアプリケーション機能にアクセスしようとすると、常に、図29-1に示すログイン・ページのWebビューがMAFによって表示されます。保護されているアプリケーション機能がデフォルトである場合、ユーザーがモバイル・アプリケーションを起動すると、MAFによってユーザーにログイン・ページが表示されます。

図29-1 デフォルトのログイン・ページ

注意:
第29.6.4.2項「カスタム・ログイン・ページ」で説明されているとおり、MAFでは、デフォルトのログイン・ページが提供されるだけでなく、カスタム・ログイン・ページの使用もサポートされています。

2. ユーザーがユーザー名とパスワードを入力し、「サインイン」をクリックします。

注意:
MAFでは、同じアプリケーションに対して複数のユーザーを許可します。ユーザーは、前のユーザーがログアウトした後、アプリケーションに自由にログインできます。

3. ユーザー名とパスワードが検証されると、MAFによって、目的のWebビュー、ページまたはユーザー・インタフェース・コンポーネントが表示されます。

4. MAFは、ユーザーが正常にログインするまで、ユーザー名とパスワードの入力を求めます。ユーザーがログインできない場合、別のアプリケーション機能に移動することのみが可能です。

注意:
アプリケーション機能が最後にアクティブ化されて以降、事前定義された時間が経過すると、認証はタイムアウトになります。MAFでは、認証サーバーへの接続を使用するアプリケーション機能のいずれかがアクティブ化されたときのみ、アイドル・タイムアウトのタイマーの期限が更新されます。

第29.3項 モバイル・アプリケーションの認証プロセスの概要

MAFアプリケーションでは、リモート・ログイン・サーバー(Oracle ADF Fusion Webアプリケーションによって使用されるOracle Access Managerアイデンティティ・サーバーなど)、またはユーザーのデバイス上に存在するローカル資格証明ストアに対するユーザー資格証明の検証が必要になる場合があります。ローカルおよびリモートの接続モードをサポートするために、MAFは次の認証プロトコルをサポートしています。

- HTTP基本

- OAuth

- Web SSO

注意:
現在、ユニバーサルWindowsプラットフォームにデプロイしたMAFアプリケーションは、HTTP基本のみをサポートしています。

デフォルトでは、MAFアプリケーション・ユーザーの認証は、デザインタイムに選択された認証プロトコルに関係なく、リモート・ログイン・サーバーに対して行われます。開発者は、基本認証を使用してローカル認証を有効にする場合にアプリケーションを構成できます。ただし、最初はローカル資格証明ストアに資格証明が伝播されていないため、保護されているアプリケーション機能にアクセスするためのログインでは、リモート・ログイン・サーバーに対する認証が必要です。リモート認証に成功すると、その後、認証サーバーのユーザーのログイン資格証明をデバイス上に格納するローカル資格証明ストアを使用できるようになります。そのため、ユーザーが同じアプリケーション・セッション内(つまり、アプリケーション実行のライフサイクル内)でサーバーに対して認証されると、MAFは認証コンテキストをローカルに格納し、以降の認証の試行でそれを使用できるようになります。この場合、ローカルの認証コンテキストで問題なくユーザーを認証できる場合、MAFでは、ログイン・サーバーに接続されません。最初の認証では認証サーバーへの接続が必要ですが、ローカル認証を使用したアプリケーションのためにこのサーバーに頻繁にアクセスする必要はありません。

ヒント:
ローカル資格証明ストアに対する認証は、リモート・ログイン・サーバーに対する認証よりも高速に実行できますが、リモート接続のみをサポートしているOAuthまたはWeb SSO認証プロトコルを使用した認証をお薦めします。

表29-1に、MAFアプリケーションのログイン構成オプションをまとめます。接続モードは、選択した認証プロトコルによって異なります。

表29-1 MAFの接続モードおよびサポートされている認証プロトコル

接続モード

サポートされているプロトコル

モードの説明

local

- HTTP基本

ローカルに格納されている資格証明がデバイスで利用できない場合にのみ、アプリケーションでは、リモート・ログイン・サーバーに対する認証が必要です。初回ログインは、常にリモート・ログイン・サーバーに対して行われます。初回ログインに成功すると、MAFは、資格証明をデバイスの資格証明ストア内にローカルに保持します。アプリケーション機能への以降のアクセスでは、それらの資格証明が使用されます。第29.5.17項「Webサービス・セキュリティに関する必知事項」も参照してください。

remote

- HTTP基本

- OAuth

- Web SSO

アプリケーションで、Oracle Access Manager (OAM)アイデンティティ・サーバーなどのリモート・ログイン・サーバーまたは保護されているWebアプリケーションに対する認証が必要です。ユーザーがログインするたびに、リモート・サーバーに対する認証が求められます。デバイスがサーバーに接続できない場合、ユーザーは、前回は正常に認証されていても、保護されたMAF機能にアクセスできません。

hybrid

- HTTP基本

デバイスでローカル資格証明が利用可能でも、ネットワーク接続が利用できる場合は、アプリケーションでは、リモート・ログイン・サーバーに対する認証が必要です。ネットワーク接続がないためにログイン・サーバーにアクセスできない場合にのみ、デバイスのローカル資格証明が使用されます。

MAFアプリケーションのコンテナ化に伴う認証プロセスの変更点の詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

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

MAFアプリケーションを開発する場合は、ログイン接続を定義してセキュア機能を開発およびテストする必要があります。テスト中、保護されたリソースにアクセスする前に、MAFログイン・ページが認証に使用されます。デプロイメント時には、MAFアプリケーションをコンテナ化して、Oracle Mobile Security Suite (OMSS)で構成されたエンタープライズ・ネットワーキング・プラットフォームのセキュア・ネットワーキングおよびネットワーク・トンネリング機能を利用できるため、モバイルVPNは不要になります。

コンテナ化されたMAFアプリケーションのデプロイメント後に、企業ファイアウォールの背後にあるバックエンド・リソースへのアクセスでは、OMSSのコンポーネントであるMobile Security Access Server (MSAS)を利用して、モバイル・デバイスから企業リソースへのトラフィックを保護する集中アクセス・ポイントを提供します。この場合、ユーザーの最初の認証で使用するために認証エンドポイントを実行するようにMSASインスタンスが構成されます。

ユーザー認証は、MSASによって登録済MAFアプリケーションに提供されるコンテナのシングル・サインオン(SSO)統合によって処理されます。MAFアプリケーションがMSASと通信できるようにするには、ユーザーは、MSASインスタンスに構成されている認証のタイプのSecure Workspaceアプリケーションをインストールおよび登録する必要があります。次に、保護されたリソースへのアクセスをユーザーが試みると、MAFログイン・ページが非表示になり、ユーザーのモバイル・デバイスのSecure Workspaceアプリケーションから独自のログインがMSASに表示されます。

注意:
MSASによる認証を有効にし、AppTunnelを利用するには、MAFアプリケーションで定義されるログインURLまたは認証エンドポイントをプロキシするようにMSASインスタンスを構成する必要があります。MAFログイン接続のためのMSASの構成の詳細は、第29.5.11項「ログイン接続およびコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項」を参照してください。

MSAS AppTunnelを使用してバックエンド・リソース・リクエストがプロキシされるかどうかは、MAFアプリケーションおよびSecure Workspaceアプリケーションで使用される、MSASで生成されるのプロキシ自動構成ファイルによって決定されます。AppTunnelは、コンテナ化されたMAFアプリケーションへのセキュアなアクセスを提供する各Secure Workspaceアプリケーションから相互認証されたSSLトンネルです。AppTunnelでは、遷移中のすべてのデータを暗号化し、デバイス・レベルのモバイルVPNに接続中のユーザーのモバイル・デバイス上の悪意のあるアプリケーションから保護します。

コンテナ化されたMAFアプリケーションのOMSSサポートの概要は、第2.8項「エンタープライズ配布のためのMAFアプリケーションのコンテナ化」を参照してください。

29.5 MAF接続の構成

セキュリティが適用されるアプリケーション機能のアプリケーション・ログイン・サーバーに1つ以上の接続を定義する必要があります。アプリケーション・ログイン・サーバーへの定義済の接続が存在しないと、無効な構成になります。その結果、アプリケーションは正しく機能しません。

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

図29-2に示すとおり、モバイル・ログイン・サーバー接続ウィザードを使用して接続タイプを選択できますが、接続タイプによっては、ローカルおよびリモート認証(ハイブリッド)の両方を有効化できます。アプリケーション要件によっては、次の認証プロトコルをサポートするサーバーへの接続を構成できます。

- HTTP基本

- OAuth

- Web SSO

注意:
OAuthまたはWeb SSO接続タイプを使用したログイン・サーバーへの接続を構成することをお薦めします。OAuthおよびWeb SSOは、リモート・ログイン・サーバーに対する認証を要求し、ユーザーがローカル資格証明ストアからデバイスで認証することを許可しません。

図29-2 認証の構成

ログイン・サーバー接続を作成するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを展開してMAFを展開し、MAFアプリケーション・エディタをダブルクリックします。

注意:
MAFアプリケーション・エディタを使用すると、アプリケーション・ログイン・サーバー接続を定義し、それをデフォルトのアプリケーション機能に割り当てることができます(デフォルトのアプリケーション機能が保護されている場合)。この場合、アプリケーション・ログイン・サーバーに指定されている資格証明は、アクセス制御サービス(ACS)を介してユーザー、ロールおよびサービスを検索するためにも使用されます。第29.5.19項「アクセス制御サービスに関する必知事項」も参照してください。

2. エディタで、アウトラインの「セキュリティ」を選択し、次のいずれかの隣にある「作成」をクリックします。

- デフォルト・ログイン・サーバー

- 「ログイン・ページ」

3. 図29-2に示すとおり、モバイル・ログイン・サーバー接続ウィザードで、新規接続の作成を選択し、認証サーバー・タイプを選択します。接続タイプについては、次の項で説明します。

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

図29-3に示すように、モバイル・ログイン・サーバー接続ウィザードのオプション・ページを使用して、1つのアプリケーションに異なる組織(テナント)で共有可能な1つのホスト・アプリケーション機能が含まれ、それが特定のテナントによって所有されているように見える、マルチテナントの概念がサポートされるMAFアプリケーション接続を作成できます。HTTP基本認証プロトコルをサポートするサーバーへのマルチテナント対応接続を構成できます。

図29-3 マルチテナント対応の接続の構成

図29-4に示すように、マルチテナント対応接続が定義されたMAFアプリケーションによって表示されるデフォルトのログイン・ページでは、ユーザーがHTTPリクエストのテナント値を伝播するために、ドメインIDを入力するように求められます。

図29-4 マルチテナント対応接続のデフォルトのログイン・ページ

マルチテナント対応ログイン・サーバーを作成する手順:

1. モバイル・ログイン・サーバー接続ウィザードで、マルチテナント・ログインをサポートする認証サーバー・タイプを選択します。

2. オプションのページで、「マルチテナント対応」を選択して、認証サーバーで予想されるテナント・ヘッダー名を入力します。たとえば、ログイン中にエンド・ユーザーにテナントIDを求めるには、マルチテナント・ヘッダー名(X-ID-TENANT-NAME)を入力します。図29-4に示すように、デフォルトのログイン・ページによって、ドメイン名の入力がユーザーに求められます。

3. オプションで、認証の実行に必要な追加のカスタム・ヘッダーの名前を入力します。これらは、マルチテナント・ヘッダーに加えて構成される場合があります。第29.5.14章「カスタム・ヘッダーに関する必知事項」も参照してください。

4. カスタム・ヘッダーのヘッダー値がわかっている場合は、値を入力します。指定されたカスタム・ヘッダーの値がログイン中にオーバーライドされる場合は、対応する「値」フィールドを空のままにします。実行時にヘッダー値を指定する場合は、OverrideConnectionHandler APIを使用して値をプログラムで設定する必要があります。APIを使用してヘッダーを構成する方法の詳細は、第29.5.21項「認証前にログイン資格証明をプログラムで構成する方法」を参照してください。

第29.5.3項 基本認証の構成方法

図29-5に示すとおり、「モバイル・ログイン・サーバー」ウィザードで、「HTTP基本」認証サーバー・タイプを選択すると、基本認証の接続を構成できます。

図29-5 基本認証の構成

基本認証を構成するには:

1. 「モバイル・ログイン・サーバー接続」ウィザードで、認証サーバー・タイプとして「HTTP基本」を選択します。「次へ」をクリックします。
「モバイル・ログイン・サーバー接続」ウィザードを開く方法の詳細は、第29.5.1項「MAFログイン接続の作成方法」を参照してください。

2. 「一般オプション」ページで、次の項目を定義します。

- 「名前」: 接続の名前を入力します。

- 認証モード: 表29-1の説明に従って、認証のタイプを選択します。

- 「アイドル・タイムアウト」: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:
MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を行いますが、セッション・タイムアウト後にこの認証を行うことはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- 「HTTPリクエストに基本認証ヘッダーを含めます」: このオプションを選択すると、MAFでは、Webビューから作成したHTTPリクエストに基本認証ヘッダーを追加できます。基本認証は、MAFが使用するデフォルトのリクエスト・メソッドです。基本認証ヘッダーは、ログイン接続タイプがHTTP基本である場合にのみ挿入されます。第29.5.16項「基本認証ヘッダーの挿入に関する必知事項」も参照してください。

- レルム: ユーザー名とパスワードの認証レルムを定義すると、OEPEによって、再利用可能な定義済の<realm>要素がconnections.xmlファイルに移入されます。詳細は、第29.5.16項「基本認証ヘッダーの挿入に関する必知事項」を参照してください。同じレルムの複数のページで資格証明を共有します。資格証明がMy Realmというレルムのページで動作する場合、同じユーザー名とパスワードの組合せは、同じレルムの別のページでも動作します。

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

3. 図29-6に示すとおり、「HTTP基本オプション」ページで、次の項目を構成します。

- ログインURL: 認証サーバーのログインURLを入力します。

- ログアウトURL: 認証サーバーのログアウトURLを入力します。

- 「マルチテナント対応」: MAFでは、モバイル・アプリケーションは、様々な組織(テナント)が共有するホスト・アプリケーション機能を含みますが、その機能は特定のテナントによって所有されているかのように見えるマルチテナントの概念をサポートしています。このオプションを選択すると、モバイル・アプリケーション接続にマルチテナント対応を定義できます。第29.5.9項「マルチテナント対応接続を作成する場合の処理」も参照してください。

- マルチテナント・ヘッダー名: 「マルチテナント対応」が選択されている場合、ヘッダー名を指定します。

- カスタム認可ヘッダー: 認証の実行に必要なカスタム・ヘッダーの名前を入力します。第29.5.14章「カスタム・ヘッダーに関する必知事項」も参照してください。
カスタム・ヘッダーのヘッダー値がわかっている場合は、値を入力します。指定されたカスタム・ヘッダーの値がログイン中にオーバーライドされる場合は、対応する「値」フィールドを空のままにします。実行時にヘッダー値を指定する場合は、OverrideConnectionHandler APIを使用して値をプログラムで設定する必要があります。APIを使用してヘッダーを構成する方法の詳細は、第29.5.21項「認証前にログイン資格証明をプログラムで構成する方法」を参照してください。

図29-6 基本認証の構成

4. 「テスト」をクリックして、認証サーバーへの接続をテストします。結果はウィザードに表示されます。

5. 第29.5.7項「ログイン資格証明の格納方法」に示すとおり、「次へ」をクリックして、「ログイン・オプション」ページを開いて、パラメータを構成します。

6. 第29.5.18項「アクセス制御の構成方法」に示すとおり、「次へ」をクリックして、「認可オプション」ページを開いて、パラメータを構成します。

7. 「終了」をクリックして、接続を作成します。

第29.5.4項 OAuth認証の構成方法

図29-7に示すように、「MAFログイン接続の作成」ダイアログを使用して、サードパーティ・アプリケーション(クライアント)がリモート・サーバーに格納されている保護されたデータまたはサービスへの制限付きアクセスを取得する方法を構成できます。Oracle Mobile and Socialサーバーが提供するリライイング・パーティ認証を使用すると、アプリケーションで、サードパーティOAuthプロバイダに対する認証を行うことができます。Oracle Web Services Manager (OWSM) Lite MobileのADFアプリケーション・エージェントは、Webサービス・コールのセキュリティ・ヘッダーにCookieを挿入します。

図29-7 OAuthの構成

始める前に:

OM_PROP_OAUTH_OAUTH20_SERVERプロパティ・キーを使用するようにサーバーを構成します。

OAuthサーバーで認証を構成するには:

1. モバイル・ログイン・サーバー接続ウィザードで、認証サーバー・タイプとして「OAuth2」を選択し、「次へ」をクリックします。
「モバイル・ログイン・サーバー接続」ウィザードを開く方法の詳細は、第29.5.1項「MAFログイン接続の作成方法」を参照してください。

2. 「一般オプション」ページで、次の項目を定義します。

- 「接続名」: 接続の名前を入力します。

- 認証モード: 表29-1の説明に従って、認証のタイプを選択します。

- 「アイドル・タイムアウト」: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:
MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を行いますが、セッション・タイムアウト後にこの認証を行うことはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- 「RESTコールにログイン・サーバーを含める」: リモート認証を使用したアプリケーション機能では、このオプションを選択すると、ログイン・サーバー生成ユーザー・セッション・コードを通じてログイン・サーバーに格納される、認可されたユーザー・データを取得するためにREST Webサービスを有効化できます。

注意:
CookieをREST Webサービス・コールに挿入できるようにするには、アプリケーション機能にリモート認証が使用されている必要があり(MAFは、ユーザー資格証明をローカルに保存するアプリケーション機能に対するCookieの挿入をサポートしていません)、また「ログインURL」に入力されたドメインが、REST Webサービス・エンド・ポイントと一致する必要があります。

- 「HTTPリクエストに基本認証ヘッダーを含めます」: このオプションを選択すると、MAFでは、Webビューから作成したHTTPリクエストに基本認証ヘッダーを追加できます。基本認証は、MAFが使用するデフォルトのリクエスト・メソッドです。基本認証ヘッダーは、ログイン接続タイプがHTTP基本である場合にのみ挿入されます。第29.5.16項「基本認証ヘッダーの挿入に関する必知事項」も参照してください。

3. 第29.5.7項「ログイン資格証明の格納方法」に示すとおり、「次へ」をクリックして、パラメータを構成できる「ログイン・オプション」ページを開きます。

4. 第29.5.18項「アクセス制御の構成方法」に示すとおり、「次へ」をクリックして、パラメータを構成できる「認可オプション」ページを開きます。

第29.5.5項 Web SSO認証の構成方法

図29-8に示すとおり、「モバイル・ログイン・サーバー接続」ウィザードを使用して、クロスドメイン・シングル・サインオンを構成できます。

図29-8 フェデレーテッドSSO認証の構成

Web SSOサーバーで認証を構成するには:

1. 「モバイル・ログイン・サーバー接続」ウィザードで、認証サーバー・タイプとして「Webシングル・サインオン」を選択し、「次へ」をクリックします。
「モバイル・ログイン・サーバー接続」ウィザードを開く方法の詳細は、第29.5.1項「MAFログイン接続の作成方法」を参照してください。

2. 「一般オプション」ページで、図29-9に示すとおり、次の項目を構成します。

図29-9 接続の構成

- 「接続名」: 接続の名前を入力します。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- 「RESTコールにログイン・サーバーを含める」: リモート認証を使用したアプリケーション機能では、このオプションを選択すると、ログイン・サーバー生成ユーザー・セッション・コードを通じてログイン・サーバーに格納される、認可されたユーザー・データを取得するためにREST Webサービスを有効化できます。

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

3. 「Webシングル・サインオン・オプション」ページで、成功したログインと失敗したログインを有効化するURLを構成します。をクリックしてURLをテストできます。

図29-10 認証URLの構成

4. 第29.5.18項「アクセス制御の構成方法」に示すとおり、「次へ」をクリックして、「認可オプション」ページで、パラメータを構成します。

第29.5.6項 実行時の名前付き接続の接続属性の更新方法

AdfmfJavaUtilitiesクラスでは、overrideConnectionPropertyおよびupdateSecurityConfigWithURLParametersメソッドが提供され、アプリケーション開発者は、すでに存在する接続の接続属性の定義または再定義に使用できます。この接続属性は、プレースホルダ(「MAFログイン接続の作成」ダイアログで「実行時に値を指定」を選択する場合)、または完全に作成された接続定義のいずれかです。両方のメソッドは、これもまたAdfmfJavaUtilitiesクラスによって提供される、clearSecurityConfigOverridesおよびupdateApplicationInformation APIと連携して起動する必要があります。

updateSecurityConfigWithURLParametersメソッドは、認証のみに必要なパラメータを更新します。connections.xml内で接続を指定する追加パラメータは、updateSecurityConfigWithURLParametersメソッドを使用して更新できません。updateSecurityConfigWithURLParametersですべてのパラメータを更新できるのと同様に、overrideConnectionPropertyを使用してすべての非認証パラメータを更新します。

注意:
一般的なタイミングは、アプリケーション・ライフサイクル・リスナー内でstart()メソッド実装にAdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIをコールします。機能ライフサイクル・リスナー内からこのメソッドをコールしないでください。

configUrlParamパラメータに関連付けられた接続属性を更新するには、次の例に示すように、updatedSecurityConfigWithURLParametersメソッドを他のメソッドと組み合せてコールします。

AdfmfJavaUtilities.clearSecurityConfigOverrides(loginConnectionName);
AdfmfJavaUtilities.updateSecurityConfigWithURLParameters(configUrlParam, key, message, showConfirmation);
// Final step to apply the changes
AdfmfJavaUtilities.updateApplicationInformation(false);

keyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして設定されます。その後の更新など、その構成に対するすべての参照にこのkeyパラメータを使用します。MAFが接続の既存の属性に対する接続構成の変更を検出すると、trueに設定されたshowConfirmationパラメータでメソッドを呼び出して、MAFで確認プロンプトをエンド・ユーザーに表示できます。

configUrlParamパラメータに渡す文字列の値は、UTF-8エンコードで、次のように書式設定する必要があります。

String parameterString = "http://settings?" +
"&<Parameter Name1>::=<Parameter Value1>" +
"&<Parameter Name2>::=<Parameter Value2>" +
...
"&<Parameter NameN>::=<Parameter ValueN>";

たとえば、configUrlParamパラメータに次の値を渡します。

http://settings?AuthServerType::=HTTPBasicAuthentication
&ApplicationName::=Approvals
&LoginURL::=http://hostname.com:8008/OA_HTML/RF.jsp?function_id=mLogin
&LogoutURL::=http://hostname.com:8008/OA_HTML/RF.jsp?function_id=mLogout
&SessionTimeOutValue::=28800
&IdleTimeOutValue::=7200
&CryptoScheme::=PlainText

URLは、次のように作成する必要があります。

http://settings?AuthServerType::=HTTPBasicAuthentication&ApplicationName::=Approvals&LoginURL::=http%3A%2F%2Fhostname.com%3A8008%2FOA_HTML%2FRF.jsp%3Ffunction_
id%3DmLogin&LogoutURL::=http%3A%2F%2Fhostname.com%3A8008%2FOA_HTML%2FRF.jsp%3Ffunction_id%3DmLogout&SessionTimeOutValue::=28800&IdleTimeOutValue::=7200&CryptoS
cheme::=PlainText

updateSecurityConfigWithURLParametersおよびoverrideConnectionPropertyメソッドについては、さらに次の点に注意してください。

- overrideConnectionPropertyでは、MAFアプリケーションが次にそのログイン接続を使用するまで構成の変更が永続化されないのに対し、updateSecurityConfigWithURLParametersメソッドでは、即時に新しい構成が永続化されます。たとえば、エンド・ユーザーがログイン接続によって保護されている機能に移動すると、MAFによってログイン・ビューが表示されます。

- overrideConnectionPropertyを使用して接続参照内の任意のトップ・レベルのプロパティを再構成でき、再構成できる接続参照はconnections.xmlファイル内のログイン接続に限定されません。updateSecurityConfigWithURLParametersメソッドは、ログイン接続の更新にのみ使用できます。

- updateSecurityConfigWithURLParametersのコールがそれ以前のupdateSecurityConfigWithURLParametersのコールを再構成し、その結果として、新しいログインURLのたびにupdateSecurityConfigWithURLParametersがコールされるのに対し、overrideConnectionPropertyのコールは累積されます。次の例は、一連のoverrideConnectionPropertyコールで、MyLoginConnectionという名前の接続のlogin、logoutおよびaccessControlプロパティの値をオーバーライドする方法を示しています。

AdfmfJavaUtilities.clearSecurityConfigOverrides("MyLoginConnection");
AdfmfJavaUtilities.overrideConnectionProperty("MyLoginConnection", "login", "url", newLoginUrl);
AdfmfJavaUtilities.overrideConnectionProperty("MyLoginConnection", "logout", "url", newLogoutUrl);
AdfmfJavaUtilities.overrideConnectionProperty("MyLoginConnection", "accessControl", "url", newAccessControlUrl);
AdfmfJavaUtilities.updateApplicationInformation(false);

- overrideConnectionProperty (String node)の2番目のパラメータの値は、connections.xmlファイルで使用されるパラメータ名です。たとえば、次の接続を更新するには:

<Reference name="remotePage" className="oracle.adf.model.connection.url.HttpURLConnection" xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="remotePage">
<Contents>
<urlconnection name=" remotePage_urlconnectionName " url="http://www.google.com"/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

URLを変更するoverrideConnectionPropertyを次のようにコールします。

overrideConnectionProperty("remotePage", "urlconnection", "url", "http://www.oracle.com");

これは、updateSecurityConfigWithURLParametersと同じパラメータ名ではありません。updateSecurityConfigWithURLParametersを使用する場合は、前述のURL作成パターンに従います。connections.xmlファイルの内容に関する知識は必要ありません。

oracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスおよびconfigUrlParamパラメータの使用方法の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

overrideConnectionPropertyを使用して接続プロパティ値をオーバーライドする方法の詳細は、第29.5.21項「認証前にログイン資格証明をプログラムで構成する方法」を参照してください。ConfigServiceDemoサンプル・アプリケーションのConfigServiceHandler.javaは、overrideConnectionPropertyメソッドを起動して複数の接続プロパティをオーバーライドする方法を示しています。ConfigServiceDemoサンプル・アプリケーションの詳細は、付録E「サンプルのMAFアプリケーション」を参照してください。

第29.5.7項 ログイン資格証明の格納方法

セキュリティが重要でない場合、MAFはユーザー資格証明の格納をサポートしますが、これは、ログイン・サーバーにリプレイできるか、またはユーザーをローカルで認証するために使用できます(ログイン接続に定義されているモードによって異なります)。資格証明を格納すると、ユーザーはログインしないでMAFアプリケーションにアクセスできるようになるため、ユーザーの操作性が向上します。IDM Mobile SDKを使用すると、MAFは次のモードをサポートできます。

- ユーザー名を記憶 - MAFは、ユーザー名をキャッシュし、ログイン・ページの「ユーザー名」フィールドを移入します。ユーザーがパスワードを入力し、ログイン・ボタンをタップして確認すると、MAFはそれらの資格証明を認証サーバーにリプレイします。

- 資格証明を記憶: MAFはユーザー資格証明をキャッシュし、ログイン・ページのユーザー名フィールドとパスワード・フィールドに移入します。ユーザーがログイン・ボタンをタップして、これらの資格証明を確認すると、MAFはそれらを認証サーバーにリプレイします。

- 自動ログイン - MAFはユーザー資格証明をキャッシュし、以降の認証時にそれらを認証サーバーにリプレイします。このモードでは、ユーザーは、MAFによってユーザーに資格証明を入力または確認するよう求められずにアプリケーションを起動できます。ただし、MAFは、新しいアプリケーション・セッションが開始されたことをユーザーに通知できます。

注意:
ユーザーは、MAFが資格証明を格納するかどうかを決定できます。

図29-11に示すとおり、「モバイル・ログイン・サーバー接続」ウィザードの「ログイン・オプション」ページを使用して、資格証明の格納オプションを選択できます。資格証明オプションを使用すると、オプションを使用したログイン・ページが移入され、ユーザー名とパスワードが記憶されるため、オプションデバイスが複数のエンド・ユーザーによって共有されている場合は選択しないでください。

図29-11 ユーザー資格証明のキャッシュ

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

MAFでは、connections.xmlファイル内のすべての接続情報が集約されます(このファイルはadfおよびMETA-INFノードの下のアセンブリ・プロジェクトにあります)。次の例に示すこのファイルは、アプリケーションにバンドルするか、構成サービスにホストできます。後者の場合、MAFは、アプリケーションが起動されるたびに、更新済の構成情報があるかどうかをチェックします。

注意:
MAFアプリケーション認証の要件として、OEPEは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>

29.5.9 マルチテナント対応接続を作成する場合の処理

「マルチテナント対応」オプションを有効にしてモバイル・ログイン・サーバー接続ウィザードを完了すると、MAFは、connections.xmlファイルに、trueに設定された<isMultiTenantAware>要素を移入します。マルチテナント接続では、ユーザー名はテナント名とユーザー名の組合せです。

接続がマルチテナント対応である場合、ログイン・ページは、JavaScriptユーティリティを使用して認識します。ログイン・ページでそのような接続が検出されると、追加フィールドが表示され、ユーザーは、「MAFログイン接続の作成」(図29-3を参照)で構成したテナント名をそのフィールドに入力する必要があります。ログイン(正しいテナントIDの入力を含む)が成功すると、MAFは、ローカル資格証明ストアにテナントIDを格納します。

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

保護されたMAF機能へのアクセス権を付与するためのログインURLをconnections.xmlファイルまたはプログラムを使用して定義する場合、ログインURLはmydocument.txtのようなファイル・リソースを指すことはできません。このログインURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースが使用されていると、MAFアプリケーションがハングするかログインに失敗して、ユーザーが保護されたMAF機能にアクセスできない場合があります。

29.5.11 ログイン接続およびコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項

Oracle Mobile Security Suite (OMSS) AppTunnel機能を使用して企業のリソースにアクセスするには、MAFアプリケーションによって使用されるURIまたはエンドポイントをプロキシしてリソースにアクセスするように、Mobile Security Access Server (MSAS)インスタンスを構成する必要があります。詳細は、『Oracle Mobile Security Access Serverの管理』の「Mobile Security Access Serverアプリケーションの管理」および「Mobile Security Access Serverインスタンスの構成」を参照してください。

HTTP基本認証はOMSSによってサポートされますが、MAFログイン・ページは、OMSS認証プロセスによって再度表示されるため、ユーザーは2回認証する必要があります。

コンテナ化されたMAFアプリケーションでの認証の詳細は、第29.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

第29.5.12項 ローカル接続およびハイブリッド・ログイン接続のための複数IDに関する必知事項

ローカルおよびハイブリッド・ログイン接続モードでは、リモート接続と同様、ユーザーはアプリケーション・ライフサイクル内で任意の数のIDを使用して、ログインおよびログアウトできます。ログイン接続を定義してこれらの接続モードを使用するとき、現在のセッション・タイムアウト期間内に、保護されているアプリケーション機能にすでにログイン済である場合は、ユーザーは、ローカル資格証明ストアを使用して保護されているアプリケーション機能に再びログインできます。この場合、明示的にログアウトしたユーザーまたはアイドル・タイムアウトが期限切れになっているためにログアウトされたユーザーは、保護されているアプリケーション機能(またはアプリケーション機能を保護するログイン・サーバーによって保護されているその他のアプリケーション機能)に再びログインできます。

注意:
ローカル接続とハイブリッド接続は、基本認証でのみ使用可能です。OAuthおよびFederate SSOはリモート認証を使用するため、認証が成功しない場合、アプリケーション・ユーザーはアプリケーションに再びログインできません。

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

MAFアプリケーションを移行する場合、maf-feature.xmlで定義されている認証モード(<adfmf:feature id="feature1" name="feature1" credentials="remote">など)が、connections.xmlファイルのauthenticationMode属性で定義されていることを確認する必要があります。

connections.xmlファイルのauthenticationMode属性は、remoteまたはlocalとしてのみ定義できるため、none (<adfmf:feature id="feature1" name="feature1" credentials="none">)の値を移行しないでください(移行すると、デプロイメントが失敗します)。

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

カスタム・ヘッダーを定義して「MAFログイン接続の作成」ダイアログへの入力を完了すると、MAFは、connections.xmlファイルに、customAuthHeaders要素および各headerサブ要素を移入します。

カスタム・ヘッダーの値を実行時に指定すると、MAFアプリケーションはoracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスのOverrideConnectionHandler APIを使用してヘッダー値を構成できます。oracle.adfmf.framework.api.AdfmfAuthConnectionクラスは、connection.xml XML要素がオーバーライドされている場合に、それらの要素にアクセスして最新の値を取得するための便利な方法です。第29.5.21項「認証前にログイン資格証明をプログラムで構成する方法」を参照してください。

ログイン(正しいヘッダー値の入力を含む)に成功すると、MAFはヘッダーの詳細をローカルの資格証明ストアに格納するため、HTTPリクエスト時に、セキュアなコール(RESTサービスに対するコールなど)にカスタム・ヘッダーを含めることができます。

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

ユーザーがローカルで認証されると、MAFは、モバイル・アプリケーションがREST Webサービスをコールするときに、ログイン・サーバーに対してユーザーをサイレントに認証します。ユーザーの資格証明が認証されると、MAFは、REST Webサービスに対してアプリケーションのリクエストを実行します。REST Webサービスが401ステータス・コードを返した場合(未許可)、MAFは、ユーザーにもう一度認証するよう求めます。REST Webサービスが302コードを返した場合(見つかったか一時的に移動されている)、MAFは、ログイン・サーバーをチェックして、ユーザーが認証されているか確認します。その場合は、コードが302リダイレクトとして処理されます。

ユーザーがログイン・サーバーに対して認証されていない場合、MAFは、ユーザーにもう一度認証するよう求めます。302ステータス・コードを返した場合、ログイン・サーバーは、ユーザーに独自のWebページを使用して認証するよう求めることもあります。このような場合、MAFはリダイレクションをサポートしていないため、かわりにユーザーにもう一度MAFログイン・ページを使用してログインするよう求めます。

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

MAFでは、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.17 Webサービス・セキュリティに関する必知事項

Webサービスでは、ログイン・ページはなく、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービス・コールのヘッダーに資格証明が挿入されます。Webサービスは、ローカルに格納されている資格証明(ユーザーによる認証サーバーへの最初のログインの成功後、MAFによって保持されている資格証明)を使用してアプリケーション・データにアクセスします。

ローカル資格証明ストアの名前は、ログイン・サーバー接続のadfCredentialStoreKey属性によって反映されます(第29.5.8項「モバイル・アプリケーション作成時の処理」の例のadfCredentialStoreKey="Connection_1"など)。Webサービスがこの資格証明ストアを使用できるようにするには、REST Webサービス接続のadfCredentialStoreKey属性に対して定義されている名前が、ログイン・サーバーのadfCredentialStoreKey属性に対して定義されている名前と一致する必要があります。connections.xmlファイルのadfCredentialStoreKey属性またはログイン接続名を編集する場合は、値を互いに同じに設定してください。同じ値を維持しないと、MAF実行時例外が発生します。

注意:
connections.xmlファイルの概要エディタは存在しないため、ソース・エディタを使用して、<Reference>要素のadfcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新できます。

詳細は、第15.3.4項「資格証明の挿入に関する必知事項」を参照してください。

第29.5.18項 アクセス制御の構成方法

アクセス制御サービス(ACS)は、JSONを使用したRESTful Webサービスであり、オプションでMAFアプリケーションとは別の外部サーバー上にデプロイすることができます。通常は、アプリケーション機能に保護されたコンポーネントが含まれている場合に、ユーザーが単一のHTTP POSTメッセージを介して自身のユーザー・ロールと権限をダウンロードできるよう、MAFアプリケーションにACSサービスを提供します。このサービスをアプリケーションに提供する場合は、ACSサービスを実装してホストする必要があります(MAでは、このサービスは提供されません)。図29-12は、モバイル・ログイン・サーバー接続ウィザードの「認可」ページを示したもので、このページを使用してMAFアプリケーションのアクセス制御を構成します。

図29-12 アクセス制御の構成

アプリケーション・ログイン・サーバーによって付与されるアクセス制御は、第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. 「モバイル・ログイン・サーバー接続」ウィザードで、「認可」ページに移動します。
「モバイル・ログイン・サーバー接続」ウィザードを開く方法の詳細は、第29.5.1項「MAFログイン接続の作成方法」を参照してください。

2. 図29-12に示すとおり、「認可」ページで、認可要件を完了します。

- アクセス制御サービスURL: アクセス制御サービス(ACS)のエンドポイントであるURLを入力します。

- 「ロール」: アプリケーション機能によってチェックされるユーザー・ロールを入力します。セキュリティ・システムには、数千もの定義済のユーザー・ロールおよび権限が存在する可能性があるため、アプリケーション機能に固有のロールが記載されているマニフェスト(これは、アプリケーション機能の開発者によって提供されます)を使用して、このリストを作成します。

- 「権限」: アプリケーション機能によってチェックされる権限を入力します。

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

アクセス制御サービス(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配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられている権限のリスト全体が戻されます。

次の例は、戻されたJSONオブジェクトを示しています。これには、ユーザー名およびJohn Smithというユーザーに割り当てられているロールと権限が含まれています。

Content-Type: application/json

{
"userId": "johnsmith",
"roles": [ "role1" ],
"privileges": ["priv1", "priv3"]
}

注意:
Webサービスでは、ログイン・ページはなく、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービスのヘッダーに自動的に資格証明が追加されます。詳細は、第15.3.4項「資格証明の挿入に関する必知事項」を参照してください。

注意:
ACSサービスを実装してホストする必要があり、MAFでは、このサービスは提供されません。

第29.5.20項 アプリケーションのロード順の変更方法

MAFは、図29-12に示すように、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リクエストに追加のペイロードを挿入できます。keyパラメータは、connections.xmlファイルのadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして戻されます(第29.5.16項「基本認証ヘッダーの挿入に関する必知事項」の例を参照)。appLoginパラメータをtrueに設定すると、ACSでフィーチャ・アクセスが再評価できます。OptionalExtraPayLoadパラメータは、今後の使用のために予約済であるため使用されません。

invokeACSメソッドまたはisAcsCalledAutomaticallyパラメータのいずれかを使用してACSを起動すると、アプリケーションにロール・ベースの制約が取得されます。

注意:
connections.xmlファイルに<isAcsCalledAutomatically value = "false"/>が含まれていない場合、MAFは、ログインに成功した後、自動的にACSを起動します。

保護されているアプリケーション機能がinvokeACSメソッドをコールすると、MAFは、保護されているアプリケーション機能に構成されている制約を含む、アプリケーション・ログイン接続に関連付けられたすべてのアプリケーション機能のユーザー制約をフェッチします。保護されていないアプリケーション機能がこのメソッドをコールすると、MAFは、ログイン接続に関連付けられた制約を取得するのみです。

注意:
invokeACSメソッドに加え、AdfmfJavaUtilitiesクラスには、次のライフサイクル・メソッドが含まれています。

- applicationLogout: アプリケーション・ログイン接続をログアウトします。

- featureLogout(<feature_ID>): アプリケーション機能に関連付けられたログイン接続をログアウトします。

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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

MAFアプリケーションがログイン接続を起動してユーザーを認証する前に、接続値をプログラムで設定できます。この技術は、たとえば、カスタム・ヘッダー名がモバイル・ログイン・サーバー接続ウィザードで定義されているが、値を実行時に指定する必要がある場合に必要になることがあります。接続の詳細をプログラムで構成するために、MAFアプリケーションでは、oracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスのOverrideConnectionHandler APIを起動できます。このAPIは、現在の接続プロパティを新しい値でオーバーライドし、オーバーライドされた値でアプリケーションがログインを開始できます。

接続値をプログラムでオーバーライドするには、次の一般的なプロセスが必要です。

1. オーバーライドするプロパティを定義するXML要素の名前をconnections.xmlファイルから取得する。

2. 認証の前にオーバーライド値を取得する。たとえば、MAFアプリケーションでは、AMXページを定義して、この用途で値をエンド・ユーザーに求める場合があります。

3. オーバーライド・メソッドを実装するマネージドBeanを起動し(接続プロパティのオーバーライドごとに1つ)、ゲッター・メソッドとセッター・メソッドを定義する。たとえば、AMXページの場合、エンド・ユーザーがクリックするコマンド・ボタンで、マネージドBeanで入力した値を送信できます。

接続プロパティのオーバーライドを指定するには、connections.xmlファイルを調べて、次のXML要素の定義を取得します。

- 接続参照名。たとえば、ConnWithCustomHeaderです。

- オーバーライドする属性を定義するプロパティのXML要素名。たとえば、テナント・ドメイン名の伝播に使用されるスキームのmultiTenantSchemeです。

- オーバーライドするプロパティの属性を定義するXMLサブ要素名。一意の接続プロパティの場合は、常にvalue要素になります。

注意:
カスタム・ヘッダー定義では、同じ要素名を使用して値を指定するため、カスタム・ヘッダーの場合は、XML要素headerおよびvalueを使用しないでください。かわりに、カスタム・ヘッダーにはContents、プロパティおよび属性にはcustomAuthHeadersを使用して、オーバーライド・メソッドにそれぞれ渡してください。

XML要素名の取得

たとえば、カスタム・ヘッダーの値をオーバーライドするには、次の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では、接続プロパティのオーバーライドごとにオーバーライド・メソッドを実装します。次のサンプルでは、Ova 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アプリケーション・エディタおよび「モバイル・ログイン・サーバー接続」ウィザードを使用してセキュリティを構成します。エディタを使用すると、認証を必要とするアプリケーション機能をユーザーが選択したときにMAFによって表示されるログイン・ページのタイプ(デフォルトまたはカスタム)を指定したり、ユーザー・ロールまたはユーザー権限ベースの制約を含めることができます。また、これらによって、セキュリティが必要な埋込みアプリケーション機能を選択することもできます。

29.6.1 認証を要求するようにアプリケーション機能を設定する方法

セキュリティが適用されるように各アプリケーション機能を定義できます。残りのセキュリティ構成は、MAFアプリケーション・エディタの「セキュリティ」のセクションを使用して行います。

図29-13に示すとおり、セキュリティが適用されるアプリケーション機能およびMAF機能エディタの「機能」セクションで必要な認証タイプを指定できます。

図29-13 アプリケーション機能に対するユーザー資格証明オプションの指定

始める前に:

機能のセキュリティを有効化すると、アプリケーションは、ネットワークにアクセスしてユーザーを認証する必要があります。ネットワーク・ソケットへのアプリケーション・アクセス権の付与の詳細は、第9.2項「MAFアプリケーションでのコア・プラグインの有効化」を参照してください。

アプリケーション機能に対するユーザー・アクセスを指定するには:

1. プロジェクト・エクスプローラのユーザー・インタフェース・プロジェクトで、MAFを展開し、「MAF機能エディタ」をダブルクリックします。

2. MAF機能エディタで、「機能」の下にリストされているアプリケーション機能を選択するか、または「機能」を右クリックし、「新」を選択してアプリケーション機能を追加します。

3. ログインが必要なアプリケーション機能に「セキュリティの有効化」を選択します。

ヒント:
このオプションをデフォルトのアプリケーションに適用しない場合、ユーザーは匿名で(つまり、ログイン資格証明を入力せずに)ログインできます。ユーザーは、保護されていないデータおよび機能にアクセスでき、要求があった場合にはログインします(認証されたユーザーは、保護されているデータと保護されていないデータの両方にアクセスできます)。MAFアプリケーション内に保護されていないアプリケーション機能を提供すると、ユーザーは保護されているアプリケーション機能からログアウトするが、アプリケーション自体に残って、保護されていないアプリケーション機能とデータの両方に引き続きアクセスできます。

29.6.2 ログイン・ページの指定方法

アプリケーション機能のセキュリティを指定したら、図29-14に示されているMAFアプリケーション・エディタの「セキュリティ」ページを使用して、セキュリティが適用される各アプリケーション機能に対して、ログイン・ページの構成およびログイン・サーバーへの接続の作成とその割当てを行います。このページにリストされているすべてのアプリケーション機能は、MAF機能エディタで、セキュリティが必要なものとして指定されています。

通常、アプリケーション機能のグループは、同じログイン・サーバー接続で保護され、ユーザーは、MAFから再度ログインを求められることなく、これらのアプリケーションをどれでも開くことが可能です。ただし、場合によっては、あるアプリケーション機能のセットを保護しているログイン・サーバーと、別のアプリケーション機能のセットを保護しているログイン・サーバーが異なるため、アプリケーション機能で要求される資格証明がそれぞれ異なる可能性があります。このような状況に対応するために、モバイル・アプリケーション用のログイン・サーバーへの接続をいくつも定義できます。maf-application.xmlファイルでは、機能参照に関連付けられている認証サーバー接続は、次のようにloginConnRefId属性を使用して指定されます。

<adfmf:featureReference id="feature1" loginConnRefId="Connection_1"/>
<adfmf:featureReference id="feature2" loginConnRefId="Connection2"/>

MAFアプリケーションは、HTTPまたはHTTPS経由のBasic認証をサポートしている標準のログイン・サーバーなら、どのログイン・サーバーに対しても認証を受けることが可能です。MAFはまた、Oracle Identity Managementに対する認証もサポートしています。特定のアプリケーション機能用のカスタム・ログイン・ページを選択することもできます。詳細は、第29.6.4項「ログイン・ページに関する必知事項」を参照してください。

注意:
デフォルトでは、保護されているすべてのアプリケーション機能が同じ接続を共有し、この接続は、図29-14に示すとおり、<application login server>と表示されます。ログイン・サーバー(接続)は、「セキュリティ」タブで定義します。登録された機能タブでは、特定の機能にそれらを割り当てたり、<default>を使用できます。モバイル・ログイン・サーバー接続ウィザードを使用して、MAFアプリケーション用に定義されている他の接続を選択できます。

図29-14 MAFアプリケーション・エディタに登録された機能

始める前に:

MAFアプリケーションでカスタム・ログイン・ページを使用する場合、図29-14に示すように、ビュー・コントローラ・プロジェクトのViewContentディレクトリにこのファイルを追加して、MAFアプリケーション・エディタから使用できるようにします。第29.6.3項「カスタム・ログインHTMLページの作成方法」および第5.4項「外部リソースの選択に関する必知事項」も参照してください。

第22.2.4項「ユーザー制約とアクセス制御について」の説明に従って、ユーザー権限とロール用の制約を追加します。

アクセス制御サービス(ACS)・サーバーをプロビジョニングします。詳細は、第29.5.19項「アクセス制御サービスに関する必知事項」を参照してください。

図29-15 カスタム・ログイン・ページの追加

ログイン・ページを指定するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトおよびMAFの順に展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

2. アウトラインで、「セキュリティ」をクリックします。

3. 「セキュリティ」ページで、ユーザー名およびパスワードを受け入れるビューとして「ログイン・ページ」を選択します。

4. 次のように、選択したログイン・ページのコンテンツ(またはユーザー・インタフェース)を選択します。

- デフォルト: 選択されたすべての埋込みアプリケーション機能で使用されるデフォルト・ログイン・ページ。詳細は、第29.6.4.1項「デフォルト・ログイン・ページ」を参照してください。デフォルト・ログイン・ページはMAFによって指定されます。

- 「カスタム」: 「参照」をクリックして、アプリケーション・コントローラ・プロジェクト内のファイルのパスの場所を検索します。または、「新規」をクリックして、ログイン・ページのカスタムHTMLページをアプリケーション・コントローラ・プロジェクト内に作成します。詳細は、第29.6.4.2項「カスタム・ログイン・ページ」を参照してください。

ヒント:
「参照」機能を使用してログイン・ページの場所を検索するのではなく、「プロジェクト・エクスプローラ」からログイン・ページをフィールドにドラッグできます。

29.6.3 カスタム・ログインHTMLページの作成方法

MAFのデプロイメントによってwwwディレクトリ内に生成されるアーティファクトであるデフォルトのログイン・ページ(adf.login.html)を変更すると、カスタム・ログイン・ページを作成できます。

始める前に:

wwwディレクトリ内のログイン・ページにアクセスするには、MAFアプリケーションをデプロイした後、deployディレクトリに移動します。iOSデプロイメントの場合、ページは次の場所にあります。

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/adf.login.html

Androidデプロイメントの場合、ページは、次の場所にあるAndroidアプリケーション・パッケージ(.apk)ファイル内に配置されます。

application workspace directory/application name/deploy/deployment profile name/deployment profile name.apk/assets/www/adf.login.html

カスタム・ログイン・ページを作成するには:

1. ビュー・コントローラ・プロジェクトのViewContentディレクトリ内の場所に、デフォルト・ログイン・ページをコピーします。

2. ログイン・ページの名前を変更します。

3. ページを更新します。

4. MAFアプリケーション・エディタの登録された機能タブの「セキュリティ」セクションで、カスタム・ログイン・ページを選択します。

29.6.4 ログイン・ページに関する必知事項

アプリケーション機能の認証プロセスのエントリ・ポイントは、activateライフサイクル・イベントです(第10.1項「MAFアプリケーションのライフサイクル・リスナーの概要」を参照)。アプリケーション機能がアクティブ化されるたびに(つまり、アプリケーション機能のactivateイベント・ハンドラがコールされるたびに)、アプリケーション機能ログイン・プロセスは実行されます。このプロセスは、ログイン・ページ(デフォルトまたはカスタムのログイン・ページのいずれか)に移動し、そこでユーザー認証が必要かどうかを判断します。ただし、プロセスがログイン・ページに移動する前に、本来意図されていたアプリケーション機能をMAFに登録する必要があります。認証が成功すると、ログイン・ページは、MAFから本来意図されていた宛先を取得し、そこに移動します。

29.6.4.1 デフォルト・ログイン・ページ

MAFによって提供されるデフォルトのログイン・ページは、ログイン・ボタンと、ユーザー名とパスワード用の入力テキスト・フィールド、マルチテナント名(オプション)、およびエラー・メッセージ・セクションから構成されます。これは、HTMLで記述されたクロス・プラットフォーム・ページです。図29-1は、デザインタイムでマルチテナント対応オプションを有効にしたデフォルトのログイン・ページを示し、このページでは、ユーザー名とパスワードの他、テナントのドメイン名の入力が要求されます。

図29-16 マルチテナント対応接続のデフォルトのログイン・ページ

29.6.4.2 カスタム・ログイン・ページ

MAF機能エディタを使用して、選択したアプリケーション機能用のカスタム・ログイン・ページを追加すると、OEPEは、次の例に示すとおり、<adfmf:login>要素を追加し、その子要素<adfmf:LocalHTML>を移入します。すべての<adfmf:LocalHTML>要素と同様に、そのurl属性は、public_htmlディレクトリ内の場所を参照します。ユーザー認証メカニズムとナビゲーション・コントロールは、デフォルトのログイン・ページと同じものになります。

<adfmf:login defaultConnRefId="Connection_1">
<adfmf:localHTML url="newlogin.html"/>
</adfmf:login>

カスタム・ログイン・ページはHTMLで記述されています。デフォルトのログイン・ページのフィールドには、特別に定義された<input>および<label>要素が含まれている必要があります。

ヒント:
カスタム・ログイン・ページを作成するためのガイドとしてMAFアプリケーションのデプロイ時に生成されたデフォルトのログイン・ページを使用します。wwwディレクトリ内のログイン・ページにアクセスするには、MAFアプリケーションをデプロイした後、deployディレクトリに移動します(第29.6.3項「カスタム・ログインHTMLページの作成方法」を参照)。

次の例は、デフォルト・ログイン・ページに必要な<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"/>

第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

「Identityドメイン」/「テナント名」フィールド

oracle_access_iddomain_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)

29.6.6 アプリケーション機能用にセキュリティを構成する場合のOEPEでの処理

セキュリティが適用されるようにアプリケーション機能が指定されると、OEPEは、図29-14に示すとおり、対応する機能参照で登録された機能を更新します。参照される各アプリケーション機能が、connections.xmlファイル内に定義されている同じログイン・サーバー接続に対して認証を行うと、OEPEは、defaultConnRefId属性を使用して定義されている単一の<adfmf:login>要素(<adfmf:login defaultConnRefId="Connection_1">など)でmaf-application.xmlファイルを更新します。

connections.xmlファイル内に定義されている別のログイン・サーバー接続を使用するように構成されているアプリケーション機能の場合は、OEPEは、参照される各アプリケーション機能をloginConnReference属性(<adfmf:featureReference id="feature2" loginConnRefId="Connection2"/)で更新します。詳細は、第29.6.1項「認証を要求するようにアプリケーション機能を設定する方法」を参照してください。Oracle Mobile Application Frameworkタグ・リファレンスも参照してください。

第29.7項 デバイス機能へのアクセスの許可

デバイス機能へのアクセスは、MAFアプリケーションに組み込まれているCordovaプラグインによって定義されます。コア・プラグインのセットはMAFによって提供されます。これらのプラグインの1つを有効にすると、そのプラグインに必要なすべてのデバイス・アクセス権限が有効になります。MAFアプリケーションに組み込まれている他のCordovaプラグインも、必要なデバイス・アクセス権限を有効にします。

MAFアプリケーションの大多数ではネットワーク・アクセスが必要なため、ネットワークにアクセスする権限はデフォルトで有効になっています(デフォルトで有効になっている唯一のデバイス機能)。

- ネットワーク情報: アプリケーションによるネットワーク・ソケットのオープンを許可します。少なくとも1つのデバイス機能のセキュリティが有効な場合、ネットワーク・アクセス機能は有効にしておく必要があります。

デバイス機能の有効化または制限が可能なため、デプロイメント・フレームワークによって更新されるプラットフォーム固有の様々な構成ファイルやマニフェスト・ファイルでは、使用中のデバイス機能(または、MAFアプリケーションに使用が登録されているプラグイン)のみがリストされます。これらのファイルにより、MAFはこれらの機能の使用に関する情報を他のアプリケーションと共有できます。たとえば、AppStoreやGoogle Playに対して、MAFアプリケーションで場所ベースの機能が(搭載されていても)使用されていないことを通知できます。

MAFアプリケーションのCordovaプラグインの詳細は、第9章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

MAFアプリケーション内の選択したアプリケーション機能がネイティブ・コンテナと、拡張により、MAFアプリケーションがアクセスできるデバイス機能にアクセスできないようにすることもできます。たとえば、MAFアプリケーションには、信頼していないWebアプリケーションからリモート・コンテンツを参照するアプリケーション機能が含まれます(リモートURLコンテンツ・アプリケーション機能)。このシナリオでは、次の例に示すように、この特定のアプリケーション機能がネイティブ・コンテナにアクセスできないようにします。

<adfmf:featureReference refId="remoteAppfeature1" id="fr1" allowNativeAccess="false"/>

allowNativeAccessプロパティのデフォルト値はtrueです。

第29.8項 ユーザーによるアプリケーション機能からのログアウトの有効化

ユーザーが、保護されているコンテンツを含むアプリケーション機能からログアウトするとき、または制約によって制限されているときは、MAFはアプリケーション機能を終了せず、またユーザーはアプリケーション内でログイン状態を維持し、セキュアでないコンテンツおよび機能に匿名ユーザーとしてアクセスできます。MAFでは、制約を再初期化できるため、ユーザーは、同じアイデンティティを使用して、アプリケーションに繰り返しログインできます。また、MAFは、ユーザーに別のアイデンティティを使用したログインを許可することで、複数のアイデンティティでアクセスを共有できます。

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 Mobile Application Framework Java APIリファレンスを参照してください。

29.9 MAF認証APIの使用

MAFには、APIが含まれた様々な認証クラスが用意されており、MAFアプリケーションで認証関連のタスクを行う場合に役立ちます。

これらのAPIは、oracle.maf.api.authenticationパッケージの認証クラスに存在します。たとえば、AuthenticationHandlerクラス、AuthenticationPlatformクラス、AuthenticationUtilityクラスなどがあります。

これらのAPIを実装して実行できるタスクには、ログイン中のユーザーが保護されたアプリケーションにアクセスする前に行う処理などがあります。たとえば、認可ヘッダー情報を取得し、その情報を使用して、エンド・ユーザーがログイン成功時に移動するコンテンツを決定します。AuthenticationPlatformは、エンド・ユーザーが保護されたアプリケーション機能からログアウトしたときになんらかの処理を実行するために実装できるaddLogoutCallback APIも提供します。このコールバックAPIを使用すると、エンド・ユーザーがデバイスを共有しているシナリオで役立つ場合があります。これらの認証クラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

次の例は、実装クラスからのコードのスニペットを示しており、AuthenticationPlatformのインスタンスはそのgetToken() APIを使用して認可ヘッダー情報を取得します。

例29-1 認証プラットフォームからの認可ヘッダーの取得

import oracle.maf.api.authentication.AuthenticationPlatform;
import oracle.maf.api.authentication.AuthenticationUtility;
…
AuthenticationPlatform ap = AuthenticationUtility.getInstance().lookupByCredentialStoreKey("credentialStoreKey");
String authorization = ap.getToken("Authorization");
…

29.10 SSL用の自己署名証明書を使用するサーバーにアクセスするための証明書の作成

MAFは、cacerts証明書ファイル(HTTPSハンドシェークのためのクライアント・アプリケーションおよびサーバー間のJavaメカニズム)を提供します。このファイルは、OEPEにより、アプリケーション・リソース「セキュリティ」フォルダ([assembly project\lib\Security\cacertsにあります)内に作成されます。MAFのcacertsファイルにより、信頼できる既知のソースからの一連の証明書がJVMに対して識別され、デプロイメントが可能になります。

サーバーが自己署名証明書を使用しているサーバー・リソースにアプリケーションがアクセスする必要がある場合は、プライベート証明書をMAFのcacertsファイルに追加する必要があります。アプリケーションでカスタム証明書が必要な場合(RSA暗号化が使用されていない場合など)も、プライベート証明書を追加する必要があります。アプリケーションをデプロイする前に、プライベート証明書を追加します。

始める前に:

cacertsファイルの内容を理解しておくと役立ちます。詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for EclipseのインストールのMAFにおけるSSL用の新規cacertsファイルへの移行に関する項を参照してください。

OEPEによるcacertsファイルの作成方法についても理解しておくと役立ちます。詳細は、第C.2項「アセンブリ・レベルのリソースについて」を参照してください。

cacertsファイルおよびkeytoolユーティリティの使用方法の詳細は、Java SEテクニカル・ドキュメント(https://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 1.4が読み取れるようにするために、カスタマイズされた証明書ファイルはSecurityディレクトリ(users\workspaces\assembly project\lib\Security)に確実に配置してください。

3. アプリケーションをデプロイします。

注意:
デプロイメント時、証明書ファイルがSecurityディレクトリに存在している場合、MAFは、それをAndroidまたはXcodeテンプレート・プロジェクトにコピーし、cacertsファイルのデフォルト・コピーを置き換えます。

4. 保護されているリソースにSSL経由でアクセスできることを確認します。

29.11 認証に双方向SSLを有効にするためのMAFアプリケーションの構成

MAFアプリケーションのエンド・ユーザーは、デジタル証明書(クライアント証明書)をアプリケーションのキーストアにインストールし、双方向SSL、相互認証または双方向認証という様々な名前で呼ばれるプロセスを使用して、認証を有効にできます。

エンド・ユーザーがクライアント証明書をアプリケーションのキーストアにインストールすると、MAFアプリケーションでは、クライアントとサーバー間の認証を実行するために双方向SSL通信セッションが使用されるように、サーバーにその証明書を提示できます。

この機能を実装するには、クライアント証明書のファイル拡張子をアプリケーションに登録する必要があります。これを実行することにより、MAFアプリケーションは、エンド・ユーザーがクライアント証明書ファイルを自分のデバイスにダウンロードしてから開く際に、証明書を開いてインストールできます。MAFアプリケーションは、デバイス上でクライアント証明書のファイル拡張子を登録している唯一のアプリケーションである場合、証明書を開くエンド・ユーザーに対してデバイスのオペレーティング・システムが提示するアプリケーションとなります。他のアプリケーションがファイル拡張子を登録している場合、デバイスのオペレーティング・システムはアプリケーションのリストを提示し、エンド・ユーザーはそこからMAFアプリケーションを選択する必要があります。

管理者がクライアント証明書をMAFアプリケーションのエンド・ユーザーに配布するには、電子メール添付ファイルを使用するか、エンド・ユーザーがURLを使用してクライアント証明書をダウンロードできる場所で証明書をホストします。

iOSプラットフォームでは、サード・パーティ製アプリケーションがクライアント証明書のデフォルトの拡張子(.p12)を使用してファイルを開くことが許可されていません。この制限を回避するために、アプリケーション開発者は別の証明書拡張子(.certなど)を登録する必要があります。証明書を配布する管理者は、別の拡張子を使用するようにクライアント証明書の名前を変更して、MAFアプリケーションのエンド・ユーザーが電子メール添付ファイル、またはクライアント証明書の配布に使用するURLから直接クライアント証明書を開くことができるようにします。

双方向SSLを有効にするためにMAFアプリケーションを構成する方法

アプリケーションにクライアント証明書のファイル拡張子を登録するには、MAFアプリケーション・エディタの「アプリケーション」ページで、ファイル拡張子を「クライアントSSL証明書の拡張」フィールドに入力します。

双方向SSLを有効にするためにMAFアプリケーションを構成するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトおよびMAFの順に展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

2. 「アウトライン」で、アセンブリ・プロジェクト名をクリックします。

3. 「アプリケーション」ページで、「クライアントSSL証明書の拡張」フィールドにファイル拡張子を入力します。

双方向SSLを有効にするためにMAFアプリケーションを構成した場合の処理

例29-2に示すように、OEPEにより、「クライアントSSL証明書の拡張」フィールドに入力した値がmaf-application.xmlファイルに書き込まれます。

実行時に、エンド・ユーザーは、クライアント証明書を管理者が配置した場所からデバイスにダウンロードするか、または電子メール添付ファイルから自動的に開きます。サーバーの場所からのダウンロード動作は、エンド・ユーザーのデバイスのオペレーティング・システムによって異なります。たとえば、Androidデバイスを使用するMAFアプリケーションのエンド・ユーザーは、証明書をAndroidのダウンロード・ディレクトリにダウンロードします。ダウンロードすると、エンド・ユーザーはMAFアプリケーションのキーストアにインストールするために証明書を抽出します(開きます)。このステップを完了するには、エンド・ユーザーは、クライアント証明書を配布した管理者が提供したパスワードを入力する必要があります。エンド・ユーザーがアプリケーションのキーストアに証明書をインストールすると、MAFアプリケーションはその証明書をサーバーに提示して、双方向SSLセッションを確立できます。

例29-2 maf-application.xmlファイルでのクライアント証明書のファイル拡張子

<adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
version="1.0" name="twowayssltest" id="com.company.twowayssltest"
appControllerFolder="ApplicationController" listener-class="application.LifeCycleListenerImpl"
client-ssl-certificate-extension="cert">
….

30 MAFアプリケーションのテストおよびデバッグ

この章では、MAFアプリケーションのテストおよびデバッグについて説明します。

この章には次の項が含まれます:

- 第30.1項「MAFアプリケーションのテストおよびデバッグの概要」

- 第30.2項「MAFアプリケーションのテスト」

- 第30.3項「コードをデバッグするためのOEPEおよびMAFアプリケーションの構成」

- 第30.4項「AndroidプラットフォームにデプロイされたMAFアプリケーションのデバッグ」

- 第30.5項「iOSプラットフォームにデプロイされたMAFアプリケーションのデバッグ」

- 第30.6項「MAFアプリケーションでのロギングの使用および構成」

- 第30.7項「MAFアプリケーションのパフォーマンスの測定」

- 第30.8項「Oracle Mobile Cloud Serviceへの診断情報の送信」

- 第30.9項「Oracle Mobile Cloud Serviceへの分析情報の送信」

30.1 MAFアプリケーションのテストおよびデバッグの概要

MAFアプリケーションをテストまたはデバッグするには、MAFがサポートしているいずれかのプラットフォーム(AndroidまたはiOS)上のデバイスにデバッグ・モードでデプロイします。MAFおよび各プラットフォームでは、OEPE開発環境を、デバイスまたは仮想デバイスで実行されているMAFアプリケーションに接続できるツールを提供しています。たとえば、Androidデバイス上でMAFアプリケーションをテストする場合は、デバッグ・モードのMAFアプリケーションを、OEPEからAndroidデバイスまたはAndroid Virtual Device (AVD)にデプロイします。iOSでも同様のツールを提供しています。

注意:
デバッグは、ユニバーサルWindowsプラットフォーム用に開発されたMAFアプリケーションには使用できません。

MAFアプリケーションをデバッグするためのおおまかな手順には、次のタスクが含まれます。

1. MAFアプリケーションがデバッグ・モードでデプロイされるように、デバッグ構成を使用してテスト環境にMAFアプリケーションをデプロイします。

2. MAFアプリケーションをテスト環境にデプロイします。

3. 実行するデバッグ・タスクに適切なツールを使用します。たとえば、MAFアプリケーションのJavaコードをデバッグする場合は、OEPEによって提供されているツールを使用します。MAFアプリケーションのユーザー・インタフェース(HTML、CSSまたはJavaScript)をレンダリングするコードをデバッグする場合は、各プラットフォームでこのタスクのために提供されているツールを使用します。

MAFにはこの他にも、アプリケーションのテストを支援するための機能が用意されています。これらには、アプリケーションのパフォーマンスのモニター、Oracle Mobile Cloud Serviceへの分析情報および診断情報の送信(アプリケーションがこのサービスからリソースにアクセスする場合)などの機能があります。

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 コードをデバッグするためのOEPEおよびMAFアプリケーションの構成

OEPEには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してアプリケーションの実行をモニターおよび制御することを可能にするデバッグ・メカニズムが備わっています。

MAFアプリケーションはOEPE内部で実行できないため、デバッグの方法が異なります。OEPEデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン・インスタンスに接続し、デプロイ済のMAFアプリケーションのJavaの部分を制御します。

MAFは、デバッグ用にプロジェクト・プロパティを自動的に構成します(第30.3.1項「デバッグ構成に関する必知事項」を参照)。次は、OEPEを使用してMAFアプリケーションのJavaコードをデバッグするために実行する必要のある手順です。

アプリケーションをテストまたはデバッグするには:

1. OEPEのメイン・メニューで、「実行」→「デバッグ構成」をクリックして、デバッグ構成を選択します。

2. デバッグを有効にした状態でアプリケーションを実行する場合は、「デバッグ」をクリックします。

詳細は、次を参照してください:

- 第30.3.1項「デバッグ構成に関する必知事項」

30.3.1 デバッグ構成に関する必知事項

新しいMAFデバッグ構成を作成すると、OEPEによって、アプリケーションがデバッグ用に自動的に構成されます。これらのデバッグ構成では、構成のOEPEデバッグ・ボタンをクリックしてMAFアプリケーションをデバッグできます。アプリケーションはデプロイされると、自動的にデバッガで起動されます。

実行構成の作成および編集方法の詳細は、第30.3.1.1項「デバッグ構成の作成と構成」を参照してください。

30.3.1.1 デバッグ構成の作成と構成

新しい構成を作成するか、既存の構成を変更するには、次のように「デバッグ構成」ダイアログに入力します。

1. OEPEのメイン・メニューで、「実行」→「デバッグ構成」をクリックして、「デバッグ構成」ダイアログを開きます。

2. MAFアプリケーションを右クリックし、「新規」を選択して新しいデバッグ構成を作成します。

3. 次のようにダイアログの「メイン」タブに入力します。

- Androidの場合は、第27.3.1項「Androidデプロイメント構成の作成方法」の手順に従います。

- iOSの場合は、第27.4.1項「iOSデプロイメント構成の作成方法」の手順に従います。

4. 図30-1に示すように、「デバッグ」タブでJavaコードのデバッグを選択し、ポートを適切なポート番号に設定します。

図30-1 デバッグ構成の作成

注意:
タイムアウトを回避するには、モバイル・デバイスまたはシミュレータでアプリケーションを起動したらすぐにデバッガを起動します。
デプロイメントが成功し、デバイス上のアプリケーションがデバッグ・モードで起動した場合、リモート・デバッグが接続されるまでブロックされます。タイムアウトは通常数分です。

Androidの場合

1. ポート転送が確立されていることを確認します。

iOSの場合

1. 開発コンピュータとモバイル・デバイスがTCPを介して相互に見えていることを確認します(互いにpingを実行できます)。

2. モバイル・デバイスのIPアドレスを持ったlocalhostを置き換えることで、リモートJavaアプリケーション構成の「ホスト」フィールドを変更します。

詳細は、第30.3.1項「デバッグ構成に関する必知事項」を参照してください

30.3.2 JavaコードおよびJavaScriptのデバッグを有効にする方法

アプリケーションのデプロイメント構成を使用して、MAFアプリケーションの実行モードをリリースまたはデバッグのいずれかに指定します。デバッグ・モードでのみ、JavaおよびJavaScriptコードを対話的にデバッグできます。デバッグ・モードでは、コンパイル時に特殊なデバッグ・ライブラリおよびシンボルを含めることが可能です。

図30-2は、デバッグ・モード・オプションの設定方法を示しています。

図30-2 デバッグ・モードの設定

詳細は、次を参照してください。

- 第27.3.1項「Androidデプロイメント構成の作成方法」

- 第27.4.1項「iOSデプロイメント構成の作成方法」

- 第27.4.9.1項「iOS開発用証明書の作成」

maf.propertiesファイルでは、JVMの起動パラメータおよびMAFのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。maf.propertiesファイルは自動的に作成され、{assembly_project}/META-INFディレクトリ内(この場所は、アプリケーション・ファイル・システム内の<application_name>/META-INFの場所に対応しています)に配置されます(第30.6項「MAFアプリケーションでのロギングの使用および構成」を参照)。

maf.propertiesファイルで次のデバッグ・プロパティを使用できます。

- java.debug.enabled: MAF用のJavaデバッグを有効または無効にします。有効な値は、trueとfalseです。

注意:
java.debug.enabledがtrueに設定されている場合、JVMは、デバッガが接続を確立するのを待ちます。デバッガが接続に失敗すると、MAF AMXアプリケーション機能のロードが失敗します。

- java.debug.port: デバッグ時に使用するポートを指定します。有効値は整数です。

- javascript.debug.enabled: アプリケーションがデバイス・シミュレータで実行されている場合、JavaScriptのデバッグを有効または無効にします。有効な値は、trueとfalseです。

- javascript.debug.feature: MAFでのJavaScriptデバッグの起動をトリガーするアプリケーション機能を指定します。値の形式はfeatureId:portです。ポートを指定する必要があります(これは当初、プレースホルダ値に設定されています)。

注意:
javascript.debug.enabledおよびjavascript.debug.featureの設定は、iOSおよびSafariバージョンが6.0以前の場合にのみ有効です。
iOSとSafariの両方のバージョンが6.0以降の場合、これらの2つのプロパティはいずれも指定する必要はありません。かわりに、第30.3.2.1項「iOS 6プラットフォーム上でのiOSデバイス・シミュレータを使用したJavaScriptのデバッグに関する必知事項」の指示に従ってください。

maf.propertiesファイルの内容は、次のようなものです。

java.debug.enabled=true
java.debug.port=8000

javascript.debug.enabled=true
javascript.debug.feature=products:8888

maf.propertiesファイルがJavaScriptをデバッグするように構成されたら、次のURLに移動して、MAFでデバッグ可能なすべてのロード済ページのリストを確認できます。

http://localhost:9999

OEPEを使用してJavaコードをデバッグする方法の詳細は、第30.3項「コードをデバッグするためのOEPEおよびMAFアプリケーションの構成」を参照してください。

30.3.2.1 iOS 6プラットフォーム上でのiOSデバイス・シミュレータを使用したJavaScriptのデバッグに関する必知事項

iOS 6プラットフォームで作業している場合、Safari 6ブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariの設定を開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします(図30-3を参照)。

図30-3 Safariブラウザ・オプションの有効化

「Develop」メニューが有効な場合、図30-4および図30-5に示すように、「iPhone Simulator」または「iPad Simulator」を選択し、デバッグするUIWebViewを選択します。「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。

図30-4 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ

図30-5 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ

30.3.3 MAF AMXコンテンツのデバッグ方法

MAFアプリケーションにMAF AMXコンテンツが含まれている場合、デバイスまたはエミュレータを構成した後で、OEPEでその他のタイプのアプリケーションをデバッグするときに行うのと同様、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックの検査ができます。

注意:
デバッグできるのは、JavaコードおよびJavaScriptのみです(第30.3.2項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。

30.4 AndroidプラットフォームにデプロイされたMAFアプリケーションのデバッグ

OEPEを使用してAndroidプラットフォームでMAFアプリケーションをデバッグするには、第30.3項「コードをデバッグするためのOEPEおよびMAFアプリケーションの構成」で説明されている汎用的なデバッグ手順を実行します。

Javaコードをデバッグするには、デバッグ構成を作成し、その中でデバッグ・モードを構成します。これらのタスクの詳細は、第30.3.2項「JavaコードおよびJavaScriptのデバッグを有効にする方法」および第30.3項「コードをデバッグするためのOEPEおよびMAFアプリケーションの構成」を参照してください。これらのタスクを完了すると、MAFアプリケーションをデバッグ・モードでデプロイして、第30.4.1項「AndroidプラットフォームでのJavaコードのデバッグ方法」の説明に従ってJavaコードをデバッグできます。

UIコード(JavaScript、HTMLおよびCSS)をデバッグするには、デバッグ構成でデバッグ・モードを構成します。このタスクを完了すると、第30.4.2項「AndroidプラットフォームでのUIコードのデバッグ方法」の手順に従ってUIコードをデバッグできます。

30.4.1 AndroidプラットフォームでのJavaコードのデバッグ方法

OEPEを使用してAndroidプラットフォームでMAFアプリケーションのJavaコードをデバッグするには、第30.3項「コードをデバッグするためのOEPEおよびMAFアプリケーションの構成」で説明されているデバッグ手順を実行します。

Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、第27.3.2項「AndroidエミューレータへのAndroidアプリケーションのデプロイ方法」を参照してください。

Androidデバイスまたはエミュレータで実行中のMAFアプリケーションのデバッグを可能にするには、第9章「MAFアプリケーションでのプラグインの使用方法」の概要の説明に従って、ネットワーク情報プラグインが有効であることを確認します。

30.4.1.1 adbのトラブルシューティング

Javaコードをデバッグすると、USBを介して接続されたAndroidデバイスまたはAndroidデバイス・エミュレータで、デプロイメントの最終手順は自動的にポート転送を実行します。これは、ターミナルで次のコマンドを実行した場合と同じです。

- デバイスでのデバッグの場合:
adb -d forward tcp:8000 tcp:8000

- エミュレータでのデバッグの場合:
adb -e forward tcp:8000 tcp:8000

ときにはadbプロセスはフリーズすることがあるため、プロセスを強制終了して再起動する必要があります。

プロセスを強制終了するには、次の手順を実行します。

- Macターミナル: kill -9 procIDコマンドを使用します。

ターミナルで次のコマンドを実行して、adbデーモンを再起動します。

adb devices

adbのフリーズの前に成功したデプロイメントは引き続きデプロイされます。アプリケーションをデバッグするには、アプリケーションを再デプロイします。

30.4.2 AndroidプラットフォームでのUIコードのデバッグ方法

MAFアプリケーションを開発する際、Androidデバイスでアプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。開発マシンからAndroidデバイスにMAFアプリケーションをデプロイすると、GoogleのChrome DevToolsを使用してこのコードをデバッグできます。図30-6は、MAFアプリケーションのAMXページを調べるChrome DevToolsを示しています。

図30-6 MAFアプリケーションのAMXページを調べるChrome DevTools

Chrome DevToolsの詳細(使用するための要件など)は、Google DevelopersのサイトにあるChrome DevToolsを使用したAndroidでのリモート・デバッグに関する項を参照してください。

Oracle Mobile Platform YouTubeチャンネルの「Android上のOracle MAFアプリケーションでのHTMLのデバッグ」ビデオで、AndroidでUIコードをデバッグする方法の概要も参照してください。後者のビデオではcvm.propertiesファイルに言及していることに注意してください。このファイルは、maf.propertiesに名前が変更されました。

AndroidデバイスにMAFアプリケーションをデプロイしてUIコードをデバッグするには、次のことを実行する必要があります。

- maf.propertiesファイルを構成して、javascript.debug.enabled=trueというエントリを含めます。
maf.propertiesファイルの詳細は、第30.3.2項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

- デバッグ・モードでデプロイします。詳細は、第27章「MAFアプリケーションのデプロイ」を参照してください。

30.5 iOSプラットフォームにデプロイされたMAFアプリケーションのデバッグ

Javaコードをデバッグする前に、デバッグ構成を作成し、その中でデバッグ・モードを構成する必要があります。これらのタスクの詳細は、第30.3.2項「JavaコードおよびJavaScriptのデバッグを有効にする方法」および第30.3項「コードをデバッグするためのOEPEおよびMAFアプリケーションの構成」を参照してください。これらのタスクを完了したら、アプリケーションをiOSデバイスにデバッグ・モードでデプロイして、Javaコードをデバッグできます。デバッグ・モードでデプロイする方法の詳細は、第30.5.1項「iOSプラットフォームでのJavaコードのデプロイ方法」を参照してください。

UIコード(JavaScript、HTMLおよびCSS)をデバッグするには、デバッグ構成でデバッグ・モードを構成します。このタスクを完了すると、第30.5.2項「iOSプラットフォームでのUIコードのデバッグ方法」の手順に従ってUIコードをデバッグできます。

30.5.1 iOSプラットフォームでのJavaコードのデバッグ方法

OEPEを使用してiOSプラットフォームでMAFアプリケーションのJavaコードをデバッグするには、第30.3項「コードをデバッグするためのOEPEおよびMAFアプリケーションの構成」で説明されているデバッグ手順を実行します。

30.5.2 iOSプラットフォームでのUIコードのデバッグ方法

iOS プラットフォームで作業している場合、Safari ブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariの環境設定を開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします。

「Develop」メニューが有効になったら、「iPhone Simulator」または「iPad Simulator」を選択し(図30-3および図30-4を参照)、デバッグするUIWebViewを選択します(図30-5を参照)。

注意:
「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。

featureContentDelay追加ビルド引数を使用して、アプリケーションの最初のページがロードされる前に、カスタムJavaScriptからのログ・メッセージおよびエラーを記録します。この引数は、WebViewにコンテンツが移入されるまでの遅延を指定します。追加ビルド引数-featureContentDelayを20に設定します。

図30-7 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ

図30-8 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ

図30-9 Safariブラウザの「Develop」メニューを使用したUIWebViewの選択

図30-10 リモートWebインスペクタ

図30-11 実行時にリモートWebインスペクタによって解析されたAMXページ

図30-11および図30-12に、Safariブラウザでのブレークポイントを使用したJavaScriptのデバッグを示します。

図30-12 SafariブラウザでのJavaScriptのデバッグ

図30-13 実行時にデバッグされたAMXページ

30.6 MAFアプリケーションでのロギングの使用および構成

MAFアプリケーションの場合、サポートされるすべてのプラットフォームでロギングを有効にするには、JavaScript (第30.6.2項「JavaScriptのロギングの使用方法」を参照)および埋込みコード(第30.6.3項「埋込みロギングの使用方法」)で、単一ファイルへのログ出力を含む単一構成を使用します。このログ出力には、System.out.printlnおよびSystem.err.println文によって生成された出力が含まれます。

デフォルトのMAFのロギング・プロセスは、次のとおりです。

- アプリケーションの起動時、ロギングが開始されます。

- アプリケーションの以前の実行で生成された既存のログ・ファイルが削除され、現在の実行の内容のみが使用可能になります。

- アプリケーションをiOSデバイス・シミュレータ上で実行している場合、すべてのログ出力は通常、開発用コンピュータのApplication/Utilitiesディレクトリを通じてアクセスできるコンソールに送信されます。ただし、開発用コンピュータでMac OS 10.8.nを実行している場合、Javaロギング出力へのアクセスに使用できるファイルは、出力のリダイレクションに伴って生成された直後に、その名前と場所が通知されるファイルのみです。このファイルについてありえる場所の1つは、/Users/<userid>/Library/Application Support/iPhone Simulator/6.0/Applications/<AppID>/Documents/logs/application.logです。
iOSデバイス上でアプリケーションを実行している場合、コンソール出力は、アプリケーションのDocuments/logsディレクトリにあるapplication.logファイルにリダイレクトされます。

Androidでは、出力は、アプリケーションと同じ名前のテキスト・ファイルにフォワードされます。出力ファイルの場所は/sdcardです。この場所が存在していないか、読取り専用として構成されている場合、ログ出力は、アプリケーションの書込み可能データ・ディレクトリに再ルーティングされます。

- logging.propertiesファイルは、自動的に作成され、アプリケーション・ファイル・システムの<assembly project>/META-INFの場所に配置されます(第30.6項「MAFアプリケーションでのロギングの使用および構成」を参照)。このファイルでは、すべてのロガーでcom.sun.util.logging.ConsoleHandlerおよびSimpleFormatterを使用することが定義され、ログ・レベルがSEVEREに設定されます。このファイルを編集して、別のロギング動作を指定できます(第30.6.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 Mobile Application Framework Java APIリファレンスを参照してください。

iOSデバイス上でアプリケーションを実行している場合、コンソール出力は、アプリケーションのDocuments/logsディレクトリにあるapplication.logファイルにリダイレクトされます。iOSデバイスでは、このディレクトリに次のようにアクセスできます。

1. 「Xcode」→「Devices」とナビゲートします。

2. 「Installed Apps」セクションのリストからアプリケーションを選択します。

3. 歯車のアイコンをクリックします。

4. ダウンロードされたコンテナを選択します。

5. ダウンロードされた*.xcappdataファイルを右クリックして、「Show Package Contents」を選択します。

6. 「AppData」→「Documents」→「Logs」を開きます。

7. ダウンロードされた*.xcappdataファイルを右クリックして、「Show Package Contents」を選択します。

Androidでは、出力は、アプリケーションと同じ名前のテキスト・ファイルにフォワードされます。出力ファイルの場所は/sdcardです。この場所が存在していないか、読取り専用として構成されている場合、ログ出力は、アプリケーションの書込み可能データ・ディレクトリに再ルーティングされます。ログ・ファイルの内容は、AndroidのLogcatユーティリティ(http://developer.android.com/tools/debugging/debugging-log.htmlを参照)でレプリケートされます。OEPEを使用してMAFアプリケーションをAndroidデバイスまたはエミュレータにデプロイする場合は、OEPEでLogcatからログ出力が表示されます。

iOSおよびAndroidの両方で、デプロイメントの直後に、ログ出力がOEPEのログ・ウィンドウに表示されます。MAFアプリケーションのビルド、デプロイおよび起動に実行/デバッグ構成を使用する場合は、ツールバーにある「終了」ボタンで、ログのリダイレクトを実行するプロセスとともにMAFアプリケーションを終了します。

- logging.propertiesファイルは自動的に作成され、アセンブリ・プロジェクトのMETA-INFディレクトリ内に配置されます(この場所は、アプリケーション・ファイル・システム内の<application_name>/META-INFの場所に対応しています)。このファイルでは、すべてのログ出力でjava.util.logging.ConsoleHandlerおよびSimpleFormatterを使用することが定義され、ログ・レベルがSEVEREに設定されます。このファイルを編集して、別のロギング動作を指定できます(第30.6.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);

oracle.adfmf.util.logging.Traceクラスのメソッドを使用することもできます。

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

30.6.1 プロパティ・ファイルを使用したロギングの構成方法

次の例は、ロギングの構成で使用するlogging.propertiesファイルを示しています。

# default - all loggers to use the ConsoleHandler
.handlers=com.sun.util.logging.ConsoleHandler
# default - all loggers to use the SimpleFormatter
.formatter=com.sun.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レベルで出力の詳細度を上げると、アプリケーションのパフォーマンスに悪影響を及ぼすことに留意してください。

デバイスでアプリケーションを動作させているときに、OEPEには、iOSコンソールと、各デバイス(エミュレータを含む)ごとにAndroid用の追加コンソールという2つのコンソールがあります。両方のタイプのコンソールは、OEPEコンソールへの出力をフィルタ処理できる2つの追加logging.propertiesファイル・プロパティを使用して、ロギングおよび標準出力をストリーム化できます。

oepe.console.filter.android=<some string>
oepe.sonsole.filter.ios=<some string>

コンソールのメニュー・バーの選択したコンソールの表示ボタンを使用すると、あるコンソールから別のコンソールへ切り替えることができます。使用可能なコンソールを切り替えるには、をクリックします。あるいは、第30.6.1項「コンソールの選択」に示すように、ボタンの横の下向き矢印をクリックして、リストから選択します。

図30-14 コンソールの選択

logging.propertiesファイルで定義されているロガーは、oracle.adfmf.util.Utilityクラスから取得されるロガーと一致します(第30.6項「MAFアプリケーションでのロギングの使用および構成」を参照)。ロギング・レベルも一致します。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.6.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 Platform Security Servicesによるアプリケーションの保護』を参照してください。

30.6.3 埋込みロギングの使用方法

埋込みロギングでは、次の例に示されているとおり、com.sun.util.logging.Loggerを使用します。EmbeddedClassは、プロジェクトで定義されているJavaクラスを表しています。

import com.sun.util.logging.Level;
import com.sun.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.6.4 iOSプラットフォームでのデバッグおよびロギングにXcodeを使用する方法

MAFプロジェクトの操作にXcodeを使用することは、OEPEを使用した次回のデプロイメント中に一部またはすべての変更を失う可能性があるため推奨されませんが、例外的な状況ではこれを使用できます。

始める前に:

アプリケーションをOEPEからiOSシミュレータにデプロイします。

生成されたプロジェクトを直接Xcodeで開く手順は次のとおりです。

1. workspace_directory\deploy\デプロイメント・プロファイル名\temporary_xcode_project\に移動します。

2. Oracle_ADFmc_Container_Template.xcodeprojというXcodeプロジェクトを開きます。

Xcodeを使用してMAFアプリケーションをデバッグしている場合、IDE内(OEPEコンソールまたはXcodeコンソール)ではJavaの出力を表示できません。この出力は、ファイルにリダイレクトされます(第30.6項「MAFアプリケーションでのロギングの使用および構成」を参照)。アプリケーションのスキーマに次の引数を追加すると、この動作を無効にし、iOSデバイスまたはシミュレータ上でデバッグを実行するときに、XcodeからJava、JavaScriptおよびObjective-Cのログ出力にリアルタイムでアクセスできるようになります。

-consoleRedirect=FALSE

30.6.5 アプリケーション・ログへのアクセス方法

次のAPIを使用すると、アプリケーション・ログ情報にアクセスできます。

- oracle.adfmf.framework.api.PerfMon

- oracle.adfmf.framework.api.LogEntry

- oracle.adfmf.util.HOTS

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

30.6.6 ロギングを無効にする方法

ロギング出力がアプリケーション・ログ・ファイルに転送されないように設定できます(この場合、ログ・ファイルは、空白のままになるか、まったく作成されません)。ロギングが無効になると、トレース文はアプリケーション・ログから失われ、stderrおよびstdoutに転送された出力は、すべてnullの場所またはエンド・ユーザーがアクセスできない別の場所にリダイレクトされます。

すべてのロギングを無効にするには、次のようにアプリケーションのadf-config.xmlファイルでdisableLoggingプロパティをtrueに設定します。

<adf-property name="disableLogging" value="true"/>

デフォルトでは、MAFアプリケーションのロギングは有効で、disableLoggingプロパティはfalseに設定されています。

adf-config.xmlファイルの詳細は、付録C「MAFアプリケーションとプロジェクト・ファイルの概要」を参照してください。

30.7 MAFアプリケーションのパフォーマンスの測定

MAFは、ユーザーによるMAFアプリケーションのパフォーマンスのモニターおよび測定を支援します。たとえば、アプリケーションで次のイベントの実行にかかる時間を測定できます。

- ボタンにより起動されたアクションの完了

- ページのロード

- RESTコールがレスポンスを返す

また、MAFアプリケーションでモニターする操作の実行時間の平均および標準偏差を示す統計を出力できます。

パフォーマンスの測定は、アプリケーションのlogging.propertiesファイルで次のパフォーマンス・ロガーのロギング・レベルを構成することによって有効にします。次の例でロガーに割り当てられる値は、説明用の値です。使用可能なすべての値の説明は、表30-1を参照してください。

oracle.adfmf.amx.useParentHandlers=false
oracle.adfmf.amx.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.amx.level=SEVERE

# used to control what monitors are captured in the list of monitors
oracle.maf.performance.monitor.captured.level = FINEST

# used to control what monitors are reported in the dumpStatistics
oracle.maf.performance.monitor.reported.useParentHandlers=false
oracle.maf.performance.monitor.reported.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.maf.performance.monitor.reported.level = FINEST

# used to control what monitor observations (start/stop times) are logged.
oracle.maf.performance.monitor.observations.reported=false
oracle.maf.performance.monitor.observations.reported.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.maf.performance.monitor.observations.reported.level = FINEST

パフォーマンス測定が完了したら、MAFにより、アプリケーションのパフォーマンスの測定中に収集されたデータを確認できます。次の例は、MAFにより、パフォーマンスのモニター後に生成される出力の抜粋を示しています。この例では、モニターによって5件のProcess AMX eventが検出され、実行時間の平均は1435.5ミリ秒、標準偏差は1990.567…でした。

INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics]
PERFMON-JAVA STATS: Monitor 'com.company.WorkBetter.**Perf_Monitor**.Springboard.Container.Process AMX event' description:
'Time to process event'  observations: 5  mean: 1435.4 standard deviation: 1990.5674567821106

表30-1に、logging.propertiesファイルで設定できる、使用可能なパフォーマンス・モニター・レベルを示します。

表30-1 パフォーマンス・モニター・レベル

レベル

説明

Level.INFO

これは最もおおまかなモニター・レベルです。イベントおよびアクションがモニターされます。このレベルを使用すると、たとえば、ページのロードやエンド・ユーザー・アクションの実行(ボタンのクリックなど)をモニターできます。このモニター・レベルを使用した場合、パフォーマンスへの影響は最小限になります。

Level.FINE

このレベルは、次のカテゴリに分けられる、より多くのパフォーマンス・インジケータをモニターします。

- JavaScriptおよびレンダリング(システム・レベル)

- ビジネス・ロジックの処理(アプリケーション・レベル)

- フレームワークの処理(システム・レベル)

- 外部データ・アクセス

- RESTコール(システム・レベル)

- データベース・アクセス(システム・レベル)

このモニター・レベルを使用するとアプリケーションのパフォーマンスに影響するため、デフォルトでは有効にしないでください。アプリケーションを再構築または調整することを目的として、コードの実行状況に関するインサイトを取得する場合に、このレベルの使用を検討してください。

Level.FINER

AMXページでのノードの処理、データ変更イベントまたはEL式の実行時間といった重大なパフォーマンスの問題をモニターする場合に使用します。

Level.FINEST

アプリケーションのパフォーマンスをデバッグする場合に、このモニター・レベルを使用します。

logging.properitesで指定したモニター・レベルは、アプリケーションを初めて起動するときに有効になります。

注意:
MAFでは、oracle.adfmf.framework.apiパッケージのPerfMonクラスで、パフォーマンス・モニター・レベルを実行時に変更できる多くのsetPerformanceMonitorメソッドを提供しています。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

logging.propertiesファイルでのモニター・レベルの指定に加え、パフォーマンス・データを収集するモニターをアプリケーションに追加することもできます。MAFでは、Javaクラスoracle.adfmf.performance.Monitor (モニター)を使用してパフォーマンス・データを収集します。モニターは、開始および停止でき、監視を追加できるストップ・ウォッチです。監視を追加すると、モニターを使用して特定の測定の標準偏差などを把握できます。各モニターに、一意のIDとオプションの説明があります。

モニターでは、イベントの継続時間やイベントの発生回数を測定するために使用できるいくつかのaddObservation()メソッドが公開されています。継続時間を測定する場合は、イベントの前にモニターを開始します。イベントが発生したら、モニターからaddObservation()メソッドを呼び出します。これによりモニターが停止します。継続時間は、start()メソッドからaddObservation()メソッドまでの時間です。停止されなかったモニターは再開できます。開始していないモニターは停止できません。そのようなモニターを停止しようとすると、エラーが記録されます。

イベントの発生回数を測定するモニターは、開始または停止する必要はありません。次の例に示すように、モニターを停止しないaddObservation(double duration)メソッドを使用します。このモニターは、パフォーマンスを測定しているアプリケーションでのJSONシリアライズの発生回数を計測します。durationパラメータは、モニターが最後に監視を追加してからの時間を示します。

次の例は、イベントの継続時間を測定するモニターの作成方法を示しています。この例では、このモニターによって生成される統計情報のサンプルも示しています。

import oracle.adfmf.performance.Monitor;
....

public void measurePerformance()
{
Monitor monitor = null;

try
{
//// Check that the appropriate monitor level is set before you create the monitor
if (Utility.PerformanceMonitorCaptured.isLoggable(Level.INFO))
{
monitor = MonitorFactory.getInstance().getMonitor("REST call", Level.INFO, "REST call timing");
monitor.start();
}

//
// Perform your custom logic here:
//
}
finally
{
if (monitor != null)
{
monitor.addObservation();
}
}
}

public void countCalls()
{
Monitor monitor = null;

try
{
if (Utility.PerformanceMonitorCaptured.isLoggable(Level.FINE))
{
monitor = MonitorFactory.getInstance().getMonitor("Call count", Level.FINE, "Count number of calls");
monitor.start();
}

//
// Perform your custom logic here:
//
}
finally
{
if (monitor != null)
{
monitor.addObservation(1);
}
}
}

アプリケーションでパフォーマンス・データを収集するモニターを作成するには、データを収集するためのパフォーマンス・モニター取得レベルを有効にするようにlogging.propertiesファイルを構成します。前述の例では、アプリケーションのlogging.propertiesファイルに次のエントリが含まれていない場合、MAFはモニターのパフォーマンス・データを収集しません。

# used to control what monitors are captured in the list of monitorsoracle.maf.performance.monitor.captured.level = FINEST

モニター(oracle.adfmf.performance.Monitor)の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

モニターに加え、MAFではoracle.adfmf.performance.Story (ストーリ)も提供されます。ストーリを使用すると、パフォーマンス・データの収集を開始および終了できます。ストーリのパフォーマンス・データの収集が終了すると、ストーリの開始時に割り当てたストーリIDを使用して収集されたパフォーマンス・データの階層ビューがMAFに表示されます。階層ビューには、ストーリ中に実行されたイベントの個別のタイミング測定が示されます。さらに、ストーリの終了時に、MAFによってシステムの状態(HOTS)チェックポイントが実行されます。このHOTSチェックポイントの一環として、ストーリ中に収集されたすべてのモニター・データの標準偏差が計算されるため、個別のストーリ・イベントが統計的にどのように測定されているかに関するインサイトを得ることができます。その後、すべてのモニター・データがMonitorFactoryからクリアされます。

注意:
oracle.adfmf.util.HOTS.checkpoint()メソッドを呼び出すことで、ストーリとは関係なく、HOTSチェックポイントを実行できます。これにより、JVMにより使用された合計メモリー、空きメモリー、使用済メモリー(合計から空きメモリーを引いたもの)およびアクティブな機能の数といったアプリケーションの情報が判別されます。checkpoint()によって返されるデータのサンプルを次に示します。

HOTS.memory.used (N/A) count: 1.0335056E7
HOTS.memory.free (N/A) count: 1.365112E7
HOTS.memory.total (N/A) count: 2.3986176E7
HOTS.memory.max (N/A) count: 4.9152E7
HOTS.threads.active (N/A) count: 20.0
HOTS.features.active (N/A) count: 6.0

次の例は、ストーリID (**Perf_Monitor**)でストーリを開始し、ストーリを停止するメソッドを公開するマネージドBeanを示しています。このストーリは、パフォーマンスを測定するアプリケーションのUIのボタンから開始および終了できます。たとえば、ページのロードを測定する場合は、そのページに移動する前にストーリを開始するためのUIボタンと、ページがロードされたらストーリを終了する別のボタンを公開します。

package mobile;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.performance.Story;

public class PerfBean
{
public PerfBean()
{
super();
}
public void startStory(ActionEvent ae)
{
Story.startStory("**Perf_Monitor**");
}

public void endStory(ActionEvent ae)
{
Story.endStory();
}

}

logging.propertiesファイルで指定したパフォーマンス・モニター・レベルによって、ストーリによって取得されるデータの量が決定されます。つまり、logging.propertiesファイルのoracle.maf.performance.monitor.reported.level = FINESTエントリは、INFOエントリよりも詳細なストーリを生成します。ストーリが終了すると、ストーリ中に取得されたすべてのパフォーマンス・データがタイミングに基づいてソートされます。モニターが記録された時間が、測定対象のイベントが実行された時間と異なる場合があるため、このソートによって、JavaScriptイベントに対応するモニターの監視が正しい時間で示されます。次にMAFは、次の例に示すように、ソートされたレコードを反復処理し、目的の出力を生成します。

MAFによって、アプリケーションのログ・ファイルにストーリが書き込まれます。AMXページ間を移動するアプリケーションのサンプル出力は、次のようになります。

例30-1 ストーリを使用して生成されたMAFパフォーマンス・モニター・データ

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (Story Book) at 1452728427473

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb2 (Time to process event) at 1452728427416

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop]
PERFMON-JAVA STOP:  **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb2 (Time to process event) took: 14897.0ms
(started at 1452728427416)

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (Time to process event) at 1452728442323

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (Time to process event) took:
586.0ms (started at 1452728442323)

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Container.Load page /view2.amx
(Time to fully render the page) at 1452728442441

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Load page /view2.amx
(Time to fully render the page) took: 468.0ms (started at 1452728442441)

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Embedded.Evaluate method expression #{myBean2.endStory}
(UserSpace) at 1452728450665

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Embedded.Evaluate method expression #{myBean2.endStory}
(UserSpace) took: 78.0ms (started at 1452728450665)

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Container.Process AMX event Page: /view2.amx
event of type action on node cb2 (Time to process event) at 1452728450626

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Process AMX event Page: /view2.amx
event of type action on node cb2 (Time to process event)
took: 85.0ms (started at 1452728450626)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (Story Book)
took: 23367.0ms (started at 1452728427473)

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Container.Process AMX event'
description: 'Time to process event'  observations: 3
mean: 5189.333333333333 standard deviation: 8410.817102596711

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Container.Load page'
description: 'Time to fully render the page'  observations: 1
mean: 468.0 standard deviation: NaN

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Embedded.Evaluate
method expression' description: 'UserSpace'  observations: 1  mean: 78.0
standard deviation: NaN

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Embedded.Story'
description: 'Story Book'  observations: 1  mean: 23367.0 standard deviation: NaN

1452728427473  0001.0001 [0000] Start: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (INFO)
1452728442323    0002.0002 [0001] Start: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (INFO)

1452728442441      0003.0003 [0002] Start: **Perf_Monitor**.Navigation.Container.Load page /view2.amx (INFO)
1452728442909      0003.0003 [0002] Stop: **Perf_Monitor**.Navigation.Container.Load page /view2.amx
(took = 468.0) started at 1452728442441 (INFO)

1452728442909    0002.0002 [0001] Stop: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (took = 586.0)
started at 1452728442323 (INFO)

1452728450626    0004.0002 [0001] Start: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view2.amx event of type action on node cb2 (INFO)

1452728450665      0005.0003 [0004] Start: **Perf_Monitor**.Navigation.Embedded.Evaluate
method expression #{myBean2.endStory} (INFO)

1452728450711    0004.0002 [0001] Stop: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view2.amx event of type action on node cb2 (took = 85.0)
started at 1452728450626 (INFO)

1452728450743      0005.0003 [0004] Stop: **Perf_Monitor**.Navigation.Embedded.Evaluate method
expression #{myBean2.endStory} (took = 78.0)
started at 1452728450665 (INFO)

1452728450840  0001.0001 [0000] Stop: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor**
(took = 23367.0) started at 1452728427473 (INFO)

30.8 Oracle Mobile Cloud Serviceへの診断情報の送信

REST WebサービスにアクセスするMAFアプリケーションは、RestServiceAdapterを使用してこれらのサービスにアクセスします。アプリケーションがMCSによってホストされているRESTサービスにアクセスする場合、MCS診断を使用してアプリケーションによるそのRESTサービスのコールをモニターまたはデバッグするには、McsRestServiceAdapterを作成して、次の情報をMCSに送信します。

- モバイル診断セッションID
この属性は、特定のデバイスにアプリケーション・セッションをマップします。アプリケーションではこの情報を、Oracle-Mobile-DIAGNOSTIC-SESSION-ID HTTPリクエスト・ヘッダーを介して送信します。

- モバイル・デバイスID
MCSに送信されたREST APIリクエストを、リクエストを行った物理デバイスに関連付けます。モバイル・アプリケーションではこの情報を、Oracle-Mobile-Device-ID HTTPリクエスト・ヘッダーを介して提供します。

- クライアント・リクエスト時間
アプリケーションがリクエストを送信する直前に、クライアント側で取得されたAPIコールのタイム・スタンプを示します。モバイル・アプリケーションではこの情報を、HTTPリクエスト・ヘッダーのOracle-Mobile-CLIENT-REQUEST-TIME属性を使用して提供します。

次の例は、このタイプのアダプタを使用するMAFアプリケーションがHTTPリクエスト・ヘッダーに挿入する情報のタイプを示しています。

Oracle-Mobile-Diagnostic-Session-ID: 19975
Oracle-Mobile-Device-ID: d09379504b0a3247
Oracle-Mobile-Client-Request-Time: 2016-02-09T09:03:17.777Z

次の例は、McsRestServiceAdapterの作成方法を示しています。

...
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;

...
RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter mcsRestServiceAdapter = factory.createMcsRestServiceAdapter();

30.9 Oracle Mobile Cloud Serviceへの分析情報の送信

MCSでホストされる1つ以上のモバイル・バックエンド(MBE)を持つMAFアプリケーションは、アプリケーションの使用状況に関する分析情報をMCS Analyticsに送信できます。

MAFによってMCSに送信するために生成される分析情報は、アプリケーションのライフサイクルおよびエンド・ユーザーとMAFアプリケーションの対話に関する情報です。MAFでは、分析イベントをMAFフレームワーク・イベントとビジネス・イベントに分類します。アプリケーションのlogging.propertiesファイルでプロパティを構成して、MAFフレームワーク・イベントに応じて取得された情報をMCSに送信します。MAFフレームワーク・イベントの例には、アプリケーションの起動、アクティブ化や機能ナビゲーションなどの機能イベント、ユーザー認証イベントなどがあります。分析情報をMCSに送信するようにアプリケーションを構成している場合、MAFではこれらのイベントをデフォルトで記録します。

次の例は、エンド・ユーザーが保護されたアプリケーション機能(secure-feature-1およびsecure-feature-2)に移動する前に、ログイン・アプリケーション機能(LF1)にリダイレクトされたときに発生するFeatureNavigation MAFフレームワーク・イベントについて、MAFが生成し、MCSに転送するペイロードを示しています。MAFでは、分析情報を送信するように構成されているMAFアプリケーションがアクティブ化されたときに開始するセッション内のすべてのMAFフレームワーク・イベントを記録します。MAFアプリケーションが非アクティブ化されるとセッションが終了します。次の例では、sessionIDプロパティによってセッションが示されています。

MAFアプリケーションをデバッグ・モードでデバイスにデプロイすると、このペイロードがOEPEのログ・ウィンドウに表示されます。

"name":"FeatureNavigation", "properties":{"SourceId":"null","DestinationId":"LF1"}, "type":"custom", "timestamp":"2015-11-06T20:35:27.384Z",
"sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"

"name":"FeatureNavigation", "properties":{"SourceId":"LF1","DestinationId":"secure-feature-1"}, "type":"custom",
"timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"

"name":"FeatureNavigation", "properties":{"SourceId":"secure-feature-1","DestinationId":"secure-feature-2"}, "type":"custom",
"timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"

ビジネス・イベントは、ユーザー(アプリケーション開発者)がアプリケーションで定義するイベントです。ユーザーは、MAFのoracle.maf.api.analytics.AnalyticsUtilitiesで提供されているAPIを使用して、イベントの分析情報を取得します。MAFでは、ApplicationFeaturesデータ・コントロールでデータ・コントロール・メソッド(fireEventListener)も公開しています。このデータ・コントロール・メソッドをAMXページにドラッグ・アンド・ドロップして、定義したイベントをリスニングするようにメソッドを構成できます。これらのAPIを使用して、MAFフレームワーク・イベントからMCSに分析を送信することもできます。

MAFでは、コンテキスト・イベント情報(デバイス・モデル、国、タイムゾーンなど)をMCSまたはその他の希望するリポジトリに送信することもできます。

MCS以外のリポジトリに分析を送信することもできます。

詳細は、次を参照してください。

- 第30.9.1項「Oracle Mobile Cloud Serviceへの分析の転送を構成する方法」

- 第30.9.2項「Oracle Mobile Cloud Serviceにプログラムで分析を送信する方法」

- 第30.9.3項「Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法」

- 第30.9.4項「他のリポジトリに分析を送信する方法」

- 第30.9.5項「分析情報を取得するMAFフレームワーク・イベント」 (MAFが提供するMAFフレームワーク・イベントについて説明しています。)

- 拡張およびカスタマイズできるoracle.maf.api.analyticsパッケージのクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

30.9.1 Oracle Mobile Cloud Serviceへの分析の転送を構成する方法

MAFでは、新しいMAFアプリケーションのlogging.propertiesファイルに、MAFアプリケーションからMCS Analyticsに分析情報を送信するように構成する必要があるプロパティを移入します。

次の例は、新しいMAFアプリケーションの作成時にlogging.propertiesファイルに含まれている、すぐに使用できるエントリを示しています。

# Configure the analytics logger
# Analytics events are logged only if oracle.maf.api.analytics.level=ALL
# Set to OFF or any level other than ALL to disable analytics
oracle.maf.api.analytics.level=ALL
oracle.maf.api.analytics.handlers=oracle.maf.api.analytics.LoggerAnalyticsHandler, oracle.maf.api.analytics.McsAnalyticsHandler
oracle.maf.api.analytics.custom.level=INFO
oracle.maf.api.analytics.LoggerAnalyticsHandler.level=INFO

# Configure MCSHandler
oracle.maf.api.analytics.McsAnalyticsHandler.level=INFO
oracle.maf.api.analytics.McsAnalyticsHandler.connectionId=Mcs_Connection_Id
oracle.maf.api.analytics.McsAnalyticsHandler.batchSize=25
oracle.maf.api.analytics.McsAnalyticsHandler.offlineWrite=false
oracle.maf.api.analytics.McsAnalyticsHandler.recordUsername=false
oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider

前述の例に示したプロパティの中で、connectionIdのみが必須です。表30-2では、オプション・プロパティについて説明しています。connectionIdプロパティでは、MCS MBEへの有効な接続を定義します。アプリケーションのconnection.xmlで定義されているconnectionIdをこのプロパティの値として使用します。有効なconnectionIdを指定しない場合、MAFからMCSにイベントが送信されません。かわりに、MAFでは、デバイスで許可されるイベントの最大数に達するまで、これらのイベントをディスクに追加します。

アプリケーションのconnection.xmlファイルの有効なconnectionIdでは、MBEのID (oracle-mobile-backend-id)およびMAFアプリケーションがMBEに登録されるときに生成されるアプリケーション・キー(oracle-mobile-application-key)が使用されます。MAFは、MCSへの接続を作成するHTTPヘッダーにこれら2つの値を追加します。これらの値は、MAFアプリケーションが分析イベントを送信するMBEと、分析イベントの発生元のアプリケーションを識別します。

注意:
3つすべてのプラットフォーム(Android、iOSおよびユニバーサルWindowsプラットフォーム)について、MCSでMAFアプリケーションをクライアントとして登録する必要はありません。1つのプラットフォームについてMAFアプリケーションを登録し、生成されたアプリケーション・キーをoracle-mobile-application-keyの値として使用します。

MCS MBEへの接続でHTTP基本認証タイプを使用している場合は、oracle/wss_http_token_client_policyを接続に関連付けます。Oauthを使用する接続の場合は、oracle/http_oauth2_token_mobile_client_policyを接続に関連付けます。正しいポリシーを接続に関連付けないと、MAFでMCSに分析イベントがフラッシュされません。セキュリティ・ポリシーを接続に関連付ける方法の詳細は、第15.3項「セキュアなWebサービスへのアクセス」を参照してください。

次の例は、前述のプロパティの値が設定されたアプリケーションのconnections.xmlファイルの抜粋を示しています。

<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="Mcs_Connection_Id" className="oracle.adf.model.connection.url.HttpURLConnection"
adfCredentialStoreKey="McsLoginConn" xmlns="">
...
<RefAddresses>
<XmlRefAddr addrType="Mcs_Connection_Id">
<Contents>
<urlconnection name="Mcs_Connection_Id" url="http://mcs_instance.oracle.com:7201"/>
...
</Reference>
<Reference name="McsLoginConn" className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="McsLoginConn" partial="false" manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://mcs_instance.oracle.com:7201/mobile/platform/users/login"/>
<logout url="http://mcs_instance.oracle.com:7201/mobile/platform/users/logout"/>
<customAuthHeaders>
<header name="oracle-mobile-backend-id" value="0e4a9dfa-046a-4aaa-b8dd-331044ad81f4"/>
<header name="oracle-mobile-application-key" value="be53201a-8674-48d7-96d0-bb02f4cd06c5"/>
</customAuthHeaders>
...
</References>

logging.propertiesファイルで次のオプション・エントリを構成して、説明されている機能を実装します。

表30-2 MAFアプリケーションからの分析の転送を管理するためのオプション・プロパティ

プロパティ

説明

batchSize

MAFアプリケーションが関連付けられているMCSインスタンスにイベントを送信する前に、ローカルに保存されるイベントの数を決定するオプションのプロパティ。イベントはバッチでMCSにアップロードされます。最大バッチ・サイズの制限(65)があります。batchSizeが指定されないか、上限の65を超えている場合は、デフォルトのbatchSizeの25が適用されます。

offlineWrite

イベントのオフライン・バッファリングを有効にするかどうかを決定するオプションのプロパティ。デバイスがオフラインであるか、クライアントがMCSとの接続を確立できないときに、イベントが生成される場合があります。そのようなイベントが失われないようにするには、offlineWriteプロパティを構成します。接続が再確立されると、保存されたこれらのイベントがMAFによってMCSにフラッシュされます。offlineWriteプロパティは、そのようなイベントをディスクにキャッシュして、オフラインの間バッファリングできるようにします。MAFでは、最大250個のイベントがサポートされます。イベントはローリング方式で保存されます。つまり、MAFには最後の250個のイベントが保存されます。このため、常に最新のイベントがオフラインでバッファリングされます。MAFでは、batchSizeに達しているかどうかにかかわらず、アプリケーションが非アクティブ化された場合にもMCSにイベントをフラッシュします。デフォルトでは、offlineWriteは無効になっています。有効にするには、Trueに設定してください。

recordUsername

ユーザー名を取得するかどうかを決定するオプションのプロパティ。Trueに設定すると、ユーザーが保護された機能にログインしたときに、MAFによってユーザー名が取得されます。アプリケーションに保護された機能が含まれていない場合、またはユーザーが保護された機能にログインしていない場合は、ユーザー名はnullのままになります。アプリケーションに保護された機能が複数含まれている場合は、その機能にログインするために使用された資格証明(ユーザー名)に基づいてユーザー名が更新されます。取得されたユーザー名は、コンテキスト・イベントのフィールドの1つとして送信されます。したがって、ユーザー名を取得する予定の場合は、recordUsernameプロパティがTrueで、contextProviderClassNameにコンテキスト・イベントを生成するための有効なクラス名が指定されるようにlogging.propertiesを構成してください。たとえば、oracle.maf.api.analytics.McsAnalyticsHandler.recordUsername=trueと設定します。

contextProviderClassName

オプション。コンテキスト・イベントが生成されたときに、このプロパティの値を指定します。指定する値によって、MCSのコンテキスト・イベントを生成するクラスが決定されます。コンテキスト・イベントには、タイムゾーン・オフセット、地理的位置、デバイス情報などの情報が含まれます。recordUsernameがTrueに設定されている場合は、ユーザー名が含まれることもあります。contextProviderClassNameプロパティは、デフォルトでは無効になっています。次の例は、このプロパティを有効にする方法を示しています。oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider

30.9.2 Oracle Mobile Cloud Serviceにプログラムで分析を送信する方法

MAFでは、MCSにイベントを送信するために使用できるAPIをoracle.maf.api.analytics.AnalyticsUtilitiesで提供しています。

AnalyticsUtilitiesクラスは、次のAPIを提供します。

public static void fireEvent(Level level, String category, String eventName)
// Send an event without a payload

public static void fireEvent(Level level, String category, String eventName, JSONObject payload)
// Send an event with a JSON payload

level:     The logging level of the event. Set to any standard level supported by Java logging.

category:  The category of the event. Set to 'custom' for all events except context,
sessionStart(MAF Framework event) and sessionEnd(MAF Framework event). Set the latter events to 'system'.

eventName: Provide your own event name if you do not use an event provided in the AnalyticsUtilities class.
Throws an exception if null.

payload:   A JSONObject that contains key-value pairs for custom events. The JSONObject must be of type String.
No other data type is supported.

このAPIを使用する前に、MCSに分析を転送するために必要な値でlogging.propertiesファイルを構成します。たとえば、MCSのconnectionIDを指定します。

次の例は、このAPIを使用して、MAFアプリケーションからMCSに分析を送信する方法を示しています。

//  Sending events from your application.

//  The following logs event when there is no payload to register for an event.
AnalyticsUtilities.fireEvent(Level.WARNING, AnalyticsUtilities.CATEGORY_CUSTOM, "EVENT_VIDEO_ACTIONS");

//  The following logs event when there is a JSON payload to send for a custom event.
try
{
JSONObject   payload = new JSONObject();
payload.put("PAYLOAD_VIDEONAME", getFileName());
payload.put("PAYLOAD_ACTION", getAction());
// Creating a custom event 'EVENT_VIDEO_ACTIONS' of level INFO
AnalyticsUtilities.fireEvent(Level.INFO, AnalyticsUtilities.CATEGORY_CUSTOM, "EVENT_VIDEO_ACTIONS" , payload);
}

catch(Throwable t)
{
// log the error
}

ユーザーとの相互作用に基づいて、イベントを取得する異なるログ・レベルを設定できます。たとえば、エンド・ユーザーが再生アクションを実行する場合、前述の例のEVENT_VIDEO_ACTIONSイベントをINFOレベルに設定できます。または、失敗した場合にイベントを取得するには、WARNINGレベルに設定できます。ロギング・レベルはlogging.propertiesファイルで管理します。たとえば、EVENT_VIDEO_ACTIONSイベントのロギングを管理するには、logging.propertiesファイルを次のように構成します。

// Set to  WARNING to log events for the play action. Set to INFO (or a lower level)
// to log events for the play action plus failure events
oracle.maf.api.analytics.custom.EVENT_VIDEO_ACTIONS.level=WARNING

// Disable logging of EVENT_VIDEO_ACTIONS
oracle.maf.api.analytics.custom.EVENT_VIDEO_ACTIONS.level=OFF

30.9.3 Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法

MAFアプリケーションでは、コンテキスト・イベントを取得して、収集された情報をMCSまたはMCS以外のリポジトリに送信できます。

コンテキスト・イベントは、別のコンテキスト・イベントが記録されるまでの、後続のイベントのコンテキストを定義します。イベントは、MAFフレームワーク・イベントから、またはアプリケーションで定義するイベントから記録できます。

表30-3に、MAFアプリケーションからコンテキスト・イベントを転送するJSONオブジェクトのキーと値のペアでMCSが受け入れるキー名を示します。MCSでは、すべてのプロパティが文字列型である必要があります。次の表に示すすべてのプロパティはオプションです。

注意:
MCSでは、緯度および経度の情報が、市区町村、都道府県、国および郵便番号に変換されます。緯度および経度(latitudeおよびlongitude)の情報を指定するか、またはlocality、region、postalCodeおよびcountryを指定し、両方は指定しないでください。

表30-3 コンテキスト・イベント情報をMCSに送信するための有効なキー名

キー名

説明

userName

コンテキスト・イベントが記録されたときに、保護された機能にログインしていたデバイスのユーザー。

timezone

UTCからのデバイスのオフセット(秒)

model

デバイスのモデル名

osName

osVersion

デバイスのオペレーティング・システム名

デバイスのオペレーティング・システムのバージョン

latitude

デバイスのGPS緯度

longitude

デバイスのGPS経度

locality

デバイスの地域

region

デバイスのリージョン

postalCode

デバイスの郵便番号

country

デバイスの国

MAFアプリケーションからMCSにコンテキスト・イベント情報を送信するには、logging.propertiesファイルで次のエントリを構成します。

oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName= oracle.maf.api.analytics.McsContextProvider

logging.propertiesファイルにこのエントリが構成されていると、MAFは、表30-3のコンテキスト・イベント情報をMCSに送信します。MAFアプリケーションからMCSにユーザー名を送信する場合は、logging.propertiesファイルでrecordUsernameをTrueに設定する必要もあります。

定義したフィールドを含むコンテキスト・イベントを生成するには、logging.propertiesファイルで次のエントリを構成します。

oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.demo.CustomContextProvider

ここで、oracle.maf.demo.CustomContextProviderはoracle.maf.api.analytics.ContextProviderを実装するクラスです(例29-2を参照)。生成されるコンテキスト・イベントには、タイムゾーン、キャリアおよびメーカーの情報が含まれます。

例30-2 コンテキスト情報を送信するカスタム・コンテキスト・プロバイダ

package oracle.maf.demo;

import java.util.Date;
import java.util.TimeZone;
import oracle.maf.api.analytics.ContextProvider;
import oracle.adfmf.json.JSONObject;

public class CustomContextProvider
implements ContextProvider
{
public CustomContextProvider()
{
super();
}

public JSONObject generateContext()
{
JSONObject myCustomCtx = new JSONObject();

//
// TimeZone - Mobile device's offset from UTC in seconds
//
Date date = new Date();
int offset = TimeZone.getDefault().getOffset(date.getTime()) / 1000;

try
{
myCustomCtx.put("timezone", new Integer(offset).toString());
myCustomCtx.put("carrier", "AT&T");
myCustomCtx.put("manufacturer", "Apple");
}
catch(Exception ex)
{
ex.printStackTrace();
}

return myCustomCtx;
}
}

30.9.4 他のリポジトリに分析を送信する方法

MAFアプリケーションでは、MCS以外のリポジトリに分析を送信できます。

これを行うには、次の例に示すように、oracle.maf.api.analytics.McsAnalyticsHandlerを拡張するカスタム・クラスを作成して、processEvent()メソッドをオーバーライドします。

package oracle.maf.demo;

import java.io.IOException;
import oracle.adfmf.framework.exception.AdfException;

import oracle.adfmf.json.JSONArray;
import oracle.adfmf.resource.CDCErrorBundle;
import oracle.adfmf.util.ResourceBundleHelper;
import oracle.maf.api.analytics.McsAnalyticsHandler;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;

public class CustomHandler extends McsAnalyticsHandler
{
public CustomHandler()
{
super();
}

//
// Establish the connection to a different repository and flush the events.
//
protected void processEvents() throws AdfException
{
// Extract the events to be flushed
_events = super.getEvents();

RestServiceAdapter restAdapter = RestServiceAdapterFactory.newFactory().createRestServiceAdapter();
restAdapter.clearRequestProperties();

// Get valid connectionId of the repository.
restAdapter.setConnectionName(getConnectionId());
restAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_POST);
restAdapter.addRequestProperty("Content-Type", "application/json");
restAdapter.setRequestURI(_ANOTHER_REPOSITORY_URI);
restAdapter.setGenerateAnalyticsEvents(false);

// make REST call to send events
try
{
String responseMessage = restAdapter.send(_events.toString());
}
catch (IOException ex)
{
throw new AdfException(AdfException.ERROR, ResourceBundleHelper.CDC_ERROR_BUNDLE,
CDCErrorBundle.ERR_ANALYTICS_FLUSH_EVENTS, new Object[] { ex });
}
}

private JSONArray _events = new JSONArray();
private static final String _ANOTHER_REPOSITORY_URI = "_repository_uri";
}

You also need register the custom class in the logging.properties file. For example, to register CustomHandler, configure logging.properties as shown in the following example:

# Configure the analytics logger
oracle.maf.api.analytics.level=ALL
oracle.maf.api.analytics.handlers=oracle.maf.demo.CustomHandler
oracle.maf.api.analytics.custom.level=INFO

# Configure CustomHandler
oracle.maf.demo.CustomHandler.level=INFO
oracle.maf.demo.CustomHandler.connectionId=RepositoryConn
oracle.maf.demo.CustomHandler.batchSize=7
oracle.maf.demo.CustomHandler.offlineWrite=true
oracle.maf.demo.CustomHandler.recordUsername=false
oracle.maf.demo.CustomHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider

30.9.5 分析情報を取得するMAFフレームワーク・イベント

MAFでは、分析情報を取得する様々なMAFフレームワーク・イベントを提供しています。

これらのイベントは2つのカテゴリ(カスタムおよびシステム)にグループ化されます。アプリケーションがこれらのイベントをMCSに送信するようにアプリケーションのlogging.propertiesファイルを構成します。まず、特にMCSのconnectionIDを指定することによって、分析情報の送信を有効にするようにアプリケーションのlogging.propertiesファイルを構成します。次に、送信するイベントを指定します。この後者のタスクには、次の表の情報を使用します。

表30-4に、分析情報をアプリケーションからMCSに送信するためにlogging.propertiesファイルで構成できるMAFフレームワーク・イベント(カスタム・カテゴリ)を示します。各イベントは、OFFに設定するか、そのイベントのロギングが有効になるレベルより高いロギング・レベルに設定することで無効にできます。

表30-4 MAFフレームワーク・イベント(カスタム・カテゴリ)

イベント名

ロギング・レベル

ロギングの有効化または無効化

UpdateAuthenticationStatus

FINE

oracle.maf.api.analytics.custom.UpdateAuthenticationStatus.level= FINE

oracle.maf.api.analytics.custom.UpdateAuthenticationStatus.level= OFF

FeatureNavigation

INFO

oracle.maf.api.analytics.custom.FeatureNavigation.level=INFO

oracle.maf.api.analytics.custom.FeatureNavigation.level=OFF

Login

INFO

oracle.maf.api.analytics.custom.Login.level=INFO

oracle.maf.api.analytics.custom.Login.level=OFF

LoginCallback

FINER

oracle.maf.api.analytics.custom.LoginCallback.level=FINER

oracle.maf.api.analytics.custom.LoginCallback.level=OFF

Timer

警告および期限切れ操作の場合はINFO

調整操作の場合はFINE

oracle.maf.api.analytics.custom.Timer.level=INFO

oracle.maf.api.analytics.custom.Timer.level=FINE

oracle.maf.api.analytics.custom.Timer.level=OFF

Logout

INFO

oracle.maf.api.analytics.custom.Logout.level=INFO

oracle.maf.api.analytics.custom.Logout.level=OFF

LogoutCallback

FINER

oracle.maf.api.analytics.custom.LogoutCallback.level=FINER

oracle.maf.api.analytics.custom.LogoutCallback.level=OFF

PageNavigation

INFO

oracle.maf.api.analytics.custom.PageNavigation.level=INFO

oracle.maf.api.analytics.custom.PageNavigation.level=OFF

FeatureTransition

INFO

oracle.maf.api.analytics.custom.FeatureTransition.level=INFO

oracle.maf.api.analytics.custom.FeatureTransition.level=OFF

ApplicationTransition

INFO

oracle.maf.api.analytics.custom.ApplicationTransition.level=INFO

oracle.maf.api.analytics.custom.ApplicationTransition.level=OFF

RESTWebService

INFO

oracle.maf.api.analytics.custom.RESTWebService.level=INFO

oracle.maf.api.analytics.custom.RESTWebService.level=OFF

表30-5に、分析情報をアプリケーションからMCSに送信するためにlogging.propertiesファイルで構成できるMAFフレームワーク・イベント(システム・カテゴリ)を示します。

表30-5 MAFフレームワーク・イベント(システム・カテゴリ)

イベント名

ロギング・レベル

説明

sessionStart

INFO

このイベント名は、MAFアプリケーションがアクティブ化され、分析情報の記録を開始したときに開始されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。

sessionEnd

INFO

このイベント名は、MAFアプリケーションが非アクティブ化され、分析情報の記録を停止したときに停止されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。

MAFは、batchSizeに達したかどうかに関係なく、sessionEndが発生するとイベントをMCSにフラッシュします。

context

INFO

コンテキスト・イベント情報を送信します(たとえば、デバイスのタイムゾーン、キャリアおよびメーカー)。次のようにこのイベントを有効にします。

oracle.maf.api.analytics.McsAnalyticsHandler
.contextProviderClassName=oracle.maf.api
.analytics.McsContextProvider

コンテキスト・イベント情報の詳細は、第30.9.3項「Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法」を参照してください。

A MAFアプリケーションのトラブルシューティング

この付録では、モバイル・アプリケーションの様々な側面の問題、およびそれらの問題の診断方法と解決方法について説明します。

この付録の構成は、次のとおりです。

- 第A.1項「iOSシミュレータでの入力コンポーネントの問題」

- 第A.2項「コード署名が原因でデプロイメントが失敗する」

A.1 iOSシミュレータでの入力コンポーネントの問題

問題:

iOSシミュレータにデプロイされたモバイル・アプリケーションでは、マウスを使用してあるフィールドから別のフィールドに移動すると、<amx:inputText>コンポーネント・フィールドに入力されたテキストが、その別のフィールドに入力されたテキストの先頭に添付されます。たとえば、名、ミドル・ネーム、姓を入力するテキスト・フィールドがあるページで、名のフィールドにJohnと入力し、ミドル・ネームのフィールドをクリックしてPと入力すると、テキストはJohnPと表示されます。同様に、姓のフィールドをクリックしてSmithと入力すると、そのフィールドのテキストは、図A-1に示されているように、JohnPSmithと表示されます。

図A-1 以降の<amx:inputText>フィールドにおけるテキスト値の連結

注意:
この動作は、iOSシミュレータとWebページでのみ発生し、実際のデバイスでは発生ません。

解決方法:

シミュレータで、入力テキスト・フィールド間を移動する場合は、マウスではなく、キーボードを使用します。

A.2 コード署名が原因でデプロイメントが失敗する

問題:

iOS開発環境では、コード署名エラーにより、モバイル・アプリケーションのデプロイメントが失敗する場合があります。

解決方法:

確実にモバイル・アプリケーションに署名するには、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』を参照してください。

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/";</script>
<script type="text/javascript" src="/~maf.device~/www/js/base.js"></script>
...

base.jsのインクルード時に仮想パス/~maf.device~/を使用して、ブラウザがリクエストをリモート・サーバーではなくMAFリソースに対するものとして識別できるようにすることをお薦めします。このアプローチはリモートとローカルの両方のHTMLページで機能するので、(提供元にかかわらず) base.jsをHTML機能にインクルードする方法として最適です。詳細は、第20.2項「リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化」を参照してください。

ヒント:
www/jsディレクトリにアクセス(およびその場所を確認)するには、まずMAFアプリケーションをデプロイした後、deployディレクトリに移動する必要があります。www/jsディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリはtemporary_xcode_projectディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(.apk)ファイルのassetsディレクトリ内にあります。第4.5項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」も参照してください。

注意:
設計時にはパスが存在しないので、JavaScriptインクルードは、OEPEによってソース・エディタ内ではエラーとして赤い波型の下線で強調表示されます。このパスは実行時に解決されます。

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 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>) {
...
}

JavaScriptのコールは非同期なので、結果を戻すことができません。そのかわりに、関数の実行の完了時にコールバック・メカニズムが必要になります。成功および失敗のコールバックのシグネチャは、どちらもfunction(request, response)です。ここでrequest引数は実際のリクエストのJSON表現です。responseはメソッドから戻されたもののJSON表現です(successコールバック関数の場合)。failedコールバック関数の場合は、スローされた例外のJSON表現になります。

注意:
JavaScriptコールを呼び出して、スタックの深度や競合状態などの問題を回避するには、その前にコールバック関数を呼び出す必要があります。

B.2.2 コンテナ・ユーティリティAPIの使用方法

コンテナ・ユーティリティAPIでは、次のメソッドが提供されます。

- getApplicationInformation: モバイル・アプリケーションのメタデータを取得します。

- 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メソッドの戻り値が格納され、この戻り値は、アプリケーション・レベルのメタデータを格納するApplicationInformationオブジェクトです。ここには、アプリケーション名、ベンダー、バージョンおよびアプリケーション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がデフォルトのアプリケーション機能を表示するようにリクエストします。デフォルトのアプリケーション機能とは、モバイル・アプリケーションの起動時に表示されるアプリケーション機能です。

注意:
認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

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では、このメソッドは次のようにコールされます。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

次の例に示すように、このメソッドのパラメータはアプリケーション機能の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側のモデルをリセットして、モバイル・アプリケーションがロードされ、最初にアプリケーション機能が表示されたときのようにユーザー・インタフェース・プレゼンテーションを再起動します。

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 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 invokeJavaMethodに渡されるパラメータ

パラメータ

説明

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メソッドによってコールされます(次の2番目の例を参照)。アプリケーションには、この関数をコールするアクション・リスナーで構成されるコマンド・ボタンが含まれているので、ユーザーがこのボタンをクリックすると、次のようなアラートが表示されます。

- APP ALERT 0

- APP ALERT 1

- APP ALERT 2

(function()
{
if (!window.application) window.application = {};

application.testFunction = function()
{
var args = arguments;

alert("APP ALERT " + args.length + " ");
return "application.testFunction - passed";
};
})();

次の例の疑似コードは、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 Mobile Application Framework Java APIリファレンスおよびAPIDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

B.2.20 sendEmail

詳細は、第13.10.3項「sendEmailメソッドを使用して電子メールを可能にする方法」を参照してください。

B.2.21 sendSMS

詳細は、第13.10.2項「SendSMSメソッドを使用してテキスト・メッセージングを可能にする方法」を参照してください。

B.2.22 アプリケーション・アイコンへのバッジ設定

AdfmfContainerUtilitiesクラスには、モバイル・アプリケーション・アイコンにバッジ番号を設定したり、その番号を取得するためのメソッドが含まれています。表B-4に、これらのメソッドを示します。

表B-4 アイコンへのバッジ設定メソッド

メソッド

説明

パラメータ

getApplicationIconBadgeNumber

モバイル・アプリケーションのアイコンに現在設定されているバッジの値を取得します。アプリケーション・アイコンにバッジが設定されていない場合は、ゼロ(0)を戻します。

なし

setApplicationIconBadgeNumber

モバイル・アプリケーションのアイコンにバッジ番号を設定します。

バッジの値(int badge)。

注意:
アプリケーション・アイコンへのバッジ設定は、Androidではサポートされていません。

B.3 getDirectoryPathRootメソッドを使用したファイル・アクセス

AdfmfJavaUtilties APIには、getDirectoryPathRootメソッドが含まれています。このメソッドはJavaレイヤーからのみコールでき、iOSシステム、AndroidシステムおよびWindowsシステム上のファイルへのアクセスを可能にします。次の例に示すように、このメソッドを使用すると、デバイス上の一時ファイル、アプリケーション・ファイル(iOSシステム上)およびキャッシュ・ディレクトリの場所に、TemporaryDirectory、ApplicationDirectoryおよびDeviceOnlyDirectory定数を使用してそれぞれアクセスできます。DeviceOnlyDirectoryの場所に格納されたファイルは、デバイスの接続時には同期されません。

注意:
アプリケーションからディレクトリまたはファイルへのアクセスを試みる前に、それらのディレクトリまたはファイルが存在することを確認してください。

oracle.adfmf.framework.api.AdfmfJavaUtilitiesの詳細は、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

AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory);
}

B.3.1 プラットフォームに依存しないダウンロード場所へのアクセス

ファイル記憶域の要件は、プラットフォームによって異なります。Androidプラットフォームでは、アプリケーションからファイルへのアクセス元となる単一の場所が規定されていません。そのかわり、アプリケーションでは、権限が付与された任意の場所にファイルを書き込むことができます。一方、iOSプラットフォームでは通常、アプリケーション・ディレクトリ内にファイルを格納します。Windowsでは、アプリケーションは外部ファイルやディレクトリ・ファイルにはアクセスしません。ファイルはアプリケーション・パッケージ内に格納されています。このような違いにより、ApplicationDirectoryをgetDirectoryPathRootメソッドに渡すと、AndroidデバイスではなくiOSデバイスまたはWindowsデバイス上で実行されているアプリケーションの添付ファイルを表示するために必要なファイルの場所を戻すことができます。アプリケーションをiOSデバイスとAndroidデバイスの両方で実行する場合、プラットフォーム固有のコードを記述してこれらの場所を取得するのではなく、getDirectoryPathRootメソッドにDownloadDirectoryを渡すことによって、外部記憶域の場所とデフォルトの添付ファイル・ディレクトリへのパスを両方戻すことができます。この定数(列挙型)には、DeviceManager APIのdisplayFileメソッドで使用する場所が反映されます。このメソッドでは、プラットフォーム固有の機能を使用してこれらの場所を検索することによって、添付ファイルを表示します。

Androidの場合、DownloadDirectoryでは、Environment.getExternalStorageDirectoryメソッド(SDカードなどのAndroid用外部記憶域ディレクトリを取得する)によって戻されるパスを参照します。iOSデバイス上で実行されるモバイル・アプリケーションの場合は、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アプリケーションを作成する際に、OEPEによって生成されるファイルについて説明します。

この付録の内容は次のとおりです。

- 第C.1項「MAFアプリケーションとプロジェクト・ファイルの概要」

- 第C.2項「アセンブリ・レベルのリソースについて」

- 第C.3項「アプリケーション・プロジェクト・リソースについて」

- 第C.4項「ビュー・プロジェクト・リソースについて」

C.1 MAFアプリケーションとプロジェクト・ファイルの概要

デフォルトでは、次のようになります。OEPEによって、次の3つのプロジェクトを含むMAFアプリケーションが作成されます。

- 最上位レベルまたはアセンブリ・プロジェクト。これは、アプリケーションのパッケージ化およびデプロイメントに必要なすべてのアーティファクトを保持します。また、以前のバージョンのMAFからアプリケーションを移行する場合、アセンブリ・プロジェクトは、プロジェクトで使用されるMAFランタイムのバージョンを追跡します。

- アプリケーション・プロジェクト、applicationApplication。

- ビュー・コントローラタイプ・プロジェクト、applicationView。これには、ソース・フォルダ(src)およびViewContentフォルダが含まれます。

データ・コントロールは次のとおりです。

- デバイス機能データ・コントール。このデータ・コントロールによってApache Cordova Java APIが抽象化され、MAF AMXとして実装されているアプリケーション機能は、デバイスに埋め込まれている様々なサービスにアクセスできるようになります。

- スプリングボード・ページを構築できるアプリケーション機能データ・コントール。

これらのプロジェクトの詳細は、第C.2項「アセンブリ・レベルのリソースについて」、第C.3項「アプリケーション・プロジェクト・リソースについて」および第C.4項「ビュー・プロジェクト・リソースについて」を参照してください。

これらのプロジェクト内には、MAFアプリケーションとアプリケーション機能の構成用ファイル、またはMAFアプリケーションをターゲット・プラットフォームにデプロイする際にそのアプリケーションで必要になるファイルもOEPEによって生成されます。ほとんどの場合、生成されたファイルを直接操作することはありません。かわりに、MAFアプリケーション・エディタ、MAF機能エディタ、データ・コントロール・マネージャなどのエディタを使用します。

C.2 アセンブリ・レベルのリソースについて

OEPEは、アセンブリ・プロジェクトにMAFアプリケーション用のファイルを生成します。これらのファイル(表C-1を参照)には、MAFプリケーションのメタデータを記述するための構成ファイルが含まれています。図C-1に示すように、「プロジェクト・エクスプローラ」ペインからこれらのファイルにアクセスします。

図C-1 モバイル・アプリケーション・アーティファクト

(デフォルトの名前applicationで生成された)アセンブリ・プロジェクトには、アプリケーション全体のリソースが格納されており、MAFアプリケーションのプレゼンテーション・レイヤーが提供され、ここには、モバイル・デバイスでのアプリケーションの表示方法を構成するためのメタデータ・ファイルが含まれています。このプロジェクトはMAFアプリケーションのセキュリティを指定するもので、アプリケーションのログイン・ページ、およびアプリケーション全体のリソースを含めることができます。アプリケーション・コントローラ・プロジェクトは、本質的には、アプリケーション機能とそのコンテンツを定義するビュー・コントローラ・プロジェクトのコンシューマです。

MAFアプリケーション・エディタを使用して、アプリケーションレベルのアーティファクト(つまりmaf-application.xml)を編集します。これを使用して、MAFアプリケーション自体(その名前など)、アプリケーション・ライフサイクル・リスナー(LifeCycleListenerImpl.java)、および埋込みアプリケーション機能のためのログイン・サーバー接続の構成を行います。

表C-1 アセンブリ・プロジェクトを介してアクセスされるモバイル・アプリケーションレベルのアーティファクト

アーティファクト

ファイルの場所

説明

maf-application.xml

assembly project directory\adf\Meta-INF

次に例を示します。

workspace\application name\adf\META-INF\maf-application.xml

MAFアプリケーションを定義できる、スタブXMLアプリケーションの識別子ファイル。ADF Fusion Webアプリケーションのアプリケーション識別子と同様に、これによって、アプリケーションのコンテンツ、ナビゲーション動作およびユーザー認証要件を定義できます。

このファイルは、MAFアプリケーション・エディタを使用して編集します。

maf-config.xml

assembly project directory\adf\Meta-INF

次に例を示します。

workspace\application name\adf\META-INF\maf-config.xml

MAFアプリケーションに使用されるデフォルト・スキンの構成に使用されます。

アプリケーション・イメージ

assembly project directory\res\android

assembly project directory\res\ios

次に例を示します。

workspace\application name\res\ios\Default.png

iOSおよびAndroidアプリケーションのデプロイメントに必要とされる一連のイメージ。ここには、アプリケーション・アイコンやスプラッシュ画面のPNGイメージも含まれます。iPhoneなどのiOSデバイスへのデプロイメントでは、様々なサイズのイメージ・セットが必要です。

プロジェクトで提供されるデフォルトのiOSイメージは次のとおりです。

- デバイスが縦方向と横方向の両方の場合に使用されるイメージ。

- Retinaディスプレイに使用されるイメージ(つまり、icon.pngおよびicon@2x.png)

- iPadイメージ(icon-72.png)

これらのイメージをオーバーライドするには、第27.3.1.5項「Androidアプリケーションへのカスタム・イメージの追加方法」を参照してください。

cacerts

assembly project directory\lib\security

次に例を示します。

workspace\application name\security\cacerts

システム全体のキーストアであるcacerts証明書ファイル。JVM 1.4に対するCA証明書を識別します。このファイルは、Java keytoolユーティリティを使用して更新できます。第29.11項「認証に双方向SSLを有効にするためのMAFアプリケーションの構成」で説明するように、keytoolを使用してカスタム証明書ファイルを作成できます。証明書ファイルは、すべてSecurityディレクトリ内に配置する必要があります。

logging.properties

assembly project directory\META-INF

次に例を示します。

workspace\application name\META-INF\logging.properties

ロギング・レベルやロギング・コンソールなど、アプリケーション・エラーのロギングを設定できます。詳細は、第30.6項「MAFアプリケーションでのロギングの使用および構成」を参照してください。

maf.properties

assembly project directoryMETA-INF

次に例を示します。

workspace\application name\META-INF\maf.properties

Java仮想マシン、JVM 1.4の構成ファイル。このファイルを使用して、アプリケーションの起動やヒープ領域の割当て、JavaおよびJavaScriptのデバッグ・オプションを構成します。詳細は、第30.3.2項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

adf-config.xml

assembly project directory\adf\META-INF

次に例を示します。

workspace\application\adf\META-INF\adf-config.xml

構成サービス・パラメータなど、アプリケーション・レベルの設定の構成に使用します。第14章「MAFアプリケーションで使用されるエンド・ポイントの構成」も参照してください。

connections.xml

assembly project directory\adf\META-INF

次に例を示します。

workspace\application\adf\META-INF\connections.xml

MAFアプリケーションで定義されているすべての接続のリポジトリ。

sync-config.xml

assembly project directory\.adf\META-INF

次に例を示します。

workspace\application\META-INF\sync-config.xml

REST Webサービスから返されたデータのオフライン・キャッシュ用の構成ファイル。キャッシュはパフォーマンスを上げることでユーザーの操作性を向上させるだけでなく、ユーザーがオフライン・モードで作業しているときにデータの読取りや表示を行えるようにします。

C.3 アプリケーション・プロジェクト・リソースについて

アプリケーション・プロジェクト自体(デフォルト名applicationApplicationで生成)の中に、OEPEにより表C-2に示される次のアーティファクトが作成されます。

図C-2 アプリケーション・プロジェクト

MAF機能エディタを使用して、アプリケーションレベルのアーティファクト(つまりmaf-feature.xml)を編集します。これによって、MAFアプリケーションを構成するアプリケーション機能を記述します。

表C-2 アプリケーション・プロジェクトのアーティファクト

アーティファクト

ファイルの場所

説明

LifeCycleListenerImpl.java

application project directory\src\application

次に例を示します。

workspace\application project\src\application\LifeCycleListenerImpl.java

MAFアプリケーションのデフォルトのアプリケーション・ライフサイクル・リスナー(ALCL)。

maf-skins.xml

application project directory\src\META-INF

次に例を示します。

workspace\application project\src\META-INF\maf-skins.xml

使用可能なスキンを定義するもので、新しいスキンを定義することもできます。

詳細は、第7章「MAFアプリケーションのスキニング」を参照してください。

adfm.xml

application project directory \adfmsrc\META-INF

次に例を示します。

workspace\application project\adfmsrc\META-INF\adfm.xml

.cpx、.dcx、.jpxおよび.xcfgファイル(メタデータのレジストリ)のパス(および相対パス)を維持します。

DataControls.dcx

application project directory\adfmsrc\application

次に例を示します。

workspace\application project\adfmsrc\application\DataControls.dcx

データ・コントロールのレジストリ。デバイスのサービスを活用するDeviceFeaturesデータ・コントロールの使用方法の詳細は、第13章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」を参照してください。埋込みアプリケーション機能をコールするSpringboardページを作成できるようにするApplicationFeaturesデータ・コントロールの詳細は、第4.6項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

C.4 ビュー・プロジェクト・リソースについて

ビュー・プロジェクト(図C-3に示すとおり、デフォルト名applicationViewで生成)には、アプリケーション機能のリソースが格納されます。第C.2項「アセンブリ・レベルのリソースについて」で説明したアプリケーション・プロジェクトとは異なり、ビュー・プロジェクトのメタデータ・ファイルでは、アプリケーション機能レベルのリソース、特に、実行時にモバイル・デバイスでMAFアプリケーション自体のスプリングボード内またはそのナビゲーション・バーに表示できるように1つのMAFアプリケーションに集約可能な様々なアプリケーション機能を記述します。さらに、アプリケーション機能のメタデータ・ファイルでは、アプリケーション機能をHTMLページかMAF AMXページのどちらで構成するのかが記述されます。また、ビュー・コントローラ・プロジェクトには、これらのアプリケーション・ページと、アプリケーション機能レベルのリソース(MAFアプリケーション用に定義された、Springboardおよびナビゲーション・バー上のアプリケーション機能を表すアイコン・イメージなど)を含めることができます。

ヒント:
ビュー・コントローラ・プロジェクト内には、アプリケーション機能に固有のコードを格納します。アプリケーション・コントローラ・プロジェクトは、(特に別々のビュー・コントローラ・プロジェクト内で定義されている)アプリケーション機能間で共有されるコードの場所として使用してください。

ビュー・コントローラ・プロジェクトは、アプリケーション・コントローラ・プロジェクトと分離して、別のモバイル・アプリケーションで再使用できるように、アーカイブ・ファイルとしてデプロイできます(第8.1項「機能アーカイブ・ファイルの概要」を参照)。また、稀なケースとして、アプリケーション・コントローラ・プロジェクトが複数のビュー・コントローラ・プロジェクトを使用することもできます。

注意:
MAFビュー・コントローラ・プロジェクトを別のMAFビュー・コントローラ・プロジェクトの依存性またはMAFアプリケーション・コントローラ・プロジェクトの依存性として追加すると、MAFアプリケーションをデプロイできなくなります。

図C-3 ビュー・プロジェクト

これらのリソースには、maf-feature.xmlと呼ばれるアプリケーション機能の構成ファイルが含まれ、これはMAF機能エディタで編集します。

表C-3 ビュー・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

maf-feature.xml

view project directory\src\META_INF

次に例を示します。

workspace\application View\src\META-INF

アプリケーション機能を定義できるようにする、スタブXMLの識別子ファイル。

Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールの説明に従ってモバイル・プリファレンスを構成した後、デフォルトのデプロイメント構成設定を使用してこのアプリケーションをデプロイできます。詳細は、第27章「MAFアプリケーションのデプロイ」を参照してください。

アプリケーション固有のコンテンツ

view project directory\public_html

次に例を示します。

workspace\application View\public_html

maf-feature.xmlで定義されたアプリケーション機能は、public_htmlディレクトリに表示されます。モバイル・コンテンツには、MAF AMXページ、CSSファイルおよびタスク・フローを含めることができます。アプリケーション機能に追加するカスタム・イメージは、このディレクトリ内に配置する必要があります。詳細は、第5.4項「外部リソースの選択に関する必知事項」を参照してください。

D デプロイメントでのプリファレンスの変換

この付録では、デプロイメント時、MAFがどのようにユーザー・プリファレンスを変換するかについて説明します。

このドキュメントには次の項が含まれます。

- 第D.1項「プリファレンスのネーミング・パターン」

- 第D.2項「Android用のプリファレンスの変換」

- 第D.3項「iOS用のプリファレンスの変換」

- 第D.4項「Windows用のプリファレンスの変換」

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ドキュメントに変換します。

- preferences.xml

- arrays.xml

- strings.xml

D.2.1 maf_preferences.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 プリファレンス属性のマッピング

Preferences.xmlファイルには、strings.xmlおよび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の名前空間で定義されているカスタムのテンプレート属性であり、preferences.xmlにadfmf:<attributeName>というフォームで存在している必要があります。それ以外の属性は、Androidの名前空間の一部であり、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}を持つ、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アプリケーション・エディタとMAF機能エディタでは、次の場合は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 プリファレンス画面ルート要素

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値が存在しない場合は、maf-application.xmlファイルに含まれているアプリケーションの表示名およびアプリケーションIDからこの値が取得されます。デプロイメントJavaコードは、この値をXSLドキュメントにパラメータとして渡します。

次の例は、サンプル・アプリケーションのPrefDemoでmaf-feature.xmlファイルに含まれるMAFプリファレンスを示しています(付録E「サンプルの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 arrays.xml

arrays.xmlファイルは、preferences.xmlファイルから参照されるリスト・プリファレンスの名前と値を列挙する文字列配列要素で構成されています。maf-application.xmlおよびmaf-feature.xmlファイルに含まれている各<preferenceList>要素は、2つの文字列配列要素(1つは名前用、もう1つは値用)に変換されます。たとえば、次の例に記載されているMAFのpreferenceList定義は、次の2番目の例に示されているように、arrays.xmlファイル内の<string-array name="feature.oracle.hello.prefGroup.MyList___entry_values">および<string-array name="feature.oracle.hello.prefGroup.MyList___entries">に変換されます。

<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf">

<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>
...

次の例は、arrays.xmlファイルに含まれている、<preferenceList>要素から変換された文字列配列要素のペアを示しています。

<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>

次の例は、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 Strings.xml

次の例で示されているstrings.xmlファイルは、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/adf/mf">
<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設定アプリケーションで必要なプリファレンス・リスト(strict the Display to a)ファイル表現に変換します。

表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ファイルに基づくXMLを示しています。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen"
label="Oracle Way Cool Mobile App">
<adfmf:preferenceGroup id="SubPage01"
label="Child Page">
</adfmf:preferenceGroup>
</adfmf:preferences>

D.4 Windows用のプリファレンスの変換

Windowsプラットフォーム用のプリファレンスに関する情報を提供します。

Windowsプラットフォームの場合、MAFは、maf-feature.xmlおよびmaf-application.xmlメタデータから、単一のmaf-preferences.jsonファイルと複数のmaf-preferences.resjsonファイルを、アプリケーションでサポートされているロケールごとに1つずつ生成します。MAFはJSONファイルを使用し、アプリケーションのWindows設定としてそのファイルを保存し、設定画面の表示にも使用します。

E サンプルのMAFアプリケーション

この付録では、サンプルのMAFアプリケーションについて説明します。

この付録には次の項が含まれます:

- 第E.1項「サンプルのMAFアプリケーションの概要」

E.1 サンプルのMAFアプリケーションの概要

モバイル・アプリケーション・フレームワークには、基本アーティファクトの作成、SMSおよび電子メールなどのデバイス・ネイティブな機能などへのアクセス、またはローカルのSQLiteデータベースでのCRUD(作成、読取り、更新および削除)操作の実行などの、様々な開発シナリオを提供するサンプル・アプリケーションのセットが付属されています。これらのサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

これらのアプリケーションについては、すべて表E-1で説明されています。別に記載されている場合を除き、これらのアプリケーションは、開発環境の構成後にシミュレータにデプロイできます(Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールを参照)。

ヒント:
モバイル・アプリケーションの作成方法について理解するには、これらのアプリケーションを表E-1に記載されている順番で確認してください。

表E-1 サンプルのMAFアプリケーション

アプリケーション名

説明

サンプル・アプリケーションの実行に必要な追加のリソース

HelloWorld

フレームワークの基本的な構造を示す、MAFのhello worldアプリケーション。この基本アプリケーションには、ローカルのHTMLファイルによって実装される単一のアプリケーション機能があります。このアプリケーションを使用して、開発環境が、アプリケーションのコンパイルとデプロイのために正しく設定されていることを確認します。第2.3.2項「MAFアプリケーション作成時の処理」も参照してください。

APIDemo

このアプリケーションは、MAF AMXページ内からカスタムJavaScriptメソッドを呼び出す方法を示します。DeviceFeaturesデータ・コントロールに含まれていないApache Cordova APIを呼び出すには、このアプローチを使用します。また、このアプローチを使用してカスタムのJavaScriptメソッドをアプリケーションに追加し、それらを呼び出すこともできます。このアプリケーションは、JavaScriptメソッドからのJavaへのコールバックも示します。詳細は、第B.2項「MAFコンテナ・ユーティリティAPI」を参照してください。

BarcodeDemo

このアプリケーションは、バッキングBeanから起動する埋込みJavaScriptからBarcodeScannerプラグインをコールすることで、Cordovaプラグインの活用方法を示しています。詳細は、第9章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

BeaconDemo

このアプリケーションは、Cordovaプラグインを使用してiBeaconを検出する方法を示しています。

CompGallery

このアプリケーションは、これらのコンポーネントのすべてを示すことによって、MAF AMX UIコンポーネントを紹介する役割を果たします。このアプリケーションを使用して、これらのコンポーネントの属性を変更し、その変更の効果をリアルタイムで確認できます。変更を行うたびにアプリケーションを再コンパイルして再デプロイする必要はありません。一般的な情報については、第12章「MAF AMXユーザー・インタフェースの作成」を参照してください。

ConfigServiceDemo

このアプリケーションは、Configuration Serviceを使用して、MAFアプリケーションで使用されているエンド・ポイントを変更する方法を示しています。connections.xml内のエンド・ポイントの変更は、デバイス上のアプリケーションに伝播され、アプリケーションは再初期化されて新しいエンド・ポイントを消費します。詳細は、第14.1項「エンド・ポイントの構成の概要」を参照してください。

CRUDDemo

このアプリケーションは、SQLiteデータベースおよびJava beanデータ・コントロールを使用してCRUD操作を構築する方法を示します。このアプリケーションでは従業員のリストが表示され、ユーザーが従業員の作成、更新および削除を行うことができます。このアプリケーションは、ローカルのSQLiteデータベースを使用してそのデータを格納し、CRUD操作中のデータを永続化します。さらに、このアプリケーションでは、作成操作および削除操作を使用してアイテムをコレクションに追加したり、コレクションから削除する方法も示しています。詳細は、第19章「MAF AMXでのローカル・データベースの使用方法」を参照してください。

DeviceDemo

このアプリケーションは、DeviceFeaturesデータ・コントロールを使用して、地理的位置、電子メール、SMS、コンタクト先などのデバイス機能を公開する方法、およびデバイスにそのプロパティを問い合せる方法を示します。この機能は、DeviceFeaturesデータ・コントロールからdisplayFileメソッドを使用して、.doc、.ppt、.xlsおよび.pngなどの様々なタイプのファイルを表示する方法を示します。詳細は、第13.10項「DeviceFeaturesデータ・コントロールの使用方法」および第13.10.9項「ファイルの表示を有効にするためのdisplayFileメソッドの使用方法」を参照してください。

SMSおよび一部のデバイス・プロパティはiOSシミュレータまたはAndroidエミュレータ上で機能しないため、このアプリケーションを実際のデバイス上で実行することも必要です。

ExpandCollapseComponent

このアプリケーションは、任意のタイプのAMXコンポーネント用のコンテナとして機能でき、展開、縮小機能を提供するカスタムコンポーネントの作成方法を示します。

詳細は、「js」フォルダの下のcardview.jsファイルを確認してください。このJavaScriptファイルには、コンポーネントのUIをレンダリングするメソッド('expandcollapse.prototype.render')が含まれます。さらに、カスタム・コンポーネントの子コンポーネントをレンダリングする方法を示すメソッドも含まれます。詳細は、第18.1項「カスタムUIコンポーネントの作成の概要」を参照してください。

FakeBeacon

このアプリケーションは、Cordovaプラグインを使用してiBeaconを装う方法を示しています。このアプリケーションは、テスト用の実際のiBeaconがない場合に、BeaconDemoアプリケーションと組み合せて使用できます

FragmentDemo

このアプリケーションは、フラグメントを使用してテンプレートとして使用できる再利用可能なアーティファクトを定義する方法を示します。これは、各機能(1つはタブレット用、1つは電話用)に対して複数のコンテンツ・タイプを所有し、毎回リストまたはフォームをコーディングしなくても済むようにフラグメントを使用する方法を示します。

GestureDemo

このアプリケーションは、MAFアプリケーションにおいてジェスチャーをどのように実装および使用できるかを示します。第12.4項「ジェスチャーの有効化」も参照してください。

Java8Example

このアプリケーションは、AMXアプリケーションでのJava 8言語機能の使用方法を示します。

LayoutDemo

このアプリケーションは、様々なページ・レイアウト(フロー、ストレッチまたは分割ビュー)を取り上げて、多様なMAF AMX UIの構成と手法を示します。

LifecycleEvents

このアプリケーションは、アプリケーション自体およびその埋込みアプリケーション機能にライフサイクル・イベント・ハンドラを実装します。このアプリケーションは、アプリケーションがライフサイクルの特定の時点で自身のロジックを実行できるようにするためのコードを挿入する場所を示します。第10.1項「MAFアプリケーションのライフサイクル・リスナーの概要」も参照してください。

iOSの場合、LifecycleEventsサンプル・アプリケーションは、/Applications/Utilities/Console.appにあるコンソール・アプリケーションにデータを記録します。

LocalNotificationDemo

このアプリケーションは、MAFアプリケーション内でローカル通知のスケジュールおよび受信を行う方法を示します。第24章「通知の有効化と使用方法」も参照してください。

MAFMCSUtility

この例は、MAFMCSUtilityViewプロジェクトのMAF MCSユーティリティのソース・コードを示しています。

MAFMCSUtilitySample

このアプリケーションは、MAF MCSユーティリティを使用して、Oracle Mobile Cloud Service (MCS)にアクセスする方法を示しています。これはAndroidおよびiOSタブレットでの使用に最適化されています。このアプリケーションに付属しているMAF MCSユーティリティjarは、分析、診断、記憶域収集などのMCSコア・サービスをMAF開発者が簡単に使用できるようにするAPIのセットを提供します。ユーティリティ・クラスのソースが参照用として含まれています。

このサンプル・アプリケーションを実行するには、Oracle Mobile Cloud Serviceに接続できるようにOracle MCSサブスクリプションが必要です。Oracle MCSインスタンス内では、少なくとも1人のモバイル・ユーザー、テスト用のモバイル・バックエンド(MBE)、および1つ以上のサンプル記憶域収集を作成し、それらをMBEに割り当てる必要があります。

Navigation

このアプリケーションは、バインドされたタスク・フローやルーターを含む、MAFの様々なナビゲーション技術を示します。第29章「MAFアプリケーションの保護」でも様々なページ遷移を示しています。第11.2項「タスク・フローの作成」も参照してください。

PrefDemo

このアプリケーションは、アプリケーション全体のユーザー設定ページおよびアプリケーション機能固有のユーザー設定ページを示します。一般的な情報については、第21章「ユーザー・プリファレンスの有効化」を参照してください。

PushDemo

このアプリケーションは、Apple Push NotificationサーバーとGoogle Could Messagingサーバーを対象としたプッシュ通知の登録方法と受信方法を示します。詳細は、第24.2項「プッシュ通知の有効化」を参照してください。

RangeChangeDemo

このサンプルは、リスト・ビュー・コンポーネント内の「さらに行をロード」リンクがアクティブ化されるか、リスト・ビューが最後までスクロールされたときに、Javaハンドラ・メソッドを呼び出すことによってrangeChangeListenerを呼び出す方法を示します。また、リスト・ビューによって新しいデータが取得されるたびにrangeChangeListenerが呼び出されることを示します。これは、RangeChangeEventを使用してクライアントにさらにデータをダウンロードできるかどうかを定義する方法を示します。

RESTEasy

この例は、OEPEのRESTサービス・エディタ機能で使用され、RESTサービスを起動するMAFアプリケーションを宣言的に構築します。詳細は、第16章「RESTサービスの使用」を参照してください。

この例を実行するために、テスト用のモックRESTサーバーが提供されます。サーバーのインポートおよび実行方法の詳細は、OEPE_install/plugins/oracle.eclipse.tools.maf.examples.nnn/examples/MockHRReSTServer.zip.README.txtを参照してください。

このように、この例はAndroidエミュレータで実行するように構成されていますが、iOSシミュレータで実行するように簡単に再構成できます。(この違いは、ツールの種類により、ホストマシンのポートがどのように参照されるかによって発生します。実際、あるデバイスは関連するホスト・プロセスではなく、特定のサーバーにアクセスするように常に構成されます。)

AndroidとiOSを切り替えるには、次のいずれかの方法を使用します。「接続」ビュー(デフォルトのMAFパースペクティブの左下)で、RESTEasy/HRRestServiceをダブルクリックし、接続の管理ダイアログのURL (ホストはiOSの場合127.0.0.1、Androidの場合10.0.2.2)を編集します。または、サンプルのRESTEasyプロジェクトで、adf/META-INF/connections.xmlを編集し、該当するurlconnection要素をコメント化/コメント解除します(要素をコメント解除する場合は、1回に1つのみにしてください。両方のコメントを解除すると、予想どおりに機能しなくなる可能性があります。)

SecurityDemo

このアプリケーションは、MAFアプリケーションを保護する方法、認証およびログイン・サーバーを構成する方法、アクセス制御サービスを使用する方法、セキュアなWebサービスにアクセスする方法を示しています。詳細は、第29章「MAFアプリケーションの保護」を参照してください。

このサンプル・アプリケーションは、Oracle Weblogic ServerにデプロイされたACS.earアプリケーションに接続します。

ACS.earをデプロイするには、OEPE-install\plugins\oracle.eclipse.tools.maf.examples.v21_2.1.0.2015nnnnnn\examples\ACS.ear.README.txtの指示に従ってください。

SkinningDemo

このアプリケーションでは、提供されているスタイル・シートをオーバーライドするか、独自のスタイル・シートを使用して拡張することで、アプリケーションにスキンを適用し、固有のルック・アンド・フィールを追加する方法を示します。また、このアプリケーションは、スキンがデバイスのタイプに基づいてMAF AMX UIコンポーネントのスタイルを制御する方法も示します。また、実行時にスキン・ファミリ(初期状態またはカスタム)を変更する機能も示します。第7章「MAFアプリケーションのスキニング」も参照してください。

SlidingWindows

このアプリケーションは、AdfmfSlidingWindowUtilities APIの使用方法を示しています。このAPIを使用すると、画面に複数の機能を同時に表示できます。この例は、AdfmfSlidingWindowUtilities APIを使用してカスタムSpringboardまたはグローバル・ナビゲーション・バーを作成する方法を示しています。

StockTracker

このサンプルは、データ変更イベントがどのようにJavaを使用して、データ変更をユーザー・インタフェースに反映できるかを示します。また、様々なレイアウト・ユースケース、ジェスチャーおよび基本的なモバイル・パターンがあります。このサンプルは、amx:validationGroupコンポーネントでクライアント側の検証を使用する方法も示します。詳細は、ポートフォリオ機能内でeditStock.amxを参照してください。第13.12項「データ変更イベントについて」も参照してください。

URLSchemeDemo

このアプリケーションは、ブラウザのURLリンクまたは電子メールからを起動できるように、アプリケーションのカスタムURLスキームを定義する方法を示します。 第4.10項「MAFアプリケーションでのカスタムURLスキームの使用」も参照してください。

WorkBetter

この人事管理アプリケーションには、「人々」および「組織」の2つの機能が含まれます。「人々」: この機能には、人を検索できる検索コンポーネントが含まれます。これは、カスタム・コンポーネントを作成する機能、および再利用可能なレイアウトをフラグメントとして構築し、それらを異なる機能間で使用する方法も示します。これは、様々なDVT視覚化コンポーネントを使用してパフォーマンス、補償、時系列関連の情報を表示する方法を示します。「組織」: 「人々」の機能と同様に、この機能は再利用可能なレイアウトをフラグメントとして構築し、それらを異なる機能間で使用する方法を示します。また、異なるフォーム・ファクタのビューを作成し、それらを構成する方法も示します。

このアプリケーションは、様々なUI技術および使用可能なコンポーネントのエンドツーエンドのデモです。多様なレイアウト・パターンを表示し、共通およびより複雑なコンポーネントに対する様々な使用方法を示します。これは、競合アプリケーションを例示するのではなく、ユーザー・インタフェースに焦点を置いています。データモデルまたはWebサービスなどについては他のサンプルを参照してください。

オラクルの法律上の注意点について

コピーライトについて

Copyright © 1994-2016, Oracle and/or its affiliates.All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

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 Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

アルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のアルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが非公開の試作版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のベータ・トライアル契約のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle PartnerNetwork Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティについて

オラクルのアクセシビリティについての詳細情報は、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を参照してください。