Oracle Enterprise Pack for Eclipse

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

リリース2.1.2

E64870-01(原本部品番号:E63067-01)

2015年5月

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

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

E64870-01

Copyright (C) 2014, 2015 Oracle and/or its affiliates.All rights reserved.

原本著者: Catherine Pickersgill、Liza Rekadze、Walter Egan、Ralph Gordon、Cindy Hall

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

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

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

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およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

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

1 Oracle Mobile Application Frameworkの概要

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

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

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

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

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

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

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

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

- 2.2.1 モバイル・アプリケーション用のワークスペースの作成方法

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

- 2.2.2.1 アセンブリ・レベルのリソースについて

- 2.2.2.2 ビュー・プロジェクト・リソースについて

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

- 2.2.3 MAFアプリケーションおよびアプリケーション機能の編集に関する必知事項

- 2.2.4 MAFアプリケーション・エディタおよびMAF機能エディタについて

- 2.2.5 MAF AMXページの作成

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

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

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

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

- 3.1 モバイル・アプリケーションの定義の概要

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

- 3.1.2 モバイル機能エディタについて

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

- 3.3 アプリケーション機能の基本情報の定義方法

- 3.4 モバイル・アプリケーションのIDおよび表示動作の設定方法

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

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

- 4.2 モバイル・アプリケーション内のアプリケーション機能の構成

- 4.2.1 モバイル・アプリケーションのコンテンツの指定方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 7.2 リソース・バンドルでの文字列の入力方法

- 7.3 リソース・バンドル追加時の処理

- 7.4 MAF AMXコンポーネントの文字列のローカライズ方法

- 7.5 MAF AMXコンポーネントのプロジェクト・レベルのリソース・バンドルを作成する場合の処理

- 7.6 イメージ・ファイルのローカライズに関する必知事項

- 7.7 リソース・バンドル・ファイルの編集方法

- 7.8 iOSアプリケーションのXLIFFファイルに関する必知事項

- 7.9 iOSアプリケーションの国際化

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

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

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

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

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

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

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

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

- 8.6 スキンをバージョニングした場合の処理

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

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

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

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

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

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

- 9.1 機能アーカイブ・ファイルの使用

- 9.1.1 アプリケーション・ライブラリとしてのFARのインポート

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

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

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

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

- 10.1 MAFアプリケーションでのプラグイン統合の概要

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

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

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

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

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

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

- 10.4 Cordovaレジストリからのプラグインの使用

- 10.4.1 Cordovaレジストリからプラグインを使用する方法

- 10.4.2 Cordovaレジストリからプラグインを使用する場合の処理

- 10.5 チーム環境での外部プラグインの使用

- 10.5.1 チーム環境で外部プラグインを使用する方法

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

- 10.6.1 登録された機能のプラグインを指定する方法

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

- 10.8 FARからのプラグインのインポート

- 10.8.1 FARからプラグインをインポートする方法

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

- 11.1 MAFアプリケーションでのライフサイクル・イベント・リスナーの使用について

- 11.1.1 モバイル・アプリケーションのイベント

- 11.1.2 モバイル・アプリケーション・イベントのタイミング

- 11.1.3 アクティブ化および非アクティブ化メソッドを使用したアプリケーションの状態の保存

- 11.2 アプリケーション機能ライフサイクル・リスナー・クラスについて

- 11.2.1 アプリケーション機能のライフサイクルでイベントをアクティブ化および非アクティブ化するタイミング

- 11.2.2 スライディング・ウィンドウの有効化

12 MAF AMXページの作成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 12.3 ビューの作成

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

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

- 12.3.1.2 MAF AMXページの作成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 13.3.5 ボタンの使用方法

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

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

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

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

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

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

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

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

- 13.3.6 リンクの使用方法

- 13.3.7 イメージの表示方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 13.3.20 反復の有効化方法

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

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

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

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

- 13.3.24 日時の変換方法

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

- 13.3.25 数値の変換方法

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

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

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

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

- 13.5 データ視覚化の指定

- 13.5.1 面グラフの作成方法

- 13.5.2 棒グラフの作成方法

- 13.5.3 横棒グラフの作成方法

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

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

- 13.5.6 線グラフの作成方法

- 13.5.7 円グラフの作成方法

- 13.5.8 散布図の作成方法

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

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

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

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

- 13.5.13 LEDゲージの作成方法

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

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

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

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

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

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

- 13.5.17.2 凡例の定義

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

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

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

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

- 13.5.17.7 しきい値の定義

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

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

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

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

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

- 13.5.19.3 分離領域の定義

- 13.5.19.4 初期ズームの有効化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 13.6.2 組込みおよびインライン・スタイル・クラスの使用方法

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

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

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

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

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

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

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

- 13.9 入力の検証

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

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

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

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

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

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

- 14.3 EL式の作成

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

- 14.3.2 EL式の作成方法

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

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

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

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

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

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

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

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

- 14.3.6 ELイベントについて

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

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

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

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

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

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

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

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

- 14.5.2.2 パレット

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 14.11 属性の検証

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

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

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

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

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

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

- 15.2.3 Webサービスのデータ制御におけるSOAPヘッダーのカスタマイズ方法

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

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

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

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

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

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

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

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

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

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

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 認証を使用する方法

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

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

- 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.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アプリケーションで使用する方法

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

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

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

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

- 17.4 URLの構造について

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

- 17.6 構成サービスAPIの移行

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

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

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

- 18.1.1.1 同時実行性

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

- 18.1.1.3 データ型

- 18.1.1.4 外部キー

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

- 18.1.1.6 認証

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

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

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

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

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

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

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

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

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

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

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

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

- 19.2.1 静的APIの使用方法

- 19.2.2 AmxEventクラスの使用方法

- 19.2.3 TypeHandlerの使用方法

- 19.2.4 AmxNodeの使用方法

- 19.2.5 AmxTagの使用方法

- 19.2.6 VisitContextの使用方法

- 19.2.7 AmxAttributeChangeの使用方法

- 19.2.8 AmxDescendentChangesの使用方法

- 19.2.9 AmxCollectionChangeの使用方法

- 19.2.10 AmxNodeChangeResultの使用方法

- 19.2.11 AmxNodeStatesの使用方法

- 19.2.12 AmxNodeUpdateArgumentsの使用方法

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

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

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

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

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

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

- 20.1.4 ホワイトリストの作成方法(ドメインの制限方法)

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

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

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

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

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

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

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

- 20.5 リモート・コンテンツの作成について

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 Oracle Cloud上のデータへのアクセス

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

- 24.1.1 Oracle Cloudの認証方法

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

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

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

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

- 25.1 プッシュ通知の概要

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

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

- 25.3 ローカル通知の管理

- 25.3.1 Javaを使用してローカル通知を管理する方法

- 25.3.2 JavaScriptを使用してローカル通知を管理する方法

- 25.3.3 DeviceFeaturesデータ・コントロールを使用してローカル通知を管理する方法

- 25.3.4 ローカル通知を処理する方法

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

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

- 26.1 MAFでのエラー処理について

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

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

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

27 モバイル・アプリケーションのデプロイ

- 27.1 モバイル・アプリケーションのデプロイメントの概要

- 27.1.1 OEPEによるアプリケーションのデプロイ方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 27.6.1 OMSSを使用する前の必知事項

- 27.6.2 コンテナ化を使用してコンテンツを暗号化する方法

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

- 28.1 サーバー側の不十分な制御

- 28.2 デバイスでの安全でないデータ格納

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

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

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

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

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

- 28.5 弱い認可および認証

- 28.6 不適切な暗号化

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

- 28.7.1 ホワイトリストを使用したXSSに対するアプリケーション保護

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

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

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

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

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

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

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

- 29.1 モバイル・アプリケーション・フレームワークのセキュリティについて

- 29.1.1 制約に基づくアクセス制御について

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

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

- 29.4 MAF接続の構成

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

- 29.4.2 基本認証の構成方法

- 29.4.3 Web SSO認証の構成方法

- 29.4.4 Oracle MobileおよびSocial Identity Managementを使用した認証の構成方法

- 29.4.5 OAuth認証の構成方法

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

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

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

- 29.4.9 REST Webサービス・コールへのCookieの挿入を可能にする場合の処理

- 29.4.10 CookieをREST Webサービス・コールに追加することに関する必知事項

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

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

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

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

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

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

- 29.4.17 マルチテナント接続を定義する場合の処理

- 29.4.18 モバイル・アプリケーション作成時の処理

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

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

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

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

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

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

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

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

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

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

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

- 29.8 SSLのサポート

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

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

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

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

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

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

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

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

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

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

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

- 30.3.6 デバッグ・モードの構成方法

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

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

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

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

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

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

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

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

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

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

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 getFeatures

- B.2.6 gotoFeature

- B.2.7 getFeatureByName

- B.2.8 getFeatureById

- B.2.9 resetFeature

- B.2.10 gotoSpringboard

- B.2.11 hideNavigationBar

- B.2.12 showNavigationBar

- B.2.13 invokeMethod

- B.2.14 invokeContainerJavaScriptFunction

- B.2.15 Application Icon Badging

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

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

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

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

- C.2 アセンブリ・レベルのリソースについて

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

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

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

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

- D.2.1 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用のプリファレンスの変換

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

F XMLの解析

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

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

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

はじめに

『Oracle Mobile Application Framework (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、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

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

項

変更内容

付録G「サンプルのMAFアプリケーション」

サンプル・アプリケーションの変更を反映するように項が改訂されました(SecurityDemoの使用に関する情報を含む)。

1 Oracle Mobile Application Frameworkの概要

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

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

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

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

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

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

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

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

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

図1-1 モバイル・アプリケーションのSpringboard

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- SOAPおよびRESTサービス: リモートでホストされているSOAPおよびRESTをベースとしたWebサービスです。これらのサービスは、Javaレイヤーを介してアクセスされます。

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

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

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

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

- 要件の収集

- 設計

- 開発

- デプロイ

- テストおよびデバッグ

- 保護

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

- 再デプロイ

- 再テストとデバッグ

- 公開

MAFアプリケーションの構築の手順は、次のようなものです。

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

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

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

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

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

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

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

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

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

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

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

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

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

- SSLをサポートするWebサービス・ポリシーのセット。

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

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

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

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

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

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

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

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

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

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

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

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

開発環境を設定したら(Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールを参照)、「ファイル」→「新」→「MAFサンプル」を選択してMAFサンプル・アプリケーションを調査できます。

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

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

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

- スキニングの使用方法

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

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

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

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

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

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

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

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

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

OEPEのOracle Mobile Application Framework (MAF)拡張機能には、MAFアプリケーションの開発、テストおよびデプロイメントを容易にする様々なエディタやウィザードが用意されています。図2-1は、OEPEのMAFアプリケーション・エディタにWorkBetterサンプル・アプリケーションを表示したもので、ここにはMAFアプリケーションの開発に使用される様々なアイテムが含まれます。

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

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

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

図2-1 OEPEで開かれたMAFアプリケーション

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

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

2.2.1 モバイル・アプリケーション用のワークスペースの作成方法

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

モバイル・アプリケーションを作成するには、次の手順を実行します。

1. 「ファイル」→「新」を選択し、次に「MAFアプリケーション」を選択します。MAFアプリケーション・ウィザードが表示されます(図2-2を参照)。

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

2. 「アプリケーション表示名」フィールドに、MobileApplicationなどのアプリケーションの名前を入力します。これは、MAFアプリケーションの最上位構造になります。これは、アセンブリ・プロジェクトとも呼ばれ、アプリケーションのパッケージ化およびデプロイメントに必要なすべてのアーティファクトを保持します。「次へ」をクリックします。

図2-3 アプリケーション名およびプロジェクト名の指定

3. 図2-3に示される、ウィザードの次のページには、作成するMAFアプリケーションの「アプリケーション・プロジェクト名」および「ビュー・プロジェクト名」が表示されます。OEPEは、デフォルトで最初のページに入力された名前を使用しますが、プロジェクトにそれぞれApplicationおよびViewを追加します。
たとえば、EmployeeというMAFアプリケーションを作成した場合、ウィザードではEmployeeApplicationおよびEmployeeViewという名前が作成されます。名前は必要に応じて変更できます。プロジェクトのデフォルトでよい場合には、「次へ」をクリックします。

図2-4 デプロイメント・ターゲットの選択

4. 図2-4に示されているMAFアプリケーション・ウィザードのデプロイメント・ターゲットの構成ページでは、開発するMAFアプリケーションに使用するデプロイメント・ターゲットを選択できます。このページに表示されるターゲットは、環境を設定したときに指定したものです。詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールのモバイル・アプリケーション・フレームワークの構成に関する項を参照してください。
デフォルトでは、定義した各SDKに対して1つのデプロイメント・ターゲットがウィザードにより作成されます。使用するターゲットを選択します。

5. 「終了」をクリックして、MAFアプリケーションとそのプロジェクトの作成を完了します。
MAFパースペクティブへ変更するかどうかを確認する、図2-5のようなダイアログが表示されます。「はい」をクリックします。

図2-5 MAFパースペクティブへの変更

ヒント:
前述の手順に従ってMAFアプリケーションを作成する他に、HelloWorldサンプル・アプリケーション(「ファイル」→「新」→「MAFサンプル」を選択し、HelloWorldを選択して特定)を開いて、アプリケーション作成ウィザードの完了後に、OEPEが生成したアーティファクトを表示できます。

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

MAFアプリケーションの作成時、OEPEでは、プロジェクト・エクスプローラからアクセスする次のアーティファクトが作成されます(図2-1を参照)。

- 最上位レベルまたはアセンブリ・プロジェクト。これは、アプリケーションのパッケージ化およびデプロイメントに必要なすべてのアーティファクトを保持します。また、以前のバージョンのMAFからアプリケーションを移行する場合、アセンブリ・プロジェクトは、プロジェクトで使用されるMAFランタイムのバージョンを追跡します。

- アプリケーション・プロジェクト。これには、デバイス機能およびアプリケーション機能を抽象化するデータ・コントロール・マネージャが含まれています。

- ビュー・コントローラタイプ・プロジェクト。これには、ソース・フォルダ(src)およびViewContentフォルダが含まれます。

OEPEによってアプリケーション・レベルおよびプロジェクト・レベルのアーティファクトが追加され、これらには、図2-6に示すプロジェクト・エクスプローラからアクセスします。これらのアーティファクトには、次の2つのMAFエディタが含まれます。

- maf-application.xmlを編集するMAFアプリケーション・エディタ。これを使用して、MAFアプリケーション自体(その名前など)、アプリケーション・ライフサイクル・リスナー(LifeCycleListenerImpl.java)、および埋込みアプリケーション機能のためのログイン・サーバー接続の構成を行います。詳細は、第2.2.2.1項「アセンブリ・レベルのリソースについて」を参照してください。

- maf-feature.xmlを編集するMAF機能エディタ。これによって、MAFアプリケーションを構成するアプリケーション機能を記述します。詳細は、第2.2.2.2項「ビュー・プロジェクト・リソースについて」を参照してください。

OEPEによって次のものが作成されます。

- DeviceFeaturesデータ・コントロール。このデータ・コントロールによってApache Cordova Java APIが抽象化され、MAF AMXとして実装されているアプリケーション機能は、デバイスに埋め込まれている様々なサービスにアクセスできるようになります。

- ApplicationFeaturesデータ・コントロール(Springboardページを構築できます)。

注意:
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つのエントリが存在します。これらは無視しても問題ありません。

DeviceFeaturesデータ・コントロールによって提供される操作をMAF AMXページにドラッグ・アンド・ドロップすることで(第14.10項「DeviceFeaturesデータ・コントロールの使用方法」を参照)、デバイスに格納されたユーザーのコンタクト先を管理したり、電子メールとSMSテキスト・メッセージを作成して送信したり、デバイスの場所を突きとめたり、デバイスのカメラを使用したり、デバイスのファイル・システムに格納されたイメージを取得したりする機能を追加します。

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

デフォルトで、プロジェクト・エクスプローラのビューから一部のファイルがフィルタリングされています。アプリケーションのパッケージ化およびデプロイメントに必要な生成済のアーティファクトを表示するには、エクスプローラ・ツールバーの下矢印をクリックし、「ビューのカスタマイズ」を選択します。

図2-7に示される「使用可能なカスタマイズ」ダイアログで、.* resourcesを選択解除し、「OK」をクリックします。

図2-7 プロジェクト・エクスプローラ・ファイルのフィルタリング

ここで、アセンブリ・プロジェクト・ノードおよび.main.androidまたは.main.iosノードを展開し、図2-8に示すように、パッケージおよびデプロイのアーティファクトを表示します。

図2-8 パッケージおよびデプロイメントのアーティファクトの表示

これらのファイルをプロジェクト・エクスプローラのビューからフィルタリングするには、カスタマイズ・ダイアログを再度開き、.* resourcesを選択して、「OK」をクリックします。

2.2.2.1 アセンブリ・レベルのリソースについて

OEPEは、アセンブリ・プロジェクトにMAFアプリケーション用のファイルを生成します。これらのファイルには、MAFプリケーションのメタデータを記述するための構成ファイルが含まれています。これらのファイルには、図2-9に示されるプロジェクト・エクスプローラのアセンブリ・プロジェクトの下のresノードからアクセスします。

図2-9 モバイル・アプリケーション・アーティファクト

(デフォルトの名前applicationで生成された)アセンブリ・プロジェクトには、アプリケーション全体のリソースが格納されており、MAFアプリケーションのプレゼンテーション・レイヤーが提供され、ここには、モバイル・デバイスでのアプリケーションの表示方法を構成するためのメタデータ・ファイルが含まれています。このプロジェクトはMAFアプリケーションのセキュリティを指定しており、アプリケーションのログイン・ページ、アプリケーション全体のリソースを含むことができます。アプリケーション・コントローラ・プロジェクトは、本質的には、アプリケーション機能とそのコンテンツを定義するビュー・コントローラ・プロジェクトのコンシューマです。詳細は、第2.2.2.2項「ビュー・プロジェクト・リソースについて」を参照してください。

ヒント:
アプリケーション・コントローラ・プロジェクト内には、アプリケーション・レベルのライフサイクル・リスナーなど、アプリケーション全体の機能をサポートするコードを配置してください。

図2-10に示された(デフォルト名applicationApplicationで生成)アプリケーション・プロジェクト自体の中に、OEPEにより表2-0に示される次のアーティファクトが作成されます。

図2-10 アプリケーション・プロジェクト

2.2.2.2 ビュー・プロジェクト・リソースについて

ビュー・プロジェクト(applicationViewというデフォルト名で生成されます(図2-11参照))には、アプリケーション機能のリソースが格納されます。第2.2.2.1項「アセンブリ・レベルのリソースについて」で説明したアプリケーション・プロジェクトとは異なり、ビュー・プロジェクトのメタデータ・ファイルでは、アプリケーション機能レベルのリソース、特に、実行時にモバイル・デバイスでMAFアプリケーション自体のSpringboard内またはそのナビゲーション・バーに表示できるように1つのMAFアプリケーションに集約可能な様々なアプリケーション機能を記述します。さらに、アプリケーション機能のメタデータ・ファイルでは、アプリケーション機能をHTMLページとMAF AMXページのどちらで構成するのかが記述されます。また、ビュー・コントローラ・プロジェクトには、これらのアプリケーション・ページと、アプリケーション機能レベルのリソース(MAFアプリケーション用に定義された、Springboardおよびナビゲーション・バー上のアプリケーション機能を表すアイコン・イメージなど)を含むことができます。

ヒント:
ビュー・コントローラ・プロジェクト内には、アプリケーション機能に固有のコードを格納します。アプリケーション・コントローラ・プロジェクトは、(特に別々のビュー・コントローラ・プロジェクト内で定義されている)アプリケーション機能間で共有されるコードの場所として使用してください。

ビュー・コントローラ・プロジェクトはアプリケーション・コントローラ・プロジェクトと分離して、別のモバイル・アプリケーションで再使用できるように、アーカイブ・ファイルとしてデプロイできます(第9.1項「機能アーカイブ・ファイルの使用」を参照)。また、稀なケースとして、アプリケーション・コントローラ・プロジェクトが複数のビュー・コントローラ・プロジェクトを使用することもできます。

注意:
MAFビュー・コントローラ・プロジェクトを別のMAFビュー・コントローラ・プロジェクトの依存性またはMAFアプリケーション・コントローラ・プロジェクトの依存性として追加すると、MAFアプリケーションをデプロイできなくなります。

図2-11 ビュー・プロジェクト

これらのリソースには、maf-feature.xmlと呼ばれるアプリケーション機能の構成ファイルが含まれ、これはMAF機能エディタで編集します。

2.2.2.2.1 複数のビュー・プロジェクトの作成方法

各OEPEアセンブリ・プロジェクトは、最初にアセンブリ・プロジェクトを作成したときに含まれるビュー・プロジェクトに加え、複数のビュー・プロジェクトを持つことができます。このビュー・プロジェクトに含まれる機能は、アセンブリ・プロジェクトの構築およびデプロイ時に作成されるアプリケーションから使用できます。

既存のアセンブリ・プロジェクトに新しいビュー・プロジェクトを作成するには、次の手順を実行します。

1. 「ファイル」→「新規」→「MAFビュー・プロジェクト」をクリックします。MAFビュー・プロジェクト・ウィザードが開きます。

2. ウィザードで「参照」をクリックし、新しいビュー・プロジェクトを追加する先のアセンブリ・プロジェクトを選択します。

3. OEPEでは、新しいビュー・プロジェクトには、アセンブリ・プロジェクトと一致する一意な名前が自動的に付けられます。たとえば、CompGalleryサンプル・アプリケーション内に新しいビュー・プロジェクトを作成する場合、ビュー・プロジェクトにはCompGalleryView1という名前が付けられます(最初に作成されるデフォルトのCompGalleryViewプロジェクトと区別するために)。
望む場合は、この時点で新しいビュー・プロジェクトの名前を編集できます。

4. 「終了」をクリックすると、新しいビュー・プロジェクトが作成されます。

ウィザードでは、ステップ2で選択したアセンブリ・プロジェクトにビュー・プロジェクト・ファイルが追加されます。

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

OEPEは、デプロイメント構成を使用してアプリケーションの実行またはデバッグ方法を決定します。この構成は、ターゲット環境(モバイル・デバイス、エミュレータ、またはiOSのApp Storeなどのアプリケーション・マーケットプレイス)にデプロイされるアーカイブにパッケージする方法を定義します。デプロイメント構成は次のことを行います。

- 作成されるアーカイブ・ファイルのフォーマットと内容を指定します。

- パッケージ対象となるソース・ファイル、デプロイメント・ディスクリプタ、およびその他の補助ファイルをリストします。

- 作成されるアーカイブ・ファイルのタイプおよび名前を記述します。

- 依存情報、プラットフォーム固有の指示、およびその他の情報を示します。

アプリケーションの作成時、OEPEによりデフォルトの設定およびイメージ・ファイルでシードされるデプロイメント構成が作成されます。デフォルトでは、使用している各SDKに対して1つのデプロイメント・ターゲットが作成されます。環境を正しく構成していれば、これらの構成を使用して図2-12に示すように「実行」に続いて「デバッグ構成」を選択することによって、MAFアプリケーションを作成直後にテストできます。

注意:
開発の間は「デバッグ構成」を使用します。本番デプロイメントには、実行構成を使用します。
「実行構成」のかわりにデバッグ構成を選択すると、OEPEで、必要に応じて、デフォルトのデバッグ・キーストアなどのデバッグ設定を使用できるようになります。

図2-12 デプロイメント構成の作成

図2-13に示された「構成の作成」ダイアログで、をクリックして新規の構成を作成します。

図2-13 新規の構成の作成

その後、「構成」ページ(図2-14を参照)を使用し、適切なデプロイメント・ターゲットを選択します。

図2-14 デプロイメント・ターゲットの選択

注意:
iOSおよびAndroidアプリケーションをシミュレータとデバイスにデプロイする場合、それらの環境設定と構成に関する要件はそれぞれ異なります。詳細は、第27.2.5項「Androidアプリケーションのデプロイ」および第27.2.7項「iOSアプリケーションのデプロイ」全体に記載されている「始める前に」を参照してください。

各サポートされているプラットフォームおよびデバイスまたはエミュレータに対してMAFアプリケーション構成を作成できます。

これらの構成は「MAFアプリケーション」の下のリストから構成を選択することによって編集できます。MAFアプリケーション構成用に構成する値の詳細は、第27.2.4項「Androidデプロイメント構成の作成方法」および第27.2.6項「iOSデプロイメント構成の作成方法」を参照してください。

プラットフォーム固有のデプロイメント構成に加えて、MAFではMAFアプリケーションをモバイル・アプリケーション・アーカイブ(.maa)ファイルとしてパッケージ化できるようにするデプロイメント構成も作成されます。このファイルを使用すると、.maaファイルとしてパッケージ化された既存のアプリケーションを使用する新しいMAFアプリケーションを作成できます。詳細は、第27.4項「モバイル・アプリケーション・アーカイブ・ファイルの作成」および第27.5項「署名のないデプロイメント・パッケージの作成」を参照してください。

2.2.3 MAFアプリケーションおよびアプリケーション機能の編集に関する必知事項

アプリケーションを作成するとmaf-application.xmlファイルが生成されます。これによりモバイル・アプリケーションおよびmaf-features.xmlファイルも構成できるようになります。このファイルを使用して、モバイル・アプリケーション内に埋め込まれるアプリケーション機能を追加、削除または編集します。OEPEでは、maf-application.xml用のMAFアプリケーション・エディタとmaf-feature.xml用のモバイル機能エディタが提供されます。これらによって、これらのファイルを宣言的に変更できます。図2-15は、OEPEで開かれたMAFアプリケーション・エディタの例を示しています。

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

図2-15に示すように、MAFアプリケーション・エディタはプロジェクト・エクスプローラのアプリケーションおよび「MAF」ノードの下にあります。maf-application.xmlファイルはアプリケーション、「adf」および「META-INF」ノードの下にあります。このエディタは「MAFアプリケーション・エディタ」をダブルクリックして開きます。

図2-16に示すように、MAF機能エディタはエクスプローラのビュー・プロジェクトおよび「MAF」ノードの下にあります。maf-feature.xmlファイルはビュー・プロジェクト、「src」および「META-INF」ノードの下にあります。このエディタは「MAF機能エディタ」をダブルクリックするか、maf-feature.xmlをダブルクリックして開きます。このファイルを使用して、MAFアプリケーションのコンテンツを構成します。

図2-16 MAF機能エディタ

maf-application.xmlファイルを編集するためのMAFアプリケーション・エディタと同様に、OEPEはmaf-features.xml構成ファイルの要素の構築に使用されたMAFコンポーネントをMAF機能エディタに表示します。

2.2.4 MAFアプリケーション・エディタおよびMAF機能エディタについて

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

MAFアプリケーション・エディタを使用してmaf-application.xmlを変更する場合、OEPEではそのファイルが開くだけでなく、アプリケーションに関連する他のファイルも開きます。これらには、登録済機能ファイル(MAF機能エディタで編集)およびプラグインが含まれます。MAFアプリケーション・エディタでこれらのファイルの一部を表示するには、「アウトライン」を展開し、「登録済機能」を選択します。また、「機能」フォルダ(ある場合)にあるファイルも影響を受けることがあります。図2-17は、MAFアプリケーション・エディタが開いて登録済機能の一覧が表示され、これがファイルmaf-feature.xmlに接続されていることがツールチップに表示されていることを示しています。

図2-17 関連機能ファイルの表示(maf-application.xml)

MAFアプリケーション・エディタの「登録済機能」ペインでmaf-feature.xmlをダブルクリックすると、期待どおりにOEPEによって、ファイルがMAF機能エディタで開きます。編集中のこれら2つのファイルの(該当する場合は他のファイルとの)間の相互作用は、注目に値します。

MAFアプリケーション・エディタに移動し、アプリケーション・ファイルを保存すると、OEPEでは、関連の機能ファイルがファイル・システム内で外部的に変更されたかどうかを確認します。変更された場合、OEPEでは確認ダイアログを表示し、エディタの内容に関連して関連のファイルが変更されていることをユーザーに伝えます。この時点では次のいずれかのオプションを選択できます。

- エディタをリロードします。これで、ファイル・システムの変更がMAFアプリケーション・エディタにコピーされ、ファイルに対して行った変更が上書きされます。

- エディタをリロードしません。これで、maf-feature.xmlファイルが保存され、ファイル・システムの内容が上書きされます。

「ファイル」→「すべて保存」を選択すると、OEPEでは同様の確認が実行されます。また、「ファイル」→「すべて閉じる」機能を選択すると、MAFアプリケーション・エディタでファイルが開いているかどうかが確認され、また、閉じる前には開いているファイル同士に競合がないことが確認されます。これはデータ消失の防止に役立ちます。

2.2.5 MAF AMXページの作成

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

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

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

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

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

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

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

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

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

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

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

2.2.5.1 MAF AMXページの作成方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

この章では、MAFアプリケーション・エディタとMAF機能エディタを使用してモバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義し、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

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

- 第3.1項「モバイル・アプリケーションの定義の概要」

- 第3.2項「Oracle MAFパースペクティブの使用」

- 第3.3項「アプリケーション機能の基本情報の定義方法」

- 第3.4項「モバイル・アプリケーションのIDおよび表示動作の設定方法」

3.1 モバイル・アプリケーションの定義の概要

モバイル・アプリケーションには1つ以上のビュー・コントローラタイプのプロジェクトを含めることができます。これらにはそれぞれ、maf-feature.xmlファイル内の一連の機能が記述されています。第2章「MAFアプリケーション開発のスタート・ガイド」で説明したように、MAFは、モバイル・アプリケーションそのものに対してmaf-application.xml構成ファイルを、アプリケーションのコンテンツ定義用にmaf-feature.xmlファイルを提供しています。これらのファイルは手動で変更することもできますが、MAFでは、これらのファイルを宣言的にビルドできるようにする2つのエディタを提供しています。

- MAFアプリケーション・エディタは、maf-application.xmlファイルを編集するための宣言的なインタフェースを提供します。

- モバイル機能エディタは、maf-feature.xmlファイルを編集するための宣言的なインタフェースを提供します。

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

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

図3-1 モバイル・アプリケーションのSpringboardに表示されるアプリケーション機能

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

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

3.1.2 モバイル機能エディタについて

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

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

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

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

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

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

3.3 アプリケーション機能の基本情報の定義方法

MAFアプリケーション・エディタでは、名前、アプリケーションID、モバイル・アプリケーションの表示方法を設定できます。また、ベンダーやバージョン情報を入力したり、ライフサイクル・イベント・リスナーを選択または作成することもできます。

MAFアプリケーション・エディタにアクセスするには:

- プロジェクト・エクスプローラで、アセンブリ・プロジェクト・フォルダを展開し、次にMAFフォルダを展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

3.4 モバイル・アプリケーションのIDおよび表示動作の設定方法

MAFアプリケーション・エディタの「アプリケーション」ページ(図3-3を参照)では、モバイル・アプリケーションに名前を付けたり、Springboardやナビゲーション・バーでのモバイル・アプリケーションの表示を制御できます。

始める前に:

「MAFアプリケーション・エディタ」(図3-3に示すようにプロジェクト・エクスプローラ・パネル内のアセンブリ・プロジェクトのMAFノードにある)をダブルクリックして、MAFアプリケーション・エディタを開きます。

図3-3 プロジェクト・エクスプローラでのMAFアプリケーション・エディタの選択

モバイル・アプリケーションの基本情報を設定するには:

1. 「アウトライン」でアプリケーションの名前を選択して、「アプリケーション」ページを選択します。

注意:
エディタでは、デフォルトで「アプリケーション」ページが開きます。

図3-4は、「アプリケーション」ページの基本情報を定義する部分を示しています。

図3-4 モバイル・アプリケーションの基本情報の設定

2. 「名前」フィールドに、アプリケーションの表示名を入力します。この属性はローカライズ可能です。詳細は、第7.1項「MAFアプリケーションのローカライズの概要」を参照してください。

注意:
MAFでは、このフィールドに入力した値をiOSアーカイブ(.ipaまたは.app)ファイルの名前として使用します。このファイルは、iOSデバイスまたはシミュレータにアプリケーションをデプロイすると作成されます。詳細は、第27.2.6項「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.2.4項「Androidデプロイメント構成の作成方法」および第27.2.6項「iOSデプロイメント構成の作成方法」で説明するデプロイメント・プロファイル内でこのIDを上書きできます。

注意:
Androidデバイスまたはエミュレータにアプリケーションが正しくデプロイされるようにするには、IDの先頭を数字やピリオドではなく、文字にする必要があります。たとえば、IDが925090のように(com.company.925090)完全に数値で構成されている場合、アプリケーションはデプロイできません。hello925090などの文字で始まるIDであれば(com.company.hello925090)、デプロイメントは正常に実行できます。

4. 「説明」フィールドに、アプリケーションの目的を説明した、短いけれども詳細な要約を入力します。

5. 「バージョン」フィールドに、バージョンを入力します。

6. 「ベンダー」フィールドに、このアプリケーションを最初に作成したベンダーの名前を入力します。

7. 「ライフサイクル・イベント・リスナー」フィールドの横にある「参照」をクリックして、「プロパティの編集」ダイアログ(図3-5を参照)を開き、イベントを起動、停止、アクティブ化、非アクティブ化するためのランタイム・コールを有効にするイベント・リスナーを登録します。イベント・リスナーの完全修飾クラス名を入力する必要があります。これはオプションのフィールドです。

注意:
ライフサイクル・イベント・リスナーのラベルにマウス・ポインタを置くと、リスナー・クラスを説明するツールチップが表示されます。

図3-5 アプリケーション・イベント・リスナーの取得

デフォルトのアプリケーション・リスナー・クラスは、application.LifeCycleListenerImplです。MAFでは、デフォルトではこのクラスは登録されません。このクラスはJVMを起動するため、各モバイル・アプリケーションには適さない可能性があるからです。かわりに、「クラスの選択」ダイアログ(図3-5を参照)を使用して、手動でこのクラスを登録する必要があります。このダイアログを閉じると、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>

詳細は、第11.1項「MAFアプリケーションでのライフサイクル・イベント・リスナーの使用について」を参照してください。

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

この章では、アプリケーション機能について紹介し、それをMAFアプリケーションに追加する方法や、アプリケーション機能を構成してスライディング・ウィンドウとしてレンダリングする方法について説明します。

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

- 第4.1項「MAFアプリケーション機能の概要」

- 第4.1項「MAFアプリケーション機能の概要」

- 第4.2項「モバイル・アプリケーション内のアプリケーション機能の構成」

- 第4.3項「MAFアプリケーションでのスライディング・ウィンドウの作成」

4.1 MAFアプリケーション機能の概要

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

図4-1 ワークスペース・サンプルMAFアプリケーションに定義された機能

MAF機能エディタを使用して、MAFアプリケーションに含めるアプリケーション機能を指定します。

これらの要素は、エディタを使用して宣言的に変更できます(図4-1を参照)。

4.2 モバイル・アプリケーション内のアプリケーション機能の構成

各モバイル・アプリケーションには、少なくとも1つのアプリケーション機能が必要です。

4.2.1 モバイル・アプリケーションのコンテンツの指定方法

図4-2は、「機能参照」ページを示しています。このページで、モバイル・アプリケーションのコンテンツを構築できます。MAFアプリケーション・エディタでは、これらの機能参照が「機能参照」表に表示されます。図4-2は、カスタマおよび製品のアプリケーション機能をそれぞれ表すHCMおよびPRODに対して定義された機能参照を示しています。

図4-2 アプリケーション・ページ内の登録機能

登録された機能を使用して、アプリケーション機能に対する参照を入力し、モバイル・アプリケーションのSpringboard内での表示を設定します。

さらに、このページでは、ナビゲーション・バーおよびSpringboard上でのアプリケーション機能の表示順序を設定できます。実行時に、デバイス画面の幅によって、ナビゲーション・バーに表示されるアプリケーション機能の数を制限できます。ナビゲーション・バーに収まらない機能は、「次へ」タブの下に表示されます(図4-3を参照)。「編集」機能を使用して、「次へ」タブ内のアプリケーション機能の順序を変更できます。

図4-3「次へ」タブ

注意:
モバイル・アプリケーションの構築は反復型のプロセスなので、新しいFARが使用可能になり、新しいアプリケーション機能がmaf-feature.xmlファイルに追加されると、機能参照を追加、削除または更新できます。

図4-4 「機能参照」ページを使用したアプリケーション機能の指定

始める前に:

MAFアプリケーション・エディタでアプリケーション機能を構成する必要があります。さらに、MAFアプリケーション・エディタを開く必要があります。

機能参照を指定するには:

1. MAFアプリケーション・エディタのアウトラインで登録された機能を選択します。

2. 「参照」をクリックして、モバイル機能の登録ダイアログを開きます(図4-5を参照)。

図4-5 アプリケーションの機能の登録

このダイアログには、maf-feature.xmlファイルの<adfmf:feature>要素に記述されているすべてのアプリケーション機能がリストされます。このダイアログを使用することで、<adfmf:featureReference>要素と<adfmf:feature>要素の両方のid属性が確実に一致するようになります。

3. アプリケーションに登録するアプリケーション機能のIDを選択します。[Shift]キーと[Ctrl]キーを使用して2つ以上を選択し、「OK」をクリックすることもできます。
インポートした機能アーカイブ(FAR)ファイルに含まれているアプリケーション機能への参照を追加することもできます。詳細は、第9.1.1項「アプリケーション・ライブラリとしてのFARのインポート」を参照してください。

4. MAFアプリケーション・エディタの登録された機能ページでは、上/下矢印を使用して機能参照の表示順を並べ替えることができます。
最上位のアプリケーション機能が、デフォルトのアプリケーション機能です。このアプリケーションのセキュリティ構成に応じて、MAFではユーザーが匿名でログインして保護されていないコンテンツを表示したり、ユーザーに認証資格証明を提供するように求めることができます。詳細は、第29.1項「モバイル・アプリケーション・フレームワークのセキュリティについて」を参照してください。

注意:
「機能参照」表の最上位のIDが、モバイル・アプリケーション内で最初に表示されるアプリケーション機能です。例として、図4-6に示されているFeature 1アプリケーション機能を参照してください。

図4-6 機能参照の順序変更

5. 「ナビゲーション・バーに表示」列および「Springboardに表示」列の行のドロップダウン・リストから、 「true」または「false」を選択することで、Springboardとナビゲーション・バーのアプリケーション機能に対する表示動作を設定します。図4-7は、アプリケーション機能がナビゲーション・バーに表示されなくなるオプションの選択状態を示しています。

ヒント:
アプリケーションによってカスタムSpringboardが使用される場合、またはアプリケーション機能が単一のスライディング・ウィンドウとして表示される場合は、これらのオプションをfalseに設定します。詳細は、第4.3項「MAFアプリケーションでのスライディング・ウィンドウの作成」を参照してください。

図4-7 ナビゲーション・オプションの変更

デフォルトでは、Springboardとナビゲーション・バーが表示されます(つまり、これらの属性はtrueに設定されます)。ナビゲーション・バーとSpringboardの両方の属性をfalseに設定すると、アプリケーション機能は最初の位置にある場合のみ表示されるようになります。第B.2.11項「hideNavigationBar」および第B.2.12項「showNavigationBar」も参照してください。

注意:
Springboard機能は、ナビゲーション・バー上またはモバイル・アプリケーションのSpringboard内には表示されないので、カスタムSpringboardアプリケーション機能として使用される機能参照については、「ナビゲーション・バーに表示」および「Springboardに表示」を両方とも「false」に設定する必要があります。第5.6項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」も参照してください。

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

アプリケーション機能をスライディング・ウィンドウとしてレンダリングできます。これにより、ナビゲーション・バーまたはSpringboard内に表示される他のアプリケーション機能と同時にアプリケーション機能が表示されます。スライディング・ウィンドウは、アプリケーション内に常に存在しているコンテンツ(グローバル・ツール・バーなど)を表示するために使用したり、一時的な(ポップアップ)コンテンツ(ヘルプ・ウィンドウなど)を表示するために使用できます。

図4-8は、SlidingWindowサンプル・アプリケーションのSlidingDrawerアプリケーション機能を示しています(付録G「サンプルのMAFアプリケーション」を参照)。このアプリケーション機能は、他のアプリケーション機能に重なりながら、アプリケーション画面の右側に表示されます。

図4-8 スライディング・ウィンドウ・サンプル・アプリケーション

アプリケーション機能をスライディング・ウィンドウとしてレンダリングする場合、Show on Navigation BarプロパティおよびShow on Springboardプロパティをfalseに設定する必要があります。

スライディング・ウィンドウを作成するには、oracle.adfmf.framework.api.AdfmfSlidingWindowOptionsクラスとAdfmfSlidingWindowUtilitiesクラスの組合せを、アプリケーション内のマネージドBeanまたはライフサイクル・リスナーから起動します。

次の例は、SlidingWindowサンプル・アプリケーションで、LifeCycleListenerImpl.javaのactivateメソッドからスライディング・ウィンドウを作成する方法を示しています。スライディング・ウィンドウの作成後、SlidingWindowサンプル・アプリケーションではSlidingDrawerBean.javaを使用してスライディング・ウィンドウの表示を管理します。

...
public void activate()  {
// The argument you pass to the create method is the refId of the
// feature in the maf-application.xml. For example,
// <adfmf:featureReference id="fr4" refId="SlidingDrawer" showOnNavigationBar="false"
// showOnSpringboard="false"/>
String slidingWindowDrawer = AdfmfSlidingWindowUtilities.create("SlidingDrawer");

// Note also that both showOn... values must be set to false in the config
// file for the sliding window to appear

SlidingDrawerBean.slidingDrawerWindow=slidingWindowDrawer;
AdfmfSlidingWindowOptions options = new AdfmfSlidingWindowOptions();
options.setDirection(AdfmfSlidingWindowOptions.DIRECTION_RIGHT);
options.setStyle(AdfmfSlidingWindowOptions.STYLE_OVERLAID);
options.setSize("0");

}

ここで説明しているSlidingWindowサンプル・アプリケーション全体にアクセスする方法は、付録G「サンプルのMAFアプリケーション」を参照してください。

AdfmfSlidingWindowUtilitiesおよびAdfmfSlidingWindowOptionsの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。ライフサイクル・リスナーの使用方法の詳細は、第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

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

この章では、MAFアプリケーションのSpringboardとナビゲーション・バーを使用して、アプリケーションのナビゲーションを構成する方法について説明します。

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

- 第5.1項「MAFアプリケーションの表示動作の概要」

- 第5.2項「アプリケーションのナビゲーションの構成」

- 第5.3項「ナビゲーション・オプションの構成時の処理」

- 第5.4項「Springboardにアニメーションを設定する場合の処理」

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

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

- 第5.7項「Springboardの実行時の動作に関する必知事項」

- 第5.8項「MAFアプリケーションでのスライディング・ウィンドウの作成」

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

Springboardとナビゲーション・バーの表示動作を次のように制御するよう、モバイル・アプリケーションを構成できます。

- Springboardとナビゲーション・バーを表示または非表示にすることで、モバイル・デバイスの画面を最適に使用できるようになります。これらのオプションは、ナビゲーション・バーのデフォルトの表示動作をオーバーライドします。ナビゲーション・バーは、アプリケーション機能によって別の状態に指定されていないかぎり、デフォルトで表示されます。

- Springboardを右からスライドできるようにします。デフォルトでは、Springboardは表示全体を占有せず、そのかわりに左からスライドして、アクティブ・コンテンツ(ナビゲーション・バーの「ホーム」ボタンとアプリケーション機能を含む)を右へプッシュします。

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

「アプリケーション」ページの「ナビゲーション」のオプション(図5-1を参照)を使用して、ナビゲーション・バーを表示または非表示にしたり、アプリケーションによって使用されるSpringboardのタイプを選択したり、ユーザーがアプリケーションをめくるように見ていくときのSpringboardの反応方法を定義できます。

図5-1 「アプリケーション」ページの「ナビゲーション」のオプション

始める前に:

プロジェクト・エクスプローラのアセンブリ・プロジェクト→「MAF」から「MAFアプリケーション・エディタ」を選択して、maf-application.xmlファイルを開く必要があります。

ナビゲーション・バーの表示動作を設定するには:

1. 「ナビゲーション・バーを表示」を選択して、モバイル・アプリケーションがデフォルトで、Springboardではなくナビゲーション・バーを表示するようにします(図5-2を参照)。

図5-2 デフォルトでナビゲーション・バーを表示

「ナビゲーション・バーを表示」をオフにすると、アプリケーションの起動時にナビゲーション・バーが表示されなくなり、ユーザーにはSpringboardがナビゲーションの唯一の方法として提示されます。ナビゲーション・バーはSpringboardと同じ目的を果たすものなので、これを非表示にすることで冗長な機能を削除できる場合もあります。

2. 選択したアプリケーション機能のコンテンツが表示されているときにナビゲーション・バーを非表示にするには、「切替えボタンの表示」を選択します。図5-3はこのオプションを示したもので、図5-2に示されているナビゲーション・バーを、アプリケーション機能のコンテンツによって非表示にする方法が示されています。

図5-3 ナビゲーション・バーを非表示

このオプションはデフォルトで選択されており、アプリケーション機能によって表示/非表示状態が指定されていなければ、ナビゲーション・バーはデフォルトで表示されます。

Springboardの表示動作を設定するには:

1. Springboardを表示するには、「Springboardの表示」を選択します。デフォルトでは、これが選択されます。

2. 「アプリケーションの起動時に表示」を選択して、モバイル・アプリケーションの起動後にエンド・ユーザーに対してSpringboardを表示できるようにします。

3. 「Springboardトグル・ボタンの表示」を選択して、Springboardのボタンを表示できるようにします(図5-4を参照)。このボタンはアプリケーション機能内に表示されます。図5-2では、アプリケーション機能のコンテキスト内にこのボタンが表示されています。

図5-4 Springboardトグル・ボタン

Springboardのスライドアウト動作を設定するには:

1. 「アニメーション」で「右にスライド」を選択します。Springboardは、「幅」オプションで入力したピクセル数値(またはパーセント)によって指定された領域を占有します。「<なし>」を選択した場合、Springboardは右からスライドできません(つまり、MAFではこのアクションを有効にするためのアニメーションが提供されません)。Springboardが表示領域全体を占有します。

2. 幅を設定します(ピクセル単位)。iOSデバイスのSpringboardのデフォルト幅は320ピクセルです。Androidデバイスでは、デフォルトでSpringboardは画面全体を占有するので、使用可能な幅がすべて占有されます。

注意:
Springboardが表示領域全体を占有しない場合は、アクティブなアプリケーション機能が残りの表示領域を占有します。詳細は、第5.4項「Springboardにアニメーションを設定する場合の処理」を参照してください。

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

Springboardおよびナビゲーション・バーのオプションを設定すると、maf-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>

次の例は、「デフォルト」を選択したときに、enabled属性がtrueに設定される様子を示しています。

注意:
Springboardはデバイスの画面全体を占有するので、ナビゲーション・バーとSpringboardは同時には表示されません。

adfmf:application>
...
<adfmf:navigation>
<adfmf:navigationBar enabled="true"/>
<adfmf:springboard enabled="true"/>
</adfmf:navigation>
</adfmf:application>

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

次の例は、maf-application.xmlファイルのナビゲーション・ブロックを示しており、ここでは、Springboardはスライドアウトし、指定された表示領域(213ピクセル)を占有するように設定されています。

<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>

次の行ではアニメーションを無効にしています。

<adfmf:springboard enabled="true" animation="none"/>

次の行では、Springboardが表示領域の左から100ピクセル分を占有するように設定し、アクティブなアプリケーション機能が表示領域の残りの部分を占有できるようにしています。

<adfmf:springboard enabled="true" animation="slideright" width="100px"/>

アニメーション以外に、前述の例は次の処理を示しています。

- showSpringboardAtStartup属性の使用。アプリケーションの起動時にSpringboardを表示するかどうかを定義します。(デフォルトでは、Springboardは表示されます。)

- navigationBarのdisplayHideShowNavigationBarControl属性の使用。

Springboardが表示されないようにするには、enabled属性をfalseに設定します。

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

MAFによって提供されるデフォルトのHTML Springboardページでは、次のテクノロジが使用されています。これらは、カスタマイズしたログイン・ページに含めることもできます。

- Cascading Style Sheets (CSS): 色とレイアウトを定義します。

- JavaScript: Springboardページ内に埋め込まれた<script>タグには、第16073296章「ローカル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ファイルで参照されるアプリケーション機能です。

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

HTMLの場合と同様、MAF AMXを使用して記述されたSpringboardは、アプリケーション機能としてモバイル・アプリケーションによって参照されます(第4.2.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照)。通常、Springboardはタスク・フローではなく単一のMAF AMXページとして記述されるため、埋込みアプリケーション機能の起動には、gotoFeatureメソッドが使用されます(次の例のメソッド式を参照)。

注意:
カスタムSpringboardページ(HTMLまたはMAF AMXによって作成されたもの)は、ビュー・コントローラ・プロジェクト内に配置する必要があります。ビュー・コントローラ・プロジェクト内にはmaf-feature.xmlファイルも格納されています。詳細は、第4.2.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照してください。

デフォルトSpringboard (adfmf.default.springboard.jar)は、機能アーカイブ(FAR) JARファイルにバンドルされ、モバイル・アプリケーションに含められた他のFARとともにデプロイされるMAF AMXページです。JARファイルには、DataBindings.cpxファイルやPageDef.xmlファイルなど、Springboardに関連付けられたすべてのアーティファクトが含まれます。このファイルは、maf-application.xmlファイルのSpringboardオプションで「デフォルト」が選択された後のみ使用できます。このオプションを選択すると、このFARもアプリケーション・クラスパスに追加されます。詳細は、第27.3項「機能アーカイブ・ファイル(FAR)のデプロイ」を参照してください。

デフォルトのSpringboard (次に示すspringboard.amx)は、MAF AMXアプリケーション機能として実装されます。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="#{bindings.name.inputValue}" id="ot3"/>
</amx:facet>
<amx:listView var="row"
value="#{bindings.features.collectionModel}"
fetchSize="#{bindings.features.rangeSize}"
id="lv1"
styleClass="amx-springboard">
<amx:listItem showLinkIcon="false"
id="li1"
actionListener="#{bindings.gotoFeature.execute}">
<amx:tableLayout id="tl1"
width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf11"
width="46px"
halign="center">
<amx:image source="#{row.image}"
id="i1"
inlineStyle="width:36px;height:36px"/>
</amx:cellFormat>
<amx:cellFormat id="cf12"
width="100%"
height="43px">
<amx:outputText value="#{row.name}"
id="ot2"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
<amx:setPropertyListener from="#{row.id}"
to="#{pageFlowScope.FeatureId}"/>
</amx:listItem>
</amx:listView>
</amx:panelPage>
</amx:view>

図5-5に示すように、MAF AMXファイルでは、リスト・アイテムがモバイル・アプリケーションの埋込みアプリケーション機能であるリスト・ビューを使用してSpringboardを定義します。これらのアプリケーション機能は、デプロイ後は、名前と関連アイコンによって表示されます。AdfmfContainerUtilities APIのgotoFeatureメソッドでは、ページのナビゲーション機能が提供されます。このメソッドを使用した特定のアプリケーション機能の表示の詳細は、第B.2.6項「gotoFeature」を参照してください。また、第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」も参照してください。

図5-5 デフォルトのSpringboard

MAFでは、ApplicationFeaturesデータ・コントロール内にカスタムSpringboardを作成(またはデフォルトのSpringboardを拡張)するための基本ツールが提供されています。このデータ・コントロール(図5-6を参照)により、モバイル・アプリケーションとそのアプリケーション機能の両方を記述する属性のデータ・コレクションを使用して、Springboardページを宣言的に構築できます。カスタムSpringboardページの例は、APIDemoサンプル・アプリケーションを参照してください。このアプリケーション(およびMAFに付属の他のサンプル)の詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

図5-6 ApplicationFeaturesデータ・コントロール

ApplicationFeaturesデータ・コントロールのメソッドにより、ナビゲーション機能を追加できます。これらのadfmf.containerUtilitiesメソッドについて、表5-1に説明します。詳細は、第B.2項「MAFコンテナ・ユーティリティAPI」を参照してください。また、第14章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」も参照してください。

表5-1 ApplicationFeatureメソッド

メソッド

説明

gotoDefaultFeature

デフォルトのアプリケーション機能に移動します。

gotoFeature

このメソッドに渡されたパラメータによって指定される特定のアプリケーションに移動します。

gotoSpringboard

Springboardに移動します。

hideNavigationbar

ナビゲーション・バーを非表示にします。

showNavigationbar

ナビゲーション・バーを表示します(非表示になっている場合)。

resetFeature

このメソッドに渡されたパラメータによって指定されるアプリケーション機能をリセットします。

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

アプリケーションの起動時に表示オプションを選択し、スライドアウト幅を画面のフル・サイズに指定している場合は、起動時にMAFによってバックグラウンドにデフォルトのアプリケーション機能がロードされます。モバイル・アプリケーションの休止時には、MAFではSpringboardを非表示にします。

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

アプリケーション機能をスライディング・ウィンドウとしてレンダリングできます。これにより、ナビゲーション・バーまたはSpringboard内に表示される他のアプリケーション機能と同時にアプリケーション機能が表示されます。スライディング・ウィンドウは、アプリケーション内に常に存在しているコンテンツ(グローバル・ツール・バーなど)を表示するために使用したり、一時的な(ポップアップ)コンテンツ(ヘルプ・ウィンドウなど)を表示するために使用できます。

図5-7は、SlidingWindowサンプル・アプリケーションのSlidingDrawerアプリケーション機能を示しています(付録G「サンプルのMAFアプリケーション」を参照)。このアプリケーション機能は、他のアプリケーション機能に重なりながら、アプリケーション画面の右側に表示されます。

図5-7 他のアプリケーション機能に重なるスライディング・ウィンドウ

アプリケーション機能をスライディング・ウィンドウとしてレンダリングする場合、Show on Navigation BarプロパティおよびShow on Springboardプロパティをfalseに設定する必要があります。

スライディング・ウィンドウを作成するには、oracle.adfmf.framework.api.AdfmfSlidingWindowOptionsクラスとAdfmfSlidingWindowUtilitiesクラスの組合せを、アプリケーション内のマネージドBeanまたはライフサイクル・リスナーから起動します。

次の例は、SlidingWindowサンプル・アプリケーションで、LifeCycleListenerImpl.javaのactivateメソッドから、図5-7に示すスライディング・ウィンドウを作成する方法を示しています。スライディング・ウィンドウの作成後、SlidingWindowサンプル・アプリケーションではSlidingDrawerBean.javaを使用してスライディング・ウィンドウの表示を管理します。

...
public void activate()  {
// The argument you pass to the create method is the refId of the
// feature in the maf-application.xml. For example,
// <adfmf:featureReference id="fr4" refId="SlidingDrawer" showOnNavigationBar="false"
// showOnSpringboard="false"/>
String slidingWindowDrawer = AdfmfSlidingWindowUtilities.create("SlidingDrawer");

// Note also that both showOn... values must be set to false in the config
// file for the sliding window to appear

SlidingDrawerBean.slidingDrawerWindow=slidingWindowDrawer;
AdfmfSlidingWindowOptions options = new AdfmfSlidingWindowOptions();
options.setDirection(AdfmfSlidingWindowOptions.DIRECTION_RIGHT);
options.setStyle(AdfmfSlidingWindowOptions.STYLE_OVERLAID);
options.setSize("0");

}

ここで説明しているSlidingWindowサンプル・アプリケーション全体にアクセスする方法は、付録G「サンプルのMAFアプリケーション」を参照してください。

AdfmfSlidingWindowUtilitiesおよびAdfmfSlidingWindowOptionsの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。ライフサイクル・リスナーの使用方法の詳細は、第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

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

この章では、MAFアプリケーション・エディタとMAF機能エディタを使用してモバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義し、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

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

- 第6.1項「アプリケーション機能のコンテンツ・タイプの概要」

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

- 第6.3項「外部リソースの選択に関する必知事項」

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

アプリケーション機能のコンテンツ・タイプには、ユーザー・インタフェースの形式が記述されます。このコンテンツ・タイプは、MAF AMXコンポーネントまたはHTML(5)タグを使用して構成できます。また、アプリケーション機能では、モバイル・コンテキストに適したコンテンツを含む、リモートでホストされたページから、自身のコンテンツを導出することもできます。このようなWebページとして考えられるのは、スマートフォン向けのApache Trinidadで作成されたJavaServerページや、タブレット・デバイス上で実行されるアプリケーション向けのADF Facesコンポーネントから構成されたページです。モバイル・アプリケーションに埋め込まれた各アプリケーション機能では、様々なコンテンツ・タイプを保持できます。

モバイル・アプリケーションには、様々なコンテンツ・タイプを持つアプリケーション機能が含まれますが、アプリケーション機能自体も、ユーザーおよびデバイス固有の要件に応じた様々なコンテンツ・タイプを保持する場合があります(第22章「アプリケーション機能に関する制約の設定」)。アプリケーション機能によって、様々なコンテンツ・タイプがどのように提供されるかについては、第22章「アプリケーション機能に関する制約の設定」を参照してください。次に示すように、子要素を<adfmf:content>要素に追加すると、アプリケーション機能にユーザー・インタフェースをどのように実装するかを定義できます。

<adfmf:content id="Feature1">
<adfmf:amx file="FeatureContent.amx">
</adfmf:content>

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

MAF機能エディタで機能を作成したら、機能のコンテンツを定義するために、各機能を右クリックして新規オブジェクト・ダイアログ(図6-1を参照)を開きます。このダイアログでは、目的のコンテンツ関連要素を選択できます。このダイアログの選択項目を使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できます。

各コンテンツ・タイプには、独自のパラメータ・セットがあります。たとえば、図6-1に示すように、MAF AMXページの場所、またはMAF AMXコンテンツとして実装するアプリケーション機能のタスク・フローの場所を指定する必要があります。さらにオプションで、アプリケーション機能に他のアプリケーション機能(またはモバイル・アプリケーション自体)とは異なるルック・アンド・フィールを設定するCSSファイルを選択したり、MAF AMXコンポーネントのアクションを制御するJavaScriptファイルを選択することもできます。

図6-1 アプリケーション機能の実装の定義

始める前に:

各コンテンツ・タイプには、次のような独自の前提条件があります。

- 「AMXページ」: 個々のMAF AMXページの両方が含まれる、アプリケーション機能のデフォルトのコンテンツ・タイプ。MAF AMXコンテンツは、一連のモバイル固有のユーザー・インタフェース・コンポーネント、ADFデータ・バインディング、カメラなどのデバイス・サービスを統合するデータ・コントロール、およびチャート、グラフ、テーマ・マップなどのデータ視覚化ツールを使用して、宣言的に構築できます。MAF AMXページの構築の詳細は、第12章「MAF AMXページの作成」を参照してください。
MAF AMXとして実装されるアプリケーション機能には、既存のビュー(つまり、単一のMAF AMXページ)が必要です。JavaScriptファイルを追加すると、MAF AMXコンポーネントに対するレンダリング・ロジックが提供されるか、既存のレンダリング・ロジックがオーバーライドされます。アプリケーション機能に対するカスタムのルック・アンド・フィールを指定するセレクタを持つスタイルシート(CSS)を含めます。これは、モバイル・アプリケーション・レベルで定義されたスタイル(アプリケーション機能にデフォルトで使用されるスタイル)をオーバーライドします。つまり、アプリケーション機能全体で確実に独自のルック・アンド・フィールを持つようになります。

MAF AMXページとこれらを格納するモバイル・アプリケーションは、両方とも「ファイル」→「新」から呼出し可能なウィザードを使用して作成できます。プロジェクト・エクスプローラでビュー・プロジェクトを右クリックして「新」を選択したときに表示されるポップアップ・メニュー(図6-2を参照)を使用してMAF AMXページを作成することもできます。

図6-2 MAFページを作成するためのポップアップ・メニュー

- 「タスク・フロー」: タスク・フロー・ページでは、アプリケーション内のパスを機能ごとに定義します。タスク・フロー・ファイルにはコントロール・フローの仕様とアクティビティが含まれ、アクティビティとしてメソッドのコール、ルーターの使用、別のタスク・フローのコール、タスク・フローからの復帰、ビュー・ページの表示などがあります。詳細は、第12.2項「タスク・フローの作成」を参照してください。

- ローカルHTML: ユーザーのモバイル・アプリケーション内にパッケージ化されるHTMLページを参照します。HelloWorldサンプル・アプリケーション(付録G「サンプルのMAFアプリケーション」を参照)で示したようなHTMLページでJavaScriptを参照できます。MAFがアプリケーション機能の実装に最適ではない場合、このコンテンツ・タイプを使用し、Cordova JavaScript APIを使用してアプリケーション機能を実装することを検討してください。JavaScript APIおよびMAFの詳細は、付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」を参照してください。

- リモートURL: Webアプリケーションへの参照。既存のWebアプリケーションをモバイル用に拡張し、さらにデバイス・サービスを拡張できます。リモート・コンテンツでは、ローカル・データ・キャッシュや、サーバー側データおよび機能の一式を提供することによって、MAF AMXおよびローカルHTMLコンテンツの両方を補完できます。リモートURL実装には、有効なWebアドレスとホストされたモバイル・アプリケーションが必要です。詳細は、第20章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

新しいアプリケーション・コンテンツを作成するには:

1. MAF機能エディタの「アウトライン」にリストされているアプリケーション機能を選択します。

2. 右マウス・ボタンをクリックし、「新」を選択します(図6-3を参照)。

図6-3 新しい機能のためのポップアップ・メニュー

3. 新規オブジェクト・ダイアログで、「コンテンツ」ノードを展開し、必要に応じて、生成されたIDに対応する次のコンテンツ・タイプのいずれかを選択し、「OK」をクリックします。

- 「AMXページ」。図6-7を参照してください。

- 「タスク・フロー」

- 「ローカルHTML」。図6-4を参照してください。

- 「リモートURL」。図6-6を参照してください。

4. コンテンツ固有のパラメータを定義します。

- AMXページの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規MAFページ・ダイアログを開きます。図6-7を参照してください。

- タスク・フローの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規MAFタスク・フロー・ダイアログを開きます。

- ローカルHTMLファイルの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規モバイルHTMLページ・ダイアログを開きます。図6-4を参照してください。

- ローカルHTMLファイルの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規モバイルHTMLページ・ダイアログを開きます。図6-4を参照してください。このファイルの親フォルダを選択し、後で使用できるように説明的なファイル名を付けます。ファイルをHTMLまたはXHTMLのいずれの形式で保存するかを選択し、「終了」をクリックします。これはアプリケーション機能なので、このページはビュー・コントローラ・プロジェクトのWeb Contentフォルダに格納されます。

図6-4 アプリケーション機能のコンテンツとしてのローカルHTMLページの作成

- リモートURLコンテンツの場合は、図6-5のように接続を選択します。これは、サーバー上のWebページのアドレス(および起動ページの場所)を表しています。

図6-5 ホスト・アプリケーションの接続の選択

この接続を作成するには、まず「作成」をクリックし、次に「URL接続の作成」ダイアログに入力します(図6-6を参照)。このダイアログの詳細は、Oracle Enterprise Pack for Eclipseのオンライン・ヘルプを参照してください。この接続は、connections.xmlファイルに格納されます。

図6-6 URL接続の作成

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

1. 新しいAMXページの親フォルダを選択します。

2. モバイル・アプリケーションでの作業時に簡単に識別できるよう説明的な名前をページに付けます。

3. 「終了」をクリックしてページを保存します。図6-7に新規MAFページ・ダイアログを示します。

図6-7 MAF AMXをコンテンツ・タイプとして選択

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

デプロイメントを可能にするために、次の属性によって参照されるすべてのリソースは、ビュー・プロジェクトのViewContentディレクトリ内に配置する必要があります。

- <adfmf:feature>のiconおよびimage属性(例: <adfmf:feature id="PROD" name="Products" icon="feature_icon.png" image="springboard.png">)。

- <adfmf:content>のiconおよびimage属性(例: <adfmf:content id="PROD" icon="feature_icon.png" image="springboard_image.png">)。第6.1項「アプリケーション機能のコンテンツ・タイプの概要」も参照してください。

- <adfmf:amx>のfile属性(例: <adfmf:amx file="PRODUCT/home.amx" />)。第6.1項「アプリケーション機能のコンテンツ・タイプの概要」も参照してください。

- <adfmf: localHTML>のurl属性(例: <adfmf:localHTML url="oracle.hello/index.html"/>)。第6.1項「アプリケーション機能のコンテンツ・タイプの概要」および第29.5.3.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"/>)。第8章「MAFアプリケーションのスキニング」も参照してください。

MAFは、別の場所から参照されるリソースをサポートしていません。つまり、たとえば、../を接頭辞として使用して、public_htmlディレクトリ外部に値を入力することはできません。

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

この章では、MAFアプリケーション・エディタとMAF機能エディタを使用してモバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義し、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

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

- 第7.1項「MAFアプリケーションのローカライズの概要」

- 第7.2項「リソース・バンドルでの文字列の入力方法」

- 第7.3項「リソース・バンドル追加時の処理」

- 第7.4項「MAF AMXコンポーネントの文字列のローカライズ方法」

- 第7.5項「MAF AMXコンポーネントのプロジェクト・レベルのリソース・バンドルを作成する場合の処理」

- 第7.6項「イメージ・ファイルのローカライズに関する必知事項」

- 第7.7項「リソース・バンドル・ファイルの編集方法」

- 第7.8項「iOSアプリケーションのXLIFFファイルに関する必知事項」

- 第7.9項「iOSアプリケーションの国際化」

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

ローカライゼーションは、テキストを変換し、ロケール固有のコンポーネントを追加することで、特定地域の言語または文化にアプリケーションを適応させるプロセスです。様々なロケールを使用するようにMAFアプリケーションとそのユーザー・インタフェース・ページを構成することにより、モバイル・デバイス上で設定された言語にあわせて作成されているかのようにMAFアプリケーションを表示することができます。たとえば、フランス語を話す人がMAFアプリケーションを閲覧できるようにすることで、MAFアプリケーションの利用の拡大を図る場合は、デバイスのSpringboardとMAFのWeb ビュー内の両方で使用されるアプリケーションのテキスト文字列とイメージがフランス語で表示されるようにアプリケーションをローカライズすることができます(つまり、productsをles produitsに変換するという具合に)。

OEPEでは、これらのテキスト・リソースの28言語への自動変換がサポートされます。OEPEでは、ロケール固有のリソースを提供する抽象クラスjava.util.ResourceBundleを使用してMAFコンポーネントのローカライズをサポートします。ローカライゼーションのサポートはOEPEのMAF実装に組み込まれていますが、デザインタイム・エディタでは自動的にはサポートされません。ローカライゼーション用のテキスト文字列を手動で入力できます。

翻訳可能な文字列(バリデータ・エラー・メッセージや属性コントロール・ヒントなど)を定義すると、定義したものがOracle Enterprise Pack for Eclipseによってプロジェクトレベルのリソース・バンドル・ファイルに格納されます。MAFでは、英語の言語テキスト・リソースを指定します(ただし他の言語では、任意のツールを使用して、リソース・バンドル・ファイルを生成できます)。変換可能なUI文字列をアプリケーション・レベルとビュー・プロジェクト・レベルの両方で格納するように、モバイル・アプリケーションを構成できます。

MAFは、ローカライゼーションにXLIFF (XML Localization Interchange File Format)ファイルのみを使用します。つまり、Oracle Enterprise Pack for Eclipseは、文字列を格納するためのリソース・バンドルとして.xlfファイルを作成します。XLIFFの詳細は、次を参照してください。

http://docs.oasis-open.org/xliff/xliff-core/xliff-core.html

7.2 リソース・バンドルでの文字列の入力方法

プロジェクト・レベルではリソース・バンドル・ファイルを作成します。このとき使用するリソース・バンドル・ダイアログにアクセスするには、MAF機能エディタまたはMAFアプリケーション・エディタを開き、「名前」フィールドの横にある外部化ボタンをクリックします。文字列の外部化ダイアログが開くので、このダイアログを使用して、表7-1および表7-2に示すmaf-application.xml属性およびmaf-feature.xml属性用のベース・リソース・バンドルにテキスト・リソースを自動的に作成することができます。

アプリケーション・レベルでは、MAFアプリケーション・エディタを使用してアプリケーション名やプリファレンス・ページのラベルなどの属性の文字列をローカライズできます。表7-1にこれらを示します。

表7-1 MAFアプリケーションのローカライズ可能な属性

要素

属性

<adfmf:Application>

name

<adfmf:PreferenceGroup>

label

<adfmf:PreferencePage>

label

<adfmf:PreferenceBoolean>

label

<adfmf:PreferenceText>

label

<adfmf:PreferenceNumber>

label

<adfmf:PreferenceList>

label

<adfmf:PreferenceValue>

name

プロジェクト(ビュー・コントローラ)レベルでは、MAF機能エディタを使用して、表7-2に示すアプリケーション機能関連の属性をローカライズできます。

表7-2 アプリケーション機能のローカライズ可能な属性

要素

属性

<adfmf:Feature>

name

<adfmf:Constraint>

value

<adfmf:Parameter>

value

<adfmf:PreferencePage>

label

<adfmf:PrefrenceGroup>

label

<adfmf:PreferenceBoolean>

label

<adfmf:PreferenceText>

label

<adfmf:PreferenceNumber>

label

<adfmf:PreferenceList>

label

<adfmf:PreferenceValue>

name

リソース・バンドルにローカライズ可能な文字列を作成するには:

1. MAF機能エディタで属性を選択し(図7-1の「名前」など)、「外部化」をクリックします。これによって文字列の外部化ダイアログが開きます。

2. リストから既存のプロパティを選択し、「OK」をクリックします。

図7-1 外部化文字列の編集ダイアログの選択

3. 文字列の外部化ダイアログ(図7-2を参照)で、「新規プロパティの作成」をクリックして新しい文字列ソースを作成します。表示値、キー、説明を入力して、「OK」をクリックします。

図7-2 外部化文字列の編集ダイアログの選択

注意:
既存の外部化された文字列を編集するには、既存のプロパティの一覧からいずれか1つを選択し、鉛筆のアイコンをクリックします。これによって外部化文字列の編集ダイアログが開きます(このダイアログでは文字列の値とその説明を変更できますが、キーは変更できません)。

7.3 リソース・バンドル追加時の処理

「テキスト・リソースの選択」ダイアログでリソースを追加すると、Oracle Enterprise Pack for Eclipseによって、指定した表示名の文字列とキー・ファイルをADF Meta-INFファイルに格納した、新しいプロジェクト・リソース・バンドルが作成されます(mafapplication.xliffを参照)。

属性を初めてローカライズすると、Oracle Enterprise Pack for Eclipseによって<adfmf:loadbundle>要素が追加されます。この要素のbasename属性が、新しく作成したリソース・バンドルを参照します。

さらにOracle Enterprise Pack for Eclipseは、ローカライズされた属性文字列を、リソース・バンドル内で定義された文字列のキーを参照するEL式に変更します。たとえば、Oracle Enterprise Pack for Eclipseは、Acme Salesというアプリケーション名属性を、「テキスト・リソースの選択」ダイアログでキーとして入力されたACME_SALES値に基づいて、name="#{acmeBundle.Acme_Sales}"に変更します。

アプリケーション・レベルではリソース・バンドル・ファイルが1つしか存在しないので、Oracle Enterprise Pack for Eclipseは、ローカライズされた各文字列を同じリソース・バンドル・ファイルに追加します。

maf-application.xmlおよびmaf-feature.xmlファイルには、それぞれadfmf:loadBundle要素が1つのみ格納されています。アプリケーションをデプロイすると、リソース・バンドルはランタイムによって想定される言語フォーマットに変換されます。

7.4 MAF AMXコンポーネントの文字列のローカライズ方法

<amx:commandButton>のtext属性のようなMAF AMXコンポーネントの属性には、リソース・バンドルを作成できます。表7-3に、これらのMAF AMX (amx)コンポーネントを示します。

表7-3 MAF AMXコンポーネントのローカライズ可能な属性

コンポーネント

属性

<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

MAF AMXコンポーネントの文字列を使用するには:

1. 図7-3のように<amx:selectOneButton>コンポーネントに定義されている値属性などの属性をAMXエディタで選択します。

図7-3 プロパティによる文字列の外部化

2. 右マウス・ボタンをクリックし、「ソース」→「文字列の外部化」を選択します。「文字列の外部化」ダイアログが表示されます(図7-4を参照)。

3. 「文字列の外部化」ダイアログで、表示名、キーを入力することで文字列リソースを編集し、「終了」をクリックします。

図7-4 リソース・バンドルへの文字列の追加

7.5 MAF AMXコンポーネントのプロジェクト・レベルのリソース・バンドルを作成する場合の処理

次の例の<amx:outputText>コンポーネントのvalue属性のように、コンポーネントをローカライズすると、Oracle Enterprise Pack for Eclipseによって文字列がEL式に変換されます(#{viewControllerBundle.NewPage_header}など)。

<amx:facet name="header">
<amx:outputText value="#{viewControllerBundle.NewPage_header}"
id="ot1" />
</amx:facet>

さらに、次のViewControllerBundle.xlfのように、Oracle Enterprise Pack for Eclipseはプロジェクトのデフォルト・パッケージの下にリソース・バンドルを作成します。生成された<amx:loadBundle>コンポーネントでは、basenameはこのパッケージを表しています。

<amx:loadBundle basename="mycomp.mobile.ViewControllerBundle"
var="viewcontrollerBundle"
id="lb1"/>

7.6 イメージ・ファイルのローカライズに関する必知事項

イメージがテキストを格納していたり、特定の国または地域を反映している場合(たとえば旗のピクチャなど)、文字列の外部化に使用する同じXLIFFファイル・プロセスを介して、ローカライゼーション・プロセスの一環として代替イメージを指定できます。図7-5を参照してください。

図7-5 XLIFFファイルでのイメージの外部化

イメージをハードコード化することはできません(例: icon="/feature1/test.png")。そのかわり、次に示すようにイメージのパスの<trans-unit>要素を追加することで、ViewControllerBundle.xlfファイルを手動で編集する必要があります。

<amx:image id="i1" source="#{viewControllerBundle.NewPage_icon2JPG}"
shortDesc="#{viewControllerBundle.NewPage_myFavoriteImage}" />
<trans-unit id="NewPage_icon2JPG">
<source>/icon2.JPG</source>
<target/>
</trans-unit>
<trans-unit id="NewPage_myFavoriteImage">
<source>My Favorite Image</source>
<target/>
</trans-unit>
<trans-unit id="IMAGEPATH">
<source>/feature1/test.jpg</source>
<target/>
</trans-unit>

注意:
前述の<source>要素で定義されているイメージの場所は、ViewController\public_htmlのアプリケーション機能ファイルの場所を基準にした相対的な場所です。または、イメージ・ファイルの名前を入力することもできます(例: <source>test.png</source>)。

ViewControllerBundle.xlfを更新すると、Oracle Enterprise Pack for Eclipseによってicon属性のソース属性のEL式が自動的に作成されます。

7.7 リソース・バンドル・ファイルの編集方法

XLIFFファイルまたはJavaクラス・ファイルを作成したら、ソース・エディタを使用して編集できます。MAFエディタのいずれかを使用する場合は、ファイル上でExternalizeコマンドを呼び出すことができます。

7.8 iOSアプリケーションのXLIFFファイルに関する必知事項

<adfmf:loadBundle>要素によって記述された場所には、1つ以上のXLIFFファイルが存在している必要があります。XLIFFファイルのファミリには、次のファイルが含まれています。

- ベースXLIFFファイル: ベースXLIFFファイルの名前は、basename属性によって指定されたパス内の最後のトークンと一致する必要があります。このファイルには.xlfという拡張子が付きます(例: ViewControllerBundle.xlf)。次の定義では、ファイルの名称はViewControllerBundleです。

<adfmf:loadBundle var="stringBundle" basename="view.ViewControllerBundle"/>

- ゼロ個以上のローカライズされたXLIFFファイル: 各ベースXLIFFファイルには、ゼロ個(以上)のローカライズされたXLIFFファイルを存在させることができます。各ファイルには次の決まりがあります。

- ファイル拡張子は.xlfである必要があります。

- 対応するベースXLIFFファイルと同じディレクトリにコロケートさせる必要があります。

- ファイル名の形式は次のようになります。

<BASE_XLIFF_FILE_NAME>_<LANGUAGE_TOKEN>.xlf

ここでは、次のようになります。

- <BASE_XLIFF_FILE_NAME>は、ベースXLIFFファイル名です(拡張子.xlfは含みません)。

- <LANGUAGE_TOKEN>の形式は次のとおりです。

<ISO-639-lowercase-language-code>

注意:
MAFは、国または地域をサポートしていません。

たとえば、スペインの場合、言語トークンはesになります。

たとえば、言語コードがen、es、frの場合、stringBundle.xlfという名前のベースXLIFFを参照するXLIFFファイルのローカライズされたファイル名は次のようになります。

- stringBundle_en.xlf

- stringBundle_es.xlf

- stringBundle_fr.xlf

7.9 iOSアプリケーションの国際化

maf-application.xmlおよびmaf-feature.xmlファイルのローカライズ可能な要素は、表7-2および表7-1に示す属性内で、ELに似た文字列を使用して国際化された文字列を参照します。これらの構成ファイルはアプリケーション・ライフサイクルの初期に読み取られるので、これらの文字列は実行時にはEL文として評価されません。そのかわり、これらの文字列は、ネイティブ・デバイス変換インフラストラクチャにおいて変換された文字列の完全なキーとして取得されます。

式言語の構文は"${BUNDLE_NAME.STRING_KEY}"ですが、MAFは"#{}"によって囲まれた文字列全体をキーとして使用して、変換された文字列を検索します。これらの文字列の形式は、#{bundleName.['My.String.ID']} (ここではXLIFF文字列がピリオドによって分割されています)と、#{bundleName.['MyStringID']} (これはピリオドによって分割されない文字列の識別子に対してのみ使用されます)になります。次の例には、#{strings.CONTACTS} (name属性を変更します)など、後者の例が示されています。iOSネイティブ・フレームワークでは、デプロイメントで、その文の内容が、変換に使用される*.stringファイル内の適切なキーと必ず一致するようになっています。

エンド・ユーザーに表示される属性、またはエンド・ユーザーに表示されるコンテンツの場所を制御する属性のみが、国際化された文字列の使用をサポートしています。そこには次のような属性が含まれています。

- <adfmf:application>要素のname属性

- <adfmf:feature>要素のname属性

- <adfmf:feature>要素のicon属性

- <adfmf:feature>要素のimage属性

- <adfmf:content>要素のicon属性

- <adfmf:content>要素のimage属性

次の例では、name、icon、image属性を持つアプリケーション機能が国際化文字列を使用しています。

<adfmf:feature id="CTCS" name="#{strings.CONTACTS}"
icon="#{strings.CONTACTS_ICON}"
image="#{strings.CONTACTS_IMAGE}">
<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="contains"
value="employee" />
</adfmf:constraints>
<adfmf:description>The HTML Device Contacts</adfmf:description>
<adfmf:loadBundle basename="mobile.adfmf-stringsBundle"
var="strings"/>
<adfmf:content id="CTCS.Generic">
<adfmf:constraints />
<adfmf:localHTML url="contacts.html" />
</adfmf:content>
</adfmf:feature>

次のように<adfmf:loadBundle>要素を定義するときに、バンドル名と実際のバンドルとのマッピングを作成します。バンドル名は、式を評価するときに使用します。

<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="contains"
value="employee" />
</adfmf:constraints>
<adfmf:description>The HTML Device Contacts</adfmf:description>
<adfmf:loadBundle basename="mobile.adfmf-featureBundle"
var="mobileBundle"/>
<adfmf:loadBundle basename="mobile.adfmf-stringsBundle"
var="strings"/>

MAFのランタイムでは、JVMに最初にアクセスするまで、<adfmf:loadBundle>要素が保持されます。メッセージがJVMに送信され、パッケージのベース名からバンドルのEL名へのマッピングが初期化されます。次の例は、JVMに送信されるメッセージの構造を示しています。

{classname:"oracle.adfmf.framework.api.Model",method:"setBundles",
params:[[{basename:"mobile.adfmf-featureBundle",elname:"mobileBundle"},
{basename:"mobile.adfmf-stringsBundle",elname:"strings"}]]}

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

この章では、スキンを使用してMAFアプリケーションの外観をカスタマイズする方法について説明します。

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

- 第8.1項「MAFアプリケーション・スキンの概要」

- 第8.2項「アプリケーションへのカスタム・スキンの追加」

- 第8.3項「アプリケーションが使用するスキンの指定」

- 第8.4項「カスタム・スキンの登録」

- 第8.5項「MAFスキンのバージョニング」

- 第8.6項「スキンのバージョニング時に行われる処理」

- 第8.7項「デフォルト・スキン・スタイルのオーバーライド」

- 第8.8項「スキニングに関する必知事項」

- 第8.9項「スキンへの新しいスタイル・シートの追加」

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

- 第8.11項「実行時の処理: エンド・ユーザーによるアプリケーション・スキンの変更方法」

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

MAFではCascading Style Sheet (CSS)言語ベースのスキンを使用するので、MAFアプリケーション内の(その要素のアプリケーション機能で使用されるものを含む)すべてのアプリケーション・コンポーネントが一貫したルック・アンド・フィールを確実に共有するようになっています。MAF AMXまたはHTMLコンポーネントを再構成してMAFアプリケーションの外観を変更するかわりに、コンポーネントの表示方法を変更するスキンを作成または拡張できます。

MAF AMXページの外観を決定するセレクタを定義するためにMAFで使用されるサポート済のスキンのファミリとバージョンは、次のとおりです。

amx
mobileAlta-1.0
mobileAlta-1.1
mobileAlta-1.2
mobileAlta-1.3
mobileFusionFx-1.0
mobileFusionFx-1.1

デフォルトで、新規作成したMAFアプリケーションでは最新バージョンのmobileAltaスキン・ファミリが使用されます。アプリケーションを以前のリリースから最新リリースに移行すると、そのアプリケーションでは移行前に使用するよう構成されていたスキンが引き続き使用されます。移行後のアプリケーションで別のスキン(たとえば最新バージョンのmobileAlta)を使用する場合は、第8.3項「アプリケーションが使用するスキンの指定」の説明に従って、maf-config.xmlファイルを編集する必要があります。

図8-1は、異なるスキンを使用して同じアプリケーション画面のレンダリングを示すことによって、mobileAltaスキン・ファミリとmobileFusionFxスキン・ファミリのルック・アンド・フィールの違いを示しています。

図8-1 mobileAltaとmobileFusionFxのルック・アンド・フィールの比較

図8-2は、これらのスキンのファミリとバージョンの継承関係を示しています。

図8-2 MAFのスキン・ファミリの継承関係

MAFアプリケーションの最初のデプロイ後に作成されるwww/cssディレクトリには、これらのCSSファイルが格納されます。このディレクトリにアクセスするには、MAFアプリケーションをシミュレータまたはデバイスにデプロイし、deployディレクトリ(例: C:\OEPE\mywork\app_name\deploy)に移動します。www\cssディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリはtemporary_xcode_projectディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(.apk)ファイルのassetsディレクトリ内にあります。

注意:
MAF DOM構造に依存するスタイルを記述しないでください。また、これらのファイル内で定義されている一部のセレクタは、サポートされていない場合があります。

maf-config.xmlファイル(第8.1.1項「maf-config.xmlファイルについて」を参照)とmaf-skins.xmlファイル(第8.1.2項「maf-skins.xmlファイルについて」を参照)を使用して、MAFアプリケーションのスキニングを制御します。maf-config.xmlファイルでは、アプリケーション・コンポーネントのレンダリングに使用するデフォルトのスキン・ファミリを指定し、maf-skins.xmlファイルでは、デフォルトのスキン・ファミリをカスタマイズしたり、新しいスキン・ファミリを定義することができます。

8.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式を使用して実行時にスキンの値を決定できます。詳細は、第8.10項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。

MAFでは階層としてスキンが適用されます。最上位にはデバイス固有のスキン、その後にプラットフォーム固有のスキン、ベース・スキンmobileAltaと続きます。MAFのmobileAltaスキン・ファミリの場合、この階層は次のように表されます。

1. mobileAlta.<DeviceModel> (例: mobileAlta.iPhone5,3)

2. mobileAlta.iOSまたはmobileAlta.Android

3. mobileAlta

図8-3は、実行時にMAFでスキンのこの階層が適用される様子をイラストレーションで示しています。SkinningDemoサンプル・アプリケーション(付録G「サンプルのMAFアプリケーション」を参照)でも、この実装を示しています。

MAFでは、この階層のデバイス固有のレベルで定義されたセレクタを優先します。つまり、MAFでは、mobileAlta.iOSで定義されたセレクタを、mobileAlta.iPhoneで定義された同じセレクタで上書きします。<extends>要素(第8.1.2項「maf-skins.xmlファイルについて」を参照)によって、この階層がMAFランタイム用に定義されます。様々なレベルでのスキンの適用方法の詳細は、第8.8項「スキニングに関する必知事項」を参照してください。

図8-3 実行時のMAFのスキン階層の適用

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

アプリケーション・コントローラ・プロジェクトのMETA-INFノードにあるmaf-skins.xmlファイルによって、既存のスキンを拡張して新しいスキンを定義したり、既存のスキンに新しいスタイル・シートを追加することができます。

デフォルトでは、このファイルは空ですが、表8-1に示されている要素によって子要素を記述します。これらの子要素をこのファイルに移入することで、mobileAltaを拡張したり、アプリケーションで使用できるCSSファイルを定義できます。新しいスキンを作成したり、既存のスキンを拡張するには、<skin>要素を使用します。

表8-1 <skin>要素の子要素

の子要素。" title="<skin>要素の子要素" width="100%">

要素

説明

<id>

maf-skins.xmlファイルのスキンを識別する必須要素。指定する値は、次のいずれかの形式に従う必要があります。

- skinFamily-version

- skinFamily-version.platform

たとえば、Apple iPadまたはiPhoneへのデプロイ時に、ユーザーのアプリケーションの外観を定義するスキンをユーザーのアプリケーションに登録するには、mySkin-v1.iOSを指定します。登録するスキンによってiPadまたはiPhoneのいずれかのデバイスのアプリケーションの外観が定義される場合、iOSはiPadまたはiPhoneによって置き換えられます。Androidプラットフォームへのデプロイ時に、アプリケーションの外観を定義するスキンを登録する場合、.androidを指定します。

<family>

スキン・ファミリを識別する必須要素。

<extends>

この要素を使用して、拡張するスキンのスキンIDを指定することによって既存のスキンを拡張します。

<skin>
<id>mySkin-v1</id>
<family>mySkin</family>
<extends>mobileAlta-v1.3</extends>
<style-sheet-name>styles/myskin.css</style-sheet-name>
<version>
<name>v1</name>
</version>
</skin>

<style-sheet-name>

MAFアプリケーションのプロジェクト内のCSSファイルの場所を指定するには、相対URLを使用します。たとえば、SkinningDemoサンプル・アプリケーションのmaf-skins.xmlファイルには、アプリケーション・コントローラ・プロジェクトのcssディレクトリのv1.cssスタイルシートへの次の参照が含まれます。

<style-sheet-name>css/v1.css</style-sheet-name>

<version>

スキンの異なるバージョンを指定します。詳細は、第8.5項「MAFスキンのバージョニング」を参照してください。

表8-2に、スタイルシートを既存のスキンに統合する場合に、MAF CSS内で<skin-addition>要素を定義するために使用できる要素を示しています。

表8-2 <skin-addition>の子要素

の要素を示しています。" title="<skin-addition>の子要素" width="100%">

要素

説明

<skin-id>

スタイルシートをさらに追加する必要があるスキンのIDを指定します。指定可能な値には、MAFによって提供されるスキン(たとえば、mobileAlta-v1.3.iOS)またはユーザーによって作成されるカスタム・スキンなどがあります。

<style-sheet-name>

MAFアプリケーションのプロジェクト内のCSSファイルの場所を指定するには、相対URLを使用します。たとえば、SkinningDemoサンプル・アプリケーションのmaf-skins.xmlファイルには、アプリケーション・コントローラ・プロジェクトのcssディレクトリのv1.cssスタイルシートへの次の参照が含まれます。

<style-sheet-name>css/v1.css</style-sheet-name>

次の例では、<style-sheet-name>要素でCSSファイルの場所を、<skin-id>でターゲット・スキン・ファミリを指定しています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-addition>
<skin-id>mobileAlta-v1.3.iOS</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
</skin-addition>
</adfmf-skins>

<skin-id>および<style-sheet-name>要素を使用して特定のiOSまたはAndroidデバイスにレンダリングしたり、これらの要素を定義してすべてのデバイスのプラットフォームに対するスタイルを処理することもできます。表8-3に、iOSプラットフォームに属するすべてのデバイス、および特定のiOSデバイス・タイプ(タブレット、電話、シミュレータ)をターゲットにするこれらの要素の使用例を示します。

ヒント:
デバイス・モデルに関する情報を取得するには、付録G「サンプルのMAFアプリケーション」に記載されているDeviceDemoサンプル・アプリケーションの使用を検討してください。

表8-3 プラットフォームおよびデバイス固有のスタイル

デバイス

例

iPhone

<skin-addition>
<skin-id>mobileAlta-v1.3.iPhone5,1</skin-id>
<style-sheet-name>iPhoneStylesheet.css</style-sheet-name>
</skin-addition>

iPad

<skin-addition>
<skin-id>mobileAlta-v1.3.iPad4,2</skin-id>
<style-sheet-name>iPadStylesheet.css</style-sheet-name>
</skin-addition>

iPhoneシミュレータ

<skin-addition>
<skin-id>mobileAlta-v1.3.iPhone Simulator x86_64</skin-id>
<style-sheet-name>iPhoneSimStylesheet.css</style-sheet-name>
</skin-addition>

すべてのiOSデバイス

<skin-addition>
<skin-id>mobileAlta-v1.3.iOS</skin-id>
<style-sheet-name>iOSSimStylesheet.css</style-sheet-name>
</skin-addition>

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

アプリケーションにカスタム・スキンを追加するには、OEPE内にCSSファイルを作成します。CSSはアプリケーションとともにデプロイするために、OEPEによりプロジェクトのソース・ファイルに配置されます。

カスタム・スキンをアプリケーションに追加する手順:

1. 「アプリケーション」ウィンドウで、ViewContentを展開し、cssフォルダを右クリックして「新」→「その他」を選択します。「新規ギャラリ」ダイアログで、「Web」を展開し、「CSSファイル」を選択します。「次へ」をクリックします。

2. ウィザードの新規CSSファイル・ページで、CSSファイルの名前を指定します。

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

Eclipseに新しいCSSファイルが開かれ、アプリケーション用のスタイルを定義できます。

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

maf-config.xmlファイルで値を構成して、アプリケーションで使用するスキンを決定します。

使用するアプリケーションのスキンを指定するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクト、adf、META-INFの順に展開し、maf-config.xmlファイルをダブルクリックしてXMLエディタで開きます。

2. maf-config.xmlファイルに、使用するスキンの<skin-family>要素、および<skin-version>要素(オプション)の値を指定します(図8-4を参照)。

図8-4 maf-config.xmlの編集

ソース・エディタにファイルを表示するには、XMLエディタの下部にある「ソース」タブをクリックします。次の例に、モバイル・アプリケーションでmobileAlta.v1.2スキンを使用するために必要な構成を示します。

<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>要素の値として設定します。詳細は、第8.10項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。

8.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. 次のフィールドのいずれかを選択し、値を次のように編集するために「コンテンツ」列に進みます。

- ファミリ: スキンのファミリ名の値を入力します。
新しい名前を入力するか、既存のファミリ名を指定できます。既存のファミリ名を指定した場合は、第8.5項「MAFスキンのバージョニング」に示すように、スキンをバージョニングして、同じファミリ値を持つスキンを区別します。

入力する値は、作成するスキンを登録するmaf-skins.xmlの<family>要素の値として設定されます。アプリケーションのmaf-config.xmlの<skin-family>要素では、実行時にこの値を使用してアプリケーションで使用されるスキンを識別します。

- ID: skinFamily-versionまたはskinFamily-version.platformのいずれかの名前書式を使用してスキンのIDを入力します。たとえば、mySkinFamily-v1.1.androidと入力します。

- 拡張対象: 拡張する親スキンの名前を入力します。たとえば、カスタム・スキンでmobileAlta-v1.2スキンを拡張する場合は、mobileAlta-v1.2と入力します。

- スタイルシート名: スタイルシートの名前を入力または選択します。

5. ファイルmaf-skins.xmlを保存します。

8.5 MAFスキンのバージョニング

<version>要素を使用して、maf-skins.xmlファイルでスキンのバージョン番号を指定できます。maf-skins.xmlファイル内の<family>要素の値が同じスキンを区別する場合はこのオプション機能を使用します。この機能は、いくつかの既存の動作を変更するために既存のスキンの新規バージョンを作成する場合に役立ちます。特定のスキンを使用するようにアプリケーションを構成する場合は、第8.3項「アプリケーションが使用するスキンの指定」に説明されているように、maf-config.xmlファイルで値を指定してください。

maf-skins.xmlファイル内の<version>要素に値を入力して、スキンのバージョンを指定します。

ベスト・プラクティス:
アプリケーションのmaf-skins.xmlファイルに登録する各スキンのバージョン情報を指定します。

1. プロジェクト・エクスプローラで、「アプリケーション・プロジェクト」→「src」→「META-INF」の順に展開し、maf-skins.xmlをダブルクリックしてXMLエディタで開きます。

2. 「設計」タブに切り替えます。skinタグを選択し、右クリックします。「子を追加」→「version」を選択します。

3. 「version」を右クリックし、「子を追加」→「default」を選択します。第8.5項「MAFスキンのバージョニング」に示すように、maf-config.xmlファイルの<skin-version>要素に値が指定されていないときアプリケーションでスキンのこのバージョンを使用する場合には、defaultタグを選択し、「コンテンツ」列に移動し、defaultの値をtrueとして設定します。

4. skinタグの下のnameタグを選択し、「コンテンツ」列に進みます。「名前」フィールドの値を入力します。たとえば、これがスキンの最初のバージョンである場合はv1と入力します。

5. ファイルmaf-skins.xmlを保存します。

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

スキン用に構成するバージョン情報は、実行時にアプリケーションでスキンが適用されるときに、プラットフォーム値およびデバイス値より優先されます。実行時に、MAFアプリケーションでは、プラットフォーム固有のスキンが適用される前にデバイス固有のスキンが適用されます。スキンのバージョン情報が指定されている場合、アプリケーションでは最初に、指定したスキンのバージョン値と一致するスキンを検索します。スキン・バージョン値およびデバイス値と一致するスキンが見つかると、アプリケーションではこのスキンが適用されます。指定したスキン・バージョンのスキンがデバイス固有のスキン内で見つからなかった場合、アプリケーションでは指定したバージョンのスキンをプラットフォーム固有のスキン内で検索します。使用可能なプラットフォーム固有のスキン内で、指定したバージョンと一致するスキンが見つからない場合、アプリケーションではベース・スキンを検索します。

次の例は、3つのスキン(customFamily-v1.iphone5,3、customFamily-v2.iPhoneおよびcustomFamily-v3.iPhone)を参照するmaf-skins.xmlの例を示しています。これらの各スキンの<family>要素は同じ値(customFamily)になっています。<version>要素の子要素の値によって、これらのスキンがそれぞれ区別されます。

実行時に、アプリケーションのmaf-config.xmlファイルにおける<skin-family>要素の値としてcustomFamilyが指定されたアプリケーションでは、customFamily-v1.iphone5,3を使用します。これは、このスキンがmaf-skins.xmlファイルでデフォルト・スキンとして構成されているためです(<default>true</default>)。この動作は、第8.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>

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

MAF AMXアプリケーションでは、MAF AMXとして実装されたアプリケーション機能に対して特定のスタイルを指定し、それによって、maf-config.xmlおよびmaf-skins.xmlファイル内のアプリケーション・レベルで設定されているデフォルトのスキン・スタイルをオーバーライドできます。アプリケーション機能に個別のスタイルを追加するには、CSSファイルを包含ファイルとして使用します。

maf-feature.xmlファイルの概要エディタの「包含」表では、MAF AMXアプリケーション機能にCSSを追加できます。

図8-5 「包含」セクション

始める前に:

第12.2項「タスク・フローの作成」の説明に従って、MAFタスク・フローを作成します。スキンのCascading Style Sheet (CSS)ファイルを作成または追加します。CSSファイルを作成するには、ビュー・コントローラ・プロジェクトのViewContentフォルダを右クリックし、「ファイル」→「新」→「その他」を選択し、フィルタにCSSと入力します。「Web」→「CSSファイル」を選択します。

アプリケーション機能にスタイルを追加するには:

1. maf-feature.xmlファイルを開きます。コンテンツ・タイプとして「AMXページ」を持つ機能があることを確認します。

2. 「アウトライン」セクションで、「機能」→機能名→「コンテンツ」→「機能ID」の順に展開し、「包含」を選択します。選択時に、「包含」セクションはエディタの右側に表示されます(図8-6を参照)。

図8-6 「スタイルシート」オプションの選択

3. 「参照」ボタンを選択し、「包含」セクションに含めるファイルを選択します。これによって、CSSスタイルシートまたはJavaScriptファイルの選択ダイアログが開きます(図8-7)。

4. ビュー・コントローラ・プロジェクトのViewContentディレクトリの下で、以前に作成したCSSファイルを選択します。

注意:
.cssファイルは、ビュー・コントローラ・プロジェクト内に配置する必要があり、アプリケーション・コントローラ・プロジェクト内に配置されている.cssファイルを含めることはできません。

図8-7 アプリケーション機能のCSSの選択

5. 変更をモバイル機能エディタに保存します。

8.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.2.iPhone</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.2.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.2.iphone.css</style-sheet-name>
</skin>
<skin>
<id>mobileAlta-v1.2.iPad</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.2.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.2.ipad.css</style-sheet-name>
</skin>
<skin>
<id>mobileAlta-v1.2.iPod</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.2.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.2.ipod.css</style-sheet-name>
</skin>
<!--  Skin Additions -->
<skin-addition>
<skin-id>mobileAlta-v1.2.iPhone</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.2.iPhone</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition2.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.2.iOS</skin-id>
<style-sheet-name>skins/mystyles.ios.addition2.css</style-sheet-name>
</skin-addition>
</adfmf-skins>

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

スキンを拡張するかわりに、CSSファイルを既存のスキンに追加できます。

新しいスタイルシートをスキンに追加するには:

1. プロジェクト・エクスプローラで、「アプリケーション・プロジェクト」→「src」→「META-INF」フォルダの順に展開し、maf-skins.xmlファイルをダブルクリックしてXMLエディタで開きます。

2. 「設計」タブに切り替えます。adfmf-skinsタグを選択し、右クリックします。「子の追加」→「skin-addition」を選択します。

- skin-additionタグの下でskin-idタグを選択します。「コンテンツ」列に移動し、新しいスタイルを追加するスキンのIDを入力します(たとえば、mobileAlta-v1.2)。

- 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の例外によってレポートされます。

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

エンド・ユーザーが実行時に他のスキンを選択できるように、アプリケーションを構成できます。エンド・ユーザーが必要により適したスキンを使用して、アプリケーションをレンダリングできるようにする場合に、この機能を構成します。

図8-8では、ボタンを表示して、エンド・ユーザーが実行時にアプリケーションで使用されるスキンを変更できるようにすることで、この機能をどのように実装するかを示しています。ページ上のボタンを構成して、後からアプリケーションのモバイル・アプリケーション・エディタでskin-familyプロパティにより評価されるscope値を設定します。

図8-8 実行時におけるアプリケーションのスキンの変更(iOSの場合)

アプリケーションのモバイル・アプリケーション・エディタでskin-familyプロパティの値の更新を可能にするコンポーネントを公開することにより、エンド・ユーザーがアプリケーションのスキンを変更できるようにします。

エンド・ユーザーが実行時にアプリケーションのスキンを変更できるようにするには:

1. モバイル・アプリケーション・エディタでスキン・ファミリ・プロパティを設定するために使用する1つ以上のコンポーネントを構成するページを開きます。

2. エンド・ユーザーが実行時に多数の使用可能なスキンの1つを選択できるようにする多数のコンポーネント(ボタン・コンポーネントなど)を構成します(図8-8を参照)。
次の例に、図8-8のようにエンド・ユーザーが実行時に使用可能なスキンを選択できるようにする、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を記述します。次の例は、エンド・ユーザーが選択した値を取得し、それをマネージドBean内のskinFamilyの値の設定に使用するメソッドを示しています。次の例は、新しいスキンを使用するためにアプリケーションのすべての機能をリセットするメソッドも示しています。

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());
}
}
}

4. プロジェクト・エクスプローラで、「アプリケーション・リソース」パネルを展開し、「ディスクリプタ」→ADF Meta-INFノードの順に展開し、maf.config.xmlファイルをダブルクリックします。

5. maf-config.xmlファイルで、EL式を記述してスキン・ファミリを動的に評価します。
<skin-family>#{applicationScope.SkinBean.skinFamily}</skin-family>

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

実行時に、エンド・ユーザーは公開されたコンポーネントを使用して、別のスキンを選択します。前述の手順2の例で、これは複数のamx:commandButtonコンポーネントのうちの1つです。このコンポーネントは、エンド・ユーザーが選択した値をマネージドBeanに発行し、次にこれがマネージドBeanのプロパティ(skinFamily)の値を設定します。実行時に、maf-config.xmlファイルの<skin-family>プロパティでは、EL式を使用してマネージドBeanから値を読み取ります。また、前述の手順3の例のマネージドBeanは、新しく指定したスキンを使用するアプリケーションに機能を再ロードします。

ヒント:
<skin-family>プロパティと同様に、EL式を使用して、実行時にmaf-config.xmlファイルの<skin-version>プロパティの値を設定できます。

アプリケーションの機能を個別にリセットして新しいスキンをロードするかわりに、次のクラスからresetApplicationメソッドを起動することもできます(次の例を参照)。

oracle.adfmf.framework.api.AdfmfContainerUtilities

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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

この章では、MAFアプリケーション・エディタとMAF機能エディタを使用してモバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義し、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

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

- 第9.1項「機能アーカイブ・ファイルの使用」

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

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

9.1 機能アーカイブ・ファイルの使用

MAFアプリケーション・エディタは、少なくとも1つのアプリケーション機能を参照します。これらのアプリケーション機能は、機能アーカイブ・ファイル(FAR)と呼ばれるJARファイルにパッケージ化されると、他のモバイル・アプリケーションが使用できる再利用可能なコンテンツを提供します。FARは本質的に、アイコンのイメージ、リソース・バンドル、HTMLファイル、JavaScriptファイル、その他の実装固有のファイルなど、アプリケーション機能が必要とするすべてのものを格納した自己完結型のコレクションです。モバイル・アプリケーションでは、1つまたは複数のFARを参照することも、何も参照しないようにすることもできます。

MAFアプリケーション・エディタを使用してFARをMAFアプリケーションに追加できます。追加されると、それに含まれる機能を参照できるようになります。参照しなければ、FAR機能は使用されません。参照する場合は、FARで使用する任意の接続を、使用するアプリケーションで設定する必要があります。FARのコンテンツはカスタマイズできず、またその個々のアーティファクトを再利用することもできません。モバイル・アプリケーションではFAR全体を利用できます。たとえば、FARのタスク・フローは、タスク・フロー・コール・アクティビティのターゲットにすることはできません。

注意:
機能アーカイブに、地理マップを使用するAMXページが含まれる場合、アプリケーションのadf-config.xmlファイルで数多くのプロパティを設定する必要があります。第13.5.18.1項「地理プロバイダ情報を指定した地理マップ・コンポーネントの構成」を参照してください。

9.1.1 アプリケーション・ライブラリとしてのFARのインポート

FARをアプリケーション・ライブラリとしてインポートして、MAFアプリケーションからその機能にアクセスできるようにすることができます。

FARをアプリケーション・ライブラリとしてインポートするには:

1. プロジェクト・エクスプローラで、最上位のアセンブリ・プロジェクトのフォルダを展開し、MAFフォルダを展開します。

2. 「MAFアプリケーション・エディタ」をダブルクリックして開きます。

3. 機能アーカイブ・フォルダを右クリックし、「新」→「機能アーカイブ」を選択します。

4. 「URI」フィールドの「参照」ボタンをクリックして、モバイル機能のアーカイブ場所ダイアログを開き、FARを配置できるURIを入力します。Oracle Enterprise Pack for Eclipseによって、選択したファイルに機能の定義が含まれているかどうかと、場所がアクセス可能かどうかが検証されます。

5. URIを指定し、Oracle Enterprise Pack for Eclipseによってそれが確認されたら、「OK」をクリックします。

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

sync-config.xmlファイルにより、モバイル・アプリケーションが、様々なタイプのWebサービス(SOAP、またはJSONペイロードによるREST)を介してアクセスされるサーバー側リソースから取得されたデータをSQLite埋込みデータベースにキャッシュできるようになるだけでなく、キャッシュ内のこのデータおよびサーバー側リソースも更新できるようになります。

ビュー・コントローラ・プロジェクトがFARとしてデプロイされると、sync-config.xmlファイルは機能アーカイブ・ファイルに含まれます。connections.xmlファイルと同様に、FARをアプリケーションに追加すると、MAFではFAR (jar-sync-config.xml)内のsync-config.xmlファイルの内容と、使用するアプリケーションのsync-config.xmlファイルの内容をマージします。sync-config.xmlファイルは、モバイル・アプリケーションで使用されるWebサービス・エンドポイントを記述しているため、FARを追加することによって、モバイル・アプリケーションを構成するアプリケーション機能によって使用されるすべてのWebサービスのエンドポイントを更新できます。

FARをアプリケーションに追加すると、MAFでは、アプリケーションのsync-config.xmlファイルおよびconnections.xmlファイルを確認し、必要に応じて変更するように求めるメッセージがログに記録されます。図9-1に示すように、これらのメッセージは、使用するアプリケーションのsync-config.xmlファイルの状態を反映します。

図9-1 メッセージ・ログ

使用するアプリケーションに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 Feature 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.}

使用するアプリケーションのconfig-sync.xmlファイルの<ServerGroup>定義が、FAR内の対応するconfig-sync.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

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

FARをビュー・コントローラ・プロジェクトとして追加する場合:

- MAFは、インポートしたFARと同じ名前のビュー・コントローラ・プロジェクトを生成します。このビュー・コントローラ・プロジェクトには、MAFビュー・コントローラ・プロジェクトのデフォルトの構造およびメタデータ・ファイルが含まれています。特に、FARビュー・コントローラ・プロジェクトには、maf-feature.xmlファイルが含まれています。MAFアプリケーションに他のビュー・コントローラ・プロジェクトが含まれている場合、いずれのプロジェクトにもIDが同じアプリケーション機能が含まれていないことを確認する必要があります。

- ライブラリとしてインポートしたFARと同様に、機能アーカイブJARにあるconnections.xmlファイル内の情報は、使用するアプリケーションのconnections.xmlファイルにマージされます。ターゲット・アプリケーションにconnections.xmlファイルが存在しない場合、MAFではこのファイルが作成されます。同様に、sync-config.xmlファイルは、使用するアプリケーションのsync-config.xmlファイルにマージされます。

- MAFでは、FARに含まれる.classおよびJARファイルをビュー・コントローラ・プロジェクトでライブラリとして使用できるように、これらをそのlibディレクトリ(C:\workspace\application\FAR view controller project\libなど)にコピーします。MAFでは、これらのファイルをclassesFromFar.jarというファイルにコンパイルします。

- ライブラリとしてインポートしたFARとは異なり、ビュー・コントローラ・プロジェクトのファイルはカスタマイズできます。

- ライブラリとしてインポートしたFARと同様に、FARのmaf-feature.xmlファイル内で宣言されたすべてのアプリケーション機能は、使用するアプリケーションで使用できるようになります。

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

FARのリソースをアプリケーションで使用可能にするためには、FARの名前とその機能参照IDが両方ともグローバルに一意である必要があるため、maf-application.xmlファイル内に機能参照IDの重複がないことを確認してください。FARの内部では、DataControl.dcxファイルが一意のパッケージ・ディレクトリ内に存在する必要があります。これらのパッケージ・ディレクトリのデフォルト名をそのまま使用するのではなく、プロジェクト用に一意のパッケージ階層を作成する必要があります。さらに機能参照IDについても、同じようなパッケージ・ネーミング・システムを使用する必要があります。

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

この章では、MAFに用意されているコア・プラグインを有効にしてMAFアプリケーションで使用する方法、追加プラグインを登録する方法、FARからプラグインをインポートする方法、MAFアプリケーションのプラグインをパッケージ化してデプロイする方法、およびプラグインをチーム作業環境で使用する方法について説明します。

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

- 第10.1項「MAFアプリケーションでのプラグイン統合の概要」

- 第10.2項「MAFアプリケーションでのコア・プラグインの有効化」

- 第10.3項「MAFアプリケーションでの追加プラグインの登録」

- 第10.4項「Cordovaレジストリからのプラグインの使用」

- 第10.5項「チーム環境での外部プラグインの使用」

- 第10.6項「MAFアプリケーションでのプラグインの使用」

- 第10.7項「MAFアプリケーション組込みプラグインのデプロイ」

- 第10.8項「FARからのプラグインのインポート」

10.1 MAFアプリケーションでのプラグイン統合の概要

MAFには様々なCordovaプラグインがパッケージ化されているので、MAFアプリケーションはこのプラグインを使用してデプロイ先のデバイスと対話できます。MAFに用意されているデフォルトのプラグインはコア・プラグインと呼ばれます。これらのプラグインは、図10-1に示すとおり、MAFアプリケーション・エディタで確認できます。たとえば、MAFアプリケーションでデバイスの電子メール機能やコンタクト先機能へのアクセスに使用する電子メールプラグインやコンタクト先プラグインなどがあります。

MAFには、プラグインを使用するMAFアプリケーション用に、次のバージョンのApache Cordovaが含まれています。

- AndroidプラットフォームのMAFアプリケーション用Apache Cordova 3.6.3

- iOSプラットフォームのMAFアプリケーション用Apache Cordova 3.7.0

各プラグインの説明を表示するには、「コア・プラグイン」リスト(図10-1を参照)でプラグインを選択します。新規作成したMAFアプリケーションでは、1つのコア・プラグイン(ネットワーク情報プラグイン)のみがデフォルトで有効になっています。第10.2項「MAFアプリケーションでのコア・プラグインの有効化」の説明に従って、これらのコア・プラグインを有効にします。

注意:
iOSデバイス上のすべてのアプリケーションにネットワーク・アクセスがデフォルトで許可されます。この動作は変更できません。Androidデバイスにデプロイするアプリケーションについては、Androidデバイス上でネットワーク・アクセスを許可しない場合、ネットワーク情報プラグインを無効にします。

MAFに用意されているデフォルトのコア・プラグインではMAFアプリケーションの要件を満たさない場合は、独自に開発した追加プラグインを登録できます。詳細は、第10.3項「MAFアプリケーションでの追加プラグインの登録」を参照してください。

CordovaレジストリからCordovaプラグインを登録できます。詳細は、第10.3項「MAFアプリケーションでの追加プラグインの登録」を参照してください。

Cordova対応の共有プロジェクトを使用して、チーム環境でプラグインを利用できます。詳細は、第10.5項「チーム環境での外部プラグインの使用」を参照してください。

追加プラグインを登録するとMAFアプリケーションがデプロイできなくなる場合、MAFアプリケーションで使用されているプラグイン間でファイル名が競合している可能性があります。詳細は、第10.7項「MAFアプリケーション組込みプラグインのデプロイ」を参照してください。

以前のリリースのMAFで作成したMAFアプリケーションを移行する場合は、アプリケーションで使用されているすべてのプラグインをMAFアプリケーション・エディタに登録する必要があります。詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールの以前のリリースからのプラグインの移行に関する項を参照してください。

BarcodeDemoサンプル・アプリケーション(付録G「サンプルのMAFアプリケーション」を参照)には、外部プラグインを含め、プラグインの使用例が用意されています。

図10-1 MAFアプリケーション・エディタのプラグイン

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

新規作成したMAFアプリケーションでは、1つのコア・プラグイン(ネットワーク情報プラグイン)のみがデフォルトで有効になっています。他のコア・プラグインを有効または無効にして、関連するデバイスの機能にMAFアプリケーションがアクセスできるようにしてください。

有効化されたプラグインのみがデプロイされるため、デプロイ済アプリケーションのサイズは最小限に維持されます。

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

MAFアプリケーション・エディタを使用してコア・プラグインを有効にします。

MAFアプリケーションでコア・プラグインを有効にする手順:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクト・フォルダを展開し、次にMAFを展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

2. 「アウトライン」の下のエディタで、「コア・プラグイン」を展開してプラグイン有効化を選択します。アプリケーションに対してすでに有効化されているプラグインがリストされます。

3. をクリックしてモバイル・プラグイン選択ダイアログを開き、使用するコア・プラグインを選択します。「OK」をクリックします。
たとえば、MAFアプリケーションでSMSメッセージを送信できるようにするには、SMSプラグインを選択します。

4. MAFアプリケーション・エディタのプラグイン有効化領域でコア・プラグインが選択された状態で、そのプラグインをAndroidまたはiOS (あるいはその両方)で使用できるように選択します。変更を保存します。
メモを追加することもできます(プラグインは有効になっているがそれに関連付けられた機能がないなど)。

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

MAFアプリケーション・エディタでコア・プラグインを有効にすると、そのプラグインがエディタのプラグイン有効化にリストされます。プラグイン有効化領域の「使用を宣言している登録された機能」で、選択されたプラグインを使用しているアプリケーションの機能を確認できます。

プラグインは、各機能とともに使用可能で、MAF機能エディタのプラグイン使用にリストされます。

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

MAFに用意されたコア・プラグインでは提供されていない機能がMAFアプリケーションで必要な場合は、MAFアプリケーションに追加プラグインを登録します。追加プラグインにはファイルの場所またはワークスペースを基準とする場所からアクセスするため、外部プラグインとして外部ファイルを使用できます(ZIPファイルやワークスペースを基準とする場所など)。

追加プラグインを登録したら、そのプラグインを使用可能にしてMAFアプリケーションにデプロイできます。これがサード・パーティ・プラグインをアプリケーションで使用する最初の手順です。

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

MAFアプリケーション・エディタを使用して、MAFアプリケーションで使用する追加プラグインを登録します。

アクセス可能なファイルの場所(ダウンロード済のZIPなど)に格納されているプラグインを使用することも、ワークスペースを基準として外部プラグインを参照している場所を入力することもできます。

MAFアプリケーションに外部プラグインを登録する手順:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクト・フォルダを展開し、次にMAFを展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

2. 「アウトライン」の下のエディタで、「外部プラグイン」を右クリックして「新」→外部Cordovaプラグインを選択します。

3. 「URI」にプラグインの場所を入力します。をクリックしてモバイル・プラグインの場所ダイアログを開きます。Eclipseワークスペース・コンテナを入力するか、プラグインを含む外部フォルダに移動します。

4. URIのコンテンツが変更されている場合にプラグインを再検査して情報を更新するには、をクリックします。これにより、現在のプラグインのメタデータから使用可能な情報が取得されます。次のものが含まれます。

- ID

- 名前

- 説明

- バージョン

- プラットフォームのサポート。これは、必要に応じてプラットフォームの可用性をオーバーライドするように編集できます。

- メモ。アプリケーションに登録した履歴を確認しやすくするなど、様々な目的で情報を追加できます。

10.3.2 MAFアプリケーションに外部プラグインを登録する場合の処理

MAFアプリケーション・エディタで外部プラグインを有効にすると、そのプラグインがエディタのプラグイン有効化にリストされます。プラグイン有効化領域の「使用を宣言している登録された機能」で、選択されたプラグインを使用しているアプリケーションの機能を確認できます。

プラグインは、各機能とともに使用可能で、MAF機能エディタのプラグイン使用にリストされます。

図10-2 MAFアプリケーション・エディタの追加プラグイン

10.4 Cordovaレジストリからのプラグインの使用

CordovaレジストリからCordovaプラグインを使用できるようにするApache Cordovaプロジェクトを作成できます。

次のようにいくつかの手順があります。

1. チームで共有できる場所に、Apache Cordova用に構成されたプロジェクトを作成します。

2. リポジトリからプラグインを追加します。

3. MAFアプリケーションのアセンブリ・プロジェクトに共有プロジェクトを追加します。

4. MAFアプリケーション・エディタで共有プロジェクトに外部プラグインを追加します。

10.4.1 Cordovaレジストリからプラグインを使用する方法

始める前に、レジストリ(場所はhttp://plugins.cordova.io)から使用するプラグインのプラグインIDまたはリポジトリURIを取得してください。たとえば、Cordova Geolocationプラグインの場合、プラグインIDはorg.apache.cordova.geolocationで、リポジトリURIはhttps://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.gitです。

また、Apache Cordovaのプロジェクトを構成するため、Cordova CLIをインストールしてパス上に配置する必要があります。詳細は、http://cordova.apache.orgを参照してください。

プラグイン用に共有プロジェクトを設定する手順:

1. プラグイン用に新しいCordovaプロジェクトを作成します。プロジェクト・エクスプローラでいずれかのプロジェクトを右クリックし、「新」→Apache Cordovaプロジェクトを選択します。これにより、プロジェクト・エクスプローラにファイルとフォルダの空のセットが作成されます。

2. 新規Apache Cordovaプロジェクト・ダイアログで、プロジェクトの名前を入力し、適切な場所を指定します。「終了」をクリックします。

3. プロジェクト・エクスプローラで、新しいプロジェクトを右クリックし、Cordova→レジストリからのプラグインの追加を選択します。

4. Cordovaプラグインの追加ダイアログ(図10-3を参照)で、プラグインを指定します。

図10-3 レジストリからのプラグインの使用

次のいずれかを使用できます。

- Apache CordovaレジストリにあるプラグインのプラグインID。

- プラグインのリポジトリURI。

Cordovaプラグインの追加ダイアログには、外部ブラウザでレジストリを開くためのリンクがあります。プラグインを検索したり、プラグインIDまたはリポジトリURIをコピーできます。

「実行」をクリックします。ダイアログに結果がリストされます。成功したら、「閉じる」をクリックします。

5. MAFアプリケーションでプラグインを使用するには、プロジェクト・エクスプローラでアセンブリ・プロジェクトを右クリックし、「プロパティ」を選択します。

6. 「プロパティ」ダイアログで、「モバイル・アプリケーション・フレームワーク」を選択し、「プロジェクト」タブを選択します。Apache Cordovaプロジェクトをプロジェクトのリストに追加します。「OK」をクリックします。
Eclipseワークスペース・コンテナ・オプションを使用して外部プラグインを登録した場合、この手順は自動的に実行されます。

7. MAFアプリケーションのアセンブリ・プロジェクトで、「外部プラグイン」を右クリックし、「新」→外部Cordovaプラグインを選択します。Apache Cordovaプロジェクトに移動して、MAFアプリケーションで有効化するプラグインを選択します。

10.4.2 Cordovaレジストリからプラグインを使用する場合の処理

MAFアプリケーション・エディタでレジストリからのプラグインを有効にすると、そのプラグインがエディタのプラグイン有効化にリストされます。プラグイン有効化領域の「使用を宣言している登録された機能」で、選択されたプラグインを使用しているアプリケーションの機能を確認できます。

プラグインは、各機能とともに使用可能で、MAF機能エディタのプラグイン使用にリストされます。

10.5 チーム環境での外部プラグインの使用

チーム環境で作業しており、共有の場所からApache Cordovaレジストリの外部プラグインにアクセスする場合、使用しているワークステーションの構成方法に応じて、すべてのユーザーが使用できるApache Cordovaプロジェクトからそれを実行します。

これによって、チーム環境で役割分離が可能となり、ある開発者は共有フォルダを使用してアプリケーションで有効なプラグインを指定する作業をしながら、別の開発者は第10.6項「MAFアプリケーションでのプラグインの使用」の説明に従って機能の開発に従事できます。

10.5.1 チーム環境で外部プラグインを使用する方法

第10.4.1項「Cordovaレジストリからプラグインを使用する方法」の指示に従います。プロジェクトは、すべてのユーザーが使用できるように、ソース・コントロールにある共有の場所に作成できます。

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

MAFアプリケーションのプラグインは、MAF機能エディタを使用してアプリケーション機能に関連付けることで使用します(図10-4を参照)。その後、MAFアプリケーション・エディタでプラグインがアプリケーションに対して有効になっていることを確認します。

図10-4 機能でのプラグインの使用

10.6.1 登録された機能のプラグインを指定する方法

MAF機能エディタを使用してプラグインを機能に関連付けます。

MAF機能エディタでのプラグイン使用は、様々なユーザーがアプリケーションで有効なプラグインを指定し、機能でプラグインを使用するチーム環境で役立ちます。

機能で使用するプラグインを指定する手順:

1. プロジェクト・エクスプローラで、ビュー・プロジェクト・フォルダを展開し、次にMAFを展開し、「MAF機能エディタ」をダブルクリックします。

2. 「アウトライン」の下のエディタで、プラグインを使用する機能を選択し、プラグイン使用を選択します。

3. ページのプラグイン使用領域で、をクリックしてモバイル・プラグイン選択ダイアログを開きます。

4. アプリケーションに登録されているプラグインのリストから、適切なものを選択して「OK」をクリックします。

5. プラグインのプラットフォームとして使用できるAndroidまたはiOS (あるいはその両方)を選択します。登録されたプラグインで特定のプラットフォームが禁止されている場合、それを選択することはできません。変更を保存します。

6. MAFアプリケーション・エディタに戻ります。プロジェクト・エクスプローラで、アセンブリ・プロジェクト・フォルダを展開し、次にMAFを展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

7. 「アウトライン」の下のエディタで、プラグイン有効化を選択してをクリックします。これにより、登録された機能によって使用することが宣言されているすべてのプラグインが、アプリケーションで有効になります。

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

MAFアプリケーション組込みプラグインのデプロイメントは、選択したデプロイメント方法によって異なります。

FARへのデプロイメント

FARへのデプロイメントには、jar-maf-plugins.xmlというアプリケーションのプラグイン情報のコピーが含まれます。これにより、OEPEとJDeveloper間の移植が可能になります。

モバイル・アプリケーション・アーカイブ・ファイルへのデプロイメント

モバイル・アプリケーション・アーカイブ・ファイルへのデプロイメントには、すべてのpath属性が空の文字列に設定されたoepe-maf-plugins.xmlファイルから生成されたアプリケーションのmaf-plugins.xmlファイルのコピーが含まれます。

AndroidまたはiOSデプロイメント・プロファイルを使用したデプロイメント

AndroidまたはiOSデプロイメント・プロファイルを使用してデプロイする場合は、OEPEがmaf-helperコマンドライン・ツールを起動して、構成済プラグインをデプロイします。maf-helperコマンドライン・ツールでは、プラグイン・アーティファクトがそれぞれのソースの場所からAndroidまたはiOSのデプロイメント・フォルダにデプロイされます。コマンドライン・ツールでプラグインがデプロイされると、デプロイメントではそのプラグインをプラットフォーム固有のアプリケーションに組み込みます。

10.8 FARからのプラグインのインポート

FARをインポートする場合、どのプラグインをインポートし、どのプラグインを無視するかを選択できます。この方法で、インポートしたプラグインを、使用するアプリケーションのプラグインのリストにマージできます。詳細は、第9.1項「機能アーカイブ・ファイルの使用」を参照してください。

10.8.1 FARからプラグインをインポートする方法

これはMAF機能エディタで実行します。

FARからプラグインをインポートする手順:

1. MAF機能エディタで、第9.1.1項「アプリケーション・ライブラリとしてのFARのインポート」の説明に従ってFARをインポートします。

2. インポートしたFARのノードを展開して「プラグイン」を選択すると、アーカイブで宣言されているプラグインが図10-5のようにリストされます。

図10-5 インポートしたFARのプラグイン

外部プラグインは次の3つのノードの下にリストされます。

- 新: これらは、FARで定義されているが、使用するアプリケーションで等価性がないプラグインです。

- 等価: 等価プラグインは、プラグインIDがアプリケーションにすでに登録されているものと一致するプラグインです。特定のランタイム用のコア・プラグインは、常に等価になります。

- 無視: これらは、無視するように選択されているプラグインです。

次の2つの条件が両方とも満たされると、FARプラグインに検証エラーが表示されます。

- アプリケーションで1つ以上のFAR機能が使用されています。

- すべてのプラグインが等価でも無視でもありません。

3. プラグインを無視するには、それを選択してをクリックします。これでプラグインはアプリケーションで使用できなくなります。
使用中のFAR機能が無視されたプラグインに依存している場合、通常、アプリケーションは実行時に失敗します。

4. 新しいプラグインをインポートするには、をクリックします。これにより、Cordovaプラグインの選択ダイアログが開き、プラグインのソースURIを参照できます。有効ではない可能性のあるプラグインを選択すると(Cordovaのバージョンが予期されたバージョンより古い場合など)、続行するかどうかを決定できるようにOEPEによって警告が出力されます。
これで、アプリケーションでプラグインを使用できるようになります(第10.3項「MAFアプリケーションでの追加プラグインの登録」を参照)。

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

この章では、MAFアプリケーション・エディタとMAF機能エディタを使用してモバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義し、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

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

- 第11.1項「MAFアプリケーションでのライフサイクル・イベント・リスナーの使用について」

- 第11.2項「アプリケーション機能ライフサイクル・リスナー・クラスについて」

11.1 MAFアプリケーションでのライフサイクル・イベント・リスナーの使用について

MAFランタイムでは、クラスが様々なLifeCycleListenerメソッドを実装して、ネイティブ・オペレーティング・システムのフレームワークからJVMに送信されるイベント通知を伝達します。これらのイベント通知は、モバイル・アプリケーションと埋込みのアプリケーション機能の両方の様々な状態(起動、停止または休止)について記載しています。MAFは、汎用的な起動メッセージを使用して、JVMでクラス関数を呼び出します。

MAFアプリケーション・エディタおよびMAF機能エディタでは、イベント発生時にMAFがコールするライフサイクル・リスナー・クラスを宣言的に追加できます。

モバイル・アプリケーションを作成すると、OEPEによって、アプリケーション用のLifeCycleListenerImpl.javaというライフサイクル・リスナー・クラスが作成されます。このファイルを使用して、特定のメソッドを実装できます(第25章「通知の有効化と使用方法」を参照)。Lifecycle Eventsサンプル・アプリケーションでは、MAFアプリケーション・エディタおよびMAF機能エディタの両方でイベント・リスナー・クラスを宣言する例が提供されます。

このサンプル・アプリケーションを操作するには、「ファイル」→「新規MAFサンプル」を選択し、LifecycleEventsを選択し、「終了」をクリックします。

11.1.1 モバイル・アプリケーションのイベント

アプリケーション・ライフサイクル・イベントを実行するには、モバイル・アプリケーションのライフサイクル・リスナー・クラスで、次の例に示すとおりLifeCycleListenerインタフェースのstart、stop、activateおよびdeactivateメソッドを実装する必要があります。

package oracle.adfmf.application;

public interface LifeCycleListener
{
void start();
void stop();
void activate();
void deactivate();
}

注意:
アプリケーション・ライフサイクル・リスナーは、匿名ユーザーによって実行されます(つまり、そのリスナーのメソッドにはどのユーザーも関連付けられず、セキュアなWebサービスもコールされません)。

次の例のAppListenerクラスでは、イベントを開始または停止するためにLifeCycleListenerメソッド・コールを使用します。また、アプリケーションを休止させる(deactivate)場合や、休止から戻す(activate)場合にも、これらのメソッド・コールを使用します。詳細は、第11.1.2項「モバイル・アプリケーション・イベントのタイミング」を参照してください。Oracle Mobile Application Framework Java APIリファレンスでLifeCycleListenerインタフェースも参照してください。

package some.package;
import oracle.adfmf.application.LifeCycleListener;

public class AppListener implements LifeCycleListener
{
public AppListener()
{
super();
}
public void start()
{
// Perform application startup tasks...
}
public void stop()
{
// Perform tasks to stop the application...
}
public void activate()
{
// Perform appplication activation tasks...
}
public void deactivate()
{
// Perform application deactivation tasks...
}
}

LifeCycleEventsサンプル・アプリケーション(付録G「サンプルのMAFアプリケーション」を参照)のアプリケーション・コントローラ・プロジェクトには、LifeCycleListenerインタフェースを実装するクラス(LifeCycleListenerImpl.java)があります。

注意:
起動ライフサイクル・コードを実行する前に、マネージドBeanとデータ・バインディングを初期化する必要があります。

11.1.2 モバイル・アプリケーション・イベントのタイミング

MAFは、モバイル・アプリケーションの起動時、シャットダウン時、休止時における特定のタイミングでアプリケーション・ライフサイクル・メソッドをコールします。表11-1は、これらのメソッドがコールされるタイミングと、各イベントに対応するObjective-Cを示しています。

表11-1 MAFライフサイクル・メソッド

メソッド

タイミング

いつコールされるか

使用方法

iOSアプリケーション委任メソッドとの関係

start

モバイル・アプリケーションがアプリケーション機能を完全にロードした後、ユーザーに最初のアプリケーション機能またはSpringboardを表示する直前にコールされます。これはブロック化コールです。

アプリケーションの処理が開始されたとき。

次の使用方法があります。

- モバイル・アプリケーションの更新があるかどうかを確認する。

- ローカル・データベースにデータをダウンロードするよう、リモート・サーバーにリクエストする。

このイベントは特定のアプリケーション委任メソッドには対応していません。maf-application.xmlファイルとmaf-feature.xmlファイルのロード後、スプラッシュ画面が非表示になる直前にコールされます。

stop

モバイル・アプリケーションがシャットダウンを開始するときにコールされます。

アプリケーションの処理が終了したとき。

次の使用方法があります。

- 任意のリモート・サービスからログオフする。

- アプリケーションが終了する前に、データの変更をサーバーにアップロードする。

アプリケーション委任のapplicationWillTerminate:メソッド内でコールされます。

activate

モバイル・アプリケーションをバックグラウンドにある(休止)状態からアクティブ化するときにコールされます。これはブロック化コールです。

startメソッドがコールされた後。

次の使用方法があります。

- キャッシュ・ストアを読み取り、再移入する。

- Webサービス・リクエストを処理する。

- 必要なリソースを取得する。

- チェックポイントを適用する。詳細は、第11.1.3項「アクティブ化および非アクティブ化メソッドを使用したアプリケーションの状態の保存」を参照してください。

アプリケーション委任のapplicationDidBecomeActive:メソッド内でコールされます。

deactivate

モバイル・アプリケーションを非アクティブ化し、バックグラウンドに移動する(休止)ときにコールされます。これはブロック化コールです。

stopメソッドがコールされる前。

次の使用方法があります。

- リストア可能な状態を書き込む。

- チェックポイントを適用する。詳細は、第11.1.3項「アクティブ化および非アクティブ化メソッドを使用したアプリケーションの状態の保存」を参照してください。

- データベース・カーソルとデータベース接続を閉じる。

アプリケーション委任のapplicationWillResignActive:メソッド内でコールされます。

11.1.3 アクティブ化および非アクティブ化メソッドを使用したアプリケーションの状態の保存

チェックポイントの適用によってアプリケーションの状態が保存されるため、ユーザーは、チェックポイント・エントリをactivateおよびdeactivateメソッドに追加することによって、休止前にアクティブであったモバイル・アプリケーションの最後のページを引き続き使用できます。ライフサイクル・リスナーは、activateクラスに追加されたチェックポイント・エントリを読み取り、アプリケーションが休止から戻った後、処理を再開できるようにします。ユーザーは再度ログインする必要がなくなるため、アプリケーションを中断することなく引き続き使用できます。休止中にアプリケーションが終了した場合、deactivateメソッドの一部として、チェックポイント情報をデータベースまたはデバイスのキャッシュ・ディレクトリに書き込むよう指定することによって、アプリケーションを再開できるようになります。アクティブ化中にこのチェックポイント情報を読み取ることによって、アプリケーションが同じページから再開されます。

11.2 アプリケーション機能ライフサイクル・リスナー・クラスについて

モバイル・アプリケーション機能ライフサイクル・リスナー・クラス(次の例のFeatureListenerPhoneListなど)では、LifeCycleListenerインタフェースのactivateおよびdeactivateメソッドを実装する必要があります。

package oracle.adfmf.feature;
public interface LifeCycleListner
{
void activate();
void deactivate();
}

次の例は、FeatureListenerPhoneListと呼ばれるクラスを示しています。このクラスでは、LifeCycleListenerを実装することで、activateおよびdeactivateメソッドを使用してアプリケーション機能を表示/非表示にします(表11-2を参照)。これらのメソッドでは、アプリケーション機能をアプリケーションの休止時に非表示にしたり、休止から戻ったときに表示したりできます。

注意:
Oracle Mobile Application Framework Java APIリファレンスで説明されているように、activateおよびdeactivateメソッドはブロック化コールです。これらのメソッドは、完全に実行されるまで、ユーザー・インタフェースを停止させるので、実行時間の長い処理がこれらのメソッドに含まれている場合は、別のアプリケーション機能のアクティブ化に遅延が生じます。アプリケーションにおいて実行時間の長い処理がアプリケーションの非アクティブ化の前に完了しなくてもよい場合は、その処理をこれらのメソッドに含めるのでなく、バックグラウンド・スレッドに含めてください。

package some.package;
import oracle.adfmf.feature.LifeCycleListener;
public class FeatureListenerPhoneList implements LifeCycleListener
{
public FeatureListenerPhoneList()
{
super();
}
public void activate()
{
// Perform application activation tasks...
}
public void deactivate()
{
// Perform application deactivation tasks...
}
}

ヒント:
LifeCycle Eventsサンプル・アプリケーションでは、Feature1Handler.javaおよびFeature2Handler.javaファイルにより、アプリケーション機能レベルでLifeCycleListenerインタフェースを使用する例が提供されています。これらのファイルは、ビュー・コントローラ・プロジェクトのApplication Sourcesフォルダ内にあります。

11.2.1 アプリケーション機能のライフサイクルでイベントをアクティブ化および非アクティブ化するタイミング

アプリケーション機能ライフサイクル・リスナー・クラスを実装することによって、アプリケーション機能で、applicationScope変数や、アプリケーション機能が非アクティブ化されたときに変更されたアプリケーション機能固有の変数に対する、すべてのデータ変更を自動的に取得できるようになります。表11-2は、アプリケーション機能に対してactivateイベントおよびdeactivateイベントを実行するタイミングを示しています。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

表11-2 アプリケーション機能に対するactivateおよびdeactivateメソッド

メソッド

タイミング

いつコールされるか

使用方法

activate

現在のアプリケーション機能がアクティブ化される前にコールされます。

ユーザーがモバイル・アプリケーションの起動後に初めてアプリケーション機能を選択したとき、またはアプリケーション機能が再選択されたとき(つまり、フォアグラウンドに戻されたとき)にコールされます。

次の使用方法があります。

- applicationScope変数を読み取る。

- 最初のMAF AMXビューにおける現在の行を設定する。

deactivate

次のアプリケーション機能がアクティブ化される前、またはアプリケーション機能が終了する前にコールされます。

ユーザーが別のアプリケーション機能を選択したときにコールされます。

たとえば、deactivateイベントを使用して、applicationScope変数や、次のアプリケーション機能が使用するその他の状態情報を記述できます。

11.2.2 スライディング・ウィンドウの有効化

oracle.adfmf.framework.api.AdfmfSlidingWindowUtilitiesインタフェースをアプリケーション・ライフサイクル・リスナー(ALCL)に実装することにより、アプリケーション機能をスライディング・ウィンドウとして使用できます。このウィンドウは、ナビゲーション・バーまたはSpringboard内に表示される他のアプリケーション機能と同時に表示されます。スライディング・ウィンドウは、アプリケーション内に常に存在しているコンテンツ(グローバル・ツール・バー)を表示するために使用したり、一時的な(ポップアップ)コンテンツ(ヘルプ・ウィンドウなど)を表示するために使用したりできます。Springboardまたはナビゲーション・バー内でアプリケーション機能を表示する方法の詳細は、第5.1項「MAFアプリケーションの表示動作の概要」を参照してください。AdfmfSlidingWindowUtilities APIのメソッドを使用する方法の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

12 MAF AMXページの作成

この章では、MAFアプリケーション・モバイルXML (MAF AMX)アプリケーション機能の作成方法について説明します。

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

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

- 第12.2項「タスク・フローの作成」

- 第12.3項「ビューの作成」

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

MAF AMXは、サポートされるすべてのプラットフォームで動作が同一となるアプリケーション機能を作成できる一連のUIコンポーネントを提供するモバイル・アプリケーション・フレームワーク(MAF)内のサブフレームワークです。MAF AMXでは、ページ・エディタへのドラッグにより、UIコンポーネントを宣言的に使用できます。一般的なMAF AMXアプリケーション機能には、様々なパス経由でナビゲートできる、相互に接続されたいくつかのページが含まれます。

MAF AMXアプリケーション機能を使用すると、一緒に使用することでアプリケーションの機能を実行できる2種類のオブジェクトを作成できます。

- 定義した機能を実行し、ユーザー用に情報を表示するビュー

- 作成する各ビューによるユーザーのナビゲーションを定義するタスク・フロー

注意:
モバイル・デバイスのインタフェースを開発する際には、画面領域が非常に限られているということを常に意識する必要があります。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

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

- 第2.2.5項「MAF AMXページの作成」

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

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

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

注意:
MAF機能エディタを使用してアプリケーションの一部としてオブジェクトを作成する場合、OEPEにより、後で変更できないオブジェクトのIDが作成されます。

12.2 タスク・フローの作成

タスク・フローにより、MAF AMXページ間のナビゲーションを定義できます。OEPEのアプリケーション・ワークスペース(第2.2項「MAFアプリケーションの作成」を参照)を使用して、タスク・フローを設計することにより、MAF AMXアプリケーション機能のユーザー・インタフェースの作成を開始できます。MAF AMXでは、ナビゲーション・ケースおよびルールを使用してタスク・フローを定義します。これらの定義は、task-flow-definition.xmlというデフォルト名のファイルに格納されています(第12.2.3項「task-flow-definition.xmlファイルに関する必知事項」を参照)。

NavigationというMAFサンプル・アプリケーション(「ファイル」→「新」→「MAFサンプル」を選択してから「Navigation」を選択)には、循環ナビゲーション、ルーターなど様々なナビゲーション技術の使用方法が示されています。

MAFでは、バインド・タスク・フローとバインドなしタスク・フローの両方を持つMAF AMXアプリケーション機能を作成できます。12.2.12項「バインド・タスク・フローとバインドなしタスク・フローに関する必知事項」で説明しているとおり、バインド・タスク・フローはタスク・フロー定義とも呼ばれ、アプリケーションの再利用可能な部分を表します。MAFでは、バインド・タスク・フローにはエントリ・ポイントが1つありますが、終了ポイントはありません。バインド・タスク・フローには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。バインド・タスク・フローのその他の特性には、入力パラメータの受け取り(第12.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照)と、戻り値の生成(第12.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照)が含まれます。

独自のアプリケーション機能のバインド・タスク・フローを作成するには、MAF AMXタスク・フロー・デザイナを使用します。このツールにはダイアグラマ(第12.2.4項「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)が含まれており、ここで、パレットからアクティビティと制御フロー(第12.2.2項「タスク・フロー・アクティビティおよび制御フローに関する必知事項」を参照)をドラッグ・アンド・ドロップすることにより、タスク・フローを構築します。その後、「プロパティ」ウィンドウを使用して、これらのアクティビティとそれらの間の遷移を定義します。

タスク・フローがすでに作成されている場合を除き、MAFは、新しいMAF AMXページが作成されると、自動的にデフォルトのバインドなしタスク・フロー(adfc-mobile-config.xmlファイル)を生成します。

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

タスク・フローはタスク・フロー自体と、複数のアクティビティ、そしてそれらのアクティビティ間の制御フロー・ルールで構成されています(第12.2.2項「タスク・フロー・アクティビティおよび制御フローに関する必知事項」を参照)。通常、アクティビティの多くがフロー内の異なるページを示すビュー・アクティビティです。たとえば、ページのレンダリング前などにメソッドや操作をコールする必要がある場合は、メソッド・コール・アクティビティをそのアクティビティから次の適切なアクティビティまでの制御フロー・ケースとともに使用します。別なタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティを使用します。フローにブランチ化が必要な場合は、ルーター・アクティビティを使用します。バインド・タスク・フローの最後で、リターン・アクティビティを使用してフローを終了し、そのバインド・タスク・フローをコールしたフローに制御を戻します。

パレットで、タスク・フロー要素をドラッグしてフロー構造内に配置することで、独自のMAF AMXアプリケーション機能のバインド・タスク・フローを宣言的に作成できます。それらの要素を相互に関連付けて配置すると、OEPEは、ナビゲーションがMAF AMXアプリケーション機能で動作するために必要なXMLメタデータをtask-flow-definition.xmlファイル(デフォルト)に作成します。タスク・フロー定義ファイルのソースを編集することもできます。

始める前に:

タスク・フローを設計するには、MAFアプリケーションにビュー・コントローラ・プロジェクト・ファイル(第2章「MAFアプリケーション開発のスタート・ガイド」を参照)が含まれている必要があります。

OEPEでタスク・フローを作成するには、MAF機能エディタでバインド・タスク・フローを作成します。詳細は、第6.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」を参照してください。

図12-1 MAF機能エディタでのタスク・フロー・ファイルの作成

また、「ソース」エディタでページを直接編集して、タスク・フロー・ファイルに手動で要素を追加することもできます。「ソース」エディタでファイルを開くには、「ソース」タブをクリックします。

注意:
手動でタスク・フロー・ファイルを編集する場合は、MAF AMXページ、JavaScriptファイルおよびCSSファイルを参照するすべてのドキュメント・ファイル名で大文字と小文字が区別されることに注意してください。
特殊文字(アンダースコアなど)がファイル名に使用されている場合は、モバイル・デバイスの仕様を参照して、その文字の使用がサポートされているかどうかを確認する必要があります。

MAF AMXアプリケーション機能のナビゲーションを定義したら、次はページを作成したり、ナビゲーションを使用するコンポーネントを追加したりできます。ページでのナビゲーション・コンポーネントの使用の詳細は、第12.2.6項「制御フローの定義方法」を参照してください。

MAF AMXアプリケーション機能のタスク・フローを定義すると、ビュー・ファイルをダブルクリックしてMAF AMXビューにアクセスできます。詳細は、第12.3項「ビューの作成」を参照してください。

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

タスク・フローは、アクティビティ、およびアクティビティ間の遷移を定義する制御フロー・ケースで構成されます。

MAFタスク・フロー・デザイナは表12-1に示すアクティビティをサポートしています。

表12-1 タスク・フロー・アクティビティ

アクティビティ

説明

表示

MAF AMXページを表示します。詳細は、第12.2.5.1項「ビュー・アクティビティの追加」を参照してください。

メソッド・コール

メソッド(通常はマネージドBean上のメソッド)を起動します。メソッド・コール・アクティビティは、MAF AMXアプリケーション機能の制御フローの任意の位置に配置し、制御フロー・ルールに基づいてロジックを起動できます。詳細は、第12.2.5.3項「メソッド・コール・アクティビティの追加」を参照してください。

タスク・フローに含まれるメソッド・コールに渡すパラメータを指定することもできます。これらには、MAF AMXタスク・フロー内メソッド・コール・アクションの標準パラメータが含まれます。デザイナを使用してメソッドを生成する場合、デザイナにより必要な引数およびタイプが追加されます。

実行時にタスク・フローのメソッド・コールのパラメータを定義し、メソッド・コール自体にパラメータを渡してこれを使用できます。詳細は、「タスク・フロー・アクティビティの追加および使用方法」の部を参照してください。

ルーター

式言語(EL)式を評価し、その式の値に基づいて結果を戻します。その後、このような結果を使用して、タスク・フローの他のアクティビティに制御をルーティングします。詳細は、第12.2.5.2項「ルーター・アクティビティの追加」を参照してください。

タスク・フロー・コール

バインドなしタスク・フローまたはバインド・タスク・フローからバインド・タスク・フローをコールします。タスク・フロー・コール・アクティビティでは、同じMAF AMXアプリケーション機能内にあるバインド・タスク・フローをコールできますが、別のMAF AMXアプリケーション機能またはライブラリに追加された機能アーカイブ・ファイル(FAR)からバインド・タスク・フローをコールすることもできます。

タスク・フロー・コール・アクティビティは、タスク・フロー入力パラメータおよび戻り値をサポートします。

詳細は、第12.2.5.4項「タスク・フロー・コール・アクティビティの追加」を参照してください。

タスク・フロー・リターン

アプリケーションの制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターンは、バインド・タスク・フロー内でのみ使用できます。詳細は、第12.2.5.5項「タスク・フロー・リターン・アクティビティの追加」を参照してください。

MAFタスク・フロー・デザイナは表12-2に示す制御フローをサポートしています。

表12-2 制御フロー

制御フロー

説明

制御フロー・ケース

MAF AMXアプリケーション機能内で、あるアクティビティから次のアクティビティに制御を渡す方法を指定します。詳細は、第12.2.6.1項「制御フロー・ケースの定義」を参照してください。

ワイルドカード制御フロー・ルール

IDがワイルドカード式と一致するアクティビティからの制御フロー・ケースを表します。詳細は、第12.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照してください。

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

task-flow-definition.xmlファイルを使用すると、タスク・フロー・コンポーネントをパレットからダイアグラマにドラッグ・アンド・ドロップすることで、ビュー(MAF AMXページ)間の相互作用を設計できます。

図12-2に、task-flow-definition.xmlというタスク・フロー・ファイル例を示します。このファイルでは、制御フローはタスク・フロー・コールCallFlowによってCall1からCall2に方向付けられます。(第12.2.7項「「戻る」ナビゲーションのMAFサポートに関する必知事項」を参照)。

図12-2 タスク・フロー・ファイル

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

MAFタスク・フロー作成ユーティリティを使用してタスク・フローを作成すると、図12-2に示すように、タスク・フロー・ダイアグラムおよびパレットが自動的に表示されます。タスク・フロー・ダイアグラムは、そこにパレットからのアクティビティおよびタスク・フローをドラッグ・アンド・ドロップできるビジュアル・エディタです。図12-2に示す「ソース」タブをクリックしてタスク・フロー・ファイルを直接編集することもできます。詳細は、第12.2.5項「タスク・フロー・アクティビティの追加および使用方法」を参照してください。

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

タスク・フロー・ダイアグラマを使用してパレットからオプションを選択し、アクティビティ、ビューおよび制御フローをドラッグ・アンド・ドロップします。

アクティビティをMAFタスク・フローに追加するには:

1. プロジェクト・エクスプローラで、タスク・フロー・ソース・ファイル(task-flow-definition.xmlなど)をダブルクリックし、タスク・フロー・ダイアグラムとパレットを表示します。ダイアグラマにはタスク・フロー・エディタが表示されます。「パレット」には、MAFタスク・フローで使用できるコンポーネントが自動的に表示されます。

2. アクティビティを「パレット」からダイアグラムにドラッグします。

注意:
各バインド・タスク・フローに関連付けられているデフォルトのアクティビティがあります。

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

タスク・フロー・アクティビティの主要なタイプの1つに、MAF AMXページを表示するビュー・アクティビティがあります。

タスク・フローのソース・ファイルにあるXMLメタデータでは、ビュー・アクティビティが物理MAF AMXページと関連付けられています。id属性ではビュー・アクティビティが識別されます。

タスク・フローのビュー・アクティビティは、実行中に相互に制御を受け渡すように構成できます。たとえば、あるビュー・アクティビティ(ビュー・アクティビティA)から次のビュー・アクティビティ(ビュー・アクティビティB)に制御を渡すには、ビュー・アクティビティAと関連付けられたページ上にコマンド・コンポーネント(ボタンやリンクなど)を構成できます。これを行うには、コマンド・コンポーネントのAction属性を、起動が必要なタスク・フロー・アクティビティ(前述の例のビュー・アクティビティB)に相当する制御フロー・ケースのfrom-outcomeに設定します。実行時に、エンド・ユーザーは、コマンド・コンポーネントを起動することで制御フロー・ケースを初期化します。UIコンポーネントのAction属性の定数値または動的値のいずれかを使用して、あるビュー・アクティビティから別のアクティビティに移動できます。

- コンポーネントのAction属性の定数値は、常に同じ制御フロー・ケースをトリガーするアクション結果です。エンド・ユーザーがコンポーネントをクリックすると、その制御フロー・ケースに指定されているアクティビティが実行されます。代替の制御フローはありません。

- コンポーネントのAction属性の動的値はマネージドBeanまたはメソッドにバインドされます。メソッド・バインディングにより返される値によって、次に起動する制御フロー・ケースが決定されます。たとえば、メソッドはページ上でユーザー入力を検証し、入力が有効な場合はある値を返し、入力が無効な場合は別の値を返します。これらの異なるアクション値はそれぞれ別個のナビゲーション・ケースをトリガーするため、アプリケーションが移動可能なターゲット・ページは2つのいずれかになります。

詳細は、第12.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

また、ターゲット・ビュー・アクティビティに制御を渡す前に、値が必ずtrueになるEL式を記述できます。タスク・フローにある制御フロー・ケースの<if>子要素の値としてEL式を記述します。

例12-1および例12-2に、ビュー・アクティビティ間で制御を渡した場合の処理内容を示します。

例12-1は、バインド・タスク・フローまたはバインドなしタスク・フローのXMLソース・ファイルに定義された制御フロー・ケースを示します。

例12-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>

例12-2に示すように、Startビュー・アクティビティに関連付けられているMAF AMXページ上のボタンで、action属性としてtoOfficesが指定されます。エンド・ユーザーがボタンをクリックすると、制御フロー・メタデータでto-activity-idとして指定されたWesternOfficesアクティビティに制御フローが渡されます。

例12-2 ビュー・アクティビティで定義された静的ナビゲーション・ボタン

<amx:commandButton text="Go" id="b1" action="toOffices">

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

- 第12.2.5.1項「ビュー・アクティビティの追加」

- 第12.3.1.2項「MAF AMXページの作成」

前述のとおり、ビュー・アクティビティは、メタデータで、タスク・フローへの追加時に表示される実際のMAF AMXページに関連付けられています。ビュー・アクティビティは、「パレット」からドラッグ・アンド・ドロップすることによって追加します。「ダイアグラム」ウィンドウで「ビュー」アクティビティを右クリックして実際のMAF AMXページを作成し、次に表示されるダイアログ(図12-15「新しいMAFページ作成ダイアログ」を参照)でページの特性を定義できます。

バインド・タスク・フローを作成する場合、特定のアクティビティをデフォルト・アクティビティに指定できます(第12.2.12項「バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項」を参照)。それにより、バインド・タスク・フローの実行時は常にこの特定のアクティビティを最初に実行できます。デフォルトでは、OEPEはタスク・フローに追加した最初のアクティビティをデフォルトにします。別のアクティビティに変更する場合は、「ダイアグラム」ウィンドウで該当するアクティビティを右クリックし、「ページ定義の作成」を選択します(図12-3を参照)。

図12-3 デフォルト・アクティビティの定義

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

EL式の実行時の評価に基づいて、ルーター・アクティビティを使用し、制御をアクティビティにルーティングします。

各制御フローは、異なるルーター・ケースに対応できます。各ルーター・ケースでは、次の要素を使用して、制御が次にルーティングされるアクティビティを選択します。

- expression: 実行時の値がtrueまたはfalseになるEL式
ルーター・アクティビティは、trueを返すEL式に対応する結果を返します。

- outcome: EL式の値がtrueの場合にルーター・アクティビティから返される値
制御フロー・ケース上でルーター・ケースのoutcomeがfrom-outcomeと一致する場合は、制御フロー・ケースがポイントするアクティビティに制御が渡されます。ルーター・アクティビティのケースの値がtrueでない場合、またはルーター・アクティビティのケースが指定されていない場合は、ルーターの「デフォルト結果」フィールドで指定されているoutcomeが使用されます。

ルーティング条件をEL式で表すことができる場合は、ルーター・アクティビティの使用を検討してください(ルーター・アクティビティにより、タスク・フローの条件について、より詳しい情報を示すことができます)。

ルーター・アクティビティをダイアグラム上にドラッグすると、「プロパティ」ウィンドウを使用して式を作成し、その式の評価によりどの制御フロー・ルールに従うかを決定できます。「プロパティ」ウィンドウを使用して、ルーター・アクティビティの「アクティビティID」および「デフォルト結果」プロパティを構成し、ルーター・ケースをルーター・アクティビティに追加します。

「アクティビティID」属性を定義する場合は、タスク・フローのソース・ファイルにルーター・アクティビティを識別する値を記述します。

「デフォルト結果」属性を定義する場合は、どの制御フロー・ケースの値もtrueでないとき、または制御フロー・ケースが指定されていないときに、ルーター・アクティビティが制御を渡すアクティビティを指定します。

追加するルーター・ケースごとに、図12-4に示すように、「制御フロー・ケース」セクションの「追加」( + )をクリックして値を指定します。

図12-4 ルーター・アクティビティの構成

- 式: 実行時の値がtrueまたはfalseになるEL式。
たとえば、ビュー・アクティビティの入力テキスト・フィールドにある値を参照するには、次のようなEL式を記述します。

#{pageFlowScope.value=='view2'}

EL式がtrueを返す場合は、ルーター・アクティビティによって「結果」フィールドで指定した結果が呼び出されます。

- 結果: 「式」によって指定されたEL式がtrueを返す場合にルーター・アクティビティが呼び出す結果。
タスク・フロー・ダイアグラムの結果ごとに制御フロー・ケースまたはワイルドカード制御フロー・ルールを作成します。たとえば、制御フロー・ケースの結果ごとに、対応するfrom-outcomeがあることを確認します。

ルーター・アクティビティを使用して制御フローを構成する場合に、OEPEでは、ルーター・アクティビティのプロパティに指定した値に基づいて、タスク・フローのソース・ファイルに値を記述します。

12.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式のバインディング変数は、現在のバインディング・コンテナからバインディングを参照することに注意してください。バインディング変数を指定するには、バインディング・コンテナ定義またはページ定義を指定する必要があります。詳細は、第12.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

また、式ビルダーを使用してメソッドのEL式を作成することもできます。

- プロパティ・エディタから「メソッド」に「メソッド式ビルダー」を選択します。

- 「式ビルダー」ダイアログで、起動するメソッドにナビゲートして選択します。
メソッド・コール・アクティビティでマネージドBeanメソッドを起動する場合は、ダイアログでメソッド・コール・アクティビティをダブルクリックします。これによってダイアログが呼び出され、そこで起動するマネージドBeanメソッドを指定できます。

「プロパティ」ウィンドウの「パラメータ」セクションを使用して、メソッドのパラメータおよび戻り値を指定できます。メソッド・コール・アクティビティを既存のメソッドに関連付けることによってパラメータをまだ作成していない場合は、「追加」( + )をクリックし、次の内容を設定してパラメータを追加します。

- クラス: パラメータ・クラスを入力します。たとえば、java.lang.Doubleのように指定します。

- 値: パラメータの値を取得するEL式を入力します。次に例を示します。

#{pageFlowScope.shoppingCart.totalPurchasePrice}

- 戻り値: メソッドの戻り値を格納する場所を特定するEL式を入力します。次に例を示します。

#{pageFlowScope.Return}

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

タスク・フロー・コール・アクティビティを使用して、バインドなしタスク・フロー(第12.2.12.1項「バインドなしタスク・フロー」を参照)またはバインド・タスク・フロー(第12.2.12.2項「バインド・タスク・フロー」を参照)のいずれかからバインド・タスク・フローをコールできます。このアクティビティによって、同じまたは別のMAF AMXアプリケーション機能内にあるバインド・タスク・フローをコールできます。

コールされたバインド・タスク・フローでは、デフォルト・アクティビティが最初に実行されます。バインド・タスク・フロー・コールの数に制限はありません。たとえば、コール先のバインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそのバインド・タスク・フローからも次々にコールできるため、各タスク・フローがタスク間を結び付けるタスク・フロー・チェーンを作成できます。

バインド・タスク・フローにパラメータを渡すには、タスク・フロー・コール・アクティビティに入力パラメータの値を指定する必要があります。これらの値は、コール先のバインド・タスク・フローの入力パラメータ定義と一致している必要があります。詳細は、第12.2.5.4.2項「タスク・フロー・コール・アクティビティでの入力パラメータの指定」を参照してください。

注意:
タスク・フロー・コール・アクティビティの入力パラメータの値は、コール元のタスク・フロー内で値が取得される場所を指定します。
コール先のタスク・フローの入力パラメータの定義の値は、それが渡されたときにコール先のバインド・タスク・フローで値が格納される場所を指定します。

注意:
バインド・タスク・フローがタスク・フロー・コール・アクティビティに関連付けられると、バインド・タスク・フローで設定されている入力パラメータ定義に基づいて、入力パラメータが自動的にタスク・フロー・コール・アクティビティに挿入されます。したがって、実行する必要があるのは、タスク・フロー・コール・アクティビティの入力パラメータへの値の割当てのみです。

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

バインド・タスク・フローからコール元に戻り値が渡される方法は、入力パラメータが渡される方法と類似しています。詳細は、第12.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照してください。

タスク・フロー・コール・アクティビティを使用するには:

1. タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールします(第12.2.5.4.1項「タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール」を参照)。

2. バインド・タスク・フローにパラメータを渡す場合は、タスク・フロー・コール・アクティビティへの入力パラメータを指定します(第12.2.5.4.2項「タスク・フロー・コール・アクティビティへの入力パラメータの指定」を参照)。

12.2.5.4.1 タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール

コール側のバインドまたはバインド・タスク・フローまたはバインドなしタスク・フローにタスク・フロー・コール・アクティビティを追加し、バインド・タスク・フローをコールします。

バインド・タスク・フローをコールする手順:

1. ダイアグラム・ビューでバインド・タスク・フロー・ファイルを開きます。

2. パレットの「アクティビティ」ペインから、タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

3. 次のオプションのいずれかを選択して、コール先タスク・フローを識別します。

- 新しくドロップしたタスク・フロー・コール・アクティビティをダブルクリックして、新しいバインド・タスク・フローの設定を定義できる「MAFタスク・フローの作成」ダイアログを開きます。

- プロジェクト・エクスプローラから既存のバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップします。

- 起動するバインド・タスク・フローの名前がわかっている場合は、次の手順を実行します。

1. ダイアグラム・ビューで、「タスク・フロー・コール」アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストで「静的」を選択します。

3. 「ドキュメント」フィールドに、コールするバインド・タスク・フローのソース・ファイル名を入力します。

4. 「ID」フィールドには、コール先のバインド・タスク・フローのXMLソース・ファイルに含まれているバインド・タスク・フローIDを入力します(図12-5を参照)。

図12-5 バインド・タスク・フローを起動するタスク・フロー・コール・アクティビティ

- 起動するバインド・タスク・フローの名前がわからない場合、実行時のエンド・ユーザーによって異なる場合は、次の手順を実行します。

1. ダイアグラム・ビューで、「タスク・フロー・コール」アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストで「動的」を選択します。

3. 式ビルダーを使用して、「動的タスク・フロー参照」プロパティ・フィールドの値を設定します(実行時に起動するバインド・タスク・フローのIDを識別するEL式を記述します)。

12.2.5.4.2 タスク・フロー・コール・アクティビティでの入力パラメータの指定

タスク・フロー・コール・アクティビティとそのコール先のバインド・タスク・フローの間でパラメータをマップするには、まずコール先のバインド・タスク・フローの入力パラメータ定義を指定する方法をお薦めします。その後、プロジェクト・エクスプローラからバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップできます。タスク・フロー・コール・アクティビティの入力パラメータは、バインド・タスク・フローの入力パラメータ定義に基づいて自動的に作成されます。詳細は、第12.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

当然ながら、最初にタスク・フロー・コール・アクティビティに入力パラメータを指定することも可能です。最初に定義した場合にも、コール先のバインド・タスク・フローの入力パラメータ定義がタスク・フロー・コール・アクティビティに関連付けられた時点で、その入力パラメータ定義に基づいて自動的に置換されます。

コール先のバインド・タスク・フローをまだ作成していない場合にも、タスク・フロー・コール・アクティビティに入力パラメータを指定する方法は便利です。この時点で指定することで、バインド・タスク・フローのコール時にタスク・フロー・コール・アクティビティが最終的にマップされる予定の入力パラメータを特定できます。

入力パラメータを指定する手順:

1. ダイアグラム・ビューでタスク・フロー・ファイルを開き、「タスク・フロー・コール」アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「パラメータ」セクションを開き、「追加」( + )をクリックして、「入力パラメータ」リストで次のように新しい入力パラメータを指定します。

- 名前: 入力パラメータを識別する名前を入力します。

- 値: パラメータ値を識別するEL式を入力します。このEL式では、コール元のタスク・フロー内でパラメータ値が取得される場所を指定します。たとえば、次のようにEL式を入力します。

#{pageFlowScope.callingTaskflowParm}

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

3. 入力パラメータを指定すると、対応する入力パラメータ定義をコール先のバインド・タスク・フローに指定できます。詳細は、第12.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

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

タスク・フロー・リターン・アクティビティは、MAF AMXアプリケーション機能の制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターン・アクティビティは、バインド・タスク・フロー内でのみ使用できます。

タスク・フロー・リターン・アクティビティ・アイコンを囲むグレーの円は、そのアクティビティがバインド・タスク・フローの終了ポイントであることを示します。各バインド・タスク・フローには、ゼロから複数のタスク・フロー・リターン・アクティビティを指定できます。

各タスク・フロー・リターン・アクティビティには、コール元のタスク・フローに戻されるoutcomeを指定します。

起動するタスク・フローに戻されるoutcomeは、エンド・ユーザー・アクションによって異なります。起動元のタスク・フローによって次のアクションを決定するように、起動元のタスク・フローの制御フロー・ケースを構成できます。制御フロー・ケースの「結果(自)」プロパティをタスク・フロー・リターン・アクティビティのoutcomeからの戻り値に設定し、結果に基づくアクションを起動します。これにより、コール先タスク・フローからの戻り値に基づいて制御フローが決まります。

タスク・フロー・リターン・アクティビティを追加する手順:

1. ダイアグラム・ビューでバインド・タスク・フロー・ファイルを開きます。

2. パレットの「アクティビティ」ペインから、タスク・フロー・リターン・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

3. 「プロパティ」ウィンドウで、「一般」セクションを開き、「名前」フィールドに結果を入力します。
タスク・フロー・リターン・アクティビティは、現在のバインド・タスク・フローが存在する場合に、この結果をコール元タスク・フローに返します。タスク・フロー・リターン・アクティビティごとに1つのみ結果を指定できます。コール元のタスク・フローには、戻された時点の制御フローを処理する制御フロー・ルールを定義する必要があります。詳細は、第12.2.6項「制御フローの定義方法」を参照してください。

4. 「動作」セクションを開き、「再入力」リストでいずれかのオプションを選択します。
バインド・タスク・フローにreentry-not-allowedを指定しても、エンド・ユーザーはモバイル・デバイスの「戻る」ボタンをクリックするとバインド・タスク・フロー内のページに戻れます。ただし、エンド・ユーザーがそのページでボタンの作動などなんらかの操作を行うと、バインド・タスク・フローを不正に再開したことを示す例外(InvalidTaskFlowReentryなど)がスローされます。

5. 「トランザクションの終了」ドロップダウン・リストから、次のいずれかのオプションを選択します。

- commit: 選択すると、既存のトランザクションをデータベースにコミットします。

- rollback: 選択したトランザクションをコール先のタスク・フローの以前のエントリまでロールバックします。これを指定すると、新しいトランザクションはバインド・タスク・フローに入って開始された当初の状態までロールバックされるため、トランザクションを取り消すのと同じ効果があります。
commitとrollbackのいずれも指定しないと、トランザクションはコール元のバインド・タスク・フローによって閉じられるまで開いたままになります。

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

ページ定義ファイルは、実行時にデータを移入するバインディング・オブジェクトを定義します。通常、MAF AMXアプリケーション機能で、ページのUIコンポーネントとデータ・コントロールをバインドするために使用されます。次のタスク・フロー・アクティビティでも、ページ定義ファイルを使用してデータ・コントロールへのバインドが可能です。

- メソッド・コール: 「データ・コントロール」ウィンドウからタスク・フローにデータ・コントロール操作をドラッグ・アンド・ドロップして、メソッド・コール・アクティビティを作成したり、既存のメソッド・コール・アクティビティにドロップすることができます。いずれの場合も、メソッド・コール・アクティビティが、データ・コントロール操作にバインドされます。

- ルーター: ルーター・アクティビティにページ定義ファイルを関連付けることで、バインド・コンテナが作成されます。このバインド・コンテナは実行時にルーター・アクティビティ・ケースのEL式を評価し、ルーター・アクティビティが正しいバインド値を参照していることを確認します。各ルーター・アクティビティ・ケースは、EL式の評価結果がtrueの場合に返される結果を指定します。そのため、ページ定義ファイルには、trueまたはfalseの評価結果となるデータ・コントロール操作だけを追加します。

- タスク・フロー・コール: タスク・フロー・コール・アクティビティにページ定義ファイルを関連付けることで、バインド・コンテナが作成されます。実行時にタスク・フロー・コール・アクティビティから入力パラメータが渡されると、バインド・コンテナが起動します。バインド・コンテナはタスク・コール元のタスク・フローからコール先のタスク・フローに入力パラメータが渡される際に、フロー・コール・アクティビティがバインド値を参照する場合は、正しい値を参照していることを確認します。

- ビュー: ビュー・アクティビティをページ定義ファイルに直接関連付けることはできません。かわりに、ビュー・アクティビティが参照するページを関連付けます。

タスク・フローの「ダイアグラム」ウィンドウ内で、前述のタスク・フロー・アクティビティ(ビュー・アクティビティを除く)のいずれかを右クリックすると、OEPEがポップアップ・メニューにオプションを表示します(ページ定義ファイルが作成されていない場合は、これを使用して作成できます)。ページ定義ファイルがある場合は、OEPEはページ定義ファイルに移動するためのすべてのタスク・フロー・アクティビティのポップアップ・メニュー・オプションを表示します(第12.3.1.5項「ページ定義ファイルへのアクセス」を参照)。ページ定義ファイルに関連付けられたメソッド・コール・アクティビティを右クリックして、OEPEでポップアップ・メニュー・オプション(「バインディングの編集」)を表示することもできます。

ページ定義ファイルに関連付けられたタスク・フロー・アクティビティでは、タスク・フロー・アクティビティ・アイコンの右下にアイコンが表示されます。

タスク・フロー・アクティビティにページ定義ファイルを関連付けるには:

1. ダイアグラム・ビューで、ページ定義ファイルを作成するタスク・フロー・アクティビティを右クリックし、ポップアップ・メニューから「ページ定義の作成」を選択します。

2. 作成されたページ定義ファイルに、タスク・フロー・アクティビティの実行時に参照させたいバインドを追加します。

ページ定義ファイルの詳細は、第12.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

前述の手順が完了すると、OEPEは、設計時にタスク・フロー・アクティビティのページ定義ファイルを生成します。ページ定義ファイルのファイル名は、元のタスク・フローおよびタスク・フロー・アクティビティまたは起動するデータ・コントロール操作から構成されます。OEPEは作成されたページ定義ファイル内で、タスク・フロー・アクティビティからバインドへのEL式も生成します。実行時にバインド・コンテナは、タスク・フロー・アクティビティのEL式が正しい値を参照していることを確認します。

12.2.6 制御フローの定義方法

MAF AMXアプリケーション機能で制御フローを定義するには、次のタスク・フロー・コンポーネントを使用します。

- 制御フロー・ケース(第12.2.6.1項「制御フロー・ケースの定義」を参照)

- ワイルドカード制御フロー・ルール(第12.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照)

12.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(ターゲット・アクティビティの識別子)を変更するには、ダイアグラムの矢印のどちらかの端を新規のアクティビティにドラッグします。

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

MAFタスク・フローではワイルドカード制御フロー・ルールをサポートし、これは、後方ワイルドカード(foo*)や単一ワイルドカード文字のある制御フローfrom-activity-idを表します。ワイルドカード制御フロー・ルールは、「パレット」からドラッグ・アンド・ドロップしてバインドなしまたはバインド・タスク・フローに追加できます。ワイルドカード制御フロー・ルールを構成するには、「プロパティ」ウィンドウを使用します。

ワイルドカード制御フロー・ルールを追加するには:

1. ダイアグラム・ビューでタスク・フロー・ソース・ファイルを開きます。

2. 「パレット」で「ワイルドカード制御フロー・ルール」を選択し、ダイアグラムにドロップします。

3. 「パレット」で「制御フロー・ケース」を選択します。

4. タスク・フロー・ダイアグラムで、制御フロー・ケースをワイルドカード制御フロー・ルールからターゲット・アクティビティ(任意のアクティビティ・タイプ)にドラッグします。

5. デフォルトでは、ワイルドカード制御フロー・ルールの後のラベルは*です。これは、「アクティビティID(自)」要素の値です。この値を変更するには、ダイアグラムでワイルドカード制御フロー・ルールを選択します。ワイルドカード制御フロー・ルールの「プロパティ」ウィンドウで、 「アクティビティID(自)」フィールドに新しい値を入力します。便利な規則は、ワイルドカード制御フロー・ルールをその目的を表す形式でキャストすることです。たとえば、project*と入力します。新しいラベルでは、ワイルドカードは後続の文字である必要があります。

ヒント:
タスク・フロー・ダイアグラムで、「アクティビティID(自)」の値も変更できます。

6. オプションとして、「プロパティ」ウィンドウでは、「動作」セクションを開いて、値がtrueになる必要がある、「If」フィールド内のEL式を記述した後に、「アクティビティID(至)」によって識別されたアクティビティに制御を渡すことができます。

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

例12-3に、タスク・フロー・ソース・ファイルの制御フロー・ルール要素の一般的な構文を示します。

例12-3 制御フロー・ルール定義

<control-flow-rule>
<from-activity-id>from-view-activity</from-activity-id>
<control-flow-case>
<from-action>actionmethod</from-action>
<from-outcome>outcome</from-outcome>
<to-activity-id>destinationActivity</to-activity-id>
<if>#{myBean.someCondition}</if>
</control-flow-case>
<control-flow-case>
...
</control_flow-case>
</control-flow-rule>

制御フロー・ルールは、次のメタデータで構成されます。

- control-flow-rule: 制御フロー・ケース要素の必須ラッパー要素。

- from-activity-id: 制御フロー・ルールの発生元となるアクティビティの識別子(sourceなど)。
from-activity-idの後方ワイルドカード( * )文字がサポートされています。ルールは、ワイルドカードのパターンに一致するすべてのアクティビティに適用されます。たとえば、login*は、リテラルloginで始まるすべての論理アクティビティID名と一致します。メタデータに(後方ワイルドカードではなく)単一のワイルドカード文字を指定すると、ダイアグラムで、制御フローが自動的にワイルドカード制御フロー・ルール・アクティビティに変換されます。詳細は、第12.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照してください。

- control-flow-case: 制御フロー・ルールの各ケースの必須ラッパー要素。それぞれのケースで、同じソース・アクティビティに対して異なる制御フローを定義します。制御フロー・ルールには、少なくとも1つの制御フロー・ケースが必要です。

- from-action: 指定されたアクション・メソッドからの結果のみにルールの適用を制限する任意の要素。アクション・メソッドは、ELバインディング式(#{backing_bean.cancelButton_action}など)として指定されます。
例12-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要素によって識別されたアクティビティに制御フローを渡します。

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

実行時、タスク・フローは、最も具体的な一致から最も具体的でない一致まで制御フロー・ルールを評価して、アクティビティ間の次の遷移を決定します。評価は次の優先度に基づきます。

1. from-activity-id、from-action、from-outcome: 最初に、3つの要素すべての一致を検索します。

2. from-activity-id、from-outcome: 3つすべての要素で一致がない場合は、これらの要素を検索します。

3. from-activity-id: 前述の組合せの検索で一致がなかった場合は、この要素のみで検索します。

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

図12-6に示すタスク・フローの例では、アクション結果の値(第12.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照)に基づき、viewDに達するための2つの異なるパス(viewAからviewBを経由してviewD、またはviewAからviewCを経由してviewDのいずれか)を受け取ることができます。

図12-6 「戻る」ナビゲーションを使用したタスク・フロー

理論上は、どのナビゲーション・パスが使用されたかを追跡して__backナビゲーション・フローを直接実装することもできますが、特にモバイル・デバイスの画面領域が限られていてナビゲーション・シーケンスに従っていない遷移が非常に頻繁に発生するため、これは複雑なうえに間違いが発生しやすくなります。MAFでは、組込みの__backナビゲーションがサポートされているため、タスク・フロー全体にわたる後方移動が可能で、つまり、経由したパスに関する情報を適用することにより、同じパスを経由する後方ナビゲーションを実行します。たとえば、最初のナビゲーションでviewAからviewCを経由してviewDに達していた場合、ViewDで__backオプションを実行すると、エンド・ユーザーは、ViewB経由ではなくViewC経由で、ViewAに自動的に戻ります。

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

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

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

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

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

ナビゲーションのドラッグ動作を使用することで、いずれかのMAF AMXページから別のページへのナビゲーションを有効化できます。詳細は、第13.3.26項「ドラッグ・ナビゲーションの有効化」を参照してください。

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

「プロパティ」ウィンドウを使用して、次に示すUIコンポーネントのいずれかのaction属性を該当する制御フロー・ケースfrom-outcomeに設定して次のタスク・フロー・アクティビティに導くことにより、アクション結果を指定できます。

- コマンド・ボタン(第13.3.5項「ボタンの使用方法」を参照)

- コマンド・リンク(第13.3.6項「リンクの使用方法」を参照)

- リスト・アイテム

UIコンポーネントの「アクション」フィールドを使用して、特定のMAF AMXページの1つ以上のタスク・フローで定義される可能性のあるアクション結果のリストから選択を行います。

戻るアクション(__back)は、各リストに自動的に追加され、前に参照したページへのナビゲーションを可能にします。

注意:
MAF AMXページは、バインド・タスク・フローとバインドなしタスク・フローの両方で参照でき、その場合、両方のタスク・フローからのアクション結果がアクション選択リストに含まれます。

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

独自のMAFアプリケーションでマネージドBeanを作成および使用して、追加データを格納したり、カスタム・コードを実行できます。通常の編集メカニズムを使用して、マネージドBeanを参照したり、適用可能なフィールドに対してそれらへの参照を作成できます。詳細は、第14.4項「マネージドBeanの作成と使用」を参照してください。

タスク・フローの(アイコンではなく)名前をクリックすると、図12-7に示す「プロパティの編集」ダイアログが表示されます。

図12-7 アクションの「プロパティの編集」ダイアログ

表12-5には、「プロパティ」ウィンドウで「編集」オプションを選択できるMAF AMX属性がリストされています。

表12-3 編集可能な属性

プロパティ

要素

action

amx:commandButton

action

amx:commandLink

action

amx:listItem

action

amx:navigationDragBehavior

action

dvtm:chartDataItem

action

dvtm:ieDataItem

action

dvtm:timelineItem

action

dvtm:area

action

dvtm:marker

actionListener

amx:listItem

actionListener

amx:commandButton

actionListener

amx:commandLink

binding

amx:actionListener

mapBoundsChangeListener

dvtm:geographicMap

mapInputListener

dvtm:geographicMap

moveListener

amx:listView

rangeChangeListener

amx:listView

selectionListener

amx:listView

selectionListener

amx:filmStrip

selectionListener

dvtm:areaDataLayer

selectionListener

dvtm:pointDataLayer

selectionListener

dvtm:treemap

selectionListener

dvtm:sunburst

selectionListener

dvtm:timelineSeries

selectionListener

dvtm:nBox

selectionListener

dvtm:areaChart

selectionListener

dvtm:barChart

selectionListener

dvtm:bubbleChart

selectionListener

dvtm:comboChart

selectionListener

dvtm: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プロパティに使用可能なアクション結果を選択できることを示しています。

図12-7に示された「アクション結果」リストには、特定のMAF AMXページが属するすべてのタスク・フローからのアクション結果が含まれています。また、このリストには、前に参照したページに戻るための__backナビゲーション結果が含まれています(詳細は第12.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください)。ページがタスク・フローの一部ではない場合、__backが「アクション結果」リストで使用可能な唯一の結果です。使用可能なアクション結果のいずれかを選択し、「OK」をクリックすると、アクション・プロパティ値は、適切なEL式(commandButtonの場合、次のとおり)で更新されます。

<amx:commandButton action="goHome"/>

「メソッド・バインディング」オプション(図12-7を参照)では、新しいマネージドBeanクラスを作成するか、既存のものを選択できます。

新しいマネージドBeanクラスを作成するには:

1. 「マネージドBean」フィールドの横にある「新」をクリックし、図12-8に示す「マネージドBeanの作成」ダイアログを開きます。

図12-8 「マネージドBeanの作成」ダイアログ・ボックス

MAFでは、次のスコープがサポートされています。

- application

- view

- pageFlow

MAFアプリケーションまたはMAF AMXアプリケーション機能に対してマネージドBeanを宣言すると、マネージドBeanはインスタンス化されて適切なスコープ内で識別され、Beanのプロパティが解決されてそのメソッドがELを介してコールされます。詳細は、第14.3項「EL式の作成」を参照してください。

2. [Tab]キーを押して「名前」フィールドから「クラス」名前フィールドに進みます(図12-9を参照)。クラス名を入力するか、「参照」ボタンをクリックして選択します。

図12-9 マネージドBeanの名前およびクラスの設定

例12-4に、新たに作成されたマネージドBeanクラスを示します。MAF AMXページが含まれるタスク・フローが、Beanを参照するように更新されます。

例12-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クラスも、例12-5に示すとおり、新たに作成されたメソッドを含むように更新されます。

例12-5 マネージドBeanクラスの新しいメソッド

package mobile;

public class MyBean {
public MyBean() {
}

public String getMeHome() {
// Add event code here...
return null;
}
}

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

- 第14.3.5.2項「マネージドBeanカテゴリについて」

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

タスク・フローでページ遷移スタイルを定義することにより、ビューから別のビューへのMAF AMXページの遷移方法を指定できます。MAF AMXページの遷移動作は次のようにできます。

- フェード・イン

- 左からスライド・イン

- 右からスライド・イン

- 下からスライド・アップ

- 上からスライド・ダウン

- 始点からスライド・イン

- 終点からスライド・イン

- 下からフリップ・アップ

- 上からフリップ・ダウン

- 左からフリップ

- 右からフリップ

- 始点からフリップ

- 終点からフリップ

- なし

始点および終点からスライド・インと、始点および終点からフリップは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点の遷移スタイルを使用することをお薦めします。

注意:
Androidプラットフォームではフリップを有効にできません。

例12-6のようにcontrol-flow-case(制御フロー・ケース・コンポーネント)のtransition属性を変更することによって、遷移スタイルを設定します。

例12-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値が論理的になるように指定する必要があります。たとえば、戻るナビゲーションのために左から右に遷移が発生する場合、右にスライドして前のページに戻る必要があります。

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

タスク・フローを使用すると、モジュール単位でMAF AMXアプリケーション機能に制御フローを定義できます。アプリケーション機能は単一の大規模なページ・フローとして表すのではなく、再利用可能な一連のタスク・フローに分割できます。各タスク・フローには、アプリケーション機能のナビゲーション・グラフの一部が含まれます。タスク・フロー内のノードは、アクティビティを表します。アクティビティ・ノードでは、ページの表示、アプリケーション・ロジックの実行または別のタスク・フローのコールなど、シンプルな論理的操作が表示されます。アクティビティ間の遷移は制御フロー・ケースと呼ばれます。

MAF AMXのタスク・フローには、バインドとバインドなしの2種類があります。

1. バインドなしタスク・フロー: エンド・ユーザーがタスクを完了できるように対話する一連のアクティビティ、制御フロー・ルールおよびマネージドBeanです。バインドなしタスク・フローは、バインド・タスク・フローに含まれていない、MAF AMXアプリケーション機能内のすべてのアクティビティおよび制御フローで構成されています。

2. バインド・タスク・フロー: タスク・フローの特殊な形式であり、バインドなしタスク・フローとは異なり、単一エントリ・ポイントと0以上の終了ポイントがあります。これには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。

バインドなしタスク・フローまたはバインド・タスク・フローに追加可能なアクティビティ・タイプの説明は、第12.2.2項「タスク・フロー・アクティビティおよび制御フローに関する必知事項」を参照してください。

一般的なMAF AMXアプリケーション機能には、アプリケーション機能作成時に作成された1つのバインドなしタスク・フローと、1つ以上のバインド・タスク・フローの組合せが含まれます。実行時、MAFアプリケーションでは、バインドなしタスク・フローに追加したアクティビティからバインド・タスク・フローをコールできます。

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

MAF AMXアプリケーション機能には常に、そのアプリケーション機能に1つ以上のエントリ・ポイントを提供する1つのバインドなしタスク・フローが含まれます。エントリ・ポイントは、ビュー・アクティビティによって表されます。デフォルトでは、バインドなしタスク・フローのソース・ファイルはadfc-mobile-config.xmlファイルです。

注意:
バインドなしタスク・フローに対して追加ソース・ファイルを作成できますが、MAF AMXアプリケーション機能では、実行中のすべてのソース・ファイルがadfc-mobile-config.xmlファイルにまとめられます。

図12-10は、MAF AMXアプリケーション機能からのバインドなしタスク・フローのダイアグラムを示しています。このタスク・フローにはいくつかのビュー・アクティビティが含まれており、いずれもアプリケーション機能へのエントリ・ポイントになっています。

図12-10 バインドなしモバイル・タスク・フローのダイアグラム

次の場合、バインドなしタスク・フローを使用することを検討してください。

- タスク・フローを別のタスク・フローからコールする必要がない。

- MAF AMXアプリケーション機能に複数のエントリ・ポイントがある。

- タスク・フローで最初に実行するアクティビティ(デフォルト・アクティビティ)を特に指定する必要がない。

バインドなしタスク・フローは、バインド・タスク・フローをコールできますが、別のタスク・フローからコールできません。

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

デフォルトでは、IDEは、バインド・タスク・フローのソース・ファイルのファイル名を提案します(第12.2.1項「タスク・フローの作成方法」を参照)。実行するタスクの目的を表すようにこのファイル名を変更できます。

バインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそのバインド・タスク・フローからも次々にコールできます。コールに深さ制限はありません。

図12-11は、MAF AMXアプリケーション機能からのバインド・タスク・フローのダイアグラムを示しています。

図12-11 バインド・モバイル・タスク・フローのダイアグラム

バインド・タスク・フローを作成する理由は次のとおりです。

- バインド・タスク・フローでは、常にバインド・タスク・フローの開始直後に実行する必要のある単一エントリ・ポイントとなる、デフォルト・アクティビティを指定します。

- これは、同一または別のMAF AMXアプリケーション機能内で再利用可能です。

- バインド・タスク・フロー内で使用するマネージドBeanは、ページ・フロー・スコープで指定できるため、残りのMAF AMXアプリケーション機能からは分離されます。これらのマネージドBean(およびページ・フロー・スコープ)は、タスク・フローが完了した際に自動的に解放されます。

次に、バインド・タスク・フローの主な特性のサマリーを示します。

- 適切に定義された境界: バインド・タスク・フローは、プライベート制御フロー・ルール、アクティビティおよびマネージドBeanの独自のセットで構成されます。コール元は、バインド・タスク・フロー境界内におけるページ名、メソッド・コール、子バインド・タスク・フロー、マネージドBean、制御フロー・ルールの内部知識を必要としません。データ・コントロールはタスク・フロー間で共有できます。

- 単一のエントリ・ポイント: バインド・タスク・フローには、タスク・フロー内の他のすべてのアクティビティの前に実行されるデフォルト・アクティビティである、単一のエントリ・ポイントがあります。

- ページ・フロー・メモリー・スコープ: バインド・タスク・フロー内のアクティビティ間でデータを受け渡すためのメモリー・スコープとしてページ・フロー・スコープを指定できます。ページ・フロー・スコープは、バインド・タスク・フローの各インスタンスに対する一意の記憶域を定義します。その存続期間はバインド・タスク・フローであり、requestスコープより長く、sessionスコープより短くなっています。

- 指定可能: バインド・タスク・フローにアクセスするには、バインド・タスク・フローのXMLソース・ファイルに記述されている一意の識別子とXMLソース・ファイルのファイル名を指定します。

- 再利用可能: アクティビティ・グループ全体を単一のエンティティ、つまりバインド・タスク・フローとして識別し、そのバインド・タスク・フローをMAFアプリケーション内の別のMAF AMXアプリケーション機能で再利用できます。
また、既存のバインド・タスク・フローは、コールすることで再利用できます。

さらに、タスク・フロー・テンプレートを使用して、様々なバインド・タスク・フローで再利用するための共通の動作を取得できます。

- パラメータおよび戻り値: コール元は、バインド・タスク・フローに入力パラメータを渡し、戻り値を受け取ることができます(第12.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」および第12.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照)。
また、バインド・タスク・フロー間でデータ・コントロールを共有できます。

- メタデータのオンデマンド・ロード: バインド・タスク・フロー・メタデータは、バインド・タスク・フローの開始時にオンデマンドでロードされます。

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

入力パラメータを受け取り、パラメータ値を戻すタスク・フローの機能によって、タスク・フローのデータを操作できる他、タスク・フロー間でデータを共有できます。この機能を使用して、MAF AMXアプリケーション機能でのタスク・フローの再利用を最適化できます。

図12-12は、pageFlowスコープ内のユーザーについての情報を保持する入力パラメータ定義を指定するタスク・フローを示しています。

図12-12 タスク・フローの入力パラメータ

タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールする場合、標準EL式を使用してパラメータ値を指定できます。たとえば、次のEL式の構文を使用してパラメータを指定できます。

- #{bindings.bindingId.inputValue}

- #{CustomerBean.zipCode}

inputValueをEL式に追加することで、実際のバインディング・オブジェクトではなく、バインディングの値をパラメータに確実に割り当てられます。

12.2.12.3.1 バインド・タスク・フローへのパラメータ渡し

コール先のバインド・タスク・フローは、コール元のタスク・フローまたはタスク・フロー・バインディングから入力パラメータを受け取ることができます。

バインド・タスク・フローに入力パラメータを渡すには、次のうちの1つまたは複数を指定します。

- コール元のタスク・フローでのタスク・フロー・コール・アクティビティの入力パラメータ: 入力パラメータによって、パラメータ値を格納するコール元のタスク・フローの場所が指定されます。

- コール元のバインド・タスク・フローの入力パラメータ定義: 入力パラメータ定義によって、実行時にコール先のバインド・タスク・フローがパラメータ値を取得できる場所が指定されます。

コール元のタスク・フローにあるタスク・フロー・コール・アクティビティで定義する入力パラメータおよびコール先のバインド・タスク・フローの入力パラメータ定義と同じ名前を指定します。これを行うことで、コール先のバインド・タスク・フローに入力パラメータ値をマップできます。

入力パラメータの値を参照するEL式を指定しない場合は、valueのEL式のデフォルト値を実行時に次のように設定します。

#{pageFlowScope.parmName}

ここで、parmNameは、入力パラメータ名に入力した値です。

コール先のバインド・タスク・フローの入力パラメータ定義では、必要に応じて入力パラメータを指定できます。入力パラメータが実行時または設計時に値を受け取らない場合、タスク・フローは、そのタスク・フローを含むMAFアプリケーションのログ・ファイル内に警告を生成します。必要に応じて指定しない入力パラメータは、タスク・フロー・コール・アクティビティの作成時に無視できます。

タスク・フロー・コール・アクティビティを使用してタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティの入力パラメータを参照渡しまたは値渡しにできます(第12.2.5.4.2項「タスク・フロー・コール・アクティビティでの入力パラメータの指定」を参照)。デフォルトでは、プリミティブ・タイプ(int、long、booleanなど)が値渡し(pass-by-value)されます。

コール先のタスク・フローは、終了時にコール元のタスク・フローに値を戻すことができます。詳細は、第12.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照してください。

入力パラメータをバインド・タスク・フローに渡す場合、コール元のタスク・フローとコール先のタスク・フローの両方で値を定義します。

始める前に:

- コール元およびコール先のタスク・フローを作成します(コール元のタスク・フローはバインドまたはバインドなしにすることができます)。コール先のタスク・フローはバインドにする必要があります。タスク・フローの作成に関する詳細は、第12.2.1項「タスク・フローの作成方法」を参照してください。

- タスク・フロー・コール・アクティビティをコール元のタスク・フローに追加します。

図12-13には、ビュー・アクティビティがタスク・フロー・コール・アクティビティに制御を渡す例が示されています。

図12-13 コール元のタスク・フロー

入力パラメータをバインド・タスク・フローに渡すには:

1. エンド・ユーザーが実行時にパラメータとしてバインド・タスク・フローに渡される値を入力する入力コンポーネントを含むMAF AMXページを開きます。コール元のタスク・フローにあるビュー・アクティビティによって、開いたMAF AMXページを参照する必要があることに注意してください。

2. エンド・ユーザーが実行時に値を入力するMAF AMXページで入力テキスト・コンポーネントを選択します。

3. 「プロパティ」ウィンドウで、「共通」セクションを開いて、「値」フィールドに入力テキスト・コンポーネントの値を入力します。
値はEL式として(たとえば#{pageFlowScope.inputValue})、手動で、または式ビルダーを使用して指定できます。

4. コールするタスク・フローをプロジェクト・エクスプローラでダブルクリックして開き、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

5. 「入力パラメータの定義」セクションで、「追加」( + )をクリックして新しいエントリを指定します(図12-12を参照)。

- 「名前」フィールドで、パラメータ名(inputParm1など)を入力します。

- 「値」フィールドで、パラメータ値を格納および参照するEL式(たとえば#{pageFlowScope.inputValue})を手動で、または式ビルダーを使用して入力します。

6. プロジェクト・エクスプローラで、コール先のバインド・タスク・フローを起動するタスク・フロー・コール・アクティビティを含むコール元タスク・フローをダブルクリックします。

7. プロジェクト・エクスプローラで、コール先のバインド・タスク・フローをドラッグし、コール元のタスク・フローのダイアグラム内のタスク・フロー・コール・アクティビティの上にドロップします。これにより、バインド・タスク・フローに対するタスク・フローの参照が自動的に作成されます。図12-14に示すように、タスク・フローの参照には次のものが含まれています。

- バインド・タスク・フローのID (id): バインド・タスク・フローのtask-flow-definition要素の属性。

- IDを含むタスク・フローのソース・ファイルを指すドキュメント名。

図12-14 タスク・フローの参照

8. タスク・フロー・コール・アクティビティの「プロパティ」ウィンドウで、「パラメータ」を開いて、「入力パラメータ」セクションを表示します。

- 入力パラメータを識別する名前を入力します(入力パラメータを定義済のタスク・フロー・コール・アクティビティの上にバインド・タスク・フローをドロップしたため、名前はすでに指定されています)。同じ入力パラメータ名を維持する必要があります。

- パラメータ値(たとえば#{pageFlowScope.param1})を入力します(タスク・フロー・コール・アクティビティの入力パラメータの値によって、コール元のタスク・フローがパラメータ値を格納する場所が指定されます)。コール先のタスク・フローの入力パラメータ定義の値は、渡された後にコール先のバインド・タスク・フロー内で使用する値が取得される場所を指定します。

実行時、コール先のタスク・フローは入力パラメータを使用できます。コール先のタスク・フローの入力パラメータ定義で値としてpageFlowScopeを指定したため、コール先のバインド・タスク・フローのどこでもパラメータ値を使用できます。たとえば、コール先のバインド・タスク・フローのビュー・アクティビティにパラメータ値を渡すことができます。

完了すると、OEPEでは、選択した値に基づいて、コール元のタスク・フローとコール先のタスク・フローのソース・ファイルに対しエントリを記述します。

例12-7は、バインド・タスク・フローで指定された入力パラメータ定義を示しています。

例12-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>

例12-8は、例12-7に示したバインド・タスク・フローをコールするタスク・フロー・コール・アクティビティの入力パラメータ・メタデータを示しています。実行時に、タスク・フロー・コール・アクティビティはバインド・タスク・フローをコールして、そのvalue要素で指定された値を渡します。

例12-8 タスク・フロー・コール・アクティビティの入力パラメータ

<task-flow-call id="taskFlowCall1">
...
<input-parameter>
<name>inputParameter1</name>
<value>#{pageFlowScope.newCustomer}</value>
<pass-by-value/>
</input-parameter>
...
</task-flow-call>

12.2.12.3.2 バインド・タスク・フローの戻り値の構成

コール先のタスク・フローにある戻り値の定義を構成し、実行時に戻り値を取得するコール元のタスク・フローのタスク・フロー・コール・アクティビティにパラメータを追加します。

始める前に:

バインド・タスク・フローまたはバインドなしタスク・フローを(コール元のタスク・フローに対して)作成し、バインド・タスク・フローを(コール先のタスク・フローに対して)作成します。詳細は、第12.2.1項「タスク・フローの作成方法」を参照してください。

コール先のバインド・タスク・フローの戻り値を構成するには:

1. コールするタスク・フローをプロジェクト・エクスプローラでダブルクリックして開き、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

2. 「戻り値の定義」セクションで、「追加」( + )をクリックして戻り値を定義します(図12-12を参照)。

- 「名前」フィールドで、戻り値を識別する名前(たとえばreturnValue1)を入力します。

- 「クラス」フィールドで、戻り値のデータ型を定義するJavaクラスを入力します。デフォルト値はjava.lang.Stringです。

- 「値」フィールドで、戻り値を読み取る場所を指定するEL式(たとえば#{pageFlowScope.ReturnValueDefinition})を手動で、または式ビルダーを使用して入力します。

3. プロジェクト・エクスプローラで、コール元のタスク・フローをダブルクリックします。

4. ダイアグラム・ビューでタスク・フロー・ページを開いた状態で、「パレット」から「コンポーネント」→「アクティビティ」を選択してから、タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

5. タスク・フロー・アクティビティの「プロパティ」ウィンドウで、「パラメータ」セクションを開いて、「戻り値」エントリの「追加」( + )をクリックし、戻り値を定義する次の値を追加します。

- 戻り値を識別する名前(たとえばreturnValue1)。手順2で戻り値の定義を定義した場合は、「名前」フィールドに入力した値と一致する必要があります。

- 戻り値を格納する場所を指定するEL式で表した値(たとえば#{pageFlowScope.ReturnValueDefinition})。手順2で戻り値の定義を定義した場合は、「値」フィールドに入力した値と一致する必要があります。

完了すると、OEPEでは、構成したコール元のタスク・フローのソース・ファイルに対しエントリを記述します。

例12-9では、コール元のタスク・フローのソース・ファイルに対してOEPEで記述したエントリの例を示しています。

例12-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>

例12-10では、コール先のタスク・フローのソース・ファイルに対してOEPEで記述したエントリの例を示しています。

例12-10 戻り値を構成するためのコール先のタスク・フローのメタデータ

<return-value-definition id="__2">
<name id="__3">returnValue1</name>
<value>#{pageFlowScope.ReturnValueDefinition}/</value>
<class>java.lang.String</class>
</return-value-definition>

実行時に、コール先のタスク・フローが値を返します。この構成の場合は、コール元のタスク・フローにあるタスク・フロー・コール・アクティビティがその値を取得します。

12.3 ビューの作成

MAFアプリケーションを作成すると、OEPEは、アセンブリ・プロジェクトおよびアプリケーション・プロジェクトと連動するビュー・プロジェクトを自動的に作成します。追加のビュー・プロジェクトを作成することもできます。次のセクションでは、ビューの作成および操作に関する重要な側面について説明します。

- MAF AMXページ構造の理解(第12.3.1.1項「MAF AMXページ構造の解釈」を参照)

- MAF AMXページの編集およびプレビュー(第12.3.1.4項「UIエディタの使用方法」を参照)

- MAF AMXページへのコンポーネントのドラッグ・アンド・ドロップ(第12.3.2.1項「UIコンポーネントの追加」を参照)

- データ・コントロールのビューへの追加(第12.3.2.3項「データ・コントロールのビューへの追加」を参照)

12.3.1 MAF AMXページの操作方法

MAF AMXページはXMLファイルによって表されます。

12.3.1.1 MAF AMXページ構造の解釈

次にMAF AMXファイルの基本構造を示します。

<amx:view>
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
…
</amx:facet>
</amx:panelPage>
</amx:view>

データ可視化コンポーネント(第13.5項「データ視覚化の指定」を参照)を除き、UI要素は<amx>名前空間の下で宣言されます。

詳細は、第12.3.1.3項「MAF AMXページの作成時の処理」を参照してください。

12.3.1.2 MAF AMXページの作成

MAF AMXファイルは、MAFアプリケーションのビュー・プロジェクトに含まれています。これらのファイルは、「新規MAFページ」ダイアログを使用して作成します。

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ページに含めるかを選択することもできます。

- ヘッダー

- プライマリ

- セカンダリ

- フッター

詳細は、第12.3.1.3項「MAF AMXページの作成時の処理」および第13.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

ファセットを選択または選択解除すると、変更されたページの外観を反映するよう、ページを表すイメージは動的に変わります。

図12-15 新しいMAFページ作成ダイアログ

注意:
MAFでは、ページのファセットの選択を保持し、後に続く「新規MAF AMXページ」ダイアログが開かれるたびに適用します。

5. 「新規MAF AMXページ」ダイアログの「終了」をクリックします。

タスク・フローのビュー・コンポーネントからMAF AMXページを作成するには:

1. ダイアグラマでタスク・フロー・ファイルを開きます(第12.2.1項「タスク・フローの作成方法」および第12.2.4項「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)

2. タスク・フローのビュー・コンポーネントをダブルクリックして図12-15に示す「MAF AMXページの作成」ダイアログを開き、新しいファイルの名前と必要に応じて場所を入力します。「OK」をクリックします。

12.3.1.3 MAF AMXページの作成時の処理

「MAF AMXページの作成」ダイアログを使用してMAF AMXページを作成すると、OEPEによって物理ファイルが作成されて、ビュー・コントローラ・プロジェクトのViewContentディレクトリに追加されます。

図12-16に示すプロジェクト・エクスプローラでは、「Webコンテンツ」ノードに、新しく作成されたdepartment.amxというMAF AMXファイルが含まれています。

図12-16 プロジェクト・エクスプローラのMAF AMXファイル

OEPEは、コンポーネント・ライブラリをインポートし、ページを表示するために必要なコードの追加も行います。このコードは、図12-16に示す「ソース」エディタに表示されます。

すべてのファセットを選択してページを作成した場合、次の点に注意してください。

- ヘッダーは出力テキスト・コンポーネントで作成されます。これはこのコンポーネントが通常ページ・タイトルに使用されるためです。

- プライマリおよびセカンダリのアクションは、ボタン・コンポーネントで作成されます。これは、これが通常のパターンであるためです。

- フッターの場合、1つだけ群を抜いているパターンはないため、デフォルトでは出力テキスト・コンポーネントで作成されますが、これは、このコンポーネントがいくつかのパターンで使用されており、OEPEが監査違反のある初期コードを生成することを回避できるためです。

- ヘッダー・ファセットを追加せずにプライマリまたはセカンダリのいずれかのアクションを追加しても、ヘッダー・セクションは「MAF AMXページの作成」ダイアログのページ・ファセット・セクションに表示されます。

図12-17に、いずれのファセットも選択していない「MAF AMXページの作成」ダイアログの「ページ・ファセット」セクションを示し、図12-18に、「プレビュー」ペインおよび生成されたMAF AMXコードを示します。

図12-17 ファセットが選択されていないMAF AMXページの作成

図12-18 ファセットがないMAF AMXページ

12.3.1.4 UIエディタの使用方法

注意:
この機能は、OEPE実行時のみに利用でき、手動で実行する必要があります。設計時の機能としては利用できません。

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

MAF AMXでは、OEPEの「ページ定義に移動」機能がサポートされているため(図12-19および第12.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照)、バインディング情報をすばやく見つけて編集できるようにするポップアップ・メニューを使用することで、MAF AMXページ定義に移動できます。

図12-19 「ページ定義」エディタ

次の場所から「ページ定義に移動」オプションを含むポップアップ・メニューを起動できます。

- ソース・エディタ(図12-20)

図12-20 「ソース」エディタからの「ページ定義に移動」

- アプリケーション・ウィンドウ(図12-21に示すとおり、ページを右クリックして「次で開く」→「その他」を選択し、次に「ページ定義エディタ」を選択)

図12-21 アプリケーション・ウィンドウからページ定義への移動

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

MAF AMXページのコンテンツの共有を有効にできます。フラグメント(fragment)は、MAF AMXページ要素(属性やファセットなど)の再利用可能な部分を、テンプレートによって表されるコンテンツに挿入できるようにする動的宣言コンポーネントです。アプリケーションの様々なページでFragmentテンプレートを再利用することで、アプリケーションのルック・アンド・フィールを標準化できます。

MAF AMXフラグメント・ファイル( .amxf)をMAF AMXページまたは別のフラグメント・ファイルにドラッグ・アンド・ドロップすることで、フラグメントへの参照を作成し、その属性を定義できます。フラグメント・ファイルはプロジェクト内にあり、プロジェクト・エクスプローラ・ウィンドウから、「ソース」エディタで開いているターゲット・ソース・ファイルにドロップできます。

始める前に:

MAFアプリケーションにビュー・プロジェクトが含まれていることを確認します。

ビュー・プロジェクトに、MAF AMXページまたはMAF AMXページのタスク・フロー(ここからページを作成します)が含まれていない場合、タスク・フロー・ダイアグラムのビュー・アイコンをダブルクリックして「MAF AMXページの作成」ダイアログを開くことができます(第12.3.1.2項「MAF AMXページの作成」を参照)。

「ファイル」メニューからフラグメントを作成するには:

1. OEPEのトップレベル・メニューから「ファイル」をクリックし、「新」→「MAFページ」を選択します。

2. 「新規MAFページ」ダイアログで、「ページ・フラグメント」ボタンをクリックして選択します。「内容の表示」ノードを開き、必要に応じてわかりやすいファイル名を入力してから、「終了」をクリックします(図12-22を参照)。ページ・フラグメントではファセットは選択できないことに注意してください。

図12-22 新しいフラグメントの作成

3. ダイアログへの入力が完了すると、新しく作成したファイルがOEPEのソース・エディタ内に開きます(図12-23を参照)。

図12-23 フラグメント・ファイル

例12-11に、fragment1.amxfというMAF AMXのフラグメント・ファイルを示します。

例12-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コンポーネントを作成して(第13.2.13項「Fragmentコンポーネントの使用方法」を参照)、選択したフラグメント・ファイルにそのsrc属性を設定します。例12-12は、MAF AMXページに追加されたfragment要素を示しています。この要素は、そのページ・コンテンツとしてfragment1.amxfを指します。同時に、ファセット定義MAF AMXコンポーネントに対応するfacetRef要素は、そのfacet (MAF AMX Facetコンポーネント)としてfacet1を指します。facetRef要素は、.amxfファイルのfragmentDef内でのみ指定できます。MAF AMXのattribute要素を子として指定することで、属性をfacetRefに渡すことができ、これにより、attributeの値を介してフラグメントからファセットにEL変数を渡すことができます。

例12-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>

フラグメントは次のものをサポートしています。

- 埋込みポップアップ(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

- 1つ以上の別の親ページまたはフラグメントに配置できる再利用可能なユーザー・インタフェースこれにより、バインドなしで他のコンポーネントから成るコンポーネントを作成できます。

- 独自のファセットの定義。これにより、ヘッダー・ファセット、サマリー・ファセットおよび詳細ファセットをファセットごとに独自のスタイル・クラスとルック・アンド・フィールを設定しながら定義するレイアウト・コンポーネントなどのコンポーネントを作成できます。

- 属性とコレクションの両方を備えたデータ・モデル。

FragmentDemoおよびCompGalleryというMAFサンプル・アプリケーションでは、フラグメントの作成および使用方法を示します。これらのサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」から利用できます。

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

MAF AMXページを作成すると、ページへのMAF AMX UIコンポーネントおよびデータ・コントロールの追加を開始できます。

12.3.2.1 UIコンポーネントの追加

「パレット」を使用して、MAF AMXコンポーネントおよびMAF AMXデータ視覚化コンポーネントをページにドラッグ・アンド・ドロップできます。OEPEによって必要な宣言的ページ・コードが追加され、各コンポーネント属性に特定の値が設定されます。

「パレット」には、MAF AMXコンポーネントがカテゴリ別に表示されます。

- 制御フロー

- アクティビティ

特定のコンポーネントの追加および使用については、第13.3項「UIコンポーネントの作成と使用方法」を参照してください。

「パレット」には、MAF AMXデータ視覚化コンポーネントもカテゴリ別に表示されます。

- 共通: 次のサブカテゴリがあります。

- チャート

- ゲージ

- マップ

- その他

- 共有子タグ

- その他のタイプ固有の子タグ: 次のサブカテゴリがあります。

- チャート

- ゲージ

- NBox

- テーマ・マップ

- 時系列

- サンバーストおよびツリーマップ

始める前に:

MAFアプリケーションには、ビュー・プロジェクトが含まれている必要があり、これには、MAF AMXページまたはMAF AMXページのタスク・フロー(ここからページを作成します)が含まれている場合と含まれていない場合があります。

「MAF AMXページの作成」ダイアログを起動するには、第12.3.1.2項「MAF AMXページの作成」で説明するように、タスク・フロー・ダイアグラムでビュー・アイコンをダブルクリックするか、「新」→「MAFページ」を選択します。

UIコンポーネントをページに追加するには:

1. 「ソース」エディタでMAF AMXページを開きます(デフォルト)。

2. 「パレット」の「タグ」パネルで、「MAF AMX」を選択します。

ヒント:
「パレット」が(閉じられているために)表示されていない場合、メインOEPEメニューから「ウィンドウ」→「新規ウィンドウ」を選択します。これにより、「パレット」を表示するOEPEの新しいインスタンスが作成されます。デフォルトでは、「パレット」はOEPEの左下角に表示されます。

3. 使用するコンポーネントを選択し、「ソース」エディタまたは「構造」ウィンドウにドラッグ・アンド・ドロップします。「プレビュー」ペインにコンポーネントをドロップすることはできません。

注意:
MAF AMXページの構築の際、UIコンポーネントは、「パネル・グループ・レイアウト」などのUIコンテナにのみドロップできます。

新たに追加されたコンポーネントを使用して、OEPEで「プレビュー」ペインのページが再描画されます。

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

注意:
この機能は、OEPE実行時のみに利用でき、手動で実行する必要があります。設計時の機能としては利用できません。

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

データ・コントロール要素を「データ・コントロール」ウィンドウからドラッグし、「構造」ウィンドウまたは「ソース」エディタのいずれかにドロップすることで、MAF AMXビューでデータバインドされたUIコンポーネントを作成できます。「データ・コントロール」ウィンドウからアイテムをドラッグしてこれらのいずれかの場所にドロップすると、ドロップしたアイテムに使用できるデフォルトUIコンポーネントのポップアップ・メニューが表示されます。目的のUIコンポーネントを選択すると、そのコンポーネントがMAF AMXページに挿入されます。また、関連ページ定義ファイルにバインディング情報が作成されます。そのようなファイルが存在しない場合は、OEPEによって作成されます。MAFには、データ・コントロールのドロップ用のビジュアル・インジケータが用意されており、新しいデータ・コントロールの場所を知らせます。

注意:
データ・コントロールは、基礎となるXMLスキーマで許可された場所にのみドロップできます。

方法によっては、様々なタイプのデータ・コントロールをMAF AMXページの「構造」ウィンドウに挿入できます。図12-24に、「パレット」の「タグ」ペインで利用できるデータ・コントロールを示します。

図12-24 「パレット」のHTMLコントロール・タグ

コレクションの属性をドロップすることにより、様々な入力および出力コンポーネントを作成できます。ページにデータ・コントロール操作をドロップすることにより、ボタンおよびリンク・コンポーネントも作成できます。

これらの各操作に対し、MAF AMXボタンにそれぞれのアクション・リスナーが追加されます。

データ・コントロールの属性および操作は、次の1つ以上のMAF AMX UIコンポーネントとしてドロップできます(第13.3項「UIコンポーネントの作成と使用方法」を参照してください)。

- ボタン

- リンク

- 入力日

- ラベル付入力日

- 入力テキスト

- ラベル付入力テキスト

- 出力テキスト

- ラベル付出力テキスト

- イテレータ

- リスト・アイテム

- リスト・ビュー

- ブール・チェックボックスの選択

- ブール・スイッチの選択

- ボタンを1つ選択

- 選択肢を1つ選択

- ラジオ・ボタンを1つ選択

- チェックボックスを複数選択

- 選択肢を複数選択

- 日時の変換

- 数値の変換

- フォーム

- 読取り専用フォーム

- パラメータ・フォーム

次の日付および数値タイプがサポートされています。

- java.util.Date

- java.sql.Timestamp

- java.sql.Date

- java.sql.Time

- java.lang.Number

- java.lang.Integer

- java.lang.Long

- java.lang.Float

- java.lang.Double

OEPEの「データ・コントロール」ウィンドウの使用方法の詳細は、第14.6項「データ・コントロール・パレットからのデータバインドされたコンポーネントUIコンポーネントの作成」を参照してください。

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

MAF AMXページにすでにパネル・フォーム・レイアウト・コンポーネントが含まれているか、すべてのフィールドを追加する必要がない場合は、データ・コントロールから個別の属性をドロップできます。属性タイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

日付

このカテゴリは、MAF入力日およびラベル付MAF入力日のコントロールを作成するためのオプションを提供します。図12-25は、属性を「データ・コントロール」ウィンドウからMAF AMXページの「ソース」エディタまたは「構造」ウィンドウにドラッグすると表示される日付コントロールを追加するためのポップアップ・メニューを示しています。

図12-25 日付コントロールのポップアップ・メニュー

単一選択

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAFボタンを1つ選択

- MAF選択肢を1つ選択

- MAFラジオ・ボタンを1つ選択

- MAFブール・チェックボックスの選択

- MAFブール・スイッチの選択

既存のMAF AMXページを使用していて、「MAFボタンを1つ選択」または「MAF選択肢を1つ選択」オプションを選択すると、適切な「リスト・バインディングの編集」ダイアログが表示されます(図12-26を参照してください)。新しいMAF AMXページにコントロールをドロップした場合には、かわりに「アクション・バインディングの編集」ダイアログが開かれます。「OK」をクリックすると、「リスト・バインディングの編集」が開かれます。

注意:
単一選択またはブール選択のコンポーネントとして任意のデータ・コントロール属性をドロップするたびに、それぞれ「リスト・バインディングの編集」または「Booleanバインディングの編集」が表示されます。

図12-26 ボタンを1つ選択コントロールおよび選択肢を1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFラジオ・ボタンを1つ選択」オプションを選択すると、図12-27に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図12-27 ラジオ・ボタンを1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFブール・チェックボックスの選択」または「MAFブール・スイッチの選択」オプションを選択すると、図12-28に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図12-28 ブール・チェック・ボックスおよびスイッチの選択コントロールの「リスト・バインディングの編集」ダイアログ

テキスト

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

図12-29は、属性を「データ・コントロール」ウィンドウからMAF AMXページの「ソース」エディタまたは「構造」ウィンドウにドラッグすると表示されるテキスト・コントロールを追加するためのポップアップ・メニューを示しています。

図12-29 テキスト・コントロールのポップアップ・メニュー

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

属性に加え、操作およびカスタム・メソッドもドラッグ・アンド・ドロップできます。操作やメソッドのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

操作

データ・コントロール操作のカテゴリです。次のオプションがあります(図12-30を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図12-30 操作のポップアップ・メニュー

注意:
操作またはメソッドを、リスト・ビュー・コントロールの子としてドロップすると、ポップアップ・メニューは表示されず、リスト・アイテムが自動的に作成されます。これは、リスト・ビュー・コントロールの直接の子としてドロップできる有効なコントロールが他にないためです。生成されるリスト・アイテムに対して、OEPEにより次のようなバインディングが作成されます。

<amx:listItem actionListener="#{bindings.getLocation.execute}"/>

メソッド

カスタム・メソッドのカテゴリです。次のオプションがあります(図12-31を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図12-31 「プロパティ」ペインの「一般」タブでのメソッド・コールの編集

「MAFパラメータ・フォーム」オプションでは、フォームに挿入するメソッドまたは操作の引数に加え、各引数に対してそれぞれのコントロールも選択できます(図12-32を参照)。

図12-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}"/>

生成されるバインディングの詳細は、第12.3.2.3.4項「生成されるバインディングに関する必知事項」を参照してください。

次にMAFパラメータ・フォームでサポートされるコントロールのタイプを示します。

- MAF入力日

- ラベル付MAF入力日

- MAF入力テキスト

- ラベル付MAF入力テキスト

- ラベル付MAF出力テキスト

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

コレクションをドラッグ・アンド・ドロップできます。コレクションのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

複数選択

このカテゴリは、複数選択コントロールを作成するためのオプションを提供します。このカテゴリでは次のコントロールが作成されます(図12-33を参照)。

- MAFチェックボックスを複数選択

- MAF選択肢を複数選択

図12-33 複数選択コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「選択肢を複数選択」または「チェックボックスを複数選択」のいずれかを選択すると、「リスト・バインディングの編集」ダイアログが表示されます(図12-34を参照)。

図12-34 複数選択コントロールの「リスト・バインディングの編集」ダイアログ

フォーム

このカテゴリは、MAF AMXパネル・フォーム・コントロールを作成するために使用されます。「パレット」の「HTML」ペインから「フォーム」を選択すると、OEPEには「新規フォーム」ダイアログが表示されます(図12-35を参照)。

図12-35 「新規フォーム」ダイアログ

メソッド(getまたはpost)を選択し、目的のアクションを入力します。OEPEでは基本HTMLフォーム・タグがソースに追加され、「プロパティ」ペインから「値」フィールドを編集できます(図12-36を参照)。

図12-36 MAFフォームの「フォーム・フィールドの編集」ダイアログ

イテレータ

これは、子コンポーネントのあるMAF AMXイテレータを作成するためのオプションを提供します(図12-37を参照)。

図12-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>

生成されるバインディングの詳細は、第12.3.2.3.4項「生成されるバインディングに関する必知事項」を参照してください。

次にMAFイテレータでサポートされるコントロールを示します。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

リスト・ビュー

これは、子コンポーネントのあるMAF AMXリスト・ビューを作成するためのオプションを提供します(図12-38を参照)。

図12-38 リスト・ビュー・コントロールのポップアップ・メニュー

表12-4は、「ListViewギャラリ」に表示される、サポートされるリスト・フォーマットを示しています。

表12-4 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

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

表12-5は、コンポーネントがドロップされたときにMAF AMXページに追加されるサンプル・バインディングを示しています。

表12-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>

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

最初のドラッグ・アンド・ドロップ・イベントにより、次のディレクトリとファイルが生成されます。

図12-39に、ドラッグ・アンド・ドロップ時に生成されるDataBindings.cpxファイル例を示します。

図12-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ファイルが作成されると、それをソース・ビュー(図12-39を参照)またはエディタで開くことができます。

ファイルの「ページ・マッピング」(pageMap)セクションにより、IDを使用して各MAF AMXページまたはタスク・フロー・アクティビティが対応するページ定義ファイルにマップされます。「ページ定義の使用方法」(pageDefinitionUsages)セクションにより、ページ定義IDはMAF AMXアプリケーション機能のページ定義ファイルの絶対パスにマップされます。「データ・コントロールの使用方法」(dataControlUsages)セクションは、ページ定義ファイル内で定義済のバインディング・オブジェクトによって使用されるデータ・コントロールを識別します。これらのマッピングにより、ページの起動時にバインディング・コンテナを初期化できます。

エディタで、現在のID名をダブルクリックし、インラインで編集することで、ページ定義ファイルまたはデータ・コントロールのID名を変更できます。そうすることで、MAF AMXアプリケーション機能のすべての参照が更新されます。ただし、OEPEで更新されるのはID名のみであり、ファイル名は更新されません。データ・コントロール名を予約語に変更しないようにしてください。

「構造」ウィンドウでDataBindings.cpxファイルの要素をクリックし、「プロパティ」ウィンドウを使用してプロパティ値を変更することもできます。

図12-40に、ドラッグ・アンド・ドロップ時に生成されるPageDefファイル例を示します。

図12-40 PageDefファイル

ページ定義ファイルでは、実行時にMAF AMX UIコンポーネントにデータを移入するバインディング・オブジェクトを定義します。バインディングを持つすべてのMAF AMXページには、そのページで使用するバインディング・オブジェクトの定義が含まれる、対応するページ定義ファイルが必要です。ページ定義ファイルによって、すべてのバインディングに設計時アクセスが提供されます。実行時には、ページ定義ファイルによって定義されたバインディング・オブジェクトが、ページ定義ファイルの実行時インスタンスであるバインディング・コンテナ内でインスタンス化されます。

「データ・コントロール」ウィンドウを初めて使用してページにコンポーネントを追加する際には、OEPEによって、そのページのページ定義ファイルが自動的に作成され、コンポーネントが参照する各バインディング・オブジェクトの定義が自動的に追加されます。それ以降、ページにデータバインド・コンポーネントを追加するたびに、OEPEによって、必要なバインディング・オブジェクト定義がページ定義ファイルに自動的に追加されます。

デフォルトでは、ページ定義ファイルは、「ViewController」プロジェクトのApplication Sourcesノードにあるmobile.PageDefsパッケージに含まれています。対応するMAF AMXページがデフォルト以外のディレクトリ、またはデフォルトのサブディレクトリに保存されると、ページ定義も同じ名前のペッケージに保存されます。

ページ定義ファイルを開く方法の詳細は、第12.3.1.5項「ページ定義ファイルへのアクセス」を参照してください。ページ定義ファイルをエディタで開くと、次のタブを使用してMAF AMXページのバインディング、コンテキスト・イベントおよびパラメータを表示し、構成できます。

- バインディングと実行可能ファイル: このタブでは、バインディング、実行可能ファイルおよび関連付けられたデータ・コントロールの3つの異なるタイプのオブジェクトが表示されます。バインディングと実行可能ファイルは、選択しないかぎりデータ・コントロールには表示されないことに注意してください。
デフォルトでは、モデル・バインディング・オブジェクトは、そのオブジェクトを作成するために使用されたデータ・コントロール・オブジェクトの名前が付けられます。データ・コントロール・オブジェクトが1ページ内で何度も使用される場合、OEPEではデフォルトのバインディング・オブジェクト名に数字を追加して、それぞれが一意になるようにします。

- コンテキスト・イベント: MAF AMXアプリケーション機能内のアーティファクトが登録可能なコンテキスト・イベントを作成できます。

- パラメータ: パラメータ・バインディング・オブジェクトは、リクエストの開始時にページが評価するパラメータを宣言します。静的値または静的値を割り当てるEL式を使用して、ページ定義ファイルのパラメータ値を定義できます。

エディタの項目(または「構造」ウィンドウの関連付けられたノード)をクリックすると、「プロパティ」ウィンドウを使用してその項目の属性値を表示および編集したり、「ソース」タブをクリックしてXMLソースを直接編集できます。

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

OEPEの「バインディング」タブ(図12-41を参照)は、MAF AMXエディタにあります。ここには、特定のMAF AMXページに対して定義されたデータ・バインディングが表示されます。バインディングを選択すると、基盤となるデータ・コントロールへのリレーションシップが示され、PageDefファイルへのリンクが提供されます。

図12-41 「バインディング」タブ

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

「構造」ウィンドウからMAF AMXコンポーネントを削除または切り取ると、使用されないバインディングは自動的にページから削除されます。

注意:
「ソース」エディタからコンポーネントを削除した場合には、バインディングは削除されません。

図12-42は、バインディングを参照するリスト・ビュー・コンポーネントの削除を示しています。削除すると、関連するバインディング・エントリが、対応するPageDef.xmlファイルから自動的に削除されます。

図12-42 バインドされたコンポーネントのページからの削除

図12-43では、ページからリスト・ビュー・コンポーネントを切り取ることにより、これを削除しています。

図12-43 バインドされたコンポーネントのページからの切取り

「切取り」をクリックすると、図12-44に示すような「ADFバインディングの削除の確認」ダイアログが表示され、該当するバインディングを削除するかどうかを選択するよう求められます。

図12-44 「ADFバインディングの削除の確認」ダイアログ

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

「パレット」からコンポーネントをドロップするか、データ・コントロールをドラッグ・アンド・ドロップすることにより、要素が追加されると、MAFは一意の要素識別子(id)を生成し、自動的にこれをMAF AMXページに挿入します。これにより、同じページ内の類似したコンポーネントでもそれぞれを識別する、MAF AMXページ内の有効な識別子となります。

MAFは、次のことを行う識別子監査ユーティリティを提供しています。

- MAF AMXページにおける識別子の存在と一意性を確認する。

- 識別子が存在しない場合または一意でない場合、要素の必須id属性ごとにエラーが報告される。

- 自動修正により、識別子の問題が報告されると、要素の一意のidが生成される。

図12-45および図12-46は、「ソース」エディタと「構造」ペインの識別子エラー・レポートをそれぞれ示しています。

図12-45 「ソース」エディタの要素識別子監査

図12-46 「構造」ペインの要素識別子監査

idに加え、監査ユーティリティでは「ポップアップ表示動作」操作のpopupIdおよびalignId属性をチェックします(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

図12-47および図12-48は、「ソース」エディタの「ポップアップ表示動作」の「ポップアップID」属性と「位置合せID」属性のエラー・レポートをそれぞれ示しています。

図12-47 「ソース」エディタのポップアップID属性監査

図12-48 「ソース」エディタの位置合せID属性監査

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

MAFによって使用されるセキュリティ・アーキテクチャでは、MAF AMXページをホストしているブラウザが、リソース取得のためにセキュア・サーバーへの接続に必要なセキュリティ情報にアクセスしないことが保証されます。これはMAF AMXページから行われるAJAXコールに直接影響し、これらのコールはサポートされていないため、MAF AMX UIコンポーネント内からのJavaScriptの使用は制限されます。サーバーとの通信は、埋込みJavaコード層から行う必要があります。

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

この章では、MAF AMXページのユーザー・インタフェースを作成する方法について説明します。

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

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

- 第13.2項「ページ・レイアウトの設計」

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

- 第13.4項「ジェスチャーの有効化」

- 第13.5項「データ視覚化の指定」

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

- 第13.7項「UIコンポーネントのローカライズ」

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

- 第13.9項「入力の検証」

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

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

MAFは、iOSとAndroidのどちらのユーザー操作性に対しても適切に動作するMAF AMXページの作成を可能にする一連のUIコンポーネントおよび操作を提供します。

MAF AMXは、UIコンポーネントおよび操作をエディタ・ウィンドウで追加できることにより、通常のOEPEの開発環境を維持しています。本質的には、MAF AMX UIコンポーネントは、iOSおよびAndroidのプラットフォームでネイティブ・コンポーネントのHTML相当物をレンダリングし、OEPEでのそれらのデザインタイムの動作は、その他のテクノロジで使用されるコンポーネントに似ています。さらに、これらのUIコンポーネントは、宣言ナビゲーションおよびデータ・バインディングのためにMAFのコントローラおよびモデルと統合されています。

注意:
モバイル・デバイス用のインタフェースを開発する場合は、画面領域が非常に限られていることに常に注意してください。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

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

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

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

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

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

MAF AMXは、ページ内へのUIコンポーネントの配置を可能にするレイアウト・コンポーネント(表13-1にリスト)を提供します。通常、これらのコンポーネントを使用してページの構築を開始し、次にこれらのコンテナ内で、または子コンポーネントとして、他の機能を提供する他のコンポーネントを、レイアウト・コンポーネントに追加します。これらのコンポーネントのいくつかは、拡大するコンポーネント内に配置されたときに拡大する機能などの形状管理機能を提供します。

表13-1 MAF AMXのページ管理、レイアウトおよび間隔調整コンポーネント

コンポーネント

タイプ

説明

表示

コア・ページ構造コンポーネント

MAF AMXファイル内にview要素を作成します。ファイルが作成されるときにファイルに自動的に挿入されます。詳細は、第13.2.1項「表示コンポーネントの使用方法」を参照してください。

パネル・ページ

コア・ページ構造コンポーネント

MAF AMXファイル内にpanelPage要素を作成します。ページ内の中央領域(ヘッダー領域とフッター領域の間を垂直方向にスクロールする)を定義します。詳細は、第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

MAF AMXファイルの詳細は、第12.3.1.2項「MAF AMXページの作成」を参照してください。

ファセット

コア・ページ構造コンポーネント

MAF AMXファイル内にfacet要素を作成します。任意の名前のファセットを親コンポーネントに定義します。詳細は、第13.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

フラグメント

コア・ページ構造コンポーネント

MAF AMXファイル内にfragment要素を作成します。ページ・コンテンツの共有を可能にします。詳細は、第13.2.13項「フラグメント・コンポーネントの使用方法」を参照してください。

ファセット定義

コア・ページ構造コンポーネント

MAF AMXファイル内にfacetRef要素を作成します。ページ・フラグメントの定義(fragmentDef)で、ページ・フラグメントの使用箇所で定義されたファセットを参照するために使用します。詳細は、第13.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

パネル・グループ・レイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelGroupLayout要素を作成します。子コンポーネントを縦または横にグループ化します。詳細は、第13.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・フォーム・レイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelFormLayout要素を作成します。入力テキストなどのコンポーネントを、それらのラベルおよびフィールドが水平に、または各コンポーネントの上に整列するように配置します。詳細は、第13.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・ラベルおよびメッセージ

ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelLabelAndMessage要素を作成します。ラベルおよびその子をレイアウトします。詳細は、第13.2.6項「パネル・ラベルおよびメッセージ・コンポーネントの使用方法」を参照してください。

パネル・ストレッチ・レイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelStretchLayout要素を作成します。別のパネルの両側にパネルを配置できます。詳細は、第13.2.5項「パネル・ストレッチ・レイアウト・コンポーネントの使用方法」を参照してください。

ポップアップ

セカンダリ・ウィンドウ

MAF AMXファイル内にpopup要素を作成します。詳細は、第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照してください。

パネル・スプリッタ

インタラクティブ・ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelSplitter要素を作成します。詳細は、第13.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

パネル・アイテム

インタラクティブ・ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelItem要素を作成します。詳細は、第13.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

デック

ページ・レイアウト・コンテナ

MAF AMXファイル内にdeck要素を作成します。詳細は、第13.2.12項「デック・コンポーネントの使用方法」を参照してください。

スペーサ

間隔調整コンポーネント

MAF AMXファイル内のspacer要素によって表される空白の領域を作成します。

詳細は、第13.2.10項「スペーサ・コンポーネントの使用方法」を参照してください。

表のレイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にtableLayout要素を作成します。行で構成された表を表します。詳細は、第13.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

行のレイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にrowLayout要素を作成します。表のレイアウト・コンポーネント内でセルで構成されている行を表します。詳細は、第13.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

セル・フォーマット

ページ・レイアウト・コンポーネント

MAF AMXファイル内にcellFormat要素を作成します。行のレイアウト・コンポーネント内のセルを表します。詳細は、第13.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

レイアウト・コンポーネントを追加するには、それを「パレット」からMAF AMXページにドラッグ・アンド・ドロップします(第12.3.2.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>

図13-1 デザインタイムのページ・レイアウト・コンポーネント

レイアウト・コンポーネントのビジュアル・プレゼンテーションを管理するには、標準Cascading Style Sheet (CSS)を使用します。CSSは、アプリケーション・プロジェクトのView Content/cssディレクトリにあり、デフォルトのCSSはMAFによって提供されています。詳細は、第13.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

MAF AMXを使用してiOSプラットフォーム用に作成されたユーザー・インタフェースは、言語環境が左から右、右から左のどちらであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。ポップアップ(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)、パネル・アイテム、パネル・スプリッタ(第13.2.9項「パネル・スプリッタ・コンポーネントの使用方法」)などの一部のMAF AMXレイアウト・コンポーネントは、特定の右から左の動作を有効化するように構成できます。MAF AMXページの右から左の構成の詳細は、第13.4項「ジェスチャーの有効化」および第12.2.11項「ページ遷移スタイルの指定方法」を参照してください。

注意:
右から左のテキスト方向は、Androidプラットフォームではサポートされていません。

UIDemoという名前のMAFサンプル・アプリケーションは、ボタンなどのMAF AMX UIコンポーネントとともにレイアウト・コンポーネントを使用して一般的なパターンに従った一般的なレイアウトのいくつかを実現する方法を示しています。さらに、このサンプル・アプリケーションは、スタイルを使用してページ・レイアウトを特定のパターンに合せる方法を示します。UIDemoアプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

表示(MAF AMXファイルのview要素)は、コア・ページ構造コンポーネントであり、MAF AMXファイルの作成時にそのファイルに自動的に挿入されます。このコンポーネントは、ページおよびその構造の階層表現を提供し、単一のMAF AMXページを表します。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

パネル・ページ(MAF AMXファイルのpanelPage要素)は、他のコンポーネントをレイアウトする画面のスクロール可能領域の定義を可能にするコンポーネントです。

デフォルトでは、MAF AMXページを作成するときに、OEPEによってパネル・ページ・コンポーネントが自動的に作成され、そのページに挿入されます。そのページにコンポーネントを追加すると、それらはパネル・ページ・コンポーネント内に挿入されます。

特定の領域(ページのヘッダーやフッターなど)をスクロールできないようにし、向きが変更されたときのストレッチを有効化するには、パネル・ページに対してファセット・コンポーネントを指定します。パネル・ページのヘッダー・ファセットには、各ページのナビゲーション・バーに配置されるタイトルが含まれています。パネル・ページに含めることができる他のタイプのファセット・コンポーネントの詳細は、第13.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

次の例は、MAF AMXファイルに定義されたpanelPage要素を示しています。このパネル・ページには、ヘッダー・ファセットが含まれています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
</amx:facet>
</amx:panelPage>

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.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>

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

パネル・グループ・レイアウト・コンポーネントのスクロール動作は、scrollPolicy属性によって定義され、auto(デフォルト)、noneまたはscrollに設定できます。この動作は、デフォルトでは、アクティブ・スキンに定義されているものになります。

アクティブ・スキンに定義されている動作にかかわらずスクロールを無効にするには、scrollPolicy属性をnoneに設定します。パネル・グループ・レイアウト・コンポーネントがスクロール可能でない場合は、この内容は制限されません。

アクティブ・スキンに定義されている動作にかかわらずスクロールを有効にするには、scrollPolicy属性をscrollに設定します。パネル・グループ・レイアウト・コンポーネントがスクロール可能な場合は、コンポーネントのサイズが制限されるときにスクロールが提供されます。

スクロールでは大量のメモリーが消費され、アプリケーションがクラッシュする可能性があるため、スクロールの使用は最小限にする必要があります。mobileAltaスキン(第13.6.3項「スキニングに関する必知事項」を参照)では、パネル・グループ・レイアウト、パネル・フォーム・レイアウト(第13.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照)および表のレイアウト(第13.2.11項「表のレイアウト・コンポーネントの使用方法」を参照)のスクロールは無効化されています。アプリケーションではmobileAltaスキンを使用し、インスタンスでscrollPolicyをscrollに設定するのは必要な場合に限定することをお薦めします。パネル・フォーム・レイアウトおよび表のレイアウトのスクロール動作をシミュレートするには、スクロールが必要になったときに、スクロール可能なパネル・グループ・レイアウト・コンポーネントでそれらを囲みます。

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

パネル・フォーム・レイアウト(panelFormLayout)コンポーネントは、コンポーネントをそれらのラベルおよびフィールドが水平方向に整列するように配置します。一般的に、パネル・フォーム・レイアウト・コンポーネントのメイン・コンテンツは、入力コンポーネント(入力テキストなど)および選択コンポーネント(選択肢など)で構成されています。label属性が定義されている子コンポーネントをパネル・フォーム・レイアウト・コンポーネント内に配置すると、その子コンポーネントのラベルおよびフィールドはパネル・フォーム・レイアウトの定義に基づいて整列およびサイズ設定されます。パネル・フォーム・レイアウト内では、ラベル領域は、フィールド領域の開始側上またはフィールド領域の上の独立した線上のどちらにも表示できます。独立した線は、パネル・フォーム・レイアウトのlabelPosition属性がtopStart、topCenterまたはtopEndに設定されている場合に使用されます。それ以外の場合は、ラベル領域はフィールド領域の開始側上に表示されます。ラベル領域内では、labelPosition属性によって、次のようにラベル・テキストを整列できる位置が制御されます。

- 開始側(labelPosition="start"またはlabelPosition="topStart")

- 中央(labelPosition="center"またはlabelPosition="topCenter")

- 終了側(labelPosition="end"またはlabelPosition="topEnd")

フィールド領域内では、fieldHalign属性によって、次のようにフィールド・コンテンツを整列できる位置が制御されます。

- 開始側(fieldHalign="start")

- 中央(fieldHalign="center")

- 終了側(fieldHalign="end")

パネル・フォーム・レイアウト内には、maxColumns属性およびrows属性を使用して、1つ以上の列に子コンポーネントを配置できます。これらの属性は、最適な複数列レイアウトを実現するために、labelWidth、fieldWidth、labelPositionおよびshowHorizontalDividersの各属性とともに使用する必要があります。

注意:
単一列レイアウトから複数列レイアウトに変更するには、maxColumns属性の設定値にかかわらず、rows属性の値を1より大きくする必要があります。rows属性が指定されている場合、maxColumns属性は、列の数をその数値を最大としてレイアウトを制限しますが、子コンポーネントを配置するにはこれと同数の列が必要です。

パネル・フォーム・レイアウト・コンポーネントを追加するには:

1. 「パレット」で、「パネル・フォーム・レイアウト」コンポーネントをMAF AMXページにドラッグ・アンド・ドロップします。

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>

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

パネル・ストレッチ・レイアウト(panelStretchLayout)コンポーネントは、top、bottomおよびcenterの3つの子ファセット・コンポーネントを管理します(次の例を参照)。これらのファセットは、任意の数および組合せで使用できます。

<amx:panelStretchLayout id="psl1">
<amx:facet name="top">
</amx:facet>
<amx:facet name="center">
</amx:facet>
<amx:facet name="bottom">
</amx:facet>
</amx:panelStretchLayout>

パネル・ストレッチ・レイアウト・コンポーネントを積み重ねた3つの長方形のセットで表現しようとする場合、次のことが適用されます。

- 一番上の長方形の高さは、topファセットに指定したとおりの高さで定義されます。

- 一番下の長方形の高さは、bottomファセットに指定したとおりの高さで定義されます。

- 残りの垂直領域が中央の長方形に割り当てられます。この矩形の高さがCenter.heightに定義された値よりも小さく、panelStretchLayoutのscrollPolicy属性がscrollまたはautoのいずれかに設定されている場合、スクロールバーが追加されます。

パネル・ストレッチ・レイアウト・コンポーネントを追加するには、次の手順を実行します。

1. 「パレット」で、「パネル・ストレッチ・レイアウト」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 作成した子ファセット・コンポーネントを確認し、必要に応じて、一部を削除します。

3. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.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>

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

ファセット(facet)コンポーネントは、親レイアウト・コンポーネント上に、ヘッダーやフッターなど任意の名前のファセットを定義するために使用します。ファセットの位置およびレンダリングは、親コンポーネントによって決定されます。

MAF AMXページのヘッダーは、通常、ヘッダー、プライマリおよびセカンダリの各ファセットと組み合せたパネル・ページ・コンポーネント(第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます。

- ヘッダー・ファセット: ページ・タイトルが含まれています。

- プライマリ・アクション・ファセット: ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセット: ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

MAF AMXページのフッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネント(第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます。

- フッター・ファセット: コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

次の例は、パネル・ページ・コンテナ内で宣言されているfacet要素を示しています。ファセットのタイプは、常にそのname属性で定義されます(表13-2を参照)。

<amx:panelPage id="pp1">
<amx:facet name="footer">
<amx:commandButton id="cb2" icon="folder.png"
text="Move (#{myBean.mailcount})"
action"move"/>
</amx:facet>
</amx:panelPage>

表13-2は、特定の親コンポーネントとともに使用できる事前定義済ファセット・タイプを示しています。

表13-2 ファセット・タイプと親コンポーネント

親コンポーネント

ファセット・タイプ(名前)

パネル・ページ(panelPage)

header、footer、primary、secondary

リスト・ビュー(listView)

header、footer

カルーセル(carousel)

nodeStamp、carouselItem

パネル・スプリッタ(panelSplitter)

navigator

パネル・ストレッチ・レイアウト(panelStretchLayout)

top、center、bottom

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

詳細は、第13.5項「データ視覚化の指定」を参照してください。

dataStamp、seriesStamp、overview、rows (NBoxに適用可能)、columns (NBoxに適用可能)、cells (NBoxに適用可能)、icon (NBoxNodeに適用可能)、indicator (NBoxNodeに適用可能)

ファセット・コンポーネントを追加するには:

「アウトライン」ペインに表示されるコンテキスト・メニューを使用して、ファセット・コンポーネントを別のコンポーネントの子として追加できます。コンテキスト・メニューには、選択した親コンポーネントで有効なオプションが表示されます。

ファセットを追加するには、「アウトライン」または「ソース」エディタで親コンポーネントを選択してから、次のいずれかの手順を実行します。

- 図13-2に示すとおり、「アウトライン」でamx:PanelPageエントリを右クリックすると、ファセットを入力できます。

図13-2 パネル・ページにファセットを追加するためのポップアップ・メニューの使用方法

あるいは、次のようにします。

1. 「パレット」で、ファセット・コンポーネントを表13-2に示す別のコンポーネントにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

ポップアップ(popup)コンポーネントを使用して、ポップアップ・ウィンドウを表示します。このコンポーネントは、ビュー・コンポーネントの子として宣言できます。

ポップアップ・コンポーネントとともに次の操作を使用できます。

- ポップアップを閉じる動作(closePopupBehavior)の操作は、クライアントによってトリガーされるイベントに応答してポップアップを閉じる宣言的な方法です。

- ポップアップ表示動作(showPopupBehavior)の操作は、ポップアップ表示動作のtype属性を使用して指定されたクライアントによってトリガーされるイベントに応答してポップアップを表示する宣言的な方法です。
ポップアップ表示動作のpopupId属性には、その親コンポーネントに関連するポップアップ・コンポーネントの一意の識別子を指定します。ポップアップ表示動作のalignId属性には、そのポップアップの位置合せを行う際の基準となるUIコンポーネントの一意の識別子を指定します。識別子を手動で設定するのは、手間がかかり、さらに無効な参照が発生する可能性もあるため、これらの2つの属性の値は標準の「プロパティ」ウィンドウと統合されているエディタを使用して設定します。これらの識別子を検証するために特別に定義されている監査ルールがあります(第12.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>

ポップアップ・コンポーネントは、ユーザー入力エラーが発生したときに検証メッセージを表示できます。詳細は、第13.9項「入力の検証」を参照してください。

ポップアップの子を設定するには、次の手順を実行します。

1. 「アウトライン」ペインでpopup要素を選択し、マウスの右ボタンをクリックします。

2. ポップアップ・コンポーネントのリストから「子の追加」を選択します(図13-3を参照)。

図13-3 ポップアップの子属性のリストからの選択

3. このポップアップ表示動作が起動したときに表示されるポップアップ・コンポーネントを選択します。

UIDemoという名前のMAFサンプル・アプリケーションは、ポップアップ・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。UIDemoアプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

パネル・スプリッタ(panelSplitter)コンポーネントは、左側にあるナビゲーション・ペインで制御可能な複数のコンテンツ領域を表示するために使用します。パネル・スプリッタ・コンポーネントは、通常、表示サイズが大きいタブレット・デバイスで使用されます。これらのコンポーネントは、通常、表示領域の左側にリストが、右側にコンテンツがある場合に使用されます。

パネル・スプリッタには、MAF AMXページにパネル・スプリッタをドラッグ・アンド・ドロップすると自動的に生成されるナビゲータ・ファセット(第13.2.7項「ファセット・コンポーネントの使用方法」を参照)、およびパネル・アイテム・コンポーネントを含めることができます。パネル・アイテム(panelItem)コンポーネントは、パネル・スプリッタのコンテンツ領域を表します。各パネル・スプリッタ・コンポーネントには少なくとも1つのパネル・アイテムが必要なため、パネル・スプリッタが作成されるときにパネル・アイテムがパネル・スプリッタに自動的に追加されます。各パネル・アイテム・コンポーネントには、パネル・グループ・レイアウトに含めることができるどのようなコンポーネントも含めることができます(第13.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タグ・リファレンスを参照してください。

13.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..."/>

13.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>

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

デック(deck)コンポーネントは、一度に1つの子コンポーネントを示すコンテナを表します。表示されている1つの子コンポーネント(displayedChild属性で定義)から別の子コンポーネントへの遷移は、遷移(transition)操作で有効になります。遷移はアニメーションの形態で行うことができます。遷移の詳細は、第12.2.11項「ページ遷移スタイルの指定方法」を参照してください。

デックは、前後に移動できます。

デック・コンポーネントを追加するには、次の手順を実行します。

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タグ・リファレンスを参照してください。

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

フラグメント(fragment)コンポーネントによってMAF AMXページ・コンテンツの共有が可能になります。このコンポーネントは、MAF AMXフラグメント・ファイルとともに使用されます。詳細は、第12.3.1.6項「ページ・コンテンツの共有」を参照してください。

フラグメント・コンポーネントを追加するには、次の手順を実行します。

1. 「コンポーネント」ウィンドウで、「フラグメント」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 「フラグメントの挿入」ダイアログを使用して、フラグメントのSrc属性をフラグメント・ファイル(.amxf)に設定します。

3. オプションで、「構造」ビューを使用して、属性、属性リスト、ファセットなどの子コンポーネントを追加します。

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

第12.3.1項「MAF AMXページの操作方法」には、MAF AMXページおよび対応するMAF AMXフラグメント・ファイルに追加されたfragment要素を示す2つの例があります。

FragmentDemoという名前のMAFサンプル・アプリケーションは、フラグメントの作成および使用方法を示しています。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

MAF AMXアプリケーション機能を開発する際に、次のUIコンポーネントを使用できます。

- 入力テキスト(第13.3.1項「入力テキスト・コンポーネントの使用方法」を参照)

- 入力数値スライダ(第13.3.2項「入力数値スライダ・コンポーネントの使用方法」を参照)

- 入力日(第13.3.3項「入力日コンポーネントの使用方法」を参照)

- 出力テキスト(第13.3.4項「出力テキスト・コンポーネントの使用方法」を参照)

- ボタン(第13.3.5項「ボタンの使用方法」を参照)

- リンク(第13.3.6項「リンクの使用方法」を参照)

- イメージ(第13.3.7項「イメージの表示方法」を参照)

- チェックボックス(第13.3.8項「チェックボックス・コンポーネントの使用方法」を参照)

- ブール・スイッチ(第13.3.9項「ブール・スイッチ・コンポーネントの使用方法」を参照)

- チェックボックスを複数選択(第13.3.10項「チェックボックスを複数選択コンポーネントの使用方法」を参照)

- 選択肢を複数選択(第13.3.11項「選択肢を複数選択コンポーネントの使用方法」を参照)

- 選択肢(第13.3.14項「選択肢コンポーネントの使用方法」を参照)

- 選択ボタン(第13.3.12項「選択ボタン・コンポーネントの使用方法」を参照)

- ラジオ・ボタン(第13.3.13項「ラジオ・ボタン・コンポーネントの使用方法」を参照)

- リスト・ビュー(第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)

- カルーセル(第13.3.16項「カルーセル・コンポーネントの使用方法」を参照)

- フィルム・ストリップ(第13.3.17項「フィルム・ストリップ・コンポーネントの使用方法」を参照)

- Verbatim (第13.3.18項「Verbatimコンポーネントの使用方法」を参照)

- 出力HTML (第13.3.19項「出力HTMLコンポーネントの使用方法」を参照)

- イテレータ(第13.3.20項「反復の有効化方法」を参照)

MAF AMXアプリケーション機能を開発する際は、UIコンポーネントの子として、操作、リスナー・タイプ・コンポーネント、コンバータなど、次のその他のコンポーネントも使用できます。

- バンドルのロード(第13.3.21項「リソース・バンドルのロード方法」を参照)

- アクション・リスナー(第13.3.22項「アクション・リスナーの使用方法」を参照)

- プロパティ・リスナーの設定(第13.3.23項「プロパティ・リスナーの設定の使用方法」を参照)

- 日時の変換(第13.3.24項「日時の変換方法」を参照)

- 数値の変換(第13.3.25項「数値の変換方法」を参照)

- ナビゲーション・ドラッグ動作(第13.3.26項「ドラッグ・ナビゲーションの有効化」を参照)

- ロード・インジケータ動作(第13.3.27項「ロード・インジケータの使用方法」を参照)

UIコンポーネントを追加するには、「パレット」からMAF AMXページにそのコンポーネントをドラッグ・アンド・ドロップします(第12.3.2.1項「UIコンポーネントの追加」を参照)。その後に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。各特定コンポーネントの属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

注意:
MAF AMXページで、レイアウト・コンポーネント内にUIコンポーネントを配置します(第13.2項「ページ・レイアウトの設計」を参照)。<dvtm>ネームスペースの下で宣言するデータ視覚化コンポーネントを除き、UI要素は<amx>>ネームスペースの下で宣言します。

いくつかのUIコンポーネントにはイベント・リスナーを追加できます。詳細は、第13.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもMAF AMX実行時の記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

これらのUIコンポーネントにおけるアクセシビリティのサポートの詳細は、第13.8項「MAFのアクセシビリティのサポートの理解」を参照してください。

MAF AMXを使用してiOSプラットフォーム用に作成されたユーザー・インタフェースは、言語環境が左から右、右から左のどちらであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。

注意:
MAFは、デザインタイムにEL式を評価しません。コンポーネントの属性の値が式に設定されている場合、この値はOEPEのプレビューでは式として表示され、実行時のコンポーネントの表示は異なる場合があります。

CompGalleryという名前のMAFサンプル・アプリケーションは、MAF AMX UIコンポーネントの作成および構成方法を示しています。UIDemoという名前のもう1つのサンプル・アプリケーションは、MAF AMXページでのコンポーネントのレイアウト方法を示しています。これらのサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

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

入力テキスト(inputText)コンポーネントは、編集可能テキスト・フィールドを表します。使用可能な入力テキスト・コンポーネントのタイプは次のとおりです。

- 標準単一行入力テキストで、これは、MAF AMXファイルのinputText要素で宣言されます。

<amx:inputText id="text1"
label="Text Input:"
value="#{myBean.text}" />

- パスワード入力テキスト:

<amx:inputText id="text1"
label="Password Input:"
value="#{myBean.text}"
secret="true" />

- 複数行入力テキスト(テキスト領域とも呼ばれる):

<amx:inputText id="text1"
label="Textarea:"
value="#{myBean.text}"
simple="true"
rows="4" />

図13-4は、「プレビュー」ペインに表示されている入力テキスト・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputText id="inputText1"
label="Input Text"
value="text"/>

図13-4 デザインタイムの入力テキスト

inputType属性によって、コンポーネントでユーザー入力がどのように(テキスト(デフォルト)、電子メール・アドレス、数値、電話番号、URLのいずれかとして)解釈されるのかを定義できます。これらの入力タイプは、HTML5によって許容される値に基づいています。

入力テキスト・コンポーネントに入力される日時値とともに数値の変換を有効にするには、数値の変換(第13.3.25項「数値の変換方法」を参照)および日時の変換(第13.3.24項「日時の変換方法」を参照)コンポーネントを使用します。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

いくつかのモバイル・デバイスでは、エンド・ユーザーが入力テキスト・フィールドをタップすると、キーボードが表示(スライドアップ)されます。入力テキストがMAF AMXページの唯一のコンポーネントである場合、ページがロードされるときに、デフォルトで入力フォーカスはこのフィールド上に配置され、キーボードが表示されます。

複数行入力テキストは、それが唯一のコンポーネントである場合、セカンダリ・ページに表示されることがあります。その場合、ページがロードされてキーボードが表示されたときに複数行入力テキストがフォーカスを受け取ります。

iOSデバイスとAndroidデバイスでは、入力テキスト・コンポーネントのレンダリングおよび動作は異なります。iPhoneおよびiPadでは、入力テキスト・コンポーネントが表示されるときに境界線がある場合とない場合があります。

入力テキスト・コンポーネントを作成する際は、次の点を考慮してください。

- コンテンツを入力または編集するには、エンド・ユーザーはフィールド内をタップする必要があります。それにより、タップした場所に点滅する挿入カーソルが表示され、エンド・ユーザーがコンテンツを編集できるようになります。フィールドにコンテンツが含まれていない場合、挿入カーソルはフィールドの先頭に配置されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、通常、プロンプトとして使用されるデフォルト・テキストが含まれていることがあります。エンド・ユーザーがそのようなフィールド内でキーボードのキーをタップすると、編集モードになったときにそのデフォルト・テキストがクリアされます。この動作は、入力テキストのhintText属性を使用して有効化および構成されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、選択済の外観はありません。選択は、フィールド内の点滅する挿入カーソルによって示されます。

- エンド・ユーザーがフィールドに収まる数を超えたテキストを入力すると、タイピングの続行に従って一度に1文字ずつテキスト・コンテンツが左にシフトします。

- 複数行入力テキスト・コンポーネントは、任意の高さの長方形としてレンダリングされます。このコンポーネントでは、コンテンツが大きすぎてフィールドの境界内に収まらない場合のスクロールがサポートされています。テキスト領域が一杯になるとテキストの行が上にスクロールし、新しい行のテキストが追加されます。指定された表示領域に表示できる数よりも多くの行がある場合、エンド・ユーザーは上または下にフリックしてテキストの行をスクロールできます。コンポーネント内にスクロールバーが表示されてその領域がスクロール可能であることを示します。

- パスワード・フィールドは入力された各文字を一時的にエコーし、その後、その文字をドットに変換してパスワードを保護します。

- iOSでの入力テキスト・コンポーネントの外観および動作は、カスタマイズできます(第13.3.1.1項「入力テキスト・コンポーネントのカスタマイズ」を参照)。

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

MAF AMXでは、iOSデバイスでの入力の大文字化および修正をサポートしており、さらに「実行」ボタンまたは「検索」ボタンとして表示および機能し(図13-6参照)、単一行入力テキスト・コンポーネントではDataChangeEventをトリガーするモバイル・デバイスのソフト・キーパッドの右下にある「return」ボタン(図13-5を参照)をオーバーライドする機能もサポートしています。

図13-5 実行時のiOSデバイスの「return」ボタン

図13-6 実行時のiOSの「Go」および「Search」ボタン

表13-3に、入力テキスト・コンポーネントの属性をリストしますが、これらの属性を使用して、そのコンポーネントの外観および動作と、入力テキストによって表されるフィールドへの値の入力に使用されるソフト・キーパッドをカスタマイズできます。

表13-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デバイスでテストする必要があります。

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

入力数値スライダ(inputNumberSlider)コンポーネントは、キーを使用して値を入力するかわりにスライダを使用して値の範囲から数値を選択できるようにします。スライダの溝またはトラックの塗り潰されている部分が、現在の値を視覚的に表しています。

スライダの値を数値的に示すには、出力または入力テキスト・コンポーネントとともに入力数値スライダを使用できます。入力テキスト・コンポーネントではスライダ値を直接入力することもできます。エンド・ユーザーが入力テキスト・フィールドをタップすると、数値モードのキーボードがスライドアップします。このキーボードは、スライドダウン・ボタンを使用するか、スライダ・コンポーネントからタップすることにより消去できます。

入力数値スライダ・コンポーネントは、常に、コンポーネントの定義済範囲内の最大値および最小値を表示します。

注意:
入力数値スライダ・コンポーネントは、正確な数値入力が必要な場合や値の範囲が広い場合(たとえば、0から1000)は使用しないでください。

次の例は、MAF AMXファイルで定義されているinputNumberSlider要素を示しています。

<amx:inputNumberSlider id="slider1" value="#{myBean.count}"/>

図13-7は、「プレビュー」ペインに表示されている入力数値スライダ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputNumberSlider id="inputNumberSlider1"
label="Input Number"
minimum="0"
maximum="20"
stepSize="1"
value="10"/>

図13-7 デザインタイムの入力数値スライダ

入力数値スライダ・コンポーネントに入力される数値の変換を有効にするには、数値の変換コンポーネント(第13.3.25項「数値の変換方法」を参照)を使用します。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

他のMAF AMX UIコンポーネントと同様に、入力数値スライダ・コンポーネントには通常の状態と選択済状態があります。コンポーネントは、いつでもタッチされたときに選択済状態になります。エンド・ユーザーは、スライダ値を変更するには、タッチしてからスライダ・ボタンを操作します。

入力数値スライダ・コンポーネントには、オプションのimageLeft属性およびimageRight属性があり、これらは、エンド・ユーザーに追加情報を提供するためにスライダのいずれかの側に表示可能なイメージを示します。

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

入力日(inputDate)コンポーネントは、日付を入力するためのポップアップ入力フィールドを提示します。デフォルトの日付フォーマットは、現在のロケールに適切な省略の日付フォーマットです。たとえば、米語(ENU)のデフォルトの書式はmm/dd/yyです。inputType属性によって、コンポーネントが入力として日付、時刻または日時を受け入れるのかどうかが定義されます。タイムゾーンは、モバイル・デバイスに対して構成されているタイムゾーンに依存します。したがって、デバイスに関連しています。実行時に、入力日コンポーネントにはそのデバイスのネイティブのルック・アンド・フィールがあります。

次の例は、MAF AMXファイルで定義されているinputDate要素を示しています。このコンポーネントのinputType属性は、デフォルト値のdateに設定されています。value属性が読取り専用の場合、EL式またはその他のタイプの値に設定でき、valueが読取り専用でない場合は、EL式としてのみ指定できます。

<amx:inputDate id="inputDate1" label="Input Date" value="#{myBean.date}"/>

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

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

- W3Cによって定義されているHTML5のグローバル日付と時刻

- 「ファイル」→「新」→「MAFサンプル」にあるCompGallery

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

MAF AMXは、テキストを表示するラベルとして使用するための出力テキスト(outputText)コンポーネントを提供しています。

次の例は、MAF AMXファイルで定義されているoutputText要素を示しています。

<amx:outputText id="ot1"
value="output"
styleClass="#{pageFlowScope.pStyleClass}"/>

図13-8は、「プレビュー」ペインに表示されている出力テキスト・コンポーネントを示しています。

図13-8 デザインタイムの出力テキスト

出力テキスト・コンポーネントの数値および日時関連データの変換を容易にするには、数値の変換(第13.3.25項「数値の変換方法」を参照)および日時の変換(第13.3.24項「日時の変換方法」を参照)コンバータを使用します。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGalleryおよびUIDemo

13.3.5 ボタンの使用方法

ボタン(commandButton)コンポーネントは、アクション(たとえば、保存、取消し、送信)をトリガーするため、およびアプリケーション内で他のページへのナビゲーション(たとえば、戻る。第13.3.5.7項「戻るボタン・ナビゲーションの有効化」を参照)を有効化するために使用します。

ボタンは、次の方法のいずれかで使用できます。

- テキスト・ラベル付きボタン。

- テキスト・ラベルおよびイメージ・アイコン付きボタン。

注意:
アイコン・イメージと配置(テキスト・ラベルの左または右)を定義できます。

- イメージ・アイコンのみが付いたボタン(たとえば、レコードを追加または削除するための + および - ボタン)。

MAFでは、次の3つの表示領域に対して1つのデフォルト・ボタン・タイプがサポートされています。

1. 最上部ヘッダー・バーに表示されるボタンで、MAF AMXページでは、ヘッダーは、ヘッダー、プライマリおよびセカンダリの各ファセットと組み合せたパネル・ページ・コンポーネント(第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます(iPhoneではこれが一般的です)。

- ヘッダー・ファセットには、ページ・タイトルが含まれています。

- プライマリ・アクション・ファセットは、 ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセットは、ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

2. ページのコンテンツ領域に表示されるボタン。

3. ページのフッター・バーに表示されるボタン。MAF AMXページでは、フッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネント(第13.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます。

- フッター・ファセットは、コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

どのタイプでも、すべてのボタン・コンポーネントには次の3つの状態があります。

1. 標準。

2. アクティブ: ボタンがエンド・ユーザーによってタップまたはタッチされたときの外観を表します。ボタンがタップされた(タッチされてリリースされた)ときに、ボタン・アクションが実行されます。タッチしたときにアクティブ化された外観が表示され、リリースしたときにアクションが実行されます。エンド・ユーザーがボタンにタッチした後に指をドラッグしてボタンから離した場合、アクションは実行されません。ただし、ボタンにタッチしている間中、アクティブ化された外観が表示されます。

3. 無効。

ボタン・コンポーネントの外観は、adfmf-commandButton-<style>に設定したそのstyleClass属性によって定義されます。表13-4に示すどのスタイルでも、MAF AMXページ内の有効な任意の場所に配置されているボタンに適用できます。

表13-4 主なボタン・スタイル

ボタン・スタイル名

説明

デフォルト

次の場所に配置されているボタンのデフォルト・スタイル

- いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)内。詳細は、第13.3.5.1項「デフォルト・スタイル・ボタンの表示」を参照してください

- MAF AMXページのコンテンツ領域内の任意の場所。このスタイルは、ページ内のボタンの場所またはコンテキストに基づいてそのページ内で特定のアクションを実行するためのボタンに対して使用されます。

戻る

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)に配置されるボタンの戻るスタイル。このスタイルを、デフォルト・ボタンに適用すると、ページに戻るという外観を表示できます。このボタン・スタイルは、Springboardに戻るまたはページに戻るボタンによく使用されます。

詳細は、第13.3.5.2項「戻るスタイル・ボタンの表示」を参照してください

強調表示

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)またはMAF AMXページのコンテンツ領域に配置されるボタンの強調表示スタイル。このスタイルをボタンに追加すると、保存(または完了)ボタンで一般的なiPhoneボタンの外観を提供できます。

詳細は、第13.3.5.3項「強調表示スタイル・ボタンの表示」を参照してください

アラート

アラート・スタイルは削除の外観をボタンに追加します。詳細は、第13.3.5.4項「アラート・スタイル・ボタンの表示」を参照してください

ボタンに適用して太い角丸の境界線でボタンを修飾できる角丸スタイル(adfmf-commandButton-rounded)があります(図13-9を参照)。このスタイルは他のどのようなスタイルとも組み合せて定義できます。

図13-9 デザインタイムの角丸ボタン

MAF AMXには、多数の追加の装飾スタイルが用意されています(第13.3.5.5項「追加のボタン・スタイルの使用」参照)。

MAF AMXでのボタン・コンポーネントの子の操作および属性の処理には、特定の順序があります。詳細は、第13.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

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

「パネル・ページ」ファセットまたはコンテンツ領域内に配置可能な様々なデフォルト・スタイル・ボタンを次に示します。

- テキスト・ラベルのみが付いた「標準」、「アクティブ」または「無効」の各ボタン。

- イメージ・アイコンのみが付いた「標準」、「アクティブ」または「無効」の各ボタン。

次の例は、MAF AMXファイルで宣言されているcommandButton要素を示しています。最初の例は、テキスト・ラベル付きのデフォルト・ボタンの定義を示しています。

<amx:panelPage id="pp1">
<amx:facet name="primary">
<amx:commandButton id="cb1"
text="Cancel"
action="cancel"
actionListener="#{myBean.rollback}"/>
</amx:facet>
</amx:panelPage>

次の例は、イメージ・アイコン付きのデフォルト・ボタンの定義を示しています。

<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サンプル」にあります。

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

「パネル・ページ」ファセットまたはコンテンツ領域内に配置される様々な戻るスタイル・ボタンを次に示します。

- テキスト・ラベルのみが付いた「標準」、「アクティブ」または「無効」の各ボタン。

- イメージ・アイコンのみが付いた「標準」、「アクティブ」または「無効」の各ボタン。

次の例は、MAF AMXファイルで宣言されているcommandButton要素を示しています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="Details" id="ot1"/>
</amx:facet>
<amx:facet name="primary">
<amx:commandButton id="cb1"
text="Back"
action="__back"/>
</amx:facet>
...
</amx:panelPage>

プライマリ・ファセット内にボタン・コンポーネント配置し、そのaction属性を__backに設定した場合は常に、MAF AMXによって戻る矢印スタイル設定が自動的に適用されます(図13-10参照)。

図13-10 デザインタイムの戻るボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

他のタイプのボタンと同様に、「パネル・ページ」ファセットまたはコンテンツ領域内に配置される強調表示スタイル・ボタンには、「標準」、「アクティブ」または「無効」の状態があります。

次の例は、MAF AMXファイルで宣言されているcommandButton要素を示しています。

<amx:panelPage id="pp1">
<amx:facet name="secondary">
<amx:commandButton id="cb2"
text="Save"
action="save"
styleClass="adfmf-commandButton-highlight"/>
</amx:facet>
</amx:panelPage>

図13-11 デザインタイムの強調表示ボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

「パネル・ページ」内に配置されるアラート・スタイル・ボタンには、「標準」、「アクティブ」または「無効」の状態があります。

次の例は、MAF AMXファイルで宣言されているcommandButton要素を示しています。

<amx:commandButton id="cb1"
text="Delete"
actionListener="#{myBean.delete}"
styleClass="adfmf-commandButton-alert" />

図13-12 デザインタイムのアラート・ボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

MAF AMXには、次の追加のボタン・スタイルが用意されています。

- 「暗い」スタイル

- 「明るい」スタイル

- 「小規模」スタイル

- 「大規模」スタイル

- 「強調表示」スタイル

- 「確認」スタイル

- 2種類の「代替」スタイル

図13-13 追加のボタン・スタイル

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

MAFアプリケーションでは、次のコンテキスト内でボタン・コンポーネントを使用できます。

- ナビゲーション・バー

- 特定のアクションを実行するためのコンテンツ領域

- アクション・シート

- ポップスタイル・アラート・メッセージ

ナビゲーション・バー

MAFでは、ナビゲーション・バーで使用する標準ボタンを作成できます。

- 編集ボタンで、エンド・ユーザーは編集またはコンテンツ操作モードに入ることができます。

- 取消ボタンで、エンド・ユーザーは、変更を保存することなく編集またはコンテンツ操作モードを終了できます。

- 保存ボタンで、エンド・ユーザーは、変更を保存して編集またはコンテンツ操作モードを終了できます。

- 完了ボタンで、エンド・ユーザーは、変更があれば保存して現在のモードを終了できます。

- 元に戻すボタンで、エンド・ユーザーは最後のアクションを元に戻すことができます。

- やり直しボタンで、エンド・ユーザーは最後の元に戻したアクションをやり直すことができます。

- 戻るボタンで、エンド・ユーザーはSpringboardに戻ることができます。

- ページに戻るボタンで、エンド・ユーザーはボタン・テキスト・ラベルによって識別されるページに戻ることができます。

- 追加ボタンで、エンド・ユーザーは新しいオブジェクトを追加または作成できます。

コンテンツ領域

ページのコンテンツ領域内に配置されたボタンは、そのページ内のボタンの場所およびコンテキストに指定されている特定のアクションを実行します。これらのボタンは、ナビゲーション・バーに配置されているボタンとは異なる外観を持っている場合があります。

アクション・シート

アクション・シート内に配置されるボタンの例には、「ノートの削除」ボタンおよび「取消」ボタンのグループがあります。

アクション・シート・ボタンでは、表示の幅が拡張されます。

アラート・メッセージ

「OK」ボタンは、パスワード入力に失敗した後のログイン検証などの検証メッセージ内に配置できます。

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

MAF AMXでは、前に訪問したページに戻るデフォルト動作を持つ戻るボタンを使用した移動がサポートされています。詳細は、第12.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

__backナビゲーションを備えたパネル・ページのプライマリ・ファセットにボタン・コンポーネントを追加すると、そのボタンには、戻る矢印の視覚的スタイリングが自動的に設定されます(第13.3.5.2項「戻るスタイル・ボタンの表示」を参照)。これを無効にするには、styleClass属性をamx-commandButton-normalに設定します。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

ボタン、リンク、リスト・アイテムなどのコンポーネントがアクティブになっている場合に、MAF AMXによって操作および属性が処理される順序は、次のとおりです。

1. 次の子操作は、XMLファイルに表示される順序で処理されます。

- プロパティ・リスナーの設定

- アクション・リスナー

- ポップアップ表示動作

- ポップアップを閉じる動作

2. アクション・リスナー(actionListener)属性が処理されて関連付けられたJavaメソッドが起動されます。

3. アクション(action)属性が処理されて、ナビゲーション・ケースがあればそれに従います。

13.3.6 リンクの使用方法

リンク(commandLink)コンポーネントは、アクションをトリガーするためおよび他のビューへのナビゲーションを有効化するために使用します。

リンク・コンポーネントは、その子として任意のタイプのコンポーネントを定義できます。プロパティ・リスナーの設定(第13.3.23項「プロパティ・リスナーの設定の使用方法」を参照)、アクション・リスナー(第13.3.22項「アクション・リスナーの使用方法」を参照)、ポップアップ表示動作、ポップアップを閉じる動作(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)、検証動作(第13.9項「検証の入力」を参照)などのコンポーネントをリンク・コンポーネントの子として使用することで、クリックおよびジェスチャーを実行できるアクション可能な領域を作成できます。

リンク内にイメージ・コンポーネントを配置することで(第13.3.7項「イメージの表示方法」を参照)、クリック可能イメージを作成できます。

次の例は、MAF AMXファイルで宣言されているcommandLink要素を示しています。

<amx:commandLink id="cl1"
text="linked"
action="gotolink"
actionListener="#{myBean.doSomething}"/>

図13-14は、「プレビュー」ペインに表示されている基本的なリンク・コンポーネントを示しています。

図13-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>

図13-15は、フォーム内に配置され、「プレビュー」ペインに表示されているリンク・コンポーネントを示しています。

図13-15 デザインタイムのフォーム内のリンク

MAF AMXでのリンク・コンポーネントの子の操作および属性の処理には、特定の順序があります。詳細は、第13.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

MAF AMXでは、リンクと類似していますが、ページ間のナビゲーションは許可されない別のコンポーネントであるリンク(実行) (goLink)コンポーネントが提供されています。このコンポーネントを使用して、外部ページへのリンクを有効化できます。図13-16は、「プレビュー」ペインに表示されているリンク(実行)コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:goLink id="goLink1"
text="Go Link"
url="http://example.com"/>

図13-16 デザインタイムのリンク(実行)

イメージは、リンク(実行)コンポーネントの子として指定できる唯一のコンポーネントです。

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

13.3.7 イメージの表示方法

MAF AMXでは、ビットマップによって表されるイメージ(image)コンポーネントを使用して、iOSおよびAndroidデバイス上にイメージを表示できます。

ボタンおよびリスト・ビューにイメージを配置するだけでなく、それをリンク・コンポーネント内に配置して(第13.3.6項「リンクの使用方法」を参照)クリック可能イメージを作成できます。

次の例は、MAF AMXファイル内のimage要素定義を示しています。

<amx:image id="i1"
styleClass="prod-thumb"
source="images/img-big-#{pageFlowScope.product.uid}.png" />

Androidプラットフォームでサポートされているフォーマットは次のとおりです。

- GIF

- JPEG

- PNG

- BMP

iOSプラットフォームでサポートされているフォーマットは次のとおりです。

- PNG

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGalleryおよびUIDemo

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

チェックボックス(selectBooleanCheckbox)コンポーネントは、trueまたはfalseの値からの単一選択(選択済状態と選択解除状態の間で切り替えできる)を可能にするために作成するチェックボックスを表します。

チェックボックス・コンポーネントのlabel属性を使用するとチェックボックスの左側にテキストを配置でき、text属性を使用すると右側にテキストを配置できます。

次の例は、MAF AMXファイルで宣言されているselectBooleanCheckbox要素を示しています。

<amx:selectBooleanCheckbox id="check1"
label="Agree to the terms:"
value="#{myBean.bool1}"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-17は、「プレビュー」ペインに表示されている選択解除されたチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="false"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-17 デザインタイムの選択解除されたチェックボックス

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="true"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-18は、「プレビュー」ペインに表示されている選択されたチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

図13-18 選択されたチェックボックスの定義

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

iOSでは、ネイティブ・チェックボックス・コンポーネントはサポートされていません。ブール・スイッチは、通常、プロパティ・ページで使用され、ブール選択を可能にします(第13.3.9項「ブール・スイッチ・コンポーネントの使用方法」を参照)。

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

Androidでは、ネイティブ・チェックボックス・コンポーネントがサポートされています。このコンポーネントは、設定ページで広く使用され、個々の設定値のオンとオフを切り替えます。

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

ブール・スイッチ(selectBooleanSwitch)コンポーネントは、チェックボックスのかわりのスイッチ・メタファーとしてのブール値の編集を可能にします。

他のMAF AMX UIコンポーネントと同様に、このコンポーネントには標準および選択済の状態があります。値を切り替えるには、エンド・ユーザーはスイッチを1回タップ(タッチしてリリース)します。タップするたびにスイッチが切り替わります。

次の例は、MAF AMXファイルで定義されているselectBooleanSwitch要素を示しています。

<amx:selectBooleanSwitch id="switch1"
label="Flip switch:"
onLabel="On"
offLabel="Off"
value="#{myBean.bool1}"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-19は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanSwitch id="selectBooleanSwitch1"
label="Switch"
value="value1"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図13-19 デザインタイムのブール・スイッチ

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

iOSでは、プール・スイッチ・コンポーネントは、属性値を有効化または無効化するために設定ページでよく使用されます。

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

Androidプラットフォームでは、ブール・スイッチ・コンポーネントは直接サポートされていません。かわりに、Androidでは、タップすると選択済状態と選択解除状態が切り替わるトグル・ボタンが提供されています。

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

チェックボックスを複数選択(selectManyCheckbox)コンポーネントは、trueまたはfalseの値の複数選択を可能にするために使用するチェックボックスのグループを表します。これにより、グループ内の各チェックボックスの選択済と選択解除の切替えが可能になります。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.14.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>

図13-20は、「プレビュー」ペインに表示されているチェックボックスを複数選択コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectManyCheckbox id="selectManyCheckbox1"
label="Select Many Checkbox"
value="value2"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Selection 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Selection 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Selection 3" value="value3"/>
</amx:selectManyCheckbox>

図13-20 デザインタイムのチェックボックスを複数選択

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

MAF AMXでは、ポップアップ・スタイル(デフォルト)とリスト・スタイル(使用可能な選択肢の数がデバイスの画面サイズを超えている場合に使用される)の、チェックボックスを複数選択コンポーネントを表示するための2つの代替方法が提供されています。

iPhoneとiPadの両方でのポップアップスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストがポップアップに表示されます。選択を行うには、エンド・ユーザーは1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーはポップアップの外をタップするか、閉じるボタン( x )を使用してポップアップを閉じます。

ポップアップを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

選択肢の数がデバイスのサイズを超える場合、スクロール可能なリスト・ビュー(第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)を含むフルページ・ポップアップが生成されます。

iPhoneとiPadの両方でのリストスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照し、1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーは閉じるボタン( x )をタップします。

リストを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

注意:
どちらの場合も、選択を取り消すメカニズムは提供されていません。

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

選択肢を複数選択(selectManyChoice)コンポーネントは、リストの複数の値の選択を可能にします。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.14.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>

図13-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

すべてのサポートされているデバイス上の選択肢を複数選択コンポーネントの外観と動作は、チェックボックスを複数選択コンポーネントとほとんど同一です(詳細は、第13.3.10項「チェックボックスを複数選択コンポーネントの使用方法」を参照してください)。

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

選択ボタン(selectOneButton)コンポーネントは、常に1つのボタンがアクティブになっている、アクションをリストするボタン・グループを表します。この選択メカニズムは、選択ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.14.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>

図13-22は、「プレビュー」ペインに表示されている選択ボタン・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneButton id="selectOneButton1"
label="Select Button"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneButton>

図13-22 デザインタイムの選択ボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

ラジオ・ボタン(selectOneRadio)コンポーネントは、使用可能な選択肢をリストするラジオ・ボタンのグループを表します。この選択メカニズムは、ラジオ・ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.14.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>

図13-23は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneRadio id="selectOneRadio1"
label="Radio Button"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneRadio>

図13-23 デザインタイムのラジオ・ボタン

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

選択肢(selectOneChoice)コンポーネントは、リストからの単一の値の選択を可能にするために使用するコンボ・ボックスを表します。この選択メカニズムは、選択肢コンポーネントに含まれているアイテムの選択コンポーネント(第13.3.14.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>

図13-24は、「プレビュー」ペインに表示されている選択肢コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneChoice id="selectOneChoice1"
label="Choice"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneChoice>

図13-24 デザインタイムの選択肢

詳細、図および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

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

MAF AMXでは、選択肢コンポーネントを表示するため、ポップアップ・スタイルとドロップダウン・スタイルの2つの代替方法が提供されています。

iPhoneでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが、デフォルトで最初のオプションが選択された状態で表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照します。選択内容を保存するには、エンド・ユーザーはツール・バーの「終了」をタップします。

iPadでは、ユーザーの対話は、次の点を除いてiPhoneにおける対話と同様です。

- 選択のリストは、ポップアップ・ダイアログに表示されます。

- iPadのスタイリングが選択のリストの周囲に実装され、リストのソースを示すためにノッチが使用されます。

アイテムを選択しないで選択のリストを閉じるには、エンド・ユーザーはポップアップ・ダイアログの外をタップする必要があります。

注意:
選択のリストおよびツール・バーを表示するためのUIは、ブラウザにネイティブであり、CSSを使用してスタイリングすることはできません。

選択肢コンポーネント内のリスト値は、無効として表示できます。

選択肢の数がデバイスの表示サイズを超える場合、ネイティブな方法でスクロール可能なリスト・ページが生成されます。

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

Androidデバイスでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、ポップアップ・ダイアログ形式の選択肢のリストが表示されます。選択肢の数がデバイスのサイズ内に収まる場合は単純なポップアップが表示されます。この場合次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- ポップアップの外で1回タップするか戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

表示される選択肢の数がデバイス・サイズ内に収まらない場合は、ポップアップにスクロール可能リストが含まれます。その場合は次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- 戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

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

アイテムの選択(selectItems)コンポーネントは、複数選択コンポーネントと単一選択コンポーネントの両方で選択できるオブジェクトのリストを提供します。

アイテムの選択(selectItem)コンポーネントは、選択コンポーネントの単一選択可能なアイテムを表しています。

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

リスト・ビュー(listView)コンポーネントを使用して、エンド・ユーザーが1つ以上のオプションを選択できる選択肢のリストとしてデータを表示します。

通常、リスト・アイテム(listItem)・コンポーネントは、リスト・ビュー・コンポーネント内の1つのアイテムを表しており、リスト・アイテム・コンポーネントをリスト・ビュー内に配置して、データ・アイテムのリストのレイアウト設定およびスタイル設定を行います。各アイテムには複数のリスト・アイテム・コンポーネントが含めることができ、この場合、リスト・アイテム・コンポーネントがアイテム(行)を満たすと、超過リスト・アイテム・コンポーネントは後続行に折り返します。これを構成するには、リスト・ビュー・レイアウト属性をカードに設定します(デフォルト・レイアウトは行で、リスト内の1つのアイテム当たり1つのリスト・アイテム・コンポーネントを表示します)。詳細は、第6.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>

図13-25は、デザインタイムの基本リスト・ビュー・コンポーネントを示しています。

図13-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>

図13-26は、デザインタイムのアイコンおよびテキスト付きリスト・ビュー・コンポーネントを示しています。

図13-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までの文字が有効になります。その他の文字は、行がさらにロードされるとインデクサに表示されます。

表13-5は、インデックス・ユーティリティに定義可能なスタイルを示しています。

表13-5 リスト・ビューのインデックス・スタイル

styleClass名

説明

adfmf-listView-index

インデックス・バーのスタイルを定義します。

adfmf-listView-indexItem

インデックス・バーの1つのアイテムのスタイルを定義します。

adfmf-listView-indexItem-active

インデックス・バーの関連する区切りへのリンクを持つアイテムのスタイルを定義します。

adfmf-listView-indexCharacter

インデックス・バーの文字のスタイルを定義します。

adfmf-listView-indexBullet

インデックス・バーの2つの文字間のブレットのスタイルを定義します。

adfmf-listView-indexOther

インデックス・バーのすべての不明な文字を表す文字のスタイルを定義します。

表示可能な区切りを持つリスト・ビュー・コンポーネントがスクロールを提供するコンテナとして機能し、それがスクロールの対象となる場合、区切りはビューの上部に固定されます。この場合は、リスト・ビュー・コンポーネントの高さを明示的に指定する必要があります。その他すべての場合で、リスト・ビュー自体はスクロールを実行しないが親コンテナ(パネル・ページなど)のスクロールを使用する場合は、リスト・ビューに高さ制約の設定はなく、高さはその子コンポーネントによって決まります。このような定義された高さ制約がないことによって、アニメーション化された遷移および区切りの固定が効果的に無効化されます。

- 凹枠リスト
次の例は、MAF AMXファイルで定義されているlistView要素を示しています。この定義は、凹枠コンポーネントに対応しています。

<amx:listView id="listView1"
styleClass="adfmf-listView-insetList"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="listItem1">
<amx:outputText id="outputText1" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem2">
<amx:outputText id="outputText3" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem3">
<amx:outputText id="outputText5" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem4">
<amx:outputText id="outputText7"
value="This is really long text to test how it is handled"/>
</amx:listItem>
</amx:listView>

図13-27は、デザインタイムの凹枠リスト・ビュー・コンポーネントを示しています。

図13-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でのリスト・アイテム・コンポーネントの子の操作および属性の処理には、特定の順序があります。詳細は、第13.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

他のMAF AMXコンポーネントとは異なり、リスト・ビューをMAF AMXページにドラッグ・アンド・ドロップし、データ・コントロールからのコンテンツでlistViewを生成すると、「コンポーネント・ギャラリ」というダイアログが表示されます。このダイアログでリスト・ビューに対して特定のレイアウトを選択できます。図13-28は、リスト・ビュー・コンポーネント・ギャラリを示しています。

図13-28 リスト・ビュー形式のコンポーネント・ギャラリ

表13-6には、リスト・ビュー・コンポーネント・ギャラリに表示されるサポート済のリスト・フォーマットが一覧表示されています。

表13-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つのバリエーションがあり、表13-7に示す16の固有の説明が提供されています。

表13-7 リスト・ビューのバリエーションとスタイル

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドがリスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドがリスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「パレット」→「データ」→「データ・コントロール」ペインからデータ・バインディングを選択した後、エディタにドロップすると、OEPEにはリストビュー・ギャラリが表示されます(図13-29を参照)。

ダイアログに入力する際は、次の点を考慮してください。

- 左側にあるイメージは、選択されているリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映しています。

- 「値」列の編集可能セルには、静的テキスト文字列が移入されます(表13-8を参照)。

- 「リスト・アイテム・コンテンツ」セルにイメージが含まれている場合、「値」セルはデフォルトで<add path to your image>文字列になります。この場合、それをイメージのパスに置き換える必要があります。

- 「リスト・アイテム選択」は選択モードを示します。

- リスト・ビューに、データがバインドされているのではなく、リスト・アイテム子コンポーネントが含まれている場合、区切り属性を設定できないため、「区切り属性」と「区切りモード」の両方のフィールドは無効化されています。

表13-8 リスト・ビューの静的テキスト文字列

リスト・フォーマット

要素行の値

出力テキストの値

シンプル

- テキスト

- 'ListItemテキスト'

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

- 'メイン・テキスト'

- 'これは従属テキストです。'

開始-終了

- 開始テキスト

- 終了テキスト

- '開始テキスト'

- '終了テキスト'

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

- '上部の開始テキスト'

- '上部の終了テキスト'

- '下部の開始テキスト'

- '下部の終了テキスト'

図13-29は、リスト要素のレイアウトを指定できる「リスト・ビューの構成」ダイアログを示しています。

図13-29 「リスト・ビューの構成」ダイアログ

バインド済リスト・ビューを作成するときに考慮する特殊な場合は次のとおりです。

- JavaBeanメソッドによって汎用性がないリストが戻される場合、図13-29に示すように「要素タイプ」フィールドを使用して、リスト・アイテム・コンテンツを作成する必要があります。

- 用意されているデータ・コレクション値がコレクションベースでない場合、「値」列によって、「値バインディング」列が空白値と置き換えられます。

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

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

- 第13.3.15.3項「リスト・ビュー・レイアウトの構成」

- 第12.3.2.3.3項「コレクションのドラッグ・アンド・ドロップ」

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるUIDemo。このサンプルは、様々なタイプのリスト・ビュー・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。

- 付録E「アプリケーションの使用方法の制限」

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

リスト・ビュー・コンポーネントを構成して、任意の長さのリストにデータを表示できます。これは、リストの下部にデータを追加することによって行います。

fetchSize属性によって、リスト・ビュー・コンポーネントが最初にロードする行数が決定されます。fetchSizeで定義されているよりも多くの使用可能な行がある場合は、最後にフェッチされた行の後にクリック可能領域が表示されます。この領域内をクリックすると、fetchSizeに等しい行のバッチがさらにロードされます。表示する行がなくなるとクリック可能領域は表示されなくなります。

fetchSize属性はロード済行の数を表していません。かわりに、何行ずつ増加するのかを表しています。リスト・ビュー・コンポーネントの作成時には、fetchSize属性は、デフォルトでPageDefイテレータのrangeSizeを指すEL式を使用するように設定されています。PageDefファイルの詳細は、第12.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」および図12-40「PageDefファイル」を参照してください。fetchSizeをrangeSizeと同じ値に設定するとアプリケーションのパフォーマンスが向上します。

次の例は、データ・コントロールのtestResultsと呼ばれるコレクションから作成されたlistView要素を示しています(第12.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属性(第13.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を使用して、さらにデータが使用可能かどうかを定義できます(第13.10項「イベント・リスナーの使用方法」を参照)。

13.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タグ・リファレンスを参照してください。

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

リスト・ビュー・コンポーネントは、各行が1つのリスト・アイテム・コンポーネントを含んでいる(デフォルト)行のセットとして、または、各カードが1つ以上のリスト・アイテム・コンポーネントを含んでいるカードのセットとしてレイアウトできます。

レイアウトを定義するには、リスト・ビューのlayout属性を使用し、これをrowsまたはcardsに設定します。カード・レイアウトを使用する場合は、次の点について考慮してください。

- 各リスト・アイテム・コンポーネントは、水平に並べられたカードのグループ内のカードとして表示されます。

- 使用可能なスペースがすべて消費されると、次のカードが新しい行で折り返されます。

- リスト・ビュー内でリスト・アイテム・コンポーネント(カード)の水平配置を制御するには、リスト・ビューのhalign属性をstart、centerまたはendに設定します。

- リスト・ビューの外観を一般的にカスタマイズするには、次の手順を実行します。

- スキン内でデフォルトで定義されているカード・サイズをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しい幅を指定します。詳細は、第13.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

注意:
値をautoにしたり、パーセント単位を使用することはできません。

あるいは、スキニングを使用して.amx-listView-cards .amx-listItemセレクタから幅をオーバーライドできます(第13.6.3項「スキニングに関する必知事項」を参照)。

- スキン内でデフォルトで定義されているカードの周囲のスペースをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しいmargin-topおよびmargin-leftを指定し(第13.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照)、リスト・ビューのcontentStyle属性を使用して新しいpadding-bottomおよびpadding-rightを指定します。
あるいは、スキニングを使用して.amx-listView-cards .amx-listItemセレクタからmargin-topおよびmargin-leftをオーバーライドし、.amx-listView-cards .amx-listView-contentセレクタからpadding-bottomおよびpadding-rightをオーバーライドします(第13.6.3項「スキニングに関する必知事項」を参照)。

レイアウトの場合、halign属性を使用して、わずかなリスト・アイテム・コンテンツの配置を変更します。ただし、この属性を使用しても、視覚的な効果がないことがあります。

カード・レイアウトを備えたリスト・ビュー・コンポーネントが編集モードにあると、レイアウトはrowsモードに切り替わります。

MAF AMXページ・レイアウトを特定のパターンに合せるために、一連の事前定義済スタイルを使用するstyleClass属性(第13.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>

図13-30は、各行の開始(左)側と終了(右)側に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図13-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>

図13-31は、各行の開始と終了に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、リンクを表す右向き矢印は含まれていません。

図13-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>

図13-32は、各行の開始と終了に異なるスタイルのテキストが追加され、左側の終了テキストの下にサブテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図13-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>

図13-33は、各行にメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図13-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>

図13-34は、各行に、アイコンおよびメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図13-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>

図13-35は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図13-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>

図13-36は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図13-36 デザインタイムの拡張リンクのない4つのタイプのテキストを持つリスト・ビュー

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

モデルからではなくハードコード化された値によって移入されるリスト・ビュー・コンポーネントを作成する場合、このリスト・ビューは静的になり、デザインタイムに設定するそのプロパティのいくつか(たとえばdividerAttribute、dividerMode、fetchSize、moveListener)がランタイムに無視されるようになります。

MAF AMXでは、リスト・ビュー・コンポーネントのvalue属性が設定されていない場合、そのコンポーネントを静的であるとみなします。そのようなリストは編集できません(つまり、リストのeditMode属性を指定できません)。

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

カルーセル(carousel)コンポーネントは、回転カルーセルにイメージなどの他のコンポーネントを表示するために使用します。エンド・ユーザーは、スライダを使用するか、別のイメージを正面にドラッグすることでアクティブなアイテムを変更できます。

カルーセル・コンポーネントにはカルーセル・アイテム(carouselItem)コンポーネントが含まれており、text属性によって表されるそのテキストは、それがそのカルーセルのアクティブなアイテムであるときに表示されます。通常、カルーセル・アイテムにはイメージ・コンポーネントが含まれていますが、他のコンポーネントを使用することもできます。たとえば、イメージを囲む子としてリンクを使用することもできます。表示するオブジェクトごとにカルーセル・アイテム・コンポーネントを作成し、これらのコンポーネントを個々のオブジェクトにバインドするかわりに、カルーセル・コンポーネントを完全なコレクションにバインドします。その後、コンポーネントは各アイテムに値をスタンプすることで、1つのカルーセル・アイテム・コンポーネントを繰り返しレンダリングします。各アイテムがスタンプされると、現在のアイテムのデータが、EL式でカルーセル・コンポーネントのvar属性を使用して特定可能なプロパティにコピーされます。カルーセルのレンダリングが完了したら、このプロパティは削除されるか前の値に戻ります。カルーセル・コンポーネントにはnodeStampというファセットが含まれており、これは、各アイテムのテキストと短い説明の両方を表示するために使用されるカルーセル・アイテムのホルダーであり、各アイテムに表示されるイメージに対する親コンポーネントでもあります。

カルーセル・アイテムは、その子コンポーネントのみ拡大します。単一のイメージ・コンポーネントをカルーセル・アイテムの内部に配置する場合、イメージはそのアイテムに割り当てられた四角形に合せて拡大されます(エンド・ユーザーがカルーセルをスピンすると、これらのサイズが縮小または拡大されます)。

ヒント:
アプリケーションのパフォーマンスの低下を最小限に抑えるは、重いコンポーネントを子として使用しないようにします。複雑な構造にすると、いくつかのカルーセル・アイテム・スタンプが同時に表示されるため、その影響が倍増します。

デフォルトでは、カルーセルは水平に表示されます。水平方向のカルーセル内にあるオブジェクトは中央に垂直に配置され、カルーセル自体はコンテナの中心に水平に配置されます。参照ローロデックスが必要な場合は、垂直に表示されるようにカルーセルを構成できます。デフォルトでは、垂直方向のカルーセル内にあるオブジェクトは中心に水平に配置され、カルーセル自体は中央に垂直に配置されます。カルーセルのorientation属性を使用してこの配置を変更できます。

前後のイメージを部分的に表示するかわりに、displayItems属性を使用して、フィルムストリップ・デザインまたは循環デザインでイメージを表示するようにカルーセルを構成することができます。

デフォルトでは、カルーセルが循環モードで表示するように構成されている場合、エンド・ユーザーが補助アイテム(現在、中央に表示されていないアイテム)にポインタを置くと、そのアイテムが枠で囲まれ選択可能であることが示されます。auxiliaryPopOut属性を使用すると、アイテムが移動し、最大サイズで表示されるように、カルーセルを構成できます。

OEPEでは、「カルーセル」は「パレット」のMAF AMXの下にあります(図13-37を参照)。

図13-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

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

フィルム・ストリップ(filmStrip)は、グループ(ページ)のセット内に分散されたデータを垂直方向または水平方向に視覚化するコンテナ・コンポーネントです。グループに含まれるディスプレイ・アイテム(filmStripItem)を表すUIコンポーネントは、同じサイズおよびタイプである必要があり、一度に1つのグループのみを表示できます。エンド・ユーザーは、フィルム・ストリップのページを移動でき、アイテムを選択してタップすることでアクションを生成できます。

OEPEでは、フィルム・ストリップは「パレット」のMAF AMXの下にあります(図13-38を参照)。

図13-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

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

垂直に配置されたフィルム・ストリップでは、ディスプレイ・アイテムは上から下に配置されます。テキストの方向に応じて、ページ制御は次のように配置されます。

- テキストの方向が左から右の場合、ページ制御は右側に置かれます。

- テキストの方向が右から左の場合、ページ制御は左側に置かれます。

水平に配置されたフィルム・ストリップでは、テキストの方向モードを反映する必要があり、左から右モードでは最初のアイテムが左に置かれ、右から左モードでは最初のアイテムは右に置かれます。どちらの場合でも、ページ・ステータス・コンポーネントは一番下にあります。

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

フィルム・ストリップ・コンポーネントのナビゲーションはデック(第13.2.12項「デック・コンポーネントの使用方法」を参照)およびパネル・スプリッタ・コンポーネント(第13.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照)と同様で、一度に1ページが表示され、ページの変更はページIDまたは番号の選択によってトリガーされます。

子フィルム・ストリップ・アイテム・コンポーネントは、他のMAF AMXページに移動するための使用は想定されていないため、action属性をサポートしていません。必要な場合は、ネストされているコマンド・リンク・コンポーネントを介してナビゲーションを有効化できます。

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

該当するコンポーネントが存在しない場合や自身でHTMLを使用してレイアウトする必要がある場合は、Verbatim (verbatim)操作を使用して独自のHTMLをページに挿入できます。

OEPEでは、「Verbatim」は「パレット」のMAF AMXの下にあります(図13-39を参照)。

図13-39 「パレット」の「Verbatim」

詳細および例は、次を参照してください。

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

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

13.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コード層から発生する必要があります。

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

出力HTML (outputHtml)コンポーネントでは、HTMLコンテンツをMAF AMXページに表示するために、ELでバインドされたプロパティまたはメソッドから動的および安全に取得できます。出力HTMLコンポーネントはVerbatimコンポーネント(第13.3.18項「Verbatimコンポーネントの使用方法」を参照)と同様に動作し、JavaScriptおよびAJAXの使用に関して同じ制限が適用されます(第13.3.18.1項「JavaScriptおよびAJAXのVerbatimコンポーネントでの使用に関する必知事項」を参照)。

OEPEでは、出力HTMLは「パレット」のMAF AMXの下にあります(図13-40を参照)。

図13-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

13.3.20 反復の有効化方法

イテレータ(iterator)操作を使用して、同じ種類のデータを持つ任意の数のアイテムをスタンプします。これによりデータを繰り返し処理して各要素のUIを作成できます。

OEPEでは、「イテレータ」は「パレット」のMAF AMXの下にあります。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

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

バンドルのロード(loadBundle)操作によって、ページ上のMAF AMX UIコンポーネントにローカライズ済テキストを提供するリソース・バンドルを指定できます。詳細は、第13.7項「UIコンポーネントのローカライズ」を参照してください。

OEPEでは、「バンドルのロード」は「パレット」のMAF AMXの下にあります(図13-41を参照)。

図13-41 「パレット」の「バンドルのロード」

MAF AMXファイル内で、loadBundle要素をview要素の子として宣言します。

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.3.22 アクション・リスナーの使用方法

アクション・リスナー(actionListener)コンポーネントにより、親コンポーネントが使用するタイプに基づいてELを介して宣言でコマンドを呼び出すことができます。

アクション・リスナー・コンポーネントを使用する重要な理由は、ジェスチャー・サポート・アクションを親コンポーネントに追加できること、および1つのジェスチャー(タップを含む)で複数の操作を実行できる機能です。詳細は、第13.3.22.1項「アクション・リスナー・コンポーネントと属性間の相違点に関する必知事項」を参照してください。

OEPEでは、「アクション・リスナー」コンポーネントは「パレット」のMAF AMXの下にあります(図13-42を参照)。

図13-42 「パレット」の「アクション・リスナー」

0(ゼロ)以上のアクション・コンポーネントを任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム、フィルム・ストリップ・アイテムおよびデータ視覚化コンポーネントのサブセット)の子として追加できます。アクション・リスナー・コンポーネントのtype属性は、ActionEventを作動させるジェスチャー(swipeLeft、swipeRight、tapHoldなど)を定義します。

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- 第13.3.23項「プロパティ・リスナーの設定の使用方法」

- 第13.4項「ジェスチャーの有効化」

- 第13.3.22.1項「アクション・リスナー・コンポーネントと属性間の相違点に関する必知事項」

- Oracle Mobile Application Frameworkタグ・リファレンス

13.3.22.1 アクション・リスナー・コンポーネントと属性間の相違点に関する必知事項

ボタン、リンク、リスト・アイテムなどのコンポーネントにはactionListener属性があり、これは、アクション・リスナー・コンポーネントを冗長にする可能性があります。ただし、アクション・リスナー・コンポーネントとは異なり、これらのコンポーネントにはジェスチャーをサポートするtype属性がないため、MAFでは、親コンポーネントのactionListener属性に加えて、アクション・リスナー・コンポーネントが提供されています。

13.3.23 プロパティ・リスナーの設定の使用方法

プロパティ・リスナーの設定(setPropertyListener)コンポーネントによって、コンポーネントでのエンド・ユーザー・アクションを受けて、1つの場所(コンポーネントのfrom属性で定義)から別の場所(コンポーネントのto属性で定義)に宣言的に値をコピーできるため、同じ結果を得るためにJavaコードを記述する必要がありません。

OEPEでは、「プロパティ・リスナーの設定」コンポーネントは「パレット」のMAF AMXの下にあります(図13-43を参照)。

図13-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など)を定義します。

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- 第13.3.22項「アクション・リスナーの使用方法」

- 第13.4項「ジェスチャーの有効化」

- Oracle Mobile Application Frameworkタグ・リファレンス

13.3.24 日時の変換方法

日時の変換(convertDateTime)は、独立したUIコンポーネントではありません。これは、出力テキストおよび入力テキスト・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された日付、時刻または日時の組合せを表示するコンバータ操作です。

OEPEでは、「日時の変換」は「パレット」のMAF AMXの下にあります(図13-44を参照)。

図13-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などです。

13.3.24.1 日時パターンに関する必知事項

java.text.SimpleDateFormat定義に従って、日時書式を、日時パターン文字列で指定します。日時パターン文字列では、引用符で囲まれていないAからZおよびaからzの文字は、日付または時間の文字列のコンポーネントを表すパターン文字と認識されます。テキストは、解釈されないように一重引用符(')で囲むことができます。" ' ' "は一重引用符を表します。すべてのその他の文字は解釈されません。かわりに、それらは書式設定中に単に出力文字列にコピーされるか、解析中に入力文字列と照合されます。

表13-9は、定義済パターン文字を示しています(AからZおよびaからzのすべてのその他の文字は予約されています)。

表13-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

パターン文字は通常繰り返されます。これは、それらの数が正確な表示を決定するためです。

13.3.25 数値の変換方法

数値の変換(convertNumber)は、独立したUIコンポーネントではなく、出力テキストおよび入力テキスト、入力テキストおよび入力数値スライダの各コンポーネントと組み合せて使用して、次の指定されたパターンに従った様々な書式で、変換された数値または通貨値を表示するコンバータ操作です。

数値の変換コンポーネントは、次のタイプの操作を提供します。

- 値から文字列。表示目的です。

- 書式設定された文字列から値。書式設定された入力値が、基礎となっている値に解析される場合です。

数値の変換が、入力テキスト・コンポーネントの子として指定されている場合、デフォルトで、モバイル・デバイスに数字キーボードが表示されます。

OEPEでは、「数値の変換」は「パレット」のMAF AMXの下にあります(図13-45を参照)。

図13-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タグ・リファレンスを参照してください。

注意:
数値の変換コンポーネントは、デザインタイムには何の効果も持ちません。

13.3.26 ドラッグ・ナビゲーションの有効化

ナビゲーション・ドラッグ動作(navigationDragBehavior)の処理では、モバイル・デバイスの画面を指定された方向(左または右)にドラッグすることで、次または前のMAF AMXページに移動するアクションを起動できます。指定された方向へのドラッグが発生するとインジケータが画面の適切な側に表示され、引き続きドラッグしてインジケータが完全に表示されたときに停止するとアクションが実行されることを示します。インジケータが完全に表示される前にドラッグを放すと、インジケータがスライドされ、アクションは起動されません。

注意:
ドラッグ・ジェスチャーを消費する近いコンテナが他にない場合、この動作は発生しません。

MAF AMXページには、navigationDragBehavior要素の3つ以上のインスタンスを含むことはできず、1つはdirection属性をbackに設定したもので、もう1つはforwardに設定したものです。

OEPEでは、ナビゲーション・ドラッグ動作は「パレット」のMAF AMXの下にあります(図13-46を参照)。

図13-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>

図13-47は、実行時のドラッグ・ナビゲーション動作を示しています(mobileFusionFxスキンを使用して表示)。

図13-47 実行時のドラッグ・ナビゲーション動作の処理

詳細および例は、次を参照してください。

- Oracle Mobile Application Frameworkタグ・リファレンス

- 「ファイル」→「新」→「MAFサンプル」にあるMAFサンプル・アプリケーションであるCompGallery

13.3.26.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);
}
}

13.3.27 ロード・インジケータの使用方法

ロード・インジケータ動作(loadingIndicatorBehavior)の処理では、次のことをオーバーライドすることで、ロード・インジケータの動作を定義できます。

- フェイルセーフ・タイマーの持続時間(ミリ秒単位)。

- フェイルセーフしきい値に達した場合に、アクションの方針の決定するために起動できるオプションのJavaScript関数名。

詳細は、adf.mf.api.amx.showLoadingIndicatorを参照してください。

OEPEでは、ロード・インジケータ動作は「パレット」のMAF AMXの下にあります(図13-48を参照)。

図13-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

13.4 ジェスチャーの有効化

次のジェスチャーに反応するために、ボタン、リンク、リスト・アイテムおよび多数のデータ視覚化の各コンポーネントを構成できます。

- 右方向にスワイプ

- 左方向にスワイプ

- 上方向にスワイプ

- 下方向にスワイプ

- タップしたまま押さえる

- 始点方向にスワイプ: このジェスチャーは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、左方向にスワイプします。

- テキスト方向が右から左である場合、右方向にスワイプします。

- 終点方向にスワイプ: このジェスチャーは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、右方向にスワイプします。

- テキスト方向が右から左である場合、左方向にスワイプします。

次の操作のtype属性に対して、swipeRight、swipeLeft、swipeUp、swipeDown、swipeStart、swipeEndおよびtapHold値を定義できます。

- プロパティ・リスナーの設定(第13.3.23項「プロパティ・リスナーの設定の使用方法」を参照)

- アクション・リスナー(第13.3.22項「アクション・リスナーの使用方法」を参照)

- ポップアップ表示動作(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- ポップアップを閉じる動作(第13.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サンプル」にあるアプリケーションです。

13.5 データ視覚化の指定

MAFでは、データ視覚化コンポーネントのセットを様々なチャート、ゲージおよびマップの作成に使用して、MAF AMXアプリケーション機能のデータを表すことができます。MAF AMXファイルの<dvtm>ネームスペースの下で次の要素を宣言できます。

- areaChart (第13.5.1項「面グラフの作成方法」を参照)

- barChart (第13.5.2項「棒グラフの作成方法」を参照)

- horizontalBarChart (第13.5.3項「横棒グラフの作成方法」を参照)

- bubbleChart (第13.5.4項「バブル・チャートの作成方法」を参照)

- comboChart (第13.5.5項「コンポ・チャートの作成方法」を参照)

- lineChart (第13.5.6項「線グラフの作成方法」を参照)

- pieChart (第13.5.7項「円グラフの作成方法」を参照)

- scatterChart (第13.5.8項「散布図の作成方法」を参照)

- sparkChart (第13.5.9項「スパーク・チャートの作成方法」を参照)

- funnelChart (第13.5.10項「ファンネル・チャートの作成方法」を参照)

- ledGauge (第13.5.13項「LEDゲージの作成方法」を参照)

- statusMeterGauge (第13.5.14項「ステータス・メーター・ゲージの作成方法」を参照)

- dialGauge (第13.5.15項「ダイアル・ゲージの作成方法」を参照)

- ratingGauge (第13.5.16項「評価ゲージの作成方法」を参照)

- geographicMap (第13.5.18項「地理マップ・コンポーネントの作成方法」を参照)

- thematicMap (第13.5.19項「テーマ・マップ・コンポーネントの作成方法」を参照)

- treemap (第13.5.21項「ツリーマップ・コンポーネントの作成方法」を参照)

- sunburst (第13.5.22項「サンバースト・コンポーネントの作成方法」を参照)

- timeline (第13.5.23項「時系列コンポーネントの作成方法」を参照)

- nBox (第13.5.24項「NBoxコンポーネントの作成方法」を参照)

チャート、ゲージ、マップおよび拡張コンポーネント要素には、すべてまたはほとんどに共通の多数の属性があります。詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

OEPEでは、データ視覚化コンポーネントは「パレット」の「MAF AMXデータ視覚化」の下にあります。すべてのデータ視覚化コンポーネントを表示するには、スクロール・バーを使用します。

図13-49 「パレット」のデータ視覚化コンポーネント

データ視覚化コンポーネントをドラッグ・アンド・ドロップすると、ダイアログが開き、作成するコンポーネントのタイプに関連付けられた情報に応じたコンテンツが表示されます。

- モバイル・チャートの作成

- モバイル・ゲージの作成

- 地理マップ

- サンバーストの作成またはツリーマップ

注意:
コンポーネントの作成後、ソース・エディタまたは構造ビューでそのコンポーネントを選択し、「プロパティ」ウィンドウで「コンポーネント定義の編集」をクリックすることによって、作成ダイアログを再起動できます。
「プロパティ」ウィンドウで提供される同一の編集機能を使用すると、いくつかのデータ視覚化コンポーネントの子コンポーネント(データ・ポイント・レイヤーなど)を編集できます。

CompGalleryというMAFサンプル・アプリケーションは、MAF AMXアプリケーション機能での様々なデータ視覚化コンポーネントの使用方法を示しています。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

MAF AMXデータ視覚化コンポーネントの詳細は、次を参照してください:

- イベント・リスナーをデータ視覚化コンポーネントに追加する方法の詳細は、第13.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもMAF AMX実行時の記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

- 「データ・コントロール」ウィンドウから作成されるデータバインドされたデータ視覚化コンポーネントの詳細は、第13.5.26項「データバインドされたデータ視覚化コンポーネントの作成方法」を参照してください。

- データ視覚化コンポーネントにおけるアクセシビリティのサポートの詳細は、第13.8項「MAFのアクセシビリティのサポートの理解」を参照してください。

- MAF AMXデータ視覚化コンポーネントの使用上の制約の詳細は、第E.6.2項「データ視覚化コンポーネントの制限」を参照してください。

13.5.1 面グラフの作成方法

面グラフ(areaChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けれされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、面の色やパターンなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。カスタム系列スタイルの定義の詳細は、第13.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>

図13-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>

注意:
この項の最初の方にある例と図13-48では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

このコンポーネントに対して定義できるareaChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.17.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、面グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-areaChart
- supported properties: all

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.2 棒グラフの作成方法

棒グラフ(barChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを垂直の棒として視覚的に表すために使用します。系列は、個々のデータ・アイテムごとではなく系列レベルで適用する必要があるいくつかの一般的なスタイル・プロパティを持つグラフィカル要素を使用して視覚化されます。

棒グラフは、X軸に沿ってズームおよびスクロールできます。これはzoomAndScroll属性を使用して有効化されます。

次の例は、MAF AMXファイルで定義されているbarChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。

<dvtm:barChart id="barChart1"
value="#{bindings.barData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
animationOnDisplay="zoom"
animationDuration="3000" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<dvtm:yAxis id="yAxis1"
axisMaxValue="80.0"
majorIncrement="20.0"
title="yAxis Title" />
<dvtm:legend id="l1" position="start" />
</dvtm:barChart>

図13-51 デザインタイムの棒グラフ

棒グラフのデータ・モデルは、個々の棒を記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- series: この棒が属する系列の名前。

- group: この棒が属するグループの名前。

- value: データ・アイテムの値(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

このコンポーネントに対して定義できるbarChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.17.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、棒グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-barChart
- supported properties: all

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.3 横棒グラフの作成方法

横棒グラフ(horizontalBarChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを水平の棒として視覚的に表すために使用します。系列は、個々のデータ・アイテムごとではなく系列レベルで適用する必要があるいくつかの一般的なスタイル・プロパティを持つグラフィカル要素を使用して視覚化されます。

棒グラフは、X軸に沿ってズームおよびスクロールできます。これはzoomAndScroll属性を使用して有効化されます。

次の例は、MAF AMXファイルで定義されているhorizontalBarChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。

<dvtm:horizontalBarChart id="horizBarChart1"
value="#{bindings.barData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
dataSelection="#{pageFlowScope.dataSelection}"
hideAndShowBehavior="#{pageFlowScope.hideAndShowBehavior}"
rolloverBehavior="#{pageFlowScope.rolloverBehavior}"
stack="#{pageFlowScope.stack}" >
<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:horizontalBarChart>

図13-52 デザインタイムの横棒グラフ

横棒グラフのデータ・モデルは、個々の棒を記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- series: この棒が属する系列の名前。

- group: この棒が属するグループの名前。

- value: データ・アイテムの値(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

このコンポーネントに対して定義できるhorizontalBarChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.17.1項「チャートのデータ・アイテムの定義」を参照)。

向き属性によって、棒グラフを垂直または水平として定義できます。

このコンポーネントに対して定義できるbarChart子要素およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、横棒グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-horizontalBarChart
- supported properties: all

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.4 バブル・チャートの作成方法

バブル・チャート(bubbleChart)は、各データ・アイテムがx座標、y座標およびサイズ(バブル)を持つ一連のデータ・アイテムを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(第13.5.6項「線グラフの作成方法」を参照)や面グラフ(第13.5.1項「面グラフの作成方法」を参照)と異なり、バブル・チャートには系列およびグループの厳密な概念がありません。

バブル・チャートは、X軸およびY軸に沿ってズームおよびスクロールできます。これはzoomAndScroll属性を使用して有効化されます。

次の例は、MAF AMXファイルで定義されているbubbleChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。各データ・アイテムのcolorおよびmarkerShape属性は、データ・モデルで提供されている値に基づいて個別に設定されます。また、基礎となるデータ・コントロールでは、row.label、row.sizeおよびrow.shapeの変数参照がそれぞれサポートされている必要があります。

<dvtm:bubbleChart id="bubbleChart1"
value="#{bindings.bubbleData.collectionModel}"
inlineStyle="width: 400px; height: 300px;"
dataSelection="multiple"
rolloverBehavior="dim"
animationOnDisplay="auto"
var="row">
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
group="#{row.group}"
x="#{row.x}"
y="#{row.y}"
markerSize="#{row.size}"
color="#{row.color}"
markerShape="#{row.shape}" />
</amx:facet>
</dvtm:bubbleChart>

図13-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を子として含めることができます(第13.5.17.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、バブル・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-bubbleChart
- supported properties: all

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.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>

図13-54 デザインタイムのコンポ・チャート

このコンポーネントに対して定義できるcomboChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

コンボ・チャートの向き(垂直または水平)は、orientation属性と、値verticalおよびhorizontalによって制御できます。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.17.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、コンボ・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-comboChart
- supported properties: all

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.6 線グラフの作成方法

線グラフ(lineChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、線の色、太さ、スタイルなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。

線グラフは、X軸に沿ってズームおよびスクロールできます。これはzoomAndScroll属性を使用して有効化されます。

線グラフの向き(垂直または水平)は、orientation属性と、値verticalおよびhorizontalによって制御できます。

線グラフは、<dvtm:chartSeriesStyle>のtype属性のlineWithAreaオプションを使用すると、任意で作成できます。これにより、一杯になった面を線グラフの下に追加できます。一杯になった面の色は、areaColor属性を使用して指定できます。

線グラフには様々なタイプの線が使用できます。線のタイプを指定するには、<dvtm:chartSeriesStyle>のlineType属性を使用します。lineType属性の値は、次のとおりです。

- straight: 直線コネクタ。

- curved: 曲線コネクタ。

- stepped: ステップ・コネクタ。線と面にのみ適用されます。

- centeredStepped: 中心にあるステップ・コネクタ。線と面にのみ適用されます。

- segmented: 立ち上がりのないステップ・コネクタ。線にのみ適用されます。

- centeredSegmented: 立ち上がりのない中心にあるステップ・コネクタ。線グラフにのみ適用されます。

- auto (デフォルト): 線/面グラフ用の直線。散布図用にはありません。

このコンポーネントに対して定義できるlineChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次の例は、MAF AMXファイルに定義されたlineChart要素を示しています。デフォルト系列スタイルで基本的な線グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}"
color="#{row.color}" />
</amx:facet>
</dvtm:lineChart>

図13-55 デザインタイムの線グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: この線が属する系列の名前。

- group: この線が属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやshapeなどの他のプロパティも含めることができます。

次の例に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、データ・アイテムのcolorおよびshape属性が、追加のグループ化式に基づいて設定されます。attributeGroupsには、次の子要素があります。

- dvtmネームスペースのattributeExceptionRule: 特定のブール条件が満たされる場合に、属性値を別の値に置き換えます。

- dvtmネームスペースのattributeMatchRule: データが特定の値に一致する場合に、属性を置き換えます。

- amxネームスペースのattribute。

同じページにあるコンポーネントが同じデータ・セットのデータを視覚化する場合、MAFでは、これらのコンポーネント間の属性グループ・バケット設定の共有がサポートされているため、属性値はコンポーネントに対して一貫して自動的に適用されます。

これをサポートするために、attributeGroupsタグには属性discriminantが含まれています。これはオプションの文字列値であり、attributeGroupsタグに同じ識別値を持つコンポーネントは、バケット割当てを共有できます。

<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>

このコンポーネントに対して定義できるlineChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.17.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、線グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-lineChart
- supported properties: all

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.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>

図13-56 デザインタイムの円グラフ

円グラフのデータ・モデルは、個々の円データ・アイテムを定義するアイテムのコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- label: 区分ラベル。

- value: 区分の値。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: 区分の境界線の色。

- color: 区分の色。

- explode: 区分を開くときのオフセット。

このコンポーネントに対して定義できるpieChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、pieDataItemを子として含めることができます(第13.5.17.4項「円グラフのデータ・アイテムの定義」を参照)。

クラス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

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.8 散布図の作成方法

散布図(scatterChart)は、各アイテムがx座標、y座標およびサイズを持つデータ・アイテムを表す連続しないドットでデータを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(第13.5.6項「線グラフの作成方法」を参照)や面グラフ(第13.5.1項「面グラフの作成方法」を参照)と異なり、散布図には系列およびグループの厳密な概念がありません。

散布図は、X軸およびY軸に沿ってズームおよびスクロールできます。これはzoomAndScroll属性を使用して有効化されます。

次の例は、MAF AMXファイルで定義されているscatterChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。各データ・アイテムのcolorおよびmarkerShape属性は、データ・モデルで提供されている値に基づいて個別に設定されます。

<dvtm:scatterChart id="scatterChart1"
inlineStyle="width: 400px; height: 300px;"
animationOnDisplay="zoom"
animationDuration="3000"
value="#{bindings.scatterData.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
group="#{row.group}"
color="#{row.color}"
markerShape="auto"
x="#{row.data.x}"
y="#{row.data.y}">
<dvtm:attributeGroups type="color"
value="#{row.series}"
id="ag1" />
</dvtm:chartDataItem>
</amx:facet>
<dvtm:xAxis id="xAxis1" title="X Axis Title" />
<dvtm:yAxis id="xAxis2" title="Y Axis Title" />
<dvtm:legend position="bottom" id="l1" />
</dvtm:scatterChart>

図13-57 デザインタイムの散布図

散布図のデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。各データ・アイテムの属性は、スタンプ(dataStamp)によって定義され、通常、次のものがあります。

- x、y: 値の座標(必須)。

- markerSize: マーカーのサイズ(オプション)。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: データ・アイテムの境界線の色。

- color: データ・アイテムの色。

- tooltip: カスタム・ツールチップ。

このコンポーネントに対して定義できるscatterChart子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第13.5.17.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、散布図コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-scatterChart
- supported properties: all

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.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>

図13-58 デザインタイムのスパーク・チャート

スパーク・チャートのデータ・モデルは、個々のスパーク・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: スパーク値。

sparkChartの属性およびdvtm子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、sparkDataItemを子として含めることができます(第13.5.17.5項「スパーク・チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、スパーク・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-sparkChart
- supported properties: all

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.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>

図13-59 デザインタイムのファンネル・チャート

ファンネル・チャートのデータ・モデルは、個々のファンネル・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: ファンネル値

- label: ファンネル区分ラベル

funnelChartの属性およびdvtm子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、funnelDataItemを子として含めることができます(第13.5.17.6項「ファンネル・データ・アイテムの定義」を参照)。

クラスdvtm-funnelChartおよびdvtm-funnelDataItemで定義されているデフォルトCSS設定を上書きすることで、ファンネル・チャート・コンポーネントをスタイル設定できます。

- トップレベル要素は次を使用してスタイル設定できます。

.dvtm-funnelChart
- supported properties: all

- ファンネル・チャートのデータ・アイテムは次を使用してスタイル設定できます。

.dvtm-funnelDataItem
- supported properties: border-color, background-color

グラフのスタイル設定の詳細は、第13.5.11項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

13.5.11 チャート・コンポーネントのスタイル設定方法

スパーク・チャートを除き、次のクラスで定義されているデフォルトCSS設定を上書きすることで、チャート・コンポーネントをスタイル設定できます。

- チャート・コンポーネントの凡例は次を使用してスタイル設定できます。

.dvtm-legend
- supported properties used for text styling:
font-family, font-size, font-weight, color, font-style
- supported properties used for background styling: background-color
- supported properties used for border styling:
border-color (used when border width > 0)

.dvtm-legendTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-legendSectionTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

- チャート・コンポーネントのタイトル、サブタイトルなどは次を使用してスタイル設定できます。

.dvtm-chartTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartSubtitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartFootnote
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartTitleSeparator
- supported properties:
visibility (is title separator rendered),
border-top-color, border-bottom-color

- チャート・コンポーネントの軸は次を使用してスタイル設定できます。

.dvtm-chartXAxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartYAxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartY2AxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartXAxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartYAxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartY2AxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

チャート・コンポーネントのトップレベル要素のスタイル設定に加え、一部のチャートの特定の子要素をスタイル設定できます。

13.5.12 チャート・コンポーネントでのイベントの使用方法

ViewportChangeEventを使用して、チャート・コンポーネントのズームおよびスクロールを処理できます。ズームまたはスクロールのいずれかが発生すると、コンポーネントは、新しいビューポートを定義する情報でロードされるイベントを起動します。

面グラフ、棒グラフ、横棒グラフ、コンボ・チャートおよび線グラフのコンポーネントの属性としてviewportChangeListenerを指定できます。

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- Oracle Mobile Application Framework Java APIリファレンス

- Oracle Mobile Application Frameworkタグ・リファレンス

13.5.13 LEDゲージの作成方法

チャートと異なり、ゲージでは、単一のデータ・ポイントを重視し、そのポイントを最小、最大およびしきい値インジケータと比較して問題領域を識別します。LED(電光表示)ゲージ(ledGauge)は、重要業績評価指標(KPI)などの測定値をグラフィカルに表します。LEDゲージには、いくつかのスタイルがあります。矢印付きのものは、よい(上矢印)、普通(右または左矢印)および悪い(下矢印)を示すために使用されます。ゲージのしきい値はいくつでも指定できます。ただし、一部のLEDゲージ(矢印または三角形のインジケータを持つものなど)では、指し示す有効な方向の数が限られているため、サポートされるしきい値の数にかぎりがあります。矢印または三角形のインジケータの場合、しきい値の最大数は3です。

次の例は、MAF AMXファイルで定義されているledGauge要素を示しています。

<dvtm:ledGauge id="ledGauge1"
value="65"
type="circle"
inlineStyle="width: 100px; height: 80px; float: left;
border-color: navy; background-color: lightyellow;">
<dvtm:threshold id="threshold1" text="Low" maxValue="40" />
<dvtm:threshold id="threshold2" text="Medium" maxValue="60" />
<dvtm:threshold id="threshold3" text="High" maxValue="80" />
</dvtm:ledGauge>

図13-60 デザインタイムのLEDゲージ

LEDゲージのデータ・モデルは、value属性で指定される単一のメトリック値で表されます。

このコンポーネントに対して定義できるledGauge子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次のamx子要素を定義できます。

- showPopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第13.9項「入力の検証」を参照)

13.5.14 ステータス・メーター・ゲージの作成方法

ステータス・メーター・ゲージ(statusMeterGauge)は、長方形の水平バーまたは円に沿ってタスクの進捗状況または測定値のレベルを示します。コンポーネントのある部分は、別の部分にマークされた範囲に対する現在の測定値のレベルを示します。また、しきい値は、サイズ変更が可能なインジケータの背後に表示できます。

MAF AMXデータ視覚化のステータス・メーター・ゲージ・コンポーネントでは、参照線(referenceLine)のサポートが提供されます。この参照線を使用して、ブレット・グラフを生成できます。

次の例は、MAF AMXファイルで定義されているstatusMeterGauge要素を示しています。

<dvtm:statusMeterGauge id="meterGauge1"
value="65"
animationOnDisplay="auto"
animationDuration="1000"
inlineStyle="width: 300px;
height: 30px;
float: left;
border-color: black;
background-color: lightyellow;"
minValue="0"
maxValue="100">
<dvtm:metricLabel/>
<dvtm:threshold id="threshold1" text="Low" maxValue="40" />
<dvtm:threshold id="threshold2" text="Medium" maxValue="60" />
<dvtm:threshold id="threshold3" text="High" maxValue="80" />
</dvtm:statusMeterGauge>

図13-61 デザインタイムの長方形のステータス・メーター・ゲージ

円形で表される(図13-62を参照)ステータス・メーター・ゲージを作成するには、orientation属性をcircularに設定します。デフォルトでは、この属性はhorizontalに設定されいるため、横向きの長方形になります。

図13-62 デザインタイムの円形のステータス・メーター・ゲージ

また、orientation属性はverticalに設定できます。これにより、ステータス・メーター・ゲージが垂直に並びます。

ステータス・メーター・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに対して定義できるstatusMeterGauge子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次のamx子要素を定義できます。

- showPopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第13.9項「入力の検証」を参照)

13.5.15 ダイアル・ゲージの作成方法

ダイヤル・ゲージ(dialGauge)は、悪いからよいまで変化する値(しきい値)の範囲を指定します。ゲージのインジケータではメトリックの現在の値が示される一方、図形によってその値のステータスを評価できます。

次の例は、MAF AMXファイルで定義されているdialGauge要素を示しています。

<dvtm:dialGauge id="dialGauge1"
background="#{pageFlowScope.background}"
indicator="#{pageFlowScope.indicator}"
value="#{pageFlowScope.value}"
minValue="#{pageFlowScope.minValue}"
maxValue="#{pageFlowScope.maxValue}"
animationDuration="1000"
animationOnDataChange="auto"
animationOnDisplay="auto"
shortDesc="#{pageFlowScope.shortDesc}"
inlineStyle="#{pageFlowScope.inlineStyle}"
styleClass="#{pageFlowScope.styleClass}"
readOnly="true">
</dvtm:dialGauge>

図13-63 デザインタイムのダイヤル・ゲージ

ダイヤル・ゲージのデータ・モデルは、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>

図13-64 メトリック・ラベルおよびティック・ラベルの付いたデザインタイムのダイアル・ゲージ

dialGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第13.9項「入力の検証」を参照)

13.5.16 評価ゲージの作成方法

評価ゲージ(ratingGauge)を使用すると、事前定義された視覚スケールに評価を表示したり、その評価を変更できます。デフォルトの評価単位は、星で表されます。ratingGaugeのshape属性を設定することによって、この単位を円、長方形、星またはひし形として構成できます。

次の例は、MAF AMXファイルで定義されているratingGauge要素を示しています。

<dvtm:ratingGauge id="ratingGauge1"
value="#{pageFlowScope.value}"
minValue="0"
maxValue="5"
inputIncrement="full"
shortDesc="#{pageFlowScope.shortDesc}"
inlineStyle="#{pageFlowScope.inlineStyle}"
readOnly="true"
shape="circle"
unselectedShape="circle">
</dvtm:ratingGauge>

図13-65 デザインタイムの評価ゲージ

評価ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに対して定義できるratingGauge子要素およびdvtm子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

ratingGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第13.9項「入力の検証」を参照)

13.5.16.1 評価ゲージ・コンポーネントへのカスタム・スタイルの適用

ユーザーが評価ゲージ・コンポーネントに対して実行したアクションに応じて、評価単位(イメージ)は次のいずれかの状態を取得できます。

- selected: 単位を選択した場合。

- unselected: 単位を選択しなかった場合。

- hover: 単位にマウスを置いた場合。

注意:
タッチ・インタフェースを使用するモバイル・デバイスでは、hover状態はタップしたまま押さえるジェスチャーを通じて呼び出されます。

- changed: 単位を変更した場合。

各状態は、colorおよびborderColorという2つの属性によって表されます。デフォルトでは、ratingGaugeのshape属性によって、hoverおよびchanged状態の選択内容が決まります。unselected状態は、ratingGaugeのunselectedShape属性を使用して個別に設定できます。

デフォルトCSS設定を上書きすることで、評価ゲージ・コンポーネントをスタイル設定できます。CSSファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、評価ゲージ単位の各状態のcolorおよびborderColorに対するデフォルトCSSスタイル定義を示しています。

.dvtm-ratingGauge {
}

.dvtm-ratingGauge .dvtm-ratingGaugeSelected {
border-width: 1px;
border-style: solid;
border-color: #FFC61A;
color: #FFBB00;
}

.dvtm-ratingGauge .dvtm-ratingGaugeUnselected {
border-width: 1px;
border-style: solid;
border-color: #D3D3D3;
color: #F4F4F4;
}

.dvtm-ratingGauge .dvtm-ratingGaugeHover {
border-width: 1px;
border-style: solid;
border-color: #6F97CF;
color: #7097CF;
}

.dvtm-ratingGauge .dvtm-ratingGaugeChanged {
border-width: 1px;
border-style: solid;
border-color: #A8A8A8;
color: #FFBB00;
}

13.5.17 チャートおよびゲージ・コンポーネントの子要素の定義方法

チャートおよびゲージには様々な子要素を定義できます。それらの子要素のいくつかを次に示します。

- chartDataItem (第13.5.17.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第13.5.17.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第13.5.17.2項「凡例の定義」を参照)

- pieDataItem (第13.5.17.4項「円グラフのデータ・アイテムの定義」を参照)

- sparkDataItem (第13.5.17.5項「スパーク・チャートのデータ・アイテムの定義」を参照)

- threshold (第13.5.17.7項「しきい値の定義」を参照)

- funnelDataItem

これらのおよびその他の子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

OEPEでは、データ視覚化コンポーネントの子コンポーネントは、それぞれの視覚化タイプの下にあります(図13-66を参照)。

図13-66 チャートおよびゲージの子コンポーネントの作成

13.5.17.1 チャートのデータ・アイテムの定義

チャート・データ・アイテム(chartDataItem)要素は、円グラフを除くすべてのサポートされているチャートでチャート・データ・アイテムが使用するパラメータを指定します。

チャート・データ・アイテムでのテキスト表示を有効化でき、chartDataItem要素の関連する属性を設定することで、そのラベル、ラベル位置およびラベル・スタイルを制御でき、さらに、チャート自体のdataLabelPosition属性を設定することで指定されたチャートのすべてのデータ・ラベルの位置を指定できます。

注意:
散布図、円グラフおよびファンネル・チャートのコンポーネントでは、dataLabelPosition属性はサポートされていません。

chartDataItem要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.17.2 凡例の定義

凡例(legend)要素は、凡例パラメータを指定します。凡例要素は、seriesStyle要素のactionプロパティを介してクリック相互作用をサポートしています。

legend要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.17.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" />

xAxis、yAxisおよびy2Axis要素の属性および子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.17.4 円グラフのデータ・アイテムの定義

円グラフのデータ・アイテム(pieDataItem)要素は、円グラフの区分のパラメータを指定します(第13.5.7項「円グラフの作成方法」を参照)。

pieDataItem要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.17.5 スパーク・チャートのデータ・アイテムの定義

スパーク・チャートのデータ・アイテム(sparkDataItem)要素は、スパーク・チャート・アイテムのパラメータを指定します(第13.5.9項「スパーク・チャートの作成方法」を参照)。

sparkDataItem要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.17.6 ファンネルのデータ・アイテムの定義

ファンネルのデータ・アイテム(funnelDataItem)要素は、ファンネル・チャート・アイテムのパラメータを指定します(第13.5.10項「ファンネル・チャートの作成方法」を参照)。

funnelDataItem要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.17.7 しきい値の定義

しきい値(threshold)要素は、ゲージのしきい値範囲を指定します(第13.5.13項「LEDゲージの作成方法」および第13.5.14項「ステータス・メーター・ゲージの作成方法」を参照)。

threshold要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.18 地理マップ・コンポーネントの作成方法

地理マップ(geographicMap)は、1つのマップに重ね合せた1つ以上のインタラクティブな情報レイヤーでビジネス・データを表します。このコンポーネントを構成して、GoogleマップまたはOracleマップのいずれかをマップ・プロバイダとして 使用できます(第13.5.18.1項「地理プロバイダ情報を指定した地理マップ・コンポーネントの構成」を参照)。

次の例は、MAF AMXファイルで定義されているgeographicMap要素を示しています。

<dvtm:geographicMap id="g1" mapType="ROADMAP"
centerX="-98.57" centerY="39.82"
zoomLevel="2" initialZooming="auto">
<dvtm:pointDataLayer id="pdl1"
var="row"
value="#{bindings.locationData.collectionModel}"
dataSelection="multiple"
selectionListener="#{myBean.doSomeGood}">
<dvtm:pointLocation id="pl1" type="address" address="#{row.address}">
<dvtm:marker shortDesc="#{row.shortDesc}" id="m1" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:geographicMap>

図13-67 デザインタイムの地理マップ

geographicMapに対してpointDataLayer子要素を定義できます。pointDataLayerによって、マップ上の点と関連付けられたデータを表示できます。pointDataLayerは子要素としてpointLocationを持つことができます。pointLocationは、データ・ポイントの位置を決定するデータ・レイヤーのモデル内の列を指定します。これらの位置は、住所またはX座標とY座標で表すことができます。

pointLocationは、子要素としてmarkerを持つことができます。markerは、マップ上のデータ・ポイントに関連付けられた組込み形状またはカスタム形状をスタンプ・アウトするために使用します。markerでは、マーカーとしてレンダリングされるイメージのURIを指定するための一連のプロパティがサポートされています。マーカーは子要素としてconvertNumberを持つことができます(第13.3.25項「数値の変換方法」を参照)。また、ポップアップ(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)がgeographicMapのマーカーの上に表示されるようにできます。そのためには、showPopupBehavior要素をmarker要素の子として宣言し、showPopupBehaviorのalignId属性をmarkerのid属性の値に設定します。

注意:
地理マップ・アドレス・ポイントに対してアドレス解決を提供するジオコーダ・サービスの制限のために、dvtm:geographicMapは、マップ・プロバイダのビジネス・ライセンスを持たないユーザーに対して、10を超えるデータ・ポイントを表示できません。

geographicMap要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

地理マップ・コンポーネントでは、タッチ・ジェスチャーを使用してピン(マップ上のポイントの作成)を挿入できます。この機能は、mapInputListenerを使用して構成できます。詳細は、第13.5.20項「Mapコンポーネントでのイベントの使用方法」を参照してください。

13.5.18.1 地理プロバイダ情報を指定した地理マップ・コンポーネントの構成

基礎となるマップに特定のプロバイダ(GoogleまたはOracle)を使用するように地理マップ・コンポーネントを構成するには、アプリケーションのadf-config.xmlファイルに名前と値のペアとして次のプロパティを設定します。

- mapProvider: oraclemapsまたはgooglemapsを指定します。

- geoMapKey: mapProviderがgooglemapsに設定されている場合は、ライセンス・キーを指定します。

- geoMapClientId: mapProviderがgooglemapsに設定されている場合は、Googleマップ・ビジネス・ライセンスのクライアントIDを指定します。

- mapViewerUrl: mapProviderがoraclemapsに設定されている場合は、Oracleマップのマップ・ビューアURLを指定します。

- baseMap: mapProviderがoraclemapsに設定されている場合は、Oracleマップとともに使用するベース・マップを指定します。

注意:
Googleマップを使用するように地理マップ・コンポーネントを構成するには、Googleから該当するライセンスを取得する必要があります。

次の例は、Googleマップ用の構成を示しています。

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="googlemaps"/>
<adf-property name="geoMapKey" value="your key"/>
</adf-properties-child>

次の例は、Oracleマップの構成を示しています。

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="oraclemaps"/>
<adf-property name="mapViewerUrl"
value="http://elocation.oracle.com/mapviewer"/>
<adf-property name="baseMap" value="ELOCATION_MERCATOR.WORLD_MAP"/>
</adf-properties-child>

マップ・プロバイダ情報を指定しない場合、MAF AMX地理マップ・コンポーネントは、そのマップにGoogleマップを使用しますがライセンス・キーはありません。

13.5.19 テーマ・マップ・コンポーネントの作成方法

テーマ・マップ(thematicMap)では、ビジネス・データをスタイル設定された領域内のパターンまたは関連付けられたマーカーとして表します。テーマ・マップでは、地理的な詳細なしで、データに焦点を合せます。

次の例は、MAF AMXファイルで定義されているthematicMap要素およびその子を示しています。

<dvtm:thematicMap id="tm1"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
animationOnMapChange="#{pageFlowScope.animationOnMapChange}"
animationDuration="#{pageFlowScope.animationDuration}"
basemap="#{pageFlowScope.basemap}"
tooltipDisplay="#{pageFlowScope.tooltipDisplay}"
inlineStyle="#{pageFlowScope.inlineStyle}"
zooming="#{pageFlowScope.zooming}"
panning="#{pageFlowScope.panning}"
initialZooming="#{pageFlowScope.initialZooming}">
<dvtm:areaLayer id="areaLayer1"
layer="#{pageFlowScope.layer}"
animationOnLayerChange=
"#{pageFlowScope.animationOnLayerChange}"
areaLabelDisplay="#{pageFlowScope.areaLabelDisplay}"
labelType="#{pageFlowScope.labelType}"
areaStyle="background-color"
rendered="#{pageFlowScope.rendered}">
<dvtm:areaDataLayer id="areaDataLayer1"
animationOnDataChange=
"#{pageFlowScope.dataAnimationOnDataChange}"
animationDuration=
"#{pageFlowScope.dataAnimationDuration}"
dataSelection="#{pageFlowScope.dataSelection}"
var="row"
value="#{bindings.thematicMapData.collectionModel}">
<dvtm:areaLocation id="areaLoc1" name="#{row.name}">
<dvtm:area action="sales" id="area1" shortDesc="#{row.name}">
<amx:setPropertyListener id="spl1"
to=
"#{DvtProperties.areaChartProperties.dataSelection}"
from="#{row.name}"
type="action"/>
<dvtm:attributeGroups id="ag1" type="color" value="#{row.cat1}" />
</dvtm:area>
</dvtm:areaLocation>
</dvtm:areaDataLayer>
</dvtm:areaLayer>
<dvtm:legend id="l1" position="end">
<dvtm:legendSection id="ls1" source="ag1"/>
</dvtm:legend>
</dvtm:thematicMap>

図13-68 デザインタイムのテーマ・マップ

markerZoomBehavior属性を使用すると、マップがズームされるとテーマ・マップのマーカーのスケール変更が有効化されます。rotation属性を設定することで、マーカーの回転を有効化でき、この属性の値は、イメージの中心に対してマーカーが回転する(時計回りの度数)角度を表します。

MAF AMXテーマ・マップは、次の拡張機能をサポートしています。

- カスタム・マーカー(第13.5.19.1項「カスタム・マーカーの定義」を参照)

- 領域の分離(第13.5.19.3項「分離領域の定義」を参照)

- 初期ズーム(第13.5.19.4項「初期ズームの有効化」を参照)

- カスタム・ベース・マップ(第13.5.19.5項「カスタム・ベース・マップの定義」を参照)

thematicMap要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.19.1 カスタム・マーカーの定義

MAF AMXテーマ・マップでは、MAF AMXイメージ・コンポーネントはサポートされていません。マップのpointLocation内でイメージを使用するには、pointLocationのmarker子要素で、そのsource属性を使用してイメージを指定します。source属性がマーカーに対して設定されている場合、そのshape属性はMAF AMXで無視されます。

sourceHover、sourceSelectedおよびsourceHoverSelected属性で、ホバーおよび選択効果のイメージを指定できます。これらの1つが指定されていない場合、その特定のマーカー状態に対してはsource属性によって指定されているイメージが使用されます。sourceSelectedが指定されている場合、sourceHoverSelectedが指定されていないときはその値が使用されます。イメージは、PNG、JPG、SVGなどモバイル・デバイスのブラウザでサポートされている任意のフォーマットで構いません。

13.5.19.2 分離領域レイヤーの定義

データの地理的場所の伝達にリージョン・アウトラインが常に必要であるわけではありません。かわりに、テーマ・マップ・コンポーネントには、領域内でイメージやマーカーをセンタリングするためのオプションがあるため、リージョン・アウトラインが描画されない見えない領域レイヤーを定義するオプションがあります。

見えない領域レイヤーを定義するには、CSS値のbackground-colorおよびborder-colorを受け入れるareaLayerのareaStyle属性を使用します。

<dvtm:areaLayer id="areaLayer1"
...
areaStyle="background-color:transparent;border-color:transparent">

この属性によって、dvtm-areaスキニング・キーを使用することなく、デフォルトの領域レイヤーの色および枠線の形状をオーバーライドできます。

13.5.19.3 分離領域の定義

MAF AMXテーマ・マップ・コンポーネントを構成し、areaDataLayerのisolatedRowKey属性を使用してマップの単一の分離領域に収まるようにレンダリングおよびズームできますが、この場合、その領域または領域データ・レイヤーの残りの領域はレンダリングされません。

注意:
分離できるのは、1つのマップで1つの領域のみです。

13.5.19.4 初期ズームの有効化

初期ズームでは、マップ・コンポーネントを通常どおりレンダリングし、その後、マーカーと領域の両方を含むデータ・オブジェクトにズームして合せることができます。この機能を有効にするには、テーマ・マップのinitialZooming属性を使用します。

13.5.19.5 カスタム・ベース・マップの定義

カスタム・ベース・マップ・サポートの一環として、MAF AMXでは、テーマ・マップ・コンポーネントに対して次のことを指定できます。

- 様々な解像度のイメージを持つレイヤー。

- 点の位置(pointLocation)から参照できる名前付きの点を持つ点レイヤー。

- カスタム・ベース・マップ・メタデータXMLファイルを指すテーマ・マップのsource属性。

注意:
MAF AMXでは、カスタム・ベース・マップは次のことはサポートされていません。

- 定型化された領域: 領域レイヤーはカスタム・ベース・マップに定義できないため、ポイント・レイヤーを使用します。

- リソース・バンドル: ロケール固有のツールチップを追加する場合は、マーカー(marker)のshortDesc属性にあるELを使用できます。

カスタム・ベース・マップを作成するには、メタデータ・ファイルの定義を指す領域レイヤーを指定します(次の例を参照)。基本的なカスタム・ベース・マップを定義するには、背景レイヤーおよびポインタ・データ・レイヤーを指定します。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>

次の例は、点によってカスタム領域レイヤーを宣言するMAF AMXファイルを示しています。このMAF AMXファイルは、使用可能なイメージのリストを含む前述の例のメタデータ・ファイルを指しています。

<dvtm:thematicMap id="tm1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" >
<dvtm:pointDataLayer id="pdl1"
var="row"
value="{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1"
type="pointXY"
pointX="#{row.x}"
pointY="#{row.y}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:areaLayer>
</dvtm:thematicMap>

前述の例では、ベース・マップIDはthematicMapのbasemap属性と照合され、レイヤーIDはareaLayerのlayer属性と照合されます。点は(前述のベース・マップの場合と同様に)X座標とY座標で定義され、データが更新されたときに変更される可能性がある動的な点に対応します。

次の例は、点によってカスタム領域レイヤーを宣言するもう1つの方法を示しています。この例では、pointDataLayerは、thematicMapの直接の子です。方法は異なりますが、前述の例では、次に示す宣言と同じ結果がレンダリングされます。

<dvtm:thematicMap id="demo1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" />
<dvtm:pointDataLayer id="pdl1"
var="row"
value="{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1"
type="pointXY"
pointX="#{row.x}"
pointY="#{row.y}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:thematicMap>

静的な点を含むカスタム・ベース・マップを作成するには、次の例に示すメタデータ・ファイルに名前で点を指定します。このプロセスは、事前定義済ベース・マップに市区町村のマーカーを追加する場合に類似しています。

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-800x800-rtl.png"
width="2560"
height="1920"
dir="rtl" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
<image source="/maps/car-200x200-rtl.png"
width="640"
height="480"
dir="rtl" />
</layer>
<points >
<point name="hood" x="219.911" y="329.663" />
<point name="frontLeftTire" x="32.975" y="32.456" />
<point name="frontRightTire" x="10.334" y="97.982" />
</points>
</basemap>

名前付き点のX位置およびY位置は、layerの最初のimage要素のイメージのサイズにマップされるものと想定されます。

注意:
点は、ベース・マップ内でグローバルであり、すべてのレイヤーに適用されるため、点は特定のレイヤーおよびそのイメージには定義できません。

次の例は、名前付きの点によってカスタム領域レイヤーを宣言するMAF AMXファイルを示しています。この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>

13.5.19.6 イベント・リスナー用のマーカー・サポートに関する必知事項

MAF AMXデータ視覚化では、markerのactionListener属性はサポートされていません。かわりに、action属性を使用することで、同じ機能を実現できます。

13.5.19.7 テーマ・マップ・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、テーマ・マップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、テーマ・マップ・コンポーネントのデフォルトCSSスタイルを示しています。

.dvtm-thematicMap {
background-color: #FFFFFF;
-webkit-user-select: none;
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}

.dvtm-areaLayer {
background-color: #B8CDEC;
border-color: #FFFFFF;
border-width: 0.5px;
/* border style and color must be set when setting border width */
border-style: solid;
color: #000000;
font-family: tahoma, sans-serif;
font-size: 13px;
font-weight: bold;
font-style: normal;
}

.dvtm-area {
border-color: #FFFFFF;
border-width: 0.5px;
/* border style and color must be set when setting border width */
border-style: solid;
}

.dvtm-marker {
background-color: #61719F;
opacity: 0.7;
color: #FFFFFF;
font-family: tahoma, sans-serif;
font-size: 13px;
font-weight: bold;
font-style: normal;
border-style: solid
border-color: #FFCC33
border-width: 12px
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。次の例は、CSSを使用しないでテーマ・マップ・コンポーネントにカスタム・スタイルを適用する方法を示しています。

my-custom.js:

CustomThematicMapStyle = {
// selected area properties
'areaSelected': {
// selected area border color
'borderColor': "#000000",
// selected area border width
'borderWidth': '1.5px'
},

// area properties on mouse hover
'areaHover': {
// area border color on hover
'borderColor': "#FFFFFF",
// area border width on hover
'borderWidth': '2.0px'
},

// marker properties
'marker': {
// separator upper color
'scaleX': 1.0,
// separator lower color
'scaleY': 1.0,
// should display title separator
'type': 'circle'
},

// thematic map legend properties
'legend': {
// legend position, such as none, auto, start, end, top, bottom
'position': "auto"
}
};

})();

CustomThematicMapStyleオブジェクトの名前およびプロパティ名は変更できません。かわりに、特定のプロパティ値を、アプリケーションのニーズに合わせて変更できます。

attributeGroups属性がテーマ・マップ・コンポーネント用に定義されている場合、CustomThematicMapStyleを使用して、そのコンポーネントの図形と色のデフォルト・セットを定義できます。この場合、CustomThematicMapStyleオブジェクトの構造は、次の例のようになっている必要があります。styleDefaultsは、次のフィールドを含むネストされたオブジェクトです。

- colors: 領域とマーカーに使用される色のセットを表します。

- shapes: マーカーに使用される図形のセットを表します。

window['CustomThematicMapStyle'] =
{
// custom style values
'styleDefaults': {
// custom color palette
'colors': ["#000000", "#ffffff"],
// custom marker shapes
'shapes' : ['circle', 'square']
}
};

13.5.20 Mapコンポーネントでのイベントの使用方法

MapBoundsChangeEventを使用して、地図マップ・コンポーネントでの次のマップ・ビューのプロパティ変更を処理できます。

- ズーム・レベルに対する変更。

- マップ境界に対する変更。

- マップの中心に対する変更。

これらの変更が発生すると、コンポーネントは、新しいマップ・ビューのプロパティ値でロードされるイベントを起動します。

mapBoundsChangeListenerを地理マップの属性として定義できます。

MapInputEventを使用して、地理マップ・コンポーネントおよびテーマ・マップ・コンポーネントで、タップやマウス・クリックなどのエンド・ユーザー・アクションを処理できます。これらのアクションが発生すると、コンポーネントは、マップの緯度および経度、およびアクションのタイプ(マウス・ダウン、マウス・アップ、クリックなど)に関する情報でロードされるイベントを起動します。

mapInputListenerを地理マップ・コンポーネントの属性として定義できます。

詳細は、次を参照してください。

- 第13.10項「イベント・リスナーの使用方法」

- Oracle Mobile Application Framework Java APIリファレンス

- Oracle Mobile Application Frameworkタグ・リファレンス

13.5.21 ツリーマップ・コンポーネントの作成方法

ツリーマップ(treemap)は、2つのディメンションに渡って(そのノードのサイズおよび色で)階層データを表示します(treemapNode)。

「パレット」では、「MAF AMXデータ視覚化」→「ツリーマップ」にツリーマップはあります(図13-69を参照)。

図13-69 「パレット」でのツリーマップの場所

次の例は、MAF AMXファイルで定義されているtreemap要素およびその子を示しています。

<dvtm:treemap id="treemap1"
value="#{bindings.treemapData.collectionModel}"
var="row"
animationDuration="#{pageFlowScope.animationDuration}"
animationOnDataChange="#{pageFlowScope.animationOnDataChange}"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
layout="#{pageFlowScope.layout}"
nodeSelection="#{pageFlowScope.nodeSelection}"
rendered="#{pageFlowScope.rendered}"
emptyText="#{pageFlowScope.emptyText}"
inlineStyle="#{pageFlowScope.inlineStyle}"
sizeLabel="#{pageFlowScope.sizeLabel}"
styleClass="dvtm-gallery-component"
colorLabel="#{pageFlowScope.colorLabel}"
sorting="#{pageFlowScope.sorting}"
selectedRowKeys="#{pageFlowScope.selectedRowKeys}"
isolatedRowKey="#{pageFlowScope.isolatedRowKey}"
legendSource="ag1">
<dvtm:treemapNode id="node1"
fillPattern="#{pageFlowScope.fillPattern}"
label="#{row.label}"
labelDisplay="#{pageFlowScope.labelDisplay}"
value="#{row.marketShare}"
labelHalign="#{pageFlowScope.labelHalign}"
labelValign="#{pageFlowScope.labelValign}">
<dvtm:attributeGroups id="ag1"
type="color"
value="#{row.deltaInPosition}"
attributeType="continuous"
minLabel="-1.5%"
maxLabel="+1.5%"
minValue="-1.5"
maxValue="1.5" >
<amx:attribute id="a1" name="color1" value="#ed6647" />
<amx:attribute id="a2" name="color2" value="#f7f37b" />
<amx:attribute id="a3" name="color3" value="#68c182" />
</dvtm:attributeGroups>
</dvtm:treemapNode>
</dvtm:treemap>

図13-70 デザインタイムのツリーマップ

attributeGroups要素のattributeType属性をcontinuousに設定することで、グラデーション色を使用してツリーマップ・アイテムに関連付けられている値の視覚化を有効にでき、この色の強度は指定された範囲内の相対値を表します。

treemap要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.21.1 ツリーマップ・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、ツリーマップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、オーバーライド可能なツリーマップ・コンポーネントのデフォルトCSSスタイルを示しています。

.dvtm-treemap {
border-style: solid;
border-color: #E2E8EE;
border-radius: 3px;
background-color: #EDF2F7;
...
}

次の例は、オーバーライド可能なツリーマップ・ノードのデフォルトCSSスタイルを示しています。

.dvtm-treemapNodeSelected {
// Selected node outer border color
border-top-color: #E2E8EE;
// Selected node inner border color
border-bottom-color: #EDF2F7;
}

次の例は、カスタムCSSを使用してスタイルを設定できる、ツリーマップ・ノードのlabelテキストCSSプロパティを示しています。

.dvtm-treemapNodeLabel {
font-family: Helvetica, sans-serif;
font-size: 14px;
font-style: normal;
font-weight: normal;
color: #7097CF;
...
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。次の例は、CSSを使用しないでツリーマップ・コンポーネントにカスタム・スタイルを適用する方法を示しています。

my-custom.js:

window["CustomTreemapStyle"] = {

// treemap properties
"treemap" : {
// Specifies the animation effect when the data changes - none, auto
"animationOnDataChange": "auto",

// Specifies the animation that is shown on initial display - none, auto
"animationOnDisplay": "auto",

// Specifies the animation duration in milliseconds
"animationDuration": "500",

// The text of the component when empty
"emptyText": "No data to display",

// Specifies the layout of the treemap -
// squarified, sliceAndDiceHorizontal, sliceAndDiceVertical
"layout": "squarified",

// Specifies the selection mode - none, single, multiple
"nodeSelection": "multiple",

// Specifies whether or not the nodes are sorted by size - on, off
"sorting": "on"
},

// treemap node properties
"node" : {
// Specifies the label display behavior for nodes - node, off
"labelDisplay": "off",

// Specifies the horizontal alignment for labels displayed
// within the node - center, start, end
"labelHalign": "end",

// Specifies the vertical alignment for labels displayed
// within the node - center, top, bottom
"labelValign": "center"
},
}

13.5.22 サンバースト・コンポーネントの作成方法

サンバースト(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>

図13-71 デザインタイムのサンバースト

attributeGroups要素のattributeType属性をcontinuousに設定することで、グラデーション色を使用してサンバースト・アイテムに関連付けられている値の視覚化を有効にでき、この色の強度は指定された範囲内の相対値を表します。

sunburst要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.22.1 サンバースト・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、サンバースト・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第13.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、オーバーライド可能なサンバースト・コンポーネントのデフォルトCSSスタイルを示しています。

.dvtm-sunburst {
border-style: solid;
border-color: #E2E8EE;
border-radius: 3px;
background-color: #EDF2F7;
...
}

次の例は、オーバーライド可能なサンバースト・ノードのデフォルトCSSスタイルを示しています。

.dvtm-sunburstNode {
// Node border color
border-color: "#000000";
}

.dvtm-sunburstNodeSelected {
// Selected node border color
border-color: "#000000";
}

次の例は、カスタムCSSを使用してスタイルを設定できる、サンバースト・ノードのlabelテキストCSSプロパティを示しています。

.dvtm-sunburstNodeLabel {
font-family: Helvetica, sans-serif;
font-size: 14px;
font-style: normal;
font-style: normal;
color: #7097CF;
...
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。次の例は、CSSを使用しないでサンバースト・コンポーネントにカスタム・スタイルを適用する方法を示しています。

my-custom.js:

window["CustomSunburstStyle"] = {
// sunburst properties
"sunburst" : {
// Specifies whether or not the client side rotation is enabled - on, off
"rotation": "off",

// The text of the component when empty
"emptyText": "No data to display",

// Specifies the selection mode - none, single, multiple
"nodeSelection": "multiple",

// Animation effect when the data changes - none, auto
"animationOnDataChange": "auto",

// Specifies the animation that is shown on initial display - none, auto
"animationOnDisplay": "auto",

// Specifies the animation duration in milliseconds
"animationDuration": "500",

// Specifies the starting angle of the sunburst
"startAngle": "90",

// Specifies whether or not the nodes are sorted by size - on, off
"sorting": "on"
},

// sunburst node properties
"node" : {
// Specifies whether or not the label is displayed - on, off
"labelDisplay": "off"
}
}

13.5.23 時系列コンポーネントの作成方法

時系列(timeline)は、イベントを時系列で表示できるインタラクティブ・コンポーネントであり、定義されていてまだ調整可能な時間範囲(ズームに使用可能)内を前後に移動できます。

イベントは、時系列アイテム・コンポーネント(timelineItem)によって表され、これにはタイトル、説明および継続時間の塗りつぶし色が含まれます。2つの時系列を構成して2系列のイベントを表示し、関連する情報を並べて比較することができます。

注意:
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>

図13-72 デザインタイムの時系列

時系列アイテムのdurationFillColor属性を使用して、継続時間バーの塗りつぶし色を制御できます。

時系列で2つの時間スケールを同時に表示するには、2番目の軸のスケールを決定する時間軸のscale属性を使用します。

時系列は水平および垂直にスクロールできます。コンポーネントがスクロール可能な(表示可能な表示領域の外側にデータが含まれている)場合、スクロールの方向を指す矢印によって示されます。

timeline要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.23.1 時系列コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、時系列コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第13.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-feelerColor

サポートされているプロパティ: color

.timelineItem-selectedFeelerColor

サポートされているプロパティ: color

.timelineItem-feelerWidth

サポートされているプロパティ: width

.timelineItem-descriptionStyle

サポートされているプロパティ: font-family、font-size、font-weight、color、font-style

.timelineItem-titleStyle

サポートされているプロパティ: font-family、font-size、font-weight、color、font-style

- .timeAxis-separatorColor
サポートされているプロパティ: color

.timeAxis-backgroundColor

サポートされているプロパティ: color

.timeAxis-borderColor

サポートされているプロパティ: color

.timeAxis-borderWidth

サポートされているプロパティ: width

.timeAxis-labelStyle

サポートされているプロパティ: font-family、font-size、font-weight、color、font-style

次の例は、時系列コンポーネントのデフォルトのスタイル設定のオーバーライドに使用できるカスタムのJavaScriptファイルを示しています。

// Custom timeline style definition with listing
// of all properties that can be overriden
window["CustomTimelineStyle"] = {
// Determines if items in the timeline are selectable
"itemSelection": none

// Timeline properties
"timelineSeries" : {
// Duration bars color palette
"colors" : [comma separated list of hex colors]
}
}

13.5.24 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>

図13-73 デザインタイムのNBox

nBox要素およびその子要素の属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.25 マップ・コンポーネント、サンバースト、ツリーマップ、時系列およびNBoxの子要素の定義方法

マップ・コンポーネント、サンバースト、ツリーマップ、時系列およびNBoxの様々な子要素を定義できます。使用可能な子要素およびその属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

OEPEでは、マップ、サンバースト、ツリーマップ、時系列およびNBoxの子コンポーネントは「パレット」の「MAF AMXデータ視覚化」の下にあります(図13-74を参照)。この図では、「パレット」→「レイアウト」から「詳細」オプションが選択されています。ここでは、「MAF AMXデータ視覚化」リストの各アイコンの隣にツールチップ・コンテンツが表示されています。

図13-74 マップ、サンバースト、ツリーマップ、時系列およびNBoxの子コンポーネントの作成

13.5.26 データバインドされたデータ視覚化コンポーネントの作成方法

「データ・コントロール」ウィンドウ(第12.3.2.3項「データ・コントロールのビューへの追加」を参照)から挿入されるデータ・コレクションを使用して、データバインドされたデータ視覚化コンポーネントを宣言的に作成できます。パレット選択(図13-85を参照)では、見出し「MAF AMXデータ視覚化」の下にある数多くのデータ視覚化コンポーネント・カテゴリ、タイプおよびレイアウト・オプションから選択できます。

図13-75 チャート・コンポーネントを作成するためのパレット選択

注意:
いくつかのデータ視覚化コンポーネント・タイプには、特別な種類のデータが必要です。選択したコンポーネントのタイプの表示に十分なデータが含まれていないデータ・コレクションにコンポーネントをバインドすると、コンポーネントは表示されず、データが不十分であることを示すメッセージが表示されます。

「コンポーネント・ギャラリ」の表示をトリガーするには、「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグ・アンド・ドロップし、表示されるコンテキスト・メニューから「MAFチャート」、「MAFゲージ」または「MAFテーマ・マップ」のいずれかを選択します。(図13-76を参照)。

図13-76 データバインドされたデータ視覚化コンポーネントの作成

データバインドされている新しいコンポーネント用にカテゴリ、タイプおよびレイアウトをコンポーネント・ギャラリから選択し、「OK」をクリックすると、データ視覚化コンポーネントのデータ収集属性の設定値を起動できます。ギャラリ、ダイアログおよび入力フィールドのラベルの名前は、選択したデータ視覚化コンポーネントのカテゴリおよびタイプに応じて異なります。たとえば、タイプchartDataのデータ・コントロールをアプリケーションにドラッグし、タイプとして「チャート」→「横棒」を選択すると、表示されるダイアログの名前は「横棒グラフのバインド」になり、バインドされたデータ要素(age、totalContribution、totalSavingsおよびshortDesc)を選択できるようになり、棒またはY軸に適用できます(図13-77を参照)。

図13-77 データバインドされたチャートのデータ値の指定

データ・コレクション内の属性には、データ値またはデータ値のカテゴリを指定できます。データ値は、棒の高さなどのマーカーまたは散布図のポイントで示される数字です。データ値のカテゴリは、軸ラベルとして表されるメンバーです。バインディング内で属性が担うロール(データ値またはID)は、データ型(グラフには数値データ値が必要)およびマップされる場所(棒やX軸など)の両方によって決まります。

コンポーネント・ギャラリを使用してデータバインドされているテーマ・マップ・コンポーネントを作成する場合、表示されるダイアログの名前は「'thematicMap'のバインド」になり、コンポーネント・ギャラリでは、エリア・レイヤーとして詳細な選択項目を持ったベース・マップを選択できます。たとえば、ベース・マップとして「すべてのユーザー」を選択し、エリア・レイヤーとして「世界(大陸)」を選択すると、ダイアログ(図13-78を参照)が開きます。

図13-78 「'thematicMap'のバインド」ダイアログ

1つ以上のデータ・バインディング・ダイアログの完了後に、「プロパティ」ウィンドウを使用して、コンポーネントの属性の設定を指定できます。コンポーネントと関連付けられた子要素を使用して、さらにカスタマイズすることもできます(第13.5.17項「チャートおよびゲージ・コンポーネントの子要素の定義方法」を参照)。

MAF AMXページにコレクションをドロップする際にコンテキスト・メニューから「MAF地理マップ」、「MAFサンバースト」、「MAF NBox」、「MAFタイムライン」または「MAFツリーマップ」を選択すると、次のいずれかのダイアログが表示されます。

図13-79 地理マップの作成

図13-80 サンバーストの作成

図13-81 データバインドされた時系列の作成

図13-82 データバインドされたツリーマップの作成

図13-83 データバインドされたNBoxの作成

「NBoxの作成」ダイアログへの入力は、行および列の数を定義することから始めます。その後、ボックス上のセルを選択して、ダイアログの下部で行または列全体の値を指定できます(図13-84を参照)。

図13-84 データバインドされたNBoxの行および列の値の設定

NBoxコンポーネントは、「次へ」をクリックして一連のダイアログのすべてのページを入力すると作成されます。

各ダイアログのフィールドごとの値の詳細は、「ヘルプ」をクリックするか[F1]を押して、オンライン・ヘルプを参照してください。

13.5.26.1 データバインドされたチャート・コンポーネントの一連のスタイル設定に関する必知事項

「データ・コントロール」ウィンドウからデータバインドされたチャート・コンポーネントを作成する場合、seriesStyle要素を追加することでチャートの一連のデータに対するスタイル設定情報を宣言的に指定した後に、「プロパティ」ウィンドウを使用してseriesStyle要素のseries属性用のエディタを開くことができます。また、seriesStyle要素のactionプロパティを使用すると、チャート・コンポーネントをクリック可能にできます。このエディタには、dataStampファセット内のchartDataItem要素の値に基づいたseries属性の値がすでに移入されています。

13.5.27 チャート・コンポーネントのインタラクティブ性を有効にする方法

チャートの次の子コンポーネント用イベントドリブン・トリガーを定義すると、いくつかのチャート・コンポーネントのタップを介してエンド・ユーザーによるインタラクティブ性を有効にできます。

プロパティ設定リスナーやポップアップ表示動作(完全なリストは表13-16「サポートされているイベント・リスナーおよびイベント・タイプ」を参照)など、サポートされている操作に加え、起動されるアクションのタイプを定義するようにアクション属性を設定できます。

<amx:panelPage id="pp1" styleClass="dvtm-gallery-panelPage">
...
<dvtm:lineChart id="lineChart1"
var="row"
value="#{bindings.lineData1.collectionModel}"
... >
<amx:facet name="dataStamp">
<dvtm:chartDataItem group="#{row.group}"
value="#{row.value}"
series=" #{row.series}"
label="#{pageFlowScope.labelDisplay ?
row.value : ''}" >
<amx:showPopupBehavior popupId="pAdvancedOptions"
type="action"
align="overlapTopCenter"
alignId="pflOptionsForm"
decoration="anchor"/>
</dvtm:chartDataItem>
</amx:facet>
...
</dvtm:lineChart>
...
</amx:panelPage>
<amx:popup id="pAdvancedOptions" styleClass="dvtm-gallery-options-dialog">

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.5.28 極チャートを作成する方法

次のチャート・コンポーネントについて、そのcoordinateSystem属性をpolarに設定すると、極ビューを有効にできます。

- 面グラフ

- 棒グラフ

- バブル・チャート

- コンボ・チャート

- 線グラフ

- 散布図

極設定が前述のいずれのチャート・タイプにも適用される場合(棒を除き)、polarGridShape属性を使用して極グリッドを循環またはポリゴンとして定義できます。

極チャートの放射軸は、そのY軸子コンポーネントを使用してカスタマイズできます。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.6 UIコンポーネントのスタイル設定

MAFでは、UIコンポーネントにスタイルを適用するためにCSSを使用できます。

13.6.1 コンポーネント属性を使用したスタイルの定義方法

次の属性を設定することで、UIコンポーネントをスタイル設定できます。

- styleClass属性は、レイアウト・コンポーネントに対して使用するCSSスタイル・クラスを定義します。

<amx:panelPage styleClass="#{pageFlowScope.pStyleClass}">

MAF AMXページまたはスキニングCSSファイルでレイアウト、コマンドおよび入力の各コンポーネントのスタイル・クラスを定義できますが、その場合、特定のスタイルがMAF AMXアプリケーション機能内のすべてのコンポーネントに適用されます(第13.6.3項「スキニングに関する必知事項」を参照)。かわりに、MAFによって提供されるパブリック・スタイル・クラスを使用できます。

注意:
OEPEからCSSファイルにはアクセスできません。かわりに、MAFによって、ビルドまたはデプロイ時にこのファイルがパッケージに注入され、Web Contentルート・ディレクトリの下のcssディレクトリにCSSファイルが表示されます。

- inlineStyle属性は、任意のUIコンポーネントに使用するCSSスタイルを定義し、コンポーネントのルートDOM要素に適用される一連のCSSスタイルを表します。

<amx:outputText inlineStyle="color:red;">

この属性は、基本スタイルの変更が必要な場合に使用してください。

注意:
いくつかのUIコンポーネントは、HTML div要素やさらに複雑なマークアップなどのサブ要素でレンダリングされます。その結果、親コンポーネントにinlineStyle属性を設定しても、目的の効果が得られないことがあります。そのような場合、生成されたマークアップを調べ、inlineStyle属性を定義するかわりに、サブ要素にスタイルを伝播するCSSクラスを適用します。
JavaScriptのデバッグ方法の詳細は、第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

これらの属性は、「プロパティ」ウィンドウの「プロパティ」セクションに表示されます(図13-85を参照)。Value列を使用して、スタイル・シートを定義するために各プロパティ値を指定します。

図13-85 「プロパティ」ウィンドウの「スタイル」セクション

詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

13.6.2 組込みおよびインライン・スタイル・クラスの使用方法

OEPEには、各コンポーネントの組込みスタイル・クラスを使用するためのツールが含まれています。これは、HTMLファイルまたはHTML表現(amx:tableLayoutや同様の視覚化要素)を含むXMLファイルにあるタグをクリックしたときに「プロパティ」ウィンドウから使用できます。

OEPEには、スタイル・クラスを変更するために2つのオプションが用意されています。

- 要素のインライン・スタイル・クラスを編集すると、クラスの特性(フォント、サイズ、ウェイトなど)を指定できます。

- アプリケーション用のCSSファイル内ですでに定義されている使用可能な組込みスタイル・クラスから選択できます。

要素のインライン・スタイル・クラスを編集するには、次の手順を実行します。

1. ソース・エディタで、表示されるツールチップを使用してamx:tableLayoutなどの視覚化表示要素(図13-86を参照)を定義するファイルにあるタグをクリックします。この例では、OEPEによって「プロパティ」ペインに「表のレイアウト」ページが表示されています。

図13-86 「表のレイアウト」表示設定の編集

2. 「表のレイアウト」ページで、図13-87に示すように「スタイル」タブを選択します。

図13-87 「表のレイアウト」のスタイルの設定

3. 「インライン・スタイル」入力ボックスの隣にあるアイコンをダブルクリックします。これによって、図13-88に示す「CSSスタイルの定義」ダイアログが開きます。

図13-88 「CSSスタイルの定義」ダイアログ

4. ダイアログの左には、編集可能なスタイル・プロパティのリストがあります。別のスタイル・プロパティを選択するとメイン表示が変わり、この表示には選択したスタイル・プロパティの特性が反映されています。たとえば、「テキスト」パネルでは、表のテキストのフォント、サイズ、スタイルおよびその他の特性を指定でき、「境界」スタイル・プロパティを選択すると上、左、右および下の境界の幅を個別に設定でき、さらに太さ、色やその他の特性も選択できます。

5. スタイルの特性を指定し終わったら、「OK」をクリックします。OEPEによって、AMXファイルに表の特性が追加されます。

組込みスタイル・クラスを選択するには、次の手順を実行します。

1. ソース・エディタで、表示されるツールチップを使用してcommandButtonなどの視覚化表示要素(図13-89を参照)を定義するファイルにあるタグをクリックします。

図13-89 組込みスタイル・クラスの選択

2. 「スタイル・クラス」フィールドの右側にあるアイコンをクリックして「スタイル・クラス」ダイアログを表示し、エントリを展開します(図13-90を参照)。アプリケーションの/cssディレクトリに追加のCSSファイルがあるときは、選択できます(この例では単一エントリのみが表示されています)。

図13-90 「スタイル・クラス」ダイアログ

3. 各スタイル・クラスにマウスを置くと、詳細情報がわかります。選択したら、「OK」をクリックします。

AMXタグを選択すると、その特定のタグに適した特性のリストが「プロパティ」ペインに表示されます。たとえば、amf:outputTextタグをクリックすると、「プロパティ」ペインに「出力テキスト」ダイアログが表示されます(図13-91を参照)。

図13-91 「すべて」タブが選択されている「出力テキスト」設定

図13-91に示すとおり、「すべて」タブを選択すると、編集可能なすべてのプロパティが1つのダイアログが表示されます。ここで示すとおり、「inlineStyle」値を選択して、イメージの右側にある強調表示された省略記号のアイコンをクリックすると、OEPEによってCSSスタイルの定義ダイアログ(図13-88を参照)が表示され、ここで、amf:outputTextのテキスト、背景、ブロック、ボックス、境界線、リスト、位置および拡張プロパティの適切な特性を指定できます。

13.6.3 スキニングに関する必知事項

スキニングによって、MAF AMXアプリケーション機能内のすべてのUIコンポーネントに均一なスタイルを定義および適用し、機能全体に対するテーマを作成できます。

MAFのデフォルトのスキン・ファミリはmobileAltaで、デフォルト・バージョンはそのスキンの最新バージョンです。詳細は、第8章「MAFアプリケーションのスキニング」を参照してください。

デフォルト・バージョンのmobileAlta (v1.2)は、inlineStyleを使用せずに、goLink、commandLinkおよびimageコンポーネントを垂直に揃えることができます。カスタム・スタイル・コンポーネントを使用してこれらの要素を中央に揃えた場合、mobileAlta v1.2では、アプリケーションのプライマリ、ヘッダー、セカンダリおよびフッター・ファセットのために、これらのコンポーネントの中央揃えを処理します。

13.6.4 データ視覚化コンポーネントのスタイル設定方法

MAF AMXデータ視覚化コンポーネントのスタイル・プロパティの大部分は、cssディレクトリにあるdvtm.cssファイルで定義されます。デフォルト値をオーバーライドするには、アプリケーション機能レベルでカスタム・スタイル定義を含むカスタムCSSファイルを追加します。

スタイル・プロパティのいくつかは、CSSにマップできないため、カスタムJavaScriptファイルで定義する必要があります。それらのプロパティは、次のとおりです。

- ダイヤル・ゲージ・コンポーネントの背景および針のイメージ(第13.5.15章「ダイアル・ゲージの作成方法」を参照)。

- 時系列コンポーネントの経過時間バーのカラー・パレット(第13.5.23項「時系列コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのベース・マップ(第13.5.19.5項「カスタム・ベース・マップの定義」を参照)。

- 地理マップ・コンポーネントのスタイル・プロパティ(第13.5.18項「地理マップ・コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのスタイル・プロパティ(第13.5.19.7項「テーマ・マップ・コンポーネントへのカスタム・スタイルの適用」を参照)。

- 評価ゲージ・コンポーネントのselectedおよびunselected状態(第13.5.16.1項「評価ゲージ・コンポーネントへのカスタム・スタイルの適用」を参照)。

アプリケーション機能レベルで「包含」セクションにこれらのカスタム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>

13.7 UIコンポーネントのローカライズ

「MAF AMXページ」で、OEPEが提供する標準XLIFFを使用すると、UIコンポーネントに表示されるテキストをローカライズできます。これを行うには、.amxファイルを選択し、文字列を右クリックしてコンテキスト・メニューの「ソース」→「文字列の外部化」を選択します。これで、「文字列の外部化」ダイアログが表示されます(図13-92を参照)。

注意:
プロジェクト・エクスプローラでファイルを右クリックし、「ソース」→「文字列の外部化」を選択すると、ファイルを外部化することもできます。

図13-92 「文字列の外部化」ダイアログ

外部化する値/キー・ペアを選択し、「編集」を選択して値を変更します。目的のすべてのペアを編集したら、「終了」をクリックしてXLIFFファイルを作成します。XLIFFファイルのデフォルト名が表示され、これを変更するには、「構成」をクリックします。XLIFFファイルを作成したら、図13-93のようにこのファイルを編集し、外部化された文字列の値を変更します。

図13-93 「テキスト・リソースの選択」ダイアログ

XLIFF (XML Localization Interchange File Format)ファイルが存在しない場合は、このファイルが作成されます。存在する場合は、新しいエントリが既存のXLIFFファイルに追加されます。さらに、ViewControllerBundle.xlfファイル(デフォルト名ですが、名前は基本的にプロジェクトと一致します)を指す表示コンポーネントの子として、対応するバンドルのロード(loadBundle)コンポーネントが作成されます。

注意:
ViewControllerBundle.xlfはデフォルトのファイル名です。この名前はプロジェクトの名前と一致します。

図13-94は、MAF AMXファイルでの変更を示しています。

図13-94 MAF AMXファイル内のローカライズ済文字列

13.8 MAFのアクセシビリティのサポートの理解

MAFアプリケーションを開発する際は、アクセシビリティの問題に対処することで視覚的および身体的に障害があるユーザーに対応する必要があります。非視覚的なメディアへのレンダリングを行うWebブラウザなどのユーザー・エージェント(スクリーン・リーダーなど)により、UIコンポーネントのテキスト説明が読み上げられ、障害を持つユーザーに有益な情報が提供されます。MAF AMX UIおよびデータ視覚化コンポーネントは、次のアクセシビリティ標準に準拠するように設計されています。

- Accessible Rich Internet Applications (WAI-ARIA) 1.0仕様。
詳細は、次を参照してください。

- WAI-ARIA 1.0仕様の「Introduction」(http://www.w3.org/TR/wai-aria/introduction)

- 「Using WAI-ARIA」(http://www.w3.org/TR/wai-aria/usage)

- 第13.8.2項「基本的なWAI-ARIA用語に関する必知事項」

- Oracle Global HTML Accessibility Guidelines (OGHAG)。
詳細は、第13.8.3項「Oracle Global HTML Accessibility Guidelinesに関する必知事項」を参照してください。

- iOSのアクセシビリティ・ガイドライン。
詳細は、『Accessibility Programming Guide for iOS』を参照してください。

そのようなコンポーネントの導入によって、アクセス可能なコンポーネントの外観の変更されたり、アプリケーション・ロジックが影響受けることがありません。

MAF AMXアプリケーション機能のアクセシビリティが適切に機能するために、次のガイドラインに従ってください。

- ナビゲーションの深さは3レベル以内にして、ユーザーが簡単にホーム画面に戻れるようにする必要があります。

- スクリプトを最小限に維持します。

- DOMとの直接対話を提供しないでください。

- JavaScriptのタイムアウトは使用しないでください。

- フォーカスの不要な変更は回避します。

- ポップアップ・トリガーを明示的に指定する

- 必要に応じて、WAI-ARIAライブ・リージョンを利用します(第13.8.2項「基本的なWAI-ARIA用語に関する必知事項」を参照)。

- CSSの使用を最小限に維持します。

- デフォルト・コンポーネントの外観をオーバーライドしないようにしてください。

- 拡大縮小が可能なサイズ単位を選択します。

- CSSの位置設定は使用しないでください。

詳細は、次を参照してください。

- 『Mobile Accessibility』(http://www.w3.org/WAI/mobile)

- 『Web Content Accessibility and Mobile Web: Making a Web Site Accessible Both for People with Disabilities and for Mobile Devices』(http://www.w3.org/WAI/mobile)

13.8.1 アクセシビリティのためのUIコンポーネントおよびデータ視覚化コンポーネントの構成方法

MAF AMX UIおよびデータ視覚化コンポーネントには、組込みのアクセシビリティ・サポートが備えられており、ほとんどのコンポーネントがアクセシビリティ監査の対象となっています(図13-95を参照)。

表13-10は、「プロパティ」の「アクセシビリティ」セクションで設定できるコンポーネントおよびそれらの属性を示しています。

表13-10 構成可能なアクセシビリティ属性を持つUIコンポーネント

コンポーネント

アクセシビリティ属性

アクセシビリティ監査メッセージ

ボタン(commandButton)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

選択ボタン(selectOneButton)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リンク(commandLink)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リンク(実行) (goLink)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

カルーセル(carousel)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

カルーセル・アイテム(carouselItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リスト・アイテム(listItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ポップアップ(popup)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

イメージ(image)

短い説明(shortDesc)

shortDesc属性を指定する必要があります。イメージが装飾目的で使用されている場合、それを空にすることができます。

入力テキスト(inputText)

ヒント・テキスト(hintText)

hintText属性が存在し、フィールドに何が含まれているのかを説明する必要があります。

パネル・グループ・レイアウト(panelGroupLayout)

ランドマーク(landmark)

NA脚注 1

デック(deck)

ランドマーク(landmark)

NA (脚注1を参照)

表のレイアウト(tableLayout)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

セル・フォーマット(cellFormat)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

フィルム・ストリップ(filmStrip)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

フィルム・ストリップ・アイテム(filmStripItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

面グラフ(areaChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

棒グラフ(barChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

横棒グラフ(horizontalBarChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

バブル・チャート(bubbleChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

コンボ・チャート(comboChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

線グラフ(lineChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

散布図(scatterChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

スパーク・チャート(sparkChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

円グラフ(pieChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

NBoxノード(nBoxNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照オブジェクト(referenceObject)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照面(referenceArea)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照線(referenceLine)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

チャートのデータ・アイテム。(chartDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

円グラフのデータ・アイテム。(pieDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ファンネル・データ・アイテム。(funnelDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

面(area)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

マーカー(marker)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ツリーマップ・ノード。(treemapNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

サンバースト・ノード。(sunburstNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

LEDゲージ(ledGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ステータス・メーター・ゲージ(statusMeterGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ダイヤル・ゲージ(dialGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

評価ゲージ(ratingGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

地理マップ(geographicMap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

テーマ・マップ(thematicMap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ファンネル・チャート(funnelChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

NBox (nBox)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

サンバースト(sunburst)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

時系列(timeline)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ツリーマップ(treemap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

脚注 1 ランドマーク属性にはデフォルト値(none)があり、アクセシビリティ監査の対象ではありません。

shortDesc属性は、コンポーネントごとに異なる目的で使用します。たとえば、イメージ・コンポーネントにshortDesc属性を設定すると、MAF AMXファイルでそれはimage要素のalt属性の値として表示されます。

shortDesc属性の値はローカライズできます。

パネル・グループ・レイアウト・コンポーネントおよびデック・コンポーネントの場合、ページのコンテキストに従って適用可能なランドマーク・ロール・タイプ(表13-15「ランドマーク・ロール」を参照)を定義します。landmark属性に次の値の1つを設定できます。

- デフォルト(なし)

- アプリケーション

- banner

- complementary

- contentinfo

- form

- main

- navigation

- search

表13-11は、WAI-ARIA仕様によって定義されるそのアクセシビリティ属性が実行時に自動的に適用され、変更できないUIコンポーネントを示しています。

表13-11 静的アクセシビリティ属性を持つUIコンポーネント

コンポーネント

アクセシビリティ属性

アクセシビリティ監査メッセージ

入力日(inputDate)

ラベル(label)

inputDateはラベルが付きません。inputDateのラベル属性は指定する必要があります。

入力数値スライダ(inputNumberSlider)

ラベル(label)

inputNumberSliderはラベルが付きません。inputNumberSliderのラベル属性は指定する必要があります。

パネル・ラベルおよびメッセージ(panelLabelAndMessage)

ラベル(label)

panelLabelAndMessageはラベルが付きません。panelLabelAndMessageのラベル属性は指定する必要があります。

アイテムの選択(selectItem)

ラベル(label)

selectItemはラベルが付きません。selectItemのラベル属性は指定する必要があります。

チェックボックス(selectBooleanCheckbox)

ラベル(label)

selectBooleanCheckboxはラベルが付きません。selectBooleanCheckboxのラベル属性は指定する必要があります。

ブール・スイッチ(selectBooleanSwitch)

ラベル(label)

selectBooleanSwitchはラベルが付きません。selectBooleanSwitchのラベル属性は指定する必要があります。

ラジオ・ボタン(selectOneRadio)

ラベル(label)

selectOneRadioはラベルが付きません。selectOneRadioのラベル属性は指定する必要があります。

チェックボックスを複数選択(selectManyCheckbox)

ラベル(label)

selectManyCheckboxはラベルが付きません。selectManyCheckboxのラベル属性は指定する必要があります。

選択肢を複数選択(selectManyChoice)

ラベル(label)

selectManyChoiceはラベルが付きません。selectManyChoiceのラベル属性は指定する必要があります。

選択肢(selectOneChoice)

ラベル(label)

selectOneChoiceはラベルが付きません。selectOneChoiceのラベル属性は指定する必要があります。

出力テキスト(outputText)

値(value)

NA脚注 1

脚注 1 値属性はアクセシビリティ監査の対象外です。

図13-95は、OEPEに表示されるアクセシビリティ監査警告を示しています。

図13-95 アクセシビリティ監査警告

アクセス可能なMAF AMXアプリケーション機能をテストする方法の詳細は、第30.2.1項「iOSデバイス上でアクセシビリティのテストを実行する方法」を参照してください。

注意:
Androidでは、WAI-ARIAアクセシビリティ機能はデータ視覚化コンポーネントに対してサポートされません。
その他のMAF AMX UIコンポーネントは、アプリケーションがAndroidスクリーン・リーダー・モードで実行された場合、正しく動作しない可能性があります。

13.8.2 基本的なWAI-ARIA用語に関する必知事項

WAI-ARIA 1.0仕様に述べられているように、複雑なWebアプリケーションは、支援テクノロジがドキュメントの部分の背後にあるセマンティクスを判別できない場合や、ユーザーが、使用可能な方法で実際にそのすべての部分を移動できない場合に、アクセス不可能になります。WAI-ARIAでは、セマンティクスがロール(ユーザー・インタフェース要素を定義するタイプ)と、ロールによってサポートされている状態およびプロパティに分割されています。次のセマンティクス・アソシエーションによって、WAI-ARIA用語の基礎が形成されています。

- ロール

- ランドマーク

- ライブ・リージョン

詳細は、『Important Terms』(http://www.w3.org/TR/wai-aria/terms)を参照してください。

次の表は、MAFに適用可能なロールのカテゴリ(WAI-ARIA 1.0仕様での定義)を示しています。

表13-12は、全般的なロール概念を定義する目的でWAI-ARIAのロールの分類をサポートするために使用される抽象ロールを示しています。

表13-12 抽象ロール

抽象ロール

説明

input

ユーザー入力を可能にする一般的なタイプのウィジェット。

landmark

ナビゲーショナル・ランドマークを意図したページのリージョン。

select

ユーザーが一連の選択肢から選択を行えるフォーム・ウィジェット。

widget

グラフィカル・ユーザー・インタフェースのインタラクティブ・コンポーネント。

表13-13は、スタンドアロン・ユーザー・インタフェース・ウィジェットまたは大きい複合ウィジェットの一部として機能するウィジェット・ロールを示しています。

表13-13 ウィジェット・ロール

ウィジェット・ロール

説明

ウィジェットで必要とされる状態

alertdialog

アラート・メッセージを含むダイアログのタイプ。最初のフォーカスはそのダイアログ内の要素に移動します。

aria-labelledby、aria-describedby

button

クリックまたは押されたときにユーザーによってトリガーされるアクションを可能にする入力。

aria-expanded (ステート)、aria-pressed (ステート)

checkbox

true、falseまたはmixedの3つの使用可能な値を持つチェック可能な入力。

aria-checked (ステート)

dialog

応答を要求するためにアプリケーションの現在の処理を中断するように設計されているアプリケーション・ウィンドウによって表されるダイアログ。

aria-labelledby、aria-describedby

link

内部または外部リソースへのインタラクティブな参照。アクティブ化されるとユーザー・エージェントがそのリソースにナビゲートします。

aria-disabled (ステート)、aria-describedby

option

選択リスト内の選択可能アイテム。

aria-labelledby、aria-checked (ステート)、aria-selected (ステート)

radio

ラジオ・ロールのグループ内のチェック可能入力。同時にチェックできるのはそれらのうち1つのみです。

aria-checked (ステート)、aria-disabled (ステート)

slider

指定された範囲内からユーザーが値を選択するユーザー入力。

aria-valuemax、aria-valuemin、aria-valuenow、aria-disabled (ステート)

listbox

選択肢のリストからユーザーが1つ以上のアイテムを選択できるウィジェット。

aria-live

radiogroup

ラジオ・ボタンのグループ。

aria-disabled (ステート)

listitem

リストまたはディレクトリ内の単一アイテム。

aria-describedby

textbox

その値として自由形式のテキストを使用できる入力。

aria-labelledby、aria-readonly、aria-required、aria-multiline、aria-disabled (ステート)

表13-14は、ページ内のコンテンツを編成する構造を記述するドキュメント構造ロールを示しています。通常、ドキュメント構造はインタラクティブではありません。

表13-14 ドキュメント構造ロール

ドキュメント構造ロール

説明

img

イメージを形成する要素のコレクションのコンテナ。

list

非インタラクティブ・リスト・アイテムのグループ。

listitem

リストまたはディレクトリ内の単一アイテム。

表13-15は、ナビゲーショナル・ランドマークを意図したページのリージョンを表すランドマーク・ロールを示しています。

表13-15 ランドマーク・ロール

ランドマーク・ロール

説明

アプリケーション

Webアプリケーション(Webドキュメントではなく)として宣言されるリージョン.

banner

ほとんどサイト指向のコンテンツ(ページ固有のコンテンツではなく)を含むリージョン。

complementary

DOM階層の類似したレベルにあるメイン・コンテンツを補足するように設計ているが、メイン・コンテンツから切り離しても意味を持つドキュメントのサポート・セクション。

contentinfo

親ドキュメントに関する情報が含まれている大きな認識可能なリージョン。

form

全体として結合されてフォームを作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

main

ドキュメントのメイン・コンテンツ。

navigation

ドキュメントまたは関連ドキュメントをナビゲートするためのナビゲーショナル要素(通常はリンク)のコレクション。

search

全体として結合されて検索機能を作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

MAF UIコンポーネントの大部分では、アクセス可能なWAI-ARIA属性は変更できません。一部のコンポーネントでは、デザインタイムで特別なアクセス可能な属性を設定でき、パネル・グループ・レイアウトおよびデックには、WAI-ARIAランドマーク・ロール・タイプを使用できます。詳細は、第13.8.1項「アクセシビリティのためのUIコンポーネントおよびデータ視覚化コンポーネントの構成方法」を参照してください。

13.8.3 Oracle Global HTML Accessibility Guidelinesに関する必知事項

Oracle Global HTML Accessibility Guidelines (OGHAG)は、オラクル社が準拠しているHTMLの一連のスクリプト標準です。これらの標準は、Section 508 (http://www.section508.govを参照)とWeb Content Accessibility Guidelines (WCAG) 1.0 level AA (http://www.w3.org/TR/WCAG10を参照)を組み合せ、言い回しとチェックポイントの測定を改善したものです。

詳細は、http://www.oracle.com/us/corporate/accessibility/policies/index.htmlのOracleのアクセシビリティについての考え方とポリシーを参照してください。

13.9 入力の検証

MAFでは、データ入力エラーおよびデータ入力中に発生するその他の状態に関してエンド・ユーザーに通知できます。それらのタイプ(エラーまたは警告)に応じて、検証メッセージのルック・アンド・フィールが異なります。

ユーザー入力の検証は、入力が送信されたときにトリガーされます。入力テキスト・コンポーネントは、エンド・ユーザーがフィールドから離れたときに自動的に検証されます。チェックボックスや選択肢などの選択コンポーネントの場合は、エンド・ユーザー選択を行ったときに検証が行われます。検証のために、MAF AMXページのUIコンポーネントは、検証グループ操作(validationGroup)内にまとめられ、送信操作が実行されたときに入力が検証されるコンポーネントが定義されます。検証動作(validationBehavior)コンポーネントは、コマンド・コンポーネントのアクションが実行される前にどの検証グループが検証されるのかを定義します。1つのコマンド・コンポーネントが、複数の子検証動作コンポーネントを持つことができます。コンポーネントに検証動作が定義されていない場合、検証は行われません。

注意:
ネストされた検証グループ操作を定義することはできません。
検証グループの無効な定義は次のとおりです。

<amx:view>
<amx:panelPage>
<amx:validationGroup>
<amx:panelGroupLayout>
<amx:validationGroup/>
<amx:panelGroupLayout/>
</amx:validationGroup>
</amx:panelPage>
</amx:view>

有効な定義は次のとおりです。

<amx:view>
<amx:panelPage>
<amx:validationGroup>
</amx:panelPage>
<amx:popup>
<amx:validationGroup>
</amx:popup>
</amx:view>

MAF AMXページに検証エラー・メッセージが含まれている場合は、リスト・アイテム、リンク、ボタンなどのコマンド・コンポーネントを使用して、エンド・ユーザーがそのページに移動しないようにできます。警告を含むメッセージでは、ナビゲーションが停止されることはありません。

次の例は、MAF AMXファイルでの複数の検証グループ操作および検証動作操作など検証要素の定義方法を示しています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="outputText1" value="Validate"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="commandButton2" action="go" text="Save">
<amx:validationBehavior id="vb1"
disabled="#{pageFlowScope.myPanel ne 'panel1'}"
group="group1"/>
<amx:validationBehavior id="vb2"
disabled="#{pageFlowScope.myPanel ne 'panel2'}"
group="group2"/>
<!-- invalid, should be caught by audit rule but for any reason
if group not found at run time, this validate is ignored -->
<amx:validationBehavior id="vb3" disabled="false" group="groupxxx"/>
<!-- group is not found at run time, this validate is ignored -->
<amx:validationBehavior id="vb4" disabled="false" group="group3"/>
</amx:commandButton>
</amx:facet>
<amx:panelSplitter id="ps1" selectedItem="#{pageFlowScope.myPanel}">
<amx:panelItem id="pi1">
<amx:validationGroup id="group1">
<amx:panelFormLayout id="pfl1">
<amx:inputText value="#{bindings.first.inputValue}"
required="true"
label="#{bindings.first.hints.label}"
id="inputText1"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText2"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panelItem>
<amx:panelItem id="pi2">
<amx:validationGroup id="group2">
<amx:panelFormLayout id="pfl2">
<amx:inputText value="#{bindings.salary.inputValue}"
label="#{bindings.first.hints.label}"
id="inputText3"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText4"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panelItem>
</amx:panelSplitter>
<amx:panelGroupLayout id="pgl1" rendered="false">
<amx:validationGroup id="group3">
<amx:panelFormLayout id="pfl4">
<amx:inputText value="#{bindings.salary.inputValue}"
label="#{bindings.first.hints.label}"
id="inputText5"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText6"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panelGroupLayout>
</amx:panelPage>

次の例は、MAF AMXファイルのポップアップに表示される検証メッセージの定義方法を示しています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="outputText1" value="Login Demo"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="btnBack" action="__back" text="Back"/>
</amx:facet>
<amx:panelGroupLayout id="panelGroupLayout1">
<amx:validationGroup id="group1">
<amx:panelGroupLayout id="panelGroupLayout2">
<amx:inputText value="#{bindings.userName.inputValue}"
label="#{bindings.userName.hints.label}"
id="inputText1"
showRequired="true"
required="true"/>
<amx:inputText value="#{bindings.password.inputValue}"
label="#{bindings.password.hints.label}"
id="inputText2"
required="true"
showRequired="true"
secret="true"/>
<amx:outputText id="outputText2"
value="#{bindings.timeToStayLoggedIn.hints.label}:
#{bindings.timeToStayLoggedIn.inputValue} minutes"/>
</amx:panelGroupLayout>
</amx:validationGroup>
<amx:commandButton id="commandButton2"
text="Login"
action="navigationSuccess">
<amx:validationBehavior id="validationBehavior2" group="group1"/>
</amx:commandButton>
</amx:panelGroupLayout>
</amx:panelPage>

検証メッセージはポップアップ・コンポーネントに表示されます(第13.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。検証ポップアップのタイトルを構成することはできません。それは、相対的なメッセージ重大度によって自動的に決定されます。現在のメッセージのうちの最も重大なものが検証ポップアップのタイトルになります。つまり、すべての検証メッセージがWARNINGタイプである場合は、そのタイトルは「警告」になります。メッセージのいくつかがWARNINGタイプで、その他はERRORタイプの場合はタイトルは「エラー」に設定されます。

図13-96は、実行時に生成されるポップアップ検証メッセージを示しています。

図13-96 iPhoneでの検証メッセージ

13.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

リスナーの値は、パターン#{*}に一致している必要があり、次の要件を満たしている必要があります。

- タイプ名: EL式

- ベース・タイプ: 文字列

- プリミティブ・タイプ: 文字列

ELイベントの詳細は、第14.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タグ・リファレンス

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からリスナーをコールする方法を示しています。

13.10.1 イベント・リスナーの制約付きタイプ属性に関する必知事項

イベント・リスナーは、一部のMAF AMX UIコンポーネントの子として定義できます。リスナーのtype属性によって、それらがどのイベントを処理するために登録されるのかが識別されます。各親UIコンポーネントでは(親コンポーネントに適した)イベントのサブセットのみがサポートされているため、これらのサポートされているイベントは、リスナーに対して選択できる限られたタイプのリストに提示されます。

表13-16は、親UIコンポーネント、それが子として持つことができるイベント・リスナー、およびそれらがサポートしているイベント・タイプを示しています。

表13-16 サポートされているイベント・リスナーとイベント・タイプ

UIコンポーネント(親)

アクション・リスナー(子)

プロパティ・リスナーの設定(子)

ポップアップ表示動作(子)

ポップアップを閉じる動作(子)

actionListener (属性)

valueChangeListener (属性)

moveListener (属性)

selectionListener (属性)

mapBoundsChangeListener (属性)

mapInputListener (属性)

viewportChangeListener (属性)

rangeChangeListener (属性)

ボタン

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

リンク

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

リスト・アイテム

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

入力日

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

入力数値スライダ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

入力テキスト

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

リスト・ビュー

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象

チェックボックス

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

スイッチ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

チェックボックス(複数選択)

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

選択肢(複数選択)

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

選択肢

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

選択ボタン

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

ラジオ・ボタン

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

リンク(実行)

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

カルーセル

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

カルーセル・アイテム

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

イメージ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

面グラフ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象

サポート対象外

棒グラフ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象

サポート対象外

バブル・チャート

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

コンボ・チャート

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象

サポート対象外

横棒グラフ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象

サポート対象外

LEDゲージ

サポート対象外

サポート対象外

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

ダイヤル・ゲージ

サポート対象外

サポート対象外

サポート対象

サポート対象

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

評価ゲージ

サポート対象外

サポート対象外

サポート対象

サポート対象

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

線グラフ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象

サポート対象外

円グラフ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

散布図

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

スパーク・チャート

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

ステータス・メーター・ゲージ

サポート対象外

サポート対象外

サポート対象

サポート対象

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

地理マップ

サポート対象外

サポート済脚注 1

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート済脚注 2

サポート対象

サポート対象

サポート対象外

サポート対象外

テーマ・マップ

サポート対象外

サポート済脚注 3

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート済脚注 4

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サンバースト

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

ツリーマップ

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

時系列

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

NBox

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象外

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

脚注 1 プロパティ・リスナーの設定は、地理マップの領域のマーカーの子として指定できます。

脚注 2 selectionListener属性は、地理マップの面データ・レイヤーまたは点データ・レイヤーに設定できます。

脚注 3 プロパティ・リスナーの設定は、テーマ・マップの領域のマーカーの子として指定できます。

脚注 4 selectionListener属性は、テーマ・マップの面データ・レイヤーまたは点データ・レイヤーに設定できます。

子イベント・リスナーのそれぞれのtype属性には、リスナー・イベントと一致する値の基本セットがあります。これらの値は表13-16に示す情報に基づいてフィルタ処理され、それによって、子イベント・リスナーが、識別された親UIコンポーネントのコンテキスト内にある場合に、その親によってサポートされているイベントのみが表示されるようになります。たとえば、ボタン・コンポーネントの下にあるアクション・リスナーまたはプロパティ・リスナーの設定の子では、actionタイプの値およびジェスチャーのみか表示されます。

脚注の凡例

脚注 1: 詳細は、第13.3.26.1項「disabled属性に関する必知事項」を参照してください。

14 MAF AMXでのバインディングの使用とデータ・コントロールの作成

この章では、モバイル・アプリケーション・フレームワーク(MAF)でデータ・バインディング、データ・コントロールおよびデータ・バインディング式言語(EL)を使用する方法について説明します。また、オブジェクト・スコープ・ライフサイクル、マネージドBean、UIヒント、検証およびデータ変更イベントについても説明します。

この章には次の項が含まれます:

- 第14.1項「バインディングおよびデータ・コントロールの概要」

- 第14.2項「オブジェクト・スコープ・ライフサイクルについて」

- 第14.3項「EL式の作成」

- 第14.4項「マネージドBeanの作成と使用」

- 第14.5項「データ・コントロールを使用したビジネス・サービスの公開」

- 第14.6項「データ・コントロール・パレットでのデータバインドUIコンポーネントの作成」

- 第14.7項「実行時に行われる処理: バインディング・コンテキストの動作方法」

- 第14.8項「データ・コントロール属性の使用」

- 第14.9項「Beanデータ・コントロールの作成および使用」

- 第14.10項「DeviceFeaturesデータ・コントロールの使用方法」

- 第14.11項「属性の検証」

- 第14.12項「データ変更イベントについて」

14.1 バインディングおよびデータ・コントロールの概要

モバイル・アプリケーション・フレームワークによって、ユーザー・インタフェース(UI)・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロールと宣言的バインディング)が実装されています。データ・コントロールでは、関連するプロパティ、メソッド、タイプの情報を含め、サービスの操作とデータ・コレクションを表す標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化します。OEPEを使用すると、ページにドラッグ・アンド・ドロップできるアイコンとしてその情報を表示できます。宣言的なバインディングによって、データ・コントロール内のデータ・コレクションからのデータ・アクセスとその操作の実行の詳細が抽象化されます。実行時に、モデル・レイヤーによって、適切なXMLファイルからデータ・コントロールおよびバインディングを記述した情報が読み取られ、ユーザー・インタフェースとビジネス・サービスの双方向の結合が実装されます。

ページのユーザー・インタフェース・コンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。モデル・レイヤーでは実行時にこのファイルが使用され、ページのバインディングがインスタンス化されます。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持され、EL式#{bindings}を使用して各ページ・リクエスト中にアクセスできます。この式により、現在のページのバインディング・コンテナが常に評価されます。パレットから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインド・ユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要なコードおよびオブジェクトがOEPEによって自動的に作成されます。

モバイル・アプリケーション・フレームワークには、即時利用可能な2つのデータ・コントロール(DeviceFeaturesデータ・コントロールとApplicationFeaturesデータ・コントロール)が付属しています。OEPEのパレット内に表示されるDeviceFeaturesデータ・コントロールを使用すると、データ・コントロールの主なデータ属性を(テキスト)フィールドとして、またデータ・コントロールの操作をコマンド・オブジェクト(ボタン)として、アプリケーションにドラッグ・アンド・ドロップできます。これらのドラッグ・アンド・ドロップ・アクションによって、アプリケーション内のELバインディングおよび作成されるコントロールに適したプロパティが生成されます。バインディングは、データ・コントロール・ソースを指すために、ページ定義ファイルによって表され、ページ・バインディングによって、特定のページの参照がデータ・コントロールにリンクされます。

データ・コントロールとバインディングの詳細は、次を参照してください。

- 第14.5項「データ・コントロールを使用したビジネス・サービスの公開」

- 第14.6項「データ・コントロール・パレットでのデータバインドUIコンポーネントの作成」

- 第14.7項「実行時に行われる処理: バインディング・コンテキストの動作方法」

- 第14.9項「Beanデータ・コントロールの作成および使用」

- 第14.9項「Beanデータ・コントロールの作成および使用」

- 第14.10項「DeviceFeaturesデータ・コントロールの使用方法」

14.2 オブジェクト・スコープ・ライフサイクルについて

実行時、ページがデータにアクセスできるオブジェクト・スコープに必要なデータを格納することで、データをページに渡します。スコープによってオブジェクトの存続期間が決まります。オブジェクトをスコープに置くと、EL式を使用してスコープからアクセスできます。たとえば、fooという名前のマネージドBeanを作成し、Beanをビュー・スコープに存続させるよう定義するとします。このBeanにアクセスするには、#{viewScope.foo}という式を使用します。

モバイル・アプリケーション・フレームワーク変数とマネージドBean参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。MAFは、可視性の減る順序で一覧表示されている次のスコープをサポートしています。

- アプリケーション・スコープ: オブジェクトは、アプリケーションが存続するかぎり(複数の機能にまたがって)使用可能です。

- ページ・フロー・スコープ: オブジェクトは、機能が存続するかぎり(その機能内でのみ)使用可能です。

- ビュー・スコープ: オブジェクトは、ビューが存続するかぎり(機能の単一ページ内で)使用可能です。

オブジェクト・スコープは、プログラミング言語のグローバル変数およびローカル変数のスコープに相当します。スコープが広いほど、オブジェクトの可用性が高くなります。存続期間の間、これらのオブジェクトで特定のインタフェースの公開、情報の保持および他のオブジェクトへの変数とパラメータの受渡しを行うことができます。たとえば、アプリケーション・スコープに定義されているマネージドBeanは、アプリケーションの存続期間中、複数のページ・リクエスト間で使用できます。ただし、ビュー・スコープに定義されているマネージドBeanは、機能内の1つのページ・リクエストの存続期間中にのみ使用できます。

アプリケーション・スコープの名前空間で定義されたEL式は、アプリケーションが存続するかぎり、複数の機能にまたがって使用できます。アプリケーションの一方のビューでアプリケーション・スコープを定義し、そのスコープをもう一方のビューで参照できます。ページ・フロー・スコープの名前空間で定義されたEL式は、機能が存続するかぎり、単一の機能の境界内で使用できます。ビュー・スコープの名前空間で定義されたEL式は、ビューが存続するかぎり、機能の単一ページの境界内で使用できます。スコープを含むこのような変数に加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。詳細は、第14.3.5.2項「マネージドBeanのカテゴリについて」および第14.3.5.3項「モバイル・アプリケーション・フレームワークのオブジェクト・カテゴリについて」を参照してください。

マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。アプリケーション・スコープは、ユーザー情報やコンテキスト情報など、アプリケーション全体に関係する情報にのみ使用します。ページ間での値の受渡しにアプリケーション・スコープを使用しないでください。

注意:
メモリー・スコープに入れる各オブジェクトはJSON DataChangeEventに対してシリアライズされ、このオブジェクト内のゲッター・メソッドによって戻されるオブジェクトもシリアライズされます。これは、ネストが深いシリアライズされたオブジェクト・ツリーにつながることがあり、パフォーマンスが低下します。一連のネストされたオブジェクトのシリアライズを避けるには、それらを一時オブジェクトとして定義する必要があります。詳細は、第14.9.1項「Beanクラス変数のシリアライズに関する必知事項」を参照してください。

14.2.1 オブジェクト・スコープとタスク・フローに関する必知事項

タスク・フロー内の変数に使用するスコープを決めるときは、ビューまたはページ・フロー・スコープのみを使用する必要があります。アプリケーション・スコープは、タスク・フローの存続期間を超えてオブジェクトをメモリーに保存するため、タスク・フローのカプセル化および再利用で障害が発生します。さらに、アプリケーション・スコープでは、オブジェクトがメモリーに必要以上に長い時間保持されることがあるため、不要なオーバーヘッドが発生します。

タスク・フロー内のアクティビティ間でデータ値を渡す必要がある場合は、ページ・フロー・スコープを使用する必要があります。現在のビュー・アクティビティ内でのみ必要とされ、ビュー・アクティビティ間にまたがっていない変数の場合、ビュー・スコープを使用する必要があります。

14.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の作成および使用の詳細は、第14.4項「マネージドBeanの作成および使用」を参照してください。EL式の詳細は、http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

注意:
EL式を編集可能コンポーネントのvalue属性に使用している場合は、そのコンポーネントに対応するsetメソッドが必要です。そうでないと、EL式は読取り専用と評価され、値の更新は許可されません。
たとえば、ページにinputTextコンポーネント(IDはit1)があり、その値が#{myBean.inputValue}に設定されているとします。inputText値を更新するには、myBeanマネージドBeanに次のようなgetおよびsetメソッドが必要です。

public void setIt1(RichInputText it1) {
this.it1 = it1;
}

public RichInputText getIt1() {
return it1;
}

14.3.1 データ・バインディングEL式について

パレットを使用してコンポーネントを作成すると、MAFデータ・バインディング式が作成されます。この式は、バインディング・オブジェクトのデータを表示するか、バインディング・オブジェクトのプロパティを参照する、すべてのコンポーネント属性に追加されます。事前作成済のそれぞれの式は、ページ定義ファイルで定義された、適切なバインディング・オブジェクトを参照します。これらのバインディング式は編集可能ですが、MAFバインディング式の構文に従っていれば、独自に作成することもできます。MAFデータ・バインディング式は、属性がELをサポートしている場合、バインディング・オブジェクトからのデータを移入する任意のコンポーネント属性に追加できます。

一般的なMAFデータ・バインディングEL式は、次の構文を使用して、バインディング・コンテナ内のタイプの異なるバインディング・オブジェクトを参照します。

#{bindings.BindingObject.propertyName}

ここで、

- bindingsは、式によって参照されているバインディング・オブジェクトが現在のページのバインディング・コンテナにあることを識別する変数です。すべてのMAFデータ・バインディングEL式は、bindings変数で始まる必要があります。

- BindingObjectは、ページ定義ファイルで定義される、バインディング・オブジェクトのID、または属性については名前です。バインディングobjectIDまたは名前は、そのページ定義ファイル内で一意なものです。EL式は、パラメータ・バインディング、実行可能バインディングまたは値バインディングなど、ページ定義ファイル内のどのバインディング・オブジェクトでも参照できます。

- propertyNameは、各データバインドUIコンポーネントのデフォルトの表示方法を決定し、実行時のバインディング・オブジェクトのプロパティを設定する変数です。各タイプのバインディング・オブジェクトに対して、異なるバインディング・プロパティがあります。バインディング・プロパティの詳細は、第14.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

たとえば、次の式を例にしてみます。

#{bindings.ProductName.inputValue}

bindings変数は、現在のページのバインディング・コンテナでバインドされた値を参照します。参照されているバインディング・オブジェクトはProductNameであり、これは属性バインディング・オブジェクトです。バインディング・プロパティはinputValueで、最初のProductName属性の値を戻します。

ヒント:
ページ定義ファイルのバインディング式ではドル記号($)またはハッシュ記号(#)の接頭辞を使用できますが、MAFページのEL式で使用できるのは、ハッシュ記号(#)の接頭辞のみです。

前述のように、パレットを使用してUIコンポーネントを作成する場合、これらの式が組み込まれます。ただし、必要に応じて手動で式を作成することもできます。OEPEの式ビルダーは、UIコンポーネントがバインドされるその他の有効なオブジェクトに加え、ページ定義ファイルに定義されたバインディング・オブジェクトのリストを提供することにより、EL式の構築を支援するダイアログです。また、MAFバインディング・オブジェクトの階層リストやMAFバインディング・オブジェクトの最も一般的に使用されるプロパティが提供されるため、MAFデータバインド式の作成や編集に特に便利です。バインディング・プロパティの詳細は、第14.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

14.3.2 EL式の作成方法

OEPEの式ビルダーを使用すると、EL式を宣言的に作成できます。エディタ、ダイアログまたはページ・エディタ・プロパティにが表示される式ビルダーにアクセスできます。

始める前に

EL式に関する知識が役立つ場合があります。詳細は、第14.3項「EL式の作成」を参照してください。

式ビルダーの使用手順:

1. MAF機能エディタで、変更する機能を展開し、「制約」を右クリックします。「新」→「制約式」を選択します。

2. 「制約式」の下で、をクリックして「式ビルダー」ダイアログを開きます。

3. 次の機能を使用して式を作成します。

- 「変数」フィルタを使用して、式に含める項目を選択します。これらの項目は、階層形式のバインディング・オブジェクトであるツリーに表示されます。ツリーの各アイコンは、式で使用できる各種タイプのバインディング・オブジェクトを表します。
ツリーを絞り込むには、「変数」に検索条件を入力します。MAFで公開されているELでアクセス可能なオブジェクトは、MAFオブジェクト・ノードの下、「マネージドBean」ノードにあります。

ヒント:
これらのオブジェクトの詳細は、MAF Javadocを参照してください。第14.3.5項「式ビルダーのカテゴリについて」も参照してください。

ツリーの項目をダブルクリックすると、項目はEL式内の「式」ボックスに移動します。「式」ボックスに式を直接入力することもできます。

- 演算子ボタンを使用して、式に論理演算子または算術演算子を追加します。

- ツリーのフォルダおよび変数に関する詳細を表示するには、その上にマウスを置きます。

図14-1は、「マネージドBean」カテゴリからEL式を作成する方法の例を示しています。ただし、EL式は、第14.3.5項「式ビルダーのカテゴリについて」で説明されているどのカテゴリからも作成できます。

図14-1 「式ビルダー」ダイアログ

ヒント:
EL式を作成する正しい構文の使用の詳細は、http://download.oracle.com/javaee/index.html">>http://download.oracle.com/javaee/index.htmlのJava EEチュートリアルを参照してください。

14.3.2.1 メソッド式ビルダーについて

表14-1は、「プロパティ」ウィンドウで「式ビルダー」オプションではなく「メソッド式ビルダー」オプションが提供されるプロパティを示しています。これらの唯一の違いは、メソッド式ビルダーが、選択されたプロパティに応じてマネージドBeanをフィルタして除外することです。

表14-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

14.3.2.2 非ELプロパティについて

表14-2は、ELに対応していないため「プロパティ」ウィンドウで使用可能なEL「式ビルダー」オプションを持たないプロパティを示しています。

表14-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

14.3.3 MAFバインディング・プロパティに関する必知事項

式ビルダーを使用してデータバインド・コンポーネントを作成すると、EL式によって、特定のMAFバインディング・プロパティが参照される場合があります。実行時には、これらのバインディング・プロパティによって、データバインドUIコンポーネントのデフォルトの表示方法や、イテレータ・バインディング固有のパラメータなどが定義されます。ADFバインディング・プロパティは、Oracle APIによって定義されます。各バインディング・タイプで使用可能なプロパティの完全なリストは、表14-3 MAFバインディングのランタイムELプロパティを参照してください。

特定のプロパティに割り当てられる値は、ページ定義ファイルで定義されます。たとえば、イテレータ・バインディングには、イテレータが一度に表示する行数を指定する、RangeSizeというプロパティがあります。次のように、RangeSizeに割り当てられる値は、ページ定義ファイルで指定されます。

<iterator Binds="ItemsForOrder" RangeSize="25"
DataControl="BackOfficeAppModuleDataControl"
id="ItemsForOrderIterator" ChangeEventPolicy="ppr"/>

14.3.4 バインディング・コンテナを参照する方法

ルートEL式#{bindings}によってアクティブな画面のバインディング・コンテナを参照でき、式#{data.PageDefName}を使用して別の画面のバインディング・コンテナを参照できます。モバイル・アプリケーション・フレームワークAMXバインディング・オブジェクトは、バインディング・コンテナ#{bindings.Name}からの名前によって参照されます。

表14-3は、実行時にモバイル・アプリケーション・フレームワークAMXバインディング・オブジェクトの値にアクセスするためにEL式で使用できるプロパティの一部を示しています。プロパティは、アルファベット順に並んでいます。

表14-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変数を先頭の語句として追加します。

14.3.5 式ビルダーのカテゴリについて

MAF AMXページ用の式ビルダーでは、次のカテゴリが使用できます。

- バインディング・カテゴリについて

- マネージドBeanカテゴリについて

- モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて

14.3.5.1 バインディング・カテゴリについて

この項では、バインディング・カテゴリで使用できるオプションを示します。bindingsノードとdataノードは、サポートされているバインディングとプロパティの同じセットを表示します。表14-4に、使用できるバインディング・タイプと、各バインディング・タイプでサポートされるプロパティをリストします。securityContextノードは、次のプロパティをサポートしています。

- authenticated

- userGrantedPrivilege

- userInRole

- userName

次に例を示します。

#{securityContext.authenticated}
#{securityContext.userGrantedPrivilege['submit_privilege']}
#{securityContext.userInRole['manager_role']}
#{securityContext.userName}

表14-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

14.3.5.2 マネージドBeanカテゴリについて

この項では、「マネージドBean」カテゴリの下で使用できるオプションを示します。

- applicationScope: 「マネージドBean」のapplicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーションスコープのマネージドBeanなど)。

- pageFlowScope: 「マネージドBean」のpageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロースコープのマネージドBeanなど)。

- viewScope: 「マネージドBean」のviewScopeノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュースコープのマネージドBeanなど)。

MAFランタイムでは、自身をマネージドBeanプロパティの変更通知のリスナーとして登録することによって、Beanプロパティを参照するUIコンポーネントにバインドされたEL式が、プロパティの値変更時に自動的に更新されるようにします。これらの通知をソースとして参照するには、Beanのプロパティ・アクセッサにコードを追加する必要があります。Beanのプロパティ・アクセッサから、通知をソースとして参照するために必要なコードを自動的に生成するには、「取得メソッドと設定メソッドの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します(図14-2を参照)。

図14-2 プロパティの変更時にリスナーに通知

ELを通じて単にBeanメソッドまたはプロパティを参照する場合、このコードを追加する必要はありませんが、Beanに格納された値が変化する場合や、特にその変更が、1つ以上のプロパティ値を変更するBeanメソッドの実行による二次的な影響など、間接的なものである場合、それらの値に依存するEL式のアクティブ・フォームへのレンダリングを最新の状態に保つ必要があります。プロパティの変更とPropertyChangeSupportクラスの詳細は、第14.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要素には当てはまりません。

14.3.5.3 モバイル・アプリケーション・フレームワーク・オブジェクトのカテゴリについて

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリには、オブジェクト・スコープなどのELを使用して参照できるモバイル・アプリケーション・フレームワーク・オブジェクトに定義されている様々なオブジェクトが一覧表示されます。

MAF変数とマネージドBean参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。これらのスコープには、可視性が高い順に、アプリケーション・スコープ、ページ・フロー・スコープおよびビュー・スコープがあります。様々なオブジェクト・スコープの詳細は、第14.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"/>

14.3.6 ELイベントについて

ELイベントは、共通語句を含む式が相互に同期して更新できるようにするため、MAF AMX UIの動作において重要な役割を果たします。

EL式は、様々なコンテキストで値を参照できます。次の例は、2つの入力数値スライダ・コンポーネントの作成を示しており、各コンポーネントはapplicationScopeの値に関連付けられています。出力テキストでは、ELを使用して単純な追加式を計算結果とともに表示します。フレームワークでは、出力テキスト・ラベル内のEL式を解析するときに、その式に2つの値への参照が含まれていることを確認し、それら2つの値に基づく出力テキストのイベント・リスナー(第13.10項「イベント・リスナーの使用方法」を参照)を作成します。基礎となる式の値が変化すると、イベントがその値のすべてのリスナーに対して生成されます。

注意:
(スコープ・オブジェクトではなく)マネージドBeanのプロパティを参照している場合、リスナーを追加する必要があります。詳細は、第14.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}を更新すると、もう一方が出力テキストとともに自動的に更新されます。

14.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);
}

14.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}という式になります。

14.4.1 OEPEでのマネージドBeanの作成方法

エディタを使用して、マネージドBeanを作成し、同時にそれをMAFアプリケーションに登録できます。

始める前に

マネージドBeanに関する知識が役立つ場合があります。詳細は、第14.4項「マネージドBeanの作成と使用」を参照してください。

マネージドBeanの作成および登録手順:

1. プロジェクト・エクスプローラで、ビュー・プロジェクトを展開してViewContentを展開し、adfc-mobile-config.xmlをダブルクリックします。

2. エディタ・ウィンドウで、「概要」タブをクリックします。

3. 概要エディタで、「マネージドBean」ナビゲーション・タブをクリックします。
図14-3は、adfc-mobile-config.xmlファイル用のエディタを示しています。

図14-3 adfc-mobile-config.xmlファイルのマネージドBean

4. 図14-4のように、マネージドBeanを選択し、マネージドBeanの追加をクリックします。

図14-4 マネージドBeanの作成

5. マネージドBeanを定義するには、次の手順を実行します。

- Beanの名前を入力します。

- 既存のクラスを参照するか、新しいクラスの名前を入力して、をクリックします。新しいJavaクラスが作成され、エディタで開きます。

- Beanのスコープを選択します。オプションは次のとおりです。

- アプリケーション

- ページ・フロー

- ビュー

注意:
マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。様々なオブジェクト・スコープの詳細は、第14.2項「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

6. オプションでBeanに管理プロパティを追加できます。Beanがインスタンス化される際、指定した値が管理プロパティに設定されます。「マネージドBean」表でBeanが選択された状態で、をクリックして行を「管理プロパティ」表に追加します。「プロパティ」ウィンドウで、プロパティ名を入力します(他のフィールドはオプションです)。

注意:
このエディタを使用して管理プロパティを宣言することはできますが、対応するコードはJavaクラスで生成されません。適切な型のprivateメンバー・フィールドを作成し、コード・エディタのコンテキスト・メニューの「ソース」→MAF用のゲッターとセッターを生成メニュー・アイテムを選択して、これらのBeanプロパティに対応するgetおよびsetメソッドを生成することで、そのコードを追加する必要があります。

14.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>

14.5 データ・コントロールを使用したビジネス・サービスの公開

アプリケーションのサービスの準備ができたら、OEPEを使用して、UIコンポーネントとサービスとの宣言的バインドに必要な情報を提供するデータ・コントロールを作成できます。

「ファイル」→「新」→「その他」を選択することで表示される「新」ダイアログからデータ・コントロールを生成します。データ・コントロールは、1つ以上のXMLメタデータ・ファイルで構成され、これらのファイルでは、実行時にバインディングと連動するサービスの機能が定義されます。データ・コントロールは、基礎となるサービスと連動します。

14.5.1 データ・コントロールの作成方法

OEPEのプロジェクト・エクスプローラ内からアダプタ・ベースのデータ・コントロールを作成します。

始める前に:

データ・コントロール使用の一般的な知識があると役立ちます。詳細は、第14.5項「データ・コントロールを使用したビジネス・サービスの公開」を参照してください。

次のタスクを完了する必要があります。

アプリケーション・ワークスペースを作成し、データ・コントロールの基礎にするビジネス・サービスを追加します。アプリケーション・ワークスペースの作成の詳細は、第2.2項「MAFアプリケーションの作成」を参照してください。

データ・コントロールを作成する手順は、次のとおりです。

1. プロジェクト・エクスプローラで、ビュー・プロジェクトのトップレベル・ノードを右クリックし、「新」→「データ・コントロール」を選択します。

2. 「新」ダイアログで、「Oracle」を展開して「モバイル・アプリケーション・フレームワーク」を展開し、「データ・コントロール」を選択します。「次へ」をクリックします。

3. 「データ・コントロール・ソース」ページ:

- プロジェクトを選択します。

- データ・コントロールのタイプを選択します。

- をクリックし、「データ・コントロール・ソース」ダイアログでクラスを選択します。

「次へ」をクリックします。

4. ウィザードの残りのステップを完了します。

注意:
場合によっては、データ・コントロールの基礎にするクラスまたはオブジェクトを右クリックし、「データ・コントロールの作成」を選択することによってデータ・コントロールを作成できます。
オブジェクトがBeanクラス、つまりWSDLファイルの場合、右クリックしてモデル・コンポーネント→「データ・コントロールの作成」を選択します。

14.5.2 データ・コントロール作成時のプロジェクト内の処理

データ・コントロールを作成すると、OEPEによって、データ・コントロール定義ファイル(DataControls.dcx)が作成され、このファイルがデータ・コントロール・マネージャで開かれ、パレットにファイルの階層が表示されます。このファイルにより、データ・コントロールがサービスおよびバインディングと直接連動して動作することが可能になります。

エディタ・ウィンドウの「ソース」タブをクリックすることによって、対応するXMLファイルからのコードを表示できます。

14.5.2.1 データ・コントロール・マネージャ

データ・コントロール・マネージャは、データ・コントロール・オブジェクトの階層のビューと、DataControls.dcxファイルのデータ・モデルの公開メソッドを提供します。プロジェクト・エクスプローラからデータ・コントロール・マネージャを開くには、アプリケーション・オブジェクト・ノードを展開してMAFを展開し、データ・コントロール・マネージャをダブルクリックします。

データ・コントロール・マネージャおよびパレットで使用されているアイコンの説明の詳細は、表14-5を参照してください。

図14-5に示すように、オブジェクトを選択し、構造定義の編集リンクをクリックすることで、データ・コントロール・オブジェクトのラベルおよびツールチップを変更できます。

図14-5 データ・コントロール・マネージャ

14.5.2.2 パレット

デフォルトでは、IDEの左下隅にパレットが表示されます。ノードをパレットからページのデザイン・エディタにドラッグすることで、データバインドUIコンポーネントを作成できます。パレットでダブルクリックすることで、タグおよびタグ・バインディングを作成でき、タグをページにドラッグした場合、式ビルダーを使用してバインドできます。

14.5.3 データ・コントロールの組込み操作

データ・コントロール・フレームワークは、データ・コントロールの標準操作のセットを定義します。これらの操作は、基礎となるビジネス・サービスの機能を使用して実装されます。実行時に、これらのデータ・コレクション操作の1つがデータ・バインディング・レイヤーによって名前を指定して起動されると、データ・コントロールは、組込み機能を処理する適切なサービス・メソッドにそのコールを委譲します。たとえば、Beanデータ・コントロールでは、Next操作はBeanコレクションのイテレータに依存します。

ほとんどの組込み操作は、現在の行に作用します。ただし、execute操作が、データ・コントロール自体をリフレッシュします。

使用可能な操作は、データ・コントロールのタイプと、基礎となるビジネス・サービスの機能によって異なります。次に、組込み操作すべてのリストを示します。

- Create: 現在の行になる新規行を作成。新しい行も行セットに追加されます。

- CreateInsert: 現在の行となる新規行を作成し、その行を行セットに挿入。

- Create With Parameters: 名前付きパラメータを使用して現在の行になる新規行を作成し、その行を行セットに挿入。

- Delete: 現在の行を削除。

- Execute: アクセッサ・メソッドを実行または再実行することによって、データ・コレクションをリフレッシュします。
ExecuteWithParams: パラメータとして渡された変数に新しい値を割り当てた後で、関連した問合せを実行または再実行することにより、データ・コレクションをリフレッシュ。この操作は、パラメータ化された問合せに基づくデータ・コントロール・コレクション・オブジェクトに対してのみ使用できます。

- First: 行セット内の最初の行を現在の行に設定します。

- Last: 行セット内の最後の行を現在の行に設定します。

- Next: 行セット内の次の行を現在の行に設定します。

- Next Set: 1つ後の行のセットに移動します。

- Previous: 行セット内の前の行を現在の行に設定します。

- Previous Set: 1つ前の行のセットに移動します。

- removeRowWithKey: パラメータとして渡された行キーのシリアライズされた文字列表現を使用して行の検索を試行します。検出されると、その行が削除されます。

- setCurrentRowWithKey: パラメータとして渡された行キーのシリアライズされた文字列表現を使用して行の検索を試行します。検出されると、その行が現在の行になります。

- setCurrentRowWithKeyValue: パラメータとして渡された主キーの属性値を使用して行の検索を試行します。検出されると、その行が現在の行になります。

14.6 データ・コントロール・パレットからのデータバインドUIコンポーネントの作成

パレットから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインド・ユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要な様々なコードおよびオブジェクトがOEPEによって自動的に作成されます。

パレットでは、各データ・コントロール・オブジェクトは特定のアイコンによって表されます。表14-5は、各アイコンが表すデータ・コントロール・オブジェクト、パレットの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。

表14-5 パレット・アイコンおよびオブジェクト階層

アイコン

名前

説明

作成する対象

データ・コントロール

データ・コントロールを表します。

他のオブジェクトのコンテナとして機能し、作成には使用されません。

コレクション

アクセッサ・メソッドまたは操作から返される名前付きデータ・コレクションを表します。

フォーム、表、グラフ、ツリー、レンジ・ナビゲーション・コンポーネント、マスター/ディテール・コンポーネントおよび選択リスト・コンポーネント

構造化属性

Javaプリミティブ・タイプ(属性として示される)または任意のタイプのコレクションのいずれでもない、戻りオブジェクトを示します。

フォーム、ラベル、テキスト・フィールド、日付、値のリストおよび選択リスト・コンポーネント。

属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。

メソッド

データ・コントロールのメソッドまたは操作、またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはコレクションを戻したりすることができます。

コマンド・コンポーネント。

パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。

メソッド戻り

メソッドまたはその他の操作から返されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、または親コレクションで実行できる操作などです。

単一の値の場合: テキスト・フィールドおよび選択リスト。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント。

単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するには、対応するメソッドをボタンとしてドロップします。フォームがタスク・フローの一部の場合、メソッド・アクティビティを作成してメソッドを起動できます。

操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。

ボタンやリンクなどのUIコマンド・コンポーネント。

パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。

ラベル、テキストおよび選択リストの各コンポーネント。

14.6.1 データ・コントロール・パレットの使用方法

OEPEは、ドロップするデータ・コントロール項目に対してそれぞれ選択できるUIコンポーネントの事前定義済セットを備えています。

始める前に:

パレットの各種オブジェクトに関する知識があると役立つ場合があります。詳細は、第14.6項「データ・コントロール・パレットでのデータバインドUIコンポーネントの作成」を参照してください。

次のタスクを完了する必要があります。

- 第14.5.1項「データ・コントロールの作成方法」の説明に従って、データ・コントロールを作成します。

- 第12.3.1.2項「MAF AMXページの作成」の説明に従って、MAF AMXページを作成します。

パレットを使用してUIコンポーネントを作成するには、次の手順を実行します。

1. パレットで項目を選択し、ページのビジュアル・エディタにドラッグします。パネル内の各項目の定義の詳細は、表14-5 パレット・アイコンおよびオブジェクト階層を参照してください。

2. ポップアップ・メニューから、UIコンポーネントを選択します。
パレットから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのコンテキスト・メニューが表示されます。表示されるコンポーネントは、プロジェクト内のライブラリに基づきます。

図14-6は、パレットのデータ・コレクションをページにドロップしたときに表示されるコンテキスト・メニューを示しています。

図14-6 パレットのコンポーネントのドロップ

コンテキスト・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログがOEPEによって表示されます。たとえば、コンテキスト・メニューから「フォーム」を選択すると、「フォーム・フィールドの編集」ダイアログが表示されます。コンポーネントを選択したら、OEPEによって、ビジュアル・エディタでページにUIコンポーネントが挿入されます。

デフォルトで選択されたUIコンポーネントはまず、対応するビジネス・オブジェクト上で設定されているUIヒントで決定されます。UIヒントが設定されない場合、OEPEによって、標準のフォームと表には入力コンポーネントが使用され、読取り専用のフォームと表には出力コンポーネントが使用されます。リストのコンポーネントは、データ・コントロール・オブジェクトをドロップするときに選択するリストの型に基づいて決定されます。

デフォルトでは、データ・コントロールの使用時に作成されるUIコンポーネントは、MAFデータ・コントロール内の属性にバインドされ、次のような組込み機能を装備できます。

- データバインド・ラベル

- ツールチップ

- 書式設定

- 基本的なナビゲーション・ボタン

- 検証(検証規則が特定の属性にアタッチされている場合。)

デフォルトのコンポーネントは、そのまま使用しても十分機能します。ただし、特定のニーズに合せて変更することができます。

ヒント:
ページで使用するMAFデータバインド・コンポーネントのタイプを変更する場合は、ビジュアル・エディタまたは構造ウィンドウを使用してそのコンポーネントを削除し、パレットから新しいコンポーネントをドラッグ・アンド・ドロップする方法が最も簡単です。データバインド・コンポーネントをページから削除するときにビジュアル・エディタまたは構造ウィンドウを使用する場合、ページ定義ファイルの関連するバインディング・オブジェクトが他のどのコンポーネントからも参照されていなければ、これらのバインディング・オブジェクトはOEPEによって自動的に削除されます(ソース・エディタを使用する場合は、バインディング・オブジェクトの自動削除は行われません)。

14.6.2 データ・コントロール・パレットの使用時に行われる処理

パレットを使用してアプリケーションを作成した場合、OEPEによって次のことが実行されます。

- DataBindings.cpxファイルがプロジェクトのadfmsrc/mobileパッケージに作成され(このファイルが存在しない場合のみ)、そのページ用にエントリが追加されます。
DataBindings.cpxファイルは、アプリケーションのバインディング・コンテキストを定義します。バインディング・コンテキストはコンテナ・オブジェクトの1つで、使用可能なデータ・コントロールおよびデータ・バインディング・オブジェクトのリストを含みます。DataBindings.cpxファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。詳細は、第12.3.2.3.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

- META-INFディレクトリにadfm.xmlファイルが作成されます。このファイルにより、DataBindings.cpxファイルのレジストリが作成され、バインディング・コンテキストを作成できるように、実行時にアプリケーションで特定できます。

- パッケージ定義ファイルがページ定義サブパッケージに追加されます(ページに対してファイルが存在しない場合)。デフォルトのサブパッケージは、adfmsrcディレクトリにあるmobile.pageDefsです。
ページ定義ファイル(pageNamePageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのバインディング・コンテナを定義します。バインディング・コンテナでは、ページのすべてのバインディング・オブジェクトへのランタイム・アクセスが行われます。ページ定義ファイルの詳細は、第12.3.2.3.5項「生成されたドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

ヒント:
現在のバインディング・コンテナは、プログラム的なアクセス用のAdfContextからも入手できます。

- ページ定義ファイルが構成されます。この処理では、ページによって参照されるバインディング・オブジェクトの定義も追加されます。

- ページに指定のコンポーネントを追加します。
これらの事前作成済コンポーネントには、ページ定義ファイルのバインディング・オブジェクトを参照するデータ・バインディング式言語(EL)式が含まれます。詳細は、第14.3.1項「データ・バインディングEL式について」を参照してください。

- UIコンポーネントが必要とするすべてのライブラリ、ファイル、および構成要素が追加されます。データバインド・コンポーネントに必要なアーティファクトの詳細は、第2.2.2項「MAFアプリケーションを作成する場合の処理」を参照してください。

14.7 実行時に行われる処理: バインディング・コンテキストの動作方法

ページにMAFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、バインディング・コンテキストと呼ばれる単一オブジェクトを介して、アプリケーションによって管理されます。バインディング・コンテキストは、アプリケーション内のすべてのデータ・コントロールおよびページ定義のランタイム・マップ(名前付きdataでEL式#{data}を使用してアクセス可能)です。

図14-7に示すように、MAFでは、アプリケーション、DataBindings.cpxおよびページ定義ファイルからバインディング・コンテキストが作成されます。設計時に使用可能なデータ・コントロールは、すべてのDataControls.dcxファイルとワークスペース内のすべてのアプリケーション・モジュールの集合体によって定義されますが、実行時にアプリケーションで使用可能なデータ・コントロールは、DataBindings.cpxファイルで定義されます。DataBindings.cpxファイルは、アプリケーションのページで使用されているデータ・コントロールをすべて一覧表示し、ページ定義ファイルに定義されたバインディング・オブジェクトが格納されているバインディング・コンテナをWebページのURLにマップします。ページ定義ファイルは、アプリケーション・ページで使用するバインディング・オブジェクトを定義します。各ページにページ定義ファイルが1つあります。

バインディング・コンテキストには、これらのオブジェクトの実際のインスタンスは含まれていません。かわりに、マップには必要に応じてデータ・コントロールまたはバインディング・コンテナ・オブジェクトになる参照が含まれます。たとえば、オブジェクト(ページ定義など)がアプリケーションから解放されるか、タスク・フローが終了するか、リクエストの終了時にバンディング・コンテナまたはデータ・コントロールが解放されると、データ・コントロールおよびバンディング・コンテナは参照オブジェクトに戻ります。DataBindings.cpxファイルの詳細は、第12.3.2.3.5項「生成されたドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

図14-7 ファイル・バインディング・コンテキストの実行時の使用

注意:
コンポーネントを構成するときは、使用するバインディング・スタイルを十分に考慮してください。より具体的に言うと、標準的なバインディングをマネージドBeanバインディングと組み合せると、解釈を誤った動作が発生することがよくあります。これは、バインディング・インフラストラクチャとマネージドBeanインフラストラクチャとの間でクラス・インスタンスが一致する可能性が低いためです。バインディングが混在すると、UIに直接リンクされていないインスタンスの動作がコールされる場合があります。

MAFでのバインディングの操作の詳細は、次の項を参照してください。

- 第12.3.2.3.4項「生成されるバインディングに関する必知事項」

- 第12.3.2.3.6項「MAF AMXエディタ・バインディング」タブの使用方法

- 第12.3.2.3.7項「未使用のバインディングの削除に関する必知事項」

14.8 データ・コントロール属性の使用

ビジネス・サービスのデータ・コントロールを作成する際、個々のデータ・オブジェクトについて作成するデータ・コントロール構造ファイルでデータ・オブジェクトの永続属性のUIヒントを設定できます。

14.8.1 属性へのUIヒントの設定

属性のUIヒントを設定し、それらの属性を使用するすべてのUIコンポーネントでそれらの属性が一貫したローカライズ可能な方法で表示およびラベル付けされるように設定できます。UIヒントにより、属性、ラベル、ツールチップ、フィールドを自動的に送信する必要があるかどうかを表示するために使用するUIコンポーネントのタイプなどが決定されます。特定の属性を表示するか非表示にするかも決定できます。属性に対してUIヒントを作成するには、プロジェクト・エクスプローラからアクセス可能な、データ・オブジェクトのデータ・コントロール構造ファイルのデータ・コントロール・マネージャを使用します(図14-8を参照)。

UIヒントの1つに対して値が入力された属性はアイコンを使用します。

図14-8 データ・コントロール属性UIヒントの編集

UIヒントを設定する手順:

1. プロジェクト・エクスプローラで、アセンブリまたはビュー・プロジェクト・ノードを展開し、MAFノードを展開します。

2. 「データ・コントロール・マネージャ」をダブルクリックします。
> 3. 「アウトライン」の下で、mobile.Departmentを展開します。選択することで属性を編集できます。アイコンに鉛筆が載っている属性は、2つの編集可能なフィールドの1つにすでにエントリがあり、添付のイメージを参照してください。

3. エディタの「アウトライン」の下で、編集する属性を選択します。

4. 必要に応じて、「属性」を展開し、「UIヒント」を展開し、「ラベル」および「ツール・チップ・テキスト」に対応した値を入力します。

14.9 Beanデータ・コントロールの作成と使用

JavaBeanデータ・コントロールでは、POJO (Plain Old Java Object)から自身のデータ構造を取得します。JavaBeanデータ・コントロールを作成するには、(プロジェクト・エクスプローラで) Javaクラス・ファイルを右クリックし、「データ・コントロールの作成」を選択します。

注意:
JavaBeanがバックグラウンド・スレッドを使用してUI内のデータを更新する場合、手動でoracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventをコールする必要があります。flushDataChangeEventメソッドの詳細は、第14.12項「データ変更イベントについて」を参照してください。

14.9.1 Beanクラス変数のシリアライズに関する必知事項

MAFでは、一時変数として宣言されたJavaScript Object Notation (JSON)データBeanクラス変数にはシリアライズしません。一連のネストされたオブジェクトのシリアライズを避けるには、それらを一時オブジェクトとして定義する必要があります。この方法を使用すると、オブジェクトのネストが原因で循環オブジェクトが作成されるのを防ぐこともできます。

次のシナリオを考えてみましょう。Employeeオブジェクトが、その子として従業員の上司を表すEmployeeオブジェクトを保持しているとします。その子を一時オブジェクトとして宣言しなかった場合、実行時に子のEmployeeオブジェクトを計算しようとすると、一連のネストされたシリアライズ・オブジェクトが作成されます。

JavaオブジェクトをJSONオブジェクトにシリアライズおよびシリアライズ解除するには、JSONBeanSerializationHelperクラスを使用します。JSONBeanSerializationHelperクラスを使用すると、独自のカスタムJSONシリアライズおよびシリアライズ解除を実装できます。また、このクラスでは、JSONシリアライズ(およびシリアライズ解除)処理後にJSONオブジェクトを変更するためのフックが提供されます。JSONBeanSerializationHelperクラスはGenericTypeSerializationHelperクラスに似ており、RESTおよびSOAPベースのWebサービス内で、GenericTypeオブジェクトのシリアライズおよびシリアライズ解除に使用できます。詳細は、「MAF Javadoc」のoracle.adfmf.framework.api.JSONBeanSerializationHelperクラスを参照してください。

MAFでは、GregorianCalendarクラスのオブジェクトのシリアライズはサポートされません。JSONBeanSerializationHelperクラスでは、GregorianCalendarクラスのオブジェクトをシリアライズできません。これは、GregorianCalendarクラスに循環参照が含まれるためです。かわりに、java.util.Dateまたはjava.sql.Dateをデータ操作に使用します。次の例は、java.util.Dateを使用してGregorianCalendarオブジェクトを変換する方法を示しています。

Calendar calDate = new GregorianCalendar();
calDate.set(1985, 12, 1); // "January 1, 1986"
Date date = calDate.getTime();

14.10 DeviceFeaturesデータ・コントロールの使用方法

MAFでは、アプリケーション内でDeviceFeaturesデータ・コントロールを通じて使用できるデバイス固有の機能が公開され、DeviceFeaturesデータ・コントロールは、新しいMAFアプリケーションを作成するときにデータ・コントロール・マネージャに表示されるコンポーネントです。Cordova Java APIは、このデータ・コントロールを通じて抽象化され、これにより、MAF AMXとして実装されたアプリケーション機能から、デバイスに埋め込まれた様々なサービスにアクセスできるようになります。DeviceFeaturesデータ・コントロールから提供される操作をMAF AMXページ内にドラッグ・アンド・ドロップすることによって、デバイスに格納されたユーザーのコンタクト先を管理する機能の追加、電子メール・メッセージとSMSテキスト・メッセージの両方の作成と送信、デバイスの位置の確認、デバイスのカメラの使用およびデバイスのファイル・システムに格納されたイメージの取得を行うことができます。次の項では、これらの操作を宣言的に使用する方法や、JavaコードとJavaScriptを使用して実装する方法など、各操作について詳しく説明します。

図14-9 エディタでのMAF DeviceFeaturesデータ・コントロール

MAFアプリケーション・テンプレートを使用してアプリケーションを作成すると、自動的にDeviceFeaturesデータ・コントロールがデータ・コントロール・マネージャに表示されます。図14-9は、データ・コントロール・マネージャでのDeviceFeaturesデータ・コントロールを示しています。次のメソッドを使用できます。

- addLocalNotification

- cancelLocalNotification

- createContact

- displayFile

- findContacts

- getPicture

- removeContact

- sendEmail

- sendSMS

- startLocationMonitor

- updateContact

ページを作成したら、DeviceFeaturesデータ・コントロール・メソッド(またはそれらのメソッド内にネストされたその他のオブジェクト)をパレットからMAF AMXビューにドラッグして、関連する機能にバインドされたコマンド・ボタンやその他のコンポーネントを作成できます。デフォルトのバインディングを受け入れるか、ELを使用してそれらのバインディングを変更できます。また、JavaScriptやJavaを使用して、機能を実装または構成することもできます。MAFアプリケーションにデータ・コントロールを含める方法の詳細は、第12.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によって図14-10のダイアログが表示されます。

図14-10 DeviceFeaturesデータ・コントロールの操作用プラグインの有効化

操作に必要なプラグインが有効になっていない場合、MAF AMXページのソース・ファイル内に警告メッセージが表示されます。たとえば、MAFアプリケーションでSMSプラグインが有効になっていないと仮定しましょう。MAF AMXページの、アプリケーションがsendSMS操作を起動する箇所に、図14-11に示した警告メッセージが表示されます。この問題を解決するには、第10章「MAFアプリケーションでのプラグインの使用方法」の説明に従って、プラグインを手動で有効にします。

図14-11 DeviceFeaturesデータ・コントロールの操作に必要なプラグイン

14.10.1 撮影を有効にするためのgetPictureメソッドの使用方法

DeviceFeaturesデータ・コントロールにはgetPictureメソッドが含まれており、このメソッドを使用すると、MAFアプリケーションはデバイスのカメラとフォト・ライブラリを活用することができ、エンド・ユーザーが写真を撮影したり、既存のイメージを取得できるようになります。この項の最後の方に3つの例があります。最初の例は、エンド・ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaScriptコードを示しています。2番目と3番目の例は、エンド・ユーザーが写真を撮影したり、保存済イメージを取得することを可能にするJavaコードを示しています。getPictureメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org)を参照してください。

次のパラメータによって、イメージの取得元と、そのイメージを戻す方法が制御されます。

注意:
撮影する写真にtargetWidth、targetHeightおよびqualityを指定しない場合、使用されるデフォルト値は最大値になり、メモリーに障害が発生することがあります。

- quality: 保存済イメージの質を設定します。範囲は1から100 (100を含む)です。大きい数値を指定すると質は高くなりますが、ファイル・サイズも増大します。JPEGイメージ(encodingTypeで指定します)にのみ適用されます。

- destinationType: 戻り値の形式を次から選択します。

- DeviceManager.CAMERA_DESTINATIONTYPE_DATA_URL (0): Base64でエンコードされた文字列としてイメージを戻します。プログラムで使用する場合、この値は、DeviceManager.CAMERA_DESTINATION_DATA_URLを使用してenumとしても指定されます。イメージをイメージ・コンポーネント内に表示するには、戻された値の前にdata:image/gif;base64を付ける必要があります。

- DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI (1): イメージ・ファイルのパスを戻します。この値は、プログラムで使用される場合、DeviceManager.CAMERA_DESTINATION_FILE_URIを使用する列挙としても指定されます。

注意:
ファイルのURIがgetPictureメソッドによって戻された場合、ファイルのサイズを求めるために使用する前に、問合せパラメータを削除する必要があります。次に例を示します。
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操作をドラッグし、ボタンとしてページにドロップします(図14-12を参照)。

図14-12 getPicture操作のカスタマイズ

ユーザーがよりきめ細かく制御できるようにするには、getPicture操作をパラメータ・フォームとしてドロップします。これにより、エンド・ユーザーは写真を撮影したり既存のイメージを選択する前に、設定を指定できるようになります。

2. アクションの編集ダイアログで、前述のすべてのパラメータの値を設定します。イメージがファイル名として戻されるように、destinationType = 1を指定するようにします。

3. getPictureの戻り値をドラッグして、「イメージ」としてページにドロップします。

4. 「共通コンポーネント」パネルで、「コンポーネント・パレット」から「イメージ」をドラッグし、ページ上にドロップします。

図14-13は、エンド・ユーザーのフォト・ライブラリからイメージを表示するためのバインディングを示しています。

図14-13 デザインタイムでフォト・ライブラリからイメージを表示するためのバインディング

このアプリケーションを実行すると、イメージ・チューザが自動的に表示され、エンド・ユーザーは表示するイメージを選択できます。イメージ・チューザが自動的に表示される理由は、イメージ・コントロールがgetPicture操作の戻り値にバインドされており、それによってgetPicture操作が起動するためです。

注意:
getPictureメソッドのタイムアウト値は、5分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

次に示すプラットフォーム固有の問題に留意してください。

- iOS

- いくつかのデバイスでメモリー・エラーが発生しないようにするには、qualityを50未満に設定します。

- destinationType FILE_URIを使用すると、写真はアプリケーションの一時ディレクトリに保存されます。

- アプリケーションの一時ディレクトリの内容は、アプリケーションの終了時に削除されます。記憶域の空き領域が問題になる場合は、navigator.fileMgr APIを使用してこのディレクトリの内容を削除することもできます。

- targetWidthとtargetHeightを使用するには、これらを両方とも指定する必要があります。一方または両方の値が負の値または0の場合、イメージの元のディメンションが使用されます。

- Android

- allowEditパラメータを無視します。

- Camera.PictureSourceType.PHOTOLIBRARYとCamera.PictureSourceType.SAVEDPHOTOALBUMでは、どちらも同じフォト・アルバムが表示されます。

- Camera.EncodingTypeはサポートされていません。パラメータは無視され、常にJPEGイメージが生成されます。

- targetWidthとtargetHeightは、個別に指定できます。一方のパラメータが正の値で、もう一方が負の値またはゼロを使用して元のサイズを表す場合、正の値がそのディメンションに使用され、もう一方のディメンションは元のアスペクト比を維持するようにスケール変更されます。

- destinationType DATA_URLを使用すると、イメージが大きい場合は使用可能なメモリーがすべて使用され、メモリー不足のエラーが発生する場合があります。通常は、デフォルトのイメージ・サイズを使用すると、この動作が発生します。targetWidthとtargetHeightを設定してイメージ・サイズを制限します。

次の例は、ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaScriptコードを示しています。結果は、保存済イメージへのフルパスになります。

// The camera, like many other device-specific features, is accessed
// from the global 'navigator' object in JavaScript.
// Note that in the Cordova JavaScript APIs, the parameters are passed
// in as a dictionary, so it is only necessary to provide key-value pairs
// for the parameters you want to specify.

navigator.camera.getPicture(onSuccess, onFail, { quality: 50 });

function onSuccess(imageURI) {
var image = document.getElementById('myImage');
image.src = imageURI;
}
function onFail(message) {
alert('Failed because: ' + message);
}

次の例は、ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaコードを示しています。結果は、保存済イメージへのフルパスになります。

import oracle.adf.model.datacontrols.device;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Take a picture with the device's camera.
// The result will be the full path to the saved PNG image.
String imageFilename = DeviceManagerFactory.getDeviceManager().getPicture(100,
DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI,
DeviceManager.CAMERA_SOURCETYPE_CAMERA, false,
DeviceManager.CAMERA_ENCODINGTYPE_PNG, 0, 0);

次の例は、ユーザーが保存済イメージを取得することを可能にするJavaコードを示しています。結果は、Base64でエンコードされたJPEGになります。

import oracle.adf.model.datacontrols.device;

// Retrieve a previously-saved image. The result will be a base64-encoded JPEG.
String imageData = DeviceManagerFactory.getDeviceManager().getPicture(100,
DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URL,
DeviceManager.CAMERA_SOURCETYPE__PHOTOLIBRARY, false,
DeviceManager.CAMERA_ENCODINGTYPE_JPEG, 0, 0);

14.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が表示されます。

図14-14は、ページ上の編集可能なフォームを使用してSMSを送信するためのバインディングを示しています。

図14-14 デザインタイムで編集可能なフォームを使用してSMSを送信するためのバインディング

次の各例は、エンド・ユーザーがデバイスのテキスト・メッセージング・インタフェースを使用してSMSメッセージを送信することを可能にするコード例を示しています。

sendSMSメソッドについては、MAF Javadocの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");

14.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データ・コントロールからページ・デザイナにドラッグし、パラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスの電子メール・インタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに事前に値が移入され、送信準備が整った電子メールが表示されます。

図14-15は、ページ上の編集可能なフォームを使用して電子メールを送信するためのバインディングを示しています。

図14-15 デザインタイムで編集可能なフォームを使用して電子メールを送信するためのバインディング

次の各例は、エンド・ユーザーがデバイスの電子メール・インタフェースを使用して電子メール・メッセージを送信することを可能にするコード例を示しています。

sendEmailメソッドについては、MAF Javadocの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");

14.10.4 コンタクト先の作成を有効にするためのcreateContactメソッドの使用方法

DeviceFeaturesデータ・コントロールにはcreateContactメソッドが含まれており、これにより、MAFアプリケーションでは、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーが新しいコンタクト先を作成してデバイスのアドレス帳に保存できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてContactのフィールドに事前にデータを移入できます。この項の最後にある3つの例のうちの2番目の例のように、createContactメソッドはContactオブジェクトをパラメータとして使用し、作成されたContactオブジェクトを戻します。

createContactメソッドとContactオブジェクトの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org)を参照してください。Contactのプロパティの詳細は、第14.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);

14.10.5 コンタクト先の検索を有効にするためのfindContactsメソッドの使用方法

DeviceFeaturesデータ・コントロールにはfindContactsメソッドが含まれており、これにより、MAFアプリケーションは、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳から1つ以上のコンタクト先を検索できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてfindContactsのフィールドに事前にデータを移入できます。findContactsメソッドでは、フィルタ文字列と検索する(そして、見つかったコンタクト先の一部として戻す)フィールド名のリストを使用します。フィルタ文字列には、コンタクト先内の検索する任意の項目を指定できます。findContactsメソッドの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org)を参照してください。

findContacts操作では、次の引数を使用します。

- contactFields: 必須パラメータ。このパラメータは、findContacts操作によって生成されるContactオブジェクトに含めるフィールドを指定するために使用します。フィールドはカンマで区切ります(スペースの有無は関係ありません)。

- filter: コンタクト先をフィルタするために使用する検索文字列。(文字列) (デフォルト: "")

- multiple: findContacts操作から複数のコンタクト先を戻すかどうかを決定します。(ブール) (デフォルト: false)

注意:
次のリストに含まれていないフィールド名を渡すと、findContacts操作の戻り値がnullになる場合があります。また、Contactのフィールドの引数に指定したフィールドのみが、Contactオブジェクトの一部として戻されます。

次のリストに示すContactのプロパティを渡して、検索に使用し、見つかったコンタクト先の一部として戻すことができます。

- id: グローバルに一意な識別子

- displayName: エンド・ユーザーへの表示に適した、このコンタクト先の名前

- name: 人物名のすべてのコンポーネントを含むオブジェクト

- nickname: コンタクト先のカジュアルな名前。このフィールドをnullに設定すると、空の文字列として保存されます。

- phoneNumbers: コンタクト先のすべての電話番号の配列

- emails: コンタクト先のすべての電子メール・アドレスの配列

- addresses: コンタクト先のすべての住所の配列

- ims: コンタクト先のすべてのインスタント・メッセージング(IM)・アドレスの配列(imsプロパティは、このリリースではサポートされていません。)

注意:
このリリースでは、MAFはContactプロパティのimsをサポートしていません。imsプロパティのあるコンタクト先を作成する場合、MAFはimsプロパティなしでコンタクト先を保存します。その結果、ユーザーがimsに基づいて検索を実行しようとすると、コンタクト先を検索できなくなります。また、ユーザーが「検索」フィールドにimsを入力しようとすると、imsはnullとして戻されます。

- organizations: コンタクト先のすべての組織の配列

- birthday: コンタクト先の誕生日。プログラムでコンタクト先の誕生日フィールドを設定して、アドレス帳に永続させることはできませんが、オペレーティング・システムのアドレス帳を使用して手動でこのフィールドを設定することはできます。

- note: コンタクト先に関するメモ。このフィールドをnullに設定すると、空の文字列として保存されます。

- photos: コンタクト先の写真の配列

- categories: コンタクト先のすべてのユーザー定義カテゴリの配列。

- urls: コンタクト先に関連付けられたWebページの配列

注意:
findContactsメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

DeviceFeaturesデータ・コントロールを使用してfindContacts操作をカスタマイズするには:

1. 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);

14.10.6 コンタクト先の更新を有効にするためのupdateContactメソッドの使用方法

DeviceFeaturesデータ・コントロールにはupdateContactメソッドが含まれており、これにより、MAFアプリケーションでは、コンタクト先を管理するためにデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳に含まれるコンタクト先を更新できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてupdateContactのフィールドに事前にデータを移入できます。この項の最後にある3つの例のうちの2番目の例のように、updateContactメソッドはContactオブジェクトをパラメータとして使用し、更新されたContactオブジェクトを戻します。

updateContactメソッドとContactオブジェクトの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org)を参照してください。Contactのプロパティの詳細は、第14.10.5項「コンタクト先の検索を可能にするfindContactsメソッドの使用方法」も参照してください。

注意:
入力パラメータとして必要なContactオブジェクトは、第14.10.5項「コンタクト先を検索するfindContactsメソッドの使用方法」で説明するように、findContactsメソッドを使用して検索できます。null Contactオブジェクトがメソッドに渡されると、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してupdateContact操作をカスタマイズするには:

1. OEPEで、パレットのDeviceFeaturesデータ・コントロールからupdateContact操作をドラッグし、リンクまたはボタンとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、updateContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、JavaBeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してupdateContact操作を実行できます。第14.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分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

14.10.7 コンタクト先の削除を有効にするためのremoveContactメソッドの使用方法

DeviceFeaturesデータ・コントロールにはremoveContactメソッドが含まれており、これにより、MAFアプリケーションでは、コンタクト先を管理するためのデバイスの・インタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳からコンタクト先を削除できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてremoveContactのフィールドに事前にデータを移入できます。この項の最初の例のように、removeContactメソッドはContactオブジェクトをパラメータとして使用します。

注意:
入力パラメータとして必要なContactオブジェクトは、第14.10.5項「コンタクト先の検索を有効にするためのfindContactsメソッドの使用方法」に説明するように、findContactsメソッドを使用して検索できます。

DeviceFeaturesデータ・コントロールを使用してremoveContact操作をカスタマイズするには:

1. OEPEで、removeContact操作をパレットのDeviceFeaturesデータ・コントロールからドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナにドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、removeContact操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してremoveContact操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なContactのフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してremoveContact操作を実行できます。

2. パレットのremoveContact操作の下からContact戻りオブジェクトをドラッグして、フォームとしてページにドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。removeContact操作を実行すると、結果がこのフォームに表示されます。

次の各例は、findContactsを使用して検索したコンタクト先を削除する方法を示しています。removeContactメソッドとContactオブジェクトについては、MAF Javadocの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分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

14.10.8 地理的位置を有効にするためのstartLocationMonitorメソッドの使用方法

DeviceFeaturesデータ・コントロールにはstartLocationMonitorメソッドが含まれており、これにより、MAFアプリケーションは、デバイスの場所を取得および追跡するためにデバイスの地理的位置情報サービスを活用できます。MAFでは、デバイスのインタフェースを表示し、必要に応じてstartLocationMonitorのフィールドに事前にデータを移入できます。

MAFで公開されているAPIを使用すると、デバイスの現在の位置を取得できるため、特定の時点におけるデバイスの現在の位置を取得したり、定期的にその情報をサブスクライブできます。この項の最後にある例は、アプリケーションでデバイスの位置の取得を可能にするコード例を示しています。startLocationMonitorメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org)を参照してください。

注意:
Android 2.nシミュレータは、enableHighAccuracyオプションがtrueに設定されていないかぎり、地理的位置情報の結果を戻しません。
altitudeAccuracyプロパティは、Androidデバイスではサポートされていません。

iOSと比べて、Androidプラットフォームでは更新は頻繁には実行されません。

DeviceFeaturesデータ・コントロールを使用してデバイスの位置の変更をリスニングするには:

OEPEで、startLocationMonitor操作をパレットのDeviceFeaturesデータ・コントロールからドラッグし、リンクまたはボタンとしてページ・デザイナにドロップします。アクションの編集ダイアログによって要求されたら、次のようにフィールドに値を移入します。

- enableHighAccuracy: trueの場合、位置の修正を最も正確に取得できるメソッドを使用します。これは単なるヒントであり、オペレーティング・システムでは考慮されない場合があります。多くの場合、デバイスには、携帯電話基地局の三角測量、Wi-Fiホットスポットの参照、実際のGPSなど、位置の修正を取得するためのいくつかの異なるメカニズムがあります。falseを指定すると、正確性の低い位置を受け入れることになりますが、この場合、レスポンスの速度が向上し、消費電力が低下する可能性があります。

- updateInterval: 更新の受信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムでは、デバイスの位置の大きな変更が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。

- locationListener: 次のシグネチャを含むBeanメソッドに解決されるEL式。

void methodName(Location newLocation)

このEL式は、位置の更新を受信するたびに評価されます。たとえば、viewScope.LocationListenerBean.locationUpdated(#{}で囲みません)と入力した後、LocationListenerBeanというBeanをviewScope内に定義し、次のシグネチャを含むメソッドを実装します。

public void locationUpdated(Location currentLocation)
{
System.out.println(currentLocation);
// To stop subscribing to location updates, invoke the following:
// DeviceManagerFactory.getDeviceManager().clearWatchPosition(
//     currentLocation.getWatchId());
}

注意:
EL式の評価結果としてlocationListenerの名前が必要でないかぎり、locationListenerを指定するためにEL構文#{LocationListenerBean.locationUpdate}を使用しないでください。

次の最初の例は、デバイスの位置の変更を定期的にサブスクライブする方法を示しています。この例で使用するDeviceManager.startUpdatingPositionメソッドのパラメータは、次のとおりです。

- int updateInterval: 位置の更新の配信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムでは、デバイスの位置の大きな変更が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。逆に言えば、位置の更新は指定した頻度で配信されることもありますが、デバイスの位置が大きく変更されるまで、配信される位置が変化しない場合があります。

- boolean enableHighAccuracy: trueに設定された場合、位置の修正を最も正確に取得できるメソッドを使用します。

- String watchID: 後から位置の更新のサブスクライブを停止するために使用できる一意のIDを定義します。

- GeolocationCallback: GeolocationCallbackインタフェースの実装。次の最初の例のように、この実装のlocationUpdatedメソッドは、位置が更新されるたびに起動されます。

JavaScriptを使用してデバイスの位置の変更をサブスクライブする方法の例は、Cordovaのドキュメント(http://cordova.apache.org)を参照してください。

locationListenerによって指定されたコールバック関数内に戻されるパラメータは、次のとおりです。

- double getAccuracy: m単位の緯度と経度を示す座標の精度レベル。

- double getAltitude: m単位の楕円体高度。

- double getLatitude: 10進度単位の緯度。

- double getLongitude: 10進度単位の経度。

- double getAltitudeAccuracy: m単位の高度座標の精度レベル。

- double getHeading: 真北から時計回りに計測した度単位で示される進行方向

- double getSpeed: m/秒単位で指定される、デバイスの現在の対地速度

- long getTimestamp: Unixエポックからのミリ秒単位の経過時間で示されるタイムスタンプの作成

- String getWatchId: 定期的な位置の更新をサブスクライブするときのみ使用します。後から位置の更新のサブスクライブを停止するために使用できる一意のID

startLocationMonitorメソッドとstartHeadingMonitorメソッドの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org)を参照してください。

注意:
startLocationMonitorおよびstartHeadingMonitorメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

次の例は、地理的位置を使用してデバイスの位置の変更をサブスクライブする方法を示しています。

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);

DeviceFeaturesデータ・コントロールを使用してデバイスの位置を取得するには、次の手順を実行します。

OEPEで、startLocationMonitor操作をパレットのDeviceFeaturesデータ・コントロールからドラッグし、リンクまたはボタンとしてページ・デザイナにドロップします。前述の例に従いますが、最初の位置の変更を受信した後、リスニングを停止します。

次の場所は、デバイスの位置を1回取得する方法を示しています。この例で使用するDeviceManager.getCurrentPositionメソッドのパラメータは、次のとおりです。

- int maximumAge: ミリ秒単位で指定したこの値より古くないキャッシュ値を受け入れます。位置の修正をこの時間内に取得した場合、その情報がすぐに戻されますが、それ以外の場合、コールは新しい位置の修正が確定するまでブロックされます。maximumAgeパラメータの値は、1000ミリ秒以上である必要があります。これより小さい値は、自動的に1000ミリ秒に設定されます。

- boolean: enableHighAccuracy trueに設定された場合、位置の修正を最も正確に取得できるメソッドを使用します。

次の例は、地理的位置を使用してデバイスの位置を1回のみ取得する方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;
import oracle.adf.model.datacontrols.device.Location;

// Get the device's current position, with highest accuracy, and accept a cached location that is
// no older than 60 seconds.
Location currentPosition = DeviceManagerFactory.getDeviceManager().getCurrentPosition(60000, true);
System.out.println("The device's current location is: latitude=" + currentPosition.getLatitude() +
", longitude=" + currentPosition.getLongitude());

14.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では、この場所として外部ストレージ・ディレクトリが参照されます。この外部ストレージ・ディレクトリは公的にアクセス可能であるため、サードパーティ・アプリケーションを使用して、そこに格納されているファイルを読み取ることができます。

表14-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メソッドの詳細は、MAF Javadocの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());
}

14.10.10 addLocalNotificationメソッドとcancelLocalNotificationメソッドを使用してローカル通知を管理する方法

DeviceFeaturesデータ・コントロールには、addLocalNotificationメソッドとcancelLocalNotificationメソッドが含まれており、これらのメソッドによって、MAFアプリケーションは、通知を管理するためにデバイスのインタフェースを利用できるようになり、エンド・ユーザーはローカル通知のスケジュールや取消しを行うことができます。

addLocalNotificationメソッドとcancelLocalNotificationメソッドの使用方法の詳細は、MAF JavadocのDeviceDataControlクラスを参照してください。コード例などを含むローカル通知の管理の詳細は、第25.3項「ローカル通知の管理」を参照してください。通知の一般的な情報は、第25.1項「プッシュ通知の概要」を参照してください。

LocalNotificationDemoサンプル・アプリケーションでは、MAFアプリケーション内でローカル通知のスケジュールおよび受信を行う方法の例が提供されます。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

サンプル・アプリケーションの詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

14.10.11 デバイス・プロパティに関する必知事項

アプリケーションには、特定のデバイスの特性や機能に依存する機能が含まれる場合があります。たとえば、デバイスの画面の向きによって異なるユーザー・インタフェースを提示したり、デバイスで地理的位置がサポートされる場合のみマッピング機能を有効にすることなどが考えられます。MAFでは、このような動的な動作をサポートするために、Java、JavaScriptおよびELからアクセスできる様々なプロパティが用意されています。表14-7に、これらのプロパティをリストし、問合せ方法、予期される戻り値およびアプリケーションのライフサイクル中にそのプロパティが変更される可能性があるかどうかに関する情報も提供します。この項の最後にある例は、JavaScriptを使用してこれらのプロパティにアクセスする方法の例を示しています。

注意:
デバイス・プロパティのタイムアウト値は、1分に設定されています。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

表14-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>

14.11 属性の検証

モバイル・アプリケーション・フレームワークでは、バインディング属性で検証ルールが設定された状態で、データ・コントロール・レイヤーで検証が実行されます。属性の検証は、バインディングに対するsetValue操作中に、システム内の単一点で実行されます。

データ・コントロールによって公開される属性に対して、次のバリデータを定義できます。

- 比較バリデータ

- 長さバリデータ

- リスト・バリデータ

- 範囲バリデータ

特定の属性に対してすべてのバリデータが実行され、成功しないすべてのバリデータに対してネストされた例外がスローされます。属性の検証メッセージを定義し、実行時に検証ルールを起動するときに表示できます。詳細は、第13.9項「入力の検証」を参照してください。

注意:
JSONの制限により、BigDecimalが保持できる値はDoubleの範囲内となり、BigIntegerが保持できる値はLongの範囲内となります。許可された値よりも大きい数値を使用するには、toStringをBigDecimalまたはBigIntegerでコールし、値をStringとしてシリアライズ(解除)します。

表14-8に、長さバリデータでサポートされる検証の組合せをリストします。

表14-8 長さの検証

比較タイプ

バイト

文字

Equals

サポート対象

サポート対象

Not Equals

サポート対象

サポート対象

Less Than

サポート対象

サポート対象

Greater Than

サポート対象

サポート対象

Less Than Equal To

サポート対象

サポート対象

Greater Than Equal To

サポート対象

サポート対象

Between

サポート対象

サポート対象

表14-9と表14-10に、範囲バリデータでサポートされる検証の組合せを示します。

表14-9 範囲検証

比較タイプ

バイト

Char

Double

Float

Integer

Long

Short

Between

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

Not Between

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

表14-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

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

表14-11に、リスト・バリデータでサポートされる検証の組合せをリストします。

表14-11 リスト検証

比較タイプ

String

In

サポート対象

Not In

サポート対象

表14-12と表14-13に、比較バリデータでサポートされる検証の組合せを示します。

表14-12 比較検証

比較タイプ

バイト

Char

Double

Float

Integer

Long

Short

String

Equals

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

Not Equals

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

Less Than

サポート対象外

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

Greater Than

サポート対象外

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

Less Than Equal To

サポート対象外

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

Greater Than Equal To

サポート対象外

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象

サポート対象外

表14-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

サポート対象

サポート対象

サポート対象外

サポート対象外

サポート対象外

サポート対象外

14.12 データ変更イベントについて

データ変更イベントを単純化するために、OEPEではプロパティ変更リスナー・パターンを使用します。多くの場合、OEPEを使用して、Beanのプロパティ・アクセッサから通知をソースとして参照するために必要なコードを生成でき、これを行うには、「アクセサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します(詳細は第14.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クラスの詳細は、MAF Javadocを参照してください。

public class NotePad {
private   static    List
s_notes               = null;

/* manually adding property change listener as well as provider change listener. */
protected transient PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);
protected transient ProviderChangeSupport
providerChangeSupport = new ProviderChangeSupport(this);

public NotePad() {
…
}

public  mobile.Note[] getNotes() {
mobile.Note n[] = null;

synchronized (this)
{
if(s_notes.size() > 0) {
n = (mobile.Note[])
s_notes.toArray(new mobile.Note[s_notes.size()]);
}
else {
n = new mobile.Note[0];
}
}

return n;
}

public void addNote() {
System.out.println("Adding a note ....");
Note  n = new Note();
int   s = 0;

synchronized (this)
{
s_notes.add(n);
s = s_notes.size();
}

System.out.println("firing the events");
providerChangeSupport.fireProviderCreate("notes", n.getUid(), n);
}

public void removeNote() {
System.out.println("Removng a note ....");
if(s_notes.size() > 0) {
int     end = -1;
Note    n   = null;

synchronized (this)
{
end   = s_notes.size() - 1;
n     = (Note)s_notes.remove(end);
}

System.out.println("firing the events");
providerChangeSupport.fireProviderDelete("notes", n.getUid());
}
}

public void RefreshNotes() {
System.out.println("Refreshing the notes ....");

providerChangeSupport.fireProviderRefresh("notes");
}

public void addProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.addProviderChangeListener(l);
}

public void removeProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.removeProviderChangeListener(l);
}

protected String   status;

/* --- 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サンプル」にあります。

サンプル・アプリケーションの詳細は、付録G「サンプルのMAFアプリケーション」を参照してください。

15 MAF AMXでのWebサービスの使用方法

この章では、サード・パーティのWebサービスをMAF AMXアプリケーション機能の実装に統合する方法について説明します。

この章には次の項が含まれます:

- 第15.1項「MAFアプリケーションでのWebサービス使用の概要」

- 第15.2項「SOAPを使用したWebサービス・データ・コントロールの作成」

- 第15.3項「新しいWebサービス接続の作成」

- 第15.4項「Webサービス・データ・コントロールのエンドポイントの調整」

- 第15.5項「セキュアなWebサービスへのアクセス」

- 第15.6項「JavaからのWebサービスの起動」

- 第15.7項「ブラウザ・プロキシ情報の構成」

15.1 MAFアプリケーションでのWebサービス使用の概要

Webサービスでは、アプリケーションおよびその機能は、定義済のアプリケーション・プログラミング・インタフェースを使用してデータと情報を交換できます。Webサービスを使用すると、元のアプリケーションのプラットフォームや言語に関係なくビジネス機能を公開できます。これは、ビジネス機能が、他のアプリケーションで認識および使用可能な標準XMLコンストラクトで構成されるメッセージに抽象化されて公開されるためです。

MAFアプリケーションでは、Webサービスを使用してリモート・データ・ソースと対話します。具体的には、次のとおりです。

- リモート・データ・ソース内のデータの問合せ。

- リモート・データ・ソースとの双方向のデータ書込み。

MAFアプリケーションでWebサービスを使用する最も一般的なユース・ケースの一部を次に示します。

- Webサービスとしてはすぐに利用できるが、アプリケーション内で開発するには時間がかかる機能を追加するため

- 異なるアーキテクチャで実行されるアプリケーションへのアクセスを提供するため

MAFアプリケーションでWebサービスを使用すると、次のことが可能になります。

- Webサービス上で公開されている機能のサブセットからの選択。Webサービスによって提供されているエンタープライズ・データ以外はリクエストできないので、Webサービス・データ・コントロールで公開しているアプリケーション機能の数を減らすことにより、エンタープライズ・データに対するアクセス可能またはアクセス不可の制限設定に対応できます。

- モバイル・デバイスのリソースにとって計算の負荷が大きい機能を提供する。これは、デバイスが実行する必要のある実際の作業量、またはデバイスでローカルに使用できるデータ・セットよりもはるかに大規模なデータ・セットが機能のベースになっているという事実が理由になっている可能性があります。

注意:
CPU負荷の高い機能はサービス(サーバー側)にアウトソースするよう検討することをお薦めします。

MAFでは、SOAP WebサービスとREST Webサービスの両方の消費をサポートしています。REST Webサービスの使用方法の詳細は、第16.7項「RESTサービス・アーティファクトの作成」を参照してください。

使用するタイプを決定する前に、次の点を考慮してください。

- 大規模なペイロードや冗長なXML Schemaを使用しているSOAPは、MAFアプリケーションのパフォーマンスに影響する可能性があります。REST Webサービス(利用可能な場合)を使用するか、Oracle Service Bus (http://www.oracle.com/technetwork/middleware/service-bus/overview/index.htmlを参照)のようなミドルウェア・ソリューションを挿入して、ペイロードをSOAPからREST JSONに変換することをお薦めします。

- MAFはETL (抽出、変換、ロード)ツールではないので、複雑なWebサービスのペイロードに対応するにはコードを記述する必要があり、その結果、コードが複雑になるだけでなく、パフォーマンスも低下する可能性があります。Oracle Service Busのようなミドルウェア・ソリューションを使用することで、モバイル環境に適したデータ・ペイロードの形成が可能になります。

次のWebサービスの使用例は、データ・アクセス(使用例1)と、計算およびデータ駆動機能(使用例2と3)を示しています。

- Webサービスを使用して、商談データのセットをエンタープライズ・データ・ストアからフェッチしてエンド・ユーザーがそのデータをデバイスで操作できるようにし、変更内容をエンタープライズ・データ・ストアにポストする。

- 一部のエンタープライズ・データに関するレポートの生成をリクエストし、そのレポートをフェッチする。

- 顧客施設への道順の地図イメージを取得する。

MAFを使用して開発されたアプリケーション機能でWebサービスを使用する場合、外部Webサービスのデータ・コントロールを作成するのが最も一般的な方法です。詳細は、次を参照してください。

- 第15.2項「SOAPを使用したWebサービス・データ・コントロールの作成」

- 第15.2.2項「Webサービス・データ・コントロールに関する必知事項」

- 第14.1項「バインディングおよびデータ・コントロールの概要」

15.2 SOAPを使用したWebサービス・データ・コントロールの作成

MAFを使用して開発されたアプリケーション機能でWebサービスを使用する場合、外部Webサービスのデータ・コントロールを作成するのが最も一般的な方法です。詳細は、第14.1項「バインディングとデータ・コントロールの概要」を参照してください。

15.2.1 SOAPを使用したWebサービス・データ・コントロールの作成方法

OEPEでは、そのサービスのWeb Services Description Language (WSDL)ファイルのみを使用して、既存のSOAP Webサービスのデータ・コントロールを作成します。ローカル・ファイル・システムでWSDLファイルを参照するか、Universal Description, Discovery and Integration (UDDI)レジストリでWSDLファイルを検索するか、WSDL URLを直接入力することができます。

注意:
ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、OEPEで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、第15.7項「ブラウザ・プロキシ情報の構成」を参照してください。

SOAP Webサービス・データ・コントロールを作成するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを右クリックして、OEPEのメイン・メニューから「ファイル」→「新」→「その他」を選択します。

2. 「新」ダイアログで、「Oracle」を展開し、「モバイル・アプリケーション・フレームワーク」を展開して「データ・コントロール」を選択します。「次へ」をクリックします。

図15-1 新しいSOAP Webサービス・データ・コントロールの作成

3. ウィザードのデータ・コントロール・ソース・ページで、「Webサービス」を選択します。

4. をクリックし、データ・コントロール・ソース・ダイアログでローカルWSDLを使用可能なWSDLのリストから選択するか、リモートWSDLを入力します。「次へ」をクリックします。

注意:
MAFでは、SOAP 1.1および1.2の両方のバージョンで次のエンコーディング・スタイルをサポートしています。

- ドキュメント/リテラル

- ドキュメント/ラップ

- RPC

15.2.2 Webサービス・データ・コントロールに関する必知事項

Webサービス・データ・コントロールの作成後は、図15-2のように、Webサービスの操作およびその操作の戻り値が「データ・コントロール」ウィンドウに表示されます。

図15-2 Webサービス・データ・コントロール

Webサービス・データ・コントロールは、「データ・コントロールの編集」をクリックすることで編集できます(図15-3を参照)。

他のデータ・コントロールと同様に、Webサービスの操作によって戻されたオブジェクトをドラッグ・アンド・ドロップして、MAF AMXページのユーザー・インタフェースを作成できます。詳細は、第12.3.2.3項「データ・コントロールのビューへの追加」を参照してください。Webサービスの操作から戻されたデータが表示されると、次のオブジェクト・タイプが処理されます。

- コレクション

- Webサービスの操作により戻された複合オブジェクト

- Webサービスの操作により戻された、ネストされた複合オブジェクト

Webサービスの操作を使用して、標準データ型と複合データ型の両方を更新および削除できます。

図15-2で示されているように、各データ・コントロール・オブジェクトはアイコンで表されます。表15-1は、各アイコンが表すデータ・コントロール・オブジェクト、「データ・コントロール」パレットの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。詳細は、第14.6項「「データ・コントロール」パレットでのデータバインドされたUIコンポーネントの作成」を参照してください。

表15-1 Webサービスの「データ・コントロール」パレットのアイコンおよびオブジェクト階層

アイコン

名前

説明

作成する対象

データ・コントロール

データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。通常、各Webサービスに対するデータ・コントロールは1つです。

他のオブジェクトのコンテナとして機能し、コンポーネント作成には使用されません。

コレクション

サービスの操作から返されるデータ・コントロールを表現します。コレクションは、メソッド戻りオブジェクト、他のコレクション、または構造化属性の下の子としても表示されます。コレクションの下の子は、属性、他のコレクション、カスタム・メソッド、コレクションに対して実行できる組込み操作などです。

フォーム、表、グラフ、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・コンポーネント。第13.5項「データ視覚化の指定」も参照してください。

属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。属性は、自分の属するコレクションまたはメソッド戻りの下に、子として表示されます。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第13.2項「ページ・レイアウトの設計」も参照してください。

構造化属性

複合型でありコレクションではない、返されたオブジェクトを表します。たとえば、構造化属性は、現在のサービス・リクエストに割り当てられた単一のユーザーを表現します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第13.2項「ページ・レイアウトの設計」も参照してください。

メソッド

データ・コントロールの操作またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはそれらのコレクションを戻すことができます。

コマンド・コンポーネント。

パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。また、第13.3項「UIコンポーネントの作成と使用方法」も参照してください。

メソッド戻り

Webサービス・メソッドによって戻されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッドの戻りオブジェクトの下の子として表示されるオブジェクトは、該当コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、および親コレクション上で実行可能な操作です。

単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するために、対応するメソッドをボタンとしてドロップする必要があります。また、タスク・フローを使用している場合は、メソッド・アクティビティを作成できます。

コレクションと属性、および問合せフォームの場合と同じコンポーネント。

操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションの下の「操作」ノードにあります。1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「パラメータ」ノードにリストされます。

現在行のナビゲーションと設定のために、First、Last、Next、Previous、setCurrentRowWithKey、およびSetCurrentRowWithKeyValueの各操作がサポートされます。問合せをリフレッシュするために、Executeがサポートされます。Webサービス操作に応じて、CreateおよびDeleteが使用可能です。Webサービス・データ・コントロールはトランザクション方式ではないので、CommitおよびRollbackはサポートされません。

ボタン、リンクおよびメニューなどのユーザー・インタフェース・コマンド・コンポーネント。詳しくは、第13.3項「UIコンポーネントの作成と使用方法」を参照してください。

パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。

配列および構造化パラメータは、データ・コントロールの下の更新可能な構造化属性およびコレクションとして公開され、UI上にADFフォームまたは更新可能な表としてドロップできます。UIを使用して配列または複合オブジェクト(標準のJava型ではない)のパラメータを作成できます。

ラベル、テキストおよび選択リストの各コンポーネント。詳細は、第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

15.2.3 Webサービス・データ・コントロールにおけるSOAPヘッダーのカスタマイズ方法

MAFでは、DataControls.dcxファイルにカスタム・プロバイダ・クラスを指定できます(この項の最後にある3つの例のうちの3番目の例を参照)。このカスタム・クラスはoracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProviderを拡張します。これは、SoapHeader[] getAdditionalSoapHeaders()メソッドの実装の指定に使用できます。

最初の例は、SOAPProviderを拡張して、2番目の例に示すカスタム・ヘッダーを作成する方法を示しています。

カスタムSOAPヘッダーを定義する方法を示した例。

package provider.ebs.soap;

import oracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProvider;
import oracle.adfinternal.model.adapter.webservice.provider.soap.SoapHeader;

public class EBSSOAPProvider extends SOAPProvider {

public SoapHeader[] getAdditionalSoapHeaders() {
SoapHeader header[] = new SoapHeader[2];
SoapHeader token = null;
SoapHeader user = null;
SoapHeader pass = null;

header[0] = new SoapHeader("http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"SOAHeader");
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"Responsibility",
"SYSTEM_ADMINISTRATOR"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"RespApplication",
"SYSADMIN"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"SecurityGroup",
"STANDARD"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"NLSLanguage",
"AMERICAN"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"Org_Id",
"0"));

header[1] = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Security");
token = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"UsernameToken");
user = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Username",
"sysadmin");
pass = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Password",
"sysadmin");

header[1].addChild(token);
token.addChild(user);
token.addChild(pass);

return header;
}
}

この例は、新しいカスタムSOAPヘッダーを示しています。

<soap:Header xmlns:ns1="http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/">
<ns1:SOAHeader>
<ns1:Responsibility>SYSTEM_ADMINISTRATOR</ns1:Responsibility>
<ns1:RespApplication>SYSADMIN</ns1:RespApplication>
<ns1:SecurityGroup>STANDARD</ns1:SecurityGroup>
<ns1:NLSLanguage>AMERICAN</ns1:NLSLanguage>
<ns1:Org_Id>0</ns1:Org_Id>
</ns1:SOAHeader>
<wsse:Security xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
soap:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Username>sysadmin</wsse:Username>
<wsse:Password Type=
http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-username-token-profile-1.0#PasswordText">sysadmin</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>

@return

この例は、SOAPProviderを登録したDataControls.dcxファイルのサンプル・エントリを示しています。

<definition xmlns="http://xmlns.oracle.com/adfm/adapter/webservice"
name="SoapService" version="1.0"
provider="oracle.adf.model.adapter.webservice.SOAPMessageHandler"
wsdl="http://@SRG_WS_HOST@:@SRG_WS_PORT@/SoapService/SoapServicePort?wsdl" >
<service name="SoapService" namespace="http://model/"
connection="SoapService">
<port name="SoapServicePort">
<operation name="echoSoapHeader"/>
</port>
</service>
</definition>

注意:
MAFを使用して動的SOAPヘッダーを指定することはできません。

15.3 新しいWebサービス接続の作成

Webサービスの接続情報は、アプリケーション内の他の接続とともにconnections.xmlファイルに保存されます。このファイルは、Webサービス・データ・コントロールの作成時に新規Webサービス・データ・コントロール・ウィザードによって.adf/META-INFディレクトリに生成されるため、明示的に作成する必要はありません(第15.2項「SOAPを使用したWebサービス・データ・コントロールの作成」を参照)。

接続設定を変更するには、connections.xmlファイルを編集します。

15.4 Webサービス・データ・コントロールのエンドポイントの調整

Webサービス・データ・コントロールを作成すると、URIのエンドポイントを変更できます。これは、アプリケーション機能をテスト環境から本番環境に移行する場合などに便利です。

エンドポイントを変更するには、connections.xmlファイルを編集します。

15.5 セキュアなWebサービスへのアクセス

MAFでは保護されたWebサービスと保護されていないWebサービスの両方がサポートされます。詳細は、第29章「MAFアプリケーションの保護」を参照してください。

MAFアプリケーションから保護されたWebサービスにアクセスするには、アプリケーションに追加されたWebサービス・データ・コントロールの構成が必要な場合もあります。

15.5.1 SOAPベースのWebサービスへのアクセスを有効にする方法

該当するOracle Web Services Managerのポリシーが表示されるよう、SOAP Web サービス・データ・コントロールの作成時に確実にポートを選択してください。

SOAPベースのWebサービスでは次の事前定義済のセキュリティ・ポリシーがサポートされます。

- oracle/wss_http_token_client_policy

- oracle/wss_http_token_over_ssl_client_policy

- oracle/http_basic_auth_over_ssl_client_policy

- oracle/wss_username_token_client_policy

- oracle/wss_username_token_over_ssl_client_policy

これらのポリシーとその使用法の説明については、『Oracle Fusion Middleware Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理』の「使用する事前定義済ポリシーの決定」と「事前定義済ポリシー」の各章を参照してください。

SOAP Webサービスが保護されている場合は、oracle/wss_http_token_over_ssl_client_policyまたはoracle/wss_http_token_client_policyのいずれかでWebサービス・データ・コントロールを構成することでアクセスが可能になります。これを行うには、図15-3に示す「データ・コントロール・ポリシーの編集」ダイアログを使用します。このダイアログは次の方法で開くことができます。

- プロジェクト・エクスプローラで、アプリケーションのビュー・コントローラ・プロジェクト内にある.dcxファイルを選択します。

- 「構造」ウィンドウで、構成が必要なWebサービス・データ・コントロールを右クリックし、ポップアップ・メニューから「Webサービス・セキュリティの定義」を選択します。

図15-3 Webサービス・データ・コントロール・ポリシーの編集

注意:
OEPEでは、Webサービス・ポリシーの定義は(アプリケーション・ワークスペースのMETA-INFディレクトリにある) wsm-assembly.xmlファイルに格納されます。

15.5.2 資格証明の挿入に関する必知事項

保護されたWebサービスにおけるユーザーの資格証明は、Webサービス・リクエストの起動時にそのリクエストに動的に挿入されます。

MAFではOracle Web Services Manager (OWSM) Mobile Agentを使用してWebサービス・リクエストによってユーザーIDを伝播させます。

Webサービスを起動する前に、ユーザーは、保護されたMAFアプリケーション機能の呼出しまたはアクセス制御サービス(ACS)で制御されたアプリケーションの起動を試みるユーザーによってトリガーされた認証プロンプトに応答する必要があります。後者では、アプリケーションでACS URLを使用してデフォルトのログイン・サーバーを定義し、user.roles設定に依存する制約を持つ機能を少なくとも1つは備えておく必要があります。ユーザーの資格証明は、資格証明ストアに格納されます。この資格証明ストアは、認証プロバイダのサーバーURLおよびユーザーと関連付けられた資格証明の格納に使用される、デバイス・ネイティブかつローカルなリポジトリです。実行時に、MAFでは、すべての資格証明がその使用前にIDM Mobile資格証明ストアに格納されているものとみなします。

connections.xmlファイルには、Webサービスの接続参照のadfCredentialStoreKey属性に、ログイン・サーバー接続のadfCredentialStoreKey属性の値を指定して、ログイン・サーバーをWebサービスのセキュリティに関連付ける必要があります(次の2つの例を参照)。

次の例は、Webサービス接続を定義する方法を示しており、adfCredentialStoreKey="MyAuth"として参照されるWebサービス接続の定義を示しています(ここで、MyAuthとは、ログイン接続の参照名です)。

<Reference name="URLConnection1"
className="oracle.adf.model.connection.url.HttpURLConnection"
adfCredentialStoreKey="MyAuth"
xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="URLConnection1">
<Contents>
<urlconnection name="URLConnection1"
url="http://myhost.us.example.com:7777/
SecureRESTWebService1/Echo">
<authentication style="challange">
<type>basic</type>
<realm>myrealm</realm>
</authentication>
</urlconnection>
</Contents>
</XmlRefAddr>
<SecureRefAddr addrType="username"/>
<SecureRefAddr addrType="password"/>
</RefAddresses>
</Reference>

次の例は、ログイン接続の定義を示しています(ここでのMyAuthは、ログイン・サーバー接続における資格証明ストア・キーの値として使用されます)。

<Reference name="MyAuthName"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="MyAuth"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://172.31.255.255:7777/
SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<logout url="http://172.31.255.255:7777/
/SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<accessControl url="http://myhost.us.example.com:7777/
UserObjects/jersey/getUserObjects" />
<idleTimeout value="10"/>
<sessionTimeout value="36000"/>
<userObjectFilter>
<role name="testuser1_role1"/>
<role name="testuser2_role1"/>
<privilege name="testuser1_priv1"/>
<privilege name="testuser2_priv1"/>
<privilege name="testuser2_priv2"/>
</userObjectFilter>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

認証の失敗によってWebサービス・リクエストが拒否された場合は、MAFにより適切な例外が戻され、適切なアクションが起動されます(第30.4項「ロギングの使用方法と構成」を参照)。既存の例外で状況を適切に示せない場合は、新しい例外が追加されます。

connections.xmlファイルは構成サービスの下でデプロイされ、管理されています。詳細は、第17章「MAFアプリケーションで使用するエンド・ポイントの構成」を参照してください。

FAR内のconnections.xmlファイルは、MAFアプリケーションのデプロイ時に集約されます。資格証明はデプロイメント固有のデータを表しており、FAR内に格納することは想定されていません。

15.5.3 セキュアなWSDLファイルの使用制限

MAFアプリケーションではWSDLファイルへのアクセスを実行時に認証なしに行えるようにする必要があるため、基本認証によって保護されたSOAP WebサービスでセキュアなWSDLファイルを使用することはできません。

WSDLの保護が目的の場合は次の点を考慮してください。WSDLファイルはWebサービスのGETメソッドによってフェッチされるため、GETメソッドを除く各Webサービス・メソッドを保護する場合は、セキュアなWSDLを使用できます。GETメソッドを保護する場合は、WSDLを保護しないようにします。

15.6 JavaからのWebサービスの起動

MAFアプリケーションでは、JavaコードからWebサービス層を起動して、その結果をJavaメソッドで使用できます。

MAFでは、使用可能なGenericTypeBeanSerializationHandlerユーティリティ・クラスが提供され、POJO (JavaBeansオブジェクト)とMAFのGenericTypeオブジェクトとの間で次の変換ルールのセットに基づいて変換が実行されます。

1. POJOからGenericTypeオブジェクトに変換する場合:

- プロパティの決定に標準JavaBeansの反映ルールが使用されます。

- 変換プロセスでは一時プロパティが無視されます。

- 読取り可能プロパティはGenericType属性に変換されます。

- 配列プロパティはGenericType内で繰返し属性として表されます。

- マッピング・プロパティはGenericType内で個別の属性として表されます。

- 非プリミティブ・プロパティはネストされたGenericTypeオブジェクトとして表されます。

2. GenericTypeオブジェクトからPOJOに変換される場合:

- プロパティの決定に標準JavaBeansの反映ルールが使用されます。

- 変換プロセスでは一時プロパティが無視されます。

- 書込み可能プロパティはGenericType属性に変換されます。

- GenericType内の繰返し属性は配列オブジェクトに変換されます。

- POJOにMapインタフェースが実装されている場合は、標準アクセッサを介して設定できないすべてのプロパティがMapのsetメソッドを介してPOJOに設定されます。

- 非プリミティブ属性はネストされたPOJOオブジェクトとして表されます。

このヘルパーAPIを使用する利点は、Webサービスから受け取ったレスポンスを取得して、1回のコールでJavaBeanに変換できることです。

たとえば、Webサービスは、ビジネス・ロジック全体で再利用する必要があるEmployeeオブジェクトを渡したり戻したりします。このオブジェクトには次のプロパティ・セットがあります。

- String型のname

- address (street、city、stateおよびzipcodeの各属性を持つ複合オブジェクト)

- long型のid

- float型のsalary

- String型のphone(複数のphoneになる可能性もある)

- String型のpassword(このpasswordはバックエンドのWebサービスに送信しないでください)

次の例は、考えられるEmployeeオブジェクトのコードを示しています。

public class Employee {

protected String name;
protected Address address;
protected long id;
protected float salary;
protected String[] phone;
protected transient String password;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Address getAddress() {
return address;
}

public void setAddress(Address address) {
this.address = address;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public float getSalary() {
return salary;
}

public void setSalary(float salary) {
this.salary = salary;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public void setPassword(String password) {
this.password = password;
}

public String[] getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

次の例は、EmployeeクラスのAddressオブジェクトのコードとして考えられるものを示しています。

public class Address {

protected String street;
protected String city;
protected String state;
protected String zipcode;

public String getStreet() {
return street;
}

public void setStreet(String street) {
this.street = street;
}

public String getCity() {
return city;
}

public void setCity(String city)  {
this.city = city;
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public String getZipcode() {
return zipcode;
}

public void setZipcode(String zipcode)  {
this.zipcode = zipcode;
}

変換ルールについては次に注意します。

1. passwordは一時的に定義されるため、変換アルゴリズムに対しては無視されます。

2. name、address、idおよびsalaryにはすべてgetメソッドおよびsetメソッドがあるため、それらはすべてGenericTypeとの間で変換が行われます。

3. プロパティ・タイプに基づき、oracle.adfmf.misc.ConverterクラスのcoerceToType(Object, Class)メソッドの定義に従って、プロパティをタイプ間で強制変換できます。

4. addressなどの複合オブジェクトは、変換アルゴリズムによって再帰的に処理することで、変換の方向により、子であるGenericTypeを構築するか、POJO複合オブジェクトを作成してデータを移入します。

5. phoneはStringオブジェクトの配列で、それぞれが一意の電話番号を表しており、またこの要素のカーディナリティは2以上のため、変換アルゴリズムによってGenericTypeオブジェクト内のphone属性におけるすべての組合せが検索され、それらが配列として表される他、Bean上ではsetPhoneメソッドが起動されます。GenericTypeBeanSerializationHandlerのtoGenericTypeメソッドでは各配列要素が取得され、個別のphone属性としてtoGenericTypeに追加されます。

次のように定義されている場合:

final String EMPLOYEE_VIRTUAL_BEAN_NAME = "EmployeeDC.Types.Employee";
Employee emp = getEmployee();
GenericType gt = null;

- Employeeオブジェクトは、次のようにGenericTypeに変換されます。

gt = GenericTypeBeanSerializationHelper.toGenericType
(EMPLOYEE_VIRTUAL_BEAN_NAME, emp);

- GenericTypeは次のようにEmployeeオブジェクトに変換されます。

emp = GenericTypeBeanSerializationHelper.fromGenericType
(Employee.class, gt, null);

正常に変換するには次の点を考慮します。

- POJOでは通常、それらに関連付けられたGenericType構造に厳密に従います。

- GenericType構造から外れた場合は、次のいずれかの方法に従います。

1. 追加のBeanプロパティを一時的に宣言します。

2. 操作パラメータとして使用されたときに欠落データをバッキング・サービスが処理できる場合は、POJOからオプション・プロパティを除外できます。

- GenericTypeは、SOAPデータ・コントロールにのみ公開されます。仮想タイプには、toGenericTypeメソッドに渡される、関連付けられた仮想Bean名があります。OEPEの「データ・コントロール」ウィンドウで仮想タイプ上にカーソルを置くことによって仮想Bean名にアクセスできます。通常の名前フォーマットは、<DCName>.Types.<methodName>.<argName>です。

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

15.6.1 Webサービス・オブジェクトの行を追加および削除する方法

MAFを使用すると、プログラムからWebサービス・オブジェクトのイテレータにアクセスして、そのオブジェクトの行を挿入および削除できます。これを行うには、oracle.adfmf.bindings.iterator.BasicIteratorクラスのcreateRowおよびdeleteRowメソッドを使用します。

次の例は、行をWebサービス・オブジェクトに追加する方法を示しています。

String keyFieldNames[] = {"EMPLID","ACAD_CAREER","INSTITUTION"};
String keyFieldValues[] = {"SR12030","UGRD","PSUNV"};
AmxAccessorIteratorBinding  acIter =
(AmxAccessorIteratorBinding)((AdfmfJavaUtilities.getValueExpression
("#{bindings.KEYIterator}", Object.class))
.getValue(AdfmfJavaUtilities.getAdfELContext()));

BasicIterator iter = acIter.getIterator();
GenericType key = (GenericType)iter.getDataProvider();
key.setAttribute("FIELDNAME", keyFieldNames[0]);
key.setAttribute("FIELDVALUE", keyFieldValues[0]);

int totalRowCount = 0;
int currIndex = 0;

for (int i = 1; i < keyFieldNames.length; i++) {
totalRowCount = iter.getTotalRowCount();
currIndex = iter.getCurrentIndex();

System.out.println("Starting to add rows.. \n\t Total Row Count: " +
totalRowCount + "\n\t Current Row Index: " + currIndex);

// Create rows for key iterator
iter.createRow();

totalRowCount = iter.getTotalRowCount();
System.out.println("\t Total Row Count after creating row: " + totalRowCount);

if (iter.hasNext()) {
iter.next();
}

currIndex = iter.getCurrentIndex();
System.out.println("\t Current Row Index after setting current
index to newly added row: " + currIndex);

GenericType key1 = (GenericType)iter.getDataProvider();
key1.setAttribute("FIELDNAME", keyFieldNames[i]);
key1.setAttribute("FIELDVALUE", keyFieldValues[i]);
}

// Execute method

// Add call to execute the action binding to execute the action.
// If this is a web service call, the modified GenericType object
// will be sent to the server and the server will respond appropriately

注意:
ブール入力パラメータの有無にかかわらず、createRowメソッドのシグネチャを使用できます。パラメータを指定せずにこのメソッドを使用した場合、ブール・パラメータの値をtrueに設定してcreateRowを使用した場合と同じ結果が生成されます。createRow()とcreateRow(true)では、どちらも新しい行を作成し、それをイテレータに挿入します。

15.6.2 データ・コントロール操作の起動に関する必知事項

AdfmfJavaUtilitiesのinvokeDataControlMethodメソッドを使用することで、PageDefファイルのmethodActionとして明示的に追加する必要がないデータ・コントロール操作を起動できます。

詳細および例は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

15.7 ブラウザ・プロキシ情報の構成

呼び出すWebサービスが自社ファイアウォールの外部にある場合は、HTTPプロキシ・サーバーを使用できるような適切な構成にJavaシステム・プロパティが設定されていることを確認する必要があります。

デフォルトでは、MAFはiOSとAndroidプラットフォームのシステム設定を使用してプロキシ情報を決定します。たとえば、iOSデバイスの設定ユーティリティを使用してプロキシ情報が設定されている場合、CVMは自動的にその情報を取り込みます。

注意:
MAFアプリケーションごとに異なるプロキシを定義できます。

デバイスの設定からプロキシ情報を取得しない場合は、最初に-Dcom.oracle.net.httpProxySourceシステム・プロパティを追加する必要があります。このプロパティのデフォルト値はnativeで、プロキシ情報をデバイスの設定から取得することを意味します。これを無効にするには、userなど別の値を指定します(例: -Dcom.oracle.net.httpProxySource=user)。

CVMは2つの異なるメカニズムを使用してネットワーク接続を有効にします。

1. 汎用接続フレームワーク(GCF)。このメカニズムを使用する場合、プロキシはシステム・プロパティの-Dcom.sun.cdc.io.http.proxy=<host>:<port>によって定義されます。

2. java.net API。このメカニズムを使用する場合、プロキシは標準のhttp.proxyHostとhttp.proxyPortによって定義されます。

いずれの場合でも、maf.propertiesファイルに3つすべてのプロパティを定義することをお薦めしますが、そうすると次のようになります。

java.commandline.argument=-Dcom.oracle.net.httpProxySource=user
java.commandline.argument=-Dcom.sun.cdc.io.http.proxy=www-proxy.us.mycompany.com:80
java.commandline.argument=-Dhttp.proxyHost=www-proxy.us.mycompany.com
java.commandline.argument=-Dhttp.proxyPort=80

注意:
これらのプロパティはネットワーク・コールのCVM側のみに影響します。

16 RESTサービスの使用

この章では、コードの生成およびRESTサービスへのアクセス、その使用とテストに使用可能なREST APIおよびデータ型を作成できるRESTサービス・エディタについて説明します。

この章の内容は次のとおりです。

- 第16.1項「RESTサービスの使用の概要」

- 第16.2項「RESTクライアントの使用」

- 第16.3項「リクエスト・コンテンツの変更」

- 第16.4項「REST APIのモデル化」

- 第16.5項「データ型のモデル化」

- 第16.6項「RESTサービスに対するモデル化されたリクエストのテスト」

- 第16.7項「RESTサービス・アーティファクトの作成」

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クライアント・ページ

リクエストは次の操作によって変更できます。

- メソッドを選択します。「GET」、「POST」、「PUT」およびDELETEを選択できます。

- URIのフラグメントを使用してサービスの一部のみをアドレス指定します。

- 一致するレスポンスのみが戻されるようにリクエストの一部として問合せを送信します。

- ヘッダーを使用してレスポンスで戻される内容を定義します(コンテンツ・タイプの指定など)。

- 問合せパラメータを使用してレスポンスを構成します(verbose=falseなど)。

- POSTまたはPUTを使用する場合はリクエストの一部として情報を入力し、GETを使用する場合は情報を出力します。

また、RESTクライアント・ページで、RESTサービスからRESTクライアント情報をインポートできます。

16.1.2 REST APIページ

図16-2のREST APIページでは、REST APIをモデル化できます。RESTクライアントを使用してRESTサービスに接続した場合、サーバーからRESTクライアント情報をインポートできます。REST APIはこのページに表示され、その変更をモデル化できます。

図16-2 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クライアント情報をインポートできます。インポートしたデータ型はこのページに表示され、その変更をモデル化できます。

図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.7項「認証を使用する方法」を参照してください。

16.1.5 RESTサービス・エディタを開く方法

RESTサービス・エディタは次の場合に開かれます。

- OEPEアプリケーションで既存のRESTサービス記述を開く場合。

- OEPEで新しいRESTサービス記述を作成する場合。詳細は、第16.1.6項「RESTサービス記述を作成する方法」を参照してください。

16.1.6 RESTサービス記述を作成する方法

RESTサービス記述を作成して、作成済またはMAF 2.1以上に移行済のMAFアプリケーション用にモデル化された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-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.7項「認証を使用する方法」を参照してください。

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 アプリケーションの接続名を使用する方法

RESTクライアントで使用できるURIの特定のタイプがあり、この場合、URIで、RESTサービス記述がその一部となるアプリケーションの接続名を使用します。書式は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ファイルは、adf/META-INFフォルダのMAFアプリケーションのアセンブリ・プロジェクトに含まれます。

2. RESTサービス・エディタのRESTクライアント・ページで、「アドレス」に接続名の入力を開始します。

3. 使用可能な接続のリストから使用する接続を選択し、必要に応じてパスの別の部分を追加します。

認証付きの接続を使用できます。たとえば、アプリケーションで設定された認証を持つ接続に対してconnection://を使用できます。connections.xmlファイルで、接続のHttpURLConnectionに、値の設定されたadfCredentialStoreKeyがあります。

をクリックすると、「認証情報」ダイアログが表示され、接続に関連付けられたユーザー名とパスワードを入力できます。

16.2.1.6 永続接続を作成する方法

現在のセッションのみでなく、いつでも使用できる永続接続を作成できます。永続アドレスは、それらに入力する名前から使用できます。

永続接続を作成する手順:

1. RESTサービス・エディタのRESTクライアント・ページで、をクリックして接続の管理ウィザードを開きます。

2. 図16-7のダイアログで、接続の名前とURLを入力します。ウィザードのこのページでは次のことが可能です。

- をクリックしてURIをテストします。

- をクリックしてブラウザでURIを開きます。

- 接続の認証の詳細を指定する必要がある場合、「認証が必要」を選択してウィザードの残りのページで認証値を入力します。詳細は、第16.2.1.7項「認証を使用する方法」を参照してください。

図16-7 永続接続の作成

16.2.1.7 認証を使用する方法

認証で保護されているRESTサービスに接続する場合、接続情報の一部として認証を入力します。RESTクライアント・ページで、これは次のいずれかの場合です。

- 「アドレス」フィールドにURIを入力してセッション接続を作成する場合、またはをクリックしてアドレス構成ダイアログを開く場合。この場合、をクリックします。
または、すでに適用された認証があるアプリケーション接続を指すconnections:// URIを使用できます。詳細は、第16.2.1.5項「アプリケーションの接続名を使用する方法」を参照してください。

- をクリックして接続の管理ウィザードを開き、永続接続を作成する場合。この場合、HTTP URL接続の作成ページで「認証が必要」を選択します。

RESTサービス・エディタでは、HTTP BasicおよびOAUTH 2接続がサポートされます(第16.2.1.7項「RESTサービス認証」を参照)。

図16-8 RESTサービス認証

- HTTP Basic: サーバーへのリクエスト送信時に使用するユーザー名とパスワードを入力します。

- OAuth 2 (コード権限タイプ): 認可URIを使用した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.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サービスに対してどのようにアプリケーションが実行されるかをテストするなど)。

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.5 データ型のモデル化

RESTサービス・エディタの「データ型」ページでは、データ型を操作できます。RESTクライアントを使用してRESTサービスに接続する場合、エディタによって、接続先のサービスで使用されるデータ型が推測され、ここに表示されます。

図16-15 REST APIのデータ型

図16-15で、Departmentsは、右側にリストされた属性を持つローカル・データ型です。

「データ型」ページの左側の「アウトライン」は、「アウトライン」ウィンドウでも使用できます(図16-16を参照)。

図16-16 「アウトライン」ウィンドウ

16.5.1 データ型を作成する方法

新しい複合データ型または単純データ型を作成できます。

複合データ型を作成する手順:

1. 「ローカル・データ型」を右クリックし、「新」および「複合タイプ」を選択します。

2. 「複合タイプ」で、型の名前を入力します。

3. 「アウトライン」で、新しい型を右クリックし、「新」および「属性」を選択します。

4. 右側の「複合タイプ」の下の「属性」領域で、をクリックしてデータ型の選択ダイアログを開き、使用可能なデータ型のリストから選択できます。

単純データ型を作成する手順:

1. 「ローカル・データ型」を右クリックし、「新」および単純タイプを選択します。

2. 単純タイプで、型の名前を入力します。

16.5.2 データ型をインポートする方法

データ型をEclipseワークスペースまたは外部ファイルからインポートできます。

データ型をインポートする手順:

1. RESTサービス・エディタの「データ型」ページで、をクリックしてデータ型情報のインポート・ウィザードを開きます。

2. 「参照」をクリックし、コンテンツ・ファイルの選択で、JSONペイロードを含むファイルの場所に移動します。別の方法として、JSONペイロードをコピーし、それを直接「コンテキスト」テキスト領域に貼り付けることができます。

3. コンテンツ・ファイルの選択ダイアログで、JSONペイロードの文字セットを入力します(UTF-8など)。

4. データ型情報のインポート・ウィザードで、「次へ」をクリックします。

5. データ型のインポート・ページに、インポートまたはマージされるデータ型のサマリーが表示されます。
既存のドメイン・タイプに一致する型をマージするには、該当するオプションを選択します。

「終了」をクリックします。

16.6 RESTサービスに対するモデル化されたリクエストのテスト

モデル化されたREST APIからRESTサービス・エディタのRESTクライアント・ページにリクエストをコピーして、ライブRESTサービスに対してそれらを実行できます。

モデル化された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選択は異なるパッケージ・スキームに書き込むことをお薦めします。

- サービス・クラスの生成がデフォルトで選択されます。独自のものを記述する場合は選択解除します。

「次へ」をクリックします。

8. サービス・クラス・ページで、次の操作を実行します。

- リストされているリクエストと、それが関連付けられているメソッド名を調査します。メソッド名を変更するには、リクエストを選択して「メソッド名」でメソッド名を編集します。

- 新しいリクエストを追加するには、をクリックしてリクエストの選択ダイアログを開きます。1つ以上のリクエストを選択し(複数選択の場合は[Shift]と[Ctrl]を使用)、「OK」をクリックします。

「次へ」をクリックします。

9. 「サマリー」ページで、指定したオプションを確認します。問題なければ、「終了」をクリックします。「変更の確認」ダイアログが表示されます。続行して問題ない場合、「OK」をクリックします。

16.7.2 Javaアーティファクトを生成する場合の処理

RESTサービスに対して選択されたリクエスト用にコードが生成されます。アーティファクトをすでに生成済で、差異が存在する場合、「Diff」ウィンドウが表示され、保持する変更を調整できます。

生成されたファイルは、プロジェクト・エクスプローラの指定したパッケージ名の下にリストされます(図16-17を参照)。

16.7.3 RESTサービスに対して生成されるアーティファクトについて

RESTサービス・エディタで、モデル化されたREST APIからJAVAアーティファクトを生成する場合、生成されるパッケージには次の3つのタイプがあります。

- datatypes

- restapi

- services

図16-17は、hrというパッケージに作成された、hrrestというアプリケーション用に生成された複数のパッケージを示しています。

図16-17 生成されたファイル

16.7.3.1 生成されるデータ型アーティファクト

datatypeパッケージ(図16-17のhr.datatype)には、次のものがあります。

- データ型ごとに1つのインタフェース。

- データ型インタフェースは、ゲッターおよびセッターとしてモデル化された属性を公開します。

- データ型のインスタンスはリフレクションをサポートします。

- オブジェクト・ファクトリ。

これは図16-18で確認できます(各データ型のインタフェースとオブジェクト・ファクトリがあります)。

図16-18 生成されたデータ型アーティファクト

データ型インタフェースには、ゲッターとセッターが含まれます。この例では、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-19のように、複数のREST APIパッケージが生成されます。

図16-19 生成された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-20に示すとおり、RESTサービス・エディタのREST APIページのgetDepartmentsリクエストに反映されます(ここで、HTTPヘッダーはAccept=application/jsonで、出力はデータ型Departmentsの表現です)。

図16-20 REST APIページのgetDepartments

16.7.3.3 生成されるサービス・アーティファクト

生成されたサービス・パッケージ(図16-21を参照)には、リクエストを定義するパスごとに1つのPOJOが含まれます(リクエストを含まないルートは除く)。POJOは、データ・コントロールで使用できるクラスで、他のパッケージのコンテンツを使用する方法に関するガイダンスになります。

図16-21 生成されたサービス・アーティファクト

この例で、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アプリケーションで使用できます。

17 MAFアプリケーションで使用するエンド・ポイントの構成

この章では、構成サービスを使用して、MAFアプリケーションで使用するエンド・ポイントを構成する方法について説明します。

この章には次の項が含まれます:

- 第17.1項「エンド・ポイントの構成の概要」

- 第17.2項「構成サービス・エンド・ポイントの定義」

- 第17.3項「構成サービス用のユーザー・インタフェースの作成」

- 第17.4項「URLの構造について」

- 第17.5項「サーバーでの構成サービスの設定」

- 第17.6項「構成サービスAPIの移行」

17.1 エンド・ポイントの構成の概要

構成サービスは、Webサービス、ログイン・ユーティリティ、MAFアプリケーションのその他の部分によって使用されるエンド・ポイントを構成できるツールです。

17.2 構成サービス・エンド・ポイントの定義

エンド・ポイント(またはシード) URLはconnections.xmlファイルで定義され、新しい接続エントリをそのファイルに追加する必要があります。新しい接続は、HttpURLConnection型で、url値が構成サーバー・エンド・ポイント(またはシード) URLを指し、nameが最終的にJavaBeanコードで参照される任意の値に設定されている必要があります。

次の例は、connections.xmlファイルでの構成サービス・エンド・ポイントの定義方法を示しています。

<Reference name="ConfigServiceConnection"
className="oracle.adf.model.connection.url.HttpURLConnection"
credentialStoreKey="ConfigServiceConnection"
adfCredentialStoreKey="ConfigServerLogin"
xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="ADFMFSecuredConfigServer">
<Contents>
<urlconnection name="ADFMFSecuredConfigServer"
url="http://127.0.0.1"/>
<authentication style="challange">
<type>basic</type>
<realm>myrealm</realm>
</authentication>
</urlconnection>
</Contents>
</XmlRefAddr>
<SecureRefAddr addrType="username"/>
<SecureRefAddr addrType="password"/>
</RefAddresses>
</Reference>
<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"/>
<accessControl url=""/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<authenticationMode value="remote"/>
<rememberCredentials>
<enableRememberUserName value="true"/>
<rememberUserNameDefault value="true"/>
<enableRememberPassword value="false"/>
<enableStayLoggedIn value="true"/>
<stayLoggedInDefault value="true"/>
</rememberCredentials>
<userObjectFilter/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

構成サーバーに対するセキュリティが有効な場合は、connections.xmlファイルに次の追加の定義を含める必要があります。

- URL接続と同じエンド・ポイント(またはシード) URLを指すログイン接続が必要です。ログイン接続とHttpURLConnectionは同じadfCredentialStoreKeyを共有する必要があります。

エンド・ポイントURLは、エンド・ユーザーからの取得が必要になり、connections.xmlに設定できない場合があります。その場合は、ユーザー・インタフェースを作成し、エンド・ポイントURLの値を取得してアプリケーション・プリファレンスに設定できます。アプリケーション・プリファレンスの値は、JavaBeanメソッドで使用して接続URLの値をオーバーライドできます(次の例を参照)。

AdfmfJavaUtilities.overrideConnectionProperty("ConfigServerConnection",
"login",
"url",
<Endpoint_URL>);

17.3 構成サービス用のユーザー・インタフェースの作成

構成サービスのユーザー・インタフェースが必要な場合は、新規または既存のアプリケーション機能内に作成する必要があります。

MAFでは、oracle.adfmf.config.client.ConfigurationServiceクラス内で一連のAPIが提供され、サーバー上の新しい変更を確認して更新内容をダウンロードできます。JavaBeanでこれらの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);

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

17.4 URLの構造について

構成サービスの各管理対象リソースへのURLが構築されています。これには、次のようにアプリケーションIDとファイル名が含まれています。

URLのhttp://my.server.com:port/SomeLocationとアプリケーションIDのcom.mycompany.appnameがユーザーによって指定されている場合は、次のURLを使用して構成ファイルをダウンロードします。

http://my.server.com:port/SomeLocation/com.mycompany.appname/connections.xml
http://my.server.com:port/SomeLocation/com.mycompany.appname/maf-config.xml
http://my.server.com:port/SomeLocation/com.mycompany.appname/maf-config.xml

17.5 サーバーでの構成サービスの設定

構成サービスは、HTTP GETリクエストを受け入れてconnections.xmlファイルを返すサービスとして実装できます。

構成サービス・クライアントによって使用されるURLの形式は、次のとおりです。

adf-config.xml/アプリケーション・バンドルIDで構成されたURL/connections.xml

構成サービスのエンド・ポイントは、HTTPおよびHTTPSを経由する基本認証(BASIC_AUTH)を使用して保護できます。

17.6 構成サービスAPIの移行

アプリケーションがMAFの旧リリースを使用して作成されていて、そのアプリケーションが構成サービスを使用する場合、手動で移行を行う必要があります。

移行の主な理由は、MAFの現在のリリースでは、構成サービスの機能の有効化で重要な役割を果たした次のAPI、プロパティ、ユーティリティがサポートされなくなったからです。

- MAFでは、サービスを有効化するためのuse-configuration-service-at-startupプロパティとエンド・ポイントURLを指定するadfmf-configuration-service-seed-urlプロパティを設定することで、adf-config.xmlファイルから構成サービスを操作できました。

- checkForUpdates APIでは構成サービスの更新を確認できました。

- 構成サービスはMAFが提供するUIから開始されました。

移行を始めるには、第17.2項「構成サービス・エンド・ポイントの定義」に記載されているように、エンド・ポイント(またはシード) URLをadf-config.xmlファイルからconnections.xmlファイルに移動させ、新しい接続要素をconnections.xmlファイルに追加する必要があります。

現在のリリースのMAFでは構成サービスのユーザー・インタフェースは提供されていないので、ユーザー・インタフェースが必要だと想定して、新規または既存のアプリケーション機能内でユーザー・インタフェースを作成する必要があります。詳細は、第17.3項「構成サービス用のユーザー・インタフェースの作成」を参照してください。

18 MAF AMXでのローカル・データベースの使用方法

この章では、MAFモバイル・アプリケーションを使用したローカルSQLiteデータベースの使用方法について説明します。

この章には次の項が含まれます:

- 第18.1項「ローカルSQLiteデータベースの使用方法の概要」

- 第18.2項「ローカルSQLiteデータベースの使用方法」

18.1 ローカルSQLiteデータベースの使用方法の概要

SQLiteは、特に埋込みアプリケーション用に設計されたリレーショナル・データベース管理システム(RDBMS)です。

SQLiteには次の特性があります。

- ACID準拠: 他の従来のデータベース・システムと同様に、原子性、一貫性、独立性および永続性という特性を備えています。

- 軽量: アプリケーション内に直接埋め込むように設計された小さなCライブラリでデータベース全体が構成されています。

- 移植性: 様々な範囲のコンピュータ・アーキテクチャおよびオペレーティング・システム間でバイナリ互換性がある単一ファイルでデータベースは自己完結型となります。

詳細は、SQLite Webサイト(http://www.sqlite.org)を参照してください。

ローカルSQLiteデータベースの使用例は、StockTrackerと呼ばれるMAFのサンプル・アプリケーションを参照してください(「ファイル」→「新」→「MAFサンプル」にあります)。詳細は、第18.2.8項「StockTrackerサンプル・アプリケーションに関する必知事項」を参照してください。

18.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)

18.1.1.1 同時実行性

SQLiteデータベースの単一インスタンスは、常に、単一の読取り/書込み接続または複数の読取り専用接続のいずれかを持つことができます。

ロック・メカニズムが粗いため、SQLiteでは、同一のデータベース・インスタンスに対する複数の読取り/書込み接続がサポートされていません。詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『File Locking And Concurrency In SQLite Version 3』(http://www.sqlite.org/lockingv3.html)を参照してください。

18.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)を参照してください。

18.1.1.3 データ型

大部分のデータベース・システムは強く型指定をしているのに対して、SQLiteは動的な型指定のため、宣言された型とは無関係にどの列にどの値を格納することもできます。たとえば、数値列に文字列値が間違って格納された場合でも、SQLiteではエラーは戻されません。詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『Datatypes In SQLite Version 3』(http://www.sqlite.org/datatype3.html)を参照してください。

18.1.1.4 外部キー

SQLiteは外部キーをサポートします。これは、外部キー制約を解析および強制します。詳細は、http://www.sqlite.org/foreignkeys.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『SQLite Foreign Key Support』を参照してください。

18.1.1.5 データベース・トランザクション

SQLiteはACID準拠であるためトランザクションをサポートしていますが、SQLiteとOracleのトランザクション・サポートの間には基本的な相違点がいくつか存在します。

- ネストされたトランザクション: SQLiteでは、ネストされたトランザクションをサポートしません。単一のトランザクションのみを常時アクティブにできます。

- コミット: SQLiteは、任意の指定されたデータベースに対し、複数の読取り専用接続または単一の読取り/書込み接続のいずれかを許容します。したがって、同一のデータベースに対して複数の接続がある場合は、データベースの変更を試みる最初の接続のみが成功します。

- ロールバック: SQLiteでは、開いているすべてのResultSetsを閉じるまではトランザクションのロールバックができません。

詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『Distinctive Features of SQLite』(http://www.sqlite.org/different.html)を参照してください。

18.1.1.6 認証

SQLiteでは、ロールベースまたはユーザーベースの認証はどの形式もサポートしていません。デフォルトで、どのユーザーもファイル内のすべてのデータにアクセスできます。ただし、MAFでは、使用可能な暗号化ルーチンを提供することで、データを保護し、有効な資格証明セットを持たないユーザーによるアクセスを防ぎます。詳細は、第18.2.7項「データベースの暗号化および復号化する方法」を参照してください。

18.2 ローカルSQLiteデータベースの使用方法

MAFには、暗号化されたSQLite 3.7.9データベースが含まれています。

通常SQLiteを使用する場合は、次のことを知っておく必要があります。

- データベースへの接続方法

- SQLスクリプトを使用してデータベースを初期化する方法またはデスクトップ上でデータベースを初期化する方法

- データベースを暗号化および復号化する方法

- VACUUMコマンドの使用方法

18.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がスローされます。

18.2.2 SQLスクリプトを使用してデータベースを初期化する方法

通常、アプリケーションの起動時にSQLスクリプトを使用してデータベースを初期化できます。次の例は、サポートされたSQL構文(第18.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);
}
}

18.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);
}
}

18.2.4 コミット処理に関する必知事項

Commit文があってもこれは無視されます。各文は、SQLスクリプトから読み込まれる際にコミットされます。この自動コミット機能は、SQLiteデータベースによってデフォルトで提供されます。アプリケーションのパフォーマンスを向上させるには、自動コミットを無効にして、ConnectionのsetAutoCommit(false)メソッドを使用することによるcommit文の通常の実行を可能にします。

18.2.5 MAFでのSQLite JDBCドライバの制限

java.sqlパッケージからの次のメソッドは、MAF内では制限があるか、サポートされていません。

- ResultSetのgetByteメソッドはサポートされていません。このメソッドを使用した場合は、実行時にメソッドからSQLExceptionがスローされます。

- (ResultSetを戻す文に対してのみtrueを戻すのとは対照的に)Statementのexecuteメソッドは常にtrueを戻します。

18.2.6 VACUUMコマンドの使用方法

SQLiteデータベースからレコードが削除される場合、そのサイズは変更されません。これにより断片化が発生し、最終的にはパフォーマンスが低下します。これを防ぐには、定期的にVACUUMコマンドを実行します。

注意:
大規模なデータベースに対してVACUUMを実行すると、非常に長い時間がかかる場合があります(SQLiteが開発されたLinuxコンピュータで1MB当たり約0.5秒)。さらに、このコマンドの実行中は、元のファイルの2倍の一時ディスク領域が使用されます。

通常、VACUUMコマンドは、適切に登録されているLifeCycleListener実装から実行されます。

18.2.7 データベースを暗号化および復号化する方法

MAFでは、初期またはそれ以降に各種APIを使用して暗号化したSQLiteデータベースを提供できます。一部のAPIでは、データベースの暗号化に独自のパスワードを指定できます。MAFにパスワードを生成させる場合、または(オプションで)管理させる場合は、他のAPIを使用します。

独自のパスワードでデータベースを暗号化するには、次の手順を実行します。

1. データベース接続を確立します(第18.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. データベース接続を確立します(第18.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");

18.2.8 StockTrackerサンプル・アプリケーションに関する必知事項

StockTrackerサンプル・アプリケーションは、このアプリケーション内にパッケージ化されているカスタムのSQLiteデータベース・ファイルを使用します。このデータベース・ファイルには4つのレコードが含まれた表があり、そこには4つの株価に関する情報が含まれてます。アプリケーションがアクティブ化されると、表からデータを読み取り、4つの株価を表示します。この株価に関する情報はCRUD操作の対象となるため、ユーザー・インタフェースから、株価を作成、並替え、更新および削除できます。株価の並替えを含むすべてのCRUD操作は、SQLiteデータベースで更新されます。

19 カスタムMAF AMX UIコンポーネントの作成

この章では、カスタムMAF AMX UIコンポーネントの作成方法および開発環境の一環としてそれらを指定する方法について説明します。

この章には次の項が含まれます:

- 第19.1項「カスタムUIコンポーネントの作成の概要」

- 第19.2項、「MAF APIを使用したカスタム・コンポーネントの作成」

- 第19.3項「カスタム・コンポーネントの作成」

19.1 カスタムUIコンポーネントの作成の概要

JavaScriptおよびMAFで提供されるAPIの組合せを使用して、新しい完全に機能するインタラクティブUIコンポーネントを作成でき、MAF AMXアプリケーション機能で使用されるタグ・ライブラリにそれらを追加できます。

19.2 MAF APIを使用したカスタム・コンポーネントの作成

MAFには、カスタム・コンポーネントを作成するための次のAPIが用意されています。

- 静的API (第19.2.1項「静的APIの使用方法」を参照)

- AmxEventクラス(第19.2.2項「AmxEventクラスの使用方法」を参照)

- TypeHandler (第19.2.3項「TypeHandlerの使用方法」を参照)

- AmxNode (第19.2.4項「AmxNodeの使用方法」を参照)

- AmxTag (第19.2.5項「AmxTagの使用方法」を参照)

- VisitContext (第19.2.6項「VisitContextの使用方法」を参照)

- AmxAttributeChange (第19.2.7項「AmxAttributeChangeの使用方法」を参照)

- AmxDescendentChanges (第19.2.8項「AmxDescendentChangesの使用方法」を参照)

- AmxCollectionChange (第19.2.9項「AmxCollectionChangeの使用方法」を参照)

- AmxNodeChangeResult (第19.2.10項「AmxNodeChangeResultの使用方法」を参照)

- AmxNodeStates (第19.2.11項「AmxNodeStatesの使用方法」を参照)

- AmxNodeUpdateArguments (第19.2.12項「AmxNodeUpdateArgumentsの使用方法」を参照)

19.2.1 静的APIの使用方法

表19-1に、カスタムUIコンポーネントの作成に使用できる静的APIを示します。

表19-1 静的API

戻り型

関数名

パラメータ

説明

Function

adf.mf.api.amx.TypeHandler.register

String namespaceUrl,

String tagName,

adf.mf.api.amx.TypeHandler precreatedClass

TypeHandler クラスをタグ・ネームスペースおよび名前で登録します。

プロトタイプの関数を追加できるように、登録されたadf.mf.api.amx.TypeHandlerサブクラスを返します。

precreatedClassはオプションですが、adf.mf.api.amx.TypeHandlerを継承するクラスを最初に作成した場合は使用できます。

void

adf.mf.api.amx.addBubbleEventListener

Node domNode,

String eventType,

Function listener,

Object eventData

バブル・イベント・リスナーを登録します(tap、taphold、keydown、touchstart、touchmove、touchend、focus、blur、resizeなど)。

WebブラウザはすべてのDOMノード上ですべてのイベント・タイプをサポートしないことに注意してください(詳細は、ブラウザのドキュメントを参照してください)。

eventDataはオプションで、そのリスナー機能で使用可能にするための追加データとして機能します。

void

adf.mf.api.amx.removeBubbleEventListener

Node domNode,

String eventType,

Function listener

adf.mf.api.amx.addBubbleEventListenerを介して追加されたバブル・イベント・リスナーを登録解除します。

メタ・イベントのtapおよびtapholdを削除すると、削除される指定されたリスナーからのみではなく、すべてのtouchstartリスナーおよびtouchendリスナー(その他のメタ・イベントのものを含む)が要素から削除されることになります。

void

adf.mf.api.amx.addDragListener

Node domNode,

Object payload,

Object eventData

要素に対して、MAF AMXドラッグ・イベントのトリガーを許可します。

Object payloadは、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パッケージにあり、ロギング、変換およびデータ・チャネルに使用できます。

19.2.2 AmxEventクラスの使用方法

表19-2に、カスタムUIコンポーネントの作成時に使用できるAMXEventクラスをリストします。

表19-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も参照してください。

19.2.3 TypeHandlerの使用方法

表19-3に、カスタムUIコンポーネントの作成に使用できるTypeHandlerのAPIをリストします。

表19-3 TypeHandler API

戻り型

関数名

パラメータ

説明

HTMLElement

render

adf.mf.api.amx.AmxNode amxNode,

String id

初期DOM構造を作成し、その構造のルート要素を返します。

このメンバー関数は必須であり、定義する必要があります。

void

init

HTMLElement rootElement,

adf.mf.api.amx.AmxNode amxNode

このコンポーネントを使用して作成されたコンポーネントのセットに属するすべてのcreate関数が起動された後に起動されるハンドラを表します。

void

postDisplay

HTMLElement rootElement,

adf.mf.api.amx.AmxNode amxNode

このコンポーネントを使用して作成されたコンポーネントのセットに属するすべてのinit関数が起動された後に起動されるハンドラを表します。

Boolean

createChildrenNodes

adf.mf.api.amx.AmxNode amxNode

処理のためにAmxNodeの子を選択的に追加します。子のうちの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

新しいビューが表示された後および古いビューが削除された後のすべてを処理します。

19.2.4 AmxNodeの使用方法

表19-4に、カスタムUIコンポーネントの作成に使用できるAmxNodeのAPIをリストします。

表19-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の場合、タグは処理されません。

19.2.5 AmxTagの使用方法

表19-5に、カスタムUIコンポーネントの作成に使用できるAmxTagのAPIをリストします。

表19-5

戻り型

関数名

パラメータ

説明

String

getNamespace

なし

タグのXMLネームスペースURIを取得します。

String

getNsPrefixedName

なし

ネームスペースを含むタグ名をその接頭辞(ローカルのxmlns接頭辞ではなく)として返します。

これは、http://xmlns.example.com/custom:customなどのXML完全名です。

String

getName

なし

タグ名を取得します。

これは、接頭辞なしのローカルXMLタグ名です。

adf.mf.api.amx.AmxTag

getParent

なし

親タグまたは最上位の場合はnullを取得します。

String

getTextContent

なし

タグのテキスト・コンテンツを返します。

Array<adf.mf.api.amx.AmxTag>

findTags

String namespace,

String tagName

指定されたネームスペースおよびタグ名を使用して、タグ階層でタグを再帰的に検索します。

一致する場合は現在のタグを返します。

Array<adf.mf.api.amx.AmxTag>

getChildren

String namespace,

String tagName

タグの子を取得します。

子のネームスペースおよびタグ名に対するオプションのフィルタ処理を指定します。ネームスペースがnullの場合、すべての子が返されます。tagNameがnullの場合、子はタグ名でフィルタ処理されません。

Array<adf.mf.api.amx.AmxTag>

getChildrenFacetTags

なし

すべての子ファセット・タグを取得します。

この関数は、AmxNode処理の作成を支援します。

adf.mf.api.amx.AmxTag

getChildFacetTag

String name

指定された名前のファセット・タグを取得します。

この関数は、ファセットの存在がタイプ・ハンドラの動作を変更する場合にコードを支援します。

ファセットが見つからない場合はnullを返します。

Array<adf.mf.api.amx.AmxTag>

getChildrenUITags

なし

UIタグであるすべての子タグを取得します。

この関数は、AmxNode処理の作成に役立ちます。

この関数はファセット・タグを返しません。

Array<String>

getAttributeNames

なし

タグで指定されている属性の属性名をすべて取得します。

Boolean

isAttributeElBound

String name

指定されている属性がEL式にバインドされているかどうか(静的値ではなく)を特定します。

String

getAttribute

String name

指定された名前の属性の属性値(EL文字列の場合があります)を取得します。

属性が指定されていない場合は、未定義が返されます。

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

なし

このタグのタイプ・ハンドラを取得します。

19.2.6 VisitContextの使用方法

表19-6に、カスタムUIコンポーネントの作成時に使用できるVisitContextのAPIをリストします。

表19-6 VisitContext API

戻り型

関数名

パラメータ

説明

Boolean

isVisitAll

なし

すべてのノードが訪問可能かどうかを特定します。

Array<adf.mf.api.amx.AmxNode>

getNodesToWalk

なし

訪問の際に訪問する必要のあるノードを取得します。

このリストには、訪問すべきノード(コールバックが起動されました)を含む必要はありません。

Array<adf.mf.api.amx.AmxNode>

getNodesToVisit

なし

訪問するノードのリストを取得します。

Array<adf.mf.api.amx.AmxNode>

getChildrenToWalk

adf.mf.api.amx.AmxNode parentAmxNode

指定された親AmxNodeの訪問すべき子AmxNodeインスタンス(存在する場合はファセットを含む)を特定します。

タイプ・ハンドラに対して、すべての子を訪問しない場合の子の訪問方法の最適化を許可します。

nullを返す場合があります。

19.2.7 AmxAttributeChangeの使用方法

表19-7に、カスタムUIコンポーネントの作成時に使用できるAmxAttributeChangeのAPIをリストします。

表19-7 AmxAttributeChange API

戻り型

関数名

パラメータ

説明

Array<String>

getChangedAttributeNames

なし

現在の変更に影響を受けた属性の名前を取得します。

Boolean

isCollectionChange

String name

属性の変更がコレクション変更かどうかを特定します。

adf.mf.api.amx.AmxCollectionChange

getCollectionChange

String name

属性のコレクション・モデルの変更情報を取得します。使用できる変更オブジェクトがない場合はnullを返します。

String

getOldValue

String name

変更が実行される前の属性の値を取得します。

Boolean

hasChanged

String name

指定された名前の属性が変更されたかどうかを特定します。

Number

getSize

なし

属性の変更数を取得します。

19.2.8 AmxDescendentChangesの使用方法

表19-8に、カスタムUIコンポーネントの作成時に使用できるAmxAttributeChangeのAPIをリストします。

表19-8 AmxDescendentChanges API

戻り型

関数名

パラメータ

説明

Array<adf.mf.api.amx.AmxNode>

getAffectedNodes

なし

レンダリング前の変更済の子孫AmxNodeインスタンスを取得します。

adf.mf.api.amx.AmxAttributeChange

getChanges

adf.mf.api.amx.AmxNode amxNode

指定されたAmxNodeの変更を取得します。

adf.mf.api.amx.AmxNodeStates

getPreviousNodeState

adf.mf.api.amx.AmxNode amxNode

変更が適用される前の子孫AmxNodeの状態を取得します。

19.2.9 AmxCollectionChangeの使用方法

表19-9に、カスタムUIコンポーネントの作成時に使用できるAmxCollectionChangeのAPIをリストします。

表19-9 AmxCollectionChange API

戻り型

関数名

パラメータ

説明

Boolean

isItemized

なし

コレクションに対する変更が項目化される可能性があるかどうかを特定しますが、そのコレクションのキーおよび要素は識別されているため、TypeHandlerは、リスト全体を最初から再レンダリングするのではなく、適切な項目のみを更新できます。

Array<String>

getCreatedKeys

なし

作成されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getDeletedKeys

なし

削除されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getUpdatedKeys

なし

更新されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getDirtiedKeys

なし

ダーティな状態のキーの配列、または変更を項目化できない場合はnullを取得します。

19.2.10 AmxNodeChangeResultの使用方法

表19-10に、カスタムUIコンポーネントの作成時に使用できるAmxNodeChangeResultのAPIをリストします。

表19-10 AmxNodeChangeResult API

メンバー

説明

adf.mf.api.amx.AmxNodeChangeResult["NONE"]

レンダリングされていない子孫AmxNode上の属性変更に対応してアクションは行いません。

adf.mf.api.amx.AmxNodeChangeResult["REFRESH"]

属性およびその子AmxNodeインスタンスはタイプ・ハンドラによって更新済で、DOMはタイプ・ハンドラのrefresh関数によって更新されます。

adf.mf.api.amx.AmxNodeChangeResult["RERENDER"]

AmxNodeおよびその子AmxNodeインスタンスがタイプ・ハンドラによって更新済ですが、DOMは、AmxNode階層を変更する必要がないため、refresh関数がタイプ・ハンドラでコールされない場合にのみ再作成する必要があります。

adf.mf.api.amx.AmxNodeChangeResult["REPLACE"]

タイプ・ハンドラは変更を処理できません。DOMおよびAmxNode階層は再作成される必要があります。

この値は、タイプ・ハンドラ上のupdateChildrenメソッドからのみ返され、getDescendentChangeActionメソッドからは返すことができません。

19.2.11 AmxNodeStatesの使用方法

表19-11に、カスタムUIコンポーネントの作成時に使用できるAmxNodeStates APIを示します。

表19-11 AmxNodeStates API

メンバー

説明

adf.mf.api.amx.AmxNodeStates["INITIAL"]

初期状態。AmxNodeは作成されましたが移入されていません。

adf.mf.api.amx.AmxNodeStates["WAITING_ON_EL_EVALUATION"]

レンダリングに必要なELベースの属性はまだ完全にロードされていません。

adf.mf.api.amx.AmxNodeStates["ABLE_TO_RENDER"]

EL属性はロードされましたが、AmxNodeはまだレンダリングされていません。

adf.mf.api.amx.AmxNodeStates["PARTIALLY_RENDERED"]

ELはまだ完全にロードされていませんが、AmxNodeは部分的にレンダリングされました(今後の使用のために予約済)。

adf.mf.api.amx.AmxNodeStates["RENDERED"]

AmxNodeは完全にレンダリングされました。

adf.mf.api.amx.AmxNodeStates["UNRENDERED"]

AmxNodeはレンダリングされません。

19.2.12 AmxNodeUpdateArgumentsの使用方法

表19-12に、カスタムUIコンポーネントの作成時に使用できるAmxNodeUpdateArgumentsのAPIをリストします。

表19-12 AmxNodeUpdateArguments API

戻り型

関数名

パラメータ

説明

Array<adf.mf.api.amx.AmxNode>

getAffectedNodes

なし

影響を受けるAmxNodeインスタンスの配列を取得します。

Map<String,Boolean>

getAffectedAttributes

String amxNodeId

指定されたAmxNode IDの影響される属性を表すオブジェクトを取得します。

Map<String,adf.mf.api.amx.AmxCollectionChange>

getCollectionChanges

String amxNodeId

指定されたAmxNodeおよびプロパティのコレクション変更を取得します。

返されるマップは、属性名によってキー設定されます。

AmxNodeに変更がない場合は未定義が返されます。

void

setAffectedAttribute

adf.mf.api.amx.AmxNode amxNode,

String attributeName

AmxNodeの属性を影響を受けたとマークします。

void

setCollectionChanges

String amxNodeId,

String attributeName,

adf.mf.api.amx.AmxCollectionChange collectionChanges

指定されたAmxNodeの属性のコレクション変更を設定します。

19.3 カスタム・コンポーネントの作成

JavaScriptおよびMAF APIを使用して、カスタムUIコンポーネントを作成できます。このコンポーネントのJavaScriptファイルは、アプリケーション機能レベルの包含を介して、プロジェクトに追加できます。カスタム・タグ・ライブラリを追加すると、「コンポーネント」ウィンドウのタグ・ライブラリのリストに組み込まれ、このライブラリが選択されると、カスタム・コンポーネントが「コンポーネント」ウィンドウで使用可能になり、その属性が「プロパティ」ウィンドウに表示されます。

始める前に:

第19.2項、「MAF APIを使用したカスタム・コンポーネントの作成」に記載されているAPIを確認してください。

カスタム・コンポーネントを作成するには、次の手順を実行します。

1. adf.mf.api.amx.TypeHandler.register APIを使用して、タグ・ネームスペースおよび一連の1つ以上のタイプ・ハンドラを登録するJavaScriptファイルを作成します(表19-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サンプル」にあります。

20 リモートURLを使用したアプリケーション機能コンテンツの実装

この章では、デバイス・サービスに対して、リモートURLからのコンテンツを使用するアプリケーション機能をアクセス可能(または制限可能)にする方法について説明します。

この章には次の項が含まれます:

- 第20.1項「リモートURLアプリケーションの概要」

- 第20.2項「アプリケーション・コンポーネントのホワイトリストの作成」

- 第20.3項「リモートURLページでのブラウザ・ナビゲーション・バーの有効化」

- 第20.4項「カスタムURLスキームを使用したMAFアプリケーションの起動」

- 第20.5項「リモート・コンテンツの作成について」

20.1 リモートURLアプリケーションの概要

図20-1に示すように、maf-feature.xmlファイルの概要エディタにあるアプリケーション機能のコンテンツ・タイプをリモートURLとして構成することで、指定されたURLから供給されるブラウザベースのアプリケーションを作成します。このようなサーバー・ホスト型のアプリケーションは、偶発的な使用を目的としている点およびデバイスのメモリーまたはサービス(カメラ、コンタクト先、GPSなど)に直接アクセスできない点で、MAF AMX、ローカルHTML、またはObjective-Cなどのプラットフォーム固有言語で記述されたクライアント・アプリケーションとは異なります。そのかわりに、これらのやり取りはデバイス・ブラウザの機能に左右されます。リモートURLコンテンツの構成の詳細は、第6.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」を参照してください。

図20-1 リモートURLコンテンツの構成

20.1.1 ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化

リモートで供給されるコンテンツのセキュリティを確保するために、MAFはホワイトリスト(GPS、カメラ、ファイル・システムなどの様々なデバイス・サービスにアクセスするためにアプリケーションのWebビュー内で開かれるURLのレジストリ)の概念をサポートしています。Webページがホワイトリストに含まれていない(つまりホワイトリスト化されていない)場合は、そのかわりに、MAFのApache Cordova実装によってデバイス・ブラウザ(Safariなど)でWebページが開かれます。ホワイトリストを使用しないとリモートWebページはMAFのWebビュー内で開くことはできないので、アクセスが埋込みデバイス機能に制限されます。図20-2に示されているように、MAFのWebビュー内で開かれたURLはアプリケーション機能として表示されます。

図20-2 デバイス・ブラウザとMAFのWebビューのURL

20.1.2 リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化

MAFのWebビュー内で開かれるリモートURLアプリケーションは、Apache Cordova JavaScript APIを使用してデバイス機能にアクセスし、MAF JavaScript APIを使用してMAFコンテナ・サービスにアクセスします。このアクセスを可能にするには、base.jsライブラリを参照するJavaScriptの<script>タグ使用します。

サーバーによってレンダリングされたWebアプリケーション内からMAFまたはCordova JavaScript APIにアクセスするには(たとえば、EL式の取得と設定、アプリケーションに関する情報の取得、写真の撮影、コンタクト先へのアクセスなど)、base.jsのインクルード時に仮想パス/~maf.device~/を使用して、ブラウザがリクエストをリモート・サーバーではなくMAFリソースに対するものとして識別できるようにする必要があります。このアプローチはリモートとローカルの両方のHTMLページで機能するので、(提供元にかかわらず) base.jsをHTML機能にインクルードする方法として最適です。次の例に、デバイスのHTMLページまたはリモートのHTMLページからbase.jsをインクルードする方法を示します。

<html>
<head>
<script src="/~maf.device~/www/js/base.js"></script>
...

コンテナ・コードでは、リクエストされたURLの/~maf.device~/を読み取ると、そのURLをローカルに解決してネイティブ・リクエストとして処理します。次に、MAFがコンテナ・コード内のファイル・システムからファイルを読み取って、ローカル・ファイル・コンテンツをWebビューに送信します。詳細は、第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」を参照してください。

20.1.3 ホワイトリスト内のドメインによるデバイス機能へのアクセス方法

デフォルトでは、connections.xmlファイル(モバイル・アプリケーションに定義されているすべての接続のリポジトリ)に定義されているドメインは、自動的にホワイトリストに含められます。リモートURLコンテンツのこれらのドメインは、図20-3に示すように、「URL接続の作成」ダイアログを使用して作成されます。MAFでは、各接続文字列からドメインを解析して、これらのドメインをホワイトリストに追加します。

図20-3 リモートURLアプリケーション機能のコンテンツを取得するための接続の作成

次に、OEPEでは、adf→META-INFのアセンブリ・プロジェクトにあるconnections.xmlファイルに接続情報が移入され、接続リソースが作成されます。

MAFによってconnections.xmlファイルから追加されるドメインに加えて、MAFアプリケーション・エディタでホワイトリストのドメインを構成することで、MAFのWebビューで開くリモートURLコンテンツを有効にする(または制限する)ことができます。

20.1.4 ホワイトリストの作成方法(ドメインの制限方法)

図20-4のように、MAFアプリケーション・エディタの「セキュリティ」ページでホワイトリストを構成します。

図20-4 ホワイトリストの構成

始める前に:

モバイル・アプリケーションで構成された一部のURLが他のドメインで開かれる可能性があることに注意してください。

ホワイトリストを作成するには:

1. MAFアプリケーション・エディタを開いて、アウトラインでセキュリティを選択します。

2. 「リモートURL Whitelist」でをクリックし、ホワイトリストに含めるドメインの追加ダイアログで、アプリケーション機能のWebビュー内から呼び出せるドメインを入力して、「OK」をクリックします。ホワイトリストに含めるドメインの追加を続けます。
これらのドメインでは、ドメイン名(末尾以外)にワイルドカード(*)を含めることができます。たとえば、*.example.comは有効なドメイン・エントリですが、*.example.*は無効です。完全修飾URLは入力できません。

注意:
ワイルドカードのみを入力すると、Webビューではすべてのドメインをリクエストできるため、セキュリティ上のリスクを招く可能性があります。また、すべてのドメインをホワイトリストに追加すると、それらのすべてがWebビュー内で開けるのみではなく、それらのすべてがデバイスにアクセスできるようになります(そのように意図しているかどうかは無関係に)。

20.1.5 ホワイトリストにドメインを追加する場合の処理

ドメインを追加すると、OEPEでは、次に示すとおり<adfmf:remoteURLWhiteList>要素が更新されます。

...
<adfmf:remoteURLWhiteList>
<adfmf:domain id="domain_1">*.oracle.com</adfmf:domain>
<adfmf:domain id="domain_2">www.oracle.com</adfmf:domain>
</adfmf:remoteURLWhiteList>
...

20.1.6 リモートURLに関する必知事項

一部のURLは、ホワイトリスト・ドメインの一部ではない可能性のあるURLにリダイレクトされます。これらのURLは、アプリケーションのWebビューよりもデバイス・ブラウザで開かれる可能性があります。たとえば、www.oracle.com (<adfmf:domain>www.oracle.com<adfmf:domain>)をホワイトリストに加えた場合、MAFによってそのサイトのモバイル・バージョン(www.m.oracle.com)がデバイス・ブラウザで開かれます。これは、ホワイトリストで許可されていないからです。図20-5は、ホワイトリストに追加されていないWebページをデバイス・ブラウザ内で開いたものを示しています。

図20-5 MAFのWebビューではなくデバイス・ブラウザで開かれたWebページ

www.oracle.comを有効化してアプリケーションのWebビュー内で開くには、*.oracle.comまたはwww.oracle.comを指定する必要があります(第20.1.5項「ホワイトリストにドメインを追加する場合の処理」の例を参照)。

MAFのホワイトリストはドメインレベルのため、アプリケーション機能のWebビューで開くことをホワイトリストに含まれるドメイン内の個々のページについて制限することはできず、すべてのページが許可されます。

20.2 アプリケーション・コンポーネントのホワイトリストの作成

別のドメインを指すURLへのリンクを含むページにホワイトリストを使用します。このようなページは、MAFのWebビューではなくデバイス・ブラウザで別途開かれます。このような場合、次の例の<goLink2>にあるurl属性など、アプリケーションの外部を指す<amx:goLink>コンポーネントのurl属性を使用して、アンカー・タグまたは<amx:goLink>コンポーネントを作成できます。

次の例は、urlパラメータを含む<amx:goLink>を示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:panelGroupLayout id="panelGroupLayout1">
<amx:goLink text="This opens in the device browser"
id="golink1"
url="http://www.example.com"
shortDesc="Opens in device browser"/>
<amx:goLink text="This opens in the web view"
id="golink2"
url="http://www.example2.com"
shortDesc="Accesses device services"/>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

また、第13.3項「UIコンポーネントの作成と使用方法」も参照してください。

20.3 リモートURLページでのブラウザ・ナビゲーション・バーの有効化

MAFでは、図20-6に示すように、MAFのWebビュー内で開く、リモートで供給されるWebコンテンツとして実装されるアプリケーション機能に対して、戻る、進むおよびリフレッシュの各アクション用のボタンが付いたナビゲーション・バーを追加できます。進むまたは戻るのいずれかの移動が不可能な場合は、進むと戻るのボタンが無効になります。

注意:
戻るボタンは、Androidデバイスでは無効になります。

図20-6 ナビゲーション・ボタンとリフレッシュ・ボタンを表示するリモートWebページ

20.3.1 リモートURLアプリケーション機能へのナビゲーション・バーの追加方法

MAF機能エディタの「コンテンツ」タブで、ユーザーがリモート・コンテンツを移動またはリフレッシュできるようにします。

始める前に:

第6.2項「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」の説明に従って、まず「リモートURL」を選択し、次にホスト・サーバーへの接続を作成することにより、リモートでホストされるアプリケーションから配信されるアプリケーション機能のコンテンツを指定します。

ドメインがホワイトリストに含まれていることを確認します。

ナビゲーション・バーを有効にするには:

1. MAF機能エディタのアウトラインの「機能」にリストされているリモートURLアプリケーション機能を選択します。

2. 「コンテンツ」を展開してリモートURLコンテンツを選択します。

3. 図20-7のように、「コンテンツ」セクションで、「ボタンの表示」を選択します。

図20-7 ナビゲーション・オプションの選択

20.3.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-8に示すとおり、MAFでは、進む、戻るおよびリフレッシュの各ボタンがリモートURLアプリケーション機能のホームページから移動されるWebページに適用されます。

Figure 20-8 リモートURLアプリケーション機能での移動

20.4 カスタムURLスキームを使用したMAFアプリケーションの起動

カスタムURLスキームを使用して、他のアプリケーションからネイティブ・アプリケーションを起動できます。

別のアプリケーションからモバイル・アプリケーションを起動するには、次の手順を実行します。

1. カスタムURLスキームを登録します。このURLスキームは、maf-application.xmlファイルの概要エディタで、「URLスキーム」フィールドを使用して構成します。次に、このスキームのURLを使用して、モバイル・アプリケーションを起動し、データを渡すことができます。

2. アプリケーション・コントローラ・プロジェクトで、URLを通知されるカスタムURLイベント・リスナー・クラス(CustomURLEventListenerなど)を作成します。このクラスには、イベント・リスナーを定義するoracle.adfmf.framework.event.EventListenerインタフェースを実装する必要があります。oracle.adfmf.framework.event.EventListenerインタフェースの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
このモバイル・アプリケーションを起動するのに使用されるURLで呼び出されたonMessage(Event e)メソッドをオーバーライドおよび実装します。Eventオブジェクトを使用して、URLペイロードおよびアプリケーションの状態に関する有用な情報を取得できます。URLペイロードを取得するには、Event.getPayloadメソッドを使用します。URLイベント発生時にアプリケーションの状態を取得するには、Event.getApplicationStateメソッドを使用します。詳細は、Oracle Mobile Application Framework Java APIリファレンスでEventクラスを参照してください。

3. アプリケーション・ライフサイクル・イベント・リスナー(ALCL)クラスを登録します。
詳細は、第11章「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

ALCLクラスのstartメソッド内の、カスタムURLイベントのソースを表すEventSourceオブジェクトを取得します。

EventSource openURLEventSource = EventSourceFactory.getEventSource(EventSourceFactory.OPEN_URL_EVENT_SOURCE_NAME);

カスタムURLイベント・リスナー・クラスのオブジェクトを作成し、イベント・ソースに追加します。

openURLEventSource.addListener(new CustomURLEventListener());

モバイル・アプリケーションでは、次の2つの方法で別のネイティブ・アプリケーションを起動できます。

- ネイティブ・アプリケーションによって登録されたカスタム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>

20.5 リモート・コンテンツの作成について

Apache Trinidadコンポーネント(http://myfaces.apache.org/trinidad/の説明を参照)はスマートフォンまたはフィーチャー・フォンのいずれのブラウザ内でも等しく適切に表示されるため、これらのコンポーネントを使用してブラウザベースのユーザー・インタフェースを設計できます。スマートフォンおよびタブレット・デバイスに対応するには、ADF Rich Facesコンポーネントを使用できます(『Oracle Fusion Middleware Oracle ADF FacesによるWebユーザー・インタフェースの開発』を参照)。

注意:
リモートURLからコンテンツを導出するアプリケーション機能にはADFモバイル・ブラウザを使用することをお薦めします。ADFモバイル・ブラウザ・アプリケーションは、Apache Trinidadコンポーネントが移入されたJSFページで構成されます。詳細は、『Oracle Fusion Middleware Oracle ADFモバイル・ブラウザ・アプリケーションの開発』を参照してください。

21 ユーザー・プリファレンスの有効化

この章では、アプリケーションレベルとアプリケーション機能レベルの両方のユーザー・プリファレンス・ページを作成する方法について説明します。

この章には次の項が含まれます:

- 第21.1項「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」

- 第21.2項「アプリケーション機能のユーザー・プリファレンス・ページの作成」

- 第21.3項「ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法」

- 第21.4項「プラットフォームによる表示の差異」

21.1 モバイル・アプリケーションのユーザー・プリファレンス・ページの作成

プリファレンスによって、エンド・ユーザーが構成可能な設定を追加できます。maf-application.xmlおよびmaf-feature.xmlの両方のファイル内で、<adfmf:preferences>要素を使用してユーザー・プリファレンス・ページを定義します。次の例に示すとおり、<adfmf:preferenceGroup>と呼ばれる<adfmf:preferences>の子要素とその子要素によってユーザー・プリファレンスを定義します。これには、テキスト文字列、ドロップダウン・メニューや、次の例のケースのようにアプリケーション設定の追加オプションをユーザーに提示する子ページなど、様々な形でオプションを提示するページを作成します。

また、<adfmf:preferences>要素を使用して、各アプリケーション機能内でユーザーが管理するプリファレンスを作成します。

次の例は、<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機能エディタでプリファレンスを定義したら、次は第13.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オブジェクトの詳細は、第14.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ランタイムによって確認された場合にのみ、モバイル・アプリケーションのナビゲーション・バーまたはSpringboard内に表示されます。また、機能レベルの制約を使用すると、ユーザー・ロールと権限に基づいてアプリケーションを保護することもできます。図22-1は、MAFランタイムによって制約がtrueに評価されたときに、管理者権限を持つユーザーのみにアプリケーションへの
アクセスを許可する制約の作成方法を示しています。制約がランタイムによってfalseと評価された場合、アプリケーション機能はナビゲーション・バーまたはSpringboard内に表示されないため、エンド・ユーザーはそのアプリケーション機能にアクセスできません。

図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タスク・フローを選択します。また、「コンテンツ」フォルダを使用すると、ランタイムが特定のコンテンツを選択したときに表示されるナビゲーション・バーおよびSpringboardイメージを選択できます。コンテンツ固有のイメージを選択しなかった場合、MAFでは、機能レベル・フォルダで指定されたアプリケーション機能レベルのイメージを使用します。

注意:
イメージはプラットフォーム固有のガイドラインに準拠している必要があります(第3.3項「アプリケーション機能の基本情報の定義方法」を参照)。

図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.5.2項「ログイン・ページの指定方法」を参照)。

- ユーザー・ロールと権限のリストを送信するREST WebサービスのURL。

- アプリケーション機能によってチェックされるユーザー・ロールのリスト。

- 権限のリスト。

第29.4.15項「アクセス制御サービスに関する必知事項」も参照してください。

図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 Oracle Cloud上のデータへのアクセス

この章では、Oracle Java Cloud Serviceでホストされるデータへのモバイル・アプリケーションによるアクセス方法について説明します。

この章には次の項が含まれます:

- 第24.1項「Oracle Cloudでホストされるデータへのモバイル・アプリケーションによるアクセスの有効化」

24.1 Oracle Cloudでホストされるデータへのモバイル・アプリケーションによるアクセスの有効化

モバイル・アプリケーションは、Oracle CloudでホストされるSOAP Webサービスにアクセスできます。ホストされているSOAP Webサービスへのアクセスを有効にするには、第15.2項「SOAPを使用したWebサービス・データ・コントロールの作成」で説明するように、Webデータ・サービス・コントロールを作成します。Webサービス・データ・コントロールを作成することで、RESTful Webサービスへのアクセスを有効にできます。コンテンツ・タイプにより、第12.3.2項「MAF AMXページへのUIコンポーネントおよびデータ・コントロールの追加方法」の説明に従い、データ・コントロールをドラッグしてMAF AMXユーザー・インタフェースにドロップするか、コンテンツがリモートWebサーバーまたはローカルに格納されたHTMLファイルのいずれかから配信されるアプリケーションの場合はプログラムによって、モバイル・アプリケーションによるクラウド・データへのアクセスが可能になります。

24.1.1 Oracle Cloudの認証方法

「MAFログイン・サーバー接続」ダイアログを使用して、Oracle Cloudに対して認証するためのログイン・サーバー接続を作成します。

始める前に:

ログイン・サーバー接続に使用するOracle Cloud URLを取得します。

Oracle Cloudのエンドポイントを使用してログインURLを作成するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを展開してMAFを展開し、MAFアプリケーション・エディタをダブルクリックします。

2. エディタで、アウトラインの「セキュリティ」を選択し、デフォルト・ログイン・サーバーの横の「作成」をクリックします。

3. 図24-1に示すように、「接続名」フィールドに接続の名前を入力することで、モバイル・ログイン・サーバー接続ダイアログの「一般オプション」に入力します。

図24-1 Oracle Cloudへのログインの作成

4. 「次へ」をクリックします。HTTP基本オプション・ページで、Oracle CloudのURLを「ログインURL」フィールドに入力します。
「テスト」をクリックして接続をテストします。

詳細は、第29.5.2項「ログイン・ページの指定方法」を参照してください。

24.1.2 Oracle Java CloudにアクセスするためのWebサービス・データ・コントロールの作成方法

データ・サービス・コントロールの作成ウィザードでは、ホストされたデータにアクセスするデータ・コントロールを作成できます。Oracle Java CloudにデプロイされたSOAP WebサービスのWSDL URLを使用してこのデータ・コントロールを作成します。このURLがわからない場合は、アプリケーションのコンテキスト・ルートにWebサービスのポート名および?wsdlを追加して、WSDLドキュメントへのURLを作成する必要があります。

始める前に:

Oracle Java Cloud ServiceにデプロイされているSOAP Webサービス・アプリケーションへのアクセス権を持つ必要があります。このアプリケーションは、Oracle Java Cloud Service Controlホームページにある「アプリケーション」ペインを経由して利用可能にする必要があります。さらに、図24-2のHCMMobileServiceアプリケーションで示されるように、その「ステータス」および「状態」それぞれが「↑」および「アクティブ」である必要があります。

図24-2 Java Cloud Services Controlホームページ

Webサービス・データ・コントロールを作成するには:

1. Oracle Cloud上でホストされたWebサービスのアプリケーション・コンテキスト・ルートを次のように取得します。

1. 「アプリケーション」ペイン(図24-2を参照)のアプリケーションをクリックして、図24-3に示されるアプリケーションのホームページに移動します。

2. 図24-3に示すように、URLをコピーします。このURLは、WSDLドキュメントのアプリケーション・コンテキスト・ルートになります。

図24-3 Webサービスのアプリケーション・コンテキスト・ルートのコピー

2. 「ファイル」→「新」→「その他」を選択して、「新」ダイアログを開きます。

3. 「Oracle」→「モバイル・アプリケーション・フレームワーク」を展開し、「データ・コントロール」を選択して「次へ」をクリックします。

4. 図24-4に示すように、「新規データ制御」ウィザードでプロジェクトを選択し、「Webサービス」を「タイプ」として選択します。

図24-4 データ・コントロールの作成

5. 図24-5に示すように、「URL」の横のをクリックして、データ・コントロール・ソース・ダイアログを開きます。

図24-5 WSDLドキュメントのURLの入力

6. 「URL」フィールドで、Oracle Cloud Java Serviceにデプロイされている(さらに現在実行されている) SOAPベースのWebサービスのURLを貼り付けて「OK」をクリックし、データ・コントロール・ソース・ページで「次へ」をクリックします。

7. ウィザードのデータ・コントロールの詳細ページで、新規データ・コントロールのIDを設定し、「次へ」をクリックします。

8. ウィザードの「Webサービス・データ・コントロール」ページで、目的のサービスを選択し、「次へ」をクリックします。

9. ウィザードの「サマリー」ページで、選択したオプションを確認し、「終了」をクリックします。

24.1.2.1 SOAPベースのWebサービスにおけるポリシーの構成

Oracle Cloud上で保護されるSOAPベースのWebサービスに対してポリシーを構成する必要があります。第15.5項「セキュアなWebサービスへのアクセス」の説明に従い、データ・サービス・コントロール・ポリシーの編集ダイアログを使用して、oracle/wss_http_token_over_ssl_client_policyを選択できます。この(および他の)ポリシーの詳細は、Oracle Fusion Middleware Oracle Web Services Managerを使用したWebサービスの保護とポリシーの管理の「使用する優先ポリシーの決定」および「事前定義済ポリシー」の各章を参照してください。

注意:
SOAPベースのWebサービスには、oracle/wss_http_token_over_ssl_client_policyのみがサポートされます。RESTful Webサービスでは、MAFは基本認証およびSSLポリシーをサポートしています。

24.1.3 Oracle Java Cloud Serviceにアクセスするモバイル・アプリケーションをデプロイする場合の処理

アプリケーションをデプロイすると、Webサービス・データ・コントロールの操作によって、Oracle Java Cloud Serviceインスタンス上で実行されるWebサービスからデータが取得されます。

25 通知の有効化と使用方法

この章では、MAFアプリケーションにおけるローカル通知の表示、プッシュ通知メッセージの登録、およびそれらの処理方法を説明します。

この章には次の項が含まれます:

- 第25.1項「プッシュ通知の概要」

- 第25.2項「プッシュ通知の有効化」

- 第25.3項「ローカル通知の管理」

25.1 プッシュ通知の概要

通知とは、モバイル・アプリケーションの通常のユーザー・インタフェース以外でエンド・ユーザーに配信される合図です。これらの通知は、アプリケーションの状態とユーザー設定に応じて、アラート・メッセージやバナーとして表示されます。通知は、視覚的に、または音で(あるいはその両方で)配信できます。

主な通知のタイプには、次の2つがあります。

- プッシュ通知は、サーバーなどの外部ソースからモバイル・デバイス上のアプリケーションに送信されます。通知を受信したエンド・ユーザーは、アプリケーションを起動するか、アプリケーションがアクティブ化されていない場合は通知を無視できます。
図25-1は、iOSデバイスにおけるプッシュ通知アラートを示しています。

図25-1 プッシュ通知

プッシュ通知を受信するには、アプリケーションを通知サービスに登録する必要があります。登録が成功すると、通知サービスからアプリケーションにトークンが発行されます。アプリケーションでは、このトークンを(リモート・サーバー上の)プロバイダと共有します。これにより、プロバイダから、通知サービスを通じてアプリケーションに通知を送信できるようになります。MAFでは、アプリケーションによって提供された登録構成を使用して、そのアプリケーションのかわりに登録を行います(第25.2項「プッシュ通知の有効化」を参照)。登録は、MAFアプリケーションが起動するたびに、トークンの有効性を保証する目的で行われます。登録が成功すると、MAFでは、プラットフォーム固有の通知サービスから取得したトークンをプロバイダと共有します。iOSの場合、この通知サービスはApple Push Notification Service (APNs)です。Google Cloud Messaging (GCM) for Androidでは、Androidデバイスにインストールされたアプリケーション用の通知サービスが提供されます。

MAFアプリケーションでは、その状態にかかわらずプッシュ通知を受信できます。これらのメッセージは、アプリケーションがフォアグラウンドで実行されていなくても表示される場合があり、その表示形式はMAFアプリケーションの状態とユーザー設定によって異なります。表25-1では、iOSオペレーティング・システムで、MAFアプリケーションの状態に応じて、どのようにプッシュ通知が処理されるかを説明します。

表25-1 iOSデバイスにおけるプッシュ通知の処理

状態

アクション

MAFアプリケーションはインストールされているが、実行されていない。

通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、MAFアプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。

MAFアプリケーションがバックグラウンドで実行されている。

通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、MAFアプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。

MAFアプリケーションがフォアグラウンドで実行されている。

通知メッセージは表示されません。アプリケーション通知ハンドラが呼び出されます。

iOSおよびAndroidプラットフォームでは、アプリケーションがフォアグラウンドで実行されていない場合、そのアプリケーションに関連付けられているすべてのプッシュ通知メッセージが、iOS Notification CenterやAndroidデバイス上の通知ドロワーなど、特定の場所に格納されます。

- ローカル通知は、モバイル・アプリケーション内から発信され、同じアプリケーションによって受信されます。通知は、モバイル・デバイスのプラットフォームでサポートされる標準メカニズム(バナーやサウンドなど)を通じてエンド・ユーザーに配信されます。
MAFに附属するローカル通知抽象化APIを使用してアプリケーションを構成し、即座に通知を起動するか、将来の日時に通知するようスケジュールできます。また、通知の繰返しパターンを設定したり(毎日や毎週など)、スケジュール済の通知を取り消すことができます。

iOSおよびAndroidプラットフォームで、MAFアプリケーションがフォアグラウンドで実行されている場合、通知は、エンド・ユーザーの操作なしでアプリケーションに直接配信されます。アプリケーションがバックグラウンドで実行されているか、まったく実行されていない場合、通知は、エンド・ユーザーが通知をタップするとアプリケーションに配信されます。

25.2 プッシュ通知の有効化

次のタスクを実行することで、プッシュ通知を有効にできます。

1. モバイル・アプリケーションでプッシュ通知を受信できるようにするには、MAFアプリケーション・エディタのプラグイン有効化セクションでコア・プラグインのPushPluginを有効化し、そのプラグインを1つ以上のアプリケーション機能に関連付けます。詳細は、第10章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

注意:
デフォルトでは、MAFアプリケーションはプッシュ通知を許可しません(また、いずれのデバイス・タイプのデバイス・アクセスも許可しません)。

2. アプリケーション・コントローラ・プロジェクトで、アプリケーション・ライフサイクル・イベント・リスナー(ALCL)・クラスを登録します。詳細は、第3.3項「アプリケーション機能の基本情報の定義方法」および第11.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サンプル」にあります(付録G「サンプルのMAFアプリケーション」を参照)。

25.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ドキュメントから入手できます。

25.3 ローカル通知の管理

ローカル通知は、次のものを使用して管理できます。

- MAFの提供するJava API (第25.3.1項「Javaを使用してローカル通知を管理する方法」を参照)。

- MAFの提供するJavaScript API (第25.3.2項「JavaScriptを使用してローカル通知を管理する方法」を参照)。

- アプリケーションの設計時にすべてのMAFアプリケーションで使用できるDeviceFeaturesデータ・コントロールのメソッド(第25.3.3項「DeviceFeaturesデータ・コントロールを使用してローカル通知を管理する方法」を参照)。

LocalNotificationというMAFサンプル・アプリケーションは、ローカル通知のスケジュール方法と処理方法を示しています。これは、「ファイル」→「新」→「MAFサンプル」にあります(付録G「サンプルのMAFアプリケーション」を参照)。

25.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");
}

通知オプションがアプリケーションの動作に与える影響は、ターゲット・プラットフォームに応じて異なります。詳細は、第25.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リファレンスを参照してください。

25.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) {}

通知オプションがアプリケーションの動作に与える影響は、ターゲット・プラットフォームに応じて異なります。詳細は、第25.3.5項「ローカル通知オプションとアプリケーション動作に関する必知事項」を参照してください。

- cancel: 定義は次のとおりです。

/**
* Cancel a scheduled local notification
*
* @param {string} notificationId - id of the scheduled notification
*                                  that needs to be canceled
* @param {successCallback} scb - success callback
* @param {errorCallback} ecb - error callback
*/
adf.mf.api.localnotification.cancel(notificationId, scb, ecb);

{var} notificationId : id of notification that is to be canceled.

/**
* Success Callback
*
* @callback successCallback
* @param {Object} request - request
* @param {Object} response - response
* @param {string} response.id - id of the notification
*/

/**
* Error Callback
*
* @callback errorCallback
* @param {Object} request - request
* @param {Object} response - response
*/

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework JSDocリファレンスを参照してください。

25.3.3 DeviceFeaturesデータ・コントロールを使用してローカル通知を管理する方法

ローカル通知は、DeviceFeaturesデータ・コントロールのaddLocalNotificationおよびcancelLocalNotificationメソッドを使用して、スケジュールしたり取り消すことができます。

DeviceFeaturesデータ・コントロールの詳細は、第14.10項「DeviceFeaturesデータ・コントロールの使用方法」を参照してください。

25.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リファレンスを参照してください。

25.3.5 ローカル通知オプションとアプリケーション動作に関する必知事項

表25-2で、ローカル通知オプションをリストし、各オプションに特定の値を設定した場合または値を設定しない場合にMAFアプリケーションの通知動作がどのような影響を受けるかについて説明します。

表25-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 バイブレーションを制御することはできません。設定は無視されます。ただし、デフォルトのシステム・サウンドを通知の着信時に再生するように指定している場合や、エンド・ユーザーがモバイル・デバイスで着信時にバイブレートする設定を有効にしている場合、デバイスは通知を受信するとバイブレートします。

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.14項「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値にすることができます。詳細メッセージは、サマリー・メッセージと同じフォント・サイズで新しい行に表示されます。

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 モバイル・アプリケーションのデプロイ

この章では、テストと公開のためのモバイル・アプリケーションのデプロイ方法について説明します。

この章には次の項が含まれます:

- 第27.1項「モバイル・アプリケーションのデプロイメントの概要」

- 第27.2項「デプロイメント構成の使用」

- 第27.3項「機能アーカイブ・ファイル(FAR)のデプロイ」

- 第27.4項「モバイル・アプリケーション・アーカイブ・ファイルの作成」

- 第27.5項「署名されていないデプロイメント・パッケージの作成」

- 第27.6項「Oracle Mobile Security Suiteでのデプロイ」

27.1 モバイル・アプリケーションのデプロイメントの概要

エンド・ユーザーに配布するためにアプリケーションを公開する前に、シミュレータまたは実際のデバイスでこれをテストして、その動作と使いやすさを評価する必要があります。iOSアプリケーション・バンドル(.ipaまたは.appファイル)またはAndroidアプリケーション・パッケージ(.apk)・ファイルをプラットフォームに適したデバイスまたはシミュレータにデプロイすることで、MAFでは、App Store (Apple iTunes)またはアプリケーション・マーケットプレイス(Google Playなど)に公開する前にアプリケーションをテストできます。

27.1.1 OEPEによるアプリケーションのデプロイ方法

MAFでは、プロジェクトをデプロイする場合、プラットフォーム固有のテンプレート・アプリケーションを一時的な場所にコピーした後、MAFプロジェクト内で定義されたコード、リソースおよび構成を使用して、そのアプリケーションを更新します。その後、MAFでは、ターゲット・プラットフォームのツールを使用して、アプリケーションをビルドおよびデプロイします。モバイル・アプリケーションをプラットフォーム固有パッケージ(Androidの場合.ipa、.h)としてデプロイでき、このパッケージは、ダウンロード・サイトや、Apple App Store、Google Playなどのアプリケーション・マーケットプレイスから利用できるようにします。テストおよびデバッグのため、シミュレータまたはデバイスにデプロイできます。

実際のデプロイメント・プロセスは、3つの手順で構成されています。

- まず、プラットフォーム(AndroidまたはiOS)用のSDKを「プリファレンス」ダイアログに登録します。詳細は、Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールを参照してください。

- MAFアプリケーションごとに、ターゲットを定義します。ターゲットは、プラットフォーム(AndroidまたはiOS)の組合せであり、固有バージョンのMAFランタイムです。デフォルトでは、アプリケーションを作成すると、OEPEによって、登録されているSDKプラットフォームごとにターゲットが作成されます。追加のターゲットは、「プロジェクト・プロパティ」ダイアログを使用して定義でき、このダイアログは、アセンブリ・プロジェクトのコンテキスト・メニューにあります。「モバイル・アプリケーション・フレームワーク」を選択して「追加」をクリックし、新しいターゲットを定義します。

- デバッグまたは実行構成を作成し、それを実行します。

ビュー・コントローラ・プロジェクトを機能アーカイブ(FAR)としてデプロイすることで、アプリケーション機能を再利用できます。また、モバイル・アプリケーション全体は、モバイル・アプリケーション・アーカイブ(.maa)・ファイルとしてデプロイすることで再利用することもできます。

27.1.1.1 プロジェクト・ライブラリのデプロイメント

「プロパティ」ダイアログを使用してプロジェクトに対して宣言するライブラリは、図27-1が示すように、プロジェクト用デプロイメント・アーティファクトに含まれています。このダイアログにより、アプリケーション機能は実行時にこれらのライブラリにアクセスすることが可能になります。

ビュー・プロジェクトを右クリックして「プロパティ」を選択し、「プロパティ」ダイアログを開きます。図27-1に示すように、ダイアログではJavaビルド・パスを選択し、「ライブラリ」タブをクリックします。

図27-1 プロジェクトへのライブラリの追加

27.1.1.2 JVM 1.4ライブラリのデプロイメント

AndroidアプリケーションとiOSアプリケーションのどちらの場合も、それぞれのMAFデプロイメントには、デプロイメントのタイプ(リリースまたはデバッグ)とデプロイメント・ターゲット(シミュレータまたは実際のデバイス)の組合せに固有の異なるライブラリのセットが含まれています。さらに、それぞれのライブラリ・セットには、JVM 1.4のJARファイルが含まれます。アプリケーションのバインディング・レイヤーは、Objective-Cライブラリのコレクションであるこの仮想マシン内にあります。たとえば、MAFは、iOSシミュレータをターゲットとするデバッグ・デプロイメントに対して、JVM 1.4 JARファイルと一連のライブラリをデプロイしますが、実際のiOSデバイスをターゲットとするデバッグ・デプロイメントに対しては、異なるJVM 1.4 JARファイルと一連のライブラリをデプロイします。

27.2 デプロイメント構成の使用

デプロイメント用モバイル・アプリケーションの準備は、プラットフォーム固有のデプロイメント構成の作成から始まります。構成では、iOSデバイス、Androidデバイス、iOSシミュレータまたはAndroidエミュレータにデプロイするアプリケーションをアーカイブにパッケージ化する方法を定義します。

デバッグ構成と本番構成から選択できます。デプロイメントの間は、デフォルト・キーストアを使用するためにデバッグを選択する必要があります。

構成は次のことを実行します。

- パッケージおよびデプロイするアセンブリ・プロジェクトを選択します。

- デプロイ先のターゲットを選択します。ターゲットは、プラットフォーム(AndroidまたはiOS)の組合せであり、固有バージョンのMAFランタイムです。

- デプロイ先のデバイス・プロファイル(エミュレータまたはデバイス)を選択します。

- プラットフォーム固有(AndroidまたはiOS)の詳細オプションを選択します。

- デプロイするアプリケーションを指定します。

27.2.1 デプロイメント構成の作成方法

第2.2.2.3項「デプロイメント構成について」で説明するように、アプリケーションを作成するときに、アプリケーション用のデプロイメント・ターゲットを選択します。後でデプロイメント構成を作成するときに、使用するデプロイメント・ターゲットを選択します。これらの構成を使用してアプリケーションをデプロイしたり、MAF固有の構成ダイアログを使用してアプリケーションを編集したり、新規構築することができます。図27-2に示すように、構成の作成、管理および実行ダイアログは、デプロイメント構成ダイアログとも呼ばれ、デフォルト・デプロイメントを作成できます。デプロイメント構成は、必要な数だけ作成できます。

始める前に:

OEPEでモバイル・アプリケーションをデプロイできるようにするには、MAFの「プリファレンス」ページを使用してターゲット・プラットフォームのSDKを指定する必要があります。

ヒント:
iOSデプロイメントの場合は、iTunesおよびiOSシミュレータを1回以上実行してから、それらのディレクトリの場所をMAFプラットフォームのプリファレンス・ページで構成します。

デプロイメント構成を作成するには、次の手順を実行します。

1. 開発の場合、「実行」→デバッグ構成を選択します。
本番の場合、「実行」→「実行構成」を選択します。

2. MAFアプリケーションに移動し、右クリックして「新」を選択し、新しい構成を作成します(図27-2を参照)。

3. 次の手順を実行します。

- 構成のデフォルト名をそのまま使用するか、新しい構成名を入力します。

- アセンブリ・プロジェクトを選択します。

- 使用可能なもののリストからターゲットを選択し、使用可能なもののリストからデバイスまたはエミュレータを選択します。必要に応じて、リストをリフレッシュします。

- 必要に応じて、デプロイ先にするデバイスのキーストアおよびキーの別名を選択します。

4. ただちにデプロイする場合は、「実行」をクリックします。構成を保存するには、「適用」をクリックします。または、「変更の保存」ダイアログで「閉じる」をクリックし、「はい」をクリックします。

図27-2 実行構成の作成

27.2.2 デプロイメント構成の作成時の処理

「実行」ボタンまたは「デバッグ」ボタンをクリックしてアプリケーションをデプロイするとき、アプリケーションのパッケージングおよびデプロイメントがトリガーされます。OEPEによって、デプロイメント・ディレクトリおよび関連するサブディレクトリが作成されます。ビュー・プロジェクト(違った名前である必要があります)およびアセンブリ・プロジェクト用に機能アーカイブ・ファイル(FAR)も作成されます。これら2つのFARに加え、プロジェクトにインポートされたFARのコピーが、OEPEによって作成されます。最後に、パッケージがデバイスまたはエミュレータにデプロイされます。

デプロイ・アーティファクトをクリーンアップするには、一部のプロジェクトまたはすべてのプロジェクトに対して「クリーン」ダイアログを使用します。クリーンアップの対象:

- 一部のプロジェクト。これが、クリーンリビルドを行うのに最速の方法です。
下で選択したプロジェクトのクリーンアップを選択し、クリーンアップするアセンブリ・プロジェクトを選択し、「OK」をクリックします。

- すべてのプロジェクト。これにより、すべてのユーザー・アーティファクトは、再ステージングおよびデプロイ前にリビルドされます。
すべてのプロジェクトのクリーンアップを選択し、「OK」をクリックします。

実行構成を作成すると、メニュー・バーから緑色の実行矢印をクリックしてそれを選択できます。矢印をクリックすると、最後に使用された実行構成が選択されます。緑色の矢印の隣のドロップダウン・セレクタをクリックし、コンテキスト・メニューから実行する構成を選択することによって、別の実行構成を選択できます。

27.2.3 実行構成とデバッグ構成の相違点

実行構成およびデバッグ構成は両方とも「実行」メニューから起動でき、これらは、デバッグ構成が、デバッグ・オプションを設定する追加のタブである「デバッグ」タブを持っている点で違います。詳細は、第30章「MAFアプリケーションのテストおよびデバッグ」を参照してください。

- デバッグ - 開発ビルドにはこのオプションを選択します。デバッグ・ビルドを指定すると、デバッグ・シンボルが含まれます。
デプロイメントの間は、デフォルト・キーストアを使用するためにデバッグを選択する必要があります。

実行時、赤い三角形の中の感嘆符で表されるデバッグ・シンボルを重ねることで、デバッグ・モードにアプリケーションがデプロイされたことをMAFは示しています。

- 実行 - リリースの準備ができたビルドをライブラリなどとともに、リリース・ビットやライブラリなどとともにビルドします。

ヒント:
アプリケーションがリリース用にコンパイルされているかどうかは、デバッグ・モードではなく、実行モードを使用して、アプリケーションのパフォーマンスをテストします。

27.2.4 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. 「ウィンドウ」→「プリファレンス」を選択し、「プリファレンス」ダイアログを開きます。

2. 図27-3に示すように、「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Android」を選択し、Androidのプリファレンス・ページを開きます。

図27-3 Androidプリファレンスの設定

3. 「追加」をクリックして「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.2.4項「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.2.4.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.2.4.1 詳細オプションの設定

Android詳細オプション・ページでは、図27-4に示すように、次のことができます。

- 「最小SDK APIレベル」、「ターゲットSDK APIレベル」、「バージョン・コード」、「ソース・ファイル」、「クラス・ファイル」、「Zipアラインメント」、「優先記憶域の場所」など、数多くの高度なオプションを設定します(図27-5を参照)。

図27-5 SDKレベルの設定

- 図27-6に示すように、デフォルトのアプリケーション・イメージを変更します。

図27-6 アプリケーション・イメージの設定

27.2.4.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.2.4.3 Android署名オプションの定義

アプリケーションは、Androidデバイスまたはエミュレータにデプロイする前に、署名する必要があります。Androidでは、認証局は不要です。アプリケーションは自己署名できます。

デプロイメントにおけるモバイル・アプリケーションの署名方法の定義は、2つの手順で構成されており、MAFプラットフォーム・プリファレンス・ページで、Androidアプリケーションの署名に使用するキーのリリース・プロパティをまず定義します。リリースの署名プロパティは、一度構成するのみでかまいません。これらのオプションを定義したら、デプロイメント・プロファイルを構成して、リリース・モードでアプリケーションをデプロイするかどうかを指定します。

始める前に:

キーストアが存在しない場合、OEPEによって作成されます。また、次の例に示すように、keytoolユーティリティを使用してキーストアを1つ作成できます。

keytool -genkey
-v
-keystore c:\oepe\workspace\releasesigning.keystore
-alias releaseKeyAlias
-keyalg RSA
-keysize 2048
-validity 10000

Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で入手可能な「Signing Your Applications」で説明されているとおり、keytoolでは、キーストアを生成する前に、キーストアとキーのパスワード、およびキーの識別名フィールドを入力することを求められます。前述の例のキーストアには、10,000日間有効な単一のキーが含まれています。keytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

ヒント:
Java Platform Standard Edition (Java SE) 7の場合は、-genkeyコマンドのかわりに-genkeypairを使用します。

キー・オプションを構成するには、次の手順を実行します。

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.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

注意:
デバッグ・キーストアおよびキーで署名されたアプリケーションは公開できません。デバッグ・キーストアおよびキーは、テストのみに使用され、エンド・ユーザーへのアプリケーションの公開には使用できません。

- 「実行」メニューから、「実行構成」を選択します。アプリケーションを公開する準備ができた場合は、「リリース」を選択します。このオプションは、アプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開する準備ができた場合に使用します。

2. 「デプロイメント構成」ダイアログで、.apkファイルがデバッグ・モードまたはリリース・モードで署名された後は、デバイスまたはエミュレータにデプロイできます。図27-9に示すように、実行時にMAFは、赤い三角形の中の感嘆符で表されるデバッグ・シンボルをオーバーレイすることで、アプリケーションがデバッグ・モードでデプロイされたことを示しています。

図27-9 デプロイメント・モード

27.2.4.4 資格証明の保存に関する必知事項

キーストア・アクセス用の資格証明は、Eclipse Secure Storageに保存され、ここには、ワークスペース外のデータが保存されます。場所は通常ホーム・ディレクトリですが、OSプラットフォームに応じて特定の場所は変わります。

Secure Storageの場所を探すには、次の手順を実行します。

1. メイン・メニューから「ウィンドウ」→「プリファレンス」を選択して「プリファレンス」ダイアログを開きます。

2. ノード「一般」→「セキュリティ」→Secure Storageを展開してSecure Storageページを表示します。

3. 「コンテンツ」タブをクリックします。たとえば、user-home/.eclipse/org.elipse.equinox.security/secure_storageのように、ストレージの場所がダイアログの下部に表示されます。

4. ノード「Oracle」→「Eclipse」→「ツール」→「oepe」→「maf」→「Android」→「キーストア」を展開すると、保存されているパスワードを確認できます。
「プリファレンス」ダイアログの「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Android」→「Androidキーストア」ページに、宣言されているキーストアごとにノードがあります。

ノードをクリックしてデータを表示します(パスワードは不明瞭化されています)。

注意:
iOSのキーはMac固有のものであるため、キーをEclipseに保存する必要はありません。iOS XcodeBuildは、起動時に指定されるmobileprovisionに基づいてMac Keychainから直接抽出します(「プリファレンス」ダイアログの「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Android」→「Androidキーストア」ページから構成されます)。

27.2.4.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.2.4.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.2.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.2.5 Androidアプリケーションのデプロイ

図27-11に示すように、デプロイメント構成を定義した後、実行構成ダイアログまたはデバッグ構成ダイアログからモバイル・アプリケーションをAndroidプラットフォームにデプロイできます。

デバッグ構成ダイアログを使用すると、完成したアプリケーションをAndroidエミュレータまたはテスト用のAndroidデバイスにデプロイできます。アプリケーションのテストおよびデバッグの終了後、実行構成ダイアログを使用してモバイル・アプリケーションをAndroidアプリケーション・パッケージ(.apk)・ファイルにバンドルし、Google Playなどのアプリケーション・マーケットプレイスなどを介してエンド・ユーザーに公開できます。

図27-11 Androidアプリケーションの「デプロイメント構成」ダイアログ

27.2.5.1 AndroidエミュレータへのAndroidアプリケーションのデプロイ方法

モバイル・アプリケーションは、Androidエミュレータに直接デプロイできます。

始める前に:

Androidエミュレータにデプロイするには、次を行う必要があります。

- Androidプラットフォームの「プリファレンス」ページでキーストア・パスワードおよびキーの別名の詳細を構成します(「ウィンドウ」→「プリファレンス」→「Oracle」→「モバイル・アプリケーション・フレームワーク」→「Android」→Androidキーストアを選択してアクセスします)。

注意:
Android 4.0.nプラットフォーム(API 14以降)をインストールする必要があります。

- Android Virtual Deviceインスタンスの構成にARMシステム・イメージが反映されていることを確認します。

- アプリケーションをデプロイする前にAndroidエミュレータを起動します。
エミュレータは、Android Virtual Device Manager(図27-12を参照)またはコマンド行を使用して起動できます。コマンド行から起動する場合は、toolsディレクトリ(Android\android-sdk内)に移動し、emulator -avdに続けてエミュレータ名を入力することで(例: -avd AndroidEmulator1)、エミュレータを起動します。

注意:
Androidエミュレータは一度に1つのみ実行できます。

図27-12 Android Virtual Device Managerを使用したエミュレータの起動

アプリケーションをAndroidエミュレータにデプロイするには:

1. 「実行」→「実行構成」を選択するか、「実行」→「デバッグ構成」を選択します。MAFアプリケーション・ノードの下で、Androidデプロイメント・プロファイルを選択します。

2. ターゲットが使用するものであることを確認し、「実行」または「デバッグ」をクリックします。
状況により、デプロイメント・プロセスがハングすることがあります。その場合、adbサーバーを強制終了してから再起動し、デプロイメントを再試行してください。

3. 図27-13に示すように、コンソールでデプロイメント・ログを確認します。デプロイメント・ログには、デプロイヤがAndroidエミュレータの実行中インスタンスを検出し、Androidデバッグ・ブリッジ・サーバーを起動したことが示されます。

図27-13 デプロイメント・ログ

27.2.5.2 Androidデバイスへのアプリケーションのデプロイ方法

モバイル・アプリケーションは、2.n (APIレベル9)以上のプラットフォームで動作するAndroidデバイスに直接デプロイできます。

始める前に:

Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールの説明に従って、OEPEをホストする開発コンピュータにデバイスを接続します。

図27-4に示すように、「デプロイ・オプション」ページで、ビルド・モードとして「デバッグ」を選択します。図27-4に示すように、デバッグ署名資格証明がAndroidプラットフォームの「プリファレンス」ページで構成されていることを確認します。

Androidデバイスにアプリケーションをデプロイするには:

1. 「実行」→「実行構成」を選択して「実行構成」ダイアログを開きます。MAFアプリケーション・ノードの下で、Androidデプロイメント・プロファイルを選択します。

2. 使用するターゲットを確認し、「実行」をクリックします。

3. 図27-13に示すように、コンソールでデプロイメント・ログを確認します。デプロイメント・ログには、デプロイヤがAndroidエミュレータの実行中インスタンスを検出し、Androidデバッグ・ブリッジ・サーバーを起動したことが示されます。

図27-14 デプロイメント・ログ

1. 「実行」→「実行構成」を選択するか、「実行」→「デバッグ構成」を選択します。MAFアプリケーション・ノードの下で、Androidデプロイメント・プロファイルを選択します。

2. ターゲットが使用するものであることを確認し、「実行」または「デバッグ」をクリックします。

27.2.5.3 Androidアプリケーションの公開方法

第30章「MAFアプリケーションのテストとデバッグ」の説明に従ってアプリケーションのテストとデバッグが完了したら、Android開発者のWebサイト(http://developer.android.com/tools/publishing/publishing_overview.html)の説明に従ってアプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開できます。

始める前に:

実行構成を作成します。

注意:
第27.2.4.3項「Android署名オプションの定義」の説明に従って、Androidプラットフォームの「プリファレンス」ページで署名オプションを構成する必要があります(「ウィンドウ」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択してアクセスします)。

.apkファイルとしてアプリケーションをデプロイするには:

1. 「実行」→「実行構成」を選択して実行構成を作成します。MAFアプリケーション・ノードの下で、Androidデプロイメント・プロファイルを選択します。

2. 使用するターゲットを確認し、「実行」をクリックします。

3. コンソールでデプロイメント・ログを確認します。

4. アプリケーション・マーケットプレイスにアプリケーションを公開します。

27.2.5.4 .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.2.5.5 最近使用されたデプロイメント構成の選択

デプロイメント・アクションを選択した後、OEPEによって、メイン・ツールバーに「デバッグ」ボタンおよび「実行」ボタンへのショートカットが作成されます(図27-15を参照)。下向き矢印をクリックし、同じデプロイメント・アクションを使用してアプリケーションを簡単に再デプロイできるようにする構成を選択します。

図27-15 最近使用した構成の選択

27.2.5.6 コンソールでのデバイス/エミュレータ・ログインの表示

OEPEでは、デバイスまたはエミュレータからのログ出力は、図27-16に示すように、コンソール内にストリームされます。これはデバッグにきわめて有効です。詳細は、第30.4.1項「プロパティ・ファイルを使用したロギングの構成方法」を参照してください。

図27-16 デバイスまたはエミュレータのログの表示

27.2.6 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.2.6.2項「デバイス署名オプションの設定」で説明されているように、モバイル・アプリケーションを(iOSシミュレータへのデプロイメントとは対照的に) iOSデバイスにデプロイするには、iOSプロビジョニング・プロファイルからプロビジョニング・プロファイルと証明書の両方を取得する必要があります。

デプロイメント構成を作成するには、次の手順を実行します。

1. 図27-17に示すように、「実行」→「デバッグ構成」を選択します。

図27-17 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.2.7.4.3項「アプリケーションIDの登録」を参照してください。また、第3.3項「アプリケーション機能の基本情報の定義方法」も参照してください。

注意:
デプロイされるバンドル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-23を参照)で「配布パッケージにデプロイ」または「デバイスとの同期のためにiTunesにデプロイ」オプションを選択すると、MAFによって.ipaファイルが作成されます。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、.appファイルが作成されます。または、デフォルトの名前を使用します。詳細は、第27.2.7.2項「iOSデバイスへのアプリケーションのデプロイ方法」と第27.2.7.5項「App StoreへのiOSアプリケーションの配布方法」を参照してください。
MAFのデフォルトでは、.ipaファイル(または.appファイル)の名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第3.3項「アプリケーション機能の基本情報の定義方法」を参照してください。

- 「詳細オプション」 - 「オプション」をクリックして「詳細オプション」ダイアログを開き、ここで図27-18に示すように、様々なオプションを設定できます。

図27-18 最小iOSバージョンの設定

最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

27.2.6.1 iOSビルド・オプションの定義

iOSビルド・オプションでは、デバッグまたはリリース・ビットとライブラリによりアプリケーションをデプロイできます。「オプション」ページには、iOS署名モードの構成オプション、デバッグ・モードとリリース・モードが表示されます。

始める前に:

iOSアプリケーション(.ipaファイル)をiOSデバイスにデプロイするには、インストールの必須コンポーネントであるプロビジョニング・プロファイルと、デバイス上の開発者とアプリケーションを特定する署名済証明書が必要です。これらは、第27.2.7.4項「iOSデバイスへのアプリケーションのデプロイに関する必知事項」の説明に従ってiOSプロビジョニング・ポータルから取得する必要があります。また、プロビジョニング・プロファイルを、「Oracle」→MAF→「iOS」ページ(「プリファレンス」ダイアログ) (「ウィンドウ」メニューから使用可能)で登録します。iOSデプロイ・ターゲット用のiTunesまたはパッケージを選択するとき、デバッグ構成または実行構成でプロビジョニング・プロファイルを選択します。

実行構成またはデバッグ構成でプロビジョニング・プロファイルを選択すると、デプロイされるバンドルIDの接頭辞がそこから推論されます。

また、第27.2.6.2項「デバイス署名オプションの設定」の説明に従って、iOSプラットフォームの「プリファレンス」ページでプロビジョニング・プロファイルの場所と証明書の名前を入力する必要があります。

ビルド・オプションを設定するには:

1. 図27-17に示すように、デプロイメント構成ダイアログを開きます。

2. 次のいずれかのオプションを選択します。

- 「実行」→「デバッグ構成」 - 開発ビルド用にはこのオプションを選択します。デバッグ・ビルドを指定すると、デバッグ・シンボルが含まれます。第30.3.2項「iOSプラットフォームでのデバッグ方法」と第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

- 「実行」→「実行構成」 - リリースに必要なファイル、アーティファクトおよびライブラリとともにビルドをコンパイルする場合にこれを選択します。

ヒント:
アプリケーションのパフォーマンスをテストするには、デバッグ・モードではなくリリース・モードを使用します。

図27-9「デプロイメント・モード」に示すように、実行時に、赤い三角形の中の感嘆符で表されるデバッグ・シンボルを重ねることで、アプリケーションがデバッグ・モードでデプロイされたことをMAFは示します。

27.2.6.2 デバイス署名オプションの設定

iOSプラットフォームの「プリファレンス」ページには、開発コンピュータ上でのプロビジョニング・プロファイルの場所と証明書の名前のフィールドが含まれています。アプリケーションをiOSデバイスにデプロイするか、MAFアプリケーション・アーカイブとしてデプロイする場合は、これらのパラメータを定義する必要があります。

注意:
モバイル・アプリケーションをiOSシミュレータにデプロイする場合は、証明書もプロビジョニング・プロファイルも不要です。

署名オプションを設定するには:

1. 「ウィンドウ」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択します。

2. 「iOS」→iOSモバイル・プロビジョニングを選択します。

3. 図27-19に示すように、ページのモバイル・プロビジョニング情報セクションのモバイル・プロビジョニング・ファイルにプロビジョニング・プロファイルの場所を入力します。

4. OEPEによって「証明書」が入力されます。

図27-19 iOSプラットフォームの「プリファレンス」ページの「デバイス署名」セクション

注意:
プロビジョニング・プロファイルには、アプリケーションの開発バージョン用とリリース・バージョン用の両方があります。アプリケーションのリリース・バージョンに使用されるプロビジョニング・プロファイルは、あらゆるデバイスにインストールできます。一方、開発バージョン用のプロビジョニング・プロファイルは、IDがプロファイルに埋め込まれたデバイスのみにインストールできます。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)にある『App Distribution Guide』を参照してください。

27.2.6.3 iOSアプリケーションへのカスタム・イメージの追加

独自のカスタム・イメージをアプリケーションに追加できます。

「アプリケーション・イメージ」ページでは、アプリケーション・アイコン、およびカスタム・イメージ付きのアートワークに使用されているデフォルトのOracleイメージをオーバーライドすることで、アプリケーションをリブランドできます。図27-20に示されているこのページのオプションでは、様々な状況およびデバイスの解像度で使用されるカスタム・イメージの場所を入力できます。iOSアプリケーション・アイコン・イメージの詳細は、『iOS Human Interface Guidelines』の「Icon and Image Design」セクションを参照してください。このドキュメントは、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)から入手できます。

注意:
すべてのイメージはPNG形式であることが必要です。

図27-20 カスタム・イメージの追加

カスタム・イメージを追加するには:

1. 「実行」→「デバッグ構成」を選択して、デプロイメント構成を開きます。

2. 「オプション」をクリックしてiOS詳細オプション・ダイアログを開きます。

3. 「アプリケーション・イメージ」タブをクリックし、iPhoneまたはiPodのイメージを変更するかどうかを選択します。

4. 変更するイメージを選択し、「参照」を選択して使用するイメージ・ファイルを選択します。このイメージ・ファイルは、現在のアプリケーション内に存在している必要があります。
デプロイメント時に、OEPEは、カスタム・イメージ・ファイルをデプロイメント・プロファイルにコピーし、デフォルト・イメージの名前と一致するように名前を変更します。

詳細は、第27.2.6.4項「iTunesアートワークに関する必知事項」を参照してください。

5. 「OK」をクリックします。

27.2.6.4 iTunesアートワークに関する必知事項

デフォルトでは、iTunesを通してiOSデバイスにデプロイされる、またはダウンロード用のアーカイブ(.ipaファイル)としてデプロイされるモバイル・アプリケーションでは、別途指定されていないかぎり、デフォルトのOracleイメージが使用されます。

デプロイされるアプリケーションのアイコンとしてiTunesアートワーク・イメージを選択することで、デフォルトのイメージをオーバーライドします。イメージを使用してアプリケーションのバージョンを区別できます。図27-21に、デフォルト・イメージとユーザーが選択したイメージの違いを示します。Application4にはデフォルト・イメージが、Application6にはユーザーが選択したイメージ(512 x 512ピクセルにスケールを変更したOracleアイコン)が表示されています。

図27-21 カスタムとデフォルトのアプリケーション・アイコン

デプロイメント時に、MAFは、.ipaファイルのトップレベルのiTunesArtworkというファイルにそのiTunesのアートワーク・イメージを追加することで、iTunesでそのアイコンが表示されるようにします。

27.2.6.5 表示をデバイスの特定の向きに制限する方法

デフォルトでは、MAFは、iPhoneとiPadの両方ですべての向きをサポートしています。たとえば、iPads上で上下逆の縦向きでのみ表示する必要があるアプリケーションでは、「デバイスの向き」ページ(図27-22を参照)を使用して、アプリケーションの回転をこれらの向きのみに制限できます。

図27-22 デバイスの向きの選択

アプリケーションの表示をデバイスの特定の向きに制限するには:

1. 「デバイスの向き」を選択します(図27-22を参照)。

2. 表27-3にリストされた向きの中から、不要な向きをすべて消去します。デフォルトでは、MAFは、これらすべてのデバイスの向きにデプロイします。デフォルトでは、これらの向きがすべて選択されています。

表27-3 iPhoneデバイスの向き

アイコン

説明

iPad、縦: ホーム・ボタンは画面の下部。

iPad、上下逆: ホーム・ボタンは画面の上部。

iPad、横左: ホーム・ボタンは画面の左側。

iPad、横右: ホーム・ボタンは画面の右側。

iPhone、縦: ホーム・ボタンは画面の下部。

iPhone、上下逆: ホーム・ボタンは画面の上部。

iPhone、横左: ホーム・ボタンは画面の左側。

iPhone、横右: ホーム・ボタンは画面の右側。

3. 「OK」をクリックします。

27.2.7 iOSアプリケーションのデプロイ

図27-23に示すように、デプロイメント構成ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイしたり、iTunesを使用してデバイスにデプロイできます。iOSアプリケーションはAppleコンピュータからのみデプロイできます。iOSシミュレータへのデプロイメントを行うために、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップを取得する必要はありません。Apple開発者として登録されていれば、App Storeから入手できないXcodeのバージョンにアクセスできるので、問題ありません。iOSデバイスへのデプロイメントに必要なiOS開発者プログラム(第27.2.7.2項「iOSデバイスへのアプリケーションのデプロイ方法」と第27.2.7.5項「App StoreへのiOSアプリケーションの配布方法」で説明されています)の詳細は、https://developer.apple.com/programs/を参照してください。

図27-23 「デプロイメント構成」ダイアログ(iOSアプリケーション用)

27.2.7.1 iOSシミュレータへのiOSアプリケーションのデプロイ方法

「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイできます。

始める前に:

iOSシミュレータへのデプロイメントを可能にするには、次のタスクを実行する必要があります。

- Xcodeをインストールして実行し、ライセンス契約を受諾して、指示に従ってインストール後のその他のタスクを実行します。

注意:
アプリケーションをiOSシミュレータにデプロイする前に、最低1回はXcodeを実行する必要があります。これを行わないと、デプロイメントに失敗します。

- Xcodeのインストール後、iOSシミュレータを1回以上実行してください。

- 図27-25に示すように、iOSプラットフォーム「プリファレンス」ページで、iOSシミュレータのSDKの場所を設定します。

注意:
「iOSプラットフォーム」ページ(「ウィンドウ」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択してアクセス)で、プロビジョニング・プロファイルの場所と証明書の名前を入力する必要があります。詳細は、第27.2.6.2項「デバイス署名オプションの設定」を参照してください。

- アプリケーションをデプロイする前に、iOSシミュレータが実行されている場合は、そのシミュレータを停止します。シミュレータを停止しなかった場合は、デプロイメント中にその処理が実行されます。

- iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)から入手できる『iOS Simulator User Guide』を参照してください。iOSシミュレータはXcodeとともにインストールされます。

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.2.7.4.3項「アプリケーションIDの登録」を参照してください。また、第3.3項「アプリケーション機能の基本情報の定義方法」も参照してください。

注意:
デプロイされるバンドル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) - 必要に応じて、.appファイルの名前を入力します。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、MAFによって.appファイルが作成されます。または、デフォルトの名前を使用します。
デフォルトのMAFでは、.ipaファイルの名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第3.3項「アプリケーション機能の基本情報の定義方法」を参照してください。

- 「詳細オプション」 - 「オプション」をクリックして「詳細オプション」ダイアログを開き、様々なオプションを設定します。
最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

27.2.7.2 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-25を参照)。

ヒント:
ユーザーのホーム・ディレクトリ(/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-25の/Developer/usr/bin)。

図27-25 iTunes Mediaフォルダとxcodebuildシステムの場所の設定

- 証明書の名前とプロビジョニング・プロファイルの場所を、iOSプラットフォームの「プリファレンス」ページで入力します。iOS Provisioning Portalによって、iOSデバイスへのデプロイメントまたはApp Storeや内部ダウンロード・サイトへの.ipaファイルの公開に必要な証明書とプロビジョニング・プロファイルが生成されます。

注意:
デバイスまたはアーカイブにデプロイするようにiOSプロビジョニング・プロファイルと証明書を設定しないと、デプロイメントは失敗します。MAFでは、このような状況でデプロイに失敗したアプリケーションがログに記録されます。詳細は、第27.2.7.4項「iOSデバイスへのアプリケーションのデプロイに関する必知事項」を参照してください。

- デプロイメント・プロファイルの「iOSオプション」ページで、ビルド・モードとして「実行」→「OK」を選択します。

- iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)から入手できる『App Distribution Guide』を参照してください。

iOSデバイスにアプリケーションをデプロイするには:

1. 図27-17に示すように、「実行」→「デバッグ構成」を選択します。

図27-26 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.2.7.4.3項「アプリケーションIDの登録」を参照してください。また、第3.3項「アプリケーション機能の基本情報の定義方法」も参照してください。

注意:
デプロイされるバンドル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-23を参照)で「配布パッケージにデプロイ」または「デバイスとの同期のためにiTunesにデプロイ」オプションを選択すると、MAFによって.ipaファイルが作成されます。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、.appファイルが作成されます。または、デフォルトの名前を使用します。詳細は、第27.2.7.2項「iOSデバイスへのアプリケーションのデプロイ方法」と第27.2.7.5項「App StoreへのiOSアプリケーションの配布方法」を参照してください。
MAFのデフォルトでは、.ipaファイル(または.appファイル)の名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第3.3項「アプリケーション機能の基本情報の定義方法」を参照してください。

- 「詳細オプション」 - 「オプション」をクリックして「詳細オプション」ダイアログを開き、ここで図27-18に示すように、様々なオプションを設定できます。

図27-27 最小iOSバージョンの設定

最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

27.2.7.3 iOSデバイスにアプリケーションをデプロイする場合の処理

デプロイメントに成功すると、図27-21のようにアプリケーションがiTunesの「Apps」フォルダに表示されます。

27.2.7.4 iOSデバイスへのアプリケーションのデプロイに関する必知事項

iOS Developer Programのメンバーのみがアクセス可能なiOS Provisioning Portalを使用して最初にプロビジョニング・プロファイルを作成しないかぎり、iOSアプリケーション(つまり、.ipaファイル)をiOSデバイスにデプロイしたり、App Storeまたは内部のホストされたダウンロード・サイトに公開することはできません。第27.2.6.2項「デバイス署名オプションの設定」の説明に従って、「オプション」ページでプロビジョニング・プロファイルの場所と証明書の名前を入力します。

『App Distribution Guide』(iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)から入手可能)で説明されているように、プロビジョニング・ファイルは、開発証明書、デバイスおよびアプリケーションIDを関連付けます。iOS Provisioning Portalでは、これらのエンティティとプロビジョニング・プロファイルを作成できます。

ヒント:
プロビジョニング・プロファイルをダウンロードしたら、このファイルをダブルクリックしてLibrary/MobileDevice/Provisioning Profileディレクトリに追加してください。

図27-28 iOS Provisioning Portal

27.2.7.4.1 iOS開発用証明書の作成

証明書は、開発者のアイデンティティに関する情報と公開鍵および秘密鍵が結合された電子的なドキュメントです。iOS開発用証明書がOS開発者として識別し、デプロイメントのためのアプリケーションの署名を有効にするので、証明書をダウンロードしたら、基本的に開発者自身のアイデンティティを開発コンピュータにインストールします。iOSオペレーティング環境では、すべての証明書がKeychainによって管理されます。

iOS Provisioning Portalの「Certificates」ページを使用して、CSR(証明書署名リクエスト)をログに記録します。CSRを完了すると、iOS Provisioning PortalによってiOS開発用証明書が発行されます。

27.2.7.4.2 テストおよびデバッグ用のAppleデバイスの登録

開発コンピュータに証明書をインストールしたら、「Current Available Devices」タブ(iOS Provisioning Portalの「Devices」ページ内)をレビューして、開発者自身(またはその会社)がテストやデバッグに使用するAppleデバイスを特定します。シリアル番号のような一意のデバイス識別子(UDID)によって各デバイスを識別するこのリストにデバイスが含まれていないかぎり、アプリケーションはデプロイできません。

27.2.7.4.3 アプリケーションIDの登録

アプリケーションIDは、デバイス上のアプリケーションの一意の識別子です。アプリケーションIDは、第3.4項「モバイル・アプリケーションのIDおよび表示動作の設定方法」で説明されている書式の、バンドルIDと呼ばれる管理者が作成したリバース・ドメイン名の前に、バンドル・シードと呼ばれるAppleが生成した10文字の英数字文字列が付加された構成になります。図27-29には、他のアプリケーションとファイルやKeychainを共有しない、一意のアプリケーションIDが示されています。

図27-29 明示的なアプリケーション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.2.7.5 App StoreへのiOSアプリケーションの配布方法

iOSデバイス上でのアプリケーションのテストとデバッグが終了したら、App Storeまたは内部ダウンロード・サイトを通してより広範なオーディエンスにアプリケーションを配布できます。App Storeにアプリケーションを公開するには、.ipaファイルをiTunes Connectに送信する必要があります。これによって、.ipaファイルをiTunesに追加して、アプリケーションを更新し、テスト・ユーザーを作成することが可能になります。

始める前に:

アプリケーションを配布する前に、次のタスクを実行する必要があります。

- 図27-25に示すように、iOSプラットフォームの「プリファレンス」ページで、自動的にiTunesに追加ディレクトリの名前を入力します。

ヒント:
この場所を入力する前に、iTunesを1回以上実行します。第27.2.7.2項「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- 実際のiOSデバイス上でアプリケーションをテストします。第27.2.7.2項「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.3 機能アーカイブ・ファイル(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.3.1 モバイル機能アーカイブ・ファイルの作成方法

OEPEのエクスポート・ウィザードを使用して.farファイルを作成します。

始める前に:

アプリケーションの適切な接続を作成します。FARは様々な接続要件を持つ様々なアプリケーションで使用できるため、接続ソースまたは標準化された実際の接続名を表す接続名を選択します。

モバイル機能を機能アーカイブ・ファイルとしてパッケージ化する方法

1. 「ファイル」をクリックし、「エクスポート」を選択します。

2. 図27-30に示すように、「エクスポート」ウィザードで、「Oracle」→「モバイル・アプリケーション・フレームワーク」を展開し、モバイル機能アーカイブ(FAR)を選択します。

図27-30 モバイル機能アーカイブ・ファイルの作成

3. 図27-31に示すように、「次へ」をクリックし、アーカイブする機能を含んでいるビュー・プロジェクトを選択し、アーカイブ・ファイルの名前を入力します。

注意:
プロファイルには適切な名前を付けてください。そうしないと、アーカイブ名が同じアプリケーション機能を複数アップロードしたときに、問題が発生する可能性があります。

図27-31 モバイル機能アーカイブ・ファイルの名前とパスの入力

4. 「終了」をクリックします。「サマリー」ページ(図27-32を参照)に、機能アーカイブ・ファイルのJARパスがデプロイされるフルパスが表示されます。

27.3.2 機能アーカイブのデプロイメント・プロファイルのデプロイ方法

「デプロイメント・アクション」ダイアログでは、FARをJARファイルとしてデプロイできます。このダイアログには、1つのみのデプロイメント・オプション「機能アーカイブJARファイルへのデプロイ」があります。

機能アーカイブのデプロイメント・プロファイルをデプロイするには:

1. ビュー・コントローラ・プロジェクトを右クリックして、機能アーカイブのデプロイメント・プロファイルを選択します。

2. 「終了」をクリックします。「サマリー」ページ(図27-32を参照)に、機能アーカイブ・ファイルのJARパスがデプロイされるフルパスが表示されます。

図27-32 「ファイル・エクスポートのサマリー」ページ

27.3.3 機能アーカイブ・ファイルのデプロイメント・プロファイルを作成する場合の処理

外部アプリケーションからFARを使用するには、FARをアプリケーションのmaf-application.xmlファイルに登録する必要があります。図27-33は、ファイル・システム接続によりモバイル・アプリケーションで使用可能となる機能アーカイブを示しています。

図27-33 MAFアプリケーション・エディタにデプロイされた機能アーカイブJAR

27.4 モバイル・アプリケーション・アーカイブ・ファイルの作成

新しいモバイル・アプリケーションを既存のモバイル・アプリケーションから作成するには、まず元のモバイル・アプリケーションをモバイル・アプリケーション・アーカイブ(.maa)・ファイルとしてパッケージ化した後、このファイルから新しいモバイル・アプリケーションを導出します。.maaファイルは、サード・パーティによる使用が可能です(第27.5項「署名されていないデプロイメント・パッケージの作成」を参照)。

.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でのみインポートできます。JDeveloperにはインポートできません。

ExternalLibs

元のモバイル・アプリケーションの外部にあるアプリケーション・レベルのライブラリ(FARを含む)が格納されます。

META-INF

maf.propertiesおよびlogging.propertiesファイルが格納されます。

resources

次のディレクトリが含まれます。

- android: アプリケーション・アイコンやスプラッシュ画面に使用される、Android固有のイメージ・ファイルが格納されます。

- ios: アプリケーション・アイコンやスプラッシュ画面に使用される、iOS固有のイメージ・ファイルが格納されます。

- security: cacertsファイル(キーストア・ファイル)が格納されます。

表27-4に一覧表示されたアーティファクトに加えて、.maaファイルには、元のモバイル・アプリケーションの内部にあるFARまたはJARファイルが格納されたフォルダが含まれます。第27.5.2項「MAFアプリケーション・アーカイブ・ファイルをインポートする場合の処理」も参照してください。

27.4.1 モバイル・アプリケーション・アーカイブ・ファイルの作成方法

モバイル・アプリケーションの作成後、OEPEによって、デフォルトのMAFアプリケーション・アーカイブ・デプロイメント・プロファイルが作成されます。「エクスポート」ウィザードを使用すると、.maaファイルを作成できます。

モバイル・アプリケーションをMAFアプリケーション・アーカイブ・ファイルにパッケージ化するには、次の手順を実行します。

1. 「ファイル」をクリックし、「エクスポート」を選択します。

2. 図27-34のように、「エクスポート」ウィザードで、「Oracle」→「モバイル・アプリケーション・フレームワーク」を展開し、モバイル・アプリケーション・アーカイブ(MAA)を選択します。

図27-34 モバイル・アプリケーション・アーカイブ・ファイルの作成

3. 図27-35に示すように、「Next」をクリックし、アーカイブするアプリケーションの名前を選択し、モバイル・アプリケーション・アーカイブの名前を入力します。

図27-35 モバイル・アプリケーション・アーカイブ・ファイルの名前とパスの入力

4. 「終了」をクリックします。

27.5 署名されていないデプロイメント・パッケージの作成

MAFアプリケーション・アーカイブ(.maa)・ファイル形式を使用すると、署名されていないモバイル・アプリケーションをサード・パーティに提供できます。インポートした.maaファイルからモバイル・アプリケーションを導出することによって、次のような様々なカスタマイズが可能になります。

- アプリケーションへの一意のアプリケーションIDの付与(プッシュ通知を有効にする場合など)。

- 企業固有の資格証明または証明書を使用した、アプリケーションへの署名。

- カスタマイズされたスプラッシュ画面とアプリケーション・アイコンによる、リソースの置換え。

注意:
.maaファイルは、1つ以上の同じプロジェクトをすでに含んだワークスペースにはインポートできません。かわりに、.maaファイルを異なるワークスペースにインポートする必要があります。

27.5.1 署名されていないアプリケーションの作成方法

署名されていないアプリケーションを作成するには、.maaファイルを新しいモバイル・アプリケーションにインポートします。

署名されていないアプリケーションを作成するには:

1. 「File」→「インポート」を選択します。

2. 「インポート」ウィザードで、「Oracle」を展開し、モバイル・アプリケーション・アーカイブ(MAA)を選択します。「次へ」をクリックします。

3. 「モバイル・アプリケーション・アーカイブ(MAA)のインポート」ページで、「参照」をクリックし、MAAファイルに移動します。「次へ」をクリックします。

4. デプロイメント・ターゲットの構成ページで、デプロイする先のターゲットを選択し、「終了」をクリックします。

27.5.2 MAFアプリケーション・アーカイブ・ファイルをインポートする場合の処理

MAFでは、.maaファイルのインポート後に次のことを実行します。

1. アセンブリ・プロジェクト、アプリケーション・プロジェクトおよびビュー・プロジェクトごとにプロジェクトが作成されます。

2. .maaファイルからファイルが解凍されます。

27.6 Oracle Mobile Security Suiteでのデプロイ

Oracle Mobile Security Suite (OMSS)は、モバイル・アプリケーション向けにエンタープライズレベルのセキュリティを備えています。アプリケーション・データおよびデータベースの内容の暗号化を提供し、使用中のデータ漏えいを防止します。

注意:
現在、iOSデバイスではOMSSのみが使用できます。

27.6.1 OMSSを使用する前の必知事項

OEPEでは、バージョン3.0.2のOMSSを実行する必要があります。

OMSSをダウンロードし、Oracle Technology Networkでインストールに関する説明を読んでください。

http://www.oracle.com/technetwork/middleware/id-mgmt/overview/default-2099033.html

27.6.2 コンテナ化を使用してコンテンツを暗号化する方法

OMSSでは、デプロイ時にコンテナ化を使用してアプリケーション・コンテンツを暗号化します。コンテナ化は、「実行構成」メニューから制御します(図27-36を参照)。

図27-36 「実行構成」メニューからの「OMSSコンテナ化」の選択

Oracle Mobile Security Suiteを使用してアプリケーションをコンテナ化するには、次の手順を実行します。

1. 「実行」→「実行構成」を選択します。

2. 「ターゲットの構成」ペインで、「iOSターゲット」ドロップダウンから「iTunes (デバイス・デプロイ用)」を選択します。

注意:
コンテナ化は、iTunesデプロイメントでのみサポートされています。iOSシミュレータはコンテナ化をサポートしていません。

3. 「コンテナ化」ペインで、「Oracle Mobile Security Suiteを有効にする」を選択します。これにより、「プリファレンス」メニューから「コンテナ化」ダイアログが表示されます(図27-37を参照)。

図27-37 コンテナ化ツールの場所の指定

4. 「参照」アイコンをクリックし、ローカル・ファイル・システムでOracle Mobile Security Appコンテナ化ツールの場所を探します。

5. 「OK」をクリックしてコンテナ化ツールを選択します。

6. 「実行構成」ダイアログで、「実行」を選択します。

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データベースの一般的な情報は、第18章「MAF AMXでのローカル・データベースの使用方法」を参照してください。サンプル・アプリケーションについては、「ファイル」→「新」→「MAFサンプル」で入手でき、付録G「サンプルのMAFアプリケーション」で説明されている、StockTrackerサンプルを参照してください。

注意:
必ず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サービス・ポリシーを提供します。SOAP Webサービスでは、MAFアプリケーションは次のポリシーを使用します。

- oracle/http_basic_auth_over_ssl_client_policy

- oracle/wss_username_token_over_ssl_client_policy

- oracle/wss_http_token_over_ssl_client_policy

MAFは、信頼性のある既知の認証局のエントリによってシードされたcacertsファイルを提供します。アプリケーション開発者は、必要に応じてこのファイルに他の証明書を追加できます。詳細は、第29.8項「SSLのサポート」を参照してください。

28.4 サイドチャネルによるデータ漏えい

意図しないデータ漏えいは、次のような原因で発生する可能性があります。

- スクリーン・ショットの無効化(バックグラウンド実行): iOSおよびAndroidは、アプリケーションの再アクティブ化の認識されるパフォーマンスを高めるために、アプリケーションをバックグラウンドで実行する前にアプリケーションのスクリーン・ショットを取得します。しかし、顧客データの漏えいの可能性があるため、これらのスクリーン・ショットはセキュリティ上の問題の原因となります。

- キー・ストローク・ロギング: iOSおよびAndroidでは、キーボードを使用して入力した情報の一部が、先行入力機能で使用するためにアプリケーション・ディレクトリに自動的に記録されます。この機能は、顧客データの潜在的な漏えいにつながる可能性があります。

- デバッグ・メッセージ: アプリケーションでは、機密データをデバッグ・ログに書き込むことができます。ロギング・レベルを「FINE」に設定すると、ユーザーのデバイスとサーバーの間で転送されるすべてのデータに関してログ・メッセージが書き込まれます。

- アプリケーションの一部として表示される機密ドキュメントに関して、クリップボード・コピーおよび「Open In」機能を無効にします。MAFでは現在、コピーおよびOpen In機能を無効にする機能は提供されておらず、今後のリリースで提供が予定されています。

- 一時ディレクトリ: 機密データが含まれる場合があります。

- サード・パーティ・ライブラリ: これらのライブラリ(adライブラリなど)により、ユーザー、デバイス、ユーザーの場所に関するユーザー情報が漏えいする可能性があります。

データ漏えいを防止するには:

- 資格証明、個人情報(PII)などの機密データをアプリケーション・ログに記録しないようにします。すべての機密情報をネイティブ・キー・チェーン、暗号化データベースまたはファイル・システムに格納します。

- アプリケーションのデバッグ時に、作成されたすべてのファイルおよびそれらのファイルに書き込まれたすべての内容を確認します。

- アプリケーションを公開する前に、デバッグ・メッセージを削除します。

28.5 不十分な認可および認証

不十分な認証メカニズムとクライアント側アクセス制御は両方とも、セキュリティを脅かします。

エンド・ユーザーはユーザー名とパスワードよりも、電話番号またはなんらかのタイプの識別子(IMEI、IMSIまたはUUID)を使用してデバイスを認証する方が簡単ですが、これらの識別子は総当たり攻撃によって容易に検出される可能性があるため、唯一のオーセンティケータとして使用しないようにしてください。かわりにモバイル・アプリケーションは、機密データにアクセスするときは強力な資格証明を使用する必要があります。認証は、デバイスではなくユーザーを反映する必要があります。さらに、コンテキスト識別子(場所など)、音声、フィンガープリントまたは動作情報を使用して認証を強化できます。

開発者は、MAFで提供されているデフォルトのログイン・ページまたは開発者が作成するカスタム・ログイン・ページのいずれかを使用できます。詳細は、第29.5.2項「ログイン・ページの指定方法」を参照してください。

第29.5.1項「認証を要求するようにアプリケーション機能を設定する方法」で説明されているように、安全なアクセスを必要とするMAFアプリケーションのすべての機能は、セキュリティを有効にする必要があります。

さらに、クライアントではなくサーバーによってアクセス制御を強制する必要があります。クライアント・モバイル・アプリケーションがこの機能を担うと、安全性が低下します。アクセス制御サービス(ACS)を使用すると、開発者は、サーバー上で定義されたロール/権限を使用してモバイル・アプリケーションでアクセス制御を強制することができます。アクセス制御サービスは、アプリケーションで有効なユーザー・ロール/権限をフィルタリングするためにアプリケーション開発者が実装できる、RESTfulサービスです。アプリケーションでは数千のユーザー・ロールがサポートされている場合がありますが、このサービスは、モバイル・アプリケーションに対して指定したロールのみを返します。詳細は、第29.4.14項「アクセス制御の構成方法」を参照してください。

28.6 不適切な暗号化

次の理由により、暗号化は不確実なものになります。

1. アプリケーションで間違った実装を使用しているか、または既知のアルゴリズムを不正に使用している。

2. 暗号が容易に解読されるために、データが安全でない。

さらに、Base-64エンコーディング、不明瞭化およびシリアライズは暗号化ではありません(暗号化と誤解しないようにしてください)。

データを正常に暗号化するには:

- 暗号化データと一緒にキーを格納しないでください。

- プラットフォーム固有のファイル暗号化APIまたは別の信頼できるソースを使用します。暗号を自分で作成しないでください。

第28.2項「デバイスでの安全でないデータ格納」に示す暗号化方法を使用して、埋込みSQLiteデータベースを保護するのに加えて、SSLを適用して安全なWebサービス・コールを作成します(第28.3項「不十分なトランスポート・レイヤー保護」を参照)。MAFは資格証明を安全に処理するために、Mobile and Social IDM SDK用にOracle Access Managerを使用します。

28.7 クロスサイト・スクリプティングからのクライアント側インジェクション

モバイル・アプリケーションは様々なソースからコンテンツおよびデータを取り出すため、ユーザー・セッションを乗っ取るクロスサイト・スクリプティング(XSS)インジェクションに対して脆弱である可能性があります。MAFは主にエンコーディングによってXSSを防止しますが、追加の安全策としてホワイトリストを使用します。

ホワイトリストは、許可されたドメインのみがアプリケーション機能のWebビュー内で開くことができるようにして、MAFアプリケーションをCSRF攻撃から保護します。リストに含まれないURIは、自動的にデバイスのブラウザ内、つまりモバイル・アプリケーションのサンドボックス外で開かれます。

インジェクション攻撃に加えて、モバイル・アプリケーションはクロスサイト・リクエスト・フォージェリ(CSRF)に対して脆弱であり、この攻撃では、悪意のあるページが、ユーザーIDを格納するWebブラウザにキャッシュされたCookieを使用して、ユーザーに代わってターゲット・アプリケーションで意図しないアクションを実行します。ホワイトリストとアプリケーション・サンドボックスを組み合せることで、CSRFの問題に対応します。

28.7.1 ホワイトリストを使用したXSSに対するアプリケーションの保護

MAFアプリケーションでは、リモート・サーバーを介してユーザー・インタフェースが配信されるアプリケーションで、XSSおよびCSRF攻撃が発生する場合があります。リモートURLからコンテンツを取得するようにモバイル・アプリケーションを構成するときは、MAFで提供されている概要エディタを使用して、コンテンツを配信するURLのホワイトリストを作成できます。ホワイトリスト内のURLはMAF Webビューで開かれ、指定したデバイス機能およびサービスにアクセスできます。ホワイトリスト内のURIは、ワイルドカードを使用して構成できます。

注意:
意図しないURIがデバイス機能にアクセスするのを防止するには、特定のターゲット・ドメインに対してのみホワイトリストを定義します。ホワイトリスト内のドメインを定義するときは、ワイルドカードを慎重に使用してください。広範囲のURIに使用できるワイルドカードベースのホワイトリスト構成は定義しないでください(たとえば、<adfmf:domain>*.*</adfmf:domain>や<adfmf:domain>*.com</adfmf:domain>などの構成は使用しません)。

28.7.2 デバイス・アクセス権限を使用したインジェクション攻撃からのMAFアプリケーションの保護

ホワイトリストに含めたURIは、ユーザーのデバイスに格納されたデータの他、カメラやアドレス帳などの様々なデバイス機能にアクセスできます。第10.2項「MAFアプリケーションでのコア・プラグインの有効化」に示すようなアクセスは、デフォルトでは付与されていませんが、MAFアプリケーションを構成して、ホワイトリストに含まれるURIがアクセスできるデバイスの機能を次のいずれかに制限できます。

- オープン・ネットワーク・ソケット(ユーザー認証の構成時に許可する必要がある)

- GPSおよびネットワークベースの位置情報サービス

- 連絡先

- 電子メール

- SMS

- 電話

- プッシュ通知

- ローカルに格納されたファイル

ヒント:
ホワイトリスト構成に加えて、updateSecurityConfigWithURLParametersメソッド(ログイン構成の変更を検出してから、再認証によって変更を確認するようにユーザーに求める)を使用して、XSSによって挿入された偽のログイン・ページなどのセキュリティ・リスクから、プログラムによりユーザーを保護することができます(第29.4.6項「実行時の名前付き接続の接続属性の更新方法」を参照)。さらに、MAFはユーザーが保護されたアプリケーション機能を開くたびに、ユーザーに通知します。デフォルト・アプリケーションにセキュリティが適用されないと、認証が遅延する可能性があります。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

28.7.3 カスタムHTMLコンポーネントからのインジェクション攻撃のリスクについて

HTMLを使用してMAF AMXページでカスタム・ユーザー・インタフェース・コンポーネントを作成すると、アプリケーションがインジェクション攻撃を受けやすい状態になる可能性があります。MAFは、MAF AMXページのHTMLコンテンツに対して、<amx:verbatim>と<amx:outputHTML>の2つのコンポーネントを提供しています。<amx:verbatim>コンポーネントでは動的HTMLが許可されないため、インジェクション攻撃を受けにくくなります。ただし、ELバインディングによって動的HTMLコンテンツを配信する<amx:outputHTML>コンポーネントは、そのsecurity属性をnoneに構成すると脆弱になる可能性があります。デフォルトでは、onClickイベントなど、フレームワークが様々なHTMLタグをエスケープしてJavaScriptを削除できるように、この属性はhighに設定されています。この属性をnoneに設定すると、iFrameコンポーネントおよびJavaScriptが有効になる(これにより、AMXベージ内でAJAXリクエストが可能になる)ため、HTMLおよびJavaScriptが適切にエンコードされていることを確認する必要があります。詳細は、第13.3.18項「Verbatimコンポーネントの使用方法」および第13.3.19項「出力HTMLコンポーネントの使用方法」を参照してください。また、第28.8項「信頼できない入力に対するセキュリティ決定」も参照してください。

28.7.4 SQLインジェクションおよびXMLインジェクションについて

モバイル・アプリケーションはSQLインジェクションに対して脆弱であるため、攻撃者は埋込みSQLiteデータベースに格納されたデータを読取りできる可能性があります。

SQLインジェクションを防止するには:

- アプリケーション開発者は、ローカル・データベースに格納されたすべてのデータを検証し、エンコードする必要があります。

- アプリケーション開発者は、アプリケーションによって処理されるXMLおよびHTMLコンテンツをエンコードし、検証することが想定されています。

28.8 信頼できない入力に対するセキュリティ決定

iOSプラットフォームとAndroidプラットフォームの両方において、アプリケーション(Skypeなど)は必ずしも外部からの許可をリクエストするとは限らないため、攻撃者にエントリ・ポイントを提供して、悪意のあるアプリケーションがセキュリティを回避してしまう可能性があります。その結果、アプリケーションはクライアント側のインジェクションおよびデータ漏えいに対して脆弱になります。必ず追加の認可を求めるプロンプトを表示するか、あるいは追加の認可が可能でない場合は、保護を必要とするアプリケーションを起動するための追加のステップを提供してください。

アプリケーションが信頼できないサードパーティ・アプリケーションから受信する(またはこれらのアプリケーションに送信する)すべてのデータが、入力検証の対象となっていることを確認する必要があります。アプリケーションに対するクライアント側のXML入力を、エンコードおよび検証する必要があります。MAF AMXコンポーネントではユーザー入力を検証できますが、データはサーバー上で検証する必要があり、サーバーはクライアントから受信するデータを信頼しないようにする必要があります。つまり、サーバーとクライアントの間で送受信されるXML、JSONおよびJavaScriptが適切にエンコードされていることを確認する役割は、サーバーが担います。

別のアプリケーションからMAFアプリケーションを起動するURLスキームを構成するときは、URLを介して送信されるパラメータを検証して、悪意のあるデータまたはURIがMAFアプリケーションに渡される可能性がないことを確認する必要があります。詳細は、第28.1項「サーバー側の不十分な制御」を参照してください。

JSON解析について

可能な場合は、MAFのJSONエンコーディングAPIを使用します。カスタムJSON構成を必要とするシナリオでは、ユーザー入力データを使用してJSONを構成するときには注意が必要です。JSONデータの処理の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

28.9 不適切なセッション処理

モバイル・アプリケーションのユーザビリティ要件では、多くの場合、長期にわたって継続するセッションが求められます。モバイル・アプリケーションは、セッション管理にCookie、SSOサービスおよびOAUTHトークンを使用します。Oracle Access Management Mobile and Social (OAMMS)では、OAuthトークンがサポートされています。

注意:
OAuthアクセス・トークンは、リモートで取り消すことができます。

適切なセッション処理を有効にするには:

- ログイン・サーバー接続のセッション・タイムアウトを、サーバー側のセッション・タイムアウトよりも小さい値に構成します。
デバイスIDは期限切れになることがないため、セッション・トークンとして使用しないでください。アプリケーションでは、ユーザーが再認証を行う必要が生じても、トークンを期限切れにする必要があります。

- サーバーでのトークン生成時に、適切なベスト・プラクティス(https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Projectの「OWASP Top Ten Project」を参照)に従っていることを確認してください。
容易に予測できるか、または適切に生成されていないセッション・トークンを使用しないでください。セッション・トークンは予測不能で、エントロピが高い必要があります。

Oracle Identity Management (IDM)スタックでは、モバイル・アプリケーションで使用するための標準ベースのトークン(OAuthアクセス・トークン、JWTトークンなど)がサポートされています。MAFでは、Oracle IDM OAuthサーバーに対して即時利用可能なサポートが提供されており、MAFアプリケーションでこのような標準ベースの認証メカニズムを使用することをお薦めします。

第29.4.2項「基本認証の構成方法」で説明されているように、ユーザーがログイン・サーバーに対して認証を行う必要があるアプリケーションの構成には、セッションの持続時間およびアイドル・タイムアウトを設定するオプションが含まれます。デフォルトでは、アプリケーション機能セッションの持続時間は8時間です。アプリケーション機能がアイドル状態にあるデフォルト時間は、5分間です。MAFでは、いずれかの構成期間が過ぎるとユーザー資格証明が期限切れになり、ユーザーに再認証を求めるプロンプトが表示されます。

28.10 バイナリ保護の欠如による機密情報の漏えい

攻撃者はリバース・エンジニアリングを使用して、APIキー、パスワード、機密ビジネス・ロジックなどの機密データを検出できます。この情報を保護するには:

- APIキーおよび機密ビジネス・ロジックをサーバー上に格納します。

- パスワードをアプリケーション・バイナリに格納しないでください。

- パスワードをハードコード化しないでください。かわりに、第28.2項「デバイスでの安全でないデータ格納」で説明されているGeneratedPasswordユーティリティを使用します。

- ログ・ファイルをモニターできるので、アプリケーションが機密情報をログ・ファイルに書き込まないことを確認します。第28.4項「サイドチャネルによるデータ漏えい」も参照してください。

- 情報がファイル・システム上に格納される(つまり、モバイル・アプリケーションの外部に格納される)ことに注意してください。機密データを暗号化されたデータベースまたはファイル・システム、あるいはネイティブ・キー・チェーンに格納します。リスク1:「デバイスでの安全でないデータ格納」も参照してください。

29 MAFアプリケーションの保護

この章では、Oracle Mobile Application Framework内のセキュリティ・フレームワークの概要およびセキュリティが適用されるようにモバイル・アプリケーションを構成する方法について説明します。

この章には次の項が含まれます:

- 第29.1項「モバイル・アプリケーション・フレームワークのセキュリティについて」

- 第29.2項「ユーザー・ログイン・プロセスについて」

- 第29.3項「モバイル・アプリケーションの認証プロセスの概要」

- 第29.4項「MAF接続の構成」

- 第29.5項「モバイル・アプリケーションのセキュリティの構成」

- 第29.6項「デバイス機能へのアクセスの許可」

- 第29.7項「ユーザーによるアプリケーション機能からのログアウトの有効化」

- 第29.8項「SSLのサポート」

第29.1項 モバイル・アプリケーション・フレームワークのセキュリティについて

MAFは、保護されているアプリケーション機能がアクティブ化されたときに、ユーザーにログイン・ページを表示します。たとえば、アプリケーション機能がWebビュー内に表示されようとしているときやオペレーティング・システムがアプリケーションをフォアグラウンドに戻したときに、ユーザーにログイン・ページを表示します。MAFは、アプリケーション機能が認証サーバーによって保護されているときや、アプリケーション機能にユーザー・ロールまたはユーザー権限に基づいた制約が含まれているときに、アプリケーション機能へのアクセスにユーザー認証を必要とするかどうかを決定します。MAFは、ユーザーが有効な資格証明を入力した場合のみ、目的のWebビュー、UIコンポーネントまたはアプリケーション・ページをレンダリングします。

いずれかのアプリケーション機能にこれらの条件を設定すると、ユーザーがログインに成功しないとモバイル・アプリケーションにアクセスできないようにできる一方、保護されておらず、またアクセスに関連する制約も含んでいないデフォルトのアプリケーション機能を含めることで、保護されているアプリケーション機能と保護されていないアプリケーション機能の両方を含むモバイル・アプリケーションに、ユーザーがアクセスできるようにすることもできます。この状況では、ユーザーは認証せずにMAFアプリケーションにアクセスできます。デフォルトのアプリケーション機能は、保護されていないデータを表示することも、保護されているアプリケーション機能にアクセスする際にリモート・サーバーに対して認証することもできるこのような匿名ユーザーに対して、モバイル・アプリケーションの入口として機能します。次の方法により、保護されていないデフォルトのアプリケーション機能を指定できます。

- デフォルトのアプリケーション機能を通じて公共の情報にアクセスすることを匿名ユーザーに許可する一方、認可されたユーザーのみが保護された情報にアクセスできるようにする。

- ユーザーが、保護されているアプリケーション機能にアクセスする必要がある場合にのみ、ユーザーに認証を許可する。これ以外の場合、ユーザーは匿名ユーザーとしてモバイル・アプリケーションにアクセスするか、ログインして保護されている機能に移動できます。

- アクセスを保護する必要がない場合に、保護されているアプリケーション機能からログアウトすることをユーザーに許可し、それにより権限のないユーザーが保護されているアプリケーション機能にアクセスすることを明示的に禁止する。

注意:
アプリケーション・ログイン・プロセスはアプリケーションの初期化フローから切り離されるため、MAFは匿名ユーザーを有効化し、ユーザーは、認証資格証明を入力しなくても、匿名ユーザーとしてモバイル・アプリケーションを起動し、保護されていないアプリケーション機能にアクセスできます。このような場合、MAFは、権限が必要なUIコンポーネントを無効化して、ユーザーの操作を制限します。

詳細は、第29.5.1項「認証を要求するようにアプリケーション機能を設定する方法」および第22.2.4項「ユーザー制約とアクセス制御について」を参照してください。

IDM Mobile SDKは、認証、暗号化、ユーザーとロール管理およびセキュアな保存のためのAPIを提供します。SDKは、Mobile and Socialサーバーが公開するBasic認証およびREST Webサービスを使用した認証をサポートしています。Mobile and Socialサーバーは、リライイング・パーティ認証(つまりサード・パーティのOpenIdおよびOAuthサービス・プロバイダに対する認証)を使用した厳密な認証機能を持つ(または持たない)Oracle Access Manager (OAM)サーバーに対する認証および厳密な認証機能を持つ(または持たない)ディレクトリ・サーバーに対する認証をサポートしています。

モバイル・アプリケーションでは、デフォルト・ページまたはHTMLで記述されたカスタマイズ済のログイン・ページのいずれかが使用されます。ナレッジベース認証がOAMMサーバーで構成されている場合、ログイン・ページの認証で、ナレッジベース認証ページを有効化できます。「ナレッジベース認証」画面には、ユーザーに対して、母親の旧姓などの追加情報を求める追加のチャレンジが表示されます。「ナレッジベース認証」画面は、ログイン・ページと同様にカスタマイズできます。

29.1.1 制約に基づくアクセス制御について

特定のロールおよび権限を付与されたユーザーのみが、user.rolesまたはuser.privileges制約で定義されるアプリケーション機能にアクセスできます。ユーザーがこのようなアプリケーション機能にログインすると、アクセス制御サービス(ACS)として知られるWebサービスは、アプリケーション機能へのアクセス権を付与するユーザー・オブジェクトをユーザーに返します。ACSの詳細は、第29.4.15項「アクセス制御サービスに関する必知事項」を参照してください。

第29.2項 ユーザー・ログイン・プロセスについて

エンド・ユーザーの視点からは、ログイン・プロセスは次のようなものになります。

1. ユーザーが保護されたアプリケーション機能にアクセスしようとすると、常に、図29-1に示すログイン・ページのWebビューがMAFによって表示されます。保護されているアプリケーション機能がデフォルトである場合、ユーザーがモバイル・アプリケーションを起動すると、MAFによってユーザーにログイン・ページが表示されます。

図29-1 ログイン・ページ

注意:
第29.5.3.2項「カスタム・ログイン・ページ」で説明されているとおり、MAFでは、ログイン・ページが表示されるだけでなく、カスタム・ログイン・ページの使用もサポートし、またオプションでカスタム・ナレッジベース認証画面も表示されます。

2. ユーザーがユーザー名とパスワードを入力し、「OK」をクリックします。

注意:
MAFでは、同じアプリケーションに対して複数のユーザーを許可します。ユーザーは、前のユーザーがログアウトした後、アプリケーションに自由にログインできます。

3. ユーザー名とパスワードが検証されると、MAFによって、目的のWebビュー、ページまたはユーザー・インタフェース・コンポーネントが表示されます。

4. MAFは、ユーザーが正常にログインするまで、ユーザー名とパスワードの入力を求めます。ユーザーがログインできない場合、別のアプリケーション機能に移動することのみが可能です。

5. ユーザー名およびパスワードを認証すると、ユーザーに資格証明と追加の質問にチャレンジするナレッジベース認証画面が表示される場合があります。ナレッジベース認証が構成されている場合、ユーザーは質問に正しく回答して、ログイン・プロセスを完了する必要があります。ナレッジベース認証はオプションの構成で、OAMMサーバーで適切に構成する必要があります。

注意:
アプリケーション機能が最後にアクティブ化されて以降、事前定義された時間が経過すると、認証はタイムアウトになります。MAFでは、認証サーバーへの接続を使用するアプリケーション機能のいずれかがアクティブ化されたときのみ、アイドル・タイムアウトのタイマーの期限が更新されます。

第29.3項 モバイル・アプリケーションの認証プロセスの概要

モバイル・アプリケーションでは、リモート・ログイン・サーバー(Oracle ADF Fusion Webアプリケーションが使用するOracle Access Managerアイデンティティ・サーバーなど)またはユーザーのデバイス上にあるローカル資格証明ストアに対してユーザー資格証明の検証を必要とする場合があります。ローカルおよびリモートの接続モードをサポートするために、MAFは次の認証プロトコルをサポートしています。

- HTTP基本

- Mobile-Social

- OAuth

- Web SSO

デフォルトでは、モバイル・アプリケーション・ユーザーの認証は、設計時に選択されている認証プロトコルに関係なく、リモート・ログイン・サーバーに対して行われます。Oracle Access Management Mobile and Social (OAMMS)およびローカル認証を可能にする基本認証の場合、開発者はアプリケーションを構成できます。ただし、最初はローカル資格証明ストアに資格証明が伝播されていないため、保護されているアプリケーション機能にアクセスするためのログインでは、リモート・ログイン・サーバーに対する認証が必要です。リモート認証に成功すると、その後、認証サーバーのユーザーのログイン資格証明をデバイス上に格納するローカル資格証明ストアを使用できるようになります。そのため、ユーザーが同じアプリケーション・セッション内(つまり、アプリケーション実行のライフサイクル内)でサーバーに対して認証されると、MAFは認証コンテキストをローカルに格納し、以降の認証の試行でそれを使用できるようになります。この場合、ローカルの認証コンテキストで問題なくユーザーを認証できる場合、MAFでは、ログイン・サーバーに接続されません。最初の認証では認証サーバーへの接続が必要ですが、ローカル認証を使用したアプリケーションのためにこのサーバーに頻繁にアクセスする必要はありません。

ヒント:
ローカル資格証明ストアに対する認証は、リモート・ログイン・サーバーに対する認証よりも高速に実行できますが、リモート接続のみをサポートしているOAuthまたはWeb SSO認証プロトコルを使用した認証をお薦めします。

表29-1に、MAFアプリケーションのログイン構成オプションをまとめます。接続モードは、選択した認証プロトコルによって異なります。

表29-1 MAFの接続モードおよびサポートされている認証プロトコル

接続モード

サポートされているプロトコル

モードの説明

「ローカル」

- HTTP基本

- Mobile-Social

ローカルに格納されている資格証明がデバイスで利用できない場合にのみ、アプリケーションでは、リモート・ログイン・サーバーに対する認証が必要です。初回ログインは、常にリモート・ログイン・サーバーに対して行われます。初回ログインに成功すると、MAFは、資格証明をデバイスの資格証明ストア内にローカルに保持します。アプリケーション機能への以降のアクセスでは、それらの資格証明が使用されます。第29.4.13項「Webサービス・セキュリティに関する必知事項」も参照してください。

「リモート」

- HTTP基本

- Mobile-Social

- OAuth

- Web SSO

アプリケーションでは、Oracle Access Manager (OAM) Identity Serverなどのリモート・ログイン・サーバーまたは保護されているWebアプリケーションでの認証が必要です。ユーザーがログインするたびに、リモート・サーバーに対する認証が求められます。デバイスがサーバーに接続できない場合、ユーザーは、前回は正常に認証されていても、アプリケーションにログインすることはできません。

「ハイブリッド」

- HTTP基本

- Mobile-Social

デバイスでローカル資格証明が利用可能でも、ネットワーク接続が利用できる場合は、アプリケーションでは、リモート・ログイン・サーバーに対する認証が必要です。ネットワーク接続がないためにログイン・サーバーにアクセスできない場合にのみ、デバイスのローカル資格証明が使用されます。

モバイル・アプリケーションが認証サーバーに対してユーザー資格証明を検証するときのセキュリティのフローは、次のとおりです。

1. MAFは、(図29-1のような)ログイン・ページ、またはナレッジベース認証画面をユーザーに表示します。

2. Oracle Access Management Mobile and Social (OAMMS)クライアントSDKのAPIが、保存されたユーザー・オブジェクトを格納できるデバイスの認証サーバーおよび資格証明ストアの両方に対する資格証明認証を処理します。認証が成功すると、APIはMAFに有効なユーザー・オブジェクトを返します。失敗した場合は、エラーを返します。

注意:
OAMMSにログインすると、ロールおよび権限コレクションがuserオブジェクトに移入されます。

3. ログインに成功すると、MAFは、Cookieで使用されるOAMトークンを受け取ります。各ログイン接続にCookieが設定されます。

4. OAMMSクライアントSDK APIは、デバイスの資格証明ストアに資格証明を保存します。

5. ログインに失敗した場合、ログイン・ページまたはナレッジ・ベース認証画面が表示されたままになり、ユーザーは先に進むことができません。

29.4 MAF接続の構成

セキュリティが適用されるアプリケーション機能のアプリケーション・ログイン・サーバーに1つ以上の接続を定義する必要があります。アプリケーション・ログイン・サーバーへの定義済の接続が存在しないと、無効な構成になります。その結果、アプリケーションは正しく機能しません。

第29.4.1項 MAFログイン接続の作成方法

図29-2に示すとおり、モバイル・ログイン・サーバー接続ウィザードを使用して接続タイプを選択できますが、接続タイプによっては、ローカルおよびリモート認証(ハイブリッド)の両方を有効化できます。アプリケーション要件によっては、次の認証プロトコルをサポートするサーバーへの接続を構成できます。

- HTTP基本

- Mobile-Social

- OAuth

- Web SSO

注意:
OAuthまたはWeb SSO接続タイプを使用したログイン・サーバーへの接続を構成することをお薦めします。OAuthおよびWeb SSOは、リモート・ログイン・サーバーに対する認証を要求し、ユーザーがローカル資格証明ストアからデバイスで認証することを許可しません。

図29-2 認証の構成

ログイン・サーバー接続を作成するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを展開してMAFを展開し、MAFアプリケーション・エディタをダブルクリックします。

注意:
MAFアプリケーション・エディタを使用すると、アプリケーション・ログイン・サーバー接続を定義し、それをデフォルトのアプリケーション機能に割り当てることができます(デフォルトのアプリケーション機能が保護されている場合)。この場合、アプリケーション・ログイン・サーバーに指定されている資格証明は、アクセス制御サービス(ACS)を介してユーザー、ロールおよびサービスを検索するためにも使用されます。第29.4.15項「アクセス制御サービスに関する必知事項」も参照してください。

2. エディタで、アウトラインの「セキュリティ」を選択し、次のいずれかの隣にある「作成」をクリックします。

- デフォルト・ログイン・サーバー

- 「ログイン・ページ」

- 「ナレッジベース認証ページ」

3. 図29-2に示すとおり、モバイル・ログイン・サーバー接続ウィザードで、新規接続の作成を選択し、認証サーバー・タイプを選択します。接続タイプについては、次の項で説明します。

第29.4.2項 基本認証の構成方法

図29-3に示すとおり、「モバイル・ログイン・サーバー」ウィザードで、「HTTP基本」認証サーバー・タイプを選択すると、基本認証の接続を構成できます。

図29-3 基本認証の構成

基本認証を構成するには:

1. 「モバイル・ログイン・サーバー接続」ウィザードで、認証サーバー・タイプとして「HTTP基本」を選択します。「次へ」をクリックします。
「モバイル・ログイン・サーバー接続」ウィザードを開く方法の詳細は、第29.4.1項「MAFログイン接続の作成方法」を参照してください。

2. 「一般オプション」ページで、次の項目を定義します。

- 「名前」: 接続の名前を入力します。

- 認証モード: 表29-1の説明に従って、認証のタイプを選択します。

- 「アイドル・タイムアウト」: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:
MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を行いますが、セッション・タイムアウト後にこの認証を行うことはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- 「RESTコールにログイン・サーバーを含める」: リモート認証を使用したアプリケーション機能では、このオプションを選択すると、ログイン・サーバー生成ユーザー・セッション・コードを通じてログイン・サーバーに格納される、認可されたユーザー・データを取得するためにREST Webサービスを有効化できます。詳細は、第29.4.10項「CookieをREST Webサービス・コールに追加することに関する必知事項」を参照してください。

注意:
CookieをREST Webサービス・コールに挿入できるようにするには、アプリケーション機能にリモート認証が使用されている必要があり(MAFは、ユーザー資格証明をローカルに保存するアプリケーション機能に対するCookieの挿入をサポートしていません)、また「ログインURL」に入力されたドメインが、REST Webサービス・エンド・ポイントと一致する必要があります。

- 「HTTPリクエストに基本認証ヘッダーを含めます」: このオプションを選択すると、MAFでは、Webビューから作成したHTTPリクエストに基本認証ヘッダーを追加できます。基本認証は、MAFが使用するデフォルトのリクエスト・メソッドです。基本認証ヘッダーは、ログイン接続タイプがHTTP基本である場合にのみ挿入されます。第29.4.12項「基本認証ヘッダーの挿入に関する必知事項」も参照してください。

- レルム: ユーザー名とパスワードの認証レルムを定義すると、OEPEによって、再利用可能な定義済の<realm>要素がconnections.xmlファイルに移入されます。詳細は、第29.4.12項「基本認証ヘッダーの挿入に関する必知事項」を参照してください。同じレルムの複数のページで資格証明を共有します。資格証明がMy Realmというレルムのページで動作する場合、同じユーザー名とパスワードの組合せは、同じレルムの別のページでも動作します。

「次へ」をクリックします。

3. 図29-4に示すとおり、「HTTP基本オプション」ページで、次の項目を構成します。

- ログインURL: 認証サーバーのログインURLを入力します。

- ログアウトURL: 認証サーバーのログアウトURLを入力します。

- 「マルチテナント対応」: MAFでは、モバイル・アプリケーションは、様々な組織(テナント)が共有するホスト・アプリケーション機能を含みますが、その機能は特定のテナントによって所有されているかのように見えるマルチテナントの概念をサポートしています。このオプションを選択すると、モバイル・アプリケーション接続にマルチテナント対応を定義できます。第29.4.17項「マルチテナント接続を定義する場合の処理」も参照してください。

- マルチテナント・ヘッダー名: 「マルチテナント対応」が選択されている場合、ヘッダー名を指定します。

図29-4 基本認証の構成

4. 「テスト」をクリックして、認証サーバーへの接続をテストします。結果はウィザードに表示されます。

5. 第29.4.7項「ログイン資格証明の格納方法」に示すとおり、「次へ」をクリックして、「ログイン・オプション」ページを開いて、パラメータを構成します。

6. 第29.4.14項「アクセス制御の構成方法」に示すとおり、「次へ」をクリックして、「認可オプション」ページを開いて、パラメータを構成します。

7. 「終了」をクリックして、接続を作成します。

第29.4.3項 Web SSO認証の構成方法

図29-5に示すとおり、「モバイル・ログイン・サーバー接続」ウィザードを使用して、クロスドメイン・シングル・サインオンを構成できます。

図29-5 フェデレーテッドSSO認証の構成

Web SSOサーバーで認証を構成するには:

1. 「モバイル・ログイン・サーバー接続」ウィザードで、認証サーバー・タイプとして「Webシングル・サインオン」を選択し、「次へ」をクリックします。
「モバイル・ログイン・サーバー接続」ウィザードを開く方法の詳細は、第29.4.1項「MAFログイン接続の作成方法」を参照してください。

2. 「一般オプション」ページで、図29-6に示すとおり、次の項目を構成します。

図29-6 接続の構成

- 「接続名」: 接続の名前を入力します。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- 「RESTコールにログイン・サーバーを含める」: リモート認証を使用したアプリケーション機能では、このオプションを選択すると、ログイン・サーバー生成ユーザー・セッション・コードを通じてログイン・サーバーに格納される、認可されたユーザー・データを取得するためにREST Webサービスを有効化できます。詳細は、第29.4.10項「CookieをREST Webサービス・コールに追加することに関する必知事項」を参照してください。

「次へ」をクリックします。

3. 「Webシングル・サインオン・オプション」ページで、成功したログインと失敗したログインを有効化するURLを構成します。をクリックしてURLをテストできます。

図29-7 認証URLの構成

4. 第29.4.14項「アクセス制御の構成方法」に示すとおり、「次へ」をクリックして、「認可オプション」ページで、パラメータを構成します。

29.4.4 Oracle MobileおよびSocial Identity Managementを使用した認証の構成方法

図29-8に示すとおり「モバイル・ログイン・サーバー接続」でOracle Access Management Mobile and Social (OAMMS)認証サーバー・タイプを選択すると、Oracle Access Manager (OAM)サーバーを使用して認証できるようにモバイル・アプリケーションの接続を構成できます。この接続タイプのOAMバックエンドは、Oracle Mobile and Socialサーバーおよび10g WebGate (リソースに対するHTTPリクエストを捕捉して、それらを認証と認可のためにOAMサーバーに転送するWebサーバー・プラグイン)を実行している必要があります。

図29-8 Mobile-Socialを使用した認証の構成

始める前に:

OAMバックエンドがOracle Mobile and Socialサーバーおよび10g Webgateを実行していることを確認します。

OM_PROP_OAMMS_URLプロパティ・キーを使用するようにサーバーを構成します。Mobile and Socialサーバーにアクセスするには、このURL(プロトコル、ホスト名およびポート番号を含む)が必要です。HTTPおよびHTTPSプロトコルのみがサポートされています。また、OAM_ID CookieをWebサーバー・リクエスト・ヘッダーに挿入するようにサーバーを構成する必要もあります。

注意:
この接続タイプには、ナレッジベース認証(KBA)が必要です。詳細は、第29.5.2項「ログイン・ページの指定方法」を参照してください。

Oracle Mobile and Socialサーバーを使用してOracle Access Managementで認証を構成するには:

1. 「モバイル・ログイン・サーバー接続」ウィザードで、認証サーバー・タイプとして「Oracle Access Management Mobile and Social (OAMMS)」を選択し、「次へ」をクリックします。
「モバイル・ログイン・サーバー接続」ウィザードを開く方法の詳細は、第29.4.1項「MAFログイン接続の作成方法」を参照してください。

2. 「一般オプション」ページで、次の項目を定義します。

- 「接続名」: 接続の名前を入力します。

- 認証モード: 表29-1の説明に従って、認証のタイプを選択します。

- 「アイドル・タイムアウト」: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:
MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を行いますが、セッション・タイムアウト後にこの認証を行うことはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- 「RESTコールにログイン・サーバーを含める」: リモート認証を使用したアプリケーション機能では、このオプションを選択すると、ログイン・サーバー生成ユーザー・セッション・コードを通じてログイン・サーバーに格納される、認可されたユーザー・データを取得するためにREST Webサービスを有効化できます。詳細は、第29.4.10項「CookieをREST Webサービス・コールに追加することに関する必知事項」を参照してください。

注意:
CookieをREST Webサービス・コールに挿入できるようにするには、アプリケーション機能にリモート認証が使用されている必要があり(MAFは、ユーザー資格証明をローカルに保存するアプリケーション機能に対するCookieの挿入をサポートしていません)、また「ログインURL」に入力されたドメインが、REST Webサービス・エンド・ポイントと一致する必要があります。

- 「HTTPリクエストに基本認証ヘッダーを含めます」: このオプションを選択すると、MAFでは、Webビューから作成したHTTPリクエストに基本認証ヘッダーを追加できます。基本認証は、MAFが使用するデフォルトのリクエスト・メソッドです。基本認証ヘッダーは、ログイン接続タイプがHTTP基本である場合にのみ挿入されます。第29.4.12項「基本認証ヘッダーの挿入に関する必知事項」も参照してください。

3. 「OAMMS」ページで、Oracle Access Management Mobile and SocialサーバーのURLを入力し、モバイル・アプリケーション・サービス・ドメインを入力します。
また、図29-9に示すとおり、サーバーがデバイス上で場所を更新できるように接続を構成することもできます。

図29-9 OAM認証の構成

4. 第29.4.7項「ログイン資格証明の格納方法」に示すとおり、「次へ」をクリックして、パラメータを構成できる「ログイン・オプション」ページを開きます。

5. 第29.4.14項「アクセス制御の構成方法」に示すとおり、「次へ」をクリックして、パラメータを構成できる「認可オプション」ページを開きます。

第29.4.5項 OAuth認証の構成方法

図29-10に示すとおり、「モバイル・ログイン・サーバー接続」ウィザードを使用して、サード・パーティ・アプリケーション(クライアント)が、保護されているデータまたはリモート・サーバー上に格納されているサービスへの制限付きアクセスを取得する方法を構成できます。Oracle Mobile and Socialサーバーが提供するリライイング・パーティ認証を使用すると、アプリケーションで、サードパーティOAuthプロバイダに対する認証を行うことができます。Oracle Web Services Manager (OWSM) Lite MobileのADFアプリケーション・エージェントは、Webサービス・コールのセキュリティ・ヘッダーにCookieを挿入します。

図29-10 OAuthの構成

始める前に:

OM_PROP_OAUTH_OAUTH20_SERVERプロパティ・キーを使用するようにサーバーを構成します。

OAuthサーバーで認証を構成するには:

1. 「モバイル・ログイン・サーバー接続」ウィザードで、「認証サーバー・タイプ」として「OAuth2」を選択し、「次へ」をクリックします。
「モバイル・ログイン・サーバー接続」ウィザードを開く方法の詳細は、第29.4.1項「MAFログイン接続の作成方法」を参照してください。

2. 「一般」ページで、次の項目を構成し、「次へ」をクリックします。

- 「接続名」: 接続の名前を入力します。

- 「RESTコールにログイン・サーバーを含める」: リモート認証を使用したアプリケーション機能では、このオプションを選択すると、ログイン・サーバー生成ユーザー・セッション・コードを通じてログイン・サーバーに格納される、認可されたユーザー・データを取得するためにREST Webサービスを有効化できます。詳細は、第29.4.10項「CookieをREST Webサービス・コールに追加することに関する必知事項」を参照してください。

注意:
CookieをREST Webサービス・コールに挿入できるようにするには、アプリケーション機能にリモート認証が使用されている必要があり(MAFは、ユーザー資格証明をローカルに保存するアプリケーション機能に対するCookieの挿入をサポートしていません)、また「ログインURL」に入力されたドメインが、REST Webサービス・エンド・ポイントと一致する必要があります。

3. 「OAuth2」ページで、図29-11に示すとおり、次の項目を構成し、「次へ」をクリックします。

- 「権限タイプ」を選択し、アプリケーションがログイン・ページを取得する場所を決めます。サーバー・ログイン・ページを表示する場合は、「認可コード」を選択します。MAFアプリケーションでデフォルト・ログイン・ページまたはカスタム・ログイン・ページ(構成されている場合)を表示する場合は、「リソース所有者の資格証明」を選択します。

- 「クライアントID」を入力し、オプションで、「クライアント・シークレット」フィールドに接続パスワードの値を入力します。

- 「認可エンドポイント」自体のエンドポイントのURI、「トークン・エンドポイント」および認証サーバーの「リダイレクト・エンドポイント」を入力します。

- 「ログアウトURL」を入力します。

- 「マルチテナント対応」: MAFでは、モバイル・アプリケーションは、様々な組織(テナント)が共有するホスト・アプリケーション機能を含みますが、その機能は特定のテナントによって所有されているかのように見えるマルチテナントの概念をサポートしています。このオプションを選択すると、モバイル・アプリケーション接続にマルチテナント対応を定義できます。第29.4.17項「マルチテナント接続を定義する場合の処理」も参照してください。

- マルチテナント・ヘッダー名: 「マルチテナント対応」が選択されている場合、ヘッダー名を指定します。

- 基本認証ヘッダーを含める: このオプションを選択すると、MAFでは、Webビューから作成したHTTPリクエストに基本認証ヘッダーを追加できます。第29.4.12項「基本認証ヘッダーの挿入に関する必知事項」も参照してください。

- Cookieの挿入はデフォルトで選択されます。

- ログイン・ページをアプリケーション内の埋込みブラウザ内に表示する場合は、「埋込みブラウザの使用」を選択します。外部ブラウザでログイン・ページを表示するには選択解除します。シングル・サインオン(SSO)を使用する場合、このオプションを選択解除して、アプリケーションに外部ブラウザを使用させる必要があることに注意してください。

- 「スコープ」に1つ以上入力します。

図29-11 クライアントIDおよびエンドポイントの構成

4. 第29.4.14項「アクセス制御の構成方法」の説明に従って、「認可」ページでパラメータを構成します。

第29.4.6項 実行時の名前付き接続の接続属性の更新方法

アプリケーション開発者は、AdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIを使用して、完全に移入された接続定義にすでに存在する接続の接続属性の定義または再定義を行うことができます。

注意:
一般的なタイミングは、アプリケーション・ライフサイクル・リスナー内でstart()メソッド実装にAdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIをコールします。機能ライフサイクル・リスナー内からこのメソッドをコールしないでください。

configUrlParamパラメータに関連付けられた接続属性を更新するには、updatedSecurityConfigWithURLParametersメソッドを次のようにコールします。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.updateSecurityConfigWithURLParameters(configUrlParam,
key, message, showConfirmation);

keyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして設定されます。MAFが接続の既存の属性に対する接続構成の変更を検出すると、trueに設定されたshowConfirmationパラメータでメソッドを呼び出して、MAFで確認プロンプトをエンドユーザーに表示できます。

AdfmfJavaUtiltiesクラスおよびconfigUrlParamパラメータの使用方法の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

第29.4.7項 ログイン資格証明の格納方法

セキュリティが重要でない場合、MAFはユーザー資格証明の格納をサポートしますが、これは、ログイン・サーバーにリプレイできるか、またはユーザーをローカルで認証するために使用できます(ログイン接続に定義されているモードによって異なります)。資格証明を格納すると、ユーザーはログインせずにモバイル・アプリケーションにアクセスできるため、ユーザーの操作性が向上します。IDM Mobile SDKを使用すると、MAFは次のモードをサポートできます。

- 自動ログイン - MAFはユーザー資格証明をキャッシュし、以降の認証時にそれらを認証サーバーにリプレイします。このモードでは、ユーザーは、MAFによってユーザーに資格証明を入力または確認するよう求められずにアプリケーションを起動できます。ただし、MAFは、新しいアプリケーション・セッションが開始されたことをユーザーに通知できます。

- 資格証明を記憶 - MAFは、ユーザー資格証明をキャッシュし、ログイン・ページのユーザー名およびパスワード・フィールドを移入します。ユーザーがログイン・ボタンをタップして、これらの資格証明を確認すると、MAFはそれらを認証サーバーにリプレイします。

- ユーザー名を記憶 - MAFは、ユーザー名をキャッシュし、ログイン・ページの「ユーザー名」フィールドを移入します。ユーザーがパスワードを入力し、ログイン・ボタンをタップして確認すると、MAFはそれらの資格証明を認証サーバーにリプレイします。

注意:
ユーザーは、MAFが資格証明を格納するかどうかを決定できます。

図29-12に示すとおり、「モバイル・ログイン・サーバー接続」ウィザードの「ログイン・オプション」ページを使用して、資格証明の格納オプションを選択できます。資格証明オプションを使用すると、オプションを使用したログイン・ページが移入され、ユーザー名とパスワードが記憶されるため、オプションデバイスが複数のエンド・ユーザーによって共有されている場合は選択しないでください。

図29-12 ユーザー資格証明のキャッシュ

第29.4.8項 ローカル接続およびハイブリッド・ログイン接続のための複数IDに関する必知事項

ローカルおよびハイブリッド・ログイン接続モードでは、リモート接続と同様、ユーザーはアプリケーション・ライフサイクル内で任意の数のIDを使用して、ログインおよびログアウトできます。ログイン接続を定義してこれらの接続モードを使用するとき、現在のセッション・タイムアウト期間内に、保護されているアプリケーション機能にすでにログイン済である場合は、ユーザーは、ローカル資格証明ストアを使用して保護されているアプリケーション機能に再びログインできます。この場合、明示的にログアウトしたユーザーまたはアイドル・タイムアウトが期限切れになっているためにログアウトされたユーザーは、保護されているアプリケーション機能(またはアプリケーション機能を保護するログイン・サーバーによって保護されているその他のアプリケーション機能)に再びログインできます。

注意:
基本認証およびOracle Access Management Mobile and Social (OAMMS)への認証では、ローカルおよびハイブリッド接続のみを利用できます。OAuthおよびFederate SSOはリモート認証を使用するため、認証が成功しない場合、アプリケーション・ユーザーはアプリケーションに再びログインできません。

29.4.9 REST Webサービス・コールへのCookieの挿入を可能にする場合の処理

図29-14に示すとおり、「モバイル・ログイン・サーバー接続」ダイアログで「RESTコールにログイン・サーバーのCookieを含める」オプションを選択すると、MAFは、ログイン・サーバーによって送信されたこのユーザー・セッションCookieを取得し、それをモバイル・アプリケーションから開始されたREST Webサービス・コールのHTTPヘッダーに挿入します。

モバイル・アプリケーションがREST Webサービスを要求するたびに、MAFのセキュリティ・フレームワークは、REST Webサービスのトランスポート・レイヤーが、REST WebサービスのURLエンドポイントに関連付けられているログイン接続に対してCookieの挿入が可能かどうかをチェックできるようにします。つまり、connections.xmlファイルには、<injectCookiesToRESTHttpHeader value="true"/>を含める必要があります(第29.4.18項「モバイル・アプリケーション作成時の処理」の例を参照)。

接続でCookieの挿入が許可されていて、ログイン・サーバーとREST Webサービス・エンドポイントのドメインが一致している場合、セキュリティ・フレームワークによって、ユーザーがアプリケーション機能にログインしたときに格納されたCookieが取得されます。MAFは、REST Webサービス・リクエストのドメインのために格納されているすべてのCookieを伝播します。MAFは、Rest Webサービス・レスポンスの各「設定-Cookie」ヘッダーのCookieを格納します。「設定-Cookie」ヘッダーは、Cookieをストアに追加したり、既存のCookieを新しいCookieと置き換えることができます(名前が同じ場合)。REST Webサービス・レスポンスによって返されるCookieおよび認証プロセスによって返されるCookieは、以降のREST Webサービス・リクエストに挿入されます。

注意:
MAFは、Oracle Access Management Mobile and Social (OAMMS) APIをコールすることで、Cookie文字列を作成し、Oracle Access Management Mobile and Social (OAMMS) APIは、プラットフォーム固有のCookieストアから名前でCookieを戻します。IDM Mobile SDKは、認証サーバーによって戻されたCookieを管理します。それらの名前は、connections.xmlファイルで定義されます。

第29.4.10項 CookieをREST Webサービス・コールに追加することに関する必知事項

ユーザーがモバイル・アプリケーションによって正常に認証されると、ログイン・サーバーは、そのユーザーのセキュリティ・コンテキストを作成し、ユーザー・セッションを追跡するCookieを生成します。図29-14に示すとおり、「モバイル・ログイン・サーバー接続」ダイアログで「RESTコールにログイン・サーバーのCookieを含める」オプションを選択すると、MAFは、ログイン・サーバーによって送信されたこのユーザー・セッションCookieを取得し、それをモバイル・アプリケーションから開始されたREST Webサービス・コールのHTTPヘッダーに挿入します。

CookieをWebサービス・コールに伝播することで、ログイン・サーバーに格納されているユーザーのセキュリティ・コンテキストを取得し、モバイル・アプリケーションがREST Webサービスを使用して、そのユーザーに対して認可されているアプリケーション・データにアクセスできるようになります。ユーザー・セッションCookieが期限切れになると、MAFは、ユーザーに資格証明を要求し、ユーザーを再認証します。再認証されたユーザーは、引き続き、REST Webサービス・コールを介して認可済のアプリケーション・データにアクセスできます。

第29.4.11項 実行時に行われる処理: MAFがREST Webサービスをコールした場合

ユーザーがローカルで認証されると、MAFは、モバイル・アプリケーションがREST Webサービスをコールするときに、ログイン・サーバーに対してユーザーをサイレントに認証します。ユーザーの資格証明が認証されると、MAFは、REST Webサービスに対してアプリケーションのリクエストを実行します。REST Webサービスが401ステータス・コードを返した場合(未許可)、MAFは、ユーザーにもう一度認証するよう求めます。REST Webサービスが302コードを返した場合(見つかったか一時的に移動されている)、MAFは、ログイン・サーバーをチェックして、ユーザーが認証されているか確認します。その場合は、コードが302リダイレクトとして処理されます。

ユーザーがログイン・サーバーに対して認証されていない場合、MAFは、ユーザーにもう一度認証するよう求めます。302ステータス・コードを返した場合、ログイン・サーバーは、ユーザーに独自のWebページを使用して認証するよう求めることもあります。このような場合、MAFはリダイレクションをサポートしていないため、かわりにユーザーにもう一度MAFログイン・ページを使用してログインするよう求めます。

29.4.12 基本認証ヘッダーの挿入に関する必知事項

サーバーがCookieを受け付けない場合、MAFでは、Webビューから発行されたHTTPリクエストに基本認証ヘッダーを挿入することで、アプリケーション機能がセキュア・リソースにアクセスできます。デフォルトでは、MAFは基本認証を使用します。デフォルトでは「HTTPリクエストに基本認証ヘッダーを含めます」オプションが選択されているため、MAFでは、Webビューから発行されたHTTPリクエストに基本認証ヘッダーを挿入することによって、アプリケーション機能はセキュア・リソースにアクセスできます。

注意:
MAFによって基本認証ヘッダーが挿入されないようにするには、<injectBasicAuthHeader>要素の値属性をfalseに設定します。

ユーザー名とパスワードの認証レルムを定義すると、定義された<realm>要素を使用したconnections.xmlファイルが移入されます。次の例に示すとおり、MAFは、connections.xmlファイルがそれらの定義を含むか含まないかにかかわらず、ヘッダーを追加します。

次の例は、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"/>
<injectBasicAuthHeader value="true"/>
<userObjectFilter/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

29.4.13 Webサービス・セキュリティに関する必知事項

Webサービスでは、ログイン・ページはなく、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービス・コールのヘッダーに資格証明が挿入されます。Webサービスは、ローカルに格納されている資格証明(ユーザーによる認証サーバーへの最初のログインの成功後、MAFによって保持されている資格証明)を使用してアプリケーション・データにアクセスします。ローカル資格証明ストアの名前は、ログイン・サーバー接続のadfCredentialStoreKey属性によって反映されます(第29.4.18項「モバイル・アプリケーション作成時の処理」の例のadfCredentialStoreKey="Connection_1"など)。Webサービスがこの資格証明ストアを使用できるようにするには、SOAPまたはREST Webサービス接続のadfCredentialStoreKey属性に対して定義されている名前が、ログイン・サーバーのadfCredentialStoreKey属性に対して定義されている名前と一致する必要があります。

注意:
エディションconnections.xmlの場合、XMLエディタの「設計」タブを使用して、<Reference>要素のadfcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新できます。または、「ソース」エディタを使用して属性を追加または更新できます。

詳細は、第15.5.2項「資格証明の挿入に関する必知事項」を参照してください。

第29.4.14項 アクセス制御の構成方法

図29-13に示すとおり、「モバイル・ログイン・サーバー接続」ウィザードの「認可」ページを使用して、アクセス制御を構成できます。アプリケーション機能にセキュリティ保護されているコンポーネントが含まれている場合は、このページを使用します。たとえば、disabledとして定義されたsecurityContextオブジェクトを含むEL式を使用して、送信ボタンがある経費レポート・アプリケーションを構成すると、manager権限でこのアプリケーションにログインするユーザーのみに送信ボタンが表示されます。この「認可」ページのフィールドを完了すると、アクセス制御サービス(アプリケーション機能がチェックする特定のユーザー・ロールの取得を可能にするRESTful Webサービス)が構成されます。

図29-13 アクセス制御の構成

アプリケーション・ログイン・サーバーによって付与されるアクセス制御は、第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.4.1項「MAFログイン接続の作成方法」を参照してください。

2. 図29-13に示すとおり、「認可」ページで、認可要件を完了します。

- アクセス制御サービスURL: アクセス制御サービス(ACS)のエンドポイントであるURLを入力します。

注意:
MAFは、ACSを呼び出すときに、認証サーバー(つまりログイン・サーバー)によって発行されたすべてのCookieをHTTPリクエスト・ヘッダーに挿入します。Cookieの挿入は、「RESTコールにログイン・サーバーを含める」を選択し、「アクセス制御URL」パラメータと「ログインURL」パラメータに同じドメインを入力した場合に発生します。MAFは、Cookieを挿入する前に、ACS URLおよびログインURLのドメインが同一であるかを検証します。同一でない場合、ログイン・サーバーのCookieはACSリクエストに挿入されないため、ACSに対する認証は失敗します。原則として、セキュア・アクセスのためにユーザー認証が必要となるよう、ACS URLを保護する必要があります。第29.4.10項「CookieをREST Webサービス・コールに追加することに関する必知事項」も参照してください。

- 「ロール」: アプリケーション機能によってチェックされるユーザー・ロールを入力します。セキュリティ・システムには、数千もの定義済のユーザー・ロールおよび権限が存在する可能性があるため、アプリケーション機能に固有のロールが記載されているマニフェスト(これは、アプリケーション機能の開発者によって提供されます)を使用して、このリストを作成します。

- 「権限」: アプリケーション機能によってチェックされる権限を入力します。

29.4.15 アクセス制御サービスに関する必知事項

アクセス制御サービス(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というユーザーに割り当てられているすべてのフィルタとロールをリクエストします。

次の例は、ユーザー・ロールと権限に対するACSリクエストを示しています。

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.5.2項「資格証明の挿入に関する必知事項」を参照してください。

注意:
ACSサービスを実装してホストする必要があり、MAFでは、このサービスは提供されません。

第29.4.16項 アプリケーションのロード順の変更方法

MAFは、図29-13に示すように、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.4.12項「基本認証ヘッダーの挿入に関する必知事項」の例を参照)。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.4.17項 マルチテナント接続を定義する場合の処理

「モバイル・ログイン・サーバー接続」ウィザードを完了すると、MAFは、connections.xmlファイルに、trueに設定された<isMultiTenantAware>要素を移入します。マルチテナント接続では、ユーザー名は、テナント名とユーザー名を集約したものです。

接続がマルチテナント対応である場合、ログイン・ページは、JavaScriptユーティリティを使用して認識します。ログイン・ページがそのような接続を検出すると、追加フィールドが表示され、ユーザーは、モバイル・ログイン・サーバー接続に構成されているテナント名をそのフィールドに入力する必要があります。ログイン(正しいテナントIDの入力を含む)が成功すると、MAFは、ローカル資格証明ストアにテナントIDを格納します。

第29.4.18項 モバイル・アプリケーション作成時の処理

MAFでは、connections.xmlファイル内のすべての接続情報が集約されます(このファイルは、「プロジェクト・エクスプローラ」の「アプリケーション・リソース」パネルの「ディスクリプタ」および「ADF META-INF」ノードの下にあります)。このファイル(次の例を参照)は、アプリケーションにバンドルすることも、構成サービス用にホスティングすることもできます。後者の場合、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.jsf"/>
<logout url="http://10.0.0.0/SecuredWebServicelogout/logout.jsf"/>
<accessControl url="http://10.0.0.0/Identity/Authorize"/>
<isAcsCalledAutomatically value="false"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<isMultiTenantAware value="true"/>
<multiTenantHeaderName value="Oracle_Multi_Tenant"/>
<injectCookiesToRESTHttpHeader value="true"/>
<userObjectFilter>
<role name="manager"/>
<privilege name="account manager"/>
<privilege name="supervisor"/>
<privilege name=""/>
</userObjectFilter>
<rememberCredentials>
<enableRememberUserName value="true"/>
<rememberUserNameDefault value="true"/>
<enableRememberPassword value="true"/>
<rememberPasswordDefault value="true"/>
<enableStayLoggedIn value="true"/>
<stayLoggedInDefault value="true"/>
</rememberCredentials>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

詳細は、『Oracle Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のconnections.xmlファイルに定義されている参照に関する項を参照してください。

第29.5項 モバイル・アプリケーションのセキュリティの構成

MAF機能エディタ、MAFアプリケーション・エディタおよび「モバイル・ログイン・サーバー接続」ウィザードを使用してセキュリティを構成します。エディタを使用すると、認証を必要とするアプリケーション機能をユーザーが選択したときにMAFによって表示されるログイン・ページのタイプ(デフォルトまたはカスタム)を指定したり、ユーザー・ロールまたはユーザー権限ベースの制約を含めることができます。また、これらによって、セキュリティが必要な埋込みアプリケーション機能を選択することもできます。

29.5.1 認証を要求するようにアプリケーション機能を設定する方法

セキュリティが適用されるように各アプリケーション機能を定義できます。残りのセキュリティ構成は、MAFアプリケーション・エディタの「セキュリティ」のセクションを使用して行います。アプリケーション機能のコンテンツがリモートURLから提供される場合に、このエディタを使用すると、リモートURLのコンテンツをMAFのWebビューに表示できるように、ドメインをホワイトリストできます。詳細は、第20章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

図29-14に示すとおり、セキュリティが適用されるアプリケーション機能およびMAF機能エディタの「機能」セクションで必要な認証タイプを指定できます。

図29-14 アプリケーション機能に対するユーザー資格証明オプションの指定

始める前に:

機能のセキュリティを有効化すると、アプリケーションは、ネットワークにアクセスしてユーザーを認証する必要があります。詳細は、第10.2項「MAFアプリケーションでのコア・プラグインの有効化」を参照してください。

アプリケーション機能に対するユーザー・アクセスを指定するには:

1. プロジェクト・エクスプローラのユーザー・インタフェース・プロジェクトで、MAFを展開し、「MAF機能エディタ」をダブルクリックします。

2. MAF機能エディタで、「機能」の下にリストされているアプリケーション機能を選択するか、または「機能」を右クリックし、「新」を選択してアプリケーション機能を追加します。

3. ログインが必要なアプリケーション機能に「セキュリティの有効化」を選択します。

ヒント:
このオプションをデフォルトのアプリケーションに適用しない場合、ユーザーは匿名で(つまり、ログイン資格証明を入力せずに)ログインできます。ユーザーは、保護されていないデータおよび機能にアクセスでき、要求があった場合にはログインします(認証されたユーザーは、保護されているデータと保護されていないデータの両方にアクセスできます)。モバイル・アプリケーション内の保護されていないアプリケーション機能を指定すると、ユーザーは、保護されているアプリケーション機能からログアウトできますが、モバイル・アプリケーション自体ではログイン状態が維持され、保護されていないアプリケーション機能とデータの両方へのアクセスを継続します。

29.5.2 ログイン・ページの指定方法

アプリケーション機能のセキュリティを指定したら、図29-15に示されているMAFアプリケーション・エディタの「セキュリティ」ページを使用して、セキュリティが適用される各アプリケーション機能に対して、ログイン・ページの構成およびログイン・サーバーへの接続の作成とその割当てを行います。このページにリストされているすべてのアプリケーション機能は、MAF機能エディタで、セキュリティが必要なものとして指定されています。通常、アプリケーション機能のグループは、同じログイン・サーバー接続で保護され、ユーザーは、MAFから再度ログインを求められることなく、これらのアプリケーションをどれでも開くことが可能です。ただし、場合によっては、あるアプリケーション機能のセットを保護しているログイン・サーバーと、別のアプリケーション機能のセットを保護しているログイン・サーバーが異なるため、アプリケーション機能で要求される資格証明がそれぞれ異なる可能性があります。このような状況に対応するために、モバイル・アプリケーション用のログイン・サーバーへの接続をいくつも定義できます。maf-application.xmlファイルでは、機能参照に関連付けられている認証サーバー接続は、次のようにloginConnRefId属性を使用して指定されます。

<adfmf:featureReference id="feature1" loginConnRefId="Connection_1"/>
<adfmf:featureReference id="feature2" loginConnRefId="Connection2"/>

モバイル・アプリケーションは、HTTPまたはHTTPS経由の基本認証をサポートしている標準のログイン・サーバーなら、どのログイン・サーバーに対しても認証を受けることが可能です。MAFはまた、Oracle Identity Managementに対する認証もサポートしています。特定のアプリケーション機能用のカスタム・ログイン・ページを選択することもできます。詳細は、第29.5.3項「ログイン・ページに関する必知事項」を参照してください。

注意:
ログイン・サーバー(接続)は、「セキュリティ」タブで定義します。登録された機能タブでは、特定の機能にそれらを割り当てたり、<default>を使用できます。セキュリティが機能に対して無効になっている場合(機能から実行)、ログイン・サーバーを割り当てることはできません。機能でセキュリティが必要であり、ログイン・サーバーがアプリケーションに対して定義されていない場合、検証問題が発生します。

図29-15 MAFアプリケーション・エディタに登録された機能

始める前に:

第22.2.4項「ユーザー制約とアクセス制御について」の説明に従って、ユーザー権限とロール用の制約を追加します。

アクセス制御サービス(ACS)・サーバーをプロビジョニングします。詳細は、第29.4.15項「アクセス制御サービスに関する必知事項」を参照してください。

カスタム・ログイン・ページは、アプリケーション・コントローラ・プロジェクトで定義されます(図29-16を参照)。

図29-16 カスタム・ログイン・ページの追加

ログイン・ページおよびナレッジベース認証を指定するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトおよびMAFの順に展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

2. アウトラインで、「セキュリティ」をクリックします。

3. 「セキュリティ」ページで、ログイン・ページのタイプを指定します。

- ユーザー名およびパスワードを受け入れるビューとして、「ログイン・ページ」を選択します。

- ユーザーにユーザーの資格証明のチャレンジを表示し、またそれらの答えを受け入れるナレッジベース・ビューとして、「ナレッジベース認証ページ」を選択します。ナレッジベース認証はOAAMサーバー上に構成でき、別のページで、母の旧姓などの追加の質問に対する入力をユーザーに求めることができます。この機能は、Mobile-Social認証タイプのみで利用できます。

4. 選択したログイン・ページおよびナレッジベース認証ページ(オプション)のコンテンツ(またはユーザー・インタフェース)を選択します。

- 「デフォルト」: すべての選択した埋込みアプリケーション機能に使用されるデフォルト・ログイン・ページまたはナレッジベース認証画面。詳細は、第29.5.3.1項「デフォルト・ログイン・ページ」を参照してください。デフォルトのログイン・ページおよびデフォルト・ナレッジベース認証は、MAFによって提供されているものです。

- 「カスタム」: 「参照」をクリックして、アプリケーション・コントローラ・プロジェクト内のファイルのパスの場所を検索します。または、「新」をクリックして、ログイン・ページまたはナレッジベース認証ページのいずれかのアプリケーション・コントローラ・プロジェクト内にカスタムHTMLページを作成します。詳細は、第29.5.3.2項「カスタム・ログイン・ページ」および第29.5.3.3項「カスタム・ログインHTMLページの作成」を参照してください。

ヒント:
「参照」機能を使用してログイン・ページの場所を検索するのではなく、「プロジェクト・エクスプローラ」からログイン・ページをフィールドにドラッグできます。

29.5.3 ログイン・ページに関する必知事項

アプリケーション機能への認証プロセスのエントリ・ポイントは、activateライフサイクル・イベントです(第11.1.2項「モバイル・アプリケーション・イベントのタイミング」を参照)。アプリケーション機能がアクティブ化される(つまり、アプリケーション機能のactivateイベント・ハンドラがコールされる)たびに、アプリケーション機能のログイン・プロセスが実行されます。このプロセスは、ログイン・ページ(デフォルトまたはカスタムのログイン・ページのいずれか)に移動し、そこでユーザー認証が必要かどうかを判断します。ただし、プロセスがログイン・ページに移動する前に、本来意図されていたアプリケーション機能をMAFに登録する必要があります。認証が成功すると、ログイン・ページは、MAFから本来意図されていた宛先を取得し、そこに移動します。

29.5.3.1 デフォルト・ログイン・ページ

MAFによって提供されるデフォルト・ログイン・ページ(図29-1「ログイン・ページ」を参照)は、ログイン・ボタンと、ユーザー名、パスワード、マルチテナント名およびエラー・メッセージ・セクション用の入力テキスト・フィールドから構成されます。これは、HTMLで記述されたクロス・プラットフォーム・ページです。

29.5.3.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ディレクトリ内のログイン・ページにアクセスするには、モバイル・アプリケーションをデプロイし、次にdeployディレクトリに移動します。iOSデプロイメントの場合、このページは、アプリケーション・ワークスペース・ディレクトリ/deploy/デプロイメント・プロファイル名/temporary_xcode_project/www/adf.login.htmlおよびアプリケーション・ワークスペース・ディレクトリ/deploy/デプロイメント・プロファイル名/temporary_xcode_project/www/adf.kba.htmlにあります。
Androidデプロイメントの場合、このページは、アプリケーション・ワークスペース・ディレクトリ/アプリケーション名/deploy/デプロイメント・プロファイル名/デプロイメント・プロファイル名.apk/assets/www/adf.login.htmlおよびアプリケーション・ワークスペース・ディレクトリ/アプリケーション名/deploy/デプロイメント・プロファイル名/デプロイメント・プロファイル名.apk/assets/www/adf.kba.htmlのAndroidアプリケーション・パッケージ(.apk)ファイル内にあります。

次の例は、デフォルト・ログイン・ページに必要な<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"/>

次の例は、ナレッジベース認証のログイン・ページに必要な要素を示しています。

<input type="text"

<label id="oracle_access_kba_ques_id" >Question</label><br>

<input class="field-value"
name="oracle_access_kba_ans_id"
id="oracle_access_kba_ans_id">
</input>

<label id="oracle_access_error_id"
class="error-text">
</label>

<label id="message_id"
class="message-text">
</label>

<input type="button"
onclick="oracle_access_sendParams(this.id)"
value="Login"
id="oracle_access_submit_id"/>

29.5.3.3 カスタム・ログインHTMLページの作成

MAFのデプロイメントによってwwwディレクトリ内に生成されるアーティファクトである、デフォルトのログイン・ページ(adf.login.htmlまたはadf.kba.html)を使用して、カスタム・ログイン・ページを作成できます。

始める前に:

wwwディレクトリ内のログイン・ページにアクセスするには、モバイル・アプリケーションをデプロイした後、deployディレクトリに移動します。iOSデプロイメントの場合、ページは次の場所にあります。

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/adf.login.html

および

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/adf.kba.html

Androidデプロイメントの場合、ページは、次の場所にあるAndroidアプリケーション・パッケージ(.apk)ファイル内に配置されます。

application workspace directory/application name/deploy/deployment profile name/deployment profiile name.apk/assets/www/adf.login.html

および

application workspace directory/application name/deploy/deployment profile name/deployment profiile name.apk/assets/www/adf.kba.html

カスタム・ログイン・ページを作成するには:

1. デフォルト・ログイン・ページを、ユーザー・インタフェース・プロジェクトのpublic_htmlディレクトリ内の場所(users\workspace\アプリケーション名\ApplicationController\public_htmlなど)にコピーします。

2. ログイン・ページの名前を変更します。

3. ページを更新します。

4. MAFアプリケーション・エディタの「セキュリティ」のセクションで、「カスタム」を選択し、「参照」をクリックしてログイン・ページの場所を検索します。詳細は、第5.1項「MAFアプリケーションの表示動作の概要」を参照してください。

第29.5.4項 ログイン・ページ要素に関する必知事項

各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_kba_ques_id

「ナレッジベース認証」の回答フィールド

oracle_access_ans_id

「エラー」フィールド

oracle_access_error_id

自動ログイン・チェック・ボックス

oracle_access_auto_login_id

「資格証明を記憶」チェック・ボックス

oracle_access_remember_credentials_id

「ユーザー名を記憶」チェック・ボックス

oracle_access_remember_username_id

表29-3は、OnClickイベントで使用される推奨のJavaScriptコードをリストしています。

表29-3 OnClickイベントで使用されるJavaScript

ボタン

JavaScript

「ログイン」ボタン

oracle_access_sendParams(this.id)

「取消」ボタン

oracle_access_sendParams(this.id)

ナレッジベース認証の「submit」ボタン

oracle_access_sendParams(this.id)

ナレッジベース認証の「取消」ボタン

oracle_access_sendParams(this.id)

29.5.5 アプリケーション機能用にセキュリティを構成する場合のOEPEでの処理

セキュリティが適用されるようにアプリケーション機能が指定されると、OEPEは、図29-15に示すとおり、対応する機能参照で登録された機能を更新します。参照される各アプリケーション機能が、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.5.1項「認証を要求するようにアプリケーション機能を設定する方法」を参照してください。Oracle Mobile Application Frameworkタグ・リファレンスも参照してください。

第29.6項 デバイス機能へのアクセスの許可

デバイス機能へのアクセスは、MAFアプリケーションに組み込まれているCordovaプラグインによって定義されます。コア・プラグインのセットはMAFによって提供されます。これらのプラグインの1つを有効にすると、そのプラグインに必要なすべてのデバイス・アクセス権限が有効になります。MAFアプリケーションに組み込まれている他のCordovaプラグインも、必要なデバイス・アクセス権限を有効にします。

MAFアプリケーションの大多数ではネットワーク・アクセスが必要なため、ネットワークにアクセスする権限はデフォルトで有効になっています(デフォルトで有効になっている唯一のデバイス機能)。

- ネットワーク情報: アプリケーションによるネットワーク・ソケットのオープンを許可します。少なくとも1つのデバイス機能のセキュリティが有効な場合、ネットワーク・アクセス機能は有効にしておく必要があります。

デバイス機能の有効化または制限が可能なため、デプロイメント・フレームワークによって更新されるプラットフォーム固有の様々な構成ファイルやマニフェスト・ファイルでは、使用中のデバイス機能(または、MAFアプリケーションに使用が登録されているプラグイン)のみがリストされます。これらのファイルにより、MAFはこれらの機能の使用に関する情報を他のアプリケーションと共有できます。たとえば、AppStoreやGoogle Playに対して、MAFアプリケーションで場所ベースの機能が(搭載されていても)使用されていないことを通知できます。

MAFアプリケーションのCordovaプラグインの詳細は、第10章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

第29.7項 ユーザーによるアプリケーション機能からのログアウトの有効化

ユーザーが、保護されているコンテンツを含むアプリケーション機能からログアウトするとき、または制約によって制限されているときは、MAFはアプリケーション機能を終了せず、またユーザーはアプリケーション内でログイン状態を維持し、セキュアでないコンテンツおよび機能に匿名ユーザーとしてアクセスできます。MAFでは、制約を再初期化できるため、ユーザーは、同じアイデンティティを使用して、アプリケーションに繰り返しログインできます。また、MAFは、ユーザーに別のアイデンティティを使用したログインを許可することで、複数のアイデンティティでアクセスを共有できます。

Oracle Mobile Application Framework Java APIリファレンスで説明しているAdfmfJavaUtilitiesクラスのlogoutFeatureメソッドおよびlogoutメソッドにより、ユーザーはアプリケーションの起動後、認証サーバーに対する明示的なログインおよびログアウトを実行できます。さらに、ユーザーは、保護されているアプリケーション機能を呼び出した後、認証サーバーにログインできます。ユーザーは個々のアプリケーション機能からログアウトできますが、同じ接続で保護されているアプリケーション機能から同時にログアウトできます。

これらのメソッドでは、次のような操作を実行できます。

- アプリケーション機能からログアウトするが、保護されていないコンテンツへのアクセスを継続する(つまり、MAFはアプリケーションを終了しない)。

- ログイン・サーバーで認証する一方、アプリケーションで、保護されているそのコンテンツおよびUIコンポーネントを有効化する。

- モバイル・アプリケーションまたはアプリケーション機能からログアウトし、別のアイデンティティを使用して再度ログインする。

- モバイル・アプリケーションまたはアプリケーション機能からログアウトし、更新されたロールおよび権限を持つ同じアイデンティティを使用して再度ログインする。

現在の認証サーバーからログアウトできるようにするには、次のように、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.8 SSLのサポート

MAFは、cacerts証明書ファイル(HTTPSハンドシェークのためのクライアント・アプリケーションおよびサーバー間のJavaメカニズム)を提供します。第2.2.2項「MAFアプリケーションを作成する場合の処理」に示すとおり、OEPEは、アプリケーション・リソースのSecurityフォルダ(users\workspaces\application name\resources\Security\cacertsにある)内にこのファイルを作成します。MAF cacertsファイルにより、既知の信頼できるソースからの一連の証明書がJVM 1.4に対して識別され、デプロイメントが可能になります。カスタム証明書を必要とするアプリケーションでは(RSA暗号化が使用されていない場合など)、アプリケーションをデプロイする前にプライベート証明書を追加する必要があります。

始める前に:

cacertsファイルおよびkeytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

プライベート証明書を追加するには:

1. プライベート証明書を作成します。たとえば、new_certという証明書ファイルを作成します。

2. 次のようにして、プライベート証明書をアプリケーションに追加します。

1. シードされたcacertsファイル(cp cacerts cacerts.org)のコピーを作成します。

2. Java SE keytoolユーティリティを使用して、cacertsファイルに証明書を追加します。次の例は、new_certというcacertsファイルへの証明書の追加を示しています。

keytool -importcert
-keystore cacerts
-file new_cert
-storepass changeit
-noprompt

この例は、単一の証明書の追加方法を示しています。各証明書に対して同じ手順を繰り返します。表29-4は、keytoolのオプションを示しています。

表29-4 証明書の追加に関するオプション

オプション

説明

-importcert

証明書をインポートします。

-keystore cacerts file

インポートされた証明書のファイルの場所を特定します。

-file certificate file

新しい証明書を含むファイルを特定します。

-storepass changeit

cacertsファイルのパスワードを提供します。デフォルトでは、パスワードはchangeitです。

-noprompt

証明書を信頼するかどうかを(stdinを介して)ユーザーに確認しないように、keytoolに指示します。

3. 新しいcacertsファイルの内容を目で見て調べて、すべてのフィールドが正しいことを確認します。次のコマンドを使用します。

keytool -list -v -keystore cacerts | more

4. 証明書が指定のホスト名に対するものであることを確認します。

注意:
証明書の共通名(CN)は、ホスト名と正確に一致している必要があります。

5. JVM 1.4が読み取れるようにするために、カスタマイズされた証明書ファイルはSecurityディレクトリ(users\workspaces\assembly project\lib\Security)に確実に配置してください。

3. アプリケーションをデプロイします。

注意:
デプロイメント時、証明書ファイルがSecurityディレクトリに存在している場合、MAFは、それをAndroidまたはXcodeテンプレート・プロジェクトにコピーし、cacertsファイルのデフォルト・コピーを置き換えます。

4. 保護されているリソースにSSL経由でアクセスできることを確認します。

30 MAFアプリケーションのテストおよびデバッグ

この章では、iOSとAndroidの両方のプラットフォーム用に開発されたMAFアプリケーションのテストとデバッグを行う方法について説明します。

この章には次の項が含まれます:

- 第30.1項「MAFアプリケーションのテストおよびデバッグの概要」

- 第30.2項「MAFアプリケーションのテスト」

- 第30.3項「MAFアプリケーションのデバッグ」

- 第30.4項「ロギングの使用方法と構成」

30.1 MAFアプリケーションのテストおよびデバッグの概要

MAFアプリケーションのテストとデバッグを開始する前に、そのアプリケーションを次のいずれかにデプロイする必要があります。

- iOSデバイス

- iOSデバイス・シミュレータ

- Androidデバイス

- Androidデバイス・エミュレータ

MAFアプリケーションは、デプロイしないと実行できません。詳細は、第27章「モバイル・アプリケーションのデプロイ」を参照してください。

MAFアプリケーションのテストとデバッグを行うには、通常、次の手順を実行します。

1. スプラッシュ画面、アプリケーション機能のナビゲーション、認証、プリファレンスなど、アプリケーションのインフラストラクチャをテストして、うたわれているすべてのアプリケーション機能が使用可能であることを確認します。

2. アプリケーションにMAF AMXコンテンツが含まれている場合は、このアプリケーション機能のロジック、ページ・フロー、データ・コントロールおよびUIコンポーネントをテストします。

3. 必要に応じてアプリケーションに変更を加えます。

4. モバイル・デバイスを再接続するか、シミュレータを再起動し、さらなるテストおよびデバッグのためにアプリケーションをデプロイして実行します。

詳細は、次を参照してください。

- 第30.3項「MAFアプリケーションのデバッグ」

- 第30.2項「MAFアプリケーションのテスト」

30.2 MAFアプリケーションのテスト

MAFアプリケーションをテストするには、次の2つの方法があります。

1. モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。

2. モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。

通常、両方の方法を組み合せて使用することで、最良の結果が得られます。

30.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

iOSデバイス用に開発されたMAFアプリケーションのアクセシビリティをテストするには、次の方法を組み合せて使用してください。

- iOSデバイス・シミュレータ上でアクセシビリティ・インスペクタを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Testing the Accessibility of Your iPhone Application」を参照してください。

- iOSデバイス上でVoiceOverを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Using VoiceOver to Test Your Application」を参照してください。

30.3 MAFアプリケーションのデバッグ

OEPEには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してアプリケーションの実行をモニターおよび制御することを可能にするデバッグ・メカニズムが備わっています。

一般にアプリケーションをデバッグするのに、Javaリモート・デバッグとJavaScriptリモート・デバッグという2つの異なる方法があります。Javaリモート・デバッグのみが完全にサポートされています。

MAFアプリケーションはOEPE内部で実行できないため、デバッグの方法が異なります。OEPEデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン(JVM) 1.4インスタンスに接続し、デプロイ済のMAFアプリケーションのJavaの部分を制御します。

MAFは、リモート・デバッグのプロジェクト・プロパティを自動的に構成します(第30.3.1項「デバッグ構成に関する必知事項」を参照)。次は、OEPEを使用してMAFアプリケーションのJavaコードをデバッグするために実行する必要のある手順です。

1. デバッグ構成で、「デバッグ」タブをクリックし、Javaコードのデバッグを選択します。これにより、次のデバッグ・パラメータがmaf.propertiesファイルに設定されます。

java.debug.enabled=true

詳細は、第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

2. アプリケーションをモバイル・デバイスまたはシミュレータに再デプロイします。

3. アプリケーション・アイコンをクリックして、モバイル・デバイスまたはシミュレータでアプリケーションを起動します。

4. リモートJavaアプリケーション構成を使用してリモートVMに接続します。

1. 新しいリモートJavaアプリケーション構成を作成します。「実行」→「デバッグ構成」をクリックします。構成ウィンドウで、リモートJavaアプリケーションをダブルクリックします。

2. 構成に名前を付け、デバッグしているアプリケーションのプロジェクトを参照します。

注意:
タイムアウトを回避するには、モバイル・デバイスまたはシミュレータでアプリケーションを起動したらすぐにデバッガを起動します。
デプロイメントが成功し、デバイス上のアプリケーションがデバッグ・モードで起動した場合、リモート・デバッグが接続されるまでブロックされます。タイムアウトは通常数分です。

デバッグにモバイル・デバイスを使用する場合、次のタスクを実行します。

Androidの場合

1. ポート転送が確立されていることを確認します。

iOSの場合

1. 開発コンピュータとモバイル・デバイスがTCPを介して相互に見えていることを確認します(互いにpingを実行できます)。

2. モバイル・デバイスのIPアドレスを持ったlocalhostを置き換えることで、リモートJavaアプリケーション構成の「ホスト」フィールドを変更します。

詳細は、次を参照してください:

- 第27.1.1.2項「JVM 1.4ライブラリのデプロイメント」

- 第30.3.1項「デバッグ構成に関する必知事項」

30.3.1 デバッグ構成に関する必知事項

アプリケーションを作成した後で、次のようにして、デプロイメント構成およびリモート・デバッグ構成を作成する必要があります。

1. OEPEのメイン・メニューで、「実行」→「デバッグ構成」をクリックして、起動構成ダイアログを開きます。

2. 構成タイプのリストで、MAFアプリケーション・ノードをダブルクリックします。

3. 新しいMAFデバッグ構成に名前を付け、「メイン」タブでアプリケーションのアセンブリ・プロジェクトを選択します。

4. 図30-1に示すように、「デバッグ」タブでJavaコードのデバッグを選択し、ポートを適切なポート番号に設定します。

図30-1 デバッグ構成の作成

5. 「適用」をクリックして構成の設定を保存します。

6. 構成タイプのリストで、リモートJavaアプリケーション・ノードをダブルクリックします。「接続」タブは、図30-2のようになります。

- デバッグするプロジェクトを参照します。

- 次のようにホストを設定します。

- シミュレータまたはエミュレータによるデバッグの場合、localhostに設定します。

- Androidでのリモート・デバッグの場合、Android Debug Bridge (adb)が動作しているコンピュータのホストIPに設定します(通常はlocalhost)。adbはポート転送が有効になっている必要があり、使用するリモート・デバッグ・ポートは転送先と同じポートです。コマンドadb forward --listを使用して転送先のすべてのポートを表示します。

- iOSでのリモート・デバッグの場合、開発コンピュータがネットワークを介してそのデバイスにアクセスできることを確認し(ネットワーク・アクセスをテストするには、pingコマンドを使用します)、デバイスのIPアドレスを入力します。

- 次のようにポートを設定します。

- シミュレータまたはエミュレータによるデバッグの場合、ポートはデバッグ構成時と同じポート番号に設定します。

- Androidでのリモート・デバッグの場合、adb (Android Debug Bridge)ではポート転送が有効になっている必要があります。ポートは転送先と同じポートに設定します。コマンドadb forward --listを使用して転送先のすべてのポートを表示します。

- iOSでのリモート・デバッグの場合、ポートはデバッグ構成時と同じポート番号に設定します。

図30-2 リモート・デバッグの構成

MAFでは、maf.propertiesファイルに次のデバッグ・パラメータを指定します。

java.debug.port=8000

このポート番号は、OEPEで設定したものと一致します。

30.3.2 iOSプラットフォームでのデバッグ方法

OEPEを使用してiOSプラットフォームでMAFアプリケーションをデバッグするには、第30.3項「MAFアプリケーションのデバッグ」で説明されている汎用的なデバッグ手順を実行します。

iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、次を参照してください。

- 第27.2.7.1項「iOSシミュレータへのiOSアプリケーションのデプロイ方法」

- 第27.2.7.2項「iOSデバイスへのアプリケーションのデプロイ方法」

- 第27.2.7.4.2項「テストおよびデバッグ用のAppleデバイスの登録」

30.3.3 Androidプラットフォームでのデバッグ方法

OEPEを使用してAndroidプラットフォームでMAFアプリケーションをデバッグするには、第30.3項「MAFアプリケーションのデバッグ」で説明されている汎用的なデバッグ手順を実行します。

Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、第27.2.5.1項「AndroidエミューレータへのAndroidアプリケーションのデプロイ方法」を参照してください。

Androidデバイスまたはそのエミュレータで動作しているMAFアプリケーションのデバッグを可能にするために、デバッグ時にネットワーキングおよびインターネット・アクセスは自動的に有効になります。ネットワーク情報プラグインは、MAFアプリケーション・エディタで有効化します(図30-3を参照)。

図30-3 Androidによるデバッグの有効化

Javaコードをデバッグすると、USBを介して接続されたAndroidデバイスまたはAndroidデバイス・エミュレータで、デプロイメントの最終手順は自動的にポート転送を実行します。これは、ターミナルで次のコマンドを実行した場合と同じです。

- デバイスでのデバッグの場合:
adb -d forward tcp:8000 tcp:8000

- エミュレータでのデバッグの場合:
adb -e forward tcp:8000 tcp:8000

ときにはadbプロセスはフリーズすることがあるため、プロセスを強制終了して再起動する必要があります。

プロセスを強制終了するには、次の手順を実行します。

- Windows: プロセス マネージャを使用します

- Macターミナル: kill -9 procIDコマンドを使用します。

ターミナルで次のコマンドを実行して、adbデーモンを再起動します。

adb devices

adbのフリーズの前に成功したデプロイメントは引き続きデプロイされます。アプリケーションをデバッグするには、アプリケーションを再デプロイします。

起動構成の「デバッグ」タブにあるJavaコードのデバッグは、maf.propertiesファイルのjava.debug.*プロパティを制御します。Javaコードのデバッグを選択すると、次のものが設定されます。

java.debug.enabled=true

デフォルトのポート番号を変更すると、次のものが設定されます。

java.debug.port=nnnn

詳細は、第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

注意:
接続がWi-Fiを介して行われる場合は、この接続が正しいことを確認してください。デバッガとターゲットの両方を、仮想プライベート・ネットワーク(VPN)を使用せずに、同じネットワーク上に配置することをお薦めします。

30.3.4 MAF AMXコンテンツのデバッグ方法

MAFアプリケーションにMAF AMXコンテンツが含まれている場合、デバイスまたはエミュレータを構成した後で、OEPEでその他のタイプのアプリケーションをデバッグするときに行うのと同様、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックの検査ができます。

注意:
デバッグできるのは、JavaコードおよびJavaScriptのみです(第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。

30.3.5 JavaコードおよびJavaScriptのデバッグを有効にする方法

maf.propertiesファイルでは、JVMの起動パラメータおよびMAFのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。maf.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置され(第30.4項「ロギングの使用方法と構成」を参照)、この場所は、アプリケーション・ファイル・システム内の<application_name>/META-INFの場所に対応しています。

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.5.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項「MAFアプリケーションのデバッグ」を参照してください。

30.3.5.1 iOS 6プラットフォーム上でのiOSデバイス・シミュレータを使用したJavaScriptのデバッグに関する必知事項

iOS 6プラットフォームで作業している場合、Safari 6ブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariの設定を開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします(図30-4を参照)。

図30-4 Safariブラウザ・オプションの有効化

「Develop」メニューが有効な場合、図30-5および図30-6に示すように、「iPhone Simulator」または「iPad Simulator」を選択し、デバッグするUIWebViewを選択します。「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。

図30-5 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ

図30-6 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ

30.3.6 デバッグ・モードの構成方法

アプリケーションのデプロイメント・プロファイルを使用して、MAFアプリケーションの実行モードをリリースまたはデバッグのいずれかに指定します。デバッグ・モードでのみ、JavaおよびJavaScriptコードを対話的にデバッグできます。デバッグ・モードでは、コンパイル時に特殊なデバッグ・ライブラリおよびシンボルを含めることが可能です。

図30-7は、AndroidまたはiOSのデバッグ・モード・オプションの設定方法を示しています。

図30-7 デバッグ・モードの設定

詳細は、次を参照してください。

- 第27.2.4項「Androidデプロイメント構成の作成方法」

- 第27.2.6.1項「iOSビルド・オプションの定義」

- 第27.2.7.4.1項「iOS開発用証明書の作成」

30.4 ロギングの使用方法と構成

MAFアプリケーションの場合、サポートされるすべてのプラットフォームでロギングを有効にするには、JavaScript (第30.4.2項「JavaScriptのロギングの使用方法」を参照)および埋込みコード(第30.4.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.4項「ロギングの使用方法および構成」を参照)。このファイルでは、すべてのロガーでcom.sun.util.logging.ConsoleHandlerおよびSimpleFormatterを使用することが定義され、ログ・レベルがSEVEREに設定されます。このファイルを編集して、別のロギング動作を指定できます(第30.4.1項「プロパティ・ファイルを使用したロギングの構成方法」を参照)。

注意:
MAFアプリケーションでは、java.util.loggingパッケージからのロガーを使用することはできません。

MAFのロガーは、次のとおりoracle.adfmf.util.Utilityクラスで宣言されます。

public static final String APP_LOGNAME = "oracle.adfmf.application";
public static final Logger ApplicationLogger = Logger.getLogger(APP_LOGNAME);

public static final String FRAMEWORK_LOGNAME = "oracle.adfmf.framework";
public static final Logger FrameworkLogger = Logger.getLogger(FRAMEWORK_LOGNAME);

MAFアプリケーションで使用するロガーは、ApplicationLoggerです。

oracle.adfmf.util.logging.Traceクラスのメソッドを使用することもできます。

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

30.4.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.4.1項「コンソールの選択」に示すように、ボタンの横の下向き矢印をクリックして、リストから選択します。

図30-8 コンソールの選択

logging.propertiesファイルで定義されているロガーは、oracle.adfmf.util.Utilityクラスから取得されるロガーと一致します(第30.4項「ロギングの使用方法と構成」を参照)。ロギング・レベルも一致します。INFOよりも詳細なロギング・レベルを使用する場合は、ConsoleHandlerのロギング・レベルを、次の例に示されているものと同じレベルに変更する必要があります。

oracle.adfmf.util.logging.ConsoleHandler.formatter=
oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.ConsoleHandler.level=FINEST
oracle.adfmf.util.logging.PatternFormatter.pattern=
[%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

30.4.2 JavaScriptのロギングの使用方法

JavaScriptは、console.log or.error/.warn/.infoに出力を書き込みます。この出力は、System.outユーティリティによってファイルにリダイレクトされます。

メッセージを指定することで、ログの出力をカスタマイズできます。次のJavaScriptコードでは、"Message from JavaScript"出力が生成されます。

<script type="text/javascript" charset="utf-8">
function test_function() { console.log("Message from JavaScript"); }
</script>

ロギング・ファイルに定義されているプロパティを利用するには、adf.mf.logパッケージ、およびそれによって提供されるApplicationロガーを使用する必要があります。

使用可能なロギング・レベルは、次のとおりです。

- adf.mf.log.level.SEVERE

- adf.mf.log.level.WARNING

- adf.mf.log.level.INFO

- adf.mf.log.level.CONFIG

- adf.mf.log.level.FINE

- adf.mf.log.level.FINER

- adf.mf.log.level.FINEST

ロギングをトリガーするには、adf.mf.log.Applicationロガーのlogpメソッドを使用し、そのメソッドのパラメータで次のものを指定します。

- ロギング・レベル

- 文字列としての現在のクラス名

- 文字列としての現在のメソッド

- 文字列としてのメッセージ文字列

次の例は、MAFアプリケーションでのlogpメソッドの使用方法を示しています。

adf.mf.log.Application.logp(adf.mf.log.level.WARNING,
"myClass",
"myMethod",
"My Message");

logpメソッドを実行すると、次の出力が生成されます。

[WARNING - oracle.adfmf.application - myClass - myMethod] My Message

30.4.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.4.4 iOSプラットフォームでのデバッグおよびロギングにXcodeを使用する方法

MAFプロジェクトの操作にXcodeを使用することは、OEPEを使用した次回のデプロイメント中に一部またはすべての変更を失う可能性があるため推奨されませんが、例外的な状況ではこれを使用できます。

始める前に:

アプリケーションをOEPEからiOSシミュレータにデプロイします。

生成されたプロジェクトを直接Xcodeで開く手順は次のとおりです。

1. workspace_directory\deploy\デプロイメント・プロファイル名\temporary_xcode_project\に移動します。

2. Oracle_ADFmc_Container_Template.xcodeprojというXcodeプロジェクトを開きます。

開発コンピュータでMac OS 10.8.nを実行し、Xcodeを使用してMAFアプリケーションをデバッグしている場合、IDE内(OEPEコンソールまたはXcodeコンソール上)にはJava出力を表示できません。この出力は、ファイルにリダイレクトされます(第30.4項「ロギングの使用方法と構成」を参照)。アプリケーションのスキーマに次の引数を追加すると、この動作を無効にし、iOSデバイスまたはそのシミュレータ上でデバッグを実行するときに、XcodeからJava、JavaScriptおよびObjective-Cのログ出力にリアルタイムでアクセスできるようになります。

-consoleRedirect=FALSE

30.4.5 アプリケーション・ログへのアクセス方法

次のAPIを使用すると、アプリケーション・ログ情報にアクセスできます。

- oracle.adfmf.framework.api.PerfMon

- oracle.adfmf.framework.api.LogEntry

- oracle.adfmf.util.HOTS

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

30.4.6 ロギングを無効にする方法

ロギング出力がアプリケーション・ログ・ファイルに転送されないように設定できます(この場合、ログ・ファイルは、空白のままになるか、まったく作成されません)。ロギングが無効になると、トレース文はアプリケーション・ログから失われ、stderrおよびstdoutに転送された出力は、すべてnullの場所またはエンド・ユーザーがアクセスできない別の場所にリダイレクトされます。

すべてのロギングを無効にするには、次のようにアプリケーションのadf-config.xmlファイルでdisableLoggingプロパティをtrueに設定します。

<adf-property name="disableLogging" value="true"/>

デフォルトでは、MAFアプリケーションのロギングは有効で、disableLoggingプロパティはfalseに設定されています。

adf-config.xmlファイルの詳細は、付録C「MAFアプリケーションとプロジェクト・ファイルの概要」を参照してください。

A トラブルシューティング

この付録では、モバイル・アプリケーションの様々な側面の問題、およびそれらの問題の診断方法と解決方法について説明します。

この付録の構成は、次のとおりです。

- 第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ページにナビゲーション機能を追加できます。第5.5項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」で説明したように、JavaScript <script>タグにメソッドを追加することで、コールバックを有効にしてApache Cordovaを活用できます。次の例は、このタグを使用したCordovaのコール方法を示しています。

...
<script type="text/javascript">if (!window.adf) window.adf = {};
adf.wwwPath = "/~maf.device~/www/js/base.js";</script>
<script type="text/javascript" src="/~maf.device~/www/js/base.js"></script>
...

base.jsのインクルード時に仮想パス/~maf.device~/を使用して、ブラウザがリクエストをリモート・サーバーではなくMAFリソースに対するものとして識別できるようにすることをお薦めします。このアプローチはリモートとローカルの両方のHTMLページで機能するので、(提供元にかかわらず) base.jsをHTML機能にインクルードする方法として最適です。詳細は、第20.1.2項「リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化」を参照してください。

注意:
MAFは、base.jsライブラリ・ファイルの前にJQueryのカスタム・バージョンをすでにロードしている場合、JQuery JavaScriptファイルをロードしません。

ヒント:
www/jsディレクトリにアクセス(およびその場所を確認)するには、まずMAFアプリケーションをデプロイした後、deployディレクトリに移動する必要があります。www/jsディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリはtemporary_xcode_projectディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(.apk)ファイルのassetsディレクトリ内にあります。第5.5項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」も参照してください。

注意:
設計時にはパスが存在しないので、JavaScriptインクルードは、OEPEによってソース・エディタ内ではエラーとして赤い波型の下線で強調表示されます。このパスは実行時に解決されます。

Cordova APIに対するMAF拡張機能では、モバイル・デバイスのAPIによってmaf-feature.xmlおよびmaf-application.xmlファイルの構成メタデータにアクセスできるようになります。これにより、モバイル・デバイスとMAFのインフラストラクチャ間の通信が確立します。これらの拡張機能は、アプリケーション機能の表示動作も指示します。

デフォルトのMAF Springboardページ、springboard.amx、およびカスタマイズされたSpringboardの構築に使用できるApplicationFeaturesデータ・コントロールの詳細は、第5.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: デフォルトのアプリケーション機能を表示します。

- getFeatures: アプリケーション機能を取得します。

- gotoFeature: 特定のアプリケーション機能を表示します。

- getFeatureByName: アプリケーション機能の名前を使用して、アプリケーション機能に関する情報を取得します。

- getFeatureById: IDを使用してアプリケーション機能を取得します。

- resetFeature: アプリケーション機能をロード時の状態にリセットします。

- gotoSpringboard: Springboardを表示します。

- hideNavigationBar: ナビゲーション・バーを非表示にします。

- showNavigationBar: ナビゲーション・バーを表示します。

- invokeMethod: Javaメソッドを起動します。

- invokeContainerJavaScriptFunction: JavaScriptメソッドを起動します。

コンテナ・ユーティリティAPIには、アプリケーションにバッジおよびバッジ番号を設定するためのメソッドが含まれています。詳細は、第B.2.15項「アプリケーション・アイコンへのバッジ設定」を参照してください。

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 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.6 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.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 gotoSpringboard

このメソッドは、MAFがSpringboardをアクティブ化するようにリクエストします。

注意:
maf-application.xmlファイルで機能参照として指定されていない場合や、認証関連または許可関連の問題が発生している場合、このメソッドではSpringboardを表示できないことがあります。第5.1項「MAFアプリケーションの表示動作の概要」も参照してください。

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.11 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.12 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.13 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.14 invokeContainerJavaScriptFunction

invokeContainerJavaScriptFunctionは、JavaScriptメソッドを起動します。表B-2に、このメソッドによって渡されるパラメータを示します。

表B-2 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.15 アプリケーション・アイコンへのバッジ設定

AdfmfContainerUtilitiesクラスには、モバイル・アプリケーション・アイコンにバッジ番号を設定したり、その番号を取得するためのメソッドが含まれています。表B-3に、これらのメソッドを示します。

表B-3 アイコンへのバッジ設定メソッド

メソッド

説明

パラメータ

getApplicationIconBadgeNumber

モバイル・アプリケーションのアイコンに現在設定されているバッジの値を取得します。アプリケーション・アイコンにバッジが設定されていない場合は、ゼロ(0)を戻します。

なし

setApplicationIconBadgeNumber

モバイル・アプリケーションのアイコンにバッジ番号を設定します。

バッジの値(int badge)。

注意:
アプリケーション・アイコンへのバッジ設定は、Androidではサポートされていません。

B.3 getDirectoryPathRootメソッドを使用したファイル・アクセス

adfmfJavaUtilties APIには、getDirectoryPathRootメソッドが含まれています。このメソッドは、iOSシステムとAndroidシステムの両方で使用できます。Javaレイヤーからのみコールできるこのメソッドを使用すると、次の例に示すとおり、デバイス上の一時ファイル、アプリケーション・ファイル(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プラットフォームでは通常、アプリケーション・ディレクトリ内にファイルを格納します。このような違いにより、ApplicationDirectoryをgetDirectoryPathRootメソッドに渡すと、AndroidデバイスではなくiOSデバイス上で実行されているアプリケーションの添付ファイルを表示するために必要なファイルの場所を戻すことができます。アプリケーションを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.1 MAFアプリケーションとプロジェクト・ファイルの概要

デフォルトでは、次のようになります。OEPEによって、次の3つのプロジェクトを含むMAFアプリケーションが作成されます。

- アセンブリ・プロジェクト: MAFアプリケーションのセキュリティを構成する場合に、ログイン・ページなどのアプリケーション全体のリソースを格納します。

- アプリケーション・プロジェクト: データ・コントロール・マネージャを格納します。

- ビュー・プロジェクト: アプリケーション機能のコンテンツとしてレンダリングされるアプリケーション機能のリソース(HTML、AMX、タスク・フロー・ファイルなど)を格納します。

これらのプロジェクトの詳細は、第C.2項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」および第C.3項「ビュー・コントローラ・プロジェクトのリソースについて」を参照してください。

これらのプロジェクト内には、MAFアプリケーションとアプリケーション機能の構成用ファイル、またはMAFアプリケーションをターゲット・プラットフォームにデプロイする際にそのアプリケーションで必要になるファイルもOEPEによって生成されます。ほとんどの場合、生成されたファイルを直接操作することはありません。かわりに、MAFアプリケーション・エディタ、MAF機能エディタ、データ・コントロール・マネージャなどのエディタを使用します。

C.2 アセンブリ・レベルのリソースについて

Oracle Enterprise Pack for Eclipseは、アセンブリ・プロジェクトにMAFアプリケーション用のファイルを生成します。これらのファイルには、MAFプリケーションのメタデータを記述するための構成ファイルが含まれています。これらのファイルには、図C-1に示されるプロジェクト・エクスプローラのアセンブリ・プロジェクトの下のresノードからアクセスします。

図C-1 モバイル・アプリケーション・アーティファクト

(デフォルトの名前applicationで生成された)アセンブリ・プロジェクトには、アプリケーション全体のリソースが格納されており、MAFアプリケーションのプレゼンテーション・レイヤーが提供され、ここには、モバイル・デバイスでのアプリケーションの表示方法を構成するためのメタデータ・ファイルが含まれています。このプロジェクトはMAFアプリケーションのセキュリティを指定するもので、アプリケーションのログイン・ページ、およびアプリケーション全体のリソースを含めることができます。アプリケーション・コントローラ・プロジェクトは、本質的には、アプリケーション機能とそのコンテンツを定義するビュー・コントローラ・プロジェクトのコンシューマです。

ヒント:
アプリケーション・コントローラ・プロジェクト内には、アプリケーション・レベルのライフサイクル・リスナーなど、アプリケーション全体の機能をサポートするコードを配置してください。

表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-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.2.4.5項「Androidアプリケーションへのカスタム・イメージの追加方法」を参照してください。

cacerts

assembly project directory\lib\security

次に例を示します。

workspace\application name\security\cacerts

システム全体のキーストアであるcacerts証明書ファイル。JVM 1.4に対するCA証明書を識別します。このファイルは、Java keytoolユーティリティを使用して更新できます。第29.8項「SSLのサポート」で説明するように、keytoolを使用してカスタム証明書ファイルを作成できます。証明書ファイルはすべてSecurityディレクトリ内に配置する必要があります。

logging.properties

assembly project directory\META-INF

次に例を示します。

workspace\application name\META-INF\logging.properties

ロギング・レベルやロギング・コンソールなど、アプリケーション・エラーのロギングを設定できます。詳細は、第30.4項「ロギングの使用方法と構成」を参照してください。

maf.properties

assembly project directoryMETA-INF

次に例を示します。

workspace\application name\META-INF\maf.properties

Java仮想マシン、JVM 1.4の構成ファイル。このファイルを使用して、アプリケーションの起動やヒープ領域の割当て、JavaおよびJavaScriptのデバッグ・オプションを構成します。詳細は、第30.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

adf-config.xml

assembly project directory\adf\META-INF

次に例を示します。

workspace\application\adf\META-INF\adf-config.xml

構成サービス・パラメータなど、アプリケーション・レベルの設定の構成に使用します。第17章「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サービスから返されたデータのオフライン・キャッシュ用の構成ファイル。キャッシュはパフォーマンスを上げることでユーザーの操作性を向上させるだけでなく、ユーザーがオフライン・モードで作業しているときにデータの読取りや表示を行えるようにします。

アプリケーション・プロジェクト自体(デフォルト名applicationApplicationで生成)の中に、OEPEにより表C-2に示される次のアーティファクトが作成されます。

図C-2 アプリケーション・プロジェクト

表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

使用可能なスキンを定義するもので、新しいスキンを定義することもできます。

詳細は、第8章「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データ・コントロールの使用方法の詳細は、第14章「MAF AMXでのバインディングの使用とデータ・コントロールの作成」を参照してください。埋込みアプリケーション機能をコールするSpringboardページを作成できるようにするApplicationFeaturesデータ・コントロールの詳細は、第5.6項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

C.3 ビュー・プロジェクト・リソースについて

ビュー・プロジェクト(図C-3に示すとおり、デフォルト名applicationViewで生成)には、アプリケーション機能のリソースが格納されます。アプリケーション・プロジェクトとは異なり、ビュー・プロジェクトのメタデータ・ファイルでは、アプリケーション機能レベルのリソース、特に、実行時にモバイル・デバイスでMAFアプリケーション自体のSpringboard内またはそのナビゲーション・バーに表示できるように1つのMAFアプリケーションに集約可能な様々なアプリケーション機能が記述されます。さらに、アプリケーション機能のメタデータ・ファイルでは、アプリケーション機能をHTMLページかMAF AMXページのどちらで構成するのかが記述されます。また、ビュー・コントローラ・プロジェクトには、これらのアプリケーション・ページと、アプリケーション機能レベルのリソース(MAFアプリケーション用に定義された、Springboardおよびナビゲーション・バー上のアプリケーション機能を表すアイコン・イメージなど)を含めることができます。

ヒント:
ビュー・コントローラ・プロジェクト内には、アプリケーション機能に固有のコードを格納します。アプリケーション・コントローラ・プロジェクトは、(特に別々のビュー・コントローラ・プロジェクト内で定義されている)アプリケーション機能間で共有されるコードの場所として使用してください。

ビュー・コントローラ・プロジェクトはアプリケーション・コントローラ・プロジェクトと分離して、別のモバイル・アプリケーションで再使用できるように、アーカイブ・ファイルとしてデプロイできます(第9.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章「モバイル・アプリケーションのデプロイ」を参照してください。

アプリケーション固有のコンテンツ

view project directory\public_html

次に例を示します。

workspace\application View\public_html

maf-feature.xmlで定義されたアプリケーション機能は、public_htmlディレクトリに表示されます。モバイル・コンテンツには、MAF AMXページ、CSSファイルおよびタスク・フローを含めることができます。アプリケーション機能に追加するカスタム・イメージは、このディレクトリ内に配置する必要があります。詳細は、第6.3項「外部リソースの選択に関する必知事項」を参照してください。

D デプロイメントでのプリファレンスの変換

この付録では、デプロイメント時、MAFがどのようにユーザー・プリファレンスを変換するかについて説明します。

このドキュメントには次の項が含まれます。

- 第D.1項「プリファレンスのネーミング・パターン」

- 第D.2項「Android用のプリファレンスの変換」

- 第D.3項「iOS用のプリファレンスの変換」

D.1 プリファレンスのネーミング・パターン

デプロイメント・ターゲットが呼び出されると、モバイル・アプリケーション・プリファレンスの、モバイル・プラットフォーム表現への変換が行われます。変換後、表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 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.4項「モバイル・アプリケーションのIDおよび表示動作の設定方法」を参照してください。

デプロイメントでは、Androidデプロイメント・プロファイルのアプリケーション・バンドルID値が使用されます(存在する場合)。プロファイルにアプリケーション・バンドルID値が存在しない場合は、maf-application.xmlファイルに含まれているアプリケーションの表示名およびアプリケーションIDからこの値が取得されます。デプロイメントJavaコードは、この値をXSLドキュメントにパラメータとして渡します。

次の例は、サンプル・アプリケーションのPrefDemoでmaf-feature.xmlファイルに含まれるMAFプリファレンスを示しています(付録G「サンプルの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/adf/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設定アプリケーションで必要なプリファレンス・リスト(.plist)ファイル表現に変換します。

表D-5 MAFプリファレンスと、対応するiOS表現

MAFプリファレンス・コンポーネント

iOS表現

<adfmf:preferencePage>

PSChildPaneSpecifier

<adfmf:preferenceGroup>

PSGroupSpecifier

<adfmf:preferenceBoolean>

PSToggleSwitchSpecifier

<adfmf:preferenceList>

PSMultiValueSpecifier

<adfmf:preferenceText>

PSTextFieldSpecifier

<adfmf:preferenceNumber>

PSTextFieldSpecifier

プリファレンス・リスト(.plist)ファイルのiOS要件については、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)にある『Preferences and Settings Programming Guide』を参照してください。

次の例は、maf-application.xmlファイルに基づくXMLを示しています。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen"
label="Oracle Way Cool Mobile App">
<adfmf:preferenceGroup id="SubPage01"
label="Child Page">
</adfmf:preferenceGroup>
</adfmf:preferences>

E MAFアプリケーションの使用方法

この付録では、MAFのユーザーの操作性に関する概要について説明します。

この付録の構成は、次のとおりです。

- 第E.1項「MAFアプリケーションの使用方法の概要」

- 第E.2項「モバイル・デバイスへのMAFアプリケーションのインストール」

- 第E.3項「アプリケーション機能間の移動」

- 第E.4項「プリファレンスの設定」

- 第E.5項「ログ・ファイルの表示」

- 第E.6項「アプリケーションの使用方法の制限」

E.1 MAFアプリケーションの使用方法の概要

MAFアプリケーションをインストールしたら(第E.2項「モバイル・デバイスへのMAFアプリケーションのインストール」を参照)、エンド・ユーザーは、モバイル・デバイスのホーム画面でアプリケーション・アイコンを選択して(図E-1を参照)、MAFアプリケーションの使用を開始できます。アプリケーションの起動時、ホーム画面にはスプラッシュ画面が表示されます。起動が完了したら、エンド・ユーザーは、アプリケーション機能間を移動したり(第E.3項「アプリケーション機能間の移動」を参照)、プリファレンスを設定したり(第E.4項「プリファレンスの設定」を参照)、他のすべてのタスクを実行することが可能になります。

図E-1 iPhone上のアプリケーション・アイコン

E.2 モバイル・デバイスへのMAFアプリケーションのインストール

エンド・ユーザーは、通常のアプリケーション・プロビジョニング・メカニズムを通じてMAFアプリケーションをダウンロードおよびインストールできます。

インストール時、アプリケーションのプリファレンスにはデフォルト設定が移入されます。デフォルトの変更方法については、第E.4項「プリファレンスの設定」および第E.2.2項「AndroidデバイスへのMAFアプリケーションのインストール方法」を参照してください。

モバイル・デバイスからMAFアプリケーションを削除することは、他のアプリケーションのアンインストールと変わりません(第E.2.3項「MAFアプリケーションのアンインストール方法」を参照)。

E.2.1 iOSデバイスへのMAFアプリケーションのインストール方法

iOSデバイスのユーザーは、次のいずれかの方法でMAFアプリケーションをダウンロードおよびインストールします。

- エンタープライズ固有の配布メカニズムから

- iTunesを使用

- iPhone構成ユーティリティを通じてデプロイ

- Webサーバー上でワイヤレスにホスティング

- AppleのApp Storeから

E.2.2 AndroidデバイスへのMAFアプリケーションのインストール方法

アプリケーション・マーケットプレイスで利用可能なMAFアプリケーションをインストールすることに加えて、エンド・ユーザーは、アプリケーション・マーケットプレイスの外部で利用可能なアプリケーションをダウンロードできます。これを実行する方法については、Webで情報を検索することをお薦めします。

E.2.3 MAFアプリケーションのアンインストール方法

MAFアプリケーションは、他のアプリケーションと同様にモバイル・デバイスから削除されます。アンインストール・プロセスでは、アプリケーションとともにすべてのアプリケーション・データおよびすべての外部プリファレンスが削除されます。

E.3 アプリケーション機能間の移動

各アプリケーション機能へのアクセスを提供するために、MAFアプリケーションは、ナビゲーション・バーまたはSpringboardを使用して、有効なアプリケーション機能間のナビゲーションを可能にします。

アプリケーションの開発時にナビゲーションを構成する方法の詳細は、第5.1項「MAFアプリケーションの表示動作の概要」を参照してください。

E.3.1 iOSデバイスでのアプリケーション機能間の移動方法

図E-2は、iPhone上に表示されるMAFのUI要素を示しています。

図E-2 iPhone上のUI要素

UIは、ナビゲーション・アイテム(アイコン)が移入されたナビゲーション・バーで構成されています。最初のナビゲーション・アイテムは強調表示されており、これが選択されていることを示しています。

注意:
アプリケーションに対してSpringboardが定義されている場合は、オーバーレイ形式で「ホーム」ナビゲーション・ボタンがナビゲーション・バーの上に表示されますが、このボタンはその一部ではありません。このボタンにより、エンド・ユーザーは、アプリケーション・コンテンツからSpringboardに戻ることができます。
アプリケーションに対してSpringboardが指定されていない場合、「ホーム」アイコンは表示されません。

詳細は、第5.1項「MAFアプリケーションの表示動作の概要」を参照してください。

図E-2で示されている例のナビゲーション・バーには、6つのナビゲーション・アイテムが含まれていますが、iPhone上のスペースが限られているため、すべてのナビゲーション・アイテムを同時に表示することはできません。そのため、5つ目のアイコンは、「次へ」機能になっています。「次へ」機能がアクティブ化されると、ナビゲーション・バーが展開され、残りのナビゲーション・アイテムが表示されます。iPad上では、すべてのナビゲーション・アイテムが表示されます。ナビゲーション・バーの上のコンテンツ領域には、この特定のソリューションに固有のコンテンツが表示されます。前述の例では、アプリケーションにバンドルされている発注の承認ツールです。

注意:
ナビゲーション・バーに少なくとも1つのアプリケーション機能のアイコンが表示されている場合、エンド・ユーザーに対して、「非表示」ボタン(ナビゲーション・バーが表示されている場合にそれを非表示にするボタン)と「表示」ボタン(ナビゲーション・バーが非表示の場合にそれを表示するボタン)が表示されます。
アプリケーションXMLファイル(maf-application.xml)で1つのアプリケーション機能のみが定義されている場合、または制約(または条件)で1つのアプリケーション機能のみの表示が許可されている場合、ナビゲーション・バーは非表示になります。

maf-application.xmlファイルで、ナビゲーション・バーに表示されるアプリケーション機能が参照されていない場合、「非表示」と「表示」のボタンがエンド・ユーザーに表示されず、ナビゲーション・バーが最初は非表示になっている可能性があります。この場合、Springboardが定義されているときは、それがアプリケーションに対する唯一のナビゲーション・ツールになります。

詳細は、第E.3.1.2項「単一機能アプリケーションの使用」を参照してください。

図E-3は、「次へ」アイコンがアクティブ化され、残りのナビゲーション・アイテムがリストとして表示された後のiPhone画面を示しています。エンド・ユーザーは「次へ」リスト内でアイテムを再配置できます。

図E-3 iPhone上のすべてのナビゲーション・アイテムの表示

アプリケーションの起動時にナビゲーション・バーに表示されるナビゲーション・アイテムを変更するには、図E-4に示すとおり、「編集」を選択して「構成」モードにします。

図E-4 iPhone上の「構成」モード

「構成」モードでは、コンテンツ領域からアイコンをドラッグし、それをナビゲーション・バーにドロップできます。この例では、図E-5に示すとおり、ナビゲーション・バーで「送信」ナビゲーション・アイテムがGleナビゲーション・アイテムに置き換えられ、「送信」は「次へ」アイテムの下にリストされています。構成モードを終了するには、「終了」を選択して「次へ」画面に戻ります。

図E-5 iPhone上のナビゲーション・バー表示の変更

エンド・ユーザーがナビゲーション・バーで新たに再配置されたGleナビゲーション・アイテムを選択すると、図E-6に示すとおり、コンテンツ領域にGleページが表示されます。

図E-6 iPhone上の再配置されたナビゲーション・アイテムのアクティブ化

E.3.1.1 Springboardを使用した移動

MAFでは、デフォルトでSpringboardナビゲーションは無効になっています。これは、maf-application.xmlファイルを構成して開発時に有効にします(第5.1項「MAFアプリケーションの表示動作の概要」を参照)。

Springboardを使用したナビゲーションに対してMAFアプリケーションが有効である場合、アプリケーションの起動時、エンド・ユーザーに、図E-7に示すような画面が表示されます。

図E-7 Springboard画面

上の図では、MAFで提供されているデフォルトのSpringboardがデフォルトの縦レイアウトでiPhone上に表示されています(開発時にカスタムのSpringboardを作成する方法については、第5.1項「MAFアプリケーションの表示動作の概要」を参照してください)。エンド・ユーザーが利用可能なアプリケーション・コンテンツ機能が3ページあり、画面の下部に3つのドットで示されています。エンド・ユーザーは、3つのページの最初のページを表示しています。最初のドットが明るく示されており、ユーザーが最初のページを表示していることがわかります。

機能の2番目のページを開く(図E-8を参照)には、iPhoneの画面を右から左にスワイプします。すると、最初のページが左に移動し、右から2番目のページが現れます。最初のページが左に移動してフェードアウトし、2番目のページが現れてフェードインします。

図E-8 Springboard: 2番目のページ

上の図では、エンド・ユーザーは3つのページの2番目のページを表示しています。2番目のドットが明るく示されていることで、それがわかります。

エンド・ユーザーがモバイル・デバイスを横方向に回転すると、それに応じてSpringboardアイコンの位置が変わります(図E-9を参照)。

図E-9 横表示のSpringboard画面

表示の方向が変わってもページは変わらず、ページ2が表示されていることに注意してください。

横方向の表示になっている間に機能の最初のページに戻る(図E-10を参照)には、iPhoneの画面を左から右にスワイプします。すると、2番目のページが右に移動し、左から最初のページが現れます。

図E-10 横表示のSpringboard: 最初のページ

1ページ目にある特定の機能(「コンタクト先」など)を表示するには、「コンタクト先」アイコンまたは該当するテキストをタッチします。

iOSデバイスでは、エンド・ユーザーは、デバイス・シェイク・ジェスチャーによって、どのアプリケーション機能からもSpringboardに戻ることができます。

Androidデバイスでは、エンド・ユーザーは、メニュー項目を使用していつでもSpringboardに戻ることができます。

E.3.1.2 単一機能アプリケーションの使用

アプリケーションには、単一の機能しか持たないものもあります。その機能は、Springboardまたはナビゲーション・バーに表示されるようには構成されません。この場合、その単一の機能のみがエンド・ユーザーに表示され、ナビゲーション・バーの表示を制御したり、Springboardに戻ったりするための特殊なボタンは表示されません。

E.3.2 Androidデバイス上での移動方法

Androidデバイスでのアプリケーション機能のナビゲーションは、「次へ」機能を除いて、iOSデバイスでのナビゲーションとほぼ同じです(第E.3.1項「iOSデバイスでのアプリケーション機能間の移動方法」を参照)。Androidデバイスでは、「次へ」機能がアクティブ化されると、残りのナビゲーション・アイテムのリストが表示されます。ナビゲーション・バーの外観は変わりません。

E.4 プリファレンスの設定

エンド・ユーザーは、モバイル・プラットフォームによって規定されている方法でアプリケーションのプリファレンスを構成できます。

アプリケーション開発時のプリファレンスの構成については、第21章「ユーザー・プリファレンスの有効化」を参照してください。

E.4.1 iOSデバイスでのプリファレンスの設定方法

エンド・ユーザーは、iOSデバイスで「設定」アプリケーションを開き、MAFアプリケーションの「設定」アイコンを選択して、そのアプリケーションで使用可能なすべての設定にアクセスできます。変更された設定は、「設定」アプリケーションを終了すると有効になります。これは、iOSデバイス上のすべてのアプリケーションの通常の動作です。

起動時、プリファレンスにはデフォルト値が移入されています。それらの値は、maf-feature.xmlファイルで定義されています。プリファレンスの値を設定するための標準的な方法に加えて、次の方法で値を定義できます。

- 値のリストから選択する。

- 読取り不可の値として(パスワードなどを入力する場合)。

- バイナリ値として。

プリファレンスは、カスケード・ページに表示されます。変更可能なプリファレンスと変更できないプリファレンスは、容易に区別できます。

プリファレンスを使用して、ユーザーの資格証明をグローバルに設定できます(第29章「MAFアプリケーションの保護」を参照)。

E.4.2 Androidデバイスでのプリファレンスの設定方法

Androidデバイスでのプリファレンスの設定は、iOSデバイスでのプリファレンスの設定と同じです(第E.4.1項「iOSデバイスでのプリファレンスの設定方法」を参照)。プリファレンスには、「プリファレンス」メニュー項目からアクセスできます。

注意:
そのアプリケーションに対して定義されているプリファレンスが存在しない場合は、メニューに「プリファレンス」メニュー項目が表示されることはありません。

E.5 ログ・ファイルの表示

診断とサポートの目的で、有効化されたアプリケーション機能のアプリケーション・ログ・ファイルをデバイス上に表示できます。

iOSデバイスの場合、ログ・ファイルは~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>にあります。ログ・ファイルにアクセスする前に、デバイスを同期する必要があることに注意してください。

Androidデバイスにおけるログ出力の検索および表示の詳細は、http://developer.android.com/tools/help/logcat.htmlを参照してください。

ロギングの詳細は、第30.4項「ロギングの使用方法と構成」を参照してください。

E.6 アプリケーションの使用方法の制限

一般的なMAFアプリケーションの様々なモジュールの使用方法には、多くの制限があります。

E.6.1 リスト・ビュー・コンポーネントの制限

MAF AMXリスト・ビュー・コンポーネントを使用する際に(第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- リスト・ビュー・コンポーネントが編集モードの場合、エンド・ユーザーが実行可能なのは、(リスト・アイテム・コンポーネントによって表示されている)行の並替えのみであり、行を選択またはハイライトすることはできません。

E.6.2 データ視覚化コンポーネントの制限

MAF AMXデータ視覚化コンポーネントを使用する際に(第13.5項「データ視覚化の指定」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- 地理マップ(第13.5.18項「地理マップ・コンポーネントの使用方法」を参照)を除いて、MAF AMXデータ視覚化コンポーネントは、Android 2.nプラットフォームで相互作用をサポートしていません。

- Androidでは、WAI-ARIAアクセシビリティ機能はデータ視覚化コンポーネントに対してサポートされません。

E.6.3 Androidプラットフォームでのデバイスの「戻る」ボタンの制限

Android 4.nでは、デバイスの「戻る」ボタンを押すと、エンド・ユーザーが前に使用したアプリケーション機能に戻ります。エンド・ユーザーがアプリケーションの起動時に最初に使用したアプリケーション機能に到達するまでデバイスの「戻る」ボタンをアクティブにし続けると、アプリケーションは終了します。

ビュー間のナビゲーションの構成方法の詳細は、第13.3.5.7項「戻るボタンのナビゲーションの有効化」を参照してください。

E.6.4 アクセシビリティ・サポートの制限

アクセシビリティが必要な際に(第13.8項「MAFのアクセシビリティのサポートの理解」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- MAF AMX UIコンポーネントは、アプリケーションがAndroidスクリーン・リーダー・モードで実行された場合、正しく動作しない可能性があります。

- Androidでは、WAI-ARIAアクセシビリティ機能はDVTコンポーネントに対してサポートされません。

F XMLの解析

この付録では、XMLの解析で使用できるライブラリについて説明します。

この付録には次の項が含まれます:

- 第F.1項「kXMLライブラリを使用したXMLの解析」

F.1 kXMLライブラリを使用したXMLの解析

コアMAFライブラリの1つであるkXMLは、XMLの解析に使用できるAPIを提供します。このライブラリは、JDKプロファイラ・インタフェース(JVMPI)を通じてアプリケーションに公開されます。

詳細は、kXMLのドキュメントを参照してください。

- http://kxml.sourceforge.net/kxml2

- http://kxml.sourceforge.net/kxml2/javadoc

G サンプルのMAFアプリケーション

この付録では、サンプルのMAFアプリケーションについて説明します。

この付録には次の項が含まれます:

- 第G.1項「サンプルのMAFアプリケーションの概要」

G.1 サンプルのMAFアプリケーションの概要

モバイル・アプリケーション・フレームワークには、基本アーティファクトの作成、SMSおよび電子メールなどのデバイス・ネイティブな機能などへのアクセス、またはローカルのSQLiteデータベースでのCRUD(作成、読取り、更新および削除)操作の実行などの、様々な開発シナリオを提供するサンプル・アプリケーションのセットが付属されています。これらのサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

これらのアプリケーションについては、すべて表G-1で説明されています。別に記載されている場合を除き、これらのアプリケーションは、開発環境の構成後にシミュレータにデプロイできます(Oracle Enterprise Pack Oracle Enterprise Pack for Eclipseのインストールを参照)。

ヒント:
モバイル・アプリケーションの作成方法について理解するには、これらのアプリケーションを表G-1に記載されている順番で確認してください。

表G-1 サンプルのMAFアプリケーション

アプリケーション名

説明

サンプル・アプリケーションの実行に必要な追加のリソース

HelloWorld

フレームワークの基本的な構造を示す、MAFのhello worldアプリケーション。この基本アプリケーションには、ローカルのHTMLファイルによって実装される単一のアプリケーション機能があります。このアプリケーションを使用して、開発環境が、アプリケーションのコンパイルとデプロイのために正しく設定されていることを確認します。第2.2.2項「MAFアプリケーション作成時の処理」も参照してください。

APIDemo

このアプリケーションは、ユーザー・インタフェースをJavaBeansにバインドする方法を示します。また、指定されたユーティリティ・クラスを使用して、JavaレイヤーからELバインディングを起動する方法についても示します。詳細は、第B.2項「MAFコンテナ・ユーティリティAPI」を参照してください。

BarcodeDemo

このアプリケーションは、バッキングBeanから起動する埋込みJavaScriptからBarcodeScannerプラグインをコールすることで、Cordovaプラグインの活用方法を示しています。詳細は、第10章「MAFアプリケーションでのプラグインの使用方法」を参照してください。

このアプリケーションは、バッキングBeanから起動する埋込みJavaScriptからBarcodeScannerプラグインをコールすることで、Cordovaプラグインの活用方法を示しています。詳細情報

CompGallery

このアプリケーションは、これらのコンポーネントのすべてを示すことによって、MAF AMX UIコンポーネントを紹介する役割を果たします。このアプリケーションを使用して、これらのコンポーネントの属性を変更し、その変更の効果をリアルタイムで確認できます。変更を行うたびにアプリケーションを再コンパイルして再デプロイする必要はありません。一般的な情報については、第13章「MAF AMXユーザー・インタフェースの作成」を参照してください。

ConfigServiceDemo

このアプリケーションは、Configuration Serviceを使用して、MAFアプリケーションで使用されているエンド・ポイントを変更する方法を示しています。connections.xml内のエンド・ポイントの変更は、デバイス上のアプリケーションに伝播され、アプリケーションは再初期化されて新しいエンド・ポイントを消費します。

DeviceDemo

このアプリケーションは、DeviceFeaturesデータ・コントロールを使用して、地理的位置、電子メール、SMS、コンタクト先などのデバイス機能を公開する方法、およびデバイスにそのプロパティを問い合せる方法を示します。この機能は、DeviceFeaturesデータ・コントロールからdisplayFileメソッドを使用して、.doc、.ppt、.xlsおよび.pngなどの様々なタイプのファイルを表示する方法を示します。詳細は、第14.10項「DeviceFeaturesデータ・コントロールの使用方法」および第14.10.9項「ファイルの表示を有効にするためのdisplayFileメソッドの使用方法」を参照してください。

SMSおよび一部のデバイス・プロパティはiOSシミュレータまたはAndroidエミュレータ上で機能しないため、このアプリケーションを実際のデバイス上で実行することも必要です。

ExpandCollapseComponent

このアプリケーションは、任意のタイプのAMXコンポーネント用のコンテナとして機能でき、展開、縮小機能を提供するカスタムコンポーネントの作成方法を示します。

詳細は、「js」フォルダの下のcardview.jsファイルを確認してください。このJavaScriptファイルには、コンポーネントのUIをレンダリングするメソッド('expandcollapse.prototype.render')が含まれます。さらに、カスタム・コンポーネントの子コンポーネントをレンダリングする方法を示すメソッドも含まれます。

FragmentDemo

このアプリケーションは、フラグメントを使用してテンプレートとして使用できる再利用可能なアーティファクトを定義する方法を示します。これは、各機能(1つはタブレット用、1つは電話用)に対して複数のコンテンツ・タイプを所有し、毎回リストまたはフォームをコーディングしなくても済むようにフラグメントを使用する方法を示します。

GestureDemo

このアプリケーションは、MAFアプリケーションにおいてジェスチャーをどのように実装および使用できるかを示します。第13.4項「ジェスチャーの有効化」も参照してください。

Java8Example

このアプリケーションは、AMXアプリケーションでのJava 8言語機能の使用方法を示します。

LifecycleEvents

このアプリケーションは、アプリケーション自体およびその埋込みアプリケーション機能にライフサイクル・イベント・ハンドラを実装します。このアプリケーションは、アプリケーションがライフサイクルの特定の時点で自身のロジックを実行できるようにするためのコードを挿入する場所を示します。第11.1項「MAFアプリケーションでのライフサイクル・イベント・リスナーの使用について」も参照してください。

iOSの場合、LifecycleEventsサンプル・アプリケーションは、/Applications/Utilities/Console.appにあるコンソール・アプリケーションにデータを記録します。

LocalNotificationDemo

このアプリケーションは、MAFアプリケーション内でローカル通知のスケジュールおよび受信を行う方法を示します。第25章「通知の有効化と使用方法」も参照してください。

.

Navigation

このアプリケーションは、バインドされたタスク・フローやルーターを含む、MAFの様々なナビゲーション技術を示します。第29章「MAFアプリケーションの保護」でも様々なページ遷移を示しています。第12.2項「タスク・フローの作成」も参照してください。

.

PrefDemo

このアプリケーションは、アプリケーション全体のユーザー設定ページおよびアプリケーション機能固有のユーザー設定ページを示します。一般的な情報については、第21章「ユーザー・プリファレンスの有効化」を参照してください。

PushDemo

このアプリケーションは、Apple Push NotificationサーバーとGoogle Could Messagingサーバーを対象としたプッシュ通知の登録方法と受信方法を示します。詳細は、第25.2項「プッシュ通知の有効化」を参照してください。

RangeChangeDemo

このサンプルは、リスト・ビュー・コンポーネント内の「さらに行をロード」リンクがアクティブ化されるか、リスト・ビューが最後までスクロールされたときに、Javaハンドラ・メソッドを呼び出すことによってrangeChangeListenerを呼び出す方法を示します。また、リスト・ビューによって新しいデータが取得されるたびにrangeChangeListenerが呼び出されることを示します。これは、RangeChangeEventを使用してクライアントにさらにデータをダウンロードできるかどうかを定義する方法を示します。

RESTDemo

このアプリケーションは、RestServiceAdapterを使用してRESTサービスのJSON形式に接続する方法を示します。詳細は、第16章「RESTサービスの使用」を参照してください。

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コンポーネントのスタイルを制御する方法も示します。また、実行時にスキン・ファミリ(初期状態またはカスタム)を変更する機能も示します。第8章「MAFアプリケーションのスキニング」も参照してください。

SlidingWindowsDemo

このアプリケーションは、AdfmfSlidingWindowUtilities APIの使用方法を示しています。このAPIを使用すると、画面に複数の機能を同時に表示できます。この例は、AdfmfSlidingWindowUtilities APIを使用してカスタムSpringboardまたはグローバル・ナビゲーション・バーを作成する方法を示しています。

StockTracker

このサンプルは、SQLite DBおよびディーン・データ・コントロールを使用してCRUD操作を構築する方法の単純な例を示します。これはストックのリストを表示し、ストックを作成、更新、削除または並替えできるようにします。これは、ローカルのSQLiteデータベースを使用して、そのデータを格納します。StockTrackerアプリケーションはCRUD操作中にデータを維持します。このサンプルは、データ変更イベントがJavaを使用して、データ変更をユーザー・インタフェースに反映できるようにする方法も示します。また、様々なレイアウト・ユースケース、ジェスチャーおよび基本的なモバイル・アプリケーション・レイアウト・パターンもあります。またこのサンプルは、CREATEおよびDELETE操作を使用してコレクションに対するアイテムの追加または削除を行う方法も示します。詳細は、PortfolioパッケージにあるPortfolio.javaクラスのaddStockメソッドおよびdeleteStockメソッドを確認してください。第14.12項「データ変更イベントについて」も参照してください。

UIDemo

このアプリケーションは、ユーザー・インタフェース・レイアウトと、モバイル・アプリケーションで一般的に使用される様々なリストおよびボタン・スタイルの作成方法を示します。また、ポップアップ・コンポーネントのアクション・シート・スタイルの作成方法、および様々なチャートおよびゲージ・コンポーネントの使用方法も示します。第13.3項「UIコンポーネントの作成と使用方法」および第13.5項「データ視覚化の指定」を参照してください。

URLSchemeDemo

このアプリケーションは、ブラウザのURLリンクまたは電子メールからを起動できるように、アプリケーションのカスタムURLスキームを定義する方法を示します。第20.4項「カスタムURLスキームを使用したMAFアプリケーションの起動」も参照してください。

WorkBetter

この人事管理アプリケーションには、「人々」および「組織」の2つの機能が含まれます。「人々」: この機能には、人を検索できる検索コンポーネントが含まれます。これは、カスタム・コンポーネントを作成する機能、および再利用可能なレイアウトをフラグメントとして構築し、それらを異なる機能間で使用する方法も示します。これは、様々なDVT視覚化コンポーネントを使用してパフォーマンス、補償、時系列関連の情報を表示する方法を示します。「組織」: 「人々」の機能と同様に、この機能は再利用可能なレイアウトをフラグメントとして構築し、それらを異なる機能間で使用する方法を示します。また、異なるフォーム・ファクタのビューを作成し、それらを構成する方法も示します。

このアプリケーションは、様々なUI技術および使用可能なコンポーネントのエンドツーエンドのデモです。多様なレイアウト・パターンを表示し、共通およびより複雑なコンポーネントに対する様々な使用方法を示します。これは、競合アプリケーションを例示するのではなく、ユーザー・インタフェースに焦点を置いています。データモデルまたはWebサービスなどについては他のサンプルを参照してください。

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2015, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。