Oracle® Mobile Application Framework

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

2.4.1.0.0

E89897-01(原本部品番号:E86012-01)

2017年6月

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

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

E89897-01

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

原本著者: Walter Egan

原本協力者: Puneeta Bharani

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

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

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

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

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

目次

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

このガイドのMAFリリース2.4.1に関する新しい内容

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

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

1 Oracle Mobile Application Frameworkの概要

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 4.8 MAFアプリケーションのアプリケーション機能の再起動

- 4.8.1 アプリケーション機能の再起動方法

- 4.8.2 アプリケーション機能の再起動時の処理内容

- 4.9 Androidの戻るボタンを使用したMAFアプリケーションの移動

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

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

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

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

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

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

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

- 5.4 iOSでのAMXコンテンツを使用するアプリケーション機能のWebビューの構成

- 5.5 アプリケーション機能での使用のための外部リソースの選択

6 MAFアプリケーションでのクライアント・データ・モデルの作成

- 6.1 MAFアプリケーションのクライアント・データ・モデルの概要

- 6.2 MAFアプリケーションでのクライアント・データ・モデルの作成の概要

- 6.3 RESTサービスへの接続によるクライアント・データ・モデルの作成

- 6.3.1 RESTサービスに接続してデータ・オブジェクトを取得する方法

- 6.3.2 MCS無名アクセス・キーに関する必知事項

- 6.4 クライアント・データ・モデルの候補データ・オブジェクトの検出

- 6.4.1 RESTリソースURLを使用してデータ・オブジェクトを検出する方法

- 6.4.2 サンプルのペイロードを使用してデータ・オブジェクトを検出する方法

- 6.4.3 RAMLファイルを使用してデータ・オブジェクトを検出する方法

- 6.4.4 フラット化されたネスト・データ・オブジェクト・オプションに関する必知事項

- 6.4.5 ADF BC REST記述を使用してデータ・オブジェクトを検出する方法

- 6.5 クライアント・データ・モデルのデータ・オブジェクトの選択および永続化

- 6.5.1 データ・オブジェクトを選択および永続化する方法

- 6.5.2 新しいデータ・オブジェクトを作成する方法

- 6.5.3 データ・オブジェクト属性を変更する方法

- 6.6 データ・オブジェクトの親子関係の指定

- 6.6.1 データ・オブジェクトの親子関係を指定する方法

- 6.7 CRUD RESTリソースの定義

- 6.8 CRUD RESTリソース詳細の指定

- 6.8.1 GET (読取り)リソース詳細を指定する方法

- 6.8.2 GET以外(書込み)リソース詳細を指定する方法

- 6.8.3 カスタム・リソースを追加する方法

- 6.8.4 問合せパラメータおよびパス・パラメータを指定する方法

- 6.8.5 HTTPヘッダー・パラメータを追加する方法

- 6.9 クライアント・データ・モデルのランタイム・オプションの設定

- 6.10 クライアント・データ・モデルの生成

- 6.11 MAFアプリケーションでのクライアント・データ・モデルの編集

- 6.12 MAFクライアント・データ・モデルDBPersistenceManagerの使用によるSQLiteデータベースへのアクセス

- 6.13 カスタム・リソースの定義

- 6.14 CRUD RESTコール後のカスタム・ロジックの実行

- 6.15 サービス・オブジェクトへのプログラムによるアクセス

- 6.16 主キーの使用の理解

- 6.17 フィルタされたエンティティ・リストの使用

- 6.18 MAFクライアント・データ・モデルに基づくユーザー・インタフェースの作成

- 6.18.1 クライアント・データ・モデルからデータ・コントロールを作成する方法

- 6.18.2 クライアント・データ・モデルからデータ・コントロールを作成する場合の処理

- 6.18.3 MAFユーザー・インタフェース・ジェネレータを使用する方法

- 6.18.4 ユーザー・インタフェースを生成する場合の処理

- 6.19 MAFアプリケーションからのオフライン・トランザクションの同期

- 6.19.1 保留中の同期アクションを表示する方法

- 6.19.2 失敗した同期アクションを処理するためのカスタム・ロジックを追加する方法

- 6.19.3 自動同期の無効化に関する必知事項

- 6.20 クライアント・データ・モデルによるデータ変更イベントのサポートの理解

- 6.21 MAFアプリケーションでのオフライン・モードの強制

- 6.22 バックグラウンド・タスクの実行のためのビジュアル・インジケータの使用

7 MAFアプリケーションでのOracle Mobile Cloud ServiceプラットフォームAPIの使用

- 7.1 Oracle Mobile Cloud ServiceプラットフォームAPIの使用の概要

- 7.2 Oracle Mobile Cloud Serviceユーザー情報へのアクセス

- 7.3 Oracle Mobile Cloud Service記憶域コレクション内のファイルへのアクセス

- 7.3.1 StorageObjectService Beanデータ・コントロールの作成方法

- 7.3.2 StorageObject Beanデータ・コントロールの作成時の処理内容

- 7.3.3 Oracle Mobile Cloud Service記憶域コレクションからのすべてのファイルの取得方法

- 7.3.4 MCS記憶域コレクションからの記憶域オブジェクトのリストのフィルタ方法

- 7.3.5 Oracle Mobile Cloud Service記憶域コレクションからの単一ファイルの取得方法

- 7.3.6 MAFアプリケーション内のデータと記憶域オブジェクトを関連付ける方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 MAFアプリケーション組込みプラグインのデプロイ

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

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

- 10.7 iOSのデバイス機能にアクセスするプラグインの使用方法の説明の指定

- 10.8 CordovaプラグインにWindowsプラットフォーム上のネイティブUIでの実行を許可する

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

13 MAF AMXページの作成

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

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

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

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

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

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

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

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

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

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

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

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

- 13.2.5.4.1 タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール

- 13.2.5.4.2 タスク・フロー・コール・アクティビティでの入力パラメータの指定

- 13.2.5.4.3 データ・コントロール・コンテキストの指定

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

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

- 13.2.6 タスク・フローのデータ・コントロール・コンテキストの深さを定義する方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 13.2.13.3.1 バインド・タスク・フローへのパラメータ渡し

- 13.2.13.3.2 バインド・タスク・フローの戻り値の構成

- 13.3 ビューの作成

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

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

- 13.3.1.2 MAF AMXページの作成

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

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

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

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

- 13.3.1.6.1 フラグメント・コンテンツの構成

- 13.3.1.6.2 フラグメントへの属性リストおよびメタデータの受渡し

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

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

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

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

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

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

- 13.3.3.1.1 日付

- 13.3.3.1.2 単一選択

- 13.3.3.1.3 テキスト

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

- 13.3.3.2.1 操作

- 13.3.3.2.2 メソッド

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

- 13.3.3.3.1 複数選択

- 13.3.3.3.2 フォーム

- 13.3.3.3.3 イテレータ

- 13.3.3.3.4 リスト・ビュー

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 14.3.5 ボタンの使用方法

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

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

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

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

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

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

- 14.3.5.6.1 ナビゲーション・バー

- 14.3.5.6.2 コンテンツ領域

- 14.3.5.6.3 アクション・シート

- 14.3.5.6.4 アラート・メッセージ

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

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

- 14.3.6 リンクの使用方法

- 14.3.7 イメージの表示方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 14.3.15.1.1 リスト・ビューのスクロール方法

- 14.3.15.1.2 リスト・ビューの独自のスクロール

- 14.3.15.1.3 サーバー側ページング

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

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

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

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

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

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

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

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

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

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

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

- 14.3.20 反復の有効化方法

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

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

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

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

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

- 14.3.25 日時の変換方法

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

- 14.3.26 数値の変換方法

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

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

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

- 14.4 カスタムUIコンポーネントの作成

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

- 14.6 3D Touchに対応したiOSデバイスで使用するアプリケーションのショートカットの実装

- 14.7 データ視覚化の指定

- 14.7.1 面グラフの作成方法

- 14.7.2 棒グラフの作成方法

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

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

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

- 14.7.6 線グラフの作成方法

- 14.7.7 円グラフの作成方法

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

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

- 14.7.8 散布図の作成方法

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

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

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

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

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

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

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

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

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

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

- 14.7.19 LEDゲージの作成方法

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

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

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

- 14.7.22.1 shortDesc属性の上書き

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

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

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

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

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

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

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

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

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

- 14.7.23.8 しきい値の定義

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

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

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

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

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

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

- 14.7.25.3 分離領域の定義

- 14.7.25.4 初期ズームの有効化

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

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

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

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

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

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

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

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

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

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

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

- 14.7.31 統計図表の作成方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 14.10 入力の検証

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

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

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

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

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

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

- 15.3 EL式の作成

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

- 15.3.2 EL式の作成方法

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

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

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

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

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

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

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

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

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

- 15.3.7 ELイベントについて

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

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

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

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

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

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

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

- 15.5.2.1 DataControls.dcx概要エディタ

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

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

- 15.5.3.1 データ・コントロールのaddXXXおよびremoveXXXメソッド

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

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

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

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

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

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

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

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

- 15.9 属性の使用

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

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

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

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

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

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

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

- 15.11 アプリケーション機能間のデータ・コントロールのインスタンスの共有

- 15.11.1 アプリケーション機能間のデータ・コントロールのインスタンスの共有方法

- 15.11.2 アプリケーション機能間のデータ・コントロールのインスタンスの共有方法

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

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

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

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

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

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

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

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

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

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

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

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

- 15.13 属性の検証

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

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

- 15.14 バックグラウンド・スレッドの使用方法

- 15.15 データ変更イベントの使用

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

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

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

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

- 16.4 URLの構築について

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

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

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

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

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

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

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

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

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

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

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

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

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.7.1 独自のパスワードでのデータベースの暗号化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 21.3.1 preferenceScopeに関する必知事項

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

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

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

- 22.1 制約の概要

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

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

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

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

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

- 22.2.3 property属性について

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

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

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

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

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

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

- 23.1 通知の概要

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

- 23.2.1MCSからのプッシュ通知のためのデバイスの登録方法

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

- 23.3 ローカル通知の管理

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

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

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

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

- 23.4 MAFが通知イベントをトリガーしたときのアプリケーション状態の判断

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

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

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

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

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

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

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

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

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

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

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

- 25.3 AndroidプラットフォームへのMAFアプリケーションのデプロイ

- 25.3.1 Gradleプロキシ設定の構成方法

- 25.3.2 AndroidプラットフォームにデプロイするMAFアプリケーションの署名方法

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

- 25.3.4 AndroidプラットフォームへのMAFアプリケーションのデプロイ方法

- 25.3.5AndroidプラットフォームにMAFアプリケーションをデプロイする場合の処理

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

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

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

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

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

- 25.4.1.2 デバイス署名およびエクスポート・オプションの設定

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

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

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

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

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

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

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

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

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

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

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

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

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

- 25.5.2 ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ時に行われる処理

- 25.6 アプリケーションのMAFクイック・デプロイメントの概要

- 25.6.1 クイック・デプロイメントをサポートするアーティファクトについて

- 25.6.2 クイック・デプロイメントの要件について

- 25.6.3 クイック・デプロイメント・セッション中の処理

- 25.6.4 アプリケーションの完全なデプロイメントの開始方法

- 25.6.5 アプリケーションの完全なデプロイメントの強制方法

- 25.6.6 クイック・デプロイメントの制限に関する必知事項

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

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

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

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

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

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

- 25.9 アプリケーション・アーカイブからの新規アプリケーションの作成

- 25.9.1 アプリケーション・アーカイブから新規アプリケーションを作成する方法

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

- 25.10 OJDeployを使用したコマンド行からのMAFアプリケーションのデプロイ

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

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

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

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

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

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

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

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

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

- 26.6 不適切な暗号化

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

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

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

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

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

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

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

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

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

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

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

- 27.4 MAF接続の構成

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

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

- 27.4.3 Basic認証の構成方法

- 27.4.4 OAuth認証の構成方法

- 27.4.5 MAFアプリケーションでのシングル・サインオンの構成方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 27.8 MAF認証APIの使用方法

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

- 27.10 MAFアプリケーションでのSSL証明書のファイル拡張子の登録

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 28.6 ユニバーサルWindowsプラットフォームにデプロイされたMAFアプリケーションのデバッグ

- 28.6.1 ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法

- 28.6.1.1 ユニバーサルWindowsプラットフォームでMAFアプリケーションのリモート・デバッグを有効にする方法

- 28.6.2 ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法

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

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

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

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

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

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

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

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

- 28.9 MAFアプリケーションのパフォーマンス・データの表示

- 28.10 MAFアプリケーションでのWebサービス・コールの検査

29 機能アーカイブ・ファイルによるMAFアプリケーション・コンテンツの再使用

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

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

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

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

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

30 MAF共有ライブラリによるMAFアプリケーション・コンテンツの再使用

- 30.1 MAF共有ライブラリによるMAFアプリケーション・コンテンツの再使用の概要

- 30.2 共有ライブラリ用のMAFアプリケーションの作成

- 30.2.1 共有ライブラリ用のMAFアプリケーションの作成方法

- 30.2.2 共有ライブラリ用のMAFアプリケーションの作成時に行われる処理

- 30.2.3 共有ライブラリ・ルート・ディレクトリの設定方法

- 30.2.4 コンシューマへの共有ライブラリの内容の説明方法

- 30.3 共有ライブラリ用のMAFアプリケーションへのアーティファクトの追加

- 30.4 共有ライブラリ用のMAFアプリケーションのデプロイ

- 30.4.1 共有ライブラリ用のMAFアプリケーションのデプロイ方法

- 30.4.2 共有ライブラリ用のMAFアプリケーションのデプロイ時に行われる処理

- 30.5 MAFアプリケーションでの共有ライブラリの使用

- 30.5.1 MAFアプリケーションでの共有ライブラリの使用方法

- 30.5.2 共有ライブラリ用のMAFアプリケーションの使用時に行われる処理

- 30.6 共有ライブラリ・アーカイブのファイル名が重複したMAFアプリケーションのデプロイ

- 30.7 共有ライブラリでのCordovaプラグインの使用方法

31 EMMソリューションとのMAFアプリケーションの統合

- 31.1 AppConfig Communityの概要

- 31.2 エンタープライズ・モバイル・アプリケーションへのMAFアプローチについて

- 31.3 EMMソリューションによるMAFアプリケーションのアクセス制御

- 31.4 EMMソリューションを使用するMAFアプリケーション構成の管理方法

- 31.5 AirWatch EMMソリューションを使用するMAFアプリケーションの管理

- 31.6 MobileIron EMMソリューションを使用するMAFアプリケーションの管理

- 31.7 Blackberry EMMソリューションを使用するMAFアプリケーションの管理

- 31.8 EMMソリューションによる使用のためのMAFアプリケーションでのプロパティの構成

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

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

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

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

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

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

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

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

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

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

- B.2.3 getApplicationInformation

- B.2.4 gotoDefaultFeature

- B.2.5 gotoFeature

- B.2.6 getFeatures

- B.2.7 getFeatureByName

- B.2.8 getFeatureById

- B.2.9 resetFeature

- B.2.10 resetApplication

- B.2.11 gotoSpringboard

- B.2.12 showSpringboard

- B.2.13 hideSpringboard

- B.2.14 showNavigationBar

- B.2.15 hideNavigationBar

- B.2.16 showPreferences

- B.2.17 invokeMethod

- B.2.18 invokeContainerMethod

- B.2.19 invokeContainerJavaScriptFunction

- B.2.20 sendEmail

- B.2.21 sendSMS

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

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

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

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

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

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

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

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

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

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

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

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

- D.2.1 maf_preferences.xml

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

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

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

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

- D.2.2 maf_arrays.xml

- D.2.3 maf_strings.xml

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

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

はじめに

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

対象読者

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

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

Oracleのアクセシビリティへの取り組みについては、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)にアクセスしてください。

Oracle Supportへのアクセス

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

関連ドキュメント

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

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

- Oracle JDeveloperのインストール

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

- Oracle JDeveloperでの拡張機能の開発

- Oracle Web Services Managerの理解

- Webサービスの管理

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

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

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

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

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

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

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

表記規則

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

規則

意味

太字

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

イタリック体

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

固定幅フォント

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

このガイドのMAFリリース2.4.1に関する新しい内容

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

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

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

- 「CordovaプラグインにWindowsプラットフォーム上のネイティブUIでの実行を許可する」項が追加されました。MAFアプリケーションがWindowsプラットフォームで実行するときに、カメラなどのWindowsアプリケーションを使用できるように、maf-plugins.xmlファイルにプラグインのエントリを追加して、プラグインがWindowsのネイティブUIで実行できるようにする、windows-run-in-core-window="enabled"属性について説明しています。

- 「デバイスの署名およびエクスポート・オプションの設定」は、新しい「メソッド」ドロップダウン・リストについて説明するように変更されました。MAFアプリケーション用にアーカイブをエクスポートしてパッケージ化またはiOSデバイスにデプロイするときに、そこからXcodeが使用する配布方法(「非定型」、「アプリケーション・ストア」、「開発モード」または「エンタープライズ」)を選択する必要があります。この変更は、このリリースで、MAFアプリケーションを作成しデプロイするのにMAFが必要とする、より新しいバージョンのXcode(8.3.x)をサポートするために行われました。

- 「AndroidプラットフォームへのMAFアプリケーションのデプロイ」は、AndroidにデプロイするMAFアプリケーションのmultidexサポートを有効にする、Androidデプロイメント・プロファイル・オプションの変更について説明するように変更されました。デフォルトでは、Multidexサポートは無効になっています。

- 「MAFアプリケーションのパフォーマンス・データの表示」が追加され、MAFアプリケーションのパフォーマンスを測定するときに、収集するパフォーマンス・データをデフォルトのブラウザにグラフで表示する、新しいパフォーマンス・モニター・グラフ・ツールの使用方法について説明しています。

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

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

- 「MAFアプリケーションでのSSL証明書のファイル拡張子の登録」は、.DERなどのバイナリ形式のファイルの拡張子を使用して証明書を保存することをお薦めするように、変更されました。これはサポートしているプラットフォームのバージョンによっては、エンド・ユーザーに証明書のインストールを要求するのではなく、証明書をテキスト・ファイルで開いてしまう問題を回避するためです。

- 「MAFアプリケーションでのロギングの使用および構成」は、AndroidプラットフォームにデプロイするMAFアプリケーションの管理権限を要求するAPIの使用方法を示すコード例を示すように変更されました。たとえば、アプリケーションがログ出力を/sdcard/Android/data/<app.package>/files/<app.name>.txtに書き込めるように、Android 6.0+ デバイスのエンド・ユーザーに、ストレージ権限をアプリケーションに付与する要求をする場合に、これらのAPIを使用します。

1 Oracle Mobile Application Frameworkの概要

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

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

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

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

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

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

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

MAFは、ユーザー・インタフェースのレンダリングにHTML5とCSSを使用するハイブリッド・モバイル・アーキテクチャです。MAFは、アプリケーションのビジネス・ロジックにJavaを使用して、デバイスの機能(GPS、カメラ、メールなど)にアクセスするためにApache Cordovaを使用します。

MAFは、こうしたクロス・プラットフォーム・テクノロジを使用しているため、Android、iOSおよびUniversal Windows Platform (UWP)の各デバイスで動作するアプリケーションを開発できます。プラットフォーム固有のツールを使用する必要はありません。MAFアプリケーションをデバイスにデプロイすると、そのアプリケーションはAndroid SDKなどのプラットフォーム固有のツールを使用して作成されたアプリケーションと同じように動作します。さらに、MAFを使用すると、スマートフォンまたはタブレット用に同じアプリケーションを構築できるため、同じアプリケーションのビジネス・ロジックを再利用して、様々なタイプのデバイス、画面サイズおよび機能をターゲットにできます。

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

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

MAFアプリケーションは、1つまたは複数のアプリケーション機能で構成されます。アプリケーション機能は再利用可能な、アプリケーションの機能性を持つ自己完結型モジュールです。各アプリケーション機能によって一連の特定のタスクが実行され、これらの機能をグループ化して、相互の機能が補完されるようにできます。たとえば、顧客のコンタクト先を提供するアプリケーション機能を製品在庫のアプリケーション機能とペアにすることができます。各アプリケーション機能に専用のクラス・ローダーとWebビュー(本質的にはブラウザとして動作するネイティブUIコンポーネント)があるため、それぞれのアプリケーション機能は相互に独立しています。それらは、アプリケーションのUIを分離する手段を提供して、MAFアプリケーションのエンド・ユーザーが同時に使用できるようにします。つまり、顧客連絡先のアプリケーション機能と製品インベントリのアプリケーション機能の例で説明すると、エンド・ユーザーはMAFアプリケーションで顧客連絡先を編集して、インベントリ内の製品の確認に移動して、インベントリを確認する場所にとどまりながら顧客連絡先の編集に戻ることができるということです。

アプリケーション機能は、Webブラウザのタブとして考えることもできます。複数のWebページの表示に複数の同時UIが必要なときには、Webブラウザで複数のタブを開きます。複数の同時UIが不要のときには、Webページ間の移動に1つのタブを使用します。MAF UIフレームワークのローディングとMAFアプリケーションに関連付けられたすべてのCordovaプラグインのローディングにかかる負荷をアプリケーション機能ごとに負担するならば、MAFアプリケーションでのアプリケーション機能の使用を控える必要があります。1つ以上の同時UIの要件がない場合は、MAFアプリケーションで実現するタスクを実行するためにタスク・フローを呼び出す単一のアプリケーション機能を使用します。

それぞれのアプリケーション機能は相互に独立しているため、複数の異なる開発チームが作成したアプリケーション機能から、単一のMAFアプリケーションをアセンブルできます。アプリケーション機能を他のMAFアプリケーション機能で再利用することもできます。MAFアプリケーション自体を別のアプリケーションのベースとして再利用できるため、独立系ソフトウェア・ベンダーは、特定の顧客が構成できるアプリケーションを作成できます。

レンダリングするアプリケーション機能を構成するコンテンツの種類に基づいて、様々な種類のアプリケーション機能を作成できます。選択可能なオプションは、AMXページ、ローカルHTMLページまたはWebアプリケーションからのコンテンツ(リモートURLオプション)です。デフォルトのコンテンツ・タイプはAMXページです。このコンテンツ・タイプでは、モバイル・アプリケーションの開発を容易にするためにMAFが提供する、その他の多数の機能(広範なUIおよび視覚化コンポーネントのスイート、タスク・フロー、デバイス機能にアクセスするデータ・コントロールなど)を利用できるようになります。これらのコンテンツ・タイプの詳細とモバイル・アプリケーションでコンテンツ・タイプを構成する方法は、「MAFアプリケーション機能のコンテンツ・タイプの定義」を参照してください。

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

MAFは、デバイスにデプロイされる、モデル・レイヤーとコントローラ・ロジックからプレゼンテーションを区別するmodel-view-controller (MVC)開発アプローチに従うシン・ネイティブ・コンテナです。

ネイティブ・コンテナによって、MAFアプリケーションが、MAFアプリケーションのデプロイ先であるプラットフォーム(iOS、AndroidまたはUWP)でネイティブ・アプリケーションとして機能できます。図1-2に、MAFランタイム・アーキテクチャを示します。

図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にレンダリングします。詳細は、次の項を参照してください。

- MAF AMXページの作成

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

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

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

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

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

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

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

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

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

- モデル: ビジネス・ロジック・コンポーネントをユーザー・インタフェースに接続するバインディング・レイヤーが含まれます。また、このバインディング・レイヤーでは、RESTベースのWebサービスを起動するための実行ロジックが提供されます。

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

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

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

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

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

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

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

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

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

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

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

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

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

MAFアプリケーションの開発には、要件の収集、設計、開発およびテストなどの活動が含まれます。

これらの活動は、次の作業に分類できます。

- ユーザー・インタフェースのモックアップの作成
どのページでどのデータを使用し、どのデータを変更する必要があるかがわかるよう、MAFアプリケーションのビジュアル・デザインから開始します。この作業が完了すると、データを配信するRESTサービスの設計を最適化できるようになります。

- MAFアプリケーションで使用されるRESTサービスを最適化する、モバイル・バックエンド層の作成
MAFでは、JSONをペイロード形式として使用するRESTサービスが推奨されています。このタイプのサービスは、MAFアプリケーションとモバイル・バックエンド層との間の統合では最善のアーキテクチャ選択であると考えられています。Oracle Mobile Cloud Service (MCS)は、分析、プッシュ通知、ファイル記憶域およびセキュリティのサービスを含め、モバイル・バックエンドの作成のための包括的なソリューションを提供します。

- モデルおよび永続性レイヤーの作成。このレイヤーには次のものが含まれます。

- アプリケーションのデータ・モデルを表す、Javaクラスおよび関連するファイル

- オフラインでの使用のためにデータを格納する、SQLiteデータベース

- SQLiteデータベースおよび/またはRESTサービスからのデータを保持する、データ・オブジェクト(エンティティとも呼ばれる)

- データ・オブジェクトに対してCRUDアクションおよびその他のカスタム・アクションを実行する、サービス・オブジェクト

- データベース表およびそれらの列がエンティティ・クラスおよびそれらの属性にマップされ、エンティティ・クラスおよび属性がRESTリソース・レスポンス・ペイロード内の属性にマップされる、オブジェクト関連情報マッピング

- ユーザー・インタフェース・レイヤーの作成
通常は、モデル・レイヤー内のサービス・クラスごとにBeanデータ・コントロールを作成します。これは、JDeveloperで「データ・コントロール」パネルからドラッグ・アンド・ドロップを使用してMAF AMXページを構築するのに役立ちます。モデル・レイヤーのテスト、および/またはユーザー・プロトタイピングの実行を迅速に行うには、MAFユーザー・インタフェース・ジェネレータを使用します。このウィザードでは、ユーザー・インタフェースおよび関連するタスク・フロー、AMXページおよびデータ・バインディングを作成します。

MAFでは、前述のタスクを簡易化するために「REST WebサービスからのMAFクライアント・データ・モデル」および「MAFユーザー・インタフェース・ジェネレータ」ウィザードが提供されています。MCSバックエンドからのRESTサービスの使用、モデルおよび永続化レイヤーの作成が可能であり、オフライン・トランザクション、およびアプリケーションがオンラインに戻ったときのデータ同期化のサポートを備えたプロトタイプ・ユーザー・インタフェースのあるMAFアプリケーションの生成が可能です。これらのウィザードの使用については、MAFアプリケーションでのクライアント・データ・モデルの作成で説明されています。

ヒント:
Oracle MAFおよびクライアント・データ・モデル(CDM)によるREST/JSONサービスの使用および永続化チュートリアルでは、前述のウィザードを使用した、RESTサービスを使用するMAFアプリケーションの作成を順を追って説明します。

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

注意:

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

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

- 要件の収集

- 設計

- 開発

- デプロイ

- テストおよびデバッグ

- 保護

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

- 再デプロイ

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

- 公開

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

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

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

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

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

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

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

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

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

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

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

7. サーバー側データへのアクセスの有効化: 基本レベルで想定どおりにアプリケーションが機能することを確認したら、サーバー側データにアクセスするためにJavaコードを実装したり、データ・コントロールを使用できます。

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

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

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

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

MAFでは、様々なユースケースを実装するサンプル・アプリケーションを幅広く提供しています。これらのサンプル・アプリケーションはJDeveloperで開いて、ソース・コードを詳しく調べたり、デバイスまたはエミュレータ/シミュレータにデプロイして実行時動作を確認できます。

デバイス・ネイティブ機能へのアクセス、ローカル・データベースでの操作の実行、ジェスチャーの実装といった様々なMAFアプリケーションの機能の実装方法を示すサンプル・アプリケーションが存在します。

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

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

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

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

MAF拡張機能をインストールしたら、jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルからサンプル・アプリケーションを抽出できます。ほとんどの場合、アプリケーションのディレクトリの名前がアプリケーションの目的をよく表しています。たとえば、SkinningDemoディレクトリにあるアプリケーションは、MAFアプリケーションのスキンを変更する方法を示します。各サンプル・アプリケーションの説明は、抽出されたディレクトリにあるReadMe.txtファイルを参照してください。次のOracle Technology NetworkページからアクセスできるOracle Mobile Application Frameworkのサンプル・ページでも、サンプル・アプリケーションに関する情報が提供されています。http://www.oracle.com/technetwork/developer-tools/maf/learnmore/mafsamples-2227357.htmlを参照してください。

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

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

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

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

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

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

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

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

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

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

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

MAFに用意されている概要エディタとウィザードを使用して、アプリケーションを開発し、そのアプリケーションの機能を定義し、機能にコンテンツを追加して、テスト環境またはデバイスにアプリケーションをデプロイします。

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

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

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

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

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

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

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

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

2. 「MAFアプリケーションのアプリケーション機能の定義」の説明に従って、MAFアプリケーションのアプリケーション機能を定義します。

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

図2-1 アプリケーション機能とアプリケーションの概要エディタ

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

MAFでアプリケーション開発を開始するには、「新規ギャラリ」の「アプリケーション」カテゴリにある「モバイル・アプリケーション・フレームワーク・アプリケーション」オプションから、モバイル・アプリケーション・フレームワーク・アプリケーションの作成ウィザードにアクセスして、このウィザードを使用します。

MAFアプリケーションを作成するには、事前にJDeveloperにMAF拡張機能をダウンロード、インストールおよび構成する必要があります。

『Oracle Mobile Application Frameworkのインストール』のJDeveloperとMAF拡張機能のインストールの概要に関する項を参照してください。このタスクを完了したら、JDeveloperの作成ウィザードを使用してMAFアプリケーションを作成します。

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

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

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

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

2. 「新規ギャラリ」の「アイテム」リストで、「モバイル・アプリケーション・フレームワーク・アプリケーション」をダブルクリックします。

3. 「モバイル・アプリケーション・フレームワーク・アプリケーションの作成」ウィザードで、名前、ディレクトリ、デフォルトのパッケージなど、アプリケーションとプロジェクトの詳細情報を入力します。ウィザードのヘルプを参照するには、[F1]を押すか「ヘルプ」をクリックします。

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

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

JDeveloperは、MAFアプリケーションを2つのプロジェクト(ApplicationControllerとViewController)および2つのデータ・コントロール(ApplicationFeaturesとDeviceFeatures)とともに作成します。また、MAFアプリケーションの構成用ファイルと、MAFアプリケーションをサポートされるプラットフォームにデプロイする際にそのアプリケーションで必要になるファイルも作成されます。

デフォルトで、新規作成したMAFアプリケーションのViewControllerプロジェクト内にあるmaf-features.xmlファイルの概要エディタが表示されます(図2-2を参照)。この概要エディタを使用して、1つ以上のアプリケーション機能をMAFアプリケーションに追加します。MAFアプリケーションには、少なくとも1つのアプリケーション機能が必要です。「MAFアプリケーションのアプリケーション機能の定義」を参照してください。

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

図2-2 新規作成したMAFアプリケーション内のアプリケーション機能の概要エディタ

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

MAFアプリケーションには、少なくとも1つのアプリケーション機能を定義する必要があります。

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

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

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

MAFアプリケーションのアプリケーション機能を定義する手順を使用してください。この手順では、maf-features.xmlファイルの概要エディタの「MAF機能の作成」ダイアログを使用します。

MAFアプリケーションのアプリケーション機能を定義するには、maf-features.xmlファイルの概要エディタを使用します。

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

1. 「アプリケーション」ウィンドウで、ViewControllerプロジェクトを展開し、「アプリケーション・ソース」および「META-INF」を展開します。

2. maf-feature.xmlファイルをダブルクリックします。

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

4. 次のようにして、「MAF機能の作成」ダイアログに必要な情報を入力します。

- 機能名: アプリケーション機能の表示名を入力します。

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

- ディレクトリ: アプリケーション機能のディレクトリを指定するか、JDeveloperによって生成される値をそのまま使用します。

- 「対応する機能参照をmaf-application.xmlに追加」チェック・ボックスを選択し、アプリケーション機能をMAFアプリケーションに追加します。このチェック・ボックスはデフォルトで選択されています。

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

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

アプリケーション機能を定義すると、その機能のコンテンツとしてMAF AMXページ、MAFタスク・フロー、ローカルHTML、またはリモートHTMLを追加できるようになります。

アプリケーション機能を定義した後で行うタスクの1つに、アプリケーション機能へのコンテンツの追加があります。アプリケーション機能のコンテンツのレンダリング・タイプを次の中から選択します。

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

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

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

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

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

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

作成またはインポートするMAFアプリケーションに機能を追加します。機能は、アプリケーションの作成時に追加することも、アプリケーションの作成後に追加することもできます。

定義時にアプリケーション機能がMAFアプリケーションへ自動的に追加されるようにするには、「アプリケーション機能の定義方法」の説明に従って、「MAF機能の作成」ダイアログで「対応する機能参照をmaf-application.xmlに追加」チェック・ボックスを選択します。

MAFアプリケーションの作成時に追加していなかったアプリケーション機能を追加する場合は、maf-application.xmlファイルの概要エディタの「機能参照」ページを使用します。

アプリケーション機能を機能アーカイブ(FAR)ファイルからインポートして、MAFアプリケーションに追加することもできます。MAFアプリケーションにアプリケーション機能を追加するには、事前にそのアプリケーション機能をMAFアプリケーションにインポートする必要があります。「MAFアプリケーション・コンテンツの再使用」を参照してください。

図2-4は、「機能参照」ページを示したもので、このページを使用してMAFアプリケーションにアプリケーション機能を追加します。

図2-4 「機能参照」ページを使用したアプリケーション機能の追加

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

MAFアプリケーションにアプリケーション機能を追加するには、maf-application.xmlファイルの概要エディタの「機能参照」ページにアクセスして使用する手順を使用してください。

MAFアプリケーションにアプリケーション機能を追加するには、maf-application.xmlファイルの概要エディタの「機能参照」ページを使用します。

MAFアプリケーションにアプリケーション機能を追加する手順:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを展開します。

2. 「アプリケーション・リソース」パネルで「ディスクリプタ」を展開し、「ADF META-INF」を展開します。

3. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「機能参照」ナビゲーション・タブをクリックします。

4. 「機能参照」ページで「追加」アイコンをクリックします。

5. 「機能参照の挿入」ダイアログで、ドロップダウン・リストからアプリケーション機能のIDを選択します。

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

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

アプリケーション機能IDは、一意であることが必要であり、機能参照IDと一致する必要があります。

MAFアプリケーションに追加するアプリケーション機能を参照するためのエントリが、JDeveloperによってmaf-application.xmlファイルに書き込まれます。

maf-application.xmlファイルの<adfmf:featureReference>要素のrefId属性は、maf-feature.xmlファイル内の対応するアプリケーション機能を特定します。このため、maf-application.xmlファイル内の<adfmf:featureReference>要素のrefId属性の値は、maf-feature.xmlファイル内の<adfmf:feature>要素に対して定義されたid属性の値と一致する必要があります。

一貫した命名規則を使用して、アプリケーション機能IDの一意性を確保します。アプリケーション機能IDはMAFアプリケーション全体を通して一意である必要があります。

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

例2-1 WorkBetterアプリケーションに含まれているアプリケーション機能の機能参照と機能ID

<!-- Feature Reference ID in maf-application.xml File -->
<adfmf:featureReference id="fr2" refId="People"/>
...
<!-- Feature ID in maf-feature.xml File -->
<adfmf:feature id="People" name="People" icon="images/people.png" image="images/people.png">
...

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

アプリケーションのユーザー・インタフェースは、1つの機能またはアプリケーション全体で使用できるMAF AMXページを使用して作成します。AMXページ間の移動には、MAF AMXビュー・ページとその他のアクティビティをシーケンスに編成するMAFタスク・フローを使用します。

「MAF AMXページの作成」で説明されているように、MAF AMXコンポーネントを使用すると、プラットフォーム固有の言語で作成されたページとまったく同じように実行されるページを構築できます。MAF AMXページでは、コンポーネントのリッチなセットを使用してユーザー・インタフェースを宣言的に作成できます。図2-5に、MAF AMXページの宣言的な開発を示します。

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

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

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

ヒント:

ページの保守を容易にするために、ページをページ・フラグメントと呼ばれる再利用可能なセグメントに分割できます。MAF AMXページは、1つ以上のページ・フラグメントで構成されます。

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

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

図2-7に、MAFタスク・フロー、AMXページ、MAFページ・フラグメントと呼ばれるMAF AMXページの再利用可能な部分、およびアプリケーション機能を追加するためにMAFに提供されているウィザードを示します。これらのウィザードにアクセスするには、「アプリケーション」ウィンドウでビュー・コントローラ・プロジェクトまたはアプリケーション・コントローラ・プロジェクトを選択して、「ファイル」→「新規」を選択します。「クライアント層」内の「モバイル・アプリケーション・フレームワーク」を選択した後、いずれかのウィザードを選択します。

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

2.6.1 MAF AMXページの作成方法

MAF AMXページ・ウィザードを使用して、アプリケーション機能のユーザー・インタフェースに使用されるAMXページや、MAFアプリケーションを構成するアプリケーション機能の間で共有可能なアプリケーション・レベルのリソース(ログイン・ページなど)として使用されるAMXページを作成できます。

アプリケーション機能コンテンツの詳細は、「MAFアプリケーション機能のコンテンツ・タイプの定義」を参照してください。

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

1. 「アプリケーション」ウィンドウで、ビュー・コントローラ・プロジェクトを右クリックします。

2. 「ファイル」→「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAF AMXページ」を選択して、「OK」をクリックします。

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

図2-8 「MAF AMXページの作成」ダイアログ

5. 「パネル・ページ」内で、ヘッダーおよびフッターの作成に使用する「ファセット」を選択(または選択解除)します。「OK」をクリックします。
「パネル・ページ・コンポーネントの使用方法」を参照してください。

6. ページ・レイアウトおよび関連するコンテンツ・レイアウト・オプションを有効にするには、「クイック・スタート・レイアウトの使用」チェック・ボックスを選択します。
「コンテンツ・レイアウト」リスト内のオプションは、選択した「ページ・レイアウト」オプションに応じて異なります。MAFは、選択したレイアウト・オプションを使用してAMXページを生成します。

7. 生成されるAMXページにサマリー・セクションを含めるには、固定サマリー・ビューの使用を選択チェック・ボックスを選択します。
このセクションをレンダリングする生成されたAMXページ内に、次のようなエントリが表示されます。

<amx:facet name="top">
<amx:panelGroupLayout styleClass="summary-section-style" layout="horizontal" halign="center" id="pgl1">
<amx:outputText value="Summary Section" id="ot11"/>
</amx:panelGroupLayout>
</amx:facet>

8. MAF AMXページを構築します。AMXコンポーネントの使用の詳細は、「MAF AMXページの作成」を参照してください。また、「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」も参照してください。

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

1. 「アプリケーション」ウィンドウで、アプリケーション・コントローラ・プロジェクトを選択します。

2. 「ファイル」→「新規」を選択します

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAF AMXページ」を選択して、「OK」をクリックします。

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

図2-9 「MAF AMXページの作成」ダイアログ

5. MAF AMXページを構築します。「MAF AMXページの作成」を参照してください。

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

アプリケーション機能のコンテンツは、MAFタスク・フローとして配信できます。アプリケーション機能のタスク・フローを定義する「MAFタスク・フローの作成」ウィンドウにアクセスして使用する手順を使用してください。

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

1. 「アプリケーション」ウィンドウで、ビュー・コントローラ・プロジェクトを選択します。

2. 「ファイル」→「新規」を選択します

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAFタスク・フロー」を選択して、「OK」をクリックします。

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

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

5. タスク・フローを構築します。「タスク・フローの作成」も参照してください。

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

MAF AMXページとタスク・フローを作成すると、それらは、アプリケーション・コントローラ・プロジェクトとビュー・コントローラ・プロジェクトのWebコンテンツにJDeveloperによって追加されます。JDeveloperは、タスク・フローの作成または更新に使用できるadfc-mobileconfig.xmlファイルを生成します。

JDeveloperは、MAF AMXページとタスク・フローを、ビュー・コントローラ・プロジェクトの「Webコンテンツ」ノードに配置します(図2-11のcustom_springboard.amxおよびViewController-task-flow.xmlを参照。これらは、このプロジェクト内で作成されるタスク・フローのデフォルト名です)。これらのアーティファクトはmaf-feature.xmlファイル内で参照されています。バインドなしタスク・フローを管理するために、JDeveloperではadfc-mobile-config.xmlファイルが生成されます。このファイルを使用して、ビュー(ユーザー・インタフェース・ページ)、様々なアクティビティ間の遷移を定義する制御ルール、およびタスク・フローのレンダリング・ロジックを管理するマネージドBeanなどの様々なタスク・フロー・コンポーネントを追加することで、タスク・フローを宣言的に作成または更新できます。

図2-11 アプリケーション・コントローラ・プロジェクトおよびビュー・コントローラ・プロジェクト内のMAF AMXページとタスク・フロー

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

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

この章では、maf-application.xmlファイルとmaf-features.xmlファイルを構成して、MAFアプリケーションのアプリケーション名やMAFアプリケーションに含めるアプリケーション機能などの情報を定義する方法について説明します。

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

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

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

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

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

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

MAFアプリケーションのエンド・ユーザーに表示される表示情報を構成するには、maf-application.xmlファイルの概要エディタで値を設定します。

アプリケーションに関して入力する情報の種類には、表示名、アプリケーションの説明、アプリケーションのバージョン番号などがあります。MAFアプリケーションに含めたり、他のMAFアプリケーションで使用するために配布したりする個々のアプリケーション機能には、同じような情報を入力できます。また、MAFアプリケーションのナビゲーション・バーやSpringboardへのレンダリング時にアプリケーション機能によって表示されるアイコンを指定することもできます。

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

「アプリケーション」ページを使用して、MAFアプリケーションの表示を設定できます。

図3-1は、maf-application.xmlファイルの概要エディタの「アプリケーション」ページを示したもので、このページではMAFアプリケーションの表示名やアプリケーションIDを設定します。

図3-1 MAFアプリケーションの基本情報の設定

MAFアプリケーションの基本情報を設定する手順:

1. 「アプリケーション」ページを選択します。

2. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを展開します。

3. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

4. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「アプリケーション」ナビゲーション・タブをクリックします。

5. 「名前」フィールドに、アプリケーションの表示名を入力します。

アプリケーションをローカライズする場合は、リソース・バンドルから値を選択できます。

注意:

MAFでは、このフィールドに入力した値をiOSアーカイブ(.ipaまたは.app)ファイルの名前として使用します。このファイルは、iOSデバイスまたはシミュレータにアプリケーションをデプロイすると作成されます。

6. 「ID」フィールドに、一意のIDを入力します。

名前の競合を避けるため、AndroidとiOSでは、リバース・パッケージ名が使用されます(例: com.company.application)。JDeveloperによって、アプリケーション名の前には、com.companyがリバースパッケージとして付加されますが、この値は別の値で上書きできます。ただし、上書きする値は一意で、iOSとAndroidの両方のデバイスのIDガイドラインを順守するものでなくてはなりません。iOSアプリケーションについては、『iOS Team Administration Guide』 (http://developer.apple.com/library/iosのiOS Developer Libraryで入手可能)の「Creating and Configuring App IDs」を参照してください。Androidについては、Android開発者のWebサイト(http://developer.android.com/guide/topics/manifest/manifest-intro.html)で入手可能な「The AndroidManifest.xml File」を参照してください。AndroidプラットフォームへのMAFアプリケーションのデプロイに関する項および「iOSデプロイメント・プロファイルの作成方法」で説明するように、このIDはデプロイメント・プロファイル内で上書きできます。

注意:

Androidデバイスまたはエミュレータにアプリケーションが正しくデプロイされるようにするには、IDの先頭を数字やピリオドではなく、文字にする必要があります。たとえば、IDが925090のように(com.company.925090)完全に数値で構成されている場合はデプロイに失敗します。hello925090 (com.company.hello925090)のように先頭が文字列のIDは正常にデプロイされます。

7. 「説明」フィールドで、アプリケーション関する説明を入力します。

8. 「バージョン」フィールドに、バージョンを入力します。

9. 「ベンダー」フィールドに、このアプリケーションを最初に作成したベンダーの名前を入力します。

10. 「ライフサイクル・イベント・リスナー」フィールドで、MAFアプリケーションのライフサイクル・イベントに応じて実行されるコードが記述されたクラスを入力します。新規作成したMAFアプリケーションには、デフォルトでapplication.LifeCycleListenerImplが指定されます。

ライフサイクル・リスナーの詳細は、「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

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

MAFでは、iOSデバイスでMAFアプリケーションを起動したときに、エンド・ユーザーに表示する起動画面を表示するためのHTMLページが用意されています。

このHTMLページは、MAFアプリケーションが実行するiOSデバイス上でレスポンシブにレンダリングされるように設計されています。つまり、このページは、用意されている画面を使用して、著作権情報やロゴをデバイスに適したサイズで表示します。

かわりの起動画面を定義する場合はカスタムHTMLページを作成できます。これは、maf-application.xmlファイルの概要エディタにおいて「アプリケーション」ページの「起動画面」セクションで行います。作成するHTMLページはMAFアプリケーションのApplicationController/public_htmlディレクトリに保存されます。起動画面として使用するHTMLページを作成した場合、次のXMLエントリがmaf-application.xmlファイルのソースに表示されます。

...
<adfmf:configuration>
<adfmf:launchScreen url="custom-launch-screen.html"/>
</adfmf:configuration>
...

URL属性はApplicationController/public_htmlディレクトリに対して相対的にパスを定義し、アプリケーションはこれを使用して、起動画面として作成されたHTMLページを探します。

iOSデバイス用のデフォルト起動画面としてMAFがレンダリングするHTMLページを確認して、起動画面としてレンダリングされるカスタムHTMLページを作成するヒントを得ることができます。デフォルト起動画面(maf-launch-screen.html)は、最初にMAFアプリケーションをデプロイするために使用するデプロイメント・プロファイルの次のサブディレクトリにあります。

.../FARs/OracleStandardADFmfUiComponents/public_html/

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

各MAFアプリケーションには、少なくとも1つのアプリケーション機能が必要です。アプリケーション機能はそれぞれ別個に(MAFアプリケーション自体からも独立して)開発できます。

maf-feature.xmlファイルの概要エディタでは、<adfmf:features>の子要素を定義して、アプリケーション機能ごとにそれぞれの名前とIDを割り当て、コンテンツの実装方法を設定することで、アプリケーション機能を区別できます。アプリケーション機能の概要エディタを使用すると、MAFアプリケーション内のアプリケーション機能のランタイム表示を制御したり、アプリケーション機能がユーザー認証を必要とするタイミングを指定することもできます。

図3-2に、WorkBetterサンプル・アプリケーションで使用される人々アプリケーション機能の概要エディタの「一般」タブを示します。このタブを使用して、アプリケーション機能の名前や、Springboardとナビゲーション・バーに表示されるアイコンなどの情報を指定します。

図3-2 maf-feature.xmlファイル内のアプリケーション機能の「一般」タブ

始める前に:

アプリケーション機能で、MAFによって提供されるデフォルト・イメージではなく、ナビゲーション・バーやSpringboardのカスタム・イメージを使用する場合、これらのイメージは、Android開発者のWebサイト(http://developer.android.com/design/style/iconography.html)および、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手できる『iOS Human Interface Guidelines』の「Custom Icon and Image Creation Guidelines」の章に示されている仕様に従って作成する必要があります。

これらのイメージは、ビュー・コントローラ・プロジェクトのpublic_htmlディレクトリに配置します。「外部リソースの選択に関する必知事項」も参照してください。

さらに、maf-feature.xmlファイルを開いて、「一般」タブを選択する必要があります。

アプリケーション機能の基本情報を設定するには:

1. 「一般」タブを選択します。

2. 「機能」セクションで「追加」アイコンをクリックします。

3. 「MAF機能の作成」ダイアログに必要な情報を入力し、「OK」をクリックします。

「MAF機能の作成」ダイアログに必要な情報を入力する手順:

- 「機能名」フィールドに、アプリケーション機能の表示名を入力します。

- 「機能ID」フィールドに、アプリケーション機能の一意の識別子を入力します。

- 必要に応じて、アプリケーション機能の場所を、public_htmlディレクトリ(デフォルトの親ディレクトリ)内の任意のディレクトリに変更します。この場所を「ディレクトリ」フィールドに入力します。

- 「対応する機能参照をmaf-application.xmlに追加」チェック・ボックスを選択し、新しく定義したアプリケーション機能をMAFアプリケーションに追加します。

4. (オプション)概要エディタの「一般」タブで、「ベンダー」フィールドに、アプリケーション機能を最初に作成したベンダーの名前を入力します。

5. (オプション)「バージョン」フィールドに、アプリケーション機能のバージョン番号を入力します。

6. (オプション)「説明」フィールドに、アプリケーションの目的の簡単な説明を入力します。

7. (オプション)「ライフサイクル・イベント・リスナー」の「クラスおよびパッケージ・ブラウザ」を使用して、完全修飾クラス名(oracle.adfmf.featureのようにパッケージを含む)を入力して、イベントを起動、停止、休止および休止から戻すためのランタイム・コールを有効にします。

8. (オプション)「ナビゲーション・バー・アイコン」および「スプリングボード・イメージ」フィールドで、ナビゲーション・バーのアイコンとして使用するイメージと、スプリングボードの表示アイコンとして使用するイメージを、プロジェクトから参照して選択します。「アプリケーション」ウィンドウから「ファイルの場所」フィールドにイメージ・ファイルをドラッグ・アンド・ドロップすることもできます。

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

この章では、MAFアプリケーションでアプリケーション・ナビゲーションを構成する方法を説明します。

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

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

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

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

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

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

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

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

- MAFアプリケーションのアプリケーション機能の再起動

- Androidの戻るボタンを使用したMAFアプリケーションの移動

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

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

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

スプリングボードとナビゲーション・バーの表示動作を制御するよう、MAFアプリケーションを構成できます。

構成は次の方法で行えます。

- Springboardとナビゲーション・バーを表示または非表示にすることで、モバイル・デバイスのインタフェースを最適に使用できるようになります。これらのオプションは、ナビゲーション・バーのデフォルトの表示動作をオーバーライドします。ナビゲーション・バーは、アプリケーション機能によって別の状態に指定されていないかぎり、デフォルトで表示されます。

- Springboardを右からスライドできるようにします。デフォルトでは、Springboardは表示全体を占有せず、そのかわりに左からスライドして、アクティブ・コンテンツ(ナビゲーション・バーの「ホーム」ボタンとアプリケーション機能を含む)を右へプッシュします。

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

maf-application.xmlファイルの概要エディタの「アプリケーション」ページに表示されるナビゲーション・オプションを使用して、アプリケーションのナビゲーション・バーを構成できます。

「アプリケーション」ページの「ナビゲーション」のオプション(図4-1を参照)を使用して、ナビゲーション・バーを表示または非表示にしたり、アプリケーションによって使用されるスプリングボードのタイプを選択したり、ユーザーがアプリケーションをめくるように見ていくときのスプリングボードの反応方法を定義できます。

図4-1 「アプリケーション」ページの「ナビゲーション」のオプション

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

MAFアプリケーションのデフォルトの動作では、アプリケーション起動時にナビゲーション・バーが表示されます。

このデフォルトの動作は、maf-application.xmlファイルの概要エディタの「アプリケーション」ページで変更できます。

ナビゲーション・バーの表示動作を設定するには:

1. 「アプリケーションの起動時にナビゲーション・バーを表示」を選択して、MAFアプリケーションで、デフォルトで、スプリングボードではなくナビゲーション・バーが表示されるようにします(図4-2を参照)。

図4-2 デフォルトでナビゲーション・バーを表示

このオプションをオフにすると、アプリケーションの起動時にナビゲーション・バーが表示されなくなり、ユーザーにはSpringboardがナビゲーションの唯一の方法として提示されます。ナビゲーション・バーはSpringboardと同じ目的を果たすものなので、これを非表示にすることで冗長な機能を削除できる場合もあります。

2. 「ナビゲーション・バー・トグル・ボタンの表示」を選択して、選択したアプリケーション機能のコンテンツが表示されているときにはナビゲーション・バーを非表示にします。図4-3はこのオプションを示したもので、図4-2に示されているナビゲーション・バーを、アプリケーション機能のコンテンツによって非表示にする方法が示されています。

図4-3 ナビゲーション・バーを非表示

このオプションはデフォルトで選択されており、アプリケーション機能によって表示/非表示状態が指定されていなければ、ナビゲーション・バーはデフォルトで表示されます。

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

デフォルトでは、MAFアプリケーションはアプリケーション起動時にSpringboardを表示しません。このデフォルトの動作は、maf-application.xmlファイルの概要エディタの「アプリケーション」ページで変更できます。

Springboardの表示動作を設定するには:

1. Springboardのタイプを選択します(存在する場合)。

- なし: アプリケーションにSpringboardを表示しない場合は、このオプションを選択します。

- デフォルト: MAFによって提供されるデフォルトのSpringboardを表示する場合に選択します。デフォルトのスプリングボードは、MAF AMXページとして実装されます。「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

- カスタム: カスタマイズされたSpringboardを使用する場合に選択します。たとえば、埋込みアプリケーション機能をグリッド・レイアウト・パターンに配置するカスタムSpringboardを作成したり、検索機能や共通タスク(「マイ・レポート」、マイ・リードなど)のリストなどのデータを含めることができます。HTMLページまたはMAF AMXページとして実装できるこのアプリケーションは、maf-feature.xmlファイル(ビュー・コントローラ・プロジェクト内にあります)内でアプリケーション機能として宣言されます。「アプリケーション機能の表示プロパティの設定」を参照してください。HTMLで記述されたカスタマイズされたSpringboardでのナビゲーションの有効化については、「ローカルHTMLおよびアプリケーション・コンテナAPI」を参照してください。

- 機能: スプリングボードとして使用するアプリケーション機能を選択します(図4-4を参照)。

注意:

アプリケーション機能をカスタム・スプリングボードとして指定する場合、MAFのデザインタイムによって、「ナビゲーション・バーに表示」および「スプリングボードに表示」オプションをfalseに設定することが求められます。これにより、ページがユーザーによってナビゲーション・バーまたはSpringboardから起動されるアプリケーション機能としてではなく、カスタムSpringboardとして動作します。

図4-4 カスタムSpringboardとしてのアプリケーション機能の選択

2. 「アプリケーションの起動時にSpringboardを表示」を選択して、MAFアプリケーションの起動後にエンド・ユーザーに対してSpringboardを表示できるようにします。(このオプションは、「デフォルト」または「カスタム」オプションでのみ使用できます。)

3. 「スプリングボード・トグル・ボタンの表示」を選択して、スプリングボードのボタンを表示できるようにします(図4-5を参照)。このボタンはアプリケーション機能内に表示されます。図4-2では、アプリケーション機能のコンテキスト内にこのボタンが表示されています。このオプションは、「デフォルト」または「カスタム」オプションでのみ使用できます。

図4-5 Springboardトグル・ボタン

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

スプリングボードを使用するようにMAFアプリケーションを構成する場合、maf-application.xmlファイルの概要エディタの「アプリケーション」ページでスプリングボードのスライドアウト動作を設定できます。

Springboardのスライドアウト動作を設定するには:

1. 「Springboardアニメーション」を選択して、「右にスライド」を選択します。Springboardは、「スライドアウト幅」オプションで入力したピクセル数値(またはパーセント)によって指定された領域を占有します。「なし」を選択した場合、Springboardは右からスライドできません(つまり、MAFではこのアクションを有効にするためのアニメーションが提供されません)。Springboardが表示領域全体を占有します。

注意:

スライドアウト・オプションは、Springboardの「カスタム」または「デフォルト」オプションを選択した場合のみ適用できます。

2. 幅を設定します(ピクセル単位)。iOSデバイスのSpringboardのデフォルト幅は320ピクセルです。Androidデバイスでは、デフォルトでSpringboardは画面全体を占有するので、使用可能な幅がすべて占有されます。

注意:

Springboardが表示領域全体を占有しない場合は、アクティブなアプリケーション機能が残りの表示領域を占有します。「Springboardにアニメーションを設定する場合の処理」を参照してください。

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

maf-application.xml概要エディタの「機能参照」ページのアプリケーション機能の表示順序を設定します。

アプリケーション機能の表示順序を設定するには:

1. maf-application.xmlの概要エディタの「機能参照」ページをクリックします。

2. 上矢印と下矢印を使用して機能参照の表示順序を調整するか、「機能ID」列の行にあるドロップダウン・リストを使用して機能参照の順序を変更します。最上位のアプリケーション機能が、デフォルトのアプリケーション機能です。このアプリケーションのセキュリティ構成に応じて、MAFではユーザーが匿名でログインして保護されていないコンテンツを表示したり、ユーザーに認証資格証明を提供するように求めることができます。

注意:

「機能参照」表の最上位のIDが、MAFアプリケーション内で最初に表示されるアプリケーション機能です。たとえば、WorkBetterサンプル・アプリケーションのダッシュボード・アプリケーション機能を参照してください。

3. 「ナビゲーション・バーに表示」列および「Springboardに表示」列の行のドロップダウン・リストから、 「true」または「false」を選択することで、Springboardとナビゲーション・バーのアプリケーション機能に対する表示動作を設定します。図4-6は、アプリケーション機能がナビゲーション・バーに表示されなくなるオプションの選択状態を示しています。

ヒント:

アプリケーションによってカスタム・スプリングボードが使用される場合、またはアプリケーション機能がスライディング・ウィンドウとして表示される場合は、これらのオプションをfalseに設定します。

図4-6 ナビゲーション・オプションの変更

デフォルトでは、Springboardとナビゲーション・バーが表示されます(つまり、これらの属性はtrueに設定されます)。ナビゲーション・バーとSpringboardの両方の属性をfalseに設定すると、アプリケーション機能は最初の位置にある場合のみ表示されるようになります。

注意:

スプリングボード・アプリケーションは、ナビゲーション・バー上またはMAFアプリケーションのスプリングボード内には表示されないので、カスタム・スプリングボード・アプリケーション機能として使用される機能参照については、「ナビゲーション・バーに表示」および「スプリングボードに表示」を両方ともfalseに設定する必要があります。

4.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>

例4-1は、デフォルトを選択したときに、enabled属性がtrueに設定される様子を示しています。

注意:

Springboardはデバイスの画面全体を占有するので、ナビゲーション・バーとSpringboardは同時には表示されません。

「カスタム」を選択して、スプリングボードとして使用するアプリケーション機能を選択すると、エディタでは<adfmf:navigation>要素(例4-2を参照)が移入されます。id属性は、maf-feature.xmlファイルで定義された、カスタム・スプリングボードとして使用するアプリケーション機能を指しています。

例4-1 デフォルトのSpringboardの表示の有効化

<adfmf:application>
...
<adfmf:navigation>
<adfmf:navigationBar enabled="true"/>
<adfmf:springboard enabled="true"/>
</adfmf:navigation>
</adfmf:application>

例4-2 カスタムSpringboardの構成

<adfmf:navigation>
<adfmf:springboard enabled="true">
<adfmf:springboardFeatureReference id="springboard"/>
</adfmf:springboard>
</adfmf:navigation>

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

スプリングボードのアニメーションを設定できます。ここでは、スプリングボードはスライドアウトし、指定された表示領域(213ピクセル)を占有するように設定されています

例4-3は、maf-application.xmlファイルのナビゲーション・ブロックを示しています。

次の行ではアニメーションを無効にしています。

<adfmf:springboard enabled="true" animation="none"/>

次の行では、Springboardが表示領域の左から100ピクセル分を占有するように設定し、アクティブなアプリケーション機能が表示領域の残りの部分を占有できるようにしています。

<adfmf:springboard enabled="true" animation="slideright" width="100px"/>

アニメーション以外に、例4-3は次の処理を示しています。

- showSpringboardAtStartup属性の使用。アプリケーションの起動時にSpringboardを表示するかどうかを定義します。(デフォルトでは、Springboardは表示されます。)

- navigationBarのdisplayHideShowNavigationBarControl属性の使用。

Springboardが表示されないようにするには、enabled属性をfalseに設定します。

例4-3 Springboardアニメーションの構成

<adfmf:navigation>
<adfmf:navigationBar enabled="true"
displayHideShowNavigationBarControl="true"/>
<!-- default interpretation of width is pixels -->
<adfmf:springboard enabled="true"
animation="slideright"
width="213"
showSpringbaordAtStartup="true"/>
</adfmf:navigation>

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

スプリングボードのアプリケーション機能をカスタマイズし、カスタマイズされたログイン・ページを含めることができます。

MAFが提供するデフォルトのHTMLスプリングボード・ページでは、次のテクノロジが使用されます。

- CSS: 色およびレイアウトを定義します。

- JavaScript: Springboardページ内に埋め込まれた<script>タグには、「ローカル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

- WebKit: レイアウト間および異なるSpringboardページ間での遷移時に、アイコンのなめらかなアニメーションが提供されます。WebKitレンダリング・エンジンの詳細は、http://www.webkit.org/を参照してください。

HTMLで記述されるSpringboardは、maf-feature.xmlファイルで宣言され、maf-application.xmlファイルで参照されるアプリケーション機能です。

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

HTMLの場合と同様に、MAF AMXを使用して記述されたSpringboardは、MAFアプリケーションによって参照されるアプリケーション機能です。

通常、スプリングボードはタスク・フローではなく単一のMAF AMXページとして記述されるため、埋込みアプリケーション機能の起動には、gotoFeatureメソッドが使用されます。

注意:

カスタムSpringboardページ(HTMLまたはMAF AMXによって作成されたもの)は、ビュー・コントローラ・プロジェクト内に配置する必要があります。ビュー・コントローラ・プロジェクト内にはmaf-feature.xmlファイルも格納されています。

デフォルトのSpringboard (jdev_install\jdeveloper\jdev\extensions\oracle.maf\libにあるadfmf.default.springboard.jar)は、MAF AMXページであり、機能アーカイブ(FAR) JARファイルにバンドルされ、MAFアプリケーションに含まれる別のFARとともにデプロイされます。JARファイルには、DataBindings.cpxファイルやPageDef.xmlファイルなど、スプリングボードに関連付けられたすべてのアーティファクトが含まれます。このファイルは、maf-application.xmlファイルのスプリングボード・オプションで「デフォルト」が選択された後のみ使用できます。このオプションを選択すると、このFARもアプリケーション・クラスパスに追加されます。FARの詳細は、「機能アーカイブ・ファイル(FAR)のデプロイ」を参照してください。

デフォルトのスプリングボード(次の例に示すspringboard.amx)は、MAF AMXアプリケーション機能として実装されます。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="#{bindings.name.inputValue}" id="ot3"/>
</amx:facet>
<amx:listView var="row"
value="#{bindings.features.collectionModel}"
fetchSize="#{bindings.features.rangeSize}"
id="lv1"
styleClass="amx-springboard">
<amx:listItem showLinkIcon="false"
id="li1"
actionListener="#{bindings.gotoFeature.execute}">
<amx:tableLayout id="tl1"
width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf11"
width="46px"
halign="center">
<amx:image source="#{row.image}"
id="i1"
inlineStyle="width:36px;height:36px"/>
</amx:cellFormat>
<amx:cellFormat id="cf12"
width="100%"
height="43px">
<amx:outputText value="#{row.name}"
id="ot2"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
<amx:setPropertyListener from="#{row.id}"
to="#{pageFlowScope.FeatureId}"/>
</amx:listItem>
</amx:listView>
</amx:panelPage>
</amx:view>

図4-7に示すように、MAF AMXファイルでは、リスト・アイテムがMAFアプリケーションの埋込みアプリケーション機能であるリスト・ビューを使用してスプリングボードを定義します。これらのアプリケーション機能は、デプロイ後は、名前と関連アイコンによって表示されます。AdfmfContainerUtilities APIのgotoFeatureメソッドでは、ページのナビゲーション機能が提供されます。特定のアプリケーション機能を表示するこのメソッドの使用の詳細は、「gotoFeature」を参照してください。「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」も参照してください。

図4-7 デフォルトのSpringboard

MAFでは、ApplicationFeaturesデータ・コントロール内にカスタムSpringboardを作成(またはデフォルトのSpringboardを拡張)するための基本ツールが提供されています。このデータ・コントロール(図4-8を参照)により、MAFアプリケーションとそのアプリケーション機能の両方を記述する属性のデータ・コレクションを使用して、スプリングボード・ページを宣言的に構築できます。カスタムSpringboardページの例は、APIDemoサンプル・アプリケーションを参照してください。このアプリケーション(およびMAFに付属の他のサンプル)の詳細は、「サンプルのMAFアプリケーション」を参照してください。

図4-8 ApplicationFeaturesデータ・コントロール

ApplicationFeaturesデータ・コントロールでは、次のパッケージのAdfmfContainerUtilitiesクラスによって提供される、MAFアプリケーションにナビゲーションを実装するメソッドを公開します。

oracle.adfmf.framework.api

表4-1に、ApplicationFeaturesデータ・コントロールからドラッグしてMAF AMXページ上にドロップ可能な、MAFアプリケーションのナビゲーションに対応したメソッドをいくつか示します。

AdfmfContainerUtilitiesクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

表4-1 アプリケーション機能メソッド

メソッド

説明

gotoDefaultFeature

デフォルトのアプリケーション機能に移動します。

gotoFeature

このメソッドに渡されたパラメータによって指定される特定のアプリケーションに移動します。

gotoPreferences

プリファレンス・ページに移動します。

gotoSpringboard

Springboardに移動します。

hideNavigationbar

ナビゲーション・バーを非表示にします。

showNavigationbar

ナビゲーション・バーを表示します(非表示になっている場合)。

resetFeature

このメソッドに渡されたパラメータによって指定されるアプリケーション機能をリセットします。

hideSpringboard

スプリングボードを非表示にします。

showSpringboard

スプリングボードを表示します。

toggleSpringboard

Springboardの表示と非表示を切り替えます。

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

「アプリケーションの起動時にSpringboardを表示」オプションを選択して、スライドアウト幅を画面の最大サイズに定義すると、MAFでは、起動時にバックグラウンドでデフォルトのアプリケーション機能がロードされます。

MAFアプリケーションが休止している場合、MAFはSpringboardを非表示にします。

4.8 MAFアプリケーションのアプリケーション機能の再起動

MAFでは、AMXアクションおよびAPIが提供されており、コンテンツ・タイプがMAF AMXページまたはMAFタスク・フローではないアプリケーション機能を再起動するのに使用できます(MAF AMXアプリケーション機能)。

MAF AMXアプリケーション機能を再起動すると、アプリケーション機能の開始に戻ります。タスク・フローを備えたアプリケーション機能の場合、タスク・フローが再起動されます。

アプリケーション機能は、次の方法のいずれかで再起動できます。

- 起動アクションを起動するボタン(amxCommandButton action="__start")など、UIコマンド・コンポーネントを公開します。

- AdfmfContainerUtilitiesクラスで公開されるいずれかのメソッドを起動するコードを作成します。たとえば、AdfmfContainerUtilities.queueNavigationRestart("feature1", true);は、feature1アプリケーション機能を再起動し、アプリケーション機能の開始に進みます。

resetFeatureは再起動よりも時間がかかるため、機能リセット(AdfmfContainerUtilities.resetFeature)の代わりにアプリケーション機能の再起動を使用します。アプリケーション機能の再起動では、認証済のエンド・ユーザーのログアウトなどは実行されません。

また、MAFでは、oracle.maf.api.feature.FeatureLifeCycleListenerインタフェースを実装するJavaクラスを記述することにより、アプリケーション機能の再起動前後にコードを実行できるAPIが提供されます。ライフサイクル・リスナーの詳細は、「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

4.8.1 アプリケーション機能の再起動方法

__startアクションを起動するコマンド・コンポーネントまたはAdfmfContainerUtilities.queueNavigationRestartを起動するマネージドBeanメソッドを構成します。

4.8.2 アプリケーション機能の再起動時の処理内容

アプリケーション機能を再起動すると、MAFは次の状態情報を消去します。

- タスク・フロー・コール・スタック

- pageFlowScopeインスタンス

- データ・コントロール・コンテキストおよび含まれるデータ・コントロールとプロバイダ

- アプリケーション機能の現在のviewScope

- アプリケーション機能の現在のバインド・コンテナ

- 戻るボタン・ナビゲーションに使用されているアプリケーション機能の現在のナビゲーション履歴

- 機能のWebビューからの履歴

JavaScriptキャッシュはJavaScriptレイヤーで消去されます。再起動では、JavaScriptまたはCordovaプラグインはWebビューに再ロードされません。よって、再ロードによるコストは発生しません。クラスの静的フィールドに状態を格納した場合、クラスは再ロードされません。機能のリセットの場合、クラスは再ロードされますが、機能の再起動ではクラスは再ロードされません。

4.9 Androidの戻るボタンを使用したMAFアプリケーションの移動

エンド・ユーザーは、Androidシステムの戻るボタンを使用してMAFアプリケーション上で後ろに戻ることができます。

図4-9は、Androidのナビゲーション・バーまたはAndroidデバイス自体に表示されるAndroidシステムの戻るボタンを示しています。図4-9は、このボタンが表示されるAndroid 4.xおよびAndroid 5.xバージョンのナビゲーション・バーを示しています。

図4-9 Androidの戻るボタン

図4-10は、Billingアプリケーション機能の「Billing Page 3」ページまで、エンド・ユーザーが3つのアプリケーション機能(Customer、SalesおよびBilling)間をナビゲートするMAFアプリケーションのナビゲーション・フローを示しています。

図4-10 MAFアプリケーションのアプリケーション機能とページ間のナビゲーション・フロー

エンド・ユーザーのAndroidシステムの戻るボタンのタップに応答するMAFアプリケーションのデフォルトの動作:

- 「Billing Page 3」は「Billing Page 2」にナビゲート

- 「Billing Page 2」は「Billing Page 1」にナビゲート

- 「Billing Page 1」はMAFアプリケーションを休止

エンド・ユーザーは、アクション属性の値が__backのUIとして公開されるMAF AMXボタンのかわりに、Androidシステムの戻るボタンのタップを選択できます。動作は、どちらのシナリオでも同じです。たとえば、Billingアプリケーション機能の3ページのすべてで、アクション属性に__backを設定したボタン・コンポーネントが公開されているものと仮定します。このシナリオでは、前に戻るナビゲーション・フローは、ページ3からページ2、ページ2からページ1、そしてエンド・ユーザーがページ1のコマンド・ボタンをタップした場合に、MAFアプリケーションが休止状態になります。

エンド・ユーザーによるAndroidシステムの戻るボタンのタップの応答となるデフォルトのMAFアプリケーションの動作をオーバーライドして、MAFアプリケーションの他の場所にナビゲートしたり、または前に戻る前になんらかのロジックを実行したりできます。MAFでは、JavaScript APIおよびMAF AMXシステムのアクション動作(systemActionBehavior)コンポーネントが提供されており、MAFアプリケーションのデフォルトの動作のオーバーライドに使用できます。systemActionBehaviorコンポーネントは、アプリケーション機能のコンテンツがMAF AMXページの場合のみ使用できます。JavaScriptは、MAF AMXページ、ローカルのHTML、またはリモートのURLを使用するアプリケーション機能のデフォルトの動作のオーバーライドに使用できます。JavaScriptのregisterSystemActionOverrideメソッドを使用すると、エンド・ユーザーがAndroidの戻るボタンをタップしたときに起動されるハンドラを登録できます。起動されるハンドラを削除するには、JavaScriptのunregisterSystemActionOverrideメソッドを使用します。どちらのメソッドもadf.mf.apiネームスペースにあります。JavaScriptの詳細は、Oracle Mobile Application Framework JSDocリファレンスを参照してください。

systemActionBehaviorコンポーネントの使用の詳細は、「Androidシステムの戻るボタンの動作を構成する方法」を参照してください。

MAF 2.2.0より前のリリースを使用して作成されたMAFアプリケーションでは、エンド・ユーザーによるAndroidシステムの戻るボタンのタップの応答となるデフォルトのMAFアプリケーションの動作は、アプリケーション機能の間で前に戻る動作でした。これは、たとえば図4-9で、エンド・ユーザーはBillingアプリケーション機能からSalesアプリケーション機能にナビゲートし、MAFアプリケーションを休止する前に、Customerアプリケーション機能にまでナビゲートすることを意味します。このリリースのMAFを使用して作成するMAFアプリケーションでは、『Oracle Mobile Application Frameworkのインストール』のAndroidの戻るボタンを使用してMAFアプリケーションをナビゲートする場合のレガシー動作の保持に関する項で説明されているように、maf-config.xmlファイルでパラメータを構成することで、このレガシーな動作を実装できます。このレガシーな動作を実装することにより、MAFアプリケーションでは、ここで説明したsystemActionBehaviorコンポーネントおよびJavaScriptのregisterSystemActionOverrideメソッドの使用が無視されます。

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

システム・アクション動作(systemActionBehavior)操作により、Androidデバイスの戻るボタンのデフォルトの動作をオーバーライドして、タスク・フローで定義されたMAF AMXアプリケーション機能の前のページに移動する前に、カスタム・ロジックの処理を実行できます。

図4-11に示すように、JDeveloperでは、システムのアクション動作は「コンポーネント」ウィンドウの「操作」の下にあります。

図4-11 「コンポーネント」ウィンドウのシステムのアクション動作

次の例は、MAF AMXファイルで定義されたsystemActionBehavior要素を示しています。この要素は、view要素の子にのみできます。

<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:systemActionBehavior id="sab1"
type="back"
actionListener="#{MyBean.onBackButton}"
action="#{MyBean.getNavAction}"/>
...
</amx:view>

前述の例のsystemActionBehaviorのactionListenerおよびaction属性は、次の例に示すようにJava Beanメソッドを起動します。onBackButtonメソッドにより、戻るナビゲーションが発生する前にカスタム・ロジックの処理が実行されます。getNavActionメソッドにより、戻る動作が無効になります。

public class MyBean {

public void onBackButton() {
// do processing
}

public String getNavAction() {
return "";
}
}

前述の例では、getNavActionメソッドから、戻るナビゲーションを有効にする"__back"文字列が返される可能性があります。この場合、MAF AMXページが読み込まれるときにこのアクションが解決されます。Androidデバイスでシステムの戻るボタンが押されるたびにコールされるわけではありません。

システムのアクション動作のMAF AMXコンポーネントおよびJava Beanに加え、JavaScriptを使用してAndroidシステムの戻るボタンの動作を構成できます。次の例は、アプリケーション機能に含まれるfeature.jsファイルを示しています。これは、戻るナビゲーションが発生する前に実行されるなんらかの処理を可能にする、Androidシステムの戻るボタンのハンドラを定義しています。

handleSystemBack = function()
{
// do some processing, invoke a Java bean
adf.mf.api.amx.doNavigation("__back");
};
adf.mf.api.registerSystemActionOverride("back", handleSystemBack);

次の例に示すハンドラでは、戻るナビゲーションの発生が止められます。

handleSystemBack = function()
{
// do nothing
};
adf.mf.api.registerSystemActionOverride("back", handleSystemBack);

次の例に示すハンドラでは、標準の戻るナビゲーションが可能になります。

handleSystemBack = function()
{
adf.mf.api.amx.doNavigation("__back");
};
adf.mf.api.registerSystemActionOverride("back", handleSystemBack);

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

アプリケーション機能をスライディング・ウィンドウとしてレンダリングできます。これにより、ナビゲーション・バーまたはSpringboard内に表示される他のアプリケーション機能と同時にアプリケーション機能が表示されます。

スライディング・ウィンドウは、アプリケーション内に常に存在しているコンテンツ(グローバル・ツール・バーなど)を表示するために使用したり、一時的な(ポップアップ)コンテンツ(ヘルプ・ウィンドウなど)を表示するために使用できます。図4-12は、SlidingWindowサンプル・アプリケーションのSlidingDrawerアプリケーション機能を示しています(「サンプルのMAFアプリケーション」を参照)。このアプリケーション機能は、他のアプリケーション機能に重なりながら、アプリケーション画面の右側に表示されます。

図4-12 他のアプリケーション機能に重なるスライディング・ウィンドウ

アプリケーション機能をスライディング・ウィンドウとしてレンダリングする場合、Show on Navigation BarプロパティおよびShow on Springboardプロパティをfalseに設定する必要があります。

スライディング・ウィンドウを作成するには、oracle.adfmf.framework.api.AdfmfSlidingWindowOptionsクラスとAdfmfSlidingWindowUtilitiesクラスの組合せを、アプリケーション内のマネージドBeanまたはライフサイクル・リスナーから起動します。

次の例は、SlidingWindowサンプル・アプリケーションで、LifeCycleListenerImpl.javaのactivateメソッドから、図4-12に示すスライディング・ウィンドウを作成する方法を示しています。スライディング・ウィンドウの作成後、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サンプル・アプリケーション全体にアクセスする方法は、「サンプルのMAFアプリケーション」を参照してください。

AdfmfSlidingWindowUtilitiesおよびAdfmfSlidingWindowOptionsの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。ライフサイクル・リスナーの使用方法の詳細は、「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

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

カスタムURLスキームを使用して、他のアプリケーションからネイティブ・アプリケーションを起動できます。

別のアプリケーションからMAFモバイル・アプリケーションを起動するには、次の手順を実行します。

1. カスタムURLスキームを登録します。このURLスキームは、maf-application.xmlファイルの概要エディタで、「URLスキーム」フィールドを使用して構成します。このスキームを持つURLを使用すれば、MAFモバイル・アプリケーションを起動し、そのアプリケーションにデータを渡すことができます。

2. アプリケーション・コントローラ・プロジェクトで、URLを通知されるカスタムURLイベント・リスナー・クラス(CustomURLEventListenerなど)を作成します。このクラスには、イベント・リスナーを定義するoracle.adfmf.framework.event.EventListenerインタフェースを実装する必要があります。oracle.adfmf.framework.event.EventListenerインタフェースの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

MAFモバイル・アプリケーションの起動に使用されるURLで呼び出されるonMessage(Event e)メソッドをオーバーライドおよび実装します。Eventオブジェクトを使用して、URLペイロードおよびアプリケーションの状態に関する有用な情報を取得できます。URLペイロードを取得するには、Event.getPayloadメソッドを使用します。URLイベント発生時にアプリケーションの状態を取得するには、Event.getApplicationStateメソッドを使用します。Eventクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

3. アプリケーション・ライフサイクル・イベント・リスナー(ALCL)クラスを登録します。

ライフサイクル・リスナーの詳細は、「MAFアプリケーションでのライフサイクル・リスナーの使用方法」 を参照してください。

ALCLクラスのstartメソッド内の、カスタムURLイベントのソースを表すEventSourceオブジェクトを取得します。

EventSource openURLEventSource = EventSourceFactory.getEventSource(EventSourceFactory.OPEN_URL_EVENT_SOURCE_NAME);

カスタムURLイベント・リスナー・クラスのオブジェクトを作成し、イベント・ソースに追加します。

openURLEventSource.addListener(new CustomURLEventListener());

MAFアプリケーションでは、次の方法を使用して別のネイティブ・アプリケーションを起動することができます。

- ネイティブ・アプリケーションによって登録されたカスタムURLスキームで始まるURLを持つMAF AMXページでamx:goLinkを使用します。次にその例を示します。

<amx:goLink text="Open App" id="gl1" url="mycustomurlscheme://somedata"/>

- ネイティブ・アプリケーションによって登録されたカスタムURLスキームで始まるhref属性値を持つHTMLページで、HTMLリンク要素を使用します。次にその例を示します。

<a href="mycustomurlscheme://somedata">Open App</a>

ネイティブ・アプリケーションを起動するためにMAFアプリケーションが使用するカスタムURLスキームを、maf-application.xmlファイルの概要エディタの「セキュリティ」ページにある「許可されるスキーム」リストに追加します。この変更は、アプリケーションが他のアプリケーションの起動に使用するすべてのURLスキームを宣言しなければならないというiOS 9の要件に対処するものです。図4-13に示すように、「セキュリティ」ページの「許可されるスキーム」セクションの「追加」アイコンをクリックして、カスタムURLスキームを追加します。

図4-13 別のアプリケーションを起動するためにMAFアプリケーションが使用するカスタムURLスキームの登録

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

この章では、MAFアプリケーションのアプリケーション機能で使用可能なコンテンツ・タイプの概要と、アプリケーション機能でサポートされている各コンテンツ・タイプの作成方法について説明します。

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

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

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

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

- iOSでのAMXコンテンツを使用するアプリケーション機能のWebビューの構成

- アプリケーション機能での使用のための外部リソースの選択

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

アプリケーション機能のコンテンツ・タイプには、ユーザー・インタフェースの形式が記述されます。このコンテンツ・タイプは、MAF AMXコンポーネントまたはHTML(5)タグを使用して構成できます。

また、アプリケーション機能では、モバイル・コンテキストに適したコンテンツを含む、リモートでホストされたページから、自身のコンテンツを導出することもできます。このようなWebページとして考えられるのは、スマートフォン向けのApache Trinidadで作成されたJavaServerページや、タブレット・デバイス上で実行されるアプリケーション向けのADF Facesコンポーネントから構成されたページです。MAFアプリケーションに埋め込まれた各アプリケーション機能では、様々なコンテンツ・タイプを保持できます。

MAFアプリケーションには、様々なコンテンツ・タイプを持つアプリケーション機能が含まれますが、アプリケーション機能自体も、ユーザーおよびデバイス固有の要件に応じた様々なコンテンツ・タイプを保持する場合があります。アプリケーション機能で異なるコンテンツ・タイプを配信する方法の詳細は、「アプリケーション機能に関する制約の設定」を参照してください。<adfmf:content>要素に子要素を追加すると(例5-1を参照)、アプリケーション機能でユーザー・インタフェースを実装する方法を定義できます。

概要エディタの「コンテンツ」タブ(図5-1を参照)には、例5-1に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。このタブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できる制約を設定できます。

各コンテンツ・タイプには、独自のパラメータ・セットがあります。たとえば、図5-1に示すように、MAF AMXコンテンツとして実装するアプリケーション機能のMAF AMXページまたはタスク・フローの場所を指定する必要があります。さらにオプションで、アプリケーション機能に他のアプリケーション機能(またはMAFアプリケーション自体)とは異なるルック・アンド・フィールを設定するCSSファイルを選択したり、MAF AMXコンポーネントのアクションを制御するJavaScriptファイルを選択することもできます。

図5-1 アプリケーション機能の実装の定義

例5-1 <adfmf:content>要素

<adfmf:content id="Feature1">
<adfmf:amx file="FeatureContent.amx">
</adfmf:content>

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

「コンテンツ」タブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとスプリングボード・アイコンのイメージを制御できる制約を設定できます。

概要エディタの「コンテンツ」タブ(図5-1を参照)には、例5-1に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。

始める前に:

各コンテンツ・タイプには、次のような独自の前提条件があります。

- リモートURL: Webアプリケーションへの参照。既存のWebアプリケーションをモバイル用に拡張し、さらにデバイス・サービスを拡張できます。リモート・コンテンツでは、ローカル・データ・キャッシュや、サーバー側データおよび機能の一式を提供することによって、MAF AMXおよびローカルHTMLコンテンツの両方を補完できます。リモートURL実装には、有効なWebアドレスが必要です。「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

- ローカルHTML: MAFアプリケーション内にパッケージ化されたHTMLページを参照します。「サンプルのMAFアプリケーション」で説明されているHelloWorldサンプル・アプリケーションが示すように、このようなHTMLページはJavaScriptを参照できます。MAFが自分のアプリケーションの機能の実装に最適ではない場合に、Cordova JavaScript APIの使用によるアプリケーション機能を実装するため、このコンテンツ・タイプの使用を検討してください。ローカルHTMLおよびアプリケーション・コンテナAPI。

アプリケーション・コンテンツをリモートURLまたはローカルHTMLとして定義するには:

1. maf-feature.xmlファイルの「機能」表にリストされているアプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 「追加」をクリックして、「コンテンツ」表に新しい行を作成します。

4. 次のいずれかのコンテンツ・タイプで、生成されたIDに対応するものを選択します。

- リモートURL

- ローカルHTML

5. コンテンツ固有のパラメータを定義します。

- リモートURLコンテンツの場合は、図5-2のように接続を選択します。これは、サーバー上のWebページのアドレス(および起動ページの場所)を表しています。

図5-2 ホスト・アプリケーションの接続の選択

この接続を作成するには、まず「追加」をクリックして、次に「URL接続の作成」ダイアログに入力します(図5-3を参照)。このダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。この接続は、connections.xmlファイルに格納されます。

注意:

この接続は、アプリケーション・リソースとしてのみ作成できます。

図5-3 URL接続の作成

- ローカルHTMLコンテンツの場合は、ローカル・バンドルの場所を入力します。または、「URL」フィールドで「追加」をクリックし、図5-4に示すダイアログに入力して、JDeveloperのHTMLエディタを使用してページを構築することで、HTMLページを作成します。これはアプリケーション機能なので、このページはビュー・コントローラ・プロジェクトのWeb Contentフォルダに格納されます。

図5-4 アプリケーション機能のコンテンツとしてのローカルHTMLページの作成

6. 必要に応じて、次の手順を実行します。

- このコンテンツをユーザーが使用できるようになるための条件を示す制約を入力します。「アプリケーション機能に関する制約の設定」を参照してください。

- ナビゲーション・バーとSpringboardのイメージを選択します。

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

「コンテンツ」タブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとスプリングボード・アイコンのイメージを制御できる制約を設定できます。

概要エディタの「コンテンツ」タブ(図5-1を参照)には、例5-1に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。

始める前に:

各コンテンツ・タイプには、次のような独自の前提条件があります。

- MAF AMX: アプリケーション機能に対するデフォルトのコンテンツ・タイプ。「MAF AMXページの作成」 を参照してください。
MAF AMXとして実装されるアプリケーション機能には、ビュー(単一のMAF AMXページ)か、バインド・タスク・フローまたはバインドなしタスク・フローが必要です。JavaScriptファイルを追加すると、MAF AMXコンポーネントに対するレンダリング・ロジックが提供されるか、既存のレンダリング・ロジックがオーバーライドされます。アプリケーション機能に対するカスタムのルック・アンド・フィールを指定するセレクタを持つスタイル・シート(CSS)を含めます。これは、MAFアプリケーション・レベルで定義されたスタイル(アプリケーション機能にデフォルトで使用されるスタイル)をオーバーライドします。つまり、アプリケーション機能全体で確実に独自のルック・アンド・フィールを持つようになります。

MAF AMXページとこれらを格納するMAFアプリケーションは、両方とも「新規ギャラリ」のウィザードを使用して作成できます。これらのウィザードにアクセスするには、まず「アプリケーション」ウィンドウでビュー・コントローラ・プロジェクトを強調表示してから、次に「新規」を選択します。

注意:

maf-feature.xmlファイル内にある、タスク・フロー、MAF AMXページ、CSSおよびJavaScriptファイルへの参照を手動で編集する場合、デバイスで使用されているファイル・システムによって大文字と小文字が区別され、特殊文字が許可されない可能性があることに注意してください。これらのファイルを確実に参照できるようにするには、モバイル・デバイスの仕様を確認してください。

- MAFタスク・フロー: アプリケーション機能の制御フローの定義にモジュール型アプローチを提供します。タスク・フローを使用して、1つのタスクを構成する一連のアクティビティを定義します。タスク・フローに含めることのできるアクティビティには、ビュー(MAF AMXページの表示に使用)、メソッド・コール(マネージドBeanのメソッドの起動に使用)、タスク・フロー・コール(別のタスク・フローのコールに使用)などがあります。「タスク・フローの作成」を参照してください。

MAF AMXページまたはタスク・フローをアプリケーション機能のコンテンツとして使用する手順:

1. アプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 必要に応じて、「追加」をクリックして「コンテンツ」表に行を作成し、「タイプ」列のドロップダウン・リストから「MAF AMXページ」または「MAFタスク・フロー」を選択します(次の図を参照)。

図5-5 「MAF AMXページ」または「MAFタスク・フロー」をコンテンツ・タイプとして選択

4. 「ファイル」フィールドで、該当するオプションを選択します。

- MAF AMXページまたはタスク・フローを作成済の場合は、「参照」アイコンをクリックしてページまたはタスクの場所を選択します。

- 新しいMAF AMXページを作成するには、「追加」アイコンをクリックして、新しいMAF AMXページまたはタスク・フローの作成が可能なダイアログを起動します。

5. 必要に応じて、次の手順を実行します。

- 「包含」表で「追加」をクリックしてJavaScriptファイルを入力し、「JavaScript」を選択し、ファイルの場所を参照します。

- 最初に「追加」をクリックして、次に「スタイルシート」を選択することで、maf-config.xmlで指定されているデフォルトのスタイルシートをオーバーライドします。ファイルの場所を参照します。

- 「アプリケーション機能に関する制約の設定」の説明に従って制約を入力します。

- ナビゲーション・バーとSpringboardのイメージを選択します。

注意:

イメージ、スタイルシートおよびJavaScriptファイルは、デプロイ可能にするために、public_htmlフォルダ内に配置する必要があります。「外部リソースの選択に関する必知事項」を参照してください。

5.4 iOSでのAMXコンテンツを使用するアプリケーション機能のWebビューの構成

iOS 9デバイスにデプロイされている場合、MAFアプリケーションでは、AMXコンテンツのレンダリングにデフォルトでWKWebViewが使用されます。

WKWebViewは、UIWebViewと比べてパフォーマンスが改善されている、より新しいiOS Webビューです。ローカルHTMLまたはリモートURLコンテンツ・タイプを使用するアプリケーション機能では、デフォルトでUIWebViewが使用されます。これは、このWebビューでは、JavaScript APIへのアクセスのために/~maf.device~/仮想パスがサポートされているためです。/~maf.device~/仮想パスが必要ない場合は、ローカルHTMLおよびリモートURLコンテンツ・タイプを使用するアプリケーション機能を、WKWebViewを使用するよう構成できます。必要な場合は、AMXコンテンツを使用するアプリケーション機能を、古いUIWebViewを使用するよう構成することもできます。これらの構成変更を行うには、次の例で示すように、maf-features.xml内のiOSWebViewプロパティを構成します。

<adfmf:feature id="WKWebViewExample" name="WKWebViewExample">
<adfmf:constraints>
<adfmf:constraint property="device.os" operator="contains" value="iOS" id="c6"/>
</adfmf:constraints>
<adfmf:content id="WKWebViewExample.1">
<adfmf:amx file="WKWebViewExample/home.amx"/>
</adfmf:content>
<adfmf:properties id="wkp1">
<!-- To use WKWebView, set to modern  -->
<adfmf:property id="wkp1-1" name="iOSWebView" value="modern" />

<!-- To use UIWebView, set to legacy    -->
<!-- name="iOSWebView" value="legacy"   -->

</adfmf:properties>
</adfmf:feature>

iOSWebViewプロパティが不足しているかdefaultに設定されている場合は、AMXコンテンツにはWKWebViewが使用され、ローカルHTMLおよびリモートURLコンテンツ・タイプにはUIWebViewが使用されます。

WKWebViewは、iOS 9でのみ使用されます。UIWebViewは、常にiOS 8上で使用されます。

5.5 アプリケーション機能での使用のための外部リソースの選択

デプロイメントを可能にするために、属性によって参照されるすべてのリソースは、ビュー・コントローラ・プロジェクトのpublic_htmlディレクトリ内に配置する必要があります。

すべてのリソースは次の属性によって参照されます。

- <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">)。

- <adfmf:amx>のfile属性(例: <adfmf:amx file="PRODUCT/home.amx" />)。

- <adfmf: localHTML>のurl属性(例: <adfmf:localHTML url="oracle.hello/index.html"/>)。

- <adfmf:includes>のtype=stylesheetおよびtype=JavaScriptに対して定義するファイル属性(例: <adfmf:include type="JavaScript" file="myotherfile.js"/> または<adfmf:include type="StyleSheet" file="resources/css/stylesheet.css" id="i3"/>)。

MAFは、別の場所から参照されるリソースをサポートしていません。つまり、たとえば、../を接頭辞として使用して、public_htmlディレクトリ外部に値を入力することはできません。public_html外部のリソースを参照しないようにする安全策として、MAFには、「ファイルがpublic_htmlディレクトリにありません」と呼ばれる監査ルールが含まれています。MAFの監査プロファイル(図5-6を参照)には、「ツール」→「プリファレンス」 →「監査」→「プロファイル」と選択することで、「プリファレンス」の「監査」の下の「プロファイル」ノードからアクセスできます。

図5-6 MAFの監査プロファイル

このプロファイルを選択した場合、リソースの場所を変更すると、JDeveloperによって警告が発行されます。図5-7に示すように、デフォルト値がオーバーライドされると、JDeveloperはこうした警告を表示します。監査の詳細は、『Oracle JDeveloperによるアプリケーションの開発』の「Javaプロジェクトの監査とモニタリング」の章を参照してください。

図5-7 外部リソースの警告

6 MAFアプリケーションでのクライアント・データ・モデルの作成

この章では、RESTサービスからリソースを取得して、MAFアプリケーションのクライアント・データ・モデルにデータ・オブジェクトおよびサービス・オブジェクトを作成する方法について説明します。

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

- MAFアプリケーションのクライアント・データ・モデルの概要

- MAFアプリケーションでのクライアント・データ・モデルの作成の概要

- RESTサービスへの接続によるクライアント・データ・モデルの作成

- クライアント・データ・モデルの候補データ・オブジェクトの検出

- クライアント・データ・モデルのデータ・オブジェクトの選択および永続化

- データ・オブジェクトの親子関係の指定

- CRUD RESTリソースの定義

- CRUD RESTリソース詳細の指定

- クライアント・データ・モデルのランタイム・オプションの設定

- クライアント・データ・モデルの生成

- MAFアプリケーションでのクライアント・データ・モデルの編集

- MAFクライアント・データ・モデルDBPersistenceManagerの使用によるSQLiteデータベースへのアクセス

- カスタム・リソースの定義

- CRUD RESTコール後のカスタム・ロジックの実行

- サービス・オブジェクトへのプログラムによるアクセス

- 主キーの使用の理解

- フィルタされたエンティティ・リストの使用

- MAFクライアント・データ・モデルに基づくユーザー・インタフェースの作成

- MAFアプリケーションからのオフライン・トランザクションの同期

- クライアント・データ・モデルによるデータ変更イベントのサポートの理解

- MAFアプリケーションでのオフライン・モードの強制

- バックグラウンド・タスクの実行のためのビジュアル・インジケータの使用

6.1 MAFアプリケーションのクライアント・データ・モデルの概要

MAFにはデザインタイム・サポートが用意されており、MAFアプリケーションをRESTサービスに接続してデータ・オブジェクトを公開できます。その後、これらのデータ・オブジェクトに基づいてクライアント・データ・モデルを作成できます。また、MAFにより、オフライン・モードのアプリケーションで保持するデータを決定できます。

クライアント・データ・モデルのMAFアプリケーションには、MAFアプリケーションのデータ・モデルを表すためのJavaクラスと関連ファイルが含まれています。MAFでは、オフラインでデータを使用できるようにSQLiteデータベースを使用してデータを格納し、データ・オブジェクト(エンティティ・オブジェクトとも呼ばれます)およびサービス・オブジェクト(エンティティCRUDサービス・オブジェクトとも呼ばれます)という2つのタイプのJavaクラスを使用してデータと対話します。データ・オブジェクトは、MAFアプリケーションの接続先のRESTサービスから取得したデータを保持します。MAFアプリケーションは、デバイス上のSQLiteデータベースに対してデータ・オブジェクトを格納および取得します。サービス・オブジェクトは、作成、読取り、更新、削除(CRUD)アクションに加え、データ・オブジェクトに対して機能する他のカスタム・アクションを実行します。通常、サービス・オブジェクトを使用してデータ・コントロールを作成し、そのデータ・コントロールから関連するメソッドおよびエンティティ・コレクションをAMXページにドラッグ・アンド・ドロップして、UIレイヤーを構築できます。MAFクライアント・データ・モデルでは、persistence-mapping.xmlファイルを使用してオブジェクト関連マッピング情報を格納し、この情報によってデータベースの表および列をデータ・オブジェクトおよびデータ・オブジェクトの属性にマップする方法、さらにデータ・オブジェクトおよびデータ・オブジェクトの属性をRESTレスポンス・ペイロードの属性にマップする方法を識別します。

図6-1は、MAFクライアント・データ・モデルのランタイム・アーキテクチャで、RESTサービスからの部門情報の読取りおよび書込みを行うMAFアプリケーションの特定の実装を参照しています。

図6-1 MAFクライアント・データ・モデルのランタイム・アーキテクチャ

図6-1では、サービス・オブジェクト(DepartmentService)はCRUDアクションに加え、Departmentデータ・オブジェクトに対して機能する他のカスタム・アクションも提供しています。

Departmentデータ・オブジェクトには、RESTサービス・リクエストおよびレスポンス・ペイロードの対応する属性にマップされている部門の属性(名前やIDなど)を対象としたgetterメソッドおよびsetterメソッドがあります。SQLiteデータベースのDEPARTMENTS表には、同じデータ・オブジェクト属性にマップされる列があります。persistence-mapping.xmlファイルには、様々な場所(データベース表の列、Javaクラス属性およびRESTペイロード)にある属性間の関係をマップする情報が格納されます。

MAFは、MAFアプリケーションにクライアント・データ・モデルを作成するために使用する数多くのウィザードをJDeveloperに提供します。「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」を参照してください。クライアント・データ・モデルを作成したら、クライアント・データ・モデルのサービス・オブジェクトからデータ・コントロールを生成できます。MAFには他にも、MAFクライアント・データ・モデルが生成するデータ・コントロールおよびデータ・モデルに基づいてMAFアプリケーションにユーザー・インタフェースを生成するウィザード(MAFユーザー・インタフェース・ジェネレータ)があります。「MAFクライアント・データ・モデルに基づくユーザー・インタフェースの作成」を参照してください。

ヒント:
RESTサービスへのアクセスにクライアント・データ・モデルを使用するMAFアプリケーションの作成を順を追って説明するチュートリアルは、Oracle MAFおよびクライアント・データ・モデル(CDM)によるREST/JSONサービスの使用および永続化を参照してください。

6.2 MAFアプリケーションでのクライアント・データ・モデルの作成の概要

RESTサービスからクライアント・データ・モデルを作成するには、データ・オブジェクトを検出し、そのオブジェクトの属性を構成し、それらのリレーションシップをマッピングし、CRUDアクションに使用するRESTリソースを特定し、モデルに組み込むアーティファクトを生成します。

このウィザードを使用すると、汎用的なRESTサービスまたはOracle Mobile Cloud Service (MCS)にホストされているRESTサービスに接続できます。接続すると、アプリケーションで使用するデータを識別して取得するというタスクを実行するためのダイアログがMAFに追加で表示されます。これらのタスクは次のとおりです。

1. MAFアプリケーションでの使用候補となるデータ・オブジェクトを検出します。MAFでは、次のデータ・オブジェクト・リソースからデータ・オブジェクトを検出できます。

a. サンプルRESTリソースURL

b. サンプル・リソース・ペイロード

c. RAMLファイル

d. ADFビジネス・コンポーネントRESTサービス

2. MAFアプリケーションでの使用候補となるデータ・オブジェクトを検出すると、使用するデータ・オブジェクトを選択するためのダイアログがMAFに表示されます。また、MAFには新規データ・オブジェクトを作成するためのオプションが用意されています。

3. 追加のダイアログでは、データ・オブジェクト属性を確認して変更できます。実行できるタスクには、デバイスに機密データを保持しないようにすることの他に、属性名、RESTサービス・ペイロードに表示される名前、各属性のJavaタイプおよびデータベース列のタイプを編集することなどがあります。また、キー属性を選択します。選択するキー属性が一意であることが重要です。

4. データ・オブジェクトの親子関係を指定します。

5. CRUDアクションに使用するRESTリソースおよび関連するHTTPメソッドを定義し、さらには問合せパラメータやパス・パラメータなどのリソース詳細を指定します。

6. CRUDアクションに使用するRESTリソースを特定したら、MAFアプリケーションの実行時動作を設定するためのダイアログがMAFに表示されます。ここでは、たとえば、オフライン・トランザクションを有効にしたり、バックグラウンドでのリモートの読取りおよび書込みを有効にしたり、Webサービス・エラーを表示します。

7. MAFに最後に表示されるダイアログでは、MAFがクライアント・データ・モデルのために生成したアーティファクトをアプリケーションのどこに配置するかを指定します。このダイアログを使用して、MAFが生成したJavaクラスのプロジェクトの場所およびパッケージ名を決定します。

「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードを完了すると、MAFがMAFアプリケーションのクライアント・データ・モデルを生成します。ウィザードを再度起動して、生成されたクライアント・データ・モデルを編集できます。たとえば、RESTサービスでデータ・モデルに含める追加のデータ・オブジェクトを特定します。RESTサービスに接続することなく、追加のデータ・オブジェクトを取得するようにクライアント・データ・モデルを編集する場合は、「永続性マッピングの編集」ウィザードを起動します。この後者のウィザードは、「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードとダイアログを共有しますが、RESTサービスへの接続が必要ありません。

また、クライアント・データ・モデルのサービス・オブジェクトからデータ・コントロールを生成することもできます。データ・コントロールを生成したら、データおよび操作を「データ・コントロール」パネルからAMXページにドラッグ・アンド・ドロップして、MAFアプリケーションのUIを作成できます。MAFユーザー・インタフェース・ジェネレータを使用してMAFアプリケーションのプロトタイプUIを生成する場合は、データ・コントロールの作成が前提条件となります。「MAFクライアント・データ・モデルに基づくユーザー・インタフェースの作成」を参照してください。

注意:
MCSでホストされたRESTサービスに接続する場合は、MCS Data Offline & Synchronization APIを使用しないでください。MAFクライアント・データ・モデルにより、MAFアプリケーションはオフラインで動作して、MAFアプリケーションがオンラインに戻ったときにはデータを同期できるようになります。

6.3 RESTサービスへの接続によるクライアント・データ・モデルの作成

RESTサービスに接続して、MAFアプリケーションのクライアント・データ・モデルで使用するために取得するデータ・オブジェクト・リソースを特定します。

(汎用的なサービスかMCSにホストされているサービスかに関係なく) RESTサービスに接続するには、「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードを起動します。詳細は、次を参照してください。

- RESTサービスに接続してデータ・オブジェクトを取得する方法

- MCSに接続する場合は、「MCS無名アクセス・キーに関する必知事項」を参照してください。

このタスクは、MAFアプリケーションにクライアント・データ・モデルを生成する一連のタスクのうちの1つです。「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」を参照してください。

6.3.1 RESTサービスに接続してデータ・オブジェクトを取得する方法

RESTリソースに接続し、クライアント・データ・モデルに含めるために選択する候補データ・オブジェクトを特定するには、「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードを使用します。

MAFアプリケーション・データ・モデルを作成するには:

1. MAFアプリケーションの作成「MAFアプリケーションの作成方法」を参照してください。

2. メイン・メニューで、「ファイル」→「ギャラリから」を選択します。

3. 「新規ギャラリ」の「ビジネス層」カテゴリの「モバイル・アプリケーション・フレームワーク」ノードで、「REST WebサービスからのMAFクライアント・データ・モデル」をダブルクリックします。

4. 「ようこそ」ページで、「次へ」をクリックします。

5. 図6-2に示す「接続」ページで、「RESTサービス接続」ドロップダウン・フィールドの横にある緑のプラス・アイコンをクリックしてダイアログを起動し、接続先のRESTサービスに対するURLエンドポイントの接続名を定義します。

図6-2 REST接続ダイアログ

6. 接続の名前を入力し、「サービスのベースURI」入力フィールドにRESTサービスのURLエンド・ポイントを指定します。
利便性のため、URLエンド・ポイントの一部はMAFアプリケーションが使用するすべてのRESTリソースで同じものを指定します。これにより、ウィザードの後続ページで行う必要がある入力の量が削減されます。1つの例外は、MCSのインスタンスへのURLエンド・ポイントを指定する場合です。この後者の場合、URLエンド・ポイントは/mobileで終わる必要があります。これにより、MAFアプリケーションではカスタムAPIコールとMCSプラットフォームAPIコールの両方に接続を使用できます。

注意:
図6-2に示すように、URLエンド・ポイントに対して不完全なURLを指定しているため、「接続のテスト」ボタンをクリックしても、ここでは機能しません。URLエンド・ポイントがフォワード・スラッシュで終わっていないことを確認してください(ウィザードでは、これを確認しないと、「次へ」をクリックできるようになりません)。

7. アクセスするRESTリソースが保護されている場合は、認証情報を該当するフィールドに入力します。
「セキュアなWebサービスへのアクセス」を参照してください。

8. 「OK」をクリックして、「接続」ページに戻り、適切なオプションを選択します。

- 接続先のRESTサービスがMCSにホストされていない場合は、「次へ」をクリックします。

- 接続先のRESTサービスがMCSにホストされている場合は、「MCS接続」チェック・ボックスを選択します。「MCSモバイル・バックエンドID」および「MCS無名アクセス・キー」入力フィールドへの入力の詳細は、「MCS無名アクセス・キーに関する必知事項」を参照してください。

RESTサービスに接続すると、MAFアプリケーションのクライアント・データ・モデルに取り込んで使用するためのデータ・オブジェクトをRESTサービスで検出できます。「クライアント・データ・モデルの候補データ・オブジェクトの検出」を参照してください。

6.3.2 MCS無名アクセス・キーに関する必知事項

MAFアプリケーションがMCSで認証される前にMCSにアクセスすると、MAFはMCS無名アクセス・キー値を使用して認可ヘッダーを作成します。これは、たとえば、ユーザーがログインする前にMCSにstartSession MCS分析イベントを送信する場合に便利です。

使用するアクセス・キー値が匿名キーである必要はありません。MCSモバイル・バックエンドのユーザー・レルムに定義されているMCSユーザーの認可キーを使用できます。これは、たとえば、MCS記憶域収集にアクセスする場合や、匿名ユーザーにアクセスできないその他のリソースにアクセスする場合に行います。

アクセス・キーに接頭辞Basicを付ける必要はありません。MAFが必要に応じて接頭辞Basicを追加または削除します。MAFアプリケーションで動的MCS接続をサポートする必要がある場合は、「MCSモバイル・バックエンドID」フィールドおよび「MCS無名アクセス・キー」フィールドにEL式を指定できます。MCSに対して認証されると、MAFがユーザーのログイン資格証明に基づいてすべてのRESTコールに認可ヘッダーを自動的に挿入します。つまり、MAFアプリケーションが認証されたら、MAFは入力フィールドのMCS無名アクセス・キー値を無視します。

6.4 クライアント・データ・モデルの候補データ・オブジェクトの検出

MAFアプリケーションがRESTサービスに接続されると、アプリケーションのクライアント・データ・モデルに使用するデータ・オブジェクトを選択できます。

「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードには、MAFアプリケーションで使用するデータ・オブジェクトを検出するために次のオプションが用意されています。

- RESTリソースURL: RESTサービスを起動して候補データを返すには、このオプションを使用します。
「RESTリソースURLを使用してデータ・オブジェクトを検出する方法」を参照してください。

- サンプルのリソース・ペイロード: サンプルのJSONまたはXMLペイロードを入力するには、このオプションを使用します。このオプションは、ライブRESTサービスの起動によって返された最初のアイテムに属性または子データがない場合に便利です。また、現時点でRESTサービスにアクセスできない場合や、アプリケーションでデータの取得ではなくデータのポストを行う場合にも便利です。
「サンプルのペイロードを使用してデータ・オブジェクトを検出する方法」を参照してください。

- RAMLファイル: RAMLファイルには、アプリケーションがアクセスするRESTサービスについて記述します。MCSにAPIのエンド・ポイントを定義すると、MCSがRAMLファイルを自動的に作成します。
「RAMLファイルを使用してデータ・オブジェクトを検出する方法」を参照してください。

- ADF BC REST記述ADF BC REST Describe: ADFビジネス・コンポーネントによって公開されたRESTサービスにアクセスするには、このオプションを使用します。
「ADF BC REST記述を使用してデータ・オブジェクトを検出する方法」を参照してください。

このタスクは、MAFアプリケーションにクライアント・データ・モデルを生成する一連のタスクのうちの1つです。「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」を参照してください。

6.4.1 RESTリソースURLを使用してデータ・オブジェクトを検出する方法

RESTサービスを起動し、レスポンス・ペイロードの構造に基づいて候補データ・オブジェクトを返すには、HTTPメソッド(通常はGET)を含め1つ以上のRESTリソースを指定します。

図6-3は、ウィザードの「データ・オブジェクト・リソース」ダイアログを示しています。ここで、問い合せるRESTリソースを指定します。

図6-3 データ・オブジェクト・リソースのRESTリソースの問合せ

図6-3に示すように、「追加」ボタンおよび「削除」ボタンを使用して、「リソース」リストに入力するRESTリソースのリストを管理します。RESTリソースを起動するために特定のHTTPヘッダーが必要である場合には、「ヘッダーの設定」ボタンを使用してダイアログを起動し、ここでヘッダーとしてキーと値のペアを入力します。たとえば、RESTサービスから返されるペイロードがXMLではなくJSON形式になるようにする場合は、「ヘッダーの設定」をクリックし、表示されたダイアログにキーとしてContent-Type、値としてapplication/jsonを入力します。

「フラット化されたネスト・オブジェクト」チェック・ボックスの使用は、「フラット化されたネスト・データ・オブジェクト・オプションに関する必知事項」を参照してください。

「次へ」をクリックして、RESTサービスを問い合せて、レスポンス・ペイロードの構造に基づいて候補データ・オブジェクトを返す前に、次の点に注意してください。

- MAFは、RESTサービスから返されたデータのコレクションにある最初のアイテムを調べます。たとえば、従業員のコレクションにある最初の従業員が営業担当者でなく、このため関連付けられたコミッション属性がない場合、従業員の候補データ・オブジェクトにはコミッション属性が含まれません。同様に、RESTサービスから返されたレスポンス・ペイロードが部門および従業員のマスター/ディテール構造である場合は、返された最初の部門に従業員が含まれていることを確認してください。そうでない場合、従業員は子データ・オブジェクトとして識別されません。ウィザードの後半のページでデータ・オブジェクトおよび属性を追加できます。ただし、可能な場合にはこの作業を回避することが最善です。

- パス・パラメータを中カッコで囲んで入力した場合、「次へ」をクリックすると、パス・パラメータのサンプル値を入力するためのダイアログ(「URIパラメータ値の入力」)が表示されます。図6-3では、employeesListリソースのパス・パラメータとして現在の部門IDを参照する{id}を指定したため、そのダイアログが表示されます。データを返すサンプル値を入力するようにしてください。たとえば、ID値が20の部門に従業員が含まれていない場合、従業員データ・オブジェクトが識別されることはありません。

- このページで指定するリソースは、アプリケーションに作成して使用する候補データ・オブジェクトを識別するだけです。CRUDアクションに使用する正確なリソースを指定するには、後のページを使用します。ここで入力する値は、ウィザードの後半にある「CRUDリソース」ページで各データ・オブジェクトの「すべてのリソースの検索」入力フィールドのデフォルト値として使用されるだけです。様々なリソースを使用してデータ・オブジェクトおよび「すべてのリソースの検索」を検出するという状況では、「すべてのリソースの検索」値は使用可能な属性のサブセットを返します。たとえば、従業員の「すべてのリソースの検索」の場合、リスト・ビューに属性(employeeId、firstNameおよびlastName)が返されます。エンド・ユーザーがリスト・ビューの従業員をクリックして詳細画面に移動すると、MAFアプリケーションは選択された従業員のすべての属性を返す正規従業員RESTリソースを起動して、追加の従業員属性をロードします。これにより、データ・セットの規模が大きく各データ・オブジェクトに多数の属性が含まれているときのパフォーマンスが最適化されます。このようなシナリオでは、「データ・オブジェクト・リソース」ウィザード・ページですべての従業員属性を識別する正規RESTリソースを指定します。

6.4.2 サンプルのペイロードを使用してデータ・オブジェクトを検出する方法

候補データ・オブジェクトおよび属性を作成するためのサンプルのペイロードを指定します。

このオプションは、次の場合に便利です。

- RESTサービスの起動によって返されたデータ・コレクションの最初のアイテムで一部の属性や子データが欠けている場合

- バックエンド開発チームが作業を続けているため、RESTリソースがまだ使用できない場合

- アプリケーションでデータの取得は行わず、新規データの作成(ポスト)のみを行う場合。つまり、解析するレスポンス・ペイロードを返すGETリソースがありません。この場合、新規データを作成するときにRESTコールで送信するすべての属性が含まれているサンプルのペイロードを指定します。新規データを作成するためのRESTコールの完全なシグネチャは、ウィザードの後で指定できます。

サンプルのペイロードを指定すると、入力したRESTリソースは起動されません。そのかわり、データ・オブジェクトのデフォルト名、およびウィザードの後半の「CRUDリソース」ページにある「すべてのリソースの検索」値のデフォルト値が導出されます。

図6-4は、「サンプル戻りペイロード」ダイアログを示しています。ここで、サンプルのペイロードを入力します。このダイアログを起動するには、「ペイロード」列内をクリックします。

図6-4 サンプルのペイロードを使用した候補データ・オブジェクトの検出

「OK」をクリックして「データ・オブジェクト・リソース」ダイアログに戻り、「次へ」をクリックしてウィザードの次ページに進みます。

6.4.3 RAMLファイルを使用してデータ・オブジェクトを検出する方法

RESTful API Modeling Language (RAML)ファイルを指定して、そのRAMLファイルでの説明に基づいて候補データ・オブジェクトおよび属性を作成します。

MAFでは、RAMLファイルの内容に基づいてデータ・オブジェクト、親子関係およびCRUDリソースをお薦めしています。つまり、ウィザードの後続のページでは、RAMLファイルの内容に基づいてデフォルト値が表示されます。

図6-5 RAMLファイルを使用した候補データ・オブジェクトの検出

RESTリソースを起動するために特定のHTTPヘッダーが必要である場合には、「ヘッダーの設定」ボタンを使用してダイアログを起動し、ここでヘッダーとしてキーと値のペアを入力します。たとえば、RESTサービスから返されるペイロードがXMLではなくJSON形式になるようにする場合は、「ヘッダーの設定」をクリックし、表示されたダイアログにキーとしてContent-Type、値としてapplication/jsonを入力します。

「フラット化されたネスト・オブジェクト」チェック・ボックスの使用は、「フラット化されたネスト・データ・オブジェクト・オプションに関する必知事項」を参照してください。

6.4.4 フラット化されたネスト・データ・オブジェクト・オプションに関する必知事項

JSONペイロードが次のようになっているときは、フラット化されたネスト・データ・オブジェクト・チェック・ボックスを選択します。ここでは、独自のデータ・オブジェクトとしてデフォルトでmanagerを作成します。フラット化されたネスト・データ・オブジェクト・チェック・ボックスを選択すると、departmentデータ・オブジェクト内にmanagerの2つの属性(nameおよびemail)が含まれます。

[
{
"departmentId" : 10,
"departmentName" :"Administration",
"locationId" : 1700,
"manager": {"name" :"Steven"
"email"  : "steven@oracle.com"
}
}
, ...
]

6.4.5 ADF BC REST記述を使用してデータ・オブジェクトを検出する方法

URIを指定して、ADFビジネス・コンポーネントによって公開されたRESTサービスを起動します。

Oracle ADFビジネス・コンポーネントでは、一連のビュー・オブジェクトを公開するアプリケーション・モジュールの上で機能する、REST APIの公開がサポートされています。/describeリソースは、このタイプのREST APIを作成すると自動的に含まれます。『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のアプリケーション・モジュールを使用したRESTful Webサービスの作成に関する項を参照してください。

/describeリソースを含むURIへのMAFアプリケーション・リクエストは、RESTリソースを記述するメタデータを返します。このウィザードでは、そのメタデータを調べ、この検査に基づいてウィザードの後半でデータ・オブジェクトおよびRESTリソース・ページを移入します。

図6-6 ADFビジネス・コンポーネント記述の使用による候補データ・オブジェクトの検出

6.5 クライアント・データ・モデルのデータ・オブジェクトの選択および永続化

MAFが識別する候補データ・オブジェクトのリストから、MAFアプリケーションのクライアント・データ・モデルで使用するデータ・オブジェクトを選択します。また、オフラインのときにMAFアプリケーションがデータ・オブジェクトのインスタンスにアクセスできるように、永続化するデータ・オブジェクトを選択します。

「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードのデータ・オブジェクトの選択ページおよび「データ・オブジェクト属性」ページでは、次のタスクを実行できます。

- データ・オブジェクトを選択および永続化します。「データ・オブジェクトを選択および永続化する方法」を参照してください。

- 新しいデータ・オブジェクトを作成します。「新しいデータ・オブジェクトを作成する方法」を参照してください。

- データ・オブジェクト属性を変更します。「データ・オブジェクト属性を変更する方法」を参照してください。

このタスクは、MAFアプリケーションにクライアント・データ・モデルを生成する一連のタスクのうちの1つです。「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」を参照してください。

6.5.1 データ・オブジェクトを選択および永続化する方法

含めるデータ・オブジェクトを選択し、不要なデータ・オブジェクトのチェック・ボックスの選択を解除します。MAFがクライアント・データ・モデルを作成するときに有効なJavaクラス名を生成するように、「クラス名」列のデータ・オブジェクトの値を変更します。

MAFアプリケーションがオフライン・モードでデータにアクセスできるように、データを永続化するデータ・オブジェクトごとに「永続」チェック・ボックスを選択します。これにより、MAFはデータ・オブジェクトのSQLiteデータベース表を作成し、ここにはデータを取得するために後で指定するRESTリソースに基づいて実行時にデータが移入されます。

注意:
データが揮発性であるなどの理由で、オフライン・アクセス用にデータ・オブジェクトを永続化しないようにする場合でも、引き続きオフライン・トランザクションにMAFクライアント・データ・モデルを使用できます。トランザクションは別個のDATA_SYNCH_ACTIONS表に格納され、同期はデータ・オブジェクト表から独立しています。

図6-7に示すように、データ・オブジェクトの選択ページに表示される候補データ・オブジェクトのリストの正確性は、候補データ・オブジェクトの検出に使用する方法によって異なります。たとえば、RAMLファイルに基づいて提案されるデータ・オブジェクトのリストは通常、次のようなサンプルのRESTリソースから返されるリストよりも正確です。

[
{
"departmentId": 10,
"departmentName": "Administration",
"locationId": 1700,
"_relationships": [
{
"_link": {
"href": "http://localhost:7101/HRRest/persistence/v1.0/Model-1/entity/Department/10/employees1",
"rel": "employees1"
}
},
{
"_link": {
"href": "http://localhost:7101/HRRest/persistence/v1.0/Model-1/entity/Department/10/employeesList1",
"rel": "employeesList1"
}
}
],
"employeesList1": [
{
"_link": {
"href": "http://localhost:7101/HRRest/persistence/v1.0/Model-1/entity/Employee/200",
"method": "GET",
"rel": "self"
}
}
]
},

図6-7に示すように、前述のサンプルのRESTリソースはペイロードに含まれているリンク情報の候補データ・オブジェクトを示しています。データ・モデルにリンクに関する情報を含める可能性はほとんどないため、これらの候補データ・オブジェクトでは「選択」列のチェック・ボックスの選択を解除します。また、有効なJavaクラス名が表示されるように、「クラス名」の値を編集します。

図6-7 RESTリソースから取得された候補データ・オブジェクト

6.5.2 新しいデータ・オブジェクトを作成する方法

モバイル・デバイスにのみ存在し、かつMAFアプリケーションが接続するREST Webサービスによってデータが移入されないデータ・オブジェクトを作成します。

データ・オブジェクトの選択ページの「追加」ボタンをクリックして、データ・モデルに新しいデータ・オブジェクトを追加します。デフォルトで生成される名前(NewDataObject)を一意の有効なJavaクラスに編集します。

MAFは、追加するデータ・オブジェクトごとにSQLiteデータベースにデータベース表を作成します。これらのデータベース表にデータを移入するには、ウィザードを完了するとMAFがデータ・オブジェクト用に生成するサービス・オブジェクトからCRUD操作を使用します。

6.5.3 データ・オブジェクト属性を変更する方法

MAFアプリケーションのクライアント・データ・モデルに含めるために選択したデータ・オブジェクトの属性を選択または変更します。

必要に応じて各属性のキー、必須、属性名、ペイロード内の名前、Javaタイプおよびデータベース列のタイプを設定または変更できます。機密データを保持する属性の場合、永続化しないようにすることもできます。これにより、アプリケーションがオフライン・モードで実行されるときには、属性値がnullになります。

キー属性が一意であることが重要です。永続性ランタイムは、選択したキー属性に基づいてデータ・オブジェクト・キャッシュを使用します。同じキーのデータ・オブジェクト・インスタンスが複数ある場合、それらはすべて同じデータベース表の行に書き込まれます。このため、1つのインスタンス(最後に処理されたインスタンスの属性を保持)のみがMAFアプリケーションのUIに表示されます。つまり、MAFではそれが同じインスタンスとみなされるため、すべてのインスタンスが1つにマージされます。子データ・オブジェクトの場合、親への参照属性がキーの一部になる場合があります。ペイロードにこのような参照属性が含まれていない場合は、それらをウィザードの「親子アクセサ」ページで作成できます。次に、このページ(「データ・オブジェクト属性」)に戻り、キー属性として親移入属性を選択します。

サンプルのリソースを使用して候補データ・オブジェクトを特定するときは、一般に属性のJavaタイプがjava.lang.Stringと表示されるため、通常それらを変更する必要があります。属性によっては、ペイロード値を二重引用符で囲まないと、java.math.BigDecimalと表示されることがあります。クラス・ピッカーを使用してJavaタイプを変更でき、選択したJavaタイプに基づいてデータベース列のタイプが自動的に更新されます。通常のタイプ変更では、数値属性をStringまたはBigDecimalからLongまたはIntegerに変更します。日付属性をjava.util.Dateに設定し、日付書式をJSONペイロードで使用するように指定する必要があります(たとえば、yyyy-MM-dd'T'HH:mm:ssZ)。ウィザードの後でアクセスする「CRUDリソース」ページの「ペイロード日付書式」フィールドに日付書式を指定します。

RAMLファイルまたはADF BC REST記述を使用してデータ・オブジェクトを検出した場合は、通常デフォルトの属性タイプが適切であり、変更する必要はありません。

注意:
「データ・オブジェクト」ドロップダウン・リストから各データ・オブジェクトを選択して、オブジェクトの属性に必要な変更を加えます。

図6-8 データ・オブジェクト属性の変更

6.6 データ・オブジェクトの親子関係の指定

マスター/ディテール画面をレンダリングするためのMAFアプリケーションのUIが必要になるデータ・オブジェクトの親子関係を指定します。

図6-9は、このような関係を定義している「親子アクセサ」ページを示しています。部門と部門の従業員との間に存在するような関係を設定するときは、このダイアログを使用します。

図6-9 「親子アクセサ」ページ

同じペイロードで親および子データ・オブジェクトを返すRESTリソースを指定し、両方のデータ・オブジェクトを選択したときは、「アクセサ」ドロップダウン・リストに親子関係が移入されます。これは、RAMLファイルまたはADF BC REST記述を使用してRESTリソースにアクセスした場合にも発生します。ただし、別個のRESTコールで子データ・オブジェクトを取得し、その子オブジェクトが親データ・オブジェクトのペイロードに含まれていない場合、「アクセサ」ドロップダウン・リストは空になります。このシナリオが発生した場合には、「データ・オブジェクトの親子関係を指定する方法」の説明に従って、「親子アクセサ」ページに親子関係を手動で定義します。

MAFが「親子アクセサ」ページに自動的に値を入力したのか、親子関係を手動で定義したのかに関係なく、親子関係ごとに属性マッピングを指定する必要があります。これを行うと、アプリケーションがオフライン・モードで実行されているときにMAFが1対多関係または1対1関係を復元します。データベースの観点から、基になる親と子のデータ・オブジェクト表間に外部キー関係を設定します。図6-9は、departmentIDおよびdepartmentDepartmentIdを指定した例であり、「追加」ボタンを使用して「親子アクセサ」ページの下部にあるリストに両方の属性を追加しています。

子データ・オブジェクトにレスポンス・ペイロードにある外部キー属性が含まれている場合は、「親属性の選択」リストで親キー属性を選択し、「子属性の選択」リストで子データ・オブジェクト外部キー属性を選択し、「追加」をクリックして属性マッピングを追加します。ただし、この外部キー属性は、ペイロードに含まれなかったために子データ・オブジェクトに存在しない場合があります。これは通常、子データ・オブジェクトが親データ・オブジェクト・ペイロード内に入れ子になるために発生します。このシナリオでは、値がペイロードの階層的性質によって推定されるため、外部キー属性を含める必要はありません。MAFでは、オフライン・モード用に引き続き属性マッピングが必要であるため、一致する子属性を選択しなくても、親属性を選択し、「追加」ボタンをクリックできます。前述の図6-9は、このようなユースケースを示しており、「親属性の選択」リストでdepartmentIDを選択し、「追加」ボタンをクリックしています。これで、departmentDepartmentId属性が従業員データ・オブジェクト(および基礎となるデータベース表の列)に追加されます。この属性は部門の従業員詳細を問い合せるときにはRESTペイロードに含まれませんが、実行時のコードが従業員詳細の取得対象である部門インスタンスに基づいてこの属性(および基礎となる列値)を移入します。

ヒント:
この親移入属性の名前は、選択した親属性名が接尾辞として付いたデータ・オブジェクトの名前です。これらの属性名をクリーンな属性名になるように変更できます。前述の例では、「戻る」ボタンをクリックしてこれを行い、部門データ・オブジェクトを選択し、departmentDepartmentId属性の名前をdepartmentIdに変更しています。

このタスクは、「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」で説明しているように、MAFアプリケーションにクライアント・データ・モデルを生成する一連のタスクの1つです。

6.6.1 データ・オブジェクトの親子関係を指定する方法

「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードから「親子アクセサ」ページにアクセスします。

データ・オブジェクトの親子関係を指定するには:

1. 「親子アクセサ」ページで、図6-10に示したプラス・アイコンをクリックし、表示されたダイアログのフィールドに値を入力します。
たとえば、図6-10に示したダイアログでは、ある部門のすべての従業員を取得する親子アクセサを定義しています。

図6-10 「親子アクセサ」ページ

注意:
MAFは、「データ・オブジェクト・リソース」ページで候補データ・オブジェクトの特定に使用したリソースを「子アクセサ・リソース」フィールドに移入します。この例では、これは/entity/Department/{id}/employeesList1です。「子アクセサ属性」フィールドの値は、employeesに設定されています。ウィザードが完了すると、getEmployeesメソッドがdepartmentデータ・オブジェクトに生成され、従業員コレクションが後で作成するデータ・コントロールの部門ノードの下に表示されます。

6.7 CRUD RESTリソースの定義

CRUDアクションを定義すると、MAFアプリケーションのエンド・ユーザーはMAFアプリケーションが接続先のRESTサービスから取得したデータ・オブジェクトを編集できるようになります。

このタスクは、「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」で説明しているように、MAFアプリケーションにクライアント・データ・モデルを生成する一連のタスクの1つです。

MAFには「CRUDリソース」ページが用意されており、ここではMAFアプリケーションのクライアント・データ・モデルで使用するために取得したデータ・オブジェクトに対してどのアクションを実行するかを指定します。図6-11は、Departmentsデータ・オブジェクトに対して作成、更新、削除など数多くの操作を指定しているページを示しています。

図6-11 クライアント・データ・モデルのCRUD RESTリソースの定義

MAFは、以前に入力した値および候補データ・オブジェクトを検出するために使用した方法に応じて、「CRUDリソース」ページに値を移入します。たとえば、RAMLファイルまたはADF BC REST記述を使用した場合、次のように、MAFはRESTのベスト・プラクティス規則に基づいてページに値を移入します。

- POSTリソースがリソースを作成します。

- PUTリソースまたはPATCHリソースがリソースを更新またはマージします。

- DELETEリソースがリソースを削除します。

サンプルのリソースURLを使用してデータ・オブジェクトを検出した場合、「すべてのリソースの検索」はデフォルトでサンプルのリソースに設定されます。通常はこのデフォルトが適切ですが、RESTサービスがベスト・プラクティスに従っていない場合には、リソースやHTTPメソッドの値の変更が必要になることがあります。

「データ・オブジェクト」ドロップダウン・リストから各データ・オブジェクトを選択し、次のように入力フィールドに値を入力します。

- リソースのクイック検索: 大規模なデータ・セットに有用です。大規模なデータ・セットの場合、アプリケーションがメモリーを使い果たしてしまう可能性があるため、通常はすべてのインスタンスを返す「すべてのリソースの検索」を実行しないようにします。そのような状況では、検索基準に一致するインスタンスのみを返すクイック検索機能をユーザー・インタフェースに定義します。小規模なデータ・セットの場合は、「すべてのリソースの検索」を使用して一度にすべてのインスタンスを返します。オンデバイスSQLiteデータベースに対して直接クイック検索フィルタを実行します。Webサービスが起動されないため、パフォーマンスは高速です。

- 正規リソース: データ・オブジェクトに数多くの属性があり、リストから特定のデータ・オブジェクト・インスタンスを選択したときにのみそのすべての属性を取り込むようにする場合は、正規リソースの値を指定します。

- 正規トリガー属性: 「正規トリガー属性」を指定した場合、MAFはgetterメソッドで属性の値を取得するときに正規RESTリソースを自動的に起動するコードをデータ・オブジェクト・クラスに生成します。
たとえば、Departmentデータ・オブジェクトの「すべてのリソースの検索」を選択するとリスト・ページに表示される部門IDと名前のリストが返され、departmentを選択すると詳細ページに移動してすべての部門属性が表示されるようにする場合、「正規トリガー属性」をlocationIdに設定できます。詳細ページに移動すると、getLocationIdメソッドが起動します。MAFは、正規RESTリソースを自動的に起動するためのコードをgetLocationIdメソッド内に生成済です。

- CRUDリソース(「リソースの作成」や「リソースの更新」など): このページで少なくとも1つのRESTリソースが指定されたデータ・オブジェクトごとに生成されるサービス・オブジェクトには、save[DataObjectName]メソッドが含まれています。save[DataObjectName]メソッドを、たとえば「データ・コントロール」パネルからドラッグ・アンド・ドロップすることで起動すると、MAFはデータ・オブジェクト状態に基づいて、コールするリソース(Create、UpdateまたはMerge)を決定します。MAFは、次のように、その決定を下します。

- データ・オブジェクト状態がnewの場合、MAFはCreateリソースをコールします。Createリソースが指定されていない場合、MAFはMergeリソースをコールします。いずれのリソースも指定されていない場合、MAFアプリケーションはRESTコールを行いません。

- データ・オブジェクト状態がnewでない場合、MAFはMergeリソースをコールします。Mergeリソースが指定されていない場合、MAFはUpdateリソースをコールします。いずれのリソースも指定されていない場合、MAFアプリケーションはRESTコールを行いません。データ・コントロールCreate操作で新しいデータ・オブジェクトを作成すると、データ・オブジェクト状態はNewに自動的に設定されます。oracle.maf.api.cdm.persistence.model.Entityのサブクラスを使用してプログラムにより新しいデータ・オブジェクト・インスタンスを作成する場合は、setIsNewEntity(true)をコールします。

- ソート順序: 属性名のカンマ区切りリストを定義します。属性名に接頭辞としてdescを付けると、属性を降順にすることができます。ここに指定したソート順序がユーザー・インタフェースでのデフォルトの順序になることに注意してください。永続性実行時コードでは、ソート順序を実行時に変更するためのUIコントロールを簡単に追加できます。

- ペイロード日付書式: ペイロード内の日付属性文字列値をjava.util.Dateインスタンスに変換するためのJava日付パターンを指定します。

6.8 CRUD RESTリソース詳細の指定

MAFアプリケーションに定義した様々なRESTリソースの問合せパラメータおよびパス・パラメータとそれらの値などリソース詳細を指定します。

MAFにはCRUDリソース詳細ページが用意されており、ここでリソース詳細を指定します。このウィザード・ページでは、フィールドにデフォルト値を移入します。これらのデフォルトが特定のアプリケーションで意味のあるものになっているかどうかをチェックするようにすると効果的です。図6-12は、このページを示しています。「リソース」ドロップダウンから、レビューまたはカスタマイズする追加のリソースを選択します。また、「カスタム・リソースの定義」の説明に従って、「リソース」ドロップダウン・メニューの横にあるプラス・アイコンをクリックして、カスタム・リソースを追加することもできます。

図6-12 CRUD RESTリソース詳細の指定

このページのオプションを理解するには、GET (読取り)リソースとGET以外(書込み)リソースを区別します。フィールドの中には、ある種のリソースにのみ適用されるものや、リソースのタイプに応じて意味が異なるものがあります。

「リソースの詳細」ページでは、次のタスクを実行できます。

- 「GET (読取り)リソース詳細を指定する方法」の説明に従って、GET (読取り)リソース詳細を指定します。

- 「GET以外(書込み)リソース詳細を指定する方法」の説明に従って、GET以外(書込み)リソース詳細を指定します。

- 「カスタム・リソースを追加する方法」の説明に従って、カスタム・リソースを追加します。

- 「問合せパラメータおよびパス・パラメータを指定する方法」の説明に従って、問合せパラメータおよびパス・パラメータを指定します。

- 「HTTPヘッダー・パラメータを追加する方法」の説明に従って、HTTPヘッダー・パラメータを追加します。

このタスクは、「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」で説明しているように、MAFアプリケーションにクライアント・データ・モデルを生成する一連のタスクの1つです。

6.8.1 GET (読取り)リソース詳細を指定する方法

GETリソース詳細を指定するには、次のメニュー・オプションを構成します。

- このRESTリソースを実行する前に、SQLite DB内のローカル行を削除しますか。
「ローカル行の削除」チェック・ボックスを選択し、GETリソースを「すべてのリソースの検索」として使用している場合、RESTコールの実行後かつRESTレスポンスの処理前に、対応するデータ・オブジェクト用に作成された表のすべての行が削除されます。これは、GETレスポンス・ペイロードに含まれなくなる廃止された行が単に以前にダウンロードされたという理由でアプリケーションに表示されたままにならないようにする場合に便利です。「ローカル行の削除」チェック・ボックスを選択し、子データ・オブジェクトを取得するために「親子アクセサ」ダイアログでGETリソースを定義していた場合、RESTコールの実行直前にそのすべての子行が削除されます。

- ペイロード・リスト要素名
「ペイロード・リスト要素名」は、レスポンス・ペイロード内のリソース・データ・オブジェクトを表すJSONオブジェクトの実際の配列を探す方法をMAFに指示します。たとえば、レスポンス・ペイロードが次のようになっているとします。

{"departmentList":[{"departmentId":10, "departmentName": "Accounting", "locationId": 1400, "managerId": 103}, {"departmentId":20, "departmentName":
"Marketing", "locationId": 1400, "managerId": 102} ]}

この場合、「ペイロード・リスト要素名」をdepartmentListに設定する必要があります。departmentListは、トップレベルのJSONオブジェクト属性である必要はないことに注意してください。MAFは、この属性名のオブジェクトを見つけるまで、レスポンス・オブジェクト・ツリーを再帰的に移動します。レスポンス・ペイロードが直接必要な配列で始まる場合には、このフィールドを空白のままにすることができます。

- ペイロード行要素名
「ペイロード行要素名」フィールドを使用すると、特定の配列インスタンス内で適切なJSONオブジェクトを探す方法をMAFに指示できます。たとえば、レスポンス・ペイロードが次のようになっているとします。

{"departmentList":["department":{"departmentId":10, "departmentName": "Accounting", "locationId": 1400, "managerId": 103}}, "department":{"departmentId":20,
"departmentName": "Marketing", "locationId": 1400, "managerId": 102}) ]}

「ペイロード行要素名」をdepartmentに設定してください。MAFが解析する実際のJSONオブジェクトに到達するために深く入れ子になったオブジェクト・ツリーを移動する必要がある場合、このフィールドではドット表記を使用します。たとえば、departmentTopObject.departmentです

6.8.2 GET以外(書込み)リソース詳細を指定する方法

GET以外リソース詳細を指定するには、次のメニュー・オプションを構成します。

- シリアライズ・データ・オブジェクトをペイロードとして送信
「シリアライズ・データ・オブジェクトをペイロードとして送信」チェック・ボックスは通常、PUT、POST、PATCHのいずれかのリクエストを行うときに選択します。サーバー側での削除の実装方法によっては、DELETEリクエストでも選択する場合があります。このチェック・ボックスを選択すると、「データ・オブジェクト属性を変更する方法」で説明しているように、MAFは「データ・オブジェクト属性」ページで「ペイロード内の名前」プロパティが設定されているデータ・オブジェクト属性ごとにキーと値のペアでリクエスト・ペイロードを作成します。

{"departmentId":10, "departmentName": "Accounting", "locationId": 1400, "managerId": 103}

- 配列として送信
「配列として送信」チェック・ボックスは、次の例に示すように、キーと値のペアを保持するJSONオブジェクトをカッコで囲む場合に選択します。「シリアライズ・データ・オブジェクトをペイロードとして送信」チェック・ボックスを選択するまで、このチェック・ボックスは無効になっています。

[{"departmentId":10, "departmentName": "Accounting", "locationId": 1400, "managerId": 103}]

- ペイロード行要素名
キーと値のペアを持つ実際のJSONオブジェクトを別のオブジェクト内に入れ子にするようにMAFに指示するために使用します。たとえば、リクエスト・ペイロードが次のようになっているとします。

{"department":{"departmentId":10, "departmentName": "Accounting", "locationId": 1400, "managerId": 103}}

この場合、「ペイロード行要素名」をdepartmentに設定する必要があります。

GETリソースとは異なるペイロード属性名がリクエスト・ペイロードで必要になる場合は、これらの書込み固有のペイロード属性名をここに指定することはできません。RestJSONPersistenceManagerをサブクラス化し、getPayloadKeyValuePairsメソッドをオーバーライドする独自のリモート永続性マネージャを作成する必要があります。カスタムのリモート永続性マネージャは、ウィザードの次ページで登録することも、後で登録することもできます。「MAFアプリケーションでのクライアント・データ・モデルの編集」を参照してください。

- 除外する属性
リクエスト・ペイロードとして使用されるJSONオブジェクトにシリアライズしない属性名のカンマ区切りリストを指定します。たとえば、departmentIdを指定した場合、次のペイロードはそれをJSONオブジェクトへのシリアライズから除外します。

{"departmentName": "Accounting", "locationId": 1400, "managerId": 103}

「データ・オブジェクト属性」ページで「ペイロード内の名前」フィールドの値を無効にすることで同じことを実現できますが、その場合GETリクエストでdepartmentIdも無視されることになり、これは通常望ましいことではありません。このフィールドでは、データ・オブジェクト属性のペイロード名ではなく、これらの属性の名前を使用する必要があります。

6.8.3 カスタム・リソースを追加する方法

カスタム・リソースは、「CRUDリソース」ページで指定した検索、作成、更新、削除のいずれのアクションにもマップしない独自のRESTコールです。

「リソースの詳細」ページでカスタム・リソースを追加できます。図6-13に示すように、緑のプラス・アイコンをクリックして「新規カスタム・リソース」ダイアログを起動し、ここでカスタム・リソースを定義できます。

図6-13 カスタム・リソースの追加

MAFがデータ・オブジェクト用に生成するサービス・クラスでは、「名前」フィールドに指定した名前でメソッドが追加されます。このメソッドをコールすると、RESTリソースが起動します。MAFクライアント・データ・モデルのデータ同期メカニズムにはカスタム・メソッドも含まれているため、オフライン・モードでカスタム・メソッドをコールした場合、それは保留中の同期アクションとして登録され、RESTコールはMAFアプリケーションが再度オンラインになったときに実行されます。

6.8.4 問合せパラメータおよびパス・パラメータを指定する方法

「CRUDリソース」ページまたは「親子アクセサ」ダイアログのRESTリソースに指定したカッコで囲まれたパス・パラメータが、デフォルトで「パラメータ」リストに表示されます。

追加の問合せパラメータを追加するには、「追加」ボタンを使用します。

図6-14 問合せパラメータおよびパス・パラメータの指定

MAFアプリケーションは、RESTリソースを実行するときに、選択された値プロバイダに基づいてリソース問合せパラメータ値およびパス・パラメータ値を自動的に移入します。

- DataObjectAttribute: データ・オブジェクト属性の値をパラメータに移入します。この値プロバイダを使用するときは、「データ・オブジェクト属性」ドロップダウン・リストから値を選択する必要があります。属性がドロップダウン・リストに表示されるデータ・オブジェクトは、リソースの使用状況によって決まります。たとえば、上のリソースは部門内の従業員を返すため、従業員リストのコンテキストを設定するための属性を部門データ・オブジェクトから選択するものと想定しています。

- SerializedDataObject: 保持する必要があるデータをリクエスト本文ではなく問合せパラメータで送信する場合は、この設定を選択します。この値プロバイダの場合、他の列は空のままにしてください。

- LiteralValue: 「値」列に指定されているリテラル値をパラメータに移入します。

- ELExpression: EL式の評価によって取得された値をパラメータに移入します。「値」列にEL式を指定します。EL式は任意のスコープ(applicationScope、pageFlowScope、viewScope、deviceScope、preferenceScope)で使用できますが、式をRESTサービス・コールの実行コンテキストで有効にすることは自己責任です。オフライン・モードでトランザクションを作成した場合、RESTサービスは後で起動され、EL式コンテキストはデータ同期をトリガーするタスク・フローおよびページによって決定されることに注意してください。

- SearchValue: ユーザー・インタフェースで入力されたクイック検索値の値をパラメータに移入します。通常は、「CRUD RESTリソースの定義」で説明するように、「CRUDリソース」ページに定義している「リソースのクイック検索」でのみこの値プロバイダを使用します。

6.8.5 HTTPヘッダー・パラメータを追加する方法

オブジェクト・リソースの検出ページに指定したHTTPヘッダーは、デフォルトではこれまでに指定したすべてのリソースに適用されます。

ヘッダーを削除する場合やあるリソースに固有の別のヘッダーを追加する場合は、「ヘッダーの設定」ボタンをクリックしてダイアログを起動します。ここでヘッダーのキーと値のペアを入力するか、HTTPヘッダー・パラメータの変更が必要な場合には変更します。

図6-15 HTTPヘッダー・パラメータの設定

6.9 クライアント・データ・モデルのランタイム・オプションの設定

このウィザードの完了時に生成するMAFアプリケーションのランタイム・オプションを設定します。

このタスクは、「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」で説明しているように、MAFアプリケーションにクライアント・データ・モデルを生成する一連のタスクの1つです。

図6-16は、生成されたMAFアプリケーションの実行時の動作を決定する「ランタイム・オプション」ページを示しています。

図6-16 MAFアプリケーションのランタイム・オプションの設定

図6-16に表示されるフィールドは、次のように構成します。

- バックグラウンドでのリモート読取り: 選択した場合、データ・オブジェクトに対して指定されているGETリクエスト(通常、Find All、Find、Canonicalのいずれかのリソース)がバックグラウンド・スレッドで実行されます。MAFアプリケーションのパフォーマンスに対するエンド・ユーザーの認識が高まるため、このチェック・ボックスを選択することをお薦めします。MAFは、まずSQLiteデータベースに問い合せて、これらの結果を画面にただちに表示します(「データ・オブジェクトを選択および永続化する方法」で説明しているように、データ・オブジェクトを永続化したものとします)。RESTコールは、ユーザー・インタフェースをブロックすることなくバックグラウンドで行われます。MAFアプリケーションは、RESTレスポンスを受信すると、ユーザー・インタフェースを自動的に更新します。

- バックグラウンドでのリモート書込み: 選択した場合、このデータ・オブジェクトに対して指定されているGET以外リクエスト(通常、Create、Update、Mergeのいずれかのリソース)がバックグラウンド・スレッドで実行されます。MAFアプリケーションのパフォーマンスに対するエンド・ユーザーの認識が高まるため、通常このチェック・ボックスは選択したままにします。RESTコールをたとえば「保存」ボタンによってトリガーした後も、エンド・ユーザーはアプリケーションを引き続き使用できます。RESTコールが存続するかぎり、ユーザー・インタフェースはブロックされません。また、RESTレスポンスに含まれている属性の中にサーバー側で値が更新されたものがある場合にも、MAFアプリケーションはユーザー・インタフェースを自動的にリフレッシュします。

- 自動問合せ: 選択した場合、MAFはデータ・オブジェクトのサービス・オブジェクト・クラスが初期化されるときに、「すべてのリソースの検索」によって指定されたすべての行やコール・リソースをオンデバイス・データベースに自動的に問い合せます。これは、サービス・オブジェクト・クラス用に作成したBeanデータ・コントロールを使用してAMXページを構築するときに便利です。Beanデータ・コントロールは、たとえばリスト・ビューまたはフォーム・ビューを作成するために、AMXページにドラッグ・アンド・ドロップできるコレクション要素を公開します。自動問合せを選択している場合、このコレクション要素はすべてのデータ・オブジェクトを返します。初期状態では、「すべてのリソースの検索」の実行完了後に、SQLiteデータベースに存在するものを返し、リモート・コレクションでリフレッシュされます。このチェック・ボックスの選択を解除した場合は、AMXページに移動する前に、タスク・フローでfinderメソッドを実行する必要があります。そうしないと、AMXページにはデータが表示されません。

- 「主キーの生成」: 選択した場合、新しいデータ・オブジェクトがSQLiteデータベースに挿入されたものの、主キー属性値がまだnullのときに、MAFアプリケーションは主キーを自動的に生成します。この機能は、主キー属性が数値属性であるときにのみ動作します。MAFは、現在の最大値をSQLiteデータベースに問い合せて、この値を1だけ増加します。

- オフライン・トランザクションの有効化: 選択した場合、MAFアプリケーションがオフラインのときに、書込みRESTコールを起動できます。MAFは、トランザクション(作成、更新、削除またはカスタムのアクション)を保留中のデータ同期アクションとして登録します。MAFアプリケーションがオンラインになると、MAFはこれらのアクションを同期し、関連付けられたRESTコールを実行します。MAFアプリケーションがオンラインで、RESTリソースを起動するときにサーバーが使用できないか、またはサーバーが何かエラーをスローしたためにRESTコールが失敗した場合、トランザクションも保留中の同期アクションとして登録されることに注意してください。MAFは、次回MAFアプリケーションがRESTコールを行うときに実行を再試行します。このチェック・ボックスの選択を解除した場合は、MAFアプリケーションがオフラインか、またはRESTコールが失敗したときに、エラー・メッセージがエンド・ユーザーに表示されます。

- Webサービス・エラーの表示: 選択した場合、RESTコールが失敗すると、エラー・メッセージのポップアップがユーザー・インタフェースに表示されます。これは、エラーを参照できるため、開発時に有用な設定です。本番にMAFアプリケーションを公開するときは、このチェック・ボックスの選択を解除することをお薦めします。通常は、RESTコールの失敗に関する技術的詳細をエンド・ユーザーに表示しないようにします。

- リモート永続性マネージャ: 独自のリモート永続性マネージャを登録します。これは、MAFリモート永続性マネージャのデフォルトの動作を拡張する場合に便利です。

- 「ローカル永続性マネージャ」: 独自のローカル永続性マネージャを登録します。これは、MAFローカル永続性マネージャのデフォルトの動作を拡張する場合に便利です。

6.10 クライアント・データ・モデルの生成

MAFがクライアント・データ・モデル用に生成するデータ・オブジェクトのプロジェクト名およびパッケージ名を指定します。

このタスクは、「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」で説明しているように、MAFアプリケーションにクライアント・データ・モデルを生成する一連のタスクの1つです。

図6-17は、クライアント・データ・モデル内のオブジェクトの場所およびパッケージ名を決定する「ジェネレータ設定」ページを示しています。

このページのフィールドは、次のように構成します。

- プロジェクトへのクラスの追加: Javaクラスを生成するアプリケーション内のプロジェクトを選択します。MAFでは、デフォルトのApplicationControllerプロジェクトの使用をお薦めしています。これにより、アプリケーション・スコープのマネージドBeanおよびアプリケーション・ライフサイクル・メソッドのクラスを使用できます。また、これにより、複数のアプリケーション機能で同じデータ・オブジェクトを使用したときに、クラス・ローダーの問題が回避されます。各MAFアプリケーション機能はそれぞれ独自のクラス・ローダーを備えていますが、すべてがApplicationControllerプロジェクトの親クラス・ローダーを共有します。

- データ・オブジェクト・パッケージ: データ・オブジェクトごとに生成されるJavaクラスで使用するJavaパッケージ名を指定します。

- サービス・オブジェクト・パッケージ: サービス・オブジェクトごとに生成されるJavaクラスで使用するJavaパッケージ。データ・オブジェクトに少なくとも1つのRESTリソースが関連付けられている場合に、このようなクラスが生成されます。

- データ・オブジェクト・クラスの上書き: 選択した場合、MAFは既存のデータ・オブジェクト・クラスを上書きします。以前の生成後にこれらのクラスにカスタム・コードを追加した場合は、このコードが失われます。

- サービス・オブジェクト・クラスの上書き: 選択した場合、MAFは既存のサービス・オブジェクト・クラスを上書きします。以前の生成後にこれらのクラスにカスタム・コードを追加した場合は、このコードが失われます。ペイロード構造が変更されてもサービス・オブジェクト・クラスは通常変更する必要がないため、このチェック・ボックスはデフォルトでは選択が解除されています。また、このクラスには、生成後に追加したカスタム・コードが含まれる可能性が最も高くなります。

図6-17 クライアント・データ・モデルの生成

6.11 MAFアプリケーションでのクライアント・データ・モデルの編集

MAFアプリケーションに以前に生成したクライアント・データ・モデルを変更できるウィザードの起動方法について説明します。

MAFは、MAFアプリケーションでのクライアント・データ・モデルの反復開発をサポートしています。クライアント・データ・モデルは、最初に作成した後で拡張および改良できます。次の2つのオプションのいずれかを使用します。

- RESTサービスからのクライアント・データ・モデルウィザードを再実行して、新しいデータ・オブジェクトを検出するか、または既存のデータ・オブジェクトを編集します。このウィザードを再起動して、新しいデータ・オブジェクトを検出できます。既存のデータ・オブジェクトを変更しない場合は、関連する「選択」チェック・ボックスの選択を解除します。そうすると、最後のジェネレータ設定ウィザード・ページでの設定に関係なく、既存のデータ・オブジェクトが後続のウィザード・ページに表示されず、これらのデータ・オブジェクト用にJavaクラスが再生成されなくなります。

- 図6-18に示した永続性マッピングの編集ウィザードを実行します。このウィザードは、クライアント・データ・モデルが含まれているプロジェクトを右クリックすると表示される永続性マッピングの編集コンテキスト・メニュー・エントリから起動します。
「永続性マッピングの編集」ウィザードには、RESTサービスに接続するためのページや新しいデータ・オブジェクトを検出するためのページを除き、RESTサービスからのクライアント・データ・モデルウィザードと同じページが表示されます。このため、このウィザードは通常、既存のデータ・オブジェクトを編集するために使用します。ただし、RESTサービスに対するデータの読取りや書込みにRESTコールを必要としないデータ・オブジェクトを作成してSQLiteデータベースに格納する場合にも使用できます。

図6-18 クライアント・データ・モデルの編集

6.12 MAFクライアント・データ・モデルDBPersistenceManagerの使用によるSQLiteデータベースへのアクセス

MAFクライアント・データ・モデルでは、MAFアプリケーション内でオンデバイスSQLiteデータベースにアクセスするためのAPI (oracle.maf.api.cdm.persistence.manager.DBPersistenceManager)が提供されます。

MAFクライアント・データ・モデルでは、SQLiteデータベースとのすべての相互作用がDBPersistenceManagerに委任されます。データベースへの接続方法で示されている下位レベルJDBC文を記述するかわりに、DBPersistenceManagerを使用します。クライアント・データ・モデルでのDBPersistenceManagerの役割の詳細は、「MAFアプリケーションのクライアント・データ・モデルの概要」を参照してください。DBPersistenceManager、およびそれが公開するメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

次の例では、DBPersistenceManagerのインスタンスを取得し、データ・オブジェクトに対するいくつかの検索操作およびその他の操作(挿入、更新および削除)を実行する方法を示します。次の例で示すコンストラクタの使用だけでなく、サービス・オブジェクトのインスタンスからgetLocalPersistenceManager()を呼び出すことでDBPersistenceManagerのインスタンスを取得することもできます。クライアント・データ・モデルのランタイム・オプションの設定で説明されている、クライアント・データ・モデル・ウィザードの「ランタイム・オプション」ページでカスタム・ローカル永続性マネージャを登録した場合は、これにより、DBPersistenceManagerのインスタンス、またはサブクラスが返されます。

/* Use the default constructor to get an instance of DBPersistenceManager.*/
DBPersistenceManager pm = new DBPersistenceManager();

/* findAll takes a class or class name as an argument and returns a list of all data objects.*/
List<Department> departments = pm.findAll(Department.class);

/* The overloaded find method returns a filtered list of data objects.
*
* There are various ways to specify your filter conditions, as demonstrated by the following examples.
*
* A quick search method that returns all employees where at least one of the String
* attributes (firstName, lastName, emailAddress, and so on) starts with "king" (case insensitive).
* This translates to use of the SQL LIKE operator where the search value is suffixed with %. */
List<Employee> emps = pm.find(Employee.class, "king");

/* A search method which allows you to specify the search attributes. It returns all employees where at least
* one of the attributes passed in as list in the third argument starts with "king" (case insensitive). */
List<String> searchAttrs = new ArrayList<String>();
searchAttrs.add("firstName");
searchAttrs.add("lastName");
List<Employee> emps = pm.find(Employee.class, "king", searchAttrs);

/* This is a search method which allows you to specify separate values for each
* attribute you want to search on, it will return all employees where the firstName
* equals "Steven" and the lastName equals "King". The query is case sensitive.
*/
Map<String, String> searchAttrs = new HashMap<String, String>();
searchAttrs.put("firstName", "Steven");
searchAttrs.put("lastName", "King");
List<Employee> emps = pm.find(Employee.class, searchAttrs);

/* The findByKey method returns one data object based on its primary key.
* It first checks the data object cache. If the department with id 10 does not exist in the cache, it queries
* the database. If you do not want to check the cache, add a third boolean argument checkEntityCache, as demonstrated
* by the second example
*/
Department dep = (Department) pm.findByKey(Department.class, new Object[] { 10 });
Department dep = (Department) pm.findByKey(Department.class, new Object[] { 10 }, false);

/* Insert, updates and remove a row for a data object instance.
* MAF automatically commits the change if the second argument is true. If false, you
* need to call pm.commit() later.
* MAF generates the primary key attribute for you when calling insertEntity if you selected
* the Generate Primary Key checkbox in the Runtime Options page of the MAF client data model wizard.
*/
pm.insertEntity(department, true);
pm.updateEntity(department, true);
pm.removeEntity(department, true);

カスタムSQL文の使用

前述のデータ・オブジェクトベースのAPIで、必要なSQL文を実行するためのオプションが提供されない場合は、カスタムSQL文を指定できます。SQL SELECT文とSQL DML文とは区別します。

SELECT文の結果をデータ・オブジェクトまたはデータ・オブジェクト・リストに変換する必要がある場合は、次の例で示すようにコードを使用します。

DBPersistenceManager pm = new DBPersistenceManager();
ClassMappingDescriptor descriptor = ClassMappingDescriptor.getInstance(Dealer.class);
StringBuffer sql = pm.getSqlSelectFromPart(descriptor);
sql.append(" WHERE SALES_ACCOUNT_ID not in (SELECT DEALER_ID FROM PRIORITY_ASSIGNMENT WHERE PRIORITY_ID=" +
priority.getId() + ")");
sql = pm.constructOrderByClause(sql, descriptor);
ResultSet set = pm.executeSqlSelect(sql.toString(), null);
List<Dealer> dealerList = pm.createEntitiesFromResultSet(set, descriptor.getAttributeMappingsDirect());

結果をデータ・オブジェクト・リストに変換する必要があるため、SELECT句にすべての列を含み、FROM句で、データ・オブジェクトに対応するテーブル名を使用する必要があります。getSqlSelectFromPartという便利なメソッドを使用することで、persistence-mapping.xmlファイルからデータ・オブジェクト・クラス・ディスクリプタを使用してSELECT句およびFROM句が自動的に作成されます。その後、SQL文にカスタムWHERE句を追加できます。カスタムORDER BY句を追加することもできますが、データ・オブジェクト・クラス・ディスクリプタで登録されたとおりのデフォルトorder byを使用する場合は、前述の例で示した便利なメソッドconstructOrderByClauseを使用できます。SQL SELECT文を作成したら、JDBC RowSetオブジェクトを返すexecuteSqlSelectメソッドを使用してそれを実行できます。次に、createEntitiesFromResultSetメソッドを使用してJDBC RowSetをデータ・オブジェクト・リストに変換します。

データ・オブジェクト・リストに変換できないすべてのSQL SELECT結果については、SQL文全体の定義、またJDBC RowSetの処理が可能です。次に、集約問合せの例を示します。

DBPersistenceManager pm = new DBPersistenceManager();
String sql = "SELECT AVG(SALARY) FROM EMPLOYEE";
ResultSet set = pm.executeSqlSelect(sql, null);
try {
set.first();
int averageSalary = set.getInt(1);
}
catch (SQLException e) {
sLog.severe("Error executing SQL statement: "+e.getLocalizedMessage());
}

単一行の挿入、更新または削除の場合は、通常は、前述のデータ・オブジェクトベースのAPIを使用します。ただし、一度に複数の行を挿入、更新または削除する必要がある場合は、executeSqlDmlメソッドを使用できます。次に、すべての事務員の給料を10%増加させる例を示します。

DBPersistenceManager pm = new DBPersistenceManager();
String sql = "UPDATE EMPLOYEE SET SALARY = SALARY * 1.1 WHERE JOB_ID='CLERK'";
pm.executeSqlDml(sql, null, true);

3番目のdoCommit引数がtrueの場合、バッチ更新が自動的にコミットされます。それがfalseに設定されている場合は、後でpm.commit()を呼び出す必要があります。

6.13 カスタム・リソースの定義

MAFクライアント・データ・モデルでサポートされている標準のCRUDリソースに直接マップしないカスタムRESTリソースをMAFアプリケーションのクライアント・データ・モデルに追加する方法について説明します。

「リソースの詳細」ウィザード・ページでは、「CRUD RESTリソース詳細の指定」で説明しているように、カスタム・リソースを追加できます。これを行うと、MAFはカスタム・リソースと同じ名前の追加のメソッドを次のシグネチャでサービス・オブジェクトに生成します。

public void doSomething(Department department) {
invokeCustomMethod(department, "doSomething");
}

このアプローチの利点は、実装が高速かつ容易であることです。MAFアプリケーションがオフラインの場合や、サーバー・エラーのためにRESTコールが失敗した場合には、カスタム・リソース・アクションは保留中のデータ同期アクションとして登録されます。MAFは、後でMAFアプリケーションがオンライン・モードに戻ったときにコールを行います。つまり、「MAFアプリケーションからのオフライン・トランザクションの同期」で説明しているように、オフライン・モードの標準のCRUDトランザクションと同じように処理されます。

このアプローチの短所は、問合せパラメータおよびパス・パラメータを提供する方法およびリクエスト・ペイロードを提供する方法が制限されることです(これはシリアライズされたデータ・オブジェクトのみが可能)。問合せパラメータおよびパス・パラメータの値は、「CRUD RESTリソース詳細の指定」で説明しているオプションを使用して宣言的に定義できます。問合せパラメータおよびパス・パラメータによるURIパスの構築方法に完全な柔軟性を持たせる必要がある場合は、プログラムによるアプローチを採用し、RESTコールをJavaでコーディングした方が効率的です。

RESTリソースを起動するには、リモート永続性マネージャ(RestJSONPersistenceManagerか、またはOracle Mobile Cloud Service (MCS)に接続する場合にはMCSPersistenceManager)でinvokeRestServiceメソッドを使用します。これらのクラスおよびメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

また、「WebサービスにアクセスするためのRESTサービス・アダプタの作成」で説明しているように、RESTServiceAdapterを使用することもできます。ただし、invokeRestServiceメソッドには、次の利点があります。

- 1行のコードでRESTコールを行います。

- 200-299の範囲のHTMLステータス・コードですべてのレスポンスを正常に処理します。RESTServiceAdapterのようにステータス・コード201-299で例外がスローされることはありません。

- Webサービス・ロギングを有効にした場合は、RESTコール詳細を簡単に表示できます。

- MCSに接続する場合は、Oracle-Mobile-Backend-Idおよび(匿名) Authorizationヘッダー・パラメータを指定する必要はありません。

invokeRestServiceメソッドのシグネチャは次のとおりです。

public String invokeRestService(String connectionName, String requestType, String requestUri,
String payload, Map<String, String> headerParamMap, int retryLimit, boolean secured)

注意:
最後の引数(secured)は使用されません。後方互換性のために含まれています。

通常、invokeRestServiceメソッドを起動するサービス・オブジェクトにメソッドを追加します。その後、AMXページにメソッドをドラッグ・アンド・ドロップして、ユーザー・インタフェースからRESTコールを行うことができます。次に、このようなRESTコールを行うサンプルのメソッドを示します。

public void invokeSomeRestResource(String pathParamValue,String queryParamValue) {

if (isOnline()) {
RestJSONPersistenceManager rpm = new RestJSONPersistenceManager();
String uri = "/someResourcePath/"+pathParamValue+"?someQueryParam="+queryParamValue;
String result = rpm.invokeRestService("MyRESTConn", "GET", uri, null, null, 0, false);
// do something with the result
}
}

バックグラウンドでRESTコールを実行する場合、コードは次のようになります。

public void invokeSomeRestResource(String pathParamValue,String queryParamValue) {
TaskExecutor.getInstance().execute(true, () -> {
if (isOnline())
{
RestJSONPersistenceManager rpm = new RestJSONPersistenceManager();
String uri = "/someResourcePath/"+pathParamValue+"?someQueryParam="+queryParamValue;
String result = rpm.invokeRestService("MyRESTConn", "GET", uri, null, null, 0, false);
// do something with the result
}
});
}

標準の「すべてのリソースの検索」のようにレスポンスをエンティティのリストに変換してSQLiteデータベースに格納する必要がある場合は、リモート永続性マネージャでhandleReadResponseメソッドを使用して、これをすべて自動的に行います。次に、このメソッドのシグネチャを示します。

public <E extends Entity> List<E> handleReadResponse(String jsonResponse, Class entityClass,
String collectionElementName, String rowElementName,
List<BindParamInfo> parentBindParamInfos, boolean deleteAllRows)

collectionElementName引数およびrowElementName引数は、標準のGETリソース用に指定している「ペイロード・リスト要素名」および「ペイロード行要素名」にマップされます。レスポンス・ペイロードの構造に基づいてこれらの引数の値を設定する方法は、「CRUD RESTリソース詳細の指定」を参照してください。レスポンスがトップレベルのオブジェクトとして配列を返す場合は、collectionElementNameの値としてルートを指定する必要があります。

parentBindParamInfos引数はnullのままにすることができ、deleteAllRows引数は廃止されています(後方互換性を維持するために含まれています)。レスポンス・ペイロードを処理する前にすべてのローカル行を削除する場合は、そのためのコードを自分で追加する必要があります。

次のコード・サンプルでは、レスポンス・ペイロードを処理してエンティティ・リストを作成するように前述の例を拡張する方法を示しています。

public void invokeSomeRestResource(String pathParamValue,String queryParamValue) {
if (isOnline()) {
RestJSONPersistenceManager rpm = new RestJSONPersistenceManager();
String uri = "/someResourcePath/"+pathParamValue+"?someQueryParam="+queryParamValue;
String result = rpm.invokeRestService("MyRESTConn", "GET", uri, null, null, 0, false);
List<Employee> emps = rpm.handleReadResponse(result, Employee.class, "root", null, null, false);
setEntityList(emps);
}
}

6.14 CRUD RESTコール後のカスタム・ロジックの実行

ローカルおよび/またはリモート永続性マネージャに対してCRUD操作を実行するためにMAFがサービスクラス内で生成するメソッドを説明します。MAFでは、「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードからこれらのメソッドを生成します。

たとえば、部門サービス・クラスにはfindAllDepartment、saveDepartmentおよびremoveDepartmentなどのメソッドがあります。これらのメソッドでは、間接的に、対応するRESTコールが行われます(「REST WebサービスからのMAFクライアント・データ・モデル」ウィザードでこれらのコールを構成してある場合)。そのため、RESTレスポンスに基づいてカスタム・ロジックを実行する必要がある場合は、これらのメソッドの最後にロジックを追加する可能性があります。ただし、これらのRESTコールをバックグラウンドで実行した場合(「ランタイム・オプション」ページで「バックグラウンドでのリモート読取り」および/または「バックグラウンドでのリモート書込み」チェック・ボックスを選択した場合)、これはうまくいきません。このシナリオでは、カスタム・ロジックは、別個のバックグラウンド・スレッドでRESTコールがまだ進行中の間にすでに実行されています。

必ずRESTコールがバックグラウンドで完了した後にカスタム・ロジックが実行されるよう、別のアプローチを取る必要があります。読取りRESTコール(GET)の後にカスタム・ロジックを追加する必要がある場合は、サービス・クラス内の次のメソッドのいずれかをオーバーライドできます。

- executeRemoteFindAll

- executeRemoteFindAllInParent

- executeGetCanonical

executeRemoteFindAllをオーバーライドする、次の例で示すように、superへのコールの後にカスタム・ロジックを追加します。

@Override
protected List<Department> executeRemoteFindAll()
{
// call super to get the new list of departments from REST call
List<Department> result =  super.executeRemoteFindAll();
// do some custom logic here
...

// return department list
return result;
}

書込みRESTコール(POST、PUT、PATCH、DELETE)の後にカスタム・ロジックを実行する必要がある場合は、リモート永続性マネージャのサブクラスを作成し、次のメソッドのいずれかをオーバーライドします。

- insertEntity

- updateEntity

- mergeEntity

- removeEntity

「永続性マッピングの編集」ウィザードを使用することで、サブクラス化する必要があるリモート永続性マネージャ・クラスを見つけます。図6-19で示す「ランタイム・オプション」ページに移動し、正しいデータ・オブジェクトを選択し、「リモート永続性マネージャ」フィールドからクラス名をコピーします。このクラスからサブクラス化した新しいJavaクラスを作成し、前にリストしたメソッドのうち1つまたは複数をオーバーライドします。MAFアプリケーション・ランタイムでカスタム・リモート永続性マネージャが使用されるようにするには、図6-19で示す「リモート永続性マネージャ」フィールドにサブクラスの完全修飾クラス名を入力します。「ランタイム・オプション」ページにアクセスするための「永続性マッピングの編集」ダイアログの起動の詳細は、MAFアプリケーションでのクライアント・データ・モデルの編集を参照してください。

図6-19 リモート永続性マネージャ

MAFによってサポートされるオフライン・トランザクションが原因で、書込みメソッドのリモート永続性マネージャをサブクラス化する必要があります。オフライン・モードでは、RESTコールは実行されませんが、かわりに、保留中の同期アクションとして登録されます。再度オンラインになったときに、MAFアプリケーションで、サービス・クラスをバイパスし、リモート永続性マネージャ・サブクラスを使用して直接RESTコールが実行されます。

RESTコールからの未加工のレスポンスに基づいてカスタム・ロジックを実行する必要がある場合は、MAFで処理が実行される前に、リモート永続性マネージャ内の次のメソッドをオーバーライドします。

public String invokeRestService(String connectionName, String requestType, String requestUri,
String payload, Map111String,String222 headerParamMap, int retryLimit, boolean secured)

このメソッドは、MAF内のすべてのRESTコールを処理し、RESTコールのレスポンスを返します。superを呼び出した後、getLastResponseStatus()およびgetLastResponseHeaders()を呼び出してレスポンスに関する情報をさらに取得することもできます。

6.15 サービス・オブジェクトへのプログラムによるアクセス

サービス・オブジェクトのインスタンスへのプログラムによるアクセスを実現する方法について説明します。

通常、「データ・コントロール」パネルからのドラッグ・アンド・ドロップを使用してMAFアプリケーションのユーザー・インタフェースを作成するには、サービス・オブジェクトのデータ・コントロールを作成します。マネージドBeanまたはライフサイクル・リスナー・メソッドからサービス・オブジェクトにアクセスする場合は、次のように、サービス・オブジェクトのインスタンスを作成します。

DepartmentService service = new DepartmentService();

DepartmentServiceは、oracle.maf.impl.cdm.persistence.service.EntityCRUDServiceから拡張したものです。

「クライアント・データ・モデルのランタイム・オプションの設定」で説明しているように「ランタイム・オプション」ページで「自動問合せ」を選択し、「CRUD RESTリソースの定義」で説明しているように「すべてのリソースの検索」の値を指定した場合には、これがRESTコールをトリガーします。作成したインスタンスに対してプログラムによりこの自動問合せを実行しないようにする場合は、autoQueryをブール引数として取る次のコンストラクタを使用します。

DepartmentService service = new DepartmentService(false);

自動問合せを実行する場合は、次のようにコードを記述します。

DepartmentService service = new DepartmentService();
List<Department> deps = service.getDepartment();
// do something with the departments

「ランタイム・オプション」ページで「バックグラウンドでのリモート読取り」チェック・ボックスを選択してRESTコールをバックグラウンドで実行する場合には、これが確実に機能するとはかぎりません。その場合、RESTコールがバックグラウンド・スレッドで実行されるため、getDepartment()メソッド・コールはローカル・データベースに格納されている部門のみを返します(ある場合)。したがって、最も安全な方法は次のコンストラクタを使用することです。

public DepartmentService(boolean doRemoteReadInBackground, boolean doRemoteWriteInBackground)
{
super(false);
setDoRemoteReadInBackground(doRemoteReadInBackground);
setDoRemoteWriteInBackground(doRemoteWriteInBackground);
}

このコンストラクタは、autoQuery引数をfalseに設定してsuperをコールし、コンストラクタ・コールの指定に従ってremoteReadInBackgroundプロパティおよびremoteWriteInBackgroundプロパティを設定します。つまり、このコンストラクタを使用すると、「ランタイム・オプション」ページで行った(その結果persistence-mapping.xmlファイルに格納されている)選択の内容を無視するインスタンスを取得できます。

DepartmentService service = new DepartmentService(false,false);
// get latest department list from server by making synchronous REST call
service.findAllDepartmentRemote;
// get a handle in the department list
List<Department> deps = service.getDepartment();
// do something with the department list

マネージドBeanコードでは、データ・コントロールで使用されるサービス・オブジェクト・インスタンスへのアクセスが必要になる場合があります。これを行うには、次の便利なメソッドを使用します。

DepartmentService service = (DepartmentService) EntityUtils.getEntityCRUDService(Department.class);

このメソッドは、サービス・オブジェクト・クラスの名前でデータ・コントロール・インスタンスを検索します。ただし、データ・コントロールをまだインスタンス化しないうちにこのメソッドを使用した場合(つまり、AMXページで使用した場合)、前に説明したように、デフォルトのコンストラクタを使用して新規インスタンスを作成するため、不要なRESTコールをトリガーする場合があることに注意してください。データ・コントロール・インスタンスは、アプリケーション機能のコンテキストに存在します。2つの異なるアプリケーション機能のAMXページで同じデータ・コントロールを使用した場合は、基礎となるサービス・オブジェクトのインスタンスが2つ存在することになります。getEntityCRUDServiceメソッドを実行するアプリケーション機能コンテキストによって、どのインスタンスが返されるかが決まります。

マネージドBeanコードでデータ・コントロール・インスタンスを操作する必要性を減らすため、可能なかぎり多くのロジックをサービス・クラスに移動します。多数の値バインディング式およびメソッド・バインディング式を評価し、その後でこれらの多数のメソッド・バインディングを実行する場合は、コーディング方針を見直すことをお薦めします。

最後に、カスタムJavaコードでローカルSQLiteデータベースにのみアクセスする必要があり、RESTコールを行う必要がない場合は、サービス・オブジェクト・インスタンスを作成する必要はありません。かわりに、oracle.maf.api.cdm.persistence.manager.DBPersistenceManagerのインスタンスを使用して、データ・オブジェクトの問合せまたは操作を行います。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

6.16 主キーの使用の理解

SQLiteデータベース内の行を一意に識別できるようにするには、すべてのデータ・オブジェクトに主キーが必要となります。また、MAFでは、データ・オブジェクト・キャッシュでのデータ・オブジェクト作成を最小限に抑えるため、およびデータ・オブジェクトの複数のインスタンスが作成されないようにするために、主キーが使用されます。

キャッシュから特定のデータ・オブジェクト・インスタンスを取得するには、次のメソッドを使用します。

EntityCache.getInstance().findByUID(Class entityClass, Object[] key)

キャッシュから、またはデータ・オブジェクトがキャッシュされていない場合にデータベースからデータ・オブジェクトを取得するには、DBPersistenceManagerクラスから次のメソッドを使用します。

findByKey(Class entityClass, Object[] key)

主キーは、複数の属性/列で構成される複合キーにできます。これは、前述のメソッドのkey引数がオブジェクト配列を取るためです。主キーが単一の数値属性である場合は、クライアント・データ・モデルのランタイム・オプションの設定で説明されている「ランタイム・オプション」ページ内の「主キーの生成」チェック・ボックスを選択してあると、MAFで自動的に主キーが生成されます。フレームワークまたはカスタム・コードによってDBPersistenceManagerのinsertEntityメソッドが呼び出されると、MAFにより、SQLiteデータベースに現在の最大値が照会され、この値が1増分されます。

次のメソッドを使用することで、自分で主キーを生成することもできます。

EntityUtils.generatePrimaryKey(Entity entity, int increment)

注意:
後者のメソッドは、データ・オブジェクトに対して「主キーの生成」チェック・ボックスを選択した場合のみ機能します。これは、それによってpersistence-mapping.xmlファイル内のこのフラグがチェックされるためです。

サーバーで生成された主キー値のMAFによる管理の理解

新しいデータ・オブジェクト・インスタンスのために作成または生成した主キー値は、一時主キーとみなされます。もちろん、この主キーがサーバー側で一意であることは保証されません。通常は、データ・オブジェクトをリモート・サーバーに挿入するRESTサービスを起動すると(ウィザードで指定した「リソースの作成」)、リモート・サーバーによって一意の主キーが生成されます。

データ・オブジェクトを挿入するRESTコールで、レスポンスで、サーバーによって生成された新しい値があるデータ・オブジェクトが返された場合、MAFクライアント・データ・モデルにより、サーバーで生成された主キーで一時主キーが自動的に更新されます。MAFクライアント・データ・モデルにより、一時主キーを含むデータベース行が削除され、サーバーで生成されたキーを含む新しい行が挿入されます。また、データベース・オブジェクト・キャッシュが更新されます。

このMAFクライアント・データ・モデル機能を役立てるには、「リソースの作成」エンドポイントにおいてレスポンスでデータ・オブジェクト全体が返されることを確認してください。

SQLite自動増分機能

MAFでは、データ・オブジェクト・キャッシュ内のインスタンスを識別するため、およびMAFアプリケーションでサーバーから最新データがフェッチされるときにSQLiteデータベース内の既存行を更新するために主キーが使用されるため、SQLiteの自動増分機能を使用しないようにしてください。この理由から、SQLiteの自動増分機能ではなく、リモート・サーバーからのペイロードに含まれる1つまたは複数のデータ・オブジェクト属性を使用して主キーを指定することをお薦めします。

サーバーから取得されるデータ・オブジェクト・インスタンスがないデータ・オブジェクトのためにSQLiteの自動増分機能を使用するのはかまいません。つまり、ここでは、SQLiteデータベースにデータを読み込むために呼び出されるGETリソースはありません。

SQLiteの自動増分機能の詳細は、SQLiteのドキュメントを参照してください。

6.17 フィルタされたエンティティ・リストの使用

MAFアプリケーションのUIでのフィルタされたリストの作成を容易にするためにMAFクライアント・データ・モデルが生成するメソッドを説明します。

MAFでは、データ・オブジェクト・インスタンスのコレクションを返す、データ・オブジェクトのCRUDサービス・クラス内のゲッター・メソッドが生成されます。たとえば、従業員データ・オブジェクトのサービス・クラス(EmployeeService)には次のメソッドがあります。

public List<Employee> getEmployee() {
return getEntityList();
}

EntityCRUDServiceスーパークラスでは、返されたリストはプライベート・メンバー変数(private EntityList<E> entityList)に格納されます。このリストには、ローカルSQLiteデータベースから、および/またはクライアント・データ・モデルのランタイム・オプションの設定で説明されているように「ランタイム・オプション」ページ内の「自動問合せ」チェック・ボックスを選択した場合にはFind All RESTリソースへのコールから取得されたすべてのデータ・オブジェクト・インスタンスが含まれています。

ユーザー・インタフェース内のクイック検索フィールドに基づいてこのリストをフィルタするには、データ・オブジェクトCRUDサービス・クラスで生成される、find[entityName]メソッドを使用します。たとえば、次のメソッドは、従業員データ・オブジェクトのために生成されます。

public void findEmployee(String searchValue) {
super.find(searchValue);
}

検索フィールドおよびコマンド・ボタンをレンダリングしてfind[entityName]メソッドを呼び出すには、メソッドを「データ・コントロール」パネルから自分のAMXページにドラッグ・アンド・ドロップします。エンド・ユーザーがそのコマンド・ボタンをタップしてfind[entityName]メソッドを呼び出すと、find[entityName]メソッドはDBPersistenceManagerクラス内のfindメソッドに委任します。DBPersistenceManagerクラスの詳細は、「MAFクライアント・データ・モデルDBPersistenceManagerの使用によるSQLiteデータベースへのアクセス」およびOracle Mobile Application Framework Java APIリファレンスを参照してください。findメソッドから返される結果は、entityList変数の新しいコンテンツとして格納されます。エンド・ユーザーがコマンド・ボタンをクリックした後、リストを正しくリフレッシュするために、データ変更イベントがユーザー・インタフェースに送信されます。

エンティティ・リストをフィルタするカスタム・メソッドを記述することもできます。次の例では、従業員のリストを事務員のみにフィルタします。

public void filterClerks()
{
DBPersistenceManager pm = new DBPersistenceManager();
Map<String,String> searchAttrs = new HashMap<String,String>();
searchAttrs.put("jobId","CLERK");
List<Employee> clerks = pm.find(Employee.class,searchAttrs);
setEntityList(clerks);
}

setEntityListを呼び出すとentityList変数が更新され、setEntityListが呼び出されると、必要なデータ変更イベントがユーザー・インタフェースに送信されます。

注意:
このメソッドがUIアクションを介して呼び出されるか、バックグラウンド・スレッドでJavaコードを介して呼び出されるかは問題ではありません。

たとえば、アプリケーションのユーザー・インタフェースで、フィルタされたリストを一度に複数表示する必要があるとします。たとえば、従業員のリストと事務員のリストを表示する必要があるとします。このシナリオでは、entityListによってすでにすべての従業員がユーザー・インタフェースに表示されているため、filterClerksメソッドではentityListメンバー変数は更新できません。解決策は、事務員のリストを返すゲッター・メソッドの追加です。これにより、事務員のリストを表示するAMXページ上にドラッグ・アンド・ドロップできる、事務員コレクション属性がEmployeeServiceデータ・コントロールに追加されます。次のコード例では、そのようなゲッター・メソッドを示します。

public List<Employee> getClerks()
{
DBPersistenceManager pm = new DBPersistenceManager();
Map<String,String> searchAttrs = new HashMap<String,String>();
searchAttrs.put("jobId","CLERK");
List<Employee> clerks = pm.find(Employee.class,searchAttrs);
return clerks;
}

@Override
protected void setEntityList(List<Employee> entityList)
{
super.setEntityList(entityList);
// we also need to refresh the clerks list
getPropertyChangeSupport().firePropertyChange("clerks", null, getClerks());
getProviderChangeSupport().fireProviderRefresh("clerks");
}

前の例では、Find All RESTリソースを呼び出すことでバックグラウンドで最新の従業員リストを取得するという状況に対処するよう、setEntityListメソッドをオーバーライドしています。MAFアプリケーションでバックグラウンドでFind All RESTコールを実行した場合、レスポンスが返されるとsetEntityListが呼び出され、データベースが、レスポンス・ペイロードに含まれる最新のデータ・オブジェクト・インスタンス・セットで更新されます。この例では、ユーザー・インタフェースに、すべての従業員のリストと事務員のリストが示されます。RESTコールが完了したときに、両方のリストが更新されるようにする必要があります。setEntityListメソッドのオーバーライドによって、RESTサービスから最新の従業員セットが取得されるとgetClerksメソッドが再度実行され、事務員リストをリフレッシュするためにデータ変更イベントが送信されるようになります。

6.18 MAFクライアント・データ・モデルに基づくユーザー・インタフェースの作成

クライアント・データ・モデルを生成したMAFアプリケーションでは、開発作業の簡素化のためにMAFから提供される数多くの機能を利用できます。

クライアント・データ・モデルの作成後、通常、クライアント・データ・モデルが生成したエンティティ・サービス・クラスごとにデータ・コントロールを作成します。これらのデータ・コントロールには、JDeveloperの「データ・コントロール」パレットから操作およびコレクションをドラッグ・アンド・ドロップしてMAF AMXページを構築できるようにするメソッドが多数含まれています。詳細は、「クライアント・データ・モデルからデータ・コントロールを作成する方法」を参照してください。

「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」で説明しているようにクライアント・データ・モデルを作成した場合は、MAFアプリケーションのユーザー・インタフェース・レイヤーを構築およびテストする際の生産性を高めるためにMAFに用意されている次の機能を利用できます。

- 「MAFユーザー・インタフェース・ジェネレータ」ウィザードを使用して、クライアント・データ・モデルをテストし、MAFアプリケーションのユーザー・インタフェースのプロトタイプを作成します。このウィザードは、タスク・フロー、AMXページ、データ・バインディングなどを備えた完全なMAFアプリケーション機能を生成します。このウィザードを使用するには、「MAFユーザー・インタフェース・ジェネレータを使用する方法」の説明に従って、データ・コントロールを作成し、そのデータ・コントロールからアプリケーション機能を生成します。

- MAFに付属している再利用可能なデータ同期アプリケーション機能を使用して、保留中のデータ同期アクションを表示します。あるいは、データ同期サービス・データ・コントロールを使用して独自のAMXページを作成します。

- MAFアプリケーションが実際にはインターネットに接続されている間もオフラインであるかのように動作するようにします。

- ビジュアル・インジケータを追加して、MAFアプリケーションがバックグラウンドで作業を実行中であることをエンド・ユーザーに示します。このビジュアル・インジケータは通常、MAFアプリケーションがリモート・サーバーに対してデータの読取りまたは書込みを実行中であることをエンド・ユーザーに通知するために使用します。

- MAFに付属しているWebサービス・コールというアプリケーション機能を使用して、MAFアプリケーションが行うRESTコールを調べます。

6.18.1 クライアント・データ・モデルからデータ・コントロールを作成する方法

MAFアプリケーションのクライアント・データ・モデルの生成時に作成されるサービス・オブジェクトからデータ・コントロールを作成する方法について説明します。

「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」で説明しているようにクライアント・データ・モデルの作成が完了したら、通常、後者のタスク中に生成されたサービス・オブジェクトからデータ・コントロールを作成します。これらのデータ・コントロールにより、アプリケーションのユーザー・インタフェースの作成が容易になります。JDeveloperの「データ・コントロール」パネルからコレクション、属性または操作をドラッグしてAMXページにドロップできます。このとき、MAFにより、AMXページにデータまたはUIコントロールをレンダリングするのに適したAMXコンポーネントを選択するように求められます。あるいは、「MAFユーザー・インタフェース・ジェネレータを使用する方法」で説明しているように、「MAFユーザー・インタフェース・ジェネレータ」ウィザードを使用してデータ・コントロールからアプリケーション機能を生成できます。

クライアント・データ・モデルからデータ・コントロールを作成するには:

1. 「アプリケーション」ウィンドウで、クライアント・データ・モデル・ウィザードが生成したサービス・オブジェクトに移動します。
サービス・オブジェクトの場所は、クライアント・データ・モデル・ウィザードで選択したオプションによって異なります。たとえば、図6-20は、MAFアプリケーションのApplicationControllerプロジェクトのDepartmentServiceサービス・オブジェクトおよびEmployeeServiceサービス・オブジェクトを示しています。

図6-20 クライアント・データ・モデルのサービス・オブジェクト

2. 「アプリケーション」ウィンドウで、サービス・オブジェクト(たとえば、DepartmentService.java)を右クリックし、表示されたコンテキスト・メニューから「データ・コントロールの作成」を選択します。

3. 表示された「Beanデータ・コントロールの作成」ウィザードのフィールドに入力し、「終了」をクリックします。

6.18.2 クライアント・データ・モデルからデータ・コントロールを作成する場合の処理

MAFは、AMXページにドラッグ・アンド・ドロップできる様々な要素および操作を使用して、サービス・オブジェクトからデータ・コントロールを生成します。

このデータ・コントロールは、「MAFユーザー・インタフェース・ジェネレータを使用する方法」で説明しているように、「MAFユーザー・インタフェース・ジェネレータ」ウィザードでアプリケーション機能を作成する場合にも使用できます。

図6-21 クライアント・データ・モデルのサービス・オブジェクトから作成されたデータ・コントロール

6.18.3 MAFユーザー・インタフェース・ジェネレータを使用する方法

MAFアプリケーションにクライアント・データ・モデルを生成した場合は、「MAFユーザー・インタフェース・ジェネレータ」ウィザードを使用して、タスク・フロー、AMXページおよびデータ・バインディングを備えたMAFアプリケーション機能を作成します。

このウィザードでは、クライアント・データ・モデルをテストし、MAFアプリケーションのプロトタイプのユーザー・インタフェースを作成できます。ウィザードを使用する前に、「MAFアプリケーションでのクライアント・データ・モデルの作成の概要」で説明しているように、クライアント・データ・モデルを作成します。クライアント・データ・モデルを作成すると作成されるサービス・オブジェクトからデータ・コントロールを生成します。MAFアプリケーション機能を生成するデータ・コントロールがJDeveloperの「データ・コントロール」ウィンドウに表示されることを確認してください。「リフレッシュ」アイコンをクリックすることが必要になる場合があります。

ウィザードは、データ・コントロールが公開するデータ・オブジェクトごとにリスト・ビュー・ページおよびフォーム・ページを生成します。リスト・ビュー・ページに公開するデータ・オブジェクト属性を選択できます。フォーム・ページには、すべてのデータ・オブジェクト属性が表示されます。

「MAFユーザー・インタフェース・ジェネレータ」ウィザードを使用するには:

1. メイン・メニューで、「ファイル」を選択し、「ギャラリから」を選択します。

2. 「新規ギャラリ」の「クライアント層」カテゴリの「モバイル・アプリケーション・フレームワーク」ノードで、「MAFユーザー・インタフェース・ジェネレータ」をダブルクリックします。

3. ようこそページの「次へ」をクリックし、「データ・コントロールの選択」ページで、MAFアプリケーション機能を生成するデータ・コントロールを選択します。

4. 「MAFアプリケーションの保護」で説明しているようにMAFアプリケーションのセキュリティをすでに構成している場合は、「データ・コントロールの選択」ページの「機能セキュリティの有効化」チェック・ボックスを選択できます。このタスクは後で実行できます。

5. 「次へ」をクリックして、図6-22に示す「データ・オブジェクトUI設定」ページに移動し、次のように値を構成します。

- データ・オブジェクト: ドロップダウン・リストからデータ・オブジェクトを選択し、このオブジェクトの表示タイトルと、エンド・ユーザーが実行できるようにユーザー・インタフェースに公開する操作(オブジェクトの作成や更新や削除など)を構成します。「CRUD RESTリソースの定義」で説明しているようにCRUD RESTリソースを定義した場合は、「作成可能」、「更新可能」および「削除可能」のチェック・ボックスを選択します。

- 親ページに表示: 親データ・オブジェクトのフォーム・ページ内に子データ・オブジェクトのリスト・ビューを含める子データ・オブジェクトを選択します。別個のページに表示するチェック・ボックスの選択を解除します。このチェック・ボックスを使用する場合は、「データ・オブジェクトの親子関係の指定」で説明しているように、親子関係を構成しておくことが前提となります。

- リスト属性: リスト・ビュー・ページに表示するデータ・オブジェクト属性を指定します。リスト区切りを選択することもできます。

図6-22 MAFユーザー・インタフェース・ジェネレータによって生成されたページのユーザー・インタフェースの構成

6. 「終了」をクリックして、ユーザー・インタフェースを含むMAFアプリケーション機能を生成します。

6.18.4 ユーザー・インタフェースを生成する場合の処理

「MAFユーザー・インタフェース・ジェネレータ」ウィザードを完了すると、MAFはMAFアプリケーションに次の変更を加えます。

- maf-feature.xmlファイルに新規に作成したMAFアプリケーション機能を追加します。

- Web Contentディレクトリのサブディレクトリにタスク・フローを生成します。サブディレクトリの名前は、データ・オブジェクト(たとえば、Department)の名前から導出されます。

- 生成したタスク・フローにビュー・アクティビティごとにAMXページを生成し、生成したAMXページのAMXページ定義を生成します。

- adfc-mobile-config.xmlファイルにGoToFeatureおよびConnectivityマネージドBeanを追加します。生成したAMXページがこれらのマネージドBeanを使用します。

- 新規に作成したMAFアプリケーション機能への参照に加え、クライアント・データ・モデルを生成するとMAFに含まれるその他の2つのアプリケーション機能への参照も追加します。これらは、データ同期アプリケーション機能とWebサービス・コール・アプリケーション機能です。これらのアプリケーション機能の使用の詳細は、「MAFアプリケーションからのオフライン・トランザクションの同期」および「MAFアプリケーションでのWebサービス・コールの検査」を参照してください。

6.19 MAFアプリケーションからのオフライン・トランザクションの同期

MAFアプリケーションでは、アプリケーションがオフライン・モードのときに、エンド・ユーザーがトランザクションを実行できるようにすることができます。MAFは、アプリケーションが次にオンライン・モードになったときに、トランザクションごとにデータ同期アクションを実行します。

このコンテキストでのトランザクションは、RESTコールによるデータの作成、変更または削除を伴う、サービス・オブジェクトに対するメソッドの起動です。saveDepartment(Department)などサービス・オブジェクトのメソッドを起動すると、MAFはコール可能な対応するRESTリソースがあるかどうかをチェックします。対応するRESTリソースがない場合、MAFはオンデバイスSQLiteデータベースに対して適宜メソッドを起動します。コール可能な対応するRESTリソースがある場合、MAFはデータ同期アクションを作成します。データ同期アクションは、実行するリソースのタイプ(挿入、更新、削除またはカスタム・アクション)およびトランザクションが必要とするデータ・オブジェクト・インスタンスのすべてのデータを保持します。

MAFアプリケーションがオンライン・モードになると、MAFは同期アクションを起動し、対応するRESTリソースを起動します。MAFアプリケーションがオフライン・モードで、データ・オブジェクトに対するオフライン・トランザクションを有効にした場合、MAFはデータ同期アクションを登録し、それを保留中の同期アクションとして格納します。MAFは、MAFアプリケーションが次にオンライン・モードになったときに、アクションを同期します。MAFは、同期するときにトランザクションがコミットされる正確な順序を保持します。

データ・オブジェクトのオフライン・トランザクションを有効にするには、「クライアント・データ・モデルのランタイム・オプションの設定」で説明しているように、オフライン・トランザクションの有効化チェック・ボックスを選択します。データ・オブジェクトに対するオフライン・トランザクションを無効にした場合、エンド・ユーザーがデータ・オブジェクトに対してオフライン・トランザクションを実行しようとすると、MAFは「デバイスはオフラインです。」という例外をスローします。この例外を防ぐには、MAFアプリケーションがオフライン・モードのときにはUIコントロールを無効にして、エンド・ユーザーが例外をスローするトランザクションを作成できないようにします。

MAFは、SQLiteデータベースのPENDING_SYNCH_ACTIONS表にデータ同期アクションを格納します。データ・オブジェクトのSQLiteデータベース表には、データ同期アクションに関連する情報は格納されません。たとえば、MAFアプリケーションがオフライン・モードのときに、エンド・ユーザーが部門を削除したとします。このアクションは、SQLiteデータベースのDEPARTMENTS表から対応する行を削除し、対応するデータ同期アクションをPENDING_SYNCH_ACTIONS表に追加します。MAFアプリケーションが次にオンライン・モードになったときに、部門の削除というデータ同期アクションに関連付けられたRESTアクションが実行されます。これにより、関連付けられたRESTコールが実行されたかどうかに関係なく、エンド・ユーザーによって実行された最新のトランザクションがローカルSQLiteデータベース表に反映されるようになります。

MAFアプリケーションがオフライン・モードからオンライン・モードに戻った場合、MAFはアプリケーションがRESTコールを起動するのを待機します。このイベントが発生すると、MAFはRESTコールを処理する前に保留中のデータ同期アクションを同期します。この同期により、MAFアプリケーションに対する後続のRESTコールおよびレスポンスでは廃止されたデータが使用されなくなります。自動同期をトリガーするRESTコールがない場合でも、MAFアプリケーションの任意のサービス・オブジェクトからsynchronize(boolean)メソッドを起動することで、MAFアプリケーションがオンライン・モードに戻ったときに、この自動同期を明示的に起動できます。synchronize(boolean)メソッドは、すべてのサービス・オブジェクト・クラスの拡張元となるoracle.maf.impl.cdm.persistence.service.EntityCRUDServiceクラスに用意されています。このメソッドを任意のサービス・オブジェクト・クラスから一度起動すると、MAFアプリケーションで保留中のすべてのデータ同期アクションに対して自動同期が実行されます。synchronizeのブール引数によって、同期がバックグラウンドで行われるか(true)、フォアグラウンドで行われるか(false)が決まります。お薦めしませんが、「自動同期の無効化に関する必知事項」の説明に従って、MAFアプリケーションのデフォルトの動作を無効にして、RESTコールを起動する前に保留中の同期アクションを同期することもできます。

MAFアプリケーションでは、オンライン・モードに戻ってデータを同期したときに、データ同期の競合が発生するかどうかを検出することはできません。たとえば、MAFアプリケーションがオフライン・モードのときに、MAFアプリケーションのエンド・ユーザーが部門を更新したとします。別の場所で、同じデータ・セットにアクセスするWebアプリケーションの別のユーザーが同じ部門情報を変更します。MAFでは、この後者の変更を検出できません。MAFアプリケーションがオンラインに戻ったときに、MAFはPENDING_SYNCH_ACTIONS表での変更を同期しようとします。今説明した問題を解決し、回避するには、MAFアプリケーションがアクセスするデータ・セットにすべてのアプリケーション(モバイルやWebなど)がアクセスする場所でデータ同期の競合を特定して解決する必要があります。

MAFが対応するRESTリソースをコールして保留中の同期アクションを同期しようとしたときに、サーバーが停止しているなどの理由で、RESTコールがアクションに対してエラー・レスポンスを返すことがあります。そうなった場合、MAFはPENDING_SYNCH_ACTIONS表にデータ同期アクションを保持します。また、同期試行および同期エラーのタイムスタンプでアクションを更新します。1つ以上のアクションが失敗しても、MAFは表にある残りのデータ同期アクションの処理を続行します。MAFは、次回同期を実行するときに、これらの保留中のデータ同期アクションを再試行します。これらの保留中の同期アクションをエンド・ユーザーに公開して、まだ同期されていないアクションを表示してどのように対処するかを決定できるようにすることができます。詳細は、「保留中の同期アクションを表示する方法」を参照してください。また、同期アクションの完了時にMAFアプリケーションで実行するカスタム・ロジックを記述することもできます。たとえば、「失敗した同期アクションを処理するためのカスタム・ロジックを追加する方法」の説明に従って、同期の失敗に応じて実行するコードを記述することができます。

6.19.1 保留中の同期アクションを表示する方法

エンド・ユーザーが保留中の同期アクションを表示および削除できるアプリケーション機能を表示するには、MAFアプリケーションにDataSyncFeature.jar機能アーカイブを追加します。

追加すると、保留中の同期アクションを表示するためのメニューを備えたアプリケーション機能がMAFアプリケーションに組み込まれます。エンド・ユーザーは、各保留中の同期アクションをタップして、詳細を表示し、アクションを削除するか、またはMAFが同期を再試行するまでそのままにしておくかを決定できます。図6-23は、この機能アーカイブが追加されたMAFアプリケーションのメニュー・エントリと保留中の同期アクション画面の合成イメージを示しています。

図6-23 保留中の同期アクションの表示

注意:
「MAFユーザー・インタフェース・ジェネレータ」ウィザードは、完了時にこのFARをMAFアプリケーションに自動的に追加します。「MAFクライアント・データ・モデルに基づくユーザー・インタフェースの作成」を参照してください。

DataSyncFeature.jar FARを追加するには:

1. メイン・メニューで、「アプリケーション」および「アプリケーション・プロパティ」を選択します。

2. 「アプリケーション・プロパティ」ダイアログで、「ライブラリとクラスパス」ページに移動し、「JAR/ディレクトリの追加」をクリックします。

3. 表示された「アーカイブまたはディレクトリの追加」ダイアログで、JDeveloperインストールのjdeveloper/jdev/extensions/oracle.maf/FARs/CDMディレクトリに移動し、MAFアプリケーションのクラスパス・エントリの下に表示されるようにDataSynchFeature.jarファイルを選択します。

4. 「OK」をクリックしてダイアログを閉じます。

5. maf-application.xmlファイルの概要エディタの「機能参照」ページで、図6-24に示すように、機能参照の挿入ダイアログからデータ同期機能を選択してアプリケーションに追加します。

図6-24 保留中の同期アクションを表示するためのFARの追加

6.19.2 失敗した同期アクションを処理するためのカスタム・ロジックを追加する方法

失敗した同期アクションをプログラムにより処理する場合は、データ同期が完了したらMAFアプリケーションで実行するカスタム・コードを記述します。

MAFアプリケーションでJavaコードを記述して登録するには、次の手順を実行します。

1. oracle.maf.impl.cdm.persistence.service.DataSynchManagerから拡張するJavaクラスを作成します。

2. データ同期アクションの完了後にカスタム・ロジックを追加するように、dataSynchFinishedメソッドをオーバーライドします。

protected void dataSynchFinished(java.util.List<DataSynchAction> succeededDataSynchActions,
java.util.List<DataSynchAction> failedDataSynchActions)

dataSynchFinishedメソッドには、引数が2つあります。正常に完了した同期アクションのリストと、失敗した同期アクションのリストです。このメソッドを使用すると、たとえば、1つ以上のトランザクションが失敗し、後で再試行が必要であることをエンド・ユーザーに警告したり、すべての保留中のデータ同期アクションが正常に処理されたことを通知できます。

同期ポリシーを導入するためのJavaコードをこのメソッドに追加します。次の簡単な例では、正常に完了した同期アクションと失敗した同期アクションの数をユーザーに通知しています。

package application.model.service;

import java.util.List;
import oracle.adfmf.framework.exception.AdfException;
import oracle.maf.impl.cdm.util.MessageUtils;
import oracle.maf.api.cdm.persistence.service.DataSynchAction;
import oracle.maf.impl.cdm.persistence.service.DataSynchManager;

public class MyDataSynchManager extends DataSynchManager {

public DataSynchManager() {
super();
}

@Override
protected void dataSynchFinished(List<DataSynchAction> succeededDataSynchActions,
List<DataSynchAction> failedDataSynchActions)  {
int ok = succeededDataSynchActions.size();
int fails = failedDataSynchActions.size();
int total = ok + fails;
MessageUtils.handleMessage(AdfException.INFO,
total + " data synch actions completed. Successful: " + ok + ", Failed: " + fails);
}
}

3. 次の例に示すように、アプリケーションのmobile-persistence-config.propertiesファイルにクラスを登録します。
datasync.manager.class=application.model.service.MyDataSynchManager

mobile-persistence-config.propertiesファイルは、ApplicationRootDirectory/ApplicationController/src/META-INF/フォルダにあります。

6.19.3 自動同期の無効化に関する必知事項

MAFアプリケーションからのトランザクションの自動同期を無効にできます。

MAFアプリケーションからのトランザクションの自動同期を無効にするには:

1. oracle.maf.impl.cdm.persistence.service.EntityCRUDServiceを拡張する新しい抽象Javaクラスを作成します。

2. synchronizeメソッドが何も実行しないように、このメソッドをオーバーライドし、super.synchronizeへのコールをコメント・アウトします。

3. EntityCRUDServiceから拡張するのではなく、先ほど作成したサブクラスから拡張するように、サービス・オブジェクト・クラスを変更します。

自動同期を無効にする場合は、エンド・ユーザーが同期アクションを明示的に起動できるようにMAFアプリケーションを構成します。データ同期を明示的にトリガーするには、次の文を使用します。

new DataSynchService().synchronize(true);

ブール引数によって、同期がバックグラウンドで行われるか(true)、フォアグラウンドで行われるか(false)が決まります。DataSynchServiceクラスは、oracle.maf.api.cdm.persistence.serviceパッケージにあります。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

トランザクションの自動同期を無効にすると、古くなったデータがアプリケーションに存在し、ユーザー操作性が混乱する可能性があるため、無効にしないことをお薦めします。次の例のユーザー(John)のユースケースは、この点を示しています。Johnは、自分のアプリケーションで次のアクションを実行します。

- アプリケーションをオンライン・モードで起動するときに、部門の最新のリストを取得します。

- オフライン・モードで部門10の名前を変更します。

- オフライン・モードで部門20を削除します。

- オフライン・モードで新規部門280を作成します。

- アプリケーションを終了します

- Johnは、再度アプリケーションをオンライン・モードで起動し、部門の最新のリストをサーバーから取得しますが、3個の保留中の同期アクションがまだ処理されていません。

- Johnには現在、部門10の古い部門名が表示されています。

- Johnは部門20をすでに削除しましたが、現在再び表示されています。

- MAFアプリケーション開発者がデータ・オブジェクトの「すべてのリソースの検索」に対する「ローカル行の削除」チェック・ボックスを選択した場合には、Johnが作成した新規部門(280)は二度と表示されません。

Johnが同期アクションを手動で起動した場合にのみ、(ユーザー・インタフェース・コントロールまたはアプリケーションの再起動によって)サーバーから部門リストを最新のデータで再びリフレッシュすると、オフライン・モードで加えた変更を含む最新のデータが再び表示されます。

6.20 クライアント・データ・モデルによるデータ変更イベントのサポートの理解

基礎となるデータ・コレクションでのデータ変更イベントに応えてMAFアプリケーションのユーザー・インタフェースをリフレッシュするためにMAFクライアント・データ・モデルで使用されるAPIを説明します。

MAFクライアント・データ・モデルによって生成されるデータおよびサービス・クラスは、MAFでサポートされている両方のタイプの変更イベント(プロパティおよびプロバイダ)ですぐに利用できます。これは、このようなタイプのクラスの拡張元のEntityおよびEntityCRUDServiceクラスが、両方ともChangeEventSupportableクラスから拡張されるためです。MAFでサポートされているデータ変更イベントの詳細は、「データ変更イベントの使用」を参照してください。

データまたはサービス・クラスからデータ変更イベントを送信する必要がある場合は、対応するゲッター・メソッドを呼び出して、変更イベントに送信するインスタンスを取得します。

- getPropertyChangeSupport()

- getProviderChangeSupport()

データまたはサービス・クラスにpropertyChangeSupportまたはproviderChangeSupportの独自のインスタンスを含めるのではなく、必ず前述のゲッター・メソッドを使用してください。これにより、MAFアプリケーションのユーザー・インタフェースをリフレッシュするためにMAFクライアント・データ・モデルで使用される、組込みのランタイム・コードが壊れることを防ぎます。

デフォルトでは、各サービス・クラスには、データ・オブジェクトのリストを返すゲッター・メソッドがあります。たとえば、DepartmentServiceクラスには、次のような生成されたメソッドが含まれています。

public List<Department> getDepartment() {
return getEntityList();
}

MAFアプリケーションでRESTコールを行い、最新の部門リストを取得すると、MAFによって、サービス・クラスのEntityCRUDServiceスーパークラスからsetEntityListメソッドを呼び出すことで自動的にユーザー・インタフェースがリフレッシュされます。このメソッドにより、fireProviderRefreshメソッド・コールで使用されるプロパティ名を見つけるために、サービス・クラス内の別の生成済メソッド(getEntityListName)が呼び出されます。次の例では、DepartmentServiceクラスの、生成されたgetEntityListNameメソッドを示します。

protected String getEntityListName() {
return "department";
}

前述の実装は、次のことを意味します。

- 部門リストのコンテンツを変更するカスタム・ロジックを記述する場合は、setEntityListを呼び出して、コンテンツ変更内容でユーザー・インタフェースをリフレッシュできます。

- 生成されたメソッドgetDepartmentの名前をより適切な複数形名getDepartmentsに変更する場合は、メソッドgetEntityListNameを、departmentではなくdepartmentsを返すよう変更する必要もあります。そうしないと、標準のMAFクライアント・データ・モデル・リフレッシュ・コードが機能しなくなります。

- データ・オブジェクト・インスタンスのセットに複数のフィルタされたビューを提供するよう、サービス・クラスに独自のゲッター・リスト・メソッドを追加した場合は、RESTコールの完了時にユーザー・インタフェースにおいてフィルタ済リストもリフレッシュされるよう、setEntityListメソッドをオーバーライドできます。詳細は、「フィルタされたエンティティ・リストの使用」を参照してください。

データ変更イベントへのレスポンスでのフォームのリフレッシュ

データ・オブジェクト・インスタンスが1つのみ表示されるフォーム・レイアウト内のユーザー・インタフェースをリフレッシュするには、プロパティ変更イベントを使用する必要があります。これは、プロバイダ変更イベントではリスト・ビューのみがリフレッシュされるためです。各データ・クラスには、前述のようにプロパティ変更イベントを送信するためにPropertyChangeSupportインスタンスが含まれますが、データ・オブジェクト・インスタンス内の生成されたセッター・メソッドでは、デフォルトでは変更イベントは送信されません。getPropertyChangeSupport()メソッドを使用しさえすれば、自分でこのコードを追加できます。

public void setName(String name)
{
String oldValue = this.name;
this.name = name;
getPropertyChangeSupport().firePropertyChange("name", oldValue, name);;
}

データ・オブジェクト・インスタンスのすべてのプロパティ(属性)をリフレッシュする必要がある場合は、MAFの便利なメソッドEntityUtils.refreshEntityを使用することもできます。これは、その唯一の引数としてデータ・オブジェクト・インスタンスを取ります。

バックグラウンド・スレッドでのデータ変更の送信

バックグラウンド・スレッドでデータ変更イベントを送信する場合、AdfmfJavaUtilities.flushDataChangeEventを呼び出すことで、これらのデータ変更イベントをユーザー・インタフェース・レイヤーにフラッシュする必要があります。さらに、MAFでは、バックグラウンド・スレッドでのデータ変更イベントの送信時のデッドロックを防止するために、MafExecutorServiceを使用することが求められます。次の例では、MafExecutorServiceから実行メソッドを使用して、データ変更イベントを送信し、完了後にイベントをフラッシュする方法を示します。次の例では、Java 8 Lambda式を使用してコードを渡します。

public void setName(String name) {
String oldValue = this.name;
this.name = name;
if (AdfmfJavaUtilities.isBackgroundThread()) {
MafExecutorService.execute(() ->
{
getPropertyChangeSupport().firePropertyChange("name", oldValue, name);
AdfmfJavaUtilities.flushDataChangeEvent();

});
}
else {
getPropertyChangeSupport().firePropertyChange("name", oldValue, name);
}
}

リフレッシュする属性ごとに前述のコードを記述するかわりに、MAFクライアント・データ・モデルのEntityクラスによって提供されるrefreshUIメソッドを使用して、プロパティ変更イベントを送信できます。このメソッドは、次の例で示すように、データ変更イベントを送信する属性のリストを取ります。

List<String> attrs = new ArrayList<String>();
attrs.add("name");
attrs.add("managerId");
refreshUI(attrs);

refreshUIメソッドは、前述のMafExecutorServiceを使用し、バックグラウンド・スレッドでの実行時にデータ変更イベントをフラッシュします。

子データ・コレクションからのデータ変更によるユーザー・インタフェースのリフレッシュ

デフォルトでは、親データ・コレクションを返すRESTコールがMAFアプリケーションで実行されるときに、MAFクライアント・データ・モデルで子データ・コレクションへのデータ変更によりユーザー・インタフェースがリフレッシュされることはありません。このデフォルト動作により、RESTコールをトリガーするページに親データ・オブジェクトしか表示される可能性がないときに、子データ・オブジェクトがデータベースから読み取られてメモリーに読み込まれることがなくなるため、アプリケーションのパフォーマンスが最適化されます。データ・オブジェクトのクラス内のEntityクラスからrefreshUIメソッドをオーバーライドすることで、子データ・コレクションを含むようリフレッシュを拡張できます。次の例では、従業員の子データ・コレクションをリフレッシュする必要があるDepartmentクラス内でこれを行う方法を示します。

@Override
public void refreshUI(List attrsToRefresh)
{
getProviderChangeSupport().fireProviderRefresh("employees");
super.refreshUI(attrsToRefresh);
}

6.21 MAFアプリケーションでのオフライン・モードの強制

MAFでは、MAFアプリケーションを、それが実行されているデバイスがインターネットへの接続時にオフラインであるかのように構成できます。

これは、低速なネットワーク接続でのRESTコールを防止するために役立ちます。たとえば、それを使用することで、RESTコールを3G接続では防止し、Wi-Fi接続では許可するようにできます。

オフライン・モードを強制するには、次のメソッドを使用します。

new ConnectivityBean().setForceOffline(true);

注意:
ConnectivityBeanの新しいインスタンスを作成すると同時に、forceOfflineフラグの値が、すべてのインスタンスにわたり共有される、静的変数に保存されます。

これにより、ConnectivityBeanクラスをマネージドBeanとして使用して、ユーザー・インタフェースからオフライン・モードを強制/強制解除できるようになります。これは、MAFのデータ同期機能を示すデモで役立つ可能性があります。これを行うには、次のように、adfc-mobile-config.xmlファイル内でマネージドBeanを定義します。

<managed-bean id="__3">
<managed-bean-name>Connectivity</managed-bean-name>
<managed-bean-class>oracle.maf.api.cdm.controller.bean.ConnectivityBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

その後、次のように、AMXページにオフライン強制トグル・オプションを追加できます。

<amx:commandLink id="menFo" text="#{Connectivity.forceOffline ? 'Unforce offline' : 'Force offline'}">
<amx:setPropertyListener id="menfospl" from="#{!Connectivity.forceOffline}" to="#{Connectivity.forceOffline}"/>
</amx:commandLink>

MAFユーザー・インタフェース・ジェネレータを使用する方法で説明したとおり、「MAFユーザー・インタフェース・ジェネレータ」ウィザードで、図6-25に示すようにこのオプションを表示するメニュー・エントリを生成します。

図6-25 MAFユーザー・インタフェース・ジェネレータからのオフライン強制メニュー・エントリ

ネットワーク接続の程度に基づいてオフライン・モードを強制する必要がある場合は、MAFに事前にインストールされている、Cordovaネットワーク・プラグインを使用して、ConnectivityBean.forceOfflineメソッドを呼び出すJavaScriptコールバック・ハンドラを設定します。

6.22 バックグラウンド・タスクの実行のためのビジュアル・インジケータの使用

エンド・ユーザーが自分のMAFアプリケーションでバックグラウンド・タスクが実行されていることを把握できるようエンド・ユーザーに対してビジュアル・インジケータをレンダリングする方法を説明します。

MAFアプリケーションでスレッド・プール内の1つ以上のタスクが実行されている場合、MAFでは、Booleanフラグを保持する、スレッド・プールを介したすべてのバックグラウンドRESTコールでTrueが返されるようにします。このBooleanフラグの値にアクセスするには、次のEL式を使用します。

#{applicationScope.maf_bgtask_running}

MAFユーザー・インタフェース・ジェネレータを使用する方法で説明したとおり、「MAFユーザー・インタフェース・ジェネレータ」ウィザードにより、MAFアプリケーションでバックグラウンドでタスクが処理されるときに図6-26に示すようにビジュアル・インジケータを表示するよう作成したAMXページに次のエントリを生成します。

<amx:image id="bgRunImg" source="/images/reloading.gif" inlineStyle="margin-right:5px;"
rendered="#{applicationScope.maf_bgtask_running}"/>

図6-26 MAFユーザー・インタフェース・ジェネレータからのバックグラウンド・タスクのためのビジュアル・インジケータ

7 MAFアプリケーションでのOracle Mobile Cloud ServiceプラットフォームAPIの使用

この章では、Storage APIなどのOracle Mobile Cloud Service (MCS)プラットフォームAPIの使用方法、ユーザー情報の更新方法、およびMCSの分析機能と診断機能によって分析のためにMCSに分析および診断イベントを送信する方法を説明します。

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

- Oracle Mobile Cloud ServiceプラットフォームAPIの使用の概要

- Oracle Mobile Cloud Serviceユーザー情報へのアクセス

- Oracle Mobile Cloud Service記憶域コレクション内のファイルへのアクセス

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

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

7.1 Oracle Mobile Cloud ServiceプラットフォームAPIの使用の概要

MAFでは、Storage APIおよびAnalytics APIなどのMCSプラットフォームAPIのサポートが提供されます。また、MAFでは、MCSユーザー情報の更新、およびMCS Diagnosticsへの診断情報の送信もサポートされています。

これらのプラットフォームAPIのいずれかを使用するための最初の手順は、MCSへのMAFアプリケーションの接続です。これを行うには、「MCS接続」チェック・ボックスを選択し、クライアント・データ・モデルを作成するためにサービスに接続するときのモバイル・バックエンドIDおよび無名アクセス・キーを指定します。この作業の詳細は、「RESTサービスへの接続によるクライアント・データ・モデルの作成」を参照してください。接続詳細を指定するウィザードを完了すると、JDeveloperによって、アプリケーションのmobile-persistence-config.propertiesファイルに次のエントリが書き込まれます。

# MCS connection details, applicationScope EL Expressions
# are allowed for backend ID and anonymous key
mcs.connection=MCS
mcs.mobile-backend-id=bcda8418-8c23-4d92-b656-9299d691e120
mcs.anonymous-key=c3RldmVuLmtpbmc6U3RhYWYyMDE1IQ==

アプリケーションがMCSで認証される前にMCSプラットフォームAPIまたはカスタムAPIにアクセスすると、アクセス・キーによってAuthorizationヘッダーが作成されます。MCSに対して認証されると、MAFによって、ユーザー・ログイン資格証明に基づいてすべてのRESTコールにAuthorizationヘッダーが自動的に挿入されます。つまり、mobile-persistence-config.propertiesファイル内で指定されている無名アクセス・キーは無視されます。このキーの詳細は、「MCS無名アクセス・キーに関する必知事項」を参照してください。

oracle.maf.api.cdm.persistence.manager.MCSPersistenceManagerクラスは、MCSプラットフォームAPIへのすべてのコールを処理します。デフォルトでは、mobile-persistence-config.propertiesファイル内の設定が使用されますが、カスタム・コードで次のメソッドを呼び出すことで、このファイル内の設定をオーバーライドできます。

- setConnectionName(String connectionName)

- setMobileBackendId(String mobileBackendId)

- setAnonymousKey(String anonymousKey)

- setAuthHeader(String authHeader)

- login(String userName, String password)

アプリケーションで動的MCS接続をサポートする必要がある場合は、mobile-persistence-config.propertiesファイル内のmcs.mobile-backend-id値およびmcs.anonymous-key値のためにEL式を指定できます。MCS接続の実際のURLは、AdfmfJavaUtilities.overrideConnectionPropertyメソッドを使用して実行時に変更できます。次のサンプル・コードでは、ユーザー・プリファレンスに基づいてMCS接続URLを動的に設定する方法を示します。

String mcsHost = (String)AdfmfJavaUtilities.evaluateELExpression("#{preferenceScope.application.connection.host}");
AdfmfJavaUtilities.clearSecurityConfigOverrides("MCS");
AdfmfJavaUtilities.overrideConnectionProperty("MCS", "restconnection", "url", mcsHost+"/mobile");

「MAFアプリケーションでのライフサイクル・リスナーの使用方法」で説明しているように、通常は、アプリケーション・ライフサイクル・リスナーのstart()メソッドにこのコードを含めます。AdfmfJavaUtilities.overrideConnectionPropertyメソッドの使用の詳細は、「実行時に名前付き接続の接続属性を更新する方法」を参照してください。

7.2 Oracle Mobile Cloud Serviceユーザー情報へのアクセス

MAFのMCSPersistenceManagerには、ユーザーをMCSでログインおよびログアウトさせるため、ならびにユーザー情報を取得および更新するためのメソッドが用意されています。

MCSにプログラムでログインするには、次のメソッドを使用します。

String response = new MCSPersistenceManager().login(userName, password);

これにより、MCSからレスポンス・ペイロードが返されます。ご参考までにこのメソッドを説明しますが、ユーザー認証には、MAFの宣言サポートを使用することをお薦めします。後者のオプションでは、基本認証またはOAuthを使用できます。安全な方法でユーザー名およびパスワードを思い出すためのオプションも用意されています。また、MAF機能を保護することで、保護されている機能にユーザーが初めてアクセスしたときに、ログイン画面が自動的に表示されます。

MCSからプログラムでログアウトするには、次のメソッドを使用します。

String response = new MCSPersistenceManager().logout();

この場合もやはり、アプリケーションを保護するためには、MAFの宣言サポートを使用することをお薦めします。MAFの宣言サポートを使用する場合は、次のMAF APIコールを使用してログアウトする必要があります。

AdfmfJavaUtilities.logout();

ユーザー認証のためのMAFの宣言サポートの詳細は、「MAFアプリケーションの保護」を参照してください。

MCSに格納されたユーザーのすべての属性を取得するには、次のメソッドを使用します。

String response = new MCSPersistenceManager().findUser(userName);

それにより、次のようなレスポンス・ペイロードが返されます。

{
"id": "a8acf41f-50a7-473e-8376-d6346cf188be",
"username": "GEVANS",
"email": "george.evans@ebsss.com",
"firstName": "George",
"lastName": "Evans",
"jobTitle": "Cloud Solutions Architect",
"links": [
{
"rel": "canonical",
"href": "/mobile/platform/users/GEVANS"
},
{
"rel": "self",
"href": "/mobile/platform/users/GEVANS"
}
]
}

注意:
MCSでユーザー・レルムのために定義されているカスタム属性も返されます。上の例では、jobTitleはカスタム属性の例です。

次のメソッドでユーザー属性を更新します。

String response = new MCSPersistenceManager().updateUser(userName, payload);

渡すペイロードは、変更する必要がある属性のリストです。たとえば、次のようになります。

{
"email" : "gevans@ebsss.com",
"jobTitle": "Senior Cloud Solutions Architect"
}

7.3 Oracle Mobile Cloud Service記憶域コレクション内のファイルへのアクセス

MAFアプリケーション内のMCS記憶域コレクションから記憶域オブジェクトを取得、ダウンロードおよびフィルタする方法を説明します。

MAFでは、MCS Storage APIへのプログラムによるアクセスと宣言によるアクセスが提供されます。宣言によるアクセスを使用するには、oracle.maf.api.cdm.mcs.storage.StorageObjectServiceからBeanデータ・コントロールを作成します。生成されたデータ・コントロールには、記憶域コレクション内のファイルにアクセスするための幅広い操作が用意されています。StorageObjectServiceクラスにプログラムでアクセスすることもできます。ファイルの取得に加えて、MCS記憶域コレクション内のファイルを作成および更新することや、MCS記憶域ファイルをデータ・オブジェクトに関連付けることができます。たとえば、MCSからの小さいサムネイル従業員画像とともに従業員を表示するリスト・ページを作成し、そこから、写真のある従業員フォーム・ページに移動できます。その写真は、エンド・ユーザーが新しい写真を撮ることで更新できます。オフライン・サポートは記憶域オブジェクト・メタデータとして十分に実装され、ファイルはデバイス上に格納されます。記憶域オブジェクトは、オフライン・モードで作成および更新できます。MAFアプリケーションからのオフライン・トランザクションの同期で説明されているように、MAFでは、デバイスがオンラインに戻るとこれらのオブジェクトをMCSと同期します。

ここで説明したユースケースの実装の詳細は、次を参照してください。

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

- StorageObject Beanデータ・コントロールの作成時の処理内容

- Oracle Mobile Cloud Service記憶域コレクションからのすべてのファイルの取得方法

- MCS記憶域コレクションからの記憶域オブジェクトのリストのフィルタ方法

- Oracle Mobile Cloud Service記憶域コレクションからの単一ファイルの取得方法

- MAFアプリケーション内のデータと記憶域オブジェクトを関連付ける方法

7.3.1 StorageObjectService Beanデータ・コントロールの作成方法

MCS記憶域コレクション内のオブジェクトを取得および管理するために使用できる、StorageObjectServiceデータ・コントロールを作成および使用する方法を説明します。

StorageObjectService Beanデータ・コントロールを作成するには、次の手順を実行します。

1. 「アプリケーション」ウィンドウで既存のプロジェクトを選択し、メインメニューで「ファイル」、次に「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「ビジネス層」を展開し、「データ・コントロール」、「Beanデータ・コントロール」の順に選択し、「OK」をクリックします。

3. 「Beanクラスの選択」ダイアログで、検索アイコンをクリックして「クラス・ブラウザ」ダイアログを表示し、「クラス名を一致」入力フィールドにStorageObjectServiceと入力します。
図7-1で示すように、JDeveloperにより、oracle.maf.api.cdm.mcs.storage.StorageObjectServiceクラスが取得されます。

Figure 7-1 クラス・ブラウザでのStorageObjectService

4. 「OK」をクリックします。
JDeveloperで、「Beanクラスの選択」ダイアログにデータ・コントロールの名前としてStorageObjectServiceが指定されます。

5. 「次へ」および「終了」をクリックします。

7.3.2 StorageObject Beanデータ・コントロールの作成時の処理内容

JDeveloperでは、「データ・コントロール」パネルでStorageObjectServiceデータ・コントロールが生成されます。

図7-2 生成されたStorageObjectServiceデータ・コントロール

通常は、複数ファイルの集まりまたは単一ファイルをダウンロードおよび表示するために、このデータ・コントロールが公開するメソッドを使用します。次のpersistence-mapping.xmlファイルからの例に示すように、StorageObjectマッピング・ディスクリプタのremoteReadInBackgroundプロパティがtrueに設定されている場合は、記憶域オブジェクトを取得するためにMAFアプリケーションがMCSに対して行うRESTコールは、バックグラウンドで実行されます。同様に、remoteWriteInBackgroundプロパティがtrueに設定されている場合は、MCS内の記憶域オブジェクトを作成または更新するための、MAFアプリケーションからのRESTコールは、バックグラウンドで実行されます。

永続性マッピングの編集ウィザードを使用してこれらのプロパティを変更することはできません。かわりに、persistence-mapping.xmlファイル内で直接これらのプロパティを編集します。このファイルは、アプリケーションのワークスペースのApplicationController\src\META-INFディレクトリにあります。

<classMappingDescriptor className="oracle.maf.api.cdm.mcs.storage.StorageObject" persisted="true">
<crudServiceClass className="oracle.maf.api.cdm.mcs.storage.StorageObjectService" autoIncrementPrimaryKey="true"
localPersistenceManager="oracle.maf.api.cdm.persistence.manager.DBPersistenceManager"
remotePersistenceManager="oracle.maf.impl.cdm.persistence.manager.MCSStoragePersistenceManager"
remoteReadInBackground="true"
remoteWriteInBackground="true"
showWebServiceInvocationErrors="true"
autoQuery="false"
enableOfflineTransactions="true"/>
<table name="STORAGE_OBJECT">
<primaryKeyColumn name="ID"/>
<primaryKeyColumn name="COLLECTION_NAME"/>
</table>
<attributeMappings>

7.3.3 Oracle Mobile Cloud Service記憶域コレクションからのすべてのファイルの取得方法

MCSからすべての記憶域オブジェクトを取得するための、StorageObjectServiceデータ・コントロールで公開されるメソッドの使用方法を説明します。

図7-3には、従業員のコレクション内の各従業員のサムネイル画像をレンダリングするためにどのようにStorageObjectServiceデータ・コントロールからのfindAllStorageObjectsInCollection(String)メソッドを使用できるかを示します。このメソッドをAMXページにドラッグ・アンド・ドロップし、表示されるコンテキスト・メニューで「MAFパラメータ・フォーム」を選択します。これにより、コレクション名のための入力フィールド、およびメソッドを実行するためのボタンが作成されます。メソッドを実行すると、データ・コントロールのstorageObjectsコレクションによってコレクションのコンテンツが移入されます。その後、たとえば「MAFリスト・ビュー」として、storageObjectsコレクションをAMXページにドラッグ・アンド・ドロップできます。

図7-3 リスト・ビュー内のMCS記憶域コレクションからの画像ファイル

別の方法としては、findAllStorageObjectsInCollectionメソッドをメソッド・アクティビティとしてタスク・フローにドラッグ・アンド・ドロップし、このアクティビティから、コレクションのコンテンツを表示するAMXページにコントロール・フロー・ルールを追加できます。このドラッグ・アンド・ドロップを実行する場合は、collectionNameパラメータの値を提供する必要があります。提供する値は、ハードコードするかEL式にできます。

storageObjectsコレクションには最初はSQLiteデータベースからのローカル記憶域オブジェクトが移入されており、MCSへのコールはバックグラウンドで実行され、MCSの結果が返されるとUIがリフレッシュされます。

図7-3には、リスト項目ごとに画像を表示するためにどのように記憶域ファイルを使用するかを示します。これを行うには、amx:image要素のソース属性を、記憶域オブジェクトのfilePath属性の値に設定します。filePath属性には、モバイル・デバイス上のダウンロード済ファイルへの参照が保持されます。

<amx:image source="#{row.filePath}" inlineStyle="width:40px;height:40px;"  id="i1"/>

findAllStorageObjectsInCollectionメソッドでは、各記憶域オブジェクトのメタデータが返されます。画像ファイルをダウンロードするには、記憶域オブジェクトのdownloadIfNeededInBackground属性をoutputText要素としてドラッグ・アンド・ドロップします。実行時に、MAFアプリケーションによって、StorageObjectクラスのgetDownloadIfNeedInBackgroundメソッドが呼び出されます。このメソッドでは、空文字列が返され、画像ファイルのダウンロードがトリガーされます。事前にファイルがダウンロードされている場合は、MAFでは、MCS内の記憶域オブジェクトのETagに、SQLiteデータベースに格納されているローカルETagと同じ値があるかどうかを確認するために、最初にHEADコールが行われます。値が異なる場合は、MAFによってファイルがダウンロードされます。次のサンプルでは、図7-3で示すリスト・ビューをレンダリングする、listViewコンポーネントのコードを示します。

MAFですべての画像ファイルがダウンロードされるまでページを読み込まないようにする場合は、かわりにdownloadIfNeeded属性をドラッグ・アンド・ドロップします。

<amx:listView var="row" value="#{bindings.storageObjects.collectionModel}"
fetchSize="#{bindings.storageObjects.rangeSize}"
selectedRowKeys="#{bindings.storageObjects.collectionModel.selectedRow}"
initialScrollRowKeys="#{bindings.storageObjects.collectionModel.selectedRow}"
selectionListener="#{bindings.storageObjects.collectionModel.makeCurrent}"
showMoreStrategy="autoScroll" bufferStrategy="viewport" id="lv1">
<amx:listItem id="li1" rendered="#{row.contentType=='image/jpeg'}">
<amx:tableLayout width="100%" id="tl1">
<amx:rowLayout id="rl2">
<amx:cellFormat width="40px" halign="center" rowSpan="2" id="cf6">
<amx:image source="#{row.filePath}" inlineStyle="width:40px;height:40px;" id="i1"/>
<amx:outputText value="#{row.downloadIfNeededInBackground}" id="ot6"/>
</amx:cellFormat>
<amx:cellFormat width="60%" height="#{deviceScope.device.os=='Android'?'36':'32'}px" id="cf4">
<amx:outputText value="#{row.name}" id="ot4"/>
</amx:cellFormat>
<amx:cellFormat width="10px" rowSpan="2" id="cf3"/>
<amx:cellFormat width="40%" halign="end" id="cf5">
<amx:outputText value="#{row.contentType}" styleClass="adfmf-listItem-highlightText" id="ot5"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl1">
<amx:cellFormat width="60%" height="#{deviceScope.device.os=='Android'?'22':'19'}px" id="cf1">
<amx:outputText value="#{row.createdOn}" styleClass="adfmf-listItem-captionText" id="ot2"/>
</amx:cellFormat>
<amx:cellFormat width="40%" halign="end" id="cf2">
<amx:outputText value="#{row.ETag}" styleClass="adfmf-listItem-captionText" id="ot3"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

7.3.4 MCS記憶域コレクションからの記憶域オブジェクトのリストのフィルタ方法

StorageObjectServiceでMCS記憶域コレクションから取得する記憶域オブジェクトのリストをフィルタする方法を説明します。

StorageObjectService APIでは、MCS記憶域コレクション内のすべてのオブジェクト、または1つのオブジェクトのみの取得がサポートされています。すべての記憶域オブジェクト・メタデータを格納するSQLiteデータベースを使用することで、デバイス上の結果をフィルタできます。これを行うには、oracle.maf.api.cdm.mcs.storage.StorageObjectServiceから拡張する、サブクラスを作成します。フィルタされたエンティティ・リストの使用で説明されている、MAFアプリケーション内のデータ・オブジェクトをフィルタするためにサービス・オブジェクト・クラス内に記述するコードのように、取得した記憶域オブジェクトをフィルタするこのサブクラス内にコードを記述します。

oracle.maf.api.cdm.mcs.storage.StorageObjectService.から拡張する、作成したサブクラスからデータ・コントロールを生成します。

7.3.5 Oracle Mobile Cloud Service記憶域コレクションからの単一ファイルの取得方法

MCSから単一の記憶域オブジェクトを取得およびダウンロードするためにStorageObjectServiceデータ・コントロールで公開される、findStorageObjectメソッドの使用方法を説明します。

findStorageObjectメソッドは、次の2つのパラメータを取ります。

- MCS内のコレクションの名前

- 記憶域オブジェクトのID

findStorageObjectメソッドをMAFパラメータ・フォームとしてドラッグ・アンド・ドロップし、それら2つのパラメータのための入力フィールド、およびメソッドを実行するためのボタンを作成します。このメソッドの結果StorageObjects要素をAMXページに、たとえばMAF読取り専用フォームとしてドラッグ・アンド・ドロップできます。

ダウンロードする記憶域オブジェクトが画像の場合は、次の例で示すように、filePath属性をoutputTextコンポーネントとしてドラッグ・アンド・ドロップしてから、それをイメージ・コンポーネントに変更します。

<amx:image id="i1" source="#{bindings.filePath.inputValue}" inlineStyle="height:200px;"/>

図7-4には、MAFアプリケーションのUIにレンダリングする画像ファイルをfindStorageObjectメソッドによってダウンロードしたAMXページを示します。

図7-4 画像ファイルをダウンロードするfindStorageObjectメソッド

7.3.6 MAFアプリケーション内のデータと記憶域オブジェクトを関連付ける方法

MCS記憶域コレクションから記憶域オブジェクトを取得し、それをMAFアプリケーション内のデータ・オブジェクトと関連付けるために、StorageObjectServiceおよびStorageObjectクラスを使用するJavaコードを記述する方法を説明します。

カメラなど、MAFアプリケーションのデバイス機能を使用して取得できるデータによって、レコードのバックエンド・システムから既存データを強化することは、MAFアプリケーション構築時によくある要件です。次のコード例では、どのようにMCS記憶域コレクションから取得される写真と従業員データを関連付けることができるかを説明します。

デフォルト・コンストラクタを使用してStorageObjectServiceクラスのインスタンスを作成するか、あるいは、アプリケーションのpersistence-mapping.xmlファイル内で設定されているremoteReadInBackGroundおよびremoteWriteInBackgroundの値をオーバーライドできるようにするコンストラクタを使用できます。これはJavaコード内では簡単なため、RESTコールの結果を直接使用します。

次のコード例では、後者のコンストラクタを使用して、MCS記憶域コレクション内のすべての記憶域オブジェクトを取得する方法を示します。

StorageObjectService sos = new StorageObjectService(false,false);
sos.findAllStorageObjectsInCollection("HR");
List<StorageObject> storageObjects = sos.getStorageObjects();

次のコード例では、従業員の写真を従業員リスト・ビューおよびフォーム・ページに追加するJavaコードを示します。このページでは、従業員データはカスタムMCS APIで取得され、MCS記憶域コレクション(HR)で写真が格納されます。このサンプル・コードでは、デバイスのカメラを使用して新しい従業員のための写真を追加する方法も示します。

現在の従業員に写真を関連付けるために、従業員の写真に対して次のネーミング規則を使用します。

EmpImg[EmployeeID suffix]
// Example: EmpImg100

まず、次のゲッター・メソッドおよびセッター・メソッドを使用して、タイプStorageObjectの画像プロパティをEmployeeデータ・オブジェクトに追加します。

private StorageObject picture;

public StorageObject getPicture() {
if (picture == null) {
StorageObjectService sos = new StorageObjectService(false, false);
picture = sos.findOrCreateStorageObject("HR", "EmpImg" + getId());
picture.setDownloadCallback(() -> {
refreshUI(Arrays.asList(new String[]{"picture"}));
});
picture.getDownloadIfNeededInBackground();
}
return picture;
}

public void setPicture(StorageObject picture) {
this.picture = picture;
}

ゲッター・メソッドでは、写真StorageObjectがまだnullかどうかを確認します。そのとおりの場合は、StorageObjectServiceをインスタンス化し、findOrCreateStorageObjectメソッドを呼び出します。このメソッドには、MCSコレクションの名前、およびMCSコレクション内の従業員写真ファイルのIDを渡します。このメソッドは、ローカルのオンデバイス・データベースに照会し、STORAGE_OBJECTテーブルに一致行がある場合に記憶域オブジェクトを返します。行が見つからない場合は、そのコレクション名とオブジェクトIDを設定して、新しいStorageObjectインスタンスが作成されます。次に、従業員の写真をダウンロードした後にUIをリフレッシュできるようになる、コールバック(setDownloadCallback(() ->)を指定します。最後に、getDownloadIfNeededInBackgroundメソッドを呼び出します。このメソッドは、MCSを呼び出して、ファイルをダウンロードし、必要な場合に記憶域オブジェクト・メタデータを更新します。

注意:
事前にファイルがダウンロードされている場合は、MAFでは、MCS内の記憶域オブジェクトのETagに、SQLiteデータベースに格納されているローカルETagと同じ値があるかどうかを確認するために、最初にHEADコールが行われます。値が変更されている場合は、ファイルがダウンロードされます。

デバイス上のファイルのダウンロード場所は、アプリケーション・ディレクトリ(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.ApplicationDirectory)によって返される値)の下の/MCS/[collectionName]という名前のサブディレクトリです。ファイルの名前は、MCS内の記憶域オブジェクトの名前、またはMCSで名前が設定されていない場合はIDとなります。StorageObjectのsetDirectoryPath(String directoryPath)メソッドを呼び出すことで、デフォルトのダウンロード・ディレクトリをオーバーライドできます。

これで写真StorageObjectがEmployeeクラスに追加されたため、図7-5に示すように、写真filePathプロパティをドラッグ・アンド・ドロップして、画像を部門内の従業員のリストに追加できます。

図7-5 ListViewへの画像の追加

始めてDepartmentページに移動したときには、従業員の写真が表示されるまでに少し時間がかかります。部門内の従業員ごとに、MCSから写真をフェッチするためにバックグラウンドで並列RESTコールが行われます。次回のアプリケーション実行時には、画像はすぐに表示されます。

図7-6で示すようにRESTコールの結果が404 Not Foundレスポンスとなったために、従業員の写真がまだMCS内にない場合は、デフォルトではエラー・メッセージが表示されます。

図7-6 Webサービス・エラー・メッセージ

図7-6で示すようなWebサービス起動エラー・メッセージがエンド・ユーザーに表示されないようにするには、次の例で示すように、StorageObjectディスクリプタのためにpersistence-mapping.xml内のshowWebServiceInvocationErrorsプロパティをfalseに設定します。

<classMappingDescriptor className="oracle.maf.api.cdm.mcs.storage.StorageObject" persisted="true">
<crudServiceClass className="oracle.maf.api.cdm.mcs.storage.StorageObjectService"
autoIncrementPrimaryKey="true"
localPersistenceManager="oracle.maf.api.cdm.persistence.manager.DBPersistenceManager"
remotePersistenceManager="oracle.maf.impl.cdm.persistence.manager.MCSStoragePersistenceManager"
remoteReadInBackground="true" remoteWriteInBackground="true"
showWebServiceInvocationErrors="false"
autoQuery="false" enableOfflineTransactions="true"/>

従業員の新しい写真をアップロードするには、従業員フォーム・ページにcommandLinkコンポーネントを追加します。このページでは、カメラを使用して写真を撮るか写真ギャラリから既存の写真を選択するマネージドBeanメソッドが呼び出されます。次の例では、そのようなマネージドBeanメソッドについて、想定される実装を示します。

public void takePicture(ActionEvent actionEvent) {
DeviceManager device = DeviceManagerFactory.getDeviceManager();
int cameraType =
device.hasCamera() ? DeviceManager.CAMERA_SOURCETYPE_CAMERA: DeviceManager.CAMERA_SOURCETYPE_PHOTOLIBRARY;
String picture = device.getPicture(50, DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI, cameraType, false,
DeviceManager.CAMERA_ENCODINGTYPE_PNG, 520, 380);
Employee emp =
(Employee) AdfmfJavaUtilities.getELValue("#{bindings.employeesIterator.currentRow.dataProvider}");
// the camera returns an URI starting with file://, we remove this prefix to get proper file path
emp.addPicture(picture.substring(7));
}

写真を撮った後、従業員の現在のインスタンスを取得し、次の例で示すように、このインスタンス上でaddPictureメソッドを呼び出します。

public void addPicture(String tempFilePath) {
StorageObjectService sos = new StorageObjectService();
StorageObject so = sos.findOrCreateStorageObject("HR", "EmpImg" + getId());
so.setContentType("image/png");
try {
so.setContentStream(new FileInputStream(tempFilePath));
sos.saveStorageObject(so);
setPicture(so);
// remove picture from temporary camera directory
new File(tempFilePath).delete();
}
catch (FileNotFoundException e) {
sLog.severe("Employee picture file not found");
}
}

getPictureメソッドと同様に、addPictureでは、まずfindOrCreateStorageObjectメソッドを呼び出すことでStorageObjectインスタンスを取得します。次に、contentTypeおよびcontentStreamを設定し、StorageObjectService上でsaveStorageObjectメソッドを呼び出します。このメソッドでは、SQLiteデータベース内に記憶域オブジェクト・メタデータを保存し、写真をファイル・システムにストリームし、MCSを呼び出してファイルをHR MCS記憶域コレクションに追加します。ファイルを保存した後、ディスク領域を解放するために、デバイス・カメラによって作成された一時ファイルを削除できます。

注意:
カメラでファイルURIを返すかわりに、DeviceManager.CAMERA_DESTINATIONTYPE_DATA_URLをdestinationTypeの値として使用することで、Base64でエンコードされた文字列として画像を取得することもできます。この場合は、高品質な写真を撮ると、写真全体がメモリーに読み込まれ、OutOfMemoryエラーでモバイル・アプリケーションがクラッシュする可能性か高いため、これはお薦めできません。

従業員の写真を削除するには、removePictureメソッドをEmployeeクラスに追加し、このメソッドをEmployeeフォーム・ページにボタンまたはリンクとしてドラッグ・アンド・ドロップします。

public void removePicture() {
StorageObjectService sos = new StorageObjectService();
StorageObject so = sos.findOrCreateStorageObject("HR", "EmpImg" + getId());
sos.removeStorageObject(so);
// get new "empty" storageObject and refresh UI
so = sos.findOrCreateStorageObject("HR", "EmpImg" + getId());
setPicture(so);
refreshUI(Arrays.asList(new String[]{"picture"}));
}

removeStorageObjectメソッドで、SQLiteデータベース内の記憶域オブジェクト行が削除され、ファイル・システムからファイルが削除され、MCSを呼び出してMCSコレクションからファイルが削除されます。

StorageObjectおよびStorageObjectServiceの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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

MCSでホストされる1つ以上のモバイル・バックエンド(MBE)を持つMAFアプリケーションは、アプリケーションの使用状況に関する分析情報をMCS Analyticsに送信できます。

MAFがMCSに送信するために生成する分析情報は、アプリケーションのライフサイクルとエンド・ユーザーのMAFアプリケーションとの相互作用に関する情報を提供します。MAFでは、分析イベントをMAFフレームワーク・イベントとビジネス・イベントに分類します。MAFフレームワーク・イベントのレスポンスとして取得された情報をMCSに送信するには、アプリケーションのlogging.propertiesファイルでプロパティを構成します。MAFフレームワーク・イベントの例には、アプリケーションの起動、アクティブ化や機能ナビゲーションなどの機能イベント、ユーザー認証イベントなどがあります。分析情報をMCSに送信するようにアプリケーションを構成している場合、MAFではこれらのイベントをデフォルトで記録します。

次の例は、エンド・ユーザーが保護されたアプリケーション機能(secure-feature-1およびsecure-feature-2)に移動する前に、ログイン・アプリケーション機能(LF1)にリダイレクトされたときに発生するFeatureNavigation MAFフレームワーク・イベントについて、MAFが生成し、MCSに転送するペイロードを示しています。MAFでは、分析情報を送信するように構成されているMAFアプリケーションがアクティブ化されたときに開始するセッション内のすべてのMAFフレームワーク・イベントを記録します。MAFアプリケーションが非アクティブ化されるとセッションが終了します。次の例では、sessionIDプロパティによってセッションが示されています。

MAFアプリケーションをデバッグ・モードでデバイスにデプロイしている場合、JDeveloperの「ログ」ウィンドウにこのペイロードが表示されます。

"name":"FeatureNavigation", "properties":{"SourceId":"null","DestinationId":"LF1"}, "type":"custom", "timestamp":"2015-11-06T20:35:27.384Z",
"sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"

"name":"FeatureNavigation", "properties":{"SourceId":"LF1","DestinationId":"secure-feature-1"}, "type":"custom",
"timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"

"name":"FeatureNavigation", "properties":{"SourceId":"secure-feature-1","DestinationId":"secure-feature-2"}, "type":"custom",
"timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"

ビジネス・イベントは、ユーザー(アプリケーション開発者)がアプリケーションで定義するイベントです。ユーザーは、MAFのoracle.maf.api.analytics.AnalyticsUtilitiesで提供されているAPIを使用して、イベントの分析情報を取得します。MAFでは、ApplicationFeaturesデータ・コントロールでデータ・コントロール・メソッド(fireEventListener)も公開しています。このデータ・コントロール・メソッドをAMXページにドラッグ・アンド・ドロップして、定義したイベントをリスニングするようにメソッドを構成できます。これらのAPIを使用して、MAFフレームワーク・イベントからMCSに分析を送信することもできます。

MAFでは、コンテキスト・イベント情報(デバイス・モデル、国、タイムゾーンなど)をMCSまたはその他の希望するリポジトリに送信することもできます。

MCS以外のリポジトリに分析を送信することもできます。

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

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

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

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

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

- 分析情報を取得するMAFフレームワーク・イベント(MAFで提供されるMAFフレームワーク・イベントについて説明します。)

- 拡張およびカスタマイズできるoracle.maf.api.analyticsパッケージのクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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

MAFでは、新しいMAFアプリケーションのlogging.propertiesファイルに、MAFアプリケーションからMCS Analyticsに分析情報を送信するように構成する必要があるプロパティを移入します。

次の例は、新しいMAFアプリケーションの作成時にlogging.propertiesファイルに含まれている、すぐに使用できるエントリを示しています。

# Configure the analytics logger
# Analytics events are logged only if oracle.maf.api.analytics.level=ALL
# Set to OFF or any level other than ALL to disable analytics
oracle.maf.api.analytics.level=ALL
oracle.maf.api.analytics.handlers=oracle.maf.api.analytics.LoggerAnalyticsHandler, oracle.maf.api.analytics.McsAnalyticsHandler
oracle.maf.api.analytics.custom.level=INFO
oracle.maf.api.analytics.LoggerAnalyticsHandler.level=INFO

# Configure MCSHandler
oracle.maf.api.analytics.McsAnalyticsHandler.level=INFO
oracle.maf.api.analytics.McsAnalyticsHandler.connectionId=Mcs_Connection_Id
oracle.maf.api.analytics.McsAnalyticsHandler.batchSize=25
oracle.maf.api.analytics.McsAnalyticsHandler.offlineWrite=false
oracle.maf.api.analytics.McsAnalyticsHandler.recordUsername=false
oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider

前述の例に示したプロパティの中で、connectionIdのみが必須です。表7-1では、オプション・プロパティについて説明しています。connectionIdプロパティでは、MCS MBEへの有効な接続を定義します。アプリケーションのconnection.xmlで定義したconnectionIdを、このプロパティの値として使用してください。有効なconnectionIdを指定しない場合、MAFからMCSにイベントが送信されません。かわりに、MAFでは、デバイスで許可されるイベントの最大数に達するまで、これらのイベントをディスクに追加します。

アプリケーションのconnection.xmlファイルの有効なconnectionIdでは、MAFアプリケーションのMBEへの登録時に生成されるMBEのID (oracle-mobile-backend-id)とアプリケーション・キー(oracle-mobile-application-key)が使用されます。MAFは、MCSへの接続を作成するHTTPヘッダーにこれら2つの値を追加します。これらの値は、MAFアプリケーションが分析イベントを送信するMBEと、分析イベントの発生元のアプリケーションを識別します。

注意:
3つすべてのプラットフォーム(Android、iOSおよびユニバーサルWindowsプラットフォーム)について、MCSでMAFアプリケーションをクライアントとして登録する必要はありません。1つのプラットフォームについてMAFアプリケーションを登録し、生成されたアプリケーション・キーをoracle-mobile-application-keyの値として使用します。

MCS MBEへの接続でHTTP基本認証タイプを使用している場合は、oracle/wss_http_token_client_policyを接続に関連付けます。Oauthを使用する接続の場合は、oracle/http_oauth2_token_mobile_client_policyを接続に関連付けます。正しいポリシーを接続に関連付けないと、MAFでMCSに分析イベントがフラッシュされません。セキュリティ・ポリシーの接続との関連付けの詳細は、「セキュアなWebサービスへのアクセス」を参照してください。

次の例は、前述のプロパティの値が設定されたアプリケーションのconnections.xmlファイルの抜粋を示しています。

<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="Mcs_Connection_Id" className="oracle.adf.model.connection.url.HttpURLConnection"
adfCredentialStoreKey="McsLoginConn" xmlns="">
...
<RefAddresses>
<XmlRefAddr addrType="Mcs_Connection_Id">
<Contents>
<urlconnection name="Mcs_Connection_Id" url="http://mcs_instance.oracle.com:7201"/>
...
</Reference>
<Reference name="McsLoginConn" className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="McsLoginConn" partial="false" manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://mcs_instance.oracle.com:7201/mobile/platform/users/login"/>
<logout url="http://mcs_instance.oracle.com:7201/mobile/platform/users/logout"/>
<customAuthHeaders>
<header name="oracle-mobile-backend-id" value="0e4a9dfa-046a-4aaa-b8dd-331044ad81f4"/>
<header name="oracle-mobile-application-key" value="be53201a-8674-48d7-96d0-bb02f4cd06c5"/>
</customAuthHeaders>
...
</References>

logging.propertiesファイルで次のオプション・エントリを構成して、説明されている機能を実装します。

表7-1 MAFアプリケーションからの分析の転送を管理するためのオプション・プロパティ

プロパティ

説明

batchSize

MAFアプリケーションが関連付けられているMCSインスタンスにイベントを送信する前に、ローカルに保存されるイベントの数を決定するオプションのプロパティ。イベントはバッチでMCSにアップロードされます。最大バッチ・サイズの制限(65)があります。batchSizeが指定されないか、上限の65を超えている場合は、デフォルトのbatchSizeの25が適用されます。

offlineWrite

イベントのオフライン・バッファリングを有効にするかどうかを決定するオプションのプロパティ。デバイスがオフラインであるか、クライアントがMCSとの接続を確立できないときに、イベントが生成される場合があります。そのようなイベントが失われないようにするには、offlineWriteプロパティを構成します。接続が再確立されると、保存されたこれらのイベントがMAFによってMCSにフラッシュされます。offlineWriteプロパティは、そのようなイベントをディスクにキャッシュして、オフラインの間バッファリングできるようにします。MAFでは、最大250個のイベントがサポートされます。イベントはローリング方式で保存されます。つまり、MAFには最後の250個のイベントが保存されます。このため、常に最新のイベントがオフラインでバッファリングされます。MAFでは、batchSizeに達しているかどうかにかかわらず、アプリケーションが非アクティブ化された場合にもMCSにイベントをフラッシュします。デフォルトでは、offlineWriteは無効になっています。有効にするには、Trueに設定してください。

recordUsername

ユーザー名を取得するかどうかを決定するオプションのプロパティ。Trueに設定すると、ユーザーが保護された機能にログインしたときに、MAFによってユーザー名が取得されます。アプリケーションに保護された機能が含まれていない場合、またはユーザーが保護された機能にログインしていない場合は、ユーザー名はnullのままになります。アプリケーションに保護された機能が複数含まれている場合は、その機能にログインするために使用された資格証明(ユーザー名)に基づいてユーザー名が更新されます。取得されたユーザー名は、コンテキスト・イベントのフィールドの1つとして送信されます。したがって、ユーザー名を取得する予定の場合は、recordUsernameプロパティがTrueで、contextProviderClassNameにコンテキスト・イベントを生成するための有効なクラス名が指定されるようにlogging.propertiesを構成してください。たとえば、oracle.maf.api.analytics.McsAnalyticsHandler.recordUsername=trueです。

contextProviderClassName

オプション設定です。コンテキスト・イベントが生成されたときに、このプロパティの値を指定します。指定する値によって、MCSのコンテキスト・イベントを生成するクラスが決定されます。コンテキスト・イベントには、タイムゾーン・オフセット、地理的位置、デバイス情報などの情報が含まれます。recordUsernameがTrueに設定されている場合は、ユーザー名が含まれることもあります。contextProviderClassNameプロパティは、デフォルトでは無効になっています。次の例は、このプロパティを有効にする方法を示しています。oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider

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

MAFでは、MCSにイベントを送信するために使用できるAPIをoracle.maf.api.analytics.AnalyticsUtilitiesで提供しています。

AnalyticsUtilitiesクラスは、次のAPIを提供します。

public static void fireEvent(Level level, String category, String eventName)
// Send an event without a payload

public static void fireEvent(Level level, String category, String eventName, JSONObject payload)
// Send an event with a JSON payload

level:     The logging level of the event. Set to any standard level supported by Java logging.

category:  The category of the event. Set to 'custom' for all events except context,
sessionStart(MAF Framework event) and sessionEnd(MAF Framework event). Set the latter events to 'system'.

eventName: Provide your own event name if you do not use an event provided in the AnalyticsUtilities class.
Throws an exception if null.

payload:   A JSONObject that contains key-value pairs for custom events. The JSONObject must be of type String.
No other data type is supported.

このAPIを使用する前に、MCSに分析を転送するために必要な値をアプリケーションのlogging.propertiesファイルに構成します。たとえば、MCSのconnectionIDを指定します。

次の例は、このAPIを使用して、MAFアプリケーションからMCSに分析を送信する方法を示しています。

//  Sending events from your application.

//  The following logs event when there is no payload to register for an event.
AnalyticsUtilities.fireEvent(Level.WARNING, AnalyticsUtilities.CATEGORY_CUSTOM, "EVENT_VIDEO_ACTIONS");

//  The following logs event when there is a JSON payload to send for a custom event.
try
{
JSONObject   payload = new JSONObject();
payload.put("PAYLOAD_VIDEONAME", getFileName());
payload.put("PAYLOAD_ACTION", getAction());
// Creating a custom event 'EVENT_VIDEO_ACTIONS' of level INFO
AnalyticsUtilities.fireEvent(Level.INFO, AnalyticsUtilities.CATEGORY_CUSTOM, "EVENT_VIDEO_ACTIONS" , payload);
}

catch(Throwable t)
{
// log the error
}

ユーザーとの相互作用に基づいて、イベントを取得する異なるログ・レベルを設定できます。たとえば、エンド・ユーザーが再生アクションを実行する場合、前述の例のEVENT_VIDEO_ACTIONSイベントをINFOレベルに設定できます。または、失敗した場合にイベントを取得するには、WARNINGレベルに設定できます。ロギング・レベルはlogging.propertiesファイルで管理します。たとえば、EVENT_VIDEO_ACTIONSイベントのロギングを管理するには、logging.propertiesファイルを次のように構成します。

// Set to  WARNING to log events for the play action. Set to INFO (or a lower level)
// to log events for the play action plus failure events
oracle.maf.api.analytics.custom.EVENT_VIDEO_ACTIONS.level=WARNING

// Disable logging of EVENT_VIDEO_ACTIONS
oracle.maf.api.analytics.custom.EVENT_VIDEO_ACTIONS.level=OFF

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

MAFアプリケーションでは、コンテキスト・イベントを取得して、収集された情報をMCSまたはMCS以外のリポジトリに送信できます。

コンテキスト・イベントは、別のコンテキスト・イベントが記録されるまでの、後続のイベントのコンテキストを定義します。イベントは、MAFフレームワーク・イベントから、またはアプリケーションで定義するイベントから記録できます。

表7-2に、MAFアプリケーションからコンテキスト・イベントを送信するJSONオブジェクトのキーと値のペアで、MCSが受け入れるキー名を示します。MCSでは、すべてのプロパティが文字列型である必要があります。次の表に示すすべてのプロパティはオプションです。

注意:

MCSでは、緯度および経度の情報が、市区町村、都道府県、国および郵便番号に変換されます。緯度および経度(latitudeおよびlongitude)の情報を指定するか、またはlocality、region、postalCodeおよびcountryを指定し、両方は指定しないでください。

表7-2 コンテキスト・イベント情報をMCSに送信するための有効なキー名

キー名

説明

userName

コンテキスト・イベントが記録されたときに、保護された機能にログインしていたデバイスのユーザー。

timezone

UTCからのデバイスのオフセット(秒)

model

デバイスのモデル名

osName

デバイスのオペレーティング・システム名

osVersion

デバイスのオペレーティング・システムのバージョン

latitude

デバイスのGPS緯度

longitude

デバイスのGPS経度

locality

デバイスの地域

region

デバイスのリージョン

postalCode

デバイスの郵便番号

country

デバイスの国

MAFアプリケーションからMCSにコンテキスト・イベント情報を送信するには、logging.propertiesファイルで次のエントリを構成します。

oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName= oracle.maf.api.analytics.McsContextProvider

このエントリがlogging.propertiesファイルに構成されている場合、表7-2に示されているコンテキスト・イベント情報がMAFからMCSに送信されます。MAFアプリケーションからMCSにユーザー名を送信する場合は、logging.propertiesファイルでrecordUsernameをTrueに設定する必要もあります。

定義したフィールドを含むコンテキスト・イベントを生成するには、logging.propertiesファイルで次のエントリを構成します。

oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.demo.CustomContextProvider

ここで、oracle.maf.demo.CustomContextProviderはoracle.maf.api.analytics.ContextProviderを実装するクラスです(例7-1を参照)。生成されるコンテキスト・イベントには、タイムゾーン、キャリアおよびメーカーの情報が含まれます。

例7-1 コンテキスト情報を送信するカスタム・コンテキスト・プロバイダ

package oracle.maf.demo;

import java.util.Date;
import java.util.TimeZone;
import oracle.maf.api.analytics.ContextProvider;
import oracle.adfmf.json.JSONObject;

public class CustomContextProvider
implements ContextProvider
{
public CustomContextProvider()
{
super();
}

public JSONObject generateContext()
{
JSONObject myCustomCtx = new JSONObject();

//
// TimeZone - Mobile device's offset from UTC in seconds
//
Date date = new Date();
int offset = TimeZone.getDefault().getOffset(date.getTime()) / 1000;

try
{
myCustomCtx.put("timezone", new Integer(offset).toString());
myCustomCtx.put("carrier", "AT&T");
myCustomCtx.put("manufacturer", "Apple");
}
catch(Exception ex)
{
ex.printStackTrace();
}

return myCustomCtx;
}
}

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

MAFアプリケーションでは、MCS以外のリポジトリに分析を送信できます。

これを行うには、次の例に示すように、oracle.maf.api.analytics.McsAnalyticsHandlerを拡張するカスタム・クラスを作成して、processEvent()メソッドをオーバーライドします。

package oracle.maf.demo;

import java.io.IOException;
import oracle.adfmf.framework.exception.AdfException;

import oracle.adfmf.json.JSONArray;
import oracle.adfmf.resource.CDCErrorBundle;
import oracle.adfmf.util.ResourceBundleHelper;
import oracle.maf.api.analytics.McsAnalyticsHandler;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;

public class CustomHandler extends McsAnalyticsHandler
{
public CustomHandler()
{
super();
}

//
// Establish the connection to a different repository and flush the events.
//
protected void processEvents() throws AdfException
{
// Extract the events to be flushed
_events = super.getEvents();

RestServiceAdapter restAdapter = RestServiceAdapterFactory.newFactory().createRestServiceAdapter();
restAdapter.clearRequestProperties();

// Get valid connectionId of the repository.
restAdapter.setConnectionName(getConnectionId());
restAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_POST);
restAdapter.addRequestProperty("Content-Type", "application/json");
restAdapter.setRequestURI(_ANOTHER_REPOSITORY_URI);
restAdapter.setGenerateAnalyticsEvents(false);

// make REST call to send events
try
{
String responseMessage = restAdapter.send(_events.toString());
}
catch (IOException ex)
{
throw new AdfException(AdfException.ERROR, ResourceBundleHelper.CDC_ERROR_BUNDLE,
CDCErrorBundle.ERR_ANALYTICS_FLUSH_EVENTS, new Object[] { ex });
}
}

private JSONArray _events = new JSONArray();
private static final String _ANOTHER_REPOSITORY_URI = "_repository_uri";
}

logging.propertiesファイルでカスタム・クラスを登録する必要もあります。たとえば、CustomHandlerを登録するには、次の例に示すようにlogging.propertiesを構成します。

# Configure the analytics logger
oracle.maf.api.analytics.level=ALL
oracle.maf.api.analytics.handlers=oracle.maf.demo.CustomHandler
oracle.maf.api.analytics.custom.level=INFO

# Configure CustomHandler
oracle.maf.demo.CustomHandler.level=INFO
oracle.maf.demo.CustomHandler.connectionId=RepositoryConn
oracle.maf.demo.CustomHandler.batchSize=7
oracle.maf.demo.CustomHandler.offlineWrite=true
oracle.maf.demo.CustomHandler.recordUsername=false
oracle.maf.demo.CustomHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider

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

MAFでは、分析情報を取得する様々なMAFフレームワーク・イベントを提供しています。

これらのイベントは2つのカテゴリ(カスタムおよびシステム)にグループ化されます。アプリケーションのlogging.propertiesファイルを構成して、アプリケーションからMCSにこれらのイベントが送信されるようにします。まず、MCSのconnectionIDを指定して、分析情報の送信を有効にするようにアプリケーションのlogging.propertiesファイルを構成します。次に、送信するイベントを指定します。この後者のタスクには、次の表の情報を使用します。

表7-3に、分析情報をアプリケーションからMCSに送信するためにlogging.propertiesファイルで構成できるMAFフレームワーク・イベント(カスタム・カテゴリ)を示します。各イベントは、OFFに設定するか、そのイベントのロギングが有効になるレベルより高いロギング・レベルに設定することで無効にできます。

表7-3 MAFフレームワーク・イベント(カスタム・カテゴリ)

イベント名

ロギング・レベル

ロギングの有効化または無効化

UpdateAuthenticationStatus

FINE

oracle.maf.api.analytics.custom.UpdateAuthenticationStatus.level= FINE

oracle.maf.api.analytics.custom.UpdateAuthenticationStatus.level= OFF

FeatureNavigation

INFO

oracle.maf.api.analytics.custom.FeatureNavigation.level=INFO

oracle.maf.api.analytics.custom.FeatureNavigation.level=OFF

Login

INFO

oracle.maf.api.analytics.custom.Login.level=INFO

oracle.maf.api.analytics.custom.Login.level=OFF

LoginCallback

FINER

oracle.maf.api.analytics.custom.LoginCallback.level=FINER

oracle.maf.api.analytics.custom.LoginCallback.level=OFF

Timer

警告および期限切れ操作の場合はINFO

調整操作の場合はFINE

oracle.maf.api.analytics.custom.Timer.level=INFO

oracle.maf.api.analytics.custom.Timer.level=FINE

oracle.maf.api.analytics.custom.Timer.level=OFF

Logout

INFO

oracle.maf.api.analytics.custom.Logout.level=INFO

oracle.maf.api.analytics.custom.Logout.level=OFF

LogoutCallback

FINER

oracle.maf.api.analytics.custom.LogoutCallback.level=FINER

oracle.maf.api.analytics.custom.LogoutCallback.level=OFF

PageNavigation

INFO

oracle.maf.api.analytics.custom.PageNavigation.level=INFO

oracle.maf.api.analytics.custom.PageNavigation.level=OFF

FeatureTransition

INFO

oracle.maf.api.analytics.custom.FeatureTransition.level=INFO

oracle.maf.api.analytics.custom.FeatureTransition.level=OFF

ApplicationTransition

INFO

oracle.maf.api.analytics.custom.ApplicationTransition.level=INFO

oracle.maf.api.analytics.custom.ApplicationTransition.level=OFF

RESTWebService

INFO

oracle.maf.api.analytics.custom.RESTWebService.level=INFO

oracle.maf.api.analytics.custom.RESTWebService.level=OFF

表7-4に、アプリケーションからMCSに分析情報を送信するようにlogging.propertiesファイルで構成できる、MAFフレームワーク・イベント(システム・カテゴリ)を示します。

表7-4 MAFフレームワーク・イベント(システム・カテゴリ)

イベント名

ロギング・レベル

説明

sessionStart

INFO

このイベント名は、MAFアプリケーションがアクティブ化され、分析情報の記録を開始したときに開始されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。

sessionEnd

INFO

このイベント名は、MAFアプリケーションが非アクティブ化され、分析情報の記録を停止したときに停止されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。
MAFでは、batchSizeに達しているかどうかにかかわらず、sessionEndが発生したときにMCSにイベントをフラッシュします。

context

INFO

コンテキスト・イベント情報を送信します(たとえば、デバイスのタイムゾーン、キャリアおよびメーカー)。次のようにこのイベントを有効にします。

oracle.maf.api.analytics.McsAnalyticsHandler
.contextProviderClassName=oracle.maf.api
.analytics.McsContextProvider

コンテキスト・イベント情報の詳細は、「Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法」を参照してください。

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

Oracle Mobile Cloud Service (MCS)によってホストされるREST WebサービスにアクセスするMAFアプリケーションからの診断情報を挿入する方法について説明します。

REST WebサービスにアクセスするMAFアプリケーションは、RestServiceAdapterを使用してこれらのサービスにアクセスします。アプリケーションがMCSによってホストされるRESTサービスにアクセスする場合に、MCS Diagnosticsを使用してMCSによってホストされるRESTサービスへのアプリケーションのコールをモニターまたはデバッグ(あるいはその両方)するには、McsRestServiceAdapterを作成して次の情報をMCSに送信します。

- モバイル診断セッションID
この属性は、特定のデバイスにアプリケーション・セッションをマップします。アプリケーションではこの情報を、Oracle-Mobile-DIAGNOSTIC-SESSION-ID HTTPリクエスト・ヘッダーを介して送信します。

- モバイル・デバイスID
MCSに送信されたREST APIリクエストを、リクエストを行った物理デバイスに関連付けます。モバイル・アプリケーションではこの情報を、Oracle-Mobile-Device-ID HTTPリクエスト・ヘッダーを介して提供します。

- クライアント・リクエスト時間
アプリケーションがリクエストを送信する直前に、クライアント側で取得されたAPIコールのタイム・スタンプを示します。モバイル・アプリケーションではこの情報を、HTTPリクエスト・ヘッダーのOracle-Mobile-CLIENT-REQUEST-TIME属性を使用して提供します。

次の例は、このタイプのアダプタを使用するMAFアプリケーションがHTTPリクエスト・ヘッダーに挿入する情報のタイプを示しています。

Oracle-Mobile-Diagnostic-Session-ID: 19975
Oracle-Mobile-Device-ID: d09379504b0a3247
Oracle-Mobile-Client-Request-Time: 2016-02-09T09:03:17.777Z

次の例は、McsRestServiceAdapterの作成方法を示しています。

...
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;

...
RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter mcsRestServiceAdapter = factory.createMcsRestServiceAdapter();

アダプタの作成の詳細は、「WebサービスにアクセスするためのRESTサービス・アダプタの作成」を参照してください。

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

この章では、複数の言語を使用するデバイスでMAFアプリケーションを実行する場合にレンダリングするテキストおよびイメージ・リソースを定義できるリソース・バンドルの使用方法について説明します。この章では、リソース・バンドルを作成および編集するためにJDeveloperが提供する設計時サポートについても説明します。

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

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

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

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

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

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

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

- MAFでの言語のサポート

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

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

ローカリゼーションとは、特定ロケールに製品を適応させるプロセスのことです。ローカライズされたMAFアプリケーションでは、そのアプリケーションが実行されるモバイル・デバイスと同じ言語が使用されます。たとえば、デバイス言語としてフランス語が設定されている場合、アプリケーションのテキスト・リソースはフランス語で表示されます。

アプリケーションのローカライズを支援するために、MAFでは1つ以上のリソース・バンドルでデザインタイム・メニューを提供しています。これらのメニューを使用して、ユーザー・インタフェースで表示する必要のあるテキスト・リソースを定義します。MAFアプリケーションのテキスト・リソースはベース・リソース・バンドルで定義します。デバイスのロケール用のロケール固有リソース・バンドルがアプリケーションに含まれていない場合、ユーザーのデバイス上のアプリケーションでは、これらのテキスト・リソースをそのユーザー・インタフェースでレンダリングします。サポートする各ロケール用のロケール固有リソース・バンドルを作成します。これらのロケール固有リソース・バンドルでは、ベース・リソース・バンドルで定義したテキスト・リソースの翻訳を提供します。

図8-1に、アプリケーションでcommandButtonおよびoutputTextコンポーネントをレンダリングする例を示します。モバイル・デバイスで設定する言語によって、コンポーネントに表示されるテキストおよびイメージ・リソースが決まります。左側では、ベース・リソース・バンドルに英語の値を持つテキスト・リソースが含まれるため、コンポーネントはテキスト・リソースを英語でレンダリングします。アプリケーションが実行されるデバイスでは英語(またはフランス語以外の言語)が使用されます。右側では、同じコンポーネントがフランス語でテキスト・リソースをレンダリングします。MAFアプリケーションには、ベース・リソース・バンドルに値の翻訳を含むロケール固有のリソース・バンドル(_fr)が含まれています。フランス語がモバイル・デバイスの言語として設定されます。

図8-1 ローカライズされたテキスト・リソース

MAFアプリケーションをローカライズするには、次のようにします。

1. 「MAFアプリケーションのリソース・バンドル・オプションの設定」の説明に従って、MAFアプリケーションのリソース・バンドル数を決定します。

2. ベース・リソース・バンドルでテキスト・リソースを定義して、ロケール固有のリソース・バンドルが提供されないロケールでMAFアプリケーションを実行する場合に、そのテキスト・リソースがレンダリングされるようにします。

3. ベース・リソース・バンドルで定義したテキスト・リソースの翻訳を提供するロケール固有リソース・バンドルを作成します。

4. MAFアプリケーションをローカライズするために必要なイメージ・ファイルとその他のリソースのロケール固有バージョンを作成します。

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

MAFアプリケーションのリソース・バンドルでは、XMLローカリゼーション・ファイル形式(XLIFF)を使用します。JDeveloperでは、「テキスト・リソースの選択」ダイアログに値を初めて入力すると、.xlfファイル・リソース・バンドルが作成されます。ローカライズした値をサポートする各プロパティで「テキスト・リソースの選択」を呼び出します。

MAFアプリケーションには次の2つのデフォルトのリソース・バンドルがあります。

- プロジェクトレベルのリソース・バンドル(デフォルト名はViewControllerController.xlf)

- アプリケーションレベルのリソース・バンドル

アプリケーションレベルのリソース・バンドルのネーミング規則では、アプリケーション名と追加のBundle.xlfが使用されます。つまり、MyLocalizedMAFappという名前のMAFアプリケーションは、MyLocalizedMAFappBundle.xlfという名前のアプリケーションレベルのリソース・バンドルを持ちます。アプリケーションレベルのリソース・バンドルには、アプリケーションレベルのテキスト・リソースが含まれます。たとえば、アプリケーション名を別の言語に翻訳する場合は、このリソース・バンドルでアプリケーション名をテキスト・リソースとして指定します。プロジェクトレベルのリソース・バンドルには、プロジェクトのMAF AMXページにレンダリングされるテキスト・リソース、またはアプリケーション機能のプロパティのテキスト・リソースが含まれます。これらのプロパティの詳細は、「ローカライズ可能なMAFプロパティ」を参照してください。

プロジェクトのリソース・バンドル・オプションを設定することで、1つのプロジェクトレベル・リソース・バンドルを持つMAFアプリケーションのデフォルトの動作を変更できます。MAFアプリケーションは、アプリケーションレベルのリソース・バンドルを1つのみ持つことができます。

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

「プロジェクト・プロパティ」ダイアログの「リソース・バンドル」ページを使用して、ビュー・コントローラ・プロジェクトおよびアプリケーション・コントローラ・プロジェクトのリソース・バンドル・オプションを設定します。設定できるオプションには、JDeveloperで作成されるプロジェクトレベル・リソース・バンドルの数が含まれます。

プロジェクトのリソース・バンドル・オプションを設定するには:

1. 「アプリケーション」ウィンドウで、プロジェクトをダブルクリックします。

2. 図8-2に示すように、「プロジェクト・プロパティ」ダイアログで、「リソース・バンドル」を選択して「リソース・バンドル」ページを表示します。

図8-2「プロジェクト・プロパティ」の「リソース・バンドル」ページ

3. ダイアログにテキスト・リソースの説明を入力する前に「テキスト・リソースの選択」ダイアログが閉じないようにする場合は、「常に説明の入力を要求」を選択します。

4. 次に示すいずれかのリソース・バンドル・ファイル・オプションを選択します。

- 1プロジェクト当たり1バンドル: JDeveloperは、<ProjectName>.xlfという名前のファイルに1つのリソース・バンドルを作成します。

- 1ファイル当たり1バンドル: ファイル(maf-feature.xml、maf-application.xmlまたは.amxファイル)のテキスト・リソースを定義するたびにリソース・バンドルを作成します。このオプションによりリソース・バンドルの数が各ファイル1つに制限されるため、このオプションを選択した場合、JDeveloperでは2つ目のバンドルを作成できません。

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

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

JDeveloperでは、エンド・ユーザーに表示されるMAFアプリケーション、アプリケーション機能およびMAF AMX UIコンポーネントのテキスト・リソースの値をリソース・バンドルに定義できる「テキスト・リソースの選択」ダイアログが提供されます。

「テキスト・リソースの選択」ダイアログにアクセスするには、「プロパティ」ウィンドウで、テキスト・リソースを定義するプロパティの横のアイコンをクリックし、「テキスト・リソースの選択」を選択します。通常、これらのプロパティはユーザーが参照できるテキストを表示するプロパティです。たとえば、ボタン、リンク、入力テキストなどのMAF AMX UIコンポーネントにより表示されるラベル、テキストおよびhintTextプロパティに加えて、MAFアプリケーションおよびアプリケーション機能の名前プロパティがあります。これらのプロパティの詳細は、「ローカライズ可能なMAFプロパティ」を参照してください。

図8-3にMAFアプリケーションの名前、アプリケーション機能の名前およびinputTextコンポーネントの「ラベル」プロパティの「テキスト・リソースの選択」コンテキスト・メニューを表示する方法を示します。

図8-3 「テキスト・リソースの選択」ダイアログを表示するコンテキスト・メニュー

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

リソース・バンドルにテキスト・リソースを定義するには、EL式を使用してリソース・バンドルに定義されたテキスト・リソースを参照するプロパティについて起動できる「テキスト・リソースの選択」ダイアログを使用します。

リソース・バンドルにテキスト・リソースを定義するには:

1. テキスト・リソースを定義するプロパティを持つアーティファクトを選択します。これは、MAFアプリケーション自体、アプリケーション機能またはMAF AMX UIコンポーネントが可能です。

2. 「プロパティ」ウィンドウで、テキスト・リソースを定義するプロパティの横のアイコンをクリックし、表示されるコンテキスト・メニューで「テキスト・リソースの選択」を選択します。

3. 「テキスト・リソースの選択」ダイアログで、表示名とキーを入力し、「保存して選択」をクリックしてテキスト・リソースを定義します。

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

入力した表示値とキーはJDeveloperによってリソース・バンドルに書き込まれます。初めてMAFアプリケーションまたはプロジェクトのテキスト・リソースを定義するときに、JDeveloperによりリソース・バンドルが作成されます。定義するテキスト・リソースがアプリケーションレベルのプロパティ(MAFアプリケーションの名前プロパティなど)に対するものである場合、JDeveloperはアプリケーションレベルのリソース・バンドル(ApplicationNameBundle.xlf)を作成します。バンドルは「アプリケーション・リソース」パネルで表示できます(図8-4を参照)。定義するテキスト・リソースがプロジェクトレベルのプロパティ(アプリケーション機能の名前プロパティなど)に対するものである場合、JDeveloperはプロジェクトレベルのリソース・バンドル(ViewControllerBundle.xlf)を作成します。バンドルは「プロジェクト」パネルで表示できます(図8-4を参照)。

図8-4 新規に作成したリソース・バンドル

JDeveloperでは、1つのMAFアプリケーションに対し、1つのアプリケーションレベルのリソース・バンドルを作成します。「MAFアプリケーションのリソース・バンドル・オプションの設定」で説明されているように、設定するオプションに応じて追加のプロジェクトレベルのリソース・バンドルを作成できます。

次の例に示すように、アプリケーションレベルとプロジェクトレベルのどちらのリソース・バンドルでも、JDeveloperがキーおよび表示値のリソース・バンドルに書き込むXMLの構文は同じです。

...
<!-- The value of the id attribute is the value you enter in the Key input field of the
Select Text Resource Dialog -->
<trans-unit id="FEATURE_ONE">
<!-- The value of the source element is the value you enter in the Display Value input
field of the Select  Text Resource Dialog -->
<source>Feature Name</source>
<target/>
</trans-unit>
<trans-unit id="HEADER_VALUE_IN_PANEL">
<source>Header Value in Panel Page</source>
<target/>
</trans-unit>
<trans-unit id="COMMAND_BUTTON">
<source>Text Display Value for a Command Button</source>
<target/>
</trans-unit>
...

テキスト・リソースはリソース・バンドルで定義されます。構成可能なプロパティはテキスト・リソースを参照します。JDeveloperにより、例8-1に示すようにプロパティ・ファイルが変更されます。

- 属性を初めてローカライズするときに、JDeveloperによって<adfmf:loadbundle>要素が追加されます。この要素のbasename属性は、新しく作成されるリソース・バンドルを参照します。

- JDeveloperは、ローカライズされた属性文字列をEL式に変更します。EL式は、リソース・バンドルで定義されているテキスト・リソースのキーを参照します。

- JDeveloperは、追加のローカライズされた文字列をすべて同じリソース・バンドル・ファイルに追加します。アプリケーション・レベルでは、リソース・バンドル・ファイルは1つのみ存在します。プロジェクト・レベルでは、動作は選択したリソース・バンドルの設定により異なります。

例8-1 MAF AMXページとMAF構成ファイルのリソース・バンドルの参照

<!-- maf-application.xml where a text resource has been defined for the MAF application's name -->
<adfmf:application ....name="#{mylocalizedmafappBundle.MY_LOCALIZED_MAF_APPLICATION}"
...
<adfmf:loadBundle basename="MyLocalizedMAFappBundle" var="mylocalizedmafappBundle"/>

<!-- maf-feature.xml where a text resource has been defined for the application feature's name -->
<adfmf:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle"/>
...
<adfmf:feature id="feature1" name="#{viewcontrollerBundle.FEATURE_ONE}">

<!-- MAF AMX page where a text resource has been defined for a command button's text attribute -->
<amx:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle" id="lb1"/>
...
<amx:commandButton id="cb1" text="#{viewcontrollerBundle.COMMAND_BUTTON}"/>

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

MAFアプリケーションで特定のロケールに異なるテキスト・リソースをレンダリングする場合は、ロケール固有のリソース・バンドルを作成します。

たとえば、フランス語またはアラビア語に設定された言語を持つデバイスでMAFアプリケーションを実行する場合にベース・リソース・バンドルのテキスト・リソースの翻訳を提供する場合は、フランス語とアラビア語両方のロケール固有リソース・バンドルを作成する必要があります。

図8-5に、アラビア語とフランス語のロケールをサポートするためにロケール固有バージョンのアプリケーションレベル(MyLocalizedMAFappBundle.xlf)リソース・バンドルとプロジェクトレベル(ViewControllerBundle.xlf)リソース・バンドルが作成されたMAFアプリケーションを示します。次の形式を使用するファイル名でベース・リソース・バンドルと同じディレクトリにロケール固有リソース・バンドルを作成する必要があります。

<BASE_RESOURCE_BUNDLE_NAME>_<LANGUAGE_TOKEN>.xlf

説明は次のとおりです。

- <BASE_RESOURCE_BUNDLE_NAME>はベース・リソース・バンドル名です

- <LANGUAGE_TOKEN>は<ISO-639-lowercase-language-code>の形式です
MAFがサポートする言語のリストについては、「MAFでの言語のサポート」を参照してください。

図8-5 ベース・リソース・バンドルとロケール固有のリソース・バンドル

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

JDeveloperは、「新規ギャラリ」メニューの「一般」で「XML」カテゴリで新規XMLローカリゼーション・ファイル(XLIFF)を作成するオプションを提供することで、プロジェクトレベルのリソース・バンドルの作成を容易にします。

または、ロケール固有のリソース・バンドルを作成するベース・バンドルを開きます。ファイル名に正しい言語コードを付けてファイルのコピーを保存します。2番目のオプションには次のメリットがあります。

- ベース・リソース・バンドルと同じディレクトリにロケール固有のリソース・バンドルを作成します。これは必須です。

- ベース・リソース・バンドル内のすべてのテキスト・リソースのコピーが、翻訳された値を提供できるロケール固有のリソース・ベース・バンドルに表示されます。

ロケール固有のリソース・バンドルを作成するには:

1. ロケール固有バージョンを作成するベース・リソース・バンドルを開きます。

- アプリケーションレベルのベース・リソース・バンドル: 「アプリケーション・リソース」パネルの「ディスクリプタ」の「ADF META-INF」ノードで、.xlfファイルをダブルクリックします。

- プロジェクトレベルのベース・リソース・バンドル: 「プロジェクト」パネルの「ViewController」の「アプリケーション・ソース」ノードで、.xlfファイルをダブルクリックします。

2. JDeveloperで、「ファイル」をクリックしてから、「別名保存」をクリックします。サポートするロケールの言語コードを追加します。
たとえば、MAFアプリケーションでフランス語ロケールをサポートする場合は、_frを追加します。

3. 適切な言語コードを含むように、新規に作成したロケール固有のリソース・バンドルを編集します。
次の例は、アプリケーションレベルおよびプロジェクトレベルのリソース・バンドルのフランス語ロケールをサポートするために必要な編集を示しています。

<!-- Application-level French locale-specific resource bundle -->
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
<file source-language="fr" original="this" datatype="x-oracle-adf">

<!-- Project-level French locale-specific resource bundle -->
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
<file source-language="fr" original="mobile.ViewControllerBundle_fr"
datatype="x-oracle-adf">

4. リソース・バンドルを編集して、ターゲット・ロケールに表示する各テキスト・リソースの翻訳を提供します。「リソース・バンドルのリソースの編集」を参照してください。

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

JDeveloperには、MAFアプリケーションに含まれるリソース・バンドル内のリソースを追加、削除または編集できる「リソース・バンドルの編集」ダイアログが用意されています。

リソース・バンドルのテキスト・リソースを編集するには:

1. JDeveloperで、テキスト・リソースを編集するリソース・バンドルをダブルクリックします。

2. JDeveloperのメイン・メニューで、「アプリケーション」をクリックしてから、「リソース・バンドルの編集」をクリックします。

手順1で選択したリソース・バンドルの「リソース・バンドルの編集」ダイアログが開きます。図8-6に、フランス語のロケール固有リソース・バンドルについて開くダイアログを示します。「表示値」および「説明」フィールドをダブルクリックして、既存のテキスト・リソースを編集します。コントロール(「追加」、「削除」および「検索」)を使用して、MAFアプリケーションのテキスト・リソースの追加と削除を行うか、または他のリソース・バンドルを検索して開きます。

図8-6 リソース・バンドルのテキスト・リソースの編集

3. 「OK」をクリックしてダイアログを閉じ、変更内容を保存します。

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

ロケールに応じて、MAFアプリケーションに異なるイメージ・ファイルをレンダリングすることが必要な場合があります。

たとえば、図8-7に示すように、イメージにはテキストまたは国旗の図を含めることができます。

図8-7 ロケールに基づいて異なるイメージのレンダリング

イメージを参照するコンポーネント属性のEL式をリソース・バンドルのエントリに書き込みます。リソース・バンドル・エントリにはイメージへのパスが含まれます。たとえば、図8-7に示すcommandButtonコンポーネントは、コンポーネントをレンダリングするMAF AMXページのアイコン属性に次の値を定義します。

<amx:commandButton id="cb1" text="#{viewcontrollerBundle.YES}"
icon="#{viewcontrollerBundle.IMAGE_PATH}"/>

ベース・リソース・バンドル(ViewControllerBundle.xlf)には、MAFアプリケーションがフランス語以外のロケールで実行される場合に表示するイメージのパスを持つ次のエントリが含まれます。

<trans-unit id="IMAGE_PATH">
<source>/images/uk.png</source>
<target/>
<note>Path to image file</note>
</trans-unit>

フランス語のリソース・バンドル(ViewControllerBundle_fr.xlf)では、次の例に示すように、MAFアプリケーションがフランス語ロケールで実行されたときにレンダリングする別のイメージを指定します。

<trans-unit id="IMAGE_PATH">
<source>/images/fr.png</source>
<target/>

「リソース・バンドルのリソースの編集」の説明に従って、イメージへのパスを定義するエントリをリソース・バンドルに手動で書き込むか、「リソース・バンドルの編集」ダイアログを使用します。

ソース・バンドルにイメージのパスを定義した後で、図8-8に示すように式ビルダーを使用して、リソース・バンドルのエントリを参照するEL式を作成します。

図8-8 リソース・バンドルのイメージを参照しているEL式

8.7 MAFでの言語のサポート

MAFでサポートされている言語、および追加UI文字列の提供に使用できるリソース・バンドル名をリストします。

表8-1に、MAFでサポートされている言語を示します。ユーザーのデバイスが、これらのいずれかの言語を使用するように構成されている場合、エラー・メッセージなどのシステム・メッセージがこれらの言語で表示されます。MAFでは、国および地域用の言語トークンをサポートしています。ただし、フルサポートが提供されるのは、言語のリストに表示されている場合のみです。MAFからのエラー・メッセージでは、リストに示されている言語のうちで最も近いものが使用されます。通常、表内のいずれかの言語またはこれらのいずれかの言語のより固有のバリアントを使用するようにデバイスが構成されていないかぎり、言語は英語になります。

これらの言語で追加リソース文字列をアプリケーションでレンダリングする場合は、それらの文字列を定義する必要があります。表8-1にリストされている言語トークンを使用して、ロケール固有のリソース・バンドルを作成します。たとえば、ポルトガル語(ブラジル)のリソース文字列を定義する場合は、BASE_RESOURCE_BUNDLE_NAME_pt_BR.xlfという名前のリソース・バンドルを作成します。リストに含まれていない言語のリソース・バンドルを作成するには、BASE_RESOURCE_BUNDLE_NAME_lowercase-ISO-639-1-language-code.xlfという名前フォーマットでリソース・バンドルを作成します。ネーミング規則の詳細は、「ロケール固有のリソース・バンドルの作成」を参照してください。

デプロイメント時、JDeveloperは言語トークンを、アプリケーションがデプロイされるプラットフォームで予期される値に変換します。たとえば、iOSプラットフォームにデプロイされるMAFアプリケーションは、言語トークンpt_BRをpt (iOSプラットフォームで予期される言語ID)に変換します。

表8-1 MAFでサポートされる言語のリソース・バンドル名

言語

追加のUI文字列を指定するためのリソース・バンドル名

アラビア語

BASE_RESOURCE_BUNDLE_NAME_ar.xlf

ポルトガル語(ブラジル)

BASE_RESOURCE_BUNDLE_NAME_pt_BR.xlf

カタロニア語

BASE_RESOURCE_BUNDLE_NAME_ca.xlf

チェコ語

BASE_RESOURCE_BUNDLE_NAME_cs.xlf

デンマーク語

BASE_RESOURCE_BUNDLE_NAME_da.xlf

オランダ語

BASE_RESOURCE_BUNDLE_NAME_nl.xlf

フィンランド語

BASE_RESOURCE_BUNDLE_NAME_fit.xlf

フランス語

BASE_RESOURCE_BUNDLE_NAME_fr.xlf

ドイツ語

BASE_RESOURCE_BUNDLE_NAME_de.xlf

ギリシャ語(近代)

BASE_RESOURCE_BUNDLE_NAME_el.xlf

ヘブライ語

BASE_RESOURCE_BUNDLE_NAME_iw.xlf

ハンガリー語

BASE_RESOURCE_BUNDLE_NAME_hu.xlf

イタリア語

BASE_RESOURCE_BUNDLE_NAME_it.xlf

日本語

BASE_RESOURCE_BUNDLE_NAME_ja.xlf

韓国語

BASE_RESOURCE_BUNDLE_NAME_ko.xlf

ノルウェー語

BASE_RESOURCE_BUNDLE_NAME_no.xlf

ポーランド語

BASE_RESOURCE_BUNDLE_NAME_pl.xlf

ポルトガル語

BASE_RESOURCE_BUNDLE_NAME_pt.xlf

ルーマニア語

BASE_RESOURCE_BUNDLE_NAME_ro.xlf

ロシア語

BASE_RESOURCE_BUNDLE_NAME_ru.xlf

簡体字中国語

BASE_RESOURCE_BUNDLE_NAME_zh_CN.xlf

スロバキア語

BASE_RESOURCE_BUNDLE_NAME_sk.xlf

スペイン語

BASE_RESOURCE_BUNDLE_NAME_es.xlf

スウェーデン語

BASE_RESOURCE_BUNDLE_NAME_sv.xlf

繁体字中国語

BASE_RESOURCE_BUNDLE_NAME_zh_TW.xlf

トルコ語

BASE_RESOURCE_BUNDLE_NAME_tr.xlf

タイ語

BASE_RESOURCE_BUNDLE_NAME_th.xlf

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

maf-application.xmlおよびmaf-feature.xmlファイルは、どちらもリソース・バンドルのテキスト・リソースを参照できるプロパティを公開します。

表8-2と表8-3に、これらのプロパティをリストします。これらの構成ファイルはアプリケーション・ライフサイクルの初期に読み取られるので、これらの文字列は実行時にはEL文として評価されません。そのかわり、これらの文字列は、ネイティブ・デバイス変換インフラストラクチャにおいて変換された文字列の完全なキーとして取得されます。

表8-4に、テキスト・リソースを参照できるMAF AMX UIコンポーネントの属性をリストします。

アプリケーションレベルでは、アプリケーション名やプリファレンス・ページのラベルなどの属性の文字列をローカライズできます。表8-2にこれらを示します。

表8-2 MAFアプリケーションのローカライズ可能な属性

要素

属性

<adfmf:Application>

name

<adfmf:PreferenceGroup>

label

<adfmf:PreferencePage>

label

<adfmf:PreferenceBoolean>

label

<adfmf:PreferenceText>

label

<adfmf:PreferenceNumber>

label

<adfmf:PreferenceList>

label

<adfmf:PreferenceValue>

name

プロジェクト(ビュー・コントローラ)レベルでは、表8-3に示すような、アプリケーション機能関連の属性をローカライズできます。

表8-3 アプリケーション機能のローカライズ可能な属性

要素

属性

<adfmf:Feature>

name

<adfmf:Constraint>

value

<adfmf:Parameter>

value

<adfmf:PreferencePage>

label

<adfmf:PrefrenceGroup>

label

<adfmf:PreferenceBoolean>

label

<adfmf:PreferenceText>

label

<adfmf:PreferenceNumber>

label

<adfmf:PreferenceList>

label

<adfmf:PreferenceValue>

name

ボタン・コンポーネント(<amx:commandButton>)のtext属性のようなMAF AMX UIコンポーネントの属性には、リソース・バンドルを作成できます。表8-4に、これらのMAF AMX UIコンポーネントを示します。

表8-4 MAF AMX UIコンポーネントのローカライズ可能な属性

コンポーネント

属性

<amx:inputDate>

label

<amx:inputNumberSlider>

label

<amx:panelLabelAndMessage>

label

<amx:selectBooleanCheckBox>

label

<amx:selectBooleanSwitch>

label

<amx:selectItem>

label

<amx:selectManyCheckBox>

label

<amx:selectManyChoice>

label

<amx:selectOneButton>

label

<amx:selectOneChoice>

label

<amx:selectOneRadio>

label

<amx:commandButton>

text

<amx:commandLink>

text

<amx:goLink>

text

<amx:inputText>

label、value、hintText

<amx:outputText>

value

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

この章では、スキンを使用してMAFアプリケーションの外観をカスタマイズする方法について説明します。

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

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

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

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

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

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

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

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

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

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

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

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

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

MAFではCascading Style Sheet (CSS)言語ベースのスキンを使用するので、MAFアプリケーション内の(その要素のアプリケーション機能で使用されるものを含む)すべてのアプリケーション・コンポーネントが一貫したルック・アンド・フィールを確実に共有するようになっています。

MAF AMXまたはHTMLコンポーネントを再構成してMAFアプリケーションの外観を変更するかわりに、コンポーネントの表示方法を変更するスキンを作成または拡張できます。

MAFアプリケーションのルック・アンド・フィールを変更するためのスキンの作成または編集は、反復的プロセスです。スキンを作成し、それをデバイスにデプロイして結果を表示できます。このプロセスを、スキンのレンダリング結果が希望どおりになるまで続行できます。ユーザー・インタフェース・コード(CSS、HTML、JavaScriptなど)をインスペクトおよびデバッグするためにAndroidおよびiOSプラットフォームが提供する開発者ツールは、このタスクでの重要なリソースです。これらのツールをMAFアプリケーションで使用する方法の詳細は、「AndroidプラットフォームでのUIコードのデバッグ方法」および「iOSプラットフォームでのUIコードのデバッグ方法」を参照してください。Visual Studioを使用して、ユニバーサルWindowsプラットフォームにデプロイするMAFアプリケーションでユーザー・インタフェース・コードをデバッグします。詳細は、「ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法」を参照してください。

MAF AMXページの外観を決定するセレクタを定義するためにMAFで使用されるサポート済のスキンのファミリとバージョンは、次のとおりです。

amx
mobileAlta-1.0
mobileAlta-1.1
mobileAlta-1.2
mobileAlta-1.3
mobileAlta-1.4
mobileAlta-1.5
mobileAlta-1.6

デフォルトで、新規作成したMAFアプリケーションでは最新バージョンのmobileAltaスキン・ファミリが使用されます。アプリケーションを以前のリリースから最新リリースに移行すると、そのアプリケーションでは移行前に使用するよう構成されていたスキンが引き続き使用されます。移行後のアプリケーションで別のスキン(たとえば最新バージョンのmobileAlta)を使用する場合は、「アプリケーションが使用するスキンの指定」の説明に従って、maf-config.xmlファイルを編集する必要があります。

図9-1は、異なるスキンを使用して同じアプリケーション画面のレンダリングを示すことによって、mobileAltaスキン・ファミリと別のスキン・ファミリのルック・アンド・フィールの違いを示しています。mobileAltaスキン・ファミリは左側でレンダリングされます。

図9-1 mobileAltaと別のスキンのルック・アンド・フィールの比較

MAFアプリケーションをデバイス、エミュレータまたはシミュレータにデプロイすることにより、MAFアプリケーションの使用するスキンのすべてのリソース(CSSファイルおよびイメージ)を表示できます。デプロイメントでは、これらのリソースは、デプロイメント処理で生成されるプラットフォーム固有のアーティファクト内で作成されるwww\cssディレクトリに移動されます。iOSデプロイメントの場合、www\cssディレクトリはtemporary_xcode_projectディレクトリ内にあります。iOSデプロイメントでは、これらのリソースは、作成された.IPAファイルに追加されるOracle_ADFmc_Container_Template.zipファイルにパッケージされます。Androidデプロイメントの場合、ディレクトリ・パスは%app%\deploy\Android1\framework\build\java_res\assets\www\cssとなり、Android1はデプロイメント・プロファイルの名前です。Androidデプロイメントでは、これらのリソースは、作成された.APKファイルに追加されるassets.zipファイルにパッケージされます。JDeveloperの「ビルド」→「すべてクリーン」コマンドにより、deployディレクトリ、およびwww\cssディレクトリを含むそのサブディレクトリが削除されることに注意してください。

注意:

MAF DOM構造に依存するスタイルを記述しないでください。また、これらのファイル内で定義されている一部のセレクタは、サポートされていない場合があります。

maf-config.xmlファイル(「maf-config.xmlファイルについて」を参照)およびmaf-skins.xmlファイル(「maf-skins.xmlファイルについて」を参照)を使用して、MAFアプリケーションのスキニングを制御します。maf-config.xmlファイルでは、アプリケーション・コンポーネントのレンダリングに使用するデフォルトのスキン・ファミリを指定し、maf-skins.xmlファイルでは、デフォルトのスキン・ファミリをカスタマイズしたり、新しいスキン・ファミリを定義することができます。

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

MAFアプリケーションを作成すると、JDeveloperによって、maf-config.xmlファイルがMAFアプリケーションのMETA-INFノードに移入されます。このファイル自体には、ベースMAFスキン・ファミリであるmobileAltaが移入されます(次の例を参照)。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-config xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-family>mobileAlta</skin-family>
<skin-version>v1.5</skin-version>
....
</adfmf-config>

注意:

EL式を使用して実行時にスキンの値を決定できます。「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。

<skin-family>または<skin-version>タグの値を指定しない場合は、MAFアプリケーションで自動的に最新のスキン・ファミリまたはスキン・バージョンが使用されます。

MAFでは階層としてスキンが適用されます。最上位にはデバイス固有のスキン、その後にプラットフォーム固有のスキン、ベース・スキンmobileAltaと続きます。MAFのmobileAltaスキン・ファミリの場合、この階層は次のように表されます。

1. mobileAlta.<DeviceModel> (たとえばmobileAlta.iPhone5,3)

2. mobileAlta.iOSまたはmobileAlta.Android

3. mobileAlta

ヒント:
デバイス固有またはプラットフォーム固有のスキンを作成する予定の場合は、その値を取得する必要があるデバイスまたはプラットフォームにDeviceDemoサンプル・アプリケーションをデプロイします。DeviceDemoサンプル・アプリケーションの「プロパティ」アプリケーション機能には、デバイス・モデルおよびアプリケーションが実行されているプラットフォームの値が表示されます。「サンプルのMAFアプリケーション」を参照してください。

図9-2は、実行時にMAFでスキンのこの階層が適用される様子をイラストレーションで示しています。SkinningDemoサンプル・アプリケーション(「サンプルのMAFアプリケーション」を参照)でも、この実装を示しています。

MAFでは、この階層のデバイス固有のレベルで定義されたセレクタを優先します。つまり、MAFでは、mobileAlta.iOSで定義されたセレクタを、同じセレクタに対するmobileAlta.iPhone5,3の定義で上書きします。「maf-skins.xmlファイルについて」で定義されている<extends>要素によって、この階層がMAFランタイム用に定義されます。様々なレベルでのスキンの適用方法の詳細は、「スキニングに関する必知事項」を参照してください。

図9-2 実行時のMAFのスキン階層の適用

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

アプリケーション・コントローラ・プロジェクトのMETA-INFノードにあるmaf-skins.xmlファイルによって、既存のスキンを拡張して新しいスキンを定義したり、既存のスキンに新しいスタイル・シートを追加することができます。

デフォルトでは、このファイルは空ですが、表9-1に示されている要素によって子要素を記述します。これらの子要素をこのファイルに移入することで、mobileAltaを拡張したり、アプリケーションで使用できるCSSファイルを定義できます。新しいスキンを作成したり、既存のスキンを拡張するには、<skin>要素を使用します。

表9-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.6</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>

スキンの異なるバージョンを指定します。「MAFスキンのバージョニング」を参照してください。

表9-2に、スタイルシートを既存のスキンに統合する場合に、MAF CSS内で<skin-addition>要素を定義するために使用できる要素を示しています。

表9-2 <skin-addition>の子要素

の要素を示しています。" title="<skin-addition>の子要素" width="100%">

要素

説明

<skin-id>

スタイルシートをさらに追加する必要があるスキンのIDを指定します。指定可能な値には、MAFによって提供されるスキン(たとえば、mobileAlta-v1.6.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.6.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デバイスにレンダリングしたり、これらの要素を定義してすべてのデバイスのプラットフォームに対するスタイルを処理することもできます。表9-3に、iOSプラットフォームに属するすべてのデバイス、および特定のiOSデバイス・タイプ(タブレット、電話、シミュレータ)をターゲットにするこれらの要素の使用例を示します。

ヒント:

デバイス・モデルに関する情報を取得するには、「サンプルのMAFアプリケーション」に記載されているDeviceDemoサンプル・アプリケーションの使用を検討してください。

表9-3 プラットフォームおよびデバイス固有のスタイル

デバイス

例

iPhone

<skin-addition>
<skin-id>mobileAlta-v1.6.iPhone5,1</skin-id>
<style-sheet-name>iPhoneStylesheet.css</style-sheet-name>
</skin-addition>

iPad

<skin-addition>
<skin-id>mobileAlta-v1.6.iPad4,2</skin-id>
<style-sheet-name>iPadStylesheet.css</style-sheet-name>
</skin-addition>

iPhoneシミュレータ

<skin-addition>
<skin-id>mobileAlta-v1.6.iPhone Simulator x86_64</skin-id>
<style-sheet-name>iPhoneSimStylesheet.css</style-sheet-name>
</skin-addition>

すべてのiOSデバイス

<skin-addition>
<skin-id>mobileAlta-v1.6.iOS</skin-id>
<style-sheet-name>iOSSimStylesheet.css</style-sheet-name>
</skin-addition>

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

アプリケーションにカスタム・スキンを追加するには、JDeveloper内にCSSファイルを作成します。CSSはアプリケーションとともにデプロイするために、JDeveloperによりプロジェクトのソース・ファイルに配置されます。

カスタム・スキンをアプリケーションに追加する手順:

1. 「アプリケーション」ウィンドウで、ApplicationControllerプロジェクトを右クリックして、「新規」→「CSSファイル」を選択します。

2. 「Cascading Style Sheetの作成」ダイアログで、CSSファイルの名前およびディレクトリを指定します。

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

これで、CSSエディタにCSSを開いて、アプリケーションのスタイルを定義できます。

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

maf-config.xmlファイルで値を構成して、アプリケーションで使用するスキンを決定します。

使用するアプリケーションのスキンを指定するには:

1. 「アプリケーション」ウィンドウで、maf-config.xmlファイルをダブルクリックします。デフォルトでは、これは、「アプリケーション・リソース」ペインの「ディスクリプタ」および「ADF META-INF」ノードの下にあります。

2. maf-config.xmlファイルで、使用するスキンの<skin-family>要素、および<skin-version>要素(オプション)の値を指定します。

例9-1は、MAFアプリケーションでmobileAlta-v1.6スキンを使用するのに必要な構成を示しています。

例9-1 アプリケーションのスキンを指定する構成

<adfmf-config xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-family>mobileAlta</skin-family>
<skin-version>v1.6</skin-version>
</adfmf-config>

注意:

アプリケーションが実行時に使用するスキンを動的に選択する場合、EL式を<skin-family>要素の値として設定します。「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。

9.4 カスタム・スキンの登録

maf-skins.xmlファイルにカスタム・スキンを識別するプロパティ値を追加することで、ユーザーのアプリケーションにカスタム・スキンを登録します。

カスタム・スキンを登録する手順:

1. 「アプリケーション」ウィンドウで、「ApplicationController」→「アプリケーション・ソース」→「META-INF」を開き、「maf-skins.xml」をダブルクリックします。

2. 「構造」ウィンドウで、「adfmf-skins」ノードを右クリックし、「adfmf-skinsの中に挿入」→「skin」を選択します。

3. 「skinの挿入」ダイアログで、次のようにフィールドに入力します。

- ファミリ: スキンのファミリ名の値を入力します。
新しい名前を入力するか、既存のファミリ名を指定できます。既存のファミリ名を指定した場合は、「MAFスキンのバージョニング」の説明に従ってスキンをバージョニングして、同じファミリ値を持つスキンを区別します。

入力する値は、作成するスキンを登録するmaf-skins.xmlの<family>要素の値として設定されます。アプリケーションのmaf-config.xmlの<skin-family>要素では、実行時にこの値を使用してアプリケーションで使用されるスキンを識別します。

- ID: skinFamily-versionまたはskinFamily-version.platformのいずれかの名前書式を使用してスキンのIDを入力します。たとえば、mySkinFamily-v1.2.androidです。

- 拡張対象: 拡張する親スキンの名前を入力します。たとえば、カスタム・スキンでmobileAlta-v1.6スキンを拡張する場合は、mobileAlta-v1.6と入力します。

- スタイルシート名: スタイルシートの名前を入力または選択します。

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

9.5 MAFスキンのバージョニング

スキンを区別する場合は、MAFスキンをバージョニングできます。

<version>要素を使用して、maf-skins.xmlファイルでスキンのバージョン番号を指定できます。maf-skins.xmlファイル内の<family>要素の値が同じスキンを区別する場合はこのオプション機能を使用します。この機能は、いくつかの既存の動作を変更するために既存のスキンの新規バージョンを作成する場合に役立ちます。特定のスキンを使用するようにアプリケーションを構成する場合は、maf-config.xmlファイルで値を指定します。「アプリケーションが使用するスキンの指定」を参照してください。

maf-skins.xmlファイル内の<version>要素に値を入力して、スキンのバージョンを指定します。

ベスト・プラクティス:

アプリケーションのmaf-skins.xmlファイルに登録する各スキンのバージョン情報を指定します。

MAFスキンをバージョニングするには:

1. 「アプリケーション」ウィンドウで、maf-skins.xmlファイルをダブルクリックします。デフォルトでは、これは、アプリケーション・コントローラ・プロジェクトのMETA-INFノードにあります。

2. 「構造」ウィンドウで、バージョニングするスキンのskinノードを右クリックし、「skinの中に挿入」→「version」を選択します。

3. maf-config.xmlファイルの<skin-version>要素に値が指定されていない場合に、このバージョンのスキンがアプリケーションで使用されるようにするには、「バージョンの挿入」ダイアログで、デフォルト・リストからtrueを選択します。「アプリケーションが使用するスキンの指定」を参照してください。

4. 名前フィールドに値を入力します。たとえば、これがスキンの最初のバージョンである場合はv1と入力します。

5. 「OK」をクリックします。

9.6 スキンのバージョニング時に行われる処理

スキン用に構成するバージョン情報は、実行時にアプリケーションでスキンが適用されるときに、プラットフォーム値およびデバイス値より優先されます。

実行時に、MAFアプリケーションでは、プラットフォーム固有のスキンが適用される前にデバイス固有のスキンが適用されます。スキンのバージョン情報が指定されている場合、アプリケーションでは最初に、指定したスキンのバージョン値と一致するスキンを検索します。スキン・バージョン値およびデバイス値と一致するスキンが見つかると、アプリケーションではこのスキンが適用されます。指定したスキン・バージョンのスキンがデバイス固有のスキン内で見つからなかった場合、アプリケーションでは指定したバージョンのスキンをプラットフォーム固有のスキン内で検索します。使用可能なプラットフォーム固有のスキン内で、指定したバージョンと一致するスキンが見つからない場合、アプリケーションではベース・スキンを検索します。

例9-2は、3つのスキン(customFamily-v1.iphone5,3、customFamily-v2.iPhone5,3およびcustomFamily-v3.iPhone5,3)を参照するmaf-skins.xmlの例を示しています。これらの各スキンの<family>要素は同じ値(customFamily)になっています。<version>要素の子要素の値によって、これらのスキンがそれぞれ区別されます。

実行時に、アプリケーションのmaf-config.xmlファイルにおける<skin-family>要素の値としてcustomFamilyが指定されたアプリケーションでは、customFamily-v1.iphone5,3を使用します。これは、このスキンがmaf-skins.xmlファイルでデフォルト・スキンとして構成されているためです。この動作は、「アプリケーションが使用するスキンの指定」で説明されているように、maf-config.xmlファイル内の<skin-version>要素に値を指定してオーバーライドできます。たとえば、maf-config.xmlファイルの<skin-version>要素の値としてv2を指定すると、アプリケーションでは、maf-skins.xmlファイルでデフォルト値として定義されているcustomFamily-v1.iphone5,3のかわりにcustomFamily-v2.iPhone5,3が使用されます。

(maf-config.xmlファイル内の<skin-version>要素を使用して)取得するスキンのバージョンを指定しない場合、アプリケーションはmaf-skins.xmlファイル内の<default>true</default>要素を使用してデフォルトとして定義されているスキンを使用します。デフォルトのスキンを指定しない場合、アプリケーションはmaf-skins.xmlファイル内で定義される最後のスキンを使用します。例9-2において、定義される最後のスキンはcustomFamily-v3.iPhone5,3です。

例9-2 バージョニングされたスキン・ファイルが含まれたmaf-skins.xmlファイル

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skin">
<skin id="s1">
<family>customFamily</family>
<id>customFamily-v1.iphone5,3</id>
<extends>customFamily-v1.iOS</extends>
<style-sheet-name>iphone.css</style-sheet-name>
<version>
<default>true</default>
<name>v1</name>
</version>
</skin>
<skin id="s2">
<family>customFamily</family>
<id>customFamily-v2.iPhone5,3</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.iPhone5,3</id>
<extends>customFamily-v1.iOS</extends>
<style-sheet-name>iphone-v3.css</style-sheet-name>
<version>
<name>v3</name>
</version>
</skin>
</adfmf-skins>

9.7 デフォルト・スキン・スタイルのオーバーライド

MAF AMXアプリケーションでは、MAF AMXとして実装されたアプリケーション機能に対して特定のスタイルを指定し、それによって、maf-config.xmlおよびmaf-skins.xmlファイル内のアプリケーション・レベルで設定されているデフォルトのスキン・スタイルをオーバーライドできます。

アプリケーション機能に個別のスタイルを追加するには、CSSファイルを包含ファイルとして使用します。

maf-feature.xmlファイルの概要エディタの「包含」表では、MAF AMXアプリケーション機能にCSSを追加できます。

図9-3 「包含」表

始める前に:

「タスク・フローの作成」の説明に従ってMAFタスク・フローを作成します。このスキンのCSSファイルを作成または追加します。ビュー・コントローラ・プロジェクトを選択し、「新規」→「CSSファイル」を選択してCSSファイルを作成できます。または、次のようにCSSファイルをJARファイルにパッケージ化することもできます。

1. メイン・メニューから「アプリケーション」→「プロジェクト・プロパティ」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」ページを選択し、「JAR/ディレクトリの追加」をクリックします。

3. 「アーカイブまたはディレクトリの追加」ダイアログで、インポートするスキンが含まれているJARファイルに移動し、「選択」をクリックします。
JARファイルが「クラスパス・エントリ」リストに表示されます。

4. 「OK」をクリックします。

アプリケーション機能にスタイル・シートを追加する方法:

1. 「追加」をクリックして、「包含」表に新しい行を作成します。

2. 「インクルードの挿入」ダイアログで、次のフィールドに値を入力します。

- ファイル: 追加するCSSスタイル・シートを参照して選択します。

- タイプ: ドロップダウン・リストから「スタイルシート」を選択します。

3. 「OK」をクリックします。

注意:

選択したスタイル・シートの.CSSファイルがビュー・コントローラ・プロジェクト内に存在する必要があります。

9.8 スキニングに関する必知事項

スタイルをカスタマイズし、アプリケーションを異なるデバイスにデプロイするときに適用できます。

maf-skins.xmlファイルで定義されるCSSファイル(例9-3を参照)は、Apple iPhoneとiPadの異なる表示要件に適応するようにスキンを拡張する方法を示します。これらのスタイルは降順に適用されます。SkinningDemoサンプル・アプリケーションでは、アプリケーションを異なるデバイスにデプロイするときに、カスタマイズされたスタイルを適用できるようにする方法のデモが提供されています。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

たとえば、iOSレベルでは、スタイルシート(例9-3のmobileAlta)がiPhoneまたはiPadのどちらにも適用されます。デバイス固有のスタイル用には、iPhoneおよびiPadのスキンに対して<skin-id>要素を定義します。スキニングのデモ・アプリケーションでは、この要素によって定義されたカスタム・スキンの使用方法が示されています。

例9-3 maf-skins.xmlファイルで定義されるスキニング・レベル

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skins">
<skin>
<id>mobileAlta-v1.6.iPhone5,3</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.6.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.6.iphone.css</style-sheet-name>
</skin>
<skin>
<id>mobileAlta-v1.6.iPad iPad4,1</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.6.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.6.ipad.css</style-sheet-name>
</skin>
<!--  Skin Additions -->
<skin-addition>
<skin-id>mobileAlta-v1.6.iPhone5,3</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.6.iPhone5,3</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition2.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.6.iOS</skin-id>
<style-sheet-name>skins/mystyles.ios.addition2.css</style-sheet-name>
</skin-addition>
</adfmf-skins>

9.9 スキンへの新しいスタイル・シートの追加

スキンを拡張するかわりに、CSSファイルを既存のスキンに追加できます。

新しいスタイルシートをスキンに追加するには:

1. 「コンポーネント」ウィンドウから「構造」ウィンドウに、<skin-addition>要素をドラッグ・アンド・ドロップします。

2. 「skin-additionの挿入」ダイアログ(図9-4を参照)に入力を行うことで、表9-2で説明した要素を<skin-addition>要素に移入します。

- 新しいスタイルを追加するスキンの識別子を入力します。

- CSSファイルの場所を取得します。

図9-4 「skin-additionの挿入」ダイアログ

3. 「OK」をクリックします。

注意:

DOM変更構造を使用するカスタム・スタイルを作成すると、MAFアプリケーションがハングする可能性があります。特に、displayプロパティでは、MAF AMXから変換されたHTMLでレンダリングに問題が発生します。このプロパティは、table、table-row、table-cellなどの値を使用してコンポーネントを表に変換しており、適切な親の表オブジェクト内に含まれていない表関連の構造が作成される可能性があります。この問題はアプリケーションのユーザー・インタフェース自体には表示されないことがありますが、ロギング・コンソールではSignal 10の例外によってレポートされます。

9.10 エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化

エンド・ユーザーが実行時に他のスキンを選択できるように、アプリケーションを構成できます。

エンド・ユーザーが必要により適したスキンを使用して、アプリケーションをレンダリングできるようにする場合に、この機能を構成します。

図9-5では、ボタンを表示して、エンド・ユーザーが実行時にアプリケーションで使用されるスキンを変更できるようにすることで、この機能をどのように実装するかを示しています。ページ上のボタンを構成して、後からアプリケーションのmaf-config.xmlファイルのskin-familyプロパティにより評価されるscope値を設定します。

図9-5 実行時におけるアプリケーションのスキンの変更(iOSの場合)

アプリケーションのmaf-config.xmlファイルのskin-familyプロパティの値の更新を可能にするコンポーネントを公開することにより、エンド・ユーザーがアプリケーションのスキンを変更できるようにします。

エンド・ユーザーが実行時にアプリケーションのスキンを変更できるようにするには:

1. maf-config.xmlファイルでスキン・ファミリ・プロパティを設定するために使用するコンポーネントを構成するページを開きます。

2. エンド・ユーザーが実行時に多数の使用可能なスキンの1つを選択できるようにする多数のコンポーネント(ボタン・コンポーネントなど)を構成します(図9-5を参照)。

次の例は、エンド・ユーザーが実行時に使用可能なスキンの1つを選択できるようにするamx:commandButtonコンポーネントの構成方法を示しています(図9-5を参照)。各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を記述します。例9-4は、エンド・ユーザーが選択した値をとり、それをマネージドBean内のskinFamilyの値の設定に使用するメソッドを示しています。例9-4は、新しいスキンを使用するためにアプリケーションのすべての機能をリセットするメソッドも示しています。例9-4 でも、「データ変更イベントの使用」で説明されているPropertyChangeSupportおよびPropertyChangeListenerオブジェクトが使用されます。

4. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開き、「ディスクリプタ」→「ADF Meta-INF」ノードを開き、maf.config.xmlファイルをダブルクリックします。

5. maf-config.xmlファイルで、EL式を記述してスキン・ファミリを動的に評価します。

<skin-family>#{applicationScope.SkinBean.skinFamily}</skin-family>

例9-4 アプリケーションのスキンを変更するためのマネージドBean

package application;

import javax.el.ValueExpression;
import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.FeatureInformation;
import oracle.adfmf.framework.api.AdfmfContainerUtilities;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;

public class SkinBean {

private String skinFamily = "mobileAlta";
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

public void setSkinFamily(String skinFamily) {
String oldSkinFamily = this.skinFamily;
this.skinFamily = skinFamily;
propertyChangeSupport.firePropertyChange("skinFamily", oldSkinFamily, skinFamily);
}

public String getSkinFamily() {
return skinFamily;
}

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public void switchToMobileAlta(ActionEvent ev){
this.switchSkinFamily("mobileAlta");
}

public void switchToMobileFusionFx(ActionEvent ev) {
this.switchSkinFamily("mobileFusionFx");
}

public void switchSkinFamily(String family) {
this.setSkinFamily(family);
// reset all the features individually as follows to load the new skin
FeatureInformation[] features = AdfmfContainerUtilities.getFeatures();
for (int i = 0; i < features.length; i++) {
AdfmfContainerUtilities.resetFeature(features[i].getId());
}
}
}

9.11 実行時に行われる処理: エンド・ユーザーによるアプリケーションのスキンの変更方法

実行時に、エンド・ユーザーは公開されたコンポーネントを使用して、別のスキンを選択します。

このコンポーネントは、エンド・ユーザーが選択した値をマネージドBeanに発行し、次にこれがマネージドBeanのプロパティ(skinFamily)の値を設定します。実行時に、maf-config.xmlファイルの<skin-family>プロパティでは、EL式を使用してマネージドBeanから値を読み取ります。また、例9-4のマネージドBeanは、新しく指定したスキンを使用するアプリケーションに機能を再ロードします。

ヒント:

<skin-family>プロパティと同様に、EL式を使用して、実行時にmaf-config.xmlファイルの<skin-version>プロパティの値を設定できます。

10 MAFアプリケーションでのプラグインの使用方法

この章では、MAFに用意されているコア・プラグインを有効にしてMAFアプリケーションで使用する方法、追加プラグインを登録する方法、FARからプラグインをインポートする方法、およびMAFアプリケーションのプラグインをパッケージ化してデプロイする方法について説明します。

この章の内容は次のとおりです。

- MAFアプリケーションでのプラグインの使用方法の概要

- MAFアプリケーションでのコア・プラグインの有効化

- MAFアプリケーションでの追加プラグインの登録

- MAFアプリケーション組込みプラグインのデプロイ

- 機能アーカイブ・ファイルからのプラグインのインポート

- MAFアプリケーションでのプラグインの使用方法

- iOSのデバイス機能にアクセスするプラグインの使用方法の説明の指定

- CordovaプラグインにWindowsプラットフォーム上のネイティブUIでの実行を許可する

10.1 MAFアプリケーションでのプラグインの使用方法の概要

MAFには様々なCordovaプラグインがパッケージ化されているので、MAFアプリケーションはこのプラグインを使用してデプロイ先のデバイスと対話できます。

コア・プラグインは、MAFに用意されているデフォルトのプラグインです。これらのプラグインはmaf-application.xmlの概要エディタで確認します。たとえば、MAFアプリケーションでデバイスの電子メール機能やコンタクト先機能へのアクセスに使用する電子メールプラグインやコンタクト先プラグインなどがあります。Android、iOSおよびWindowsプラットフォームで使用されているCordovaバージョンをmaf-application.xmlファイルの概要エディタで確認します。プラグインの説明を表示するには、「コア・プラグイン」リスト(図10-1を参照)でプラグインを選択します。新規作成したMAFアプリケーションでは、ネットワーク情報プラグインのみがデフォルトで有効になっています。「MAFアプリケーションでのコア・プラグインの有効化」の説明に従って、コア・プラグインを有効にします。

注意:

iOSデバイス上のすべてのアプリケーションにネットワーク・アクセスがデフォルトで許可されます。この動作は変更できません。Androidデバイスにデプロイされたアプリケーションでネットワーク・アクセスが不要な場合は、ネットワーク情報プラグインを無効にします。ネットワーク情報プラグインは、Androidエミュレータまたはデバイス上で実行されているアプリケーションのリモート・デバッグを容易にする場合は有効にする必要があります。

MAFに用意されているコア・プラグインではMAFアプリケーションの要件を満たさない場合は、追加プラグインを登録できます。「カスタムCordovaプラグイン開発の概要」(http://blogs.oracle.com/mobile/entry/introduction_to_custom_cordova_plugin)および「MAFアプリケーションでの追加プラグインの登録」を参照してください。MAFアプリケーションでコア・プラグインを有効にするかまたは任意の追加プラグインを登録したら、そのプラグインの機能にアクセスするアプリケーション機能内のコンテンツを作成します。「MAFアプリケーションでのプラグインの使用方法」を参照してください。

MAFアプリケーションのデプロイメントは、追加プラグインの登録後、次の理由で失敗する場合があります。

- MAFアプリケーションが使用するプラグイン間でファイル名の競合があります。

- 登録した追加プラグインは、適切に機能するために依存プラグインが必要です。

詳細は、「MAFアプリケーション組込みプラグインのデプロイ」を参照してください。「iOSのデバイス機能にアクセスするプラグインの使用方法の説明の指定」で説明しているように、MAFアプリケーションがiOSデバイス上のプライベート・データ(連絡先や写真など)にアクセスするプラグインを使用するときに、使用方法の説明を指定しておかないと、iOSプラットフォームへのデプロイに失敗することがあります。

以前のリリースのMAFで作成したMAFアプリケーションを移行する場合は、『Oracle Mobile Application Frameworkのインストール』の前のリリースからMAF 2.4.1へのCordovaプラグインの移行に関する項を参照してください。

注意:

アプリケーションのプラグインを管理するためにmaf-application.xmlファイルを編集すると、maf-plugins.xmlファイルのリビジョンが作成されます。両方のファイルへのアクセスを行う「アプリケーション・リソース」ペインの「ADF-META-INF」ノードを図10-1に示します。

図10-1 maf-application.xmlの概要エディタに表示されたプラグイン

10.2 MAFアプリケーションでのコア・プラグインの有効化

新しいアプリケーションは、ネットワーク情報コア・プラグインのみを使用できます。追加のプラグインは、使用する前に登録する必要があります。

新規作成したMAFアプリケーションでは、1つのコア・プラグイン(ネットワーク情報プラグイン)のみがデフォルトで有効になっています。他のコア・プラグインを有効または無効にして、関連するデバイスの機能にMAFアプリケーションがアクセスできるようにしてください。

10.2.1 MAFアプリケーションでコア・プラグインを有効にする方法

MAFアプリケーションのmafapplication.xmlファイルの概要エディタを使用して、コア・プラグインを有効化する手順を使用してください。

コア・プラグインは、MAFアプリケーションのmaf-application.xmlファイルの概要エディタを使用して有効化します。

MAFアプリケーションでコア・プラグインを有効にする手順:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開きます。

2. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

3. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「プラグイン」ナビゲーション・タブをクリックします。

4. 「コア・プラグイン」セクションを展開し、アプリケーションが機能にアクセスできるようにするプラグインを選択します。

たとえば、MAFアプリケーションでSMSメッセージを送信できるようにするには、SMSプラグインのチェック・ボックスを選択します。

10.2.2 MAFアプリケーションでコア・プラグインを有効にする場合の処理

JDeveloperは、アプリケーションで有効化されたプラグインを識別するエントリで、アプリケーションのmaf-plugins.xmlファイルを編集します。

概要エディタでプラグインを有効にすると、JDeveloperによってアプリケーションのmaf-plugins.xmlファイルが編集され、MAFアプリケーションで有効なプラグインを特定するエントリが追加されます。例10-1に、電子メールおよびネットワーク情報の各プラグインが有効になっているMAFアプリケーションのエントリを示します。デバイスの電子メール・クライアントを使用し、インターネットにアクセスするMAFアプリケーションでは、これらのプラグインの有効化は必須です。

例10-1 maf-plugins.xmlファイル内の有効なコア・プラグイン

<?xml version="1.0" encoding="UTF-8" ?>
<maf-plugins xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/adf/mf">
<cordova-plugins>
<core-cordova-plugin id="c1" pluginId="cordova-plugin-network-information"/>
<core-cordova-plugin id="c2" pluginId="com.oracle.maf.email"/>
</cordova-plugins>
</maf-plugins>

10.3 MAFアプリケーションでの追加プラグインの登録

追加のプラグインは、そのプラグインの登録後にMAFアプリケーションで使用できるようになります。

MAFに用意されたコア・プラグインでは提供されていない機能がMAFアプリケーションで必要な場合は、MAFアプリケーションに追加プラグインを登録します。

10.3.1 追加プラグインを登録する方法

MAFアプリケーションのmaf-application.xmlファイルの概要エディタを使用して、プラグインを登録する手順を使用してください。追加のプラグインを使用する場合は、登録が必要になります。

MAFアプリケーションの追加プラグインを登録するには、アプリケーションのmaf-application.xmlファイルの概要エディタを使用します。

開始する前に、アプリケーション、およびアプリケーションに登録されるプラグインが同じドライブに格納されていることを確認します。たとえば、Windows環境でC:ドライブにアプリケーションが格納されている場合、そのアプリケーションに登録するプラグインもC:ドライブに格納する必要があります。これにより、JDeveloperでは相対パスを使用してアプリケーションにプラグインを正常に登録できます。

MAFアプリケーションに追加プラグインを登録するには:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを展開します。

2. 「アプリケーション・リソース」パネルで「ディスクリプタ」を展開し、「ADF META-INF」を展開します。

3. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「プラグイン」ナビゲーション・タブをクリックします。

4. 「追加のプラグイン」セクションを展開し、「追加」アイコンをクリックして、ダイアログを表示します。

5. アプリケーションに登録されるプラグインを格納しているディレクトリを参照して選択します。

10.3.2 MAFアプリケーションに追加プラグインを登録する場合の処理

追加のプラグインが登録されると、JDeveloperは、MAFアプリケーションで有効化されたプラグインを識別するエントリで、アプリケーションのmaf-plugins.xmlファイルを編集します。

MAFアプリケーションで使用するプラグインのソース・ファイルを選択すると、JDeveloperによってアプリケーションのmaf-plugins.xmlファイルが編集され、MAFアプリケーションで有効なプラグインを特定するエントリが追加されます。例10-2は、MAFアプリケーションにグローバリゼーション・プラグイン(図10-2を参照)が登録されている場合のmaf-plugins.xmlファイル内のエントリを示したものです。

図10-2 maf-application.xmlの概要エディタに表示された追加プラグイン

例10-2 maf-plugins.xmlファイル内の追加プラグイン

<?xml version="1.0" encoding="UTF-8" ?>
<maf-plugins xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/adf/mf">
<cordova-plugins>
<core-cordova-plugin id="c1" pluginId="cordova-plugin-network-information"/>
<cordova-plugin id="c2" pluginId="cordova-plugin-globalization"
path="../../../../CordovaPlugins/cordova-plugin-globalization/">
<platform id="p1" name="android" enabled="true"/>
<platform id="p2" name="ios" enabled="true"/>
<platform id="p3" name="windows" enabled="true"/>
</cordova-plugin>
</cordova-plugins>
</maf-plugins>

10.4 MAFアプリケーション組込みプラグインのデプロイ

プラグインは、FAR、またはモバイル・アプリケーション・アーカイブ・ファイルにデプロイされることがあります。プラグインは、Android、iOS、またはWindowsのデプロイメント・プロファイルを使用してデプロイされることがあります。

MAFアプリケーション組込みプラグインのデプロイメントは、選択したデプロイメント方法によって異なります。

FARへのデプロイメント

FARへのデプロイメントには、アプリケーションのmaf-plugins.xmlファイルのコピー(ファイル名: jar-maf-plugins.xml)が含まれます。これは、アプリケーションのmaf-plugins.xmlファイルと同じですが、各プラグインのpath属性値が空の文字列である点が異なります。FARデプロイメントにはプラグインのソース・ファイルは含まれません。

モバイル・アプリケーション・アーカイブ・ファイルへのデプロイメント

モバイル・アプリケーション・アーカイブ・ファイルへのデプロイメントには、すべてのpath属性が空の文字列に設定された、アプリケーションのmaf-plugins.xmlファイルのコピーが含まれます。

Android、iOSまたはWindowsデプロイメント・プロファイルを使用したデプロイメント

Android、iOSまたはWindowsデプロイメント・プロファイルを使用したデプロイメント時、JDeveloperはアプリケーションをビルドおよびデプロイするツールを起動します。次に、これらのツールがCordovaプラグイン・ツールを起動して、構成済のプラグインをそのソースの場所からデプロイメント・フォルダにインストールします。

プラグイン間における名前の競合の解決

MAFアプリケーションで使用されている複数のプラグインに同じ名前のリソース・ファイルが含まれている場合、名前の競合が原因でデプロイメントに失敗する可能性があります。たとえば、MAFアプリケーションで2つのプラグインを使用し、両方のリソース・ファイルがarrays.xmlである場合、デプロイメントは失敗します。

このような名前の競合を解決するには、他のプラグインのリソース・ファイル名と競合しているプラグインのリソース・ファイル名を変更します。1番目のプラグインのplugin.xmlファイル内で、リソース・ファイルへの参照を更新します。この例では、1番目のプラグインのarray.xmlリソース・ファイル名をpluginone_arrays.xmlに変更して、プラグインのplugin.xmlファイルを次のように編集する必要があります。

<source-file src="src/android/LibraryProject/res/values/pluginone_arrays.xml"
target-dir="res/values"/>

iOSにデプロイするMAFアプリケーションの使用方法の説明

デバイス機能(連絡先やカメラなど)へのアクセスを要求するプラグインを有効化すると、iOSプラットフォームへのMAFアプリケーションのデプロイメントは失敗します。「iOSのデバイス機能にアクセスするプラグインの使用方法の説明の指定」で説明するように、使用方法の説明を指定してください。

不足している依存プラグインの追加

MAFアプリケーションで使用する追加プラグインに必要なプラグイン(依存プラグイン)が検出されないと、デプロイメントに失敗する場合があります。このシナリオは、ファイアウォールの内側で作業している場合に発生する可能性があります。デプロイメント時に、JDeveloperは、プラグイン依存を管理するためにApache Cordovaのツールを起動します。これらのツールは、依存プラグインのダウンロードを許可するようにプロキシ設定が構成されていないと、依存プラグインのダウンロードに失敗する場合があります。このシナリオを回避するには、不足している依存プラグインをダウンロードして、MAFアプリケーションに追加します。不足している依存プラグインの追加は、MAFアプリケーションに他のプラグインを追加する場合と同じ方法で行います。「MAFアプリケーションでの追加プラグインの登録」を参照してください。依存するプラグインを追加したら、例10-3に示すように、maf-plugins.xmlファイル内でそれを必要とするプラグインの前に追加されていることを確認します。

例10-3 MAFアプリケーションへの依存プラグインの追加

<maf-plugins xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/adf/mf">
<cordova-plugins>
....
<cordova-plugin id="c2" pluginId="com.example.dependent.dependentPlugin"
path="../../../../../plugins/Dependent-Plugin-Required-By-PluginWithID_c3/">
...
<cordova-plugin id="c3" pluginId="com.example.plugin"
path="../../../../../plugins/AdditionalPlugin/">
...
</cordova-plugins>
</maf-plugins>

10.5 機能アーカイブ・ファイルからのプラグインのインポート

プラグインは、機能アーカイブ・ファイルからアプリケーションにインポートできます。

jar-maf-plugins.xmlファイルが格納されたFARをアプリケーションにインポートすると、jar-maf-plugins.xmlファイルの内容は使用するアプリケーションのmaf-plugins.xmlファイルにマージされます。JDeveloperではマージに関する情報を「メッセージ」ウィンドウに記録します。

FARからインポートするプラグインがすでにコンシューマ・アプリケーションのmaf-plugins.xmlファイルに存在する場合、プラグインはアプリケーションに存在するのでマージされないというメッセージがJDeveloperによってログに記録されます。

FARからインポートするプラグインがコンシューマ・アプリケーションのmaf-plugins.xmlファイルに存在しない場合、JDeveloperはそのプラグインをアプリケーションのmaf-plugins.xmlファイルに追加します。このシナリオでは、「MAFアプリケーションでの追加プラグインの登録」の説明に従って、新しくインポートしたプラグインへのパスを設定する必要があります。

10.6 MAFアプリケーションでのプラグインの使用方法

MAFアプリケーションで有効化されたプラグインを呼び出し、カメラなどのデバイス機能と対話したり、電子メール、バーコード・スキャナ・アプリケーションなど、デバイスの他のアプリケーションを使用したりすることができます。

Java、MAF AMXページおよびローカルHTMLからプラグインを起動する方法の詳細は、「カスタムCordovaプラグインのMAFアプリへの統合」(http://blogs.oracle.com/mobile/entry/integrating_a_custom_cordova_plugin)を参照してください。

BarcodeDemoサンプル・アプリケーションでは、このタスクを実現する方法も示しています。

図10-3 プラットフォーム固有コンテンツおよびプラグイン・アクセスの制約

図10-4は、BarcodeDemoサンプル・アプリケーションの実行時にユーザーのデバイス上にレンダリングされるMAF AMXページのボタン(Scan)を示しています。このボタンは、管理対象Beanのメソッドを起動し、その管理対象のBeanメソッドは、BarcodeScannerプラグインをコールするJavaScript関数を起動します。

図10-4 プラグインにアクセスする管理対象Beanのメソッドを起動するコマンド・ボタン

例10-4に、BarcodeDemoサンプル・アプリケーションから抽出したいくつかのコードを示します。

BarcodeDemoサンプル・アプリケーション以外に、MAFアプリケーションで追加プラグインを使用する方法を示すその他のサンプル・アプリケーションとして、BeaconDemo、FakeBeaconおよびDatePickerがあります。「サンプルのMAFアプリケーション」を参照してください。

例10-4 バーコード・スキャナ・プラグインの使用方法

<!--  The following code snippet from the scanner.amx file shows how the Scan button invokes the scanBarcode method in the managed bean -->
<amx:commandButton text="Scan" id="cl2" actionListener="#{viewScope.BarcodeBean.scanBarcode}"/>

<!--  The following code snippet from the BarcodeBean.java file shows how the scanBarcode managed bean method invokes a JavaScript function -->
public void scanBarcode (ActionEvent event)
{
// Invokes a JavaScript function named “scanBarcodeFromJavaBean”
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.getFeatureId(),
"scanBarcodeFromJavaBean",
new Object[] { });
}

<!--  The following code snippet from the scanner.js file shows how the JavaScript function accesses the barcode scanner and sets the resulting value in a managed bean field.-->
function scanBarcodeFromJavaBean(options)
{
cordova.plugins.barcodeScanner.scan(
function(result)
function onSuccess(result) {
adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeError}",
"value": ""},
function() {},
function() {});

adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeResult}",
"value": result.text},
function() {},
function() {});

adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeFormat}",
"value": result.format},
function() {},
function() {});

adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeCancelled}",
"value": result.cancelled == 1 ? "Yes" : "No"},
function() {},
function() {});
}

function onError(error) {
adf.mf.api.setValue( { "name": "#{viewScope.BarcodeBean.barcodeError}",
"value": "ERROR: " + error.text},
function() {},
function() {});
}

// Callable externally
scanBarcodeFromJavaBean = function() {
cordova.plugins.barcodeScanner.scan(onSuccess, onError);
}

10.7 iOSのデバイス機能にアクセスするプラグインの使用方法の説明の指定

iOSにデプロイするMAFアプリケーションは、そのMAFアプリケーションがユーザーのデータにアクセス可能なハードウェア機能(デバイスのカメラなど)を使用する場合、使用方法の説明が必要になります。

iOSプラットフォームでは、アプリケーションが機能と潜在的に機密性の高いユーザー・データにアクセスする許可をエンド・ユーザーに求めるために使用するシステム・ダイアログに表示するために、こうした説明を必要とします。図10-5は、テキスト「This application allows the user to upload photos from their photo library」がMAFアプリケーションからの使用方法の説明である場合の例を示しています。

図10-5 iOSにデプロイされたMAFアプリケーションのUIに示される使用方法の説明

MAFの基本的な使用方法では、使用方法の説明の指定が必要になる機能は有効化されていません。ただし、使用方法の説明が必要になるコア・プラグインや、使用方法の説明が必要になるその他のプラグインを有効化している場合は、アプリケーションを正常にデプロイするために使用方法の説明を指定する必要があります。使用方法の説明を指定していないと、アプリケーションがクラッシュすることや、Apple App Storeに拒否されることがあります。

カメラ、連絡先、地理的位置のコア・プラグインは、使用方法の説明を必要とします。MAFは、こうしたコア・プラグインに対して、次に示す汎用的な使用方法の説明を指定しています。

- Camera: カメラ・プラグインは、デバイスのカメラとフォト・ライブラリへのアクセスが可能です。
このプラグインは、CocoaキーのNSCameraUsageDescriptionとNSPhotoLibraryUsageDescriptionに対する使用方法の説明を必要とします。

- Contacts: 連絡先プラグインは、デバイス上のアドレス帳へのアクセスが可能です。
このプラグインは、CocoaキーのNSContactsUsageDescriptionに対する使用方法の説明を必要とします。

- Geolocation: 地理的位置プラグインは、デバイス上のデバイス位置情報サービスを使用します。
このプラグインはCocoaキーのNSLocationWhenInUseUsageDescriptionに対する使用方法の説明を必要とします。

これらの汎用的な使用方法の説明は、これらの汎用的な使用方法の説明は、MAFアプリケーションを正常にデプロイするためのiOSプラットフォームの技術的要件を満たしています。具体的な使用方法の説明を指定することをお薦めします(プラグインが要求する機能やデータへのアクセスをアプリケーションが必要としている理由を説明してください)。MAFアプリケーションに登録する追加のプラグインが使用方法の説明を必要とする場合は、使用方法の説明を指定する必要があります。

使用方法の説明は、アプリケーションのリソース・バンドル.XLFファイルで指定します。使用方法の説明は、trans-unit要素のid属性の値として、iOSプラットフォームのCocoaキーを使用します。次の例は、MAFアプリケーションがユーザーのフォト・ライブラリへのアクセス許可をエンド・ユーザーに求めるときに表示される使用方法の説明を示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
<file source-language="en" original="mobile.ViewControllerBundle" datatype="x-oracle-adf">
<body>
<trans-unit id="NSPhotoLibraryUsageDescription">
<source>This application allows the user to upload photos from their photo library.</source>
...

また、MAFアプリケーションで複数のロケールをサポートする場合は、ロケール固有のリソース・バンドルにも使用方法の説明を指定します。次の例は、対応する使用方法の説明を示しています。これは、ロケールがFrenchの場合にレンダリングされます。

...
<file source-language="fr" original="mobile.ViewControllerBundle_fr" datatype="x-oracle-adf">
<body>
<trans-unit id="NSPhotoLibraryUsageDescription">
<source>Cette application permet à l'utilisateur de télécharger des photos à
partir de leur bibliothèque de photos.</source>
...

デプロイメント時に、MAFは、リソース・バンドルで定義されている使用方法の説明を、iOSデバイスにデプロイされるアプリケーションのinfo.plistファイルに移入します。

MAFアプリケーションのリソース・バンドルの作成の詳細と、ロケール固有のリソース・バンドルの作成方法は、「MAFアプリケーションのローカライズ」を参照してください。

使用方法の説明を識別するCocoaキーのリストは、Apple社のCocoaキーのドキュメントで、キーの名前にUsageDescriptionが付加されたキーについて参照してください(https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html)。

10.8 CordovaプラグインにWindowsプラットフォーム上のネイティブUIでの実行を許可する

Windowsプラットフォーム上でネイティブUIを表示または使用する必要があるプラグイン用に、windows-run-in-core-window="enabled"属性をmaf-plugins.xmlファイル・エントリに追加する必要があります。

そのようなプラグインの例はcordova-plugin-media-captureで、Windows上でアプリケーションによるイメージ、ビデオまたはオーディオのキャプチャを開始します。

Windowsプラットフォーム上で実行する標準のCordovaアプリケーションは、CordovaとそのプラグインがメインHTMLページ内で実行する、1ページ・アプリケーションのように実行します。AndroidおよびiOSプラットフォームで実行するCordovaアプリケーションは、コンテナ内で実行します。これらの最新の2つのプラットフォームのWebViewは、カメラなど、プラグインによりアクセスできるようになる機能をユーザーが呼び出せるように、UIを表示し、Cordovaプラグインをロードします。

MAFアプリケーションは、アプリケーションがインストールされているデバイス(Android、iOSまたはWindowsデバイス)上のコンテナ内で実行します。Windows上で実行し、ネイティブUIを使用する、MAFアプリケーション内のCordovaプラグインを有効にするときは、MAFアプリケーションがWindowsデバイスで必要なアプリケーションを呼び出せるように、図10-6に示すコアWindowsで実行チェックボックスを選択する必要があります。プライマリ・プラグインが正常に機能するように、プライマリ・プラグインが必要とする追加のプラグインに対するこの属性も設定する必要があります。

図10-6 プラグインがWindowsでネイティブUIにアクセスするためのコアWindowsで実行チェックボックス

次の例に示すように、図10-6に示すコアWindowsで実行チェックボックスを選択すると、アプリケーションのAppRootDirectory\.adf\META-INFディレクトリのmaf-plugins.xmlファイルが更新されます。

この属性のデフォルト値はdisabled (windows-run-in-core-window="disabled")です。

例10-5 WindowsでネイティブUIにアクセスするためのmaf-plugins.xmlファイルの構成

<maf-plugins xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/adf/mf">
<cordova-plugins>
<cordova-plugin id="c3" pluginId="cordova-plugin-media-capture" path="../../plugins/cordova-plugin-media-capture/"
windows-run-in-core-window="enabled">
<platform id="p1" name="android" enabled="true"/>
<platform id="p2" name="ios" enabled="true"/>
<platform id="p3" name="windows" enabled="true" />
</cordova-plugin>
...
// The cordova-plugin-media-capture requires the cordova-plugin-file plugin be enabled so that media files
// can be saved on the device. For that reason, you must also configure the additional Windows-specific attribute here.
<cordova-plugin id="c4" pluginId="cordova-plugin-file" path="../../plugins/cordova-plugin-file/"
windows-run-in-core-window="enabled">
...

11 MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ

この章では、Oracle Metadata Services (MDS)を使用してMAFアプリケーションレベルのアーティファクトをカスタマイズする方法について説明します。

この章の内容は次のとおりです。

- MDSカスタマイズをMAFファイルに適用する方法の概要

- カスタマイズ・レイヤーの構成

- カスタマイズ・クラスの作成

- カスタマイズ・クラスの使用

- 「カスタマイズ開発者」ロールの理解

- リソース・バンドルでのカスタマイズの有効化

- カスタマイズを使用したMAFアプリケーションのアップグレード

11.1 MDSカスタマイズをMAFファイルに適用する方法の概要

MDSは、再ブランディング、カスタマイズおよびパーソナライズによって、様々な業界、地域、またはユーザー・グループにアプリケーションを適応させるために使用できます。

Oracle Metadata Services (MDS)を使用して、デザインタイムにMAFアプリケーションを再ブランド設定、カスタマイズおよびパーソナライズします。MDSにより、単一のアプリケーションを様々な産業、場所またはユーザー・グループに適応させます。たとえば、MDSでは、ユーザー・グループまたはユーザー職責にあわせてアプリケーションのルック・アンド・フィールを調整できます。

カスタマイズしたアプリケーションは、ベース・アプリケーションとカスタマイズの1つ以上のレイヤーで構成されます。各レイヤーには、複数のレイヤー値を指定できます。これらのレイヤー値を、指定の優先順位に従ってベース・メタデータの最上位に適用できます。

MAFでは、MDSシード・カスタマイズ・パターンがサポートされます。デザインタイムに適用されるカスタマイズ・レイヤーを定義することで、汎用アプリケーションを特定のグループ(特定の産業やサイトなど)に適応させます。これらのシード・カスタマイズはデプロイされたアプリケーションの一部として存在し、特定のデプロイの存続期間中保持されます。

MDSを使用して、MAFアプリケーションの次のアーティファクトをカスタマイズします。

- maf-feature.xmlファイル

- maf-skins.xmlファイル

- maf-application.xmlファイル

- maf-config.xmlファイル

- MAF AMXファイルおよびメタデータ・ファイル(「MAF AMXアプリケーション機能アーティファクトのカスタマイズ」を参照)。

11.2 MDSによるMAFアプリケーションのカスタマイズ

MDSを使用してMAFアプリケーションをカスタマイズするには、グローバルまたはアプリケーション固有のカスタマイズ・レイヤーを定義して、カスタマイズ・クラスを作成し、そのクラスをJARファイルとしてパッケージ化してJDeveloperでアクセスできるようにします。MDSを使用してMAFアプリケーションをカスタマイズする手順を使用してください。

MDSを使用してMAFアプリケーションをカスタマイズするには、次の手順を実行します。

1. 1つ以上のグローバルまたはアプリケーション固有のカスタマイズ・レイヤーを定義します。「カスタマイズ・レイヤーの構成」を参照してください。

2. MDSでベース・アプリケーションに適用するカスタマイズの決定に使用するカスタマイズ・クラスを作成します。各カスタマイズ・クラスは、ベース・カスタマイズ・レイヤーを定義します。「カスタマイズ・クラスの作成」を参照してください。

3. カスタマイズ・クラス(.javaファイル)をJARファイルとしてパッケージ化して、JDeveloperデザインタイムがカスタマイズにアクセスできるようにします。次に、MAFアプリケーションのいずれかのプロジェクトにJARファイルを追加します。「カスタマイズ・クラスの使用」を参照してください。

4. adf-config.xmlファイルのcust-configセクションにカスタマイズ・クラスを追加して、優先順位に従ってカスタマイズ・クラスを登録します。

5. 「カスタマイズ開発者」ロールでJDeveloperを起動するか、そのロールに切り替えます。「「カスタマイズ開発者」ロールの理解」を参照してください。

6. 必要に応じてファイルを変更します。変更はMDSにより、ViewControllerプロジェクトのmdssysディレクトリに記録されます。

7. 「カスタマイズ・コンテキスト」ウィンドウからカスタマイズ・レイヤーを選択します(図11-1を参照)。

図11-1 カスタマイズ・レイヤーの選択(ヒント・レイヤー)

注意:

「カスタマイズ開発者」ロールで作業する際、「カスタマイズ・コンテキスト」ウィンドウで選択したレイヤーとレイヤー値をヒント・レイヤーと呼びます。「カスタマイズ開発者」ロールで作業中に行った変更は、このレイヤーにのみ適用されます。

8. アプリケーションを、デバイス、エミュレータにデプロイするか、プラットフォーム固有のアプリケーション・パッケージとしてデプロイします。カスタマイズしたアプリケーションをデプロイするには、次のように「カスタマイズ開発者」ロールを使用する必要があります。

a. 「カスタマイズ開発者」ロールで、アプリケーションを起動します。

b. 図11-1に示す「カスタマイズ・コンテキスト」ウィンドウで、カスタマイズを実装するレイヤーと値を選択します。

c. 「アプリケーション」をクリックしてから、「デプロイ」をクリックし、デプロイメント・オプションとデプロイメント・プロファイルを選択します。「MAFアプリケーションのデプロイ」を参照してください。

d. 各カスタマイズ・コンテキストを個別にデプロイします。

デプロイメント時に、ベース・ファイルおよびデルタ・ファイルがマージされ、実行時のアプリケーションのカスタマイズ・バージョンが作成されます。デプロイされたアプリケーションには、MDSの依存性はありません。

ヒント:

別のカスタマイズやアップグレードを実行するには、カスタマイズしたアプリケーションをMAFアプリケーション・アーカイブ(.maa)ファイルとしてデプロイして、そのファイルをアプリケーションにインポートします。.maaファイルに含まれるデルタ・ファイルは、デプロイメント後にベース・ファイルとマージされます。「カスタマイズを使用したMAFアプリケーションのアップグレード」を参照してください。

カスタマイズ・プロセスが完了すると、JDeveloperによりカスタマイズ用のメタデータ・ファイルとこれらを格納するサブパッケージの両方が作成されます。メタデータ・ファイルにはカスタマイズしたオブジェクトのカスタマイズが含まれ、これらは実行時にベース・メタデータに適用されます。JDeveloperでは、新しいメタデータ・ファイルにオブジェクトのベース・ファイルと同じ名前が付けられますが、.xml拡張子が追加されます(図11-2のmaf-feature.xml.xmlを参照)。

図11-2 maf-feature.xmlメタデータ・ファイル

11.3 カスタマイズ・レイヤーの構成

アプリケーションのカスタマイズは、カスタマイズ・レイヤーとその値をCustomizationLayerValues.xmlファイルで指定して、JDeveloperで認識されるようにします。

カスタマイズ可能なアプリケーションを「カスタマイズ開発者」ロールで開くと、JDeveloperによりadf-config.xmlファイルが読み取られ、使用するカスタマイズ・クラスと優先順位が判別されます。また、CustomizationLayerValues.xmlファイルも読み取られ、「カスタマイズ・コンテキスト」ウィンドウで使用可能にするレイヤー値が判別されます。CustomizationLayerValues.xmlファイルで定義されたレイヤー値がカスタマイズ・クラス(adf-config.xmlファイルにリストされている)で定義されていない場合、これらは「カスタマイズ・コンテキスト」ウィンドウに表示されません。

したがって、CustomizationLayerValues.xmlファイルにすべてのカスタマイズ・プロジェクトの包括的なレイヤー値リストを含めて、現在のアプリケーションに適したもののみを「カスタマイズ・コンテキスト」ウィンドウに表示できます。逆に、MAFアプリケーションの包括的なカスタマイズ・クラスのリストをadf-config.xmlファイルに含めて、作業するレイヤー値のサブセットのみをCustomizationLayerValues.xmlファイルに含めることもできます。

注意:

デザインタイムには、JDeveloperはCustomizationLayerValues.xmlファイルからカスタマイズ・レイヤー値を取得します。ただし、ランタイムには、レイヤー値はカスタマイズ・クラスから取得されます。

CustomizationLayerValues.xmlファイルに入力するレイヤー名およびレイヤー値は、カスタマイズ・クラスで指定されたものと一致する必要があります。次の例は、サンプルのCustomizationLayerValues.xmlファイルの内容を示しています。

<cust-layers  xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer name="industry" id-prefix="i">
<cust-layer-value value="financial"
display-name="Financial"
id-prefix="f"/>
<cust-layer-value value="healthcare"
display-name="Healthcare"
id-prefix="h"/>
</cust-layer>
<cust-layer name="site" id-prefix="s">
<cust-layer-value value="headquarters"
display-name="HQ"
id-prefix="hq"/>
<cust-layer-value value="remoteoffices"
display-name="Remote"
id-prefix="rm"/>
</cust-layer>
</cust-layers>

各レイヤーとレイヤー値に、id-prefixトークンを追加できます。これにより、idの一意性を確保し、カスタマイズを正確に適用できます。カスタマイズ中に新規要素を追加すると、(選択したヒント・レイヤーで決定された)レイヤーとレイヤー値のid-prefixが要素の自動生成識別子に追加され、カスタマイズ・メタデータ・ファイルで新たに追加された要素のidが作成されます。前述の例では、siteレイヤーにsというid-prefixが付けられ、headquartersレイヤー値にhqというid-prefixが付けられています。 そのため、ヒント・レイヤーとしてsite/headquartersを選択して要素を追加すると、その要素のidはメタデータ・カスタマイズ・ファイルでshqelに設定されます。

各レイヤー値にdisplay-nameトークンを追加して、レイヤー値に人間が判読可能な名前を指定することもできます。「カスタマイズ開発者」ロールで作業する際、そのレイヤー値のdisplay-nameトークンの値が「カスタマイズ・コンテキスト」ウィンドウに表示されます。

レイヤーごとに、カスタマイズ・レイヤーに対する値セットのサイズを定義するvalue-set-sizeトークンを、オプションで設定できます。これは、たとえば、設計時にアプリケーション固有のCustomizationLayerValues.xmlファイルを使用する場合などに役立ちます。value-set-sizeをno_valuesに設定することで、デザインタイムにランタイムのみのレイヤーを除外できます。

<cust-layer name="runtime_only_layer" value-set-size="no_values"/>

カスタマイズ・レイヤー値はJDeveloper用にグローバルにまたはアプリケーション固有ファイルで定義できます。アプリケーション固有ファイルを使用する場合、このファイルはグローバル・ファイルより優先されます。JDeveloperでのレイヤー値のグローバルな構成の詳細は、「レイヤー値をグローバルに構成する方法」を参照してください。アプリケーション固有のレイヤー値の構成方法の詳細は、「Studio開発者ロールの使用方法」を参照してください。

11.3.1 レイヤー値をグローバルに構成する方法

カスタマイズ・レイヤーの値は、デザインタイムにCustomizationLayerValues.xmlファイルでJDeveloperに対してグローバルに構成されます。このファイルは、JDeveloperインストール・ディレクトリのjdevサブディレクトリ内にあります。デザインタイム・カスタマイズ・レイヤー値をJDeveloperに対してグローバルに構成する手順を使用してください。

始める前に:

- 「カスタマイズ・クラスの作成」の説明に従ってカスタマイズ・クラスを作成します

- 「カスタマイズ・クラスの使用」の説明に従って、クラスをJDeveloperで使用できるようにします

JDeveloper用にデザインタイム・カスタマイズ・レイヤー値をグローバルに構成するには:

1. JDeveloperインストール・ディレクトリのjdevサブディレクトリにあるCustomizationLayerValues.xmlファイル(jdev_install\jdev\CustomizationLayerValues.xml)を開きます。

2. 各レイヤーについて、次の例に示すようにcust-layer要素を入力します。

<cust-layers xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer name="company" id-prefix="c">
<!-- Generated id-prefix would be "c1" and "c2" for values
"company1" and "company2".-->
<cust-layer-value value="company1" display-name="Acme Inc"
id-prefix="1"/>
<cust-layer-value value="company2" display-name="My Corp" id-prefix="2"/>
<!-- Generated id-prefix would be "s" for value "site"
since no prefix was specified on the value -->
</cust-layer>
</cust-layers>

3. 各レイヤー値に、前の例に示したようにcust-layer-value要素を入力します。

4. CustomizationLayerValues.xmlファイルを保存して閉じます。

5. グローバルなCustomizationLayerValues.xmlファイルに変更を加えたら、JDeveloperを再起動します。

注意:
特定のアプリケーションのCustomizationLayerValues.xmlファイルを構成する手順は、「Studio開発者ロールの使用方法」および「「カスタマイズ開発者」ロールの使用方法」を参照してください。

11.3.2 アプリケーションレベルのレイヤー値の構成方法

アプリケーションレベルのカスタマイズ・レイヤーの値は、Studio開発者ロールまたは「カスタマイズ開発者」ロールのいずれかを使用して構成できます。

アプリケーションのレイヤー値を構成する場合、Studio開発者ロール(「Studio開発者ロールの使用方法」を参照)または「カスタマイズ開発者」ロール(「「カスタマイズ開発者」ロールの使用方法」を参照)のいずれかを使用できます。アプリケーション固有のCustomizationLayerValues.xmlファイルを構成する場合、レイヤー値を作成および変更できますが、追加のカスタマイズ・レイヤーを作成できません。アプリケーション固有のレイヤー値に対して行った変更を適用するためにJDeveloperを再起動する必要はありません。

アプリケーション固有のCustomizationLayerValues.xmlファイルを作成すると、JDeveloperはこのファイルをアプリケーションレベルのディレクトリに格納します(workspace-directory\.mds\dt\customizationLayerValues\CustomizationLayerValues.xmlなど)。このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」ウィンドウのMDS DTノードの下にあります。

11.3.2.1 Studio開発者ロールの使用方法

JDeveloperで使用できるカスタマイズ・クラスを作成したら、Studio開発者ロールから特定のアプリケーションのCustomizationLayerValues.xmlファイルを構成する手順を使用してください。

次に、Studio開発者ロールで特定アプリケーションのCustomizationLayerValues.xmlファイルを構成する手順について説明します。

始める前に:

- 「カスタマイズ・クラスの作成」の説明に従ってカスタマイズ・クラスを作成します

- 「カスタマイズ・クラスの使用」の説明に従って、クラスをJDeveloperで使用できるようにします

Studio開発者ロールからワークスペース・レベルでデザインタイム・カスタマイズ・レイヤー値を構成するには:

1. 「アプリケーション・リソース」ウィンドウで、「ディスクリプタ」→「ADF META-INF」ノードを開き、adf-config.xmlをダブルクリックします。

2. 概要エディタで、「MDS構成」ナビゲーション・タブをクリックします。

3. カスタマイズ・クラスの表の下の「MDS構成」ページで、「デザインタイム・カスタマイズ・レイヤー値の構成」をクリックして、ワークスペース・レベルのCustomizationLayerValues.xmlファイルをソース・エディタで開きます。

注意:

オーバーライド・ファイルが存在しない場合、JDeveloperは、確認ダイアログを表示します。「はい」をクリックして、グローバル・ファイルのコピーを作成して開きます。

4. このファイルで、「カスタマイズ・レイヤーの構成」の説明に従って、必要なレイヤー値を指定します。

5. 変更を保存します。

11.3.2.2 「カスタマイズ開発者」ロールの使用方法

カスタマイズ・クラスを作成してJDeveloperで使用できるようにしたら、「カスタマイズ開発者」ロールから特定のアプリケーションのCustomizationLayerValues.xmlファイルを構成する手順を使用してください。

次に、「カスタマイズ開発者」ロールで特定アプリケーションのCustomizationLayerValues.xmlファイルを構成する手順について説明します。

始める前に:

- 「カスタマイズ・クラスの作成」の説明に従ってカスタマイズ・クラスを作成します

- 「カスタマイズ・クラスの使用」の説明に従って、クラスをJDeveloperで使用できるようにします

「カスタマイズ開発者」ロールからワークスペース・レベルでデザインタイム・カスタマイズ・レイヤー値を構成するには:

1. 「カスタマイズ・コンテキスト」ウィンドウで、「アプリケーション・レイヤー値の構成」をクリックし、CustomizationLayerValues.xmlファイルをソース・エディタで開きます。

注意:

オーバーライド・ファイルが存在しない場合、JDeveloperは、確認ダイアログを表示します。「はい」をクリックして、グローバル・ファイルのコピーを作成して開きます。

2. このファイルで、「カスタマイズ・レイヤーの構成」の説明に従って、必要なレイヤー値を指定します。

3. 変更を保存します。

「カスタマイズ開発者」ロールの間にアプリケーション固有のCustomizationLayerValues.xmlファイルに対して変更を行った後、「カスタマイズ・コンテキスト」ウィンドウで選択したヒント・レイヤーが選択解除されます。必要なヒント・レイヤーを選択できます。

11.4 カスタマイズ・クラスの作成

カスタマイズは、MAFアプリケーションを特定の業種ドメインに適合させるために使用します。カスタマイズ・クラス用にJavaアプリケーションを作成し、Javaクラスを完成させて、そのクラスをMAFアプリケーションにインポートして、カスタマイズ・クラスを作成する手順を使用してください。

カスタマイズ・クラスはoracle.mds.cust.CustomizationClassを拡張するPOJOクラスです。現在のコンテキストが評価されてStringの結果が戻されます。このStringの結果を使用してカスタマイズ・レイヤーが検索されます。

カスタマイズ・クラスによって、次の情報が提供されます。

- レイヤー名を表す名前。

- レイヤーで作成されたオブジェクトのIDPrefix。カスタマイズ・レイヤーで新しいオブジェクトを作成する場合、一意のIDが必要です。オブジェクトの自動生成IDにIDPrefixが追加されて、新たに追加されたオブジェクトのIDが作成されます。異なるカスタマイズ・レイヤーで作成されたオブジェクトに一意のIDを指定するために、各レイヤーに一意のIDPrefixを指定する必要があります。

- カスタマイズ・クラスによって定義されたレイヤーのキャッシュ・ヒント(CacheHint)。MAFでは、キャッシュ・ヒントによって静的なカスタマイズ・レイヤーが定義され、getCacheHintメソッドは常にALL_USERSを返し、これは特定のデプロイメントに対しカスタマイズがグローバルに(無条件で)適用されることを意味します。

注意:

カスタマイズ・クラスは頻繁に実行されることが多いため(レイヤー名とレイヤー値を取得するために、アクセスされるドキュメントごとに1回)、効率性を確保する必要があります。

カスタマイズを使用して、特定の業種ドメインにあわせてMAFアプリケーションを調整できます(垂直統合)。このようなドメインはそれぞれカスタマイズ・レイヤーを表しており、カスタマイズ・クラスを使用して示されます。

静的なカスタマイズには、アプリケーションのすべての実行に適用されるレイヤー値が1つのみあります。静的なカスタマイズでは、アプリケーションを実行するすべてのユーザーでカスタマイズの値が同じです。

MAFアプリケーションで使用されるカスタマイズ・クラスでは、getCacheHintメソッドは常にALL_USERSを返し、これはカスタマイズ・レイヤーが常に静的であることを意味します。

カスタマイズ・クラスの実装方法によっては、すべてのオブジェクトが静的なカスタマイズ・レイヤーを持つことができます。

カスタマイズするMAFアプリケーション内にカスタマイズ・ファイルを作成しないでください。かわりに、カスタマイズ・クラスに対して別のJavaアプリケーションを作成します。Javaクラスの作成が完了した後で、カスタマイズするMAFアプリケーションにそのクラスをインポートします。

カスタマイズ・クラスを作成するには:

1. Javaアプリケーションを作成します。

2. 「ファイル」メニューで、「新規」をクリックしてから、「プロジェクト」をクリックします。

3. 「新規ギャラリ」で、「Javaアプリケーション・プロジェクト」を選択し、ウィザードを完了します。

4. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックして、「プロジェクト・プロパティ」を選択します。

5. 「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」を選択し、「ライブラリの追加」をクリックします。

6. 「ライブラリの追加」ダイアログで、MDSランタイムを選択し、「OK」をクリックします。「OK」をクリックして「プロジェクト・プロパティ」ダイアログを閉じます。

7. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「新規」を選択してから「Javaクラス」を選択します。

8. 「Javaクラスの作成」ダイアログで、クラスの名前およびパッケージを入力します。

9. 「拡張」フィールドで、クラス階層を参照し、oracle.mds.cust.CustomizationClassを取得してから(図11-3を参照)、「OK」をクリックします。

注意:

「抽象メソッドの実装」(デフォルトの設定)を「Javaクラスの作成」ダイアログで選択する必要があります。

図11-3 カスタマイズ・クラスの作成

10. スタブ・ファイルを更新します。次の例は、カスタマイズ・クラスを示しています。

package mobile;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import oracle.mds.core.MetadataObject;
import oracle.mds.core.RestrictedSession;
import oracle.mds.cust.CacheHint;
import oracle.mds.cust.CustomizationClass;

public class SiteCC extends CustomizationClass {

public SiteCC() {
super();
}

public CacheHint getCacheHint()
{
return CacheHint.ALL_USERS;
}

/** {@inheritDoc} */
public String getName()
{

return "company";
}

/** {@inheritDoc} */
public String[] getValue(RestrictedSession rs,
MetadataObject metadataObject)
{
String sites[] = {"company1", "company2"};
return sites;
}
}

11. Javaアプリケーション・プロジェクトを再ビルドします。

11.5 カスタマイズ・クラスの使用

作成したカスタマイズ・クラスは、設計時には「カスタマイズ開発者」ロールで使用できます。また、実行時にはアプリケーションで使用できます。カスタマイズ・クラスをJARに追加し、カスタマイズ・クラスをMAFアプリケーションに登録して、adf-config.xmlファイルでカスタマイズ・クラスを特定する手順を使用してください。

カスタマイズ・クラスは再利用可能なコンポーネントです。これらを格納するための別のプロジェクトを作成し、独自のJARファイルにパッケージ化します。カスタマイズ・クラスをJDeveloperで使用できるようにするには、これらのクラスを使用するアプリケーションにJARをインポートします。

カスタマイズ・クラスをJARファイルとしてパッケージ化してから、このクラスをMAFアプリケーションに登録します。カスタマイズ・クラスおよび関連するアーティファクトをJARファイルにパッケージ化するには、「デプロイメント・プロファイルの作成」ウィザードを使用してデプロイメント・プロファイルを作成します。「自動的に生成されるデプロイメント・プロファイルについて」を参照してください。

JARにカスタマイズ・クラスを追加する手順:

1. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「新規」を選択してから「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「一般」を開き、「デプロイメント・プロファイル」、「JARファイル」の順に選択して、「OK」をクリックします。

ヒント:

「カテゴリ」ツリーに「デプロイメント・プロファイル」ノードが表示されない場合、「すべての機能」タブをクリックします。

3. 「デプロイメント・プロファイルの作成」 -- 「JARファイル」ダイアログで、プロジェクト・デプロイメント・プロファイルの名前(図11-4のSiteCC など)を入力して、「OK」をクリックします。

図11-4 カスタマイズ・クラスのデプロイメント・プロファイルの作成

4. 「JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「JARオプション」を選択します。

5. 必要に応じて、JARファイルの場所を入力します。または、デフォルトの場所を使用します。

6. 「ファイル・グループ」、「プロジェクトの出力」、「フィルタ」の順に開き、JARに含むように選択できるファイルを一覧表示します。

7. 「フィルタ」ページの「ファイル」タブで、JARファイルに追加するカスタマイズ・クラスを選択します(図11-5を参照)。

図11-5 カスタマイズ・クラスをJARファイルに含める

8. 「OK」をクリックして、「JARデプロイメント・プロファイルのプロパティの編集」ダイアログを終了します。

9. 「OK」を再度クリックして、「プロジェクト・プロパティ」ダイアログを終了します。

10. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「デプロイメント・プロファイル」を選択します。「デプロイメント・アクション」ページ(図11-6を参照)では、「JARにデプロイ」がデフォルトで選択されています。「次へ」をクリックします。

図11-6 カスタマイズ・クラスのJARファイルへのデプロイ

11. JARファイルの出力場所の確認メッセージを確認します。「OK」をクリックします。

図11-7「サマリー」ページ(JARファイルの出力場所を示す)

「ログ・ファイル」ウィンドウ(図11-8)では、デプロイメントのステータスが表示されます。

図11-8 デプロイメント・ログ

次の手順を使用してアプリケーションでカスタマイズ・クラスを表示できるようにしてから、カスタマイズ・クラスをadf-config.xmlファイルのcust-configセクションに追加します。

注意:

使用するアプリケーションのデータ・モデル・プロジェクトでカスタマイズ・クラスを作成した場合、次の手順は不要です。

始める前に:

- 外部プロジェクトにカスタマイズ・クラスを作成します。

- カスタマイズ・クラスを含むJARファイルを作成します。

- Studio開発者ロールを使用してJDeveloperを起動し、カスタマイズするアプリケーションを開きます。

カスタマイズ・クラスをMAFアプリケーションに登録する手順:

1. 「アプリケーション」ウィンドウで、「アプリケーション・メニュー」アイコンをクリックして、「アプリケーションのプロパティ」を選択します

2. 「アプリケーションのプロパティ」ダイアログで、「ライブラリとクラスパス」を選択し、「JAR/ディレクトリの追加」をクリックします。

3. 「アーカイブまたはディレクトリの追加」ダイアログで、カスタマイズ・クラスを含む作成済JARファイルを選択して、「開く」をクリックします。

4. 「OK」をクリックします。

次に、カスタマイズ・クラスをadf-config.xmlファイルに追加します。アプリケーションのadf-config.xmlファイルでは、mds-configセクションで適切なcust-config要素が指定されている必要があります。クライアントはcust-config要素を使用して、順序付けされ、名前が付けられたカスタマイズ・クラスのリストを定義できます。adf-config.xmlファイルの概要エディタを使用して、カスタマイズ・クラスを追加します(図11-9を参照)。

adf-config.xmlファイルでカスタマイズ・クラスを識別するには:

1. 「アプリケーション・リソース」ウィンドウで、「ディスクリプタ」および「ADF META-INF」ノードを開き、adf-config.xmlをダブルクリックします

2. 概要エディタで、「MDS」ナビゲーション・タブを選択し、「追加」(+)をクリックします。

3. 「カスタマイズ・クラスの編集」ダイアログで、作成済のカスタマイズ・クラスを検索するか、作成済のカスタマイズ・クラスに移動します。

4. 適切なクラスを選択して、「OK」をクリックします。

5. カスタマイズ・クラスをすべて追加した後、矢印アイコンを使用して適切な順序で配置できます。

図11-9は、2つのカスタマイズ・クラスが追加されたadf-config.xmlファイルの概要エディタを示しています。

図11-9 adf-config.xmlの概要エディタ

customization-class要素の順序により、カスタマイズ・レイヤーの優先順位が指定されます。たとえば、adf-config.xmlファイルのカスタマイズ・クラス順序を表す次のコードでは、IndustryCCクラスはSiteCCクラスの前にリストされています。これは、industryレイヤーでのカスタマイズがベース・アプリケーションに適用されてから、siteレイヤーでのカスタマイズが適用されることを示します。

<adf-config xmlns="http://xmlns.oracle.com/adf/config">
<adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
<mds-config xmlns="http://xmlns.oracle.com/mds/config" version="11.1.1.000">
<cust-config>
<match path="/">
<customization-class name="com.mycompany.IndustryCC"/>
<customization-class name="com.mycompany.SiteCC"/>
</match>
</cust-config>
</mds-config>
</adf-mds-config>
</adf-config>

完了したら、JDeveloperでプロジェクトをローカルに実行するためやカスタマイズのために、カスタマイズ・クラスを使用できます。またカスタマイズ・クラスは、アプリケーションをパッケージ化するときに、EARクラス・パスにパッケージ化されます。

11.6 「カスタマイズ開発者」ロールの理解

カスタマイズ機能は、「カスタマイズ開発者」ロールでのみ利用可能です。このロールは、プロジェクトのメタデータをカスタマイズするために使用されます。

JDeveloperでは、「カスタマイズ開発者」ロールを使用して、プロジェクトのメタデータをカスタマイズします。カスタマイズ機能は、このロールでのみ使用できます。「カスタマイズ開発者」ロールでは、次の作業を実行できます。

- カスタマイズの作成および更新

- カスタマイズしたアプリケーションのヒント・レイヤーの選択および編集

- 既存のカスタマイズの削除。

「カスタマイズ開発者」ロールでJDeveloperを使用する場合、ソース・エディタは読取り専用になり、次のJDeveloperの機能が無効になります。

- ワークスペースの移行。

- アプリケーションおよびIDE接続の作成、削除および変更「カスタマイズ開発者」ロールでアプリケーションを開く前に、デフォルト・ロールで接続を構成する必要があります。

「カスタマイズ開発者」ロールでアプリケーションを使用する場合、新規オブジェクトやファイルは作成できず、カスタマイズ不能オブジェクトは変更できません。また、Javaクラス、リソース・バンドル、セキュリティ・ポリシー、デプロイメント・ディスクリプタ、構成ファイルなどのカスタマイズ不能ファイルの編集もできません。

注意:

「カスタマイズ開発者」ロールで作業している際、カスタマイズ不能ファイルはロック・アイコンで示されます。

また、プロジェクト設定も変更できないので、カスタマイズ不能ファイルの変更が必要になる場合には、カスタマイズ可能ファイルのリファクタや変更もできません。

『Oracle JDeveloperによるアプリケーションの開発』のJDeveloperのロールの使用に関する項を参照してください。

11.6.1 JDeveloperでの「カスタマイズ開発者」ロールへの切替え

JDeveloperの起動時に「カスタマイズ開発者」ロールを選択しなかったユーザーは、所定の手順を実行することで、JDeveloperの起動後でもロールの切替えが可能です。

「カスタマイズ開発者」ロールでは、JDeveloperのカスタマイズ機能を使用できます。このロールで作業するには、JDeveloperの起動時に選択するか、JDeveloperがすでに実行されている場合は「ロールの切替え」メニューで「カスタマイズ開発者」ロールに切り替えます。

JDeveloperで「カスタマイズ開発者」ロールに切り替えるには:

JDeveloperのメイン・メニューで、「ツール」、「ロールの切替え」、「カスタマイズ開発者」の順に選択します。

オプションで、「ツール」、「ロールの切替え」の順に選択して「起動時にロール選択を常に要求」メニューを切り替え、JDeveloper起動時にロールを選択するかどうかを指定できます。この選択を解除すると、JDeveloperは、最後に閉じたときのロールで起動します。

11.6.2 ヒント・レイヤーに関する必知事項

「カスタマイズ開発者」ロールのユーザーによる変更は、ヒント・レイヤー(「カスタマイズ・コンテキスト」ウィンドウで選択したレイヤーとレイヤー値の組合せ)に適用されます。

「カスタマイズ開発者」ロールで作業する際、「カスタマイズ・コンテキスト」ウィンドウで選択したレイヤーとレイヤー値の組合せをヒント・レイヤーと呼びます。このレイヤーには、「カスタマイズ開発者」ロールで作業中に行った変更が適用されます。

注意:

「カスタマイズ開発者」ロールで作業しているときに、「カスタマイズ・コンテキスト」ウィンドウが表示されない場合は、JDeveloperの「ウィンドウ」メニューからアクセスしてください。

JDeveloperのエディタに表示されるメタデータは、ベース・メタデータと(adf-config.xmlで設定された優先順位に従った)ヒント・レイヤーまでのカスタマイズ・レイヤーを組み合せたもので、各レイヤーの値は「カスタマイズ・コンテキスト」ウィンドウで指定したものです。

「カスタマイズ開発者」ロールでの作業時には、アプリケーションのカスタマイズされていない状態も確認できます。「カスタマイズ・コンテキスト」ウィンドウで「カスタマイズなしで表示」が選択されている場合、現在使用しているヒント・レイヤーはありません。したがって、表示されているのはカスタマイズされていない状態です。このビューでは、(「アプリケーション」ウィンドウの)カスタマイズ可能ファイルすべてにロック・アイコンが表示され、これらのファイルが読取り専用であることが示されます。

ヒント・レイヤーで行ったカスタマイズは、「プロパティ」ウィンドウではオレンジのアイコンで示されます。緑のアイコンは、ヒント以外のレイヤーのカスタマイズを示します。プロパティの横にオレンジのアイコンが表示されている場合は、そのプロパティのドロップダウン・メニューから「カスタマイズ・アクションの削除」を選択すると、そのカスタマイズを削除できます。

11.7 リソース・バンドルでのカスタマイズの有効化

Studio開発者ロールで、アプリケーション・リソースバンドルまたはプロジェクト・リソース・バンドルを作成して、それをカスタマイズするために編集します。

リソース・キーのカスタマイズを実装する場合、追加のリソース・バンドル・ファイルを作成する必要があります(ベース・リソース・バンドル・ファイルは使用できません)。

Studio Developerロールで、次のいずれかを作成します。

- アプリケーション・リソース・バンドル(「アプリケーション・リソース・バンドルの作成方法」を参照)。

- プロジェクト・リソース・バンドル(「プロジェクト・リソース・バンドルの作成方法」を参照)。

作成するバンドルを編集して、リソース・キーの文字列値を定義します。

始める前に:

『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の複数のリソース・バンドルの使用方法に関する項を参照してください。

11.7.1 アプリケーション・リソース・バンドルの作成方法

Studio開発者ロールの場合は、「リソース・バンドル」ページからアプリケーション・リソース・バンドルを作成する手順を使用してください。

アプリケーション・リソース・バンドルを作成するには:

1. Studio開発者ロールで、「アプリケーション」、「アプリケーションのプロパティ」、「リソース・バンドル」の順にクリックします。

2. 「リソース・バンドル」ページで、「アプリケーション・バンドル検索」をクリックし、「バンドルの追加」アイコンの右にあるドロップダウン・メニューをクリックして、「アプリケーション・バンドルの作成」を選択します(図11-10を参照)。

図11-10 アプリケーション・リソース・バンドルの作成

3. 表示された「Xliffファイルの作成」ダイアログで、リソース・バンドルの名前を入力し、「OK」をクリックします。

4. 「リソース・バンドルのリソースの編集」の説明に従ってリソース・バンドルを編集します。

注意:

MAFは、アプリケーション・レベルの「リソース・バンドル」ページではオーバーライドされたプロパティをサポートしていません。

5. 「カスタマイズ開発者」ロールで、「テキスト・リソースの選択」ダイアログを開き、適切な文字列を含むリソース・バンドルから選択します。「カスタマイズ開発者」ロールでは文字列の変更または新しい文字列の作成ができないため、選択したバンドルの文字列から選択することのみが可能です。

注意:

「カスタマイズ開発者」ロールで、ベース・リソース・バンドルから文字列を選択すると、アプリケーションのアップグレード時に問題が発生する可能性があるため選択しないでください。

11.7.2 プロジェクト・リソース・バンドルの作成方法

「新規ギャラリ」メニューから汎用XMLオプションを選択して、プロジェクト・リソース・バンドルを作成する手順を使用してください。

プロジェクト・リソース・バンドルを作成するには:

1. Studio開発者ロールで、リソース・バンドルを作成するプロジェクトを右クリックして、「新規」、「ギャラリから」の順に選択してから、「一般」、「XML」および「XMLローカリゼーション・ファイル(XLIFF)」を選択します。

2. 表示された「Xliffファイルの作成」ダイアログで、リソース・バンドルの名前を入力し、「OK」をクリックします。

3. 「リソース・バンドルのリソースの編集」の説明に従ってリソース・バンドルを編集します。

4. 「リソース・バンドル」ページの「バンドル検索」タブで、プロジェクト(.jpr)ファイルを選択してリソース・バンドルを登録します(図11-11を参照)。

図11-11 リソース・バンドルの選択

リソース・バンドルを登録すると、「テキスト・リソースの選択」ダイアログに表示されます(図11-12を参照)。

図11-12 テキスト・リソースのリソース・バンドルの選択

5. 「テキスト・リソースの選択」ダイアログを使用して、次のようにキーを定義します。

a. 「リソース・バンドル」ドロップダウン・リストからバンドルを選択します。
ダイアログには、選択したリソース・バンドルで現在定義されている文字列が表示されます。

b. 新しい文字列を入力して、「保存して選択」をクリックします。
JDeveloperでは、選択したリソース・バンドルに文字列を書き込みます。

6. 「カスタマイズ開発者」ロールで、「テキスト・リソースの選択」ダイアログを開き、適切な文字列を含むリソース・バンドルから選択します。「カスタマイズ開発者」ロールでは文字列の変更または新しい文字列の作成ができないため、選択したバンドルの文字列から選択することのみが可能です。

注意:

「カスタマイズ開発者」ロールで、ベース・リソース・バンドルから文字列を選択すると、アプリケーションのアップグレード時に問題が発生する可能性があるため選択しないでください。

11.8 カスタマイズを使用したMAFアプリケーションのアップグレード

「アーカイブからモバイル・アプリケーションをアップグレード」ウィザードを使用して、カスタマイズを維持しながらアプリケーションを上位バージョンに更新する手順を使用してください。

カスタマイズはベース・アプリケーションとは別に保存されているため、安全にアップグレートができます。カスタマイズは変更を保持するため、これらの変更をアプリケーションの新しいバージョンに適用して、アプリケーションをアップグレードできます。MAFアプリケーション・アーカイブ(.maa)ファイルによって、MAFアプリケーションをアップグレードするためのメカニズムが提供されます。.maaファイルからアプリケーションを作成する場合、.maaファイルの更新バージョンを使用してアプリケーションをアップグレードできます。

「アーカイブからモバイル・アプリケーションをアップグレード」ウィザードを使用すると、アップグレードの前に行われたカスタマイズを保持しながら新しいバージンにアプリケーションをアップグレードできます。

始める前に:

MAFアプリケーション・アーカイブ(.maa)ファイルについて理解しておいてください。「モバイル・アプリケーション・アーカイブ・ファイルの作成」および「アプリケーション・アーカイブからの新規アプリケーションの作成」を参照してください。

.maaファイルにパッケージ化され、アップグレードに使用されるアプリケーションのアプリケーションIDが、適用されるアプリケーションと同じであることを確認してください。また、アップグレードの対象となるアプリケーションより新しいバージョン番号である必要があります。

MAFアプリケーションのアップグレード手順:

1. .maaファイルからMAFアプリケーションを作成します。

2. 「リソース・バンドルでのカスタマイズの有効化」の説明に従って、MAFアプリケーションにカスタマイズを適用します。

3. 「アプリケーション」をクリックして、アーカイブからモバイル・アプリケーションを選択を選択します。

4. .maaファイルを参照して選択します。.maaにパッケージ化されたアプリケーションが、現在のアプリケーションと同じ(または古い)バージョンであったり、異なるアプリケーションIDである場合、ウィザードによりアップグレードは中止されます。

図11-13 .maaファイルの選択

5. 手動マージが必要なファイルの「サマリー」ページを確認します。図11-14に示すように、MAFでは、Tempディレクトリにアプリケーションの初期バージョン(バージョン1)が保存されます。「サマリー」ページにもログ・ファイルの一時的な場所が表示されます。

図11-14 アプリケーションのアップグレード情報

6. アップグレードが正常に完了すると、JDeveloperは再起動します。異なるバージョンの構成ファイルに調整が必要な場合、JDeveloperにより通知されます(図11-15を参照)。

図11-15 手動マージ通知

アップグレード中に、MAFでは、バージョン1のアプリケーションとバージョン2 (アップグレードしたバージョンのアプリケーション)の両方に対してカスタマイズできないファイル・セットがコピーされます。これらのファイルには、connections.xmlファイル、adf-config.xmlファイルなどがあります。MAFによって、バージョン1とバージョン2のconnections.xmlファイルとadf-config.xmlファイルに差異が検出されると、これらのファイルの両方のコピーを保持し、マージ・ログ・ファイルに対してエントリを記述します。バージョン番号がある場合、MAFではファイル名にバージョン番号を追加してバージョン1を区別します。バージョン番号がない場合、MAFでは_oldをファイル名に追加します(図11-15のconnections_old.xmlを参照)。必要に応じて、この差異を新しいバージョンに手動でマージできます。図11-16に示すように、MAFでは、「サマリー」ページに表示された一時的な場所にマージ・ファイル・ログを配置します。MAFでは、ファイルにworkspace name_timestampという名前を付けます。

図11-16 マージ・ログ・ファイル

11.8.1 アプリケーションをアップグレードする場合のJDeveloperでの処理

「アーカイブからモバイル・アプリケーションをアップグレード」ウィザードでアプリケーションをアップグレードすると、関連ファイルはJDeveloperによって保存、インポートおよび更新されます。

Tempディレクトリへのバージョン1のコピー、およびバージョン1とバージョン2のアップグレード不可の構成ファイルのコピーの作成に加えて、「アーカイブからモバイル・アプリケーションをアップグレード」ウィザードを使用してアプリケーションをアップグレードする場合、MAFでは次のことも実行します。

- 各プロジェクトのライブラリおよびリソース・バンドル設定を、に保存します。プロジェクト・ファイル名が入力されたマップに保存します。

- ワークスペースのリソース・バンドル設定を保存します。

- 登録したカスタマイズ・クラスをadf-config.xmlファイルに保存します。

- バージョン2の.maaファイルを一時ディレクトリにインポートします。

- バージョン1へのアップグレードに使用される.maaファイルからアプリケーションをコピーします。

- バージョン2の各プロジェクト(.jpr)ファイルを、登録したリソース・バンドルおよびライブラリ依存マップで更新します。ライブラリの新しいバージョンにより以前のバージョンがオーバーライドされます。ただし、バージョン1で使用されるライブラリと同じ名前を共有している場合、バージョン1ライブラリは変更されません。

- バージョン2のワークスペース(.jws)ファイルを、登録したリソース・バンドル設定で更新します。

- バージョン2のadf-config.xmlファイルを更新し、カスタマイズ・クラスを登録します。

11.8.2 FARのアップグレードに関する必知事項

アプリケーションの作成やアップグレードに使用された.maaファイルに含まれていなかったFARファイルは、個別に(単独で)アップブレードする必要があります。

アプリケーションの作成に使用された元の.maaファイル内にパッケージ化されていないFARファイルがアプリケーションに含まれる場合(または、アプリケーションのアップグレードに使用される.maaファイルに含まれる場合)、FARファイルを個別にアップグレードする必要があります。たとえば、.maaファイルからアプリケーションを作成し、FARファイルを追加してカスタマイズを実行できます。「MAFアプリケーションでのFARコンテンツの使用方法」で説明されているように、「リソース」ウィンドウから更新したFARを追加することで、新しいバージョンのFARを使用するようにアプリケーションをアップグレードできます。

12 MAFアプリケーションでのライフサイクル・リスナーの使用方法

この章では、MAFアプリケーションまたはアプリケーション機能のイベントに応じて実行可能なコードを記述するための、MAFに用意されているライフサイクル・リスナーについて説明します。

この章の内容は次のとおりです。

- MAFアプリケーションのライフサイクル・リスナーの概要

- MAFアプリケーションまたはアプリケーション機能のライフサイクル・リスナーの登録

- ライフサイクル・リスナー登録時の処理

12.1 MAFアプリケーションのライフサイクル・リスナーの概要

ライフサイクル・リスナーには、特定のアプリケーション・イベントに応じて実行するコードが含まれています。イベント通知の通信用に実装されたインタフェースに関する情報と、ライフサイクル・リスナーを作成する方法について確認してください。

ライフサイクル・リスナーは、アプリケーションの固有のイベントに応じて実行されるコードを記述するために便利な場所です。MAFは、アプリケーションまたはアプリケーション機能イベントに応じたコードを記述できるライフサイクル・リスナーを備えています。アプリケーション・ライフサイクル・リスナー・メソッドの標準的な実装としては、アプリケーションの起動時にアプリケーションのデータベースを初期化するコードを記述するか(「ローカルSQLiteデータベースの使用方法」を参照)、URLパラメータからセキュリティ構成を更新します(「実行時の名前付き接続の接続属性の更新方法」を参照)。

MAFは、イベント通知と通信するために実装できる次の2つのインタフェースを備えています。

- oracle.adfmf.application.LifeCycleListener
このインタフェースには、アプリケーション・ライフサイクル・リスナーが実装する必要のある次のメソッドを指定します。

- activate()

- deactivate()

- start()

- stop()

- oracle.adfmf.feature.LifeCycleListener
このインタフェースには、機能ライフサイクル・リスナーが実装する必要のある次のメソッドを指定します。

- activate()

- deactivate()

ライフサイクル・リスナーを作成するには、適切なインタフェースを実装するJavaクラスを作成し、「MAFアプリケーションまたはアプリケーション機能のライフサイクル・リスナーの登録」の説明に従って、MAFアプリケーションの実装を登録します。

新規作成するMAFアプリケーションは、図12-1に示すように、そのアプリケーションのApplicationControllerプロジェクトにデフォルトで作成されるapplication.LifeCycleListenerImpl.javaクラスによってoracle.adfmf.application.LifeCycleListenerインタフェースを実装します。

図12-1 アプリケーション・ライフサイクル・リスナーの実装

アプリケーション・ライフサイクル・リスナーは、匿名ユーザーによって実行されます(つまり、そのリスナーのメソッドにはどのユーザーも関連付けられず、セキュアなWebサービスもコールされません)。

表12-1は、アプリケーションの起動時、シャットダウン時および休止時に、MAFがアプリケーション・ライフサイクル・メソッドを起動する具体的なタイミングについて説明しています。

表12-1 MAFによるアプリケーション・ライフサイクル・メソッドの起動タイミング

メソッド

タイミング

いつコールされるか

使用方法

start

MAFアプリケーションがアプリケーション機能を完全にロードした後、ユーザーに最初のアプリケーション機能またはSpringboardを表示する直前にコールされます。これはブロック化コールです。

アプリケーションの処理が開始されたとき。

次の使用方法があります。

- MAFアプリケーションの更新があるかどうかを確認する。

- ローカル・データベースにデータをダウンロードするよう、リモート・サーバーにリクエストする。

stop

MAFアプリケーションがシャットダウンを開始するときにコールされます。

アプリケーションの処理が終了したとき。

次の使用方法があります。

- 任意のリモート・サービスからログオフする。

- アプリケーションが終了する前に、データの変更をサーバーにアップロードする。

activate

MAFアプリケーションを背景にある(休止)状態からアクティブ化するときにコールされます。これはブロック化コールです。

startメソッドがコールされた後。

次の使用方法があります。

- キャッシュ・ストアを読み取り、再移入する。

- Webサービス・リクエストを処理する。

- 必要なリソースを取得する。

deactivate

MAFアプリケーションを非アクティブ化し、背景に移動(休止)するときにコールされます。これはブロック化コールです。

stopメソッドがコールされる前。

次の使用方法があります。

- リストア可能な状態を書き込む。

- データベース・カーソルとデータベース接続を閉じる。

表12-2は、機能のアクティブ化時および非アクティブ化時にMAFが機能ライフサイクル・メソッドを起動する具体的なタイミングについて説明しています。

注意:
また、MAFでは、「MAFアプリケーションのアプリケーション機能の再起動」で説明されているように、oracle.adfmf.feature.LifeCycleListenerを拡張し、アプリケーション機能の再起動前後に実行されるコードを記述する追加のメソッドを提供する別のインタフェース(oracle.maf.api.feature.FeatureLifeCycleListener)が提供されます。

表12-2 MAFによる機能ライフサイクル・メソッドの起動タイミング

メソッド

タイミング

いつコールされるか

使用方法

activate

現在のアプリケーション機能がアクティブ化される前にコールされます。

ユーザーがMAFアプリケーションの起動後に初めてアプリケーション機能を選択したとき、またはアプリケーション機能が再選択されたとき(つまり、フォアグラウンドに戻されたとき)にコールされます。

次の使用方法があります。

- applicationScope変数を読み取る。

- 最初のMAF AMXビューにおける現在の行を設定する。

deactivate

次のアプリケーション機能がアクティブ化される前、またはアプリケーション機能が終了する前にコールされます。

ユーザーが別のアプリケーション機能を選択したときにコールされます。

たとえば、deactivateイベントを使用して、applicationScope変数や、次のアプリケーション機能が使用するその他の状態情報を記述できます。

oracle.adfmf.application.LifeCycleListener、oracle.adfmf.feature.LifeCycleListenerおよびoracle.maf.api.feature.FeatureLifeCycleListenerインタフェースの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

LifecycleEventsサンプル・アプリケーションは、アプリケーションおよび機能の両方のインタフェースを実装するリスナー・クラスの宣言を示しています。これらのリスナー・クラスはMAFアプリケーションのmaf-application.xmlファイルとmaf-feature.xmlファイルに登録されます。このサンプル・アプリケーションおよびその他のサンプル・アプリケーションの詳細は、「サンプルのMAFアプリケーション」を参照してください。

12.2 MAFアプリケーションまたはアプリケーション機能のライフサイクル・リスナーの登録

mafapplication.xmlファイルの概要エディタを使用してアプリケーション・ライフサイクル・リスナーを登録する手順と、maf-features.xmlファイルの概要エディタを使用して機能ライフサイクル・リスナーを登録する手順を使用してください。

アプリケーション・ライフサイクル・リスナーの登録は、maf-application.xmlファイルの概要エディタを使用して行い、機能ライフサイクル・リスナーの登録は、maf-features.xmlファイルの概要エディタを使用して行います。

アプリケーション・ライフサイクル・リスナーを登録するには:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを展開します。

2. 「アプリケーション・リソース」パネルで「ディスクリプタ」を展開し、「ADF META-INF」を展開します。

3. maf-application.xmlをダブルクリックします。

4. 「Application」ナビゲーション・タブで、oracle.adfmf.application.LifeCycleListenerインタフェースを実装するJavaクラスをLifecycle Event Listenerフィールドに指定します。デフォルトでは、これはapplication.LifeCycleListenerImplに設定されています。
別のところで使用するために配布されるJARライブラリにアプリケーション・ライフサイクル・リスナーをパッケージ化するには、MAFに用意されているデフォルト実装と異なるカスタム・クラスを使用できます。

アプリケーション機能ライフサイクル・リスナーを登録する手順:

1. 「アプリケーション」ウィンドウで、ViewControllerプロジェクト、「アプリケーション・ソース」、「META-INF」の順に展開します。

2. maf-feature.xmlファイルをダブルクリックします。

3. 「機能」リストで、機能ライフサイクル・リスナーを登録する機能を選択します。

4. 「ライフサイクル・イベント・リスナー」フィールドに、oracle.adfmf.feature.LifeCycleListenerインタフェースを実装するJavaクラスを指定します。

12.3 ライフサイクル・リスナー登録時の処理

ApplicationControllerプロジェクトのapplication.LifeCycleListenerImpl.javaクラス(maf-application.xmlファイルのlistener-class属性によって登録されます)は、ライフサイクル・リスナーを実装します。

デフォルトでは、作成するMAFアプリケーションは、アプリケーションのApplicationControllerプロジェクトでのapplication.LifeCycleListenerImpl.javaクラスの作成を介して、アプリケーション・ライフサイクル・リスナーを実装します。maf-application.xmlファイルのlistener-class属性は、次の例に示されているように、このクラスを登録します。

<adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                    xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
version="1.0" name="NewMAFapp" id="com.company.NewMAFapp"
appControllerFolder="ApplicationController" listener-class="application.LifeCycleListenerImpl">
...
</adfmf:application>

機能ライフサイクル・リスナーを登録すると、JDeveloperでは、listener-class属性用のmaf-feature.xmlファイルにエントリを書き込みます。次の例は、「サンプルのMAFアプリケーション」で説明されているLifecycleEventsサンプル・アプリケーションのエントリを示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adfmf="http://xmlns.oracle.com/adf/mf">
<adfmf:feature id="Feature1" name="Feature1" listener-class="mobile.Feature1Handler">
<adfmf:description>This is a sample feature to show the feature lifecycle handlers.
</adfmf:description>
<adfmf:content id="Feature1.1">
<adfmf:amx file="Feature1/feature1.amx"/>
</adfmf:content>
</adfmf:feature>
...
</adfmf:features>

13 MAF AMXページの作成

この章では、ビューとタスク・フローを含む、MAF AMXアプリケーション機能の作成方法について説明します。

この章の内容は次のとおりです。

- MAF AMXアプリケーション機能の概要

- タスク・フローの作成

- ビューの作成

13.1 MAF AMXアプリケーション機能の概要

MAF AMXフレームワークはMAF内で動作して、すべてのプラットフォームでまったく同じように動作する機能の作成に必要なUIコンポーネントを提供します。

MAF AMXは、サポートされるすべてのプラットフォームで動作が同一となるアプリケーション機能を作成できる一連のUIコンポーネントを提供するモバイル・アプリケーション・フレームワーク(MAF)内のサブフレームワークです。MAF AMXでは、ページ・エディタへのドラッグにより、UIコンポーネントを宣言的に使用できます。一般的なMAF AMXアプリケーション機能には、様々なパス経由でナビゲートできる、相互に接続されたいくつかのページが含まれます。

注意:

モバイル・デバイスのインタフェースを開発する際には、画面領域が非常に限られているということを常に意識する必要があります。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

詳細は、次を参照してください。

- MAFアプリケーション開発のスタート・ガイド

- MAF AMXユーザー・インタフェースの作成

- MAF AMXでのバインディングの使用とデータ・コントロールの作成

13.2 タスク・フローの作成

タスク・フローでは、アプリケーション内のAMXページ間をユーザーが移動する方法を定義します。バインド・タスク・フローとバインドなしタスク・フローの両方を備えたMAF AMXアプリケーション機能を作成できます。

タスク・フローにより、MAF AMXページ間のナビゲーションを定義できます。JDeveloperのアプリケーション・ワークスペース(「MAFアプリケーションの作成」を参照)を使用してタスク・フローを設計することにより、MAF AMXアプリケーション機能のユーザー・インタフェースの作成を開始できます。MAF AMXでは、ナビゲーション・ケースおよびルールを使用してタスク・フローを定義します。これらの定義は、ViewController-task-flow.xmlというデフォルトの名前のファイルに格納されています(「ViewController-task-flow.xmlファイルに関する必知事項」を参照)。

(開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにある) NavigationというMAFサンプル・アプリケーションには、循環ナビゲーション、ルーターなど様々なナビゲーション技術の使用方法が示されています。

MAFでは、バインド・タスク・フローとバインドなしタスク・フローの両方を持つMAF AMXアプリケーション機能を作成できます。「バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項」で説明されているように、バインド・タスク・フローはタスク・フロー定義とも呼ばれ、アプリケーションの再利用可能な部分を表します。MAFでは、バインド・タスク・フローにはエントリ・ポイントが1つありますが、終了ポイントはありません。バインド・タスク・フローには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。他のバインド・タスク・フロー特性として、入力パラメータの受入れ(「バインド・タスク・フローへのパラメータ渡し」)や戻り値の生成(「バインド・タスク・フローの戻り値の構成」)などがあります。

独自のアプリケーション機能のバインド・タスク・フローを作成するには、MAF AMXタスク・フロー・デザイナを使用します。タスク・フローの概要エディタと同様、このツールにはダイアグラマ(「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)が含まれており、ここで、「コンポーネント」ウィンドウからアクティビティと制御フローをドラッグ・アンド・ドロップすることにより(「タスク・フロー・アクティビティおよび制御フローに関する必知事項」)、タスク・フローを構築します。その後、「プロパティ」ウィンドウを使用して、これらのアクティビティとそれらの間の遷移を定義します。

タスク・フローがすでに作成されている場合を除き、MAFは、新しいMAF AMXページが作成されると、自動的にデフォルトのバインドなしタスク・フロー(adfc-mobile-config.xmlファイル)を生成します。

各タスク・フローはアプリケーション機能としてMAFアプリケーションに追加できます。「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」を参照してください。

13.2.1 タスク・フローの作成方法

maf-feature.xmlファイルからバインド・タスク・フローを作成するか、タスク内の手順に従って、「新規ギャラリ」からタスクフローを作成します。

タスク・フローは、タスク・フロー自体と複数のアクティビティ、そしてそれらのアクティビティ間の制御フロー・ルールから構成されます(「タスク・フロー・アクティビティおよび制御フローに関する必知事項」を参照)。通常、アクティビティの多くがフロー内の異なるページを示すビュー・アクティビティです。たとえば、ページのレンダリング前などにメソッドや操作をコールする必要がある場合は、メソッド・コール・アクティビティをそのアクティビティから次の適切なアクティビティまでの制御フロー・ケースとともに使用します。別なタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティを使用します。フローにブランチ化が必要な場合は、ルーター・アクティビティを使用します。バインド・タスク・フローの最後で、リターン・アクティビティを使用してフローを終了し、そのバインド・タスク・フローをコールしたフローに制御を戻します。

ナビゲーション・ダイアグラマを使用して、MAF AMXアプリケーション機能のバインド・タスク・フローを宣言的に作成します。ダイアグラマを使用すると、JDeveloperによって、MAF AMXアプリケーション機能でナビゲーションが機能するために必要なXMLメタデータがViewController-task-flow.xmlファイル(デフォルト)に作成されます。

始める前に:

タスク・フローを設計するには、MAFアプリケーションにビュー・コントローラ・プロジェクト・ファイル(「MAFアプリケーション開発のスタート・ガイド」を参照)が含まれている必要があります。

MAFでタスク・フローを作成するには、次の2つの方法があります。

- バインド・タスク・フローはmaf-feature.xmlファイルから作成できます。「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」を参照してください。

- JDeveloperの「新規ギャラリ」を使用できます。次の手順を参照してください。

「新規ギャラリ」からタスク・フローを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」→「MAFタスク・フロー」の順に選択します(図13-1を参照)。「OK」をクリックします。

図13-1 新しいMAFタスク・フローの作成

3. 「MAFタスク・フローの作成」ダイアログ(図13-2を参照)で、新しいタスク・フローのファイル名と場所を指定して「OK」をクリックし、図13-3に示すナビゲーション・ダイアグラマで新しい<Name>-flow.xmlファイルを開きます。

注意:

タスク・フローは、MAFアプリケーションのビュー・コントローラ・プロジェクトのHTMLルート内に作成する必要があります。

注意:

同じパターンですでに存在するバインド・タスク・フローの数に従って、JDeveloperによってタスク・フローの数が増分されます。

図13-2 「MAFタスク・フローの作成」ダイアログ

図13-3 新しい空白のタスク・フロー

4. 「コンポーネント」ウィンドウで、「MAFタスク・フロー」を選択します。

ヒント:

「コンポーネント」ウィンドウが表示されていない場合は、メイン・メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」ウィンドウはJDeveloperの右上部に表示されます。

5. 「MAFタスク・フロー」→「コンポーネント」を選択し、使用するコンポーネントを選択してダイアグラムにドラッグ・アンド・ドロップします。図13-4に示すように、JDeveloperでは新たに追加されたコンポーネントを使用してダイアグラムが再描画されます。

図13-4 タスク・フローへのコンポーネントの追加

タスク・フローへのアクティビティの追加方法の詳細は、「タスク・フロー・アクティビティの追加および使用方法」を参照してください。

制御フローの追加方法の詳細は、「制御フローの定義方法」を参照してください。

新しいタスク・フローの動作を定義する方法の詳細は、「新しいバインド・タスク・フローの動作に関する必知事項」を参照してください。

「概要」タブを開き、概要エディタを使用してナビゲーション・ルールとナビゲーション・ケースの作成することもできます。概要エディタを使用したナビゲーション作成の詳細は、[F1]キーで参照できます。

また、「ソース」エディタでページを直接編集して、タスク・フロー・ファイルに手動で要素を追加することもできます。「ソース」エディタでファイルを開くには、「ソース」タブをクリックします。

注意:

手動でタスク・フロー・ファイルを編集する場合は、MAF AMXページ、JavaScriptファイルおよびCSSファイルを参照するすべてのドキュメント・ファイル名で大文字と小文字が区別されることに注意してください。

特殊文字(アンダースコアなど)がファイル名に使用されている場合は、モバイル・デバイスの仕様を参照して、その文字の使用がサポートされているかどうかを確認する必要があります。

MAF AMXアプリケーション機能のナビゲーションを定義したら、次はページを作成したり、ナビゲーションを使用するコンポーネントを追加したりできます。ページでのナビゲーション・コンポーネントの使用方法の詳細は、「制御フローの定義方法」を参照してください。

MAF AMXアプリケーション機能のタスク・フローを定義すると、ビュー・ファイルをダブルクリックしてMAF AMXビューにアクセスできます。詳細は、「ビューの作成」を参照してください。

13.2.1.1 新しいバインド・タスク・フローの動作に関する必知事項

新しいバインド・タスク・フローが作成されると、MAFはpage-flowscope-behavior要素をName-flow.xmlファイルに追加します。要素をpush-newに設定すると、新しいページ・フロー・スコープが作成されますが、preserveに設定すると、タスク・フローが実行されたときにページ・フロー変数が保持されます。

新しいバインド・タスク・フローが作成されると、MAFは自動的にpage-flow-scope-behavior要素を<Name>-flow.xmlファイルに追加します。この要素は、最上位のtask-flow-definition要素の子として追加されます。

注意:

page-flow-scope-behavior要素は、新規作成したタスク・フローが以前のバージョンのMAFを使用して構築されたプロジェクトに作成された場合でも、すべてのタスク・フローに追加されます。

page-flow-scope-behavior要素の値はデフォルトでpush-newに設定され、新しいタスク・フローの概要エディタとソース・エディタ、およびtask-flow-definition要素の「プロパティ」ウィンドウに表示されます(図13-5を参照)。

図13-5 タスク・フローの「ページ・フロー・スコープの動作」

「ページ・フロー・スコープの動作」がpush-newに設定されている場合、新しいページ・フロー・スコープが作成され、古いpageFlowScopeの変数は保存されて、スタックにプッシュされます。これにより、タスク・フロー・・リターン実行時に、以前のページ・フロー・スコープをリストアできます。「ページ・フロー・スコープの動作」がpreserveに設定されている場合、タスク・フロー・コールを実行してタスク・フローが開始されたときに、pageFlowScopeの変数はクリアされないので、新しいタスク・フローの変数には古い値が格納されます。

既存のタスク・フローにpage-flow-scope-behavior要素が存在しない場合は、この要素をpush-newまたはpreserveとして定義する必要があります。

pageFlowScopeの詳細は、「マネージドBeanカテゴリについて」を参照してください。

13.2.2 タスク・フロー・アクティビティおよび制御フローに関する必知事項

タスクフローはアクティビティとコントロール・フロー・ケースを使用して、アクティビティ間の遷移を定義します。

タスク・フローは、アクティビティ、およびアクティビティ間の遷移を定義する制御フロー・ケースで構成されます。

MAFタスク・フロー・デザイナは表13-1に示すアクティビティをサポートしています。

表13-1 タスク・フロー・アクティビティ

アクティビティ

説明

表示

MAF AMXページを表示します。「ビュー・アクティビティの追加」を参照してください。

メソッド・コール

メソッド(通常はマネージドBean上のメソッド)を起動します。メソッド・コール・アクティビティをMAF AMXアプリケーション機能の制御フローの任意の位置に配置して、制御フロー・ルールに基づいてロジックを起動できます。詳細は、「メソッド・コール・アクティビティの追加」を参照してください。

タスク・フローに含まれるメソッド・コールに渡すパラメータを指定することもできます。これらには、MAF AMXタスク・フロー内のメソッド・コール・アクションの標準パラメータが含まれます。デザイナを使用してメソッドを生成する場合、デザイナにより必要な引数およびタイプが追加されます。

実行時にタスク・フロー内のメソッド・コールのパラメータを定義し、メソッド・コール自体にパラメータを渡してこれを使用できます。「タスク・フロー・アクティビティの追加および使用方法」を参照してください。

ルーター

式言語(EL)式を評価し、その式の値に基づいて結果を戻します。その後、このような結果を使用して、タスク・フローの他のアクティビティに制御をルーティングします。「ルーター・アクティビティの追加」を参照してください。

タスク・フロー・コール

バインドなしタスク・フローまたはバインド・タスク・フローからバインド・タスク・フローをコールします。タスク・フロー・コール・アクティビティでは、同じMAF AMXアプリケーション機能内にあるバインド・タスク・フローをコールできますが、別のMAF AMXアプリケーション機能またはライブラリに追加された機能アーカイブ・ファイル(FAR) (「MAFアプリケーション・コンテンツの再使用」を参照)からバインド・タスク・フローをコールすることもできます。

タスク・フロー・コール・アクティビティは、タスク・フロー入力パラメータおよび戻り値をサポートします。

「タスク・フロー・コール・アクティビティの追加」を参照してください。

タスク・フロー・リターン

アプリケーションの制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターンは、バインド・タスク・フロー内でのみ使用できます。「タスク・フロー・リターン・アクティビティの追加」を参照してください。

MAFタスク・フロー・デザイナは表13-2に示す制御フローをサポートしています。

表13-2 制御フロー

制御フロー

説明

制御フロー・ケース

MAF AMXアプリケーション機能内で、あるアクティビティから次のアクティビティに制御を渡す方法を指定します。「制御フロー・ケースの定義」を参照してください。

ワイルドカード制御フロー・ルール

IDがワイルドカード式と一致するアクティビティからの制御フロー・ケースを表します。「ワイルドカード制御フロー・ルールの追加」を参照してください。

13.2.3 ViewController-task-flow.xmlファイルに関する必知事項

エディタでViewController-task-flow.xmlファイルを開いて、MAF AMXページ間の相互作用を設計します。

ViewController-task-flow.xmlファイルを使用すると、「コンポーネント」ウィンドウからMAF AMXタスク・フロー・コンポーネントをダイアグラマにドラッグ・アンド・ドロップすることにより、ビュー(MAF AMXページ)間の相互作用を設計できます。

図13-6に、Products-flow.xmlというタスク・フロー・ファイル例を示します。このファイルでは、制御フローはproductsページからproductdetailsページに方向付けられます。productdetailsページからproductsページに戻るため、組込みの__backナビゲーションが使用されます(「「戻る」ナビゲーションのMAFサポートに関する必知事項」を参照)。

図13-6 タスク・フロー・ファイル

13.2.4 MAFタスク・フロー・ダイアグラマに関する必知事項

MAFタスク・フロー・ダイアグラムは、アクティビティとタスク・フローで機能を設計できるエディタです。

図13-6に示すように、MAFタスク・フロー作成ユーティリティを使用してタスク・フローを作成すると、タスク・フロー・ダイアグラムおよび「コンポーネント」ウィンドウが自動的に表示されます。タスク・フロー・ダイアグラムはビジュアル・エディタであり、「コンポーネント」ウィンドウまたは「アプリケーション」ウィンドウからのアクティビティとタスク・フローをここにドラッグ・アンド・ドロップできます。「タスク・フロー・アクティビティの追加および使用方法」を参照してください。

13.2.5 タスク・フロー・アクティビティの追加および使用方法

タスク内の手順に従って、開いているタスク・フロー・ソース・ファイルにタスク・フロー・アクティビティを追加します。アクティビティを使用可能なコンポーネントからダイアグラムにドラッグします。

始める前に:

図13-7に示すように、「コンポーネント」ウィンドウから「MAFタスク・フロー」を選択する必要があります。

MAFタスク・フローにアクティビティを追加するには:

1. 「アプリケーション」ウィンドウで、タスク・フロー・ソース・ファイル(ViewController-task-flow.xmlなど)をダブルクリックして、図13-7に示すようなタスク・フロー・ダイアグラムおよび「コンポーネント」ウィンドウを表示します。ダイアグラマにはタスク・フロー・エディタが表示されます。「コンポーネント」ウィンドウには、MAFタスク・フローで使用できるコンポーネントが自動的に表示されます。

2. 「コンポーネント」ウィンドウからダイアグラムにアクティビティをドラッグします。ダイアグラムにビュー・アクティビティをドラッグしてダブルクリックすると、MAF AMXページの作成ウィザードを起動できます(「ビュー・アクティビティの追加」を参照)。

図13-7 タスク・フロー・エディタのダイアグラマ

注意:

各バインド・タスク・フローに関連付けられているデフォルトのアクティビティがあります。

13.2.5.1 ビュー・アクティビティの追加

ビュー・アクティビティは、MAF AMXページを表示するタスク・フロー・アクティビティです。タスク・フローのビュー・アクティビティは、あるアクティビティが実行中に、制御を別のアクティビティに渡すように構成できます。

タスク・フローのソース・ファイルにあるXMLメタデータでは、ビュー・アクティビティが物理MAF AMXページと関連付けられています。id属性ではビュー・アクティビティが識別されます。

タスク・フローのビュー・アクティビティは、実行中に相互に制御を受け渡すように構成できます。たとえば、あるビュー・アクティビティ(ビュー・アクティビティA)から次のビュー・アクティビティ(ビュー・アクティビティB)に制御を渡すには、ビュー・アクティビティAと関連付けられたページ上にコマンド・コンポーネント(ボタンやリンクなど)を構成できます。これを行うには、コマンド・コンポーネントのAction属性を、起動するタスク・フロー・アクティビティ(ビュー・アクティビティBなど)に対応する制御フロー・ケースfrom-outcomeに設定します。ユーザーは実行時にコマンド・コンポーネントを起動することで、制御フロー・ケースを初期化します。UIコンポーネントのAction属性の定数値または動的値のいずれかを使用して、あるビュー・アクティビティから別のアクティビティに移動できます。

- コンポーネントのAction属性の定数値は、常に同じ制御フロー・ケースをトリガーするアクション結果です。ユーザーがコンポーネントをクリックすると、制御フロー・ケースに指定されているアクティビティが実行されます。代替の制御フローはありません。

- コンポーネントのAction属性の動的値は、マネージドBeanまたはメソッドにバインドされます。メソッド・バインディングにより返される値によって、次に起動する制御フロー・ケースが決定されます。たとえば、メソッドはページ上でユーザー入力を検証し、入力が有効な場合はある値を返し、入力が無効な場合は別の値を返します。これらの異なるアクション値はそれぞれ別個のナビゲーション・ケースをトリガーするため、アプリケーションが移動可能なターゲット・ページは2つのいずれかになります。

「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

また、ターゲット・ビュー・アクティビティに制御を渡す前に、値が必ずtrueになるEL式を記述できます。タスク・フローにある制御フロー・ケースの<if>子要素の値としてEL式を記述します。

次の2つの例は、表示アクティビティ間で制御を渡すときの処理を示しています。

1. この例は、バインド・タスク・フローまたはバインドなしタスク・フローのXMLソース・ファイルに定義された制御フロー・ケースを示しています。

<control-flow-rule>
<from-activity-id>Start</from-activity-id>
<control-flow-case>
<from-outcome>toOffices</from-outcome>
<to-activity-id>WesternOffices</to-activity-id>
</control-flow-case>
</control-flow-rule>

2. この例では、Startビュー・アクティビティに関連付けられているMAF AMXページ上のボタンで、action属性としてtoOfficesが指定されます。ユーザーがボタンをクリックすると、制御フロー・メタデータでto-activity-idとして指定されたWesternOfficesアクティビティに制御フローが渡されます。

<amx:commandButton text="Go" id="b1" action="toOffices">

詳細は、次を参照してください。

- ビュー・アクティビティの追加

- MAF AMXページの作成

前述のとおり、ビュー・アクティビティは、メタデータで、タスク・フローへの追加時に表示される実際のMAF AMXページに関連付けられています。ビュー・アクティビティを追加するには、「コンポーネント」ウィンドウからドラッグ・アンド・ドロップします。実際のMAF AMXページを作成するには、「ダイアグラム」ウィンドウでビュー・アクティビティをダブルクリックし、表示されるダイアログでページの特性を定義します。ビュー・アクティビティは、「アプリケーション」ウィンドウ内のMAF AMXファイルを概要エディタの「ダイアグラム」タブにドラッグ・アンド・ドロップして作成することもできます。

バインド・タスク・フローを作成する場合、特定のアクティビティをデフォルト・アクティビティに指定できます(「バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項」を参照)。それにより、バインド・タスク・フローの実行時は常にこの特定のアクティビティを最初に実行できます。デフォルトでは、JDeveloperはタスク・フローに追加した最初のアクティビティをデフォルトにします。別のアクティビティに変更する場合は、「ダイアグラム」ウィンドウ内で該当するアクティビティを右クリックし、「アクティビティのマーク」→「デフォルト・アクティビティ」の順に選択します(図13-8を参照)。

図13-8 デフォルト・アクティビティの定義

13.2.5.2 ルーター・アクティビティの追加

ルーティング条件をEL式で表すことができる場合は、EL式の実行時の評価を使用するルーター・アクティビティを使用して、制御をアクティビティにルーティングします。プロパティを構成してルーター・ケースを追加できる式を作成できます。

各制御フローは、異なるルーター・ケースに対応できます。各ルーター・ケースでは、次の要素を使用して、制御が次にルーティングされるアクティビティを選択します。

- expression: 実行時の値がtrueまたはfalseになるEL式
ルーター・アクティビティは、trueを返すEL式に対応する結果を返します。

- outcome: EL式の値がtrueの場合にルーター・アクティビティから返される値
制御フロー・ケース上でルーター・ケースのoutcomeがfrom-outcomeと一致する場合は、制御フロー・ケースがポイントするアクティビティに制御が渡されます。ルーター・アクティビティのケースの値がtrueでない場合、またはルーター・アクティビティのケースが指定されていない場合は、ルーターの「デフォルト結果」フィールドで指定されているoutcomeが使用されます。

ルーティング条件をEL式で表すことができる場合は、ルーター・アクティビティの使用を検討してください(ルーター・アクティビティにより、タスク・フローの条件について、より詳しい情報を示すことができます)。

ルーター・アクティビティをダイアグラム上にドラッグすると、「プロパティ」ウィンドウを使用して式を作成し、その式の評価によりどの制御フロー・ルールに従うかを決定できます。「プロパティ」ウィンドウを使用して、ルーター・アクティビティの「アクティビティID」および「デフォルト結果」を構成し、ルーター・ケースをルーター・アクティビティに追加します。

「アクティビティID」属性を定義する際は、タスク・フローのソース・ファイル内にルーター・アクティビティを識別する値を記述します。

「デフォルト結果」属性を定義する際は、いずれの制御フロー・ケースの値もtrueに評価されない場合、または制御フロー・ケースが指定されていない場合に、ルーター・アクティビティが制御を渡すアクティビティを指定します。

追加するルーター・ケースごとに、図13-49に示す「ケース」セクションで「追加」(+)をクリックして、値を指定します。

図13-9 ルーター・アクティビティの構成

- 式: 実行時の値がtrueまたはfalseになるEL式。
たとえば、ビュー・アクティビティの入力テキスト・フィールドにある値を参照するには、次のようなEL式を記述します。

#{pageFlowScope.value=='view2'}

EL式がtrueを返す場合は、ルーター・アクティビティによって「結果」フィールドで指定した結果が呼び出されます。

- 結果: 「式」によって指定されたEL式がtrueを返す場合にルーター・アクティビティが呼び出す結果。
タスク・フロー・ダイアグラムの結果ごとに制御フロー・ケースまたはワイルドカード制御フロー・ルールを作成します。たとえば、制御フロー・ケースの結果ごとに、対応するfrom-outcomeがあることを確認します。

ルーター・アクティビティを使用して制御フローを構成すると、JDeveloperによって、ルーター・アクティビティのプロパティに指定した値に基づいて、値がタスク・フローのソース・ファイルに書き込まれます。

13.2.5.3 メソッド・コール・アクティビティの追加

メソッド・コール・アクティビティはカスタム・メソッドまたは組込みメソッドをコールして、AMXアプリケーション機能のロジックを機能の制御フロー内から起動します。メソッド・コール・アクティビティを追加し、「プロパティ」ウィンドウを使用して、コールするメソッドを構成できます。

メソッド・コール・アクティビティを使用して、アプリケーション機能の制御フロー内のどこからでもMAF AMXアプリケーション機能ロジックを起動する、カスタム・メソッドまたは組込みメソッドをコールします。ページ表示前の初期化、ページ終了後のクリーンアップ、例外処理などのタスクを実行するメソッドを指定できます。

制御フロー・ケースを指定してメソッドの終了後に制御を渡すメソッドに対して結果を設定できます。結果は次のいずれかとして指定できます。

- fixed-outcome: 正常完了時に、メソッドから常に戻される単一の結果(例: success)。メソッドが正常に完了しないと結果は戻されません。メソッド・タイプがvoidの場合、fixed-outcomeを指定する必要があり、to-stringを指定することはできません。
この結果を定義するには、「プロパティ」ウィンドウで「固定結果」フィールドを設定します(図13-10を参照)。

- to-string: trueとして指定されると、メソッドによって戻されたJavaオブジェクトに対してtoStringメソッドがコールされ、それに基づく結果が得られます。たとえば、toStringメソッドからeditBasicInfoが戻された場合、ナビゲーションはeditBasicInfoという名前の制御フロー・ケースに移動します。
この結果を定義するには、「プロパティ」ウィンドウで「toString()」フィールドを設定します(図13-10を参照)。

メソッド・コール・アクティビティは、「データ・コントロール」ウィンドウからタスク・フロー・ダイアグラム内のメソッド・コール・アクティビティにデータ・コントロール操作を直接ドロップして、既存のメソッドに関連付けることができます。また、メソッドおよび操作をタスク・フロー・ダイアグラムに直接ドラッグすることもでき、その場合、新しいメソッド・コール・アクティビティが自動的に作成されます。メソッドにEL式およびその他のオプションを指定できます。

メソッド・コールを構成する場合、デフォルト値を変更するには、そのアクティビティの識別子を「アクティビティID」フィールドで変更します。新規の値を入力すると、ダイアグラムのメソッド・コール・アクティビティの下に新しい値が表示されます。

「メソッド」フィールドには、コールするメソッドを識別するEL式を入力します。

注意:

EL式内のバインディング変数は現在のバインディング・コンテナからバインディングを参照します。バインディング変数を指定するには、バインディング・コンテナ定義またはページ定義を指定する必要があります。「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

図13-10 メソッド・コール・アクティビティの構成

また、式ビルダーを使用してメソッドのEL式を作成することもできます。

- プロパティ・エディタから「メソッド」フィールドに「メソッド式ビルダー」を選択します。

- 「式ビルダー」ダイアログで、起動するメソッドにナビゲートして選択します。
メソッド・コール・アクティビティでマネージドBeanメソッドを起動する場合は、ダイアログでメソッド・コール・アクティビティをダブルクリックします。これによってダイアログが呼び出され、そこで起動するマネージドBeanメソッドを指定できます。

メソッドのパラメータおよび戻り値を指定するには、「プロパティ」ウィンドウの「パラメータ」セクションを使用します(図13-10を参照)。メソッド・コール・アクティビティを既存のメソッドに関連付けることによってパラメータをまだ作成していない場合は、「追加」(+)をクリックして次のように設定することにより、パラメータを追加します。

- クラス: パラメータ・クラスを入力します。たとえば、java.lang.Doubleのように指定します。

- 値: パラメータの値を取得するEL式を入力します。次にその例を示します。

#{pageFlowScope.shoppingCart.totalPurchasePrice}

- 戻り値: メソッドの戻り値を格納する場所を特定するEL式を入力します。次にその例を示します。

#{pageFlowScope.Return}

13.2.5.4 タスク・フロー・コール・アクティビティの追加

タスク・フロー・コール・アクティビティは、バインド・タスク・フローまたはバインドなしタスク・フローのいずれかから、バインド・タスク・フローをコールします。タスク内の手順に従って、バインド・タスク・フローをコールし、タスク・フロー・コール・アクティビティに入力パラメータの値を指定します。

タスク・フロー・コール・アクティビティを使用すると、バインドなしタスク・フロー(「バインドなしタスク・フロー」を参照)またはバインド・タスク・フロー(「バインド・タスク・フロー」を参照)のいずれかからバインド・タスク・フローをコールできます。このアクティビティによって、同じまたは別のMAF AMXアプリケーション機能内にあるバインド・タスク・フローをコールできます。

コールされたバインド・タスク・フローでは、デフォルト・アクティビティが最初に実行されます。バインド・タスク・フロー・コールの数に制限はありません。たとえば、コール先のバインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそのバインド・タスク・フローからも次々にコールできるため、各タスク・フローがタスク間を結び付けるタスク・フロー・チェーンを作成できます。

バインド・タスク・フローにパラメータを渡すには、タスク・フロー・コール・アクティビティに入力パラメータの値を指定する必要があります。これらの値は、コール先のバインド・タスク・フローの入力パラメータ定義と一致している必要があります。「タスク・フロー・コール・アクティビティでの入力パラメータの指定」を参照してください。

注意:

タスク・フロー・コール・アクティビティの入力パラメータの値は、コール元のタスク・フロー内で値が取得される場所を指定します。

コール先のタスク・フローの入力パラメータの定義の値は、それが渡されたときにコール先のバインド・タスク・フローで値が格納される場所を指定します。

注意:

バインド・タスク・フローがタスク・フロー・コール・アクティビティに関連付けられると、バインド・タスク・フローで設定されている入力パラメータ定義に基づいて、入力パラメータが自動的にタスク・フロー・コール・アクティビティに挿入されます。したがって、実行する必要があるのは、タスク・フロー・コール・アクティビティの入力パラメータへの値の割当てのみです。

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

バインド・タスク・フローからコール元に戻り値が渡される方法は、入力パラメータが渡される方法と類似しています。詳細は、「バインド・タスク・フローの戻り値の構成」を参照してください。

タスク・フロー・コール・アクティビティを使用するには:

1. タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールします(「タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール」を参照)

2. バインド・タスク・フローにパラメータを渡す場合は、タスク・フロー・コール・アクティビティへの入力パラメータを指定します(「タスク・フロー・コール・アクティビティでの入力パラメータの指定」を参照)。

13.2.5.4.1 タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール

タスク内の手順に従って、バインド・タスク・フローのソース・ファイルを開いてアクティビティを選択し、タスク・フロー・コール・アクティビティを追加して、その識別子を構成します。

バインド・タスク・フローをコールする手順:

1. ダイアグラム・ビューでバインド・タスク・フロー・ファイルを開きます。

2. 「コンポーネント」ウィンドウで、「コンポーネント」→「アクティビティ」を選択します。

3. タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

4. 次のオプションのいずれかを選択して、コール先タスク・フローを識別します。

- 新しくドロップしたタスク・フロー・コール・アクティビティをダブルクリックして、新しいバインド・タスク・フローの設定を定義できる「MAFタスク・フローの作成」ダイアログを開きます(図13-2を参照)。

- 「アプリケーション」ウィンドウから既存のバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップします。

- 起動するバインド・タスク・フローの名前がわかっている場合は、次の手順を実行します。

a. ダイアグラム・ビューで、「タスク・フロー・コール」アクティビティを選択します。

b. 次の図に示す「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストで「静的」を選択します。

c. 「ドキュメント」フィールドに、コールするバインド・タスク・フローのソース・ファイル名を入力します。

d. 「ID」フィールドには、コール先のバインド・タスク・フローのXMLソース・ファイルに含まれているバインド・タスク・フローIDを入力します。

図13-11 バインド・タスク・フローを起動するタスク・フロー・コール・アクティビティ

起動するバインド・タスク・フローの名前がわからない場合や、実行時のユーザーによって名前が異なる場合は、次の手順を実行します。

a. ダイアグラム・ビューで、「タスク・フロー・コール」アクティビティを選択します。

b. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストで「動的」を選択します。

c. 式ビルダーを使用して、「動的タスク・フロー参照」プロパティ・フィールドの値を設定します(実行時に起動するバインド・タスク・フローのIDを識別するEL式を記述します)。

13.2.5.4.2 タスク・フロー・コール・アクティビティでの入力パラメータの指定

新しい入力パラメータは、選択したタスク・フロー・コール・アクティビティに指定できます。タスク内の手順に従って、コールされたバインド・タスク・フローの入力パラメータ定義を構成し、タスク・フロー・コール・アクティビティと、そのコールされたバインド・タスク・フローの間のパラメータをマップします。

タスク・フロー・コール・アクティビティとそのコール先のバインド・タスク・フローの間でパラメータをマップするには、まずコール先のバインド・タスク・フローの入力パラメータ定義を指定する方法をお薦めします。その後、「アプリケーション」ウィンドウからバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップできます。タスク・フロー・コール・アクティビティの入力パラメータは、バインド・タスク・フローの入力パラメータの定義に基づいて、自動的に作成されます。「バインド・タスク・フローへのパラメータ渡し」を参照してください。

当然ながら、最初にタスク・フロー・コール・アクティビティに入力パラメータを指定することも可能です。最初に定義した場合にも、コール先のバインド・タスク・フローの入力パラメータ定義がタスク・フロー・コール・アクティビティに関連付けられた時点で、その入力パラメータ定義に基づいて自動的に置換されます。

コール先のバインド・タスク・フローをまだ作成していない場合にも、タスク・フロー・コール・アクティビティに入力パラメータを指定する方法は便利です。この時点で指定することで、バインド・タスク・フローのコール時にタスク・フロー・コール・アクティビティが最終的にマップされる予定の入力パラメータを特定できます。

入力パラメータを指定する手順:

1. ダイアグラム・ビューでタスク・フロー・ファイルを開き、「タスク・フロー・コール」アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「パラメータ」セクションを開き、「追加」( + )をクリックして、「入力パラメータ」リストで次のように新しい入力パラメータを指定します。

- 名前: 入力パラメータを識別する名前を入力します。

- 値: パラメータ値を識別するEL式を入力します。このEL式では、コール元のタスク・フロー内でパラメータ値が取得される場所を指定します。たとえば、次のようにEL式を入力します。

#{pageFlowScope.callingTaskflowParm}

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

3. 入力パラメータを指定すると、対応する入力パラメータ定義をコール先のバインド・タスク・フローに指定できます。「バインド・タスク・フローへのパラメータ渡し」を参照してください。

13.2.5.4.3 データ・コントロール・コンテキストの指定

共有されるデータ・コントロール・コンテキストを使用すると、タスク・フロー・コールでデータ・コントロールを共有できますが、独立したデータ・コントロール・コンテキストを使用すると、タスク・フローは独立して動作できます。タスク内の手順に従って、選択したタスク・フロー・コール・アクティビティのタスク・フローに、データ・コントロール・コンテキスト・プロパティを指定します。

タスク・フローがデータ・コントロールを共有するか、独立したデータ・コントロールを保存するために使用する内部オブジェクトは、データ・コントロール・コンテキストと呼ばれます。タスク・フローのdata-control-contextの値にsharedが指定されている場合は、コール先のタスク・フローでは独自のデータ・コントロール・コンテキストは作成されず、コール元のデータ・コントロール・コンテキストが使用されます。これにより、データ・コントロール・コンテキストに添付されたデータ・コントロール・インスタンスをコール先のタスク・フローと共有できるようになります。または、コール先のタスク・フローでdata-control-contextの値にisolatedが指定されている場合は、新しいデータ・コントロール・コンテキストが作成され、タスク・フローで使用されるすべてのデータ・コントロールの新しいインスタンスが、新規に作成されたデータ・コントロール・コンテキストに添付されます。

タスク・フロー・コール・アクティビティのデータ・コントロール・コンテキストは、次のように定義できます。

1. ダイアグラム・ビューで、「タスク・フロー・コール」アクティビティを選択します。

2. 「プロパティ」ウィンドウで「一般」セクションを開き、「データ・コントロール・コンテキスト」プロパティの値を指定します。

- コール元のタスク・フローでデータ・コントロールを共有する場合は、ドロップダウン・フィールドからshared(デフォルト)を選択します。たとえば、コール先のタスク・フローに加えられた変更は、コール元のタスク・フローに戻るナビゲーションが発生したときに反映されます。

- そのタスク・フローで独自のデータ・コントロール・インスタンスのセットを持つ場合は、ドロップダウン・フィールドからisolatedを選択します。

- "shared"または"isolated"のいずれかに評価されるEL式を定義します。「プロパティ」ウィンドウの「データ・コントロール・コンテキスト」フィールドの右側にある「プロパティ・メニュー」アイコンをクリックして開くことができる「プロパティの編集: データ・コントロール・コンテキスト」ダイアログ・ボックスで、この値を設定します(次の図を参照)。

注意:
data-control-contextの正しい値を選択するには、自身のデータ・モデルを検討し、タスク・フローの境界を越えてどのようにデータを共有する必要があるかを決定します。

データ・コントロール・コンテキストの深さの設定の詳細は、「タスク・フローのデータ・コントロール・コンテキストの深さを定義する方法」を参照してください。

13.2.5.5 タスク・フロー・リターン・アクティビティの追加

タスク・フロー・リターン・アクティビティは、MAF AMXアプリケーション機能の制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターン・アクティビティは、バインド・タスク・フロー内でのみ使用できます。

タスク・フロー・リターン・アクティビティ・アイコンを囲むグレーの円は、そのアクティビティがバインド・タスク・フローの終了ポイントであることを示します。各バインド・タスク・フローには、ゼロから複数のタスク・フロー・リターン・アクティビティを指定できます。

各タスク・フロー・リターン・アクティビティには、コール元のタスク・フローに戻されるoutcomeを指定します。

起動するタスク・フローに戻されるoutcomeは、エンド・ユーザー・アクションによって異なります。起動元のタスク・フローによって次のアクションを決定するように、起動元のタスク・フローの制御フロー・ケースを構成できます。制御フロー・ケースの「結果(自)」プロパティをタスク・フロー・リターン・アクティビティのoutcomeからの戻り値に設定し、結果に基づくアクションを起動します。これにより、コール先タスク・フローからの戻り値に基づいて制御フローが決まります。

タスク・フロー・リターン・アクティビティを追加する手順:

1. ダイアグラム・ビューでバインド・タスク・フロー・ファイルを開きます。

2. 「コンポーネント」ウィンドウで、「コンポーネント」→「アクティビティ」を選択します。

3. タスク・フロー・リターン・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

4. 「プロパティ」ウィンドウ(図13-12を参照)で、「一般」セクションを開き、「名前」フィールドに結果を入力します。
タスク・フロー・リターン・アクティビティは、現在のバインド・タスク・フローが存在する場合に、この結果をコール元タスク・フローに返します。タスク・フロー・リターン・アクティビティごとに1つのみ結果を指定できます。コール元のタスク・フローには、戻された時点の制御フローを処理する制御フロー・ルールを定義する必要があります。詳細は、「制御フローの定義方法」を参照してください。

5. 「動作」セクションを開き、「再入力」リストでいずれかのオプションを選択します。
バインド・タスク・フローにreentry-not-allowedを指定しても、エンド・ユーザーはモバイル・デバイスの「戻る」ボタンをクリックするとバインド・タスク・フロー内のページに戻れます。ただし、エンド・ユーザーがそのページでボタンの作動などなんらかの操作を行うと、バインド・タスク・フローを不正に再開したことを示す例外(InvalidTaskFlowReentryなど)がスローされます。

6. 「トランザクションの終了」ドロップダウン・リストから、次のいずれかのオプションを選択します。

- commit: 選択すると、既存のトランザクションをデータベースにコミットします。

- rollback: 選択したトランザクションをコール先のタスク・フローの以前のエントリまでロールバックします。これを指定すると、新しいトランザクションはバインド・タスク・フローに入って開始された当初の状態までロールバックされるため、トランザクションを取り消すのと同じ効果があります。
commitとrollbackのいずれも指定しないと、トランザクションはコール元のバインド・タスク・フローによって閉じられるまで開いたままになります。

図13-12 タスク・フロー・リターン・アクティビティの構成

13.2.5.6 ページ定義ファイルのあるタスク・フロー・アクティビティの使用

ページ定義ファイルは、実行時にデータを移入するバインディング・オブジェクトを定義します。通常、MAF AMXアプリケーション機能で、ページUIコンポーネントをデータ・コントロールにバインドするために使用されます。次のタスク・フロー・アクティビティでも、ページ定義ファイルを使用してデータ・コントロールへのバインドが可能です。

- メソッド・コール: 「データ・コントロール」ウィンドウからタスク・フローにデータ・コントロール操作をドラッグ・アンド・ドロップして、メソッド・コール・アクティビティを作成するか、既存のメソッド・コール・アクティビティにドロップできます。いずれの場合も、メソッド・コール・アクティビティが、データ・コントロール操作にバインドされます。

- ルーター: ページ定義ファイルをルーター・アクティビティと関連付けることで、バインディング・コンテナが作成されます。このバインド・コンテナは実行時にルーター・アクティビティ・ケースのEL式を評価し、ルーター・アクティビティが正しいバインド値を参照していることを確認します。各ルーター・アクティビティ・ケースは、EL式の評価結果がtrueの場合に返される結果を指定します。そのため、ページ定義ファイルには、trueまたはfalseの評価結果となるデータ・コントロール操作だけを追加します。

- タスク・フロー・コール: タスク・フロー・コール・アクティビティにページ定義ファイルを関連付けることで、バインド・コンテナが作成されます。実行時にタスク・フロー・コール・アクティビティから入力パラメータが渡されると、バインド・コンテナが起動します。バインド・コンテナはタスク・コール元のタスク・フローからコール先のタスク・フローに入力パラメータが渡される際に、フロー・コール・アクティビティがバインド値を参照する場合は、正しい値を参照していることを確認します。

- ビュー: ビュー・アクティビティをページ定義ファイルに直接関連付けることはできません。かわりに、ビュー・アクティビティが参照するページを関連付けます。

タスク・フローの「ダイアグラム」ウィンドウで、前述のタスク・フロー・アクティビティ(ビュー・アクティビティを除く)のいずれかを右クリックすると、ページ定義ファイルが存在しない場合にページ定義ファイルを作成できるオプションがポップアップ・メニューに表示されます。ページ定義ファイルが存在する場合、JDeveloperではページ定義ファイルに移動するためのすべてのタスク・フロー・アクティビティのポップアップ・メニュー・オプションが表示されます(「ページ定義ファイルへのアクセス」を参照)。また、ページ定義ファイルに関連付けられたメソッド・コール・アクティビティを右クリックすると、JDeveloperで「バインディングの編集」ポップアップ・メニュー・オプションが表示されます。

ページ定義ファイルに関連付けられたタスク・フロー・アクティビティでは、タスク・フロー・アクティビティ・アイコンの右下にアイコンが表示されます。

タスク・フロー・アクティビティにページ定義ファイルを関連付けるには:

1. ダイアグラム・ビューで、ページ定義ファイルを作成するタスク・フロー・アクティビティを右クリックし、ポップアップ・メニューから「ページ定義の作成」を選択します。

2. 作成されたページ定義ファイルに、タスク・フロー・アクティビティの実行時に参照させたいバインドを追加します。

ページ定義ファイルの詳細は、「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

前述の手順を完了すると、デザインタイムに、タスク・フロー・アクティビティのページ定義ファイルがJDeveloperによって生成されます。ページ定義ファイルのファイル名は、元のタスク・フローおよびタスク・フロー・アクティビティまたは起動するデータ・コントロール操作から構成されます。JDeveloperは作成されたページ定義ファイル内で、タスク・フロー・アクティビティからバインドへのEL式も生成します。実行時にバインド・コンテナは、タスク・フロー・アクティビティのEL式が正しい値を参照していることを確認します。

13.2.6 タスク・フローのデータ・コントロール・コンテキストの深さを定義する方法

データ・コントロール・コンテキストの深さを構成して特定の機能を無効にすることで、タスク・フローの無限ドリルを回避できます。たとえば、データ・コントロール・コンテキストが特定のスタックの深さに到達したら、ネストされたタスク・フローへのドリルを無効にできます。

次の図に示すように、アプリケーションのmaf-config.xmlファイル内のmaximumDataControlContextDepthプロパティの設定によって、データ・コントロール・コンテキストの最大の深さを変更できます(「データ・コントロール・コンテキストの指定」を参照)。デフォルト値は、10です。

また、次の図に示すように、モバイル・アプリケーション・フレームワークのfeatureオブジェクトを使用して、#{feature.dataControlContextDepth}または#{feature.maximumDataControlContextDepth}のいずれかのEL式を定義することもできます。

さらに、スタックの最大の深さへのアクセスに加え、データ・コントロール・コンテキストの現在のスタックの深さへのアクセスを提供するEmbeddedFeatureContextクラスのメソッドを使用できます。Oracle Mobile Application Framework Java APIリファレンスを参照してください。

maf-config.xmlファイルの詳細は、表C-1を参照してください。

EL式の詳細は、「EL式の作成」を参照してください。

13.2.7 制御フローの定義方法

MAF AMXアプリケーション機能で制御フローを定義するには、次のタスク・フロー・コンポーネントを使用します。

- 制御フロー・ケース(「制御フロー・ケースの定義」を参照)

- ワイルドカード制御フロー・ルール(「ワイルドカード制御フロー・ルールの追加」を参照)

13.2.7.1 制御フロー・ケースの定義

制御がアクティビティから次のアクティビティに渡される方法を指定する制御フロー・ケース・コンポーネントを使用してナビゲーションを作成できます。制御フローを作成するには、「コンポーネント」ウィンドウから「制御フロー・ケース」を選択します。次に、制御フロー・ケースをソース・アクティビティに接続し、さらにターゲット・アクティビティに接続します。

ソースおよびターゲット・アクティビティを接続すると、JDeveloperでは、次のものが作成されます。

- control-flow-rule: from-activity-idを使用してソース・アクティビティを識別します。

- control-flow-case: to-activity-idを使用してターゲット・アクティビティを識別します。

MAFタスク・フロー・ダイアグラムで制御フロー・ケースを直接定義するには:

1. ダイアグラム・ビューでタスク・フロー・ソース・ファイルを開きます。

2. 「コンポーネント」ウィンドウから「制御フロー・ケース」を選択します。

3. ダイアグラムで、ソース・アクティビティをクリックし、次にターゲット・アクティビティをクリックします。ダイアグラムに制御フロー・ケースが追加されます。アクティビティ間に追加された各線は、制御フロー・ケースを表します。from-outcomeには、MAF AMXのUIコンポーネントのaction属性に指定された値と照合される値が含まれています。

4. from-outcomeを変更するには、ダイアグラムの制御フローの隣のテキストを選択します。デフォルトでは、これはワイルドカード文字です。

5. from-activity-id(ソース・アクティビティの識別子)やto-activity-id(ターゲット・アクティビティの識別子)を変更するには、ダイアグラムの矢印のどちらかの端を新規のアクティビティにドラッグします。

13.2.7.2 ワイルドカード制御フロー・ルールの追加

MAFタスク・フローではワイルドカード制御フロー・ルールをサポートし、これは、後方ワイルドカード(foo*)や単一ワイルドカード文字のある制御フローfrom-activity-idを表します。ワイルドカード制御フロー・ルールは、「コンポーネント」ウィンドウからドラッグ・アンド・ドロップすることにより、バインドなしタスク・フローまたはバインド・タスク・フローに追加できます。ワイルドカード制御フロー・ルールを構成するには、「プロパティ」ウィンドウを使用します。

ワイルドカード制御フロー・ルールを追加するには:

1. ダイアグラム・ビューでタスク・フロー・ソース・ファイルを開きます。

2. 「コンポーネント」ウィンドウで「ワイルドカード制御フロー・ルール」を選択して、ダイアグラムにドロップします。

3. 「コンポーネント」ウィンドウで、「制御フロー・ケース」を選択します。

4. タスク・フロー・ダイアグラムで、制御フロー・ケースをワイルドカード制御フロー・ルールからターゲット・アクティビティ(任意のアクティビティ・タイプ)にドラッグします。

5. デフォルトでは、ワイルドカード制御フロー・ルールの後のラベルは*です。これは、「アクティビティID(自)」要素の値です。この値を変更するには、ダイアグラムでワイルドカード制御フロー・ルールを選択します。ワイルドカード制御フロー・ルールの「プロパティ」ウィンドウで、「アクティビティID(自)」フィールドに新しい値を入力します。便利な規則は、ワイルドカード制御フロー・ルールをその目的を表す形式でキャストすることです。たとえば、project*と入力します。新しいラベルでは、ワイルドカードは後続の文字である必要があります。

ヒント:

タスク・フロー・ダイアグラムの概要エディタにある「アクティビティID(自)」の値も変更できます。

6. オプションとして、「プロパティ」ウィンドウでは、「動作」セクションを開いて、値がtrueになる必要がある、「If」フィールド内のEL式を記述した後に、「アクティビティID(至)」によって識別されたアクティビティに制御を渡すことができます。

13.2.7.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名と一致します。メタデータに(後方ワイルドカードではなく)単一のワイルドカード文字を指定すると、ダイアグラムで、制御フローが自動的にワイルドカード制御フロー・ルール・アクティビティに変換されます。「ワイルドカード制御フロー・ルールの追加」を参照してください。

- control-flow-case: 制御フロー・ルールの各ケースの必須ラッパー要素。それぞれのケースで、同じソース・アクティビティに対して異なる制御フローを定義します。制御フロー・ルールには、少なくとも1つの制御フロー・ケースが必要です。

- from-action: 指定されたアクション・メソッドからの結果のみにルールの適用を制限する任意の要素。アクション・メソッドは、ELバインディング式(#{backing_bean.cancelButton_action}など)として指定されます。
前の例では、結果がactionmethodから戻された場合にのみ制御がdestinationActivityに渡されます。

from-actionの値は、ビュー・アクティビティから発生する制御フローのみに適用され、その他のアクティビティ・タイプからのものには適用されません。from-actionでは、ワイルドカードはサポートされていません。

- from-outcome: 特定の元のアクティビティ結果に基づき、続いて起こる制御フロー・ケースを識別する要素。考えられるすべての元のアクティビティの結果は、制御フロー・ケースと適合する必要があります。
from-action要素とfrom-outcome要素の両方を空のままにすると、ケースはアクティビティに対して定義されたその他の制御フロー・ケースでは識別されないすべての結果に適用されるため、アクティビティのデフォルト・ケースが作成されます。from-outcomeでは、ワイルドカードはサポートされていません。

- to-activity-id: 制御フロー・ケースが実行される場合にナビゲーションのルーティング先となるアクティビティの完全な識別子が含まれる必須要素。各制御フロー・ケースは、異なるto-activity-idを指定できます。

- if: EL式の値を受け取るオプション要素です。実行時にEL式の値がtrueの場合は、to-activity-id要素によって識別されたアクティビティに制御フローを渡します。

13.2.7.4 制御フロー・ルールの評価に関する必知事項

実行時、タスク・フローは、最も具体的な一致から最も具体的でない一致まで制御フロー・ルールを評価して、アクティビティ間の次の遷移を決定します。評価は次の優先度に基づきます。

1. from-activity-id、from-action、from-outcome: 最初に、3つの要素すべての一致を検索します。

2. from-activity-id、from-outcome: 3つすべての要素で一致がない場合は、これらの要素を検索します。

3. from-activity-id: 前述の組合せの検索で一致がなかった場合は、この要素のみで検索します。

13.2.8 「戻る」ナビゲーションのMAFサポートに関する必知事項

図13-13に示すタスク・フロー例では、アクション結果の値に基づいて、viewA→viewB→viewD、またはviewA→viewC→viewDという2つの別のパスを経由してviewDに到達する可能性があります(「UIコンポーネントを使用したアクション結果の指定方法」を参照)。

図13-13 戻るナビゲーションのあるタスク・フロー

理論上は、どのナビゲーション・パスが使用されたかを追跡して__backナビゲーション・フローを直接実装することもできますが、特にモバイル・デバイスの画面領域が限られていてナビゲーション・シーケンスに従っていない遷移が非常に頻繁に発生するため、これは複雑なうえに間違いが発生しやすくなります。MAFでは、組込みの__backナビゲーションがサポートされているため、タスク・フロー全体にわたる後方移動が可能です。つまり、経由したパスに関する情報を適用することにより、同じパスを経由する後方ナビゲーションを実行します。たとえば、最初のナビゲーションでviewAからviewCを経由してviewDに達していた場合、ViewDで__backオプションを実行すると、エンド・ユーザーは、ViewB経由ではなくViewC経由で、ViewAに自動的に戻ります。

詳細は、次を参照してください:

- ViewController-task-flow.xmlファイルに関する必知事項

- マネージドBeanの作成および参照方法

- 戻るボタン・ナビゲーションの有効化

13.2.9 ドラッグによりページ・ナビゲーションを有効にする方法

ナビゲーションのドラッグ動作を使用することで、いずれかのMAF AMXページから別のページへのナビゲーションを有効化できます。「ドラッグ・ナビゲーションの有効化」を参照してください。

13.2.10 UIコンポーネントを使用したアクション結果の指定方法

「プロパティ」ウィンドウを使用して、次に示すUIコンポーネントのいずれかのaction属性を、該当する制御フロー・ケースのfrom-outcomeに設定して次のタスク・フロー・アクティビティに導くことにより、アクションの結果を指定できます。

- コマンド・ボタン(「ボタンの使用方法」を参照)

- コマンド・リンク(「リンクの使用方法」を参照)

- リスト・アイテム

UIコンポーネントの「アクション」フィールド(図13-14を参照)を使用して、特定のMAF AMXページの1つ以上のタスク・フローで定義される可能性のあるアクション結果のリストから選択を行います。

図13-14 アクションの設定

戻るアクション(__back)は、各リストに自動的に追加され、前に参照したページへのナビゲーションを可能にします。

注意:

MAF AMXページは、バインド・タスク・フローとバインドなしタスク・フローの両方で参照でき、その場合、両方のタスク・フローからのアクション結果が「アクション」選択リストに含まれます。

13.2.11 マネージドBeanの作成および参照方法

独自のMAFアプリケーションでマネージドBeanを作成および使用して、追加データを格納したり、カスタム・コードを実行できます。JDeveloperの通常の編集メカニズムを使用して、マネージドBeanを参照したり、適用可能なフィールドに対してマネージドBeanへの参照を作成できます。「マネージドBeanの作成および使用」を参照してください。

図13-15に、「プロパティ」ウィンドウのactionプロパティに対する「編集」オプションを示します。このオプションをクリックすると、図13-16に示す「プロパティの編集」ダイアログが表示されます。

図13-15 「編集」ダイアログ

図13-16 アクションの「プロパティの編集」ダイアログ

表13-7には、「プロパティ」ウィンドウで「編集」オプションを選択できるMAF AMX属性がリストされています。

表13-3 編集可能な属性

プロパティ

要素

action

amx:commandButton

action

amx:commandLink

action

amx:listItem

action

amx:navigationDragBehavior

action

dvtm:chartDataItem

action

dvtm:ieDataItem

action

dvtm:timelineItem

action

dvtm:area

action

dvtm:marker

actionListener

amx:listItem

actionListener

amx:commandButton

actionListener

amx:commandLink

binding

amx:actionListener

mapBoundsChangeListener

dvtm:geographicMap

mapInputListener

dvtm:geographicMap

moveListener

amx:listView

rangeChangeListener

amx:listView

selectionListener

amx:listView

selectionListener

amx:filmStrip

selectionListener

dvtm:areaDataLayer

selectionListener

dvtm:pointDataLayer

selectionListener

dvtm:treemap

selectionListener

dvtm:sunburst

selectionListener

dvtm:timelineSeries

selectionListener

dvtm:nBox

selectionListener

dvtm:areaChart

selectionListener

dvtm:barChart

selectionListener

dvtm:bubbleChart

selectionListener

dvtm:comboChart

selectionListener

dvtm:lineChart

selectionListener

dvtm:funnelChart

selectionListener

dvtm:pieChart

selectionListener

dvtm:scatterChart

valueChangeListener

amx:inputDate

valueChangeListener

amx:inputNumberSlider

valueChangeListener

amx:inputText

valueChangeListener

amx:selectBooleanCheckbox

valueChangeListener

amx:selectBooleanSwitch

valueChangeListener

amx:selectManyCheckbox

valueChangeListener

amx:selectManyChoice

valueChangeListener

amx:selectOneButton

valueChangeListener

amx:selectOneChoice

valueChangeListener

amx:selectOneRadio

valueChangeListener

dvtm:statusMeterGauge

valueChangeListener

dvtm:dialGauge

valueChangeListener

dvtm:ratingGauge

viewportChangeListener

dvtm:areaChart

viewportChangeListener

dvtm:barChart

viewportChangeListener

dvtm:comboChart

viewportChangeListener

dvtm:lineChart

その他のどのプロパティに対しても「編集」をクリックすると同様のダイアログが表示されますが、図13-17に示すように「アクション結果」オプションはありません。

図13-17 アクション・リスナーの「プロパティの編集」ダイアログ

このダイアログは、マネージドBeanを作成するか、actionプロパティに使用可能なアクション結果を選択できることを示しています。

図13-16に示す「アクション結果」リストには、特定のMAF AMXページが属するすべてのタスク・フローからのアクション結果が含まれています。また、このリストには、以前に参照したページに戻るための__backナビゲーションの結果が含まれています(詳細は「UIコンポーネントを使用したアクション結果の指定方法」を参照してください)。ページがタスク・フローの一部ではない場合、__backが「アクション結果」リストで使用可能な唯一の結果です。使用可能なアクション結果のいずれかを選択し、「OK」をクリックすると、アクション・プロパティ値は、適切なEL式(commandButtonの場合、次のとおり)で更新されます。

<amx:commandButton action="goHome"/>

「メソッド・バインディング」オプション(図13-16を参照)では、新しいマネージドBeanクラスを作成したり、既存のマネージドBeanクラスを選択することができます。

新しいマネージドBeanクラスを作成するには:

1. 「マネージドBean」フィールドの横にある「新規」をクリックし、図13-18に示す「マネージドBeanの作成」ダイアログを開きます。

図13-18 「マネージドBeanの作成」ダイアログ・ボックス

MAFでは、次のスコープがサポートされています。

- application

- view

- pageFlow

MAFアプリケーションまたはMAF AMXアプリケーション機能に対してマネージドBeanを宣言すると、マネージドBeanはインスタンス化されて適切なスコープ内で識別され、Beanのプロパティが解決されてそのメソッドがELを介してコールされます。「EL式の作成」を参照してください。

2. マネージドBeanおよびクラス名を指定し(図13-19を参照)、「OK」をクリックします。

図13-19 マネージドBean名およびクラスの設定

次の例は、新規に作成されたマネージドBeanクラスを示しています。MAF AMXページが含まれるタスク・フローが、Beanを参照するように更新されます。

<managed-bean id="__3">
<managed-bean-name>MyBean</managed-bean-name>
<managed-bean-class>mobile.MyBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

注意:

特定のMAF AMXページがバインド・タスク・フローおよびバインドなしタスク・フローの一部である場合、これら両方のタスク・フローがマネージドBeanエントリで更新されます。

3. 「メソッド」フィールドの横にある「新規」をクリックして(図13-16および図13-17を参照)、図13-20に示す「メソッドの作成」ダイアログを開きます。

図13-20 「メソッドの作成」ダイアログ

このダイアログを使用して、マネージドBeanメソッド名を指定します(図13-21を参照)。

図13-21 マネージドBeanメソッドのネーミング

完了すると、選択したプロパティ値が適切なEL式で更新されます(commandButtonの場合は次のようになります)。

<amx:commandButton action="#{MyBean.getMeHome}"/>

また、マネージドBeanクラスは、次の例に示すように、新規に作成されたメソッドを含むように更新されます。

package mobile;

public class MyBean {
public MyBean() {
}

public String getMeHome() {
// Add event code here...
return null;
}
}

既存のマネージドBeanを選択するには:

1. 図13-22に示す「マネージドBean」リストから選択を行います。

図13-22 マネージドBeanの選択

アクション結果と同様、「マネージドBean」リストには、このMAF AMXページが含まれるすべてのタスク・フローからのマネージドBeanが移入されます。

注意:

MAF AMXページがタスク・フローの一部ではない場合でも、マネージドBeanは作成できます。

詳細は、次の項を参照してください。

- マネージドBeanカテゴリについて

- APIDemo (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているMAFサンプル・アプリケーション)。

13.2.12 ページ遷移スタイルの指定方法

タスク・フローでページ遷移スタイルを定義することにより、ビューから別のビューへのMAF AMXページの遷移方法を指定できます。MAF AMXページの遷移動作は次のようにできます。

- フェード・イン

- 左からスライド・イン

- 右からスライド・イン

- 下からスライド・アップ

- 上からスライド・ダウン

- 始点からスライド・イン

- 終点からスライド・イン

- 下からフリップ・アップ

- 上からフリップ・ダウン

- 左からフリップ

- 右からフリップ

- 始点からフリップ

- 終点からフリップ

- なし

始点および終点からスライド・インと、始点および終点からフリップは、iOSプラットフォームおよびAndroid 4.2以降のプラットフォームで右から左(RTL)のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点の遷移スタイルを使用することをお薦めします。

次の例のようにcontrol-flow-case(制御フロー・ケース・コンポーネント)のtransition属性を変更することによって、遷移スタイルを設定します。

<control-flow-rule id="__1">
<from-activity-id>products</from-activity-id>
<control-flow-case id="__2">
<from-outcome>details</from-outcome>
<to-activity-id>productdetails</to-activity-id>
<transition>fade</transition>
</control-flow-case>
</control-flow-rule>

図13-23に示すように、「プロパティ」ウィンドウでは、transition属性は「動作」の下にあります。デフォルトの遷移スタイルはslideLeftです。

図13-23 「プロパティ」ウィンドウでの遷移スタイルの設定

ヒント:

タスク・フローを定義する場合、control-flow-caseのtransition値が論理的になるように指定する必要があります。たとえば、戻るナビゲーションのために左から右に遷移が発生する場合、右にスライドして前のページに戻る必要があります。

13.2.13 バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項

タスク・フローでは、MAF AMXアプリケーション機能内で制御フローを定義するためのモジュールのアプローチが提供されています。アプリケーション機能は単一の大規模なページ・フローとして表すのではなく、再利用可能な一連のタスク・フローに分割できます。各タスク・フローには、アプリケーション機能のナビゲーション・グラフの一部が含まれます。タスク・フロー内のノードは、アクティビティを表します。アクティビティ・ノードでは、ページの表示、アプリケーション・ロジックの実行または別のタスク・フローのコールなど、シンプルな論理的操作が表示されます。アクティビティ間の遷移は制御フロー・ケースと呼ばれます。

MAF AMXのタスク・フローには、バインドとバインドなしの2種類があります。

1. バインドなしタスク・フロー: エンド・ユーザーがタスクを完了できるように対話する一連のアクティビティ、制御フロー・ルールおよびマネージドBeanです。バインドなしタスク・フローは、バインド・タスク・フローに含まれていない、MAF AMXアプリケーション機能内のすべてのアクティビティおよび制御フローで構成されています。

2. バインド・タスク・フロー: タスク・フローの特殊な形式であり、バインドなしタスク・フローとは異なり、単一エントリ・ポイントと0以上の終了ポイントがあります。これには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。

バインドなしタスク・フローまたはバインド・タスク・フローに追加可能なアクティビティ・タイプの説明は、「タスク・フロー・アクティビティおよび制御フローに関する必知事項」を参照してください。

一般的なMAF AMXアプリケーション機能には、アプリケーション機能作成時に作成された1つのバインドなしタスク・フローと、1つ以上のバインド・タスク・フローの組合せが含まれます。実行時、MAFアプリケーションでは、バインドなしタスク・フローに追加したアクティビティからバインド・タスク・フローをコールできます。

13.2.13.1 バインドなしタスク・フロー

各MAF AMXアプリケーション機能には必ず、そのアプリケーション機能に対する1つ以上のエントリ・ポイントを提供するバインドなしタスク・フローが1つ含まれています。エントリ・ポイントは、ビュー・アクティビティによって表されます。デフォルトでは、バインドなしタスク・フローのソース・ファイルはadfc-mobile-config.xmlファイルです。

図13-24に、MAF AMXアプリケーション機能からのバインドなしタスク・フローのダイアグラムを示します。このタスク・フローにはいくつかのビュー・アクティビティが含まれており、いずれもアプリケーション機能へのエントリ・ポイントになっています。

図13-24 バインドなしタスク・フローのダイアグラム

次の場合、バインドなしタスク・フローを使用することを検討してください。

- タスク・フローを別のタスク・フローからコールする必要がない。

- MAF AMXアプリケーション機能に複数のエントリ・ポイントがある。

- タスク・フローで最初に実行するアクティビティ(デフォルト・アクティビティ)を特に指定する必要がない。

バインドなしタスク・フローは、バインド・タスク・フローをコールできますが、別のタスク・フローからコールできません。

13.2.13.2 バインド・タスク・フロー

デフォルトでは、バインド・タスク・フローのソース・ファイルのファイル名はIDEによって提案されます(「タスク・フローの作成方法」を参照)。実行するタスクの目的を表すようにこのファイル名を変更できます。

バインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそのバインド・タスク・フローからも次々にコールできます。コールに深さ制限はありません。

図13-25に、MAF AMXアプリケーション機能からのバインド・タスク・フローのダイアグラムを示します。

図13-25 バインド・タスク・フローのダイアグラム

バインド・タスク・フローを作成する理由は次のとおりです。

- バインド・タスク・フローでは、常にバインド・タスク・フローの開始直後に実行する必要のある単一エントリ・ポイントとなる、デフォルト・アクティビティを指定します。

- これは、同一または別のMAF AMXアプリケーション機能内で再利用可能です。

- バインド・タスク・フロー内で使用するマネージドBeanは、ページ・フロー・スコープで指定できるため、残りのMAF AMXアプリケーション機能からは分離されます。これらのマネージドBean(およびページ・フロー・スコープ)は、タスク・フローが完了した際に自動的に解放されます。

次に、バインド・タスク・フローの主な特性のサマリーを示します。

- 適切に定義された境界: バインド・タスク・フローは、プライベート制御フロー・ルール、アクティビティおよびマネージドBeanの独自のセットで構成されます。コール元は、バインド・タスク・フロー境界内におけるページ名、メソッド・コール、子バインド・タスク・フロー、マネージドBean、制御フロー・ルールの内部知識を必要としません。データ・コントロールはタスク・フロー間で共有できます。

- 単一のエントリ・ポイント: バインド・タスク・フローには、タスク・フロー内の他のすべてのアクティビティの前に実行されるデフォルト・アクティビティである、単一のエントリ・ポイントがあります。

- ページ・フロー・メモリー・スコープ: バインド・タスク・フロー内のアクティビティ間でデータを受け渡すためのメモリー・スコープとしてページ・フロー・スコープを指定できます。ページ・フロー・スコープは、バインド・タスク・フローの各インスタンスに対する一意の記憶域を定義します。その存続期間はバインド・タスク・フローであり、requestスコープより長く、sessionスコープより短くなっています。

- 指定可能: バインド・タスク・フローにアクセスするには、バインド・タスク・フローのXMLソース・ファイルに記述されている一意の識別子とXMLソース・ファイルのファイル名を指定します。

- 再利用可能: アクティビティ・グループ全体を単一のエンティティ、つまりバインド・タスク・フローとして指定し、そのバインド・タスク・フローをMAFアプリケーション内の別のMAF AMXアプリケーション機能で再利用できます。
また、既存のバインド・タスク・フローは、コールすることで再利用できます。

さらに、タスク・フロー・テンプレートを使用して、様々なバインド・タスク・フローで再利用するための共通の動作を取得できます。

- パラメータおよび戻り値: コール元は、入力パラメータをバインド・タスク・フローに渡し、そこから戻り値を受け取ることができます(「バインド・タスク・フローへのパラメータ渡し」および「バインド・タスク・フローの戻り値の構成」を参照)。
また、バインド・タスク・フロー間でデータ・コントロールを共有できます。

- メタデータのオンデマンド・ロード: バインド・タスク・フロー・メタデータは、バインド・タスク・フローの開始時にオンデマンドでロードされます。

13.2.13.3 タスク・フローのパラメータの使用

入力パラメータを受け取り、パラメータ値を戻すタスク・フローの機能によって、タスク・フローのデータを操作できる他、タスク・フロー間でデータを共有できます。この機能を使用して、MAF AMXアプリケーション機能でのタスク・フローの再利用を最適化できます。

図13-26に、pageFlowスコープ内のユーザーに関する情報を保持する入力パラメータ定義を指定するタスク・フローを示します。

図13-26 タスク・フローの入力パラメータ

タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールする場合、標準EL式を使用してパラメータ値を指定できます。たとえば、次のEL式の構文を使用してパラメータを指定できます。

- #{bindings.bindingId.inputValue}

- #{CustomerBean.zipCode}

inputValueをEL式に追加することで、実際のバインディング・オブジェクトではなく、バインディングの値をパラメータに確実に割り当てられます。

13.2.13.3.1 バインド・タスク・フローへのパラメータ渡し

コール先のバインド・タスク・フローは、コール元のタスク・フローまたはタスク・フロー・バインディングから入力パラメータを受け取ることができます。

バインド・タスク・フローに入力パラメータを渡すには、次のうちの1つまたは複数を指定します。

- コール元のタスク・フローでのタスク・フロー・コール・アクティビティの入力パラメータ: 入力パラメータによって、パラメータ値を格納するコール元のタスク・フローの場所が指定されます。

- コール元のバインド・タスク・フローの入力パラメータ定義: 入力パラメータ定義によって、実行時にコール先のバインド・タスク・フローがパラメータ値を取得できる場所が指定されます。

コール元のタスク・フローにあるタスク・フロー・コール・アクティビティで定義する入力パラメータおよびコール先のバインド・タスク・フローの入力パラメータ定義と同じ名前を指定します。これを行うことで、コール先のバインド・タスク・フローに入力パラメータ値をマップできます。

入力パラメータの値を参照するEL式を指定しない場合は、valueのEL式のデフォルト値を実行時に次のように設定します。

#{pageFlowScope.parmName}

ここで、parmNameは、入力パラメータ名に入力した値です。

コール先のバインド・タスク・フローの入力パラメータ定義では、必要に応じて入力パラメータを指定できます。入力パラメータが実行時または設計時に値を受け取らない場合、タスク・フローは、そのタスク・フローを含むMAFアプリケーションのログ・ファイル内に警告を生成します。必要に応じて指定しない入力パラメータは、タスク・フロー・コール・アクティビティの作成時に無視できます。

タスク・フロー・コール・アクティビティを使用してタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティの入力パラメータを参照渡しまたは値渡しにできます(「タスク・フロー・コール・アクティビティでの入力パラメータの指定」を参照)。デフォルトでは、プリミティブ・タイプ(int、long、booleanなど)が値渡し(pass-by-value)されます。

コール先のタスク・フローは、終了時にコール元のタスク・フローに値を戻すことができます。「バインド・タスク・フローの戻り値の構成」を参照してください。

入力パラメータをバインド・タスク・フローに渡す場合、コール元のタスク・フローとコール先のタスク・フローの両方で値を定義します。

始める前に:

- コール元およびコール先のタスク・フローを作成します(コール元のタスク・フローはバインドまたはバインドなしにすることができます)。コール先のタスク・フローはバインドにする必要があります。タスク・フローの作成の詳細は、「タスク・フローの作成方法」を参照してください。

- タスク・フロー・コール・アクティビティをコール元のタスク・フローに追加します。

図13-27には、ビュー・アクティビティがタスク・フロー・コール・アクティビティに制御を渡す例が示されています。

図13-27 コール元のタスク・フロー

入力パラメータをバインド・タスク・フローに渡すには:

1. エンド・ユーザーが実行時にバインド・タスク・フローにパラメータとして渡される値を入力する際に使用する入力コンポーネントを含むMAF AMXページを開きます。

注意:

開いたMAF AMXページは、コール元のタスク・フローにあるビュー・アクティビティによって参照される必要があります。

2. エンド・ユーザーが実行時に値を入力するMAF AMXページで入力テキスト・コンポーネントを選択します。

3. 「プロパティ」ウィンドウで、「共通」セクションを開いて、「値」フィールドに入力テキスト・コンポーネントの値を入力します。
値はEL式として(たとえば#{pageFlowScope.inputValue})、手動で、または式ビルダーを使用して指定できます。

4. 「アプリケーション」ウィンドウで、コールするタスク・フローをダブルクリックして開いた後、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

5. 「入力パラメータの定義」セクションで、「追加」( + )をクリックして新しいエントリを指定します(図13-26を参照)。

- 「名前」フィールドで、パラメータ名(inputParm1など)を入力します。

- 「値」フィールドで、パラメータ値を格納および参照するEL式(たとえば#{pageFlowScope.inputValue})を手動で、または式ビルダーを使用して入力します。

6. 「アプリケーション」ウィンドウで、コール先のバインド・タスク・フローを起動するタスク・フロー・コール・アクティビティを含むコール元タスク・フローをダブルクリックします。

7. 「アプリケーション」ウィンドウで、コール元のタスク・フローのダイアグラムにあるタスク・フロー・コール・アクティビティの最上部に、コール先のバインド・タスク・フローをドラッグ・アンド・ドロップします。これにより、バインド・タスク・フローに対するタスク・フローの参照が自動的に作成されます。図13-28に示すように、タスク・フロー参照には次のものが含まれます。

- バインド・タスク・フローのID (id): バインド・タスク・フローのtask-flow-definition要素の属性。

- IDを含むタスク・フローのソース・ファイルを指すドキュメント名。

図13-28 タスク・フローの参照

8. タスク・フロー・コール・アクティビティの「プロパティ」ウィンドウで、「パラメータ」セクションを開いて、「入力パラメータ」セクションを表示します。

- 入力パラメータを識別する名前を入力します(入力パラメータを定義済のタスク・フロー・コール・アクティビティの上にバインド・タスク・フローをドロップしたため、名前はすでに指定されています)。同じ入力パラメータ名を維持する必要があります。

- パラメータ値(たとえば#{pageFlowScope.param1})を入力します(タスク・フロー・コール・アクティビティの入力パラメータの値によって、コール元のタスク・フローがパラメータ値を格納する場所が指定されます)。コール先のタスク・フローの入力パラメータ定義の値は、渡された後にコール先のバインド・タスク・フロー内で使用する値が取得される場所を指定します。

実行時、コール先のタスク・フローは入力パラメータを使用できます。コール先のタスク・フローの入力パラメータ定義で値としてpageFlowScopeを指定したため、コール先のバインド・タスク・フローのどこでもパラメータ値を使用できます。たとえば、コール先のバインド・タスク・フローのビュー・アクティビティにパラメータ値を渡すことができます。

完了すると、選択した値に基づいて、コール元のタスク・フローとコール先のタスク・フローのソース・ファイルにエントリが書き込まれます。

次の例は、バインド・タスク・フローで指定された入力パラメータ定義を示しています。

<task-flow-definition id="sourceTaskflow">
...
<input-parameter-definition>
<name>inputParameter1</name>
<value>#{pageFlowScope.parmValue1}</value>
<class>java.lang.String</class>
</input-parameter-definition>
...
</task-flow-definition>

次の例は、前の例に示したバインド・タスク・フローをコールするタスク・フロー・コール・アクティビティの入力パラメータ・メタデータを示しています。

<task-flow-call id="taskFlowCall1">
...
<input-parameter>
<name>inputParameter1</name>
<value>#{pageFlowScope.newCustomer}</value>
<pass-by-value/>
</input-parameter>
...
</task-flow-call>

実行時に、タスク・フロー・コール・アクティビティはバインド・タスク・フローをコールして、そのvalue要素で指定された値を渡します。

13.2.13.3.2 バインド・タスク・フローの戻り値の構成

コール先のタスク・フローにある戻り値の定義を構成し、実行時に戻り値を取得するコール元のタスク・フローのタスク・フロー・コール・アクティビティにパラメータを追加します。

始める前に:

バインド・タスク・フローまたはバインドなしタスク・フローを(コール元のタスク・フローに対して)作成し、バインド・タスク・フローを(コール先のタスク・フローに対して)作成します。「タスク・フローの作成方法」を参照してください。

コール先のバインド・タスク・フローの戻り値を構成するには:

1. 「アプリケーション」ウィンドウで、コールするタスク・フローをダブルクリックして開いた後、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

2. 「戻り値の定義」セクションで、「追加」( + )をクリックして戻り値を指定します(図13-26を参照)。

- 「名前」フィールドで、戻り値を識別する名前(たとえばreturnValue1)を入力します。

- 「クラス」フィールドで、戻り値のデータ型を定義するJavaクラスを入力します。デフォルト値はjava.lang.Stringです。

- 「値」フィールドで、戻り値を読み取る場所を指定するEL式(たとえば#{pageFlowScope.ReturnValueDefinition})を手動で、または式ビルダーを使用して入力します。

3. 「アプリケーション」ウィンドウで、コール元のタスク・フローをダブルクリックします。

4. ダイアグラム・ビューでタスク・フロー・ページを開いた状態で、「コンポーネント」ウィンドウから「コンポーネント」→「アクティビティ」を選択し、タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

5. タスク・フロー・アクティビティの「プロパティ」ウィンドウで、「パラメータ」セクションを開いて、「戻り値」エントリの「追加」( + )をクリックし、戻り値を定義する次の値を追加します。

- 戻り値を識別する名前(たとえばreturnValue1)。これは、手順2で戻り値の定義を定義したときに「名前」フィールドに入力した値と一致している必要があります。

- 戻り値を格納する場所を指定するEL式で表した値(たとえば#{pageFlowScope.ReturnValueDefinition})。

完了すると、構成したコール元のタスク・フローのソース・ファイルにエントリが書き込まれます。

次の例では、コール元のタスク・フローのソース・ファイルに対してJDeveloperで記述したサンプル・エントリを示しています。

<task-flow-call id="taskFlowCall1">
<return-value id="__3">
<name id="__4">returnValue1</name>
<value id="__2">#{pageFlowScope.ReturnValueDefinition}</value>
</return-value>
</task-flow-call>

次の例では、コール先のタスク・フローのソース・ファイルに対してJDeveloperで記述したサンプル・エントリを示しています。

<return-value-definition id="__2">
<name id="__3">returnValue1</name>
<value>#{pageFlowScope.ReturnValueDefinition}/</value>
<class>java.lang.String</class>
</return-value-definition>

実行時に、コール先のタスク・フローが値を返します。この構成の場合は、コール元のタスク・フローにあるタスク・フロー・コール・アクティビティがその値を取得します。

13.3 ビューの作成

データ・コントロールを追加し、コンポーネントをMAF AMXページにドラッグ・アンド・ドロップすることで、ビューを作成できます。

MAF AMXビューの作成は、次のことから開始できます。

- MAF AMXページ構造の理解(「MAF AMXページ構造の解釈」を参照)

- MAF AMXページの編集とプレビュー(「UIエディタの使用方法」を参照)

- MAF AMXページへのコンポーネントのドラッグ・アンド・ドロップ(「MAF AMXページにUIコンポーネントを追加する方法」を参照)

- ビューへのデータ・コントロールの追加(「MAF AMXページへのデータ・コントロールの追加方法」を参照)

13.3.1 MAF AMXページの使用方法

MAF AMXページは、構造がページのプレゼンテーションと機能を定義している階層化要素から構成されるXMLファイルで表現されています。

13.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>

データ視覚化コンポーネント(「データ視覚化の指定」を参照)を除き、UI要素は<amx>名前空間の下で宣言されます。

「MAF AMXページの作成時に行われる処理」を参照してください。

13.3.1.2 MAF AMXページの作成

MAF AMXファイルは、MAFアプリケーションのビュー・コントローラ・プロジェクトに含まれています。これらのファイルは、「MAF AMXページの作成」ダイアログを使用して作成します。

MAFでは、MAF AMXページの作成方法がこれ以外に2通りあります。

- 「新規ギャラリ」から

- 既存のタスク・フローから

始める前に:

MAF AMXページを作成するには、MAFアプリケーションにビュー・コントローラ・プロジェクト・ファイルが含まれている必要があります(「MAFアプリケーション開発のスタート・ガイド」を参照)。

「新規ギャラリ」からMAF AMXページを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」の順に選択します(図13-29を参照)。「OK」をクリックします。

図13-29 MAF AMXページの作成

3. 図13-30に示すように、「MAF AMXページの作成」ダイアログで、新しいファイルの名前および(必要な場合は)場所を入力します。

4. オプションで、ページ・レイアウトの一部としてどのファセットを新しいMAF AMXページに含めるかを選択することもできます。

- ヘッダー

- プライマリ

- セカンダリ

- フッター

詳細は、「MAF AMXページの作成時に行われる処理」および「ファセット・コンポーネントの使用方法」を参照してください。

注意:

ファセットを選択または選択解除すると、変更されたページの外観を反映するよう、ページを表すイメージは動的に変わります。

図13-30 「MAF AMXページの作成」ダイアログ

注意:

ファセットの選択はMAFによって保持され、それ以降に「MAF AMXページの作成」ダイアログが開かれるたびにその選択が適用されます。

5. 新しいページのためのページ・レイアウトを選択します。「クイック・スタート・レイアウト」では、すばやく簡単に正しくレイアウトを構築するための事前定義済のコンポーネントが使用されます。使用するページ・レイアウトのタイプを選択します(「基本」、「分割」など)。「コンテンツ・レイアウト」内のオプションのリストは、「ページ・レイアウト」選択内容に基づいて適切なオプションが表示されるようフィルタされます。

6. 「MAF AMXページの作成」ダイアログで、「OK」をクリックします。

タスク・フローのビュー・コンポーネントからMAF AMXページを作成するには:

1. ダイアグラマでタスク・フロー・ファイルを開きます(図13-7、「タスク・フローの作成方法」および「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)

2. タスク・フローのビュー・コンポーネントをダブルクリックして、「MAF AMXページの作成」ダイアログを開き、新しいファイルの名前と必要に応じて場所を入力します。「OK」をクリックします。

13.3.1.3 MAF AMXページの作成時に行われる処理

「MAF AMXページの作成」ダイアログを使用してMAF AMXページを作成すると、JDeveloperによって物理ファイルが作成されて、ビュー・コントローラ・プロジェクトのWeb Contentディレクトリに追加されます。

図13-31に示す「アプリケーション」ウィンドウでは、「Webコンテンツ」ノードに、新たに作成されたdepartment.amxというMAF AMXファイルが含まれています。

図13-31 「アプリケーション」ウィンドウのMAF AMXファイル

JDeveloperは、コンポーネント・ライブラリをインポートし、ページを表示するために必要なコードの追加も行います。このコードは、図13-31に示す「ソース」エディタに表示されます。

図13-33に、ページの作成時に「MAF AMXページの作成」ダイアログの「ページ・ファセット」セクションにリストされたすべてのファセット・タイプを選択した場合に(図13-32を参照)、「プレビュー」ペインおよび生成されたMAF AMXコードがどのようになるかを示します。

図13-32 すべてのファセットが選択された「MAF AMXページの作成」ページ

図13-33 すべてのファセットが含まれるMAF AMXページ

すべてのファセットを選択して作成したページ(図13-32および図13-33を参照)では、次の点に注意してください。

- ヘッダーは出力テキスト・コンポーネントで作成されます。これはこのコンポーネントが通常ページ・タイトルに使用されるためです。

- プライマリおよびセカンダリのアクションは、ボタン・コンポーネントで作成されます。これは、これが通常のパターンであるためです。

- フッターの場合、1つだけ群を抜いているパターンはないため、デフォルトでは出力テキスト・コンポーネントで作成されます。これは、このコンポーネントがいくつかのパターンで使用されており、JDeveloperが監査違反のある初期コードを生成することを回避できるためです。

- ヘッダー・ファセットを追加せずにプライマリ・アクションまたはセカンダリ・アクションのいずれかを追加しても、ヘッダー・セクションは「MAF AMXページの作成」ダイアログの「ページ・ファセット」セクションに表示されます。

図13-34に、いずれのファセットも選択していない「MAF AMXページの作成」ダイアログの「ページ・ファセット」セクションを示し、図13-35に、「プレビュー」ペインおよび生成されたMAF AMXコードを示します。

図13-34 ファセットが選択されていないMAF AMXページの作成

図13-35 ファセットを含まないMAF AMXページ

13.3.1.4 UIエディタの使用方法

最初にJDeveloperに表示されるとき、ページは「ソース」エディタに表示されます。WYSIWYG環境でページを表示するには、「プレビュー」ペイン(「プレビュー」タブをクリックしてアクセスします)を使用します。

図13-36に、新たに作成されたdepartment.amxというMAF AMXページに対して選択された「プレビュー」タブを示します。まだMAF AMX UIコンポーネントやデータ・コントロールが移入されていないため、このページは空白です。

図13-36 新たに作成されたページの「プレビュー」ペイン

図13-36に示す「プレビュー」ペインのツールバーを使用すると、次のことができます。

- 「ページのリフレッシュ」をクリックすると、MAF AMXページの表示をリフレッシュできます。

- 「ページのロードを中止」をクリックすると、ページのロードを中止できます。

- ドロップダウン・リストから別のフォーム・ファクタを選択すると、ページのフォーム・ファクタを変更できます。フォーム・ファクタの詳細は、『Oracle Mobile Application Frameworkのインストール』のフォーム・ファクタに応じた開発環境の構成に関する項を参照してください。

- ドロップダウン・リストから別のパーセント値を選択すると、表示のスケーリングを変更できます。モバイル・デバイスは様々なサイズおよび密度で表示されるため、「プレビュー」ペインでは、MAF AMXページでのスケーリングの効果を確認できます。

注意:

スケーリングは縦と横の両方のモードで使用できます。

- 「縦向きの表示」または「横向きの表示」を選択することにより、表示の向きをそれぞれ横または縦に変更できます。

- 使用可能なアプリケーション機能のドロップダウン・リストから、MAF AMXページの機能コンテンツを選択します。デフォルトでは、「機能コンテンツが選択されていません」が表示されます。

ソース・エディタでページのソースを表示するには、図13-31に示す「ソース」タブをクリックします。JDeveloperの左下部にある「構造」ウィンドウ(図13-31および図13-36を参照)には、ページが階層形式で表示されます。詳細は、「「プレビュー」の使用方法」を参照してください。

13.3.1.5 ページ定義ファイルへのアクセス

MAF AMXでは、MAF AMXページ定義にナビゲートできる、JDeveloperの「ページ定義に移動」機能がサポートされているため(図13-37および「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照)、ポップアップ・メニューを使用することで、バインディング情報をすばやく見つけて編集できます。

図13-37 「ページ定義に移動」を使用してアクセスしたページ定義ファイル

次の場所から「ページ定義に移動」オプションを含むポップアップ・メニューを起動できます。

- 「ソース」エディタ(図13-38)

図13-38 「ソース」エディタからの「ページ定義に移動」

- 「アプリケーション」ウィンドウ(図13-39)

図13-39 「アプリケーション」ウィンドウからの「ページ定義に移動」

- 「構造」ウィンドウ(図13-40)

図13-40 「構造」ペインからの「ページ定義に移動」

さらに、図13-41のように、メイン・メニューの「ツール」→「プリファレンス」の下で定義されている「ページ定義に移動」ショートカット・キーを使用して、ページ定義ファイルを開くこともできます。

図13-41 「プリファレンス」から「ページ定義」を開く

13.3.1.6 ページ・コンテンツの共有

MAF AMXページのコンテンツの共有を有効にできます。フラグメント(fragment)は、MAF AMXページ要素の再利用可能な部分(属性やファセットなど)をテンプレートで表されるコンテンツに挿入できるようにする動的な宣言コンポーネントです。アプリケーションの様々なページでFragmentテンプレートを再利用することで、アプリケーションのルック・アンド・フィールを標準化できます。

MAF AMXフラグメント・ファイル( .amxf)をMAF AMXページまたは別のフラグメント・ファイルにドラッグ・アンド・ドロップして、フラグメントへの参照を作成し、その属性を定義できます(「フラグメント・コンテンツの構成」を参照)。フラグメント・ファイルはプロジェクト内部に存在し、「アプリケーション」ウィンドウからドロップできます。

始める前に:

MAFアプリケーションにビュー・コントローラ・プロジェクトが含まれていることを確認してください。

ビュー・コントローラ・プロジェクトに、MAF AMXページも、ページの作成元のMAF AMXページ・タスク・フローも含まれない場合は、タスク・フロー・ダイアグラムで「表示」アイコンをダブルクリックするか、「新規ギャラリ」から「クライアント層」→「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」を選択することにより、「MAF AMXページの作成」ダイアログを起動できます(「MAF AMXページの作成」を参照)。

「新規ギャラリ」からフラグメントを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」 →「MAF AMXページ・フラグメント」の順に選択します(図13-42を参照)。「OK」をクリックします。

図13-42 新しいフラグメントの作成

3. 図13-43に示すように、「MAF AMXページ・フラグメントの作成」ダイアログに新しいフラグメントのファイル名と場所を入力します。「OK」をクリックします。

図13-43 「MAF AMXページ・フラグメントの作成」ダイアログ

ダイアログへの入力が完了すると、新しく作成したファイルがJDeveloperの「ソース」エディタ内に開きます(図13-44を参照)。

図13-44 フラグメント・ファイル

4. 「構造」ウィンドウで「フラグメント」を右クリックし、「フラグメントの中に挿入」を選択します。新しいフラグメントに移入する要素として、「属性」、属性リスト、「説明」、「ファセット」または「ポップアップ」を選択します(図5-45を参照)。

図13-45 フラグメントへの移入

5. 引き続き、「構造」ビューでフラグメントの子を右クリックして適切な値を選択することにより、フラグメントの「属性」および他の子を定義します(図13-46を参照)。

図13-46 フラグメントの属性の定義

フラグメントを定義するには、「コンポーネント」ウィンドウで「MAF AMXフラグメント」を選択して、その要素をMAF AMXフラグメント・ファイルにドラッグ・アンド・ドロップする方法もあります(図13-47を参照)。

図13-47 フラグメント要素のドラッグ・アンド・ドロップ

次の例は、fragment1.amxfという名前のMAF AMXフラグメント・ファイルを示しています。

<amx:fragmentDef
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment" id="f1">
<description id="d1">Description of the fragment</description>
<facet id="f2">
<description id="d4">Description of the facet</description>
<facet-name id="f3">facet1</facet-name>
</facet>
<attribute id="a1">
<description id="d2">Description of an attribute</description>
<attribute-name id="a2">text</attribute-name>
<attribute-type id="at1">String</attribute-type>
<default-value id="d3">defaultValue</default-value>
</attribute>
</fragment>
<amx:panelGroupLayout id="pgl1">
<amx:facetRef facetName="facet1" id="fr1"/>
<amx:outputText value="#{text}" id="ot1"/>
</amx:panelGroupLayout>
</amx:fragmentDef>

MAF AMXページにフラグメントのコンテンツを含めるには、フラグメント・コンポーネントを作成して(「フラグメント・コンポーネントの使用方法」を参照)、選択したフラグメント・ファイルにそのsrc属性を設定します。次の例は、MAF AMXページに追加されたfragment要素を示しています。この要素は、そのページ・コンテンツとしてfragment1.amxfを指します。同時に、ファセット定義MAF AMXコンポーネントに対応するfacetRef要素は、そのfacet (MAF AMX Facetコンポーネント)としてfacet1を指します。facetRef要素は、.amxfファイルのfragmetDef内でのみ指定できます。MAF AMXのattribute要素を子として指定することで、属性をfacetRefに渡すことができ、これにより、attributeの値を介してフラグメントからファセットにEL変数を渡すことができます。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:panelGroupLayout layout="vertical"
id="itemPgl"
styleClass="amx-style-groupbox">
<amx:fragment id="f1"
src="/simpleFragment.amxf"
<amx:attribute id="a1"
name="text"
value="defaultValue" />
<amx:facet name="facet">
<amx:outputText id="ot5" value="Fragment"/>
</amx:facet>
</amx:fragment>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

フラグメントは、その属性を介してすべての情報を受け取ります。個々の属性を定義する以外に、フラグメントにリストとして渡す一連の属性を定義でき、それらをフラグメント定義で繰り返し使用できます。「フラグメントへの属性リストおよびメタデータの受渡し」を参照してください。

注意:

フラグメント・ファイル(.amxf)内で使用されるEL式は検証されません。

フラグメントは次のものをサポートしています。

- 埋込みポップアップ(「ポップアップ・コンポーネントの使用方法」を参照)。

- 1つ以上の別の親ページまたはフラグメントに配置できる再利用可能なユーザー・インタフェースこれにより、バインドなしで他のコンポーネントから成るコンポーネントを作成できます。

- 独自のファセットの定義。これにより、ヘッダー・ファセット、サマリー・ファセットおよび詳細ファセットをファセットごとに独自のスタイル・クラスとルック・アンド・フィールを設定しながら定義するレイアウト・コンポーネントなどのコンポーネントを作成できます。

- 属性とコレクションの両方を備えたデータ・モデル。

MAFサンプル・アプリケーション(FragmentDemoおよびCompGallery)によって、フラグメントの作成方法と使用方法を示します。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリのPublicSamples.zipファイル内にあります。

13.3.1.6.1 フラグメント・コンテンツの構成

MAF AMXフラグメント・ファイル(.amxf)をMAF AMXページまたは別のフラグメント・ファイルにドラッグ・アンド・ドロップすると、「フラグメント・コンテンツの構成」ダイアログ(図13-48を参照)が表示されます。このダイアログが表示されると、フラグメントの直接の子として定義されたすべてのフラグメント属性を指定できます。

注意:

「フラグメント・コンテンツの構成」ダイアログでは、ファセット・コンポーネント、ポップアップ・コンポーネント、属性リストおよびそのアーティファクトは使用できません。

図13-48 「フラグメント・コンテンツの構成」ダイアログ

図13-49は、MAF AMXフラグメント・ファイル(そのコンテンツは次の例を参照)をMAF AMXファイルにドラッグ・アンド・ドロップしたときに表示される「フラグメント・コンテンツの構成」ダイアログを示しています。

<amx:fragmentDef
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment" id="f1">
<description id="d1">Description of the fragment</description>
<facet id="f2">
<description id="d4">Description of the facet</description>
<facet-name id="f3">facet1</facet-name>
</facet>
<attribute id="a1">
<description id="d2">Description of an attribute</description>
<attribute-name id="a2">text</attribute-name>
<attribute-type id="at1">String</attribute-type>
<default-value id="d3">defaultValue</default-value>
</attribute>
</fragment>
<amx:panelGroupLayout id="pgl1">
<amx:facetRef facetName="facet1" id="fr1"/>
<amx:outputText value="#{text}" id="ot1"/>
</amx:panelGroupLayout>
</amx:fragmentDef>

図13-49 値が表示された「フラグメント・コンテンツの構成」ダイアログ

ダイアログに入力する際は、次の点を考慮してください。

- フラグメントで必須として定義された属性を構成する場合は、属性名の末尾にアスタリスク(*)が表示されます。

- 必須の属性値をすべて定義するまで、ダイアログの「OK」ボタンは無効です。

- フラグメント属性のデフォルト値が指定されており、同時にrequiredプロパティが定義されていてtrueに設定されている場合、この属性は必須として扱われません(デフォルト値が優先されます)。この場合は、次のようになります。

- フラグメントに監査警告が表示されます。

- 「フラグメント・コンテンツの構成」ダイアログで、属性の名前にアスタリスクが追加されず、この属性は必須として扱われません。

- 「タイプ」列に、フラグメントからのattribute-type要素の値が表示されます。これは、(Javaクラスとは異なり)属性タイプの説明として使用されます。

注意:

attribute-typeはフラグメントで必須要素ですが、その値を定義しなかった場合は、ドロップするフラグメントで未指定として表示されることがあります。この場合、ダイアログにデフォルト値として「文字列」が表示されます。

- 「値」列では、フラグメントの属性に渡す値を指定できます。値を入力するには、タイピングするか、省略記号(…)をクリックしてELビルダーを起動し、EL式を指定します。フラグメント内の特定の属性にdefault要素が存在する場合、このデフォルト値はその属性の「値」列で指定されています。デフォルト値はオーバーライドできます。

- フラグメント内にこの属性に対するdescription要素が存在する場合、異なる属性の行を切り替えると、ダイアログの下部に「属性の説明」フィールドが表示されます。description要素が定義されていない場合、「属性の説明」フィールドは空白になります。

- 「フラグメント・コンテンツの構成」ダイアログを使用して属性の追加、削除または並替えを行うことはできません。

13.3.1.6.2 フラグメントへの属性リストおよびメタデータの受渡し

フラグメント属性を定義する場合、MAFでは次の操作を実行できます。

- 動的属性の受渡し

- 各属性とメタデータとの関連付け(「フラグメントへの属性リストおよびメタデータの受渡し」を参照)。

- フラグメント定義内の属性に対するループ処理

- 属性内での動的属性のネスト

- あるフラグメントから埋込みフラグメントへの動的属性の受渡し

表13-4には、属性のリストを渡すことを可能にする、MAF AMX fragmentの直接および間接の子要素がリストされています。

表13-4 フラグメントの属性関連の子要素

子属性名

説明

attributeList

フラグメントに渡す属性リストを定義します。MAF AMX fragment要素またはattributeSet要素の直接の子にすることができます。

親要素には、子attributeList要素をいくつでも定義できます。

attributeList要素は、そのref属性を介して別のattributeListから参照できます。

異なるフラグメント間で属性リストを参照渡しできますが、この場合は、両方の属性リストに同じメタデータが含まれている必要があります。

attributeSet

MAF AMX attributeListの子として指定できます。

MAF AMX attributeListIteratorの繰り返し中に使用される属性のセットを定義します。配列内の1つのアイテムとして考えることができます。

親attributeList要素には、子attributeList要素をいくつでも定義できます。

attributeListIterator

MAF AMX attributeListを使用します。スタンプ設定に関してMAF AMXイテレータと同様の動作をしますが、属性の公開方法は異なり、そのname属性によってイテレータはattributeListに結合されます。

あるattributeListIteratorが別のattributeListIterator内でネストされている場合、nameは(attributeListIteratorにより現在処理中のattributeSetの子である) attributeListを指している必要があります。

繰り返しの間、定義された属性名がEL変数として公開されます。コール元から属性が提供されていない場合や、属性にデフォルト値がない場合は、値adf.mf.api.OptionalFragmentArgumentがEL変数として使用されます。この条件は、空のELキーワードを使用することによりテストできます(例: rendered="#{not (empty myAttribute)}")。

属性およびその値の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

次の例は、属性リストをMAF AMXフラグメントに渡す基本的な方法を示しています。

<amx:fragment src="something.amxf">
<amx:attributeList name="attributeToPass" ref="nameOfAnOuterAttributeList" />
</amx:fragment>

次の例は、MAF AMXファイルで定義された子attributeListを持つfragment要素を示しています。

<amx:fragment src="summaryView.amxf">
<amx:attributeList name="attrs">
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.firstName}"/>
<amx:attribute name="displayType" value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.lastName}"/>
<amx:attribute name="displayType" value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.homePhone}"/>
<amx:attribute name="displayType" value="phone" />
</amx:attributeSet>
</amx:attributeList>
</amx:fragment>

次の例は、MAF AMXファイルのfragment要素内で定義されているネストされたattributeList要素を示しています。

<amx:fragment src="summaryView.amxf">
<amx:attributeList name="attrs">
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.firstName}"/>
<amx:attribute name="displayType" value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.lastName}"/>
<amx:attribute name="displayType" value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute" value="#{bindings.homePhone}"/>
<amx:attribute name="displayType" value="phone" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attributeList name="subAttributes">
<amx:attributeSet>
<amx:attribute name="attribute"
value="#{bindings.spouseFirstName}"/>
<amx:attribute name="displayType"
value="string" />
</amx:attributeSet>
<amx:attributeSet>
<amx:attribute name="attribute"
value="#{bindings.spouseLastName}"/>
<amx:attribute name="displayType"
value="string" />
</amx:attributeSet>
</amx:attributeList>
<amx:attribute name="label" value="Spouse"/>
</amx:attributeSet>
</amx:attributeList>
</amx:fragment>

次の例は、定義済の属性リスト・コンポーネントがフラグメント定義内でどのように使用されるかを示しています。amxf:attribute-listタグは、属性リストのメタデータを定義しています。このタグは、amxf:fragmentまたは別のamxf:attribute-listタグの子として宣言する必要があり、その有効な子タグはamxf:name、amxf:description、amxf:attribute-listおよびamxf:attributeです。子nameは必須であり、現在のXMLノード内で一意である必要があります。nameを同じレベルで宣言されているamxf:attributeと同一にすることもできますが、このようなネーミング慣例はお薦めしません。

<amx:fragmentDef
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment">
<attribute-list>
<name>attributes</name>
<attribute>
<attribute-name>attribute</attribute-name>
</attribute>
<attribute>
<attribute-name>displayType</attribute-name>
</attribute>
<attribute>
<attribute-name>label</attribute-name>
</attribute>
<attribute-list>
<name>subAttributes</name>
<attribute>
<attribute-name>attribute</attribute-name>
</attribute>
<attribute>
<attribute-name>displayType</attribute-name>
</attribute>
</attribute-list>
</attribute-list>
</fragment>
...
<amx:attributeListIterator name="attributes">
<amx:panelLabelAndMessage label="#{attribute.hints.label}"
id="plam1"
rendered="#{not (empty attribute)}">
<amx:outputText value="#{attribute.inputValue}" id="ot1"/>
</amx:panelLabelAndMessage>
<amx:outputText value="#{label}"
id="ot2"
rendered="#{not (empty label)}"/>
<amx:attributeListIterator name="subAttributes"
rendered="#{not (empty subAttributes)}">
<amx:panelLabelAndMessage label="#{attribute.hints.label}"
id="plam2"
rendered="#{not (empty attribute)}">
<amx:outputText value="#{attribute.inputValue}" id="ot3"/>
</amx:panelLabelAndMessage>
</amx:attributeListIterator>
</amx:attributeListIterator>
...
</amx:fragmentDef>

attribute-list、attribute-setおよびattributeの各タグは、fragmentノード内で次のものを定義するために使用できます。

- 使用できる属性リスト・コンポーネント

- フラグメントのコール元のページを検証するために必要な情報

13.3.2 MAF AMXページにUIコンポーネントを追加する方法

MAF AMXページの作成後は、ページへのMAF AMX UIコンポーネントの追加を開始できます。

「コンポーネント」ウィンドウを使用して、MAF AMXコンポーネントおよびMAF AMXデータ視覚化コンポーネントをページにドラッグ・アンド・ドロップできます。コンポーネントを追加すると、必要な宣言的ページ・コードが追加され、各コンポーネント属性に特定の値が設定されます。

「コンポーネント」ウィンドウには、MAF AMXコンポーネントがカテゴリ別に表示されます(図13-50を参照)。

- 一般コントロール

- テキストおよび選択

- データ・ビュー

- レイアウト。次のサブカテゴリがあります。

- 対話型コンテナおよびヘッダー

- セカンダリ・ウィンドウ

- コア構造

- 操作。次のサブカテゴリがあります。

- 動作

- リスナー

- バリデータおよびコンバータ

特定のコンポーネントの追加および使用については、「UIコンポーネントの作成と使用方法」を参照してください。

また、「コンポーネント」ウィンドウには、MAF AMXデータ視覚化コンポーネントもカテゴリ別に表示されます(図13-50を参照)。

- 共通: 次のサブカテゴリがあります。

- チャート

- ゲージ

- マップ

- その他

- 共有子タグ

- その他のタイプ固有の子タグ: 次のサブカテゴリがあります。

- チャート

- ゲージ

- NBox

- テーマ・マップ

- 時系列

- サンバーストおよびツリーマップ

始める前に:

MAFアプリケーションには、ビュー・コントローラ・プロジェクトが含まれている必要があり、このプロジェクトには、MAF AMXページまたはページの作成元のMAF AMXページのタスク・フローが含まれている場合と含まれていない場合があります。

「MAF AMXページの作成」で説明されているように、タスク・フロー・ダイアグラムで「表示」アイコンをダブルクリックするか、「新規ギャラリ」から「クライアント層」→「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」を選択することにより、「MAF AMXページの作成」ダイアログを起動できます。

UIコンポーネントをページに追加するには:

1. 「ソース」エディタでMAF AMXページを開きます(デフォルト)。

2. 図13-50に示すように、「コンポーネント」ウィンドウで、メニューを使用して「MAF AMX」を選択します。

ヒント:

「コンポーネント」ウィンドウが表示されていない場合は、JDeveloperのメイン・メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」はJDeveloperの右上部に表示されます。

図13-50 MAF AMXの「コンポーネント」ウィンドウ

3. 使用するコンポーネントを選択し、「ソース」エディタまたは「構造」ウィンドウにドラッグ・アンド・ドロップします。「プレビュー」ペインにコンポーネントをドロップすることはできません。

注意:

MAF AMXページを作成する際、UIコンポーネントは、「パネル・グループ・レイアウト」などのUIコンテナにのみドロップできます。

新たに追加されたコンポーネントを使用して、JDeveloperで「プレビュー」ペインのページが再描画されます。

あるいは、次のようにして、「構造」ウィンドウからUIコンポーネントおよびデータ視覚化コンポーネントを追加することもできます。

1. 「構造」ウィンドウで、別のコンポーネントを挿入するための開始ポイントとして使用する既存のコンポーネントを選択します。

2. 図13-51に示すように、選択したコンポーネントを右クリックして、「<コンポーネント>の前に挿入」、「<コンポーネント>の中に挿入」または「<コンポーネント>の後ろに挿入」のいずれかのオプションを選択します。

図13-51 「構造」ウィンドウからのコンポーネントの挿入

3. ポップアップ・メニューから、「MAF AMX」または「MAF AMXデータ視覚化」を選択します。

- 図13-52に示すように、「MAF AMX」を選択すると、「MAF AMXアイテムの挿入」ダイアログが開き、ページに追加するUIコンポーネントを選択できます。

図13-52 MAF AMXコンポーネントの挿入

- 図13-53に示すように、「MAF AMXデータ視覚化」を選択すると、「MAF AMXデータ視覚化アイテムの挿入」ダイアログが開き、ページに追加するデータ視覚化コンポーネントを選択できます。

図13-53 MAF AMXデータ視覚化コンポーネントの挿入

新たに追加されたコンポーネントを使用して、JDeveloperで「プレビュー」ペインのページが再描画されます。

13.3.2.1 「プレビュー」の使用方法

MAF AMXファイルを使用してユーザー・インタフェースを構築する際、JDeveloperの「プレビュー」では、iOSとAndroidの両方のプラットフォームに対してWYSIWYGサポートを提供します。図13-54に示すように、ビューを分割した状態で、MAF AMXコンポーネントをMAF AMXファイルに追加すると、コード・ビューは「ソース」エディタから、UIビューは「プレビュー」ペインから同時に確認できます。これにより、ソースを変更してすぐに、iOSとAndroidの両方のプラットフォームで、そのアプリケーションの変更されたルック・アンド・フィールを表示できます。

図13-54 デザイン・ビューとソース・ビューの分割

デザイン・ビューとソース・ビューを同時に確認できる以外に、複数のデザイン・ビューを同時に開いて使用し、それぞれを異なるプラットフォームおよび画面サイズに設定できます。様々なデバイスのデザイン・ビューの組合せを開くことで、様々なプラットフォームおよびフォーム・ファクタに対し、同時に、異なる向きでアプリケーションを開発できます。図13-55は、上段がiPhone、下段が75%のスケーリングのiPadの分割画面を示しています。「プレビュー」ペインは、JDeveloperのデフォルトの分割機能を使用して分割できます。

図13-55 複数のデザイン・ビュー

注意:

無効なMAF AMXファイルであっても、MAF AMXページはレンダリングされます。エラーはコンポーネントのエラー・アイコンで示されます。マウスをエラー・アイコンの上に移動すると、エラーの詳細を表示できます。

13.3.2.2 UIコンポーネントの構成

UIコンポーネントをページにドロップした後、「プロパティ」ウィンドウ(デフォルトではJDeveloperの右下部に表示)を使用して、各コンポーネントの属性値を設定できます。

ヒント:

「プロパティ」ウィンドウが表示されていない場合は、JDeveloperのメイン・メニューから「ウィンドウ」→「プロパティ」を選択します。

図13-56に、出力テキスト・コンポーネントの属性が表示された「プロパティ」ウィンドウを示します。

図13-56 「プロパティ」ウィンドウ

コンポーネント属性の設定手順:

1. 属性を設定するコンポーネントを選択します。「構造」ウィンドウでコンポーネントを選択するか、「ソース」エディタで直接そのタグを選択することができます。

2. 「プロパティ」ウィンドウで、設定する属性が含まれているセクションを開きます。

ヒント:

一部の属性は、複数のセクションに表示されます。あるセクションで値を入力または変更すると、他のセクションでもその値が変更されます。「プロパティ」ウィンドウの最上部の検索フィールドに属性名を入力して、属性を検索できます。

3. 「プロパティ」ウィンドウで、フィールドに値を直接入力するか、フィールドにリストがある場合はそのリストを使用して、値を選択します。フィールドの右にあるリストを使用して、値の設定に使用できるツールを含むポップアップを起動することもできます。これらのツールは、特定のプロパティ・エディタ(「編集」を選択して開く)または値のEL式の作成に使用できる式ビルダー(「式ビルダー」または該当する場合は「メソッド式ビルダー」を選択して開く)です。式ビルダーの使用の詳細は、「EL式の作成方法」を参照してください。

「プロパティ」ウィンドウを使用して属性値を設定または変更すると、入力された値に合致するように、属性のページ・ソースがJDeveloperで自動的に変更されます。

ヒント:

「ソース」エディタでページを直接編集することで、いつでも属性値を変更できます。「ソース」エディタにページを表示するには、ページの下部の「ソース」タブをクリックします。

13.3.2.3 要素識別子とその監査に関する必知事項

「コンポーネント」ウィンドウからコンポーネントをドロップするか、データ・コントロールをドラッグ・アンド・ドロップすることにより要素を追加すると、MAFによって一意の要素識別子(id)が生成され、自動的にMAF AMXページに挿入されます。これにより、同じページ内の類似したコンポーネントでもそれぞれを識別する、MAF AMXページ内の有効な識別子となります。

MAFは、次のことを行う識別子監査ユーティリティを提供しています。

- MAF AMXページにおける識別子の存在と一意性を確認する。

- 識別子が存在しない場合または一意でない場合、要素の必須id属性ごとにエラーが報告される。

- 自動修正により、識別子の問題が報告されると、要素の一意のidが生成される。

図13-57および図13-58に、「ソース」エディタと「構造」ペインの識別子エラー・レポートをそれぞれ示します。

図13-57 「ソース」エディタの要素識別子監査

図13-58 「構造」ペインの要素識別子監査

idに加え、監査ユーティリティでは「ポップアップ表示動作」操作のpopupIdおよびalignId属性がチェックされます(「ポップアップ・コンポーネントの使用方法」を参照)。

図13-59および図13-60に、「ソース」エディタの「ポップアップ表示動作」の「ポップアップID」属性と「位置合せID」属性のエラー・レポートをそれぞれ示します。

図13-59 「ソース」エディタのポップアップID属性監査

図13-60 「ソース」エディタの位置合せID属性監査

詳細は、『Oracle JDeveloperによるアプリケーションの開発』のJavaプロジェクトの監査とモニタリングに関する項を参照してください。

13.3.3 MAF AMXページへのデータ・コントロールの追加方法

MAF AMXページの作成後は、ページへのデータ・コントロールの追加を開始できます。

データ・コントロール要素を「データ・コントロール」ウィンドウからドラッグして「構造」ウィンドウまたは「ソース」エディタのいずれかにドロップすることで、MAF AMXビューでデータバインドされたUIコンポーネントを作成できます。「データ・コントロール」ウィンドウからこれらのいずれかの場所にアイテムをドラッグすると、ドロップしたアイテムに対して使用できるデフォルトのUIコンポーネントのポップアップ・メニューが表示されます。目的のUIコンポーネントを選択すると、そのコンポーネントがMAF AMXページに挿入されます。また、関連ページ定義ファイルにバインディング情報が作成されます。そのようなファイルが存在しない場合は、JDeveloperによって作成されます。MAFには、データ・コントロールのドロップ用のビジュアル・インジケータが用意されており、新しいデータ・コントロールの場所を知らせます。

注意:

データ・コントロールは、基礎となるXMLスキーマで許可された場所にのみドロップできます。

方法によっては、様々なタイプのデータ・コントロールをMAF AMXページの「構造」ウィンドウに挿入できます。

コレクションの属性をドロップすることにより、様々な入力および出力コンポーネントを作成できます。ページにデータ・コントロール操作をドロップすることにより、ボタンおよびリンク・コンポーネントも作成できます。

これらの各操作に対し、MAF AMXボタンにそれぞれのアクション・リスナーが追加されます。

データ・コントロールの属性および操作は、次の1つ以上のMAF AMX UIコンポーネントとしてドロップできます(「UIコンポーネントの作成と使用方法」を参照してください)。

- ボタン

- リンク

- 入力日

- ラベル付入力日

- 入力テキスト

- ラベル付入力テキスト

- 出力テキスト

- ラベル付出力テキスト

- イテレータ

- リスト・アイテム

- リスト・ビュー

- ブール・チェック・ボックスの選択

- ブール・スイッチの選択

- ボタンを1つ選択

- 選択肢を1つ選択

- ラジオ・ボタンを1つ選択

- チェック・ボックスを複数選択

- 選択肢を複数選択

- 日時の変換

- 数値の変換

- フォーム

- 読取り専用フォーム

- パラメータ・フォーム

次の日付および数値タイプがサポートされています。

- java.util.Date

- java.sql.Timestamp

- java.sql.Date

- java.sql.Time

- java.lang.Number

- java.lang.Integer

- java.lang.Long

- java.lang.Float

- java.lang.Double

JDeveloperでの「データ・コントロール」ウィンドウの使用方法の詳細は、「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。

13.3.3.1 属性のドラッグ・アンド・ドロップ

MAF AMXページにすでにパネル・フォーム・レイアウト・コンポーネントが含まれているか、すべてのフィールドを追加する必要がない場合は、データ・コントロールから個別の属性をドロップできます。属性タイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

13.3.3.1.1 日付

このカテゴリは、MAF入力日およびラベル付MAF入力日のコントロールを作成するためのオプションを提供します。図13-61に、属性を「データ・コントロール」ウィンドウからMAF AMXページのソース・エディタまたは「構造」ウィンドウにドラッグすると表示される日付コントロールを追加するためのポップアップ・メニューを示します。

図13-61 日付コントロールのポップアップ・メニュー

13.3.3.1.2 単一選択

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAFボタンを1つ選択

- MAF選択肢を1つ選択

- MAFラジオ・ボタンを1つ選択

- MAFブール・チェックボックスの選択

- MAFブール・スイッチの選択

図13-62に、属性を「データ・コントロール」ウィンドウからMAF AMXページの「ソース」エディタまたは「構造」ウィンドウにドラッグすると表示される選択コントロールを追加するためのポップアップ・メニューを示します。

図13-62 選択コントロールのポップアップ・メニュー

既存のMAF AMXページを使用している場合、「MAFボタンを1つ選択」オプションまたは「MAF選択肢を1つ選択」オプションを選択すると、適切な「リスト・バインディングの編集」ダイアログが表示されます(図13-63を参照)。新しいMAF AMXページにコントロールをドロップした場合には、かわりに「リスト・バインディングの編集」ダイアログが開かれます。「OK」をクリックすると、「リスト・バインディングの編集」が開かれます。

注意:

単一選択またはブール選択のコンポーネントとして任意のデータ・コントロール属性をドロップするたびに、それぞれ「リスト・バインディングの編集」または「Booleanバインディングの編集」ダイアログが表示されます。

図13-63 ボタンを1つ選択コントロールおよび選択肢を1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFラジオ・ボタンを1つ選択」オプションを選択すると、図13-64に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図13-64 ラジオ・ボタンを1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFブール・チェックボックスの選択」オプションまたは「MAFブール・スイッチの選択」オプションを選択すると、図13-65に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図13-65 ブール・チェック・ボックスおよびスイッチの選択コントロールの「リスト・バインディングの編集」ダイアログ

13.3.3.1.3 テキスト

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

図13-66に、属性を「データ・コントロール」ウィンドウからMAF AMXページの「ソース」エディタまたは「構造」ウィンドウにドラッグすると表示されるテキスト・コントロールを追加するためのポップアップ・メニューを示します。

図13-66 テキスト・コントロールのポップアップ・メニュー

13.3.3.2 操作のドラッグ・アンド・ドロップ

属性に加え、操作およびカスタム・メソッドもドラッグ・アンド・ドロップできます。操作やメソッドのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

13.3.3.2.1 操作

データ・コントロール操作のカテゴリです。次のオプションがあります(図13-67を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図13-67 操作のポップアップ・メニュー

注意:

操作またはメソッドを、リスト・ビュー・コントロールの子としてドロップすると、ポップアップ・メニューは表示されず、リスト・アイテムが自動的に作成されます。これは、リスト・ビュー・コントロールの直接の子としてドロップできる有効なコントロールが他にないためです。生成されるリスト・アイテムに対して、JDeveloperにより次のようなバインディングが作成されます。

<amx:listItem actionListener="#{bindings.getLocation.execute}"/>

13.3.3.2.2 メソッド

カスタム・メソッドのカテゴリです。次のオプションがあります(図13-68を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図13-68 メソッドのポップアップ・メニュー

「MAFパラメータ・フォーム」オプションでは、フォームに挿入するメソッドまたは操作の引数に加え、各引数に対してそれぞれのコントロールも選択できます(図13-69を参照)。

図13-69 「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:inputText id="it1"
value="#{bindings.empId.inputValue}"
label="#{bindings.empId.hints.label}" />
</amx:panelFormLayout>
<amx:commandButton id="cb1"
actionListener="#{bindings.ExecuteWithParams1.execute}"
text="ExecuteWithParams1"
disabled="#{!bindings.ExecuteWithParams1.enabled}"/>

生成されるバインディングの詳細は、「生成されるバインディングに関する必知事項」を参照してください。

次にMAFパラメータ・フォームでサポートされるコントロールのタイプを示します。

- MAF入力日

- ラベル付MAF入力日

- MAF入力テキスト

- ラベル付MAF入力テキスト

- ラベル付MAF出力テキスト

13.3.3.3 コレクションのドラッグ・アンド・ドロップ

MAF AMXページにコレクションをドラッグ・アンド・ドロップできます。コレクションのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

- 複数選択

- フォーム

- イテレータ

- リスト・ビュー

13.3.3.3.1 複数選択

このカテゴリは、複数選択コントロールを作成するためのオプションを提供します。このカテゴリでは次のコントロールが作成されます(図13-70を参照)。

- MAFチェックボックスを複数選択

- MAF選択肢を複数選択

図13-70 複数選択コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAF選択肢を複数選択」または「MAFチェックボックスを複数選択」を選択すると、「リスト・バインディングの編集」ダイアログが表示されます(図13-71を参照)。

図13-71 複数選択コントロールの「リスト・バインディングの編集」ダイアログ

13.3.3.3.2 フォーム

このカテゴリは、MAF AMXパネル・フォーム・コントロールを作成するために使用されます。

「フォーム」カテゴリでは次のコントロールが作成されます(図13-72を参照)。

- MAFフォーム

- MAF読取り専用フォーム

図13-72 フォーム・コントロールのポップアップ・メニュー

作成するフォームのタイプとして「MAFフォーム」を選択すると、JDeveloperウィザードが起動され、ここで、フォームに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(図13-73を参照)。

図13-73 MAFフォームの「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:panelLabelAndMessage id="plam1" label="#{bindings.jobId.hints.label}">
<amx:outputText id="ot1" value="#{bindings.jobId.inputValue}" />
</amx:panelLabelAndMessage>
<amx:inputText id="it4"
value="#{bindings.title.inputValue}"
label="#{bindings.title.hints.label}" />
<amx:inputText id="it5"
value="#{bindings.minSalary.inputValue}"
simple="true" />
<amx:inputText id="it3"
value="#{bindings.maxSalary.inputValue}"
simple="true" />
</amx:panelFormLayout>

生成されるバインディングの詳細は、「生成されるバインディングに関する必知事項」を参照してください。

次にMAFフォームでサポートされるコントロールを示します。

- MAF入力日

- ラベル付MAF入力日

- MAF入力テキスト

- ラベル付MAF入力テキスト

- ラベル付MAF出力テキスト

注意:

MAF出力テキストは、MAFスキーマで定義される有効なパネル・フォーム・レイアウトの子要素ではないため、サポートされていません。

作成するフォームのタイプとして「MAF読取り専用フォーム」を選択すると、JDeveloperウィザードが起動され、ここで、フォームに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(図13-74を参照)。

図13-74 MAF読取り専用フォームの「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:panelLabelAndMessage id="plam4"
label="#{bindings.jobId.hints.label}">
<amx:outputText id="ot4" value="#{bindings.jobId.inputValue}" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plam1"
label="#{bindings.title.hints.label}">
<amx:outputText id="ot1" value="#{bindings.title.inputValue}" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plam3"
label="#{bindings.minSalary.hints.label}">
<amx:outputText id="ot3" value="#{bindings.minSalary.inputValue}" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage  id="plam2"                               label="#{bindings.maxSalary.hints.label}">
<amx:outputText id="ot2" value="#{bindings.maxSalary.inputValue}" />
</amx:panelLabelAndMessage>
</amx:panelFormLayout>

生成されるバインディングの詳細は、「生成されるバインディングに関する必知事項」を参照してください。

MAF読取り専用フォームは、ラベル付MAF出力テキストのみをサポートします。

13.3.3.3.3 イテレータ

これは、子コンポーネントのあるMAF AMXイテレータを作成するためのオプションを提供します(図13-75を参照)。

図13-75 イテレータ・コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAFイテレータ」を選択すると、JDeveloperウィザードが起動され、ここで、イテレータに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(デフォルトの選択は「ラベル付MAF出力テキスト」です。図13-76を参照してください)。

図13-76 MAFイテレータの編集ダイアログ

「イテレータの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:iterator id="i1"
var="row"
value="#{bindings.jobs.collectionModel}">
<amx:panelLabelAndMessage id="plam6"
label="#{bindings.jobs.hints.jobId.label}">
<amx:outputText id="ot6" value="#{row.jobId}" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plam5"
label="#{bindings.jobs.hints.title.label}">
<amx:outputText id="ot5" value="#{row.title}" />
</amx:panelLabelAndMessage>
<amx:inputText id="it1"
value="#{row.bindings.minSalary.inputValue}"
label="#{bindings.jobs.hints.minSalary.label}" />
<amx:inputText id="it2"
value="#{row.bindings.maxSalary.inputValue}"
label="#{bindings.jobs.hints.maxSalary.label}" />
</amx:iterator>

生成されるバインディングの詳細は、「生成されるバインディングに関する必知事項」を参照してください。

次にイテレータの編集でサポートされるコントロールを示します。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

13.3.3.3.4 リスト・ビュー

これは、子コンポーネントのあるMAF AMXリスト・ビューを作成するためのオプションを提供します(図13-77を参照)。

図13-77 リスト・ビュー・コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAFリスト・ビュー」を選択すると、図13-78に示すような「ListViewギャラリ」が開かれ、リスト・ビューに特定のレイアウトを選択できます。

図13-78 ListViewギャラリ

表13-5は、「ListViewギャラリ」に表示される、サポートされるリスト・フォーマットを示しています。

表13-5 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」(図13-78を参照)は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表(図13-79を参照)に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルト値の「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプション(図13-78を参照)では、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログ(図13-79を参照)の状態は変更されません。影響するのは、生成されるMAF AMXマークアップのみです。

- 凹枠リストのあるスタイルを選択すると、生成されたMAF AMXマークアップのlistView要素にadfmf-listView-insetListスタイル・クラスが設定されます。

凹枠リストのある「シンプル」フォーマットの例を次に示します。

<amx:listView var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
styleClass="adfmf-listView-insetList"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
id="listView2">
<amx:listItem id="li2">
<amx:outputText value="#{row.employeename}" id="ot3"/>
</amx:listItem>
</amx:listView>

「ListViewギャラリ」の「説明」ペインは、現在選択されているバリエーションに基づいて更新されます。フォーマットには、メイン・スタイルの簡単な説明が示され、その後に選択したバリエーションの詳細が続きます。4つのリスト・フォーマットに、それぞれ4つのバリエーションがあり、表13-6に示す16の固有の説明が提供されています。

表13-6 リスト・ビューのフォーマットとバリエーション

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドは、リスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドは、リスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「ListViewギャラリ」で選択し、「OK」をクリックすると、「リスト・ビューの編集」ウィザードが起動され、ここで図13-79に示すように、バインディング属性を選択したリスト・ビュー・フォーマットの要素にマップすることにより、リスト・アイテムのコンテンツを作成できます。

図13-79 MAF AMXリスト・ビューの編集ダイアログ

図13-79に示すダイアログに入力する際は、次の点を考慮してください。

- 最初のイメージは、選択したリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映し、略図から基礎となる表の名前付き要素へのマッピングを提供します。

- 「要素」列の読取り専用セルは、選択したリスト・ビュー・フォーマットから導出されます。

- 「値バインディング」列の編集可能セルは、ドロップされたデータ・コントロール・ノードに基づいています。

- リスト・アイテムは、その特定要素に対してどちらが適切であるかによって、出力テキストまたはイメージ・コンポーネントのいずれかとして生成されます。

- 要素(行)数は選択したリスト・ビュー・フォーマットであらかじめ決まっているため、行を追加または削除することはできません。

- 要素の順序は変更できません。

- 「リスト・アイテム選択」は選択モードを示し、単一のアイテム選択(デフォルト)または選択なしのいずれかにできます。リスト・ビューのshowLinkIcon属性は、選択モードに基づいて更新されます。選択モードが「なし」に設定されると、showLinkIcon属性はfalseに設定されます。それ以外の場合、showLinkIcon属性は変更されません(たとえば、デフォルトのtrueにデフォルト設定されます)。
listViewの次の属性を使用すると、選択モードの機能を有効にできます。

- selectionListener: 選択リスナーへのメソッド参照を定義します。

- selectedRowKeys: このコンポーネントの選択状態を示します。

「単一アイテム」オプションを選択した場合、「リスト・ビューの編集」ダイアログでは自動的にこれらの属性が次のように設定されます。

- selectionListenerは"bindings.treebinding.collectionModel.makeCurrent"に設定されます。

- selectedRowKeysは"bindings.treebinding.collectionModel.selectedRow"に設定されます。

selectionListener属性には「編集」オプションがあり、これを「プロパティ」ウィンドウから使用して、マネージドBeanクラスおよび適切なマネージドBeanメソッドを他のリスナー属性と同様の方法で作成できます(図13-80および図13-81を参照)。

図13-80 選択リスナー属性の編集

図13-81 選択リスナーの編集ダイアログ

次の例は、MAF AMXファイルでのlistView要素の選択関連属性を示しています。「リスト・ビューの編集」ダイアログで「単一アイテム」を選択すると、この宣言が生成されます(図13-79を参照)。

<amx:listView id="listView1"
var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
selectionListener=
"#{bindings.employees.collectionModel.makeCurrent}"
selectedRowKeys=
"#{bindings.employees.collectionModel.selectedRow}">
<amx:listItem id="listItem1">
...
</amx:listItem>
</amx:listView>

「リスト・ビューの編集」ダイアログで「リスト・アイテム選択」オプションとして「なし」を選択した場合、selectionListener属性とselectedRowKeys属性は、デフォルト値がなく、MAF AMXファイル内に出現しないため、設定されません。同時に、リスト・アイテムのshowLinkIcon属性はfalseに設定されます。次の例は、リスト・ビューの選択属性の省略を示しています。

<amx:listView id="listView1"
var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="listItem1" showLinkIcon="false">
...
</amx:listItem>
</amx:listView>

MAF AMXページとの間でナビゲーションが発生すると、リスト・ビューの選択状態が保持されます。

注意:

MAF AMXページ間で同じイテレータIDがある場合、選択されている行が考慮されます。たとえば、あるページに、イテレータがemployeesIteratorであるリスト・ビューとしてEmployeesコレクションをドラッグした後、「詳細」ページを追加し、その「詳細」ページの従業員イテレータのIDがemployeesIteratorに設定されている場合は、選択されている行のみが考慮されます。

- 「区切り属性」フィールドのデフォルト値は「区切りなし」であり、この場合、「区切りモード」フィールドは無効です。デフォルト以外の値を選択する場合は、図13-82および図13-83に示すように、「区切りモード」パラメータを指定する必要があります。

図13-82 区切り属性の指定

図13-83 区切りモードの指定

リスト・ビューの区切りの詳細は、「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

「リスト・ビューの編集」ダイアログで適切なオプションを選択すると、次のMAF AMXマークアップおよびデータ・バインディングが生成されます。

<amx:listView id="listView1"
var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
dividerAttribute="key"
dividerMode="firstLetter"
selectionListener=
"#{bindings.employees.collectionModel.makeCurrent}"
selectedRowKeys=
"#{bindings.employees.collectionModel.selectedRow}">
<amx:listItem id="listItem1" >
<amx:outputText value="#{row.key}"
styleClass="adfmf-listItem-subtext"
id="outputText1"/>
</amx:listItem>
</amx:listView>

生成されるバインディングの詳細は、「生成されるバインディングに関する必知事項」を参照してください。

MAFリスト・ビューでサポートされるコントロールは次のとおりです。

- MAF出力テキスト

- MAFイメージ

13.3.3.4 生成されるバインディングに関する必知事項

表13-7に、コンポーネントがドロップされたときにMAF AMXページに追加されるサンプル・バインディングを示します。

表13-7 サンプル・データ・バインディング

コンポーネント

データ・バインディング

ボタン

<amx:commandButton id="commandButton1"
actionListener="#{bindings.FindContacts.execute}"
text="FindContacts"
disabled="#{!bindings.FindContacts.enabled}">
</amx:commandButton>

リンク

<amx:commandLink id="commandLink1"
actionListener="#{bindings.FindContacts.execute}"
text="FindContacts"
disabled="#{!bindings.FindContacts.enabled}">
</amx:commandLink>

ラベル付入力日

<amx:inputDate id="inputDate1"
value="#{bindings.timeStamp.inputValue}"
label="#{bindings.timeStamp.hints.label}">
</amx:inputDate>

入力日

<amx:inputDate id="inputDate1"
value="#{bindings.timeStamp.inputValue}">
</amx:inputDate>

ラベル付入力テキスト

<amx:inputText id="inputText1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.hints.label}">
</amx:inputText>

入力テキスト

<amx:inputText id="inputText1"
value="#{bindings.contactData.inputValue}"
simple="true">
</amx:inputText>

出力テキスト

<amx:outputText id="outputText1"
value="#{bindings.contactData.inputValue}">
</amx:outputText>

ラベル付出力テキスト

<amx:panelLabelAndMessage id="panelLabelAndMessage1"
label="#{bindings.contactData.hints.label}">
<amx:outputText id="outputText1"
value="#{bindings.contactData.inputValue}"/>
</amx:panelLabelAndMessage>

ブール・チェック・ボックスの選択

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}">
</amx:selectBooleanCheckbox>

ブール・スイッチの選択

<amx:selectBooleanSwitch id="selectBooleanSwitch"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}">
</amx:selectBooleanSwitch>

ボタンを1つ選択

<amx:selectOneButton id="selectOneButton1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"
required="#{bindings.contactData.hints.mandatory}">
<amx:selectItems value="#{bindings.contactData.items}"/>
</amx:selectOneButton>

選択肢を1つ選択

<amx:selectOneChoice id="selectOneChoice1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}">
<amx:selectItems id="selectItems1"
value="#{bindings.contactData.items}"/>
</amx:selectOneChoice>

チェック・ボックスを複数選択

<amx:selectManyCheckbox id="selectManyCheckbox1"
value="#{bindings.AssetView.inputValue}"
label="#{bindings.AssetView.label}">
<amx:selectItems id="selectItems1"
value="#{bindings.AssetView.items}"/>
</amx:selectManyCheckbox>

ラジオ・ボタンを1つ選択

<amx:selectOneRadio id="selectOneRadio1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"
<amx:selectItems id="selectItems1"
value="#{bindings.contactData.items}"/>
</amx:selectOneRadio>

選択肢を複数選択

<amx:selectManyChoice id="selectManyChoice1"
value="#{bindings.AssetView.inputValue}"
label="#{bindings.AssetView.label}">
<amx:selectItems id="selectItems1"
value="#{bindings.AssetView.items}"/>
</amx:selectManyChoice>

13.3.3.5 生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項

最初のドラッグ・アンド・ドロップ・イベントにより、次のディレクトリとファイルが生成されます。

図13-84に、ドラッグ・アンド・ドロップ時に生成されるDataBindings.cpxファイル例を示します。

図13-84 ソース・ビューでのDataBindings.cpxファイル

DataBindings.cpxファイルでは、MAF AMXアプリケーション機能全体のバインディング・コンテキストが定義され、実行時にはこのメタデータから、バインディング・オブジェクトが作成されます。コンポーネントがプロジェクトの外部で作成された後にインポートされた場合は、MAF AMXアプリケーション機能に2つ以上のDataBindings.cpxファイルが存在する可能性があります。これらのファイルは個々のMAF AMXページをページ定義ファイルにマップし、どのデータ・コントロールをMAF AMXアプリケーション機能で使用するかを宣言します。実行時には、DataBindings.cpxファイルにリストされたデータ・コントロールのみが、現在のMAF AMXアプリケーション機能で使用可能になります。

初めて「データ・コントロール」ウィンドウを使用してコンポーネントをページに追加した場合、または操作をアクティビティに追加した場合、JDeveloperによって自動的に、ViewControllerプロジェクトのデフォルト・パッケージ内にDataBindings.cpxファイルが作成されます。DataBindings.cpxファイルが作成されると、最初のページまたはタスク・フロー・アクティビティ用のエントリが自動的に追加されます。その後、「データ・コントロール」ウィンドウを使用するたびに、そのページまたはアクティビティ用のエントリがまだない場合は、エントリがDataBindings.cpxに追加されます。

JDeveloperによりDataBindings.cpxファイルが作成されると、そのファイルを「ソース」ビュー(図13-84を参照)または概要エディタで開くことができます。

ファイルの「ページ・マッピング」(pageMap)セクションにより、IDを使用して各MAF AMXページまたはタスク・フロー・アクティビティが対応するページ定義ファイルにマップされます。「ページ定義の使用方法」(pageDefinitionUsages)セクションにより、ページ定義IDはMAF AMXアプリケーション機能内のページ定義ファイルの絶対パスにマップされます。「データ・コントロールの使用方法」(dataControlUsages)セクションは、ページ定義ファイル内で定義済のバインディング・オブジェクトによって使用されるデータ・コントロールを識別します。これらのマッピングにより、ページの起動時にバインディング・コンテナを初期化できます。

概要エディタで、現在のID名をダブルクリックし、インラインで編集することで、ページ定義ファイルまたはデータ・コントロールのID名を変更できます。そうすることで、MAF AMXアプリケーション機能のすべての参照が更新されます。ただし、JDeveloperで更新されるのはID名のみであり、ファイル名は更新されません。データ・コントロール名を予約語に変更しないようにしてください。

また、「構造」ウィンドウでDataBindings.cpxファイルの要素をクリックし、「プロパティ」ウィンドウを使用してプロパティ値を変更することもできます。

図13-85に、ドラッグ・アンド・ドロップ時に生成されるPageDefファイル例を示します。

図13-85 PageDefファイル

ページ定義ファイルでは、実行時にMAF AMX UIコンポーネントにデータを移入するバインディング・オブジェクトを定義します。バインディングを持つすべてのMAF AMXページには、そのページで使用するバインディング・オブジェクトの定義が含まれる、対応するページ定義ファイルが必要です。ページ定義ファイルによって、すべてのバインディングに設計時アクセスが提供されます。実行時には、ページ定義ファイルによって定義されたバインディング・オブジェクトが、ページ定義ファイルの実行時インスタンスであるバインディング・コンテナ内でインスタンス化されます。

初めて「データ・コントロール」ウィンドウを使用してページにコンポーネントを追加すると、JDeveloperによって自動的に、そのページのページ定義ファイルが作成され、コンポーネントにより参照される各バインディング・オブジェクトの定義が追加されます。それ以降、ページにデータバインド・コンポーネントを追加するたびに、JDeveloperによって、必要なバインディング・オブジェクト定義がページ定義ファイルに自動的に追加されます。

デフォルトでは、ページ定義ファイルは、「ViewController」プロジェクトのApplication Sourcesノードにあるmobile.PageDefsパッケージに含まれています。対応するMAF AMXページがデフォルト以外のディレクトリ、またはデフォルトのサブディレクトリに保存されると、ページ定義も同じ名前のペッケージに保存されます。

ページ定義ファイルを開く方法の詳細は、「ページ定義ファイルへのアクセス」を参照してください。概要エディタでページ定義ファイルを開いた場合は、次のタブを使用して、バインディング、コンテキスト・イベントおよびMAF AMXページのパラメータを表示および構成できます。

- バインディングと実行可能ファイル: このタブには、3種類のオブジェクト(バインディング、実行可能ファイル、および関連付けられたデータ・コントロール)が表示されます。

注意:

BindingsとExecutablesは、選択しないかぎりデータ・コントロールには表示されません。

デフォルトでは、モデル・バインディング・オブジェクトは、そのオブジェクトを作成するために使用されたデータ・コントロール・オブジェクトの名前が付けられます。データ・コントロール・オブジェクトが1ページ内で何度も使用される場合、JDeveloperではデフォルトのバインディング・オブジェクト名に数字を追加して、それぞれが一意になるようにします。

- コンテキスト・イベント: MAF AMXアプリケーション機能内のアーティファクトが登録可能なコンテキスト・イベントを作成できます。

- パラメータ: パラメータ・バインディング・オブジェクトは、リクエストの開始時にページが評価するパラメータを宣言します。静的値または静的値を割り当てるEL式を使用して、ページ定義ファイルのパラメータ値を定義できます。

概要エディタの項目(または「構造」ウィンドウの関連付けられたノード)をクリックすると、「プロパティ」ウィンドウを使用してその項目の属性値を表示および編集したり、「ソース」タブをクリックしてXMLソースを直接編集できます。

13.3.3.6 MAF AMXエディタの「バインディング」タブの使用方法

JDeveloperの「バインディング」タブ(図13-86を参照)は、MAF AMXエディタで使用可能です。ここには、特定のMAF AMXページに対して定義されたデータ・バインディングが表示されます。バインディングを選択すると、基盤となるデータ・コントロールへのリレーションシップが示され、PageDefファイルへのリンクが提供されます。

図13-86 「バインディング」タブ

13.3.3.7 使用されないバインディングの削除に関する必知事項

「構造」ウィンドウからMAF AMXコンポーネントを削除または切り取ると、使用されないバインディングは自動的にページから削除されます。

注意:

「ソース」エディタからコンポーネントを削除した場合には、バインディングは削除されません。

図13-87は、バインディングを参照するリスト・ビュー・コンポーネントの削除を示しています。削除すると、関連するバインディング・エントリが、対応するPageDef.xmlファイルから自動的に削除されます。

図13-87 バインドされたコンポーネントのページからの削除

図13-88では、ページからリスト・ビュー・コンポーネントを切り取ることにより、これを削除しています。

図13-88 バインドされたコンポーネントのページからの切取り

「切取り」をクリックすると、図13-89に示すような「ADFバインディングの削除の確認」ダイアログが表示され、該当するバインディングを削除するかどうかを選択するよう求められます。

図13-89 「ADFバインディングの削除の確認」ダイアログ

13.3.4 サーバー通信に関する必知事項

MAFで使用されるセキュリティ・アーキテクチャでは、MAF AMXページをホストするブラウザに、セキュア・サーバーに接続してそのリソースを取得するために必要なセキュリティ情報へのアクセス権がないことを保証しています。これは、MAF AMXページから行うAJAXコールに直接的な影響があります。これらのコールはサポートされていないため、MAF AMX UIコンポーネント内からのJavaScriptの使用には制約があります。サーバーとの通信は、埋込みJavaコード層から行う必要があります。

14 MAF AMXユーザー・インタフェースの作成

この章では、MAF AMXページのユーザー・インタフェースを作成する方法について説明します。

この章の内容は次のとおりです。

- MAF AMXページのユーザー・インタフェースの作成の概要

- ページ・レイアウトの設計

- UIコンポーネントの作成と使用方法

- カスタムUIコンポーネントの作成

- ジェスチャーの有効化

- 3D Touchに対応したiOSデバイスで使用するアプリケーションのショートカットの実装

- データ視覚化の指定

- UIコンポーネントのスタイル設定

- MAFのアクセシビリティのサポートの理解

- 入力の検証

- イベント・リスナーの使用方法

14.1 MAF AMXページのユーザー・インタフェースの作成の概要

MAFでは、MAFがサポートするプラットフォームで適切に動作するMAF AMXページを作成できる、一連のUIコンポーネントおよび操作が提供されています。

MAF AMXは、標準的なJDeveloper開発エクスペリエンスに準拠して、「コンポーネント」ウィンドウまたは「データ・コントロール」ウィンドウのいずれからもソース・エディタや「構造」ウィンドウにUIコンポーネントおよび操作をドラッグできるようになっています。実質的には、iOSおよびAndroidのプラットフォーム上のネイティブ・コンポーネントのHTML相当物がMAF AMX UIコンポーネントによってレンダリングされ、JDeveloperでのそれらのデザインタイムの動作は、その他のテクノロジで使用されるコンポーネントに似たものとなります。さらに、これらのUIコンポーネントは、宣言ナビゲーションおよびデータ・バインディングのためにMAFのコントローラおよびモデルと統合されています。

詳細は、次の項を参照してください。

- MAF AMXページの作成

- MAF AMXでのバインディングの使用とデータ・コントロールの作成

14.2 ページ・レイアウトの設計

MAF AMXは、ページ内へのUIコンポーネントの配置を可能にするレイアウト・コンポーネントを提供します。

通常、これらのコンポーネントを使用してページの構築を開始し、次にこれらのコンテナ内で、または子コンポーネントとして、他の機能を提供する他のコンポーネントを、レイアウト・コンポーネント(表14-1にリスト)に追加します。これらのコンポーネントのいくつかは、拡大するコンポーネント内に配置されたときに拡大する機能などの形状管理機能を提供します。

表14-1 MAF AMXのページ管理、レイアウトおよび間隔調整コンポーネント

コンポーネント

タイプ

説明

表示

コア・ページ構造コンポーネント

MAF AMXファイル内にview要素を作成します。ファイルが作成されるときにファイルに自動的に挿入されます。「表示コンポーネントの使用方法」を参照してください。

パネル・ページ

コア・ページ構造コンポーネント

MAF AMXファイル内にpanelPage要素を作成します。ページ内の中央領域(ヘッダー領域とフッター領域の間を垂直方向にスクロールする)を定義します。「パネル・ページ・コンポーネントの使用方法」を参照してください。

MAF AMXファイルの詳細は、「MAF AMXページの作成」を参照してください。

ファセット

コア・ページ構造コンポーネント

MAF AMXファイル内にfacet要素を作成します。任意の名前のファセットを親コンポーネントに定義します。「ファセット・コンポーネントの使用方法」を参照してください。

フラグメント

コア・ページ構造コンポーネント

MAF AMXファイル内にfragment要素を作成します。ページ・コンテンツの共有を可能にします。「フラグメント・コンポーネントの使用方法」を参照してください。

ファセット定義

コア・ページ構造コンポーネント

MAF AMXファイル内にfacetRef要素を作成します。ページ・フラグメントの定義(fragmentDef)で、ページ・フラグメントの使用箇所で定義されたファセットを参照するために使用します。「ファセット・コンポーネントの使用方法」を参照してください。

パネル・グループ・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelGroupLayout要素を作成します。子コンポーネントを縦または横にグループ化します。「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・フォーム・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelFormLayout要素を作成します。入力テキストなどのコンポーネントを、それらのラベルおよびフィールドが水平に、または各コンポーネントの上に整列するように配置します。「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・ラベルおよびメッセージ

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelLabelAndMessage要素を作成します。ラベルおよびその子をレイアウトします。「パネル・ラベルおよびメッセージ・コンポーネントの使用方法」を参照してください。

パネル・ストレッチ・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelStretchLayout要素を作成します。別のパネルの両側にパネルを配置できます。「パネル・ストレッチ・レイアウト・コンポーネントの使用方法」を参照してください。

ポップアップ

セカンダリ・ウィンドウ

MAF AMXファイル内にpopup要素を作成します。ポップアップ・ウィンドウを表示します。「ポップアップ・コンポーネントの使用方法」を参照してください。

パネル・スプリッタ

インタラクティブ・ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelSplitter要素を作成します。左側ナビゲーション・ペインで制御できる複数のコンテンツ領域を表示できます。「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

パネル・アイテム

インタラクティブ・ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelItem要素を作成します。パネル・スプリッタのコンテンツ領域を表しています。「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

デック

ページ・レイアウト・コンポーネント

MAF AMXファイル内にdeck要素を作成します。一度に子コンポーネントの1つを表示します。「デック・コンポーネントの使用方法」を参照してください。

フレックス・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にflexLayout要素を作成します。使用可能なスペースに応じて、コンポーネントの柔軟なフローを提供します。「フレックス・レイアウト・コンポーネントの使用方法」を参照してください。

スペーサ

ページ・レイアウト・コンポーネント

MAF AMXファイル内にspacer要素を作成します。MAF AMXファイル内のspacer要素によって表される空白の領域を作成します。「スペーサ・コンポーネントの使用方法」を参照してください。

表のレイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にtableLayout要素を作成します。行で構成された表を表します。「表のレイアウト・コンポーネントの使用方法」を参照してください。

行のレイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にrowLayout要素を作成します。表のレイアウト・コンポーネント内でセルで構成されている行を表します。「表のレイアウト・コンポーネントの使用方法」を参照してください。

セル・フォーマット

ページ・レイアウト・コンポーネント

MAF AMXファイル内にcellFormat要素を作成します。行のレイアウト・コンポーネント内のセルを表します。「表のレイアウト・コンポーネントの使用方法」を参照してください。

メーソンリー・レイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にmasonryLayout要素を作成します。列と行に配置されたタイルとしてその子コンポーネントを表示します。「メーソンリー・レイアウト・コンポーネントの使用方法」を参照してください。

アクセサリ・レイアウト

ページ・レイアウト・コンポーネント

MAF AMXファイル内にaccessoryLayout要素を作成します。リスト・ビュー・コンポーネント内で使用され、オプションのコンテンツ領域を明らかにするコンテンツの左や右へのドラッグを有効にします。「アクセサリ・レイアウト・コンポーネントの使用方法」を参照してください。

レイアウト・コンポーネントを追加するには、それを「コンポーネント」ウィンドウからMAF AMXページにドラッグ・アンド・ドロップします(「MAF AMXページにUIコンポーネントを追加する方法」を参照)。次に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します(「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>

図14-1 デザインタイムのページ・レイアウト・コンポーネント

レイアウト・コンポーネントのビジュアル・プレゼンテーションを管理するには、標準Cascading Style Sheet (CSS)を使用します。CSSは、ViewControllerプロジェクトのWeb Content/cssディレクトリに、MAFによって提供されているデフォルトCSSとともに配置されています。「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

MAF AMXを使用して作成されたユーザー・インタフェースは、言語環境が左から右(LTR)、右から左(RTL)のいずれであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。ポップアップ(「ポップアップ・コンポーネントの使用方法」を参照)、パネル・アイテム、パネル・スプリッタ(「パネル・スプリッタ・コンポーネントの使用方法」)など、一部のMAF AMXレイアウト・コンポーネントは、特定のRTL動作を有効化するように構成できます。MAF AMXページのRTL構成の詳細は、「ジェスチャーの有効化」および「ページ遷移スタイルの指定方法」を参照してください。

UILayoutDemoという名前のMAFサンプル・アプリケーションは、ボタンなどのMAF AMX UIコンポーネントとともにレイアウト・コンポーネントを使用して、共通パターンに従った一般的なレイアウトのいくつかを実現する方法を示しています。さらに、このサンプル・アプリケーションは、スタイルを使用してページ・レイアウトを特定のパターンに合せる方法を示します。UILayoutDemoアプリケーションは、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

14.2.1 表示コンポーネントの使用方法

表示(MAF AMXファイルのview要素)は、コア・ページ構造コンポーネントであり、MAF AMXファイルの作成時にそのファイルに自動的に挿入されます。このコンポーネントは、ページおよびその構造の階層表現を提供し、単一のMAF AMXページを表します。

14.2.2 パネル・ページ・コンポーネントの使用方法

パネル・ページ(MAF AMXファイルのpanelPage要素)は、他のコンポーネントをレイアウトする画面のスクロール可能領域の定義を可能にするコンポーネントです。

デフォルトでは、MAF AMXページを作成するときに、JDeveloperによってパネル・ページ・コンポーネントが自動的に作成され、そのページに挿入されます。そのページにコンポーネントを追加すると、それらはパネル・ページ・コンポーネント内に挿入されます。

特定の領域(ページのヘッダーやフッターなど)をスクロールできないようにし、向きが変更されたときのストレッチを有効化するには、パネル・ページに対してファセット・コンポーネントを指定します。パネル・ページのヘッダー・ファセットには、各ページのナビゲーション・バーに配置されるタイトルが含まれています。パネル・ページに含めることができる他のタイプのファセット・コンポーネントの詳細は、「ファセット・コンポーネントの使用方法」を参照してください。

次の例は、MAF AMXファイルに定義されたpanelPage要素を示しています。このパネル・ページには、ヘッダー・ファセットが含まれています。

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
</amx:facet>
</amx:panelPage>

14.2.3 パネル・グループ・レイアウト・コンポーネントの使用方法

「パネル・グループ・レイアウト」コンポーネントは、基本レイアウト・コンポーネントであり、その子を垂直方向または水平方向に配置します。また、子コンポーネントをページの横および下に流すラッピング・レイアウト・オプションがあります。

「パネル・グループ・レイアウト」コンポーネントを作成するには、「コンポーネント」ウィンドウを使用します。

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、「パネル・グループ・レイアウト」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 目的の子コンポーネントを「パネル・グループ・レイアウト」コンポーネントに挿入します。

3. 隣接する子コンポーネント間に間隔を追加するには、スペーサ(spacer)コンポーネントを挿入します。

4. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。

次の例は、MAF AMXファイルに定義されたpanelGroupLayout要素を示しています。

<amx:panelGroupLayout styleClass="prod" id="pgl1">
<amx:outputText styleClass="prod-label" value="Screen Size:" id="ot1"/>
</amx:panelGroupLayout>

14.2.3.1 スクロールの動作のカスタマイズ

「パネル・グループ・レイアウト」コンポーネントのスクロール動作は、scrollPolicy属性によって定義され、auto (デフォルト)、noneまたはscrollに設定できます。この動作は、デフォルトでは、アクティブ・スキンに定義されているものになります。

アクティブ・スキンに定義されている動作にかかわらずスクロールを無効にするには、scrollPolicy属性をnoneに設定します。「パネル・グループ・レイアウト」コンポーネントがスクロール可能でない場合は、この内容は制限されません。

アクティブ・スキンに定義されている動作にかかわらずスクロールを有効にするには、scrollPolicy属性をscrollに設定します。「パネル・グループ・レイアウト」コンポーネントがスクロール可能な場合は、コンポーネントのディメンションが制限されるときにスクロールが提供されます。

スクロールでは大量のメモリーが消費され、アプリケーションがクラッシュする可能性があるため、スクロールの使用は最小限にする必要があります。mobileAltaスキン(「スキニングに関する必知事項」を参照)では、「パネル・グループ・レイアウト」、「パネル・フォーム・レイアウト」(「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照)および「表のレイアウト」(「表のレイアウト・コンポーネントの使用方法」を参照)のスクロールは無効化されています。アプリケーションではmobileAltaスキンを使用し、インスタンスでscrollPolicyをscrollに設定するのは必要な場合に限定することをお薦めします。「パネル・フォーム・レイアウト」および「表のレイアウト」のスクロール動作をシミュレートするには、スクロールが必要になったときに、スクロール可能な「パネル・グループ・レイアウト」コンポーネントでそれらを囲みます。

「MAF AMX UIコンポーネントによるメモリー消費に関する必知事項」を参照してください。

14.2.4 パネル・フォーム・レイアウト・コンポーネントの使用方法

パネル・フォーム・レイアウト(panelFormLayout)コンポーネントは、コンポーネントをそれらのラベルおよびフィールドが水平方向に整列するように配置します。一般的に、パネル・フォーム・レイアウト・コンポーネントのメイン・コンテンツは、入力コンポーネント(入力テキストなど)および選択コンポーネント(選択肢など)で構成されています。label属性が定義されている子コンポーネントをパネル・フォーム・レイアウト・コンポーネント内に配置すると、その子コンポーネントのラベルおよびフィールドはパネル・フォーム・レイアウトの定義に基づいて整列およびサイズ設定されます。パネル・フォーム・レイアウト内では、ラベル領域は、フィールド領域の開始側上またはフィールド領域の上の独立した線上のどちらにも表示できます。独立した線は、パネル・フォーム・レイアウトのlabelPosition属性がtopStart、topCenterまたはtopEndに設定されている場合に使用されます。それ以外の場合は、ラベル領域はフィールド領域の開始側上に表示されます。ラベル領域内では、labelPosition属性によって、次のようにラベル・テキストを整列できる位置が制御されます。

- 開始側(labelPosition="start"またはlabelPosition="topStart")

- 中央(labelPosition="center"またはlabelPosition="topCenter")

- 終了側(labelPosition="end"またはlabelPosition="topEnd")

フィールド領域内では、fieldHalign属性によって、次のようにフィールド・コンテンツを整列できる位置が制御されます。

- 開始側(fieldHalign="start")

- 中央(fieldHalign="center")

- 終了側(fieldHalign="end")

パネル・フォーム・レイアウト内には、maxColumns属性およびrows属性を使用して、1つ以上の列に子コンポーネントを配置できます。これらの属性は、最適な複数列レイアウトを実現するために、labelWidth、fieldWidth、labelPositionおよびshowHorizontalDividersの各属性とともに使用する必要があります。

注意:

単一列レイアウトから複数列レイアウトに変更するには、maxColumns属性の設定値にかかわらず、rows属性の値を1より大きくする必要があります。rows属性が指定されている場合、maxColumns属性は、列の数をその数値を最大としてレイアウトを制限しますが、子コンポーネントを配置するにはこれと同数の列が必要です。

パネル・フォーム・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、パネル・フォーム・レイアウト・コンポーネントをMAF AMXページにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。

次の例は、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>

14.2.5 パネル・ストレッチ・レイアウト・コンポーネントの使用方法

パネル・ストレッチ・レイアウト(panelStretchLayout)コンポーネントは、top、bottomおよびcenterの3つの子ファセット・コンポーネントを管理します(次の例を参照)。これらのファセットは、任意の数および組合せで使用できます。

<amx:panelStretchLayout id="psl1">
<amx:facet name="top">
</amx:facet>
<amx:facet name="center">
</amx:facet>
<amx:facet name="bottom">
</amx:facet>
</amx:panelStretchLayout>

パネル・ストレッチ・レイアウト・コンポーネントを積み重ねた3つの長方形のセットで表現しようとする場合、次のことが適用されます。

- 一番上の長方形の高さは、topファセットに指定したとおりの高さで定義されます。

- 一番下の長方形の高さは、bottomファセットに指定したとおりの高さで定義されます。

- 残りの垂直領域が中央の長方形に割り当てられます。この矩形の高さがCenter.heightに定義された値よりも小さく、panelStretchLayoutのscrollPolicy属性がscrollまたはautoのいずれかに設定されている場合、スクロールバーが追加されます。

パネル・ストレッチ・レイアウト・コンポーネントを追加するには、次の手順を実行します。

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、パネル・ストレッチ・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 作成した子ファセット・コンポーネントを確認し、必要に応じて、一部を削除します。

3. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。

14.2.6 パネル・ラベルおよびメッセージ・コンポーネントの使用方法

パネル・ラベルおよびメッセージ(panelLabelAndMessage)コンポーネントは、label属性が定義されていないコンポーネントを配置するために使用します。これらのコンポーネントとしては、通常、出力テキスト、ボタンまたはリンクがあります。

パネル・ラベルおよびメッセージ・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、パネル・ラベルおよびメッセージ・コンポーネントをパネル・グループ・レイアウト・コンポーネントにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。

次の例は、MAF AMXファイルで定義されたpanelLabelAndMessage要素を示しています。label属性が、子コンポーネントに対して使用されています。

<amx:panelLabelAndMessage label="Phone" id="plm1">
<amx:outputText value="212-555-0123" id="ot1"/>
</amx:panelLabelAndMessage>

14.2.7 ファセット・コンポーネントの使用方法

ファセット(facet)コンポーネントは、親レイアウト・コンポーネント上に、ヘッダーやフッターなど任意の名前のファセットを定義するために使用します。ファセットの位置およびレンダリングは、親コンポーネントによって決定されます。

MAF AMXページのヘッダーは、通常、ヘッダー、プライマリおよびセカンダリのファセットと組み合せたパネル・ページ・コンポーネントによって表されます(「パネル・ページ・コンポーネントの使用方法」を参照)。

- ヘッダー・ファセット: ページ・タイトルが含まれています。

- プライマリ・アクション・ファセット: ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセット: ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

MAF AMXページのフッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(「パネル・ページ・コンポーネントの使用方法」を参照)。

- フッター・ファセット: コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

次の例は、パネル・ページ・コンテナ内で宣言されているfacet要素を示しています。ファセットのタイプは、常にそのname属性で定義されます(表14-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>

表14-2は、特定の親コンポーネントとともに使用できる事前定義済ファセット・タイプを示しています。

表14-2 ファセット・タイプと親コンポーネント

親コンポーネント

ファセット・タイプ(名前)

パネル・ページ(panelPage)

header、footer、primary、secondary

リスト・ビュー(listView)

header、footer

カルーセル(carousel)

nodeStamp

パネル・スプリッタ(panelSplitter)

navigator

パネル・ストレッチ・レイアウト(panelStretchLayout)

top、center、bottom

データ視覚化コンポーネント。

「データ視覚化の指定」を参照してください。

dataStamp、seriesStamp、overview、rows (NBoxに適用可能)、columns (NBoxに適用可能)、cells (NBoxに適用可能)、icon (NBoxノードに適用可能)、indicator (NBoxノードに適用可能)

ファセット・コンポーネントを追加するには:

「構造」ウィンドウまたはソース・エディタに表示されるコンテキスト・メニューを使用して、ファセット・コンポーネントを別のコンポーネントの子として追加できます。ポップアップ・メニューには、選択している親コンポーネントに有効なファセットのみが表示されます。ファセットを追加するには、最初に「構造」ウィンドウまたはソース・エディタで親コンポーネントを選択してから右クリックし、次のうちの1つを選択します。

- 親コンポーネントが「パネル・ページ」である場合、図14-2に示すように、「ファセット-パネル・ページ」を選択し、リストからファセットのタイプを選択します。

図14-2 パネル・ページにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントが「リスト・ビュー」である場合、図14-3に示すように、「ファセット-リスト・ビュー」を選択し、リストからファセットのタイプを選択します。

図14-3 リスト・ビューにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがカルーセルである場合、図14-4に示すように、「ファセット-カルーセル」→「ノード・スタンプ」を選択します。

図14-4 カルーセルにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがパネル・スプリッタである場合、図14-5に示すように、「ファセット-パネル・スプリッタ」→「ナビゲータ」を選択します。

図14-5 パネル・スプリッタにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがパネル・ストレッチ・レイアウトである場合、図14-6に示すように、「ファセット-パネル・ストレッチ・レイアウト」を選択し、リストからファセットのタイプを選択します。

図14-6 パネル・ストレッチ・レイアウトにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがデータ視覚化コンポーネントの1つである場合、図14-7に示すように、「ファセット」→「<MAF AMXデータ視覚化コンポーネント名>」を選択し、リストからファセットのタイプを選択します。

図14-7 データ視覚化コンポーネントにファセットを追加するためのポップアップ・メニューの使用方法

代替方法:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」→「コア構造」を選択し、表14-2にリストされた別のコンポーネントにファセット・コンポーネントをドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。

14.2.8 ポップアップ・コンポーネントの使用方法

ポップアップ(popup)コンポーネントを使用して、ポップアップ・ウィンドウを表示します。このコンポーネントは、ビュー・コンポーネントの子として宣言できます。

ポップアップ・コンポーネントとともに次の操作を使用できます。

- ポップアップを閉じる動作(closePopupBehavior)の操作は、ポップアップを閉じる動作のtype属性を使用して指定したクライアントによってトリガーされるイベントに応じてポップアップを閉じる宣言的な方法を表しています。

- ポップアップ表示動作(showPopupBehavior)の操作は、ポップアップ表示動作のtype属性を使用して指定されたクライアントによってトリガーされるイベントに応答してポップアップを表示する宣言的な方法です。
ポップアップ表示動作のpopupId属性には、その親コンポーネントに関連するポップアップ・コンポーネントの一意の識別子を指定します。ポップアップ表示動作のalignId属性には、そのポップアップの位置合せを行う際の基準となるUIコンポーネントの一意の識別子を指定します。識別子を手動で設定するのは、手間がかかり、さらに無効な参照が発生する可能性もあるため、これらの2つの属性の値は標準「プロパティ」ウィンドウと統合されているエディタを使用して設定します(図14-9を参照)。これらの識別子を検証するために特別に定義されている監査ルールがあります(「要素識別子とその監査に関する必知事項」を参照)。

「ポップアップ表示動作」のdecoration属性では、指定されているalignIdと一致するコンポーネントを指すアンカーを持つようにポップアップを構成できます。これは、decoration属性をanchorに設定することで実行します(デフォルト値はsimple)。

注意:

alignId属性を使用するためにdecoration="anchor"を定義する必要はありません。decoration="anchor"を使用する際に、alignId属性が指定されていないかalignIdで一致するものが見つからない場合は、decorationはsimpleにデフォルト設定されるため、ポップアップ・コンポーネントには最小限の装飾が行われます。

「ポップアップ表示動作」のalign属性に設定する値は、ポップアップ・コンポーネントの配置を示します(その配置を行うのに十分なスペースがある場合)。十分な領域がない場合は、MAFによって別の位置が選択されます。

ヒント:

ポップアップを画面の中央に配置するには、パネル・ページ・コンポーネントのalignId属性を設定してから、align="center"を使用してください。

次の例は、MAF AMXファイルで定義されたpopupと、そのshowPopupBehaviorおよびclosePopupBehavior要素を示しています。

<amx:view>
<amx:panelPage id="panelPage1">
<amx:commandButton id="commandButton1" text="Show Popup">
<amx:showPopupBehavior popupId="popup1" type="action"
align="topStart" alignId="panelPage1"
decoration="anchor"/>
</amx:commandButton>
</amx:panelPage>
<amx:popup id="popup1"
animation="slideUp"
autoDismiss="true"
backgroundDimming="off">
<amx:panelGroupLayout id="pgl2" layout="vertical">
<amx:commandButton id="commandButton3" text="Close Popup">
<amx:closePopupBehavior type="action" popupId="popup1"/>
</amx:commandButton>
</amx:panelGroupLayout>
</amx:popup>
</amx:view>

ポップアップ・コンポーネントは、ユーザー入力エラーが発生したときに検証メッセージを表示できます。「入力の検証」を参照してください。

ポップアップID属性を設定するには:

1. ソース・エディタまたは「構造」ウィンドウで、showPopupBehavior要素またはcloseopupBehavior要素を選択します。

2. 「ポップアップID」フィールドの右側にある下矢印をクリックし、使用可能なポップアップ・コンポーネントのリストから選択するか(図14-8を参照)、「ポップアップID」フィールドの右側にある「プロパティ・メニュー」アイコンをクリックして「ポップアップID」プロパティ・エディタを開きます(図14-9を参照)。

図14-8 リストからのポップアップIDの選択

図14-9 ポップアップID属性の設定

3. プロパティ・エディタを使用する場合は、「ポップアップID」プロパティ・エディタで「編集」を選択し、図14-10に示す「プロパティの編集: ポップアップID」ダイアログを開きます。

図14-10 ポップアップIDのプロパティの編集ダイアログ

4. 「ポップアップ表示動作」または「ポップアップを閉じる動作」を起動したときに表示されるポップアップ・コンポーネントまたは閉じるポップアップ・コンポーネントを選択します。

「位置合せID」属性を設定するには:

1. ソース・エディタまたは「構造」ウィンドウで、showPopupBehavior要素を選択します。

2. 「位置合せID」フィールドの右側にある「プロパティ・メニュー」アイコンをクリックし、図14-11に示すように「位置合せID」プロパティ・エディタを開きます。

図14-11 位置合せID属性の設定

3. 「位置合せID」プロパティ・エディタで「編集」を選択し、図14-12に示す「プロパティの編集: 位置合せID」ダイアログを開きます。

図14-12 位置合せIDのプロパティの編集ダイアログ

4. 「ポップアップ表示動作」操作の親コンポーネントを選択します。

iOSプラットフォームとAndroid 4.2以降のプラットフォームの両方に対応した開発を行う場合、右から左(RTL)の言語環境に対応するようにポップアップを構成するには、そのanimation属性をslideStartまたはslideEndに設定します。

animation属性をzoomに設定することにより、元のコンポーネントをズーム・インまたはズーム・アウトするポップアップを有効にできます。

UILayoutDemoという名前のMAFサンプル・アプリケーションは、ポップアップ・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。UIDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

14.2.9 パネル・スプリッタ・コンポーネントの使用方法

パネル・スプリッタ(panelSplitter)コンポーネントは、左側にあるナビゲーション・ペインで制御可能な複数のコンテンツ領域を表示するために使用します。

パネル・スプリッタ・コンポーネントは、通常、表示サイズが大きいタブレット・デバイスで使用されます。これらのコンポーネントは、通常、表示領域の左側にリストが、右側にコンテンツがある場合に使用されます。

パネル・スプリッタには、MAF AMXページにパネル・スプリッタをドラッグ・アンド・ドロップすると自動的に生成されるナビゲータ・ファセット(「ファセット・コンポーネントの使用方法」を参照)およびパネル・アイテム・コンポーネントを含めることができます。パネル・アイテム(panelItem)コンポーネントは、パネル・スプリッタのコンテンツ領域を表します。各パネル・スプリッタ・コンポーネントには少なくとも1つのパネル・アイテムが必要なため、パネル・スプリッタが作成されるときにパネル・アイテムがパネル・スプリッタに自動的に追加されます。各パネル・アイテム・コンポーネントには、パネル・グループ・レイアウトに含めることができるどのようなコンポーネントも含めることができます(「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照)。

「パネル・スプリッタ」の左側は、ナビゲータ・ファセット(navigator)によって表されます。これは、アニメーション付きの複数のコンテンツのみが必要とされる場合(たとえば、異なるボタンを選択してコンテンツを切り替えるときにアニメーションを必要とする選択ボタン付きの複数コンテンツ領域を描画する場合)のオプションです。横モードの場合、このファセットがレンダリングされます。縦モードの場合、ボタンはコンテンツ領域の上に配置され、クリックされたときにこのファセットのコンテンツがレンダリングされます。navigatorDisplayおよびnavigatorDisclosureState属性を使用して、ナビゲータの表示およびナビゲータの開示状態を構成できます。

右から左(RTL)の言語環境に対応するようにパネル・スプリッタとパネル・アイテムを構成するには、それらのanimation属性をslideStart、slideEnd、flipStart、flipEndのいずれかに設定します。パネル・アイテム・コンポーネントのanimation属性は、パネル・スプリッタのanimation属性をオーバーライドします。

次の例は、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アプリケーション」に記載されているCompGalleryサンプル・アプリケーションは、レイアウト・カテゴリのパネル・スプリッタ・コンポーネントの実装を提供します。

14.2.10 スペーサ・コンポーネントの使用方法

スペーサ(spacer)コンポーネントを使用して、MAF AMXページでコンポーネントを区切るために空白領域を作成します。spacerのheight属性(垂直空白用)およびwidth属性(水平空白用)を使用して、縦または横の空白をページに組み込むことができます。

スペーサ・コンポーネントを追加するには、次の手順を実行します。

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、「スペーサ」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。

次の例は、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..."/>

14.2.11 表のレイアウト・コンポーネントの使用方法

表のレイアウト(tableLayout)コンポーネントは、セルを含む行で構成される一般的な表のフォーマットでデータを表示するために使用します。

行のレイアウト(rowLayout)コンポーネントは、表のレイアウトの単一の行を表します。表のレイアウト・コンポーネントには、1つ以上の行のレイアウト・コンポーネント、または行のレイアウト・コンポーネントを生成できるイテレータ・コンポーネントのいずれかが含まれている必要があります。

セル・フォーマット(cellFormat)コンポーネントは、行のレイアウトのセルを表します。行のレイアウト・コンポーネントには、1つ以上のセル・フォーマット・コンポーネント、セル・フォーマット・コンポーネントを生成できるイテレータ・コンポーネント、属性リスト・イテレータ・コンポーネントまたはファセット定義コンポーネントのいずれかが含まれている必要があります。

表のレイアウト構造では、セル・コンテンツで割合による高さを使用したり、表構造全体に高さをまとめて割り当てることはできません。

- 表のレイアウト・コンポーネントのlayout属性およびwidth属性

- 行のレイアウト・コンポーネントのwidth属性およびheight属性

表のレイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、「表のレイアウト」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の行のレイアウト・コンポーネント、イテレータ・コンポーネント、属性リスト・イテレータ・コンポーネントまたはファセット定義の子コンポーネントを表のレイアウト・コンポーネントに挿入します。

3. セル・フォーマット・コンポーネント、イテレータ・コンポーネント、属性リスト・イテレータ・コンポーネントまたはファセット定義の子コンポーネントをそれぞれの行のレイアウト・コンポーネントに挿入します。

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。

次の例は、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>

14.2.12 メーソンリー・レイアウト・コンポーネントの使用方法

メーソンリー・レイアウト(masonryLayout)は、ダッシュボードと同様に列と行に配置されたタイルとして子コンポーネントを提示するコンテナタイプのコンポーネントです。各列と行のサイズは固定で、CSSで定義されます。このサイズは、メーソンリー・レイアウト・コンポーネント自体のサイズから独立しています。表示される列数はメーソンリー・レイアウト・サイズに応じて変化する場合がありますが、タイル・サイズは変化しません。また、タイル・サイズはコンテンツに依存しません。

タイルは、コンテンツが様々なMAF AMX UIコンポーネントによって提供されるメーソンリー・レイアウト・アイテム(masonryLayoutItem)コンポーネントによって表現されます。1つのタイルは複数の行および列を占めることができます(たとえば、タイルは3列と1行を占めることができます)。MAF AMXは、masonryLayoutItemのdimension属性を通じて使用可能な次のタイル・サイズの定義済セットを提供します。

- 1x1: 1列と1行。

- 1x2: 1列と2行。

- 1x3: 1列と3行。

- 2x1: 2列と1行。

- 2x2: 2列と2行。

- 2x3: 2列と3行。

- 3x1: 3列と1行。

- 3x2: 3列と2行。

CSSの.amx-masonryLayoutItemセクションで追加のサイズを作成することにより、メーソンリー・レイアウト・コンポーネントの外観を再定義できます。

行と列の間のスペースも、CSSで指定されます。

メーソンリー・レイアウト・コンポーネントは、レイアウト内に以前に残された間隔を埋め、適合するタイルを配置することで、使用可能なスペースの最大限の利用を試みます。エンド・ユーザーがモバイル・デバイスを回転すると、タイルが再配置され、スペースが最適に埋められます。この機能は、メーソンリー・レイアウト・アイテムの配置を変更するたびに、メーソンリー・レイアウト・コンポーネントによって起動されるMasonryReorderEventを介して有効になります。

メーソンリー・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、メーソンリー・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 目的の数のメーソンリー・レイアウト・アイテム・コンポーネントとその子UIコンポーネントをメーソンリー・レイアウト・コンポーネントに挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。

次の例は、MAF AMXファイルで定義されたmasonryLayout要素およびmasonryLayoutItem要素とそれらの子を示しています。

<amx:masonryLayout id="ml1"
initialOrder="#{pageFlowScope.componentProperties.order}">
<amx:masonryLayoutItem id="mt1"
dimension="#{pageFlowScope.componentProperties.myTeamExpanded ? '3x1' : '1x1'}"
rendered="#{pageFlowScope.componentProperties.myTeam}">
<amx:panelGroupLayout id="pgl9"
layout="vertical"
inlineStyle="margin: 6px; padding: 0px; border: none">
<amx:outputText value="My Team"
id="ot4"
inlineStyle="color: gray"/>
<amx:panelGroupLayout id="pgl1"
layout="horizontal"
scrollPolicy="scroll"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:panelGroupLayout id="pgl10"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i8"
source="/images/people/TerryLuca.png"
shortDesc="Terry Luca"/>
<amx:outputText value="Terry Luca"
id="ot9"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
<amx:panelGroupLayout id="pgl11"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i9"
source="/images/people/SusanWong.png"
shortDesc="Susan Wong"/>
<amx:outputText value="Susan Wong"
id="ot12"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
<amx:panelGroupLayout id="pgl12"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i10"
source="/images/people/RaviChouhan.png"
shortDesc="Ravi Chouhan"/>
<amx:outputText value="Ravi Chouhan"
id="ot11"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
<amx:panelGroupLayout id="pgl13"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i11"
source="/images/people/KathyGreen.png"
shortDesc="Kathy Green"/>
<amx:outputText value="Kathy Green"
id="ot10"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
<amx:panelGroupLayout id="pgl16"
inlineStyle="margin: 0px; padding: 2px; border: none">
<amx:image id="i5"
source="/images/people/StellaBaumgardner.png"
shortDesc="Stella Baum"/>
<amx:outputText value="Stella Baum"
id="ot3"
inlineStyle="font-size: 12px; color: gray"/>
</amx:panelGroupLayout>
</amx:panelGroupLayout>
</amx:panelGroupLayout>
</amx:masonryLayoutItem>
<amx:masonryLayoutItem id="mt2"
dimension="#{pageFlowScope.componentProperties.socialExpanded ? '3x1' : '1x1'}"
rendered="#{pageFlowScope.componentProperties.social}">
<amx:panelGroupLayout id="pgl2"
inlineStyle="margin: 6px; padding: 0px; border: none">
<amx:panelGroupLayout id="pgl22"
layout="vertical"
inlineStyle="margin: 0px; padding: 0px; border: none">
<amx:outputText value="Social"
id="ot2"
inlineStyle="color: gray"/>
<amx:spacer id="s5" height="6"/>
<amx:outputText value="New Conversations"
id="ot14"
inlineStyle="color: gray; font-size: 15px"/>
<amx:outputText value="6"
id="ot15"
inlineStyle="font-size:34px; color: #EE8A11"/>
<amx:outputText value="New Followers"
id="ot17"
inlineStyle="color: gray; font-size: 15px"/>
<amx:outputText value="5"
id="ot16"
inlineStyle="font-size:34px; color: #EE8A11"/>
</amx:panelGroupLayout>
</amx:panelGroupLayout>
</amx:masonryLayoutItem>
<amx:masonryLayoutItem id="mt3"
...
</amx:masonryLayoutItem>
</amx:masonryLayout>

14.2.13 アクセサリ・レイアウト・コンポーネントの使用方法

リスト・アイテム子コンポーネント内のリスト・ビューのアクセサリ・レイアウト(accessoryLayout)コンポーネントを使用して、オプションのコンテンツ領域を明らかにするコンテンツの左や右へのドラッグを有効にします。

通常、アクセサリ・レイアウトには、開始および終了の2つの子ファセット・コンポーネントを格納します。ドラッグ・ジェスチャーがファセットの幅を十分に超える場合、そのコンテンツ領域の子コンポーネントの1つのタップをトリガーするようなジェスチャーができます。別のアクセサリ・レイアウトのコンテンツが表示されるとき、または他のコンポーネントにフォーカスが移動したときには、通常、表示されているファセット・コンテンツは非表示になります。ただし、コンテンツがアクセシビリティのトリガーを使用して表示された場合は、フォーカスが移動しても非表示にはなりません。そうでないと、エンド・ユーザーがそのコンテンツ領域内のリンクを使用できません。

アクセサリ・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、「MAF AMX」→「レイアウト」を選択し、アクセサリ・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要に応じて、子ファセット・コンポーネントを追加し、それを他のMAF AMX UIコンポーネントに移入します。

3. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。

次の例は、MAF AMXファイルで定義されているaccessoryLayout要素と、その子コンポーネントとして使用されている開始と終了のファセットを示しています。

<amx:listView id="lv1">
<amx:listItem id="liSimple">
<amx:showPopupBehavior popupId="itemPopup"
type="action"
alignId="pp1"
align="overlapMiddleCenter"/>
<amx:accessoryLayout id="alSimple"
rendered="#{pageFlowScope.componentProperties.rendered}"
inlineStyle="#{pageFlowScope.componentProperties.inlineStyle}"
styleClass="#{pageFlowScope.componentProperties.styleClass}"
contentStyle="#{pageFlowScope.componentProperties.contentStyle}"
contentClass="#{pageFlowScope.componentProperties.contentClass}"
startDesc="#{pageFlowScope.componentProperties.startDesc}"
startWidth="#{pageFlowScope.componentProperties.startWidth}"
startStyle="#{pageFlowScope.componentProperties.startStyle}"
startClass="#{pageFlowScope.componentProperties.startClass}"
startFullTriggerSelector="#{pageFlowScope.componentProperties.
startFullTriggerSelector}"
endDesc="#{pageFlowScope.componentProperties.endDesc}"
endWidth="#{pageFlowScope.componentProperties.endWidth}"
endStyle="#{pageFlowScope.componentProperties.endStyle}"
endClass="#{pageFlowScope.componentProperties.endClass}"
endFullTriggerSelector="#{pageFlowScope.componentProperties.
endFullTriggerSelector}">
<amx:facet name="start">
<amx:commandLink id="clStartSimple"
text="Start"
styleClass="full-trigger">
<amx:showPopupBehavior popupId="startPopup"
type="action"
alignId="pp1"
align="overlapMiddleCenter"/>
</amx:commandLink>
</amx:facet>
<amx:facet name="end">
<amx:commandLink id="clEndSimple"
text="End"
styleClass="full-trigger">
<amx:showPopupBehavior popupId="endPopup"
type="action"
alignId="pp1"
align="overlapMiddleCenter"/>
</amx:commandLink>
</amx:facet>
<outputText id="otContentSimple" value="Simple example"/>
</amx:accessoryLayout>
</amx:listItem>
...
</amx:listView>

ジェスチャーの完了でリンクのいくつかを非表示にするのが目的ならば、commandLink要素のstyleClass属性をadfmf-accessoryLayout-hideWhenFullに設定します。

その他の例は、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにあるCompGalleryアプリケーションを参照してください。

14.2.14 デック・コンポーネントの使用方法

デック(deck)コンポーネントは、一度に1つの子コンポーネントを示すコンテナを表します。表示される子コンポーネント(displayedChild属性によって定義)の別の子コンポーネントへの遷移は、アニメーションの形式をとる遷移(transition)操作により有効になります。遷移は、フェードイン、スライディングおよび別の方向からのフリップと、子コンポーネントの非表示および表示によって発生します。

デッキは、前後に移動できます。

デック・コンポーネントを追加するには、次の手順を実行します。

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」を選択し、デッキをMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の遷移操作および子UIコンポーネントをデック・コンポーネントに挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。

次の例は、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>

14.2.15 フレックス・レイアウト・コンポーネントの使用方法

フレックス・レイアウト(flexLayout)コンポーネントは、使用可能なスペースに応じて、その子コンポーネントの拡大、縮小、およびラップを可能とする水平または垂直いずれかの柔軟なフローを提供します。ネストされたフレックス・レイアウト・コンポーネントを作成できます。

このコンポーネントは、CSSで定義されている柔軟なボックス・レイアウトに基づいており、そのプロパティのサブセットをサポートしています。W3CのWebサイト(http://www.w3.org/TR/css-flexbox-1/)を参照してください。

フレックス・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、MAF AMX→「レイアウト」とナビゲートし、フレックス・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. フレックス・レイアウト・コンポーネントに、他のフレックス・レイアウト・コンポーネントを含め、必要な数の子UIコンポーネントを挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。

次の例は、MAF AMXファイルで定義されているflexLayout要素とその子を示しています。

<amx:flexLayout id="fl1"
itemFlexibility="equal"
orientation="#{pageFlowScope.componentProperties.layoutOrientation}"
rendered="#{pageFlowScope.componentProperties.fl1Rendered}">

<amx:panelStretchLayout inlineStyle="background-color: #ff0000; text-align: center;"
rendered="#{pageFlowScope.componentProperties.p1Rendered}">
<amx:facet name="center">
<amx:outputText value="1" inlineStyle="font-size: 36px"/>
</amx:facet>
</amx:panelStretchLayout>

<amx:panelStretchLayout inlineStyle="background-color: #00ff00; text-align: center;"
rendered="#{pageFlowScope.componentProperties.p2Rendered}">
<amx:facet name="center">
<amx:outputText value="2" inlineStyle="font-size: 36px"/>
</amx:facet>
</amx:panelStretchLayout>

</amx:flexLayout>

14.2.16 フラグメント・コンポーネントの使用方法

フラグメント(fragment)コンポーネントによってMAF AMXページ・コンテンツの共有が可能になります。このコンポーネントは、MAF AMXフラグメント・ファイルとともに使用されます。「ページ・コンテンツの共有」を参照してください。

フラグメント・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、「フラグメント」をMAF AMXページにドラッグ・アンド・ドロップします。

2. 「フラグメントの挿入」ダイアログを使用して、フラグメントのSrc属性をフラグメント・ファイル(.amxf)に設定します。

3. オプションで、「構造」ビューを使用して、属性、属性リスト、ファセットなどの子コンポーネントを追加します。

図14-13 フラグメントへの移入

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。

5. フラグメントにコンテンツを含めるMAF AMXフラグメント・ファイルにファセット定義(facetRef)を追加し、facetRefのfacetName属性をファセットの名前に設定します。

次の例は、MAF AMXページに追加されたfragment要素を示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:panelGroupLayout layout="vertical"
id="itemPgl"
styleClass="amx-style-groupbox">
<amx:fragment id="f1"
src="/simpleFragment.amxf"
<amx:attribute id="a1"
name="text"
value="defaultValue" />
<amx:facet name="facet">
<amx:outputText id="ot5" value="Fragment"/>
</amx:facet>
</amx:fragment>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

次の例は、対応するMAF AMXフラグメント・ファイルを示しています。

<amx:fragmentDef
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment" id="f1">
<description id="d1">Description of the fragment</description>
<facet id="f2">
<description id="d4">Description of the facet</description>
<facet-name id="f3">facet1</facet-name>
</facet>
<attribute id="a1">
<description id="d2">Description of an attribute</description>
<attribute-name id="a2">text</attribute-name>
<attribute-type id="at1">String</attribute-type>
<default-value id="d3">defaultValue</default-value>
</attribute>
</fragment>
<amx:panelGroupLayout id="pgl1">
<amx:facetRef facetName="facet1" id="fr1"/>
<amx:outputText value="#{text}" id="ot1"/>
</amx:panelGroupLayout>
</amx:fragmentDef>

FragmentDemoという名前のMAFサンプル・アプリケーションは、フラグメントの作成方法および使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

14.3 UIコンポーネントの作成と使用方法

MAFでは、MAF AMXアプリケーション機能を開発する際に使用できる様々なUIコンポーネントが提供されます。

次のUIコンポーネントを使用できます。

- 入力テキスト(「入力テキスト・コンポーネントの使用方法」を参照)

- 入力数値スライダ(「入力数値スライダ・コンポーネントの使用方法」を参照)

- 入力日(「入力日コンポーネントの使用方法」を参照)

- 出力テキスト(「出力テキスト・コンポーネントの使用方法」を参照)

- ボタン(「ボタンの使用方法」を参照)

- リンク(「リンクの使用方法」を参照)

- イメージ(「イメージの表示方法」を参照)

- チェック・ボックス(「チェック・ボックス・コンポーネントの使用方法」を参照)

- チェック・ボックスを複数選択(「チェック・ボックスを複数選択コンポーネントの使用方法」を参照)

- 選択肢を複数選択(「選択肢を複数選択コンポーネントの使用方法」を参照)

- ブール・スイッチ(「ブール・スイッチ・コンポーネントの使用方法」を参照)

- 選択肢(「選択肢コンポーネントの使用方法」を参照)

- 選択ボタン(「選択ボタン・コンポーネントの使用方法」を参照)

- ラジオ・ボタン(「ラジオ・ボタン・コンポーネントの使用方法」を参照)

- リスト・ビュー(「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)

- カルーセル(「カルーセル・コンポーネントの使用方法」を参照)

- フィルム・ストリップ(「フィルム・ストリップ・コンポーネントの使用方法」を参照)

- Verbatim (「Verbatimコンポーネントの使用方法」を参照)

- 出力HTML (「出力HTMLコンポーネントの使用方法」を参照)

- イテレータ(「反復の有効化方法」を参照)

- リフレッシュ・コンテナ (「UIコンポーネントのコンテンツのリフレッシュ方法」を参照)

MAF AMXアプリケーション機能を開発する際は、UIコンポーネントの子として、操作、リスナー・タイプ・コンポーネント、コンバータなど、次のその他のコンポーネントも使用できます。

- アクション・リスナー(「アクション・リスナーの使用方法」を参照)

- プロパティ・リスナーの設定(「プロパティ・リスナーの設定の使用方法」を参照)

- クライアント・リスナー(「クライアント・リスナーの使用方法」を参照)

- 日時の変換(「日時の変換方法」を参照)

- 数値の変換(「数値の変換方法」を参照)

- ナビゲーション・ドラッグ動作(「ドラッグ・ナビゲーションの有効化」を参照)

- ロード・インジケータ動作(「ロード・インジケータの使用方法」を参照)

- システム・アクション動作(「Androidシステムの戻るボタンの動作を構成する方法」を参照)

UIコンポーネントを追加するには、それを「コンポーネント」ウィンドウからMAF AMXページにドラッグ・アンド・ドロップします(「MAF AMXページにUIコンポーネントを追加する方法」を参照)。次に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します(「UIコンポーネントの構成」を参照)。各特定コンポーネントの属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

注意:

MAF AMXページで、レイアウト・コンポーネント内にUIコンポーネントを配置します(「ページ・レイアウトの設計」を参照)。<dvtm>ネームスペースの下で宣言するデータ視覚化コンポーネントを除き、UI要素は<amx>>ネームスペースの下で宣言します。

いくつかのUIコンポーネントにはイベント・リスナーを追加できます。「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSおよびAndroidのどちらのデバイスでもMAF AMXの実行時の記述のためにコンポーネントに適用できますが、それらのリスナーは設計時には何の効果も持ちません。

これらのUIコンポーネントにおけるアクセシビリティのサポートの詳細は、「MAFのアクセシビリティのサポートの理解」を参照してください。

注意:

MAFは、デザインタイムにEL式を評価しません。コンポーネントの属性の値が式に設定されている場合、この値はJDeveloperのプレビューでは式として表示され、実行時のコンポーネントの表示は異なる場合があります。

MAF AMXを使用してiOSプラットフォームとAndroid 4.2以降のプラットフォームの両方に対応して作成されたユーザー・インタフェースは、言語環境が左から右(LTR)、右から左(RTL)のいずれであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。

CompGalleryという名前のMAFサンプル・アプリケーションは、MAF AMX UIコンポーネントの作成方法および構成方法を示しています。UILayoutDemoという名前のもう1つのサンプル・アプリケーションは、MAF AMXページでのコンポーネントのレイアウト方法を示しています。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリのPublicSamples.zipファイル内にあります。

14.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" />

- テキスト・クリア・アイコンを表示します。

<amx:inputText id="inputText1"
label="Label"
showClear="on"
value="text"/>

図14-14に、showClear属性がonに設定されている入力テキストコンポーネントを示します。

図14-14 実行時のinputText

inputType属性によって、コンポーネントでユーザー入力がどのように(テキスト(デフォルト)、電子メール・アドレス、数値、電話番号、URLのいずれかとして)解釈されるのかを定義できます。これらの入力タイプは、HTML5によって許容される値に基づいています。

入力テキスト・コンポーネントに入力される数値の変換や日時の値の変換を有効にするには、数値の変換(「数値の変換方法」を参照)および日時の変換(「日時の変換方法」を参照)コンポーネントを使用できます。

次にその例を示します。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

いくつかのモバイル・デバイスでは、エンド・ユーザーが入力テキスト・フィールドをタップすると、キーボードが表示(スライドアップ)されます。入力テキストがMAF AMXページの唯一のコンポーネントである場合、ページがロードされるときに、デフォルトで入力フォーカスはこのフィールド上に配置され、キーボードが表示されます。

複数行入力テキストは、それが唯一のコンポーネントである場合、セカンダリ・ページに表示されることがあります。その場合、ページがロードされてキーボードが表示されたときに複数行入力テキストがフォーカスを受け取ります。

iOSデバイスとAndroidデバイスでは、入力テキスト・コンポーネントのレンダリングおよび動作は異なります。iPhoneおよびiPadでは、入力テキスト・コンポーネントが表示されるときに境界線がある場合とない場合があります。

入力テキスト・コンポーネントを作成する際は、次の点を考慮してください。

- コンテンツを入力または編集するには、エンド・ユーザーはフィールド内をタップする必要があります。それにより、タップした場所に点滅する挿入カーソルが表示され、エンド・ユーザーがコンテンツを編集できるようになります。フィールドにコンテンツが含まれていない場合、挿入カーソルはフィールドの先頭に配置されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、通常、プロンプトとして使用されるデフォルト・テキストが含まれていることがあります。エンド・ユーザーがそのようなフィールド内でキーボードのキーをタップすると、編集モードになったときにそのデフォルト・テキストがクリアされます。この動作は、入力テキストのhintText属性を使用して有効化および構成されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、選択済の外観はありません。選択は、フィールド内の点滅する挿入カーソルによって示されます。

- エンド・ユーザーがフィールドに収まる数を超えたテキストを入力すると、タイピングの続行に従って一度に1文字ずつテキスト・コンテンツが左にシフトします。

- 複数行入力テキスト・コンポーネントは、任意の高さの長方形としてレンダリングされます。このコンポーネントでは、コンテンツが大きすぎてフィールドの境界内に収まらない場合のスクロールがサポートされています。テキスト領域が一杯になるとテキストの行が上にスクロールし、新しい行のテキストが追加されます。指定された表示領域に表示できる数よりも多くの行がある場合、エンド・ユーザーは上または下にフリックしてテキストの行をスクロールできます。コンポーネント内にスクロールバーが表示されてその領域がスクロール可能であることを示します。

- パスワード・フィールドは入力された各文字を一時的にエコーし、その後、その文字をドットに変換してパスワードを保護します。

- iOSでの入力テキスト・コンポーネントの外観および動作はカスタマイズ可能です(「入力テキスト・コンポーネントのカスタマイズ」を参照)。

- ユーザーが入力したテキストをクリアするためのテキスト・クリア・アイコンを表示するには、図14-14に示すように、showClear属性をonに設定します。showClear属性がoffに設定されている場合は、テキスト・クリア・アイコンは表示されません。showClear属性がautoに設定されている場合は、inputTextの動作が、keyboardDismiss属性に対して設定されている内容と一致するようオーバーライドされます。keyboardDismiss属性がsearchに設定されている場合は、テキスト・クリア・アイコンは表示されます。

14.3.1.1 入力テキスト・コンポーネントのカスタマイズ

MAF AMXは、iOSデバイスでの入力時の先頭大文字化および修正のサポートを提供します。また、フィールドを移動用に使用するか、検索用に使用するかを示すことができます。使用中のオペレーティング・システムとキーボードのバージョンによっては、モバイル・デバイスのソフト・キーパッドの右下にある「return」ボタン(図14-15を参照)の表示が「Go」または「Search」ボタンに変更される場合があります(図14-16を参照)。また、ボタンがアクティブ化されると、単一行入力テキスト・コンポーネントに対して、DataChangeEventがトリガーされます。

図14-15 実行時のiOSデバイスの「Return」ボタン

図14-16 実行時のiOS 7の「Go」および「Search」ボタン

表14-3に、入力テキスト・コンポーネントの属性をリストしますが、これらの属性を使用して、そのコンポーネントの外観および動作と、入力テキストによって表されるフィールドへの値の入力に使用されるソフト・キーパッドをカスタマイズできます。

表14-3 入力テキスト・コンポーネントの入力およびカスタマイズ属性

属性

値

説明

keyboardDismiss

- normal: オペレーティング・システムのデフォルトを使用します。

- go: 動作のトリガーのように動作するフィールドをリクエストします。

- search: 参照をトリガーする検索フィールドのように動作するフィールドをリクエストします。

テキスト・フィールドを使用する方法を示します。

goまたはsearchを指定した場合、キーパッドを終了すると入力があいまいになります。

一部のオペレーティング・システムまたはキーボードでは、キーボードへの特別な処理を行う場合があります。それ以外では視覚的な区別が示されないためです。たとえば、単一行入力テキスト・フィールドについては、「return」ボタンが表示されるかわりに、「Go」または「Search」ボタンに置き換えられます。スキンによって、入力フィールドの外観も変更される場合があります。

autoCapitalize

- auto: オペレーティング・システムのデフォルトを使用します。

- sentences: 入力する文を大文字で始めるようにリクエストします。

- none: 入力に大文字化が自動的に適用されないようにリクエストします。

- words: 入力する単語を大文字で始めるようにリクエストします。

- characters: 入力として入力された各文字が大文字化されるようにリクエストします。

入力テキストによって表されるフィールドの編集中に、iOSで値を大文字表記するための特別な処理をリクエストします。

このプロパティの設定はAndroidには影響しません。

autoCorrect

- auto: オペレーティング・システムのデフォルトを使用します。

- on: 入力の自動修正サポートをリクエストします。

- off: 入力の自動修正の無効化をリクエストします。

入力テキストによって表されるフィールドの編集中に、iOSで値を修正するための特別な処理をリクエストします。

このプロパティの設定はAndroidには影響しません。

iOSデバイスのシミュレータでは、自動大文字化および自動修正のサポートが限定されているため、この機能をiOSデバイスでテストする必要があります。

14.3.2 入力数値スライダ・コンポーネントの使用方法

入力数値スライダ(inputNumberSlider)コンポーネントは、キーを使用して値を入力するかわりにスライダを使用して値の範囲から数値を選択できるようにします。スライダの溝またはトラックの塗り潰されている部分が、現在の値を視覚的に表しています。

スライダの値を数値的に示すには、出力または入力テキスト・コンポーネントとともに入力数値スライダを使用できます。入力テキスト・コンポーネントではスライダ値を直接入力することもできます。エンド・ユーザーが入力テキスト・フィールドをタップすると、数値モードのキーボードがスライドアップします。このキーボードは、スライドダウン・ボタンを使用するか、スライダ・コンポーネントからタップすることにより消去できます。

入力数値スライダ・コンポーネントは、常に、コンポーネントの定義済範囲内の最大値および最小値を表示します。

注意:

入力数値スライダ・コンポーネントは、正確な数値入力が必要な場合や値の範囲が広い場合(たとえば、0から1000)は使用しないでください。

次の例は、MAF AMXファイルで定義されたinputNumberSlider要素を示しています。

<amx:inputNumberSlider id="slider1" value="#{myBean.count}"/>

図14-17は、「プレビュー」ペインに表示されている入力数値スライダ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputNumberSlider id="inputNumberSlider1"
label="Input Number"
minimum="0"
maximum="20"
stepSize="1"
value="10"/>

図14-17 デザインタイムの入力数値スライダ

入力数値スライダ・コンポーネントに入力される数値の変換を有効にするには、数値の変換コンポーネント(「数値の変換方法」を参照)を使用します。

次にその例を示します。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

他のMAF AMX UIコンポーネントと同様に、入力数値スライダ・コンポーネントには通常の状態と選択済状態があります。コンポーネントは、いつでもタッチされたときに選択済状態になります。エンド・ユーザーは、スライダ値を変更するには、タッチしてからスライダ・ボタンを操作します。

入力数値スライダ・コンポーネントには、オプションのimageLeft属性およびimageRight属性があり、これらは、エンド・ユーザーに追加情報を提供するためにスライダのいずれかの側に表示可能なイメージを示します。

14.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}"/>

詳細は、次の項を参照してください。

- W3Cによって定義されているHTML5のグローバル日付と時刻

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.4 出力テキスト・コンポーネントの使用方法

MAF AMXは、テキストを表示するラベルとして使用するための出力テキスト(outputText)コンポーネントを提供しています。

次の例は、MAF AMXファイルで定義されたoutputText要素を示しています。

<amx:outputText id="ot1"
value="output"
styleClass="#{pageFlowScope.pStyleClass}"/>

図14-18は、「プレビュー」ペインに表示されている出力テキスト・コンポーネントを示しています。

図14-18 デザインタイムの出力テキスト

出力テキスト・コンポーネントの数値および日時関連データの変換を容易にするには、数値の変換(「数値の変換方法」を参照)および日時の変換(「日時の変換方法」を参照)コンバータを使用します。

次にその例を示します。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.5 ボタンの使用方法

ボタン(commandButton)コンポーネントは、アクション(たとえば、保存、取消し、送信)をトリガーするため、およびアプリケーション内で他のページへのナビゲーション(たとえば、戻るの場合は「戻るボタン・ナビゲーションの有効化」を参照)を有効化するために使用します。

ボタンは、次の方法のいずれかで使用できます。

- テキスト・ラベル付きボタン。

- テキスト・ラベルおよびイメージ・アイコン付きボタン。

注意:

アイコン・イメージと配置(テキスト・ラベルの左または右)を定義できます。

- イメージ・アイコンのみが付いたボタン(たとえば、レコードを追加または削除するための + および - ボタン)。

MAFでは、次の3つの表示領域に対して1つのデフォルト・ボタン・タイプがサポートされています。

1. 最上部のヘッダー・バーに表示されるボタン。MAF AMXページでは、ヘッダーは、ヘッダー、プライマリおよびセカンダリの各ファセットと組み合せたパネル・ページ・コンポーネント(「パネル・ページ・コンポーネントの使用方法」を参照)によって表されます(iPhoneではこれが一般的です)。

- ヘッダー・ファセットには、ページ・タイトルが含まれています。

- プライマリ・アクション・ファセットは、 ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセットは、ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

2. ページのコンテンツ領域に表示されるボタン。

3. ページのフッター・バーに表示されるボタン。MAF AMXページでは、フッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(「パネル・ページ・コンポーネントの使用方法」を参照)。

- フッター・ファセットは、コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

どのタイプでも、すべてのボタン・コンポーネントには次の3つの状態があります。

1. 標準。

2. アクティブ: ボタンがエンド・ユーザーによってタップまたはタッチされたときの外観を表します。ボタンがタップされた(タッチされてリリースされた)ときに、ボタン・アクションが実行されます。タッチしたときにアクティブ化された外観が表示され、リリースしたときにアクションが実行されます。エンド・ユーザーがボタンにタッチした後に指をドラッグしてボタンから離した場合、アクションは実行されません。ただし、ボタンにタッチしている間中、アクティブ化された外観が表示されます。

3. 無効。

ボタン・コンポーネントの外観は、adfmf-commandButton-<style>に設定したそのstyleClass属性によって定義されます。表14-4に示すどのスタイルでも、MAF AMXページ内の有効な任意の場所に配置されているボタンに適用できます。

表14-4 主なボタン・スタイル

ボタン・スタイル名

説明

デフォルト

次の場所に配置されているボタンのデフォルト・スタイル

- いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)内。「デフォルト・スタイル・ボタンの表示」を参照してください。

- MAF AMXページのコンテンツ領域内の任意の場所。このスタイルは、ページ内のボタンの場所またはコンテキストに基づいてそのページ内で特定のアクションを実行するためのボタンに対して使用されます。

戻る

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)に配置されるボタンの戻るスタイル。このスタイルを、デフォルト・ボタンに適用すると、ページに戻るという外観を表示できます。このボタン・スタイルは、Springboardに戻るまたはページに戻るボタンによく使用されます。

「戻るスタイル・ボタンの表示」を参照してください。

強調表示

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)またはMAF AMXページのコンテンツ領域に配置されるボタンの強調表示スタイル。このスタイルをボタンに追加すると、保存(または完了)ボタンで一般的なiPhoneボタンの外観を提供できます。

「強調表示スタイル・ボタンの表示」を参照してください。

アラート

アラート・スタイルは削除の外観をボタンに追加します。「アラート・スタイル・ボタンの表示」を参照してください。

ボタンに適用して太い角丸の境界線でボタンを修飾できる角丸スタイル(adfmf-commandButton-rounded)があります(図14-19を参照)。このスタイルは他のどのようなスタイルとも組み合せて定義できます。

図14-19 デザインタイムの角丸ボタン

MAF AMXには、多数の追加の装飾スタイルが用意されています(「追加のボタン・スタイルの使用」参照)。

MAF AMXでのボタン・コンポーネントの子の操作および属性の処理には、特定の順序があります。「操作と属性の処理順序に関する必知事項」を参照してください。

14.3.5.1 デフォルト・スタイル・ボタンの表示

「パネル・ページ」ファセットまたはコンテンツ領域内に配置可能な様々なデフォルト・スタイル・ボタンを次に示します。

- テキスト・ラベルのみが付いた「標準」、「アクティブ」または「無効」の各ボタン。

- イメージ・アイコンのみが付いた「標準」、「アクティブ」または「無効」の各ボタン。

次の例は、MAF AMXファイルで宣言されているcommandButton要素を示しています。この要素は、テキスト・ラベルの付いたデフォルトのボタンを表します。

<amx:panelPage id="pp1">
<amx:facet name="primary">
<amx:commandButton id="cb1"
text="Cancel"
action="cancel"
actionListener="#{myBean.rollback}"/>
</amx:facet>
</amx:panelPage>

次の例も、MAF AMXファイルで宣言されたcommandButton要素を示しています。この要素は、イメージ・アイコンの付いたデフォルトのボタンを表します。

<amx:panelPage id="pp1">
<amx:facet name="primary">
<amx:commandButton id="cb1"
icon="plus.png"
action="add"
actionListener="#{myBean.AddItem}"/>
</amx:facet>
</amx:panelPage>

次の例は、パネル・ページのフッター・ファセット内で宣言されているcommandButton要素を示しています。この要素は、テキスト・ラベルとイメージ・アイコンの付いたデフォルトのボタンを表します。

<amx:panelPage id="pp1">
<amx:facet name="footer">
<amx:commandButton id="cb2"
icon="folder.png"
text="Move (#{myBean.mailcount})"
action="move"/>
</amx:facet>
</amx:panelPage>

次の例は、パネル・ページのコンテンツ領域の一部で宣言されているcommandButton要素を示しています。この要素は、テキスト・ラベルの付いたデフォルトのボタンを表します。

<amx:panelPage id="pp1">
<amx:commandButton id="cb1"
text="Reply"
actionListener="#{myBean.share}"/>
</amx:panelPage>

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.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によって戻る矢印スタイル設定が自動的に適用されます(図14-20参照)。

図14-20 デザインタイムの戻るボタン

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.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>

図14-21 デザインタイムの強調表示ボタン

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.5.4 アラート・スタイル・ボタンの表示

「パネル・ページ」内に配置されるアラート・スタイル・ボタンには、「標準」、「アクティブ」または「無効」の状態があります。

次の例は、MAF AMXファイルで宣言されているcommandButton要素を示しています。この要素は、テキスト・ラベルの付いたアラート・ボタンを表します。

<amx:commandButton id="cb1"
text="Delete"
actionListener="#{myBean.delete}"
styleClass="adfmf-commandButton-alert" />

図14-22 デザインタイムのアラート・ボタン

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.5.5 追加のボタン・スタイルの使用

MAF AMXには、次の追加のボタン・スタイルが用意されています。

- 暗いスタイル

- 明るいスタイル

- 小さいスタイル

- 大きいスタイル

- 強調表示スタイル

- 確認スタイル

- 2種類の「代替」スタイル

図14-23 追加のボタン・スタイル

14.3.5.6 アプリケーション内でのボタンの使用方法

MAFアプリケーションでは、次のコンテキスト内でボタン・コンポーネントを使用できます。

- ナビゲーション・バー

- 特定のアクションを実行するためのコンテンツ領域

- アクション・シート

- ポップアップスタイルのアラート・メッセージ

14.3.5.6.1 ナビゲーション・バー

MAFでは、ナビゲーション・バーで使用する標準ボタンを作成できます。

- 編集ボタンで、エンド・ユーザーは編集またはコンテンツ操作モードに入ることができます。

- 取消ボタンで、エンド・ユーザーは、変更を保存することなく編集またはコンテンツ操作モードを終了できます。

- 保存ボタンで、エンド・ユーザーは、変更を保存して編集またはコンテンツ操作モードを終了できます。

- 完了ボタンで、エンド・ユーザーは、変更があれば保存して現在のモードを終了できます。

- 元に戻すボタンで、エンド・ユーザーは最後のアクションを元に戻すことができます。

- やり直しボタンで、エンド・ユーザーは最後の元に戻したアクションをやり直すことができます。

- 戻るボタンで、エンド・ユーザーはSpringboardに戻ることができます。

- ページに戻るボタンで、エンド・ユーザーはボタン・テキスト・ラベルによって識別されるページに戻ることができます。

- 追加ボタンで、エンド・ユーザーは新しいオブジェクトを追加または作成できます。

14.3.5.6.2 コンテンツ領域

ページのコンテンツ領域内に配置されたボタンは、そのページ内のボタンの場所およびコンテキストに指定されている特定のアクションを実行します。これらのボタンは、ナビゲーション・バーに配置されているボタンとは異なる外観を持っている場合があります。

14.3.5.6.3 アクション・シート

アクション・シート内に配置されるボタンの例には、「ノートの削除」ボタンおよび「取消」ボタンのグループがあります。

アクション・シート・ボタンでは、表示の幅が拡張されます。

14.3.5.6.4 アラート・メッセージ

「OK」ボタンは、パスワード入力に失敗した後のログイン検証などの検証メッセージ内に配置できます。

14.3.5.7 戻るボタン・ナビゲーションの有効化

MAF AMXでは、前に訪問したページに戻るデフォルト動作を持つ戻るボタンを使用した移動がサポートされています。「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

__backナビゲーションを備えたパネル・ページのプライマリ・ファセットにボタン・コンポーネントを追加すると、そのボタンには、戻る矢印の視覚的スタイリングが自動的に設定されます(「戻るスタイル・ボタンの表示」を参照)。スタイル設定を無効にするには、styleClass属性をamx-commandButton-normalに設定します。

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.5.8 操作と属性の処理順序に関する必知事項

ボタン、リンク、リスト・アイテムなどのコンポーネントがアクティブになっている場合に、MAF AMXによって操作および属性が処理される順序は、次のとおりです。

1. 次の子操作は、XMLファイルに表示される順序で処理されます。

- プロパティ・リスナーの設定

- アクション・リスナー

- ポップアップ表示動作

- ポップアップを閉じる動作

2. アクション・リスナー(actionListener)属性が処理されて関連付けられたJavaメソッドが起動されます。

3. アクション(action)属性が処理されて、ナビゲーション・ケースがあればそれに従います。

14.3.6 リンクの使用方法

リンク(commandLink)コンポーネントは、アクションをトリガーするためおよび他のビューへのナビゲーションを有効化するために使用します。

リンク・コンポーネントは、その子として任意のタイプのコンポーネントを定義できます。プロパティ・リスナーの設定(「プロパティ・リスナーの設定の使用方法」を参照)、アクション・リスナー(「アクション・リスナーの使用方法」を参照)、ポップアップ表示動作、ポップアップを閉じる動作(「ポップアップ・コンポーネントの使用方法」を参照)および検証動作(「入力の検証」を参照)などのコンポーネントをリンク・コンポーネントの子として使用することで、クリックおよびジェスチャーを実行できるアクション可能な領域を作成できます。

リンク内にイメージ・コンポーネントを配置することで(「イメージの表示方法」を参照)、クリック可能イメージを作成できます。

次の例は、MAF AMXファイルで宣言された基本的なcommandLink要素を示しています。

<amx:commandLink id="cl1"
text="linked"
action="gotolink"
actionListener="#{myBean.doSomething}"/>

図14-24は、「プレビュー」ペインに表示されている基本的なリンク・コンポーネントを示しています。

図14-24 デザインタイムのリンク

次の例は、MAF AMXファイルで宣言されたcommandLink要素を示しています。このコンポーネントは、panelFormLayoutコンポーネントおよびpanelLabelAndMessageコンポーネント内に配置されます。

<amx:panelPage id="pp1">
<amx:panelFormLayout id="form">
<amx:panelLabelAndMessage id="panelLabelAndMessage1" label="Label">
<amx:commandLink id="cl1"
text="linked"
action="gotolink"
actionListener="#{myBean.doSomething}"/>
</amx:panelLabelAndMessage>
</amx:panelFormLayout>
</amx:panelPage>

図14-25は、フォーム内に配置され、「プレビュー」ペインに表示されているリンク・コンポーネントを示しています。

図14-25 デザインタイムのフォーム内リンク

MAF AMXでのリンク・コンポーネントの子の操作および属性の処理には、特定の順序があります。「操作と属性の処理順序に関する必知事項」を参照してください。

MAF AMXでは、リンクと類似していますが、ページ間のナビゲーションは許可されない別のコンポーネントであるリンク(実行) (goLink)コンポーネントが提供されています。このコンポーネントを使用して、外部ページへのリンクを有効化できます。図14-26は、「プレビュー」ペインに表示されているリンク(実行)コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:goLink id="goLink1"
text="Go Link"
url="http://example.com"/>

図14-26 デザインタイムのリンク(実行)

イメージは、リンク(実行)コンポーネントの子として指定できる唯一のコンポーネントです。

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.7 イメージの表示方法

MAF AMXでは、ビットマップによって表されるイメージ(image)コンポーネントを使用して、iOSおよびAndroidデバイス上にイメージを表示できます。

ボタンおよびリスト・ビューにイメージを配置するだけでなく、それをリンク・コンポーネント内に配置して(「リンクの使用方法」を参照)クリック可能イメージを作成できます。

次の例は、MAF AMXファイルのimage要素定義を示しています。

<amx:image id="i1"
styleClass="prod-thumb"
source="images/img-big-#{pageFlowScope.product.uid}.png" />

イメージ・ファイルのURIに加えて、ソースには、REST Webサービスからロードされたイメージに必要なbase 64でエンコードされたイメージ・データを含めることができます。data:image/gif;base64,接頭辞を使用して、このようなイメージのソースを定義し、image要素のsource属性を次のように設定します。

<amx:image id="i2" source="data:image/gif;base64,#{row.ImageBase64}" />

GIFファイルに提供される値は、イメージ・タイプによって異なります。

Androidプラットフォームでサポートされているフォーマットは次のとおりです。

- GIF

- JPEG

- PNG

- BMP

iOSプラットフォームでサポートされているフォーマットは次のとおりです。

- PNG

例については、次を参照してください。

開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.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}"/>

図14-27は、「プレビュー」ペインに表示される選択解除されたチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="false"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図14-27 デザインタイムの選択解除されたチェックボックス

「プレビュー」ペインに表示される選択済のチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="true"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図14-28 選択済のチェックボックスの定義

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.8.1 iOSプラットフォームでのチェックボックス・コンポーネントのサポート

iOSでは、ネイティブ・チェックボックス・コンポーネントはサポートされていません。ブール・スイッチは、通常、プロパティ・ページで使用され、ブール選択を可能にします(「ブール・スイッチ・コンポーネントの使用方法」を参照)。

14.3.8.2 Androidプラットフォームでのチェックボックス・コンポーネントのサポート

Androidでは、ネイティブ・チェックボックス・コンポーネントがサポートされています。このコンポーネントは、設定ページで広く使用され、個々の設定値のオンとオフを切り替えます。

14.3.9 チェックボックスを複数選択コンポーネントの使用方法

チェック・ボックスを複数選択(selectManyCheckbox)コンポーネントは、trueまたはfalseの値の複数選択を可能にするために使用するチェック・ボックスのグループを表します。これにより、グループ内の各チェックボックスの選択済と選択解除の切替えが可能になります。この選択メカニズムは、チェック・ボックスを複数選択コンポーネントに含まれている、アイテムの選択コンポーネント(「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

チェックボックスの複数選択コンポーネントには、アイテムの選択コンポーネントを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>

図14-29は、「プレビュー」ペインに表示されているチェックボックスを複数選択コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectManyCheckbox id="selectManyCheckbox1"
label="Select Many Checkbox"
value="value2"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Selection 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Selection 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Selection 3" value="value3"/>
</amx:selectManyCheckbox>

図14-29 デザインタイムのチェックボックスを複数選択

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.9.1 チェックボックスを複数選択コンポーネントとユーザーとの対話に関する必知事項

MAF AMXでは、ポップアップ・スタイル(デフォルト)とリスト・スタイル(使用可能な選択肢の数がデバイスの画面サイズを超えている場合に使用される)の、チェックボックスを複数選択コンポーネントを表示するための2つの代替方法が提供されています。

iPhoneとiPadの両方でのポップアップスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストがポップアップに表示されます。選択を行うには、エンド・ユーザーは1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーはポップアップの外をタップするか、閉じるボタン( x )を使用してポップアップを閉じます。

ポップアップを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

選択肢の数がデバイスのサイズを超える場合、スクロール可能なリスト・ビュー(「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)を含むフルページ・ポップアップが生成されます。

iPhoneとiPadの両方でのリストスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照し、1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーは閉じるボタン( x )をタップします。

リストを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

注意:

どちらの場合も、選択を取り消すメカニズムは提供されていません。

14.3.10 選択肢コンポーネントの使用方法

選択肢(selectOneChoice)コンポーネントは、リストからの単一の値の選択を可能にするために使用するコンボ・ボックスを表します。この選択メカニズムは、選択肢コンポーネントに含まれている、アイテムの選択コンポーネント(「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

選択肢コンポーネントには、アイテムの選択コンポーネントを1つ以上含めることができます。

次の例は、MAF AMXファイルのselectOneChoice要素の定義をselectItemsサブ要素とともに示しています。

<amx:selectOneChoice id="choice1"
label="Your state:"
value="#{myBean.myState}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Alaska" value="AK"/>
<amx:selectItem id="selectItem2" label="Alabama" value="AL"/>
<amx:selectItem id="selectItem3" label="California" value="CA"/>
<amx:selectItem id="selectItem4" label="Connecticut" value="CT"/>
</amx:selectOneChoice>

<amx:selectOneChoice id="choice1"
label="Your state:"
value="#{myBean.myState}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItems id="selectItems1" value="myBean.allStates"/>
</amx:selectOneChoice>

図14-30は、「プレビュー」ペインに表示されている選択肢コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneChoice id="selectOneChoice1"
label="Choice"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneChoice>

図14-30 デザインタイムの選択肢

selectOneChoice要素の初期値はnullにできません。かわりに、選択肢を1つ選択コンポーネントに表示された値に設定する必要があります。これを行うには、必ず、モデル(Beanまたはバインディング)の値を、JDeveloperのデザインタイムで表示されるデフォルト値と同一にする必要があります。

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.10.1 iOSプラットフォームでの選択肢コンポーネントとユーザーとの対話に関する必知事項

MAF AMXでは、選択肢コンポーネントを表示するため、ポップアップ・スタイルとドロップダウン・スタイルの2つの代替方法が提供されています。

iPhoneでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、選択肢のリストが、デフォルトで最初のオプションが選択された状態で表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照します。選択内容を保存するには、エンド・ユーザーはツール・バーの「終了」をタップします。

iPadでは、ユーザーの対話は、次の点を除いてiPhoneにおける対話と同様です。

- 選択のリストは、ポップアップ・ダイアログに表示されます。

- iPadのスタイリングが選択のリストの周囲に実装され、リストのソースを示すためにノッチが使用されます。

アイテムを選択しないで選択のリストを閉じるには、エンド・ユーザーはポップアップ・ダイアログの外をタップする必要があります。

注意:

選択のリストおよびツール・バーを表示するためのUIは、ブラウザにネイティブであり、CSSを使用してスタイリングすることはできません。

選択肢コンポーネント内のリスト値は、無効として表示できます。

選択肢の数がデバイスの表示サイズを超える場合、ネイティブな方法でスクロール可能なリスト・ページが生成されます。

14.3.10.2 Androidプラットフォームでの選択肢コンポーネントとユーザーとの対話に関する必知事項

Androidデバイスでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、ポップアップ・ダイアログ形式の選択肢のリストが表示されます。選択肢の数がデバイスのサイズ内に収まる場合は単純なポップアップが表示されます。この場合次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- ポップアップの外で1回タップするか戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

表示される選択肢の数がデバイス・サイズ内に収まらない場合は、ポップアップにスクロール可能リストが含まれます。その場合は次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- 戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

14.3.10.3 アイテムの選択コンポーネントの違いに関する必知事項

アイテムの選択(selectItems)コンポーネントは、複数選択コンポーネントと単一選択コンポーネントの両方で選択できるオブジェクトのリストを提供します。

アイテムの選択(selectItem)コンポーネントは、選択コンポーネントの単一選択可能なアイテムを表しています。

14.3.11 選択肢を複数選択コンポーネントの使用方法

選択肢を複数選択(selectManyChoice)コンポーネントは、リストの複数の値の選択を可能にします。この選択メカニズムは、チェック・ボックスを複数選択コンポーネントに含まれている、アイテムの選択コンポーネント(「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

チェックボックスを複数選択コンポーネントには、アイテムの選択コンポーネントを1つ以上含めることができます。

次の例は、MAF AMXファイルで宣言されたselectManyChoice要素を示しています。このコンポーネントは、アイテムの選択(selectItem)コンポーネントを子として使用します。

<amx:selectManyChoice id="check1"
label="Select Option:"
value="#{myBean.shipping}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1"
label="Signature Required"
value="signature" />
<amx:selectItem id="selectItem2"
label="Insurance"
value="insurance" />
<amx:selectItem id="selectItem3"
label="Delivery Confirmation"
value="deliveryconfirm"/>
</amx:selectManyChoice>

図14-31 デザインタイムの選択肢を複数選択

<amx:selectManyChoice id="check1"
label="Select Shipping Options:"
value="#{myBean.shipping}">
<amx:selectItems id="selectItems1" value="#{myBean.shippingOptions}"/>
</amx:selectManyChoice>

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

すべてのサポートされているデバイスで、「選択肢を複数選択」コンポーネントの外観と動作は、「チェックボックスを複数選択」コンポーネントとほとんど同じです(「チェックボックスを複数選択コンポーネントの使用方法」を参照)。

14.3.12 ブール・スイッチ・コンポーネントの使用方法

ブール・スイッチ(selectBooleanSwitch)コンポーネントは、チェックボックスのかわりのスイッチ・メタファーとしてのブール値の編集を可能にします。

他のMAF AMX UIコンポーネントと同様に、このコンポーネントには標準および選択済の状態があります。値を切り替えるには、エンド・ユーザーはスイッチを1回タップ(タッチしてリリース)します。タップするたびにスイッチが切り替わります。

次の例は、MAF AMXファイルで定義されたselectBooleanSwitch要素を示しています。

<amx:selectBooleanSwitch id="switch1"
label="Flip switch:"
onLabel="On"
offLabel="Off"
value="#{myBean.bool1}"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図14-32は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanSwitch id="selectBooleanSwitch1"
label="Switch"
value="value1"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図14-32 デザインタイムのブール・スイッチ

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.12.1 iOSプラットフォームでのブール・スイッチ・コンポーネントのサポートに関する必知事項

iOSでは、プール・スイッチ・コンポーネントは、属性値を有効化または無効化するために設定ページでよく使用されます。

14.3.12.2 Androidプラットフォームでのブール・スイッチ・コンポーネントのサポートに関する必知事項

Androidプラットフォームでは、ブール・スイッチ・コンポーネントは直接サポートされていません。かわりに、Androidでは、タップすると選択済状態と選択解除状態が切り替わるトグル・ボタンが提供されています。

14.3.13 選択ボタン・コンポーネントの使用方法

選択ボタン(selectOneButton)コンポーネントは、常に1つのボタンがアクティブになっている、アクションをリストするボタン・グループを表します。この選択メカニズムは、選択ボタン・コンポーネントに含まれている、アイテムの選択コンポーネント(「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

選択ボタン・コンポーネントには、アイテムの選択コンポーネントを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>

図14-33は、「プレビュー」ペインに表示されている選択ボタン・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneButton id="selectOneButton1"
label="Select Button"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneButton>

図14-33 デザインタイムの選択ボタン

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.14 ラジオ・ボタン・コンポーネントの使用方法

ラジオ・ボタン(selectOneRadio)コンポーネントは、使用可能な選択肢をリストするラジオ・ボタンのグループを表します。この選択メカニズムは、ラジオ・ボタン・コンポーネントに含まれている、アイテムの選択コンポーネント(「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

ラジオ・ボタン・コンポーネントには、アイテムの選択コンポーネントを1つ以上含めることができます。

次の例は、MAF AMXファイルのselectOneRadio要素定義を示しています。このコンポーネントは、アイテムの選択(selectItems)コンポーネントをその子として使用します。

<amx:selectOneRadio id="radio1"
label="Choose a pet:"
value="#{myBean.myPet}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Cat" value="cat"/>
<amx:selectItem id="selectItem2" label="Dog" value="dog"/>
<amx:selectItem id="selectItem3" label="Hamster" value="hamster"/>
<amx:selectItem id="selectItem4" label="Lizard" value="lizard"/>
</amx:selectOneRadio>

次の例も、MAF AMXファイルのselectOneRadio要素定義を示しています。このコンポーネントは、アイテムの選択(selectItems)コンポーネントをその子として使用します。

<amx:selectOneRadio id="radio1"
label="Choose a pet:"
value="#{myBean.myPet}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItems id="selectItems1" value="myBean.allPets"/>
</amx:selectOneRadio>

図14-34は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneRadio id="selectOneRadio1"
label="Radio Button"
value="value1"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItem id="selectItem1" label="Value 1" value="value1"/>
<amx:selectItem id="selectItem2" label="Value 2" value="value2"/>
<amx:selectItem id="selectItem3" label="Value 3" value="value3"/>
</amx:selectOneRadio>

図14-34 デザインタイムのラジオ・ボタン

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.15 リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法

リスト・ビュー(listView)・コンポーネントを使用して、エンド・ユーザーが1つのオプションを選択できる選択肢のリストとしてデータを表示します。

通常、リスト・アイテム(listItem)・コンポーネントは、リスト・ビュー・コンポーネント内の1つのアイテムを表しており、リスト・アイテム・コンポーネントをリスト・ビュー内に配置して、データ・アイテムのリストのレイアウト設定またはスタイル設定をします。各アイテムは複数のリスト・アイテム・コンポーネントを含むことができ、この場合、リスト・アイテム・コンポーネントはアイテム(行)を満たし、過剰なリスト・アイテム・コンポーネントは後続行に折り返します。これを構成するには、リスト・ビューのlayout属性をcardsに設定します(デフォルトのレイアウトはrowsであり、リスト内の1つのアイテム当たり1つのリスト・アイテム・コンポーネントが表示されます)。「リスト・ビュー・レイアウトの構成」を参照してください。

リスト・ビューによって、次のうち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>

図14-35は、デザインタイムの基本リスト・ビュー・コンポーネントを示しています。

図14-35 デザインタイムの基本リスト・ビュー

次の例は、MAF AMXファイルでのlistView要素の別の定義を示しています。この定義も基本コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

<amx:listView id="list1"
value="#{myBean.listCollection}"
var="row"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem actionListener="#{myBean.selectRow}"
showLinkIcon="false"
id="listItem1">
<amx:outputText value="#{row.name}" id="outputText1"/>
</amx:listItem>
</amx:listView>

注意:

現在は、リスト・アイテム内の出力テキストに含まれるテキスト文字列が長すぎて1行に収まらない場合、そのテキストは行の端で折り返されません。この動作を回避するには、件名の出力テキスト子コンポーネントのinlineStyle属性に、"white-space: normal;"を追加します。

- アイコン付きリスト
次の例は、MAF AMXファイルで定義されたlistView要素を示しています。この定義は、アイコン付きコンポーネントに対応しています。

<amx:listView id="list1"
value="#{myBean.listCollection}"
var="row"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="listItem1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf11" width="40px" halign="center">
<amx:image id="image1" source="#{row.image}"/>
</amx:cellFormat>
<amx:cellFormat id="cf12" width="100%" height="43px">
<amx:outputText id="outputText1" value="#{row.desc}"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図14-36は、デザインタイムのアイコンおよびテキスト付きリスト・ビュー・コンポーネントを示しています。

図14-36 デザインタイムのアイコン付きリスト・ビュー

- 検索付きリスト

- 区切り付きリスト。このタイプのリストでは、データをグループ化して順序を示すことができます。リスト・ビュー・コンポーネントの属性によって、各区切りの特性が定義されます。
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までの文字が有効になります。その他の文字は、行がさらにロードされるとインデクサに表示されます。

表14-5は、インデックス・ユーティリティに定義可能なスタイルを示しています。

表14-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>

図14-37は、デザインタイムの凹枠リスト・ビュー・コンポーネントを示しています。

図14-37 デザインタイムの凹枠リスト・ビュー

次の例は、MAF AMXファイルでのlistView要素の別の定義を示しています。この定義も凹枠コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

<amx:listView id="list1"
value="#{CarBean.carCollection}"
var="row"
styleClass="adfmf-listView-insetList"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
fetchSize="10">
<amx:listItem id="li1" action="go">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:listItem>
</amx:listView>

MAF AMXでのリスト・アイテム・コンポーネントの子の操作および属性の処理には、特定の順序があります。「操作と属性の処理順序に関する必知事項」を参照してください。

他のMAF AMXコンポーネントとは異なり、リスト・ビューをMAF AMXページにドラッグ・アンド・ドロップすると、「ListViewギャラリ」というダイアログが表示されます(図14-38を参照)。このダイアログでリスト・ビューに対して特定のレイアウトを選択できます。

図14-38 「ListViewギャラリ」ダイアログ

表14-6は、「ListViewギャラリ」に表示される、サポートされるリスト・フォーマットを示しています。

表14-6 リスト・ビュー・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」(図14-38を参照)は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表(図14-39を参照)に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルト値の「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプション(図14-38を参照)では、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログ(図14-39を参照)の状態は変更されません。影響するのは、生成されるMAF AMXマークアップのみです。

- 凹枠リストのあるスタイルを選択すると、生成されたMAF AMXマークアップのlistView要素にadfmf-listView-insetListスタイル・クラスが設定されます。

凹枠リストのある「シンプル」フォーマットの例を次に示します。

<amx:listView var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
styleClass="adfmf-listView-insetList"
id="listView2"
showMoreStrategy="autoScroll"
bufferStrategy="viewport">
<amx:listItem id="li2">
<amx:outputText value="#{row.employeename}" id="ot3"/>
</amx:listItem>
</amx:listView>

「ListViewギャラリ」の「説明」ペインは、現在選択されているバリエーションに基づいて更新されます。フォーマットには、メイン・スタイルの簡単な説明が示され、その後に選択したバリエーションの詳細が続きます。4つのメイン・スタイルに、それぞれ4つのバリエーションがあり、表14-7に示す16の固有の説明が提供されています。

表14-7 リスト・ビューのバリエーションとスタイル

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドがリスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドがリスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「ListViewギャラリ」で選択し、「OK」をクリックすると、「リスト・ビューの編集」ウィザードが起動されます。それを使用して、リスト・アイテム子コンポーネントに静的テキストを表示するバインドなしリスト・ビュー・コンポーネント(図14-39を参照)を作成するか、または動的バインディングのデータソースを選択(図14-40を参照)できます。

図14-39 バインドなしリスト・ビューの作成

図14-39に示すダイアログに入力する際は、次の点を考慮してください。

- 「リスト・データ・コレクション」および「要素タイプ」フィールドは、「データのバインド」チェックボックスが選択解除された状態のときは無効化されています。

- 左側にあるイメージは、選択されているリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映しています。

- 「値」列の編集可能セルには、静的テキスト文字列が移入されます(表14-8を参照)。

- 「リスト・アイテム・コンテンツ」セルにイメージが含まれている場合、「値」セルはデフォルトで<add path to your image>文字列になります。この場合、それをイメージのパスに置き換える必要があります。

- 「リスト・アイテム選択」は選択モードを示します。詳細は、図13-79でこのオプションの説明を参照してください。

- リスト・ビューに、データがバインドされているのではなく、リスト・アイテム子コンポーネントが含まれている場合、区切り属性を設定できないため、「区切り属性」と「区切りモード」の両方のフィールドは無効化されています。

表14-8 リスト・ビューの静的テキスト文字列

リスト・フォーマット

要素行の値

出力テキストの値

シンプル

- テキスト

- 'ListItemテキスト'

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

- 'メイン・テキスト'

- 'これは従属テキストです。'

開始-終了

- 開始テキスト

- 終了テキスト

- '開始テキスト'

- '終了テキスト'

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

- '上部の開始テキスト'

- '上部の終了テキスト'

- '下部の開始テキスト'

- '下部の終了テキスト'

図14-40は、リスト・ビュー・コンポーネントをデータにバインドすることを選択した場合の「リスト・ビューの作成」ダイアログを示しています。

図14-40 バインド済リスト・ビューの作成

図14-40に示すダイアログに入力する際は、次の点を考慮してください。

- 「データのバインド」チェック・ボックスを選択した場合、「リスト・データ・コレクション」フィールドが有効になります。式ビルダーを使用して「リスト・データ・コレクション」フィールドにEL式を設定した場合、「要素タイプ」フィールドが有効になります。データ・コントロール定義タブからデータ・コントロールを選択すると、「要素タイプ」フィールドは無効なままになります。

- データソースを選択するには、「参照」をクリックします。これによって「リスト・ビュー・データ・コレクションの選択」ダイアログが開きます。そこで、データ・コントロール定義を選択するか(図14-41を参照)、ELビルダーを使用して適切なEL式を選択できます(図14-42を参照)。

図14-41 データ・コントロール定義の選択

図14-42 EL式の選択

- 「要素タイプ」フィールドを使用してデータ・コレクションのタイプを宣言できます(図14-40を参照)。

- 有効なデータ・コレクションを選択すると、「リスト・アイテム・コンテンツ」表の「値」列が「値バインディング」に変更され、その編集可能なセルにはデータ・コレクションから属性のリストが移入されます。特別な場合の設定の説明は、図14-43を参照してください。

- 左側のイメージは、選択したリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映し、略図から基礎となる表の名前付き要素へのマッピングを提供します。

- リスト・アイテムは、その特定要素に対してどちらが適切であるかによって、出力テキストまたはイメージ・コンポーネントのいずれかとして生成されます。

- 要素(行)数は選択したリスト・ビュー・フォーマットであらかじめ決まっているため、行を追加または削除することはできません。

- 要素の順序は変更できません。

- 「区切り属性」フィールドのデフォルト値は「区切りなし」であり、この場合、「区切りモード」フィールドは無効です。デフォルト以外の値を選択する場合は、「区切りモード」パラメータを指定する必要があります。さらに、「ListViewギャラリ」で区切りを含むバリエーションを選択した場合、デフォルト値はリストの最初の属性に設定されます。

バインド済リスト・ビューを作成するときに考慮する特殊な場合は次のとおりです。

- Java Beanメソッドによって汎用性がないリストが戻される場合、図14-40に示すように「要素タイプ」フィールドを使用して、リスト・アイテム・コンテンツを作成する必要があります。

- 入力されているリスト・データ・コレクション値がコレクションベースではない場合、図14-43に示すように、「値」列が空白の値を持つ「値バインディング」列に置換されます。

図14-43 非コレクションベース値の入力

詳細は、次の項を参照してください。

- リスト・ビュー・レイアウトの構成

- コレクションのドラッグ・アンド・ドロップ

- 開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGalleryおよびUILayoutDemo。これらのサンプルは、様々なタイプのリスト・ビュー・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。

14.3.15.1 ページングおよび動的スクロールの構成

リスト・ビュー・コンポーネントを構成して、任意の長さのリストにデータを表示するには、ユーザー・ジェスチャーによる要求に応じて、リストの下部にデータを追加します。

fetchSize属性によって、リスト・ビュー・コンポーネントが最初にロードする行数が決定されます。maxRows属性は、表示するリスト・アイテムの最大数を指定します。maxRows属性で定義されているよりも多くの使用可能な行がある場合、リスト・ビューでは特定のユーザー・ジェスチャーを待ってから、さらに行をロードして表示します(「リスト・ビューのスクロール方法」を参照)。fetchSize属性は、ユーザーがさらに行を表示するジェスチャーを実行するたびにロードおよび表示される行数を決定する場合にも使用されます。

fetchSize属性が-1に設定されており、maxRows属性の値を指定していない場合は、すべてのレコードの取得と表示が行われるため、ページングも動的スクロール動作も発生しません。

「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグしてリスト・ビュー・コンポーネントが作成されると、fetchSize属性はデフォルトでPageDefイテレータのrangeSizeを指すEL式を使用するように設定され、これを変更することはできません。詳細は、次の項を参照してください。

- バインディング・コンテナを参照する方法

- 生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項

- 図13-85

次の例は、データ・コントロールのtestResultsというコレクションから作成されたlistView要素を示しています(「MAF AMXページへのデータ・コントロールの追加方法」を参照)。

<amx:listView var="row"
value="#{bindings.testResults.collectionModel}"
fetchSize="#{bindings.testResults.rangeSize}">

前述の例では、fetchSize属性はbindings.testResultsのrangeSizeを指しています。次の例は、このMAF AMXページのPageDefファイルの行を示しています。このPageDefファイルには、testResultsかバインドされるtestResultsIteratorというaccessorIterator要素が含まれています。

<accessorIterator MasterBinding="Class1Iterator"
Binds="testResults"
RangeSize="25"
DataControl="Class1"
BeanClass="mobile.Test"
id="testResultsIterator"/>

そのinitialScrollRowKeys属性を使用して、自己スクロール可能なリスト・ビューの初期スクロール位置を指定できます(つまり、リスト・ビューは独自のスクロールを提供します。詳細は、「リスト・ビューの独自のスクロール」を参照してください)。便利なことに、次の例に示すように、この属性値はselectedRowKeys属性の値と同じEL式で設定できます。

<amx:listView id="lv1"
var="row"
value="#{bindings.departments.collectionModel}"
fetchSize="25"
inlineStyle="height: 200px"
selectedRowKeys="#{bindings.departments.collectionModel.selectedRow}
selectionListener="#{bindings.departments.collectionModel.makeCurrent}"
initialScrollRowKeys="#{bindings.departments.collectionModel.selectedRow}">
<amx:listItem id="li1">
<amx:outputText id="ot1" value="#{row.name} #{row.id}"/>
</amx:listItem>
</amx:listView>

最初の行セットが表示されるときに、MAFによってスクロール位置が割り当てられるため、指定した行のキーがフェッチされている行の最初のセットの一部であることを確認する必要があります。

また、List Viewコンポーネントは、noneに設定されているとき、エンド・ユーザーがコンポーネントをレンダリングするAMXページに戻るときに、MAFがList Viewコンポーネントの以前の状態を適用しないようにするpreserveState属性を公開します。このシナリオでは、initialScrollRowKeysおよびmaxRows属性の値により、エンド・ユーザーがコンポーネントをレンダリングするページに戻るときのスクロール位置が決定されます。使用可能な場合、preserveState="auto"を設定することにより、MAFがコンポーネントの以前の状態を適用するデフォルトの動作を再有効化できます。

14.3.15.1.1 リスト・ビューのスクロール方法

リスト・ビュー・コンポーネントの次の属性によってスクロール動作が有効になります。

- showMoreStrategy: 必要な場合にさらに行をロードするためのリスト・ビュー・コンポーネントの計画を定義します。
リスト・ビュー・コンポーネントがその独自のスクロール(「リスト・ビューの独自のスクロール」を参照)を提供し、リスト・ビューが最後までスクロールされたとき、次のように、自動的に属性の値に基づくshowMoreStrategyが起動されます。

- autoLink: モデルからさらに行を使用できる場合、リスト・ビューには、表示されたリストの下部に「さらに行をロード」リンクが表示されます(図14-44を参照)。

図14-44 リスト・ビューの「さらに行をロード」

リスト・ビューに追加の行をロードして表示するには、エンド・ユーザーがこのリンクをタップする必要があります。

- autoScroll: モデルからさらに行を使用できる場合、リスト・ビューには、表示する追加の行をロードしている間、ロード・インジケータが表示されます。

- forceLink: 「さらに行をロード」リンクが表示されます(図14-44を参照)。エンド・ユーザーがリンクをタップすると、リスト・ビューでは追加の行をロードして表示しようとします。

- off: リスト・ビューでは何のアクションも実行されません。最初にロードされた行のみが表示されます。

- bufferStrategy: 表示された行をバッファリングする、リスト・ビュー・コンポーネントの方法を定義します。
リスト・ビューの独自のスクロール(「リスト・ビューの独自のスクロール」を参照)が許されていて、その高さに制約があるときは、次のように、bufferStrategy属性の値に基づいてレンダリング・エンジンのバッファ内に行が保持されます。

- additive: 新しい行がレンダリング・エンジンのバッファに追加され、すべての行がバッファ内に保持されます。このオプションは、メモリー消費量を考慮する必要のない短いリストに使用できます。

- viewport: 行は、リスト・ビューのビューポート内で表示されるようになった場合にのみ、レンダリング・エンジンのバッファに追加されます。行が表示されなくなると、リスト・ビューのbufferSize属性に基づいて行がバッファから削除されます。このオプションは、長いリストを表示する場合に、メモリー消費量の削減に役立ちます。

- bufferSize: bufferStrategyがviewportに設定されている場合、bufferSize属性は、行が非表示になる、行のビューポートからの距離(ピクセル単位)を定義します。

14.3.15.1.2 リスト・ビューの独自のスクロール

デフォルトで、リスト・ビュー・コンポーネントのスクロール動作は、親コンテナによって制御されます(つまり、親コンテナのスクロールがデフォルトで設定されるなどです)。

リスト・ビュー・コンポーネント独自のスクロールが提供されるようにするには、次のいずれかを実行します。

- リスト・ビューを、パネル・ページの唯一の非ファセットの子にする。

- リスト・ビューに固定の高さを設定する。次にその例を示します。

inlineStyle="height: 200px;"

14.3.15.1.3 サーバー側ページング

リスト・ビュー・コンポーネントでは、oracle.adfmf.amx.event.RangeChangeEventなどのイベントを介してサーバー側ページングをサポートしています。

「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグしてリスト・ビュー・コンポーネントが作成されると、リスト・ビュー・コンポーネントはバンディング・イテレータから行を取得します(「ページングおよび動的スクロールの構成」を参照)。バインディング・イテレータは、AttributeIteratorのRangeSize属性によって定義された単位で、データ・コントロールのコレクションから行を取得します。使用可能なデータがすべて取得されると、RangeChangeEventが起動されます。このイベントを捕捉するには、データ・コントロールのプロバイダ・コードにoracle.adfmf.amx.event.RangeChangeListenerを実装して、rangeChangeメソッドを提供する必要があります。このメソッドでは、サーバーからさらにデータをロードして、それをコレクションに追加できます。これらの行がリスト・ビュー・コンポーネントによって表示されるようにするには、AdfmfJavaUtilitiesクラスのaddDataControlProvidersメソッドをコールして、新たに追加された行をデータ・コントロール・フレームワークに通知する必要があります。

public class Departments implements RangeChangeListener {
public void rangeChange(RangeChangeEvent rce) {
List newRows = null;
if (rangeChangeEvent.isDataExhausted()) {
newRows = loadMoreData(rangeChangeEvent.getFetchSize());
AdfmfJavaUtilities.addDataControlProviders("Departments",
rangeChangeEvent.getProviderKey(),
rangeChangeEvent.getKeyAttribute(),
newRows,
newRows.size() > 0);
}
}
...
}

注意:

データ・コントロールのプロバイダ・クラスをインスタンス化する際、サーバーからのデータの初期ロードでは、バインディング・イテレータのRangeSize属性で定義されている行数と同じ数の行を要求する必要があります。

マネージドBeanを使用してリスト・ビューのモデルを提供している場合、リスト・ビュー・コンポーネントのrangeChangeListener属性(「イベント・リスナーの使用方法」を参照)では、エンド・ユーザーがさらに行をロードするジェスチャーを実行したときにコールされるJavaハンドラ・メソッドをバインドできます。このメソッドはoracle.adfmf.amx.event.RangeChangeEventオブジェクトをパラメータとして使用し、図14-45および図14-46に示すように、「プロパティ」ウィンドウから「プロパティの編集: 範囲変更リスナー」ダイアログを起動すると作成されます。

図14-45 「範囲変更リスナー」属性の編集

図14-46 「プロパティの編集」ダイアログ

ダイアログで「OK」をクリックすると、MAF AMXページのlistView要素に次の設定が追加されます。

<amx:listView id="listView1" rangeChangeListener="#{pageFlowScope.HRBean.goGet}" >

また、次の例に示すJavaメソッドは、サンプルのHRBeanクラスに追加されます。

public void goGet(RangeChangeEvent rangeChangeEvent) {
// Add event code here
...
}

注意:

RangeChangeEventを使用してサーバー側ページングをサポートしている場合、リスト・ビューのfetchSize属性は-1に設定できません。

追加の例は、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにあるRangeChangeDemoというMAFサンプル・アプリケーションを参照してください。

14.3.15.2 MAF AMX UIコンポーネントによるメモリー消費に関する必知事項

リスト・ビューを含む、すべてのスクロール可能なMAF AMX UIコンポーネントは、メモリーが不足した状態でモバイル・デバイスを実行している場合にリソースを節約するよう最適化されています。このようなコンポーネントでは、フリック機能が無効化され、慣性スクロールが機能します(つまり、エンド・ユーザーが画面から指を離した後もコンポーネントがスクロールし続けるようにするため、エンド・ユーザーはコンポーネントを指でフリックできなくなります)。

14.3.15.3 リスト・ビュー・アイテムの再配置

リスト・ビューのアイテムは再配置できます。この機能は、iOSとAndroidのプラットフォームで類似しており、どちらも各リスト・アイテムの右マージンに沿って整列した再配置アイコンが表示されます。再配置操作は、エンド・ユーザーがハンドルとして再配置アフォーダンスを使用してリスト・アイテムにタッチしてドラッグしたときに開始されます。この操作は、エンド・ユーザーが表示画面から指を離したときに完了します。

注意:

エンド・ユーザーがリスト・アイテム上の他の場所をタッチしてドラッグした場合は、リストが上下にスクロールします。

再配置ドラッグ操作によって、リスト・アイテムがドッキング解除され、エンド・ユーザーがリスト内でリスト・アイテムを上下に移動できるようになります。

そのアイテムを再配置可能にするには、リスト・ビューが静的ではなく編集モードになっており、移動を許容可能になっている必要があります。

次の例は、MAF AMXファイルで定義されたlistView要素を示しています。この定義によって、リスト・モードを編集可能と読取り専用の間で切り替えることができる「編集」および編集停止ボタンが上部に表示されたリストが提示されます。

<amx:panelPage id="pp1">
<amx:commandButton id="edit"
text="Edit"
rendered="#{!bindings.inEditMode.inputValue}">
<amx:setPropertyListener id="spl1"
from="true"
to="#{bindings.inEditMode.inputValue}"
type="action"/>
</amx:commandButton>
<amx:commandButton id="stop"
text="Stop Editing"
rendered="#{bindings.inEditMode.inputValue}">
<amx:setPropertyListener id="spl2"
from="false"
to="#{bindings.inEditMode.inputValue}"
type="action"/>
</amx:commandButton>
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row"
editMode="#{bindings.inEditMode.inputValue}"
moveListener="#{MyBean.Reorder}">
<amx:listItem id="li1">
<amx:outputText id= "ot1" value="#{row.description}">
</amx:listItem>
</amx:listView>
</amx:panelPage>

14.3.15.4 リスト・ビュー・レイアウトの構成

リスト・ビュー・コンポーネントは、各行が1つのリスト・アイテム・コンポーネントを含んでいる行のセット(デフォルト)として、または各カードが1つ以上のリスト・アイテム・コンポーネントを含んでいるカードのセットとしてレイアウトできます。

レイアウトを定義するには、リスト・ビューのlayout属性を使用し、これをrowsまたはcardsに設定します。cardsレイアウトを使用する場合は、次の点を考慮してください。

- 各リスト・アイテム・コンポーネントは、水平に並べられたカードのグループ内のカードとして表示されます。

- 使用可能なスペースがすべて消費されると、次のカードが新しい行で折り返されます。

- リスト・ビュー内でリスト・アイテム・コンポーネント(カード)の水平配置を制御するには、リスト・ビューのhalign属性をstart、centerまたはendに設定します。

- リスト・ビューの外観を一般的にカスタマイズするには、次の手順を実行します。

- スキン内でデフォルトで定義されているカード・サイズをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しい幅を指定します。「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

注意:

値をautoに設定することも、パーセント単位を使用することもできません。

あるいは、スキニングを使用して.amx-listView-cards .amx-listItemセレクタから幅をオーバーライドできます(「スキニングに関する必知事項」を参照)。

- スキン内でデフォルトで定義されているカードの周囲のスペースをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しいmargin-topおよびmargin-leftを指定し(「コンポーネント属性を使用したスタイルの定義方法」を参照)、リスト・ビューのcontentStyle属性を使用して新しいpadding-bottomおよびpadding-rightを指定します。
あるいは、スキニングを使用して、.amx-listView-cards .amx-listItemセレクタからmargin-topおよびmargin-leftをオーバーライドし、.amx-listView-cards .amx-listView-contentセレクタからpadding-bottomおよびpadding-rightをオーバーライドします(「スキニングに関する必知事項」を参照)。

rowsレイアウトの場合、halign属性を使用してわずかなリスト・アイテム・コンテンツの配置を変更できます。ただし、この属性を使用しても、視覚的な効果がないことがあります。

カード・レイアウトを備えたリスト・ビュー・コンポーネントが編集モードにあると、レイアウトはrowsモードに切り替わります。

MAF AMXページ・レイアウトを特定のパターンに合せるために、一連の事前定義済スタイルを使用するstyleClass属性(「UIコンポーネントのスタイル設定」を参照)を介して定義される様々なタイプのリスト・ビュー・コンポーネントおよびスタイルを組み合せて使用できます。

UILayoutDemoという名前のMAFサンプル・アプリケーションは、各コンポーネントのすべてのオプションのスタイルおよびそれに関連するレンダリングを示しています。このアプリケーションは、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-startTextに設定すると、出力テキスト・コンポーネントが行の開始(左)側に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-endTextに設定すると、出力テキスト・コンポーネントが行の終了(右)側に配置され、そのテキストに青いフォントが適用されます。右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この属性のデフォルト値はtrueであるため、この例にはこの設定は含まれていません。

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1s1" width="10px"/>
<amx:cellFormat id="cf11" width="60%" height="43px">
<amx:outputText id="outputText11" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputText12"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図14-47は、各行の開始(左)側と終了(右)側に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図14-47 デザインタイムの開始および終了テキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-startTextに設定すると、出力テキスト・コンポーネントが行の開始に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-endTextに設定すると、出力テキスト・コンポーネントが行の終了に配置され、そのテキストに青いフォントが適用されます。それぞれの特定の行に右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この例では、この属性はすべてのlistItem要素に対してfalseに設定されているため、右向き矢印は表示されません。

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1" showLinkIcon="false">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1s1" width="10px"/>
<amx:cellFormat id="cf11" width="60%" height="43px">
<amx:outputText id="outputText11" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputText12"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図14-48は、各行の開始と終了に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、リンクを表す右向き矢印は含まれていません。

図14-48 デザインタイムの拡張リンクのない開始および終了テキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、終了テキストの下に配置されるサブテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左側に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右側に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-upperStartTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl11">
<amx:cellFormat id="cf1s1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf11" width="60%" height="28px">
<amx:outputText id="outputTexta1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputTexta2"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl12">
<amx:cellFormat id="cf13" columnSpan="3" width="100%" height="12px">
<amx:outputText id="outputTexta3"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図14-49は、各行の開始と終了に異なるスタイルのテキストが追加され、左側の終了テキストの下にサブテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図14-49 デザインタイムの開始および終了テキストとサブテキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、メイン・テキストおよびサブテキストを含む行が移入されます。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-mainTextに設定すると、出力テキスト・コンポーネントが行の開始に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-mainTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1">
<amx:tableLayout id="tla1" width="100%">
<amx:rowLayout id="rla1">
<amx:cellFormat id="cf1s1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cfa1" width="100%" height="28px">
<amx:outputText id="outputTexta1" value="#{row.name}"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rla2">
<amx:cellFormat id="cfa2" width="100%" height="12px" >
<amx:outputText id="outputTexta2"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図14-50は、各行にメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図14-50 デザインタイムのメイン・テキストとサブテキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、アイコン、メイン・テキストおよびサブテキストを含むセルが移入されます。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-mainTextに設定すると、出力テキスト・コンポーネントが行の左側に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-mainTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。image要素の位置は、それが囲むcellFormatによって定義されます。

<amx:listView id="lv1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="li1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1" rowSpan="2" width="40px" halign="center">
<amx:image id="i1" source="#{row.image}"/>
</amx:cellFormat>
<amx:cellFormat id="cf2" width="100%" height="28px">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl2">
<amx:cellFormat id="cf3" width="100%" height="12px">
<amx:outputText id="ot2"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図14-51は、各行に、アイコンおよびメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図14-51 デザインタイムのアイコン、メイン・テキストおよびサブテキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、各行の両側に配置されている2つの異なるタイプのテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左上隅に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右上隅に配置され、そのテキストに大きいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerStartTextに設定すると、出力テキスト・コンポーネントが行の左下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerEndTextに設定すると、出力テキスト・コンポーネントが行の右下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この属性のデフォルト値はtrueであるため、この例にはこの設定は含まれていません。

<amx:listView id="lv1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="li1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf2" width="60%" height="28px">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf3" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf4" width="40%" halign="end">
<amx:outputText id="ot2"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rla2">
<amx:cellFormat id="cf5" width="60%" height="12px">
<amx:outputText id="ot3"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
<amx:cellFormat id="cf6" width="40%" halign="end">
<amx:outputText id="ot4"
value="#{row.priority}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図14-52は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図14-52 デザインタイムの4つのタイプのテキストを持つリスト・ビュー

次の例は、MAF AMXファイルで定義されたlistView要素とその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、各行の両側に配置されている2つの異なるタイプのテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左上隅に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右上隅に配置され、そのテキストに大きいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerStartTextNoChevronに設定すると、出力テキスト・コンポーネントが行の左下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerEndTextNoChevronに設定すると、出力テキスト・コンポーネントが行の右下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。それぞれの特定の行に右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この例では、この属性はすべてのlistItem要素に対してfalseに設定されているため、右向き矢印は表示されません。

<amx:listView id="lv1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="li1" showLinkIcon="false">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf2" width="60%" height="28px">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf3" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf4" width="40%" halign="end">
<amx:outputText id="ot2"
value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl2">
<amx:cellFormat id="cf5" width="60%" height="12px">
<amx:outputText id="ot3"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
<amx:cellFormat id="cf6" width="40%" halign="end">
<amx:outputText id="ot4"
value="#{row.priority}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図14-53は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図14-53 デザインタイムの拡張リンクのない4つのタイプのテキストを持つリスト・ビュー

14.3.15.5 静的リスト・ビューの使用に関する必知事項

モデルからではなくハードコード化された値によって移入されるリスト・ビュー・コンポーネントを作成する場合、このリスト・ビューは静的になり、デザインタイムに設定するそのプロパティのいくつか(たとえばdividerAttribute、dividerMode、fetchSize、moveListener)が実行時に無視されるようになります。

MAF AMXでは、リスト・ビュー・コンポーネントのvalue属性が設定されていない場合、そのコンポーネントを静的であるとみなします。そのようなリストは編集できません(つまり、リストのeditMode属性を指定できません)。

14.3.16 カルーセル・コンポーネントの使用方法

カルーセル(carousel)コンポーネントは、回転カルーセルにイメージなどの他のコンポーネントを表示するために使用します。エンド・ユーザーは、スライダを使用するか、別のイメージを正面にドラッグすることでアクティブなアイテムを変更できます。

カルーセル・コンポーネントにはカルーセル・アイテム(carouselItem)コンポーネントが含まれており、text属性によって表されるそのテキストは、それがそのカルーセルのアクティブなアイテムであるときに表示されます。通常、カルーセル・アイテムにはイメージ・コンポーネントが含まれていますが、他のコンポーネントを使用することもできます。たとえば、イメージを囲む子としてリンクを使用することもできます。表示するオブジェクトごとにカルーセル・アイテム・コンポーネントを作成し、これらのコンポーネントを個々のオブジェクトにバインドするかわりに、カルーセル・コンポーネントを完全なコレクションにバインドします。その後、コンポーネントは各アイテムに値をスタンプすることで、1つのカルーセル・アイテム・コンポーネントを繰り返しレンダリングします。各アイテムがスタンプされると、現在のアイテムのデータが、EL式でカルーセル・コンポーネントのvar属性を使用して特定可能なプロパティにコピーされます。カルーセルのレンダリングが完了したら、このプロパティは削除されるか前の値に戻ります。カルーセル・コンポーネントにはnodeStampというファセットが含まれており、これは、各アイテムのテキストと短い説明の両方を表示するために使用されるカルーセル・アイテムのホルダーであり、各アイテムに表示されるイメージに対する親コンポーネントでもあります。

カルーセル・アイテムは、その子コンポーネントのみ拡大します。単一のイメージ・コンポーネントをカルーセル・アイテムの内部に配置する場合、イメージはそのアイテムに割り当てられた四角形に合せて拡大されます(エンド・ユーザーがカルーセルをスピンすると、これらのサイズが縮小または拡大されます)。

ヒント:

アプリケーションのパフォーマンスの低下を最小限に抑えるは、重いコンポーネントを子として使用しないようにします。複雑な構造にすると、いくつかのカルーセル・アイテム・スタンプが同時に表示されるため、その影響が倍増します。

デフォルトでは、カルーセルは水平に表示されます。水平方向のカルーセル内にあるオブジェクトは中央に垂直に配置され、カルーセル自体はコンテナの中心に水平に配置されます。参照ローロデックスが必要な場合は、垂直に表示されるようにカルーセルを構成できます。デフォルトでは、垂直方向のカルーセル内にあるオブジェクトは中心に水平に配置され、カルーセル自体は中央に垂直に配置されます。カルーセルのorientation属性を使用してこの配置を変更できます。

前後のイメージを部分的に表示するかわりに、displayItems属性を使用して、フィルムストリップ・デザインまたは循環デザインでイメージを表示するようにカルーセルを構成することができます。

デフォルトでは、カルーセルが循環モードで表示するように構成されている場合、エンド・ユーザーが補助アイテム(現在、中央に表示されていないアイテム)にポインタを置くと、そのアイテムが枠で囲まれ選択可能であることが示されます。auxiliaryPopOut属性を使用すると、アイテムが移動し、最大サイズで表示されるように、カルーセルを構成できます。

JDeveloperでは、「カルーセル」は「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図14-54を参照)。

図14-54 「コンポーネント」ウィンドウの「カルーセル」

カルーセル・コンポーネントを作成するには、表示するイメージを含むデータ・モデルを作成してから、カルーセルをそのモデルにバインドし、カルーセル・アイテム・コンポーネントをカルーセルのnodeStampファセットに挿入します。最後に、イメージ・コンポーネント(またはイメージ・コンポーネントを含むその他のコンポーネント)をカルーセル・アイテム・コンポーネントに子として挿入します。

次の例は、MAF AMXファイルのcarousel要素定義を示しています。carousel要素を定義するときは、carousel要素のnodeStampファセット内にcarouselItem要素を配置する必要があります。

<amx:carousel id="carousel1"
value="#{bindings.products.collectionModel}"
var="item"
auxiliaryOffset="0.9"
auxiliaryPopOut="hover"
auxiliaryScale="0.8"
controlArea="full"
displayItems="circular"
halign="center"
valign="middle"
disabled="false"
shortDesc="spin"
orientation="horizontal"
styleClass="AMXStretchWidth"
inlineStyle="height:250px;background-color:#EFEFEF;">
<amx:facet name="nodeStamp">
<amx:carouselItem id="item1" text="#{item.name}"
shortDesc="Product: #{item.name}">
<amx:commandLink id="link1" action="goto-productDetails"
actionListener="#{someMethod()}">
<amx:image id="image1" styleClass="prod-thumb"
source="images/img-big-#{item.uid}.png"/>
<amx:setPropertyListener id="spl1"
from="#{item}"
to="#{pageFlowScope.product}"
type="action"/>
</amx:commandLink>
</amx:carouselItem>
</amx:facet>
</amx:carousel>

カルーセル・コンポーネントでは、CollectionModelクラスを使用して基礎となるコレクションのデータにアクセスします。java.util.Listやarrayなどの他のモデル・クラスを使用することもできますが、その場合、カルーセルによってインスタンスが自動的にCollectionModelクラスに変換されますが、機能は追加されません。

スライダを使用することで、エンド・ユーザーはカルーセル・コレクションを移動できます。通常、スライダ上のサムにはオブジェクトの総数のうちの現在のオブジェクト番号が表示されます。オブジェクトの総数が大きすぎて計算できない場合、スライダ上のサムには現在のオブジェクト番号のみ表示されます。

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.17 フィルム・スクリプト・コンポーネントの使用方法

フィルム・ストリップ(filmStrip)は、一連のグループ(ページ)間に分散されたデータを、垂直または水平ストリップ形式で視覚化するコンテナです。グループに含まれるディスプレイ・アイテム(filmStripItem)を表すUIコンポーネントは、同じサイズおよびタイプである必要があり、一度に1つのグループのみを表示できます。エンド・ユーザーは、フィルム・ストリップのページを移動でき、アイテムを選択してタップすることでアクションを生成できます。

JDeveloperでは、フィルム・ストリップは「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図14-55を参照)。

図14-55 「コンポーネント」ウィンドウのフィルム・ストリップ

次の例は、MAF AMXファイルのfilmStrip要素定義を示しています。

<amx:filmStrip id="fs1"
var="item"
value="#{bindings.contacts.collectionModel}"
rendered="#{pageFlowScope.pRendered}"
styleClass="#{pageFlowScope.pStyleClass}"
inlineStyle="#{pageFlowScope.pInlineStyle}"
shortDesc="#{pageFlowScope.pShortDesc}"
halign="#{pageFlowScope.pFsHalign}"
valign="#{pageFlowScope.pFsValign}"
itemsPerPage="#{pageFlowScope.pMaxItems}"
orientation="#{pageFlowScope.pOrientation}"
pageControlPosition="#{pageFlowScope.pageControlPosition}">
<amx:filmStripItem id="fsi1"
inlineStyle="text-align:center; width:200px;">
<amx:commandLink id="ciLink"
action="details"
shortDesc="Navigate to details">
<amx:image id="ciImage" source="images/people/#{item.first}.png"/>
<amx:setPropertyListener id="spl1"
from="#{item.rowKey}"
to="#{pageFlowScope.currentContact}"
type="action"/>
<amx:setPropertyListener id="spl2"
from="#{item.first}"
to="#{pageFlowScope.currentContactFirst}"
type="action"/>
<amx:setPropertyListener id="spl3"
from="#{item.last}"
to="#{pageFlowScope.currentContactLast}"
type="action"/>
</amx:commandLink>
</amx:filmStripItem>
</amx:filmStrip>

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.17.1 フィルム・ストリップ・レイアウトに関する必知事項

垂直に配置されたフィルム・ストリップでは、ディスプレイ・アイテムは上から下に配置されます。テキストの方向に応じて、ページ制御は次のように配置されます。

- テキストの方向が左から右の場合、ページ制御は右側に置かれます。

- テキストの方向が右から左の場合、ページ制御は左側に置かれます。

水平に配置されたフィルム・ストリップでは、テキストの方向モードを反映する必要があり、左から右モードでは最初のアイテムが左に置かれ、右から左モードでは最初のアイテムは右に置かれます。どちらの場合でも、ページ・コントロールは一番下にあります。

フィルム・ストリップ・コンポーネントのpageControlPosition属性を使用すると、ページ・コントロールの場所をフィルム・ストリップ・アイテムの内側または外側のいずれかに構成できます。

dottedPageControlコンポーネントが構成されている場合は、図14-56で示すように、フィルム・ストリップ・ページ間の移動用のオーバーフロー・ドット付きページ・コントロールを表示できます。次の例では、MAF AMXファイル内で構成されているdottedPageControlコンポーネントとともにFilm Strip要素を示します。

<amx:filmStrip>
<amx:filmStripItem/>
<amx:facet name="pageControl">
<amx:dottedPageControl id="pc1" dotsPerGroup="10" lastGroupBehavior="remaining|full" displayArrowLabels="none|inside|outside"/>
</amx:facet>
</amx:filmStrip>

図14-56 ドット付きページ・コントロール・コンポーネント

14.3.17.2 フィルム・ストリップ・ナビゲーションに関する必知事項

フィルム・ストリップ・コンポーネントのナビゲーションは、デック(「デック・コンポーネントの使用方法」を参照)およびパネル・スプリッタ・コンポーネント(「パネル・スプリッタ・コンポーネントの使用方法」を参照)と似ています。一度に1つのページが表示され、ページIDまたは番号を選択するとページの変更がトリガーされます。

子フィルム・ストリップ・アイテム・コンポーネントは、他のMAF AMXページに移動するための使用は想定されていないため、action属性をサポートしていません。必要な場合は、ネストされているコマンド・リンク・コンポーネントを介してナビゲーションを有効化できます。

14.3.18 Verbatimコンポーネントの使用方法

該当するコンポーネントが存在しない場合や自身でHTMLを使用してレイアウトする必要がある場合は、Verbatim (verbatim)操作を使用して独自のHTMLをページに挿入できます。

JDeveloperでは、「Verbatim」は、「コンポーネント」ウィンドウの「一般コントロール」の下にあります(図14-59を参照)。

図14-57 「コンポーネント」ウィンドウの「Verbatim」

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.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コード層から発生する必要があります。

14.3.19 出力HTMLコンポーネントの使用方法

出力HTML (outputHtml)コンポーネントでは、HTMLコンテンツをMAF AMXページに表示するために、ELでバインドされたプロパティまたはメソッドから動的および安全に取得できます。出力HTMLコンポーネントはVerbatimコンポーネント(「Verbatimコンポーネントの使用方法」を参照)と同様に動作し、JavaScriptおよびAJAXの使用に関して同じ制限が適用されます(「JavaScriptおよびAJAXのVerbatimコンポーネントでの使用に関する必知事項」を参照)。

JDeveloperでは、出力HTMLは、「コンポーネント」ウィンドウの「一般コントロール」の下にあります(図14-58を参照)。

図14-58 「コンポーネント」ウィンドウの出力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というJava Beanからのコードを示しています。

// The property accessor that gets the receipt view HTML
public String getHtmlReceiptView() {
// Perform some URL remote call to get the HTML to be
// inserted as a view of the Receipt and return that value
return obtainReceiptHTMLFromServer();
}
// The property accessor that gets the check view HTML
public String getHtmlCheckView() {
// Perform some URL remote call to get the HTML to be
// inserted as a view of the Check and return that value
return obtainCheckHTMLFromServer();
}

出力HTMLコンポーネントはそのHTMLコンテンツをリモート・ソースから直接ダウンロードするのではなく、Java Beanプロパティから取得するため、動的に提供されるHTMLの取得または生成をコーディングする場合は、既存のMAFセキュリティ機能を使用することを検討してください。「MAFアプリケーションの保護」および「カスタムHTMLコンポーネントからのインジェクション攻撃リスクについて」を参照してください。さらに、提供されるHTMLが信頼できるソースからのもので、脅威がないことを確認します。

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.20 反復の有効化方法

イテレータ(iterator)操作を使用して、同じ種類のデータを持つ任意の数のアイテムをスタンプします。これによりデータを繰り返し処理して各要素のUIを作成できます。

JDeveloperでは、「イテレータ」は「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図14-59を参照)。

図14-59 「コンポーネント」ウィンドウの「イテレータ」

14.3.21 UIコンポーネントのコンテンツのリフレッシュ方法

リフレッシュ・コンテナ(refreshContainer)コンポーネントには、エンド・ユーザーのプルダウン・ジェスチャーによってステータス・インジケータが表示され、リフレッシュできるコンテンツが格納されます。

プルダウン・ジェスチャーが解放されるか、またはそのしきい値に到達したときにコンテンツの更新が開始され、リスト・アイテムのインスタンスなどのコンテンツがリフレッシュされるまでステータス・インジケータが変化します。

つまり、リフレッシュ・コンテナ・コンポーネントでは、リフレッシュをジェスチャーとして公開でき、MAF AMXページにリフレッシュ・ボタンを追加する必要がなくなります。エンド・ユーザーにとって望ましくないスクロールを発生させることになるため、リフレッシュ・コンテナをスクロール可能な親コンポーネント内で配置しないように注意してください。そのかわりに、リフレッシュ・コンテナの内側にリスト・ビューなどのスクロール可能なコンポーネントを配置できます。エンド・ユーザーがリフレッシュ・コンテナ内の任意の場所でプルダウン・ジェスチャーを実行すると、MAF AMXにより、リフレッシュ・コンテナとエンド・ユーザーの指の間で、その上にスクロールされているUIコンポーネントがないか確認されます。その上にスクロールされているコンポーネントがない場合は、エンド・ユーザーが通常どおりにコンテンツをスクロールできるように、リフレッシュ・コンテナはジェスチャーを無視します。すべてのコンポーネントがその上にスクロールされている場合は、リフレッシュ・コンテナは、エンド・ユーザーがコンテンツをプルダウンすることを許し、以前非表示にされた情報ポケットがリフレッシュ・コンテナの上に表示されます。必要なしきい値(スキンに指定された高さ)に到達する前に指が離された場合は、そのポケットは再び非表示になります。エンド・ユーザーがそのしきい値を超えて指を下にドラッグした場合は、アクション・イベントが発生してアプリケーションは操作を実行でき、データがリフレッシュされます。このポケットは、処理が完了するか、またはリフレッシュ・コンテナのオプションのrefreshCompleteExpression属性が指定されていれば、データの変更イベントが発生するまで、開いたままです。

JDeveloperでは、リフレッシュ・コンテナは「コンポーネント」ウィンドウの「データ・ビュー」の下にあります。

図14-60 「コンポーネント」ウィンドウ内のリフレッシュ・コンテナ

次の例は、MAF AMXファイルのrefreshContainer要素の定義を示しています。このコンポーネントでは、「リスト・ビュー」のコンテンツがリフレッシュされます。pullText、busyText、subTextの各属性は、アクティブ化されたリフレッシュ・コンテナの様々な段階で表示されるテキストを定義します。

<amx:refreshContainer id="rc1"
refreshDesc="#{pageFlowScope.componentProperties.refreshDesc}"
pullText="#{pageFlowScope.componentProperties.pullText}"
busyText="#{pageFlowScope.componentProperties.busyText}"
subText="#{pageFlowScope.componentProperties.subText}"
actionListener="#{PropertyBean.RefreshActionHandler}">
<amx:setPropertyListener type="action"
from="Last updated: Recently"
to="#{pageFlowScope.componentProperties.subText}"/>
<amx:listView id="listView1"
var="row"
value="#{bindings.contacts.collectionModel}"
bufferStrategy="viewport"
collapsibleDividers="true"
dividerAttribute="last"
dividerMode="firstLetter"
rendered="#{pageFlowScope.componentProperties.rendered}"
showDividerCount="true"
showMoreStrategy="autoScroll">
<amx:listItem id="listItem1" action="details">
<amx:outputText id="outputText1"
value="#{row.first} #{row.last}"/>
<amx:setPropertyListener from="#{row.rowKey}"
to="#{pageFlowScope.currentContact}"
type="action"/>
<amx:setPropertyListener from="#{row.first}"
to="#{pageFlowScope.currentContactFirst}"
type="action"/>
<amx:setPropertyListener from="#{row.last}"
to="#{pageFlowScope.currentContactLast}"
type="action"/>
<amx:setPropertyListener from="#{row.address}"
to="#{pageFlowScope.currentContactAddress}"
type="action"/>
<amx:setPropertyListener from="#{row.city}"
to="#{pageFlowScope.currentContactCity}"
type="action"/>
<amx:setPropertyListener from="#{row.state}"
to="#{pageFlowScope.currentContactState}"
type="action"/>
<amx:setPropertyListener from="#{row.zip}"
to="#{pageFlowScope.currentContactZip}"
type="action"/>
<amx:setPropertyListener from="#{row.phone}"
to="#{pageFlowScope.currentContactPhone}"
type="action"/>
<amx:setPropertyListener from="#{row.mobile}"
to="#{pageFlowScope.currentContactMobile}"
type="action"/>
</amx:listItem>
</amx:listView>
</amx:refreshContainer>

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.22 アクション・リスナーの使用方法

アクション・リスナー(actionListener)コンポーネントにより、親コンポーネントが使用するタイプに基づいてELを介して宣言でコマンドを呼び出すことができます。

アクション・リスナー・コンポーネントを使用する主な理由は、親コンポーネントにジェスチャー対応アクションを追加すること、およびタップなどの単一ジェスチャーに対して複数の操作を実行できるためです。「アクション・リスナー・コンポーネントと属性間の相違点に関する必知事項」を参照してください。

JDeveloperでは、「アクション・リスナー」コンポーネントは「コンポーネント」ウィンドウの「操作」→「リスナー」の下にあります(図14-61を参照)。

図14-61 「コンポーネント」ウィンドウの「アクション・リスナー」

0個以上のアクション・リスナー・コンポーネントを、任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム、フィルム・ストリップ・アイテム)の子として追加できます。アクション・リスナー・コンポーネントのtype属性は、ActionEventを作動させるジェスチャー(swipeLeft、swipeRight、tapHoldなど)を定義します。

詳細は、次の項を参照してください。

- イベント・リスナーの使用方法

- プロパティ・リスナーの設定の使用方法

- ジェスチャーの有効化

- アクション・リスナー・コンポーネントと属性間の相違点に関する必知事項

14.3.22.1 アクション・リスナー・コンポーネントと属性間の相違点に関する必知事項

ボタン、リンク、リスト・アイテムなどのコンポーネントにはactionListener属性があり、これは、アクション・リスナー・コンポーネントを冗長にする可能性があります。ただし、アクション・リスナー・コンポーネントとは異なり、これらのコンポーネントにはジェスチャーをサポートするtype属性がないため、MAFでは、親コンポーネントのactionListener属性に加えて、アクション・リスナー・コンポーネントが提供されています。

14.3.23 プロパティ・リスナーの設定の使用方法

プロパティ・リスナーの設定(setPropertyListener)コンポーネントによって、コンポーネントでのエンド・ユーザー・アクションを受けて、1つの場所(コンポーネントのfrom属性で定義)から別の場所(コンポーネントのto属性で定義)に宣言的に値をコピーできるため、同じ結果を得るためにJavaコードを記述する必要がありません。

JDeveloperでは、「プロパティ・リスナーの設定」コンポーネントは「コンポーネント」ウィンドウの「操作」→「リスナー」の下にあります(図14-62を参照)。

図14-62 「コンポーネント」ウィンドウの「プロパティ・リスナーの設定」

次の例は、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など)を定義します。

詳細は、次の項を参照してください。

- イベント・リスナーの使用方法

- アクション・リスナーの使用方法

- ジェスチャーの有効化

14.3.24 クライアント・リスナーの使用方法

クライアント・リスナー(clientListener)コンポーネントを使用すると、特定のイベント・タイプの起動時に実行されるJavaScriptリスナー・スクリプトを宣言的に登録できます。

ナビゲーション・ドラッグ動作やポップアップ表示動作など、既存の動作コンポーネントにはスクリプトが不要なものもあるため、クライアント・リスナー・コンポーネントを使用する前に、このようなコンポーネントがMAF AMXに含まれているかどうかを確認する必要があります。

JDeveloperでは、「クライアント・リスナー」コンポーネントは「コンポーネント」ウィンドウの「操作」→「リスナー」の下にあります(図14-63を参照)。

図14-63 「コンポーネント」ウィンドウの「クライアント・リスナー」

次の例は、MAF AMXファイルのclientListener要素定義を示しています。両方の属性が必要で、次のように指定されている必要があります。

- method: 指定タイプのイベントでトリガーされると起動する、クライアント側のJavaScriptメソッド名を定義します。

- type: リスニング対象のクライアント側コンポーネント・イベントのタイプを定義します。必ずしもすべてのイベント・タイプがすべてのコンポーネントに存在するわけではなく、すべてのイベントがプラットフォーム間または同じプラットフォームのバージョン間で常に動作しているわけではありません。イベントの例としては、action (親コンポーネントがボタンの場合)、valueChange (親コンポーネントが入力テキストの場合)などがあります。親コンポーネントによっては、touchstart、touchend、tap、tapholdなど、いくつかのDOMイベントを使用できる場合があります。また、ビュー・コンポーネントのshowpagecomplete、mafviewvisible、mafviewhidden、amxnavigatestart、amxnavigateend (「デバイス・プロパティに関する必知事項」を参照)など、特別なDOMイベントを持つコンポーネントもあります。
type属性は初期宣言のELはサポートしていますが、そのEL値への変更はサポートしていません(つまり、親コンポーネントを再レンダリングするアクションが実行されないかぎり、式に関連付けられた値は変更できません)。

<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:clientListener type="showpagecomplete" method="handleClientListenerBlue"/>
<amx:clientListener type="mafviewvisible" method="handleClientListenerBlue"/>
<amx:clientListener type="mafviewhidden" method="handleClientListenerBlue"/>
<amx:clientListener type="amxnavigatestart" method="handleClientListenerBlue"/>
<amx:clientListener type="amxnavigateend" method="handleClientListenerBlue"/>
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="header" value="clientListener"/>
</amx:facet>
<amx:facet name="primary">
<amx:commandButton id="back" action="__back" text="Back"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="props" text="Properties" action="properties"/>
</amx:facet>
<amx:commandButton id="button1" text="Click Me">
<amx:clientListener type="#{bindings.pType}"
method="#{bindings.pMethod}"/>
</amx:commandButton>
<amx:verbatim id="v1"><![CDATA[
<script type="text/javascript">
function handleClientListenerGray(clientEvent) {
_handleClientListener(clientEvent, "gray");
}
function handleClientListenerBlue(clientEvent) {
_handleClientListener(clientEvent, "blue");
}
function handleClientListenerOrange(clientEvent) {
_handleClientListener(clientEvent, "orange");
}
function clearRecentEvents(clientEvent) {
for (var i=9; i>=0; --i) {
var row = document.getElementsByClassName("recent"+i)[0];
row.textContent = "n/a";
row.style.color = "";
}
}
function _handleClientListener(clientEvent, color) {
try {
for (var i=9; i>0; --i) {
var currentRow = document.getElementsByClassName("recent"+i)[0];
var olderRow = document.getElementsByClassName
("recent"+(i-1))[0];
currentRow.textContent = olderRow.textContent;
currentRow.style.color = olderRow.style.color;
}
document.getElementsByClassName("recent0")[0].
textContent = clientEvent;
document.getElementsByClassName("recent0")[0].style.color = color;
console.log("Handled clientListener: " + clientEvent, clientEvent);
}
catch (problem) {
console.log("Error in verbatim code: " +
clientEvent, clientEvent, problem);
alert("Error in verbatim code: " + clientEvent + "\n\n" + problem);
}
}
</script>
<style type="text/css">
.recentLine {
white-space: normal;
word-wrap: break-word;
font-size: 12px;
color: gray;
}
</style>
<fieldset style="min-width: 50px;">
<legend style="color: gray;">Recent Events</legend>
<div id="recent0" class="recent0 recentLine">n/a</div>
<div id="recent1" class="recent1 recentLine">n/a</div>
<div id="recent2" class="recent2 recentLine">n/a</div>
<div id="recent3" class="recent3 recentLine">n/a</div>
<div id="recent4" class="recent4 recentLine">n/a</div>
<div id="recent5" class="recent5 recentLine">n/a</div>
<div id="recent6" class="recent6 recentLine">n/a</div>
<div id="recent7" class="recent7 recentLine">n/a</div>
<div id="recent8" class="recent8 recentLine">n/a</div>
<div id="recent9" class="recent9 recentLine">n/a</div>
</fieldset>
]]></amx:verbatim>
</amx:panelPage>
</amx:view>

イベントの詳細は、「イベント・リスナーの使用方法」を参照してください。

14.3.25 日時の変換方法

日時の変換(convertDateTime)は、独立したUIコンポーネントではありません。これは、出力テキストおよび入力テキスト・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された日付、時刻または日時の組合せを表示するコンバータ操作です。

JDeveloperでは、「日時の変換」は「コンポーネント」ウィンドウの「バリデータおよびコンバータ」の下にあります(図14-64を参照)。

図14-64 「コンポーネント」ウィンドウの「日時の変換」

次の例は、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. 日時の変換コンポーネントの「プロパティ」ウィンドウを開き、その属性を定義します。

注意:

日時の変換コンポーネントは、デザインタイムには何の効果も持ちません。

日時の変換コンポーネントでは、入力値文字列を日付に変換する際に一定レベルの寛容性があります。

- 月に対して関連付けられたパターン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などです。

14.3.25.1 日時パターンに関する必知事項

java.text.SimpleDateFormat定義に従って、日時書式を、日時パターン文字列で指定します。日時パターン文字列では、引用符で囲まれていないAからZおよびaからzの文字は、日付または時間の文字列のコンポーネントを表すパターン文字と認識されます。テキストは、解釈されないように一重引用符(')で囲むことができます。" ' ' "は一重引用符を表します。すべてのその他の文字は解釈されません。かわりに、それらは書式設定中に単に出力文字列にコピーされるか、解析中に入力文字列と照合されます。

表14-9は、定義済パターン文字を示しています(AからZおよびaからzのすべてのその他の文字は予約されています)。

表14-9 日時パターン文字

文字

日付または時刻のコンポーネント

表示内容

例

G

紀元

テキスト

- AD

y

年

年

- 1996

- 96

M

年における月

月

- 7月

- Jul

- 07

w

年における週

数値

- 27

W

月における週

数値

- 2

D

年における日

数値

- 189

d

月における日

数値

- 10

F

月における曜日

数値

- 2

E

曜日

テキスト

- 火曜日

- Tue

a

午前/午後

テキスト

- PM

H

1日における時(0-23)

数値

- 0

k

1日における時(1-24)

数値

- 24

K

午前/午後の時(0 - 11)

数値

- 0

h

午前/午後の時(1 - 12)

数値

- 12

m

1時間における分

数値

- 30

s

1分における秒

数値

- 55

S

ミリ秒

数値

- 978

z

タイムゾーン

一般的なタイムゾーン

- 太平洋標準時

- PST

- GMT-08:00

Z

タイムゾーン

RFC 822タイムゾーン

- -0800

パターン文字は通常繰り返されます。これは、それらの数が正確な表示を決定するためです。

14.3.26 数値の変換方法

数値の変換(convertNumber)は、独立したUIコンポーネントではなく、出力テキストおよび入力テキスト、入力テキストおよび入力数値スライダの各コンポーネントと組み合せて使用して、次の指定されたパターンに従った様々な書式で、変換された数値または通貨値を表示するコンバータ操作です。

数値の変換コンポーネントは、次のタイプの操作を提供します。

- 値から文字列。表示目的です。

- 書式設定された文字列から値。書式設定された入力値が、基礎となっている値に解析される場合です。

数値の変換が、入力テキスト・コンポーネントの子として指定されている場合、デフォルトで、モバイル・デバイスに数字キーボードが表示されます。

JDeveloperでは、「数値の変換」は「コンポーネント」ウィンドウの「バリデータおよびコンバータ」の下にあります(図14-65を参照)。

図14-65 「コンポーネント」ウィンドウの「数値の変換」

次の例は、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. 数値の変換コンポーネントの「プロパティ」ウィンドウを開き、その属性を定義します。

注意:

数値の変換コンポーネントは、デザインタイムには何の効果も持ちません。

14.3.27 ドラッグ・ナビゲーションの有効化

ナビゲーション・ドラッグ動作(navigationDragBehavior)の処理では、モバイル・デバイスの画面を指定された方向(左または右)にドラッグすることで、次または前のMAF AMXページに移動するアクションを起動できます。指定された方向へのドラッグが発生するとインジケータが画面の適切な側に表示され、引き続きドラッグしてインジケータが完全に表示されたときに停止するとアクションが実行されることを示します。インジケータが完全に表示される前にドラッグを放すと、インジケータがスライドされ、アクションは起動されません。

注意:

ドラッグ・ジェスチャーを消費する近いコンテナが他にない場合、この動作は発生しません。

MAF AMXページには、navigationDragBehavior要素の3つ以上のインスタンスを含むことはできず、1つはdirection属性をbackに設定したもので、もう1つはforwardに設定したものです。

JDeveloperでは、ナビゲーション・ドラッグ動作は「コンポーネント」ウィンドウの「操作」の下にあります(図14-66を参照)。

図14-66 「コンポーネント」ウィンドウのナビゲーション・ドラッグ動作

次の例は、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>

図14-67は、実行時のドラッグ・ナビゲーション動作を示しています(mobileFusionFxスキンを使用して表示)。

図14-67 実行時のドラッグ・ナビゲーション動作の処理

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.3.27.1 disabled属性に関する必知事項

disabled属性の値は、次のいずれかが発生した場合に計算されます。

- MAF AMXページがレンダリングされる。

- PropertyChangeListenerがコンポーネントを更新する: エンド・ユーザーのナビゲーション・ドラッグ動作を起動する機能を動的に有効化または無効化する場合、PropertyChangeListenerを使用します(Beanからの更新が必要な他のコンポーネントで使用される方法と同様)。

次の例は、disabled属性が定義されているnavigationDragBehavior要素を含むMAF AMXページを示しています。アクティブ化された場合に、disabled属性がその値を読み取るバッキングBeanのboolean値(MyBeanの例のnavDisabled)を変更するボタン(commandButton)によって機能が駆動されます。バッキングBeanは、プロパティ変更リスナーを使用します。

<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="Header1" id="ot1"/>
</amx:facet>
<amx:commandButton id="cb1"
text="commandButton1"
actionListener="#{pageFlowScope.myBean.doSomething}"/>
</amx:panelPage>
<amx:navigationDragBehavior id="ndb1"
direction="forward"
action="goView2"
disabled="#{pageFlowScope.myBean.navDisabled}"/>
</amx:view>

次の例は、navigationDragBehaviorのdisabled属性の値を提供するバッキングBean(navigationDragBehaviorの例のmyBean)を示します。

public class MyBean {
boolean navDisabled = true;
private PropertyChangeSupport propertyChangeSupport =
new PropertyChangeSupport(this);

public void setNavDisabled(boolean navDisabled) {
boolean oldNavDisabled = this.navDisabled;
this.navDisabled = navDisabled;
propertyChangeSupport.firePropertyChange("navDisabled",
oldNavDisabled,
navDisabled);
}

public boolean isNavDisabled() {
return navDisabled;
}

public void doSomething(ActionEvent actionEvent) {
setNavDisabled(!navDisabled);
}

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}
}

14.3.28 ロード・インジケータの使用方法

ロード・インジケータ動作(loadingIndicatorBehavior)の処理では、次のことをオーバーライドすることで、ロード・インジケータの動作を定義できます。

- フェイルセーフ・タイマーの持続時間(ミリ秒単位)。

- フェイルセーフしきい値に達した場合に、アクションの方針の決定するために起動できるオプションのJavaScript関数名。

JDeveloperでは、ロード・インジケータ動作は「コンポーネント」ウィンドウの「操作」の下にあります(図14-68を参照)。

図14-68 「コンポーネント」ウィンドウのロード・インジケータ動作

次の例は、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を返します。

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
};

例については、次を参照してください。

開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

14.4 カスタムUIコンポーネントの作成

JavaScriptおよびMAF APIを使用して、カスタムUIコンポーネントを作成でき、このコンポーネントのJavaScriptファイルは、アプリケーション機能レベル包含を使用して、プロジェクトに追加できます。

カスタム・タグ・ライブラリを追加すると、「コンポーネント」ウィンドウのタグ・ライブラリのリストに組み込まれ、このライブラリが選択されると、カスタム・コンポーネントが「コンポーネント」ウィンドウで使用可能になり、その属性が「プロパティ」ウィンドウに表示されます。

カスタム・コンポーネントを作成するには、次の手順を実行します。

1. /META-INF/amx-tag-libraries.xmlファイルに、XMLネームスペース、サポートするタグ、およびタグの属性のメタデータを指定します。
例14-2に、サンプルのamx-tag-libraries.xmlファイルを示します。

2. adf.mf.api.amx.TypeHandler.register APIを使用して、タグ名前空間および1つ以上の一連のタイプ・ハンドラを登録するJavaScriptファイルを生成します。
例14-1は、カスタムUIコンポーネントを宣言するJavaScriptファイルからの抽出を示しています。

3. タイプ・ハンドラごとにレンダリング・メンバー関数と、オプションでその他の関数を実装します。

4. JavaScriptファイルをアプリケーション機能のコンテンツに含めます。
図14-69に、Galleryアプリケーション機能に2つのJavaScriptファイル(custom.jsおよびproperties.js)が含まれるCompGalleryサンプル・アプリケーションからの例を示します。

図14-69 アプリケーション機能でのJavaScriptファイルのインクルード

5. 次の例に示すように、カスタム・コンポーネントの1つを使用する各MAF AMXページに対し、view要素のxmlnsエントリを追加します。

<?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"
xmlns:custom="http://xmlns.example.com/custom">
...
</amx:view>

カスタムUIコンポーネントの作成方法の例については、「サンプルのMAFアプリケーション」に記載されているCompGalleryという名前のMAFサンプル・アプリケーションに含まれるcustom.amx、exampleEvents.amxおよびexampleList.amxの各ファイルを参照してください。

例14-1 カスタム・コンポーネントを登録するサンプルの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;
};

})();

例14-2 サンプルのamx-tag-libraries.xmlファイル

<?xml version="1.0" encoding="UTF-8"?>
<!-- Tag library tag that defines a set of AMX tag handlers -->
<tag-library xmlns="http://xmlns.oracle.com/adf/mf/amx/tag-library">
<!-- Define a tag library for a namespace -->
<library namespace="http://xmlns.oracle.com/adf/mf/amx">
<!--
Register a UI tag. The tag handler defines the capabilities of what is being created.
Custom tag handlers are permitted to provide advanced behaviors that are not possible
through meta data alone.

name: the name of the tag
java-class: the Java class of the tag handler to use
naming-container: if set to "true", child nodes with have their IDs prepended with this component's ID. Defaults to false
serialize: if set to "false", the nodes for this tag will not be sent to the web view. Useful for tags that are only
useful for tag handler usage.
serialize-text-content: if set to "true" the text content of the tag will be sent to the JavaScript layer. For performance
reasons this defaults to false
-->
<tag name="inputText" java-class="oracle.maf.amx.typehandler.UITagHandler">
<!--
Specify a "normal" attribute using the "attribute" tag.
supports-el: if a ValueExpression should be created for the attribute or if the value should be
sent to the browser as-is. Defaults to true if not specified
serialize: if set to "false" the attribute will not be sent to the web view. Useful if only the tag handler needs
to use the attribute
-->
<attribute name="id" supports-el="false"/>
<attribute name="value" supports-converter="true"/>

...
</tag>
</library>
</tag-library>

14.5 ジェスチャーの有効化

エンド・ユーザーのジェスチャーに反応するために、ボタン、リンク、リスト・アイテムおよび多数のデータ視覚化の各コンポーネントを構成できます。

ジェスチャーは次のとおりです。

- 右方向にスワイプ

- 左方向にスワイプ

- 上方向にスワイプ

- 下方向にスワイプ

- タップしたまま押さえる

- アクション: ジェスチャーとしては、アクションは基本的なタップを表します。

- 始点方向にスワイプ: このジェスチャーは、右から左(RTL)のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、左方向にスワイプします。

- テキスト方向が右から左である場合、右方向にスワイプします。

- 終点方向にスワイプ: このジェスチャーは、右から左(RTL)のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、右方向にスワイプします。

- テキスト方向が右から左である場合、左方向にスワイプします。

次の操作のtype属性に対して、swipeRight、swipeLeft、swipeUp、swipeDown、swipeStart、swipeEnd、actionおよびtapHold値を定義できます。

- プロパティ・リスナーの設定(「プロパティ・リスナーの設定の使用方法」を参照)

- アクション・リスナー(「アクション・リスナーの使用方法」を参照)

- ポップアップ表示動作(「ポップアップ・コンポーネントの使用方法」を参照)

- ポップアップを閉じる動作(「ポップアップ・コンポーネントの使用方法」を参照)

type属性の値は親コンポーネントに基づいて制限されており、リンク(commandLink)およびリスト・アイテム(listItem)のコンポーネントに対してのみサポートされています。

注意:

リンク(実行) (linkGo)コンポーネントに対するジェスチャー・サポートはありません。

始点方向にスワイプと終点方向にスワイプは、右から左(RTL)のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点のスワイプ・スタイルを設定することをお薦めします。

次の例は、MAF AMXファイルのtype属性のtapHold値の使用を示しています。この例では、タップしたまま押さえるジェスチャーによってポップアップ・コンポーネントの表示がトリガーされます。

<amx:panelPage id="pp1">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row">
<amx:listItem id="li1" action="gosomewhere">
<amx:outputText id="ot1" value="#{row.description}"/>
<amx:setPropertyListener id="spl1"
from="#{row.rowKey}"
to="#{mybean.currentRow}"
type="tapHold"/>
<amx:showPopupBehavior id="spb1"
type="tapHold"
alignid="pp1"
popupid="pop1"
align="startAfter"/>
</amx:listItem>
</amx:listView>>
</amx:panelPage>
<amx:popup id="pop1">
<amx:panelGroupLayout id="pgl1" layout="horizontal">
<amx:commandLink id="cm1" actionListener="#{mybean.doX}">
<amx:image id="i1" source="images/x.png"/>
<amx:closePopupBehavior id="cpb1" type="action" popupid="pop1"/>
</amx:commandLink>
<amx:commandLink id="cm2" actionListener="#{mybean.doY}">
<amx:image id="i2" source="images/y.png"/>
<amx:closePopupBehavior id="cpb2" type="action" popupid="pop1"/>
</amx:commandLink>
<amx:commandLink id="cm3" actionListener="#{mybean.doZ}">
<amx:image id="i3" source="images/y.png"/>
<amx:closePopupBehavior id="cpb3" type="action" popupid="pop1"/>
</amx:commandLink>
</amx:panelGroupLayout>
</amx:popup>

次の例は、MAF AMXファイル内のswipeRightジェスチャーの使用方法を示しています。

<amx:panelPage id="pp1">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row">
<amx:listItem id="li1" action="gosomewhere">
<amx:outputText id="ot1" value="#{row.description}"/>
<amx:setPropertyListener id="spl1"
from="#{row.rowKey}"
to="#{mybean.currentRow}"
type="swipeRight"/>
<actionListener id="al1" binding="#{mybean.DoX}" type="swipeRight"/>
</amx:listItem>
</amx:listView>>
</amx:panelPage>

Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

GestureDemoという名前のMAFサンプル・アプリケーションは、様々なMAF AMX UIコンポーネントでのジェスチャーの使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

14.6 3D Touchに対応したiOSデバイスで使用するアプリケーションのショートカットの実装

3D Touchに対応したiOSデバイスにデプロイするMAFアプリケーションは、静的および動的アプリケーション・ショートカットをエンド・ユーザーに提供できます。

3D Touchは、様々なレベルの圧力をタッチスクリーンに加えることにより、エンド・ユーザーがサポートされているデバイスで追加機能にアクセスできるiOSの機能です。図14-70は、エンド・ユーザーがフォアグラウンドのMAFアプリケーションのアイコンを押したときに表示される2つのアプリケーション・ショートカットを示しています。これらのアプリケーション・ショートカットが表示されたら、エンド・ユーザーは目的のショートカット・メニューをタップして、関連付けられたアクション(たとえば、MAFアプリケーションのデフォルトのアプリケーション機能と異なるアプリケーション機能に移動)を呼び出します。

図14-70 3D Touchに対応したiOSデバイスのアプリケーションのショートカット

MAFが提供する次のJava APIを使用して、この機能を実装します。

- oracle.adfmf.framework.event.ApplicationShortcutEvent

- oracle.maf.api.platform.ios.ApplicationShortcutItem

- oracle.maf.api.platform.ios.ApplicationShortcutItem.Icon

- oracle.maf.api.platform.ios.ApplicationShortcuts

これらのAPIの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

MAFは、Android、ユニバーサルWindowsプラットフォームまたは3D Touchに対応していないiOSデバイスにデプロイするMAFアプリケーションでの3D Touchの実装を無視します。

次のコードの抜粋は、アプリケーション・ショートカットを作成してアプリケーションに登録し、エンド・ユーザーがショートカットにアクセスした際に発生するイベントをリスニングし、対応するロジックを呼び出す方法を示します。

// Create a list of application shortcuts.
...
import java.util.ArrayList;
import java.util.List;
...

public void createAppShortcuts(ActionEvent e) {

List<ApplicationShortcutItem> items = new ArrayList<>();

// Create a shortcut item
ApplicationShortcutItem item1 = new ApplicationShortcutItem("type1", "Feature 1");
item1.setLocalizedSubtitle("Subtitle 1");
item1.setIcon(ApplicationShortcutItem.Icon.LOVE);
items.add(item1);

// Create a second shortcut item. This second shortcut demonstrated how you can insert user information,
// perhaps contact information, into a shortcut using the setUserInfo method.
ApplicationShortcutItem item2 = new ApplicationShortcutItem("type2", "Feature 2");
item2.setLocalizedSubtitle("go to feature2");
item2.setIcon(ApplicationShortcutItem.Icon.TASK);
HashMap<String,Object> map = new HashMap<>();
map.put("alpha", "beta");
item2.setUserInfo(map);
items.add(item2);

...
// Create more shortcut items, if desired, and once complete, configure the application with these shortcut items.
ApplicationShortcuts.setShortcutItems(items);
}

// Clear previously-created application shortcuts by passing an empty list to the setShortcutItems method
public void clearShortcuts(ActionEvent e)
{
System.out.println("In clearShortcuts");
List<ApplicationShortcutItem> items = new ArrayList<>();
ApplicationShortcuts.setShortcutItems(items);
}

// Listen for the event where end user invokes the application shortcut
// Consider registering this listener in your application’s LifeCycleListener start method, for example.
EventSourceFactory.getEventSource(EventSourceFactory.APPLICATION_SHORTCUT_EVENT_SOURCE_NAME).addListener(new ShortcutEventListener());
...
private final class ShortcutEventListener implements EventListener
{
@Override
public void onMessage(Event event)
{
ApplicationShortcutItem item = (ApplicationShortcutItem) event.getPayloadObject();
AdfmfJavaUtilities.setELValue("#{applicationScope.applicationShortcut}", item.toString());

// Once you get the event payload, decide what to do. The following example assumes that the shortcut(s) are
// implemented to navigate end users to application features within the MAF application.

if ("type1".equals(item.getType()))
AdfmfContainerUtilities.gotoFeature("feature1");
....

14.7 データ視覚化の指定

MAFでは、データ視覚化コンポーネントのセットを様々なチャート、ゲージおよびマップの作成に使用して、MAF AMXアプリケーション機能のデータを表すことができます。

MAF AMXファイルの<dvtm>ネームスペースの下で次の要素を宣言できます。

- areaChart (「面グラフの作成方法」を参照)

- barChart (「棒グラフの作成方法」を参照)

- bubbleChart (「バブル・チャートの作成方法」を参照)

- comboChart (「コンボ・チャートの作成方法」を参照)

- lineChart (「線グラフの作成方法」を参照)

- pieChart (「円グラフの作成方法」を参照)

- scatterChart (「散布図の作成方法」を参照)

- sparkChart (「スパーク・チャートの作成方法」を参照)

- funnelChart (「ファンネル・チャートの作成方法」を参照)

- stockChart (「株価チャートの作成方法」を参照)

- ledGauge (「LEDゲージの作成方法」を参照)

- statusMeterGauge (「ステータス・メーター・ゲージの作成方法」を参照)

- dialGauge (「ダイアル・ゲージの作成方法」を参照)

- ratingGauge (「評価ゲージの作成方法」を参照)

- geographicMap (「地理マップ・コンポーネントの作成方法」を参照)

- thematicMap (「テーマ・マップ・コンポーネントの作成方法」を参照)

- treemap (「ツリーマップ・コンポーネントの作成方法」を参照)

- sunburst (「サンバースト・コンポーネントの作成方法」を参照)

- timeline (「時系列コンポーネントの作成方法」を参照)

- nBox (「NBoxコンポーネントの作成方法」を参照)

- pictoChart (統計図表の作成方法を参照)

チャート、ゲージ、マップおよび拡張コンポーネント要素には、すべてまたはほとんどに共通の多数の属性があります。Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

JDeveloperでは、データ視覚化コンポーネントは「コンポーネント」ウィンドウの次の場所にあります。

- チャート・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「チャート」の下にあります。

- ゲージ・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「ゲージ」の下にあります。

- マップ・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「マップ」の下にあります。

- ツリーマップ、サンバースト、時系列およびNBoxは、「MAF AMXデータ視覚化」→「共通」→「その他」の下にあります。

図14-71 「コンポーネント」ウィンドウのデータ視覚化コンポーネント

データ視覚化コンポーネントをトラック・アンド・ドロップすると、次のようなダイアログの1つが開き、作成しているコンポーネントのタイプに関する情報が表示されます。

- モバイル・チャートの作成 (図14-72を参照)

図14-72 チャートの作成コンポーネント

- モバイル・ゲージの作成 (図14-73を参照)

図14-73 ゲージの作成コンポーネント

- コンポーネント・ギャラリ (図14-74を参照)

図14-74 マップの作成コンポーネント

- サンバーストの作成(図14-75を参照)

図14-75 サンバーストの作成

注意:

コンポーネントの作成後、ソース・エディタまたは「構造」ビューでそのコンポーネントを選択し、「プロパティ」ウィンドウで「コンポーネント定義の編集」をクリックすることによって、作成ダイアログを再起動できます。

「プロパティ」ウィンドウで提供される同一の編集機能を使用すると、いくつかのデータ視覚化コンポーネントの子コンポーネント(データ・ポイント・レイヤーなど)を編集できます。

CompGalleryという名前のMAFサンプル・アプリケーションは、MAF AMXアプリケーション機能での様々なデータ視覚化コンポーネントの使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

MAF AMXデータ視覚化コンポーネントの詳細は、次を参照してください。

- データ視覚化コンポーネントにイベント・リスナーを追加する方法の詳細は、「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSおよびAndroidのどちらのデバイスでもMAF AMXの実行時の記述のためにコンポーネントに適用できますが、それらのリスナーは設計時には何の効果も持ちません。

- 「データ・コントロール」ウィンドウから作成されるデータバインドされたデータ視覚化コンポーネントの詳細は、「データバインドされたデータ視覚化コンポーネントの作成方法」を参照してください。

- チャートおよびその他のデータ視覚化コンポーネント用の静的データの提供方法の詳細は、「静的データに基づくデータ視覚化コンポーネントの作成方法」を参照してください。

- チャート・コンポーネントのインタラクティブ性の詳細は、「チャート・コンポーネントのインタラクティブ性を有効にする方法」を参照してください。

- 極チャートの作成の詳細は、「極チャートを作成する方法」を参照してください。

- データ視覚化コンポーネントにおけるアクセシビリティのサポートの詳細は、「MAFのアクセシビリティのサポートの理解」を参照してください。

14.7.1 面グラフの作成方法

面グラフ(areaChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けれされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、面の色やパターンなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。カスタム系列スタイルの定義の詳細は、「線グラフの作成方法」を参照してください。

面グラフは、X軸に沿ってズームおよびスクロールできます。これはzoomAndScroll属性を使用して有効化されます。

次の例は、MAF AMXファイルに定義されたareaChart要素を示しています。デフォルト系列スタイルで基本的な面グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

<dvtm:areaChart id="areaChart1"
value="#{bindings.lineData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
animationOnDisplay="auto"
animationDuration="1500" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="areaChartItem1"                          series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<dvtm:yAxis id="yAxis1"
axisMaxValue="80.0"
majorIncrement="20.0"
title="yAxis Title" />
<dvtm:legend id="l1" position="end" />
</dvtm:areaChart>

図14-76 デザインタイムの面グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: このデータ・アイテムが属する系列の名前。

- group: このデータ・アイテムが属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやmarkerShapeなどの他のプロパティも含めることもできます。

次の例に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、chartDataItemのcolor属性およびmarkerShape属性は、追加のグループ化式に基づいて設定されます。

attributeGroups設定はデータ視覚化コンポーネント間で共有でき、属性値は対象のコンポーネント全体に自動的に適用されます。この機能を有効にするには、attributeGroupsのdiscriminant属性を設定します。同じdiscriminant値を持つコンポーネントは各自の設定(attributeGroupsのattributeMatchRule子要素の値など)を共有します。

attributeGroupsは、次の子要素を持つことができます。

- dvtmネームスペースのattributeExceptionRule: 特定のブール条件が満たされる場合に、属性値を別の値に置き換えます。

- dvtmネームスペースのattributeMatchRule: データが特定の値に一致する場合に、属性を置き換えます。

- amxネームスペースのattribute。

<dvtm:areaChart id="areaChart1"
value="#{bindings.lineData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
title="Chart Title"
animationOnDisplay="auto"
animationDuration="1500" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
<dvtm:attributeGroups id="ag1"
type="color"
value="#{row.brand}" />
</amx:facet>
<dvtm:yAxis id="yAxis1"
axisMaxValue="80.0"
majorIncrement="20.0"
title="yAxis Title" />
<dvtm:legend id="l1" position="end" />
</dvtm:areaChart>

注意:

前の例および図14-76では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

orientation属性では、面グラフを水平方向または垂直方向として定義できます。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、面グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-areaChart
- supported properties: all

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.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>

図14-77 デザインタイムの棒グラフ

棒グラフのデータ・モデルは、個々の棒を記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- series: この棒が属する系列の名前。

- group: この棒が属するグループの名前。

- value: データ・アイテムの値(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

orientation属性では、棒グラフを水平方向または垂直方向として定義できます。

chartDataItemのxおよびy属性に加え、z属性を設定することにより、第3の次元となるバーの幅を有効にできます。これは、各バーが別々の重みを表す離散的なデータ・ポイントを記述するときに便利です。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、棒グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-barChart
- supported properties: all

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.3 レンジ・チャートの作成方法

レンジ・チャートによって、データ・アイテムの低値および高値をチャートに表示できます。

レンジ・チャートとしてレンダリングするように面グラフまたは棒グラフを構成するには、<dvtm:chartDataItem>子コンポーネントがサポートするlowおよびhigh属性の値を指定します。次の例は、レンジ・チャートをレンダリングするように面グラフを構成する方法を示しています。図14-78は、棒グラフ・コンポーネントによってレンダリングされたレンジ・チャートの例を示しています。

<dvtm:areaChart var="row" value="#{bindings.rangeData.collectionModel}" id="ac1">
<amx:facet name="dataStamp">
<dvtm:chartDataItem group="#{row.group}" series="#{row.series}" low="#{row.low}" high="#{row.high}" id="cdi1"/>
</amx:facet>
<dvtm:legend position="end" id="l1"/>
</dvtm:areaChart>

図14-78 棒グラフでのレンジ・チャートのレンダリング

1つの範囲属性の値(lowまたはhigh)のみを指定している場合、MAFはデータ・アイテムをnullとして処理し、チャート上でそのアイテムをレンダリングしません。レンジ・チャートをレンダリングするには、lowとhighの両方の属性の値を指定する必要があります。ツールチップおよびデータ・カーソルは、データの高値および低値を表示します。

詳細は、次を参照してください。

- 棒グラフの作成方法

- 面グラフの作成方法

14.7.4 バブル・チャートの作成方法

バブル・チャート(bubbleChart)は、各データ・アイテムがx座標、y座標およびサイズ(バブル)を持つ一連のデータ・アイテムを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(「線グラフの作成方法」を参照)や面グラフ(「面グラフの作成方法」を参照)とは異なり、バブル・チャートには系列およびグループの厳密な概念がありません。

バブル・チャートは、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>

図14-79 デザインタイムのバブル・チャート

次の例では、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として渡されます。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、バブル・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-bubbleChart
- supported properties: all

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.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>

図14-80 デザインタイムのコンポ・チャート

orientation属性では、コンボ・チャートを水平方向または垂直方向として定義できます。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、コンボ・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-comboChart
- supported properties: all

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.6 線グラフの作成方法

線グラフ(lineChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、線の色、太さ、スタイルなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。

線グラフは、X軸に沿ってズームおよびスクロールできます。これはzoomAndScroll属性を使用して有効化されます。

次の例は、MAF AMXファイルに定義されたlineChart要素を示しています。デフォルト系列スタイルで基本的な線グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}"
color="#{row.color}" />
</amx:facet>
</dvtm:lineChart>

図14-81 デザインタイムの線グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: この線が属する系列の名前。

- group: この線が属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやmarkerShapeなどの他のプロパティも含めることもできます。

次の例に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、データ・アイテムのcolorおよびshape属性が、追加のグループ化式に基づいて設定されます。attributeGroupsには、次の子要素があります。

- dvtmネームスペースのattributeExceptionRule: 特定のブール条件が満たされる場合に、属性値を別の値に置き換えます。

- dvtmネームスペースのattributeMatchRule: データが特定の値に一致する場合に、属性を置き換えます。

- amxネームスペースのattribute。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
<dvtm:attributeGroups id="ag1"
type="color"
value="#{row.brand}" />
</dvtm:chartDataItem>
</amx:facet>
</dvtm:lineChart>

注意:

次の2つの例では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

系列のデフォルト・スタイル・プロパティをオーバーライドするには、次の例に示すように、オプションのseriesStampファセットを定義し、seriesStamp要素を使用してカスタム系列スタイルを設定します。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="#{row.series}"
lineStyle="#{row.lineStyle}"
lineWidth="#{row.lineWidth}" />
</amx:facet>
</dvtm:lineChart>

前述の例では、seriesStyle要素がseries属性の値に基づいてグループ化されています。同じ名前を持つ系列は、seriesStyleの他の属性(color、lineStyle、lineWidthなど)によって定義された、同じプロパティ・セットを共有する必要があります。MAF AMXでは、同じ系列名を持つ異なる属性値を検出した場合、前回処理された値を適用します。

かわりに、次の例に示すように、seriesStyle要素のrendered属性を使用して、MAF AMXチャートで系列スタイルを制御できます。

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}"
color="#{row.color}" />
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="#{row.series}"
color="red"
lineWidth="3"
lineStyle="solid"
rendered="#{row.series == 'Coke'}" />
<dvtm:seriesStyle series="#{row.series}"
color="blue"
lineWidth="2"
lineStyle="dotted"
rendered="#{row.series == 'Pepsi'}" />
</amx:facet>
</dvtm:lineChart>

orientation属性では、線グラフを水平方向または垂直方向として定義できます。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、線グラフ・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-lineChart
- supported properties: all

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.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>

図14-82 デザインタイムの円グラフ

円グラフの区分ラベルの位置を構成するには、sliceLabelPosition属性を使用します。デフォルト(auto)で、区分内にラベルが収まる場合、ラベルは区分の内側に配置されます。それ以外は、区分の外側に配置されます。

selectionEffect属性を設定することにより、円グラフ・コンポーネントの展開(区分の間隔)効果を定義することもできます。

sliceGaps属性を使用すると、次の図に示すような、隣接する区分の間にギャップのある円グラフ・コンポーネントを作成できます。sliceGapsの値は、チャートにギャップのない0(デフォルト)から、最大のギャップを可能にする1の範囲です。

円グラフのデータ・モデルは、個々の円データ・アイテムを定義するアイテムのコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- label: 区分ラベル。

- value: 区分の値。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: 区分の境界線の色。

- color: 区分の色。

- explode: 区分を開くときのオフセット。

amxネームスペースからfacet子要素を定義できます。facetには、pieDataItemを子として含めることができます(「円グラフのデータ・アイテムの定義」を参照)。

14.7.7.1 円グラフをドーナツ・グラフとして構成

中心が空洞のドーナツのような円グラフ・コンポーネントを作成できます。

空いている領域(と、結果的にはドーナツの幅)のサイズを構成するには、pieChartのinnerRadius属性を使用します。また、ドーナツの中心部のテキストを指定するには、centerLabel属性を設定します。

図14-83 デザインタイムのドーナツ・グラフ

14.7.7.2 円グラフのスタイル設定

dvtm-pieChart、dvtm-chartPieLabel、dvtm-chartPieCenterLabelおよびdvtm-chartSliceLabelクラスで定義されているデフォルトのCSS設定を上書きすることで、円グラフ・コンポーネントのスタイルを設定できます。

- トップレベル要素は次を使用してスタイル設定できます。

.dvtm-pieChart
- supported properties: all

- 円グラフのラベルのスタイルは、次のものを使用して設定できます。

.dvtm-chartPieLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

- 円グラフの区分ラベルは次を使用してスタイル設定できます。

.dvtm-chartSliceLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

- ドーナツ・グラフの中心部のラベルのスタイルは、次のものを使用して設定できます。

.dvtm-chartPieCenterLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.8 散布図の作成方法

散布図(scatterChart)は、各アイテムがx座標、y座標およびサイズを持つデータ・アイテムを表す連続しないドットでデータを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(「線グラフの作成方法」を参照)や面グラフ(「面グラフの作成方法」を参照)とは異なり、散布図には系列およびグループの厳密な概念がありません。

散布図は、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>

図14-84 デザインタイムの散布図

散布図のデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。各データ・アイテムの属性は、スタンプ(dataStamp)によって定義され、通常、次のものがあります。

- x、y: 値の座標(必須)。

- markerSize: マーカーのサイズ(オプション)。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: データ・アイテムの境界線の色。

- color: データ・アイテムの色。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、散布図コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-scatterChart
- supported properties: all

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.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>

図14-85 デザインタイムのスパーク・チャート

スパーク・チャートのデータ・モデルは、個々のスパーク・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: スパーク値。

amxネームスペースからfacet子要素を定義できます。facetには、sparkDataItemを子として含めることができます(「スパーク・チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトCSS設定を上書きすることで、スパーク・チャート・コンポーネントのトップレベル要素をスタイル設定できます。

.dvtm-sparkChart
- supported properties: all

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.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>

図14-86 デザインタイムのファンネル・チャート

ファンネル・チャートのデータ・モデルは、個々のファンネル・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: ファンネル値

- label: ファンネル区分ラベル

amxネームスペースからfacet子要素を定義できます。facetには、funnelDataItemを子として含めることができます(「ファンネルのデータ・アイテムの定義」を参照)。

クラスdvtm-funnelChartおよびdvtm-funnelDataItemで定義されているデフォルトCSS設定を上書きすることで、ファンネル・チャート・コンポーネントをスタイル設定できます。

- トップレベル要素は次を使用してスタイル設定できます。

.dvtm-funnelChart
- supported properties: all

- ファンネル・チャートのデータ・アイテムは次を使用してスタイル設定できます。

.dvtm-funnelDataItem
- supported properties: border-color, background-color

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.11 株価チャートの作成方法

株価チャート(stockChart)コンポーネントは、特定の日の様々な時点での株価の始値、終値、安値および高値を表示します。始値および終値を表示するローソク・バーは、通常、その日に株価が上昇したときに緑色で、終値が始値より低い場合に赤色で表示されます。

次の例は、MAF AMXファイルで定義されたstockChart要素を示しています。dataStampファセットにはstockDataItem要素が含まれています。

<dvtm:stockChart id="stockChart1"
dataCursor="#{pageFlowScope.dataCursor}"
dataCursorBehavior="#{pageFlowScope.dataCursorBehavior}"
dataSelection="#{pageFlowScope.dataSelection}"
emptyText="No data found"
footnote=""
footnoteHalign="#{pageFlowScope.footnoteHalign}"
inlineStyle="width: 100%; height:#{DvtProperties.hostedMode ?
'400px' : deviceScope.hardware.screen.availableHeight-200}px"
shortDesc="Stock Chart"
styleClass="dvtm-gallery-component"
subtitle="#{pageFlowScope.subtitle}"
title="#{pageFlowScope.title}"
titleHalign="#{pageFlowScope.titleHalign}"
value="#{bindings.stockChartData.collectionModel}"
var="row"
volumeColor="#{pageFlowScope.volumeColor}"
zoomAndScroll="#{pageFlowScope.zoomAndScroll}"
timeAxisType="mixedFrequency"
animationOnDataChange="auto"
animationOnDisplay="auto"
viewportChangeListener="#{StockChartDataList.ViewportListener}">
<amx:facet name="dataStamp">
<dvtm:stockDataItem id="cdi1
close="#{row.close}"
high="#{row.high}"
low="#{row.low}"
open="#{row.open}"
volume="#{row.volume}"
x="#{row.x}"
series="BTC"
shortDesc="Stock Data Item">
</dvtm:stockDataItem>
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="BTC"
type="#{pageFlowScope.seriesType}"
id="ss1">
</dvtm:seriesStyle>
</amx:facet>
<amx:facet name="overview">
<dvtm:overview id="ovw" rendered="#{pageFlowScope.overview}">
</dvtm:overview>
</amx:facet>
<dvtm:xAxis id="xAxis"
viewportMinValue="#{pageFlowScope.viewportMinValue}"
viewportMaxValue="#{pageFlowScope.viewportMaxValue}">
</dvtm:xAxis>
<dvtm:y2Axis id="y2Axis">
<dvtm:tickLabel id="y2TickLabel"
rendered="#{pageFlowScope.showY2}"
scaling="none">
<amx:convertNumber id="cn5"
type="number"
minFractionDigits="1"
maxFractionDigits="1"/>
</dvtm:tickLabel>
</dvtm:y2Axis>
<dvtm:chartValueFormat id="cvf2label"
type="close">
<amx:convertNumber id="closeConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2label1"
type="high"
scaling="none">
<amx:convertNumber id="highConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2label2"
type="low"
scaling="none">
<amx:convertNumber id="lowConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2label3"
type="open"
scaling="none">
<amx:convertNumber id="openConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2label4"
type="volume"
scaling="none">
<amx:convertNumber id="cn6"
type="number"
minFractionDigits="1"
maxFractionDigits="1"/>
</dvtm:chartValueFormat>
<dvtm:yAxis id="yAxis">
<dvtm:tickLabel id="tc1" scaling="none">
<amx:convertNumber id="yAxisConvertNumber"
type="currency"
minFractionDigits="1"
maxFractionDigits="1"
currencySymbol="$"/>
</dvtm:tickLabel>
<dvtm:referenceLine id="rl2"
color="rgb(255,128,0)"
lineWidth="1"
lineStyle="solid"
location="front"
lineType="straight"
text="Technical analysis"
shortDesc="Technical Analysis"
displayInLegend="off"
rendered="#{pageFlowScope.technicalAnalysis}">
<amx:iterator var="ref"
value="#{bindings.stockReferenceData2.collectionModel}"
id="i2">
<dvtm:referenceLineItem value="#{ref.value}" x="#{ref.x}" id="rli2"/>
</amx:iterator>
</dvtm:referenceLine>
<dvtm:referenceLine id="rl1"
color="#008000"
lineWidth="1"
lineStyle="solid"
location="front"
lineType="straight"
text=""
shortDesc="Total Transaction Fees"
displayInLegend="off"
rendered="#{pageFlowScope.transactionFees}">
<amx:iterator var="ref"
value="#{bindings.stockReferenceData.collectionModel}"
id="i1">
<dvtm:referenceLineItem value="#{ref.value}" x="#{ref.x}" id="rli1"/>
</amx:iterator>
</dvtm:referenceLine>
</dvtm:yAxis>
<dvtm:chartValueFormat id="cvf1"
type="y"
scaling="none"/>
</dvtm:stockChart>

図14-87 設計時の株価チャート

株価チャートのデータ・モデルは、個々の株価データ・アイテムを記述するアイテム(行)のコレクションによって表されます。

amxネームスペースからfacet子要素を定義できます。facetには、stockDataItemを子として含めることができます(「株価のデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、株価コンポーネントのスタイルを設定できます。

- dvtm-stockChart-rising

- dvtm-stockChart-falling

- dvtm-stockChart-range

チャートのスタイル設定の詳細は、「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

14.7.12 チャート・コンポーネントのスタイル設定方法

スパーク・チャートを除き、次のクラスで定義されているデフォルトCSS設定を上書きすることで、チャート・コンポーネントをスタイル設定できます。

- チャート・コンポーネントの凡例は次を使用してスタイル設定できます。

.dvtm-legend
- supported properties used for text styling:
font-family, font-size, font-weight, color, font-style
- supported properties used for background styling: background-color
- supported properties used for border styling:
border-color (used when border width > 0)

.dvtm-legendTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-legendSectionTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

- チャート・コンポーネントのタイトル、サブタイトルなどは次を使用してスタイル設定できます。

.dvtm-chartTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartSubtitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartFootnote
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartTitleSeparator
- supported properties:
visibility (is title separator rendered),
border-top-color, border-bottom-color

- チャート・コンポーネントの軸は次を使用してスタイル設定できます。

.dvtm-chartXAxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartYAxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartY2AxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartXAxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartYAxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartY2AxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

チャート・コンポーネントのトップレベル要素のスタイル設定に加え、一部のチャートの特定の子要素をスタイル設定できます。

14.7.13 チャート・コンポーネントでのイベントの使用方法

ViewportChangeEventを使用して、チャート・コンポーネントのズームおよびスクロールを処理できます。ズームまたはスクロールのいずれかが発生すると、コンポーネントは、新しいビューポートを定義する情報でロードされるイベントを起動します。

viewportChangeListenerは、面グラフ、棒グラフ、コンボ・チャートおよび線グラフ・コンポーネントの属性として指定できます。

DrillEventを使用して、グラフ・コンポーネントのドリルを処理できます。ドリルが発生すると、コンポーネントはこのイベントを起動します。

drillListenerは、任意のチャート・コンポーネントの属性として指定できます。さらに、詳細なドリル制御を指定するため、chartDataItem、funnelDataItem、pieDataItemおよびseriesStyleのdrilling属性を使用できます。

「イベント・リスナーの使用方法」を参照してください。

14.7.14 チャート・ツールチップのカスタマイズに関する必知事項

MAF AMXのチャート値フォーマット(chartValueFormat)子コンポーネントでは、次の例に示すように、ラベルを指定してツールチップ内の値の表示を無効にすることによって、チャート・コンポーネントのツールチップをカスタマイズできます。

<dvtm:barChart id="bc1" var="row" value="bindings.Data.collectionModel">
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="cdi1"
series="row.series"
group="row.group"
value="row.value"/>
</amx:facet>
<dvtm:chartValueFormat id="cvf1" type="value" tooltipLabel="Revenue">
<amx:convertNumber ... />
</dvtm:chartValueFormat>
<dvtm:chartValueFormat id="cvf2" type="series" tooltipLabel="Region"/>
<dvtm:chartValueFormat id="cvf3" type="groups" tooltipLabel="Product Type"/>
</dvtm:barChart>

14.7.15 カテゴリ軸でのチャートのソートを有効にする方法

棒グラフ、線グラフ、面グラフおよびコンボ・チャート・コンポーネントのsorting属性を使用すると、その値によるチャート・カテゴリのソートを有効にできます。たとえば、棒グラフのバーで表される国々をそのGDPの昇順または降順で表示できます。デフォルトでは、ソートは無効になっています。

14.7.16 チャートの初期ズームを定義する方法

棒グラフ、線グラフ、面グラフおよびコンボ・チャート・コンポーネントのinitialZooming属性を使用すると、現在のチャートのサイズで使用可能なチャートのズーム・レベルを自動的に設定しながら、グラフの初期状態で最初または最後のいずれのデータ・ポイントを表示するかを指定できます。デフォルトでは、初期ズームは無効になっています。

14.7.17 特定のチャート系列のスタックを定義する方法

棒グラフ、横棒グラフ、線グラフ、面グラフおよびコンボ・チャート・コンポーネントでは、stack属性がサポートされており、データ系列を積み重ねて表示できます。この属性を単独で使用する場合は、チャート内のデータ系列のすべてにスタックを適用するか、またはすべてに適用しないかのいずれかです。チャート内のいくつかの系列のスタックを有効にして、その他を無効にするには、子コンポーネントである系列スタイル(seriesStyle)のstackCategory属性と、親チャートのstack属性を同時に使用します。チャートのstack属性をonに設定し、系列スタイルのstackCategory属性を指定して、チャート内の特定の系列をどのようにスタックするかを定義します。

14.7.18 チャートの二重-Y軸分割を有効にする方法

棒グラフ、線グラフ、面グラフおよびコンボ・チャート・コンポーネントのsplitDualY属性を使用すると、Y2軸を使用するチャートで、同じX軸を共有するスタックされたプロット領域に2つのデータ・セットを別々に表示できます。デフォルトでは、この機能は無効になっています。

14.7.19 LEDゲージの作成方法

チャートと異なり、ゲージでは、単一のデータ・ポイントを重視し、そのポイントを最小、最大およびしきい値インジケータと比較して問題領域を識別します。LED(電光表示)ゲージ(ledGauge)は、重要業績評価指標(KPI)などの測定値をグラフィカルに表します。LEDゲージには、いくつかのスタイルがあります。矢印付きのものは、よい(上矢印)、普通(右または左矢印)および悪い(下矢印)を示すために使用されます。ゲージのしきい値はいくつでも指定できます。ただし、一部のLEDゲージ(矢印または三角形のインジケータを持つものなど)では、指し示す有効な方向の数が限られているため、サポートされるしきい値の数にかぎりがあります。矢印または三角形のインジケータの場合、しきい値の最大数は3です。

次の例は、MAF AMXファイルで定義されたledGauge要素を示しています。

<dvtm:ledGauge id="ledGauge1"
value="65"
type="circle"
inlineStyle="width: 100px; height: 80px; float: left;
border-color: navy; background-color: lightyellow;">
<dvtm:threshold id="threshold1" text="Low" maxValue="40" />
<dvtm:threshold id="threshold2" text="Medium" maxValue="60" />
<dvtm:threshold id="threshold3" text="High" maxValue="80" />
</dvtm:ledGauge>

図14-88 デザインタイムのLEDゲージ

LEDゲージのデータ・モデルは、value属性で指定される単一のメトリック値で表されます。

次のamx子要素を定義できます。

- showPopupBehavior (「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (「入力の検証」を参照)

14.7.20 ステータス・メーター・ゲージの作成方法

ステータス・メーター・ゲージ(statusMeterGauge)は、長方形の水平バーまたは円に沿ってタスクの進捗状況または測定値のレベルを示します。コンポーネントのある部分は、別の部分にマークされた範囲に対する現在の測定値のレベルを示します。また、しきい値は、サイズ変更が可能なインジケータの背後に表示できます。

MAF AMXデータ視覚化のステータス・メーター・ゲージ・コンポーネントでは、参照線(referenceLine)のサポートが提供されます。この参照線を使用して、ブレット・グラフを生成できます。

次の例は、MAF AMXファイルで定義されたstatusMeterGauge要素を示しています。

<dvtm:statusMeterGauge id="meterGauge1"
value="65"
animationOnDisplay="auto"
animationDuration="1000"
inlineStyle="width: 300px;
height: 30px;
float: left;
border-color: black;
background-color: lightyellow;"
minValue="0"
maxValue="100">
<dvtm:metricLabel/>
<dvtm:threshold id="threshold1" text="Low" maxValue="40" />
<dvtm:threshold id="threshold2" text="Medium" maxValue="60" />
<dvtm:threshold id="threshold3" text="High" maxValue="80" />
</dvtm:statusMeterGauge>

図14-89 デザインタイムの長方形のステータス・メーター・ゲージ

垂直の矩形で表したステータス・メーター・ゲージを作成するには、そのorientation属性をverticalに設定します。デフォルトでは、この属性はhorizontalに設定されいるため、横向きの長方形になります。

円形で表される(図14-90を参照)ステータス・メーター・ゲージを作成するには、orientation属性をcircularに設定します。

図14-90 デザインタイムの円形のステータス・メーター・ゲージ

ステータス・メーター・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

次のamx子要素を定義できます。

- showPopupBehavior (「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (「入力の検証」を参照)

14.7.21 ダイアル・ゲージの作成方法

ダイヤル・ゲージ(dialGauge)は、悪いからよいまで変化する値(しきい値)の範囲を指定します。ゲージのインジケータではメトリックの現在の値が示される一方、図形によってその値のステータスを評価できます。

次の例は、MAF AMXファイルで定義されたdialGauge要素を示しています。

<dvtm:dialGauge id="dialGauge1"
background="#{pageFlowScope.background}"
indicator="#{pageFlowScope.indicator}"
value="#{pageFlowScope.value}"
minValue="#{pageFlowScope.minValue}"
maxValue="#{pageFlowScope.maxValue}"
animationDuration="1000"
animationOnDataChange="auto"
animationOnDisplay="auto"
shortDesc="#{pageFlowScope.shortDesc}"
inlineStyle="#{pageFlowScope.inlineStyle}"
styleClass="#{pageFlowScope.styleClass}"
readOnly="true">
</dvtm:dialGauge>

図14-91 デザインタイムのダイヤル・ゲージ

ダイヤル・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

次の例は、暗い背景テーマと、-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>

図14-92 メトリック・ラベルおよびティック・ラベルの付いたデザインタイムのダイアル・ゲージ

dialGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (「入力の検証」を参照)

14.7.22 評価ゲージの作成方法

評価ゲージ(ratingGauge)を使用すると、事前定義された視覚スケールに評価を表示したり、その評価を変更できます。デフォルトの評価単位は、星で表されます。ratingGaugeのshape属性を設定することによって、これを円、人間、矩形、星形、三角形またはひし形として構成できます。そのorientationプロパティの値を設定することで、垂直または水平にレンダリングすることもできます。デフォルトでは、水平にレンダリングされます。

次の例は、MAF AMXファイルで定義されたratingGauge要素を示しています。

<dvtm:ratingGauge id="ratingGauge1"
value="#{pageFlowScope.value}"
minValue="0"
maxValue="5"
inputIncrement="full"
shortDesc="#{pageFlowScope.shortDesc}"
inlineStyle="#{pageFlowScope.inlineStyle}"
readOnly="true"
shape="circle"
unselectedShape="circle">
</dvtm:ratingGauge>

図14-93 デザインタイムの評価ゲージ

評価ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

ratingGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (「入力の検証」を参照)

14.7.22.1 shortDesc属性の上書き

ratingGaugeのshortDesc属性の値は、threshold子要素のshortDesc属性を設定することによって上書きできます。指定されると、ratingGaugeのvalue属性が指定されたしきい値に到達するたびに、thresholdのshortDescによって親のshortDescが置き換えられます。

次の例は、評価ゲージ・コンポーネントのshortDesc属性を上書きする方法を示しています。

<dvtm:ratingGauge id="ratingGauge1"
value="#{pageFlowScope.value}"
minValue="#{pageFlowScope.minValue}"
maxValue="#{pageFlowScope.maxValue}"
shortDesc="#{pageFlowScope.shortDesc}"
inputIncrement="#{pageFlowScope.inputIncrement}"
inlineStyle="#{pageFlowScope.inlineStyle}"
<dvtm:threshold id="tr1" maxValue="2" shortDesc="Performance: Poor"/>
<dvtm:threshold id="tr2" maxValue="3" shortDesc="Performance: Average"/>
<dvtm:threshold id="tr3" maxValue="4" shortDesc="Performance: Good"/>
<dvtm:threshold id="tr4" maxValue="5" shortDesc="Performance: Excellent"/>
</dvtm:ratingGauge>

14.7.22.2 評価ゲージ・コンポーネントへのカスタム・スタイルの適用

エンド・ユーザーが評価ゲージ・コンポーネントに対して実行したアクションに応じて、評価単位(イメージ)は次のいずれかの状態を取得できます。

- selected: 単位を選択した場合。

- unselected: 単位を選択しなかった場合。

- changed: 単位を変更した場合。

- hover: 単位にマウスを置いた場合。

注意:

タッチ・インタフェースを使用するモバイル・デバイスでは、hover状態はタップしたまま押さえるジェスチャーを通じて呼び出されます。

各状態は、独自のイメージの配列と、色および枠線の色を定義するプロパティで表現できます。

デフォルトでは、ratingGaugeのshape属性によって、hoverおよびchanged状態の選択内容が決まります。unselected状態は、ratingGaugeのunselectedShape属性を使用して個別に設定できます。

デフォルトCSS設定を上書きすることで、評価ゲージ・コンポーネントをスタイル設定できます。CSSファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次に、評価ゲージ単位の各状態の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;
}

14.7.23 チャートおよびゲージ・コンポーネントの子要素の定義方法

チャートおよびゲージには様々な子要素を定義できます。それらの子要素のいくつかを次に示します。

- chartDataItem (「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (「X軸、Y軸およびY2軸の定義および構成」を参照)

- legend (「凡例の定義および構成」を参照)

- pieDataItem (「円グラフのデータ・アイテムの定義」を参照)

- sparkDataItem (「スパーク・チャートのデータ・アイテムの定義」を参照)

- threshold (「しきい値の定義」を参照)

- funnelDataItem (「ファンネルのデータ・アイテムの定義」を参照)

- stockDataItem (「株価のデータ・アイテムの定義」を参照)

JDeveloperでは、データ視覚化コンポーネントの子コンポーネントは、「コンポーネント」ウィンドウの「MAF AMXデータ視覚化」→「共有子タグ」の下および「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」の下にあります(図14-94を参照)。

図14-94 チャートおよびゲージの子コンポーネントの作成

14.7.23.1 チャートのデータ・アイテムの定義

チャート・データ・アイテム(chartDataItem)要素は、円グラフを除くすべてのサポートされているチャートでチャート・データ・アイテムが使用するパラメータを指定します。

チャート・データ・アイテムでのテキスト表示を有効化でき、chartDataItem要素の関連する属性を設定することで、そのラベル、ラベル位置およびラベル・スタイルを制御でき、さらに、チャート自体のdataLabelPosition属性を設定することで指定されたチャートのすべてのデータ・ラベルの位置を指定できます。

注意:

散布図、円グラフおよびファンネル・チャートのコンポーネントでは、dataLabelPosition属性はサポートされていません。

14.7.23.2 凡例の定義および構成

凡例(legend)要素は、凡例パラメータを指定します。

凡例用のグラフ領域のサイズをカスタマイズするには、凡例コンポーネントのsize属性とmaxSize属性を使用します。

14.7.23.3 X軸、Y軸およびY2軸の定義および構成

X軸(xAxis)およびY軸(yAxis)要素は、チャートのX軸とY軸を定義します。Y2軸(y2Axis)は、オプションのY2軸を定義します。これらの要素は、MAF AMXファイルで次のように宣言されます。

<dvtm:xAxis id="xAxis1" scrolling="on" axisMinValue="0.0" axisMaxValue="50.0" />

軸用のグラフ領域のサイズをカスタマイズするには、X軸、Y軸およびY2軸コンポーネントのsize属性とmaxSize属性を使用します。また、軸ベースラインの色、幅およびスタイルをカスタマイズするには、その主ティック子要素を構成します。

14.7.23.4 円グラフのデータ・アイテムの定義

円グラフのデータ・アイテム(pieDataItem)要素は、円グラフの区分のパラメータを指定します(「円グラフの作成方法」を参照)。

14.7.23.5 スパーク・チャートのデータ・アイテムの定義

スパーク・チャートのデータ・アイテム(sparkDataItem)要素は、スパーク・チャート・アイテムのパラメータを指定します(「スパーク・チャートの作成方法」を参照)。

14.7.23.6 ファンネルのデータ・アイテムの定義

ファンネル・データ・アイテム(funnelDataItem)要素は、ファンネル・チャート・アイテムのパラメータを指定します(「ファンネル・チャートの作成方法」を参照)。

14.7.23.7 株価のデータ・アイテムの定義

株価データ・アイテム(stockDataItem)要素は、株価チャート・アイテムのパラメータを指定します(「株価チャートの作成方法」を参照)。

14.7.23.8 しきい値の定義

しきい値(threshold)要素は、ゲージのしきい値範囲を指定します(「LEDゲージの作成方法」および「ステータス・メーター・ゲージの作成方法」を参照)。

14.7.24 地理マップ・コンポーネントの作成方法

地理マップ(geographicMap)は、1つのマップに重ね合せた1つ以上のインタラクティブな情報レイヤーでデータを表します。このコンポーネントが基礎となるマップ・プロバイダとしてGoogleマップまたはOracle Maps Cloud Serviceを使用するように構成します。マップ・プロバイダを指定しない場合、コンポーネントはGoogleマップを使用します。

図14-95 は、CompGalleryサンプル・アプリケーションのgeographicMapコンポーネントを示しています。

図14-95 CompGalleryサンプル・アプリケーションの地理マップ

geographicMapコンポーネントは、安定している最新v3バージョンのGoogle Maps JavaScript APIを使用します。

geographicMapに対してpointDataLayer子要素を定義できます。pointDataLayerを使用すると、ポイントに関連するデータをマップ上に表示できます。pointDataLayerは子要素としてpointLocationを持つことができます。pointLocationは、データ・ポイントの位置を決定するデータ・レイヤーのモデル内の列を指定します。これらの位置は、住所またはX座標とY座標で表すことができます。

pointLocationは、子要素としてmarkerを持つことができます。markerは、マップ上のデータ・ポイントに関連付けられた組込み形状またはカスタム形状をスタンプ・アウトするために使用します。markerでは、マーカーとしてレンダリングされるイメージのURIを指定するための一連のプロパティがサポートされています。マーカーは子要素としてconvertNumberを持つことができます(「数値の変換方法」を参照)。また、ポップアップ(「ポップアップ・コンポーネントの使用方法」を参照)を有効にして、geographicMapのmarkerに表示されるようにできます。そのためには、次の例に示すように、showPopupBehavior要素をmarker要素の子として宣言し、showPopupBehaviorのalignId属性をmarkerのid属性の値に設定します。

<dvtm:geographicMap id="geographicMap_1" shortDesc="#{pageFlowScope.shortDesc}">
<dvtm:pointDataLayer id="pdl1"
var="row"
value=
"#{bindings.geographicMapPointData.collectionModel}">
<dvtm:pointLocation id="pl1"
pointX="#{row.pointX}"
pointY="#{row.pointY}">
<dvtm:marker id="marker1"
shortDesc="#{row.shortDesc}"
rendered="true">
<amx:showPopupBehavior id="spb1"
popupId="popup1"
alignId="marker1"
align="topCenter"
decoration="anchor"/>
<amx:setPropertyListener from="#{row.shortDesc}"
to="#{pageFlowScope.currentCity}"
type="action"/>
</dvtm:marker>
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:geographicMap>
...
<amx:popup id="popup1" backgroundDimming="off" autoDismiss="true">
<amx:outputText id="otTest" value="City: #{pageFlowScope.currentCity}"/>
...
</amx:popup>

geographicMapコンポーネントでは、タッチ・ジェスチャーを使用したピンの挿入(マップ上での点の作成)が可能です。この機能を構成するには、mapInputListenerを使用します。「Mapコンポーネントでのイベントの使用方法」を参照してください。

geographicMapコンポーネントに関連するタスクの詳細は、次を参照してください。

- 地理プロバイダ情報を指定した地理マップ・コンポーネントの構成

- 地理マップ・コンポーネントでのルートの表示

14.7.24.1 地理プロバイダ情報を指定した地理マップ・コンポーネントの構成

基礎となるマップに特定のプロバイダ(GoogleまたはOracle)を使用するようにgeographicMapコンポーネントを構成するには、アプリケーションのadf-config.xmlファイルに名前と値のペアとして次のプロパティを設定します。

- mapProvider: oraclemapsまたはgooglemapsを指定します。

- geoMapKey: mapProviderがgooglemapsに設定されている場合は、ライセンス・キーを指定します。

- geoMapClientId: mapProviderがgooglemapsに設定されている場合は、Googleマップ・ビジネス・ライセンスのクライアントIDを指定します。

- mapViewerUrl: mapProviderがoraclemapsに設定されている場合は、Oracle Maps Cloud Serviceのマップ・ビューアURLを指定します。

- baseMap: mapProviderがoraclemapsに設定されている場合は、Oracle Maps Cloud Serviceとともに使用するベース・マップを指定します。

注意:

Googleマップを使用するようにgeographicMapコンポーネントを構成するには、Googleから該当するライセンスを取得する必要があります。

次の例は、Googleマップ用の構成を示しています。

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="googlemaps"/>
<adf-property name="geoMapKey" value="your key"/>
</adf-properties-child>

Googleマップのライセンスがないと、アドレス解決を可能にするジオコーディング・サービスへのアクセスが制限されます。許可されている制限を超過すると、MAFは、ジオコーディング・サービスによって生成されるエラー・メッセージ用のハンドラを提供します。アドレス・ポイントの最大許容数を超過する場合、実行時にこれらのメッセージは表示されます。1秒当たり10リクエストに制限されているリクエストの数、および冗長リクエストの数はジオコーディングAPIに送られません。

次の表に示されたエラー・メッセージをモニターします。

表14-10

エラーID

メッセージ

説明

OVER_QUERY_LIMIT

GeoCoder割当て制限を超過しました。

割当て制限を超過していることを示しています。

REQUEST_DENIED

リクエストが拒否されました。APIキーおよびクライアントIDを確認します。

リクエストに、result_typeまたはlocation_typeパラメータは入っていても、APIキーもクライアントIDも入っていないため、リクエストが拒否されたことを示しています。

注意:

Oracle Maps Cloud Serviceを使用する場合は、「使用条件」および「業者向け通知」を順守する必要があります。Oracle Maps Cloud Serviceは、http://www.oracle.com/us/corporate/contracts/maps-cloud-hd-policies-2767907.pdfで示されているOracle Maps Cloud Serviceエンタープライズ・ホスティングおよび配信ポリシーの規約の下に提供されます。

次の例は、Oracle Maps Cloud Service用の構成を示しています。

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="oraclemaps"/>
<adf-property name="mapViewerUrl" value="your-mapviewer-server-url"/>
<adf-property name="baseMap" value="your-basemap-id"/>
</adf-properties-child>

iOS 9以降を使用するデバイス上で実行されるMAFアプリケーションは、Apple iOSのアプリケーション・トランスポート・セキュリティ(ATS)の要件を満たすために、アプリケーションからサービスへのすべての接続にHTTPSを使用する必要があります。MAFアプリケーションをiOS 9以降にデプロイしている場合は、次のいずれかのオプションを使用してアプリケーションを構成し、geographicMapコンポーネントがOracle Maps Cloud ServiceをiOS 9デバイスでレンダリングできるようにします。

1. MAFアプリケーションをデプロイするときにATSを無効にします。「iOSビルド・オプション」を参照してください。このオプションはお薦めできません。

2. HTTPSリクエストを受け入れるようにOracle Maps Cloud Serviceサービスを構成し、geographicMapコンポーネントがHTTPSを使用するようにMAFアプリケーションを構成します。後者の構成は、アプリケーションのadf-config.xmlファイルで実行します。次の例は、geographicMapコンポーネントがOracle Maps Cloud ServiceをiOS 9デバイス上でレンダリングできるように、アプリケーションのadf-config.xmlファイルを構成する方法を示しています。

<adf:adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="oracleMaps"/>

<!-- Configure the URL for the mapviewer service that provides map data-->
<adf-property name="mapViewerUrl" value="https://elocation.myserver.com/mapviewer"/>

<!-- Configure the URL for the eLocation service that provides geocoding services, such as address resolution,
directions, and so on -->
<adf-property name="eLocationUrl" value="https://elocation.myserver.com/elocation"/>
</adf:adf-properties-child>
. . .
</adf-config>

adf-config.xmlファイルの詳細は、「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」を参照してください。

14.7.24.2 地理マップ・コンポーネントでのルートの表示

geographicMapコンポーネントで、ルート(route)子コンポーネントを追加することで、想定されるウェイポイントを設定して、2点間のルートを表示できます。GoogleマップまたはOracle Maps Cloud Serviceは、どちらも、このユースケースを実装するためのプロバイダとして使用できます。

各geographicMapコンポーネントには、ルートの子コンポーネントを複数設定して、それぞれに1つのルートを指定できます。ルートの出発点、目的地およびオプションでウェイポイントを指定するには、地理マップの点の位置子コンポーネントを使用します。慣例的に、セット内の最初の点の位置は出発点を、最後の点の位置は目的地をそれぞれ定義します。この2つの点の位置に挟まれているすべての点がルートのウェイポイントです。

マップ上のルート表示に使用する線の色、幅および不透明度を定義できます。また、車、自転車または徒歩のうち、どの手段のルートを優先するか、ヒントを指定することも可能です。

次の例は、MAF AMXページのroute要素の定義方法を示しています。

<dvtm:geographicMap id="gm1">

<!-- route defined using a collection model -->
<dvtm:route travelMode="driving" id="d1">
<amx:iterator value="#{el.collectionModel}" var="row">
<dvtm:pointLocation address="#{row.address}" type="address"/>
</amx:iterator>
</dvtm:route>

<!-- route with explicitly defined start and destination -->
<dvtm:route travelMode="driving|walking|bicycling" id="d2">
<!-- route origin -->
<dvtm:pointLocation address="#{pageFlowScope.origin}" type="address">
<!-- route destination -->
<dvtm:pointLocation address="#{pageFlowScope.destination}" type="address"/>
</dvtm:route/>

<dvtm:pointDataLayer id="pdl1">
...
</dvtm:pointDataLayer>

<dvtm:pointDataLayer id="pdl2">
...
</dvtm:pointDataLayer>

</dvtm:geographicMap>

エンド・ユーザーがルートを表す線の上でクリックまたはタップすると、ActionEventが起動します。このイベントを使用すると、action属性を経由してナビゲーションを開始したり、actionListener属性を使用してJavaレイヤーのハンドラを起動したりできます。このアクションは、setPropertyListener、actionListener、showPopupBehaviorおよびshowPopupBehavior子要素で指定されたイベント・リスナーと動作をトリガーする場合にも使用できます。「イベント・リスナーの使用方法」を参照してください。

14.7.25 テーマ・マップ・コンポーネントの作成方法

テーマ・マップ(thematicMap)では、ビジネス・データをスタイル設定された領域内のパターンまたは関連付けられたマーカーとして表します。テーマ・マップでは、地理的な詳細なしで、データに焦点を合せます。

次の例は、MAF AMXファイルで定義されたthematicMap要素とその子を示しています。

<dvtm:thematicMap id="tm1"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
animationOnMapChange="#{pageFlowScope.animationOnMapChange}"
animationDuration="#{pageFlowScope.animationDuration}"
basemap="#{pageFlowScope.basemap}"
tooltipDisplay="#{pageFlowScope.tooltipDisplay}"
inlineStyle="#{pageFlowScope.inlineStyle}"
zooming="#{pageFlowScope.zooming}"
panning="#{pageFlowScope.panning}"
initialZooming="#{pageFlowScope.initialZooming}">
<dvtm:areaLayer id="areaLayer1"
layer="#{pageFlowScope.layer}"
animationOnLayerChange=
"#{pageFlowScope.animationOnLayerChange}"
areaLabelDisplay="#{pageFlowScope.areaLabelDisplay}"
labelType="#{pageFlowScope.labelType}"
areaStyle="background-color"
rendered="#{pageFlowScope.rendered}">
<dvtm:areaDataLayer id="areaDataLayer1"
animationOnDataChange=
"#{pageFlowScope.dataAnimationOnDataChange}"
animationDuration=
"#{pageFlowScope.dataAnimationDuration}"
dataSelection="#{pageFlowScope.dataSelection}"
var="row"
value="#{bindings.thematicMapData.collectionModel}">
<dvtm:areaLocation id="areaLoc1" name="#{row.name}">
<dvtm:area action="sales" id="area1" shortDesc="#{row.name}">
<amx:setPropertyListener id="spl1"
to=
"#{DvtProperties.areaChartProperties.dataSelection}"
from="#{row.name}"
type="action"/>
<dvtm:attributeGroups id="ag1" type="color" value="#{row.cat1}" />
</dvtm:area>
</dvtm:areaLocation>
</dvtm:areaDataLayer>
</dvtm:areaLayer>
<dvtm:legend id="l1" position="end">
<dvtm:legendSection id="ls1" source="ag1"/>
</dvtm:legend>
</dvtm:thematicMap>

図14-96 デザインタイムのテーマ・マップ

markerZoomBehavior属性を使用すると、マップがズームされるとテーマ・マップのマーカーのスケール変更が有効化されます。rotation属性を設定することで、マーカーの回転を有効化でき、この属性の値は、イメージの中心に対してマーカーが回転する(時計回りの度数)角度を表します。

MAF AMXテーマ・マップは、次の拡張機能をサポートしています。

- カスタム・マーカー(「カスタム・マーカーの定義」を参照)

- 領域の分離(「分離領域の定義」を参照)

- 初期ズーム(「初期ズームの有効化」を参照)

- カスタム・ベース・マップ(「カスタム・ベース・マップの定義」を参照)

14.7.25.1 カスタム・マーカーの定義

MAF AMXテーマ・マップでは、MAF AMXイメージ・コンポーネントはサポートされていません。マップのpointLocation内でイメージを使用するには、pointLocationのmarker子要素で、そのsource 属性を使用してイメージを指定します。source属性がマーカーに対して設定されている場合、そのshape属性はMAF AMXで無視されます。

sourceHover、sourceSelectedおよびsourceHoverSelected属性で、ホバーおよび選択効果のイメージを指定できます。これらの1つが指定されていない場合、その特定のマーカー状態に対してはsource属性によって指定されているイメージが使用されます。sourceSelectedが指定されている場合、sourceHoverSelectedが指定されていないときはその値が使用されます。イメージは、PNG、JPG、SVGなどモバイル・デバイスのブラウザでサポートされている任意のフォーマットで構いません。

14.7.25.2 分離領域レイヤーの定義

データの地理的場所の伝達にリージョン・アウトラインが常に必要であるわけではありません。かわりに、テーマ・マップ・コンポーネントには、領域内でイメージやマーカーをセンタリングするためのオプションがあるため、リージョン・アウトラインが描画されない見えない領域レイヤーを定義するオプションがあります。

見えない領域レイヤーを定義するには、CSS値のbackground-colorおよびborder-colorを受け入れるareaLayerのareaStyle属性を使用します。

<dvtm:areaLayer id="areaLayer1"
...
areaStyle="background-color:transparent;border-color:transparent">

この属性によって、dvtm-areaスキニング・キーを使用することなく、デフォルトの領域レイヤーの色および枠線の形状をオーバーライドできます。

14.7.25.3 分離領域の定義

MAF AMXテーマ・マップ・コンポーネントを構成し、areaDataLayerのisolatedRowKey属性を使用してマップの単一の分離領域に収まるようにレンダリングおよびズームできますが、この場合、その領域または領域データ・レイヤーの残りの領域はレンダリングされません。

注意:

分離できるのは、1つのマップで1つの領域のみです。

14.7.25.4 初期ズームの有効化

初期ズームでは、マップ・コンポーネントを通常どおりレンダリングし、その後、マーカーと領域の両方を含むデータ・オブジェクトにズームして合せることができます。この機能を有効にするには、テーマ・マップのinitialZooming属性を使用します。

14.7.25.5 カスタム・ベース・マップの定義

カスタム・ベース・マップ・サポートの一環として、MAF AMXでは、テーマ・マップ・コンポーネントに対して次のことを指定できます。

- 様々な解像度のイメージを持つレイヤー。

- 点の位置(pointLocation)から参照できる名前付きの点を持つ点レイヤー。

- カスタム・ベース・マップ・メタデータXMLファイルを指すテーマ・マップのsource属性。

注意:

MAF AMXでは、カスタム・ベース・マップは次のことはサポートされていません。

- 定型化された領域: 領域レイヤーはカスタム・ベース・マップに定義できないため、ポイント・レイヤーを使用します。

- リソース・バンドル: ロケール固有のツールチップを追加するには、マーカー(marker)のshortDesc属性でELを使用します。

カスタム・ベース・マップを作成するには、メタデータ・ファイルの定義を指す領域レイヤーを指定します(次の例を参照)。基本的なカスタム・ベース・マップを定義するには、背景レイヤーおよびポインタ・データ・レイヤーを指定します。MAF AMXゲージ・コンポーネントと同様に、メタデータ・ファイルで、画面解像度および表示方向ごとに異なるイメージを指定できます。ゲージタイプ・コンポーネントと同様に、テーマ・マップでは、画面解像度および方向に基づいてレイヤーに適切なイメージが選択されます。表示方向は左から右です。

レイヤーはいくつでも定義できます。すべてのレイヤーではすべての名前付きポイントにアクセスできます。名前付きポイントのX位置とY位置は、最初のイメージのイメージ・サイズにマッピングされます。次のいずれかが起きると、テーマ・マップ・コンポーネントはポイントの位置を計算します。

- ズーム・インが実行されます。

- 違ったイメージが違った解像度で表示されます。

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
</layer>
</basemap>

次の例は、点によってカスタム領域レイヤーを宣言するMAF AMXファイルを示しています。このMAF AMXファイルは、使用可能なイメージ(実際は、同じイメージの拡大縮小されたバージョン)のリストを含む、前の例に示したメタデータ・ファイルを指しています。

<dvtm:thematicMap id="tm1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" >
<dvtm:pointDataLayer id="pdl1"
var="row"
value="{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1"
type="pointXY"
pointX="#{row.x}"
pointY="#{row.y}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:areaLayer>
</dvtm:thematicMap>

前述の例では、ベース・マップIDはthematicMapのbasemap属性と照合され、レイヤーIDはareaLayerのlayer属性と照合されます。点は(前述のベース・マップの場合と同様に)X座標とY座標で定義され、データが更新されたときに変更される可能性がある動的な点に対応します。

次の例は、点によってカスタム領域レイヤーを宣言するもう1つの方法を示しています。この例では、pointDataLayerは、thematicMapの直接の子です。方法は異なりますが、前の例で示した宣言と同じ結果がレンダリングされます。

<dvtm:thematicMap id="demo1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" />
<dvtm:pointDataLayer id="pdl1"
var="row"
value="{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1"
type="pointXY"
pointX="#{row.x}"
pointY="#{row.y}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:thematicMap>

静的な点を含むカスタム・ベース・マップを作成するには、次の例に示すメタデータ・ファイルで点を名前で指定します。このプロセスは、事前定義済ベース・マップに市区町村のマーカーを追加する場合に類似しています。

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-800x800-rtl.png"
width="2560"
height="1920"
dir="rtl" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
<image source="/maps/car-200x200-rtl.png"
width="640"
height="480"
dir="rtl" />
</layer>
<points >
<point name="hood" x="219.911" y="329.663" />
<point name="frontLeftTire" x="32.975" y="32.456" />
<point name="frontRightTire" x="10.334" y="97.982" />
</points>
</basemap>

名前付き点のX位置およびY位置は、layerの最初のimage要素のイメージのサイズにマップされるものと想定されます。

注意:

点は、ベース・マップ内でグローバルであり、すべてのレイヤーに適用されるため、点は特定のレイヤーおよびそのイメージには定義できません。

次の例は、指定した点によってカスタム領域レイヤーを宣言するMAF AMXファイルを示しています。

<dvtm:thematicMap id="demo1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" />
<dvtm:pointDataLayer id="pdl1"
var="row"
value="#{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1" type="pointName" pointName="#{row.name}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:thematicMap>

前のMAF AMXファイルは、点とその名前のリストを含む、次の例に示すメタデータ・ファイルを指しています。

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
</layer>
</basemap>

14.7.25.6 イベント・リスナーのマーカー・サポートに関する必知事項

MAF AMXデータ視覚化では、markerのactionListener属性はサポートされていません。かわりに、action属性を使用することで、同じ機能を実現できます。

14.7.25.7 テーマ・マップ・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、テーマ・マップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、テーマ・マップ・コンポーネントのデフォルトCSSスタイルを示しています。

.dvtm-thematicMap {
background-color: #FFFFFF;
-webkit-user-select: none;
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}

.dvtm-areaLayer {
background-color: #B8CDEC;
border-color: #FFFFFF;
border-width: 0.5px;
/* border style and color must be set when setting border width */
border-style: solid;
color: #000000;
font-family: tahoma, sans-serif;
font-size: 13px;
font-weight: bold;
font-style: normal;
}

.dvtm-area {
border-color: #FFFFFF;
border-width: 0.5px;
/* border style and color must be set when setting border width */
border-style: solid;
}

.dvtm-marker {
background-color: #61719F;
opacity: 0.7;
color: #FFFFFF;
font-family: tahoma, sans-serif;
font-size: 13px;
font-weight: bold;
font-style: normal;
border-style: solid
border-color: #FFCC33
border-width: 12px
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。次の例は、CSSを使用しないでテーマ・マップ・コンポーネントにカスタム・スタイルを適用する方法を示しています。

my-custom.js:

CustomThematicMapStyle = {
// selected area properties
'areaSelected': {
// selected area border color
'borderColor': "#000000",
// selected area border width
'borderWidth': '1.5px'
},

// area properties on mouse hover
'areaHover': {
// area border color on hover
'borderColor': "#FFFFFF",
// area border width on hover
'borderWidth': '2.0px'
},

// marker properties
'marker': {
// separator upper color
'scaleX': 1.0,
// separator lower color
'scaleY': 1.0,
// should display title separator
'type': 'circle'
},

// thematic map legend properties
'legend': {
// legend position, such as none, auto, start, end, top, bottom
'position': "auto"
}
};

})();

注意:

CustomThematicMapStyleオブジェクトの名前およびプロパティ名は変更できません。かわりに、特定のプロパティ値を、アプリケーションのニーズに合わせて変更できます。カスタムCSSおよびJavaScriptファイルをアプリケーションに追加する方法の詳細は、「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」を参照してください。

attributeGroups属性がテーマ・マップ・コンポーネント用に定義されている場合、CustomThematicMapStyleを使用して、そのコンポーネントの図形と色のデフォルト・セットを定義できます。この場合、CustomThematicMapStyleオブジェクトの構造は、次の例のようになっている必要があります。styleDefaultsは、次のフィールドを含むネストされたオブジェクトです。

- colors: 領域とマーカーに使用される色のセットを表します。

- shapes: マーカーに使用される図形のセットを表します。

window['CustomThematicMapStyle'] =
{
// custom style values
'styleDefaults': {
// custom color palette
'colors': ["#000000", "#ffffff"],
// custom marker shapes
'shapes' : ['circle', 'square']
}
};

14.7.26 Mapコンポーネントでのイベントの使用方法

MapBoundsChangeEventを使用して、地図マップ・コンポーネントでの次のマップ・ビューのプロパティ変更を処理できます。

- ズーム・レベルに対する変更。

- マップ境界に対する変更。

- マップの中心に対する変更。

これらの変更が発生すると、コンポーネントは、新しいマップ・ビューのプロパティ値でロードされるイベントを起動します。

mapBoundsChangeListenerを地理マップの属性として定義できます。

地理マップ・コンポーネントで、MapInputEventを使用してタップおよびマウス・クリックなどのエンド・ユーザー・アクションを処理できます。これらのアクションが発生すると、コンポーネントは、マップの緯度および経度、およびアクションのタイプ(マウス・ダウン、マウス・アップ、クリックなど)に関する情報でロードされるイベントを起動します。

mapInputListenerを地理マップ・コンポーネントの属性として定義できます。

詳細は、次の項を参照してください。

- イベント・リスナーの使用方法

- Oracle Mobile Application Framework Java APIリファレンス

14.7.27 ツリーマップ・コンポーネントの作成方法

ツリーマップ(treemap)は、2つのディメンションに渡って(そのノードのサイズおよび色で)階層データを表示します(treemapNode)。

「コンポーネント」ウィンドウで、「ツリーマップ」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「サンバーストおよびツリーマップ」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図14-97を参照)。

図14-97 ツリーマップ・コンポーネント

次の例は、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>

図14-98 デザインタイムのツリーマップ

attributeGroups要素のattributeType属性をcontinuousに設定することで、グラデーション色を使用してツリーマップ・アイテムに関連付けられている値の視覚化を有効にでき、この色の強度は指定された範囲内の相対値を表します。

14.7.27.1 ツリーマップ・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、ツリーマップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、オーバーライドできるツリーマップ・コンポーネントのデフォルトの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"
},

}

14.7.28 サブバースト・コンポーネントの作成方法

サンバースト(sunburst)は、2つのディメンションに渡って(そのノードのサイズおよび色で)階層データを表示します(sunburstNode)。

「コンポーネント」ウィンドウで、「サンバースト」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「サンバーストおよびツリーマップ」および「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>

図14-99 デザインタイムのサンバースト

attributeGroups要素のattributeType属性をcontinuousに設定することで、グラデーション色を使用してサンバースト・アイテムに関連付けられている値の視覚化を有効にでき、この色の強度は指定された範囲内の相対値を表します。

14.7.28.1 サンバースト・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、サンバースト・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

次の例は、オーバーライドできるサンバースト・コンポーネントのデフォルトの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"
}
}

14.7.29 時系列コンポーネントの作成方法

時系列(timeline)は、イベントを時系列で表示できるインタラクティブ・コンポーネントであり、定義されていてまだ調整可能な時間範囲(ズームに使用可能)内を前後に移動できます。

イベントは、時系列アイテム・コンポーネント(timelineItem)によって表され、これにはタイトル、説明および継続時間の塗りつぶし色が含まれます。時系列コンポーネントを構成して、すべての使用可能なイベントを表示するサマリー・ウィンドウ(overviewの子要素)を表示できます。エンド・ユーザーは、モバイル・デバイス上のピンチおよびスプレッドのジェスチャーを使用して、イベントをズーム・インおよびズーム・アウトできます。さらに、2つの時系列を構成して2系列のイベントを表示し、関連する情報を並べて比較できます。

orientation属性を使用して、時系列コンポーネントを水平または垂直のいずれかで定義できます。

注意:

MAF AMXでは、時系列と同様のコンポーネントで使用できることが多い次の機能、子要素およびプロパティはサポートしていません。

- ネストされたUIコンポーネント

- アニメーション

- 属性および時間範囲の変更検出

- 時間のフェッチ

- カスタム・タイム・スケール

- 時間通貨

- 部分トリガー

- データのソート

- 書式設定された時間範囲

- タイムゾーン

- 可視性

「コンポーネント」ウィンドウで、「時系列」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「時系列」および「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>

図14-100 デザインタイムの時系列

時系列アイテムのdurationFillColor属性を使用して、継続時間バーの塗りつぶし色を制御できます。

時系列で2つの時間スケールを同時に表示するには、2番目の軸のスケールを決定する時間軸のscale属性を使用します。

時系列は水平および垂直にスクロールできます。コンポーネントがスクロール可能な(表示可能な表示領域の外側にデータが含まれている)場合、スクロールの方向を指す矢印によって示されます。

ヒント:

時系列開始時間は、最初の時系列アイテムの開始時間と同じ値に設定されている場合、対応する時系列アイテム・コンポーネントのバブルは切り捨てられて表示されることがあります。また、時系列終了時間が最後の時系列アイテムの終了時間と同じ値に設定されている場合、対応する時系列アイテム・コンポーネントのバブルは切り捨てられて表示されることがあります。時系列アイテムのバブルが完全に見られるように、時系列コンポーネントの開始時間と終了時間を設定する必要があります。

14.7.29.1 時系列コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、時系列コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

オーバーライド可能な次のCSSスタイル・クラスは、時系列およびその子コンポーネント用に定義されます。

- .dvtm-timeline
supported properties:all

- .timelineSeries-backgroundColor
supported properties:color

.timelineSeries-labelStyle

サポートされているプロパティ: font-family、font-size、font-weight、color、font-style

.timelineSeries-emptyTextStyle

サポートされているプロパティ: font-family、font-size、font-weight、color、font-style

- .timelineItem-backgroundColor
supported properties:color

.timelineItem-selectedBackgroundColor

supported properties:color

.timelineItem-borderColor

supported properties:color

.timelineItem-selectedBorderColor

supported properties:color

.timelineItem-borderWidth

supported properties:width

.timelineItem-selectedBorderWidth

supported properties:width

.timelineItem-feelerColor

supported properties:color

.timelineItem-selectedFeelerColor

supported properties:color

.timelineItem-feelerWidth

supported properties:width

.timelineItem-selectedFeelerWidth

supported properties: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
supported properties:color

.timeAxis-backgroundColor

supported properties:color

.timeAxis-borderColor

supported properties:color

.timeAxis-borderWidth

supported properties: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]
}
}

14.7.30 NBoxコンポーネントの作成方法

NBox (nBox)コンポーネントは、2つのディメンションに渡ってデータを表し、各ディメンションは多数の範囲に分かれ、その交点は各データが配置される個別のセルを形成します。

「コンポーネント」ウィンドウで、「NBox」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「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>

図14-101 デザインタイムのNBox

14.7.31 統計図表の作成方法

データ・バインディングを定義(データの最初のシナリオで)または編集するには、統計図表(pictoChart)を使用します。データ・バインディングは、データ・コントロールおよびメソッドをUIコンポーネントに結び付ける方法です。

統計図表では、絶対数、または人口の様々な部分の相対サイズを視覚化するためにアイコンが使用されます。それらは、従来の表およびリストよりも効果的な数値情報表示方法として、インフォグラフィックで使用されます。統計図表は、デフォルトのフロー・レイアウトで使用するためにあります。テキストまたはデータ視覚化コンポーネント内の情報を視覚的に拡張またはサポートするために簡単に使用できるため、これにより、ツールが多用途になります。

統計図表は、「コンポーネント」ウィンドウ内の「MAF AMXデータ視覚化」→「共通」→「その他」の下にあります。次の例は、MAF AMXファイルで定義された統計図表要素とその子を示しています。

<dvtm:pictoChart id="pictoChart2"
animationDuration="#{pageFlowScope.animationDuration}"
animationOnDataChange="#{pageFlowScope.animationOnDataChange}"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
columnCount="#{pageFlowScope.columnCount}"
columnWidth="#{pageFlowScope.columnWidth}"
emptyText="#{pageFlowScope.emptyText}"
inlineStyle="#{pageFlowScope.inlineStyle}"
layout="#{pageFlowScope.layout}"
layoutOrigin="#{pageFlowScope.layoutOrigin}"
rendered="#{pageFlowScope.rendered}"
rolloverBehavior="#{pageFlowScope.rolloverBehavior}"
rolloverBehaviorDelay="#{pageFlowScope.rolloverBehaviorDelay}"
rowCount="#{pageFlowScope.rowCount}"
rowHeight="#{pageFlowScope.rowHeight}"
selectedRowKeys="#{pageFlowScope.selectedRowKeys}"
shortDesc="#{pageFlowScope.shortDesc}"
styleClass="#{pageFlowScope.styleClass}">

<dvtm:pictoChartItem id="pci21"
borderColor="#{pageFlowScope.borderColor}"
borderWidth="#{pageFlowScope.borderWidth}"
color="#{pageFlowScope.color1}"
columnSpan="#{pageFlowScope.span1}"
count="#{pageFlowScope.count1}"
rowSpan="#{pageFlowScope.span1}"="#{pageFlowScope.shape}"/>

<dvtm:pictoChartItem id="pci22"
borderColor="#{pageFlowScope.borderColor}"
borderWidth="#{pageFlowScope.borderWidth}"
color="#{pageFlowScope.color2}"
columnSpan="#{pageFlowScope.span2}"
count="#{pageFlowScope.count2}"
rowSpan="#{pageFlowScope.span2}"
shape="#{pageFlowScope.shape}"/>

<dvtm:pictoChartItem id="pci23"
borderColor="#{pageFlowScope.borderColor}"
borderWidth="#{pageFlowScope.borderWidth}"
color="#{pageFlowScope.color3}"
columnSpan="#{pageFlowScope.span3}"
count="#{pageFlowScope.count3}"
rowSpan="#{pageFlowScope.span3}"
shape="#{pageFlowScope.shape}"/>

</dvtm:pictoChart>

図14-102 デザインタイムの統計図表

14.7.32 マップ・コンポーネント、サンバースト、ツリーマップ、時系列、統計図表およびNBoxの子要素の定義方法

マップ・コンポーネント、サンバースト、ツリーマップ、時系列、統計図表およびNBoxの様々な子要素を定義できます。

JDeveloperでは、マップ、サンバースト、ツリーマップ、時系列、統計図表およびNBoxの子コンポーネントは、「コンポーネント」ウィンドウの「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図14-103を参照)。

図14-103 マップ、サンバースト、ツリーマップ、時系列、統計図表およびNBoxの子コンポーネントの作成

14.7.33 データバインドされたデータ視覚化コンポーネントの作成方法

「データ・コントロール」ウィンドウから挿入されたデータ・コレクションを使用して、データバインドされたデータ視覚化コンポーネントを宣言的に作成できます(「MAF AMXページへのデータ・コントロールの追加方法」を参照)。図14-117に示す「コンポーネント・ギャラリ」ダイアログで、いくつかのデータ視覚化コンポーネント・カテゴリ、タイプおよびレイアウトのオプションの中から選択できます。

図14-104 チャート・コンポーネントを作成するコンポーネント・ギャラリ

図14-105 ゲージ・コンポーネントを作成するコンポーネント・ギャラリ

図14-106 テーマ・マップ・コンポーネントを作成するコンポーネント・ギャラリ

注意:

いくつかのデータ視覚化コンポーネント・タイプには、特別な種類のデータが必要です。選択したコンポーネントのタイプの表示に十分なデータが含まれていないデータ・コレクションにコンポーネントをバインドすると、コンポーネントは表示されず、データが不十分であることを示すメッセージが表示されます。

「コンポーネント・ギャラリ」の表示をトリガーするには、「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグ・アンド・ドロップし、表示されるコンテキスト・メニューから「MAFチャート」、「MAFゲージ」または「MAFテーマ・マップ」のいずれかを選択します。(図14-107を参照)。

図14-107 データバインドされたデータ視覚化コンポーネントの作成

「コンポーネント・ギャラリ」から新しいデータバインド・コンポーネントのカテゴリ、タイプおよびレイアウトを選択し、「OK」をクリックすると、データ・バインディング・ダイアログを使用してデータ視覚化コンポーネントのデータ・コレクション属性のバインディングを開始できます。ダイアログの名前と、入力フィールド・ラベルは、選択したデータ視覚化コンポーネントのカテゴリおよびタイプによって異なります。図14-108に示すように、たとえば、カテゴリとして「棒」を、タイプとして「棒」を選択した場合、表示されるダイアログの名前は「モバイル棒チャートの作成」で、入力フィールドには「棒」、「X軸」および「凡例ラベル」というラベルが付けられます。様々なフィールドへの属性の現在のマッピングに基づいた、チャートの外観の動的なサンプルが、ダイアログの中央に表示されます。このサンプルの周りの領域はインタラクティブで、「面」、「棒」または「折れ線」、「X軸」および「凡例ラベル」フィールドにリンクされており、「使用可能」リストから属性をドラッグ・アンド・ドロップするためのもう1つの対象として使用できます。

図14-108 データバインドされたチャートのデータ値の指定

データ・コレクション内の属性には、データ値またはデータ値のカテゴリを指定できます。データ値は、棒の高さなどのマーカーまたは散布図のポイントで示される数字です。データ値のカテゴリは、軸ラベルとして表されるメンバーです。バインディング内で属性が担うロール(データ値またはID)は、データ型(グラフには数値データ値が必要)およびマップされる場所(棒やX軸など)の両方によって決まります。

「コンポーネント・ギャラリ」を使用してデータバインド・ゲージ・コンポーネントを作成し、カテゴリとして「LED」を選択し、タイプとして「星形LED」を選択した場合、表示されるダイアログの名前は図14-109に示すように「モバイル星形LEDゲージの作成」になります。

図14-109 データバインド・ゲージのデータ値の指定

データバインドされたテーマ・マップ・コンポーネントを作成する場合に、「コンポーネント・ギャラリ」を使用すると、選択内容に関係なく、表示されるダイアログの名前は「データ・レイヤーの作成」になりますが、表示されるフィールドは「コンポーネント・ギャラリ」での選択内容に応じて異なります。たとえば、ベース・マップとして「すべてのユーザー」を選択し、領域レイヤーとして「世界(大陸)」を選択した場合、図14-109に示すダイアログが開きます。

図14-110 「データ・レイヤーの作成」ダイアログ

1つ以上のデータ・バインディング・ダイアログの完了後は、「プロパティ」ウィンドウを使用してコンポーネント属性の設定を指定できます。コンポーネントと関連付けられた子要素を使用して、さらにカスタマイズすることもできます(「チャートおよびゲージ・コンポーネントの子要素の定義方法」を参照)。

MAF AMXページにコレクションをドロップする際にコンテキスト・メニューから「MAF地理マップ」、「MAFサンバースト」、「MAF NBox」、「MAFタイムライン」または「MAFツリーマップ」を選択すると、次のいずれかのダイアログが表示されます。

図14-111 データバインドされた地理マップの作成

図14-112 データバインドされたサンバーストの作成

図14-113 データバインドされた時系列の作成

図14-114 データバインドされたツリーマップの作成

図14-115 データバインドされたNBoxの作成

「NBoxの作成」ダイアログへの入力は、行および列の数を定義することから始めます。その後、ボックス上のセルを選択して、ダイアログの下部で行または列全体の値を指定できます(図14-116を参照)。

図14-116 データバインドされたNBoxの行および列の値の設定

NBoxコンポーネントは、「次へ」をクリックして一連のダイアログのすべてのページを入力すると作成されます。

各ダイアログのフィールドごとの値の詳細は、「ヘルプ」をクリックするか[F1]を押して、オンライン・ヘルプを参照してください。

14.7.33.1 データバインドされたチャート・コンポーネントの系列スタイルの設定に関する必知事項

「データ・コントロール」ウィンドウからデータバインドされたチャート・コンポーネントを作成するとき、seriesStyle要素を追加し、「プロパティ」ウィンドウを使用してseriesStyle要素のseries属性のリストを開くことによって、チャート系列データのスタイル設定情報を宣言的に指定できます。このリストには、dataStampファセット内のchartDataItem要素の値に基づくseries属性の値がすでに移入されています。

14.7.34 静的データに基づくデータ視覚化コンポーネントの作成方法

チャート、ツリーマップ、サンバーストおよび時系列の場合、そのvar属性もvalue属性も指定しないことができます。かわりに、データ・アイテムに対応している要素を列挙することによって、コンポーネント構造を静的に定義できます(例: チャートのcharDataItem要素や時系列の系列のtimelineItems)。これらの静的アイテムは必要な数を追加できます。これは、設計時にデータがわかっている場合に便利です。

次の例は、pieDataItem子コンポーネントを通じて定義された静的データを使用する円グラフ・コンポーネントを示しています。

<dvtm:pieChart id="pieChart1" >
<amx:facet name="dataStamp">
<dvtm:pieDataItem id="di1" value="80000" label="Salary"/>
<dvtm:pieDataItem id="di2" value="7500" label="Bonus"/>
<dvtm:pieDataItem id="di3" value="12000" label="Commision"/>
</amx:facet>
<dvtm:legend position="none" id="l1"/>
</dvtm:pieChart>

次の例は、コレクションではなく属性バインディングに基づいて値が指定されているpieDataItem子コンポーネントを示します。

<dvtm:pieDataItem id="di1" value="#{bindings.Salary.inputValue}" label="Salary"/>

14.7.35 チャート・コンポーネントのインタラクティブ性を有効にする方法

チャートの次の子コンポーネント用イベントドリブン・トリガーを定義すると、いくつかのチャート・コンポーネントのタップを介してエンド・ユーザーによるインタラクティブ性を有効にできます。

- チャートのデータ・アイテム

- 円グラフのデータ・アイテム

- 系列スタイル

プロパティ設定リスナーやポップアップ表示動作など、サポートされている操作に加え、起動されるアクションのタイプを定義するようにaction属性を設定できます。

<amx:panelPage id="pp1" styleClass="dvtm-gallery-panelPage">
...
<dvtm:lineChart id="lineChart1"
var="row"
value="#{bindings.lineData1.collectionModel}"
... >
<amx:facet name="dataStamp">
<dvtm:chartDataItem group="#{row.group}"
value="#{row.value}"
series=" #{row.series}"
label="#{pageFlowScope.labelDisplay ?
row.value : ''}" >
<amx:showPopupBehavior popupId="pAdvancedOptions"
type="action"
align="overlapTopCenter"
alignId="pflOptionsForm"
decoration="anchor"/>
</dvtm:chartDataItem>
</amx:facet>
...
</dvtm:lineChart>
...
</amx:panelPage>
<amx:popup id="pAdvancedOptions" styleClass="dvtm-gallery-options-dialog">
...

14.7.36 極チャートを作成する方法

次のチャート・コンポーネントについて、そのcoordinateSystem属性をpolarに設定すると、極ビューを有効にできます。

- 面グラフ

- 棒グラフ

- コンボ・チャート

- バブル・チャート

- 線グラフ

- 散布図

極設定が、棒グラフを除く前述のチャートのいずれかに適用される場合、polarGridShape属性を使用することによって、極グリッドを循環またはポリゴンとして定義できます。

極チャートの放射軸は、Y軸の子コンポーネントを使用してカスタマイズでき、接線軸は、X軸の子コンポーネントを使用してカスタマイズできます。

14.8 UIコンポーネントのスタイル設定

MAFでは、UIコンポーネントにスタイルを適用するためにCSSを使用できます。

14.8.1 コンポーネント属性を使用したスタイルの定義方法

次の属性を設定することで、UIコンポーネントをスタイル設定できます。

- styleClass属性は、レイアウト・コンポーネントに対して使用するCSSスタイル・クラスを定義します。

<amx:panelPage styleClass="#{pageFlowScope.pStyleClass}">

MAF AMXページまたはスキニングCSSファイルでレイアウト、コマンドおよび入力の各コンポーネントのスタイル・クラスを定義できますが、その場合、特定のスタイルがMAF AMXアプリケーション機能内のすべてのコンポーネントに適用されます(「スキニングに関する必知事項」を参照)。かわりに、MAFによって提供されるパブリック・スタイル・クラスを使用できます。

注意:

CSSファイルは、JDeveloperからアクセスできません。かわりに、MAFによって、ビルドまたはデプロイ時にこのファイルがパッケージに注入され、Web Contentルート・ディレクトリの下のcssディレクトリにCSSファイルが表示されます。

- inlineStyle属性は、任意のUIコンポーネントに使用するCSSスタイルを定義し、コンポーネントのルートDOM要素に適用される一連のCSSスタイルを表します。

<amx:outputText inlineStyle="color:red;">

この属性は、基本スタイルの変更が必要な場合に使用してください。

注意:

いくつかのUIコンポーネントは、HTML div要素やさらに複雑なマークアップなどのサブ要素でレンダリングされます。その結果、親コンポーネントにinlineStyle属性を設定しても、目的の効果が得られないことがあります。そのような場合、生成されたマークアップを調べ、inlineStyle属性を定義するかわりに、サブ要素にスタイルを伝播するCSSクラスを適用します。

JavaScriptのデバッグ方法の詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

これらの属性は、図14-117に示すように「プロパティ」ウィンドウの「スタイル」セクションに表示されます。

図14-117 「プロパティ」ウィンドウの「スタイル」セクション

MAF AMXでは、「プロパティ」ウィンドウ内に、inlineStyle属性の様々なプロパティを設定するために使用できるドロップダウン・エディタが提供されています(図14-118を参照)。

図14-118 「インライン・スタイル」エディタ

14.8.2 スキニングに関する必知事項

スキニングによって、MAF AMXアプリケーション機能内のすべてのUIコンポーネントに均一なスタイルを定義および適用し、機能全体に対するテーマを作成できます。

MAFのデフォルトのスキン・ファミリはmobileAltaで、デフォルト・バージョンはそのスキンの最新バージョンです。「MAFアプリケーションのスキニング」を参照してください。

14.8.3 スキニング用のCSS IDセレクタの使用に関する必知事項

MAF AMXでは、スキニング要素でのCSS IDセレクタの使用はサポートしていません。その結果、次のようなマークアップによって、MAF AMXページ遷移が粗くなります。

#tb1 {
position:absolute;
overflow:hidden;
width: 300px;
background-color: rgb(90,148,0);
}

この状況の理由は、MAF AMXページ間で遷移が発生すると、同時に画面上で2つのページがレンダリングされるということです。したがって、IDの衝突を防止するために、遷移の直前に、遷移の発生元ページからすべてのIDが削除されます。

CSS IDセレクタを使用するかわりに、クラス名を使用する必要があります。次の例は、MAF AMXページで定義されたMAF AMX UIコンポーネントと、特定のカスタム・クラスに設定されたそのstyleClass属性を示しています。

<amx:panelPage styleClass="MySpecialClassName"/>

次の例は、スキニング用のカスタム・クラスの使用方法を示しています。

.MySpecialClassName {
height: 420px;
}

14.8.4 データ視覚化コンポーネントのスタイル設定方法

MAF AMXデータ視覚化コンポーネントのスタイル・プロパティの大部分は、cssディレクトリにあるdvtm.cssファイルで定義されます。アプリケーション機能レベルでのカスタム・スタイル定義を持つカスタムCSSファイルを追加することで、デフォルト値をオーバーライドできます(「デフォルト・スキン・スタイルのオーバーライド」を参照)。

スタイル・プロパティのいくつかは、CSSにマップできないため、カスタムJavaScriptファイルで定義する必要があります。それらのプロパティは、次のとおりです。

- ダイヤル・ゲージ・コンポーネントの背景および針のイメージ(「ダイアル・ゲージの作成方法」を参照)。

- 時系列コンポーネントの継続時間バーのカラー・パレット(「時系列コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのベース・マップ(「カスタム・ベース・マップの定義」を参照)。

- 地理マップ・コンポーネントのスタイル・プロパティ(「地理マップ・コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのスタイル・プロパティ(「テーマ・マップ・コンポーネントへのカスタム・スタイルの適用」を参照)。

- 評価ゲージ・コンポーネントの選択済および未選択の状態(「評価ゲージ・コンポーネントへのカスタム・スタイルの適用」を参照)。

これらのカスタムJavaScriptファイルは、アプリケーション機能レベルの「包含」セクションで指定する必要があります(「アプリケーション機能のコンテンツをMAF AMXページまたはタスク・フローとして定義する方法」を参照)。それによって、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>

14.9 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)

- 基本的なWAI-ARIA用語に関する必知事項

- Oracle Global HTML Accessibility Guidelines (OGHAG)。
詳細は、「Oracle Global HTML Accessibility Guidelinesに関する必知事項」を参照してください。

- iOSのアクセシビリティ・ガイドライン。
詳細は、アクセシビリティ・プログラミング・ガイドfor iOSを参照してください。

そのようなコンポーネントの導入によって、アクセス可能なコンポーネントの外観の変更されたり、アプリケーション・ロジックが影響受けることがありません。

MAF AMXアプリケーション機能のアクセシビリティが適切に機能するために、次のガイドラインに従ってください。

- ナビゲーションの深さは3レベル以内にして、ユーザーが簡単にホーム画面に戻れるようにする必要があります。

- スクリプトを最小限に維持します。

- DOMとの直接対話を提供しないでください。

- JavaScriptのタイムアウトは使用しないでください。

- フォーカスの不要な変更は回避します。

- ポップアップ・トリガーを明示的に指定する

- 必要に応じて、WAI-ARIAライブ・リージョンを使用します(「基本的な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)

14.9.1 アクセシビリティのためのUIコンポーネントおよびデータ視覚化コンポーネントの構成方法

MAF AMX UIおよびデータ視覚化コンポーネントには、組込みのアクセシビリティ・サポートが備えられており、ほとんどのコンポーネントがアクセシビリティ監査の対象となっています(図14-121を参照)。

commandButtonやtableLayoutなどのAMX UIコンポーネントは、アクセシビリティをサポートするために、次の1つ以上の属性を公開します。

- Shortdesc。

- Summary

- HintText

- Landmark

shortDesc属性は、コンポーネントごとに異なる目的で使用します。たとえば、イメージ・コンポーネントにshortDesc属性を設定すると、MAF AMXファイルでそれはimage要素のalt属性の値として表示されます。shortDesc属性の値はローカライズできます。

tableLayoutコンポーネントにより公開されるsummaryおよびshortDesc属性については、tableLayoutコンポーネントを使用して他のコンポーネントを配置する場合、いずれの属性にも値を指定する必要はありません。このシナリオでは、MAFにより、実行時にレンダリングされるHTMLのtableLayoutコンポーネントにプレゼンテーション・ロールが追加されます。ただし、tableLayoutコンポーネントを使用してデータを表示する場合は、各属性に異なる値を構成してください。MAFでは実行時に、shortDesc属性に指定された値をHTML表のtitle属性として使用します。summary属性に指定された値は、HTML表でサマリーとしてレンダリングされます。

「プロパティ」ウィンドウの「アクセシビリティ」セクションで、コンポーネントの属性を設定できます。

パネル・グループ・レイアウト・コンポーネントおよびデック・コンポーネントの場合、ページのコンテキストに従って適用可能なランドマーク・ロール・タイプ(表14-14を参照)を定義します。landmark属性に次の値の1つを設定できます。

- デフォルト(なし)

- application

- banner

- complementary

- contentinfo

- form

- main

- navigation

- search

inputDateやinputNumberSliderなどのAMX UIコンポーネントは、WAI-ARIA仕様によって定義されるLabelおよびValueアクセシビリティ属性を持ちます。これらの属性値は実行時に自動的に適用され、変更できません。Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

アクセシビリティ監査ルールの構成方法は、「アクセシビリティ監査ルールの構成」を参照してください。

14.9.1.1 アクセシビリティ監査ルールの構成

JDeveloperの「プリファレンス」ダイアログを使用して次のようにアクセシビリティ監査ルールを構成できます。

1. (Windowsコンピュータ上の) JDeveloperで、メイン・メニューから「ツール」→「プリファレンス」を選択します。

2. プリファレンスのリストから、「監査」を選択します(図14-119を参照)。

3. 図14-119に示す「監査」ペインで、「プロファイルの管理」をクリックして「監査プロファイル」ダイアログを開きます。

図14-119 アクセシビリティ監査ルールの設定

4. 図14-120に示す「監査プロファイル」ダイアログで、ルールのツリーから「モバイル・アプリケーション・フレームワーク」ノードを展開し、次に「アクセシビリティ」を展開します。

図14-120 「監査プロファイル」ダイアログ

5. 図14-120に示すように、アクセシビリティ監査ルールを選択し、アプリケーションに適用します。

図14-121は、JDeveloperに表示されるアクセシビリティ監査警告を示しています。

図14-121 アクセシビリティ監査警告

アクセス可能なMAF AMXアプリケーション機能をテストする方法の詳細は、「iOSデバイス上でアクセシビリティのテストを実行する方法」を参照してください。

注意:

Androidでは、WAI-ARIAアクセシビリティ機能はデータ視覚化コンポーネントに対してサポートされません。

その他のMAF AMX UIコンポーネントは、アプリケーションがAndroidスクリーン・リーダー・モードで実行された場合、正しく動作しない可能性があります。

14.9.2 基本的なWAI-ARIA用語に関する必知事項

WAI-ARIA 1.0仕様に述べられているように、複雑なWebアプリケーションは、支援テクノロジがドキュメントの部分の背後にあるセマンティクスを判別できない場合や、ユーザーが、使用可能な方法で実際にそのすべての部分を移動できない場合に、アクセス不可能になります。WAI-ARIAでは、セマンティクスがロール(ユーザー・インタフェース要素を定義するタイプ)と、ロールによってサポートされている状態およびプロパティに分割されています。次のセマンティクス・アソシエーションによって、WAI-ARIA用語の基礎が形成されています。

- ロール

- Landmark

- ライブ・リージョン

『Important Terms』(http://www.w3.org/TR/wai-aria/terms)を参照してください。

次の表は、MAFに適用可能なロールのカテゴリ(WAI-ARIA 1.0仕様での定義)を示しています。

表14-11は、全般的なロール概念を定義する目的でWAI-ARIAのロールの分類をサポートするために使用される抽象ロールを示しています。

表14-11 抽象ロール

抽象ロール

説明

input

ユーザー入力を可能にする一般的なタイプのウィジェット。

landmark

ナビゲーショナル・ランドマークを意図したページのリージョン。

select

ユーザーが一連の選択肢から選択を行えるフォーム・ウィジェット。

widget

グラフィカル・ユーザー・インタフェースのインタラクティブ・コンポーネント。

表14-12は、スタンドアロン・ユーザー・インタフェース・ウィジェットまたは大きい複合ウィジェットの一部として機能するウィジェット・ロールを示しています。

表14-12 ウィジェット・ロール

ウィジェット・ロール

説明

ウィジェットで必要とされるステート

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 (ステート)

表14-13は、ページ内のコンテンツを編成する構造を記述するドキュメント構造ロールを示しています。通常、ドキュメント構造はインタラクティブではありません。

表14-13 ドキュメント構造ロール

ドキュメント構造ロール

説明

img

イメージを形成する要素のコレクションのコンテナ。

list

非インタラクティブ・リスト・アイテムのグループ。

listitem

リストまたはディレクトリ内の単一アイテム。

表14-14は、ナビゲーショナル・ランドマークを意図したページのリージョンを表すランドマーク・ロールを示しています。

表14-14 ランドマーク・ロール

ランドマーク・ロール

説明

application

Webアプリケーション(Webドキュメントではなく)として宣言されるリージョン.

banner

ほとんどサイト指向のコンテンツ(ページ固有のコンテンツではなく)を含むリージョン。

complementary

DOM階層の類似したレベルにあるメイン・コンテンツを補足するように設計ているが、メイン・コンテンツから切り離しても意味を持つドキュメントのサポート・セクション。

contentinfo

親ドキュメントに関する情報が含まれている大きな認識可能なリージョン。

form

全体として結合されてフォームを作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

main

ドキュメントのメイン・コンテンツ。

navigation

ドキュメントまたは関連ドキュメントをナビゲートするためのナビゲーショナル要素(通常はリンク)のコレクション。

search

全体として結合されて検索機能を作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

MAF UIコンポーネントの大部分では、アクセス可能なWAI-ARIA属性は変更できません。一部のコンポーネントでは、デザインタイムで特別なアクセス可能な属性を設定でき、パネル・グループ・レイアウトおよびデックには、WAI-ARIAランドマーク・ロール・タイプを使用できます。「アクセシビリティのためのUIコンポーネントおよびデータ視覚化コンポーネントの構成方法」を参照してください。

14.9.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のアクセシビリティについての考え方とポリシーを参照してください。

14.10 入力の検証

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>

検証メッセージはポップアップ・コンポーネントに表示されます(「ポップアップ・コンポーネントの使用方法」を参照)。検証ポップアップのタイトルを構成することはできません。それは、相対的なメッセージ重大度によって自動的に決定されます。現在のメッセージのうちの最も重大なものが検証ポップアップのタイトルになります。つまり、すべての検証メッセージがWARNINGタイプである場合は、そのタイトルは「警告」になります。メッセージのいくつかがWARNINGタイプで、その他はERRORタイプの場合はタイトルは「エラー」に設定されます。

図14-122は、企業名を入力しなかった場合にStockTrackerサンプル・アプリケーションに表示されるポップアップ検証メッセージを示しています。このサンプル・アプリケーションおよびその他のサンプル・アプリケーションの詳細は、「サンプルのMAFアプリケーション」を参照してください。

図14-122 StockTrackerサンプル・アプリケーションでの検証メッセージ

14.11 イベント・リスナーの使用方法

MAF AMXページからJavaコードを呼び出し、アプリケーション・ロジックを実行するには、UIコンポーネントの属性としてリスナーを定義します。

次のいずれかの方法でUIコンポーネントの属性としてリスナーを定義できます。

- MAF AMXファイルのソースでの手動による方法。

- 選択したコンポーネントの「プロパティ」から。

次のリスナーを使用して、MAF AMXページにUIトリガー・イベントの検出機能を追加できます。

- valueChangeListener: 次のパラメータで作成されるValueChangeEventをリスニングします。

- 古い値を表すjava.lang.Object

- 新しい変更済の値を表すjava.lang.Object

- actionListener: パラメータなしで作成されるActionEventをリスニングします。

- selectionListener: 次のパラメータで作成されるSelectionEventをリスニングします。

- 古い行キーを表すjava.lang.Object

- 選択済行キーを表すjava.lang.String[]

- moveListener: 古い行キーを表すRowKeyタイプの次のパラメータで作成されるMoveEventをリスニングします。

- 移動済行キーを表すjava.lang.Object

- 移動済行キーがその前に挿入された行キーを表すjava.lang.String[]

- rangeChangeListener: パラメータなしで作成されるRangeChangeEventをリスニングします。

- mapBoundsChangeListener: 次のパラメータで作成されるMapBoundsChangeEventをリスニングします。

- 最小マップ境界のX座標(経度)を表すjava.lang.Object

- 最小マップ境界のY座標(緯度)を表すjava.lang.Object

- 最大マップ境界のX座標(経度)を表すjava.lang.Object

- 最大マップ境界のY座標(緯度)を表すjava.lang.Object

- マップの中心のX座標(経度)を表すjava.lang.Object

- マップの中心のY座標(緯度)を表すjava.lang.Object

- 現在のズーム・レベルを表すint

- mapInputListener: 次のパラメータで作成されるMapInputEventをリスニングします。

- イベント・タイプを表すjava.lang.String

- イベント・ポイントのX座標を表すjava.lang.Object

- イベント・ポイントのY座標を表すjava.lang.Object

- viewportChangeListener: 次のパラメータで作成されるViewportChangeEventをリスニングします。

- 最小X座標を表すjava.lang.Object

- 最大X座標を表すjava.lang.Object

- 最小Y座標を表すjava.lang.Object

- 最大Y座標を表すjava.lang.Object

- 最初の表示可能グループを表すjava.lang.Object

- 最後の表示可能グループを表すjava.lang.Object

- drillListener: 次のパラメータで作成されるDrillEventをリスニングします。

- ドリル済オブジェクトのIDを表すjava.lang.String

- ドリル・データ・アイテムのrowkeyを表すjava.lang.String

- ドリル済オブジェクトのグループ名を表すjava.lang.String

- ドリル済オブジェクトの系列名を表すjava.lang.String

リスナーの値は、パターン#{*}に一致している必要があり、次の要件を満たしている必要があります。

- タイプ名: EL式

- ベース・タイプ: 文字列

- プリミティブ・タイプ: 文字列

ELイベントの詳細は、「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;
}

追加の例は、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているAPIDemoというMAFサンプル・アプリケーションを参照してください。このサンプルは、Java Beanからリスナーをコールする方法を示しています。

14.11.1 イベント・リスナーの制約付きタイプ属性に関する必知事項

イベント・リスナーは、一部のMAF AMX UIコンポーネントの子として定義できます。リスナーのtype属性によって、それらがどのイベントを処理するために登録されるのかが識別されます。各親UIコンポーネントでは(親コンポーネントに適した)イベントのサブセットのみがサポートされているため、これらのサポートされているイベントは、リスナーに対して選択できる限られたタイプのリストに提示されます。

子イベント・リスナーそれぞれのtype属性(図14-123を参照)には、リスナー・イベントと一致する値の基本セットがあります。これらの値は、親コンポーネントでサポートされているイベントのみを表示するようフィルタされます。たとえば、ボタン・コンポーネントの下にあるアクション・リスナーまたはプロパティ・リスナーの設定の子では、actionタイプの値およびジェスチャーのみか表示されます。

図14-123は、親リスト・アイテム・コンポーネントのプロパティ・リスナーの設定のかぎられたタイプ・リストにおいて使用可能な値を示しています。

図14-123 イベント・タイプの選択

脚注の凡例

脚注1:
詳細は、「disabled属性に関する必知事項」を参照してください。

15 MAF AMXでのバインディングの使用とデータ・コントロールの作成

この章では、MAF AMXアプリケーション機能内でデータ・バインディング、データ・コントロールおよびデータ・バインディング式言語(EL)を使用する方法について説明します。また、オブジェクト・スコープ・ライフサイクル、マネージドBean、UIヒント、検証およびデータ変更イベントについても説明します。

この章の内容は次のとおりです。

- バインディングおよびデータ・コントロールの概要

- オブジェクト・スコープ・ライフサイクルについて

- EL式の作成

- マネージドBeanの作成および使用

- データ・コントロールを使用したビジネス・サービスの公開

- 「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成

- 実行時に行われる処理: バインディング・コンテキストの動作方法

- データ・コントロールの構成

- 属性の使用

- Beanデータ・コントロールの作成と使用

- アプリケーション機能間のデータ・コントロールのインスタンスの共有

- DeviceFeaturesデータ・コントロールの使用方法

- 属性の検証

- データ変更イベントの使用

15.1 バインディングおよびデータ・コントロールの概要

データ・コントロールは、標準のメタデータ・インタフェースを使用して、ビジネス・サービスの操作とデータ・コレクションを記述します。その一方で、宣言的バインディングはデータ・コントロールからのデータへのアクセスに関する情報を格納します。モデル・レイヤーは、データ・コントロールとバインディングに関する情報について関連XMLファイルを読み取って、ユーザー・インタフェースをビジネス・サービスに接続します。

モバイル・アプリケーション・フレームワークによって、ユーザー・インタフェース(UI)・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロールと宣言的バインディング)が実装されています。データ・コントロールでは、関連するプロパティ、メソッド、タイプの情報を含め、サービスの操作とデータ・コレクションを表す標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化します。JDeveloperを使用すると、その情報をアイコンとして表示し、ページ上にドラッグ・アンド・ドロップできます。宣言的なバインディングによって、データ・コントロール内のデータ・コレクションからのデータ・アクセスとその操作の実行の詳細が抽象化されます。実行時に、モデル・レイヤーによって、適切なXMLファイルからデータ・コントロールおよびバインディングを記述した情報が読み取られ、ユーザー・インタフェースとビジネス・サービスの双方向の結合が実装されます。

ページのユーザー・インタフェース・コンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。モデル・レイヤーは、このファイルを実行時に使用して、ページのバインディングをインスタンス化します。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持され、EL式#{bindings}を使用して各ページ・リクエスト中にアクセスできます。この式により、現在のページのバインディング・コンテナが常に評価されます。「データ・コントロール」パネルから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインドされたユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。

モバイル・アプリケーション・フレームワークには、即時利用可能な2つのデータ・コントロール(DeviceFeaturesデータ・コントロールとApplicationFeaturesデータ・コントロール)が付属しています。JDeveloperの「データ・コントロール」パネル内に表示されるDeviceFeaturesデータ・コントロールを使用すると、データ・コントロールの主なデータ属性を(テキスト)フィールドとして、またデータ・コントロールの操作をコマンド・オブジェクト(ボタン)として、アプリケーションにドラッグ・アンド・ドロップできます。これらのドラッグ・アンド・ドロップ・アクションによって、アプリケーション内のELバインディングおよび作成されるコントロールに適したプロパティが生成されます。バインディングはDataControls.dcxファイルで表され、データ・コントロール・ソースを指しています。また、ページ・バインディングは特定のページの参照をデータ・コントロールにリンクします。ApplicationFeaturesデータ・コントロールの詳細は、「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

データ・コントロールおよびバインディングの詳細は、次を参照してください。

- データ・コントロールを使用したビジネス・サービスの公開

- 「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成

- 実行時に行われる処理: バインディング・コンテキストの動作方法

- データ・コントロールの構成

- 属性の使用

- Beanデータ・コントロールの作成と使用

- アプリケーション機能間のデータ・コントロールのインスタンスの共有

- DeviceFeaturesデータ・コントロールの使用方法

15.2 オブジェクト・スコープ・ライフサイクルについて

スコープは、実行時にEL式を使用してアプリケーションがアクセスできるオブジェクトをメモリー内の永続化します。スコープによって、オブジェクト(アプリケーションやタスク・フローなど)の存続期間と可用性が決定されます。

実行時、ページがデータにアクセスできるオブジェクト・スコープに必要なデータを格納することで、データをページに渡します。スコープによってオブジェクトの存続期間が決まります。オブジェクトをスコープに置くと、EL式を使用してスコープからアクセスできます。たとえば、fooという名前のマネージドBeanを作成し、Beanをビュー・スコープに存続させるよう定義するとします。このBeanにアクセスするには、#{viewScope.foo}という式を使用します。

モバイル・アプリケーション・フレームワークの変数とマネージドBeanの参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。MAFは、次のスコープ(可視性が高い順に表示)をサポートしています。

- アプリケーション・スコープ: オブジェクトは、アプリケーションが存続するかぎり(複数の機能にまたがって)使用可能です。

- ページ・フロー・スコープ: オブジェクトは、ページ・フロー・スコープのマネージドBeanがどこに定義されているかによって、機能(単一の機能の境界)またはタスク・フローが存続するかぎり使用できます。Beanがバインドなしタスク・フローに定義されている場合、そのスコープは機能です。Beanがバインド・タスク・フローに定義されている場合、そのスコープはタスク・フローに限定されます。

- ビュー・スコープ: オブジェクトは、ビューが存続するかぎり(機能の単一ページ内で)使用可能です。

オブジェクト・スコープは、プログラミング言語のグローバル変数およびローカル変数のスコープに相当します。スコープが広いほど、オブジェクトの可用性が高くなります。存続期間の間、これらのオブジェクトで特定のインタフェースの公開、情報の保持および他のオブジェクトへの変数とパラメータの受渡しを行うことができます。たとえば、アプリケーション・スコープに定義されているマネージドBeanは、アプリケーションが存続するかぎり、複数のページ・リクエストの間使用できます。ただし、ビュー・スコープに定義されているマネージドBeanは、1つの機能で1つのページ・リクエストの間のみ使用できます。

アプリケーション・スコープの名前空間で定義されたEL式は、アプリケーションが存続するかぎり、複数の機能にまたがって使用できます。アプリケーションの一方のビューでアプリケーション・スコープを定義し、そのスコープをもう一方のビューで参照できます。ページ・フロー・スコープの名前空間で定義されたEL式は、機能が存続するかぎり、単一の機能の境界内で使用できます。ビュー・スコープの名前空間で定義されたEL式は、ビューが存続するかぎり、機能の単一ページの境界内で使用できます。スコープを含むこのような変数に加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。「マネージドBeanカテゴリについて」および「モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて」を参照してください。

マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。アプリケーション・スコープは、ユーザー情報やコンテキスト情報などのアプリケーション全体に関係する情報にのみ使用します。アプリケーション・スコープは、ページ間での値の受渡しには使用しないでください。

注意:

メモリー・スコープに入れる各オブジェクトはJSON DataChangeEventに対してシリアライズされ、このオブジェクト内のゲッター・メソッドによって戻されるオブジェクトもシリアライズされます。これは、ネストが深いシリアライズされたオブジェクト・ツリーにつながることがあり、パフォーマンスが低下します。一連のネストされたオブジェクトのシリアライズを避けるには、それらを一時オブジェクトとして定義する必要があります。「Beanクラス変数のシリアライズに関する必知事項」を参照してください。

15.2.1 オブジェクト・スコープとタスク・フローに関する必知事項

ページ・フロー・スコープは、タスク・フロー内のアクティビティ間でデータ値を受け渡しするために使用します。また、変数のビュー・スコープは現在のビュー・アクティビティ内でのみ必要になります。

タスク・フロー内の変数にどのスコープを使用するかを決定するときは、ビュー・スコープまたはページ・フロー・スコープのみを使用する必要があります。アプリケーション・スコープは、タスク・フローの存続期間を超えてオブジェクトをメモリーに保持するため、タスク・フローのカプセル化および再利用で障害が発生します。さらに、アプリケーション・スコープでは、オブジェクトがメモリーに必要以上に長い時間保持されるため、不要なオーバーヘッドが発生します。

タスク・フロー内のアクティビティ間でデータ値を渡す必要がある場合は、ページ・フロー・スコープを使用する必要があります。現在のビュー・アクティビティ内でのみ必要とされ、ビュー・アクティビティ間にまたがっていない変数の場合、ビュー・スコープを使用する必要があります。

15.3 EL式の作成

EL式は、実行時に決定されるオブジェクト値に属性をバインドするために、MAFアプリケーションで使用されます。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の作成および使用」を参照してください。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;
}

15.3.1 データ・バインディングEL式について

データ・バインディング式は、「データ・コントロール」パネルを使用してUIコントロールを作成するときに、MAFによって作成されます。また、MAFデータ・バインディング式は、手動で追加または編集することもできます。

「データ・コントロール」パネルを使用してコンポーネントを作成すると、MAFデータ・バインディング式が自動的に作成されます。この式は、バインディング・オブジェクトのデータを表示するか、バインディング・オブジェクトのプロパティを参照する、すべてのコンポーネント属性に追加されます。事前作成済のそれぞれの式は、ページ定義ファイルで定義された、適切なバインディング・オブジェクトを参照します。これらのバインディング式は編集可能ですが、MAFバインディング式の基本構文に従っていれば、独自に作成することもできます。MAFデータ・バインディング式は、属性がELをサポートする場合、バインディング・オブジェクトからのデータを移入する任意のコンポーネント属性に追加できます。

一般的なMAFデータ・バインディングEL式は、次の構文を使用して、バインディング・コンテナ内のタイプの異なるバインディング・オブジェクトを参照します。

#{bindings.BindingObject.propertyName}

各要素の説明は次のとおりです。

- bindingsは、式によって参照されているバインディング・オブジェクトが現在のページのバインディング・コンテナにあることを識別する変数です。すべてのMAFデータ・バインディングEL式は、bindings変数で始まる必要があります。

- BindingObjectは、ページ定義ファイルで定義される、バインディング・オブジェクトのID、または属性については名前です。バインディングobjectIDまたは名前は、そのページ定義ファイル内で一意なものです。EL式は、パラメータ・バインディング、実行可能バインディングまたは値バインディングなど、ページ定義ファイル内のどのバインディング・オブジェクトでも参照できます。

- propertyNameは、各データバインドUIコンポーネントのデフォルトの表示方法を決定し、実行時のバインディング・オブジェクトのプロパティを設定する変数です。各タイプのバインディング・オブジェクトに対して、異なるバインディング・プロパティがあります。「MAFバインディング・プロパティに関する必知事項」を参照してください。

たとえば、次の式を例にしてみます。

#{bindings.ProductName.inputValue}

bindings変数は、現在のページのバインディング・コンテナでバインドされた値を参照します。参照されているバインディング・オブジェクトはProductNameであり、これは属性バインディング・オブジェクトです。バインディング・プロパティはinputValueで、最初のProductName属性の値を戻します。

ヒント:

ページ定義ファイルのバインディング式ではドル記号($)またはハッシュ記号(#)の接頭辞を使用できますが、MAFページのEL式で使用できるのは、ハッシュ記号(#)の接頭辞のみです。

前述のように、「データ・コントロール」パネルを使用してUIコンポーネントを作成する場合、これらの式が組み込まれます。ただし、必要に応じて手動で式を作成することもできます。JDeveloperの式ビルダーは、UIコンポーネントがバインドされるその他の有効なオブジェクトに加え、ページ定義ファイルに定義されたバインディング・オブジェクトのリストを提供することにより、EL式の構築を支援するダイアログです。また、MAFバインディング・オブジェクトの階層リストやMAFバインディング・オブジェクトの最も一般的に使用されるプロパティが提供されるため、MAFデータバインド式の作成や編集に特に便利です。「MAFバインディング・プロパティに関する必知事項」を参照してください。

15.3.2 EL式の作成方法

JDeveloperの式ビルダーを使用してEL式を宣言的に作成できます。「プロパティ」ウィンドウから「式ビルダー」にアクセスできます。

始める前に:

EL式に関する知識が役立つ場合があります。「EL式の作成」を参照してください。

式ビルダーの使用手順:

1. 「プロパティ」ウィンドウで、変更する属性を見つけて、右端のドロップダウン・メニューを使用して「式ビルダー」を選択します。

2. 次の機能を使用して式を作成します。

- 「変数」ドロップダウンを使用して、式に含める項目を選択します。これらの項目は、階層形式のバインディング・オブジェクトであるツリーに表示されます。ツリーの各アイコンは、式で使用できる各種タイプのバインディング・オブジェクトを表します。
ツリーの絞り込みには、ドロップダウン・フィルタを使用するか、検索フィールドに検索条件を入力します。MAFで公開されているELでアクセス可能なオブジェクトは、「ADFマネージドBean」ノードの「モバイル・アプリケーション・フレームワーク・オブジェクト」ノードにあります。

ツリーで項目を選択すると、その項目がEL式内の「式」ボックスに移動されます。「式」ボックスに式を直接入力することもできます。

- 演算子ボタンを使用して、式に論理演算子または算術演算子を追加します。

図15-1は、「ADFマネージドBean」カテゴリからEL式を作成する方法の例を示しています。ただし、EL式は、「式ビルダーのカテゴリについて」で説明されているどのカテゴリからも作成できます。

図15-1 「式ビルダー」ダイアログ

ヒント:

EL式を作成する正しい構文の使用の詳細は、http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

表15-1 式ビルダーのバインディング・ノードの下にあるアイコン

アイコン

説明

現在のページのバインディング・コンテナを参照する、bindingsコンテナ変数を示します。bindingsノードを開くと、現在のページのすべてのバインディング・オブジェクトが公開されます。

バインディング・コンテキスト全体を参照する、dataバインディング変数を示します(アプリケーション内の.cpxファイルから作成)。dataノードを開くと、アプリケーション内のページ定義ファイルが公開されます。

アクション・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なアクション・バインディング・プロパティのリストが公開されます。

イテレータ・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なイテレータ・バインディング・プロパティのリストが公開されます。

属性バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な属性バインディング・プロパティのリストが公開されます。

リスト・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なリスト・バインディング・プロパティのリストが公開されます。

表バインディング・オブジェクトまたはツリー・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な表バインディング・プロパティおよびツリー・バインディング・プロパティのリストが公開されます。

MAFバインディング・オブジェクト・プロパティを表します。「MAFバインディング・プロパティに関する必知事項」を参照してください。

パラメータ・バインディング・オブジェクトを表します。

Beanクラスを表します。

メソッドを表します。

15.3.2.1 メソッド式ビルダーについて

「プロパティ」ウィンドウの「メソッド式ビルダー」は、「式ビルダー」と似ていますが、「メソッド式ビルダー」は選択したプロパティに応じてマネージドBeanにフィルタを適用します。

表15-2は、「プロパティ」ウィンドウで「式ビルダー」オプションではなく「メソッド式ビルダー」オプションが提供されるプロパティを示しています。これらの唯一の違いは、メソッド式ビルダーが、選択されたプロパティに応じてマネージドBeanをフィルタして除外することです。

表15-2 メソッド式ビルダーのプロパティ

プロパティ

要素

action

amx:commandButton

action

amx:commandLink

action

amx:listItem

action

amx:navigationDragBehavior

action

dvtm:chartDataItem

action

dvtm:ieDataItem

action

dvtm:timelineItem

action

dvtm:area

action

dvtm:marker

actionListener

amx:listItem

actionListener

amx:commandButton

actionListener

amx:commandLink

binding

amx:actionListener

mapBoundsChangeListener

dvtm:geographicMap

mapInputListener

dvtm:geographicMap

moveListener

amx:listView

rangeChangeListener

amx:listView

selectionListener

amx:listView

selectionListener

amx:filmStrip

selectionListener

dvtm:areaDataLayer

selectionListener

dvtm:pointDataLayer

selectionListener

dvtm:treemap

selectionListener

dvtm:sunburst

selectionListener

dvtm:timelineSeries

selectionListener

dvtm:nBox

selectionListener

dvtm:areaChart

selectionListener

dvtm:barChart

selectionListener

dvtm:bubbleChart

selectionListener

dvtm:comboChart

selectionListener

dvtm:horizontalBarChart

selectionListener

dvtm:lineChart

selectionListener

dvtm:funnelChart

selectionListener

dvtm:pieChart

selectionListener

dvtm:scatterChart

valueChangeListener

amx:inputDate

valueChangeListener

amx:inputNumberSlider

valueChangeListener

amx:inputText

valueChangeListener

amx:selectBooleanCheckbox

valueChangeListener

amx:selectBooleanSwitch

valueChangeListener

amx:selectManyCheckbox

valueChangeListener

amx:selectManyChoice

valueChangeListener

amx:selectOneButton

valueChangeListener

amx:selectOneChoice

valueChangeListener

amx:selectOneRadio

valueChangeListener

dvtm:statusMeterGauge

valueChangeListener

dvtm:dialGauge

valueChangeListener

dvtm:ratingGauge

viewportChangeListener

dvtm:areaChart

viewportChangeListener

dvtm:barChart

viewportChangeListener

dvtm:comboChart

viewportChangeListener

dvtm:horizontalBarChart

viewportChangeListener

dvtm:lineChart

15.3.2.2 非ELプロパティについて

ELに対応していないプロパティには、「プロパティ」ウィンドウで選択可能なEL式ビルダー・オプションオプションがありません。

表15-3は、ELに対応していないため「プロパティ」ウィンドウでEL式ビルダー・オプションが提供されないプロパティを示しています。

表15-3 非ELプロパティ

プロパティ

要素

id

すべての要素

facetName

amx:facetRef

failSafeClientHandler

amx:loadingIndicatorBehavior

failSafeDuration

amx:loadingIndicatorBehavior

group

amx:validationBehavior

name

amx:attribute

name

amx:attributeList

name

amx:attributeListIterator

name

amx:facet

ref

amx:attributeList

type

dvtm:attributeGroups

var

amx:carousel

var

amx:filmStrip

var

amx:iterator

var

amx:listView

var

amx:loadBundle

var

dvtm:areaChart

var

dvtm:barChart

var

dvtm:bubbleChart

var

dvtm:comboChart

var

dvtm:funnelChart

var

dvtm:horizontalBarChart

var

dvtm:lineChart

var

dvtm:pieChart

var

dvtm:scatterChart

var

dvtm:sparkChart

var

dvtm:geographicMap

varStatus

amx:attributeListIterator

15.3.3 MAFバインディング・プロパティに関する必知事項

式ビルダーを使用してデータバインドされたコンポーネントを作成すると、EL式は、Oracle APIで定義された特定のMAFバインディング・プロパティを参照することがあります。

式ビルダーを使用してデータバインド・コンポーネントを作成すると、EL式によって、特定のMAFバインディング・プロパティが参照される場合があります。実行時には、これらのバインディング・プロパティによって、データバインドUIコンポーネントのデフォルトの表示方法や、イテレータ・バインディング固有のパラメータなどが定義されます。バインディング・プロパティは、Oracle APIによって定義されます。各バインディング・タイプで使用可能なプロパティの完全なリストは、表15-4を参照してください

特定のプロパティに割り当てられる値は、ページ定義ファイルで定義されます。たとえば、イテレータ・バインディングには、イテレータが一度に表示する行数を指定する、RangeSizeというプロパティがあります。RangeSizeに割り当てられた値は、次の例に示すようにページ定義ファイルで指定されます。

<iterator Binds="ItemsForOrder" RangeSize="25"
DataControl="BackOfficeAppModuleDataControl"
id="ItemsForOrderIterator" ChangeEventPolicy="ppr"/>

15.3.4 イテレータ間でデータ・プロバイダの状態の保持を有効にする方法

データ・コレクション・インスタンスにアクセスする各ページの最上位レベルのイテレータに、同じRSIName属性を指定することで、データ・コントロールは、そのコントロール用に作成された複数のデータ・プロバイダのインスタンスを持てるようになります。

この機能を使用するには、同じデータ・コレクション・インスタンスにアクセスする各ページの最上位レベル・イテレータ(iterator)に同じRSIName属性を指定します。

次の例は、pageDefファイルのイテレータの階層を示しています。最後の2つのアクセサ・イテレータでは、第2コレクションの従業員オブジェクトとそれらの従業員の電話番号を反復できます。

<iterator Binds="root"
RangeSize="25"
DataControl="BusinessManager"
id="BusinessManagerIterator"
RSIName="secondCollection" />
<accessorIterator id="companyIterator"/
MasterBinding="BusinessManagerIterator"
Binds="company"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.Company"/>
<accessorIterator id="employeesIterator"
MasterBinding="companyIterator"
Binds="employees"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.Employee"/>
<accessorIterator id="phoneNumbersIterator"
MasterBinding="employeesIterator"
Binds="phoneNumbers"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.PhoneNumber"/>
<accessorIterator id="employeesIterator2"
MasterBinding="companyIterator"
Binds="employees"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.Employee"
RSIName="secondCollection" />
<accessorIterator id="phoneNumbersIterator2"
MasterBinding="employeesIterator2"
Binds="phoneNumbers"
RangeSize="25"
DataControl="BusinessManager"
BeanClass="mobile.PhoneNumber" />

15.3.5 バインディング・コンテナを参照する方法

MAFは、アクティブな画面と非アクティブな画面のバインディング・コンテナを参照するために、異なるルートEL式を使用します。MAF AMXバインディング・オブジェクトにアクセスするために、EL式で使用できるプロパティのリストを確認してください。

ルートEL式#{bindings}で、アクティブな画面のバインディング・コンテナを参照できます。式#{data.PageDefName}で、別の画面のバインディング・コンテナを参照できます。MAF AMXバインディング・オブジェクトは、バインディング・コンテナ#{bindings.Name}から名前で参照されます。

表15-4は、実行時に、EL式でMAF AMXバインディング・オブジェクトの値にアクセスするために使用できるプロパティのリストの一部を示しています。プロパティは、アルファベット順に並んでいます。

表15-4 MAFバインディングのランタイムELプロパティ

実行時プロパティ

説明

イテレータ

アクション

属性値

ツリー

class

実行時バインディング用のJavaクラス・オブジェクトを戻します。

○

○

○

○

collectionModel

データのコレクションを公開します。collectionModelにバインドされているコンポーネント内で使用するEL式は、コレクションの各要素の式を解決するrow変数脚注 1を使用して参照できます。

×

×

×

○

collectionModel.makeCurrent

このバインディングのイテレータ内で、選択した行を現在の行にします。

×

×

×

○

collectionModel.selectedRow

選択した行への参照を戻します。

×

×

×

○

currentRow

イテレータが指している現在の行またはデータ・オブジェクト(組込みナビゲーション・アクションなど)への参照を戻します。

○

×

×

×

currentRow.dataprovider

イテレータが指している現在の行またはデータ・オブジェクトへの参照を戻します。(これはcurrentRowから戻されるものと同じオブジェクトで、構文のみが異なります)。

○

×

×

×

enabled

アクション・バインディングの状態に応じて、trueまたはfalseを戻します。たとえば、アクション・バインディングは、ユーザーが「先頭へ」、「次へ」、「前へ」、「最後へ」などのナビゲーション・ボタンをクリックした場合に決定される現在位置に基づいて、有効化(true)または無効化(false)されます。

×

○

×

×

execute

解決されたときに、名前付きアクションまたはmethodActionバインディングを起動します。

×

○

×

×

format

これはhints.formatのショートカットです。

×

×

○

○

hints

バインディングが関連付けられているすべての表示属性について、UIヒントの名前/値ペアのリストを戻します。

×

×

○

○

inputValue

バインディングが関連付けられている最初の属性の値を戻します。

×

×

○

×

items

現在のリストの有効な属性に関連付けられた値のリストを戻します。

×

×

○

×

label

hintsの子または属性の直接の子として使用できます。バインディングの最初の属性のラベルを戻します(コントロール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変数を先頭の語句として追加します。

15.3.6 式ビルダーのカテゴリについて

MAF AMXページの式ビルダーでは、次のカテゴリを使用できます。

- バインディング・カテゴリについて

- マネージドBeanカテゴリについて

- モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて

15.3.6.1 バインディング・カテゴリについて

様々なバインディング・タイプでサポートされているプロパティを構成できます。「バインディング」カテゴリでサポートされているバインディングとプロパティを確認してください。

この項では、バインディング・カテゴリで使用できるオプションを示します。bindingsノードとdataノードは、サポートされているバインディングとプロパティの同じセットを表示します。表15-5に、使用できるバインディング・タイプと、各バインディング・タイプでサポートされるプロパティをリストします。securityContextノードは、次のプロパティをサポートしています。

- authenticated

- userGrantedPrivilege

- userInRole

- userName

次にその例を示します。

#{securityContext.authenticated}
#{securityContext.userGrantedPrivilege['submit_privilege']}
#{securityContext.userInRole[‘manager_role']}
#{securityContext.userName}

表15-5 サポートされるバインディング・タイプ

バインディング・タイプ

プロパティ

accessorIterator

class

currentRow: dataProvider

name

rangeSize

action

class

enabled

execute

name

attributeValues

autoSubmit

category

class

controlType

displayHeight

displayHint

displayWidth

filedorder

format

hints: allows.read、allows.update、autoSubmit、category、controlType、displayHeight、displayHint、displayWidth、filedorder、format、label、mandatory、precision、tooltip、updateable

inputValue

items

iteratorBinding

label

mandatory

name

precision

tooltip

updateable

button

autoSubmit

category

class

controlType

displayHeight

displayHint

displayWidth

filedorder

format

hints: allows.read、allows.update、autoSubmit、category、controlType、displayHeight、displayHint、displayWidth、filedorder、format、label、mandatory、precision、tooltip、updateable

inputValue

items

iteratorBinding

label

mandatory

name

precision

tooltip

updateable

invokeAction

always

deferred

iterator

class

currentRow: dataProvider

name

rangeSize

list

autoSubmit

category

class

controlType

displayHeight

displayHint

displayWidth

filedorder

format

hints: format、allows.read、allows.update、autoSubmit、category、controlType、displayHeight、displayHint、displayWidth、filedorder、format、label、mandatory、precision、tooltip、updateable

inputValue

items

iteratorBinding

label

mandatory

name

precision

tooltip

updateable

methodAction

class

enabled

execute

name

operationEnabled

operationInfo

paramsMap

result

methodIterator

class

currentRow: dataProvider

name

rangeSize

searchAction

class

enabled

execute

name

operationEnabled

operationInfo

paramsMap

result

tree

category

class

collectionModel: bindings, makeCurrent, selectedRow, <AttrName>

displayHeight

displayHint

displayWidth

filedorder

format

hints: category、displayHeight、displayHint、displayWidth、filedorder、format、label、mandatory、precision、tooltip、updateable、<AttrName>

iteratorBinding

label

mandatory

name

precision

rangeSize

tooltip

updateable

viewable

variable

class

currentRow: dataProvider

name

variableIterator

class

currentRow: dataProvider

name

15.3.6.2 マネージドBeanカテゴリについて

「マネージドBean」カテゴリで選択可能なオプションを確認してください。

この項では、「マネージドBean」カテゴリで使用できるオプションを表示します。

- applicationScope: 「マネージドBean」のapplicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーションスコープのマネージドBeanなど)。

- pageFlowScope: 「マネージドBean」のpageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロースコープのマネージドBeanなど)。

- viewScope: 「マネージドBean」のviewScopeノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュースコープのマネージドBeanなど)。

MAFランタイムでは、自身をマネージドBeanプロパティの変更通知のリスナーとして登録することによって、Beanプロパティを参照するUIコンポーネントにバインドされたEL式が、プロパティの値が変更されたときに自動的に更新されるようにします。これらの通知をソースとして参照するには、Beanのプロパティ・アクセッサにコードを追加する必要があります。Beanのプロパティ・アクセッサから、通知をソースとして参照するために必要なコードを自動的に生成するには、「アクセッサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します(図15-2を参照)。

図15-2 プロパティの変更時にリスナーに通知

ELを通じて単にBeanメソッドまたはプロパティを参照する場合、このコードを追加する必要はありませんが、Beanに格納された値が変化する場合や、特にその変更が、1つ以上のプロパティ値を変更するBeanメソッドの実行による二次的な影響など、間接的なものである場合、それらの値に依存するEL式のアクティブ・フォームへのレンダリングを最新の状態に保つ必要があります。プロパティの変更とPropertyChangeSupportクラスについては、「データ変更イベントについて」を参照してください。

次の例は、プログラムで別のマネージド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要素には当てはまりません。

15.3.6.3 モバイル・アプリケーション・フレームワークのオブジェクト・カテゴリについて

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリには、MAFで定義されたオブジェクト、ELを使用して参照できるオブジェクトが含まれます。

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリには、オブジェクト・スコープなどのELを使用して参照できるMAFに定義されている様々なオブジェクトが一覧表示されます。

MAFの変数とマネージドBeanの参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。これらのスコープには、可視性が高い順に、アプリケーション・スコープ、ページ・フロー・スコープおよびビュー・スコープがあります。「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

スコープを含むこのような変数に加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリで使用できるものは、次のとおりです。

- applicationScope: applicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーション・スコープのマネージドBeanなど)。アプリケーション・スコープで定義されたEL変数は、アプリケーションが存続するかぎり、機能の境界にまたがって使用できます。

- deviceScope: deviceScopeノードは、デバイスのプロパティに関する情報を公開します。deviceScopeは、アプリケーション・レベルの存続期間および可視性を持ちます。

- feature: featureノードは、機能レベルのデータを公開します。featureオブジェクトは、dataControlContextDepthおよびmaximumDataControlContextDepthプロパティを公開します。#{feature.dataControlContextDepth}および#{feature.maximumDataControlContextDepth}を使用して、これらのプロパティの値を取得できます。これらの2つのプロパティは読取り専用です。

- pageFlowScope: pageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロー・スコープのマネージドBeanなど)。ページ・フロー・スコープで定義されたEL変数は、機能が存続するかぎり、単一の機能の境界内で使用できます。

- preferenceScope: preferenceScopeノードには、アプリケーションと機能のすべてのプリファレンスが含まれます。
プリファレンス要素では、PreferenceValue要素を除き、Id属性の値を式ビルダーのノード・ラベルとして使用します。PreferenceValue要素では、Name属性の値を式ビルダーのノード・ラベルとして使用します。

注意:

EL式の文字列トークンにドット(.)や特殊文字またはdefaultなどの予約語が含まれている場合、式ビルダーではそのような文字列トークンを一重引用符と大カッコで囲みます。機能IDやプリファレンス・コンポーネントIDにドットが含まれている場合、式ビルダーでは、ドットによって区切られたIDの各部分を別のプロパティとしてpreferenceScope階層に表示します。生成された式でも、ドットによって区切られたIDの各部分を別のプロパティとして認識します。

preferenceScopeのいくつかのサンプルEL式を次に示します。

"#{preferenceScope.feature.oracle.hello.SampleGroup1.label}"

"#{preferenceScope.application.OracleMobileApp.Edition['default']}"

- viewScope: このノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュー・スコープのマネージドBeanなど)。ビュー・スコープの名前空間で定義されたEL変数は、ビューが存続するかぎり、機能の単一ページの境界内で使用できます。

- row: rowオブジェクトは、collectionModelに含まれる単一のプロバイダへのショートカットである中間変数です。その名前は、親コンポーネントのvar属性の値です(List ViewやCarouselなど)。

注意:

AdfmfJavaUtilities.evaluateELExpressionを使用して、#{row}、またはrowのプロパティを評価することはできません。これらの式はnull値を戻します。

- viewControllerBundle
これは、プロジェクト・レベルで定義されているリソース・バンドルを指すリソース・バンドル変数の名前です。このノードが表示されるのは、amx:loadBundle要素が削除され、リソース・バンドルが作成された後のみです。このノードの名前は、amx:loadBundleの変数名によって異なります。このノードには、バンドル内で宣言されたすべての文字列が表示されます。

次の例は、viewControllerBundleのAMXコードの例を示しています。

<amx:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle"/>

15.3.7 ELイベントについて

ELイベントにより、MAF AMX UIの動作が決まります。これは、このイベントが共通語句を含む式の更新を同期するためです。基礎となる式の値が変化すると、その値のすべてのリスナーに向けたイベントが生成されます。

ELイベントは、共通語句を含む式が相互に同期して更新できるようにするため、MAF AMX UIの動作において重要な役割を果たします。

EL式は、様々なコンテキストで値を参照できます。次の例は、各コンポーネントがapplicationScope値に関連付けられた2つの入力数値スライダ・コンポーネントの作成方法を示しています。出力テキストでは、ELを使用して単純な追加式を計算結果とともに表示します。フレームワークでは、出力テキスト・ラベル内のEL式を解析するときに、その式に2つの値への参照が含まれていることを確認し、それら2つの値に基づく出力テキストのイベント・リスナー(「イベント・リスナーの使用方法」を参照)を作成します。基礎となる式の値が変化すると、イベントがその値のすべてのリスナーに対して生成されます。

注意:

(スコープ・オブジェクトではなく)マネージドBeanのプロパティを参照している場合、リスナーを追加する必要があります。「マネージド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}を更新すると、もう一方が出力テキストとともに自動的に更新されます。

15.3.8 EL式のマネージドBean内での使用方法

JDeveloperが提供するEL式を使用します。新しいEL式を作成して、マネージドBean内でEL式のアクセス、設定、または呼び出しを実行します。

必要なEL式はJDeveloperで作成され、作成されない式は式ビルダーを使用して作成できますが、マネージドBean内でEL式にアクセスしたり、EL式を設定または起動する必要がある場合もあります。

次の例に、EL式への参照を取得し、適合するオブジェクトを返す(または作成する)方法を示します。

public static Object resolveExpression(String expression) {
return AdfmfJavaUtilities.evaluateELExpression(expression);
}

次の例に、メソッド式を解決する方法を示します。

public static Object resloveMethodExpression(String expression,
Class returnType,
Class[] argTypes,
Object[] argValues) {
MethodExpression methodExpression = AdfmfJavaUtilities.getMethodExpression(expression,
returnType,
argTypes);
return methodExpression.invoke(AdfmfJavaUtilities.getAdfELContext(), argValues);
}

次の例に、マネージドBeanに新規オブジェクトを設定する方法を示します。

public static void setObject(String expression, Object newValue) {
AdfmfJavaUtilities.setELValue(expression, newValue);
}

15.4 マネージドBeanの作成と使用

マネージドBeanは、構成ファイルによってアプリケーションに登録されたJavaクラスです。これが解析されると、Beanのプロパティとメソッドへのアクセスを提供します。

マネージドBeanは、様々な構成ファイルを使用してアプリケーションに登録するJavaクラスです。MAFアプリケーションを起動すると、これらの構成ファイルが解析されてBeanが使用可能になり、EL式で参照できるため、Beanのプロパティとメソッドにアクセスできます。マネージドBeanが初めて参照されたときにまだ存在していない場合、マネージドBean作成機能によりBeanのデフォルトのコンストラクタ・メソッドがコールされて、Beanがインスタンス化されます。また、プロパティが宣言されると、宣言されたデフォルトの値が移入されます。

多くの場合、マネージドBeanは、フロント・エンドで処理することが最適なイベントやデータ操作を処理します。マネージドBeanの使用方法の詳細は、http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

ベスト・プラクティス:

マネージドBeanを使用して、現在のユーザーなどのブックキーピング情報のみを格納します。すべてのアプリケーション・データおよび処理データは、アプリケーションのビジネス・レイヤーのロジックによって処理される必要があります。

注意:

EL式は、Beanを参照するために明示的にスコープを含める必要があります。たとえば、pageFlowScopeスコープからMyBeanマネージドBeanを参照するには、#{pageFlowScope.MyBean}という式になります。

15.4.1 JDeveloperでのマネージドBeanの作成方法

マネージドBeanを作成して、MAFアプリケーションに登録する手順を使用してください。

adfc-mobile-config.xmlファイルに「概要」エディタを使用して、マネージドBeanの作成とMAFアプリケーションへの登録を同時に行うことができます。

始める前に:

マネージドBeanに関する知識が役立つ場合があります。「マネージドBeanの作成および使用」を参照してください。

マネージドBeanの作成および登録手順:

1. 「アプリケーション」ウィンドウで、adfc-mobile-config.xmlをダブルクリックします。

2. 「エディタ」ウィンドウで、「概要」タブをクリックします。

3. 「概要」エディタで、「マネージドBean」ナビゲーション・タブをクリックします。

図15-3は、adfc-mobile-config.xmlファイル用のエディタを示しています。

図15-3 adfc-mobile-config.xmlファイルのマネージドBean

4. 「追加」アイコンをクリックして「マネージドBean」表に行を追加します。

5. 「マネージドBeanの作成」ダイアログで値を入力します。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。JDeveloperでクラス・ファイルを作成する場合は、「クラスが存在しない場合は生成」オプションを選択します。リスナー・プロパティのいずれかを選択して「編集」ボタンをクリックすることで、「プロパティ」ウィンドウから「マネージドBeanの作成」ダイアログを開くこともできます。そこから、新しいマネージドBeanと対応するメソッドを作成できます。

注意:

マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

6. オプションでBeanに管理プロパティを追加できます。Beanがインスタンス化される際、指定した値が管理プロパティに設定されます。「マネージドBean」表でBeanを選択した状態で「新規」アイコンをクリックし、「管理プロパティ」表に行を追加します。「プロパティ」ウィンドウで、プロパティ名を入力します(他のフィールドはオプションです)。

注意:

このエディタを使用して管理プロパティを宣言することはできますが、対応するコードはJavaクラスで生成されません。適切なタイプのプライベート・メンバー・フィールドを作成し、コード・エディタのポップアップ・メニューの「アクセッサの生成」メニュー項目を選択して、これらのBeanプロパティに対応するgetおよびsetメソッドを生成することにより、コードを追加する必要があります。

15.4.2 JDeveloperを使用してマネージドBeanを作成する場合の処理

JDeveloperでマネージドBeanを作成してJavaファイルを生成すると、IDEによってスタブ・クラスが作成されます。EL式が特定のスタブ・クラス名を使用して参照できるように、ページにロジックを追加します。

マネージドBeanを作成する際、Javaファイルを生成するよう選択すると、指定された名前とデフォルト・コンストラクタを使用してスタブ・クラスが自動的に作成されます。次の例に、ビュー・パッケージに格納されたMyBeanクラスに追加されるコードを示します。

package view;

public class MyBean {
public MyBean() {
}
}

ここでページに必要なロジックを追加する必要があります。このロジックは、マネージドBeanのmanaged-bean-nameを参照するEL式を使用して参照できます。たとえば、my_beanマネージドBeanのmyInfoプロパティにアクセスする場合、EL式は次のようになります。

#{my_bean.myInfo}

JDeveloperでは、managed-bean要素もadfc-mobile-config.xmlファイル(または編集されるタスク・フロー・ファイル)に追加されます。次の例に、MyBeanクラスに対して作成されたmanaged-bean要素を示します。

<managed-bean>
<managed-bean-name>my_bean</managed-bean-name>
<managed-bean-class>view.MyBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

15.5 データ・コントロールを使用したビジネス・サービスの公開

データ・コントロールは、ビジネス・サービスにUIコンポーネントを宣言的にバインドするために作成します。「データ・コントロールの作成」メニュー・オプションを使用してデータ・コントロールを生成します。

アプリケーションのサービスの準備ができたら、JDeveloperを使用して、UIコンポーネントとサービスとの宣言的バインドに必要な情報を提供するデータ・コントロールを作成できます。

データ・コントロールの生成には、「データ・コントロールの作成」メニュー・アイテムを使用します。データ・コントロールは、1つ以上のXMLメタデータ・ファイルで構成され、これらのファイルでは、実行時にバインディングと連動するサービスの機能が定義されます。データ・コントロールは、基礎となるサービスと連動します。

15.5.1 データ・コントロールの作成方法

アプリケーション・ワークスペースを作成して、ビジネス・サービスを追加してから、データ・コントロールの作成手順を使用してください。また、データ・コントロールの基になるクラスまたはオブジェクトのコンテキスト・メニューを使用してデータ・コントロールを作成することもできます。

アダプタ・ベースのデータ・コントロールは、JDeveloperの「アプリケーション」ウィンドウ内で作成します。

始める前に:

データ・コントロール使用の一般的な知識があると役立ちます。「データ・コントロールを使用したビジネス・サービスの公開」を参照してください。

次のタスクを完了する必要があります。

- アプリケーション・ワークスペースを作成し、データ・コントロールの基礎にするビジネス・サービスを追加します。アプリケーション・ワークスペースの作成の詳細は、「MAFアプリケーションの作成」を参照してください。

データ・コントロールを作成する手順は、次のとおりです。

1. アプリケーション・ワークスペース内でデータ・モデル・プロジェクトの最上位ノードを右クリックして、「新規」を選択し、「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「ビジネス層」を展開し、「データ・コントロール」を選択して、作成するデータ・コントロールのタイプを選択し、「OK」をクリックします。

3. ウィザードの残りのステップを完了します。

注意:

場合によっては、データ・コントロールの基礎にするクラスまたはオブジェクトを右クリックし、「データ・コントロールの作成」を選択することによってデータ・コントロールを作成できます。

15.5.2 データ・コントロール作成時のプロジェクト内の処理

JDeveloperは、概要エディタで開いているデータ・コントロールの定義ファイルを作成して、「データ・コントロール」パネルにファイルの階層を表示します。

データ・コントロールを作成すると、JDeveloperによってデータ・コントロール定義ファイル(DataControls.dcx)が作成され、概要エディタでファイルが開き、ファイルの階層が「データ・コントロール」パネルに表示されます。このファイルにより、データ・コントロールがサービスおよびバインディングと直接連動して動作することが可能になります。

エディタ・ウィンドウの「ソース」タブをクリックすることによって、対応するXMLファイルからのコードを表示できます。

15.5.2.1 DataControls.dcxの概要エディタ

データ・コントロール・オブジェクトの階層とデータ・モデルの公開メソッドは、DataControls.dcxファイルの概要エディタに表示されます。このエディタを使用して、データ・コントロール・オブジェクトの設定を編集します。

DataControls.dcxファイルの概要エディタは、データ・コントロール・オブジェクトの階層と、データ・モデルの公開メソッドを表示します。

概要エディタおよび「データ・コントロール」パネルで使用されるアイコンの説明は、表15-6を参照してください。

データ・コントロール・オブジェクトの設定を変更するには、オブジェクトを選択し、「編集」アイコンをクリックします。「データ・コントロールの編集方法」を参照してください。

図15-4は、概要エディタでのDataControls.dcxファイルを示しています。

図15-4 概要エディタでのDataControls.dcxファイル

15.5.2.2 「データ・コントロール」パネル

「アプリケーション」ウィンドウに、「データ・コントロール」パネルが表示されます(データ・コントロールの作成後)。「データ・コントロール」パネルからノードをドラッグして、データバインドされたUIコンポーネントをページに作成します。

「データ・コントロール」パネルはパレットとして機能し、ノードを「データ・コントロール」パネルからページのデザイン・エディタにドラッグすることにより、データバインドされたUIコンポーネントを作成できます。データ・コントロールを作成した後、「データ・コントロール」パネルが「アプリケーション」ウィンドウに表示されます。図15-5は、サンプル・アプリケーションの「データ・コントロール」パネルを示しています。

図15-5 「データ・コントロール」パネル

15.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: パラメータとして渡された主キーの属性値を使用して行の検索を試行します。検出されると、その行が現在の行になります。

15.5.3.1 データ・コントロールのaddXXXおよびremoveXXXメソッド

ほとんどの組込み操作は自動的に動作しますが、addXXXメソッドとremoveXXXメソッドを使用するCreateやDeleteなどの組込み操作が動作するには、いくつかのメソッド・ハンドラの追加が必要になります。addXXXメソッドとremoveXXXメソッドは、自動的にコレクションをリフレッシュして、データ変更イベントをトリガーします。

組込み操作のほとんどは、コレクションに対して自動的に実行されます。操作の中には、実行するために、開発者がメソッド・ハンドラを作成する必要があるものがあります。Create操作を使用するには、開発者がaddXXXのメソッド・ハンドラを作成する必要があります。Create操作は、現在のコレクションにレコードを挿入するため、CreateInsertの操作も実行します。MAFコレクションにはCreateInsert操作は使用されません。同様に、Delete操作を実行するには、開発者がremoveXXXのメソッド・ハンドラを作成する必要があります。

addXXXおよびremoveXXXメソッドは、自動的にコレクションをリフレッシュし、データ変更イベントを起動するため、開発者はプロバイダを排他的にリフレッシュする必要はありません。データ・オブジェクトは、組込み操作のCreateおよびDeleteで使用されるaddXXXメソッドとremoveXXXメソッドなどの、データ・コントロールの組込み操作で使用されます。

- addXXX: このメソッドは、データ・コントロール・フレームワークに一意のIDを返します。たとえば、次のようになります。

public void addDeptBean(DeptBean dept)
{
deptCollection.add(dept);
}
ここで、DeptBeanはクラス名、deptはオブジェクトです。

- removeXXX: このメソッドはオブジェクトを削除します。たとえば、次のようになります。

public void removeDeptBean(DeptBean dept)
{
deptCollection.remove(dept);
}
ここで、deptはDeptBeanクラスのオブジェクトです。

CRUDDemoサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにあります。

15.6 「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成

「データ・コントロール」パネルからデータ・コントロール・オブジェクトをドラッグして、特定のUIコンポーネントを作成するページのエディタにドロップします。JDeveloperは、選択したデータ・コントロールにコンポーネントをバインドするために必要なコードとオブジェクトを自動的に作成します。

「データ・コントロール」パネルでは、各データ・コントロール・オブジェクトが特定のアイコンで表されます。表15-6は、各アイコンが表すデータ・コントロール・オブジェクト、「データ・コントロール」パネルの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。

表15-6 「データ・コントロール」パネルのアイコンおよびオブジェクト階層

アイコン

名前

説明

作成できるコンポーネント

データ・コントロール

データ・コントロールを表します。

他のオブジェクトのコンテナとして機能し、作成には使用されません。

コレクション

アクセッサ・メソッドまたは操作から返される名前付きデータ・コレクションを表します。

フォーム、表、グラフ、ツリー、レンジ・ナビゲーションの各コンポーネント、マスター/ディテール・コンポーネントおよび選択リストの各コンポーネント。

構造化された属性

Javaプリミティブ・タイプ(属性として示される)または任意のタイプのコレクションのいずれでもない、戻りオブジェクトを示します。

フォーム、ラベル、テキスト・フィールド、日付、値リストおよび選択リストの各コンポーネント。

属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。

キー属性

データ・コントロール構造ファイル、またはビジネス・サービス自体で、主キー属性として宣言されたオブジェクト属性を表します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。

メソッド

データ・コントロールのメソッドまたは操作、またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはコレクションを戻したりすることができます。

コマンド・コンポーネント。

パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。

メソッド戻り値

メソッドまたはその他の操作から返されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、または親コレクションで実行できる操作などです。

単一の値の場合: テキスト・フィールドおよび選択リスト。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント。

単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するために、対応するメソッドをボタンとしてドロップできます。フォームがタスク・フローの一部の場合、メソッドを起動するためのメソッド・アクティビティを作成できます。

操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。

ボタンおよびリンクなどのUIコマンド・コンポーネント。

パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。

ラベル、テキストおよび選択リストの各コンポーネント。

15.6.1 「データ・コントロール」パネルの使用方法

「データ・コントロール」パネルには、アプリケーションを構築するための事前定義済のUIコンポーネントのセットが用意されています。コンテキスト・メニューを使用してUIコンポーネントを作成する手順を使用してください。コンテキスト・メニューは、このパネルからデータ・コレクションを選択すると表示されます。

JDeveloperは、ドロップするデータ・コントロール項目に対してそれぞれ選択できるUIコンポーネントの事前定義済セットを備えています。

始める前に:

「データ・コントロール」パネルの各種オブジェクトに関する知識があると役立つ場合があります。「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成を参照してください。

次のタスクを完了する必要があります。

- 「データ・コントロールの作成方法」の説明に従ってデータ・コントロールを作成します。

- 「MAF AMXページの作成」の説明に従ってMAF AMXページを作成します。

「データ・コントロール」パネルを使用してUIコンポーネントを作成するには:

1. 「データ・コントロール」パネルで項目を選択し、ページのビジュアル・エディタにその項目をドラッグします。パネルの各項目の定義は、表15-6を参照してください。

2. ポップアップ・メニューから、UIコンポーネントを選択します。

「データ・コントロール」パネルから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのポップアップ・メニューが表示されます。表示されるコンポーネントは、プロジェクト内のライブラリに基づきます。

図15-6は、「データ・コントロール」パネルのデータ・コレクションがページにドロップされる際に表示されるポップアップ・メニューを示しています。

図15-6 「データ・コントロール」パネルからのコンポーネントのドロップ

ポップアップ・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログが自動的に表示されます。たとえば、ポップアップ・メニューから 「フォーム」を選択すると、「フォーム・フィールドの編集」ダイアログが開きます。コンポーネントを選択すると、JDeveloperではビジュアル・エディタのページにそのUIコンポーネントが挿入されます。

デフォルトで選択されたUIコンポーネントはまず、対応するビジネス・オブジェクト上で設定されているUIヒントで決定されます。UIヒントが設定されていない場合、JDeveloperでは標準のフォームおよび表の入力コンポーネントと読取り専用のフォームおよび表の出力コンポーネントが使用されます。リストのコンポーネントは、データ・コントロール・オブジェクトをドロップするときに選択するリストの型に基づいて決定されます。

デフォルトでは、データ・コントロールの使用時に作成されるUIコンポーネントは、MAFデータ・コントロール内の属性にバインドされ、次のような組込み機能を装備できます。

- データバインド・ラベル

- ツールチップ

- 書式設定

- 基本的なナビゲーション・ボタン

- 検証(検証規則が特定の属性にアタッチされている場合。)

デフォルトのコンポーネントは、そのまま使用しても十分機能します。ただし、特定のニーズに合せて変更することができます。

ヒント:

ページで使用するMAFデータバインド・コンポーネントのタイプを変更する場合は、ビジュアル・エディタまたは構造ウィンドウを使用してそのコンポーネントを削除し、「データ・コントロール」パネルから新しいコンポーネントをドラッグ・アンド・ドロップする方法が最も簡単です。データバインドされたコンポーネントをページから削除するときにビジュアル・エディタまたは構造ウィンドウを使用する場合、ページ定義ファイルの関連するバインディング・オブジェクトが他のどのコンポーネントからも参照されていなければ、これらのバインディング・オブジェクトはJDeveloperによって自動的に削除されます(ソース・エディタを使用する場合は、バインディング・オブジェクトの自動削除は行われません)。

15.6.2 「データ・コントロール」パネルの使用時の処理

「データ・コントロール」パネルを使用してアプリケーションを構築すると、JDeveloperによって次の処理が行われます。

- DataBindings.cpxファイルがプロジェクトのデフォルト・パッケージに作成されます(このファイルが存在しない場合のみ)。また、そのページ用にエントリが追加されます。
DataBindings.cpxファイルは、アプリケーションのバインディング・コンテキストを定義します。バインディング・コンテキストはコンテナ・オブジェクトの1つで、使用可能なデータ・コントロールおよびデータ・バインディング・オブジェクトのリストを含みます。DataBindings.cpxファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

- META-INFディレクトリにadfm.xmlファイルが作成されます。このファイルにより、DataBindings.cpxファイルのレジストリが作成され、バインディング・コンテキストを作成できるように、実行時にアプリケーションで特定できます。

- パッケージ定義ファイルがページ定義サブパッケージに追加されます(ページに対してファイルが存在しない場合)。デフォルトのサブパッケージは、adfmsrcディレクトリにあるmobile.pageDefsです。

ヒント:

「プロジェクト・プロパティ」ダイアログ(プロジェクト・ノードをダブルクリックするとアクセスできる)のADFモデル設定ページで、パッケージ構成(名前と場所など)を設定できます。

ページ定義ファイル(pageNamePageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのバインディング・コンテナを定義します。バインディング・コンテナでは、ページのすべてのバインディング・オブジェクトへのランタイム・アクセスが行われます。ページ定義ファイルの詳細は、「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

ヒント:

現在のバインディング・コンテナは、プログラム的なアクセス用のAdfContextからも入手できます。

- ページ定義ファイルが構成されます。この処理では、ページによって参照されるバインディング・オブジェクトの定義も追加されます。

- ページに指定のコンポーネントを追加します。
これらの事前作成済コンポーネントには、ページ定義ファイルのバインディング・オブジェクトを参照するデータ・バインディング式言語(EL)式が含まれます。「データ・バインディングEL式について」を参照してください。

- UIコンポーネントが必要とするすべてのライブラリ、ファイル、および構成要素が追加されます。データバインドされたコンポーネントに必要なアーティファクトの詳細は、「MAFアプリケーションの作成時に行われる処理」を参照してください。

15.7 実行時に行われる処理: バインディング・コンテキストの動作方法

ページにMAFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、バインディング・コンテキストと呼ばれる単一オブジェクトを介して、アプリケーションによって管理されます。

バインディング・コンテキストは、アプリケーション内のすべてのデータ・コントロールおよびページ定義のランタイム・マップ(名前付きdataでEL式#{data}を使用してアクセス可能)です。

図15-7に示すように、MAFでは、アプリケーション、DataBindings.cpxおよびページ定義ファイルからバインディング・コンテキストが作成されます。設計時に使用可能なデータ・コントロールは、すべてのDataControls.dcxファイルとワークスペース内のすべてのアプリケーション・モジュールの集合体によって定義されますが、実行時にアプリケーションで使用可能なデータ・コントロールは、DataBindings.cpxファイルで定義されます。DataBindings.cpxファイルは、アプリケーションのページで使用されているデータ・コントロールをすべて一覧表示し、ページ定義ファイルに定義されたバインディング・オブジェクトが格納されているバインディング・コンテナをWebページのURLにマップします。ページ定義ファイルは、アプリケーション・ページで使用するバインディング・オブジェクトを定義します。各ページにページ定義ファイルが1つあります。

バインディング・コンテキストには、これらのオブジェクトの実際のインスタンスは含まれていません。かわりに、マップには必要に応じてデータ・コントロールまたはバインディング・コンテナ・オブジェクトになる参照が含まれます。たとえば、オブジェクト(ページ定義など)がアプリケーションから解放されるか、タスク・フローが終了するか、リクエストの終了時にバンディング・コンテナまたはデータ・コントロールが解放されると、データ・コントロールおよびバンディング・コンテナは参照オブジェクトに戻ります。DataBindings.cpxファイルの詳細は、「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

図15-7 ファイル・バインディング・コンテキストの実行時の使用

注意:

コンポーネントを構成するときは、使用するバインディング・スタイルを十分に考慮してください。より具体的に言うと、標準的なバインディングをマネージドBeanバインディングと組み合せると、解釈を誤った動作が発生することがよくあります。これは、バインディング・インフラストラクチャとマネージドBeanインフラストラクチャとの間でクラス・インスタンスが一致する可能性が低いためです。バインディングが混在すると、UIに直接リンクされていないインスタンスの動作がコールされる場合があります。

MAFでのバインディングの使用の詳細は、次を参照してください。

- 生成されるバインディングに関する必知事項

- MAF AMXエディタの「バインディング」タブの使用方法

- 使用されないバインディングの削除に関する必知事項

15.8 データ・コントロールの構成

データ・コントロールを作成してから、そのコントロールの要素を格納するデータ・コントロール構造ファイルを作成して変更します。.dcxファイルの概要エディタを使用して、データ・コントロール構造ファイルを生成します。

データ・コントロールを作成すると、データ・コントロールについて、値と動作の標準的なセットが設定されます。たとえば、属性のラベルのクライアントでの表示方法がデータ・コントロールによって決定されます。データ・コントロールの要素に対応するデータ・コントロール構造ファイルを作成および変更することによって、これらの値と動作を構成できます。まず、.dcxファイルの概要エディタを使用して、データ・コントロール構造ファイルを生成します。

15.8.1 データ・コントロールの編集方法

データ・コントロールを作成してから、データ・コントロールを編集する手順を使用してください。

データ・コントロールを構成可能にするには、DataControls.dcxファイルの概要エディタを使用し、データ・コントロールに含まれるオブジェクトに対応するデータ・コントロール構造ファイルを作成します。個別のデータ・コントロール構造ファイルを編集できるようになります。

始める前に:

データ・コントロール構成の一般的な知識があると役立ちます。「データ・コントロールの構成」を参照してください。

次のタスクを完了する必要があります。

- 「データ・コントロールの作成方法」の説明に従ってデータ・コントロールを作成します。

データ・コントロールを編集するには:

1. 「アプリケーション」ウィンドウで、DataControls.dcxをダブルクリックします。

2. 概要エディタで、構成するオブジェクトを選択し、「編集」アイコンをクリックしてデータ・コントロール構造ファイルを生成します(図15-8を参照)。

図15-8 データ・コントロール・レジストリの「編集」ボタン

3. データ・コントロール構造ファイルの概要エディタで、必要な変更を加えます。

15.8.2 データ・コントロール編集時の処理

データ・コントロールを編集すると、JDeveloperにより、影響を受けたコレクションのメタデータが含まれているデータ・コントロール構造ファイルが作成され、そのファイルが概要エディタで開かれます。

このファイルには、そのコレクション固有のデータ・コントロールの構成データ(データ・オブジェクトに対して指定したUIヒントまたはバリデータなど)が保存されています。

データ・コントロール構造ファイルのベース名は、対応するデータ・オブジェクトのものと同じです。たとえば、Customer.javaエンティティBeanに対応するコレクション・ノードが選択されている状態で「編集」アイコンをクリックすると、データ・コントロール構造ファイルの名前はCustomer.xmlとなります。データ・コントロール構成ファイルはBeanクラスのパッケージに対応するパッケージに生成され、パッケージ名にpersdefが付加されます。たとえば、Customer.java Beanがmodelパッケージ内にある場合、Customer.xmlデータ・コントロール定義ファイルはpersdef.modelパッケージ内に生成されます。データ・コントロール構成ファイルが生成された後、概要エディタを使用してそのファイルをさらに構成できます。

データ・コントロール構造ファイルには、次の情報が含まれます。

- 属性: サービスのすべての属性を表します。たとえば、エンティティBeanの場合は、データベース列にマップされたBeanプロパティごとに属性が存在します。また、一時属性も追加できます。これらの属性のUIでの表示方法を定義するUIヒントを設定できます。属性値が必須か、一意である必要があるか、表示可能かどうかなどの他のプロパティを設定することもできます。詳細は、「属性の操作」を参照してください。
「属性の検証」で説明しているように、属性の検証を設定したり、カスタム・プロパティを作成することもできます。

- アクセッサ: 結果セットを返すデータ・コントロール要素を表します。

- 操作: データ・コントロールの組込み操作で使用されるデータ・オブジェクト上のメソッドを表します。たとえば、それぞれ「作成」および「削除」組込み操作で使用されるaddおよびremoveメソッドなどです。

図15-9に、Item Beanのデータ・コントロール構造ファイルを示します。

図15-9 概要エディタでのデータ・コントロール構造ファイル

注意:

データ・コントロール構造ファイルの概要エディタには、データ・オブジェクトに関連付けられているすべての属性、アクセッサおよび操作が表示されます。ただし、データ・コントロール構造ファイルのXMLソースには、編集した要素の定義のみが含まれます。基本要素は、データ・オブジェクトからイントロスペクションされます。また、基礎となるデータ・オブジェクトに変更を加えると、データ・コントロールはそれらの変更を継承します。

15.8.3 データ・コントロールのMDSカスタマイズに関する必知事項

データ・コントロール構造ファイルは、データ・コントロール内のオブジェクトをOracle Metadata Servicesのカスタマイズに使用できるようにする場合に、そのオブジェクトに対して必要になります。データ・コントロール・オブジェクトごとにメタデータを編集および追加して、そのオブジェクト用のデータ・コントロール構造ファイルが生成されるようにします。

データ・コントロールに含まれるすべてのオブジェクトをOracle Metadata Services (MDS)カスタマイズ可能にする必要がある場合は、パッケージされたアプリケーションにこれらのオブジェクトのデータ・コントロール構造ファイルが含まれている必要があります。

アダプタ・フレームワークに基づくデータ・コントロールを作成する際には、データ・コントロール構造ファイルはデフォルトでは生成されません。これは、特定のオブジェクトにメタデータを追加しない場合、データ・コントロールにこれらのファイルは必要ないからです。「データ・コントロールの編集方法」で説明されているように、通常、データ・コントロール構造ファイルは、宣言型のメタデータ(UIヒントやバリデータなど)をそのオブジェクトに追加するためにデータ・コントロールを編集するときにのみ、データ・コントロール・オブジェクト用に生成されます。各データ・コントロール・オブジェクト用のデータ・コントロール構造ファイルを作成するには、データ・コントロール・オブジェクトごとにその手順を繰り返す必要があります。

「MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ」を参照してください。

15.9 属性の使用

データ・コントロールが作成されていて、オブジェクトのデータ・コントロール構造ファイルが生成されていると、データ・オブジェクトの持続属性の機能を構成できます。データ・コントロール構造ファイルの概要エディタの「属性」ページを使用して、プロパティを構成します。

ビジネス・サービスのデータ・コントロールを作成する際、個々のデータ・オブジェクトに作成するデータ・コントロール構造ファイルで宣言的にデータ・オブジェクトの永続属性の機能を拡張できます。たとえば、UIコンポーネントの属性のデフォルト表示を制御する検証ルールを作成し、UIヒントを設定できます。

これらのプロパティはデータ・コントロール構造ファイルの概要エディタの「属性」ページで設定します。データ・コントロール構造ファイルの作成の詳細は、「データ・コントロールの編集方法」を参照してください。

15.9.1 属性を主キーとして指定する方法

データ・オブジェクトのデータ・コントロール構造ファイルでは、そのデータ・オブジェクトの主キーとして属性を指定できます。設定された主キーが継承されていないデータ・オブジェクトに、主キーとして属性を設定する手順を使用してください。

データ・オブジェクトのデータ・コントロール構造ファイルの概要エディタでは、そのデータ・オブジェクトの主キーとして属性を指定できます(そのデータ・オブジェクトの基礎クラスでまだ指定していない場合)。

始める前に:

属性プロパティの設定方法の知識があると役立ちます。属性の使用を参照してください

次のタスクを完了する必要があります。

- 「データ・コントロールの編集方法」の説明に従って、必要なデータ・コントロール構造ファイルを作成します。

属性を主キーとして設定する手順は次のとおりです。

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで、主キーとして指定する属性を選択して、「詳細」タブをクリックします。

4. 「詳細」ページで、「キー属性」プロパティを設定します。

注意:

属性がクラス内ですでに主キーとして指定されている場合、データ・コントロールはその設定を継承し、「キー属性」チェックボックスが選択されます。ただし、この場合は、「キー属性」オプションを選択解除することはできません。

15.9.2 属性の静的なデフォルト値を定義する方法

データ・オブジェクトのデータ・コントロール構造ファイルの概要エディタでは、属性の静的なデフォルト値を指定できます。値タイプを「リテラル」に設定して、属性の静的なデフォルト値を定義する手順を使用してください。

値のタイプが「リテラル」に設定されている場合、「詳細」セクションの「値」フィールドには、属性のデフォルト値を静的に指定できます。たとえば、ServiceRequestエンティティBeanのStatus属性のデフォルト値をOpenに設定することや、User BeanのUserRole属性のデフォルト値をuserに設定できます。

始める前に:

属性プロパティの設定方法の知識があると役立ちます。属性の使用を参照してください

属性の静的なデフォルト値を定義する手順:

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで編集する属性を選択し、「詳細」タブをクリックします。

4. 「詳細」ページで、「リテラル」オプションを選択します。

5. 「リテラル」オプションの下のテキスト・フィールドに、属性のデフォルト値を入力します。

15.9.3 属性へのUIヒントの設定方法

属性にUIヒントを設定することで、そのヒントを一貫して表示およびラベル付けして、その属性を使用するUIコンポーネントでの属性の利便性とローカライズ可能性を向上します。「アプリケーション」ウィンドウの「属性」オプションを使用して、UIヒントを設定する手順を使用してください。

属性のUIヒントを設定し、それらの属性を使用するすべてのUIコンポーネントでそれらの属性が一貫したローカライズ可能な方法で表示およびラベル付けされるように設定できます。UIヒントにより、属性、ラベル、ツールチップ、フィールドを自動的に送信する必要があるかどうかを表示するために使用するUIコンポーネントのタイプなどが決定されます。特定の属性を表示するか非表示にするかも決定できます。属性のUIヒントを作成するには、「アプリケーション」ウィンドウからアクセスできる、データ・オブジェクトのデータ・コントロール構造ファイルの概要エディタを使用します。

始める前に:

属性プロパティの設定方法の知識があると役立ちます。属性の使用を参照してください

次のタスクを完了する必要があります。

- 「データ・コントロールの編集方法」の説明に従って、必要なデータ・コントロール構造ファイルを作成します。

UIヒントを設定する手順:

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで編集する属性を選択し、「UIヒント」タブをクリックします。

4. 「UIヒント」セクションで、目的のUIヒントを設定します。

15.9.4 属性へのUIヒントの設定時の処理

属性のUIヒントは、タグが追加されるプロパティとして保存されます。プロパティの値は、リソース・バンドル・ファイルに保存されますが、このファイルが見つからない場合は生成されます。

属性に対してUIヒントを設定すると、それらのヒントはプロパティとして格納されます。プロパティのタグはデータ・オブジェクトのデータ・コントロール構造ファイルに追加され、プロパティの値はリソース・バンドル・ファイルに保存されます。リソース・バンドル・ファイルが存在していない場合は、データ・コントロールのパッケージに生成され、初めてUIヒントを設定した際のプロジェクト名に従って名前が設定されます。

次の例に、Item.xmlデータ・コントロール構造ファイルにおけるprice属性のコードを示します。属性に対して設定されているラベルおよびフォーマット・タイプ・ヒントのタグも含まれます。

<PDefAttribute
Name="price">
<Properties>
<SchemaBasedProperties>
<LABEL
ResId="${adfBundle['model.ModelBundle']['model.Item.price_LABEL']}"/>
<FMT_FORMATTER ResId="${adfBundle['model.ModelBundle']
['model.Item.price_FMT_FORMATTER']}"/>
</SchemaBasedProperties>
</Properties>
</PDefAttribute>

次の例に、ModelBundle.propertiesリソース・バンドル・ファイルにおけるラベルおよびフォーマット・タイプ・ヒントの対応するエントリを示します。これらにはプロジェクトのローカライズ可能なプロパティのすべての値も含まれています。

model.Item.price_LABEL=Price
. . .
model.Item.price_FMT_FORMATTER=oracle.jbo.format.DefaultCurrencyFormatter

15.9.5 EL式を使用してUIヒントにアクセスする方法

EL式を使用して、ヒントの値をデータとしてページに表示し、UIヒントにアクセスできるようにします。データバインドされたコンポーネントをページにドラッグして、UIヒントへのアクセスを提供するバインディング・インスタンスを作成します。

EL式を使用してUIヒントにアクセスし、ページにデータとしてヒント値を表示できます。UIヒントには、データバインドされたコンポーネントをページにドロップした後に作成するバインディング・インスタンスを通じてアクセスできます。

次の例は、DeviceFeaturesデータ・コントロールを使用して生成されました。この例は、MAFフォームとして接続をドラッグ・アンド・ドロップし、displayNameフィールドとnicknameフィールドのみを保持することによって生成されるEL式を示しています。太字で表示されるラベルは、ELを使用したUIヒント取得の例です。

<amx:panelFormLayout id="pfl2">
<amx:inputText value="#{row.bindings.displayName.inputValue}"
label="#{bindings.Contact.hints.displayName.label}" id="it9"/>
<amx:inputText value="#{row.bindings.nickname.inputValue}"
label="#{bindings.Contact.hints.nickname.label}"
id="it10"/>
</amx:panelFormLayout>af:panelHeader id="ph1"

15.10 Beanデータ・コントロールの作成と使用

Beanデータ・コントロールは、Beanクラスのメタデータ・ラッパーとして機能し、コード要素をUIコンポーネントにバインドするために使用するデータ・コントロール・オブジェクトとしてBeanのコード要素を公開します。Java Beanのデータ・コントロールは、「アプリケーション」ウィンドウの「データ・コントロールの作成」オプションを使用して作成します。

Beanデータ・コントロールは、Beanクラスのメタデータ・ラッパーとして機能し、データ・コントロール・オブジェクトとしてBeanのコード要素を公開します。このオブジェクトを使用して、これらのコード要素をUIコンポーネントにバインドできます。Java Beanデータ・コントロールでは、POJO (Plain Old Java Object)から自身のデータ構造を取得します。Java Beanデータ・コントロールを作成するには、Javaクラス・ファイルを右クリックし(「アプリケーション」ウィンドウ内)、「データ・コントロールの作成」を選択します。Java Beanのデータ・コントロールは、JDeveloperの「アプリケーション」ウィンドウ内で作成します。

始める前に:

データ・コントロールの一般的な知識があると役立ちます。「データ・コントロールの作成方法」を参照してください。

注意:

Java Beanがバックグラウンド・スレッドを使用してUI内のデータを更新する場合、手動でoracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventをコールする必要があります。flushDataChangeEventメソッドの詳細は、「データ変更イベントについて」を参照してください。

ローカルSQLiteデータベースおよびJava Beanデータ・コントロールを使用してCRUD操作を構築するサンプルは、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリにあるPublicSamples.zipファイル内のCRUDDemoというMAFサンプル・アプリケーションを参照してください。

15.10.1 Beanクラス変数のシリアライズに関する必知事項

ネストされたオブジェクトのチェーンはtransientとして定義することでシリアライズを防止し、オブジェクトのネストによる循環オブジェクトの作成を回避します。JSONBeanSerializationHelperクラスを使用すると、JavaオブジェクトをJSONオブジェクトにシリアライズおよびシリアライズ解除できます。

MAFでは、一時変数として宣言されたJavaScript Object Notation (JSON)データBeanクラス変数にはシリアライズしません。一連のネストされたオブジェクトのシリアライズを避けるには、それらを一時オブジェクトとして定義する必要があります。この方法を使用すると、オブジェクトのネストが原因で循環オブジェクトが作成されるのを防ぐこともできます。

次のシナリオを考えてみましょう。Employeeオブジェクトが、その子として従業員の上司を表すEmployeeオブジェクトを保持しているとします。その子を一時オブジェクトとして宣言しなかった場合、実行時に子のEmployeeオブジェクトを計算しようとすると、一連のネストされたシリアライズ・オブジェクトが作成されます。

JavaオブジェクトをJSONオブジェクトにシリアライズおよびシリアライズ解除するには、JSONBeanSerializationHelperクラスを使用します。JSONBeanSerializationHelperクラスを使用すると、独自のカスタムJSONシリアライズおよびシリアライズ解除を実装できます。また、このクラスでは、JSONシリアライズ(およびシリアライズ解除)処理後にJSONオブジェクトを変更するためのフックが提供されます。Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.framework.api.JSONBeanSerializationHelperクラスに関する項を参照してください。

MAFでは、GregorianCalendarクラスのオブジェクトのシリアライズはサポートされません。JSONBeanSerializationHelperクラスでは、GregorianCalendarクラスのオブジェクトをシリアライズできません。これは、GregorianCalendarクラスに循環参照が含まれるためです。かわりに、java.util.Dateまたはjava.sql.Dateをデータ操作に使用します。次の例は、java.util.Dateを使用してGregorianCalendarオブジェクトを変換する方法を示しています。

Calendar calDate = new GregorianCalendar();
calDate.set(1985, 12, 1); // "January 1, 1986"
Date date = calDate.getTime();

15.11 アプリケーション機能間のデータ・コントロールのインスタンスの共有

共有インスタンスにアクセスするすべてのアプリケーション機能について、複数のアプリケーション機能がアクセスするデータ・コントロールがメモリーに一度ロードされるように、アプリケーション機能間でデータ・コントロールのインスタンスを共有できます。

これを行うことにより、MAFアプリケーションのパフォーマンスは大幅に向上します。共有インスタンス・データ・コントロールは、データ・コントロールにアクセスするアプリケーション機能ごとではなく、メモリーに一度ロードされます。

MAFは、共有インスタンス・データ・コントロールを使用するアプリケーション機能でエンド・ユーザーが行うデータの変更を共有インスタンス・データ・コントロールを使用する他のアプリケーション機能に伝播します。

デフォルトでは、データ・コントロールはMAFアプリケーションのアプリケーション機能間で共有されません。maf-application.xmlファイルの概要エディタの「共有インスタンスDC」ページに共有する各データ・コントロールを追加する必要があります。図15-10は、HRServiceデータ・コントロールが共有インスタンス・データ・コントロールとして指定されている「共有インスタンスDC」ページを示しています。

デフォルトでは、MAFは、セキュリティが有効化されたアプリケーション機能からの共有インスタンス・データ・コントロールへのアクセスのみ許可します。Enable Securityプロパティをfalseに設定して、この制限を無効化し、認証されていないユーザーが使用するアプリケーション機能が共有インスタンス・データ・コントロールにアクセスできるようにすることができます。

図15-10 maf-application.xmlの概要エディタの「共有インスタンス・データ・コントロール」ページ

データ・コントロールを共有インスタンス・データ・コントロールとして指定した場合でも、MAFアプリケーションがdata-control-contextの値がisolatedのタスク・フローからアクセスするデータ・コントロールは共有されません。

15.11.1 アプリケーション機能間のデータ・コントロールのインスタンスの共有方法

maf-application.xmlファイルの概要エディタの「共有インスタンスDC」ページに共有する各データ・コントロールを追加して、データ・コントロールのインスタンスを共有します。

アプリケーション機能間でデータ・コントロールのインスタンスを共有する手順:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを展開します。

2. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

3. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「共有インスタンスDC」ナビゲーション・タブをクリックします。

4. 「共有インスタンスDC」ページで「追加」アイコンをクリックします。

5. sharedInstanceDataControlの挿入ダイアログで、ドロップダウン・リストからデータ・コントロールのIDを選択します。

6. 「OK」をクリックします。

15.11.2 アプリケーション機能間でデータ・コントロールのインスタンスを共有する際の処理内容

実行時、共有インスタンス・データ・コントロールとして指定したデータ・コントロールに対して、1つのデータ・コントロールのインスタンスが作成されます。これは、たとえば、関連付けられた共有インスタンス・データ・コントロールが最初に機能によって参照されたときに一度だけ、Javaクラスがインスタンス化されるということです。

共有インスタンス・データ・コントロールを参照するすべてのアプリケーション機能は、このJavaクラスのインスタンスを共有します。セキュリティ設定で許可されている場合、共有インスタンス・データ・コントロールの更新はすべてのアプリケーション機能に配信されます。たとえば、共有インスタンス・データ・コントロールが保護されたアプリケーション機能でのみ利用可能な場合(デフォルトの設定)、データ変更またはデータ・プロバイダのイベントの形での更新が保護されたアプリケーション機能に送信され、保護されていないアプリケーション機能が共有インスタンス・データ・コントロールにアクセスしようとすると、MAFはエラーをスローします。

ここで説明した動作の1つの例外は、MAFアプリケーションが、data-control-contextの値がisolatedのタスク・フローから共有インスタンス・データ・コントロールにアクセスする場合です。このシナリオでは、複数のデータ・プロバイダのインスタンスが作成されます。

JDeveloperは、共有として指定した各データ・コントロールを識別するmaf-application.xmlファイルにエントリを追加します。次の例は、2つの共有インスタンス・データ・コントロールのエントリを示しています。最初の共有インスタンス・データ・コントロール(HRService)は、セキュリティが有効化されたアプリケーション機能でのみアクセスできます(デフォルトの設定)。一方、2番目(CustomerService)は、保護されていないアプリケーション機能からアクセスできます。

例15-1 maf-application.xmlファイルで定義された共有インスタンス・データ・コントロール

<adfmf:application ...>
...
<adfmf:sharedInstanceDataControls>
<adfmf:sharedInstanceDataControl dataControlId="HRService" id="sidc1"/>
<adfmf:sharedInstanceDataControl dataControlId="CustomerService" id="sidc2" securityEnabled="false"/>
</adfmf:sharedInstanceDataControls>
</adfmf:application>

15.12 DeviceFeaturesデータ・コントロールの使用方法

新しいMAFアプリケーションを作成すると、MAFは「データ・コントロール」パネルにDeviceFeaturesデータ・コントロールを表示します。MAF AMXページ上のデータ・コントロールで使用可能な操作を使用して、デバイス上のユーザー連絡先の管理、電子メール・メッセージとSMSテキスト・メッセージの使用、デバイスの場所の確認、デバイスのカメラの使用、デバイスに保管しているイメージの取得を実行します。

MAFでは、アプリケーション内でDeviceFeaturesデータ・コントロールを通じて使用できるデバイス固有の機能が公開されます。DeviceFeaturesデータ・コントロールは、新しいMAFアプリケーションを作成するときに「データ・コントロール」パネルに表示されるコンポーネントです。Cordova Java APIは、このデータ・コントロールを通じて抽象化されます。これにより、MAF AMXとして実装されたアプリケーション機能から、デバイスに埋め込まれた様々なサービスにアクセスできるようになります。DeviceFeaturesデータ・コントロールから提供される操作をMAF AMXページ内にドラッグ・アンド・ドロップすることで、デバイスに格納されたユーザーの連絡先を管理する機能の追加、電子メール・メッセージとSMSテキスト・メッセージの両方の作成と送信、デバイスの位置の確認、デバイスのカメラの使用およびデバイスのファイル・システムに格納されたイメージの取得を実行できます。次の項では、これらの操作を宣言的に使用する方法や、JavaコードとJavaScriptを使用して実装する方法など、各操作について詳しく説明します。

図15-11 概要エディタでのMAFのDeviceFeaturesデータ・コントロール

MAFアプリケーション・テンプレートを使用してアプリケーションを作成すると、自動的にDeviceFeaturesデータ・コントロールが「データ・コントロール」パネルに表示されます。図15-11は、「概要」エディタ内のDeviceFeaturesデータ・コントロールを示しています。次のメソッドを使用できます。

- addLocalNotification

- cancelLocalNotification

- createContact

- displayFile

- findContacts

- getPicture

- removeContact

- sendEmail

- sendSMS

- startLocationMonitor

- updateContact

ページを作成したら、DeviceFeaturesデータ・コントロールのメソッド(またはそれらのメソッド内にネストされたその他のオブジェクト)を「データ・コントロール」パネルからMAF AMXビューにドラッグして、関連する機能にバインドされたコマンド・ボタンやその他のコンポーネントを作成できます。デフォルトのバインディングを受け入れるか、ELを使用してそれらのバインディングを変更できます。また、JavaScriptやJavaを使用して、機能を実装または構成することもできます。「MAF AMXページへのデータ・コントロールの追加方法」を参照してください。

DeviceManagerは、デバイスの機能へのアクセスを可能にするオブジェクトです。このオブジェクトのハンドルは、DeviceManagerFactory.getDeviceManagerをコールすることによって取得できます。次の項では、DeviceManagerオブジェクトを使用してgetPictureやcreateContactなどのメソッドを起動する方法について説明します。

[[ dev ER 19938192は後述]]

ネットワーク・アクセスを除き、すべてのApache Cordova対応デバイス機能へのアクセスは、MAFアプリケーションの場合デフォルトでは有効になっていません。DeviceFeaturesデータ・コントロールによって公開されている操作が実行時に正常に機能するには、関連するプラグインがMAFアプリケーションで有効になっている必要があります。たとえば、DeviceFeaturesデータ・コントロールのsendSMS操作を使用する場合は、MAFアプリケーションでSMSプラグインを有効にする必要があります。プラグインは手動で有効にするか、MAFアプリケーションで関連するプラグインが有効になっていない操作をドラッグ・アンド・ドロップしたときにJDeveloperによって表示されるダイアログで該当するオプションを選択して有効にします。たとえば、まだSMSプラグインが有効になっていないMAFアプリケーションのMAF AMXページにsendSMS操作をドラッグ・アンド・ドロップすると、JDeveloperによって図15-12のダイアログが表示されます。

図15-12 DeviceFeaturesデータ・コントロールの操作用プラグインの有効化

操作に必要なプラグインが有効になっていない場合、MAF AMXページのソース・ファイル内に警告メッセージが表示されます。たとえば、MAFアプリケーションでSMSプラグインが有効になっていないと仮定しましょう。MAF AMXページの、アプリケーションがsendSMS操作を起動する箇所に、図15-13に示した警告メッセージが表示されます。この問題を解決するには、「MAFアプリケーションでのプラグインの使用方法」の説明に従って、プラグインを手動で有効にします。

図15-13 DeviceFeaturesデータ・コントロールの操作に必要なプラグイン

15.12.1 撮影を有効にするためのgetPictureメソッドの使用方法

DeviceFeaturesデータ・コントロールには、デバイスのカメラでの写真撮影や既存の画像の取得のためのgetPictureメソッドがあります。getPicture操作をカスタマイズする手順を使用してください。カスタマイズには、sourceType、destinationType、quality、allowEditなどのパラメータを使用します。

DeviceFeaturesデータ・コントロールに含まれるgetPictureメソッドをMAFアプリケーションで使用すると、エンド・ユーザーはデバイスのカメラとフォト・ライブラリを利用して、写真を撮影や既存のイメージの取得ができるようになります。この項の終わりに、次のことを示す例があります。

- デバイスのカメラでエンド・ユーザーが写真撮影できるようにするJavaScriptコード。デバイスのカメラでユーザーが写真撮影できるようにするJavaコード。

- ユーザーが保存済イメージを取得することを可能にする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. 「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからgetPicture操作をドラッグし、ボタンとしてページにドロップします。
ユーザーがよりきめ細かく制御できるようにするには、getPicture操作をパラメータ・フォームとしてドロップします。これにより、エンド・ユーザーは写真を撮影したり既存のイメージを選択する前に、設定を指定できるようになります。

2. 「アクションの編集」ダイアログで、前述のすべてのパラメータの値を設定します。イメージがファイル名として戻されるように、destinationType = 1を指定するようにします。

3. getPictureの戻り値をドラッグし、それを出力テキストとしてページ上にドロップします。

4. 「共通コンポーネント」パネルで、「コンポーネント・パレット」から「イメージ」をドラッグし、ページ上にドロップします。

5. 「イメージ」のsource属性を、getPicture操作の戻り値に設定します。バインディングの式は、#{bindings.Return.inputValue}である必要があります。

図15-14は、ユーザーのフォト・ライブラリからのイメージを表示するバインディングを示しています。

図15-14 デザインタイムでフォト・ライブラリからイメージを表示するためのバインディング

このアプリケーションを実行すると、イメージ・チューザが自動的に表示され、エンド・ユーザーは表示するイメージを選択できます。イメージ・チューザが自動的に表示される理由は、イメージ・コントロールがgetPicture操作の戻り値にバインドされており、それによってgetPicture操作が起動するためです。

注意:

getPictureメソッドのタイムアウト値は、5分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

次に示すプラットフォーム固有の問題に留意してください。

- iOS

- いくつかのデバイスでメモリー・エラーが発生しないようにするには、qualityを50未満に設定します。

- destinationType FILE_URIを使用すると、写真はアプリケーションの一時ディレクトリに保存されます。

- アプリケーションの一時ディレクトリの内容は、アプリケーションの終了時に削除されます。記憶域の空き領域が問題になる場合は、navigator.fileMgr APIを使用してこのディレクトリの内容を削除することもできます。

- targetWidthとtargetHeightを使用するには、これらを両方とも指定する必要があります。一方または両方の値が負の値または0の場合、イメージの元のディメンションが使用されます。

- Android

- allowEditパラメータを無視します。

- Camera.PictureSourceType.PHOTOLIBRARYとCamera.PictureSourceType.SAVEDPHOTOALBUMでは、どちらも同じフォト・アルバムが表示されます。

- Camera.EncodingTypeはサポートされていません。パラメータは無視され、常にJPEGイメージが生成されます。

- targetWidthとtargetHeightは、個別に指定できます。一方のパラメータが正の値で、もう一方が負の値またはゼロを使用して元のサイズを表す場合、正の値がそのディメンションに使用され、もう一方のディメンションは元のアスペクト比を維持するようにスケール変更されます。

- destinationType DATA_URLを使用すると、イメージが大きい場合は使用可能なメモリーがすべて使用され、メモリー不足のエラーが発生する場合があります。通常は、デフォルトのイメージ・サイズを使用すると、この動作が発生します。targetWidthとtargetHeightを設定してイメージ・サイズを制限します。

次の例は、デバイスのカメラでユーザーが写真撮影できるようにするJavaScriptコードを示しています。結果は、保存済イメージへのフルパスになります。

// The camera, like many other device-specific features, is accessed
// from the global 'navigator' object in JavaScript.
// Note that in the Cordova JavaScript APIs, the parameters are passed
// in as a dictionary, so it is only necessary to provide key-value pairs
// for the parameters you want to specify.

navigator.camera.getPicture(onSuccess, onFail, { quality: 50 });

function onSuccess(imageURI) {
var image = document.getElementById('myImage');
image.src = imageURI;
}

function onFail(message) {
alert('Failed because: ' + message);
}

次の例は、デバイスのカメラでユーザーが写真撮影できるようにするJavaコードを示しています。結果は、保存済イメージへのフルパスになります。

import oracle.adf.model.datacontrols.device;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Take a picture with the device's camera.
// The result will be the full path to the saved PNG image.
String imageFilename = DeviceManagerFactory.getDeviceManager().getPicture(100,
DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI,
DeviceManager.CAMERA_SOURCETYPE_CAMERA, false,
DeviceManager.CAMERA_ENCODINGTYPE_PNG, 0, 0);

次の例は、ユーザーが保存済イメージを取得することを可能にするJavaコードを示しています。結果は、Base64でエンコードされたJPEGになります。

import oracle.adf.model.datacontrols.device;

// Retrieve a previously-saved image. The result will be a base64-encoded JPEG.
String imageData = DeviceManagerFactory.getDeviceManager().getPicture(100,
DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URL,
DeviceManager.CAMERA_SOURCETYPE__PHOTOLIBRARY, false,
DeviceManager.CAMERA_ENCODINGTYPE_JPEG, 0, 0);

15.12.2 テキスト・メッセージを有効にするためのSendSMSメソッドの使用方法

DeviceFeaturesデータ・コントロールのsendSMSを使用して、デバイスのショート・メッセージ・サービス(SMS)テキスト・メッセージング・インターフェイスでSMSメッセージを送受信します。sendSMS操作はカスタマイズできます。

DeviceFeaturesデータ・コントロールに含まれるsendSMSメソッドをMAFアプリケーションで使用すると、デバイスのショート・メッセージ・サービス(SMS)テキスト・メッセージング・インタフェースを利用して、ユーザーがSMSメッセージを送受信できるようになります。MAFでは、デバイスのSMSインタフェースを表示して、必要に応じて次のフィールドにデータを事前移入できます。

- to: 受信者をリストします(カンマ区切り)。

- body: メッセージの本文を追加します。

SMSテキスト・メッセージング・インタフェースが表示されると、ユーザーはSMSを送信することも、それを取り消すこともできます。デバイスとキャリアの制限により、SMSは自動的に送信できません。実際にSMSを送信できるのはユーザーのみです。

sendSMSメソッドのタイムアウト値は、5分に設定されます。デバイスの操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

Androidでは、ユーザーがSMSメッセージの編集中にアプリケーションを切り替えて、その後戻すと、SMS編集画面は表示されなくなります。かわりに、そのメッセージは下書きとして保存され、手動で選択して編集を続けることができます。

ユニバーサルWindowsプラットフォーム上のMAFアプリケーションは、SMSテキスト・メッセージを現在サポートしていません。

DeviceFeaturesデータ・コントロールを使用してsendSMS操作をカスタマイズするには:

SMSの送信のためページに対話型フォームを表示するには、sendSMS操作を「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからドラッグし、ページ・デザイナ上にパラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスのSMSインタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに値が事前移入されいる送信準備が整ったSMSが表示されます。

図15-15は、ページ上の編集可能なフォームを使用してSMSを送信するためのバインディングを示しています。

図15-15 デザインタイムで編集可能なフォームを使用してSMSを送信するためのバインディング

次の例は、ユーザーがデバイスのテキスト・メッセージング・インタフェースを使用してSMSメッセージを送信できるようにするコード例を示しています。

sendSMSメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

次の例は、ユーザーがSMSメッセージを送信できるようにするJavaScriptコードを示しています。

adf.mf.api.sendSMS({to: "5551234567", body: "This is a test message"});

次の例は、ユーザーがSMSメッセージを送信できるようにするJavaコードを示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Send an SMS to the phone number "5551234567"
DeviceManagerFactory.getDeviceManager().sendSMS("5551234567", "This is a test message");

15.12.3 電子メールを有効にするためのsendEmailメソッドの使用方法

DeviceFeaturesデータ・コントロールには、構成済の電子メール・アカウントの電子メール・メッセージをデバイスの電子メール・メッセージング・インタフェースで送受信するためのsendEmailメソッドがあります。sendEmail操作はカスタマイズできます。

DeviceFeaturesデータ・コントロールに含まれるsendEmailメソッドをMAFアプリケーションで使用すると、デバイスの電子メール・メッセージング・インタフェースを利用して、ユーザーが電子メール・メッセージを送受信できるようになります。MAFでは、デバイスの電子メール・インタフェースを表示して、必要に応じて次のフィールドにデータを事前移入できます。

- to: 受信者をリストします(カンマ区切り)。

- cc: CC受信者をリストします(カンマ区切り)。

- subject: メッセージの件名を追加します。

- body: メッセージの本文を追加します。

- bcc: BCC受信者をリストします(カンマ区切り)。

- attachments: 電子メールに添付するファイルの名前をリストします(カンマ区切り)。

- mimeTypes: 添付ファイルに使用するMIMEタイプをリストします(カンマ区切り)。MAFで自動的にMIMEタイプを決定するには、nullを指定します。この項の最後にある例に示すように、選択した添付ファイルのMIMEタイプのみを指定することもできます。

デバイスの電子メール・インタフェースが表示されると、ユーザーは電子メールを送信することも、それを取り消すこともできます。デバイスとキャリアの制限により、電子メールは自動的に送信できません。実際に電子メールを送信できるのは、ユーザーのみです。また、電子メールを送信するには、1つ以上の電子メール・アカウントを構成する必要があります。アカウントが構成されていない場合、電子メール・アカウントが見つからないことを示すエラーが表示されます。

注意:

sendEmailメソッドのタイムアウト値は5分に設定されます。デバイスの操作に、許可されたタイムアウトよりも長い時間がかかると、タイムアウト・エラーが表示されます。

注意:

Androidでは、ユーザーが電子メールの編集中にアプリケーションを切り替えて、その後戻すと、電子メールの編集画面は表示されなくなります。かわりに、そのメッセージは下書きとして保存され、手動で選択して編集を続けることができます。

DeviceFeaturesデータ・コントロールを使用してsendEmail操作をカスタマイズするには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからsendEmail操作をページ・デザイナ上にドラッグし、パラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスの電子メール・インタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに値が事前移入され、送信準備が整った電子メールが表示されます。

図15-16は、ページ上の編集可能なフォームを使用して電子メールを送信するためのバインディングを示しています。

図15-16 デザインタイムで編集可能なフォームを使用して電子メールを送信するためのバインディング

次に、ユーザーがデバイスの電子メール・インタフェースを使用して電子メール・メッセージを送信できるようにするコード例を示します。

sendEmailメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

次の例は、ユーザーが電子メール・メッセージを送信できるようにするJavaScriptコードを示しています。

// Populate an email to 'ann.li@example.com',
// copy 'joe.jones@example.com', with the
// subject 'Test message', and the body 'This is a test message'
// No BCC recipients or attachments
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});

// Populate the same email as before, but this time, also BCC
// 'john.smith@example.com' & 'jane.smith@example.com' and attach two files.
// By not specifying a value for the mimeTypes parameter, you are telling
// ADFMobile to automatically determine the MIME type for each of the attachments.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});

// For iOS only: Same as previous email, but this time, explicitly specify
// all the MIME types.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: "text/plain,image/png"});

// For iOS only: Same as previous email, but this time, only specify
// the MIME type for the second attachment and let the system determine
// the MIME type for the first one.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: ",image/png"});

// For Android only: Same as previous e-mail, but this time, explicitly specify
// the MIME type.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: "image/*"});
// You can also use "plain/text" as the MIME type as it just determines the type
// of applications to be filtered in the application chooser dialog.

次の例は、ユーザーが電子メール・メッセージを送信できるようにするJavaコードを示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Populate an email to 'ann.li@example.com', copy 'joe.jones@example.com', with the
// subject 'Test message', and the body 'This is a test message'.
// No BCC recipients or attachments.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
null,
null,
null);

// Populate the same email as before, but this time, also BCC
// 'john.smith@example.com' & 'jane.smith@example.com' and attach two files.
// By specifying null for the mimeTypes parameter, you are telling
// ADFMobile to automatically determine the MIME type for each of the attachments.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
null);

// Same as previous email, but this time, explicitly specify all the MIME types.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
"text/plain,image/png");

// Same as previous email, but this time, only specify the MIME type for the
// second attachment and let the system determine the MIME type for the first one.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
",image/png");

15.12.4 連絡先の作成を有効にするためのcreateContactメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるcreateContactメソッドをMAFアプリケーションで使用すると、連絡先を管理するためのデバイスのインタフェースとファイル・システムを利用して、ユーザーが新しい連絡先を作成してデバイスのアドレス帳に保存できるようになります。

MAFでは、デバイスのインタフェースを表示して、必要に応じてContactフィールドにデータを事前移入できます。この項の最後の例に示すように、createContactメソッドはContactオブジェクトをパラメータとして使用し、作成されたContactオブジェクトを戻します。

createContactメソッドおよびContactオブジェクトの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。Contactのプロパティについては、「連絡先の検索を有効にするためのfindContactsメソッドの使用方法」も参照してください。

注意:

createContactメソッドのタイムアウト値は、1分に設定されます。デバイスの操作に、許可されたタイムアウトよりも長い時間がかかると、タイムアウト・エラーが表示されます。

注意:

null Contactオブジェクトがメソッドに渡された場合、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してcreateContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからcreateContact操作をドラッグし、リンクまたはボタンとしてページ・デザイナ上にドロップします。

リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、createContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、Java BeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してcreateContact操作を実行できます。次のコード例は、Contactオブジェクトを作成するマネージドBeanコードの例を示しています。

2. 操作から戻されるオブジェクトのContactを、「データ・コントロール」パネルにあるcreateContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。createContact操作を実行すると、結果がこのフォームに表示されます。

private Contact contactToBeCreated;

public void setContactToBeCreated(Contact contactToBeCreated) {
this.contactToBeCreated = contactToBeCreated;
}

public Contact getContactToBeCreated() {
String givenName = "Mary";
String familyName = "Jones";
String note = "Just a Note";
String phoneNumberType = "mobile";
String phoneNumberValue = "650-555-0111";
String phoneNumberNewValue = "650-555-0199";
String emailType = "home";
String emailTypeNew = "work";
String emailValue = "Mary.Jones@example.com";
String addressType = "home";
String addressStreet = "500 Barnacle Pkwy";
String addressLocality = "Redwood Shores";
String addressCountry = "USA";
String addressPostalCode = "94065";
ContactField[] phoneNumbers = null;
ContactField[] emails = null;
ContactAddresses[] addresses = null;

/*
* Create contact
*/
this.contactToBeCreated = new Contact();

ContactName name = new ContactName();
name.setFamilyName(familyName);
name.setGivenName(givenName);
this.contactToBeCreated.setName(name);

ContactField phoneNumber = new ContactField();
phoneNumber.setType(phoneNumberType);
phoneNumber.setValue(phoneNumberValue);

phoneNumbers = new ContactField[] { phoneNumber };

ContactField email = new ContactField();
email.setType(emailType);
email.setValue(emailValue);

emails = new ContactField[] { email };

ContactAddresses address = new ContactAddresses();
address.setType(addressType);
address.setStreetAddress(addressStreet);
address.setLocality(addressLocality);
address.setCountry(addressCountry);

addresses = new ContactAddresses[] { address };

this.contactToBeCreated.setNote(note);
this.contactToBeCreated.setPhoneNumbers(phoneNumbers);
this.contactToBeCreated.setEmails(emails);
this.contactToBeCreated.setAddresses(addresses);

return this.contactToBeCreated;
}

次の例は、ユーザーがデバイスで連絡先を作成できるようにするコード例を示しています。

次の例は、createContactのJavaScriptコードを示しています。

// Contacts, like many other device-specific features,
// are accessed from the global 'navigator' object in JavaScript
var contact = navigator.contacts.create();

var name = new ContactName();
name.givenName = "Mary";
name.familyName = "Jones";

contact.name = name;

// Store contact phone numbers in ContactField[]
var phoneNumbers = [1];
phoneNumbers[0] = new ContactField('home', '650-555-0123', true);

contact.phoneNumbers = phoneNumbers;

// Store contact email addresses in ContactField[]
var emails = [1];
emails[0] = new ContactField('work', 'Mary.Jones@example.com');

contact.emails = emails;

// Save
contact.save(onSuccess, onFailure);

function onSuccess()
{
alert("Create Contact successful.");
}

function onFailure(Error)
{
alert("Create Contact failed: " + Error.code);
}

次の例は、createContactのJavaコードを示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

import oracle.adf.model.datacontrols.device.ContactAddresses;
import oracle.adf.model.datacontrols.device.ContactField;
import oracle.adf.model.datacontrols.device.ContactName;

String givenName = "Mary";
String familyName = "Jones";
String note = "Just a Note";
String phoneNumberType = "mobile";
String phoneNumberValue = "650-555-0111";
String phoneNumberNewValue = "650-555-0199";
String emailType = "home";
String emailTypeNew = "work";
String emailValue = "Mary.Jones@example.com";
String addressType = "home";
String addressStreet = "500 Barnacle Pkwy";
String addressLocality = "Redwood Shores";
String addressCountry = "USA";
String addressPostalCode = "91234";
ContactField[] phoneNumbers = null;
ContactField[] emails = null;
ContactAddresses[] addresses = null;
ContactField[] emails = null;

/*
* Create contact
*/
Contact aContact = new Contact();

ContactName name = new ContactName();
name.setFamilyName(familyName);
name.setGivenName(givenName);
aContact.setName(name);

ContactField phoneNumber = new ContactField();
phoneNumber.setType(phoneNumberType);
phoneNumber.setValue(phoneNumberValue);

phoneNumbers = new ContactField[] { phoneNumber };

ContactField email = new ContactField();
email.setType(emailType);
email.setValue(emailValue);

emails = new ContactField[] { email };

ContactAddresses address = new ContactAddresses();
address.setType(addressType);
address.setStreetAddress(addressStreet);
address.setLocality(addressLocality);
address.setCountry(addressCountry);

addresses = new ContactAddresses[] { address };

aContact.setNote(note);
aContact.setPhoneNumbers(phoneNumbers);
aContact.setEmails(emails);
aContact.setAddresses(addresses);

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Invoking the createContact method, using the DeviceDataControl object.
Contact createdContact = DeviceManagerFactory.getDeviceManager()
.findContacts.createContact(aContact);

15.12.5 連絡先の検索を有効にするためのfindContactsメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるfindContactsメソッドをMAFアプリケーションで使用すると、連絡先を管理するためのデバイスのインタフェースとファイル・システムを利用して、ユーザーがデバイスのアドレス帳から1つ以上の連絡先を検索できるようになります。

MAFでは、デバイスのインタフェースを表示して、必要に応じてfindContactsフィールドにデータを事前移入できます。findContactsメソッドでは、フィルタ文字列と検索する(そして、見つかったコンタクト先の一部として戻す)フィールド名のリストを使用します。フィルタ文字列には、コンタクト先内の検索する任意の項目を指定できます。findContactsメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。

findContacts操作では、次の引数を使用します。

- contactFields: 必須パラメータ。このパラメータは、findContacts操作によって生成されるContactオブジェクトに含めるフィールドを指定するために使用します。フィールドはカンマで区切ります(スペースの有無は関係ありません)。

- filter: コンタクト先をフィルタするために使用する検索文字列。(文字列) (デフォルト: "")

- multiple: findContacts操作から複数のコンタクト先を戻すかどうかを決定します。(ブール) (デフォルト: false)

注意:

次のリストに含まれていないフィールド名を渡すと、findContacts操作の戻り値がnullになる場合があります。また、Contactのフィールドの引数に指定したフィールドのみが、Contactオブジェクトの一部として戻されます。

次のリストに示すContactのプロパティを渡して、検索に使用し、見つかったコンタクト先の一部として戻すことができます。

- id: グローバルに一意な識別子

- displayName: エンド・ユーザーへの表示に適した、このコンタクト先の名前

- name: 人物名のすべてのコンポーネントを含むオブジェクト

- nickname: コンタクト先のカジュアルな名前。このフィールドをnullに設定すると、空の文字列として保存されます。

- phoneNumbers: コンタクト先のすべての電話番号の配列

- emails: コンタクト先のすべての電子メール・アドレスの配列

- addresses: コンタクト先のすべての住所の配列

- ims: コンタクト先のすべてのインスタント・メッセージング(IM)・アドレスの配列(imsプロパティは、このリリースではサポートされていません。)

注意:

このリリースでは、MAFはContactプロパティのimsをサポートしていません。imsプロパティのあるコンタクト先を作成する場合、MAFはimsプロパティなしでコンタクト先を保存します。その結果、ユーザーがimsに基づいて検索を実行しようとすると、コンタクト先を検索できなくなります。また、ユーザーが「検索」フィールドにimsを入力しようとすると、imsはnullとして戻されます。

- organizations: コンタクト先のすべての組織の配列

- birthday: コンタクト先の誕生日。プログラムで連絡先の誕生日フィールドを設定することや、アドレス帳に連絡先を永続化することはできませんが、オペレーティング・システムのアドレス帳アプリケーションを使用してこのフィールドを手動で設定できます。

- note: コンタクト先に関するメモ。このフィールドをnullに設定すると、空の文字列として保存されます。

- photos: コンタクト先の写真の配列

- categories: コンタクト先のすべてのユーザー定義カテゴリの配列。

- urls: コンタクト先に関連付けられたWebページの配列

注意:

findContactsメソッドのタイムアウト値は、1分に設定されます。デバイスの操作に、許可されたタイムアウトよりも長い時間がかかると、タイムアウト・エラーが表示されます。

DeviceFeaturesデータ・コントロールを使用してfindContacts操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからfindContacts操作をドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、findContacts操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してfindContacts操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが前述のContactの様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してfindContacts操作を実行できます。

2. 操作から戻されるオブジェクトのContactを、「データ・コントロール」パネルにあるfindContacts操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。findContacts操作を実行すると、結果がこのフォームに表示されます。

次の例は、findContactsメソッドに指定できる引数値を示しています。

// This will return just one contact with only the ID field:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("", "", false);

// This will return all contacts with only ID fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("", "", true);

// This will return just one contact with all fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("*", "", false);

// This will return all contacts with all fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("*", "", true);

// These will throw an exception as contactFields is a required argument and cannot be null:
DeviceManagerFactory.getDeviceManager().findContacts(null, "", false);
DeviceManagerFactory.getDeviceManager().findContacts(null, "", true);

// These will throw an exception as the filter argument cannot be null:
DeviceManagerFactory.getDeviceManager().findContacts("", null, false);
DeviceManagerFactory.getDeviceManager().findContacts("", null, true);

注意:

渡されるContactのフィールドは、文字列(カンマで区切られたフィールドを含む)です。いずれかの引数がnullとしてメソッドに渡された場合、例外がスローされます。

次のJavaScript例は、姓でコンタクト先を検索し、コンタクト先の名前、電話番号、電子メール、住所およびメモを取得する方法を示しています。

var filter = ["name", "phoneNumbers", "emails", "addresses", "note"];

var options = new ContactFindOptions();
options.filter="FamilyName";

// Contacts, like many other device-specific features, are accessed from
// the global 'navigator' object in JavaScript.
navigator.contacts.find(filter, onSuccess, onFail, options);

function onSuccess(contacts)
{
alert ("Find Contact call succeeded! Number of contacts found = " + contacts.length);
}

function onFail(Error)
{
alert("Find Contact failed: " + Error.code);
}

次のJava例は、姓でコンタクト先を検索し、コンタクト先の名前、電話番号、電子メール、住所およびメモを取得する方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Find Contact - Find contact by family name.
*
* See if we can find the contact that we just created.
*/

String familyName = "FamilyName"

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses,note", familyName, true);

15.12.6 連絡先の更新を有効にするためのupdateContactメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるupdateContactメソッドをMAFアプリケーションで使用すると、連絡先を管理するためのデバイスのインタフェースとファイル・システムを利用して、ユーザーがデバイスのアドレス帳に含まれる連絡先を更新できるようになります。

MAFでは、デバイスのインタフェースを表示して、必要に応じてupdateContactフィールドにデータを事前移入できます。この項の最後の例に示すように、updateContactメソッドはContactオブジェクトをパラメータとして使用し、更新されたupdateContactオブジェクトを戻します。

updateContactメソッドおよびContactオブジェクトの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。Contactのプロパティについては、「連絡先の検索を有効にするためのfindContactsメソッドの使用方法」も参照してください。

注意:

入力パラメータとして必要なContactオブジェクトは、「連絡先の検索を有効にするためのfindContactsメソッドの使用方法」の説明に従って、findContactsメソッドを使用することによって検索できます。nullのContactオブジェクトがメソッドに渡された場合、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してupdateContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからupdateContact操作をドラッグし、リンクまたはボタンとしてページ・デザイナ上にドロップします。

リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、updateContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、Java BeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してupdateContact操作を実行できます。「連絡先の作成を有効にするためのcreateContactメソッドの使用方法」に、Contactオブジェクトを作成するマネージドBeanコードの例を示しています。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるupdateContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。updateContact操作を実行すると、結果がこのフォームに表示されます。

次の例は、コンタクト先の電話番号を更新および追加する方法を示しています。

次のJavaScript例は、updateContactの使用方法を示しています。

function updateContact(contact)
{
try
{
if (null != contact.phoneNumbers)
{
alert("Number of phone numbers = " + contact.phoneNumbers.length);
var numPhoneNumbers = contact.phoneNumbers.length;
for (var j = 0; j < numPhoneNumbers; j++)
{
alert("Type: " + contact.phoneNumbers[j].type + "\n" +
"Value: "  + contact.phoneNumbers[j].value + "\n" +
"Preferred: "  + contact.phoneNumbers[j].pref);

contact.phoneNumbers[j].type = "mobile";
contact.phoneNumbers[j].value = "408-555-0100";
}

// save
contact.save(onSuccess, onFailure);
}
else
{
//alert ("No phone numbers found in the contact.");
}
}
catch(e)
{
alert("updateContact - ERROR: " + e.description);
}
}

function onSuccess()
{
alert("Update Contact successful.");
}

function onFailure(Error)
{
alert("Update Contact failed: " + Error.code);
}

次のJavaScript例は、updateContactを使用して既存の電話番号に電話番号を追加する方法を示しています。

function updateContact(contact)
{
try
{
var phoneNumbers = [1];
phoneNumbers[0] = new ContactField('home', '650-555-0123', true);
contact.phoneNumbers = phoneNumbers;

// save
contact.save(onSuccess, onFailure);
}
catch(e)
{
alert("updateContact - ERROR: " + e.description);
}
}

function onSuccess()
{
alert("Update Contact successful.");
}

function onFailure(Error)
{
alert("Update Contact failed: " + Error.code);
}

次のJavaコード例は、updateContactを使用してコンタクト先の電話番号、電子メール・タイプおよび郵便番号を更新する方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Update Contact - Updating phone number, email type, and adding address postal code
*/
String familyName = "FamilyName";
String phoneNumberNewValue = "650-555-0123";
String emailTypeNew = "work";
String addressPostalCode = "91234";

Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses,note", familyName, true);

// Assuming there was only one contact returned, we can use the first contact in the array.
// If more than one contact is returned then we have to filter more to find the exact contact
// we need to update.

foundContacts[0].getPhoneNumbers()[0].setValue(phoneNumberNewValue);
foundContacts[0].getEmails()[0].setType(emailTypeNew);
foundContacts[0].getAddresses()[0].setPostalCode(addressPostalCode);

Contact updatedContact = DeviceManagerFactory.getDeviceManager().updateContact(foundContacts[0]);

次のJava例は、updateContactを使用して既存の電話番号に電話番号を追加する方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

String additionalPhoneNumberValue = "408-555-0123";
String additionalPhoneNumberType = "mobile";
// Create a new phoneNumber that will be appended to the previous one.
ContactField additionalPhoneNumber = new ContactField();
additionalPhoneNumber.setType(additionalPhoneNumberType);
additionalPhoneNumber.setValue(additionalPhoneNumberValue);

foundContacts[0].setPhoneNumbers(new ContactField[] { additionalPhoneNumber });

// Access device features in Java code by acquiring an instance of the DeviceManager
// from the DeviceManagerFactory.
Contact updatedContact = DeviceManagerFactory.getDeviceManager().updateContact(foundContacts[0]);

注意:

updateContactメソッドのタイムアウト値は、1分に設定されます。デバイスの操作に、許可されたタイムアウトよりも長い時間がかかると、タイムアウト・エラーが表示されます。

15.12.7 連絡先の削除を有効にするためのremoveContactメソッドの使用方法

DeviceFeaturesデータ・コントロールには、findContactsを使用して検索した連絡先をデバイスのアドレス帳から削除するためのremoveContactメソッドがあります。removeContact操作をカスタマイズする手順を使用してください。

DeviceFeaturesデータ・コントロールに含まれるremoveContactメソッドをMAFアプリケーションで使用すると、連絡先を管理するためのデバイスのインタフェースとファイル・システムを利用して、ユーザーがデバイスのアドレス帳から連絡先を削除できるようになります。MAFでは、デバイスのインタフェースを表示して、必要に応じてremoveContactフィールドにデータを事前移入できます。この項の最後の例に示すように、removeContactメソッドはContactオブジェクトをパラメータとして使用します。

注意:

入力パラメータとして必要なContactオブジェクトは、「連絡先の検索を有効にするためのfindContactsメソッドの使用方法」の説明に従って、findContactsメソッドを使用することによって検索できます。

DeviceFeaturesデータ・コントロールを使用してremoveContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからremoveContact操作をドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。

リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、removeContact操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してremoveContact操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なContactのフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してremoveContact操作を実行できます。

2. 操作から戻されるオブジェクトのContactを、「データ・コントロール」パネルにあるremoveContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。removeContact操作を実行すると、結果がこのフォームに表示されます。

この項の最後にある例は、findContactsを使用して見つかったコンタクト先を削除する方法を示しています。removeContactメソッドとContactオブジェクトについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/)を参照してください。

注意:

Androidでは、removeContact操作を実行しても完全にはコンタクト先が削除されません。removeContactメソッドをコールしてコンタクト先を削除すると、「(不明)」の付いた名前がアプリケーション内のコンタクト先リストに表示されます。

次のJavaScriptコード例は、removeContactの使用方法を示しています。

// Remove the contact from the device
contact.remove(onSuccess,onError);

function onSuccess()
{
alert("Removal Success");
}

function onError(contactError)'
{
alert("Error = " + contactError.code);
}

次のJavaコード例は、removeContactの使用方法を示しています。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Remove the contact from the device
*/
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses", familyName, true);

// Assuming there is only one contact returned, we can use the first contact in the array.
// If more than one contact is returned we will have to filter more to find the
// exact contact we want to remove.

// Access device features in Java code by acquiring an instance of the DeviceManager
// from the DeviceManagerFactory.
DeviceManagerFactory.getDeviceManager().removeContact(foundContacts[0]);

注意:

removeContactメソッドのタイムアウト値は、1分に設定されます。デバイスの操作に、許可されたタイムアウトよりも長い時間がかかると、タイムアウト・エラーが表示されます。

15.12.8 地理的位置を有効にするためのstartLocationMonitorメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるstartLocationMonitorメソッドをMAFアプリケーションで使用すると、デバイスの地理的位置情報サービスを使用して、デバイスの位置を取得および追跡できます。

MAFでは、デバイスのインタフェースを表示して、必要に応じてstartLocationMonitorフィールドにデータを事前移入できます。MAFで公開されているAPIを使用すると、デバイスの現在位置を取得できるため、特定の時点におけるデバイスの現在位置を取得したり、定期的にその情報をサブスクライブできます。この項の最後にある例は、地理的位置情報を使用してデバイスの位置変化をサブスクライブする方法と、デバイスの位置を取得する方法を示しています。startLocationMonitorメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。

注意:

altitudeAccuracyプロパティは、Androidデバイスではサポートされていません。

Androidプラットフォームでは、iOSほど頻繁に更新が行われません。

DeviceFeaturesデータ・コントロールを使用してデバイスの位置変化をリスニングするには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからstartLocationMonitor操作をページ・デザイナ上にドラッグし、リンクまたはボタンとしてドロップします。「アクションの編集」ダイアログで入力を要求されたら、次のリストを参照するか、Oracle Mobile Application Framework Java APIリファレンスでDeviceDataControlクラスのstartLocationMonitorメソッドに関する項を参照して、その操作がサポートするパラメータの値をフィールドに入力します。

- enableHighAccuracy: trueの場合、位置を最も正確に取得できる方法を使用します。これは単なるヒントであり、オペレーティング・システムでは考慮されない場合があります。多くの場合、デバイスには、携帯電話基地局の三角測量、Wi-Fiホットスポットの参照、実際のGPSなど、位置の修正を取得するためのいくつかの異なるメカニズムがあります。falseを指定すると、正確性の低い位置を受け入れることになりますが、この場合、レスポンスの速度が向上し、消費電力が低下する可能性があります。

- updateInterval: 更新の受信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムは、デバイスの位置の大きな変化が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。

- locationListener: 次のシグネチャを含むBeanメソッドに解決されるEL式。

void methodName(Location newLocation)

このEL式は、位置の更新を受信するたびに評価されます。たとえば、viewScope.LocationListenerBean.locationUpdated(#{}で囲みません)と入力した後、LocationListenerBeanというBeanをviewScope内に定義し、次のシグネチャを含むメソッドを実装します。

public void locationUpdated(Location currentLocation) {
System.out.println(currentLocation);
// To stop subscribing to location updates, invoke the following:
// DeviceManagerFactory.getDeviceManager().clearWatchPosition(
//     currentLocation.getWatchId());
}

注意:

EL式の評価結果としてlocationListenerの名前が必要でないかぎり、locationListenerを指定するためにEL構文#{LocationListenerBean.locationUpdate}を使用しないでください。

この項の最後にある例は、DeviceManager.startUpdatingPositionメソッドを使用してデバイスの位置変化をサブスクライブする方法を示しています。

JavaScriptを使用してデバイスの位置変化をサブスクライブする方法の例は、Cordovaのドキュメント(http://cordova.apache.org/)を参照してください。

locationListenerによって指定されたコールバック関数内に戻されるパラメータは、次のとおりです。

- double getAccuracy: m単位の緯度と経度を示す座標の精度レベル。

- double getAltitude: m単位の楕円体高度。

- double getLatitude: 10進度単位の緯度。

- double getLongitude: 10進度単位の経度。

- double getAltitudeAccuracy: m単位の高度座標の精度レベル。

- double getHeading: 真北から時計回りに計測した度単位で示される進行方向

- double getSpeed: m/秒単位で指定される、デバイスの現在の対地速度

- long getTimestamp: Unixエポックからのミリ秒単位の経過時間で示されるタイムスタンプの作成

- String getWatchId: 定期的な位置の更新をサブスクライブするときのみ使用します。後から位置の更新のサブスクライブを停止するために使用できる一意のID

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;
import oracle.adf.model.datacontrols.device.GeolocationCallback;
import oracle.adf.model.datacontrols.device.Location;

// Subscribe to location updates that will be delivered every 20 seconds, with high accuracy.
// As you can have multiple subscribers, let's identify this one as 'MyGPSSubscriptionID'.
// Notice that this call returns the watchID, which is usually the same as the watchID passed in.
// However, it may be different if the specified watchID conflicts with an existing watchID,
// so be sure to always use the returned watchID.
String watchID = DeviceManagerFactory.getDeviceManager().startUpdatingPosition(20000, true, "
"MyGPSSubscriptionID", new GeolocationCallback() {
public void locationUpdated(Location position) {
System.out.println("Location updated to: " + position);
}
});

// The previous call returns immediately so that you can continue processing.
// When the device's location changes, the locationUpdated() method specified in
// the previous call will be invoked in the context of the current feature.

// When you wish to stop being notified of location changes, call the following method:
DeviceManagerFactory().getDeviceManager().clearWatchPosition(watchID);

startLocationMonitorおよびstartHeadingMonitorメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。

次の例は、DeviceManager.getCurrentPositionを使用してデバイスの現在位置を(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());

15.12.9 ファイルの表示を有効にするためのdisplayFileメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるdisplayFileメソッドを使用すると、デバイスのローカル・ファイルを表示できます。

プラットフォームに応じて、アプリケーション・ユーザーはPDF、イメージ・ファイル、Microsoft Officeドキュメントおよびその他の様々なファイル・タイプを表示できます。iOSでは、アプリケーション・ユーザーは、サポートされているファイルをMAFアプリケーション内でプレビューできます。またユーザーは、それらのファイルをサードパーティ・アプリケーションで開く、電子メールで送信する、プリンタに送信するなどの操作を行うこともできます。Androidでは、すべてのファイルがサードパーティ・アプリケーション内で開かれます。つまり、アプリケーション・ユーザーは、ファイルを表示しながらMAFアプリケーションから離れることができます。ユーザーは、Androidの戻るボタンを押すことによって、MAFアプリケーションに戻ることができます。所定のファイルを開くことができるアプリケーションがデバイス内に存在しない場合は、エラーが表示されます。displayFileメソッドがiOSデバイスとAndroidデバイスの両方でファイルを開く例の詳細は、DeviceDemoサンプル・アプリケーションを参照してください。このアプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内で次の場所にあるPublicSamples.zipファイルから入手できます。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

displayFileメソッドの機能は、デバイスのローカル・ファイルを表示することのみです。つまり、リモート・ファイルは最初にダウンロードする必要があります。ダウンロードしたファイルを保存する必要のあるディレクトリ・ルートに戻るには、コールAdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory)を使用します。iOSでは、この場所はアプリケーションによって異なりますが、Androidでは、この場所として外部ストレージ・ディレクトリが参照されます。この外部ストレージ・ディレクトリは公的にアクセス可能であるため、サードパーティ・アプリケーションを使用して、そこに格納されているファイルを読み取ることができます。

表15-7 サポートされるファイル・タイプ

iOS

Android

サポートされるファイル・タイプの詳細は、Apple iOS開発サイト(http://developer.apple.com/library/ios/navigation/)にある、Quick Lookプレビュー・コントローラに関するドキュメントを参照してください。

特定のMIMEタイプがデバイスにインストールされている場合、このMAFによって、そのタイプに関連付けられたビューアが起動されます。特定のファイル・タイプを表示するためのフレームワークは組み込まれていません。そのファイル・タイプを開くことができるアプリケーションがデバイスにインストールされていない場合は、MAFアプリケーションによってエラーが表示されます。

iWorkドキュメント

Microsoft Officeドキュメント(Office 97以降)

リッチ・テキスト・フォーマット(RTF)ドキュメント

PDFファイル

イメージ

Uniform Type Identifier (UTI)がpublic.text typeに準拠しているテキスト・ファイル

カンマ区切り(csv)ファイル

DeviceFeaturesデータ・コントロールを使用してdisplayFile操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからdisplayFile操作をドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。

リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、displayFile操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してdisplayFile操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してdisplayFile操作を実行できます。

次の例は、displayFileメソッドを使用してファイルを表示する方法を示しています。displayFileメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

URL remoteFileUrl;
InputStream is;
BufferedOutputStream fos;
try {

// Open connection to remote file; fileUrl here is a String containing the URL to the remote file.
remoteFileUrl = new URL(fileUrl);
URLConnection connection = remoteFileUrl.openConnection();
is = new BufferedInputStream(connection.getInputStream());
// Saving the file locally as 'previewTempFile.<extension>'
String fileExt = fileUrl.substring(fileUrl.lastIndexOf('.'), fileUrl.length());
String tempFile = "/previewTempFile" + fileExt;
File localFile = null;
// Save the file in the DownloadDirectory location
localFile = new File(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory) + tempFile);
if (localFile.exists()) {
localFile.delete();
}
// Use buffered streams to download the file.
fos = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] data = new byte[1024];
int read = 0;
while ((read = is.read(data)) != -1) {
fos.write(data, 0, read);
}
is.close();
fos.close();

// displayFile takes a URL string which has to be encoded on iOS.
// iOS does not handle "+" as an encoding for space (" ") but
// expects "%20" instead.  Also, the leading slash MUST NOT be
// encoded to "%2F".  We will revert it to a slash after the
// URLEncoder converts it to "%2F".
StringBuffer buffer = new StringBuffer();
String path = URLEncoder.encode(localFile.getPath(), "UTF-8");
// replace "+" with "%20"
String replacedString = "+";
String replacement = "%20";
int index = 0, previousIndex = 0;
index = path.indexOf(replacedString, index);
while (index != -1) {
buffer.append(path.substring(previousIndex, index)).append(replacement);
previousIndex = index + 1;
index = path.indexOf(replacedString, index + replacedString.length());
}
buffer.append(path.substring(previousIndex, path.length()));
// Revert the leading encoded slash ("%2F") to a literal slash ("/").
if (buffer.indexOf("%2F") == 0) {
buffer.replace(0, 3, "/");
}

// Create URL and invoke displayFile with its String representation.
URL localURL = null;
if (Utility.getOSFamily() == Utility.OSFAMILY_ANDROID) {
localURL = new URL("file", "localhost", localFile.getAbsolutePath());
}
else if (Utility.getOSFamily() == Utility.OSFAMILY_IOS)
{
localURL = new URL("file", "localhost", buffer.toString());
}
DeviceManagerFactory.getDeviceManager().displayFile(localURL.toString(), "remote file");
} catch (Throwable t) {
System.out.println("Exception caught: " + t.toString());
}

15.12.10 addLocalNotificationメソッドとcancelLocalNotificationメソッドを使用してローカル通知を管理する方法

DeviceFeaturesデータ・コントロールに含まれるaddLocalNotificationメソッドとcancelLocalNotificationメソッドをMAFアプリケーションで使用すると、通知を管理するためのデバイスのインタフェースを利用できるようになり、ユーザーはローカル通知のスケジュールまたは取消しができるようになります。

DeviceFeaturesデータ・コントロールを使用してaddLocalNotificationまたはcancelLocalNotification操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからaddLocalNotificationまたはcancelLocalNotification操作をドラッグし、ボタン、リンク、リスト・アイテムまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。

ボタン、リンクまたはリスト・アイテム: 「アクション・バインディングの編集」ダイアログが表示され、addLocalNotificationまたはcancelLocalNotification操作の引数の値を入力するよう求められます。このダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。実行時にページに表示されるボタン、リンクまたはリスト・アイテムをクリックすると、入力した値を使用してaddLocalNotificationまたはcancelLocalNotification操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。このダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。実行時に、アプリケーション・ユーザーが様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してaddLocalNotificationまたはcancelLocalNotification操作を実行できます。

図15-17は、選択した操作のパラメータを構成するために使用する「アクション・バインディングの編集」ダイアログを示しています。この例では、cancelLocalNotification操作のnotificationIDがaddLocalNotification操作の結果にバインドされます。

図15-17 ローカル通知のスケジュール用のバインドの設定

図15-18に、式ビルダーを使用してaddLocalNotification操作の結果をcancelLocalNotification操作にバインドする方法を示します。

図15-18 addLocalNotificationの結果へのcancelLocalNotificationのバインド

addLocalNotificationおよびcancelLocalNotificationメソッドの詳細は、Oracle Mobile Application Framework Java APIリファレンスのDeviceDataControlクラスに関する項を参照してください。「ローカル通知の管理」を参照してください。「通知の概要」も参照してください。

15.12.11 デバイス・プロパティに関する必知事項

MAFには、アプリケーションでの動的な動作をサポートするために、Java、JavaScriptおよびELからアクセスできるプロパティがあります。プロパティのリストを確認して、問合せ方法、予期される戻り値およびアプリケーション・ライフサイクル期間のプロパティの変化について理解してください。

アプリケーションには、特定のデバイスの特性や機能に依存する機能が含まれる場合があります。たとえば、デバイスの画面の向きによって異なるユーザー・インタフェースを提示したり、デバイスで地理的位置情報がサポートされる場合のみマッピング機能を有効にすることなどが考えられます。MAFでは、このような動的な動作をサポートするために、Java、JavaScriptおよびELからアクセスできる様々なプロパティが用意されています。表15-8に、これらのプロパティをリストし、問合せ方法、予期される戻り値およびアプリケーションのライフサイクル期間にそのプロパティが変化する可能性があるかどうかに関する情報も提供します。この項の最後にある例は、JavaScriptを使用してこれらのプロパティにアクセスする方法を示しています。

注意:

デバイス・プロパティのタイムアウト値は、1分に設定されます。デバイスの操作に、許可されたタイムアウトよりも長い時間がかかると、タイムアウト・エラーが表示されます。

表15-8 デバイス・プロパティと対応するEL式

プロパティ

静的/動的

EL式

サンプル値

Java API

device.name

静的

#{deviceScope.device.name}

"iPhone Simulator"、"Joe Smith's iPhone"

DeviceManager.getName()

device.platform

静的

#{deviceScope.device.platform}

"iPhone Simulator"、"iPhone"

DeviceManager.getPlatform()

device.version

静的

#{deviceScope.device.version}

"4.3.2"、"5.0.1"

DeviceManager.getVersion()

device.os

静的

#{deviceScope.device.os}

"iOS"

DeviceManager.getOs()

device.model

静的

#{deviceScope.device.model}

"x86_64"、"i386"、"iPhone3,1"

DeviceManager.getModel()

device.phonegap

静的

#{deviceScope.device.phonegap}

"1.0.0"

DeviceManager.getPhonegap()

hardware.hasCamera

静的

#{deviceScope.hardware.hasCamera}

"true"、"false"

DeviceManager.hasCamera()

hardware.hasContacts

静的

#{deviceScope.hardware.hasContacts}

"true"、"false"

DeviceManager.hasContacts()

hardware.hasTouchScreen

静的

#{deviceScope.hardware.hasTouchScreen}

"true"、"false"

DeviceManager.hasTouchScreen()

hardware.hasGeolocation

静的

#{deviceScope.hardware.hasGeolocation}

"true"、"false"

DeviceManager.hasGeolocation()

hardware.hasAccelerometer

静的

#{deviceScope.hardware.hasAccelerometer}

"true"、"false"

DeviceManager.hasAccelerometer()

hardware.hasCompass

静的

#{deviceScope.hardware.hasCompass}

"true"、"false"

DeviceManager.hasCompass()

hardware.hasFileAccess

静的

#{deviceScope.hardware.hasFileAccess}

"true"、"false"

DeviceManager.hasFileAccess()

hardware.hasLocalStorage

静的

#{deviceScope.hardware.hasLocalStorage}

"true"、"false"

DeviceManager.hasLocalStorage()

hardware.hasMediaPlayer

静的

#{deviceScope.hardware.hasMediaPlayer}

"true"、"false"

DeviceManager.hasMediaPlayer()

hardware.hasMediaRecorder

静的

#{deviceScope.hardware.hasMediaRecorder}

"true"、"false"

DeviceManager.hasMediaRecorder()

hardware.networkStatus

動的

#{deviceScope.hardware.networkStatus}

"wifi"、"2g"、"unknown"、"none"脚注 2

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()

脚注2

wifiおよび2Gの両方が有効になっている場合、wifiが2Gよりも優先されるため、ネットワーク・ステータスはwifiになります。

次の例は、JavaScriptを使用してデバイス・プロパティにアクセスする方法を示しています。

<!DOCTYPE html>
<html>
<head>
<title>Device Properties Example</title>

<script type="text/javascript" charset="utf-8" src="cordova-2.2.0.js"></script>
<script type="text/javascript" charset="utf-8">

// Wait for Cordova to load
//
//document.addEventListener("deviceready", onDeviceReady, false);
document.addEventListener("showpagecomplete",onDeviceReady,false);

// Cordova is ready
//
function onDeviceReady() {
adf.mf.api.getDeviceProperties(properties_success, properties_fail);
}

function properties_success(response) {
try {
var element = document.getElementById('deviceProperties');
var device = response.device;
var hardware = response.hardware;
element.innerHTML = 'Device Name:              ' + device.name            + '<br />' +
'Device Platform:          ' + device.platform        + '<br />' +
'Device Version:           ' + device.version         + '<br />' +
'Device OS:                ' + device.os              + '<br />' +
'Device Model:             ' + device.model           + '<br />' +
'Hardware Screen Width:    ' + hardware.screen.width  + '<br />' +
'Hardware Screen Height:   ' + hardware.screen.height + '<br />' +
} catch (e) {alert("Exception: " + e);}
}

function properties_fail(error) {
alert("getDeviceProperties failed");
}

</script>
</head>
<body>
<p id="deviceProperties">Loading device properties...</p>
</body>
</html>

注意:

JavaScript関数をshowpagecompleteイベントに宣言的にバインドするには、次の例のように、amx:clientListenerタグを<amx:view>の直接の子として追加します。

<amx:clientListener type="showpagecomplete" method="myShowPageCompleteHandler"/>

クライアント・リスナー(clientListener)コンポーネントの詳細は、「クライアント・リスナーの使用方法」を参照してください。

15.13 属性の検証

MAFでは、検証ルールがバインディング属性に設定され、データ・コントロール・レイヤーで検証が行われます。データ・コントロールによって公開される属性に対するバリデータと、属性の検証メッセージの両方を構成できます。

モバイル・アプリケーション・フレームワークでは、バインディング属性で検証ルールが設定された状態で、データ・コントロール・レイヤーで検証が実行されます。属性の検証は、バインディングに対するsetValue操作中に、システム内の単一点で実行されます。

データ・コントロールによって公開される属性に対して、次のバリデータを定義できます。

- 比較バリデータ

- 長さバリデータ

- リスト・バリデータ

- 範囲バリデータ

特定の属性に対してすべてのバリデータが実行され、成功しないすべてのバリデータに対してネストされた例外がスローされます。属性の検証メッセージを定義し、実行時に検証ルールを起動するときに表示できます。「入力の検証」および「検証ルールの追加方法」を参照してください。

注意:

JSONの制限により、BigDecimalが保持できる値はDoubleの範囲内となり、BigIntegerが保持できる値はLongの範囲内となります。許可された値よりも大きい数値を使用するには、toStringをBigDecimalまたはBigIntegerでコールし、値をStringとしてシリアライズ(解除)します。

表15-9に、長さバリデータでサポートされる検証の組合せをリストします。

表15-9 長さ検証

比較タイプ

バイト

文字

Equals

サポート

サポート

Not Equals

サポート

サポート

Less Than

サポート

サポート

Greater Than

サポート

サポート

次以下

サポート

サポート

次以上

サポート

サポート

Between

サポート

サポート

表15-10と表15-11に、範囲バリデータでサポートされる検証の組合せを示します。

表15-10 範囲検証

比較タイプ

バイト

文字

倍精度

浮動小数

整数

長整数

短整数

Between

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Not Between

サポート

サポート

サポート

サポート

サポート

サポート

サポート

表15-11 範囲検証: math、sqlおよびutilパッケージ

比較タイプ

java.math.BigDecimal

java.math.BigInteger

java.sql.Date

java.sql.Time

java.sql.Timestamp

java.util.Date

Between

サポート

サポート

サポートなし

サポートなし

サポートなし

サポートなし

Not Between

サポート

サポート

サポートなし

サポートなし

サポートなし

サポートなし

表15-12に、リスト・バリデータでサポートされる検証の組合せをリストします。

表15-12 リスト検証

比較タイプ

文字列

In

サポート

Not In

サポート

表15-13と表15-14に、比較バリデータでサポートされる検証の組合せを示します。

表15-13 比較検証

比較タイプ

バイト

文字

倍精度

浮動小数

整数

長整数

短整数

文字列

Equals

サポート

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Not Equals

サポート

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Less Than

サポートなし

サポート

サポート

サポート

サポート

サポート

サポート

サポートなし

Greater Than

サポートなし

サポート

サポート

サポート

サポート

サポート

サポート

サポートなし

次以下

サポートなし

サポート

サポート

サポート

サポート

サポート

サポート

サポートなし

次以上

サポートなし

サポート

サポート

サポート

サポート

サポート

サポート

サポートなし

表15-14 比較検証: java.math、java.sqlおよびjava.utilパッケージ

比較タイプ

java.math.BigDecimal

java.math.BigInteger

java.sql.Date

java.sql.Time

java.sql.Timestamp

java.util.Date

Equals

サポート

サポート

サポートなし

サポートなし

サポートなし

サポートなし

Not Equals

サポート

サポート

サポートなし

サポートなし

サポートなし

サポートなし

Less Than

サポート

サポート

サポートなし

サポートなし

サポートなし

サポートなし

Greater Than

サポート

サポート

サポートなし

サポートなし

サポートなし

サポートなし

次以下

サポート

サポート

サポートなし

サポートなし

サポートなし

サポートなし

次以上

サポート

サポート

サポートなし

サポートなし

サポートなし

サポートなし

15.13.1 検証ルールの追加方法

MAFのユーザーは、検証ルールを定義できます。データ・コントロール構造ファイルの概要エディタにある「属性」ページを使用して、データ・コントロール・オブジェクトに検証ルールを追加する手順を使用してください。

検証ルールは、様々なユース・ケースに合わせて定義できます。宣言的検証ルールをエンティティ・オブジェクトに追加するには、データ・コントロール構造ファイルの「概要」エディタにある「属性」ページを使用します。

検証規則を追加するには:

1. 「データ・コントロール」パネルで、データ・コントロール・オブジェクトを右クリックして、「定義の編集」を選択します。

2. データ・コントロール構造ファイルの「概要」エディタで、「属性」ページを選択します。

3. ページの下部にある「検証ルール」タブを選択し、「追加」をクリックします。表示された「検証ルールの追加」ダイアログで、検証ルールと失敗処理を定義します。

15.13.2 バリデータのメタデータに関する必知事項

データ・コントロール構造のメタデータXMLファイルには、バリデータのメタデータが格納されています。

バリデータのメタデータは、設計時にデータ・コントロール構造のメタデータXMLファイル内に配置されます。次の例は、サンプルの長さバリデータを示しています。

<?xml version="1.0" encoding="windows-1252" ?>
<!DOCTYPE PDefViewObject SYSTEM "jbo_03_01.dtd">
<PDefViewObject
xmlns="http://xmlns.oracle.com/bc4j"
Name="Product"
Version="12.1.1.61.36"
xmlns:validation="http://xmlns.oracle.com/adfm/validation">
<DesignTime>
<Attr Name="_DCName" Value="DataControls.ProductListBean"/>
<Attr Name="_SDName" Value="mobile.Product"/>
</DesignTime>
<PDefAttribute
Name="name">
<validation:LengthValidationBean
Name="nameRule0"
OnAttribute="name"
CompareType="GREATERTHAN"
DataType="BYTE"
CompareLength="5"
Inverse="false"/>
</PDefAttribute>
</PDefViewObject>

15.14 バックグラウンド・スレッドの使用方法

バックグラウンドのJavaスレッドを使用してデータ・モデルの値を更新できますが、更新がユーザー・インタフェースと正しく同期されるように注意する必要があります。

バックグラウンド・スレッドは、データをフェッチする場合(たとえば、リモート・サーバーから)、または複雑なアルゴリズムで値を計算する場合に役立ちます。バックグラウンド・スレッドを使用してフェッチやデータ値は計算できますが、アプリケーションのユーザー・インタフェース・スレッドと競合する可能性があるため、直接それを使用してアプリケーションのデータ・モデル・オブジェクトを更新しないでください。

バックグラウンド・スレッドからモデル・オブジェクトを更新するには、MafExecutorService APIを使用して、モデルの更新を実行するJavaのRunnableを発行します。まず、新規または更新されたモデルの値(フェッチ済または計算済)を取得して、次の例に示すようにRunnableを発行してアプリケーションのデータ・モデル・オブジェクトの値を更新します。

//  First, fetch/compute new data values.
fetchUpdatedValues();

//  Next, use a Runnable to update the model objects.
MafExecutorService.execute(new Runnable()
{
public void run()
{
doModelUpdates();
AdfmfJavaUtilities.flushDataChangeEvent();
}
});

注意:
アプリケーションが無応答にならないよう、発行されるタスクは短時間のものにする必要があります。タスクを実行する前に機能がロックされる可能性があり、このロックはタスクが完了するまでは解放されません。

oracle.adfmf.framework.api.MafExecutorService.executeクラスの詳細はOracle Mobile Application Framework Java APIリファレンスを参照してください。

15.15 データ変更イベントの使用

JDeveloperでは、データ変更イベントを単純化するために、プロパティ変更リスナー・パターンを使用します。多くの場合、JDeveloperを使用して、Beanのプロパティ・アクセサからの通知を参照するために必要なソース・コードを生成できます。これを行うには、「アクセサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェックボックスを選択します

PropertyChangeSupportオブジェクトが自動的に生成され、新たに生成されたsetterメソッドにfirePropertyChangeへのコールが含まれます。また、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドが追加されるため、プロパティ変更リスナーは、このオブジェクトを使用して自身を登録および登録解除できます。これを使用してフレームワークはクライアント・キャッシュにプッシュする変更を取得し、データが変更されたことをユーザー・インタフェース・レイヤーに通知します。

注意:

PropertyChangeSupportオブジェクトを手動でクラスに追加する場合は、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドも(これらの明示的なメソッド名を使用して)含める必要があります。

プロパティ変更のみでは、すべてのデータ変更通知は解決されません。たとえば、データ・コントロールによってラップされたBeanがあり、アイテムのコレクションの公開が必要な場合が考えられます。リストの個々のアイテムが変更されたときはプロパティ変更で十分ですが、カーディナリティが変更されたときは十分ではありません。この場合、コレクション全体のプロパティ変更を起動すると、パフォーマンスが低下する可能性があるため、かわりにコレクションのデルタのみを更新します。これを行うには、ProviderChangeSupportクラスを使用して、単純なプロパティ変更に必要なデータよりも多くのデータを公開する必要があります。プロバイダ変更イベントはプロパティ変更イベントと似ていますが、個別のプロパティのみを対象とするのではなく、プロバイダ全体に適用されます。

注意:

ProviderChangeSupportオブジェクトは、自動的には生成されません。このオブジェクトはaddProviderChangeListener、removeProviderChangeListenerおよびgetKey()メソッドとともに、(これらの明示的なメソッド名を使用して)手動でクラスに追加する必要があります。getKey()メソッドは、プロバイダに対して一意の値を生成する文字列を返す必要があります。getKey()メソッドをクラスに追加するかわりに、図15-19に示す概要エディタを使用して、データ・コントロール構造ファイルのキー属性として、データ・コントロールで属性を指定します。

図15-19 データ・コントロールのデータ・コントロール構造ファイルでのキー属性の選択

プロバイダ変更は、データ・コントロールによってラップされたBeanで公開されている動的なコレクションを保持しているときのみ必要になるため、起動するプロバイダ変更イベントは、次のいくつかのタイプのみになります。

- fireProviderCreate: 新しい要素をコレクションに追加する場合

- fireProviderDelete: 要素をコレクションから削除する場合

- fireProviderChange: コレクション内の1つの要素を変更する場合(リスト全体のリフレッシュを回避するのに必要です)

- fireProviderRefresh: 同時に複数の変更をコレクションに加え、単純にクライアントにコレクション全体のリフレッシュを要求した方がよいと判断した場合(これは一括操作でのみ使用する必要があります)

ProviderChangeSupportクラスは、コレクション要素に関連する通知を送信するために使用され、これによって、Java Beanデータ・コントロール内で変更が発生したときにコンポーネントを適切に更新できます。このクラスが従うパターンは、自動的に生成されるPropertyChangeSupportクラスと似ていますが、ProviderChangeSupportとともに使用されるイベント・オブジェクトでは、操作のタイプや変更された要素のキーと位置などの詳細情報を送信します。ProviderChangeSupportでは、コレクションに対する要素(プロバイダ)の追加や削除など、コレクションに対する構造的な変更を取得します。PropertyChangeSupportでは、コレクション内の個々のアイテムに対する変更を取得します。

次の例は、ProviderChangeSupportを使用して、コレクションの要素に対する構造的な変更(子を追加または削除する場合など)に関する通知を送信する方法を示しています。ProviderChangeListenerインタフェースおよびProviderChangeEventとProviderChangeSupportクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

public class NotePad {
private static List s_notes = null;

/* manually adding property change listener as well as provider change listener. */
protected transient PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);
protected transient ProviderChangeSupport
providerChangeSupport = new ProviderChangeSupport(this);

public NotePad() {
…
}

public  mobile.Note[] getNotes() {
mobile.Note n[] = null;

synchronized (this) {
if(s_notes.size() > 0) {
n = (mobile.Note[])
s_notes.toArray(new mobile.Note[s_notes.size()]);
}
else {
n = new mobile.Note[0];
}
}

return n;
}

public void addNote() {
System.out.println("Adding a note ....");
Note n = new Note();
int s = 0;

synchronized (this) {
s_notes.add(n);
s = s_notes.size();
}

System.out.println("firing the events");
providerChangeSupport.fireProviderCreate("notes", n.getUid(), n);
}

public void removeNote() {
System.out.println("Removng a note ....");
if(s_notes.size() > 0) {
int end = -1;
Note n = null;

synchronized (this) {
end = s_notes.size() - 1;
n = (Note)s_notes.remove(end);
}

System.out.println("firing the events");
providerChangeSupport.fireProviderDelete("notes", n.getUid());
}
}

public void RefreshNotes() {
System.out.println("Refreshing the notes ....");

providerChangeSupport.fireProviderRefresh("notes");
}

public void addProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.addProviderChangeListener(l);
}

public void removeProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.removeProviderChangeListener(l);
}

protected String   status;

/* --- JDeveloper generated accessors --- */

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public void setStatus(String status) {
String oldStatus = this.status;
this.status = status;
propertyChangeSupport.firePropertyChange("status", oldStatus, status);
}

public String getStatus() {
return status;
}
}

データ変更は、JVMレイヤーからのレスポンス・メッセージや戻り値とともに、クライアントに(キャッシュするために)戻されます。これにより、JDeveloperではユーザー・インタフェースに対してリフレッシュするイベントと更新の数を縮小し、可能なかぎりフレームワークの効率を上げることができます。

ただし、バックグラウンド・スレッドで実行時間の長い処理(Webサービスの相互作用、データベースの相互作用、コストのかかる計算など)に対処し、ユーザー・アクションに依存しないユーザー・インタフェースへの通知を行うことが必要になる場合もあります。AMXページのデータを更新して、値が変更されたデータ・フィールドの現在の値を反映させる場合、AdfmfJavaUtilities.flushDataChangeEventをコールして現在キューに入っているデータ変更をクライアントに強制することによって、AMXページ全体のリロードによるパフォーマンスの低下を回避できます。

注意:

flushDataChangeEventメソッドは、バックグラウンド・スレッドからのみ実行できます。

次の例は、flushDataChangeEventメソッドを使用してクライアントへの保留中のデータ変更を強制する方法を示しています。oracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventに関する詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

/* Note – Simple POJO used by the NotePad managed bean or data control wrapped bean */

package mobile;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;

/**
* Simple note object
* uid   - unique id - generated and not mutable
* title - title for the note - mutable
* note  - note comment - mutable
*/
public class Note {
/* standard JDeveloper generated property change support */
protected transient PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);

private static boolean s_backgroundFlushTestRunning = false;

public Note() {
this("" + (System.currentTimeMillis() % 10000));
}

public Note(String id) {
this("UID-"+id, "Title-"+id, "");
}

public Note(String uid, String title, String note) {
this.uid     = uid;
this.title   = title;
this.note    = note;
}

/* update the current note with the values passed in */
public void updateNote(Note n) {
if (this.getUid().compareTo(n.getUid()) == 0) {
this.setTitle(n.getTitle());
this.setNote(n.getNote());
}
else {
throw new IllegalArgumentException("note");
}
}

/* background thread to simulate some background process that make changes */
public void startNodeBackgroundThread(ActionEvent actionEvent) {
Thread backgroundThread   = new Thread() {
public void run() {
System.out.println("startBackgroundThread enter - " +
s_backgroundFlushTestRunning);

s_backgroundFlushTestRunning = true;
for(int i = 0; i <= iterations; ++i) {
try {
System.out.println("executing " + i + " of " + iterations + "
" iterations.");

/* update a property value */
if(i == 0) {
setNote("thread starting");
}
else if( i == iterations) {
setNote("thread complete");
s_backgroundFlushTestRunning = false;
}
else {
setNote("executing " + i + " of " + iterations + " iterations.");
}
setVersion(getVersion() + 1);
setTitle("Thread Test v" + getVersion());
AdfmfJavaUtilities.flushDataChangeEvent();  /* key line */
}
catch(Throwable t) {
System.err.println("Error in the background thread: " + t);
}

try {
Thread.sleep(delay);  /* sleep for 6 seconds */
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
};

backgroundThread.start();
}

protected String uid;
protected String title;
protected String note;
protected int    version;

protected int iterations = 10;
protected int delay = 500;

/* --- JDeveloper generated accessors --- */

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public String getUid() {
return uid;
}

public void setTitle(String title) {
String oldTitle = this.title;
this.title = title;
propertyChangeSupport.firePropertyChange("title", oldTitle, title);
}

public String getTitle() {
return title;
}

public void setNote(String note) {
String oldNote = this.note;
this.note = note;
propertyChangeSupport.firePropertyChange("note", oldNote, note);
}

public String getNote() {
return note;
}

public void setVersion(int version) {
int oldVersion = this.version;
this.version = version;
propertyChangeSupport.firePropertyChange("version", oldVersion, version);
}

public int getVersion() {
return version;
}

public void setIterations(int iterations) {
int oldIterations = this.iterations;
this.iterations = iterations;
propertyChangeSupport.
firePropertyChange("iterations", oldIterations, iterations);
}

public int getIterations() {
return iterations;
}

public void setDelay(int delay) {
int oldDelay = this.delay;
this.delay = delay;
propertyChangeSupport.
firePropertyChange("delay", oldDelay, delay);
}

public int getDelay() {
return delay;
}
}

/* NotePad – Can be used as a managed bean or wrapped as a data control */

package mobile;

import java.util.ArrayList;
import java.util.List;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;
import oracle.adfmf.java.beans.ProviderChangeListener;
import oracle.adfmf.java.beans.ProviderChangeSupport;

public class NotePad {
private static List s_notes = null;
private static boolean s_backgroundFlushTestRunning = false;

protected transient PropertyChangeSupport propertyChangeSupport =
new PropertyChangeSupport(this);

protected transient ProviderChangeSupport
providerChangeSupport = new ProviderChangeSupport(this);

public NotePad() {
if (s_notes == null) {
s_notes = new ArrayList();

for(int i = 1000; i < 1003; ++i) {
s_notes.add(new Note(""+i));
}
}
}

public  mobile.Note[] getNotes() {
mobile.Note n[] = null;

synchronized (this) {
if(s_notes.size() > 0) {
n = (mobile.Note[])s_notes.
toArray(new mobile.Note[s_notes.size()]);
}
else {
n = new mobile.Note[0];
}
}

return n;
}

public void addNote() {
System.out.println("Adding a note ....");
Note  n = new Note();
int   s = 0;

synchronized (this) {
s_notes.add(n);
s = s_notes.size();
}

System.out.println("firing the events");

/* update the note count property on the screen */
propertyChangeSupport.
firePropertyChange("noteCount", s-1, s);

/* update the notes collection model with the new note */
providerChangeSupport.
fireProviderCreate("notes", n.getUid(), n);

/* to update the client side model layer */
AdfmfJavaUtilities.flushDataChangeEvent();
}

public void removeNote() {
System.out.println("Removing a note ....");
if(s_notes.size() > 0) {
int end = -1;
Note n = null;

synchronized (this) {
end = s_notes.size() - 1;
n = (Note)s_notes.remove(end);
}

System.out.println("firing the events");

/* update the client side model layer */
providerChangeSupport.fireProviderDelete("notes", n.getUid());

/* update the note count property on the screen */
propertyChangeSupport.firePropertyChange("noteCount", -1, end);
}
}

public void RefreshNotes() {
System.out.println("Refreshing the notes ....");

/* update the entire notes collection on the client */
providerChangeSupport.fireProviderRefresh("notes");
}

public int getNoteCount() {
int size = 0;

synchronized (this) {
size = s_notes.size();
}
return size;
}

public void addProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.addProviderChangeListener(l);
}

public void removeProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.removeProviderChangeListener(l);
}

public void startListBackgroundThread(ActionEvent actionEvent) {
for(int i = 0; i < 10; ++i) {
_startListBackgroundThread(actionEvent);
try {
Thread.currentThread().sleep(i * 1234);
}
catch (InterruptedException e) {
}
}
}

public void
_startListBackgroundThread(ActionEvent actionEvent) {
Thread backgroundThread = new Thread() {
public void run() {
s_backgroundFlushTestRunning = true;

for(int i = 0; i <= iterations; ++i) {
System.out.println("executing " + i +
" of " + iterations + " iterations.");

try {
/* update a property value */
if(i == 0) {
setStatus("thread starting");
addNote();  // add a note
}
else if( i == iterations) {
setStatus("thread complete");
removeNote();  // remove a note
s_backgroundFlushTestRunning = false;
}
else {
setStatus("executing " + i + " of " +
iterations + " iterations.");

synchronized (this) {
if(s_notes.size() > 0) {
Note n =(Note)s_notes.get(0);

n.setTitle("Updated-" +
n.getUid() + " v" + i);
}
}
}
AdfmfJavaUtilities.flushDataChangeEvent();
}
catch(Throwable t) {
System.err.
println("Error in bg thread - " + t);
}

try {
Thread.sleep(delay);
}
catch (InterruptedException ex) {
setStatus("inturrpted " + ex);
ex.printStackTrace();
}
}
}
};

backgroundThread.start();
}

protected int iterations = 100;
protected int delay      = 750;

protected String   status;

/* --- JDeveloper generated accessors --- */

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public void setStatus(String status) {
String oldStatus = this.status;
this.status = status;
propertyChangeSupport.firePropertyChange("status", oldStatus, status);
}

public String getStatus() {
return status;
}

public void setIterations(int iterations) {
int oldIterations = this.iterations;
this.iterations = iterations;
propertyChangeSupport.firePropertyChange("iterations", oldIterations, iterations);
}

public int getIterations() {
return iterations;
}

public void setDelay(int delay) {
int oldDelay = this.delay;
this.delay = delay;
propertyChangeSupport.firePropertyChange("delay", oldDelay, delay);
}

public int getDelay() {
return delay;
}
}

StockTrackerサンプル・アプリケーションでは、データ変更イベントでJavaを使用してデータ変更をユーザー・インタフェースに反映する方法の例を示します。このサンプル・アプリケーションおよびその他のサンプル・アプリケーションの詳細は、「サンプルのMAFアプリケーション」を参照してください。

16 MAFアプリケーションで使用するエンド・ポイントの構成

この章では、構成サービスを使用して、MAFアプリケーションで使用できるエンド・ポイントを構成する方法について説明します。

この章の内容は次のとおりです。

- MAFアプリケーションで使用されるエンド・ポイントの構成の概要

- 構成サービス・エンド・ポイントの定義

- 構成サービス用のユーザー・インタフェースの作成

- URLの構造について

- サーバーでの構成サービスの設定

16.1 MAFアプリケーションで使用されるエンド・ポイントの構成の概要

MAFには、Webサービスで使用するエンド・ポイント、ログイン・ユーティリティおよびその他のMAFアプリケーションのコンポーネントを構成するための構成サービスがあります。

構成サービスは、Webサービス、ログイン・ユーティリティおよびMAFアプリケーションのその他の部分で使用されるエンド・ポイントを構成できるツールです。

注意:

ユニバーサルWindowsプラットフォーム上のMAFアプリケーションは、構成サービスの使用をサポートしていません。

16.2 構成サービス・エンド・ポイントの定義

構成サービスのエンド・ポイントURLと新規の接続エントリをconnections.xmlファイルで定義することで、構成サービス・エンド・ポイントの定義を構成します。

エンド・ポイントURLは、connections.xmlファイルに定義されており、新しい接続エントリはそのファイルに追加する必要があります。この新しい接続はタイプをHttpURLConnectionにし、そのurl値は構成サーバーのエンド・ポイントURLを指し、そのnameは最終的にJava Beanコードで参照される任意の値に設定されている必要があります。

次の例は、connections.xmlファイルの構成サービス・エンド・ポイントを定義する方法を示しています。

<RefAddresses>
<XmlRefAddr addrType="ConfigServiceConnection">
<Contents>
<urlconnection name="ConfigServiceConnection" url="http://127.0.0.1"/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

<!-- Login Server connection for secured configuration service -->
<Reference name="ConfigServerLogin" className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="ConfigServerLogin" partial="false"
manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://127.0.0.1"/>
<logout url="http://127.0.0.1"/>
<authenticationMode value="remote"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<maxFailuresBeforeCredentialCleared value="3"/>
<injectCookiesToRestHttpHeader value="true"/>
<rememberCredentials>
<enableRememberUserName value="true"/>
<rememberUserNameDefault value="true"/>
<enableRememberPassword value="false"/>
<enableStayLoggedIn value="false"/>
</rememberCredentials>
<accessControl/>
<userObjectFilter/>
</Contents>
</XmlRefAddr>
</RefAddresses>

構成サーバーに対してセキュリティが有効である場合、connections.xmlファイルにはURL接続と同じエンド・ポイントURLを指すログイン接続を含める必要があります。前の例に示したように、ログイン接続とHttpURLConnectionは、同じadfCredentialStoreKeyを共有する必要があります。

多くの場合、エンド・ポイントURLはユーザーから取得する必要があります。このユース・ケースに対処するには、ユーザーからエンド・ポイントURLの値を取得するためのユーザー・インタフェースを作成し、それをアプリケーション・プリファレンスに設定します。その後、取得した値をJava Beanメソッドで使用して、接続URL値をオーバーライドできます(例16-1を参照)。

例16-1 接続定義のオーバーライド

AdfmfJavaUtilities.clearSecurityConfigOverrides(<ConfigService_ConnectionName>);
AdfmfJavaUtilities.overrideConnectionProperty(<ConfigService_ConnectionName>, "urlconnection",
"url", <ConfigService_EndpointURL>);

// Required if Config Service is secured and the authentication endpoints are input by the user
AdfmfJavaUtilities.clearSecurityConfigOverrides(<ConfigService_AuthenticationConnectionName>);
AdfmfJavaUtilities.overrideConnectionProperty(<ConfigService_AuthenticationConnectionName>,
"login", "url", <Login_EndpointURL>);
AdfmfJavaUtilities.overrideConnectionProperty(<ConfigService_AuthenticationConnectionName>,
"logout", "url", <Logout_EndpointURL>);

// Final step is to apply the changes.
AdfmfJavaUtilities.updateApplicationInformation(false);

16.3 構成サービス用のユーザー・インタフェースの作成

構成サービスのユーザー・インタフェースが必要な場合は、新規または既存のアプリケーション機能内に作成する必要があります。

MAFでは、oracle.adfmf.config.client.ConfigurationServiceクラス内で一連のAPIが提供され、サーバー上の新しい変更を確認して更新内容をダウンロードできます。Java BeanでこれらのAPIを使用して、構成サービスのアプリケーション機能を介してそれぞれのメソッドをアクティブ化できます。

次のAPIの一覧とその使用例では、_configservice変数はoracle.adfmf.config.client.ConfigurationServiceクラスのインスタンスを表しています。

- setDeliveryMechanismメソッドは構成サービスの配信メカニズムを設定します。旧リリースの構成サービスとの通信はHTTPを使用することで可能になるため、このメソッドの引数としてhttpを渡します。

_configservice.setDeliveryMechanism("http");

注意:

メソッドの引数は構成サービスに使用するWebトランスポートを参照するため、HTTPまたはHTTPSと混同しないでください。エンド・ポイントがHTTPS URLの場合でも、トランスポートをhttpに設定することはできます。

- setDeliveryMechanismConfigurationメソッドは、構成サーバー接続とエンド・ポイントURLを関連付ける追加の属性を構成サービスに対して設定します。

_configservice.setDeliveryMechanismConfiguration("connectionName",
<ConfigService_ConnectionName>);

- isThereAnyNewConfigurationChangesメソッドは、サーバーにダウンロードできる変更内容がないか確認し、ある場合はtrueを返します。

_configservice.isThereAnyNewConfigurationChanges(<APPLICATION_ID>, <VERSION>);

- stageAndActivateVersionメソッドは、構成サービスによる更新のダウンロードをトリガーします。アプリケーションのバージョンが、ハードコードされた値またはApplication.getApplicationVersion APIから取得された値として、このメソッドに引数として渡されます。

_configservice.stageAndActivateVersion("1.0");

_configservice.stageAndActivateVersion(Application.getApplicationVersion);

- addProgressListenerメソッドは、構成サービスに更新進捗リスナーを登録して、更新メッセージおよび進捗状況を受信します。基となるクラスはProgressListenerインタフェースと、構成サービスから呼び出されるupdateProgressメソッドを実装する必要があります。updateProgressメソッドは、進捗更新メッセージと更新完了率を受け取ります。

_configservice.addProgressListener(this);

- removeProgressListenerメソッドは、更新進捗リスナーを登録解除します。

_configservice.removeProgressListener(this);

ConfigServiceDemoサンプル・アプリケーションは、これらのAPIを使用して構成サーバーと通信する方法を示しています。ConfigServiceDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

oracle.adfmf.config.client.ConfigurationServiceクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

16.4 URLの構造について

ユーザーが指定したエンドポイントURLまたはconnections.xml fileファイルで指定されたエンドポイントURLは、connections.xmlファイルをダウンロードするURLを作成するために構成サービスで使用されます。

構成サービスは、ユーザーが指定した、またはconnections.xmlファイルに指定されているエンド・ポイントURLを取得し、それを使用してconnections.xmlファイルをダウンロードするためのURLを構築します。

たとえば、アプリケーションIDの値がcom.mycompany.appnameのアプリケーションに対して、ユーザーが次のエンド・ポイントURLを指定している場合、

http://my.server.com:port/SomeLocation

構成サーバーは、次のURLを構築してconnections.xmlファイルをダウンロードします。

http://my.server.com:port/SomeLocation/com.mycompany.appname/connections.xml

16.5 サーバーでの構成サービスの設定

構成サービスはHTTP GETリクエストを受け入れて、connections.xmlファイルを返します。

構成サービスは、HTTP GETリクエストを受け入れてconnections.xmlファイルを返すサービスとして実装できます。

構成サービス・クライアントによって使用されるURLの形式は、次のとおりです。

adf-config.xml/アプリケーション・バンドルIDで構成されたURL/connections.xml

構成サービスのエンド・ポイントは、HTTPおよびHTTPSを経由する基本認証(BASIC_AUTH)を使用して保護できます。

17 MAFアプリケーションでのWebサービスの使用方法

この章では、MAFアプリケーションからREST Webサービスにアクセスする方法について説明します。

この章の内容は次のとおりです。

- MAFアプリケーションでのWebサービス使用の概要

- WebサービスにアクセスするためのRESTサービス・アダプタの作成

- セキュアなWebサービスへのアクセス

- ブラウザ・プロキシ情報の構成

17.1 MAFアプリケーションでのWebサービス使用の概要

MAFは、MAFアプリケーションにおけるJSONオブジェクトを使用したREST Webサービスの消費をサポートしています。MAFでこのタイプのWebサービスが他のWebサービスよりも推奨される理由は、生成するペイロードが通常は少ないため、アプリケーションと、アプリケーションがアクセスするサービスとの間の通信のレスポンス時間が短くなるからです。

MAFアプリケーションでREST-JSON Webサービスを使用する場合は、WebサービスのURLエンド・ポイントへの接続をアプリケーションで構成する必要があります。MAFは、このエンド・ポイントをアプリケーションのconnections.xmlファイルに格納します。また、connections.xmlに構成した値をとるアダプタ(RESTServiceAdapter)を記述し、それを使用して、Webサービスに送信するリクエストURIを構築します。Webサービスが返すデータをモデル化するJavaクラスを記述する必要もあります。これらのクラスを使用して、WebサービスがアクセスするデータにアプリケーションのAMXページをバインドするデータ・コントロールを生成します。アプリケーションが保護されたWebサービスにアクセスする場合は、そのWebサービスのURLエンド・ポイントへの接続にセキュリティ・ポリシーを関連付ける必要があります。アプリケーションが、自社ファイアウォールの外部でホストされているサービスにアクセスする必要がある場合は、アプリケーションのmaf.propertiesファイルにエントリを構成する必要もあります。

注意:
RESTServiceAdapterを記述するかわりに、MAFにより提供される、REST Webサービスにアクセスするクライアント・データ・モデルを生成するためのデザインタイム・サポートを使用します。「MAFアプリケーションでのクライアント・データ・モデルの作成」を参照してください。

WorkBetterサンプル・アプリケーションは、RESTServiceAdapterを使用してRESTサービスをプログラムで消費する例を示します。WorkBetterサンプル・アプリケーションのソース・コードにアクセスする方法の詳細は、「サンプルのMAFアプリケーション」を参照してください。

17.2 WebサービスにアクセスするためのRESTサービス・アダプタの作成

RestServiceAdapterを使用して、RESTコールにより送信されたデータにアクセスし、Webサービス操作の実行をトリガーします。oracle.maf.api.dc.ws.restパッケージからのRestServiceAdapterFactory.createRestServiceAdapter() APIは、RestServiceAdapterを実装するアダプタを作成します。

サービスのURLエンド・ポイントへの接続がconnections.xmlファイルに存在することを確認し、次の例で示すようにコードをBeanクラスに追加します。

Mobile Cloud Serviceに診断情報を送信するアダプタを作成する必要がある場合は、「Oracle Mobile Cloud Serviceへの診断情報の送信」で説明しているように、RestServiceAdapterFactory.createMcsRestServiceAdapter() APIを使用します。

RestServiceAdapterFactoryおよびRestServiceAdapterの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

....
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;
....
RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter restServiceAdapter = factory.createRestServiceAdapter();

// Clear any previously set request properties, if any
restServiceAdapter.clearRequestProperties();

// Set the connection name
restServiceAdapter.setConnectionName("RestServerEndpoint");

// Specify the type of request
restServiceAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_GET);

// Specify the number of retries
restServiceAdapter.setRetryLimit(0);

// Set the URI which is defined after the endpoint in the connections.xml.
// The request is the endpoint + the URI being set
restServiceAdapter.setRequestURI("/WebService/Departments/100");

// Following code snippets demonstrate how to use getHttpURLConnection to initialize
// and return java.net.HttpURLConnection or javax.net.ssl.HttpsURLConnection.
// The getHttpURLConnection injects all security headers based on the security policy
// configured for the connection used to create this adapter.
// The supported policies depend on the authentication server type that you use (HTTP Basic, OAuth, or Web SSO).

// Get the type of request
String requestMethod = RestServiceAdapter.REQUEST_TYPE_GET;

// Get the connection end point from connections.xml
String requestEndPoint = restServiceAdapter.getConnectionEndPoint("RestServerEndpoint");

// Get the URI which is defined after the end point
String requestURI = "/xml/" + someIpAddress;

// The request is the end point + the URI being set
String request = requestEndPoint + requestURI;

// Specify some custom request headers
HashMap httpHeadersValue = new HashMap();
httpHeadersValue.put("Accept-Language", "en-US");
httpHeadersValue.put("My-Custom-Header-Item", "CustomItem1");

// Get the connection
HttpURLConnection connection = restServiceAdapter.getHttpURLConnection(requestMethod, request, httpHeadersValue);

String response = "";

// Execute SEND and RECEIVE operation
try {
// For GET request, there is no payload
response = restServiceAdapter.send("");
}
catch (Exception e) {
e.printStackTrace();
}

次の例は、POSTリクエストに対するRestServiceAdapterの使用方法を示しています。

String id = "111";
String name = "TestName111";
String location = "TestLocation111";
....

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_POST);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments");

String response = "";

// Execute SEND and RECEIVE operation
try {
String postData = makeDepartmentPost("DEPT", id, name, location);
response = restServiceAdapter.send(postData);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + response);

private String makeDepartmentPost(String rootName, String id,
String name, String location) {
String ret = "<" + rootName + ">";
ret += "<DEPTID>" + id + "</DEPTID>";
ret += "<NAME>" + name + "</NAME>";
ret += "<LOCATION>" + location + "</LOCATION>";
ret += "</" + rootName + ">";
return ret;
}

次の例は、PUTリクエストに対するRestServiceAdapterの使用方法を示しています。

String id = "111";
String name = "TestName111";
String location = "TestLocation111";

....

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_PUT);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments");

String response = "";

// Execute SEND and RECEIVE operation
try {
String putData = makeDepartmentPut("DEPT", id, name, location);
response = restServiceAdapter.send(putData);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + response);

private String makeDepartmentPut(String rootName, String id,
String name, String location) {
String ret = "<" + rootName + ">";
ret += "<DEPTID>" + id + "</DEPTID>";
ret += "<NAME>" + name + "</NAME>";
ret += "<LOCATION>" + location + "</LOCATION>";
ret += "</" + rootName + ">";
return ret;
}

次の例は、DELETEリクエストに対するRestServiceAdapterの使用方法を示しています。

....

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_DELETE);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments/44");

String response = "";

// Execute SEND and RECEIVE operation
try {
// For DELETE request, there is no payload
response = restServiceAdapter.send("");
}
catch (Exception e) {
e.printStackTrace();
}

System.out.println("The response is:  " + response);

RestServiceAdapterを使用する場合は、AcceptヘッダーとContent-Typeヘッダーを設定して、MIMEタイプの不一致が原因でリクエストおよびレスポンスのペイロードが無効と判断されないようにします。

注意:

REST Webサービス・アダプタでは、MAFアプリケーション上の文字セットとしてUTF-8のみをサポートします。UTF-8は、アダプタのプログラムに埋め込まれています。

17.2.1 入力および出力ストリームへのアクセス

RestServiceAdapterを使用して、java.net.HttpURLConnectionを取得し、カスタマイズしたり、HttpURLConnectionからのデータの読取りおよび書込み、さらにはサーバーへのアップロードが可能な接続の入力および出力ストリームと対話したりすることができます。

次の例では、指定されたリクエスト・メソッド、リクエストおよびHTTPヘッダー値を使用して、HttpURLConnectionを初期化して返しています。また、資格証明ストアから基本認証をリクエスト・ヘッダーに挿入し、入力ストリームを取得し、接続を閉じます。

....
// Get the connection
HttpURLConnection httpURLConnection =
restServiceAdapter.getHttpURLConnection(requestMethod, request, httpHeadersValue);

// Get the input stream
InputStream inputStream = restServiceAdapter.getInputStream(connection);

// Define data
ByteArrayOutputStream byStream = new ByteArrayOutputStream();

int res = 0;
int bufsize = 0, bufread = 0;

byte[] data = (bufsize > 0) ? new byte[bufsize] : new byte[1024];

// Use the input stream to read data
while ((res = inputStream.read(data)) > 0) {
byStream.write(data, 0, res);
bufread = bufread + res;
}
data = byStream.toByteArray();

// Use data
...

restServiceAdapter.close(connection);
...

17.2.2 非テキスト・レスポンスのサポート

Webサービス・コールから受け取ったバイナリ(非テキスト)レスポンスを処理するには、RestServiceAdapterを使用できます。これらのレスポンスには、PDFファイルやビデオ・ファイルなど、どの種類のバイナリ・データでも含めることができます。使用するRestServiceAdapterメソッドはsendReceiveです。

次の例は、RESTサーバーにファイルのリクエストを送信し、ファイルをディスクに保存する方法を示しています。

RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter restServiceAdapter = factory.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("JagRestServerEndpoint");
restServiceAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_GET);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/ftaServer/v1/kpis/123/related/1");

// Set credentials needed to access the REST server
String theUsername = "hr_spec_all";
String thePassword = "Welcome1";
String userPassword = theUsername + ":" + thePassword;
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes());

restServiceAdapter.addRequestProperty("Authorization", "Basic " + encoding);

// Execute the SEND and RECEIVE operation.
// Since it is a GET request, there is no payload.
try {
this.responseRaw = restServiceAdapter.sendReceive("");
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + this.responseRaw);

// Write the response to a file
writeByteArrayToFile(this.responseRaw);

次の例は、前の例のコードによってコールされたメソッドを示しています。このメソッドでは、ファイルに対するbyte[]レスポンスをディスクに保存します。

public void writeByteArrayToFile(byte[] fileContent) {
BufferedOutputStream bos = null;
try {
FileOutputStream fos = new FileOutputStream(new File(fileToSavePath));
bos = new BufferedOutputStream(fos);
// Write the byte [] to a file
System.out.println("Writing byte array to file");
bos.write(fileContent);
System.out.println("File written");
}
catch(FileNotFoundException fnfe) {
System.out.println("Specified file not found" + fnfe);
}
catch (IOException ioe) {
System.out.println("Error while writing file" + ioe);
}
finally {
if(bos != null) {
try {
// Flush the BufferedOutputStream
bos.flush();
// Close the BufferedOutputStream
bos.close();
}
catch (Exception e) {
}
}
}
}

17.3 セキュアなWebサービスへのアクセス

MAFでは保護されたWebサービスと保護されていないWebサービスの両方がサポートされます。REST Webサービスが保護されている場合、REST Webサービスをサポートする事前定義済のセキュリティ・ポリシーにREST接続を関連付ける必要があります。

表17-1に、REST Webサービスへの接続に関連付けることができる事前定義済のセキュリティ・ポリシーを示します。「Webサービスへのアクセスを有効にする方法」では、事前定義済のセキュリティ・ポリシーに接続を関連付ける方法を説明します。

表17-1 RESTベースのWebサービスでサポートされるセキュリティ・ポリシー

認証タイプ

RESTポリシー

説明

HTTP Basic

oracle/wss_http_token_over_ssl_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含め、Oracle Platform Security Servicesアイデンティティ・ストアに対してユーザーを認証します。また、このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアントで実行できます。

HTTP Basic

oracle/wss_http_token_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含めます。このポリシーは、HTTPベースまたはHTTPSベースのクライアントで実行できます。

HTTP Basic

oracle/wss_http_token_over_ssl_client_policy

このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含め、Oracle Platform Security Servicesアイデンティティ・ストアに対してユーザーを認証します。また、このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアントで実行できます。

HTTP Basic

Web SSO

oracle/http_cookie_client_policy

このポリシーは、認証後に取得されたCookieをHTTPリクエスト・ヘッダーに挿入します(例: OAM Webgateリソース)。このポリシーでは、レスポンスCookieも設定します。このポリシーは、RESTベースのクライアントで実行できます。

OAuth

oracle/http_oauth2_token_mobile_client_policy

このポリシーは、エンドポイントとの通信中にBearerトークン(OAuthアクセス・トークン)をHTTPリクエスト・ヘッダーに挿入します。このトークンは、任意のOAuth2サーバーから取得できます。このポリシーは、RESTベースのクライアントで実行できます。

これらのポリシーとその使用方法の詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』の使用する事前定義済ポリシーの決定に関する項と、事前定義済ポリシーに関する項を参照してください。

17.3.1 Webサービスへのアクセスを有効にする方法

Webサービスが保護されており、認証トークンが予想される場合、Webサービスをサポートする事前定義済のセキュリティ・ポリシーにログイン接続を関連付ける必要があります。

RESTベースのWebサービスで使用できる認証タイプ用にサポートされている事前定義済セキュリティ・ポリシーのリストは、「セキュアなWebサービスへのアクセス」を参照してください。maf-application.xml概要エディタの「MAFログイン接続の作成」ダイアログを使用して、ログイン・サーバー接続を作成します。ログイン・サーバー接続の作成の詳細は、「MAFログイン接続の作成方法」を参照してください。

Webサービスにセキュリティ・ポリシーを関連付けるには:

1. 「アプリケーション」ウィンドウで、「ディスクリプタ」ノード、「ADF META-INF」と開き、maf-application.xmlをダブルクリックします。次に、maf-application.xmlファイルの概要エディタで「セキュリティ - Webサービス・セキュリティ・ポリシー」セクションを展開し、作成済のWebサービス接続を「名前」フィールドで選択します。

2. 「ログイン・サーバー接続」フィールドで、定義したログイン・サーバー接続を選択します。

3. 「ポリシー」フィールドで、「ポリシーを編集」アイコン・ボタンをダブルクリックして、「データ・コントロール・ポリシーの編集」ダイアログで現在のWebサービス接続のサービスに関連付けるポリシーを選択して、「OK」をクリックします。
図17-1は、RESTConnection1およびRESTConnection2に関連付けられているポリシーを示しています。
「データ・コントロールの編集」ダイアログで選択でき、RESTベースのWebサービスに関連付けることができるセキュリティ・ポリシーのリストは、「セキュアなWebサービスへのアクセス」を参照してください。

図17-1 Webサービス接続へのセキュリティ・ポリシーの関連付け

17.3.2 Webサービスへのアクセスを有効にする場合の処理

JDeveloperは、META-INFディレクトリ内のwsm-assembly.xmlファイルに、Webサービス・ポリシー定義を保存します。

「データ・コントロール・ポリシーの編集」ダイアログ(図17-2を参照)を使用して、REST Webサービスにすでに関連付けられているセキュリティ・ポリシーを表示できます。「プロパティのオーバーライド」をクリックしてダイアログを開き、そのダイアログで、選択したポリシーのオーバーライドが許可されているプロパティの代替値を指定できます。

図17-2 Webサービス・データ・コントロール・ポリシーの編集

17.3.3 資格証明の挿入に関する必知事項

保護されたWebサービスにおけるユーザーの資格証明は、Webサービス・リクエストの起動時にそのリクエストに動的に挿入されます。

MAFではOracle Web Services Manager (OWSM) Mobile Agentを使用してWebサービス・リクエストによってユーザーIDを伝播させます。

Webサービスを起動する前に、ユーザーは、保護されたMAFアプリケーション機能の呼出しを試みるユーザーによってトリガーされた認証プロンプトに応答する必要があります。ユーザーの資格証明は、資格証明ストアに格納されます。この資格証明ストアは、認証プロバイダのサーバーURLおよびユーザーと関連付けられた資格証明の格納に使用される、デバイス・ネイティブかつローカルなリポジトリです。実行時に、MAFでは、すべての資格証明がその使用前にIDM Mobile資格証明ストアに格納されているものとみなします。

connections.xmlファイルには、Webサービスの接続参照のadfCredentialStoreKey属性に、ログイン・サーバー接続のadfCredentialStoreKeyの値を指定して、ログイン・サーバーをWebサービスのセキュリティに関連付ける必要があります(次の2つの例を参照)。

注意:

JDeveloperではconnections.xmlファイルの概要エディタが提供されないため、「プロパティ」ウィンドウを使用して、<Reference>要素のadfcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新できます。または、「ソース」エディタを使用して属性を追加または更新できます。

次の例は、adfCredentialStoreKey="MyAuth"として参照されるWebサービス接続の定義を示しています。ここで、MyAuthとは、ログイン接続の参照名です。

<Reference name="URLConnection1"
className="oracle.adf.model.connection.url.HttpURLConnection"
adfCredentialStoreKey="MyAuth"
xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="URLConnection1">
<Contents>
<urlconnection name="URLConnection1"
url="http://myhost.us.example.com:7777/
SecureRESTWebService1/Echo">
<authentication style="challange">
<type>basic</type>
<realm>myrealm</realm>
</authentication>
</urlconnection>
</Contents>
</XmlRefAddr>
<SecureRefAddr addrType="username"/>
<SecureRefAddr addrType="password"/>
</RefAddresses>
</Reference>

次の例は、ログイン接続の定義を示しています。ここでのMyAuthは、ログイン・サーバー接続における資格証明ストア・キーの値として使用されます。

<Reference name="MyAuthName"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="MyAuth"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://172.31.255.255:7777/
SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<logout url="http://172.31.255.255:7777/
SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<accessControl url="http://myhost.us.example.com:7777/
UserObjects/jersey/getUserObjects" />
<idleTimeout value="10"/>
<sessionTimeout value="36000"/>
<userObjectFilter>
<role name="testuser1_role1"/>
<role name="testuser2_role1"/>
<privilege name="testuser1_priv1"/>
<privilege name="testuser2_priv1"/>
<privilege name="testuser2_priv2"/>
</userObjectFilter>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

認証の失敗によってWebサービス・リクエストが拒否された場合は、MAFにより適切な例外が戻され、適切なアクションが起動されます(「ロギングの使用方法と構成」を参照)。既存の例外で状況を適切に示せない場合は、新しい例外が追加されます。

「MAFアプリケーションで使用するエンド・ポイントの構成」で説明しているように、connections.xmlファイルは構成サービスの下でデプロイされ、管理されています。

FAR内のconnections.xmlファイルは、MAFアプリケーションのデプロイ時に集約されます。資格証明はデプロイメント固有のデータを表しており、FAR内に格納することは想定されていません。

17.3.4 Cookieの挿入に関する必知事項

MAFは、Cookieベースの認証のために、REST WebサービスのURLエンドポイントに関連付けられたログイン接続に対して、Cookieの挿入を実行します。

Cookieベースの認可のためにMAFアプリケーションがREST Webサービスを要求するたびに、MAFのセキュリティ・フレームワークは、REST Webサービスのトランスポート・レイヤーが、REST WebサービスのURLエンドポイントに関連付けられているログイン接続に対してCookieの挿入を実行できるようにします。これは実行時に処理され、MAF開発者によるMAFアプリケーションの構成は不要です。

17.4 ブラウザ・プロキシ情報の構成

企業のファイアウォールの外側に存在するWebサービスをコールするために、HTTPプロキシ・サーバーを使用するようにJavaのシステム・プロパティを構成します。このプロキシは、汎用接続フレームワークまたはjava.net APIのどちらかで定義できます。

デフォルトでは、MAFはアプリケーションのデプロイ先であるプラットフォームのシステム設定を使用してプロキシ情報を決定します。たとえば、iOSデバイスの設定ユーティリティを使用してプロキシ情報が設定されている場合、JVMは自動的にその情報を取り込みます。

注意:

MAFアプリケーションごとに異なるプロキシを定義できます。

デバイスの設定からプロキシ情報を取得しない場合は、最初に-Dcom.oracle.net.httpProxySourceシステム・プロパティを追加する必要があります。このプロパティのデフォルト値はnativeで、プロキシ情報をデバイスの設定から取得することを意味します。これを無効にするには、userなど別の値を指定します(例: -Dcom.oracle.net.httpProxySource=user)。

JVMは2つの異なるメカニズムを使用してネットワーク接続を有効にします。

1. 汎用接続フレームワーク(GCF)。このメカニズムを使用する場合、プロキシはシステム・プロパティの-Dcom.sun.cdc.io.http.proxy=<host>:<port>によって定義されます。

2. java.net API。このメカニズムを使用する場合、プロキシは標準のhttp.proxyHostとhttp.proxyPortによって定義されます。

いずれの場合でも、maf.propertiesファイルに3つすべてのプロパティを定義することをお薦めしますが、そうすると次のようになります。

java.commandline.argument=-Dcom.oracle.net.httpProxySource=user
java.commandline.argument=-Dcom.sun.cdc.io.http.proxy=www-proxy.us.mycompany.com:80
java.commandline.argument=-Dhttp.proxyHost=www-proxy.us.mycompany.com
java.commandline.argument=-Dhttp.proxyPort=80

注意:

これらのプロパティはネットワーク・コールのJVM側のみに影響します。

18 MAF AMXでのローカル・データベースの使用方法

この章では、MAF AMXアプリケーション機能でローカルSQLiteデータベースを使用する方法について説明します。

この章の内容は次のとおりです。

- ローカルSQLiteデータベースの使用方法の概要

- ローカルSQLiteデータベースの使用方法

18.1 ローカルSQLiteデータベースの使用方法の概要

SQLiteは、特に埋込みアプリケーション用に設計されたリレーショナル・データベース管理システム(RDBMS)です。

SQLiteには次の特性があります。

- ACID準拠: 他の従来のデータベース・システムと同様に、原子性、一貫性、独立性および永続性という特性を備えています。

- 軽量: アプリケーション内に直接埋め込むように設計された小さなCライブラリでデータベース全体が構成されています。

- 移植性: 様々な範囲のコンピュータ・アーキテクチャおよびオペレーティング・システム間でバイナリ互換性がある単一ファイルでデータベースは自己完結型となります。

詳細は、SQLite Webサイト(http://www.sqlite.org)を参照してください。

ローカルのSQLiteデータベースの使用例は、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにあるCRUDDemoというMAFサンプル・アプリケーションを参照してください。CRUDDemoサンプル・アプリケーションは、カスタムSQLiteデータベース・ファイル(このアプリケーション内にパッケージ化されています)を使用します。このデータベース・ファイルには、従業員に関する情報が含まれるレコードのある表が含まれています。アプリケーションは、アクティブ化されると、この表からデータを読み取り、従業員のリストを表示します。従業員に関する情報はCRUD操作の対象となり、ユーザー・インタフェースから、従業員を作成、並替え、更新および削除できます。すべてのCRUD操作は、SQLiteデータベース内で更新されます。

SQLiteデータベースを使用して、MAFアプリケーションでRESTデータ・サービスとのオフライン・アクセスおよび同期を提供する場合は、MAFクライアント・データ・モデルを使用することをお薦めします。これは、RESTサービスからのデータの取得を容易にするウイザードと、MAFアプリケーションがオフラインのときにSQLiteデータベースに残すデータを選択するウィザードを提供し、オフライン・トランザクションとMAFアプリケーションがオンラインに復帰したときの同期のサポートを可能にします。また、SQLiteデータベースとやり取りするための様々なメソッドを公開するAPI (DBPersistenceManager)も提供されます。「MAFアプリケーションでのクライアント・データ・モデルの作成」と「MAFクライアント・データ・モデルDBPersistenceManagerの使用によるSQLiteデータベースへのアクセス」を参照してください。

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では、同一のデータベース・インスタンスに対する複数の読取り/書込み接続がサポートされていません。『File Locking And Concurrency In SQLite Version 3』を参照してください(SQLite Webサイトhttp://www.sqlite.org/lockingv3.htmlの「Documentation」セクションから入手できます)。

18.1.1.2 SQLのサポートおよび解釈

SQLiteはSQL92標準に完全に準拠していますが、いくつかのサポート対象外の構成があります。

SQLiteはSQL92標準でコンパイルされますが、サポートされていない構成が次を含めていくつか存在します。

- RIGHT OUTER JOIN

- FULL OUTER JOIN

- GRANT

- REVOKE

『SQL Features That SQLite Does Not Implement』を参照してください(SQLite Webサイトhttp://www.sqlite.org/omitted.htmlの「Documentation」セクションから入手できます)。

SQLiteによるSQLの解釈の方法については、SQLite Webサイトのドキュメント・セクションで入手可能な『SQL As Understood by SQLite』(http://www.sqlite.org/lang_createtable.html)を参照してください。

18.1.1.3 データ型

SQLiteは動的に型指定され、宣言された型とは無関係に、任意の列に任意の値を格納できます。

大部分のデータベース・システムは強く型指定をしているのに対して、SQLiteは動的な型指定のため、宣言された型とは無関係にどの列にどの値を格納することもできます。たとえば、数値列に文字列値が間違って格納された場合でも、SQLiteではエラーは戻されません。『Datatypes In SQLite Version 3』を参照してください(SQLite Webサイトhttp://www.sqlite.org/datatype3.htmlの「Documentation」セクションから入手できます)。

18.1.1.4 外部キー

SQLiteは外部キーをサポートします。これは、外部キー制約を解析および強制します。『SQLite Foreign Key Support』を参照してください(SQLiteサイトhttp://www.sqlite.org/foreignkeys.htmlの「Documentation」セクションから入手できます)。

18.1.1.5 データベース・トランザクション

SQLiteはACID準拠であるためトランザクションをサポートしていますが、ネストされたトランザクションをサポートしていません。また、オープンしているすべてのResultSetsがクローズされるまでトランザクションをロールバックできません。SQLiteは、任意のデータベースに対し、複数の読取り専用接続または単一の読取り/書込み接続のどちらかを許容します。

SQLiteはACID準拠であるためトランザクションをサポートしていますが、SQLiteとOracleのトランザクション・サポートの間には基本的な相違点がいくつか存在します。

- ネストされたトランザクション: SQLiteでは、ネストされたトランザクションをサポートしません。単一のトランザクションのみを常時アクティブにできます。

- コミット: SQLiteは、任意の指定されたデータベースに対し、複数の読取り専用接続または単一の読取り/書込み接続のいずれかを許容します。したがって、同一のデータベースに対して複数の接続がある場合は、データベースの変更を試みる最初の接続のみが成功します。

- ロールバック: SQLiteでは、開いているすべてのResultSetsを閉じるまではトランザクションのロールバックができません。

『Distinctive Features of SQLite』を参照してください(SQLite Webサイトhttp://www.sqlite.org/different.htmlの「Documentation」セクションから入手できます)。

18.1.1.6 認証

SQLiteは、ロールベースの認証とユーザーベースの認証のどちらもサポートしていません。ユーザーはファイル内のすべてのデータにアクセス可能です。データの保護にはMAF暗号化を使用できます。

SQLiteでは、ロールベースまたはユーザーベースの認証はどの形式もサポートしていません。デフォルトで、どのユーザーもファイル内のすべてのデータにアクセスできます。ただし、MAFでは、使用可能な暗号化ルーチンを提供することで、データを保護し、有効な資格証明セットを持たないユーザーによるアクセスを防ぎます。「データベースを暗号化および復号化する方法」を参照してください。

18.2 ローカルSQLiteデータベースの使用方法

MAFには、暗号化されたSQLite 3.8.5データベースが含まれています。

通常SQLiteを使用する場合は、次のことを知っておく必要があります。

- データベースへの接続方法

- SQLスクリプトを使用してデータベースを初期化する方法またはデスクトップ上でデータベースを初期化する方法

- データベースを暗号化および復号化する方法

- VACUUMコマンドの使用方法

18.2.1 データベースへの接続方法

SQLiteデータベースに接続するには、アプリケーションに関連付けられたjava.sql.Connectionオブジェクトを使用します。SQLite JDBC URLは、テキストjdbc:sqliteで始める必要があります。

SQLiteデータベースへの接続は、Oracleデータベースへの接続を開く場合とは異なります。最初の接続を取得すると、同じJDBC APIおよびSQL構文の大部分が使用可能になり、データベースの問合せと変更が可能になります。

ユーザーのアプリケーションに関連付けられたjava.sql.Connectionオブジェクトを使用して、SQLiteデータベースに接続します。接続を作成する場合は、どのSQLite JDBC URLもjdbc:sqlite:というテキストで始まるようにします。

次の例は、暗号化されていないデータベースと接続を開く方法を示しています。接続を取得する前に、JDBCドライバをロードします。

public static Connection getConnection() throws Exception {
if (conn == null) {
try {
// create a database connection
String Dir = AdfmfJavaUtilities.getDirectoryPathRoot(
AdfmfJavaUtilities.ApplicationDirectory);
String connStr = "jdbc:sqlite:" + Dir + "/portfolio.db";
// Load the driver
Class.forName("SQLite.JDBCDriver");
conn = DriverManager.getConnection(connStr);
}
catch (SQLException e) {
// If the error message is "out of memory", it probably
// means that no database file is found
System.err.println(e.getClass().getName() + ": " + e.getMessage() );
e.printStackTrace();
}
}
return conn;
}

次の例は、暗号化されたデータベースと接続を開く方法を示しています。

java.sql.Connection connection = new SQLite.JDBCDataSource(
"jdbc:sqlite:/path/to/database").getConnection(null,"password");

前述の例では、getConnectionメソッドの最初のパラメータがユーザー名となっていますが、SQLiteではユーザーベースのセキュリティがサポートされないため、この値は無視されます。

注意:

SQLiteでは、不正なパスワードで暗号化されたデータベースを開いた場合でも、エラー・メッセージが表示されません。同様に、暗号化されていないデータベースをパスワードで誤って開いた場合でも警告は表示されません。そのかわりに、データの読取りまたは変更を試みた場合は、「エラー: ファイルが暗号化されているか、ファイルがデータベースではありません。」というメッセージとともにSQLExceptionがスローされます。

18.2.2 SQLスクリプトを使用してデータベースを初期化する方法

アプリケーションの起動時に、SQLスクリプトによってデータベースが初期化されます。このスクリプトは、MAFアプリケーションのApplicationControllerプロジェクトに、リソースとして追加する必要があります。

SQLスクリプトを使用して、アプリケーションの起動時にデータベースを初期化します。次の例は、サポートされているSQL構文(「SQLのサポートおよび解釈」で説明)の一部を示すSQL初期化スクリプトを示しています。この例では、DROP TABLE、CREATE TABLEおよびINSERTコマンド、NUMBERおよびVARCHAR2データ型が使用されています。

DROP TABLE IF EXISTS PERSONS;

CREATE TABLE PERSONS
(
PERSON_ID NUMBER(15) NOT NULL,
FIRST_NAME VARCHAR2(30),
LAST_NAME VARCHAR2(30),
EMAIL VARCHAR2(25) NOT NULL
);

INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 100, 'David', 'King', 'steven@king.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 101, 'Neena', 'Kochhar', 'neena@kochhar.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 102, 'Lex', 'De Haan', 'lex@dehaan.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 103, 'Alexander', 'Hunold', 'alexander@hunold.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 104, 'Bruce', 'Ernst', 'bruce@ernst.net');

SQLスクリプトを使用するには、そのスクリプトをMAFアプリケーションのApplicationControllerプロジェクトにリソースとして追加します。サンプル・スクリプトは、META-INFディレクトリでinitialize.sqlとして保存されているものとします。次の例は、SQLスクリプトを解析し、文を実行するために追加する必要のあるコードを示しています。

private static void initializeDatabaseFromScript() throws Exception {
InputStream scriptStream = null;
Connection conn = null;
try {
// ApplicationDirectory returns the private read-write sandbox area
// of the mobile device's file system that this application can access.
// This is where the database is created
String docRoot = AdfmfJavaUtilities.getDirectoryPathRoot
(AdfmfJavaUtilities.ApplicationDirectory);
String dbName = docRoot + "/sample.db";

// Verify whether or not the database exists.
// If it does, then it has already been initialized
// and no furher actions are required
File dbFile = new File(dbName);
if (dbFile.exists())
return;

// If the database does not exist, a new database is automatically
// created when the SQLite JDBC connection is created
conn = new SQLite.JDBCDataSource("jdbc:sqlite:" + docRoot +
"/sample.db").getConnection();

// To improve performance, the statements are executed
// one at a time in the context of a single transaction
conn.setAutoCommit(false);

// Since the SQL script has been packaged as a resource within
// the application, the getResourceAsStream method is used
scriptStream = Thread.currentThread().getContextClassLoader().
getResourceAsStream("META-INF/initialize.sql");
BufferedReader scriptReader = new BufferedReader
(new InputStreamReader(scriptStream));
String nextLine;
StringBuffer nextStatement = new StringBuffer();

// The while loop iterates over all the lines in the SQL script,
// assembling them into valid SQL statements and executing them as
// a terminating semicolon is encountered
Statement stmt = conn.createStatement();
while ((nextLine = scriptReader.readLine()) != null) {
// Skipping blank lines, comments, and COMMIT statements
if (nextLine.startsWith("REM") ||
nextLine.startsWith("COMMIT") ||
nextLine.length() < 1)
continue;
nextStatement.append(nextLine);
if (nextLine.endsWith(";")) {
stmt.execute(nextStatement.toString());
nextStatement = new StringBuffer();
}
}
conn.commit();
}
finally {
if (conn != null)
conn.close();
}
}

注意:

例を簡単にするため、前の例ではエラー処理を省略しています。

次の例に示すように、データベース初期化コード(前の例を参照)をLifeCycleListenerImplのstartメソッドから起動します。

public void start() {
try {
initializeDatabaseFromScript();
}
catch (Exception e) {
Trace.log(Utility.FrameworkLogger,
Level.SEVERE,
LifeCycleListenerImpl.class,
"start",
e);
}
}

18.2.3 デスクトップ上でデータベースを初期化する方法

データベースは、同じデータベース・ファイルを使用してiOS、Android、Windows、LinuxおよびMacの各プラットフォームで初期化できます。複雑になる場合は、サード・パーティ製ツールを使用してデータベースをデスクトップで初期化して、アプリケーションのリソースとして応答ファイルをパッケージ化します。

データベースを使用するには、そのデータベースをMAFアプリケーションのApplicationControllerプロジェクトにリソースとして追加します。データベースは、META-INFディレクトリにsample.dbとして保存されているものとします。次の例は、アプリケーションからモバイル・デバイスのファイル・システムにデータベースをコピーしてデータベースへのアクセスを可能にするために追加する必要のあるコードを示しています。

private static void initializeDatabase() throws Exception {
InputStream sourceStream = null;
FileOutputStream destinationStream = null;
try {
// ApplicationDirectory returns the private read-write sandbox area
// of the mobile device's file system that this application can access.
// This is where the database is created
String docRoot = AdfmfJavaUtilities.getDirectoryPathRoot
(AdfmfJavaUtilities.ApplicationDirectory);
String dbName = docRoot + "/sample.db";

// Verify whether or not the database exists.
// If it does, then it has already been initialized
// and no furher actions are required
File dbFile = new File(dbName);
if (dbFile.exists())
return;

// Since the database has been packaged as a resource within
// the application, the getResourceAsStream method is used
sourceStream = Thread.currentThread().getContextClassLoader().
getResourceAsStream("META-INF/sample.db");
destinationStream = new FileOutputStream(dbName);
byte[] buffer = new byte[1000];
int bytesRead;
while ((bytesRead = sourceStream.read(buffer)) != -1) {
destinationStream.write(buffer, 0, bytesRead);
}
}
finally {
if (sourceStream != null)
sourceStream.close();
if (destinationStream != null)
destinationStream.close();
}
}

注意:

例を簡単にするため、前の例ではエラー処理を省略しています。

次の例に示すように、データベース初期化コード(前の例を参照)をLifeCycleListenerImplのstartメソッドから起動します。

public void start() {
try {
initializeDatabase();
}
catch (Exception e) {
Trace.log(Utility.FrameworkLogger,
Level.SEVERE,
LifeCycleListenerImpl.class,
"start",
e);
}
}

18.2.4 コミット処理に関する必知事項

SQLiteデータベースには、SQLスクリプトからの読取り時に文をコミットする、自動コミット機能があります。

Commit文があってもこれは無視されます。各文は、SQLスクリプトから読み込まれる際にコミットされます。この自動コミット機能は、SQLiteデータベースによってデフォルトで提供されます。アプリケーションのパフォーマンスを向上させるには、自動コミットを無効にして、ConnectionのsetAutoCommit(false)メソッドを使用することによるcommit文の通常の実行を可能にします。

18.2.5 MAFでのSQLite JDBCドライバの制限

java.sqlパッケージに含まれるResultSetのgetByteメソッドとStatementのexecuteメソッドには制限があり、MAFでのサポートがありません。

java.sqlパッケージからの次のメソッドは、MAF内では制限があるか、サポートされていません。

- ResultSetのgetByteメソッドはサポートされていません。使用した場合は、実行時にこのメソッドからSQLExceptionがスローされます。

- (ResultSetを戻す文に対してのみtrueを戻すのとは対照的に)Statementのexecuteメソッドは常にtrueを戻します。

18.2.6 VACUUMコマンドの使用方法

SQLiteデータベースのサイズは、レコードの削除後も一定のままで、断片化とパフォーマンスの低下の原因になります。VACUUMコマンドを使用して、パフォーマンスの低下を防止してください。

SQLiteデータベースからレコードが削除される場合、そのサイズは変更されません。この一定のサイズにより断片化が発生し、最終的にはパフォーマンスが低下します。パフォーマンスの低下を防ぐには、VACUUMコマンドを定期的に実行します。

注意:

大規模なデータベースに対してVACUUMコマンドを実行すると、長い時間がかかる場合があります(SQLiteが開発されたLinuxコンピュータで1MB当たり約0.5秒)。さらに、実行中は、元のファイルの2倍の一時ディスク領域が使用されます。

VACUUMコマンドは、適切に登録されているLifeCycleListenerの実装から実行する必要があります(「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照)。

18.2.7 データベースを暗号化および復号化する方法

SQLiteデータベースはAPIを使用して暗号化できるだけでなく、暗号化のパスワードを指定することもできます。独自のパスワードでデータベースを暗号化する手順、独自のパスワードで暗号化したデータベースを復号化する手順、MAFで生成されたパスワードを使用してデータベースを暗号化する手順、およびデータベースを復号化してMAFで生成されたパスワードを削除する手順を使用してください。

MAFでは、初期またはそれ以降に各種APIを使用して暗号化したSQLiteデータベースを提供できます。一部のAPIでは、データベースの暗号化に独自のパスワードを指定できます。MAFにパスワードを生成させる場合、または(オプションで)管理させる場合は、他のAPIを使用します。

18.2.7.1 独自のパスワードでのデータベースの暗号化

独自のパスワードでデータベースを暗号化する手順を使用してください。

独自のパスワードでデータベースを暗号化するには、次の手順を実行します。

1. データベース接続を確立します(「データベースへの接続方法」を参照)。

2. 次のユーティリティ・メソッドを使用して、新しいキーでデータベースを暗号化します。

AdfmfJavaUtilities.encryptDatabase(connection, "newPassword");

18.2.7.2 独自のパスワードで暗号化されたデータベースの永久的な復号化

独自のパスワードで暗号化したデータベースを復号化する手順を使用してください。

独自のパスワードで暗号化されたデータベースを永久的に復号化するには、次の手順を実行します。

1. 正しいパスワードを使用して暗号化されたデータベースを開きます。

2. 次のユーティリティ・メソッドを使用します。

AdfmfJavaUtilities.decryptDatabase(connection);

注意:

データベースを不正に開いて(不正なパスワードを使用して暗号化されたデータベースを開くなど)、再び暗号化した場合は、以前の正しいパスワード、不正なパスワード、新しいパスワードのいずれでもデータベースのロックを解除できなくなり、取り返しのつかないデータの損失につながります。

18.2.7.3 MAFで生成されたパスワードでのデータベースの暗号化

MAFで生成されたパスワードを使用してデータベースを暗号化する手順を使用してください。

MAF生成のパスワードでデータベースを暗号化するには、次の手順を実行します。

1. 次のメソッドを使用して、パスワードを生成します。

GeneratedPassword.setPassword("databasePasswordID", "initialSeedValue");

このメソッドには、暗号化機能が強力なパスワードを生成できるように、一意の識別子および初期シード値の両方が必要です。

2. 次のように事前に指定したIDを使用して、作成されたパスワードを取得します。

char[] password = GeneratedPassword.getPassword("databasePasswordID");

3. データベース接続を確立します(「データベースへの接続方法」を参照)。

4. データベースを次のように暗号化します。

AdfmfJavaUtilities.encryptDatabase(connection, new String(password));

18.2.7.4 MAFで生成されたパスワードで暗号化されたデータベースの復号化

データベースを復号化してMAFで生成されたパスワードを削除する手順を使用してください。

データベースを復号化してMAF生成のパスワードを削除するには、次の手順を実行します。

1. 正しいパスワードを次のように取得します。

char[] password = GeneratedPassword.getPassword("databasePasswordID");

2. データベース接続を確立し、次のようにデータベースを復号化します。

java.sql.Connection connection =
SQLite.JDBCDataSource("jdbc:sqlite:/path/to/database").
getConnection(null, new String(password));

3. オプションで、次のメソッドを使用して生成されたパスワードを削除します。

GeneratedPassword.clearPassword("databasePasswordID");

19 MAF AMXアプリケーション機能アーティファクトのカスタマイズ

この章では、既存のMAF AMXページ、タスク・フローおよびページ定義ファイルのカスタマイズ方法について説明します。

この章の内容は次のとおりです。

- MAF AMXページおよびアーティファクトのカスタマイズの概要

- MAF AMXページおよびアーティファクトのカスタマイズ

19.1 MAF AMXページおよびアーティファクトのカスタマイズの概要

JDeveloperとOracle Metadata Serviceには、既存のMAF AMXアプリケーション機能のアーティファクトとメタデータ・ファイルをカスタマイズする、標準のカスタマイズ・メカニズムがあります。カスタマイズは、アプリケーションのデプロイメント時に適用され、実行時に確認できます。

JDeveloperおよびOracle Metadata Service (MDS)により提供される標準のカスタマイズ・メカニズムを使用して、次のものを含む既存のMAF AMXアプリケーション機能アーティファクトおよびメタデータ・ファイルをカスタマイズできます。

- MAF AMXファイル(.amx)。

- タスク・フロー・ファイル(ViewController-task-flow.xmlなど)。

- ページ定義ファイル(<ページ名>.PageDef.xml)。

- データ・コントロールXMLファイル(データ・コントロール構造ファイルを含むパッケージ・ファイル(つまり、データ・コントロール名の前にpersdef.が付いた名前のパッケージ・ファイル))。

デザインタイムに行ったカスタマイズの変更は、デプロイメント中にファイルに適用され、ランタイムに表示されるようになります。MAF AMXは、特定のカスタマイズ・コンテキストの最終バージョンがデプロイメント中にシードされ、そのカスタマイズ・コンテキストに対してランタイムに静的に動作する、静的シード・カスタマイズをサポートしています。カスタマイズ・コンテキストごとに個別のMAFアプリケーションをデプロイする必要があります。

注意:

MAF AMXでは、ランタイムにカスタマイズの作成および適用の両方を実行するユーザー・カスタマイズをサポートしていません。

「MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ」を参照してください。

19.2 MAF AMXページおよびアーティファクトのカスタマイズ

ID-prefixトークンは、カスタマイズ・レイヤーの構成時に追加され、AMXページとアーティファクトのカスタマイズが正確に適用されるようになります。

MAF AMXページおよびアーティファクトをカスタマイズするには、「MDSカスタマイズをMAFファイルに適用する方法の概要」で説明している手順に従います。

カスタマイズ・レイヤーを構成する際は、IDの一意性を確保してカスタマイズが正確に適用されるように、id-prefixトークンを追加できます。カスタマイズ中に新規要素(commandButtonなど)をMAF AMXページに追加すると、レイヤーとレイヤー値のid-prefixが要素の自動生成識別子に追加され、カスタマイズ・メタデータ・ファイルで新たに追加された要素のidが作成されます。次の例に示すように、siteレイヤーに" s "というid-prefixが付けられ、headquartersレイヤー値に" hq "というid-prefixが付けられています。

<cust-layers  xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer name="industry" id-prefix="i">
<cust-layer-value value="financial"
display-name="Financial"
id-prefix="f"/>
<cust-layer-value value="healthcare"
display-name="Healthcare"
id-prefix="h"/>
</cust-layer>
<cust-layer name="site" id-prefix="s">
<cust-layer-value value="headquarters"
display-name="HQ"
id-prefix="hq"/>
<cust-layer-value value="remoteoffices"
display-name="Remote"
id-prefix="rm"/>
</cust-layer>
</cust-layers>

ヒント・レイヤーとしてsite/headquartersを選択して、MAF AMXボタン・コンポーネントをページに追加すると、メタデータ・カスタマイズ・ファイルでcommandButton要素に shqcb1 というidが設定されます。

カスタマイズ・プロセスが完了すると、JDeveloperによりカスタマイズ用のメタデータ・ファイルとこれらを格納するサブパッケージが作成されます。メタデータ・ファイルにはカスタマイズしたオブジェクトのカスタマイズが含まれ、これらは実行時にベース・メタデータに適用されます。図19-1、図19-2、図19-3および図19-4に示すとおり、JDeveloperにより、オブジェクトのベース・ファイルと同じ名前に.xml拡張子を追加した名前が新しいメタデータ・ファイルに付けられます。

図19-1 MAF AMXページのカスタマイズ・ファイル

図19-2 タスク・フローのカスタマイズ・ファイル

図19-3 ページ定義のカスタマイズ・ファイル

図19-4 データ・コントロールXMLファイルのカスタマイズ・ファイル

20 リモートURLを使用したアプリケーション機能コンテンツの実装

この章では、デバイス・サービスに対して、リモートURLからのコンテンツを使用するアプリケーション機能をアクセス可能(または制限可能)にする方法について説明します。また、MAFでホワイトリストを実装する方法と、MAFアプリケーションのWebビューでレンダリングされるリモートURLページでナビゲーション・バーを有効にする方法についても説明します。

この章の内容は次のとおりです。

- リモートURLアプリケーションの概要

- リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化

- MAFアプリケーションでのリモートURLのホワイトリストへの追加

- リモートURLページでのブラウザ・ナビゲーション・バーの有効化

20.1 リモートURLアプリケーションの概要

maf-feature.xmlファイルの概要エディタでリモートURLコンテンツ・タイプを使用するアプリケーション機能にURL接続を作成することにより、サーバー・ホスト型のアプリケーションにアクセスできます。

次に示すように、このようなサーバー・ホスト型のアプリケーションは、偶発的な使用を目的としていて、デバイスのメモリーまたはサービス(カメラ、連絡先、GPSなど)に直接アクセスできない点が、MAF AMX、ローカルHTML、またはObjective-Cなどのプラットフォーム固有言語で記述されたクライアント・アプリケーションとは異なります。そのかわりに、これらのやり取りはデバイス・ブラウザの機能に左右されます。リモートURLコンテンツの構成の詳細は、「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」を参照してください。

図20-1 リモートURLコンテンツの構成

20.2 リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化

MAFのWebビュー内で開かれるリモートURLアプリケーションは、Apache Cordova JavaScript APIを使用してデバイス機能にアクセスし、MAF JavaScript APIを使用してMAFコンテナ・サービスにアクセスします。

このアクセスを可能にするには、base.jsライブラリを参照するJavaScriptの<script>タグ使用します。

サーバーによってレンダリングされたWebアプリケーション内からMAFまたはCordova JavaScript APIにアクセスするには(たとえば、EL式の取得と設定、アプリケーションに関する情報の取得、写真の撮影、コンタクト先へのアクセスなど)、base.jsのインクルード時に仮想パス/~maf.device~/を使用して、ブラウザがリクエストをリモート・サーバーではなくMAFリソースに対するものとして識別できるようにする必要があります。このアプローチはリモートとローカルの両方のHTMLページで機能するので、(提供元にかかわらず) base.jsをHTML機能にインクルードする方法として最適です。次の例に、デバイスのHTMLページまたはリモートのHTMLページからbase.jsをインクルードする方法を示します。

<html>
<head>
<script src="/~maf.device~/www/js/base.js"></script>
...

コンテナ・コードでは、リクエストされたURLの/~maf.device~/を読み取ると、次の例に示すように、そのURLをローカルに解決してネイティブ・リクエストとして処理します。

<script src="http://your.domain.ip/~maf.device~/www/js/base.js"></script>

your.domain.ipは、リモートURLからのドメインです。

次に、MAFがコンテナ・コード内のファイル・システムからファイルを読み取って、ローカル・ファイル・コンテンツをWebビューに送信します。

すでに説明したように、仮想パス/~maf.device~/の使用に加え、そのコンテンツ・タイプとしてリモートURLのアプリケーションを指定するアプリケーション機能のmaf-application.xmlファイルで、ネイティブ・アクセスを許可するプロパティ(allowNativeAccess)がデフォルト値のtrueに設定されていることを確認します。次の例は、maf-application.xmlソース・ファイル内のこのプロパティを示しています。

<adfmf:featureReference refId="remoteAppfeature1" id="fr1" allowNativeAccess="true"/>

このプロパティがfalseの場合、リモートURLアプリケーション機能はコンテナ・サービスにアクセスできません。

20.3 MAFアプリケーションでのリモートURLのホワイトリストへの追加

リモートURLアプリケーション機能にコンテナ・サービスへのアクセスを許可し、サービスにアクセスできるURLのリストを制限する場合に、ホワイトリストを使用します。

このタスクを実行することを一般に、ホワイトリストに追加すると言います。たとえば、図20-2には、http://www.oracle.comをレンダリングするリモートURLアプリケーションが示されています。図20-2のオンデマンドでWebcastを見るリンクを使用すると、oracle.com以外のURLにナビゲートされると仮定します。oracle以外のURLにコンテナ・サービスへのアクセスを許可した場合、そのURLがどのようなアクションを実行するかわからず、また信頼できないため、これは望ましくありません。MAFアプリケーションでホワイトリストを実装すると、oracle.com URLへのアクセスを制限し、リモートURLアプリケーション機能にコンテナ・サービスへのアクセスを許可している場合に、信頼できないURLがコンテナ・サービスにアクセスできないようにすることができます。

MAFアプリケーションでホワイトリストを実装する場合は、Cordovaプラグインを使用します。Cordovaプラグインによるホワイトリストの実装方法の概要は、https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/index.htmlで、Apache Cordovaドキュメントの『Whitelist Guide』を参照してください。

Apache Cordovaからは、AndroidにデプロイするMAFアプリケーションでホワイトリストを実装するように構成できるプラグイン(cordova-plugin-whitelist)が提供されています。このプラグインをダウンロードし、変更し、ホワイトリスト・エントリを構成して、MAFアプリケーションに登録します。iOSおよびUWPの場合は、自分で開発または変更したプラグインのplugin.xmlでホワイトリスト・エントリを構成します。

ヒント:

Android用のApache Cordovaプラグイン(cordova-plugin-whitelist)のplugin.xmlファイルを、Android、iOSおよびUWPそれぞれについてホワイトリスト・エントリを使用して構成します。このアプローチでは、MAFアプリケーションをデプロイするすべてのプラットフォームのホワイトリストを実装する1つのプラグインをMAFアプリケーションに登録します。次の各項では、各プラットフォームのホワイトリストの実装方法を示す、サンプルplugin.xmlエントリを示します。

具体的な情報は次のリンクを参照してください。

- Androidプラットフォームの場合は、「AndroidプラットフォームでリモートURLをホワイトリストに追加する方法」を参照してください。

- iOSプラットフォームの場合は、「iOSプラットフォームでリモートURLをホワイトリストに追加する方法」を参照してください。

- ユニバーサルWindowsプラットフォームの場合は、「ユニバーサルWindowsプラットフォームでリモートURLをホワイトリストに追加する方法」を参照してください。

図20-2 MAF WebビューのリモートURL

20.3.1 AndroidプラットフォームでリモートURLをホワイトリストに追加する方法

AndroidにデプロイするMAFアプリケーションでホワイトリストを実装するには、Cordovaプラグインを作成します。

または、cordova-plugin-whitelistプラグインをダウンロードして、次のように変更します。

- テキスト・エディタでファイルsrc/android/WhitelistPlugin.javaを開きます。

- 次の各メソッドで、return null;をreturn false;に変更します。

- shouldAllowNavigation(String url)

- shouldAllowRequest(String url)

- shouldOpenExternalUrl(String url)

- 変更したファイルを保存します

plugin.xmlファイルでホワイトリスト・エントリを構成し、このファイルをMAFアプリケーションに登録します。cordova-plugin-whitelistの詳細は、https://cordova.apache.org/docs/en/latest/cordova-plugin-whitelist/でApache Cordovaドキュメントを参照してください。後者のドキュメントでは、プラグインを使用して、ナビゲーションおよびネットワーク・リクエスト・ホワイトリストを実装する方法およびコンテンツ・セキュリティ・ポリシーを実装する方法を示すサンプルが提供されます。

次のサンプルは、oracle.comドメインからのHTTPおよびHTTPS URLをホワイトリストに追加するようにplugin.xmlファイルを構成する方法を示しています。

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-whitelist" version="1.2.2">

<name>Whitelist</name>
<description>Cordova Network Whitelist Plugin</description>
<license>Apache 2.0</license>
<keywords>cordova,whitelist,policy</keywords>

<engines>
<engine name="cordova-android" version=">=4.0.0" />
</engines>

<platform name="android">
<config-file target="res/xml/config.xml" parent="/*">
<allow-navigation href="http://*.oracle.com/*"/>
<allow-navigation href="https://*.oracle.com/*"/>
<feature name="Whitelist" >
<param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin"/>
<param name="onload" value="true" />
</feature>
</config-file>

<source-file src="src/android/WhitelistPlugin.java" target-dir="src/org/apache/cordova/whitelist" />

<info>
This plugin is only applicable for versions of cordova-android greater than 4.0. If you have a previous
platform version, you do *not* need this plugin since the whitelist will be built in.
</info>
</platform>
</plugin>

必要なホワイトリストの実装が完了したら、「MAFアプリケーションでの追加プラグインの登録」の説明に従って、プラグインをMAFアプリケーションに追加します。

MAFアプリケーションで使用するプラグインの開発の詳細は、「MAFアプリケーションでのプラグインの使用方法の概要」を参照してください。

20.3.2 iOSプラットフォームでリモートURLをホワイトリストに追加する方法

iOSにデプロイするMAFアプリケーションでホワイトリストを実装するには、Cordovaプラグインを作成します。

ホワイトリストを有効にするMAFアプリケーションで、Cordovaプラグインを開発または登録するか、その両方を行います。次のサンプルは、oracle.comドメインからのHTTPおよびHTTPS URLをホワイトリストに追加するために使用できるプラグインを示しています。

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="maf-ios-whitelist-plugin" version="1.0.0">

<name>Whitelisting</name>
<description>Plugin to white list remote URLs in a MAF app on iOS.</description>

<platform name="ios">
<config-file target="config.xml" parent="/*">
<allow-navigation href="http://*.oracle.com/*"/>
<allow-navigation href="https://*.oracle.com/*"/>
<feature name="CDVIntentAndNavigationFilter">
<param name="ios-package" value="CDVIntentAndNavigationFilter"/>
<param name="onload" value="true"/>
</feature>
</config-file>
</platform>
</plugin>

ホワイトリストは、ハイパーリンクおよび最上位レベルのURIに対して機能します。ホワイトリストは、XMLHttpRequestsを含むリソース・ローディングおよびHTML src属性で使用されるURIに対しては機能しません。

MAFアプリケーションで使用するプラグインの開発の詳細は、「MAFアプリケーションでのプラグインの使用方法の概要」を参照してください。プラグインの開発が完了したら、「MAFアプリケーションでの追加プラグインの登録」の説明に従って、プラグインをMAFアプリケーションに登録します。

20.3.3 ユニバーサルWindowsプラットフォームでリモートURLをホワイトリストに追加する方法

UWPにデプロイするMAFアプリケーションでホワイトリストを実装するには、Cordovaプラグインを作成します。

ホワイトリストを有効にするMAFアプリケーションで、Cordovaプラグインを開発または登録するか、その両方を行います。

次の注釈付きサンプルで、プラグインでホワイトリストを実装する方法を示すいくつかの例を参照してください。

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns=http://apache.org/cordova/ns/plugins/1.0 xmlns:uap=http://schemas.microsoft.com/appx/manifest/uap/windows10
id="maf-cordova-plugin-windows-whitelist" version="1.0.0">

<name>MAF Windows Whitelist</name>
<description>MAF Windows Plugin to whitelist URLs that have Window RT access</description>
<keywords>cordova,whitelist</keywords>

<!-- windows 10 -->
<platform name="windows">

<!-- In a MAF application, local package URLs have access to all Windows Runtime(RT) API. Access to Windows RT API is essential
for Cordova plugins that need to make device calls. External website URLs like: http:// and https:// do NOT have access to
Windows RT API by default in MAF. This plugin allows modifications to the application manifest so that Windows RT API
access and hence Cordova device access can be granted to external URLs.
-->

<config-file target="package.appxmanifest" parent="/Package/Applications/Application/uap:ApplicationContentUriRules">

<!-- The following example provides access to the Window RT API to a single page -->
<uap:Rule Match="http://example.com/crmapp/contacts/contact.html" Type="include" WindowsRuntimeAccess="all" />

<!-- The following example denies access to Window RT API to specific directories inside the package -->
<uap:Rule Match="ms-appx-web:///FARs/ViewController/public_html/noNativeAcessFeature/*" Type="include" WindowsRuntimeAccess="none" />

<!— The following example allows everything in the oracle.com domain to access the Windows RT API in the application-->
<uap:Rule Match="http://*.oracle.com/*" Type="include" WindowsRuntimeAccess="all" />

</config-file>
</platform>
</plugin>

必要なホワイトリストの実装が完了したら、「MAFアプリケーションでの追加プラグインの登録」の説明に従って、プラグインをMAFアプリケーションに追加します。

MAFアプリケーションで使用するプラグインの開発の詳細は、「MAFアプリケーションでのプラグインの使用方法の概要」を参照してください。

20.4 リモートURLページでのブラウザ・ナビゲーション・バーの有効化

MAFでは、MAFのWebビュー内で開く、リモートで供給されるWebコンテンツとして実装されるアプリケーション機能に対して、戻る、進むおよびリフレッシュの各アクション用のボタンが付いたナビゲーション・バーを追加できます。

図20-3に示すように、進むまたは戻るのいずれかの移動が不可能な場合は、進むと戻るのボタンが無効になります。

注意:

戻るボタンは、Androidデバイスでは無効になります。

図20-3 ナビゲーション・ボタンとリフレッシュ・ボタンを表示するリモートWebページ

20.4.1 リモートURLアプリケーション機能へのナビゲーション・バーの追加方法

maf-feature.xmlファイルの概要エディタの「コンテンツ」タブで、ユーザーがリモート・コンテンツを移動またはリフレッシュできるようにします。

始める前に:

「アプリケーション機能のコンテンツをリモートURLまたはローカルHTMLとして定義する方法」の説明に従って、まず「リモートURL」を選択し、次にホスト・サーバーへの接続を作成することにより、リモートでホストされるアプリケーションから配信されるアプリケーション機能のコンテンツを指定します。

ナビゲーション・バーを有効にするには:

1. maf-feature.xmlファイルの「機能」表にリストされている「リモートURL」アプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 図20-4に示すとおり、「ブラウザ・ナビゲーション・ボタンの表示」を選択します。

図20-4 ナビゲーション・オプションの選択

20.4.2 リモートURLアプリケーション機能のブラウザ・ナビゲーション・ボタンを有効にする場合の処理

JDeveloperでは、showNavButtonsと呼ばれる属性でadfmf:remoteURL要素を更新します。次の例に示すとおり、ここではtrueに設定されています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf">
<adfmf:feature id="oraclemobile" name="oraclemobile">
<adfmf:content id="oraclemobile.1">
<adfmf:remoteURL connection="connection1"
showNavButtons="true"/>
</adfmf:content>
</adfmf:feature>
</adfmf:features>

アプリケーションをデプロイすると、図20-5に示すとおり、MAFでは、進む、戻るおよびリフレッシュの各ボタンがリモートURLアプリケーション機能のホームページから移動されるWebページに適用されます。

Figure 20-5 リモートURLアプリケーション機能での移動

21 ユーザー・プリファレンスの有効化

この章では、アプリケーションレベルとアプリケーション機能レベルの両方のユーザー・プリファレンス・ページを作成する方法について説明します。

この章の内容は次のとおりです。

- モバイル・アプリケーションのユーザー・プリファレンス・ページの作成

- アプリケーション機能のユーザー・プリファレンス・ページの作成

- ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法

- プラットフォームによる表示の差異

21.1 モバイル・アプリケーションのユーザー・プリファレンス・ページの作成

プリファレンスによって、エンド・ユーザーが構成可能な設定を追加できます。

maf-application.xmlおよびmaf-feature.xmlの両方のファイル内で、<adfmf:preferences>要素を使用してユーザー・プリファレンス・ページを定義します。また、<adfmf:preferences>要素を使用して、各アプリケーション機能内でユーザーが管理するプリファレンスを作成します。

次の例に示すとおり、<adfmf:preferenceGroup>と呼ばれる<adfmf:preferences>の子要素とその子要素によってユーザー・プリファレンスを定義し、これには、テキスト文字列、ドロップダウン・メニューや、このケースのようにアプリケーション設定の追加オプションをユーザーに提示する子ページなど、様々な形でオプションを提示するページを作成します。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
name="MobileApplication"
id="com.company.MobileApplication"
appControllerFolder="ApplicationController"
version="1"
vendor="oracle"
listener-class="application.LifeCycleListenerImpl">
<adfmf:description>This app created by Mobile Application Framework</adfmf:description>
<adfmf:featureReference id="PROD"/>
<adfmf:featureReference id="HCM"/>
<adfmf:featureReference id="Customers"/>
<adfmf:preferences>
<adfmf:preferenceGroup id="a" label="Prefs Group A">
<adfmf:preferenceBoolean id="a1_sound" label="Sound Effects"/>
<adfmf:preferenceNumber id="a2_retries" label="Retries" default="3"/>
<adfmf:preferenceList id="a3_background" label="Background" default="3">
<adfmf:preferenceValue name="None" value="0" id="pv4"/>
<adfmf:preferenceValue name="Field" value="1" id="pv1"/>
<adfmf:preferenceValue name="Galaxy" value="2" id="pv5"/>
<adfmf:preferenceValue name="Mountain" value="3" id="pv6"/>
</adfmf:preferenceList>
<adfmf:preferenceText id="a4_name" label="Default Name"/>
<adfmf:preferencePage id="aa" label="Prefs SubGroup AA">
<adfmf:preferenceGroup id="aa_sec" label="Security">
<adfmf:preferenceBoolean id="aa_sec_useSec" label="Use Security"/>
<adfmf:preferenceNumber id="aa_sec_timeout" label="Timeout (secs)" default="120"/>
</adfmf:preferenceGroup>
</adfmf:preferencePage>
</adfmf:preferenceGroup>
<adfmf:preferenceGroup id="b" label="Prefs Group B">
<adfmf:preferenceBoolean id="b_cloudSync" label="Cloud Sync"/>
<adfmf:preferenceList id="b_dispUsage" label="Display Usage As" default="1">
<adfmf:preferenceValue name="Percent" value="1" id="pv2"/>
<adfmf:preferenceValue name="Minutes" value="2" id="pv3"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:application>

図21-1は、子ユーザー・プリファレンス・ページを開くことで、それに続くオプションを提供する方法の例を示しています。

図21-1 ユーザー・プリファレンス・ページ

プリファレンス・ページは<adfmf:preferenceGroup>要素内で定義され、次の子要素が存在します。

- <adfmf:preferencePage>: ユーザー・インタフェースに新しいページを指定します。

- <adfmf:preferenceList>: ユーザーに特定のオプション・セットを提供します。

- <adfmf:preferenceValue>: リスト要素を定義する子要素です。

- <adfmf:preferenceBoolean>: ブール設定です。

- <adfmf:preferenceText>: テキスト・プリファレンス設定です。

これらの要素とその属性の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

アプリケーションおよびアプリケーション機能レベルの両方のプリファレンス・ページを作成する例については、PrefDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内で次の場所にあるPublicSamples.zipファイルに置かれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

PrefDemoアプリケーションは、アプリケーションレベルの設定ページと、MAF AMXとして実装されている3つのアプリケーション機能のプリファレンス・ページで構成されています。図21-2は、通常の設定ページから起動する、PrefDemoアプリケーションの設定ページを示しています。この図では、プリファレンス設定ページをiOSの設定アプリケーションから起動しています。

図21-2 PrefDemoアプリケーションの設定ページ

図21-3で「App」、「Feature1」(これが選択されています)および「Feature 2」と表示されているアプリケーション機能のプリファレンス・ページでは、MAF AMXブール・スイッチ、入力テキストおよび出力テキストの各コンポーネントから構築されたプリファレンス・ページの例が示されており、これらのコンポーネントは、EL (式言語)を使用してアプリケーション機能やその内部に構成されている様々な<adfmf:preferences>コンポーネントにアクセスします。「ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法」を参照してください。

図21-3 PrefDemoアプリケーションに表示されたアプリケーション機能のプリファレンス・ページ

PrefDemoアプリケーションでは、ビュー・アクティビティとページ・リフレッシュが可能な制御フロー・ケースで構成される単一のバインド・タスク・フローによって、MAF AMXの各プリファレンス・ページが参照されます。

21.1.1 モバイル・アプリケーションレベルのプリファレンス・ページの作成方法

maf-application.xml概要エディタの「プリファレンス」ページ(図21-4を参照)では、<adfmf:preferenceGroup>内の子プリファレンス・ページ要素をネストすることでアプリケーションレベルのプリファレンス・ページ・セットを構築できます。このページでは、<adfmf:preferenceGroup>およびその子要素が同様に名付けられたオプション(「プリファレンス・ページ」、「プリファレンス・リスト」、「ブール型のプリファレンス」など)として示され、JDeveloperの「構造」ウィンドウと同様にこれらを階層(またはツリー)にアセンブルします。

図21-4 「プリファレンス・ページ」を使用したモバイル・アプリケーションレベルのプリファレンスの追加

maf-application.xmlファイルを正しく構成するには、図21-4に示す「プリファレンス」ページの「追加」ドロップダウン・リストを使用してユーザー・プリファレンス・ページを構築します。また、図21-5に示す「プリファレンス」パレットからコンポーネントをドラッグして、エディタ、「ソース」ウィンドウまたは「構造」ウィンドウのいずれかにドロップできる一方で、そのページのドロップダウン・リストには、選択されたプリファレンス要素に対して、適切な親、子または兄弟の関係を持つことができる要素のみが提示されます。たとえば、図21-4には、プリファレンス・グループ要素であるMobileApp内に挿入できるコンポーネントのみが示されています。また、このエディタでは、各プリファレンス要素に固有の属性に対して値を入力できます。

図21-5 「コンポーネント・パレット」内の「プリファレンス」

プリファレンス・ページを作成するには:

1. maf-application.xml概要エディタで「プリファレンス」をクリックします。

2. 「追加」をクリックして、親である<adfmf:preferenceGroup>要素を作成します。

3. 次の情報を「プリファレンス・グループの挿入」ダイアログ(図21-6を参照)に入力します。

図21-6 親プリファレンス・グループ要素の定義

- プリファレンス・グループ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。ユーザー・インタフェースにこのテキストを表示する方法の例は、図21-1の例を参照してください。

4. 「追加」をクリックし、「前に挿入」、「内部に挿入」、「後ろに挿入」の各オプションを使用してさらにプリファレンス・ページを定義し、XML文書が正しく構成されるようにします。

21.1.1.1 新しいユーザー・プリファレンス・ページの作成方法

プリファレンス・ページ・コンポーネントでは新しいユーザー・インタフェース・ページを作成できます。「前に挿入」、「内部に挿入」、「後ろに挿入」の各オプションを使用してプリファレンス・ページを作成します。

始める前に:

プリファレンス・グループ要素を作成する必要があります。

新しいユーザー・プリファレンス・ページを作成するには:

1. maf-application.xml概要エディタの「プリファレンス」ページで「プリファレンス・グループ」要素を選択します。この例では、プリファレンス・グループはMobileAppと呼ばれています。

2. 「追加」をクリックして「プリファレンス・グループの中に挿入」→「プリファレンス・ページ」を選択します(図21-7を参照)。

図21-7 プリファレンス・ページ・コンポーネントの選択

3. 「プリファレンス・ページの挿入」ダイアログ(図21-8を参照)に次のプリファレンス・ページ属性を定義します。

- プリファレンス・ページ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-8 「プリファレンス・ページの挿入」ダイアログ

4. プリファレンス・ページを選択し、図21-9に示すとおり、「プリファレンス・ページの中に挿入」→「プリファレンス・グループ」と選択することで、子プリファレンス・グループ要素を挿入し、プリファレンス・ページの本体を作成します。子プリファレンス・グループの一意の識別子と表示名を定義すると、これにプリファレンス・リスト要素などの他の要素を移入できます(「プリファレンス・ページを追加する場合の処理」を参照)。

図21-9 プリファレンス・グループのプリファレンス・ページへの追加

21.1.1.2 プリファレンス・ページを追加する場合の処理

概要エディタでプリファレンス・ページとその子プリファレンス・グループ・コンポーネントを定義すると、JDeveloperでは、次の例に示すように、属性を使用して<adfmf:preferencePage>が生成されます。<adfmf:preferencePage>は、親<adfmf:preferenceGroup>要素内にネストされます。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen"
label="MobileApp">
<adfmf:preferencePage id="application_version"
label="Version">
<adfmf:preferenceGroup id="version_select"
label="Select Your Version">
<adfmf:preferenceList id="edition"
label="Edition"
default="PERSONAL">
adfmf:preferenceValue name="Enterprise"
id="pv2"/>
<adfmf:preferenceValue name="Personal"
value="PERSONAL"
id="pv1"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferencePage>
</adfmf:preferences>

21.1.1.3 ユーザー・プリファレンス・リストの作成方法

プリファレンス・リスト・コンポーネントを追加してオプションのリストを作成します。

始める前に:

プリファレンス・リストまたは他のすべてのリストに関連するコンポーネントの親としてプリファレンス・グループを作成する必要があります。

ユーザー・プリファレンス・リストを作成するには:

1. 「プリファレンス・グループ」または「プリファレンス・ページ」を選択して、「追加」→「内部に挿入」→「プリファレンス・リスト」の順にクリックします。例21-10には、Select Your Versionという名前のプリファレンス・グループ・コンポーネントの子としてプリファレンス・リストを追加する例が示されています。

図21-10 プリファレンス・リスト・コンポーネントのプリファレンス・グループへの追加

2. 「プリファレンス・リストの挿入」ダイアログ(図21-11を参照)を使用して次の属性を定義し、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-11 「プリファレンス・リストの挿入」ダイアログ

3. 「プリファレンス値」表(図21-12を参照)で「追加」をクリックし、アイテムのリストを定義します。プリファレンス値を選択してから「削除」をクリックすることで、この値を削除することもできます。プリファレンス値の表示順番を変更するには、プリファレンス値を選択してから上および下の矢印を使用します。

ユーザーにデフォルト設定を提供するには、「デフォルト」を選択します。「プリファレンス・ページを追加する場合の処理」に示すように、<adfmf:preferenceList>要素内でデフォルト・ステータスは、default="ENTERPIRSE"と定義されています。

ヒント:

「追加」をクリックするほか、それらをドラッグして「構造」ウィンドウまたは「ソース」ウィンドウのいずれかにドロップしても、プリファレンス値コンポーネントを追加できます。

図21-12 プリファレンス値の追加

21.1.1.4 プリファレンス・リストを作成する場合の処理

プリファレンス・リスト・コンポーネントをプリファレンス・グループに追加し、一連のプリファレンス値を定義すると、「プリファレンス・ページを追加する場合の処理」に示すように、JDeveloperでは<adfmf:preferenceList>要素を使用して<adfmf:preferences>セクションが更新されます。

21.1.1.5 ブール型のプリファレンス・リストの作成方法

開始する前に、「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」を参照してください。

<adfmf:preferenceBoolean>要素は<adfmf:preferenceGroup>要素内にネストされる必要があるため、まずプリファレンス・グループ・コンポーネントを階層に挿入する必要があります。

ユーザー・ブール型リストを作成するには:

1. 図21-13のGPS設定など、プリファレンス・グループ要素を選択します。

図21-13 ブール型プリファレンスのプリファレンス・グループへの追加

2. 「ブール型のプリファレンスの挿入」ダイアログ(図21-14を参照)を使用して次の属性を定義し、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-14 「ブール型のプリファレンスの挿入」ダイアログ

3. デフォルト値のfalseをそのまま使用するか、trueを選択します。

21.1.1.6 ブール型のプリファレンスを追加する場合の処理

ブール型のプリファレンスを追加してそのデフォルト値を指定した場合、次の例に示すように、JDeveloperでは、<adfmf:preferenceBoolean>要素を使用してmaf-application.xmlファイルの<adfmf:preferences>セクションが更新されます。

<adfmf:preferencePage id="gps_tracking"
label="Your_GPS_Locations">
<adfmf:preferenceGroup id="gps"
label="GPS Settings">
<adfmf:preferenceBoolean id="track_gps"
label="Automatically Track Location"
default="true"/>
</adfmf:preferencePage>

21.1.1.7 テキストのプリファレンスの追加方法

図21-15に示すように、挿入オプションを使用して、ユーザーが情報を格納したりデフォルト・テキストを閲覧できるようにする「テキストのプリファレンス」というダイアログを作成します。図21-15は、「セキュリティ」という名前のプリファレンス・グループ内にテキストのプリファレンスを作成する例を示しています。

図21-15 「テキストのプリファレンス」の挿入

始める前に:

プリファレンス・グループ要素を作成します。

テキストのプリファレンスを作成するには:

1. プリファレンス・グループ要素を選択します。

2. 「内部に挿入」→「テキストのプリファレンス」を選択します。

3. 「テキストのプリファレンスの挿入」ダイアログ(図21-16を参照)に次の情報を入力して、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図21-16 「テキストのプリファレンスの挿入」ダイアログ

4. テキストのプリファレンス・ダイアログに次を定義します。

- デフォルトのテキスト値を入力します。

- テキストのプリファレンスを非表示にするには、「機密」を選択します。

図21-17 テキストのプリファレンスの定義

21.1.1.8 テキストのプリファレンスを定義する場合の処理

テキストのプリファレンスを追加してそのデフォルト値を指定した場合、次の例に示すように、JDeveloperでは、<adfmf:preferenceText>要素を使用してmaf-application.xmlファイルの<adfmf:preferences>セクションが更新されます。

<adfmf:preferenceGroup id="security" label="Security">
<adfmf:preferenceText id="serviceURL"
label="Security URL"
default="http://security.example.com/provider"/>
<adfmf:preferenceText  id="username"
label="User Name"/>
<adfmf:preferenceText  id="password"
label="Password"
secret="true"/>
</adfmf:preferenceGroup>

セキュリティURL、ユーザー名およびパスワードのプリファレンス設定を定義するプリファレンス・グループ要素は図21-18のように表示されます。

図21-18 テキストのプリファレンス

図21-18は、セキュリティURLがシードされた値、ユーザー名が入力値の<adfmf:preferenceText>要素を示しています。MAFのプリファレンスはiOS設定アプリケーションと統合されているため、パスワード入力テキストのsecret="true"属性により、ユーザーの入力を黒丸で覆うiOSの表記規則に従うアプリケーションとなります。『Settings Application Schema Reference』のisSecureテキスト・フィールド要素の詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)および「プラットフォームによる表示の差異」を参照してください。

21.1.2 アプリケーションレベルのプリファレンス・ページを作成する場合の処理

モバイル・アプリケーションをデプロイすると、アプリケーション全体のプリファレンス設定ページがiOSデバイスの設定アプリケーションなど、デバイスのグローバル設定アプリケーションに伝播されます。「デプロイメントでのプリファレンスの変換」を参照してください。

21.2 アプリケーション機能のユーザー・プリファレンス・ページの作成

アプリケーション機能をモバイル・アプリケーションと別個に配布するには、そのアプリケーション機能を含む機能アプリケーション・アーカイブ(FAR) .jarファイルを、別のモバイル・アプリケーションのライブラリに追加します。

その後、このアプリケーション機能を、アプリケーションのmaf-application.xmlファイル内で参照します。アプリケーション機能において、使用先のアプリケーション用に定義した全般的なプリファレンスだけでなく、特定のユーザー・プリファレンスのセットが必要になる場合は、maf-feature.xmlの概要エディタの「プリファレンス」タブを使用して、該当するプリファレンスを定義できます(図21-19を参照)。「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」で説明されているように、アプリケーション・レベルのプリファレンスと同じ方法でアプリケーション機能のプリファレンスを構築します。maf-feature.xmlファイルにプリファレンスを定義した後で、「UIコンポーネントの作成と使用方法」で説明されているように、ブール・スイッチ、入力および出力コンポーネントが埋め込まれているMAF AMXページを参照するアプリケーション機能を作成することで、実際のプリファレンス・ページを作成します。

図21-19 アプリケーション機能レベルのプリファレンスの設定

21.3 ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法

アプリケーション機能レベルのプリファレンス・ページを作成する際は、EL式をMAF AMXコンポーネントに追加します。

入力テキスト・コンポーネントなどのMAF AMXコンポーネントを次の例に示します。

<amx:inputText label="Number" id="it1" inputType="number"
value="#{preferenceScope.feature.Feature1.f1top.f1Number}"/>

この例に示すとおり、EL式では、preferenceScopeオブジェクトを使用して、アプリケーションがアプリケーション機能レベルのプリファレンスにアクセスできるようにします。これらのEL式の書式は次のとおりです。

preferenceScope.feature.feature-id.group-id.property-id

図21-20は、式ビルダーを使用したEL式の作成について説明しています。アプリケーション機能(<adfmf:feature id="Feature1">)のID、プリファレンス・グループ(<adfmf:preferenceGroup id="f1top">)のID、プリファレンス・プロパティ(<adfmf:preferenceNumber id="f1Number">)のIDなど、maf-feature.xml内の様々なコンポーネントに対して構成されるIDによってプリファレンス自体が指定されています。

EL式には、ゼロ個以上のgroup-id要素およびproperty-id要素が含まれる可能性があります。

図21-20 プリファレンスに対するEL式の構築

21.3.1 preferenceScopeに関する必知事項

EL式には次の解決パターンがあります。

- JavaScriptレイヤーから、次のJavaScript関数を使用してEL値式を解決します。

adf.mf.el.getValue(expression, success, failed)

adf.mf.el.getValueの解決では、まずJS-ELパーサーとJavaScriptコンテキスト・キャッシュをローカルで使用して式の解決を試みます。式がローカルで解決できない場合は、その式を埋込みJavaレイヤーに評価用として渡し、そこでJava ELパーサーによって解決されます。これは、モデルのgetValueメソッドに対するGenericInvokeRequestを使用して処理されます。

- Javaレイヤーで、次の手法を使用してEL値式を解決します。

String val = AdfmfJavaUtilities.evaluateELExpression("#{preferenceScope.feature.f0.vendor}");

setValueメソッドでは、次のように式を解決します。

ValueExpression ve = AdfmfJavaUtilities.getValueExpression("#{preferenceScope.feature.f0.vendor}");
ve.setValue(AdfmfJavaUtilities.getADFELContext(), value);

EL式の評価には、preferenceScopeオブジェクトの検索が含まれます。評価は左から右に行われ、各トークンは別個に解決されます。トークンが解決されると、これは次の(その右側の)トークンの解決に使用されます。

preferenceScopeオブジェクトがない場合は、プリファレンスを公開できません。preferenceScopeオブジェクトの詳細は、「モバイル・アプリケーション・フレームワークのオブジェクト・カテゴリについて」を参照してください。

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プリファレンス・ページでは、MAFアプリケーションをデプロイするプラットフォームでネイティブのルック・アンド・フィールが維持されます。

その結果、MAFのプリファレンス・ページの表示はサポートされるプラットフォームで異なります。表21-1は、AndroidとiOSプラットフォーム間の表示の違いを示しています。iOSプラットフォームではプリファレンスがインラインで表示されるため、そのシステムではダイアログ・ページを起動しません。いくつかの例外を除いて、Androidプラットフォームではこれらのコンポーネントがダイアログで表示されます。

表21-1 プラットフォームごとのプリファレンス・コンポーネントの比較

コンポーネント

iOS

iOSの表示例

Android

Androidの表示例

プリファレンス・グループ(カテゴリ選択)

iOSでは、その親プリファレンス・グループ内にプリファレンス要素が表示されます。

Androidでは、その親プリファレンス・グループ内にプリファレンス要素が表示されます。

ブール型のプリファレンス・リスト

ブール型のプリファレンスは、onとoffなどのペアの値で表示されます。

Androidでは、ブール型のプリファレンスをチェック・ボックスで表示します。

テキストのプリファレンス

iOSはテキストをインラインで表示します。

Androidはデフォルト・テキストを入力フィールド内に表示します。

テキストのプリファレンス(機密入力テキスト)

iOSプラットフォームでは、ユーザーはテキストをインラインで入力し、各文字はその入力後に黒丸で覆われます。「テキストのプリファレンスを定義する場合の処理」を参照してください。

Androidでは、入力テキスト・ダイアログが起動し、各文字はその入力後に黒丸で覆われます。

単一のアイテム選択リスト(プリファレンス・リストから)

iOSプラットフォームでは別のプリファレンス・ページに単一のアイテム選択リストが表示されます。

Androidでは、ダイアログ内に単一のアイテム選択リストが表示されます。

プリファレンス・ページ

iOSでは、プリファレンス・グループから子プリファレンス・ページを起動します。

Androidでは、プリファレンス・グループから子プリファレンス・ページを起動します。

iOSおよびAndroidのプラットフォームには設定アプリケーションがありますが、図21-21のプリファレンスで示すように、設定アプリケーションへのアプリケーション・レベルのプリファレンスの統合はiOSプラットフォームのみでサポートされます。

図21-21 iOS設定アプリケーションでのOracleモバイル・プリファレンス

Androidデバイスでは、ユーザーは、アプリケーションが実行されている場合のみ、図21-22のようなアプリケーション固有のプリファレンス・ページにアクセスします。

図21-22 Androidデバイスのプリファレンス・メニュー

22 アプリケーション機能に関する制約の設定

この章では、ユーザーのアクセス権限またはデバイス要件に基づいてアプリケーション機能を制限できる制約の設定方法について説明します。

この章の内容は次のとおりです。

- 制約の概要

- アプリケーション機能の制約の定義

22.1 制約の概要

制約は、アプリケーション機能レベルまたはコンテンツ・レベルのどちらかで設定され、機能やコンテンツをいつ使用する必要があるかを示します。制約によってアクセスを制限できます。また、制約は実行時に評価されます。

制約には、アプリケーション機能またはアプリケーション・コンテンツを使用するタイミングが記述されています。制約では、ユーザーとユーザー・ロール、モバイル・アプリケーションの実行対象となるデバイス、およびデバイス上で使用可能なハードウェアに基づいて、アクセスを制限できます。制約は2つのレベルで設定でき、1つ目のアプリケーション機能レベルでは、ユーザーのデバイスにおけるアプリケーション機能の可視性を制御し、2つ目のコンテンツ・レベルでは、アプリケーション機能に対して配信できるMAFコンテンツのタイプを指定できます。maf-feature.xmlファイルの概要エディタを使用すると、これら両方のタイプの制約を設定できます。制約はMAFランタイムによって評価され、エンド・ユーザーが特定のコンテンツを表示または使用したり、アプリケーション機能自体にアクセスできるようにするには、trueに評価される必要があります。

22.1.1 制約を使用したアプリケーション機能の表示または非表示

MAF機能エディタの「コンテンツ」フォルダには、「制約」フォルダが保持されています。MAFランタイムは制約を評価して、設定された制約値に応じてコンテンツを表示または非表示にします。

「制約」タブ(図22-1を参照)では、アプリケーション機能レベルの制約を設定できます。たとえば、デバイスのカメラを使用するアプリケーション機能は、そのデバイスに実際にカメラ機能があることがMAFランタイムによって確認された場合にのみ、モバイル・アプリケーションのナビゲーション・バーまたはSpringboard内に表示されます。また、機能レベルの制約を使用すると、ユーザー・ロールと権限に基づいてアプリケーションを保護することもできます。図22-1に、MAFランタイムによって制約がtrueに評価されたときに、管理者権限を持つユーザーのみにアプリケーション機能へのアクセスを許可する制約を作成する方法を示します。ランタイムによって制約がfalseと評価された場合、アプリケーション機能はナビゲーション・バーまたはスプリングボード内に表示されないため、そのアプリケーション機能にユーザーはアクセスできなくなります。

図22-1 アプリケーション機能レベルの制約の設定

22.1.2 制約を使用した特定のコンテンツ・タイプの配信

デバイス・ハードウェア・プロパティなどのファクタに対応するため、単一のアプリケーション機能に複数のコンテンツ・タイプを指定し、ユーザー・インタフェースの様々なバージョンを配信できます。アプリケーション機能のコンテンツに関する制約を設定することで、アプリケーション・ページを表示できるユーザーや、そのページの使用方法を決定します。

たとえば、「コンテンツ」タブ(図22-2を参照)を使用して、管理権限を付与されたユーザーに特定のタイプのユーザー・インタフェースを表示し、基本的なユーザー権限を持つユーザーに別のユーザー・インタフェースを表示できます。また、コンテンツ・レベルの制約によって、デバイスのレイアウトに関する考慮事項に対応できます。図22-2は、この例として、サンプル・アプリケーションで、デバイスの画面幅に基づく制約を使用して、iPhoneとiPadのレイアウトにあわせて調整されたページをコールするAMXモバイル・タスク・フローを配信する方法を示しています。ユーザーがサンプル・アプリケーションを起動すると、MAFランタイムによって、Employeesアプリケーション機能に設定された制約が評価されます。ランタイムは、デバイス画面の対角線が6インチを超えることを確認した場合、Employees_pad_taskflow.xmlファイルを選択し、これにより、iPad用に設計されたMAF AMXページがコールされます。この制約がfalseに評価された(つまり、画面の対角線幅が6インチ未満の)場合は、ランタイムによって、iPhone固有のページをコールするMAFタスク・フローであるEmployees_phone_taskflow.xmlが選択されます。さらに、「コンテンツ」タブを使用すると、ランタイムによって特定のコンテンツが選択されたときに表示されるナビゲーション・バーとSpringboardのイメージを選択できます。コンテンツ固有のイメージを選択しなかった場合、MAFでは、「一般」タブで指定されたアプリケーション機能レベルのイメージが使用されます。

注意:

「アプリケーション機能の表示プロパティの設定」で説明されているように、イメージはプラットフォーム固有のガイドラインに準拠している必要があります。

図22-2 コンテンツ・レベルの制約の設定

サンプル・アプリケーションの詳細は、「サンプルのMAFアプリケーション」を参照してください。

22.2 アプリケーション機能の制約の定義

アプリケーション機能レベルの制約は、アプリケーションの使用を制限するために設定します。<adfmf:constraint>要素のproperty属性、operator属性、およびvalue属性を使用して制限を定義します。

アプリケーション機能レベルの制約を設定する際、<adfmf:constraint>要素(<adfmf:constraints>の子要素)のproperty、operatorおよびvalue属性を使用すると、ユーザー、デバイスまたはハードウェアに基づいてアプリケーションの使用を制限できます。次の例に示すこれらの属性の定義の例は、アプリケーション機能へのアクセスをField Repに制限し、さらにiOSデバイスでのみアプリケーションを実行するように制限する属性の定義を示しています。

<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="contains"
value="Field Rep"/>
<adfmf:constraint property="device.model"
operator="contains"
value="ios"/>
</adfmf:constraints>

22.2.1 アプリケーション機能に制約を定義する方法

MAF機能エディタの「制約」フォルダを使用して、選択したアプリケーション機能の制約を定義する手順を使用してください。

図22-2に示すように、「機能」ページの「制約」タブを使用して、選択したアプリケーション機能の制約を宣言的に構成します。

アプリケーション機能の制約を定義するには:

1. 「制約」タブをクリックします。

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ランタイムは、構成済のユーザー・ロールベースの制約および関連付けられた権限とユーザー・ログインを照合します。アプリケーション機能へのアクセスは、user.rolesとuser.privilegesに基づく制約を使用することで管理します。

ユーザーがモバイル・アプリケーションにログインした後、MAFランタイムでは、アプリケーション機能ごとに構成されたユーザー・ロールベースの制約を、アクセス制御サービス(ACS)によって取得されたユーザー・ロールと権限に対して調整します。その後MAFでは、制約を満たす権限を持つエンド・ユーザーにのみ、アプリケーション機能(またはアプリケーション機能のコンテンツ)を提供します。このようなユーザー権限とロールに関する制約を設定するだけでなく、「MAFログイン接続の作成」ダイアログに次の項目を入力することによって、モバイル・アプリケーション用のアクセス制御を作成できます(図22-3および「ログイン・ページの指定方法」を参照)。

- ユーザー・ロールと権限を送信するREST WebサービスのURL。

- アプリケーション機能によってチェックされるユーザー・ロールのリスト。

- 権限のリスト。

「アクセス制御サービスに関する必知事項」も参照してください。

図22-3 ユーザー・ロールと権限の取得の構成

user.rolesおよびuser.privilegesに基づく制約を使用してアプリケーション機能へのアクセスを制御します。たとえば、アプリケーション機能へのアクセスをmanagerロールを持つユーザーのみに許可するには、user.roles contains managerの制約をアプリケーション機能の定義に追加する必要があります。

user.rolesおよびuser.privilegesでは、containsおよびnotの演算子を次のように使用します。

- contains: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれる場合、ランタイムではその制約をtrueに評価します。次の例には、contains演算子を使用したuser.rolesプロパティの使用方法が示されています。ユーザーのロールに従業員のロールが含まれている場合は、モバイル・アプリケーションにアプリケーション機能が表示されます。

<feature ...>
...
<constraints>
<constraint property="user.roles"
operator="contains"
value="employee" />
</constraints>
...
</feature>

- not: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれない場合、ランタイムではその制約をtrueに評価します。次の例では、ユーザーの権限にマネージャ権限が含まれる場合はアプリケーション機能が含まれません。

<feature ...>
...
<constraints>
<constraint property="user.privileges"
operator="not"
value="manager" />
</constraints>
...
</feature>

22.2.5 ハードウェア関連の制約について

ハードウェア関連の制約は、ハードウェアを使用する機能がデバイスで使用できるようにするために設定します。制約のhardware.hasCamera、hardware.screen.height、hardware.hasCompassなどは属性値のtrueまたはfalseで定義して、その値がtrueの場合は機能を使用できるようにします。

ハードウェア・オブジェクトは、カメラの有無、コンパス向首方向情報提供機能、ファイルの保存機能など、デバイスで使用可能なハードウェアを参照します。次のプロパティではequal演算子が使用されます。

- hardware.networkStatus: アプリケーションの起動時にネットワークの状態が表示されます。NotReachable、CarrierDataConnectionおよびWiFiConnectionの3つの属性値を使用してこのプロパティを変更できます。次の例は、後者の値を示しています。その例に示すとおり、この値を設定することで、デバイス・ハードウェアがWi-Fi接続があることを示している場合にのみモバイル・アプリケーションにこのモバイル・アプリケーション機能が表示されることになります。つまり、デバイスにWi-Fi接続がない場合は、モバイル・アプリケーションをロードしても、そのアプリケーション機能は表示されません。

<feature ...>
...
<constraints>
<constraint property="hardware.networkStatus"
operator="equal"
value="WiFiConnection" />
</constraints>
...
</feature>

注意:

この制約は、iOSデバイスの起動時に評価されます。起動時にデバイスにWi-Fi接続がなく、その後その接続を取得した場合(ユーザーがWi-Fiのホットスポットに入った場合など)、アプリケーション機能は無効のままとなり、ユーザーがモバイル・アプリケーションを停止し再起動するまで利用できません。

- hardware.hasAccelerometer: デバイスに加速度計があるかどうかを示します。このプロパティは、trueまたはfalseの値で定義します。次の例は、trueの値を示しており、ハードウェアに加速度計がある場合にのみこのアプリケーション機能が利用可能なことを示しています。

<feature ...>
...
<constraints>
<constraint property="hardware.hasAccelerometer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアにはすべて加速度計があるため、このプロパティは常にtrueの値にして、iOSデバイスでアプリケーション機能が利用できるようにしておく必要があります。

- hardware.hasCamera: デバイスにカメラがあるかどうかを示します。この制約は、trueまたはfalseの属性値を使用して定義します。次の例では、値がtrueに設定され、デバイスにカメラが含まれる場合にのみアプリケーション機能が利用可能なことを示しています。

<feature ...>
...
<constraints>
<constraint property="hardware.hasCamera"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベース・ハードウェアにカメラが搭載されているわけではありません。この値は、iOSデバイスでモバイル・アプリケーションを起動した際に動的に評価されます。そのときに、モバイル・アプリケーションでは、trueに評価されないアプリケーション機能が削除されます。

- hardware.hasCompass: デバイスにコンパスがあるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseの属性値で定義します。

<feature ...>
...
<constraints>
<constraint property="hardware.hasCompass"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSデバイスにコンパスがあるわけではありません。この値は、iOSデバイスでモバイル・アプリケーションを起動した際に動的に評価されます。そのときに、モバイル・アプリケーションでは、trueに評価されないアプリケーション機能が削除されます。

- hardware.hasContacts: デバイスにアドレス帳またはコンタクト先があるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseの属性値で定義します。

<feature ...>
...
<constraints>
<constraint property="hardware.hasContacts"
operator="equal"
value"=true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアのコンタクト先はApache Cordova経由でアクセスされるため、iOSデバイスに対してはvalue属性は常にtrueに設定されます。

- hardware.hasFileAccess: デバイスでファイル・アクセスが可能かどうかを示します。次の例に示すように、この制約をtrueまたはfalseの属性値で定義します。ランタイムがこの制約をtrueに評価した場合にのみ、アプリケーション機能を利用できます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasFileAccess"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアのファイル・アクセスはApache Cordova経由でアクセスされるため、iOSデバイスに対してはvalue属性は常にtrueになります。

- hardware.hasGeoLocation: デバイスが地理的位置情報サービスを提供しているかどうかを示します。次の例に示すように、この制約をtrueまたはfalseの属性値で定義します。デバイスが地理的位置情報をサポートする場合にのみ、アプリケーション機能を利用できます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasGeoLocation"
operator="equal"
value="true"/>
</constraints>
...
</feature>

注意:

Apache Cordovaでは、すべてのiOSデバイスに対して地理的位置情報サービスへのアクセスを提供しているわけではありません。デバイスによっては、制約がランタイムにより評価された場合に、アプリケーション機能が利用できない可能性があります。

- hardware.hasLocalStorage: デバイスがファイルのローカル記憶域を提供するかどうかを示します。次の例に示すように、この制約をtrueまたはfalseのvalue属性で定義します。デバイスがローカルでのファイルの格納をサポートする場合にのみ、アプリケーション機能が表示されます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasLocalStorage"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

Apache CordovaではすべてのiOSハードウェアでローカル・ファイル記憶域へのアクセスが提供されるため、iOSデバイスに対するvalue属性は常にtrueになります。

- hardware.hasMediaPlayer: デバイスにメディア・プレーヤがあるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseのvalue属性で定義します。デバイスにメディア・プレーヤがある場合にのみ、アプリケーション機能が表示されます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasMediaPlayer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

Apache CordovaではiOSベースのハードウェアでメディア・プレーヤへのアクセスを提供しているため、iOSデバイスではvalue属性は常にtrueになります。

- hardware.hasMediaRecorder: デバイスにメディア・レコーダがあるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseのvalueで定義します。デバイス・ハードウェアがメディア・レコーダをサポートする場合にのみ、アプリケーション機能が含まれます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasMediaRecorder"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベースのハードウェアにApache Cordovaからアクセス可能なメディア・レコーダがあるため、すべてのiOSデバイスでこの値をtrueに設定します。Apple iTouchなどのいくつかのデバイスにはマイクがありませんが、ユーザーは外部マイクを取り付けることでレコーディングが可能になります。

- hardware.hasTouchScreen: ハードウェアにタッチ・スクリーン機能があるかどうかを示します。次の例に示すように、この制約をtrueまたはfalseのvalue属性で定義します。デバイス・ハードウェアがタッチ・スクリーンをサポートする場合にのみ、アプリケーション機能が含められます。

<feature ...>
...
<constraints>
<constraint property="hardware.hasTouchScreen"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベースのハードウェアにタッチ・スクリーン機能があるため、iOSデバイスのvalue属性をtrueに設定します。

- hardware.screen.width: デバイスの現在の向きでの画面幅を示します。画面幅を、デバイスに表示される実際のピクセルを表す物理デバイス・ピクセル単位ではなく、論理デバイス・ピクセル単位(次の例では320)で示す数値を入力します。この値はデバイスの向きによって異なります。

<feature ...>
...
<constraints>
<constraint property="hardware.screen.width"
operator="equal"
value="320" />
</constraints>
...
</feature>

注意:

この値はモバイル・アプリケーションの起動時に評価され、その際にランタイムが制約を評価し、trueに評価されない制約を持つアプリケーション機能は削除されます。モバイル・アプリケーションの起動後にユーザーがデバイスを回転させた場合、アプリケーション機能の設定はモバイル・アプリケーションの起動後に修正されるため、MAFランタイムではこの制約は再評価されません。

- hardware.screen.height: デバイスの現在の位置における画面高さを示します。次の例に示すように、320や480などの画面高(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

<feature ...>
...
<constraints>
<constraint property="hardware.screen.height"
operator="equal"
value="480" />
</constraints>
...
</feature>

注意:

モバイル・アプリケーションの起動時に、trueに評価されない制約を持つアプリケーション機能を削除するプロセスの一部として、MAFランタイムではこの制約の画面高さの値を評価します。モバイル・アプリケーションの起動後にユーザーがデバイスの向きを変えた場合は、アプリケーション機能の設定はモバイル・アプリケーションの起動後に修正されるため、ランタイムではこの制約は再評価されません。

- hardware.screen.availableWidth: デバイスの現在の向きで利用可能な画面幅を示します。次の例に示すように、320や480などの画面幅(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

<feature ...>
...
<constraints>
<constraint property="hardware.screen.availableWidth"
operator="equal"
value"320" />
</constraints>
...
</feature>

- hardware.screen.availableHeight: デバイスの現在の位置で利用可能な画面高さを示します。次の例に示すように、320や480などの画面幅(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

<feature ...>
...
<constraints>
<constraint property="hardware.screen.availableHeight"
operator="equal"
value"480" />
</constraints>
...
</feature>

22.2.6 アプリケーション機能およびコンテンツに関する動的制約の作成

EL式で定義した制約により、モバイル・アプリケーションはアプリケーション機能とコンテンツを動的にレンダリングするようになります。falseと評価されたEL式がその後でtrueと評価されることがあるという点で、EL式による定義には柔軟性があります。

name、operatorおよびvalue属性によって定義される静的制約に基づいてアプリケーション機能またはユーザー・インタフェース・コンテンツを表示または非表示にするだけでなく、EL式で制約を定義することによって、モバイル・アプリケーションでアプリケーション機能およびコンテンツを動的に表示することができます。EL式に基づいた制約の動的評価によって、独自のBean論理をコールする式を書いたり、複雑なEL式を書いたり、論理アクセスするアプリケーション・プリファレンスを書くことさえできます。制約をEL式として定義すると、EL式がfalseとして評価されたとき、MAFランタイムは、アプリケーション機能を当初は非表示にできますが、同じEL式がtrueとして評価されたときには後で表示することができます。次の例の遅延メソッド式に示しているように、<adfmf:constraintExpression>要素を使用すると、EL式を使用してアプリケーション機能に対する制約を定義できます。

<adfmf:constraints>
<adfmf:constraint id="c1" property="hardware.screen.dpi" operator="more" value="120"/>
<adfmf:constraint id="c2" property="device.model" operator="equal" value="iPad"/>
<adfmf:constraintExpression id="c3" value="#{myBean.checkConstraint}"/>
</adfmf:constraints>

この例は、maf-feature.xmlファイルの<adfmf:constraints>要素内で定義された静的制約間で<adfmf:constraintExpression>要素をネストする方法を示しています。Oracle Mobile Application Frameworkタグ・リファレンスを照してください。

22.2.6.1 静的な制約とEL定義の制約の組合せについて

MAFランタイムによる表示を有効にするには、静的制約のすべての条件がtrueに評価される必要があります。制約EL式がtrueとして評価された場合はアプリケーション機能およびコンテンツが表示され、式がfalseとして評価された場合はそれらが非表示になります。

22.2.6.2 動的な制約の定義方法

動的制約は、「制約式」コンポーネントを「ソース」エディタ内または「構造」ウィンドウ内にドラッグし、そのコンポーネントにEL式を移入して<adfmf:constraintExpression>を作成することで定義します。「制約式」コンポーネントを定義する手順を使用してください。

静的制約とは異なり、maf-feature.xml概要エディタを使用して、動的制約の作成および更新を行うことはありません。かわりに、「制約式」コンポーネントを「ソース」エディタまたは「構造」ウィンドウにドラッグすることで<adfmf:constraintExpression>を作成し、次に「式ビルダー」を使用してこのコンポーネントにEL式を移入します。

「制約式」コンポーネントを定義するには:

1. maf-feature.xmlファイルの「ソース」エディタを選択します。

2. <adfmf-constraints>要素に移動します。

3. 「コンポーネント」ウィンドウで、「共通」コンポーネントを選択します(図22-4を参照)。

図22-4 制約式コンポーネント

4. 「制約式」コンポーネントを選択し、次のいずれかの方法を使用して<adfmf-constraints>要素に追加します。

- 「コンポーネント」ウィンドウで、「制約式」コンポーネントをダブルクリックします。

- 「制約式」コンポーネントをソース・エディタの<adfmf-constraints>要素にドラッグします。

- 「制約式」コンポーネントを「構造」ウィンドウの「制約」ノードにドラッグします。

5. 図22-5に示すように、「constraintExpressionの挿入」ダイアログでEL式を入力するか、式ビルダー(このダイアログ内の「プロパティ・メニュー」アイコン(ギア)をクリックしてアクセス)を使用してEL式を作成します。

図22-5 InsertconstraintExpessionダイアログを使用したEL制約の定義

図22-6は、「ADFマネージドBean」カテゴリからEL式を作成する方法を示しています。ただし、制約のEL式は、「式ビルダーのカテゴリについて」で説明されているどのカテゴリからも作成できます。

注意:

adfc-mobile-config.xmlに定義されているアプリケーション・スコープのマネージドBeanのみが制約のEL式に使用できます。

図22-6 制約のEL式の構築

6. 「OK」をクリックします。

23 通知の有効化と使用方法

この章では、MAFアプリケーションにおけるローカル通知の表示、プッシュ通知メッセージの登録、およびそれらの処理方法を説明します。

この章の内容は次のとおりです。

- 通知の概要

- プッシュ通知の有効化

- ローカル通知の管理

- MAFが通知イベントをトリガーしたときのアプリケーション状態の判断

23.1 通知の概要

通知とは、ユーザーの操作なしで(アプリケーションの実行中はアプリケーション外部で)ユーザーが受信する警告やバナーなどのオーディオ信号、ビジュアル信号、またはオーディオ/ビジュアル信号のことです。プッシュ通知は、サーバーなどの外部ソースからモバイル・デバイス上の登録済アプリケーションに送信されます。また、ローカル通知は、アプリケーションによって送信され、そのアプリケーションによって受信されます。

通知は、モバイル・アプリケーションの標準のユーザー・インタフェース以外でユーザーに提供されるシグナルです。これらの通知は、アプリケーションの状態とユーザー設定に応じて、アラート・メッセージやバナーとして表示されます。通知は、視覚的に、または音で(あるいはその両方で)配信できます。

主な通知のタイプには、次の2つがあります。

- プッシュ通知は、サーバーなどの外部ソースからモバイル・デバイス上のアプリケーションに送信されます。通知を受信したユーザーは、アプリケーションを起動するか、その通知を無視できます。無視した場合はアプリケーションがアクティブになりません。
図23-1は、iOSデバイスにおけるプッシュ通知アラートを示しています。

図23-1 プッシュ通知

プッシュ通知を受信するには、アプリケーションを通知サービスに登録する必要があります。登録が成功すると、通知サービスからアプリケーションにトークンが発行されます。アプリケーションでは、このトークンを(リモート・サーバー上の)プロバイダと共有します。これにより、プロバイダから、通知サービスを通じてアプリケーションに通知を送信できるようになります。「プッシュ通知の有効化」で説明されているように、アプリケーションから提供された登録構成を使用して、アプリケーションのかわりにMAFによって登録が行われます。登録は、有効なトークンを確保するため、MAFアプリケーションのすべての起動時に発生します。登録が成功すると、MAFでは、プラットフォーム固有の通知サービスから取得したトークンをプロバイダと共有します。iOSの場合、この通知サービスはApple Push Notification Service (APNs)です。Google Cloud Messaging (GCM) for Androidでは、Androidデバイスにインストールされたアプリケーション用の通知サービスが提供されます。

MAFアプリケーションでは、その状態にかかわらずプッシュ通知を受信できます。これらのメッセージは、アプリケーションがフォアグラウンドで実行されていなくても表示される場合があり、その表示形式はMAFアプリケーションの状態とユーザー設定によって異なります。表23-1では、iOSオペレーティング・システムで、MAFアプリケーションの状態に応じて、どのようにプッシュ通知が処理されるかを説明します。

表23-1 iOSデバイスにおけるプッシュ通知の処理

状態

アクション

MAFアプリケーションはインストールされているが、実行されていない。

通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、MAFアプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。

MAFアプリケーションがバックグラウンドで実行されている。

通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、MAFアプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。

MAFアプリケーションがフォアグラウンドで実行されている。

通知メッセージは表示されません。アプリケーション通知ハンドラが呼び出されます。

iOSおよびAndroidプラットフォームでは、アプリケーションがフォアグラウンドで実行されていない場合、そのアプリケーションに関連付けられているすべてのプッシュ通知メッセージが、iOS Notification CenterやAndroidデバイス上の通知ドロワーなど、特定の場所に格納されます。

- ローカル通知は、モバイル・アプリケーション内から発信され、同じアプリケーションによって受信されます。通知は、モバイル・デバイスのプラットフォームでサポートされる標準メカニズム(バナーやサウンドなど)を通じてユーザーに配信されます。
MAFに附属するローカル通知抽象化APIを使用してアプリケーションを構成し、即座に通知を起動するか、将来の日時に通知するようスケジュールできます。また、通知の繰返しパターンを設定したり(毎日や毎週など)、スケジュール済の通知を取り消すことができます。

iOSとAndroidプラットフォームの両方で、MAFアプリケーションがフォアグラウンドで実行されている場合、通知はユーザーとの対話なしでアプリケーションに直接配信されます。アプリケーションがバックグラウンドで実行されているか、まったく実行されていない場合、通知はユーザーが通知をタップした後でアプリケーションに配信されます。

ユニバーサルWindowsプラットフォーム上のMAFアプリケーションは、ローカル通知またはプッシュ通知をサポートしていません。

23.2 プッシュ通知の有効化

アプリケーションでPushPluginプラグインを有効にし、MAF提供のAPIを使用するコードを記述します。

次のタスクを実行することで、プッシュ通知を有効にできます。

1. MAFアプリケーションは、次の図に示すように、概要エディタでmaf-application.xmlの「プラグイン」ページの「コア・プラグイン」セクションで、PushPluginを選択することによってプッシュ通知を受信できます。

注意:

デフォルトでは、MAFアプリケーションはプッシュ通知を許可されていません。

2. アプリケーション・コントローラ・プロジェクトで、アプリケーション・ライフサイクル・イベント・リスナー(ALCL)・クラスを登録します。「アプリケーション機能の表示プロパティの設定」および「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

3. ALCLにoracle.adfmf.application.PushNotificationConfigインタフェースを実装します。このインタフェースは、プッシュ通知サービスに正常に登録するのに必要な構成を提供します。

PushNotificationConfigインタフェースのgetNotificationStyleおよびgetSourceAuthorizationIdメソッドをオーバーライドおよび実装します。getNotificationStyleメソッドを使用すると、アプリケーションが登録する通知スタイルを指定できます。getSourceAuthorizationIdメソッドを使用すると、MAFアプリケーションへのメッセージの送信を許可されたアカウントの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());

注意:
iOS用MAFのデプロイメント・プロファイルには、プッシュ通知環境ドロップダウン・リストが表示されます。このドロップダウン・リストでは、ProductionまたはDevelopmentを選択して、デプロイ済アプリケーションをApple Push Notification Service (APNs)に登録できます。デフォルト値はProductionです。iOSにデプロイするMAFアプリケーションに、この値を適切に設定します。プッシュ通知を有効にするためにPushPluginプラグインも選択しないと、MAFは選択した値を無視します。詳細は、「iOSビルド・オプションの定義」を参照してください。

MAFサンプル・アプリケーション(PushDemoおよびPushServer)によって、プッシュ通知の処理方法を示します。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリのPublicSamples.zipファイル内にあります。

23.2.1 MCSからのプッシュ通知のためのデバイスの登録方法

MAFアプリケーションでプッシュ通知を有効にし、デバイスをMCSに登録して、デバイスのMCSからプッシュ通知を受信します。

MCSからのプッシュ通知をデバイスで受信できるようにするには、デバイスをMCSに登録する必要があります。登録はアプリケーションに固有であるため、各MAFアプリケーションをMCSに登録する必要がります。これを行う前に、プッシュ通知の有効化で説明されているように、MAFアプリケーションでプッシュ通知を有効にします。

MCSPersistenceManager内の次のメソッドを使用して、デバイスとアプリケーションの組合せをMCSに登録します。次のコードは、アプリケーションにmobile-persistence-config.propertiesファイルが含まれていることを前提にしています。このファイルは、MAFクライアント・データ・モデルの各ウィザードの使用時に生成され、MAFアプリケーションのデータ・モデルを作成します(「MAFアプリケーションでのクライアント・データ・モデルの作成」を参照)。

public String registerDevice(String token, String appId, String appVersion)

このメソッドは、プッシュ通知の有効化で説明されているように、EventListenerインタフェースを実装するプッシュ通知イベント・リスナー・クラスから呼び出すことができます。

このクラスでは、onOpenメソッドがMAFによって自動的に呼び出され、このメソッドにより、デバイスに登録する必要があるトークンが渡されます。サンプル・コードを次に示します。

public void onOpen(String token) {
try {
String result = new MCSPersistenceManager().registerDevice(token, "com.company.MyMAFApp", "1.0");
}
catch (Exception e) {
throw new AdfException(e.getLocalizedMessage(), AdfException.ERROR);
}
}

登録が成功したかどうかを確認するには、図23-2に示すように、MCS UIでデバイス登録ボタンをクリックします。

図23-2 MCSでのデバイス登録

図23-2に示すように、登録には、MCSに対する認証に使用されたユーザー名が含まれます。これは、前述のようにデバイスを直接onOpenメソッドで登録する場合、RESTサービスへの接続によるクライアント・データ・モデルの作成で説明されているように、登録では、「接続」ページで無名アクセス・キーを使用して指定した無名ユーザーが使用されるということです。これは、保護されている機能にユーザーがアクセスしようとすると、MAFログイン画面のみが表示されるためです。保護されている機能へのアクセスは、onOpenメソッドの実行を次に引き起こすライフサイクル・リスナーstartメソッドが実行されると行われます。登録済のすべてのデバイスにプッシュ通知を送信するだけの場合は、これは問題ではありません。ただし、ユーザー名に基づいてターゲット・デバイスにプッシュ通知を送信する場合は、MAFログイン後まで登録を延期する必要があります。これは、onOpenメソッドでは、トークンをアプリケーション・スコープの変数に格納してから、保護されている最初の機能において、デバイスを登録するためのコールを行う必要があるということです。

デバイスを登録解除するには、MCSPersistenceManagerクラス内の次のメソッドを使用します。

public String deregisterDevice(String token, String appId)

23.2.2 プッシュ通知ペイロードに関する必知事項

JSON形式のプッシュ通知ペイロードには、alertキー、soundキーおよびbadgeキーが含まれています。

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ドキュメントから入手できます。

23.3 ローカル通知の管理

ローカル通知は、Java API、JavaScript APIおよびMAFが提供するDeviceFeaturesデータ・コントロールのメソッドを使用して管理します。

ローカル通知は、次のものを使用して管理できます。

- MAFの提供するJava API (「Javaを使用してローカル通知を管理する方法」を参照)。

- MAFの提供するJavaScript API (「JavaScriptを使用してローカル通知を管理する方法」を参照)。

- アプリケーション設計時にすべてのMAFアプリケーションで使用可能なDeviceFeaturesデータ・コントロールのメソッド(「DeviceFeaturesデータ・コントロールを使用してローカル通知を管理する方法」を参照)。

LocalNotificationDemoというMAFサンプル・アプリケーションは、ローカル通知のスケジュールおよび処理方法を示します。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

23.3.1 Javaを使用してローカル通知を管理する方法

oracle.adfmf.framework.api.AdfmfContainerUtilitiesクラスのメソッドを使用して、ローカル通知をスケジュールします。

ローカル通知は、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");
}

通知オプションがアプリケーションの動作に与える影響は、ターゲット・プラットフォームに応じて異なります。「ローカル通知オプションとアプリケーション動作に関する必知事項」を参照してください。

- 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リファレンスを参照してください。

23.3.2 JavaScriptを使用してローカル通知を管理する方法

MAFでは、adf.mf.api.localnotificationネームスペースのJavaScript APIを使用してローカル通知を管理できます。

次のメソッドを使用できます。

- add: 定義は次のとおりです。

/**
* Schedule a local notification
*
* @param {Object} options - notification options
* @param {string} options.title - notification title
* @param {string} options.alert - notification alert
* @param {Date} options.date - date at which notification is to be triggered
* @param {Number} options.badge - application icon is to be badged by this
*                                 number when notification is triggered
* @param {string} options.sound - set it to 'SYSTEM_DEFAULT' to play the
*                                 default system sound upon a notification
* @param {string} options.vibration - set it to 'SYSTEM_DEFAULT' for default
*                                     system vibration upon a notification
* @param {Object} options.payload - custom payload to be sent via notification
* @param {successCallback} scb - success callback
* @param {errorCallback} ecb - error callback
*/
adf.mf.api.localnotification.add(options,scb,ecb);

{Object} options : json representing notification options
{
// notification title (only Android and iOS 8.2 or later)
"title" : String,
// notification alert text
"alert" : String,
// date-time at which notification should be fired (UTC time zone)
"date" : Date,
// either 'minutely', 'hourly', 'daily',
// 'weekly', 'monthly', or 'yearly'
"repeat" : String,
// badge application icon with this number (iOS only)
"badge" : Number,
// if set, the default system sound is played
"sound" : "SYSTEM_DEFAULT",
// if set to "SYSTEM_DEFAULT", the default vibration is
// enabled upon an incoming notification (Android only)
"vibration" : String,
// custom JSON data to be passed through the notification
"payload" : Object,
}

/**
* Success Callback
*
* @param {Object} request - request
* @param {Object} response - response
* @param {string} response.id - id of the scheduled notification
*/
function scb(request, response) {}

/**
* Error Callback
*
* @param {Object} request - request
* @param {Object} response - response
*/
function fcb(request, response) {}

通知オプションがアプリケーションの動作に与える影響は、ターゲット・プラットフォームに応じて異なります。「ローカル通知オプションとアプリケーション動作に関する必知事項」を参照してください。

- cancel: 定義は次のとおりです。

/**
* Cancel a scheduled local notification
*
* @param {string} notificationId - id of the scheduled notification
*                                  that needs to be canceled
* @param {successCallback} scb - success callback
* @param {errorCallback} ecb - error callback
*/
adf.mf.api.localnotification.cancel(notificationId, scb, ecb);

{var} notificationId : id of notification that is to be canceled.

/**
* Success Callback
*
* @callback successCallback
* @param {Object} request - request
* @param {Object} response - response
* @param {string} response.id - id of the notification
*/

/**
* Error Callback
*
* @callback errorCallback
* @param {Object} request - request
* @param {Object} response - response
*/

詳細は、Oracle Mobile Application Framework JSDocリファレンスを参照してください。

23.3.3 DeviceFeaturesデータ・コントロールを使用してローカル通知を管理する方法

図23-3に示すDeviceFeaturesデータ・コントロールのaddLocalNotificationおよびcancelLocalNotificationメソッドを使用してローカル通知をスケジュールおよび取消しできます。

図23-3 DeviceFeaturesデータ・コントロールのメソッド

DeviceFeaturesデータ・コントロールの詳細は、「DeviceFeaturesデータ・コントロールの使用方法」を参照してください。

23.3.4 ローカル通知オプションとアプリケーション動作に関する必知事項

MAFアプリケーションのローカル通知動作は、通知設定によって決まります。ローカル通知オプションの表を確認してください。

表23-2に、ローカル通知オプションをリストし、各オプションに対する特定の値の設定と不適切な設定がMAFアプリケーションの通知動作に与える影響を説明します。

表23-2 ローカル通知オプション

オプション

値

iOSでの動作

Androidでの動作

title

次のいずれかになります。

- null

- 未指定

アプリケーション名が通知タイトルとして表示されます。

通知センターの通知タイトルは、空白で表示されます。

alert

次のいずれかになります。

- null

- 未指定

通知にbadgeやsoundなどの他のプロパティが指定されている場合、通知はオペレーティング・システムに配信されるため、サウンドの再生やアプリケーション・アイコン・バッジの更新が行われますが、通知は通知センターに表示されません。

通知の配信時にアプリケーションがフォアグラウンドで実行されている場合、通知はアプリケーションのローカル通知リスナーに配信されます。

通知は、タイトル付きのバナーとして表示されますが、アラート・テキストは表示されません。

date

次のいずれかになります。

- null

- 未指定

- 過去の時刻または日付

通知は即座にトリガーされます。

通知は即座にトリガーされます。

repeat

次のいずれかになります。

- null

- 未指定

通知は繰り返されません。

通知は繰り返されません。

badge

次のいずれかになります。

- null

- 未指定

- 負の数値

通知では、アプリケーション・アイコンにバッジが設定されません。

既存のバッジは維持されます。

NA 脚注1

badge

0

既存のバッジがアプリケーション・アイコンから削除されます。

NA 脚注2

sound

SYSTEM_DEFAULT_SOUND以外

エラー・メッセージが表示されます。

通知では、サウンドが再生されません。

エラー・メッセージが表示されます。

通知では、サウンドが再生されません。

sound

未指定

通知では、サウンドが再生されません。

通知では、サウンドが再生されません。

vibration

SYSTEM_DEFAULT_VIBRATION以外

NA 脚注3

エラー・メッセージが表示されます。

通知では、モバイル・デバイスのバイブレーションがトリガーされません。

vibration

未指定

NA 脚注4

通知では、モバイル・デバイスのバイブレーションがトリガーされません。

脚注1

アプリケーション・バッジの概念はありません。設定は無視されます。

脚注2

アプリケーション・バッジの概念はありません。設定は無視されます。

脚注3

バイブレーションは制御できません。設定は無視されます。ただし、通知の受信時にデフォルトのシステム・サウンドを再生することを指定した場合、また、エンド・ユーザーがモバイル・デバイスの「着信時のバイブレーション」設定を有効にした場合、デバイスは通知の受信時にバイブレーションも適用します。

脚注4

バイブレーションは制御できません。設定は無視されます。ただし、通知の受信時にデフォルトのシステム・サウンドを再生することを指定した場合、また、エンド・ユーザーがモバイル・デバイスの「着信時のバイブレーション」設定を有効にした場合、デバイスは通知の受信時にバイブレーションも適用します。

23.4 MAFが通知イベントをトリガーしたときのアプリケーション状態の判断

MAFには、通知イベントをリスニングするために実装する、EventListenerインタフェースがあります。この実装のonMessageメソッドには、イベントを受信したときのMAFアプリケーションの状態に関する情報を取得できるイベント・パラメータが含まれています。この情報を取得するには、Event.getApplicationlicationState()メソッドを使用します。

次の例(LocalNotificationDemo MAFサンプル・アプリケーションから取得)は、通知イベントのペイロードを取得して、通知イベントを受信したときのMAFアプリケーションの状態を判断する方法を示しています。

NativeLocalNotificationListener implements EventListener {
...

public void onMessage(Event event) {
...
//MAF application state at the time of this notification
String appState = stringifyAppState(event.getApplicationState());
String payload = event.getPayload();
...

HashMap<String, Object> payloadMap = ((NativeLocalNotificationEvent)event).getPayloadObject();
...
JSONObject jsonPayload = (JSONObject)payloadMap.get("payload");
...
AdfmfJavaUtilities.setELValue("#{applicationScope.notificationAppState}", appState);
AdfmfJavaUtilities.setELValue("#{applicationScope.notificationPayload}", jsonPayload != null ? jsonPayload.toString() : "");
AdfmfContainerUtilities.gotoFeature("Notification");
}
...
}

getApplicationState()の戻り値は、次のとおりです。

- APPLICATION_STATE_UNKNOWN (0)。通知を受信したときにMAFアプリケーションがメモリーに常駐していても、MAFアプリケーションがフォアグラウンドまたはバックグラウンドで実行されていたかどうかを判断できない場合。このケースはiOSプラットフォームにのみ適用されます。イベント・ペイロードには、アプリケーションの正しい状態を示す追加のforeground属性が含まれます。属性は、1 (フォアグラウンド)または0 (バックグラウンド)のいずれかに設定します。イベント・ペイロードの形式は、次のようになります。

{"alert":"My message","foreground":1}

- APPLICATION_STATE_NOT_RUNNING (1)。MAFアプリケーションがメモリーに常駐せず、オペレーティング・システムがMAFアプリケーションを起動してイベントを処理する場合。

- APPLICATION_STATE_BACKGROUND (2)。通知を受信したときにMAFアプリケーションがメモリーに常駐していて、バックグランドで実行されている場合。

- APPLICATION_STATE_FOREGROUND (3)。通知を受信したときにMAFアプリケーションがメモリーに常駐していて、フォアグランドで実行されている場合。

前述の例に示す、NativeLocalNotificationEventクラスを使用します。このクラスは、oracle.adfmf.framework.event.Eventを拡張してローカル・イベントを管理します。MAFはNativePushEventクラスは提供します。このクラスもoracle.adfmf.framework.event.Eventを拡張しますが、ネイティブのプッシュ・イベントを管理します。

次のLocalNotificationDemo MAFサンプル・アプリケーションの例に示すように、MAFアプリケーション・ライフサイクル・リスナーのstart()メソッドにリスナーを追加して、ローカル通知に関連するイベントを受信します。

public class LifeCycleListenerImpl implements LifeCycleListener
{
...
public void start()
{
// Listen for local notifications
EventSource evtSource = EventSourceFactory.getEventSource(EventSourceFactory.NATIVE_LOCAL_NOTIFICATION_EVENT_SOURCE_NAME);
evtSource.addListener(new NativeLocalNotificationListener());
}
...

詳細は、Oracle Mobile Application Framework Java APIリファレンスと「サンプルのMAFアプリケーション」を参照してください。

24 MAFアプリケーションでのエラー・メッセージの表示

この章では、AdfExceptionクラスを使用してエラーを呼び出す方法とエラー・メッセージをローカライズする方法について説明します。

この章の内容は次のとおりです。

- MAFアプリケーションでのエラー処理の概要

- エラー・メッセージの表示およびバックグラウンド・スレッドの停止

- エラー・メッセージのローカライズ

24.1 MAFアプリケーションでのエラー処理の概要

MAFは、アプリケーションで発生するエラーを管理し、エラーに応じてメッセージをエンド・ユーザーに表示できます。

モバイル・アプリケーションで発生するエラーには、リモート・サーバーへの接続の失敗など、予期できないものがあります。アプリケーションのビジネス・ルールの違反など、予期できるエラーもあります。エラーまたは例外は、プライマリ・リクエスト・スレッド、またはバックグラウンド・タスクを実行するセカンダリ・スレッドで発生する場合があります。アプリケーションで複数の言語がサポートされている場合、エラー・メッセージはユーザーの言語で表示される必要があります。

MAFアプリケーションが例外をスローできるようにするには、oracle.adfmf.framework.exception.AdfExceptionクラスを使用します。Oracle Mobile Application Framework Java APIリファレンスを参照してください。

次のコードにより、MAFで例外を予期したとおりに処理できるようになります。図24-1に示すようなポップアップ・メッセージがアプリケーション内に表示され、重大度と説明テキストが示されます。

throw new AdfException("My error message", AdfException.ERROR);

図24-1 エラー・メッセージ

注意:

マネージドBeanまたはデータ・コントロールBean内で例外がスローされると、アプリケーション内に類似のエラー・メッセージが表示されます。

24.2 エラー・メッセージの表示およびバックグラウンド・スレッドの停止

MAF APIを使用して、アプリケーションにスレッドを停止させ、エラーを表示させることができます。

次の例に示すMessageUtilsクラスを使用すると、アプリケーションで最初にJavaScriptコール(invokeContainerJavaScriptFunction)を実行してから例外をスローすることにより、スレッドを停止してエラーを表示することができます。addMessageメソッドを使用すると、エラーが表示可能になります。詳細は、「バックグラウンド・スレッド例外でのアプリケーションによるエラー・メッセージの表示方法」を参照してください。また、「invokeContainerJavaScriptFunction」も参照してください。

MessageUtilsクラスは、BundleFactoryおよびUtilityメソッドを使用してリソース・バンドルとエラー・メッセージを取得し、スレッドがバックグラウンドで実行されているかどうかを動的にチェックします。このクラスを使用して、メイン・スレッドからバックグラウンド・スレッドにコードを移動できます。

package oracle.errorhandling.demo.mobile;

import java.util.ResourceBundle;

import oracle.adfmf.framework.api.AdfmfContainerUtilities;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.framework.exception.AdfException;
import oracle.adfmf.util.BundleFactory;
import oracle.adfmf.util.Utility;

public class MessageUtils {

public static void handleError(AdfException ex) {
handleMessage(ex.getSeverity(), ex.getMessage());
}

public static void handleError(String message) {
handleMessage(AdfException.ERROR, message);
}
public static void handleError(Exception ex) {
handleMessage(AdfException.ERROR, ex.getLocalizedMessage());
}

public static void handleMessage(String severity, String message) {
if (AdfmfJavaUtilities.isBackgroundThread()) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(
AdfmfJavaUtilities.getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {severity,
null,
null});
if (AdfException.ERROR.equals(severity)) {
// need to throw an exception to stop background thread processing
throw new AdfException(message,severity);
}
}
else {
throw new AdfException(message,severity);
}
}

public static void addJavaScriptMessage(String severity, String message) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(
AdfmfJavaUtilities.getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {severity,
message,
null,
null });
}

}

24.2.1 バックグラウンド・スレッド例外でのアプリケーションによるエラー・メッセージの表示方法

バックグラウンド・スレッドに対して例外がスローされたとき、アプリケーションには例外が表示されません。このような状況でエラー・メッセージを表示できるようにするには、アプリケーションでaddMessageメソッドをコールします。addMessageメソッドは、次のパラメータを取ります。

- エラーの重大度

- サマリー・メッセージ

- 詳細メッセージ

- clientComponentId

次の例は、addMessageメソッドを使用して、バックグラウンドでエラーが発生したときにアプリケーションがユーザーにアラートを出せるようにする方法を示しています。

Runnable runnable = new Runnable() {
public void run() {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(
AdfmfJavaUtilities.getFeatureName(),
"adf.mf.api.amx.addMessage", new Object[] {AdfException.ERROR,
"My error message for background thread",
null,
null });
}
};
Thread thread = new Thread(runnable);
thread.start();

adf.mf.api.amx.addMessage JavaScript関数は、プライマリ・リクエスト・スレッドでアプリケーションがAdfExceptionをスローしたするときに使用されるメソッドと同じであるため、エラー・メッセージがメイン・スレッドでの例外を示すものか、バックグラウンド・スレッドに関するものかにかかわらず、ユーザーには同じポップアップ・エラー・メッセージが表示されます。

注意:

前の例に示したとおり、詳細メッセージおよびclientComponentIdはNull値にすることができます。詳細メッセージは、サマリー・メッセージと同じフォント・サイズで新しい行に表示されます。

ただし、次の例に示されているように、バックグラウンド・スレッドで実行されるJavaロジック内にコードを配置すると、エラー・メッセージを表示しないようにできます。「エラー・メッセージのローカライズ」の最初の例に示すメソッドを使用すると、ユーザーに通知せずにバックグラウンド・スレッドをサイレントに停止できます。

Runnable runnable = new Runnable() {
public void run() {
// this exception will be lost because no popup error
// message will display in the MAF application
throw new AdfException("My (lost) error message in background",
AdfException.ERROR);
}
};
Thread thread = new Thread(runnable);
thread.start();

24.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 });

25 MAFアプリケーションのデプロイ

この章では、テストと公開のためのMAFアプリケーションのデプロイ方法について説明します。

この章の内容は次のとおりです。

- MAFアプリケーションのデプロイメントの概要

- デプロイメント・プロファイルでの作業

- AndroidプラットフォームへのMAFアプリケーションのデプロイ

- iOSアプリケーションのデプロイ

- ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ

- アプリケーションのMAFクイック・デプロイメントの概要

- 機能アーカイブ・ファイル(FAR)のデプロイ

- モバイル・アプリケーション・アーカイブ・ファイルの作成

- アプリケーション・アーカイブからの新規アプリケーションの作成

- コマンド行からのMAFアプリケーションのデプロイ

25.1 MAFアプリケーションのデプロイメントの概要

エンド・ユーザーに配布するためにアプリケーションを公開する前に、デバイスまたは仮想デバイスでこれをテストして、その動作と使いやすさを評価する必要があります。MAFは、MAFアプリケーションのデプロイメントを容易にする、各プラットフォーム用のすぐに使用できるデプロイメント・プロファイルを提供しています。

すぐに使用できるデプロイメント・プロファイルを使用するか、または独自のデプロイメント・プロファイルを作成して、MAFアプリケーションをテストするデバイスまたは仮想デバイス(エミュレータまたはシミュレータ)にMAFアプリケーションをデプロイします。

MAFでは、デプロイメント・プロファイルを使用してアプリケーションをデプロイする場合、プラットフォーム固有のテンプレート・アプリケーションを一時的な場所にコピーした後、MAFプロジェクト内で定義されたコード、リソースおよび構成を使用して、そのアプリケーションを更新します。その後、MAFでは、ターゲット・プラットフォームのツールを使用して、アプリケーションをビルドおよびデプロイします。ダウンロード・サイトまたはアプリケーション・マーケットプレイス(Apple App Storeなど)から入手可能なプラットフォーム固有のパッケージとして、モバイル・アプリケーションをデプロイできます。テストおよびデバッグの目的で、デバイスまたは仮想デバイスにデプロイできます。ビュー・コントローラ・プロジェクトを機能アーカイブ(FAR)としてデプロイすることで、アプリケーション機能を再利用できます。また、モバイル・アプリケーション全体は、モバイル・アプリケーション・アーカイブ(.maa)・ファイルとしてデプロイすることで再利用することもできます。

各MAFデプロイメント・プロファイル(Android、iOS、Windows)には、デプロイメントのタイプ(リリースまたはデバッグ)とデプロイメント・ターゲット(シミュレータまたは実際のデバイス)の組合せに固有の異なるライブラリのセットが含まれています。さらに、それぞれのライブラリ・セットには、JVMのJARファイルが含まれます。アプリケーションのバインディング・レイヤーは、Objective-Cライブラリのコレクションであるこの仮想マシン内にあります。たとえば、MAFは、iOSシミュレータをターゲットとするデバッグ・デプロイメントに対して、JVM JARファイルと一連のライブラリをデプロイしますが、実際のiOSデバイスをターゲットとするデバッグ・デプロイメントに対しては、異なるJVM JARファイルと一連のライブラリをデプロイします。プロジェクトに宣言したライブラリが、プロジェクトのデプロイメント・アーティファクトに含まれています。

新しいビルド・プロセスを開始するため、JDeveloperが以前のビルドからのアーティファクトと設定を削除するよう、アプリケーションをデプロイする前に複数のシナリオでJDeveloperの「ビルド」→「すべてクリーン」コマンドを呼び出すことをお薦めします。これらのシナリオは次のとおりです。

- ビルド・モード、アプリケーション名など、デプロイメント・プロファイルの設定の変更。

- Cordovaプラグインの追加または削除。

- Gradleプロキシ設定、Android SDKの場所、署名資格証明など、Androidプラットフォームのプリファレンスの変更。

25.2 デプロイメント・プロファイルでの作業

MAFアプリケーション・デプロイメントの場合は、すぐに使用できるデプロイメント・プロファイルを作成するか、カスタマイズしたデプロイメント・プロファイルを使用します。デプロイメント・プロファイルでは、アプリケーションをアーカイブにパッケージ化する方法を定義します。プラットフォーム固有のデバイスや仮想デバイスに、このパッケージをデプロイします。

デプロイメント・プロファイルを使用して、MAFアプリケーションを実行するプラットフォームにMAFアプリケーションをデプロイします。MAFには、サポートしている各プラットフォーム(Android、iOS、Windows)用のすぐに使用できるデプロイメント・プロファイルが用意されていますが、カスタマイズしたデプロイメント・プロファイルを作成することもできます。デプロイメント・プロファイルでは、プラットフォーム・デバイス(AndroidデバイスやAndroidエミュレータなど)にデプロイするアプリケーションをアーカイブにパッケージ化する方法を定義します。デプロイメント・プロファイルは次を行います。

- アーカイブの形式と内容を指定します。

- アーカイブ・ファイルへのパッケージ対象となるソース・ファイル、デプロイメント・ディスクリプタおよびその他の補助ファイルをリストします。

- 作成されるアーカイブ・ファイルのタイプおよび名前を記述します。

- 依存情報、プラットフォーム固有の指示およびその他の情報を示します。

MAFでは、プラットフォーム固有のデプロイメント・プロファイルに加えて、MAFアプリケーションをMAFアプリケーション・アーカイブ(.maa)・ファイルとしてパッケージ化するために使用できるデプロイメント・プロファイルも提供します。このファイルを使用すると、.maaファイルとしてパッケージ化された既存のアプリケーションを使用する新しいMAFアプリケーションを作成できます。このデプロイメント・ファイルには、MAFアプリケーション名に_archiveが続く形式の名前がデフォルトで付けられます。「モバイル・アプリケーション・アーカイブ・ファイルの作成」を参照してください。

25.2.1 自動的に生成されるデプロイメント・プロファイルについて

アプリケーションを作成すると、MAFによって、デフォルトの設定とイメージ・ファイルでシードされたデプロイメント・プロファイルが生成されます。環境を正しく構成した場合、これらのプロファイルを使用して、MAFアプリケーションを作成直後にデプロイできます。これを行うには、「アプリケーション」を選択した後、「デプロイ」を選択します。

図25-1 デフォルトのデプロイメント・プロファイル

その後、「デプロイメント・アクション」ページ(図25-2を参照)を使用し、適切なデプロイメント・ターゲットを選択します。

図25-2 デプロイメント・ターゲットの選択

各デプロイメント・プロファイルには、環境設定と構成に関する独自の要件があります。詳細は、次を参照してください。

- Androidアプリケーションのデプロイ

- iOSアプリケーションのデプロイ

- ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ

これらのプロファイルには、デフォルト値をそのまま使用するか、「アプリケーション・プロパティ」ダイアログの「デプロイメント」ページでプロファイルを選択し、「編集」をクリックすることによって、それらの値を編集することもできます。図25-3は、デフォルトのAndroidアプリケーション・プロファイルの「Androidオプション」ページを示しています。

図25-3 デフォルトのデプロイメント・プロファイルの編集

MAFでは、アプリケーション・コントローラ・プロジェクトとビュー・コントローラ・プロジェクトは、別々の機能アーカイブ(FAR)ファイルとしてパッケージ化されます。MAFファイルのこれらのJARファイルは他のアプリケーションのリソースとして使用され、それは「機能アーカイブ・ファイル(FAR)のデプロイ」で説明されています。MAFでは、MAFアプリケーション・プロファイルへの依存関係としてこれらのFARファイルが作成されるため、図25-4に示すように、「アプリケーション・プロパティ」ダイアログの「プロファイルの依存性」ページを使用して、それらを含めたり除外したりできます。

注意:

アプリケーション・コントローラ・プロジェクトに含まれるFARプロファイルの依存性は1つである必要があります。そうでない場合、デプロイメントは失敗します。

図25-4 MAFプロジェクトからのFARコンテンツの編集

「プロジェクト・プロパティ」ダイアログのファイル・グループに関連するページを使用すると、ビュー・コントローラのFARファイルに含まれるコンテンツをカスタマイズできます(図25-5を参照)。「プロジェクト・プロパティ」ダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプおよび『Oracle JDeveloperによるアプリケーションの開発』のデプロイメント・プロファイルの構成に関する項を参照してください。

図25-5 ビュー・コントローラ・プロジェクトのFARの編集

「アプリケーションのプロパティ」ダイアログの各ページを使用したデプロイメント・プロファイルの編集の詳細は、『Oracle JDeveloperによるアプリケーションの開発』のデプロイメント・プロファイルのプロパティの表示と変更に関する項と、Oracle JDeveloperオンライン・ヘルプの「アプリケーションのプロパティ」ダイアログや「プロジェクト・プロパティ」ダイアログに関する項を参照してください。

25.2.2 デプロイメント・プロファイルの作成方法

モバイル・アプリケーションを作成すると、MAFによって、デプロイメント・プロファイルのセットが作成されます。これらのプロファイルを使用してアプリケーションをデプロイしたり、それらのプロファイルを編集したり、MAF固有のデプロイメント・プロファイル・ページを使用して新しいプロファイルを構成できます。

デプロイメント・プロファイルの作成ウィザード(図25-6を参照)を使用して、それらのページからデフォルトのデプロイメント・プロファイルを作成できます。デプロイメント・プロファイルは、必要な数だけ作成できます。これらの標準デプロイメント・プロファイル・ページの詳細は、「ヘルプ」をクリックしてJDeveloperオンライン・ヘルプを参照してください。

注意:

MAFアプリケーションのデプロイメントでは、アプリケーションレベルのデプロイメント・プロファイルの作成のみが必要とされるので、ビュー・コントローラレベルのデプロイメント・プロファイルを作成する必要はありません。

始める前に:

JDeveloperでモバイル・アプリケーションをデプロイできるようにするには、『Oracle Mobile Application Frameworkのインストール』のプラットフォームとフォーム・ファクタに応じた開発環境の構成に関する項で説明するように、ターゲット・プラットフォーム用のSDKを指定する必要があります。

ヒント:

iOSデプロイメントの場合は、iTunesおよびiOSシミュレータを1回以上実行してから、それらのディレクトリの場所を構成します。

デプロイメント・プロファイルを作成するには:

1. 「アプリケーション」を選択して、「デプロイ」を選択します。

2. 「新規デプロイメント・プロファイル」を選択します。

3. 図25-6に示すように、ターゲットにするプラットフォームのプロファイルを「プロファイル・タイプ」ドロップダウン・リストから選択します。

4. プロファイルのデフォルト名をそのまま使用するか、新しい名前を入力します。「OK」をクリックします。

5. 必要な場合は、「オプション」ページと「アプリケーション・イメージ」ページを適宜使用して、「OK」をクリックします。

図25-6 「デプロイメント・プロファイルの作成」ウィザード

25.2.3 デプロイメント・プロファイルの作成時の処理

「デプロイメント・プロファイルの作成」ウィザードが完了すると、JDeveloperによってデプロイメント・プロファイルが作成され、デプロイメント・プロファイルのプロパティ・エディタが開きます。アプリケーションがデプロイされると、デフォルト・プロジェクトのFARファイルとともに、デプロイメント・ディレクトリと関連サブディレクトリがJDeveloperによって作成されます。

ウィザードが完了すると、JDeveloperによってデプロイメント・プロファイルが作成され、デプロイメント・プロファイルのプロパティ・エディタが開きます。

表25-1に、デプロイメント・プロファイルのプロパティ・エディタのMAFに固有のページ(表25-1を参照)をリストします。

表25-1 MAF固有のデプロイメント・プロファイル・ページ

ページ

機能

iOSオプション

iOSデバイスまたはiOSシミュレータにデプロイされるアプリケーションの設定を変更できます。

Androidオプション

AndroidデバイスまたはAndroidエミュレータにデプロイされるアプリケーションの設定を変更できます。

Windowsオプション

ユニバーサルWindowsプラットフォームにデプロイするアプリケーションの設定を変更できます。

アプリケーション・イメージ

適切なグラフィックス・ファイルを追加することで、アプリケーションにカスタム・アイコンを割り当てられます。

デバイスの向き

アプリケーションの表示をデバイスの特定の向きに制限できます。このページはiOSデプロイメント・プロファイルのみに使用されます。

注意:

デプロイメントはアプリケーションのニーズによって異なります。表25-1にリストされたページにシードされたデフォルト値を使用してアプリケーションをデプロイできます。

アプリケーションをデプロイすると、JDeveloperによってデプロイメント・ディレクトリと関連するサブディレクトリが作成されます。さらに、ビュー・コントローラ・プロジェクト(異なる名前が付いている必要があります)とアプリケーション・コントローラ・プロジェクトの両方の機能アーカイブ・ファイル(FAR)が作成されます。これら2つのFARに加え、プロジェクトにインポートされたすべてのFARのコピーがJDeveloperによって作成されます。コンパイル・プロファイルを変更する際は、デプロイメント・ディレクトリを削除する必要があります。「ビルド」→「すべてクリーン」を選択することで、このディレクトリに加え、FARを含むビュー・コントローラ・プロジェクト内のデプロイメント・ディレクトリを削除できます。

25.3 AndroidプラットフォームへのMAFアプリケーションのデプロイ

MAFアプリケーションは、Androidデバイス、エミュレータ、またはAndroidデバイスやエミュレータにアプリケーションをインストールするのに使用するデプロイメント・パッケージにデプロイできます。

MAFには、Androidプラットフォームにデプロイするアプリケーション用に2つのビルド・モードが用意されています。開発サイクル中にアプリケーションをテストおよびデバッグする場合は、デバッグ・モードを使用します。リリースの準備が完了し、Google Playなどのアプリケーション・マーケットプレイスを介してエンド・ユーザーに公開できるアプリケーションをデプロイする場合は、リリース・モードを使用します。

MAFには、すぐに使用できるデプロイメント・プロファイル(Android1)が用意されており、これによってMAFアプリケーションがデプロイされます。このすぐに使用できるデプロイメント・プロファイルを使用するか、またはその他のデプロイメント・プロファイルを1つ以上作成して、MAFアプリケーションをAndroidプラットフォームにデプロイできます。デプロイメント・プロファイルを使用して、デバッグ・モードまたはリリース・モードでMAFアプリケーションをデプロイできます。

新しいデプロイメント・プロファイルを作成するか、既存のプロファイルを編集して、次のことを実行できます。

- アプリケーション用に追加のライブラリおよびプロファイル依存性を指定します。

- ビルド・モードをデバッグまたはリリースから選択します。

- アプリケーション名、バージョンなどのオプションを指定します

- アプリケーションがスプラッシュ画面でそのロゴをレンダリングするために使用するイメージ、およびユーザーのデバイスに表示されるアイコンを指定します。

- Androidデバイスにインストールする場合、MAFアプリケーションの優先記憶域の場所を指定します。

- MAFがMAFアプリケーションをビルドするために使用するGradleビルド・ツールのロギング・レベルを選択します。これらのログ・レベルの詳細は、Gradleのドキュメントを参照してください。

- MAFアプリケーションが動作可能なAndroidの最小バージョンを決定する最小SDK APIレベルを指定します。

- 複数のDalvik Executable (DEX)を含むことができるように、MAFアプリケーションでのmultidexサポートを有効にします。MAFはこの設定をデフォルトで無効にしています。Android開発者のWebサイトの「Configure Apps with Over 64K Methods」ページで説明されているように、アプリケーションが特定のサイズを超えている場合にのみ、これを有効にする必要があります。MAFアプリケーションのコンパイル失敗時にcom.android.dex.DexIndexOverflowExceptionを参照すると、アプリケーションが大きすぎるので、multidexサポートを有効にする必要があることが示される場合があります。

デプロイメント・プロファイルの編集方法または作成方法の詳細は、「デプロイメント・プロファイルでの作業」を参照してください。デプロイメント・プロファイルのダイアログで「ヘルプ」をクリックして、各ダイアログで実行できる個々のタスクに関する情報を表示します。

デプロイメント・プロファイルを使用してMAFアプリケーションをデプロイする前に、「ターゲット・プラットフォームに応じた開発環境の構成」および『Oracle Mobile Application Frameworkのインストール』の「Android SDKのインストール方法」の説明に従って、Android SDKをダウンロードし、MAFプリファレンスの「Androidプラットフォーム」ダイアログから参照します。

MAFはGradleを使用して、MAFアプリケーションをビルドし、Androidプラットフォームにデプロイします。初めてMAFアプリケーションをデプロイするときに、MAFはGradleをダウンロードしてインストールします。開発マシンが企業のファイアウォールで保護されている場合は、MAFが正常にGradleをダウンロード、インストールおよび構成できるように、Gradleプロキシ設定を構成します。「Gradleプロキシ設定の構成方法」を参照してください。

MAFアプリケーションの開発を終了したら、アプリケーション・マーケットプレイス(Google Playなど)に公開できます。アプリケーションを公開する前に、 図25-7に示すように、アプリケーションをデプロイするのに使用するデプロイメント・プロファイルのビルド・モードがリリース・モードであることを確認してください。JDeveloperの「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」メニューから「Androidオプション」ダイアログにアクセスします。また、リリース・モードでデプロイするには、「AndroidプラットフォームにデプロイするMAFアプリケーションの署名方法」の説明に従って、アプリケーションを署名する必要があります。

アプリケーションのGoogle Playへの公開の詳細は、http://developer.android.com/tools/publishing/publishing_overview.htmlを参照してください。

図25-7 デプロイメント・プロファイル・プロパティのリリース・モード

25.3.1 Gradleプロキシ設定の構成方法

コンピュータが企業ネットワーク内にある場合は、AndroidプラットフォームにデプロイするMAFアプリケーションをビルドするのに必要なGradleツールをMAFがダウンロードしてインストールできるよう、プロキシ設定を構成します。

Gradleプロキシ設定を構成する手順:

1. JDeveloperで「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」→「Androidプラットフォーム」→「Gradleプロキシ設定」をクリックし、ダイアログ(図25-8を参照)を開きます。

図25-8 Gradleプロキシ設定

2. 必要に応じて、ダイアログの「HTTPプロキシ」および「HTTPSプロキシ」セクションのフィールドへの入力を行います。

- ホスト名: プロキシ・サーバーのURIを入力します。

- ポート番号: プロキシ・サーバーが使用するポート番号を入力します。

- プロキシを使用しない: 無視するURIの|区切りリストを入力します。たとえば、「*.nonproxyrepos.com|*.oracle.com|localhost」と入力します。

- プロキシ認証: プロキシ・サーバーに認証が必要な場合に選択し、「ログイン」および「パスワード」フィールドにこれらの資格証明を入力します。

- HTTPSプロキシを有効にする: HTTPSプロキシ・サーバーの詳細(ホスト名、ポート番号など)を指定する必要がある場合に選択します。これにより、以降の入力フィールドが書込み可能になります。

3. 「OK」をクリックします。

25.3.2 AndroidプラットフォームにデプロイするMAFアプリケーションの署名方法

アプリケーションは、Androidデバイスまたはエミュレータにデプロイする前に、署名する必要があります。Androidでは、認証局は不要です。アプリケーションは自己署名できます。

デプロイメントにおけるMAFアプリケーションの署名方法の定義は、2つの手順で構成されます。まず、MAFプリファレンスの「Androidプラットフォーム」ページで、Androidアプリケーションの署名に使用されるキーのデバッグおよびリリース・プロパティを定義します。デバッグおよびリリースの署名プロパティは、一度構成するのみでかまいません。これらのオプションを定義したら、デプロイメント・プロファイルを構成して、デバッグ・モードとリリース・モードのどちらでアプリケーションをデプロイするかを指定します。

キーストア・ファイルが存在しない場合は、keytoolユーティリティを使用して、キーストア・ファイルを作成できます(次の例を参照)。

keytool -genkeypair
-v
-keystore c:\jdeveloper\mywork\releasesigning.keystore
-alias releaseKeyAlias
-keyalg RSA
-keysize 2048
-validity 10000

この例のキーストアには、10,000日間有効な単一のキーが含まれています。Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で入手可能なドキュメント『Signing Your Applications』の説明にあるように、keytoolではキーストアを生成する前に、キーストアとキーのパスワードと、「識別名」フィールドへの入力が求められます。keytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

デバッグ・モードのキー・オプションを構成するには:

1. 「ツール」をクリックして、「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択します。

2. 「Androidプラットフォーム」を選択し、「署名資格証明」セクションの「キー」および「キーストア・パスワード」フィールドに、デバッグ・デプロイメントに必要なキーストア・ファイルとキーを作成するためにデプロイメントで使用されるパスワードを入力します。Androidデバイスまたはエミュレータへのデプロイメント用のキーストアとキーファイルを生成するこのパスワードには、6文字以上の長さであれば、任意の値を指定できます。デフォルトのパスワードはAndroidです。

リリース・モードのキー・オプションを構成する手順:

1. 「ツール」をクリックして、「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択します。

2. 「Androidプラットフォーム」→「リリース」タブを選択し、次を定義します。

- キーストアの場所: 配布するアプリケーションの署名に使用する秘密鍵を含むキーストアのディレクトリを入力、参照および取得します。

- キーストア・パスワード: キーストアのパスワードを入力します。このパスワードを使用すると、物理ファイルにアクセスできます。

- キーの別名: キーの別名を入力します。これはkeytoolの-alias引数に使用する値セットです。別名の最初の8文字のみが使用されます。

- キー・パスワード: キーのパスワードを入力します。このパスワードを使用すると、キーストア内のキー(別名によって識別される)にアクセスできます。

ヒント:

keytoolユーティリティによるキーストアの生成前に、keytoolユーティリティが要求するパスワードとキー・パスワードを入力します。

3. 「OK」をクリックします。

25.3.3 資格証明の格納に関する必知事項

MAFは、キーおよびキーストアのパスワードをファイルベースの資格証明ストア(cwallet.sso)に格納します。資格証明の格納および取得を管理するこのファイルは、ユーザーのJDeveloperシステム・フォルダのo.mafフォルダ内に存在します。

たとえば、Windows 環境では、cwallet.ssoファイルはC:\Users\jsmith\AppData\Roaming\JDeveloper\system12.1.3\o.mafに存在します。

『Oracle Fusion Middlewareの管理』のOracle Walletの概要に関する項を参照してください。

注意:

MAFは、キーおよびキーストア資格証明をproduct-preferences.xmlというファイルに格納します。JDeveloperおよびMAFの現在のバージョンのインストール・プロセス時に「インポート・プリファレンスの確認」ダイアログの「はい」をクリックしてプリファレンス設定を保持した場合、MAFはこれらの資格証明をcwallet.ssoファイルに移行します。ただし、cwallet.ssoファイルは、現在のバージョンのOracle JDeveloperとMAFの他のインストールには移行されません。再インストールした場合(または別のインストールを作成した場合)は、cwallet.ssoファイルをo.mafフォルダにコピーするか、または「プラットフォーム」プリファレンス・ページでリリース・モードの資格証明を再構成する必要があります。

25.3.4 AndroidプラットフォームへのMAFアプリケーションのデプロイ方法

Androidプラットフォーム用のMAFデプロイメント・プロファイルを使用して、Androidプラットフォームにアプリケーションをデプロイします。

MAFアプリケーションをUWPAndroidプラットフォームにデプロイする手順:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 表示されるダイアログのリストから適切なデプロイメント・オプションを選択します。

- アプリケーションのデバイスへのデプロイ
Androidデバイスに直接デプロイするこのオプションを選択する前に、JDeveloperをホストする開発コンピュータにデバイスを接続し、そのデバイスを開発モードに設定して、USBデバッグを有効にします。これらのタスクの詳細は、『Oracle Mobile Application Frameworkのインストール』のAndroidデバイスの設定方法に関する項を参照してください。

- アプリケーションのエミュレータへのデプロイ
Androidエミュレータに直接デプロイするこのオプションを選択する前に、Androidエミュレータを設定して起動します。このタスクの詳細は、『Oracle Mobile Application Frameworkのインストール』のAndroidエミュレータの設定方法に関する項を参照してください。

- アプリケーションのパッケージへのデプロイ
Androidデバイスまたはエミュレータへのインストール用に配布可能な.APKファイルにMAFアプリケーションをデプロイします。

3. 「サマリー」ページを確認し、「終了」をクリックします。

25.3.5 AndroidプラットフォームにMAFアプリケーションをデプロイする場合の処理

MAFは、デバイスまたはエミュレータのいずれかのデプロイメント・オプションが選択された場合にこれらにMAFアプリケーションをインストールするのに使用する.APKファイルを生成します。「アプリケーションのパッケージへのデプロイ」オプションを選択した場合、MAFが.APKファイルを作成したディレクトリに移動して検索してください。

MAFによって、.APKファイルに次のものが格納されます。

- adfmsrcの内容

- .adfフォルダの内容

- maf-application.xmlおよびmaf-feature.xmlファイル

- logging.propertiesファイル

- JVMファイル

デバイスまたはエミュレータへのデプロイが選択された場合、MAFはMAFアプリケーションをインストールして起動します。MAFアプリケーションをデバッグ・モードでデプロイした場合、図25-9の左上に示すように、MAFアプリケーションの各画面に赤いアイコンが表示されます。リリース・モードでデプロイしたMAFアプリケーションでは、このアイコンはレンダリングされません。

図25-9 デバッグ・モードでデプロイされたMAFアプリケーション

MAFは、Androidデバッグ・ブリッジを使用して、MAFアプリケーションをデプロイするデバイスまたはエミュレータに接続します。デプロイメントでデバイスが検出されない場合は、デバイス(デバイスにデプロイする場合)またはエミュレータ(Androidエミュレータにデプロイする場合)が検出されるまで、Androidデバッグ・ブリッジ・サーバーが5回再起動されます。どちらも検出されない場合、図25-10に示すとおり、デプロイメント・プロセスは終了します。

図25-10 終了されたデプロイメント

デプロイメント前にAndroidデバッグ・ブリッジ・コマンド行ツールを使用する場合は、デプロイメントの完了後に同じコマンドを再度入力する必要があります。たとえば、デプロイメントの前にエミュレータまたはデバイスのロギング情報を表示するためにadb logcatと入力した場合、ロギング出力の取得を再開するには、アプリケーションがデプロイされた後で再度adb logcatと入力する必要があります。Androidデバッグ・ブリッジ・コマンド行ツールは、Android SDKインストールのplatform-toolsディレクトリ内に配置され、ここから実行されます。このツールの詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/adb.html)を参照してください。

デプロイメント・アクションを選択すると、JDeveloperによって「デプロイ」メニューにショートカットが作成されます。このショートカットを使用すると、同じデプロイメント・アクションを使用してアプリケーションを簡単に再デプロイできます。

デフォルトでは、MAFアプリケーションは、JDeveloperからデバイスにデプロイされた後またはGoogle Playなどのアプリケーション・マーケットプレイスからダウンロードされた後、Androidデバイスの内部記憶域にインストールされます。「優先記憶域の場所」ドロップダウン・リストから使用可能な次のオプションでは、MAFアプリケーションの優先記憶域の場所を指定できます。

- 内部: MAFアプリケーションをデバイスの内部記憶域に強制的にインストールします。

- 外部: アプリケーションをデバイスのSDカードにインストールできます。ただし、Androidシステムは、SDカードにアプリケーションをインストールできないことを検出した場合(たとえば、SDカードがマウントされていない場合や、SDカードは存在するものの十分な領域がない場合)、かわりにアプリケーションをデバイスの内部記憶域にインストールします。モバイル・デバイス・ユーザーは、システム設定を使用して、内外の記憶域間でアプリケーションを移動できます。

- 自動: アプリケーションをデバイスの外部記憶域または内部記憶域にインストールできることを指定します。モバイル・デバイス・ユーザーは、システム設定を使用して、内外の記憶域間でアプリケーションを移動できます。

「外部」オプションまたは「自動」オプションを選択すると、デプロイメント・フレームワークによってAndroidManifest.xmlファイルの<manifest>要素がandroid:installLocation属性、および"preferExternal"または"auto"という値で更新されるようにすることができます。AndroidManifest.xmlファイルにこの属性を移入することで、MAFアプリケーションを外部のSDカードまたは内部記憶域に格納できます。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/data/install-location.html)またはAndroid SDKのドキュメントから入手できる『Data Storage Guide』の「App Install Location」を参照してください。

25.3.6 Androidアプリケーションへのカスタム・イメージの追加方法

様々なサイズや解像度のAndroidデバイスでMAFアプリケーション・アイコンを正しく表示できるようにするには、同じイメージの低、中、高、超高、超超高密度および超超超高密度バージョンが必要です。MAFは、これらの表示要件を満たすデフォルトのOracleイメージを提供します。

ただし、アプリケーションにカスタム・アイコンが必要な場合は、図25-11に示す「アプリケーション・イメージ」ページを使用して、アプリケーション・アイコンとスプラッシュ画面用にPNG形式のイメージを選択することで、デフォルト・イメージをオーバーライドできます。スプラッシュ画面には、縦向きと横向きのイメージを追加できます。カスタム・イメージ・ファイルを追加しない場合は、デフォルトのOracleアイコンが使用されます。MAFでは、Androidのデフォルトのスプラッシュ・スクリーン用に9-patchイメージが提供されています。9-patchイメージは、イメージのどのエリアが拡張され、どのエリアが拡張されないかを示します。これらのイメージは、イメージ内の指定された部分(デフォルトのMAFスプラッシュ・スクリーンのイメージ内のロゴや著作権表示など)の整合性を維持しながら、任意のサイズに合うように拡張できます。

カスタム・イメージを作成するには、Android開発者のWebサイト(http://developer.android.com/design/style/iconography.html)で入手可能なドキュメント『Iconography』を参照してください。

図25-11 Androidアプリケーション用のカスタム・イメージの設定

始める前に:

Androidテーマに適しており、複数の画面タイプをサポートできるディメンション、密度およびコンポーネントを使用するPNG、JPEGまたはGIFファイル形式のイメージを取得します。Android開発者のWebサイト(http://developer.android.com/guide/practices/screens_support.html)で入手可能なドキュメント『Supporting Multiple Screens』を参照してください。

カスタム・イメージを追加するには:

1. 「アプリケーション・イメージ」をクリックします。

2. 「参照」機能を使用して、プロジェクト・ファイルからスプラッシュ画面およびアイコン・イメージ・ファイルを選択します。図25-11は、低密度、中密度、高密度、超高密度、超超高密度、超超超高密度のディスプレイを装備するデバイスでの表示用にアプリケーションで使用されるアプリケーション・アイコンのイメージ、および縦向きのスプラッシュ画面用のイメージを選択する様子を示しています。

3. 「OK」をクリックします。

25.3.7 JDeveloperによってAndroidアプリケーション用のイメージがデプロイされる場合の処理

デプロイメントの際、MAFにより、JDeveloperは、ソースの場所から一時デプロイメント・フォルダにイメージをコピーできます。

MAF拡張機能に付属のデフォルト・イメージ(アプリケーション・ワークスペース・ディレクトリ\Application Resources\Resources\images内)の場合は、JDeveloperはシードされた場所から、ビュー・コントローラ・プロジェクトのデプロイメント・サブディレクトリ(アプリケーション・ワークスペース\ViewController\deploy)にコピーします。表25-2に示されているように、各イメージ・ファイルは、drawableオブジェクトにちなんで名付けられたdrawableというサブディレクトリにコピーされます。詳細は、Android開発者のWebサイト(http://developer.android.com/reference/android/graphics/drawable/Drawable.html)を参照してください。それぞれのdrawableディレクトリは、イメージ密度(ldpi、mdpi、hdpi、xhdpi、xxhdpiおよびxxxhdpi)と向き(port、land)に対応します。これらのディレクトリ内で、JDeveloperは、各アイコン・イメージ・ファイルの名前をadfmf_icon.pngに、各スプラッシュ画面イメージの名前をadfmf_loading.9.pngまたはadfmf_loading.pngに変更します(9-patchのイメージを使用するかどうかによって異なります)。

表25-2 シードされたアプリケーション・イメージのデプロイメント・ファイルの場所

ソース・ファイル(...\resource\Android)

一時デプロイメント・ファイル(...ViewController\deploy)

display-ldpi-icon.png

drawable-ldpi\adfmf_icon.png

display-mdpi-icon.png

drawable-mdpi\adfmf_icon.png

display-hdpi-icon.png

drawable-hdpi\adfmf_icon.png

display-xhdpi-icon.png

drawable-xhdpi\adfmf_icon.png

display-xxhdpi-icon.png

drawable-xxhdpi\adfmf_icon.png

display-xxxhdpi-icon.png

drawable-xxxhdpi\adfmf_icon.png

display-port-ldpi-splashscreen.9.png

drawable-port-ldpi\adfmf_loading.9.png

display-port-mdpi-splashscreen.9.png

drawable-port-mdpi\adfmf_loading.9.png

display-port-hdpi-splashscreen.9.png

drawable-port-hdpi\adfmf_loading.9.png

display-port-xhdpi-splashscreen.9.png

drawable-port-xhdpi\adfmf_loading.9.png

display-port-xxhdpi-splashscreen.9.png

drawable-port-xxhdpi\adfmf_loading.9.png

display-land-ldpi-splashscreen.9.png

drawable-land-ldpi\adfmf_loading.9.png

display-land-mdpi-splashscreen.9.png

drawable-land-mdpi\adfmf_loading.9.png

display-land-hdpi-splashscreen.9.png

drawable-land-hdpi\adfmf_loading.9.png

display-land-xhdpi-splashscreen.9.png

drawable-land-xhdpi\adfmf_loading.9.png

display-land-xxhdpi-splashscreen.9.png

drawable-land-xxhdpi\adfmf_loading.9.png

カスタム・イメージの場合、JDeveloperは、アプリケーション・アイコンのセットを指定の場所から一時デプロイメントの場所の対応する密度と向きのサブディレクトリにコピーします。

25.4 iOSアプリケーションのデプロイ

MAFの「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイするか、iTunesを通してデバイスにデプロイできます。

iOSアプリケーションはAppleコンピュータからのみデプロイできます。iOSシミュレータへのデプロイメントを行うために、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップを取得する必要はありません。Apple開発者として登録されていれば、App Storeから入手できないXcodeのバージョンにアクセスできるので、問題ありません。iOSデバイスへのデプロイメントに必要なiOS開発者プログラム(「iOSデバイスへのアプリケーションのデプロイ方法」と「App StoreへのiOSアプリケーションの配布方法」で説明されています)の詳細は、https://developer.apple.com/programs/を参照してください。

図25-12 「デプロイメント・アクション」ダイアログ(iOSアプリケーション用)

ヒント:

「コマンド行からのMAFアプリケーションのデプロイ」で説明されているように、「デプロイメント・アクション」ダイアログのかわりに、OJDeployコマンド行ツールを使用してモバイル・アプリケーションをiOSプラットフォームに手動でデプロイすることもできます。

25.4.1 iOSデプロイメント・プロファイルの作成方法

デプロイメント・プロファイルのプロパティ・ダイアログを使用して、iOSアプリケーションのビルド構成とアプリケーション・アイコンの場所を定義します。

始める前に:

JDeveloperも実行されているAppleコンピュータに、Xcodeをダウンロードします(Xcodeには、Xcode IDE、パフォーマンス分析ツール、iOSシミュレータ、Mac OS XおよびiOS SDKが含まれています)。

ヒント:

アプリケーションのコンパイルに最低限必要なサポート対象のバージョンについては、Oracle Technology Network (http://www.oracle.com/technetwork/developer-tools/maf/documentation)で動作保証とサポートのマトリクスを参照してください。

Xcodeはデプロイメント時に使用されるので、JDeveloperからモバイル・アプリケーションをデプロイする前にAppleコンピュータにインストールする必要があります。

ヒント:

Xcodeの最新バージョンはApp Storeから入手できますが、次のサイトから以前のバージョンをダウンロードできます。

https://developer.apple.com/xcode/

このサイトにアクセスするには、Apple IDおよびApple開発者としての登録が必要です。

Xcodeをダウンロードしたら、「iOSプラットフォーム」プリファレンス・ページで、そのxcodebuildツールの場所を入力する必要があります。iOSシミュレータへのデプロイメントの場合は、iOSシミュレータのSDKの場所を入力します。『Oracle Mobile Application Frameworkのインストール』のプラットフォームとフォーム・ファクタに応じた開発環境の構成に関する項を参照してください。

注意:

iTunesとiOSシミュレータの両方を1回以上実行してから、それらの場所をiOSプラットフォームの「プリファレンス」ページに入力します。

「デバイス署名オプションの設定」で説明されているように、モバイル・アプリケーションをiOSデバイスにデプロイする(iOSシミュレータへのデプロイメントではなく)には、iOSプロビジョニング・プロファイルからプロビジョニング・プロファイルと証明書の両方を取得する必要があります。

デプロイメント・プロファイルを作成するには:

1. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

2. 「デプロイメント」ページで、iOSデプロイメント・プロファイルをダブルクリックします。

3. 「iOSオプション」を選択します。

4. デフォルト値をそのまま使用するか、次を定義します。

- アプリケーション・バンドルID: 必要な場合は、このアプリケーションで使用する、会社のドメイン名を特定するバンドルIDを入力します。アプリケーション・バンドルIDは、iOSデバイスにインストールされた各アプリケーションに対して一意であることと、リバースパッケージ・スタイルの命名規則(つまり、com.<organization name>.<company name>)に従うことが必要です。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で利用できる『App Distribution Guide』を参照してください。iOSプロビジョニング・ポータルを使用したバンドル・シードID取得の詳細は、「アプリケーションIDの登録」を参照してください。「アプリケーション機能の表示プロパティの設定」も参照してください。

注意:

アプリケーション・バンドルIDに空白を含めることはできません。

それぞれのアプリケーション・バンドルIDは一意であるため、複数のモバイル・アプリケーションを同じデバイスにデプロイできます。アプリケーション・バンドルIDさえ異なっていれば、2つのアプリケーションに同じ名前を指定できます。同じデバイスにデプロイされるモバイル・アプリケーションは、それぞれ別のサンドボックスに配置されます。アプリケーションが相互に認識したり、データを共有することはありません(デバイス・スコープのみが共通になります)。

- アプリケーション・アーカイブ名: 必要に応じて、.ipaファイルまたは.appファイルの名前を入力します。「デプロイメント・アクション」ダイアログ(図25-12を参照)で「配布パッケージにデプロイ」または「デバイスとの同期のためにiTunesにデプロイ」オプションを選択すると、MAFによって.ipaファイルが作成されます。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、.appファイルが作成されます。または、デフォルトの名前を使用します。「iOSデバイスへのアプリケーションのデプロイ方法」と「App StoreへのiOSアプリケーションの配布方法」を参照してください。
MAFのデフォルトでは、.ipaファイル(または.appファイル)の名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。「アプリケーション機能の表示プロパティの設定」を参照してください。

- 最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

- シミュレータ: アプリケーションをデプロイするシミュレータのハードウェアとiOSバージョンを選択します。ドロップダウン・リストに、デバイスIDとともに使用可能なバージョンが表示されます。詳細は、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で利用できる『iOS Simulator User Guide』を参照してください。

- ファミリ: アプリケーションを実行するiOS製品ファミリを選択します。デフォルト・オプションはiPadとiPhoneの両方です。

25.4.1.1 iOSビルド・オプションの定義

ビルド・オプションを使用すると、デバッグ・モードまたはリリース・モードでアプリケーションをデプロイできます。プロビジョニング・プロファイルと署名済証明書が使用できる場合は、タスク内の手順に従い「iOSオプション」ページを使用して、iOSプラットフォームのビルド・オプションを設定します。

iOSビルド・オプションでは、デバッグまたはリリース・ビットとライブラリによりアプリケーションをデプロイできます。

始める前に:

iOSアプリケーション(.ipaファイル)をiOSデバイスにデプロイするには、インストールの必須コンポーネントであるプロビジョニング・プロファイルと、デバイス上の開発者とアプリケーションを特定する署名済証明書が必要です。「iOSデバイスへのアプリケーションのデプロイに関する必知事項」で説明されているように、これらはiOSプロビジョニング・ポータルから取得する必要があります。また、「デバイス署名オプションの設定」で説明されているように、「iOSプラットフォーム」のプリファレンス・ページでプロビジョニング・プロファイルの場所と証明書の名前を入力する必要があります。

ビルド・オプションを設定するには:

1. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

2. 「デプロイメント」ページで、iOSデプロイメント・プロファイルをダブルクリックします。

3. 「iOSオプション」を選択します。

4. 次のビルド・オプションから選択します。

- プッシュ通知環境: デプロイしたアプリケーションが本番用Apple Push Notification Service (APNs)サーバーを使用する場合はProductionを選択します。また、開発用APNsサーバーを使用する場合はDevelopmentを選択します。プッシュ通知を有効化するPushPluginプラグインを選択していないと、MAFは、プッシュ通知環境の値を無視します。詳細は、「プッシュ通知の有効化」を参照してください。

- アプリケーション・トランスポート・セキュリティの無効化 —アプリケーション・トランスポート・セキュリティ(ATS)は、アプリケーションからのネットワーク・リクエストを制限して、承認されたセキュア・トランスポート・プロトコルのみを使用するセキュリティ・ポリシーです。MAFではATSはデフォルトで有効になっています。「アプリケーション・トランスポート・セキュリティの無効化」を選択すると、ATSが無効な状態でMAFアプリケーションがデプロイされます。

- デバッグ: 開発用のビルドの場合はこのオプションを選択します。デバッグ・ビルドを指定すると、デバッグ・シンボルが含まれます。「iOSプラットフォームでのデバッグ方法」および「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

- リリース: リリース・ビットおよびライブラリを使用してビルドをコンパイルする場合に選択します。

ヒント:

アプリケーションのパフォーマンスをテストするには、デバッグ・モードではなくリリース・モードを使用します。

- その他のビルド引数 - XcodeでMAFアプリケーションをビルドするときに使用できる追加の引数を指定します。

MAFアプリケーションをデバッグ・モードでデプロイした場合、図25-13の左上に示すように、MAFアプリケーションの各画面に赤いアイコンが表示されます。リリース・モードでデプロイしたMAFアプリケーションでは、このアイコンはレンダリングされません。

図25-13 デバッグ・モードでデプロイされたMAFアプリケーション

25.4.1.2 デバイス署名およびエクスポート・オプションの設定

iOSの「iOSプラットフォーム」のプリファレンス・ページには、開発コンピュータ上のプロビジョニング・プロファイルの場所、チームの識別子、署名アイデンティティの名前、およびエクスポート方法のためのフィールドが含まれています。

アプリケーションを配布パッケージにデプロイしたり、デバイスとの同期のためにiTunesにデプロイする場合は、これらのパラメータを定義する必要があります。署名アイデンティティはアプリケーションのコード署名に使用します。Xcodeで開発用証明書が必要な場合、証明書とその公開鍵はメンバー・センターに格納され、署名アイデンティティ(公開鍵と秘密鍵を保持する証明書)は開発者のキー・チェーンに格納されます。この秘密鍵がないとコード署名できません。

注意:

アプリケーションをiOSシミュレータにデプロイする場合、署名アイデンティティ、プロビジョニング・プロファイルまたはエクスポート方法を指定する必要はありません。

デバイス署名およびエクスポート・オプションの設定手順:

1. 「JDeveloper」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」→「iOSプラットフォーム」を選択します。

2. 「プロビジョニング・プロファイル」ドロップダウン・リストからプロビジョニング・プロファイルを選択します。

3. 「チーム」フィールドに、チームの識別子を入力します。このフィールドには、手順2で選択したプロビジョニング・プロファイルからMAFによって抽出された値が自動的に移入されます。

4. 「署名アイデンティティ」フィールドに、コードの作成者(開発者や会社など)を特定する開発者または配布証明書の名前を入力します。証明書の名前は、Keychain Accessユーティリティ(Applicationsフォルダからアクセス)を使用して表示できます。Keychain Accessユーティリティから名前全体をコピーしてください。このフィールドに入力された名前は、次の例のように表示されます。

iPhone Developer: John Smith (Oracle123)

図25-14 iOSプラットフォームの「プリファレンス」ページの「デバイス署名」および「エクスポート・オプション」セクション

5. 「メソッド」ドロップダウン・リストから、Xcodeがアプリケーションのアーカイブをエクスポートする方法を記述するオプションを選択します。

- 非定型: 非定型のプロファイルのプロビジョニングを使用して、テストできるデバイスにアプリケーションを配布する場合。デバイスは開発者アカウントに登録されている必要があります。

- アプリケーション・ストア: 配布プロビジョニング・プロファイルを使用して、Apple App Storeにアプリケーションを公開する場合。

- 開発モード: 開発者プロビジョニング・プロファイルを使用して、デバッグのために開発者のアカウントの登録済デバイスにアプリケーションをデプロイする場合。

- エンタープライズ: エンタープライズ・プロビジョニング・プロファイルを使用して、エンタープライズ内のアプリケーションを配布する場合。

注意:

プロビジョニング・プロファイルには、アプリケーションの開発バージョン用とリリース・バージョン用の両方があります。アプリケーションのリリース・バージョンに使用されるプロビジョニング・プロファイルは、あらゆるデバイスにインストールできます。一方、開発バージョン用のプロビジョニング・プロファイルは、IDがプロファイルに埋め込まれたデバイスのみにインストールできます。iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)にある『App Distribution Guide』を参照してください。

25.4.1.3 iOSアプリケーションへのカスタム・イメージの追加

「アプリケーション・イメージ」ページでは、指定したアプリケーション・アイコン、およびカスタム・イメージ付きのアートワークに使用されているデフォルトのOracleイメージをオーバーライドすることで、アプリケーションをリブランドできます。

図25-15に、様々な状況、デバイスの向きおよびデバイスの解像度で使用されるカスタム・イメージの場所を入力できる、「アプリケーション・イメージ」ページを示します。iOSアプリケーション・アイコン・イメージの詳細は、『iOS Human Interface Guidelines』のIcon and Image Designセクションを参照してください。このドキュメントは、iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)から入手できます。

注意:

すべてのイメージはPNG形式であることが必要です。

カスタム・イメージを追加するには:

1. 「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」を選択します。

2. 「デプロイメント」ページで、iOSデプロイメント・プロファイルをダブルクリックします。

3. iOS用デプロイメント・プロファイルのプロパティ・エディタの左側にあるツリーから、「iOSオプション」→「アプリケーション・イメージ」を選択します。

4. 「参照」を選択し、アイコン・イメージを選択して、iTunesによって.ipaファイルに割り当てられるデフォルトのAppleイメージをオーバーライドします。このイメージはすべてのアプリケーションに必要とされ、iPhoneアプリケーションとiPadアプリケーションのどちらも512 x 512ピクセルであることが必要です。「iTunesアートワークに関する必知事項」を参照してください。

5. 使用可能なイメージ・タイプをツリーに表示するデバイス・タイプを選択します。デフォルトでは、MAFはiPadおよびiPhoneデバイスで使用可能なすべてのイメージ・スタイルおよびイメージ・タイプを表示します。ただし、図25-15に示すように、デバイス・タイプを選択して選択を絞り込むことができます。MAFは、「アイコン・フォルダ」フィールドに、該当するイメージ・ファイルが格納されているアプリケーションのResourcesディレクトリ内の場所を表示します。

図25-15 アプリケーション・イメージの選択

6. ツリーからイメージ・タイプを選択します。

7. 別のイメージを選択するには、「ファイル」フィールドで「参照」を選択します。このイメージ・ファイルは、現在のアプリケーション内に存在する必要があります。

デプロイメント時に、JDeveloperはカスタム・イメージ・ファイルをデプロイメント・プロファイルにコピーし、その名前をデフォルト・イメージの名前に一致するように変更します。

8. 「OK」をクリックします。

25.4.1.4 iTunesアートワークに関する必知事項

iTunesでiOSデバイスにデプロイされたアプリケーションは、デフォルトのOracleイメージを使用します。アプリケーションのバージョン間の違いを区別するために、デプロイ済のアプリケーションのアイコンとしてiTunesアートワーク・イメージを選択できます。

デフォルトでは、iTunesを介してiOSデバイスにデプロイされたモバイル・アプリケーションは、特に指定がないかぎり、デフォルトのOracleイメージを使用します。

デプロイされるアプリケーションのアイコンとしてiTunesアートワーク・イメージを選択することで、デフォルトのイメージをオーバーライドします。イメージを使用してアプリケーションのバージョンを区別できます。図25-16に、デフォルト・イメージとユーザーが選択したイメージの違いを示します。Application4にはデフォルト・イメージが、Application6にはユーザーが選択したイメージ(512 x 512ピクセルにスケールを変更したOracleアイコン)が表示されています。

図25-16 カスタムとデフォルトのアプリケーション・アイコン

デプロイメント時に、MAFは、.ipaファイルのトップレベルのiTunesArtworkというファイルにそのiTunesのアートワーク・イメージを追加することで、iTunesでそのアイコンが表示されるようにします。

注意:

iTunesアートワークがアプリケーションにパッケージ化されるのは、デバイスとの同期のためにiTunesにデプロイというデプロイメント・タイプを選択した場合のみです。

25.4.1.5 表示をデバイスの特定の向きに制限する方法

デフォルトでは、MAFは、iPhoneとiPadの両方ですべての向きをサポートしています。たとえば、iPads上で上下逆の縦向きでのみ表示する必要があるアプリケーションでは、アプリケーションの回転をこれらの向きのみに制限できます。

図25-17に、MAFアプリケーションがサポートするデバイスの向きを選択する、「デバイスの向き」ページを示します。

図25-17 デバイスの向きの選択

アプリケーションの表示をデバイスの特定の向きに制限するには:

1. 図25-17に示すように、「デバイスの向き」を選択します。

2. 表25-3にリストされた向きの中から、不要な向きをすべて消去します。デフォルトでは、MAFは、これらすべてのデバイスの向きにデプロイします。デフォルトでは、これらの向きがすべて選択されています。

表25-3 iPhoneデバイスの向き

アイコン

説明

iPad、縦: ホーム・ボタンは画面の下部。

iPad、上下逆: ホーム・ボタンは画面の上部。

iPad、横左: ホーム・ボタンは画面の左側。

iPad、横右: ホーム・ボタンは画面の右側。

iPhone、縦: ホーム・ボタンは画面の下部。

iPhone、上下逆: ホーム・ボタンは画面の上部。

iPhone、横左: ホーム・ボタンは画面の左側。

iPhone、横右: ホーム・ボタンは画面の右側。

3. 「OK」をクリックします。

25.4.2 iOSシミュレータへのiOSアプリケーションのデプロイ方法

前提条件が満たされていることを確認し、タスク内の手順に従って、iOSシミュレータにアプリケーションをデプロイします。このタスクでは、「デプロイ」に「アプリケーションのシミュレータへのデプロイ」を使用します。

「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイできます。

始める前に:

iOSシミュレータへのデプロイメントを可能にするには、次のタスクを実行する必要があります。

- Xcodeをインストールして実行し、ライセンス契約を受諾して、指示に従ってインストール後のその他のタスクを実行します。

注意:

アプリケーションをiOSシミュレータにデプロイする前に、最低1回はXcodeを実行する必要があります。これを行わないと、デプロイメントに失敗します。

- デプロイメント・プロファイルの「iOSオプション」ページで、「デバッグ」を選択し、「OK」をクリックします。

- アプリケーションをデプロイする前に、iOSシミュレータが実行されている場合は、そのシミュレータを停止します。シミュレータを停止しなかった場合は、デプロイメント中にその処理が実行されます。

- iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)にある『Simulator User Guide』を参照してください。iOSシミュレータはXcodeとともにインストールされます。

iOSシミュレータにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「アプリケーションのシミュレータへのデプロイ」をクリックしてから、「次へ」をクリックします。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- シグネチャ: アプリケーションを作成した開発者または会社。「iOSプラットフォーム」のプリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。「iOSプラットフォーム」のプリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- チーム: チームの識別子。このフィールドには、プロビジョニング・プロファイルからMAFによって抽出された値が自動的に移入されます。

注意:

iOSシミュレータへのデプロイメントでは、署名アイデンティティ、チームおよびプロビジョニング・プロファイルの値を定義する必要はありません。このデプロイメント・シナリオでは、「サマリー」ページでこれらの値について<指定なし>と表示されます。

25.4.3 iOSデバイスへのアプリケーションのデプロイ方法

「デバイスとの同期のためにiTunesにデプロイ」オプションを使用すると、モバイル・アプリケーションをデバッグおよびテスト用のiOSデバイスにデプロイできます。iOSデバイスまたは配布サイトへのデプロイメントには、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップが必要です。

これらのプログラムの詳細は、https://developer.apple.com/programs/を参照してください。

始める前に:

JDeveloperからiOSデバイスにアプリケーションを直接デプロイすることはできません。アプリケーションは、Apple iTunesのApplicationsフォルダからデプロイする必要があります。そのためには、次のタスクを実行する必要があります。

- Apple iTunesを開発コンピュータにダウンロードし、それを1回以上実行して、必要なフォルダとディレクトリを作成します。

- 「iOSプラットフォーム」のプリファレンス・ページで、Automatically Add to iTunesフォルダの場所(アプリケーションのデプロイメントに使用される場所)を設定します(図25-18を参照)。

ヒント:

ユーザーのホーム・ディレクトリ(/Users/<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プラットフォームの設定ページでも場所を更新する必要があります。

図25-18 iTunes Mediaフォルダの場所の設定

- プロビジョニング・プロファイル、チーム識別子、署名アイデンティティおよびエクスポート方法の名前と場所を「iOSプラットフォーム」のプリファレンス・ページで入力します。iOS Provisioning Portalによって、iOSデバイスへのデプロイメントまたはApp Storeや内部ダウンロード・サイトへの.ipaファイルの公開に必要な証明書とプロビジョニング・プロファイルが生成されます。

注意:

iOSプロビジョニング・プロファイル、チーム識別子、署名アイデンティティおよびエクスポート・メソッドを設定していないと、デバイスまたはアーカイブにデプロイするデプロイメントは失敗します。MAFでは、このような状況でデプロイに失敗したアプリケーションがログに記録されます。「iOSデバイスへのアプリケーションのデプロイに関する必知事項」を参照してください。

- デプロイメント・プロファイルの「iOSオプション」ページで、「デバッグ」を選択して「OK」をクリックします。

- iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』を参照してください。

iOSデバイスにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「デバイスとの同期のためにiTunesにデプロイ」→「次へ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- シグネチャ: アプリケーションを作成した開発者(または会社)。「iOSプラットフォーム」のプリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。「iOSプラットフォーム」のプリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- チーム: チームの識別子。このフィールドには、プロビジョニング・プロファイルからMAFによって抽出された値が自動的に移入されます。

- メソッド: 「iOSプラットフォーム」のプリファレンス・ページで選択するエクスポート・メソッド。MAFはこの値をXcodeに渡します。

注意:

iTunesへのデプロイメントを可能にするには、「iOSプラットフォーム」のプリファレンス・ページでシグネチャ、チーム、プロビジョニング・プロファイルおよびメソッド(エクスポート)の値を指定する必要があります。

4. iOSデバイスを開発コンピュータに接続します。

5. iTunesを開いてデバイスを同期化します。

25.4.4 iOSデバイスにアプリケーションをデプロイする場合の処理

デプロイメントに成功すると、図25-16のようにアプリケーションがiTunesの「Apps」フォルダに表示されます。

25.4.5 iOSデバイスへのアプリケーションのデプロイに関する必知事項

プロビジョニング・プロファイルは、iOSデバイスにアプリケーションをデプロイする前に、iOS Provisioning Portalを使用して作成しておく必要があります。

iOS Developer Programのメンバーのみがアクセス可能なiOS Provisioning Portalを使用して最初にプロビジョニング・プロファイルを作成しないかぎり、iOSアプリケーション(つまり、.ipaファイル)をiOSデバイスにデプロイしたり、App Storeまたは内部のホストされたダウンロード・サイトに公開することはできません。「デバイス署名オプションの設定」の説明に従って、「iOSプラットフォーム」のプリファレンス・ページでプロビジョニング・プロファイルの場所と証明書の名前を入力します。

『App Distribution Guide』(http://developer.apple.com/library/ios/navigation/のiOS Developer Libraryで入手可能)で説明されているように、プロビジョニング・プロファイルによって開発用証明書、デバイスおよびアプリケーションIDが関連付けられます。iOS Provisioning Portalでは、これらのエンティティとプロビジョニング・プロファイルを作成できます。

ヒント:

プロビジョニング・プロファイルをダウンロードしたら、このファイルをダブルクリックしてLibrary/MobileDevice/Provisioning Profileディレクトリに追加してください。

図25-19 iOS Provisioning Portal

25.4.5.1 iOS開発用証明書の作成

iOS開発用証明書により、開発者のアイデンティティは公開鍵と秘密鍵に電子的に関連付けられます。証明書をダウンロードして開発者のコンピュータにインストールし、アプリケーションにデプロイメントのための署名をします。

証明書は、開発者のアイデンティティに関する情報と公開鍵および秘密鍵が結合された電子的なドキュメントです。iOS開発用証明書がOS開発者として識別し、デプロイメントのためのアプリケーションの署名を有効にするので、証明書をダウンロードしたら、基本的に開発者自身のアイデンティティを開発コンピュータにインストールします。iOSオペレーティング環境では、すべての証明書がKeychainによって管理されます。

iOS Provisioning Portalの「Certificates」ページを使用して、CSR(証明書署名リクエスト)をログに記録します。CSRを完了すると、iOS Provisioning PortalによってiOS開発用証明書が発行されます。

25.4.5.2 テストおよびデバッグ用のAppleデバイスの登録

iOS Provisioning Portalの「Devices」ページにある「Current Available Devices」リストにAppleデバイスが含まれている必要があります。これにより、そのデバイスがアプリケーションのデプロイが可能なデバイスとして一意に識別されます。

開発コンピュータに証明書をインストールしたら、「Current Available Devices」タブ(iOS Provisioning Portalの「Devices」ページ内)をレビューして、開発者自身(またはその会社)がテストやデバッグに使用するAppleデバイスを特定します。シリアル番号のような一意のデバイス識別子(UDID)によって各デバイスを識別するこのリストにデバイスが含まれていないかぎり、アプリケーションはデプロイできません。

25.4.5.3 アプリケーションIDの登録

アプリケーションIDによって、デバイス上のアプリケーションは一意に特定されます。アプリケーションIDは、バンドルID (「iOSプラットフォーム」の「プリファレンス」ページに示されるアプリケーションIDと同じ)と、Apple社から配布される10文字(英数字)の接頭辞で構成されます。

アプリケーションIDは、デバイス上のアプリケーションの一意の識別子です。アプリケーションIDは、「MAFアプリケーションの表示プロパティの設定」で説明されている書式の、バンドルIDと呼ばれる管理者が作成したリバース・ドメイン名の前に、バンドル・シードと呼ばれるAppleが生成した10文字の英数字文字列が付加された構成になります。図25-20には、他のアプリケーションとファイルやKeychainを共有しない、一意のアプリケーションIDが示されています。

図25-20 明示的なアプリケーションID

8E549T7128.com.oracle.*のように、アプリケーション名にワイルドカード文字(*)を使用すると、一連のアプリケーション間でアプリケーションIDを共有できます。たとえば、com.oracle.MAF.*という管理者名がiOSプロビジョニング・ポータルにある場合、これにより、異なるアプリケーション(com.oracle.MAF.application1およびcom.oracle.MAF.application2)を指定できます。

注意:

アプリケーションでプッシュ通知を受信する場合、アプリケーションIDは、ワイルドカード文字ではなく、完全な一意のIDである必要があります。ワイルドカードによって識別されるアプリケーションでは、プッシュ通知を受信できません。iOS開発者ライブラリ(http://developer.apple.com/library/ios/navigation/)で入手可能な『Local and Push Notification Programming Guide』の「Provisioning and Development」を参照してください。

アプリケーション間で8E549T7128などの同じ接頭辞を共有する場合、それらのアプリケーションでは、ファイルまたはキー・チェーンを共有できます。

注意:

バンドルIDは、「iOSプラットフォーム」のプリファレンス・ページで設定されたアプリケーションIDと一致する必要があります。

25.4.6 App StoreへのiOSアプリケーションの配布方法

iOSデバイス上でのアプリケーションのテストとデバッグが終了したら、App Storeまたは内部ダウンロード・サイトを通してより広範なオーディエンスにアプリケーションを配布できます。

App Storeにアプリケーションを公開するには、.ipaファイルをiTunes Connectに送信する必要があります。これによって、.ipaファイルをiTunesに追加して、アプリケーションを更新し、テスト・ユーザーを作成することが可能になります。

始める前に:

アプリケーションを配布する前に、次のタスクを実行する必要があります。

- 図25-18に示す、「iOSプラットフォーム」のプリファレンス・ページに、「"iTunes に自動的に追加"ディレクトリ」の場所を入力し、「エクスポート・オプション」セクションの「エクスポート」ドロップダウン・リストからApp Storeまたは「エンタープライズ」を選択します。

ヒント:

この場所を入力する前に、iTunesを1回以上実行します。「iOSデバイスへのアプリケーションのデプロイ方法」も参照してください。

- 実際のiOSデバイス上でアプリケーションをテストします。「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- iOS Provisioning Portalを通して配布証明書を取得します。

注意:

配布証明書を作成できるのは、チーム・エージェントのみです。

- .ipaファイルをiTunesに配布するための、iTunes Connectアカウントを取得します。詳細は、http://developer.apple.com/のApp Store配布ガイドラインを参照してください。

- iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『iTunes Connect Developer Guide』を参照してください。

- デプロイメント・プロファイルの「iOSオプション」ページで、ビルド・モードとして「リリース」を選択し、「OK」をクリックします。

iOSアプリケーションをApp Storeに配布するには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「配布パッケージにデプロイ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- シグネチャ: アプリケーションの作成者。デプロイメント・プロファイルの「iOSプラットフォーム」のプリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。「iOSプラットフォーム」のプリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- チーム: チームの識別子。このフィールドには、プロビジョニング・プロファイルからMAFによって抽出された値が自動的に移入されます。

- メソッド: 「iOSプラットフォーム」のプリファレンス・ページで選択するエクスポート・メソッド。MAFはこの値をXcodeに渡します。

注意:

.ipaファイルがiTunesで受け入れられるようにするには、「iOSプラットフォーム」のプリファレンス・ページでシグネチャ、プロビジョニング・プロファイル、チームおよびメソッドの値を指定する必要があります。

4. iTunes Connectにログインします。

5. .ipaファイルをiTunes Connectに送信して検討します。詳細は、『iTunes Connect Developer Guide』(http://developer.apple.com/library/ios/navigation/)を参照してください。

6. バイナリの更新の詳細は、『iTunes Connect Developer Guide』(http://developer.apple.com/library/ios/navigation/)を参照してください。

25.5 ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ

MAFアプリケーションは、アプリケーションを開発するローカル・マシン、またはサポートされているUWPデバイス上へのアプリケーションのインストールに使用するインストール・パッケージにデプロイできます。

MAFには、UWPにデプロイするアプリケーション用に2つのビルド・モードが用意されています。開発サイクル中にアプリケーションをテストおよびデバッグする場合は、デバッグ・モードを使用します。リリースの準備が完了したアプリケーションをデプロイする場合は、リリース・モードを使用します。

リリースの準備が完了したアプリケーションは、Windowsストアに公開できません。別のメカニズムを選択して、アプリケーションを配布します。MAFではPowerShellスクリプトがインストール・パッケージに含まれており、これを実行するとアプリケーションがUWPデバイスにインストールされます。

UWPへのアプリケーションのデプロイを試行する前に、次の設定タスクと構成タスクを実行します。

1. 開発マシンが、MAFアプリケーションをUWPにデプロイするための要件を満たしていることを確認します。使用するUWPデバイスでは、Windows 10オペレーティング・システムが実行される必要があります。このマシンで開発者モードを有効にする必要があります。
『Oracle Mobile Application Frameworkのインストール』のMAFアプリケーションをWindowsプラットフォームにデプロイするためのインストール要件に関する項を参照してください。

2. MicrosoftのVisual Studioソフトウェアをインストールします。Visual Studioパッケージには、UWPにアプリケーションをデプロイするために必要な、Windows SDKが含まれています。
『Oracle Mobile Application Frameworkのインストール』のユニバーサルWindowsプラットフォーム用の開発ツールの設定に関する項を参照してください。

3. デプロイするアプリケーションにデジタル署名するための証明書(個人情報交換ファイル)を作成します。
『Oracle Mobile Application Frameworkのインストール』のMAFアプリケーション用のPFXファイルの作成に関する項を参照してください。

4. 「Windowsプラットフォーム」ダイアログに次の値を入力します(図25-21を参照)。

- Visual StudioソフトウェアとともにインストールされるWindows SDKの場所。

- アプリケーションの署名に使用する証明書の場所およびパスワード(必要な場合)。MAFアプリケーションをデバッグ・モードとリリース・モードの両方でデプロイする場合は、これを「デバッグ」ダイアログと「リリース」ダイアログの両方で実行します。

- 「ハッシュ・アルゴリズム」フィールドは無視します。MAFでは使用しません。

JDeveloperの「ツール」メニューから「Windowsプラットフォーム」ダイアログにアクセスするには、図25-21に示すように、「プリファレンス」、「モバイル・アプリケーション・フレームワーク」の順にクリックします。

図25-21 MAFアプリケーションをデプロイする場合の「Windowsプラットフォーム」の「プリファレンス」

MAFには、デバッグ・モードでMAFアプリケーションをデプロイするための、すぐに使用できるデプロイメント・プロファイル(Windows1)が用意されています。開発マシンおよび環境がセットアップ要件と構成要件を満たしている場合は、アプリケーションをローカル・マシンまたはパッケージにデプロイできます。

このすぐに使用できるデプロイメント・プロファイルを編集することも、1つまたは複数の新しいデプロイメント・プロファイルを作成することもできます。新しいデプロイメント・プロファイルを作成するか、既存のプロファイルを編集して、次のことを実行できます。

- アプリケーション用に追加のライブラリおよびプロファイル依存性を指定します。

- ビルド・モードをデバッグまたはリリースから選択します。

- アプリケーション・バンドルID、アーカイブ名、バージョンなどのオプションを指定します。

- アプリケーションがスプラッシュ画面でそのロゴをレンダリングするために使用するイメージ、およびユーザーのデバイスに表示されるアイコンを指定します。

デプロイメント・プロファイルの編集方法または作成方法の詳細は、「デプロイメント・プロファイルでの作業」を参照してください。各ダイアログで構成できるフィールドについて情報を得るために、デプロイメント・プロファイルのダイアログで「ヘルプ」をクリックします。

アプリケーションをデプロイする前に、デプロイメントを妨げる可能性のある次の問題に注意してください。

- Microsoft Windowsでは、ディレクトリおよびファイルのパスの最大長が設定されています。MAFアプリケーションのデプロイメントは、MAFアプリケーションのパスが最大パス長を超過すると失敗します。この問題を回避するには、ディレクトリのパスの長さがWindowsで規定されている最大長未満の場所にMAFアプリケーションを配置します。最大パス長の制限の詳細は、Microsoftのドキュメントを参照してください。

- 「アプリケーションのローカル・マシンへのデプロイ」オプションを使用してMAFアプリケーションをデプロイする前に、他のプロセスがMAFアプリケーションのデータ・フォルダを使用していないことを確認します。アプリケーションのデータ・フォルダは、通常、C:\Users\[userName]\AppData\Local\Packages\[appBundleId]_[id]にあります。別のプロセスがこのフォルダを使用しているシナリオの例には、メモ帳などのアプリケーションでフォルダ内のファイルを開いている場合があります。どのアプリケーション・プロセスがディレクトリやファイルを使用しているか判別できない場合は、問題を解決するためにマシンを再起動します。

- 連絡先プラグインを使用するアプリケーションをUWPにデプロイするときには、連絡先プラグインがmaf-plugins.xmlのプラグイン・リストで最初にリスとされていることを確認します。

デバッグ・モードでデプロイするアプリケーションのデバッグ方法の詳細は、「ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法」を参照してください。

25.5.1 ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ方法

アプリケーションをUWPにデプロイする、Windows用MAFのデプロイメント・プロファイルを使用してアプリケーションをデプロイします。

MAFアプリケーションをUWPにデプロイするには:

1. JDeveloperのメイン・メニューから、「アプリケーション」→「デプロイ」→「Windows1」を選択します。
ここで、「Windows1」は、Windows用MAFのデプロイメント・プロファイルです。

2. 表示されるダイアログのリストから適切なデプロイメント・オプションを選択します。

3. 「終了」をクリックします。

25.5.2 ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ時に行われる処理

「アプリケーションのローカル・マシンへのデプロイ」オプションと「アプリケーションのパッケージへのデプロイ」オプションのどちらを選択したかによって、MAFはアプリケーションをコンピュータまたはインストール・パッケージにデプロイします。

「アプリケーションのローカル・マシンへのデプロイ」オプションを選択した場合、MAFは使用しているマシンにアプリケーションをデプロイし、そこにアプリケーションをインストールします。図25-22の前景は、リリース・モードでローカル・マシンにデプロイされたWorkBetterサンプル・アプリケーションの例です。図25-22の背景では、Windows 10コンピュータの「アプリと機能」ページのインストール済アプリケーション内にWorkBetterサンプル・アプリケーションがリストされていることがわかります。

デバッグ・モードでデプロイしたMAFアプリケーション画面の左上に赤いアイコンが表示され、アプリケーションがデバッグ・モードであることを示します。リリース・モードでデプロイしたアプリケーションと同様に、このアプリケーションはWindows 10コンピュータの「アプリと機能」ページで表示とアンインストールを実行できます。

図25-22 Windowsローカル・マシンにリリース・モードでデプロイされたMAFアプリケーション

「アプリケーションのパッケージへのデプロイ」オプションを選択し場合、MAFはアプリケーションを次のディレクトリのインストール・パッケージにデプロイします。

C:\path\to\appRoot\deploy\[DeploymentProfileName]\[deployMode]\MafTemplate\AppPackages

たとえば、「Windows1」デプロイメント・プロファイルを使用してリリース・モードでデプロイされたWorkBetterサンプル・アプリケーション(図25-22を参照)は、次のディレクトリにデプロイされます。

C:\...\PublicSamples\WorkBetter\deploy\Windows1\release\MafTemplate\AppPackages

AppPackagesディレクトリには、別のディレクトリ(MafTemplate_*_Test)が含まれています。この後者のディレクトリの内容を、サポートされているUWPデバイスを持ち、MAFアプリケーションをインストールする必要があるエンド・ユーザーに配布します。このディレクトリにはPowerShellスクリプト(Add-AppDevPackage.ps1)が含まれており、エンド・ユーザーはこれを実行して、アプリケーションをインストールします。このスクリプトに加えて、このディレクトリにはアプリケーション・パッケージ、依存パッケージ、およびアプリケーションに署名した証明書が含まれます。次の例では、これらの内容をリストします。

Add-AppDevPackage.ps1
Add-AppDevPackage.resources
Dependencies
MafTemplate_1.0.0.0_x64.appx
MafTemplate_1.0.0.0_x64.appxsym
MafTemplate_1.0.0.0_x64.cer

MafTemplate_*_Testディレクトリおよびファイルの名前は、「Windowsオプション」ダイアログで指定したバージョン番号とビルド・モードによって異なります(図25-23を参照)。このダイアログには、デプロイメント・プロファイルを編集するときにJDeveloperの「デプロイメント」ページからアクセスします。「デプロイメント」ページにアクセスするには、「アプリケーション」をクリックして「アプリケーションのプロパティ」をクリックします。

たとえば、バージョン番号として2を指定し、「デバッグ」ビルド・モードを選択した場合、ディレクトリ名はMafTemplate_2.0.0.0_x64_Debug_Testになります。バージョン番号が3で、リリース・ビルド・モードの場合は、MafTemplate_3.0.0.0_x64_Testディレクトリが生成されます。

図25-23 デプロイメント・プロファイルの「Windowsオプション」ダイアログ

25.6 アプリケーションのMAFクイック・デプロイメントの概要

クイック・デプロイメントにより、いくつかのデプロイメント・ステップが省略され、デプロイ時間の節約になります。クイック・デプロイメントは、新しいファイル・コンテンツまたは変更されたファイル・コンテンツのみをエミュレータまたはシミュレータに渡すことで時間を節約します。

MAFクイック・デプロイメントでは、パフォーマンスを低下させることなく、競争上優位なデプロイメント時間を提供することで、開発者の生産性を確保します。

アプリケーションのクイック・デプロイメント

クイック・デプロイメントでは、通常の完全なデプロイメントとは対照的に、デプロイメント・ステップをスキップすることでデプロイメント時間を短縮します。クイック・デプロイメントは、ファイルの新しい内容または変更された内容のみをエミュレータまたはシミュレータに渡します。

Androidエミュレータでクイック・デプロイメントを使用するには、「アプリケーションのエミュレータへのデプロイ」アクションを選択します。たとえば、Android2という名前のデプロイメント・プロファイルの場合は、「アプリケーション」メニューで「デプロイ」を選択し、「Android2」を選択してから、デプロイメント・アクションを選択します。「AndroidエミュレータへのAndroidアプリケーションのデプロイ」を参照してください。iOSシミュレータでクイック・デプロイメントを使用するには、iOS2という名前のデプロイメント・プロファイルの場合、「アプリケーション」メニューで「デプロイ」を選択し、「iOS2」を選択してから、デプロイメント・アクションを選択します。「iOSシミュレータへのiOSアプリケーションのデプロイ」を参照してください。

注意:
最初のデプロイメントは完全なデプロイメントです。クイック・デプロイメントは、最初の完全なデプロイメントの後で実行できます。

エミュレータまたはシミュレータにアプリケーションをデプロイすると、クイック・デプロイメント・セッション分析が開始されます。分析の結果によって、デプロイメントをクイック・デプロイメントにするか完全なデプロイメントにするかが決定されます。

クイック・デプロイメント・セッション分析は、アプリケーション・ファイルの変更を検出するために開始されます。アプリケーション・ファイルの変更を分析するMAFツールによってクイック・デプロイメントがトリガーされます。分析で同じデプロイメント・プロファイルを使用する前回のクイック・デプロイメント・セッションからデプロイメント・アーティファクトを見つけられない場合は、完全なデプロイメントがトリガーされます。

MAFでは、デプロイメント機能が簡略化されています。JDeveloperでアプリケーション・ファイルに変更を加えると、それらの変更は、エミュレータまたはシミュレータにデプロイされたアプリケーションに移動されるため、再デプロイメントの必要はありません。

クイック・デプロイメントの主な機能

クイック・デプロイメントには次の機能があります。

- クイック・デプロイメントは、AndroidエミュレータまたはiOSシミュレータにデプロイされているアプリケーションでサポートされます。

- 仮想ボックス・イメージに対してルート・アクセスが構成されている場合は、そのイメージをクイック・デプロイメントに使用できます。

- AMXページやタスク・フローへの変更など、JDeveloperでアプリケーションに変更を加えると、その変更はエミュレータやシミュレータにデプロイされているアプリケーションにプッシュされるため、完全なデプロイメントは必要ありません。アプリケーションの変更の完全なリストは、「クイック・デプロイメントをサポートするアーティファクト」を参照してください。

- ファイルを削除すると、完全なデプロイメントがトリガーされます。

- アプリケーションのクイック・デプロイメントでは、新しいファイルと変更されたファイルのみが更新されます。クイック・デプロイメントでは追加のデプロイメント処理は実行されません。

25.6.1 クイック・デプロイメントをサポートするアーティファクトについて

特定のアーティファクトやAMXページへの変更、バインディングの変更などが、MAFクイック・デプロイメントをサポートしています。

MAFクイック・デプロイメントをサポートするアーティファクトの変更

次のアーティファクトの変更は、クイック・デプロイメントをサポートします。

- AMXページへの変更

- タスク・フローへの変更

- バインディングへの変更

- maf-skins.xmlへの変更

- 新しいスタイル・シートの追加およびmaf-skins.xmlでの参照

- maf-config.xmlへの変更

- adf-config.xmlへの変更

- connections.xmlへの変更

- wsm-assembly.xmlへの変更

- sync-config.xmlへの変更

25.6.2 クイック・デプロイメントの要件について

クイック・デプロイメントは、リスとされた前提条件が満たされている場合にのみ開始されます。

MAFアプリケーションのクイック・デプロイメントの前提条件

アプリケーションのクイック・デプロイメントは、次の要件を満たすと開始されます。

- ターゲットのAndroidエミュレータまたはiOSシミュレータでインストール済アプリケーションが利用可能である。

- MAFアプリケーションのバンドルIDが一意である。

- 最初の完全なデプロイメントが完了済である。

25.6.3 クイック・デプロイメント・セッション中の処理

クイック・デプロイメント・セッションは、デプロイメントをクイック・デプロイメントと完全なデプロイメントのどちらにする必要があるかを分析して判断します。このセッションは、アプリケーションのデプロイ時に開始されます。

エミュレータまたはシミュレータにアプリケーションをデプロイすると、クイック・デプロイメント・セッションが開始されます。セッションによって分析が実行され、デプロイメントをクイック・デプロイメントにするか完全なデプロイメントにするかが決定されます。

MAFクイック・デプロイメント・セッションと分析

クイック・デプロイメント・セッションは、次のように処理を進めます。

- 最初のクイック・デプロイメント・セッション分析を実行します。

- アプリケーション・ファイルへの次の変更を記録します。

- 最後のクイック・デプロイメント・セッション以降の変更

- 同じデプロイメント・プロファイルを使用するアプリケーションへの変更

- 変更したファイルでクイック・デプロイメントがサポートされている場合は、クイック・デプロイメントのための次のようなステップが実行されます。そうでない場合は、フル・デプロイメントが行われます。

- 変更したファイルをエミュレータまたはシミュレータにコピーします。

- エミュレータまたはシミュレータでアプリケーションを再起動します。

25.6.4 アプリケーションの完全なデプロイメントの開始方法

特定のアクションによって、アプリケーションの完全なデプロイメントがトリガーされます。アプリケーションの完全なデプロイメントが必要な場合は、リストされたアクションの1つを開始します。

アプリケーションの完全なデプロイメントをトリガーするアクション

次のアクションは、アプリケーションの完全なデプロイメントをトリガーします。

- JDeveloperが再起動された。

- MAF以外のプロジェクトでファイルが変更された。

- MAF機能プロジェクト内のJavaファイルが作成、変更または削除された。

- MAF以外のプロジェクトでファイルが変更され、デプロイメントの前に「すべてクリーン」が実行された。

- MAF機能プロジェクト外において、アプリケーションでファイルが削除された。

- アプリケーションが別のデプロイメント・プロファイル(前のクイック・デプロイメントで使用されていないプロファイル)を使用してデプロイされた。

- アプリケーション・レベルの一部のアーティファクトによって、完全なデプロイメントがトリガーされる場合があります。次のアーティファクトへの変更は、完全なデプロイメントをトリガーします。

- maf-application.xml

- maf-feature.xml

- maf-plugins.xml

- maf.properties

- logging.properties

25.6.5 アプリケーションの完全なデプロイメントの強制方法

特定のアクションを開始すると、アプリケーションの完全なデプロイメントを強制的に実施できます。リストされたアクションの1つを開始することで、完全なデプロイメントを開始します。

特定のユーザー・アクションは、MAFアプリケーションの完全なデプロイメントを強制します。

MAFアプリケーションの完全なデプロイメントを強制するアクション

アプリケーションの完全なデプロイメントは、複数の方法で強制できます。MAFアプリケーションの完全なデプロイメントをトリガーするには、次のいずれかのアクションを使用します。

- クイック・デプロイメントをサポートしないファイルを変更します。

- 「ビルド」をクリックし、「すべてクリーン」をクリックします。

- AndroidエミュレータまたはiOSシミュレータでアプリケーションをアンインストールします。

- JDeveloperを再起動します。

25.6.6 クイック・デプロイメントの制限に関する必知事項

MAFアプリケーションのクイック・デプロイメントに関して、いくつかの制限があります。リストに制限を列挙します。

クイック・デプロイメントの制限: ファイルのデプロイメントおよびユーザー・アクション

次のファイルは、デプロイメント中に追加処理が必要になるため、クイック・デプロイメントではデプロイできません。

- MAF ViewControllerまたはApplicationControllerプロジェクト以外のプロジェクトで作成、更新または削除されたファイル

- MAF機能プロジェクト外で削除されたアプリケーション・ファイル

- MAF機能プロジェクト内から削除されたファイル

- 新規、変更または削除されたJavaファイル

- アプリケーション・レベルの次のアーティファクトへの変更は、完全なデプロイメントをトリガーします。

- maf-application.xml

- maf-feature.xml

- maf-plugins.xml

- maf.properties

- logging.properties

クイック・デプロイメントは、次のユーザー・アクションのコンテキストでは開始できません。

- 前のクイック・デプロイメントでインストールされたエミュレータ・アプリケーションの変更または削除。

- 前のクイック・デプロイメントで使用されていないデプロイメント・プロファイルを使用したアプリケーションのデプロイ。

クイック・デプロイメントでは、次の変更は検出または処理されません。

- 別のエミュレータへのアプリケーションのクイック・デプロイメント。

- JDeveloperの再起動。JDeveloperの再起動後の最初のデプロイメントは完全なデプロイメントです。再起動後の完全なデプロイメントを確実に行うために必要なユーザー・アクションはありません。クイック・デプロイメントは、最初の完全なデプロイメントの後で実行できます。

25.7 機能アーカイブ・ファイル(FAR)のデプロイ

MAFビュー・コントローラ・プロジェクトによる再利用を可能にするために、アプリケーション機能(一般的に、MAF AMXまたはローカルHTMLとして実装されるもの)は、機能アーカイブ(FAR)というアーカイブにバンドルされます。

FARは、モバイル・アプリケーションで使用できる、アプリケーション機能アーティファクト(アイコン・イメージ、リソース・バンドル、HTML、JavaScriptまたは他の実装固有のファイルなど)が含まれているJARファイルです。(FARには、Javaクラスを含めることも可能ですが、これらのクラスはコンパイルする必要があります。)次の例は、1つのmaf-feature.xmlファイルと1つのconnections.xmlファイルを含むFARの内容を示しています。

/* Contents of a Feature Archive File */
connections.xml (or some form of connection metadata)

META-INF
adfm.xml
maf-feature.xml
MANIFEST.MF
task-flow-registry.xml

oracle
application1
mobile
Class1.class
DataBindings.cpx
pageDefs
view1PageDefs

model
adfc-mobile-config.adfc.diagram
ViewController-task-flow.adfc.diagram

public_html
adfc-mobile-config.xml
index.html
navbar-icon.html
springboard-icon.html
view1.amx
ViewController-task-flow.xml

機能アーカイブ・ファイルでの作業には、次のタスクがあります。

1. 機能アーカイブ・ファイルの作成: 機能アプリケーションをライブラリJARファイルとしてデプロイすることで機能アーカイブを作成します。

2. モバイル・アプリケーション作成時の機能アーカイブ・ファイルの使用: これにはFARのインポートと、インポートされた接続の再マッピングが含まれます。

3. FARの機能を含むモバイル・アプリケーションのデプロイ - これには、デプロイメント・テンプレート内の一意の名前が付けられたフォルダへのFARの解凍が含まれます。

注意:

デプロイメント・プロセス時にMAFはFARを生成します。別のアプリケーションでこのFARを使用する場合は、ビュー・コントローラ・プロジェクトのみをデプロイすればすみます。

25.7.1 機能アーカイブのデプロイメント・プロファイルの作成方法

アプリケーションの接続を作成してから、タスク内の手順に従って、機能アーカイブ用のデプロイメント・プロファイルを作成します。

「デプロイメント・プロファイルの作成」ダイアログを使用します(図25-24を参照)。

図25-24 MAF機能アーカイブ・ダイアログの作成

始める前に:

アプリケーションの適切な接続を作成します。FARは様々な接続要件を持つ様々なアプリケーションで使用できるため、接続ソースまたは標準化された実際の接続名を表す接続名を選択します。

機能アーカイブのデプロイメント・プロファイルを作成するには:

1. ビュー・コントローラ・プロジェクトを右クリックし、「新規」→「デプロイ」→「新規デプロイメント・プロファイル」を選択します。

注意:

アプリケーションレベルの別個のデプロイメント・プロファイルを作成する必要はありません。

2. 「デプロイメント・プロファイルの作成」ダイアログで「MAF機能アーカイブ」を選択します。

3. プロファイル名を入力するか、デフォルトを受け入れて、「OK」をクリックします。

注意:

プロファイルには適切な名前を付けてください。そうしないと、アーカイブ名が同じアプリケーション機能を複数アップロードしたときに、問題が発生する可能性があります。「機能アーカイブ・リソースの再使用の有効化に関する必知事項」を参照してください。

4. 機能アーカイブJARファイルに含める接続を選択します(図25-25を参照)。

図25-25 FARの接続の選択

5. 「次へ」をクリックしてオプションをレビューし、「終了」をクリックします。

25.7.2 機能アーカイブのデプロイメント・プロファイルのデプロイ方法

MAFが提供する「機能アーカイブJARファイルへデプロイします。」オプションを使用すると、JARファイルとしてFARをデプロイできます。タスク内の手順に従って、機能アーカイブ・デプロイメント・ファイルをデプロイします。

「デプロイメント・アクション」ダイアログでは、FARをJARファイルとしてデプロイできます。図25-26に示すこのダイアログには、「機能アーカイブJARファイルへデプロイします。」という1つのデプロイメント・オプションのみがあります。

図25-26 デプロイメント・アクション

機能アーカイブのデプロイメント・プロファイルをデプロイするには:

1. ビュー・コントローラ・プロジェクトを右クリックして、機能アーカイブのデプロイメント・プロファイルを選択します。

2. 「終了」をクリックします。「サマリー」ページ(図25-27を参照)に、機能アーカイブ・ファイルがデプロイされるJARパスのフルパスが表示されます。

図25-27 デプロイメントの「サマリー」ページ

25.7.3 機能アーカイブ・ファイルのデプロイメント・プロファイルをデプロイする場合の処理

MAFは、AppRoot/ViewController/deployディレクトリに作成するJARファイル(FAR)にアプリケーション機能のコンテンツをパッケージします。このFARには、AMXページ、タスク・フロー、アイコンなど、アプリケーション機能を構成するリソースが含まれます。

アプリケーション機能が使用した共有ライブラリはFARに含まれません。JDeveloperの「デプロイメント」→「ログ」ウィンドウ(「ウィンドウ」→「ログ」)の出力を確認します。FARにデプロイしたアプリケーション機能に共有ライブラリが含まれる場合、共有ライブラリがFARから除外されたことを通知するメッセージがMAFによってログに記録されます。アプリケーションでFARを使用するMAFアプリケーションの開発者に対し、FARを使用する際にMAFアプリケーションで共有ライブラリのリソースを使用する場合、共有ライブラリを個別に取得する必要があることを通知してください。共有ライブラリの詳細は、「MAF共有ライブラリによるMAFアプリケーション・コンテンツの再利用」を参照してください。

MAFアプリケーションでFARを使用するMAFアプリケーションの開発者は、FARが格納されているディレクトリへのファイル・システム接続を作成する必要があります。この接続を作成すると、図25-28に示すように、パッケージされたFARおよびアプリケーション機能が「リソース」ウィンドウに表示されます。MAFアプリケーションでのFARの使用の詳細は、「MAFアプリケーションでのFARコンテンツの使用方法」を参照してください。

図25-28 「リソース」ウィンドウのデプロイされた機能アーカイブJAR

25.8 モバイル・アプリケーション・アーカイブ・ファイルの作成

新しいモバイル・アプリケーションを既存のモバイル・アプリケーションから作成するには、元のモバイル・アプリケーションをモバイル・アプリケーション・アーカイブ(.maa)ファイルとしてパッケージ化するか、この.maaから新しいモバイル・アプリケーションを作成します。

次のように既存のモバイル・アプリケーションから新しいモバイル・アプリケーションを作成できます。

- 元のモバイル・アプリケーションをモバイル・アプリケーション・アーカイブ(.maa)ファイルとしてパッケージ化します

- 「アプリケーション・アーカイブからの新規アプリケーションの作成」の説明に従って、.maaファイルから新しいモバイル・アプリケーションを作成します。

.maaファイルによって、モバイル・アプリケーションの構造が保持されます。表25-4に、このファイルの内容を示します。

表25-4 モバイル・アプリケーション・アーカイブ・ファイルの内容

ディレクトリ

説明

adf

次のようなメタデータ・ファイルを含むMETA-INFディレクトリが格納されます。

- adf-config.xmlファイル

- maf-application.xmlファイル

- maf-config.xmlファイル

- その他の該当するアプリケーション・レベルのファイル(connections.xmlファイルなど)

Projects

ワークスペース内の各プロジェクトに対応するJARファイルが格納されます。たとえば、デフォルトのモバイル・アプリケーションを.maaファイルにデプロイすると、ViewController.jarファイルとApplicationController.jarファイルはこのディレクトリに配置されます。.maaファイルのProjectsディレクトリには、元のプロジェクトの.javaファイルは格納されません。かわりに、.javaファイルはコンパイルされ、その結果生成された.classファイルが、プロジェクトJARファイル(ApplicationController.JAR/classlib/mobileApplicationArchive.jarなど)に含まれる別のJARファイル内に配置されます。

ExternalLibs

元のモバイル・アプリケーションの外部にあるアプリケーション・レベルのライブラリ(FARを含む)が格納されます。

META-INF

maf.propertiesおよびlogging.propertiesファイルが格納されます。

resources

次のディレクトリが含まれます。

- android: アプリケーション・アイコンやスプラッシュ画面に使用される、Android固有のイメージ・ファイルが格納されます。

- ios: アプリケーション・アイコンに使用される、iOS固有のイメージ・ファイルが格納されます。

- security: cacertsファイル(キーストア・ファイル)が格納されます。

表25-4にリストされたアーティファクトに加えて、.maaファイルには、元のモバイル・アプリケーションの内部にあるFARまたはJARファイル、およびその制御(.jws)ファイルが格納されたフォルダが含まれます。「MAFアプリケーション・アーカイブ・ファイルをインポートする場合の処理」も参照してください。

注意:

.maaファイルを既存のアプリケーションにインポートすると、ワークスペースとプロジェクトのコンテナ・ファイル(それぞれ.jwsファイルと.jprファイル)が上書きされます。このため、MAF AMXページと構成ファイル(maf-application.xml、maf-config.xml、connections.xml、adf-config.xmlなど)に対して以前加えた変更の一部は保持されません。

25.8.1 モバイル・アプリケーション・アーカイブ・ファイルの作成方法

タスク内の手順に従って、モバイル・アプリケーション・アーカイブ・ウィザードを使用して.maaファイルを作成します。.maaファイルは、OJDeployを使用して作成することもできます。

モバイル・アプリケーションの作成後、JDeveloperによって、デフォルトのMAFアプリケーション・アーカイブ・デプロイメント・プロファイルが作成されます。モバイル・アプリケーション・アーカイブ・ウィザードを使用すると、.maaファイルを作成できます。

ヒント:

また、「コマンド行からのMAFアプリケーションのデプロイ」で説明されているように、OJDeployを使用して.maaファイルを作成することもできます。

モバイル・アプリケーション・アーカイブ・ファイルを作成するには:

1. 「アプリケーション」→「デプロイ」→「新規デプロイメント・プロファイル」をクリックします。

2. 「デプロイメント・プロファイルの作成」ダイアログで、「MAFアプリケーション・アーカイブ」を選択し、「OK」をクリックします(図25-29を参照)。

図25-29 MAAデプロイメント・プロファイルの作成

3. 必要に応じて、「アプリケーション・アーカイブ・オプション」ページでモバイル・アプリケーション・アーカイブの名前を入力する(図25-30を参照)か、デフォルトの名前(およびパス)をそのまま使用します。「OK」をクリックします。

図25-30 モバイル・アプリケーション・アーカイブ・ファイルの名前とパスの入力

4. 必要に応じて、次を実行します。

a. 「アプリケーション・ディスクリプタ」ページ(図25-31を参照)で、META-INFフォルダ(application_workspace\src\META-INF)の内容に付けるファイル・グループ名を入力します(またはデフォルトの名前をそのまま使用します)。

図25-31 META-INFの内容に付けるファイル・グループ名の入力

b. この「アプリケーション・ディスクリプタ」ページの「コントリビュータ」サブページを選択して、ファイル・グループの内容を提供するディレクトリとJARファイルのリストを編集します。

図25-32 モバイル・アプリケーション・アーカイブ・ファイルへのコントリビュータの編集

c. 「フィルタ」ページ(図25-33を参照)を使用して、.maaファイルに含めるファイルの編集やコンテンツの組込みまたは除外ルールの設定を行います。

図25-33 ファイルとディレクトリの組込み(または除外)

d. 「プロファイルの依存性」ページ(図25-34を参照)を使用して、プロジェクト内の依存プロファイルを指定します。

図25-34 デプロイメント・プロファイルの選択

モバイル・アプリケーションをMAFアプリケーション・アーカイブ・ファイルにパッケージ化するには、次の手順を実行します。

1. 「アプリケーション」→「デプロイ」を選択し、「MAFアプリケーション・アーカイブ」デプロイメント・プロファイルを選択します。

2. 「デプロイメント・アクション」ウィザードで、「アプリケーションのMAAへのデプロイ」を選択します(図25-35を参照)。

図25-35 MAFアプリケーション・アーカイブ・ファイルへのデプロイメント

3. 「次へ」をクリックして、デプロイメント・サマリーを確認します(図25-36を参照)。

図25-36 MAFアプリケーション・アーカイブのデプロイメント・サマリー

4. 「終了」をクリックします。

25.9 アプリケーション・アーカイブからの新規アプリケーションの作成

アプリケーション・アーカイブ・ファイルを使用して、様々なカスタマイズが容易になる新しいMAFアプリケーションを作成します。

開発者(および同僚やパートナ)は、アプリケーション・アーカイブ・ファイル(.maa)を起点として新しいMAFアプリケーションを作成できます。.maaファイルからモバイル・アプリケーションを導出することによって、次のような様々なカスタマイズが可能になります。

- アプリケーションへの一意のアプリケーションIDの付与(プッシュ通知を有効にする場合など)。

- 企業固有の資格証明または証明書を使用した、アプリケーションへの署名。

- カスタマイズされたスプラッシュ画面とアプリケーション・アイコンによる、リソースの置換え。

MAFアプリケーション・アーカイブ(.maa)・ファイル形式を使用すると、署名されていないモバイル・アプリケーションをサード・パーティに提供できます。

注意:

.maaファイルを既存のアプリケーションにインポートすると、ワークスペースとプロジェクトのコンテナ・ファイル(それぞれ.jwsファイルと.jprファイル)が上書きされます。このため、MAF AMXページと構成ファイル(maf-application.xml、maf-config.xml、connections.xml、adf-config.xmlなど)に対して以前加えた変更の一部は保持されません。

25.9.1 アプリケーション・アーカイブから新規アプリケーションを作成する方法

タスク内の手順に従って、「アーカイブ・ファイルからのMAFアプリケーション」オプションを使用して、.maaファイルを新しいモバイル・アプリケーションにインポートします。

.maaファイルを新しいモバイル・アプリケーションにインポートします。

アプリケーション・アーカイブから新しいアプリケーションを作成するには、次の手順を実行します。

1. 「ファイル」→「新規」を選択します。

2. 「新規ギャラリ」で、「アプリケーション」→「アーカイブ・ファイルからのMAFアプリケーション」を選択します。

注意:

または、「ファイル」→「インポート」→「アーカイブ・ファイルからのMAFアプリケーション」を選択してもかまいません。

3. 「場所」ページで、「MAAファイル」フィールドの「参照」を選択し、MAAファイルの場所に移動します。

4. 必要に応じて、次を実行するか、デフォルト値をそのまま使用します。

a. .maaファイルから導出したモバイル・アプリケーションの名前を「アプリケーション・ファイル」フィールドに入力します(図25-37を参照)。

b. 「参照」をクリックして、モバイル・アプリケーションのディレクトリを取得します。

図25-37 ディレクトリの場所の入力

5. 「次へ」をクリックしてインポートのサマリー情報を確認し、「終了」をクリックします。

25.9.2 MAFアプリケーション・アーカイブ・ファイルをインポートする場合の処理

MAFは、アプリケーション・フォルダを作成して、そこに関連ディレクトリとそのコンテンツを解凍します。「プロジェクト」ディレクトリ内のJARファイルごとに、MAFはプロジェクト・フォルダを作成して、JARファイルのコンテンツを該当するプロジェクト・フォルダに解凍します。

MAFでは、.maaファイルのインポート後に次のことを実行します。

1. アプリケーション・フォルダを作成します。

2. ワークスペース・コンテナ(.jws)・ファイルを.maaファイルからアプリケーション・ファイルに解凍し、ユーザー指定の値に従ってその名前を変更します。

3. adfディレクトリとその内容をアプリケーション・フォルダに解凍します。このディレクトリの名前は、.adfに変更されます。

4. META-INFディレクトリとその内容をアプリケーション・フォルダに解凍し、アプリケーション・フォルダのsrcディレクトリ内に配置します。

5. ExternalLibsディレクトリとその内容をアプリケーション・フォルダに解凍します。

注意:

このディレクトリに格納された外部リソースはすべて、.maaファイルとしてパッケージ化された(そしてアプリケーションにインポートされた)モバイル・アプリケーション内で使用できますが、これらのリソースへの参照は、.maaファイルから導出されたモバイル・アプリケーションに対しては無効になります。

6. resourcesディレクトリをアプリケーション・フォルダに解凍します。

7. 元のモバイル・アプリケーションの内部にあるFAR (またはその他のライブラリ)を含む、すべてのフォルダを解凍します。MAFによって、これらのアーティファクトの元の場所が保持されます。

8. 元のモバイル・アプリケーションのProjectsディレクトリ内にあるJARファイルごとに、MAFは次を実行します。

- JARファイルの名前(.jar拡張子を除く)に対応するアプリケーション・ディレクトリの下に、プロジェクト・フォルダを作成します。

- JARファイルの内容を、適切なプロジェクト・フォルダ内に解凍します。MAFによって、これらのプロジェクト・フォルダ内に次のものが格納されます。

- 元の.jprファイル。

- META-INF、public_html、src、adfmsrcなどの標準的なディレクトリ。

- ExternalLibsディレクトリの内容。

注意:

このディレクトリに格納された外部リソースはすべて、インポート済の.maaファイルを使用してパッケージ化されたMAFプロジェクト内で使用できますが、これらのリソースへの参照は、既存のプロジェクト、または.maaファイルをインポートすることによって作成されたプロジェクトに対しては無効になります。

- JARファイル内にパッケージ化されたすべてのJavaクラスを含むclasslibディレクトリ。

注意:

.maaファイルにclasslibディレクトリが含まれている場合、MAFでは、このディレクトリのすべてのJARファイルを、新しく作成されたモバイル・アプリケーションにライブラリ依存性として追加します。

25.10 OJDeployを使用したコマンド行からのMAFアプリケーションのデプロイ

JDeveloper IDEを起動しなくても、OJDeployコマンド行ツールを使用して、JDeveloperからiOSまたはAndroidアプリケーションをデプロイできます。コマンド行のデプロイメントは、テストのためのツールとして機能すると同時に、スクリプトを使用したアプリケーションのデプロイ方法として機能します。

デプロイメント・プロファイルのプロパティ・エディタを使用してiOSまたはAndroidデプロイメント・ファイルを作成したら、OJDeployを使用してiOSシミュレータと(iTunes経由で)iOSデバイスに、またはiOSバンドル(.ipaおよび.appファイル)として、あるいは機能アーカイブJARファイルとして、ヘッドレス・モードでアプリケーションをデプロイできます。同様に、OJDeployを使用すると、AndroidエミュレータとAndroidデバイスの両方に、またはAndroidアプリケーション・パッケージ(.apk)・ファイルとして、あるいは機能アーカイブJARファイルとして、アプリケーションをデプロイできます。

注意:

OJDeployをMac上で使用するには、次の行をojdeploy.confファイルに追加してください。

SetSkipJ2SDKCheck true

このファイルはjdev_install/jdeveloper/jdev/binにあります。

現在、ユニバーサルWindowsプラットフォームのデプロイにOJDeployコマンド行ツールを使用することはできません。

初めてMAFアプリケーションをAndroidプラットフォームにデプロイするときに、MAFはGradleをダウンロードしてインストールします。開発マシンが企業のファイアウォールで保護されている場合は、MAFが正常にGradleをダウンロード、インストールおよび構成できるように、Gradleプロキシ設定を構成します。「Gradleプロキシ設定の構成方法」を参照してください。

次のコマンドを使用して、MAFのデプロイメント・プロファイルをデプロイできます。

- deployToDevice: iOSデバイスまたはAndroidデバイスにアプリケーションをデプロイします。iOSアプリケーションの場合、このコマンドは、iTunesを使用してアプリケーションがデバイスにデプロイされるデバッグ・シナリオで使用されます。「App StoreへのiOSアプリケーションの配布方法」を参照してください。

- deployToSimulator: アプリケーションをiOSシミュレータに(.appファイルとして)デプロイするか、Androidエミュレータにデプロイします。モバイル・アプリケーションはAppleコンピュータ上のiOSシミュレータにのみデプロイできます。

- deployToPackage: iOSアプリケーションを.ipaファイルとして、またはAndroidアプリケーションを.apkファイルとしてデプロイします。アプリケーションは、Appleコンピュータでのみ、.ipaファイルとしてパッケージ化できます。

- deployToFeatureArchive: 機能アーカイブをJARファイルにデプロイします。

- deployToApplicationArchive: モバイル・アプリケーションをMAFアプリケーション・アーカイブ・ファイル(.maa)としてパッケージ化します。

これらのコマンドは、ojdeployコマンド行ツール、OJDeployの引数およびOJDeployのオプションとともに、次のように使用します。

ojdeploy deployToSimulator -profile <profile name> -workspace <jws file location>

注意:

OJDeployコマンドと引数では大文字と小文字が区別されます。

表25-5に、MAFのデプロイメント・コマンドを変更するために使用するOJDeploy引数をリストします。

ヒント:

-helpオプションを任意のコマンドで使用すると(例: ojdeploy deployToSimulator -help)、使用方法と構文に関する情報を取得できます。

表25-5 MAFのデプロイメント用のOJDeploy引数

引数

説明

-profile

AndroidまたはiOSデプロイメント・プロファイルの名前。次にその例を示します。

ojdeploy deployToSimulator -profile iosDeployProfile ...

-workspace

モバイル・アプリケーション・ワークスペースのコンテナ(.jws)・ファイルへのフルパス。次にその例を示します。

... -workspace /usr/jsmith/mywork/Application1/Application1.jws

モバイル・アプリケーションをモバイル・アプリケーション・アーカイブとしてパッケージ化するには:

ojdeploy deployToApplicationArchive
-profile applicationArchiveProfile
-workspace /usr/jdoe/Application1/application1.jws

-project

deployToFeatureArchiveコマンドの場合は、機能アーカイブのデプロイメント・プロファイルを含むプロジェクト(ビュー・コントローラ・プロジェクト)の名前を指定する必要があります。次にその例を示します。

ojdeploy deployToFeatureArchive
-profile farProfileName
-project ViewController
...

-buildfile

バッチ・デプロイ用のビルド・ファイルへのフルパス。

-buildfileschema

ビルドファイルの出力XMLスキーマ。

表25-5に示した引数の他に、『Oracle JDeveloperによるアプリケーションの開発』のコマンドの使用方法にかんする項で説明されているOJDeployオプションを使用することもできます。

注意:

次のオプションはサポートされていません。

- -forcerewrite

- -nocompile

- -nodatasources

- -nodepdendents

- -outputfile

- -updatewebxmlejbrefs

表25-6に、MAFのデプロイメント・コマンドでOJDeployオプションを使用する方法の例を示します。

表25-6 MAFのデプロイメント用のOJDeployオプション

オプション

説明

-clean

コンパイルの前に、プロジェクト出力ディレクトリからすべてのファイルを削除します。次にその例を示します。

ojdeploy deployToSimulator
-profile iosDeployProfile
-workspace /usr/jsmith/jdeveloper/mywork/Application1.jws
-clean

-stdout、-stderr

標準出力とエラー・ロギングのストリームを、それぞれのプロファイルとプロジェクトのファイルにリダイレクトします。次にその例を示します。

ojdeploy deployToSimulator -profile iosDeployProfile
-workspace /usr/jsmith/jdeveloper/mywork/Application1.jws
-clean
-stdout /usr/jsmith/stdout/stdout.log
-stderr /usr/jsmith/stderr/stderr.log

表25-7は、deployToApplicationArchiveコマンドとともに使用するマクロを示しています。

表25-7 MAFアプリケーション・アーカイブのパッケージ化に使用するマクロ

マクロ

説明

workspace.name

アプリケーション・ワークスペースのコンテナ・ファイルの名前(.jws拡張子を除く)。

workspace.dir

アプリケーション・ワークスペースのコンテナ(.jws)・ファイルのディレクトリ。

profile.name

デプロイするプロファイルの名前。

profile.dir

プロファイルのデフォルトのデプロイメント・ディレクトリ。

base.dir

このパラメータを使用して、現在のojdeployディレクトリをオーバーライドします。ビルド・スクリプトでbasedir属性を使用して、現在のojdeployディレクトリをオーバーライドできます。

26 セキュアなモバイル開発方法の理解

この章では、モバイル・アプリケーション・フレームワークが、Open Web Application Security Project (OWASP)によって示された一般的なセキュリティ・リスクに対する保護を提供するしくみについて説明します。

この章の内容は次のとおりです。

- サーバー側の不十分な制御

- デバイス上のセキュアでないデータ格納

- トランスポート・レイヤーの不十分な保護

- サイドチャネルによるデータ漏えい

- 脆弱な認可および認証

- 不適切な暗号化

- クロスサイト・スクリプティングのクライアント側インジェクション

- 信頼できない入力のセキュリティ判断

- 不適切なセッション処理

- バイナリ保護の欠如による機密情報の開示

26.1 サーバー側の不十分な制御

データを保管するバックエンド・サービスへの攻撃に対して脆弱になるモバイル・アプリケーションには、モバイル・デバイスで実行するクライアント・アプリケーションではなく、サーバー側のアプリケーションを使用してアクセス制御を強制実施します。

モバイル・アプリケーションにセキュリティを組み込みます。モバイル・アプリケーションの設計における最も初期の段階でも、モバイル・アプリケーションに固有のリスクだけでなく、モバイル・アプリケーションがアクセスするサーバー側リソースに共通するリスクも評価する必要があります。同等のデスクトップ・アプリケーションと同様に、モバイル・アプリケーションは、データを格納するバックエンド・サービスへの攻撃によって脆弱になる可能性があります。このリスクはモバイル・アプリケーションに固有のものではないため、「OWASP Top Ten Project」(https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)に示されている基準は、モバイル・アプリケーションの作成時にも当てはまります。モバイル・デバイスで実行されているクライアント・アプリケーションは脆弱である可能性があるため、これらを使用してアクセス制御を適用しないでください。この機能はサーバー側アプリケーションによって実行される必要があるため、MAFは、クライアントから送信されるデータを検証するための即時利用可能な機能は提供していません。モバイル・アプリケーションに送信されるデータが有効であることを確認する必要があります。次を参照してください。

- 『Oracle Web Services Managerの理解』のWebサービスのセキュリティ概念の理解に関する項

- 『Oracle Web Services Managerの理解』のWebサービス・セキュリティ標準に関する項

26.2 デバイス上のセキュアでないデータ格納

モバイル・アプリケーションの設計では、ユーザーがローカル・ファイルにアクセスできるようにすることがあり、その結果としてデバイスのローカル・ファイル・システムに保管された機密データを公開することになります。MAFには、デバイス・データベースとローカル・データを暗号化して、デバイスにデータを安全に保管するAPIが用意されています。

モバイル・アプリケーションの設計に欠陥があると、ユーザーがローカル・ファイルにアクセスできるようになり、デバイスのローカル・ファイル・システムに保管された機密データが公開されてしまうことになります。このデータには、ユーザー名とパスワード、Cookie、認証トークンなどがあります。ほとんどのユーザーは自分のデータが脆弱であること、さらにはデバイス自体に格納されていることを認識していませんが、悪意のあるユーザーがツールを使用してローカル・データベースを開き、資格証明を表示することで、この状況を利用する可能性があります。アプリケーションのセキュリティ要件を評価するときは、電話が悪者の手に渡る可能性を想定する必要があります。MAFは、デバイス・データベースおよびローカル・データ・ストアを暗号化することによってデバイスに格納されたデータを保護するAPIを提供しています。

26.2.1 SQLiteデータベースの暗号化

MAFの埋込みSQLiteデータベースは、ローカルに格納されたデータを保護します。MAFアプリケーションは、SQLiteデータバースを共有しません。データベースにアクセスできるアプリケーションは、データベースを作成するアプリケーションのみです。さらに、このデータベースには、正しいユーザー名とパスワードを持つユーザーのみがアクセスできます。

AdfmfJavaUtilitiesクラスを使用すると、このデータベースのパスワードを保護するキーを作成するとともに、データベース内に格納されたデータを暗号化することができます。データベースに安全なキーを提供するために、AdfmfJavaUtilitiesクラスには、強力なパスワードを生成してから安全に格納するGeneratedPasswordユーティリティ・クラスが含まれます。また、AdfmfJavaUtilitiesクラスは、パスワードを使用してデータベースを暗号化するためのencryptDatabaseメソッドも提供します。SQLiteデータベースの一般的な情報は、「MAF AMXでのローカル・データベースの使用方法」を参照してください。GeneratedPasswordおよびencryptDatabase (およびその対となるdecryptDatabase)の詳細は、Oracle Mobile Application Framework Java APIリファレンスおよび「データベースを暗号化および復号化する方法」を参照してください。サンプル・アプリケーションは、「サンプルのMAFアプリケーション」の説明に従って、PublicSamples.zip内のStockTrackerのサンプルを参照してください。

注意:

必ずGeneratedPasswordユーティリティを使用してください。キーをハードコード化しないでください。

26.2.2 デバイスのローカル・データ・ストアの保護

adfmfJavaUtiltiesクラスのgetDirectoryPathRootメソッドを使用して、MAFがサポートするプラットフォームで、プログラムによってファイルをローカル・ファイル・システムに保管できます。このメソッドを使用すると、デバイスでのアプリケーション・データの格納に対して、プラットフォームに依存しないアクセスが可能になります。

このメソッドには、次のオプションを使用できます。

- 一時ディレクトリ

- アプリケーション・ディレクトリ

- キャッシュ・ディレクトリ

- ダウンロード・ディレクトリ

ヒント:

ユーザーがデスクトップ・コンピュータとデバイスを同期するときには、デバイスのアプリケーション・ディレクトリに格納されているデータがデスクトップ・システムに転送されますが、ここでデータが公開される可能性があります。データを一時ディレクトリに格納してください。iOSでは、iTunesを使用してデバイスが同期されるときに、一時ディレクトリに格納されたデータはデスクトップと同期されません。

セキュリティを必要とするすべてのファイルに対して、Java暗号化API (javax.crypto)を使用して暗号化および復号化を行うことができます。

getDirectoryPathRootメソッドの詳細は、「getDirectoryPathRootメソッドを使用したファイル・アクセス」を参照してください。また、iOSのDeveloper Library (https://developer.apple.com/library/)で参照できる、『File System Programming Guide』の「File System Basics」も参照してください。

26.2.3 セキュリティ・ログとアプリケーション・ログについて

デスクトップ・コンピュータと同期されたデバイスは、ログ・ファイルを表示します。機密データがログ・ファイルに書き込まれないようにしてください。

デスクトップ・コンピュータと同期された場合に表示できるので、いずれの機密データもログ・ファイルに書込みできないことを確認してください。ユーザーがiOSデバイスをデスクトップ・システムに接続してデータを同期すると、アプリケーション・ログ・ファイルは最終的に、暗号化されていない形式でデスクトップ上に格納されます。Androidデバイスから同期されたログ・ファイルは、Android Device Monitorツールを使用して表示できます。「サイドチャネルによるデータ漏えい」も参照してください。

26.3 トランスポート・レイヤーの不十分な保護

モバイル・アプリケーションは、プロバイダ・ネットワークを介してデータにアクセスするときにSSL/TLSを使用し、WiFiを使用する場合はこれらのどちらのプロトコルも使用しないことがあります。プロバイダ・ネットワークはハッキングされる可能性があるため、安全であることを想定しないようにしてください。

したがって、アプリケーションが機密データをトランスポートするときはSSLを強制し、すべての証明書が有効で公的機関によって署名されていることを確認する必要があります。

モバイル・アプリケーションによって使用されるすべてのエンドポイントはSSLによって保護される必要があるため、MAFは、SSLをサポートする一連のWebサービス・ポリシーを提供します。「セキュアなWebサービスへのアクセス」を参照してください。

MAFは、信頼性のある既知の認証局のエントリによってシードされたcacertsファイルを提供します。アプリケーション開発者は、必要に応じてこのファイルに他の証明書を追加できます。「SSLのサポート」を参照してください。

26.4 サイドチャネルによるデータ漏えい

スクリーン・ショット、キー・ストローク・ロギング、デバッグ・メッセージ、クリップボード・コピーとOpen In機能、一時ディレクトリおよびサード・パーティ製ライブラリはデータ漏えいの原因になることがあります。資格証明や個人を特定できる情報はロギングしないでください。また、アプリケーションの公開前に、デバッグ時のファイルを確認してデバッグメッセージを削除することで、データ漏えいを防止できます。

意図しないデータ漏えいは、次のような原因で発生する可能性があります。

- スクリーン・ショットの無効化(バックグラウンド実行): iOSおよびAndroidは、アプリケーションの再アクティブ化の認識されるパフォーマンスを高めるために、アプリケーションをバックグラウンドで実行する前にアプリケーションのスクリーン・ショットを取得します。しかし、顧客データの漏えいの可能性があるため、これらのスクリーン・ショットはセキュリティ上の問題の原因となります。

- キー・ストローク・ロギング: iOSおよびAndroidでは、キーボードを使用して入力した情報の一部が、先行入力機能で使用するためにアプリケーション・ディレクトリに自動的に記録されます。この機能は、顧客データの潜在的な漏えいにつながる可能性があります。

- デバッグ・メッセージ: アプリケーションでは、機密データをデバッグ・ログに書き込むことができます。ロギング・レベルを「FINE」に設定すると、ユーザーのデバイスとサーバーの間で転送されるすべてのデータに関してログ・メッセージが書き込まれます。

- アプリケーションの一部として表示される機密ドキュメントに関して、クリップボード・コピーおよび「Open In」機能を無効にします。MAFでは現在、コピーおよびOpen In機能を無効にする機能は提供されておらず、今後のリリースで提供が予定されています。

- 一時ディレクトリ: 機密データが含まれる場合があります。

- サード・パーティ・ライブラリ: これらのライブラリ(adライブラリなど)により、ユーザー、デバイス、ユーザーの場所に関するユーザー情報が漏えいする可能性があります。

データ漏えいを防止するには:

- 資格証明、個人情報(PII)などの機密データをアプリケーション・ログに記録しないようにします。すべての機密情報をネイティブ・キー・チェーン、暗号化データベースまたはファイル・システムに格納します。

- アプリケーションのデバッグ時に、作成されたすべてのファイルおよびそれらのファイルに書き込まれたすべての内容を確認します。

- アプリケーションを公開する前に、デバッグ・メッセージを削除します。

26.5 脆弱な認可および認証

脆弱な認証メカニズムとクライアント側アクセス制御はセキュリティを損ないます。安全なアクセスを必要とするMAFアプリケーションの機能は、それをサーバー側で強制実施する必要があります。

エンド・ユーザーはユーザー名とパスワードよりも、電話番号またはなんらかのタイプの識別子(IMEI、IMSIまたはUUID)を使用してデバイスを認証する方が簡単ですが、これらの識別子は総当たり攻撃によって容易に検出される可能性があるため、唯一のオーセンティケータとして使用しないようにしてください。かわりにモバイル・アプリケーションは、機密データにアクセスするときは強力な資格証明を使用する必要があります。認証は、デバイスではなくユーザーを反映する必要があります。さらに、コンテキスト識別子(場所など)、音声、フィンガープリントまたは動作情報を使用して認証を強化できます。

開発者は、MAFで提供されているデフォルトのログイン・ページまたは開発者が作成するカスタム・ログイン・ページのいずれかを使用できます。「ログイン・ページの指定方法」を参照してください。

安全なアクセスを必要とするMAFアプリケーションのすべての機能は、「認証を要求するようにアプリケーション機能を設定する方法」の説明に従ってセキュリティを有効にする必要があります。

さらに、クライアントではなくサーバーによってアクセス制御を強制する必要があります。クライアント・モバイル・アプリケーションがこの機能を担うと、安全性が低下します。アクセス制御サービス(ACS)を使用すると、開発者は、サーバー上で定義されたロール/権限を使用してモバイル・アプリケーションでアクセス制御を強制することができます。アクセス制御サービスは、アプリケーションで有効なユーザー・ロール/権限をフィルタリングするためにアプリケーション開発者が実装できる、RESTfulサービスです。アプリケーションでは数千のユーザー・ロールがサポートされている場合がありますが、このサービスは、モバイル・アプリケーションに対して指定したロールのみを返します。「アクセス制御の構成方法」を参照してください。

26.6 不適切な暗号化

暗号化は、間違った実装と不適切なアルゴリズムの使用によって脆弱になります。暗号化されたデータとは別にキーを保管して、プラットフォーム固有のファイル暗号化APIを使用するか、その他の正常な暗号化が保証される信頼できるソースを使用します。

次の理由により、暗号化は不確実なものになります。

1. アプリケーションで間違った実装を使用しているか、または既知のアルゴリズムを不正に使用している。

2. 暗号が容易に解読されるために、データが安全でない。

さらに、Base-64エンコーディング、不明瞭化およびシリアライズは暗号化ではありません(暗号化と誤解しないようにしてください)。

データを正常に暗号化するには:

- 暗号化データと一緒にキーを格納しないでください。

- プラットフォーム固有のファイル暗号化APIまたは別の信頼できるソースを使用します。暗号を自分で作成しないでください。

埋込みSQLiteデータベースのセキュリティ保護に加え、「デバイス上のセキュアでないデータ格納」で説明されている暗号化メソッドを使用します。また、「トランスポート・レイヤーの不十分な保護」で説明されているように、SSLを適用してセキュリティで保護されたWebサービス・コールを作成します。MAFでは、資格証明をセキュアに処理するため、Oracle Access Manager for MobileおよびSocial IDM SDKを使用します。

26.7 クロスサイト・スクリプティングのクライアント側インジェクション

MAFエンコーディングは、クロスサイト・スクリプティング・インジェクションからアプリケーションを保護し、アプリケーションのサンドボックス化は、クロスサイト・リクエスト・フォージェリに対する保護を提供します。アプリケーション機能のアクセスを無効化することで、ネイティブ・コンテナもアプリケーションの安全を確保できます。

モバイル・アプリケーションは様々なソースからコンテンツおよびデータを取り出すため、ユーザー・セッションを乗っ取るクロスサイト・スクリプティング(XSS)インジェクションに対して脆弱である可能性があります。MAFでは、エンコーディングによりXSSに対する保護を行います。

インジェクション攻撃に加えて、モバイル・アプリケーションはクロスサイト・リクエスト・フォージェリ(CSRF)に対して脆弱であり、この攻撃では、悪意のあるページが、ユーザーIDを格納するWebブラウザにキャッシュされたCookieを使用して、ユーザーに代わってターゲット・アプリケーションで意図しないアクションを実行します。アプリケーションのサンドボックス化により、CSRFの問題に対処します。

また、ネイティブ・コンテナにアクセスするアプリケーション機能(特にリモートURLコンテンツに関わるアプリケーション機能)を無効にすることを検討してください。MAFアプリケーション内の選択したアプリケーション機能がネイティブ・コンテナにアクセスすることを防止できます。たとえば、自分のMAFアプリケーションに、リモート・コンテンツを参照する、信頼できないWebアプリケーションからのアプリケーション機能が含まれているとします(リモートURLコンテンツのアプリケーション機能)。このシナリオでは、次の例に示すように、この特定のアプリケーション機能がネイティブ・コンテナにアクセスすることを防止します。

<adfmf:featureReference refId="remoteAppfeature1" id="fr1" allowNativeAccess="false"/>

allowNativeAccessプロパティのデフォルト値はtrueです。

26.7.1 デバイス・アクセス権限を使用したインジェクション攻撃からのMAFアプリケーションの保護

MAFアプリケーションは、デバイスの機能(電話や電子メール)へのURIアクセスが制限されるように構成することで保護します。

URIは、ユーザーのデバイスに格納されたデータの他、カメラやアドレス帳などの様々なデバイス機能にアクセスできます。「MAFアプリケーションでのコア・プラグインの有効化」で説明されているように、このようなアクセス権はデフォルトでは付与されていませんが、MAFアプリケーションを構成して、URIがアクセスできるデバイスの機能を、次のいずれかに制限できます。

- オープン・ネットワーク・ソケット(ユーザー認証の構成時に許可する必要がある)

- GPSおよびネットワークベースの位置情報サービス

- 連絡先

- 電子メール

- SMS

- 電話

- プッシュ通知

- ローカルに格納されたファイル

ヒント:

「実行時の名前付き接続の接続属性の更新方法」で説明されているように、updateSecurityConfigWithURLParametersメソッド(ログイン構成の変更を検出すると、再認証によって変更を確認するようにユーザーに求める)を使用して、XSSによって挿入された偽のログイン・ページなどのセキュリティ・リスクから、プログラムによってユーザーを保護できます。さらに、MAFでは、保護されたアプリケーション機能を開くときに、それがユーザーに通知されます。デフォルト・アプリケーションにセキュリティが適用されないと、認証が遅延する可能性があります。Oracle Mobile Application Framework Java APIリファレンスを参照してください。

26.7.2 カスタムHTMLコンポーネントからのインジェクション攻撃リスクについて

MAF AMXページにカスタム・ユーザー・インタフェースを作成するために、ELバインディングによって動的HTMLコンテンツを配信するHTMLを使用すると、アプリケーションにインジェクション攻撃の余地を残す可能性があります。HTMLとJavaScriptスクリプトは、機能を保護するために適切にエンコードする必要があります。

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が適切にエンコードされていることを確認する必要があります。「Verbatimコンポーネントの使用方法」および「出力HTMLコンポーネントの使用方法」を参照してください。また、「信頼できない入力のセキュリティ判断」も参照してください。

26.7.3 SQLインジェクションおよびXMLインジェクションについて

ローカル・データベースに保管されたすべてのデータを検証してエンコードすることと、アプリケーションで処理されるXMLおよびHTMLコンテンツをエンコードして検証することで、SQLインジェクションを防止できます。

モバイル・アプリケーションはSQLインジェクションに対して脆弱であるため、攻撃者は埋込みSQLiteデータベースに格納されたデータを読取りできる可能性があります。

SQLインジェクションを防止するには:

- アプリケーション開発者は、ローカル・データベースに格納されたすべてのデータを検証し、エンコードする必要があります。

- アプリケーション開発者は、アプリケーションによって処理されるXMLおよびHTMLコンテンツをエンコードし、検証することが想定されています。

26.8 信頼できない入力のセキュリティ判断

追加の認証を求めること、機密性の高いアプリケーションを起動する際の追加の手順を用意すること、サーバー上の信頼できないサード・パーティ製アプリケーションとの通信をすべて検証すること、およびJSONエンコーディングAPIを使用することで、iOSとAndroidのプラットフォーム上のアプリケーションの安全を確保できます。

iOSプラットフォームとAndroidプラットフォームの両方において、アプリケーション(Skypeなど)は必ずしも外部からの許可をリクエストするとは限らないため、攻撃者にエントリ・ポイントを提供して、悪意のあるアプリケーションがセキュリティを回避してしまう可能性があります。その結果、アプリケーションはクライアント側のインジェクションおよびデータ漏えいに対して脆弱になります。必ず追加の認可を求めるプロンプトを表示するか、あるいは追加の認可が可能でない場合は、保護を必要とするアプリケーションを起動するための追加のステップを提供してください。

アプリケーションが信頼できないサードパーティ・アプリケーションから受信する(またはこれらのアプリケーションに送信する)すべてのデータが、入力検証の対象となっていることを確認する必要があります。アプリケーションに対するクライアント側のXML入力を、エンコードおよび検証する必要があります。MAF AMXコンポーネントではユーザー入力を検証できますが、データはサーバー上で検証する必要があり、サーバーはクライアントから受信するデータを信頼しないようにする必要があります。つまり、サーバーとクライアントの間で送受信されるXML、JSONおよびJavaScriptが適切にエンコードされていることを確認する役割は、サーバーが担います。

別のアプリケーションからMAFアプリケーションを起動するURLスキームを構成するときは、URLを介して送信されるパラメータを検証して、悪意のあるデータまたはURIがMAFアプリケーションに渡される可能性がないことを確認する必要があります。「カスタムURLスキームを使用したMAFアプリケーションの起動」および「脆弱なサーバー側コントロール」を参照してください。

JSON解析について

可能な場合は、MAFのJSONエンコーディングAPIを使用します。カスタムJSON構成を必要とするシナリオでは、ユーザー入力データを使用してJSONを構成するときには注意が必要です。JSONデータの処理の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

26.9 不適切なセッション処理

セッション・タイムアウトの値をサーバー側のセッション・タイムアウトよりも小さく構成すること、有効期限が構成された複雑なトークンを使用すること、および機能セッションの時間値とユーザーに再認証を強制するタイムアウトを構成することは、セッション処理のベスト・プラクティスとしてあげられます。

モバイル・アプリケーションのユーザビリティ要件では、多くの場合、長期にわたって継続するセッションが求められます。モバイル・アプリケーションは、セッション管理にCookie、SSOサービスおよびOAUTHトークンを使用します。

注意:

OAuthアクセス・トークンは、リモートで取り消すことができます。

適切なセッション処理を有効にするには:

- ログイン・サーバー接続のセッション・タイムアウトを、サーバー側のセッション・タイムアウトよりも小さい値に構成します。
デバイスIDは期限切れになることがないため、セッション・トークンとして使用しないでください。アプリケーションでは、ユーザーが再認証を行う必要が生じても、トークンを期限切れにする必要があります。

- サーバーでのトークン生成の適切なベスト・プラクティス(OWASP Top 10プロジェクト: https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Projectを参照)を確認してください。
容易に予測できるか、または適切に生成されていないセッション・トークンを使用しないでください。セッション・トークンは予測不能で、エントロピが高い必要があります。

Oracle Identity Management (IDM)スタックでは、モバイル・アプリケーションで使用するための標準ベースのトークン(OAuthアクセス・トークン、JWTトークンなど)がサポートされています。MAFでは、Oracle IDM OAuthサーバーに対して即時利用可能なサポートが提供されており、MAFアプリケーションでこのような標準ベースの認証メカニズムを使用することをお薦めします。

「基本認証の構成方法」で説明されているように、ユーザーがログイン・サーバーに対して認証を行う必要があるアプリケーションの構成には、セッションの持続時間およびアイドル・タイムアウトを設定するオプションが含まれます。デフォルトでは、アプリケーション機能セッションの持続時間は8時間です。アプリケーション機能がアイドル状態にあるデフォルト時間は、5分間です。MAFでは、いずれかの構成期間が過ぎるとユーザー資格証明が期限切れになり、ユーザーに再認証を求めるプロンプトが表示されます。

26.10 バイナリ保護の欠如による機密情報の開示

APIキーと機密ビジネス・ロジックをサーバーに保管すること、パスワードをハードコーディングしないこと、機密情報をログ・ファイルに書き込まないことで、データ(APIキー、パスワード、機密ビジネス・ロジックなど)を保護します。

攻撃者はリバース・エンジニアリングを使用して、APIキー、パスワード、機密ビジネス・ロジックなどの機密データを検出できます。この情報を保護するには:

- APIキーおよび機密ビジネス・ロジックをサーバー上に格納します。

- パスワードをアプリケーション・バイナリに格納しないでください。

- パスワードをハードコード化しないでください。かわりに、「デバイス上のセキュアでないデータ格納」で説明されているGeneratedPasswordユーティリティを使用します。

- ログ・ファイルをモニターできるので、アプリケーションが機密情報をログ・ファイルに書き込まないことを確認します。「サイドチャネルによるデータ漏えい」も参照してください。

- 情報がファイル・システム上に格納される(つまり、モバイル・アプリケーションの外部に格納される)ことに注意してください。機密データを暗号化されたデータベースまたはファイル・システム、あるいはネイティブ・キー・チェーンに格納します。リスク1:「デバイスでの安全でないデータ格納」も参照してください。

27 MAFアプリケーションの保護

この章では、MAF内のセキュリティ・フレームワークの概要と、セキュリティが適用されるようにMAFアプリケーションを構成する方法について説明します。

この章の内容は次のとおりです。

- MAFセキュリティの概要

- ユーザー・ログイン・プロセスについて

- MAFアプリケーションの認証プロセスの概要

- MAF接続の構成

- MAFアプリケーションのセキュリティの構成

- デバイス機能へのアクセスの許可

- ユーザーによるアプリケーション機能からのログアウトの有効化

- MAF認証APIの使用方法

- SSL用の自己署名証明書を使用するサーバーにアクセスするための証明書の作成

- MAFアプリケーションでのSSL証明書のファイル拡張子の登録

27.1 MAFセキュリティの概要

MAFは、セキュアなMAFアプリケーションの開発を容易にする、すぐに使用できる複数の機能を提供しています。これらには、保護されたアプリケーション機能用のデフォルトのログイン・ページ、匿名ユーザーのサポート、特定のロールまたは権限を持つユーザーに対するアクセスを制限する制約が含まれます。

MAFは、保護されているアプリケーション機能がアクティブ化されたときに、ユーザーにログイン・ページを表示します。たとえば、アプリケーション機能がWebビュー内に表示されようとしているときやオペレーティング・システムがアプリケーションをフォアグラウンドに戻したときに、ユーザーにログイン・ページを表示します。MAFは、アプリケーション機能が認証サーバーによって保護されているときや、アプリケーション機能にユーザー・ロールまたはユーザー権限に基づいた制約が含まれているときに、アプリケーション機能へのアクセスにユーザー認証を必要とするかどうかを決定します。MAFは、ユーザーが有効な資格証明を入力した場合のみ、目的のWebビュー、UIコンポーネントまたはアプリケーション・ページをレンダリングします。

アプリケーション機能のいずれかにこれらの条件がある場合、ユーザーはログインに成功しないとMAFアプリケーションにアクセスできないことがありますが、保護されておらず、かつアクセス関連の制約がないデフォルトのアプリケーション機能を含めることによって、保護されているアプリケーション機能と保護されていないアプリケーション機能の両方を含むMAFアプリケーションに、ユーザーがアクセスできるようにできます。この状況では、ユーザーは認証なしでMAFアプリケーションにアクセスできます。デフォルトのアプリケーション機能によって、これらの匿名ユーザーに、MAFアプリケーションへのエントランス・ポイントが提供され、これらのユーザーは保護されていないデータを表示でき、保護されたアプリケーション機能にアクセスするときには、リモート・サーバーに対して認証されます。保護されていないデフォルトのアプリケーション機能は、次のように指定できます。

- デフォルトのアプリケーション機能を通じて公共の情報にアクセスすることを匿名ユーザーに許可する一方、認可されたユーザーのみが保護された情報にアクセスできるようにする。

- 保護されたアプリケーション機能にアクセスする必要がある場合にのみユーザーを認証するようにします。そうでない場合、ユーザーは匿名ユーザーとしてMAFアプリケーションにアクセスでき、保護された機能に移動するにはログインします。

- アクセスを保護する必要がない場合に、保護されているアプリケーション機能からログアウトすることをユーザーに許可し、それにより権限のないユーザーが保護されているアプリケーション機能にアクセスすることを明示的に禁止する。

注意:

MAFでは、アプリケーション・ログイン・プロセスがアプリケーションの初期化フローから切り離されているため、匿名ユーザーが可能となり、ユーザーは認証資格証明を提供する必要なく、匿名ユーザーとしてMAFアプリケーションを起動し、保護されていないアプリケーション機能にアクセスできます。このような場合、MAFは権限を持つUIコンポーネントを無効化することによって、ユーザーのアクションを制限します。

「認証を要求するようにアプリケーション機能を設定する方法」および「ユーザー制約とアクセス制御について」を参照してください。

MAFアプリケーションでは、デフォルト・ページまたはHTMLで記述されたカスタマイズ済のログイン・ページが使用されます。

特定のロールおよび権限を付与されたユーザーのみが、user.rolesまたはuser.privileges制約で定義されるアプリケーション機能にアクセスできます。ユーザーがこのようなアプリケーション機能にログインすると、アクセス制御サービス(ACS)として知られるWebサービスは、アプリケーション機能へのアクセス権を付与するユーザー・オブジェクトをユーザーに返します。「アクセス制御サービスに関する必知事項」を参照してください。

27.2 ユーザー・ログイン・プロセスについて

MAFは、Webログイン・ページでログインして認証されたユーザーにWebビュー、ページ、またはユーザー・インタフェース・コンポーネントを表示します。MAFは、ログインが有効になるまで試行して、構成された間隔後にログインがタイム・アウトになります。

エンド・ユーザーの視点からは、ログイン・プロセスは次のようなものになります。

1. ユーザーが保護されたアプリケーション機能にアクセスしようとすると、常に、図27-1に示すログイン・ページのWebビューがMAFによって表示されます。保護されたアプリケーション機能がデフォルトである場合は、ユーザーがアプリケーションを起動すると、MAFによってデフォルトのログイン・ページが表示されます。

図27-1 デフォルトのログイン・ページ

注意:

「カスタム・ログイン・ページ」で説明されているように、MAFでは、デフォルトのログイン・ページが提供されるだけでなく、カスタム・ログイン・ページの使用もサポートされています。

2. ユーザーがユーザー名とパスワードを入力し、「サインイン」をクリックします。

注意:

MAFでは、同じアプリケーションに対して複数のユーザーを許可します。ユーザーは、前のユーザーがログアウトした後、アプリケーションに自由にログインできます。

3. ユーザー名とパスワードが検証されると、MAFによって、目的のWebビュー、ページまたはユーザー・インタフェース・コンポーネントが表示されます。

4. MAFは、ユーザーが正常にログインするまで、ユーザー名とパスワードの入力を求めます。ユーザーがログインできない場合、別のアプリケーション機能に移動することのみが可能です。

注意:

アプリケーション機能が最後にアクティブ化されて以降、事前定義された時間が経過すると、認証はタイムアウトになります。MAFでは、認証サーバーへの接続を使用するアプリケーション機能のいずれかがアクティブ化されたときのみ、アイドル・タイムアウトのタイマーの期限が更新されます。

27.3 MAFアプリケーションの認証プロセスの概要

MAFは、HTTP基本認証、OAuth認証およびWeb SSO認証のプロトコルをサポートし、リモート・ログイン・サーバーに対してアプリケーション・ユーザーを認証します。リモート認証の成功時に、MAFは資格証明をローカルに保管して、それ以降の認証がローカルになるようにします。

MAFアプリケーションでは、リモート・ログイン・サーバー(Oracle ADF Fusion Webアプリケーションによって使用されるOracle Access Managerアイデンティティ・サーバーなど)、またはユーザーのデバイス上に存在するローカル資格証明ストアに対するユーザー資格証明の検証が必要になる場合があります。ローカルおよびリモートの接続モードをサポートするために、MAFは次の認証プロトコルをサポートしています。

- HTTP Basic

- OAuth

- Web SSO

注意:

現在、ユニバーサルWindowsプラットフォームにデプロイしたMAFアプリケーションは、HTTP基本のみをサポートしています。

デフォルトでは、MAFアプリケーション・ユーザーの認証は、デザインタイムに選択された認証プロトコルに関係なく、リモート・ログイン・サーバーに対して行われます。基本認証を使用している場合、開発者はローカル認証を有効にするようにアプリケーションを構成できます。ただし、最初はローカル資格証明ストアに資格証明が伝播されていないため、保護されているアプリケーション機能にアクセスするためのログインでは、リモート・ログイン・サーバーに対する認証が必要です。リモート認証に成功すると、その後、認証サーバーのユーザーのログイン資格証明をデバイス上に格納するローカル資格証明ストアを使用できるようになります。そのため、ユーザーが同じアプリケーション・セッション内(つまり、アプリケーション実行のライフサイクル内)でサーバーに対して認証されると、MAFは認証コンテキストをローカルに格納し、以降の認証の試行でそれを使用できるようになります。この場合、ローカルの認証コンテキストで問題なくユーザーを認証できる場合、MAFでは、ログイン・サーバーに接続されません。最初の認証では認証サーバーへの接続が必要ですが、ローカル認証を使用したアプリケーションのためにこのサーバーに頻繁にアクセスする必要はありません。

ヒント:

ローカル資格証明ストアに対する認証は、リモート・ログイン・サーバーに対する認証よりも高速に実行できますが、リモート接続のみをサポートしているOAuthまたはWeb SSO認証プロトコルを使用した認証をお薦めします。

表27-1に、MAFアプリケーションのログイン構成オプションをまとめます。接続モードは、選択した認証プロトコルによって異なります。

表27-1 MAFの接続モードおよびサポートされている認証プロトコル

接続モード

サポートされているプロトコル

モードの説明

ローカル

- HTTP Basic

ローカルに格納されている資格証明がデバイスで利用できない場合にのみ、アプリケーションでは、リモート・ログイン・サーバーに対する認証が必要です。初回ログインは、常にリモート・ログイン・サーバーに対して行われます。初回ログインに成功すると、MAFは、資格証明をデバイスの資格証明ストア内にローカルに保持します。アプリケーション機能への以降のアクセスでは、それらの資格証明が使用されます。「Webサービス・セキュリティに関する必知事項」も参照してください。

リモート

- HTTP Basic

- OAuth

- Web SSO

アプリケーションで、Oracle Access Manager (OAM)アイデンティティ・サーバーなどのリモート・ログイン・サーバーまたは保護されているWebアプリケーションに対する認証が必要です。ユーザーがログインするたびに、リモート・サーバーに対する認証が求められます。デバイスがサーバーに接続できない場合、ユーザーは、前回は正常に認証されていても、保護されたMAF機能にアクセスできません。

ハイブリッド

- HTTP Basic

デバイスでローカル資格証明が利用可能でも、ネットワーク接続が利用できる場合は、アプリケーションでは、リモート・ログイン・サーバーに対する認証が必要です。ネットワーク接続がないためにログイン・サーバーにアクセスできない場合にのみ、デバイスのローカル資格証明が使用されます。

27.4 MAF接続の構成

アプリケーション機能は、アプリケーション・ログイン・サーバーへの接続を少なくとも1つ定義することで保護できます。

セキュリティが適用されるアプリケーション機能のアプリケーション・ログイン・サーバーに1つ以上の接続を定義する必要があります。アプリケーション・ログイン・サーバーへの定義済の接続が存在しないと、無効な構成になります。その結果、アプリケーションは正しく機能しません。

第27.4.1項 MAFログイン接続の作成方法

ログインの接続タイプを作成して、ローカル認証とリモート認証の両方を有効にします。タスク内の手順に従って、MAF接続の作成ダイアログを使用してログイン・サーバー接続を作成します。

図27-2に示すように、MAF接続の作成ダイアログを使用して接続タイプを選択し、接続タイプに応じて、ローカルおよびリモート認証の両方を有効にします(ハイブリッド)。アプリケーション要件によっては、次の認証プロトコルをサポートするサーバーへの接続を構成できます。

- HTTP Basic

- OAuth

- Web SSO

注意:

OAuthまたはWeb SSO接続タイプを使用したログイン・サーバーへの接続を構成することをお薦めします。OAuthおよびWeb SSOは、リモート・ログイン・サーバーに対する認証を要求し、ユーザーがローカル資格証明ストアからデバイスで認証することを許可しません。

図27-2 認証の構成

ログイン・サーバー接続を作成するには:

1. 次のアクションのいずれかを実行します。

- ナビゲータで、「ディスクリプタ」ノード、「ADF META-INF」と開き、maf-application.xmlをダブルクリックします。次に、maf-application.xmlファイルの概要エディタで、「セキュリティ - 認証とアクセス制御」セクションを展開し、「作成」をクリックします(図27-3を参照)。

図27-3 サーバー接続の追加

- または、「新規ギャラリ」で「接続」を選択して、「MAFログイン・サーバー接続」を選択します。

2. 「MAFログイン接続の作成」ダイアログで、目的の「認証サーバー・タイプ」を選択します。

3. 次の項の説明に従って接続タイプを構成します。

ダイアログに表示される、アスタリスクが付いたオプションは必須フィールドであることに注意してください。このダイアログでは、すべての必須フィールドが入力された後にのみ「接続のテスト」ボタンが有効になります。このボタンは、Basic認証がダイアログで選択されている場合にのみ表示されます。

27.4.2 マルチテナント対応MAFログイン接続の作成方法

MAFアプリケーション接続は、様々な組織やテナントで共有可能なホスト・アプリケーション機能をサポートできます。タスク内の手順に従って、サーバーへのマルチテナント対応の接続を構成します。

図27-4に示すように、「MAFログイン接続の作成」ダイアログを使用して、1つのアプリケーションに異なる組織(テナント)で共有可能な1つのホスト・アプリケーション機能が含まれ、それが特定のテナントによって所有されているように見える、マルチテナントの概念がサポートされたMAFアプリケーション接続を作成できます。HTTP基本認証プロトコルをサポートするサーバーへのマルチテナント対応接続を構成できます。

図27-4 マルチテナント対応の接続の構成

図27-5に示すように、MAFアプリケーションで表示されるマルチテナント対応の接続が定義されたデフォルトのログイン・ページでは、HTTPリクエストでテナント値を伝播するため、ユーザーにドメインIDの入力が要求されます。

図27-5 マルチテナント対応接続のデフォルトのログイン・ページ

マルチテナント対応ログイン・サーバーを作成する手順:

1. 次のアクションのいずれかを実行します。

- ナビゲータで、「ディスクリプタ」ノード、「ADF META-INF」と開き、maf-application.xmlをダブルクリックします。次に、maf-application.xmlファイルの概要エディタで、「セキュリティ - 認証とアクセス制御」セクションを展開し、「作成」をクリックします(図27-6を参照)。

図27-6 サーバー接続の追加

- または、「新規ギャラリ」で「接続」を選択して、「MAFログイン・サーバー接続」を選択します。

2. 「MAFログイン接続の作成」ダイアログで、マルチテナント・ログインに対応している「認証サーバー・タイプ」を選択します。

3. 図27-4に示すように、「カスタム・ヘッダー」タブをクリックして、次を構成します。

- マルチテナント対応: MAFアプリケーション接続にマルチテナント対応を定義する場合に選択します。「マルチテナント対応接続を作成する場合の処理」も参照してください。

- マルチテナント対応スキーム: テナントのドメインIDを認証サーバーに伝播する場合に使用するスキームを選択します。個別のヘッダーとして送信するには、「カスタム・ヘッダー」(デフォルト)を選択します。「ユーザー名」オプションは下位互換性をサポートし、テナントIDをユーザーIDの一部として送信します(ユーザー名の混在と呼ばれます)。

- ヘッダー名: 認証サーバーで必要とされるテナント・ヘッダー名を入力します。たとえば、ログイン中にユーザーにテナントIDを求めるには、マルチテナント・ヘッダー名(X-ID-TENANT-NAME)を入力します。図27-5に示すように、デフォルトのログイン・ページによって、ドメイン名の入力がユーザーに求められます。

- カスタム・ヘッダー: オプションで、認証の実行に必要な追加のカスタム・ヘッダー名を入力します。これらは、マルチテナント・ヘッダーに加えて構成される場合があります。「カスタム・ヘッダーに関する必知事項」も参照してください。
カスタム・ヘッダーのヘッダー値がわかっている場合は、値を入力します。指定されたカスタム・ヘッダーの値がログイン中にオーバーライドされる場合は、対応する「値」フィールドを空のままにします。実行時にヘッダー値を指定する場合は、OverrideConnectionHandler APIを使用して値をプログラムで設定する必要があります。APIを使用してヘッダーを構成する方法の詳細は、「認証前にログイン資格証明をプログラムで構成する方法」を参照してください。

4. 次の項の説明に従って接続タイプを構成します。
ダイアログに表示される、アスタリスクが付いたオプションは必須フィールドであることに注意してください。このダイアログでは、すべての必須フィールドが入力された後にのみ「接続のテスト」ボタンが有効になります。このボタンは、Basic認証がダイアログで選択されている場合にのみ表示されます。

27.4.3 基本認証の構成方法

「MAFログイン接続の作成」ダイアログで「HTTP基本」認証サーバー・タイプを選択して、Basic認証の接続を構成します。

図27-7 基本認証の構成

基本認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログで、「認証サーバー・タイプ」に「HTTP基本」を選択します。

「MAFログイン接続の作成」ダイアログを開く方法の詳細は、「MAFログイン接続の作成方法」を参照してください。

2. 「一般」タブで、次を定義します。

- 接続モード: 表27-1に示すように、認証のタイプを選択します。

- 「接続名」: 接続の名前を入力します。

- アイドル・タイムアウト: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:

MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を行いますが、セッション・タイムアウト後にこの認証を行うことはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- ログイン最大試行回数: ローカル資格証明がクリアされるまでにユーザーに許可する最大ログイン試行失敗回数を設定します。デフォルトで、MAFは、ユーザーに3回のログイン試行の失敗を許可しており、それを超えると、ローカルに格納されているそのユーザーの資格証明をクリアし、以降のログイン試行では、リモート・ログイン・サーバーに接続します。リモート・サーバーに接続した後は、そのユーザーに許可されるログイン試行回数は無制限になります。
ユーザーがログイン試行を指定した回数失敗すると、ローカル資格証明がクリアされるため、MAFはサーバーに対して認証を実行します。これにより、ユーザーは、管理者がユーザーのパスワードを変更した後、パスワードがデバイス上にまだ格納されていない状態で、この新しいパスワードを使用してログインできるようになります。ローカル認証が許可されている場合、ユーザーがサーバー接続へのログインに成功するとパスワードはデバイス上に安全に格納されます。

注意:

アプリケーション機能がローカル認証を使用するように構成されている場合でも、MAFは、ローカルに格納されているユーザー資格証明をクリアします。

3. 図27-8に示すように、「HTTP基本」タブをクリックして、次を構成します。

- ログインURL: ログイン・ページのログインURLを入力します。
ログインURLには、リモート・サーバー上のログイン・ページではなく、HTTP基本認証のユーザー名/パスワードのチャレンジを表示する、保護されたページを指定します。ログインURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースを指すことはできません。

- ログアウトURL: 認証サーバーのログアウトURLを入力します。
ログアウトURLはログインURLと同じ場合もあれば、セッションで追加アクション(無効化など)を実行するリモート・サーバーへのURLの場合もあります。ログアウトURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースを指すことはできません。

図27-8 基本認証の構成

4. オプションで、図27-4に示すように、「カスタム・ヘッダー」タブをクリックして、次を構成します。

- カスタム・ヘッダー: 認証の実行に必要な任意のカスタム・ヘッダー名を入力します。「カスタム・ヘッダーに関する必知事項」も参照してください。
カスタム・ヘッダーのヘッダー値がわかっている場合は、値を入力します。指定されたカスタム・ヘッダーの値がログイン中にオーバーライドされる場合は、対応する「値」フィールドを空のままにします。実行時にヘッダー値を指定する場合は、OverrideConnectionHandler APIを使用して値をプログラムで設定する必要があります。APIを使用してヘッダーを構成する方法の詳細は、「認証前にログイン資格証明をプログラムで構成する方法」を参照してください。

- マルチテナント対応: 「マルチテナント対応MAFログイン接続の作成方法」で説明しているように、このオプションを選択して、MAFアプリケーション接続にマルチテナント対応を定義できます。

5. 「自動ログイン」タブをクリックし、「ログイン資格証明の格納方法」の説明に従ってパラメータを構成します。

6. 「認可」タブをクリックし、「アクセス制御の構成方法」の説明に従ってパラメータを構成します。

7. 「一般」タブをクリックし、「接続のテスト」をクリックします。

8. 「OK」をクリックします。

第27.4.4項 OAuth認証の構成方法

アプリケーションは、リモート・サーバーに保管されている保護されたデータまたはサービスにアクセスできます。OM_PROP_OAUTH_OAUTH20_SERVERプロパティ・キーを使用するようにサーバーを構成し、タスク内の手順に従って、OAuthサーバーによる認証を構成します。

図27-9に示すように、「MAFログイン接続の作成」ダイアログを使用して、リモート・サーバーに保管されている保護されたデータまたはサービスへのアプリケーションのアクセスを構成する方法を構成します。

図27-9 OAuthの構成

始める前に:

OM_PROP_OAUTH_OAUTH20_SERVERプロパティ・キーを使用するようにサーバーを構成します。

OAuthサーバーで認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「OAuth」を選択します。

「MAFログイン接続の作成」ダイアログを開く方法の詳細は、「MAFログイン接続の作成方法」を参照してください。

2. 「一般」タブで、次を構成します。

- 「接続名」: 接続の名前を入力します。

3. 「OAuth」タブをクリックし、図27-10に示すように、次を構成します。

- 「権限タイプ」ドロップダウン・リストから、適切な権限タイプを選択します。

- サーバー・ログイン・ページを表示する場合は、「認可コード」を選択します。

- MAFアプリケーションでデフォルト・ログイン・ページまたはカスタム・ログイン・ページ(構成されている場合)を表示する場合は、「リソース所有者の資格証明」を選択します。

- MAFアプリケーションが、ユーザーIDまたはユーザー資格証明なしで、匿名でリソースにアクセスできるようにする場合は、「クライアント資格証明」を選択します。

- 「クライアント識別子」を入力し、オプションで、「クライアント・シークレット」フィールドに接続パスワード値を入力します。

- 認可サーバーの「リダイレクト・エンドポイント」およびそのエンドポイントのURIを認可サーバー・エンドポイント自体および「トークン・エンドポイント」に入力します。

- ユーザーのログアウト時にリダイレクトされる「ログアウトURL」を入力します。このフィールドは必須入力で、URLパラメータは特定の認証プロバイダによって決まります。

- アプリケーション内の組込みブラウザにログイン・ページを表示する場合は、「埋込みブラウザ・モードの有効化」を選択します。外部ブラウザでログイン・ページを表示するには選択解除します。SSOが必要となる場合は、このオプションの選択を解除して、アプリケーションによって外部ブラウザが使用されるようにします。

図27-10 クライアントIDおよびエンド・ポイントの構成

4. 「認可」タブをクリックし、「アクセス制御の構成方法」の説明に従ってパラメータを構成します。

27.4.5 MAFアプリケーションでのシングル・サインオンの構成方法

MAFでは、すべてのプラットフォーム(Android、iOSおよびユニバーサルWindowsプラットフォーム)にデプロイされるMAFアプリケーションでシングル・サインオン(SSO)およびフェデレーテッドSSOがサポートされています。

SSOの構成に使用するアイデンティティ・プロバイダは、Azure Active Directoryのインスタンスなど、企業ドメインでホストされるサードパーティ・アイデンティティ・プロバイダ、またはMAFアプリケーションがたとえばOracle Mobile Cloud Service (MCS)などに接続する、バックエンド・サービスのためにすでに構成されているどのようなアイデンティティ・プロバイダにもできます。

ユニバーサルWindowsプラットフォームにデプロイするMAFアプリケーションがMCS SSOのサポートを必要とする場合、MCS SSOにアクセスできるアプリケーションでCordovaプラグインを登録する必要があります。次の例に示すように、このアクセスが可能なプラグインのplugin.xmlファイルにエントリを構成してください。

<config-file target="package.appxmanifest" parent="/Package/Applications/Application/uap:ApplicationContentUriRules">
<!-- Allow Webviews access to server so the token relay header can be injected -->
<uap:Rule Match="http://*.oracle.com:7777/*/*/*/*" Type="include"/>
</config-file>

MAFアプリケーションのCordovaプラグインの作成と使用の詳細は、「MAFアプリケーションでのプラグインの使用方法の概要」と「MAFアプリケーションでの追加プラグインの登録」を参照してください。

OAuth2トークン・ポリシーで保護されているサービスへの送信リクエストにMAFによってOAuthアクセス・トークンが含まれているトークン・リレー・サービスの使用もサポートされています。SSO接続の構成時に、「トークン・リレー・レスポンスの解析」チェック・ボックスを選択することで、このサポートを有効にします。その後、MAFは、RFC 6749 - OAuth 2.0認可フレームワークでIETS(インターネット技術タスク・フォース)が提唱しているアクセス・トークン・フォーマットに適合するログイン成功URLからのJavaScript Object Notation (JSON)レスポンスを解析します。MAFでは、JSONレスポンスからOAuthアクセス・トークンを取得し、保護されたサービスへのMAFアプリケーション・リクエスト内にそれを含めます。次の例では、OAuthアクセス・トークンの取得のためにMAFで解析される、有効なJSONレスポンスを示します。MAFでは、JSONレスポンスに含まれる場合があるその他のカスタム・フィールドは無視されます。

{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}

注意:
「トークン・リレー・レスポンスの解析」チェック・ボックスを選択すると、MAFで、ログインURLに問合せパラメータとしてformat=JSONが含まれます。URLでこの問合せパラメータを指定する必要はありません。

MCSのために構成されているアイデンティティ・プロバイダを使用する場合は、MAFアプリケーション内で構成する接続URL内の問合せパラメータとして、MAFアプリケーションが接続するMCSモバイル・バックエンドIDによって発行された、OAuth ConsumerのためのクライアントIDを提供します。次の例では、MCSモバイル・バックエンドで構成されるSSOをアプリケーションで使用できるようにする接続のために、MAFアプリケーションのconnections.xmlファイル内で生成されたエントリのサブセットを示します。

<Contents>
<login url="http://yourmcsinstance.com/sso/token?clientID=C490B55...FO51"/>
<logout url="http://yourmcsinstance.com/sso/appLogout"/>
<loginSuccessUrl url="http://yourmcsinstance.com/sso/success/token?clientID=C490B55...FO51">
<parseTokenRelayResponse value="true"/>
</loginSuccessUrl>
<loginFailureUrl url="http://yourmcsinstance.com/sso/appError"/>
…
</Contents>

シングル・サインオン認証を構成するには、次の手順を実行します。

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「Web SSO」を選択します。

「MAFログイン接続の作成」ダイアログを開く方法の詳細は、「MAFログイン接続の作成方法」を参照してください。

2. 「一般」タブで、次を構成します。

- 「接続名」: 接続の名前を入力します。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

3. 「Web SSO」タブをクリックし、図27-11に示すように、成功したログインおよび失敗したログインを有効化する次のURLを構成します。

- ログインURL: MAFアプリケーションの移動先でユーザーに証明書の入力を求める必要がある場合に、その移動先のURLを入力します。ログインURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースを指すことはできません。MCSへのログイン接続を作成する場合、ログインURLには、MAFアプリケーションが接続するMCS MBEによって指定されたクライアントIDに設定されている、問合せパラメータが含まれている必要があります。MCSからこのクライアントの値を取得します。

- ログアウトURL: サーバー・セッションを終了してユーザーをログアウトする、サーバー側URLを入力します。ログアウトURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースを指すことはできません。
MCSへの接続を構成する場合は、ログアウトURLが次に示す書式に従っていることを確認して、ログイン後のリダイレクトが期待どおりに動作するようにしてください。

//A production instance of MCS
https://{hostname}/logout.html?end_url=/mobileui
//A development instance of MCS
https://{hostname}/oam/server/logout

- ログイン成功URL: ユーザーが認証成功後にリダイレクトされるターゲットURLを入力します。
ログイン成功URLはログインURLと同じにできます。たとえば、ログインURLとログイン成功URLがhttp://www.mysite.comの場合、ユーザーがブラウザでhttp://www.mysite.comを指定すると、ブラウザはまずサイトのログイン・ページにリダイレクトされ、そこで認証に成功するとhttp://www.mysite.comに再びリダイレクトされます。その後、MAFでは、ログイン成功URLによって指定されたページを検出すると、ログイン・プロセスを完了してリクエストされた機能をアクティブにします。このようにして、ログイン成功URLページの内容がユーザーに表示されることなく、ユーザーはMAF機能にアクセスできるようになります。MCS MBEへのログイン接続を作成する場合は、「ログインURL」に入力するURLと同様に、MCS MBEで指定されたクライアントIDに設定されている、問合せパラメータを含めます。

- トークン・リレー・レスポンスの解析: OAuthトークンのためのログイン成功URL JSONレスポンスを解析するには、このチェック・ボックスを選択します。MAFアプリケーションでは、保護されたサービスにアクセスするために、取得したOAuthトークンが使用されます。このチェック・ボックスを選択すると、アプリケーションのconnections.xmlファイル内に<parseTokenRelayResponse value="true"/>が生成されます。

- ログイン失敗URL: ユーザーが認証失敗後にリダイレクトされるURLを入力します。失敗用のURLがない場合は、任意のURLを入力します。
ブラウザにログイン失敗URLがロードされると、MAFはまずエラーを検出してから、アプリケーションに制御を戻します。これは、MAFアプリケーションによってユーザーのログイン試行回数が制限されている場合に有用です。この場合、ユーザーが許容回数の最後の試行で認証に失敗すると、MAFによってログイン失敗URLにリダイレクトされます。

失敗用のURLがない場合は、任意のURLを入力しても構いません。この場合、ユーザーがログイン・ページ上の「取消」をクリックするか、所定の期間内にユーザー・アクションが行われなかったためにログインがタイム・アウトすると(非アクティブのタイムアウトは2分)、認証が終了します。

図27-11 認証URLの構成

4. 「認可」タブをクリックし、「アクセス制御の構成方法」の説明に従ってパラメータを構成します。

27.4.6 MAFアプリケーション・ログイン用プレースホルダ接続の構成方法

MAFアプリケーション・ログインのすべての接続属性が設計時にわからない場合は、AdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIを使用して、プレースホルダ接続を定義します。タスク内の手順に従って、実行時にプレースホルダ接続を定義するように構成します。

図27-12に示すように、「MAFログイン接続の作成」ダイアログを使用して、開発時に名前付き接続を作成し、実行時にログイン属性を移入してこの接続の定義を完成させることができます。この接続タイプは、デザインタイムに接続属性の一部がわからない場合に特に便利です。

アプリケーション開発者は、AdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIを使用して、「実行時の名前付き接続の接続属性の更新方法」の説明に従って、設計時に作成されたプレースホルダ接続を完全に定義する必要があります。

図27-12 プレースホルダ接続の構成

設計時にプレースホルダ接続の定義を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「実行時に値を指定」を選択します。

「MAFログイン接続の作成」ダイアログを開く方法の詳細は、「MAFログイン接続の作成方法」を参照してください。

2. 「一般」タブで接続名を入力します。

「実行時の名前付き接続の接続属性の更新方法」で説明されているように、アプリケーション開発者は、この識別子を使用して更新する接続を識別します。

3. 「認可」タブをクリックし、「アクセス制御の構成方法」の説明に従ってパラメータを構成します。

27.4.7 実行時の名前付き接続の接続属性の更新方法

AdfmfJavaUtilitiesクラスでは、overrideConnectionPropertyおよびupdateSecurityConfigWithURLParametersメソッドが提供され、すでに存在する接続の接続属性の定義または再定義に使用できます。この接続属性は、プレースホルダ(「MAFログイン接続の作成」ダイアログで「実行時に値を指定」を選択する場合)、または完全に作成された接続定義のいずれかです。

両方のメソッドは、これもまたAdfmfJavaUtilitiesクラスによって提供される、clearSecurityConfigOverridesおよびupdateApplicationInformation APIと連携して起動する必要があります。updateSecurityConfigWithURLParametersメソッドは、認証のみに必要なパラメータを更新します。connections.xml内で接続を指定する追加パラメータは、updateSecurityConfigWithURLParametersメソッドを使用して更新できません。updateSecurityConfigWithURLParametersですべてのパラメータを更新できるのと同様に、overrideConnectionPropertyを使用してすべての非認証パラメータを更新します。

注意:

一般的なタイミングは、アプリケーション・ライフサイクル・リスナー内でstart()メソッド実装にAdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIをコールします。機能ライフサイクル・リスナー内からこのメソッドをコールしないでください。

configUrlParamパラメータに関連付けられた接続属性を更新するには、次の例に示すように、updatedSecurityConfigWithURLParametersメソッドを他のメソッドと組み合せてコールします。

AdfmfJavaUtilities.clearSecurityConfigOverrides(loginConnectionName);
AdfmfJavaUtilities.updateSecurityConfigWithURLParameters(configUrlParam, key, message, showConfirmation);
// Final step to apply the changes
AdfmfJavaUtilities.updateApplicationInformation(false);

keyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして設定されます。その後の更新など、その構成に対するすべての参照にこのkeyパラメータを使用します。MAFが接続の既存の属性に対する接続構成の変更を検出すると、trueに設定されたshowConfirmationパラメータでメソッドを呼び出して、MAFで確認プロンプトをエンド・ユーザーに表示できます。

configUrlParamパラメータに渡す文字列の値は、UTF-8エンコードで、次のように書式設定する必要があります。

String parameterString = "http://settings?" +
"&<Parameter Name1>::=<Parameter Value1>" +
"&<Parameter Name2>::=<Parameter Value2>" +
...
"&<Parameter NameN>::=<Parameter ValueN>";

たとえば、configUrlParamパラメータに次の値を渡します。

http://settings?AuthServerType::=HTTPBasicAuthentication
&ApplicationName::=Approvals
&LoginURL::=http://hostname.com:8008/OA_HTML/RF.jsp?function_id=mLogin
&LogoutURL::=http://hostname.com:8008/OA_HTML/RF.jsp?function_id=mLogout
&SessionTimeOutValue::=28800
&IdleTimeOutValue::=7200
&CryptoScheme::=PlainText

URLは、次のように作成する必要があります。

http://settings?AuthServerType::=HTTPBasicAuthentication&ApplicationName::=Approvals&LoginURL::=http%3A%2F%2Fhostname.com%
3A8008%2FOA_HTML%2FRF.jsp%3Ffunction_id%3DmLogin&LogoutURL::=http%3A%2F%2Fhostname.com%3A8008%2FOA_HTML%2FRF.jsp%3
Ffunction_id%3DmLogout&SessionTimeOutValue::=28800&IdleTimeOutValue::=7200&CryptoScheme::=PlainText

updateSecurityConfigWithURLParametersおよびoverrideConnectionPropertyメソッドについては、さらに次の点に注意してください。

- overrideConnectionPropertyでは、MAFアプリケーションが次にそのログイン接続を使用するまで構成の変更が永続化されないのに対し、updateSecurityConfigWithURLParametersメソッドでは、即時に新しい構成が永続化されます。たとえば、エンド・ユーザーがログイン接続によって保護されている機能に移動すると、MAFによってログイン・ビューが表示されます。

- overrideConnectionPropertyを使用して接続参照内の任意のトップ・レベルのプロパティを再構成でき、再構成できる接続参照はconnections.xmlファイル内のログイン接続に限定されません。updateSecurityConfigWithURLParametersメソッドは、ログイン接続の更新にのみ使用できます。

- updateSecurityConfigWithURLParametersのコールがそれ以前のupdateSecurityConfigWithURLParametersのコールを再構成し、その結果として、新しいログインURLのたびにupdateSecurityConfigWithURLParametersがコールされるのに対し、overrideConnectionPropertyのコールは累積されます。次の例は、一連のoverrideConnectionPropertyコールで、MyLoginConnectionという名前の接続のlogin、logoutおよびaccessControlプロパティの値をオーバーライドする方法を示しています。

AdfmfJavaUtilities.clearSecurityConfigOverrides("MyLoginConnection");
AdfmfJavaUtilities.overrideConnectionProperty("MyLoginConnection", "login", "url", newLoginUrl);
AdfmfJavaUtilities.overrideConnectionProperty("MyLoginConnection", "logout", "url", newLogoutUrl);
AdfmfJavaUtilities.overrideConnectionProperty("MyLoginConnection", "accessControl", "url", newAccessControlUrl);
AdfmfJavaUtilities.updateApplicationInformation(false);

- overrideConnectionProperty (String node)の2番目のパラメータの値は、connections.xmlファイルで使用されるパラメータ名です。たとえば、次の接続を更新するには:

<Reference name="remotePage" className="oracle.adf.model.connection.url.HttpURLConnection" xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="remotePage">
<Contents>
<urlconnection name=" remotePage_urlconnectionName " url="http://www.google.com"/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

URLを変更するoverrideConnectionProperty を次のようにコールします。

overrideConnectionProperty("remotePage", "urlconnection", "url", "http://www.oracle.com");

これは、updateSecurityConfigWithURLParametersと同じパラメータ名ではありません。updateSecurityConfigWithURLParametersを使用する場合は、前述のURL作成パターンに従います。connections.xmlファイルの内容に関する知識は必要ありません。

oracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスおよびconfigUrlParamパラメータの使用方法の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

overrideConnectionPropertyを使用して接続プロパティの値をオーバーライドする方法の詳細は、「認証前にログイン資格証明をプログラムで構成する方法」を参照してください。ConfigServiceDemoサンプル・アプリケーションのConfigServiceHandler.javaでは、overrideConnectionPropertyメソッドを起動して、いくつかの接続プロパティをオーバーライドする方法を示しています。ConfigServiceDemoサンプル・アプリケーションの詳細は、「サンプルのMAFアプリケーション」を参照してください。

第27.4.8項 ログイン資格証明の格納方法

ログインすることなくMAFアプリケーションにアクセスするために、MAFで資格証明、ユーザー名および自動ログインを保管することもできます。「MAFログイン接続の作成」ダイアログの「自動ログイン」オプションを使用して、資格証明の保管オプションを選択します。

セキュリティが重要でない場合、MAFはユーザー資格証明の格納をサポートしますが、これは、ログイン・サーバーにリプレイできるか、またはユーザーをローカルで認証するために使用できます(ログイン接続に定義されているモードによって異なります)。資格証明を格納すると、ユーザーはログインしないでMAFアプリケーションにアクセスできるようになるため、ユーザーの操作性が向上します。IDM Mobile SDKを使用すると、MAFは次のモードをサポートできます。

- ユーザー名を記憶: MAFはユーザー名をキャッシュし、ログイン・ページのユーザー名フィールドに移入します。ユーザーがパスワードを入力し、ログイン・ボタンをタップして確認すると、MAFはこれらの資格証明を認証サーバーに対してリプレイします。

- 資格証明を記憶: MAFはユーザー資格証明をキャッシュし、ログイン・ページのユーザー名フィールドとパスワード・フィールドに移入します。ユーザーがログイン・ボタンをタップしてこれらの資格証明を確認すると、MAFはそれらを認証サーバーに対してリプレイします。

- 自動ログイン - MAFはユーザー資格証明をキャッシュし、以降の認証時にそれらを認証サーバーにリプレイします。このモードでは、ユーザーは、MAFによってユーザーに資格証明を入力または確認するよう求められずにアプリケーションを起動できます。ただし、MAFは、新しいアプリケーション・セッションが開始されたことをユーザーに通知できます。

注意:

ユーザーは、MAFが資格証明を格納するかどうかを決定できます。

図27-13に示すように、「MAFログイン接続の作成」ダイアログの「自動ログイン」ページを使用して、資格証明格納オプションを選択できます。資格証明オプションを選択すると、ユーザー名とパスワードを記憶するオプションによってログイン・ページが設定されるため、デバイスを複数のユーザーが共有する場合は選択しないでください。

図27-13 ユーザー資格証明のキャッシュ

27.4.9 MAFアプリケーションの接続の作成時に行われる処理

アプリケーションの接続情報は、connections.xmlファイルで得られます。このファイルは、アプリケーションにバンドルできます。このファイルが構成サービス用にホストされている場合、MAFはアプリケーションの起動時ごとに更新された構成情報についてチェックします。

MAFでは、connections.xmlファイル内のすべての接続情報が集約されます(このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」パネルの「ディスクリプタ」ノードおよび「ADF META-INF」ノードの下にあります)。次の例に示すこのファイルは、アプリケーションにバンドルするか、構成サービスにホストできます。後者の場合、MAFは、アプリケーションが起動されるたびに、更新済の構成情報があるかどうかをチェックします。

注意:

MAFアプリケーションの認証の要件として、JDeveloperではadfCredentialStoreKey属性をログイン接続参照と同じ名前に設定します(例: Connection_1)。connections.xmlファイルのadfCredentialStoreKey属性またはログイン接続名を編集する場合は、値を互いに同じに設定してください。同じ値を維持しないと、MAF実行時例外が発生します。

<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="Connection_1"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="Connection_1"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://10.0.0.0/SecuredWebServicelogin/login"/>
<logout url="http://10.0.0.0/SecuredWebServicelogout/logout"/>
<accessControl url="http://10.0.0.0/Identity/Authorize"/>
<isAcsCalledAutomatically value="false"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<isMultiTenantAware value="true"/>
<multiTenantHeaderName value="Oracle_Multi_Tenant"/>
<injectCookiesToRESTHttpHeader value="true"/>
<userObjectFilter>
<role name="manager"/>
<privilege name="account manager"/>
<privilege name="supervisor"/>
<privilege name=""/>
</userObjectFilter>
<rememberCredentials>
<enableRememberUserName value="true"/>
<rememberUserNameDefault value="true"/>
<enableRememberPassword value="true"/>
<rememberPasswordDefault value="true"/>
<enableStayLoggedIn value="true"/>
<stayLoggedInDefault value="true"/>
</rememberCredentials>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のconnections.xmlファイルで定義されたルックアップに関する項を参照してください。

27.4.10 マルチテナント対応接続を作成する場合の処理

マルチテナント対応の接続を作成すると、MAFは、connections.xmlファイル内で<isMultiTenantAware>要素の値をtrueに設定します。

「マルチテナント対応」オプションを有効にして、「MAFログイン接続の作成」ダイアログへの入力が完了すると、MAFはtrueに設定された<isMultiTenantAware>要素をconnections.xmlファイルに移入します。マルチテナント接続では、ユーザー名はテナント名とユーザー名の組合せです。

接続がマルチテナント対応である場合、ログイン・ページは、JavaScriptユーティリティを使用して認識します。ログイン・ページでそのような接続が検出されると、追加フィールドが表示され、ユーザーは、「MAFログイン接続の作成」(図27-5を参照)で構成したテナント名をそのフィールドに入力する必要があります。ログイン(正しいテナントIDの入力を含む)が成功すると、MAFは、ローカル資格証明ストアにテナントIDを格納します。

27.4.11 ログイン接続構成に関する必知事項

connections.xmlファイルまたはプログラム内でログインURLを定義するときには、そのURLがリクエスト時にファイル転送を発生しないWebリソースを指すようにする必要があります。

保護されたMAF機能へのアクセス権を付与するためのログインURLをconnections.xmlファイルまたはプログラムを使用して定義する場合、ログインURLはmydocument.txtのようなファイル・リソースを指すことはできません。このログインURLは、リクエスト時にファイル転送が発生しないWebリソースを指している必要があります。ファイル・リソースが使用されていると、MAFアプリケーションがハングするかログインに失敗して、ユーザーが保護されたMAF機能にアクセスできない場合があります。

27.4.12 ローカル接続およびハイブリッド・ログイン接続のための複数IDに関する必知事項

アプリケーションのライフサイクル内で、ユーザーは複数のIDを使用してローカルおよびハイブリッドのログイン接続モードでログインおよびログアウトできます。

ローカルおよびハイブリッド・ログイン接続モードでは、リモート接続と同様、ユーザーはアプリケーション・ライフサイクル内で任意の数のIDを使用して、ログインおよびログアウトできます。ログイン接続を定義してこれらの接続モードを使用するとき、現在のセッション・タイムアウト期間内に、保護されているアプリケーション機能にすでにログイン済である場合は、ユーザーは、ローカル資格証明ストアを使用して保護されているアプリケーション機能に再びログインできます。この場合、明示的にログアウトしたユーザーまたはアイドル・タイムアウトが期限切れになっているためにログアウトされたユーザーは、保護されているアプリケーション機能(またはアプリケーション機能を保護するログイン・サーバーによって保護されているその他のアプリケーション機能)に再びログインできます。

注意:

ローカル接続とハイブリッド接続は、基本認証でのみ使用可能です。OAuthおよびFederate SSOはリモート認証を使用するため、認証が成功しない場合、アプリケーション・ユーザーはアプリケーションに再びログインできません。

27.4.13 MAFアプリケーションおよび認証モードの移行に関する必知事項

MAFアプリケーションを移行するときには、maf-feature.xmlファイルで定義した認証モードが、connections.xmlファイルのauthenticationMode属性で定義されていることを確認します。

MAFアプリケーションを移行する場合、maf-feature.xmlで定義されている認証モード(<adfmf:feature id="feature1" name="feature1" credentials="remote">など)が、connections.xmlファイルのauthenticationMode属性で定義されていることを確認する必要があります。credentials属性の存在を検出するJDeveloperの監査ルールを使用すると、その属性をmaf-feature.xmlから削除する際に役立ちます。

connections.xmlファイルのauthenticationMode属性は、remoteまたはlocalとしてのみ定義できるため、none (<adfmf:feature id="feature1" name="feature1" credentials="none">)の値を移行しないでください(移行すると、デプロイメントが失敗します)。

27.4.14 カスタム・ヘッダーに関する必知事項

MAFログイン接続の作成時にカスタム・ヘッダーが定義されていると、connections.xmlファイルには、customAuthHeaders要素と個別のヘッダーサブ要素が移入されます。ヘッダーの値は、OverrideConnectionHandler APIを使用することで実行時に構成できます。

カスタム・ヘッダーを定義して「MAFログイン接続の作成」ダイアログへの入力を完了すると、MAFは、connections.xmlファイルに、customAuthHeaders要素および各headerサブ要素を移入します。

カスタム・ヘッダーの値を実行時に指定すると、MAFアプリケーションはoracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスのOverrideConnectionHandler APIを使用してヘッダー値を構成できます。oracle.adfmf.framework.api.AdfmfAuthConnectionクラスは、connection.xml XML要素がオーバーライドされている場合に、それらの要素にアクセスして最新の値を取得するための便利な方法です。APIを使用してヘッダーを構成する方法の詳細は、「認証前にログイン資格証明をプログラムで構成する方法」を参照してください。

ログイン(正しいヘッダー値の入力を含む)に成功すると、MAFはヘッダーの詳細をローカルの資格証明ストアに格納するため、HTTPリクエスト時に、セキュアなコール(RESTサービスに対するコールなど)にカスタム・ヘッダーを含めることができます。

第27.4.15項 実行時に行われる処理: MAFがREST Webサービスをコールした場合

MAFアプリケーションがREST Webサービスをコールするときに、ユーザーがローカルに認証されている場合、MAFはログイン・サーバーに対してユーザーを認証します。MAFは、ユーザーが認証されている場合に、REST Webサービスへのアプリケーション・リクエストを実行します。

ユーザーがローカルに認証されると、MAFはMAFアプリケーションがREST Webサービスをコールしたときにログイン・サーバーに対してユーザーをサイレントに認証します。ユーザーの資格証明が認証されると、MAFはREST Webサービスへのアプリケーション・リクエストを実行します。REST Webサービスが401ステータス・コードを返した場合(未許可)、MAFは、ユーザーにもう一度認証するよう求めます。REST Webサービスが302コードを返した場合(見つかったか一時的に移動されている)、MAFは、ログイン・サーバーをチェックして、ユーザーが認証されているか確認します。その場合は、コードが302リダイレクトとして処理されます。

ユーザーがログイン・サーバーに対して認証されていない場合、MAFは、ユーザーにもう一度認証するよう求めます。302ステータス・コードを返した場合、ログイン・サーバーは、ユーザーに独自のWebページを使用して認証するよう求めることもあります。このような場合、MAFはリダイレクションをサポートしていないため、かわりにユーザーにもう一度MAFログイン・ページを使用してログインするよう求めます。

27.4.16 基本認証ヘッダーの挿入に関する必知事項

MAFは、基本認証ヘッダーをHTTP要求に挿入して、アプリケーション機能が保護されたリソースにアクセスできるようにします。

MAFでは、Webビューから発行されたHTTPリクエストに基本認証ヘッダーを挿入することで、アプリケーション機能からセキュア・リソースにアクセスできます。これは、リモートのWebリソースが基本認証によって保護されており、認証に対してCookieが十分でないか、サーバーがCookieをまったく受け付けない状況に便利です。「MAFログイン接続の作成」ダイアログの「認可」タブにある「レルム」入力フィールドにリクエスト・レルムを指定します(開発時に把握している場合)。デプロイメント時に判明していない場合、実行時にAdfmfJavaUtilities.overrideConnectionPropertyを使用してリクエスト・レルムを変更できます。

次の例は、「レルム」入力フィールド(realm要素)に値を指定する場合のconnections.xmlファイルに表示されるエントリを示しています。

<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="connection1"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="connection1"
partial="false" manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className=
"oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://www.us.example.com/userInfo"/>
<logout url="http://www.us.example.com/userInfo"/>
<accessControl url="http://10.0.0.0/identity/authorize"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<cookieNames/>
<realm value="Secure Area"/>
<userObjectFilter/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

27.4.17 Webサービス・セキュリティに関する必知事項

Webサービスにはログイン・ページがありませんが、MAFはアクセスに必要とされる資格証明をWebサービス・コールのヘッダーに挿入します。挿入される資格証明は、認証サーバーへのログインに使用された後でMAFによって永続化された資格証明です。

Webサービスでは、ログイン・ページはなく、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービス・コールのヘッダーに資格証明が挿入されます。Webサービスは、ローカルに格納されている資格証明(ユーザーによる認証サーバーへの最初のログインの成功後、MAFによって保持されている資格証明)を使用してアプリケーション・データにアクセスします。

ローカル資格証明ストアの名前は、ログイン・サーバー接続のadfCredentialStoreKey属性に反映されます(「MAFアプリケーションの接続の作成時に行われる処理」のadfCredentialStoreKey="Connection_1"など)。Webサービスがこの資格証明ストアを使用できるようにするには、REST Webサービス接続のadfCredentialStoreKey属性に対して定義されている名前が、ログイン・サーバーのadfCredentialStoreKey属性に対して定義されている名前と一致する必要があります。connections.xmlファイルのadfCredentialStoreKey属性またはログイン接続名を編集する場合は、値を互いに同じに設定してください。同じ値を維持しないと、MAF実行時例外が発生します。

注意:

connections.xmlファイルの概要エディタが存在しないため、「プロパティ」ウィンドウを使用して、<Reference>要素のadfcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新してください。または、「ソース」エディタを使用して属性を追加または更新できます。

「資格証明の挿入に関する必知事項」を参照してください。

27.4.18 アクセス制御の構成方法

アプリケーションに保護対象のコンポーネントが含まれている場合は、そのコンポーネントがアクセス制御サービスを実装してホストするように構成します。タスク内の手順に従ってアクセス制御を構成し、ユーザーに許可したアプリケーション機能のみが使用可能になるようにします。

アクセス制御サービス(ACS)は、JSONを使用したRESTful Webサービスであり、オプションでMAFアプリケーションとは別の外部サーバー上にデプロイすることができます。通常は、アプリケーション機能に保護されたコンポーネントが含まれている場合に、ユーザーが単一のHTTP POSTメッセージを介して自身のユーザー・ロールと権限をダウンロードできるよう、MAFアプリケーションにACSサービスを提供します。このサービスをアプリケーションに提供する場合は、ACSサービスを実装してホストする必要があります(MAでは、このサービスは提供されません)。図27-14は、「MAFログイン接続の作成」ダイアログの「認可」ページを示したもので、このページを使用してMAFアプリケーションのアクセス制御を構成します。

図27-14 アクセス制御の構成

アプリケーション・ログイン・サーバーによって付与されるアクセス制御は、「ユーザー制約とアクセス制御について」で説明されているように、アプリケーション機能用に構成されたuser.rolesおよびuser.privilegesの制約の評価に基づいています。たとえば、アプリケーション機能へのアクセスをmanager_roleロールを持つユーザーのみに許可するには、次のようにmaf-feature.xmlファイルで<adfmf:constraints>要素を定義する必要があります。

<adfmf:constraint property="user.roles"
operator="contains"
value="manager_role"/>
</adfmf:constraints>

アプリケーションの起動時、アプリケーション・ログイン・サーバー接続のために、アクセス制御サービス(ACS)として知られているRESTful Webサービスが呼び出され、そのユーザーに割り当てられているロールと権限がフェッチされます。その後、MAFは、アプリケーション・ログイン・サーバー接続に対してログインするようにユーザーに要求します。

MAFは、取得されたユーザー・ロールと権限に照らして各アプリケーション用に構成されている制約を評価し、関連付けられているすべての制約を満たすユーザーのみがアプリケーション機能を使用できるようにします。

アクセス制御を構成するには:

1. 「MAFログイン接続の作成」ダイアログで、「認可」タブをクリックします。

「MAFログイン接続の作成」ダイアログを開く方法の詳細は、「MAFログイン接続の作成方法」を参照してください。

2. 図27-14に示すとおり、「認可」ページで、認可要件を完了します。

- レルム: 開発時に把握している場合は、基本認証ヘッダーに追加するリクエスト・レルムを指定します(MAFはこの基本認証ヘッダーをHTTPリクエストに挿入します)。

- アクセス制御サービスURL: アクセス制御サービス(ACS)のエンド・ポイントであるURLを入力します。

- ユーザー・ロールのフィルタ・リスト: アプリケーション機能によってチェックされるユーザー・ロールを入力します。セキュリティ・システムには、数千もの定義済のユーザー・ロールおよび権限が存在する可能性があるため、アプリケーション機能に固有のロールが記載されているマニフェスト(これは、アプリケーション機能の開発者によって提供されます)を使用して、このリストを作成します。

- 権限のフィルタ・リスト: アプリケーション機能によってチェックされる権限を入力します。

27.4.19 アクセス制御サービスに関する必知事項

アクセス制御サービス(ACS)は、ユーザーが単一のHTTP POSTメッセージを介して自身のユーザー・ロールと権限をダウンロードできるようにする、JSONを使用したREST Webサービスです。これは、特定のユーザーのロールまたは権限(あるいはその両方)を戻すリクエスト・メッセージです。

必要なロールと権限のリストを提供することで、特定のロールと権限を戻すこともできます。リクエスト・メッセージは、次のもので構成されています。

- リクエスト・ヘッダー・フィールド: If-Match、Accept-Language、User-Agent、Authorization、Content-Type、Content Length。

- リクエスト・メッセージ本文(ユーザー情報のリクエスト)。

- 次のものが含まれている、リクエストされたJSONオブジェクト:

- userId: ユーザーID。

- filterMask: ユーザー・ロールと権限のいずれのフィルタを使用する必要があるのかを判断するために使用される"role"要素と"privilege"要素の組合せ。

- roleFilter: ユーザー情報をフィルタ処理するために使用されるロールのリスト。

- privilegeFilter: ユーザー情報をフィルタ処理するために使用される権限のリスト。

注意:

すべてのロールを戻す必要がある場合は、filterMask配列に"role"要素を含めないでください。

すべての権限を戻す必要がある場合は、filterMask配列に"privilege"要素を含めないでください。

次の例は、HTTP POSTメッセージを示しています。この例では、JSONオブジェクトをペイロードとして識別し、John Smithというユーザーに割り当てられているすべてのフィルタとロールをリクエストします。

Protocol: POST
Authoization: Basic xxxxxxxxxxxx
Content-Type: application/json

{
"userId": "johnsmith",
"filterMask": ["role", "privilege"],
"roleFilter": [ "role1", "role2" ],
"privilegeFilter": ["priv1", "priv2", "priv3"]
}

レスポンスは、次のもので構成されています。

- 次のフィールドを持つレスポンス・ヘッダー: Last-Modified、Content-TypeおよびContent-Length。

- ユーザー情報の詳細を含むレスポンス・メッセージ本文。

- 戻されるJSONオブジェクト。これには次のものが含まれます。

- userId: ユーザーのID。

- roles: ユーザー・ロールのリスト。これは、リクエスト内のroleFilter配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられているロールのリスト全体が戻されます。

- privileges: ユーザーの権限のリスト。これは、リクエスト内のprivilegeFilter配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられている権限のリスト全体が戻されます。

次の例は、ユーザーJohn Smithに割り当てられたユーザー名およびロールと権限を含む、戻されるJSONオブジェクトを示します。

Content-Type: application/json

{
"userId": "johnsmith",
"roles": [ "role1" ],
"privileges": ["priv1", "priv3"]
}

注意:

「資格証明の挿入に関する必知事項」で説明しているように、Webサービスでは、ログイン・ページはなく、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービスのヘッダーに自動的に資格証明が追加されます。

ACSサービスを実装してホストする必要があり、MAFでは、このサービスは提供されません。

27.4.20 アプリケーションのロード順の変更方法

MAFは、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オブジェクトとして戻されます(「基本認証ヘッダーの挿入に関する必知事項」を参照)。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リファレンスを参照してください。

27.4.21 認証前にログイン資格証明をプログラムで構成する方法

oracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスのOverrideConnectionHandler APIを使用すると、MAFアプリケーションがユーザー認証のためにログイン接続を起動する前に、接続値をプログラムで設定できます。タスク内の手順に従って、接続値をプログラムでオーバーライドします。

MAFアプリケーションがログイン接続を起動してユーザーを認証する前に、接続値をプログラムで設定できます。この方法は通常、「MAFログイン接続の作成」ダイアログでカスタム・ヘッダー名を定義し、値は実行時に指定する場合に必要になります。接続の詳細をプログラムで構成するために、MAFアプリケーションでは、oracle.adfmf.framework.api.AdfmfJavaUtilitiesクラスのOverrideConnectionHandler APIを起動できます。このAPIは、現在の接続プロパティを新しい値でオーバーライドし、オーバーライドされた値でアプリケーションがログインを開始できます。

接続値をプログラムでオーバーライドするには、次の一般的なプロセスが必要です。

1. オーバーライドするプロパティを定義するXML要素の名前をconnections.xmlファイルから取得する。

2. 認証の前にオーバーライド値を取得する。たとえば、MAFアプリケーションでは、この目的のために、ユーザーに値の入力を要求するようにAMXページを定義できます。

3. オーバーライド・メソッドを実装するマネージドBeanを起動し(接続プロパティのオーバーライドごとに1つ)、ゲッター・メソッドとセッター・メソッドを定義する。たとえば、AMXページの場合、ユーザーがコマンド・ボタンをクリックすると、そのユーザーの入力値がマネージドBean上で送信されます。

接続プロパティのオーバーライドを指定するには、connections.xmlファイルを調べて、次のXML要素の定義を取得します。

- 接続参照名。たとえば、ConnWithCustomHeaderです。

- オーバーライドする属性を定義するプロパティのXML要素名。たとえば、テナント・ドメイン名の伝播に使用されるスキームのmultiTenantSchemeです。

- オーバーライドするプロパティの属性を定義するXMLサブ要素名。一意の接続プロパティの場合は、常にvalue要素になります。

注意:

カスタム・ヘッダー定義では、同じ要素名を使用して値を指定するため、カスタム・ヘッダーの場合は、XML要素headerおよびvalueを使用しないでください。かわりに、カスタム・ヘッダーにはContents、プロパティおよび属性にはcustomAuthHeadersを使用して、オーバーライド・メソッドにそれぞれ渡してください。

XML要素名の取得

たとえば、カスタム・ヘッダーの値をオーバーライドするには、次のconnections.xmlファイルで、接続名のConnWithCustomHeader、Contents要素およびcustomAuthHeadersサブ要素(ヘッダー名/値のペアの定義)を渡します。

package mobile;

<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="ConnWithCustomHeader"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="ConnWithCustomHeader" partial="false"
manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
...
<isMultiTenantAware value="true"/>
<multiTenantScheme value="custom_header"/>
<multiTenantHeaderName value="X-ID-TENANT-NAME"/>
<customAuthHeaders>
<header name="State" value="Georgia"/>
<header name="City" value="Atlanta"/>
</customAuthHeaders>
...
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

オーバーライド値の取得

実行時に接続値のオーバーライドを実行するために、MAFアプリケーションは、値および値を送信するコマンドボタンのプロンプトでAMXページを起動する、デフォルトの保護されていない機能で値を求める場合があります。次のサンプルは、マネージドBeanのオーバーライド・メソッドをトリガーするアクション・リスナーを定義するコマンドボタンを示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText value="Home" id="ot1"/>
</amx:facet>
<amx:facet name="primary">
<amx:commandButton id="cb1"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="cb2"/>
</amx:facet>
<amx:inputText label="Name1" id="it1" value="#{applicationScope.OverrideBean.headerName1}"/>
<amx:inputText label="Value1" id="it2" value="#{applicationScope.OverrideBean.headerValue1}"/>
<amx:inputText label="Name2" id="it3" value="#{applicationScope.OverrideBean.headerName2}"/>
<amx:inputText label="Value1" id="it4" value="#{applicationScope.OverrideBean.headerValue2}"/>
<amx:inputText label="TenantHeader" id="it5"
value="#{applicationScope.TestBean.tenantHeaderName}"/>
<amx:inputText label="Scheme" id="it6" value="#{applicationScope.OverrideBean.scheme}"/>
<amx:commandButton text="Override headers" id="cb3"
actionListener="#{OverrideBean.overrideAndGotoOverrideFeature}"/>
</amx:panelPage>
</amx:view>

接続プロパティのオーバーライド

接続プロパティの値をプログラムでオーバーライドするために、マネージドBeanでは、接続プロパティのオーバーライドごとにオーバーライド・メソッドを実装します。次の例では、headers HashMapを作成してカスタム・ヘッダー値を渡します。他のプロパティの値(MultiTenantHeaderNameなど)は、connections.xml定義のXML要素によって一意に定義されるため、マップが必要になるのは、オーバーライドするカスタム・ヘッダーの場合のみです。

package mobile;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;

import java.util.HashMap;

public class OverrideBean {

private String headerName1 = "", headerName2 = "", headerValue1 = "", headerValue2 = "";
private String tenantHeaderName = "";
private String scheme = "";

// Bean setter and getter methods omitted for brevity
...

// Command button action listener invokes override method implementation
public void overrideAndGotoOverrideFeature(ActionEvent e) {
overrideAndGotoOverrideFeature();
}

// Override method implementation configures custom headers and other connection properties
public void overrideAndGotoOverrideFeature()
{
AdfmfJavaUtilities.clearSecurityConfigOverrides("ConnWithCustomHeader");
HashMap<String, String> headers = new HashMap<String, String>();
headers.put(headerName1, headerValue1);
headers.put(headerName2, headerValue2);
AdfmfJavaUtilities.overrideConnectionProperty("ConnWithCustomHeader", "Contents",
"customAuthHeaders", headers);
AdfmfJavaUtilities.overrideConnectionProperty("ConnWithCustomHeader",
"multiTenantHeaderName", "value",
tenantHeaderName);
AdfmfJavaUtilities.overrideConnectionProperty("ConnWithCustomHeader", "multiTenantScheme",
"value", scheme);
AdfmfJavaUtilities.updateApplicationInformation(false);

}

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}
}

27.5 MAFアプリケーションのセキュリティの構成

maf-feature.xmlファイルとmaf-application.xmlファイルの概要エディタ、および「MAFログイン接続の作成」ダイアログを使用して、MAFアプリケーションのセキュリティを構成します。

maf-feature.xmlとmaf-application.xmlファイルの概要エディタ、および「MAFログイン接続の作成」ダイアログを使用して、セキュリティを構成します。概要エディタを使用すると、認証を必要とするアプリケーション機能をユーザーが選択したときにMAFによって表示されるログイン・ページのタイプ(デフォルトまたはカスタム)を指定したり、ユーザー・ロールまたはユーザー権限ベースの制約を含めることができます。また、セキュリティが必要な埋込みアプリケーション機能を選択することもできます。

27.5.1 認証を要求するようにアプリケーション機能を設定する方法

セキュリティが適用されるように各アプリケーション機能を定義できます。セキュリティ構成は、maf-application.xmlの概要エディタの「セキュリティ」ページを使用して実行します。

図27-15に示されているmaf-feature.xml概要エディタでは、セキュリティを適用するアプリケーション機能を指定できます。

図27-15 アプリケーション機能に対するユーザー資格証明オプションの指定

始める前に:

機能のセキュリティを有効化すると、アプリケーションは、ネットワークにアクセスしてユーザーを認証する必要があります。ネットワーク・ソケットへのアプリケーション・アクセス権の付与の詳細は、「MAFアプリケーションでのコア・プラグインの有効化」を参照してください。

アプリケーション機能に対するユーザー・アクセスを指定するには:

1. ナビゲータのユーザー・インタフェース・プロジェクトで、「アプリケーション・ソース」および「META-INF」フォルダ・ノードを開いてから、maf-feature.xmlをダブルクリックします。

2. maf-feature.xmlファイルの概要エディタで、「機能」表にリストされているアプリケーション機能を選択するか、または「追加」をクリックしてアプリケーション機能を追加します。

3. ログインが必要なすべてのアプリケーション機能に「セキュリティ有効化」を選択します。

ヒント:

このオプションをデフォルトのアプリケーションに適用しない場合、ユーザーは匿名で(つまり、ログイン資格証明を入力せずに)ログインできます。ユーザーは、保護されていないデータおよび機能にアクセスでき、要求があった場合にはログインします(認証されたユーザーは、保護されているデータと保護されていないデータの両方にアクセスできます)。MAFアプリケーション内に保護されていないアプリケーション機能を提供すると、ユーザーは保護されているアプリケーション機能からログアウトするが、アプリケーション自体に残って、保護されていないアプリケーション機能とデータの両方に引き続きアクセスできます。

27.5.2 ログイン・ページの指定方法

アプリケーション機能にセキュリティを定義したら、maf-application.xml概要エディタの「セキュリティ」ページを使用して、ログイン・ページの構成、ログイン・サーバーへの接続の作成、およびセキュリティが有効化されたアプリケーション機能への接続の割当てを実行します。タスク内の手順に従って、ログイン・ページを指定します。

アプリケーション機能のセキュリティを指定したら、図27-16に示されているmaf-application.xml概要エディタの「セキュリティ」ページを使用して、セキュリティが適用される各アプリケーション機能に対して、ログイン・ページの構成およびログイン・サーバーへの接続の作成と割当てを行います。このページにリストされているすべてのアプリケーション機能は、maf-feature.xmlファイルで、セキュリティが必要なものとして指定されています。

通常、アプリケーション機能のグループは、同じログイン・サーバー接続で保護され、ユーザーは、MAFから再度ログインを求められることなく、これらのアプリケーションをどれでも開くことが可能です。ただし、場合によっては、あるアプリケーション機能のセットを保護しているログイン・サーバーと、別のアプリケーション機能のセットを保護しているログイン・サーバーが異なるため、アプリケーション機能で要求される資格証明がそれぞれ異なる可能性があります。このような状況に対応するために、MAFアプリケーション用のログイン・サーバーへの接続をいくつも定義できます。maf-application.xmlファイルでは、機能参照に関連付けられている認証サーバー接続は、次のようにloginConnRefId属性を使用して指定されます。

<adfmf:featureReference refId="feature1" loginConnRefId="BasicAuthentication"/>
<adfmf:featureReference refId="feature2" loginConnRefId="WebSSO"/>

MAFアプリケーションは、HTTPまたはHTTPS経由のBasic認証をサポートしている標準のログイン・サーバーなら、どのログイン・サーバーに対しても認証を受けることが可能です。MAFはまた、Oracle Identity Managementに対する認証もサポートしています。特定のアプリケーション機能用のカスタム・ログイン・ページを選択することもできます。「ログイン・ページに関する必知事項」を参照してください。

注意:

デフォルトでは、保護されているすべてのアプリケーション機能が同じ接続を共有します。この接続は、図27-16に示されているように、<application login server>と表示されます。「機能参照」の「プロパティ」ウィンドウには、このデフォルト・オプションが「ログイン・サーバー接続」ドロップダウン・メニューに<default> (application login server)と表示されます。「MAFログイン接続の作成」ダイアログを使用して、MAFアプリケーション用に定義されている他の接続を選択できます。

図27-16 maf-application.xmlの概要エディタの「セキュリティ」ページ

始める前に:

MAFアプリケーションでカスタム・ログイン・ページを使用する場合は、アプリケーション・コントローラ・プロジェクトのpublic_htmlディレクトリ(JDeveloper\mywork\Application\ApplicationController\public_html)にファイルを追加して、図27-17に示されているように「アプリケーション・ナビゲータ」の「Webコンテンツ」ノードからそれを使用できるようにします。「カスタム・ログインHTMLページの作成方法」および「外部リソースの選択に関する必知事項」も参照してください。

「ユーザー制約とアクセス制御について」の説明に従って、ユーザー権限とロール用の制約を追加します。

アクセス制御サービス(ACS)・サーバーをプロビジョニングします。「アクセス制御サービスに関する必知事項」を参照してください。

図27-17 カスタム・ログイン・ページの追加

ログイン・ページを指定するには:

1. ナビゲータで、「アプリケーション・リソース」パネルを開き、「ディスクリプタ」および「ADF META-INF」フォルダ・ノードを開いて、maf-application.xmlをダブルクリックします。

2. maf-application.xmlファイルの概要エディタで、「セキュリティ」ナビゲーション・タブをクリックします。

3. 「セキュリティ」ページで、ログイン・ページのタイプを指定します。

- ユーザー名およびパスワードを受け入れるビューとして、「ログイン・ページ」を選択します。

4. 次のように、選択したログイン・ページのコンテンツ(またはユーザー・インタフェース)を選択します。

- デフォルト: 選択されたすべての埋込みアプリケーション機能で使用されるデフォルト・ログイン・ページ。「デフォルト・ログイン・ページ」を参照してください。デフォルトのログイン・ページは、MAFによって提供されます。

- 「カスタム」: 「参照」をクリックして、アプリケーション・コントローラ・プロジェクト内のファイルのパスの場所を検索します。または、「新規」をクリックして、ログイン・ページのカスタムHTMLページをアプリケーション・コントローラ・プロジェクト内に作成します。「カスタム・ログイン・ページ」および「カスタム・ログインHTMLページの作成方法」を参照してください。

ヒント:

「参照」機能を使用してログイン・ページの場所を検索するのではなく、「アプリケーション・ナビゲータ」からログイン・ページをフィールドにドラッグできます。

27.5.3 カスタム・ログインHTMLページの作成方法

デフォルトのログイン・ページadf.login.htmlと、MAFのデプロイメントによってwwwディレクトリに生成されるアーティファクトを変更することで、カスタム・ログイン・ページを作成します。タスク内の手順に従って、カスタム・ログイン・ページを作成し、その場所を取得します。

MAFのデプロイメントによってwwwディレクトリ内に生成されるアーティファクトであるデフォルトのログイン・ページ(adf.login.html)を変更すると、カスタム・ログイン・ページを作成できます。

始める前に:

wwwディレクトリ内のログイン・ページにアクセスするには、MAFアプリケーションをデプロイした後、deployディレクトリに移動します。iOSデプロイメントの場合、ページは次の場所にあります。

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/adf.login.html

Androidデプロイメントの場合、ページは、次の場所にあるAndroidアプリケーション・パッケージ(.apk)ファイル内に配置されます。

application workspace directory/application name/deploy/deployment profile name/deployment profile name.apk/assets/www/adf.login.html

カスタム・ログイン・ページを作成するには:

1. デフォルト・ログイン・ページを、ユーザー・インタフェース・プロジェクトのpublic_htmlディレクトリ(JDeveloper\mywork\application name\ApplicationController\public_htmlなど)内にコピーします。

2. ログイン・ページの名前を変更します。

3. ページを更新します。

4. maf-application.xmlファイルの概要エディタの「セキュリティ」ページで、「カスタム」を選択し、「参照」をクリックしてログイン・ページの場所を検索します。

27.5.4 ログイン・ページに関する必知事項

MAFに登録した機能がアクティブ化されると、ログイン・プロセスが実行されます。認証の成功時に、ログイン・ページは指定された宛先を取得して、その宛先に移動します。

アプリケーション機能の認証プロセスのエントリ・ポイントは、「MAFアプリケーションでのライフサイクル・リスナーの使用方法」で説明されているactivateライフサイクル・イベントです。アプリケーション機能がアクティブになる(つまり、アプリケーション機能のactivateイベント・ハンドラがコールされる)たびに、アプリケーション機能のログイン・プロセスが実行されます。このプロセスは、ログイン・ページ(デフォルトまたはカスタムのログイン・ページのいずれか)に移動し、そこでユーザー認証が必要かどうかを判断します。ただし、プロセスがログイン・ページに移動する前に、本来意図されていたアプリケーション機能をMAFに登録する必要があります。認証が成功すると、ログイン・ページは、MAFから本来意図されていた宛先を取得し、そこに移動します。

組込みCordovaサポートを使用して、ログイン・ページからリソース・バンドルなどのJavaクラスまたはリソースを使用する場合は、ApplicationControllerプロジェクトにこれらのクラスおよびリソースを配置する必要があります。

27.5.4.1 デフォルト・ログイン・ページ

MAFが提示するデフォルトのログイン・ページは、HTMLで記述されたクロス・プラットフォームのページです。このページには、資格証明用のフィールドが含まれています。

MAFによって提供されるデフォルトのログイン・ページは、ログイン・ボタンと、ユーザー名とパスワード用の入力テキスト・フィールド、マルチテナント名(オプション)、およびエラー・メッセージ・セクションから構成されます。これは、HTMLで記述されたクロス・プラットフォーム・ページです。図27-18は、デザインタイムでマルチテナント対応オプションを有効にしたデフォルトのログイン・ページを示し、このページでは、ユーザー名とパスワードの他、テナントのドメイン名の入力が要求されます。

図27-18 マルチテナント・ドメイン・フィールドを備えたデフォルトのログイン・ページ

27.5.4.2 カスタム・ログイン・ページ

カスタム・ログイン・ページには、デフォルトのログイン・ページと同じ認証メカニズムとナビゲーション・コントロールが含まれています。カスタム・ログイン・ページが追加されると、JDeveloperは<adfmf:login>要素を追加して、その子要素の<adfmf:LocalHTML>を移入します。

maf-application.xmlファイルの概要エディタを使用して、選択したアプリケーション機能用のカスタム・ログイン・ページを追加すると、JDeveloperは、次の例に示されているように、<adfmf:login>要素を追加し、その子要素<adfmf:LocalHTML>を設定します。すべての<adfmf:LocalHTML>要素と同様に、そのurl属性は、public_htmlディレクトリ内の場所を参照します。ユーザー認証メカニズムとナビゲーション・コントロールは、デフォルトのログイン・ページと同じものになります。

<adfmf:login defaultConnRefId="Connection_1">
<adfmf:localHTML url="newlogin.html"/>
</adfmf:login>

カスタム・ログイン・ページはHTMLで記述されています。ログイン・ページのフィールドには、具体的に定義された<input>要素および<label>要素を含める必要があります。

ヒント:

カスタム・ログイン・ページを作成するためのガイドとしてMAFアプリケーションのデプロイ時に生成されたデフォルトのログイン・ページを使用します。「カスタム・ログインHTMLページの作成方法」で説明されているように、wwwディレクトリ内のログイン・ページにアクセスするには、MAFアプリケーションをデプロイした後、deployディレクトリに移動します。

次の例は、デフォルト・ログイン・ページに必要な<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"/>

第27.5.5項 ログイン・ページ要素に関する必知事項

各HTMLログイン・ページに、表27-2にリストされたユーザー・インタフェース要素が含まれている必要があります。

表27-2 ログイン・ページのフィールドおよび関連するID

ページ要素

ID

ユーザー名フィールド

oracle_access_user_id

パスワード・フィールド

oracle_access_pwd_id

ログイン・ボタン

oracle_access_submit_id

取消ボタン

oracle_access_cancel_id

「Identityドメイン」/「テナント名」フィールド

oracle_access_iddomain_id

エラー・フィールド

oracle_access_error_id

自動ログイン・チェック・ボックス

oracle_access_auto_login_id

資格証明記憶チェック・ボックス

oracle_access_remember_credentials_id

ユーザー名記憶チェック・ボックス

oracle_access_remember_username_id

表27-3は、OnClickイベントで使用される推奨のJavaScriptコードをリストしています。

表27-3 OnClickイベントで使用されるJavaScript

ボタン

JavaScript

ログイン・ボタン

oracle_access_sendParams(this.id)

取消ボタン

oracle_access_sendParams(this.id)

27.5.6 アプリケーション機能用セキュリティの構成時のJDeveloperでの処理

セキュリティが有効化されたアプリケーションごとに、JDeveloperは、対応する機能参照を「セキュリティが有効な機能」表に追加します。

セキュリティが適用されるようにアプリケーション機能が指定されると、JDeveloperは、対応する機能参照で「セキュリティが有効な機能」の表を更新します。参照される各アプリケーション機能が、connections.xmlファイル内に定義されている同じログイン・サーバー接続に対して認証を行うと、JDeveloperは、defaultConnRefId属性を使用して定義されている単一の<adfmf:login>要素(<adfmf:login defaultConnRefId="Connection_1">など)でmaf-application.xmlファイルを更新します。

connections.xmlファイル内に定義されている別のログイン・サーバー接続を使用するように構成されているアプリケーション機能の場合は、JDeveloperは、参照される各アプリケーション機能をloginConnReference属性(<adfmf:featureReference refId="feature2" loginConnRefId="Connection2"/>)で更新します。「認証を要求するようにアプリケーション機能を設定する方法」を参照してください。Oracle Mobile Application Frameworkタグ・リファレンスも参照してください。

27.6 デバイス機能へのアクセスの許可

デバイス機能へのアクセスは、MAFアプリケーションに組み込まれているCordovaプラグインによって定義されます。MAFで提供されるコア・プラグインの1つを有効にすると、そのアプリケーションに必要なすべてのデバイス・アクセス権限が有効になります。

MAFアプリケーションに組み込まれている他のCordovaプラグインも、必要なデバイス・アクセス権限を有効にします。MAFアプリケーションの大多数ではネットワーク・アクセスが必要なため、ネットワークにアクセスする権限はデフォルトで有効になっています(デフォルトで有効になっている唯一のデバイス機能)。

- ネットワーク情報: アプリケーションによるネットワーク・ソケットのオープンを許可します。少なくとも1つのデバイス機能のセキュリティが有効な場合、ネットワーク・アクセス機能は有効にしておく必要があります。

デバイス機能の有効化または制限が可能なため、デプロイメント・フレームワークによって更新されるプラットフォーム固有の様々な構成ファイルやマニフェスト・ファイルでは、使用中のデバイス機能(または、MAFアプリケーションに使用が登録されているプラグイン)のみがリストされます。これらのファイルにより、MAFはこれらの機能の使用に関する情報を他のアプリケーションと共有できます。たとえば、AppStoreやGoogle Playに対して、MAFアプリケーションで場所ベースの機能が(搭載されていても)使用されていないことを通知できます。

MAFアプリケーション内の選択したアプリケーション機能がネイティブ・コンテナにアクセスすること、および拡張機能によってMAFアプリケーションがデバイス機能にアクセスすることを防止できます。たとえば、自分のMAFアプリケーションに、リモート・コンテンツを参照する、信頼できないWebアプリケーションからのアプリケーション機能が含まれているとします(リモートURLコンテンツのアプリケーション機能)。このシナリオでは、次の例に示すように、この特定のアプリケーション機能がネイティブ・コンテナにアクセスすることを防止します。

<adfmf:featureReference refId="remoteAppfeature1" id="fr1" allowNativeAccess="false"/>

allowNativeAccessプロパティのデフォルト値はtrueです。

MAFアプリケーションのCordovaプラグインの詳細は、「MAFアプリケーションでのプラグインの使用方法」を参照してください。

27.7 ユーザーによるアプリケーション機能からのログアウトの有効化

ユーザーが、保護されているコンテンツを含むアプリケーション機能からログアウトするとき、または制約によって制限されているときは、MAFはアプリケーション機能を終了せず、またユーザーはアプリケーション内でログイン状態を維持し、セキュアでないコンテンツおよび機能に匿名ユーザーとしてアクセスできます。

MAFでは、制約を再初期化できるため、ユーザーは、同じアイデンティティを使用して、アプリケーションに繰り返しログインできます。また、MAFは、ユーザーに別のアイデンティティを使用したログインを許可することで、複数のアイデンティティでアクセスを共有できます。AdfmfJavaUtilitiesクラスのlogoutFeatureメソッドおよびlogoutメソッドにより、ユーザーはアプリケーションの起動後、認証サーバーに対する明示的なログインおよびログアウトを実行できます。さらに、ユーザーは、保護されているアプリケーション機能を呼び出した後、認証サーバーにログインできます。ユーザーは個々のアプリケーション機能からログアウトできますが、同じ接続で保護されているアプリケーション機能から同時にログアウトできます。

これらのメソッドでは、次のような操作を実行できます。

- アプリケーション機能からログアウトし、保護されていないコンテンツへのアクセスを継続します(つまり、MAFはアプリケーションを終了しません)。

- アプリケーション内で、保護されている内容やUIコンポーネントを使用するためにログイン・サーバーで認証します。

- MAFアプリケーションまたはアプリケーション機能からログアウトし、別のアイデンティティを使用して再びログインします。

- MAFアプリケーションまたはアプリケーション機能からログアウトし、ロールと権限が更新された同じアイデンティティを使用して再びログインします。

現在の認証サーバーからログアウトできるようにするには、次のように、AdfmfJavaUtilitiesクラスのlogoutメソッドをコールします。次にその例を示します。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.logout();

keyパラメータに関連付けられた認証サーバーからログインできるようにするには、次のように、logoutFeatureメソッドをコールします。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.logoutFeature(adfCrendentialStorykey);

adfCredentialStorykeyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして戻されます。AdfmfJavaUtiltiesクラスおよびkeyパラメータの使用方法の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

27.8 MAF認証APIの使用方法

MAFには、APIが含まれた様々な認証クラスが用意されており、MAFアプリケーションで認証関連のタスクを行う場合に役立ちます。

これらのAPIは、oracle.maf.api.authenticationパッケージの認証クラスに存在します。たとえば、AuthenticationHandlerクラス、AuthenticationPlatformクラス、AuthenticationUtilityクラスなどがあります。

これらのAPIを実装して実行できるタスクには、ログイン中のユーザーが保護されたアプリケーションにアクセスする前に行う処理などがあります。たとえば、認可ヘッダー情報を取得し、その情報を使用して、エンド・ユーザーがログイン成功時に移動するコンテンツを決定します。AuthenticationPlatformは、エンド・ユーザーが保護されたアプリケーション機能からログアウトしたときになんらかの処理を実行するために実装できるaddLogoutCallback APIも提供します。このコールバックAPIを使用すると、エンド・ユーザーがデバイスを共有しているシナリオで役立つ場合があります。

次の例は、実装クラスからのコードのスニペットを示しており、AuthenticationPlatformのインスタンスはそのgetToken() APIを使用して認可ヘッダー情報を取得します。

例27-1 認証プラットフォームからの認可ヘッダーの取得

import oracle.maf.api.authentication.AuthenticationPlatform;
import oracle.maf.api.authentication.AuthenticationUtility;
…
AuthenticationPlatform ap = AuthenticationUtility.getInstance().lookupByCredentialStoreKey("credentialStoreKey");
String authorization = ap.getToken("Authorization");
…

これらの認証クラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

27.9 SSL用の自己署名証明書を使用するサーバーにアクセスするための証明書の作成

MAFのcacertsファイルにより、信頼できるソースからの証明書を識別することでデプロイメントが可能になります。タスク内の手順に従って、MAFのcacertsファイルにプライベート証明書を追加します。この手順は、自己署名証明書を使用しているサーバーのリソースにアプリケーションがアクセスする必要がある場合や、アプリケーションがカスタムの証明書を必要とする場合に実行します。

MAFは、cacerts証明書ファイル(HTTPSハンドシェークのためのクライアント・アプリケーションおよびサーバー間のJavaメカニズム)を提供します。JDeveloperは、アプリケーション・リソースのSecurityフォルダ内にこのファイルを作成します(JDeveloper\mywork\application name\resources\Security\cacertsにあります)。MAFのcacertsファイルにより、信頼できる既知のソースからの一連の証明書がJVMに対して識別され、デプロイメントが可能になります。

サーバーが自己署名証明書を使用しているサーバー・リソースにアプリケーションがアクセスする必要がある場合は、プライベート証明書をMAFのcacertsファイルに追加する必要があります。アプリケーションでカスタム証明書が必要な場合(RSA暗号化が使用されていない場合など)も、プライベート証明書を追加する必要があります。アプリケーションをデプロイする前に、プライベート証明書を追加します。MAFアプリケーションのユーザーは、「MAFアプリケーションでのSSL証明書のファイル拡張子の登録」で説明するように、証明書のインストールを容易にするようアプリケーションを構成してある場合に証明書をインストールできます。

始める前に:

cacertsファイルの内容を理解しておくと役立ちます。『Oracle Mobile Application Frameworkのインストール』のMAFの新しいSSL用cacertsファイルへの移行に関する項を参照してください。

JDeveloperによるcacertsファイルの作成方法についても理解しておくと役立ちます。「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」を参照してください。

cacertsファイルおよびkeytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

プライベート証明書を追加するには:

1. プライベート証明書を作成します。たとえば、new_certという証明書ファイルを作成します。

2. 次のようにして、プライベート証明書をアプリケーションに追加します。

a. シードされたcacertsファイル(cp cacerts cacerts.org)のコピーを作成します。

b. Java SE keytoolユーティリティを使用して、cacertsファイルに証明書を追加します。次の例は、new_certというcacertsファイルへの単一の資格証明の追加を示しています。

keytool -importcert
-keystore cacerts
-file new_cert
-storepass changeit
-noprompt

各証明書に対して同じ手順を繰り返します。表27-4は、keytoolのオプションを示しています。

表27-4 証明書の追加に関するオプション

オプション

説明

-importcert

証明書をインポートします。

-keystore cacerts file

インポートされた証明書のファイルの場所を特定します。

-file certificate file

新しい証明書を含むファイルを特定します。

-storepass changeit

cacertsファイルのパスワードを提供します。デフォルトでは、パスワードはchangeitです。

-noprompt

証明書を信頼するかどうかを(stdinを介して)ユーザーに確認しないように、keytoolに指示します。

c. 新しいcacertsファイルの内容を目で見て調べて、すべてのフィールドが正しいことを確認します。次のコマンドを使用します。

keytool -list -v -keystore cacerts | more

d. 証明書が指定のホスト名に対するものであることを確認します。

注意:

証明書の共通名(CN)は、ホスト名と正確に一致している必要があります。

e. JVMが読み取れるようにするために、カスタマイズされた証明書ファイルはSecurityディレクトリ(JDeveloper\mywork\application name\resources\Security)に確実に配置してください。

3. アプリケーションをデプロイします。

注意:

デプロイメント時、証明書ファイルがSecurityディレクトリに存在している場合、MAFは、それをAndroidまたはXcodeテンプレート・プロジェクトにコピーし、cacertsファイルのデフォルト・コピーを置き換えます。

4. 保護されているリソースにSSL経由でアクセスできることを確認します。

27.10 MAFアプリケーションでのSSL証明書のファイル拡張子の登録

MAFアプリケーションのエンド・ユーザーは、SSL通信での使用のために、デジタル証明書を自分のアプリケーションのキーストアにインストールできます。これらの証明書のインストールを容易にするために、ファイル拡張子を登録します。

MAFアプリケーションは、デバイス上でファイル拡張子を登録してある唯一のアプリケーションである場合、エンド・ユーザーに配布される証明書ファイル(電子メールの添付ファイルまたはダウンロードURLによって配布される)を開くためにデバイスのオペレーティング・システムがエンド・ユーザーに対して提示するアプリケーションとなります。他のアプリケーションがファイル拡張子を登録している場合、デバイスのオペレーティング・システムはアプリケーションのリストを提示し、エンド・ユーザーはそこからMAFアプリケーションを選択して、自分のアプリケーションのキーストアに証明書をインストールする必要があります。

MAFアプリケーションが実行するサポートされているプラットフォームのバージョンによっては、ファイルがBase64テキスト形式(.PEMなど)で保存されている場合、証明書ファイルをテキスト・ファイルとして扱い、エンド・ユーザーに証明書をインストールするように要求するのではなく、テキスト・ファイルとして開くことがあります。この問題を避けるために、Base64テキスト形式ではなく、バイナリ形式(.DERなど)を使用することをお薦めします。

MAFでは、サーバーSSL証明書およびクライアントSSL証明書の両方のファイル拡張子の登録がサポートされています。ユーザーは、証明書をインストールした後に、MAFアプリケーションの再起動が必要になることがあります。

サーバーSSL証明書の拡張子

サーバーSSL証明書によって、MAFアプリケーションが接続するリモートHTTPSサーバーが識別されます。サーバーSSL証明書のファイル拡張子を登録して、MAFアプリケーションの作成時にMAFによって提供されるcacertsファイル内にない証明書のインストールを容易にします。このシナリオは、MAFアプリケーションが接続するHTTPSサーバーで、ルート認証局で発行された証明書ではなく自己署名による証明書が使用される場合によく起こります。MAFでは、現在、AndroidプラットフォームとiOSプラットフォームにデプロイされたMAFアプリケーションでのサーバーSSL証明書のインストールがサポートされています。これは、ユニバーサルWindowsプラットフォームにデプロイされたMAFアプリケーションではサポートされていません。このプラットフォームの場合は、SSL用の自己署名証明書を使用するサーバーにアクセスするための証明書の作成で説明するように、証明書をMAFアプリケーションのcacertsファイルに追加します。

クライアントSSL証明書の拡張子

クライアント証明書は、リモート・サーバーに対してMAFアプリケーションを識別します。ユーザーに、クライアント証明書をMAFアプリケーションのキーストアにインストールして、双方向SSL、相互認証または双方向認証として知られるプロセスを使用して認証することを可能にする場合に、クライアントSSL証明書の拡張子を登録します。ユーザーがクライアント証明書をインストールすると、MAFアプリケーションはその証明書をサーバーに提示できるため、双方向SSL通信セッションによりクライアントとサーバー間の認証が実行されます。

iOSプラットフォームでは、サード・パーティ製アプリケーションがクライアント証明書のデフォルトの拡張子(.p12)を使用してファイルを開くことが許可されていません。この制限を回避するために、アプリケーション開発者は別の証明書拡張子(.certなど)を登録する必要があります。証明書を配布する管理者は、別の拡張子を使用するようにクライアント証明書の名前を変更して、MAFアプリケーションのユーザーが電子メール添付ファイル、またはクライアント証明書の配布に使用するURLから直接クライアント証明書を開くことができるようにします。

SSL証明書のファイル拡張子の登録方法

証明書のファイル拡張子をアプリケーションに登録するには、maf-application.xmlファイルの概要エディタの「アプリケーション」ページの適切なフィールド(ユース・ケースによって異なる)にそのファイル拡張子を入力します。

双方向SSLを有効にするためにMAFアプリケーションを構成するには:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを展開します。

2. 「アプリケーション・リソース」パネルで「ディスクリプタ」を展開し、「ADF META-INF」を展開します。

3. maf-application.xmlファイルをダブルクリックし、表示される概要エディタで「アプリケーション」ナビゲーション・タブをクリックします。

4. 「アプリケーション」ページで、適切なオプションを選択します。

- 双方向SSLセッションでの使用のためのクライアント証明書のインストールを容易にする場合は、「クライアントSSL証明書の拡張」フィールドにファイル拡張子を入力します。

- MAFアプリケーションでHTTPSサーバーへの接続に使用される、サーバー証明書のインストールを容易にする場合は、「サーバーSSL証明書の拡張」フィールドにファイル拡張子を入力します。

SSL証明書のファイル拡張子の登録時に起こること

入力フィールドに入力した値がJDeveloperによってmaf-application.xmlファイルに書き込まれます(例27-2を参照)。

実行時に、ユーザーは、証明書を管理者が配置した場所からデバイスにダウンロードするか、または電子メール添付ファイルから自動的に開きます。サーバーの場所からのダウンロード動作は、ユーザーのデバイスのオペレーティング・システムによって異なります。たとえば、Androidデバイスを使用するMAFアプリケーション・エンド・ユーザーは、証明書をAndroidのDownloadディレクトリにダウンロードします。ダウンロードすると、ユーザーはMAFアプリケーションのキーストアにインストールするために証明書を抽出します(開きます)。クライアント証明書についてこのステップを完了するには、ユーザーは、クライアント証明書を配布した管理者が提供したパスワードを入力する必要があります。ユーザーがアプリケーションのキーストアに証明書をインストールすると、MAFアプリケーションはその証明書をサーバーに提示して、双方向SSLセッションを確立できます。ユーザーがインストールしたサーバー証明書は、HTTPSサーバーとのSSLセッションを確立するためにMAFで使用できます。

例27-2 maf-application.xmlファイルでの証明書ファイル拡張子

<adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
version="1.0" name="ssltest" id="com.company.ssltest"
appControllerFolder="ApplicationController" listener-class="application.LifeCycleListenerImpl"
client-ssl-certificate-extension="clientcert"
server-ssl-certificate-extension="servercert">
….

28 MAFアプリケーションのテストおよびデバッグ

この章では、MAFアプリケーションのテストおよびデバッグについて説明します。

この章の内容は次のとおりです。

- MAFアプリケーションのテストおよびデバッグの概要

- MAFアプリケーションのテスト

- コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成

- AndroidプラットフォームにデプロイされたMAFアプリケーションのデバッグ

- iOSプラットフォームにデプロイされたMAFアプリケーションのデバッグ

- ユニバーサルWindowsプラットフォームにデプロイされたMAFアプリケーションのデバッグ

- MAFアプリケーションでのロギングの使用および構成

- MAFアプリケーションのパフォーマンス測定

- MAFアプリケーションのパフォーマンス・データの表示

- MAFアプリケーションでのWebサービス・コールの検査

28.1 MAFアプリケーションのテストおよびデバッグの概要

MAFアプリケーションをテストまたはデバッグするには、MAFでサポートされるいずれかのプラットフォーム(Android、iOSまたはユニバーサルWindowsプラットフォーム)上のデバイスに、デバッグ・モードでアプリケーションをデプロイします。

MAFおよび各プラットフォームでは、JDeveloper開発環境を、デバイスまたは仮想デバイス上で実行されるMAFアプリケーションに接続するために使用できるツールが提供されます。たとえば、AndroidデバイスでMAFアプリケーションをテストする場合は、JDeveloperからAndroidデバイスまたはAndroid Virtual Device (AVD)にMAFアプリケーションをデバッグ・モードでデプロイします。ユニバーサルWindowsプラットフォームおよびiOSでも類似のツールが提供されます。

MAFアプリケーションをデバッグするためのおおまかな手順には、次のタスクが含まれます。

1. MAFアプリケーションをテスト環境にデプロイするために使用するデプロイメント・プロファイルを構成して、MAFアプリケーションがデバッグ・モードでデプロイされるようにします。

2. MAFアプリケーションのmaf.propertiesファイルを構成して、デバッグを有効にします。

3. MAFアプリケーションをテスト環境にデプロイします。

4. 実行するデバッグ・タスクに適切なツールを使用します。たとえば、MAFアプリケーションでJavaコードをデバッグする場合は、JDeveloperが提供するツールを使用します。MAFアプリケーションのユーザー・インタフェース(HTML、CSSまたはJavaScript)をレンダリングするコードをデバッグする場合は、各プラットフォームでこのタスクのために提供されているツールを使用します。

MAFにはこの他にも、アプリケーションのテストを支援するための機能が用意されています。これには、アプリケーションのパフォーマンスをモニターする機能や、Oracle Mobile Cloud Serviceに分析および診断情報を送信する機能(アプリケーションがこのサービスからのリソースにアクセスする場合)などがあります。

28.2 MAFアプリケーションのテスト

モバイル・デバイス、エミュレータまたはシミュレータでMAFアプリケーションをテストできます。

MAFアプリケーションをテストするには、次の2つの方法があります。

1. モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。

2. モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。

通常、両方の方法を組み合せて使用することで、最良の結果が得られます。

28.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

iOSデバイス用に開発されたMAFアプリケーションのアクセシビリティをテストするには、次の方法を組み合せて使用してください。

- iOSデバイス・シミュレータ上でアクセシビリティ・インスペクタを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』のVoiceOverを使用したデバイスでのアクセシビリティのテストに関する項を参照してください。

- iOSデバイス上でVoiceOverを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Using VoiceOver to Test Your Application」の項を参照してください。

28.3 コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成

JDeveloperには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してアプリケーションの実行をモニターおよび制御することを可能にするデバッグ・メカニズムが備わっています。

MAFアプリケーションはJDeveloper内部で実行できないため、デバッグの方法が異なります。JDeveloperデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン・インスタンスに接続し、デプロイ済のMAFアプリケーションのJavaの部分を制御します。

MAFでは、デバッグ用にプロジェクト・プロパティが自動的に構成されます。JDeveloperを使用してMAFアプリケーション内のJavaコードをデバッグするために実行する必要のある手順は、次のとおりです。

アプリケーションをテストまたはデバッグするには:

1. JDeveloperのメイン・メニューから、「実行」→「アクティブな実行構成を選択」をクリックして、アクティブな実行構成を選択します。

2. 「アプリケーション」ウィンドウで、テストするファイルを右クリックし、「実行」を選択します。
あるいは、デバッグを有効にした状態でアプリケーションを実行する場合は、「デバッグ」を選択します。

ヒント:

「ソース」ビューでMAFアプリケーションのファイルを開き、右クリックして、「実行」または「デバッグ」を選択します。

注意:

事前定義済の実行構成セットを持たない既存のアプリケーションを使用する場合は、新しい実行構成を作成します。

「デバッグ構成に関する必知事項」を参照してください。

28.3.1 デバッグ構成に関する必知事項

新しいMAFアプリケーションを作成する場合、作成ウィザードでは、デバッグ用にアプリケーション・プロパティが自動的に構成されます。これには、iOSシミュレータまたはAndroidエミュレータやデバイスでMAFアプリケーションの実行またはデバッグを行うために使用できるデフォルトの実行構成の作成が含まれます。これらの実行構成では、JDeveloperの「実行」または「デバッグ」ボタンをクリックすると、MAFアプリケーションの構築、デプロイ、実行またはデバッグができます。JDeveloperの「実行」または「デバッグ」ボタンをクリックし、MAF実行構成を選択すると、実行構成に関連付けられたデプロイメント・プロファイルが実行され、アプリケーションが構築されてターゲット・デバイスにデプロイされます。アプリケーションはデプロイされると、自動的に起動します。「デバッグ」ボタンを選択すると、アプリケーションがデバッガとともに起動します。

実行構成の作成および編集方法の詳細は、「実行構成の作成と構成」を参照してください。

28.3.1.1 実行構成の作成と構成

新しい構成を作成するか、既存の構成を変更するには、次のように「実行構成の編集」ダイアログに入力します(図28-1を参照)。

1. JDeveloperのメイン・メニューで、「アプリケーション」→「プロジェクト・プロパティ」をクリックして、「プロジェクト・プロパティ」ダイアログを開きます。

2. 「プロジェクト・プロパティ」ダイアログで、左側のツリーから「実行/デバッグ」ノードを選択します。

あるいは、「実行」→「アクティブな実行構成を選択」→「実行構成の管理」を選択します。

3. 新しい実行構成を作成するか、既存の実行構成を変更します。

共有設定を使用する場合、「共有設定の編集」をクリックして、新しいMAF実行構成の作成または編集ができるダイアログを開きます。「プロジェクトの設定」を使用する場合は、「新規作成」または「編集」をクリックします。共有設定の場合、実行構成はすべてのプロジェクトで共有されます。「共有設定の使用」はデフォルトのオプションであり、この場合、プロジェクトの追加時に存在するMAF実行構成を使用できます。

4. 「実行構成の編集」ダイアログで、次のように入力します。

- 左側のツリーから「モバイル実行構成」を選択します。

- ターゲット・プラットフォームを選択します。

- デプロイメント・プロファイルを選択します。

- 最大5桁の長さでポート番号を入力します。この数字は、当初はmaf.propertiesファイルに含まれているjava.debug.port propertyの値によってシードされ、ヒント・テキストとして表示されます。ポートに値が指定されていない場合は、シードされた値が使用されます。

- iOSの場合、次のオプションを設定します。

- 「アプリケーション引数」: アプリケーションの実行時の動作をカスタマイズするために、起動時のMAFアプリケーションに渡すことができる引数を入力します。たとえば、-consoleRedirect=/<path>/<to>/log.txtでは、指定されたファイルにログが出力されます。ログ・ファイルを取得するには、パスは絶対パスである必要があります。場所は、現在のユーザーにとって書込み可能である必要があります。

- 「シミュレータ」: アプリケーションをデプロイする先のシミュレータを選択します。オプションは、インストールされているiOS SDKのバージョンによって異なります。

- 「iOSバージョン」: シミュレータが使用するiOSのバージョンを選択します。ドロップダウン・メニューには、選択したデバイスがサポートしているiOSのバージョンが表示されます。

- Androidの場合、次のオプションを設定します。

- 「ターゲット」: デプロイメント・ターゲット(「エミュレータ」または「デバイス」)を選択します。

- 「最大試行回数」: 許可する接続試行の最大回数を選択します。

- 「間隔」(秒): 接続試行間の間隔の長さを秒単位で選択します。

ヒント:

Androidデバイスまたはエミュレータの動作が遅いか、またはタイムアウトになる場合、「最大試行回数」または「間隔」を増やして、Javaが初期化し、Androidスターターを強制的に長く待機させるために十分な時間を確保するか、終了する前に試行を増やしてください。

図28-1 「モバイル実行構成」ダイアログ

28.3.2 JavaコードおよびJavaScriptのデバッグを有効にする方法

maf.propertiesファイルでは、JVMの起動パラメータおよびMAFのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。maf.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置されます(「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>/src/META-INFの場所に対応しています。

MAF実行構成を実行すると、maf.propertiesファイルに次のデバッグ・プロパティが自動的に設定されます。

- java.debug.enabled: デバッグ・セッションを行う場合はtrueに設定し、実行セッションを行う場合はfalseに設定します。

注意:

java.debug.enabledがtrueに設定されている場合、JVMは、デバッガが接続を確立するのを待ちます。デバッガが接続に失敗すると、MAF AMXアプリケーション機能のロードが失敗します。

- java.debug.port: 実行対象のMAF実行構成で構成されているポート番号に設定します。

- javascript.debug.enabled: デバッグ・セッションを行う場合はtrueに設定し、実行セッションを行う場合はfalseに設定します。Androidにのみ適用されます。

注意:

iOSシミュレータまたはiOSデバイスでMAFアプリケーションが実行されている場合、JavaScriptデバッグを有効にするためにはjavascript.debug.enabledプロパティは必要ありません。

maf.propertiesファイルの内容は、次のようなものです。

java.debug.enabled=true
java.debug.port=8000

javascript.debug.enabled=true

JDeveloperを使用してJavaコードをデバッグする方法については、「MAFアプリケーションのデバッグ」を参照してください。

28.3.3 MAF AMXコンテンツのデバッグ方法

MAFアプリケーションにMAF AMXコンテンツが含まれている場合は、デバイスまたはエミュレータの構成後、JDeveloperの他のアプリケーションをデバッグするときと同じように、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックのインスペクトを行うことができます。

注意:

デバッグできるのは、JavaコードおよびJavaScriptのみです(「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。

28.4 AndroidプラットフォームにデプロイされたMAFアプリケーションのデバッグ

AndroidにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。

Javaコードをデバッグするには、アプリケーションでmaf.propertiesファイルを構成し、JDeveloperで実行構成を作成します。これらのタスクの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」および「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」を参照してください。これらのタスクを完了したら、「AndroidプラットフォームでのJavaコードのデバッグ方法」の説明に従って、MAFアプリケーションをデバッグ・モードでデプロイし、Javaコードをデバッグできます。

UIコード(JavaScript、HTMLおよびCSS)をデバッグするには、アプリケーションでmaf.propertiesファイルを構成します(javascript.debug.enabled=true)。このタスクを完了したら、「AndroidプラットフォームでのUIコードのデバッグ方法」の説明に従って、UIコードをデバッグできます。

28.4.1 AndroidプラットフォームでのJavaコードのデバッグ方法

AndroidプラットフォームでMAFアプリケーションのJavaコードをデバッグするには、「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」で説明されているデバッグ手順に従います。

Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、「AndroidエミュレータへのAndroidアプリケーションのデプロイ方法」を参照してください。

Androidデバイスまたはエミュレータで実行中のMAFアプリケーションのデバッグを可能にするには、「MAFアプリケーションでのプラグインの使用方法の概要」の説明に従って、ネットワーク情報プラグインが有効であることを確認します

28.4.2 AndroidプラットフォームでのUIコードのデバッグ方法

MAFアプリケーションを開発する際、Androidデバイスでアプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。開発マシンからAndroidデバイスにMAFアプリケーションをデプロイするときに、GoogleのChrome DevToolsを使用して、このコードをデバッグできます。図28-2に、MAFアプリケーションからのAMXページを調べるChrome DevToolsを示します。

図28-2 MAFアプリケーションからのAMXページを調べるChrome DevTools

使用するための要件を含む、Chrome DevToolsの詳細は、Google DevelopersのサイトでChrome DevToolsを使用したAndroidでのリモート・デバッグに関する項を参照してください。

Oracle Mobile Platform YouTubeチャンネルの「Android上のOracle MAFアプリケーションでのHTMLのデバッグ」ビデオで、AndroidでUIコードをデバッグする方法の概要も参照してください。後者のビデオではcvm.propertiesファイルに言及していることに注意してください。このファイルは、現在のリリースではmaf.propertiesに名前が変更されています。

AndroidデバイスにMAFアプリケーションをデプロイしてUIコードをデバッグするには、次のことを実行する必要があります。

- maf.propertiesファイルを構成して、javascript.debug.enabled=trueというエントリを含めます。 maf.propertiesファイルの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

- デバッグ・モードでデプロイします。「MAFアプリケーションのデプロイ」を参照してください。

28.5 iOSプラットフォームにデプロイされたMAFアプリケーションのデバッグ

iOSにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。

Javaコードをデバッグするには、その前に、アプリケーションでmaf.propertiesファイルを構成し、JDeveloperで実行構成を作成します。これらのタスクの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」および「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」を参照してください。これらのタスクを完了したら、アプリケーションをiOSデバイスにデバッグ・モードでデプロイして、Javaコードをデバッグできます。デバッグ・モードでのデプロイ方法の詳細は、「iOSプラットフォームでのJavaコードのデバッグ方法」を参照してください。

UIコード(JavaScript、HTMLおよびCSS)をデバッグするには、アプリケーションでmaf.propertiesファイルを構成します(javascript.debug.enabled=true)。このタスクを完了したら、「iOSプラットフォームでのUIコードのデバッグ方法」の説明に従って、UIコードをデバッグできます。

28.5.1 iOSプラットフォームでのJavaコードのデバッグ方法

iOSプラットフォームでJDeveloperを使用してMAFアプリケーションのJavaコードをデバッグするには、「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」で説明されているデバッグ手順に従います。

iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、次を参照してください。

- iOSシミュレータへのiOSアプリケーションのデプロイ方法

- iOSデバイスへのアプリケーションのデプロイ方法

- テストおよびデバッグ用のAppleデバイスの登録

28.5.2 iOSプラットフォームでのUIコードのデバッグ方法

iOS プラットフォームで作業している場合、Safari ブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariの環境設定を開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします。

「Develop」メニューが有効になったら、「iPhone Simulator」または「iPad Simulator」を選択し(図28-3および図28-4を参照)、デバッグするUIWebViewを選択します(図28-5を参照)。

注意:

「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。

featureContentDelay追加ビルド引数を使用して、アプリケーションの最初のページがロードされる前に、カスタムJavaScriptからのログ・メッセージおよびエラーを記録します。この引数は、WebViewにコンテンツが移入されるまでの遅延を指定します。追加ビルド引数-featureContentDelayを20に設定します。追加ビルド引数の設定の詳細は、「iOSビルド・オプションの定義」を参照してください。

図28-3 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ

図28-4 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ

図28-5 Safariブラウザの「Develop」メニューを使用したUIWebViewの選択

図28-6および図28-7は、CSS、DOMおよびHTMLをデバッグ中のSafariのリモートWebインスペクタを示しています。

図28-6 リモートWebインスペクタ

図28-7 実行時にリモートWebインスペクタによって解析されたAMXページ

図28-8および図28-9は、Safariブラウザでのブレークポイントを使用したJavaScriptのデバッグを示しています。

図28-8 SafariブラウザでのJavaScriptのデバッグ

図28-9 実行時にデバッグされたAMXページ

28.6 ユニバーサルWindowsプラットフォームにデプロイされたMAFアプリケーションのデバッグ

UWPにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。

JDeveloperのデバッグ・ツールを使用して、UWPにデプロイするMAFアプリケーションでJavaコードをデバッグできます。「ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法」を参照してください。

「ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法」の説明に従って、Visual Studioを使用してMAFアプリケーションでJavaScript、HTMLおよびCSSコードをデバッグします。

28.6.1 ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法

ユニバーサルWindowsプラットフォーム(UWP)にデプロイするMAFアプリケーションでJavaコードをデバッグする方法について説明します。

次の手順を実行して、UWPにデプロイするMAFアプリケーションでJavaコードをデバッグできます。

1. MAFアプリケーションのmaf.propertiesファイル・エントリを構成して、デバッグを有効にします。maf.propertiesファイルに次の値が存在することを確認します。

java.debug.enabled=true
java.debug.port=8000
java.debug.mode=client
java.debug.host=localhost

maf.propertiesファイルの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

2. 「デバッグ」モードを使用するように、MAFアプリケーションのWindowsデプロイメント・プロファイルを構成します(図28-10を参照)。このダイアログにアクセスするには、「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」をクリックします。

図28-10 MAFアプリケーションのデバッグ・モードの有効化

3. カスタム・プロジェクトをMAFアプリケーションに追加して、標準のJDeveloperアプリケーションの「実行/デバッグ」構成ダイアログにアクセスできるようにします。このカスタム・プロジェクトをMAFアプリケーションに追加したら、JPDAプロトコルをリスニングする接続を指定して、「リモート・デバッグ」オプションを有効にします。カスタム・プロジェクトでデバッグ・リスナーを開始します。これらのタスクの詳細は、「ユニバーサルWindowsプラットフォームでMAFアプリケーションのリモート・デバッグを有効にする方法」を参照してください。

4. ローカルWindowsマシン・オプションを使用してMAFアプリケーションをデプロイします。「ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ」を参照してください。

Windowsローカル・マシン・デプロイメント・オプションを使用してMAFアプリケーションをデプロイすると、アプリケーションが起動し、JDeveloperとのデバッグ・セッションが確立されます。

28.6.1.1 ユニバーサルWindowsプラットフォームでMAFアプリケーションのリモート・デバッグを有効にする方法

カスタム・プロジェクトをMAFアプリケーションに追加して、MAFアプリケーションの作成時にMAFアプリケーション作成テンプレートでは表示されない、「実行/デバッグ」構成パネルを表示します。

これらの構成パネルを使用して、UWPにデプロイするMAFアプリケーションのリモート・デバッグを有効にできます。カスタム・プロジェクトを追加して構成したら、カスタム・プロジェクトからデバッグ・リスナーを開始します。

カスタム・プロジェクトを追加してUWPでのMAFアプリケーションのリモート・デバッグを有効にするには:

1. JDeveloperのメイン・メニューで、「File」→「新規」→「プロジェクト」をクリックし、「新規ギャラリ」ダイアログで「カスタム・プロジェクト」を選択し、「OK」をクリックします。

2. カスタム・プロジェクトの作成で「終了」をクリックし、Project 1という名前のカスタム・プロジェクトを作成します。
新しいカスタム・プロジェクト(Project 1)が、MAFアプリケーションの「プロジェクト」パネルのApplicationControllerプロジェクトとViewControllerプロジェクトの間に表示されます。

3. プロジェクトを選択し、JDeveloperのメイン・メニューで「アプリケーション」→「プロジェクト・プロパティ」を選択します。

4. 「プロジェクト・プロパティ」ダイアログの「実行/デバッグ」ページで、「デフォルト」実行構成を選択し、鉛筆アイコンをクリックして「起動設定」ダイアログを表示し、ここで「リモート・デバッグ」チェック・ボックスを選択します。

5. 「ツール設定」→「デバッガ」→「リモート」に移動し、図28-11に示すとおりに次のプロパティを構成します。

a. プロトコル: ドロップダウン・メニューから「JPDAのリスニング」を選択します。

b. ポート: maf.propertiesファイルでjava.debug.portに構成したポート番号を入力します。

c. タイムアウト: タイムアウトする秒数を指定します。0はタイムアウトしないことを意味します。

d. ローカル・アドレス: localhost。

図28-11 UWPにデプロイされたMAFアプリケーションのリモート・デバッグの有効化

6. 「OK」をクリックして開いているダイアログを閉じます。

7. 「アプリケーション」ウィンドウの「プロジェクト」パネルで、カスタム・プロジェクト(たとえば、Project 1)を右クリックし、表示されるコンテキスト・メニューから「デバッグ」を選択します。

8. 「JPDAのリスニング」ダイアログで、接続情報が正しいことを確認し、「OK」をクリックします。

9. JDeveloperのメイン・メニューで、「Windows」→「プロセス」をクリックし、図28-12に示すようにデバッグ・リスナーが開始されることを確認します。

図28-12 MAFアプリケーションで開始されるデバッグ・リスナー

Windowsローカル・マシン・デプロイメント・オプションを使用してMAFアプリケーションをデプロイすると、アプリケーションが起動し、JDeveloperとのデバッグ・セッションが確立されます。

28.6.2 ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法

ユニバーサルWindowsプラットフォーム(UWP)でMAFアプリケーションを開発する際、アプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。Visual Studioを使用してこのコードをデバッグします。

MAFアプリケーション開発で使用するVisual Studioのインストールの詳細は、『Oracle Mobile Application Frameworkのインストール』のユニバーサルWindowsプラットフォーム用の開発ツールの設定に関する項を参照してください。

MAFアプリケーションをデバッグする前に、アプリケーションを開発してデプロイする必要があります。アプリケーションの開発およびデプロイの詳細は、「MAFアプリケーション開発のスタート・ガイド」および「MAFアプリケーションのデプロイ」を参照してください。

UWPにデプロイされているMAFアプリケーションでUIコードをデバッグするには:

1. デバッグ・モードでMAFアプリケーションをデプロイします。「ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ」を参照してください。

2. ローカル・マシンにアプリケーションをデプロイしたら、C:\path\to\appRoot\deploy\[DeploymentProfileName]\debug\ディレクトリに移動します。

3. アプリケーション・アーティファクトが構成されているMafTemplate.slnテンプレート・ファイルをダブルクリックして、Visual Studioで開きます。

4. Visual Studioで、図28-13に示されているように、CPUの値をx64に設定します。

図28-13 Visual Studio IDE

5. 「Script Only」オプションが選択されている場合は、図28-14に示すように、AMXのUIコードをデバッグできます。

図28-14 Visual Studioワークスペース

28.7 MAFアプリケーションでのロギングの使用および構成

すべてのサポートされているプラットフォームに、MAFでログ出力が1つのファイルに向かうようにlogging.propertiesファイルを構成することによる埋込みコードおよび、JavaScriptを介してログオンできます。このログ出力には、System.out.printlnおよびSystem.err.println文によって生成された出力が含まれます。

デフォルトのMAFのロギング・プロセスは、次のとおりです。

- アプリケーションの起動時、ロギングが開始されます。

- アプリケーションの以前の実行で生成された既存のログ・ファイルが削除され、現在の実行の内容のみが使用可能になります。

- アプリケーションをiOSデバイス・シミュレータ上で実行する場合、Javaロギング出力へのアクセスに使用できるファイルは、出力のリダイレクションに伴って生成された直後に、その名前と場所が通知されるファイルのみです。このファイルの一般的な場所として、/Users/<userid>/Library/Developer/CoreSimulator/Devices/<device_id>/data/Containers/Data/Application/<container_id>/application.log (<device_id>と<container_id>の参照は、アプリケーションのインストール時にiOSによって作成されたUUIDの長い文字列を表します)などがあります。これらの参照の値は予測できないので、複数のシミュレータまたはアプリケーションがインストールされている場合は、デプロイメント時に使用されるシミュレータに対応するフォルダを特定することは困難です。デプロイメントにJDeveloperを使用する場合は、ログ出力を既知の場所に向けるように自動的に-consoleRedirectオプションが設定されます。iOS用のMAFの実行構成で、「実行構成の編集」→「モバイル実行構成」ダイアログを使用してそれを設定し、その実行構成をデプロイメントまたはiOSデバイス・シミュレータ上でのMAFアプリケーションの実行に使用する場合は、構成された場所にログ・ファイルが作成され、その内容がJDeveloperのコンソールに表示されます。「実行構成の編集」→「モバイル実行構成」ダイアログを使用して値を設定していない場合、または通常のデプロイメント(たとえば、iOS用のMAF実行構成を使用しないなど)を選択する場合は、ログ・ファイルは<appRoot>/<deployRoot>/<iOSProfileName>/log<appName>.logファイルに作成され、その内容がJDeveloperのコンソールに表示されます。「実行構成の作成と構成」を参照してください。

注意:

ログ・ファイルを取得するには、パスは絶対パスである必要があり、場所は現在のユーザーにとって書込み可能である必要があります。

iOSデバイス上でアプリケーションを実行している場合、コンソール出力は、アプリケーションのDocuments/logsディレクトリにあるapplication.logファイルにリダイレクトされます。iOSデバイスでは、このディレクトリに次のようにアクセスできます。

1. 「Xcode」→「Devices」とナビゲートします。

2. 「Installed Apps」セクションのリストからアプリケーションを選択します。

3. 歯車のアイコンをクリックします。

4. ダウンロードされたコンテナを選択します。

5. ダウンロードされた*.xcappdataファイルを右クリックして、「Show Package Contents」を選択します。

6. 「AppData」→「Documents」→「Logs」を開きます。

7. application.logファイルをダブルクリックします。

Androidでは、出力は、アプリケーションと同じ名前のテキスト・ファイルにフォワードされます。出力ファイルの場所は、/sdcard/Android/data/<app.package>/files/<app.name>.txtです。この場所が存在していないか、読取り専用として構成されている場合、ログ出力は、アプリケーションの書込み可能データ・ディレクトリ(/data/data/<package>/files/<AppName>.txt)に再ルーティングされます。Android 6.0以降を使用するAndroidデバイスでは、エンド・ユーザーがストレージ権限をMAFアプリケーションに付与していない限り、MAFはログ出力を/data/data/<package>/files/<AppName>.txtに書き込みます(図28-15を参照)。エンド・ユーザーがストレージ権限を付与している場合、MAFはログ出力を/sdcard/Android/data/<app.package>/files/<app.name>.txtに書き込みます。

図28-15 AndroidのMAFアプリケーションへのストレージ権限の付与

MAFには多くのAPIが用意されており、MAFアプリケーションで使用してストレージ権限を管理します。次のサンプル・コードでは、これらのAPIを使用する方法を示します。MAFは非AndroidプラットフォームではこれらのAPIを無視します。このAPIの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

// Check if the Storage permission is granted:
import oracle.maf.api.platform.android.Permissions;
import oracle.maf.api.platform.android.PermissionGroup;
...
Permissions.getInstance().hasPermissions(PermissionGroup.Storage);
...

// Check if a UI should be shown to the user with a rationale for the Storage permission:
import oracle.maf.api.platform.android.Permissions;
import oracle.maf.api.platform.android.PermissionGroup;
...
Permissions.getInstance().shouldShowRequestPermissionRationale(PermissionGroup.Storage);
...

// Request Storage permission:
import oracle.maf.api.platform.android.Permissions;
import oracle.maf.api.platform.android.PermissionGroup;
import oracle.maf.api.platform.android.PermissionsCallback;

public class AndroidPermissionsBean
implements PermissionsCallback
{
public void checkStoragePermission()
{
//
// Set "this" as the permission callback handler.
//
Permissions.getInstance().setPermissionsCallbackHandler(this);

//
// Asynchronously request permissions.
//
Permissions.getInstance().requestPermissions(PermissionGroup.Storage);
}

@Override
public void onPermissionsResponse(PermissionGroup permissionGroup, boolean hasPermissions)
{
//
// Remove "this" as the permission callback handler.
//
Permissions.getInstance().setPermissionsCallbackHandler(null);

//
// Asynchronously handle the permission result callback below.
//
}
}

ログ・ファイルの内容は、AndroidのLogcatユーティリティ(http://developer.android.com/tools/debugging/debugging-log.htmlを参照)でレプリケートされます。JDeveloperを使用してMAFアプリケーションをAndroidデバイスまたはエミュレータにデプロイする場合は、JDeveloperでLogcatからログ出力が表示されます。

- iOSおよびAndroidの両方で、デプロイメントの直後に、ログ出力がJDeveloperの実行またはデバッグ・ログのページに表示されます。通常のデプロイメントの場合、アプリケーション・ログが個別の「ログ」ページに表示されるのに対し、デプロイ・ログは「デプロイ・ログ」ページに表示されます。MAFアプリケーションのビルド、デプロイおよび起動に「実行/デバッグ」実行構成を使用する場合は、「アプリケーション」ウィンドウの「プロセス」タブにある「終了」オプションで、ログのリダイレクトを実行するプロセスとともにMAFアプリケーションを終了します。「ログの表示」オプションで、次の図に示すようにログ・ページを表示できます。
MAFアプリケーションのビルド、デプロイおよび起動にデプロイメント・プロファイルを使用する場合は、「プロセス」タブの「終了」オプションでは、ログ・リダイレクト・プロセスのみが終了し、MAFアプリケーションの実行は続きます。

- logging.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置されます(「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>/src/META-INFの場所に対応しています。このファイルでは、すべてのログ出力でjava.util.logging.ConsoleHandlerおよびSimpleFormatterを使用することが定義され、ログ・レベルがSEVEREに設定されます。このファイルを編集して、別のロギング動作を指定できます(「プロパティ・ファイルを使用したロギングの構成方法」を参照)。

注意:

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リファレンスを参照してください。

28.7.1 プロパティ・ファイルを使用したロギングの構成方法

次の例は、ロギングの構成で使用するlogging.propertiesファイルを示しています。

# default - all loggers to use the ConsoleHandler
.handlers=java.util.logging.ConsoleHandler
# default - all loggers to use the SimpleFormatter
.formatter=java.util.logging.SimpleFormatter

oracle.adfmf.util.logging.ConsoleHandler.formatter=
oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.PatternFormatter.pattern=
[%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

#configure the framework logger to only use the adfmf ConsoleHandler
oracle.adfmf.framework.useParentHandlers=false
oracle.adfmf.framework.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.framework.level=SEVERE

#configure the application logger to only use the adfmf ConsoleHandler
oracle.adfmf.application.useParentHandlers=false
oracle.adfmf.application.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.application.level=SEVERE

oracle.adfmf.util.logging.ConsoleHandlerは、カスタム・フォーマッタの受信者としての役割を果たします。

oracle.adfmf.util.logging.PatternFormatterでは、ログ・メッセージの出力を可能にする、次の高度なフォーマット・トークンが許可されています。

- %LEVEL%: ロギング・レベル。

- %LOGGER%: 出力が書き込まれるロガーの名前。

- %CLASS%: ログに記録されるクラス。

- %METHOD%: ログに記録されるメソッド。

- %TIME%: ロギング・メッセージが送信された時間。

- %MESSAGE%: 実際のメッセージ。

使用可能なロギング・レベルは、次のとおりです。

- SEVERE: 重大な障害を示すメッセージ・レベルです。

- WARNING: 潜在的な問題を示すメッセージ・レベルです。

- INFO: 情報メッセージのメッセージ・レベルです。

- FINE: トレース情報を提供するメッセージ・レベルです。

- FINER: このレベルは、かなり詳細なトレース・メッセージを示します。

- FINEST: このレベルは、非常に詳細なトレース・メッセージを示します。

注意:

ロギング・レベルの詳細度を選択するときは、SEVERE、WARNINGおよびINFOレベルで出力の詳細度を上げると、アプリケーションのパフォーマンスに悪影響を及ぼすことに留意してください。

logging.propertiesファイルで定義されているロガーは、oracle.adfmf.util.Utilityクラスから取得されるロガーと一致します(「ロギングの使用方法と構成」を参照)。ロギング・レベルも一致します。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%

28.7.2 JavaScriptのロギングの使用方法

JavaScriptは、console.log or.error/.warn/.infoに出力を書き込みます。この出力は、System.outユーティリティによってファイルにリダイレクトされます。

メッセージを指定することで、ログの出力をカスタマイズできます。次のJavaScriptコードでは、"Message from JavaScript"出力が生成されます。

<script type="text/javascript" charset="utf-8">
function test_function() { console.log("Message from JavaScript"); }
</script>

ロギング・ファイルに定義されているプロパティを利用するには、adf.mf.logパッケージ、およびそれによって提供されるApplicationロガーを使用する必要があります。

使用可能なロギング・レベルは、次のとおりです。

- adf.mf.log.level.SEVERE

- adf.mf.log.level.WARNING

- adf.mf.log.level.INFO

- adf.mf.log.level.CONFIG

- adf.mf.log.level.FINE

- adf.mf.log.level.FINER

- adf.mf.log.level.FINEST

ロギングをトリガーするには、adf.mf.log.Applicationロガーのlogpメソッドを使用し、そのメソッドのパラメータで次のものを指定します。

- ロギング・レベル

- 文字列としての現在のクラス名

- 文字列としての現在のメソッド

- 文字列としてのメッセージ文字列

次の例は、MAFアプリケーションでlogpメソッドを使用する方法を示しています。

adf.mf.log.Application.logp(adf.mf.log.level.WARNING,
"myClass",
"myMethod",
"My Message");

logpメソッドを実行すると、次の出力が生成されます。

[WARNING - oracle.adfmf.application - myClass - myMethod] My Message

Oracle Mobile Application Framework JSDocリファレンスを参照してください。

28.7.3 埋込みロギングの使用方法

埋込みロギングでは、次の例に示されているとおり、java.util.logging.Loggerを使用します。EmbeddedClassはプロジェクトで定義されるJavaクラスを表します。

import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.adfmf.util.logging.*;
...
Utility.ApplicationLogger.logp(Level.WARNING,
EmbeddedClass.class.getName(),
"onTestMessage",
"embedded warning message 1");
Logger.getLogger(Utility.APP_LOGNAME).logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 2");
Logger.getLogger("oracle.adfmf.application").logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 3");

このコードによって生成される出力は、次のとおりです。

[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 1
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 2
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 3

28.7.4 iOSプラットフォームでのデバッグおよびロギングにXcodeを使用する方法

MAFプロジェクトの操作にXcodeを使用することは、JDeveloperを使用した次回のデプロイメント中に一部またはすべての変更を失う可能性があるため推奨されませんが、例外的な状況ではこれを使用できます。

始める前に:

アプリケーションをJDeveloperからiOSシミュレータにデプロイします。

生成されたプロジェクトを直接Xcodeで開く手順は次のとおりです。

1. workspace_directory\deploy\デプロイメント・プロファイル名\temporary_xcode_project\に移動します。

2. Oracle_ADFmc_Container_Template.xcodeprojというXcodeプロジェクトを開きます。

Xcodeを使用してMAFアプリケーションをデバッグしている場合、IDE内(JDeveloperコンソールまたはXcodeコンソール)ではJavaの出力を表示できません。この出力は、ファイルにリダイレクトされます(「ロギングの使用方法と構成」を参照)。アプリケーションのスキーマに次の引数を追加すると、この動作を無効にし、iOSデバイスまたはシミュレータ上でデバッグを実行するときに、XcodeからJava、JavaScriptおよびObjective-Cのログ出力にリアルタイムでアクセスできるようになります。

-consoleRedirect=FALSE

28.7.5 アプリケーション・ログへのアクセス方法

MAFアプリケーションのアプリケーション・ログ・ファイルをユーザーのデバイスから取得して、MAFアプリケーションで発生している問題を分析できます。これを行う1つの方法は、アプリケーション・ログ・ファイルを、そのデバイス上の場所から、アプリケーションがアプリケーション・ログ・ファイルをデバイスから送信できるディレクトリにコピーすることです。

次の例は、アプリケーション・ログ・ファイルの場所にアクセスし、そのファイルを電子メール・メッセージへの添付が可能な場所にコピーして、ログ・ファイルの内容を分析できる受信者に送信する方法を示しています。

import java.nio.file.FileSystems;
import java.nio.file.Path;
import oracle.adfmf.util.Utility;

// Get path to application log file
private static Path getPathToLogFile() {
String pathStr = Utility.getStorageLocations().getLogFileLocation();
return FileSystems.getDefault().getPath(pathStr);
}

// Create an instance of device manager to access the device’s email functionality later
DeviceManager dm = DeviceManagerFactory.getDeviceManager();

//Construct path to application log file
String logFilePath = getPathToLogFile().toString();
...

//1. Determine device location to save a copy of the log file
String mailAccessiblePath =  Utility.ensureTrailingForwardSlash(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DeviceOnlyDirectory));
String targetFileNameAndPath = mailAccessiblePath + appName + ".log";

//2. Copy file to a location accessible from a mail client
try {
Utility.copy(new File(logFilePath), new File(targetFileNameAndPath));
}
catch (IOException e) {
// If something goes wrong, log the failure to copy.
Utility.ApplicationLogger.logp(Level.SEVERE, this.getClass().getSimpleName(), "sendLogAsMail", "Could not copy file " + logFilePath + " to " + targetFileNameAndPath);
Utility.ApplicationLogger.logp(Level.SEVERE, this.getClass().getSimpleName(), "sendLogAsMail", e.getLocalizedMessage());
}

//3. Set the attachment property referenced by sendEmail(...)
this.setMailAttachment(targetFileNameAndPath);

//4. Send mail: open the mail client
dm.sendEmail(mailTo, mailCc, mailSubject, mailBody, mailBcc, mailAttachment, mailMimeType);

注意:
アプリケーションをJDeveloperから仮想デバイス(iOSシミュレータまたはAndroidエミュレータ)にデプロイすると、MAFは、アプリケーション・ログ・ファイルではなく、JDeveloperの「ログ」ウィンドウにログ出力を書き込みます。

アプリケーション・ログ・ファイルの場所を取得したら、ユーザーのデバイスからサーバー側に送信するメカニズムを選択します。検討する必要があるオプションとして、REST Webサービスを使用した、アプリケーションに関連付けられているサーバー側の特定の場所へのファイルのアップロードがあります。このオプションでは、ログ・ファイルを電子メール添付ファイルとして送信する別のオプションと比べて、より一貫したユーザー操作性が提供されます。後者のオプションでは、プラットフォーム・デバイス(iOS、Android、UWP)や、電子メール・クライアントがデバイスで構成されている方法に基づいて、異なる動作をとることができます。

MAFアプリケーションのログ・ファイルで取得される詳細レベルは、logging.propertiesファイルの構成エントリによって異なります。ただし、次の例に示すように、たとえばAPIを使用してログ・レベルを実行時に動的に変更している場合は除きます。

Logger l = Utility.ApplicationLogger;
// Select a new log level. Note that OFF disables logging. In our example, we select ALL.
// Level newLevel = Level.<ALL | CONFIG | INFO | FINE | FINER | FINEST | OFF | SEVERE | WARNING>
Level newLevel = Level.ALL;
l.setLevel(newLevel);

28.7.6 ロギングを無効にする方法

ロギング出力がアプリケーション・ログ・ファイルに転送されないように設定できます(この場合、ログ・ファイルは、空白のままになるか、まったく作成されません)。ロギングが無効になると、トレース文はアプリケーション・ログから失われ、stderrおよびstdoutに転送された出力は、すべてnullの場所またはエンド・ユーザーがアクセスできない別の場所にリダイレクトされます。

すべてのロギングを無効にするには、次のようにアプリケーションのadf-config.xmlファイルでdisableLoggingプロパティをtrueに設定します。

<adf-property name="disableLogging" value="true"/>

デフォルトでは、MAFアプリケーションのロギングは有効で、disableLoggingプロパティはfalseに設定されています。

adf-config.xmlファイルの詳細は、「MAFアプリケーションとプロジェクト・ファイルの概要」を参照してください。

28.8 MAFアプリケーションのパフォーマンス測定

MAFは、ユーザーによるMAFアプリケーションのパフォーマンスのモニターおよび測定を支援します。たとえば、アプリケーションで次のイベントの実行にかかる時間を測定できます。

- ボタンにより起動されたアクションの完了

- ページのロード

- RESTコールがレスポンスを返す

また、MAFアプリケーションでモニターする操作の実行時間の平均および標準偏差を示す統計を出力できます。

アプリケーションのlogging.propertiesファイルで次のパフォーマンス・ロガーのロギング・レベルを構成して、パフォーマンス測定を有効にします。次の例でロガーに割り当てられる値は、説明用の値です。使用可能なすべての値の説明は、表28-1を参照してください。

oracle.adfmf.amx.useParentHandlers=false
oracle.adfmf.amx.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.amx.level=SEVERE

# used to control what monitors are captured in the list of monitors
oracle.maf.performance.monitor.captured.level = FINEST

# used to control what monitors are reported in the dumpStatistics
oracle.maf.performance.monitor.reported.useParentHandlers=false
oracle.maf.performance.monitor.reported.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.maf.performance.monitor.reported.level = FINEST

# used to control what monitor observations (start/stop times) are logged.
oracle.maf.performance.monitor.observations.reported=false
oracle.maf.performance.monitor.observations.reported.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.maf.performance.monitor.observations.reported.level = FINEST

パフォーマンス測定が完了したら、MAFにより、アプリケーションのパフォーマンスの測定中に収集されたデータを確認できます。「MAFアプリケーションのパフォーマンス・データの表示」で説明しているPerformanceMonitorGraph.jarツールを呼出すか、または、好みのログ・ファイル・エディタでアプリケーション・ログ・ファイルを開いて、データを確認できます。次の例は、MAFにより、パフォーマンスのモニター後に生成される出力の抜粋を示しています。この例では、モニターによって5件のProcess AMX eventが検出され、実行時間の平均は1435.5ミリ秒、標準偏差は1990.567…でした。

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics]
PERFMON-JAVA STATS: Monitor 'com.company.WorkBetter.**Perf_Monitor**.Springboard.Container.Process AMX event' description:
'Time to process event'  observations: 5  mean: 1435.4 standard deviation: 1990.5674567821106

表28-1に、logging.propertiesファイルで設定できる、使用可能なパフォーマンス・モニター・レベルを示します。

表28-1 パフォーマンス・モニター・レベル

レベル

説明

Level.INFO

これは最もおおまかなモニター・レベルです。イベントおよびアクションがモニターされます。このレベルを使用すると、たとえば、ページのロードやエンド・ユーザー・アクションの実行(ボタンのクリックなど)をモニターできます。このモニター・レベルを使用した場合、パフォーマンスへの影響は最小限になります。

Level.FINE

このレベルは、次のカテゴリに分けられる、より多くのパフォーマンス・インジケータをモニターします。

- JavaScriptおよびレンダリング(システム・レベル)

- ビジネス・ロジックの処理(アプリケーション・レベル)

- フレームワークの処理(システム・レベル)

- 外部データ・アクセス

- RESTコール(システム・レベル)

- データベース・アクセス(システム・レベル)

このモニター・レベルを使用するとアプリケーションのパフォーマンスに影響するため、デフォルトでは有効にしないでください。アプリケーションを再構築または調整することを目的として、コードの実行状況に関するインサイトを取得する場合に、このレベルの使用を検討してください。

Level.FINER

AMXページでのノードの処理、データ変更イベントまたはEL式の実行時間といった重大なパフォーマンスの問題をモニターする場合に使用します。

Level.FINEST

アプリケーションのパフォーマンスをデバッグする場合に、このモニター・レベルを使用します。

logging.properitesで指定したモニター・レベルは、アプリケーションを初めて起動するときに有効になります。

注意:
MAFでは、oracle.adfmf.framework.apiパッケージのPerfMonクラスに、実行時にパフォーマンス・モニター・レベルを変更するために使用できるいくつかのsetPerformanceMonitorメソッドが用意されています。Oracle Mobile Application Framework Java APIリファレンスを参照してください。

logging.propertiesファイルでのモニター・レベルの指定に加え、パフォーマンス・データを収集するモニターをアプリケーションに追加することもできます。MAFでは、Javaクラスoracle.adfmf.performance.Monitor (モニター)を使用してパフォーマンス・データを収集します。モニターは、開始および停止でき、監視を追加できるストップ・ウォッチです。監視を追加すると、モニターを使用して特定の測定の標準偏差などを把握できます。各モニターに、一意のIDとオプションの説明があります。

モニターでは、イベントの継続時間やイベントの発生回数を測定するために使用できるいくつかのaddObservation()メソッドが公開されています。継続時間を測定する場合は、イベントの前にモニターを開始します。イベントが発生したら、モニターからaddObservation()メソッドを呼び出します。これによりモニターが停止します。継続時間は、start()メソッドからaddObservation()メソッドまでの時間です。停止されなかったモニターは再開できます。開始していないモニターは停止できません。そのようなモニターを停止しようとすると、エラーが記録されます。

イベントの発生回数を測定するモニターは、開始または停止する必要はありません。次の例に示すように、モニターを停止しないaddObservation(double duration)メソッドを使用します。このモニターは、パフォーマンスを測定しているアプリケーションでのJSONシリアライズの発生回数を計測します。durationパラメータは、モニターが最後に監視を追加してからの時間を示します。

次の例は、イベントの継続時間を測定するモニターの作成方法を示しています。この例では、このモニターによって生成される統計情報のサンプルも示しています。

import oracle.adfmf.performance.Monitor;
....

public void measurePerformance()
{
Monitor monitor = null;

try
{
//// Check that the appropriate monitor level is set before you create the monitor
if (Utility.PerformanceMonitorCaptured.isLoggable(Level.INFO))
{
monitor = MonitorFactory.getInstance().getMonitor("REST call", Level.INFO, "REST call timing");
monitor.start();
}

//
// Perform your custom logic here:
//
}
finally
{
if (monitor != null)
{
monitor.addObservation();
}
}
}

public void countCalls()
{
Monitor monitor = null;

try
{
if (Utility.PerformanceMonitorCaptured.isLoggable(Level.FINE))
{
monitor = MonitorFactory.getInstance().getMonitor("Call count", Level.FINE, "Count number of calls");
monitor.start();
}

//
// Perform your custom logic here:
//
}
finally
{
if (monitor != null)
{
monitor.addObservation(1);
}
}
}

アプリケーションでパフォーマンス・データを収集するモニターを作成するには、データを収集するためのパフォーマンス・モニター取得レベルを有効にするようにlogging.propertiesファイルを構成します。前述の例で、アプリケーションのlogging.propertiesファイルに次のエントリが含まれていない場合、MAFではモニターのパフォーマンス・データを収集しません。

# used to control what monitors are captured in the list of monitors
oracle.maf.performance.monitor.captured.level = FINEST

モニター(oracle.adfmf.performance.Monitor)の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

モニターに加え、MAFではoracle.adfmf.performance.Story (ストーリ)も提供されます。ストーリを使用すると、パフォーマンス・データの収集を開始および終了できます。ストーリのパフォーマンス・データの収集が終了すると、ストーリの開始時に割り当てたストーリIDを使用して収集されたパフォーマンス・データの階層ビューがMAFに表示されます。階層ビューには、ストーリ中に実行されたイベントの個別のタイミング測定が示されます。さらに、ストーリの終了時に、MAFによってシステムの状態(HOTS)チェックポイントが実行されます。このHOTSチェックポイントの一環として、ストーリ中に収集されたすべてのモニター・データの標準偏差が計算されるため、個別のストーリ・イベントが統計的にどのように測定されているかに関するインサイトを得ることができます。その後、すべてのモニター・データがMonitorFactoryからクリアされます。

注意:
oracle.adfmf.util.HOTS.checkpoint()メソッドを呼び出すことで、ストーリとは関係なく、HOTSチェックポイントを実行できます。これにより、JVMにより使用された合計メモリー、空きメモリー、使用済メモリー(合計から空きメモリーを引いたもの)およびアクティブな機能の数といったアプリケーションの情報が判別されます。checkpoint()によって返されるデータのサンプルを次に示します。

HOTS.memory.used (N/A) count: 1.0335056E7
HOTS.memory.free (N/A) count: 1.365112E7
HOTS.memory.total (N/A) count: 2.3986176E7
HOTS.memory.max (N/A) count: 4.9152E7
HOTS.threads.active (N/A) count: 20.0
HOTS.features.active (N/A) count: 6.0

次の例は、ストーリID (**Perf_Monitor**)でストーリを開始し、ストーリを停止するメソッドを公開するマネージドBeanを示しています。このストーリは、パフォーマンスを測定するアプリケーションのUIのボタンから開始および終了できます。たとえば、ページのロードを測定する場合は、そのページに移動する前にストーリを開始するためのUIボタンと、ページがロードされたらストーリを終了する別のボタンを公開します。

package mobile;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.performance.Story;

public class PerfBean
{
public PerfBean()
{
super();
}
public void startStory(ActionEvent ae)
{
Story.startStory("**Perf_Monitor**");
}

public void endStory(ActionEvent ae)
{
Story.endStory();
}

}

logging.propertiesファイルで指定したパフォーマンス・モニター・レベルによって、ストーリによって取得されるデータの量が決定されます。つまり、logging.propertiesファイルのoracle.maf.performance.monitor.reported.level = FINESTエントリは、INFOエントリよりも詳細なストーリを生成します。ストーリが終了すると、ストーリ中に取得されたすべてのパフォーマンス・データがタイミングに基づいてソートされます。モニターが記録された時間が、測定対象のイベントが実行された時間と異なる場合があるため、このソートによって、JavaScriptイベントに対応するモニターの監視が正しい時間で示されます。次にMAFは、次の例に示すように、ソートされたレコードを反復処理し、目的の出力を生成します。

MAFによって、アプリケーションのログ・ファイルにストーリが書き込まれます。AMXページ間を移動するアプリケーションのサンプル出力は、次のようになります。

例28-1 ストーリを使用して生成されたMAFパフォーマンス・モニター・データ

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (Story Book) at 1452728427473

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb2 (Time to process event) at 1452728427416

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop]
PERFMON-JAVA STOP:  **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb2 (Time to process event) took: 14897.0ms
(started at 1452728427416)

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (Time to process event) at 1452728442323

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (Time to process event) took:
586.0ms (started at 1452728442323)

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Container.Load page /view2.amx
(Time to fully render the page) at 1452728442441

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Load page /view2.amx
(Time to fully render the page) took: 468.0ms (started at 1452728442441)

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Embedded.Evaluate method expression #{myBean2.endStory}
(UserSpace) at 1452728450665

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Embedded.Evaluate method expression #{myBean2.endStory}
(UserSpace) took: 78.0ms (started at 1452728450665)

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Container.Process AMX event Page: /view2.amx
event of type action on node cb2 (Time to process event) at 1452728450626

[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Process AMX event Page: /view2.amx
event of type action on node cb2 (Time to process event)
took: 85.0ms (started at 1452728450626)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (Story Book)
took: 23367.0ms (started at 1452728427473)

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Container.Process AMX event'
description: 'Time to process event'  observations: 3
mean: 5189.333333333333 standard deviation: 8410.817102596711

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Container.Load page'
description: 'Time to fully render the page'  observations: 1
mean: 468.0 standard deviation: NaN

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Embedded.Evaluate
method expression' description: 'UserSpace'  observations: 1  mean: 78.0
standard deviation: NaN

[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Embedded.Story'
description: 'Story Book'  observations: 1  mean: 23367.0 standard deviation: NaN

1452728427473  0001.0001 [0000] Start: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (INFO)
1452728442323    0002.0002 [0001] Start: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (INFO)

1452728442441      0003.0003 [0002] Start: **Perf_Monitor**.Navigation.Container.Load page /view2.amx (INFO)
1452728442909      0003.0003 [0002] Stop: **Perf_Monitor**.Navigation.Container.Load page /view2.amx
(took = 468.0) started at 1452728442441 (INFO)

1452728442909    0002.0002 [0001] Stop: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (took = 586.0)
started at 1452728442323 (INFO)

1452728450626    0004.0002 [0001] Start: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view2.amx event of type action on node cb2 (INFO)

1452728450665      0005.0003 [0004] Start: **Perf_Monitor**.Navigation.Embedded.Evaluate
method expression #{myBean2.endStory} (INFO)

1452728450711    0004.0002 [0001] Stop: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view2.amx event of type action on node cb2 (took = 85.0)
started at 1452728450626 (INFO)

1452728450743      0005.0003 [0004] Stop: **Perf_Monitor**.Navigation.Embedded.Evaluate method
expression #{myBean2.endStory} (took = 78.0)
started at 1452728450665 (INFO)

1452728450840  0001.0001 [0000] Stop: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor**
(took = 23367.0) started at 1452728427473 (INFO)

28.9 MAFアプリケーションのパフォーマンス・データの表示

MAFでは、MAFアプリケーションのパフォーマンスを測定するときに、収集するMAFアプリケーションのパフォーマンス・データをグラフで表示する、パフォーマンス・モニター・グラフ・ツールが用意されています。

ツールを使用する前に、「MAFアプリケーションのパフォーマンス測定」の説明に従って、アプリケーションのパフォーマンスをモニターし、パフォーマンス・データを収集するように、アプリケーションのlogging.propertiesファイルを構成する必要があります。その後、パフォーマンス・データをツールへの入力として収集するアプリケーション・ログ・ファイルを使用します。ツールはタイムラインと共にパフォーマンス・データをHTMLファイルで出力し、アプリケーションの実行中に、いつ、何のMAFイベントが発生したのかを視覚化する助けとなります。次の図に、HTMLファイルのtest.htmlをデフォルト・ブラウザに表示します。

図28-16 タイムライン・グラフ

ツールは、logging.propertiesファイルで指定したデフォルトの形式に従ったアプリケーション・ログ・ファイルのログ・メッセージを解析します。それ以外の形式のメッセージは解析されません。デフォルトの形式は、次のとおりです。

oracle.adfmf.util.logging.ConsoleHandler.formatter=oracle.adfmf.util.logging.PatternFormatter

oracle.adfmf.util.logging.PatternFormatter.pattern=[%LEVEL% - %LOGGER% - %CLASS% - %METHOD%] %MESSAGE%

ツールのページの上部の各コントロールの上にマウスを置くと、コントロールの機能の説明が表示されるので、画面に表示されるその他の手順に従い、ツールが表示するパフォーマンスに関する詳細を表示させます。

ツールは次の場所にMAFによりJARファイルにパッケージ化されます。

\jdeveloperInstall\jdev\extensions\oracle.maf\tools\PerformanceMonitorGraph.jar

次のコマンドを起動して、ツールを使用して収集したパフォーマンス・データをレンダリングします。

PathToJDK\java.exe –jar \jdeveloper\jdev\extensions\oracle.maf\tools\PerformanceMonitorGraph.jar PathToLogFileWithPerformanceData.txt –o OutputFileName

ここで、OutputFileNameはツールが生成するHTMLファイルのファイル名で、前述のコマンドを呼び出した場所から現在のディレクトリに書込みが行われます。ツール自体は.HTMLファイル拡張子をファイル名に追加します。これを行う必要はありません。

出力ファイルは -oまたは--output-fileのいずれかを使用して指定できます。

28.10 MAFアプリケーションでのWebサービス・コールの検査

MAFアプリケーションが、クライアント・データ・モデルの作成にデザインタイム・サポートを使用して構成されたRESTサービスにアクセスする場合は、再利用可能なアプリケーション機能を追加して、アプリケーションで行われるすべてのRESTコールのリクエストとレスポンスの詳細を表示できます。

クライアント・データ・モデルの詳細は、「MAFアプリケーションでのクライアント・データ・モデルの作成」を参照してください。アプリケーションにこの機能を追加するには、次の手順を実行します。

1. JDeveloperで、「アプリケーション」メニューに移動し、「アプリケーションのプロパティ」オプションを選択します。「アプリケーションのプロパティ」ダイアログが表示されます。

2. 「アプリケーションのプロパティ」ダイアログで、「ライブラリとクラスパス」オプションをクリックします(図28-17を参照)。

図28-17 「アプリケーションのプロパティ」ダイアログ

3. 「アプリケーションのプロパティ」ダイアログで、「JAR/ディレクトリの追加」ボタンをクリックします。「アーカイブまたはディレクトリの追加」ダイアログが表示されます。

4. 「アーカイブまたはディレクトリの追加」ダイアログで、ディレクトリ./jdevinstall/jdeveloper/jdev/extensions/oracle.maf/FARs/CDMに移動し、WebServiceCallsFeature.jarファイルを選択し、「開く」ボタンをクリックします(図28-18を参照)。

図28-18 「アーカイブまたはディレクトリの追加」ダイアログ

5. WebServiceCallsFeature.jarファイルが、「ライブラリとクラスパス」の下に表示されます。「OK」をクリックして「アプリケーションのプロパティ」ダイアログを閉じます。

6. maf-application.xmlファイルをエディタで開き、「機能参照」オプションを選択します。右側の緑のプラス・アイコンをクリックし、「機能ID」ドロップダウン・リストからoracle.maf.impl.cdm.wscallsを選択します(図28-19を参照)。

図28-19 maf-application.xmlファイル

7. MAFアプリケーションをデプロイして、Webサービス・コールを検査できるアプリケーション機能を表示します(図28-20を参照)。

図28-20 RESTコールの表示

8. リスト内のいずれかのRESTコールをクリックして、すべてのリクエストとレスポンスの詳細を表示できます。

29 機能アーカイブ・ファイルによるMAFアプリケーション・コンテンツの再使用

この章では、機能アーカイブ(FAR)ファイルの概要と、これらのファイルにアプリケーション機能のコンテンツをパッケージ化して、1つ以上のMAFアプリケーションで再利用する方法について説明します。

この章の内容は次のとおりです。

- 機能アーカイブ・ファイルの概要

- MAFアプリケーションでのFARコンテンツの使用方法

- FARのライブラリとしての追加時に行われる処理

- FARのビュー・コントローラ・プロジェクトとしての追加時に行われる処理

- 機能アーカイブ・リソースの再使用の有効化に関する必知事項

29.1 機能アーカイブ・ファイルの概要

機能アーカイブ・ファイルとは、別のMAFアプリケーションで再利用するためにアプリケーション機能をパッケージ化したJARファイルです。機能アーカイブ・ファイルには、アプリケーション機能のコンポーネントが格納されていてます。このファイルは、アプリケーション・ライブラリとして追加することも、ビュー・コントローラ・プロジェクトとして追加することもできます。

アプリケーション機能は、機能アーカイブ・ファイル(FAR)と呼ばれるJARファイルにパッケージ化されると、他のMAFアプリケーションが使用できる再利用可能なコンテンツを提供します。MAFアプリケーションは1つ以上のFARファイルを使用できます。FARファイルには、アイコンのイメージ、リソース・バンドル、HTMLファイル、JavaScriptファイル、その他の実装固有のファイルなど、アプリケーション機能が必要とするすべてのものが格納されています。

また、FARには、パッケージ化された各アプリケーション機能を一意のIDで識別する、1つのmaf-feature.xmlファイルも含まれています。このファイルを編集することで、コンテンツ実装(MAF AMX、ローカルHTML、リモートURL)などのアプリケーション機能プロパティを更新し、ユーザー・ロールや権限またはデバイス・プロパティなどのファクタに基づいてプロパティを表示できます。

アプリケーション・ライブラリとしてFARを追加することも、ビュー・コントローラ・プロジェクトとして追加することもできます。プロジェクト・ライブラリとして追加したFARのコンテンツはカスタマイズできません。また、そのコンテンツの個別のアーティファクトを再利用することもできません。FARがライブラリ・ファイルとして追加される場合、MAアプリケーションではFAR全体が使用されます。たとえば、FARのタスク・フローは、タスク・フロー・コール・アクティビティのターゲットになることはできません。ただし、「MDSを使用したMAFアプリケーションのアーティファクトのカスタマイズ」で説明されているように、FARをビュー・コントローラ・プロジェクトとして追加すると、そのアーティファクトをカスタマイズできるようになります。

29.2 MAFアプリケーションでのFARコンテンツの使用方法

アプリケーション機能は、その機能を使用するアプリケーションのクラスパスに追加することで、MAFアプリケーションで使用できるようになります。

注意:

FARは、アプリケーション・コントローラ・プロジェクトにのみ追加でき、ビュー・コントローラ・プロジェクトにFARを追加することはできません。

FARがconnections.xmlファイルで定義する接続がそれを使用するアプリケーションのconnections.xmlでも定義されている場合、接続は使用するアプリケーションに追加されず、FARはアプリケーションに追加されません。

始める前に:

「機能アーカイブのデプロイメント・プロファイルのデプロイ方法」の説明に従って、アプリケーション機能を機能アーカイブ・ファイルとしてデプロイします。

アプリケーション機能コンテンツをライブラリとしてMAFアプリケーションに追加するには:

1. 「リソース」ウィンドウを開き、「新規」、「IDE接続」、「ファイルシステム」の順にクリックします。

2. 「ファイルシステム接続」ダイアログに入力し、機能アーカイブJARファイルを格納するディレクトリへのファイル接続を作成します。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

3. 「リソース」ウィンドウで、機能アーカイブ・ファイル(JARファイルとして示されている)を右クリックします。

4. 「名前を付けてアプリケーションに追加」をクリックして、「ライブラリ」をクリックし、これを使用するアプリケーションのクラスパスを追加します(図29-1を参照)。

図29-1 ライブラリとしてのFARのMAFアプリケーションへの追加

ヒント:

使用するアプリケーションのクラスパスから機能アーカイブJARを削除するには、「ライブラリをアプリケーションから削除」をクリックします。

FARをビュー・コントローラ・プロジェクトとして追加するには:

1. 「リソース」ウィンドウを開き、「新規」、「IDE接続」、「ファイルシステム」の順にクリックします。

2. 「ファイルシステム接続」ダイアログに入力し、機能アーカイブJARファイルを格納するディレクトリへのファイル接続を作成します。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

3. 「リソース」ウィンドウで、機能アーカイブ・ファイル(JARファイルとして示されている)を右クリックします。

4. 「名前を付けてアプリケーションに追加」をクリックして、「ViewControllerプロジェクト」をクリックします(図29-2を参照)。

図29-2 ビュー・コントローラ・プロジェクトとしてのFARのMAFアプリケーションへの追加

29.3 FARのライブラリとしての追加時に行われる処理

FARファイルは、アプリケーションのクラスパスに手動で追加することも、アプリケーションで使用できるように「リソース」に機能を追加することもできます。「リソース」ウィンドウでアプリケーション機能を追加または削除する手順を使用してください。

FARをライブラリとして(または手動でアプリケーションのクラスパスに)追加した場合:

- FARのコンテンツが、「アプリケーション・リソース」の「ライブラリ」ノードの下に表示されます(図29-3を参照)。

図29-3 使用するアプリケーションの「アプリケーション・リソース」に表示されるFAR JARファイル

- JARに含まれるmaf-feature.xmlファイルで宣言されたすべてのアプリケーション機能は、アプリケーションで使用できるようになります(図29-4を参照。ドロップダウンには、JAR内の使用可能なアプリケーション機能のIDと、アプリケーション内で定義済のIDが表示されています)。

図29-4 様々なmaf-feature.xmlファイルで定義されたアプリケーション機能の参照

ヒント:

機能アーカイブJARをアプリケーションのクラスパスに手動で追加すると、アプリケーション機能が機能参照の挿入ダイアログにも表示されるようになります。

または、次のように「リソース」ウィンドウからアプリケーション機能を追加したり、削除することもできます。

1. 「リソース」ウィンドウで、機能アーカイブJARを開きます。

2. 「MAF機能」フォルダから、アプリケーション機能を右クリックします。

3. 「機能参照をmaf-application.xmlに追加」(図29-5を参照)、または「機能参照をmaf-application.xmlから削除」(図29-6を参照)を選択します。図29-5に、MAF_DevGuideExample.jarからの人々というアプリケーション機能の追加を示しています。

図29-5 機能参照の追加

図29-6に、maf-application.xmlファイルからのアプリケーション機能参照の削除を示しています。

図29-6 機能参照の削除

29.4 FARのビュー・コントローラ・プロジェクトとしての追加時に行われる処理

ビュー・コントローラ・プロジェクトとしてFARが追加されると、connections.xmlファイルが作成され、ビュー・コントローラ・プロジェクトで使用できるようにFARに.classとJARファイルが含まれます。

FARをビュー・コントローラ・プロジェクトとして追加する場合:

- MAFは、インポートしたFARと同じ名前のビュー・コントローラ・プロジェクトを生成します。図29-7に、MAFで、StockTracker (図29-2のStockTrackerFAR.jarを参照)というインポートしたFARファイルに対してビュー・コントローラ・プロジェクト(.jprファイル)を作成する方法を示しています。「ビュー・コントローラ・プロジェクトのリソースについて」で説明されているように、このビュー・コントローラ・プロジェクトには、MAFビュー・コントローラ・プロジェクトのデフォルトの構造およびメタデータ・ファイルが含まれています。特に、FARビュー・コントローラ・プロジェクトには、maf-feature.xmlファイルが含まれています。MAFアプリケーションに他のビュー・コントローラ・プロジェクトが含まれている場合、いずれのプロジェクトにもIDが同じアプリケーション機能が含まれていないことを確認する必要があります。「機能アーカイブ・リソースの再使用の有効化に関する必知事項」も参照してください。

図29-7 MAFアプリケーション内のビュー・コントローラ・プロジェクトとしてインポートしたFAR

- ライブラリとしてインポートしたFARと同様に、機能アーカイブJARにあるconnections.xmlファイル内の情報は、それを使用するアプリケーションのconnections.xmlファイルにマージされます。ターゲット・アプリケーションにconnections.xmlファイルが存在しない場合、MAFではこのファイルが作成されます。

- MAFでは、FARに含まれる.classおよびJARファイルをビュー・コントローラ・プロジェクトでライブラリとして使用できるように、これらをそのlibディレクトリ(C:\jdeveloper\mywork\application\FAR view controller project\libなど)にコピーします。MAFでは、これらのファイルをclassesFromFar.jarというファイルにコンパイルします。

- ライブラリとしてインポートしたFARとは異なり、ビュー・コントローラ・プロジェクトのファイルはカスタマイズできます。

注意:

FARに含まれているオリジナルのリソース・バンドルは、生成されたビュー・コントローラ・プロジェクトでは使用できない可能性があるため、「リソース・バンドルでのカスタマイズの有効化」の説明に従って、このプロジェクト内に新しいリソース・バンドルを作成する必要があります。

- ライブラリとしてインポートしたFARと同様に、FARのmaf-feature.xmlファイル内で宣言されたすべてのアプリケーション機能は、それ使用するアプリケーションで使用できるようになります。

29.5 機能アーカイブ・リソースの再使用の有効化に関する必知事項

FARのリソースは、いくつかの条件(プロジェクトに固有のパッケージ階層や機能参照IDに対する一意のパッケージ・ネーミング・システムなど)が満たされている場合にのみアプリケーションで使用できます。

FARのリソースをアプリケーションで使用可能にするためには、FARの名前とその機能参照IDが両方ともグローバルに一意である必要があります。重複した機能参照IDがmaf-application.xmlファイルに存在しないことを確認します。FARの内部では、DataControl.dcxファイルが一意のパッケージ・ディレクトリ内に存在する必要があります。これらのパッケージ・ディレクトリのデフォルト名をそのまま使用するのではなく、プロジェクト用に一意のパッケージ階層を作成します。機能参照IDについても、同じようなパッケージ・ネーミング・システムを使用します。

30 MAF共有ライブラリによるMAFアプリケーション・コンテンツの再使用

この章では、タスク・フロー、AMXページ・フラグメント、CSSファイルなどのコンテンツをMAF共有ライブラリ(共有ライブラリ)にパッケージし、再使用するために他のMAFアプリケーションに配布する方法について説明します。

この章の内容は次のとおりです。

- MAF共有ライブラリによるMAFアプリケーション・コンテンツの再使用の概要

- 共有ライブラリ用のMAFアプリケーションの作成

- 共有ライブラリ用のMAFアプリケーションへのアーティファクトの追加

- 共有ライブラリ用のMAFアプリケーションのデプロイ

- MAFアプリケーションでの共有ライブラリの使用

- 共有ライブラリ・アーカイブのファイル名が重複したMAFアプリケーションのデプロイ

- 共有ライブラリでのCordovaプラグインの使用方法

30.1 MAF共有ライブラリによるMAFアプリケーション・コンテンツの再使用の概要

共有ライブラリにより、コンテンツを共有し、複数のMAFアプリケーションで再使用できます。

たとえば、タスク・フローを共有ライブラリに入れ、そこから複数のMAFアプリケーションで使用できるようにすることができます。共有できる他のコンテンツ・タイプには、AMXページ・フラグメント、イメージ、CSS、JavaScriptファイルに加え、iOS用のカスタム起動画面、カスタム・ログイン・ページなどのHTMLページが含まれます。FARがアプリケーション機能を共有するのに対して、共有ライブラリは、タスク・フローなどの個々のアーティファクトを共有するために使用するという点で、共有ライブラリは機能アーカイブ(FAR)と異なります。

他のMAFアプリケーション開発者がアプリケーションで使用できる共有ライブラリを開発する場合は、次のワークフローを使用します。

1. 共有ライブラリ用のMAFアプリケーションのアプリケーション・テンプレートを使用して、アプリケーションを作成します。このテンプレートには、共有ライブラリに必要なファイルおよびディレクトリ構造と、共有ライブラリをデプロイするためのデプロイメント・プロファイルが用意されています。「共有ライブラリ用のMAFアプリケーションの作成」を参照してください。

2. タスク・フローなど、共有ライブラリで配布するアーティファクトを追加します。「共有ライブラリ用のMAFアプリケーションへのアーティファクトの追加」を参照してください。

3. 共有ライブラリをデプロイし、その共有ライブラリに含まれるアーティファクトをMAFアプリケーションが再使用できることを確認して、共有ライブラリをテストします。「共有ライブラリ用のMAFアプリケーションのデプロイ」および「MAFアプリケーションでの共有ライブラリの使用」を参照してください。

4. 完成した共有ライブラリを含むZIPファイルを配布します。

他のMAFアプリケーション開発者が作成した共有ライブラリを使用する場合、JDeveloperの「リソース」ウィンドウで、他のMAFアプリケーション開発者が配布した共有ライブラリのZIPファイルからの抽出を含むディレクトリへのファイル・システム接続を作成します。その後、共有ライブラリをアプリケーションに追加できます。「MAFアプリケーションでの共有ライブラリの使用」を参照してください。

30.2 共有ライブラリ用のMAFアプリケーションの作成

他のMAFアプリケーションと共有するアーティファクトを共有ライブラリ用のMAFアプリケーションに追加します。

共有ライブラリ用のMAFアプリケーションの作成は、他のMAFアプリケーションとアーティファクトを共有する最初の手順です。これにより、2つのプロジェクト(ApplicationControllerLibraryおよびViewControllerLibrary)と、共有ライブラリの内容を説明するlibrary-content.xmlファイルが作成されます。共有ライブラリ用のアプリケーションと関連するプロジェクトを作成した後、次のタスクを実行します。

- 「共有ライブラリ・ルート・ディレクトリの設定方法」の説明に従って、ApplicationControllerLibraryおよびViewControllerLibraryプロジェクトのMAFライブラリ・ルート・ディレクトリのプロパティの値を調べ、一意であることを確認します

- 「共有ライブラリ用のMAFアプリケーションへのアーティファクトの追加」の説明に従って、共有するアーティファクトを追加します。

- 「コンシューマへの共有ライブラリの内容の説明方法」の説明に従って、共有ライブラリをコンシューマに説明します。

30.2.1 共有ライブラリ用のMAFアプリケーションの作成方法

JDeveloperの「新規ギャラリ」から呼び出したアプリケーション・ウィザードを使用して、共有ライブラリ用のMAFアプリケーションを作成します。

共有ライブラリを作成する手順:

1. メイン・メニューで「ファイル」を選択し、次に「アプリケーション」→「新規」を選択します。

2. 「新規ギャラリ」の「アイテム」リストで、「共有ライブラリ用のモバイル・アプリケーション・フレームワーク・アプリケーション」をダブルクリックします。

3. 共有ライブラリ用のモバイル・アプリケーション・フレームワーク・アプリケーションウィザードで、名前、ディレクトリ、アプリケーション・パッケージの接頭辞など、アプリケーションの詳細情報を入力します。ウィザードの残りのページのヘルプを参照するには、「ヘルプ」をクリックします。
ウィザードのプロジェクト1名前ページに、ApplicationControllerLibraryプロジェクトを完了するために必要な機能のリストが表示されます。ウィザードのプロジェクト2名前ページに、ViewControllerLibraryプロジェクトを完了するために必要な機能のリストが表示されます。
各プロジェクトのJava設定の構成ページで指定するデフォルト・パッケージの値の一意性を確保します。これにより、ライブラリ・ルート・ディレクトリのプロパティの値の一意性を確保され、「共有ライブラリ・アーカイブのファイル名が重複したMAFアプリケーションのデプロイ」に記載されているような、共有ライブラリのコンシューマのデプロイメントの問題が回避されます。

4. 「終了」をクリックします。

30.2.2 共有ライブラリ用のMAFアプリケーションの作成時に行われる処理

JDeveloperは、2つのプロジェクトと、それらのプロジェクトが必要とする様々なファイルを使用して、新しいアプリケーションを作成します。

図30-1は、新しく作成された共有ライブラリ用のMAFアプリケーションを示しています。

図30-1 新しく作成された共有ライブラリ用のMAFアプリケーション

例30-1は、新しく作成された共有ライブラリ用のMAFアプリケーションの内容を示しています。2つのプロジェクト(ApplicationControllerLibraryおよびViewControllerLibrary)が含まれており、他のMAFアプリケーションで使用するために配布するアーティファクトを追加します。また、共有ライブラリを説明するファイルであるlibrary-content.xmlファイルも含まれています。

例30-1 新しく作成された共有ライブラリ用のMAFアプリケーションの内容

MAFappForSharedLib
+---.adf
|   \---META-INF
|           library-content.xml
+---.data
|   ...
+---ApplicationControllerLibrary
|   |   ApplicationControllerLibrary.jpr
|   |
|   +---adfmsrc
|   |   +---application
|   |   |   \---library
|   |   |           DataControls.dcx
|   |   |
|   |   \---META-INF
|   |           adfm.xml
|   |
|   \---public_html
|       \---application
|           \---library
|               \---ApplicationControllerLibrary
|                   \---resources
\---ViewControllerLibrary
|   ViewControllerLibrary.jpr
|
\---public_html
\---mobile
\---library
\---ViewControllerLibrary
\---resources

30.2.3 共有ライブラリ・ルート・ディレクトリの設定方法

MAFライブラリ・ルート・ディレクトリのプロジェクト・プロパティに対して、MAFアプリケーションが使用する共有ライブラリのすべてのプロジェクトで一意の値を設定します。

Javaパッケージの名前などに命名規則を採用し、ライブラリ・ルート・ディレクトリのプロパティの一意性を確保します。これにより、複数の共有ライブラリを使用するMAFアプリケーションで共有ライブラリを使用できます。ライブラリ・ルート・ディレクトリのプロパティの値が同じ共有ライブラリがすでにアプリケーションに含まれている場合、MAFは共有ライブラリをそれを使用するMAFアプリケーションに追加しません。

ライブラリ・ルート・ディレクトリの設定手順:

1. 「アプリケーション」ウィンドウで、MAFライブラリ・ルート・ディレクトリのプロジェクト・プロパティを設定するプロジェクトをダブルクリックします(ViewControllerLibraryなど)。

2. 「プロジェクト・プロパティ」ダイアログで「MAFライブラリ」を選択し、「MAFライブラリ」ページを表示します。
MAFライブラリ・ルート・ディレクトリのプロジェクト・プロパティのデフォルトの値は、共有ライブラリのMAFアプリケーションおよびプロジェクト名の作成時に指定するJava設定の構成ページのデフォルト・パッケージの値を連結したものです。

3. 図30-2に示すように、プロパティの一位の値を設定し、「OK」をクリックします。

図30-2 MAFライブラリ・ルート・ディレクトリのプロパティ

30.2.4 コンシューマへの共有ライブラリの内容の説明方法

library-content.xmlファイルを使用して、共有ライブラリを正常に使用するために知る必要がある、バージョン番号、依存性の説明など、共有ライブラリの情報をコンシューマに提供します。

library-content.xmlファイルで説明する必要がある依存性の一例に、MAFがカスタムCordovaプラグインを共有ライブラリにパッケージ化しないため、共有ライブラリで必要なカスタムCordovaプラグインがあります。共有ライブラリのコンシューマは、必要なカスタムCordovaプラグインを個別に取得する必要があります。

コンシューマに共有ライブラリの内容を説明する手順:

1. 「アプリケーション・リソース」パネルで、「ディスクリプタ」および「ADF META-INF」ノードを開き、「library-content.xml」をダブルクリックします。

2. ソース・エディタで、共有ライブラリの名前、バージョン番号、共有ライブラリの目的の説明を追加します。
例30-2は、library-content.xmlファイルを示しています。

注意:
MAFはデプロイ時に、共有ライブラリの作成時に使用されたMAFのバージョンをlibrary-content.xmlファイルに挿入します。

例30-2 library-content.xmlファイル

<library-container
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/adf/mf/sharedlibrary"
name="DocExample">

<version>2.1</version>
<library-description>
This library includes a task flow that enables end users to edit employee details.
</library-description>

</library-container>

30.3 共有ライブラリ用のMAFアプリケーションへのアーティファクトの追加

共有するアーティファクトを共有ライブラリ用のMAFアプリケーションの適切なプロジェクトに追加します。

共有ライブラリ用のMAFアプリケーションのテンプレートでは、2つのプロジェクト(ApplicationControllerLibraryおよびViewControllerLibrary)が作成されます。リソースが使用されるMAFアプリケーションのプロジェクトに対応するライブラリ・プロジェクトにリソースを追加してください。たとえば、iOSデバイスでデフォルトのMAFの起動画面の代わりの起動画面を表示するために追加するカスタムHTMLページは、MAFアプリケーションのApplicationControllerプロジェクトにパッケージ化されます。このアーティファクトを共有ライブラリで配布する場合、共有ライブラリ用のMAFアプリケーション内のApplicationControllerLibraryプロジェクトに追加します。

一般的に、CSSファイル、イメージ、カスタム・ログイン・ページなどのHTMLページを共有するには、ApplicationControllerLibraryプロジェクトを使用します。AMXページ・フラグメント、タスク・フロー、CSSファイル、イメージおよびJavaScriptファイルを共有するには、ViewControllerLibraryを使用します。

アーティファクトを使用するのに必要な依存性が共有ライブラリに追加してください。たとえば、データ・コントロールの基礎となるログイン接続およびJavaクラスを含めます。MAFは、共有ライブラリのデプロイ時に、これらの依存性を共有ライブラリにパッケージ化して、共有ライブラリを使用するMAFアプリケーションが使用できるようにします。1つの例外は、Cordovaプラグインです。MAFは、Cordovaプラグインを共有ライブラリにパッケージ化しません。Cordovaプラグインについては、「コンシューマへの共有ライブラリの内容の説明方法」に従って、依存性を説明するエントリをlibrary-content.xmlファイルに追加して、共有ライブラリのコンシューマに、共有ライブラリとは別にCordovaプラグインを取得する必要があることを通知します。また、共有ライブラリのコンシューマは、共有ライブラリのデプロイ時にMAFが生成するjar-maf-plugins.xmlファイルを参照して、必要なすべてのCordovaプラグインがMAFアプリケーションに登録されていることを確認できます。

JDeveloperの「新規ギャラリ」を使用して、共有ライブラリに追加するアーティファクトを作成します。たとえば、MAFログイン接続を共有ライブラリに追加する場合、「新規ギャラリ」を起動し、「新規ギャラリ」の検索入力フィールドに「login」と入力して、MAFログイン・サーバー接続のエントリをすばやく見つけることができます。JDeveloperは、アーティファクトと関連するファイルおよびメタデータを適切なプロジェクトに生成します。たとえば、共有ライブラリでログイン接続を作成すると、共有ライブラリのADF META-INFディレクトリにconnections.xmlファイルが作成されます。この方法に従って、他のアーティファクトを共有ライブラリに追加できます(タスク・フロー、AMXページ・フラグメントなど)。

共有するすべてのアーティファクトをライブラリ・ルート・ディレクトリに作成します。ただし、タスク・フローまたはCSSファイルを共有ライブラリに作成する際、JDeveloperはデフォルトでライブラリ・ルート・ディレクトリに移動しません。これらのアーティファクトを作成するには、ライブラリ・ルート・ディレクトリまたはルート・ディレクトリのサブディレクトリに移動してください。これを行わない場合、共有するアーティファクトはデプロイされる共有ライブラリにパッケージ化されません。たとえば、図30-3では、タスク・フローを作成するため、ViewControllerLibraryディレクトリまたはサブディレクトリを選択します。

図30-3 ライブラリのルート・ディレクトリでのタスク・フローの作成

30.4 共有ライブラリ用のMAFアプリケーションのデプロイ

作成した共有ライブラリをテスト、または完成した共有ライブラリをMAFアプリケーションで使用するアプリケーション開発者に配布するため、共有ライブラリ用のMAFアプリケーションをデプロイします。

共有ライブラリ用のMAFアプリケーションをデプロイした後、ZIPファイルに格納して他のMAFアプリケーション開発者に配布できます。これらの開発者は、MAFアプリケーションで共有ライブラリを使用するため、ZIPの中身を抽出し、JDeveloperの「リソース」ウィンドウから抽出ディレクトリへのファイル・システム接続を追加します。配布前に、JDeveloperの「リソース」ウィンドウでdeployディレクトリのコンテナ・ディレクトリ(MAFappForSharedLibRootDir/deploy/MafSharedLibraryContainer)へのファイル・システム接続を作成し、テスト用に作成するMAFアプリケーションで共有ライブラリを使用することにより、共有ライブラリをテストできます。「MAFアプリケーションでの共有ライブラリの使用」を参照してください。

MAFには、次のすぐに使用できるデプロイメント・プロファイルが用意されています。

- MafSharedLibraryContainer1

- ApplicationControllerLibrary_MafSharedLibraryArchive1 to JAR file

- ViewControllerLibrary_MafSharedLibraryArchive1 to JAR file

前述のデプロイメント・プロファイルを使用するか、JDeveloperが生成するZIPファイルの名前など、デプロイメント・オプションをカスタマイズする場合は、独自のデプロイメント・プロファイルを作成します。

デプロイメント・プロファイルが作成するファイル名が一意で、共有ライブラリのコンシューマが容易に区別できることを確認することをお薦めします。デフォルトでは、MafSharedLibraryContainer1デプロイメント・プロファイルにより、ZIPファイルの名前が付けられ、MafSharedLibraryContainer1.zipが生成されます。同様に、プロジェクトレベルのデプロイメント・プロファイル(ViewControllerLibraryおよびApplicationControllerLibrary)により、JARファイルが生成され、ViewControllerLibrary1.jarおよびApplicationControllerLibrary1.jarが生成されたJARファイルの名前に付加されます。図30-4の左側は、2つの共有ライブラリ(SharedLibOneおよびSharedLibTwo)を使用するMAFアプリケーションの「アプリケーション」および「リソース」ウィンドウで、それぞれ生成されたJARファイルとZIPファイルのデフォルトのファイル名が表示されています。図30-4の右側は、「MAF共有ライブラリ・コンテナ・オプション」ページで、生成されたZIPファイルのデフォルト名を編集できます。ZIPおよびJARファイル名を生成するデプロイメント・プロファイルを編集することにより、エンド・ユーザーは共有ライブラリを区別しやすくなり、デプロイメントの問題を回避できる場合があります。データ・プロファイルの編集の詳細は、「デプロイメント・プロファイルでの作業」を参照してください。

図30-4 デフォルトのファイル名を含む共有ライブラリおよびデフォルトのファイル名を編集するためのデプロイメント・プロファイル

30.4.1 共有ライブラリ用のMAFアプリケーションのデプロイ方法

共有ライブラリをZIPファイルにデプロイするMAF共有ライブラリ・コンテナのデプロイメント・プロファイルを使用して、共有ライブラリ用のMAFアプリケーションをデプロイします。

MAFアプリケーションを共有ライブラリにデプロイする手順:

1. JDeveloperのメイン・メニューから、「アプリケーション」→「デプロイ」→「MafSharedLibraryContainer1」を選択します。
ここで、「MafSharedLibraryContainer1」は、デプロイメント・プロファイルの名前です。

2. 表示されるダイアログのリストから「MAF共有ライブラリ・コンテナZIPファイルにデプロイします。」オプションを選択し、「終了」をクリックします。

30.4.2 共有ライブラリ用のMAFアプリケーションのデプロイ時に行われる処理

JDevelopeは、MafSharedLibraryContainerデプロイメント・プロファイルを使用して、次のアーティファクトを含むZIPファイル(デフォルト名MafSharedLibraryContainer1.zip)を作成します。

//Contents of MafSharedLibraryContainer1.zip
|   ApplicationControllerLibrary_MafSharedLibraryArchive1.jar
|   ViewControllerLibrary_MafSharedLibraryArchive1.jar
|
\---META-INF
jar-maf-plugins.xml
library-content.xml
MANIFEST.MF
oracle.adf.common.services.ResourceService.sva

ZIPのJARファイルには、共有ライブラリ用のMAFアプリケーション内の各プロジェクトからのリソースが含まれます。ただし、ZIPファイルを共有ライブラリのコンシューマに配布する必要があります。

30.5 MAFアプリケーションでのプラグインの使用

MAFアプリケーションに含まれるアーティファクトを再使用できるよう、ファイル・システムの共有ライブラリへのIDE接続を作成します。

library-content.xmlファイルの内容を調べ、共有ライブラリをMAFアプリケーションで正常に使用するために実装する必要がある依存性が含まれているかどうか確認します。たとえば、Cordovaプラグインを取得し、MAFアプリケーションに登録する必要がある場合があります。共有ライブラリの作成者は、共有ライブラリを含むZIPファイルを配布する前に、library-content.xmlファイルに依存性が含まれていることを確認してください。ファイル・システムの共有ライブラリへのIDE接続を作成した後、library-content.xmlファイルの内容を確認できます。

共有ライブラリをアプリケーションに追加した後、共有ライブラリを使用するMAFアプリケーションのAMXページで、AMXページ・フラグメントなど共有ライブラリのアーティファクトを使用できます。

30.5.1 MAFアプリケーションでの共有ライブラリの使用方法

共有ライブラリのZIPファイルから抽出したものを含むディレクトリへのファイル・システムのIDE接続を追加します。これにより、共有ライブラリのアーティファクトをJDeveloperの「リソース」ウィンドウからMAFアプリケーションで使用できるようになります。

共有ライブラリの作成者が共有ライブラリをテストする場合、共有ライブラリ用のMAFアプリケーションのdeployディレクトリの子コンテナ・ディレクトリ(MAFappForSharedLibRootDir/deploy/MafSharedLibraryContainer)へのファイル・システムのIDE接続を作成し、共有ライブラリをテストするために作成したMAFアプリケーションで使用します。

MAFアプリケーションで共有ライブラリを使用する手順:

1. 「リソース」ウィンドウで、「新規」、「IDE接続」、「ファイルシステム」の順にクリックします。

2. 「ファイルシステム接続」ダイアログに入力し、抽出された共有ライブラリのZIPファイルを格納するディレクトリへのファイル接続を作成します。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

3. MAFアプリケーションでプロジェクト(ApplicationControllerなど)を選択します。

注意:
MAFアプリケーションに複数のViewControllerプロジェクトが存在する場合、共有ライブラリのリソースを追加するViewControllerプロジェクトを選択します。ViewControllerプロジェクトを選択しない場合、MAFは、「アプリケーション」ウィンドウの最初のViewControllerプロジェクトに共有ライブラリのリソースを追加します。

4. 図30-5に示すように、MAFライブラリを右クリックし、「アプリケーションに追加」を選択します。

ヒント:
同じディレクトリを選択し、MAFアプリケーションが共有ライブラリを使用する際に有効化される「アプリケーションから削除」オプションを選択して、共有ライブラリをMAFアプリケーションから削除できます。

図30-5 JDeveloperの「リソース」ウィンドウの共有ライブラリ

5. MAFアプリケーションで適切なダイアログ・ピッカーを使用して、MAFアプリケーションで使用する共有ライブラリのリソースを参照します。

a. 共有ライブラリからAMXページ・フラグメントを参照するには、図30-6に示すように、AMXページ・フラグメントをAMXページに追加し、src属性を共有ライブラリのページ・フラグメントの場所に設定します。

図30-6 共有ライブラリのAMXページ・フラグメントの使用

b. 共有ライブラリのタスク・フローを使用するには、maf-feature.xmlファイルの概要エディタの「コンテンツ」タブから参照するか、タスク・フロー・コール・アクティビティをタスク・フローに追加します。

maf-feature.xmlファイルの概要エディタの「コンテンツ」タブから参照するには、図30-7に示すように、maf-feature.xmlファイルの概要エディタの「コンテンツ」タブで「参照」アイコンをクリックし、共有ライブラリからタスク・フローを選択します。

図30-7 共有ライブラリのタスク・フローの使用

タスク・フロー・コール・アクティビティを使用するには、図30-8に示すように、タスク・フロー・コール・アクティビティをタスク・フローに追加し、「プロパティ」ウィンドウから呼び出す「プロパティの編集」ダイアログを使用して、共有ライブラリのタスク・フローに移動します。

図30-8 タスク・フロー・コール・アクティビティによる共有ライブラリのタスク・フローの呼出し

ダイアログ・ピッカーを使用できないユース・ケースとしては、MAFアプリケーションのCSSファイルの共有ライブラリからのイメージの参照があります。現在のCSSファイルから共有ライブラリのイメージ・ファイルへの相対ファイル・パスを使用して、イメージを参照します。

相対パスを作成するには、現在のCSSファイルからWebコンテンツ・フォルダ(ファイル・システムのpublic_html)に移動します。その後、共有ライブラリ・プロジェクトのライブラリ・ルート・ディレクトリのプロパティおよび追加のサブディレクトリの値、および参照したいイメージのファイル名を付加します。

図30-9に、ライブラリ・ルート・ディレクトリのプロパティがapppackprefix/application/library/ApplicationControllerLibraryの共有ライブラリ・プロジェクトのimageサブディレクトリのac_img.pngイメージ・ファイルを参照する例を示します。イメージを参照するCSSファイルは、public_htmlディレクトリから2ディレクトリ分離れています。そのため、CSSファイルのイメージに使用する相対ファイル・パスは次のようになります。

"../../apppackprefix/application/library/ApplicationControllerLibrary/image/ac_img.png"

ヒント:
図30-9に示すように、JDeveloperで「表示」→「アプリケーション・プロジェクト」→「ライブラリの表示」を選択して、「アプリケーション」ウィンドウの共有ライブラリを表示します。

図30-9 CSSファイルの共有ライブラリからのイメージの参照

30.5.2 共有ライブラリ用のMAFアプリケーションの使用時に行われる処理

MAFは、共有ライブラリのApplicationControllerLibraryプロジェクトの内容をMAFアプリケーションのApplicationControllerプロジェクトに追加します。同様に、共有ライブラリのViewControllerLibraryプロジェクトの内容はMAFアプリケーションのViewControllerプロジェクトに追加されます。

MAFは、共有ライブラリのJARファイルをそれらを使用するMAFアプリケーションに追加します。これらのJARファイルはこれらを使用するMAFアプリケーションの「アプリケーション」ウィンドウで表示できます(図30-10を参照)。これらのライブラリを表示するには、JDeveloperで「表示」→「アプリケーション・プロジェクト」→「ライブラリの表示」を選択します。

図30-10 使用するMAFアプリケーションでの共有ライブラリ

共有ライブラリが、それを使用するMAFアプリケーションを開発するのに使用しているバージョンと異なるバージョンのMAFを使用して作成された場合、MAFは共有ライブラリをMAFアプリケーションに追加しません。つまり、リリース2.4.0.0.1で開発された共有ライブラリは、リリース2.4.0.0.2で開発されたMAFアプリケーションで使用できますが、リリース2.4.0.1.1では使用できません。使用するMAFアプリケーションを作成するのに使用するMAFのリリースをサポートするには、共有ライブラリの作成者は共有ライブラリをアップグレードする必要があります。また、既存のライブラリ・ルート・ディレクトリがMAFアプリケーションが使用する既存の共有ライブラリのライブラリ・ルート・ディレクトリと一致する場合も、MAFは共有ライブラリをMAFアプリケーションに追加しません。共有ライブラリ・ルート・ディレクトリの値の変更の詳細は、「共有ライブラリ・ルート・ディレクトリの設定方法」を参照してください。

共有ライブラリで定義する接続は、共有ライブラリを使用するMAFアプリケーションの接続とマージされます。次の例のように、MAFは、共有ライブラリからMAFアプリケーションのconnections.xmlファイルに追加する各接続を識別するコメントを追加します。

<!--
The following connections were added by MAF Shared Library 'DocExample': test
-->

コメントでは、接続のソースおよび接続の名前が識別されます。前述の例では、'DocExample'は、共有ライブラリの名前(library-content.xmlファイルのname属性に指定された値)を参照し、testは、接続の名前を参照します。library-content.xmlファイルのname属性の値が指定されていない場合、MAFはコンテナZIPの名前(MafSharedLibraryContainer1など)を使用します。たとえば、MAFアプリケーションが接続をconnections.xmlファイルにマージした共有ライブラリを使用しなくなった場合や、後述するように、新しいバージョンの共有ライブラリにアップグレードする場合に、このコメントを使用して、MAFアプリケーションのconnections.xmlファイルから削除できる接続を識別できます。また、JDeveloperは、次の例に示すように、共有ライブラリから追加された接続と、接続を使用する前にさらなる構成が必要かどうかを識別するメッセージを「ログ」ウィンドウに表示します。

[04:42:06 AM] These connections were added by the Add to Application operation.
[04:42:06 AM] {
[04:42:06 AM]    test - new, incomplete LoginConnection connection will be added. Configure before use.
[04:42:06 AM] }

MAFが共有ライブラリおよびそれを使用するMAFアプリケーションで重複された接続が定義されていることを検出した場合、共有ライブラリの接続情報をマージせず、MAFアプリケーションから共有ライブラリを削除します。使用するMAFアプリケーションのconnections.xmlファイルは変更されません。MAFアプリケーションが使用する新しいバージョンの共有ライブラリにアップグレードする場合は、MAFアプリケーションと共有ライブラリに重複する接続が存在するため、MAFによりアップグレードが妨げられることがないよう、既存の接続をMAFアプリケーションから削除するか、共有ライブラリの作成者と連携して、既存の接続をMAFアプリケーションから削除します。

30.6 共有ライブラリ・アーカイブのファイル名が重複したMAFアプリケーションのデプロイ

共有ライブラリの内容をパッケージ化する複数のJARに同じファイル名を使用する共有ライブラリによる、使用するMAFアプリケーションのデプロイ方法について説明します。

2つの共有ライブラリ(SharedLib_OneおよびSharedLib_Two)を使用するコンシューマ・アプリケーションがあると仮定します。これらの共有ライブラリには、ルート・ディレクトリのプロパティに一意の値が設定されています。たとえば、test/mobile/library/ViewControllerLibrary_SharedLib_Oneは、 SharedLib_One共有ライブラリのViewControllerLibraryプロジェクトの値です。同様に、他のプロジェクトのルート・ディレクトリの値は、共有ライブラリのアプリケーションの名前(SharedLib_OneまたはSharedLib_Two)を付加しているため、一意です。ただし、これらの共有ライブラリのアプリケーションの作成者は、2つの共有ライブラリを作成する際、アプリケーション・パッケージの接頭辞に同じ値(test)を選択しました。

これらの共有ライブラリのデプロイメント・プロファイルが生成するZIPおよびJARファイルのファイル名はデフォルト値のままで、2つの共有ライブラリのアプリケーションは、同じファイル名でZIPおよびJARファイルにパッケージ化されています。

|   MafSharedLibraryContainer1.zip
...
|   test_application_library_ApplicationControllerLibrary1.jar
|   test_mobile_library_ViewControllerLibrary1.jar

2つの共有ライブラリのアプリケーションの各プロジェクトのルート・ディレクトリのプロパティに一意の値が設定されているため、コンシューマ・アプリケーションは正常に2つの共有ライブラリを追加できます。ただし、2つの共有ライブラリのアプリケーションの追加後にコンシューマ・アプリケーションをデプロイしようとすると失敗し、次のメッセージがJDeveloperの「ログ」ウィンドウに表示されます。

[11:45:00 AM] ----  Deployment started.  ----
...
[11:45:07 AM] Deployment cancelled.
[11:45:07 AM] ----  Deployment incomplete  ----.
[11:45:07 AM] Failed deployment to Android emulator. Encountered exception: Cannot deploy the
MAF Shared Libraries included in the application because one or more MAF Shared Library
archive files have the same name and are configured to be included in the same archive
destination directory.

アプリケーションレベルのデプロイメント・プロファイルが呼び出すプロジェクトレベルのFARデプロイメント・プロファイルは、生成されたデプロイメントJARのlibディレクトリに共有ライブラリJARをパッケージ化するため、デプロイメントが失敗します。これは、ViewControllerプロジェクトのViewController_MobileFeatureArchive1.jarです。MAFが同じファイル名を持つ2つの共有ライブラリJARを検出した場合、libディレクトリの別の共有ライブラリJARで上書きせずに、デプロイメントを中止します。

前述のシナリオは、共有ライブラリの作成者が、最初に共有ライブラリを作成したり、デプロイメント・プロファイルを編集して、前述のデフォルト値以外のファイル名を生成する際に、アプリケーション・パッケージの接頭辞の値の一意の命名規則を採用していれば回避できました。使用するMAFアプリケーションのアプリケーション開発者は、プロジェクトレベルのFARデプロイメント・プロファイルを編集し、MAFが同じファイル名を持つ2番目の共有ライブラリJARをパッケージ化する2番目のディレクトリ(lib2など)を作成することにより、この問題を回避し、アプリケーションを正常にデプロイできます。この構成の変更により、デプロイメントが正常に行われ、MAFは、プロジェクトレベルのデプロイメントJAR内の次のディレクトリ構造に2つの共有ライブラリJARをパッケージ化します。次の例では、ViewControllerプロジェクトのAndroidへのデプロイメントが仮定されています。

ViewController_MobileFeatureArchive1.jar
+---lib
|   |   test_mobile_library_ViewControllerLibrary1.jar
+---lib2
|   |   test_mobile_library_ViewControllerLibrary1.jar
+---META-INF
...
|
\---public_html
...

ApplicationControllerおよびViewControllerの2つのプロジェクトレベルのデプロイメント・プロファイルでこの構成の変更を実行します。

デプロイメント・プロファイルを編集する手順:

1. 「アプリケーション」ウィンドウでプロジェクトをダブルクリックし、表示される「プロジェクト・プロパティ」ダイアログで「デプロイメント」ノードをダブルクリックします。

2. プロジェクトのデプロイメント・プロファイルを選択し、編集アイコンをクリックして、プロパティのダイアログを開きます。
デフォルト名は、ProjectName_MobileFeatureArchive1 (MAF Feature Archive)です。

3. 表示されるダイアログで「ファイル・グループ」ノードを選択し、「新規作成」をクリックします。

4. 「ファイル・グループの作成」にLibraries2などの名前を入力し、「ライブラリ」ラジオ・ボタンを選択し、「OK」をクリックします。

5. 新しく作成されたLibraries2ファイル・グループで、「アーカイブのターゲット・ディレクトリ」プロパティを一意の値(lib2など)に設定します。

6. 「コントリビュータ」ノードの最初のライブラリのチェック・ボックスの選択を解除します。

7. 最初のLibrariesファイル・グループの「コントリビュータ」ノードで、2番目のライブラリのチェック・ボックスの選択を解除します(図30-11を参照)。

図30-11 ファイル名が重複した共有ライブラリ・アーカイブの2番目のファイル・グループ・ライブラリの定義の作成

8. 「OK」をクリックしてダイアログを閉じ、MAFアプリケーションを再度デプロイする前に、「ビルド」→「すべてクリーンし、アプリケーションをリフレッシュ」をクリックします。

30.7 共有ライブラリでのCordovaプラグインの使用方法

デプロイされる共有ライブラリには、その共有ライブラリが使用するCordovaプラグインは含まれていません。共有ライブラリとは別にCordovaプラグインを取得し、それを使用するMAFアプリケーションに登録する必要があります。

MAFは、共有ライブラリのMETA-INFディレクトリのjar-maf-plugins.xmlファイルのファイル名を使用して、maf-plugins.xmlファイルの変更されたコピーをパッケージ化します。jar-maf-plugins.xmlファイルのすべてのCordovaプラグインのpath属性を空の文字列に設定します。MAFアプリケーションが共有ライブラリを使用する場合、jar-maf-plugins.xmlファイルの内容は、それを使用するMAFアプリケーションのmaf-plugin.xmlファイルとマージされません。jar-maf-plugins.xmlファイルを使用して、共有ライブラリが必要とするすべてのCordovaプラグインが、それを使用するMAFアプリケーションのmaf-plugins.xmlファイルに登録されていることを確認します。

Cordovaプラグインの詳細は、「MAFアプリケーションでのプラグインの使用方法」を参照してください。

31 EMMソリューションとのMAFアプリケーションの統合

この章では、モバイル・アプリケーションを管理するためのツールおよびベスト・プラクティスを提供するAppConfig Community、エンタープライズ・モバイル・アプリケーションへのMAFアプローチ、ならびにAirWatch、MobileIronおよびBlackberryからのEMMソリューションを使用するMAFアプリケーションの管理について説明します。

この章の内容は次のとおりです。

- AppConfig Communityの概要

- エンタープライズ・モバイル・アプリケーションへのMAFアプローチについて

- EMMソリューションによるMAFアプリケーションのアクセス制御

- EMMソリューションを使用するMAFアプリケーション構成の管理方法

- AirWatch EMMソリューションを使用するMAFアプリケーションの管理

- MobileIron EMMソリューションを使用するMAFアプリケーションの管理

- Blackberry EMMソリューションを使用するMAFアプリケーションの管理

- EMMソリューションによる使用のためのMAFアプリケーションでのプロパティの構成

31.1 AppConfig Communityの概要

AppConfig Communityでは、モバイル・エンタープライズ・アプリケーションの保護、構成、デプロイおよび管理のためのツールとベスト・プラクティスが提供されます。

AppConfig Communityは、VMware AirWatch、MobileIron、IBM MaaS360およびJAMF Softwareといったエンタープライズ・モバイル管理(EMM)組織によって形成されており、保守されます。このコミュニティは、モバイル・エンタープライズ・アプリケーションの開発およびデプロイメントを合理化するために機能します。

コミュニティのツールおよびベスト・プラクティスは、次のことによって定義されます。

- オペレーティング・システム(OS)によって使用可能になる、ネイティブ・フレームワークの使用

- EMM固有の統合がないこと

エンタープライズ・モバイル・アプリケーションの開発のためのAppConfigアプローチでは、アプリケーションの構成および管理のための標準的なアプローチが提供されます。これは、それがiOSおよびAndroidプラットフォームのネイティブOS機能の範囲内のアプリケーション・セキュリティおよび構成フレームワークを基礎とするためです。AppConfigアプローチは、App Configuration for Enterprise (ACE)によって定義されています。「エンタープライズ・モバイル・アプリケーションへのMAFアプローチについて」を参照してください。

MAFアプリケーションでは、アプリケーション・トンネリング、アプリケーション構成、およびセキュリティ・ポリシーとアクセス制御の実装などのACE機能がサポートされています。MAFでは、AirWatch、MobileIronおよびBlackBerryからのサードパーティEMMソリューションとのアプリケーション統合がサポートされています。EMMソリューションとのMAF統合の詳細は、AirWatch EMMソリューションを使用するMAFアプリケーションの管理、MobileIron EMMソリューションを使用するMAFアプリケーションの管理およびBlackberry EMMソリューションを使用するMAFアプリケーションの管理を参照してください。

AppConfig Communityの詳細は、http://appconfig.org/を参照してください。

31.2 エンタープライズ・モバイル・アプリケーションへのMAFアプローチについて

MAFでは、エンタープライズ・モバイル・アプリケーションへのAppConfigアプローチが採用されており、ACEによって定義されている機能がサポートされています。

MAFでは、エンタープライズ・モバイル・アプリケーションへのAppConfigアプローチが採用されています。これは、それには商標で守られたソフトウェア開発キット(SDK)もアプリケーション・ラッピング・ツールも必要とならないためです。AirWatch、MobileIronおよびBlackberryとのMAF統合は、開発者がコンテナおよび2つのワークスペースを使用することなくベンダー中立のEMMアプリケーションを構築するのに役立ちます。

MAFでは、サードパーティEMMソリューションとのアプリケーション統合がサポートされています。その統合では、MAFアプリケーションを構築および保護するためにモバイル・オペレーティング・システムの機能の使用に重点が置かれています。MAFでは、ACEによって定義されている機能の提供が目的となっています。ACEは、エンタープライズ・アプリケーション管理のための標準を定義する構想です。ACEにより、アプリケーションをどのベンダーでも管理できるよう、モバイル・アプリケーション管理の共通基準を定義するアプリケーション開発フレームワークが提供されます。ACEの詳細は、http://www.appconfigforenterprise.org/を参照してください。

MAFアプリケーションでは次のACE機能がサポートされています。

- アプリケーション・トンネル: アプリケーションは、ファイアウォールの内側にあるサービスにアクセスする必要がある場合があります。デバイス・レベルのIPsec VPNには、接続性およびセキュリティに関する問題が伴います。これらの問題に対処するために、モバイル・オペレーティング・システムには、個々のアプリケーションがネットワークへのトンネルを作成できるよう、Per-App-VPN機能が用意されています。アプリケーション・トンネルは、アプリケーションからバックエンド・リソースへのゲートウェイまでのセキュア・ソケット・レイヤー(SSL)接続です。トンネルはアプリケーションごとに用意されるため、不正なアプリケーションがネットワークに入り込むことはできません。

- アプリケーション構成: ユーザーは、アプリケーションの設定時に、URL、ポート、電子メール・アドレス、ポート番号、テナントID、スキン構成およびその他の構成を入力します。EMMサーバーでは、AppConfig Communityによって推奨されているネイティブAPIを使用して、自動的にリモートでこれらの構成を設定できます。管理者はWebコンソールを使用して構成を入力し、その後、それらがアプリケーションにプッシュされます。開発者は、自身のアプリケーション内で構成キーのセットを定義します。EMM管理者は、EMMプロバイダの管理コンソールで同じキーおよび値を設定し、それらがアプリケーションにプッシュされます。「EMMソリューションによる使用のためのMAFアプリケーションでのプロパティの構成」を参照してください。

- シングル・サインオン: ユーザーは複数のシステムにサイン・オンする必要があり、しかもシステムごとに使用するユーザー名や認証技術が異なる場合もあります。シングル・サインオン(SSO)ソリューションを利用すると、ユーザーは、1回のみの認証で、複数のどのシステムに存在する情報にもアクセスできるようになります。SSOを利用すると、ユーザーが一度認証され、認証された識別情報がセキュアにネットワーク内を通過してリソースにアクセスします。アプリケーション開発者は、Identity Provider (IDP)に認証をフェデレートするためにSecurity Assertion Markup Language (SAML)規格を実装します。このSAML IDPは、Kerberos認証または証明書認証のどちらかを使用して構成されます。EMMソリューションでは、EMMプロバイダが使用可能なオペレーティング・システムAPIコールで構築された規格に基づいて、適切なKerberos資格証明および/または証明書が配布されます。

- セキュリティ・ポリシーおよびアクセス制御: アクセス制御により、アプリケーションが承認済デバイスでのみ実行されるようになります。この機能では、アプリケーション・レベルでセキュリティ・ポリシーが強制されます。組織は、機密データが企業の管理範囲を超えて移動されることがないよう、エンタープライズ・アプリケーション内でのセキュリティおよびデータ損失防止を必要としています。

- 暗号化: EMMベンダーは、デバイス上でパスコード・ポリシーを強制することで、エンタープライズ・アプリケーションのデータ保護を提供します。管理者は、デバイス上でパスコード・ポリシーを設定することで、デバイス・レベルの暗号化を有効にできます。

- Managed Open In: これは、iOSデバイス上の企業データのフローをIT制御下にあるアプリケーションのみに限定する、モバイル・アプリケーション管理機能です。

企業は、セキュリティ上の理由から、アプリケーション機能を無効にする必要がある場合もあります。

カスタム・セキュリティ・ポリシーの一般的実装には、次のものがあります。

- コピーおよび貼付けの無効化 – アプリケーション内からコピーおよび貼付け機能を無効にできます。

- デフォルト電子メール設定 – アプリケーション内で電子メール・メッセージを送信するために使用される、デフォルト電子メール・アプリケーションを指定できます。

- カメラの使用の無効化 - カメラの使用を無効にできます。

- スクリーンショットの取得の無効化 - スクリーンショットの取得を無効にできます。

31.3 EMMソリューションによるMAFアプリケーションのアクセス制御

MAFでは、SSO証明書、アプリケーション・トンネルおよびアプリケーション構成方法を使用して、AirWatch、MobileIronおよびBlackberry EMMソリューションによって管理されるMAFデバイスでのアクセス制御が強制されます。

アクセス制御は、iTunesおよびGoogle Playストアから直接ダウンロードされるアプリケーションへユーザーがログインすることを防止します。

アクセス制御は、次の3つの方法で強制できます。

- SSO証明書の使用: SSO認証で証明書を使用できます。アクセスは、管理対象デバイス上の準拠アプリケーションでのみ使用可能になる、シングル・サインオンのための証明書をプロビジョニングすることで制御されます。iTunesストアまたはGoogle Playストアから非管理対象デバイス上に個人用アプリケーションとしてアプリケーションをダウンロードしようとするユーザーは、認証できず、アプリケーションにログインできません。

- アプリケーション・トンネルの使用: アクセス制御は、アプリケーション・トンネル機能を使用して強制できます。企業は、IPアドレスに基づいて、安全なアプリケーション・トンネルを通ったユーザーからの接続のみを受け入れるよう、アプリケーションの認証ページを構成できます。アプリケーション・トンネル機能は、管理対象デバイス上の準拠アプリケーションでのみ利用可能です。iTunesストアまたはGoogle Playストアから非管理対象デバイス上に個人用アプリケーションとしてアプリケーションをダウンロードしようとするユーザーは、認証できず、アプリケーションにログインできません。

- アプリケーション構成の使用: MAFアプリケーション内で定義されているアプリケーションを利用して、アプリケーションへのアクセスを許可または拒否します。アプリケーションは、構成キー内で取得した値を使用し、それがtrueに設定されている場合は、アプリケーションへのアクセスを付与します。

31.4 EMMソリューションを使用するMAFアプリケーション構成の管理方法

MAFアプリケーションは、EMMソリューションと統合されて、アプリケーションレベルの構成をEMMサーバーでリモートで設定します。

AirWatch、MobileIronおよびBlackberryなどのEMMソリューションと統合することで、MAFアプリケーションに、EMMサーバーでリモートでアプリケーション・レベルの構成を設定する機能が提供されます。このサーバーには、その後、MAFアプリケーションによってアクセスできます。

アプリケーション構成により、ユーザーの設定プロセスを簡略化できます。AirWatch、MobileIronまたはBlackberryサーバーにより、一連の構成キーが送信されます。それらは、その後、開発者によって定義されます。組織の管理者は、EMM管理Webコンソールでキーおよび値を設定します。ここから、それらはMAFアプリケーションに送信されます。

MAFアプリケーションでは、URL、ポート、SSLの使用、グループまたはテナント・コード、ならびにユーザー名、電子メールおよびドメインなどのユーザー構成といった、バックエンド・サービス構成が実装されます。

カスタム・セキュリティ・ポリシーは、アプリケーション構成を使用して強制できます。一般的に、次のようなセキュリティ・ポリシーが実装されます。

- パブリック・クラウド同期の無効化: Dropboxなどのパブリック・クラウドとのアプリケーション・データの同期を無効にできます。

- コピーおよび貼付けの無効化: アプリケーション内からコピーおよび貼付け機能を無効にできます。

31.5 AirWatch EMMソリューションを使用するMAFアプリケーションの管理

AirWatch EMMソリューションとの統合は、MAFアプリケーションでセキュリティ・ポリシーによってデータ漏えい保護を実装するのに役立ちます。

AirWatchは、アプリケーションを保護および管理するEMMソリューションを提供します。AirWatchには、SDK、アプリケーション・ラッピング、およびAppConfig Communityに従うアプローチといった、中核的アプリケーション機能のセットを提供する3つの開発アプローチがあります。AirWatchと統合した場合、MAFはAppConfigアプローチに従います。MAFでは、AirWatchからのSDKおよびアプリケーション・ラッピングはサポートされていません。MAFでは、アプリケーション管理にネイティブの標準を利用するAirWatch機能のみがサポートされています。

MAFアプリケーションは、AirWatch管理コンソールを使用して管理できます。このコンソールでは、EMM管理者が、iOS構成プロファイルおよびAndroid for Work構成プロファイルを作成し、AirWatch管理コンソールに登録されている様々な管理対象デバイスにそれらを適用できます。ユーザーが自分のデバイスをAirWatch Agent Appに登録すると、そのデバイスに割り当てられているすべての構成プロファイルがダウンロードされ、適用されます。構成プロファイルには、EMM管理者にカメラおよびアプリケーション内のManaged Open Inなどの特定機能の有効化または無効化を許可する制限が含まれています。また、構成プロファイルには、Per Appレベル構成情報が含まれており、これにより、ファイアウォールの内側でホストされ、MAFアプリケーションによって使用される、MAFアプリケーションと様々なバックエンド・サービスとの間のセキュアなトンネリングが可能になります。

AirWatch EMMプラットフォームの詳細は、https://www.vmware.com/products/enterprise-mobility-management.htmlを参照してください。

中核的アプリケーション機能のセット

MAFでは、そのアプリケーションを保護するために、AirWatchテクノロジからEMMが使用されます。MAFでは、ACEを使用してMAFアプリケーションがAirWatchと統合されます。デバイスがAirWatchに登録され、アプリケーションがAirWatch App Catalogからインストールされるか、内部またはパブリック・アプリケーションがAirWatch管理コンソールにアップロードされる場合があります。AirWatchとの統合は、MAFで次のようなセキュリティ・ポリシーによってデータ漏えい保護を実装するのに役立ちます。

- 暗号化: iOSプラットフォーム、Android 5.0、およびそれ以上のプラットフォーム・バージョン上のMAFアプリケーションでは、暗号化を有効にできます。暗号化が有効になっている場合、MAFでは、ネイティブOS暗号化を使用して、アプリケーションを含めたデバイス全体のコンテンツが暗号化されます。

- Managed Open-In: iOSプラットフォーム、Android 5.0、およびそれ以上のプラットフォーム・バージョンで利用可能なDropboxやBoxなどのその他の非管理対象アプリケーション内で、管理対象アプリケーションに格納されているドキュメント開くことができます。iOSプラットフォームでは、この制限が有効になっている場合は、それはデバイス上のすべてのアプリケーションに適用されます。この制限を設定する場合は、電子メールを介したドキュメント共有機能をオフにします。MAFでは、電子メール・デバイス・サービスはオフになります。Androidプラットフォーム上でOpen In制限を有効にする場合、その制限は、デバイス全体ではなく各アプリケーションに適用されます。

- カメラ: デバイス上のカメラを有効または無効にする機能は、iOSプラットフォーム、Android 5.0、およびそれ以上のプラットフォームで利用可能です。iOSプラットフォームでは、カメラ制限が有効になっている場合、それはデバイス上のすべてのアプリケーションに適用されます。この制限は、アプリケーションごとには適用されません。Androidプラットフォームでは、カメラ制限は、デバイスに対してではなく各アプリケーションに適用されます。

- 電子メール: iOSプロファイルには、デバイスまたはアプリケーション・レベルで電子メール・アクセスを直接制御する制限はありません。Open In制限を設定すると、電子メールによるドキュメント共有機能はオフになります。MAFでは、Open In制限により、電子メール・デバイス・サービスがオフになります。

- AirWatch Tunnelによるアプリケーション・トンネリング: iOSプラットフォーム、Android 5、およびそれ以上のプラットフォーム・バージョン上のMAFアプリケーションには、Per App VPNモード機能(モバイル・デバイス上の個々のアプリケーションで利用可能なOSレベル機能)が提供されます。AirWatch Tunnelは、AirWatch管理コンソールでインストールおよび構成されるサーバー・コンポーネントです。AirWatch Tunnelでは、ネイティブのオペレーティング・システムAPIを使用して、MAFアプリケーションとセキュアな企業ネットワークとの間の転送中データを保護します。セキュア・トンネルにより、アプリケーションは、ネットワークとの通信時に分離されます。

- 安全なブラウザ統合: MAFアプリケーションからWebコンテンツにアクセスするユーザーは、アプリケーションからAirWatch Secure Browserにリダイレクトされます。MAFアプリケーションで「GoLink」をタップすると、AirWatch Secure Browserクライアントが起動されます。EMM管理者は、AirWatchコンソールでポリシーを設定できます。安全なブラウザ・クライアントが起動されると、アプリケーションにポリシーが適用され、設定ポリシーのコンプライアンスに応じてコンテンツがブロックまたは表示されます。

- 安全な電子メール統合: 新しいメールを作成するユーザーやドキュメントの添付などのタスクを実行するユーザーは、MAFアプリケーションからAirWatch Secure Browserにリダイレクトされます。AirWatchは、安全な電子メール・クライアントを起動するURLスキームを提供します。MAFアプリケーションで「GoLink」をタップすると、AirWatch Secure Emailクライアントが起動されます。EMM管理者は、AirWatchコンソールでポリシーを設定できます。安全な電子メール・クライアントが起動されると、アプリケーションにポリシーが適用され、設定ポリシーのコンプライアンスに応じてユーザーによるファイルの添付が許可されるか拒否されます。

VMware AirWatchモバイル・デバイス管理ガイドは、http://mobile34.ca/wp-content/uploads/2016/02/Mobile-Device-Management-Guide-v8_3.pdfでダウンロードできます。

AirWatchドキュメントについては、https://resources.air-watch.com/category/Documentationを参照してください。

31.6 MobileIron EMMソリューションを使用するMAFアプリケーションの管理

MobileIronからのEMMソリューションとの統合は、MAFでMobileIronの階層化されたセキュリティ・アプローチを使用してモバイル・デバイスでのデータ損失防止を実装するために役立ちます。

MAFは、アプリケーションを保護するために、MobileIronテクノロジからEMMと統合されます。MobileIronでは、ラッピング・ソリューション、SDKが提供され、ACE規格もサポートされています。MAFでは、MobileIronからのラッピング・ツールまたはSDKはサポートされていません。MAFでは、そのアプリケーションを保護するために、ACEが使用されます。ACEにより、開発者は、EMMソリューション全体にわたって機能するアプリケーションを開発できます。

MAFアプリケーションは、MobileIron Core管理コンソールを使用して管理できます。このCore管理コンソールでは、IT管理者が、iOS構成プロファイルおよびAndroid for Work構成プロファイルを作成し、MobileIron Coreコンソールに登録されている様々な管理対象デバイスにそれらを適用できます。

ユーザーが自分のデバイスをMobileIron Agentアプリケーションに登録すると、そのデバイスに割り当てられているすべての構成プロファイルがダウンロードされ、適用されます。構成プロファイルには、IT管理者にカメラおよびアプリケーション内のManaged Open Inなどの特定機能の有効化または無効化を許可する制限が含まれています。

また、構成プロファイルには、ファイアウォールの内側でホストされる、MAFアプリケーションと様々なバックエンド・サービスとの間のセキュアなトンネリングが可能になる、Per Appレベル構成情報が含まれています。バックエンド・サービスはMAFアプリケーションによって使用されます。

MobileIronセキュリティ・モデル

MobileIronでは、階層化されたセキュリティ・アプローチを使用して、モバイル・デバイスでのデータ損失防止が実装されます。階層化されたデータ損失防止モデルには、要件に直接対処する基本制御、追加的な制御を提供する補助制御、および使用可能な基本制御がない場合に適用される相殺制御が含まれています。たとえば、認証の場合は、デバイス・パスワードで基本制御を提供しながら、生体認証で基本制御を補います。

階層化されたセキュリティ・アプローチは、次の制御を使用して実装されます。

暗号化

暗号化は、iOS 9、Android 5.0、およびそれ以上のバージョンのデバイスで利用可能です。保存データおよび移動中データのためのMobileIron暗号化は、FIPS 140-2検証を含んでおり、オペレーティング・システムの埋込みの暗号化機能を補完します。MobileIronでは、次のタイプの暗号化が提供されます。

- デバイス上にある企業のすべての保存データの暗号化: EMMソリューションにより、すべてのアプリケーションで利用可能な、デバイス・レベルの暗号化を可能にするために、デバイス・パスワードが強制されます。

- デバイスとの間で移動中の、企業のすべてのデータの暗号化: 電子メール、アプリケーション、ドキュメントおよびWebページを含めた企業のモバイル・データは、MobileIron Sentry(デジタル証明書およびトランスポート・レイヤー暗号化の使用によって攻撃およびインターセプトから保護するゲートウェイ)を通過します。

- セキュアなアプリケーション内にある企業のすべてのデータの暗号化: iOSおよびAndroidの埋込みの暗号化に加えて、MobileIronでは、コンテナ化を使用して、暗号化を含めた追加のセキュリティ制御が提供されます。

データ共有

モバイル・オペレーティング・システムのOpen In機能により、アプリケーションでデータを共有できます。MobileIronでは、ITで、どのアプリケーションがアプリケーション・データにアクセスするためにこの機能を使用するかを制御できます。また、iOSプラットフォームでこの制限を設定すると、電子メールによるドキュメント共有機能がオフになります。MAFでは、電子メール・デバイス・サービスはオフになります。

コピーおよび貼付け機能: iOSプラットフォームでは、管理対象アプリケーションの間でのコンテンツのコピーおよび貼付けの機能を制御するためのネイティブの制限は提供されません。MAF開発者は、カスタムCordovaプラグインを実装することで、この制限を強制できます。これは、バッファをクリアするためのネイティブiOS APIをコールします。

スクリーンショット取得機能: MobileIronでは、デバイス全体にわたりスクリーンショット取得機能を無効にすることもできます。

電子メール: Androidプラットフォームでは電子メールに関する制限はありません。iOSプラットフォームの場合は、電子メール・サービスを管理する制限はありませんが、Managed Open-In制限を設定することで、管理対象アプリケーション内の電子メールをオフにできます。

ネットワーク・セキュリティ

アプリケーション・トンネリング: MobileIronでは、電子メール、アプリケーション、ドキュメントおよびWebトラフィックを含めたすべての企業データのためのセキュアなアプリケーション・レベル・トンネリングが提供されます。ITにより、セキュアなチャネル上を伝送される企業データのフローを非企業データから分離できます。

VPN: デバイス全体でVPNテクノロジを標準化するために、MobileIronでは、データのためのセキュアなチャネルを提供するようVPNサービスを構成します。MobileIronでは、PerApp VPNによるビジネス・データへのセキュアなアクセスが提供されます。

MobileIron TunnelによるPer-App-VPNでは、MAFアプリケーションにおいて次のことがサポートされています。:

- プロキシ・サーバーとして機能するMobileIron Sentryを介してネットワーク・リクエストをトンネリングすることによる、非Oracleクラウド上でホストされる、基本認証で保護されたAPIへのアクセス

- プロキシ・サーバーとして機能するMobileIron Sentryを介してネットワーク・リクエストをトンネリングすることによる、Oracle Mobile Cloud Serviceでホストされた保護されていないAPIへのアクセス

- プロキシ・サーバーとして機能するMobileIron Sentryを介してネットワーク・リクエストをトンネリングすることによる、Oracle Mobile Cloud Serviceでホストされる、基本認証で保護されたAPIへのアクセス

MobileIron Sentryは、モバイル・デバイスとバックエンドのエンタープライズ・システムとの間のトラフィックを管理、暗号化および保護する、MobileIronプラットフォーム内のゲートウェイです。

安全なブラウザ統合

MAFアプリケーションからWebコンテンツにアクセスするユーザーは、アプリケーションからMobileIron Secure Browserにリダイレクトされます。MAFアプリケーションで「GoLink」をタップすると、MobileIron Secure Browserクライアントが起動されます。MobileIronは、安全なブラウザ・クライアントを起動するURLスキームを提供します。EMM管理者は、MobileIronコンソールでポリシーを設定できます。安全なブラウザ・クライアントが起動されると、アプリケーションにポリシーが適用され、コンプライアンスに応じてコンテンツがブロックまたは表示されます。

安全な電子メール統合

新しいメールを作成するユーザーやドキュメントの添付などのタスクを実行するユーザーは、MAFアプリケーションからMobileIron Secure Emailにリダイレクトされます。MobileIronは、安全な電子メール・クライアントを起動するURLスキームを提供します。MAFアプリケーションで電子メールのリンクをタップすると、MobileIron Secure Emailクライアントが起動されます。EMM管理者は、MobileIronコンソールでポリシーを設定できます。安全な電子メール・クライアントが起動されると、アプリケーションにポリシーが適用され、設定ポリシーのコンプライアンスに応じてユーザーによるファイルの添付が許可されるか拒否されます。

MobileIronドキュメントについては、https://community.mobileiron.com/を参照してください。

31.7 Blackberry EMMソリューションを使用するMAFアプリケーションの管理

Blackberryエンタープライズ・モバイル管理ソリューションとの統合は、MAFでBlackBerryセキュリティ・ポリシーによってアプリケーションを保護するのに役立ちます。

MAFアプリケーションは、BlackBerry管理コンソールを使用して管理できます。管理コンソールでは、EMM管理者が、iOS構成プロファイルなどの構成プロファイルを作成し、Blackberry管理コンソールに登録されている様々な管理対象デバイスにそれらを適用できます。ユーザーが自分のデバイスをBlackBerry Agentアプリケーションに登録すると、そのデバイスに割り当てられているすべての構成プロファイルがダウンロードされ、適用されます。構成プロファイルには、EMM管理者にカメラおよびアプリケーション内のManaged Open Inなどの特定機能の有効化または無効化を許可する制限が含まれています。構成プロファイルには、Per-Appレベル構成情報も含まれています。この情報により、ファイアウォールの内側でホストされる、MAFアプリケーションと様々なバックエンド・サービスとの間のセキュアなトンネリングが可能になります。バックエンド・サービスはMAFアプリケーションによって使用されます。

Blackberry EMMソリューションは、MAFアプリケーションに次のような機能を提供します。

- 暗号化: iOSプラットフォームでは、BESにより、ネイティブOS暗号化を使用してデバイスおよびアプリケーションに格納されるコンテンツを暗号化する機能が提供されます。BES 12では、FIPSで検証された暗号化モジュールを使用して、ファイルに直接格納され、間接的に書き込まれるすべてのデータが暗号化されます。BES 12では、デバイス全体および作業領域の暗号化の両方がサポートされています。一部のデバイスにデータの暗号化を強制するために、ITポリシー・ルールを使用することもできます。

- Managed Open Inは、Apple iOS 7モバイル・オペレーティング・システムでリリースされたセキュリティ機能です。この機能により、ITで、従業員がデータにアクセスするためにどのアプリケーションを使用できるかを構成できます。iOS 9でサポートされているこの機能では、管理対象アプリケーションに格納されているドキュメントを、DropboxやBoxなどのその他の非管理対象アプリケーション内で開く機能を管理します。BESでは、Open-in管理がモバイル・アプリケーション管理(MAM)メジャーとしてサポートされており、iOSデバイスのためのエンタープライズ・データ損失防止(DLP)戦略の一部としてそれが使用されます。

- コピーおよび貼付け機能: コピーおよび貼付けに関する制限では、テキストおよび/または画像のコピーと貼付けを制限することで、データ損失防止の方法が実装されます。この機能により、iOSデバイス上の様々なモバイル・アプリケーションの間でのコンテンツのコピーおよび貼付けの機能を管理します。カスタムCordovaプラグインを使用して、管理対象アプリケーションと非管理対象アプリケーションの間でのコピーおよび貼付けの機能を有効化または無効化できます。

- デバイス機能: アプリケーション使用中のカメラの使用を制限するデバイス機能により、管理者が、エンタープライズ設定でカメラ使用を制限できます。ツールでも、スクリーンショットの取得を防止できます。これらの制限は、iOS 9およびAndroidデバイス上のアプリケーションで利用可能です。電子メールなどの個人用クラウド・アプリケーションは、企業データを伝達および格納するように設計されていません。モバイル・デバイスの所有者がそのような目的で使用すると、企業はより大きなデータ損失の危険性にさらされることになります。電子メールに関する制限では、どのアプリケーションからユーザーが電子メール・メッセージを送信できるかが決定されます。

- Per-App VPN: MobileIron Tunnelを使用するiOSおよびAndroidプラットフォーム上のアプリケーションでは、企業ネットワークに戻るセキュアなチャネルを介して特定のアプリケーションからのすべての通信を自動的にルーティングする、仮想プライベート・ネットワーク(VPN)オンデマンドおよびダイレクト・アプリケーション・トンネルが利用可能です。VPNにより、デバイスと企業ネットワークの間の暗号化トンネルが提供されます。VPNソリューションは、デバイス上のVPNクライアント、およびVPNコンセントレータで構成されます。デバイスでは、企業ネットワークへのゲートウェイとして機能するVPNコンセントレータで認証するために、VPNクライアントが使用されます。Per-App VPNを使用して、デバイス上のどの作業アプリケーションおよびセキュア・アプリケーションがデータの伝送にVPNを使用するかを指定します。Per-App VPNは、裁量のあるトラフィックのみがVPNを使用できるようにすることで、組織でのVPN負荷を減少させるために役立ちます。たとえば、VPNは、企業のファイアウォールの内側にあるアプリケーション・サーバーまたはWebページにアクセスするために使用できます。

Blackberryセキュリティに関するドキュメントについては、http://help.blackberry.com/en/bes12-security/current/を参照してください。

31.8 EMMソリューションによる使用のためのMAFアプリケーションでのプロパティの構成

MAFアプリケーションのmaf-application.xmlファイル内でプロパティを構成します。管理者は、アプリケーションがユーザーにデプロイされるときに、EMMソフトウェアを使用してプロパティの値を構成できます。

<adfmf:emmAppConfig>要素を使用して、アプリケーションのmaf-application.xmlファイル内のプロパティを構成できます。次のサンプルmaf-application.xmlファイルでは、定義されている多数のプロパティを示します。

<adfmf:emmAppConfig>
<adfmf:property name="serverURL" type="String" description=“URL to connect the backend service"/>
<adfmf:property name="port" type="Integer" description=“Port number of the backend service”/>
<adfmf:property name=“enableEncryption" type=“Boolean" description=“Turn on app level encryption”/>
<adfmf:property name=“refreshDate" type=“Date" description=“Date on which application will be refreshed”/>
</adfmf:emmAppConfig>

EMM管理者は、EMMコンソールでこれらのプロパティの値を構成します。次に、EMMソフトウェアによって、MAFアプリケーションがインストールされているデバイスにそれらの値がプッシュされます。この機能は、AndroidおよびiOSプラットフォームにデプロイされたMAFアプリケーションでのみサポートされます。EMMソフトウェアで、<adfmf:emmAppConfig>要素で指定されるデータ型がサポートされていることを確認してください。前述の例では、指定されたプロパティのデータ型はString、Integer、BooleanおよびDateです。

EMMコンソールで対応するプロパティ値を構成する方法およびEMMソフトウェアでサポートされるデータ型の詳細は、EMMベンダーのドキュメントを参照してください。

#{EMMConfigProperties} EL式を使用して、MAFアプリケーションのアプリケーション・ライフサイクル内でプロパティ値を読み取ることができます。たとえば、serverURLプロパティの値を読み取るには、#{EMMConfigProperties.serverURL}のようにEL式を記述します。

次を呼び出して、プロパティの変更をリスニングするプロパティ変更リスナーを登録することもできます。

EMMAppConfigScope.getInstance().addPropertyChangeListener(this);

A MAFアプリケーションのトラブルシューティング

この付録では、MAFアプリケーションの様々な側面の問題、およびそれらの問題の診断方法と解決方法について説明します。

この付録の内容は次のとおりです。

- iOSシミュレータでの入力コンポーネントの問題

- コード署名が原因でデプロイメントが失敗する

- credentials属性によりデプロイメントが失敗する

A.1 iOSシミュレータでの入力コンポーネントの問題

マウスで入力テキスト・フィールドを移動すると、あるフィールド内のテキストが、その次のフィールドに流出します。フィールドの移動に、iOSシミュレータのキーボードを使用すると、この問題が解決されます。

問題:

iOSシミュレータにデプロイされたMAFアプリケーションでは、マウスを使用してあるフィールドから別のフィールドに移動すると、<amx:inputText>コンポーネント・フィールドに入力されたテキストが、その別のフィールドに入力されたテキストの先頭に添付されます。たとえば、名、ミドル・ネーム、姓を入力するテキスト・フィールドがあるページで、名のフィールドにJohnと入力し、ミドル・ネームのフィールドをクリックしてPと入力すると、テキストはJohnPと表示されます。同様に、姓のフィールドをクリックしてSmithと入力すると、そのフィールドのテキストは、図A-1に示されているように、JohnPSmithと表示されます。

図A-1 以降の<amx:inputText>フィールドにおけるテキスト値の連結

注意:

この動作は、iOSシミュレータとWebページでのみ発生し、実際のデバイスでは発生ません。

解決策:

シミュレータで、入力テキスト・フィールド間を移動する場合は、マウスではなく、キーボードを使用します。

A.2 コード署名が原因でデプロイメントが失敗する

コード署名データをMachオブジェクト・ファイルに追加すると、iOSプラットフォームのコード署名エラーによるデプロイメントの失敗の問題が解決します。

問題:

iOS開発環境では、コード署名エラーにより、MAFアプリケーションのデプロイメントが失敗する場合があります。

解決策:

確実にMAFアプリケーションに署名するには、CODESIGN_ALLOCATEを使用して環境を構成することによって、コード署名データをMach-O (Machオブジェクト)ファイルに追加します。たとえば、ターミナルから次の文字列を入力します。

export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/usr/bin/codesign_allocate"

詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『codesign_allocate(1) OS X Manual Page』および『OS X ABI Mach-O File Format Reference』を参照してください。

A.3 credentials属性によりデプロイメントが失敗する

認証モード(connections.xmlファイルでauthenticationMode属性を使用することで定義されている場合)により、JDeveloperがデプロイメントを取り消すために発生するcredentials属性の問題が解決します。

問題:

maf-feature.xmlファイルのadfmf:feature要素に定義されたcredentials属性が存在すると、JDeveloperではデプロイメントが取り消され、デプロイメント・ログに次のようなエラーが書き込まれます。

XML validation failed for file
/Users/jsmith/jdeveloper/mywork/MobileApplication/ViewController/src/META-INF/maf-feature.xml.
[12:26:44 PM] The file contains the following errors:
Error (Line 3, Column 44): Attribute credentials not defined on element adfmf:feature
Error (Line 10, Column 49): Attribute credentials not defined on element adfmf:feature
Error (Line 19, Column 51): Attribute credentials not defined on element adfmf:feature
Error (Line 35, Column 69): Attribute credentials not defined on element adfmf:feature
Error (Line 50, Column 65): Attribute credentials not defined on element adfmf:feature
[12:26:50 PM] Deployment canceled.
[12:26:50 PM] ----  Deployment incomplete  ----.
[12:26:50 PM] XML validation failed.

解決策:

ADFモバイルで作成したアプリケーションを移行する場合、maf-feature.xml (<adfmf:feature id="feature1" name="feature1" credentials="remote">など)で一度定義された認証モードが、connections.xmlファイルのauthenticationMode属性を使用して定義されていることを確認する必要があります。JDeveloperの監査ルールにより、credentials属性が存在することを検出し、maf-feature.xmlファイルからこの属性を削除することができます。

autneticationMode属性に対して有効な値はlocalおよびremoteのみであるため、none (<adfmf:feature id="feature1" name="feature1" credentials="none">)の値をauthenticateionMode属性に移行するとデプロイメントが失敗するため、移行しないでください。「MAFアプリケーションの認証プロセスの概要」を参照してください。

B ローカルHTMLおよびアプリケーション・コンテナAPI

この章では、MAF JavaScript API拡張機能、MAFコンテナ・ユーティリティAPI、およびカスタムHTML SpringboardアプリケーションなどのHTMLアプリケーション機能を対象としたAdfmfJavaUtilities APIの使用方法について説明します。

この章の内容は次のとおりです。

- MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成

- MAFコンテナ・ユーティリティAPI

- getDirectoryPathRootメソッドを使用したファイル・アクセス

B.1 MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成

JavaScript API拡張機能をコールすることで、HTMLで作成されたカスタム・スプリングボード・ページにナビゲーション機能を追加します。

JavaScriptを使用してJavaScript API拡張機能をコールすることで、HTMLで作成されたカスタムSpringboardページにナビゲーション機能を追加できます。「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」で説明したように、JavaScript <script>タグにメソッドを追加することで、コールバックを有効にしてApache Cordovaを使用できます。次の例は、このタグを使用したCordovaのコール方法を示しています。

...
<script type="text/javascript">if (!window.adf) window.adf = {};
adf.wwwPath =
"/~maf.device~/www/";</script>
<script type="text/javascript" src="/~maf.device~/www/js/base.js"></script>
...

base.jsのインクルード時に仮想パス/~maf.device~/を使用して、ブラウザがリクエストをリモート・サーバーではなくMAFリソースに対するものとして識別できるようにすることをお薦めします。このアプローチはリモートとローカルの両方のHTMLページで機能するので、(提供元にかかわらず) base.jsをHTML機能にインクルードする方法として最適です。「リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化」を参照してください。

ヒント:

www/jsディレクトリにアクセス(およびその場所を確認)するには、まずMAFアプリケーションをデプロイした後、deployディレクトリに移動する必要があります。www/jsディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリはtemporary_xcode_projectディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(.apk)ファイルのassetsディレクトリ内にあります。リリース・モードでのWindowsのデプロイメントの場合、ディレクトリの場所はappLocationOnMachine\deploy\deploymentprofilename\release\MafTemplate\www\jsです。「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」も参照してください。

注意:

デザインタイムにはパスが存在しないので、JavaScriptインクルードは、JDeveloperによってソース・エディタ内ではエラーとして赤い波型の下線で強調表示されます。このパスは実行時に解決されます。

Cordova APIに対するMAF拡張機能では、モバイル・デバイスのAPIによってmaf-feature.xmlおよびmaf-application.xmlファイルの構成メタデータにアクセスできるようになります。これにより、モバイル・デバイスとMAFのインフラストラクチャ間の通信が確立します。これらの拡張機能は、アプリケーション機能の表示動作も指示します。

デフォルトのMAF Springboardページ、springboard.amx、およびカスタマイズされたSpringboardの構築に使用できるApplicationFeaturesデータ・コントロールの詳細は、「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

B.1.1 カスタムHTMLページ内のコードの実行

カスタムHTMLページでは、MAFによるロードの完了後に、handlePageShownコールバック関数のshowpagecompleteイベントをリスニングすることで、独自のコードを呼び出すことができます。

次の例は、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コールバックの使用方法

非同期のJavaScriptでは、どの関数にも結果を返すsuccessコールバックと例外を返すfailedコールバックの2つのコールバック関数が追加されています。

JavaとJavaScriptのシグネチャは一致します。Javaでは、シグネチャは同期化され、直接結果が戻されます。JavaScriptは非同期なので、結果を返すsuccessコールバックと、スローされた例外を戻すfailedコールバック2つのコールバック関数が各関数に追加されます。Javaメソッドでは、success値は関数またはメソッドから戻され、例外はメソッドから直接スローされます。次の例の疑似コードは、引数を使用しないコールpublic static functionName() throwsが、Java内でtryおよびcatchブロックを使用してどのように実行されるかを示しています。

...
try {
result = AdfmfContainerUtilities.functionName();
}
catch() {
...
}

...

JavaScriptのコールは非同期なので、関数の実行が完了した時点で、コールバック・メカニズムを通して戻す必要があります。次の例の疑似コードは、JavaScriptコールのシグネチャを示しています。

adf.mf.api.functionName(
function(successFunction, failureFunction ) { alert("functionName complete"); },
function(successFunction, failureFunction ) { alert("functionName failed with " +
adf.mf.util.stringify(failureFunction); }
);

JavaScriptのコールは非同期なので、結果を戻すことができません。そのかわりに、関数の実行の完了時にコールバック・メカニズムが必要になります。成功および失敗のコールバックのシグネチャは、どちらもfunction(request, response)です。ここでrequest引数は実際のリクエストのJSON表現です。responseはメソッドから戻されたもののJSON表現です(successコールバック関数の場合)。failedコールバック関数の場合は、スローされた例外のJSON表現になります。

注意:

JavaScriptコールを呼び出して、スタックの深度や競合状態などの問題を回避するには、その前にコールバック関数を呼び出す必要があります。

次の例の疑似コードは、public static <return value> <function name>(<arg0>, <arg1>, ...) throws <exceptions>など、1つ以上の引数を使用するコールが、Java内でtry-catchブロックを使用してどのように実行されるかを示しています。

try {
result = AdfmfContainerUtilities.<function_name>(<arg0>, <arg1>, ...);
}
catch(<exception>) {
...
}

ローカルHTMLまたはリモートURLとして定義されたページからMAF JavaScript APIを起動する方法の詳細は、「リモート・アプリケーションによるコンテナ・サービスへのアクセスの有効化」を参照してください。

B.2.2 コンテナ・ユーティリティAPIの使用方法

リストに示されたメソッドを使用して、コンテナ・ユーティリティAPIを使用します。

コンテナ・ユーティリティAPIでは、次のメソッドが提供されます。

- getApplicationInformation: MAFアプリケーションのメタデータを取得します。

- gotoDefaultFeature: デフォルトのアプリケーション機能をアクティブ化します。

- gotoFeature: 特定のアプリケーション機能をアクティブ化します。

- getFeatures: アプリケーション機能を取得します。

- getFeatureByName: アプリケーション機能の名前を使用して、アプリケーション機能に関する情報を取得します。

- getFeatureById: IDを使用してアプリケーション機能を取得します。

- resetFeature: アプリケーション機能をロード時の状態にリセットします。

- resetApplication: アプリケーションをリセットします。

- gotoSpringboard: Springboardをアクティブ化します。

- showSpringboard: Springboardを表示します。

- hideSpringboard: Springboardを非表示にします。

- showNavigationBar: ナビゲーション・バーを表示します。

- hideNavigationBar: ナビゲーション・バーを非表示にします。

- showPreferences: プリファレンス・ページを表示します。

- invokeMethod: Javaメソッドを起動します。

- invokeContainerMethod: 特定の引数を使用して、指定されたクラス上でネイティブ・メソッドを起動します。

- invokeContainerJavaScriptFunction: JavaScriptメソッドを起動します。

- sendEmail: モバイル・デバイスの電子メール・インタフェースを表示します。

- sendSMS: モバイル・デバイスのテキスト・メッセージ(SMS)インタフェースを表示します。

コンテナ・ユーティリティAPIには、アプリケーションにバッジおよびバッジ番号を設定するためのメソッドが含まれています。「アプリケーション・アイコンへのバッジ設定」を参照してください。

B.2.3 getApplicationInformation

getApplicationInformationメソッドは、ApplicationInformationオブジェクトを返します。このオブジェクトには、アプリケーションIDやアプリケーション名などのアプリケーションに関するメタデータが格納されています。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.ApplicationInformation
getApplicationInformation()
throws oracle.adfmf.framework.exception.AdfException

次の例は、このメソッドのコール方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
ApplicationInformation ai = AdfmfContainerUtilities.getApplicationInformation();
String applicationId = ai.getId();
String applicationName = ai.getName();
String vendor = ai.getVendor();
String version = ai.getVersion();
...
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getApplicationInformation(success, failed)

successコールバックはfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値が格納されます。この戻り値は、アプリケーション・レベルのメタデータを格納するApplicatiaonInformationオブジェクトです。ここには、アプリケーション名、ベンダー、バージョンおよびアプリケーションIDが含まれます。

failedコールバックはfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーション情報を取得する方法を示しています。

adf.mf.api.getApplicationInformation(
function(req, res) { alert("getApplicationInformation complete"); },
function(req, res) { alert("getApplicationInformation failed with " +
adf.mf.util.stringify(res); }
);

B.2.4 gotoDefaultFeature

gotoDefaultFeatureメソッドは、MAFにデフォルトのアプリケーション機能を表示するようにリクエストします。この機能は、アプリケーションの起動時に表示されます。

注意:

認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoDefaultFeature(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数にはエラーが格納されます。

次の例は、これらのコールバック関数を使用してデフォルトのアプリケーション機能をコールする方法を示しています。

adf.mf.api.gotoDefaultFeature(
function(req, res) { alert("gotoDefaultFeature complete"); },
function(req, res) { alert("gotoDefaultFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.5 gotoFeature

gotoFeatureメソッドは、MAFにIDで識別されるアプリケーション機能を表示するようにリクエストします。

注意:

認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

Javaでは、このメソッドは次のようにコールされます。

public static void gotoFeature(java.lang.String featureId)
throws oracle.adfmf.framework.exception.AdfException

次の例に示すメソッドのパラメータは、アプリケーション機能のIDです。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.gotoFeature("feature.id");
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoFeature(featureId, success, failed)

featureIdパラメータは、アプリケーション機能IDです。このパラメータはsuccessコールバック関数をアクティブ化します。このコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーション機能をコールする方法を示しています。

adf.mf.api.gotoFeature("feature0",
function(req, res) { alert("gotoFeature complete"); },
function(req, res) { alert("gotoFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.6 getFeatures

getFeaturesメソッドは、使用可能なアプリケーション機能を表現するFeatureInformationオブジェクトの配列を返します。これらのオブジェクトは、カスタム・スプリングボードの実装で使用できます。

このメソッドは、使用可能なアプリケーション機能を表すFeatureInformationオブジェクトの配列を戻します。戻されるメタデータには、機能ID、アプリケーション機能名およびアプリケーション・アイコンに使用するイメージ・ファイルの場所が含まれます。このコールにより、カスタムSpringboardの実装は、制約の適用後に使用可能になるアプリケーション機能のリストにアクセスできるようになります。

注意:
これらのアプリケーション機能もデフォルトのSpringboardに表示されることがあります。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation[] getFeatures()
throws oracle.adfmf.framework.exception.AdfException

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
FeatureInformation[] fia = null;
fia = AdfmfContainerUtilities.getFeatures();

for(int f = 0; f < fia.length; ++f) {
FeatureInformation fi = fia[i];
String featureId = fi.getId();
String featureName = fi.getName();
String featureIconPath = = fi.getIcon();
String featureImagePath = fi.getImage();
...
}
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getFeatures(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値(FeatureInformationオブジェクトの配列)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数にはエラー(AdfException)が格納されます。

adf.mf.api.getFeatures(
function(req, res) { alert("getFeatures complete"); },
function(req, res) { alert("getFeatures failed with " +
adf.mf.util.stringify(res); }
);

B.2.7 getFeatureByName

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

getFeatureByIdメソッドは、アプリケーションIDを使用してアプリケーション機能を取得します。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation getFeatureById(String featureId)
throws oracle.adfmf.framework.exception.AdfException

次の例に示すメソッドのパラメータは、アプリケーション機能のIDです。

try {
FeatureInformation fi = AdfmfContainerUtilities.getFeatureById("feature.id");
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getFeatureById(featureId, success, failed)

featureIdパラメータは、アプリケーション機能のIDです。successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーション機能を取得する方法を示しています。

adf.mf.api.getFeatureById("feature.id",
function(req, res) { alert("getFeatureById complete"); },
function(req, res) { alert("getFeatureById failed with " +
adf.mf.util.stringify(res); }
);

B.2.9 resetFeature

このメソッドは、アプリケーション機能の状態をリセットします。このメソッドでは、アプリケーション機能のJava側のモデルをリセットして、MAFアプリケーションがロードされ、最初にアプリケーション機能が表示されたときのようにユーザー・インタフェース・プレゼンテーションを再起動します。

アプリケーション機能のコンテンツ・タイプが「MAFタスク・フロー」の場合、MAFアプリケーションはタスク・フローを再起動し、タスク・フローでデフォルト・アクティビティとして指定したアクティビティにナビゲートします。

Java API AdfmfContainerUtilities.resetFeatureの2つの実装を使用できます。

- resetFeature(String featureId)

- resetFeature(String featureId, boolean gotoTheFeature)

どちらもfeatureIdパラメータで識別されるアプリケーション機能をリセットしますが、ブールgotoTheFeatureメソッド・パラメータを含むメソッド・シグネチャも、trueに設定されているときはアプリケーション機能にナビゲートします。アプリケーション機能にナビゲートする2番目のオプションは、アプリケーション機能のアクティブ化ライフサイクルのリスナー・メソッドから呼び出すことはできません。スタック・オーバーフロー・エラーを引き起こす可能性があるからです。

次の例で、setSkinFamilyメソッドにより指定された新しいスキンを使用するために、AdfmfContainerUtilities.resetFeatureを使用してMAFアプリケーションのすべてのアプリケーション機能をリセットする方法について示します。

...
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());
}
...

MAFはまたJavaScript resetFeature APIも提供します。JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void resetFeature(featureId, success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(アプリケーション機能のID)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーション機能をコールする方法を示しています。

adf.mf.api.resetFeature("feature0",
function(req, res) { alert("resetFeature complete"); },
function(req, res) { alert("resetFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.10 resetApplication

resetApplicationメソッドは、実行中のアプリケーションをリセットします。個別のアプリケーション機能のリセットでは不十分な場合にのみ使用します。

このメソッドは、実行中のアプリケーションをリセットするので、個別のアプリケーション機能をリセットするだけでは不十分な場合にのみ使用してください。Oracle Mobile Application Framework Java APIリファレンスを参照してください。

Javaでは、このメソッドは次のようにコールされます。

public static void resetApplication(java.lang.String message)

メソッドのパラメータ(次の例を参照)は、アプリケーションを再起動する理由が記載されたメッセージか、null (メッセージが不要な場合)のいずれかです。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.resetApplication("New content is available");
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void resetApplication(message, success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(アプリケーション機能のID)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数を使用してアプリケーションをコールする方法を示しています。

adf.mf.api.resetApplication("message1",
function(req, res) { alert("resetApplication complete"); },
function(req, res) { alert("resetApplication failed with " +
adf.mf.util.stringify(res); }
);

B.2.11 gotoSpringboard

gotoSpringboardメソッドは、MAFにスプリングボードをアクティブ化するようにリクエストします。

注意:

maf-application.xmlファイルで機能参照として指定されていない場合や、認証関連または許可関連の問題が発生している場合、このメソッドではSpringboardを表示できないことがあります。「アプリケーションのナビゲーションの構成」も参照してください。

Javaでは、このメソッドは次のようにコールされます。

public static void gotoSpringboard()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.gotoSpringboard();
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoSpringboard(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.gotoSpringboard(
function(req, res) { alert("gotoSpringboard complete"); },
function(req, res) { alert("gotoSpringboard failed with " +
adf.mf.util.stringify(res); }
);

B.2.12 showSpringboard

showSpringboardメソッドは、MAFにスプリングボードを表示するようにリクエストします。

このメソッドは、MAFがSpringboardを表示するようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void showSpringboard()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.showSpringboard();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void showSpringboard(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.showSpringboard(
function(req, res) { alert("showSpringboard complete"); },
function(req, res) { alert("showSpringboard failed with " +
adf.mf.util.stringify(res); }
);

B.2.13 hideSpringboard

hideSpringboardメソッドは、MAFにスプリングボードを非表示にするようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void hideSpringboard()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.hideSpringboard();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void hideSpringboard(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.hideSpringboard(
function(req, res) { alert("hideSpringboard complete"); },
function(req, res) { alert("hideSpringboard failed with " +
adf.mf.util.stringify(res); }
);

B.2.14 showNavigationBar

showNavigationBarメソッドは、MAFにナビゲーション・バーを表示するようにリクエストします。

このメソッドは、MAFがナビゲーション・バーを表示するようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void showNavigationBar()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.showNavigationBar();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void showNavigationBar(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.showNavigationBar(
function(req, res) { alert("showNavigationBar complete"); },
function(req, res) { alert("showNavigationBar failed with " +
adf.mf.util.stringify(res); }
);

B.2.15 hideNavigationBar

hideNavigationBarメソッドは、MAFにナビゲーション・バーを非表示にするようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void hideNavigationBar()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.hideNavigationBar();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void hideNavigationBar(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.hideNavigationBar(
function(req, res) { alert("hideNavigationBar complete"); },
function(req, res) { alert("hideNavigationBar failed with " +
adf.mf.util.stringify(res); }
);

B.2.16 showPreferences

showPreferencesメソッドは、MAFに「プリファレンス」ページを表示するようにリクエストします。

このメソッドは、MAFがプリファレンス・ページを表示するようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void showPreferences()

次の例は、このメソッドの使用方法を示しています。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.showPreferences();
}
catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void showPreferences(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

次の例は、これらのコールバック関数の使用方法を示しています。

adf.mf.api.showPreferences(
function(req, res) { alert("showPreferences complete"); },
function(req, res) { alert("showPreferences failed with " +
adf.mf.util.stringify(res); }
);

B.2.17 invokeMethod

各例とリストに示したパラメータを使用して、invokeMethodをコールし(Javaでは使用できません)、クラスパス内の任意のクラスからJavaメソッドを呼び出します。

このメソッドは、Javaでは提供されません。次の例は、JavaScriptのコールバック・メソッドを使用して、クラスパスに含まれる任意のクラスからJavaメソッドを起動する方法を示しています。

adf.mf.api.invokeMethod(classname,
methodname,
param1,
param2,
...
paramN,
successCallback,
failedCallback);

表B-1に、このメソッドによって取得されるパラメータを示します。

表B-1 invokeMethodに渡されるパラメータ

パラメータ

説明

classname

Javaメソッドのコール時にMAFがインスタンスを作成するために使用するクラス名(パッケージ情報を含む)

methodname

classnameパラメータによって指定されたクラスのインスタンスで起動させるメソッドの名前

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

複数のパラメータによるこのメソッドの使用例は次のとおりです。

- adf.mf.api.invokeMethod("TestBean", "setStringProp", "foo", success, failed);

- adf.mf.api.invokeMethod("TestBean", "getStringProp", success, failed)

整数パラメータの使用例は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testSimpleIntMethod", "101", success, failed);

複合パラメータの使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testComplexMethod",
{"foo":"newfoo","baz":"newbaz",".type":"TestBeanComplexSubType"}, success, failed);

パラメータが存在しない場合の使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "getComplexColl", success, failed);

Stringパラメータの使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testMethodStringStringString", "Hello ",
"World", success, failed);

B.2.18 invokeContainerMethod

リストに示したパラメータを使用して、invokeContainerMethodメソッドをコールし、特定の引数で指定されたクラスのネイティブ・メソッドを呼び出します。

invokeContainerMethodは、特定の引数を使用して、指定されたクラス上でネイティブ・メソッドを起動します。表B-2に、このメソッドによって渡されるパラメータを示します。

表B-2 invokeContainerMethodに渡されるパラメータ

パラメータ

説明

className

MAFがインスタンスを作成するために使用するクラス名(パッケージ情報を含む)。

methodName

起動させるメソッドの名前。

args

メソッドに渡される引数の配列。この配列内で、これらの引数はメソッドが期待する順序で並べられます。

このメソッドは、Objectを戻します。

public static java.lang.Object invokeContainerMethod(java.lang.String className,
java.lang.String methodName)
java.lang.Object[] args)

B.2.19 invokeContainerJavaScriptFunction

invokeContainerJavaScriptFunctionメソッドは、JavaScriptのメソッドを呼び出すために使用します。

invokeContainerJavaScriptFunctionは、JavaScriptメソッドを起動します。表B-3に、このメソッドによって渡されるパラメータを示します。

表B-3 invokeContainerJavaScriptFunctionに渡されるパラメータ

パラメータ

説明

featureId

JavaScriptの起動コンテキストを決定するためにMAFによって使用されるアプリケーション機能のID。このIDによって、このメソッドがコールされるWebビューが決まります。

method

起動させるメソッドの名前。

args

メソッドに渡される引数の配列。この配列内で、これらの引数はメソッドが期待する順序で並べられます。

このメソッドは、JSONオブジェクトを戻します。

注意:

invokeContainerJavaScriptFunction APIは、アプリケーションがAndroidデバイスまたはエミュレータ上で実行される場合、JavaScript関数が15秒以内に完了することを予期します。完了しなかった場合は、タイムアウト・エラーを戻します。

public static java.lang.Object invokeContainerJavaScriptFunction(java.lang.String featureId,
java.lang.Object[] args)
throws oracle.adfmf.framework.exception.AdfException

次の例の疑似コードは、feature1という名前のアプリケーション機能に含まれるappFunctions.jsという名前のJavaScriptファイルを示しています。このファイル内で記述されているJavaScriptメソッド、application.testFunctionは、invokeContainerJavaScriptFunctionメソッドによってコールされます(次の例を参照)。

(function()
{
if (!window.application) window.application = {};

application.testFunction = function()
{
var args = arguments;

alert("APP ALERT " + args.length + " ");
return "application.testFunction - passed";
};
})();

アプリケーションには、この関数をコールするアクション・リスナーで構成されるコマンド・ボタンが含まれているので、エンド・ユーザーがこのボタンをクリックすると、次のようなアラートが表示されます。

- APP ALERT 0

- APP ALERT 1

- APP ALERT 2

次の例の疑似コードは、invokeApplicationJavaScriptFunctionメソッドによって、前の例で記述されているJavaScriptメソッド(application.testFunction)をコールする方法を示しています。

invokeApplicationJavaScriptFuntions
public void invokeApplicationJavaScriptFuntions(ActionEvent actionEvent) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {} );
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {"P1"} );
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {"P1", "P2"} );
}

Oracle Mobile Application Framework Java APIリファレンスおよびAPIDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

B.2.20 sendEmail

詳細は、「電子メールを有効にするためのsendEmailメソッドの使用方法」を参照してください。

B.2.21 sendSMS

詳細は、「テキスト・メッセージを有効にするためのSendSMSメソッドの使用方法」を参照してください。

B.2.22 アプリケーション・アイコンへのバッジ設定

iOSプラットフォームの場合は、リストに示したAdfmfContainerUtilitiesクラスのメソッドを使用して、MAFアプリケーション・アイコンにバッジ番号を配置するか、そのバッジ番号を取得します。

AdfmfContainerUtilitiesクラスには、MAFアプリケーション・アイコンにバッジ番号を設定したり、その番号を取得するためのメソッドが含まれています。表B-4に、これらのメソッドを示します。

表B-4 アイコンへのバッジ設定メソッド

メソッド

説明

パラメータ

getApplicationIconBadgeNumber

MAFアプリケーションのアイコンに現在設定されているバッジの値を取得します。アプリケーション・アイコンにバッジが設定されていない場合は、ゼロ(0)を戻します。

なし

setApplicationIconBadgeNumber

MAFアプリケーションのアイコンにバッジ番号を設定します。

バッジの値(int badge)。

注意:

アプリケーション・アイコンへのバッジ設定は、AndroidプラットフォームまたはWindowsプラットフォームのいずれでもサポートされていません。

B.3 getDirectoryPathRootメソッドを使用したファイル・アクセス

AdfmfJavaUtilties APIには、getDirectoryPathRootメソッドが含まれています。このメソッドはJavaレイヤーからのみコールでき、iOSシステム、AndroidシステムおよびWindowsシステム上のディレクトリへのアクセスを可能にします。

次の例に示すように、このメソッドを使用すると、デバイス上の一時、アプリケーション(iOSシステム上)およびキャッシュ・ディレクトリの場所に、TemporaryDirectory、ApplicationDirectoryおよびDeviceOnlyDirectory定数を使用してそれぞれアクセスできます。DeviceOnlyDirectoryの場所に格納されたファイルは、デバイスの接続時には同期されません。

注意:

アプリケーションからディレクトリまたはファイルへのアクセスを試みる前に、それらのディレクトリまたはファイルが存在することを確認してください。

oracle.adfmf.framework.api.AdfmfJavaUtilitiesに関する詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;

...

public void getDirectoryPathRoot() {
// returns the directory for storing temporary files
String tempDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.TemporaryDirectory);

// returns the directory for storing application files
String appDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.ApplicationDirectory);

// returns the directory for storing cache files
String deviceDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DeviceOnlyDirectory);

// returns the directory for storing downloaded files
String downloadDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory);
}

B.3.1 プラットフォームに依存しないダウンロード場所へのアクセス

getDirectoryPathRootメソッドを使用して、外部ストレージ・ディレクトリとデフォルトの添付ファイル・ディレクトリへのパスを取得します。

ファイル記憶域の要件は、プラットフォームによって異なります。Androidプラットフォームでは、アプリケーションからファイルへのアクセス元となる単一の場所が規定されていません。そのかわり、アプリケーションでは、権限が付与された任意の場所にファイルを書き込むことができます。一方、iOSプラットフォームでは通常、アプリケーション・ディレクトリ内にファイルを格納します。Windowsでは、アプリケーションは外部ファイルやディレクトリ・ファイルにはアクセスしません。ファイルはアプリケーション・パッケージ内に格納されています。このような違いにより、ApplicationDirectoryをgetDirectoryPathRootメソッドに渡すと、AndroidデバイスではなくiOSデバイスまたはWindowsデバイス上で実行されているアプリケーションの添付ファイルを表示するために必要なファイルの場所を戻すことができます。アプリケーションをiOSデバイスとAndroidデバイスの両方で実行する場合、プラットフォーム固有のコードを記述してこれらの場所を取得するのではなく、getDirectoryPathRootメソッドにDownloadDirectoryを渡すことによって、外部記憶域の場所とデフォルトの添付ファイル・ディレクトリへのパスを両方戻すことができます。この定数(列挙型)には、DeviceManager APIのdisplayFileメソッドで使用する場所が反映されます。このメソッドでは、プラットフォーム固有の機能を使用してこれらの場所を検索することによって、添付ファイルを表示します。

Androidの場合、DownloadDirectoryでは、android.os.Environment.getExternalStorageDirectoryメソッド(SDカードなどのAndroid用外部記憶域ディレクトリを取得する)によって戻されるパスを参照します。iOSデバイス上で実行されるMAFアプリケーションの場合は、ApplicationDirectoryと同じ場所が戻されます。getExternalStorageDirectoryの詳細は、Android開発者のWebサイト(http://developer.android.com/reference/packages.html)で入手できる、パッケージのリファレンス・ドキュメントを参照してください。また、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手できる『Files System Programming Guide』も参照してください。

C MAFアプリケーションとプロジェクト・ファイル

この付録では、モバイル・アプリケーション・フレームワークのアプリケーション・テンプレートを使用してMAFアプリケーションを作成する際に、JDeveloperによって生成されるファイルについて説明します。

この付録の内容は次のとおりです。

- MAFアプリケーションとプロジェクト・ファイルの概要

- アプリケーション・コントローラ・プロジェクト・レベルのリソースについて

- ビュー・コントローラ・プロジェクトのリソースについて

- MAFアプリケーションの構成ファイルについて

- MAFアプリケーション機能の構成ファイルについて

C.1 MAFアプリケーションとプロジェクト・ファイルの概要

アプリケーションのApplicationControllerプロジェクトとViewControllerプロジェクトに生成されるファイルの内容を理解することは、MAFアプリケーションのデプロイメントに必要なアプリケーション、アプリケーション機能、またはファイルを構成する際に必要になります。

デフォルトで、JDeveloperはMAFアプリケーションを2つのプロジェクト(ApplicationControllerとViewController)とともに作成します。MAFアプリケーションのセキュリティを構成する場合、ApplicationControllerプロジェクトにはアプリケーション全体のリソース(ログイン・ページなど)が格納されます。ViewControllerプロジェクトには、アプリケーション機能のコンテンツとしてレンダリングされる、アプリケーション機能のリソース(HTML、AMX、タスク・フロー・ファイルなど)が格納されます。

複数のMAFアプリケーションで使用するアーティファクトを作成または格納するにはViewControllerプロジェクトを使用します。たとえば、MAFアプリケーションのルック・アンド・フィールを決定するMAFスキンについて考えます。このアーティファクトは複数のMAFアプリケーションで再利用する場合があります。同様に、複数のMAFアプリケーションで複数のデータ・コントロールを共有することが必要な場合があります。このため、MAFアプリケーションに追加のViewControllerプロジェクトを作成して、複数のMAFアプリケーション間で共有するこのようなアーティファクトを格納します。この追加のViewControllerプロジェクトは、「MAFアプリケーション・コンテンツの再使用」の説明に従ってFARにパッケージ化することで再使用できます。

「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」および「ビュー・コントローラ・プロジェクトのリソースについて」を参照してください。

これらのプロジェクト内には、MAFアプリケーションとアプリケーション機能の構成用ファイル、またはMAFアプリケーションをターゲット・プラットフォームにデプロイする際にそのアプリケーションで必要になるファイルもJDeveloperによって生成されます。例C-1に、新規作成したMAFアプリケーションに対してJDeveloperによって生成されるファイルを示します。

MAFアプリケーションの開発時に最もよく使用されるファイルは、maf-application.xmlファイル(アプリケーションの構成)とmaf-features.xmlファイル(機能の構成)の2つです。「MAFアプリケーションの構成ファイルについて」および「MAFアプリケーション機能の構成ファイルについて」を参照してください。

例C-1 新規作成したMAFアプリケーションのファイル

Folder PATH listing
Volume serial number is 52FC-1121
C:.
|   Application1.jws
|
+---.adf
|   \---META-INF
|           adf-config.xml
|           maf-application.xml
|           maf-config.xml
|           maf-plugins.xml
|           sync-config.xml
|           wsm-assembly.xml
|
+---.data
|   +---00000000
|   |       00000000.jdb
|   |       je.lck
|   |
|   \---ApplicationController
|       \---00000000
|               00000000.jdb
|               je.lck
|
+---ApplicationController
|   |   ApplicationController.jpr
|   |
|   +---adfmsrc
|   |   +---application
|   |   |       DataControls.dcx
|   |   |
|   |   \---META-INF
|   |           adfm.xml
|   |
|   +---public_html
|   \---src
|       +---application
|       |       LifeCycleListenerImpl.java
|       |
|       \---META-INF
|               maf-skins.xml
|
+---resources
|   +---android
|   |       display-hdpi-icon.png
|   |       display-land-hdpi-splashscreen.9.png
|   |       // Additional image files omitted for brevity
|   |       display-xxxhdpi-icon.png
|   |
|   +---default
|   |       MissingIcon_144x144.png
|   |
|   +---ios
|   |       Default-1104h@2x.png
|   |       Default-568h@2x.png
|   |       Default-667h@2x.png
|   |       Default-Landscape-621@2x.png
|   |       Default-LandscapeRetina.png
|   |       Default-LandscapeRetina@2x.png
|   |       Default-PortraitRetina.png
|   |       Default-PortraitRetina@2x.png
|   |       Default@2x.png
|   |       Icon-120.png
|   |       // Additional image files omitted for brevity
|   |       iTunesArtwork.png
|   |
|   +---security
|   |       cacerts
|   |       java.security
|   |
|   \---windows
|           BadgeLogo.scale-100.png
|           // Additional image files omitted for brevity
|           splashscreen.scale-100.png
|
|           Square150x150Logo.scale-100.png
|
|           Wide310x150Logo.scale-100.png
|           // Additional image files omitted for brevity
|
+---src
|   \---META-INF
|           logging.properties
|           maf.properties
|
\---ViewController
|   ViewController.jpr
|
+---public_html
\---src
\---META-INF
maf-feature.xml

C.2 アプリケーション・コントローラ・プロジェクト・レベルのリソースについて

アプリケーション・コントローラ・プロジェクトの各ファイルには、MAFアプリケーションのメタデータについて記述する構成情報が格納されています。これらのファイルには、「アプリケーション」ウィンドウの「アプリケーション・リソース」パネルからアクセスできます。

JDeveloperでは、アプリケーション・コントローラ・プロジェクト内にMAFアプリケーション用のファイルが生成されます。これらのファイル(表C-1を参照)は、MAFアプリケーションのメタデータを記述した構成情報を含んでいます。これらのファイルには、「アプリケーション」ウィンドウの「アプリケーション・リソース」ペイン(図C-1を参照)からアクセスします。

図C-1 「アプリケーション・リソース」ペインからアクセスされるMAFアプリケーション・アーティファクト

アプリケーション全体のリソースが含まれるアプリケーション・コントローラ・プロジェクトは、モバイル・デバイスでのアプリケーションの表示方法を構成するためのメタデータ・ファイルが含まれるという点で、MAFアプリケーションのプレゼンテーション・レイヤーを提供しています。このプロジェクトはMAFアプリケーションのセキュリティを指定しており、アプリケーションのログイン・ページ、アプリケーション全体のリソースを含むことができます。アプリケーション・コントローラ・プロジェクトは、本質的には、アプリケーション機能とそのコンテンツを定義するビュー・コントローラ・プロジェクトのコンシューマです。「ビュー・コントローラ・プロジェクトのリソースについて」を参照してください。

表C-1 アプリケーション・リソースを介してアクセスされるMAFアプリケーション・レベルのアーティファクト

アーティファクト

ファイルの場所

説明

maf-application.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\Meta-INF

次にその例を示します。

JDevloper\mywork\アプリケーション名\.adf\META-INF

アプリケーションレベルの情報を定義するXMLファイル。アプリケーションの内容、ナビゲーションの動作およびそのユーザー認証要件を定義できます。

maf-config.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\Meta-INF

次にその例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

MAFアプリケーションに使用されるデフォルト・スキンの構成に使用されます。「MAFアプリケーションのスキニング」を参照してください。

アプリケーションのイメージ

アプリケーション・ワークスペース・ディレクトリ\Application Resources\resources\

アプリケーションのデプロイメントに必要とされる一連のイメージ。AndroidおよびWindowsの場合、ここには、アプリケーション・アイコンやスプラッシュ画面のイメージも含まれます。iOSの場合、ここには、アプリケーション・アイコンのイメージも含まれます。iOSデバイスにデプロイするMAFアプリケーションは、HTMLページを起動画面として使用します。

各イメージのファイル名は、その目的を示します。たとえば、Androidリソースに表示されるdisplay-port-ldpi-splashscreen.9.pngイメージは、Androidデバイスの横モードのスプラッシュ画面として使用します。

AndroidにデプロイするMAFアプリケーションのアプリケーション・アイコンおよびスプラッシュ画面をオーバーライドする方法は、「Androidアプリケーションへのカスタム・イメージの追加方法」を参照してください。

iOSにデプロイするMAFアプリケーションのアプリケーション・アイコンをオーバーライドする方法は、「iOSアプリケーションへのカスタム・イメージの追加」を参照してください。iOSデバイスの起動画面を変更するには、「iOSでのMAFアプリケーションの起動画面の変更」を参照してください。

cacerts

アプリケーション・ワークスペース・ディレクトリ\Application Resources\resources\Security\cacerts

次にその例を示します。

JDeveloper\mywork\アプリケーション名\resources\Security\cacerts

システム全体のキーストアであるcacerts証明書ファイル。Java仮想マシン(JVM)に対するCA証明書を識別します。このファイルは、Java keytoolユーティリティを使用して更新できます。「SSLのサポート」の説明に従って、keytoolを使用してカスタムの証明書ファイルを作成できます。証明書ファイルは、Securityディレクトリに置く必要があります。

logging.properties

アプリケーション・ワークスペース・ディレクトリ\ src\.META-INF\logging.properties

次にその例を示します。

JDeveloper\mywork\アプリケーション名\src\META-INF\logging.properties

ロギング・レベルやロギング・コンソールなど、アプリケーション・エラーのロギングを設定できます。「ロギングの使用方法と構成」を参照してください。

maf.properties

アプリケーション・ワークスペース・ディレクトリ\src\.META-INF\maf.properties

次にその例を示します。

JDeveloper\mywork\アプリケーション名\src\META-INF\maf.properties

JVMの構成ファイル。このファイルを使用して、アプリケーションの起動やヒープ領域の割当て、JavaおよびJavaScriptのデバッグ・オプションを構成します。「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

adf-config.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\META-INF

次にその例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

構成サービス・パラメータなど、アプリケーション・レベルの設定の構成に使用します。「MAFアプリケーションで使用するエンド・ポイントの構成」も参照してください。

connections.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\META-INF

次にその例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

MAFアプリケーションで定義されているすべての接続のリポジトリ。

wsm-assembly.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\META-INF

次にその例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

保護されたWebサービスに使用されるWebサービス・ポリシー定義を格納します。

ヒント:

アプリケーション・コントローラ・プロジェクト内には、アプリケーション・レベルのライフサイクル・リスナーなど、アプリケーション全体の機能をサポートするコードを配置してください。

JDeveloperでは、アプリケーション・コントローラ・プロジェクト自体の中に、表C-2にリストされたアーティファクトが作成されます。

表C-2 アプリケーション・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

LifeCycleListenerImpl.java

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\application

次にその例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\src\application

MAFアプリケーションのデフォルトのアプリケーション・ライフサイクル・リスナー(ALCL)。

「MAFアプリケーションでのライフサイクル・リスナーの使用方法」を参照してください。

maf-skins.xml

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\META-INF

次にその例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\src\META-INF

使用可能なスキンを定義するもので、新しいスキンを定義することもできます。

「MAFアプリケーションのスキニング」を参照してください。

adfm.xml

アプリケーション・ワークスペース・ディレクトリ \ApplicationController\adfmsrc\META-INF

次にその例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\adfmsrc\META-INF

.cpx、.dcx、.jpxおよび.xcfgファイル(メタデータのレジストリ)のパス(および相対パス)を維持します。

DataControls.dcx

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\adfmsrc\

次にその例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\adfmsrc\

データ・コントロールのレジストリ。DeviceFeaturesデータ・コントロールの使用方法の詳細は、「MAF AMXでのバインディングの使用とデータ・コントロールの作成」を参照してください。埋込みアプリケーション機能をコールするSpringboardページを作成できるApplicationFeaturesデータ・コントロールの詳細は、「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

C.3 ビュー・コントローラ・プロジェクトのリソースについて

ビュー・コントローラ・プロジェクトのメタデータ・ファイルには、アプリケーション機能レベルのリソースが記述されています。これらのファイルは、別のアプリケーションで再利用できます。

ビュー・コントローラ・プロジェクト(ViewControllというデフォルト名で生成されます)には、アプリケーション機能のリソースが格納されます。アプリケーション・コントローラ・プロジェクトとは異なり、ビュー・コントローラ・プロジェクトのメタデータ・ファイルでは、アプリケーション機能レベルのリソース、特に、実行時にモバイル・デバイスでMAFアプリケーション自体のSpringboard内またはそのナビゲーション・バーに表示できるように1つのMAFアプリケーションに集約可能な様々なアプリケーション機能が記述されます。さらに、アプリケーション機能のメタデータ・ファイルでは、アプリケーション機能をHTMLページとMAF AMXページのどちらで構成するのかが記述されます。また、ビュー・コントローラ・プロジェクトには、これらのアプリケーション・ページと、アプリケーション機能レベルのリソース(MAFアプリケーション用に定義された、Springboardおよびナビゲーション・バー上のアプリケーション機能を表すアイコン・イメージなど)を含めることができます。

ヒント:

ビュー・コントローラ・プロジェクト内には、アプリケーション機能に固有のコードを格納します。アプリケーション・コントローラ・プロジェクトは、(特に別々のビュー・コントローラ・プロジェクト内で定義されている)アプリケーション機能間で共有されるコードの場所として使用してください。

ビュー・コントローラ・プロジェクトは、「MAFアプリケーション・コンテンツの再使用」で説明されているように、アプリケーション・コントローラ・プロジェクトから分離して、他のMAFアプリケーションで再使用するためのアーカイブ・ファイルとしてデプロイできます。また、稀なケースとして、アプリケーション・コントローラ・プロジェクトが複数のビュー・コントローラ・プロジェクトを使用することもできます。

注意:

MAFビュー・コントローラ・プロジェクトを別のMAFビュー・コントローラ・プロジェクトの依存性またはMAFアプリケーション・コントローラ・プロジェクトの依存性として追加すると、MAFアプリケーションをデプロイできなくなります。「機能参照IDと機能IDに関する必知事項」を参照してください。

表C-3に示すように、これらのリソースには、maf-feature.xmlという名前のアプリケーション機能の構成ファイルが含まれます。

表C-3 ビュー・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

maf-feature.xml

アプリケーション・ワークスペース・ディレクトリ\src\META_INF\maf-feature.xml

次にその例を示します。

JDeveloper\mywork\アプリケーション名\ViewController\src\META-INF

アプリケーション機能を定義できるようにする、スタブXMLの識別子ファイル。『Oracle Mobile Application Frameworkのインストール』の説明に従ってモバイル・プリファレンスを構成したら、デフォルトのデプロイメント・プロファイル設定を使用してこのアプリケーションをデプロイできます。「MAFアプリケーションのデプロイ」を参照してください。

アプリケーション固有のコンテンツ

アプリケーション・ワークスペース・ディレクトリ\ViewController\public_html

次にその例を示します。

JDeveloper\mywork\アプリケーション名\ViewController\public_html

maf-feature.xmlで定義されたアプリケーション機能は、public_htmlディレクトリに表示されます。モバイル・コンテンツには、MAF AMXページ、CSSファイルおよびタスク・フローを含めることができます。アプリケーション機能に追加するカスタム・イメージは、このディレクトリ内に配置する必要があります。「外部リソースの選択に関する必知事項」を参照してください。

C.4 MAFアプリケーションの構成ファイルについて

maf-application.xmlファイルは、MAFアプリケーションの基本構成を指定するだけでなく、ユーザーがMAFアプリケーションのユーザー・プリファレンス・ページを作成する際にも役立ちます。

maf-application.xmlファイルでは、表示名と一意のアプリケーションID (名前の競合を防ぐ)を指定し、実行時にMAFアプリケーションのSpringboardに表示するアプリケーション機能を選択することで、MAFアプリケーションの基本構成を指定します。さらに、maf-application.xmlファイルでは、MAFアプリケーションのユーザー・プリファレンス・ページも作成できます。

このファイルは、「MAFアプリケーションの作成」で説明されているように、アプリケーション作成ウィザードの完了後にJDeveloperによって生成されるもので、表C-4に示す要素が含まれています。

表C-4 アプリケーション識別子ファイルの要素

要素

説明

<adfmf:application>

maf-application.xmlのルート要素。

<adfmf:description>

アプリケーションの説明。

<adfmf:featureReference>

機能参照は、FAR (機能アーカイブ・ファイル)にパッケージ化されているか、maf-feature.xmlファイルで定義されているアプリケーション機能のうち、MAFアプリケーションのコンテンツに関連するものを指定します。機能参照を選択することで、MAFアプリケーションの特性とコンテンツを定義します。「MAFアプリケーション・コンテンツの再使用」を参照してください。

<adfmf:preferences>

ユーザー・プリファレンスのオプションおよび動作をアプリケーション・レベルで設定できます。maf-feature.xmlファイル内のアプリケーション機能に対するユーザー・プリファレンスの表示および動作方法も設定できます。「ユーザー・プリファレンスの有効化」を参照してください。

<adfmf:login>

アプリケーション機能のログイン・ページを設定できます。「MAFアプリケーションの保護」を参照してください。

<adfmf:navigation>

ナビゲーション・バーとSpringboardの動作を定義できます。Springboardはホーム・ページで、ここには、埋め込まれたアプリケーション機能のすべてのアプリケーション・アイコンとラベルがリスト・ビューに整理されて表示されます。Springboardには、ユーザーが使用可能なすべてのアプリケーションの最上位のビューが表示されます。ユーザーは内容に目を通してアプリケーションを選択できます。「アプリケーションのナビゲーションの構成」を参照してください。

C.5 MAFアプリケーション機能の構成ファイルについて

maf-feature.xmlファイルでは、MAFアプリケーションのmaf-application.xmlファイル内の<adfmf:featureReference>要素によって参照されるアプリケーション機能を構成します。

例C-2は、WorkBetterサンプル・アプリケーションのmaf-feature.xmlファイル内に含まれている、人々および組織というアプリケーション機能を示しています。

maf-feature.xmlファイル内の<adfmf:features>ルート要素では、1つ以上の<adfmf:feature>要素を使用して、MAFアプリケーションのアプリケーション機能のプロパティを定義します。例C-2では、WorkBetterサンプル・アプリケーションの人々および組織アプリケーション機能の名前とID、およびアイコン(スプリングボードとナビゲーション・バーでこれらのアプリケーション機能を表す)を定義するプロパティの値を指定します。さらに、<adfmf:feature>要素では、アプリケーション機能用にレンダリングされるコンテンツも参照します。人々および組織アプリケーション機能では、タスク・フロー、.CSSおよび.JSの各ファイルを参照しています。

MAFアプリケーションはアプリケーション機能レベルでセキュリティを実装します。アプリケーション機能を保護するための1つの手段は、エンド・ユーザーがアプリケーション機能へアクセスできるようになる前に認証を要求することです。これを行うには、maf-feature.xmlファイルでアプリケーション機能の「セキュリティ有効化」プロパティ(securityEnabled)を構成します。「MAFアプリケーションのセキュリティの構成」を参照してください。

表C-5 <Feature>要素の子要素

要素の子要素" width="100%">

要素

説明

<adfmf:content>

特定のデバイスやユーザーに対してアプリケーション機能で使用される形式を記述します。アプリケーション機能のコンテンツ(通常はユーザー・インタフェース)は、MAF AMXページやHTML5ページとして記述することも、リモートWebサーバー上でホストされるWebページから配信することもできます。コンテンツをWebアプリケーションとして指定する方法の詳細は、「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

<adfmf:constraint>

指定したアプリケーション機能を実行時にアプリケーションに表示できるようにするかどうかを決定します。制約を使用すると、ユーザー・ロールやデバイスのプロパティなどの基準に基づいてアプリケーション機能の使用を許可または回避できます。「アプリケーション機能に関する制約の設定」を参照してください。

例C-2 WorkBetterサンプル・アプリケーションのmaf-feature.xmlファイル

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adfmf="http://xmlns.oracle.com/adf/mf">
<adfmf:feature id="People" name="People" icon="images/people.png" image="images/people.png">
<adfmf:content id="People.1">
<adfmf:amx file="People/taskflow.xml#taskflow">
<adfmf:includes>
<adfmf:include type="StyleSheet" file="css/WorkBetter.css" id="i1"/>
<adfmf:include type="JavaScript" file="js/customsearch.js" id="i2"/>
</adfmf:includes>
</adfmf:amx>
</adfmf:content>
</adfmf:feature>
<adfmf:feature id="Organizations" name="Organizations" icon="images/departments.png"
image="images/departments.png">
<adfmf:content id="Organizations.1">
<adfmf:amx file="Organizations/taskflow.xml#taskflow">
<adfmf:includes>
<adfmf:include type="StyleSheet" file="css/WorkBetter.css" id="i3"/>
<adfmf:include type="JavaScript" file="js/customsearch.js" id="i4"/>
</adfmf:includes>
</adfmf:amx>
</adfmf:content>
</adfmf:feature>
...
</adfmf:features>

D デプロイメントでのプリファレンスの変換

この章では、デプロイメント時、MAFがどのようにユーザー・プリファレンスを変換するかについて説明します。

このドキュメントは、次の項で構成されています。

- プリファレンスのネーミング・パターン

- Android用のプリファレンスの変換

- iOS用のプリファレンスの変換

- Windows用のプリファレンスの変換

D.1 プリファレンスのネーミング・パターン

デプロイメント・ターゲットが呼び出されると、MAFアプリケーション・プリファレンスの、モバイル・プラットフォーム表現への変換が行われます。

変換後、表D-1で説明されているネーミング・パターンにより、モバイル・プラットフォーム上で各プリファレンスを一意に識別できるようになります。maf-application.xmlおよびmaf-feature.xmlファイル内の各プリファレンス要素は、デプロイメントの前に、その兄弟要素の範囲内で一意に識別される必要があります。

識別子値の例は、次のとおりです。

- application.gen.gps.trackGPS

- feature.f0.gen.gps.trackGPS

表D-1は、完全修飾されたプリファレンス識別子の生成方法を示しています。

表D-1 プリファレンスに対するMAFのネーミング・パターン

表現

説明

構文

PreferenceIdentifier

モバイル・プラットフォーム表現に変換されたプリファレンス要素の識別子値を表します。

ApplicationPreferences | FeaturePreferences

ApplicationPreferences

maf-application.xmlファイルから生成されるプリファレンス識別子値をビルドするには、この式を使用します。

application.ApplicationElementPath

ApplicationElementPathは、最上位の親要素である<adfmf:preferences>で始まり、識別対象の要素で終わる、id属性値のドット区切りのリストを表します。maf-application.xmlファイルの次のセグメントで、生成されたこの識別子は、application.gen.gps.trackGPSとしてコメント内に示されています。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen">
<adfmf:preferenceGroup id="gps">
<!-- The mobile-platform identifier would be "application.gen.gps.trackGPS" -->
<adfmf:preferenceBoolean id="trackGPS"/>
</adfmf:preferenceGroup>
</adfmf:preferenceGroup>
</adfmf:preferences>

FeaturePreferences

maf-feature.xmlファイルから生成されるプリファレンス識別子値をビルドするには、この式を使用します。

feature.FeatureElementPath

FeatureElementPathは、最上位の親要素である<adfmf:feature>で始まり、識別対象の要素で終わる、id属性値のドット区切りのリストを表します。maf-feature.xmlファイルの次のセグメントで、生成されたこの識別子は、feature.f0.gen.gps.trackGPSとしてコメント内に示されています。

<adfmf:feature id="f0">
<adfmf:preferences>
<adfmf:preferenceGroup id="gen">
<adfmf:preferenceGroup id="gps">
<!-- The mobile-platform identifier would be "feature.f0.gen.gps.trackGPS" -->
<adfmf:preferenceBoolean id="trackGPS"/>
</adfmf:preferenceGroup>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>

表D-1のコード例で引用されている<adfmf:preferences>要素にはid属性がなく、そのため、これはどのプリファレンス識別子でも表されません。

D.2 Android用のプリファレンスの変換

MAFのデプロイメントでは、XMLとXLSを使用して、アプリケーション機能とアプリケーション・レベルの両方で定義されているユーザー・プリファレンス・ページを、次の3つのXMLドキュメントに変換します。

3つのドキュメントは次のとおりです。

- maf_preferences.xml

- maf_arrays.xml

- maf_strings.xml

D.2.1 maf_preferences.xml

このファイルには、maf-feature.xmlとmaf-application.xmlの両方のファイルからの変換済のプリファレンスが含まれています。

D.2.1.1 Preferences Element Mapping

表D-2は、MAFのプリファレンス定義の、Androidテンプレート・プリファレンスおよびAndroidネイティブ・プリファレンスへのマッピングを示しています。

表D-2 MAFプリファレンスの、Androidプリファレンスへのマッピング

MAFプリファレンス定義

カスタムまたはAndroidネイティブ・プリファレンス定義(MAFデプロイメントで使用される)

Androidネイティブ・プリファレンス定義(MAFデプロイメントで使用されない)

<adfmf:preferenceBoolean>

oracle.adfmf.preferences.AdfMFPreferenceBoolean

CheckBoxPreference

<adfmf:preferenceNumber>

oracle.adfmf.preferences.AdfMFPreferenceText

EditPreferenceText

<adfmf:preferenceText>

oracle.adfmf.preferences.AdfMFPreferenceText

EditTextPreference

<adfdmf:preferenceList>

oracle.adfmf.preferences.AdfMFPreferenceList

ListPreference

<adfmf:PreferenceGroup>

PreferenceCategory

PreferenceCategory

<adfmf:PreferencePage>

PreferenceScreen

PreferenceScreen

D.2.1.2 プリファレンス属性のマッピング

maf_preferences.xmlファイルには、maf_strings.xmlおよびmaf_arrays.xmlファイルの両方に格納されている文字列リソースへの参照が含まれています。Android SDKでは、XMLファイル内のリソースの構文を@[<package_name>:]<resource_type>/<resource_name>と定義しています。このファイルには、文字列値への参照だけでなく、リスト・プリファレンスの名前と値のペアも含まれています。XSLは、文字列とリスト・プリファレンスに対して次のものを作成します。

- <package_name> は、リソースが存在するパッケージの名前です(同じパッケージのリソースを参照するときは必要ありません)。参照のこのコンポーネントは使用されません。

- <resource_type>は、リソース・タイプのRサブクラスです。このコンポーネントは、文字列参照の作成時はstring、リスト・プリファレンスの作成時はarrayの値を持ちます。

- <resource_name>は、XML要素内のandroid:name属性値です。android:title属性を指定する場合、このコンポーネントの値は、<PreferenceIdentifier>_titleになります(<PreferenceIdentifier>の定義については、「プリファレンスのネーミング・パターン」を参照してください)。

表D-3と表D-4は、特定のMAFプリファレンスに対するMAF属性の、Androidプリファレンスへのマッピングを示しています。

この表の説明:

- {X}というフォームのエントリ(表D-3の{default}など)は、Xという名前のMAF属性の値を示しています。

- <PreferenceIdentifier>があるエントリは、「プリファレンスのネーミング・パターン」で説明されているとおり、プリファレンス識別子の値を示しています。

- アスタリスク(*)が付いている属性は、MAFの名前空間で定義されているカスタムのテンプレート属性であり、maf_preferences.xmlファイルにadfmf:<attributeName>というフォームで存在している必要があります。それ以外の属性は、Androidの名前空間の一部であり、maf_preferences.xmlファイルにandroid:<attributeName>として存在している必要があります。

表D-3 MAFプリファレンス属性の、Androidプリファレンスへのマッピング

MAF属性定義

テンプレート・カスタムまたはAndroidネイティブ・プリファレンス属性

Android属性値

適用対象

id

key

<PreferenceIdentifier>

AdfMFPreferenceBoolean、AdfMFPreferenceText、AdfMFPreferenceList、PreferenceScreen、PreferenceCategory

default

defaultValue

{default}

AdfMFPreferenceBoolean、AdfMFPreferenceText、AdfMFPreferenceList

label

title

指定された{label}値が文字列リソース・バンドルへの参照でない場合は、@string/<PreferenceIdentifier>___title。指定された{label}を持つ、maf_strings.xml内の文字列を参照します。

AdfMFPreferenceBooleanAdfM、FPreferenceNumber、AdfMFPreferenceText、AdfMFPreferenceList、PreferenceScreen、PreferenceCategory

secret

password

{secret}

AdfMFPreferenceText

min

min*

{min}

AdfMFPreferenceText

max

max*

{max}

AdfMFPreferenceText

name

entryValues

@array/<PreferenceIdentifier>___entryValues

AdfMFPreferenceList

value

entries

@array/<PreferenceIdentifier>___entries

AdfMFPreferenceList

D.2.1.3 属性のデフォルト値

次の場合、maf-application.xmlおよびmaf-feature.xmlファイル用の概要エディタでは、XMLからの属性名と値は除外されます。

- 属性タイプがxsd:booleanである。

- 属性値に<default>値オプションがある。

- ユーザーが値として<default>を指定している。

XSLは、ブール・タイプのMAF属性と、対応するデフォルト値を認識している必要があります。XSLはその後、適切なAndroidまたはテンプレート・カスタム属性値を指定します(ユーザーによって選択された場合)。

表D-4は、変換されるMAFプリファレンスにdefault属性が含まれていない場合に、デプロイメントでandroid:defaultValue属性に対して指定されるものを示しています。

表D-4 デフォルト以外の値を持つ属性の変換

MAFプリファレンス要素

相当するAndroidプリファレンス

デフォルトの属性値

preferenceBoolean

AdfMFPreferenceBoolean

false

preferenceText

AdfMFPreferenceText

空の文字列

preferenceList

AdfMFPreferenceList

空の文字列

D.2.1.4 プリファレンス画面ルート要素

maf_preferences.xmlファイルには、<PreferenceScreen>と呼ばれるルート要素があります。Androidテンプレートでは、この要素に次のXML名前空間定義が存在している必要があります。

xmlns:adfmf="http://schemas.android.com/apk/res/<Application Package Name>

ここで、<Application Package Name>要素は、AndroidManifest.xmlファイル内にあるものと同じアプリケーション・パッケージ名として定義されます。<Android Package Name>は、AndroidManifest.xmlファイルで指定されているAndroidパッケージ名を定義します。「MAFアプリケーションの表示プロパティの設定」を参照してください。

デプロイメントでは、Androidデプロイメント・プロファイルのパッケージ名値が使用されます(存在する場合)。プロファイルにアプリケーション・バンドルID値が存在しない場合は、maf-application.xmlファイルに含まれているアプリケーションの表示名およびアプリケーションIDからこの値が取得されます。デプロイメントJavaコードは、この値をXSLドキュメントにパラメータとして渡します。

次の例は、maf-feature.xmlファイルに含まれているMAFプリファレンスを示しています。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf">
<adfmf:feature id="oracle.hello"
name="Hello"
icon="oracle.hello/navbar-icon.png"
image="oracle.hello/springboard-icon.png">
<adfmf:content id="Hello.Generic">
<adfmf:localHTML url="oracle.hello/index.html"/>
</adfmf:content>
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup"
label="preference group">
<adfmf:preferenceBoolean id="boolPref"
label="boolPref perference"
default="true"/>
<adfmf:preferenceNumber id="numPref"
label="numPref preference"
default="1"
min="1"
max="10"/>
<adfmf:preferenceText id="textPref"
label="textPref preferences"
default="Foo"/>
<adfmf:preferenceList id="listPref"
label="listPref preference"
default="value2">
<adfmf:preferenceValue name="name1"
value="value1"/>
<adfmf:preferenceValue name="name2"
value="value2"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>
</adfmf:features>

D.2.2 maf_arrays.xml

maf_arrays.xmlファイルは、maf_preferences.xmlファイルから参照されるリスト・プリファレンスの名前と値を列挙する文字列配列要素で構成されています。maf-application.xmlおよびmaf-feature.xmlファイルに含まれている各<preferenceList>要素は、2つの文字列配列要素(1つは名前用、もう1つは値用)に変換されます。次の例は、MAF preferenceListの定義を示しています。

<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf">

<adfmf:feature id="oracle.hello" name="Hello" icon="oracle.hello/navbar-icon.png" image="oracle.hello/springboard-icon.png">
...
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup">
<adfmf:preferenceList id="MyList" label="My List">
<adfmf:preferenceValue name="name1" value="value1"/>
<adfmf:preferenceValue name="name2" value="value2"/>
<adfmf:preferenceValue name="name3" value="value3"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>
...

次の例は、maf_arrays.xmlファイルに含まれている、<preferenceList>要素から変換された文字列配列要素のペアを示しています。前の例のMAFのpreferenceList定義は、次の例に示されているように、maf_arrays.xmlファイル内の<string-array name="feature.oracle.hello.prefGroup.MyList___entry_values">および<string-array name="feature.oracle.hello.prefGroup.MyList___entries">に変換されます。

<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:adfmf="http://schemas.android.com/apk/res/oracle.myandroidapp">

<string-array name="feature_oracle_hello_prefGroup.MyList___entry_values">
<item>name1</item>
<item>name2</item>
<item>name3</item>
</string-array>

<string-array name="feature_oracle_hello_prefGroup.MyList___entries">
<item>value1</item>
<item>value2</item>
<item>value3</item>
</string-array>
</resources>

次の例は、maf_preferences.xmlで参照されている<string-arrays>を示しています。

<oracle.adfmf.preferences.AdfMFPreferenceList android:key="feature.oracle.hello.MyList"
android:title="@string/feature_oracle_hello_prefGroup.MyList___title"
android:entries="@array/feature_oracle_hello_prefGroup.MyList___entries"
android:entryValues="@array/feature_oracle_hello_prefGroup.MyList___entry_values" />

D.2.3 maf_strings.xml

次の例で示されているmaf_strings.xmlファイルは、maf_preferences.xmlファイルによって参照される文字列要素、およびmaf-application.xmlおよびmaf-feature.xmlファイルで定義されているリソース・バンドル参照で構成されています。各文字列要素には、文字列および文字列値を一意に識別するname属性があります。

<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:adfmf="http://schemas.android.com/apk/res/oracle.myandroidapp">
...
<string name="feature.PROD.bundle.FeatureName">Products</string>
<string name="feature.oracle.hello.prefGroup.MyBooleanPreference___title">My feature boolean pref</string>
...
</resources>

文字列のソースがリソース・バンドル文字列への参照でない場合、name属性の命名規則は<PreferenceIdentifier>___<androidAttributeName>です。

<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf">
<adfmf:loadBundle basename="mobile.ViewControllerBundle"
var="bundle"/>
<adfmf:feature id="oracle.hello"
name="Hello"
icon="oracle.hello/navbar-icon.png"
image="oracle.hello/springboard-icon.png">
<adfmf:feature id="PROD"
name="#{bundle.FeatureName}"
icon="openMore.png"
image="G.png"
credentials="none">
...
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup">
<adfmf:preferenceBoolean default="true"
id="MyBooleanPreference"
label="My feature boolean pref"/>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>

D.3 iOS用のプリファレンスの変換

MAFは、MAFプリファレンス要素を対応するiOS表現に変換できます。

MAFデプロイメントは、表D-4に記載されているMAFプリファレンスを、iOS設定アプリケーションで必要なプリファレンス・リスト(.plist)ファイル表現に変換します。

表D-5 MAFプリファレンスと、対応するiOS表現

MAFプリファレンス・コンポーネント

iOS表現

<adfmf:preferencePage>

PSChildPaneSpecifier

<adfmf:preferenceGroup>

PSGroupSpecifier

<adfmf:preferenceBoolean>

PSToggleSwitchSpecifier

<adfmf:preferenceList>

PSMultiValueSpecifier

<adfmf:preferenceText>

PSTextFieldSpecifier

<adfmf:preferenceNumber>

PSTextFieldSpecifier

プリファレンス・リスト(.plist )ファイルのiOS要件については、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)にある『Preferences and Settings Programming Guide』を参照してください。

次の例は、maf-application.xmlファイルに基づくMAFプリファレンスのXMLを示しています。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen"
label="Oracle Way Cool Mobile App">
<adfmf:preferenceGroup id="SubPage01"
label="Child Page">
</adfmf:preferenceGroup>
</adfmf:preferences>

D.4 Windows用のプリファレンスの変換

Windowsプラットフォーム用のプリファレンスに関する情報を提供します。

Windowsプラットフォームの場合、MAFは、maf-feature.xmlおよびmaf-application.xmlメタデータから、単一のmaf-preferences.jsonファイルと複数のmaf-preferences.resjsonファイルを、アプリケーションでサポートされているロケールごとに1つずつ生成します。MAFはJSONファイルを使用し、アプリケーションのWindows設定としてそのファイルを保存し、設定画面の表示にも使用します。

Oracleの法律上の注意点

コピーライト

Copyright © 1994-2017, Oracle and/or its affiliates. All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracle Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

Pre-General Availability (一般提供前)版のドキュメントについて

このドキュメントがPre-General Availability (一般提供前)版の場合:

このドキュメントはPre-General Availability (一般提供前)版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のPre-General Availability (一般提供前)版のドキュメントについて

このドキュメントが非公開のPre-General Availability (一般提供前)版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のPre-General Availability Trial Agreement (Pre-GAトライアル契約)のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle Partner Network Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティ

オラクルのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートをご契約のお客様には、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。