Oracle® Fusion Middleware

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

2.0.1

E57592-01(原本部品番号:E55925-01)

2014年9月

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

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

E57592-01

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

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

原本協力者: Ralph Gordon

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

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

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

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle USA, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

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

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

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

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

目次

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

このガイドでのリリース2.0.1.0.0の新しい内容

第I部 モバイル・アプリケーション・フレームワークの理解

1 Oracle Mobile Application Frameworkの概要

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

- 1.2 モバイル・アプリケーション・フレームワーク・ランタイム・アーキテクチャについて

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

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

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

第II部 スタート・ガイド

2 開発環境の設定

- 2.1 MAF環境の概要

- 2.2 MAFアプリケーション開発の前提条件

- 2.2.1 iOSプラットフォーム用アプリケーションを開発するための必要事項

- 2.2.2 Androidプラットフォーム用アプリケーションを開発するための必要事項

- 2.2.3 サポートされているIDEに関する必知事項

- 2.2.4 プラグインの移行に関する必知事項

- 2.3 JDeveloperの設定

- 2.3.1 プラットフォームとフォーム・ファクタに応じた開発環境の構成方法

- 2.3.1.1 フォーム・ファクタに応じた環境の構成

- 2.3.1.2 ターゲット・プラットフォームに応じた環境の構成

- 2.4 iOSプラットフォーム用の開発ツールの設定

- 2.4.1 XcodeおよびiOS SDKのインストール方法

- 2.4.2 iPhoneまたはiPadの設定方法

- 2.4.3 iPhoneまたはiPadシミュレータの設定方法

- 2.5 Androidプラットフォーム用の開発ツールの設定

- 2.5.1 Android SDKのインストール方法

- 2.5.2 Androidデバイスの設定方法

- 2.5.3 Androidエミュレータの設定方法

- 2.5.3.1 Androidエミュレータの構成

- 2.5.3.2 Androidエミュレータの高速化

- 2.6 環境設定のテスト

3 モバイル・アプリケーション開発のスタート・ガイド

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

- 3.2 アプリケーション・ワークスペースの作成

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

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

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

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

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

- 3.2.3 MAFアプリケーションとアプリケーション機能の編集に関する必知事項

- 3.2.4 MAF AMXアプリケーション用のアプリケーション・ワークスペースの作成

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

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

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

- 3.3 ADFモバイル・アプリケーションの移行

- 3.3.1 ADFモバイル・アプリケーションの移行時に行われる処理

- 3.3.1.1 Webサービス・ポリシー定義の移行について

- 3.3.2 移行済アプリケーションにおけるFARに関する必知事項

- 3.3.3 ヘッドレス・モードでのアプリケーションの移行

第III部 MAFアプリケーションの開発

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

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

- 4.1.1 maf-application.xmlの概要エディタの使用方法

- 4.2 モバイル・アプリケーションの構成ファイルについて

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

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

- 4.4 カスタムURLスキームを使用したモバイル・アプリケーションの起動

- 4.5 Springboardとナビゲーション・バーの動作の構成

- 4.5.1 アプリケーションのナビゲーションの構成方法

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

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

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

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

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

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

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

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

- 4.6.3 スライディング・ウィンドウの有効化に関する必知事項

- 4.7 モバイル・アプリケーションでのライフサイクル・リスナーの使用

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

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

- 4.8 モバイル・アプリケーション機能の構成ファイルについて

- 4.9 アプリケーション機能の基本構成の設定

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

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

- 4.10.1 アプリケーション・コンテンツの定義方法

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

- 4.11 ローカライズ済コンテンツの操作

- 4.11.1 リソース・バンドルの使用

- 4.11.1.1 リソース・バンドル・オプションの設定方法

- 4.11.1.2 リソース・バンドル・オプションの選択時に行われる処理

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

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

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

- 4.11.1.6 MAF AMXコンポーネントのプロジェクト・レベルのリソース・バンドルの作成時に行われる処理

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

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

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

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

- 4.12 モバイル・アプリケーションのスキニング

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

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

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

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

- 4.12.5 カスタム・スキンの登録方法

- 4.12.6 MAFスキンのバージョニング方法

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

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

- 4.12.8.1 アプリケーション機能に新しいスタイル・クラスを適用する方法

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

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

- 4.12.10 新しいスタイル・シートをスキンに追加する方法

- 4.12.11 実行時での動的スキン選択の有効化

- 4.12.11.1 エンド・ユーザーが実行時にアプリケーションのスキンを変更できるようにする方法

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

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

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

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

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

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

- 4.14 Oracle Metadata Servicesを使用したMAFファイルのカスタマイズ

- 4.14.1 カスタマイズ・レイヤーの作成方法

- 4.14.2 カスタマイズ・クラスの作成方法

- 4.14.3 カスタマイズ・クラスにアクセスするためのデザインタイムの有効化方法

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

- 4.14.5 モバイル・アプリケーションのカスタマイズ時に行われる処理

- 4.14.6 モバイル・アプリケーションのリソース・バンドルでのカスタマイズの有効化

- 4.14.6.1 リソース・バンドルでカスタマイズを有効化する方法

- 4.14.7 カスタマイズを使用したモバイル・アプリケーションのアップグレード

- 4.14.7.1 モバイル・アプリケーションのアップグレード方法

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

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

- 4.15 モバイル・アプリケーションへのCordovaプラグインの統合

- 4.15.1 iOSおよびAndroidのCordovaプラグインの統合方法

- 4.15.2 プラグインの更新時に行われる処理

- 4.15.3 プラグイン・プリファレンスの追加方法

- 4.15.4 FARを使用したプラグインの統合に関する必知事項

第IV部 MAF AMXアプリケーション機能の作成

5 MAF AMXページの作成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 5.3 ビューの作成

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

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

- 5.3.1.2 MAF AMXページの作成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 6.3.5 ボタンの使用方法

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

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

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

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

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

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

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

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

- 6.3.6 リンクの使用方法

- 6.3.7 イメージの表示方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 6.3.20 反復の有効化方法

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

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

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

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

- 6.3.24 日時の変換方法

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

- 6.3.25 数値の変換方法

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

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

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

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

- 6.5 データ視覚化の指定

- 6.5.1 面グラフの作成方法

- 6.5.2 棒グラフの作成方法

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

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

- 6.5.5 線グラフの作成方法

- 6.5.6 円グラフの作成方法

- 6.5.7 散布図の作成方法

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

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

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

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

- 6.5.12 LEDゲージの作成方法

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

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

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

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

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

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

- 6.5.16.2 凡例の定義

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

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

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

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

- 6.5.16.7 しきい値の定義

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

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

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

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

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

- 6.5.18.3 分離領域の定義

- 6.5.18.4 初期ズームの有効化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 6.9 入力の検証

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

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

7 バインディングの使用とデータ・コントロールの作成

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

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

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

- 7.3 EL式の作成

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

- 7.3.2 EL式の作成方法

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

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

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

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

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

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

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

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

- 7.3.6 ELイベントについて

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

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

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

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

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

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

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

- 7.5.2.1 DataControls.dcx概要エディタ

- 7.5.2.2 「データ・コントロール」パネル

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

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

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

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

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

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

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

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

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

- 7.9 属性の使用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 7.11.10 デバイス・プロパティ

- 7.12 属性の検証

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

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

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

8 Webサービスの使用方法

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

- 8.2 Webサービス・データ・コントロールの作成

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

- 8.2.2 Webサービス・データ・コントロールでSOAPヘッダーをカスタマイズする方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 9.4 URLの構築について

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

- 9.6 構成サービスの移行

10 ローカル・データベースの使用方法

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

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

- 10.1.1.1 同時実行性

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

- 10.1.1.3 データ型

- 10.1.1.4 外部キー

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

- 10.1.1.6 認証

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

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

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

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

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

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

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

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

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

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

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

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

- 11.3 カスタマイズ・クラスに関する必知事項

- 11.3.1 静的なカスタマイズ・コンテンツに関する必知事項

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

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

- 11.4.2 ワークスペースレベルのレイヤー値の構成方法

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

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

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

- 11.5.1 デザインタイムにJDeveloperでカスタマイズ・クラスを使用可能にする方法

- 11.6 adf-config.xmlファイルの構成方法

- 11.7 「カスタマイズ開発者」ロールに関する必知事項

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

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

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

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

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

- 12.2.1 静的APIの使用方法

- 12.2.2 AmxEventクラスの使用方法

- 12.2.3 TypeHandlerの使用方法

- 12.2.4 AmxNodeの使用方法

- 12.2.5 AmxTagの使用方法

- 12.2.6 VisitContextの使用方法

- 12.2.7 AmxAttributeChangeの使用方法

- 12.2.8 AmxDescendentChangesの使用方法

- 12.2.9 AmxCollectionChangeの使用方法

- 12.2.10 AmxNodeChangeResultの使用方法

- 12.2.11 AmxNodeStatesの使用方法

- 12.2.12 AmxNodeUpdateArgumentsの使用方法

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

第V部 高度なトピック

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

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

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

- 13.1.2 リモートURL実装によるApache Cordovaへのアクセスの有効化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 14.3.1 preferenceScopeに関する必知事項

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

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

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

- 15.1 制約の概要

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

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

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

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

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

- 15.2.3 property属性について

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

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

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

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

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

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

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

- 16.1.1 Oracle Cloudの認証方法

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

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

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

17 プッシュ通知の有効化

- 17.1 プッシュ通知の概要

- 17.1.1 プッシュ通知の動作

- 17.1.2 アプリケーションの状態に応じたモバイル・アプリケーションによる通知の表示

- 17.2 モバイル・アプリケーションに対するプッシュ通知の有効化

- 17.3 プッシュ通知ペイロードについて

18 MAFアプリケーションでのエラーの処理

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

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

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

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

第VI部 モバイル・アプリケーションの完成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 19.8 コマンド行からのモバイル・アプリケーションのデプロイ

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

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

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

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

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

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

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

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

- 20.4 サイドチャネルによるデータの漏洩

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

- 20.6 不適切な暗号化

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

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

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

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

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

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

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

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

21 モバイル・アプリケーションの保護

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

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

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

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

- 21.4 MAF接続の構成

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

- 21.4.2 Basic認証の構成方法

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

- 21.4.4 OAuth認証の構成方法

- 21.4.5 Web SSO認証の構成方法

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

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

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

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

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

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

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

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

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

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

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

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

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

- 21.4.19 マルチテナント接続の定義時に行われる処理

- 21.4.20 モバイル・アプリケーションの接続の作成時に行われる処理

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

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

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

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

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

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

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

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

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

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

- 21.6.1 デバイス機能へのアクセスの有効化方法

- 21.6.2 デバイス機能の定義時に行われる処理

- 21.6.3 デバイス機能権限に関する必知事項

- 21.6.4 デプロイ時のデバイス機能に関する必知事項

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

- 21.8 SSLのサポート

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第VII部 付録

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

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

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

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

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

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

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

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

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

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

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

- B.2.3 getApplicationInformation

- B.2.4 gotoDefaultFeature

- B.2.5 getFeatures

- B.2.6 gotoFeature

- B.2.7 getFeatureByName

- B.2.8 getFeatureById

- B.2.9 resetFeature

- B.2.10 gotoSpringboard

- B.2.11 hideNavigationBar

- B.2.12 showNavigationBar

- B.2.13 invokeMethod

- B.2.14 invokeContainerJavaScriptFunction

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

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

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

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

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

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

- C.2.1 Preferences.xml

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

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

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

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

- C.2.2 arrays.xml

- C.2.3 Strings.xml

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

E XMLの解析

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

F サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション

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

はじめに

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

対象読者

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

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

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

Oracle Supportへのアクセス

Oracleサポート・サービスでは、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info) か、聴覚に障害のあるお客様は (http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

関連ドキュメント

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

- Oracle Fusion Middleware Oracle JDeveloperのインストール

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

- Oracle Fusion Middleware Oracle JDeveloper拡張機能の開発

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

- Oracle Fusion Middleware Oracle ADFモバイル・ブラウザ・アプリケーションの開発

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

- Oracle Fusion Middleware Oracle Web Services Managerの理解

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

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

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

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

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

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

- Oracle JDeveloper 12cリリース・ノート(Oracle JDeveloper 12cのインストール内およびOracle Technology Networkにあります)

表記規則

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

規則

意味

太字

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

イタリック体

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

固定幅フォント

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

このガイドでのリリース2.0.1.0.0の新しい内容

このマニュアルは、リリース2.0.1の情報でいくつかの部分が更新されています。次の表は、追加された、または大幅に変更された項を示しています。

項

変更内容

第2章「開発環境の設定」

第2.5.3.1.5項「ネイティブ・スクロールの有効化」

追加された項。

第4章「モバイル・アプリケーションの定義」

第4.6.3項「スライディング・ウィンドウの有効化に関する必知事項」

AdfmfSlidingWindowUtilitiesクラスを使用してアプリケーションにスライディング・ウィンドウを作成する方法を説明するために追加された項。

第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」

次のインタフェースが指定する機能ライフサイクル・リスナーの説明を含めるために名前の変更(以前は「ライフサイクル・イベント・リスナーについて」)と改訂が行われた項。

oracle.adfmf.feature.LifeCycleListener

第4.12項「モバイル・アプリケーションのスキニング」

このリリースを使用して作成したMAFアプリケーションでのデフォルトの新しいスキン・バージョン(mobileAlta-1.2)を説明するために改訂された項。

第4.15.1項「iOSおよびAndroid用のCordovaプラグインの統合方法」

プラグイン・ライブラリにリンクするためのオプションを追加しなければならないことを明確にするために改訂された項、およびプラグインを参照するために改訂された例4-28。

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

第5.3.1.6項「ページ・コンテンツの共有」

EL式の検証に関する情報を含めるために更新された項。

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

第6.2.8項「ポップアップ・コンポーネントの使用方法」

ポップアップを閉じる動作コンポーネントに関する追加情報を含めるために更新された項。

第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」

新しいリスト・ビュー・レイアウトに関する情報を含めるために更新された項。

第6.3.15.3項「リスト・ビュー・レイアウトの構成」

新しいリスト・ビュー・レイアウトの説明を含めるために更新された項。

第6.5項「データ視覚化の指定」

非推奨の横棒グラフ・コンポーネントに関する情報を削除するために改訂された項。

第6.5.1項「面グラフの作成方法」

面グラフの新しい属性と、属性グループの新しい子コンポーネントに関する情報を含めるために更新された項。

第6.5.2項「棒グラフの作成方法」

棒グラフの新しい属性に関する情報を含めるために更新された項。

第6.5.4項「コンボ・チャートの作成方法」

コンボ・チャートの新しい属性に関する情報を含めるために更新された項。

第6.5.5項「線グラフの作成方法」

線グラフの新しい属性に関する情報を含めるために更新された項。

第6.5.13項「ステータス・メーター・ゲージの作成方法」

垂直ステータス・メーターのサポートを説明するために更新された項。

第6.5.17項「地理マップ・コンポーネントの作成方法」

マーカー上のポップアップのサポートを説明するために更新された項。

第6.5.22項「時系列コンポーネントの作成方法」

時系列コンポーネントの制限に関する情報を含めるために更新された項。

第6.5.22.1項「時系列コンポーネントへのカスタム・スタイル設定の適用」

新しいスタイルに関する情報を含めるために更新された項。

第6.5.26項「静的データに基づいたデータ視覚化コンポーネントの作成方法」

データ・アイテムに対応する要素を列挙することによって、静的にコンポーネント構造を定義する方法を説明するために更新された項(例: グラフにはcharDataItem要素、時系列の系列にはtimelineItems)。

第6.5.27項「チャート・コンポーネントのインタラクティブ性を有効にする方法」

チャート系列アイテムおよび凡例アイテムのサポートを説明するために更新された項。

第6.5.28項「極チャートの作成方法」

追加された項。

第6.6.3項「スキニング用のCSS IDセレクタの使用に関する必知事項」

追加された項。

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

チャート系列アイテムおよび凡例アイテムのサポートを説明するために更新された項。

第21章「モバイル・アプリケーションの保護」

第21.6項「デバイス機能へのアクセスの許可」

ネットワークへのアクセスを許可するデバイス機能がデフォルトで現在有効になっていることを説明するために更新された項(これは、デフォルトで有効になっている唯一のデバイス機能です)。

第22章「MAFアプリケーションのテストおよびデバッグ」

第22.3項「MAFアプリケーションのデバッグ」

アプリケーションのテストまたはデバッグの新しい手順を含めるために更新された項。

第22.3.1項「デバッグ構成に関する必知事項」

デバッグに使用するモバイル実行構成の定義用の新しい手順を説明するために更新された項。

付録A「トラブルシューティング」

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

追加された項。

付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」

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

新しいサンプル・アプリケーション(ACS、ExpandCollapseComponent、SecurityDemoおよびSlidingWindows)を含めるために更新された項。

第I部

モバイル・アプリケーション・フレームワークの理解

MAFの概念、テクノロジおよび開発方法について説明します。

第I部は、次の章で構成されています。

- 第1章「Oracle Mobile Application Frameworkの概要」

1 Oracle Mobile Application Frameworkの概要

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

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

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

- 第1.2項「モバイル・アプリケーション・フレームワーク・ランタイム・アーキテクチャについて」

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

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

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

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

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

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

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

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

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

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

1.2 モバイル・アプリケーション・フレームワーク・ランタイム・アーキテクチャについて

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

図1-2 Oracle Mobile Application Frameworkランタイム・アーキテクチャ

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

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

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

注意:

コンテンツはリモートで提供されるため、アプリケーションはサーバー接続がアクティブな場合にのみ使用できます。

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

- Cordova: デバイスのネイティブ機能およびサービスをモバイル・アプリケーションに統合する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は、サーバーから戻されたデータを処理するための追加のビジネス・ロジックを提供するなど、モバイル・アプリケーション・フレームワークの機能拡張のために作成できるJavaクラスです。マネージドBeanは埋込みのJavaサポートによって実行され、JavaME CDC仕様に準拠しています。詳細は、第7章「バインディングの使用とデータ・コントロールの作成」を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

- SOAPおよびRESTサービス: リモートでホストされているSOAPベースまたはRESTベースのWebサービスで、Javaレイヤーまたはデータ・コントロールを介してアクセスできます。

注意:

MAF AMXで作成されたアプリケーション機能では、REST-XMLおよびSOAPをベースとしたデータ・サービスにデータ・コントロールを介してアクセスできます。RESTサービス・アダプタを使用する場合、データ・コントロールは不要です。

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

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

注意:

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

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

- 要件の収集

- 設計

- 開発

- デプロイ

- テストおよびデバッグ

- 保護

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

- 再デプロイ

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

- 公開

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

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

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

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

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

- 第3章「モバイル・アプリケーション開発のスタート・ガイド」

- 第4章「モバイル・アプリケーションの定義」

- 第IV部「MAF AMXアプリケーション機能の作成」

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- スキニングの使用方法

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

詳細は、付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照してください。

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

第II部

スタート・ガイド

MAFアプリケーション開発のための開発環境の設定方法について説明し、MAFアプリケーションの作成手順を示します。

第II部は、次の章で構成されています。

- 第2章「開発環境の設定」

- 第3章「モバイル・アプリケーション開発のスタート・ガイド」

2 開発環境の設定

この章では、アプリケーション開発およびデプロイメント用にモバイル・アプリケーション・フレームワーク(MAF)環境を設定および構成する方法について説明します。

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

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

- 第2.2項「MAFアプリケーション開発の前提条件」

- 第2.3項「JDeveloperの設定」

- 第2.4項「iOSプラットフォーム用の開発ツールの設定」

- 第2.5項「Androidプラットフォーム用の開発ツールの設定」

- 第2.6項「環境設定のテスト」

2.1 MAF環境の概要

MAFアプリケーションを開発する前に、様々なソフトウェア・コンポーネントをダウンロード、インストールおよび構成することで、開発環境を設定する必要があります。

IDE、モバイル・プラットフォーム固有のツールおよび(可能であれば)モバイル・デバイスで構成される標準的なMAF開発環境を設定するには、第2.2項「MAFアプリケーション開発の前提条件」で説明する手順に従ってください。

2.2 MAFアプリケーション開発の前提条件

アプリケーション開発の前提条件は、ターゲット・プラットフォームおよび実行を予定している作業のタイプによって異なります。

- iOSプラットフォーム用アプリケーションを開発するための必要事項

- Androidプラットフォーム用アプリケーションを開発するための必要事項

特定のタイプのMAFアプリケーション・コンテンツ(HTML、リモートURLまたはMAF AMX)を作成するために、追加のツールをインストールする必要はありません。

2.2.1 iOSプラットフォーム用アプリケーションを開発するための必要事項

iOSに対応したMAFアプリケーションの作成を開始する前に、次のものが使用可能であることを確認します。

- Mac OS Xが稼働しているコンピュータ

- Oracle JDeveloper (第2.3項「JDeveloperの設定」を参照)。

- MAF用のOracle JDeveloper拡張機能(第2.3項「JDeveloperの設定」を参照)

- XcodeおよびiOS SDK (第2.4.1項「XcodeおよびiOS SDKのインストール方法」を参照)

開発環境へのアプリケーションのデプロイをのスタート・ガイドする前に(第3章「モバイル・アプリケーション開発のスタート・ガイド」を参照)、モバイル・デバイスまたはそのシミュレータを使用するかを決定しますが、シミュレータを使用する場合は第2.4.3項「iPhoneまたはiPadシミュレータの設定方法」を参照し、モバイル・デバイスへのデプロイを目標としている場合は、上に示したリストに含まれるコンポーネントに加えて次のものが使用可能であることを確認してください。

- 各種ログイン資格証明。詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

- iOSデバイス。詳細は、第2.4.2項「iPhoneまたはiPadの設定方法」を参照してください。

2.2.2 Androidプラットフォーム用アプリケーションを開発するための必要事項

Androidに対応したMAFアプリケーションの作成を開始する前に、次のものが使用可能であることを確認します。

- 次のいずれかのオペレーティング・システムが稼働しているコンピュータ

- Microsoft Windows Vista

- Microsoft Windows 7

- Mac OS X

- JDK1.7の最新バージョン

- Platform 4.0以降のAndroid SDKとそのツール(第2.5.1項「Android SDKのインストール方法」を参照)

- Oracle JDeveloper (第2.3項「JDeveloperの設定」を参照)。

- MAF用のOracle JDeveloper拡張機能(第2.3項「JDeveloperの設定」を参照)

開発環境へのアプリケーションのデプロイをのスタート・ガイドする前に(第3章「モバイル・アプリケーション開発のスタート・ガイド」を参照)、モバイル・デバイスまたはそのエミュレータを使用するかを決定しますが、エミュレータを使用する場合は第2.5.3項「Androidエミュレータの設定方法」を参照し、モバイル・デバイスへのデプロイを目標としている場合は、上に示したリストに含まれるコンポーネントに加えて次のものが使用可能であることを確認してください。

- 各種ログイン資格証明。詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

- Androidデバイス。詳細は、第2.5.2「Androidデバイスの設定方法」を参照してください。

2.2.3 サポートされているIDEに関する必知事項

MAFアプリケーションの開発には、JDeveloper以外のIDEを使用することが可能です。このようなIDEの1つにEclipse (https://www.eclipse.org/downloadsを参照)がありますが、これを使用するには、Oracle Enterprise Pack for Eclipse (OEPE)拡張機能(http://www.oracle.com/technetwork/developer-tools/eclipse/overview/index.htmlを参照)のインストールが必要になります。

2.2.4 プラグインの移行に関する必知事項

PhoneGapはApache Cordovaに吸収されたため、PhoneGapプラグインがインストールされている場合は、それらをCordova 2.2バージョンに移行する必要があります。

2.3 JDeveloperの設定

Oracle JDeveloperとそのMAF拡張機能は、MAFアプリケーションの開発に不可欠なツールです。

始める前に

MAFドキュメント・ページ(http://www.oracle.com/technetwork/developer-tools/maf/documentation/)で動作保証およびサポート・マトリックスを参照し、ターゲット・プラットフォームについて、第2.2項「MAFアプリケーション開発の前提条件」にリストされているソフトウェアと互換性のあるOracle JDeveloperのリリースを確認してください。

Oracle JDeveloperの適切なリリースをダウンロードし、インストールします。要求されたら、「Studio開発者(すべての機能)」ロールを選択します。

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

- ターゲット・プラットフォームがiOSの場合は、『Oracle Fusion Middleware Oracle JDeveloperのインストール』のMac OS Xプラットフォーム上のOracle JDeveloperの使用方法に関する項を参照してください。

- ターゲット・プラットフォームがAndroidの場合は、『Oracle Fusion Middleware Oracle JDeveloperのインストール』を参照してください。

MAF拡張機能をダウンロードしてインストールするには:

1. JDeveloperで、「ヘルプ」→「更新のチェック」を選択します。

注意:

プロキシ設定を構成する必要がある場合は、メイン・メニューから「ツール」→「プリファレンス」を選択し、「プリファレンス」ダイアログの左側のツリーから「Webブラウザとプロキシ」を選択します。

2. 図2-1に示す「更新ソースの選択」ページで、「更新センターの検索」の公式のOracle拡張機能と更新を選択して、「次へ」をクリックします。

図2-1 JDeveloperでの更新のチェック

3. 「インストールする更新の選択」ダイアログで、「モバイル・アプリケーション・フレームワーク」の更新を選択します。

4. 図2-2に示す「ライセンス契約」ページで、Oracleモバイルに関するOracle Technology Networkライセンス条項を確認します。

注意:

Oracle Mobile Application Framework Programに関するすべてのライセンス条項および条件(http://www.oracle.com/technetwork/indexes/downloads/index.html)に従う必要があります。

5. 「同意する」をクリックします。

図2-2 Oracle Mobile Application Framework Programのライセンス契約

6. 「次へ」をクリックして、「完了」をクリックします。

7. JDeveloperを再起動します。

8. JDeveloperにMAFが正しく追加されているかどうかを確認します。

- メイン・メニューから「ファイル」→「新規」→「ギャラリから」を選択し、「新規ギャラリ」ダイアログを開きます。

- 左側の「カテゴリ」ツリーで、「クライアント層」ノードを展開し、「モバイル・アプリケーション・フレームワーク」が存在することを確認します(図2-3を参照)。

図2-3 MAFのインストールの確認

さらに、正しいバージョンのMAFがインストールされていることを確認します。確認するには、メイン・メニューから「ヘルプ」→「バージョン情報」を選択し、Oracle JDeveloperバージョン情報ダイアログの「拡張機能」タブを選択し、図2-4に示すように、拡張機能リストのエントリで「モバイル・アプリケーション・フレームワーク」を検索して調べます。

図2-4 MAFのバージョンの確認

前述の手順に加え、開発環境をターゲット・プラットフォームおよびフォーム・ファクタに応じて構成する必要があります。詳細は、第2.3.1項「プラットフォームとフォーム・ファクタに応じた開発環境の構成方法」を参照してください。

2.3.1 プラットフォームとフォーム・ファクタに応じた開発環境の構成方法

MAFアプリケーションの開発およびデプロイを開始する前に、該当するプラットフォーム(第2.3.1.2項「ターゲット・プラットフォームに応じた環境の構成」を参照)とフォーム・ファクタ(see 第2.3.1.1項「フォーム・ファクタに応じた環境の構成」を参照)に対応するJDeveloperプリファレンスを構成する必要があります。

2.3.1.1 フォーム・ファクタに応じた環境の構成

フォーム・ファクタとは特定のデバイス構成のことです。各フォーム・ファクタは指定した名前で識別され、ここには、ピクセル単位の幅と高さで表された指定解像度に関する情報が含まれています。

プリファレンスで定義されているフォーム・ファクタはMAF AMXページの「プレビュー」タブで使用されるため(第5.3.2.2項「「プレビュー」の使用方法」を参照)、MAF AMXアプリケーション機能をMAFアプリケーションの一部として含める予定で、デフォルト設定を使用しない場合は、この構成を実行するよう選択できます。開発時に、様々なフォーム・ファクタを選択したり切り替えたりして、MAF AMXページをレンダリングする方法を確認できます。分割画面ビューを使用すると、同じページに適用された複数のフォーム・ファクタを確認することもできます。

詳細は、第4.12.1項「maf-config.xmlファイルについて」を参照してください。

始める前に

第2.3項「JDeveloperの設定」の説明に従って、JDeveloperとMAF拡張機能をダウンロードしてインストールします。

フォーム・ファクタを構成するには:

1. JDeveloperのメイン・メニューから「ツール」→「プリファレンス」を選択して、「プリファレンス」を開きます。

2. 図2-5に示されている「プリファレンス」ダイアログで、左側のツリーから「モバイル・アプリケーション・フレームワーク」を選択します。

図2-5 フォーム・ファクタの定義

「モバイル・アプリケーション・フレームワーク」ページには使用可能なフォーム・ファクタが移入され、デフォルトは「Android Low」に設定されています。

このプリファレンス・ページでは、画面解像度サイズとプラットフォームを結合する一連の名前付きフォーム・ファクタを作成して管理できます。

3. 新しいフォーム・ファクタを作成するには、緑の正符号(「新規」)をクリックして、次の項目を設定します。

- 名前: フォーム・ファクタの識別に使用する意味のある文字列。

- プラットフォーム: モバイル・デバイスのプラットフォーム。

- モデル: モバイル・デバイスのタイプ。

- デフォルトの向き: MAF AMXページの「プレビュー」タブで使用されるデバイスのデフォルトの向き。「縦」または「横」です。この設定は値のドロップダウン・リストから選択します。デフォルト値は「縦」で、新しいフォーム・ファクタの作成時にはこの値が移入されます。

- 幅: ピクセル単位の幅。値は正の整数である必要があり、入力は検証されます。

- 高さ: ピクセル単位の高さ。値は正の整数である必要があり、入力は検証されます。

- スケール係数: 表示のスケール係数。この値は、1.0、2.0、3.0のいずれかにする必要があります。

注意:

フォームに名前と解像度が設定されていない場合、MAFからエラー・メッセージが表示されます。

4. デフォルト設定に戻す必要がある場合は、「その他のアクション」→「デフォルトに戻す」をクリックします。

5. 「OK」をクリックして、設定を終了します。

2.3.1.2 ターゲット・プラットフォームに応じた環境の構成

MAFによってサポートされるターゲット・プラットフォームに対応するアプリケーションを正常にパッケージ化およびデプロイするには、プラットフォームの名前や、プラットフォーム固有のツールやデータを格納するための開発用コンピュータ上のディレクトリなどの情報を、JDeveloperに提供する必要があります。便宜上、MAFによりJDeveloperプリファレンスにこれらの設定が事前に移入されています。アプリケーション署名に関連する複数のファクタに応じて、一部のフィールドの変更が必要になる場合があります。

始める前に

第2.3項「JDeveloperの設定」の説明に従って、JDeveloperとMAF拡張機能をダウンロードしてインストールします。

ターゲット・プラットフォームに応じて、Android SDK (第2.5.1項「Android SDKのインストール方法」を参照)またはiOS SDKとXcode (第2.4.1項「XcodeおよびiOS SDKのインストール方法」を参照)をダウンロードし、構成します。

ターゲット・プラットフォームに応じた環境を構成するには:

1. JDeveloperのメイン・メニューから「ツール」→「プリファレンス」を選択して、「プリファレンス」を開きます。

2. 図2-5に示されている「プリファレンス」ダイアログで、ツリーから「モバイル・アプリケーション・フレームワーク」→「Androidプラットフォーム」または「モバイル・アプリケーション・フレームワーク」→「iOSプラットフォーム」を選択し、サポートされているプラットフォームのパスおよび構成パラメータが含まれるページを開きます(図2-6および図2-7を参照)。
各プラットフォーム固有のページには、プラットフォームSDK (AndroidまたはiOS)のプリファレンスが表示されます。ここには、MAFがAndroidまたはiOSプロジェクトのコンパイルおよびデプロイのために必要とするパスなどの必要情報が集められています。

- Androidプラットフォームの場合は、コンピュータ上のAndroid SDKの場所とターゲットのAndroidプラットフォームのローカル・ディレクトリを指定し、署名資格証明に関する情報を入力します(図2-6を参照)。

図2-6 Androidプラットフォームのプリファレンスの構成

- iOSプラットフォームの場合(図2-7を参照)、次の情報を指定します。

- Mac OSコンピュータ上のiOSシミュレータSDKの場所

- Xcodebuildユーティリティの場所(第19.4.1項「iOSシミュレータへのiOSアプリケーションのデプロイ方法」を参照)

- iTunesメディア・ファイルの場所(iOSデバイスに同期化されるモバイル・アプリケーションを含む)

- iOSデバイスの署名情報(第19.2.4.2項「デバイス署名オプションの設定」を参照)

図2-7 iOSプラットフォームのプリファレンスの構成

2.4 iOSプラットフォーム用の開発ツールの設定

iOSプラットフォーム用のMAFアプリケーションの開発に向けて準備を行う場合には、第2.2項「MAFアプリケーション開発の前提条件」に示した一般目的のツールに加えて、iPhoneまたはiPadの設定を行う場合もあります(第2.4.2項「iPhoneまたはiPadの設定方法」を参照)。

iOS SDKインストール内にはiPhoneおよびiPadのシミュレータが含まれているため、そしてiOS SDKはXcodeインストールに含まれているので、これらを別途インストールする必要はありません。詳細は、第2.4.3項「iPhoneまたはiPadシミュレータの設定方法」を参照してください。

2.4.1 XcodeおよびiOS SDKのインストール方法

Xcodeは、http://developer.apple.com/xcode/からダウンロードできます。このダウンロードには、iOS SDKが含まれています。

Xcodeをインストールしたら、少なくとも1回はこれを実行して、Appleのライセンスおよび設定ダイアログに入力を行う必要があります。これらの手順を実行していない場合、JDeveloperからXcodeまたはデバイス・シミュレータへの構築およびデプロイ・サイクルが、「リターン・コード: 69」エラーによって失敗します。

注意:

XcodeおよびiOS SDKの以前のバージョンはMac App Storeから入手できないため、それらをダウンロードするには、http://appleid.apple.comからApple IDを取得した後、そのApple IDをApple Developer Programに登録して、Apple社の開発者向けサイト(http://developer.apple.com)へのアクセス権を取得します。

2.4.2 iPhoneまたはiPadの設定方法

MAFアプリケーションの開発およびデプロイメントでは、iPhone、iPadまたはこれらのシミュレータのいずれかを使用できます(第2.4.3項「iPhoneまたはiPadシミュレータの設定方法」を参照)。テストには実際のiPhoneまたはiPadを使用することをお薦めしますが(第22.2項「MAFアプリケーションのテスト」を参照)、この場合は、iPhoneまたはiPadをコンピュータと接続して、2つのデバイス間のリンクを確立する必要があります。

iOSデバイスにデプロイするには、有効なライセンス、資格証明および配布プロファイルを備えたiOSデバイスを用意する必要があります。詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

注意:

Apple社のライセンス条項および条件は変更される場合があるため、内容を理解し、それらに従うとともに、最新の変更内容を把握しておく必要があります。

2.4.3 iPhoneまたはiPadシミュレータの設定方法

MAFアプリケーションの開発およびデプロイメントでは、iOSデバイス自体を使用するか(第2.4.2項「iPhoneまたはiPadの設定方法」を参照)、そのシミュレータを使用できます。通常、シミュレータへのデプロイはデバイスへのデプロイよりはるかに高速で、最初にアプリケーションに署名する必要もありません。

シミュレータは自動的に起動できます。追加の設定は必要ありません。

注意:

JDeveloperからデバイス・シミュレータにアプリケーションをデプロイする前に、まずシミュレータを実行する必要があります。

アプリケーションでWebサービスを使用する予定で、企業のファイアウォールで保護されている環境の場合は、外部ネットワーク・アクセスを構成する必要がある可能性があります。このためには、開発用コンピュータのシステム・プリファレンスでネットワーク設定を変更します。詳細は、第8.7項「ブラウザ・プロキシ情報の構成」を参照してください。

2.5 Androidプラットフォーム用の開発ツールの設定

Androidプラットフォーム用のMAFアプリケーションの開発に向けて準備を行う場合には、第2.2項「MAFアプリケーション開発の前提条件」に示した一般目的のツールに加えて、Androidデバイスの設定を行う場合もあります(第2.5.2項「Androidデバイスの設定方法」を参照)。

エミュレータはAndroid SDKインストールに含まれているので、これらを別途インストールする必要はありません。詳細は、第2.5.3項「Androidエミュレータの設定方法」を参照してください。

Androidプラットフォーム用の開発を行う場合、JDeveloperとAndroidの両方でサポートされるオペレーティング・システムはどれでも使用できます。

詳細は、Android開発者のWebサイト(http://developer.android.com/tools/index.html)の「Developer Tools」を参照してください。

2.5.1 Android SDKのインストール方法

Android SDKには、Androidデバイス用のアプリケーションを構築するために必要な開発ツールが含まれています。Android SDKはモジュラなので、ターゲットのAndroidプラットフォームとアプリケーションの要件に応じてコンポーネントを個別にダウンロードできます。

プラットフォームを選択するときには、MAFがAndroid 4.0以上をサポートしていることに注意します。

始める前に

使用している環境が、Android開発者のWebサイト(http://developer.android.com/sdk/index.html)の「Get the Android SDK」にリストされているオペレーティング・システム、JDKバージョンおよびハードウェア要件と適合していることを確認します。

注意:

AntおよびLinuxの要件はMAFの開発環境には適用できませんが、Eclipseは、選択したIDEによっては適用できることがあります。

Android SDKをインストールするには:

1. http://developer.android.com/sdk/index.htmlから、Android SDKスターター・パッケージをダウンロードします。

2. Android開発者のWebサイト(http://developer.android.com/sdk/installing.html)の「Setting Up an Existing IDE」にある手順に従って、インストールを完了します。

注意:

Eclipseを使用する予定がない場合は、Android SDKのインストール手順の手順3をスキップします。

2.5.2 Androidデバイスの設定方法

MAFアプリケーションの開発およびデプロイメントでは、Androidデバイス自体を使用(テストにはこちらをお薦めします。第22.2項「MAFアプリケーションのテスト」を参照)するか、エミュレータを使用(第2.5.3項「Androidエミュレータの設定方法」を参照)できます。

Androidデバイスの設定方法の詳細は、Android開発者のWebサイト(http://developer.android.com/tools/device.html)の「Using Hardware Devices」にある手順を参照してください。

注意:

デバイス・ベースのデバッグのためにUSB接続を使用している場合、問題が発生する可能性があります。詳細は、第22章「MAFアプリケーションのテストおよびデバッグ」を参照してください。

ターゲットのAndroidデバイスがUSBデバイス・ドライバの.infファイル内にリストされていない場合、Androidデバッグ・ブリッジ(ADB)のインストールに失敗してしまいます。この問題の回避方法は次のとおりです。

1. 使用しているデバイスの正しい値を見つけます。

2. android_winusb.infファイルの[Google.NXx86]および[Google.NTamd64]セクションを更新します。

詳細は、Android開発者のWebサイト(http://developer.android.com/sdk/win-usb.html)の「Google USB Driver」を参照してください。

2.5.3 Androidエミュレータの設定方法

MAFアプリケーションの開発およびデプロイメントでは、Androidデバイス自体を使用するか(第2.5.2項「Androidデバイスの設定方法」を参照)、そのエミュレータを使用できます。通常、エミュレータへのデプロイはデバイスへのデプロイよりはるかに高速で、最初にアプリケーションに署名する必要もありません。

Android Virtual Device (AVD)と呼ばれるエミュレータ構成の作成方法の詳細は、Android開発者のWebサイト(http://developer.android.com/tools/devices/index.html)の「Managing Virtual Devices」にある手順を参照してください。新規Android Virtual Deviceの作成ダイアログ(http://developer.android.com/tools/devices/managing-avds.htmlの「Managing AVDs with AVD Manager」を参照)を使用してAVDを作成する場合は、すべての設定を確認し、エミュレート予定のものに構成が一致するようにしてください。特に、次のことを確認する必要があります。

- 「Target」フィールドに、正しいエミュレーションのために必要なAndroidプラットフォーム・レベルが定義されている必要があります。

- 「CPU/ABI」フィールドに、Intel Atomシステム・イメージが反映されている必要があります(第2.5.3.2.1項「Intel HAXMに応じたAVDの構成」を参照)。

- 「SD Card」フィールドには、アプリケーションによりファイルがアップロードされるか、ファイル自体によりファイルがSDカードにインストールされるかに基づいた定義が含まれる必要があります。

- 「Hardware」フィールド(http://developer.android.com/tools/devices/managing-avds.html#hardwareoptsの「Hardware Options」表を参照)のデフォルト設定が、標準的なMAFアプリケーションに受け入れ可能なものである必要があります。カメラ、地理的位置情報サービスなどのハードウェア機能をアプリケーションに追加する場合は、新規プロパティを作成します。

アプリケーションをテストする予定のAndroidプラットフォームごとに、AVDを作成する必要があります。

エミュレータの使用方法の詳細は、Android開発者のWebサイト(http://developer.android.com/tools/devices/emulator.html)の「Using the Android Emulator」を参照してください。

2.5.3.1 Androidエミュレータの構成

Androidエミュレータの基本設定が完了したら、次の構成を実行するよう選択できます。

- エミュレータの状態の保存(第2.5.3.1.1項「エミュレータの状態の保存」を参照)

- SDカードの作成、保存および再使用(第2.5.3.1.2項「SDカードの作成、保存および再使用」を参照)

- ネットワークの構成(第2.5.3.1.3項「ネットワークの構成」を参照)

- ネットワーク・プロキシの構成(第2.5.3.1.4項「ネットワーク・プロキシの構成」を参照)

- ネイティブ・スクロールの有効化(第2.5.3.1.5項「ネイティブ・スクロールの有効化」を参照)

2.5.3.1.1 エミュレータの状態の保存

エミュレータの状態を保存するか、保存済の状態を再利用することによって、エミュレータのロード時間を短縮できます。このためには、(Windowsコンピュータ上の)C:\Users\username\.android\avdディレクトリにあるavdファイルまたはフォルダを操作します。各avdフォルダには、userdata.img、userdata.qemu.img、cache.imgなどの複数のファイルが格納されています。cache.imgファイルを別のエミュレータのavdフォルダにコピーして、その状態を別のエミュレータで使用できます。

または、コマンド行を使用して、-snapshot-list、-no-snapstorageなどの関連コマンドを実行できます。これらのコマンドには、emulator -helpコマンドを使用してアクセスできます。

注意:

このユーティリティを使用する場合、ロード・プロセスを実行すると、システムのすべてのコンテンツ(ユーザー・データやSDカードのイメージを含む)が、スナップショット作成時に保存されたコンテンツによって上書きされるので注意してください。別のスナップショットに保存していないと、変更内容はすべて失われてしまいます。

2.5.3.1.2 SDカードの作成、保存および再使用

Android開発者のWebサイトの「SD Card Emulation」(http://developer.android.com/tools/devices/emulator.html#sdcard)に、SDカードを作成、保存および再利用する理由が説明されています。これらの操作は、次のコマンドを実行して行うことができます。

- SDカードを作成するコマンドは次のとおりです。

C:\android sdk directory\tools>mksdcard -l SD500M 500M C:\Android\sd500m.img

- 既存のAVDをリストするコマンドは次のとおりです。

C:\android sdk directory\tools>android list avd

これによって、次のようなリストが生成されます。

Name:    AndroidEmulator1
Device:  Nexus S (Google)
Path:    C:\Users\username\.android\avd\AndroidEmulator1.avd
Target:  Android 4.2.2 (API level 17)
Tag/ABI: default/x86
Skin:    480x800
------------
Name:    AndroidEmulator2
Device:  Nexus S (Google)
Path:    C:\Users\username\.android\avd\AndroidEmulator2.avd
Target:  Android 4.2.2 (API level 17)
Tag/ABI: default/armeabi-v7a
Skin:    480x800
Sdcard:  500M

- 作成したSDカードによってAndroidEmulator2を起動するコマンドは次のとおりです。

C:\Android\android sdk directory\tools>emulator -avd AndroidEmulator2 -sdcard C:\Android\sd500m.img

- 実行中のAndroidエミュレータ・インスタンスをリストするコマンドは次のとおりです。

C:\Android\android sdk directory\platform-tools>adb devices

- テスト・イメージをSDカードにコピーするコマンドは次のとおりです(この場合、エミュレータを再起動する必要があります)。

C:\Android\sdk\platform-tools>adb push test.png sdcard/Pictures
85 KB/s (1494 bytes in 0.017s)

詳細は、Androidのツールのヘルプ(http://developer.android.com/tools/help/index.html)を参照してください。

2.5.3.1.3 ネットワークの構成

Androidエミュレータからは、10.0.2.2 IPを経由して、ホスト・コンピュータにアクセスできます。ホスト・コンピュータからエミュレータに接続するには、開発用コンピュータのコマンド行またはスクリプトからadbコマンドを実行して、ポート・フォワーディングを設定する必要があります。

ソケット接続を転送するには、次のコマンドを実行します。

adb forward local remote

この際、次の転送仕様を使用します。

- tcp:port

- localabstract:unix domain socket name

- localreserved:unix domain socket name

- localfilesystem:unix domain socket name

- dev:character device name

- jdwp:process pid (リモートのみ)

たとえば、任意のクライアントが次のように、ポート55000のエミュレータで実行されているサーバーへの接続をリクエストできます。

adb -e forward tcp:8555 tcp:55000

この例では、ホスト・コンピュータから、クライアントはlocalhost:8555に接続し、そのソケットを介して通信を行います。

詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/adb.html)の「Android Debug Bridge」を参照してください。

2.5.3.1.4 ネットワーク・プロキシの構成

開発用コンピュータが企業のファイアウォールで保護されている場合は、次のいずれかの技術を使用してプロキシを構成する必要がある場合があります。

1. このコマンドを実行して、エミュレータを起動し、エミュレータとブラウザとの接続を初期化します。

emulator -avd myavd -http-proxy myproxy

2. エミュレータを起動してから、次のようにして設定ユーティリティを使用します。

1. 「Wireless & Networks」を選択します。

2. 「Mobile Networks」→「Access Point Names」を選択します。

3. 適切なインターネット・オプションを選択します。

4. 「Edit access point list」を使用して、プロキシ、ポート、ユーザー名およびパスワードを設定します。

2.5.3.1.5 ネイティブ・スクロールの有効化

リスト・ビューMAF AMX UIコンポーネントの応答性を向上させるには(第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)、次のようにしてネイティブ・スクロールを有効にします。

1. android.hardwareAcceleratedプロパティをadf-config.xmlファイルに追加し、このプロパティをtrueに設定します(例2-1を参照)。

例2-1 ネイティブ・スクロールの有効化

<adf-config>
...
<adf:adf-properties-child
xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="android.hardwareAccelerated" value="true"/>
</adf:adf-properties-child>
...
</adf-config>

2. 「Android用MAFのデプロイメント・プロファイルのプロパティ」エディタで、「Androidオプション」ページ(第19.2.3.1項「アプリケーションの詳細オプションの設定」を参照)を使用して、次のように設定します。

- 「最小SDK APIレベル」フィールドを11以上に設定します。

- 「ターゲットSDK APIレベル」フィールドを9に設定します。

3. JDeveloperのメイン・メニューで「プリファレンス」を開き、「モバイル・アプリケーション・フレームワーク」→「Androidプラットフォーム」を選択し、「Androidプラットフォーム・ロケーション」フィールドがandroid-11フォルダ以上を指すようにします。

注意:

iOSプラットフォームでは、デフォルトでネイティブ・スクロールは有効です。

2.5.3.2 Androidエミュレータの高速化

Intel Hardware Accelerated Execution Manager (Intel HAXM)は、Intelドライバを利用してAndroidデバイス・エミュレータを高速化するように設計されています。

Intel HAXMは、Microsoft Windows、Mac OS XおよびLinux向けの個別のカーネル・ベース仮想マシン・オプション(KRM)が実行されているコンピュータで使用可能です。インストレーション・ガイドや各オペレーティング・システムのシステム要件の詳細を確認するには、http://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-managerを参照してください。

開発用コンピュータが実行されているオペレーティング・システムに関係なく、次のものが必要です。

- バージョン17以上のAndroid SDKのインストール(第2.5.1項「Android SDKのインストール方法」を参照)。

- BIOSレベルでIntel VT-x、EM64TおよびExecute Disable (XD)ビット機能をサポートするIntelプロセッサ。

- 1GB以上の使用可能なRAM。

Intel HAXMをダウンロードするには、Android SDK Manager (「Speeding Up the Android Emulator on Intel Architecture」を参照)を使用するか、Intel社の次の場所を使用します。

- Microsoft Windows用ダウンロード

- Mac OS X用ダウンロード

- Linux用ダウンロード

Intel HAXMをインストールするには、http://software.intel.com/en-us/android/articles/speeding-up-the-android-emulator-on-intel-architectureにある記事「Speeding Up the Android Emulator on Intel Architecture」で説明されている手順に従います。特に重要となるのは、AVDの構成です(第2.5.3.2.1項「Intel HAXMに応じたAVDの構成」を参照)。

開発用コンピュータでMicrosoft Windows 8.n以上またはMac OS X 10.9.n以上が実行されている場合は、Intel HAXMでエミュレータを使用する前に、Intel社が提供するホットフィックスを適用する必要があります。

注意:

ホットフィックスを適用しないと、コンピュータがフリーズして作業内容が失われます。

ホットフィックスをダウンロードするには、次の場所を使用します。

- Microsoft Windows用ダウンロード

- Mac OS X用ダウンロード

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

- インストレーション・ガイドおよびシステム要件 - Windows

- インストレーション・ガイドおよびシステム要件 - Mac OS X

- インストレーション・ガイドおよびシステム要件 - Linux

2.5.3.2.1 Intel HAXMに応じたAVDの構成

Intel HAXMを有効にする場合、Android SDK Managerを使用して、Android APIレベルのIntelシステム・イメージをダウンロード(図2-8を参照)。「Speeding Up the Android Emulator on Intel Architecture」の説明に従って次のようにします。

- Android SDKをインストールした後、SDK Managerを開いて「Extras」セクションでIntel HAXMを見つけます。

- 「Intel x86 Emulator Accelerator (HAXM)」を選択し、「Install packages」をクリックします。
パッケージをインストールするとステータスが「Installed」に変わりますが、これは正確ではなく、SDKによってIntel HAXM実行可能ファイルがコンピュータにコピーされただけであるため、手動でこの実行可能ファイルをインストールする必要があります。

図2-8 Android SDK ManagerでのIntelシステム・イメージのダウンロード

- Intel HAXM実行可能ファイルをインストールするには、開発プラットフォームに応じて次のいずれかをハード・ドライブで検索します。

- Windowsの場合、IntelHaxm.exeを検索します。

- Mac OS Xの場合、IntelHaxm.dmgを検索します。

デフォルト設定を使用した場合、Windowsでは、実行可能ファイルはC:\Program Files\Android\android-sdk\extras\Intel\Hardware_Accelerated_Execution_Manager\IntelHaxm.exeにあります。

Intel HAXMは、Android 2.3.3 (API 10)、4.0.3 (API 15)、4.1.2 (API 16)、4.2.2 (API 17)用に使用可能な、Intel Atomプロセッサのx86システム・イメージの1つとともに機能します。これらのシステム・イメージは、Android SDK Managerを使用して、ARMベースのイメージとまったく同じようにインストールできます。

図2-9 Intel Atomシステム・イメージのインストール

処理を完了するには、AVD Managerを使用して「CPU/ABI」として「Intel Atom (x86)」を選択することによって、エミュレーションがハードウェアで高速化された新規仮想デバイスを作成します(図2-10を参照)。

注意:

このオプションは、Intel x86システム・イメージがインストールされている場合にのみリストに表示されます。

図2-10 高速化されたAVDの作成

2.6 環境設定のテスト

次のように、環境設定をテストできます。

1. JDeveloperで、HelloWorld.jwsファイルを選択してHelloWorldサンプル・アプリケーションを開きます(付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照)。

2. メイン・メニューから「アプリケーション」→「デプロイ」を選択します。
詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

3. ドロップダウン・メニューから、アプリケーションのデプロイ先となるプラットフォームに対応したデプロイメント・プロファイルを選択します。

4. 環境設定をテストする場合、アプリケーションの署名を必要としないiOSデバイス・シミュレータまたはAndroidデバイス・エミュレータでのテストが推奨されるため、「デプロイ」ダイアログを使用して、次のいずれかのデプロイメント・アクションを選択する必要があります。

- iOSの場合、図2-11に示すように、「アプリケーションのシミュレータへのデプロイ」を選択します。

図2-11 iOSに対するデプロイメント・アクションの選択

- Androidの場合、図2-12に示すように、「アプリケーションのエミュレータへのデプロイ」を選択します。デプロイメントを開始する前に、エミュレータが稼働していることを確認してください。

図2-12 Androidに対するデプロイメント・アクションの選択

5. 「デプロイ」ダイアログで「次へ」をクリックし、「サマリー」ページの内容を確認した後、「終了」をクリックします。
詳細は、次のいずれかを参照してください。

- 第19.4.1項「iOSシミュレータへのiOSアプリケーションのデプロイ方法」

- 第19.3.1項「AndroidエミュレータへのAndroidアプリケーションのデプロイ方法」

デプロイメントの詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

デプロイメントに成功すると(数分かかる場合があります)、iOSデバイス・シミュレータまたはAndroidデバイス・エミュレータにHelloWorldアプリケーション・アイコンが表示され、アプリケーションを起動するためにはこれをアクティブ化する必要があります。

3 モバイル・アプリケーション開発のスタート・ガイド

この章では、Oracle JDeveloperのウィザードおよびツールを使用してOracle Mobile Application Framework (MAF)を使用する基本的なアプリケーションを作成する方法について説明し、さらに、アプリケーションの作成時に自動的に生成されるアーティファクトについても説明します。

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

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

- 第3.2項「アプリケーション・ワークスペースの作成」

- 第3.3項「ADFモバイル・アプリケーションの移行」

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

MAFはJDeveloperデザインタイム内に統合されているため、単純なモバイル・アプリケーション(およびより複雑なモバイル・アプリケーションの大部分)は、コードを1行も記述することなく作成、デプロイおよびテストできます。

3.2 アプリケーション・ワークスペースの作成

Oracle Mobile Application Framework拡張機能により、JDeveloperには、基本ファイルによって完全なプロジェクトをシードするアプリケーション・テンプレートが提供されています。MAFアプリケーションを作成する最初のステップは、名前を割り当て、ソース・ファイルを保存するディレクトリを指定することです。JDeveloperに用意されているアプリケーション・テンプレートを使用してアプリケーションを作成すると、ワークスペースが必要な構成ファイルとともに自動的に編成され、プロジェクトに含められます。

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

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

始める前に

MAFアプリケーション拡張機能をダウンロードする必要があります。詳細は、第2.3項「JDeveloperの設定」を参照してください。すべてのターゲット・プラットフォームに対して、MAFアプリケーション拡張機能をダウンロードおよび構成する必要がある場合もあります。

モバイル・アプリケーションを作成するには:

1. 「ファイル」→「新規」→「アプリケーション」を選択します。

図3-1 MAFアプリケーション・テンプレートの選択

2. 図3-1に示す「新規ギャラリ」で、「モバイル・アプリケーション・フレームワーク」を選択して「OK」をクリックします。

3. 「アプリケーション名」フィールドに、アプリケーションの名前を入力します(図3-2ではMobileApplication)。必要に応じて、「ディレクトリ」フィールドにプロジェクトの新しい場所を入力します。「アプリケーション・パッケージの接頭辞」フィールドに接頭辞を入力することで、アプリケーション・パッケージが一意となるようにします。「次へ」をクリックします。
アプリケーションは、MAFアプリケーションの最上位構造になります。アプリケーションは、このウィザードの後続ページで定義する様々なプロジェクト層をまとめます。

図3-2 MAFアプリケーションのネーミング

4. 図3-3に示すように、プロジェクト1の名前ページで、(必要に応じて)アプリケーション・コントローラ・プロジェクトの名前と場所を変更します。変更しない場合は、プロジェクトのデフォルト名、ApplicationControllerをそのまま使用します。このページの「プロジェクトの機能」ウィンドウには、アプリケーション・コントローラ・プロジェクトで使用できるテクノロジがリストされます。
このプロジェクトにはアプリケーション全体のリソースがすべて格納されます。詳細は、表3-1を参照してください。

図3-3 アプリケーション・コントローラ・プロジェクトとそのプロジェクト機能

5. 「次へ」をクリックして、アプリケーション・コントローラ・プロジェクトのJava設定ページ(図3-4に示すプロジェクト1のJava設定)に移動します。アプリケーション・コントローラ・プロジェクトのデフォルトのパッケージ名(application)と、Java SOURCEPATHディレクトリ(src)およびJava出力ディレクトリ(classes)の場所を、そのまま使用するか変更します。

図3-4 アプリケーション・コントローラ・プロジェクトのJava設定の構成

6. 「次へ」をクリックして、必要に応じてビュー・コントローラ・プロジェクトの名前を変更できるプロジェクト2の名前ページに移動します。このページの「プロジェクトの機能」ウィンドウ(図3-5を参照)には、MAFビュー・コントローラ・プロジェクトで使用できるテクノロジがリストされます。ビュー・コントローラ・プロジェクト内で作成されるアーティファクトの詳細は、表3-2を参照してください。

図3-5 MAFビュー・コントローラ・プロジェクト

7. 「次へ」をクリックします。ビュー・コントローラ・プロジェクトのJava設定ページ(図3-6を参照)で、アプリケーション・コントローラ・プロジェクトのデフォルトのパッケージ名(mobile)と、プロジェクトのJava SOURCEPATHディレクトリ(src)およびJava出力ディレクトリ(classes)の場所を、そのまま使用(または変更)します。

図3-6 ビュー・コントローラ・プロジェクトのJava設定

8. 「終了」をクリックして、MAFアプリケーションとそのプロジェクトの作成を完了します。

ヒント:

前述の手順に従ってMAFアプリケーションを作成する以外にも、(開発用コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにある) HelloWorldサンプル・アプリケーションを開き、アプリケーション作成ウィザードの完了後にJDeveloperによって生成されたアーティファクトを表示できます。

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

MAFアプリケーション・プロジェクトを作成すると、JDeveloperによってアプリケーション・レベルおよびプロジェクト・レベルのアーティファクトが追加され、これらには、「アプリケーション」(図3-7を参照)からアクセスできます。これらのアーティファクトには、2つのスタブ・ディスクリプタ・ファイルが含まれています。1つは、アプリケーション名、アプリケーション・ライフサイクル・リスナー(LifeCycleListenerImpl.java)、埋込みアプリケーション機能用のログイン・サーバー接続など、MAFアプリケーション自体の構成に使用されるファイルで、もう1つは、MAFアプリケーションを構成するアプリケーション機能が記述されたファイルです。これらのファイル(maf-application.xmlおよびmaf-feature.xml)については、第3.2.2.1項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」および第3.2.2.2項「ビュー・コントローラ・プロジェクトのリソースについて」でそれぞれ説明します。

JDeveloperでは、DeviceFeaturesデータ・コントロールも作成されます。このデータ・コントロールによってApache Cordova Java APIが抽象化され、MAF AMXとして実装されているアプリケーション機能は、デバイスに埋め込まれている様々なサービスにアクセスできるようになります。さらにJDeveloperは、ApplicationFeaturesデータ・コントロールも作成します。これによってSpringboardページの構築が可能になります。DeviceFeaturesデータ・コントロールによって提供される操作をMAF AMXページにドラッグ・アンド・ドロップすることで(第7.11項「DeviceFeaturesデータ・コントロールの使用方法」を参照)、デバイスに格納されたユーザーのコンタクト先の管理、電子メールとSMSテキスト・メッセージの作成と送信、デバイスの場所の確認、デバイスのカメラの使用、およびデバイスのファイル・システムに格納されたイメージの取得を行う機能を追加します。

図3-7 JDeveloperによって生成されるMAFアプリケーションのアーティファクト

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

JDeveloperでは、アプリケーション・コントローラ・プロジェクト内にMAFアプリケーション用のファイルが生成されます。これらのファイル(表3-1を参照)は、MAFアプリケーションのメタデータを記述した構成情報を含んでいます。これらのファイルには、「アプリケーション」ウィンドウの「アプリケーション・リソース」ペイン(図3-8を参照)からアクセスします。

図3-8 「アプリケーション・リソース」ペインからアクセスされるモバイル・アプリケーション・アーティファクト

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

ヒント:

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

表3-1 アプリケーション・リソースを介してアクセスされるモバイル・アプリケーション・レベルのアーティファクト

アーティファクト

ファイルの場所

説明

maf-application.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\Meta-INF

次に例を示します。

JDevloper\mywork\アプリケーション名\.adf\META-INF

アプリケーションレベルの情報を定義するXMLファイル。アプリケーションの内容、ナビゲーションの動作およびそのユーザー認証要件を定義できます。詳細は、第4.2項「モバイル・アプリケーションの構成ファイルについて」を参照してください。

maf-config.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\Meta-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

MAFアプリケーションに使用されるデフォルト・スキンの構成に使用されます。詳細は、第4.12項「モバイル・アプリケーションのスキニング」を参照してください。

アプリケーション・イメージ

アプリケーション・ワークスペース・ディレクトリ\Application Resources\resources\ios

次に例を示します。

JDeveloper\mywork\アプリケーション名\resources\ios

iOSおよびAndroidアプリケーションのデプロイメントに必要とされる一連のイメージ。ここには、アプリケーション・アイコンやスプラッシュ画面のPNGイメージも含まれます。iPhoneなどのiOSデバイスへのデプロイメントでは、様々なサイズのイメージ・セットが必要です。

プロジェクトで提供されるデフォルトのiOSイメージは次のとおりです。

- デバイスが縦方向と横方向の両方の場合に使用されるイメージ。

- Retinaディスプレイに使用されるイメージ(つまり、icon.pngおよびicon@2x.png)

- iPadイメージ(icon-72.png)

これらのイメージをオーバーライドするには、第19.2.4.3項「iOSアプリケーションへのカスタム・イメージの追加」を参照してください。

cacerts

アプリケーション・ワークスペース・ディレクトリ\Application Resources\resources\Security\cacerts

次に例を示します。

JDeveloper\mywork\アプリケーション名\resources\Security\cacerts

システム全体のキーストアであるcacerts証明書ファイル。JVM 1.4に対するCA証明書を識別します。このファイルは、Java keytoolユーティリティを使用して更新できます。第21.8項「SSLのサポート」で説明するように、keytoolを使用してカスタム証明書ファイルを作成できます。証明書ファイルはすべてSecurityディレクトリ内に配置する必要があります。

logging.properties

アプリケーション・ワークスペース・ディレクトリ\ src\.META-INF\logging.properties

次に例を示します。

JDeveloper\mywork\アプリケーション名\src\META-INF\logging.properties

ロギング・レベルやロギング・コンソールなど、アプリケーション・エラーのロギングを設定できます。詳細は、第22.4項「ロギングの使用方法と構成」を参照してください。

cvm.properties

アプリケーション・ワークスペース・ディレクトリ\src\.META-INF\cvm.properties

次に例を示します。

JDeveloper\mywork\アプリケーション名\src\META-INF\cvm.properties

Java仮想マシン、JVM 1.4の構成ファイル。このファイルを使用して、アプリケーションの起動やヒープ領域の割当て、JavaおよびJavaScriptのデバッグ・オプションを構成します。詳細は、第22.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

adf-config.xml

アプリケーション・ワークスペース・ディレクトリ\.adf\META-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\.adf\META-INF

構成サービス・パラメータなど、アプリケーション・レベルの設定の構成に使用します。第9章「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では、アプリケーション・コントローラ・プロジェクト(図3-9を参照)自体の中に、表3-2にリストされた、次のアーティファクトが作成されます。

図3-9 アプリケーション・コントローラ・プロジェクト

表3-2 アプリケーション・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

LifeCycleListenerImpl.java

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\application

次に例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\src\application

MAFアプリケーションのデフォルトのアプリケーション・ライフサイクル・リスナー(ALCL)。

詳細は、第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」を参照してください。

maf-skins.xml

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\META-INF

次に例を示します。

JDeveloper\mywork\アプリケーション名\ApplicationController\src\META-INF

使用可能なスキンを定義するもので、新しいスキンを定義することもできます。

詳細は、第4.12項「モバイル・アプリケーションのスキニング」を参照してください。

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データ・コントロールの使用方法の詳細は、第7項「バインディングの使用とデータ・コントロールの作成」を参照してください。埋込みアプリケーション機能をコールするSpringboardページを作成できるようにするApplicationFeaturesデータ・コントロールの詳細は、第4.5.5項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

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

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

ヒント:

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

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

注意:

MAFビュー・コントローラ・プロジェクトを別のMAFビュー・コントローラ・プロジェクトの依存性またはMAFアプリケーション・コントローラ・プロジェクトの依存性として追加すると、MAFアプリケーションをデプロイできなくなります。詳細は、第4.6.2項「機能参照IDと機能IDに関する必知事項」を参照してください。

図3-10 ビュー・コントローラ・プロジェクト

表3-3に示すように、これらのリソースには、maf-feature.xmlという名前のアプリケーション機能の構成ファイルが含まれます。

表3-3 ビュー・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

maf-feature.xml

アプリケーション・ワークスペース・ディレクトリ\src\META_INF\maf-feature.xml

次に例を示します。

JDeveloper\mywork\アプリケーション名\ViewController\src\META-INF

アプリケーション機能を定義できるようにする、スタブXMLの識別子ファイル。詳細は、第4.8項「モバイル・アプリケーション機能の構成ファイルについて」を参照してください。第2.3.1項「プラットフォームとフォーム・ファクタに応じた開発環境の構成方法」の説明に従ってモバイル・プリファレンスを構成した後は、デフォルトのデプロイメント・プロファイル設定を使用して、このアプリケーションをデプロイできます。詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

アプリケーション固有のコンテンツ

アプリケーション・ワークスペース・ディレクトリ\ViewController\public_html

次に例を示します。

JDeveloper\mywork\アプリケーション名\ViewController\public_html

maf-feature.xmlで定義されたアプリケーション機能は、public_htmlディレクトリに表示されます。モバイル・コンテンツには、MAF AMXページ、CSSファイルおよびタスク・フローを含めることができます。アプリケーション機能に追加するカスタム・イメージは、このディレクトリ内に配置する必要があります。詳細は、第4.10.2項「外部リソースの選択に関する必知事項」を参照してください。

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

デプロイメント・プロファイルは、ターゲット環境(モバイル・デバイス、エミュレータ、iOs App Storeのようなアプリケーション・マーケットプレイスなど)にデプロイされるアーカイブにアプリケーションがパッケージ化される方法を定義します。デプロイメント・プロファイルには、次の役割があります。

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

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

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

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

アプリケーションを作成すると、MAFによって、デフォルトの設定とイメージ・ファイルでシードされたデプロイメント・プロファイルが生成されます。環境を正しく構成した場合、これらのプロファイルを使用して、MAFアプリケーションを作成直後にデプロイできます。これを行うには、図3-11に示すように、「アプリケーション」を選択した後、「デプロイ」を選択します。

図3-11 デフォルトのデプロイメント・プロファイル

その後、「デプロイメント・アクション」ページ(図3-12を参照)を使用し、適切なデプロイメント・ターゲットを選択します。

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

注意:

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

Androidアプリケーションをシミュレータにデプロイする場合は、Android SDK ManagerにあるGoogle Cloud Messaging Library (リビジョン3以上)用のパッケージをインストールしてください。詳細は、第19.2.3項「Androidデプロイメント・プロファイルの作成方法」を参照してください。

図3-11に示すように、MAFでは、サポートされる両方のプラットフォーム(iOSとAndroid)に対応したアプリケーション・レベルのプロファイルが作成され、それらにiOS1およびAndroid1という名前が付けられます。

注意:

MAFでは、新しいデプロイメント・プロファイルが作成されるたびに、その名前に付加される数字が1ずつ増加します。たとえば、iOS2、iOS3のようになります。

これらのプロファイルには、デフォルト値をそのまま使用するか、「アプリケーションのプロパティ」ダイアログの「デプロイメント」ページでプロファイルの名前を選択し、「編集」をクリックすることによって、それらの値を編集することもできます。図3-13は、デフォルトのAndroidアプリケーション・プロファイルの「オプション」ページを示しています。MAFアプリケーション・プロファイル用に構成する値の詳細は、第19.2.3項「Androidデプロイメント・プロファイルの作成方法」および第19.2.4項「iOSデプロイメント・プロファイルの作成方法」を参照してください。

図3-13 デフォルトのデプロイメント・プロファイルの編集

MAFでは、アプリケーション・コントローラ・プロジェクトとビュー・コントローラ・プロジェクトは、別々の機能アーカイブ(FAR)ファイルとしてパッケージ化されます。このようなMAFファイルのJARファイルは、他のアプリケーションのリソースとして使用されます(第19.5項「機能アーカイブ・ファイル(FAR)のデプロイ」を参照)。MAFでは、これらのFARファイルがMAFアプリケーション・プロファイルへの依存性として作成されるため、「アプリケーションのプロパティ」ダイアログの「プロファイルの依存性」ページを使用して、これらのファイルを追加または除外できます(図3-14を参照)。

注意:

アプリケーション・コントローラ・プロジェクトに含まれるFARプロファイルの依存性は1つである必要があります。そうでない場合、デプロイメントは失敗します。

図3-14 MAFプロジェクトからのFARコンテンツの編集

「プロジェクト・プロパティ」ダイアログのファイル・グループに関連するページを使用すると、ビュー・コントローラのFARファイルに含まれるコンテンツをカスタマイズできます(図3-15を参照)。「プロジェクト・プロパティ」ダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプおよびOracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のデプロイメント・プロファイルの構成に関する項を参照してください。

図3-15 ビュー・コントローラ・プロジェクトのFARの編集

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

このデプロイメント・ファイルには、MAFアプリケーション名に_archiveが続く形式の名前がデフォルトで付けられます。図3-11に示すように、このプロファイルはEmployees_archiveと呼ばれ、必要に応じ、「アプリケーションのプロパティ」ダイアログを使用して編集できます。

図3-16 「アプリケーションのプロパティ」ダイアログを使用したデフォルトのデプロイメント・プロファイルの編集

「アプリケーションのプロパティ」ダイアログのページを使用したデプロイメント・プロファイルの編集の詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のデプロイメント・プロファイルのプロパティの表示と変更に関する項と、Oracle JDeveloperオンライン・ヘルプの「アプリケーションのプロパティ」および「プロジェクト・プロパティ」ダイアログに関する項を参照してください。

3.2.3 MAFアプリケーションとアプリケーション機能の編集に関する必知事項

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

図3-17 モバイル・アプリケーションの概要エディタ

図3-17に示すように、maf-application.xmlファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」パネルで、「ディスクリプタ」および「ADF META-INF」ノードの下に表示されます。このファイルは、この場所からダブルクリックで開くことができます。このファイルにアクセスすると、JDeveloperによって、関連付けられた概要エディタが開かれるだけでなく、関連するページ・コンポーネントが「コンポーネント」ウィンドウ内に表示されます。これは、エディタの「ソース」ページか「構造」ウィンドウにドラッグ・アンド・ドロップできます(図3-18を参照)。maf-application.xmlページのコンポーネントの詳細は、第4.2項「モバイル・アプリケーションの構成ファイルについて」を参照してください。

図3-18 MAFアプリケーションに対するソース・エディタ、「構造」ウィンドウおよびプロパティ・エディタの使用方法

図3-19に示すように、maf-feature.xml構成ファイルは、「アプリケーション」ウィンドウの「プロジェクト」パネルで、「view controller」および「META-INF」ノードの下にあります。このファイルを使用して、MAFアプリケーションのコンテンツを構成します。

図3-19 アプリケーション機能の概要エディタ

maf-application.xmlファイルの概要エディタと同じように、JDeveloperによって、maf-features.xml構成ファイルの要素を構築するために使用するMAFコンポーネントが提示されます(第4.8項「モバイル・アプリケーション機能の構成ファイルについて」を参照)。「概要」ページを使用することも、「コンポーネント」ウィンドウからコンポーネントを「構造」ウィンドウまたはソース・エディタ自体へドラッグ・アンド・ドロップすることもできます。maf-feature.xmlファイルを選択すると、JDeveloperによって「コンポーネント」ウィンドウにMAF機能コンポーネントが移入されます。

図3-20 アプリケーション機能に対するソース・エディタ、「構造」ウィンドウおよび「コンポーネント」ウィンドウの使用方法

3.2.4 MAF AMXアプリケーション用のアプリケーション・ワークスペースの作成

第5章「MAF AMXページの作成」で説明されているように、MAF AMXコンポーネントを使用すると、プラットフォーム固有の言語で作成されたページとまったく同じように実行されるページを作成できます。MAF AMXページでは、豊富なコンポーネント・セットを使用して、ユーザー・インタフェースを宣言的に作成できます。図3-21に、MAF AMXページの宣言的な開発を示します。

図3-21 MAF AMXページの作成

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

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

ヒント:

ページの保守を容易にするために、ページをページ・フラグメントと呼ばれる再利用可能なセグメントに分割できます。MAF AMXページは、1つ以上のページ・フラグメントで構成されます。

MAFでは、MAFタスク・フローを介してMAF AMXビュー・ページおよび他のアクティビティを配置して適切なシーケンスにすることができます。第5.2項「タスク・フローの作成」で説明されているように、MAFタスク・フローはアプリケーションのフローの視覚的に表現したものです。これは、(図3-22に示すWorkBetterサンプル・アプリケーションのデフォルトのListページやDetailページなどのビュー・アクティビティのような) MAF AMXで作成されるユーザー・インタフェース・ページや、マネージドBeanでメソッドをコールできる非視覚的なアクティビティで構成されます。タスク・フローの非視覚的な要素は、EL式を評価したり、別のタスク・フローをコールするために使用できます。図3-22に示すように、MAFでは、タスク・フロー・コンポーネントをダイアグラマにドラッグして、タスク・フローを宣言的に作成できます。MAFには、バインド・タスク・フローとバインドなしタスク・フローという2種類のタスク・フローがあり、バインド・タスク・フローにはWorkBetterサンプル・アプリケーションのListページのような単一のエントリ・ポイントが含まれ、バインドなしタスク・フローにはアプリケーション・フローとなる複数のエントリ・ポイントが含まれることがあります。WorkBetterサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリのPublicSamples.zipファイル内にあります。

図3-22 MAFタスク・フロー

図3-23に、MAFタスク・フロー、AMXページ、MAFページ・フラグメントと呼ばれるMAF AMXページの再利用可能な部分、およびアプリケーション機能を追加するためにMAFに提供されているウィザードを示します。これらのウィザードにアクセスするには、「アプリケーション」ウィンドウでビュー・コントローラ・プロジェクトまたはアプリケーション・コントローラ・プロジェクトを選択して、「ファイル」→「新規」を選択します。「クライアント層」内の「モバイル・アプリケーション・フレームワーク」を選択した後、いずれかのウィザードを選択します。

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

3.2.4.1 MAF AMXページの作成方法

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

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

1. 「アプリケーション」ウィンドウで、ビュー・コントローラ・プロジェクトを右クリックします。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAF AMXページ」を選択して、「OK」をクリックします。

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

図3-24 ビュー・コントローラ・プロジェクト内でのMAF AMXページの作成

5. 「パネル・ページ」内で、ヘッダーおよびフッターの作成に使用する「ファセット」を選択(または選択解除)します。「OK」をクリックします。
詳細は、第6.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

6. MAF AMXページを作成します。AMXコンポーネントの使用方法の詳細は、第5.3.1.2項「MAF AMXページの作成」を参照してください。第4.10.1項「アプリケーション・コンテンツの定義方法」も参照してください。

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

1. 「アプリケーション」ウィンドウで、アプリケーション・コントローラ・プロジェクトを選択します。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAF AMXページ」を選択して、「OK」をクリックします。

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

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

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

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

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

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

1. 「アプリケーション」ウィンドウで、ビュー・コントローラ・プロジェクトを選択します。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「MAFタスク・フロー」を選択して、「OK」をクリックします。

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

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

5. タスク・フローを構築します。第5.2項「タスク・フローの作成」も参照してください。

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

JDeveloperは、MAF AMXページとタスク・フローを、ビュー・コントローラ・プロジェクトの「Webコンテンツ」ノードに配置します(図3-27のcustom_springboard.amxおよびViewController-task-flow.xmlを参照。これらは、このプロジェクト内で作成されるタスク・フローのデフォルト名です)。第4.6項「モバイル・アプリケーション内のアプリケーション機能の構成」で説明されているように、これらのアーティファクトはmaf-feature.xmlファイル内で参照されます。カスタマイズされたアプリケーション・スプラッシュ画面(または起動)イメージやナビゲーション・バーのイメージなど、その他のリソースも「Webコンテンツ」ノードに含まれています。詳細は、表3-3を参照してください。バインドなしタスク・フローを管理するために、JDeveloperではadfc-mobile-config.xmlファイルが生成されます。このファイルを使用して、ビュー(ユーザー・インタフェース・ページ)、様々なアクティビティ間の遷移を定義する制御ルール、タスク・フローのレンダリング・ロジックを管理するマネージドBeanなど、様々なタスク・フロー・コンポーネントを追加することにより、タスク・フローを宣言的に作成または更新できます。

図3-27 アプリケーション・コントローラ・プロジェクトおよびビュー・コントローラ・プロジェクト内のMAF AMXページとタスク・フロー

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

3.3 ADFモバイル・アプリケーションの移行

MAFでは、ADFモバイルのバージョン11.1.2.3.0および11.1.2.4.0で作成されたアプリケーションの構成が自動的に移行されます。ADFモバイル・アプリケーションのワークスペース(.jws)・ファイルを開くと、MAFでは、「警告」ダイアログ(図3-28を参照)が開いて、アプリケーションが現行バージョンでないという警告が表示され、移行を続行するか、ダイアログを閉じてファイルを閉じるかを選択するように求められます。

図3-28 「警告」ダイアログ

MAFでは、移行ステータスが「ログ」ウィンドウに書き込まれます(図3-29を参照)。移行プロセスで、移行するアプリケーションで古い構成サービスAPIが使用されていることが検出されると、次の警告も記録されます。

The MAF 2.0 Configuration Service API is not backwards compatible with previous
versions and cannot be migrated automatically. Refer to Section 9.3 "Migrating
the Configuration Service API" in Oracle Fusion Middleware Developing Mobile
Applications with Oracle Mobile Application Framework 2.0. for information on
migrating to the new API.

詳細は、第9.6項「構成サービスの移行」を参照してください。

図3-29 移行ログ

3.3.1 ADFモバイル・アプリケーションの移行時に行われる処理

表3-4に、移行がADFモバイルのアーティファクトにどのような影響を与えるかを示します。

表3-4 ADFモバイルのアーティファクトおよび構成の移行

ファイル名

変更内容

adfmf-feature.xml

移行によって次の変更が行われます。

- ファイル名がmaf-feature.xmlに変更されます。

- credentials属性がsecurityEnabled=trueで置換されます。

- ハイブリッド接続定義(<authenticationMode value="hybrid"/>)として(localかremoteのいずれかとして定義されている) credentials属性定義がconnections.xmlファイル内に複写されます。

adfmf-application.xml

移行によって次の変更が行われます。

- ファイル名がmaf-application.xmlに変更されます。

- すべてのデバイス機能およびサービスへのアクセス権が付与されます(access = true)。不要なアクセス権は削除できます。

connections.xml

移行によって、<policy-references>要素で定義されているセキュアなSOAP Webサービス接続がconnections.xmlファイルから削除されます。これらの定義は、wsm-assembly.xmlファイルに移入されます。ADFモバイル・アプリケーションにconnections.xmlファイルが含まれていない場合、移行ではスタブ・ファイルconnections.xmlおよびwsm-assembly.xmlが作成されます。Webサービス・ポリシー定義を持たないconnections.xmlがADFモバイル・アプリケーションに含まれている場合、移行ではスタブ・ファイルwsm-assemblyが作成されます。

adfmf-config.xml

移行によって、ファイル名がmaf-config.xmlに変更されます。また、スキン・ファミリがデフォルト・スキン・ファミリであり、スキン・バージョンが指定されていない場合、そのスキン・ファミリのデフォルトのスキン・バージョンも追加されます。たとえば、次の値が含まれるようにmaf-config.xmlを変更できます。

<skin-family>mobileAlta</skin-family>  <skin-version>v1.1</skin-version>

adfmf-skins.xml

移行によって、ファイル名がmaf-skins.xmlに変更されます。

アプリケーションがADFモバイル・フレームワーク・テクノロジから移行され、モバイル・アプリケーション・フレームワーク・テクノロジがプロジェクト機能として使用されるようになります。図3-30に、モバイル・アプリケーション・フレームワーク・テクノロジを使用するアプリケーション・コントローラ・プロジェクトの「機能」ページを示します。「プロジェクト・プロパティ」→「機能」を選択して、このダイアログを表示します。

図3-30 モバイル・アプリケーション・フレームワークのプロジェクト機能

MAFでは、ADFモバイル・アプリケーションに対して作成されたアイコン、スプラッシュ画面またはナビゲーション・バーのイメージはオーバーライドされず、アプリケーション・コントローラのresourcesファイル内のイメージ・ファイルが保持されます。同様に、アプリケーション機能に使用されるイメージもすべて保持されます。第3.2.2.1項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」も参照してください。

3.3.1.1 Webサービス・ポリシー定義の移行について

MAFでは、Webサービス・ポリシー定義がwsm-assembly.xmlファイルに格納されます。ADFモバイル・アプリケーションはこの情報をconnections.xmlファイルに格納します。例3-1は、connections.xmlファイル内の<policy-references>要素によるoracle/wss_username_token_client_policyを示しています。

例3-1 connections.xmlファイル

<policy-references xmlns="http://oracle.com/adf">policy-reference category="security"
uri="oracle/wss_username_token_client_policy"
enabled="true"
id="oracle/wss_username_token_client_policy" xmlns=""/>
</policy-references>

例3-2は、wsm-assembly.xmlファイル内に定義されたポリシーを示しています。

例3-2 wsm-assembly.xmlファイル

<wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy"
DigestAlgorithm="http://www.w3.org/ns/ws-policy/Sha1Exc"
URI="oracle/wss_username_token_client_policy"
orawsp:status="enabled"
orawsp:id="2"/>

3.3.2 移行済アプリケーションにおけるFARに関する必知事項

MAFでは、機能アーカイブ(FAR)ファイル内にパッケージ化されたadfmf-feature.xmlファイルは移行されません。移行済アプリケーションで使用されるADFモバイルFARを置換して、FARのmaf-feature.xmlファイル内でcredentials属性がsecurityEnabled=trueで置換されていることを確認します。

アプリケーションの移行後、次の手順を実行します。

1. 「アプリケーションのプロパティ」→「ライブラリとクラスパス」を選択します。

2. FARを選択し、「削除」をクリックします。

3. 第4.13.1項「MAFアプリケーションでのFARコンテンツの使用方法」で説明されているように、移行済ビュー・コントローラが含まれるFARをインポートします。

4. FARとしてパッケージ化されたビュー・コントローラ・プロジェクトが含まれるADFモバイル・アプリケーションを移行します。

注意:

1つのFARにadfmf-feature.xmlファイルとmaf-feature.xmlファイルの両方を含めることはできません。

1. ビュー・コントローラ・プロジェクトをFARとしてデプロイします。

2. 第4.13.1項「MAFアプリケーションでのFARコンテンツの使用方法」で説明されているように、FARを移行済アプリケーションにインポートします。

3.3.3 ヘッドレス・モードでのアプリケーションの移行

Oracle JDeveloperには、ojmigrateコマンド行ユーティリティを使用してアプリケーションを移行するための一連のマイグレータが用意されています。ワークスペース(.jws)・ファイル(およびそのすべてのプロジェクト・ファイル)を移行するには、まず、Oracle JDeveloper 12cインストールのjdev\binディレクトリ(Oracle_Home\jdeveloper\jdev\bin)に移動し、コマンド・プロンプトで次のように入力します。

ojmigrate workspace.jws

このコマンドを使用して、1つ以上のワークスペースを移行できます。たとえば、次のように.jwsファイルの場所を入力します。

ojmigrate C:\JDeveloper\mywork\ADFMobileApp1\ADFMobileApp1.jws

C:\JDeveloper\mywork\ADFMobileApp2\ADFMobileApp2.jws

少数のワークスペース・ファイルはこの方法を使用して移行できますが、複数のファイルは、.jwsファイルの場所がリストされたテキスト・ファイルを使用して移行できます。構文は次のとおりで、テキスト・ファイルの場所の前にアットマーク(@)を付けます。

ojmigrate @file

たとえば、ojmigrate @C:\migrate.txtと入力します。

例3-3は、テキスト・ファイルの内容を示しています(ファイルの場所はそれぞれ改行して入力する必要があります)。

例3-3 テキスト・ファイル内の.jwsファイルの場所の一覧

C:\JDeveloper\mywork\ADFMobileApp1\ADFMobileApp1.jws
C:\JDeveloper\mywork\ADFMobileApp2\ADFMobileApp2.jws
C:\JDeveloper\mywork\ADFMobileApp3\ADFMobileApp3.jws
C:\JDeveloper\mywork\ADFMobileApp4\ADFMobileApp4.jws
C:\JDeveloper\mywork\ADFMobileApp5\ADFMobileApp5.jws

ヒント:

LINUXまたはUNIXのfindコマンドを使用して次のように入力すると、テキスト・ファイルに.jwsの場所を自動的に移入できます。

find . -name "*.jws" -printf "%P\n" > filename.txt

このコマンドの実行後、アプリケーションの移行が完了したことを確認します。

テキスト・ファイルにリストされた最初のアプリケーションの移行が失敗した後に移行を停止する場合は、-failFastオプション(ojmigrate -failFast @file)を使用します。このコマンドを使用すると、移行の妨げとなっているエラーを分析できます。

アプリケーションに追加のデータが必要な場合は、次のように-generateDefaultsオプションを使用して、それらのデータを名前/値のペアとしてリストした出力ファイルを作成できます。

ojmigrate -generateDefaults @migrate.txt

アプリケーション・ファイルに追加のデフォルトが必要な場合、-generateDefaultsオプションを使用すると、.jwsファイルに基づく名前のプロパティ・ファイル(workspacefilename.migration.properties)が作成されます。.propertiesファイルを調べて、それに応じて値を変更した後、ojmigrateコマンドを-generateDefaultsオプションなしで使用して(例: ojmigrate @file)、ワークスペースを移行します。

第III部

MAFアプリケーションの開発

概要エディタを使用して宣言的にMAFアプリケーションを開発する方法について説明します。

第III部の構成は、次のとおりです。

- 第4章「モバイル・アプリケーションの定義」

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

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

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

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

- 第4.2項「モバイル・アプリケーションの構成ファイルについて」

- 第4.3項「モバイル・アプリケーションの基本情報の設定」

- 第4.4項「カスタムURLスキームを使用したモバイル・アプリケーションの起動」

- 第4.5項「Springboardとナビゲーション・バーの動作の構成」

- 第4.6項「モバイル・アプリケーション内のアプリケーション機能の構成」

- 第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」

- 第4.8項「モバイル・アプリケーション機能の構成ファイルについて」

- 第4.9項「アプリケーション機能の基本構成の設定」

- 第4.10項「アプリケーション機能のコンテンツ・タイプの定義」

- 第4.11項「ローカライズ済コンテンツの操作」

- 第4.12項「モバイル・アプリケーションのスキニング」

- 第4.13項「機能アーカイブ・ファイルの使用」

- 第4.14項「Oracle Metadata Servicesを使用したMAFファイルのカスタマイズ」

- 第4.15項「モバイル・アプリケーションへのCordovaプラグインの統合」

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

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

4.1.1 maf-application.xmlの概要エディタの使用方法

概要エディタでは、maf-application.xmlファイルを構成して、モバイル・アプリケーションとそのリソースを記述できます。エディタの各ページで、構成ファイルの要素を追加または更新できます。

4.2 モバイル・アプリケーションの構成ファイルについて

maf-application.xml構成ファイルでは、表示名と一意のアプリケーションID (名前の競合を防ぐ)を指定し、アプリケーションのSpringboard (スマートフォンのホーム・ページに相当)に表示するアプリケーション機能を選択することで、モバイル・アプリケーションの基本構成を設定できます。さらに、このファイルでは、モバイル・アプリケーションのユーザー・プリファレンス・ページも作成できます。このファイルは、第3.2項「アプリケーション・ワークスペースの作成」で説明したように、アプリケーション作成ウィザードの完了後にJDeveloperによって生成されるもので、表4-1に示す要素で構成されています。

表4-1 アプリケーション識別子ファイルの要素

要素

説明

<adfmf:application>

maf-application.xmlのルート要素。

<adfmf:description>

アプリケーションの説明。

<adfmf:featureReference>

機能参照は、FAR (機能アーカイブ・ファイル)にパッケージ化されているか、maf-feature.xmlファイルで定義されているアプリケーション機能のうち、モバイル・アプリケーションのコンテンツに関連するものを指定します。機能参照を選択することで、モバイル・アプリケーションの特性とコンテンツを定義します。FARの詳細は、第4.13項「機能アーカイブ・ファイルの使用」を参照してください。

<adfmf:preferences>

ユーザー・プリファレンスのオプションおよび動作をアプリケーション・レベルで設定できます。maf-feature.xmlファイル内のアプリケーション機能に対するユーザー・プリファレンスの表示および動作方法も設定できます。詳細は、第14章「ユーザー・プリファレンスの有効化」を参照してください。

<adfmf:login>

アプリケーション機能のログイン・ページを設定できます。詳細は、第21章「モバイル・アプリケーションの保護」を参照してください。

<adfmf:navigation>

ナビゲーション・バーとSpringboardの動作を定義できます。Springboardはホーム・ページで、ここには、埋め込まれたアプリケーション機能のすべてのアプリケーション・アイコンとラベルがリスト・ビューに整理されて表示されます。Springboardには、ユーザーが使用可能なすべてのアプリケーションの最上位のビューが表示されます。ユーザーは内容に目を通してアプリケーションを選択できます。詳細は、第4.5項「Springboardとナビゲーション・バーの動作の構成」を参照してください。

例4-1は、Acme Salesという名前のアプリケーションのmaf-application.xmlファイルを示しています。Acme Salesはモバイル・アプリケーションで、そのコンテンツには顧客のコンタクト先アプリケーション(<adfmf:featureReference id="customers" showOnNavigationBar="true"/>)が含まれています。このアプリケーションはSpringboardに表示されます(図4-1参照)。

例4-1 maf-application.xmlファイル

<?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="Acme Sales"
id="com.company.AcmeSales"
appControllerFolder="ApplicationController"
version="1.0"
vendor="Oracle"
listener-class="application.LifeCycleListenerImpl">
<adfmf:description>Sample Application</adfmf:description>
<adfmf:featureReference id="Customers"
showOnSpringboard="true"
showOnNavigationBar="true"/>
<adfmf:featureReference id="HCM"
showOnSpringboard="true"
showOnNavigationBar="true"/>
<adfmf:featureReference id="PROD"
showOnSpringboard="true"
showOnNavigationBar="true"/>
<adfmf:preferences>
<adfmf:preferenceGroup id="Root.Security" label="Security">
<adfmf:preferenceText id="OracleSecurityProvider_serviceURL"
label="Security URL"
default="http://somecomputer.example.com:someaddress/
idaas_rest/rest/tokenservice1/tokens/getprofile"/>

<adfmf:preferenceText id="OracleADFMobile_UserName" label="User Name" default="sean"/>
<adfmf:preferenceText id="OracleADFMobile_Password" label="Password" default="welcome1"
secret="true"/>
</adfmf:preferenceGroup>
</adfmf:preferences>
<adfmf:navigation>
<adfmf:springboard enabled="false"/>
<adfmf:navigationBar enabled="true"/>
</adfmf:navigation>
</adfmf:application>

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

これらの要素は、概要エディタを使用して宣言的に変更するか(図4-2を参照)、「ソース」エディタを使用して手動で変更できます。この2通りのアプローチは、どちらも同じように使用できます。

図4-2 maf-application.xmlファイルの概要エディタ

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

「アプリケーション」ページでは、名前、アプリケーションID、モバイル・アプリケーションの表示方法を設定できます。

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

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

始める前に

maf-application.xmlファイルの概要エディタを開くには、「アプリケーション・リソース」パネルのADF META-INFノード(図4-3を参照)にあるmaf-application.xmlファイルをダブルクリックします。

図4-3「アプリケーション」ウィンドウでのmaf-application.xmlファイルの選択

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

1. 「アプリケーション」ページを選択し、必要に応じて「概要」タブを選択します。

注意:

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

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

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

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

注意:

MAFでは、このフィールドに入力した値をiOSアーカイブ(.ipaまたは.app)ファイルの名前として使用します。このファイルは、iOSデバイスまたはシミュレータにアプリケーションをデプロイすると作成されます。詳細は、第19.2.4項「iOSデプロイメント・プロファイルの作成方法」を参照してください。

3. 「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」を参照してください。第19.2.3項「Androidデプロイメント・プロファイルの作成方法」および第19.2.4項「iOSデプロイメント・プロファイルの作成方法」で説明するように、このIDはデプロイメント・プロファイル内で上書きできます。

注意:

Androidデバイスまたはエミュレータにアプリケーションが正しくデプロイされるようにするには、IDの先頭を数字やピリオドではなく、文字にする必要があります。たとえば、IDが925090のように(com.company.925090)完全に数値で構成されている場合、アプリケーションはデプロイできません。hello925090などの文字で始まるIDであれば(com.company.hello925090)、デプロイメントは正常に実行できます。

4. 「説明」フィールドに、アプリケーションの目的を説明した、短いけれども詳細な要約を入力します。

5. 「バージョン」フィールドに、バージョンを入力します。

6. 「ベンダー」フィールドに、このアプリケーションを最初に作成したベンダーの名前を入力します。

7. 「ライフサイクル・イベント・リスナー」フィールドの「参照」をクリックして、「プロパティの編集」ダイアログ(図4-5を参照)を開き、イベントを起動、停止、アクティブ化、非アクティブ化するためのランタイム・コールを有効にするイベント・リスナーを登録します。イベント・リスナーの完全修飾クラス名を入力する必要があります。これはオプションのフィールドです。

図4-5 アプリケーション・イベント・リスナーの取得

デフォルトのアプリケーション・リスナー・クラスは、application.LifeCycleListenerImplです。MAFでは、デフォルトではこのクラスは登録されません。このクラスはJVMを起動するため、各モバイル・アプリケーションには適さない可能性があるからです。かわりに、「プロパティの編集」ダイアログ(図4-5を参照)を使用して、手動でこのクラスを登録する必要があります。このダイアログを閉じると、JDeveloperにより、<adfmf:application>要素がlistener-class属性によって更新されます(例4-2を参照)。

注意:

アプリケーション・ライフサイクル・リスナーは引き続き、アプリケーション・コントローラ・プロジェクト(デフォルトの場所)内に存在している必要があります。

例4-2 listener-class属性の追加

<adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
name="OracleMobileApplication"
id="com.company.OracleMobileApplication"
appControllerFolder="ApplicationController"
listener-class="application.LifeCycleListenerImpl"
version="1.1"
vendor="Oracle">
<adfmf:description>This is a mobile application</adfmf:description>
<adfmf:featureReference id="feature1"/>
</adfmf:application>

詳細は、第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」を参照してください。

4.4 カスタムURLスキームを使用したモバイル・アプリケーションの起動

カスタムURLスキームを使用して、他のアプリケーションからネイティブ・アプリケーションを起動できます。

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

1. カスタムURLスキームを登録します。このURLスキームは、maf-application.xmlファイルの概要エディタで、「URLスキーム」フィールド(図4-4を参照)を使用して構成します。次に、このスキームのURLを使用して、モバイル・アプリケーションを起動し、データを渡すことができます。

2. アプリケーション・コントローラ・プロジェクトで、URLが通知されるカスタムURLイベント・リスナー・クラス(CustomURLEventListenerなど)を作成します。このクラスには、イベント・リスナーを定義するoracle.adfmf.framework.event.EventListenerインタフェースを実装する必要があります。oracle.adfmf.framework.event.EventListenerインタフェースの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。
このモバイル・アプリケーションの起動に使用されるURLで呼び出されるonMessage(Event e)メソッドをオーバーライドおよび実装します。Eventオブジェクトを使用して、URLペイロードおよびアプリケーションの状態に関する有益な情報を取得できます。URLペイロードを取得するには、Event.getPayloadメソッドを使用します。URLイベント時のアプリケーションの状態を取得するには、Event.getApplicationStateメソッドを使用します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのEventクラスに関する項を参照してください。

3. アプリケーション・ライフサイクル・イベント・リスナー(ALCL)クラスを登録します。詳細は、第4.3項「モバイル・アプリケーションの基本情報の設定」および第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」を参照してください。
ALCLクラスのstartメソッド内の、カスタムURLイベントのソースを表すEventSourceオブジェクトを取得します。

EventSource openURLEventSource = EventSourceFactory.getEventSource(EventSourceFactory.OPEN_URL_EVENT_SOURCE_NAME);

カスタムURLイベント・リスナー・クラスのオブジェクトを作成し、イベント・ソースに追加します。

openURLEventSource.addListener(new CustomURLEventListener());

モバイル・アプリケーションでは、次の2つの方法で別のネイティブ・アプリケーションを起動できます。

- ネイティブ・アプリケーションによって登録されたカスタムURLスキームで始まるURLを持つMAF AMXページでamx:goLinkを使用します。次に例を示します。

<amx:goLink text="Open App" id="gl1" url="mycustomurlscheme://somedata"/>

- ネイティブ・アプリケーションによって登録されたカスタムURLスキームで始まるhref属性値を持つHTMLページで、HTMLリンク要素を使用します。次に例を示します。

<a href="mycustomurlscheme://somedata">Open App</a>

4.5 Springboardとナビゲーション・バーの動作の構成

Springboardとナビゲーション・バーの表示動作を次のように制御するよう、モバイル・アプリケーションを構成できます。

- Springboardとナビゲーション・バーを表示または非表示にすることで、モバイル・デバイスの画面を最適に使用できるようになります。これらのオプションは、ナビゲーション・バーのデフォルトの表示動作をオーバーライドします。ナビゲーション・バーは、アプリケーション機能によって別の状態に指定されていないかぎり、デフォルトで表示されます。

- Springboardを右からスライドできるようにします。デフォルトでは、Springboardは表示全体を占有せず、そのかわりに左からスライドして、アクティブ・コンテンツ(ナビゲーション・バーの「ホーム」ボタンとアプリケーション機能を含む)を右へプッシュします。

4.5.1 アプリケーションのナビゲーションの構成方法

「アプリケーション」ページの「ナビゲーション」のオプション(図4-6を参照)を使用して、ナビゲーション・バーを表示または非表示にしたり、アプリケーションによって使用されるSpringboardのタイプを選択したり、ユーザーがアプリケーションをめくるように見ていくときのSpringboardの反応方法を定義できます。

図4-6 「アプリケーション」ページの「ナビゲーション」のオプション

始める前に

maf-application.xmlファイルの概要エディタの「アプリケーション」ページを選択する必要があります。

ナビゲーション・バーの表示動作を設定するには:

1. 「アプリケーションの起動時にナビゲーション・バーを表示」を選択して、モバイル・アプリケーションで、デフォルトで、Springboardではなくナビゲーション・バーが表示されるようにします(図4-7を参照)。

図4-7 デフォルトでナビゲーション・バーを表示

このオプションをオフにすると、アプリケーションの起動時にナビゲーション・バーが表示されなくなり、ユーザーにはSpringboardがナビゲーションの唯一の方法として提示されます。ナビゲーション・バーはSpringboardと同じ目的を果たすものなので、これを非表示にすることで冗長な機能を削除できる場合もあります。

2. 「ナビゲーション・バー・トグル・ボタンの表示」を選択して、選択したアプリケーション機能のコンテンツが表示されているときにはナビゲーション・バーを非表示にします。図4-8はこのオプションを示したもので、図4-7に示されているナビゲーション・バーを、アプリケーション機能のコンテンツによって非表示にする方法が示されています。

図4-8 ナビゲーション・バーを非表示

このオプションはデフォルトで選択されており、アプリケーション機能によって表示/非表示状態が指定されていなければ、ナビゲーション・バーはデフォルトで表示されます。

Springboardの表示動作を設定するには:

1. Springboardのタイプを選択します(存在する場合)。

- なし: アプリケーションにSpringboardを表示しない場合は、このオプションを選択します。

- デフォルト: MAFによって提供されるデフォルトのSpringboardを表示します。これは図4-1に示すスタイルを使用しています。デフォルトのSpringboardは、MAF AMXページとして実装されます。詳細は、第4.5.5項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

- カスタム: カスタマイズされたSpringboardを使用する場合に選択します。たとえば、埋込みアプリケーション機能をグリッド・レイアウト・パターンに配置するカスタムSpringboardを作成したり、検索機能や共通タスク(「マイ・レポート」、マイ・リードなど)のリストなどのデータを含めることができます。HTMLページまたはMAFモバイルAMXページとして実装できるこのアプリケーションは、maf-feature.xmlファイル(ビュー・コントローラ・プロジェクト内にあります)内でアプリケーション機能として宣言されます。詳細は、第4.9.1項「アプリケーション機能の基本情報の定義方法」を参照してください。HTMLで記述されたカスタマイズ済Springboard内でナビゲーションを有効にする方法の詳細は、第B章「ローカルHTMLおよびアプリケーション・コンテナAPI」を参照してください。

- 機能: Springboardとして使用するアプリケーション機能を選択します(図4-10を参照)。カスタムSpringboardの例は、APIDemoサンプル・アプリケーションを参照してください。詳細は、付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照してください。

注意:

アプリケーション機能をカスタムSpringboardとして指定する場合、MAFのデザインタイムによって、「ナビゲーション・バーに表示」および「Springboardに表示」オプションをfalseに設定することが求められます。これにより、ページがユーザーによってナビゲーション・バーまたはSpringboardから起動されるアプリケーション機能としてではなく、Springboardとして動作します。詳細は、第4.6.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照してください。

図4-9 カスタムSpringboardとしてのアプリケーション機能の選択

2. 「アプリケーションの起動時にSpringboardを表示」を選択して、モバイル・アプリケーションの起動後にエンド・ユーザーに対してSpringboardを表示できるようにします。(このオプションは、「デフォルト」または「カスタム」オプションでのみ使用できます。)

3. 「Springboardトグル・ボタンの表示」を選択して、Springboardのボタンを表示できるようにします(図4-10を参照)。このボタンはアプリケーション機能内に表示されます。図4-7「デフォルトでナビゲーション・バーを表示」では、アプリケーション機能のコンテキスト内にこのボタンが表示されています。このオプションは、「デフォルト」または「カスタム」オプションでのみ使用できます。

図4-10 Springboardトグル・ボタン

Springboardのスライドアウト動作を設定するには:

1. 「Springboardアニメーション」を選択して、「右にスライド」を選択します。Springboardは、「スライドアウト幅」オプションで入力したピクセル数値(またはパーセント)によって指定された領域を占有します。「なし」を選択した場合、Springboardは右からスライドできません(つまり、MAFではこのアクションを有効にするためのアニメーションが提供されません)。Springboardが表示領域全体を占有します。

注意:

スライドアウト・オプションは、Springboardの「カスタム」または「デフォルト」オプションを選択した場合のみ適用できます。

2. 幅を設定します(ピクセル単位)。iOSデバイスのSpringboardのデフォルト幅は320ピクセルです。Androidデバイスでは、デフォルトでSpringboardは画面全体を占有するので、使用可能な幅がすべて占有されます。

注意:

Springboardが表示領域全体を占有しない場合は、アクティブなアプリケーション機能が残りの表示領域を占有します。詳細は、第4.5.3項「Springboardにアニメーションを設定する場合の処理」を参照してください。

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

Springboardおよびナビゲーション・バーのオプションを設定すると、adfmf:application.xmlファイルの<adfmf:navigation>要素に対して要素の更新や追加が行われます。たとえば、「なし」を選択すると、<springboard enabled="false">によってコードが更新されます(例4-3を参照)。

例4-3 Springboardを表示しないようにする処理

<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-4は、「デフォルト」を選択したときに、enabled属性がtrueに設定される様子を示しています。

注意:

Springboardはデバイスの画面全体を占有するので、ナビゲーション・バーとSpringboardは同時には表示されません。

例4-4 デフォルトのSpringboardの表示の有効化

<adfmf:application>
...
<adfmf:navigation>
<adfmf:navigationBar enabled="true"/>
<adfmf:springboard enabled="true"/>
</adfmf:navigation>
</adfmf:application>

「カスタム」を選択して、Springboardとして使用するアプリケーション機能を選択すると、エディタでは<adfmf:navigation>要素(例4-5を参照)が移入されます。id属性は、maf-feature.xmlファイルで定義された、カスタムSpringboardとして使用するアプリケーション機能を指しています。

例4-5 カスタムSpringboardの構成

<adfmf:navigation>
<adfmf:springboard enabled="true">
<adfmf:springboardFeatureReference id="springboard"/>
</adfmf:springboard>
</adfmf:navigation>

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

例4-6は、maf-application.xmlファイルのナビゲーション・ブロックを示しており、ここでは、Springboardはスライドアウトし、指定された表示領域(213ピクセル)を占有するように設定されています。

例4-6 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>

次の行ではアニメーションを無効にしています。

<adfmf:springboard enabled="true" animation="none"/>

次の行では、Springboardが表示領域の左から100ピクセル分を占有するように設定し、アクティブなアプリケーション機能が表示領域の残りの部分を占有できるようにしています。

<adfmf:springboard enabled="true" animation="slideright" width="100px"/>

アニメーション以外に、例4-6は次の処理を示しています。

- showSpringboardAtStartup属性の使用。アプリケーションの起動時にSpringboardを表示するかどうかを定義します。(デフォルトでは、Springboardは表示されます。)

- navigationBarのdisplayHideShowNavigationBarControl属性の使用。

Springboardが表示されないようにするには、enabled属性をfalseに設定します。

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

MAFによって提供されるデフォルトのHTML Springboardページでは、次のテクノロジが使用されています。これらは、カスタマイズしたログイン・ページに含めることもできます。

- CSS: 色およびレイアウトを定義します。

- JavaScript: Springboardページ内に埋め込まれた<script>タグには、第B章「ローカルHTMLおよびアプリケーション・コンテナAPI」で説明するメソッド(Apache Cordova APIをコールする)への参照が格納されています。また、HTMLページはJavaScriptを使用して、コールバックに応答したり、ページ・スワイプを検出します。スワイプ・イベントが検出されたら、JavaScriptでは、スタイル・シートの動的変更によってページ・モーションをアニメートできるようになります。
HTML(または任意のカスタムHTMLページ)を使用して作成されたSpringboardでは、base.jsライブラリを参照する<script>タグを含めることによって、Apache Cordova APIを活用できます。このライブラリ(または他のJavaScriptライブラリ)の場所を特定するには、まずMAFアプリケーションをデプロイした後、deployディレクトリに格納されたプラットフォーム固有のアーティファクト内にあるwww/jsディレクトリを探します。Androidアプリケーションの場合、www/jsディレクトリは、Androidアプリケーション・パッケージ(.apk)ファイル内にあります。その場所を次に示します。

application workspace directory/deploy/deployment profile name/deployment profile name.apk/assets/www/js

iOSの場合、このライブラリは次の場所にあります。

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/js

詳細は、第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」を参照してください。

- WebKit: レイアウト間および異なるSpringboardページ間での遷移時に、アイコンのなめらかなアニメーションが提供されます。WebKitレンダリング・エンジンの詳細は、http://www.webkit.org/を参照してください。

HTMLで記述されるSpringboardは、maf-feature.xmlファイルで宣言され、maf-application.xmlファイルで参照されるアプリケーション機能です。

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

HTMLの場合と同様、MAF AMXを使用して記述されたSpringboardは、アプリケーション機能としてモバイル・アプリケーションによって参照されます(第4.6.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照)。通常、Springboardはタスク・フローではなく単一のMAF AMXページとして記述されるため、埋込みアプリケーション機能の起動には、gotoFeatureメソッドが使用されます(例4-7のメソッド式を参照)。

注意:

カスタムSpringboardページ(HTMLまたはMAF AMXによって作成されたもの)は、ビュー・コントローラ・プロジェクト内に配置する必要があります。ビュー・コントローラ・プロジェクト内にはmaf-feature.xmlファイルも格納されています。詳細は、第4.6.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照してください。

デフォルトのSpringboard (jdev_install\jdeveloper\jdev\extensions\oracle.maf\libにあるadfmf.default.springboard.jar)は、MAF AMXページであり、機能アーカイブ(FAR) JARファイルにバンドルされ、モバイル・アプリケーションに含まれる別のFARとともにデプロイされます。JARファイルには、DataBindings.cpxファイルやPageDef.xmlファイルなど、Springboardに関連付けられたすべてのアーティファクトが含まれます。このファイルは、maf-application.xmlファイルのSpringboardオプションで「デフォルト」が選択された後のみ使用できます。このオプションを選択すると、このFARもアプリケーション・クラスパスに追加されます。詳細は、第19.5項「機能アーカイブ・ファイル(FAR)のデプロイ」を参照してください。

デフォルトのSpringboard (例4-7に示すspringboard.amx)は、MAF AMXアプリケーション機能として実装されます。

例4-7 デフォルトのSpringboardページ、springboard.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-11に示すように、MAF AMXファイルでは、リスト・アイテムがモバイル・アプリケーションの埋込みアプリケーション機能であるリスト・ビューを使用してSpringboardを定義します。これらのアプリケーション機能は、デプロイ後は、名前と関連アイコンによって表示されます。AdfmfContainerUtilities APIのgotoFeatureメソッドでは、ページのナビゲーション機能が提供されます。このメソッドを使用した特定のアプリケーション機能の表示の詳細は、第B.2.6項「gotoFeature」を参照してください。また、第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」も参照してください。

図4-11 デフォルトのSpringboard

MAFでは、ApplicationFeaturesデータ・コントロール内にカスタムSpringboardを作成(またはデフォルトのSpringboardを拡張)するための基本ツールが提供されています。このデータ・コントロール(図4-12を参照)により、モバイル・アプリケーションとそのアプリケーション機能の両方を記述する属性のデータ・コレクションを使用して、Springboardページを宣言的に構築できます。カスタムSpringboardページの例は、APIDemoサンプル・アプリケーションを参照してください。このアプリケーション(およびMAFに付属の他のサンプル)の詳細は、付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照してください。

図4-12 ApplicationFeaturesデータ・コントロール

ApplicationFeaturesデータ・コントロールのメソッドにより、ナビゲーション機能を追加できます。これらのadfmf.containerUtilitiesメソッドについて、表4-2に説明します。詳細は、第B.2項「MAFコンテナ・ユーティリティAPI」を参照してください。また、第7章「バインディングの使用とデータ・コントロールの作成」も参照してください。

表4-2 アプリケーション機能メソッド

メソッド

説明

gotoDefaultFeature

デフォルトのアプリケーション機能に移動します。

gotoFeature

このメソッドに渡されたパラメータによって指定される特定のアプリケーションに移動します。

gotoSpringboard

Springboardに移動します。

hideNavigationbar

ナビゲーション・バーを非表示にします。

showNavigationbar

ナビゲーション・バーを表示します(非表示になっている場合)。

resetFeature

このメソッドに渡されたパラメータによって指定されるアプリケーション機能をリセットします。

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

「アプリケーションの起動時にSpringboardを表示」オプションを選択して、スライドアウト幅を画面の最大サイズに定義すると、MAFでは、起動時にバックグラウンドでデフォルトのアプリケーション機能がロードされます。モバイル・アプリケーションの休止時には、MAFではSpringboardを非表示にします。

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

各モバイル・アプリケーションには、少なくとも1つのアプリケーション機能が必要です。

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

図4-14は、「機能参照」ページを示しています。このページで、モバイル・アプリケーションのコンテンツを構築できます。第4.2項「モバイル・アプリケーションの構成ファイルについて」に示したように、モバイル・アプリケーション識別子ファイルの<adfmf:featureReference>要素によって、これらのアプリケーション機能を指定します。

例4-8 maf-application.xmlファイルでの機能参照の指定

<adfmf:featureReference id="Prod"
showOnNavigationBar="true"
showOnSpringboard="true"/>
<adfmf:featureReference id="Customers"
showOnNavigationBar="true"
showOnSpringboard="true"/>
<adfmf:featureReference id="HCM"
showOnNavigationBar="true"
showOnSpringboard="true"/>
<adfmf:featureReference id="custom_springboard"
showOnNavigationBar="false"
showOnSpringboard="false"/>
<adfmf:navigation>
<adfmf:springboard enabled="true">
<adfmf:springboardFeatureReference id="custom_springboard"/>
</adfmf:springboard>
</adfmf:navigation>

例4-8では、いくつかの定義済の機能参照とそれらに関連する属性を示しています。概要エディタでは、これらの機能参照は「機能参照」表に表示されます。図4-14は、カスタマおよび製品のアプリケーション機能をそれぞれ表すHCMおよびPRODに対して定義された機能参照を示しています。このページを使用して、アプリケーション機能に対する参照を入力し、モバイル・アプリケーションのSpringboard内での表示を設定します(図4-1を参照)。

さらに、このページでは、ナビゲーション・バーおよびSpringboard上でのアプリケーション機能の表示順序を設定できます。実行時に、デバイス画面の幅によって、ナビゲーション・バーに表示されるアプリケーション機能の数を制限できます。ナビゲーション・バーに収まらない機能は、「次へ」タブの下に表示されます(図4-51を参照)。「編集」機能を使用して、「次へ」タブ内のアプリケーション機能の順序を変更できます。

図4-13「次へ」タブ

注意:

モバイル・アプリケーションの構築は反復型のプロセスなので、新しいFARが使用可能になり、新しいアプリケーション機能がmaf-feature.xmlファイルに追加されると、機能参照を追加、削除または更新できます。

図4-14 「機能参照」ページを使用したアプリケーション機能の指定

始める前に

第4.9項「アプリケーション機能の基本構成の設定」に示すように、アプリケーション機能がmaf-feature.xmlファイル内で構成されている必要があります。さらに、maf-application.xmlの概要エディタを開く必要があります。

機能参照を指定するには:

1. maf-application.xmlの概要エディタの「機能参照」ページをクリックします。

2. 「追加」をクリックします。

3. 機能参照の挿入ダイアログで、ドロップダウンリストからアプリケーション機能のIDを選択します(図4-15を参照)。インポートした機能アーカイブ(FAR)ファイルに含まれているアプリケーション機能への参照を追加することもできます。詳細は、第4.13.2項「FARのライブラリとしての追加時に行われる処理」を参照してください。
このダイアログには、maf-feature.xmlファイルの<adfmf:feature>要素に記述されているすべてのアプリケーション機能がリストされます。このダイアログを使用することで、<adfmf:featureReference>要素と<adfmf:feature>要素の両方のid属性が確実に一致するようになります。第4.6.2項「機能参照IDと機能IDに関する必知事項」も参照してください。

図4-15 モバイル・アプリケーションのコンテンツの選択

4. 必要に応じて、上矢印と下矢印(図4-15を参照)を使用して機能参照の表示順序を調整するか、「ID」列の行にあるドロップダウン・リスト(図4-16を参照)を使用して機能参照の順序を変更します。最上位のアプリケーション機能が、デフォルトのアプリケーション機能です。このアプリケーションのセキュリティ構成に応じて、MAFではユーザーが匿名でログインして保護されていないコンテンツを表示したり、ユーザーに認証資格証明を提供するように求めることができます。詳細は、第21.1項「モバイル・アプリケーション・フレームワークのセキュリティについて」を参照してください。

注意:

「機能参照」表の最上位のIDが、モバイル・アプリケーション内で最初に表示されるアプリケーション機能です。例として、図4-7に示されているFeature 1アプリケーション機能を参照してください。

図4-16 機能参照の順序変更

5. 「ナビゲーション・バーに表示」列および「Springboardに表示」列の行のドロップダウン・リストから、 「true」または「false」を選択することで、Springboardとナビゲーション・バーのアプリケーション機能に対する表示動作を設定します。図4-17は、アプリケーション機能がナビゲーション・バーに表示されなくなるオプションの選択状態を示しています。

ヒント:

アプリケーションによってカスタムSpringboardが使用される場合、またはアプリケーション機能が単一のスライディング・ウィンドウとして表示される場合は、これらのオプションをfalseに設定します。詳細は、第4.6.3項「スライディング・ウィンドウの有効化に関する必知事項」を参照してください。

図4-17 ナビゲーション・オプションの変更

デフォルトでは、Springboardとナビゲーション・バーが表示されます(つまり、これらの属性はtrueに設定されます)。ナビゲーション・バーとSpringboardの両方の属性をfalseに設定すると、アプリケーション機能は最初の位置にある場合のみ表示されるようになります。第B.2.11項「hideNavigationBar」および第B.2.12項「showNavigationBar」も参照してください。

注意:

Springboardアプリケーションは、ナビゲーション・バー上またはモバイル・アプリケーションのSpringboard内には表示されないので、カスタムSpringboardアプリケーション機能として使用される機能参照については、「ナビゲーション・バーに表示」および「Springboardに表示」を両方ともfalseに設定する必要があります。第4.5.5項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」も参照してください。

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

モバイル・アプリケーションには多数のプロジェクトを格納できるので、複数のmaf-feature.xmlファイルを含むこともできます。アプリケーション構成ファイルでは、機能参照はmaf-feature.xmlファイルによって記述される機能と関連しています。<adfmf:featureReferenceのIDは、対応するアプリケーション機能が定義される場所を識別します。言い換えれば、maf-application.xmlファイル内の<adfmf:featureReference要素のid属性は、maf-feature.xml内の<adfmf:feature要素に対して定義されたid属性と同じである必要があります。たとえば、maf-application.xmlの<adfmf:featureReference id="customers"は、maf-feature.xmlの<adfmf:feature id="customers"によって定義されます。JDeveloperは、同じモバイル・アプリケーション内のアプリケーションと機能識別子ファイルの間の参照を監査し、矛盾を発見したら警告を行います。図4-18に示すように、JDeveloperは、機能参照と機能アプリケーション識別子ファイルで宣言された機能との間の不一致をコード内で波状の下線で強調表示し、「参照が見つかりません」という警告を表示します。この場合は、機能参照IDが正しいProdではなくPridと定義されています。JDeveloperの構文監査の詳細は、Oracle Fusion Middleware Oracle Jdeveloperによるアプリケーションの開発の「Javaプロジェクトの監査とモニタリング」の章を参照してください。

図4-18 id属性の監査

<adfmf:featureReference>のIDがmaf-feature.xmlファイルで定義されている場合、ポップアップ・メニューの「宣言に移動」(図4-19を参照)を使用して、maf-application.xmlファイル内の<adfmf:featureReference>のidから、これに対応するmaf-feature.xmlファイル内の<adfmf:feature>のidへ移動できます。

図4-19 maf-feature.xmlファイル内のアプリケーション機能宣言の検索

機能IDはアプリケーション全体を通して一意である必要があります。アプリケーション機能は再使用できるので、適切な命名規則によって機能IDを必ず一意にしてください。

注意:

MAFビュー・コントローラ・プロジェクトを、別のMAFビュー・コントローラ・プロジェクトの依存性またはモバイル・アプリケーション・コントローラ・プロジェクトの依存性として追加しないでください。これを行った場合、追加したビュー・コントローラ・プロジェクトに、元のMAFビュー・コントローラ・プロジェクトのmaf-feature.xmlファイルに含まれる<admf:feature>要素と同じid属性を持つ<adfmf:feature>要素が追加されます。その結果、モバイル・アプリケーション全体で<adfmf:feature>要素のid属性が一意でないことが検出されるため、デプロイメント・フレームワークによるデプロイメントは終了します。

4.6.3 スライディング・ウィンドウの有効化に関する必知事項

アプリケーション機能をスライディング・ウィンドウとしてレンダリングできます。これにより、ナビゲーション・バーまたはSpringboard内に表示される他のアプリケーション機能と同時にアプリケーション機能が表示されます。スライディング・ウィンドウは、アプリケーション内に常に存在しているコンテンツ(グローバル・ツール・バーなど)を表示するために使用したり、一時的な(ポップアップ)コンテンツ(ヘルプ・ウィンドウなど)を表示するために使用できます。

図4-20は、他のアプリケーション機能に重なりながら、アプリケーション画面の下部に250ピクセルを占めるように構成されたアプリケーション機能(スライディング・ウィンドウ)を示しています。

図4-20 他のアプリケーション機能に重なるスライディング・ウィンドウ

アプリケーション機能をスライディング・ウィンドウとしてレンダリングする場合、Show on Navigation BarプロパティおよびShow on Springboardプロパティをfalseに設定する必要があります。

スライディング・ウィンドウを作成するには、oracle.adfmf.framework.api.AdfmfSlidingWindowOptionsクラスとAdfmfSlidingWindowUtilitiesクラスの組合せを、アプリケーション内のマネージドBeanまたはライフサイクル・リスナーから起動します。

例4-9は、機能ライフサイクルのactivateメソッドから、図4-20に示すスライディング・ウィンドウを作成する方法を示しています。

図4-9 スライディング・ウィンドウの作成

package mobile;

import oracle.adfmf.feature.LifeCycleListener;
import oracle.adfmf.framework.api.AdfmfSlidingWindowOptions;
import oracle.adfmf.framework.api.AdfmfSlidingWindowUtilities;

public class SlidingWindowListener implements LifeCycleListener {

String windowId = null;

public SlidingWindowListener() {
super();
}

public void activate() {

try {

// The argument you pass to the create method is the ID of the
// feature in the maf-application.xml. For example,
// <adfmf:featureReference id="SliderTest_FeatureID" showOnNavigationBar="false"
// showOnSpringboard="false"/>
windowId = AdfmfSlidingWindowUtilities.create("SliderTest_FeatureID");
// Note also that both showOn... values must be set to false in the config
// file for the sliding window to appear

AdfmfSlidingWindowOptions options = new AdfmfSlidingWindowOptions();
options.setDirection(AdfmfSlidingWindowOptions.DIRECTION_BOTTOM);
options.setStyle(AdfmfSlidingWindowOptions.STYLE_OVERLAID);
options.setSize("250");
AdfmfSlidingWindowUtilities.show(windowId, options);

}

catch (Throwable t) {
t.printStackTrace();
}

}
...
}

AdfmfSlidingWindowUtilitiesおよびAdfmfSlidingWindowOptionsの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework用のJava APIリファレンスを参照してください。ライフサイクル・リスナーの使用方法の詳細は、第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」を参照してください。

AdfmfSlidingWindowUtilitiesを使用したスライディング・ウィンドウの実装は、第F項「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」に記載されているSlidingWindowのサンプル・アプリケーションを参照してください。

4.7 モバイル・アプリケーションでのライフサイクル・リスナーの使用

ライフサイクル・リスナーは、アプリケーションの固有のイベントに応じて実行されるコードを記述するために便利な場所です。MAFは、アプリケーションまたはアプリケーション機能イベントに応じたコードを記述できるライフサイクル・リスナーを備えています。アプリケーション・ライフサイクル・リスナー・メソッドの標準的な実装としては、第10.2項「ローカルSQLiteデータベースの使用方法」に示されているように、アプリケーションの起動時にアプリケーションのデータベースを初期化するコードを記述するか、または第21.4.7項「実行時に名前付き接続の接続属性を更新する方法」に示されているように、URLパラメータからセキュリティ構成を更新します。

MAFは、イベント通知と通信するために実装できる次の2つのインタフェースを備えています。

- oracle.adfmf.application.LifeCycleListener
このインタフェースには、アプリケーション・ライフサイクル・リスナーが実装する必要のある次のメソッドを指定します。

- activate()

- deactivate()

- start()

- stop()

- oracle.adfmf.feature.LifeCycleListener
このインタフェースには、機能ライフサイクル・リスナーが実装する必要のある次のメソッドを指定します。

- activate()

- deactivate()

ライフサイクル・リスナーを作成するには、適切なインタフェースを実装するJavaクラスを作成し、第4.7.1項「アプリケーションまたは機能のライフサイクル・リスナーを登録する方法」に示されているように、MAFアプリケーションの実装を登録します。

新規作成するMAFアプリケーションは、図4-21に示されているように、アプリケーションのApplicationControllerプロジェクトにapplication.LifeCycleListenerImpl.javaクラスをデフォルトで作成することによって、oracle.adfmf.application.LifeCycleListenerインタフェースを実装します。

図4-21 アプリケーション・ライフサイクル・リスナーの実装

アプリケーション・ライフサイクル・リスナーは、匿名ユーザーによって実行されます(つまり、そのリスナーのメソッドにはどのユーザーも関連付けられず、セキュアなWebサービスもコールされません)。

表4-3は、アプリケーションの起動時、シャットダウン時および休止時にアプリケーション・ライフサイクル・メソッドをMAFが起動する特定の時刻を示しています。

表4-3 MAFによるアプリケーション・ライフサイクル・メソッドの起動タイミング

メソッド

タイミング

いつコールされるか

使用方法

start

モバイル・アプリケーションがアプリケーション機能を完全にロードした後、ユーザーに最初のアプリケーション機能またはSpringboardを表示する直前にコールされます。これはブロック化コールです。

アプリケーションの処理が開始されたとき。

次の使用方法があります。

- モバイル・アプリケーションの更新があるかどうかを確認する。

- ローカル・データベースにデータをダウンロードするよう、リモート・サーバーにリクエストする。

stop

モバイル・アプリケーションがシャットダウンを開始するときにコールされます。

アプリケーションの処理が終了したとき。

次の使用方法があります。

- 任意のリモート・サービスからログオフする。

- アプリケーションが終了する前に、データの変更をサーバーにアップロードする。

activate

モバイル・アプリケーションをバックグラウンドにある(休止)状態からアクティブ化するときにコールされます。これはブロック化コールです。

startメソッドがコールされた後。

次の使用方法があります。

- キャッシュ・ストアを読み取り、再移入する。

- Webサービス・リクエストを処理する。

- 必要なリソースを取得する。

deactivate

モバイル・アプリケーションを非アクティブ化し、バックグラウンドに移動する(休止)ときにコールされます。これはブロック化コールです。

stopメソッドがコールされる前。

次の使用方法があります。

- リストア可能な状態を書き込む。

- データベース・カーソルとデータベース接続を閉じる。

表4-4は、機能のアクティブ化および非アクティブ化時にMAFが機能ライフサイクル・メソッドを起動する特定の時刻を示しています。

表4-4 MAFによる機能ライフサイクル・メソッドの起動のタイミング

メソッド

タイミング

いつコールされるか

使用方法

activate

現在のアプリケーション機能がアクティブ化される前にコールされます。

ユーザーがモバイル・アプリケーションの起動後に初めてアプリケーション機能を選択したとき、またはアプリケーション機能が再選択されたとき(つまり、フォアグラウンドに戻されたとき)にコールされます。

次の使用方法があります。

- applicationScope変数を読み取る。

- 最初のMAF AMXビューにおける現在の行を設定する。

deactivate

次のアプリケーション機能がアクティブ化される前、またはアプリケーション機能が終了する前にコールされます。

ユーザーが別のアプリケーション機能を選択したときにコールされます。

たとえば、deactivateイベントを使用して、applicationScope変数や、次のアプリケーション機能が使用するその他の状態情報を記述できます。

oracle.adfmf.application.LifeCycleListenerインタフェースおよびoracle.adfmf.feature.LifeCycleListenerインタフェースの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework用Java APIリファレンスを参照してください。

LifecycleEventsサンプル・アプリケーションは、アプリケーション・インタフェースと機能インタフェースの両方を実装し、これらをモバイル・アプリケーションのmaf-application.xmlファイルとmaf-feature.xmlファイルに登録するリスナー・クラスの宣言を示しています。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install\jdeveloper\jdev\extensions\oracle.maf\Samples

サンプル・アプリケーションの詳細は、付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照してください。

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

アプリケーション・ライフサイクル・リスナーの登録は、maf-application.xmlファイルの概要エディタを使用して行い、機能ライフサイクル・リスナーの登録は、maf-features.xmlファイルの概要エディタを使用して行います。

アプリケーション・ライフサイクル・リスナーを登録するには:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開きます。

2. 「アプリケーション・リソース」パネルでDescriptorsを展開し、ADF META-INFを展開します。

3. maf-application.xmlをダブルクリックします。

4. 「Application」ナビゲーション・タブで、oracle.adfmf.application.LifeCycleListenerインタフェースを実装するJavaクラスをLifecycle Event Listenerフィールドに指定します。デフォルトでは、これはapplication.LifeCycleListenerImplに設定されています。
MAFに用意されているデフォルト実装と異なるカスタム・クラスを使用するシナリオは、別のところで使用するために配布されるJARライブラリにアプリケーション・ライフサイクル・リスナーをパッケージ化するときのためのものです。

機能ライフサイクル・リスナーを登録するには:

1. 「Application」ウィンドウで、ViewControllerプロジェクトを展開し、「アプリケーション・ソース」およびMETA-INFを展開します。

2. maf-feature.xmlファイルをダブルクリックします。

3. 機能ライフサイクル・リスナーを登録する機能を「機能」リストで選択します。

4. 「ライフサイクル・イベント・リスナー」フィールドに、oracle.adfmf.feature.LifeCycleListenerインタフェースを実装するJavaクラスを指定します。

4.7.2 アプリケーションまたは機能のライフサイクル・リスナーの登録時の処理

デフォルトでは、作成するMAFアプリケーションは、アプリケーションのApplicationControllerプロジェクトでのapplication.LifeCycleListenerImpl.javaクラスの作成を介して、アプリケーション・ライフサイクル・リスナーを実装します。maf-application.xmlファイルのlistener-class属性は、例4-10に示されているように、このクラスを登録します。

例4-10 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="NewMAFapp" id="com.company.NewMAFapp"
appControllerFolder="ApplicationController" listener-class="application.LifeCycleListenerImpl">
...
</adfmf:application>

機能ライフサイクル・リスナーを登録すると、JDeveloperでは、listener-class属性用のmaf-feature.xmlファイルにエントリを書き込みます。例4-11は、付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」に記載されているLifecycleEventsサンプル・アプリケーションのエントリを示しています。

例4-11 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" 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>

4.8 モバイル・アプリケーション機能の構成ファイルについて

maf-feature.xmlファイル(例4-12を参照)では、対応するmaf-application.xmlファイルの<adfmf:featureReference>要素によって参照される実際のモバイル・アプリケーション機能を構成できます。

例4-12 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="PROD"
name="Products"
icon="images/logo.png">
<adfmf:constraints>
</adfmf:constraints>
<adfmf:description>Products</adfmf:description>
<adfmf:content id="PROD.1">
<adfmf:amx file="PROD/products_page.amx"/>
</adfmf:content>
</adfmf:feature>
<adfmf:feature id="HCM"
name="Contents"
icon="images/directory.png">
<adfmf:description>People Finder</adfmf:description>
<adfmf:content id="HCM.1">
<adfmf:remoteURL connection="Connections1"/>
</adfmf:content>
</adfmf:feature>
<adfmf:feature id="Customers.1"
name="Customers"
icon="images/people.png">
<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="equal"
value="field sales"/>
<adfmf:constraint property="user.roles"
operator="not"
value="consultant"/>
</adfmf:constraints>
<adfmf:description>Customers</adfmf:description>
<adfmf:content id="Customers.2">
<adfmf:localHTML url="Customers/customers_page.html"/>
</adfmf:content>
</adfmf:feature>
</adfmf:features>

maf-feature.xmlファイルの要素を定義することで、アプリケーション機能の動作を設定します。このためには、今度はXMLファイル内のルート要素<adfmf:features>の下で最上位の要素である<Feature>要素の子要素を定義します。<Feature>要素そのものは、名前、バージョン、セキュリティ保護の有無など、アプリケーション機能の基本情報について記述しています。詳細は、第21章「モバイル・アプリケーションの保護」を参照してください。<Feature>要素の子要素を表4-5に示します。maf-application.xml識別子ファイルの概要エディタのように、maf-feature.xmlファイルの概要エディタを使用して、このファイルをこれらの要素で宣言的に更新(または編集)できます(第4.9項「アプリケーション機能の基本構成の設定」を参照)。

表4-5 <Feature>要素の子要素

要素の子要素" width="100%">

要素

説明

<adfmf:content>

特定のデバイスやユーザーに対してアプリケーション機能で使用される形式を記述します。アプリケーション機能のコンテンツ(通常はユーザー・インタフェース)は、MAF AMXページやHTML5ページとして記述することも、リモートWebサーバー上でホストされるWebページから配信することもできます。コンテンツをWebアプリケーションとして指定する方法は、第13章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

<adfmf:constraint>

指定したアプリケーション機能を実行時にアプリケーションに表示できるようにするかどうかを決定します。制約を使用すると、ユーザー・ロールやデバイスのプロパティなどの基準に基づいてアプリケーション機能の使用を許可または回避できます。詳細は、第15章「アプリケーション機能に関する制約の設定」を参照してください。

4.9 アプリケーション機能の基本構成の設定

各モバイル・アプリケーションには、少なくとも1つのアプリケーション機能が必要です。各アプリケーション機能はそれぞれ別個に(モバイル・アプリケーション自体とも別に)開発できるので、maf-feature.xmlファイルの概要エディタでは、<adfmf:features>の子要素を定義して、それぞれの名前とIDを割り当て、コンテンツの実装方法を設定することで、アプリケーション機能を区別できます。アプリケーション機能の概要エディタを使用すると、モバイル・アプリケーション内のアプリケーション機能のランタイム表示を制御したり、アプリケーション機能がユーザー認証を必要とするタイミングを指定することもできます。

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

概要エディタの「一般」タブ(図4-22を参照)では、アプリケーション機能を追加したり、その基本情報や表示アイコンを指定できます。

図4-22 アプリケーション機能の「一般」タブ

始める前に

アプリケーション機能で、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ディレクトリに配置します。第4.10.2項「外部リソースの選択に関する必知事項」も参照してください。

さらに、maf-feature.xmlファイルを開いて、「一般」タブを選択する必要があります。

アプリケーション機能の基本情報を設定するには:

1. 「一般」タブを選択します。

2. 「機能」表で、「追加」をクリックします。

3. 「MAF機能の作成」ダイアログ(図4-18を参照)に入力して、「OK」をクリックします。このダイアログは次のように入力します。

- 「機能名」フィールドに、アプリケーション機能の表示名を入力します。

- 「機能ID」フィールドに、アプリケーション機能の一意の識別子を入力します。

- 必要に応じて、アプリケーション機能の場所を、public_htmlディレクトリ(デフォルトの親ディレクトリ)内の任意のディレクトリに変更します。この場所を「ディレクトリ」フィールドに入力します。

- 新しく定義したアプリケーション機能をモバイル・アプリケーションに追加するには、「機能ID」に入力した値と一致するid属性を持つmaf-application.xmlファイルに、新しい<adfmf:featureReference>要素を追加します。「対応する機能参照をmaf-application.xmlに追加」を選択します。このダイアログの入力を完了すると、「機能参照」ページの表(図4-14を参照)に機能参照が追加されます。第4.6.2項「機能参照IDと機能IDに関する必知事項」も参照してください。

図4-23 アプリケーション機能の追加

4. 概要エディタの「一般」タブで、「ベンダー」フィールドに、アプリケーション機能を最初に作成したベンダーの名前を入力します。これはオプションの値です。

5. 「バージョン」フィールドに、アプリケーション機能のバージョン番号を入力します。これはオプションの値です。

6. 「説明」フィールドに、アプリケーションの目的の簡単な説明を入力します。これはオプションの値です。

7. 「ライフサイクル・イベント・リスナー」の「クラスおよびパッケージ・ブラウザ」を使用して、完全修飾クラス名(oracle.adfmf.featureのようにパッケージを含む)を入力して、イベントを起動、停止、休止および休止から戻すためのランタイム・コールを有効にします。詳細は、第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」を参照してください。これはオプションの値です。

8. 「ナビゲーション・バー・アイコン」および「Springboardイメージ」フィールドで、ナビゲーション・バーのアイコンとして使用するイメージと、Springboardの表示アイコンとして使用するイメージを、プロジェクトから参照して選択します。「アプリケーション」ウィンドウから「ファイルの場所」フィールドにイメージ・ファイルをドラッグ・アンド・ドロップすることもできます。これはオプションの値です。

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

アプリケーション機能のコンテンツ・タイプには、ユーザー・インタフェースの形式が記述されます。このコンテンツ・タイプは、MAF AMXコンポーネントまたはHTML(5)タグを使用して構成できます。また、アプリケーション機能では、モバイル・コンテキストに適したコンテンツを含む、リモートでホストされたページから、自身のコンテンツを導出することもできます。このようなWebページとして考えられるのは、スマートフォン向けのApache Trinidadで作成されたJavaServerページや、タブレット・デバイス上で実行されるアプリケーション向けのADF Facesコンポーネントから構成されたページです。モバイル・アプリケーションに埋め込まれた各アプリケーション機能では、様々なコンテンツ・タイプを保持できます。

モバイル・アプリケーションには、様々なコンテンツ・タイプを持つアプリケーション機能が含まれますが、アプリケーション機能自体も、ユーザーおよびデバイス固有の要件に応じた様々なコンテンツ・タイプを保持する場合があります。アプリケーション機能によって、様々なコンテンツ・タイプがどのように提供されるかについては、第15章「アプリケーション機能に対する制約の設定」を参照してください。例4-13のように、子要素を<adfmf:content>要素に追加すると、アプリケーション機能にユーザー・インタフェースをどのように実装するかを定義できます。

例4-13 <adfmf:content>要素

<adfmf:content id="Feature1">
<adfmf:amx file="FeatureContent.amx">
</adfmf:content>

4.10.1 アプリケーション・コンテンツの定義方法

概要エディタの「コンテンツ」タブ(図4-24を参照)には、例4-13に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。このタブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できる制約を設定できます。

各コンテンツ・タイプには、独自のパラメータ・セットがあります。たとえば、図4-24に示すように、MAF AMXページの場所、またはMAF AMXコンテンツとして実装するアプリケーション機能のタスク・フローの場所を指定する必要があります。さらにオプションで、アプリケーション機能に他のアプリケーション機能(またはモバイル・アプリケーション自体)とは異なるルック・アンド・フィールを設定するCSSファイルを選択したり、MAF AMXコンポーネントのアクションを制御するJavaScriptファイルを選択することもできます。

図4-24 アプリケーション機能の実装の定義

始める前に

各コンテンツ・タイプには、次のような独自の前提条件があります。

- MAF AMX: アプリケーション機能のデフォルトのコンテンツ・タイプで、個々のMAF AMXページおよびタスク・フローの両方が含まれます。MAF AMXコンテンツは、一連のモバイル固有のユーザー・インタフェース・コンポーネント、ADFデータ・バインディング、カメラなどのデバイス・サービスを統合するデータ・コントロール、およびチャート、グラフ、テーマ・マップなどのデータ視覚化ツールを使用して、宣言的に構築できます。MAF AMXページの構築の詳細は、第5章「MAF AMXページの作成」を参照してください。
MAF AMXとして実装されるアプリケーション機能には、ビュー(単一のMAF AMXページ)か、バインド・タスク・フローまたはバインドなしタスク・フローが必要です。JavaScriptファイルを追加すると、MAF AMXコンポーネントに対するレンダリング・ロジックが提供されるか、既存のレンダリング・ロジックがオーバーライドされます。アプリケーション機能に対するカスタムのルック・アンド・フィールを指定するセレクタを持つスタイルシート(CSS)を含めます。これは、モバイル・アプリケーション・レベルで定義されたスタイル(アプリケーション機能にデフォルトで使用されるスタイル)をオーバーライドします。つまり、アプリケーション機能全体で確実に独自のルック・アンド・フィールを持つようになります。

MAF AMXページとこれらを格納するモバイル・アプリケーションは、両方とも「新規ギャラリ」のウィザードを使用して作成できます。これらのウィザードにアクセスするには、まず「アプリケーション」ウィンドウでビュー・コントローラ・プロジェクトを強調表示してから、次に「新規」を選択します。または、「アプリケーション」ウィンドウでビュー・コントローラ・プロジェクトを右クリックしてから「新規」を選択すると表示されるポップアップ・メニュー(図4-25を参照)を使用して、MAF AMXページを作成することもできます。

注意:

maf-feature.xmlファイル内にある、タスク・フロー、MAF AMXページ、CSSおよびJavaScriptファイルへの参照を手動で編集する場合、デバイスで使用されているファイル・システムによって大文字と小文字が区別され、特殊文字が許可されない可能性があることに注意してください。これらのファイルを確実に参照できるようにするには、モバイル・デバイスの仕様を確認してください。

図4-25 MAFページを作成するためのポップアップ・メニュー

- リモートURL: Webアプリケーションへの参照。既存のWebアプリケーションをモバイル用に拡張し、さらにデバイス・サービスを拡張できます。リモート・コンテンツでは、ローカル・データ・キャッシュや、サーバー側データおよび機能の一式を提供することによって、MAF AMXおよびローカルHTMLコンテンツの両方を補完できます。リモートURL実装には、有効なWebアドレスが必要です。詳細は、第13章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

- ローカルHTML: ユーザーのモバイル・アプリケーション内にパッケージ化されるHTMLページを参照します。HelloWorldサンプル・アプリケーション(付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照)で示したようなHTMLページでJavaScriptを参照できます。MAFがアプリケーション機能の実装に最適ではない場合、このコンテンツ・タイプを使用し、Cordova JavaScript APIを使用してアプリケーション機能を実装することを検討してください。JavaScript APIおよびMAFの詳細は、付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」を参照してください。

アプリケーション・コンテンツをリモートURLまたはローカルHTMLとして定義するには:

1. maf-feature.xmlファイルの「機能」表にリストされているアプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 「追加」をクリックして、「コンテンツ」表に新しい行を作成します。

4. 次のいずれかのコンテンツ・タイプで、生成されたIDに対応するものを選択します。

- リモートURL

- ローカルHTML

5. コンテンツ固有のパラメータを定義します。

- リモートURLコンテンツの場合は、図4-26のように接続を選択します。これは、サーバー上のWebページのアドレス(および起動ページの場所)を表しています。

図4-26 ホスト・アプリケーションの接続の選択

この接続を作成するには、まず「追加」をクリックして、次に「URL接続の作成」ダイアログに入力します(図4-27を参照)。このダイアログの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。この接続は、connections.xmlファイルに格納されます。

注意:

この接続は、アプリケーション・リソースとしてのみ作成できます。

図4-27 URL接続の作成

- ローカルHTMLコンテンツの場合は、ローカル・バンドルの場所を入力します。または、「URL」フィールドで「追加」をクリックし、図4-28に示すダイアログに入力して、JDeveloperのHTMLエディタを使用してページを構築することで、HTMLページを作成します。これはアプリケーション機能なので、このページはビュー・コントローラ・プロジェクトのWeb Contentフォルダに格納されます。

図4-28 アプリケーション機能のコンテンツとしてのローカルHTMLページの作成

6. 必要に応じて、次の手順を実行します。

- このコンテンツをユーザーが使用できるようになるための条件を示す制約を入力します。詳細は、第15章「アプリケーション機能に関する制約の設定」を参照してください。

- ナビゲーション・バーとSpringboardのイメージを選択します。

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

1. アプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 必要に応じて、「追加」をクリックして「コンテンツ」表に行を作成し、「タイプ」列のドロップダウン・リストから「MAF AMX」を選択します(図4-29を参照)。

図4-29 MAF AMXをコンテンツ・タイプとして選択

4. 「ファイル」フィールドで「参照」をクリックし、「MAF AMXページ」または「タスク・フロー」を選択して(図4-30を参照)、MAF AMXページまたはバインド・タスク・フローの場所に移動し、これを取得します。または、「アプリケーション」ウィンドウから「ファイルの場所」フィールドにMAF AMXページをドラッグ・アンド・ドロップすることもできます。

図4-30 ファイル・フィールドでのファイルの場所の参照

5. または、ページまたはタスク・フローを作成します。これを行うには、次の手順を実行します。

1. 「ファイル」フィールドで「追加」をクリックして、「MAF AMX」または「タスク・フロー」を選択します(図4-31を参照)。

図4-31「ファイル」フィールドからの「MAF AMXページ」または「タスク・フロー」の追加

2. 「MAF AMXページの作成」ダイアログ(図4-32参照)など、作成ダイアログの入力を完了させます。

図4-32 「MAF AMXページの作成」ダイアログ

3. エディタを使用して、MAF AMXページまたはタスク・フローを構築します。

6. 必要に応じて、次の手順を実行します。

- 「包含」表で「追加」をクリックしてJavaScriptファイルを入力し、「JavaScript」を選択し、ファイルの場所を参照します。詳細は、第4.12.8項「デフォルト・スキン・スタイルのオーバーライド」を参照してください。

- 最初に「追加」をクリックして、次に「スタイルシート」を選択することで、maf-config.xmlで指定されているデフォルトのスタイルシートをオーバーライドします。ファイルの場所を参照します。詳細は、第4.12項「モバイル・アプリケーションのスキニング」を参照してください。

- 制約を入力します(第15章「アプリケーション機能に関する制約の設定」を参照)。

- ナビゲーション・バーとSpringboardのイメージを選択します。

注意:

イメージ、スタイルシートおよびJavaScriptファイルは、デプロイ可能にするために、public_htmlフォルダ内に配置する必要があります。第4.10.2項「外部リソースの選択に関する必知事項」を参照してください。

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

デプロイメントを可能にするために、次の属性によって参照されるすべてのリソースは、ビュー・コントローラ・プロジェクトのpublic_htmlディレクトリ内に配置する必要があります。

- <adfmf:feature>のiconおよびimage属性(例: <adfmf:feature id="PROD" name="Products" icon="feature_icon.png" image="springboard.png">)。第4.9.1項「アプリケーション機能の基本情報の定義方法」も参照してください。

- <adfmf:content>のiconおよびimage属性(例: <adfmf:content id="PROD" icon="feature_icon.png" image="springboard_image.png">)。第4.10項「アプリケーション機能のコンテンツ・タイプの定義」も参照してください。

- <adfmf:amx>のfile属性(例: <adfmf:amx file="PRODUCT/home.amx" />)。第4.10項「アプリケーション機能のコンテンツ・タイプの定義」も参照してください。

- <adfmf: localHTML>のurl属性(例: <adfmf:localHTML url="oracle.hello/index.html"/>)。第4.10項「アプリケーション機能のコンテンツ・タイプの定義」および第21.5.4.2項「カスタム・ログイン・ページ」も参照してください。

- <adfmf:includes>のtype=stylesheetおよびtype=JavaScriptに対して定義するファイル属性(例: <adfmf:include type="JavaScript" file="myotherfile.js"/>または<adfmf:include type="StyleSheet" file="resources/css/stylesheet.css" id="i3"/>)。第4.12項「モバイル・アプリケーションのスキニング」も参照してください。

MAFは、別の場所から参照されるリソースをサポートしていません。つまり、たとえば、../を接頭辞として使用して、public_htmlディレクトリ外部に値を入力することはできません。public_html外部のリソースを参照しないようにする安全策として、MAFには、「ファイルがpublic_htmlディレクトリにありません」と呼ばれる監査ルールが含まれています。MAFの監査プロファイル(図4-33を参照)には、「ツール」→「プリファレンス」→「監査」→「プロファイル」と選択することで、「プリファレンス」の「監査」の下の「プロファイル」ノードからアクセスできます。

図4-33 MAFの監査プロファイル

このプロファイルを選択した場合、リソースの場所を変更すると、JDeveloperによって警告が発行されます。図4-34に示すように、デフォルト値がオーバーライドされると、JDeveloperはこうした警告を表示します。監査の詳細は、Oracle Fusion Middleware Oracle Jdeveloperによるアプリケーションの開発の「Javaプロジェクトの監査とモニタリング」の章を参照してください。

図4-34 外部リソースの警告

4.11 ローカライズ済コンテンツの操作

ローカライゼーションは、テキストを変換し、ロケール固有のコンポーネントを追加することで、特定地域の言語または文化にアプリケーションを適応させるプロセスです。様々なロケールを使用するようにMAFアプリケーションとそのユーザー・インタフェース・ページを構成することによって、MAFアプリケーションがモバイル・デバイスで設定されている言語用に作成されたもののように表示できます。たとえば、フランス語を話す人がMAFアプリケーションを表示できるようにすることでこのアプリケーションの使用を拡大する場合、デバイスのSpringboardおよびMAF Webビュー内の両方で使用されるテキスト文字列およびイメージがフランス語で表示されるように(つまり、productsはles produitsなどに変換されます)アプリケーションをローカライズできます。

JDeveloperでは、これらのテキスト・リソースを28言語に自動的に変換します。

変換可能な文字列(バリデータ・エラー・メッセージまたは属性コントロール・ヒントなど)を定義すると、JDeveloperでは、プロジェクト・レベルのリソース・バンドル・ファイルに変換可能な文字列が格納されます。MAFでは、英語の言語テキスト・リソースを指定します(ただし他の言語では、任意のツールを使用して、リソース・バンドル・ファイルを生成できます)。モバイル・アプリケーションを構成して、アプリケーションおよびビュー・コントローラ・プロジェクト・レベルの両方で変換可能なUI文字列を格納できます。

4.11.1 リソース・バンドルの使用

MAFは、ローカライゼーションにXLIFF (XML Localization Interchange File Format)ファイルのみを使用します。つまり、JDeveloperは、文字列を格納するためにリソース・バンドル.xlfファイルを作成します。XLFFの詳細は、次を参照してください。

http://docs.oasis-open.org/xliff/xliff-core/xliff-core.html

4.11.1.1 リソース・バンドル・オプションの設定方法

プロジェクトの「リソース・バンドル」設定ページを使用して、ビュー・コントローラ・プロジェクトおよびアプリケーション・コントローラ・プロジェクトのリソース・バンドルを作成できます(図4-35を参照)。

図4-35「プロジェクト・プロパティ」の「リソース・バンドル」ページ

プロジェクトのリソース・バンドル・オプションを設定するには:

1. 「アプリケーション」ウィンドウで、プロジェクトをダブルクリックします。

2. 「プロジェクト・プロパティ」ダイアログで、「リソース・バンドル」を選択します。

3. 自動的にデフォルトのリソース・ファイルを生成するには、「バンドルの自動同期化」を選択します。

4. 次に示すいずれかのリソース・バンドル・ファイル・オプションを選択します。

- 1プロジェクト当たり1バンドル: <ProjectName>.xlfという名前のファイルに構成されます。詳細は、第4.11.1.2項「リソース・バンドル・オプションの選択時に行われる処理」を参照してください。

- 1ファイル当たり1バンドル: リソースをファイル(maf-feature.xml、maf-application.xmlまたは「MAF AMXページ」)に格納するたびに新しいバンドルが作成されます。このため、各ファイルには独自のバンドルがあります。このオプションによりリソース・バンドルの数が各ファイル1つに制限されるため、このオプションを選択した場合、JDeveloperでは2つ目のバンドルを作成できません。

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

注意:

Xliffリソース・バンドルは、MAFで使用される唯一のリソース・バンドルの形式です。このページの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

4.11.1.2 リソース・バンドル・オプションの選択時に行われる処理

JDeveloperでは、図4-35に示すように、「プロジェクト・プロパティ」ダイアログのリソース・バンドル・オプションのパートで行った選択に基づいて、特定のタイプの1つ以上のリソース・バンドルが生成されます。図4-37で示す「テキスト・リソースの選択」ダイアログを初めて呼び出したときに、リソース・バンドルが生成されます。

「1プロジェクト当たり1バンドル」を選択し、「リソース・バンドル・タイプ」ドロップダウン・リストから、「リスト・リソース・バンドル」値を選択したとします。初めて「テキスト・リソースの選択」ダイアログを呼び出すと、JDeveloperではそのプロジェクト用に1つのリソース・バンドルが生成されます。

デフォルトでは、JDeveloperにより、プロジェクトの「アプリケーション・ソース」ディレクトリの「view」サブディレクトリに、生成されたリソース・バンドルが作成されます。

4.11.1.3 リソース・バンドルへの文字列の入力方法

プロジェクト・レベルでは、「リソース・バンドル」ダイアログを使用してリソース・バンドル・ファイルを作成します。このダイアログには、「プロパティ」ウィンドウで「テキスト・リソースの選択」をクリックすることでアクセスします。このダイアログでは、表4-6および表4-7に示すmaf-application.xml属性およびmaf-feature.xml属性のベース・リソース・バンドルに、テキスト・リソースを自動的に作成できます。

アプリケーション・レベルでは、アプリケーション名やプリファレンス・ページのラベルなどの属性の文字列をローカライズできます。表4-6にこれらを示します。

表4-6 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

プロジェクト(ビュー・コントローラ)レベルでは、表4-7に示すような、アプリケーション機能関連の属性をローカライズできます。

表4-7 アプリケーション機能のローカライズ可能な属性

要素

属性

<adfmf:Feature>

name

<adfmf:Constraint>

value

<adfmf:Parameter>

value

<adfmf:PreferencePage>

label

<adfmf:PrefrenceGroup>

label

<adfmf:PreferenceBoolean>

label

<adfmf:PreferenceText>

label

<adfmf:PreferenceNumber>

label

<adfmf:PreferenceList>

label

<adfmf:PreferenceValue>

name

リソース・バンドルにローカライズ可能な文字列を作成するには:

1. 「プロパティ」ウィンドウでNameなどの属性を選択します(図4-36参照)。

2. 「テキスト・リソースの選択」を選択します。図4-36に、「プロパティ」ウィンドウで選択されたアプリケーション名属性を示しています。

図4-36 テキスト・リソースを選択するダイアログ

3. 「テキスト・リソースの選択」ダイアログ(図4-37を参照)で、表示名とキーを入力して新しい文字列リソースを作成し、「保存して選択」をクリックします。

図4-37 「テキスト・リソースの選択」ダイアログ

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

「テキスト・リソースの選択」ダイアログでリソースを追加すると、JDeveloperによって、指定した表示名の文字列とキー・ファイルをADF Meta-INFファイルに格納した、新しいプロジェクト・リソース・バンドルが作成されます(図4-38のacmeBundle.xlfを参照)。

図4-38 アプリケーション・リソース・バンドル

属性を最初にローカライズすると、JDeveloperによって<adfmf:loadbundle>要素が追加されます。この要素のbasename属性が、新しく作成したリソース・バンドルを参照します。

さらにJDeveloperは、ローカライズされた属性文字列を、リソース・バンドル内で定義された文字列のキーを参照するEL式に変更します。たとえば、JDeveloperは、Acme Salesというアプリケーション名属性を、「テキスト・リソースの選択」ダイアログでキーとして入力されたACME_SALES値に基づいて、name="#{acmeBundle.Acme_Sales}"に変更します。

アプリケーション・レベルにはリソース・バンドル・ファイルが1つしか存在しないので、JDeveloperは、ローカライズされた各文字列を同じリソース・バンドル・ファイルに追加します。

maf-application.xmlおよびmaf-feature.xmlファイルには、それぞれadfmf:loadBundle要素が1つのみ格納されています。アプリケーションをデプロイすると、リソース・バンドルはランタイムによって想定される言語フォーマットに変換されます。

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

<amx:commandButton>のtext属性のようなMAF AMXコンポーネントの属性には、リソース・バンドルを作成できます。表4-8に、これらのMAF AMX (amx)コンポーネントを示します。

表4-8 MAF AMXコンポーネントのローカライズ可能な属性

コンポーネント

属性

<amx:inputDate>

label

<amx:inputNumberSlider>

label

<amx:panelLabelAndMessage>

label

<amx:selectBooleanCheckBox>

label

<amx:selectBooleanSwitch>

label

<amx:selectItem>

label

<amx:selectManyCheckBox>

label

<amx:selectManyChoice>

label

<amx:selectOneButton>

label

<amx:selectOneChoice>

label

<amx:selectOneRadio>

label

<amx:commandButton>

text

<amx:commandLink>

text

<amx:goLink>

text

<amx:inputText>

label、value、hintText

<amx:outputText>

value

MAF AMXコンポーネントの文字列を使用するには:

1. 「プロパティ」ウィンドウで、<amx:outputText>コンポーネント(図4-39)に対して定義されたvalue属性などの属性を選択します。

図4-39 MAF AMXコンポーネントに対するテキスト・リソースの選択

2. 「テキスト・リソースの選択」を選択します。

3. 「テキスト・リソースの選択」ダイアログ(図4-40を参照)で、表示名とキーを入力して新しい文字列リソースを作成し、「保存して選択」をクリックします。

図4-40 リソース・バンドルへの文字列の追加

4.11.1.6 MAF AMXコンポーネントのプロジェクト・レベルのリソース・バンドルの作成時に行われる処理

<amx:outputText>コンポーネント(例4-14)のvalue属性などのコンポーネントをローカライズする場合、JDeveloperでは、文字列をEL式(例4-14の#{viewcontrollerBundle.LES_PRODUITS}など)に変換します。

例4-14 MAF AMXコンポーネントのローカライズ

<amx:facet name="header">
<amx:outputText value="#{viewcontrollerBundle.LES_PRODUITS}"
id="ot1"
rendered="true"/>
</amx:facet>

さらに、例4-15のViewControllerBundle.xlfのように、JDeveloperはプロジェクトのデフォルト・パッケージの下にリソース・バンドルを作成します。生成された<amx:loadBundle>コンポーネントでは、basenameがこのパッケージを示しています(例4-15を参照)。

例4-15 <amx:loadBundle>コンポーネント

<amx:loadBundle basename="mycomp.mobile.ViewControllerBundle"
var="viewcontrollerBundle"
id="lb1"/>

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

イメージがテキストを格納していたり、特定の国または地域を反映している場合(たとえば旗のピクチャなど)、ローカライゼーション・プロセスの一環として代替イメージを指定できます。イメージをハードコード化することはできません(例: icon="/feature1/test.png")。そのかわり、イメージのパスの<trans-unit>要素を追加することで、ViewControllerBundle.xlfファイルを手動で編集する必要があります(例4-16を参照)。

例4-16 <amx:image>コンポーネントのリソースの定義

<trans-unit id="IMAGEPATH">
<source>/feature1/test.jpg</source>
<target/>
</trans-unit>

注意:

例4-16の<source>要素で定義されているイメージの場所は、ViewController\public_htmlのアプリケーション機能ファイルの場所を基準にした相対的な場所です。または、イメージ・ファイルの名前を入力することもできます(例: <source>test.png</source>)。第4.10.2項「外部リソースの選択に関する必知事項」も参照してください。

ViewControllerBundle.xlfの更新後、「式ビルダー」を使用して、icon属性のsource属性のEL式を定義します(図4-41を参照)。

図4-41 ローカライズされたアイコン・イメージのEL式の作成

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

XLIFFファイルを作成した後で、ソース・エディタを使用してこのファイルを編集できます。

リソース・バンドル・ファイルを編集するには:

1. メイン・メニューから「アプリケーション」→「リソース・バンドルの編集」を選択します。

2. 「リソース・バンドルの編集」ダイアログ(図4-42を参照)で、「リソース・バンドル」ドロップダウン・リストから編集するリソース・バンドル・ファイルを選択するか、編集するリソース・バンドル・ファイルが「リソース・バンドル」ドロップダウン・リストに表示されない場合は、「検索」アイコンをクリックして「リソース・バンドルの選択」ダイアログを起動します。

図4-42 リソース・バンドル文字列の編集

3. 「リソース・バンドルの選択」ダイアログで、「ファイル・タイプ」ドロップダウン・リストからファイル・タイプを選択します。編集するリソース・バンドルに移動します。「OK」をクリックします。

4. 「リソース・バンドルの編集」ダイアログで、図4-42に示すように、「追加」アイコンをクリックしてキーと値のペアを追加します。完了したら「OK」をクリックします。

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

<adfmf:loadBundle>要素によって記述された場所には、1つ以上のXLIFFファイルが存在している必要があります。XLIFFファイルのファミリには、次のファイルが含まれています。

- ベースXLIFFファイル: ベースXLIFFファイルの名前は、basename属性によって指定されたパス内の最後のトークンと一致する必要があります。このファイルには.xlfという拡張子が付きます(例: ViewControllerBundle.xlf)。次の定義では、ファイルの名称はViewControllerBundleです。

<adfmf:loadBundle var="stringBundle" basename="view.ViewControllerBundle"/>

- ゼロ個以上のローカライズされたXLIFFファイル: 各ベースXLIFFファイルには、ゼロ個(以上)のローカライズされたXLIFFファイルを存在させることができます。各ファイルには次の決まりがあります。

- ファイル拡張子は.xlfである必要があります。

- 対応するベースXLIFFファイルと同じディレクトリにコロケートさせる必要があります。

- ファイル名の形式は次のようになります。

<BASE_XLIFF_FILE_NAME>_<LANGUAGE_TOKEN>.xlf

説明:

- <BASE_XLIFF_FILE_NAME>は、ベースXLIFFファイル名です(拡張子.xlfは含みません)。

- <LANGUAGE_TOKEN>の形式は次のとおりです。

<ISO-639-lowercase-language-code>

注意:

MAFは、国または地域をサポートしていません。

たとえば、スペインの場合、言語トークンはesになります。

たとえば、言語コードがen、es、frの場合、stringBundle.xlfという名前のベースXLIFFを参照するXLIFFファイルのローカライズされたファイル名は次のようになります。

- stringBundle_en.xlf

- stringBundle_es.xlf

- stringBundle_fr.xlf

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

maf-application.xmlおよびmaf-feature.xmlファイルのローカライズ可能な要素は、表4-7および表4-6に示す属性内で、ELに似た文字列を使用して国際化された文字列を参照します。これらの構成ファイルはアプリケーション・ライフサイクルの初期に読み取られるので、これらの文字列は実行時にはEL文として評価されません。そのかわり、これらの文字列は、ネイティブ・デバイス変換インフラストラクチャにおいて変換された文字列の完全なキーとして取得されます。

式言語の構文は"${BUNDLE_NAME.STRING_KEY}"ですが、MAFは"#{}"によって囲まれた文字列全体をキーとして使用して、変換された文字列を検索します。これらの文字列の形式は、#{bundleName.['My.String.ID']} (ここではXLIFF文字列がピリオドによって分割されています)と、#{bundleName.['MyStringID']} (これはピリオドによって分割されない文字列の識別子に対してのみ使用されます)になります。例4-17には、#{strings.CONTACTS} (name属性を変更します)など、後者の例が示されています。iOSネイティブ・フレームワークでは、デプロイメントで、その文の内容が、変換に使用される*.stringファイル内の適切なキーと必ず一致するようになっています。

エンド・ユーザーに表示される属性、またはエンド・ユーザーに表示されるコンテンツの場所を制御する属性のみが、国際化された文字列の使用をサポートしています。そこには次のような属性が含まれています。

- <adfmf:application>要素のname属性

- <adfmf:feature>要素のname属性

- <adfmf:feature>要素のicon属性

- <adfmf:feature>要素のimage属性

- <adfmf:content>要素のicon属性

- <adfmf:content>要素のimage属性

例4-17では、name、icon、image属性を持つアプリケーション機能が国際化文字列を使用しています。

例4-17 文字列を使用した国際化

<adfmf:feature id="CTCS" name="#{strings.CONTACTS}"
icon="#{strings.CONTACTS_ICON}"
image="#{strings.CONTACTS_IMAGE}">
<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="contains"
value="employee" />
</adfmf:constraints>
<adfmf:description>The HTML Device Contacts</adfmf:description>
<adfmf:loadBundle basename="mobile.adfmf-stringsBundle"
var="strings"/>
<adfmf:content id="CTCS.Generic">
<adfmf:constraints />
<adfmf:localHTML url="contacts.html" />
</adfmf:content>
</adfmf:feature>

<adfmf:loadBundle>要素を定義するときに(例4-18を参照)、バンドル名と実際のバンドルとのマッピングを作成します。バンドル名は、式を評価するときに使用します。

例4-18 <adfmf:loadBundle>を使用したバンドル名のマッピング

<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="contains"
value="employee" />
</adfmf:constraints>
<adfmf:description>The HTML Device Contacts</adfmf:description>
<adfmf:loadBundle basename="mobile.adfmf-featureBundle"
var="mobileBundle"/>
<adfmf:loadBundle basename="mobile.adfmf-stringsBundle"
var="strings"/>

MAFのランタイムでは、JVMに最初にアクセスするまで、<adfmf:loadBundle>要素が保持されます。メッセージがJVMに送信され、パッケージのベース名からバンドルのEL名へのマッピングが初期化されます。例4-19は、JVMに送信されるメッセージの構造を示しています。

例4-19 ベース名からEL名へのマッピングを初期化するメッセージ

{classname:"oracle.adfmf.framework.api.Model",method:"setBundles",
params:[[{basename:"mobile.adfmf-featureBundle",elname:"mobileBundle"},
{basename:"mobile.adfmf-stringsBundle",elname:"strings"}]]}

4.12 モバイル・アプリケーションのスキニング

MAFではCascading Style Sheet (CSS)言語ベースのスキンを使用するので、モバイル・アプリケーション内の(その要素のアプリケーション機能で使用されるものを含む)すべてのアプリケーション・コンポーネントが一貫したルック・アンド・フィールを確実に共有するようになっています。MAF AMXまたはHTMLコンポーネントを再構成してモバイル・アプリケーションの外観を変更するかわりに、コンポーネントの表示方法を変更するスキンを作成または拡張できます。

MAF AMXページの外観を決定するセレクタを定義するためにMAFで使用されるサポート済のスキンのファミリとバージョンは、次のとおりです。

amx
mobileAlta-1.0
mobileAlta-1.1
mobileAlta-1.2
mobileFusionFx-1.0
mobileFusionFx-1.1

図4-43は、異なるスキンを使用して同じアプリケーション画面のレンダリングを示すことによって、mobileAltaスキン・ファミリとmobileFusionFxスキン・ファミリのルック・アンド・フィールの違いを示しています。

図4-43 mobileAltaとmobileFusionFxのルック・アンド・フィールの比較

図4-45は、これらのスキンのファミリとバージョンの継承関係を示しています。

図4-44 MAFのスキン・ファミリの継承関係

モバイル・アプリケーションの最初のデプロイ後に作成されるwww\cssディレクトリには、これらのCSSファイルが格納されます。このディレクトリにアクセスするには、モバイル・アプリケーションをシミュレータまたはデバイスにデプロイし、deployディレクトリ(例、C:\JDeveloper\mywork\app_name\deploy)に移動します。www\cssディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリはtemporary_xcode_projectディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(.apk)ファイルのassetsディレクトリ内にあります。

注意:

MAF DOM構造に依存するスタイルを記述しないでください。また、これらのファイル内で定義されている一部のセレクタは、サポートされていない場合があります。

maf-config.xmlファイル(第4.12.1項「maf-config.xmlファイルについて」を参照)とmaf-skins.xmlファイル(第4.12.2項「maf-skins.xmlファイルについて」を参照)を使用して、モバイル・アプリケーションのスキニングを制御します。maf-config.xmlファイルでは、アプリケーション・コンポーネントのレンダリングに使用するデフォルトのスキン・ファミリを指定し、maf-skins.xmlファイルでは、デフォルトのスキン・ファミリをカスタマイズしたり、新しいスキン・ファミリを定義することができます。

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

モバイル・アプリケーションを作成すると、JDeveloperによって、maf-config.xmlファイルがモバイル・アプリケーションのMETA-INFノードに移入されます。このファイル自体には、ベースMAFスキン・ファミリであるmobileAltaが移入されます(例4-20を参照)。

例4-20 maf-config.xmlファイルに移入されたデフォルト・スキン(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.2</skin-version>
<generic-type>
<conversion>
<validated>false</validated>
</conversion>
</generic-type>
</adfmf-config>

注意:

EL式を使用して実行時にスキンの値を決定できます。詳細は、第4.12.11項「実行時での動的スキン選択の有効化」を参照してください。

MAFでは階層としてスキンが適用されます。最上位にはデバイス固有のスキン、その後にプラットフォーム固有のスキン、ベース・スキンmobileAltaと続きます。MAFのmobileAltaスキン・ファミリの場合、この階層は次のように表されます。

1. mobileAlta.<DeviceModel> (例: mobileAlta.iPhone5,3)

2. mobileAlta.iOSまたはmobileAlta.Android

3. mobileAlta

図4-45は、実行時にMAFでスキンのこの階層が適用される様子をイラストレーションで示しています。SkinningDemoサンプル・アプリケーション(付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照)は、この実装を示しています。

MAFでは、この階層のデバイス固有のレベルで定義されたセレクタを優先します。つまり、MAFでは、mobileAlta.iOSで定義されたセレクタを、mobileAlta.iPhoneで定義された同じセレクタで上書きします。<extends>要素(第4.12.2項「maf-skins.xmlファイルについて」を参照)によって、この階層がMAFランタイム用に定義されます。様々なレベルでのスキンの適用方法の詳細は、第4.12.9項「スキニングに関する必知事項」を参照してください。

図4-45 実行時のMAFのスキン階層の適用

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

アプリケーション・コントローラ・プロジェクトのMETA-INFノードにあるmaf-skins.xmlファイルによって、既存のスキンを拡張して新しいスキンを定義したり、既存のスキンに新しいスタイル・シートを追加することができます。

デフォルトでは、このファイルは空ですが、表4-9に示されている要素によって子要素を記述します。これらの子要素をこのファイルに移入することで、mobileAltaを拡張したり、アプリケーションで使用できるCSSファイルを定義できます。新しいスキンを作成したり、既存のスキンを拡張するには、<skin>要素を使用します。

表4-9 <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.2</extends>
<style-sheet-name>styles/myskin.css</style-sheet-name>
<version>
<name>v1</name>
</version>
</skin>

<style-sheet-name>

モバイル・アプリケーションのプロジェクト内のCSSファイルの場所を指定するには、相対URLを使用します。たとえば、SkinningDemoサンプル・アプリケーションのmaf-skins.xmlファイルには、アプリケーション・コントローラ・プロジェクトのcssディレクトリのv1.cssスタイルシートへの次の参照が含まれます。

<style-sheet-name>css/v1.css</style-sheet-name>

<version>

スキンの異なるバージョンを指定します。詳細は、第4.12.6項「MAFスキンのバージョニング方法」を参照してください。

表4-10に、スタイルシートを既存のスキンに統合する場合に、MAF CSS内で<skin-addition>要素を定義するために使用できる要素を示しています。

表4-10 <skin-addition>の子要素

の要素を示しています。" title="<skin-addition>の子要素" width="100%">

要素

説明

<skin-id>

スタイルシートをさらに追加する必要があるスキンのIDを指定します。指定可能な値には、MAFによって提供されるスキン(たとえば、mobileAlta-v1.2.iOS)またはユーザーによって作成されるカスタム・スキンなどがあります。

<style-sheet-name>

モバイル・アプリケーションのプロジェクト内のCSSファイルの場所を指定するには、相対URLを使用します。たとえば、SkinningDemoサンプル・アプリケーションのmaf-skins.xmlファイルには、アプリケーション・コントローラ・プロジェクトのcssディレクトリのv1.cssスタイルシートへの次の参照が含まれます。

<style-sheet-name>css/v1.css</style-sheet-name>

例4-21では、<style-sheet-name>要素でCSSファイルの場所を、<skin-id>でターゲット・スキン・ファミリを指定しています。

例4-21 <skin-addition>要素の使用

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-addition>
<skin-id>mobileAlta-v1.2.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デバイスにレンダリングしたり、これらの要素を定義してすべてのデバイスのプラットフォームに対するスタイルを処理することもできます。表4-11に、iOSプラットフォームに属するすべてのデバイス、および特定のiOSデバイス・タイプ(タブレット、電話、シミュレータ)をターゲットにするこれらの要素の使用例を示します。

ヒント:

デバイス・モデルの情報を取得するには、DeviceDemoサンプル・アプリケーション(付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照)の使用を検討してください。

表4-11 プラットフォームおよびデバイス固有のスタイル

デバイス

例

iPhone

<skin-addition>
<skin-id>mobileAlta-v1.2.iPhone5,1</skin-id>
<style-sheet-name>iPhoneStylesheet.css</style-sheet-name>
</skin-addition>

iPad

<skin-addition>
<skin-id>mobileAlta-v1.2.iPad4,2</skin-id>
<style-sheet-name>iPadStylesheet.css</style-sheet-name>
</skin-addition>

iPhoneシミュレータ

<skin-addition>
<skin-id>mobileAlta-v1.2.iPhone Simulator x86_64</skin-id>
<style-sheet-name>iPhoneSimStylesheet.css</style-sheet-name>
</skin-addition>

すべてのiOSデバイス

<skin-addition>
<skin-id>mobileAlta-v1.2.iOS</skin-id>
<style-sheet-name>iOSSimStylesheet.css</style-sheet-name>
</skin-addition>

4.12.3 アプリケーションへのカスタム・スキンの追加方法

アプリケーションにカスタム・スキンを追加するには、JDeveloper内にCSSファイルを作成します。CSSはアプリケーションとともにデプロイするために、JDeveloperによりプロジェクトのソース・ファイルに配置されます。

カスタム・スキンをアプリケーションに追加する手順:

1. 「アプリケーション」ウィンドウで、ApplicationControllerプロジェクトを右クリックして、「新規」→「CSSファイル」を選択します。

2. 「Cascading Style Sheetの作成」ダイアログで、CSSファイルの名前およびディレクトリを指定します。

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

これで、CSSエディタにCSSを開いて、アプリケーションのスタイルを定義できます。

4.12.4 アプリケーションが使用するスキンの指定方法

maf-config.xmlファイルで値を構成して、アプリケーションで使用するスキンを決定します。

使用するアプリケーションのスキンを指定するには:

1. 「アプリケーション」ウィンドウで、maf-config.xmlファイルをダブルクリックします。デフォルトでは、これは、「アプリケーション・リソース」ペインの「ディスクリプタ」および「ADF META-INF」ノードの下にあります。

2. maf-config.xmlファイルで、使用するスキンの<skin-family>要素、および<skin-version>要素(オプション)の値を指定します。
例4-22は、モバイル・アプリケーションでmobileAlta.v1.2スキンを使用するために必要な構成を示しています。

例4-22 アプリケーションのスキンを指定する構成

<adfmf-config xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin-family>mobileAlta</skin-family>
<skin-version>v1.2</skin-version>
</adfmf-config>

注意:

アプリケーションが実行時に使用するスキンを動的に選択する場合、EL式を<skin-family>要素の値として設定します。詳細は、第4.12.11項「実行時での動的スキン選択の有効化」を参照してください。

4.12.5 カスタム・スキンの登録方法

maf-skins.xmlファイルにカスタム・スキンを識別するプロパティ値を追加することで、ユーザーのアプリケーションにカスタム・スキンを登録します。

カスタム・スキンを登録する手順:

1. 「アプリケーション」ウィンドウで、「ApplicationController」→「アプリケーション・ソース」→「META-INF」を開き、「maf-skins.xml」をダブルクリックします。

2. 「構造」ウィンドウで、「adfmf-skins」ノードを右クリックし、「adfmf-skinsの中に挿入」→「skin」を選択します。

3. 「skinの挿入」ダイアログで、次のようにフィールドに入力します。

- ファミリ: スキンのファミリ名の値を入力します。
新しい名前を入力するか、既存のファミリ名を指定できます。既存のファミリ名を指定する場合、ファミリの値が同じスキンを区別するためにスキンのバージョニングが必要です(第4.12.6項「MAFスキンのバージョニング方法」を参照)。

入力する値は、作成するスキンを登録するmaf-skins.xmlの<family>要素の値として設定されます。アプリケーションのmaf-config.xmlの<skin-family>要素では、実行時にこの値を使用してアプリケーションで使用されるスキンを識別します。

- ID: skinFamily-versionまたはskinFamily-version.platformのいずれかの名前書式を使用してスキンのIDを入力します。たとえば、mySkinFamily-v1.2.androidです。

- 拡張対象: 拡張する親スキンの名前を入力します。たとえば、カスタム・スキンでmobileAlta-v1.2スキンを拡張する場合は、mobileAlta-v1.2と入力します。

- スタイルシート名: スタイルシートの名前を入力または選択します。

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

4.12.6 MAFスキンのバージョニング方法

<version>要素を使用して、maf-skins.xmlファイルでスキンのバージョン番号を指定できます。maf-skins.xmlファイル内の<family>要素の値が同じスキンを区別する場合はこのオプション機能を使用します。この機能は、いくつかの既存の動作を変更するために既存のスキンの新規バージョンを作成する場合に役立ちます。特定のスキンを使用するようにアプリケーションを構成する場合は、第4.12.4項「アプリケーションが使用するスキンの指定方法」で説明されているように、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.12.4項「アプリケーションが使用するスキンの指定方法」を参照)。

4. 名前フィールドに値を入力します。たとえば、スキンの最初のバージョンである場合はv1と入力します。

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

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

スキン用に構成するバージョン情報は、実行時にアプリケーションでスキンが適用されるときに、プラットフォーム値およびデバイス値より優先されます。実行時に、モバイル・アプリケーションでは、プラットフォーム固有のスキンが適用される前にデバイス固有のスキンが適用されます。スキンのバージョン情報が指定されている場合、アプリケーションでは最初に、指定したスキンのバージョン値と一致するスキンを検索します。スキン・バージョン値およびデバイス値と一致するスキンが見つかると、アプリケーションではこのスキンが適用されます。指定したスキン・バージョンのスキンがデバイス固有のスキン内で見つからなかった場合、アプリケーションでは指定したバージョンのスキンをプラットフォーム固有のスキン内で検索します。使用可能なプラットフォーム固有のスキン内で、指定したバージョンと一致するスキンが見つからない場合、アプリケーションではベース・スキンを検索します。

例4-23は、3つのスキン(customFamily-v1.iphone5,3、customFamily-v2.iPhoneおよびcustomFamily-v3.iPhone)を参照するmaf-skins.xmlの例を示しています。これらの各スキンの<family>要素は同じ値(customFamily)になっています。<version>要素の子要素の値によって、これらのスキンがそれぞれ区別されます。

実行時に、アプリケーションのmaf-config.xmlファイルにおける<skin-family>要素の値としてcustomFamilyが指定されたアプリケーションでは、customFamily-v1.iphone5,3を使用します。これは、このスキンがmaf-skins.xmlファイルでデフォルト・スキンとして構成されているためです(<default>true</default>)。この動作は、第4.12.4項「アプリケーションが使用するスキンの指定方法」で説明されているように、maf-config.xmlファイル内の<skin-version>要素に値を指定してオーバーライドできます。たとえば、maf-config.xmlファイル内の<skin-version>要素の値としてv2を指定した場合、アプリケーションはmaf-skins.xmlファイル内でデフォルトとして定義されているcustomFamily-v1.iphone5,3のかわりにcustomFamily-v2.iPhoneを使用します。

(maf-config.xmlファイル内の<skin-version>要素を使用して)取得するスキンのバージョンを指定しない場合、アプリケーションはmaf-skins.xmlファイル内の<default>true</default>要素を使用してデフォルトとして定義されているスキンを使用します。デフォルトのスキンを指定しない場合、アプリケーションはmaf-skins.xmlファイル内で定義される最後のスキンを使用します。例4-23において、定義される最後のスキンはcustomFamily-v3.iPhoneです。

例4-23 バージョニングされたスキン・ファイルが含まれたmaf-skins.xmlファイル

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skin">
<skin id="s1">
<family>customFamily</family>
<id>customFamily-v1.iphone5,3</id>
<extends>customFamily-v1.iOS</extends>
<style-sheet-name>iphone.css</style-sheet-name>
<version>
<default>true</default>
<name>v1</name>
</version>
</skin>
<skin id="s2">
<family>customFamily</family>
<id>customFamily-v2.iPhone</id>
<extends>customFamily-v1.iOS</extends>
<style-sheet-name>iphone-v2.css</style-sheet-name>
<version>
<name>v2</name>
</version>
</skin>
<skin id="s3">
<family>customFamily</family>
<id>customFamily-v3.iPhone</id>
<extends>customFamily-v1.iOS</extends>
<style-sheet-name>iphone-v3.css</style-sheet-name>
<version>
<name>v3</name>
</version>
</skin>
</adfmf-skins>

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

MAF AMXアプリケーションでは、MAF AMXとして実装されたアプリケーション機能に対して特定のスタイルを指定し、それによって、maf-config.xmlおよびmaf-skins.xmlファイル内のアプリケーション・レベルで設定されているデフォルトのスキン・スタイルをオーバーライドできます。アプリケーション機能に個別のスタイルを追加するには、CSSファイルを包含ファイルとして使用します。

4.12.8.1 アプリケーション機能に新しいスタイル・クラスを適用する方法

maf-feature.xmlファイルの概要エディタの「包含」表では、MAF AMXアプリケーション機能にCSSを追加できます。

図4-46 「包含」表

始める前に

第5.2項「タスク・フローの作成」の説明に従って、MAFタスク・フローを作成します。スキンのCSSファイルを作成または追加します。ビュー・コントローラ・プロジェクトを選択し、「新規」→「CSSファイル」を選択してCSSファイルを作成できます。または、次のようにCSSファイルをJARファイルにパッケージ化することもできます。

1. メイン・メニューから「アプリケーション」→「プロジェクト・プロパティ」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」ページを選択し、「JAR/ディレクトリの追加」をクリックします。

3. 「アーカイブまたはディレクトリの追加」ダイアログで、インポートするADFスキンが含まれているJARファイルに移動し、「選択」をクリックします。
JARファイルが「クラスパス・エントリ」リストに表示されます。

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

アプリケーション機能にスタイルを追加するには:

1. 「追加」をクリックして、「包含」表に新しい行を作成します。

2. 「タイプ」列のドロップダウン・メニューから、「スタイルシート」を選択します(図4-47を参照)。

図4-47 「スタイルシート」オプションの選択

3. 「ファイル」列で、「編集」を選択します(図4-47を参照)。

4. 「プロパティの編集」ダイアログでCSSを選択して(図4-48を参照)、「OK」をクリックします。

注意:

.cssファイルは、ビュー・コントローラ・プロジェクト内に配置する必要があり、アプリケーション・コントローラ・プロジェクト内に配置されている.cssファイルを含めることはできません。

図4-48 アプリケーション機能のCSSの選択

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

CSS (またはJavaScriptファイル)を「包含」表に追加すると、MAF AMXエディタの「プレビュー」ペインにある機能コンテンツのドロップダウン・メニュー(図4-49を参照)からアプリケーション機能を選択することで、アプリケーション機能に追加されたCSSページを、MAF AMXページに適用できます。

図4-49 機能コンテンツのドロップダウン・メニュー

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

maf-skins.xmlファイルで定義されるCSSファイル(例4-24を参照)は、Apple iPhoneとiPadの異なる表示要件に適応するようにスキンを拡張する方法を示します。これらのスタイルは降順に適用されます。SkinningDemoサンプル・アプリケーションでは、アプリケーションを異なるデバイスにデプロイするときに、カスタマイズされたスタイルを適用できるようにする方法のデモが提供されています。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

たとえば、iOSレベルでは、スタイルシート(例4-24のmobileAlta)がiPhoneまたはiPadのどちらにも適用されます。デバイス固有のスタイル用には、iPhoneおよびiPadのスキンに対して<skin-id>要素を定義します。スキニングのデモ・アプリケーションでは、この要素によって定義されたカスタム・スキンの使用方法が示されています。

例4-24 maf-skins.xmlファイルで定義されるスキニング・レベル

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skins">
<skin>
<id>mobileAlta-v1.2.iPhone</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.2.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.2.iphone.css</style-sheet-name>
</skin>
<skin>
<id>mobileAlta-v1.2.iPad</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.2.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.2.ipad.css</style-sheet-name>
</skin>
<skin>
<id>mobileAlta-v1.2.iPod</id>
<family>mobileAlta</family>
<extends>mobileAlta-v1.2.iOS</extends>
<style-sheet-name>skins/mobileAlta-v1.2.ipod.css</style-sheet-name>
</skin>
<!--  Skin Additions -->
<skin-addition>
<skin-id>mobileAlta-v1.2.iPhone</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.2.iPhone</skin-id>
<style-sheet-name>skins/mystyles.iphone.addition2.css</style-sheet-name>
</skin-addition>
<skin-addition>
<skin-id>mobileAlta-v1.2.iOS</skin-id>
<style-sheet-name>skins/mystyles.ios.addition2.css</style-sheet-name>
</skin-addition>
</adfmf-skins>

4.12.10 新しいスタイル・シートをスキンに追加する方法

スキンを拡張するかわりに、CSSファイルを既存のスキンに追加できます。

新しいスタイルシートをスキンに追加するには:

1. 「コンポーネント」ウィンドウから「構造」ウィンドウに、<skin-addition>要素をドラッグ・アンド・ドロップします。

2. 「skin-additionの挿入」ダイアログ(図4-50を参照)に入力を行うことで、表4-10で説明した要素を<skin-addition>要素に移入します。

- 新しいスタイルを追加するスキンの識別子を入力します。

- CSSファイルの場所を取得します。

図4-50 「skin-additionの挿入」ダイアログ

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

注意:

DOM変更構造を使用するカスタム・スタイルを作成すると、モバイル・アプリケーションがハングする可能性があります。特に、displayプロパティでは、MAF AMXから変換されたHTMLでレンダリングに問題が発生します。このプロパティは、table、table-row、table-cellなどの値を使用してコンポーネントを表に変換しており、適切な親の表オブジェクト内に含まれていない表関連の構造が作成される可能性があります。この問題はアプリケーションのユーザー・インタフェース自体には表示されないことがありますが、ロギング・コンソールではSignal 10の例外によってレポートされます。

4.12.11 実行時での動的スキン選択の有効化

エンド・ユーザーが実行時に他のスキンを選択できるように、アプリケーションを構成できます。エンド・ユーザーが必要により適したスキンを使用して、アプリケーションをレンダリングできるようにする場合に、この機能を構成します。

図4-51では、ボタンを表示して、エンド・ユーザーが実行時にアプリケーションで使用されるスキンを変更できるようにすることで、この機能をどのように実装するかを示しています。ページ上のボタンを構成して、後からアプリケーションのmaf-config.xmlファイルのskin-familyプロパティにより評価されるscope値を設定します。

図4-51 実行時におけるアプリケーションのスキンの変更(iOSの場合)

4.12.11.1 エンド・ユーザーが実行時にアプリケーションのスキンを変更できるようにする方法

アプリケーションのmaf-config.xmlファイルのskin-familyプロパティの値の更新を可能にするコンポーネントを公開することにより、エンド・ユーザーがアプリケーションのスキンを変更できるようにします。

エンド・ユーザーが実行時にアプリケーションのスキンを変更できるようにするには:

1. maf-config.xmlファイルでスキン・ファミリ・プロパティを設定するために使用するコンポーネントを構成するページを開きます。

2. エンド・ユーザーが実行時に多数の使用可能なスキンの1つを選択できるようにする多数のコンポーネント(ボタン・コンポーネントなど)を構成します(図4-51を参照)。
例4-25は、図4-51のように、エンド・ユーザーが実行時に使用可能なスキンを選択できるようにするamx:commandButtonコンポーネントの構成方法を示しています。各amx:commandButtonコンポーネントにより、actionListener属性の値を指定します。エンド・ユーザーがボタンをクリックすると、この属性でactionEventがskinsというマネージドBean上のメソッド(skinMenuAction)に渡されます。

例4-25 コンポーネントを使用したスキン・ファミリの設定

...
<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を記述します。例4-26は、エンド・ユーザーが選択した値をとり、それをマネージドBean内のskinFamilyの値の設定に使用するメソッドを示しています。例4-26は、新しいスキンを使用するためにアプリケーションのすべての機能をリセットするメソッドも示しています。

例4-26 アプリケーションのスキンを変更するためのマネージド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());
}
}
}

4. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」パネルを開き、「ディスクリプタ」→「ADF Meta-INF」ノードを開き、maf.config.xmlファイルをダブルクリックします。

5. maf-config.xmlファイルで、EL式を記述してスキン・ファミリを動的に評価します。
<skin-family>#{applicationScope.SkinBean.skinFamily}</skin-family>

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

実行時に、エンド・ユーザーは公開されたコンポーネントを使用して、別のスキンを選択します。例4-25では、これは多数のamx:commandButtonコンポーネントの1つです。このコンポーネントは、エンド・ユーザーが選択した値をマネージドBeanに発行し、次にこれがマネージドBeanのプロパティ(skinFamily)の値を設定します。実行時に、maf-config.xmlファイルの<skin-family>プロパティでは、EL式を使用してマネージドBeanから値を読み取ります。また、例4-26のマネージドBeanは、新しく指定したスキンを使用するアプリケーションに機能を再ロードします。

ヒント:

<skin-family>プロパティと同様に、EL式を使用して、実行時にmaf-config.xmlファイルの<skin-version>プロパティの値を設定できます。

アプリケーションの機能を個別にリセットして新しいスキンをロードするかわりに、次のクラスからresetApplicationメソッドを起動することもできます(例4-26を参照)。

oracle.adfmf.framework.api.AdfmfContainerUtilities

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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

maf-application.xmlファイルは、少なくとも1つのアプリケーション機能を参照します。これらのアプリケーション機能は、機能アーカイブ・ファイル(FAR)と呼ばれるJARファイルにパッケージ化されると、他のモバイル・アプリケーションが使用できる再利用可能なコンテンツを提供します。FARは本質的に、アイコンのイメージ、リソース・バンドル、HTMLファイル、JavaScriptファイル、その他の実装固有のファイルなど、アプリケーション機能が必要とするすべてのものを格納した自己完結型のコレクションです。第19.5項「機能アーカイブ・ファイル(FAR)のデプロイ」で説明するように、FARのコンテンツには1つのmaf-feature.xmlファイルが含まれます。このファイルでは、パッケージ化された各アプリケーション機能が一意のIDによって識別されます。このファイルを編集することで(第4.8項「モバイル・アプリケーション機能の構成ファイルについて」を参照)、コンテンツ実装(MAF AMX、ローカルHTML、リモートURL)などの機能プロパティを更新し、ユーザー・ロールや権限またはデバイス・プロパティなどのファクタに基づいて表示できます。モバイル・アプリケーションでは、1つまたは複数のFARを参照することも、何も参照しないようにすることもできます。

FARをアプリケーション・ライブラリまたはビュー・コントローラ・プロジェクトとして追加できます。FARのコンテンツをプロジェクト・ライブラリとして追加する場合、FARのコンテンツをカスタマイズすることも、その個別のアーティファクトを再利用することもできません。FARがライブラリ・ファイルとして追加される場合、モバイル・アプリケーションではFAR全体が使用されます。たとえば、FARのタスク・フローは、タスク・フロー・コール・アクティビティのターゲットにすることはできません。ただし、FARをビュー・コントローラ・プロジェクトとして追加すると、そのアーティファクトをカスタマイズできるようになります(第4.14項「Oracle Metadata Servicesを使用したMAFファイルのカスタマイズ」を参照)。

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

アプリケーション機能を、それを使用するアプリケーションのクラスパスに追加することで、モバイル・アプリケーションで使用できるようにします。

注意:

FARは、アプリケーション・コントローラ・プロジェクトにのみ追加でき、ビュー・コントローラ・プロジェクトにFARを追加することはできません。

始める前に

アプリケーション機能を機能アーカイブ・ファイルとしてデプロイします(第19.5.2項「機能アーカイブのデプロイメント・プロファイルのデプロイ方法」を参照)。

アプリケーション機能コンテンツをライブラリとしてモバイル・アプリケーションに追加するには:

1. 「リソース」ウィンドウを開き、「新規」→「IDE接続」を選択して、「ファイルシステム」を選択します。

2. 「ファイルシステム接続」ダイアログに入力し、機能アーカイブJARファイルを格納するディレクトリへのファイル接続を作成します。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

3. 「リソース」ウィンドウで、機能アーカイブ・ファイル(JARファイルとして示されている)を右クリックします。

4. 「名前を付けてアプリケーションに追加」を選択して、「ライブラリ」を選択し、これを使用するアプリケーションのクラスパスを追加します(図4-52を参照)。

図4-52 ライブラリとしてのFARのモバイル・アプリケーションへの追加

ヒント:

使用するアプリケーションのクラスパスから機能アーカイブJARを削除するには、「ライブラリをアプリケーションから削除」を選択します。

FARをビュー・コントローラ・プロジェクトとして追加するには:

1. 「リソース」ウィンドウを開き、「新規」→「IDE接続」を選択して、「ファイルシステム」を選択します。

2. 「ファイルシステム接続」ダイアログに入力し、機能アーカイブJARファイルを格納するディレクトリへのファイル接続を作成します。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

3. 「リソース」ウィンドウで、機能アーカイブ・ファイル(JARファイルとして示されている)を右クリックします。

4. 「名前を付けてアプリケーションに追加」を選択して、「ViewControllerプロジェクト」を選択します(図4-53を参照)。

図4-53 ビュー・コントローラ・プロジェクトとしてのFARのモバイル・アプリケーションへの追加

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

FARをライブラリとして(または手動でアプリケーションのクラスパスに)追加した場合:

- FARのコンテンツが、「アプリケーション・リソース」の「ライブラリ」ノードの下に表示されます(図4-54を参照)。

図4-54 使用するアプリケーションの「アプリケーション・リソース」に表示されるFAR JARファイル

- JARに含まれるmaf-feature.xmlファイルで宣言されたすべてのアプリケーション機能は、図4-55に示すように、アプリケーションで使用できるようになります。この図のドロップダウンには、AcmeFAR.jarに属している使用可能なアプリケーション機能のID (HCM、PROD、Customers)と、アプリケーション(StockTrackerFAR.jar)に追加された別の機能アーカイブ内で定義されているPortfolioというIDが表示されています。第4.6.1項「モバイル・アプリケーションのコンテンツの指定方法」も参照してください。

図4-55 様々なmaf-feature.xmlファイルで定義されたアプリケーション機能の参照

ヒント:

機能アーカイブJARをアプリケーションのクラスパスに手動で追加すると、アプリケーション機能が機能参照の挿入ダイアログにも表示されるようになります。

または、次のように「リソース」ウィンドウからアプリケーション機能を追加したり、削除することもできます。

1. 「リソース」ウィンドウで、機能アーカイブJARを開きます。

2. 「MAF機能」フォルダから、アプリケーション機能を右クリックします。

3. 「機能参照をmaf-application.xmlに追加」(図4-56を参照)、または「機能参照をmaf-application.xmlから削除」(図4-57を参照)を選択します。図4-56に、インポートしたFARであるacmeFAR.jarからのCustomerというアプリケーション機能の追加を示しています。

図4-56 機能参照の追加

図4-57に、maf-application.xmlファイルからのcustomers機能参照(最初にインポートしたFARであるacmeFAR.jarから追加されている)の削除を示しています。

図4-57 機能参照の削除

- 機能アーカイブJARにあるconnections.xmlファイル内の情報は、使用するアプリケーションのconnections.xmlファイルにマージされます。図4-58に示す「ログ」ウィンドウには、名前の競合が表示されています。

注意:

使用するアプリケーションで接続が有効であることを確認する必要があります。

図4-58 接続での名前の競合を示すメッセージ・ログ・ウィンドウ

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

FARをビュー・コントローラ・プロジェクトとして追加する場合:

- MAFは、インポートしたFARと同じ名前のビュー・コントローラ・プロジェクトを生成します。図4-59は、MAFで、StockTracker(図4-53のStockTrackerFAR.jarを参照)というインポートしたFARファイルに対してビュー・コントローラ・プロジェクト(.jprファイル)を作成する方法を示しています。このビュー・コントローラ・プロジェクトには、MAFビュー・コントローラ・プロジェクトのデフォルト構造およびメタデータ・ファイルが含まれます(第3.2.2.2項「ビュー・コントローラ・プロジェクトのリソースについて」を参照)。特に、FARビュー・コントローラ・プロジェクトには、maf-feature.xmlファイルが含まれます。MAFアプリケーションに他のビュー・コントローラ・プロジェクトが含まれている場合、いずれのプロジェクトにもIDが同じアプリケーション機能が含まれていないことを確認する必要があります。第4.13.4項「機能アーカイブ・リソースの再使用の有効化に関する必知事項」も参照してください。

図4-59 モバイル・アプリケーション内のビュー・コントローラ・プロジェクトとしてインポートした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に含まれる元のリソース・バンドルは、生成されたビュー・コントローラ・プロジェクトでは使用できない可能性があるため、このプロジェクト内に新しいリソース・バンドルを作成する必要があります(第4.14.6.1項「リソース・バンドルでカスタマイズを有効化する方法」を参照)。

- ライブラリとしてインポートしたFARと同様に、FARのmaf-feature.xmlファイル内で宣言されたすべてのアプリケーション機能は、使用するアプリケーションで使用できるようになります。

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

FARのリソースをアプリケーションで使用可能にするためには、FARの名前とその機能参照IDが両方ともグローバルに一意である必要があるため、maf-application.xmlファイル内に機能参照IDの重複がないことを確認してください。FARの内部では、DataControl.dcxファイルが一意のパッケージ・ディレクトリ内に存在する必要があります。これらのパッケージ・ディレクトリのデフォルト名をそのまま使用するのではなく、プロジェクト用に一意のパッケージ階層を作成する必要があります。さらに機能参照IDについても、同じようなパッケージ・ネーミング・システムを使用する必要があります。

4.14 Oracle Metadata Servicesを使用したMAFファイルのカスタマイズ

Oracle Metadata Services (MDS)を使用すると、実行時にアプリケーションの再ブランディング、カスタマイズおよびパーソナライズを行うことができます。MDSでは、単一のアプリケーションを様々な産業、場所またはユーザー・グループに適応させることができます。後者の場合、たとえば、MDSを使用して、ユーザー・グループまたはユーザー職責にあわせてルック・アンド・フィールを調整できます。

カスタマイズしたアプリケーションは、ベース・アプリケーションとカスタマイズの1つ以上のレイヤーで構成されます。1つのアプリケーションで複数のカスタマイズ・レイヤーを使用でき、各レイヤーでは複数のレイヤー値を使用できます。これらのレイヤー値を、指定の優先順位に従ってベース・メタデータの最上位に適用できます。MDSでは、これらのカスタマイズをMDSリポジトリに格納し、実行時に取得します。MDSは、作成されたカスタマイズを別のMDSリポジトリに保存するため、ベース・アプリケーションは変更されません。メタデータ・サービス・リポジトリの構成の詳細は、『Oracle Fusion Middleware管理者ガイド』のOracle Metadata Repositoryの管理に関する項を参照してください。

MDSでは、次の2つのカスタマイズ・パターンを使用できます。

- シード・カスタマイズ: シード・カスタマイズとは、実行時に適用されるカスタマイズ・レイヤーを定義して、汎用アプリケーションを特定のグループ(特定の産業やサイトなど)に適応させます。これらのシード・カスタマイズはデプロイされたアプリケーションの一部として存在し、特定のデプロイの存続期間中保持されます。

- ユーザー・カスタマイズ(変更永続性): エンド・ユーザーは実行時に個々のプリファレンス(表にどの列を表示するかなどの選択が可能)にあわせてアプリケーションのコンテンツをパーソナライズできます。これらの変更はユーザーのセッション間で保持され、ユーザーがアプリケーションにアクセスするたびに一貫して表示されます。

MDSフレームワークを使用して、モバイル・アプリケーションの次のアーティファクトをカスタマイズできます。

- maf-feature.xmlファイル

- maf-skins.xmlファイル

- maf-application.xmlファイル

- maf-config.xmlファイル

- MAF AMXファイルおよびメタデータ・ファイル(第11章「MAF AMXアプリケーション機能アーティファクトのカスタマイズ」を参照)

MDSフレームワークを使用してアプリケーションをカスタマイズするには、次のタスクを実行します。

1. カスタマイズ・レイヤーの作成: 1つ以上のグローバルまたはアプリケーション固有のカスタマイズ・レイヤーを作成します。詳細は、第4.14.1項「カスタマイズ・レイヤーの作成方法」を参照してください。

2. カスタマイズ・クラスの作成: MDSでは、カスタマイズ・クラスを使用して、ベース・アプリケーションに適用するカスタマイズを決定します。各カスタマイズ・クラスは、ベース・カスタマイズ・レイヤーを定義します。カスタマイズする予定のモバイル・アプリケーションではこのファイルを作成しないでください。詳細は、第4.14.2項「カスタマイズ・クラスの作成方法」を参照してください。

3. カスタマイズにアクセスするためのデザインタイムの有効化: 次のタスクを実行します。

1. カスタマイズ・クラス(.javaファイル)をJARファイルとしてパッケージ化します。

2. JARファイルをモバイル・アプリケーションのいずれかのプロジェクトに追加します。
詳細は、第4.14.3項「カスタマイズ・クラスにアクセスするためのデザインタイムの有効化方法」を参照してください。

4. adf-config.xmlファイルのcust-configセクションへのカスタマイズ・クラスの追加: 優先順位に従ってカスタマイズ・クラスを登録します。

5. 「カスタマイズ開発者」ロールでのJDeveloperの起動(またはこのロールへの切替え): 詳細は、Oracle Fusion Middleware Oracle Jdeveloperによるアプリケーションの開発のJDeveloperロールの操作に関する項を参照してください。

注意:

「カスタマイズ開発者」ロールを使用して既存のファイルをカスタマイズできますが、新しいファイルを作成することはできません。

6. 「カスタマイズ・コンテキスト」ウィンドウからカスタマイズ・レイヤーを選択します(図4-60を参照)。

図4-60 カスタマイズ・レイヤーの選択(ヒント・レイヤー)

注意:

「カスタマイズ開発者」ロールで作業する際、「カスタマイズ・コンテキスト」ウィンドウで選択したレイヤーとレイヤー値をヒント・レイヤーと呼びます。「カスタマイズ開発者」ロールで作業中に行った変更は、このレイヤーにのみ適用されます。

7. デバイス、エミュレータへのアプリケーションのデプロイ、またはプラットフォーム固有のアプリケーション・パッケージとしてのアプリケーションのデプロイ: カスタマイズしたアプリケーションをデプロイするには、「カスタマイズ開発者」ロールを使用する必要があります。「カスタマイズ開発者」ロールでデプロイするには、次の手順を実行します。

1. 「カスタマイズ開発者」ロールで、アプリケーションを起動します。

2. 「カスタマイズ・コンテキスト」ウィンドウ(図4-60)で、カスタマイズを実装するレイヤーと値を選択します。

3. デプロイメント・オプションから選択します(「アプリケーション」→「デプロイ」を選択し、デプロイメント・プロファイルを選択してアクセスします)。詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

4. 各カスタマイズ・コンテキストに対して別のデプロイメントを実行します。

デプロイメント時に、ベース・ファイルおよびデルタ・ファイルがマージされ、実行時のアプリケーションのカスタマイズ・バージョンが作成されます。デプロイされたアプリケーションには、MDSの依存性はありません。

ヒント:

カスタマイズしたアプリケーションをMAFアプリケーション・アーカイブ(.maa)ファイルとしてデプロイして、このファイルをアプリケーションにインポートし、別のカスタマイズを実行したり、アップグレードすることもできます。.maaファイルに含まれるデルタ・ファイルは、デプロイメント後にベース・ファイルとマージされます。詳細は、第4.14.7項「カスタマイズを使用したモバイル・アプリケーションのアップグレード」を参照してください。

4.14.1 カスタマイズ・レイヤーの作成方法

カスタマイズには、グローバル(JDeveloperのインスタンス全体で使用可能)またはアプリケーション固有があります。JDeveloperでは、jdev_install/jdeveloper/jdev/CustomizationLayerValues.xmlにあるCustomizationLayerValues.xmlファイルにグローバル・カスタマイズが格納されます。デフォルトでは、このファイルは、site1およびsite2というレイヤー値でシードされます。これらは、<cust-layer-value>要素を使用して、次のように定義されます。

<cust-layers xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer id-prefix="s" name="site">
...
<cust-layer-value id-prefix="1" display-name="Site One" value="site1"/>
<cust-layer-value id-prefix="2" display-name="Site Two" value="site2"/>
...
<cust-layer-value display-name="Site" value="site"/>
</cust-layer>

このファイルで定義されたレイヤー値は、アプリケーション固有のCustomizationLayerValues.xmlファイルで定義されたレイヤー値で実行時にオーバーライドできます。

アプリケーション固有のCustomizationLayerValues.xmlファイルを作成するには:

1. 「アプリケーション」ウィンドウで、「アプリケーション・リソース」フォルダを開きます。

2. 「ADF-META INF」フォルダを開き、adf-config.xmlファイルを開きます。

3. 「概要エディタ」の「MDS」ページで、デザインタイム・カスタマイズ値の構成をクリックします。

4. CustomizationLayerValues.xmlファイルを開き、シードされたレイヤー値(Site OneおよびSite Two)を必要に応じて更新します。次に例を示します。

<cust-layers xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer name="site" id-prefix="s">
<!-- Generated id-prefix would be "s1" and "s2" for values
site1" and "site2"-->
<cust-layer-value value="headquarters" display-name="Headquarters"
id-prefix="1"/>
<cust-layer-value value="remoteoffices" display-name="Remote Offices"
id-prefix="2"/>
...

4.14.2 カスタマイズ・クラスの作成方法

カスタマイズする予定のモバイル・アプリケーションではこのファイルを作成しないでください。かわりに、カスタマイズ・クラスに対して別のJavaアプリケーションを作成します。Javaクラスの作成が完了した後で、カスタマイズするモバイル・アプリケーションにそのクラスをインポートします。

カスタマイズ・クラスを作成するには:

1. Javaアプリケーションを作成します。

2. 「ファイル」→「新規」→「プロジェクト」をクリックします。

3. 「新規ギャラリ」で、「Javaアプリケーション・プロジェクト」を選択します。ウィザードを完了します。

4. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックして、「プロジェクト・プロパティ」を選択します。

5. 「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」をクリックしてから「ライブラリの追加」を選択します。

6. 「ライブラリの追加」ダイアログで、MDSランタイムを選択し、「OK」をクリックします。「OK」をクリックして、「プロジェクト・プロパティ」ダイアログを閉じます。

7. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「新」→「Javaクラス」を選択します。

8. 「Javaクラスの作成」ダイアログで、クラスの名前およびパッケージを入力します。

9. 「拡張」フィールドで、クラス階層を参照し、oracle.mds.cust.CustomizationClassを取得します(図4-61を参照)。「OK」をクリックします。

注意:

「抽象メソッドの実装」(デフォルトの設定)を「Javaクラスの作成」ダイアログで選択する必要があります。

図4-61 カスタマイズ・クラスの作成

10. スタブ・ファイルを更新します。例4-27は、カスタマイズ・クラスを示しています。

例4-27 カスタマイズ・クラス

package mobile;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import oracle.mds.core.MetadataObject;
import oracle.mds.core.RestrictedSession;
import oracle.mds.cust.CacheHint;
import oracle.mds.cust.CustomizationClass;

public class SiteCC extends CustomizationClass {
private static final String DEFAULT_LAYER_NAME = "site";
private String mLayerName = DEFAULT_LAYER_NAME;
public SiteCC() {

}

public SiteCC (String layerName) {
mLayerName = layerName;
}
public CacheHint getCacheHint() {
return CacheHint.ALL_USERS;
}

public String getName() {

return mLayerName;
}

public String[] getValue(RestrictedSession restrictedSession, MetadataObject metadataObject)
{
// This needs to return te site value at runtime.
//For now, it's always null
Properties properties = new Properties();
String configuredValue = null;
Class clazz = SiteCC.class;
InputStream is  = clazz.getResourceAsStream("/customization.properties");

if (is != null){
try {
properties.load(is);
String propValue = properties.getProperty(mLayerName);
if (propValue != null){
configuredValue = propValue;
}
} catch (IOException e) {
e.printStackTrace();
}
}

return new String[] {configuredValue};
}
}

11. Javaアプリケーション・プロジェクトを再ビルドします。

4.14.3 カスタマイズ・クラスにアクセスするためのデザインタイムの有効化方法

最初に、カスタマイズ・クラスをJARファイルとしてパッケージ化し、このクラスをモバイル・アプリケーションに登録する必要があります。カスタマイズ・クラスおよび関連するアーティファクトをJARファイルにパッケージ化するには、「デプロイメント・プロファイルの作成」ウィザードを使用してデプロイメント・プロファイルを作成する必要があります。詳細は、第3.2.2.3項「自動的に生成されるデプロイメント・プロファイルについて」を参照してください。

JARにカスタマイズ・クラスを追加するには:

1. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「新」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「一般」を展開し、「デプロイメント・プロファイル」、「JARファイル」の順に選択して、「OK」をクリックします。

ヒント:

「カテゴリ」ツリーに「デプロイメント・プロファイル」ノードが表示されない場合、「すべての機能」タブをクリックします。

3. 「デプロイメント・プロファイルの作成」 -- 「JARファイル」ダイアログで、プロジェクト・デプロイメント・プロファイルの名前(図4-62のSiteCCなど)を入力して、「OK」をクリックします。

図4-62 カスタマイズ・クラスのデプロイメント・プロファイルの作成

4. 「JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「JARオプション」を選択します。

5. 必要に応じて、JARファイルの場所を入力します。または、デフォルトの場所を使用します。

6. ファイル・グループ→「プロジェクトの出力」→「フィルタ」を開き、JARに含むように選択できるファイルを一覧表示します。

7. 「フィルタ」ページの「ファイル」タブで、JARファイルに追加するカスタマイズ・クラスを選択します(図4-63を参照)。

図4-63 カスタマイズ・クラスをJARファイルに含める

8. 「OK」をクリックして、「JARデプロイメント・プロファイルのプロパティの編集」ダイアログを終了します。

9. 「OK」を再度クリックして、プロジェクト・プロパティのダイアログを終了します。

10. 「アプリケーション」ウィンドウで、「Javaアプリケーション・プロジェクト」を右クリックし、「デプロイメント・プロファイル」を選択します。「デプロイメント・アクション」ページ(図4-64を参照)では、「JARにデプロイ」がデフォルトで選択されています。「次へ」をクリックします。

図4-64 カスタマイズ・クラスのJARファイルへのデプロイ

11. JARファイルの出力場所の確認メッセージを確認します。「OK」をクリックします。

図4-65「サマリー」ページ(JARファイルの出力場所を示す)

「ログ・ファイル」ウィンドウ(図4-66)では、デプロイメントのステータスが表示されます。

図4-66 デプロイメント・ログ

カスタマイズ・クラスをモバイル・アプリケーションに登録するには:

1. モバイル・アプリケーションを開きます。

2. 「アプリケーション」→「アプリケーションのプロパティ」を選択します。

3. 「ライブラリとクラスパス」を選択します。

4. 「JAR/ディレクトリの追加」をクリックします。

5. 「アーカイブまたはディレクトリの追加」ダイアログで、カスタマイズ・クラスを含むJARファイルに移動して、「開く」をクリックします。

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

7. adf-config.xmlファイルの「MDS」ページの概要エディタで、カスタマイズ・クラスを追加します(図4-67を参照)。

図4-67 カスタマイズ・クラスの追加

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

WebサービスJava Bean定義(JDB)ファイルは、カスタマイズ・デプロイメントでは作成できないため、カスタマイズ・デプロイメントの実行前に、次のように非カスタマイズ・デプロイメントを実行してこれらのファイルを作成する必要があります。

1. Studio開発者ロールで、アプリケーションを起動します。

2. 「ビルド」→「すべてクリーン」を選択し、以前のデプロイメント以降に廃止されている可能性があるWebサービスJDBファイルを削除します。

3. デプロイメント・オプションから選択します(「アプリケーション」→「デプロイ」を選択し、デプロイメント・プロファイルを選択してアクセスします)。詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

4. 「カスタマイズ開発者」ロールで、アプリケーションを起動します。

5. 手順3で選択したデプロイメント・プロファイルと同じものを選択すると、カスタマイズ・デプロイメントが、非カスタマイズ・デプロイメントで作成されたJBDファイルにアクセスできるようになります。

4.14.5 モバイル・アプリケーションのカスタマイズ時に行われる処理

モバイル・アプリケーションでカスタマイズを実装する場合、JDeveloperによりこれらのカスタマイズ用のメタデータ・ファイルとこれらを格納するサブパッケージが作成されます。メタデータ・ファイルにはカスタマイズしたオブジェクトのカスタマイズが含まれ、これらは実行時にベース・メタデータに適用されます。JDeveloperでは、新しいメタデータ・ファイルにオブジェクトのベース・ファイルと同じ名前が付けられますが、.xml拡張子が追加されます(図4-68のmaf-feature.xml.xmlを参照)。

図4-68 maf-feature.xmlメタデータ・ファイル

4.14.6 モバイル・アプリケーションのリソース・バンドルでのカスタマイズの有効化

リソース・キーのカスタマイズを実装する場合、ベース・リソース・バンドル・ファイルを使用することができないため、追加のリソース・バンドル・ファイルを作成する必要があります。

4.14.6.1 リソース・バンドルでカスタマイズを有効化する方法

Studio開発者ロールで、アプリケーションまたはプロジェクト・リソース・バンドルを作成します。作成するバンドルを編集して、リソース・キーの文字列値を定義します。

始める前に

Oracle Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発の複数のリソース・バンドルの使用方法に関する項を理解しておいてください。

アプリケーション・リソース・バンドルを作成するには:

1. Studio開発者ロールで、「アプリケーション」→「アプリケーションのプロパティ」→「リソース・バンドル」をクリックします。

2. 「リソース・バンドル」ページで、「アプリケーション・バンドル検索」をクリックし、「バンドルの追加」アイコンの右にあるドロップダウン・メニューをクリックして、「アプリケーション・バンドルの作成」を選択します(図4-69を参照)。

図4-69 アプリケーション・リソース・バンドルの作成

3. 表示された「Xliffファイルの作成」ダイアログで、リソース・バンドルの名前を入力し、「OK」をクリックします。

4. リソース・バンドルを編集します(第4.11.1.8項「リソース・バンドル・ファイルの編集方法」を参照)。

注意:

MAFは、アプリケーション・レベルの「リソース・バンドル」ページではオーバーライドされたプロパティをサポートしていません。

5. 「カスタマイズ開発者」ロールで、「テキスト・リソースの選択」ダイアログを開き、適切な文字列を含むリソース・バンドルから選択します。「カスタマイズ開発者」ロールでは文字列の変更または新しい文字列の作成ができないため、選択したバンドルの文字列から選択することのみが可能です。

注意:

「カスタマイズ開発者」ロールで、ベース・リソース・バンドルから文字列を選択すると、アプリケーションのアップグレード時に問題が発生する可能性があるため選択しないでください。

プロジェクト・リソース・バンドルを作成するには:

1. Studio開発者ロールで、リソース・バンドルを作成するプロジェクトを右クリックして、「新」→「ギャラリから」→「一般」→「XML」→「XMLローカライゼーション・ファイル(XLIFF)」を選択します。

2. 表示された「Xliffファイルの作成」ダイアログで、リソース・バンドルの名前を入力し、「OK」をクリックします。

3. リソース・バンドルを編集します(第4.11.1.8項「リソース・バンドル・ファイルの編集方法」を参照)。

4. 「リソース・バンドル」ページの「バンドル検索」タブで、プロジェクト(.jpr)ファイルを選択してリソース・バンドルを登録します(図4-70を参照)。

図4-70 リソース・バンドルの選択

リソース・バンドルを登録すると、「テキスト・リソースの選択」ダイアログに表示されます(図4-71を参照)。

図4-71 テキスト・リソースのリソース・バンドルの選択

5. 「テキスト・リソースの選択」ダイアログを使用して、次のようにキーを定義します。

1. 「リソース・バンドル」ドロップダウン・リストからバンドルを選択します。
ダイアログには、選択したリソース・バンドルで現在定義されている文字列が表示されます。

2. 新しい文字列を入力して、「保存して選択」をクリックします。
JDeveloperでは、選択したリソース・バンドルに文字列を書き込みます。

6. 「カスタマイズ開発者」ロールで、「テキスト・リソースの選択」ダイアログを開き、適切な文字列を含むリソース・バンドルから選択します。「カスタマイズ開発者」ロールでは文字列の変更または新しい文字列の作成ができないため、選択したバンドルの文字列から選択することのみが可能です。

注意:

「カスタマイズ開発者」ロールで、ベース・リソース・バンドルから文字列を選択すると、アプリケーションのアップグレード時に問題が発生する可能性があるため選択しないでください。

4.14.7 カスタマイズを使用したモバイル・アプリケーションのアップグレード

カスタマイズはベース・アプリケーションとは別に保存されているため、安全にアップグレートができます。カスタマイズは変更を保持するため、これらの変更をアプリケーションの新しいバージョンに適用して、アプリケーションをアップグレードできます。MAFアプリケーション・アーカイブ(.maa)ファイルによって、モバイル・アプリケーションをアップグレードするためのメカニズムが提供されます。.maaファイルからアプリケーションを作成する場合、.maaファイルの更新バージョンを使用してアプリケーションをアップグレードできます。

4.14.7.1 モバイル・アプリケーションのアップグレード方法

「アーカイブからモバイル・アプリケーションをアップグレード」ウィザードを使用すると、アップグレードの前に行われたカスタマイズを保持しながら新しいバージンにアプリケーションをアップグレードできます。

始める前に

MAFアプリケーション・アーカイブ(.maa)ファイルについて理解しておいてください。詳細は、第19.6項「モバイル・アプリケーション・アーカイブ・ファイルの作成」および第19.7項「署名のないデプロイメント・パッケージの作成」を参照してください。

.maaファイルにパッケージ化され、アップグレードに使用されるアプリケーションのアプリケーションIDが、適用されるアプリケーションと同じであることを確認してください。また、アップグレードの対象となるアプリケーションより新しいバージョン番号である必要があります。

モバイル・アプリケーションをアップグレードするには:

1. .maaファイルからモバイル・アプリケーションを作成します。

2. カスタマイズをモバイル・アプリケーションに適用します(第4.14項「Oracle Metadata Servicesを使用したMAFファイルのカスタマイズ」および第4.14.6項「モバイル・アプリケーションのリソース・バンドルでのカスタマイズの有効化」を参照)。

3. 「アプリケーション」をクリックして、アーカイブからモバイル・アプリケーションを選択を選択します。

4. .maaファイルを参照して選択します。.maaにパッケージ化されたアプリケーションが、現在のアプリケーションと同じ(または古い)バージョンであったり、異なるアプリケーションIDである場合、ウィザードによりアップグレードは中止されます。

図4-72 .maaファイルの選択

5. 手動マージが必要なファイルの「サマリー」ページを確認します。図4-73に示すように、MAFでは、Tempディレクトリにアプリケーションの初期バージョン(バージョン1)が保存されます。「サマリー」ページにもログ・ファイルの一時的な場所が表示されます。

図4-73 アプリケーションのアップグレード情報

6. アップグレードが正常に完了すると、JDeveloperは再起動します。異なるバージョンの構成ファイルに調整が必要な場合、JDeveloperにより通知されます(図4-74を参照)。

図4-74 手動マージ通知

アップグレード中に、MAFでは、バージョン1のアプリケーションとバージョン2 (アップグレードしたバージョンのアプリケーション)の両方に対してカスタマイズできないファイル・セットがコピーされます。これらのファイルには、connections.xmlファイル、adf-config.xmlファイルなどがあります。MAFによって、バージョン1とバージョン2のconnections.xmlファイルとadf-config.xmlファイルに差異が検出されると、これらのファイルの両方のコピーを保持し、マージ・ログ・ファイルに対してエントリを記述します。バージョン番号がある場合、MAFではファイル名にバージョン番号を追加してバージョン1を区別します。バージョン番号がない場合、MAFでは_oldをファイル名に追加します(図4-74のconnections_old.xmlを参照)。必要に応じて、この差異を新しいバージョンに手動でマージできます。図4-75に示すように、MAFでは、「サマリー」ページに表示された一時的な場所にマージ・ファイル・ログを配置します。MAFでは、ファイルにworkspace name_timestampという名前を付けます。

図4-75 マージ・ログ・ファイル

4.14.8 アプリケーションのアップグレード時のJDeveloperでの処理

Tempディレクトリへのバージョン1のコピー、およびバージョン1とバージョン2のアップグレード不可の構成ファイルのコピーの作成に加えて、「アーカイブからモバイル・アプリケーションをアップグレード」ウィザードを使用してアプリケーションをアップグレードする場合、MAFでは次のことも実行します。

- 各プロジェクトのライブラリおよびリソース・バンドル設定を、に保存します。プロジェクト・ファイル名が入力されたマップに保存します。

- ワークスペースのリソース・バンドル設定を保存します。

- 登録したカスタマイズ・クラスをadf-config.xmlファイルに保存します。

- バージョン2の.maaファイルを一時ディレクトリにインポートします。

- バージョン1へのアップグレードに使用される.maaファイルからアプリケーションをコピーします。

- バージョン2の各プロジェクト(.jpr)ファイルを、登録したリソース・バンドルおよびライブラリ依存マップで更新します。ライブラリの新しいバージョンにより以前のバージョンがオーバーライドされます。ただし、バージョン1で使用されるライブラリと同じ名前を共有している場合、バージョン1ライブラリは変更されません。

- バージョン2のワークスペース(.jws)ファイルを、登録したリソース・バンドル設定で更新します。

- バージョン2のadf-config.xmlファイルを更新し、カスタマイズ・クラスを登録します。

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

アプリケーションの作成に使用された元の.maaファイル内にパッケージ化されていないFARファイルがアプリケーションに含まれる場合(または、アプリケーションのアップグレードに使用される.maaファイルに含まれる場合)、FARファイルを個別にアップグレードする必要があります。たとえば、.maaファイルからアプリケーションを作成し、FARファイルを追加してカスタマイズを実行できます。「リソース」ウィンドウから更新したFARを追加することによって新しいバージョンのFARを使用するために、アプリケーションをアップグレードできます(第4.13.1項「MAFアプリケーションでのFARコンテンツの使用方法」を参照)。

4.15 モバイル・アプリケーションへのCordovaプラグインの統合

MAFで作成したアプリケーションはハイブリッド・モバイル・アプリケーションであるため、Apache Cordova JavaScript APIを使用してネイティブ・デバイスAPIにアクセスします。Cordova Apache Documentation (http://cordova.apache.org/で入手可能)のプラグイン開発ガイドに示すように、Cordovaプラグインは、プラットフォーム固有のSDK (XcodeまたはAndroid SDK)およびJavaScriptを使用して構築されたネイティブ・コードで構成されています。

MAFはサードパーティCordovaプラグインには付属していないため、かわりに、このプラグインがデプロイされるプラットフォームのSDKを使用して開発する必要があります。つまり、Xcodeを使用してiOSアプリケーションのプラグインを作成し、Android SDKを使用してAndroidデバイスをターゲットとするアプリケーションのプラグインを作成します。プラグイン自体の作成に加えて、プラグインのリソースをアプリケーションに追加する方法を説明する付随する手順(readmeまたはmanifestファイル)も提供する必要があります。

サードバーティ・プラグインが、MAFでサポートされるCordovaのバージョンに準拠していることを確認する必要があります。MAFでサポートされるAPIのバージョンが、プラグインで使用されるバージョンとは異なる場合、有効化する機能をモバイル・アプリケーションでは使用できなくなる可能性があります。

MAFを使用するJavaScript APIへのアクセス方法の詳細は、付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」を参照してください。

注意:

プラグインは、Cordova 2.2.0 (MAFでサポートされている唯一のバージョン)と互換性がある必要があります。

4.15.1 iOSおよびAndroidのCordovaプラグインの統合方法

「Cordovaプラグイン」ページ(図4-76を参照)で、プラットフォーム固有のXMLファイル(iOS用のcordova.plistファイルおよびAndroid用のconfig.xmlファイル)を更新することで、モバイル・アプリケーションにプラグインを統合できます(プラグインの開発者によって提供されているプラグイン手順を参照)。

図4-76「Cordovaプラグイン」ページ

概要エディタに加えて、Cordovaプラグインを使用するようにMAFを構成するには、「コンポーネント」ウィンドウからソース・エディタまたは「構造」ウィンドウにCordovaコンポーネントをドラッグします(図4-77を参照)。「プロパティ」ウィンドウを使用して、構成を編集することもできます。

図4-77「Cordovaプラグイン」コンポーネント

始める前に

次の手順を実行します。

- プラグインの開発者からプラグインの統合手順を取得します。

- プラグイン自体を取得します(ソース・コード、JavaScriptファイル、および追加のライブラリ、リソース、アセット)。

- 表4-12に、アプリケーション・コントローラ・プロジェクトおよびビュー・コントローラ・プロジェクトに手動で作成するディレクトリを示します。作成後、プラグイン・アーティファクトをディレクトリにコピーします。プラグインの主なコンポーネント、JavaScriptファイルおよびプラグイン・バイナリ・ライブラリは、モバイル・アプリケーション内の異なるプロジェクト(ビュー・コントローラ・プロジェクトおよびアプリケーション・コントローラ・プロジェクト)に配置されます。

ヒント:

「Cordovaプラグイン」ページの「インストール」セクションでは、これらのファイルの場所のガイドラインが読取り専用で表示されます。

表4-12 プラグイン・アーティファクトを作成するディレクトリの場所

アーティファクト

ファイルの場所

説明

アセット

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\plugins\Plugin Name\Platform\assets
例:
JDeveloper\mywork\application1\ApplicationController\src\plugins\BarcodeScanner\Android\assets

このフォルダには、プラグイン・アセットがあります。このAndroid専用アーティファクトはオプションです。

JavaScriptファイル

アプリケーション・ワークスペース・ディレクトリ\ViewController\public_html\plugins\Plugin Name\Platform\js
例:
JDeveloper\mywork\application1\ViewController\public_html\plugins\BarcodeScanner\Android\js

このディレクトリには、プラグインJavaScriptファイルがあります。このフォルダは必須であり、JavaScriptファイルが含まれている必要があります。

プラグイン・ライブラリ

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\plugins\Plugin Name\Platform\bin

次に例を示します。

JDeveloper\mywork\application1\ApplicationController\src\plugins\BarcodeScanner\Android\bin

プラグイン・ライブラリが含まれています。このフォルダは、このコンテンツが含まれている必要がある必須のフォルダです。

依存ライブラリ

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\plugins\Plugin Name\Platform\libs

次に例を示します。

JDeveloper\mywork\application1\ApplicationController\src\plugins\BacodeScanner\Android\libs

追加の依存ライブラリをこの場所にコピーします。このフォルダはオプションです。

リソース

アプリケーション・ワークスペース・ディレクトリ\ApplicationController\src\plugins\Plugin Name\Platform\res

次に例を示します。

JDeveloper\mywork\application1\ApplicationController\src\plugins\BacodeScanner\Android\res

追加のプラグイン・リソース・フォルダをコピーします。このフォルダはオプションです。空の場合は含めないでください。これによりデプロイメントが失敗します。

図4-78に、「アプリケーション」ウィンドウでのこれらの場所を示します。

図4-78 プラグイン・アーティファクト

- MAF AMXで作成したアプリケーション機能の場合、タスク・フローのマネージドBeanには、次のようなinvokeContainerJavaScriptFunctionを使用するハンドラ・メソッドを含む必要があります。

AdfmfContainerUtilities.
invokeContainerJavaScriptFunction(featureid, methodname, new Object[]
{ params... })

このメソッドはJavaScriptを起動します。実装の例は、APIDemoサンプル・アプリケーションのManagedBean.javaファイルを参照してください。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

invokeContainerJavaScriptFunctionの詳細は、第B.2.14項「invokeContainerJavaScriptFunction」およびOracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

- FARからプラグイン関連アーティファクトおよびJavaScriptファイルを取得する場合(第4.15.4項「FARを使用したプラグインの統合に関する必知事項」を参照)、プラグインにJavaScriptファイルが付随していることを確認する必要があります。モバイル・アプリケーションで使用されるFARにJavaScriptファイルがない場合、このファイルを取得するか、FAR開発者の手順を使用して作成する必要があります。FARをアプリケーションに追加する必要もあります(第4.13.1項「MAFアプリケーションでのFARコンテンツの使用方法」を参照)。

Androidプラグインを追加するには:

1. maf-application.xmlの概要エディタを開き、「Cordovaプラグイン」ページを選択します。

2. 「追加」をクリックします。

3. 「プラグインの挿入」ダイアログに入力します(図4-79を参照)。

図4-79 Androidプラグインの追加

- 完全修飾名: プラグインの完全修飾名。この名前はmanifestまたはreadmeファイルによって提供され、config.xmlファイル内のプラグイン要素のname属性にマッピングされます。

- 実装クラス: プラグインを実装するクラスの名前。manifestまたはreadmeファイルによって提供されるこの名前は、通常、Javaパッケージとその後にクラス名が続いたものです。これは、config.xmlファイル内のプラグイン要素のvalue属性にマッピングされます。

- 名前: プラグインの名前。これは、プラグイン・アーティファクトとエラー検出時にデプロイメントに記録される値を含むフォルダの名前です。

- プラットフォーム: 「Android」を選択します。

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

ヒント:

「Cordovaプラグイン」コンポーネント・ウィンドウからエディタまたは「構造」ウィンドウにプラグイン・コンポーネントをドラッグして、このダイアログにアクセスすることもできます。

5. プラグインに、その独自のAndroidリソースが必要な場合、これらのリソースを表示する必要があるJavaパッケージを「リソース・パッケージ名」フィールドに入力します。そうでない場合は、このフィールドを空白のままにしておきます。これはオプションの値です。

図4-80 Androidプラグインの統合

iOSプラグインを追加するには:

1. maf-application.xmlの概要エディタを開き、「Cordovaプラグイン」ページを選択します。

2. 「追加」をクリックします。

3. 「プラグインの挿入」ダイアログに入力します(図4-81を参照)。

図4-81 iOSプラグインの追加

- 完全修飾名: プラグインの完全修飾名。この名前はmanifestまたはreadmeファイルによって提供され、cordova.plistファイル内の<key>要素にマッピングされます。

- 実装クラス: プラグインを実装するクラスの名前。この名前はmanifestまたはreadmeファイルによって提供され、通常、Objective-Cクラスの名前です。これは、cordova.plistファイル内の<string>要素にマッピングされます。

- 名前: プラグインの名前。これは、プラグイン・アーティファクトとエラー検出時にデプロイメントに記録される値を含むフォルダの名前です。

- プラットフォーム: iOSを選択します。

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

5. 「リンカー・フラグ」フィールドに、プラグインに必要な追加のリンカー・フラグを入力します。プラグイン・ライブラリ(-l BarcodeScannerなど)へのリンクにオプションを追加する必要があります。次に例を示します。

-l BarcodeScanner -lc++ -liconv -framework CoreVideo -framework AssetsLibrary -framework AVFoundation

注意:

\libsフォルダにコピーした依存ライブラリを含めるためにリンカー・フラグを追加する必要はありません。依存ライブラリは自動的に含まれるためです。

readmeファイルを参照し、追加のライブラリが必要かどうかを判断します。

図4-82 iOSプラグインの統合

MAF AMXコンテンツでプラグインのJavaScriptファイルの参照を可能にするには:

1. maf-feature.xmlの概要エディタを開き、プラグインを使用するアプリケーション機能を選択します。

2. 「コンテンツ」をクリックして、「MAF AMX」を選択します。

注意:

ビュー・コントローラ・プロジェクトには、次のようにJavaハンドラでinvokeContainerJavaScriptFunctionを使用してJavaScriptを起動するクラスを含む必要があります。

AdfmfContainerUtilities.invokeContainerJavaScriptFunction(
featureid, methodname, new Object[] { params... });

3. 「包含」表で「追加」をクリックして、インクルードの挿入ダイアログを開きます。

図4-83 ビュー・コントローラ・プロジェクト内のプラグインJavaScriptファイルの参照

4. 「JavaScript」を選択して、プラグインのJavaScriptファイルの場所を参照します(このファイルはビュー・コントローラ・プロジェクトのpublic_htmlフォルダに配置されています)。図4-83に示すように、JavaScriptファイルはビュー・コントローラ・プロジェクト内に配置されています(plugins/plugin name/platform/js/JavaScriptファイル名)。

ローカルHTMLコンテンツでプラグインのJavaScriptファイルの参照を可能にするには:

1. maf-feature.xmlの概要エディタを開き、プラグインを使用するアプリケーション機能を選択します。

2. 「コンテンツ」をクリックして、「ローカルHTML」を選択します。

3. HTMLドキュメント内で<script>タグを使用してJavaScriptファイルを参照します(たとえば、例4-28の<script type="text/javascript" src="../plugins/BarcodeScanner/iOS/js/barcodescanner.js"></script>などです)。

図4-28 <script>タグを使用したプラグインJavaScriptファイルの参照

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="user-scalable=no,height=device-height,width=device-width" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>
<script type="text/javascript">if (!window.adf) window.adf = {};
adf.wwwPath = "../../../../www/";</script>
<script type="text/javascript" src="../../../../www/js/base.js"></script>
<script type="text/javascript" src="../plugins/BarcodeScanner/iOS/js/barcodescanner.js"></script>
<script type="text/javascript" charset="utf-8">
function scanBarcode()
{
window.plugins.barcodeScanner.scan(
function(result) {
if (result.cancelled)
updateContentNode("the user cancelled the scan");
else
updateContentNode("We got a barcode: " +
result.text);
},
function(error) {
updateContentNode("scanning failed: " + error);
}
)
}

function updateContentNode(newContent)
{
$("#content").html(newContent);
}
</script>
</head>
<body onload="onBodyLoad()">

<!-- MAIN PAGE -->
<div data-role="page" id="main" data-url="main.jspx" data-position="fixed">
<div data-role="header" data-position="fixed">
<h1>
Barcode Scanner Test
</h1>
</div>
<div data-role="content" id="content">
No barcode scanned yet
</div>
<div data-role="footer" data-position="fixed">
<div data-role="navbar">
<ul>
<li>
<a href="javascript:try{scanBarcode();}catch(e){alert(e.description);}"
data-rel="dialog" data-transition="pop">Scan barcode</a>
</li>
</ul>
</div>
</div>
</div>
</body>
</html>

4.15.2 プラグインの更新時に行われる処理

概要エディタまたは「コンポーネント」ウィンドウから「Cordovaプラグイン」コンポーネントを使用すると、maf-application.xmlファイルに<adfmf:cordovaPlugins要素が移入されます(図4-32を参照)。この要素とその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例4-29 <adfmf:cordovaPlugins>要素

<adfmf:cordovaPlugins>
<adfmf:plugin name="BarcodeScanner" platform="iOS"
implementationClass="CDVBarcodeScanner"
fullyQualifiedName="ios.apache.cordova.barcodeScanner">
<adfmf:iosPluginInfo>
<adfmf:linkerFlags>-l BarcodeScanner
-lc++
-liconv
-framework CoreVideo
-framework AssetsLibrary
-framework AVFoundation</adfmf:linkerFlags>
</adfmf:iosPluginInfo>
</adfmf:plugin>
<adfmf:plugin platform="Android" name="BarcodeScanner"
implementationClass="com.phonegap.pluigns.barcodescanner.BarcodeScanner"
fullyQualifiedName="BarcodeScanner">
<adfmf:androidPluginInfo>
<adfmf:resourcePackageName>com.google.zxing.client.android</adfmf:resourcePackageName>
<adfmf:androidManifestActivities>&lt;activity android:name=".CaptureActivity"
android:screenOrientation="landscape"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="stateAlwaysHidden"&gt;
...
</adfmf:androidManifestActivities>
</adfmf:androidPluginInfo>
</adfmf:plugin>
</adfmf:cordovaPlugins>
</adfmf:application>

4.15.3 プラグイン・プリファレンスの追加方法

アプリケーション・レベルとアプリケーション機能レベルの両方の「ユーザー・プリファレンス」ページで、Cordovaプラグイン・プリファレンスは表示されますが、このプラグイン・プリファレンスは、プリファレンス要素で定義されたプリファレンスの下の「ユーザー・プリファレンス」ページの下部(第14章「ユーザー・プリファレンスの有効化」を参照)や、プリファレンス・グループまたは単一のアイテム・プリファレンス・リスト選択から開く子プリファレンスとして表示されます。

始める前に

設定バンドル(Settings.bundle)とそのコンテンツ(Root.plistファイルおよび.stringsファイルなど)の詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手できる『Preferences and Settings Programming Guide』を参照してください。

iOSアプリケーションのプリファレンス・ページの下部にあるCordovaプラグイン・プリファレンスをマージするには:

1. プラグインのアプリケーション・コントローラ・プロジェクト内に次のようなリソース(res)ファイルを作成します。

application workspace directory\ApplicationController\src\plugins\plugin name\iOS\res

2. 設定バンドル(Settings.bundle)ファイルをプラグインのresフォルダにコピーします。

Cordovaプラグイン・プリファレンスをiOSアプリケーションの子ページとしてマージするには:

1. アプリケーション・コントローラ・プロジェクト内に次のようなプラグイン用のリソース(res)フォルダを作成します。

application workspace directory\ApplicationController\src\plugins\plugin name\iOS\res

2. 設定バンドル(Settings.bundle)ファイルをプラグインのresフォルダにコピーします。

3. Root.plistファイルの名前をPluginName.Root.plistに変更します(このPluginNameはプラグインの名前です)。たとえば、このファイルの名前をBarcodeScanner.Root.plistに変更します。

4. プラグインの.stringsファイル内の子ページのタイトルに対して、文字列IDおよびローカライズ可能な値を定義します。このIDは、PluginName.page.titleである必要があります(PluginNameはプラグインの名前です)。次に例を示します。
"PluginName.page.title" = "Some Localized Page Title";

Androidアプリケーションのプリファレンス・ページの下部にあるCordovaプラグイン・プリファレンスをマージするには:

1. アプリケーション・コントローラ・プロジェクト内のプラグイン用に次のようなリソース(res)フォルダを作成します。

application workspace directory\ApplicationController\src\plugins\plugin name\Android\res

2. preferences.xmlファイルを含むリソースをプラグインのresフォルダにコピーします。preferences.xmlファイル、および従属画面の定義の詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/ui/settings.html)で入手できる『Settings Guide』の「Defining Preferences in XML」またはAndroid SDKドキュメントを参照してください。MAFデプロイメント・フレームワークでのプリファレンスの変換方法の詳細は、第C.2項「Android用のプリファレンスの変換」を参照してください。

Cordovaプラグイン・プリファレンスをAndroidアプリケーションの子ページとしてマージするには:

1. preferences.xmlファイルを含むリソースをプラグインのresフォルダにコピーします。

2. 例4-31に示すように、プリファレンス・セット(例4-30)を別のPreferenceScreen要素内にネストします。

例4-30 プリファレンス

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/preferences_scanning_title">
<CheckBoxPreference android:key="preferences_decode_1D"
android:defaultValue="true"
android:title="@string/preferences_decode_1D_title"/>
...
</PreferenceCategory>
...

</PreferenceScreen>

例4-31は、PreferenceScreen要素をラップするためのandroid:key属性の定義を示しています。

例4-31 PreferenceScreen要素でラップされたプリファレンス・セット

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen android:key="wrapperScreen" android:title="Barcode Scanner">
<PreferenceCategory android:title="@string/preferences_scanning_title">
<CheckBoxPreference android:key="preferences_decode_1D"
android:defaultValue="true"
android:title="@string/preferences_decode_1D_title"/>
...
</PreferenceCategory>
...
</PreferenceScreen>
</PreferenceScreen>

3. 「プリファレンス」ページにローカライズが必要な場合、ローカライズされたstrings.xmlファイルに文字列値を定義します。strings.xmlファイルの詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/resources/index.html)で入手できる『App Resources Guide』の「String Resources」、またはAndroid SDKドキュメントを参照してください。MAFデプロイメント・フレームワークでのstrings.xmlファイルの処理方法の詳細は、第C.2.3項「Strings.xml」を参照してください。

4.15.4 FARを使用したプラグインの統合に関する必知事項

1人の開発者がモバイル・アプリケーションのコンポーネントを作成する場合がありますが、通常、アプリケーションは複数の開発者が提供するリソースから構成されています。サードパーティのプラグインの追加は、後者の場合を示しており、FAR開発者は、ビュー・コントローラ・プロジェクトを機能アーカイブ・ファイル(FAR)としてデプロイする前に、まずプラグインを使用するアプリケーション機能を作成してテストします。FAR開発者はこのFARをアプリケーション・アセンブラ開発者に公開し、プラグインおよびJavaScriptファイルを統合する一連の手順(readmeファイルなど)を提供します。また、FAR開発者は、アプリケーション・アセンブラ開発者にプラグイン・バイナリ・ライブラリのZIPファイルを提供することもあります。アプリケーション・アセンブラは次に、FARをモバイル・アプリケーションに追加し、手順を使用してJavaScriptファイルおよびプラグイン・バイナリ・ライブラリをモバイル・アプリケーションのプロジェクトに統合します。続いて、モバイル・アプリケーションをテストして、プラットフォーム固有のパッケージとしてデプロイし、公開します。具体的には、FAR開発者とアプリケーション・アセンブラ間の共同作業は、次のもので構成されています。

1. FAR開発者は、XcodeまたはAndroid SDKを使用して、Cordovaプラグイン・ライブラリ(iOS用の.aファイルまたはAndroid用のJARファイル)を作成します。MAFアプリケーションでこのライブラリを使用できるようにするには、開発者は次の手順を実行します。

1. モバイル・アプリケーションを作成します。開発者は、アプリケーション・コントローラ・プロジェクト内の様々な場所にプラグイン・ライブラリを含めてから、ビュー・コントローラ・プロジェクトのpublic_htmlディレクトリにJavaScriptファイルを追加します。MAF AMXとして実装されたユーザー・インタフェースでは、JavaScriptファイルは、インクルードの挿入ダイアログを使用してmaf-feature.xmlファイルで参照されます(第4.10.1項「アプリケーション・コンテンツの定義方法」を参照)。HTMLベースのユーザー・インタフェースでは、JavaScriptインクルードを使用してこのファイルを参照します。
MAF AMX作成アプリケーション機能では、JavaハンドラにinvokeContainerJavaScriptFunctionメソッドを含めることで、JavaScriptを起動します。詳細は、第B.2.14項「invokeContainerJavaScriptFunction」およびOracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

HTML作成アプリケーション機能では、<script>タグでJavaScriptファイルの場所を参照して、JavaScriptファイルを直接コールします。

2. maf-application.xmlの概要エディタとそのダイアログの「Cordovaプラグイン」ページを使用して、Cordovaプラグインを統合します。

3. アプリケーションをテストするためにデバイスにデプロイします。

4. ビュー・コントローラ・プロジェクトをFARとしてデプロイします。このFAR自体には、CordovaプラグインおよびJavaScriptファイルを参照するMAF AMXおよびHTMLページなどのアーティファクトが含まれる場合があります。

注意:

FARに、JavaScriptファイルが常に含まれるわけではありません。

5. FARに含まれていない場合でも、FAR開発者は、モバイル・アプリケーションにプラグインを統合する一連の手順をアプリケーション・アセンブラ開発者に提供します。これらの手順は、開発組織およびプラグイン自体に固有であるため、伝達される方法および形式(メタデータ・ファイルまたはreadmeファイルなど)は、FAR開発者とアプリケーション・アセンブラ開発者間の合意によって決まります。例4-32は、iOSプラグインの統合方法を示すREADME.mdファイルの一部を示しています。

例4-32 README.mdファイル

...
## Adding the plugin to your project ##
* Copy the .h, .cpp and .mm files to the Plugins directory in your project.
* Copy the .js file to your www directory and reference it from your html file(s).
* In the `Supporting Files` directory of your project, add a new plugin by editing
the file `Cordova.plist` and in the `Plugins` dictionary adding the following
key/value pair:
* key: `org.apache.cordova.barcodeScanner`
* value: `CDVBarcodeScanner`
Add the following libraries to your Xcode project, if not already there:
* AVFoundation.framework
* AssetsLibrary.framework
* CoreVideo.framework
* libiconv.dylib
...

2. アプリケーション・アセンブラは、FARモバイル・アプリケーションを追加します(第4.13.1項「MAFアプリケーションでのFARコンテンツの使用方法」を参照)。

3. FAR開発者がプラグイン・バイナリのZIPファイルを提供しない場合、アプリケーション・アセンブラはプラットフォーム固有のSDKを使用してプラグインを構築する必要があります。プラグインは、プラットフォーム固有のパッケージ(iOS用の.aファイルまたはAndroid用のJARファイル)にパッケージ化されています。

4. アプリケーション・アセンブラ開発者は、アプリケーション・コントローラ・プロジェクトにプラグイン・バイナリ・ライブラリを追加し、ビュー・コントローラ・プロジェクトのpublic_htmlディレクトリにJavaScriptファイルを追加します。

5. maf-application.xmlの概要エディタおよびそのダイアログの「Cordovaプラグイン」ページを使用して、アプリケーション・アセンブラ開発者は手順の指示に従って、プラットフォーム固有のXMLファイル(iOS用のcordova.plistファイルおよびAndroid用のconfig.xmlファイル)を更新します。MAFデプロイメントでは、この構成を使用して、モバイル・アプリケーションにプラグインを組み込みます。

第IV部

MAF AMXアプリケーション機能の作成

タスク・フローやアプリケーション・ページの作成方法や、UIコンポーネント、データ・コントロール、Webサービスおよびローカル・データベースの使用方法など、MAFアプリケーション用のMAF AMXコンテンツの作成方法について説明します。

第IV部の構成は次のとおりです。

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

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

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

- 第8章「Webサービスの使用方法」

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

- 第10章「ローカル・データベースの使用方法」

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

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

5 MAF AMXページの作成

この章では、MAF Application Mobile XML (MAF AMX)アプリケーション機能を作成する方法について説明します。

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

- 第5.1項「MAF AMXアプリケーション機能の概要」

- 第5.2項「タスク・フローの作成」

- 第5.3項「ビューの作成」

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

MAF AMXはモバイル・アプリケーション・フレームワーク(MAF)内のサブフレームワークであり、サポートされるすべてのプラットフォームで動作が同一となるアプリケーション機能を作成できる一連のUIコンポーネントを備えています。MAF AMXを使用すると、UIコンポーネントをページ・エディタにドラッグして、宣言的に使用できます。通常、MAF AMXアプリケーション機能には相互に接続された複数のページがあり、様々なパスを経由してこれらのページ間を移動できます。

注意:

モバイル・デバイスのインタフェースを開発する際には、画面領域が非常に限られているということを常に意識する必要があります。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

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

- 第3.2.4項「MAF AMXアプリケーション用のアプリケーション・ワークスペースの作成」

- 第3章「モバイル・アプリケーション開発のスタート・ガイド」

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

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

5.2 タスク・フローの作成

タスク・フローにより、MAF AMXページ間のナビゲーションを定義できます。JDeveloperのアプリケーション・ワークスペース(第3.2項「アプリケーション・ワークスペースの作成」を参照)を使用して、タスク・フローを設計することにより、MAF AMXアプリケーション機能のユーザー・インタフェースの作成を開始できます。MAF AMXでは、ナビゲーション・ケースとナビゲーション・ルールを使用してタスク・フローを定義します。これらの定義は、ViewController-task-flow.xmlというデフォルト名のファイルに格納されています(第5.2.3項「ViewController-task-flow.xmlファイルに関する必知事項」を参照)。

(開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにある) NavigationというMAFサンプル・アプリケーションには、循環ナビゲーション、ルーターなど様々なナビゲーション技術の使用方法が示されています。

MAFでは、バインド・タスク・フローとバインドなしタスク・フローの両方を持つMAF AMXアプリケーション機能を作成できます。第5.2.12項「バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項」で説明しているように、バインド・タスク・フローはタスク・フロー定義とも呼ばれ、アプリケーションの再利用可能な部分を表します。MAFでは、バインド・タスク・フローにはエントリ・ポイントが1つありますが、終了ポイントはありません。バインド・タスク・フローには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。他のバインド・タスク・フロー特性として、入力パラメータの受入れ(第5.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」)や戻り値の生成(第5.2.12.3.2項「バインド・タスク・フローの戻り値の構成」)などがあります。

アプリケーション機能にバインド・タスク・フローを作成するには、MAF AMXタスク・フロー・デザイナを使用します。タスク・フローの概要エディタと同様、このツールにはダイアグラマ(第5.2.4,項「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)が含まれており、ここで、「コンポーネント」ウィンドウからアクティビティと制御フローをドラッグ・アンド・ドロップすることにより(第5.2.2項「タスク・フロー・アクティビティと制御フローに関する必知事項」)、タスク・フローを構築します。その後、「プロパティ」ウィンドウを使用して、これらのアクティビティとそれらの間の遷移を定義します。

タスク・フローがすでに作成されている場合を除き、新しいMAF AMXページが作成されると、MAFでは自動的にデフォルトのバインドなしタスク・フロー(adfc-mobile-config.xmlファイル)が生成されます。

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

タスク・フローはタスク・フロー自体と、複数のアクティビティ、そしてそれらのアクティビティ間の制御フロー・ルールで構成されています(第5.2.2項「タスク・フロー・アクティビティと制御フローに関する必知事項」を参照)。通常、アクティビティの大半は、フロー内の異なるページを示すビュー・アクティビティです。メソッドや操作をコールする必要がある場合(ページのレンダリング前など)は、メソッド・コール・アクティビティをそのアクティビティから次の適切なアクティビティまでの制御フロー・ケースとともに使用します。別なタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティを使用します。フローにブランチ化が必要な場合は、ルーター・アクティビティを使用します。バインド・タスク・フローの最後で、リターン・アクティビティを使用してフローを終了し、そのバインド・タスク・フローをコールしたフローに制御を戻します。

ナビゲーション・ダイアグラマを使用して、MAF AMXアプリケーション機能のバインド・タスク・フローを宣言的に作成します。ダイアグラマを使用すると、JDeveloperによって、MAF AMXアプリケーション機能でナビゲーションが機能するために必要なXMLメタデータがViewController-task-flow.xmlファイル(デフォルト)に作成されます。

始める前に

タスク・フローを設計するには、MAFアプリケーションにビュー・コントローラ・プロジェクト・ファイル(第3章「モバイル・アプリケーション開発のスタート・ガイド」を参照)が含まれている必要があります。

MAFでタスク・フローを作成するには、次の2つの方法があります。

- バインド・タスク・フローはmaf-feature.xmlファイルから作成できます。詳細は、第4.10.1項「アプリケーション・コンテンツの定義方法」を参照してください。

- JDeveloperの「新規ギャラリ」を使用できます。詳細は、「「新規ギャラリ」からタスク・フローを作成するには:」を参照してください。

「新規ギャラリ」からタスク・フローを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」→「MAFタスク・フロー」の順に選択します(図5-1を参照)。「OK」をクリックします。

図5-1 新しいMAFタスク・フローの作成

3. 「MAFタスク・フローの作成」ダイアログ(図5-2を参照)で、新しいタスク・フローのファイル名と場所を指定して「OK」をクリックし、図5-3に示すナビゲーション・ダイアグラマで新しい<Name>-flow.xmlファイルを開きます。

注意:

タスク・フローは、MAFアプリケーションのビュー・コントローラ・プロジェクトのHTMLルート内に作成する必要があります。

注意:

同じパターンですでに存在するバインド・タスク・フローの数に従って、JDeveloperによってタスク・フローの数が増分されます。

図5-2 「MAFタスク・フローの作成」ダイアログ

図5-3 新しい空白のタスク・フロー

4. 「コンポーネント」ウィンドウで、「MAFタスク・フロー」を選択します。

ヒント:

「コンポーネント」ウィンドウが表示されていない場合は、メイン・メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」ウィンドウはJDeveloperの右上部に表示されます。

5. 「MAFタスク・フロー」→「コンポーネント」を選択し、使用するコンポーネントを選択してダイアグラムにドラッグ・アンド・ドロップします。図5-4に示すように、JDeveloperでは新たに追加されたコンポーネントを使用してダイアグラムが再描画されます。

図5-4 タスク・フローへのコンポーネントの追加

タスク・フローへのアクティビティの追加方法の詳細は、第5.2.5項「タスク・フロー・アクティビティの追加方法と使用方法」を参照してください。

制御フローの追加方法の詳細は、第5.2.6項「制御フローの定義方法」を参照してください。

「概要」タブを開き、概要エディタを使用してナビゲーション・ルールとナビゲーション・ケースの作成することもできます。概要エディタを使用したナビゲーション作成の詳細は、[F1]キーで参照できます。

また、「ソース」エディタでページを直接編集して、タスク・フロー・ファイルに手動で要素を追加することもできます。「ソース」エディタでファイルを開くには、「ソース」タブをクリックします。

注意:

手動でタスク・フロー・ファイルを編集する場合は、MAF AMXページ、JavaScriptファイルおよびCSSファイルを参照するすべてのドキュメント・ファイル名で大文字と小文字が区別されることに注意してください。

特殊文字(アンダースコアなど)がファイル名に使用されている場合は、モバイル・デバイスの仕様を参照して、その文字の使用がサポートされているかどうかを確認する必要があります。

MAF AMXアプリケーション機能にナビゲーションを定義した後は、ページを作成したり、ナビゲーションを使用するコンポーネントを追加することができます。ページでのナビゲーション・コンポーネントの使用方法の詳細は、第5.2.6項「制御フローの定義方法」を参照してください。

MAF AMXアプリケーション機能にタスク・フローを定義した後は、ビュー・ファイルをダブルクリックしてMAF AMXビューにアクセスできます。詳細は、第5.3項「ビューの作成」を参照してください。

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

タスク・フローは、アクティビティ、およびアクティビティ間の遷移を定義する制御フロー・ケースで構成されます。

MAFタスク・フロー・デザイナでは、表5-1にリストされたアクティビティがサポートされています。

表5-1 タスク・フロー・アクティビティ

アクティビティ

説明

表示

MAF AMXページを表示します。詳細は、第5.2.5.1項「ビュー・アクティビティの追加」を参照してください。

メソッド・コール

メソッド(通常はマネージドBean上のメソッド)を起動します。メソッド・コール・アクティビティをMAF AMXアプリケーション機能の制御フローの任意の位置に配置して、制御フロー・ルールに基づいてロジックを起動できます。詳細は、第5.2.5.3項「メソッド・コール・アクティビティの追加」を参照してください。

タスク・フローに含まれるメソッド・コールに渡すパラメータを指定することもできます。これらには、MAF AMXタスク・フロー内のメソッド・コール・アクションの標準パラメータが含まれます。デザイナを使用してメソッドを生成する場合、デザイナにより必要な引数およびタイプが追加されます。

実行時にタスク・フロー内のメソッド・コールのパラメータを定義し、メソッド・コール自体にパラメータを渡してこれを使用できます。詳細は、第IV部「タスク・フロー・アクティビティの追加方法と使用方法」を参照してください。

ルーター

式言語(EL)式を評価し、その式の値に基づいて結果を戻します。その後、このような結果を使用して、タスク・フローの他のアクティビティに制御をルーティングします。詳細は、第5.2.5.2項「ルーター・アクティビティの追加」を参照してください。

タスク・フロー・コール

バインドなしタスク・フローまたはバインド・タスク・フローからバインド・タスク・フローをコールします。タスク・フロー・コール・アクティビティでは、同じMAF AMXアプリケーション機能内にあるバインド・タスク・フローをコールできますが、別のMAF AMXアプリケーション機能またはライブラリに追加された機能アーカイブ・ファイル(FAR) (第4.13項「機能アーカイブ・ファイルの使用」を参照)からバインド・タスク・フローをコールすることもできます。

タスク・フロー・コール・アクティビティは、タスク・フロー入力パラメータおよび戻り値をサポートします。

詳細は、第5.2.5.4項「タスク・フロー・コール・アクティビティの追加」を参照してください。

タスク・フロー・リターン

アプリケーションの制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターンは、バインド・タスク・フロー内でのみ使用できます。詳細は、第5.2.5.5項「タスク・フロー・リターン・アクティビティの追加」を参照してください。

MAFタスク・フロー・デザイナでは、表5-2にリストされた制御フローがサポートされています。

表5-2 制御フロー

制御フロー

説明

制御フロー・ケース

MAF AMXアプリケーション機能内で、あるアクティビティから次のアクティビティに制御を渡す方法を指定します。詳細は、第5.2.6.1項「制御フロー・ケースの定義」を参照してください。

ワイルドカード制御フロー・ルール

IDがワイルドカード式と一致するアクティビティからの制御フロー・ケースを表します。詳細は、第5.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照してください。

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

ViewController-task-flow.xmlファイルを使用すると、「コンポーネント」ウィンドウからMAF AMXタスク・フロー・コンポーネントをダイアグラマにドラッグ・アンド・ドロップすることにより、ビュー(MAF AMXページ)間の相互作用を設計できます。

図5-5に、Products-flow.xmlというタスク・フロー・ファイルの例を示します。このファイルでは、制御フローはproductsページからproductdetailsページに方向付けられます。productdetailsページからproductsページに戻るには、組込みの__backナビゲーションが使用されます(第5.2.7項「MAFの戻るナビゲーションのサポートに関する必知事項」を参照)。

図5-5 タスク・フロー・ファイル

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

図5-5に示すように、MAFタスク・フロー作成ユーティリティを使用してタスク・フローを作成すると、タスク・フロー・ダイアグラムおよび「コンポーネント」ウィンドウが自動的に表示されます。タスク・フロー・ダイアグラムはビジュアル・エディタであり、「コンポーネント」ウィンドウまたは「アプリケーション」ウィンドウからのアクティビティとタスク・フローをここにドラッグ・アンド・ドロップできます。詳細は、第5.2.5項「タスク・フロー・アクティビティの追加方法と使用方法」を参照してください。

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

タスク・フロー・ダイアグラマを使用して、アクティビティ、ビューおよび制御フローをドラッグ・アンド・ドロップします。

始める前に

図5-6に示すように、「コンポーネント」ウィンドウから「MAFタスク・フロー」を選択する必要があります。

MAFタスク・フローにアクティビティを追加するには:

1. 「アプリケーション」ウィンドウで、タスク・フロー・ソース・ファイル(ViewController-task-flow.xmlなど)をダブルクリックして、図5-6に示すようなタスク・フロー・ダイアグラムおよび「コンポーネント」ウィンドウを表示します。ダイアグラマにはタスク・フロー・エディタが表示されます。「コンポーネント」ウィンドウには、MAFタスク・フローで使用できるコンポーネントが自動的に表示されます。

2. 「コンポーネント」ウィンドウからダイアグラムにアクティビティをドラッグします。ダイアグラムにビュー・アクティビティをドラッグしてダブルクリックすると、MAF AMXページの作成ウィザードを起動できます(第5.2.5.1項「ビュー・アクティビティの追加」を参照)。

図5-6 タスク・フロー・エディタのダイアグラマ

注意:

各バインド・タスク・フローに関連付けられているデフォルトのアクティビティがあります。

5.2.5.1 ビュー・アクティビティの追加

タスク・フロー・アクティビティの主要なタイプの1つに、MAF AMXページを表示するビュー・アクティビティがあります。

タスク・フローのソース・ファイル内のXMLメタデータは、ビュー・アクティビティを物理MAF AMXページと関連付けます。id属性ではビュー・アクティビティが識別されます。

タスク・フローのビュー・アクティビティは、実行中に相互に制御を受け渡すように構成できます。たとえば、あるビュー・アクティビティ(ビュー・アクティビティA)から次のビュー・アクティビティ(ビュー・アクティビティB)に制御を渡すには、ビュー・アクティビティAと関連付けられたページ上にコマンド・コンポーネント(ボタンやリンクなど)を構成します。これを行うには、コマンド・コンポーネントのAction属性を、起動するタスク・フロー・アクティビティ(ビュー・アクティビティBなど)に対応する制御フロー・ケースfrom-outcomeに設定します。実行時に、エンド・ユーザーは、コマンド・コンポーネントを起動することで制御フロー・ケースを初期化します。UIコンポーネントのAction属性の定数値または動的値のいずれかを使用して、あるビュー・アクティビティから別のアクティビティに移動できます。

- コンポーネントのAction属性の定数値は、常に同じ制御フロー・ケースをトリガーするアクション結果です。エンド・ユーザーがコンポーネントをクリックすると、その制御フロー・ケースに指定されているアクティビティが実行されます。代替の制御フローはありません。

- コンポーネントのAction属性の動的値はマネージドBeanまたはメソッドにバインドされます。メソッド・バインディングにより返される値によって、次に起動する制御フロー・ケースが決定されます。たとえば、メソッドはページ上でユーザー入力を検証し、入力が有効な場合はある値を返し、入力が無効な場合は別の値を返します。これらの異なるアクション値はそれぞれ別個のナビゲーション・ケースをトリガーするため、アプリケーションが移動可能なターゲット・ページは2つのいずれかになります。

詳細は、第5.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

また、ターゲット・ビュー・アクティビティに制御を渡す前に、値が必ずtrueになるEL式を記述できます。タスク・フローにある制御フロー・ケースの<if>子要素の値としてEL式を記述します。

例5-1および例5-2は、ビュー・アクティビティ間で制御を渡したときに行われる処理を示しています。

例5-1は、バインド・タスク・フローまたはバインドなしタスク・フローのXMLソース・ファイルに定義された制御フロー・ケースを示しています。

例5-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>

例5-2に示すように、Startビュー・アクティビティに関連付けられているMAF AMXページ上のボタンで、action属性としてtoOfficesが指定されます。エンド・ユーザーがボタンをクリックすると、制御フロー・メタデータでto-activity-idとして指定されたWesternOfficesアクティビティに制御フローが渡されます。

例5-2 ビュー・アクティビティで定義された静的ナビゲーション・ボタン

<amx:commandButton text="Go" id="b1" action="toOffices">

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

- 第5.2.5.1項「ビュー・アクティビティの追加」

- 第5.3.1.2項「MAF AMXページの作成」

前述のとおり、ビュー・アクティビティは、メタデータ内で実際のMAF AMXページと関連付けられており、タスク・フローに追加されるとこのページが表示されます。ビュー・アクティビティを追加するには、「コンポーネント」ウィンドウからドラッグ・アンド・ドロップします。実際のMAF AMXページを作成するには、「ダイアグラム」ウィンドウでビュー・アクティビティをダブルクリックして、表示されたダイアログでページの特性を定義します(図5-29「「MAF AMXページの作成」ダイアログ」を参照)。ビュー・アクティビティは、「アプリケーション」ウィンドウ内のMAF AMXファイルを概要エディタの「ダイアグラム」タブにドラッグ・アンド・ドロップして作成することもできます。

バインド・タスク・フローを作成する場合、特定のアクティビティをデフォルト・アクティビティとして指定できます(第5.2.12項「バインド・タスク・フローおよびバインドなしタスク・フローに関する必知事項」を参照)。これにより、バインド・タスク・フローが実行されるたびに、この特定のアクティビティが最初に実行されます。デフォルトでは、JDeveloperはタスク・フローに追加した最初のアクティビティをデフォルトにします。別のアクティビティに変更する場合は、「ダイアグラム」ウィンドウ内で該当するアクティビティを右クリックし、「アクティビティのマーク」→「デフォルト・アクティビティ」の順に選択します(図5-7を参照)。

図5-7 デフォルト・アクティビティの定義

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

EL式の実行時の評価に基づいて、ルーター・アクティビティを使用し、制御をアクティビティにルーティングします。

各制御フローは、異なるルーター・ケースに対応できます。各ルーター・ケースでは、次の要素を使用して、制御が次にルーティングされるアクティビティを選択します。

- expression: 実行時の値がtrueまたはfalseになるEL式
ルーター・アクティビティは、trueを返すEL式に対応する結果を返します。

- outcome: EL式がtrueに評価された場合にルーター・アクティビティから返される値
制御フロー・ケース上でルーター・ケースのoutcomeがfrom-outcomeと一致する場合は、制御フロー・ケースがポイントするアクティビティに制御が渡されます。ルーター・アクティビティのケースがいずれもtrueに評価されない場合、またはルーター・アクティビティのケースが指定されていない場合は、ルーターの「デフォルト結果」フィールドで指定されているoutcomeが使用されます(存在する場合)。

ルーティング条件をEL式で表現できる場合は、ルーター・アクティビティを使用することを検討してください。ルーター・アクティビティを使用すると、タスク・フローの条件に関するより多くの情報を示すことができます。

ルーター・アクティビティをダイアグラム上にドラッグすると、「プロパティ」ウィンドウを使用して式を作成し、その式の評価によりどの制御フロー・ルールに従うかを決定できます。「プロパティ」ウィンドウを使用して、ルーター・アクティビティの「アクティビティID」および「デフォルト結果」を構成し、ルーター・ケースをルーター・アクティビティに追加します。

「アクティビティID」属性を定義する際は、タスク・フローのソース・ファイル内にルーター・アクティビティを識別する値を記述します。

「デフォルト結果」属性を定義する際は、いずれの制御フロー・ケースの値もtrueに評価されない場合、または制御フロー・ケースが指定されていない場合に、ルーター・アクティビティが制御を渡すアクティビティを指定します。

追加するルーター・ケースごとに、図5-48に示す「ケース」セクションで「追加」(+)をクリックして、値を指定します。

図5-8 ルーター・アクティビティの構成

- 式: 実行時の値がtrueまたはfalseになるEL式。
たとえば、ビュー・アクティビティの入力テキスト・フィールドにある値を参照するには、次のようなEL式を記述します。

#{pageFlowScope.value=='view2'}

このEL式がtrueを返すと、「結果」フィールドで指定した結果がルーター・アクティビティによって呼び出されます。

- 結果: 「式」で指定したEL式がtrueを返す場合にルーター・アクティビティによって呼び出される結果。
タスク・フロー・ダイアグラムの結果ごとに制御フロー・ケースまたはワイルドカード制御フロー・ルールを作成します。たとえば、制御フロー・ケースの結果ごとに、対応するfrom-outcomeがあることを確認します。

ルーター・アクティビティを使用して制御フローを構成すると、JDeveloperによって、ルーター・アクティビティのプロパティに指定した値に基づいて、値がタスク・フローのソース・ファイルに書き込まれます。

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

メソッド・コール・アクティビティをダイアグラム上にドラッグすると、「プロパティ」ウィンドウを使用して、コールするメソッドを構成できます。

メソッド・コール・アクティビティを使用して、アプリケーション機能の制御フロー内のどこからでもMAF AMXアプリケーション機能ロジックを起動する、カスタム・メソッドまたは組込みメソッドをコールします。ページ表示前の初期化、ページ終了後のクリーンアップ、例外処理などのタスクを実行するメソッドを指定できます。

制御フロー・ケースを指定してメソッドの終了後に制御を渡すメソッドに対して結果を設定できます。結果は次のいずれかとして指定できます。

- fixed-outcome: 正常完了時に、メソッドから常に戻される単一の結果(例: success)。メソッドが正常に完了しないと結果は戻されません。メソッド・タイプがvoidの場合、to-stringではなくfixed-outcomeを指定する必要があります。
この結果を定義するには、「プロパティ」ウィンドウで「固定結果」フィールドを設定します(図5-9を参照)。

- to-string: trueとして指定した場合、メソッドによって戻されたJavaオブジェクトに対してtoString()メソッドがコールされ、それに基づく結果が得られます。たとえば、toStringメソッドからeditBasicInfoが戻された場合、ナビゲーションはeditBasicInfoという名前の制御フロー・ケースに移動します。
この結果を定義するには、「プロパティ」ウィンドウで「toString()」フィールドを設定します(図5-9を参照)。

「データ・コントロール」ウィンドウからタスク・フロー・ダイアグラム内のメソッド・コール・アクティビティにデータ・コントロール操作を直接ドロップして、メソッド・コール・アクティビティを既存のメソッドに関連付けることができます。また、メソッドおよび操作をタスク・フロー・ダイアグラムに直接ドラッグすることもできます。これを行うと、新しいメソッド・コール・アクティビティが自動的に作成されます。メソッドにEL式およびその他のオプションを指定できます。

デフォルト値を変更する場合は、「アクティビティID」フィールドでそのアクティビティ識別子を変更して、メソッド・コールを構成します。新規の値を入力すると、ダイアグラムのメソッド・コール・アクティビティの下に新しい値が表示されます。

「メソッド」フィールドには、コールするメソッドを識別するEL式を入力します。EL式内のバインディング変数は現在のバインディング・コンテナからバインディングを参照することに注意してください。バインディング変数を指定するには、バインディング・コンテナ定義またはページ定義を指定する必要があります。詳細は、第5.3.2.4.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

図5-9 メソッド・コール・アクティビティの構成

式ビルダーを使用してメソッドのEL式を作成することもできます。

- 「メソッド」フィールドのプロパティ・エディタから、「メソッド式ビルダー」を選択します。

- 「式ビルダー」ダイアログで、起動するメソッドにナビゲートして選択します。
メソッド・コール・アクティビティでマネージドBeanメソッドを起動する場合は、ダイアログでメソッド・コール・アクティビティをダブルクリックします。これによってダイアログが呼び出され、そこで起動するマネージドBeanメソッドを指定できます。

メソッドのパラメータおよび戻り値を指定するには、「プロパティ」ウィンドウの「パラメータ」セクションを使用します(図5-9を参照)。メソッド・コール・アクティビティを既存のメソッドに関連付けることによってパラメータをまだ作成していない場合は、「追加」(+)をクリックして次のように設定することにより、パラメータを追加します。

- クラス: パラメータ・クラスを入力します。たとえば、java.lang.Doubleと入力します。

- 値: パラメータの値を取得するEL式を入力します。次に例を示します。

#{pageFlowScope.shoppingCart.totalPurchasePrice}

- 戻り値: メソッドの戻り値を格納する場所を識別するEL式を入力します。次に例を示します。

#{pageFlowScope.Return}

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

タスク・フロー・コール・アクティビティを使用して、バインドなしタスク・フロー(第5.2.12.1項「バインドなしタスク・フロー」を参照)またはバインド・タスク・フロー(第5.2.12.2項「バインド・タスク・フロー」を参照)からバインド・タスク・フローをコールできます。このアクティビティによって、同じMAF AMXアプリケーション機能内または別のMAF AMXアプリケーション機能にあるバインド・タスク・フローをコールできます。

コールされたバインド・タスク・フローでは、デフォルト・アクティビティが最初に実行されます。バインド・タスク・フロー・コールの数に制限はありません。たとえば、コール先のバインド・タスク・フローから別のバインド・タスク・フローをコールでき、さらにそこから次々にコールできるため、各タスク・フローが一連のタスク内のリンクとなっている連鎖タスク・フローが作成されます。

バインド・タスク・フローにパラメータを渡すには、タスク・フロー・コール・アクティビティに入力パラメータの値を指定する必要があります。これらの値は、コール先のバインド・タスク・フローの入力パラメータ定義と一致している必要があります。詳細は、第5.2.5.4.2項「タスク・フロー・コール・アクティビティへの入力パラメータの指定」を参照してください。

注意:

タスク・フロー・コール・アクティビティの入力パラメータの値は、コール元のタスク・フロー内で値を取得する場所を指定します。

コール先のタスク・フローの入力パラメータ定義の値は、値が渡されたときにコール先のバインド・タスク・フロー内で値を格納する場所を指定します。

注意:

バインド・タスク・フローがタスク・フロー・コール・アクティビティに関連付けられると、バインド・タスク・フローで設定されている入力パラメータ定義に基づいて、自動的に入力パラメータがタスク・フロー・コール・アクティビティに挿入されます。したがって、実行する必要があるのは、タスク・フロー・コール・アクティビティの入力パラメータへの値の割当てのみです。

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

バインド・タスク・フローからコール元に戻り値が渡される方法は、入力パラメータが渡される方法と類似しています。詳細は、第5.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照してください。

タスク・フロー・コール・アクティビティを使用するには:

1. タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールします(第5.2.5.4.1項「タスク・フロー・コール・アクティビティを使用したバインド・タスク・フローのコール」を参照)。

2. パラメータをバインド・タスク・フローに渡す場合は、入力パラメータをタスク・フロー・コール・アクティビティに指定します(第5.2.5.4.2項「タスク・フロー・コール・アクティビティへの入力パラメータの指定」を参照)。

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

コール側のバインドまたはバインド・タスク・フローまたはバインドなしタスク・フローにタスク・フロー・コール・アクティビティを追加し、バインド・タスク・フローをコールします。

バインド・タスク・フローをコールする手順:

1. 「ダイアグラム」ビューで、バインド・タスク・フロー・ファイルを開きます。

2. 「コンポーネント」ウィンドウで、「コンポーネント」→「アクティビティ」を選択します。

3. タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

4. 次のオプションのいずれかを選択して、コール先タスク・フローを識別します。

- 新しくドロップしたタスク・フロー・コール・アクティビティをダブルクリックして、新しいバインド・タスク・フローの設定を定義するための「MAFタスク・フローの作成」を開きます(図5-2「MAFタスク・フローの作成」ダイアログを参照)。

- 「アプリケーション」ウィンドウから既存のバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップします。

- 起動するバインド・タスク・フローの名前がわかっている場合は、次の手順を実行します。

1. 「ダイアグラム」ビューで、タスク・フロー・コール・アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストから「静的」を選択します。

3. 「ドキュメント」フィールドに、コールするバインド・タスク・フローのソース・ファイル名を入力します。

4. 「ID」フィールドには、コール先のバインド・タスク・フローのXMLソース・ファイルに含まれているバインド・タスク・フローIDを入力します(図5-10を参照)。

図5-10 バインド・タスク・フローを起動するタスク・フロー・コール・アクティビティ

- 起動するバインド・タスク・フローの名前がわからない場合、実行時のエンド・ユーザーによって異なる場合は、次の手順を実行します。

1. 「ダイアグラム」ビューで、タスク・フロー・コール・アクティビティを選択します。

2. 「プロパティ」ウィンドウで、「一般」セクションを開き、「タスク・フロー参照」リストから「動的」を選択します。

3. 式ビルダーを使用して、「動的タスク・フロー参照」プロパティ・フィールドの値を設定します。実行時に起動するバインド・タスク・フローのIDを識別するEL式を記述します。

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

タスク・フロー・コール・アクティビティとそのコール先のバインド・タスク・フローの間でパラメータをマップするには、まずコール先のバインド・タスク・フローの入力パラメータ定義を指定する方法をお薦めします。その後、「アプリケーション」ウィンドウからバインド・タスク・フローをドラッグし、タスク・フロー・コール・アクティビティにドロップできます。タスク・フロー・コール・アクティビティの入力パラメータは、バインド・タスク・フローの入力パラメータ定義に基づいて自動的に作成されます。詳細は、第5.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

当然ながら、最初にタスク・フロー・コール・アクティビティに入力パラメータを指定することも可能です。最初に定義した場合にも、コール先のバインド・タスク・フローの入力パラメータ定義がタスク・フロー・コール・アクティビティに関連付けられた時点で、その入力パラメータ定義に基づいて自動的に置換されます。

コール先のバインド・タスク・フローをまだ作成していない場合にも、タスク・フロー・コール・アクティビティに入力パラメータを指定する方法は便利です。この時点で指定することで、バインド・タスク・フローのコール時にタスク・フロー・コール・アクティビティが最終的にマップされる予定の入力パラメータを特定できます。

入力パラメータを指定するには:

1. 「ダイアグラム」ビューで、タスク・フロー・ファイルを開き、タスク・フロー・コール・アクティビティを選択します。

2. 「プロパティ」ウィンドウで「パラメータ」セクションを開き、「追加」(+)をクリックして、「入力パラメータ」リストで次のように新しい入力パラメータを指定します。

- 名前: 入力パラメータを識別する名前を入力します。

- 値: パラメータ値を識別するEL式を入力します。EL式は、コール元のタスク・フロー内で値を取得する場所を指定します。たとえば、次のようにEL式を入力します。

#{pageFlowScope.callingTaskflowParm}

デフォルトでは、すべてのオブジェクトは参照渡しされます。プリミティブ型(int、long、booleanなど)は常に値で渡されます。

3. 入力パラメータを指定すると、対応する入力パラメータ定義をコール先のバインド・タスク・フローに指定できます。詳細は、第5.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」を参照してください。

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

タスク・フロー・リターン・アクティビティは、MAF AMXアプリケーション機能の制御フロー内で、バインド・タスク・フローが完了してコール元に制御フローが戻される場所を識別します。タスク・フロー・リターン・アクティビティは、バインド・タスク・フロー内でのみ使用できます。

タスク・フロー・リターン・アクティビティ・アイコンを囲むグレーの円は、そのアクティビティがバインド・タスク・フローの終了ポイントであることを示します。各バインド・タスク・フローには、0以上のタスク・フロー・リターン・アクティビティを指定できます。

各タスク・フロー・リターン・アクティビティには、コール元のタスク・フローに戻されるoutcomeを指定します。

起動するタスク・フローに戻されるoutcomeは、エンド・ユーザー・アクションによって異なります。起動元のタスク・フローによって次のアクションを決定するように、起動元のタスク・フローの制御フロー・ケースを構成できます。制御フロー・ケースの「結果(自)」プロパティをタスク・フロー・リターン・アクティビティのoutcomeからの戻り値に設定し、結果に基づくアクションを起動します。これにより、コール先タスク・フローからの戻り値に基づいて制御フローが決まります。

タスク・フロー・リターン・アクティビティを追加するには:

1. 「ダイアグラム」ビューで、バインド・タスク・フロー・ファイルを開きます。

2. 「コンポーネント」ウィンドウで、「コンポーネント」→「アクティビティ」を選択します。

3. タスク・フロー・リターン・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

4. 「プロパティ」ウィンドウ(図5-11を参照)で、「一般」セクションを開き、「名前」フィールドに結果を入力します。
タスク・フロー・リターン・アクティビティは、現在のバインド・タスク・フローが存在する場合に、この結果をコール元タスク・フローに返します。タスク・フロー・リターン・アクティビティごとに1つのみ結果を指定できます。コール元のタスク・フローには、戻された時点の制御フローを処理する制御フロー・ルールを定義する必要があります。詳細は、第5.2.6項「制御フローの定義方法」を参照してください。

5. 「動作」セクションを開き、「再入力」リストでいずれかのオプションを選択します。
バインド・タスク・フローにreentry-not-allowedを指定した場合も、エンド・ユーザーはモバイル・デバイスの戻るボタンをクリックするとバインド・タスク・フロー内のページに戻ることができます。ただし、エンド・ユーザーがそのページでボタンのアクティブ化などのなんらかの操作を行うと、バインド・タスク・フローを不正に再開したことを示す例外(InvalidTaskFlowReentryなど)がスローされます。

6. 「トランザクションの終了」ドロップダウン・リストから、次のいずれかのオプションを選択します。

- コミット: 選択すると、既存のトランザクションをデータベースにコミットします。

- ロールバック: 選択したトランザクションをコール先のタスク・フローの以前のエントリまでロールバックします。これを指定すると、新しいトランザクションはバインド・タスク・フローに入って開始された当初の状態までロールバックされるため、トランザクションを取り消すのと同じ効果があります。
commitとrollbackのいずれも指定しないと、トランザクションはコール元のバインド・タスク・フローによって閉じられるまで開いたままになります。

図5-11 タスク・フロー・リターン・アクティビティの構成

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

ページ定義ファイルは、実行時にデータを移入するバインディング・オブジェクトを定義します。通常、MAF AMXアプリケーション機能で、ページUIコンポーネントをデータ・コントロールにバインドするために使用されます。次のタスク・フロー・アクティビティも、ページ定義ファイルを使用してデータ・コントロールにバインドできます。

- メソッド・コール: 「データ・コントロール」ウィンドウからタスク・フローにデータ・コントロール操作をドラッグ・アンド・ドロップして、メソッド・コール・アクティビティを作成したり、既存のメソッド・コール・アクティビティにドロップすることができます。いずれの場合も、メソッド・コール・アクティビティが、データ・コントロール操作にバインドされます。

- ルーター: ページ定義ファイルをルーター・アクティビティと関連付けることで、バインディング・コンテナが作成されます。このバインド・コンテナは実行時にルーター・アクティビティ・ケースのEL式を評価し、ルーター・アクティビティが正しいバインド値を参照していることを確認します。各ルーター・アクティビティ・ケースは、EL式がtrueに評価された場合に戻される結果を指定します。そのため、ページ定義ファイルには、trueまたはfalseの評価結果となるデータ・コントロール操作だけを追加します。

- タスク・フロー・コール: ページ定義ファイルをタスク・フロー・コール・アクティビティと関連付けることで、バインディング・コンテナが作成されます。実行時にタスク・フロー・コール・アクティビティから入力パラメータが渡されると、バインド・コンテナが起動します。バインド・コンテナはタスク・コール元のタスク・フローからコール先のタスク・フローに入力パラメータが渡される際に、フロー・コール・アクティビティがバインド値を参照する場合は、正しい値を参照していることを確認します。

- ビュー: ビュー・アクティビティをページ定義ファイルと直接関連付けることはできません。かわりに、ビュー・アクティビティが参照するページを関連付けます。

タスク・フローの「ダイアグラム」ウィンドウで、前述のタスク・フロー・アクティビティ(ビュー・アクティビティを除く)のいずれかを右クリックすると、ページ定義ファイルが存在しない場合にページ定義ファイルを作成できるオプションがポップアップ・メニューに表示されます。ページ定義ファイルが存在する場合、JDeveloperではページ定義ファイルに移動するためのすべてのタスク・フロー・アクティビティのポップアップ・メニュー・オプションが表示されます(第5.3.1.5項「ページ定義ファイルへのアクセス」を参照)。また、ページ定義ファイルに関連付けられたメソッド・コール・アクティビティを右クリックすると、JDeveloperで「バインディングの編集」ポップアップ・メニュー・オプションが表示されます。

ページ定義ファイルに関連付けられたタスク・フロー・アクティビティでは、タスク・フロー・アクティビティ・アイコンの右下にアイコンが表示されます。

タスク・フロー・アクティビティにページ定義ファイルを関連付けるには:

1. 「ダイアグラム」ビューで、ページ定義ファイルを作成するタスク・フロー・アクティビティを右クリックし、ポップアップ・メニューから「ページ定義の作成」を選択します。

2. 作成されたページ定義ファイルに、タスク・フロー・アクティビティの実行時に参照させたいバインドを追加します。

ページ定義ファイルの詳細は、第5.3.2.4.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

前述の手順を完了すると、デザインタイムに、タスク・フロー・アクティビティのページ定義ファイルがJDeveloperによって生成されます。ページ定義ファイルのファイル名は、元のタスク・フローと、タスク・フロー・アクティビティ名または起動するデータ・コントロール操作から構成されます。JDeveloperは作成されたページ定義ファイル内で、タスク・フロー・アクティビティからバインドへのEL式も生成します。実行時にバインディング・コンテナは、タスク・フロー・アクティビティのEL式が正しい値を参照していることを確認します。

5.2.6 制御フローの定義方法

MAF AMXアプリケーション機能内で制御フローを定義するには、次のタスク・フロー・コンポーネントを使用します。

- 制御フロー・ケース(第5.2.6.1項「制御フロー・ケースの定義」を参照)

- ワイルドカード制御フロー・ルール(第5.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照)

5.2.6.1 制御フロー・ケースの定義

制御がアクティビティから次のアクティビティに渡される方法を指定する制御フロー・ケース・コンポーネントを使用してナビゲーションを作成できます。制御フローを作成するには、「コンポーネント」ウィンドウから「制御フロー・ケース」を選択します。次に、制御フロー・ケースをソース・アクティビティに接続し、さらにターゲット・アクティビティに接続します。ソースおよびターゲット・アクティビティを接続すると、JDeveloperでは、次のものが作成されます。

- control-flow-rule: from-activity-idを使用してソース・アクティビティを識別します。

- control-flow-case: to-activity-idを使用してターゲット・アクティビティを識別します。

MAFタスク・フロー・ダイアグラムで制御フロー・ケースを直接定義するには:

1. 「ダイアグラム」ビューで、タスク・フロー・ソース・ファイルを開きます。

2. 「コンポーネント」ウィンドウから「制御フロー・ケース」を選択します。

3. ダイアグラムで、ソース・アクティビティをクリックし、次にターゲット・アクティビティをクリックします。ダイアグラムに制御フロー・ケースが追加されます。アクティビティ間に追加された各線は、制御フロー・ケースを表します。from-outcomeには、MAF AMX UIコンポーネントのaction属性に指定された値と照合される値が含まれています。

4. from-outcomeを変更するには、ダイアグラムの制御フローの隣のテキストを選択します。デフォルトでは、これはワイルドカード文字です。

5. from-activity-id(ソース・アクティビティの識別子)やto-activity-id(ターゲット・アクティビティの識別子)を変更するには、ダイアグラムの矢印のどちらかの端を新規のアクティビティにドラッグします。

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

MAFタスク・フローでは、後方ワイルドカード(foo*)や単一ワイルドカード文字を含む制御フローfrom-activity-idを表すワイルドカード制御フロー・ルールがサポートされています。ワイルドカード制御フロー・ルールは、「コンポーネント」ウィンドウからドラッグ・アンド・ドロップすることにより、バインドなしタスク・フローまたはバインド・タスク・フローに追加できます。ワイルドカード制御フロー・ルールを構成するには、「プロパティ」ウィンドウを使用します。

ワイルドカード制御フロー・ルールを追加するには:

1. 「ダイアグラム」ビューで、タスク・フロー・ソース・ファイルを開きます。

2. 「コンポーネント」ウィンドウで「ワイルドカード制御フロー・ルール」を選択して、ダイアグラムにドロップします。

3. 「コンポーネント」ウィンドウで、「制御フロー・ケース」を選択します。

4. タスク・フロー・ダイアグラムで、制御フロー・ケースをワイルドカード制御フロー・ルールから(任意のアクティビティ・タイプの)ターゲット・アクティビティにドラッグします。

5. デフォルトでは、ワイルドカード制御フロー・ルールの後のラベルは*です。これは、「アクティビティID(自)」要素の値です。この値を変更するには、ダイアグラムでワイルドカード制御フロー・ルールを選択します。ワイルドカード制御フロー・ルールの「プロパティ」ウィンドウで、 「アクティビティID(自)」フィールドに新しい値を入力します。便利な規則は、ワイルドカード制御フロー・ルールをその目的を表す形式でキャストすることです。たとえば、project*と入力します。新しいラベルでは、ワイルドカードは後続の文字である必要があります。

ヒント:

タスク・フロー・ダイアグラムの概要エディタで、「アクティビティID(自)」の値も変更できます。

6. オプションで、「プロパティ」ウィンドウで、「動作」セクションを開き、「If」フィールドにEL式を記述します(このEL式がtrueに評価されると、「アクティビティID(至)」にで指定されたアクティビティに制御が渡されます)。

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

例5-3に、タスク・フロー・ソース・ファイルの制御フロー・ルール要素の一般的な構文を示します。

例5-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名と一致します。メタデータに(後方ワイルドカードではなく)単一のワイルドカード文字を指定すると、ダイアグラムで、制御フローが自動的にワイルドカード制御フロー・ルール・アクティビティに変換されます。詳細は、第5.2.6.2項「ワイルドカード制御フロー・ルールの追加」を参照してください。

- control-flow-case: 制御フロー・ルールの各ケースの必須ラッパー要素。それぞれのケースで、同じソース・アクティビティに対して異なる制御フローを定義します。制御フロー・ルールには、少なくとも1つの制御フロー・ケースが必要です。

- from-action: 指定されたアクション・メソッドからの結果にのみルールの適用を制限するオプション要素。アクション・メソッドは、ELバインディング式(#{backing_bean.cancelButton_action}など)として指定されます。
例5-3では、結果が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要素によって識別されたアクティビティに制御フローを渡します。

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

実行時、タスク・フローは、最も具体的な一致から最も具体的でない一致まで制御フロー・ルールを評価して、アクティビティ間の次の遷移を決定します。評価は次の優先度に基づいて行われます。

1. from-activity-id、from-action、from-outcome: 最初に3つの要素すべてで一致の検索が実行されます。

2. from-activity-id、from-outcome: 3つの要素すべてで一致が見つからなかった場合は、これらの要素で検索が実行されます。

3. from-activity-id: 前述の組合せでの検索で一致が見つからなかった場合、この要素のみで検索が実行されます。

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

図5-12に示すタスク・フロー例では、アクション結果の値に基づいて、viewA→viewB→viewDまたはviewA→viewC→viewDという2つの別のパスを経由してviewDに到達する可能性があります(第5.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照)。

図5-12 戻るナビゲーションのあるタスク・フロー

どちらのナビゲーション・パスを経由したかを追跡した後、__backナビゲーション・フローを直接実装することも理論的には可能ですが、特に、モバイル・デバイスでは画面領域が限られているためにナビゲーション順序に従わない遷移が非常に頻繁に起こる事実を考慮すると、手間がかかり、エラーも発生しやすくなります。MAFでは、組込みの__backナビゲーションがサポートされているため、タスク・フロー全体にわたる後方移動が可能です。つまり、経由したパスに関する情報を適用することにより、同じパスを経由する後方ナビゲーションを実行します。たとえば、最初のナビゲーションがviewA→viewC→viewDというパスで行われた場合、ViewDで__backオプションを実行すると、MAFは自動的に、ViewB経由ではなくViewAからViewCにエンド・ユーザーを移動します。

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

- 第5.2.3項「ViewController-task-flow.xmlファイルに関する必知事項」

- 第5.2.10項「マネージドBeanの作成および参照方法」

- 第6.3.5.7項「戻るボタン・ナビゲーションの有効化」

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

ナビゲーション・ドラッグ動作の操作を使用することによって、異なるMAF AMXページ間のナビゲーションを有効にできます。詳細は、第6.3.26項「ドラッグ・ナビゲーションを有効にする方法」を参照してください。

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

「プロパティ」ウィンドウを使用して、次のUIコンポーネントのいずれかのaction属性を該当する制御フロー・ケースfrom-outcomeに設定して次のタスク・フロー・アクティビティに導くことにより、アクション結果を指定できます。

- コマンド・ボタン(第6.3.5項「ボタンの使用方法」を参照)

- コマンド・リンク(第6.3.6項「リンクの使用方法」を参照)

- リスト・アイテム

UIコンポーネントの「アクション」フィールド(図5-13を参照)を使用して、特定のMAF AMXページの1つ以上のタスク・フローで定義される可能性のあるアクション結果のリストから選択を行います。

図5-13 アクションの設定

戻るアクション(__back)は、各リストに自動的に追加され、前に参照したページへのナビゲーションを可能にします。

注意:

MAF AMXページは、バインド・タスク・フローとバインドなしタスク・フローの両方で参照でき、その場合、両方のタスク・フローからのアクション結果が「アクション」選択リストに含まれます。

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

MAFアプリケーションでマネージドBeanを作成および使用して、追加データを格納したり、カスタム・コードを実行することができます。JDeveloperの通常の編集メカニズムを使用して、マネージドBeanを参照したり、適用可能なフィールドに対してマネージドBeanへの参照を作成できます。詳細は、第7.4項「マネージドBeanの作成と使用」を参照してください。

図5-14に、「プロパティ」ウィンドウのactionプロパティに対する「編集」オプションを示します。このオプションをクリックすると、図5-15に示す「プロパティの編集」ダイアログが表示されます。

図5-14 「編集」ダイアログ

図5-15 アクションの「プロパティの編集」ダイアログ

表5-7には、「プロパティ」ウィンドウで「編集」オプションを選択できるMAF AMX属性がリストされています。

表5-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

その他のどのプロパティに対しても「編集」をクリックすると同様のダイアログが表示されますが、図5-16に示すように「アクション結果」オプションはありません。

図5-16 アクション・リスナーの「プロパティの編集」ダイアログ

このダイアログは、マネージドBeanを作成するか、actionプロパティに使用可能なアクション結果を選択できることを示しています。

図5-15に示す「アクション結果」リストには、特定のMAF AMXページが属するすべてのタスク・フローからのアクション結果が含まれています。また、このリストには、前に参照したページに戻るための__backナビゲーション結果が含まれています(詳細は第5.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください)。ページがタスク・フローの一部ではない場合、__backが「アクション結果」リストで使用可能な唯一の結果です。使用可能なアクション結果のいずれかを選択し、「OK」をクリックすると、アクション・プロパティ値は、適切なEL式(commandButtonの場合、次のとおり)で更新されます。

<amx:commandButton action="goHome"/>

「メソッド・バインディング」オプション(図5-15を参照)では、新しいマネージドBeanクラスを作成したり、既存のマネージドBeanクラスを選択することができます。

新しいマネージドBeanクラスを作成するには:

1. 「マネージドBean」フィールドの横にある「新規」をクリックし、図5-17に示す「マネージドBeanの作成」ダイアログを開きます。

図5-17 「マネージドBeanの作成」ダイアログ・ボックス

MAFでは、次のスコープがサポートされています。

- application

- view

- pageFlow

MAFアプリケーションまたはMAF AMXアプリケーション機能に対してマネージドBeanを宣言すると、マネージドBeanはインスタンス化されて適切なスコープ内で識別され、Beanのプロパティが解決されてそのメソッドがELを介してコールされます。詳細は、第7.3項「EL式の作成」を参照してください。

2. マネージドBeanおよびクラス名を指定し(図5-18を参照)、「OK」をクリックします。

図5-18 マネージドBean名およびクラスの設定

例5-4は、新たに作成されたマネージドBeanクラスを示しています。このMAF AMXページが含まれるタスク・フローが、Beanを参照するように更新されます。

例5-4 新しいマネージドBeanクラス

<managed-bean id="__3">
<managed-bean-name>MyBean</managed-bean-name>
<managed-bean-class>mobile.MyBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

注意:

特定のMAF AMXページがバインド・タスク・フローおよびバインドなしタスク・フローの一部である場合、これら両方のタスク・フローがマネージドBeanエントリで更新されます。

3. 「メソッド」フィールドの横にある「新規」をクリックして(図5-15および図5-16を参照)、図5-19に示す「メソッドの作成」ダイアログを開きます。

図5-19 「メソッドの作成」ダイアログ

このダイアログを使用して、マネージドBeanメソッド名を指定します(図5-20を参照)。

図5-20 マネージドBeanメソッドのネーミング

完了すると、選択したプロパティ値が適切なEL式で更新されます(commandButtonの場合は次のようになります)。

<amx:commandButton action="#{MyBean.getMeHome}"/>

マネージドBeanクラスも、例5-5に示すとおり、新たに作成されたメソッドを含むように更新されます。

例5-5 マネージドBeanクラスの新しいメソッド

package mobile;

public class MyBean {
public MyBean() {
}

public String getMeHome() {
// Add event code here...
return null;
}
}

既存のマネージドBeanを選択するには:

1. 図5-21に示す「マネージドBean」リストから選択を行います。

図5-21 マネージドBeanの選択

アクション結果と同様、「マネージドBean」リストには、このMAF AMXページが含まれるすべてのタスク・フローからのマネージドBeanが移入されます。

注意:

MAF AMXページがどのタスク・フローにも属していない場合でも、マネージドBeanは作成できます。

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

- 第7.3.5.2項「マネージドBeanカテゴリについて」

- APIDemo (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているMAFサンプル・アプリケーション)。

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

タスク・フローでページ遷移スタイルを定義することにより、ビューから別のビューへのMAF AMXページの遷移方法を指定できます。MAF AMXページの遷移動作は次のとおりです。

- フェード・イン

- 左からスライド・イン

- 右からスライド・イン

- 下からスライド・アップ

- 上からスライド・ダウン

- 始点からスライド・イン

- 終点からスライド・イン

- 下からフリップ・アップ

- 上からフリップ・ダウン

- 左からフリップ

- 右からフリップ

- 始点からフリップ

- 終点からフリップ

- なし

始点および終点からスライド・インと、始点および終点からフリップは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点の遷移スタイルを使用することをお薦めします。

注意:

Androidプラットフォームでフリップを有効にすることはできません。

例5-6のようにcontrol-flow-case(制御フロー・ケース・コンポーネント)のtransition属性を変更することによって、遷移スタイルを設定します。

例5-6 遷移スタイルの設定

<control-flow-rule id="__1">
<from-activity-id>products</from-activity-id>
<control-flow-case id="__2">
<from-outcome>details</from-outcome>
<to-activity-id>productdetails</to-activity-id>
<transition>fade</transition>
</control-flow-case>
</control-flow-rule>

図5-22に示すように、「プロパティ」ウィンドウでは、transition属性は「動作」の下にあります。デフォルトの遷移スタイルはslideLeftです。

図5-22 「プロパティ」ウィンドウでの遷移スタイルの設定

ヒント:

タスク・フローを定義する際は、control-flow-caseのtransition値を論理的になるように指定する必要があります。たとえば、戻るナビゲーションの目的で左から右への遷移が発生する場合、右にスライドすることにより遷移が前のページに戻る必要があります。

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

タスク・フローでは、MAF AMXアプリケーション機能内で制御フローを定義するためのモジュールのアプローチが提供されています。アプリケーション機能は単一の大規模なページ・フローとして表すのではなく、再利用可能な一連のタスク・フローに分割できます。各タスク・フローには、アプリケーション機能のナビゲーション・グラフの一部が含まれます。タスク・フロー内のノードはアクティビティを表しています。アクティビティ・ノードは、ページの表示、アプリケーション・ロジックの実行、別のタスク・フローのコールなど、シンプルな論理的操作を表しています。アクティビティ間の遷移は制御フロー・ケースと呼ばれます。

MAF AMXでは、次の2種類のタスク・フローがあります。

1. バインドなしタスク・フロー: 対話によってユーザーがタスクを完了できるようにする一連のアクティビティ、制御フロー・ルールおよびマネージドBeanです。バインドなしタスク・フローは、バインド・タスク・フローに含まれていない、MAF AMXアプリケーション機能内のすべてのアクティビティおよび制御フローで構成されています。

2. バインド・タスク・フロー: タスク・フローの特殊な形式であり、バインドなしタスク・フローとは異なり、単一エントリ・ポイントが存在し、終了ポイントは存在しません。これには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。

バインドなしタスク・フローまたはバインド・タスク・フローに追加可能なアクティビティ・タイプの説明は、第5.2.2項「タスク・フロー・アクティビティと制御フローに関する必知事項」を参照してください。

通常のMAF AMXアプリケーション機能には、アプリケーション機能の作成時に作成された1つのバインドなしタスク・フローと、1つ以上のバインド・タスク・フローの組合せが含まれます。実行時、MAFアプリケーションは、バインドなしタスク・フローに追加されたアクティビティからバインド・タスク・フローをコールできます。

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

各MAF AMXアプリケーション機能には必ず、そのアプリケーション機能に対する1つ以上のエントリ・ポイントを提供するバインドなしタスク・フローが1つ含まれています。エントリ・ポイントはビュー・アクティビティによって表されます。デフォルトでは、バインドなしタスク・フローのソース・ファイルはadfc-mobile-config.xmlファイルです。

図5-23に、MAF AMXアプリケーション機能からのバインドなしタスク・フローのダイアグラムを示します。このタスク・フローにはいくつかのビュー・アクティビティが含まれており、いずれもアプリケーション機能へのエントリ・ポイントになっています。

図5-23 バインドなしタスク・フローのダイアグラム

次のことが該当する場合、バインドなしタスク・フローを使用することを検討してください。

- タスク・フローを別のタスク・フローによってコールする必要がない場合

- MAF AMXアプリケーション機能に複数のエントリ・ポイントがある場合

- 指定されたアクティビティをタスク・フロー内で最初に実行する(デフォルト・アクティビティ)必要がない場合

バインドなしタスク・フローはバインド・タスク・フローをコールできますが、別のタスク・フローからバインドなしタスク・フローをコールすることはできません。

5.2.12.2 バインド・タスク・フロー

デフォルトでは、IDEによって、バインド・タスク・フローのソース・ファイルのファイル名が提案されます(第5.2.1項「タスク・フローの作成方法」を参照)。このファイル名は、実行するタスクの目的を表す名前に変更できます。

バインド・タスク・フローからは別のバインド・タスク・フローをコールでき、さらにそこからも次々にコールできます。コールに深さ制限はありません。

図5-24に、MAF AMXアプリケーション機能からのバインド・タスク・フローのダイアグラムを示します。

図5-24 バインド・タスク・フローのダイアグラム

バインド・タスク・フローを作成する理由は次のとおりです。

- バインド・タスク・フローでは常に、バインド・タスク・フローの開始直後に実行する必要のある単一エントリ・ポイントとなるデフォルト・アクティビティが指定されます。

- 同じMAF AMXアプリケーション機能または他のMAF AMXアプリケーション機能内で再利用可能です。

- バインド・タスク・フロー内で使用するマネージドBeanはいずれも、ページ・フロー・スコープで指定できるため、残りのMAF AMXアプリケーション機能からは分離されます。これらのマネージドBean(およびページ・フロー・スコープ)は、タスク・フローが完了した際に自動的に解放されます。

バインド・タスク・フローの主な特性の概要を次に示します。

- 明確に定義された境界: バインド・タスク・フローは、プライベート制御フロー・ルール、アクティビティおよびマネージドBeanの独自のセットで構成されます。コール元は、バインド・タスク・フロー境界内におけるページ名、メソッド・コール、子バインド・タスク・フロー、マネージドBean、制御フロー・ルールの内部知識を必要としません。データ・コントロールはタスク・フロー間で共有できます。

- 単一のエントリ・ポイント: バインド・タスク・フローには、タスク・フロー内の他のすべてのアクティビティより前に実行されるデフォルト・アクティビティである単一のエントリ・ポイントがあります。

- ページ・フロー・メモリー・スコープ: バインド・タスク・フロー内のアクティビティ間でデータを受け渡すためのメモリー・スコープとして、ページ・フロー・スコープを指定できます。ページ・フロー・スコープは、バインド・タスク・フローの各インスタンスに対する一意の記憶域を定義します。その存続期間はバインド・タスク・フローであり、requestスコープより長く、sessionスコープより短くなっています。

- 指定可能: バインド・タスク・フローには、バインド・タスク・フローのXMLソース・ファイル内の一意の識別子とXMLソース・ファイルのファイル名を指定することによりアクセスできます。

- 再利用可能: アクティビティ・グループ全体を単一のエンティティ、つまりバインド・タスク・フローとして指定し、そのバインド・タスク・フローをMAFアプリケーション内の別のMAF AMXアプリケーション機能で再利用できます。
また、既存のバインド・タスク・フローは、コールすることにより再利用できます。

さらに、タスク・フロー・テンプレートを使用して、様々なバインド・タスク・フローで再利用するための共通の動作を取得できます。

- パラメータおよび戻り値: コール元は、入力パラメータをバインド・タスク・フローに渡し、そこから戻り値を受け入れることができます(第5.2.12.3.1項「バインド・タスク・フローへのパラメータ渡し」および第5.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照)。
また、バインド・タスク・フロー間でデータ・コントロールを共有できます。

- メタデータのオンデマンド・ロード: バインド・タスク・フローのメタデータは、バインド・タスク・フローの開始時にオンデマンドでロードされます。

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

タスク・フローには入力パラメータを受け入れてパラメータ値を戻す機能があるため、タスク・フローのデータを操作できる他、タスク・フロー間でデータを共有できます。これらの機能を使用して、MAF AMXアプリケーション機能でのタスク・フローの再利用を最適化できます。

図5-25に、pageFlowスコープ内のユーザーに関する情報を保持する入力パラメータ定義を指定するタスク・フローを示します。

図5-25 タスク・フローの入力パラメータ

タスク・フロー・コール・アクティビティを使用してバインド・タスク・フローをコールする場合、標準のEL式を使用してパラメータ値を指定できます。たとえば、次のEL式の構文を使用してパラメータを指定できます。

- #{bindings.bindingId.inputValue}

- #{CustomerBean.zipCode}

inputValueをEL式に追加することで、実際のバインディング・オブジェクトではなく、バインディングの値をパラメータに確実に割り当てることができます。

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

コール先のバインド・タスク・フローは、コール元のタスク・フローまたはタスク・フロー・バインディングから入力パラメータを受け取ることができます。

入力パラメータをバインド・タスク・フローに渡すには、次のうち1つ以上を指定します。

- コール元のタスク・フローにあるタスク・フロー・コール・アクティビティの入力パラメータ: 入力パラメータは、コール元のタスク・フローでパラメータ値が格納される場所を指定します。

- コール先のバインド・タスク・フローの入力パラメータ定義: 入力パラメータ定義は、コール先のバインド・タスク・フローで実行時にパラメータ値を取得できる場所を指定します。

コール元のタスク・フローにあるタスク・フロー・コール・アクティビティで定義する入力パラメータおよびコール先のバインド・タスク・フローの入力パラメータ定義と同じ名前を指定します。これを行うことで、コール先のバインド・タスク・フローに入力パラメータ値をマップできます。

入力パラメータの値を参照するEL式を指定しない場合は、valueのEL式のデフォルト値を実行時に次のように設定します。

#{pageFlowScope.parmName}

ここで、parmNameは、入力パラメータ名に入力した値です。

コール先のバインド・タスク・フローの入力パラメータ定義では、必要に応じて入力パラメータを指定できます。入力パラメータが実行時またはデザインタイムに値を受け取らない場合、タスク・フローは、そのタスク・フローを含むMAFアプリケーションのログ・ファイル内に警告を生成します。必要に応じて指定しない入力パラメータは、タスク・フロー・コール・アクティビティの作成時に無視できます。

タスク・フロー・コール・アクティビティを使用してタスク・フローをコールする場合は、タスク・フロー・コール・アクティビティの入力パラメータを参照渡しまたは値渡しにできます(第5.2.5.4.2項「タスク・フロー・コール・アクティビティへの入力パラメータの指定」を参照)。デフォルトでは、プリミティブ・タイプ(int、long、booleanなど)が値渡し(pass-by-value)されます。

コール先のタスク・フローは、終了時にコール元のタスク・フローに値を戻すことができます。詳細は、第5.2.12.3.2項「バインド・タスク・フローの戻り値の構成」を参照してください。

入力パラメータをバインド・タスク・フローに渡す場合、コール元のタスク・フローとコール先のタスク・フローの両方で値を定義します。

始める前に

- コール元のタスク・フローとコール先のタスク・フローを作成します。コール元のタスク・フローはバインド・タスク・フローにすることも、バインドなしタスク・フローにすることもできます。コール先のタスク・フローはバインドにする必要があります。タスク・フローの作成の詳細は、第5.2.1項「タスク・フローの作成方法」を参照してください。

- タスク・フロー・コール・アクティビティをコール元のタスク・フローに追加します。

図5-26には、ビュー・アクティビティがタスク・フロー・コール・アクティビティに制御を渡す例が示されています。

図5-26 コール元のタスク・フロー

入力パラメータをバインド・タスク・フローに渡すには:

1. エンド・ユーザーが実行時にバインド・タスク・フローにパラメータとして渡される値を入力する際に使用する入力コンポーネントを含むMAF AMXページを開きます。開いたMAF AMXページは、コール元のタスク・フローにあるビュー・アクティビティによって参照される必要があります。

2. MAF AMXページで、エンド・ユーザーが実行時に値を入力する入力テキスト・コンポーネントを選択します。

3. 「プロパティ」ウィンドウで、「共通」セクションを開き、「値」フィールドに入力テキスト・コンポーネントの値を入力します。
手動で、または式ビルダーを使用して、EL式としての値を指定できます(例: #{pageFlowScope.inputValue})。

4. 「アプリケーション」ウィンドウで、コールするタスク・フローをダブルクリックして開いた後、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

5. 「入力パラメータの定義」セクションで、「追加」(+)をクリックして新しいエントリを指定します(図5-25を参照)。

- 「名前」フィールドに、パラメータの名前(inputParm1など)を入力します。

- 「値」フィールドに、手動で、または式ビルダーを使用して、パラメータ値を格納および参照するEL式(#{pageFlowScope.inputValue}など)を入力します。

6. 「アプリケーション」ウィンドウで、コール先のバインド・タスク・フローを起動するタスク・フロー・コール・アクティビティを含むコール元タスク・フローをダブルクリックします。

7. 「アプリケーション」ウィンドウで、コール元のタスク・フローのダイアグラムにあるタスク・フロー・コール・アクティビティの最上部に、コール先のバインド・タスク・フローをドラッグ・アンド・ドロップします。これにより、バインド・タスク・フローへのタスク・フロー参照が自動的に作成されます。図5-27に示すように、タスク・フロー参照には次のものが含まれます。

- バインド・タスク・フローのID (id): バインド・タスク・フローのtask-flow-definition要素の属性

- IDを含むタスク・フローのソース・ファイルを指すドキュメント名

図5-27 タスク・フローの参照

8. タスク・フロー・コール・アクティビティの「プロパティ」ウィンドウで、「パラメータ」を開いて、「入力パラメータ」セクションを表示します。

- 入力パラメータを識別する名前の入力: 入力パラメータが定義されているタスク・フロー・コール・アクティビティにバインド・タスク・フローをドロップしたため、名前はすでに指定されています。同じ入力パラメータ名を維持する必要があります。

- パラメータ値(#{pageFlowScope.param1}など)の入力: タスク・フロー・コール・アクティビティの入力パラメータの値によって、コール元のタスク・フローでパラメータ値が格納される場所が指定されます。コール先のタスク・フローの入力パラメータ定義の値は、値が渡された後にコール先のバインド・タスク・フロー内で使用するために値が取得される場所を指定します。

実行時、コール先のタスク・フローは入力パラメータを使用できます。コール先のタスク・フローの入力パラメータ定義で値としてpageFlowScopeを指定した場合、コール先のバインド・タスク・フローのどこでもパラメータ値を使用できます。たとえば、コール先のバインド・タスク・フローのビュー・アクティビティにパラメータ値を渡すことができます。

完了すると、選択した値に基づいて、コール元のタスク・フローとコール先のタスク・フローのソース・ファイルにエントリが書き込まれます。

例5-7は、バインド・タスク・フローで指定された入力パラメータ定義を示しています。

例5-7 入力パラメータ定義

<task-flow-definition id="sourceTaskflow">
...
<input-parameter-definition>
<name>inputParameter1</name>
<value>#{pageFlowScope.parmValue1}</value>
<class>java.lang.String</class>
</input-parameter-definition>
...
</task-flow-definition>

例5-8は、例5-7に示したバインド・タスク・フローをコールするタスク・フロー・コール・アクティビティの入力パラメータ・メタデータを示しています。実行時に、タスク・フロー・コール・アクティビティはバインド・タスク・フローをコールして、そのvalue要素で指定された値を渡します。

例5-8 タスク・フロー・コール・アクティビティの入力パラメータ

<task-flow-call id="taskFlowCall1">
...
<input-parameter>
<name>inputParameter1</name>
<value>#{pageFlowScope.newCustomer}</value>
<pass-by-value/>
</input-parameter>
...
</task-flow-call>

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

コール先のタスク・フローにある戻り値の定義を構成し、実行時に戻り値を取得するコール元のタスク・フローのタスク・フロー・コール・アクティビティにパラメータを追加します。

始める前に

バインド・タスク・フローまたはバインドなしタスク・フローを(コール元のタスク・フローに対して)作成し、バインド・タスク・フローを(コール先のタスク・フローに対して)作成します。詳細は、第5.2.1項「タスク・フローの作成方法」を参照してください。

コール先のバインド・タスク・フローの戻り値を構成するには:

1. 「アプリケーション」ウィンドウで、コールするタスク・フローをダブルクリックして開いた後、ビューを「概要」タブに切り替え、「パラメータ」ナビゲーション・タブを選択します。

2. 「戻り値の定義」セクションで、「追加」(+)をクリックして戻り値を指定します(図5-25を参照)。

- 「名前」フィールドに、戻り値を識別する名前(returnValue1など)を入力します。

- 「クラス」フィールドに、戻り値のデータ型を定義するJavaクラスを入力します。デフォルト値はjava.lang.Stringです。

- 「値」フィールドに、手動で、または式ビルダーを使用して、戻り値を読み取る場所を指定するEL式(#{pageFlowScope.ReturnValueDefinition}など)を入力します。

3. 「アプリケーション」ウィンドウで、コール元のタスク・フローをダブルクリックします。

4. 「ダイアグラム」ビューでタスク・フロー・ページを開いた状態で、「コンポーネント」ウィンドウから「コンポーネント」→「アクティビティ」を選択し、タスク・フロー・コール・アクティビティをダイアグラムにドラッグ・アンド・ドロップします。

5. タスク・フロー・コール・アクティビティの「プロパティ」ウィンドウで、「パラメータ」セクションを開き、「戻り値」エントリの「追加」(+)をクリックして、戻り値を定義する次の値を追加します。

- 戻り値を識別する名前(returnValue1など)。これは、手順2で戻り値の定義を定義したときに「名前」フィールドに入力した値と一致している必要があります。

- 戻り値を格納する場所を指定する、EL式としての値(#{pageFlowScope.ReturnValueDefinition}など)。

完了すると、構成したコール元のタスク・フローのソース・ファイルにエントリが書き込まれます。

例5-9では、コール元のタスク・フローのソース・ファイルに対してJDeveloperで記述したエントリの例を示しています。

例5-9 戻り値を構成するためのコール元のタスク・フローのメタデータ

<task-flow-call id="taskFlowCall1">
<return-value id="__3">
<name id="__4">returnValue1</name>
<value id="__2">#{pageFlowScope.ReturnValueDefinition}</value>
</return-value>
</task-flow-call>

例5-10では、コール先のタスク・フローのソース・ファイルに対してJDeveloperで記述したエントリの例を示しています。

例5-10 戻り値を構成するためのコール先のタスク・フローのメタデータ

<return-value-definition id="__2">
<name id="__3">returnValue1</name>
<value>#{pageFlowScope.ReturnValueDefinition}/</value>
<class>java.lang.String</class>
</return-value-definition>

実行時に、コール先のタスク・フローが値を返します。この構成の場合は、コール元のタスク・フローにあるタスク・フロー・コール・アクティビティがその値を取得します。

5.3 ビューの作成

MAF AMXビューの作成は、次のことから開始できます。

- MAF AMXページ構造に関する理解(第5.3.1.1項「MAF AMXページ構造の解釈」)

- MAF AMXページの編集とプレビュー(第5.3.1.4項「UIエディタの使用方法」を参照)

- MAF AMXページへのコンポーネントのドラッグ・アンド・ドロップ(第5.3.2.1項「UIコンポーネントの追加」を参照)

- ビューへのデータ・コントロールの追加(第5.3.2.4項「データ・コントロールのビューへの追加」を参照)

5.3.1 MAF AMXページの使用方法

MAF AMXページはXMLファイルで表されます。

5.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>

データ可視化コンポーネント(第6.5項「データ視覚化の指定」を参照)を除き、UI要素は<amx>名前空間の下で宣言されます。

詳細は、第5.3.1.3項「MAF AMXページの作成時に行われる処理」を参照してください。

5.3.1.2 MAF AMXページの作成

MAF AMXファイルは、MAFアプリケーションのビュー・コントローラ・プロジェクトに含まれています。これらのファイルは、「MAF AMXページの作成」ダイアログを使用して作成します。

MAFでは、MAF AMXページの作成方法がこれ以外に2通りあります。

- 「新規ギャラリ」から

- 既存のタスク・フローから

始める前に

MAF AMXページを作成するには、MAFアプリケーションにビュー・コントローラ・プロジェクト・ファイルが含まれている必要があります(第3章「モバイル・アプリケーション開発のスタート・ガイド」を参照)。

「新規ギャラリ」からMAF AMXページを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」の順に選択します(図5-28を参照)。「OK」をクリックします。

図5-28 MAF AMXページの作成

3. 図5-29に示すように、「MAF AMXページの作成」ダイアログで、新しいファイルの名前および(必要な場合は)場所を入力します。

4. オプションで、ページ・レイアウトの一部としてどのファセットを新しいMAF AMXページに含めるかを選択することもできます。

- ヘッダー

- プライマリ

- セカンダリ

- フッター

詳細は、第5.3.1.3項「MAF AMXページの作成時に行われる処理」および第6.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

ファセットを選択または選択解除すると、変更されたページの外観を反映するよう、ページを表すイメージは動的に変わります。

図5-29 「MAF AMXページの作成」ダイアログ

注意:

ファセットの選択はMAFによって保持され、それ以降に「MAF AMXページの作成」ダイアログが開かれるたびにその選択が適用されます。

5. 「MAF AMXページの作成」ダイアログで、「OK」をクリックします。

タスク・フローのビュー・コンポーネントからMAF AMXページを作成するには:

1. ダイアグラマでタスク・フロー・ファイルを開きます(図5-6「タスク・フロー・エディタのダイアグラマ」、第5.2.1項「タスク・フローの作成方法」および第5.2.4項「MAFタスク・フロー・ダイアグラマに関する必知事項」を参照)。

2. タスク・フローのビュー・コンポーネントをダブルクリックして、図5-29に示す「MAF AMXページの作成」ダイアログを開き、新しいファイルの名前および(必要な場合は)場所を入力します。「OK」をクリックします。

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

「MAF AMXページの作成」ダイアログを使用してMAF AMXページを作成すると、JDeveloperによって物理ファイルが作成されて、ビュー・コントローラ・プロジェクトのWeb Contentディレクトリに追加されます。

図5-30に示す「アプリケーション」ウィンドウでは、「Webコンテンツ」ノードに、新たに作成されたdepartment.amxというMAF AMXファイルが含まれています。

図5-30 「アプリケーション」ウィンドウのMAF AMXファイル

JDeveloperは、コンポーネント・ライブラリをインポートし、ページを表示するために必要なコードの追加も行います。このコードは、図5-30に示す「ソース」エディタに表示されます。

図5-32に、ページの作成時に「MAF AMXページの作成」ダイアログの「ページ・ファセット」セクションにリストされたすべてのファセット・タイプを選択した場合に(図5-31を参照)、「プレビュー」ペインおよび生成されたMAF AMXコードがどのようになるかを示します。

図5-31 すべてのファセットが選択された「MAF AMXページの作成」ページ

図5-32 すべてのファセットが含まれるMAF AMXページ

すべてのファセットを選択して作成したページ(図5-31および図5-32を参照)では、次の点に注意してください。

- ヘッダーは出力テキスト・コンポーネントで作成されます。これはこのコンポーネントが通常ページ・タイトルに使用されるためです。

- プライマリおよびセカンダリのアクションは、ボタン・コンポーネントで作成されます。これは、これが通常のパターンであるためです。

- フッターの場合、1つだけ群を抜いているパターンはないため、デフォルトでは出力テキスト・コンポーネントで作成されます。これは、このコンポーネントがいくつかのパターンで使用されており、JDeveloperが監査違反のある初期コードを生成することを回避できるためです。

- ヘッダー・ファセットを追加せずにプライマリ・アクションまたはセカンダリ・アクションのいずれかを追加しても、ヘッダー・セクションは「MAF AMXページの作成」ダイアログの「ページ・ファセット」セクションに表示されます。

図5-33に、いずれのファセットも選択していない「MAF AMXページの作成」ページの「ページ・ファセット」セクションを示し、図5-34に、「プレビュー」ペインおよび生成されたMAF AMXコードを示します。

図5-33 ファセットが選択されていない「MAF AMXページの作成」ページ

図5-34 ファセットを含まないMAF AMXページ

5.3.1.4 UIエディタの使用方法

最初にJDeveloperに表示されるとき、ページは「ソース」エディタに表示されます。WYSIWYG環境でページを表示するには、「プレビュー」ペイン(「プレビュー」タブをクリックしてアクセスします)を使用します。

図5-35に、新たに作成されたdepartment.amxというMAF AMXページに対して選択された「プレビュー」タブを示します。まだMAF AMX UIコンポーネントやデータ・コントロールが移入されていないため、このページは空白です。

図5-35 新たに作成されたページの「プレビュー」ペイン

図5-35に示す「プレビュー」ペインのツールバーを使用すると、次のことができます。

- 「ページのリフレッシュ」をクリックすると、MAF AMXページの表示をリフレッシュできます。

- 「ページのロードを中止」をクリックすると、ページのロードを中止できます。

- ドロップダウンリストから別のフォーム・ファクタを選択すると、ページのフォーム・ファクタを変更できます。フォーム・ファクタの詳細は、第2.3.1.1項「フォーム・ファクタに応じた環境の構成」を参照してください。

- ドロップダウン・リストから別のパーセント値を選択すると、表示のスケーリングを変更できます。モバイル・デバイスは様々なサイズおよび密度で表示されるため、「プレビュー」ペインでは、MAF AMXページでのスケーリングの効果を確認できます。

注意:

スケーリングは縦と横の両方のモードで使用できます。

- 「縦向きの表示」または「横向きの表示」を選択することにより、表示の向きをそれぞれ横または縦に変更できます。

- 使用可能なアプリケーション機能のドロップダウン・リストから、MAF AMXページの機能コンテンツを選択します。デフォルトでは、「機能コンテンツが選択されていません」が表示されます。

ソース・エディタでページのソースを表示するには、図5-30 「「アプリケーション」ウィンドウのMAF AMXファイル」に示された「ソース」タブをクリックします。JDeveloperの左下部にある「構造」ウィンドウ(図5-30および図5-35を参照)には、ページが階層形式で表示されます。詳細は、第5.3.2.2項「「プレビュー」の使用方法」を参照してください。

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

MAF AMXでは、JDeveloperの「ページ定義に移動」機能がサポートされているため(図5-36および第5.3.2.4.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照)、バインディング情報をすばやく見つけて編集できるようにするポップアップ・メニューを使用することで、MAF AMXページ定義に移動できます。

図5-36 「ページ定義に移動」を使用してアクセスしたページ定義ファイル

次の場所から「ページ定義に移動」オプションを含むポップアップ・メニューを起動できます。

- ソース・エディタ(図5-37)

図5-37 「ソース」エディタからの「ページ定義に移動」

- 「アプリケーション」ウィンドウ(図5-38)

図5-38 「アプリケーション」ウィンドウからの「ページ定義に移動」

- 「構造」ウィンドウ(図5-39)

図5-39 「構造」ペインからの「ページ定義に移動」

さらに、図5-40のように、メイン・メニューの「ツール」→「プリファレンス」の下で定義されている「ページ定義に移動」ショートカット・キーを使用して、ページ定義ファイルを開くこともできます。

図5-40 「プリファレンス」から「ページ定義」を開く

5.3.1.6 ページ・コンテンツの共有

MAF AMXページのコンテンツの共有を有効にできます。フラグメント(fragment)は、MAF AMXページ要素の再利用可能な部分(属性やファセットなど)をテンプレートで表されるコンテンツに挿入できるようにする動的な宣言コンポーネントです。これにより、アプリケーション内の様々なページでフラグメント・テンプレートを再利用することで、アプリケーションのルック・アンド・フィールを標準化できます。

MAF AMXフラグメント・ファイル(.amxf)をMAF AMXページまたは別のフラグメント・ファイルにドラッグ・アンド・ドロップして、フラグメントへの参照を作成し、その属性を定義できます(第5.3.1.6.1項「フラグメント・コンテンツの構成」を参照)。フラグメント・ファイルはプロジェクト内部に存在し、「アプリケーション」ウィンドウからドロップできます。

始める前に

MAFアプリケーションにビュー・コントローラ・プロジェクトが含まれていることを確認してください。

ビュー・コントローラ・プロジェクトに、MAF AMXページも、ページの作成元のMAF AMXページ・タスク・フローも含まれない場合は、タスク・フロー・ダイアグラムで「表示」アイコンをダブルクリックするか、「新規ギャラリ」から「クライアント層」→「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」を選択することにより、「MAF AMXページの作成」ダイアログを起動できます(第5.3.1.2項「MAF AMXページの作成」を参照)。

「新規ギャラリ」からフラグメントを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「クライアント層」ノードを開き、「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ・フラグメント」の順に選択します(図5-41を参照)。「OK」をクリックします。

図5-41 新しいフラグメントの作成

3. 図5-42に示すように、「MAF AMXページ・フラグメントの作成」ダイアログに新しいフラグメントのファイル名と場所を入力します。「OK」をクリックします。

図5-42 「MAF AMXページ・フラグメントの作成」ダイアログ

ダイアログへの入力が完了すると、新しく作成したファイルがJDeveloperのソース・エディタ内に開きます(図5-43を参照)。

図5-43 フラグメント・ファイル

4. 「構造」ウィンドウで「フラグメント」を右クリックし、「フラグメントの中に挿入」を選択します。新しいフラグメントに移入する要素として、「属性」、属性リスト、「説明」、「ファセット」または「ポップアップ」を選択します(図5-44を参照)。

図5-44 フラグメントへの移入

5. 引き続き、「構造」ビューでフラグメントの子を右クリックして適切な値を選択することにより、フラグメントの「属性」および他の子を定義します(図5-45を参照)。

図5-45 フラグメントの属性の定義

フラグメントを定義するには、「コンポーネント」ウィンドウで「MAF AMXフラグメント」を選択して、その要素をMAF AMXフラグメント・ファイルにドラッグ・アンド・ドロップする方法もあります(図5-46を参照)。

図5-46 フラグメント要素のドラッグ・アンド・ドロップ

例5-11は、fragment1.amxfという名前のMAF AMXフラグメント・ファイルを示しています。

例5-11 フラグメント定義

<amx:fragmentDef
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<fragment xmlns="http://xmlns.oracle.com/adf/mf/amx/fragment" id="f1">
<description id="d1">Description of the fragment</description>
<facet id="f2">
<description id="d4">Description of the facet</description>
<facet-name id="f3">facet1</facet-name>
</facet>
<attribute id="a1">
<description id="d2">Description of an attribute</description>
<attribute-name id="a2">text</attribute-name>
<attribute-type id="at1">String</attribute-type>
<default-value id="d3">defaultValue</default-value>
</attribute>
</fragment>
<amx:panelGroupLayout id="pgl1">
<amx:facetRef facetName="facet1" id="fr1"/>
<amx:outputText value="#{text}" id="ot1"/>
</amx:panelGroupLayout>
</amx:fragmentDef>

フラグメントのコンテンツをMAF AMXページに含めるには、フラグメント・コンポーネントを作成し(第6.2.13項「フラグメント・コンポーネントの使用方法」を参照)、そのsrc属性を任意のフラグメント・ファイルに設定します。例5-12は、MAF AMXページに追加されたfragment要素を示しています。この要素は、そのページ・コンテンツとしてfragment1.amxfを指しています。同時に、ファセット定義MAF AMXコンポーネントに対応するfacetRef要素は、そのfacet (MAF AMXファセット・コンポーネント)としてfacet1を指しています。facetRef要素は、.amxfファイルのfragmetDef内でのみ指定できます。MAF AMX attribute要素を子として指定することにより、属性をfacetRefに渡すことができ、これにより、attributeの値を介してフラグメントからファセットにEL変数を渡すことができます。

例5-12 MAF AMXページのフラグメント

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:panelGroupLayout layout="vertical"
id="itemPgl"
styleClass="amx-style-groupbox">
<amx:fragment id="f1"
src="/simpleFragment.amxf"
<amx:attribute id="a1"
name="text"
value="defaultValue" />
<amx:facet name="facet">
<amx:outputText id="ot5" value="Fragment"/>
</amx:facet>
</amx:fragment>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

フラグメントは、その属性を介してすべての情報を受け取ります。個々の属性を定義する以外に、フラグメントにリストとして渡す一連の属性を定義でき、それらをフラグメント定義で繰り返し使用できます。詳細は、第5.3.1.6.2項「フラグメントへの属性リストおよびメタデータの受渡し」を参照してください。

注意:

フラグメント・ファイル(.amxf)内で使用されるEL式は検証されません。

フラグメントでは、次のものがサポートされています。

- 埋込みポップアップ(第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

- 1つ以上の他の親ページまたはフラグメントに配置できる再利用可能なユーザー・インタフェース。これにより、バインディングを含まず他のコンポーネントで構成されるコンポーネントを作成できます。

- 独自のファセットの定義。これにより、ヘッダー・ファセット、サマリー・ファセットおよび詳細ファセットを定義するレイアウト・コンポーネントなどのコンポーネントを作成し、各ファセットに独自のスタイル・クラスとルック・アンド・フィールを設定できます。

- 属性とコレクションの両方を持つデータ・モデル。

MAFサンプル・アプリケーション(FragmentDemoおよびCompGallery)によって、フラグメントの作成方法と使用方法を示します。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリのPublicSamples.zipファイル内にあります。

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

MAF AMXフラグメント・ファイル(.amxf)をMAF AMXページまたは別のフラグメント・ファイルにドラッグ・アンド・ドロップすると、「フラグメント・コンテンツの構成」ダイアログ(図5-47を参照)が表示されます。このダイアログが表示されると、フラグメントの直接の子として定義されたすべてのフラグメント属性を指定できます。

注意:

「フラグメント・コンテンツの構成」ダイアログでは、ファセット・コンポーネント、ポップアップ・コンポーネント、属性リストおよびそのアーティファクトは使用できません。

図5-47 「フラグメント・コンテンツの構成」ダイアログ

図5-48は、MAF AMXフラグメント・ファイル(そのコンテンツは例5-11を参照)をMAF AMXファイルにドラッグ・アンド・ドロップしたときに表示される「フラグメント・コンテンツの構成」ダイアログを示しています。

図5-48 値が表示された「フラグメント・コンテンツの構成」ダイアログ

ダイアログに入力する際は、次の点を考慮してください。

- フラグメントで必須として定義された属性を構成する場合は、属性名の末尾にアスタリスク(*)が表示されます。

- 必須の属性値をすべて定義するまで、ダイアログの「OK」ボタンは無効です。

- フラグメント属性のデフォルト値が指定されており、同時にrequiredプロパティが定義されていてtrueに設定されている場合、この属性は必須として扱われません(デフォルト値が優先されます)。この場合は、次のようになります。

- フラグメントに監査警告が表示されます。

- 「フラグメント・コンテンツの構成」ダイアログで、属性の名前にアスタリスクが追加されず、この属性は必須として扱われません。

- 「タイプ」列に、フラグメントからのattribute-type要素の値が表示されます。これは、(Javaクラスとは異なり)属性タイプの説明として使用されます。

注意:

attribute-typeはフラグメントで必須要素ですが、その値を定義しなかった場合は、ドロップするフラグメントで未指定として表示されることがあります。この場合、ダイアログにデフォルト値として「文字列」が表示されます。

- 「値」列では、フラグメントの属性に渡す値を指定できます。値を入力するには、タイピングするか、省略記号(…)をクリックしてELビルダーを起動し、EL式を指定します。フラグメント内の特定の属性にdefault要素が存在する場合、このデフォルト値はその属性の「値」列で指定されています。デフォルト値はオーバーライドできます。

- フラグメント内にこの属性に対するdescription要素が存在する場合、異なる属性の行を切り替えると、ダイアログの下部に「属性の説明」フィールドが表示されます。description要素が定義されていない場合、「属性の説明」フィールドは空白になります。

- 「フラグメント・コンテンツの構成」ダイアログを使用して属性の追加、削除または並替えを行うことはできません。

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

フラグメント属性を定義する場合、MAFでは次の操作を実行できます。

- 動的属性の受渡し

- 各属性とメタデータとの関連付け(第5.3.1.6.2項「フラグメントへの属性リストおよびメタデータの受渡し」を参照)

- フラグメント定義内の属性に対するループ処理

- 属性内での動的属性のネスト

- あるフラグメントから埋込みフラグメントへの動的属性の受渡し

表5-4には、属性のリストを渡すことを可能にする、MAF AMX fragmentの直接および間接の子要素がリストされています。

表5-4 フラグメントの属性関連の子要素

子属性名

説明

attributeList

フラグメントに渡す属性リストを定義します。MAF AMX fragment要素またはattributeSet要素の直接の子にすることができます。

親要素には、子attributeList要素をいくつでも定義できます。

attributeList要素は、そのref属性を介して別のattributeListから参照できます。

異なるフラグメント間で属性リストを参照渡しできますが、この場合は、両方の属性リストに同じメタデータが含まれている必要があります。

attributeSet

MAF AMX attributeListの子として指定できます。

MAF AMX attributeListIteratorの繰り返し中に使用される属性のセットを定義します。配列内の1つのアイテムとして考えることができます。

親attributeList要素には、子attributeList要素をいくつでも定義できます。

attributeListIterator

MAF AMX attributeListを使用します。スタンプ設定に関してMAF AMXイテレータと同様の動作をしますが、属性の公開方法は異なり、そのname属性によってイテレータはattributeListに結合されます。

あるattributeListIteratorが別のattributeListIterator内でネストされている場合、nameは(attributeListIteratorにより現在処理中のattributeSetの子である) attributeListを指している必要があります。

繰り返しの間、定義された属性名がEL変数として公開されます。コール元から属性が提供されていない場合や、属性にデフォルト値がない場合は、値adf.mf.api.OptionalFragmentArgumentがEL変数として使用されます。この条件は、空のELキーワードを使用することによりテストできます(例: rendered="#{not (empty myAttribute)}")。

属性およびその値の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例5-13は、属性リストをMAF AMXフラグメントに渡す基本的な方法を示しています。

例5-13 基本属性リストの受渡し

<amx:fragment src="something.amxf">
<amx:attributeList name="attributeToPass" ref="nameOfAnOuterAttributeList" />
</amx:fragment>

例5-14は、MAF AMXファイル内に子attributeListが定義されているfragment要素を示しています。

例5-14 属性リスト定義

<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>

例5-15は、MAF AMXファイルのfragment要素内で定義されているネストされたattributeList要素を示しています。

例5-15 ネストされた属性リストの定義

<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>

例5-16は、定義済の属性リスト・コンポーネントがフラグメント定義内でどのように使用されるかを示しています。amxf:attribute-listタグは、属性リストのメタデータを定義しています。このタグは、amxf:fragmentまたは別のamxf:attribute-listタグの子として宣言する必要があり、その有効な子タグはamxf:name、amxf:description、amxf:attribute-listおよびamxf:attributeです。子nameは必須であり、現在のXMLノード内で一意である必要があります。nameを同じレベルで宣言されているamxf:attributeと同一にすることもできますが、このようなネーミング慣例はお薦めしません。

例5-16 フラグメント定義での属性リストの使用方法

<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ノード内で次のものを定義するために使用できます。

- 使用できる属性リスト・コンポーネント

- フラグメントのコール元のページを検証するために必要な情報

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

MAF AMXページの作成後は、ページへのMAF AMX UIコンポーネントおよびデータ・コントロールの追加を開始できます。

5.3.2.1 UIコンポーネントの追加

「コンポーネント」ウィンドウを使用して、MAF AMXコンポーネントおよびMAF AMXデータ視覚化コンポーネントをページにドラッグ・アンド・ドロップできます。コンポーネントを追加すると、必要な宣言的ページ・コードが追加され、各コンポーネント属性に特定の値が設定されます。

「コンポーネント」ウィンドウには、MAF AMXコンポーネントがカテゴリ別に表示されます(図5-49を参照)。

- 一般コントロール

- テキストおよび選択

- データ・ビュー

- レイアウト。次のサブカテゴリがあります。

- 対話型コンテナおよびヘッダー

- セカンダリ・ウィンドウ

- コア構造

- 操作。次のサブカテゴリがあります。

- 動作

- リスナー

- バリデータおよびコンバータ

特定のコンポーネントの追加および使用については、第6.3項「UIコンポーネントの作成と使用方法」を参照してください。

また、「コンポーネント」ウィンドウには、MAF AMXデータ視覚化コンポーネントもカテゴリ別に表示されます(図5-49を参照)。

- 共通: 次のサブカテゴリがあります。

- チャート

- ゲージ

- マップ

- その他

- 共有子タグ

- その他のタイプ固有の子タグ: 次のサブカテゴリがあります。

- チャート

- ゲージ

- NBox

- テーマ・マップ

- 時系列

- サンバーストおよびツリーマップ

始める前に

MAFアプリケーションには、ビュー・コントローラ・プロジェクトが含まれている必要があり、このプロジェクトには、MAF AMXページまたはページの作成元のMAF AMXページのタスク・フローが含まれている場合と含まれていない場合があります。

第5.3.1.2項「MAF AMXページの作成」で説明したように、タスク・フロー・ダイアグラムで「表示」アイコンをダブルクリックするか、「新規ギャラリ」から「クライアント層」→「モバイル・アプリケーション・フレームワーク」→「MAF AMXページ」を選択することにより、「MAF AMXページの作成」ダイアログを起動できます。

UIコンポーネントをページに追加するには:

1. ソース・エディタでMAF AMXページを開きます(デフォルト)。

2. 図5-49に示すように、「コンポーネント」ウィンドウで、メニューを使用して「MAF AMX」を選択します。

ヒント:

「コンポーネント」ウィンドウが表示されていない場合は、JDeveloperのメイン・メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」はJDeveloperの右上部に表示されます。

図5-49 MAF AMXの「コンポーネント」ウィンドウ

3. 使用するコンポーネントを選択し、「ソース」エディタまたは「構造」ウィンドウにドラッグ・アンド・ドロップします。「プレビュー」ペインにコンポーネントをドロップすることはできません。

注意:

MAF AMXページを作成する際、UIコンポーネントは、「パネル・グループ・レイアウト」などのUIコンテナにのみドロップできます。

新たに追加されたコンポーネントを使用して、JDeveloperで「プレビュー」ペインのページが再描画されます。

あるいは、次のようにして、「構造」ウィンドウからUIコンポーネントおよびデータ視覚化コンポーネントを追加することもできます。

1. 「構造」ウィンドウで、別のコンポーネントを挿入するための開始ポイントとして使用する既存のコンポーネントを選択します。

2. 図5-50に示すように、選択したコンポーネントを右クリックして、「<コンポーネント>の前に挿入」、「<コンポーネント>の中に挿入」または「<コンポーネント>の後ろに挿入」のいずれかのオプションを選択します。

図5-50 「構造」ウィンドウからのコンポーネントの挿入

3. ポップアップ・メニューから、「MAF AMX」または「MAF AMXデータ視覚化」を選択します。

- 図5-51に示すように、「MAF AMX」を選択すると、「MAF AMXアイテムの挿入」ダイアログが開き、ページに追加するUIコンポーネントを選択できます。

図5-51 MAF AMXコンポーネントの挿入

- 図5-52に示すように、「MAF AMXデータ視覚化」を選択すると、「MAF AMXデータ視覚化アイテムの挿入」ダイアログが開き、ページに追加するデータ視覚化コンポーネントを選択できます。

図5-52 MAF AMXデータ視覚化コンポーネントの挿入

新たに追加されたコンポーネントを使用して、JDeveloperで「プレビュー」ペインのページが再描画されます。

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

MAF AMXファイルを使用してユーザー・インタフェースを構築する際、JDeveloperの「プレビュー」では、iOSとAndroidの両方のプラットフォームに対してWYSIWYGサポートを提供します。図5-53に示すように、ビューを分割した状態で、MAF AMXコンポーネントをMAF AMXファイルに追加すると、コード・ビューはソース・エディタから、UIビューは「プレビュー」ペインから同時に確認できます。これにより、ソースを変更してすぐに、iOSとAndroidの両方のプラットフォームで、そのアプリケーションの変更されたルック・アンド・フィールを表示できます。

図5-53 デザイン・ビューとソース・ビューの分割

デザイン・ビューとソース・ビューを同時に確認できる以外に、複数のデザイン・ビューを同時に開いて使用し、それぞれを異なるプラットフォームおよび画面サイズに設定できます。様々なデバイスのデザイン・ビューの組合せを開くことで、様々なプラットフォームおよびフォーム・ファクタに対し、同時に、異なる向きでアプリケーションを開発できます。図5-54は、上段がiPhone、下段が75%のスケーリングのiPadの分割画面を示しています。「プレビュー」ペインは、JDeveloperのデフォルトの分割機能を使用して分割できます。

図5-54 複数のデザイン・ビュー

注意:

無効なMAF AMXファイルであっても、MAF AMXページはレンダリングされます。エラーはコンポーネントのエラー・アイコンで示されます。マウスをエラー・アイコンの上に移動すると、エラーの詳細を表示できます。

5.3.2.3 UIコンポーネントの構成

UIコンポーネントをページにドロップした後、「プロパティ」ウィンドウ(デフォルトではJDeveloperの右下部に表示)を使用して、各コンポーネントの属性値を設定できます。

ヒント:

「プロパティ」ウィンドウが表示されていない場合は、JDeveloperのメイン・メニューから「ウィンドウ」→「プロパティ」を選択します。

図5-55に、出力テキスト・コンポーネントの属性が表示された「プロパティ」ウィンドウを示します。

図5-55 「プロパティ」ウィンドウ

コンポーネント属性の設定手順:

1. 属性を設定するコンポーネントを選択します。「構造」ウィンドウでコンポーネントを選択するか、「ソース」エディタで直接そのタグを選択することができます。

2. 「プロパティ」ウィンドウで、設定する属性が含まれているセクションを開きます。

ヒント:

一部の属性は、複数のセクションに表示されます。あるセクションで値を入力または変更すると、他のセクションでもその値が変更されます。「プロパティ」ウィンドウの最上部の検索フィールドに属性名を入力して、属性を検索できます。

3. 「プロパティ」ウィンドウで、フィールドに値を直接入力するか、フィールドにリストがある場合はそのリストを使用して、値を選択します。フィールドの右にあるリストを使用して、値の設定に使用できるツールを含むポップアップを起動することもできます。これらのツールは、特定のプロパティ・エディタ(「編集」を選択して開く)または値のEL式の作成に使用できる式ビルダー(「式ビルダー」または該当する場合は「メソッド式ビルダー」を選択して開く)です。式ビルダーの使用の詳細は、第7.3.2項「EL式の作成方法」を参照してください。

「プロパティ」ウィンドウを使用して属性値を設定または変更すると、入力された値に合致するように、属性のページ・ソースがJDeveloperで自動的に変更されます。

ヒント:

「ソース」エディタでページを直接編集することで、いつでも属性値を変更できます。「ソース」エディタにページを表示するには、ページの下部の「ソース」タブをクリックします。

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

データ・コントロール要素を「データ・コントロール」ウィンドウからドラッグして「構造」ウィンドウまたはソース・エディタのいずれかにドロップすることで、MAF AMXビューでデータバインドされたUIコンポーネントを作成できます。「データ・コントロール」ウィンドウからこれらのいずれかの場所にアイテムをドラッグすると、ドロップしたアイテムに対して使用できるデフォルトのUIコンポーネントのポップアップ・メニューが表示されます。目的のUIコンポーネントを選択すると、そのコンポーネントがMAF AMXページに挿入されます。また、関連ページ定義ファイルにバインディング情報が作成されます。そのようなファイルが存在しない場合は、JDeveloperによって作成されます。MAFには、新しいデータ・コントロールの場所を知らせる、データ・コントロールのドロップ用のビジュアル・インジケータが用意されています。

注意:

データ・コントロールは、基礎となるXMLスキーマで許可された場所にのみドロップできます。

方法によっては、様々なタイプのデータ・コントロールをMAF AMXページの「構造」ウィンドウに挿入できます。

コレクションの属性をドロップすることにより、様々な入力および出力コンポーネントを作成できます。ページにデータ・コントロール操作をドロップすることにより、ボタンおよびリンク・コンポーネントも作成できます。

これらの各操作に対し、MAF AMXボタンにそれぞれのアクション・リスナーが追加されます。

データ・コントロールの属性および操作は、次の1つ以上のMAF AMX UIコンポーネントとしてドロップできます(第6.3項「UIコンポーネントの作成と使用方法」を参照)。

- ボタン

- リンク

- 入力日

- ラベル付入力日

- 入力テキスト

- ラベル付入力テキスト

- 出力テキスト

- ラベル付出力テキスト

- イテレータ

- リスト・アイテム

- リスト・ビュー

- ブール・チェックボックスの選択

- ブール・スイッチの選択

- ボタンを1つ選択

- 選択肢を1つ選択

- ラジオ・ボタンを1つ選択

- チェックボックスを複数選択

- 選択肢を複数選択

- 日時の変換

- 数値の変換

- フォーム

- 読取り専用フォーム

- パラメータ・フォーム

次の日付および数値タイプがサポートされています。

- java.util.Date

- java.sql.Timestamp

- java.sql.Date

- java.sql.Time

- java.lang.Number

- java.lang.Integer

- java.lang.Long

- java.lang.Float

- java.lang.Double

JDeveloperでの「データ・コントロール」ウィンドウの使用方法の詳細は、第7.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。

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

MAF AMXページにすでにパネル・フォーム・レイアウト・コンポーネントが含まれているか、すべてのフィールドを追加する必要がない場合は、データ・コントロールから個別の属性をドロップできます。属性タイプに応じて、次のように異なるデータ・バインディング・メニュー・オプションが提供されます。

日付

このカテゴリは、MAF入力日およびラベル付MAF入力日のコントロールを作成するためのオプションを提供します。図5-56に、属性を「データ・コントロール」ウィンドウからMAF AMXページのソース・エディタまたは「構造」ウィンドウにドラッグすると表示される日付コントロールを追加するためのポップアップ・メニューを示します。

図5-56 日付コントロールのポップアップ・メニュー

単一選択

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAFボタンを1つ選択

- MAF選択肢を1つ選択

- MAFラジオ・ボタンを1つ選択

- MAFブール・チェックボックスの選択

- MAFブール・スイッチの選択

図5-57に、属性を「データ・コントロール」ウィンドウからMAF AMXページのソース・エディタまたは「構造」ウィンドウにドラッグすると表示される選択コントロールを追加するためのポップアップ・メニューを示します。

図5-57 選択コントロールのポップアップ・メニュー

既存のMAF AMXページを使用している場合、「MAFボタンを1つ選択」オプションまたは「MAF選択肢を1つ選択」オプションを選択すると、適切な「リスト・バインディングの編集」ダイアログが表示されます(図5-58を参照)。まったく新しいMAF AMXページにコントロールをドロップした場合には、かわりに「アクション・バインディングの編集」ダイアログが開かれます。「OK」をクリックすると、「リスト・バインディングの編集」が開かれます。

注意:

単一選択またはブール選択のコンポーネントとして任意のデータ・コントロール属性をドロップするたびに、それぞれ「リスト・バインディングの編集」または「Booleanバインディングの編集」が表示されます。

図5-58 ボタンを1つ選択コントロールおよび選択肢を1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFラジオ・ボタンを1つ選択」オプションを選択すると、図5-59に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図5-59 ラジオ・ボタンを1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「MAFブール・チェックボックスの選択」オプションまたは「MAFブール・スイッチの選択」オプションを選択すると、図5-60に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図5-60 ブール・チェック・ボックスおよびスイッチの選択コントロールの「リスト・バインディングの編集」ダイアログ

テキスト

このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

図5-61に、属性を「データ・コントロール」ウィンドウからMAF AMXページのソース・エディタまたは「構造」ウィンドウにドラッグすると表示されるテキスト・コントロールを追加するためのポップアップ・メニューを示します。

図5-61 テキスト・コントロールのポップアップ・メニュー

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

属性に加え、操作とカスタム・メソッドもドラッグ・アンド・ドロップできます。操作やメソッドのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

操作

これはデータ・コントロール操作のカテゴリです。次のオプションがあります(図5-62を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図5-62 操作のポップアップ・メニュー

注意:

操作またはメソッドを、リスト・ビュー・コントロールの子としてドロップすると、ポップアップ・メニューは表示されず、リスト・アイテムが自動的に作成されます。これは、リスト・ビュー・コントロールの直接の子としてドロップできる有効なコントロールが他にないためです。生成されるリスト・アイテムに対して、JDeveloperにより次のようなバインディングが作成されます。

<amx:listItem actionListener="#{bindings.getLocation.execute}"/>

メソッド

これはカスタム・メソッドのカテゴリです。次のオプションがあります(図5-63を参照)。

- MAFボタン

- MAFリンク

- MAFパラメータ・フォーム

図5-63 メソッドのポップアップ・メニュー

「MAFパラメータ・フォーム」オプションでは、フォームに挿入するメソッドまたは操作の引数に加え、各引数に対してそれぞれのコントロールも選択できます(図5-64を参照)。

図5-64 「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<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}"/>

生成されるバインディングの詳細は、第5.3.2.4.4項「生成されるバインディングに関する必知事項」を参照してください。

MAFパラメータ・フォームでサポートされるコントロールのタイプは次のとおりです。

- MAF入力日

- ラベル付MAF入力日

- MAF入力テキスト

- ラベル付MAF入力テキスト

- ラベル付MAF出力テキスト

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

コレクションをドラッグ・アンド・ドロップできます。コレクションのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

複数選択

このカテゴリは、複数選択コントロールを作成するためのオプションを提供します。このカテゴリでは次のコントロールが作成されます(図5-65を参照)。

- MAFチェックボックスを複数選択

- MAF選択肢を複数選択

図5-65 複数選択コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAF選択肢を複数選択」または「MAFチェックボックスを複数選択」を選択すると、「リスト・バインディングの編集」ダイアログが表示されます(図5-66を参照)。

図5-66 複数選択コントロールの「リスト・バインディングの編集」ダイアログ

フォーム

このカテゴリは、MAF AMXパネル・フォームのコントロールを作成する場合に使用します。このカテゴリでは次のコントロールが作成されます(図5-67を参照)。

- MAFフォーム

- MAF読取り専用フォーム

図5-67 フォーム・コントロールのポップアップ・メニュー

作成するフォームのタイプとして「MAFフォーム」を選択すると、JDeveloperウィザードが起動され、ここで、フォームに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(図5-68を参照)。

図5-68 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>

生成されるバインディングの詳細は、第5.3.2.4.4項「生成されるバインディングに関する必知事項」を参照してください。

MAFフォームでサポートされるコントロールのタイプは次のとおりです。

- MAF入力日

- ラベル付MAF入力日

- MAF入力テキスト

- ラベル付MAF入力テキスト

- ラベル付MAF出力テキスト

注意:

MAF出力テキストは、MAFスキーマで定義される有効なパネル・フォーム・レイアウトの子要素ではないため、サポートされていません。

作成するフォームのタイプとして「MAF読取り専用フォーム」を選択すると、JDeveloperウィザードが起動され、ここで、フォームに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(図5-69を参照)。

図5-69 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>

生成されるバインディングの詳細は、第5.3.2.4.4項「生成されるバインディングに関する必知事項」を参照してください。

MAF読取り専用フォームでは、ラベル付MAF出力テキストのみがサポートされています。

イテレータ

これは、子コンポーネントのあるMAF AMXイテレータを作成するためのオプションを提供します(図5-70を参照)。

図5-70 イテレータ・コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAFイテレータ」を選択すると、JDeveloperウィザードが起動され、ここで、イテレータに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(デフォルトの選択は「ラベル付MAF出力テキスト」です。図5-71を参照してください)。

図5-71 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>

生成されるバインディングの詳細は、第5.3.2.4.4項「生成されるバインディングに関する必知事項」を参照してください。

MAFイテレータでサポートされるコントロールのタイプは次のとおりです。

- MAF入力テキスト

- ラベル付MAF入力テキスト

- MAF出力テキスト

- ラベル付MAF出力テキスト

リスト・ビュー

これは、子コンポーネントのあるMAF AMXリスト・ビューを作成するためのオプションを提供します(図5-72を参照)。

図5-72 リスト・ビュー・コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「MAFリスト・ビュー」を選択すると、図5-73に示すような「ListViewギャラリ」が開かれ、リスト・ビューに特定のレイアウトを選択できます。

図5-73 ListViewギャラリ

表5-5には、「ListViewギャラリ」に表示される、サポートされるリスト・フォーマットがリストされています。

表5-5 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」(図5-73を参照)は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表(図5-74を参照)に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルトの「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプション(図5-73を参照)では、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログ(図5-74を参照)の状態は変更されません。影響するのは、生成される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つのバリエーションがあり、表5-6に示す16の固有の説明が提供されています。

表5-6 リスト・ビューのフォーマットとバリエーション

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドは、リスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドは、リスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「ListViewギャラリ」で選択し、「OK」をクリックすると、「リスト・ビューの編集」ウィザードが起動され、ここで図5-74に示すように、バインディング属性を選択したリスト・ビュー・フォーマットの要素にマップすることにより、リスト・アイテムのコンテンツを作成できます。

図5-74 MAF AMXリスト・ビューの編集ダイアログ

図5-74に示すダイアログに入力する際は、次の点を考慮してください。

- 最初のイメージは、選択したリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映し、略図から基礎となる表の名前付き要素へのマッピングを提供します。

- 「要素」列の読取り専用セルは、選択したリスト・ビュー・フォーマットから導出されます。

- 「値バインディング」列の編集可能セルは、ドロップされたデータ・コントロール・ノードに基づいています。

- リスト・アイテムは、その特定要素に対してどちらが適切であるかによって、出力テキストまたはイメージ・コンポーネントのいずれかとして生成されます。

- 要素(行)数は選択したリスト・ビュー・フォーマットであらかじめ決まっているため、行を追加または削除することはできません。

- 要素の順序は変更できません。

- 「リスト・アイテム選択」は選択モードを示し、単一のアイテム選択(デフォルト)または選択なしのいずれかにできます。リスト・ビューのshowLinkIcon属性は、選択モードに基づいて更新されます。選択モードが「なし」に設定されると、showLinkIcon属性はfalseに設定されます。それ以外の場合、showLinkIcon属性は変更されません(たとえば、デフォルトのtrueにデフォルト設定されます)。
listViewの次の属性を使用すると、選択モードの機能を有効にできます。

- selectionListener: 選択リスナーへのメソッド参照を定義します。

- selectedRowKeys: このコンポーネントの選択状態を示します。

「単一アイテム」オプションを選択した場合、「リスト・ビューの編集」ダイアログでは自動的にこれらの属性が次のように設定されます。

- selectionListenerは"bindings.treebinding.collectionModel.makeCurrent"に設定されます。

- selectedRowKeysは"bindings.treebinding.collectionModel.selectedRow"に設定されます。

selectionListener属性には「編集」オプションがあり、これを「プロパティ」ウィンドウから使用して、マネージドBeanクラスおよび適切なマネージドBeanメソッドを他のリスナー属性と同様の方法で作成できます(図5-75および図5-76を参照)。

図5-75 選択リスナー属性の編集

図5-76 選択リスナーの編集ダイアログ

例5-17は、MAF AMXファイル内のlistView要素の選択関連属性を示しています。「リスト・ビューの編集」ダイアログで「単一アイテム」を選択すると、この宣言が生成されます(図5-74を参照)。

例5-17 リスト・ビューの選択属性

<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に設定されます(例5-18を参照)。

例5-18 リスト・ビューでの選択属性の省略

<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に設定されている場合は、選択されている行のみが考慮されます。

- 「区切り属性」フィールドのデフォルト値は「区切りなし」であり、この場合、「区切りモード」フィールドは無効です。デフォルト以外の値を選択する場合は、図5-77および図5-78に示すように、「区切りモード」パラメータを指定する必要があります。

図5-77 区切り属性の指定

図5-78 区切りモードの指定

リスト・ビューの区切りの詳細は、第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

「リスト・ビューの編集」ダイアログで適切なオプションを選択すると、次のMAF AMXマークアップおよびデータ・バインディングが生成されます。

<amx:listView id="listView1"
var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
dividerAttribute="key"
dividerMode="firstLetter"
selectionListener=
"#{bindings.employees.collectionModel.makeCurrent}"
selectedRowKeys=
"#{bindings.employees.collectionModel.selectedRow}">
<amx:listItem id="listItem1" >
<amx:outputText value="#{row.key}"
styleClass="adfmf-listItem-subtext"
id="outputText1"/>
</amx:listItem>
</amx:listView>

生成されるバインディングの詳細は、第5.3.2.4.4項「生成されるバインディングに関する必知事項」を参照してください。

MAFリスト・ビューでサポートされるコントロールは次のとおりです。

- MAF出力テキスト

- MAFイメージ

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

表5-7に、コンポーネントがドロップされたときにMAF AMXページに追加されるサンプル・バインディングを示します。

表5-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>

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

最初のドラッグ・アンド・ドロップ・イベントにより、次のディレクトリとファイルが生成されます。

図5-79に、ドラッグ・アンド・ドロップ時に生成されるDataBindings.cpxファイル例を示します。

図5-79 ソース・ビューでの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ファイルが作成されると、そのファイルを「ソース」ビュー(図5-79を参照)または概要エディタで開くことができます。

ファイルの「ページ・マッピング」(pageMap)セクションにより、IDを使用して各MAF AMXページまたはタスク・フロー・アクティビティが対応するページ定義ファイルにマップされます。「ページ定義の使用方法」(pageDefinitionUsages)セクションにより、ページ定義IDはMAF AMXアプリケーション機能内のページ定義ファイルの絶対パスにマップされます。「データ・コントロールの使用方法」(dataControlUsages)セクションは、ページ定義ファイル内で定義されているバインディング・オブジェクトによって使用されるデータ・コントロールを識別します。これらのマッピングにより、ページの起動時にバインディング・コンテナを初期化できます。

概要エディタを使用して、現在のID名をダブルクリックし、インラインで編集することで、ページ定義ファイルまたはデータ・コントロールのID名を変更できます。これを行うと、MAF AMXアプリケーション機能内のすべての参照が更新されます。ただし、JDeveloperで更新されるのはID名のみであり、ファイル名は更新されません。データ・コントロール名を予約語に変更しないようにしてください。

また、「構造」ウィンドウでDataBindings.cpxファイルの要素をクリックし、「プロパティ」ウィンドウを使用してプロパティ値を変更することもできます。

図5-80に、ドラッグ・アンド・ドロップ時に生成されるPageDefファイル例を示します。

図5-80 PageDefファイル

ページ定義ファイルでは、実行時にMAF AMX UIコンポーネントにデータを移入するバインディング・オブジェクトを定義します。バインディングを使用するMAF AMXページにはそれぞれ、そのページで使用されるバインディング・オブジェクトを定義する、対応するページ定義ファイルが存在する必要があります。ページ定義ファイルによって、すべてのバインディングへのデザインタイム・アクセスが提供されます。実行時には、ページ定義ファイルによって定義されたバインディング・オブジェクトが、ページ定義ファイルの実行時インスタンスであるバインディング・コンテナ内でインスタンス化されます。

初めて「データ・コントロール」ウィンドウを使用してページにコンポーネントを追加すると、JDeveloperによって自動的に、そのページのページ定義ファイルが作成され、コンポーネントにより参照される各バインディング・オブジェクトの定義が追加されます。それ以降、ページにデータバインド・コンポーネントを追加するたびに、JDeveloperによって、必要なバインディング・オブジェクト定義がページ定義ファイルに自動的に追加されます。

デフォルトでは、ページ定義ファイルは、ViewControllerプロジェクトのApplication Sourcesノードにあるmobile.PageDefsパッケージに含まれています。対応するMAF AMXページがデフォルト以外のディレクトリ、またはデフォルトのサブディレクトリに保存されると、ページ定義も同じ名前のパッケージに保存されます。

ページ定義ファイルを開く方法の詳細は、第5.3.1.5項「ページ定義ファイルへのアクセス」を参照してください。概要エディタでページ定義ファイルを開いた場合、次のタブを使用して、MAF AMXページのバインディング、コンテキスト・イベントおよびパラメータを表示および構成できます。

- バインディングと実行可能ファイル: このタブには、3種類のオブジェクト(バインディング、実行可能ファイル、および関連付けられたデータ・コントロール)が表示されます。バインディングまたは実行可能ファイルは、選択しないかぎりデータ・コントロールには表示されません。
デフォルトでは、モデル・バインディング・オブジェクトは、そのオブジェクトを作成するために使用されたデータ・コントロール・オブジェクトの名前が付けられます。データ・コントロール・オブジェクトが1ページ内で何度も使用される場合、Jdeveloperではデフォルトのバインディング・オブジェクト名に数字を追加して、それぞれが一意になるようにします。

- コンテキスト・イベント: MAF AMXアプリケーション機能内のアーティファクトが登録可能なコンテキスト・イベントを作成できます。

- パラメータ: パラメータ・バインディング・オブジェクトは、リクエストの開始時にページが評価するパラメータを宣言します。静的値または静的値を割り当てるEL式を使用して、ページ定義ファイルのパラメータ値を定義できます。

概要エディタのアイテム(または「構造」ウィンドウの関連付けられたノード)をクリックすると、「プロパティ」ウィンドウを使用してそのアイテムの属性値を表示および編集したり、「ソース」タブをクリックしてXMLソースを直接編集することができます。

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

JDeveloperの「バインディング」タブ(図5-81を参照)は、MAF AMXエディタで使用可能です。ここには、特定のMAF AMXページに対して定義されたデータ・バインディングが表示されます。バインディングを選択すると、基盤となるデータ・コントロールへのリレーションシップが示され、PageDefファイルへのリンクが提供されます。

図5-81 「バインディング」タブ

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

「構造」ウィンドウからMAF AMXコンポーネントを削除または切り取ると、使用されないバインディングは自動的にページから削除されます。

注意:

「ソース」エディタからコンポーネントを削除した場合には、バインディングは削除されません。

図5-82は、バインディングを参照するリスト・ビュー・コンポーネントの削除を示しています。削除すると、関連するバインディング・エントリが、対応するPageDef.xmlファイルから自動的に削除されます。

図5-82 バインドされたコンポーネントのページからの削除

図5-83では、ページからリスト・ビュー・コンポーネントを切り取ることにより、これを削除しています。

図5-83 バインドされたコンポーネントのページからの切取り

「切取り」をクリックすると、図5-84に示すような「ADFバインディングの削除の確認」ダイアログが表示され、該当するバインディングを削除するかどうかを選択するよう求められます。

図5-84 「ADFバインディングの削除の確認」ダイアログ

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

「コンポーネント」ウィンドウからコンポーネントをドロップするか、データ・コントロールをドラッグ・アンド・ドロップすることにより要素を追加すると、MAFによって一意の要素識別子(id)が生成され、自動的にMAF AMXページに挿入されます。これは、MAF AMXページ内で、同じページ内の類似したコンポーネントでもそれぞれを識別する有効な識別子となります。

MAFには、次のことを行う識別子監査ユーティリティが用意されています。

- MAF AMXページにおける識別子の存在と一意性を確認する。

- 識別子が存在しない場合、または一意でない場合は、要素の必須id属性ごとにエラーを報告する。

- 自動修正により、識別子の問題が報告されると、要素の一意のidが生成される。

図5-85および図5-86に、ソース・エディタと「構造」ペインの識別子エラー・レポートをそれぞれ示します。

図5-85 「ソース」エディタの要素識別子監査

図5-86 「構造」ペインの要素識別子監査

idに加え、監査ユーティリティでは「ポップアップ表示動作」操作のpopupIdおよびalignId属性をチェックします(第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

図5-87および図5-88に、ソース・エディタの「ポップアップ表示動作」の「ポップアップID」属性と「位置合せID」属性のエラー・レポートをそれぞれ示します。

図5-87 「ソース」エディタのポップアップID属性監査

図5-88 「ソース」エディタの位置合せID属性監査

詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のJavaプロジェクトの監査とモニタリングに関する項を参照してください。

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

MAFで使用されるセキュリティ・アーキテクチャでは、MAF AMXページをホストするブラウザに、セキュア・サーバーに接続してそのリソースを取得するために必要なセキュリティ情報へのアクセス権がないことを保証しています。これは、MAF AMXページから行うAJAXコールに直接的な影響があります。これらのコールはサポートされていないため、MAF AMX UIコンポーネント内からのJavaScriptの使用には制約があります。サーバーとの通信は、埋込みのJavaコード・レイヤーから行う必要があります。

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

この章では、MAF AMXページのユーザー・インタフェースを作成する方法について説明します。

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

- 第6.1項「MAF AMXページのユーザー・インタフェースの作成の概要」

- 第6.2項「ページ・レイアウトの設計」

- 第6.3項「UIコンポーネントの作成と使用方法」

- 第6.4項「ジェスチャーの有効化」

- 第6.5項「データ視覚化の指定」

- 第6.6項「UIコンポーネントのスタイル設定」

- 第6.7項「UIコンポーネントのローカライズ」

- 第6.8項「MAFのアクセシビリティのサポートの理解」

- 第6.9項「入力の検証」

- 第6.10項「イベント・リスナーの使用方法」

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

MAFは、iOSとAndroidのどちらのユーザー操作性に対しても適切に動作するMAF AMXページの作成を可能にする一連のUIコンポーネントおよび操作を提供します。

MAF AMXは、標準的なJDeveloper開発エクスペリエンスに準拠して、「コンポーネント」ウィンドウまたは「データ・コントロール」ウィンドウのいずれからもソース・エディタや「構造」ウィンドウにUIコンポーネントおよび操作をドラッグできるようになっています。実質的には、iOSおよびAndroidのプラットフォーム上のネイティブ・コンポーネントのHTML相当物がMAF AMX UIコンポーネントによってレンダリングされ、JDeveloperでのそれらのデザインタイムの動作は、その他のテクノロジで使用されるコンポーネントに似たものとなります。さらに、これらのUIコンポーネントは、宣言ナビゲーションおよびデータ・バインディングのためにMAFのコントローラおよびモデルと統合されます。

注意:

モバイル・デバイス用のインタフェースを開発する場合は、画面領域が非常に限られていることに常に注意してください。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

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

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

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

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

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

MAF AMXは、ページ内へのUIコンポーネントの配置を可能にするレイアウト・コンポーネント(表6-1にリスト)を提供します。通常、これらのコンポーネントを使用してページの構築を開始し、次にこれらのコンテナ内で、または子コンポーネントとして、他の機能を提供する他のコンポーネントを、レイアウト・コンポーネントに追加します。これらのコンポーネントのいくつかは、拡大するコンポーネント内に配置されたときに拡大する機能などの形状管理機能を提供します。

表6-1 MAF AMXのページ管理、レイアウトおよび間隔調整コンポーネント

コンポーネント

タイプ

説明

表示

コア・ページ構造コンポーネント

MAF AMXファイル内にview要素を作成します。ファイルが作成されるときにファイルに自動的に挿入されます。詳細は、第6.2.1項「表示コンポーネントの使用方法」を参照してください。

パネル・ページ

コア・ページ構造コンポーネント

MAF AMXファイル内にpanelPage要素を作成します。ページ内の中央領域(ヘッダー領域とフッター領域の間を垂直方向にスクロールする)を定義します。詳細は、第6.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

MAF AMXファイルの詳細は、第5.3.1.2項「MAF AMXページの作成」を参照してください。

ファセット

コア・ページ構造コンポーネント

MAF AMXファイル内にfacet要素を作成します。任意の名前のファセットを親コンポーネントに定義します。詳細は、第6.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

フラグメント

コア・ページ構造コンポーネント

MAF AMXファイル内にfragment要素を作成します。ページ・コンテンツの共有を可能にします。詳細は、第6.2.13項「フラグメント・コンポーネントの使用方法」を参照してください。

ファセット定義

コア・ページ構造コンポーネント

MAF AMXフラグメント・ファイル内にfacetRef要素を作成します。ページ・フラグメント使用方法で定義されたファセットを参照するために、ページ・フラグメント定義(fragmentDef)内で使用されます。詳細は、第6.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

パネル・グループ・レイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelGroupLayout要素を作成します。子コンポーネントを縦または横にグループ化します。詳細は、第6.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・フォーム・レイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelFormLayout要素を作成します。入力テキストなどのコンポーネントを、それらのラベルおよびフィールドが水平に、または各コンポーネントの上に整列するように配置します。詳細は、第6.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・ラベルおよびメッセージ

ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelLabelAndMessage要素を作成します。ラベルおよびその子をレイアウトします。詳細は、第6.2.6項「パネル・ラベルおよびメッセージ・コンポーネントの使用方法」を参照してください。

パネル・ストレッチ・レイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelStretchLayout要素を作成します。1つのパネルを別のパネルの両側に配置できるようにします。詳細は、第6.2.5項「パネル・ストレッチ・レイアウト・コンポーネントの使用方法」を参照してください。

ポップアップ

セカンダリ・ウィンドウ

MAF AMXファイル内にpopup要素を作成します。ポップアップ・ウィンドウを表示します。詳細は、第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照してください。

パネル・スプリッタ

インタラクティブ・ページ・レイアウト・コンテナ

MAF AMXファイル内にpanelSplitter要素を作成します。左側ナビゲーション・ペインで制御できる複数のコンテンツ領域を表示できます。詳細は、第6.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

パネル・アイテム

インタラクティブ・ページ・レイアウト・コンポーネント

MAF AMXファイル内にpanelItem要素を作成します。パネル・スプリッタのコンテンツ領域を表しています。詳細は、第6.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

デッキ

ページ・レイアウト・コンテナ

MAF AMXファイル内にdeck要素を作成します。一度に子コンポーネントの1つを表示します。詳細は、第6.2.12項「デッキ・コンポーネントの使用方法」を参照してください。

スペーサ

間隔調整コンポーネント

MAF AMXファイル内にspacer要素を作成します。MAF AMXファイル内のspacer要素によって表される空白の領域を作成します。詳細は、第6.2.10項「スペーサ・コンポーネントの使用方法」を参照してください。

表のレイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にtableLayout要素を作成します。行で構成された表を表します。詳細は、第6.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

行のレイアウト

ページ・レイアウト・コンテナ

MAF AMXファイル内にrowLayout要素を作成します。表のレイアウト・コンポーネント内でセルで構成されている行を表します。詳細は、第6.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

セル・フォーマット

ページ・レイアウト・コンポーネント

MAF AMXファイル内にcellFormat要素を作成します。行のレイアウト・コンポーネント内のセルを表します。詳細は、第6.2.11項「表のレイアウト・コンポーネントの使用方法」を参照してください。

レイアウト・コンポーネントを追加するには、それを「コンポーネント」ウィンドウからMAF AMXページにドラッグ・アンド・ドロップします(第5.3.2.1項「UIコンポーネントの追加」を参照)。次に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します(第5.3.2.3項「UIコンポーネントの構成」を参照)。特定のコンポーネントごとの属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-1は、MAF AMXファイルで定義されているいくつかのページ・レイアウト要素を示しています。

注意:

ページ・レイアウト要素は<amx>ネームスペースの下で宣言します。

例6-1 ページ・レイアウト・コンポーネントの定義

<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>

図6-1 デザインタイムのページ・レイアウト・コンポーネント

レイアウト・コンポーネントのビジュアル・プレゼンテーションを管理するには、標準Cascading Style Sheet (CSS)を使用します。CSSは、ViewControllerプロジェクトのWeb Content/cssディレクトリに、MAFによって提供されているデフォルトCSSとともに配置されています。詳細は、第6.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

MAF AMXを使用してiOSプラットフォーム用に作成されたユーザー・インタフェースは、言語環境が左から右、右から左のいずれであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。ポップアップ(第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)、パネル・アイテム、パネル・スプリッタ(第6.2.9項「パネル・スプリッタ・コンポーネントの使用方法」)など、一部のMAF AMXレイアウト・コンポーネントは、特定の右から左の動作を有効化するように構成できます。MAF AMXページの右から左の構成の詳細は、第6.4項「ジェスチャーの有効化」および第5.2.11項「ページ遷移スタイルの指定方法」を参照してください。

注意:

右から左のテキスト方向は、Androidプラットフォームではサポートされていません。

UIDemoという名前のMAFサンプル・アプリケーションは、ボタンなどのMAF AMX UIコンポーネントとともにレイアウト・コンポーネントを使用して一般的なパターンに従った一般的なレイアウトのいくつかを実現する方法を示しています。さらに、このサンプル・アプリケーションは、スタイルを使用してページ・レイアウトを特定のパターンに合せる方法を示します。UIDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

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

表示(MAF AMXファイルのview要素)は、コア・ページ構造コンポーネントであり、MAF AMXファイルの作成時にそのファイルに自動的に挿入されます。このコンポーネントは、ページおよびその構造の階層表現を提供し、単一のMAF AMXページを表します。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

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

パネル・ページ(MAF AMXファイルのpanelPage要素)は、他のコンポーネントをレイアウトする画面のスクロール可能領域の定義を可能にするコンポーネントです。

デフォルトでは、MAF AMXページを作成するときに、JDeveloperによってパネル・ページ・コンポーネントが自動的に作成され、そのページに挿入されます。そのページにコンポーネントを追加すると、それらはパネル・ページ・コンポーネント内に挿入されます。

特定の領域(ページのヘッダーやフッターなど)をスクロールできないようにし、向きが変更されたときのストレッチを有効化するには、パネル・ページに対してファセット・コンポーネントを指定します。パネル・ページのヘッダー・ファセットには、各ページのナビゲーション・バーに配置されるタイトルが含まれています。パネル・ページに含めることができる他のタイプのファセット・コンポーネントの詳細は、第6.2.7項「ファセット・コンポーネントの使用方法」を参照してください。

例6-2は、MAF AMXファイルで定義されているpanelPage要素を示しています。このパネル・ページには、ヘッダー・ファセットが含まれています。

例6-2 パネル・ページの定義

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
</amx:facet>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

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

パネル・グループ・レイアウト・コンポーネントは、基本レイアウト・コンポーネントであり、その子を垂直方向または水平方向に配置します。また、子コンポーネントを横に配置し、ページの端に達したら下に配置する、折返しレイアウトのオプションもあります。

パネル・グループ・レイアウト・コンポーネントを作成するには、「コンポーネント」ウィンドウを使用します。

パネル・グループ・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、パネル・グループ・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 目的の子コンポーネントをパネル・グループ・レイアウト・コンポーネントに挿入します。

3. 隣接する子コンポーネント間に間隔を追加するには、スペーサ(spacer)コンポーネントを挿入します。

4. 「プロパティ」ウィンドウを使用して、コンポーネント属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-3は、MAF AMXファイルで定義されているpanelGroupLayout要素を示しています。

例6-3 パネル・グループ・レイアウトの定義

<amx:panelGroupLayout styleClass="prod" id="pgl1">
<amx:outputText styleClass="prod-label" value="Screen Size:" id="ot1"/>
</amx:panelGroupLayout>

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

パネル・グループ・レイアウト・コンポーネントのスクロール動作はscrollPolicy属性により定義され、これはauto (デフォルト)、noneまたはscrollに設定できます。デフォルトでは、この動作はアクティブ・スキンで定義されているものに一致します。

アクティブ・スキンで定義されている動作とは関係なくスクロールを無効にするには、scrollPolicy属性をnoneに設定します。パネル・グループ・レイアウト・コンポーネントがスクロール可能でない場合、コンテンツは制約を受けません。

アクティブ・スキンで定義されている動作とは関係なくスクロールを有効にするには、scrollPolicy属性をscrollに設定します。パネル・グループ・レイアウト・コンポーネントがスクロール可能である場合は、コンポーネントのディメンションが制約されているとスクロールが提供されます。

スクロールは多量のメモリーを消費し、アプリケーションをクラッシュさせる可能性があるため、使用は最小限に抑える必要があります。mobileAltaスキン(第6.6.2項「スキニングに関する必知事項」を参照)では、パネル・グループ・レイアウト、パネル・フォーム・レイアウト(第6.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照)および表のレイアウト(第6.2.11項「表のレイアウト・コンポーネントの使用方法」を参照)のスクロールは無効です。アプリケーションにmobileAltaスキンを使用し、scrollPolicyは必要な場合にのみscrollに設定することをお薦めします。パネル・フォーム・レイアウトおよび表のレイアウトのスクロール動作をシミュレートするには、スクロールが必要になったときに、スクロール可能なパネル・グループ・レイアウト・コンポーネントでそれらを囲みます。

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

パネル・フォーム・レイアウト(panelFormLayout)コンポーネントは、コンポーネントをそれらのラベルおよびフィールドが水平方向に整列するように配置します。一般的に、パネル・フォーム・レイアウト・コンポーネントのメイン・コンテンツは、入力コンポーネント(入力テキストなど)および選択コンポーネント(選択肢など)で構成されています。label属性が定義されている子コンポーネントをパネル・フォーム・レイアウト・コンポーネント内に配置すると、その子コンポーネントのラベルおよびフィールドはパネル・フォーム・レイアウトの定義に基づいて整列およびサイズ設定されます。パネル・フォーム・レイアウト内では、ラベル領域は、フィールド領域の開始側上またはフィールド領域の上の独立した線上のどちらにも表示できます。独立した線は、パネル・フォーム・レイアウトのlabelPosition属性がtopStart、topCenterまたはtopEndに設定されている場合に使用されます。それ以外の場合は、ラベル領域はフィールド領域の開始側上に表示されます。ラベル領域内では、labelPosition属性によって、次のようにラベル・テキストを整列できる位置が制御されます。

- 開始側(labelPosition="start"またはlabelPosition="topStart")

- 中央(labelPosition="center"またはlabelPosition="topCenter")

- 終了側(labelPosition="end"またはlabelPosition="topEnd")

フィールド領域内では、fieldHalign属性によって、次のようにフィールド・コンテンツを整列できる位置が制御されます。

- 開始側(fieldHalign="start")

- 中央(fieldHalign="center")

- 終了側(fieldHalign="end")

パネル・フォーム・レイアウト内では、maxColumnsおよびrows属性を使用して1つ以上の列に子コンポーネントを配置できます。最適な複数列レイアウトを実現するためには、これらの属性をlabelWidth、fieldWidth、labelPositionおよびshowHorizontalDividers属性とともに使用する必要があります。

注意:

単一列から複数列にレイアウトを切り替えるには、maxColumns属性に設定されている値に関係なく、rows属性の値を1より大きくする必要があります。rows属性を指定すると、maxColumns属性の値がレイアウトの最大列数に設定されますが、子コンポーネントのレイアウトに必要なだけの行数が含まれています。

パネル・フォーム・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、パネル・フォーム・レイアウト・コンポーネントをMAF AMXページにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-4は、MAF AMXファイルで定義されているpanelFormLayout要素を示しています。

例6-4 パネル・フォーム・レイアウトの定義

<amx:panelFormLayout styleClass="prod" id="pfl1">
<amx:panelLabelAndMessage label="Type" id="plm1">
<amx:commandLink text="Personal" action="edittype" id="cl1"/>
</amx:panelLabelAndMessage>
</amx:panelFormLayout>

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

パネル・ストレッチ・レイアウト(panelStretchLayout)コンポーネントは、top、bottomおよびcenterの3つの子ファセット・コンポーネントを管理します(例6-5を参照)。これらのファセットは、任意の組合せでいくつでも使用できます。

例6-5 基本的なパネル・ストレッチ・レイアウトの定義

<amx:panelStretchLayout id="psl1">
<amx:facet name="top">
</amx:facet>
<amx:facet name="center">
</amx:facet>
<amx:facet name="bottom">
</amx:facet>
</amx:panelStretchLayout>

3つの矩形が上下に重なった状態のパネル・ストレッチ・レイアウト・コンポーネントを表現しようとした場合は、次のことが該当します。

- 最上部の矩形の高さは、topファセットの通常の高さにより定義されます。

- 最下部の矩形の高さは、bottomファセットの通常の高さにより定義されます。

- 残りの垂直スペースは、中間の矩形に配分されます。この矩形の高さがCenter.heightに定義された値よりも小さく、panelStretchLayoutのscrollPolicy属性がscrollまたはautoのいずれかに設定されている場合、スクロールバーが追加されます。

パネル・ストレッチ・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、パネル・ストレッチ・レイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 作成された子ファセット・コンポーネントを確認し、必要に応じてその一部を削除します。

3. 「プロパティ」ウィンドウを使用して、コンポーネント属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

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

パネル・ラベルおよびメッセージ(panelLabelAndMessage)コンポーネントは、label属性が定義されていないコンポーネントを配置するために使用します。これらのコンポーネントとしては、通常、出力テキスト、ボタンまたはリンクがあります。

パネル・ラベルおよびメッセージ・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、パネル・ラベルおよびメッセージ・コンポーネントをパネル・グループ・レイアウト・コンポーネントにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-4は、MAF AMXファイルで定義されているpanelLabelAndMessage要素を示しています。label属性が、子コンポーネントに対して使用されています。

例6-6 パネル・ラベルおよびメッセージの定義

<amx:panelLabelAndMessage label="Phone" id="plm1">
<amx:outputText value="212-555-0123" id="ot1"/>
</amx:panelLabelAndMessage>

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

ファセット(facet)コンポーネントは、親レイアウト・コンポーネント上に、ヘッダーやフッターなど任意の名前のファセットを定義するために使用します。ファセットの位置およびレンダリングは、親コンポーネントによって決定されます。

MAF AMXページのヘッダーは、通常、ヘッダー、プライマリおよびセカンダリ・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第6.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- ヘッダー・ファセット: ページ・タイトルが含まれています。

- プライマリ・アクション・ファセット: ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセット: ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

MAF AMXページのフッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第6.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- フッター・ファセット: コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

例6-7は、パネル・ページ・コンテナ内で宣言されているfacet要素を示しています。ファセットのタイプは、常にそのname属性で定義されます(表6-2を参照)。

例6-7 ファセットの定義

<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>

表6-2には、特定の親コンポーネントとともに使用できる事前定義済ファセット・タイプがリストされています。

表6-2 ファセット・タイプと親コンポーネント

親コンポーネント

ファセット・タイプ(名前)

パネル・ページ(panelPage)

header、footer、primary、secondary

リスト・ビュー(listView)

header、footer

カルーセル(carousel)

nodeStamp

パネル・スプリッタ(panelSplitter)

navigator

パネル・ストレッチ・レイアウト(panelStretchLayout)

top、center、bottom

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

詳細は、第6.5項「データ視覚化の指定」を参照してください。

dataStamp、seriesStamp、overview、rows (NBoxに適用可能)、columns (NBoxに適用可能)、cells (NBoxに適用可能)、icon (NBoxノードに適用可能)、indicator (NBoxノードに適用可能)

ファセット・コンポーネントを追加するには:

「構造」ウィンドウまたはソース・エディタに表示されるポップアップ・メニューを使用して、ファセット・コンポーネントを別のコンポーネントの子として追加できます。ポップアップ・メニューには、選択している親コンポーネントに有効なファセットのみが表示されます。ファセットを追加するには、最初に「構造」ウィンドウまたはソース・エディタで親コンポーネントを選択してから右クリックし、次のうちの1つを選択します。

- 親コンポーネントがパネル・ページである場合、図6-2に示すように、「ファセット-パネル・ページ」を選択し、リストからファセットのタイプを選択します。

図6-2 パネル・ページにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがリスト・ビューである場合、図6-3に示すように、「ファセット-リスト・ビュー」を選択し、リストからファセットのタイプを選択します。

図6-3 リスト・ビューにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがカルーセルである場合、図6-4に示すように、「ファセット-カルーセル」→「ノード・スタンプ」を選択します。

図6-4 カルーセルにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがパネル・スプリッタである場合、図6-5に示すように、「ファセット-パネル・スプリッタ」→「ナビゲータ」を選択します。

図6-5 パネル・スプリッタにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがパネル・ストレッチ・レイアウトである場合、図6-6に示すように、「ファセット-パネル・ストレッチ・レイアウト」を選択し、リストからファセットのタイプを選択します。

図6-6 パネル・ストレッチ・レイアウトにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがデータ視覚化コンポーネントの1つである場合、図6-7に示すように、「ファセット」→「<MAF AMXデータ視覚化コンポーネント名>」を選択し、リストからファセットのタイプを選択します。

図6-7 データ視覚化コンポーネントにファセットを追加するためのポップアップ・メニューの使用方法

データ視覚化コンピュータとされらの属性の詳細は、第6.5項「データ視覚化の指定」を参照してください。

別の方法:

1. 「コンポーネント」ウィンドウで、表6-2にリストされた別のコンポーネントにファセット・コンポーネントをドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウで、コンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

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

ポップアップ(popup)コンポーネントを使用して、ポップアップ・ウィンドウを表示します。このコンポーネントは、ビュー・コンポーネントの子として宣言できます。

ポップアップ・コンポーネントとともに次の操作を使用できます。

- ポップアップを閉じる動作(closePopupBehavior)の操作は、ポップアップを閉じる動作のtype属性を使用して指定したクライアントによってトリガーされるイベントに応じてポップアップを閉じる宣言的な方法を表しています。
ポップアップを閉じる動作コンポーネントの属性およびその値の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

- ポップアップ表示動作(showPopupBehavior)の操作は、ポップアップ表示動作のtype属性を使用して指定されたクライアントによってトリガーされるイベントに応答してポップアップを表示する宣言的な方法です。
ポップアップ表示動作のpopupId属性は、その親コンポーネントに関連するポップアップ・コンポーネントの一意の識別子を指定します。ポップアップ表示動作のalignId属性は、そのポップアップを整列する基準となるUIコンポーネントの一意の識別子を指定します。識別子を手動で設定するのは、手間がかかり、さらに無効な参照が発生する可能性もあるため、これらの2つの属性の値は標準「プロパティ」ウィンドウと統合されているエディタを使用して設定します(図6-9を参照)。これらの識別子を検証するために特別に定義されている監査ルールがあります(第5.3.2.5章「要素識別子とその監査に関する必知事項」を参照)。

ポップアップ表示動作のdecoration属性を使用すると、指定されたalignIdに一致するコンポーネントを指すアンカーを持つようにポップアップを構成できます。これを行うには、decoration属性をanchorに設定します(デフォルト値はsimpleです)。

注意:

alignId属性を使用するためにdecoration="anchor"を定義する必要はありません。decoration="anchor"を使用する場合にalignId属性が指定されていないか、alignIdの一致が見つからない場合、decorationはデフォルトでsimpleに設定され、ポップアップ・コンポーネントには最小限の装飾のみが行われます。

ポップアップ表示動作のalign属性に設定する値は、ポップアップ・コンポーネントの配置を示します(その配置を行うのに十分なスペースがある場合)。十分なスペースがない場合は、代替の配置がMAFによって選択されます。

ヒント:

ポップアップを画面中央に配置するには、パネル・ページ・コンポーネントのalignId属性を設定してから、align="center"を使用します。

ポップアップ表示動作コンポーネントの属性およびその値の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-8は、MAF AMXファイルで定義されているpopup要素とそのshowPopupBehavior要素およびclosePopupBehavior要素を示しています。

例6-8 ポップアップ、ポップアップ表示動作およびポップアップを閉じる動作の定義

<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>

ポップアップ・コンポーネントは、ユーザー入力エラーが発生したときに検証メッセージを表示できます。詳細は、第6.9項「入力の検証」を参照してください。

ポップアップID属性を設定するには:

1. 「ソース」エディタまたは「構造」ウィンドウで、showPopupBehavior要素またはcloseopupBehavior要素を選択します。

2. 「ポップアップID」フィールドの右側にある下矢印をクリックし、使用可能なポップアップ・コンポーネントのリストから選択するか(図6-8を参照)、「ポップアップID」フィールドの右側にある「プロパティ・メニュー」アイコンをクリックして「ポップアップID」プロパティ・エディタを開きます(図6-9を参照)。

図6-8 リストからのポップアップIDの選択

図6-9 ポップアップID属性の設定

3. プロパティ・エディタを使用する場合は、「ポップアップID」プロパティ・エディタで「編集」を選択し、図6-10に示す「プロパティの編集: ポップアップID」ダイアログを開きます。

図6-10 ポップアップIDのプロパティの編集ダイアログ

4. ポップアップ表示動作またはポップアップを閉じる動作を起動したときに表示されるポップアップ・コンポーネントまたはポップアップを閉じるコンポーネントを選択します。

位置合せID属性を設定するには:

1. ソース・エディタまたは「構造」ウィンドウでshowPopupBehavior要素を選択します。

2. 「位置合せID」フィールドの右側にある「プロパティ・メニュー」アイコンをクリックし、図6-11に示すように「位置合せID」プロパティ・エディタを開きます。

図6-11 位置合せID属性の設定

3. 「位置合せID」プロパティ・エディタで「編集」を選択し、図6-12に示す「プロパティの編集: 位置合せID」ダイアログを開きます。

図6-12 位置合せIDのプロパティの編集ダイアログ

4. ポップアップ表示動作操作の親コンポーネントを選択します。

iOSプラットフォーム用の開発を行う場合、右から左の言語環境に対応するようにポップアップを構成するには、そのanimation属性をslideStartまたはslideEndに設定します。

UIDemoという名前のMAFサンプル・アプリケーションは、ポップアップ・コンポーネントの使用方法と、スタイルを適用して、特定のパターンに従ってページ・レイアウトを調整する方法を示しています。UIDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

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

パネル・スプリッタ(panelSplitter)コンポーネントは、左側にあるナビゲーション・ペインで制御可能な複数のコンテンツ領域を表示するために使用します。パネル・スプリッタ・コンポーネントは、通常、表示サイズが大きいタブレット・デバイスで使用されます。これらのコンポーネントは、通常、表示領域の左側にリストが、右側にコンテンツがある場合に使用されます。

パネル・スプリッタには、MAF AMXページにパネル・スプリッタをドラッグ・アンド・ドロップすると自動的に生成されるナビゲータ・ファセット(第6.2.7項「ファセット・コンポーネントの使用方法」を参照)およびパネル・アイテム・コンポーネントを含めることができます。パネル・アイテム(panelItem)コンポーネントは、パネル・スプリッタのコンテンツ領域を表します。各パネル・スプリッタ・コンポーネントには少なくとも1つのパネル・アイテムが必要なため、パネル・スプリッタが作成されるときにパネル・アイテムがパネル・スプリッタに自動的に追加されます。各パネル・アイテム・コンポーネントには、パネル・グループ・レイアウトに含めることができるどのようなコンポーネントも含めることができます(第6.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照)。

「パネル・スプリッタ」の左側は、ナビゲータ・ファセット(navigator)によって表されます。これは、アニメーション付きの複数のコンテンツのみが必要とされる場合(たとえば、異なるボタンを選択してコンテンツを切り替えるときにアニメーションを必要とする選択ボタン付きの複数コンテンツ領域を描画する場合)のオプションです。横モードの場合、このファセットがレンダリングされます。縦モードの場合、ボタンはコンテンツ領域の上に配置され、クリックされたときにこのファセットのコンテンツがポップアップ内で起動されます。

iOSプラットフォーム用の開発を行う場合、右から左の言語環境に対応するようにパネル・スプリッタとパネル・アイテムを構成するには、それらのanimation属性をslideStart、slideEnd、flipStart、flipEndのいずれかに設定します。パネル・アイテム・コンポーネントのanimation属性は、パネル・スプリッタのanimation属性をオーバーライドします。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-9は、MAF AMXファイルで定義されているpanelSplitter要素を、子コンポーネントとして使用されているnavigatorファセットとともに示しています。

例6-9 ナビゲータを含むパネル・スプリッタの定義

<amx:panelSplitter id="ps1"
selectedItem="#{bindings.display.inputValue}"
animation="flipEnd">
<amx:facet name="navigator">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row"
showMoreStrategy="autoScroll"
bufferStrategy="viewport>
...
</listView>
</facet>
<amx:panelItem id="x">
<amx:panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
<amx:panelItem id="y">
<amx:panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
</panelSplitter>

その他の例は、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるUIDemoアプリケーションを参照してください。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

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

スペーサ(spacer)コンポーネントは、MAF AMXページ上でコンポーネントを区分するための空白の領域を作成するために使用します。spacerのheight (垂直間隔の場合)およびwidth (水平間隔の場合)属性を使用して、縦および横の空白をページに組み込むことができます。

スペーサ・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、スペーサをMAF AMXページにドラッグ・アンド・ドロップします。

2. 「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-10は、MAF AMXファイルで定義されているspacer要素およびその子を示しています。

例6-10 スペーサの定義

<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..."/>

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

表のレイアウト(tableLayout)コンポーネントは、セルを含む行で構成される一般的な表のフォーマットでデータを表示するために使用します。

行のレイアウト(rowLayout)コンポーネントは、表のレイアウトの単一の行を表します。表のレイアウト・コンポーネントには、1つ以上の行のレイアウト・コンポーネント、または行のレイアウト・コンポーネントを生成できるイテレータ・コンポーネントのいずれかが含まれている必要があります。

セル・フォーマット(cellFormat)コンポーネントは、行のレイアウトのセルを表します。行のレイアウト・コンポーネントには、1つ以上のセル・フォーマット・コンポーネント、イテレータ・コンポーネント、属性リスト・イテレータ・コンポーネントまたはセル・フォーマット・コンポーネントを生成できるファセット定義コンポーネントのいずれかが含まれている必要があります。

表のレイアウト構造では、セル・コンテンツで割合による高さを使用したり、表構造全体に高さをまとめて割り当てることはできません。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスで次の属性の説明を参照してください。

- 表のレイアウト・コンポーネントのlayoutおよびwidth属性

- 行のレイアウト・コンポーネントのwidthおよびheight属性

表のレイアウト・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、表のレイアウトをMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の行のレイアウト、イテレータ、属性リスト・イテレータまたはファセット定義子コンポーネントを表のレイアウト・コンポーネントに挿入します。

3. セル・フォーマット、イテレータ、属性リスト・イテレータまたはファセット定義子コンポーネントをそれぞれの行のレイアウト・コンポーネントに挿入します。

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-11は、MAF AMXファイルで定義されているtableLayout要素およびその子を示しています。

例6-11 表のレイアウトの定義

<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>

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

デッキ(deck)コンポーネントは、その子コンポーネントを一度に1つ表示するコンテナを表します。表示される子コンポーネント(displayedChild属性によって定義)の別の子コンポーネントへの遷移は、遷移(transition)操作により有効になります。遷移は、アニメーションの形式にできます。遷移の詳細は、第5.2.11項「ページ遷移スタイルの指定方法」を参照してください。

デッキは前後に移動できます。

デッキ・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、デッキをMAF AMXページにドラッグ・アンド・ドロップします。

2. 必要な数の遷移操作および子UIコンポーネントをデッキ・コンポーネントに挿入します。

3. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-12は、MAF AMXファイルで定義されているdeck要素およびその子を示しています。デッキ・コンポーネントのdisplayedChild属性は、表示する子コンポーネントIDを定義します。通常、ボタンを1つ選択などの選択コンポーネントによってこのことが制御されます。

例6-12 デッキ定義

<amx:deck id="deck1"
rendered="#{pageFlowScope.pRendered}"
styleClass="#{pageFlowScope.pStyleClass}"
inlineStyle="width:95px;height:137px;overflow:hidden;
#{pageFlowScope.pInlineStyle}"
landmark="#{pageFlowScope.pLandmark}"
shortDesc="#{pageFlowScope.pShortDesc}"
displayedChild="#{pageFlowScope.pDisplayedChild}">

<amx:transition triggerType="#{pageFlowScope.pTriggerType}"
transition="#{pageFlowScope.pTransition}"/>
<amx:transition triggerType="#{pageFlowScope.pTriggerType2}"
transition="#{pageFlowScope.pTransition2}"/>
<amx:commandLink id="linkCardBack1" text="Card Back">>
<amx:setPropertyListener from="linkCardA"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardA1" text="Card Front A">
<amx:setPropertyListener id="setPL1"
from="linkCardB"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardB1" text="Card Front B">
<amx:setPropertyListener id="setPL2"
from="linkCardC"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardC1" text="Card Front C">
<amx:setPropertyListener id="setPL3"
from="linkCardD"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardD1" text="Card Front D">
<amx:setPropertyListener id="setPL4"
from="linkCardE"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
<amx:commandLink id="linkCardE1" text="Card Front E">
<amx:setPropertyListener id="setPL5"
from="linkCardBack"
to="#{pageFlowScope.pDisplayedChild}"/>
</amx:commandLink>
</amx:deck>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

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

フラグメント(fragment)コンポーネントは、MAF AMXページ・コンテンツの共有を有効にします。このコンポーネントは、MAF AMXフラグメント・ファイルと組み合せて使用されます。詳細は、第5.3.1.6項「ページ・コンテンツの共有」を参照してください。

フラグメント・コンポーネントを追加するには:

1. 「コンポーネント」ウィンドウで、フラグメントをMAF AMXページにドラッグ・アンド・ドロップします。

2. 「フラグメントの挿入」ダイアログを使用して、フラグメントのSrc属性をフラグメント・ファイル(.amxf)に設定します。

3. オプションで、「構造」ビューを使用して、属性、属性リストまたはファセットなどの子コンポーネントを追加します。

図6-13 フラグメントへの移入

4. 「プロパティ」ウィンドウを使用して、追加したすべてのコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

5. フラグメントにコンテンツを含めるMAF AMXフラグメント・ファイルにファセット定義(facetRef)を追加し、facetRefのfacetName属性をファセットの名前に設定します。

例5-12「MAF AMXページ内のフラグメント」は、MAF AMXページに追加されたfragment要素を示しています。例5-11「フラグメント定義」は、対応するMAF AMXフラグメント・ファイルを示しています。

FragmentDemoという名前のMAFサンプル・アプリケーションは、フラグメントの作成方法および使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

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

MAF AMXアプリケーション機能を開発する際は、次のUIコンポーネントを使用できます。

- 入力テキスト(第6.3.1項「入力テキスト・コンポーネントの使用方法」を参照)

- 入力数値スライダ(第6.3.2項「入力数値スライダ・コンポーネントの使用方法」を参照)

- 入力日(第6.3.3項「入力日コンポーネントの使用方法」を参照)

- 出力テキスト(第6.3.4項「出力テキスト・コンポーネントの使用方法」を参照)

- ボタン(第6.3.5項「ボタンの使用方法」を参照)

- リンク(第6.3.6項「リンクの使用方法」を参照)

- イメージ(第6.3.7項「イメージの表示方法」を参照)

- チェックボックス(第6.3.8項「チェックボックス・コンポーネントの使用方法」を参照)

- チェックボックスを複数選択(第6.3.9項「チェックボックスを複数選択コンポーネントの使用方法」を参照)

- 選択肢を複数選択(第6.3.11項「選択肢を複数選択コンポーネントの使用方法」を参照)

- ブール・スイッチ(第6.3.12項「ブール・スイッチ・コンポーネントの使用方法」を参照)

- 選択肢(第6.3.10項「選択肢コンポーネントの使用方法」を参照)

- 選択ボタン(第6.3.13項「選択ボタン・コンポーネントの使用方法」を参照)

- ラジオ・ボタン(第6.3.14項「ラジオ・ボタン・コンポーネントの使用方法」を参照)

- リスト・ビュー(第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)

- カルーセル(第6.3.16項「カルーセル・コンポーネントの使用方法」を参照)

- フィルム・ストリップ(第6.3.17項「フィルム・ストリップ・コンポーネントの使用方法」を参照)

- Verbatim (第6.3.18項「Verbatimコンポーネントの使用方法」を参照)

- 出力HTML (第6.3.19項「出力HTMLコンポーネントの使用方法」を参照)

- イテレータ(第6.3.20項「反復の有効化方法」を参照)

MAF AMXアプリケーション機能を開発する際は、UIコンポーネントの子として、操作、リスナー・タイプ・コンポーネントおよびコンバータなど、次のその他のコンポーネントも使用できます。

- バンドルのロード(第6.3.21項「リソース・バンドルのロード方法」を参照)

- アクション・リスナー(第6.3.22項「アクション・リスナーの使用方法」を参照)

- プロパティ・リスナーの設定(第6.3.23項「プロパティ・リスナーの設定の使用方法」を参照)

- 日時の変換(第6.3.24項「日時の変換方法」を参照)

- 数値の変換(第6.3.25項「数値の変換方法」を参照)

- ナビゲーション・ドラッグ動作(第6.3.26項「ドラッグ・ナビゲーションを有効にする方法」を参照)

- ロード・インジケータ動作(第6.3.27項「ロード・インジケータの使用方法」を参照)

UIコンポーネントを追加するには、それを「コンポーネント」ウィンドウからMAF AMXページにドラッグ・アンド・ドロップします(第5.3.2.1項「UIコンポーネントの追加」を参照)。次に、「プロパティ」ウィンドウを使用して、コンポーネントの属性を設定します(第5.3.2.3項「UIコンポーネントの構成」を参照)。特定のコンポーネントごとの属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

注意:

MAF AMXページで、レイアウト・コンポーネント内にUIコンポーネントを配置します(第6.2項「ページ・レイアウトの設計」を参照)。UI要素は、<dvtm>ネームスペースの下で宣言されるデータ視覚化コンポーネントを除き、<amx>ネームスペースの下で宣言されます。

いくつかのUIコンポーネントにはイベント・リスナーを追加できます。詳細は、第6.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもMAF AMXランタイムの記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

これらのUIコンポーネントにおけるアクセシビリティのサポートの詳細は、第6.8項「MAFのアクセシビリティのサポートの理解」を参照してください。

MAF AMXを使用してiOSプラットフォーム用に作成されたユーザー・インタフェースは、言語環境が左から右、右から左のいずれであっても正しく表示されます。後者の場合、コンポーネントは画面の左側ではなく右側から表示されます。

注意:

MAFでは、デザインタイムにEL式を評価しません。コンポーネントの属性の値が式に設定されている場合、この値はJDeveloperのプレビューでは式として表示され、実行時のコンポーネントの表示は異なる場合があります。

CompGalleryという名前のMAFサンプル・アプリケーションは、MAF AMX UIコンポーネントの作成方法および構成方法を示しています。UIDemoという名前のもう1つのサンプル・アプリケーションは、MAF AMXページでのコンポーネントのレイアウト方法を示しています。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

6.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" />

図6-14は、「プレビュー」ペインに表示されている入力テキスト・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputText id="inputText1"
label="Input Text"
value="text"/>

図6-14 デザインタイムの入力テキスト

inputType属性によって、コンポーネントでユーザー入力がどのように(テキスト(デフォルト)、電子メール・アドレス、数値、電話銀号、URLのいずれかとして)解釈されるのかを定義できます。これらの入力タイプは、HTML5によって許容される値に基づいています。

入力テキスト・コンポーネントに入力される日時値とともに数値の変換を有効にするには、数値の変換(第6.3.25項「数値の変換方法」を参照)および日時の変換(第6.3.24項「日時の変換方法」を参照)コンポーネントを使用します。

詳細、図および例は、次を参照してください。

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

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery。

いくつかのモバイル・デバイスでは、エンド・ユーザーが入力テキスト・フィールドをタップすると、キーボードが表示(スライドアップ)されます。入力テキストがMAF AMXページの唯一のコンポーネントである場合、ページがロードされるときに、デフォルトで入力フォーカスはこのフィールド上に配置され、キーボードが表示されます。

複数行入力テキストは、それが唯一のコンポーネントである場合、セカンダリ・ページに表示されることがあります。その場合、ページがロードされてキーボードが表示されたときに複数行入力テキストがフォーカスを受け取ります。

iOSデバイスとAndroidデバイスでは、入力テキスト・コンポーネントのレンダリングおよび動作は異なります。iPhoneおよびiPadでは、入力テキスト・コンポーネントが表示されるときに境界線がある場合とない場合があります。

入力テキスト・コンポーネントを作成する際は、次の点を考慮してください。

- コンテンツを入力または編集するには、エンド・ユーザーはフィールド内をタップする必要があります。それにより、タップした場所に点滅する挿入カーソルが表示され、エンド・ユーザーがコンテンツを編集できるようになります。フィールドにコンテンツが含まれていない場合、挿入カーソルはフィールドの先頭に配置されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、通常、プロンプトとして使用されるデフォルト・テキストが含まれていることがあります。エンド・ユーザーがそのようなフィールド内でキーボードのキーをタップすると、編集モードになったときにそのデフォルト・テキストがクリアされます。この動作は入力テキストのhintText属性により有効にされ、構成されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、選択済の外観はありません。選択は、フィールド内の点滅する挿入カーソルによって示されます。

- エンド・ユーザーがフィールドに収まる数を超えたテキストを入力すると、タイピングの続行に従って一度に1文字ずつテキスト・コンテンツが左にシフトします。

- 複数行入力テキスト・コンポーネントは、任意の高さの矩形としてレンダリングされます。このコンポーネントでは、コンテンツが大きすぎてフィールドの境界内に収まらない場合のスクロールがサポートされています。テキスト領域が一杯になるとテキストの行が上にスクロールし、新しい行のテキストが追加されます。指定された表示領域に表示できる数よりも多くの行がある場合、エンド・ユーザーは上または下にフリックしてテキストの行をスクロールできます。コンポーネント内にスクロールバーが表示されてその領域がスクロール可能であることを示します。

- パスワード・フィールドは入力された各文字を一時的にエコーし、その後、その文字をドットに変換してパスワードを保護します。

- iOSでの入力テキスト・コンポーネントの外観および動作はカスタマイズ可能です(第6.3.1.1項「入力テキスト・コンポーネントのカスタマイズ」を参照)。

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

MAF AMXは、iOSデバイスでの入力時の先頭大文字化および修正のサポートを提供するとともに、単一行入力テキスト・コンポーネントのために、モバイル・デバイスのソフト・キーパッドの右下にある「return」ボタン(図6-15を参照)をオーバーライドして、その表示と動作を「Go」または「Search」ボタンのものに置き換え(図6-16を参照)、DataChangeEventをトリガーするようにする機能を提供します。

図6-15 実行時のiOSデバイスの「Return」ボタン

図6-16 実行時のiOSの「Go」および「Search」ボタン

表6-3には、入力テキスト・コンポーネントの属性(そのコンポーネントの外観と動作、および入力テキストによって表されるフィールドへの値の入力に使用するソフト・キーパッドの外観と動作をカスタマイズできるようにする)がリストされています。

表6-3 入力テキスト・コンポーネントの入力カスタマイズ属性

属性

値

説明

keyboardDismiss

- normal: オペレーティング・システムのデフォルトを使用します。

- go: フィールドが動作のトリガーとして動作するよう要求します。

- search: フィールドが参照をトリガーする検索フィールドとして動作するよう要求します。

テキスト・フィールドをどのように使用するかを示します。

goまたはsearchを指定した場合、キーパッドを終了するとiOSおよびAndroidプラットフォームの両方で入力があいまいになります。

iOSでの「Go」および「Search」ボタンのサポートは変更が予定されており、いずれかの時点で終了する可能性がありますが、一部のiOSデバイスのキーパッドには拡張機能が備えられています。たとえば、単一行テキスト・フィールドについては、「return」ボタンが表示されるかわりに、すでに「Go」または「Search」ボタンに置き換えられている場合があります。

autoCapitalize

- auto: オペレーティング・システムのデフォルトを使用します。

- sentences: 入力を構成する文の先頭を大文字にすることを要求します。

- none: 入力に先頭大文字化が自動的に適用されないことを要求します。

- words: 入力を構成する単語が大文字で始まることを要求します。

- characters: 入力されたすべての文字が大文字化されることを要求します。

入力テキストによって表されるフィールドの編集中に、iOSによる、値の大文字化に関する特別な処理を要求します。

Androidでは、このプロパティを設定しても影響がないことに注意してください。

autoCorrect

- auto: オペレーティング・システムのデフォルトを使用します。

- on: 入力の自動修正サポートを要求します。

- off: 入力の自動修正を無効にするよう要求します。

入力テキストによって表されるフィールドの編集中に、iOSによる、値の修正に関する特別な処理を要求します。

Androidでは、このプロパティを設定しても影響がないことに注意してください。

iOSによって提供される、デバイス・シミュレータでの自動大文字化および自動修正のサポートは限定的であるため、iOSデバイスでこの機能をテストする必要があります。

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

入力数値スライダ(inputNumberSlider)コンポーネントは、キーを使用して値を入力するかわりにスライダを使用して値の範囲から数値を選択できるようにします。スライダの溝またはトラックの塗り潰されている部分が、現在の値を視覚的に表しています。

スライダの値を数値的に示すには、出力または入力テキスト・コンポーネントとともに入力数値スライダを使用できます。入力テキスト・コンポーネントではスライダ値を直接入力することもできます。エンド・ユーザーが入力テキスト・フィールドをタップすると、数値モードのキーボードがスライドアップします。このキーボードは、スライドダウン・ボタンを使用するか、スライダ・コンポーネントからタップすることにより消去できます。

入力数値スライダ・コンポーネントは、常に、コンポーネントの定義済範囲内の最大値および最小値を表示します。

注意:

入力数値スライダ・コンポーネントは、正確な数値入力が必要な場合や値の範囲が広い場合(たとえば、0から1000)は使用しないでください。

例6-13は、MAF AMXファイルで定義されているinputNumberSlider要素を示しています。

例6-13 入力数値スライダの定義

<amx:inputNumberSlider id="slider1" value="#{myBean.count}"/>

図6-17は、「プレビュー」ペインに表示されている入力数値スライダ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputNumberSlider id="inputNumberSlider1"
label="Input Number"
minimum="0"
maximum="20"
stepSize="1"
value="10"/>

図6-17 デザインタイムの入力数値スライダ

入力数値スライダ・コンポーネントに入力される数値の変換を有効にするには、数値の変換コンポーネント(第6.3.25項「数値の変換方法」を参照)を使用します。

詳細、図および例は、次を参照してください。

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

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery。

他のMAF AMX UIコンポーネントと同様に、入力数値スライダ・コンポーネントには通常の状態と選択済状態があります。コンポーネントは、いつでもタッチされたときに選択済状態になります。エンド・ユーザーは、スライダ値を変更するには、タッチしてからスライダ・ボタンを操作します。

入力数値スライダ・コンポーネントには、エンド・ユーザーに追加情報を提供するためにスライダのいずれかの側に表示できるイメージを指すオプションのimageLeftおよびimageRight属性があります。

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

入力日(inputDate)コンポーネントは、日付を入力するためのポップアップ入力フィールドを提示します。デフォルトの日付フォーマットは、現在のロケールに適切な省略の日付フォーマットです。たとえば、米語(ENU)のデフォルトの書式はmm/dd/yyです。inputType属性によって、コンポーネントが入力として日付、時刻または日時を受け入れるのかどうかが定義されます。タイムゾーンは、モバイル・デバイスに対して構成されているタイムゾーンに依存します。したがって、デバイスに関連しています。実行時、入力日コンポーネントのルック・アンド・フィールはそのデバイスのネイティブのものになります。

例6-14は、MAF AMXファイルで定義されているinputDate要素を示しています。このコンポーネントのinputType属性は、デフォルト値のdateに設定されています。value属性が読取り専用の場合、これはEL式またはその他の任意のタイプの値のいずれかに設定でき、value属性が読取り専用でない場合は、EL式としてのみ指定できます。

例6-14 入力日の定義

<amx:inputDate id="inputDate1" label="Input Date" value="#{myBean.date}"/>

詳細は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- W3Cによって定義されているHTML5のグローバル日付と時刻

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.4 出力テキスト・コンポーネントの使用方法

MAF AMXは、テキストを表示するラベルとして使用するために出力テキスト(outputText)コンポーネントを提供しています。

例6-15は、MAF AMXファイルで定義されているoutputText要素を示しています。

例6-15 出力テキストの定義

<amx:outputText id="ot1"
value="output"
styleClass="#{pageFlowScope.pStyleClass}"/>

図6-18は、「プレビュー」ペインに表示されている出力テキスト・コンポーネントを示しています。

図6-18 デザインタイムの出力テキスト

出力テキスト・コンポーネントの数値および日時関連データの変換を容易にするには、数値の変換(第6.3.25項「数値の変換方法」を参照)および日時の変換(第6.3.24項「日時の変換方法」を参照)コンバータを使用します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGalleryおよびUIDemo

6.3.5 ボタンの使用方法

ボタン(commandButton)コンポーネントは、アクション(たとえば、保存、取消し、送信)をトリガーするため、およびアプリケーション内で他のページへのナビゲーション(たとえば、戻る。第6.3.5.7項「戻るボタン・ナビゲーションの有効化」を参照)を有効化するために使用します。

ボタンは、次の方法のいずれかで使用できます。

- テキスト・ラベル付きボタン。

- テキスト・ラベルおよびイメージ・アイコン付きボタン。

注意:

アイコン・イメージと配置(テキスト・ラベルの左または右)を定義できます。

- イメージ・アイコンのみが付いたボタン(たとえば、レコードを追加または削除するための + および - ボタン)。

MAFでは、次の3つの表示領域に対して1つのデフォルト・ボタン・タイプがサポートされています。

1. 最上部ヘッダー・バーに表示されるボタン。MAF AMXページでは、ヘッダーは、ヘッダー、プライマリおよびセカンダリ・ファセットと組み合せたパネル・ページ・コンポーネントによって表され、iPhoneではこれが一般的です(第6.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- ヘッダー・ファセットには、ページ・タイトルが含まれています。

- プライマリ・アクション・ファセットは、 ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセットは、ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

2. ページのコンテンツ領域に表示されるボタン。

3. ページのフッター・バーに表示されるボタン。MAF AMXページでは、フッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第6.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- フッター・ファセットは、コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

どのタイプでも、すべてのボタン・コンポーネントには次の3つの状態があります。

1. 標準。

2. アクティブ: ボタンがエンド・ユーザーによってタップまたはタッチされたときの外観を表します。ボタンがタップされた(タッチされてリリースされた)ときに、ボタン・アクションが実行されます。タッチしたときにアクティブ化された外観が表示され、リリースしたときにアクションが実行されます。エンド・ユーザーがボタンにタッチした後、指をドラッグしてボタンから離した場合、アクションは実行されません。ただし、ボタンにタッチしている間中、アクティブ化された外観が表示されます。

3. 無効。

ボタン・コンポーネントの外観は、adfmf-commandButton-<style>に設定したそのstyleClass属性によって定義されます。表6-4に示すどのスタイルでも、MAF AMXページ内の有効な任意の場所に配置されているボタンに適用できます。

表6-4 主なボタン・スタイル

ボタン・スタイル名

説明

デフォルト

次の場所に配置されているボタンのデフォルト・スタイル

- いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)内。詳細は、第6.3.5.1項「デフォルト・スタイル・ボタンの表示」を参照してください

- MAF AMXページのコンテンツ領域内の任意の場所。このスタイルは、ページ内のボタンの場所またはコンテキストに基づいてそのページ内で特定のアクションを実行するためのボタンに対して使用されます。

戻る

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)に配置されるボタンの戻るスタイル。このスタイルを、デフォルト・ボタンに適用すると、ページに戻るという外観を表示できます。このボタン・スタイルは、Springboardに戻るまたはページに戻るボタンによく使用されます。

詳細は、第6.3.5.2項「戻るスタイル・ボタンの表示」を参照してください

強調表示

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)またはMAF AMXページのコンテンツ領域に配置されるボタンの強調表示スタイル。このスタイルをボタンに追加すると、保存(または完了)ボタンで一般的なiPhoneボタンの外観を提供できます。

詳細は、第6.3.5.3項「強調表示スタイル・ボタンの表示」を参照してください

アラート

アラート・スタイルは削除の外観をボタンに追加します。詳細は、第6.3.5.4項「アラート・スタイル・ボタンの表示」を参照してください

ボタンに適用して太い角丸の境界線でボタンを修飾できる角丸スタイル(adfmf-commandButton-rounded)があります(図6-19を参照)。このスタイルは他のどのようなスタイルとも組み合せて定義できます。

図6-19 デザインタイムの角丸ボタン

MAF AMXでは、追加の装飾スタイルがいくつか提供されています(第6.3.5.5項「追加のボタン・スタイルの使用方法」を参照)。

MAF AMXにおけるボタン・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第6.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

6.3.5.1 デフォルト・スタイル・ボタンの表示

パネル・ページ・ファセットまたはコンテンツ領域内に配置できる、次のような様々なタイプのデフォルト・スタイル・ボタンがあります。

- テキスト・ラベルのみが示される標準、アクティブまたは無効ボタン

- イメージ・アイコンのみが示される標準、アクティブまたは無効ボタン

例6-16および例6-17は、MAF AMXファイルで宣言されているcommandButton要素を示しています。

例6-16 テキスト・ラベル付きデフォルト・ボタンの定義

<amx:panelPage id="pp1">
<amx:facet name="primary">
<amx:commandButton id="cb1"
text="Cancel"
action="cancel"
actionListener="#{myBean.rollback}"/>
</amx:facet>
</amx:panelPage>

例6-17 イメージ・アイコン付きデフォルト・ボタンの定義

<amx:panelPage id="pp1">
<amx:facet name="primary">
<amx:commandButton id="cb1"
icon="plus.png"
action="add"
actionListener="#{myBean.AddItem}"/>
</amx:facet>
</amx:panelPage>

例6-18は、パネル・ページのフッター・ファセット内で宣言されているcommandButton要素を示しています。

例6-18 フッター・ファセットのテキスト・ラベルおよびイメージ付きデフォルト・ボタンの定義

<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>

例6-19は、パネル・ページのコンテンツ領域の一部で宣言されているcommandButton要素を示しています。

例6-19 ページ・コンテンツ領域におけるテキスト・ラベル付きデフォルト・ボタンの定義

<amx:panelPage id="pp1">
<amx:commandButton id="cb1"
text="Reply"
actionListener="#{myBean.share}"/>
</amx:panelPage>

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.5.2 戻るスタイル・ボタンの表示

パネル・ページ・ファセットまたはコンテンツ領域内に配置される、次のような様々なタイプの戻るスタイル・ボタンがあります。

- テキスト・ラベルのみが示される標準、アクティブまたは無効ボタン

- イメージ・アイコンのみが示される標準、アクティブまたは無効ボタン

例6-20は、MAF AMXファイルで宣言されているcommandButton要素を示しています。

例6-20 テキスト・ラベル付き戻るボタンの定義

<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に設定した場合は常に、図6-20のように、MAF AMXによって戻る矢印スタイリングがそれに自動的に適用されます。

図6-20 デザインタイムの戻るボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.5.3 強調表示スタイル・ボタンの表示

他のタイプのボタンと同様に、パネル・ページ・ファセットまたはコンテンツ領域内に配置される強調表示スタイル・ボタンは、標準、アクティブまたは無効の状態を取ることができます。

例6-21は、MAF AMXファイルで宣言されているcommandButton要素を示しています。

例6-21 テキスト・ラベル付き強調表示ボタンの定義

<amx:panelPage id="pp1">
<amx:facet name="secondary">
<amx:commandButton id="cb2"
text="Save"
action="save"
styleClass="adfmf-commandButton-highlight"/>
</amx:facet>
</amx:panelPage>

図6-21 デザインタイムの強調表示ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.5.4 アラート・スタイル・ボタンの表示

パネル・ページ内に配置されるアラート・スタイル・ボタンは、標準、アクティブまたは無効の状態を取ることができます。

例6-22は、MAF AMXファイルで宣言されているcommandButton要素を示しています。

例6-22 テキスト・ラベル付きアラート・ボタンの定義

<amx:commandButton id="cb1"
text="Delete"
actionListener="#{myBean.delete}"
styleClass="adfmf-commandButton-alert" />

図6-22 デザインタイムのアラート・ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.5.5 追加のボタン・スタイルの使用方法

MAF AMXでは、次の追加のボタン・スタイルが提供されます。

- 暗いスタイル

- 明るいスタイル

- 小さいスタイル

- 大きいスタイル

- 強調表示スタイル

- 確認スタイル

- 代替スタイルの2つのバリエーション

図6-23 追加のボタン・スタイル

6.3.5.6 アプリケーション内でのボタンの使用方法

MAFアプリケーションでは、次のコンテキスト内でボタン・コンポーネントを使用できます。

- ナビゲーション・バー

- 特定のアクションを実行するためのコンテンツ領域

- アクション・シート

- ポップスタイル・アラート・メッセージ

ナビゲーション・バー

MAFでは、ナビゲーション・バーで使用する標準ボタンを作成できます。

- 編集ボタンで、エンド・ユーザーは編集またはコンテンツ操作モードに入ることができます。

- 取消ボタンで、エンド・ユーザーは、変更を保存することなく編集またはコンテンツ操作モードを終了できます。

- 保存ボタンで、エンド・ユーザーは、変更を保存して編集またはコンテンツ操作モードを終了できます。

- 完了ボタンで、エンド・ユーザーは、変更があれば保存して現在のモードを終了できます。

- 元に戻すボタンで、エンド・ユーザーは最後のアクションを元に戻すことができます。

- やり直しボタンで、エンド・ユーザーは最後の元に戻したアクションをやり直すことができます。

- 戻るボタンで、エンド・ユーザーはSpringboardに戻ることができます。

- ページに戻るボタンで、エンド・ユーザーはボタン・テキスト・ラベルによって識別されるページに戻ることができます。

- 追加ボタンで、エンド・ユーザーは新しいオブジェクトを追加または作成できます。

コンテンツ領域

ページのコンテンツ領域内に配置されたボタンは、そのページ内のボタンの場所およびコンテキストに指定されている特定のアクションを実行します。これらのボタンは、ナビゲーション・バーに配置されているボタンとは異なる外観を持っている場合があります。

アクション・シート

アクション・シート内に配置されるボタンの例は、ノートの削除ボタンおよび取消ボタンのグループです。

アクション・シート・ボタンは画面の幅まで拡大されます。

アラート・メッセージ

OKボタンは、パスワード入力の失敗後のログイン検証など、検証メッセージ内に配置できます。

6.3.5.7 戻るボタン・ナビゲーションの有効化

MAF AMXでは、前に訪問したページに戻るデフォルト動作を持つ戻るボタンを使用した移動がサポートされています。詳細は、第5.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

__backナビゲーションを備えたパネル・ページのプライマリ・ファセットにボタン・コンポーネントを追加すると、そのボタンには、戻る矢印の視覚的スタイリングが自動的に設定されます(第6.3.5.2項「戻るスタイル・ボタンの表示」を参照)。これを無効にするには、styleClass属性をamx-commandButton-normalに設定します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.5.8 操作と属性の処理順序に関する必知事項

ボタン、リンク、リスト・アイテムなどのコンポーネントがアクティブになっている場合に、MAF AMXによって操作および属性が処理される順序は、次のとおりです。

1. 次の子操作は、XMLファイルに表示される順序で処理されます。

- プロパティ・リスナーの設定

- アクション・リスナー

- ポップアップ表示動作

- ポップアップを閉じる動作

2. アクション・リスナー(actionListener)属性が処理されて関連付けられたJavaメソッドが起動されます。

3. アクション(action)属性が処理されて、ナビゲーション・ケースがあればそれに従います。

6.3.6 リンクの使用方法

リンク(commandLink)コンポーネントは、アクションをトリガーするためおよび他のビューへのナビゲーションを有効化するために使用します。

リンク・コンポーネントは、その子として任意のタイプのコンポーネントを定義できます。プロパティ・リスナーの設定(第6.3.23項「プロパティ・リスナーの設定の使用方法」を参照)、アクション・リスナー(第6.3.22項「アクション・リスナーの使用方法」を参照)、ポップアップ表示動作、ポップアップを閉じる動作(第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)および検証動作(第6.9項「入力の検証」を参照)などのコンポーネントをリンク・コンポーネントの子として使用することで、クリックおよびジェスチャーを実行できるアクション可能な領域を作成できます。

リンク内にイメージ・コンポーネントを配置することで(第6.3.7項「イメージの表示方法」を参照)、クリック可能イメージを作成できます。

例6-23は、MAF AMXファイルで宣言されているcommandLink要素を示しています。

例6-23 基本的なリンクの定義

<amx:commandLink id="cl1"
text="linked"
action="gotolink"
actionListener="#{myBean.doSomething}"/>

図6-24は、「プレビュー」ペインに表示されている基本的なリンク・コンポーネントを示しています。

図6-24 デザインタイムのリンク

例6-24は、MAF AMXファイルで宣言されているcommandLink要素を示しています。このコンポーネントはpanelFormLayoutおよびpanelLabelAndMessageコンポーネント内に配置されます。

例6-24 フォーム内リンクの定義

<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>

図6-25は、フォーム内に配置され、「プレビュー」ペインに表示されているリンク・コンポーネントを示しています。

図6-25 デザインタイムのフォーム内リンク

MAF AMXにおけるリンク・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第6.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

MAF AMXでは、リンクに類似しているが、ページ間のナビゲーションは許可されない別のコンポーネントであるリンク(実行) (goLink)コンポーネントが提供されています。このコンポーネントを使用して、外部ページへのリンクを有効化できます。図6-26は、「プレビュー」ペインに表示されているリンク(実行)コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:goLink id="goLink1"
text="Go Link"
url="http://example.com"/>

図6-26 デザインタイムのリンク(実行)

イメージは、リンク(実行)コンポーネントの子として指定できる唯一のコンポーネントです。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.7 イメージの表示方法

MAF AMXでは、ビットマップによって表されるイメージ(image)コンポーネントを使用してiOSおよびAndroidデバイス上にイメージを表示できます。

ボタンおよびリスト・ビューにイメージを配置するだけでなく、それをリンク・コンポーネント内に配置して(第6.3.6項「リンクの使用方法」を参照)クリック可能イメージを作成できます。

例6-25は、MAF AMXファイル内のimage要素定義を示しています。

例6-25 イメージの定義

<amx:image id="i1"
styleClass="prod-thumb"
source="images/img-big-#{pageFlowScope.product.uid}.png" />

Androidプラットフォームでサポートされているフォーマットは次のとおりです。

- GIF

- JPEG

- PNG

- BMP

iOSプラットフォームでサポートされているフォーマットは次のとおりです。

- PNG

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGalleryおよびUIDemo

6.3.8 チェックボックス・コンポーネントの使用方法

チェックボックス(selectBooleanCheckbox)コンポーネントは、trueまたはfalseの値からの単一選択(選択済状態と選択解除状態の間で切り替えできる)を可能にするために作成するチェックボックスを表します。

チェックボックス・コンポーネントのlabel属性を使用するとチェックボックスの左側にテキストを配置でき、text属性を使用すると右側にテキストを配置できます。

例6-26は、MAF AMXファイルで宣言されているselectBooleanCheckbox要素を示しています。

例6-26 選択解除されたチェックボックスの定義

<amx:selectBooleanCheckbox id="check1"
label="Agree to the terms:"
value="#{myBean.bool1}"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図6-27は、「プレビュー」ペインに表示される選択解除されたチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="false"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図6-27 デザインタイムの選択解除されたチェックボックス

「プレビュー」ペインに表示される選択済のチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

例6-27 デザインタイムの選択済のチェックボックス

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="true"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図6-28 選択済のチェックボックスの定義

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.8.1 iOSプラットフォームでのチェックボックス・コンポーネントのサポート

iOSでは、ネイティブ・チェックボックス・コンポーネントはサポートされていません。ブール・スイッチは、通常、プロパティ・ページで使用され、ブール選択を可能にします(第6.3.12項「ブール・スイッチ・コンポーネントの使用方法」を参照)。

6.3.8.2 Androidプラットフォームでのチェックボックス・コンポーネントのサポート

Androidでは、ネイティブ・チェックボックス・コンポーネントがサポートされています。このコンポーネントは、設定ページで広く使用され、個々の設定値のオンとオフを切り替えます。

6.3.9 チェックボックスを複数選択コンポーネントの使用方法

チェックボックスを複数選択(selectManyCheckbox)コンポーネントは、trueまたはfalseの値の複数選択を可能にするために使用するチェックボックスのグループを表します。これにより、グループ内の各チェックボックスの選択済と選択解除の切替えが可能になります。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第6.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

チェックボックスを複数選択コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

例6-28は、MAF AMXファイルで宣言されているselectManyCheckbox要素を示しています。

例6-28 チェックボックスを複数選択の定義

<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>

図6-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>

図6-29 デザインタイムのチェックボックスを複数選択

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.9.1 チェックボックスを複数選択コンポーネントとユーザーとの対話に関する必知事項

MAF AMXでは、チェックボックスを複数選択コンポーネントを表示するための2つの代替方法が提供されています。ポップアップ・スタイル(デフォルト)とリスト・スタイル(使用可能な選択肢の数がデバイスの画面サイズを超えている場合に使用される)です。

iPhoneとiPadの両方でのポップアップスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストがポップアップに表示されます。選択を行うには、エンド・ユーザーは1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーはポップアップの外をタップするか、閉じるボタン( x )を使用してポップアップを閉じます。

ポップアップを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

選択肢の数がデバイスのサイズを超える場合、スクロール可能なリスト・ビュー(第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)を含むフルページ・ポップアップが生成されます。

iPhoneとiPadの両方でのリストスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照し、1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーは閉じるボタン( x )をタップします。

リストを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

注意:

どちらの場合も、選択を取り消すメカニズムは提供されていません。

6.3.10 選択肢コンポーネントの使用方法

選択肢(selectOneChoice)コンポーネントは、リストからの単一の値の選択を可能にするために使用するコンボ・ボックスを表します。この選択メカニズムは、選択肢コンポーネントに含まれているアイテムの選択コンポーネント(第6.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

選択肢コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

例6-29は、MAF AMXファイルのselectOneChoice要素の定義をselectItemsサブ要素とともに示しています。

例6-29 アイテムの選択コンポーネントを使用した選択肢の定義

<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>

例6-30 アイテムの選択コンポーネントを使用した選択肢の定義

<amx:selectOneChoice id="choice1"
label="Your state:"
value="#{myBean.myState}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItems id="selectItems1" value="myBean.allStates"/>
</amx:selectOneChoice>

図6-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>

図6-30 デザインタイムの選択肢

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.10.1 iOSプラットフォームでの選択肢コンポーネントとユーザーとの対話に関する必知事項

MAF AMXでは、選択肢コンポーネントを表示するため、ポップアップ・スタイルとドロップダウン・スタイルの2つの代替方法が提供されています。

iPhoneでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、選択肢のリストが、デフォルトで最初のオプションが選択された状態で表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照します。選択内容を保存するには、エンド・ユーザーはツール・バーの「終了」をタップします。

iPadでは、ユーザーの対話は、次の点を除いてiPhoneにおける対話と同様です。

- 選択のリストは、ポップアップ・ダイアログに表示されます。

- iPadのスタイリングが選択のリストの周囲に実装され、リストのソースを示すためにノッチが使用されます。

アイテムを選択しないで選択のリストを閉じるには、エンド・ユーザーはポップアップ・ダイアログの外をタップする必要があります。

注意:

選択のリストおよびツール・バーを表示するためのUIは、ブラウザにネイティブであり、CSSを使用してスタイリングすることはできません。

選択肢コンポーネント内のリスト値は、無効として表示できます。

選択肢の数がデバイスの表示サイズを超える場合、ネイティブな方法でスクロール可能なリスト・ページが生成されます。

6.3.10.2 Androidプラットフォームでの選択肢コンポーネントとユーザーとの対話に関する必知事項

Androidデバイスでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、ポップアップ・ダイアログ形式の選択肢のリストが表示されます。選択肢の数がデバイスのサイズ内に収まる場合は単純なポップアップが表示されます。この場合次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- ポップアップの外で1回タップするか戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

表示される選択肢の数がデバイス・サイズ内に収まらない場合は、ポップアップにスクロール可能リストが含まれます。その場合は次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- 戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

6.3.10.3 アイテムの選択コンポーネントの違いに関する必知事項

アイテムの選択(selectItems)コンポーネントは、複数選択コンポーネントおよび単一選択コンポーネントの両方で選択できるオブジェクトのリストを提供します。

アイテムの選択(selectItem)コンポーネントは、選択コンポーネントの単一選択可能なアイテムを表します。

6.3.11 選択肢を複数選択コンポーネントの使用方法

選択肢を複数選択(selectManyChoice)コンポーネントは、リストの複数の値の選択を可能にします。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第6.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

チェックボックスを複数選択コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

例6-31は、MAF AMXファイルで宣言されているselectManyChoice要素を示しています。

例6-31 アイテムの選択コンポーネントを使用した選択肢を複数選択の定義

<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>

図6-31 デザインタイムの選択肢を複数選択

例6-32 アイテムの選択コンポーネントを使用した選択肢を複数選択の定義

<amx:selectManyChoice id="check1"
label="Select Shipping Options:"
value="#{myBean.shipping}">
<amx:selectItems id="selectItems1" value="#{myBean.shippingOptions}"/>
</amx:selectManyChoice>

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

すべてのサポートされているデバイス上の選択肢を複数選択コンポーネントの外観と動作は、チェックボックスを複数選択コンポーネントとほとんど同一です(詳細は、第6.3.9項「チェックボックスを複数選択コンポーネントの使用方法」を参照してください)。

6.3.12 ブール・スイッチ・コンポーネントの使用方法

ブール・スイッチ(selectBooleanSwitch)コンポーネントは、チェックボックスのかわりのスイッチ・メタファーとしてのブール値の編集を可能にします。

他のMAF AMX UIコンポーネントと同様に、このコンポーネントには標準および選択済の状態があります。値を切り替えるには、エンド・ユーザーはスイッチを1回タップ(タッチしてリリース)します。タップするたびにスイッチが切り替わります。

例6-33は、MAF AMXファイルで定義されているselectBooleanSwitch要素を示しています。

例6-33 ブール・スイッチの定義

<amx:selectBooleanSwitch id="switch1"
label="Flip switch:"
onLabel="On"
offLabel="Off"
value="#{myBean.bool1}"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図6-32は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanSwitch id="selectBooleanSwitch1"
label="Switch"
value="value1"
valueChangeListener=
"#{PropertyBean.ValueChangeHandler}"/>

図6-32 デザインタイムのブール・スイッチ

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.12.1 iOSプラットフォームでのブール・スイッチ・コンポーネントのサポートに関する必知事項

iOSでは、プール・スイッチ・コンポーネントは、属性値を有効化または無効化するために設定ページでよく使用されます。

6.3.12.2 Androidプラットフォームでのブール・スイッチ・コンポーネントのサポートに関する必知事項

Androidプラットフォームでは、ブール・スイッチ・コンポーネントは直接サポートされていません。かわりに、Androidでは、タップすると選択済状態と選択解除状態が切り替わるトグル・ボタンが提供されています。

6.3.13 選択ボタン・コンポーネントの使用方法

選択ボタン(selectOneButton)コンポーネントは、常に1つのボタンがアクティブになっている、アクションをリストするボタン・グループを表します。この選択メカニズムは、選択ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第6.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

選択ボタン・コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

例6-34は、MAF AMXファイルで定義されているselectOneButton要素を示しています。

例6-34 選択ボタンの定義

<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>

図6-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>

図6-33 デザインタイムの選択ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.14 ラジオ・ボタン・コンポーネントの使用方法

ラジオ・ボタン(selectOneRadio)コンポーネントは、使用可能な選択肢をリストするラジオ・ボタンのグループを表します。この選択メカニズムは、ラジオ・ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第6.3.10.3項「アイテムの選択コンポーネントの違いに関する必知事項」を参照)によって提供されます。

注意:

ラジオ・ボタン・コンポーネントには、アイテムの選択コンポーネントを2つ以上含めることができます。

例6-35および例6-36は、MAF AMXファイル内のselectOneRadio要素定義を示しています。

例6-35 アイテムの選択コンポーネントを使用したラジオ・ボタンの定義

<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>

例6-36 アイテムの選択コンポーネントを使用したラジオ・ボタンの定義

<amx:selectOneRadio id="radio1"
label="Choose a pet:"
value="#{myBean.myPet}"
valueChangeListener="#{PropertyBean.ValueChangeHandler}">
<amx:selectItems id="selectItems1" value="myBean.allPets"/>
</amx:selectOneRadio>

図6-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>

図6-34 デザインタイムのラジオ・ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.15 リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法

リスト・ビュー(listView)・コンポーネントを使用して、エンド・ユーザーが1つのオプションを選択できる選択肢のリストとしてデータを表示します。

通常、リスト・アイテム(listItem)・コンポーネントは、リスト・ビュー・コンポーネント内の1つのアイテムを表しており、リスト・アイテム・コンポーネントをリスト・ビュー内に配置して、データ・アイテムのリストのレイアウト設定またはスタイル設定をします。各アイテムは複数のリスト・アイテム・コンポーネントを含むことができ、この場合、リスト・アイテム・コンポーネントはアイテム(行)を満たし、過剰なリスト・アイテム・コンポーネントは後続行に折り返します。これを構成するには、リスト・ビューのlayout属性をcardsに設定します(デフォルトのレイアウトはrowsであり、リスト内の1つのアイテム当たり1つのリスト・アイテム・コンポーネントが表示されます)。詳細は、第6.3.15.3項「リスト・ビュー・レイアウトの構成」を参照してください。

リスト・ビューによって、次のうち1つを定義できます。

- リスト(コレクション)内のアイテム数に基づいてレプリケートされる選択可能なアイテム。

- リスト・ビューのvar属性およびvalue属性を指定することなく子リスト・アイテム・コンポーネントを追加することによって生成される静的アイテム。これらの静的アイテムは必要な数を追加できます。これは、設計時にリストのコンテンツがわかっている場合に便利です。この場合、リストは編集可能ではなく、メニュー・アイテムのセットのように動作します。

リスト・アイテム・コンポーネントは、実行時にスワイプ・ジェスチャーに応答します(第6.4項「ジェスチャーの有効化」を参照)。

次のタイプのリスト・ビュー・コンポーネントを作成できます。

- 基本リスト
例6-37は、MAF AMXファイルで定義されているlistView要素を示しています。この定義は、基本コンポーネントに対応しています。

例6-37 基本リスト・ビューの定義

<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>

図6-35は、デザインタイムの基本リスト・ビュー・コンポーネントを示しています。

図6-35 デザインタイムの基本リスト・ビュー

例6-38は、MAF AMXファイル内のlistView要素のもう1つの定義を示しています。この定義も基本コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

例6-38 基本リスト・ビューの定義

<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;"を追加します。

- アイコン付きリスト
例6-39は、MAF AMXファイルで定義されているlistView要素を示しています。この定義は、アイコン付きコンポーネントに対応しています。

例6-39 アイコン付きリスト・ビューの定義

<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>

図6-36は、デザインタイムのアイコンおよびテキスト付きリスト・ビュー・コンポーネントを示しています。

図6-36 デザインタイムのアイコン付きリスト・ビュー

- 検索付きリスト

- 区切り付きリスト。このタイプのリストでは、データをグループ化して順序を示すことができます。リスト・ビュー・コンポーネントの属性によって、各区切りの特性が定義されます。属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。
MAF AMXでは、次のことを実行できるリスト区切りが提供されています。

- そのコンテンツを個別に閉じます。

- 各区切り内のアイテム数を表示します。

- 同時に閉じます。

例6-40は、MAF AMXファイルで定義されているlistView要素を示しています。この定義は、折りたたみ可能な区切りおよびアイテム数付きのコンポーネントに対応しています。

例6-40 区切り付きリスト・ビューの定義

<amx:listView id="list1"
value="#{bindings.data.collectionModel}"
var="row"
collapsibleDividers="true"
collapsedDividers="#{pageFlowScope.mylistDisclosedDividers}"
dividerMode="all"
dividerAttribute="type"
showDividerCount="true"
showMoreStrategy="autoScroll"
bufferStrategy="viewport"
fetchSize="10">
<amx:listItem>
<amx:outputText id="ot1" value="#{row.name}">
</amx:listItem>
</amx:listView>

注意:

区切り付きリストでは、受け取ったデータがすでにソートされていることを想定し、データをソートしないため、このリストのデータはdividerAttributeによってソートする必要があります。

注意:

リスト・ビュー・コンポーネントが編集モードになっている(つまり、そのeditMode属性が指定されている)場合、区切りは表示されません。

区切りが表示されている場合、エンド・ユーザーは、dividerMode属性がfirstLetterに設定されているリスト・ビュー・コンポーネントで使用できる、リスト・ビューのローカライズ済アルファベット順索引ユーティリティを使用して、特定の区切りにすばやく移動できます。sectionIndex属性をoffに設定すると、このユーティリティを無効にできます。

索引ユーティリティ(インデクサ)は索引バーおよび索引アイテムで構成され、次の特徴があります。

- リストに未ソートのデータまたは重複する区切りが含まれている場合、索引アイテムはリスト内で最初にあるものを指します。

- 使用可能な文字は索引で強調表示されているもののみで、強調表示されている文字のみがアクティブになります。これは、データ・モデルの変更(たとえば、エンド・ユーザーが「次へ」行アイテムをタップした場合)によってトリガーされます。

- 索引では大/小文字は区別されません。

- 不明な文字はハッシュ( # )記号で隠されます。

インデクサ文字は、リストにロード済の行でのみアクティブ化(タップ)できます。たとえば、リスト・ビューでfetchSize属性を使用して文字Cまでの行をロードしている場合は、AからCまでの文字がインデクサによって有効化されます。その他の文字は、インデクサにさらに行がロードされると表示されるようになります。

表6-5は、索引ユーティリティに定義できるスタイルを示しています。

表6-5 リスト・ビューの索引スタイル

styleClass名

説明

adfmf-listView-index

索引バーのスタイルを定義します。

adfmf-listView-indexItem

索引バーの1つのアイテムのスタイルを定義します。

adfmf-listView-indexItem-active

関連する区切りへのリンクを持つ索引バーのアイテムのスタイルを定義します。

adfmf-listView-indexCharacter

索引バーの文字のスタイルを定義します。

adfmf-listView-indexBullet

索引バーの2つの文字間の黒丸のスタイルを定義します。

adfmf-listView-indexOther

索引バーのすべての不明文字を表す文字のスタイルを定義します。

区切りが表示されているリスト・ビュー・コンポーネントがスクロールを提供するコンテナとして機能し、スクロール対象となった場合、区切りはビューの上部に固定されます。この場合、リスト・ビュー・コンポーネントの高さを明示的に設定する必要があります。その他のすべての場合で、リスト・ビュー自体ではスクロールを実行せず、かわりに親コンテナ(パネル・ページなど)のスクロールを使用する場合は、リスト・ビューに高さの制約は設定されず、その子コンポーネントによって高さが決定されます。明確な高さの制約がないことにより、実質的に、アニメーション化された遷移および区切りの固定が無効になります。

- 凹枠リスト
例6-41は、MAF AMXファイルで定義されているlistView要素を示しています。この定義は、凹枠コンポーネントに対応しています。

例6-41 凹枠リスト・ビューの定義

<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>

図6-37は、デザインタイムの凹枠リスト・ビュー・コンポーネントを示しています。

図6-37 デザインタイムの凹枠リスト・ビュー

例6-42は、MAF AMXファイル内のlistView要素のもう1つの定義を示しています。この定義も凹枠コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

例6-42 凹枠リストの定義

<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におけるリスト・アイテム・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第6.3.5.8項「操作と属性の処理順序に関する必知事項」を参照してください。

他のMAF AMXコンポーネントとは異なり、リスト・ビューをMAF AMXページにドラッグ・アンド・ドロップすると、「ListViewギャラリ」というダイアログが表示されます(図6-38を参照)。このダイアログでリスト・ビューに対して特定のレイアウトを選択できます。

図6-38 「ListViewギャラリ」ダイアログ

表6-6には、「ListViewギャラリ」に表示される、サポートされる「リスト・フォーマット」がリストされています。

表6-6 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」(図6-38を参照)は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表(図6-39を参照)に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルトの「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプション(図6-38を参照)では、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログ(図6-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つのバリエーションがあり、表6-7に示す16の固有の説明が提供されています。

表6-7 リスト・ビューのバリエーションとスタイル

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドがリスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドがリスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「ListViewギャラリ」で選択し、「OK」をクリックすると、「リスト・ビューの編集」ウィザードが起動されます。それを使用して、リスト・アイテム子コンポーネントに静的テキストを表示するバインドなしリスト・ビュー・コンポーネント(図6-39を参照)を作成するか、または動的バインディングのデータソースを選択(図6-40を参照)できます。

図6-39 バインドなしリスト・ビューの作成

図6-39に示すダイアログに入力する際は、次の点を考慮してください。

- 「リスト・データ・コレクション」および「要素タイプ」フィールドは、「データのバインド」チェックボックスが選択解除された状態のときは無効化されています。

- 左側にあるイメージは、選択されているリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映しています。

- 「値」列の編集可能セルには、静的テキスト文字列が移入されます(表6-8を参照)。

- 「リスト・アイテム・コンテンツ」セルにイメージが含まれている場合、「値」セルはデフォルトで<add path to your image>文字列になります。この場合、それをイメージのパスに置き換える必要があります。

- 「リスト・アイテム選択」は選択モードを示します。詳細は、図5-74「MAF AMXリスト・ビューの編集ダイアログ」でこのオプションの説明を参照してください。

- リスト・ビューに、データがバインドされているのではなく、リスト・アイテム子コンポーネントが含まれている場合、区切り属性を設定できないため、「区切り属性」と「区切りモード」の両方のフィールドは無効化されています。

表6-8 リスト・ビューの静的テキスト文字列

リスト・フォーマット

要素行の値

出力テキストの値

シンプル

- テキスト

- 'ListItem Text'

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

- 'Main Text'

- 'This is the subordinate text.'

開始-終了

- 開始テキスト

- 終了テキスト

- 'Start Text'

- 'End Text'

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

- 'Upper Start Text'

- 'Upper End Text'

- 'Lower Start Text'

- 'Lower End Text'

図6-40は、リスト・ビュー・コンポーネントをデータにバインドすることを選択した場合の「リスト・ビューの作成」ダイアログを示しています。

図6-40 バインド済リスト・ビューの作成

図6-40に示すダイアログに入力する際は、次の点を考慮してください。

- 「データのバインド」チェックボックスを選択した場合、「リスト・データ・コレクション」フィールドが有効になります。「要素タイプ」フィールドは、式ビルダーを使用して「リスト・データ・コレクション」フィールドをEL式に設定すると有効になります。「DataControl定義」タブからデータ・コントロールを選択すると、「要素タイプ」フィールドは無効なままになります。

- データソースを選択するには、「参照」をクリックします。これによって「リスト・ビュー・データ・コレクションの選択」ダイアログが開きます。そこで、データ・コントロール定義を選択するか(図6-41を参照)、ELビルダーを使用して適切なEL式を選択できます(図6-42を参照)。

図6-41 データ・コントロール定義の選択

図6-42 EL式の選択

- 「要素タイプ」フィールドを使用してデータ・コレクションのタイプを宣言できます(図6-40を参照)。

- 有効なデータ・コレクションを選択すると、「リスト・アイテム・コンテンツ」表の「値」列が「値バインディング」に変更され、その編集可能なセルにはデータコレクションから属性のリストが移入されます。特別な場合の設定の説明は、図6-43を参照してください。

- 左側のイメージは、選択したリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映し、略図から基礎となる表の名前付き要素へのマッピングを提供します。

- リスト・アイテムは、その特定要素に対してどちらが適切であるかによって、出力テキストまたはイメージ・コンポーネントのいずれかとして生成されます。

- 要素(行)数は選択したリスト・ビュー・フォーマットであらかじめ決まっているため、行を追加または削除することはできません。

- 要素の順序は変更できません。

- 「区切り属性」フィールドのデフォルト値は「区切りなし」です。この場合、「区切りモード」フィールドは無効です。デフォルト以外の値を選択する場合は、「区切りモード」パラメータを指定する必要があります。さらに、「ListViewギャラリ」で区切りを含むバリエーションを選択した場合、デフォルト値はリストの最初の属性に設定されます。

バインド済リスト・ビューを作成するときに考慮する特殊な場合は次のとおりです。

- Java Beanメソッドによって汎用性がないリストが戻される場合、図6-40に示すように「要素タイプ」フィールドを使用して、リスト・アイテム・コンテンツを作成する必要があります。

- 入力されているリスト・データ・コレクション値がコレクションベースではない場合、図6-43に示すように、「値」列が空白の値を持つ「値バインディング」列に置換されます。

図6-43 非コレクションベース値の入力

詳細は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 第6.3.15.3項「リスト・ビュー・レイアウトの構成」

- 第5.3.2.4.3項「コレクションのドラッグ・アンド・ドロップ」

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのUIDemo。このサンプルは、様々なタイプのリスト・ビュー・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。

- 第D項「アプリケーションの使用方法の制限」

6.3.15.1 ページングおよび動的スクロールの構成

リスト・ビュー・コンポーネントを構成して、任意の長さのリストにデータを表示できます。これは、リストの下部にデータを追加することによって行います。

fetchSize属性によって、リスト・ビュー・コンポーネントが最初にロードする行数が決定されます。fetchSizeで定義されているよりも多くの使用可能な行がある場合は、最後にフェッチされた行の後にクリック可能領域が表示されます。この領域内をクリックすると、fetchSizeに等しい行のバッチがさらにロードされます。表示する行がなくなるとクリック可能領域は表示されなくなります。

fetchSize属性はロード済行の数を表していません。かわりに、これは1バッチ当たりにリスト・ビュー・コンポーネントがロードしようとする行数(つまり、行数がインクリメントする値)を表しています。リスト・ビュー・コンポーネントの作成時には、fetchSize属性は、デフォルトでPageDefイテレータのrangeSizeを指すEL式を使用するように設定されています。PageDefファイルの詳細は、第5.3.2.4.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」および図5-80「PageDefファイル」を参照してください。fetchSizeをrangeSizeと同じ値に設定するとアプリケーションのパフォーマンスが向上します。

例6-43は、データ・コントロールのtestResultsと呼ばれるコレクションから作成されたlistView要素を示しています(第5.3.2.4項「データ・コントロールのビューへの追加」を参照)。

例6-43 fetchSize属性の設定

<amx:listView var="row"
value="#{bindings.testResults.collectionModel}"
fetchSize="#{bindings.testResults.rangeSize}">

前述の例では、fetchSize属性はbindings.testResultsのrangeSizeを指しています。例6-44は、このMAF AMXページのPageDefファイルからの行を示しています。このPageDefファイルには、testResultsかバインドされるtestResultsIteratorというaccessorIterator要素が含まれています。

例6-44 PageDefファイルのaccessorIterator

<accessorIterator MasterBinding="Class1Iterator"
Binds="testResults"
RangeSize="25"
DataControl="Class1"
BeanClass="mobile.Test"
id="testResultsIterator"/>

fetchSize属性が-1に設定されている場合、すてのレコードが取得されます。

リスト・ビュー・コンポーネントの次の2つの属性によってスクロール動作が有効になります。

- showMoreStrategy: リスト・ビュー・コンポーネントの、必要に応じて追加の行をロードする戦略を定義します。
リスト・ビュー・コンポーネントが、親コンテナのいずれかによるスクロールの対象になるのではなく、独自のスクロールを提供している場合に(「リスト・ビューで独自のスクロールを適用するには:」を参照)、そのリスト・ビューが末尾までスクロールされると、showMoreStrategyを自動的に起動して次のレコード・セットをフェッチできるようにします。

実行時、この属性はデフォルトで「さらに行をロード」リンクとして表示されます。

showMoreStrategy属性の値を設定してリスト・ビューのスクロールおよび行表示動作を構成する方法の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

- bufferStrategy: 行のユーザー・インタフェースの取得方法を定義します。
リスト・ビューの高さが制限されており、親コンテナのいずれかによるスクロールの対象になるのではなく、独自のスクロールを提供できる場合(「リスト・ビューに独自のスクロールを適用するには:」を参照)、リスト・ビューには、以前は非表示だった行とそのコンテンツがフェッチされて表示されます。リスト・ビューでは、次のいずれかの方法でこのことを実現します。

- 継続的に非表示行をリストに追加し、非表示の行数を増大させます。

- レンダリング・エンジン内で使用可能な追加行の数を制限し、リスト・ビューの表示領域(ビューポート)内の行のみを保持することで、MAFアプリケーションが使用するメモリーの量を削減します。

この機能は、listViewのbufferStrategy属性を使用し、この属性をadditive (メモリー消費量を考慮しない場合)またはviewport (メモリー使用量を削減する場合)のいずれかに設定することで構成できます。後者の場合は、スクロール時に新しい行のコンテンツが表示されるようになるまでに遅れが生じる場合があります。表示される空白行の数を最小限にするには、listViewのbufferSize属性を設定します。この属性は、行が非表示になる、行のビューポートからの距離(ピクセル単位)を決定します。

リスト・ビューに独自のスクロールを適用するには:

- リスト・ビューを、パネル・ページの唯一の非ファセット子にします。

- リスト・ビューに固定の高さを設定します。次に例を示します。

inlineStyle="height: 200px;"

リスト・ビュー・コンポーネントのrangeChangeListener属性(第6.10項「イベント・リスナーの使用方法」を参照)を使用すると、「さらに行をロード」リンクがアクティブ化された場合またはリスト・ビューが末尾までスクロールされた場合のJavaハンドラ・メソッドをバインドできます。このメソッドはoracle.adfmf.amx.event.RangeChangeEventオブジェクトをパラメータとして使用し、図6-44および図6-45に示すように、「プロパティ」ウィンドウから「プロパティの編集: 範囲変更リスナー」ダイアログを起動すると作成されます。

図6-44 「範囲変更リスナー」属性の編集

図6-45 「プロパティの編集」ダイアログ

ダイアログで「OK」をクリックすると、MAF AMXページのlistView要素に次の設定が追加され、例6-45に示すJavaメソッドがサンプルHRBeanクラスに追加されます。

<amx:listView id="listView1" rangeChangeListener="#{pageFlowScope.HRBean.goGet}" >

例6-45 RangeChangeEventをトリガーするJavaメソッド

public void goGet(RangeChangeEvent rangeChangeEvent) {
// Add event code here...
}

注意:

rangeChangeListenerは、リスト・ビューによって新しいデータがフェッチされるたびにコールされます。RangeChangeEventを使用すると、追加のデータを使用可能かどうかを定義できます(第6.10項「イベント・リスナーの使用方法」を参照)。

6.3.15.2 リスト・ビュー・アイテムの再配置

リスト・ビューのアイテムは再配置できます。この機能は、iOSとAndroidのプラットフォームで類似しており、どちらも各リスト・アイテムの右マージンに沿って整列した再配置アイコンが表示されます。再配置操作は、エンド・ユーザーがハンドルとして再配置アフォーダンスを使用してリスト・アイテムにタッチしてドラッグしたときに開始されます。この操作は、エンド・ユーザーが表示画面から指を離したときに完了します。

注意:

エンド・ユーザーがリスト・アイテム上の他の場所をタッチしてドラッグした場合は、リストが上下にスクロールします。

再配置ドラッグ操作によって、リスト・アイテムがドッキング解除され、エンド・ユーザーがリスト内でリスト・アイテムを上下に移動できるようになります。

そのアイテムを再配置可能にするには、リスト・ビューが静的ではなく編集モードになっており、移動を許容可能になっている必要があります。

例6-46は、MAF AMXファイルで定義されているlistView要素を示しています。この定義によって、リスト・モードを編集可能と読取り専用の間で切り替えることができる「編集」および編集停止ボタンが上部に表示されたリストが提示されます。

例6-46 再配置可能なリスト・ビューの定義

<amx:panelPage id="pp1">
<amx:commandButton id="edit"
text="Edit"
rendered="#{!bindings.inEditMode.inputValue}">
<amx:setPropertyListener id="spl1"
from="true"
to="#{bindings.inEditMode.inputValue}"
type="action"/>
</amx:commandButton>
<amx:commandButton id="stop"
text="Stop Editing"
rendered="#{bindings.inEditMode.inputValue}">
<amx:setPropertyListener id="spl2"
from="false"
to="#{bindings.inEditMode.inputValue}"
type="action"/>
</amx:commandButton>
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row"
editMode="#{bindings.inEditMode.inputValue}"
moveListener="#{MyBean.Reorder}">
<amx:listItem id="li1">
<amx:outputText id= "ot1" value="#{row.description}">
</amx:listItem>
</amx:listView>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.3.15.3 リスト・ビュー・レイアウトの構成

リスト・ビュー・コンポーネントは、各行が1つのリスト・アイテム・コンポーネントを含んでいる行のセット(デフォルト)として、または各カードが1つ以上のリスト・アイテム・コンポーネントを含んでいるカードのセットとしてレイアウトできます。

レイアウトを定義するには、リスト・ビューのlayout属性を使用し、これをrowsまたはcardsに設定します。cardsレイアウトを使用する場合は、次の点を考慮してください。

- 各リスト・アイテム・コンポーネントは、水平方向に並べられたカードのグループのカードとして表されます。

- 使用可能なすべてのスペースが消費された場合、次のカードは新しい行に折り返されます。

- リスト・ビュー内でリスト・アイテム・コンポーネント(カード)の水平方向配置を制御するには、リスト・ビューのhalign属性をstart、centerまたはendに設定します。

- リスト・ビューの外観を一般的にカスタマイズするには:

- スキン内でデフォルトで定義されているカード・サイズをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しい幅を指定します。詳細は、第6.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

注意:

値をautoに設定することも、パーセント単位を使用することもできません。

あるいは、スキニングを使用して.amx-listView-cards .amx-listItemセレクタから幅をオーバーライドできます(第6.6.2項「スキニングに関する必知事項」を参照)。

- スキン内でデフォルトで定義されているカードの周りのスペースをオーバーライドするには、リスト・アイテムのinlineStyle属性を使用して新しいmargin-topおよびmargin-leftを指定し(第6.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照)、リスト・ビューのcontentStyle属性を使用して新しいpadding-bottomおよびpadding-rightを指定します。
あるいは、スキニングを使用して、.amx-listView-cards .amx-listItemセレクタからmargin-topおよびmargin-leftをオーバーライドし、.amx-listView-cards .amx-listView-contentセレクタからpadding-bottomおよびpadding-rightをオーバーライドします(第6.6.2項「スキニングに関する必知事項」を参照)。

rowsレイアウトの場合、halign属性を使用してわずかなリスト・アイテム・コンテンツの配置を変更できます。ただし、この属性を使用すると、視覚的な効果を生まないことがあります。

カード・レイアウトを備えたリスト・ビュー・コンポーネントが編集モードにあると、そのレイアウトはrowsモードに切り替わります。

特定のパターンに従ってMAF AMXページ・レイアウトを調整するには、一連の事前定義済スタイルを使用するstyleClass属性(第6.6項「UIコンポーネントのスタイル設定」を参照)を介して定義される様々なタイプのリスト・ビュー・コンポーネントおよびスタイルを組み合せて使用します。

UIDemoという名前のMAFサンプル・アプリケーションは、各コンポーネントおよびその関連レンダリングのすべてのオプション・スタイルを示します。UIDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

例6-47は、MAF AMXファイルで定義されているlistView要素およびその子要素を示しています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-startTextに設定すると、出力テキスト・コンポーネントが行の開始(左)側に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-endTextに設定すると、出力テキスト・コンポーネントが行の終了(右)側に配置され、そのテキストに青いフォントが適用されます。右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この属性のデフォルト値はtrueであるため、この例にはこの設定は含まれていません。

例6-47 開始および終了テキストを持つリスト・ビューの定義

<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>

図6-46は、各行の開始(左)側と終了(右)側に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図6-46 デザインタイムの開始および終了テキストを持つリスト・ビュー

例6-48は、MAF AMXファイルで定義されているlistView要素およびその子要素を示しています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-startTextに設定すると、出力テキスト・コンポーネントが行の開始に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-endTextに設定すると、出力テキスト・コンポーネントが行の終了に配置され、そのテキストに青いフォントが適用されます。それぞれの特定の行に右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この例では、この属性はすべてのlistItem要素に対してfalseに設定されているため、右向き矢印は表示されません。

例6-48 拡張リンクがない開始および終了テキストを持つリスト・ビューの定義

<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>

図6-47は、各行の開始と終了に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、リンクを表す右向き矢印は含まれていません。

図6-47 デザインタイムの拡張リンクのない開始および終了テキストを持つリスト・ビュー

例6-49は、MAF AMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、終了テキストの下に配置されるサブテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左側に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右側に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-upperStartTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。

例6-49 開始および終了テキストとサブテキストを持つリスト・ビューの定義

<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>

図6-48は、各行の開始と終了に異なるスタイルのテキストが追加され、左側の終了テキストの下にサブテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図6-48 デザインタイムの開始および終了テキストとサブテキストを持つリスト・ビュー

例6-50は、MAF AMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、メイン・テキストおよびサブテキストを含む行が移入されます。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-mainTextに設定すると、出力テキスト・コンポーネントが行の開始に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-mainTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。

例6-50 メイン・テキストとサブテキストを持つリスト・ビューの定義

<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>

図6-49は、各行にメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図6-49 デザインタイムのメイン・テキストとサブテキストを持つリスト・ビュー

例6-51は、MAF AMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、アイコン、メイン・テキストおよびサブテキストを含むセルが移入されます。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-mainTextに設定すると、出力テキスト・コンポーネントが行の左側に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-mainTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。image要素の位置は、それが囲むcellFormatによって定義されます。

例6-51 アイコン、メイン・テキストおよびサブテキストを持つリスト・ビューの定義

<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>

図6-50は、各行に、アイコンおよびメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図6-50 デザインタイムのアイコン、メイン・テキストおよびサブテキストを持つリスト・ビュー

例6-52は、MAF AMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、各行の両側に配置されている2つの異なるタイプのテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左上隅に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右上隅に配置され、そのテキストに大きいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerStartTextに設定すると、出力テキスト・コンポーネントが行の左下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerEndTextに設定すると、出力テキスト・コンポーネントが行の右下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この属性のデフォルト値はtrueであるため、この例にはこの設定は含まれていません。

例6-52 4つのタイプのテキストを持つリスト・ビューの定義

<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>

図6-51は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストの他に各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図6-51 デザインタイムの4つのタイプのテキストを持つリスト・ビュー

例6-53は、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に設定されているため、右向き矢印は表示されません。

例6-53 拡張リンクのない4つのタイプのテキストを持つリスト・ビューの定義

<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>

図6-52は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図6-52 デザインタイムの拡張リンクのない4つのタイプのテキストを持つリスト・ビュー

6.3.15.4 静的リスト・ビューの使用に関する必知事項

モデルからではなくハードコード化された値によって移入されるリスト・ビュー・コンポーネントを作成する場合、このリスト・ビューは静的になり、デザインタイムに設定するそのプロパティのいくつか(たとえばdividerAttribute、dividerMode、fetchSize、moveListener)が実行時に無視されるようになります。

MAF AMXでは、リスト・ビュー・コンポーネントのvalue属性が設定されていない場合、そのコンポーネントを静的であると見なします。そのようなリストは編集できません(つまり、リストのeditMode属性を指定できません)。

6.3.16 カルーセル・コンポーネントの使用方法

カルーセル(carousel)コンポーネントは、回転カルーセルにイメージなどの他のコンポーネントを表示するために使用します。エンド・ユーザーは、スライダを使用するか、別のイメージを正面にドラッグすることでアクティブなアイテムを変更できます。

カルーセル・コンポーネントにはカルーセル・アイテム(carouselItem)コンポーネントが含まれ、text属性によって表されるそのテキストは、それがそのカルーセルのアクティブなアイテムであるときに表示されます。通常、カルーセル・アイテムにはイメージ・コンポーネントが含まれていますが、他のコンポーネントを使用することもできます。たとえば、イメージを囲む子としてリンクを使用することもできます。表示する各オブジェクトにカルーセル・アイテム・コンポーネントを作成し、これらのコンポーネントを各オブジェクトにバインドするかわりに、カルーセル・コンポーネントを完全なコレクションにバインドします。その後、コンポーネントは各アイテムに値をスタンプ設定し、1つのカルーセル・アイテム・コンポーネントを繰り返しレンダリングします。各アイテムにスタンプが設定されると、現在のアイテムのデータが、カルーセル・コンポーネントのvar属性を使用するEL式を使用して特定可能なプロパティにコピーされます。カルーセルのレンダリングが完了したら、このプロパティは削除されるか前の値に戻ります。カルーセル・コンポーネントには、テキストの表示に使用されるカルーセル・アイテムのホルダと各アイテムの短い説明の両方であり、各アイテムについて表示されるイメージの親コンポーネントでもあるnodeStampという名前のファセットが含まれます。

カルーセル・アイテムは、その単一の子コンポーネントを拡大します。カルーセル・アイテム内に1つのイメージ・コンポーネントを配置する場合、アイテムに割り当てられた正方形に収まるように、イメージが拡大されます(エンド・ユーザーがカルーセルを動かすと、寸法が拡大または縮小されます)。

ヒント:

アプリケーションのパフォーマンスの低下を最小限に抑えるは、重いコンポーネントを子として使用しないようにします。複雑な構造にすると、いくつかのカルーセル・アイテム・スタンプが同時に表示されるため、その影響が倍増します。

デフォルトでは、カルーセルは水平に表示されます。カルーセルの水平方向のオブジェクトは垂直方向中央揃え、カルーセル自体はそのコンテナに対して水平方向中央揃えとなります。参照ローロデックス(回転式カード・ファイル)が必要な場合は、垂直に表示されるようにカルーセルを構成できます。デフォルトでは、垂直方向のカルーセルの中のオブジェクトは水平方向中央揃え、カルーセル自体は垂直方向中央揃えとなります。カルーセルのorientation属性を使用して配置を変更できます。

前および次のイメージを部分的に表示するかわりに、displayItems属性を使用して、フィルム・ストリップ・デザインまたは循環デザインでイメージを表示するようにカルーセルを構成できます。

デフォルトでは、カルーセルが循環モードで表示されるように構成されている場合、エンド・ユーザーが補助アイテム(現在、中央に表示されていないアイテム)にポインタを置くと、そのアイテムが枠で囲まれ、選択可能であることが示されます。auxiliaryPopOut属性を使用すると、アイテムが移動し、最大サイズで表示されるように、カルーセルを構成できます。

JDeveloperでは、「カルーセル」は「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図6-53を参照)。

図6-53 「コンポーネント」ウィンドウの「カルーセル」

カルーセル・コンポーネントを作成するには、まず表示するイメージを含むデータ・モデルを作成してから、そのモデルにカルーセルをバインドし、カルーセル・アイテム・コンポーネントをカルーセルのnodeStampファセットに挿入する必要があります。最後に、イメージ・コンポーネント(または、イメージ・コンポーネントが含まれる他のコンポーネント)を子としてカルーセル・アイテム・コンポーネントに挿入します。

例6-54は、MAF AMXファイル内のcarousel要素定義を示しています。carousel要素を定義するときは、carousel要素のnodeStampファセット内にcarouselItem要素を配置する必要があります。

例6-54 カルーセルの定義

<amx:carousel id="carousel1"
value="#{bindings.products.collectionModel}"
var="item"
auxiliaryOffset="0.9"
auxiliaryPopOut="hover"
auxiliaryScale="0.8"
controlArea="full"
displayItems="circular"
halign="center"
valign="middle"
disabled="false"
shortDesc="spin"
orientation="horizontal"
styleClass="AMXStretchWidth"
inlineStyle="height:250px;background-color:#EFEFEF;">
<amx:facet name="nodeStamp">
<amx:carouselItem id="item1" text="#{item.name}"
shortDesc="Product: #{item.name}">
<amx:commandLink id="link1" action="goto-productDetails"
actionListener="#{someMethod()}">
<amx:image id="image1" styleClass="prod-thumb"
source="images/img-big-#{item.uid}.png"/>
<amx:setPropertyListener id="spl1"
from="#{item}"
to="#{pageFlowScope.product}"
type="action"/>
</amx:commandLink>
</amx:carouselItem>
</amx:facet>
</amx:carousel>

カルーセル・コンポーネントでは、CollectionModelクラスを使用して基礎となるコレクションのデータにアクセスします。java.util.Listやarrayなどの他のモデル・クラスを使用することもでき、この場合はカルーセルによりインスタンスがCollectionModelクラスに自動的に変換されますが、機能は追加されません。

エンド・ユーザーはスライダを使用してカルーセル・コレクションを移動できます。通常、スライダのサムは総オブジェクト数の中の現在のオブジェクト番号を表示します。総オブジェクト数が大きすぎて計算できない場合、スライダのサムは現在のオブジェクト番号のみを表示します。

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.17 フィルム・ストリップ・コンポーネントの使用方法

フィルム・ストリップ(filmStrip)は、一連のグループ(ページ)間に分散されたデータを、垂直または水平ストリップ形式で視覚化するコンテナ・コンポーネントです。グループに含まれる表示アイテム(filmStripItem)を表すUIコンポーネントは同じサイズとタイプである必要があり、一度に1つのグループのみが表示されます。エンド・ユーザーは、フィルム・ストリップのページを移動し、アイテムを選択してタップすることでアクションを生成できます。

JDeveloperでは、フィルム・ストリップは「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図6-54を参照)。

図6-54 「コンポーネント」ウィンドウのフィルム・ストリップ

例6-55は、MAF AMXファイル内のfilmStrip要素定義を示しています。

例6-55 フィルム・ストリップの定義

<amx:filmStrip id="fs1"
var="item"
value="#{bindings.contacts.collectionModel}"
rendered="#{pageFlowScope.pRendered}"
styleClass="#{pageFlowScope.pStyleClass}"
inlineStyle="#{pageFlowScope.pInlineStyle}"
shortDesc="#{pageFlowScope.pShortDesc}"
halign="#{pageFlowScope.pFsHalign}"
valign="#{pageFlowScope.pFsValign}"
itemsPerPage="#{pageFlowScope.pMaxItems}"
orientation="#{pageFlowScope.pOrientation}">
<amx:filmStripItem id="fsi1"
inlineStyle="text-align:center; width:200px;">
<amx:commandLink id="ciLink"
action="details"
shortDesc="Navigate to details">
<amx:image id="ciImage" source="images/people/#{item.first}.png"/>
<amx:setPropertyListener id="spl1"
from="#{item.rowKey}"
to="#{pageFlowScope.currentContact}"
type="action"/>
<amx:setPropertyListener id="spl2"
from="#{item.first}"
to="#{pageFlowScope.currentContactFirst}"
type="action"/>
<amx:setPropertyListener id="spl3"
from="#{item.last}"
to="#{pageFlowScope.currentContactLast}"
type="action"/>
</amx:commandLink>
</amx:filmStripItem>
</amx:filmStrip>

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.17.1 フィルム・ストリップ・レイアウトに関する必知事項

垂直方向にレイアウトされたフィルム・ストリップでは、表示アイテムは上から下に向けて配置されます。テキストの方向に応じて、ページ・コントロールは次のように配置されます。

- 左から右のテキスト方向の場合は、ページ・コントロールは右側に配置されます。

- 右から左のテキスト方向の場合は、ページ・コントロールは左側に配置されます。

水平方向にレイアウトされたフィルム・ストリップでは、テキスト方向モードが反映されます。左から右モードでは最初のアイテムは左側に配置され、右から左モードでは最初のアイテムは右側に配置されます。いずれの場合も、ページ・ステータス・コンポーネントが下部に配置されます。

6.3.17.2 フィルム・ストリップ・ナビゲーションに関する必知事項

フィルム・ストリップ・コンポーネントのナビゲーションは、デッキ(第6.2.12項「デッキ・コンポーネントの使用方法」を参照)およびパネル・スプリッタ・コンポーネント(第6.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照)と似ています。一度に1つのページが表示され、ページIDまたは番号を選択するとページの変更がトリガーされます。

子フィルム・ストリップ・アイテム・コンポーネントは、他のMAF AMXページへの移動で使用されることを想定していないため、action属性をサポートしていません。必要な場合は、ネストされたコマンド・リンク・コンポーネントを介したナビゲーションを有効にできます。

6.3.18 Verbatimコンポーネントの使用方法

該当するコンポーネントが存在しない場合や自身でHTMLを使用してレイアウトする必要がある場合は、Verbatim (verbatim)操作を使用して独自のHTMLをページに挿入できます。

JDeveloperでは、「Verbatim」は、「コンポーネント」ウィンドウの「一般コントロール」の下にあります(図6-57を参照)。

図6-55 「コンポーネント」ウィンドウの「Verbatim」

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.18.1 JavaScriptおよびAJAXをVerbatimコンポーネントとともに使用する方法に関する必知事項

JavaScriptを(amx:verbatim要素内の) verbatimコンテンツに直接挿入することは、現在サポートされているプラットフォームの将来のバージョンまたは将来MAFでサポートされる可能性のある他のプラットフォームで適切に実行されない可能性があるため、お薦めしません。かわりに、maf-feature.xmlファイル内の既存のadfmf:include要素を使用してJavaScriptおよびCSSを含めることで、MAF AMXアプリケーション機能の起動時にページにスクリプトが挿入されるようにすることをお薦めします。

また、JavaScriptをVerbatimコンポーネントとともに使用することは、AMXページからのサーバーに対するAJAXコールはサポートされていないという事実の影響を受けます。これは、MAF AMXページをホストするブラウザが、セキュア・サーバーに接続してそのリソースを取得するために必要なセキュリティ情報にアクセスできないようにするためのセキュリティ・アーキテクチャが原因です。かわりに、サーバーとの通信は、埋込みJavaコード・レイヤーから発生する必要があります。

6.3.19 出力HTMLコンポーネントの使用方法

出力HTML (outputHtml)コンポーネントを使用すると、MAF AMXページで表示するために、HTMLコンテンツをELバインド・プロパティまたはメソッドから動的かつ安全に取得できます。出力HTMLコンポーネントはVerbatimコンポーネント(第6.3.18「Verbatimコンポーネントの使用方法」を参照)と同様に動作し、JavaScriptおよびAJAXの使用に関して同じ制限が適用されます(第6.3.18.1項「JavaScriptおよびAJAXをVerbatimコンポーネントとともに使用する方法に関する必知事項」を参照)。

JDeveloperでは、出力HTMLは、「コンポーネント」ウィンドウの「一般コントロール」の下にあります(図6-56を参照)。

図6-56 「コンポーネント」ウィンドウの出力HTML

例6-56は、MAF AMXファイル内のoutputHtml要素定義を示しています。value属性は、MAF AMXページの最終レンダリングでoutputHTMLとして表示するHTMLコンテンツを取得するために使用される文字列プロパティにELバインディングを提供します。

例6-56 出力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>

例6-57は、例6-56に示す出力HTMLコンポーネントのHTMLを提供するMyPurchaseBeanという名前のJava Beanのコードを示しています。

例6-57 HTMLの取得

// 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セキュリティ機能を使用することを検討してください。詳細は、第21章「モバイル・アプリケーションの保護」を参照してください。また、提供されるHTMLが信頼できるソースからのものであり、かつ脅威が含まれていないことを確認してください。

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.20 反復の有効化方法

イテレータ(iterator)操作を使用して、同じ種類のデータを持つ任意の数のアイテムをスタンプします。これによりデータを繰り返し処理して各要素のUIを作成できます。

JDeveloperでは、「イテレータ」は「コンポーネント」ウィンドウの「データ・ビュー」の下にあります(図6-57を参照)。

図6-57 「コンポーネント」ウィンドウの「イテレータ」

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.3.21 リソース・バンドルのロード方法

バンドルのロード(loadBundle)操作により、ページ上のMAF AMX UIコンポーネントのローカライズ済テキストを提供するリソース・バンドルを指定できます。詳細は、第6.7項「UIコンポーネントのローカライズ」を参照してください。

JDeveloperでは、「バンドルのロード」は「コンポーネント」ウィンドウの「操作」の下にあります(図6-58を参照)。

図6-58 「コンポーネント」ウィンドウの「バンドルのロード」

MAF AMXファイル内で、loadBundle要素をview要素の子として宣言します。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.3.22 アクション・リスナーの使用方法

アクション・リスナー(actionListener)コンポーネントにより、親コンポーネントが使用するタイプに基づいてELを介して宣言でコマンドを呼び出すことができます。

アクション・リスナー・コンポーネントを使用する主な理由は、親コンポーネントにジェスチャー対応アクションを追加すること、およびタップなどの単一ジェスチャーに対して複数の操作を実行できるためです。詳細は、第6.3.22.1項「アクション・リスナー・コンポーネントと属性間の違いに関する必知事項」を参照してください。

JDeveloperでは、アクション・リスナー・コンポーネントは「コンポーネント」ウィンドウの「操作」→「リスナー」の下にあります(図6-59を参照)。

図6-59 「コンポーネント」ウィンドウの「アクション・リスナー」

0個以上のアクション・リスナー・コンポーネントを、任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム、フィルム・ストリップ・アイテム)の子として追加できます。アクション・リスナー・コンポーネントのtype属性は、swipeLeft、swipeRight、tapHoldなどのジェスチャーのいずれによってActionEventが起動するかを定義します。

詳細は、次を参照してください。

- 第6.10項「イベント・リスナーの使用方法」

- 第6.3.23項「プロパティ・リスナーの設定の使用方法」

- 第6.4項「ジェスチャーの有効化」

- 第6.3.22.1項「アクション・リスナー・コンポーネントと属性間の違いに関する必知事項」

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

6.3.22.1 アクション・リスナー・コンポーネントと属性間の違いに関する必知事項

ボタン、リンクおよびリスト・アイテムなどのコンポーネントはactionListener属性を持つため、アクション・リスナー・コンポーネントの重複の原因となると考えられます。ただし、アクション・リスナー・コンポーネントとは異なり、これらのコンポーネントはジェスチャーをサポートするtype属性を持たないため、MAFで親コンポーネントのactionListener属性に加えてアクション・リスナー・コンポーネントが提供されます。

6.3.23 プロパティ・リスナーの設定の使用方法

プロパティ・リスナーの設定(setPropertyListener)コンポーネントにより、コンポーネントに対するエンド・ユーザー・アクションの結果として、1つの場所(コンポーネントのfrom属性で定義)から別の場所(コンポーネントのto属性で定義)に宣言で値をコピーできるため、これと同じ結果を得るためにJavaコードを作成する必要がなくなります。

JDeveloperでは、プロパティ・リスナーの設定コンポーネントは「コンポーネント」ウィンドウの「操作」→「リスナー」の下にあります(図6-60を参照)。

図6-60 「コンポーネント」ウィンドウの「プロパティ・リスナーの設定」

例6-58は、MAF AMXファイル内のsetPropertyListener要素定義を示しています。

例6-58 プロパティ・リスナーの設定の定義

<amx:listView value="#{bindings.products.collectionModel}" var="row" id="lv1">
<amx:listItem id="li1" action="details">
<amx:outputText value="#{row.name}" id="ot1" />
<amx:setPropertyListener id="spl1"
from="#{row}"
to="#{pageFlowScope.product}"
type="action"/>
</amx:listItem>
</amx:listView>

0個以上のプロパティ・リスナーの設定コンポーネントを、任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム、フィルム・ストリップ・アイテムおよびデータ視覚化コンポーネントのサブセットとその子コンポーネント)の子として追加できます。プロパティ・リスナーの設定コンポーネントのtype属性は、swipeLeft、swipeRight、tapHoldなどのジェスチャーのいずれによってActionEventが起動するかを定義します。

詳細は、次を参照してください。

- 第6.10項「イベント・リスナーの使用方法」

- 第6.3.22項「アクション・リスナーの使用方法」

- 第6.4項「ジェスチャーの有効化」

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

6.3.24 日時の変換方法

日時の変換(convertDateTime)は、独立したUIコンポーネントではありません。これは、出力テキストおよび入力テキスト・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された日付、時刻または日時の組合せを表示するコンバータ操作です。

JDeveloperでは、「日時の変換」は「コンポーネント」ウィンドウの「バリデータおよびコンバータ」の下にあります(図6-61を参照)。

図6-61 「コンポーネント」ウィンドウの「日時の変換」

例6-59は、MAF AMXファイルで宣言されているconvertDateTime要素を示しています。

例6-59 日時の変換の使用方法

<amx:panelPage id="pp1">
<amx:inputText styleClass="ui-text" value="Order Date" id="it1" >
<amx:convertDateTime id="cdt1" type="both"/>
</amx:inputText>
</amx:panelPage>

日時値を変換するには:

1. 「コンポーネント」ウィンドウから、「日時の変換」コンポーネントをドラッグし、それを出力テキストまたは入力テキスト・コンポーネント内に挿入し、それをそのコンポーネントの子要素にします。

2. 日時の変換コンポーネントの「プロパティ」ウィンドウを開き、その属性を定義します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

注意:

日時の変換コンポーネントは、デザインタイムには何の効果も持ちません。

日時の変換コンポーネントでは、入力値文字列を日付に変換する際に一定レベルの寛容性があります。

- 月に対して関連付けられたパターンMMMを持つコンバータは、値のホルダーに添付されると、MMまたはMの形で指定された月の値を有効な値として受け入れます。

- 関連付けられたパターンで指定されているセパレータに関係なく、ダッシュ( - )、ピリオド( . )、スラッシュ( / )などのセパレータを使用できます。

- パターン定義における寛容性は、pattern属性で設定します。

たとえば、コンバータのパターンが"MMM/d/yyyy"に設定されている場合、次の入力はコンバータにより有効なものとして許容されます。

Jan/4/2004
Jan-4-2004
Jan.4.2004
01/4/2004
01-4-2004
01.4.2004
1/4/2004
1-4-2004
1.4.2004

コンバータでは、java.text.SimpleDateFormat (dateStyle、timeStyleおよびpattern属性を使用して指定される)と同じ解析および書式設定規則がサポートされています。ただし、タイムゾーンが、timeStyle=fullなどの長い表示またはzzzzで設定されるパターンを持つように指定されている場合は例外です。タイムゾーンは太平洋標準時のような長い説明の文字列ではなく、一般的なタイムゾーン形式(GMT +/-オフセット)またはRFC-822タイムゾーンで表示されます。

変換の正確な結果は、ロケールによって異なりますが、一般的に次のルールが適用されます。

- SHORTは、12.13.52や3:30pmなど完全に数値です。

- MEDIUMはそれより長いJan 12、1952などです。

- LONGは、それよりも長いJanuary 12、1952、3:30:32pmなどです。

- FULLは、完全に指定されたTuesday, April 12, 1952 ADや3:30:42pm PSTなどです。

6.3.24.1 日時パターンに関する必知事項

java.text.SimpleDateFormat定義に従って、日時書式を、日時パターン文字列で指定します。日時パターン文字列では、引用符で囲まれていないAからZおよびaからzの文字は、日付または時間の文字列のコンポーネントを表すパターン文字と認識されます。テキストは、解釈されないように一重引用符(')で囲むことができます。" ' ' "は一重引用符を表します。すべてのその他の文字は解釈されません。かわりに、それらは書式設定中に単に出力文字列にコピーされるか、解析中に入力文字列と照合されます。

表6-9は、定義済パターン文字を示しています(AからZおよびaからzのすべてのその他の文字は予約されています)。

表6-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

パターン文字は通常繰り返されます。これは、それらの数が正確な表示を決定するためです。

6.3.25 数値の変換方法

数値の変換(convertNumber)は、独立したUIコンポーネントではありません。これは、出力テキスト、入力テキストおよび入力数値スライダ・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された数値または通貨値を表示するコンバータ操作です。

数値の変換コンポーネントは、次のタイプの操作を提供します。

- 値から文字列。表示目的です。

- 書式設定された文字列から値。書式設定された入力値が、基礎となっている値に解析される場合です。

数値の変換が、入力テキスト・コンポーネントの子として指定されている場合、デフォルトで、モバイル・デバイスに数字キーボードが表示されます。

JDeveloperでは、「数値の変換」は「コンポーネント」ウィンドウの「バリデータおよびコンバータ」の下にあります(図6-62を参照)。

図6-62 「コンポーネント」ウィンドウの「数値の変換」

例6-60は、MAF AMXファイルで定義されているconvertNumber要素を示しています。

例6-60 数値の変換の使用方法

<amx:panelPage id="pp1">
<amx:inputText styleClass="ui-text" value="Product Price" id="it1" >
<amx:convertNumber id="cn1"
type="percent"
groupingUsed="false"
integerOnly="true"/>
</amx:inputText>
</amx:panelPage>

数値を変換するには:

1. 「コンポーネント」ウィンドウから、「数値の変換」コンポーネントをドラッグし、それを出力テキスト、入力テキストまたは入力数値スライダ・コンポーネント内に挿入し、それをそのコンポーネントの子要素にします。

2. 数値の変換コンポーネントの「プロパティ」ウィンドウを開き、その属性を定義します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

注意:

数値の変換コンポーネントは、デザインタイムには何の効果も持ちません。

6.3.26 ドラッグ・ナビゲーションを有効にする方法

ナビゲーション・ドラッグ動作(navigationDragBehavior)操作を使用すると、モバイル・デバイス画面の一部を指定した方向(左または右)にドラッグすることによって、次または前のMAF AMXページに移動するアクションを起動できます。指定された方向へのドラッグが発生すると、画面の適切な側にインジケータが表示され、インジケータがすべて表示されるとすぐに、ドラッグが続いた後停止すると、アクションが実行されることが示されます。インジケータがすべて表示される前にドラッグが放された場合、インジケータはスライドされ、アクションは起動されません。

注意:

別のより近いコンテナによってドラッグ・ジェスチャーが消費されている場合、この動作は発生しません。

MAF AMXページには、1つはdirection属性がbackに設定され、1つはforwardに設定された、navigationDragBehavior要素のインスタンスを3つ以上含めることはできません。

JDeveloperでは、ナビゲーション・ドラッグ動作は「コンポーネント」ウィンドウの「操作」の下にあります(図6-63を参照)。

図6-63 「コンポーネント」ウィンドウのナビゲーション・ドラッグ動作

例6-61は、MAF AMXファイルで定義されているnavigationDragBehavior要素を示しています。この要素は、view要素の子にのみできることに注意してください。

例6-61 ナビゲーション・ドラッグ動作の使用方法

<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>

図6-64は、実行時のナビゲーション・ドラッグ動作を示しています(mobileFusionFxスキンを使用して表示されています)。

図6-64 実行時のナビゲーション・ドラッグ動作操作

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.3.26.1 disabled属性に関する必知事項

disabled属性の値(例6-62および例6-63を参照)は、次のいずれかのことが発生したときに計算されます。

- MAF AMXページのレンダリング。

- PropertyChangeListenerによるコンポーネントの更新。エンド・ユーザーがナビゲーション・ドラッグ動作を起動できる機能を動的に有効または無効にするには、PropertyChangeListenerを使用します(Beanからの更新が必要なその他のコンポーネントで使用する場合と同様の方法)。

例6-62は、disabled属性が定義されているnavigationDragBehavior要素を含むMAF AMXページを示しています。アクティブ化された場合に、disabled属性がその値を読み取るバッキングBeanのboolean値(例6-63のnavDisabled)を変更するボタン(commandButton)によって機能が駆動されます。次に、バッキングBeanは、PropertyChangeListenerを使用します。

例6-62 MAF AMXページのdisabled属性を持つナビゲーション・ドラッグ動作

<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>

例6-63は、navigationDragBehaviorのdisabled属性の値を提供するバッキングBean (例6-62のmyBean)を示しています。

例6-63 ナビゲーション・ドラッグ動作の無効機能のバッキングBean

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);
}
}

6.3.27 ロード・インジケータの使用方法

ロード・インジケータ動作(loadingIndicatorBehavior)操作を使用すると、次のものをオーバーライドすることでロード・インジケータの動作を定義できます。

- フェイルセーフ・タイマーの期間(ミリ秒単位)。

- フェイルセーフしきい値に達したときの一連のアクションを決定するために起動できるオプションのJavaScript関数名。

詳細は、表12-1「静的API」のadf.mf.api.amx.showLoadingIndicatorを参照してください。

JDeveloperでは、ロード・インジケータ動作は「コンポーネント」ウィンドウの「操作」の下にあります(図6-65を参照)。

図6-65 「コンポーネント」ウィンドウのロード・インジケータ動作

例6-64は、MAF AMXファイルで定義されているloadingIndicatorBehavior要素を示しています。この要素は、view要素の子にのみできることに注意してください。

例6-64 ロード・インジケータ動作の使用方法

<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が長時間実行されるメソッドにバインドされて、(ページ自体のロードに長時間かかる場合ではなく)ページがロードされた場合に、長時間実行される操作にロード・インジケータが適用されることを示しています。

例6-65は、アプリケーション機能に含まれるcustom.jsファイルを示しています。これは、loadingIndicatorBehaviorページのfailSafeClientHandlerのクライアント・ハンドラを定義します。API要件に従って、この関数はhide、repeatまたはfreezeいずれかのStringを返します。詳細は、表12-1「静的API」のadf.mf.api.amx.showLoadingIndicatorを参照してください。

例6-65 サンプルcustom.jsファイル

window.customFailSafeHandler = function() {
var answer =
prompt(
"This is taking a long time.\n\n" +
"Use \"a\" to hide the indicator.\n" +
"Use \"z\" to wait for it.\n" +
"Otherwise, give it more time.");

if (answer == "a")
return "hide"; // don't ask again; hide the indicator
else if (answer == "z")
return "freeze" // don't ask again; wait for it to finish
else
return "repeat"; // ask again after another duration
};

詳細および例は、次を参照してください。

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあるMAFサンプル・アプリケーションのCompGallery

6.4 ジェスチャーの有効化

次のジェスチャーに反応するように、ボタン、リンク、リスト・アイテムおよびいくつかのデータ視覚化コンポーネントを構成できます。

- 右方向にスワイプ

- 左方向にスワイプ

- 上方向にスワイプ

- 下方向にスワイプ

- タップしたまま押さえる

- アクション: ジェスチャーとしては、アクションは基本的なタップを表します。

- 始点方向にスワイプ: このジェスチャーは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、左方向にスワイプします。

- テキスト方向が右から左である場合、右方向にスワイプします。

- 終点方向にスワイプ: このジェスチャーは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。このジェスチャーは、次のように解決されます。

- テキスト方向が左から右である場合、右方向にスワイプします。

- テキスト方向が右から左である場合、左方向にスワイプします。

次の操作のtype属性に対して、swipeRight、swipeLeft、swipeUp、swipeDown、swipeStart、swipeEnd、actionおよびtapHold値を定義できます。

- プロパティ・リスナーの設定(第6.3.23項「プロパティ・リスナーの設定の使用方法」を参照)

- アクション・リスナー(第6.3.22項「アクション・リスナーの使用方法」を参照)

- ポップアップ表示動作(第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- ポップアップを閉じる動作(第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

type属性の値は親コンポーネントに基づいて制限され、リンク(commandLink)およびリスト・アイテム(listItem)コンポーネントに対してのみサポートされています。

注意:

リンク(実行) (linkGo)コンポーネントに対するジェスチャー・サポートはありません。

始点方向にスワイプと終点方向にスワイプは、iOSプラットフォームで右から左のテキスト方向に対応するために使用されます。通常は、左と右ではなく、始点と終点のスワイプ・スタイルを設定することをお薦めします。

例6-66は、MAF AMXファイルのtype属性のtapHold値の使用を示しています。この例では、タップしたまま押さえるジェスチャーによってポップアップ・コンポーネントの表示がトリガーされます。

例6-66 タップしたまま押さえるジェスチャーの使用方法

<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>

例6-67は、MAF AMXファイル内のswipeRightジェスチャーの使用方法を示しています。

例6-67 右方向にスワイプ・ジェスチャーの使用方法

<amx:panelPage id="pp1">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row">
<amx:listItem id="li1" action="gosomewhere">
<amx:outputText id="ot1" value="#{row.description}"/>
<amx:setPropertyListener id="spl1"
from="#{row.rowKey}"
to="#{mybean.currentRow}"
type="swipeRight"/>
<actionListener id="al1" binding="#{mybean.DoX}" type="swipeRight"/>
</amx:listItem>
</amx:listView>>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

GestureDemoという名前のMAFサンプル・アプリケーションは、様々なMAF AMX UIコンポーネントでのジェスチャーの使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

6.5 データ視覚化の指定

MAFでは、MAF AMXアプリケーション機能でデータを表すための様々なチャート、ゲージおよびマップを作成するために使用できる一連のデータ視覚化コンポーネントを採用しています。MAF AMXファイルの<dvtm>ネームスペースの下で次の要素を宣言できます。

- areaChart (第6.5.1項「面グラフの作成方法」を参照)

- barChart (第6.5.2項「棒グラフの作成方法」を参照)

- bubbleChart (第6.5.3項「バブル・チャートの作成方法」を参照)

- comboChart (第6.5.4項「コンボ・チャートの作成方法」を参照)

- lineChart (第6.5.5項「線グラフの作成方法」を参照)

- pieChart (第6.5.6項「円グラフの作成方法」を参照)

- scatterChart (第6.5.7項「散布図の作成方法」を参照)

- sparkChart (第6.5.8項「スパーク・チャートの作成方法」を参照)

- funnelChart (第6.5.9項「ファンネル・チャートの作成方法」を参照)

- ledGauge (第6.5.12項「LEDゲージの作成方法」を参照)

- statusMeterGauge (第6.5.13項「ステータス・メーター・ゲージの作成方法」を参照)

- dialGauge (第6.5.14項「ダイアル・ゲージの作成方法」を参照)

- ratingGauge (第6.5.15項「評価ゲージの作成方法」を参照)

- geographicMap (第6.5.17項「地理マップ・コンポーネントの作成方法」を参照)

- thematicMap (第6.5.18項「テーマ・マップ・コンポーネントの作成方法」を参照)

- treemap (第6.5.20項「ツリーマップ・コンポーネントの作成方法」を参照)

- sunburst (第6.5.21項「サンバースト・コンポーネントの作成方法」を参照)

- timeline (第6.5.22項「時系列コンポーネントの作成方法」を参照)

- nBox (第6.5.23項「NBoxコンポーネントの作成方法」を参照)

チャート、ゲージ、マップおよび拡張コンポーネントの要素には、それらのすべてまたはほとんどに共通する複数の属性があります。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

JDeveloperでは、データ視覚化コンポーネントは「コンポーネント」ウィンドウの次の場所にあります。

- チャート・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「チャート」の下にあります。

- ゲージ・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「ゲージ」の下にあります。

- マップ・コンポーネントは、「MAF AMXデータ視覚化」→「共通」→「マップ」の下にあります。

- ツリーマップ、サンバースト、時系列およびNBoxは、「MAF AMXデータ視覚化」→「共通」→「その他」の下にあります。

図6-66 「コンポーネント」ウィンドウのデータ視覚化コンポーネント

データ視覚化コンポーネントをドラッグ・アンド・ドロップすると、次のいずれかに似たダイアログが開き、作成しているコンポーネントのタイプに関する情報が表示されます。

- モバイル・チャートの作成 (図6-67を参照)

図6-67 チャートの作成コンポーネント

- モバイル・ゲージの作成 (図6-68を参照)

図6-68 ゲージの作成コンポーネント

- コンポーネント・ギャラリ (図6-69を参照)

図6-69 マップの作成コンポーネント

- 「サンバーストの作成」または「ツリーマップ」(図6-68を参照)

図6-70 「サンバーストの作成」

注意:

コンポーネントの作成後、ソース・エディタまたは「構造」ビューでそのコンポーネントを選択し、「プロパティ」ウィンドウで「コンポーネント定義の編集」をクリックすることによって、作成ダイアログを再起動できます。

「プロパティ」ウィンドウで提供される同一の編集機能を使用すると、いくつかのデータ視覚化コンポーネントの子コンポーネント(データ・ポイント・レイヤーなど)を編集できます。

CompGalleryという名前のMAFサンプル・アプリケーションは、MAF AMXアプリケーション機能での様々なデータ視覚化コンポーネントの使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

MAF AMXデータ視覚化コンポーネントの詳細は、次を参照してください。

- イベント・リスナーをデータ視覚化コンポーネントに追加する方法の詳細は、第6.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもMAF AMXランタイムの記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

- 「データ・コントロール」ウィンドウから作成されるデータバインドされたデータ視覚化コンポーネントの詳細は、第6.5.25項「データバインドされたデータ視覚化コンポーネントの作成方法」を参照してください。

- チャートやその他のデータ視覚化コンポーネント用の静的データの提供方法の詳細は、第6.5.26項「静的データに基づいたデータ視覚化コンポーネントの作成方法」」を参照してください。

- チャート・コンポーネントのインタラクティブ性の詳細は、第6.5.27項「チャート・コンポーネントのインタラクティブ性の有効化方法」を参照してください。

- 極チャートの作成の詳細は、第6.5.28項「極チャートの作成方法」を参照してください。

- データ視覚化コンポーネントにおけるアクセシビリティのサポートの詳細は、第6.8項「MAFのアクセシビリティのサポートの理解」を参照してください。

- MAF AMXデータ視覚化コンポーネントの使用上の制約の詳細は、第D.6.2項「データ視覚化コンポーネントの制限」を参照してください。

6.5.1 面グラフの作成方法

面グラフ(areaChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けれされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、面の色やパターンなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。カスタム系列スタイルの定義の詳細は、第6.5.5項「線グラフの作成方法」を参照してください。

面グラフは、そのX軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

例6-68は、MAF AMXファイルで定義されているareaChart要素を示しています。デフォルト系列スタイルで基本的な面グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

例6-68 デフォルト系列スタイルを持つ面グラフの定義

<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>

図6-71 デザインタイムの面グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: このデータ・アイテムが属する系列の名前。

- group: このデータ・アイテムが属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやmarkerShapeなどの他のプロパティも含めることもできます。

例6-69に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、chartDataItemのcolor属性およびmarkerShape属性は、追加のグループ化式に基づいて設定されます。

attributeGroupsは、次の子要素を持つことができます。

- dvtmネームスペースのattributeExceptionRule: 特定のブール条件が満たされる場合に、属性値を別の値に置き換えます。

- dvtmネームスペースのattributeMatchRule: データが特定の値に一致する場合に属性を置き換えます。

- amxネームスペースのattribute。

例6-69 デフォルト系列スタイルおよびグループ化を含む面グラフの定義

<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>

注意:

例6-68および図6-71では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

orientation属性では、面グラフを水平方向または垂直方向として定義できます。

このコンポーネントに定義できるareaChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第6.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、面グラフ・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-areaChart
- supported properties: all

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.2 棒グラフの作成方法

棒グラフ(barChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを垂直の棒として視覚的に表すために使用します。系列は、個々のデータ・アイテムごとではなく系列レベルで適用する必要があるいくつかの一般的なスタイル・プロパティを持つグラフィカル要素を使用して視覚化されます。

棒グラフは、そのX軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

例6-70は、MAF AMXファイルで定義されているbarChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。

例6-70 棒グラフの定義

<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>

図6-72 デザインタイムの棒グラフ

棒グラフのデータ・モデルは、個々の棒を記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- series: この棒が属する系列の名前。

- group: この棒が属するグループの名前。

- value: データ・アイテムの値(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

orientation属性では、棒グラフを水平方向または垂直方向として定義できます。

このコンポーネントに定義できるbarChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第6.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、棒グラフ・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-barChart
- supported properties: all

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.3 バブル・チャートの作成方法

バブル・チャート(bubbleChart)は、各データ・アイテムがx、y座標とサイズ(バブル)を持つ一連のデータ・アイテムを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(第6.5.5項「線グラフの作成方法」を参照)や面グラフ(第6.5.1項「面グラフの作成方法」を参照)と異なり、バブル・チャートには系列およびグループの厳密な概念がありません。

バブル・チャートは、そのXおよびY軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

例6-71は、MAF AMXファイルで定義されているbubbleChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。各データ・アイテムのcolorおよびmarkerShape属性は、データ・モデルで提供されている値に基づいて個別に設定されます。また、基礎となるデータ・コントロールでは、row.label、row.sizeおよびrow.shapeの変数参照がそれぞれサポートされている必要があります。

例6-71 カスタム・データ・アイテム・プロパティを設定したバブル・チャートの定義

<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>

図6-73 デザインタイムのバブル・チャート

例6-72では、データ・アイテムからなる関連する1つのグループに対して一般的なスタイル属性を設定するためにattributeGroups要素が使用されています。

例6-72 属性グループを設定したバブル・チャートの定義

<dvtm:bubbleChart id="bubbleChart1"
value="#{bindings.bubbleData.collectionModel}"
dataSelection="multiple"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Bubble Chart"
var="row">
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
group="#{row.label}"
x="#{row.x}"
y="#{row.y}" >
<dvtm:attributeGroups id="ag1" type="color" value="#{row.category}" />
<dvtm:attributeGroups id="ag2" type="shape" value="#{row.brand}" />
</dvtm:chartDataItem>
</amx:facet>
</dvtm:bubbleChart>

バブル・チャートのデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- label: データ・アイテム・ラベル(オプション)。

- x、y: 値の座標(必須)。

- z: データ・アイテムのサイズ(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

このコンポーネントに定義できるbubbleChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第6.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、バブル・チャート・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-bubbleChart
- supported properties: all

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.4 コンボ・チャートの作成方法

コンボ・チャート(comboChart)は、折れ線と棒のグラフなど、2つ以上の異なるグラフを重ねたものを表します。

例6-73は、MAF AMXファイルで定義されているcomboChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。seriesStampファセットは、系列のデフォルト・スタイル・プロパティをオーバーライドし、seriesStyle要素を使用してカスタム系列スタイルを設定します。

例6-73 コンボ・チャートの定義

<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>

図6-74 デザインタイムのコンボ・チャート

orientation属性では、コンボ・チャートを水平方向または垂直方向として定義できます。

このコンポーネントに定義できるcomboChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第6.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、コンボ・チャート・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-comboChart
- supported properties: all

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.5 線グラフの作成方法

線グラフ(lineChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、線の色、太さ、スタイルなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。

線グラフは、そのX軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

例6-74は、MAF AMXファイルで定義されているlineChart要素を示しています。デフォルト系列スタイルで基本的な線グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

例6-74 デフォルト系列スタイルを持つ線グラフの定義

<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>

図6-75 デザインタイムの線グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: この線が属する系列の名前。

- group: この線が属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやmarkerShapeなどの他のプロパティも含めることもできます。

例6-75に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、データ・アイテムのcolorおよびshape属性が、追加のグループ化式に基づいて設定されます。attributeGroupsは、次の子要素を持つことができます。

- dvtmネームスペースのattributeExceptionRule: 特定のブール条件が満たされる場合に、属性値を別の値に置き換えます。

- dvtmネームスペースのattributeMatchRule: データが特定の値に一致する場合に属性を置き換えます。

- amxネームスペースのattribute。

例6-75 デフォルト系列スタイルおよびグループ化を含む線グラフの定義

<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>

注意:

例6-74および例6-75では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

系列のデフォルト・スタイル・プロパティをオーバーライドするには、例6-76に示すように、オプションのseriesStampファセットを定義し、seriesStyle要素を使用してカスタム系列スタイルを設定します。

例6-76 カスタム系列スタイルを持つ線グラフの定義

<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では、同じ系列名を持つ異なる属性値を検出した場合、前回処理された値を適用します。

かわりに、図6-77に示すように、seriesStyle要素のrendered属性を使用して、MAF AMXチャートで系列スタイルを制御できます。

例6-77 フィルタ対象系列スタイルを持つ線グラフの定義

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem id="chartDataItem1"
series="#{row.series}"
group="#{row.group}"
value="#{row.value}"
color="#{row.color}" />
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="#{row.series}"
color="red"
lineWidth="3"
lineStyle="solid"
rendered="#{row.series == 'Coke'}" />
<dvtm:seriesStyle series="#{row.series}"
color="blue"
lineWidth="2"
lineStyle="dotted"
rendered="#{row.series == 'Pepsi'}" />
</amx:facet>
</dvtm:lineChart>

orientation属性では、線グラフを水平方向または垂直方向として定義できます。

このコンポーネントに定義できるlineChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第6.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、線グラフ・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-lineChart
- supported properties: all

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.6 円グラフの作成方法

円グラフ(pieChart)は、各データ・アイテムを円セグメント(区分)で表したデータの比率による区分を示すために使用します。区分はサイズ別に(最大から最小へと)ソートでき、小さい区分は他の単一の区分に集約できます。

例6-78は、MAF AMXファイルで定義されているpieChart要素を示しています。dataStampファセットは、ネストされたpieDataItem要素とともに指定されます。

例6-78 円グラフの定義

<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>

図6-76 デザインタイムの円グラフ

円グラフのデータ・モデルは、個々の円データ・アイテムを定義するアイテムのコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- label: 区分ラベル。

- value: 区分の値。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: 区分の境界線の色。

- color: 区分の色。

- explode: 区分を開くときのオフセット。

このコンポーネントに定義できるpieChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、pieDataItemを子として含めることができます(第6.5.16.4項「円グラフのデータ・アイテムの定義」を参照)。

dvtm-pieChart、dvtm-chartPieLabelおよびdvtm-chartSliceLabelクラスで定義されているデフォルトのCSS設定を上書きすることで、円グラフ・コンポーネントのスタイルを設定できます。

- 最上位要素のスタイルは、次のものを使用して設定できます。

.dvtm-pieChart
- supported properties: all

- 円グラフのラベルのスタイルは、次のものを使用して設定できます。

.dvtm-chartPieLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

- 円グラフの区分のラベルのスタイルは、次のものを使用して設定できます。

.dvtm-chartSliceLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.7 散布図の作成方法

散布図(scatterChart)は、各アイテムがx、y座標とサイズを持つデータ・アイテムを表す連続しないドットでデータを表示します。さらに、各データ・アイテムには、colorやmarkerShapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、線グラフ(第6.5.5項「線グラフの作成方法」を参照)や面グラフ(第6.5.1項「面グラフの作成方法」を参照)と異なり、散布図には系列およびグループの厳密な概念がありません。

散布図は、そのXおよびY軸に沿ってズームおよびスクロールできます。これは、zoomAndScroll属性を使用することによって有効になります。

例6-79は、MAF AMXファイルで定義されているscatterChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。各データ・アイテムのcolorおよびmarkerShape属性は、データ・モデルで提供されている値に基づいて個別に設定されます。

例6-79 散布図の定義

<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>

図6-77 デザインタイムの散布図

散布図のデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。各データ・アイテムの属性は、スタンプ(dataStamp)によって定義され、通常、次のものがあります。

- x、y: 値の座標(必須)。

- markerSize: マーカーのサイズ(オプション)。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: データ・アイテムの境界線の色。

- color: データ・アイテムの色。

このコンポーネントに定義できるscatterChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、chartDataItemを子として含めることができます(第6.5.16.1項「チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、散布図コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-scatterChart
- supported properties: all

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.8 スパーク・チャートの作成方法

スパーク・チャート(sparkChart)は、傾向や変化を、多くの場合、表の列内で表す簡単な縮小グラフです。このチャートは、多くの場合、データ密度の濃い表示に追加のコンテキストを提供するためにダッシュボードで使用されます。

例6-80は、MAF AMXファイルで定義されているsparkChart要素を示しています。dataStampファセットは、ネストされたsparkDataItem要素とともに指定されます。

例6-80 スパーク・チャートの定義

<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>

図6-78 デザインタイムのスパーク・チャート

スパーク・チャートのデータ・モデルは、個々のスパーク・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: スパーク値。

sparkChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、sparkDataItemを子として含めることができます(第6.5.16.5項「スパーク・チャートのデータ・アイテムの定義」を参照)。

次のクラスで定義されているデフォルトのCSS設定を上書きすることで、スパーク・チャート・コンポーネントの最上位要素のスタイルを設定できます。

.dvtm-sparkChart
- supported properties: all

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.9 ファンネル・チャートの作成方法

ファンネル・チャート(funnelChart)コンポーネントは、プロセスのステップに関するデータを視覚的に表現します。ステップは、横向きの円柱に対する縦向きのスライスとして表されます。特定のステップ(スライス)の実際の値がそのスライスの割当てに近づいた分、スライスが塗りつぶされます。通常、ファンネル・チャートには、時間などのステージ値に対する実績値と目標値が必要です。

例6-81は、MAF AMXファイルで定義されているfunnelChart要素を示しています。dataStampファセットは、ネストされたfunnelDataItem要素とともに指定されます。

例6-81 ファンネル・チャートの定義

<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>

図6-79 デザインタイムのファンネル・チャート

ファンネル・チャートのデータ・モデルは、個々のファンネル・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: ファンネル値

- label: ファンネル区分ラベル

funnelChartの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

amxネームスペースからfacet子要素を定義できます。facetには、funnelDataItemを子として含めることができます(第6.5.16.6項「ファンネル・データ・アイテムの定義」を参照)。

dvtm-funnelChartおよびdvtm-funnelDataItemクラスで定義されているデフォルトのCSS設定を上書きすることで、ファンネル・チャート・コンポーネントのスタイルを設定できます。

- 最上位要素のスタイルは、次のものを使用して設定できます。

.dvtm-funnelChart
- supported properties: all

- ファンネル・チャート・データ・アイテムのスタイルは、次のものを使用して設定できます。

.dvtm-funnelDataItem
- supported properties: border-color, background-color

チャートのスタイル設定の詳細は、第6.5.10項「チャート・コンポーネントのスタイル設定方法」を参照してください。

CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

6.5.10 チャート・コンポーネントのスタイル設定方法

スパーク・チャートを除き、次のクラスで定義されているデフォルトのCSS設定を上書きすることで、チャート・コンポーネントのスタイルを設定できます。

- チャート・コンポーネントの凡例のスタイルは、次のものを使用して設定できます。

.dvtm-legend
- supported properties used for text styling:
font-family, font-size, font-weight, color, font-style
- supported properties used for background styling: background-color
- supported properties used for border styling:
border-color (used when border width > 0)

.dvtm-legendTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-legendSectionTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

- チャート・コンポーネントのタイトルやサブタイトルなどのスタイルは、次のものを使用して設定できます。

.dvtm-chartTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartSubtitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartFootnote
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartTitleSeparator
- supported properties:
visibility (is title separator rendered),
border-top-color, border-bottom-color

- チャート・コンポーネントの軸のスタイルは、次のものを使用して設定できます。

.dvtm-chartXAxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartYAxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartY2AxisTitle
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartXAxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartYAxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

.dvtm-chartY2AxisTickLabel
- supported properties:
font-family, font-size, font-weight, color, font-style

チャート・コンポーネントの最上位要素のスタイル設定に加えて、一部のチャートでは特定の子要素のスタイルを設定できます。

6.5.11 チャート・コンポーネントでのイベントの使用方法

ViewportChangeEventを使用して、チャート・コンポーネントのズームおよびスクロールを操作できます。ズームまたはスクロールのいずれかが発生すると、新しいビューポートを定義する情報がロードされたイベントがコンポーネントによって起動されます。

viewportChangeListenerは、面グラフ、棒グラフ、コンボ・チャートおよび線グラフ・コンポーネントの属性として指定できます。

詳細は、次を参照してください。

- 第6.10項「イベント・リスナーの使用方法」

- Oracle Mobile Application Framework Oracle Fusion Middleware Java APIリファレンス

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

6.5.12 LEDゲージの作成方法

チャートと異なり、ゲージでは、単一のデータ・ポイントを重視し、そのポイントを最小、最大およびしきい値インジケータと比較して問題領域を識別します。LED(電光表示)ゲージ(ledGauge)は、重要業績評価指標(KPI)などの測定値をグラフィカルに表します。LEDゲージには、いくつかのスタイルがあります。矢印付きのものは、よい(上矢印)、普通(右または左矢印)および悪い(下矢印)を示すために使用されます。ゲージのしきい値はいくつでも指定できます。ただし、一部のLEDゲージ(矢印または三角形のインジケータを持つものなど)では、指し示す有効な方向の数が限られているため、サポートされるしきい値の数にかぎりがあります。矢印または三角形のインジケータの場合、しきい値の最大数は3です。

例6-82は、MAF AMXファイルで定義されているledGauge要素を示しています。

例6-82 LEDゲージの定義

<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>

図6-80 デザインタイムのLEDゲージ

LEDゲージのデータ・モデルは、value属性で指定される単一のメトリック値で表されます。

このコンポーネントに定義できるledGaugeの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次のamx子要素を定義できます。

- showPopupBehavior (第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第6.9項「入力の検証」を参照)

6.5.13 ステータス・メーター・ゲージの作成方法

ステータス・メーター・ゲージ(statusMeterGauge)は、矩形の水平バーまたは円に沿ってタスクの進捗状況または測定値のレベルを示します。コンポーネントのある部分が、別の部分に示されている範囲に対する現在の測定値のレベルを示します。また、しきい値は、サイズ変更が可能なインジケータの背後に表示できます。

MAF AMXのデータ視覚化のステータス・メーター・ゲージ・コンポーネントでは、参照線(referenceLine)のサポートが提供されます。この参照線を使用して、ブレット・グラフを生成できます。

例6-83は、MAF AMXファイルで定義されているstatusMeterGauge要素を示しています。

例6-83 ステータス・メーター・ゲージの定義

<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>

図6-81 デザインタイムの矩形のステータス・メーター・ゲージ

円で表されるステータス・メーター・ゲージを作成するには(図6-82を参照)、そのorientation属性をcircularに設定します。

図6-82 デザインタイムの円形のステータス・メーター・ゲージ

ステータス・メーター・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに定義できるstatusMeterGaugeの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次のamx子要素を定義できます。

- showPopupBehavior (第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第6.9項「入力の検証」を参照)

6.5.14 ダイアル・ゲージの作成方法

ダイアル・ゲージ(dialGauge)は、悪いからよいまで変化する値(しきい値)の範囲を指定します。ゲージのインジケータではメトリックの現在の値が示される一方、図形によってその値のステータスを評価できます。

例6-83は、MAF AMXファイルで定義されているdialGauge要素を示しています。

例6-84 ダイアル・ゲージの定義

<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>

図6-83 デザインタイムのダイアル・ゲージ

ダイアル・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに定義できるdialGaugeの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

例6-85は、暗い背景テーマと、-5000から5000の範囲を設定するカスタム・ティック・ラベルを備えたdialGauge要素の定義を示しています。

例6-85 メトリックとティック・ラベルの定義

<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>

図6-84 デザインタイムのメトリックとティック・ラベル付きダイアル・ゲージ

dialGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第6.9項「入力の検証」を参照)

6.5.15 評価ゲージの作成方法

評価ゲージ(ratingGauge)を使用すると、事前定義された視覚スケールに評価を表示したり、その評価を変更できます。デフォルトの評価単位は、星で表されます。ratingGaugeのshape属性を設定することによって、この単位を円、矩形、星形またはひし形として構成できます。

例6-86は、MAF AMXファイルで定義されているratingGauge要素を示しています。

例6-86 評価ゲージの定義

<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>

図6-85 デザインタイムの評価ゲージ

評価ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

このコンポーネントに定義できるratingGaugeの属性およびdvtm子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

ratingGaugeに対して次のamx子要素を定義できます。

- showPopupBehavior (第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- closePopupBehavior (第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- validationBehavior (第6.9項「入力の検証」を参照)

6.5.15.1 評価ゲージ・コンポーネントへのカスタム・スタイルの適用

ユーザーが評価ゲージ・コンポーネントに対して実行したアクションに応じて、評価単位(イメージ)は次のいずれかの状態を取得できます。

- selected: 単位を選択した場合。

- unselected: 単位を選択しなかった場合。

- hover: 単位にマウスを置いた場合。

注意:

タッチ・インタフェースを使用するモバイル・デバイスでは、hover状態はタップしたまま押さえるジェスチャーを通じて呼び出されます。

- changed: 単位を変更した場合。

各状態は、colorおよびborderColorという2つの属性によって表されます。デフォルトでは、ratingGaugeのshape属性によって、hoverおよびchanged状態の選択内容が決まります。unselected状態は、ratingGaugeのunselectedShape属性を使用して個別に設定できます。

デフォルトCSS設定を上書きすることで、評価ゲージ・コンポーネントをスタイル設定できます。CSSファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

例6-87は、評価ゲージ単位の各状態のcolorおよびborderColorに対するデフォルトCSSスタイル定義を示しています。

例6-87 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;
}

6.5.16 チャートおよびゲージ・コンポーネントの子要素の定義方法

チャートおよびゲージには様々な子要素を定義できます。それらの子要素のいくつかを次に示します。

- chartDataItem (第6.5.16.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第6.5.16.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第6.5.16.2項「凡例の定義」を参照)

- pieDataItem (第6.5.16.4項「円グラフのデータ・アイテムの定義」を参照)

- sparkDataItem (第6.5.16.5項「スパーク・チャートのデータ・アイテムの定義」を参照)

- threshold (第6.5.16.7項「しきい値の定義」を参照)

- funnelDataItem

これらおよびその他の子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

JDeveloperでは、データ視覚化コンポーネントの子コンポーネントは、「コンポーネント」ウィンドウの「MAF AMXデータ視覚化」→「共有子タグ」の下および「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」の下にあります(図6-66を参照)。

図6-86 チャートおよびゲージの子コンポーネントの作成

6.5.16.1 チャートのデータ・アイテムの定義

チャート・データ・アイテム(chartDataItem)要素は、円グラフを除くすべてのサポートされているチャートでチャート・データ・アイテムが使用するパラメータを指定します。

chartDataItem要素の関連する属性およびチャート自体のdataLabelPosition属性を設定して、特定のチャートのすべてのデータ・ラベルの位置を指定することにより、チャート・データ・アイテムのテキスト表示を有効にし、そのラベル、ラベル位置およびラベル・スタイルを制御できます。

注意:

スパーク・チャート、円グラフおよびファンネル・チャート・コンポーネントでは、dataLabelPosition属性はサポートされません。

chartDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.16.2 凡例の定義

凡例(legend)要素は、凡例パラメータを指定します。

legend要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.16.3 X軸、Y軸およびY2軸の定義

X軸(xAxis)およびY軸(yAxis)要素は、チャートのX軸とY軸を定義します。Y2軸(y2Axis)は、オプションのY2軸を定義します。これらの要素は、MAF AMXファイルで次のように宣言されます。

<dvtm:xAxis id="xAxis1" scrolling="on" axisMinValue="0.0" axisMaxValue="50.0" />

xAxis、yAxisおよびy2Axis要素の属性および子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.16.4 円グラフのデータ・アイテムの定義

円グラフのデータ・アイテム(pieDataItem)要素は、円グラフの区分のパラメータを指定します(第6.5.6項「円グラフの作成方法」を参照)。

pieDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.16.5 スパーク・チャートのデータ・アイテムの定義

スパーク・チャートのデータ・アイテム(sparkDataItem)要素は、スパーク・チャート・アイテムのパラメータを指定します(第6.5.8項「スパーク・チャートの作成方法」を参照)。

sparkDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.16.6 ファンネル・データ・アイテムの定義

ファンネル・データ・アイテム(funnelDataItem)要素は、ファンネル・チャート・アイテムのパラメータを指定します(第6.5.9項「ファンネル・チャートの作成方法」を参照)。

funnelDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.16.7 しきい値の定義

しきい値(threshold)要素は、ゲージのしきい値範囲を指定します(第6.5.12項「LEDゲージの作成方法」および第6.5.13項「ステータス・メーター・ゲージの作成方法」を参照)。

threshold要素の属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.17 地理マップ・コンポーネントの作成方法

地理マップ(geographicMap)は、1つのマップに重ね合せた1つ以上のインタラクティブな情報レイヤーでビジネス・データを表します。このコンポーネントを構成して、GoogleマップまたはOracleマップのいずれかをマップ・プロバイダとして 使用できます(第6.5.17.1項「地理プロバイダ情報を指定した地理マップ・コンポーネントの構成」を参照)。

例6-88は、MAF AMXファイルで定義されているgeographicMap要素を示しています。

例6-88 地理マップの定義

<dvtm:geographicMap id="g1" mapType="ROADMAP"
centerX="-98.57" centerY="39.82"
zoomLevel="2" initialZooming="auto">
<dvtm:pointDataLayer id="pdl1"
var="row"
value="#{bindings.locationData.collectionModel}"
dataSelection="multiple"
selectionListener="#{myBean.doSomeGood}">
<dvtm:pointLocation id="pl1" type="address" address="#{row.address}">
<dvtm:marker shortDesc="#{row.shortDesc}" id="m1" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:geographicMap>

図6-87 デザインタイムの地理マップ

geographicMapに対してpointDataLayer子要素を定義できます。pointDataLayerによって、マップ上の点と関連付けられたデータを表示できます。pointDataLayerは子要素としてpointLocationを持つことができます。pointLocationは、データ・ポイントの位置を決定するデータ・レイヤーのモデル内の列を指定します。これらの位置は、住所またはX座標とY座標で表すことができます。

pointLocationは、子要素としてmarkerを持つことができます。markerは、マップ上のデータ・ポイントに関連付けられた組込み形状またはカスタム形状をスタンプ・アウトするために使用します。markerでは、マーカーとしてレンダリングされるイメージのURIを指定するための一連のプロパティがサポートされています。マーカーは子要素としてconvertNumberを持つことができます(第6.3.25項「数値の変換方法」を参照)。また、ポップアップ(第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)を有効にして、geographicMapのmarkerに表示されるようにできます。そのためには、showPopupBehavior要素をmarker要素の子として宣言し、showPopupBehaviorのalignId属性をmarkerのid属性の値に設定します(例6-89を参照)。

例6-89 マーカー上でのポップアップの表示

<dvtm:geographicMap id="geographicMap_1" shortDesc="#{pageFlowScope.shortDesc}">
<dvtm:pointDataLayer id="pdl1"
var="row"
value=
"#{bindings.geographicMapPointData.collectionModel}">

<dvtm:pointLocation id="pl1"
pointX="#{row.pointX}"
pointY="#{row.pointY}">
<dvtm:marker id="marker1"
shortDesc="#{row.shortDesc}"
rendered="true">
<amx:showPopupBehavior id="spb1"
popupId="popup1"
alignId="marker1"
align="topCenter"
decoration="anchor"/>
<amx:setPropertyListener from="#{row.shortDesc}"
to="#{pageFlowScope.currentCity}"
type="action"/>
</dvtm:marker>
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:geographicMap>
...
<amx:popup id="popup1" backgroundDimming="off" autoDismiss="true">
<amx:outputText id="otTest" value="City: #{pageFlowScope.currentCity}"/>
...
</amx:popup>

geographicMap要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

地理マップ・コンポーネントでは、タッチ・ジェスチャーを使用したピンの挿入(マップ上での点の作成)が可能です。この機能を構成するには、mapInputListenerを使用します。詳細は、第6.5.19項「マップ・コンポーネントでのイベントの使用方法」を参照してください。

6.5.17.1 地理プロバイダ情報を指定した地理マップ・コンポーネントの構成

基礎となるマップに特定のプロバイダ(GoogleまたはOracle)を使用するように地理マップ・コンポーネントを構成するには、アプリケーションのadf-config.xmlファイルに名前と値のペアとして次のプロパティを設定します。

- mapProvider: oraclemapsまたはgooglemapsを指定します。

- geoMapKey: mapProviderがgooglemapsに設定されている場合は、ライセンス・キーを指定します。

- geoMapClientId: mapProviderがgooglemapsに設定されている場合は、Googleマップ・ビジネス・ライセンスのクライアントIDを指定します。

- mapViewerUrl: mapProviderがoraclemapsに設定されている場合は、Oracleマップのマップ・ビューアURLを指定します。

- baseMap: mapProviderがoraclemapsに設定されている場合は、Oracleマップとともに使用するベース・マップを指定します。

注意:

Googleマップを使用するように地理マップ・コンポーネントを構成するには、Googleから該当するライセンスを取得する必要があります。

例6-90は、Googleマップ用の構成を示しています。

例6-90 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>

例6-91は、Oracleマップの構成を示しています。

例6-91 Oracleマップの構成

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="oraclemaps"/>
<adf-property name="mapViewerUrl"
value="http://elocation.oracle.com/mapviewer"/>
<adf-property name="baseMap" value="ELOCATION_MERCATOR.WORLD_MAP"/>
</adf-properties-child>

マップ・プロバイダ情報を指定しない場合、MAF AMX地理マップ・コンポーネントは、そのマップとしてGoogleマップを使用しますがライセンス・キーはありません。

マップ・プロバイダとしてのGoogleマップの使用に関する問題の詳細は、第A.2項「アドレス・ポイント数を制限する地理マップ・コンポーネント」を参照してください。

adf-config.xmlファイルの詳細は、次を参照してください:

- 第3.2.2.1項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」

- 表3-1「アプリケーション・リソースを介してアクセスされるモバイル・アプリケーション・レベルのアーティファクト」

6.5.18 テーマ・マップ・コンポーネントの作成方法

テーマ・マップ(thematicMap)では、ビジネス・データをスタイル設定された領域内のパターンまたは関連付けられたマーカーとして表します。テーマ・マップでは、地理的な詳細なしで、データに焦点を合せます。

例6-92は、MAF AMXファイルで定義されているthematicMap要素およびその子を示しています。

例6-92 テーマ・マップの定義

<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>

図6-88 デザインタイムのテーマ・マップ

markerZoomBehavior属性を使用すると、マップがズームされたときにテーマ・マップのマーカーのスケーリングを有効にできます。マーカーのrotation属性を設定することでマーカーの回転を有効にできます。この属性の値は、マーカーが、イメージの中心を基準として時計回りに回転する角度を表します。

MAF AMXテーマ・マップでは、次の拡張機能をサポートしています。

- カスタム・マーカー(第6.5.18.1項「カスタム・マーカーの定義」を参照)

- 領域の分離(第6.5.18.3項「分離領域の定義」を参照)

- 初期ズーム(第6.5.18.4項「初期ズームの有効化」を参照)

- カスタム・ベース・マップ(第6.5.18.5項「カスタム・ベース・マップの定義」を参照)

thematicMap要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.18.1 カスタム・マーカーの定義

MAF AMXテーマ・マップでは、MAF AMXイメージ・コンポーネントはサポートされていません。マップのpointLocation内でイメージを使用するには、pointLocationのmarker子要素で、そのsource属性を使用してイメージを指定します。source属性がマーカーに対して設定されている場合、そのshape属性はMAF AMXによって無視されます。

sourceHover、sourceSelectedおよびsourceHoverSelected属性で、ホバーおよび選択効果のイメージを指定できます。これらの1つが指定されていない場合、その特定のマーカー状態に対してはsource属性によって指定されているイメージが使用されます。sourceSelectedが指定されている場合、sourceHoverSelectedが指定されていないときはその値が使用されます。イメージは、PNG、JPG、SVGなどモバイル・デバイスのブラウザでサポートされている任意のフォーマットで構いません。

6.5.18.2 分離領域レイヤーの定義

リージョンの枠は、常にデータの地理的位置を示す必要はありません。かわりに、テーマ・マップ・コンポーネントには領域内の中心にイメージまたはマーカーを配置するオプションがあるため、リージョンの枠が描画されない非表示の領域レイヤーを定義できます。

非表示の領域レイヤーを定義するには、background-colorおよびborder-colorのCSS値を受け入れるareaLayerのareaStyle属性を次のように使用します。

<dvtm:areaLayer id="areaLayer1"
...
areaStyle="background-color:transparent;border-color:transparent">

この属性を使用すると、dvtm-areaスキニング・キーを使用しないで、デフォルトの領域レイヤーの色および境界線の処理をオーバーライドできます。

6.5.18.3 分離領域の定義

MAF AMXテーマ・マップ・コンポーネントを構成し、areaDataLayerのisolatedRowKey属性を使用してマップの単一の分離領域に収まるようにレンダリングおよびズームできます。この場合、その領域または領域データ・レイヤーの残りの領域はレンダリングされません。

注意:

分離できるのは、1つのマップで1つの領域のみです。

6.5.18.4 初期ズームの有効化

初期ズームでは、マップ・コンポーネントを通常どおりレンダリングし、その後、マーカーと領域の両方を含むデータ・オブジェクトにズームして合せることができます。この機能を有効にするには、テーマ・マップのinitialZooming属性を使用します。

6.5.18.5 カスタム・ベース・マップの定義

カスタム・ベース・マップ・サポートの一部として、MAF AMXでは、テーマ・マップ・コンポーネントに対して次のものを指定できます。

- 様々な解像度のイメージを持つレイヤー。

- 点の位置(pointLocation)から参照できる名前付きの点を持つ点レイヤー。

- カスタム・ベース・マップ・メタデータXMLファイルを指すテーマ・マップのsource属性。

注意:

MAF AMXでは、カスタム・ベース・マップの次のものはサポートされていません。

- スタイル設定された領域: 領域レイヤーはカスタム・ベース・マップには定義できないため、ポイント・レイヤーを使用します。

- リソース・バンドル: ロケール固有のツールチップを追加するには、マーカー(marker)のshortDesc属性でELを使用します。

カスタム・ベース・マップを作成するには、メタデータ・ファイルの定義を指す領域レイヤーを指定します(例6-93を参照)。基本的なカスタム・ベース・マップを定義するには、背景レイヤーおよびポインタ・データ・レイヤーを指定します。MAF AMXゲージ・コンポーネントと同様に、メタデータ・ファイルで、画面解像度および表示方向ごとに異なるイメージを指定できます。ゲージタイプ・コンポーネントと同様に、テーマ・マップでは、画面解像度および方向に基づいてレイヤーに適切なイメージが選択されます。表示方向は左から右です。

レイヤーはいくつでも定義できます。すべてのレイヤーではすべての名前付きポイントにアクセスできます。名前付きポイントのX位置とY位置は、最初のイメージのイメージ・サイズにマッピングされます。次のいずれかが起きると、テーマ・マップ・コンポーネントはポイントの位置を計算します。

- ズーム・インが実行されます。

- 違ったイメージが違った解像度で表示されます。

例6-93 イメージのリストを含むメタデータ・ファイル

<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>

例6-94は、点によってカスタム領域レイヤーを宣言するMAF AMXファイルを示しています。このMAF AMXファイルは、使用可能なイメージ(実際は、同じイメージの拡大縮小されたバージョン)のリストを含む、例6-93に示すメタデータ・ファイルを指しています。

例6-94 点によるカスタム領域レイヤーの宣言

<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座標で定義され、データが更新されたときに変更される可能性がある動的な点に対応します。

例6-95は、点によってカスタム領域レイヤーを宣言するもう1つの方法を示しています。この例では、pointDataLayerは、thematicMapの直接の子です。方法は異なりますが、例6-95では、例6-94で示した宣言と同じ結果がレンダリングされます。

例6-95 直接の子要素を使用した点によるカスタム領域レイヤーの宣言

<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>

静的な点を含むカスタム・ベース・マップを作成するには、例6-96に示すメタデータ・ファイルで名前で点を指定します。このプロセスは、事前定義済ベース・マップに市区町村のマーカーを追加する場合に類似しています。

例6-96 名前付きの点のリストを含むメタデータ・ファイル

<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要素のイメージ・ディメンションにマップされると想定されます。

注意:

これらの点はベース・マップ内のスコープでグローバルで、すべてのレイヤーに適用されるため、特定のレイヤーおよびそのイメージに点を定義することはできません。

例6-97は、名前付きの点によってカスタム領域レイヤーを宣言するMAF AMXファイルを示しています。このMAF AMXファイルは、点とそれらの名前のリストを含む例6-93に示すメタデータ・ファイルを指しています。

例6-97 名前付きの点によるカスタム領域レイヤーの宣言

<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>

6.5.18.6 イベント・リスナーのマーカー・サポートに関する必知事項

MAF AMXのデータ視覚化では、markerのactionListener属性はサポートされていません。かわりに、action属性を使用することで同じ機能を実現できます。

6.5.18.7 テーマ・マップ・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、テーマ・マップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

例6-98は、テーマ・マップ・コンポーネントのデフォルトCSSスタイルを示しています。

例6-98 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ファイルを使用して定義する必要があります。例6-99は、CSSを使用しないでテーマ・マップ・コンポーネントにカスタム・スタイルを適用する方法を示しています。

例6-99 非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ファイルをアプリケーションに追加する方法の詳細は、第4.10章「アプリケーション機能のコンテンツ・タイプの定義」を参照してください。

attributeGroups属性がテーマ・マップ・コンポーネント用に定義されている場合、CustomThematicMapStyleを使用して、そのコンポーネントの図形と色のデフォルト・セットを定義できます。この場合、CustomThematicMapStyleオブジェクトの構造は、例6-100のようになっている必要があります。styleDefaultsは、次のフィールドを含むネストされたオブジェクトです。

- colors: 領域とマーカーに使用される色のセットを表します。

- shapes: マーカーに使用される図形のセットを表します。

例6-100 テーマ・マップのデフォルトのカスタム図形および色の定義

window['CustomThematicMapStyle'] =
{
// custom style values
'styleDefaults': {
// custom color palette
'colors': ["#000000", "#ffffff"],
// custom marker shapes
'shapes' : ['circle', 'square']
}
};

6.5.19 マップ・コンポーネントでのイベントの使用方法

MapBoundsChangeEventを使用して、地理マップ・コンポーネントでの次のマップ・ビュー・プロパティの変更を処理できます。

- ズーム・レベルの変更。

- マップ境界の変更。

- マップ中心の変更。

これらの変更が発生した場合、新しいマップ・ビュー・プロパティ値がロードされたイベントがコンポーネントによって起動されます。

地理マップの属性としてmapBoundsChangeListenerを定義できます。

地理およびテーマ・マップ・コンポーネントで、MapInputEventを使用してタップおよびマウス・クリックなどのエンド・ユーザー・アクションを処理できます。これらのアクションが発生すると、マップの緯度および経度の情報およびアクションのタイプ(たとえば、マウス・ボタンが押された、マウス・ボタンが放された、クリックなど)がロードされたイベントが、コンポーネントによって起動されます。

地理マップ・コンポーネントの属性としてmapInputListenerを定義できます。

詳細は、次を参照してください。

- 第6.10項「イベント・リスナーの使用方法」

- Oracle Mobile Application Framework Oracle Fusion Middleware Java APIリファレンス

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

6.5.20 ツリーマップ・コンポーネントの作成方法

ツリーマップ(treemap)は、ノード(treemapNode)のサイズと色で表された、2つのディメンションにまたがる階層データを表示します。

「コンポーネント」ウィンドウで、「ツリーマップ」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「サンバーストおよびツリーマップ」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図6-89を参照)。

図6-89 「コンポーネント」ウィンドウのツリーマップおよびその他の拡張コンポーネント

例6-101は、MAF AMXファイルで定義されているtreemap要素およびその子を示しています。

例6-101 ツリーマップの定義

<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>

図6-90 デザインタイムのツリーマップ

attributeGroups要素のattributeType属性をcontinuousに設定することで、色の濃さが指定された範囲内での相対値を表すグラデーション色を使用した、ツリーマップ・アイテムに関連付けられた値の視覚化を有効にできます。

treemap要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.20.1 ツリーマップ・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、ツリーマップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

例6-102は、オーバーライド可能なツリーマップ・コンポーネントのデフォルトCSSスタイルを示しています。

例6-102 ツリーマップのデフォルトCSSスタイル設定

.dvtm-treemap {
border-style: solid;
border-color: #E2E8EE;
border-radius: 3px;
background-color: #EDF2F7;
...
}

例6-103は、オーバーライド可能なツリーマップ・ノードのデフォルトCSSスタイルを示しています。

例6-103 ツリーマップ・ノードのデフォルトCSSスタイル設定

.dvtm-treemapNodeSelected {
// Selected node outer border color
border-top-color: #E2E8EE;
// Selected node inner border color
border-bottom-color: #EDF2F7;
}

例6-104は、カスタムCSSを使用してスタイルを設定できる、ツリーマップ・ノードのlabelテキストCSSプロパティを示しています。

例6-104 ラベルのCSSのスタイル設定

.dvtm-treemapNodeLabel {
font-family: Helvetica, sans-serif;
font-size: 14px;
font-style: normal;
font-weight: normal;
color: #7097CF;
...
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。例6-105は、CSSを使用しないでツリーマップ・コンポーネントにカスタム・スタイルを適用する方法を示しています。

例6-105 非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"
},
}

6.5.21 サンバースト・コンポーネントの作成方法

サンバースト(sunburst)は、ノード(sunburstNode)のサイズと色で表された、2つのディメンションにまたがる階層データを表示します。

「コンポーネント」ウィンドウで、「サンバースト」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「サンバーストおよびツリーマップ」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図6-89「「コンポーネント」ウィンドウのツリーマップおよびその他の拡張コンポーネント」を参照)。

例6-106は、MAF AMXファイルで定義されているsunburst要素およびその子を示しています。

例6-106 サンバーストの定義

<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>

図6-91 デザインタイムのサンバースト

attributeGroups要素のattributeType属性をcontinuousに設定することで、色の濃さが指定された範囲内での相対値を表すグラデーション色を使用した、サンバースト・アイテムに関連付けられた値の視覚化を有効にできます。

sunburst要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.21.1 サンバースト・コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、サンバースト・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

例6-107は、オーバーライド可能なサンバースト・コンポーネントのデフォルトCSSスタイルを示しています。

例6-107 サンバーストのデフォルトCSSスタイル設定

.dvtm-sunburst {
border-style: solid;
border-color: #E2E8EE;
border-radius: 3px;
background-color: #EDF2F7;
...
}

例6-108は、オーバーライド可能なサンバースト・ノードのデフォルトCSSスタイルを示しています。

例6-108 サンバースト・ノードのデフォルトCSSスタイル設定

.dvtm-sunburstNode {
// Node border color
border-color: "#000000";
}

.dvtm-sunburstNodeSelected {
// Selected node border color
border-color: "#000000";
}

例6-109は、カスタムCSSを使用してスタイルを設定できる、サンバースト・ノードのlabelテキストCSSプロパティを示しています。

例6-109 ラベルのCSSのスタイル設定

.dvtm-sunburstNodeLabel {
font-family: Helvetica, sans-serif;
font-size: 14px;
font-style: normal;
font-style: normal;
color: #7097CF;
...
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。例6-110は、CSSを使用しないでサンバースト・コンポーネントにカスタム・スタイルを適用する方法を示しています。

例6-110 非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"
}
}

6.5.22 時系列コンポーネントの作成方法

時系列(timeline)はズームに使用できる対話型コンポーネントであり、これを使用して、時系列順でイベントを表示したり、定義されているが調整可能な時間範囲内で前後に移動することができます。

イベントは、タイトル、説明および継続時間の塗りつぶしの色を含む、時系列アイテム・コンポーネント(timelineItem)で表されます。2つの時系列を構成して2系列のイベントを表示し、関連する情報を並べて比較できます。

注意:

MAF AMXは、時系列に似たコンポーネントで多くの場合使用可能な次の機能、子要素およびプロパティをサポートしていません。

- ネストされたUIコンポーネント

- アニメーション

- 属性および時間範囲の変更の検出

- 時間のフェッチ

- カスタム・タイム・スケール

- 時間通貨

- 部分トリガー

- データのソート

- 書式設定された時間範囲

- タイムゾーン

- 可視性

「コンポーネント」ウィンドウで、「時系列」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「時系列」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図6-89「「コンポーネント」ウィンドウのツリーマップおよびその他の拡張コンポーネント」を参照)。

例6-111は、MAF AMXファイルで定義されているtimeline要素およびその子を示しています。

例6-111 時系列の定義

<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>

図6-92 デザインタイムの時系列

durationFillColor属性を使用して、特定の時系列アイテムの継続時間バーの塗りつぶしの色を制御できます。

時系列で同時に2つのタイム・スケールを表示するには、2番目の軸のスケールを決定する時間軸のscale属性を使用します。

時系列は、水平および垂直にスクロールできます。コンポーネントがスクロール可能である場合(つまり、表示されている表示領域の外側にデータが含まれている場合)、このことはスクロールの方向を指す矢印によって示されます。

ヒント:

時系列開始時間は、最初の時系列アイテムの開始時間と同じ値に設定されている場合、対応する時系列アイテム・コンポーネントのバブルは切り捨てられて表示されることがあります。また、時系列終了時間が最後の時系列アイテムの終了時間と同じ値に設定されている場合、対応する時系列アイテム・コンポーネントのバブルは切り捨てられて表示されることがあります。時系列アイテムのバブルが完全に見られるように、時系列コンポーネントの開始時間と終了時間を設定する必要があります。

timeline要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.22.1 時系列コンポーネントへのカスタム・スタイルの適用

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、時系列コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第6.6.4項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

オーバーライド可能な次のCSSスタイル・クラスが、時系列およびその子コンポーネントに定義されています。

- .dvtm-timeline
サポートされるプロパティ: all

- .timelineSeries-backgroundColor
サポートされるプロパティ: color

.timelineSeries-labelStyle

サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

.timelineSeries-emptyTextStyle

サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

- .timelineItem-backgroundColor
サポートされるプロパティ: color

.timelineItem-selectedBackgroundColor

サポートされるプロパティ: color

.timelineItem-borderColor

サポートされるプロパティ: color

.timelineItem-selectedBorderColor

サポートされるプロパティ: color

.timelineItem-borderWidth

サポートされるプロパティ: width

.timelineItem-selectedBorderWidth

サポートされるプロパティ: width

.timelineItem-feelerColor

サポートされるプロパティ: color

.timelineItem-selectedFeelerColor

サポートされるプロパティ: color

.timelineItem-feelerWidth

サポートされるプロパティ: width

.timelineItem-selectedFeelerWidth

サポートされるプロパティ: width

.timelineItem-descriptionStyle

- サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

.timelineItem-titleStyle

- サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

- .timeAxis-separatorColor
サポートされるプロパティ: color

.timeAxis-backgroundColor

サポートされるプロパティ: color

.timeAxis-borderColor

サポートされるプロパティ: color

.timeAxis-borderWidth

サポートされるプロパティ: width

.timeAxis-labelStyle

- サポートされるプロパティ: font-family、font-size、font-weight、color、font-style

例6-112は、時系列コンポーネントのデフォルト・スタイルをオーバーライドするために使用できるカスタムJavaScriptファイルを示しています。

例6-112 カスタム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]
}
}

6.5.23 NBoxコンポーネントの作成方法

NBox (nBox)コンポーネントは、2つのディメンションにまたがるデータを表し、各ディメンションは複数の範囲に分割され、その交点が各データ・アイテムが配置される個別のセルになります。

「コンポーネント」ウィンドウで、「NBox」は「MAF AMXデータ視覚化」→「共通」→「その他」の下にあり、その子コンポーネントは「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」→「NBox」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図6-89「「コンポーネント」ウィンドウのツリーマップおよびその他の拡張コンポーネント」を参照)。

例6-111は、MAF AMXファイルで定義されているnBox要素およびその子を示しています。

例6-113 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>

図6-93 デザインタイムのNBox

nBox要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.5.24 マップ・コンポーネント、サンバースト、ツリーマップ、時系列およびNBoxの子要素の定義方法

マップ・コンポーネント、サンバースト、ツリーマップ、時系列およびNBoxの様々な子要素を定義できます。使用可能な子要素およびその属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

JDeveloperでは、マップ、サンバースト、ツリーマップ、時系列およびNBoxの子コンポーネントは、「コンポーネント」ウィンドウの「MAF AMXデータ視覚化」→「その他のタイプ固有の子タグ」および「MAF AMXデータ視覚化」→「共有子タグ」の下にあります(図6-94を参照)。

図6-94 マップ、サンバースト、ツリーマップ、時系列およびNBoxの子コンポーネントの作成

6.5.25 データバインドされたデータ視覚化コンポーネントの作成方法

「データ・コントロール」ウィンドウから挿入されたデータ・コレクションを使用して、データバインドされたデータ視覚化コンポーネントを宣言的に作成できます(第5.3.2.4項「データ・コントロールのビューへの追加」を参照)。図6-108に示す「コンポーネント・ギャラリ」ダイアログで、いくつかのデータ視覚化コンポーネント・カテゴリ、タイプおよびレイアウトのオプションの中から選択できます。

図6-95 チャート・コンポーネントを作成するコンポーネント・ギャラリ

図6-96 ゲージ・コンポーネントを作成するコンポーネント・ギャラリ

図6-97 テーマ・マップ・コンポーネントを作成するコンポーネント・ギャラリ

注意:

いくつかのデータ視覚化コンポーネント・タイプには、特別な種類のデータが必要です。選択したコンポーネントのタイプの表示に十分なデータが含まれていないデータ・コレクションにコンポーネントをバインドすると、コンポーネントは表示されず、データが不十分であることを示すメッセージが表示されます。

「コンポーネント・ギャラリ」の表示をトリガーするには、「データ・コントロール」ウィンドウからMAF AMXページにコレクションをドラッグ・アンド・ドロップし、表示されるポップアップ・メニューから「MAFチャート」、「MAFゲージ」または「MAFテーマ・マップ」のいずれかを選択します(図6-98を参照)。

図6-98 データバインドされたデータ視覚化コンポーネントの作成

「コンポーネント・ギャラリ」から新しいデータバインド・コンポーネントのカテゴリ、タイプおよびレイアウトを選択し、「OK」をクリックすると、データ・バインディング・ダイアログを使用してデータ視覚化コンポーネントのデータ・コレクション属性のバインディングを開始できます。ダイアログの名前と、入力フィールド・ラベルは、選択したデータ視覚化コンポーネントのカテゴリおよびタイプによって異なります。図6-99に示すように、たとえば、カテゴリとして「棒」を、タイプとして「棒」を選択した場合、表示されるダイアログの名前は「モバイル棒チャートの作成」で、入力フィールドには「棒」というラベルが付けられます。

図6-99 データバインドされたチャートのデータ値の指定

データ・コレクション内の属性には、データ値またはデータ値のカテゴリを指定できます。データ値は、棒の高さなどのマーカーまたは散布図のポイントで示される数字です。データ値のカテゴリは、軸ラベルとして表されるメンバーです。バインディング内で属性が担うロール(データ値またはID)は、データ型(グラフには数値データ値が必要)およびマップされる場所(棒やX軸など)の両方によって決まります。

「コンポーネント・ギャラリ」を使用してデータバインド・ゲージ・コンポーネントを作成し、カテゴリとして「LED」を選択し、タイプとして「星形LED」を選択した場合、表示されるダイアログの名前は図6-100に示すように「モバイル星形LEDゲージの作成」になります。

図6-100 データバインド・ゲージのデータ値の指定

データバインドされたテーマ・マップ・コンポーネントを作成する場合に、「コンポーネント・ギャラリ」を使用すると、選択内容に関係なく、表示されるダイアログの名前は「データ・レイヤーの作成」になりますが、表示されるフィールドは「コンポーネント・ギャラリ」での選択内容に応じて異なります。たとえば、ベース・マップとして「すべてのユーザー」を選択し、領域レイヤーとして「世界(大陸)」を選択した場合、図6-100に示すダイアログが開きます。

図6-101 「データ・レイヤーの作成」ダイアログ

1つ以上のデータ・バインディング・ダイアログの完了後は、「プロパティ」ウィンドウを使用してコンポーネント属性の設定を指定できます。コンポーネントと関連付けられた子要素を使用して、さらにカスタマイズすることもできます(第6.5.16項「チャートおよびゲージ・コンポーネントの子要素の定義方法」を参照)。

コレクションをMAF AMXページにドロップすると表示されるポップアップ・メニューから「MAF地理マップ」、「MAFサンバースト」、「MAF NBox」、「MAFタイムライン」または「MAFツリーマップ」を選択すると、次のいずれかのダイアログが表示されます。

図6-102 データバインドされた地理マップの作成

図6-103 データバインドされたサンバーストの作成

図6-104 データバインドされた時系列の作成

図6-105 データバインドされたツリーマップの作成

図6-106 データバインドされたNBoxの作成

「NBoxの作成」ダイアログを完了するには、まず行および列の数を定義します。次に図6-107に示すように、ボックス上のセルを選択して、ダイアログの下部で行または列全体の値を指定できます。

図6-107 データバインドされたNBoxの行および列の値の設定

「次へ」をクリックして一連のダイアログのすべてのページを完了すると、NBoxコンポーネントが作成されます。

各ダイアログの各フィールドの値の詳細は、「ヘルプ」をクリックするか[F1]を押してオンライン・ヘルプを参照してください。

6.5.25.1 データバインドされたチャート・コンポーネントの系列スタイルの設定に関する必知事項

「データ・コントロール」ウィンドウからデータバインドされたチャート・コンポーネントを作成するとき、seriesStyle要素を追加し、「プロパティ」ウィンドウを使用してseriesStyle要素のseries属性のリストを開くことによって、チャート系列データのスタイル設定情報を宣言的に指定できます。このリストには、dataStampファセット内のchartDataItem要素の値に基づくseries属性の値がすでに移入されています。

6.5.26 静的データに基づくデータ視覚化コンポーネントの作成方法

チャート、ツリーマップ、サンバーストおよび時系列の場合、そのvar属性もvalue属性も指定しないことができます。かわりに、データ・アイテムに対応している要素を列挙することによって、コンポーネント構造を静的に定義できます(例: チャートのcharDataItem要素や時系列の系列のtimelineItems)。これらの静的アイテムは必要な数を追加できます。これは、設計時にデータがわかっている場合に便利です。

例6-114は、pieDataItem子コンポーネントを介して定義されている静的データを使用する円グラフ・コンポーネントを示しています。

例 6-114 ハードコードされている静的値の定義

<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>

例6-115は、コレクションのかわりに属性バインディングに基づいて値が指定されているpieDataItem子コンポーネントを示しています。

例6-115 属性バインディングとしての静的値の提供

<dvtm:pieDataItem id="di1" value="#{bindings.Salary.inputValue}" label="Salary"/>

6.5.27 チャート・コンポーネントでインタラクティブ性を有効にする方法

チャートの次の子コンポーネントのイベントドリブン・トリガーを定義することによって、チャート・コンポーネントのタップによるエンド・ユーザーの操作おが可能になります。

- チャートのデータ・アイテム

- 円グラフのデータ・アイテム

- 系列スタイル

プロパティ設定リスナーやポップアップ表示動作などのサポートされている操作を使用するのに加え(完全なリストは、表6-16「サポートされているイベント・リスナーおよびイベント・タイプ」を参照)、action属性を設定して、起動するアクションのタイプを定義できます。

例6-116 チャートの子コンポーネントのイベントの定義

<amx:panelPage id="pp1" styleClass="dvtm-gallery-panelPage">
...
<dvtm:lineChart id="lineChart1"
var="row"
value="#{bindings.lineData1.collectionModel}"
... >
<amx:facet name="dataStamp">
<dvtm:chartDataItem group="#{row.group}"
value="#{row.value}"
series=" #{row.series}"
label="#{pageFlowScope.labelDisplay ?
row.value : ''}" >
<amx:showPopupBehavior popupId="pAdvancedOptions"
type="action"
align="overlapTopCenter"
alignId="pflOptionsForm"
decoration="anchor"/>
</dvtm:chartDataItem>
</amx:facet>
...
</dvtm:lineChart>
...
</amx:panelPage>
<amx:popup id="pAdvancedOptions" styleClass="dvtm-gallery-options-dialog">
...

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

6.5.28 極チャートの作成方法

coordinateSystem属性をpolarに設定することによって、次のチャート・コンポーネントの極ビューを有効にできます。

- 面グラフ

- 棒グラフ

- コンボ・チャート

- バブル・チャート

- 線グラフ

- 散布図

極設定が、棒グラフを除く前述のチャートのいずれかに適用される場合、polarGridShape属性を使用することによって、極グリッドを循環またはポリゴンとして定義できます。

極チャートの放射軸は、Y軸の子コンポーネントを使用してカスタマイズでき、接線軸は、X軸の子コンポーネントを使用してカスタマイズできます。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

6.6 UIコンポーネントのスタイル設定

MAFでは、CSSを使用してUIコンポーネントにスタイルを適用できます。

6.6.1 コンポーネント属性を使用したスタイルの定義方法

次の属性を設定することで、UIコンポーネントをスタイル設定できます。

- styleClass属性は、レイアウト・コンポーネントに対して使用するCSSスタイル・クラスを定義します。

<amx:panelPage styleClass="#{pageFlowScope.pStyleClass}">

MAF AMXページまたはスキニングCSSファイルでレイアウト、コマンドおよび入力コンポーネントのスタイル・クラスを定義できます。その場合、特定のスタイルがMAF AMXアプリケーション機能内のすべてのコンポーネントに適用されます(第6.6.2項「スキニングに関する必知事項」を参照)。かわりに、MAFによって提供されるパブリック・スタイル・クラスを使用できます。

注意:

CSSファイルは、JDeveloperからアクセスできません。かわりに、MAFによって、ビルドまたはデプロイ時に、このファイルがパッケージに注入され、そのときにCSSファイルがWeb Contentルート・ディレクトリの下のcssディレクトリに表示されます。

- inlineStyle属性は、任意のUIコンポーネントに使用するCSSスタイルを定義し、コンポーネントのルートDOM要素に適用される一連のCSSスタイルを表します。

<amx:outputText inlineStyle="color:red;">

この属性は、基本スタイルの変更が必要な場合に使用してください。

注意:

いくつかのUIコンポーネントは、HTML div要素やさらに複雑なマークアップなどのサブ要素でレンダリングされます。その結果、親コンポーネントにinlineStyle属性を設定しても、目的の効果が得られないことがあります。そのような場合、生成されたマークアップを調べ、inlineStyle属性を定義するかわりに、サブ要素にスタイルを伝播するCSSクラスを適用します。

JavaScriptのデバッグ方法の詳細は、第22.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

これらの属性は、図6-108に示すように「プロパティ」ウィンドウの「スタイル」セクションに表示されます。

図6-108 「プロパティ」ウィンドウの「スタイル」セクション

MAF AMXでは、「プロパティ」ウィンドウ内に、inlineStyle属性の様々なプロパティを設定するために使用できるドロップダウン・エディタが提供されています(図6-109を参照)。

図6-109 「インライン・スタイル」エディタ

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

6.6.2 スキニングに関する必知事項

スキニングによって、MAF AMXアプリケーション機能内のすべてのUIコンポーネントに均一なスタイルを定義および適用し、機能全体に対するテーマを作成できます。

MAFのデフォルト・スキン・ファミリはmobileAltaという名前で、デフォルト・バージョンはそのスキンの最新バージョンです。詳細は、第4.12項「モバイル・アプリケーションのスキニング」を参照してください。

6.6.3 スキニング用のCSS IDセレクタの使用に関する必知事項

MAF AMXでは、スキニング要素でのCSS IDセレクタの使用はサポートしていません。その結果、次のようなマークアップによって、AMXページ遷移が粗くなります。

#tb1 {
position:absolute;
overflow:hidden;
width: 300px;
background-color: rgb(90,148,0);
}

この状況の理由は、AMXページ間で遷移が発生すると、同時に画面上で2つのページがレンダリングされるということです。したがって、IDの衝突を防止するために、遷移の直前に、遷移の発生元ページからすべてのIDが削除されます。

CSS IDセレクタを使用するかわりに、クラス名を使用する必要があります。例6-117は、MAF AMXページで定義されているMAF AMX UIコンポーネント(styleClass属性は特定のカスタム・クラスに設定されている)を示しています。例6-118は、スキニング用のカスタム・クラスの作成方法を示しています。

例6-117 カスタム・クラスへのstyleClass属性の設定

<amx:panelPage styleClass="MySpecialClassName"/>

例6-118 CSSでのカスタム・クラスの使用

.MySpecialClassName {
height: 420px;
}

6.6.4 データ視覚化コンポーネントのスタイル設定方法

MAF AMXデータ視覚化コンポーネントのスタイル・プロパティの大部分は、cssディレクトリにあるdvtm.cssファイルで定義されます。アプリケーション機能レベルでのカスタム・スタイル定義を持つカスタムCSSファイルを追加することでデフォルト値をオーバーライドできます(第4.12.8章「デフォルト・スキン・スタイルのオーバーライド」を参照)。

スタイル・プロパティのいくつかは、CSSにマップできないため、カスタムJavaScriptファイルで定義する必要があります。それらのプロパティは、次のとおりです。

- ダイアル・ゲージ・コンポーネントの背景および針のイメージ(第6.5.14章「ダイアル・ゲージの作成方法」を参照)。

- 時系列コンポーネントの継続時間バーのカラー・パレット(第6.5.22項「時系列コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのベース・マップ(第6.5.18.5項「カスタム・ベース・マップの定義」を参照)。

- 地理マップ・コンポーネントのスタイル・プロパティ(第6.5.17項「地理マップ・コンポーネントの作成方法」を参照)。

- テーマ・マップ・コンポーネントのスタイル・プロパティ(第6.5.18.7項「テーマ・マップ・コンポーネントへのカスタム・スタイルの適用」を参照)。

- 評価ゲージ・コンポーネントのselectedおよびunselected状態(第6.5.15.1項「評価ゲージ・コンポーネントへのカスタム・スタイルの適用」を参照)。

「包含」セクションでこれらのカスタムJavaScriptファイルをアプリケーション機能レベルで指定する必要があります(第4.10.1章「アプリケーション・コンテンツの定義方法」を参照)。それによって、XMLスタイル・テンプレートで定義したデフォルト・スタイル値をオーバーライドします。例6-119は、CSSを使用してスタイル設定できないプロパティのカスタム・スタイル設定を必要とするデータ視覚化コンポーネントを持つMAF AMXアプリケーション機能を含むMAFプロジェクトに追加する場合のようなJavaScriptファイルを示しています。

例6-119 カスタム・スタイル・プロパティの定義

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ファイルを定義した後、任意の値をコメント解除および変更できます。例6-120が示すように、maf-feature.xmlファイルに含める機能としてこのファイルを追加します。

例6-120 アプリケーション機能でのカスタム・スタイル・ファイルのインクルード

<?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>

6.7 UIコンポーネントのローカライズ

MAF AMXページで、JDeveloperによって提供される標準リソース・バンドルを使用することで、UIコンポーネントによって表示されるテキストをローカライズできます。これを行うには、コンポーネントおよびそのテキスト表示プロパティのうちローカライズする値を持つものを1つ選択し、「プロパティ」ウィンドウの該当するボックスで「テキスト・リソースの選択」を選択します(図6-110を参照)。

図6-110 テキスト・リソースの選択

これによって図6-111に示す標準の「テキスト・リソースの選択」ダイアログが表示されます。このダイアログを使用して、変更するプロパティの文字列参照を入力または検索します。

図6-111 「テキスト・リソースの選択」ダイアログ

ローカライズ済文字列リソースを定義すると、その参照のELが「テキスト・リソースの選択」ダイアログの起動元のプロパティに自動的に入力されます。XLIFF (XML Localization Interchange File Format)ファイルが存在しない場合は、このファイルが作成されます。存在する場合は、既存のXLIFFファイルに新しいエントリが追加されます。さらに、対応するバンドルのロード(loadBundle)コンポーネントが、ViewControllerBundle.xlfファイル(デフォルト名ですが、基本的にはプロジェクトの名前に一致します)を指す表示コンポーネントの子として作成されます。

注意:

ViewControllerBundle.xlfはデフォルト・ファイル名です。この名前はプロジェクトの名前と一致します。

図6-112は、MAF AMXファイルの変更を示しています。

図6-112 MAF AMXファイル内のローカライズ済文字列

詳細は、第4.11.1項「リソース・バンドルの使用」を参照してください。

6.8 MAFのアクセシビリティのサポートの理解

MAFアプリケーションを開発する際は、アクセシビリティの問題に対処することで視覚的および身体的に障害があるユーザーに対応する必要があります。非視覚的なメディアへのレンダリングを行うWebブラウザなどのユーザー・エージェント(スクリーン・リーダーなど)により、UIコンポーネントのテキスト説明が読み上げられ、障害を持つユーザーに有益な情報が提供されます。MAF AMX UIおよびデータ視覚化コンポーネントは、次のアクセシビリティ標準に準拠するように設計されています。

- Accessible Rich Internet Applications (WAI-ARIA) 1.0仕様。
詳細は、次を参照してください。

- WAI-ARIA 1.0仕様の「Introduction」(http://www.w3.org/TR/wai-aria/introduction)

- 「Using WAI-ARIA」(http://www.w3.org/TR/wai-aria/usage)

- 第6.8.2項「基本的なWAI-ARIA用語に関する必知事項」

- Oracle Global HTML Accessibility Guidelines (OGHAG)。
詳細は、第6.8.3項「Oracle Global HTML Accessibility Guidelinesに関する必知事項」を参照してください。

- iOSのアクセシビリティ・ガイドライン。
詳細は、『Accessibility Programming Guide for iOS』を参照してください。

そのようなコンポーネントの導入によって、アクセス可能なコンポーネントの外観の変更されたり、アプリケーション・ロジックが影響受けることがありません。

MAF AMXアプリケーション機能のアクセシビリティが適切に機能するようにするには、次のガイドラインに従ってください。

- ナビゲーションの深さは3レベル以内にして、ユーザーが簡単にホーム画面に戻れるようにする必要があります。

- スクリプトを最小限に維持します。

- DOMとの直接対話を提供しないでください。

- JavaScriptのタイムアウトは使用しないでください。

- フォーカスの不要な変更は回避します。

- ポップアップ・トリガーを明示的に指定する

- 必要に応じて、WAI-ARIAライブ・リージョンを利用します(第6.8.2項「基本的なWAI-ARIA用語に関する必知事項」を参照)。

- CSSの使用を最小限に維持します。

- デフォルト・コンポーネントの外観をオーバーライドしないようにしてください。

- 拡大縮小が可能なサイズ単位を選択します。

- CSSの位置設定は使用しないでください。

詳細は、次を参照してください。

- 『Mobile Accessibility』(http://www.w3.org/WAI/mobile)

- 『Web Content Accessibility and Mobile Web: Making a Web Site Accessible Both for People with Disabilities and for Mobile Devices』(http://www.w3.org/WAI/mobile)

6.8.1 アクセシビリティのためのUIおよびデータ視覚化コンポーネントの構成方法

MAF AMX UIおよびデータ視覚化コンポーネントには、組込みのアクセシビリティ・サポートが備えられており、ほとんどのコンポーネントがアクセシビリティ監査の対象となっています(図6-115を参照)。

表6-10には、「プロパティ」ウィンドウの「アクセシビリティ」セクションで設定できるコンポーネントとそれらの属性がリストされています。

表6-10 構成可能なアクセシビリティ属性を持つUIコンポーネント

コンポーネント

アクセシビリティ属性

アクセシビリティ監査メッセージ

ボタン(commandButton)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

選択ボタン(selectOneButton)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リンク(commandLink)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リンク(実行) (goLink)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

カルーセル(carousel)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

カルーセル・アイテム(carouselItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リスト・アイテム(listItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ポップアップ(popup)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

イメージ(image)

短い説明(shortDesc)

shortDesc属性を指定する必要があります。イメージが装飾目的で使用されている場合、それを空にすることができます。

入力テキスト(inputText)

ヒント・テキスト(hintText)

hintText属性が存在し、フィールドに何が含まれているのかを説明する必要があります。

パネル・グループ・レイアウト(panelGroupLayout)

ランドマーク(landmark)

NA脚注 1

デッキ(deck)

ランドマーク(landmark)

NA (脚注1を参照)

表のレイアウト(tableLayout)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

セル・フォーマット(cellFormat)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

フィルム・ストリップ(filmStrip)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

フィルム・ストリップ・アイテム(filmStripItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

面グラフ(areaChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

棒グラフ(barChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

バブル・チャート(bubbleChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

コンボ・チャート(comboChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

線グラフ(lineChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

散布図(scatterChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

スパーク・チャート(sparkChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

円グラフ(pieChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

NBoxノード(nBoxNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照オブジェクト(referenceObject)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照面(referenceArea)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

参照線(referenceLine)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

チャートのデータ・アイテム(chartDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

円グラフのデータ・アイテム(pieDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ファンネル・データ・アイテム(funnelDataItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

面(area)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

マーカー(marker)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ツリーマップ・ノード(treemapNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

サンバースト・ノード(sunburstNode)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

LEDゲージ(ledGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ステータス・メーター・ゲージ(statusMeterGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ダイアル・ゲージ(dialGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

評価ゲージ(ratingGauge)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

地理マップ(geographicMap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

テーマ・マップ(thematicMap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ファンネル・チャート(funnelChart)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

NBox (nBox)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

サンバースト(sunburst)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

時系列(timeline)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ツリーマップ(treemap)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

脚注 1 ランドマーク属性にはデフォルト値(none)があり、アクセシビリティ監査の対象ではありません。

shortDesc属性は、コンポーネントごとに異なる目的で使用します。たとえば、イメージ・コンポーネントにshortDesc属性を設定すると、MAF AMXファイルでそれはimage要素のalt属性の値として表示されます。

shortDesc属性の値はローカライズできます。

パネル・グループ・レイアウトおよびデッキ・コンポーネントの場合、ページのコンテキストに従って適用可能なランドマーク・ロール・タイプ(表6-15「ランドマーク・ロール」を参照)を定義します。landmark属性に次の値の1つを設定できます。

- デフォルト(なし)

- application

- banner

- complementary

- contentinfo

- form

- main

- navigation

- search

表6-11は、WAI-ARIA仕様によって定義されるそのアクセシビリティ属性が実行時に自動的に適用され、変更できないUIコンポーネントを示しています。

表6-11 静的アクセシビリティ属性を持つUIコンポーネント

コンポーネント

アクセシビリティ属性

アクセシビリティ監査メッセージ

入力日(inputDate)

ラベル(label)

inputDateはラベルが付きません。inputDateのラベル属性は指定する必要があります。

入力数値スライダ(inputNumberSlider)

ラベル(label)

inputNumberSliderはラベルが付きません。inputNumberSliderのラベル属性は指定する必要があります。

パネル・ラベルおよびメッセージ(panelLabelAndMessage)

ラベル(label)

panelLabelAndMessageはラベルが付きません。panelLabelAndMessageのラベル属性は指定する必要があります。

アイテムの選択(selectItem)

ラベル(label)

selectItemはラベルが付きません。selectItemのラベル属性は指定する必要があります。

チェックボックス(selectBooleanCheckbox)

ラベル(label)

selectBooleanCheckboxはラベルが付きません。selectBooleanCheckboxのラベル属性は指定する必要があります。

ブール・スイッチ(selectBooleanSwitch)

ラベル(label)

selectBooleanSwitchはラベルが付きません。selectBooleanSwitchのラベル属性は指定する必要があります。

ラジオ・ボタン(selectOneRadio)

ラベル(label)

selectOneRadioはラベルが付きません。selectOneRadioのラベル属性は指定する必要があります。

チェックボックスを複数選択(selectManyCheckbox)

ラベル(label)

selectManyCheckboxはラベルが付きません。selectManyCheckboxのラベル属性は指定する必要があります。

選択肢を複数選択(selectManyChoice)

ラベル(label)

selectManyChoiceはラベルが付きません。selectManyChoiceのラベル属性は指定する必要があります。

選択肢(selectOneChoice)

ラベル(label)

selectOneChoiceはラベルが付きません。selectOneChoiceのラベル属性は指定する必要があります。

出力テキスト(outputText)

値(value)

NA脚注 1

脚注 1 値属性はアクセシビリティ監査の対象外です。

JDeveloperの「プリファレンス」ダイアログを使用して次のようにアクセシビリティ監査ルールを構成できます。

1. (Windowsコンピュータ上の) JDeveloperで、メイン・メニューから「ツール」→「プリファレンス」を選択します。

2. プリファレンスのリストから、「監査」を選択します(図6-113を参照)。

3. 図6-113に示す「監査」ペインで、「プロファイルの管理」をクリックして「監査プロファイル」ダイアログを開きます。

図6-113 アクセシビリティ監査ルールの設定

4. 図6-114に示す「監査プロファイル」ダイアログで、ルールのツリーから「モバイル・アプリケーション・フレームワーク」ノードを展開し、次に「アクセシビリティ」を展開します。

図6-114 「監査プロファイル」ダイアログ

5. 図6-114に示すように、アクセシビリティ監査ルールを選択し、アプリケーションに適用します。

図6-115は、JDeveloperに表示されるアクセシビリティ監査警告を示しています。

図6-115 アクセシビリティ監査警告

アクセス可能なMAF AMXアプリケーション機能をテストする方法の詳細は、第22.2.1項「iOSデバイス上でアクセシビリティのテストを実行する方法」を参照してください。

注意:

Androidでは、WAI-ARIAアクセシビリティ機能はデータ視覚化コンポーネントに対してサポートされません。

その他のMAF AMX UIコンポーネントは、アプリケーションがAndroidスクリーン・リーダー・モードで実行された場合、正しく動作しない可能性があります。

6.8.2 基本的なWAI-ARIA用語に関する必知事項

WAI-ARIA 1.0仕様に述べられているように、複雑なWebアプリケーションは、支援テクノロジがドキュメントの部分の背後にあるセマンティクスを判別できない場合や、ユーザーが、使用可能な方法で実際にそのすべての部分を移動できない場合に、アクセス不可能になります。WAI-ARIAでは、セマンティクスがロール(ユーザー・インタフェース要素を定義するタイプ)と、ロールによってサポートされている状態およびプロパティに分割されています。次のセマンティクス・アソシエーションによって、WAI-ARIA用語の基礎が形成されています。

- ロール

- ランドマーク

- ライブ・リージョン

詳細は、『Important Terms』(http://www.w3.org/TR/wai-aria/terms)を参照してください。

次の表には、MAFに適用可能なロールのカテゴリ(WAI-ARIA 1.0仕様での定義)がリストされています。

表6-12は、全般的なロール概念を定義する目的でWAI-ARIAのロールの分類をサポートするために使用される抽象ロールを示しています。

表6-12 抽象ロール

抽象ロール

説明

input

ユーザー入力を可能にする一般的なタイプのウィジェット。

landmark

ナビゲーショナル・ランドマークを意図したページのリージョン。

select

ユーザーが一連の選択肢から選択を行えるフォーム・ウィジェット。

widget

グラフィカル・ユーザー・インタフェースのインタラクティブ・コンポーネント。

表6-13は、スタンドアロン・ユーザー・インタフェース・ウィジェットまたは大きい複合ウィジェットの一部として機能するウィジェット・ロールを示しています。

表6-13 ウィジェット・ロール

ウィジェット・ロール

説明

ウィジェットで必要とされるステート

alertdialog

アラート・メッセージを含むダイアログのタイプ。最初のフォーカスはそのダイアログ内の要素に移動します。

aria-labelledby、aria-describedby

button

クリックまたは押されたときにユーザーによってトリガーされるアクションを可能にする入力。

aria-expanded (ステート)、aria-pressed (ステート)

checkbox

true、falseまたはmixedの3つの使用可能な値を持つチェック可能な入力。

aria-checked (ステート)

dialog

応答を要求するためにアプリケーションの現在の処理を中断するように設計されているアプリケーション・ウィンドウによって表されるダイアログ。

aria-labelledby、aria-describedby

link

内部または外部リソースへのインタラクティブな参照。アクティブ化されるとユーザー・エージェントがそのリソースにナビゲートします。

aria-disabled (ステート)、aria-describedby

option

選択リスト内の選択可能アイテム。

aria-labelledby、aria-checked (ステート)、aria-selected (ステート)

radio

ラジオ・ロールのグループ内のチェック可能入力。同時にチェックできるのはそれらのうち1つのみです。

aria-checked (ステート)、aria-disabled (ステート)

slider

指定された範囲内からユーザーが値を選択するユーザー入力。

aria-valuemax、aria-valuemin、aria-valuenow、aria-disabled (ステート)

listbox

選択肢のリストからユーザーが1つ以上のアイテムを選択できるウィジェット。

aria-live

radiogroup

ラジオ・ボタンのグループ。

aria-disabled (ステート)

listitem

リストまたはディレクトリ内の単一アイテム。

aria-describedby

textbox

その値として自由形式のテキストを使用できる入力。

aria-labelledby、aria-readonly、aria-required、aria-multiline、aria-disabled (ステート)

表6-14は、ページ内のコンテンツを編成する構造を記述するドキュメント構造ロールを示しています。通常、ドキュメント構造はインタラクティブではありません。

表6-14 ドキュメント構造ロール

ドキュメント構造ロール

説明

img

イメージを形成する要素のコレクションのコンテナ。

list

非インタラクティブ・リスト・アイテムのグループ。

listitem

リストまたはディレクトリ内の単一アイテム。

表6-15は、ナビゲーショナル・ランドマークを意図したページのリージョンを表すランドマーク・ロールを示しています。

表6-15 ランドマーク・ロール

ランドマーク・ロール

説明

application

Webアプリケーション(Webドキュメントではなく)として宣言されるリージョン.

banner

ほとんどサイト指向のコンテンツ(ページ固有のコンテンツではなく)を含むリージョン。

complementary

DOM階層の類似したレベルにあるメイン・コンテンツを補足するように設計ているが、メイン・コンテンツから切り離しても意味を持つドキュメントのサポート・セクション。

contentinfo

親ドキュメントに関する情報が含まれている大きな認識可能なリージョン。

form

全体として結合されてフォームを作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

main

ドキュメントのメイン・コンテンツ。

navigation

ドキュメントまたは関連ドキュメントをナビゲートするためのナビゲーショナル要素(通常はリンク)のコレクション。

search

全体として結合されて検索機能を作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

MAF UIコンポーネントの大部分では、アクセス可能なWAI-ARIA属性は変更できません。いくつかのコンポーネントでは、デザインタイムに特別なアクセス可能な属性を設定できます。また、パネル・グループ・レイアウトおよびデッキには、WAI-ARIAランドマーク・ロール・タイプを使用できます。詳細は、第6.8.1項「アクセシビリティのためのUIおよびデータ視覚化コンポーネントの構成方法」を参照してください。

6.8.3 Oracle Global HTML Accessibility Guidelinesに関する必知事項

Oracle Global HTML Accessibility Guidelines (OGHAG)は、オラクル社が準拠しているHTMLの一連のスクリプト標準です。これらの標準は、Section 508 (http://www.section508.govを参照)とWeb Content Accessibility Guidelines (WCAG) 1.0 level AA (http://www.w3.org/TR/WCAG10を参照)を組み合せ、言い回しとチェックポイントの測定を改善したものです。

詳細は、http://www.oracle.com/us/corporate/accessibility/policies/index.htmlのOracleのアクセシビリティについての考え方とポリシーを参照してください。

6.9 入力の検証

MAFでは、データ入力エラーおよびデータ入力中に発生するその他の状態に関して、エンド・ユーザーに通知できます。それらのタイプ(エラーまたは警告)に応じて、検証メッセージのルック・アンド・フィールが異なります。

ユーザー入力の検証は、入力が送信されたときにトリガーされます。入力テキスト・コンポーネントは、エンド・ユーザーがフィールドから離れたときに自動的に検証されます。チェックボックスや選択肢などの選択コンポーネントの場合は、エンド・ユーザー選択を行ったときに検証が行われます。検証のために、MAF AMXページのUIコンポーネントは、検証グループ操作(validationGroup)内にまとめられ、送信操作が実行されたときに入力が検証されるコンポーネントが定義されます。検証動作(validationBehavior)コンポーネントは、コマンド・コンポーネントのアクションが実行される前にどの検証グループが検証されるのかを定義します。1つのコマンド・コンポーネントが、複数の子検証動作コンポーネントを持つことができます。コンポーネントに検証動作が定義されていない場合、検証は行われません。

注意:

ネストされた検証グループ操作を定義することはできません。

検証グループの無効な定義は次のとおりです。

<amx:view>
<amx:panelPage>
<amx:validationGroup>
<amx:panelGroupLayout>
<amx:validationGroup/>
<amx:panelGroupLayout/>
</amx:validationGroup>
</amx:panelPage>
</amx:view>

有効な定義は次のとおりです。

<amx:view>
<amx:panelPage>
<amx:validationGroup>
</amx:panelPage>
<amx:popup>
<amx:validationGroup>
</amx:popup>
</amx:view>

MAF AMXページに検証エラー・メッセージが含まれている場合、リスト・アイテム、リンクおよびボタンなどのコマンド・コンポーネントを使用して、エンド・ユーザーがそのページから移動できないようにすることができます。警告を含むメッセージでは、ナビゲーションが停止されることはありません。

例6-121は、MAF AMXファイルでの複数の検証グループおよび検証動作操作など検証要素の定義方法を示しています。

例6-121 入力の検証の定義

<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>

例6-122は、MAF AMXファイルでのポップアップに表示される検証メッセージの定義方法を示しています。

例6-122 ポップアップ・メッセージを含む入力の検証の定義

<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>

検証メッセージはポップアップ・コンポーネントに表示されます(第6.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。検証ポップアップのタイトルを構成することはできません。それは、相対的なメッセージ重大度によって自動的に決定されます。現在のメッセージのうちの最も重大なものが検証ポップアップのタイトルになります。つまり、すべての検証メッセージがWARNINGタイプである場合は、そのタイトルは「警告」になります。メッセージのいくつかがWARNINGタイプで、その他はERRORタイプの場合はタイトルは「エラー」に設定されます。

図6-116は、実行時に生成されるポップアップ検証メッセージを示しています。

図6-116 iPhoneでの検証メッセージ

6.10 イベント・リスナーの使用方法

MAF AMXページからJavaコードを呼び出し、アプリケーション・ロジックを実行するには、次のいずれかの方法でUIコンポーネントの属性としてリスナーを定義します。

- MAF AMXファイルのソースでの手動による方法。

- 選択したコンポーネントの「プロパティ」から。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

次のリスナーを使用して、MAF AMXページにUIトリガー・イベントの検出機能を追加できます。

- valueChangeListener: 次のパラメータで作成されるValueChangeEventをリスニングします。

- 古い値を表すjava.lang.Object

- 新しい変更済の値を表すjava.lang.Object

- actionListener: パラメータなしで作成されるActionEventをリスニングします。

- selectionListener: 次のパラメータで作成されるSelectionEventをリスニングします。

- 古い行キーを表すjava.lang.Object

- 選択済行キーを表すjava.lang.String[]

- moveListener: 古い行キーを表すRowKeyタイプの次のパラメータで作成されるMoveEventをリスニングします。

- 移動済行キーを表すjava.lang.Object

- 移動済行キーがその前に挿入された行キーを表すjava.lang.String[]

- rangeChangeListener: パラメータなしで作成されるRangeChangeEventをリスニングします。

- mapBoundsChangeListener: 次のパラメータで作成されるMapBoundsChangeEventをリスニングします。

- 最小マップ境界のX座標(緯度)を表すjava.lang.Object

- 最小マップ境界のY座標(経度)を表すjava.lang.Object

- 最大マップ境界のX座標(緯度)を表すjava.lang.Object

- 最大マップ境界のY座標(経度)を表すjava.lang.Object

- マップ中心のX座標(緯度)を表すjava.lang.Object

- マップ中心のY座標(経度)を表すjava.lang.Object

- 現在のズーム・レベルを表すint

- mapInputListener: 次のパラメータで作成されるMapInputEventをリスニングします。

- イベント・タイプを表すjava.lang.String

- イベント・ポイントのX座標を表すjava.lang.Object

- イベント・ポイントのY座標を表すjava.lang.Object

- viewportChangeListener: 次のパラメータで作成されるViewportChangeEventをリスニングします。

- 最小X座標を表すjava.lang.Object

- 最大X座標を表すjava.lang.Object

- 最小Y座標を表すjava.lang.Object

- 最大Y座標を表すjava.lang.Object

- 最初の表示可能グループを表すjava.lang.Object

- 最後の表示可能グループを表すjava.lang.Object

リスナーの値は、パターン#{*}に一致している必要があり、次の要件を満たしている必要があります。

- タイプ名: EL式

- ベース・タイプ: 文字列

- プリミティブ・タイプ: 文字列

ELイベントの詳細は、第7.3.6項「ELイベントについて」を参照してください。

大部分のMAF AMXイベント・クラスは、oracle.adfmf.amx.event.AMXEventクラスの拡張です。Javaコードでイベント・リスナーを定義するときは、oracle.adfmf.amx.event.AMXEventクラスを渡す必要があります。

詳細は、次を参照してください。

- Oracle Mobile Application Framework Oracle Fusion Middleware Java APIリファレンス

- Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンス

- 第12.2.2項「AmxEventクラスの使用方法」

MAFでは、マネージドBeanメソッドがMAF AMX固有のイベント・クラスを使用するように、リスナーに対してマネージドBeanメソッドを作成できます。例6-123、例6-124および例6-125は、同じマネージドBeanメソッドをコールするボタンおよびリンク・コンポーネントを示しています。AMXEventのソース値は、コンポーネントのIDを含むメッセージ・ボックスを表示することでどのオブジェクトがイベントを起動したのかを判別します。

例6-123 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>

例6-124 AMXEventの使用

private void actionListenerMethod(AMXEvent amxEvent) {
// Some Java handling
}

例6-125 イベント・メソッドの呼出し

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からリスナーをコールする方法を示しています。

6.10.1 イベント・リスナーの制約付きタイプ属性に関する必知事項

イベント・リスナーは、いくつかのMAF AMX UIコンポーネントの子として定義できます。リスナーのtype属性によって、それらがどのイベントを処理するために登録されるのかが識別されます。各親UIコンポーネントでは(親コンポーネントに適した)イベントのサブセットのみがサポートされているため、これらのサポートされているイベントは、リスナーに対して選択できる限られたタイプのリストに提示されます。

表6-16は、親UIコンポーネント、それが子として持つことができるイベント・リスナー、およびそれらがサポートしているイベント・タイプを示しています。

表6-16 サポートされているイベント・リスナーとイベント・タイプ

UIコンポーネント(親)

アクション・リスナー(子)

プロパティ・リスナーの設定(子)

ポップアップ表示動作(子)

ポップアップを閉じる動作(子)

検証動作(子)

actionListener (属性)

valueChangeListener (属性)

moveListener (属性)

selectionListener (属性)

mapBoundsChangeListener (属性)

mapInputListener (属性)

viewportChangeListener (属性)

rangeChangeListener (属性)

ボタン

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

リンク

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

リスト・アイテム

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

入力日

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

入力数値スライダ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

入力テキスト

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

リスト・ビュー

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

サポート

チェックボックス

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

スイッチ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

チェックボックス(複数選択)

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

選択肢(複数選択)

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

選択肢

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

選択ボタン

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ラジオ・ボタン

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

リンク(実行)

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

カルーセル

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

カルーセル・アイテム

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

イメージ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

フィルム・ストリップ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

フィルム・ストリップ・アイテム

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

面グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

棒グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

バブル・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

コンボ・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

線グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

サポート

未サポート

円グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

円グラフのデータ・アイテム

未サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

散布図

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

スパーク・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ファンネル・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

ファンネル・データ・アイテム

未サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

チャートのデータ・アイテム

未サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

系列スタイル

未サポート

サポート

サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

LEDゲージ

未サポート

未サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ダイアル・ゲージ

未サポート

未サポート

サポート

サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

評価ゲージ

未サポート

未サポート

サポート

サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ステータス・メーター・ゲージ

未サポート

未サポート

サポート

サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

地理マップ

未サポート

サポート済脚注 1

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート済脚注 2

サポート

サポート

未サポート

未サポート

テーマ・マップ

未サポート

サポート済脚注 3

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート済脚注 4

未サポート

未サポート

未サポート

未サポート

面

未サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

マーカー

未サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

面データ・レイヤー

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

ポイント・データ・レイヤー

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

サンバースト

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

ツリーマップ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

時系列

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

時系列の系列

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

時系列アイテム

未サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

NBox

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

未サポート

未サポート

脚注 1 プロパティ・リスナーの設定は、地理マップの領域のマーカーの子として指定できます。

脚注 2 selectionListener属性は、地理マップの面データ・レイヤーまたは点データ・レイヤーに設定できます。

脚注 3 プロパティ・リスナーの設定は、テーマ・マップの領域のマーカーの子として指定できます。

脚注 4 selectionListener属性は、テーマ・マップの面データ・レイヤーまたは点データ・レイヤーに設定できます。

子イベント・リスナーそれぞれのtype属性(図6-117を参照)には、リスナー・イベントと一致する値の基本セットがあります。これらの値は表6-16に示す情報に基づいてフィルタ処理され、それによって、子イベント・リスナーが、識別された親UIコンポーネントのコンテキスト内にある場合に、その親によってサポートされているイベントのみが表示されるようになります。たとえば、ボタン・コンポーネントの下にあるアクション・リスナーまたはプロパティ・リスナーの設定の子では、actionタイプの値およびジェスチャーのみか表示されます。

図6-117は、親リスト・アイテム・コンポーネントのプロパティ・リスナーの設定のかぎられたタイプ・リストにおいて使用可能な値を示しています。

図6-117 イベント・タイプの選択

脚注の説明

脚注 1:  詳細は、第6.3.26.1項「disabled属性に関する必知事項」を参照してください。

7 バインディングの使用とデータ・コントロールの作成

この章では、モバイル・アプリケーション・フレームワーク(MAF)でデータ・バインディング、データ・コントロールおよびデータ・バインディング式言語(EL)を使用する方法について説明します。また、オブジェクト・スコープ・ライフサイクル、マネージドBean、UIヒント、検証およびデータ変更イベントについても説明します。

この章の内容は次のとおりです。

- 第7.1項「バインディングおよびデータ・コントロールの概要」

- 第7.2項「オブジェクト・スコープ・ライフサイクルについて」

- 第7.3項「EL式の作成」

- 第7.4項「マネージドBeanの作成と使用」

- 第7.5項「データ・コントロールを使用したビジネス・サービスの公開」

- 第7.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」

- 第7.7項「実行時に行われる処理: バインディング・コンテキストの動作方法」

- 第7.8項「データ・コントロールの構成」

- 第7.9項「属性の使用」

- 第7.10項「Beanデータ・コントロールの作成および使用」

- 第7.11項「DeviceFeaturesデータ・コントロールの使用方法」

- 第7.12項「属性の検証」

- 第7.13項「データ変更イベントについて」

7.1バインディングおよびデータ・コントロールの概要

モバイル・アプリケーション・フレームワークによって、ユーザー・インタフェース(UI)・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロールと宣言的バインディング)が実装されています。データ・コントロールでは、関連するプロパティ、メソッド、タイプの情報を含め、サービスの操作とデータ・コレクションを表す標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化します。JDeveloperを使用すると、その情報をアイコンとして表示し、ページ上にドラッグ・アンド・ドロップできます。宣言的なバインディングによって、データ・コントロール内のデータ・コレクションからのデータ・アクセスとその操作の実行の詳細が抽象化されます。実行時に、モデル・レイヤーによって、適切なXMLファイルからデータ・コントロールおよびバインディングを記述した情報が読み取られ、ユーザー・インタフェースとビジネス・サービスの双方向の結合が実装されます。

ページのユーザー・インタフェース・コンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。モデル・レイヤーでは実行時にこのファイルが使用され、ページのバインディングがインスタンス化されます。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持され、EL式#{bindings}を使用して各ページ・リクエスト中にアクセスできます。この式により、現在のページのバインディング・コンテナが常に評価されます。「データ・コントロール」パネルから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインドされたユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。

モバイル・アプリケーション・フレームワークには、即時利用可能な2つのデータ・コントロール(DeviceFeaturesデータ・コントロールとApplicationFeaturesデータ・コントロール)が用意されています。JDeveloperの「データ・コントロール」パネル内に表示されるDeviceFeaturesデータ・コントロールを使用すると、データ・コントロールの主なデータ属性を(テキスト)フィールドとして、またデータ・コントロールの操作をコマンド・オブジェクト(ボタン)として、アプリケーションにドラッグ・アンド・ドロップできます。これらのドラッグ・アンド・ドロップ・アクションによって、アプリケーション内のELバインディングおよび作成されるコントロールに適したプロパティが生成されます。バインディングは、データ・コントロール・ソースを指すために、DataControls.dcxファイルによって表され、ページ・バインディングによって、特定のページの参照がデータ・コントロールにリンクされます。ApplicationFeaturesデータ・コントロールの詳細は、第4.5.5項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

データ・コントロールおよびバインディングの詳細は、次を参照してください。

- 第7.5項「データ・コントロールを使用したビジネス・サービスの公開」

- 第7.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」

- 第7.7項「実行時に行われる処理: バインディング・コンテキストの動作方法」

- 第7.8項「データ・コントロールの構成」

- 第7.9項「属性の使用」

- 第7.10項「Beanデータ・コントロールの作成および使用」

- 第7.11項「DeviceFeaturesデータ・コントロールの使用方法」

7.2 オブジェクト・スコープ・ライフサイクルについて

実行時、ページがデータにアクセスできるオブジェクト・スコープに必要なデータを格納することで、データをページに渡します。スコープによってオブジェクトの存続期間が決まります。オブジェクトをスコープに置くと、EL式を使用してスコープからアクセスできます。たとえば、fooという名前のマネージドBeanを作成し、Beanをビュー・スコープに存続させるよう定義するとします。このBeanにアクセスするには、#{viewScope.foo}という式を使用します。

モバイル・アプリケーション・フレームワーク変数とマネージドBean参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。MAFは、次のスコープ(可視性が高い順に表示)をサポートしています。

- アプリケーション・スコープ: オブジェクトは、アプリケーションが存続するかぎり(複数の機能にまたがって)使用可能です。

- ページ・フロー・スコープ: オブジェクトは、機能が存続するかぎり(その機能内でのみ)使用可能です。

- ビュー・スコープ: オブジェクトは、ビューが存続するかぎり(機能の単一ページ内で)使用可能です。

オブジェクト・スコープは、プログラミング言語のグローバル変数およびローカル変数のスコープに相当します。スコープが広いほど、オブジェクトの可用性が高くなります。存続期間の間、これらのオブジェクトで特定のインタフェースの公開、情報の保持および他のオブジェクトへの変数とパラメータの受渡しを行うことができます。たとえば、アプリケーション・スコープに定義されているマネージドBeanは、アプリケーションが存続するかぎり、複数のページ・リクエストの間使用できます。ただし、ビュー・スコープに定義されているマネージドBeanは、1つの機能で1つのページ・リクエストの間のみ使用できます。

アプリケーション・スコープの名前空間で定義されたEL式は、アプリケーションが存続するかぎり、複数の機能にまたがって使用できます。アプリケーションの一方のビューでアプリケーション・スコープを定義し、そのスコープをもう一方のビューで参照できます。ページ・フロー・スコープの名前空間で定義されたEL式は、機能が存続するかぎり、単一の機能内で使用できます。ビュー・スコープの名前空間で定義されたEL式は、ビューが存続するかぎり、機能の単一ページ内で使用できます。このような変数を含むスコープに加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。詳細は、第7.3.5.2項「マネージドBeanカテゴリについて」および第7.3.5.3項「モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて」を参照してください。

マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。アプリケーション・スコープは、ユーザー情報やコンテキスト情報などのアプリケーション全体に関係する情報にのみ使用します。アプリケーション・スコープは、ページ間での値の受渡しには使用しないでください。

注意:

メモリー・スコープに配置するすべてのオブジェクトは、JSON DataChangeEventにシリアライズされ、このオブジェクト内のgetterメソッドによって返されるオブジェクトもシリアライズされます。これによって、シリアライズされたオブジェクト・ツリーが深くネストされることがあり、パフォーマンスが低下します。一連のネストされたオブジェクトをシリアライズしないようにするには、それらを一時オブジェクトとして定義する必要があります。詳細は、第7.10.1項「Beanクラス変数のシリアライズに関する必知事項」を参照してください。

7.2.1 オブジェクト・スコープとタスク・フローに関する必知事項

タスク・フロー内の変数にどのスコープを使用するかを決定するときは、ビュー・スコープまたはページ・フロー・スコープのみを使用する必要があります。アプリケーション・スコープは、タスク・フローの存続期間を超えてオブジェクトをメモリーに保存するため、タスク・フローのカプセル化および再利用で障害が発生します。さらに、アプリケーション・スコープでは、オブジェクトがメモリーに必要以上に長い時間保持されるため、不要なオーバーヘッドが発生します。

タスク・フロー内のアクティビティ間でデータ値を渡す必要がある場合は、ページ・フロー・スコープを使用する必要があります。現在のビュー・アクティビティ内でのみ必要とされ、ビュー・アクティビティ間にまたがっていない変数の場合、ビュー・スコープを使用する必要があります。

7.3 EL式の作成

EL式は、属性と実行時に決まるオブジェクト値をバインドするために、MAFアプリケーションで使用されます。たとえば、#{UserList.selectedUsers}は選択したユーザーのセットを参照でき、#{user.name}は特定のユーザー名を参照でき、#{user.role == 'manager'}はユーザーがマネージャかどうかを判断します。実行時、汎用式エバリュエータによって、これらの式に対してそれぞれList、Stringおよびbooleanの値が返され、コードなしで自動的に各オブジェクトとそのプロパティにアクセスします。

式は、値のレンダリングに必要になるまで評価されません。MAF AMXでは遅延評価のみがサポートされるため、即時構成式(${})を使用する式は解析を行いますが、その動作は遅延式(#{})と同じになります。実行時、特定のUIコンポーネント(inputTextコンポーネント、outputTextコンポーネントなど)の値は、そのvalue属性によって決まります。コンポーネントにはその値として静的テキストを割り当てることができますが、通常、value属性には、表示データを決定するために実行時インフラストラクチャにより評価されるEL式が含まれます。たとえば、現在ログイン中のユーザーの名前を表示するoutputTextコンポーネントには、value属性に#{UserInfo.name}という式を設定できます。コンポーネントの任意の属性(value属性だけでなく)にEL式を使用して値を割り当てることができるため、動的、かつデータ駆動型のユーザー・インタフェースの作成が容易になります。たとえば、UIコンポーネントのrendered属性に#{not empty UserList.selectedUsers}などのブール値の式を使用すると、表示するオブジェクト・セットが空のときにはそのコンポーネントを非表示にできます。UserListというオブジェクトの選択ユーザーのリストが空の場合、rendered属性はfalseと評価されるため、コンポーネントはページに表示されません。

通常のアプリケーションでは、UserListのようなオブジェクトはマネージドBeanとして作成します。ランタイムでは、EL式でBeanを最初に参照した際に、Beanのオンデマンドのインスタンス化が管理されます。値を表示する場合、ページを表示する際にランタイムでEL式が評価され、マネージドBeanから値を得て、コンポーネントにデータが移入されます。ユーザーがUIコンポーネントのデータを更新すると、同じEL式に基づいて、ランタイムで該当するマネージドBeanに値が戻されます。マネージドBeanの作成および使用の詳細は、第7.4項「マネージドBeanの作成および使用」を参照してください。EL式の詳細は、http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

注意:

EL式を編集可能コンポーネントのvalue属性に使用している場合は、そのコンポーネントに対応するsetメソッドが必要です。そうでないと、EL式は読取り専用と評価され、値の更新は許可されません。

たとえば、ページにinputTextコンポーネント(IDはit1)があり、その値が#{myBean.inputValue}に設定されているとします。inputText値を更新するには、myBeanマネージドBeanに次のようなgetメソッドとsetメソッドが必要です。

public void setIt1(RichInputText it1) {
this.it1 = it1;
}

public RichInputText getIt1() {
return it1;
}

7.3.1 データ・バインディングEL式について

「データ・コントロール」パネルを使用してコンポーネントを作成すると、MAFデータ・バインディング式が自動的に作成されます。この式は、バインディング・オブジェクトのデータを表示するか、バインディング・オブジェクトのプロパティを参照する、すべてのコンポーネント属性に追加されます。事前作成済のそれぞれの式は、ページ定義ファイルで定義された、適切なバインディング・オブジェクトを参照します。これらのバインディング式は編集可能ですが、MAFバインディング式の基本構文に従っていれば、独自に作成することもできます。MAFデータ・バインディング式は、属性がELをサポートする場合、バインディング・オブジェクトからのデータを移入する任意のコンポーネント属性に追加できます。

一般的なMAFデータ・バインディングEL式は、次の構文を使用して、バインディング・コンテナ内のタイプの異なるバインディング・オブジェクトを参照します。

#{bindings.BindingObject.propertyName}

ここでは、次のようになります。

- bindingsは、式によって参照されているバインディング・オブジェクトが現在のページのバインディング・コンテナにあることを識別する変数です。すべてのMAFデータ・バインディングEL式は、bindings変数で始まる必要があります。

- BindingObjectは、ページ定義ファイルで定義される、バインディング・オブジェクトのID、または属性については名前です。バインディングobjectIDまたは名前は、そのページ定義ファイル内で一意なものです。EL式は、パラメータ・バインディング、実行可能バインディングまたは値バインディングなど、ページ定義ファイル内のどのバインディング・オブジェクトでも参照できます。

- propertyNameは、各データバインドUIコンポーネントのデフォルトの表示方法を決定し、実行時のバインディング・オブジェクトのプロパティを設定する変数です。各タイプのバインディング・オブジェクトに対して、異なるバインディング・プロパティがあります。バインディング・プロパティの詳細は、第7.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

たとえば、次の式を例にしてみます。

#{bindings.ProductName.inputValue}

bindings変数は、現在のページのバインディング・コンテナでバインドされた値を参照します。参照されているバインディング・オブジェクトはProductNameであり、これは属性バインディング・オブジェクトです。バインディング・プロパティはinputValueで、最初のProductName属性の値を戻します。

ヒント:

ページ定義ファイルのバインディング式ではドル記号($)またはハッシュ記号(#)の接頭辞を使用できますが、MAFページのEL式で使用できるのは、ハッシュ記号(#)の接頭辞のみです。

前述のように、「データ・コントロール」パネルを使用してUIコンポーネントを作成する場合、これらの式が組み込まれます。ただし、必要に応じて手動で式を作成することもできます。JDeveloperの式ビルダーは、UIコンポーネントがバインドされるその他の有効なオブジェクトに加え、ページ定義ファイルに定義されたバインディング・オブジェクトのリストを提供することにより、EL式の構築を支援するダイアログです。また、MAFバインディング・オブジェクトの階層リストやMAFバインディング・オブジェクトの最も一般的に使用されるプロパティが提供されるため、MAFデータバインド式の作成や編集に特に便利です。バインディング・プロパティの詳細は、第7.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

7.3.2 EL式の作成方法

JDeveloperの式ビルダーを使用してEL式を宣言的に作成できます。「プロパティ」ウィンドウから「式ビルダー」にアクセスできます。

始める前に

EL式に関する知識が役立つ場合があります。詳細は、第7.3項「EL式の作成」を参照してください。

式ビルダーの使用手順:

1. 「プロパティ」ウィンドウで、変更する属性を見つけて、右端のドロップダウン・メニューを使用して「式ビルダー」を選択します。

2. 次の機能を使用して式を作成します。

- 「変数」ドロップダウンを使用して、式に含める項目を選択します。これらの項目は、階層形式のバインディング・オブジェクトであるツリーに表示されます。ツリーの各アイコンは、式で使用できる各種タイプのバインディング・オブジェクトを表します。
ツリーの絞り込みには、ドロップダウン・フィルタを使用するか、検索フィールドに検索条件を入力します。MAFで公開されているELでアクセス可能なオブジェクトは、「ADFマネージドBean」ノードの「モバイル・アプリケーション・フレームワーク・オブジェクト」ノードにあります。

ヒント:

これらのオブジェクトの詳細は、MAF Javadocを参照してください。第7.3.5項「式ビルダーのカテゴリについて」も参照してください。

ツリーで項目を選択すると、その項目がEL式内の「式」ボックスに移動されます。「式」ボックスに式を直接入力することもできます。

- 演算子ボタンを使用して、式に論理演算子または算術演算子を追加します。

図7-1は、「ADFマネージドBean」カテゴリからEL式を作成する方法の例を示しています。第7.3.5項「式ビルダーのカテゴリについて」で説明するカテゴリのいずれかからEL式を作成できます。

図7-1 「式ビルダー」ダイアログ

ヒント:

EL式を作成する正しい構文の使用の詳細は、http://download.oracle.com/javaee/index.htmlのJava EEチュートリアルを参照してください。

表7-1 式ビルダーのバインディング・ノードの下にあるアイコン

アイコン

説明

現在のページのバインディング・コンテナを参照する、bindingsコンテナ変数を示します。bindingsノードを開くと、現在のページのすべてのバインディング・オブジェクトが公開されます。

バインディング・コンテキスト全体を参照する、dataバインディング変数を示します(アプリケーション内の.cpxファイルから作成)。dataノードを開くと、アプリケーション内のページ定義ファイルが公開されます。

アクション・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なアクション・バインディング・プロパティのリストが公開されます。

イテレータ・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なイテレータ・バインディング・プロパティのリストが公開されます。

属性バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な属性バインディング・プロパティのリストが公開されます。

リスト・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効なリスト・バインディング・プロパティのリストが公開されます。

表バインディング・オブジェクトまたはツリー・バインディング・オブジェクトを表します。このアイコンを使用するノードを開くと、有効な表バインディング・プロパティおよびツリー・バインディング・プロパティのリストが公開されます。

MAFバインディング・オブジェクト・プロパティを表します。MAFプロパティの詳細は、第7.3.3項「MAFバインディング・プロパティに関する必知事項」を参照してください。

パラメータ・バインディング・オブジェクトを表します。

Beanクラスを表します。

メソッドを表します。

7.3.2.1 メソッド式ビルダーについて

表7-2は、「プロパティ」ウィンドウで「式ビルダー」オプションではなく「メソッド式ビルダー」オプションが提供されるプロパティを示しています。これらの唯一の違いは、メソッド式ビルダーが、選択されたプロパティに応じてマネージドBeanをフィルタして除外することです。

表7-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

7.3.2.2 非ELプロパティについて

表7-3は、ELに対応していないため「プロパティ」ウィンドウでEL式ビルダー・オプションが提供されないプロパティを示しています。

表7-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

7.3.3 MAFバインディング・プロパティに関する必知事項

式ビルダーを使用してデータバインドされたコンポーネントを作成すると、EL式によって、特定のMAFバインディング・プロパティが参照される場合があります。実行時には、これらのバインディング・プロパティによって、データバインドUIコンポーネントのデフォルトの表示方法や、イテレータ・バインディング固有のパラメータなどが定義されます。ADFバインディング・プロパティは、Oracle APIによって定義されます。各バインディング・タイプで使用可能なプロパティの完全なリストは、表7-4「MAFバインディングの実行時ELプロパティ」を参照してください。

特定のプロパティに割り当てられる値は、ページ定義ファイルで定義されます。たとえば、イテレータ・バインディングには、イテレータが一度に表示する行数を指定する、RangeSizeというプロパティがあります。例7-1のように、RangeSizeに割り当てられる値は、ページ定義ファイルで指定されます。

例7-1 RangeSizeプロパティを使用したイテレータ・バインディング・オブジェクト

<iterator Binds="ItemsForOrder" RangeSize="25"
DataControl="BackOfficeAppModuleDataControl"
id="ItemsForOrderIterator" ChangeEventPolicy="ppr"/>

7.3.4 バインディング・コンテナを参照する方法

ルートEL式#{bindings}で、アクティブな画面のバインディング・コンテナを参照できます。式#{data.PageDefName}で、別の画面のバインディング・コンテナを参照できます。モバイル・アプリケーション・フレームワークAMXバインディング・オブジェクトは、バインディング・コンテナ#{bindings.Name}から名前で参照されます。

表7-4は、実行時に、EL式でモバイル・アプリケーション・フレームワークAMXバインディング・オブジェクトの値にアクセスするために使用できるプロパティのリストの一部を示しています。プロパティは、アルファベット順に並んでいます。

表7-4 MAFバインディングの実行時ELプロパティ

実行時プロパティ

説明

イテレータ

アクション

属性値

ツリー

class

実行時バインディング用のJavaクラス・オブジェクトを戻します。

はい

はい

はい

はい

collectionModel

データのコレクションを公開します。collectionModelにバインドされているコンポーネント内で使用するEL式は、コレクションの各要素の式を解決するrow変数脚注 1 を使用して参照できます。

いいえ

いいえ

いいえ

はい

collectionModel.makeCurrent

このバインディングのイテレータ内で、選択した行を現在の行にします。

いいえ

いいえ

いいえ

はい

collectionModel.selectedRow

選択した行への参照を戻します。

いいえ

いいえ

いいえ

はい

currentRow

イテレータが指している現在の行またはデータ・オブジェクト(組込みナビゲーション・アクションなど)への参照を戻します。

はい

いいえ

いいえ

いいえ

currentRow.dataprovider

イテレータが指している現在の行またはデータ・オブジェクトへの参照を戻します。(これはcurrentRowから戻されるものと同じオブジェクトで、構文のみが異なります)。

はい

いいえ

いいえ

いいえ

enabled

アクション・バインディングの状態に応じて、trueまたはfalseを戻します。たとえば、アクション・バインディングは、ユーザーが「先頭へ」、「次へ」、「前へ」、「最後へ」などのナビゲーション・ボタンをクリックした場合に決定される現在位置に基づいて、有効化(true)または無効化(false)されます。

いいえ

はい

いいえ

いいえ

execute

解決されたときに、名前付きアクションまたはmethodActionバインディングを起動します。

いいえ

はい

いいえ

いいえ

format

これはhints.formatのショートカットです。

いいえ

いいえ

はい

はい

hints

バインディングが関連付けられているすべての表示属性について、UIヒントの名前/値ペアのリストを戻します。

いいえ

いいえ

はい

はい

inputValue

バインディングが関連付けられている最初の属性の値を戻します。

いいえ

いいえ

はい

いいえ

items

現在のリストの有効な属性に関連付けられた値のリストを戻します。

いいえ

いいえ

はい

いいえ

label

hintsの子または属性の直接の子として使用できます。バインディングの最初の属性のラベルを戻します(コントロール・ヒントで指定されている場合)。

いいえ

いいえ

はい

はい

name

PageDef.xmlファイル内で宣言されたバインディングのidを戻します。

はい

はい

はい

はい

rangeSize

イテレータ・バインディングの行セットの範囲サイズを戻します。これにより、データソースからバインドされるデータ・オブジェクトの数を確認できます。

はい

いいえ

いいえ

はい

result

メソッド・アクション・バインディングによりバインドおよび起動されるメソッドの結果を戻します。

いいえ

はい

いいえ

いいえ

updateable

hintsの子または属性の直接の子として使用できます。バインディングが関連付けられている最初の属性が更新可能である場合、trueを戻します。それ以外の場合はfalseを戻します。

いいえ

いいえ

はい

はい

viewable

Treeの子として使用できます。このバインディングおよび関連コンポーネントをレンダリングするかどうかを実行時に解決します。

いいえ

いいえ

いいえ

はい

脚注 1  EL語句のrowは、コレクション・コンポーネントのコンテキスト内で使用されます。rowは単に、コレクションをレンダリングするときに、MAF AMXバインディング・オブジェクトからアクセスできる属性を含むコレクションの各要素に対する反復変数として機能します。属性とリスト・バインディングには、row変数を使用してアクセスできます。そのような式の構文は、コレクションに含まれないバインディング・オブジェクトへのアクセスに使用される構文と同じで、#{row.bindings.Name.property}のようにrow変数を先頭の語句として追加します。

7.3.5 式ビルダーのカテゴリについて

MAF AMXページの式ビルダーでは、次のカテゴリを使用できます。

- バインディング・カテゴリについて

- マネージドBeanカテゴリについて

- モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて

7.3.5.1 バインディング・カテゴリについて

この項では、「バインディング」カテゴリで使用できるオプションを表示します。bindingsノードとdataノードは、同じ一連のサポートされているバインディングとプロパティを表示します。表7-5に、使用できるバインディング・タイプと、各バインディング・タイプでサポートされるプロパティをリストします。securityContextノードは次のプロパティをサポートしています。

- authenticated

- userGrantedPrivilege

- userInRole

- userName

次に例を示します。

#{securityContext.authenticated}
#{securityContext.userGrantedPrivilege['submit_privilege']}
#{securityContext.userInRole[&rsquor;manager_role']}
#{securityContext.userName}

表7-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

7.3.5.2 マネージドBeanカテゴリについて

この項では、「マネージドBean」カテゴリで使用できるオプションを表示します。

- applicationScope: 「マネージドBean」のapplicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーション・スコープのマネージドBeanなど)。

- pageFlowScope: 「マネージドBean」のpageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロー・スコープのマネージドBeanなど)。

- viewScope: 「マネージドBean」のviewScopeノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュー・スコープのマネージドBeanなど)。

MAFランタイムでは、自身をマネージドBeanプロパティの変更通知のリスナーとして登録することによって、Beanプロパティを参照するUIコンポーネントにバインドされたEL式が、プロパティの値が変更されたときに自動的に更新されるようにします。これらの通知をソースとして参照するには、Beanのプロパティ・アクセッサにコードを追加する必要があります。Beanのプロパティ・アクセッサから、通知をソースとして参照するために必要なコードを自動的に生成するには、「アクセッサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します(図7-2を参照)。

図7-2 プロパティの変更時にリスナーに通知

ELを通じて単にBeanメソッドまたはプロパティを参照する場合、このコードを追加する必要はありませんが、Beanに格納された値が変化する場合や、特にその変更が、1つ以上のプロパティ値を変更するBeanメソッドの実行による二次的な影響など、間接的なものである場合、それらの値に依存するEL式のアクティブ・フォームへのレンダリングを最新の状態に保つ必要があります。プロパティの変更とPropertyChangeSupportクラスについては、第7.13項「データ変更イベントについて」を参照してください。

例7-2は、プログラムで別のマネージドBean属性にバインドされた値を取得する方法を示しています。

例7-2 プログラムでマネージドBeanから取得されるオブジェクト値

public void someMethod()
{
Object value = AdfmfJavaUtilities.evaluateELExpression("#{applicationScope.MyManagedBean.someProperty}");

例7-3は、プログラムでマネージドBeanからバインディングを実行する方法を示しています。

例7-3 プログラムでマネージドBeanから実行されるバインディング

public void someMethod()
{
Object value = AdfmfJavaUtilities.evaluateELExpression("#{bindings.someDataControlMethod.execute}");

注意:

機能のapplicationScope内でマネージドBeanを宣言し、デザインタイムで別の機能のELを通じてそのBeanを参照しようとすると、そのデザインタイムで無効なELに関する警告が表示されます。この警告は、デザインタイムがそのBeanの現在のプロジェクトで参照を検出できないことが原因で表示されます。そのBeanを実行時に参照できるのは、Beanが宣言されている最初の機能に初めてアクセスし、さらに別の機能のELを通じてアクセスする前にそのBeanをインスタンス化した場合のみです。これは、Name属性の値をノード・ラベルとして使用するPreferenceValue要素には当てはまりません。

7.3.5.3 モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリには、モバイル・アプリケーション・フレームワークで定義され、ELを使用して参照できる様々なオブジェクト(オブジェクト・スコープなど)が表示されます。

MAF変数とマネージドBean参照は、変数の存続期間と可視性を決定する様々なオブジェクト・スコープ内で定義されます。これらのスコープには、可視性が高い順に、アプリケーション・スコープ、ページ・フロー・スコープおよびビュー・スコープがあります。様々なオブジェクト・スコープの詳細は、第7.2項「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

このような変数を含むスコープに加えて、MAFでは、デバイス・プロパティとアプリケーション・プリファレンスに関する情報を公開できるスコープが定義されています。これらのスコープによって、アプリケーション・レベルの存続期間と可視性が決まります。

「モバイル・アプリケーション・フレームワーク・オブジェクト」カテゴリで使用できるものは、次のとおりです。

- applicationScope: applicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーション・スコープのマネージドBeanなど)。アプリケーション・スコープで定義されたEL変数は、アプリケーションが存続するかぎり、複数の機能にまたがって使用できます。

- pageFlowScope: pageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロー・スコープのマネージドBeanなど)。ページ・フロー・スコープの名前空間で定義されたEL変数は、機能が存続するかぎり、単一の機能内で使用できます。

- preferenceScope: preferenceScopeノードには、アプリケーションと機能のすべてのプリファレンスが含まれます。
プリファレンス要素では、PreferenceValue要素を除き、Id属性の値を式ビルダーのノード・ラベルとして使用します。PreferenceValue要素では、Name属性の値を式ビルダーのノード・ラベルとして使用します。

注意:

EL式の文字列トークンにドット(.)や特殊文字またはdefaultなどの予約語が含まれている場合、式ビルダーではそのような文字列トークンを一重引用符と大カッコで囲みます。機能IDやプリファレンス・コンポーネントIDにドットが含まれている場合、式ビルダーでは、ドットによって区切られたIDの各部分を別のプロパティとしてpreferenceScope階層に表示します。生成された式でも、ドットによって区切られたIDの各部分を別のプロパティとして認識します。

preferenceScopeのいくつかのサンプルEL式を次に示します。

例7-4 ドットを含む機能ID

"#{preferenceScope.feature.oracle.hello.SampleGroup1.label}"

例7-5 属性名が予約語である場合

"#{preferenceScope.application.OracleMobileApp.Edition['default']}"

- viewScope: このノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュー・スコープのマネージドBeanなど)。ビュー・スコープの名前空間で定義されたEL変数は、ビューが存続するかぎり、機能の単一ページ内で使用できます。

- row: rowオブジェクトは、collectionModelに含まれる単一のプロバイダへのショートカットである中間変数です。その名前は、親コンポーネント(リスト・ビューまたはカルーセルなど)のvar属性の値です。

注意:

AdfmfJavaUtilities.evaluateELExpressionを使用して#{row}またはrowのプロパティを評価することはできません。これらの式は、Null値を返します。

- viewControllerBundle
これは、プロジェクト・レベルで定義されたリソース・バンドルを指すリソース・バンドル変数の名前です。このノードは、amx:loadBundle要素がドロップされ、リソース・バンドルが作成された後にのみ表示されます。このノードの名前は、amx:loadBundleの変数名によって異なります。このノードには、バンドル内で宣言されたすべての文字列が表示されます。

例7-6は、viewControllerBundleのAMXコードの例を示しています。

例7-6 loadBundle要素のAMXコード・サンプル

<amx:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle"/>

7.3.6 ELイベントについて

ELイベントは、共通語句を含む式が相互に同期して更新できるようにするため、MAF AMX UIの動作において重要な役割を果たします。

EL式は、様々なコンテキストで値を参照できます。例7-7は、2つの入力数値スライダ・コンポーネントの作成を示しており、各コンポーネントがapplicationScopeの値に関連付けられています。出力テキストでは、ELを使用して単純な追加式を計算結果とともに表示します。フレームワークでは、出力テキスト・ラベル内のEL式を解析するときに、その式に2つの値への参照が含まれていることを確認し、それら2つの値に基づく出力テキストのイベント・リスナー(第6.10項「イベント・リスナーの使用方法」を参照)を作成します。基礎となる式の値が変化すると、イベントがその値のすべてのリスナーに対して生成されます。

注意:

(スコープ・オブジェクトではなく)マネージドBeanのプロパティを参照している場合、リスナーを追加する必要があります。詳細は、第7.3.5.2項「マネージドBeanカテゴリについて」を参照してください。

例7-7 2つのコンポーネントを含むELイベントの生成

<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}"/>

例7-7では、2つのコンポーネントがそれぞれ1つの値を更新し、1つのコンポーネントが両方の値を使用します。例7-8は、いずれかの既存の値を参照する3つ目の入力数値スライダ・コンポーネントが追加された場合、動作は同じになることを示しています。

例7-8 3つのコンポーネントを含むELイベントの生成

<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}"/>

例7-8では、いずれかの入力数値スライダ・コンポーネントが#{applicationScope.X}を更新すると、もう一方が出力テキストとともに自動的に更新されます。

7.3.7 EL式のマネージドBean内での使用方法

必要なEL式はJDeveloperで作成され、作成されない式は式ビルダーを使用して作成できますが、マネージドBean内でEL式にアクセスしたり、EL式を設定または起動する必要がある場合もあります。

例7-9に、EL式への参照を取得し、適合するオブジェクトを返す(または作成する)方法を示します。

例7-9 マネージドBeanからのEL式の解決

public static Object resolveExpression(String expression) {
return AdfmfJavaUtilities.evaluateELExpression(expression);
}

例7-10に、メソッド式を解決する方法を示します。

例7-10 マネージドBeanからのメソッド式の解決

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);
}

例7-11に、マネージドBeanで新たにオブジェクトを設定する方法を示します。

例7-11 マネージドBeanでの新たなオブジェクトの設定

public static void setObject(String expression, Object newValue) {
AdfmfJavaUtilities.setELValue(expression, newValue);
}

7.4 マネージドBeanの作成と使用

マネージドBeanは、様々な構成ファイルを使用してアプリケーションに登録するJavaクラスです。MAFアプリケーションを起動すると、これらの構成ファイルが解析されてBeanが使用可能になり、EL式で参照できるため、Beanのプロパティとメソッドにアクセスできます。マネージドBeanが初めて参照されたときにまだ存在していない場合、マネージドBean作成機能によりBeanのデフォルトのコンストラクタ・メソッドがコールされて、Beanがインスタンス化されます。また、プロパティが宣言されると、宣言されたデフォルトの値が移入されます。

多くの場合、マネージドBeanは、フロント・エンドで処理することが最適なイベントやデータ操作を処理します。マネージドBeanの使用方法の詳細は、http://www.oracle.com/technetwork/java/index.htmlのJava EEチュートリアルを参照してください。

ベスト・プラクティス:

マネージドBeanを使用して、現在のユーザーなどのブックキーピング情報のみを格納します。すべてのアプリケーション・データおよび処理データは、アプリケーションのビジネス・レイヤーのロジックによって処理される必要があります。

注意:

EL式には、Beanを参照するために明示的にスコープを指定する必要があります。たとえば、pageFlowScopeスコープからMyBeanマネージドBeanを参照するには、#{pageFlowScope.MyBean}という式になります。

7.4.1 JDeveloperでのマネージドBeanの作成方法

adfc-mobile-config.xmlファイルに概要エディタを使用して、マネージドBeanの作成とMAFアプリケーションへの登録を同時に行うことができます。

始める前に

マネージドBeanに関する知識が役立つ場合があります。詳細は、第7.4項「マネージドBeanの作成と使用」を参照してください。

マネージドBeanの作成および登録手順:

1. 「アプリケーション」ウィンドウで、adfc-mobile-config.xmlをダブルクリックします。

2. エディタ・ウィンドウで、「概要」タブをクリックします。

3. 概要エディタで、「マネージドBean」ナビゲーション・タブをクリックします。
図7-3は、adfc-mobile-config.xmlファイルのエディタを示しています。

図7-3 adfc-mobile-config.xmlファイル内のマネージドBean

4. 「追加」アイコンをクリックして「マネージドBean」表に行を追加します。

5. 「マネージドBeanの作成」ダイアログで値を入力します。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。JDeveloperでクラス・ファイルを作成する場合は、「クラスが存在しない場合は生成」オプションを選択します。リスナー・プロパティのいずれかを選択して「編集」ボタンをクリックすることで、「プロパティ」ウィンドウから「マネージドBeanの作成」ダイアログを開くこともできます。そこから、新しいマネージドBeanと対応するメソッドを作成できます。

注意:

マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合、可能なかぎり狭いスコープを常に使用するようにします。様々なオブジェクト・スコープの詳細は、第7.2項「オブジェクト・スコープ・ライフサイクルについて」を参照してください。

6. オプションでBeanに管理プロパティを追加できます。Beanがインスタンス化される際、指定した値が管理プロパティに設定されます。「Managed Bean」表でBeanを選択した状態で「新規」アイコンをクリックし、「管理プロパティ」表に行を追加します。「プロパティ」ウィンドウで、プロパティ名を入力します(他のフィールドはオプションです)。

注意:

このエディタを使用して管理プロパティを宣言することはできますが、対応するコードはJavaクラスで生成されません。適切なタイプのプライベート・メンバー・フィールドを作成し、コード・エディタのポップアップ・メニューの「アクセッサの生成」メニュー項目を選択して、これらのBeanプロパティに対応するgetおよびsetメソッドを生成することにより、コードを追加する必要があります。

7.4.2 JDeveloperを使用してマネージドBeanを作成する場合の処理

マネージドBeanを作成する際、Javaファイルを生成するよう選択すると、指定された名前とデフォルト・コンストラクタを使用してスタブ・クラスが自動的に作成されます。例7-12に、viewパッケージに格納されたMyBeanクラスに追加されるコードを示します。

例7-12 マネージドBean用に生成されたコード

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ファイル(または編集されるタスク・フロー・ファイル)に追加されます。例7-13は、MyBeanクラスに対して作成されたmanaged-bean要素を示しています。

例7-13 adfc-mobile-config.xmlファイルでのマネージド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>

7.5 データ・コントロールを使用したビジネス・サービスの公開

アプリケーションのサービスの準備ができたら、JDeveloperを使用して、UIコンポーネントとサービスとの宣言的バインドに必要な情報を提供するデータ・コントロールを作成できます。

データ・コントロールの生成には、「データ・コントロールの作成」メニュー・アイテムを使用します。データ・コントロールは、1つ以上のXMLメタデータ・ファイルで構成され、これらのファイルでは、実行時にバインディングと連動するサービスの機能が定義されます。データ・コントロールは、基礎となるサービスと連動します。

7.5.1 データ・コントロールの作成方法

アダプタ・ベースのデータ・コントロールは、JDeveloperの「アプリケーション」ウィンドウ内で作成します。

始める前に

データ・コントロール使用の一般的な知識があると役立ちます。詳細は、第7.5項「データ・コントロールを使用したビジネス・サービスの公開」を参照してください。

次のタスクを完了する必要があります。

アプリケーション・ワークスペースを作成し、データ・コントロールの基礎にするビジネス・サービスを追加します。アプリケーション・ワークスペースの作成の詳細は、第3.2項「アプリケーション・ワークスペースの作成」を参照してください。

データ・コントロールを作成する手順は、次のとおりです。

1. アプリケーション・ワークスペース内でデータ・モデル・プロジェクトの最上位ノードを右クリックして、「新規」を選択し、「ギャラリから」を選択します。

2. 「新規ギャラリ」で、「ビジネス層」を展開し、「データ・コントロール」を選択して、作成するデータ・コントロールのタイプを選択し、「OK」をクリックします。

3. ウィザードの残りのステップを完了します。

注意:

場合によっては、データ・コントロールの基礎にするクラスまたはオブジェクトを右クリックし、「データ・コントロールの作成」を選択することによってデータ・コントロールを作成できます。

7.5.2 データ・コントロール作成時のプロジェクト内の処理

データ・コントロールを作成する際に、JDeveloperによってデータ・コントロール定義ファイル(DataControls.dcx)が作成され、概要エディタでファイルが開き、ファイルの階層が「データ・コントロール」パネルに表示されます。このファイルにより、データ・コントロールがサービスおよびバインディングと直接連動して動作することが可能になります。

エディタ・ウィンドウの「ソース」タブをクリックすることによって、対応するXMLファイルからのコードを表示できます。

7.5.2.1 DataControls.dcx概要エディタ

DataControls.dcxファイルの概要エディタは、データ・コントロール・オブジェクトの階層と、データ・モデルの公開メソッドを表示します。

概要エディタおよび「データ・コントロール」パネルで使用されるアイコンの説明は、表7-6を参照してください。

データ・コントロール・オブジェクトの設定を変更するには、オブジェクトを選択し、「編集」アイコンをクリックします。データ・コントロールの編集方法の詳細は、第7.8.1項「データ・コントロールの編集方法」を参照してください。

図7-4は、概要エディタでのDataControls.dcxファイルを示しています。

図7-4 概要エディタでのDataControls.dcxファイル

7.5.2.2 データ・コントロール・パネル

「データ・コントロール」パネルはパレットとして機能し、ノードを「データ・コントロール」パネルからページのデザイン・エディタにドラッグすることにより、データバインドされたUIコンポーネントを作成できます。データ・コントロールを作成した後、「データ・コントロール」パネルが「アプリケーション」ウィンドウに表示されます。図7-5は、サンプル・アプリケーションの「データ・コントロール」パネルを示しています。

図7-5 「データ・コントロール」パネル

7.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: パラメータとして渡された主キーの属性値を使用して行の検索を試行します。検出されると、その行が現在の行になります。

7.6 「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成

「データ・コントロール」パネルから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインドされたユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要な、様々なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。

「データ・コントロール」パネルでは、各データ・コントロール・オブジェクトが特定のアイコンで表されます。表7-6は、各アイコンが表すデータ・コントロール・オブジェクト、「データ・コントロール」パネルの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。

表7-6 「データ・コントロール」パネルのアイコンおよびオブジェクト階層

アイコン

名前

説明

作成できるコンポーネント

データ・コントロール

データ・コントロールを表します。

他のオブジェクトのコンテナとして機能し、作成には使用されません。

コレクション

アクセッサ・メソッドまたは操作から返される名前付きデータ・コレクションを表します。

フォーム、表、グラフ、ツリー、レンジ・ナビゲーションの各コンポーネント、マスター/ディテール・コンポーネントおよび選択リストの各コンポーネント。

構造化された属性

Javaプリミティブ・タイプ(属性として示される)または任意のタイプのコレクションのいずれでもない、戻りオブジェクトを示します。

フォーム、ラベル、テキスト・フィールド、日付、値リストおよび選択リストの各コンポーネント。

属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。

キー属性

データ・コントロール構造ファイル、またはビジネス・サービス自体で、主キー属性として宣言されたオブジェクト属性を表します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。

メソッド

データ・コントロールのメソッドまたは操作、またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはコレクションを戻したりすることができます。

コマンド・コンポーネント。

パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。

メソッド戻り値

メソッドまたはその他の操作から返されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、または親コレクションで実行できる操作などです。

単一の値の場合: テキスト・フィールドおよび選択リスト。

コレクションの場合: フォーム、表、ツリー、レンジ・ナビゲーションの各コンポーネント。

単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するために、対応するメソッドをボタンとしてドロップできます。フォームがタスク・フローの一部の場合、メソッドを起動するためのメソッド・アクティビティを作成できます。

操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。

ボタンおよびリンクなどのUIコマンド・コンポーネント。

パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。

ラベル、テキストおよび選択リストの各コンポーネント。

7.6.1 「データ・コントロール」パネルの使用方法

JDeveloperは、ドロップするデータ・コントロール項目に対してそれぞれ選択できるUIコンポーネントの事前定義済セットを備えています。

始める前に

「データ・コントロール」パネルの各種オブジェクトに関する知識があると役立つ場合があります。詳細は、第7.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。

次のタスクを完了する必要があります。

- 第7.5.1項「データ・コントロールの作成方法」の説明に従って、データ・コントロールを作成します。

- 第5.3.1.2項「MAF AMXページの作成」の説明に従って、MAF AMXページを作成します。

「データ・コントロール」パネルを使用してUIコンポーネントを作成するには:

1. 「データ・コントロール」パネルで項目を選択し、ページのビジュアル・エディタにその項目をドラッグします。パネル内の各アイテムの定義は、表7-6「「データ・コントロール」パネルのアイコンおよびオブジェクト階層」を参照してください。

2. ポップアップ・メニューから、UIコンポーネントを選択します。
「データ・コントロール」パネルから項目をドラッグしてページにドロップすると、ドロップした項目に使用できるすべてのデフォルトUIコンポーネントのポップアップ・メニューが表示されます。表示されるコンポーネントは、プロジェクト内のライブラリに基づきます。

図7-6は、「データ・コントロール」パネルのデータ・コレクションがページにドロップされる際に表示されるポップアップ・メニューを示しています。

図7-6 「データ・コントロール」パネルからのコンポーネントのドロップ

ポップアップ・メニューから選択したコンポーネントに応じて、そのコンポーネントの外観を定義するためのダイアログが自動的に表示されます。たとえば、ポップアップ・メニューから「フォーム」を選択すると、「フォーム・フィールドの編集」ダイアログが開きます。コンポーネントを選択すると、JDeveloperではビジュアル・エディタのページにそのUIコンポーネントが挿入されます。

デフォルトで選択されたUIコンポーネントはまず、対応するビジネス・オブジェクト上で設定されているUIヒントで決定されます。UIヒントが設定されていない場合、JDeveloperでは標準のフォームおよび表の入力コンポーネントと読取り専用のフォームおよび表の出力コンポーネントが使用されます。リストのコンポーネントは、データ・コントロール・オブジェクトをドロップするときに選択するリストの型に基づいて決定されます。

デフォルトでは、データ・コントロールの使用時に作成されるUIコンポーネントは、MAFデータ・コントロール内の属性にバインドされ、次のような組込み機能を装備できます。

- データバインド・ラベル

- ツールチップ

- 書式設定

- 基本的なナビゲーション・ボタン

- 検証(検証規則が特定の属性にアタッチされている場合。)

デフォルトのコンポーネントは、そのまま使用しても十分機能します。ただし、特定のニーズに合せて変更することができます。

ヒント:

ページで使用するMAFデータバインド・コンポーネントのタイプを変更する場合は、ビジュアル・エディタまたは構造ウィンドウを使用してそのコンポーネントを削除し、「データ・コントロール」パネルから新しいコンポーネントをドラッグ・アンド・ドロップする方法が最も簡単です。データバインドされたコンポーネントをページから削除するときにビジュアル・エディタまたは構造ウィンドウを使用する場合、ページ定義ファイルの関連するバインディング・オブジェクトが他のどのコンポーネントからも参照されていなければ、これらのバインディング・オブジェクトはJDeveloperによって自動的に削除されます(ソース・エディタを使用する場合は、バインディング・オブジェクトの自動削除は行われません)。

7.6.2 「データ・コントロール」パネルの使用時の処理

「データ・コントロール」パネルを使用してアプリケーションを構築すると、JDeveloperによって次の処理が行われます。

- DataBindings.cpxファイルがプロジェクトのデフォルト・パッケージに作成されます(このファイルが存在しない場合のみ)。また、そのページ用にエントリが追加されます。
DataBindings.cpxファイルは、アプリケーションのバインディング・コンテキストを定義します。バインディング・コンテキストはコンテナ・オブジェクトの1つで、使用可能なデータ・コントロールおよびデータ・バインディング・オブジェクトのリストを含みます。DataBindings.cpxファイルによって、個々のページがページ定義ファイルに含まれるバインディング定義にマップされ、これらのページが使用するデータ・コントロールが登録されます。詳細は、第5.3.2.4.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

- META-INFディレクトリにadfm.xmlファイルが作成されます。このファイルにより、DataBindings.cpxファイルのレジストリが作成され、バインディング・コンテキストを作成できるように、実行時にアプリケーションで特定できます。

- パッケージ定義ファイルがページ定義サブパッケージに追加されます(ページに対してファイルが存在しない場合)。デフォルトのサブパッケージは、adfmsrcディレクトリにあるmobile.pageDefsです。

ヒント:

「プロジェクト・プロパティ」ダイアログ(プロジェクト・ノードをダブルクリックするとアクセスできる)のADFモデル設定ページで、パッケージ構成(名前と場所など)を設定できます。

ページ定義ファイル(pageNamePageDef.xml)は、アプリケーションのビュー・レイヤーにある各ページのバインディング・コンテナを定義します。バインディング・コンテナでは、ページのすべてのバインディング・オブジェクトへのランタイム・アクセスが行われます。ページ定義ファイルの詳細は、第5.3.2.4.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

ヒント:

現在のバインディング・コンテナは、プログラム的なアクセス用のAdfContextからも入手できます。

- ページ定義ファイルが構成されます。この処理では、ページによって参照されるバインディング・オブジェクトの定義も追加されます。

- ページに指定のコンポーネントを追加します。
これらの事前作成済のコンポーネントには、ページ定義ファイルのバインディング・オブジェクトを参照するデータ・バインディング式言語(EL)式が含まれます。詳細は、第7.3.1項「データ・バインディングEL式について」を参照してください。

- UIコンポーネントが必要とするすべてのライブラリ、ファイル、および構成要素が追加されます。データバインドされたコンポーネントに必要なアーティファクトの詳細は、第3.2.2項「MAFアプリケーションの作成時に行われる処理」を参照してください。

7.7 実行時に行われる処理: バインディング・コンテキストの動作方法

ページにMAFバインディングが含まれている場合、実行時には、クライアントまたはコントローラから起動されたビジネス・サービスとのやり取りが、バインディング・コンテキストと呼ばれるシングル・オブジェクトを介して、アプリケーションによって管理されます。バインディング・コンテキストは、アプリケーション内のすべてのデータ・コントロールおよびページ定義のランタイム・マップ(名前付きdataでEL式#{data}を使用してアクセス可能)です。

MAFでは、図7-7に示すように、アプリケーション、DataBindings.cpxおよびページ定義ファイルからバインディング・コンテキストが作成されます。設計時に使用可能なデータ・コントロールは、すべてのDataControls.dcxファイルとワークスペース内のすべてのアプリケーション・モジュールの集合体によって定義されますが、実行時にアプリケーションで使用可能なデータ・コントロールは、DataBindings.cpxファイルで定義されます。DataBindings.cpxファイルは、アプリケーションのページで使用されているすべてのデータ・コントロールを一覧表示し、ページ定義ファイルに定義したバインディング・オブジェクトが格納されているバインディング・コンテナをWebページのURLにマップします。ページ定義ファイルは、アプリケーション・ページで使用するバインディング・オブジェクトを定義します。各ページにページ定義ファイルが1つあります。

バインディング・コンテキストには、これらのオブジェクトのライブ・インスタンスは含まれません。かわりに、マップには必要に応じてデータ・コントロールまたはバインディング・コンテナ・オブジェクトになる参照が含まれます。たとえば、オブジェクト(ページ定義など)がアプリケーションから解放されるか、タスク・フローが終了するか、リクエストの終了時にバンディング・コンテナまたはデータ・コントロールが解放されると、データ・コントロールおよびバンディング・コンテナは参照オブジェクトに戻ります。DataBindings.cpxファイルの詳細は、第5.3.2.4.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトに関する必知事項」を参照してください。

図7-7 ファイル・バインディング・コンテキストの実行時の使用

注意:

コンポーネントを構成するときは、使用するバインディング・スタイルを十分に考慮してください。より具体的に言うと、標準的なバインディングをマネージドBeanバインディングと組み合せると、解釈を誤った動作が発生することがよくあります。これは、バインディング・インフラストラクチャとマネージドBeanインフラストラクチャとの間でクラス・インスタンスが一致する可能性が低いためです。バインディングが混在すると、UIに直接リンクされていないインスタンスの動作がコールされる場合があります。

MAFでのバインディングの使用の詳細は、次の項を参照してください。

- 第5.3.2.4.4項「生成されるバインディングに関する必知事項」

- 第5.3.2.4.6項「MAF AMXエディタの「バインディング」タブの使用方法」

- 第5.3.2.4.7項「未使用のバインディングの削除に関する必知事項」

7.8 データ・コントロールの構成

データ・コントロールを作成すると、データ・コントロールについて、値と動作の標準的なセットが設定されます。たとえば、属性のラベルのクライアントでの表示方法がデータ・コントロールによって決定されます。データ・コントロールの要素に対応するデータ・コントロール構造ファイルを作成および変更することによって、これらの値と動作を構成できます。まず、.dcxファイルの概要エディタを使用して、データ・コントロール構造ファイルを生成します。

7.8.1 データ・コントロールの編集方法

データ・コントロールを構成可能にするには、DataControls.dcxファイルの概要エディタを使用し、データ・コントロールに含まれるオブジェクトに対応するデータ・コントロール構造ファイルを作成します。個別のデータ・コントロール構造ファイルを編集できるようになります。

始める前に

データ・コントロール構成の一般的な知識があると役立ちます。詳細は、第7.8項「データ・コントロールの構成」を参照してください。

次のタスクを完了する必要があります。

第7.5.1項「データ・コントロールの作成方法」の説明に従って、データ・コントロールを作成します。

データ・コントロールを編集するには:

1. 「アプリケーション」ウィンドウで、DataControls.dcxをダブルクリックします。

2. 概要エディタで、構成するオブジェクトを選択し、「編集」アイコンをクリックしてデータ・コントロール構造ファイルを生成します(図7-8を参照)。

図7-8 データ・コントロール・レジストリの「編集」ボタン

3. データ・コントロール構造ファイルの概要エディタで、必要な変更を加えます。

7.8.2 データ・コントロール編集時の処理

データ・コントロールを編集すると、JDeveloperにより、影響を受けたコレクションのメタデータが含まれているデータ・コントロール構造ファイルが作成され、そのファイルが概要エディタで開かれます。このファイルには、そのコレクション固有のデータ・コントロールの構成データ(データ・オブジェクトに対して指定したUIヒントまたはバリデータなど)が保存されています。

データ・コントロール構造ファイルのベース名は、対応するデータ・オブジェクトのものと同じです。たとえば、Customer.javaエンティティBeanに対応するコレクション・ノードが選択されている状態で「編集」アイコンをクリックすると、データ・コントロール構造ファイルの名前はCustomer.xmlとなります。データ・コントロール構成ファイルはBeanクラスのパッケージに対応するパッケージに生成され、パッケージ名にpersdefが付加されます。たとえば、Customer.java Beanがmodelパッケージ内にある場合、Customer.xmlデータ・コントロール定義ファイルはpersdef.modelパッケージ内に生成されます。データ・コントロール構成ファイルが生成された後、概要エディタを使用してそのファイルをさらに構成できます。

データ・コントロール構造ファイルには、次の情報が含まれます。

- 属性: サービスのすべての属性を表します。たとえば、エンティティBeanの場合は、データベース列にマップされたBeanプロパティごとに属性が存在します。また、一時属性も追加できます。これらの属性のUIでの表示方法を定義するUIヒントを設定できます。属性値が必須か、一意である必要があるか、表示可能かどうかなどの他のプロパティを設定することもできます。詳細は、第7.9項「属性の使用」を参照してください。
属性の検証を設定したり、カスタム・プロパティを作成することもできます。検証の詳細は、第7.12項「属性の検証」を参照してください。

- アクセッサ: 結果セットを返すデータ・コントロール要素を表します。

- 操作: データ・コントロールの組込み操作で使用されるデータ・オブジェクト上のメソッドを表します。たとえば、それぞれ「作成」および「削除」組込み操作で使用されるaddおよびremoveメソッドなどです。

図7-9に、Item Beanのデータ・コントロール構造ファイルを示します。

図7-9 概要エディタでのデータ・コントロール構造ファイル

注意:

データ・コントロール構造ファイルの概要エディタには、データ・オブジェクトに関連付けられているすべての属性、アクセッサおよび操作が表示されます。ただし、データ・コントロール構造ファイルのXMLソースには、編集した要素の定義のみが含まれます。基本要素は、データ・オブジェクトからイントロスペクションされます。また、基礎となるデータ・オブジェクトに変更を加えると、データ・コントロールはそれらの変更を継承します。

7.8.3 データ・コントロールのMDSカスタマイズに関する必知事項

データ・コントロールに含まれるすべてのオブジェクトをOracle Metadata Services (MDS)カスタマイズ可能にする必要がある場合は、パッケージされたアプリケーションにこれらのオブジェクトのデータ・コントロール構造ファイルが含まれている必要があります。

アダプタ・フレームワークに基づくデータ・コントロールを作成する際には、データ・コントロール構造ファイルはデフォルトでは生成されません。これは、特定のオブジェクトにメタデータを追加しない場合、データ・コントロールにこれらのファイルは必要ないからです。通常、データ・コントロール構造ファイルがデータ・コントロール・オブジェクトに対して生成されるのは、データ・コントロールを編集して宣言的メタデータ(UIヒントやバリデータなど)をそのオブジェクトに追加した後のみです(第7.8.1項「データ・コントロールを編集する方法」を参照)。データ・コントロール・オブジェクトごとにデータ・コントロール構造ファイルを作成するには、データ・コントロール・オブジェクトごとにその手順を繰り返す必要があります。

MDSの詳細は、第4.14項「Oracle Metadata Servicesを使用したMAFファイルのカスタマイズ」を参照してください。

7.9 属性の使用

ビジネス・サービスのデータ・コントロールを作成する際、個々のデータ・オブジェクトについて作成するデータ・コントロール構造ファイルで宣言的にデータ・オブジェクトの永続属性の機能を拡張できます。たとえば、UIコンポーネントの属性のデフォルト表示を制御する検証ルールを作成し、UIヒントを設定できます。

これらのプロパティはデータ・コントロール構造ファイルの概要エディタの「属性」ページで設定します。データ・コントロール構造ファイルの作成の詳細は、第7.8.1項「データ・コントロールの編集方法」を参照してください。

7.9.1 属性を主キーとして指定する方法

データ・オブジェクトのデータ・コントロール構造ファイルの概要エディタで、そのデータ・オブジェクトの主キーとして属性を指定できます(データ・オブジェクトの基礎クラスでまだ指定していない場合)。

始める前に

属性プロパティの設定方法の知識があると役立ちます。詳細は、第7.9項「属性の使用」を参照してください。

次のタスクを完了する必要があります。

第7.8.1項「データ・コントロールの編集方法」の説明に従って、必要なデータ・コントロール構造ファイルを作成します。

属性を主キーとして設定する手順は次のとおりです。

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで、主キーとして指定する属性を選択して、「詳細」タブをクリックします。

4. 「詳細」ページで、「キー属性」プロパティを設定します。

注意:

属性がクラス内ですでに主キーとして指定されている場合、データ・コントロールはその設定を継承し、「キー属性」チェックボックスが選択されます。ただし、この場合は、「キー属性」オプションを選択解除することはできません。

7.9.2 属性の静的なデフォルト値を定義する方法

値のタイプが「リテラル」に設定されている場合、「詳細」セクションの「値」フィールドには、属性のデフォルト値を静的に指定できます。たとえば、ServiceRequestエンティティBeanのStatus属性のデフォルト値をOpenに設定したり、User BeanのUserRole属性のデフォルト値をuserに設定できます。

始める前に

属性プロパティの設定方法の知識があると役立ちます。詳細は、第7.9項「属性の使用」を参照してください。

属性の静的なデフォルト値を定義する手順:

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで編集する属性を選択し、「詳細」タブをクリックします。

4. 「詳細」ページで、「リテラル」オプションを選択します。

5. 「リテラル」オプションの下のテキスト・フィールドに、属性のデフォルト値を入力します。

7.9.3 属性へのUIヒントの設定方法

属性のUIヒントを設定し、それらの属性を使用するすべてのUIコンポーネントでそれらの属性が一貫したローカライズ可能な方法で表示およびラベル付けされるように設定できます。UIヒントにより、属性、ラベル、ツールチップ、フィールドを自動的に送信する必要があるかどうかを表示するために使用するUIコンポーネントのタイプなどが決定されます。指定された属性を表示するか非表示にするかも決定できます。属性に対してUIヒントを作成するには、「アプリケーション」ウィンドウからアクセス可能な、データ・オブジェクトのデータ・コントロール構造ファイルの概要エディタを使用します。

始める前に

属性プロパティの設定方法の知識があると役立ちます。詳細は、第7.9項「属性の使用」を参照してください。

次のタスクを完了する必要があります。

第7.8.1項「データ・コントロールの編集方法」の説明に従って、必要なデータ・コントロール構造ファイルを作成します。

UIヒントを設定する手順:

1. 「アプリケーション」ウィンドウで、使用するデータ・コントロール構造ファイルをダブルクリックします。

2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

3. 「属性」ページで編集する属性を選択し、「UIヒント」タブをクリックします。

4. 「UIヒント」セクションで、目的のUIヒントを設定します。

7.9.4 属性へのUIヒントの設定時の処理

属性に対してUIヒントを設定すると、それらのヒントはプロパティとして格納されます。プロパティのタグがデータ・オブジェクトのデータ・コントロール構造ファイルに追加され、プロパティの値はリソース・バンドル・ファイルに保存されます。リソース・バンドル・ファイルが存在しない場合は、データ・コントロールのパッケージに生成され、初めてUIヒントを設定した際にプロジェクト名に従って名前が設定されます。

例7-14に、Item.xmlデータ・コントロール構造ファイルにおけるprice属性のコードを示します。属性に対して設定されているラベルおよびフォーマット・タイプ・ヒントのタグも含まれます。

例7-14 UIヒントのXMLコード

<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>

例7-15に、ModelBundle.propertiesリソース・バンドル・ファイルにおけるラベルおよびフォーマット・タイプ・ヒントの対応するエントリを示します。これらにはプロジェクトのローカライズ可能なプロパティすべての値も含まれています。

例7-15 UIヒントのリソース・バンドル・コード

model.Item.price_LABEL=Price
. . .
model.Item.price_FMT_FORMATTER=oracle.jbo.format.DefaultCurrencyFormatter

7.9.5 EL式を使用してUIヒントにアクセスする方法

EL式を使用してUIヒントにアクセスし、ページにデータとしてヒント値を表示できます。UIヒントには、データバインドされたコンポーネントをページにドロップした後に作成するバインディング・インスタンスを通じてアクセスできます。

例7-16は、DeviceFeaturesデータ・コントロールを使用して生成されました。この例は、MAFフォームとして接続をドラッグ・アンド・ドロップし、displayNameフィールドとnicknameフィールドのみを保持することによって生成されるEL式を示しています。太字で表示されるラベルは、ELを使用したUIヒント取得の例です。

例7-16 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"

7.10 Beanデータ・コントロールの作成および使用

Java Beanデータ・コントロールでは、POJO (Plain Old Java Object)から自身のデータ構造を取得します。Java Beanデータ・コントロールを作成するには、(「アプリケーション」ウィンドウで)Javaクラス・ファイルを右クリックし、「データ・コントロールの作成」を選択します。

注意:

Java Beanがバックグラウンド・スレッドを使用してUI内のデータを更新する場合、手動でoracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventをコールする必要があります。flushDataChangeEventメソッドの詳細は、第7.13項「データ変更イベントについて」を参照してください。

7.10.1 Beanクラス変数のシリアライズに関する必知事項

MAFでは、一時変数として宣言されたJavaScript Object Notation (JSON)データBeanクラス変数にはシリアライズしません。一連のネストされたオブジェクトをシリアライズしないようにするには、それらを一時オブジェクトとして定義する必要があります。この方法を使用すると、オブジェクトのネストが原因で循環オブジェクトが作成されるのを防ぐこともできます。

次のシナリオを考えてみましょう。Employeeオブジェクトが、その子として従業員の上司を表すEmployeeオブジェクトを保持しているとします。その子を一時オブジェクトとして宣言しなかった場合、実行時に子のEmployeeオブジェクトを計算しようとすると、一連のネストされたシリアライズ・オブジェクトが作成されます。

JavaオブジェクトをJSONオブジェクトにシリアライズおよびシリアライズ解除するには、JSONBeanSerializationHelperクラスを使用します。JSONBeanSerializationHelperクラスを使用すると、独自のカスタムJSONシリアライズおよびシリアライズ解除を実装できます。また、このクラスでは、JSONシリアライズ(およびシリアライズ解除)処理後にJSONオブジェクトを変更するためのフックが提供されます。JSONBeanSerializationHelperクラスはGenericTypeSerializationHelperクラスに似ており、RESTおよびSOAPベースのWebサービス内で、GenericTypeオブジェクトのシリアライズおよびシリアライズ解除に使用できます。詳細は、MAF Javadocのoracle.adfmf.framework.api.JSONBeanSerializationHelperクラスを参照してください。

MAFでは、GregorianCalendarクラスのオブジェクトのシリアライズはサポートされません。JSONBeanSerializationHelperクラスでは、GregorianCalendarクラスのオブジェクトをシリアライズできません。これは、GregorianCalendarクラスに循環参照が含まれるためです。かわりに、java.util.Dateまたはjava.sql.Dateをデータ操作に使用します。次の例は、java.util.Dateを使用してGregorianCalendarオブジェクトを変換する方法を示しています。

Calendar calDate = new GregorianCalendar();
calDate.set(1985, 12, 1); // "January 1, 1986"
Date date = calDate.getTime();

7.11 DeviceFeaturesデータ・コントロールの使用方法

MAFでは、アプリケーション内でDeviceFeaturesデータ・コントロールを通じて使用できるデバイス固有の機能が公開されます。DeviceFeaturesデータ・コントロールは、新しいMAFアプリケーションを作成するときに「データ・コントロール」パネルに表示されるコンポーネントです。Cordova Java APIは、このデータ・コントロールを通じて抽象化されます。これにより、MAF AMXとして実装されたアプリケーション機能から、デバイスに埋め込まれた様々なサービスにアクセスできるようになります。DeviceFeaturesデータ・コントロールから提供される操作をMAF AMXページ内にドラッグ・アンド・ドロップすることによって、デバイスに格納されたユーザーのコンタクト先を管理する機能の追加、電子メール・メッセージとSMSテキスト・メッセージの両方の作成と送信、デバイスの位置の確認、デバイスのカメラの使用およびデバイスのファイル・システムに格納されたイメージの取得を行うことができます。次の項では、これらの操作を宣言的に使用する方法や、JavaコードとJavaScriptを使用して実装する方法など、各操作について詳しく説明します。

図7-10 概要エディタでのMAFのDeviceFeaturesデータ・コントロール

MAFアプリケーション・テンプレートを使用してアプリケーションを作成すると、自動的にDeviceFeaturesデータ・コントロールが「データ・コントロール」パネルに表示されます。図7-10は、「概要」エディタ内のDeviceFeaturesデータ・コントロールを示しています。次のメソッドを使用できます。

- createContact

- findContacts

- getPicture

- removeContact

- sendEmail

- sendSMS

- startLocationMonitor

- updateContact

- displayFile

ページを作成したら、DeviceFeaturesデータ・コントロールのメソッド(またはそれらのメソッド内にネストされたその他のオブジェクト)を「データ・コントロール」パネルからMAF AMXビューにドラッグして、関連する機能にバインドされたコマンド・ボタンやその他のコンポーネントを作成できます。デフォルトのバインディングを受け入れるか、ELを使用してそれらのバインディングを変更できます。また、JavaScriptやJavaを使用して、機能を実装または構成することもできます。

DeviceManagerは、デバイスの機能へのアクセスを可能にするオブジェクトです。このオブジェクトのハンドルは、DeviceManagerFactory.getDeviceManagerをコールすることによって取得できます。次の項では、DeviceManagerオブジェクトを使用してgetPictureやcreateContactなどのメソッドを起動する方法について説明します。

データ・コントロールをMAFアプリケーションに含める方法の詳細は、第5.3.2.4項「データ・コントロールのビューへの追加」を参照してください。ネットワーク・アクセスを例外として、Apache Cordova対応デバイスのすべての機能へのアクセスは、MAFアプリケーションの場合デフォルトで有効ではありません。詳細は、第21.6項「デバイス機能へのアクセスの許可」を参照してください。

7.11.1 getPictureメソッドを使用して写真撮影を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるgetPictureメソッドをMAFアプリケーションで使用すると、デバイスのカメラとフォト・ライブラリを活用し、エンド・ユーザーが写真を撮影したり、既存のイメージを取得できるようにすることが可能です。例7-17は、エンド・ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaScriptコードを示しています。例7-18と例7-19は、エンド・ユーザーが写真を撮影したり、保存済イメージを取得することを可能にするJavaコードを示しています。getPictureメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。

次のパラメータによって、イメージの取得元と、そのイメージを戻す方法が制御されます。

注意:

撮影される写真にtargetWidth、targetHeightおよびqualityを指定しないと、使用されるデフォルト値が最大値となり、メモリー障害が発生する可能性があります。

- quality: 保存済イメージの質を設定します。範囲は1から100 (100を含む)です。大きい数値を指定すると質は高くなりますが、ファイル・サイズも増大します。JPEGイメージ(encodingTypeで指定します)にのみ適用されます。

- destinationType: 戻り値の形式を次から選択します。

- DeviceManager.CAMERA_DESTINATIONTYPE_DATA_URL (0): Base64でエンコードされた文字列としてイメージを戻します。この値は、プログラムで使用される場合、DeviceManager.CAMERA_DESTINATION_DATA_URLを使用してenumとしても指定されます。イメージをイメージ・コンポーネント内に表示するには、戻された値の前にdata:image/gif;base64を付ける必要があります。

- DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI (1): イメージ・ファイルのパスを戻します。この値は、プログラムで使用される場合、DeviceManager.CAMERA_DESTINATION_FILE_URIを使用する列挙としても指定されます。

注意:

ファイルURIがgetPictureメソッドによって戻される場合、ファイルのサイズを決定するために使用する前にファイルURIから問合せパラメータを削除する必要があります。次に例を示します。

String fileURI = ...getPicture(...);

fileURI = fileURI.substring(0, result.lastIndexOf("?"));

- sourceType: 写真のソースを次から選択して設定します。

- DeviceManager.CAMERA_SOURCETYPE_PHOTOLIBRARY (0): ユーザーは保存済のイメージから選択できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_PHOTOLIBRARYを使用する列挙としても指定されます。

- DeviceManager.CAMERA_SOURCETYPE_CAMERA (1): ユーザーはデバイスのカメラを使用して写真を撮影できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_CAMERAを使用する列挙としても指定されます。

- DeviceManager.CAMERA_SOURCETYPE_SAVEDPHOTOALBUM (2): ユーザーは既存のフォト・アルバムから選択できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_SAVEDPHOTOALBUMを使用する列挙としても指定されます。

- allowEdit: 選択する前にイメージの単純な編集を許可するかどうかを選択します(ブール)。

- encodingType: 戻されるイメージ・ファイルのエンコーディングを次から選択します。

- DeviceManager.CAMERA_ENCODINGTYPE_JPEG (0): 戻されるイメージをJPEGファイルとしてエンコードします。この値は、プログラムで使用される場合、DeviceManager.CAMERA_ENCODINGTYPE_JPEGを使用する列挙としても指定されます。

- DeviceManager.CAMERA_ENCODINGTYPE_PNG (1): 戻されるイメージをPNGファイルとしてエンコードします。この値は、プログラムで使用される場合、DeviceManager.CAMERA_ENCODINGTYPE_PNGを使用する列挙としても指定されます。

- targetWidth: 幅をピクセル単位で設定してイメージのスケールを変更します。アスペクト比は維持されます。負の値または0の場合、イメージの元のディメンションが使用されます。

- targetHeight: 高さをピクセル単位で設定してイメージのスケールを変更します。アスペクト比は維持されます。負の値または0の場合、イメージの元のディメンションが使用されます。

DeviceFeaturesデータ・コントロールを使用してgetPicture操作をカスタマイズするには:

1. 「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからgetPicture操作をドラッグし、ボタンとしてページにドロップします。
ユーザーがよりきめ細かく制御できるようにするには、getPicture操作をパラメータ・フォームとしてドロップします。これにより、エンド・ユーザーは写真を撮影したり既存のイメージを選択する前に、設定を指定できるようになります。

2. アクションの編集ダイアログで、前述のすべてのパラメータの値を設定します。イメージがファイル名として戻されるように、destinationType = 1を指定するようにします。

3. getPictureの戻り値をドラッグし、それを出力テキストとしてページ上にドロップします。

4. 「共通コンポーネント」パネルで、「コンポーネント・パレット」から「イメージ」をドラッグし、ページ上にドロップします。

5. イメージのsource属性を、getPicture操作の戻り値に設定します。バインディングの式は、#{bindings.Return.inputValue}である必要があります。

図7-11は、エンド・ユーザーのフォト・ライブラリからイメージを表示するためのバインディングを示しています。

図7-11 デザインタイムでフォト・ライブラリからイメージを表示するためのバインディング

このアプリケーションを実行すると、イメージ・チューザが自動的に表示され、エンド・ユーザーは表示するイメージを選択できます。イメージ・チューザが自動的に表示される理由は、イメージ・コントロールが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を設定してイメージ・サイズを制限します。

例7-17は、ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaScriptコードを示しています。結果は、保存済イメージへのフルパスになります。

例7-17 getPictureの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);
}

例7-18は、ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaコードを示しています。結果は、保存済イメージへのフルパスになります。

例7-18 getPictureを使用して写真を撮影するための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);

例7-19は、ユーザーが保存済イメージを取得することを可能にするJavaコードを示しています。結果は、Base64でエンコードされたJPEGになります。

例7-19 getPictureを使用してイメージを取得するためのJavaコード例

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);

7.11.2 SendSMSメソッドを使用してテキスト・メッセージングを可能にする方法

DeviceFeaturesデータ・コントロールに含まれるsendSMSメソッドをMAFアプリケーションで使用すると、デバイスのショート・メッセージ・サービス(SMS)テキスト・メッセージング・インタフェースを活用し、エンド・ユーザーがSMSメッセージを送受信できるようにすることが可能です。MAFでは、デバイスのSMSインタフェースを表示し、必要に応じて次のフィールドに事前にデータを移入できます。

- to: 受信者をリストします(カンマ区切り)。

- body: メッセージの本文を追加します。

SMSテキスト・メッセージング・インタフェースが表示されたら、エンド・ユーザーはSMSを送信するか、それを取り消すことができます。デバイスとキャリアの制限により、SMSは自動的に送信できません。実際にSMSを送信できるのは、エンド・ユーザーのみです。

注意:

sendSMSメソッドのタイムアウト値は、5分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

注意:

Androidでは、エンド・ユーザーがSMSメッセージの編集中にアプリケーションを切り替えて、その後戻すと、SMS編集画面は表示されなくなります。かわりに、そのメッセージは下書きとして保存され、手動で選択して編集を続けることができます。

DeviceFeaturesデータ・コントロールを使用してsendSMS操作をカスタマイズするには:

SMSの送信のためページに対話型フォームを表示するには、sendSMS操作を「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからドラッグし、ページ・デザイナ上にパラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスのSMSインタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに事前に値が移入され、送信準備が整ったSMSが表示されます。

図7-12は、ページ上の編集可能なフォームを使用してSMSを送信するためのバインディングを示しています。

図7-12 デザインタイムで編集可能なフォームを使用してSMSを送信するためのバインディング

例7-20と例7-21は、エンド・ユーザーがデバイスのテキスト・メッセージング・インタフェースを使用してSMSメッセージを送信することを可能にするコード例を示しています。

sendSMSメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。

例7-20 sendSMSのJavaScriptコード例

adf.mf.api.sendSMS({to: "5551234567", body: "This is a test message"});

例7-21 sendSMSのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Send an SMS to the phone number "5551234567"
DeviceManagerFactory.getDeviceManager().sendSMS("5551234567", "This is a test message");

7.11.3 sendEmailメソッドを使用して電子メールを可能にする方法

DeviceFeaturesデータ・コントロールに含まれるsendEmailメソッドをMAFアプリケーションで使用すると、デバイスの電子メール・メッセージング・インタフェースを活用し、エンド・ユーザーが電子メール・メッセージを送受信できるようにすることが可能です。MAFでは、デバイスの電子メール・インタフェースを表示し、必要に応じて次のフィールドに事前にデータを移入できます。

- to: 受信者をリストします(カンマ区切り)。

- cc: CC受信者をリストします(カンマ区切り)。

- subject: メッセージの件名を追加します。

- body: メッセージの本文を追加します。

- bcc: BCC受信者をリストします(カンマ区切り)。

- attachments: 電子メールに添付するファイルの名前をリストします(カンマ区切り)。

- mimeTypes: 添付ファイルに使用するMIMEタイプをリストします(カンマ区切り)。MAFで自動的にMIMEタイプを決定するには、nullを指定します。例7-22と例7-23のように、選択した添付ファイルのMIMEタイプのみを指定することもできます。

デバイスの電子メール・インタフェースが表示されたら、ユーザーは電子メールを送信するか、それを取り消すことができます。デバイスとキャリアの制限により、電子メールは自動的に送信できません。実際に電子メールを送信できるのは、エンド・ユーザーのみです。また、電子メールを送信するには、1つ以上の電子メール・アカウントを構成する必要があります。アカウントが構成されていない場合、電子メール・アカウントが見つからないことを示すエラーが表示されます。

注意:

sendEmailメソッドのタイムアウト値は、5分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

注意:

Androidでは、エンド・ユーザーが電子メールの編集中にアプリケーションを切り替えて、その後元に戻すと、電子メールの編集画面は表示されなくなります。かわりに、そのメッセージは下書きとして保存され、手動で選択して編集を続けることができます。

DeviceFeaturesデータ・コントロールを使用してsendEmail操作をカスタマイズするには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからsendEmail操作をページ・デザイナ上にドラッグし、パラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスの電子メール・インタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに事前に値が移入され、送信準備が整った電子メールが表示されます。

図7-13は、ページ上の編集可能なフォームを使用して電子メールを送信するためのバインディングを示しています。

図7-13 デザインタイムで編集可能なフォームを使用して電子メールを送信するためのバインディング

例7-22と例7-23は、エンド・ユーザーがデバイスの電子メール・インタフェースを使用して電子メール・メッセージを送信することを可能にするコード例を示しています。

sendEmailメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。

例7-22 sendEmailのJavaScriptコード例

// Populate an email to 'ann.li@example.com',
// copy 'joe.jones@example.com', with the
// subject 'Test message', and the body 'This is a test message'
// No BCC recipients or attachments
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});

// Populate the same email as before, but this time, also BCC
// 'john.smith@example.com' & 'jane.smith@example.com' and attach two files.
// By not specifying a value for the mimeTypes parameter, you are telling
// ADFMobile to automatically determine the MIME type for each of the attachments.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});

// For iOS only: Same as previous email, but this time, explicitly specify
// all the MIME types.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: "text/plain,image/png"});

// For iOS only: Same as previous email, but this time, only specify
// the MIME type for the second attachment and let the system determine
// the MIME type for the first one.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: ",image/png"});

// For Android only: Same as previous e-mail, but this time, explicitly specify
// the MIME type.
adf.mf.api.sendEmail({to: "ann.li@example.com",
cc: "joe.jones@example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@example.com,jane.smith@example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: "image/*"});
// You can also use "plain/text" as the MIME type as it just determines the type
// of applications to be filtered in the application chooser dialog.

例7-23 sendEmailのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Populate an email to 'ann.li@example.com', copy 'joe.jones@example.com', with the
// subject 'Test message', and the body 'This is a test message'.
// No BCC recipients or attachments.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
null,
null,
null);

// Populate the same email as before, but this time, also BCC
// 'john.smith@example.com' & 'jane.smith@example.com' and attach two files.
// By specifying null for the mimeTypes parameter, you are telling
// ADFMobile to automatically determine the MIME type for each of the attachments.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
null);

// Same as previous email, but this time, explicitly specify all the MIME types.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
"text/plain,image/png");

// Same as previous email, but this time, only specify the MIME type for the
// second attachment and let the system determine the MIME type for the first one.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@example.com",
"joe.jones@example.com",
"Test message",
"This is a test message",
"john.smith@example.com,jane.smith@example.com",
"path/to/file1.txt,path/to/file2.png",
",image/png");

7.11.4 createContactメソッドを使用してコンタクト先の作成を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるcreateContactメソッドをMAFアプリケーションで使用すると、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーが新しいコンタクト先を作成してデバイスのアドレス帳に保存できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてContactのフィールドに事前にデータを移入できます。例7-25のように、createContactメソッドはContactオブジェクトをパラメータとして使用し、作成されたContactオブジェクトを戻します。

createContactメソッドとContactオブジェクトの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。Contactのプロパティについては、第7.11.5項「findContactsメソッドを使用してコンタクト先の検索を可能にする方法」も参照してください。

注意:

createContactメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

注意:

nullのContactオブジェクトがメソッドに渡された場合、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してcreateContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからcreateContact操作をドラッグし、リンクまたはボタンとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、createContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、Java BeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してcreateContact操作を実行できます。例7-24は、Contactオブジェクトを作成するためのマネージドBeanコードの例を示しています。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるcreateContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。createContact操作を実行すると、結果がこのフォームに表示されます。

例7-24 Contactオブジェクトを作成するためのマネージドBeanコード

private Contact contactToBeCreated;

public void setContactToBeCreated(Contact contactToBeCreated)
{
this.contactToBeCreated = contactToBeCreated;
}

public Contact getContactToBeCreated()
{
String givenName = "Mary";
String familyName = "Jones";
String note = "Just a Note";
String phoneNumberType = "mobile";
String phoneNumberValue = "650-555-0111";
String phoneNumberNewValue = "650-555-0199";
String emailType = "home";
String emailTypeNew = "work";
String emailValue = "Mary.Jones@example.com";
String addressType = "home";
String addressStreet = "500 Barnacle Pkwy";
String addressLocality = "Redwood Shores";
String addressCountry = "USA";
String addressPostalCode = "94065";
ContactField[] phoneNumbers = null;
ContactField[] emails = null;
ContactAddresses[] addresses = null;

/*
* Create contact
*/
this.contactToBeCreated = new Contact();

ContactName name = new ContactName();
name.setFamilyName(familyName);
name.setGivenName(givenName);
this.contactToBeCreated.setName(name);

ContactField phoneNumber = new ContactField();
phoneNumber.setType(phoneNumberType);
phoneNumber.setValue(phoneNumberValue);

phoneNumbers = new ContactField[] { phoneNumber };

ContactField email = new ContactField();
email.setType(emailType);
email.setValue(emailValue);

emails = new ContactField[] { email };

ContactAddresses address = new ContactAddresses();
address.setType(addressType);
address.setStreetAddress(addressStreet);
address.setLocality(addressLocality);
address.setCountry(addressCountry);

addresses = new ContactAddresses[] { address };

this.contactToBeCreated.setNote(note);
this.contactToBeCreated.setPhoneNumbers(phoneNumbers);
this.contactToBeCreated.setEmails(emails);
this.contactToBeCreated.setAddresses(addresses);

return this.contactToBeCreated;
}

例7-25と例7-26は、エンド・ユーザーがデバイスにコンタクト先を作成することを可能にするコード例を示しています。

例7-25 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);
}

例7-26 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);

7.11.5 findContactsメソッドを使用してコンタクト先の検索を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるfindContactsメソッドをMAFアプリケーションで使用すると、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳から1つ以上のコンタクト先を検索できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてfindContactsのフィールドに事前にデータを移入できます。findContactsメソッドでは、フィルタ文字列と検索する(そして、見つかったコンタクト先の一部として戻す)フィールド名のリストを使用します。フィルタ文字列には、コンタクト先内の検索する任意の項目を指定できます。findContactsメソッドの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。

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操作を実行すると、結果がこのフォームに表示されます。

例7-27は、findContactsメソッドに指定できる引数値を示しています。例7-28と例7-29は、姓でコンタクト先を検索し、コンタクト先の名前、電話番号、電子メール、住所およびメモを取得する方法を示しています。

例7-27 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としてメソッドに渡された場合、例外がスローされます。

例7-28 findContactsのJavaScriptコード例

var filter = ["name", "phoneNumbers", "emails", "addresses", "note"];

var options = new ContactFindOptions();
options.filter="FamilyName";

// Contacts, like many other device-specific features, are accessed from
// the global 'navigator' object in JavaScript.
navigator.contacts.find(filter, onSuccess, onFail, options);

function onSuccess(contacts)
{
alert ("Find Contact call succeeded! Number of contacts found = " + contacts.length);
}

function onFail(Error)
{
alert("Find Contact failed: " + Error.code);
}

例7-29 findContactsのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Find Contact - Find contact by family name.
*
* See if we can find the contact that we just created.
*/

String familyName = "FamilyName"

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses,note", familyName, true);

7.11.6 updateContactメソッドを使用してコンタクト先の更新を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるupdateContactメソッドをMAFアプリケーションで使用すると、コンタクト先を管理するためにデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳に含まれるコンタクト先を更新できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてupdateContactのフィールドに事前にデータを移入できます。例7-30のように、updateContactメソッドはContactオブジェクトをパラメータとして使用し、更新されたContactオブジェクトを戻します。

updateContactメソッドとContactオブジェクトの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。Contactのプロパティについては、第7.11.5項「findContactsメソッドを使用してコンタクト先の検索を可能にする方法」も参照してください。

注意:

入力パラメータとして必要なContactオブジェクトは、第7.11.5項「findContactsメソッドを使用してコンタクト先の検索を可能にする方法」の説明に従ってfindContactsメソッドを使用することによって検索できます。nullのContactオブジェクトがメソッドに渡された場合、例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してupdateContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからupdateContact操作をドラッグし、リンクまたはボタンとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、updateContact操作に対するContactオブジェクトのパラメータを入力するよう求められます。このパラメータは、Java BeanクラスからContactを戻すために使用されるマネージドBeanのプロパティを参照するEL式である必要があります。マネージドBeanにContactオブジェクトのゲッターがすでに含まれている場合は、EL式ビルダーを使用して、パラメータの値を設定できます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してupdateContact操作を実行できます。例7-24は、Contactオブジェクトを作成するためのマネージドBeanコードの例を示しています。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるupdateContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。updateContact操作を実行すると、結果がこのフォームに表示されます。

例7-30と例7-32は、コンタクト先の電話番号を更新する方法を示しています。例7-31と例7-33は、コンタクト先に別の電話番号を追加する方法を示しています。

例7-30 updateContactのJavaScriptコード例

function updateContact(contact)
{
try
{
if (null != contact.phoneNumbers)
{
alert("Number of phone numbers = " + contact.phoneNumbers.length);
var numPhoneNumbers = contact.phoneNumbers.length;
for (var j = 0; j < numPhoneNumbers; j++)
{
alert("Type: " + contact.phoneNumbers[j].type + "\n" +
"Value: "  + contact.phoneNumbers[j].value + "\n" +
"Preferred: "  + contact.phoneNumbers[j].pref);

contact.phoneNumbers[j].type = "mobile";
contact.phoneNumbers[j].value = "408-555-0100";
}

// save
contact.save(onSuccess, onFailure);
}
else
{
//alert ("No phone numbers found in the contact.");
}
}
catch(e)
{
alert("updateContact - ERROR: " + e.description);
}
}

function onSuccess()
{
alert("Update Contact successful.");
}

function onFailure(Error)
{
alert("Update Contact failed: " + Error.code);

例7-31は、既存の電話番号に別の電話番号を追加する方法を示しています。

例7-31 updateContactを使用して電話番号を追加するためのJavaScriptコード例

function updateContact(contact)
{
try
{
var phoneNumbers = [1];
phoneNumbers[0] = new ContactField('home', '650-555-0123', true);
contact.phoneNumbers = phoneNumbers;

// save
contact.save(onSuccess, onFailure);
}
catch(e)
{
alert("updateContact - ERROR: " + e.description);
}
}

function onSuccess()
{
alert("Update Contact successful.");
}

function onFailure(Error)
{
alert("Update Contact failed: " + Error.code);
}

例7-32は、コンタクト先の電話番号、電子メール・タイプおよび郵便番号を更新する方法を示しています。

例7-32 updateContactのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Update Contact - Updating phone number, email type, and adding address postal code
*/
String familyName = "FamilyName";
String phoneNumberNewValue = "650-555-0123";
String emailTypeNew = "work";
String addressPostalCode = "91234";

Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses,note", familyName, true);

// Assuming there was only one contact returned, we can use the first contact in the array.
// If more than one contact is returned then we have to filter more to find the exact contact
// we need to update.

foundContacts[0].getPhoneNumbers()[0].setValue(phoneNumberNewValue);
foundContacts[0].getEmails()[0].setType(emailTypeNew);
foundContacts[0].getAddresses()[0].setPostalCode(addressPostalCode);

Contact updatedContact = DeviceManagerFactory.getDeviceManager().updateContact(foundContacts[0]);

例7-33は、既存の電話番号に別の電話番号を追加する方法を示しています。

例7-33 updateContactを使用して電話番号を追加するためのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

String additionalPhoneNumberValue = "408-555-0123";
String additionalPhoneNumberType = "mobile";
// Create a new phoneNumber that will be appended to the previous one.
ContactField additionalPhoneNumber = new ContactField();
additionalPhoneNumber.setType(additionalPhoneNumberType);
additionalPhoneNumber.setValue(additionalPhoneNumberValue);

foundContacts[0].setPhoneNumbers(new ContactField[] { additionalPhoneNumber });

// Access device features in Java code by acquiring an instance of the DeviceManager
// from the DeviceManagerFactory.
Contact updatedContact = DeviceManagerFactory.getDeviceManager().updateContact(foundContacts[0]);

注意:

updateContactメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

7.11.7 removeContactメソッドを使用してコンタクト先の削除を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるremoveContactメソッドをMAFアプリケーションで使用すると、コンタクト先を管理するためのデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳からコンタクト先を削除できるようにすることが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてremoveContactのフィールドに事前にデータを移入できます。例7-34のように、removeContactメソッドはContactオブジェクトをパラメータとして使用します。

注意:

入力パラメータとして必要なContactオブジェクトは、第7.11.5項「findContactsメソッドを使用してコンタクト先の検索を可能にする方法」の説明に従ってfindContactsメソッドを使用することによって検索できます。

DeviceFeaturesデータ・コントロールを使用してremoveContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからremoveContact操作をドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、removeContact操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してremoveContact操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なContactのフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してremoveContact操作を実行できます。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるremoveContact操作の下からドラッグし、フォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。removeContact操作を実行すると、結果がこのフォームに表示されます。

例7-34と例7-35は、findContactsを使用して検索したコンタクト先を削除する方法を示しています。removeContactメソッドとContactオブジェクトの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。

注意:

Androidでは、removeContact操作を実行しても完全にはコンタクト先が削除されません。removeContactメソッドをコールしてコンタクト先を削除すると、「(不明)」の付いた名前がアプリケーション内のコンタクト先リストに表示されます。

例7-34 removeContactのJavaScriptコード例

// Remove the contact from the device
contact.remove(onSuccess,onError);

function onSuccess()
{
alert("Removal Success");
}

function onError(contactError)'
{
alert("Error = " + contactError.code);
}

例7-35 removeContactのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Remove the contact from the device
*/
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses", familyName, true);

// Assuming there is only one contact returned, we can use the first contact in the array.
// If more than one contact is returned we will have to filter more to find the
// exact contact we want to remove.

// Access device features in Java code by acquiring an instance of the DeviceManager
// from the DeviceManagerFactory.
DeviceManagerFactory.getDeviceManager().removeContact(foundContacts[0]);

注意:

removeContactメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

7.11.8 startLocationMonitorメソッドを使用して地理的位置を有効にする方法

DeviceFeaturesデータ・コントロールに含まれるstartLocationMonitorメソッドをMAFアプリケーションで使用すると、デバイスの地理的位置サービスを活用して、デバイスの場所を取得および追跡することが可能です。MAFでは、デバイスのインタフェースを表示し、必要に応じてstartLocationMonitorのフィールドに事前にデータを移入できます。

MAFで公開されているAPIを使用すると、デバイスの現在の位置を取得できるため、特定の時点におけるデバイスの現在の位置を取得したり、定期的にその情報をサブスクライブできます。例7-36と例7-37は、アプリケーションでデバイスの位置の取得を可能にするコード例を示しています。startLocationMonitorメソッドについては、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。

注意:

Android 2.nシミュレータは、enableHighAccuracyオプションがtrueに設定されていなければ、地理的位置の結果を返しません。

altitudeAccuracyプロパティは、Androidデバイスでサポートされていません。

Androidプラットフォームでは、iOSほど頻繁に更新が行われません。

DeviceFeaturesデータ・コントロールを使用してデバイスの位置の変更をリスニングするには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからstartLocationMonitor操作をページ・デザイナ上にドラッグし、リンクまたはボタンとしてドロップします。アクションの編集ダイアログによって要求されたら、次のようにフィールドに値を移入します。

- enableHighAccuracy: trueの場合、位置の修正を最も正確に取得できるメソッドを使用します。これは単なるヒントであり、オペレーティング・システムでは考慮されない場合があります。多くの場合、デバイスには、携帯電話基地局の三角測量、Wi-Fiホットスポットの参照、実際のGPSなど、位置の修正を取得するためのいくつかの異なるメカニズムがあります。falseを指定すると、正確性の低い位置を受け入れることになりますが、この場合、レスポンスの速度が向上し、消費電力が低下する可能性があります。

- updateInterval: 更新の受信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムでは、デバイスの位置の大きな変更が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。

- locationListener: 次のシグネチャを含むBeanメソッドに解決されるEL式。

void methodName(Location newLocation)

このEL式は、位置の更新を受信するたびに評価されます。たとえば、viewScope.LocationListenerBean.locationUpdated(#{}で囲みません)と入力した後、LocationListenerBeanというBeanをviewScope内に定義し、次のシグネチャを含むメソッドを実装します。

public void locationUpdated(Location currentLocation)
{
System.out.println(currentLocation);
// To stop subscribing to location updates, invoke the following:
// DeviceManagerFactory.getDeviceManager().clearWatchPosition(
//     currentLocation.getWatchId());
}

注意:

EL式の評価結果としてlocationListenerの名前が必要でないかぎり、locationListenerを指定するためにEL構文#{LocationListenerBean.locationUpdate}を使用しないでください。

例7-36は、デバイスの位置の変更を定期的にサブスクライブする方法を示しています。この例で使用するDeviceManager.startUpdatingPositionメソッドのパラメータは、次のとおりです。

- int updateInterval: 位置の更新の配信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムでは、デバイスの位置の大きな変更が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。逆に言えば、位置の更新は指定した頻度で配信されることもありますが、デバイスの位置が大きく変更されるまで、配信される位置が変化しない場合があります。

- boolean enableHighAccuracy: trueに設定された場合、位置の修正を最も正確に取得できるメソッドを使用します。

- String watchID: 後から位置の更新のサブスクライブを停止するために使用できる一意のIDを定義します。

- GeolocationCallback: GeolocationCallbackインタフェースの実装。例7-36のように、この実装のlocationUpdatedメソッドは、位置が更新されるたびに起動されます。

JavaScriptを使用してデバイスの位置の変更をサブスクライブする方法の例は、Cordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。

locationListenerによって指定されたコールバック関数内に戻されるパラメータは、次のとおりです。

- double getAccuracy: m単位の緯度と経度を示す座標の精度レベル。

- double getAltitude: m単位の楕円体高度。

- double getLatitude: 10進度単位の緯度。

- double getLongitude: 10進度単位の経度。

- double getAltitudeAccuracy: m単位の高度座標の精度レベル。

- double getHeading: 真北から時計回りに計測した度単位で示される進行方向

- double getSpeed: m/秒単位で指定される、デバイスの現在の対地速度

- long getTimestamp: Unixエポックからのミリ秒単位の経過時間で示されるタイムスタンプの作成

- String getWatchId: 定期的な位置の更新をサブスクライブするときのみ使用します。後から位置の更新のサブスクライブを停止するために使用できる一意のID

startLocationMonitorメソッドとstartHeadingMonitorメソッドの詳細は、MAF JavadocのDeviceDataControlクラスおよびCordovaのドキュメント(http://cordova.apache.org/docs/en/2.2.0/index.html)を参照してください。

注意:

startLocationMonitorメソッドとstartHeadingMonitorメソッドのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

例7-36 地理的位置を使用したデバイスの位置の変更のサブスクライブ

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;
import oracle.adf.model.datacontrols.device.GeolocationCallback;
import oracle.adf.model.datacontrols.device.Location;

// Subscribe to location updates that will be delivered every 20 seconds, with high accuracy.
// As you can have multiple subscribers, let's identify this one as 'MyGPSSubscriptionID'.
// Notice that this call returns the watchID, which is usually the same as the watchID passed in.
// However, it may be different if the specified watchID conflicts with an existing watchID,
// so be sure to always use the returned watchID.
String watchID = DeviceManagerFactory.getDeviceManager().startUpdatingPosition(20000, true, "
"MyGPSSubscriptionID", new GeolocationCallback() {
public void locationUpdated(Location position) {
System.out.println("Location updated to: " + position);
}
});

// The previous call returns immediately so that you can continue processing.
// When the device's location changes, the locationUpdated() method specified in
// the previous call will be invoked in the context of the current feature.

// When you wish to stop being notified of location changes, call the following method:
DeviceManagerFactory().getDeviceManager().clearWatchPosition(watchID);

DeviceFeaturesデータ・コントロールを使用してデバイスの位置を取得するには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからstartLocationMonitor操作をページ・デザイナ上にドラッグし、リンクまたはボタンとしてドロップします。例7-36に従いますが、最初の位置の変更を受信した後、リスニングを停止します。

例7-37は、デバイスの位置を1回取得する方法を示しています。この例で使用するDeviceManager.getCurrentPositionメソッドのパラメータは、次のとおりです。

- int maximumAge: ミリ秒単位で指定したこの値より古くないキャッシュ値を受け入れます。位置の修正をこの時間内に取得した場合、その情報がすぐに戻されますが、それ以外の場合、コールは新しい位置の修正が確定するまでブロックされます。maximumAgeパラメータの値は、1000ミリ秒以上である必要があります。これより小さい値は、自動的に1000ミリ秒に設定されます。

- boolean: enableHighAccuracy trueに設定された場合、位置の修正を最も正確に取得できるメソッドを使用します。

例7-37 地理的位置を使用したデバイスの現在位置の取得(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());

7.11.9 displayFileメソッドを使用してファイルの表示を可能にする方法

DeviceFeaturesデータ・コントロールに含まれるdisplayFileメソッドを使用すると、MAFアプリケーションでデバイスのローカル・ファイルを表示できます。プラットフォームに応じて、アプリケーション・ユーザーはPDF、イメージ・ファイル、Microsoft Officeドキュメントおよびその他の様々なファイル・タイプを表示できます。iOSでは、アプリケーション・ユーザーは、サポートされているファイルをMAFアプリケーション内でプレビューできます。またユーザーは、それらのファイルをサードパーティ・アプリケーションで開く、電子メールで送信する、プリンタに送信するなどの操作を行うこともできます。Androidでは、すべてのファイルがサードパーティ・アプリケーション内で開かれます。つまり、アプリケーション・ユーザーは、ファイルを表示しながらMAFアプリケーションから離れることができます。ユーザーは、Androidの戻るボタンを押すことによって、MAFアプリケーションに戻ることができます。所定のファイルを開くことができるアプリケーションがデバイス内に存在しない場合は、エラーが表示されます。displayFileメソッドを使用してiOSデバイスとAndroidデバイスの両方でファイルを開く方法の例は、DeviceDemoサンプル・アプリケーションを参照してください。このアプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内で次の場所にあるPublicSamples.zipファイルから入手できます。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

displayFileメソッドの機能は、デバイスのローカル・ファイルを表示することのみです。つまり、リモート・ファイルは最初にダウンロードする必要があります。ダウンロードされたファイルの格納先であるディレクトリ・ルートに戻るには、AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory)をコールします。iOSでは、この場所はアプリケーションによって異なりますが、Androidでは、この場所として外部ストレージ・ディレクトリが参照されます。この外部ストレージ・ディレクトリは公的にアクセス可能であるため、サードパーティ・アプリケーションを使用して、そこに格納されているファイルを読み取ることができます。

表7-7 サポートされるファイル・タイプ

iOS

Android

サポートされるファイル・タイプの詳細は、Apple iOS開発サイト(http://developer.apple.com/library/ios/navigation/)にある、Quick Lookプレビュー・コントローラに関するドキュメントを参照してください。

特定のMIMEタイプがデバイスにインストールされている場合、このフレームワークによって、そのタイプに関連付けられたビューアが起動されます。特定のファイル・タイプを表示するためのフレームワークは組み込まれていません。そのファイル・タイプを開くことができるアプリケーションがデバイスにインストールされていない場合は、MAFアプリケーションによってエラーが表示されます。

iWorkドキュメント

Microsoft Officeドキュメント(Office 97以降)

リッチ・テキスト・フォーマット(RTF)ドキュメント

PDFファイル

イメージ

Uniform Type Identifier (UTI)がpublic.text typeに準拠しているテキスト・ファイル

カンマ区切り(csv)ファイル

DeviceFeaturesデータ・コントロールを使用してdisplayFile操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからdisplayFile操作をドラッグし、リンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、displayFile操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してdisplayFile操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してdisplayFile操作を実行できます。

例7-38は、displayFileメソッドを使用してファイルを表示する方法を示しています。displayFileメソッドの詳細は、MAF JavadocのDeviceDataControlクラスを参照してください。

例7-38 displayFileのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

URL remoteFileUrl;
InputStream is;
BufferedOutputStream fos;
try {

// Open connection to remote file; fileUrl here is a String containing the URL to the remote file.
remoteFileUrl = new URL(fileUrl);
URLConnection connection = remoteFileUrl.openConnection();
is = new BufferedInputStream(connection.getInputStream());
// Saving the file locally as 'previewTempFile.<extension>'
String fileExt = fileUrl.substring(fileUrl.lastIndexOf('.'), fileUrl.length());
String tempFile = "/previewTempFile" + fileExt;
File localFile = null;
// Save the file in the DownloadDirectory location
localFile = new File(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory) + tempFile);
if (localFile.exists()) {
localFile.delete();
}
// Use buffered streams to download the file.
fos = new BufferedOutputStream(new FileOutputStream(localFile));
byte[] data = new byte[1024];
int read = 0;
while ((read = is.read(data)) != -1) {
fos.write(data, 0, read);
}
is.close();
fos.close();

// displayFile takes a URL string which has to be encoded on iOS.
// iOS does not handle "+" as an encoding for space (" ") but
// expects "%20" instead.  Also, the leading slash MUST NOT be
// encoded to "%2F".  We will revert it to a slash after the
// URLEncoder converts it to "%2F".
StringBuffer buffer = new StringBuffer();
String path = URLEncoder.encode(localFile.getPath(), "UTF-8");
// replace "+" with "%20"
String replacedString = "+";
String replacement = "%20";
int index = 0, previousIndex = 0;
index = path.indexOf(replacedString, index);
while (index != -1) {
buffer.append(path.substring(previousIndex, index)).append(replacement);
previousIndex = index + 1;
index = path.indexOf(replacedString, index + replacedString.length());
}
buffer.append(path.substring(previousIndex, path.length()));
// Revert the leading encoded slash ("%2F") to a literal slash ("/").
if (buffer.indexOf("%2F") == 0) {
buffer.replace(0, 3, "/");
}

// Create URL and invoke displayFile with its String representation.
URL localURL = null;
if (Utility.getOSFamily() == Utility.OSFAMILY_ANDROID) {
localURL = new URL("file", "localhost", localFile.getAbsolutePath());
}
else if (Utility.getOSFamily() == Utility.OSFAMILY_IOS)
{
localURL = new URL("file", "localhost", buffer.toString());
}
DeviceManagerFactory.getDeviceManager().displayFile(localURL.toString(), "remote file");
} catch (Throwable t) {
System.out.println("Exception caught: " + t.toString());
}

7.11.10 デバイス・プロパティ

アプリケーションには、特定のデバイスの特性や機能に依存する機能が含まれる場合があります。たとえば、デバイスの画面の向きによって異なるユーザー・インタフェースを提示したり、デバイスで地理的位置がサポートされる場合のみマッピング機能を有効にすることなどが考えられます。MAFでは、このような動的な動作をサポートするためにJava、JavaScriptおよびELからアクセスできる、様々なプロパティが提供されます。表7-8に、これらのプロパティをリストし、問合せ方法、予期される戻り値およびアプリケーションのライフサイクル中にそのプロパティが変更される可能性があるかどうかに関する情報も提供します。例7-39は、JavaScriptを使用してこれらのプロパティにアクセスする方法の例を示しています。

注意:

デバイス・プロパティのタイムアウト値は、1分に設定されます。デバイス操作に、許可されたタイムアウトよりも長い時間がかかった場合は、タイムアウト・エラーが表示されます。

表7-8 デバイス・プロパティと対応するEL式

プロパティ

静的/
動的

EL式

サンプル値

Java API

device.name

静的

#{deviceScope.device.name}

"iPhone Simulator"、"Joe Smith's iPhone"

DeviceManager.getName()

device.platform

静的

#{deviceScope.device.platform}

"iPhone Simulator", "iPhone"

DeviceManager.getPlatform()

device.version

静的

#{deviceScope.device.version}

"4.3.2", "5.0.1"

DeviceManager.getVersion()

device.os

静的

#{deviceScope.device.os}

"iOS"

DeviceManager.getOs()

device.model

静的

#{deviceScope.device.model}

"x86_64", "i386", "iPhone3,1"

DeviceManager.getModel()

device.phonegap

静的

#{deviceScope.device.phonegap}

"1.0.0"

DeviceManager.getPhonegap()

hardware.hasCamera

静的

#{deviceScope.hardware.hasCamera}

"true", "false"

DeviceManager.hasCamera()

hardware.hasContacts

静的

#{deviceScope.hardware.hasContacts}

"true", "false"

DeviceManager.hasContacts()

hardware.hasTouchScreen

静的

#{deviceScope.hardware.hasTouchScreen}

"true", "false"

DeviceManager.hasTouchScreen()

hardware.hasGeolocation

静的

#{deviceScope.hardware.hasGeolocation}

"true", "false"

DeviceManager.hasGeolocation()

hardware.hasAccelerometer

静的

#{deviceScope.hardware.hasAccelerometer}

"true", "false"

DeviceManager.hasAccelerometer()

hardware.hasCompass

静的

#{deviceScope.hardware.hasCompass}

"true", "false"

DeviceManager.hasCompass()

hardware.hasFileAccess

静的

#{deviceScope.hardware.hasFileAccess}

"true", "false"

DeviceManager.hasFileAccess()

hardware.hasLocalStorage

静的

#{deviceScope.hardware.hasLocalStorage}

"true", "false"

DeviceManager.hasLocalStorage()

hardware.hasMediaPlayer

静的

#{deviceScope.hardware.hasMediaPlayer}

"true", "false"

DeviceManager.hasMediaPlayer()

hardware.hasMediaRecorder

静的

#{deviceScope.hardware.hasMediaRecorder}

"true", "false"

DeviceManager.hasMediaRecorder()

hardware.networkStatus

動的

#{deviceScope.hardware.networkStatus}

"wifi"、"2g"、"unknown"、"none"脚注 1

DeviceManager.getNetworkStatus()

hardware.screen.width

動的

#{deviceScope.hardware.screen.width}

320, 480

DeviceManager.getScreenWidth()

hardware.screen.height

動的

#{deviceScope.hardware.screen.height}

480, 320

DeviceManager.getScreenHeight()

hardware.availableWidth

動的

#{deviceScope.hardware.screen.availableWidth}

<= 320, <= 480

DeviceManager.getAvailableScreenWidth()

hardware.availableHeight

動的

#{deviceScope.hardware.screen.availableHeight}

<= 480, <= 320

DeviceManager.getAvailableScreenHeight()

hardware.screen.dpi

静的

#{deviceScope.hardware.screen.dpi}

160, 326

DeviceManager.getScreenDpi()

hardware.screen.diagonalSize

静的

#{deviceScope.hardware.screen.diagonalSize}

9.7, 6.78

DeviceManager.getScreenDiagonalSize()

hardware.screen.scaleFactor

静的

#{deviceScope.hardware.screen.scaleFactor}

1.0, 2.0

DeviceManager.getScreenScaleFactor()

脚注 1  wifiと2Gの両方が有効になっている場合、wifiが2Gよりも優先されるため、ネットワーク・ステータスはwifiになります。

例7-39は、JavaScriptを使用してデバイス・プロパティにアクセスする方法を示しています。

例7-39 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>

7.12 属性の検証

モバイル・アプリケーション・フレームワークでは、バインディング属性に設定された検証ルールを使用してデータ・コントロール・レイヤーで検証が行われます。属性の検証は、バインディングに対するsetValue操作中に、システム内の単一点で実行されます。

データ・コントロールによって公開される属性に対して、次のバリデータを定義できます。

- 比較バリデータ

- 長さバリデータ

- リスト・バリデータ

- 範囲バリデータ

特定の属性に対してすべてのバリデータが実行され、成功しないすべてのバリデータに対してネストされた例外がスローされます。属性の検証メッセージを定義し、実行時に検証ルールを起動するときに表示できます。詳細は、第6.9項「入力の検証」と第7.12.1項「検証ルールの追加方法」を参照してください。

注意:

JSONの制限により、BigDecimalが保持できる値はDoubleの範囲内となり、BigIntegerが保持できる値はLongの範囲内となります。許可された値よりも大きい数値を使用するには、toStringをBigDecimalまたはBigIntegerでコールし、値をStringとしてシリアライズ(解除)します。

表7-9に、長さバリデータでサポートされる検証の組合せをリストします。

表7-9 長さの検証

比較タイプ

バイト

文字

Equals

サポート

サポート

Not Equals

サポート

サポート

Less Than

サポート

サポート

Greater Than

サポート

サポート

Less Than Equal To

サポート

サポート

Greater Than Equal To

サポート

サポート

Between

サポート

サポート

表7-10と表7-11に、範囲バリデータでサポートされる検証の組合せを示します。

表7-10 範囲検証

比較タイプ

バイト

文字

倍精度

浮動小数

整数

長整数

短整数

Between

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Not Between

サポート

サポート

サポート

サポート

サポート

サポート

サポート

表7-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

サポート

サポート

未サポート

未サポート

未サポート

未サポート

表7-12に、リスト・バリデータでサポートされる検証の組合せをリストします。

表7-12 リスト検証

比較タイプ

文字列

In

サポート

Not In

サポート

表7-13と表7-14に、比較バリデータでサポートされる検証の組合せを示します。

表7-13 比較検証

比較タイプ

バイト

文字

倍精度

浮動小数

整数

長整数

短整数

文字列

Equals

サポート

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Not Equals

サポート

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Less Than

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Greater Than

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Less Than Equal To

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Greater Than Equal To

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

表7-14 比較検証: java.math、java.sqlおよびjava.utilパッケージ

比較タイプ

java.math.BigDecimal

java.math.BigInteger

java.sql.Date

java.sql.Time

java.sql.Timestamp

java.util.Date

Equals

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Not Equals

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Less Than

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Greater Than

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Less Than Equal To

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Greater Than Equal To

サポート

サポート

未サポート

未サポート

未サポート

未サポート

7.12.1 検証ルールの追加方法

検証ルールは、様々なユース・ケースに合わせて定義できます。宣言的検証ルールをエンティティ・オブジェクトに追加するには、データ・コントロール構造ファイルの「概要」エディタにある「属性」ページを使用します。

検証規則を追加するには:

1. 「データ・コントロール」パネルで、データ・コントロール・オブジェクトを右クリックして「定義の編集」を選択します。

2. データ・コントロール構造ファイルの「概要」エディタで、「属性」ページを選択します。

3. ページの下部にある「検証ルール」タブを選択し、「追加」をクリックします。表示された「検証ルールの追加」ダイアログで、検証ルールと失敗処理を定義します。

7.12.2 バリデータのメタデータに関する必知事項

バリデータのメタデータは、設計時にデータ・コントロール構造のメタデータXMLファイル内に配置されます。例7-40は、サンプルの長さバリデータを示しています。

例7-40 メタデータ・ファイル内で宣言された長さバリデータ

<?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>

7.13 データ変更イベントについて

JDeveloperでは、データ変更イベントを単純化するために、プロパティ変更リスナー・パターンを使用します。多くの場合、JDeveloperを使用して、Beanのプロパティ・アクセッサから通知をソースとして参照するために必要なコードを生成できます。これを行うには、「アクセッサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェックボックスを選択します(詳細は第7.3.5.2項「マネージドBeanカテゴリについて」を参照)。PropertyChangeSupportオブジェクトが自動的に生成され、新たに生成されたsetterメソッドにfirePropertyChangeへのコールが含まれます。また、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドが追加されるため、プロパティ変更リスナーは、このオブジェクトを使用して自身を登録および登録解除できます。これを使用してフレームワークはクライアント・キャッシュにプッシュする変更を取得し、データが変更されたことをユーザー・インタフェース・レイヤーに通知します。

注意:

PropertyChangeSupportオブジェクトを手動でクラスに追加する場合は、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドも(これらの明示的なメソッド名を使用して)含める必要があります。

プロパティ変更のみでは、すべてのデータ変更通知は解決されません。たとえば、データ・コントロールによってラップされたBeanがあり、アイテムのコレクションの公開が必要な場合が考えられます。リストの個々のアイテムが変更されたときはプロパティ変更で十分ですが、カーディナリティが変更されたときは十分ではありません。この場合、コレクション全体のプロパティ変更を起動すると、パフォーマンスが低下する可能性があるため、かわりにコレクションのデルタのみを更新します。これを行うには、ProviderChangeSupportクラスを使用して、単純なプロパティ変更に必要なデータよりも多くのデータを公開する必要があります。

注意:

ProviderChangeSupportオブジェクトは、自動的には生成されません。このオブジェクトは、手動でaddProviderChangeListenerおよびremoveProviderChangeListenerメソッドとともに(これらの明示的なメソッド名を使用して)クラスに追加する必要があります。

プロバイダ変更は、データ・コントロールによってラップされたBeanで公開されている動的なコレクションを保持しているときのみ必要になるため、起動するプロバイダ変更イベントは、次のいくつかのタイプのみになります。

- fireProviderCreate: 新しい要素をコレクションに追加する場合

- fireProviderDelete: 要素をコレクションから削除する場合

- fireProviderRefresh: 同時に複数の変更をコレクションに加え、単純にクライアントにコレクション全体のリフレッシュを要求した方がよいと判断した場合(これは一括操作でのみ使用する必要があります)

ProviderChangeSupportクラスは、コレクション要素に関連する通知を送信するために使用され、これによって、Java Beanデータ・コントロール内で変更が発生したときにコンポーネントを適切に更新できます。このクラスが従うパターンは、自動的に生成されるPropertyChangeSupportクラスと似ていますが、ProviderChangeSupportとともに使用されるイベント・オブジェクトでは、操作のタイプや変更された要素のキーと位置などの詳細情報を送信します。ProviderChangeSupportでは、コレクションに対する要素(プロバイダ)の追加や削除など、コレクションに対する構造的な変更を取得します。PropertyChangeSupportでは、コレクション内の個々のアイテムに対する変更を取得します。

例7-41は、ProviderChangeSupportを使用して、コレクションの要素に対する構造的な変更(子を追加または削除する場合など)に関する通知を送信する方法を示しています。ProviderChangeListenerインタフェースとProviderChangeEventクラスの詳細は、MAF Javadocを参照してください。

例7-41 ProviderChangeSupportのコード例

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メソッドは、バックグラウンド・スレッドからのみ実行できます。

例7-42は、flushDataChangeEventメソッドを使用して保留中のデータ変更をクライアントに強制する方法を示しています。oracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

例7-42 データ変更イベントの例

/* Note – Simple POJO used by the NotePad managed bean or data control wrapped bean */

package mobile;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;

/**
* Simple note object
* uid   - unique id - generated and not mutable
* title - title for the note - mutable
* note  - note comment - mutable
*/
public class Note {
/* standard JDeveloper generated property change support */
protected transient PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);

private static boolean s_backgroundFlushTestRunning = false;

public Note() {
this("" + (System.currentTimeMillis() % 10000));
}

public Note(String id) {
this("UID-"+id, "Title-"+id, "");
}

public Note(String uid, String title, String note) {
this.uid     = uid;
this.title   = title;
this.note    = note;
}

/* update the current note with the values passed in */
public void updateNote(Note n) {
if (this.getUid().compareTo(n.getUid()) == 0) {
this.setTitle(n.getTitle());
this.setNote(n.getNote());
} else {
throw new IllegalArgumentException("note");
}
}

/* background thread to simulate some background process that make changes */
public void startNodeBackgroundThread(ActionEvent actionEvent) {
Thread backgroundThread   = new Thread() {
public void run() {
System.out.println("startBackgroundThread enter - " +
s_backgroundFlushTestRunning);

s_backgroundFlushTestRunning = true;
for(int i = 0; i <= iterations; ++i) {
try
{
System.out.println("executing " + i + " of " + iterations + "
" iterations.");

/* update a property value */
if(i == 0) {
setNote("thread starting");
}
else if( i == iterations) {
setNote("thread complete");
s_backgroundFlushTestRunning = false;
}
else {
setNote("executing " + i + " of " + iterations + " iterations.");
}
setVersion(getVersion() + 1);
setTitle("Thread Test v" + getVersion());
AdfmfJavaUtilities.flushDataChangeEvent();  /* key line */
}
catch(Throwable t)
{
System.err.println("Error in the background thread: " + t);
}

try {
Thread.sleep(delay);  /* sleep for 6 seconds */
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
};

backgroundThread.start();
}

protected String uid;
protected String title;
protected String note;
protected int    version;

protected int    iterations =  10;
protected int    delay      = 500;

/* --- JDeveloper generated accessors --- */

public void addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public String getUid() {
return uid;
}

public void setTitle(String title) {
String oldTitle = this.title;
this.title = title;
propertyChangeSupport.firePropertyChange("title", oldTitle, title);
}

public String getTitle() {
return title;
}

public void setNote(String note) {
String oldNote = this.note;
this.note = note;
propertyChangeSupport.firePropertyChange("note", oldNote, note);
}

public String getNote() {
return note;
}

public void setVersion(int version) {
int oldVersion = this.version;
this.version = version;
propertyChangeSupport.firePropertyChange("version", oldVersion, version);
}

public int getVersion() {
return version;
}

public void setIterations(int iterations) {
int oldIterations = this.iterations;
this.iterations = iterations;
propertyChangeSupport.
firePropertyChange("iterations", oldIterations, iterations);
}

public int getIterations() {
return iterations;
}

public void setDelay(int delay) {
int oldDelay = this.delay;
this.delay = delay;
propertyChangeSupport.
firePropertyChange("delay", oldDelay, delay);
}

public int getDelay() {
return delay;
}
}

/* NotePad – Can be used as a managed bean or wrapped as a data control */

package mobile;

import java.util.ArrayList;
import java.util.List;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;
import oracle.adfmf.java.beans.ProviderChangeListener;
import oracle.adfmf.java.beans.ProviderChangeSupport;

public class NotePad {
private static List     s_notes                      = null;
private static boolean  s_backgroundFlushTestRunning = false;

protected transient     PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);

protected transient     ProviderChangeSupport
providerChangeSupport = new ProviderChangeSupport(this);

public NotePad() {
if (s_notes == null) {
s_notes = new ArrayList();

for(int i = 1000; i < 1003; ++i) {
s_notes.add(new Note(""+i));
}
}
}

public  mobile.Note[] getNotes() {
mobile.Note n[] = null;

synchronized (this)
{
if(s_notes.size() > 0) {
n = (mobile.Note[])s_notes.
toArray(new mobile.Note[s_notes.size()]);
}
else {
n = new mobile.Note[0];
}
}

return n;
}

public void addNote() {
System.out.println("Adding a note ....");
Note  n = new Note();
int   s = 0;

synchronized (this)
{
s_notes.add(n);
s = s_notes.size();
}

System.out.println("firing the events");

/* update the note count property on the screen */
propertyChangeSupport.
firePropertyChange("noteCount", s-1, s);

/* update the notes collection model with the new note */
providerChangeSupport.
fireProviderCreate("notes", n.getUid(), n);

/* to update the client side model layer */
AdfmfJavaUtilities.flushDataChangeEvent();
}

public void removeNote() {
System.out.println("Removing a note ....");
if(s_notes.size() > 0) {
int     end = -1;
Note    n   = null;

synchronized (this)
{
end   = s_notes.size() - 1;
n     = (Note)s_notes.remove(end);
}

System.out.println("firing the events");

/* update the client side model layer */
providerChangeSupport.
fireProviderDelete("notes", n.getUid());

/* update the note count property on the screen */
propertyChangeSupport.
firePropertyChange("noteCount", -1, end);
}
}

public void RefreshNotes() {
System.out.println("Refreshing the notes ....");

/* update the entire notes collection on the client */
providerChangeSupport.fireProviderRefresh("notes");
}

public int getNoteCount() {
int size = 0;

synchronized (this)
{
size = s_notes.size();
}
return size;
}

public void
addProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.addProviderChangeListener(l);
}

public void
removeProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.removeProviderChangeListener(l);
}

public void
startListBackgroundThread(ActionEvent actionEvent) {
for(int i = 0; i < 10; ++i) {
_startListBackgroundThread(actionEvent);
try {
Thread.currentThread().sleep(i * 1234);
} catch (InterruptedException e) {
}
}
}

public void
_startListBackgroundThread(ActionEvent actionEvent) {
Thread backgroundThread   = new Thread() {
public void run() {
s_backgroundFlushTestRunning = true;

for(int i = 0; i <= iterations; ++i) {
System.out.println("executing " + i +
" of " + iterations + " iterations.");

try
{
/* update a property value */
if(i == 0) {
setStatus("thread starting");
addNote();  // add a note
}
else if( i == iterations) {
setStatus("thread complete");
removeNote();  // remove a note
s_backgroundFlushTestRunning = false;
}
else {
setStatus("executing " + i + " of " +
iterations + " iterations.");

synchronized (this)
{
if(s_notes.size() > 0) {
Note n =(Note)s_notes.get(0);

n.setTitle("Updated-" +
n.getUid() + " v" + i);
}
}
}
AdfmfJavaUtilities.
flushDataChangeEvent();
}
catch(Throwable t)
{
System.err.
println("Error in bg thread - " + t);
}

try {
Thread.sleep(delay);
} catch (InterruptedException ex) {
setStatus("inturrpted " + ex);
ex.printStackTrace();
}
}
}
};

backgroundThread.start();
}

protected int iterations = 100;
protected int delay      = 750;

protected String   status;

/* --- JDeveloper generated accessors --- */

public void
addPropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}

public void
removePropertyChangeListener(PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}

public void setStatus(String status) {
String oldStatus = this.status;
this.status = status;
propertyChangeSupport.
firePropertyChange("status", oldStatus, status);
}

public String getStatus() {
return status;
}

public void setIterations(int iterations) {
int oldIterations = this.iterations;
this.iterations = iterations;
propertyChangeSupport.
firePropertyChange("iterations",
oldIterations, iterations);
}

public int getIterations() {
return iterations;
}

public void setDelay(int delay) {
int oldDelay = this.delay;
this.delay = delay;
propertyChangeSupport.
firePropertyChange("delay", oldDelay, delay);
}

public int getDelay() {
return delay;
}
}

StockTrackerサンプル・アプリケーションでは、データ変更イベントでJavaを使用してデータ変更をユーザー・インタフェースに反映する方法の例を示します。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

サンプル・アプリケーションの詳細は、付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照してください。

8 Webサービスの使用方法

この章では、サード・パーティのWebサービスをMAF AMXアプリケーション機能の実装に統合する方法について説明します。

この章の内容は次のとおりです。

- 第8.1項「MAFアプリケーションでのWebサービスの使用方法の概要」

- 第8.2項「Webサービス・データ・コントロールの作成」

- 第8.3項「新しいWebサービス接続の作成」

- 第8.4項「Webサービス・データ・コントロールのエンド・ポイントの調整」

- 第8.5項「セキュアなWebサービスへのアクセス」

- 第8.6項「JavaからのWebサービスの起動」

- 第8.7項「ブラウザ・プロキシ情報の構成」

8.1 MAFアプリケーションでのWebサービスの使用方法の概要

Webサービスでは、アプリケーションおよびその機能は、定義済のアプリケーション・プログラミング・インタフェースを使用してデータと情報を交換できます。Webサービスを使用すると、元のアプリケーションのプラットフォームや言語に関係なくビジネス機能を公開できます。これは、ビジネス機能を、他のアプリケーションでも認識され、使用可能な標準XMLコンストラクトで構成されるメッセージに抽象化して公開するからです。

MAFアプリケーションでWebサービスを使用する最も一般的な理由の一部は次のとおりです。

- Webサービスとしてはすぐに利用できるが、アプリケーション内で開発するには時間がかかる機能を追加するため

- 異なるアーキテクチャで実行されるアプリケーションへのアクセスを提供するため

MAFでは、SOAP WebサービスとREST Webサービスの両方の消費をサポートしています。

MAFアプリケーションでWebサービスを使用すると、次の手順を実行できます。

- モバイル・アプリケーションのエンド・ユーザーが関心を寄せる大規模な(エンタープライズ)データ・ストアから、すべてのデータまたはデータのサブセットを提供します。

- モバイル・デバイスのリソースにとっては処理に時間がかかりすぎる機能を提供します。この原因として考えられるのは、デバイスが行う必要がある実際の作業量か、または機能が基づくデータ・セットがデバイス上でローカルに使用可能なものよりもはるかに大きいことです。

次のWebサービス使用のシナリオでは、データ・アクセス(シナリオ1)の他に、計算およびデータ駆動型の機能(シナリオ2および3)を示します。

- エンタープライズ・データ・ストアから一連の商談データをフェッチして、エンド・ユーザーがデバイスでそのデータを操作し、Webサービスを介してエンタープライズ・データ・ストアに変更をポストできるようにします。

- 一部のエンタープライズ・データに対して生成されるレポートを要求し、そのレポートをフェッチします。

- 顧客サイトへのルートのマップ・イメージを取得します。

8.2 Webサービス・データ・コントロールの作成

MAFを使用して開発されたアプリケーション機能でWebサービスを使用する場合、外部Webサービスのデータ・コントロールを作成するのが最も一般的な方法です。詳細は、第7.1項「バインディングおよびデータ・コントロールの概要」を参照してください。

8.2.1 SOAPを使用したWebサービス・データ・コントロールの作成方法

JDeveloperでは、そのサービスのWeb Services Description Language (WSDL)ファイルのみを使用して、既存のSOAP Webサービスのデータ・コントロールを作成します。ローカル・ファイル・システムでWSDLファイルを参照するか、Universal Description, Discovery and Integration (UDDI)レジストリでWSDLファイルを検索するか、WSDL URLを直接入力することができます。

注意:

ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、JDeveloperで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、第8.7項「ブラウザ・プロキシ情報の構成」を参照してください。

SOAP Webサービス・データ・コントロールを作成するには:

1. 「アプリケーション」ウィンドウで、アプリケーション名を右クリックし、JDeveloperのメイン・メニューから「ファイル」→「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」ダイアログで、左側の「ビジネス層」ノードを開いて「Webサービス」を選択します。右側の「アイテム」リストから「Webサービス・データ・コントロール(SOAP/REST)」を選択して(図8-1を参照)、「OK」をクリックします。

図8-1 新しいSOAP Webサービス・データ・コントロールの作成

3. 「Webサービス・データ・コントロールの作成」ウィザードの「データ・ソース」ページで、「SOAP」を選択します。

4. ウィザードの指示に従って、データ・コントロールの作成を完了します。

注意:

MAFでは、SOAP 1.1および1.2の両方のバージョンで次のエンコーディング・スタイルをサポートしています。

- ドキュメント/リテラル

- ドキュメント/ラップ

- RPC

8.2.2 Webサービス・データ・コントロールでSOAPヘッダーをカスタマイズする方法

MAFでは、DataControls.dcxファイルにカスタムのプロバイダ・クラスを指定できます(例8-3を参照)。このカスタム・クラスでは、oracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProviderを拡張します。これは、SoapHeader[] getAdditionalSoapHeaders()メソッドの実装の指定に使用できます。

例8-1は、SOAPProviderを拡張し、例8-2に示したカスタム・ヘッダーの作成方法を示しています。

例8-1 カスタムSOAPヘッダーの定義

package provider.ebs.soap;

import oracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProvider;
import oracle.adfinternal.model.adapter.webservice.provider.soap.SoapHeader;

public class EBSSOAPProvider extends SOAPProvider {

public SoapHeader[] getAdditionalSoapHeaders() {
SoapHeader header[] = new SoapHeader[2];
SoapHeader token = null;
SoapHeader user = null;
SoapHeader pass = null;

header[0] = new SoapHeader("http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"SOAHeader");
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"Responsibility",
"SYSTEM_ADMINISTRATOR"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"RespApplication",
"SYSADMIN"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"SecurityGroup",
"STANDARD"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"NLSLanguage",
"AMERICAN"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"Org_Id",
"0"));

header[1] = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Security");
token = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"UsernameToken");
user = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Username",
"sysadmin");
pass = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Password",
"sysadmin");

header[1].addChild(token);
token.addChild(user);
token.addChild(pass);

return header;
}
}

例8-2は、新しいカスタム・ヘッダーを示しています。

例8-2 SOAPヘッダー

<soap:Header xmlns:ns1="http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/">
<ns1:SOAHeader>
<ns1:Responsibility>SYSTEM_ADMINISTRATOR</ns1:Responsibility>
<ns1:RespApplication>SYSADMIN</ns1:RespApplication>
<ns1:SecurityGroup>STANDARD</ns1:SecurityGroup>
<ns1:NLSLanguage>AMERICAN</ns1:NLSLanguage>
<ns1:Org_Id>0</ns1:Org_Id>
</ns1:SOAHeader>
<wsse:Security xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
soap:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Username>sysadmin</wsse:Username>
<wsse:Password Type=
http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-username-token-profile-1.0#PasswordText">sysadmin</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>

@return

例8-3は、SOAPProvider登録に関するDataControls.dcxファイルのサンプル・エントリを示しています。

例8-3 DataControls.dcxファイルでのSOAPProviderの登録

<definition xmlns="http://xmlns.oracle.com/adfm/adapter/webservice"
name="SoapService" version="1.0"
provider="oracle.adf.model.adapter.webservice.SOAPMessageHandler"
wsdl="http://@SRG_WS_HOST@:@SRG_WS_PORT@/SoapService/SoapServicePort?wsdl" >
<service name="SoapService" namespace="http://model/"
connection="SoapService">
<port name="SoapServicePort">
<operation name="echoSoapHeader"/>
</port>
</service>
</definition>

注意:

MAFを使用して動的SOAPヘッダーを指定することはできません。

8.2.3 RESTを使用したWebサービス・データ・コントロールの作成方法

JDeveloperでは、既存のREST Webサービスのデータ・コントロールを作成できます。このREST Webサービスは、XMLレスポンスを戻します。

注意:

ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、JDeveloperで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、第8.7項「ブラウザ・プロキシ情報の構成」を参照してください。

同じ接続を使用して、REST Webサービス・データ・コントロールに1つ以上のHTTPメソッドを関連付けることができます。RESTサービスにより公開されたカスタム操作にアクセスできます。これらのカスタム操作は、HTTPメソッドの1つにマップされ、データ・コントロールを作成することでクライアントに公開できます。

モバイル・デバイスでセキュリティおよび通知機能を使用する場合は、RESTデータ・コントロールによって公開された特定の操作で使用する標準のHTTPヘッダーにカスタム・ヘッダーおよびカスタム値を追加できます。

始める前に

データ・コントロールがアクセスするREST Webサービスへのアクセス権があることを確認します。

REST Webサービス・データ・コントロールを作成するには:

1. 「アプリケーション」ウィンドウで、アプリケーション名を右クリックし、JDeveloperのメイン・メニューから「ファイル」→「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」ダイアログで、左側の「ビジネス層」ノードを開いて「Webサービス」を選択します。右側の「アイテム」リストから「Webサービス・データ・コントロール(SOAP/REST)」を選択して(図8-1を参照)、「OK」をクリックします。

3. 「Webサービス・データ・コントロールの作成」ウィザードの「データ・ソース」ページで、「REST」を選択します(図8-2参照)。

図8-2 REST Webサービス・データ・コントロールのデータ・ソースの定義

4. 「Webサービス・データ・コントロールの作成」ウィザードの説明に従って、次の点に注意しながらデータ・コントロールの作成を完了します。

- MAFでは、Webサービスに対して基本認証のみをサポートしています(第8.5項「セキュアなWebサービスへのアクセス」を参照)。新しい接続の作成時に、「URL接続の作成」ダイアログの「認証タイプ」フィールドで、「基本」を選択します。

- MAFでは、GET、POST、PUTおよびDELETEのすべてのHTTPメソッド・タイプをサポートしています。「リソース」ページの「メソッド表示名」フィールドへの入力時に、これらのメソッド・タイプのいずれかを選択できます(図8-3を参照)。

注意:

同じ接続および同じREST Webサービス・データ・コントロールを使用して4つのメソッドをすべて追加できます。

図8-3 REST Webサービス・データ・コントロールのリソースの定義

- MAFでは、スプレッド・シート・データ内の区切り文字で区切られた値およびXMLデータ・フォーマットのXSLはサポートされません。

- REST Webサービス・データ・コントロール定義にローカルXSDファイルを指定することによって、「メソッドの詳細」ページでスキーマの識別を可能にするフィールドのファイルURI参照を作成します(図8-4を参照)。

図8-4 REST Webサービス・データ・コントロールのメソッド詳細の定義

注意:

MAFではコンパイル時にXSD構造の内部定義を作成するため、アプリケーションのコンパイル後はXSDを変更しないようにします。したがって、XSDファイルをローカルで参照することをお薦めします。リモートXSDの使用がパフォーマンスに悪影響を与えるのは、MAFではアプリケーションを実行するたびにXSDを取得するためです。

前述の手順に従ってREST Webサービス・データ・コントロールを作成すると、そのコントロールは、JDeveloper経由で使用可能な他の技術によって提供される、対応するコントロールとまったく同じように動作します。

RESTDemoという名前のMAFサンプル・アプリケーション(開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/SamplesディレクトリにあるPublicSamples.zipファイルにあります)は、MAFアプリケーションでのREST Webサービスの使用方法を示しています。

データ・コントロールを使用しないJavaによるREST Webサービスの使用方法の詳細は、第8.6.2項「REST Webサービス・アダプタの使用方法」を参照してください。

8.2.4 Webサービス・データ・コントロールに関する必知事項

Webサービス・データ・コントロールの作成後は、図8-5に示すように、Webサービスの操作およびその操作の戻り値が「データ・コントロール」ウィンドウに表示されます。

図8-5 Webサービス・データ・コントロール

他のデータ・コントロールと同じく、Webサービス操作から返されたオブジェクトをドラッグ・アンド・ドロップして、MAF AMXページでユーザー・インタフェース・コンポーネントを作成できます。詳細は、第5.3.2.4項「データ・コントロールのビューへの追加」を参照してください。Webサービスの操作から戻されたデータが表示されると、次のオブジェクト・タイプが処理されます。

- コレクション

- Webサービスの操作により戻された複合オブジェクト

- Webサービスの操作により戻された、ネストされた複合オブジェクト

Webサービスの操作を使用して、標準データ型と複合データ型の両方を更新および削除できます。

図8-5に示すように、各データ・コントロール・オブジェクトはアイコンで表されます。表8-1は、各アイコンが表すもの、「データ・コントロール」パネルの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。詳細は、第7.6項「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。

表8-1 Webサービスの「データ・コントロール」パネルのアイコンおよびオブジェクト階層

アイコン

名前

説明

作成できるコンポーネント

データ・コントロール

データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。通常、各Webサービスに対するデータ・コントロールは1つです。

他のオブジェクトのコンテナとして機能し、コンポーネント作成には使用されません。

コレクション

サービスの操作から返されるデータ・コントロールを表現します。コレクションは、メソッド戻りオブジェクト、他のコレクション、または構造化属性の下の子としても表示されます。コレクションの下の子は、属性、他のコレクション、カスタム・メソッド、コレクションに対して実行できる組込み操作などです。

フォーム、表、グラフ、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・コンポーネント。第6.5項「データ視覚化の指定」も参照してください。

属性

オブジェクト内の個別のデータ要素(行の属性など)を表します。属性は、自分の属するコレクションまたはメソッド戻りの下に、子として表示されます。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第6.2項「ページ・レイアウトの設計」も参照してください。

構造化された属性

複合型でありコレクションではない、返されたオブジェクトを表します。たとえば、構造化属性は、現在のサービス・リクエストに割り当てられた単一のユーザーを表現します。

ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第6.2項「ページ・レイアウトの設計」も参照してください。

メソッド

データ・コントロールの操作またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはそれらのコレクションを戻すことができます。

コマンド・コンポーネント。

パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。また、第6.3項「UIコンポーネントの作成と使用方法」も参照してください。

メソッド戻り値

Webサービス・メソッドによって戻されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。

メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッドの戻りオブジェクトの下の子として表示されるオブジェクトは、該当コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、および親コレクション上で実行可能な操作です。

単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するために、対応するメソッドをボタンとしてドロップする必要があります。また、タスク・フローを使用している場合は、メソッド・アクティビティを作成できます。

コレクションと属性、および問合せフォームの場合と同じコンポーネント。

操作

親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションの下の「操作」ノードにあります。1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「パラメータ」ノードにリストされます。

現在行のナビゲーションと設定のために、First、Last、Next、Previous、setCurrentRowWithKey、およびSetCurrentRowWithKeyValueの各操作がサポートされます。問合せをリフレッシュするために、Executeがサポートされます。Webサービス操作に応じて、CreateおよびDeleteが使用可能です。Webサービス・データ・コントロールはトランザクション方式ではないので、CommitおよびRollbackはサポートされません。

ボタン、リンク、メニューなどのユーザー・インタフェース・コマンド・コンポーネント。詳細は、第6.3項「UIコンポーネントの作成と使用方法」を参照してください。

パラメータ

メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。

配列および構造化パラメータは、データ・コントロールの下の更新可能な構造化属性およびコレクションとして公開され、UI上にADFフォームまたは更新可能な表としてドロップできます。UIを使用して配列または複合オブジェクト(標準のJava型ではない)のパラメータを作成できます。

ラベル、テキストおよび選択リストの各コンポーネント。詳細は、第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

8.3 新しいWebサービス接続の作成

Webサービスの接続情報は、アプリケーション内の他の接続とともにconnections.xmlファイルに保存されます。このファイルは、Webサービス・データ・コントロールの作成時に「新しいWebサービス・データ・コントロール」ウィザードによって.adf/META-INFディレクトリに生成されるため、明示的に作成する必要はありません(第8.2項「Webサービス・データ・コントロールの作成」を参照)。

接続設定を変更するには、connections.xmlファイルを編集します。

8.4 Webサービス・データ・コントロールのエンド・ポイントの調整

Webサービス・データ・コントロールを作成すると、URIのエンド・ポイントを変更できます。これは、テスト環境から本番環境にアプリケーション機能を移行するような場合に便利です。

エンド・ポイントを変更するには、connections.xmlファイルを編集します。

8.5 セキュアなWebサービスへのアクセス

MAFは、保護されたWebサービスと保護されていないWebサービスの両方をサポートしています。詳細は、第21章「モバイル・アプリケーションの保護」を参照してください。

MAFアプリケーションから保護されたWebサービスにアクセスするには、アプリケーションに追加されたWebサービス・データ・コントロールの構成が必要な場合もあります。

8.5.1 SOAPベースのWebサービスへのアクセスを有効にする方法

SOAPベースのWebサービスでは次の事前定義済のセキュリティ・ポリシーがサポートされます。

- oracle/wss_http_token_client_policy

- oracle/wss_http_token_over_ssl_client_policy

- oracle/http_basic_auth_over_ssl_client_policy

- oracle/wss_username_token_client_policy

- oracle/wss_username_token_over_ssl_client_policy

これらのポリシーとその使用方法の詳細は、『Oracle Fusion Middleware Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』の「使用する事前定義済ポリシーの決定」および「事前定義済ポリシー」の章を参照してください。

SOAP Webサービスが保護されている場合は、oracle/wss_http_token_over_ssl_client_policyまたはoracle/wss_http_token_client_policyのいずれかでWebサービス・データ・コントロールを構成することでアクセスが可能になります。これを行うには、図8-6に示す「データ・コントロール・ポリシーの編集」ダイアログを使用します。このダイアログは次の方法で開くことができます。

- 「アプリケーション」ウィンドウで、アプリケーションのビュー・コントローラ・プロジェクトにある.dcxファイルを選択します。

- 「構造」ウィンドウで、構成が必要なWebサービス・データ・コントロールを右クリックし、ポップアップ・メニューから「Webサービス・セキュリティの定義」を選択します。

図8-6 Webサービス・データ・コントロール・ポリシーの編集

注意:

JDeveloperは、Webサービス・ポリシー定義をwsm-assembly.xmlファイル(アプリケーション・ワークスペースのMETA-INFディレクトリにあります)に格納します。

8.5.2 RESTベースのWebサービスへのアクセスを有効にする方法

Cookieベースの認可のためにモバイル・アプリケーションがREST Webサービスを要求するたびに、MAFのセキュリティ・フレームワークは、REST Webサービスのトランスポート・レイヤーが、REST WebサービスのURLエンド・ポイントに関連付けられているログイン接続に対してCookieの挿入が可能かどうかをチェックできるようにします。つまり、connections.xmlファイルに<injectCookiesToRESTHttpHeader value="true"/>が含まれている必要があります。REST Webサービス・コールでログイン・サーバーのCookieを有効にするようにMAFアプリケーション・ログインを構成する方法の詳細は、第21.4.3項「Oracle Mobile and Social Identity Managementを使用して認証を構成する方法」を参照してください。

これは、Oracle Access Management Mobile and Social (OAMMS)認証コンテキストにも当てはまり、WebリソースはOracle Access Managerサーバー10g WebGateによって保護されており、アクセス・トークンはObSSOCookieという暗号化されたCookieとして挿入されます。詳細は、第21.4.11項「REST Webサービス・コールへのCookieの挿入を可能にする場合の処理」を参照してください。

REST WebサービスがOAuthアクセス・トークンを予期している場合、REST Webサービスをサポートする事前定義済のセキュリティ・ポリシーoracle/oauth2_config_client_policyにREST接続を関連付ける必要があります。現在、JDeveloperのデザインタイムではポリシーの関連付けがサポートされていません。REST接続を編集してポリシー・セットをWebサービスに手動で添付する必要があり、例8-4に示すように、URIはoracle/oauth2_config_client_policyに設定され、someapiは接続名です。

例8-4 REST接続へのポリシー・セットの関連付け

<sca11:policySet xmlns:sca11="http://docs.oasis-open.org/ns/opencsa/sca/200912"
name="policySet"
attachTo="MODULE('someapi')"
<wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy"
DigestAlgorithm="http://www.w3.org/ns/ws-policy/Sha1Exc"
URI="oracle/oauth2_config_client_policy"
orawsp:status="enabled" orawsp:id="1"/>
</sca11:policySet>

たとえば、ソーシャル認証サーバーに対して認証するようにOAMMSサーバーが構成され、MAFアプリケーションがソーシャル・サービス・プロバイダのREST APIを起動する必要がある場合に、このポリシーを構成します。

8.5.3 資格証明の挿入に関する必知事項

保護されたWebサービスにおけるユーザーの資格証明は、Webサービス・リクエストの起動時にそのリクエストに動的に挿入されます。このプロセスは、SOAP WebサービスとREST Webサービスで似ています。

MAFは、Oracle Web Services Manager (OWSM)モバイル・エージェントを使用して、Webサービス・リクエスト経由でユーザー・アイデンティティを伝播します。

Webサービスを起動する前に、ユーザーは、保護されたMAFアプリケーション機能の呼出しまたはアクセス制御サービス(ACS)で制御されたアプリケーションの起動を試みるユーザーによってトリガーされた認証プロンプトに応答する必要があります。後者では、アプリケーションでACS URLを使用してデフォルトのログイン・サーバーを定義し、user.roles設定に依存する制約を持つ機能を少なくとも1つは備えておく必要があります。ユーザーの資格証明は、資格証明ストアに格納されます。この資格証明ストアは、認証プロバイダのサーバーURLおよびユーザーと関連付けられた資格証明の格納に使用される、デバイス・ネイティブかつローカルなリポジトリです。実行時に、MAFでは、すべての資格証明がその使用前にIDM Mobile資格証明ストアに格納されているものとみなします。

connections.xmlファイルには、Webサービスの接続参照のadfCredentialStoreKey属性に、ログイン・サーバー接続のadfCredentialStoreKeyの値を指定して、ログイン・サーバーをWebサービスのセキュリティに関連付ける必要があります(例8-5および例8-6を参照)。

注意:

JDeveloperではconnections.xmlファイルの概要エディタが提供されないため、「プロパティ」ウィンドウを使用して、<Reference>要素のadfcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新できます。または、「ソース」エディタを使用して属性を追加または更新できます。

例8-5は、adfCredentialStoreKey="MyAuth"として参照されるWebサービス接続の定義を示しています。ここで、MyAuthとは、ログイン接続の参照名です。

例8-5 Webサービス接続の定義

<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>

例8-6は、ログイン接続の定義を示しています。ここでのMyAuthは、ログイン・サーバー接続における資格証明ストア・キーの値として使用されます。

例8-6 ログイン接続の定義

<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により適切な例外が戻され、適切なアクションが起動されます(第22.4項「ロギングの使用方法と構成」を参照)。既存の例外で状況を適切に示せない場合は、新しい例外が追加されます。

connections.xmlファイルは構成サービスの下でデプロイされ、管理されています。詳細は、第9章「MAFアプリケーションで使用されるエンド・ポイントの構成」を参照してください。

FAR内のconnections.xmlファイルは、MAFアプリケーションのデプロイ時に集約されます。資格証明はデプロイメント固有のデータを表しており、FAR内に格納することは想定されていません。

8.5.4 セキュアなWSDLファイルの使用制限

MAFアプリケーションではWSDLファイルへのアクセスを実行時に認証なしに行えるようにする必要があるため、基本認証によって保護されたSOAP WebサービスでセキュアなWSDLファイルを使用することはできません。

WSDLの保護が目的の場合は次の点を考慮してください。WSDLファイルはWebサービスのGETメソッドによってフェッチされるため、GETメソッドを除く各Webサービス・メソッドを保護する場合は、セキュアなWSDLを使用できます。GETメソッドを保護する場合は、WSDLを保護しないようにします。

8.6 JavaからのWebサービスの起動

MAFアプリケーションでは、JavaコードからWebサービス層(RESTおよびSOAPの両方)を起動して、その結果をJavaメソッドで使用できます。

MAFでは、使用可能なGenericTypeBeanSerializationHelperユーティリティ・クラスが提供され、POJO (JavaBeansオブジェクト)とMAFのGenericTypeオブジェクトとの間で次の変換ルールのセットに基づいて変換が実行されます。

1. POJOからGenericTypeオブジェクトに変換する場合:

- プロパティの決定に標準JavaBeansの反映ルールが使用されます。

- 変換プロセスでは一時プロパティが無視されます。

- 読取り可能プロパティはGenericType属性に変換されます。

- 配列プロパティはGenericType内で繰返し属性として表されます。

- マッピング・プロパティはGenericType内で個別の属性として表されます。

- 非プリミティブ・プロパティはネストされたGenericTypeオブジェクトとして表されます。

2. GenericTypeオブジェクトからPOJOに変換される場合:

- プロパティの決定に標準JavaBeansの反映ルールが使用されます。

- 変換プロセスでは一時プロパティが無視されます。

- 書込み可能プロパティはGenericType属性に変換されます。

- GenericType内の繰返し属性は配列オブジェクトに変換されます。

- POJOにMapインタフェースが実装されている場合は、標準アクセッサを介して設定できないすべてのプロパティがMapのsetメソッドを介してPOJOに設定されます。

- 非プリミティブ属性はネストされたPOJOオブジェクトとして表されます。

このヘルパーAPIを使用する利点は、Webサービスから受け取ったレスポンスを取得して、1回のコールでJavaBeanに変換できることです。

たとえば、Webサービスは、ビジネス・ロジック全体で再利用する必要があるEmployeeオブジェクトを渡したり戻したりします。このオブジェクトには次のプロパティ・セットがあります。

- String型のname

- address (street、city、stateおよびzipcodeの各属性を持つ複合オブジェクト)

- long型のid

- float型のsalary

- String型のphone(複数のphoneになる可能性もある)

- String型のpassword(このpasswordはバックエンドのWebサービスに送信しないでください)

例8-7は、考えられるEmployeeオブジェクトのコードを示しています。

例8-7 Employeeオブジェクト

public class Employee {

protected String name;
protected Address address;
protected long id;
protected float salary;
protected String[] phone;
protected transient String password;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Address getAddress() {
return address;
}

public void setAddress(Address address) {
this.address = address;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public float getSalary() {
return salary;
}

public void setSalary(float salary) {
this.salary = salary;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public void setPassword(String password) {
this.password = password;
}

public String[] getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

例8-8は、EmployeeクラスのAddressオブジェクトのコードとして考えられるものを示しています。

例8-8 Addressオブジェクト

public class Address {

protected String street;
protected String city;
protected String state;
protected String zipcode;

public String getStreet() {
return street;
}

public void setStreet(String street) {
this.street = street;
}

public String getCity() {
return city;
}

public void setCity(String city)  {
this.city = city;
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public String getZipcode() {
return zipcode;
}

public void setZipcode(String zipcode)  {
this.zipcode = zipcode;
}

変換ルールについては次に注意します。

1. passwordは一時的に定義されるため、変換アルゴリズムに対しては無視されます。

2. name、address、idおよびsalaryにはすべてgetメソッドおよびsetメソッドがあるため、それらはすべてGenericTypeとの間で変換が行われます。

3. プロパティ・タイプに基づき、oracle.adfmf.misc.ConverterクラスのcoerceToType(Object, Class)メソッドの定義に従って、プロパティをタイプ間で強制変換できます。

4. addressなどの複合オブジェクトは、変換アルゴリズムによって再帰的に処理することで、変換の方向により、子であるGenericTypeを構築するか、POJO複合オブジェクトを作成してデータを移入します。

5. phoneはStringオブジェクトの配列で、それぞれが一意の電話番号を表しており、またこの要素のカーディナリティは2以上のため、変換アルゴリズムによってGenericTypeオブジェクト内のphone属性におけるすべての組合せが検索され、それらが配列として表される他、Bean上ではsetPhoneメソッドが起動されます。GenericTypeBeanSerializationHandlerのtoGenericTypeメソッドでは各配置要素が取得され、個別のphone属性としてtoGenericTypeに追加されます。

次のように定義されている場合:

final String EMPLOYEE_VIRTUAL_BEAN_NAME = "EmployeeDC.Types.Employee";
Employee emp = getEmployee();
GenericType gt = null;

- Employeeオブジェクトは、次のようにGenericTypeに変換されます。

gt = GenericTypeBeanSerializationHelper.toGenericType
(EMPLOYEE_VIRTUAL_BEAN_NAME, emp);

- GenericTypeは次のようにEmployeeオブジェクトに変換されます。

emp = GenericTypeBeanSerializationHelper.fromGenericType
(Employee.class, gt, null);

正常に変換するには次の点を考慮します。

- POJOでは通常、それらに関連付けられたGenericType構造に厳密に従います。

- GenericType構造から外れた場合は、次のいずれかの方法に従います。

1. 追加のBeanプロパティを一時的に宣言します。

2. 操作パラメータとして使用されたときに欠落データをバッキング・サービスが処理できる場合は、POJOからオプション・プロパティを除外できます。

- GenericTypeは、SOAPデータ・コントロールにのみ公開されます。仮想タイプには、toGenericTypeメソッドに渡される、関連付けられた仮想Bean名があります。JDeveloperの「データ・コントロール」ウィンドウで仮想タイプ上にカーソルを置くことによって仮想Bean名にアクセスできます。通常の名前フォーマットは、<DCName>.Types.<methodName>.<argName>です。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

8.6.1 Webサービス・オブジェクトの行を追加および削除する方法

MAFを使用すると、プログラムからWebサービス・オブジェクトのイテレータにアクセスして、そのオブジェクトの行を挿入および削除できます。これを行うには、oracle.adfmf.bindings.iterator.BasicIteratorクラスのcreateRowおよびdeleteRowメソッドを使用します。

例8-9は、行をWebサービス・オブジェクトに追加する方法を示しています。

例8-9 行の挿入

String keyFieldNames[] = {"EMPLID","ACAD_CAREER","INSTITUTION"};
String keyFieldValues[] = {"SR12030","UGRD","PSUNV"};
AmxAccessorIteratorBinding  acIter =
(AmxAccessorIteratorBinding)((AdfmfJavaUtilities.getValueExpression
("#{bindings.KEYIterator}", Object.class))
.getValue(AdfmfJavaUtilities.getAdfELContext()));

BasicIterator iter = acIter.getIterator();
GenericType key = (GenericType)iter.getDataProvider();
key.setAttribute("FIELDNAME", keyFieldNames[0]);
key.setAttribute("FIELDVALUE", keyFieldValues[0]);

int totalRowCount = 0;
int currIndex = 0;

for (int i = 1; i < keyFieldNames.length; i++) {
totalRowCount = iter.getTotalRowCount();
currIndex = iter.getCurrentIndex();

System.out.println("Starting to add rows.. \n\t Total Row Count: " +
totalRowCount + "\n\t Current Row Index: " + currIndex);

// Create rows for key iterator
iter.createRow();

totalRowCount = iter.getTotalRowCount();
System.out.println("\t Total Row Count after creating row: " + totalRowCount);

if (iter.hasNext()) {
iter.next();
}

currIndex = iter.getCurrentIndex();
System.out.println("\t Current Row Index after setting current
index to newly added row: " + currIndex);

GenericType key1 = (GenericType)iter.getDataProvider();
key1.setAttribute("FIELDNAME", keyFieldNames[i]);
key1.setAttribute("FIELDVALUE", keyFieldValues[i]);
}

// Execute method

// Add call to execute the action binding to execute the action.
// If this is a web service call, the modified GenericType object
// will be sent to the server and the server will respond appropriately

注意:

ブール入力パラメータの有無にかかわらず、createRowメソッドのシグネチャを使用できます。パラメータを指定せずにこのメソッドを使用した場合、ブール・パラメータの値をtrueに設定してcreateRowを使用した場合と同じ結果が生成されます。createRow()とcreateRow(true)では、どちらも新しい行を作成し、それをイテレータに挿入します。

8.6.2 REST Webサービス・アダプタの使用方法

oracle.adfmf.dc.ws.rest.RestServiceAdapterインタフェースを使用して、RESTコールで送信されるデータにアクセスできます(このデータは、JavaScript Object Notationと表される場合があります)。RestServiceAdapterインタフェースによって、Webサービス・データ・コントロールを作成したり、それと直接やりとりする必要なしに、Webサービス操作の実行をトリガーできます。

MAFアプリケーションでRestServiceAdapterインタフェースを使用するには、connections.xmlファイルに接続が存在することを確認し(第8.3項「新しいWebサービス接続の作成」を参照)、次の例で示すようにコードをBeanクラスに追加します。

例8-10は、GETリクエストに対するRestServiceAdapterの使用方法を示しています。

例8-10 GETリクエストに対するRestServiceAdapterの使用方法

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

// Clear any previously set request properties, if any
restServiceAdapter.clearRequestProperties();

// Set the connection name
restServiceAdapter.setConnectionName("RestServerEndpoint");

// Specify the type of request
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_GET);

// Specify the number of retries
restServiceAdapter.setRetryLimit(0);

// Set the URI which is defined after the endpoint in the connections.xml.
// The request is the endpoint + the URI being set
restServiceAdapter.setRequestURI("/WebService/Departments/100");

String response = "";

// Execute SEND and RECEIVE operation
try {
// For GET request, there is no payload
response = restServiceAdapter.send("");
}
catch (Exception e) {
e.printStackTrace();
}

例8-11は、POSTリクエストに対するRestServiceAdapterの使用方法を示しています。

例8-11 POSTリクエストに対するRestServiceAdapterの使用方法

String id = "111";
String name = "TestName111";
String location = "TestLocation111";
RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_POST);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments");

String response = "";

// Execute SEND and RECEIVE operation
try {
String postData = makeDepartmentPost("DEPT", id, name, location);
response = restServiceAdapter.send(postData);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + response);

private String makeDepartmentPost(String rootName, String id,
String name, String location) {
String ret = "<" + rootName + ">";
ret += "<DEPTID>" + id + "</DEPTID>";
ret += "<NAME>" + name + "</NAME>";
ret += "<LOCATION>" + location + "</LOCATION>";
ret += "</" + rootName + ">";
return ret;
}

例8-12は、PUTリクエストに対するRestServiceAdapterの使用方法を示しています。

例8-12 PUTリクエストに対するRestServiceAdapterの使用方法

String id = "111";
String name = "TestName111";
String location = "TestLocation111";
RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_PUT);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments");

String response = "";

// Execute SEND and RECEIVE operation
try {
String putData = makeDepartmentPut("DEPT", id, name, location);
response = restServiceAdapter.send(putData);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + response);

private String makeDepartmentPut(String rootName, String id,
String name, String location) {
String ret = "<" + rootName + ">";
ret += "<DEPTID>" + id + "</DEPTID>";
ret += "<NAME>" + name + "</NAME>";
ret += "<LOCATION>" + location + "</LOCATION>";
ret += "</" + rootName + ">";
return ret;
}

例8-13は、DELETEリクエストに対するRestServiceAdapterの使用方法を示しています。

例8-13 DELETEリクエストに対するRestServiceAdapterの使用方法

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_DELETE);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments/44");

String response = "";

// Execute SEND and RECEIVE operation
try {
// For DELETE request, there is no payload
response = restServiceAdapter.send("");
}
catch (Exception e) {
e.printStackTrace();
}

System.out.println("The response is:  " + response);

RestServiceAdapterを使用する場合は、AcceptヘッダーとContent-Typeヘッダーを設定して、MIMEタイプの不一致が原因でリクエストおよびレスポンスのペイロードが無効と判断されないようにします。

注意:

REST Webサービス・アダプタでは、モバイル・アプリケーション上の文字セットとしてUTF-8のみをサポートします。UTF-8は、アダプタのプログラムに埋め込まれています。

8.6.2.1 入力および出力ストリームへのアクセス

次のRestServiceAdapterメソッドを使用すると、javax.microedition.io.HttpConnectionを取得およびカスタマイズでき、さらに接続の入力と出力ストリームへのアクセスおよびやり取りが可能になり、これによってHttpConnectionからデータを読み取り、今後のサーバーへのアップロードのためにそれに書き込むことができます。

- HttpConnectionを取得します。

HttpConnection getHttpConnection(String requestMethod,
String request,
Object httpHeadersValue)

- HttpConnectionのOutputStreamを取得します。

OutputStream getOutputStream(HttpConnection connection)

- HttpConnectionのInputStreamを取得します。

InputStream getInputStream(HttpConnection connection)

- HttpConnectionを閉じます。

void close (HttpConnection connection)

- connections.xmlファイルで接続名を検索し、接続のエンド・ポイントを返します。

String getConnectionEndPoint(String connecionName)

これらのメソッドは、RestServiceAdaperのsendメソッドおよびsendReceiveメソッドと同じ機能を実現しつつ、接続をカスタマイズする機会と、リクエストを送信し、レスポンスを受信するというプロセスを提供します。

例8-14では、指定されたリクエスト・メソッド、リクエストおよびHTTPヘッダー値を使用して、HttpConnectionを初期化して返しています。また、資格証明ストアから基本認証をリクエスト・ヘッダーに挿入し、入力ストリームを取得し、接続を閉じます。

例8-14 HttpConnectionの取得およびそのメソッドの使用

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();

// Specify the type of request
String requestMethod = RestServiceAdapter.REQUEST_TYPE_GET;

// Get the connection end point from connections.xml
String requestEndPoint = restServiceAdapter.getConnectionEndPoint("GeoIP");

// Get the URI which is defined after the end point
String requestURI = "/xml/" + someIpAddress;

// The request is the end point + the URI being set
String request = requestEndPoint + requestURI;

// Specify some custom request headers
HashMap httpHeadersValue = new HashMap();
httpHeadersValue.put("Accept-Language", "en-US");
httpHeadersValue.put("My-Custom-Header-Item", "CustomItem1");

// Get the connection
HttpConnection connection =
restServiceAdapter.getHttpConnection(requestMethod,
request,
httpHeadersValue);

// Get the input stream
InputStream inputStream = restServiceAdapter.getInputStream(connection);

// Define data
ByteArrayOutputStream byStream = new ByteArrayOutputStream();

int res = 0;
int bufsize = 0, bufread = 0;

byte[] data = (bufsize > 0) ? new byte[bufsize] : new byte[1024];

// Use the input stream to read data
while ((res = inputStream.read(data)) > 0) {
byStream.write(data, 0, res);
bufread = bufread + res;
}
data = byStream.toByteArray();

// Use data
...

restServiceAdapter.close(connection);
...

8.6.2.2 非テキスト・レスポンスのサポート

Webサービス・コールから受け取ったバイナリ(非テキスト)レスポンスを処理するには、RestServiceAdapterを使用できます。これらのレスポンスには、PDFファイルやビデオ・ファイルなど、どの種類のバイナリ・データでも含めることができます。使用するRestServiceAdapterメソッドはsendReceiveです。

例8-15は、ファイルのリクエストをRESTサーバーに送信し、そのファイルをディスクに保存する方法を示しています(例8-16を参照)。

例8-15 ファイルのリクエストの送信

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("JagRestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_GET);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/ftaServer/v1/kpis/123/related/1");

// Set credentials needed to access the REST server
String theUsername = "hr_spec_all";
String thePassword = "Welcome1";
String userPassword = theUsername + ":" + thePassword;
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes());

restServiceAdapter.addRequestProperty("Authorization", "Basic " + encoding);

// Execute the SEND / 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);

例8-16は、例8-15のコードによって呼び出されるメソッドを示しています。このメソッドでは、ファイルに対するbyte[]レスポンスをディスクに保存します。

例8-16 ファイルのディスクへの保存

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) {
}
}
}

8.6.3 RESTレスポンスの厳密な検証を有効にする方法

maf-config.xmlファイルを使用すると、RESTレスポンスに予期しないまたはXSDで定義されていない子または属性が含まれていた場合のMAFの動作を指定できます。

- 厳密な検証が有効になっている場合、MAFでは例外をスローします。

- 厳密な検証が無効になっている場合は、条件がログに記録され、例外をスローすることなく実行が継続されます。

例8-17は、validatedパラメータの設定方法を示しています。このパラメータの値をtrueに定義した場合、厳密な検証が行われます。値がfalse (デフォルト)の場合、厳密な検証は行われません。

例8-17 RESTレスポンスの厳密な検証の有効化

<generic-type>
<conversion>
<validated>true</validated>
</conversion>
</generic-type>

8.6.4 データ・コントロール操作の起動に関する必知事項

AdfmfJavaUtilitiesのinvokeDataControlMethodメソッドを使用することで、PageDefファイルのmethodActionとして明示的に追加する必要がないデータ・コントロール操作を起動できます。

詳細および例については、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

8.7 ブラウザ・プロキシ情報の構成

コール対象のWebサービスが自社ファイアウォールの外部にある場合は、HTTPプロキシ・サーバーを使用できるような適切な構成にJavaシステム・プロパティが設定されていることを確認する必要があります。

デフォルトでは、MAFはiOSおよびAndroidプラットフォームのシステム設定を使用してプロキシ情報を判別します。たとえば、iOSデバイスの設定ユーティリティを使用してプロキシ情報が設定されている場合、CVMがそれを自動的に取り込みます。

注意:

MAFアプリケーションごとに異なるプロキシを定義できます。

デバイス設定からプロキシ情報を取得しない場合は、まず-Dcom.oracle.net.httpProxySourceシステム・プロパティを追加する必要があります。このプロパティのデフォルト値は「native」であり、プロキシ情報はデバイス設定から取得されます。userなど別の値(たとえば、-Dcom.oracle.net.httpProxySource=user)を指定して、それを無効にする必要があります。

CVMは、次の2種類のメカニズムを使用してネットワーク接続を有効にします。

1. 汎用接続フレームワーク(GCF)。このメカニズムが使用された場合、プロキシはシステム・プロパティ-Dcom.sun.cdc.io.http.proxy=<host>:<port>によって定義されます。

2. java.net API。このメカニズムが使用された場合、プロキシは標準のhttp.proxyHostおよびhttp.proxyPortによって定義されます。

いずれの場合でも、cvm.propertiesファイルに3つすべてのプロパティを定義することをお薦めしますが、そうすると次のようになります。

java.commandline.argument=-Dcom.oracle.net.httpProxySource=user
java.commandline.argument=-Dcom.sun.cdc.io.http.proxy=www-proxy.us.mycompany.com:80
java.commandline.argument=-Dhttp.proxyHost=www-proxy.us.mycompany.com
java.commandline.argument=-Dhttp.proxyPort=80

注意:

これらのプロパティは、ネットワーク・コールのCVM側にのみ影響を与えます。

9 MAFアプリケーションで使用されるエンド・ポイントの構成

この章では、構成サービスを使用して、MAFアプリケーションで使用されるエンド・ポイントを構成する方法について説明します。

この章の内容は次のとおりです。

- 第9.1項「エンド・ポイントの構成の概要」

- 第9.2項「構成サービスのエンド・ポイントの定義」

- 第9.3項「構成サービスのユーザー・インタフェースの作成」

- 第9.4項「URLの構築について」

- 第9.5項「サーバー上での構成サービスの設定」

- 第9.6項「構成サービスの移行」

9.1 エンド・ポイントの構成の概要

構成サービスは、Webサービス、ログイン・ユーティリティおよびMAFアプリケーションのその他の部分で使用されるエンド・ポイントを構成できるツールです。

9.2 構成サービスのエンド・ポイントの定義

エンド・ポイント(またはシード) URLは、connections.xmlファイルに定義されており、新しい接続エントリはそのファイルに追加する必要があります。この新しい接続はタイプをHttpURLConnectionにし、そのurl値は構成サーバーのエンド・ポイント(またはシード) URLを指し、そのnameは最終的にJava Beanコードで参照される任意の値に設定されている必要があります。

例9-1は、connections.xmlファイルに構成サービスのエンド・ポイントを定義する方法を示しています。

例9-1 connections.xmlファイルでのエンド・ポイントの設定

<Reference name="ConfigServiceConnection"
className="oracle.adf.model.connection.url.HttpURLConnection"
credentialStoreKey="ConfigServiceConnection"
adfCredentialStoreKey="ConfigServerLogin"
xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="ADFMFSecuredConfigServer">
<Contents>
<urlconnection name="ADFMFSecuredConfigServer"
url="http://127.0.0.1"/>
<authentication style="challange">
<type>basic</type>
<realm>myrealm</realm>
</authentication>
</urlconnection>
</Contents>
</XmlRefAddr>
<SecureRefAddr addrType="username"/>
<SecureRefAddr addrType="password"/>
</RefAddresses>
</Reference>
<Reference name="ConfigServerLogin"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="ConfigServerLogin"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://127.0.0.1"/>
<logout url="http://127.0.0.1"/>
<accessControl url=""/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<authenticationMode value="remote"/>
<rememberCredentials>
<enableRememberUserName value="true"/>
<rememberUserNameDefault value="true"/>
<enableRememberPassword value="false"/>
<enableStayLoggedIn value="true"/>
<stayLoggedInDefault value="true"/>
</rememberCredentials>
<userObjectFilter/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

構成サーバーに対してセキュリティが有効である場合、connections.xmlファイルには次の追加の定義を含める必要があります。

- URL接続と同じエンド・ポイント(またはシード) URLを指すログイン接続が必要です。ログイン接続とHttpURLConnectionは、同じadfCredentialStoreKeyを共有する必要があります。

エンド・ポイントURLは、エンド・ユーザーから取得する必要があり、connections.xmlファイルには設定できない場合があります。この場合は、エンド・ポイントURLの値を取得するためのユーザー・インタフェースを作成し、それをアプリケーション・プリファレンスに設定できます。その後、例9-2に示すとおり、プリファレンスの値をJava Beanメソッドで使用して、接続URL値をオーバーライドできます。

例9-2 接続定義のオーバーライド

AdfmfJavaUtilities.overrideConnectionProperty("ConfigServerConnection",
"login",
"url",
<Endpoint_URL>);

9.3 構成サービスのユーザー・インタフェースの作成

構成サービス・ユーザー・インタフェースの要件がある場合は、それを新規または既存のアプリケーション機能に作成する必要があります。

MAFでは、サーバー上での新たな変更をチェックし、更新をダウンロードできるAPIセットがoracle.adfmf.config.client.ConfigurationServiceクラス内に用意されています。これらのAPIをJava Beanで使用すると、構成サービス・アプリケーション機能を介して該当するメソッドをアクティブ化できます。

次のAPIリストとその使用例では、_configservice変数はoracle.adfmf.config.client.ConfigurationServiceクラスのインスタンスを表します。

- setDeliveryMechanismメソッドは、構成サービスの配信メカニズムを設定します。以前のリリースの構成サーバーとの通信がHTTPを介して有効であるため、httpはこのメソッドの引数として渡されます。

_configservice.setDeliveryMechanism("http");

注意:

このメソッド引数は構成サービスに対して使用されるWebトランスポートを表しており、HTTPまたはHTTPSと混同しないでください。エンド・ポイントがHTTPS URLである場合、トランスポートをhttpに設定することは引き続き有効です。

- setDeliveryMechanismConfigurationメソッドは、構成サーバー接続およびエンド・ポイントURLを関連付けることができる追加の属性を構成サービスに対して設定します。

_configservice.setDeliveryMechanismConfiguration("connectionName",
"ConfigServerConnection");
_configservice.setDeliveryMechanismConfiguration("root", <Endpoint_URL);

- isThereAnyNewConfigurationChangesメソッドは、サーバー上でダウンロード可能な変更があるかどうかをチェックし、ある場合はtrueを返します。

_configservice.isThereAnyNewConfigurationChanges(<APPLICATION_ID>, <VERSION>);

- stageAndActivateVersionメソッドは、構成サービスによる更新のダウンロードをトリガーします。アプリケーションのバージョンが、ハードコードされた値またはApplication.getApplicationVersion APIから取得された値として、このメソッドに引数として渡されます。

_configservice.stageAndActivateVersion("1.0");

_configservice.stageAndActivateVersion(Application.getApplicationVersion);

- addProgressListenerメソッドは、構成サービスに更新進捗リスナーを登録して、更新メッセージおよび進捗状況を受信します。基礎クラスは、ProgressListenerインタフェースおよび構成サービスから呼び出されるupdateProgressメソッドを実装している必要があります。updateProgressメソッドは、進捗更新メッセージおよび更新完了率を受信します。

_configservice.addProgressListener(this);

- removeProgressListenerメソッドは、更新進捗リスナーを登録解除します。

_configservice.removeProgressListener(this);

ConfigServiceという名前のMAFサンプル・アプリケーションは、これらのAPIを使用して構成サーバーと通信する方法を示しています。ConfigServiceアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

9.4 URLの構築について

構成サービスの各管理対象リソースへのURLが構築されています。これには、次のようにアプリケーションIDとファイル名が含まれています。

URLのhttp://my.server.com:port/SomeLocationとアプリケーションIDのcom.mycompany.appnameがユーザーによって指定されている場合は、次のURLを使用して構成ファイルをダウンロードします。

http://my.server.com:port/SomeLocation/com.mycompany.appname/connections.xml
http://my.server.com:port/SomeLocation/com.mycompany.appname/adf-config.xml
http://my.server.com:port/SomeLocation/com.mycompany.appname/maf-config.xml

9.5 サーバー上での構成サービスの設定

構成サービスは、HTTP GETリクエストを受け入れ、connections.xmlファイルを返すサービスとして実装できます。

構成サービス・クライアントによって使用されるURLの形式は、次のとおりです。

url configured in adf-config.xml/id in maf-application.xml/connections.xml

構成サービスのエンド・ポイントは、HTTPおよびHTTPSを経由する基本認証(BASIC_AUTH)を使用して保護できます。

9.6 構成サービスの移行

アプリケーションが以前のリリースのMAFを使用して作成され、そのアプリケーションが構成サービスを使用する場合は、手動で移行を実行する必要があります。

移行の主な理由は、現在のリリースでは、MAFは構成サービスの機能の有効化に不可欠な役割を果たしてきた次のAPI、プロパティおよびユーティリティのサポートを解除したことです。

- MAFには以前は、use-configuration-service-at-startupプロパティを設定してサービスを有効にし、adfmf-configuration-service-seed-urlプロパティを設定してエンド・ポイントURLを提供することで、adf-config.xmlファイルから構成サービスを操作する手段が用意されていました。

- checkForUpdates APIには、構成サービスの更新をチェックする手段が用意されていました。

- 構成サービスは、MAFに用意されているUIから開始しました。

移行を開始するには、第9.2項「構成サービスのエンド・ポイントの定義」の説明に従って、エンド・ポイント(またはシード) URLをadf-config.xmlファイルからconnections.xmlファイルに移動し、新しい接続要素をconnections.xmlファイルに追加する必要があります。

現在のリリースではMAFに構成サービス用のユーザー・インタフェースが用意されていないため、そのユーザー・インタフェースの要件があることを前提にして、新規または既存のアプリケーション機能にユーザー・インタフェースを作成する必要があります。詳細は、第9.3項「構成サービスのユーザー・インタフェースの作成」を参照してください。

ConfigServiceという名前のMAFサンプル・アプリケーションは、APIを使用して前回のリリースのMAFに含まれていた構成サーバーと通信する方法を示しています。ConfigServiceアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

10 ローカル・データベースの使用方法

この章では、MAFアプリケーションでローカルSQLiteデータベースを使用する方法について説明します。

この章の内容は次のとおりです。

- 第10.1項「ローカルSQLiteデータベースの使用方法の概要」

- 第10.2項「ローカルSQLiteデータベースの使用方法」

10.1 ローカルSQLiteデータベースの使用方法の概要

SQLiteは、特に埋込みアプリケーション用に設計されたリレーショナル・データベース管理システム(RDBMS)です。

SQLiteには次の特性があります。

- ACID準拠: 他の従来のデータベース・システムと同様に、原子性、一貫性、独立性および永続性という特性を備えています。

- 軽量: アプリケーション内に直接埋め込むように設計された小さなCライブラリでデータベース全体が構成されています。

- 移植性: 様々な範囲のコンピュータ・アーキテクチャおよびオペレーティング・システム間でバイナリ互換性がある単一ファイルでデータベースは自己完結型となります。

詳細は、SQLite Webサイト(http://www.sqlite.org)を参照してください。

ローカルのSQLiteデータベースの使用例は、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルにあるStockTrackerというMAFサンプル・アプリケーションを参照してください。詳細は、第10.2.8項「StockTrackerサンプル・アプリケーションに関する必知事項」を参照してください。

10.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)

10.1.1.1 同時実行性

SQLiteデータベースの単一インスタンスは、常に、単一の読取り/書込み接続または複数の読取り専用接続のいずれかを持つことができます。

ロック・メカニズムが粗いため、SQLiteでは、同一のデータベース・インスタンスに対する複数の読取り/書込み接続がサポートされていません。詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『File Locking And Concurrency In SQLite Version 3』(http://www.sqlite.org/lockingv3.html)を参照してください。

10.1.1.2 SQLのサポートおよび解釈

SQLiteはSQL92標準でコンパイルされますが、サポートされていない構成が次を含めていくつか存在します。

- RIGHT OUTER JOIN

- FULL OUTER JOIN

- GRANT

- REVOKE

詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『SQL Features That SQLite Does Not Implement』(http://www.sqlite.org/omitted.html)を参照してください。

SQLiteによるSQLの解釈の方法の詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『SQL As Understood by SQLite』(http://www.sqlite.org/lang_createtable.html)を参照してください。

10.1.1.3 データ型

大部分のデータベース・システムは強く型指定をしているのに対して、SQLiteは動的な型指定のため、宣言された型とは無関係にどの列にどの値を格納することもできます。たとえば、数値列に文字列値が間違って格納された場合でも、SQLiteではエラーは戻されません。詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『Datatypes In SQLite Version 3』(http://www.sqlite.org/datatype3.html)を参照してください。

10.1.1.4 外部キー

SQLiteでは、外部キーをサポートしています。外部キー制約を解析および適用します。詳細は、http://www.sqlite.org/foreignkeys.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『SQLite Foreign Key Support』を参照してください。

10.1.1.5 データベース・トランザクション

SQLiteはACID準拠であるためトランザクションをサポートしていますが、SQLiteとOracleのトランザクション・サポートの間には基本的な相違点がいくつか存在します。

- ネストされたトランザクション: SQLiteでは、ネストされたトランザクションをサポートしません。単一のトランザクションのみを常時アクティブにできます。

- コミット: SQLiteは、任意の指定されたデータベースに対し、複数の読取り専用接続または単一の読取り/書込み接続のいずれかを許容します。したがって、同一のデータベースに対して複数の接続がある場合は、データベースの変更を試みる最初の接続のみが成功します。

- ロールバック: SQLiteでは、開いているすべてのResultSetsを閉じるまではトランザクションのロールバックができません。

詳細は、SQLite Webサイトのドキュメント・セクションで入手可能な『Distinctive Features of SQLite』(http://www.sqlite.org/different.html)を参照してください。

10.1.1.6 認証

SQLiteでは、ロールベースまたはユーザーベースの認証はどの形式もサポートしていません。デフォルトで、どのユーザーもファイル内のすべてのデータにアクセスできます。ただし、MAFでは、使用可能な暗号化ルーチンを提供することで、データを保護し、有効な資格証明セットを持たないユーザーによるアクセスを防ぎます。詳細は、第10.2.7項「データベースを暗号化および復号化する方法」を参照してください。

10.2 ローカルSQLiteデータベースの使用方法

MAFには、暗号化されたSQLite 3.7.9データベースが含まれています。

通常SQLiteを使用する場合は、次のことを知っておく必要があります。

- データベースへの接続方法

- SQLスクリプトを使用してデータベースを初期化する方法またはデスクトップ上でデータベースを初期化する方法

- データベースを暗号化および復号化する方法

- VACUUMコマンドの使用方法

10.2.1 データベースへの接続方法

SQLiteデータベースへの接続は、Oracleデータベースへの接続を開く場合とは少し異なります。つまり、最初の接続を取得すると、同じJDBC APIおよびSQL構文の大部分が使用可能になり、データベースの問合せと変更が可能になります。

ユーザーのアプリケーションに関連付けられたjava.sql.Connectionオブジェクトを使用して、SQLiteデータベースに接続します。接続を作成する場合は、どのSQLite JDBC URLもjdbc:sqlite:というテキストで始まるようにします。

例10-1は、暗号化されていないデータベースと接続を開く方法を示しています。

例10-1 暗号化されていないデータベースとの接続

java.sql.Connection connection = new SQLite.JDBCDataSource
("jdbc:sqlite:/path/to/database").getConnection();

例10-2は、暗号化されたデータベースと接続を開く方法を示しています。

例10-2 暗号化されたデータベースとの接続

java.sql.Connection connection = new SQLite.JDBCDataSource
("jdbc:sqlite:/path/to/database").getConnection(null,"password");

前述の例では、getConnectionメソッドの最初のパラメータがユーザー名となっていますが、SQLiteではユーザーベースのセキュリティがサポートされないため、この値は無視されます。

注意:

SQLiteでは、不正なパスワードで暗号化されたデータベースを開いた場合でも、エラー・メッセージが表示されません。同様に、暗号化されていないデータベースをパスワードで誤って開いた場合でも警告は表示されません。そのかわりに、データの読取りまたは変更を試みた場合は、「エラー: ファイルが暗号化されているか、ファイルがデータベースではありません。」というメッセージとともにSQLExceptionがスローされます。

10.2.2 SQLスクリプトを使用してデータベースを初期化する方法

通常、アプリケーションの起動時にSQLスクリプトを使用してデータベースを初期化できます。例10-3は、サポートされたSQL構文(第10.1.1.2項「SQLのサポートおよび解釈」で説明)の一部を示すSQL初期化スクリプトを示しています。この構文では、DROP TABLE、CREATE TABLEおよびINSERTの各コマンドとNUMBERおよびVARCHAR2の各データ型が使用されています。

例10-3 SQL初期化スクリプト

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として保存されているものとします。例10-4は、SQLスクリプトを解析し、その文を実行するために追加する必要のあるコードが示されています。

例10-4 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();
}
}

注意:

例10-4では、わかりやすくするためにエラー処理が省略されました。

例10-5で示すとおり、LifeCycleListenerImplのstartメソッドからデータベース初期化コード(例10-4を参照)を起動します。

例10-5 データベース初期化コードの起動

public void start() {
try {
initializeDatabaseFromScript();
}
catch (Exception e) {
Trace.log(Utility.FrameworkLogger,
Level.SEVERE,
LifeCycleListenerImpl.class,
"start",
e);
}
}

10.2.3 デスクトップ上でデータベースを初期化する方法

SQLiteデータベースは自己完結型でプラットフォーム間のバイナリ互換性があるため、同じデータベース・ファイルをiOS、Android、Windows、LinuxおよびMac OSの各プラットフォームで使用できます。複雑なケースでは、サード・パーティのツール(MesaSQLite、SQLiteManager、SQLite Database Browserなど)を使用してデスクトップ上でデータベースを初期化し、結果ファイルをアプリケーション内のリソースとしてパッケージ化できます。

データベースを使用するには、それをMAFアプリケーションのApplicationControllerプロジェクトにリソースとして追加します。データベースは、META-INFディレクトリにsample.dbとして保存されているものとします。例10-6は、アプリケーションからモバイル・デバイスのファイル・システムにデータベースをコピーしてデータベースへのアクセスを有効化するために追加する必要のあるコードを示しています。

例10-6 デスクトップ上のデータベースの初期化

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();
}
}

注意:

例10-6では、わかりやすくするためにエラー処理が省略されました。

例10-7で示すとおり、LifeCycleListenerImplのstartメソッドからデータベース初期化コード(例10-6を参照)を起動します。

例10-7 データベース初期化コードの起動

public void start() {
try {
initializeDatabase();
}
catch (Exception e) {
Trace.log(Utility.FrameworkLogger,
Level.SEVERE,
LifeCycleListenerImpl.class,
"start",
e);
}
}

10.2.4 コミット処理に関する必知事項

Commit文があってもこれは無視されます。各文は、SQLスクリプトから読み込まれる際にコミットされます。この自動コミット機能は、デフォルトでSQLiteデータベースによって提供されます。アプリケーションのパフォーマンスを向上させるために、ConnectionのsetAutoCommit(false)メソッドを使用して自動コミットを無効化し、commit文の標準的な実行を許可できます。

10.2.5 MAFでのSQLite JDBCドライバの制限

java.sqlパッケージからの次のメソッドは、MAF内では制限があるか、サポートされていません。

- ResultSetのgetByteメソッドはサポートされていません。このメソッドを使用した場合は、実行時にメソッドからSQLExceptionがスローされます。

- (ResultSetを戻す文に対してのみtrueを戻すのとは対照的に)Statementのexecuteメソッドは常にtrueを戻します。

10.2.6 VACUUMコマンドの使用方法

レコードがSQLiteデータベースから削除された場合、そのサイズは変更されません。このことは断片化の原因となり、最終的には、パフォーマンスが低下します。VACUUMコマンドを定期的に実行することによって、このことを回避できます。

注意:

VACUUMは、大規模データベースに対して実行される場合、かなりの時間がかかる場合があります(SQLiteがデプロイされているLinuxコンピュータ上ではMB当たり約0.5秒)。また、実行中は、元のファイルの最大2倍の一時ディスク領域を使用する可能性があります。

通常、VACUUMコマンドは、適切に登録されたLifeCycleListener実装から実行する必要があります(第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」を参照)。

10.2.7 データベースを暗号化および復号化する方法

MAFでは、様々なAPIを使用して、初期またはそれ以降に暗号化したSQLiteデータベースを提供できます。これらのAPIの一部では、データベースを暗号化するために独自のパスワードを指定できます。その他は、MAFによってパスワードを生成し、オプションでパスワードを管理する場合に使用されます。

独自のパスワードでデータベースを暗号化するには:

1. データベース接続を確立します(第10.2.1項「データベースへの接続方法」を参照)。

2. 次のユーティリティ・メソッドを使用して、データベースを新しいキーで暗号化します。

AdfmfJavaUtilities.encryptDatabase(connection, "newPassword");

独自のパスワードで暗号化されたデータベースを永続的に復号化するには:

1. 暗号化されたデータベースを正しいパスワードで開きます。

2. 次のユーティリティ・メソッドを使用します。

AdfmfJavaUtilities.decryptDatabase(connection);

注意:

データベースを不正に開いて(不正なパスワードを使用して暗号化されたデータベースを開くなど)、再び暗号化した場合は、以前の正しいパスワード、不正なパスワード、新しいパスワードのいずれでもデータベースのロックを解除できなくなり、取り返しのつかないデータの損失につながります。

MAFによって生成されたパスワードを使用してデータベースを暗号化するには:

1. 次のメソッドを使用してパスワードを生成します。

GeneratedPassword.setPassword("databasePasswordID", "initialSeedValue");

このメソッドでは、暗号関数で強力なパスワードを生成できるように、一意の識別子と初期シード値の両方が必要です。

2. 前に指定したIDを使用して、作成したパスワードを次のように取得します。

char[] password = GeneratedPassword.getPassword("databasePasswordID");

3. データベース接続を確立します(第10.2.1項「データベースへの接続方法」を参照)。

4. データベースを次のように暗号化します。

AdfmfJavaUtilities.encryptDatabase(connection, new String(password));

データベースを復号化し、MAFによって生成されたパスワードを削除するには:

1. 正しいパスワードを次のように取得します。

char[] password = GeneratedPassword.getPassword("databasePasswordID");

2. データベース接続を確立し、データベースを次のように復号化します。

java.sql.Connection connection =
SQLite.JDBCDataSource("jdbc:sqlite:/path/to/database").
getConnection(null, new String(password));

3. オプションで、次のメソッドを使用して、生成されたパスワードを削除します。

GeneratedPassword.clearPassword("databasePasswordID");

10.2.8 StockTrackerサンプル・アプリケーションに関する必知事項

StockTrackerサンプル・アプリケーションは、カスタムSQLiteデータベース・ファイル(このアプリケーション内にパッケージ化されています)を使用します。データベース・ファイルには、4つの株に関する情報が含まれる4つのレコードのある表が含まれています。アプリケーションは、アクティブ化されると、この表からデータを読み取り、4つの株を表示します。株に関する情報は、CRUD操作の対象にできます。株は、ユーザー・インタフェースを介して、作成、並替え、更新および削除できます。株の並替えを含むすべてのCRUD操作が、SQLiteデータベースで更新されます。

11 MAF AMXアプリケーション機能アーティファクトのカスタマイズ

この章では、既存のMAF AMXページ、タスク・フローおよびページ定義ファイルのカスタマイズの実行方法について説明します。

この章の内容は次のとおりです。

- 第11.1項「MAF AMXページおよびアーティファクトのカスタマイズの概要」

- 第11.2項「MAF AMXページおよびアーティファクトのカスタマイズ」

- 第11.3項「カスタマイズ・クラスに関する必知事項」

- 第11.4項「カスタマイズ・レイヤーの構成」

- 第11.5項「カスタマイズ・クラスの使用」

- 第11.6項「adf-config.xmlファイルの構成方法」

- 第11.7項「「カスタマイズ開発者」ロールに関する必知事項」

11.1 MAF AMXページおよびアーティファクトのカスタマイズの概要

JDeveloperおよびOracle Metadata Service (MDS)により提供される標準のカスタマイズ・メカニズムを使用して、次のものを含む既存のMAF AMXアプリケーション機能アーティファクトおよびメタデータ・ファイルをカスタマイズできます。

- MAF AMXファイル(.amx)。

- タスク・フロー・ファイル(ViewController-task-flow.xmlなど)。

- ページ定義ファイル(<ページ名>.PageDef.xml)。

- データ・コントロールXMLファイル(データ・コントロール構造ファイルを含むパッケージ・ファイル(つまり、データ・コントロール名の前にpersdef.が付加された名前のパッケージ・ファイル))。詳細は、第7.8項「データ・コントロールの構成」を参照してください。

デザインタイムに行ったカスタマイズの変更は、デプロイメント中にファイルに適用され、ランタイムに表示されるようになります。MAF AMXは、特定のカスタマイズ・コンテキストの最終バージョンがデプロイメント中にシードされ、そのカスタマイズ・コンテキストに対してランタイムに静的に動作する、静的シード・カスタマイズをサポートしています。カスタマイズ・コンテキストごとに個別のMAFアプリケーションをデプロイする必要があります。

注意:

MAF AMXでは、ランタイムにカスタマイズの作成および適用の両方を実行するユーザー・カスタマイズをサポートしていません。

11.2 MAF AMXページおよびアーティファクトのカスタマイズ

次のようにMAF AMXページおよびアーティファクトをカスタマイズします。

1. 例11-1に示すとおりにjdev_install/jdeveloper/jdev/CustomizationLayerValues.xmlファイルを変更して、カスタマイズ・レイヤーおよびレイヤー値を定義します。

例11-1 カスタマイズ・レイヤーの定義

<cust-layers xmlns="http://xmlns.oracle.com/mds/dt">
<cust-layer name="site" id-prefix="s">
<!-- Generated id-prefix would be "s1" and "s2"
for values "site1" and "site2" -->
<cust-layer-value value="headquarter"
display-name="Headquarter"
id-prefix="1" />
<cust-layer-value value="remoteoffices"
display-name="Remote Office"
id-prefix="2" />
</cust-layer>
</cust-layers>

詳細は、第11.4項「カスタマイズ・レイヤーの構成」を参照してください。

2. カスタマイズ・クラス(oracle.mds.cust.CustomizationClassを拡張するPOJOクラス)を作成します。詳細は、第11.3項「カスタマイズ・クラスに関する必知事項」を参照してください。

注意:

カスタマイズ・クラスは、別のJavaアプリケーションで作成できます。

3. 次のようにして、JDeveloperデザインタイムがカスタマイズにアクセスできるようにします。

1. カスタマイズ・クラス(.javaファイル)をJARファイルとしてパッケージ化します。

2. MAFアプリケーションのいずれかのプロジェクトにJARファイルを追加します。
詳細は、第11.5.1項「デザインタイムにJDeveloperでカスタマイズ・クラスを使用可能にする方法」を参照してください。

4. 例11-2に示すとおりに、カスタマイズ・クラスをcust-configセクションに追加して、MAFアプリケーションのadf-config.xmlファイルに登録します。

例11-2 カスタマイズ・クラスの登録

<?xml version="1.0" encoding="windows-1252" ?>
<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="customclass.SiteCC"/>
</match>
</cust-config>
</mds-config>
</adf-mds-config>
</adf-config>

詳細は、第11.6項「adf-config.xmlファイルの構成方法」を参照してください。

5. 「カスタマイズ開発者」ロールでJDeveloperを再起動します。詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のJDeveloperロールでの作業に関する項および第11.7項「「カスタマイズ開発者」ロールに関する必知事項」を参照してください。

注意:

「カスタマイズ開発者」ロールでは、ファイルを変更できますが、追加はできません。

6. ファイルに必要な変更を加えます。変更はMDSにより、ViewControllerプロジェクトのmdssysディレクトリに記録されます。

7. アプリケーションを、モバイル・デバイス、エミュレータにデプロイするか、プラットフォーム固有のアプリケーション・パッケージとしてデプロイします。

注意:

デプロイメント時に、現在のカスタマイズ・コンテキストが取得され、デプロイされたアプリケーションのMAF AMXページで宣言したカスタマイズ済コンテンツが新しいデプロイメント・アーティファクトに含められます。カスタマイズ済コンテンツはデプロイメント・プロファイル名別にグループ化され、MAF AMXアプリケーション機能内の複数のページにまたがる場合があります。

Studio開発者ロールまたは「カスタマイズ開発者」ロールで、カスタマイズされたアプリケーションをデプロイできます。「カスタマイズ開発者」ロールでデプロイするには、次の手順を実行します。

1. 「カスタマイズ開発者」ロールでアプリケーションを起動します。

2. 図11-1に示す「カスタマイズ・コンテキスト」ウィンドウで、カスタマイズを実装するレイヤーと値を選択します。

図11-1 デプロイメント用カスタマイズ・コンテキストの選択

3. デプロイメント・オプションの中から選択します(「アプリケーション」→「デプロイ」を選択してから、デプロイメント・プロファイルを選択してアクセスします)。詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

4. 各カスタマイズ・コンテキストに対して別のデプロイメントを実行します。

デプロイメント時に、ベース・ファイルおよびデルタ・ファイルがマージされ、実行時のアプリケーションのカスタマイズ・バージョンが作成されます。デプロイされたアプリケーションには、MDSの依存性はありません。

ヒント:

カスタマイズしたアプリケーションをMAFアプリケーション・アーカイブ(.maa)ファイルとしてデプロイして、このファイルをアプリケーションにインポートし、別のカスタマイズを実行したり、アップグレードすることもできます。.maaファイルに含まれるデルタ・ファイルは、デプロイメント後にベース・ファイルとマージされます。詳細は、第4.14.7項「カスタマイズを使用したモバイル・アプリケーションのアップグレード」を参照してください。

カスタマイズ・プロセスが完了すると、JDeveloperによりカスタマイズ用のメタデータ・ファイルとこれらを格納するサブパッケージが作成されます。メタデータ・ファイルにはカスタマイズしたオブジェクトのカスタマイズが含まれ、これらは実行時にベース・メタデータに適用されます。図11-2、図11-3、図11-4および図11-5に示すとおり、JDeveloperにより、オブジェクトのベース・ファイルと同じ名前に.xml拡張子を追加した名前が新しいメタデータ・ファイルに付けられます。

図11-2 MAF AMXページのカスタマイズ・ファイル

図11-3 タスク・フローのカスタマイズ・ファイル

図11-4 ページ定義のカスタマイズ・ファイル

図11-5 データ・コントロールXMLファイルのカスタマイズ・ファイル

Webサービス・データ・コントロールのカスタマイズの詳細は、第4.14.4項「Webサービス・データ・コントロールとカスタマイズしたアプリケーションのデプロイメントに関する必知事項」を参照してください。

MAFアプリケーション・レベルのアーティファクトのカスタマイズの詳細は、第4.14項「Oracle Metadata Servicesを使用したMAFファイルのカスタマイズ」を参照してください。

11.3 カスタマイズ・クラスに関する必知事項

カスタマイズ・クラスでは、現在のコンテキストが評価されてStringの結果が戻されます。このStringの結果を使用してカスタマイズ・レイヤーが検索されます。

カスタマイズ・クラスによって、次の情報が提供されます。

- レイヤー名を表す名前。

- レイヤーで作成されたオブジェクトのIDPrefix。カスタマイズ・レイヤーで新しいオブジェクトを作成する場合、一意のIDが必要です。オブジェクトの自動生成IDにIDPrefixが追加されて、新たに追加されたオブジェクトのIDが作成されます。異なるカスタマイズ・レイヤーで作成されたオブジェクトに一意のIDを指定するために、各レイヤーに一意のIDPrefixを指定する必要があります。

- カスタマイズ・クラスによって定義されたレイヤーのキャッシュ・ヒント(CacheHint)。MAFでは、キャッシュ・ヒントによって静的なカスタマイズ・レイヤーが定義され、getCacheHintメソッドは常にALL_USERSを返し、これは特定のデプロイメントに対しカスタマイズがグローバルに(無条件で)適用されることを意味します。

注意:

カスタマイズ・クラスは頻繁に実行されることが多いため(レイヤー名とレイヤー値を取得するために、アクセスされるドキュメントごとに1回)、効率性を確保するようにしてください。

カスタマイズを使用して、特定の業種ドメインに合わせてMAF AMXアプリケーション機能を調整できます(垂直統合)。このようなドメインはそれぞれカスタマイズ・レイヤーを表しており、カスタマイズ・クラスを使用して示されます。

11.3.1 静的なカスタマイズ・コンテンツに関する必知事項

静的なカスタマイズには、アプリケーションのすべての実行に適用されるレイヤー値が1つのみあります。静的なカスタマイズでは、アプリケーションを実行するすべてのユーザーでカスタマイズの値が同じです。

MAFアプリケーションで使用されるカスタマイズ・クラスでは、getCacheHintメソッドは常にALL_USERSを返し、これはカスタマイズ・レイヤーが常に静的であることを意味します。CacheHint値の詳細は、11.3項「カスタマイズ・クラスに関する必知事項」を参照してください。

カスタマイズ・クラスの実装方法によっては、すべてのオブジェクトが静的なカスタマイズ・レイヤーを持つことができます。

11.4 カスタマイズ・レイヤーの構成

アプリケーションをカスタマイズするには、JDeveloperで認識できるように、CustomizationLayerValues.xmlファイルでカスタマイズ・レイヤーとその値を指定する必要があります。

カスタマイズ可能なアプリケーションを「カスタマイズ開発者」ロールで開くと、JDeveloperによりadf-config.xmlファイルが読み取られ、使用するカスタマイズ・クラスと優先順位が判別されます。また、CustomizationLayerValues.xmlファイルも読み取られ、「カスタマイズ・コンテキスト」ウィンドウで使用可能にするレイヤー値が判別されます。CustomizationLayerValues.xmlファイルで定義されたレイヤー値がカスタマイズ・クラス(adf-config.xmlファイルにリストされている)で定義されていない場合、これらは「カスタマイズ・コンテキスト」ウィンドウに表示されません。

したがって、CustomizationLayerValues.xmlファイルにすべてのカスタマイズ・プロジェクトの包括的なレイヤー値リストを含めて、現在のアプリケーションに適したもののみを「カスタマイズ・コンテキスト」ウィンドウに表示できます。逆に、MAF AMXアプリケーション機能の包括的なカスタマイズ・クラスのリストをadf-config.xmlファイルに含めて、作業するレイヤー値のサブセットのみをCustomizationLayerValues.xmlファイルに含めることもできます。

注意:

デザインタイムには、JDeveloperはCustomizationLayerValues.xmlファイルからカスタマイズ・レイヤー値を取得します。ただし、ランタイムには、レイヤー値はカスタマイズ・クラスから取得されます。

CustomizationLayerValues.xmlファイルに入力するレイヤー名およびレイヤー値は、カスタマイズ・クラスで指定されたものと一致する必要があります。例11-3にサンプルのCustomizationLayerValues.xmlファイルの内容を示します。

例11-3 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の一意性を確保し、カスタマイズを正確に適用できます。カスタマイズ中に新規要素(commandButtonなど)をMAF AMXページに追加すると、(選択したヒント・レイヤーで決定された)レイヤーとレイヤー値のid-prefixが要素の自動生成識別子に追加され、カスタマイズ・メタデータ・ファイルで新たに追加された要素のidが作成されます。前述の例では、siteレイヤーにsというid-prefixが付けられ、headquartersレイヤー値にhqというid-prefixが付けられています。したがって、ヒント・レイヤーとしてsite/headquartersを選択して、ボタン・コンポーネントをページに追加すると、メタデータ・カスタマイズ・ファイルでcommandButton要素にshqcb1というidが設定されます。

各レイヤー値に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用にグローバルにレイヤー値を構成する方法の詳細は、第11.4.1項「レイヤー値をグローバルに構成する方法」を参照してください。アプリケーション固有のレイヤー値を構成する方法の詳細は、第11.4.2.1項「Studio開発者ロールの使用方法」を参照してください。

11.4.1 レイヤー値をグローバルに構成する方法

始める前に

- 第11.3項「カスタマイズ・クラスに関する必知事項」の説明に従って、カスタマイズ・クラスを作成します。

- 第11.5.1項「デザインタイムにJDeveloperでカスタマイズ・クラスを使用可能にする方法」の説明に従って、クラスをJDeveloperで使用できるようにします。

JDeveloper用にデザインタイム・カスタマイズ・レイヤー値をグローバルに構成するには:

1. JDeveloperインストール・ディレクトリのjdevサブディレクトリにあるCustomizationLayerValues.xmlファイル(jdev_install\jdev\CustomizationLayerValues.xml)を開きます。

2. 各レイヤーに、例11-3「CustomizationLayerValues.xmlで定義されているレイヤーおよびレイヤー値」に示すとおりにcust-layer要素を入力します。

3. 各レイヤー値に、例11-3「CustomizationLayerValues.xmlで定義されているレイヤーおよびレイヤー値」に示すとおりにcust-layer-value要素を入力します。

4. CustomizationLayerValues.xmlファイルを保存して閉じます。

5. グローバルなCustomizationLayerValues.xmlファイルに変更を加えたら、JDeveloperを再起動します。

11.4.2 ワークスペース・レベルのレイヤー値の構成方法

アプリケーションのレイヤー値を構成する場合、Studio開発者ロール(第11.4.2.1項「Studio開発者ロールの使用方法」を参照)または「カスタマイズ開発者」ロール(第11.4.2.2項「「カスタマイズ開発者」ロールの使用方法」を参照)のいずれかを使用できます。アプリケーション固有のCustomizationLayerValues.xmlファイルを構成する場合、レイヤー値を作成および変更できますが、追加のカスタマイズ・レイヤーを作成できません。アプリケーション固有のレイヤー値に対して行った変更を適用するためにJDeveloperを再起動する必要はありません。

アプリケーション固有のCustomizationLayerValues.xmlファイルを作成すると、JDeveloperはこのファイルをアプリケーション・レベルのディレクトリに格納します(workspace-directory\.mds\dt\customizationLayerValues\CustomizationLayerValues.xmlなど)。このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」ウィンドウのMDS DTノードの下にあります。

11.4.2.1 Studio開発者ロールの使用方法

次に、Studio開発者ロールで特定アプリケーションのCustomizationLayerValues.xmlファイルを構成する手順について説明します。

始める前に

- 第11.3項「カスタマイズ・クラスに関する必知事項」の説明に従って、カスタマイズ・クラスを作成します。

- 第11.5.1項「デザインタイムにJDeveloperでカスタマイズ・クラスを使用可能にする方法」の説明に従って、クラスをJDeveloperで使用できるようにします。

Studio開発者ロールからワークスペース・レベルでデザインタイム・カスタマイズ・レイヤー値を構成するには:

1. 「アプリケーション・リソース」ウィンドウで、「ディスクリプタ」→「ADF META-INF」ノードを開き、adf-config.xmlをダブルクリックします。

2. 概要エディタで、「MDS構成」ナビゲーション・タブをクリックします。

3. カスタマイズ・クラスの表の下の「MDS構成」ページで、「デザインタイム・カスタマイズ・レイヤー値の構成」をクリックして、ワークスペース・レベルのCustomizationLayerValues.xmlファイルをソース・エディタで開きます。

注意:

オーバーライド・ファイルが存在しない場合、JDeveloperは、確認ダイアログを表示します。「はい」をクリックして、グローバル・ファイルのコピーを作成して開きます。

4. このファイルで、第11.4項「カスタマイズ・レイヤーの構成方法」の説明に従って、必要なレイヤー値を指定します。

5. 変更を保存します。

11.4.2.2 「カスタマイズ開発者」ロールの使用方法

次に、「カスタマイズ開発者」ロールで特定アプリケーションのCustomizationLayerValues.xmlファイルを構成する手順について説明します。

始める前に

- 第11.3項「カスタマイズ・クラスに関する必知事項」の説明に従って、カスタマイズ・クラスを作成します。

- 第11.5.1項「デザインタイムにJDeveloperでカスタマイズ・クラスを使用可能にする方法」の説明に従って、クラスをJDeveloperで使用できるようにします。

「カスタマイズ開発者」ロールからワークスペース・レベルでデザインタイム・カスタマイズ・レイヤー値を構成するには:

1. 「カスタマイズ・コンテキスト」ウィンドウで、「アプリケーション・レイヤー値の構成」をクリックし、CustomizationLayerValues.xmlファイルをソース・エディタで開きます。

注意:

オーバーライド・ファイルが存在しない場合、JDeveloperは、確認ダイアログを表示します。「はい」をクリックして、グローバル・ファイルのコピーを作成して開きます。

2. このファイルで、第11.4項「カスタマイズ・レイヤーの構成方法」の説明に従って、必要なレイヤー値を指定します。

3. 変更を保存します。

「カスタマイズ開発者」ロールの間にアプリケーション固有のCustomizationLayerValues.xmlファイルに対して変更を行った後、「カスタマイズ・コンテキスト」ウィンドウで選択したヒント・レイヤーが選択解除されます。必要なヒント・レイヤーを選択できます。

11.5 カスタマイズ・クラスの使用

カスタマイズ・クラスを作成後、これらをデザインタイムに「カスタマイズ開発者」ロールで、およびランタイムにアプリケーションで使用できます。アプリケーションまたはJDeveloperで使用するには、クラスを適切にパッケージ化する必要があります。

11.5.1 デザインタイムにJDeveloperでカスタマイズ・クラスを使用可能にする方法

カスタマイズ・クラスの作成後、JDeveloperでカスタマイズ・クラスを使用可能にして、カスタマイズの実装時に「カスタマイズ開発者」ロールで操作中に使用できるようにする必要があります。

カスタマイズ・クラスは再利用可能コンポーネントであるため、別個のプロジェクトを作成してこれにカスタマイズ・クラスを含めて、独自のJARファイルにパッケージ化できます。その後、使用するアプリケーションにJARをインポートし、カスタマイズ・クラスをJDeveloperで使用できます。

注意:

使用するアプリケーションのデータ・モデル・プロジェクトでカスタマイズ・クラスを作成した場合、この手順は不要です。

次の手順を使用してアプリケーションでカスタマイズ・クラスを表示できるようにしてから、第11.6項「adf-config.xmlファイルの構成方法」の説明に従って、カスタマイズ・クラスをadf-config.xmlファイルのcust-configセクションに追加します。

始める前に

- 第11.2項「MAF AMXページおよびアーティファクトのカスタマイズ」の説明に従って、外部プロジェクトにカスタマイズ・クラスを作成します。

- カスタマイズ・クラスを含むJARファイルを作成します。

- Studio開発者ロールを使用してJDeveloperを起動し、カスタマイズするアプリケーションを開きます。

外部プロジェクトからカスタマイズ・クラスを使用するには:

1. 「アプリケーション」ウィンドウで、「アプリケーション・メニュー」アイコンをクリックして、「アプリケーションのプロパティ」を選択します。

2. 「アプリケーションのプロパティ」ダイアログで、「ライブラリとクラスパス」を選択し、「JAR/ディレクトリの追加」をクリックします。

3. 「アーカイブまたはディレクトリの追加」ダイアログで、カスタマイズ・クラスを含む作成済JARファイルを選択して、「開く」をクリックします。

4. 「OK」をクリックします。

完了したら、JDeveloperでプロジェクトをローカルに実行するためやカスタマイズのために、カスタマイズ・クラスを使用できます。またこれらは、アプリケーションをパッケージ化するときに、EARクラス・パスにパッケージ化されます。

11.6 adf-config.xmlファイルの構成方法

アプリケーションのadf-config.xmlファイルでは、mds-configセクションで適切なcust-config要素が指定されている必要があります。クライアントはcust-config要素を使用して、順序付けされ、名前が付けられたカスタマイズ・クラスのリストを定義できます。adf-config.xmlファイルの概要エディタを使用して、カスタマイズ・クラスを追加します(図11-6を参照)。

始める前に

- 第11.2項「MAF AMXページおよびアーティファクトのカスタマイズ」の説明に従って、外部プロジェクトにカスタマイズ・クラスを作成します。

- カスタマイズ・クラスを含むJARファイルを作成します。

- 第11.5.1項「デザインタイムにJDeveloperでカスタマイズ・クラスを使用可能にする方法」の説明に従って、クラスをJDeveloperで使用できるようにします。

- Studio開発者ロールを使用してJDeveloperを起動し、カスタマイズするアプリケーションを開きます。

adf-config.xmlファイルでカスタマイズ・クラスを識別するには:

1. 「アプリケーション・リソース」ウィンドウで、「ディスクリプタ」→「ADF META-INF」ノードを開き、adf-config.xmlをダブルクリックします。

2. 概要エディタで、「MDS」ナビゲーション・タブを選択し、「追加」(+)をクリックします。

3. 「カスタマイズ・クラスの編集」ダイアログで、作成済のカスタマイズ・クラスを検索するか、作成済のカスタマイズ・クラスに移動します。

4. 適切なクラスを選択して、「OK」をクリックします。

5. カスタマイズ・クラスをすべて追加した後、矢印アイコンを使用して適切な順序で配置できます。

図11-6は、2つのカスタマイズ・クラスが追加されたadf-config.xmlファイルの概要エディタを示しています。

図11-6 adf-config.xmlの概要エディタ

customization-class要素の順序により、カスタマイズ・レイヤーの優先順位が指定されます。たとえば、例11-4に示すコードでは、IndustryCCクラスはSiteCCクラスの前に表示されています。これは、industryレイヤーでのカスタマイズがベース・アプリケーションに適用されてから、siteレイヤーでのカスタマイズが適用されることを示します。

例11-4 adf-config.xmlファイルでのカスタマイズ・クラスの順序

<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>

11.7 「カスタマイズ開発者」ロールに関する必知事項

JDeveloperでは、「カスタマイズ開発者」ロールを使用して、プロジェクトのメタデータをカスタマイズします。カスタマイズ機能は、このロールでのみ使用できます。「カスタマイズ開発者」ロールでは、次の作業を実行できます。

- カスタマイズの作成および更新

- カスタマイズしたアプリケーションのヒント・レイヤーの選択および編集

- 既存のカスタマイズの削除

「カスタマイズ開発者」ロールでJDeveloperを使用する場合、ソース・エディタは読取り専用になり、次のJDeveloperの機能が無効になります。

- ワークスペースの移行

- アプリケーションおよびIDE接続の作成、削除および変更「カスタマイズ開発者」ロールでアプリケーションを開く前に、デフォルト・ロールで接続を構成する必要があります。

「カスタマイズ開発者」ロールでアプリケーションを使用する場合、新規オブジェクトは作成できず、カスタマイズ不能オブジェクトは変更できません。また、Javaクラス、リソース・バンドル、セキュリティ・ポリシー、デプロイメント・ディスクリプタ、構成ファイルなどのカスタマイズ不能ファイルの編集もできません。

注意:

「カスタマイズ開発者」ロールで作業している際、カスタマイズ不能ファイルはロック・アイコンで示されます。

プロジェクト設定の変更や、サービス・インタフェースやビジネス・イベント定義など特定のADFビジネス・コンポーネント機能のカスタマイズも制限されます。また、カスタマイズ不能ファイルの変更が必要になる場合は、カスタマイズ可能ファイルをリファクタまたは変更できません。

11.7.1 JDeveloperでの「カスタマイズ開発者」ロールへの切替え

「カスタマイズ開発者」ロールでは、JDeveloperのカスタマイズ機能を使用できます。このロールで作業するには、JDeveloperの起動時に選択するか、JDeveloperがすでに実行されている場合は「ロールの切替え」メニューで「カスタマイズ開発者」ロールに切り替えます。

JDeveloperで「カスタマイズ開発者」ロールに切り替えるには:

JDeveloperのメイン・メニューで「ツール」→「ロールの切替え」→「カスタマイズ開発者」の順に選択します。

オプションで、「ツール」→「ロールの切替え」→「起動時にロール選択を常に要求」メニューを切り替え、JDeveloper起動時にロールを選択するかどうかを指定できます。この選択を解除すると、JDeveloperは、最後に閉じたときのロールで起動します。

11.7.2 ヒント・レイヤーに関する必知事項

「カスタマイズ開発者」ロールで作業する際、「カスタマイズ・コンテキスト」ウィンドウで選択したレイヤーとレイヤー値の組合せをヒント・レイヤーと呼びます。このレイヤーには、「カスタマイズ開発者」ロールで作業中に行った変更が適用されます。

注意:

「カスタマイズ開発者」ロールで作業している場合、「カスタマイズ・コンテキスト」ウィンドウが表示されない場合は、JDeveloperの「ウィンドウ」メニューからアクセスできます。

JDeveloperのエディタに表示されるメタデータは、ベース・メタデータと(adf-config.xmlで設定された優先順位に従った)ヒント・レイヤーまでのカスタマイズ・レイヤーを組み合せたもので、各レイヤーの値は「カスタマイズ・コンテキスト」ウィンドウで指定したものです。

「カスタマイズ開発者」ロールでの作業時には、アプリケーションのカスタマイズされていない状態も確認できます。「カスタマイズ・コンテキスト」ウィンドウで「カスタマイズなしで表示」が選択されている場合、現在使用しているヒント・レイヤーはありません。したがって、表示されているのはカスタマイズされていない状態です。このビューでは、(「アプリケーション」ウィンドウの)カスタマイズ可能ファイルすべてにロック・アイコンが表示され、これらのファイルが読取り専用であることが示されます。

ヒント・レイヤーで行ったカスタマイズは、「プロパティ」ウィンドウではオレンジのアイコンで示されます。緑のアイコンは、ヒント以外のレイヤーのカスタマイズを示します。プロパティの横にオレンジのアイコンが表示されている場合、そのプロパティのドロップダウン・メニューから「カスタマイズ・アクションの削除」を選択して、そのカスタマイズを削除できます。

12 カスタムMAF AMX UIコンポーネントの作成

この章では、カスタムMAF AMX UIコンポーネントを作成し、それらを開発環境の一部として指定する方法について説明します。

この章の内容は次のとおりです。

- 第12.1項「カスタムUIコンポーネントの作成の概要」

- 第12.2項「MAF APIを使用したカスタム・コンポーネントの作成」

- 第12.3項「カスタム・コンポーネントの作成」

12.1 カスタムUIコンポーネントの作成の概要

MAFによって提供されるJavaScriptとAPIの組合せを使用して、完全に機能する新しいインタラクティブなUIコンポーネントを作成し、それらをタグ・ライブラリに追加して、MAF AMXアプリケーション機能で使用できます。

12.2 MAF APIを使用したカスタム・コンポーネントの作成

MAFでは、カスタム・コンポーネントの作成用に次のAPIが提供されています。

- 静的API (第12.2.1項「静的APIの使用方法」を参照)

- AmxEventクラス(第12.2.2項「AmxEventクラスの使用方法」を参照)

- TypeHandler (第12.2.3項「TypeHandlerの使用方法」を参照)

- AmxNode (第12.2.4項「AmxNodeの使用方法」を参照)

- AmxTag (第12.2.5項「AmxTagの使用方法」を参照)

- VisitContext (第12.2.6項「VisitContextの使用方法」を参照)

- AmxAttributeChange (第12.2.7項「AmxAttributeChangeの使用方法」を参照)

- AmxDescendentChanges (第12.2.8項「AmxDescendentChangesの使用方法」を参照)

- AmxCollectionChange (第12.2.9項「AmxCollectionChangeの使用方法」を参照)

- AmxNodeChangeResult (第12.2.10項「AmxNodeChangeResultの使用方法」を参照)

- AmxNodeStates (第12.2.11項「AmxNodeStatesの使用方法」を参照)

- AmxNodeUpdateArguments (第12.2.12項「AmxNodeUpdateArgumentsの使用方法」を参照)

12.2.1 静的APIの使用方法

表12-1に、カスタムUIコンポーネントの作成に使用できる静的APIを示します。

表12-1 静的API

戻り型

関数名

パラメータ

説明

Function

adf.mf.api.amx.TypeHandler.register

String namespaceUrl、

String tagName、

adf.mf.api.amx.TypeHandler precreatedClass

タグの名前空間および名前を指定してTypeHandlerクラスを登録します。

プロトタイプ関数を追加できるように、登録されているadf.mf.api.amx.TypeHandlerサブクラスを返します。

precreatedClassはオプションですが、adf.mf.api.amx.TypeHandlerから継承するクラスを最初に作成する場合に使用できます。

void

adf.mf.api.amx.addBubbleEventListener

Node domNode、

String eventType、

Function listener、

Object eventData

バブル・イベント・リスナー(tap、taphold、keydown、touchstart、touchmove、touchend、focus、blur、resizeなど)を登録します。

Webブラウザが、すべてのDOMノードのすべてのイベント・タイプをサポートしているわけではないことに注意してください(詳細は、ブラウザのドキュメントを参照)。

eventDataはオプションで、リスナー関数に使用できる追加データとして機能します。

void

adf.mf.api.amx.removeBubbleEventListener

Node domNode、

String eventType、

Function listener

adf.mf.api.amx.addBubbleEventListenerで追加されたバブル・イベント・リスナーを登録解除します。

メタ・イベントtapおよびtapholdを削除すると、指定されたリスナーだけが削除されるのではなく、すべてのtouchstartおよびtouchendリスナー(他のメタ・イベントのこれらのリスナーも含む)が要素から削除されることに注意してください。

void

adf.mf.api.amx.addDragListener

Node domNode、

Object payload、

Object eventData

要素に対して、MAF AMXドラッグ・イベントのトリガーを許可します。

Object payloadでは、3つのメンバー関数(start、drag、end)を定義します。各関数の最初のパラメータはDOMイベントで、2番目のパラメータは次のメンバーが含まれるdragExtra Objectです。

- eventSource: DOMイベント・ソース。

- pageX: イベントのx座標。

- pageY: イベントのy座標。

- startPageX: 元のpageX。

- startPageY: 元のpageY。

- deltaPageX: pageXの変更。

- deltaPageY: pageYの変更。

- originalAngle: 定義されている場合は、ドラッグの元の角度(度)で、0度は東、90は北、-90は南、180は西です。

次の変更可能なメンバー・フラグがあります。

- preventDefault

- stopPropagation

eventDataはオプションで、リスナー関数に使用できる追加データとして機能します。

void

adf.mf.api.amx.removeDomNode

Node domNode

DOMノードおよびその子を削除しますが、その前に、adf.mf.api.amx.addBubbleEventListenerで追加されたイベント・リスナーを削除します。

void

adf.mf.api.amx.emptyHtmlElement

Node domNode

子DOMノードを削除し、それらの各子ノードでadf.mf.api.amx.removeDomNodeをコールすることで、HTML要素を空にします。

void

adf.mf.api.amx.processAmxEvent

adf.mf.api.amx.AmxNode amxNode、

String amxEventType、

String attributeValueName、

String newValue、

AmxEvent amxEvent、

Function successCallback

Function failureCallback

AmxEventを処理します。

attributeValueNameが定義されている場合は値を変更し、適切なsetPropertyListenerおよびactionListenerサブタグを処理し、次に[amxEventType]Listener属性を処理します。

イベントが正常に処理されると、成功コールバックが起動されます。そうでない場合は、失敗コールバックが起動されます。successCallbackとfailureCallbackの両方はオプションです。

void

adf.mf.api.amx.acceptEvent

なし

adf.mf.api.amx.processAmxEventに渡す必要がある可能性があるすべてのものを準備しなくても済むように、この関数の呼出しを続行しても安全であるかどうかを判断します(たとえば、ページ遷移の途中や、デザインタイム・プレビューなどの環境の場合)。

void

adf.mf.api.amx.invokeEl

String expression、

Array<String> params、

String returnType、

Array<String> paramTypes、

Function successCallback、

Function failureCallback

ELメソッドを呼び出す点でadf.mf.el.invoke()に類似しており、デザインタイム・プレビューなどの環境では実行を控える点が異なるユーティリティを表します。

void

adf.mf.api.amx.enableAmxEvent

adf.mf.api.amx.AmxNode amxNode、

Node domNode、

String eventType

DOMノードに対して、amx:showPopupBehavior、amx:setPropertyListenerなどのカスタムMAF AMXイベント(tapHoldやswipeなど)のトリガーを許可します。

void

adf.mf.api.amx.doNavigation

String outcome

指定された結果へのナビゲーションを実行することをコントローラに指示します。

void

adf.mf.api.amx.validate

Node domNode、

Function successCallback

不十分なバリデータ(必須またはamx:validationBehavior)がある場合、ナビゲーションなどの操作を阻止します。

続行が許可されると、successCallbackが呼び出されます。

void

adf.mf.api.amx.showLoadingIndicator

Number failSafeDuration、

Function failSafeClientHandler

ビジー・インジケータを示します。

パラメータは次のとおりです。

- failSafeDuration: ローディング・インジケータの表示および非表示の間にMAFが待機するおよその期間(ミリ秒を表す負でない整数) (他のトリガーがすでにインジケータを表示していないと仮定した場合)。このパラメータが指定されていないか、またはnullに設定されている場合、MAFは10000 (10秒)の値を使用します。

- failSafeClientHandler: failSafeDurationに達した場合に起動されるオプションのJavaScript関数。この関数を使用して、続行方法を決定できます。この関数は、次のいずれかの値で定義されているStringを返す必要があります。
- hide: デフォルトのフェイルセーフのようにインジケータを非表示にします。

- repeat: 関数を再度呼び出せるように新たな期間についてタイマーを再起動します。

- freeze: インジケータを稼働させたまま無期限に待機させ、ページは再起動されるまでフリーズ状態で停止します。

インジケータが必要以上に表示されるのを回避するには、非表示にします。

void

adf.mf.api.amx.hideLoadingIndicator

なし

ローディング・インジケータの1つのインスタンスを非表示にします。

Object

adf.mf.api.amx.createIterator

Object dataItems

3ノード・イテレータ(コレクション・モデル)に対するオブジェクトのJavaScript配列またはイテレータをサポートするイテレータを作成します。

next、hasNextおよびisTreeNodeIterator関数でイテレータObjectを返しますが、ここで、nextは、使用可能なオブジェクトがそれ以上ない場合、undefinedを返します。

void

adf.mf.api.amx.bulkLoadProviders

Object treeNodeIterator、

Number startingPoint、

Number maximumNumberOfRowsToLoad、

Function successCallback、

Function failCallback

一連のデータ・プロバイダをバルクロードして、これらがキャッシュされてローカルでアクセスできるようにします。

String

adf.mf.api.amx.buildRelativePath

String url

現在のMAF AMXページに対して相対的であると想定して、指定されたリソースに基づく相対パスを作成します。リソース上にプロトコルがある場合は、絶対パスであると想定され、変更されません。

void

adf.mf.api.amx.markNodeForUpdate

adf.mf.api.amx.AmxNodeUpdateArguments args

AmxNodeに対する状態変更(AmxNode階層がそのノード以下で更新される必要がある)をMAFに通知する、TypeHandlerインスタンスの関数。

カスタムcreateChildrenNodesメソッドがTypeHandlerに存在する場合は、これらのAmxNodeインスタンス対して再度コールされます。これにより、子にスタンプ設定するAmxNodeインスタンスは、ユーザー変更による新しいスタンプを追加できます。refreshメソッドは、AmxNodeがレンダリングする準備ができた場合、指定されたプロパティを使用してAmxNodeでコールされます。AmxNodeがレンダリングする準備ができていない場合、MAFはELが解決されるのを待機し、すべてのデータが使用可能になった後にrefreshメソッドがコールされます。

注意:

adf.mf.elパッケージのその他のパブリックAPIは、ロギング、変換およびデータ・チャネルに使用できます。

12.2.2 AmxEventクラスの使用方法

表12-2に、カスタムUIコンポーネントの作成時に使用できるAMXEventクラスを示します。

表12-2 AMXEventクラス

クラス名

パラメータ

説明

adf.mf.api.amx.ActionEvent

なし

結果ベースのナビゲーションをトリガーするイベント。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.ActionEventも参照してください。

adf.mf.api.amx.MoveEvent

Object rowKeyMoved、

Object rowKeyInsertedBefore

指定された行が移動されたことを通知するイベント。移動された行のキー、および移動済行がその前に挿入された行のキーが含まれます。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.MoveEventも参照してください。

adf.mf.api.amx.SelectionEvent

Object oldRowKey、

Array<Object> selectedRowKeys

コンポーネントの選択変更のイベント。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.SelectionEventも参照してください。

adf.mf.api.amx.ValueChangeEvent

Object oldValue、

Object newValue

コンポーネントの値変更のイベント。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのoracle.adfmf.amx.event.ValueChangeEventも参照してください。

12.2.3 TypeHandlerの使用方法

表12-3に、カスタムUIコンポーネントの作成に使用できるTypeHandler APIを示します。

表12-3 TypeHandler API

戻り型

関数名

パラメータ

説明

HTMLElement

render

adf.mf.api.amx.AmxNode amxNode、

String id

初期DOM構造を作成し、その構造のルート要素を返します。

このメンバー関数は必須であり、定義されている必要があります。

void

init

HTMLElement rootElement、

adf.mf.api.amx.AmxNode amxNode

このコンポーネントで作成される一連のコンポーネントに属するすべてのcreate関数が呼び出された後に呼び出されるハンドラを表します。

void

postDisplay

HTMLElement rootElement、

adf.mf.api.amx.AmxNode amxNode

このコンポーネントで作成される一連のコンポーネントに属するすべてのinit関数が呼び出された後に呼び出されるハンドラを表します。

Boolean

createChildrenNodes

adf.mf.api.amx.AmxNode amxNode

処理する子AmxNodeを選択して追加します。いずれかの子が示されている場合、この関数を使用すると、他の子が処理されなくなることに注意してください。

MAFがカスタム実装ではなく子ノードを作成する場合は、falseを返す必要があります。

この関数はオプションです。

adf.mf.api.amx.AmxNodeChangeResult

updateChildren

adf.mf.api.amx.AmxNode amxNode、

adf.mf.api.amx.AmxAttributeChange attributeChanges

次のいずれかのハンドラを表します。

- 古い子をすべて削除し、新しい子を作成してAmxNodeに追加します。

- 戻り値を介して、実行する必要があるadf.mf.api.amx.AmxNodeChangeResultアクションを宣言します。

この関数はオプションです。

adf.mf.api.amx.AmxNodeChangeResult

getDescendentChangeAction

adf.mf.api.amx.AmxNode amxNode、

adf.mf.api.amx.AmxDescendentChanges descendentChanges

タイプ・ハンドラに対して、子孫AmxNodeインスタンスへの変更処理のカスタマイズを許可します。

void

refresh

adf.mf.api.amx.AmxAttributeChange attributeChanges、

adf.mf.api.amx.AmxDescendentChanges descendentChanges

タイプ・ハンドラに対して、変更に応答したHTMLの選択的リフレッシュを許可します。このメソッドは、updateChildrenメソッドの後にコールされます。

attributeChangesは変更された属性を定義します。descendentChangesがnullでない場合は、リフレッシュする必要があるすべての子孫ノードに対する変更を定義します。

Boolean

isFlattenable

なし

AmxNodeがフラット化可能であるかどうかを宣言します。フラット化されたAmxNodeにはレンダリング関連の動作がない可能性がある(フラット化されたAmxNodeのタイプ・ハンドラは子ノードの作成とアクセスのみを制御でき、レンダリングには影響を与えない)ことに注意してください。

Boolean

visit

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

このAmxNodeから始まるAmxNodeツリー・アクセスを処理します。

アクセスでパラメータvisitContextおよびAmxNodeを使用する場合に呼び出すvisitCallback関数。アクセスが完了し、続行する必要がないかどうかを返します。

Boolean

visitChildren

adf.mf.api.amx.AmxNode amxNode、

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

このAmxNodeの子から始まるAmxNodeツリー・アクセスを処理します。

アクセスでパラメータvisitContextおよびAmxNodeを使用する場合に呼び出すvisitCallback関数。アクセスが完了し、続行する必要がないかどうかを返します。

void

preDestroy

HTMLElement rootElement、

adf.mf.api.amx.AmxNode amxNode

現在のビューが破棄される直前、つまり新しいビューに移動しようとするときにすべてを処理します。通常は、スクロール位置などのクライアント状態を保存するために使用されます(adf.mf.api.amx.setClientStateを参照)。

void

destroy

HTMLElement rootElement、

adf.mf.api.amx.AmxNode amxNode

新しいビューが表示され、古いビューが削除された後にすべてを処理します。

12.2.4 AmxNodeの使用方法

表12-4に、カスタムUIコンポーネントの作成に使用できるAmxNode APIを示します。

表12-4 AmxNode API

文字列

関数名

パラメータ

説明

String

getId

なし

このAmxNodeの一意の識別子を取得します。この値はルートDOM要素のIDに寄与します。

adf.mf.api.amx.AmxTag

getTag

なし

このAmxNodeを作成したAmxTagを取得します。

adf.mf.api.amx.TypeHandler

getTypeHandler

なし

このAmxNodeに関連付けられたTypeHandlerオブジェクトを取得します。

void

setClientState

Object payloadJsonObject

指定されたAmxNode IDのクライアント状態を格納または置換します。

タイプ・ハンドラは、状態変更が発生するたびにこの関数をコールする必要があります(たとえば、ある状態をキャッシュしておき、ユーザーが新しいページに移動してから戻ってきたときに、スクロール位置のように復元できるようにする必要があります)。つまり、状態変更の発生を常に検出できるとはかぎらないため、ビューが破棄される直前にコンポーネントの状態を更新する必要がある場合があります。考慮する必要があるシナリオとして次の2つが考えられます。

1. refresh: (同じビュー内の)DOM構造部分の再描画用。

2. preDestroy: 新しいビューに移動し、後で戻ったときのため。

payloadJsonObjectは、このビュー・インスタンスのライフタイム用に格納するクライアント状態データです。

Object

getClientState

なし

このビュー・インスタンス時にsetClientState関数を介して以前に格納されたpayloadJsonObjectを取得します(取得できない場合はundefined)。

void

setVolatileState

Object payloadJsonObject

指定されたAmxNode IDのクライアント状態を格納または置換します。タイプ・ハンドラは、揮発状態変更が発生するたびに、この関数をコールする必要があります(たとえば、新しいMAF AMXページへの移動時に忘れられたが、コンポーネントの再描画時に備えて保持しておく必要があるものなどです)。

payloadJsonObjectは、ナビゲーションが発生するまで格納する揮発状態データです。

Object

getVolatileState

なし

最後のナビゲーション以降、setVolatileState関数を介して以前に格納されたpayloadJsonObjectを取得します(取得できない場合はundefined)。

Object

getConverter

なし

適用可能な場合、このAmxNodeのコンバータを取得します。

void

setConverter

Object converter

このAmxNodeのコンバータを設定します。

String

storeModifyableEl

String nameOfTheAttribute

属性に関して、EL値をモデルに設定するために使用できるEL式を作成して格納します。

この値は状況非依存で、値を設定するためにいつでも使用できます。一般的な用途は、ユーザーとの対話に基づいて値を設定することです。

この関数は、タイプ・ハンドラによってコールされる場合があります。

サブジェクト属性がEL値にバインドされていない場合は、nullを返します。

Object

getStampKey

なし

AmxNodeのスタンプ・キーを取得します。スタンプ・キーは、反復コンテナの内部で生成されたAmxNodeインスタンスを特定します。

これは、親AmxNodeによって提供されます。スタンプ・キーを使用するタグの例として、amx:iteratorタグがあります。

AmxNodeがスタンプ設定されていない場合は、nullを返します。

Array<String>

getDefinedAttributeNames

なし

このノードに定義された属性名のリストを取得します。

Object

getAttribute

String name

指定された名前の属性の属性値を取得します。

戻り値はnullである可能性があります。

属性が設定されていない、またはまだロードされていない場合は、undefinedを返します。

void

setAttributeResolvedValue

String name、

Object value

タイプ・ハンドラまたはMAFが属性の属性値をAmxNodeに格納するために使用されます。

この関数では、モデルは更新されません。

void

setAttribute

String name、

String value

モデルの属性の値を設定します。

この値は、EL値を更新するためにJava側に送信されます。AmxNodeの値はこのコールでは更新されません。かわりに、データ変更イベントがAmxNodeを更新することが想定されます。

Boolean

isAttributeDefined

String name

属性がユーザーによって定義されているかどうかをチェックします。

adf.mf.api.amx.AmxNode

getParent

なし

最上位の場合は、親AmxNodeまたはnullを取得します。

void

addChild

adf.mf.api.amx.AmxNode child、

String facetName

このAmxNodeに子AmxNodeを追加します。

子がファセットに属していない場合、facetNameはnullになります。

Boolean

removeChild

adf.mf.api.amx.AmxNode child

このAmxNodeから子AmxNodeを削除します。

子は階層から削除されますが、そのDOMは削除されないことに注意してください。DOMの削除は、コール元の責任です。

これにより、タイプ・ハンドラは、DOMの置換時にアニメーションやその他の遷移を処理できます。

子が検出されて削除されたかどうかを返します。

Boolean

replaceChild

adf.mf.api.amx.AmxNode oldChild,

adf.mf.api.amx.AmxNode newChild

既存の子を別の子に置換します。

古いものが検出されて置換されたかどうかを返します。

Array<adf.mf.api.amx.AmxNode>

getChildren

String facetName、

Object stampKey

子AmxNodesを取得します。

これら2つのパラメータはオプションです。facetNameには、非ファセットの子を取得するためにnullを指定できます。

子が存在しないか、または指定された修飾子の子が存在しない場合は、空の配列を返します。

Map<String, Array<adf.mf.api.amx.AmxNode>>

getFacets

Object stampKey

AmxNodeのすべてのファセットを取得します。

stampKeyはオプションで、指定された場合は、指定されたスタンプ・キーのファセットAmxNodeインスタンスを取得します。

Boolean

visit

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

このAmxNodeから開始するツリー・アクセスを実行します。

visitCallback関数は、引数としてvisitContextおよびAmxNodeを受け入れる必要があります。

アクセスが完了し、続行する必要がないかどうかを返します。

Boolean

visitChildren

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

このAmxNodeの子から開始するツリー・アクセスを実行します。

visitCallback関数は、引数としてvisitContextおよびAmxNodeを受け入れる必要があります。

アクセスが完了し、続行する必要がないかどうかを返します。

Boolean

visitStampedChildren

Object stampKey、

Array<String> facetNamesToInclude、

Function filterCallback、

adf.mf.api.amx.VisitContext visitContext、

Function visitCallback

カスタムvisitChildren関数内から子AmxNodeにアクセスするよう子にスタンプ設定するタイプ・ハンドラ用の便利な関数。

facetNamesToIncludeが空の場合、このスタンプのファセットは処理されません。facetNamesToIncludeがnullの場合、このスタンプのすべてのファセットが処理されます。

filterCallbackにnullを指定できます。filterCallbackは、true (子の作成にタグを使用)またはfalse (タグが処理されない)のBooleanを返す必要があります。

visitCallbackは、引数としてvisitContextおよびAmxNodeを受け入れる必要があります。

アクセスが完了し、続行する必要がないかどうかを返します。

Array<adf.mf.api.amx.AmxNode>

getRenderedChildren

String facetName、

Object stampKey

AmxNodeのレンダリングされた子を取得します。

facetNameは、レンダリングされた子の取得元となるファセットを示し、非ファセットの子の場合はnullになります。

stampKeyが指定されている場合は、指定されたスタンプ・キーの子AmxNodeインスタンスを取得します。

指定されたスタンプ・キーでレンダリングされる子を返します。フラット化できる(フラット化可能な)あらゆるコンポーネントをフラット化し、レンダリングされないコンポーネントは返しません。

Boolean

isFlattenable

なし

AmxNodeがフラット化可能であるかどうかを決定します。

フラット化されたAmxNodeにはレンダリング関連の動作が含まれていない可能性があること、つまり、フラット化されたAmxNodeのタイプ・ハンドラは子の作成およびアクセスのみを制御でき、レンダリングには影響しないことに注意してください。

adf.mf.api.amx.AmxNodeStates

getState

なし

AmxNodeの現在の状態を(adf.mf.api.amx.AmxNodeStatesの定数値として)取得します。

void

setState

state

AmxNodeのadf.mf.api.amx.AmxNodeStates状態を移行します。MAFまたはAmxNodeのタイプ・ハンドラによってのみコールされる必要があります。

HTMLElement

render

なし

AmxNodeを返します。

レンダリングされたルート要素、またはnull (子がレンダリングされない場合、またはこのAmxNodeのタイプ・ハンドラがない場合)を返します。

Array<HTMLElement>

renderDescendants

String facetName、

Object key

このAmxNodeのサブノードをレンダリングします(適用可能な場合、最も近い子孫にフラット化します)。

facetNameがnullでない場合は、ファセットの子をレンダリングします。facetNameがnullの場合は、非ファセットの子がレンダリングされます。

オプションのキーが、そのスタンプ・キーの子AmxNodeインスタンスのレンダリングに使用されます。

各subNodeのルート要素の配列を返します。

void

rerender

なし

AmxNodeをレンダリングします。

Boolean

isRendered

なし

AmxNodeの状態をチェックして、レンダリングする必要があるかどうかを確認します。

AmxNodeは、ABLE_TO_RENDER、RENDEREDまたはPARTIALLY_RENDERED状態である場合、レンダリング可能であるとみなされます。

void

refresh

adf.mf.api.amx.AmxAttributeChange attributeChanges、

adf.mf.api.amx.AmxDescendentChanges descendentChanges

AmxNodeのDOMをリフレッシュします。

このメソッドは、updateChildrenメソッドの後にコールされ、変更に応答してタイプ・ハンドラのDOMを更新する必要があるタイプ・ハンドラによって実装される必要があります。

void

createStampedChildren

Object stampKey、

Array<String> facetNamesToInclude、

Function filterCallback

カスタムcreateChildrenNodes関数内から子AmxNodeインスタンスを作成するよう子にスタンプ設定するタイプ・ハンドラ用の便利な関数。

この関数では、任意のUIタグの子が作成されます。

facetNamesToIncludeが空の場合、このスタンプのファセットは処理されません。facetNamesToIncludeがnullの場合、すべてのファセットが処理されます。facetNamesToIncludeでnull値が配列内に含まれる場合、非ファセット・タグの子が作成されます。

filterCallbackは、作成された子をフィルタ処理するオプションの関数です。filterCallback関数は、AmxNode、stampKey、子タグおよびファセット名(または、非ファセットの場合はnull)を設定して呼び出されます。filterCallback関数はbooleanを返す必要があります。trueの場合、タグを使用して子が作成され、falseの場合、タグは処理されません。

12.2.5 AmxTagの使用方法

表12-5に、カスタムUIコンポーネントの作成に使用できるAmxTag APIを示します。

表12-5

戻り型

関数名

パラメータ

説明

String

getNamespace

なし

タグのXML名前空間URIを取得します。

String

getNsPrefixedName

なし

(ローカルxmlns接頭辞ではなく)名前空間をその接頭辞として含むタグ名を返します。

これは、"http://xmlns.example.com/custom:custom"などの完全なXML名です。

String

getName

なし

タグ名を取得します。

これは、接頭辞がないローカルXMLタグ名です。

adf.mf.api.amx.AmxTag

getParent

なし

親タグ、またはnull (最上位タグである場合)を取得します。

String

getTextContent

なし

タグのテキスト・コンテンツを返します。

Array<adf.mf.api.amx.AmxTag>

findTags

String namespace、

String tagName

指定された名前空間とタグ名を使用して、タグのタグ階層を再帰的に検索します。

一致した場合は現在のタグを返します。

Array<adf.mf.api.amx.AmxTag>

getChildren

String namespace、

String tagName

タグの子を取得します。

子の名前空間およびタグ名のオプションのフィルタリングを提供します。名前空間がnullの場合は、すべての子が返されます。tagNameがnullの場合、子はタグ名でフィルタリングされません。

Array<adf.mf.api.amx.AmxTag>

getChildrenFacetTags

なし

すべての子ファセット・タグを取得します。

この関数の目的は、AmxNodeプロセスの作成を支援することです。

adf.mf.api.amx.AmxTag

getChildFacetTag

String name

指定された名前のファセット・タグを取得します。

この関数の目的は、ファセットの存在によりタイプ・ハンドラの動作が変更される場合のコードを支援することです。

ファセットが見つからない場合はnullを返します。

Array<adf.mf.api.amx.AmxTag>

getChildrenUITags

なし

UIタグであるすべての子タグを取得します。

この関数の目的は、AmxNodeプロセスの作成を支援することです。

この関数では、ファセット・タグは返されません。

Array<String>

getAttributeNames

なし

タグで指定されている属性のすべての属性名を取得します。

Boolean

isAttributeElBound

String name

指定された属性が(静的値ではなく) EL式にバインドされているかどうかを決定します。

String

getAttribute

String name

指定された名前の属性の属性値(EL文字列である場合があります)を取得します。

属性が指定されていない場合はundefinedを返します。

Map<String, String>

getAttributes

なし

属性およびその値のキー/値ペア・マップを取得します。

Boolean

isUITag

なし

ノードがタイプ・ハンドラを持つUIタグであるかどうかを決定し、コンテンツをレンダリングします。

Object{name:string, children:Array<adf.mf.api.amx.AmxTag>}

getFacet

なし

このファセットの子のタグ、およびこのタグがファセット・タグである場合はファセットの名前を取得します。

これは、AmxNodeツリーを構築する場合に便利な関数です。

そのファセットの名前、およびファセットの子タグを持つオブジェクトを返します。タグがamx:facetタグでない場合は、nullを返します。

adf.mf.api.amx.AmxNode

buildAmxNode

adf.mf.api.amx.AmxNode parentNode,

Object stampKey

スタンプIDを設定してこのタグのAmxNodeの新しいインスタンスを作成します。

タグがファセット・タグである場合、タグは子タグのAmxNodeを作成します。

この関数では、AmxNodeは初期化されません。かわりに、初期化されていないAmxNode、または非UIタグの場合はnullを返します。

adf.mf.api.amx.TypeHandler

getTypeHandler

なし

このタグのタイプ・ハンドラを取得します。

12.2.6 VisitContextの使用方法

表12-6に、カスタムUIコンポーネントの作成時に使用できるVisitContext APIを示します。

表12-6 VisitContext API

戻り型

関数名

パラメータ

説明

Boolean

isVisitAll

なし

すべてのノードがアクセスされるかどうかを決定します。

Array<adf.mf.api.amx.AmxNode>

getNodesToWalk

なし

アクセス時に移動する必要があるノードを取得します。

このリストには、アクセスされる(コールバックが呼び出される)必要があるノードは必ずしも含まれていません。

Array<adf.mf.api.amx.AmxNode>

getNodesToVisit

なし

アクセスするノードのリストを取得します。

Array<adf.mf.api.amx.AmxNode>

getChildrenToWalk

adf.mf.api.amx.AmxNode parentAmxNode

指定された親AmxNodeから移動する必要がある子AmxNodeインスタンス(ある場合はファセットを含む)を決定します。

タイプ・ハンドラに対して、すべての子に移動するわけではない場合に、子への移動方法の最適化を許可します。

nullを返す場合があります。

12.2.7 AmxAttributeChangeの使用方法

表12-7に、カスタムUIコンポーネントの作成時に使用できるAmxAttributeChange APIを示します。

表12-7 AmxAttributeChange API

戻り型

関数名

パラメータ

説明

Array<String>

getChangedAttributeNames

なし

現在の変更時に影響を受けた属性の名前を取得します。

Boolean

isCollectionChange

String name

属性の変更がコレクション変更であるかどうかを決定します。

adf.mf.api.amx.AmxCollectionChange

getCollectionChange

String name

属性のコレクション・モデル変更情報を取得します。使用可能な変更オブジェクトがない場合はnullを返します。

String

getOldValue

String name

変更が行われる前に、属性の値を取得します。

Boolean

hasChanged

String name

指定された名前の属性が変更されたかどうかを決定します。

Number

getSize

なし

属性の変更数を取得します。

12.2.8 AmxDescendentChangesの使用方法

表12-8に、カスタムUIコンポーネントの作成時に使用できるAmxAttributeChange APIを示します。

表12-8 AmxDescendentChanges API

戻り型

関数名

パラメータ

説明

Array<adf.mf.api.amx.AmxNode>

getAffectedNodes

なし

レンダリング前の変更済の子孫AmxNodeインスタンスを取得します。

adf.mf.api.amx.AmxAttributeChange

getChanges

adf.mf.api.amx.AmxNode amxNode

指定されたAmxNodeの変更を取得します。

adf.mf.api.amx.AmxNodeStates

getPreviousNodeState

adf.mf.api.amx.AmxNode amxNode

変更が適用される前の子孫AmxNodeの状態を取得します。

12.2.9 AmxCollectionChangeの使用方法

表12-9に、カスタムUIコンポーネントの作成時に使用できるAmxCollectionChange APIを示します。

表12-9 AmxCollectionChange API

戻り型

関数名

パラメータ

説明

Boolean

isItemized

なし

コレクションに対する変更を項目化できるかどうか、つまりそのコレクションのキーと要素が特定されることで、TypeHandlerが最初からリスト全体を再レンダリングするのではなく、適切な項目だけを更新できるようにするかどうかを決定します。

Array<String>

getCreatedKeys

なし

作成されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getDeletedKeys

なし

削除されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getUpdatedKeys

なし

更新されたキーの配列、または変更を項目化できない場合はnullを取得します。

Array<String>

getDirtiedKeys

なし

ダーティにされたキーの配列、または変更を項目化できない場合はnullを取得します。

12.2.10 AmxNodeChangeResultの使用方法

表12-10に、カスタムUIコンポーネントの作成時に使用できるAmxNodeChangeResult APIを示します。

表12-10 AmxNodeChangeResult API

メンバー

説明

adf.mf.api.amx.AmxNodeChangeResult["NONE"]

レンダリング前の子孫AmxNodeでの属性変更に対してアクションを実行しません。

adf.mf.api.amx.AmxNodeChangeResult["REFRESH"]

属性およびその子AmxNodeインスタンスがタイプ・ハンドラによって更新済で、DOMはタイプ・ハンドラのrefresh関数によって更新されます。

adf.mf.api.amx.AmxNodeChangeResult["RERENDER"]

AmxNodeおよびその子AmxNodeインスタンスがタイプ・ハンドラによって更新済ですが、DOMは、AmxNode階層を変更する必要がないため、refresh関数がタイプ・ハンドラでコールされない場合にのみ再作成する必要があります。

adf.mf.api.amx.AmxNodeChangeResult["REPLACE"]

タイプ・ハンドラは変更を処理できません。DOMおよびAmxNode階層が再作成される必要があります。

この値は、タイプ・ハンドラのupdateChildrenメソッドからのみ返され、getDescendentChangeActionメソッドからは返されません。

12.2.11 AmxNodeStatesの使用方法

表12-11に、カスタムUIコンポーネントの作成時に使用できるAmxNodeStates APIを示します。

表12-11 AmxNodeStates API

メンバー

説明

adf.mf.api.amx.AmxNodeStates["INITIAL"]

初期状態。AmxNodeが作成されていますが、移入されていません。

adf.mf.api.amx.AmxNodeStates["WAITING_ON_EL_EVALUATION"]

レンダリングに必要なELベースの属性がまだ完全にロードされていません。

adf.mf.api.amx.AmxNodeStates["ABLE_TO_RENDER"]

EL属性がロードされていますが、AmxNodeはまだレンダリングされていません。

adf.mf.api.amx.AmxNodeStates["PARTIALLY_RENDERED"]

ELはまだ完全にロードされていませんが、AmxNodeはそれ自体を部分的にレンダリングしています(今後使用するために予約されています)。

adf.mf.api.amx.AmxNodeStates["RENDERED"]

AmxNodeは完全にレンダリングされています。

adf.mf.api.amx.AmxNodeStates["UNRENDERED"]

AmxNodeはレンダリングされません。

12.2.12 AmxNodeUpdateArgumentsの使用方法

表12-12に、カスタムUIコンポーネントの作成時に使用できるAmxNodeUpdateArguments APIを示します。

表12-12 AmxNodeUpdateArguments API

戻り型

関数名

パラメータ

説明

Array<adf.mf.api.amx.AmxNode>

getAffectedNodes

なし

影響を受けるAmxNodeインスタンスの配列を取得します。

Map<String,Boolean>

getAffectedAttributes

String amxNodeId

指定されたAmxNode IDの影響を受ける属性を表すオブジェクトを取得します。

Map<String,adf.mf.api.amx.AmxCollectionChange>

getCollectionChanges

String amxNodeId

指定されたAmxNodeおよびプロパティのコレクション変更を取得します。

返されるマップは属性名によってキー設定されます。

AmxNodeに変更がない場合はundefinedを返します。

void

setAffectedAttribute

adf.mf.api.amx.AmxNode amxNode、

String attributeName

影響を受けたとしてAmxNodeの属性をマークします。

void

setCollectionChanges

String amxNodeId、

String attributeName、

adf.mf.api.amx.AmxCollectionChange collectionChanges

指定されたAmxNodeの属性のコレクション変更を設定します。

12.3 カスタム・コンポーネントの作成

JavaScriptおよびMAF APIを使用して、カスタムUIコンポーネントを作成できます。このコンポーネントのJavaScriptファイルは、アプリケーション機能レベル包含を使用して、プロジェクトに追加できます。カスタム・タグ・ライブラリを追加すると、タグ・ライブラリの「コンポーネント」ウィンドウのリストに入力され、このライブラリが選択された場合は、カスタム・コンポーネントが「コンポーネント」ウィンドウで使用可能になり、その属性が「プロパティ」ウィンドウに表示されます。

始める前に

第12.2項「MAF APIを使用したカスタム・コンポーネントの作成」で説明されているAPIについて理解しておいてください。

カスタム・コンポーネントを作成するには、次の手順を実行します。

1. adf.mf.api.amx.TypeHandler.register API (表12-1「静的API」および例12-1「カスタム・コンポーネントのJavaScriptファイル」を参照)を使用して、タグ名前空間および1つ以上の一連のタイプ・ハンドラを登録するJavaScriptファイルを生成します。

2. 各タイプ・ハンドラで、レンダリング・メンバー関数を実装します。

3. オプションで、他の関数を実装します。

4. 1つ以上のJavaScriptおよびCSSファイルをMAF AMXアプリケーション機能に添付します。たとえば、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイルに配置されている、次のサンプル・アプリケーションを参照してください。

- CompGalleryという名前のMAFサンプル・アプリケーションに含まれるcustom.jsおよびcustom.cssファイル。

- WorkBetterサンプル・アプリケーションにはカスタム検索コンポーネントが含まれています。

または、デザインタイム・パッケージングを実行できます。

5. いずれかのカスタム・コンポーネントを使用する各MAF AMXページで、view要素のxmlnsエントリを追加します。

xmlns:custom="http://xmlns.example.com/custom"

例12-1は、カスタム・コンポーネントを宣言するJavaScriptファイルを示しています。

例12-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;
};

})();

カスタムUIコンポーネントの作成方法の例については、CompGalleryという名前のMAFサンプル・アプリケーションに含まれるcustom.amx、customOther.amx、exampleEvents.amxおよびexampleList.amxの各ファイルを参照してください。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.maf/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

第V部

詳細なトピック

ここでは、リモートURLから導出されたコンテンツがネイティブのデバイス制御にアクセスできるようにする方法や、ユーザー・プリファレンス・ページでMAFアプリケーションを拡張する方法、さらには制約の設定によりMAFアプリケーションにおけるコンテンツの表示と非表示の切替え方法をどのようにして決定できるのかについて説明します。ここでは、プッシュ通知、データの同期とキャッシュおよびエラーの処理を有効にする方法について説明します。

第V部は次の章で構成されています。

- 第13章「リモートURLを使用したアプリケーション機能コンテンツの実装」

- 第14章「ユーザー・プリファレンスの有効化」

- 第15章「アプリケーション機能に関する制約の設定」

- 第16章「Oracle Cloud上のデータへのアクセス」

- 第17章「プッシュ通知の有効化」

- 第18章「MAFアプリケーションでのエラーの処理」

13 リモートURLを使用したアプリケーション機能コンテンツの実装

この章では、デバイス・サービスに対して、リモートURLからのコンテンツを使用するアプリケーション機能をアクセス可能(または制限可能)にする方法について説明します。

この章の内容は次のとおりです。

- 第13.1項「リモートURLアプリケーションの概要」

- 第13.2項「アプリケーション・コンポーネントのホワイトリストの作成」

- 第13.3項「リモートURLページでのブラウザ・ナビゲーション・バーの有効化」

- 第13.4項「リモート・コンテンツの作成について」

13.1 リモートURLアプリケーションの概要

図13-1に示すように、maf-feature.xmlファイルの概要エディタにあるアプリケーション機能のコンテンツ・タイプをリモートURLとして構成することで、構成されたURLから供給されるブラウザベースのアプリケーションを作成します。このようなサーバー・ホスト型のアプリケーションは、偶発的な使用を目的としている点およびデバイスのメモリーまたはサービス(カメラ、連絡先、GPSなど)に直接アクセスできない点で、MAF AMX、ローカルHTML、またはObjective-Cなどのプラットフォーム固有言語で記述されたクライアント・アプリケーションとは異なります。かわりに、これらのやり取りはデバイスのブラウザの機能によって異なります。ただし、MAF Webビュー内で開いているリモート・アプリケーションは、Apache Cordova JavaScript APIを使用してデバイス機能にアクセスします(およびMAF JavaScript APIを使用してMAFコンテナ・サービスにアクセスします)。Apache Cordova JavaScript APIライブラリはプラットフォームに固有のライブラリであるため、リモートURLアプリケーションに使用するコンテンツが、ターゲット・プラットフォームに対応したApache Cordovaライブラリを参照していることを確認する必要があります。第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」を参照してください。

図13-1 リモートURLコンテンツの構成

13.1.1 ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化

リモートで供給されるコンテンツのセキュリティを確保するために、MAFはホワイトリスト(GPS、カメラ、ファイル・システムなどの様々なデバイス・サービスにアクセスするためにアプリケーションのWebビュー内で開いているURLのレジストリ)の概念をサポートしています。Webページがホワイトリストに含まれていない(つまりホワイトリストされていない)場合は、そのかわりに、MAFのApache Cordova実装によってデバイス・ブラウザ(Safariなど)でWebページが開かれます。ホワイトリストがない場合、リモートWebページはMAF Webビュー内で開くことができないため、埋込みデバイス機能へのアクセスが制限されます。図13-2に示すように、MAF Webビュー内で開いているURLはアプリケーション機能として示されます。

図13-2 デバイス・ブラウザおよびMAF Webビュー内のURL

13.1.2 リモートURL実装によるApache Cordovaへのアクセスの有効化

リモートURL実装は、Apache Cordova JavaScript APIを使用してデバイス機能にアクセスし、MAF JavaScript APIを使用してMAFコンテナ・サービスにアクセスします。付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」に記載されているとおり、www/js/base.jsライブラリを参照するJavaScript <script>タグによって、このアクセスが可能になります。これらのライブラリは、プラットフォームに固有のライブラリです。つまり、リモートURLアプリケーションに使用するコンテンツが、ターゲット・プラットフォームに対応したApache Cordovaライブラリを参照していることを確認する必要があります。Apache Cordova JavaScript APIライブラリはプラットフォームに固有のライブラリであるため、リモートURLアプリケーションに使用するコンテンツが、ターゲット・プラットフォームに対応したApache Cordovaライブラリを参照していることを確認する必要があります。第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」を参照してください。

13.1.3 ホワイトリストされたドメインによるデバイス機能へのアクセス方法

デフォルトでは、connections.xmlファイルに定義されているドメイン(モバイル・アプリケーションに定義されているすべての接続のリポジトリ)は、自動的にホワイトリストされます。リモートURLコンテンツのこれらのドメインは、図13-3に示すように、「URL接続の作成」ダイアログを使用して作成されます。MAFでは、各接続文字列からドメインを解析して、これらのドメインをホワイトリストに追加します。

図13-3 リモートURLアプリケーション機能のコンテンツを取得するための接続の作成

次に、JDeveloperは、「アプリケーション・リソース」パネルにあるconnections.xmlファイルに接続情報を入力し、さらに接続リソースも作成します。

maf-application.xmlファイルに次のものを構成することで、MAFがconnections.xmlファイルから含めるドメインの他に、MAF Webビューで開くリモートURLコンテンツを有効化(または制限)できます。

- 1つ以上のホワイトリストされたドメイン

- デバイス・アクセス権限: 第21.6項「デバイス機能へのアクセスの許可」に記載されているとおり、アプリケーション機能はアプリケーション・レベルで付与されているデバイス機能にのみアクセスします。デフォルトでは、MAFアプリケーションはApache Cordova APIへのアクセスを許可しません。アプリケーションのユーザー・インタフェースがリモートでホストされたコンテンツを使用して実装され、maf-application.xmlファイルの構成に要求されたAPIのaccess="true"定義が含まれている場合、MAF Webビュー内でのみそのインタフェースを開いてデバイス機能およびサービスにアクセスできます。

始める前に

第4.6.1項「モバイル・アプリケーションのコンテンツの指定方法」の説明に従って、maf-feature.xmlファイルの概要エディタを使用して、アプリケーションのコンテンツをリモートURLとして指定し、接続を作成します。

デバイス・サービスへのアクセスを制限するには:

1. maf-application.xmlファイルの概要エディタで「デバイス・アクセス」ページを開きます。

2. 図13-4に示すように「付与」オプションをオフにするか、またはaccess=false (たとえば、<adfmf:deviceCamera id="dc1" access="false"/>)としてmaf-application.xmlを更新します。

図13-4 ドメインによるデバイス・サービスへのアクセスの禁止

13.1.4 13.1.4 ホワイトリストを作成(またはドメインを制限)する方法

図13-5に示すとおり、maf-application.xmlの「セキュリティ」ページでホワイトリストを構成します。

図13-5 ホワイトリストの構成

始める前に

モバイル・アプリケーションで構成された一部のURLが他のドメインで開かれる可能性があることに注意してください。

ホワイトリストを作成するには:

1. maf-application.xmlファイルを開いて、「セキュリティ」ページを選択します。

2. 「追加」をクリックして、アプリケーション機能のWebビュー内からコールされる可能性があるドメインを入力します。これらのドメインにはワイルドカード(*)を含めることができます。たとえば、*.example.comは、*.example.*と同様に有効なドメイン・エントリです。完全修飾パスは入力できません。

注意:

ワイルドカードのみを入力すると、Webビューではすべてのドメインをリクエストできるため、セキュリティ上のリスクを招く可能性があります。また、すべてのドメインをホワイトリストに追加すると、それらのすべてがWebビュー内で開けるのみではなく、それらのすべてがデバイスにアクセスできるようになります(そのように意図しているかどうかは無関係に)。

13.1.5 ホワイトリストにドメインを追加する場合の処理

ドメインを追加すると、JDeveloperでは、例13-1に示すとおり<adfmf:remoteURLWhiteList>要素が更新されます。

例13-1 ホワイトリストの構成

...
<adfmf:remoteURLWhiteList>
<adfmf:domain id="domain_1">*.oracle.*</adfmf:domain>
<adfmf:domain id="domain_2">www.oracle.*</adfmf:domain>
</adfmf:remoteURLWhiteList>
...

13.1.6 リモートURLに関する必知事項

一部のURLは、ホワイトリスト・ドメインの一部ではない可能性のあるURLにリダイレクトされます。これらのURLは、アプリケーションのWebビューよりもデバイス・ブラウザで開かれる可能性があります。たとえば、www.oracle.com (<adfmf:domain>www.oracle.com<adfmf:domain>)をホワイトリストした場合、MAFはこのサイトのモバイル・バージョン(www.m.oracle.com)をデバイス・ブラウザに開きますが、これはモバイル・バージョンがホワイトリストを通過しないためです。図13-6は、ホワイトリストに追加されていないWebページをデバイス・ブラウザ内で開いたものを示しています。

図13-6 MAF Webビューではなくデバイス・ブラウザで開かれたWebページ

www.oracle.comをアプリケーションのWebビュー内で開けるようにするには、例13-1に示すように*.oracle.*またはwww.oracle.*を指定する必要があります。

MAFのホワイトリストはドメインレベルのため、アプリケーション機能のWebビューで開くことをホワイトリストされたドメイン内の個々のページについて制限することはできず、すべてのページが許可されます。

13.2 アプリケーション・コンポーネントのホワイトリストの作成

別のドメインを指すURLへのリンクを含むページにホワイトリストを使用します。このようなページは、MAF Webビューではなくデバイス・ブラウザで別途開かれます。このような場合、例13-2の<goLink2>にあるurl属性など、アプリケーションの外部を指す<amx:goLink>コンポーネントのurl属性を使用して、アンカー・タグまたは<amx:goLink>コンポーネントを作成できます。

例13-2 URLパラメータを使用した<amx:goLink>

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
<amx:panelPage id="pp1">
<amx:panelGroupLayout id="panelGroupLayout1">
<amx:goLink text="This opens in the device browser"
id="golink1"
url="http://www.example.com"
shortDesc="Opens in device browser"/>
<amx:goLink text="This opens in the web view"
id="golink2"
url="http://www.example2.com"
shortDesc="Accesses device services"/>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

また、第6.3項「UIコンポーネントの作成と使用方法」も参照してください。

13.3 リモートURLページでのブラウザ・ナビゲーション・バーの有効化

MAFでは、図13-7に示すように、MAF Webビュー内で開く、リモートで供給されるWebコンテンツとして実装されるアプリケーション機能に対して、戻る、進むおよびリフレッシュの各アクション用のボタンが付いたナビゲーション・バーを追加できます。進むまたは戻るのいずれかの移動が不可能な場合は、進むと戻るのボタンが無効になります。

注意:

戻るボタンは、Androidデバイスでは無効になります。

図13-7 ナビゲーション・ボタンとリフレッシュ・ボタンを表示するリモートWebページ

13.3.1 リモートURLアプリケーション機能へのナビゲーション・バーの追加方法

maf-feature.xmlファイルの概要エディタの「コンテンツ」タブで、ユーザーがリモート・コンテンツを移動またはリフレッシュできるようにします。

始める前に

第4.10項「アプリケーション機能のコンテンツ・タイプの定義」の説明に従って、まず「リモートURL」を選択し、次にホスト・サーバーへの接続を作成することにより、リモートでホストされるアプリケーションから配信されるアプリケーション機能のコンテンツを指定します。

ドメインがホワイトリストに含まれていることを確認します。

ナビゲーション・バーを有効にするには:

1. maf-feature.xmlファイルの「機能」表にリストされている「リモートURL」アプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 図13-8に示すとおり、「ブラウザ・ナビゲーション・ボタンの表示」を選択します。

図13-8 ナビゲーション・オプションの選択

13.3.2 リモートURLアプリケーション機能のブラウザ・ナビゲーション・ボタンを有効にする場合の処理

JDeveloperでは、showNavButtonsと呼ばれる属性でadfmf:remoteURL要素を更新します。例13-3に示すとおり、ここではtrueに設定されています。

例13-3 showNavButtons属性

<?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>

アプリケーションをデプロイすると、図13-9に示すとおり、MAFでは、進む、戻るおよびリフレッシュの各ボタンがリモートURLアプリケーション機能のホームページから移動されるWebページに適用されます。

Figure 13-9 リモートURLアプリケーション機能での移動

13.4 13.4 リモート・コンテンツの作成について

Apache Trinidadコンポーネント(http://myfaces.apache.org/trinidad/の説明を参照)はスマートフォンまたはフィーチャー・フォンのいずれのブラウザ内でも等しく適切に表示されるため、ブラウザベースのユーザー・インタフェースがそれらのコンポーネントを使用して作成される場合があります。最近のスマートフォンおよびタブレット・デバイスに対応するために、Oracle Fusion Middleware Oracle ADF FacesによるWebユーザー・インタフェースの開発に記載されているとおり、ADF Rich Facesコンポーネントを使用してWebアプリケーションが作成される場合もあります。

注意:

リモートURLからコンテンツを導出するアプリケーション機能にはADFモバイル・ブラウザを使用することをお薦めします。ADFモバイル・ブラウザ・アプリケーションは、Apache Trinidadコンポーネントが移入されたJSFページで構成されます。詳細は、『Oracle Fusion Middleware Oracle ADFモバイル・ブラウザ・アプリケーションの開発』を参照してください。

14 ユーザー・プリファレンスの有効化

この章では、アプリケーションレベルとアプリケーション機能レベルの両方のユーザー・プリファレンス・ページを作成する方法について説明します。

この章の内容は次のとおりです。

- 第14.1項「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」

- 第14.2項「アプリケーション機能のユーザー・プリファレンス・ページの作成」

- 第14.3項「ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法」

- 第14.4項「プラットフォームによる表示の差異」

14.1 モバイル・アプリケーションのユーザー・プリファレンス・ページの作成

プリファレンスによって、エンド・ユーザーが構成可能な設定を追加できます。maf-application.xmlおよびmaf-feature.xmlの両方のファイル内で、<adfmf:preferences>要素を使用してユーザー・プリファレンス・ページを定義します。例14-1に示すとおり、<adfmf:preferenceGroup>と呼ばれる<adfmf:preferences>の子要素とその子要素によってユーザー・プリファレンスを定義します。これには、テキスト文字列、ドロップダウン・メニューや、例14-1のケースのようにアプリケーション設定の追加オプションをユーザーに提示する子ページなど、様々な形でオプションを提示するページを作成します。

また、<adfmf:preferences>要素を使用して、各アプリケーション機能内でユーザーが管理するプリファレンスを作成します。

例14-1 <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>

図14-1では、子ユーザー・プリファレンス・ページを開くことでそれに続くオプションを提供する方法の例を示しています。

図14-1 ユーザー・プリファレンス・ページ

プリファレンス・ページは<adfmf:preferenceGroup>要素内で定義され、次の子要素が存在します。

- <adfmf:preferencePage>: ユーザー・インタフェースに新しいページを指定します。

- <adfmf:preferenceList>: ユーザーに特定のオプション・セットを提供します。

- <adfmf:preferenceValue>: リスト要素を定義する子要素です。

- <adfmf:preferenceBoolean>: ブール設定です。

- <adfmf:preferenceText>: テキスト・プリファレンス設定です。

これらの要素とその属性の詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

アプリケーションおよびアプリケーション機能レベルの両方のプリファレンス・ページを作成する例については、PrefDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内で次の場所にあるPublicSamples.zipファイルに置かれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

PrefDemoアプリケーションは、アプリケーションレベルの設定ページと、MAF AMXとして実装されている3つのアプリケーション機能のプリファレンス・ページで構成されています。図14-2は、通常の設定ページから起動する、PrefDemoアプリケーションの設定ページを示しています。この図では、プリファレンス設定ページをiOSの設定アプリケーションから起動しています。

図14-2 PrefDemoアプリケーションの設定ページ

図14-3で「App」、「Feature1」(これが選択されています)および「Feature 2」と表示されているアプリケーション機能のプリファレンス・ページでは、MAF AMXブール・スイッチ、入力テキストおよび出力テキストの各コンポーネントから構築されたプリファレンス・ページの例が示されています。これらのコンポーネントは、EL(式言語)を使用してアプリケーション機能やその内部に構成されている様々な<adfmf:preferences>コンポーネントにアクセスします。詳細は、第14.3項「ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法」を参照してください。

図14-3 PrefDemoアプリケーションに表示されたアプリケーション機能のプリファレンス・ページ

PrefDemoアプリケーションでは、ビュー・アクティビティとページ・リフレッシュが可能な制御フロー・ケースで構成される単一のバインド・タスク・フローによって、MAF AMXの各プリファレンス・ページが参照されます。

14.1.1 モバイル・アプリケーションレベルのプリファレンス・ページの作成方法

maf-application.xml概要エディタの「プリファレンス」ページ(図14-4を参照)では、<adfmf:preferenceGroup>内の子プリファレンス・ページ要素をネストすることでアプリケーションレベルのプリファレンス・ページ・セットを構築できます。このページでは、<adfmf:preferencesGroup>およびその子要素が同様に名付けられたオプション(「プリファレンス・グループ」、「プリファレンス・ページ」、「プリファレンス・リスト」など)として示され、JDeveloperの「構造」ウィンドウと同様にこれらを階層(またはツリー)にアセンブルします。

図14-4 プリファレンス・ページを使用したモバイル・アプリケーションレベルのプリファレンスの追加

maf-application.xmlファイルを正しく構成するには、図14-4に示す「プリファレンス」ページの「追加」ドロップダウン・リストを使用してユーザー・プリファレンス・ページを構築します。また、図14-5に示す「プリファレンス」パレットからコンポーネントをドラッグして、エディタ、「ソース」ウィンドウまたは「構造」ウィンドウのいずれかにドロップできる一方で、そのページのドロップダウン・リストには、選択されたプリファレンス要素に対して、適切な親、子または兄弟の関係を持つことができる要素のみが提示されます。たとえば、図14-4には、プリファレンス・グループ要素であるOracleモバイル・アプリケーション内に挿入できるコンポーネントのみが示されています。また、このエディタでは、各プリファレンス要素に固有の属性に対して値を入力できます。

図14-5 「コンポーネント・パレット」内の「プリファレンス」

プリファレンス・ページを作成するには:

1. 「プリファレンス」をクリックします。

2. 「追加」をクリックして、親である<adfmf:preferenceGroup>要素を作成します。

3. 次の情報を「プリファレンス・グループの挿入」ダイアログ(図14-6を参照)に入力します。

図14-6 親プリファレンス・グループ要素の定義

- プリファレンス・グループ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。ユーザー・インタフェースにこのテキストを表示する方法の例は、図14-1の例を参照してください。

4. 「追加」をクリックし、「前に挿入」、「内部に挿入」、「後ろに挿入」の各オプションを使用してさらにプリファレンス・ページを定義し、XML文書が正しく構成されるようにします。

14.1.1.1 新しいユーザー・プリファレンス・ページの作成方法

プリファレンス・ページ・コンポーネントでは新しいユーザー・インタフェース・ページを作成できます。「前に挿入」、「内部に挿入」、「後ろに挿入」の各オプションを使用してプリファレンス・ページを作成します。

始める前に

プリファレンス・グループ要素を作成する必要があります。

新しいユーザー・プリファレンス・ページを作成するには:

1. 「プリファレンス・グループ」要素を選択します。

2. 「追加」をクリックして「内部に挿入」(プリファレンス・グループ)を選択し、「プリファレンス・ページ」を選択します。図14-7に示すとおり、プリファレンス・グループはMobileAppと呼ばれています。

図14-7 プリファレンス・ページ・コンポーネントの選択

3. 「プリファレンス・ページの挿入」ダイアログ(図14-8を参照)に次のプリファレンス・ページ属性を定義します。

- プリファレンス・ページ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図14-8 「プリファレンス・ページの挿入」ダイアログ

4. プリファレンス・ページを選択し、図14-9に示すとおり、「内部に挿入」(プリファレンス・ページ)→「プリファレンス・グループ」と選択することで、子プリファレンス・グループ要素を挿入し、プリファレンス・ページの本体を作成します。子プリファレンス・グループの一意の識別子と表示名を定義すると、これにプリファレンス・リスト要素などの他の要素を移入できます(例14-2を参照)。

図14-9 プリファレンス・グループのプリファレンス・ページへの追加

14.1.1.2 プリファレンス・ページを追加する場合の処理

概要エディタでプリファレンス・ページとその子プリファレンス・グループ・コンポーネントを定義すると、JDeveloperでは、例14-2と同様の属性を使用して<adfmf:preferencePage>が生成されます。<adfmf:preferencePage>は、親<adfmf:preferenceGroup>要素内にネストされます。

例14-2 <adfmf:PreferencePage element>の追加

<adfmf:preferences>
<adfmf:preferenceGroup id="gen"
label="Oracle Mobile App">
<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>

14.1.1.3 ユーザー・プリファレンス・リストの作成方法

プリファレンス・リスト・コンポーネントを追加してオプションのリストを作成します。

始める前に

プリファレンス・リストまたは他のすべてのリストに関連するコンポーネントの親としてプリファレンス・グループを作成する必要があります。

ユーザー・プリファレンス・リストを作成するには:

1. 「プリファレンス・グループ」または「プリファレンス・ページ」を選択して、「追加」→「内部に挿入」→「プリファレンス・リスト」の順にクリックします。例14-2には、Select Your Versionという名前のプリファレンス・グループ・コンポーネントの子としてプリファレンス・リストを追加する例が示されています。

図14-10 プリファレンス・リスト・コンポーネントのプリファレンス・グループへの追加

2. 「プリファレンス・リストの挿入」ダイアログ(図14-2を参照)を使用して次の属性を定義し、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図14-11 「プリファレンス・リストの挿入」ダイアログ

3. 「プリファレンス値」表(図14-12を参照)で「追加」をクリックし、アイテムのリストを定義します。プリファレンス値を選択してから「削除」をクリックすることで、この値を削除することもできます。プリファレンス値の表示順番を変更するには、プリファレンス値を選択してから上および下の矢印を使用します。
ユーザーにデフォルト設定を提供するには、「デフォルト」を選択します。例14-2に示すように、<adfmf:preferenceList>要素内でデフォルト・ステータスは、default="ENTERPIRSE"と定義されています。

ヒント:

「追加」をクリックする他、それらをドラッグして「構造」ウィンドウまたは「ソース」ウィンドウのいずれかにドロップしても、プリファレンス値コンポーネントを追加できます。

図14-12 プリファレンス値の追加

14.1.1.4 プリファレンス・リストを作成する場合の処理

プリファレンス・リスト・コンポーネントをプリファレンス・グループに追加し、一連のプリファレンス値を定義すると、例14-2に示すように、JDeveloperでは<adfmf:preferenceList>要素を使用して<adfmf:preferences>セクションが更新されます。

14.1.1.5 ブール型のプリファレンス・リストの作成方法

たとえば、例14-1を参照してください。

始める前に

<adfmf:preferenceBoolean>要素は<adfmf:preferenceGroup>要素内にネストされる必要があるため、まずプリファレンス・グループ・コンポーネントを階層に挿入する必要があります。

ブール型のプリファレンス・リストを作成するには:

1. 図14-13のGPS設定など、プリファレンス・グループ要素を選択します。

図14-13 ブール型プリファレンスのプリファレンス・グループへの追加

2. 「ブール型のプリファレンスの挿入」ダイアログ(図14-14を参照)を使用して次の属性を定義し、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図14-14 「ブール型のプリファレンスの挿入」ダイアログ

3. デフォルト値のfalseをそのまま使用するか、trueを選択します。

14.1.1.6 ブール型のプリファレンスを追加する場合の処理

ブール型のプリファレンスを追加してそのデフォルト値を指定した場合、例14-3に示すように、JDeveloperでは、<adfmf:preferenceBoolean>要素を使用してmaf-application.xmlファイルの<adfmf:preferences>セクションが更新されます。

例14-3 <adfmf:preferenceBoolean>要素の追加

<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>

14.1.1.7 テキストのプリファレンスの追加方法

図14-15に示すように、挿入オプションを使用して、ユーザーが情報を格納したりデフォルト・テキストを閲覧できるようにする「テキストのプリファレンス」というダイアログを作成します。図14-15は、「セキュリティ」という名前のプリファレンス・グループ内にテキストのプリファレンスを作成する例を示しています。

図14-15 「テキストのプリファレンス」の挿入

始める前に

プリファレンス・グループ要素を作成します。

テキストのプリファレンスを作成するには:

1. プリファレンス・グループ要素を選択します。

2. 「内部に挿入」→「テキストのプリファレンス」を選択します。

3. 「テキストのプリファレンスの挿入」ダイアログ(図14-16を参照)に次の情報を入力して、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図14-16 「テキストのプリファレンスの挿入」ダイアログ

4. テキストのプリファレンス・ダイアログに次を定義します。

- デフォルトのテキスト値を入力します。

- テキストのプリファレンスを非表示にするには、「機密」を選択します。

図14-17 テキストのプリファレンスの定義

14.1.1.8 テキストのプリファレンスを定義する場合の処理

テキストのプリファレンスを追加してそのデフォルト値を指定すると、例14-4に示すように、JDeveloperでは、<adfmf:preferenceText>要素を使用してmaf-application.xmlファイルの<adfmf:preferences>セクションが更新されます。

例14-4 <adfmf:preferenceText>要素の追加

<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、ユーザー名およびパスワードのプリファレンス設定を定義するプリファレンス・グループ要素は図14-18のように表示されます。

図14-18 テキストのプリファレンス

図14-18は、セキュリティURLがシードされた値、ユーザー名が入力値の<adfmf:preferenceText>要素を示しています。MAFのプリファレンスはiOS設定アプリケーションと統合されているため、パスワード入力テキストのsecret="true"属性により、ユーザーの入力を黒丸で覆うiOSの表記規則に従うアプリケーションとなります。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『Settings Application Schema Reference』のisSecureテキスト・フィールド要素の説明および第14.4項「プラットフォームによる表示の差異」を参照してください。

14.1.2 アプリケーションレベルのプリファレンス・ページを作成する場合の処理

モバイル・アプリケーションをデプロイすると、アプリケーション全体のプリファレンス設定ページがiOSデバイスの設定アプリケーションなど、デバイスのグローバル設定アプリケーションに伝播されます。詳細は、付録C「デプロイメントでのプリファレンスの変換」を参照してください。

14.2 アプリケーション機能のユーザー・プリファレンス・ページの作成

第4.13項「機能アーカイブ・ファイルの使用」で説明するように、アプリケーション機能をモバイル・アプリケーションと別個に配布するには、そのアプリケーション機能を含む機能アプリケーション・アーカイブ(FAR) .jarファイルを、別のモバイル・アプリケーションに追加します。その後、このアプリケーション機能を、アプリケーションのmaf-application.xmlファイル内で参照します。アプリケーション機能において、使用先のアプリケーション用に定義した全般的なプリファレンスだけでなく、特定のユーザー・プリファレンスのセットが必要になる場合は、maf-feature.xmlの概要エディタの「プリファレンス」タブを使用して、該当するプリファレンスを定義できます(図14-19を参照)。第14.1項「モバイル・アプリケーションのユーザー・プリファレンス・ページの作成」の説明に従い、アプリケーション・レベルのプリファレンスを構築する方法で、アプリケーション機能のプリファレンスを構築します。maf-feature.xmlファイル内でプリファレンスを定義したら、次は第6.3項「UIコンポーネントの作成と使用方法」で説明したブール・スイッチ、入力および出力の各コンポーネントに埋め込むMAF AMXページを参照するアプリケーション機能を作成することによって実際のプリファレンス・ページを作成します。

図14-19 アプリケーション機能レベルのプリファレンスの設定

14.3 ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法

アプリケーション機能レベルのプリファレンス・ページを作成する場合、例14-5の入力テキスト・コンポーネントなど、MAF AMXコンポーネントに対してEL式を追加します。

例14-5 MAF AMXコンポーネントでELを使用したプリファレンス値の参照

<amx:inputText label="Number" id="it1" inputType="number"
value="#{preferenceScope.feature.Feature1.f1top.f1Number}"/>

例14-5に示すとおり、EL式では、preferenceScopeオブジェクトを使用して、アプリケーションがアプリケーション機能レベルのプリファレンスにアクセスできるようにします。これらのEL式の書式は次のとおりです。

preferenceScope.feature.feature-id.group-id.property-id

図14-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要素が含まれる可能性があります。

図14-20 プリファレンスに対するEL式の構築

14.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オブジェクトの詳細は、第7.3.5.3項「モバイル・アプリケーション・フレームワーク・オブジェクト・カテゴリについて」を参照してください。

14.3.2 iOSネイティブ・ビューでのプリファレンス値の読取り

MAFでは、ネイティブUI (UIView、UIViewControllerなど)に提供されているAPIが統合され、iOSプラットフォームで一定の構成が可能です。

ネイティブUIを初期化すると、ADFSession オブジェクトのインスタンスが利用可能になります。そのgetPreferencesメソッドを使用して、MAFに対し、maf-application.xmlファイルで定義されているアプリケーションで利用可能なプリファレンスのリストを提供するように命令できます。例14-6に示すとおり、このメソッドでは、プリファレンスにid、valueおよびlabelを含めることができるプリファレンス・プロパティ・オブジェクトのNSArray*が戻されます。このAPIコールでは、エンド・ユーザーによって特定のプリファレンスの値が提供されたこと、またはプリファレンスのデフォルト値が戻されていることのいずれかを確認します。

例14-6 プリファレンスの取得

//...
-(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;
}

14.4 プラットフォームによる表示の差異

MAFのプリファレンス・ページでは、iOSおよびAndroidの両プラットフォームでネイティブのルック・アンド・フィールが維持されます。その結果、MAFのプリファレンス・ページの表示は2つのプラットフォームで異なります。表14-1に示すとおり、iOSプラットフォームではプリファレンスがインラインで表示されるため、そのシステムではダイアログ・ページを起動しません。いくつかの例外を除いて、Androidプラットフォームではこれらのコンポーネントがダイアログで表示されます。

表14-1 プラットフォームごとのプリファレンス・コンポーネントの比較

コンポーネント

iOS

iOSの表示例

Android

Androidの表示例

プリファレンス・グループ(カテゴリ選択)

iOSでは、その親プリファレンス・グループ内にプリファレンス要素が表示されます。

Androidでは、その親プリファレンス・グループ内にプリファレンス要素が表示されます。

ブール型のプリファレンス・リスト

ブール型のプリファレンスは、onとoffなどのペアの値で表示されます。

Androidでは、ブール型のプリファレンスをチェック・ボックスで表示します。

テキスト・プリファレンス

iOSはテキストをインラインで表示します。

Androidは、入力フィールド内にデフォルト・テキストを表示します。

テキストのプリファレンス(機密入力テキスト)

iOSプラットフォームでは、ユーザーはテキストをインラインで入力し、各文字はその入力後に黒丸で覆われます。詳細は、第14.1.1.8項「テキストのプリファレンスを定義する場合の処理」を参照してください。

Androidでは、入力テキスト・ダイアログが起動し、各文字はその入力後に黒丸で覆われます。

単一のアイテム選択リスト(プリファレンス・リストから)

iOSプラットフォームでは別のプリファレンス・ページに単一のアイテム選択リストが表示されます。

Androidでは、ダイアログ内に単一のアイテム選択リストが表示されます。

プリファレンス・ページ

iOSでは、プリファレンス・グループから子プリファレンス・ページを起動します。

Androidでは、プリファレンス・グループから子プリファレンス・ページを起動します。

iOSおよびAndroidのプラットフォームには設定アプリケーションがありますが、図14-21のプリファレンスで示すように、設定アプリケーションへのアプリケーション・レベルのプリファレンスの統合はiOSプラットフォームのみでサポートされます。

図14-21 iOS設定アプリケーションでのOracleモバイル・プリファレンス

Androidデバイスでは、ユーザーは、アプリケーションが実行されている場合のみ、図14-22のようなアプリケーション固有のプリファレンス・ページにアクセスします。

図14-22 Androidデバイスのプリファレンス・メニュー

15 アプリケーション機能に関する制約の設定

この章では、ユーザーのアクセス権限またはデバイス要件に基づいてアプリケーション機能を制限できる制約の設定方法について説明します。

この章の内容は次のとおりです。

- 第15.1項「制約の概要」

- 第15.2項「アプリケーション機能の制約の定義」

15.1 制約の概要

制約には、アプリケーション機能またはアプリケーション・コンテンツを使用するタイミングが記述されています。制約では、ユーザーとユーザー・ロール、モバイル・アプリケーションの実行対象となるデバイス、およびデバイス上で使用可能なハードウェアに基づいて、アクセスを制限できます。制約は2つのレベルで設定できます。1つ目のアプリケーション機能レベルでは、ユーザーのデバイスにおけるアプリケーション機能の可視性を制御し、2つ目のコンテンツ・レベルでは、アプリケーション機能に対して配信できるMAFコンテンツのタイプを指定できます。maf-feature.xmlファイルの概要エディタでは、これら両方のタイプの制約を設定できます。制約はMAFランタイムによって評価され、エンド・ユーザーが特定のコンテンツを表示または使用したり、アプリケーション機能自体にアクセスできるようにするには、trueに評価される必要があります。

15.1.1 制約を使用したアプリケーション機能の表示または非表示

図15-1に示す「制約」タブでは、アプリケーション機能レベルの制約を設定できます。たとえば、デバイスのカメラを使用するアプリケーション機能は、そのデバイスに実際にカメラ機能があることがMAFランタイムによって確認された場合のみ、モバイル・アプリケーションのナビゲーション・バーまたはSpringboard内に表示されます。また、機能レベルの制約を使用すると、ユーザー・ロールと権限に基づいてアプリケーションを保護することもできます。図15-1に、MAFランタイムによって制約がtrueに評価されたときに、管理者権限を持つユーザーのみにアプリケーション機能への
アクセスを許可する制約を作成する方法を示します。制約がランタイムによってfalseと評価された場合、アプリケーション機能はナビゲーション・バーまたはSpringboard内に表示されないため、エンド・ユーザーはそのアプリケーション機能にアクセスできません。

図15-1 アプリケーション機能レベルの制約の設定

15.1.2 制約を使用した特定のコンテンツ・タイプの配信

デバイス・ハードウェア・プロパティやユーザー権限などのファクタに対応するため、単一のアプリケーション機能に複数のコンテンツ・タイプを指定し、ユーザー・インタフェースの様々なバージョンを配信できます。アプリケーション機能のコンテンツに関する制約を設定することによって、アプリケーション・ページを表示できるエンド・ユーザーや、そのページの使用方法を特定する条件を指定できます。

たとえば、「コンテンツ」タブ(図15-2を参照)を使用して、管理権限を付与されたユーザーに特定のタイプのユーザー・インタフェースを表示し、基本的なユーザー権限を持つユーザーに別のユーザー・インタフェースを表示できます。また、コンテンツ・レベルの制約によって、デバイスのレイアウトに関する考慮事項に対応できます。図15-2は、この例として、サンプル・アプリケーションで、デバイスの画面幅に基づく制約を使用して、iPhoneとiPadのレイアウトに合わせて調整されたページをコールするAMXモバイル・タスク・フローを配信する方法を示しています。エンド・ユーザーがサンプル・アプリケーションを起動すると、MAFランタイムによって、Employeesアプリケーション機能に対して設定された制約が評価されます。デバイス画面の対角線幅が6インチを超えることがランタイムによって確認されると、Employees_pad_taskflow.xmlファイルが選択され、このファイルによって、iPad用に設計されたMAF AMXページがコールされます。この制約がfalseに評価された(つまり、画面の対角線幅が6インチ未満の)場合は、ランタイムによって、iPhone固有のページをコールするMAFタスクフローであるEmployees_phone_taskflow.xmlが選択されます。さらに、「コンテンツ」タブを使用すると、ランタイムによって特定のコンテンツが選択されたときに表示されるナビゲーション・バーとSpringboardのイメージを選択できます。コンテンツ固有のイメージを選択しなかった場合、MAFでは、「一般」タブで指定されたアプリケーション機能レベルのイメージが使用されます。

注意:

第4.9.1項「アプリケーション機能の基本情報の定義方法」で説明されているように、イメージはプラットフォーム固有のガイドラインに準拠している必要があります。

図15-2 コンテンツ・レベルの制約の設定

サンプル・アプリケーションの詳細は、付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照してください。

15.2 アプリケーション機能の制約の定義

アプリケーション機能レベルの制約を設定する際、<adfmf:constraint>要素(<adfmf:constraints>の子要素)のproperty、operatorおよびvalue属性を使用すると、ユーザー、デバイスまたはハードウェアに基づいてアプリケーションの使用を制限できます。例15-1に示すこれらの属性の定義の例は、アプリケーション機能へのアクセスをField Repに制限し、さらにiOSデバイスでのみアプリケーションを実行するように制限する属性の定義を示しています。

例15-1 <adfmf:constraint>要素

<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="contains"
value="Field Rep"/>
<adfmf:constraint property="device.model"
operator="contains"
value="ios"/>
</adfmf:constraints>

15.2.1 アプリケーション機能に制約を定義する方法

図15-2に示すように、「機能」ページの「制約」タブを使用して、選択したアプリケーション機能の制約を宣言的に構成します。

アプリケーション機能の制約を定義するには:

1. 「制約」タブをクリックします。

2. 「追加」をクリックします。

3. プロパティと適切な演算子を選択し、値を入力します。プロパティの使用の詳細は、第15.2.3項「property属性について」を参照してください。

15.2.2 制約を定義する場合の処理

「制約」タブに値を入力すると、例15-1と同様に、定義された<adfmf:constraint>要素で識別子ファイルの<adfmf:constraints>要素が更新されます。

15.2.3 property属性について

MAFでは、ユーザー、デバイスおよびハードウェアの各プロパティを反映する一連のproperty属性が提供されています。これらのプロパティを次の演算子と組み合せて使用することでアプリケーション機能の使用方法が決定されます。

- contains

- equal

- less

- more

- not

15.2.4 ユーザー制約とアクセス制御について

ユーザーがモバイル・アプリケーションにログインすると、MAFモバイル・ランタイムでは、アプリケーション機能ごとに構成されたユーザー・ロール・ベースの制約を、アクセス制御サービス(ACS)によって取得されたユーザー・ロールと権限に対して調整します。その後、MAFでは、制約を満たす権限を持つエンド・ユーザーにのみ、アプリケーション機能(またはアプリケーション機能のコンテンツ)を提供します。このようなユーザー権限とロールに関する制約を設定するだけでなく、「MAFログイン接続の作成」ダイアログに次の項目を入力することによって、モバイル・アプリケーション用のアクセス制御を作成できます(図15-3および第21.5.2項「ログイン・ページの指定方法」を参照)。

- ユーザー・ロールと権限を送信するREST WebサービスのURL。

- アプリケーション機能によってチェックされるユーザー・ロールのリスト。

- 権限のリスト。

第21.4.17項「アクセス制御サービスに関する必知事項」も参照してください。

図15-3 ユーザー・ロールと権限の取得の構成

user.rolesおよびuser.privilegesに基づく制約を使用してアプリケーション機能へのアクセスを制御します。たとえば、アプリケーション機能へのアクセスをmanagerロールを持つユーザーのみに許可するには、user.roles contains managerの制約をアプリケーション機能の定義に追加する必要があります。

user.rolesおよびuser.privilegesでは、containsおよびnotの演算子を次のように使用します。

- contains: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれる場合、ランタイムではその制約をtrueに評価します。例15-2には、contains演算子を使用したuser.rolesプロパティの使用の例が示されています。ユーザーのロールに従業員のロールが含まれている場合は、モバイル・アプリケーションにアプリケーション機能が表示されます。

例15-2 ユーザー・ロール・コレクションに対するcontains演算子の使用方法

<feature ...>
...
<constraints>
<constraint property="user.roles"
operator="contains"
value="employee" />
</constraints>
...
</feature>

- not: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれない場合、ランタイムではその制約をtrueに評価します。例15-3では、ユーザーの権限に管理者権限が含まれる場合はアプリケーション機能が含められません。

例15-3 not演算子とuser.privilegesプロパティを使用したアプリケーション機能へのアクセスの制限

<feature ...>
...
<constraints>
<constraint property="user.privileges"
operator="not"
value="manager" />
</constraints>
...
</feature>

15.2.5 ハードウェア関連の制約について

ハードウェア・オブジェクトは、カメラの有無、コンパス向首方向情報提供機能、ファイルの保存機能など、デバイスで使用可能なハードウェアを参照します。次のプロパティではequal演算子が使用されます。

- hardware.networkStatus: アプリケーションの起動時にネットワークの状態が表示されます。NotReachable、CarrierDataConnectionおよびWiFiConnectionの3つの属性値を使用してこのプロパティを変更できます。例15-4は、この3つ目の値を示しています。その例に示すとおり、この値を設定することで、デバイス・ハードウェアがWi-Fi接続があることを示している場合にのみモバイル・アプリケーションにこのモバイル・アプリケーション機能が表示されることになります。つまり、デバイスにWi-Fi接続がない場合は、モバイル・アプリケーションをロードしても、そのアプリケーション機能は表示されません。

例15-4 hardware.networkStatusプロパティの定義

<feature ...>
...
<constraints>
<constraint property="hardware.networkStatus"
operator="equal"
value="WiFiConnection" />
</constraints>
...
</feature>

注意:

この制約は、iOSデバイスの起動時に評価されます。起動時にデバイスにWi-Fi接続がなく、その後その接続を取得した場合(ユーザーがWi-Fiのホットスポットに入った場合など)、アプリケーション機能は無効のままとなり、ユーザーがモバイル・アプリケーションを停止し再起動するまで利用できません。

- hardware.hasAccelerometer: デバイスに加速度計があるかどうかを示します。このプロパティは、trueまたはfalseの値で定義します。例15-5は、trueの値を示しており、ハードウェアに加速度計がある場合にのみこのアプリケーション機能が利用可能なことを示しています。

例15-5 hardware.hasAccelerometerプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasAccelerometer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアにはすべて加速度計があるため、このプロパティは常にtrueの値にして、iOSデバイスでアプリケーション機能が利用できるようにしておく必要があります。

- hardware.hasCamera: デバイスにカメラがあるかどうかを示します。この制約は、trueまたはfalseの属性値を使用して定義します。例15-6は、値がtrueに設定されており、デバイスにカメラが含まれている場合にのみアプリケーション機能が利用可能なことを示しています。

例15-6 hardware.hasCameraプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasCamera"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベース・ハードウェアにカメラが搭載されているわけではありません。この値は、iOSデバイスでモバイル・アプリケーションを起動したときに動的に評価されます。そのときに、モバイル・アプリケーションでは、trueに評価されないアプリケーション機能が削除されます。

- hardware.hasCompass: デバイスにコンパスがあるかどうかを示します。この制約は、例15-7に示すように、trueまたはfalseの属性値を使用して定義します。

例15-7 hardware.hasCompassプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasCompass"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSデバイスにコンパスがあるわけではありません。この値は、iOSデバイスでモバイル・アプリケーションを起動したときに動的に評価されます。そのときに、モバイル・アプリケーションでは、trueに評価されないアプリケーション機能が削除されます。

- hardware.hasContacts: デバイスにアドレス帳またはコンタクト先があるかどうかを示します。この制約は、例15-8に示すように、trueまたはfalseの属性値を使用して定義します。

例15-8 hardware.hasContactsプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasContacts"
operator="equal"
value"=true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアのコンタクト先はApache Cordova経由でアクセスされるため、iOSデバイスに対してはvalue属性は常にtrueに設定されます。

- hardware.hasFileAccess: デバイスでファイル・アクセスが可能かどうかを示します。この制約は、例15-9に示すように、trueまたはfalseの属性値を使用して定義します。ランタイムがこの制約をtrueに評価した場合にのみ、アプリケーション機能を利用できます。

例15-9 hardware.hasFileAccessプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasFileAccess"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアのファイル・アクセスはApache Cordova経由でアクセスされるため、iOSデバイスに対してはvalue属性は常にtrueになります。

- hardware.hasGeoLocation: デバイスが地理的位置情報サービスを提供しているかどうかを示します。この制約は、例15-10に示すように、trueまたはfalseの属性値を使用して定義します。デバイスが地理的位置情報をサポートする場合にのみ、アプリケーション機能を利用できます。

例15-10 hardware.hasGeoLocationプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasGeoLocation"
operator="equal"
value="true"/>
</constraints>
...
</feature>

注意:

Apache Cordovaでは、すべてのiOSデバイスに対して地理的位置情報サービスへのアクセスを提供しているわけではありません。デバイスによっては、制約がランタイムにより評価された場合に、アプリケーション機能が利用できない可能性があります。

- hardware.hasLocalStorage: デバイスがファイルのローカル記憶域を提供するかどうかを示します。この制約は、例15-11に示すように、trueまたはfalseのvalue属性を使用して定義します。デバイスがローカルでのファイルの格納をサポートする場合にのみ、アプリケーション機能が表示されます。

例15-11 hasLocalStorageプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasLocalStorage"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

Apache CordovaではすべてのiOSハードウェアでローカル・ファイル記憶域へのアクセスが提供されるため、iOSデバイスに対するvalue属性は常にtrueになります。

- hardware.hasMediaPlayer: デバイスにメディア・プレーヤがあるかどうかを示します。この制約は、例15-12に示すように、trueまたはfalseのvalue属性を使用して定義します。デバイスにメディア・プレーヤがある場合にのみ、アプリケーション機能が表示されます。

例15-12 hardware.hasMediaPlayerプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasMediaPlayer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

Apache CordovaではiOSベースのハードウェアでメディア・プレーヤへのアクセスを提供しているため、iOSデバイスではvalue属性は常にtrueになります。

- hardware.hasMediaRecorder: デバイスにメディア・レコーダがあるかどうかを示します。この制約は、例15-13に示すように、trueまたはfalseのvalueを使用して定義します。デバイス・ハードウェアがメディア・レコーダをサポートする場合にのみ、アプリケーション機能が含まれます。

例15-13 hardware.hasMediaRecorderプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasMediaRecorder"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベースのハードウェアにApache Cordovaからアクセス可能なメディア・レコーダがあるため、すべてのiOSデバイスでこの値をtrueに設定します。Apple iTouchなどのいくつかのデバイスにはマイクがありませんが、エンド・ユーザーは外部マイクを取り付けることでレコーディングが可能になります。

- hardware.hasTouchScreen: ハードウェアにタッチ・スクリーン機能があるかどうかを示します。この制約は、例15-14に示すように、trueまたはfalseのvalue属性を使用して定義します。デバイス・ハードウェアがタッチ・スクリーンをサポートする場合にのみ、アプリケーション機能が含められます。

例15-14 hardware.hasTouchScreenプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasTouchScreen"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベースのハードウェアにタッチ・スクリーン機能があるため、iOSデバイスのvalue属性をtrueに設定します。

- hardware.screen.width: デバイスの現在の向きでの画面幅を示します。画面幅を、デバイスに表示される実際のピクセルを表す物理デバイス・ピクセル単位ではなく、論理デバイス・ピクセル単位(例15-15では320)で示す数値を入力します。この値はデバイスの向きによって異なります。

例15-15 hardware.screen.widthプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.screen.width"
operator="equal"
value="320" />
</constraints>
...
</feature>

注意:

この値はモバイル・アプリケーションの起動時に評価され、その際にランタイムが制約を評価し、trueに評価されない制約を持つアプリケーション機能は削除されます。アプリケーション機能の設定はモバイル・アプリケーションの起動後に固定されるため、モバイル・アプリケーションの起動後にユーザーがデバイスを回転した場合、この制約はMAFのランタイムによって再評価されません。

- hardware.screen.height: デバイスの現在の位置における画面高さを示します。例15-16に示すように、320や480などの画面高さ(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

例15-16 hardware.screen.heightプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.screen.height"
operator="equal"
value="480" />
</constraints>
...
</feature>

注意:

モバイル・アプリケーションの起動時に、trueに評価されない制約を持つアプリケーション機能を削除するプロセスの一部として、この制約の画面高さの値がMAFランタイムによって評価されます。アプリケーション機能の設定はモバイル・アプリケーションの起動後に固定されるため、モバイル・アプリケーションの起動後にユーザーがデバイスの向きを変えた場合、この制約はランタイムによって再評価されません。

- hardware.screen.availableWidth: デバイスの現在の向きで利用可能な画面幅を示します。例15-17に示すように、320や480などの画面幅(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

例15-17 hardware.screen.availableWidthプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.screen.availableWidth"
operator="equal"
value"320" />
</constraints>
...
</feature>

- hardware.screen.availableHeight: デバイスの現在の位置で利用可能な画面高さを示します。例15-18に示すように、320や480などの画面幅(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

例15-18 hardware.screen.availableHeightプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.screen.availableHeight"
operator="equal"
value"480" />
</constraints>
...
</feature>

15.2.6 アプリケーション機能およびコンテンツに関する動的制約の作成

name、operatorおよびvalue属性で定義された静的制約に基づいてアプリケーション機能またはユーザー・インタフェースの表示と非表示を設定する以外にも、EL式を使用して制約を定義することにより、アプリケーション機能およびコンテンツを動的にレンダリングできるようにモバイル・アプリケーションを設定できます。EL式に基づいて制約を動的に評価すると、独自のBeanロジックをコールできる式を記述したり、複雑なEL式を記述したり、アプリケーション・プリファレンスにアクセスするロジックを記述することもできます。制約をEL式として定義することで柔軟性が向上し、MAFランタイムで、EL式がfalseとして評価された場合は最初にアプリケーション機能を非表示にするが、後で同じEL式がtrueとして評価されたときには表示するようにできます。例15-19の遅延メソッド式に示しているように、<adfmf:constraintExpression>要素を使用すると、EL式を使用してアプリケーション機能に対する制約を定義できます。

例15-19 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>

例15-19でも示されているように、maf-feature.xmlファイルの<adfmf:constraints要素内で定義された静的制約間でこの要素をネストできます。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

15.2.6.1 静的制約とEL定義制約の結合について

MAFランタイムによる表示を有効にするには、静的制約のすべての条件がtrueに評価される必要があります。制約EL式がtrueとして評価された場合はアプリケーション機能およびコンテンツが表示され、式がfalseとして評価された場合はそれらが非表示になります。

15.2.6.2 動的コンテンツの定義方法

静的制約とは異なり、動的制約の作成(または更新)を行う場合は、maf-feature.xml概要エディタを使用しません。かわりに、制約式コンポーネントをソース・エディタまたは「構造」ウィンドウにドラッグし、式ビルダーを使用してこのコンポーネントにEL式を移入することにより、<adfmf:constraintExpression>を作成します。

制約式コンポーネントを定義するには:

1. maf-feature.xmlファイルのソース・エディタを選択します。

2. <adfmf-constraints>要素に移動します。

3. 「コンポーネント」ウィンドウで、「共通」コンポーネントを選択します(図15-4を参照)。

図15-4 制約式コンポーネント

4. 制約式コンポーネントを選択し、次のいずれかの方法を使用して<adfmf-constraints>要素に追加します。

- 「コンポーネント」ウィンドウで、制約式コンポーネントをダブルクリックします。

- 制約式コンポーネントをソース・エディタの<adfmf-constraints>要素にドラッグします。

- 制約式コンポーネントを「構造」ウィンドウの「制約」ノードにドラッグします。

5. 図15-5に示すように、「constraintExpressionの挿入」ダイアログでEL式を入力するか、式ビルダー(このダイアログ内の「プロパティ・メニュー」アイコン(ギア)をクリックしてアクセス)を使用してEL式を作成します。

図15-5 InsertconstraintExpessionダイアログを使用したEL制約の定義

例15-19は、「ADFマネージドBean」カテゴリからのEL式の作成を示しています。ただし、制約のEL式は、第7.3.5項「式ビルダーのカテゴリについて」で説明されているカテゴリのいずれからでも作成できます。

注意:

adfc-mobile-config.xmlに定義されているアプリケーション・スコープのマネージドBeanのみが制約のEL式に使用できます。

図15-6 制約のEL式の作成

6. 「OK」をクリックします。

16 Oracle Cloud上のデータへのアクセス

この章では、Oracle Java Cloud Serviceでホストされるデータへのモバイル・アプリケーションによるアクセス方法について説明します。

この章には次の項が含まれます:

- 第16.1項「Oracle Cloudでホストされるデータへのモバイル・アプリケーションによるアクセスの有効化」

16.1 Oracle Cloudでホストされるデータへのモバイル・アプリケーションによるアクセスの有効化

モバイル・アプリケーションでは、Oracle CloudでホストされるSOAPおよびRESTの両方のWebサービスにアクセスできます。ホストされるSOAP Webサービスへのアクセスを有効にするには、第8.2項「Webサービス・データ・コントロールの作成」の説明に従ってWebサービス・データ・コントロールを作成します。Webサービス・データ・コントロールを作成することにより、RESTful Webサービスへのアクセスを有効にできます。モバイル・アプリケーションがクラウド・データにアクセスできる方法はコンテンツ・タイプによって異なり、第5.3.2項「MAF AMXページへのUIコンポーネントおよびデータ・コントロールの追加方法」の説明に従ってデータ・コントロールをMAF AMXユーザー・インタフェース・コンポーネントにドラッグ・アンド・ドロップする方法、コンテンツがリモートWebサーバーまたはローカルに格納されたHTMLファイルのいずれかから配信されるアプリケーションの場合はプログラムを使用する方法、またはローカルに格納されたHTMLファイルからアクセスする方法があります。

16.1.1 Oracle Cloudの認証方法

「MAFログイン・サーバー接続」ダイアログを使用して、Oracle Cloudに対して認証するためのログイン・サーバー接続を作成します。

始める前に

ログイン・サーバー接続に使用するOracle Cloud URLを取得します。

Oracle Cloudのエンド・ポイントを使用してログインURLを作成するには:

1. 「アプリケーション」→「新規」→「接続」の順に選択します。

2. MAFサーバー・ログイン接続を選択します。

3. 次の項目を入力して、図16-1に示すMAFログイン接続の接続ダイアログの入力を完了します。

- 「名前」フィールド: 接続名

- 「ログインURL」フィールド: Oracle CloudのURL

詳細は、Oracle JDeveloperオンライン・ヘルプおよび第21.5.2項「ログイン・ページの指定方法」を参照してください。

図16-1 Oracle Cloudへのログインの作成

16.1.2 Oracle Java CloudにアクセスするためのWebサービス・データ・コントロールの作成方法

データ・サービス・コントロールの作成ウィザードでは、ホストされたデータにアクセスするデータ・コントロールを作成できます。Oracle Java CloudにデプロイされたSOAP WebサービスのWSDL URLを使用してこのデータ・コントロールを作成します。このURLがわからない場合は、アプリケーションのコンテキスト・ルートにWebサービスのポート名および?wsdlを追加して、WSDLドキュメントへのURLを作成する必要があります。

始める前に

Oracle Java Cloud ServiceにデプロイされているSOAP Webサービス・アプリケーションへのアクセス権を持つ必要があります。このアプリケーションは、Oracle Java Cloud Service Controlホームページにある「アプリケーション」ペインを経由して利用可能にする必要があります。さらに、図16-2のHCMMobileServiceアプリケーションで示されるように、その「ステータス」および「状態」それぞれが「↑」および「アクティブ」である必要があります。

図16-2 Java Cloud Services Controlホームページ

Webサービス・データ・コントロールを作成するには:

1. Oracle Cloud上でホストされたWebサービスのアプリケーション・コンテキスト・ルートを次のように取得します。

1. 「アプリケーション」ペイン(図16-2を参照)のアプリケーションをクリックして、図16-3に示すアプリケーション・ホームページに移動します。

2. 図16-3に示すように、URLをコピーします。このURLは、WSDLドキュメントのアプリケーション・コンテキスト・ルートになります。

図16-3 Webサービスのアプリケーション・コンテキスト・ルートのコピー

2. 第8.2項「Webサービス・データ・コントロールの作成」の説明に従って、JDeveloperで、「アプリケーション・ナビゲータ」のビュー・コントローラ・プロジェクトを右クリックして、Webサービス・データ・コントロールの作成ウィザードを開きます。

3. 図16-4に示す「データソース」ページで、データ・コントロールの名前を入力します。

図16-4 WSDLドキュメントのURLの入力

4. 「URL」フィールドで、Oracle Cloud Java Serviceにデプロイされている(さらに現在実行されている)SOAPベースのWebサービスのURLを貼り付けます。

5. 図16-4のHCMServicePort?wsdlなど、アプリケーション・コンテキスト・ルートにWebサービスのポート名と?wsdlを追加することで、データ・コントロールによるWSDLへのアクセスを可能にします。

6. 図16-5に示す「データ・コントロール操作」ページで、アプリケーション機能がデータの取得に使用できるWebサービス操作を選択します。「終了」をクリックします。

図16-5 Webサービス操作の選択

図16-5に、MAFデザインタイムにより戻される、モバイル・アプリケーションで使用可能なWebサービス操作を示します。この例で、デザインタイムは、人事管理データをホストするWebサービスに問合せを行い、経費の承認を含む従業員データを取得するための操作を戻します。

16.1.2.1 SOAPベースのWebサービスにおけるポリシーの構成

Oracle Cloud上で保護されるSOAPベースのWebサービスに対してポリシーを構成する必要があります。第8.5項「セキュアなWebサービスへのアクセス」の説明に従い、データ・サービス・コントロール・ポリシーの編集ダイアログを使用して、oracle/wss_http_token_over_ssl_client_policyを選択できます。この(および他の)ポリシーの詳細は、Oracle Fusion Middleware Oracle Web Services Managerを使用したWebサービスの保護とポリシーの管理の「使用する優先ポリシーの決定」および「事前定義済ポリシー」の各章を参照してください。

注意:

SOAPベースのWebサービスには、oracle/wss_http_token_over_ssl_client_policyのみがサポートされます。RESTful Webサービスについては、MAFでは基本認証とSSLポリシーの両方がサポートされています。

16.1.3 Oracle Java Cloud Serviceにアクセスするモバイル・アプリケーションのデプロイ時に行われる処理

アプリケーションをデプロイすると、Webサービス・データ・コントロールの操作によって、Oracle Java Cloud Serviceインスタンス上で実行されるWebサービスからデータが取得されます。

17 プッシュ通知の有効化

この章では、モバイル・アプリケーションにおけるプッシュ通知メッセージの登録、およびそれらの処理方法を説明します。

この章の内容は次のとおりです。

- 第17.1項「プッシュ通知の概要」

- 第17.2項「モバイル・アプリケーションに対するプッシュ通知の有効化」

- 第17.3項「プッシュ通知ペイロードについて」

17.1 プッシュ通知の概要

プッシュ通知は、サーバーなどの外部ソースからモバイル・デバイス上のアプリケーションに送信される通知です。これらは、アプリケーションの状態とユーザー設定に応じて、アラート・メッセージやバナーとして表示されます。図17-1は、iOSデバイスにおけるプッシュ通知アラートを示しています。

図17-1 プッシュ通知

通知を受信したエンド・ユーザーは、アプリケーションを起動するか、その通知を無視できます。この場合、アプリケーションはアクティブ化されません。通知のアラート・メッセージとともに、短く特徴的な音が鳴る場合もあります。

17.1.1 プッシュ通知の動作

プッシュ通知を受信するには、アプリケーションを通知サービスに登録する必要があります。登録が成功すると、通知サービスからアプリケーションにトークンが発行されます。アプリケーションでは、このトークンを(リモート・サーバー上の)プロバイダと共有します。これにより、プロバイダから、通知サービスを通じてアプリケーションに通知を送信できるようになります。MAFでは、アプリケーションによって提供された登録構成を使用して、そのアプリケーションのかわりに登録を行います(第17.2項「モバイル・アプリケーションに対するプッシュ通知の有効化」を参照)。登録は、モバイル・アプリケーションが起動するたびに、トークンの有効性を保証する目的で行われます。登録が成功すると、MAFでは、プラットフォーム固有の通知サービスから取得したトークンをプロバイダと共有します。iOSの場合、この通知サービスはApple Push Notification Service (APNs)です。Google Cloud Messaging (GCM) for Androidでは、Androidデバイスにインストールされたアプリケーション用の通知サービスが提供されます。

17.1.2 アプリケーションの状態に応じたモバイル・アプリケーションによる通知の表示

モバイル・アプリケーションでは、その状態にかかわらずプッシュ通知を受信できます。これらのメッセージは、アプリケーションがフォアグラウンドで実行されていなくても表示される場合があり、その表示形式はモバイル・アプリケーションの状態とユーザー設定によって異なります。表17-1では、iOSオペレーティング・システムで、モバイル・アプリケーションの状態に応じて、どのようにプッシュ通知が処理されるかを説明します。

表17-1 iOSデバイスにおけるプッシュ通知の処理

状態

アクション

モバイル・アプリケーションはインストールされているが、実行されていない。

通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、モバイル・アプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。

モバイル・アプリケーションがバックグラウンドで実行されている。

通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、モバイル・アプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。

モバイル・アプリケーションがフォアグラウンドで実行されている。

通知メッセージは表示されません。アプリケーション通知ハンドラが呼び出されます。

iOSおよびAndroidプラットフォームでは、アプリケーションがフォアグラウンドで実行されていない場合、そのアプリケーションに関連付けられているすべてのプッシュ通知メッセージが、iOS Notification CenterやAndroidデバイス上の通知ドロワーなど、特定の場所に格納されます。

17.2 モバイル・アプリケーションに対するプッシュ通知の有効化

次のタスクを実行することで、プッシュ通知を有効にできます。

1. 図17-2に示すとおりに、maf-application.xml概要エディタの「デバイス・アクセス」ページで「プッシュ通知」を選択し、モバイル・アプリケーションでプッシュ通知を受信できるようにします。詳細は、第21.6.1項「デバイス機能へのアクセスの有効化方法」を参照してください。

注意:

デフォルトでは、モバイル・アプリケーションではプッシュ通知は許可されません(その他のデバイス・アクセスのデバイス・タイプも同様)。

図17-2 プッシュ通知の許可

2. アプリケーション・コントローラ・プロジェクトで、アプリケーション・ライフサイクル・イベント・リスナー(ALCL)・クラスを登録します。詳細は、第4.3項「モバイル・アプリケーションの基本情報の設定」および第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」を参照してください。

3. ALCLにoracle.adfmf.application.PushNotificationConfigインタフェースを実装します。このインタフェースにより、プッシュ通知サービスに正常に登録するために必要な構成が提供されます。
PushNotificationConfigインタフェースのgetNotificationStyleおよびgetSourceAuthorizationIdメソッドをオーバーライドおよび実装します。getNotificationStyleメソッドにより、アプリケーションを登録する通知スタイルを指定できます。getSourceAuthorizationIdメソッドを使用すると、モバイル・アプリケーションへのメッセージの送信を許可されたアカウントのGoogleプロジェクト番号を入力できます。詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

4. アプリケーション・コントローラ・プロジェクトで、プッシュ通知イベントを処理するプッシュ通知イベント・リスナー・クラス(NativePushNotificationListenerなど)を作成します。このクラスには、イベント・リスナーを定義するoracle.adfmf.framework.event.EventListenerインタフェースを実装する必要があります。oracle.adfmf.framework.event.EventListenerインタフェースの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。
通知イベントに登録して通知イベントを受信するには、onOpen、onMessageおよびonErrorメソッドをオーバーライドおよび実装します。プッシュ通知サービスへの登録が成功すると、MAFでは、アプリケーション開発者がプロバイダと共有する必要がある登録トークンを使用して、onOpenメソッドをコールします。通知サービスへの登録時にエラーが発生した場合は、プッシュ通知サービスにより戻されるAdfExceptionとしてカプセル化されたエラーを使用して、onErrorメソッドが呼び出されます。

MAFでは、アプリケーションが通知を受信するたびに、通知ペイロードを使用してonMessage(Event e)メソッドをコールします。Eventオブジェクトを使用すると、通知ペイロードおよびアプリケーションの状態に関する有用な情報を取得できます。通知ペイロードを取得するには、Event.getPayloadメソッドを使用します。通知時のアプリケーションの状態を取得するには、Event.getApplicationStateメソッドを使用します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスのEventクラスに関する項を参照してください。

5. ALCLクラスのstartメソッド内にある、ネイティブ・プッシュ通知イベントのソースを表すEventSourceオブジェクトを取得します。

EventSource evtSource =
EventSourceFactory.getEventSource(EventSourceFactory.NATIVE_PUSH_NOTIFICATION_
REMOTE_EVENT
_SOURCE_NAME);

6. プッシュ通知イベント・リスナー・クラスのオブジェクトを作成し、イベント・ソースに追加します。

evtSource.addListener(new NativePushNotificationListener());

17.3 プッシュ通知ペイロードについて

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ドキュメントから入手できます。

18 MAFアプリケーションでのエラー処理

この章では、AdfExceptionクラスを使用してエラーを処理する方法とエラー・メッセージをローカライズする方法について説明します。

この章の内容は次のとおりです。

- 第18.1項「MAFのエラー処理について」

- 第18.3項「エラー・メッセージのローカライズ」

- 第18.2項「エラー・メッセージの表示およびバックグラウンド・スレッドの停止」

18.1 MAFのエラー処理について

モバイル・アプリケーションから発生するエラーは、リモート・サーバーへの接続の失敗のように予期しないものである場合と、アプリケーション・ビジネス・ルールの違反のように予期されるものである場合があります。エラーまたは例外は、プライマリ・リクエスト・スレッド内またはバックグラウンド・タスクで実行されるセカンダリ・スレッド内で発生する可能性があります。アプリケーションで複数言語がサポートされている場合、エラー・メッセージはユーザーの言語で表示される必要があります。

モバイル・アプリケーションから例外をスローできるようにするには、oracle.adfmf.framework.exception.AdfExceptionクラスを使用します。詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

次のコードにより、MAFで例外を正常に処理できるようになります。図18-1に示すようなポップアップ・メッセージがアプリケーション内に表示され、メッセージの重大度と説明テキストが示されます。

throw new AdfException("My error message",AdfException.ERROR);

図18-1 エラー・メッセージ

注意:

マネージドBeanまたはデータ・コントロールBean内で例外がスローされると、アプリケーション内に類似のエラー・メッセージが表示されます。

18.2 エラー・メッセージの表示およびバックグラウンド・スレッドの停止

例18-1に示すMessageUtilsクラスを使用すると、アプリケーションで、まずJavaScriptコール(invokeContainerJavaScriptFunction)を呼び出してから例外をスローすることで、スレッドを停止してエラーを表示できるようになります。addMessageメソッドは、エラーを表示できるようにします。詳細は、第18.2.1項「アプリケーションによるバックグラウンド・スレッド例外のエラー・メッセージの表示方法」を参照してください。また、第B.2.14項「invokeContainerJavaScriptFunction」も参照してください。

MessageUtilsクラスはBundleFactoryおよびUtilityメソッドを使用してリソース・バンドルおよびエラー・メッセージを取得し、バックグラウンドでスレッドが実行されているかどうかを動的にチェックします。このクラスを使用すると、メイン・スレッドからバックグラウンド・スレッドにコードを移動できます。

例18-1 MessageUtilsクラス

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)) {
// we still need to throw execption to stop background thread processing
throw new AdfException(message,severity);
}
}
else {
throw new AdfException(message,severity);
}
}

public static void addJavaScriptMessage(String severity, String message) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.
getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {severity,
message,
null,
null });
}

}

18.2.1 アプリケーションによるバックグラウンド・スレッド例外のエラー・メッセージの表示方法

アプリケーションは、バックグラウンド・スレッドに対して例外がスローされたときにエラー・メッセージを表示しません。このような状況でエラー・メッセージを表示できるようにするために、アプリケーションはaddMessageメソッドをコールします。addMessageメソッドは次のパラメータを取ります。

- エラーの重大度

- サマリー・メッセージ

- 詳細メッセージ

- clientComponentId

例18-2は、addMessageメソッドを使用して、バックグラウンドでエラーが発生したときにアプリケーションがユーザーにアラートを出せるようにする方法を示しています。

例18-2 バックグラウンド・スレッドのエラー・メッセージの表示の許可

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をスローするときに使用されるメソッドと同じであるため、エラー・メッセージがメイン・スレッドの例外またはバックグラウンド・スレッドからの例外のいずれを参照しているかにかかわらず、ユーザーは同じポップアップ・エラー・メッセージを受け取ります。

注意:

例18-2に示すとおり、詳細メッセージおよびclientComponentIdはNull値にすることができます。詳細メッセージは、サマリー・メッセージと同じフォント・サイズで、新しい行に表示されます。

ただし、例18-3に示されているように、バックグラウンド・スレッドで実行されるJavaロジック内にコードを配置すると、エラー・メッセージを表示しないようにできます。例18-4に示すメソッドを使用すると、ユーザーに通知せずにバックグラウンド・スレッドをサイレントに停止できます。

例18-3 エラー・メッセージの表示の防止

Runnable runnable = new Runnable()
{
public void run()
{
// this exception will be lost because no popup error message will display in the mobile application
throw new AdfException("My (lost) error message in background",AdfException.ERROR);
}
};
Thread thread = new Thread(runnable);
thread.start();

18.3 エラー・メッセージのローカライズ

MAFは標準Javaリソース・バンドルを使用して、アプリケーション・ユーザーの言語で例外エラー・メッセージを表示します。例18-4に示すとおり、リソース・バンドル名(.xlfファイル)およびバンドル・メッセージ・キーがAdfExceptionコンストラクタ・メソッドに渡され、リソース・バンドルからエラー・メッセージを読み取ることができるようになります。

例18-4 リソース・バンドル名およびメッセージ・キーの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メソッドを使用してエラー・メッセージを取得します(例18-5を参照)。

例18-5 BundleFactoryおよびUtilityメソッドを使用したリソース・バンドルおよびエラー・メッセージの取得

ResourceBundle bundle = BundleFactory.getBundle(XLF_BUNDLE_NAME);
String message = Utility.getResourceString(bundle, "MY_ERROR_MESSAGE",null);
throw new AdfException(message,AdfException.ERROR);

例18-6は、adf.mf.api.amx.addMessage JavaScript関数を使用して、バックグラウンド・スレッドから例外がスローされたときにローカライズされたエラー・メッセージを表示する方法を示しています。

例18-6 バックグラウンド例外のローカライズ済エラー・メソッドの表示

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 });

第VI部

モバイル・アプリケーションの完成

ここでは、モバイル・アプリケーションのセキュリティを有効にする方法とアプリケーションのデプロイおよびデバッグ方法について説明します。

第VI部に含まれる章は、次のとおりです。

- 第19章「モバイル・アプリケーションのデプロイ」

- 第20章「セキュアなモバイル開発方法の理解」

- 第21章「モバイル・アプリケーションの保護」

- 第22章「MAFアプリケーションのテストおよびデバッグ」

19 モバイル・アプリケーションのデプロイ

この章では、テストと公開のためのモバイル・アプリケーションのデプロイ方法について説明します。

この章の内容は次のとおりです。

- 第19.1項「モバイル・アプリケーションのデプロイメントの概要」

- 第19.2項「デプロイメント・プロファイルでの作業」

- 第19.3項「Androidアプリケーションのデプロイ」

- 第19.4項「iOSアプリケーションのデプロイ」

- 第19.5項「機能アーカイブ・ファイル(FAR)のデプロイ」

- 第19.6項「モバイル・アプリケーション・アーカイブ・ファイルの作成」

- 第19.7項「署名されていないデプロイメント・パッケージの作成」

- 第19.8項「コマンド行からのモバイル・アプリケーションのデプロイ」

19.1 モバイル・アプリケーションのデプロイメントの概要

エンド・ユーザーに配布するためにアプリケーションを公開する前に、シミュレータまたは実際のデバイスでこれをテストして、その動作と使いやすさを評価する必要があります。MAFでは、iOSアプリケーション・バンドル(.ipaまたは.appファイル)またはAndroidアプリケーション・パッケージ(.apk)・ファイルをプラットフォームに適したデバイスまたはシミュレータにデプロイすることで、App Store (Apple iTunes)またはアプリケーション・マーケットプレイス(Google Playなど)に公開する前にアプリケーションをテストできます。

19.1.1 MAFデプロイメント・オプション

MAFでは、プロジェクトをデプロイする場合、プラットフォーム固有のテンプレート・アプリケーションを一時的な場所にコピーした後、MAFプロジェクト内で定義されたコード、リソースおよび構成を使用して、そのアプリケーションを更新します。その後、MAFでは、ターゲット・プラットフォームのツールを使用して、アプリケーションをビルドおよびデプロイします。ダウンロード・サイトまたはアプリケーション・マーケットプレイス(Apple App StoreやGoogle Playなど)から入手可能なプラットフォーム固有のパッケージ(.ipa、Androidの場合は.h)として、モバイル・アプリケーションをデプロイできます。テストおよびデバッグの目的で、シミュレータまたはデバイスにデプロイできます。ビュー・コントローラ・プロジェクトを機能アーカイブ(FAR)としてデプロイすることで、アプリケーション機能を再利用できます。また、モバイル・アプリケーション・アーカイブ(.maa)ファイルとしてデプロイすることで、モバイル・アプリケーション全体を再利用することもできます。

19.1.1.1 プロジェクト・ライブラリのデプロイメント

「ライブラリとクラスパス」ダイアログ(図19-1を参照)を使用してプロジェクトに宣言するライブラリは、そのプロジェクトのデプロイメント・アーティファクトに含まれます。このダイアログにより、アプリケーション機能は実行時にこれらのライブラリにアクセスすることが可能になります。

図19-1 プロジェクトへのライブラリの追加

19.1.1.2 JVM 1.4ライブラリのデプロイメント

AndroidアプリケーションとiOSアプリケーションのどちらの場合も、それぞれのMAFのデプロイメントには、デプロイメントのタイプ(リリースまたはデバッグ)とデプロイメント・ターゲット(シミュレータまたは実際のデバイス)の組合せに固有の異なるライブラリのセットが含まれます。さらに、それぞれのライブラリ・セットには、JVM 1.4のJARファイルが含まれます。アプリケーションのバインディング・レイヤーは、Objective-Cライブラリのコレクションであるこの仮想マシン内にあります。たとえば、MAFは、iOSシミュレータをターゲットとするデバッグ・デプロイメントに対して、JVM 1.4 JARファイルと一連のライブラリをデプロイしますが、実際のiOSデバイスをターゲットとするデバッグ・デプロイメントに対しては、異なるJVM 1.4 JARファイルと一連のライブラリをデプロイします。

19.2 デプロイメント・プロファイルでの作業

デプロイメントのためにモバイル・アプリケーションを準備する際は、最初に、プラットフォーム固有のデプロイメント・プロファイルを作成します。デプロイメント・プロファイルでは、iOSデバイス、Androidデバイス、iOSシミュレータまたはAndroidエミュレータにデプロイするアプリケーションをアーカイブにパッケージ化する方法を定義します。デプロイメント・プロファイルは次を行います。

- アーカイブの形式と内容を指定します。iOSのアーカイブ形式は、アプリケーション・バンドルとして知られている.ipaファイルになります。Androidのアーカイブ形式は、Androidアプリケーション・パッケージ(.apk)・ファイルになります。

注意:

.apkファイルはアーカイブ互換です。つまり、WinZipまたは7-Zipのようなアーカイブ・ツールを使用して、その内容を表示できます。

- アーカイブ・ファイルへのパッケージ対象となるソース・ファイル、デプロイメント・ディスクリプタおよびその他の補助ファイルをリストします。

- 作成されるアーカイブ・ファイルのタイプおよび名前を記述します。

- 依存情報、プラットフォーム固有の指示およびその他の情報を示します。

19.2.1 デプロイメント・プロファイルの作成方法

第3.2.2.3項「自動的に生成されたデプロイメント・プロファイルについて」に記載されているとおり、MAFでは、モバイル・アプリケーションが作成されたときに、デプロイメント・プロファイルのセットを作成します。これらのプロファイルを使用してアプリケーションをデプロイしたり、それらのプロファイルを編集したり、MAF固有のデプロイメント・プロファイル・ページを使用して新しいプロファイルを構成できます。「デプロイメント・プロファイルの作成」ウィザード(図19-2を参照)を使用して、それらのページからデフォルトのデプロイメント・プロファイルを作成できます。デプロイメント・プロファイルは、必要な数だけ作成できます。これらの標準デプロイメント・プロファイル・ページの詳細は、「ヘルプ」をクリックしてJDeveloperオンライン・ヘルプを参照してください。

注意:

MAFアプリケーションのデプロイメントでは、アプリケーションレベルのデプロイメント・プロファイルの作成のみが必要とされるので、ビュー・コントローラレベルのデプロイメント・プロファイルを作成する必要はありません。

始める前に

JDeveloperでモバイル・アプリケーションをデプロイできるようにするには、第2.3.1項「プラットフォームとフォーム・ファクタに応じた開発環境の構成方法」で説明されているように、MAFプリファレンスのページを使用してターゲット・プラットフォームのSDKを指定する必要があります。

ヒント:

iOSデプロイメントの場合は、iTunesおよびiOSシミュレータを1回以上実行してから、それらのディレクトリの場所をMAFプラットフォームのプリファレンス・ページで構成します。

デプロイメント・プロファイルを作成する手順は、次のとおりです。

1. 「アプリケーション」→「デプロイ」を選択します。

2. 「新規デプロイメント・プロファイル」を選択します。

3. ターゲット・プラットフォームに応じて、「Android用MAF」、「iOS用MAF」または「MAFアプリケーション・アーカイブ」を選択します(図19-2を参照)。

4. プロファイルのデフォルト名をそのまま使用するか、新しい名前を入力します。「OK」をクリックします。

5. 必要な場合は、「オプション」ページと「アプリケーション・イメージ」ページを適宜使用して、「OK」をクリックします。

図19-2 「デプロイメント・プロファイルの作成」ウィザード

19.2.2 デプロイメント・プロファイルの作成時の処理

ウィザードが完了すると、JDeveloperによってデプロイメント・プロファイルが作成され、デプロイメント・プロファイルのプロパティ・エディタが開きます。

表19-1に、デプロイメント・プロファイルのプロパティ・エディタのMAFに固有のページ(図19-5を参照)をリストします。

表19-1 MAF固有のデプロイメント・プロファイル・ページ

ページ

機能

iOSオプション

iOSデバイスまたはiOSシミュレータにデプロイされるアプリケーションの設定を変更できます。

Androidオプション

AndroidデバイスまたはAndroidエミュレータにデプロイされるアプリケーションの設定を変更できます。

アプリケーション・イメージ

適切なグラフィックス・ファイルを追加することで、アプリケーションにカスタム・アイコンを割り当てられます。

デバイスの向き

アプリケーションの表示をデバイスの特定の向きに制限できます。このページはiOSデプロイメント・プロファイルのみに使用されます。

注意:

デプロイメントはアプリケーションのニーズによって異なります。表19-1にリストされたページにシードされたデフォルト値を使用してアプリケーションをデプロイできます。

アプリケーションをデプロイすると、JDeveloperによってデプロイメント・ディレクトリと関連するサブディレクトリが作成されます。さらに、ビュー・コントローラ・プロジェクト(異なる名前が付いている必要があります)とアプリケーション・コントローラ・プロジェクトの両方の機能アーカイブ・ファイル(FAR)が作成されます。これら2つのFARに加え、プロジェクトにインポートされたすべてのFARのコピーがJDeveloperによって作成されます。コンパイル・プロファイルを変更する際は、デプロイメント・ディレクトリを削除する必要があります。「ビルド」→「すべてクリーン」を選択することで、このディレクトリに加え、FARを含むビュー・コントローラ・プロジェクト内のデプロイメント・ディレクトリを削除できます。

19.2.3 Androidデプロイメント・プロファイルの作成方法

デプロイメント・プロファイルによって、Androidデバイスまたはエミュレータへのアプリケーション・デプロイメントのためのテンプレートまたはAndroidアプリケーション・パッケージ(.apk)・ファイルとしてアプリケーションを作成するためのテンプレートが作成されます。

Androidのデプロイメント・プロファイルを作成するには、アプリケーションの署名オプションとjavacコンパイラの動作を定義し、必要な場合はアプリケーション・アイコンに使用されるデフォルトOracleイメージをカスタム・イメージでオーバーライドします。

始める前に

第2.5項「Androidプラットフォーム用の開発ツールの設定」の説明に従って、Android SDKをインストールおよびダウンロードします。

デプロイメント・フレームワークで、プッシュ通知に必要なファイルをコンパイルできるようにするには、Android SDK Managerで、Google Cloud Messaging Library用のパッケージ(リビジョン3以降)およびAndroidサポート・ライブラリをインストールします(図19-3を参照)。

注意:

Google Cloud Messagingは非推奨になりましたが、プッシュ通知を有効にするにはインストールする必要があります。それが「その他」の下に表示されるようにするには、図19-3に示すように、「表示」→「廃止」を選択します。

図19-3 Google Cloud Messaging For Android Libraryパッケージ

Androidエミュレータにデプロイする場合は、Android開発者のWebサイト(http://developer.android.com/tools/devices/index.html)で入手可能な「Managing Virtual Devices」の説明に従い、Android Virtual Device Managerを使用して各エミュレータ・インスタンスの仮想デバイスを作成する必要があります。

また、AndroidプラットフォームSDKのMAFのプリファレンス(「ツール」→「プリファレンス」→「MAF」→「プラットフォーム」→「Android」を選択してアクセス)を、Android SDKパッケージのダウンロードの一部であるSDKとプラットフォームの場所に設定する必要があります。図19-4には、これらの場所が示されています。

Android 4.4.2 (API 19) SDKおよびプラットフォームの場所は、以前のバージョンと異なります(図19-4を参照)。

- Android SDKのパスは次のとおりです。

<SDK Installation>\adt-bundle-windows-x86\sdk

たとえば、次のように入力します。

C:\adt-bundle-windows-x86\sdk

- Androidプラットフォームのパスは次のとおりです。

<SDK Installation>\adt-bundle-windows-x86\sdk\platforms\android-19

たとえば、次のように入力します。

C:\adt-bundle-windows-x86\sdk\platforms\android-19

注意:

リビジョン22のリリースではSDKツールの構造が変更され、ビルド・ツールのコンポーネントがplatform-toolsディレクトリからbuild-toolsディレクトリに再配置されています。デプロイメントを有効にするには、「Androidビルド・ツール・ロケーション」フィールドがビルド・ツールの場所、aaptファイル(Windowsシステム上のappt.exe)を参照している必要があります。このファイルの場所は、SDKのリビジョンによって異なります。リビジョン22の場合、このファイルはbuild-toolsディレクトリ内に存在します(SDK Installation\adt-bundle-windows-x86\sdk\build-tools\Android-4.nなど)。それ以前のリビジョンの場合、platform-toolsディレクトリ内に存在します(SDK Installation\adt-bundle-windows-x86\platfrom-toolsなど)。

MAFは、Android SDKにapptファイルの場所を問い合せて、「Androidビルド・ツール・ロケーション」フィールドに適宜値を入力します。SDKのリビジョン22の場合、MAFは開発コンピュータにインストールされている最新バージョンのbuild-toolsディレクトリをこのフィールドに入力します。リビジョン22以前の場合、MAFはplatform-toolsディレクトリの場所をこのフィールドに入力します。この場合、フィールドは読取り専用です。

注意:

プッシュ通知には、Android 2.2プラットフォーム(またはそれ以降)を実行しているデバイスとエミュレータが必要です。これらのデバイスには、Google Playストアがインストールされている必要があります。エミュレータ上でプッシュ通知を有効にするには、Google APIがSDKにインストールされている必要があります。ユーザーは、4.0.3 (API 15)以前のプラットフォームを実行しているデバイス上で、Googleアカウントを作成(およびログイン)する必要があります。

Android開発者のWebサイト(http://developer.android.com/index.html)で入手可能な『Google Cloud Messaging for Android』の「GCM Architectural Overview」の章、および第19.2.3項「Androidデプロイメント・プロファイルの作成方法」も参照してください。

図19-4 Android SDK、プラットフォームおよび署名プロパティの設定

「プラットフォーム」ページを使用して、Androidアプリケーションの署名に使用されるキーのデバッグとリリースのプロパティも定義します。続いて、デプロイメント・プロファイル内で、モバイル・アプリケーションのリリース・タイプをデバッグまたはリリースに指定します。署名キー・プロパティは一度定義するのみでかまいません。詳細は、第19.2.3.3項「Android署名オプションの定義」を参照してください。また、Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で入手可能な「Signing Your Applications」で、アプリケーションの公開に関する情報も参照してください。

注意:

Androidエミュレータにアプリケーションをデプロイするには、API 14以降(Platform 4.0.n)をインストールする必要があります。

19.2.3.1 アプリケーションの詳細オプションの設定

「Androidオプション」ページ(図19-5を参照)では、次を行うことができます。

- アプリケーションのバージョンを示します。詳細は、Android開発者のWebサイト(http://developer.android.com/tools/publishing/versioning.html)で入手可能な「Versioning Your Applications」を参照してください。

- .apkファイルのパッケージングを最適化するアーカイブ位置合せツールであるAndroid zipalignツールを構成します。データ・マニフェストなど、各アプリケーション・パッケージに格納されるデータ・ファイルは、Androidオペレーティング環境内の複数プロセスによって絶えずアクセスされます。詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/zipalign.html)で入手可能な「zipalign」を参照してください。

- ロギング・レベル出力を非詳細またはデバッグ(詳細)に設定します。

- デプロイメント・ターゲットに適した署名オプションを設定します(エミュレータまたはデバイス)。詳細は、第19.2.3.3項「Android署名オプションの定義」を参照してください。

図19-5 デプロイメント・プロファイルのプロパティ・エディタ(「Androidオプション」ページ)

アプリケーション・オプションを設定するには:

1. 「Androidオプション」(図19-5を参照)を選択します。

2. デフォルト値をそのまま使用するか、次のオプションを定義します。

- アプリケーション・バンドルID: maf-application.xmlファイルのid属性で設定されるアプリケーションの一意のID。Androidデバイスにデプロイされる各アプリケーションには、一意のIDがあります。このIDを数字から始めることはできません。詳細は、第4.3項「モバイル・アプリケーションの基本情報の設定」を参照してください。
必要な場合は、デプロイメント・ファイルでこの値をオーバーライドできます。ただし、アプリケーションをデプロイするには、この名前がAndroidマニフェスト・ファイルの<manifest>要素に含まれるpackage属性に従っている必要があります。この要素については、Android開発者のWebサイト(http://developer.android.com/guide/topics/manifest/manifest-intro.html)で入手可能な「The AndroidManifest.xml File」を参照してください。具体的には、IDには、インターネット・ドメイン(com.company.application)のリバースパッケージ書式を使用します。ネーミングの競合を避けるために、パッケージ名にはドメインの所有者が反映されます(例: com.oracle.application)。

注意:

アプリケーション・バンドルIDに空白を含めることはできません。

- アプリケーション・アーカイブ名: 必要に応じて、MAFによって作成された.apkファイルの名前を入力します。または、デフォルトの名前を使用します。
MAFのデフォルトでは、.apkファイルの名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第4.3項「モバイル・アプリケーションの基本情報の設定」を参照してください。

- バージョン名: ユーザーに表示されるアプリケーション・コードのリリース・バージョン。第4.3項「モバイル・アプリケーションの基本情報の設定」も参照してください。

- バージョン・コード: アプリケーション・コードのバージョンを表す整数値。これは、他のアプリケーションによってプログラムで、アップグレードかダウングレードかチェックされます。デフォルトは1で、これが最小の値です。任意の値を選択し、リリースごとに1つずつ値を増やすことができます。

19.2.3.2 デプロイメント・オプションの設定

「オプション」ページでは、javacコンパイラ・ツール・オプションによって渡される値、zipalignオプションおよびAndroid APIリビジョンを設定できます。

R.javaファイルと.classファイルのJDK互換性レベルを設定するには:

1. 「ソース・ファイル」ドロップダウン・リストからJDK互換性レベルを選択します。デフォルト値は1.5です。この値は、デプロイメントでjavacツールを実行し、javac -sourceオプションを使用してR.java (アプリケーション・リソースの参照用にAndroidによって生成されたファイル)をコンパイルする際に指定されます。使用可能な値は次のとおりです。

- 1.5

- 1.6

R.javaの詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/resources/accessing-resources.html)で入手可能な「Accessing Resources」を参照してください。

2. 「クラス・ファイル」ドロップダウン・リストから、コンパイルされた.classファイルのJDKバージョンの互換性を選択します。この値は、デプロイメントでjavacツールを実行し、javac -targetオプションを使用してR.javaファイルをコンパイルする際に指定されます。デフォルト値は1.5です。使用可能な値は次のとおりです。

- 1.5

- 1.6

3. 「ターゲットSDK APIレベル」ドロップダウン・リストから、アプリケーションが実行されるAPIレベルを選択します。最小(デフォルト)値はAPIレベル9で、これはAndroid 2.3.nプラットフォームに対応します。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/manifest/manifest-intro.html)で入手可能な「The AndroidManifest.xml File」で、<uses-sdk>属性の説明を参照してください。

4. 「最小SDK APIレベル」ドロップダウン・リストから、アプリケーションが実行できる最小APIレベルを選択します。最小(デフォルト)値は15で、これはAndroid 4.0.3プラットフォームに対応します。

5. 「文字エンコーディング」ドロップダウン・リストから、コンパイラがASCII文字セット以外の文字を解釈する方法を制御するネイティブエンコーディング名を選択します。デフォルトはUTF-8です。

ZIP位置合せオプションを設定するには:

バイト位置合せ(32ビットまたは64ビット)を選択します。32ビット(デフォルト)を選択すると、4バイト境界の位置合せが提供されます。

デプロイ済アプリケーションの記憶域オプションを設定するには:

デフォルトでは、モバイル・アプリケーションは、JDeveloperからデバイスにデプロイされた後またはGoogle Playなどのアプリケーション・マーケットプレイスからダウンロードされた後、Androidデバイスの内部記憶域に格納されます。「優先記憶域の場所」ドロップダウン・リストから使用可能な次のオプションでは、モバイル・アプリケーションの優先記憶域の場所を指定できます。

- 内部: モバイル・アプリケーションをデバイスの内部記憶域に強制的にインストールします。

- 外部: アプリケーションをデバイスのSDカードにインストールできます。ただし、Androidシステムは、SDカードにアプリケーションをインストールできないことを検出した場合(たとえば、SDカードがマウントされていない場合や、SDカードは存在するものの十分な領域がない場合)、かわりにアプリケーションをデバイスの内部記憶域にインストールします。モバイル・デバイス・ユーザーは、システム設定を使用して、内外の記憶域間でアプリケーションを移動できます。

- 自動: アプリケーションをデバイスの外部記憶域または内部記憶域にインストールできることを指定します。モバイル・デバイス・ユーザーは、システム設定を使用して、内外の記憶域間でアプリケーションを移動できます。

「外部」オプションまたは「自動」オプションを選択すると、デプロイメント・フレームワークによってAndroidManifest.xmlファイルの<manifest>要素がandroid:installLocation属性、および"preferExternal"または"auto"という値で更新されるようにすることができます。AndroidManifest.xmlファイルにこの属性を入力すると、モバイル・アプリケーションを外部SDカードまたは内部記憶域に格納できます。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/data/install-location.html)またはAndroid SDKのドキュメントから入手できる『Data Storage Guide』の「App Install Location」を参照してください。

ロギング・レベルを設定するには、次のようにします。

Androidデプロイメントに「詳細出力」を選択して、.apkのビルド時にデプロイメントによって起動される各コマンド行ツールによって提供される全出力をログに記録します。このオプションを選択しないと、デプロイメントですべての出力がログに記録されません。

19.2.3.3 Android署名オプションの定義

アプリケーションは、Androidデバイスまたはエミュレータにデプロイする前に、署名する必要があります。Androidでは、認証局は不要です。アプリケーションは自己署名できます。

デプロイメントにおけるモバイル・アプリケーションの署名方法の定義は、2つの手順で構成されます。まず、「MAF」の「プラットフォーム」プリファレンス・ページで、Androidアプリケーションの署名に使用されるキーのデバッグおよびリリース・プロパティを定義します。デバッグおよびリリースの署名プロパティは、一度構成するのみでかまいません。これらのオプションを定義したら、デプロイメント・プロファイルを構成して、デバッグ・モードとリリース・モードのどちらでアプリケーションをデプロイするかを指定します。

始める前に

キーストア・ファイルが存在しない場合は、keytoolユーティリティを使用して、キーストア・ファイルを作成できます(例19-1を参照)。

例19-1 キーストアの生成

keytool -genkey
-v
-keystore c:\jdeveloper\mywork\releasesigning.keystore
-alias releaseKeyAlias
-keyalg RSA
-keysize 2048
-validity 10000

Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で入手可能な「Signing Your Applications」で説明されているとおり、keytoolでは、キーストアを生成する前に、キーストアとキーのパスワード、およびキーの識別名フィールドを入力することを求められます。例19-1のキーストアには、10,000日間有効な単一のキーが含まれています。keytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

ヒント:

Java Platform Standard Edition (Java SE) 7の場合は、-genkeyコマンドのかわりに-genkeypairを使用します。

デバッグ・モードのキー・オプションを構成するには:

1. 「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択します。

2. 「プラットフォーム」を選択します。

3. 「デバッグ」タブ(図19-6を参照)を選択します。

図19-6 デバッグ・デプロイメントの構成

4. 「キーとキーストア・パスワード」フィールドに、デバッグ・デプロイメントに必要なキーストア・ファイルとキーを作成するためにデプロイメントで使用されるパスワードを入力します。Androidデバイスまたはエミュレータへのデプロイメント用のキーストアとキーファイルを生成するこのパスワードには、6文字以上の長さであれば、任意の値を指定できます。デフォルトのパスワードはAndroidです。

リリース・モードのキー・オプションを構成するには:

1. 「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択します。

2. 「プラットフォーム」を選択します。

3. 「リリース」タブ(図19-4を参照)を選択して、次を定義します。

- キーストアの場所: 配布するアプリケーションの署名に使用する秘密鍵を含むキーストアのディレクトリを入力、参照および取得します。

- キーストア・パスワード: キーストアのパスワードを入力します。このパスワードを使用すると、物理ファイルにアクセスできます。

- キーの別名: キーの別名を入力します。これはkeytoolの-alias引数に使用する値セットです。別名の最初の8文字のみが使用されます。

- キー・パスワード: キーのパスワードを入力します。このパスワードを使用すると、キーストア内のキー(別名によって識別される)にアクセスできます。

ヒント:

keytoolユーティリティによるキーストアの生成前に、keytoolユーティリティが要求するパスワードとキー・パスワードを入力します。

これらのパラメータでは、アプリケーションの署名方法の指定に加え、R.Javaクラスのコンパイル方法も指定します。

4. 「OK」をクリックします。

Androidビルド・モードを設定するには:

1. 「オプション」ページで、ビルド・モードとして「デバッグ」または「リリース」を選択します。

- アプリケーションの開発やテスト(JavaやJavaScriptのデバッグなど)を行う際は「デバッグ」を選択します。このオプションを使用すると、秘密鍵を提供しなくても、Androidプラットフォーム上でアプリケーションをデプロイできます。Androidエミュレータまたはテスト用のAndroidデバイスにアプリケーションをする場合は、このオプションを使用します。第22.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

注意:

デバッグ・キーストアおよびキーで署名されたアプリケーションは公開できません。デバッグ・キーストアおよびキーは、テストのみに使用され、エンド・ユーザーへのアプリケーションの公開には使用できません。

- アプリケーションを公開する準備ができた場合は、「リリース」を選択します。このオプションは、アプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開する準備ができた場合に使用します。

ヒント:

アプリケーションのパフォーマンスをテストするには、デバッグ・モードではなくリリース・モードを使用します。

2. 「OK」をクリックします。
デバッグ・モードまたはリリース・モードで署名された.apkファイルは、デバイスまたはエミュレータにデプロイできます。実行時に、MAFは、図19-7に示すように、赤の三角形内に感嘆符で表されるデバッグ・シンボルを重ねることで、アプリケーションがデバッグ・モードでデプロイされたことを示します。

図19-7 デプロイメント・モード

19.2.3.4 資格証明の格納に関する必知事項

MAFは、キーおよびキーストアのパスワードをファイルベースの資格証明ストア(cwallet.sso)に格納します。資格証明の格納および取得を管理するこのファイルは、ユーザーのJDeveloperシステム・フォルダのo.mafフォルダ内に存在します。たとえば、Windows 7環境では、cwallet.ssoファイルはC:\Users\jsmith\AppData\Roaming\JDeveloper\system12.1.3\o.mafに存在します。

詳細は、『Oracle Fusion Middleware管理者ガイド』の「Oracleウォレットについて」の項、および『Oracle Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護』の資格証明ストアの基本の項を参照してください。

注意:

MAFは、キーおよびキーストア資格証明をproduct-preferences.xmlというファイルに格納します。JDeveloperおよびMAFの現在のバージョンのインストール・プロセス時に「インポート・プリファレンスの確認」ダイアログの「はい」をクリックしてプリファレンス設定を保持した場合、MAFはこれらの資格証明をcwallet.ssoファイルに移行します。ただし、cwallet.ssoファイルは、現在のバージョンのOracle JDeveloperとMAFの他のインストールには移行されません。再インストールした場合(または別のインストールを作成した場合)は、cwallet.ssoファイルをo.mafフォルダにコピーするか、または「プラットフォーム」プリファレンス・ページでリリース・モードの資格証明を再構成する必要があります。

19.2.3.5 Androidアプリケーションへのカスタム・イメージの追加方法

サイズや解像度の異なるAndroidデバイス上でMAFアプリケーション・アイコンが適切に表示されるようにするには、同じイメージの低密度、中密度および高密度バージョンを用意する必要があります。MAFは、これらの表示要件を満たすデフォルトOracleイメージを提供します。ただし、アプリケーションでカスタム・アイコンが必要とされる場合は、「アプリケーション・イメージ」ページ(図19-8を参照)を使用して、アプリケーション・アイコンとスプラッシュ画面用のPNG形式のイメージを選択することで、デフォルト・イメージをオーバーライドできます。スプラッシュ画面には、縦向きと横向きのイメージを追加できます。カスタム・イメージ・ファイルを追加しない場合は、デフォルトのOracleアイコンが使用されます。カスタム・イメージを作成するには、Android開発者のWebサイト(http://developer.android.com/design/style/iconography.html)から入手可能な『Iconography』を参照してください。

図19-8 Androidアプリケーション用のカスタム・イメージの設定

始める前に

Androidテーマに適しており、複数の画面タイプをサポートできるディメンション、密度およびコンポーネントを使用するPNG、JPEGまたはGIFファイル形式のイメージを取得します。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/practices/screens_support.html)で入手可能な「Supporting Multiple Screens」を参照してください。

カスタム・イメージを追加するには:

1. 「アプリケーション・イメージ」をクリックします。

2. 「参照」機能を使用して、プロジェクト・ファイルからスプラッシュ画面およびアイコン・イメージ・ファイルを選択します。図19-8には、低密度、中密度、高密度および超高密度ディスプレイを装備するデバイスでの表示にアプリケーションで使用されるアプリケーション・アイコンのイメージと縦向きのスプラッシュ画面用のイメージを選択する様子が示されています。

3. 「OK」をクリックします。

19.2.3.6 JDeveloperによってAndroidアプリケーション用のイメージがデプロイされる場合の処理

デプロイメントの際、MAFにより、JDeveloperは、ソースの場所から一時デプロイメント・フォルダにイメージをコピーできます。MAF拡張機能に付属のデフォルト・イメージ(アプリケーション・ワークスペース・ディレクトリ\Application Resources\Resources\images内)の場合は、JDeveloperはシードされた場所から、ビュー・コントローラ・プロジェクトのデプロイメント・サブディレクトリ(アプリケーション・ワークスペース\ViewController\deploy)にコピーします。表19-2に示されているように、各イメージ・ファイルは、drawableオブジェクトにちなんで名付けられたdrawableというサブディレクトリにコピーされます。詳細は、Android開発者のWebサイト(http://developer.android.com/reference/android/graphics/drawable/Drawable.html)を参照してください。それぞれのdrawableディレクトリは、イメージ密度(ldpi、mdpi、hdpiおよびxhdpi)と向き(port、land)に対応します。これらのディレクトリ内で、JDeveloperは、各アイコン・イメージ・ファイルの名前をadfmf_icon.pngに、各スプラッシュ画面イメージの名前をadfmf_loading.pngに変更します。

表19-2 シードされたアプリケーション・イメージのデプロイメント・ファイルの場所

ソース・ファイル(...\resource\Android)

一時デプロイメント・ファイル(...ViewController\deploy)

display-ldpi-icon.png

drawable-ldpi\adfmf_icon.png

display-mdpi-icon.png

drawable-mdpi\adfmf_icon.png

display-hdpi-icon.png

drawable-hdpi\adfmf_icon.png

display-xhdpi-icon.png

drawable-xhdpi\adfmf_icon.png

display-port-ldpi-splashscreen.png

drawable-port-ldpi\adfmf_loading.png

display-port-mdpi-splashscreen.png

drawable-port-mdpi\adfmf_loading.png

display-port-hdpi-splashscreen.png

drawable-port-hdpi\adfmf_loading.png

display-port-xhdpi-splashscreen.png

drawable-port-xhdpi\adfmf_loading.png

display-land-ldpi-splashscreen.png

drawable-land-ldpi\adfmf_loading.png

display-land-mdpi-splashscreen.png

drawable-land-mdpi\adfmf_loading.png

display-land-hdpi-splashscreen.png

drawable-land-hdpi\adfmf_loading.png

display-land-xhdpi-splashscreen.png

drawable-land-xhdpi\adfmf_loading.png

カスタム・イメージの場合、JDeveloperは、アプリケーション・アイコンのセットを指定の場所から一時デプロイメントの場所の対応する密度と向きのサブディレクトリにコピーします。

19.2.4 iOSデプロイメント・プロファイルの作成方法

iOSの場合は、デプロイメント・プロファイルのプロパティ・エディタを使用して、iOSアプリケーションのビルド構成と、スプラッシュ画面イメージおよびアプリケーション・アイコンの場所を定義します。

始める前に

JDeveloperも実行されているAppleコンピュータに、Xcodeをダウンロードします(Xcodeには、Xcode IDE、パフォーマンス分析ツール、iOSシミュレータ、Mac OS XおよびiOS SDKが含まれています)。

ヒント:

アプリケーションのコンパイルに最低限必要なサポート対象のバージョンについては、Oracle Technology Network (http://www.oracle.com/technetwork/developer-tools/maf/documentation)で動作保証とサポートのマトリクスを参照してください。

Xcodeはデプロイメント時に使用されるので、JDeveloperからモバイル・アプリケーションをデプロイする前にAppleコンピュータにインストールする必要があります。

ヒント:

Xcodeの最新バージョンはApp Storeから入手できますが、次のサイトから以前のバージョンをダウンロードできます。

https://developer.apple.com/xcode/

このサイトにアクセスするには、Apple IDおよびApple開発者としての登録が必要です。

Xcodeをダウンロードしたら、「iOSプラットフォーム」プリファレンス・ページで、そのxcodebuildツールの場所を入力する必要があります。iOSシミュレータへのデプロイメントの場合は、iOSシミュレータのSDKの場所を入力します。詳細は、第2章「プラットフォームとフォーム・ファクタに応じた開発環境の構成方法」を参照してください。

注意:

iTunesとiOSシミュレータの両方を1回以上実行してから、それらの場所を「iOSプラットフォーム」プリファレンス・ページに入力します。

モバイル・アプリケーションを(iOSシミュレータではなく) iOSデバイスにデプロイするには、iOSプロビジョニング・プロファイルからプロビジョニング・プロファイルと証明書の両方を取得する必要があります。詳細は、第19.2.4.2項「デバイス署名オプションの設定」を参照してください。

デプロイメント・プロファイルを作成する手順は、次のとおりです。

1. 「iOSオプション」(図19-9を参照)を選択します。

2. デフォルト値をそのまま使用するか、次を定義します。

- アプリケーション・バンドルID: 必要な場合は、このアプリケーションで使用する、会社のドメイン名を特定するバンドルIDを入力します。アプリケーション・バンドルIDは、iOSデバイスにインストールされた各アプリケーションに対して一意であることと、リバースパッケージ・スタイルの命名規則(つまり、com.<organization name>.<company name>)に従うことが必要です。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』を参照してください。iOS Provisioning Portalを使用したバンドル・シードIDの取得の詳細は、第19.4.4.3項「アプリケーションIDの登録」を参照してください。また、第4.3項「モバイル・アプリケーションの基本情報の設定」も参照してください。

注意:

アプリケーション・バンドルIDに空白を含めることはできません。

それぞれのアプリケーション・バンドルIDは一意であるため、複数のモバイル・アプリケーションを同じデバイスにデプロイできます。アプリケーション・バンドルIDさえ異なっていれば、2つのアプリケーションに同じ名前を指定できます。同じデバイスにデプロイされるモバイル・アプリケーションは、それぞれ別のサンドボックスに配置されます。アプリケーションが相互に認識したり、データを共有することはありません(デバイス・スコープのみが共通になります)。

- アプリケーション・アーカイブ名: 必要に応じて、.ipaファイルまたは.appファイルの名前を入力します。「デプロイメント・アクション」ダイアログ(図19-22を参照)で「配布パッケージにデプロイ」または「デバイスとの同期のためにiTunesにデプロイ」オプションを選択すると、MAFによって.ipaファイルが作成されます。「アプリケーションのシミュレータへのデプロイ」オプションを選択すると、.appファイルが作成されます。または、デフォルトの名前を使用します。詳細は、第19.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」と第19.4.5項「App StoreへのiOSアプリケーションの配布方法」を参照してください。
MAFのデフォルトでは、.ipaファイル(または.appファイル)の名前は、maf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第4.3項「モバイル・アプリケーションの基本情報の設定」を参照してください。

- 最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。

- シミュレータ・ターゲット・バージョン: アプリケーションをデプロイするエミュレータのバージョンを選択します。使用可能なターゲット・バージョンを確認するには、iPhoneシミュレータで「Hardware」→「Version」を選択します。最低バージョンは6.0です。デフォルト設定は「最大使用可能」です。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『iOS Simulator User Guide』を参照してください。

注意:

通常は、iOSターゲット・バージョンより古いバージョンをテスト用のシミュレータで使用できます。

- ターゲット・ファミリ: アプリケーションを実行するiOS製品ファミリを選択します。デフォルト・オプションはiPadとiPhoneの両方です。

図19-9 iOSオプションの設定

19.2.4.1 iOSビルド・オプションの定義

iOSビルド・オプションでは、デバッグまたはリリース・ビットとライブラリによりアプリケーションをデプロイできます。「オプション」ページには、iOS署名モードの構成オプション、デバッグ・モードとリリース・モードが表示されます。

始める前に

iOSアプリケーション(.ipaファイル)をiOSデバイスにデプロイするには、インストールの必須コンポーネントであるプロビジョニング・プロファイルと、デバイス上の開発者とアプリケーションを特定する署名済証明書が必要です。これらはiOS Provisioning Portalから取得する必要があります。詳細は、第19.4.4項「iOSデバイスへのアプリケーションのデプロイに関する必知事項」を参照してください。さらに、「iOSプラットフォーム」プリファレンス・ページで、プロビジョニング・プロファイルの場所と証明書の名前を入力する必要があります。詳細は、第19.2.4.2項「デバイス署名オプションの設定」を参照してください。

ビルド・オプションを設定するには:

1. 「iOSオプション」を選択します(図19-9を参照)。

2. 次のいずれかのビルド・オプションを選択します。

- デバッグ: 開発用のビルドの場合はこのオプションを選択します。デバッグ・ビルドを指定すると、デバッグ・シンボルが含まれます。第22.3.2項「iOSプラットフォームでのデバッグ方法」と第22.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」も参照してください。

- リリース: リリース・ビットおよびライブラリを使用してビルドをコンパイルする場合に選択します。

ヒント:

アプリケーションのパフォーマンスをテストするには、デバッグ・モードではなくリリース・モードを使用します。

実行時に、MAFは、図19-7「デプロイメント・モード」に示すように、赤の三角形内に感嘆符で表されるデバッグ・シンボルを重ねることで、アプリケーションがデバッグ・モードでデプロイされたことを示します。

19.2.4.2 デバイス署名オプションの設定

「iOSプラットフォーム」プリファレンス・ページには、開発コンピュータ上でのプロビジョニング・プロファイルの場所と証明書の名前のフィールドが含まれています。アプリケーションをiOSデバイスにデプロイするか、MAFアプリケーション・アーカイブとしてデプロイする場合は、これらのパラメータを定義する必要があります。

注意:

モバイル・アプリケーションをiOSシミュレータにデプロイする場合は、証明書とプロビジョニング・プロファイルのいずれも不要です。

署名オプションを設定するには:

1. 「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択します。

2. 「プラットフォーム」→「iOS」を選択します。

3. ページの「デバイス署名」セクション(図19-10を参照)で、「プロビジョニング・プロファイル」フィールドにプロビジョニング・プロファイルの場所を入力します。

4. 「証明書」フィールドに、コードの作成者(開発者や会社など)を特定する開発者または配布証明書の名前を入力します。証明書の名前は、Keychain Accessユーティリティ(Applicationsフォルダからアクセス)を使用して表示できます。Keychain Accessユーティリティから名前全体をコピーしてください。「証明書」フィールドに入力する名前は、次の書式に従う必要があります。

iPhone Developer: John Smith (PN3ENLQ3DU)

図19-10 「iOSプラットフォーム」プリファレンス・ページの「デバイス署名」セクション

注意:

プロビジョニング・プロファイルには、アプリケーションの開発バージョン用とリリース・バージョン用の両方があります。アプリケーションのリリース・バージョンに使用されるプロビジョニング・プロファイルは、あらゆるデバイスにインストールできます。一方、開発バージョン用のプロビジョニング・プロファイルは、IDがプロファイルに埋め込まれたデバイスのみにインストールできます。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』を参照してください。

19.2.4.3 iOSアプリケーションへのカスタム・イメージの追加

「アプリケーション・イメージ」ページでは、アプリケーション・アイコンおよびアートワークに使用されるデフォルトのOracleイメージをカスタム・イメージでオーバーライドして、アプリケーションを再ブランディングできます。図19-11に示されているこのページのオプションでは、様々な状況、デバイスの向きおよびデバイスの解像度で使用されるカスタム・イメージの場所を入力できます。iOSアプリケーション・アイコン・イメージの詳細は、『iOS Human Interface Guidelines』の「Icon and Image Design」を参照してください。これらのドキュメントは、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)から入手できます。

注意:

すべてのイメージはPNG形式であることが必要です。

図19-11 カスタム・イメージの追加

カスタム・イメージを追加するには:

1. 「アプリケーション・イメージ」をクリックします。

2. アイコン上部に光沢効果のあるデフォルトのiOSスタイルのアイコンを使用しない場合は、「アイコンに光沢効果を追加しない」を選択します。

3. 「参照」を選択し、アイコン・イメージを選択して、iTunesによって.ipaファイルに割り当てられるデフォルトのAppleイメージをオーバーライドします。このイメージはすべてのアプリケーションに必要とされ、iPhoneアプリケーションとiPadアプリケーションのどちらも512 x 512ピクセルであることが必要です。詳細は、第19.2.4.4項「iTunesアートワークに関する必知事項」を参照してください。

4. 使用可能なイメージ・タイプをツリーに表示するバージョンおよびデバイス・タイプを選択します。デフォルトでは、MAFはiPadおよびiPhoneデバイスで使用可能なすべてのイメージ・スタイルおよびイメージ・タイプを表示します。ただし、図19-3に示すように、デバイス・タイプおよびオペレーティング・システムのバージョンを選択して、選択を絞り込むことができます。「アイコン・フォルダ」フィールド内では、MAFによって、これらのイメージ・ファイルが格納されている、アプリケーションのResourcesディレクトリ内の場所が表示されます。

図19-12 イメージ・タイプの選択

5. ツリーからイメージ・タイプを選択します。

6. 「ファイル」フィールドで、図19-13に示すように、「参照」を選択して別のイメージを選択します。このイメージ・ファイルは、現在のアプリケーション内に存在する必要があります。
デプロイメント時に、JDeveloperはカスタム・イメージ・ファイルをデプロイメント・プロファイルにコピーし、その名前をデフォルト・イメージの名前に一致するように変更します。

図19-13 カスタム・イメージの追加

その名前の場合、図19-14に示すように、JDeveloperはエラーを指摘して誤った(または存在しない)イメージ・ファイルが選択されないように保護します。第4.10.2項「外部リソースの選択に関する必知事項」も参照してください。

図19-14 存在しないイメージの警告

7. 「OK」をクリックします。

19.2.4.4 iTunesアートワークに関する必知事項

デフォルトでは、iTunesを通してiOSデバイスにデプロイされる、またはダウンロード用のアーカイブ(.ipaファイル)としてデプロイされるモバイル・アプリケーションでは、別途指定されていないかぎり、デフォルトのOracleイメージが使用されます。

デプロイされるアプリケーションのアイコンとしてiTunesアートワーク・イメージを選択することで、デフォルトのイメージをオーバーライドします。イメージを使用してアプリケーションのバージョンを区別できます。図19-15に、デフォルト・イメージとユーザーが選択したイメージの違いを示します。Application4にはデフォルト・イメージが、Application6にはユーザーが選択したイメージ(512 x 512ピクセルにスケールを変更したOracleアイコン)が表示されています。

図19-15 カスタムとデフォルトのアプリケーション・アイコン

デプロイメント時に、MAFは、.ipaファイルのトップレベルのiTunesArtworkというファイルにそのiTunesアートワーク・イメージを追加することで、iTunesでそのアイコンが表示されるようにします。

19.2.4.5 表示をデバイスの特定の向きに制限する方法

デフォルトで、MAFは、iPhoneとiPadの両方ですべての向きをサポートします。たとえば、iPads上で上下逆の縦向きでのみ表示する必要があるアプリケーションでは、「デバイスの向き」ページ(図19-16を参照)を使用して、アプリケーションの回転をこれらの向きのみに制限できます。

図19-16 デバイスの向きの選択

アプリケーションの表示をデバイスの特定の向きに制限するには:

1. 「デバイスの向き」を選択します(図19-16を参照)。

2. 表19-3にリストされた向きの中から、不要な向きをすべて消去します。デフォルトでは、MAFは、これらすべてのデバイスの向きにデプロイします。デフォルトでは、これらの向きがすべて選択されています。

表19-3 iPhoneデバイスの向き

アイコン

説明

iPad、縦: ホーム・ボタンは画面の下部。

iPad、上下逆: ホーム・ボタンは画面の上部。

iPad、横左: ホーム・ボタンは画面の左側。

iPad、横右: ホーム・ボタンは画面の右側。

iPhone、縦: ホーム・ボタンは画面の下部。

iPhone、上下逆: ホーム・ボタンは画面の上部。

iPhone、横左: ホーム・ボタンは画面の左側。

iPhone、横右: ホーム・ボタンは画面の右側。

3. 「OK」をクリックします。

19.2.4.6 デバイスの向きを選択解除する場合の処理

デバイスの向きを選択解除すると、ソース.plistファイルが更新されます。

19.3 Androidアプリケーションのデプロイ

デプロイメント・プロファイルを定義したら、「デプロイメント・アクション」ダイアログ(図19-17を参照)を使用してAndroidプラットフォームにモバイル・アプリケーションをデプロイできます。このダイアログを使用すると、完了したアプリケーションを、Androidエミュレータまたはテスト用のAndroidデバイスにデプロイできます。アプリケーションのテストとデバッグが完了したら、このダイアログを使用して、モバイル・アプリケーションをAndroidアプリケーション・パッケージ(.apk)・ファイルとしてバンドルできます。これによって、アプリケーション・マーケットプレイス(Google Playなど)を通して、アプリケーションをエンド・ユーザーに公開することが可能になります。

ヒント:

「デプロイメント・アクション」ダイアログのかわりに、OJDeployコマンド行ツールを使用してモバイル・アプリケーションをAndroidプラットフォームにヘッドレス・モードでデプロイすることもできます。詳細は、第19.8項「コマンド行からのモバイル・アプリケーションのデプロイ」を参照してください。

図19-17 Androidアプリケーションの「デプロイメント・アクション」ダイアログ

19.3.1 AndroidエミュレータへのAndroidアプリケーションのデプロイ方法

モバイル・アプリケーションはAndroidエミュレータに直接デプロイできます。

始める前に

Androidエミュレータにデプロイするには、次を行う必要があります。

- 「Androidプラットフォーム」プリファレンス・ページ(「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択してアクセス)で、デバッグ・パスワードを構成します。

注意:

Android 4.0.nプラットフォーム(API 14以降)をインストールする必要があります。

- Android Virtual Deviceインスタンスの構成にARMシステム・イメージが反映されていることを確認します。

- デプロイメント・プロファイルの「Androidオプション」ページで、次を行います。

1. 「デバッグ」が選択されていることを確認します。

2. 「OK」をクリックします。

注意:

「Androidプラットフォーム」プリファレンス・ページは、デバッグ・モードのデプロイメント用のキーストアとキーの生成に使用されるパスワードで構成する必要があります。詳細は、第19.2.3.3項「Android署名オプションの定義」を参照してください。

- アプリケーションをデプロイする前にAndroidエミュレータを起動します。
エミュレータは、Android Virtual Device Manager(図19-18を参照)またはコマンド行を使用して起動できます。コマンド行から起動する場合は、toolsディレクトリ(Android\android-sdk内)に移動し、emulator -avdに続けてエミュレータ名を入力することで(例: -avd AndroidEmulator1)、エミュレータを起動します。

注意:

デプロイメント時にはAndroidエミュレータを1つのみ実行できます。

図19-18 Android Virtual Device Managerを使用したエミュレータの起動

アプリケーションをAndroidエミュレータにデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのエミュレータへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図19-2を参照)をレビューし、「戻る」を選択して別のデプロイメント・アクティビティを選択するか、「終了」を選択します。「サマリー」ページには、デプロイメント・プロファイルの次のパラメータが表示されます。

- アプリケーション・バンドルID: アプリケーションを特定する、Java言語のような一意のパッケージ名。

注意:

図19-19の「サマリー」ページには、アプリケーション・バンドルIDが、エミュレータへのデプロイメントの成功に必要なリバースパッケージ書式であることが示されています。リバースパッケージ書式に従わないアプリケーションをデプロイすると、エミュレータが停止して、デプロイメントを完了できなくなります。

- ファイル: Androidターゲットにデプロイされる.apkの名前。

- デプロイ・モード: ビルド・モード。この値は、デプロイメント・プロファイルに設定されている値に応じて、「リリース」と「デバッグ」のいずれかになります。

図19-19 Androidエミュレータ・デプロイメントのサマリー

4. デプロイメント・ログをレビューします(図19-20を参照)。デプロイメント・ログには、デプロイヤがAndroidエミュレータの実行中インスタンスを検出し、Androidデバッグ・ブリッジ・サーバーを起動したことが示されます。第19.3.6項「Androidデバッグ・ブリッジの使用方法に関する必知事項」も参照してください。

図19-20 デプロイメント・ログ

19.3.2 Androidデバイスへのアプリケーションのデプロイ方法

モバイル・アプリケーションは、2.n (APIレベル9)以降のプラットフォーム上で動作するAndroidデバイスに直接デプロイできます。

始める前に

第2.5.2項「Androidデバイスの設定方法」の説明に従って、JDeveloperをホストする開発コンピュータにデバイスを接続します。

デプロイメント・オプション・ページ(図19-5を参照)で、ビルド・モードとして「デバッグ」を選択します。図19-6に示すように、「Androidプラットフォーム」プリファレンス・ページでデバッグ署名資格証明が構成されていることを確認します。

Androidデバイスにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのデバイスへのデプロイ」→「次へ」を選択します。

3. 「概要」ページを確認します。「戻る」または「次へ」をクリックします。

4. 「終了」をクリックします。

19.3.3 Androidアプリケーションの公開方法

第22章「MAFアプリケーションのテストおよびデバッグ」の説明に従ってアプリケーションのテストとデバッグが完了したら、Android開発者のWebサイト(http://developer.android.com/tools/publishing/publishing_overview.html)の説明に従ってアプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開できます。

始める前に

デプロイメント・プロファイルの「Androidオプション」ページで、ビルド・モードとして「リリース」を選択します。

注意:

第19.2.3.3項「Android署名オプションの定義」の説明に従って、「Androidプラットフォーム」プリファレンス・ページ(「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択してアクセス)で署名オプションを構成する必要があります。

.apkファイルとしてアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのパッケージへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図19-19を参照)をレビューします。「戻る」または「次へ」をクリックします。

4. 「終了」をクリックします。

5. アプリケーション・マーケットプレイスにアプリケーションを公開します。

19.3.4 .apkファイル作成時のJDeveloperでの処理

アプリケーションをデプロイすると、次のものが.apkファイルにデプロイされます。

- adfmsrcの内容

- .adfフォルダの内容

- maf-application.xmlファイルおよびmaf-feature.xmlファイル

- logging.propertiesファイル

- JVM 1.4ファイル

表19-4 .apkファイルの内容

内容

.apkファイル内の場所

.adfフォルダの内容

Androidアプリケーション・ファイルのルート・フォルダ([apkRoot]\.adf)

adfmsrcフォルダの内容

デプロイメントでは、adfmsrcフォルダの内容が、userフォルダ([apkRoot]\user)内のデフォルトJARファイルにパッケージ化されます。このJARファイルはAndroid Asset Packaging Tool (AAPT)を使用して.apkに追加され、ANDROID_MOBILE_NATIVE_archiveNという書式のデフォルト名を持ちます。デフォルト名のNは、何番目のAndroid作成プロファイルであるかを示します(この名前はプロファイルの作成時にオーバーライドできます)。

このJARファイルには次が含まれます。

- .javaファイルから生成された任意の.classファイル。これは、ビュー・コントローラ・プロジェクトとadfmsrcの内容に追加されます。.javaファイルはJVM 1.4 JDK javacツールを使用してコンパイルされます。

- データ・バインディングおよびpagedefメタデータ・ファイルが含まれます。

このJARファイルはDalvik仮想マシンによって処理されません。.classファイルはJDK内で実行されるので、Dalvikバイトコード形式(.dex)への変換は不要です。

adfmf_application.xmlファイルとadfmf_feature.xmlファイル

Configurationというファイル([apkRoot]\Configuration)内にあります。

logging.propertiesファイル

アプリケーション・ファイルのルートにあります。

JVM 1.4ファイル

JVMファイルは次の2つの別個のフォルダにパッケージ化されます。

- テンプレート内のライブラリ・ファイル(\framework\build\java_res\libs\)は、APK - [apkRoot]\lib内のlibフォルダにパッケージ化されます。

- \framework\build\java_res\assets\storageファイルは、APK - [apkRoot]\assets\storage内のassets\storageディレクトリにパッケージ化されます。

19.3.5 最近使用されたデプロイメント・プロファイルの選択

デプロイメント・アクションを選択すると、JDeveloperによって「デプロイ」メニューにショートカットが作成されます。このショートカットを使用すると、同じデプロイメント・アクションを使用してアプリケーションを簡単に再デプロイできます。

19.3.6 Androidデバッグ・ブリッジの使用方法に関する必知事項

デプロイメントでは、デバイス(デバイスにデプロイする場合)またはエミュレータ(Androidエミュレータにデプロイする場合)が検出されるまで、Androidデバッグ・ブリッジ・サーバーが5回再起動されます。どちらも検出されない場合、図19-21に示すとおり、デプロイメント・プロセスは終了します。

図19-21 終了されたデプロイメント

デプロイメント前にAndroidデバッグ・ブリッジ・コマンド行ツールを使用する場合は、デプロイメントの完了後に同じコマンドを再度入力する必要があります。たとえば、デプロイメントの前にエミュレータまたはデバイスのロギング情報を表示するためにadb logcatと入力した場合、ロギング出力の取得を再開するには、アプリケーションがデプロイされた後で再度adb logcatと入力する必要があります。Androidデバッグ・ブリッジ・コマンド行ツールは、Android SDKインストールのplatform-toolsディレクトリ内に配置され、ここから実行されます。このツールの詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/adb.html)を参照してください。

19.4 iOSアプリケーションのデプロイ

図19-22に示された「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイするか、iTunesを通してデバイスにデプロイできます。iOSアプリケーションはAppleコンピュータからのみデプロイできます。iOSシミュレータへのデプロイメントを行うために、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップを取得する必要はありません。Apple開発者として登録されていれば、App Storeから入手できないXcodeのバージョンにアクセスできるので、問題ありません。iOSデバイスへのデプロイメントに必要なiOS開発者プログラム(第19.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」と第19.4.5項「App StoreへのiOSアプリケーションの配布方法」で説明されています)の詳細は、https://developer.apple.com/programs/を参照してください。

図19-22 「デプロイメント・アクション」ダイアログ(iOSアプリケーション用)

ヒント:

「デプロイメント・アクション」ダイアログのかわりに、OJDeployコマンド行ツールを使用してモバイル・アプリケーションをiOSプラットフォームに手動でデプロイすることもできます。詳細は、第19.8項「コマンド行からのモバイル・アプリケーションのデプロイ」を参照してください。

19.4.1 iOSシミュレータへのiOSアプリケーションのデプロイ方法

「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイできます。

始める前に

iOSシミュレータへのデプロイメントを可能にするには、次のタスクを実行する必要があります。

- Xcodeをインストールして実行し、ライセンス契約を受諾して、指示に従ってインストール後のその他のタスクを実行します。

注意:

アプリケーションをiOSシミュレータにデプロイする前に、最低1回はXcodeを実行する必要があります。これを行わないと、デプロイメントに失敗します。

- Xcodeのインストール後、iOSシミュレータを1回以上実行してください。

- 「iOSプラットフォーム」プリファレンス・ページで、iOSシミュレータのSDKの場所を設定します(図19-24を参照)。

- デプロイメント・プロファイルの「iOSオプション」ページで、「デバッグ」を選択し、「OK」をクリックします。

注意:

「iOSプラットフォーム」ページ(「ツール」→「プリファレンス」→「モバイル・アプリケーション・フレームワーク」を選択してアクセス)で、プロビジョニング・プロファイルの場所と証明書の名前を入力する必要があります。詳細は、第19.2.4.2項「デバイス署名オプションの設定」を参照してください。

- アプリケーションをデプロイする前に、iOSシミュレータが実行されている場合は、そのシミュレータを停止します。シミュレータを停止しなかった場合は、デプロイメント中にその処理が実行されます。

- iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『iOS Simulator User Guide』を参照してください。iOSシミュレータはXcodeとともにインストールされます。

iOSシミュレータにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「アプリケーションのシミュレータへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図19-23を参照)をレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- 証明書: アプリケーションを作成した開発者または会社。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:

iOSシミュレータへのデプロイメントでは、証明書とプロビジョニング・プロファイルの値を定義する必要はありません。このデプロイメント・シナリオでは、「サマリー」ページでこれらの値について<指定なし>と表示されます。

図19-23 デプロイメント・アクションの「サマリー」ダイアログ

19.4.2 iOSデバイスへのアプリケーションのデプロイ方法

「デバイスとの同期のためにiTunesにデプロイ」オプションを使用すると、モバイル・アプリケーションをデバッグおよびテスト用のiOSデバイスにデプロイできます。iOSデバイスまたは配布サイトへのデプロイメントには、iOS Developer ProgramまたはiOS Developer Enterprise Programへのメンバーシップが必要です。詳細は、https://developer.apple.com/programs/を参照してください。

始める前に

JDeveloperからiOSデバイスにアプリケーションを直接デプロイすることはできません。アプリケーションは、Apple iTunesのApplicationsフォルダからデプロイする必要があります。そのためには、次のタスクを実行する必要があります。

- Apple iTunesを開発コンピュータにダウンロードし、それを1回以上実行して、必要なフォルダとディレクトリを作成します。

- 「iOSプラットフォーム」プリファレンス・ページで、Automatically Add to iTunesフォルダの場所(アプリケーションのデプロイメントに使用される場所)を設定します(図19-24を参照)。

ヒント:

ユーザーのホーム・ディレクトリ(/User/<username>/Music/iTunes/iTunes Media/Automatically Add to iTunes.localized)は、iTunes Mediaフォルダのデフォルト・ディレクトリですが、このフォルダの場所は次のように変更できます。

1. iTunesで、「Edit」→「Preferences」→「Advanced」を選択します。

2. 「Change」をクリックし、新しい場所を参照します。

3. ライブラリを統合します。

4. 元のiTunes Mediaフォルダを削除します。

手順の詳細は、Apple Support (http://support.apple.com)を参照してください。

「iOSプラットフォーム」プリファレンス・ページでも場所を更新する必要があります。

- xcodebuildツールが起動されるXcodeフォルダの場所を設定します(例: 図19-24の/Developer/usr/bin)。

図19-24 iTunes Mediaフォルダとxcodebuildシステムの場所の設定

- 証明書の名前とプロビジョニング・プロファイルの場所を、「iOSプラットフォーム」プリファレンス・ページで入力します。iOS Provisioning Portalによって、iOSデバイスへのデプロイメントまたはApp Storeや内部ダウンロード・サイトへの.ipaファイルの公開に必要な証明書とプロビジョニング・プロファイルが生成されます。

注意:

デバイスまたはアーカイブにデプロイするようにiOSプロビジョニング・プロファイルと証明書を設定しないと、デプロイメントは失敗します。MAFでは、このような状況でデプロイできなかったアプリケーションがログに記録されます。詳細は、第19.4.4項「iOSデバイスへのアプリケーションのデプロイに関する必知事項」を参照してください。

- デプロイメント・プロファイルの「iOSオプション」ページで、ビルド・モードとして「デバッグ」を選択し、「OK」を選択します。

- iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』を参照してください。

iOSデバイスにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「デバイスとの同期のためにiTunesにデプロイ」→「次へ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- 証明書: アプリケーションを作成した開発者(または会社)。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:

証明書とプロビジョニング・プロファイルの値を<指定なし>とすることはできません。iTunesへのデプロイメントを可能にするには、「オプション」ページでこれらの値を指定する必要があります。

4. iOSデバイスを開発コンピュータに接続します。

5. iTunesを開いてデバイスを同期化します。

19.4.3 iOSデバイスにアプリケーションをデプロイする場合の処理

デプロイメントに成功すると、図19-15のようにアプリケーションがiTunesの「Apps」フォルダに表示されます。

19.4.4 iOSデバイスへのアプリケーションのデプロイに関する必知事項

iOS Developer Programのメンバーのみがアクセス可能なiOS Provisioning Portalを使用して最初にプロビジョニング・プロファイルを作成しないかぎり、iOSアプリケーション(つまり、.ipaファイル)をiOSデバイスにデプロイしたり、App Storeまたは内部のホストされたダウンロード・サイトに公開することはできません。第19.2.4.2項「デバイス署名オプションの設定」の説明に従って、「オプション」ページでプロビジョニング・プロファイルの場所と証明書の名前を入力します。

iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『App Distribution Guide』で説明されているように、プロビジョニング・プロファイルによって開発用証明書、デバイスおよびアプリケーションIDが関連付けられます。iOS Provisioning Portalでは、これらのエンティティとプロビジョニング・プロファイルを作成できます。

ヒント:

プロビジョニング・プロファイルをダウンロードしたら、このファイルをダブルクリックしてLibrary/MobileDevice/Provisioning Profileディレクトリに追加してください。

図19-25 iOS Provisioning Portal

19.4.4.1 iOS開発用証明書の作成

証明書は、開発者のアイデンティティに関する情報と公開鍵および秘密鍵が結合された電子的なドキュメントです。iOS開発用証明書がOS開発者として識別し、デプロイメントのためのアプリケーションの署名を有効にするので、証明書をダウンロードしたら、基本的に開発者自身のアイデンティティを開発コンピュータにインストールします。iOSオペレーティング環境では、すべての証明書がKeychainによって管理されます。

iOS Provisioning Portalの「Certificates」ページを使用して、CSR(証明書署名リクエスト)をログに記録します。CSRを完了すると、iOS Provisioning PortalによってiOS開発用証明書が発行されます。

19.4.4.2 テストおよびデバッグ用のAppleデバイスの登録

開発コンピュータに証明書をインストールしたら、「Current Available Devices」タブ(iOS Provisioning Portalの「Devices」ページ内)をレビューして、開発者自身(またはその会社)がテストやデバッグに使用するAppleデバイスを特定します。シリアル番号のような一意のデバイス識別子(UDID)によって各デバイスを識別するこのリストにデバイスが含まれていないかぎり、アプリケーションはデプロイできません。

19.4.4.3 アプリケーションIDの登録

アプリケーションIDは、デバイス上のアプリケーションの一意の識別子です。アプリケーションIDは、第4.3.1項「モバイル・アプリケーションのIDおよび表示動作の設定方法」で説明されている書式の、バンドルIDと呼ばれる管理者が作成したリバース・ドメイン名の前に、バンドル・シードと呼ばれるAppleが生成した10文字の英数字文字列が付加された構成になります。図19-26には、他のアプリケーションとファイルやKeychainを共有しない、一意のアプリケーションIDが示されています。

図19-26 明示的なアプリケーションID

8E549T7128.com.oracle.*のように、アプリケーション名にワイルドカード文字(*)を使用すると、一連のアプリケーション間でアプリケーションIDを共有できます。たとえば、iOS Provisioning Portal上で管理者がcom.oracle.MAF.*という名前を付けた場合は、異なるアプリケーション(com.oracle.MAF.application1とcom.oracle.MAF.application2)を指定できます。

注意:

アプリケーションでプッシュ通知を受信する場合、アプリケーションIDは、ワイルドカード文字ではなく、完全な一意のIDである必要があります。ワイルドカードによって識別されるアプリケーションでは、プッシュ通知を受信できません。詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『Local and Push Notification Programming Guide』の「Provisioning and Development」を参照してください。

アプリケーション間で8E549T7128などの同じ接頭辞を共有する場合、それらのアプリケーションでは、ファイルまたはキー・チェーンを共有できます。

注意:

バンドルIDは、デプロイメント・プロファイルの「オプション」ページで設定されたアプリケーションIDと一致している必要があります。

19.4.5 App StoreへのiOSアプリケーションの配布方法

iOSデバイス上でのアプリケーションのテストとデバッグが終了したら、App Storeまたは内部ダウンロード・サイトを通してより広範なオーディエンスにアプリケーションを配布できます。App Storeにアプリケーションを公開するには、.ipaファイルをiTunes Connectに送信する必要があります。これによって、.ipaファイルをiTunesに追加して、アプリケーションを更新し、テスト・ユーザーを作成することが可能になります。

始める前に

アプリケーションを配布する前に、次のタスクを実行する必要があります。

- 「iOSプラットフォーム」プリファレンス・ページ(図19-24を参照)で、Automatically Add to iTunesディレクトリの場所を入力します。

ヒント:

この場所を入力する前に、iTunesを1回以上実行します。第19.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- 実際のiOSデバイス上でアプリケーションをテストします。第19.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- iOS Provisioning Portalを通して配布証明書を取得します。

注意:

配布証明書を作成できるのは、チーム・エージェントのみです。

- .ipaファイルをiTunesに配布するための、iTunes Connectアカウントを取得します。詳細は、iOS Development CenterのApp Store Resource Centerにある『Prepare App Submission』を参照してください。具体的には、『App Store Review Guidelines』を確認して、App Review Teamに確実に受け入れられるようにしてください。

- 『iTunes Connect Developer Guide』を確認することをお薦めします。どちらのガイドも、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)から入手できます。

- デプロイメント・プロファイルの「iOSオプション」ページで、ビルド・モードとして『App Distribution Guide』「リリース」を選択し、「OK」をクリックします。

iOSアプリケーションをApp Storeに配布するには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「配布パッケージにデプロイ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- 証明書: アプリケーションの作成者。デプロイメント・プロファイルの「iOSプラットフォーム」プリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。「iOSプラットフォーム」プリファレンス・ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:

証明書とプロビジョニング・プロファイルの値は、<指定なし>にはできません。.ipaファイルがiTunesで受け入れられるようにするには、「オプション」ページでこれらの値を指定する必要があります。

4. iTunes Connectにログインします。

5. 『iTunes Connect Developer Guide』の「Adding New Apps」と「Using Application Loader」の項で説明されているManage Your ApplicationsモジュールとApplication Loaderを使用して、検討用に.ipaファイルをiTunes Connectに送信します。

6. アプリケーションが承認されたら、『iTunes Connect Developer Guide』の「Creating Test Users」の項でManage Usersモジュールの使用方法を参照してください。多言語アプリケーションをテストするには、アプリケーションのローカライズ対象地域のテスト・ユーザー・アカウントを作成します。

7. Managing Your Applicationモジュールを使用したバイナリの更新については、『iTunes Connect Developer Guide』の「Editing and Updating App Information」の項を参照してください。

19.5 機能アーカイブ・ファイル(FAR)のデプロイ

MAFのビュー・コントローラ・プロジェクトによる再利用を可能にするために、アプリケーション機能(一般的に、MAF AMXまたはローカルHTMLとして実装されるもの)は、機能アーカイブ(FAR)というアーカイブにバンドルされます。第4.13項「機能アーカイブ・ファイルの使用」で説明されているように、FARはモバイル・アプリケーションで使用可能なアプリケーション機能アーティファクトが含まれているJARファイルです。FARには、Javaクラスを含めることも可能ですが、これらのクラスはコンパイルする必要があります。例19-2は、1つのmaf-feature.xmlファイルと1つのconnections.xmlファイルを含むFARの内容を示しています。connections.xmlの詳細は、Oracle Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発のconnections.xmlファイルに定義されている検索に関する項を参照してください。

例19-2 機能アーカイブ・ファイルの内容

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を使用する場合は、ビュー・コントローラ・プロジェクトのみをデプロイすればすみます。

19.5.1 機能アーカイブのデプロイメント・プロファイルの作成方法

「デプロイメント・プロファイルの作成」ダイアログを使用します(図19-27を参照)。

図19-27 MAF機能アーカイブ・ダイアログの作成

始める前に

アプリケーションの適切な接続を作成します。FARは接続要件が異なる様々なMAFアプリケーションで使用できるため、接続ソースまたは実際に標準化された接続名を表す接続名を選択します。

機能アーカイブのデプロイメント・プロファイルを作成するには:

1. ビュー・コントローラ・プロジェクトを右クリックし、「新規」→「デプロイ」→「新規デプロイメント・プロファイル」を選択します。

注意:

アプリケーションレベルの別個のデプロイメント・プロファイルを作成する必要はありません。

2. 「デプロイメント・プロファイルの作成」ダイアログで「MAF機能アーカイブ」を選択します。

3. プロファイル名を入力するか、デフォルトを受け入れて、「OK」をクリックします。

注意:

プロファイルには適切な名前を付けてください。そうしないと、アーカイブ名が同じアプリケーション機能を複数アップロードしたときに、問題が発生する可能性があります。詳細は、第4.13.4項「機能アーカイブ・リソースの再使用の有効化に関する必知事項」を参照してください。

4. 機能アーカイブJARファイルに含める接続を選択します(図19-28を参照)。

図19-28 FARの接続の選択

5. 「次へ」をクリックしてオプションをレビューし、「終了」をクリックします。

19.5.2 機能アーカイブのデプロイメント・プロファイルのデプロイ方法

「デプロイメント・アクション」ダイアログでは、FARをJARファイルとしてデプロイできます。図19-29に示すこのダイアログには、「機能アーカイブJARファイルへデプロイします。」という1つのデプロイメント・オプションのみがあります。

図19-29 デプロイメント・アクション

機能アーカイブのデプロイメント・プロファイルをデプロイするには:

1. ビュー・コントローラ・プロジェクトを右クリックして、機能アーカイブのデプロイメント・プロファイルを選択します。

2. 「終了」をクリックします。「サマリー」ページ(図19-30を参照)に、機能アーカイブ・ファイルのJARパスがデプロイされるフルパスが表示されます。

図19-30 デプロイメントの「サマリー」ページ

19.5.3 機能アーカイブ・ファイルのデプロイメント・プロファイルをデプロイする場合の処理

「デプロイメント・アクション」ダイアログを完了すると、MAFによって、「サマリー」ページに示されたパスにライブラリJARが作成されます。他のアプリケーションでこのJARを使用できるようにするには、最初に、図19-31に示す「リソース・パレット」(第4.13.1項「MAFアプリケーションでのFARコンテンツの使用方法」で説明)で機能アーカイブJARの場所への接続を作成することでこれを利用可能にする必要があります。図19-31は、ファイル・システム接続によりモバイル・アプリケーション使用可能となる機能アーカイブを示します。

図19-31 「リソース・パレット」のデプロイされた機能アーカイブJAR

19.6 モバイル・アプリケーション・アーカイブ・ファイルの作成

新しいモバイル・アプリケーションを既存のモバイル・アプリケーションから作成するには、まず元のモバイル・アプリケーションをモバイル・アプリケーション・アーカイブ(.maa)ファイルとしてパッケージ化した後、このファイルから新しいモバイル・アプリケーションを導出します。.maaファイルは、サード・パーティによる使用が可能です(第19.7項「署名されていないデプロイメント・パッケージの作成」を参照)。

.maaファイルによって、モバイル・アプリケーションの構造が保持されます。表19-5に、このファイルの内容を示します。

表19-5 モバイル・アプリケーション・アーカイブ・ファイルの内容

ディレクトリ

説明

adf

次のようなメタデータ・ファイルを含むMETA-INFディレクトリが格納されます。

- adf-config.xmlファイル

- maf-application.xmlファイル

- maf-config.xmlファイル

- その他の該当するアプリケーション・レベルのファイル(connections.xmlファイルなど)

Projects

ワークスペース内の各プロジェクトに対応するJARファイルが格納されます。たとえば、デフォルトのモバイル・アプリケーションを.maaファイルにデプロイすると、ViewController.jarファイルとApplicationController.jarファイルはこのディレクトリに配置されます。.maaファイルのProjectsディレクトリには、元のプロジェクトの.javaファイルは格納されません。かわりに、.javaファイルはコンパイルされ、その結果生成された.classファイルが、プロジェクトJARファイル(ApplicationController.JAR/classlib/mobileApplicationArchive.jarなど)に含まれる別のJARファイル内に配置されます。

ExternalLibs

元のモバイル・アプリケーションの外部にあるアプリケーション・レベルのライブラリ(FARを含む)が格納されます。

META-INF

cvm.propertiesおよびlogging.propertiesファイルが格納されます。

resources

次のディレクトリが含まれます。

- android: アプリケーション・アイコンやスプラッシュ画面に使用される、Android固有のイメージ・ファイルが格納されます。

- ios: アプリケーション・アイコンやスプラッシュ画面に使用される、iOS固有のイメージ・ファイルが格納されます。

- security: cacertsファイル(キーストア・ファイル)が格納されます。

表19-5にリストされたアーティファクトに加えて、.maaファイルには、元のモバイル・アプリケーションの内部にあるFARまたはJARファイル、およびその制御(.jws)ファイルが格納されたフォルダが含まれます。第19.7.2項「MAFアプリケーション・アーカイブ・ファイルのインポート時に行われる処理」も参照してください。

19.6.1 モバイル・アプリケーション・アーカイブ・ファイルの作成方法

モバイル・アプリケーションの作成後、JDeveloperによって、デフォルトのMAFアプリケーション・アーカイブ・デプロイメント・プロファイルが作成されます。モバイル・アプリケーション・アーカイブ・ウィザードを使用すると、.maaファイルを作成できます。

ヒント:

また、OJDeployを使用して.maaファイルを作成することもできます(第19.8項「コマンド行からのモバイル・アプリケーションのデプロイ」を参照)。

モバイル・アプリケーション・アーカイブ・ファイルを作成するには:

1. 「アプリケーション」→「デプロイ」→「新規デプロイメント・プロファイル」をクリックします。

2. 「デプロイメント・プロファイルの作成」ダイアログで、「MAFアプリケーション・アーカイブ」→「OK」をクリックします(図19-32を参照)。

図19-32 MAAデプロイメント・プロファイルの作成

3. 必要に応じて、「アプリケーション・アーカイブ・オプション」ページでモバイル・アプリケーション・アーカイブの名前を入力する(図19-33を参照)か、デフォルトの名前(およびパス)をそのまま使用します。「OK」をクリックします。

図19-33 モバイル・アプリケーション・アーカイブ・ファイルの名前とパスの入力

4. 必要に応じて、次を実行します。

1. 「アプリケーション・ディスクリプタ」ページ(図19-34を参照)で、META-INFフォルダ(application_workspace\src\META-INF)の内容に付けるファイル・グループ名を入力します(またはデフォルトの名前をそのまま使用します)。

図19-34 META-INFの内容に付けるファイル・グループ名の入力

2. この「アプリケーション・ディスクリプタ」ページの「コントリビュータ」サブページを選択して、ファイル・グループの内容を提供するディレクトリとJARファイルのリストを編集します。

図19-35 モバイル・アプリケーション・アーカイブ・ファイルへのコントリビュータの編集

3. 「フィルタ」ページ(図19-36を参照)を使用して、.maaファイルに含めるファイルを編集したり、コンテンツの組込みまたは除外ルールを設定したりします。

図19-36 ファイルとディレクトリの組込み(または除外)

4. 「プロファイルの依存性」ページ(図19-37を参照)を使用して、プロジェクト内の依存プロファイルを指定します。

図19-37 デプロイメント・プロファイルの選択

モバイル・アプリケーションをMAFアプリケーション・アーカイブ・ファイルとしてパッケージ化するには:

1. 「アプリケーション」→「デプロイ」を選択し、「MAFアプリケーション・アーカイブ」デプロイメント・プロファイルを選択します。

2. 「デプロイメント・アクション」ウィザードで、「アプリケーションのMAAへのデプロイ」を選択します(図19-38を参照)。

図19-38 MAFアプリケーション・アーカイブ・ファイルへのデプロイメント

3. 「次へ」をクリックして、デプロイメント・サマリーを確認します(図19-39を参照)。

図19-39 MAFアプリケーション・アーカイブのデプロイメント・サマリー

4. 「終了」をクリックします。

19.7 署名されていないデプロイメント・パッケージの作成

MAFアプリケーション・アーカイブ(.maa)・ファイル形式を使用すると、署名されていないモバイル・アプリケーションをサード・パーティに提供できます。インポートした.maaファイルからモバイル・アプリケーションを導出することによって、次のような様々なカスタマイズが可能になります。

- アプリケーションへの一意のアプリケーションIDの付与(プッシュ通知を有効にする場合など)。

- 企業固有の資格証明または証明書を使用した、アプリケーションへの署名。

- カスタマイズされたスプラッシュ画面とアプリケーション・アイコンによる、リソースの置換え。

注意:

.maaファイルを既存のアプリケーションにインポートすると、ワークスペースとプロジェクトのコンテナ・ファイル(それぞれ.jwsファイルと.jprファイル)が上書きされます。このため、MAF AMXページと構成ファイル(maf-application.xml、maf-config.xml、connections.xml、adf-config.xmlなど)に対して以前加えた変更の一部は保持されません。

19.7.1 署名されていないアプリケーションの作成方法

署名されていないアプリケーションを作成するには、.maaファイルを新しいモバイル・アプリケーションにインポートします。

署名されていないアプリケーションを作成するには:

1. 「ファイル」を選択し、「新規」を選択します。

2. 「新規ギャラリ」で、「アプリケーション」→「アーカイブ・ファイルからのMAFアプリケーション」を選択します。

注意:

または、「ファイル」→「インポート」→「アーカイブ・ファイルからのMAFアプリケーション」を選択します。

3. 「場所」ページで、「MAAファイル」フィールドの「参照」を選択します。

4. 「インポートするMAAファイルの選択」ページで、.maaファイルを強調表示し(図19-40を参照)、「開く」をクリックします。

図19-40 .maaファイルの選択

5. 必要に応じて、次を実行するか、デフォルト値をそのまま使用します。

1. .maaファイルから導出したモバイル・アプリケーションの名前を「アプリケーション・ファイル」フィールドに入力します(図19-41を参照)。

2. 「参照」をクリックして、モバイル・アプリケーションのディレクトリを取得します。

図19-41 ディレクトリの場所の入力

6. 「次へ」をクリックします。

7. インポートのサマリー情報を確認し、「終了」をクリックします。

図19-42 MAFアプリケーション・アーカイブの内容のサマリー

19.7.2 MAFアプリケーション・アーカイブ・ファイルのインポート時に行われる処理

MAFでは、.maaファイルがインポートされた後、次を実行します。

1. アプリケーション・フォルダを作成します。

2. ワークスペース・コンテナ(.jws)・ファイルを.maaファイルからアプリケーション・ファイルに解凍し、ユーザー指定の値に従ってその名前を変更します。

3. adfディレクトリとその内容をアプリケーション・フォルダに解凍します。このディレクトリの名前は、.adfに変更されます。

4. META-INFディレクトリとその内容をアプリケーション・フォルダに解凍し、アプリケーション・フォルダのsrcディレクトリ内に配置します。

5. ExternalLibsディレクトリとその内容をアプリケーション・フォルダに解凍します。

注意:

このディレクトリに格納された外部リソースはすべて、.maaファイルとしてパッケージ化された(そしてアプリケーションにインポートされた)モバイル・アプリケーション内で使用できますが、これらのリソースへの参照は、.maaファイルから導出されたモバイル・アプリケーションに対しては無効になります。

6. resourcesディレクトリをアプリケーション・フォルダに解凍します。

7. 元のモバイル・アプリケーションの内部にあるFAR (またはその他のライブラリ)を含む、すべてのフォルダを解凍します。MAFによって、これらのアーティファクトの元の場所が保持されます。

8. MAFでは、元のモバイル・アプリケーションのProjectsディレクトリ内にあるJARファイルごとに、次を実行します。

- JARファイルの名前(.jar拡張子を除く)に対応するアプリケーション・ディレクトリの下に、プロジェクト・フォルダを作成します。

- JARファイルの内容を、適切なプロジェクト・フォルダ内に解凍します。MAFによって、これらのプロジェクト・フォルダ内に次のものが格納されます。

- 元の.jprファイル。

- META-INF、public_html、src、adfmsrcなどの標準的なディレクトリ。

- ExternalLibsディレクトリの内容。

注意:

このディレクトリに格納された外部リソースはすべて、インポート済の.maaファイルを使用してパッケージ化されたMAFプロジェクト内で使用できますが、これらのリソースへの参照は、既存のプロジェクト、または.maaファイルをインポートすることによって作成されたプロジェクトに対しては無効になります。

- JARファイル内にパッケージ化されたすべてのJavaクラスを含むclasslibディレクトリ。

注意:

.maaファイルにclasslibディレクトリが含まれている場合、MAFでは、このディレクトリのすべてのJARファイルを、新しく作成されたモバイル・アプリケーションにライブラリ依存性として追加します。

19.8 コマンド行からのモバイル・アプリケーションのデプロイ

JDeveloper IDEを起動しなくても、OJDeployコマンド行ツールを使用して、JDeveloperからiOSまたはAndroidアプリケーションをデプロイできます。コマンド行のデプロイメントは、テストのためのツールとして機能すると同時に、スクリプトを使用したアプリケーションのデプロイ方法として機能します。

デプロイメント・プロファイルのプロパティ・エディタを使用してiOSまたはAndroidデプロイメント・ファイルを作成したら、OJDeployを使用してiOSシミュレータと(iTunes経由で)iOSデバイスに、またはiOSバンドル(.ipaおよび.appファイル)として、あるいは機能アーカイブJARファイルとして、ヘッドレス・モードでアプリケーションをデプロイできます。同様に、OJDeployを使用すると、AndroidエミュレータとAndroidデバイスの両方に、またはAndroidアプリケーション・パッケージ(.apk)・ファイルとして、あるいは機能アーカイブJARファイルとして、アプリケーションをデプロイできます。OJDeployの詳細は、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のコマンド行からのデプロイに関する項を参照してください。

注意:

OJDeployをMac上で使用するには、次の行をojdeploy.confファイルに追加してください。

SetSkipJ2SDKCheck true

このファイルはjdev_install/jdeveloper/jdev/binにあります。

19.8.1 OJDeployを使用したモバイル・アプリケーションのデプロイ

次のコマンドを使用して、MAFのデプロイメント・プロファイルをデプロイできます。

- deployToDevice: iOSデバイスまたはAndroidデバイスにアプリケーションをデプロイします。iOSアプリケーションの場合、このコマンドは、iTunesを使用してアプリケーションがデバイスにデプロイされるデバッグ・シナリオで使用されます。詳細は、第19.4.5項「App StoreへのiOSアプリケーションの配布方法」を参照してください。

- deployToSimulator: アプリケーションをiOSシミュレータに(.appファイルとして)デプロイするか、Androidエミュレータにデプロイします。モバイル・アプリケーションはAppleコンピュータ上のiOSシミュレータにのみデプロイできます。

- deployToPackage: iOSアプリケーションを.ipaファイルとして、またはAndroidアプリケーションを.apkファイルとしてデプロイします。アプリケーションは、Appleコンピュータでのみ、.ipaファイルとしてパッケージ化できます。

- deployToFeatureArchive: 機能アーカイブをJARファイルにデプロイします。

- deployToApplicationArchive: モバイル・アプリケーションをMAFアプリケーション・アーカイブ・ファイル(.maa)としてパッケージ化します。

これらのコマンドは、ojdeployコマンド行ツール、OJDeployの引数およびそのオプションとともに、次のように使用します。

ojdeploy deployToSimulator -profile <profile name> -workspace <jws file location>

注意:

OJDeployコマンドと引数では大文字と小文字が区別されます。

表19-6に、MAFのデプロイメント・コマンドを変更するために使用するOJDeploy引数をリストします。

ヒント:

-helpオプションを任意のコマンドで使用すると(例: ojdeploy deployToSimulator -help)、使用方法と構文に関する情報を取得できます。

表19-6 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スキーマ。

表19-6に示した引数の他に、Oracle Fusion Middleware Oracle JDeveloperによるアプリケーションの開発のコマンドの使用方法の項で説明されているOJDeployオプションを使用することもできます。

注意:

次のオプションはサポートされていません。

- -forcerewrite

- -nocompile

- -nodatasources

- -nodepdendents

- -outputfile

- -updatewebxmlejbrefs

表19-7に、MAFのデプロイメント・コマンドでOJDeployオプションを使用する方法の例を示します。

表19-7 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

表19-8は、deployToApplicationArchiveコマンドとともに使用するマクロを示しています。

表19-8 MAFアプリケーション・アーカイブのパッケージ化に使用するマクロ

マクロ

説明

workspace.name

アプリケーション・ワークスペースのコンテナ・ファイルの名前(.jws拡張子を除く)。

workspace.dir

アプリケーション・ワークスペースのコンテナ(.jws)・ファイルのディレクトリ。

profile.name

デプロイするプロファイルの名前。

profile.dir

プロファイルのデフォルトのデプロイメント・ディレクトリ。

base.dir

このパラメータを使用して、現在のojdeployディレクトリをオーバーライドします。ビルド・スクリプトでbasedir属性を使用して、現在のojdeployディレクトリをオーバーライドできます。

20 セキュアなモバイル開発方法の理解

この章では、モバイル・アプリケーション・フレームワークが、Open Web Application Security Project (OWASP)によって示された一般的なセキュリティ・リスクに対する保護を提供するしくみについて説明します。

この章の内容は次のとおりです。

- 第20.1項「サーバー側の不十分な制御」

- 第20.2項「デバイスでの安全でないデータ格納」

- 第20.3項「不十分なトランスポート・レイヤー保護」

- 第20.4項「サイドチャネルによるデータ漏えい」

- 第20.5項「不十分な認可および認証」

- 第20.6項「不適切な暗号化」

- 第20.7項「クロスサイト・スクリプティングからのクライアント側インジェクション」

- 第20.8項「信頼できない入力に対するセキュリティ決定」

- 第20.9項「不適切なセッション処理」

- 第20.10項「バイナリ保護の欠如による機密情報の漏えい」

20.1 脆弱なサーバー側コントロール

モバイル・アプリケーションにセキュリティを組み込みます。モバイル・アプリケーションの設計における最も初期の段階でも、モバイル・アプリケーションに固有のリスクだけでなく、モバイル・アプリケーションがアクセスするサーバー側リソースに共通するリスクも評価する必要があります。同等のデスクトップ・アプリケーションと同様に、モバイル・アプリケーションは、データを格納するバックエンド・サービスへの攻撃によって脆弱になる可能性があります。このリスクはモバイル・アプリケーションに固有のものではないため、「OWASP Top Ten Project」(https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)に示されている基準は、モバイル・アプリケーションの作成時にも当てはまります。モバイル・デバイスで実行されているクライアント・アプリケーションは脆弱である可能性があるため、これらを使用してアクセス制御を適用しないでください。この機能はサーバー側アプリケーションによって実行される必要があるため、MAFは、クライアントから送信されるデータを検証するための即時利用可能な機能は提供していません。モバイル・アプリケーションに送信されるデータが有効であることを確認する必要があります。詳細は、次を参照してください。

- Oracle Fusion Middleware Oracle Web Services Managerの理解にある、「Webサービスのセキュリティ概念の理解」

- Oracle Fusion Middleware Oracle Web Services Managerの理解にある、「Webサービスのセキュリティ標準」

- Oracle Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護

20.2 デバイスでの安全でないデータ格納

モバイル・アプリケーションの設計に欠陥があれば、ローカル・ファイルがユーザーからアクセス可能となり、デバイスのローカル・ファイル・システムに格納された機密データが公開されてしまう可能性があります。このデータには、ユーザー名とパスワード、Cookie、認証トークンなどがあります。ほとんどのユーザーは自分のデータが脆弱であること、さらにはデバイス自体に格納されていることを認識していませんが、悪意のあるユーザーがツールを使用してローカル・データベースを開き、資格証明を表示することで、この状況を利用する可能性があります。アプリケーションのセキュリティ要件を評価するときは、電話が悪者の手に渡る可能性を想定する必要があります。MAFは、デバイス・データベースおよびローカル・データ・ストアを暗号化することによってデバイスに格納されたデータを保護するAPIを提供しています。

20.2.1 SQLiteデータベースの暗号化

MAFの埋込みSQLiteデータベースは、ローカルに格納されたデータを保護します。MAFアプリケーションは、SQLiteデータバースを共有しません。データベースにアクセスできるアプリケーションは、データベースを作成するアプリケーションのみです。さらに、このデータベースには、正しいユーザー名とパスワードを持つユーザーのみがアクセスできます。AdfmfJavaUtilitiesクラスを使用すると、このデータベースのパスワードを保護するキーを作成するとともに、データベース内に格納されたデータを暗号化することができます。データベースに安全なキーを提供するために、AdfmfJavaUtilitiesクラスには、強力なパスワードを生成してから安全に格納するGeneratedPasswordユーティリティ・クラスが含まれます。また、AdfmfJavaUtilitiesクラスは、パスワードを使用してデータベースを暗号化するためのencryptDatabaseメソッドも提供します。SQLiteデータベースの一般的な情報は、第10章「ローカル・データベースの使用方法」を参照してください。GeneratedPassword、encryptDatabase (およびこれに対応するdecryptDatabase)の詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスおよび第10.2.7項「データベースを暗号化および復号化する方法」を参照してください。サンプル・アプリケーションについては、PublicSamples.zipのStockTrackerサンプルを参照してください(付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照)。

注意:

必ずGeneratedPasswordユーティリティを使用してください。キーをハードコード化しないでください。

20.2.2 デバイスのローカル・データ・ストアの保護

adfmfJavaUtiltiesクラスのgetDirectoryPathRootメソッドを使用して、iOSプラットフォームとAndroidプラットフォームの両方で、プログラムによりファイルをローカル・ファイル・システムに格納できます。このメソッドを使用すると、デバイスでのアプリケーション・データの格納に対して、プラットフォームに依存しないアクセスが可能になります。このメソッドには、次のオプションを使用できます。

- 一時ディレクトリ

- アプリケーション・ディレクトリ

- キャッシュ・ディレクトリ

- ダウンロード・ディレクトリ

ヒント:

ユーザーがデバイスをデスクトップ・コンピュータに同期すると、デバイスのアプリケーション・ディレクトリに格納されたデータが、そのデータを公開できるデスクトップ・システムに転送されます。データを一時ディレクトリに格納してください。iOSでは、iTunesを使用してデバイスが同期されるときに、一時ディレクトリに格納されたデータはデスクトップと同期されません。

セキュリティを必要とするすべてのファイルに対して、Java暗号化API (javax.crypto)を使用して暗号化および復号化を行うことができます。javax.cryptoパッケージの詳細は、Java Platform, Standard Edition 1.4 APIを参照してください。詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスおよび第B.3項「getDirectoryPathRootメソッドを使用したファイル・アクセス」を参照してください。また、iOS Developer Library (https://developer.apple.com/library/)から入手できる『ファイル・システム・プログラミング・ガイド』の「ファイル・システムの基礎」の項も参照してください。

20.2.3 セキュリティおよびアプリケーション・ログについて

デスクトップ・コンピュータと同期された場合に表示できるので、いずれの機密データもログ・ファイルに書込みできないことを確認してください。ユーザーがiOSデバイスをデスクトップ・システムに接続してデータを同期すると、アプリケーション・ログ・ファイルは最終的に、暗号化されていない形式でデスクトップ上に格納されます。Androidデバイスから同期されたログ・ファイルは、Android Device Monitorツールを使用して表示できます。第20.4項「サイドチャネルによるデータ漏えい」も参照してください。

20.3 不十分なトランスポート・レイヤー保護

モバイル・アプリケーションは、プロバイダ・ネットワークを介してデータにアクセスするときにSSL/TLSを使用し、WiFiを使用する場合はこれらのどちらのプロトコルも使用しないことがあります。プロバイダ・ネットワークはハッキングされる可能性があるため、安全であることを想定しないようにしてください。したがって、アプリケーションが機密データをトランスポートするときはSSLを強制し、すべての証明書が有効で公的機関によって署名されていることを確認する必要があります。

モバイル・アプリケーションによって使用されるすべてのエンド・ポイントはSSLによって保護される必要があるため、MAFは、SSLをサポートする一連のWebサービス・ポリシーを提供します。SOAP Webサービスでは、MAFアプリケーションは次のポリシーを使用します。

- oracle/http_basic_auth_over_ssl_client_policy

- oracle/wss_username_token_over_ssl_client_policy

- oracle/wss_http_token_over_ssl_client_policy

MAFは、信頼性のある既知の認証局のエントリによってシードされたcacertsファイルを提供します。アプリケーション開発者は、必要に応じてこのファイルに他の証明書を追加できます。詳細は、第21.8項「SSLのサポート」を参照してください。

20.4 サイドチャネルによるデータ漏えい

意図しないデータ漏えいは、次のような原因で発生する可能性があります。

- スクリーン・ショットの無効化(バックグラウンド実行): iOSおよびAndroidは、アプリケーションの再アクティブ化の認識されるパフォーマンスを高めるために、アプリケーションをバックグラウンドで実行する前にアプリケーションのスクリーン・ショットを取得します。しかし、顧客データの漏えいの可能性があるため、これらのスクリーン・ショットはセキュリティ上の問題の原因となります。

- キー・ストローク・ロギング: iOSおよびAndroidでは、キーボードを使用して入力した情報の一部が、先行入力機能で使用するためにアプリケーション・ディレクトリに自動的に記録されます。この機能は、顧客データの潜在的な漏えいにつながる可能性があります。

- デバッグ・メッセージ: アプリケーションでは、機密データをデバッグ・ログに書き込むことができます。ロギング・レベルを「FINE」に設定すると、ユーザーのデバイスとサーバーの間で転送されるすべてのデータに関してログ・メッセージが書き込まれます。

- アプリケーションの一部として表示される機密ドキュメントに関して、クリップボード・コピーおよび「Open In」機能を無効にします。MAFでは現在、コピーおよびOpen In機能を無効にする機能は提供されておらず、今後のリリースで提供が予定されています。

- 一時ディレクトリ: 機密データが含まれる場合があります。

- サード・パーティ・ライブラリ: これらのライブラリ(adライブラリなど)により、ユーザー、デバイス、ユーザーの場所に関するユーザー情報が漏えいする可能性があります。

データ漏えいを防止するには:

- 資格証明、個人情報(PII)などの機密データをアプリケーション・ログに記録しないようにします。すべての機密情報をネイティブ・キー・チェーン、暗号化データベースまたはファイル・システムに格納します。

- アプリケーションのデバッグ時に、作成されたすべてのファイルおよびそれらのファイルに書き込まれたすべての内容を確認します。

- アプリケーションを公開する前に、デバッグ・メッセージを削除します。

20.5 不十分な認可および認証

不十分な認証メカニズムとクライアント側アクセス制御は両方とも、セキュリティを脅かします。

エンド・ユーザーはユーザー名とパスワードよりも、電話番号またはなんらかのタイプの識別子(IMEI、IMSIまたはUUID)を使用してデバイスを認証する方が簡単ですが、これらの識別子は総当たり攻撃によって容易に検出される可能性があるため、唯一のオーセンティケータとして使用しないようにしてください。かわりにモバイル・アプリケーションは、機密データにアクセスするときは強力な資格証明を使用する必要があります。認証は、デバイスではなくユーザーを反映する必要があります。さらに、コンテキスト識別子(場所など)、音声、フィンガープリントまたは動作情報を使用して認証を強化できます。

開発者は、MAFで提供されているデフォルトのログイン・ページまたは開発者が作成するカスタム・ログイン・ページのいずれかを使用できます。詳細は、第21.5.2項「ログイン・ページの指定方法」を参照してください。

第21.5.1項「認証を要求するようにアプリケーション機能を設定する方法」で説明されているように、安全なアクセスを必要とするMAFアプリケーションのすべての機能は、セキュリティを有効にする必要があります。

さらに、クライアントではなくサーバーによってアクセス制御を強制する必要があります。クライアント・モバイル・アプリケーションがこの機能を担うと、安全性が低下します。アクセス制御サービス(ACS)を使用すると、開発者は、サーバー上で定義されたロール/権限を使用してモバイル・アプリケーションでアクセス制御を強制することができます。アクセス制御サービスは、アプリケーションで有効なユーザー・ロール/権限をフィルタリングするためにアプリケーション開発者が実装できる、RESTfulサービスです。アプリケーションでは数千のユーザー・ロールがサポートされている場合がありますが、このサービスは、モバイル・アプリケーションに対して指定したロールのみを返します。詳細は、第21.4.16項「アクセス制御の構成方法」を参照してください。

20.6 不適切な暗号化

次の理由により、暗号化は不確実なものになります。

1. アプリケーションで間違った実装を使用しているか、または既知のアルゴリズムを不正に使用している。

2. 暗号が容易に解読されるために、データが安全でない。

さらに、Base-64エンコーディング、不明瞭化およびシリアライズは暗号化ではありません(暗号化と誤解しないようにしてください)。

データを正常に暗号化するには:

- 暗号化データと一緒にキーを格納しないでください。

- プラットフォーム固有のファイル暗号化APIまたは別の信頼できるソースを使用します。暗号を自分で作成しないでください。

第20.2項「デバイスでの安全でないデータ格納」に示す暗号化方法を使用して、埋込みSQLiteデータベースを保護するのに加えて、SSLを適用して安全なWebサービス・コールを作成します(第20.3項「不十分なトランスポート・レイヤー保護」を参照)。MAFは資格証明を安全に処理するために、Mobile and Social IDM SDK用にOracle Access Managerを使用します。

20.7 クロスサイト・スクリプティングからのクライアント側インジェクション

モバイル・アプリケーションは様々なソースからコンテンツおよびデータを取り出すため、ユーザー・セッションを乗っ取るクロスサイト・スクリプティング(XSS)インジェクションに対して脆弱である可能性があります。MAFは主にエンコーディングによってXSSを防止しますが、追加の安全策としてホワイトリストを使用します。

ホワイトリストは、許可されたドメインのみがアプリケーション機能のWebビュー内で開くことができるようにして、MAFアプリケーションをCSRF攻撃から保護します。リストに含まれないURIは、自動的にデバイスのブラウザ内、つまりモバイル・アプリケーションのサンドボックス外で開かれます。

インジェクション攻撃に加えて、モバイル・アプリケーションはクロスサイト・リクエスト・フォージェリ(CSRF)に対して脆弱であり、この攻撃では、悪意のあるページが、ユーザーIDを格納するWebブラウザにキャッシュされたCookieを使用して、ユーザーに代わってターゲット・アプリケーションで意図しないアクションを実行します。ホワイトリストとアプリケーション・サンドボックスを組み合せることで、CSRFの問題に対応します。

20.7.1 ホワイトリストを使用したXSSに対するアプリケーションの保護

MAFアプリケーションでは、リモート・サーバーを介してユーザー・インタフェースが配信されるアプリケーションで、XSSおよびCSRF攻撃が発生する場合があります。リモートURLからコンテンツを取得するようにモバイル・アプリケーションを構成するときは、MAFで提供されている概要エディタを使用して、コンテンツを配信するURLのホワイトリストを作成できます。ホワイトリスト内のURLはMAF Webビューで開かれ、指定したデバイス機能およびサービスにアクセスできます。第13.1.1項「ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化」に示すように、ワイルドカードを使用してホワイトリストされたURIを構成できます。

注意:

意図しないURIがデバイス機能にアクセスするのを防止するには、特定のターゲット・ドメインに対してのみホワイトリストを定義します。ホワイトリスト内のドメインを定義するときは、ワイルドカードを慎重に使用してください。広範囲のURIに使用できるワイルドカードベースのホワイトリスト構成は定義しないでください(たとえば、<adfmf:domain>*.*</adfmf:domain>や<adfmf:domain>*.com</adfmf:domain>などの構成は使用しません)。

20.7.2 デバイス・アクセス権限を使用したインジェクション攻撃からのMAFアプリケーションの保護

ホワイトリストに含めたURIは、ユーザーのデバイスに格納されたデータの他、カメラやアドレス帳などの様々なデバイス機能にアクセスできます。第21.6.1項「デバイス機能へのアクセスの有効化方法」に示すようなアクセスは、デフォルトでは付与されていませんが、MAFアプリケーションを構成して、ホワイトリストに含まれるURIがアクセスできるデバイスの機能を次のいずれかに制限できます。

- オープン・ネットワーク・ソケット(ユーザー認証の構成時に許可する必要がある)

- GPSおよびネットワークベースの位置情報サービス

- 連絡先

- 電子メール

- SMS

- 電話

- プッシュ通知

- ローカルに格納されたファイル

ヒント:

ホワイトリスト構成に加えて、updateSecurityConfigWithURLParametersメソッド(ログイン構成の変更を検出してから、再認証によって変更を確認するようにユーザーに求める)を使用して、XSSによって挿入された偽のログイン・ページなどのセキュリティ・リスクから、プログラムによりユーザーを保護することができます(第VI部「実行時の名前付き接続の接続属性の更新方法」を参照)。さらに、MAFはユーザーが保護されたアプリケーション機能を開くたびに、ユーザーに通知します。デフォルト・アプリケーションにセキュリティが適用されないと、認証が遅延する可能性があります。詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスを参照してください。

20.7.3 カスタムHTMLコンポーネントからのインジェクション攻撃のリスクについて

HTMLを使用してMAF AMXページでカスタム・ユーザー・インタフェース・コンポーネントを作成すると、アプリケーションがインジェクション攻撃を受けやすい状態になる可能性があります。MAFは、MAF AMXページのHTMLコンテンツに対して、<amx:verbatim>と<amx:outputHTML>の2つのコンポーネントを提供しています。<amx:verbatim>コンポーネントでは動的HTMLが許可されないため、インジェクション攻撃を受けにくくなります。ただし、ELバインディングによって動的HTMLコンテンツを配信する<amx:outputHTML>コンポーネントは、そのsecurity属性をnoneに構成すると脆弱になる可能性があります。デフォルトでは、onClickイベントなど、フレームワークが様々なHTMLタグをエスケープしてJavaScriptを削除できるように、この属性はhighに設定されています。この属性をnoneに設定すると、iFrameコンポーネントおよびJavaScriptが有効になる(これにより、AMXベージ内でAJAXリクエストが可能になる)ため、HTMLおよびJavaScriptが適切にエンコードされていることを確認する必要があります。詳細は、第6.3.18項「Verbatimコンポーネントの使用方法」および第6.3.19項「出力HTMLコンポーネントの使用方法」を参照してください。また、第20.8項「信頼できない入力に対するセキュリティ決定」も参照してください。

20.7.4 SQLインジェクションおよびXMLインジェクションについて

モバイル・アプリケーションはSQLインジェクションに対して脆弱であるため、攻撃者は埋込みSQLiteデータベースに格納されたデータを読取りできる可能性があります。

SQLインジェクションを防止するには:

- アプリケーション開発者は、ローカル・データベースに格納されたすべてのデータを検証し、エンコードする必要があります。

- アプリケーション開発者は、アプリケーションによって処理されるXMLおよびHTMLコンテンツをエンコードし、検証することが想定されています。

20.8 信頼できない入力に対するセキュリティ決定

iOSプラットフォームとAndroidプラットフォームの両方において、アプリケーション(Skypeなど)は必ずしも外部からの許可をリクエストするとは限らないため、攻撃者にエントリ・ポイントを提供して、悪意のあるアプリケーションがセキュリティを回避してしまう可能性があります。その結果、アプリケーションはクライアント側のインジェクションおよびデータ漏えいに対して脆弱になります。必ず追加の認可を求めるプロンプトを表示するか、あるいは追加の認可が可能でない場合は、保護を必要とするアプリケーションを起動するための追加のステップを提供してください。

アプリケーションが信頼できないサードパーティ・アプリケーションから受信する(またはこれらのアプリケーションに送信する)すべてのデータが、入力検証の対象となっていることを確認する必要があります。アプリケーションに対するクライアント側のXML入力を、エンコードおよび検証する必要があります。MAF AMXコンポーネントではユーザー入力を検証できますが、データはサーバー上で検証する必要があり、サーバーはクライアントから受信するデータを信頼しないようにする必要があります。つまり、サーバーとクライアントの間で送受信されるXML、JSONおよびJavaScriptが適切にエンコードされていることを確認する役割は、サーバーが担います。

別のアプリケーションからMAFアプリケーションを起動するURLスキームを構成するときは、URLを介して送信されるパラメータを検証して、悪意のあるデータまたはURIがMAFアプリケーションに渡される可能性がないことを確認する必要があります。詳細は、第4.4項「カスタムURLスキームを使用したモバイル・アプリケーションの起動」を参照してください。また、第20.1項「脆弱なサーバー側コントロール」も参照してください。

JSON解析について

可能な場合は、MAFのJSONエンコーディングAPIを使用します。カスタムJSON構成を必要とするシナリオでは、ユーザー入力データを使用してJSONを構成するときには注意が必要です。JSONデータの処理の詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスを参照してください。

20.9 不適切なセッション処理

モバイル・アプリケーションのユーザビリティ要件では、多くの場合、長期にわたって継続するセッションが求められます。モバイル・アプリケーションは、セッション管理にCookie、SSOサービスおよびOAUTHトークンを使用します。Oracle Access Management Mobile and Social (OAMMS)では、OAuthトークンがサポートされています。

注意:

OAuthアクセス・トークンは、リモートで取り消すことができます。

適切なセッション処理を有効にするには:

- ログイン・サーバー接続のセッション・タイムアウトを、サーバー側のセッション・タイムアウトよりも小さい値に構成します。
デバイスIDは期限切れになることがないため、セッション・トークンとして使用しないでください。アプリケーションでは、ユーザーが再認証を行う必要が生じても、トークンを期限切れにする必要があります。

- サーバーでのトークン生成時に、適切なベスト・プラクティス(https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Projectの「OWASP Top Ten Project」を参照)に従っていることを確認してください。
容易に予測できるか、または適切に生成されていないセッション・トークンを使用しないでください。セッション・トークンは予測不能で、エントロピが高い必要があります。

Oracle Identity Management (IDM)スタックでは、モバイル・アプリケーションで使用するための標準ベースのトークン(OAuthアクセス・トークン、JWTトークンなど)がサポートされています。MAFでは、Oracle IDM OAuthサーバーに対して即時利用可能なサポートが提供されており、MAFアプリケーションでこのような標準ベースの認証メカニズムを使用することをお薦めします。

第21.4.2項「基本認証の構成方法」で説明されているように、ユーザーがログイン・サーバーに対して認証を行う必要があるアプリケーションの構成には、セッションの持続時間およびアイドル・タイムアウトを設定するオプションが含まれます。デフォルトでは、アプリケーション機能セッションの持続時間は8時間です。アプリケーション機能がアイドル状態にあるデフォルト時間は、5分間です。MAFでは、いずれかの構成期間が過ぎるとユーザー資格証明が期限切れになり、ユーザーに再認証を求めるプロンプトが表示されます。

20.10 バイナリ保護の欠如による機密情報の漏えい

攻撃者はリバース・エンジニアリングを使用して、APIキー、パスワード、機密ビジネス・ロジックなどの機密データを検出できます。この情報を保護するには:

- APIキーおよび機密ビジネス・ロジックをサーバー上に格納します。

- パスワードをアプリケーション・バイナリに格納しないでください。

- パスワードをハードコード化しないでください。かわりに、第20.2項「デバイスでの安全でないデータ格納」で説明されているGeneratedPasswordユーティリティを使用します。

- ログ・ファイルをモニターできるので、アプリケーションが機密情報をログ・ファイルに書き込まないことを確認します。第20.4項「サイドチャネルによるデータ漏えい」も参照してください。

- 情報がファイル・システム上に格納される(つまり、モバイル・アプリケーションの外部に格納される)ことに注意してください。機密データを暗号化されたデータベースまたはファイル・システム、あるいはネイティブ・キー・チェーンに格納します。リスク1:「デバイスでの安全でないデータ格納」も参照してください。

21 モバイル・アプリケーションの保護

この章では、Oracle Mobile Application Frameworkでのセキュリティ・フレームワークの概要について、およびセキュリティが適用されるようにモバイル・アプリケーションを構成する方法について説明します。

この章の内容は次のとおりです。

- 第21.1項「モバイル・アプリケーション・フレームワークのセキュリティについて」

- 第21.2項「ユーザー・ログイン・プロセスについて」

- 第21.3項「モバイル・アプリケーションの認証プロセスの概要」

- 第21.4項「MAF接続の構成」

- 第21.5項「モバイル・アプリケーションのセキュリティの構成」

- 第21.6項「デバイス機能へのアクセスの許可」

- 第21.7項「アプリケーション機能からのユーザーのログアウトの有効化」

- 第21.8項「SSLのサポート」

21.1 モバイル・アプリケーション・フレームワークのセキュリティについて

保護されているアプリケーション機能がアクティブ化されているとき、MAFによってログイン・ページがユーザーに対して表示されます。たとえば、アプリケーション機能がWebビュー内に表示されようとしているときやオペレーティング・システムがアプリケーションをフォアグラウンドに戻したときなどに、ログイン・ページがユーザーに表示されます。MAFは、アプリケーション機能が認証サーバーによって保護されている場合や、アプリケーション機能にユーザー・ロールまたは権限に基づく制約が含まれる場合に、アプリケーション機能へのアクセスで認証が必要かどうかを判断します。MAFは、ユーザーが有効な資格証明を入力した場合にのみ、目的のWebビュー、UIコンポーネントまたはアプリケーション・ページをレンダリングします。

アプリケーション機能のいずれかにこれらの条件がある場合、ユーザーはログインに成功しないとモバイル・アプリケーションにアクセスできないことがありますが、保護されておらず、かつアクセス関連の制約がないデフォルトのアプリケーション機能を含めることによって、保護されているアプリケーション機能と保護されていないアプリケーション機能の両方を含むモバイル・アプリケーションに、ユーザーがアクセスできるようにできます。この状況では、ユーザーは認証なしでMAFアプリケーションにアクセスできます。デフォルトのアプリケーション機能によって、これらの匿名ユーザーに、モバイル・アプリケーションへのエントランス・ポイントが提供され、これらのユーザーは保護されていないデータを表示でき、保護されたアプリケーション機能にアクセスするときには、リモート・サーバーに対して認証されます。保護されていないデフォルトのアプリケーション機能は、次のように指定できます。

- デフォルトのアプリケーション機能を介して公開情報にアクセスすることを匿名ユーザーに許可するが、保護された情報には権限のあるユーザーのみがアクセスできるようにします。

- 保護されたアプリケーション機能にアクセスする必要がある場合にのみユーザーを認証するようにします。そうでない場合、ユーザーは匿名ユーザーとしてモバイル・アプリケーションにアクセスでき、保護された機能に移動するにはログインします。

- 保護されたアクセスが必要でない場合は保護されたアプリケーション機能からログアウトすることをユーザーに許可することで、権限のないユーザーが保護されたアプリケーション機能にアクセスすることを明示的に禁止します。

注意:

MAFでは、アプリケーション・ログイン・プロセスがアプリケーションの初期化フローから切り離されているため、匿名ユーザーが可能となり、ユーザーは認証資格証明を提供する必要なく、匿名ユーザーとしてモバイル・アプリケーションを起動し、保護されていないアプリケーション機能にアクセスできます。このような場合、MAFは権限を持つUIコンポーネントを無効化することによって、ユーザーのアクションを制限します。

詳細は、第21.5.1項「認証を要求するようにアプリケーション機能を設定する方法」および第15.2.4項「ユーザー制約とアクセス制御について」を参照してください。

IDM Mobile SDKは、認証、暗号化、ユーザーとロールの管理、および安全な保管のためのAPIを提供します。SDKでは、Mobile and Socialサーバーによって公開されるBasic認証とREST Webサービスを介した認証がサポートされています。Mobile and Socialサーバーでは、Oracle Access Manager (OAM)サーバーに対するリライイング・パーティ認証(つまり、サードパーティのOpenIdおよびOAuthサービス・プロバイダに対する認証)による厳密認証を使用した(または使用しない)認証、およびディレクトリ・サーバーに対する厳密認証を使用した(または使用しない)認証がサポートされています。

モバイル・アプリケーションでは、デフォルト・ページまたはHTMLで記述されたカスタマイズ済のログイン・ページが使用されます。ログイン・ページ以外での認証が必要な場合、ナレッジベース認証(KBA)がOAMサーバー上に構成されていると、ナレッジベース認証ページを有効にできます。KBA画面では、母の旧姓などの追加情報を要求することで、追加のチャレンジがユーザーに表示されます。ログイン・ページと同様、KBA画面はカスタマイズできます。

21.1.1 制約に基づくアクセス制御について

user.rolesまたはuser.privileges制約を使用して定義されたアプリケーション機能には、特定のロールおよび権限が付与されたユーザーのみがアクセスできます。ユーザーがそのようなアプリケーション機能にログインする場合、アクセス制御サービス(ACS)と呼ばれるWebサービスが、このアプリケーション機能へのアクセスをユーザーに許可するユーザー・オブジェクトを戻します。ACSの詳細は、第21.4.17項「アクセス制御サービスに関する必知事項」を参照してください。

21.2 ユーザー・ログイン・プロセスについて

エンド・ユーザーの視点からは、ログイン・プロセスは次のようなものになります。

1. ユーザーが保護されたアプリケーション機能にアクセスしようとすると、常に、図21-1に示すログイン・ページのWebビューがMAFによって表示されます。保護されたアプリケーション機能がデフォルトである場合は、ユーザーがモバイル・アプリケーションを起動すると、MAFによってログイン・ページが表示されます。

図21-1 ログイン・ページ

注意:

第21.5.4.2項「カスタム・ログイン・ページ」で説明されているとおり、MAFでは、デフォルト・ログイン・ページを表示するだけでなく、カスタム・ログイン・ページおよびオプションのカスタム・ナレッジベース認証(KBA)画面の使用もサポートされています。

2. ユーザーがユーザー名とパスワードを入力し、「OK」をクリックします。

注意:

MAFでは、複数のユーザーが同じアプリケーションを使用できます。ユーザーは、前のユーザーのログアウト後、自由にアプリケーションにログインできます。

3. ユーザー名とパスワードが検証されると、MAFによって、目的のWebビュー、ページまたはユーザー・インタフェース・コンポーネントが表示されます。

4. MAFは、ユーザーが正常にログインするまで、ユーザー名とパスワードの入力を求めます。ユーザーがログインできない場合、別のアプリケーション機能に移動することのみが可能です。

5. ユーザー名とパスワードの認証後、追加の質問による資格証明をチャレンジするナレッジベース認証(KBA)画面がユーザーに表示される場合があります。KBAが構成されている場合、ログイン・プロセスを完了するには、ユーザーが質問に正しく答える必要があります。KBAはオプションの構成で、OAMサーバー上での適切な構成が必要となります。

注意:

アプリケーション機能が最後にアクティブ化されて以降、事前定義された時間が経過すると、認証はタイムアウトになります。MAFでは、認証サーバーへの接続を使用するアプリケーション機能のいずれかがアクティブ化されたときのみ、アイドル・タイムアウトのタイマーの期限が更新されます。

21.3 モバイル・アプリケーションの認証プロセスの概要

モバイル・アプリケーションでは、リモート・ログイン・サーバー(Oracle ADF Fusion Webアプリケーションによって使用されるOracle Access Managerアイデンティティ・サーバーなど)、またはユーザーのデバイス上に存在するローカル資格証明ストアに対するユーザー資格証明の検証が必要になる場合があります。ローカルおよびリモート接続モードをサポートするため、MAFでは次の認証プロトコルがサポートされています。

- HTTP Basic

- Mobile-Social

- OAuth

- Web SSO

デフォルトでは、モバイル・アプリケーション・ユーザーの認証は、デザインタイムに選択された認証プロトコルに関係なく、リモート・ログイン・サーバーに対して行われます。開発者は、Oracle Access Management Mobile and Social (OAMMS)およびBasic認証の場合に、ローカル認証を有効化するようアプリケーションを構成できます。ただし、最初は、ローカル資格証明ストアに資格証明が移入されていないため、ログインして保護されたアプリケーション機能にアクセスする場合、リモート・ログイン・サーバーに対する認証が必要となります。リモート認証に成功すると、以降は(デバイス上の認証サーバーからのユーザーのログイン資格証明が格納されている)ローカル資格証明ストアを使用できるようになります。このように、ユーザーが同じアプリケーション・セッション内(つまり、アプリケーション実行のライフサイクル内)でサーバーに対して認証されると、MAFはこの認証コンテキストをローカルに格納し、以降の認証試行に使用できるようにします。この場合、ローカルの認証コンテキストで問題なくユーザーを認証できるときには、MAFはサーバーに接続しません。最初の認証では認証サーバーへの接続が必要ですが、ローカル認証を使用するアプリケーションの場合はそのサーバーに頻繁にアクセスする必要はありません。

ヒント:

ローカル資格証明ストアに対する認証は、リモート・ログイン・サーバーに対する認証よりも高速で実行できますが、リモート接続のみをサポートするOAuthやWeb SSO認証プロトコルを使用した認証をお薦めします。

表21-1に、MAFアプリケーションのログイン構成オプションをまとめます。接続モードは、選択した認証プロトコルによって異なります。

表21-1 MAFの接続モードおよびサポートされている認証プロトコル

接続モード

サポートされているプロトコル

モードの説明

ローカル

- HTTP Basic

- Mobile-Social

ローカルに格納されている資格証明がデバイスで使用不可能な場合にのみ、アプリケーションでリモート・ログイン・サーバーに対する認証を行う必要があります。最初のログインは、常にリモート・ログイン・サーバーに対して行われます。最初のログインが成功すると、MAFは、資格証明をデバイスの資格証明ストア内にローカルに保持します。アプリケーション機能への以降のアクセスでは、それらの資格証明が使用されます。第21.4.15項「Webサービス・セキュリティに関する必知事項」も参照してください。

リモート

- HTTP Basic

- Mobile-Social

- OAuth

- Web SSO

アプリケーションで、Oracle Access Manager (OAM)アイデンティティ・サーバーなどのリモート・ログイン・サーバーまたは保護されているWebアプリケーションに対する認証が必要です。ユーザーがログインするたびに、リモート・サーバーに対する認証が求められます。デバイスがサーバーに接続できない場合、ユーザーは、前回は正常に認証されていても、アプリケーションにログインすることはできません。

ハイブリッド

- HTTP Basic

- Mobile-Social

ネットワーク接続が使用可能である場合は、デバイス上のローカル資格証明がで使用可能でも、アプリケーションでリモート・ログイン・サーバーに対する認証を行う必要があります。ネットワーク接続が切断されてログイン・サーバーにアクセスできない場合にのみ、デバイス上のローカル資格証明が使用されます。

例として、次のプロセスは、Mobile-Social認証プロトコルがリモート認証サーバーに対してユーザー資格証明を確認するようにモバイル・アプリケーションが構成されている場合に、セキュリティのフローを表しています。

1. MAFは、(図21-1のような)ログイン・ページ、またはナレッジベース認証画面をユーザーに表示します。

2. Oracle Access Management Mobile and Social (OAMMS)クライアントSDKのAPIは、認証サーバーと、デバイス上の資格証明ストア(保存済のユーザー・オブジェクトが格納されている場合があります)の両方に対する資格証明認証を処理します。認証に成功すると、APIは有効なユーザー・オブジェクトをMAFに戻します。それ以外の場合は、失敗を戻します。

注意:

OAMMSにログインすると、ロールおよび権限コレクションがuserオブジェクトに移入されます。

3. ログインに成功すると、MAFは、Cookieで使用されるOAMトークンを受け取ります。各ログイン接続にCookieが設定されます。

4. OAMMSクライアントSDK APIは、デバイスのローカル資格証明キーストアに資格証明をキャッシュします。アプリケーション・セッション・タイムアウトまたはアイドル・タイムアウトのしきい値を超えると、MAFはローカル資格証明キーストアを消去します。

5. ログインに失敗した場合、ログイン・ページまたはKBA画面が表示されたままになり、ユーザーは先に進むことができません。

21.4 MAF接続の構成

セキュリティが適用されるアプリケーション機能用に、アプリケーション・ログイン・サーバーへの接続を少なくとも1つ定義する必要があります。アプリケーション・ログイン・サーバーへの定義済の接続が存在しないと、無効な構成になります。その結果、アプリケーションは正しく機能しません。

21.4.1 MAFログイン接続の作成方法

図21-2に示すように、MAF接続の作成ダイアログを使用して接続タイプを選択し、接続タイプに応じて、ローカルおよびリモート認証の両方を有効化します(ハイブリッド)。アプリケーション要件に応じて、次の認証プロトコルをサポートするサーバーへの接続を構成できます。

- HTTP Basic

- Mobile-Social

- OAuth

- Web SSO

注意:

OAuthまたはWeb SSO接続タイプを使用したログイン・サーバーへの接続を構成することをお薦めします。OAuthおよびWeb SSOでは、リモート・ログイン・サーバーに対する認証が必要となり、デバイス上でのローカル資格証明ストアからの認証をユーザーに許可しません。

図21-2 認証の構成

ログイン・サーバー接続を作成するには:

1. 次のアクションのいずれかを実行します。

- ナビゲータで、「ディスクリプタ」ノード、「ADF META-INF」と開き、maf-application.xmlをダブルクリックします。次に、maf-application.xmlファイルの概要エディタで、図21-3に示すように、「認証とアクセス制御」セクションを開き、「追加」をクリックします。

図21-3 サーバー接続の追加

注意:

maf-application.xmlファイルの概要エディタでは、アプリケーション・ログイン・サーバー接続を定義し、それをデフォルトのアプリケーション機能に割り当てることができます(デフォルトのアプリケーション機能が保護されている場合)。この場合、アプリケーション・ログイン・サーバーで指定される資格証明は、アクセス制御サービス(ACS)を介してユーザー、ロールおよびサービスを検索するためにも使用されます。第21.4.17項「アクセス制御サービスに関する必知事項」も参照してください。

- または、「新規ギャラリ」で「接続」を選択し、「MAFログイン・サーバー接続」を選択します。

2. 「MAFログイン接続の作成」ダイアログで、目的の「認証サーバー・タイプ」を選択します。

3. 次の項の説明に従って接続タイプを構成します。
ダイアログに表示される、アスタリスクが付いたオプションは必須フィールドであることに注意してください。このダイアログでは、すべての必須フィールドが入力された後にのみ「接続のテスト」ボタンが有効になります。このボタンは、Basic認証がダイアログで選択されている場合にのみ表示されます。

21.4.2 Basic認証の構成方法

図21-4に示すように、「MAFログイン接続の作成」ダイアログで「HTTP基本」認証サーバー・タイプを選択して、Basic認証の接続を構成できます。

図21-4 Basic認証の構成

Basic認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「HTTP基本」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第21.4.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を定義します。

- 接続モード: 表21-1に示すように、認証のタイプを選択します。

- 接続名: 接続の名前を入力します。

- アイドル・タイムアウト: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:

MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を実行しますが、セッション・タイムアウト後にこの認証を実行することはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- ログイン最大試行回数: ローカル資格証明がクリアされるまでにユーザーに許可する最大ログイン試行失敗回数を設定します。デフォルトで、MAFは、ユーザーに3回のログイン試行の失敗を許可しており、それを超えると、ローカルに格納されているそのユーザーの資格証明をクリアし、以降のログイン試行では、リモート・ログイン・サーバーに接続します。リモート・サーバーに接続した後は、そのユーザーに許可されるログイン試行回数は無制限になります。
ユーザーがログイン試行を指定した回数失敗すると、ローカル資格証明がクリアされるため、MAFはサーバーに対して認証を実行します。これにより、ユーザーは、管理者がユーザーのパスワードを変更した後、パスワードがデバイス上にまだ格納されていない状態で、この新しいパスワードを使用してログインできるようになります。ローカル認証が許可されている場合、ユーザーがサーバー接続へのログインに成功するとパスワードはデバイス上に安全に格納されます。

注意:

アプリケーション機能がローカル認証を使用するように構成されている場合でも、MAFは、ローカルに格納されているユーザー資格証明をクリアします。

- RESTコールにログイン・サーバーのCookieを含める: リモート認証を使用するアプリケーション機能の場合、ログイン・サーバーが生成したユーザー・セッションCookieを使用してログイン・サーバーに格納されている認可済のユーザーのデータを取得するために、このオプションを選択してREST Webサービスを有効にします。詳細は、第21.4.12項「REST Webサービス・コールへのCookieの追加に関する必知事項」を参照してください。

注意:

REST Webサービス・コールへのCookieの挿入を可能にするには、アプリケーション機能でリモート認証を使用する必要があり(MAFでは、ユーザー資格証明をローカルに格納するアプリケーション機能の場合はCookieの挿入がサポートされていません)、「ログインURL」に入力されたドメインはREST Webサービス・エンド・ポイントのドメインと同じである必要があります。

- HTTPリクエストに基本認証ヘッダーを含めます: Webビューから発行されたHTTPリクエスト内に基本認証ヘッダーをMAFが追加できるようにする場合、このオプションを選択します。Basic認証は、MAFで使用されるデフォルトのリクエスト・メソッドです。基本認証ヘッダーは、ログイン接続タイプがHTTP基本である場合にのみ挿入されます。第21.4.14項「基本認証ヘッダーの挿入に関する必知事項」も参照してください。

3. 図21-5に示すように、「HTTP基本」タブをクリックして、次を構成します。

- マルチテナント対応: MAFでは、1つのモバイル・アプリケーションに異なる組織(テナント)で共有可能な1つのホスト・アプリケーション機能が含まれ、それが特定のテナントによって所有されているように見える、マルチテナントの概念がサポートされています。このオプションを選択して、モバイル・アプリケーション接続にマルチテナント対応を定義できます。第21.4.19項「マルチテナント接続の定義時に行われる処理」も参照してください。

- ログインURL: 認証サーバーのログインURLを入力します。

- ログアウトURL: 認証サーバーのログアウトURLを入力します。

図21-5 Basic認証の構成

4. 「自動ログイン」タブをクリックし、第21.4.8項「ログイン資格証明の格納方法」の説明に従って、パラメータを構成します。

5. 「認可」タブをクリックし、第21.4.16項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

6. 「一般」タブをクリックし、「接続のテスト」をクリックします。

7. 「OK」をクリックします。

21.4.3 Oracle Mobile and Social Identity Managementを使用して認証を構成する方法

図21-6に示すように、「MAFログイン接続の作成」ダイアログで「Mobile-Social」認証サーバー・タイプを選択して、Oracle Access Manager (OAM)サーバーで認証を行うようにモバイル・アプリケーションの接続を構成できます。この接続タイプのOAMバックエンドでは、Oracle Mobile and Socialサーバーおよび10g WebGate (リソースに対するHTTPリクエストを捕捉して、認証と認可のためにOAMサーバーに転送するWebサーバー・プラグイン)を実行している必要があります。

図21-6 Mobile-Socialでの認証の構成

始める前に

OAMバックエンドがOracle Mobile and Socialサーバーおよび10g Webgateを実行していることを確認します。

OM_PROP_OAMMS_URLプロパティ・キーを使用するようにサーバーを構成します。このURL (プロトコル、ホスト名およびポート番号を含む)は、Mobile and Socialサーバーにアクセスするために必要です。HTTPおよびHTTPSプロトコルのみがサポートされています。OAM_ID CookieをWebサーバー・リクエスト・ヘッダーに挿入するようにサーバーを構成する必要もあります。

注意:

この接続タイプでは、KBA (ナレッジベース認証)が必要です。詳細は、第21.5.2項「ログイン・ページの指定方法」を参照してください。

Oracle Mobile and Socialサーバーを介したOracle Access Managementでの認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「Mobile-Social」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第21.4.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を定義します。

- 接続モード: 表21-1に示すように、認証のタイプを選択します。

- 接続名: 接続の名前を入力します。

- アイドル・タイムアウト: MAFがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。この状況では、ユーザーが再度その機能にアクセスすると、MAFによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ログイン・ページが表示されます。

注意:

MAFは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を実行しますが、セッション・タイムアウト後にこの認証を実行することはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

- ログイン最大試行回数: ローカル資格証明がクリアされるまでにユーザーに許可する最大ログイン試行失敗回数を設定します。デフォルトで、MAFは、ユーザーに3回のログイン試行の失敗を許可しており、それを超えると、ローカルに格納されているそのユーザーの資格証明をクリアし、以降のログイン試行では、リモート・ログイン・サーバーに接続します。リモート・サーバーに接続した後は、そのユーザーに許可されるログイン試行回数は無制限になります。
ユーザーがログイン試行を指定した回数失敗すると、ローカル資格証明がクリアされるため、MAFはサーバーに対して認証を実行します。これにより、ユーザーは、管理者がユーザーのパスワードを変更した後、パスワードがデバイス上にまだ格納されていない状態で、この新しいパスワードを使用してログインできるようになります。ローカル認証が許可されている場合、ユーザーがサーバー接続へのログインに成功するとパスワードはデバイス上に安全に格納されます。

注意:

アプリケーション機能がローカル認証を使用するように構成されている場合でも、MAFは、ローカルに格納されているユーザー資格証明をクリアします。

- RESTコールにログイン・サーバーのCookieを含める: リモート認証を使用するアプリケーション機能の場合、ログイン・サーバーが生成したユーザー・セッションCookieを使用してログイン・サーバーに格納されている認可済のユーザーのデータを取得するために、このオプションを選択してREST Webサービスを有効にします。詳細は、第21.4.12項「REST Webサービス・コールへのCookieの追加に関する必知事項」を参照してください。

注意:

REST Webサービス・コールへのCookieの挿入を可能にするには、アプリケーション機能でリモート認証を使用する必要があり(MAFでは、ユーザー資格証明をローカルに格納するアプリケーション機能の場合はCookieの挿入がサポートされていません)、「ログインURL」に入力されたドメインはREST Webサービス・エンド・ポイントのドメインと同じである必要があります。

3. 「Mobile-Social」タブをクリックし、Oracle Access Management Mobile and SocialサーバーへのURLを入力し、モバイル・アプリケーション・サービス・ドメインを入力します。
また、図21-7に示すように、デバイスでの位置の更新をサーバーで有効化するように接続を構成することもできます。

図21-7 OAM認証の構成

4. 「自動ログイン」タブをクリックし、第21.4.8項「ログイン資格証明の格納方法」の説明に従って、パラメータを構成します。

5. 「認可」タブをクリックし、第21.4.16項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

21.4.4 OAuth認証の構成方法

図21-8に示すように、「MAFログイン接続の作成」ダイアログを使用して、サードパーティ・アプリケーション(クライアント)がリモート・サーバーに格納されている保護されたデータまたはサービスへの制限付きアクセスを取得する方法を構成できます。Oracle Mobile and Socialサーバーが提供するリライイング・パーティ認証では、アプリケーションがサードパーティOAuthプロバイダに対する認証を実行できます。Oracle Web Services Manager (OWSM) Lite MobileのADFアプリケーション・エージェントは、Webサービス・コールのセキュリティ・ヘッダーにCookieを挿入します。

図21-8 OAuthの構成

始める前に

OM_PROP_OAUTH_OAUTH20_SERVERプロパティ・キーを使用するようにサーバーを構成します。

OAuthサーバーでの認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「OAuth」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第21.4.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を構成します。

- 接続名: 接続の名前を入力します。

3. 「OAuth」タブをクリックし、図21-9に示すように、次を構成します。

- 「権限タイプ」を選択し、アプリケーションがログイン・ページを取得する場所を決定します。サーバー・ログイン・ページを表示する場合は、「認可コード」を選択します。MAFアプリケーションでデフォルト・ログイン・ページまたはカスタム・ログイン・ページ(構成されている場合)を表示する場合は、「リソース所有者の資格証明」を選択します。

- 「クライアント識別子」を入力し、オプションで、「クライアント・シークレット」フィールドに接続パスワード値を入力します。

- 認可サーバーの「リダイレクト・エンドポイント」およびそのエンドポイントのURIを認可サーバー・エンドポイント自体および「トークン・エンドポイント」に入力します。

- アプリケーション内の組込みブラウザにログイン・ページを表示する場合は、「埋込みブラウザ・モードの有効化」を選択します。外部ブラウザにログイン・ページを表示する場合は選択を解除します。シングル・サインオン(SSO)が必要となる場合は、このオプションを選択解除して、アプリケーションによって外部ブラウザが使用されるようにします。

図21-9 クライアントIDおよびエンド・ポイントの構成

4. 「認可」タブをクリックし、第21.4.16項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

21.4.5 Web SSO認証の構成方法

図21-10に示すように、「MAFログイン接続の作成」ダイアログを使用して、クロスドメイン・シングル・サインオンを構成できます。

図21-10 フェデレーテッドSSO認証の構成

Web SSOサーバーでの認証を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「Web SSO」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第21.4.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を構成します。

- 接続名: 接続の名前を入力します。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、MAFは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

3. 「Web SSO」タブをクリックし、図21-11に示すように、成功したログインおよび失敗したログインを有効化するURLを構成します。

図21-11 認証URLの構成

4. 「認可」タブをクリックし、第21.4.16項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

21.4.6 MAFアプリケーション・ログイン用プレースホルダ接続の構成方法

図21-12に示すように、「MAFログイン接続の作成」ダイアログを使用して、開発時に名前付き接続を作成し、実行時にログイン属性を移入してこの接続の定義を完成させることができます。この接続タイプは、デザインタイムに接続属性の一部がわからない場合に特に便利です。

アプリケーション開発者は、AdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIを使用して、第21.4.7項「実行時に名前付き接続の接続属性を更新する方法」の説明に従って、デザインタイムに作成されたプレースホルダ接続を完全に定義する必要があります。

図21-12 プレースホルダ接続の構成

実行時に定義するためのプレースホルダ接続を構成するには:

1. 「MAFログイン接続の作成」ダイアログの「認証サーバー・タイプ」で「実行時に値を指定」を選択します。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第21.4.1項「MAFログイン接続の構成方法」を参照してください。

2. 「一般」タブで、次を構成します。

- 接続名: 接続の名前を入力します。アプリケーション開発者はこの識別子を使用して、第21.4.7項「実行時に名前付き接続の接続属性を更新する方法」の説明に従って、更新する接続を識別します。

- RESTコールにログイン・サーバーのCookieを含める: リモート認証を使用するアプリケーション機能の場合、ログイン・サーバーが生成したユーザー・セッションCookieを使用してログイン・サーバーに格納されている認可済のユーザーのデータを取得するために、このオプションを選択してREST Webサービスを有効にします。詳細は、第21.4.12項「REST Webサービス・コールへのCookieの追加に関する必知事項」を参照してください。

注意:

REST Webサービス・コールへのCookieの挿入を可能にするには、アプリケーション機能でリモート認証を使用する必要があり(MAFでは、ユーザー資格証明をローカルに格納するアプリケーション機能の場合はCookieの挿入がサポートされていません)、「ログインURL」に入力されたドメインはREST Webサービス・エンド・ポイントのドメインと同じである必要があります。

- HTTPリクエストに基本認証ヘッダーを含めます: 接続タイプがBasic認証を使用して、Webビューから発行されたHTTPリクエスト内に基本認証ヘッダーをMAFが追加できるようにする場合、このオプションを選択します。Basic認証は、MAFで使用されるデフォルトのリクエスト・メソッドです。基本認証ヘッダーは、ログイン接続タイプがHTTP基本である場合にのみ挿入されます。第21.4.14項「基本認証ヘッダーの挿入に関する必知事項」も参照してください。

3. 「認可」タブをクリックし、第21.4.16項「アクセス制御の構成方法」の説明に従って、パラメータを構成します。

21.4.7 実行時に名前付き接続の接続属性を更新する方法

アプリケーション開発者は、AdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIを使用して、プレースホルダ(図21-12に示すように「MAFログイン接続の作成」ダイアログで「実行時に値を指定」を選択した場合)、または完全に設定された接続定義のいずれかによって、すでに存在する接続の接続属性を定義または再定義できます。

注意:

通常のタイミングでは、アプリケーション・ライフサイクル・リスナー内のstart()メソッド実装でAdfmfJavaUtilities.updateSecurityConfigWithURLParameters APIをコールします。このメソッドを機能ライフサイクル・リスナー内からコールしないでください。

configUrlParamパラメータに関連付けられた接続属性を更新するには、updatedSecurityConfigWithURLParametersメソッドを次のようにコールします。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.updateSecurityConfigWithURLParameters(configUrlParam,
key, message, showConfirmation);

keyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして設定されます。このメソッドをshowConfirmationパラメータをtrueに設定して呼び出すと、MAFが既存の接続の属性に対する接続構成の変更を検出した場合にエンド・ユーザーに確認のプロンプトを表示できるようになります。

AdfmfJavaUtiltiesクラスおよびconfigUrlParamパラメータの使用の詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

21.4.8 ログイン資格証明の格納方法

セキュリティが重要でない場合、MAFではユーザー資格証明を格納することがサポートされており、これを(ログイン接続で定義したモードに応じて)ログイン・サーバーに対してリプレイしたり、ユーザーのローカル認証に使用することができます。資格証明を格納すると、ユーザーはログインしないでモバイル・アプリケーションにアクセスできるようになるため、ユーザーの操作性が向上します。IDM Mobile SDKにより、MAFは次のモードをサポートできるようになります。

- 自動ログイン: MAFは、ユーザー資格証明をキャッシュし、これらを以降の認証で認証サーバーに対してリプレイします。このモードでは、ユーザーは、MAFによって資格証明の入力や確認を求められることなくアプリケーションを起動できます。ただし、MAFは新しいアプリケーション・セッションが開始されたことをユーザーに知らせることができます。

- 資格証明を記憶: MAFはユーザー資格証明をキャッシュし、ログイン・ページのユーザー名フィールドとパスワード・フィールドに移入します。ユーザーがログイン・ボタンをタップしてこれらの資格証明を確認すると、MAFはそれらを認証サーバーに対してリプレイします。

- ユーザー名を記憶: MAFはユーザー名をキャッシュし、ログイン・ページのユーザー名フィールドに移入します。ユーザーがパスワードを入力し、ログイン・ボタンをタップして確認すると、MAFはこれらの資格証明を認証サーバーに対してリプレイします。

注意:

ユーザーは、これらの資格証明をMAFが格納するかどうかを決定できます。

図21-13に示すように、「MAFログイン接続の作成」ダイアログの「自動ログイン」ページを使用して、資格証明格納オプションを選択できます。資格証明オプションを選択すると、ユーザー名とパスワードを記憶するオプションによってログイン・ページが設定されるため、デバイスを複数のエンド・ユーザーが共有する場合は選択しないでください。

図21-13 ユーザー資格証明のキャッシュ

21.4.9 ローカルおよびハイブリッド・ログイン接続の場合の複数のアイデンティティに関する必知事項

リモート接続と同様、ローカルおよびハイブリッド・ログイン接続モードでは、ユーザーは、アプリケーション・ライフサイクル内で、任意の数のアイデンティティを使用してログインおよびログアウトできます。これらの接続モードを使用するようにログイン接続を定義すると、現在のセッションのタイムアウト期間内に、保護されているアプリケーション機能に前にログインしたユーザーは、ローカル資格証明ストアを使用して、保護されているアプリケーション機能に再びログインできます。この場合、明示的にログアウトしたユーザー、またはアイドル・タイムアウトが経過したためにログアウトしたユーザーは、保護されているアプリケーション機能(またはそのアプリケーション機能を保護しているログイン・サーバーにより保護されている他のアプリケーション機能)に再びログインできます。

注意:

ローカルおよびハイブリッド接続は、Basic認証、およびOracle Access Management Mobile and Social (OAMMS)への認証にのみ使用できます。OAuthおよびフェデレーテッドSSOは、リモート認証を使用するため、アプリケーション・ユーザーは、認証に成功しないかぎり、再びログインすることはできません。

21.4.10 MAFアプリケーションおよび認証モードの移行に関する必知事項

MAFアプリケーションを移行する場合、maf-feature.xmlで定義されている認証モード(<adfmf:feature id="feature1" name="feature1" credentials="remote">など)が、connections.xmlファイルのauthenticationMode属性で定義されていることを確認する必要があります。credentials属性の存在を検出するJDeveloperの監査ルールを使用すると、その属性をmaf-feature.xmlから削除するのに役立ちます。

connections.xmlファイルのauthenticationMode属性は、remoteまたはlocalとしてのみ定義できるため、none (<adfmf:feature id="feature1" name="feature1" credentials="none">)の値を移行しないでください(移行すると、デプロイメントが失敗します)。

21.4.11 REST Webサービス・コールへのCookieの挿入を可能にする場合の処理

図21-15に示されているように、「MAFログイン接続の作成」ダイアログで「RESTコールにログイン・サーバーのCookieを含める」オプションを選択すると、MAFは、ログイン・サーバーによって送信されたこのユーザー・セッションCookieを取得し、それをモバイル・アプリケーションから開始されたREST Webサービス・コールのHTTPヘッダーに挿入します。

モバイル・アプリケーションがREST Webサービスを要求するたびに、MAFのセキュリティ・フレームワークは、REST Webサービスのトランスポート・レイヤーが、REST WebサービスのURLエンド・ポイントに関連付けられているログイン接続に対してCookieの挿入が可能かどうかをチェックできるようにします。つまり、例21-4に示されているように、connections.xmlファイルに<injectCookiesToRESTHttpHeader value="true"/>が含まれている必要があります。

接続でCookieの挿入が許可されており、ログイン・サーバーとREST Webサービス・エンド・ポイントのドメインが一致している場合、セキュリティ・フレームワークによって、ユーザーがアプリケーション機能にログインしたときに格納されたCookieが取得されます。MAFは、REST Webサービス・リクエストのドメインに格納されているすべてのCookieを伝播します。MAFは、Rest Webサービス・レスポンス内のSet-CookieヘッダーごとにCookieを格納します。Set-Cookieヘッダーでは、Cookieをストアに追加するか、または名前が同じである場合は既存のCookieを新しいCookieに置き換えます。REST Webサービス・レスポンスによって戻されたCookie、および認証プロセスで戻されたCookieは、以降のREST Webサービス・リクエストに挿入されます。

注意:

MAFは、(プラットフォーム固有のCookieストアから名前でCookieを戻す) Oracle Access Management Mobile and Social (OAMMS) APIをコールすることで、Cookie文字列を作成します。IDM Mobile SDKは、認証サーバーによって戻されたCookieを管理します。それらの名前は、connections.xmlファイルで定義されます。

21.4.12 CookieをREST Webサービス・コールに追加することに関する必知事項

ユーザーがモバイル・アプリケーションによって正常に認証されると、ログイン・サーバーは、そのユーザーのセキュリティ・コンテキストを作成し、ユーザー・セッションを追跡するCookieを生成します。図21-15に示されているように、「MAFログイン接続の作成」ダイアログで「RESTコールにログイン・サーバーのCookieを含める」オプションを選択すると、MAFは、ログイン・サーバーによって送信されたこのユーザー・セッションCookieを取得し、それをモバイル・アプリケーションから開始されたREST Webサービス・コールのHTTPヘッダーに挿入します。

CookieをWebサービス・コールに伝播することで、ログイン・サーバーに格納されているユーザーのセキュリティ・コンテキストを取得し、モバイル・アプリケーションがREST Webサービスを使用して、そのユーザーに対して認可されているアプリケーション・データにアクセスできるようになります。ユーザー・セッションCookieが期限切れになると、MAFは、ユーザーに資格証明を要求し、ユーザーを再認証します。再認証されたユーザーは、引き続き、REST Webサービス・コールを介して認可済のアプリケーション・データにアクセスできます。

21.4.13 実行時に行われる処理: MAFがREST Webサービスをコールした場合

ユーザーがローカルに認証されると、MAFはモバイル・アプリケーションがREST Webサービスをコールしたときにログイン・サーバーに対してユーザーをサイレントに認証します。ユーザーの資格証明が認証されると、MAFはREST Webサービスに対するアプリケーションのリクエストを実行します。REST Webサービスが401ステータス・コード(未許可)を戻した場合、MAFはユーザーに再度の認証を指示します。REST Webサービスが302コード(検出または一時的に移動されました)を戻した場合、MAFはログイン・サーバーをチェックして、ユーザーが認証されているかどうかを確認します。そうである場合、コードは302リダイレクトとして処理されます。

ユーザーがログイン・サーバーに対して認証されていない場合、MAFはユーザーに再度の認証を指示します。場合によっては、ログイン・サーバーが、302ステータス・コードを戻したときに、サーバー独自のWebページを使用した認証をユーザーに指示する場合があります。MAFでは、このような場合のリダイレクションをサポートしておらず、かわりにMAFログイン・ページを使用して再度ログインすることをユーザーに指示します。

21.4.14 基本認証ヘッダーの挿入に関する必知事項

サーバーがCookieを受け付けない場合、Webビューから発行されたHTTPリクエスト内に基本認証ヘッダーを挿入することによって、アプリケーション機能がセキュア・リソースにアクセスすることを可能にします。デフォルトでは、MAFはBasic認証を使用します。「HTTPリクエストに基本認証ヘッダーを含めます」オプションがデフォルトで選択されているため、Webビューから発行されたHTTPリクエスト内に基本認証ヘッダーを挿入することによって、MAFはアプリケーション機能がセキュア・リソースにアクセスすることを可能にします。

注意:

MAFによって基本認証ヘッダーが挿入されないようにするには、<injectBasicAuthHeader>要素のvalue属性をfalseに設定します。

ユーザー名とパスワードの認証レルムを定義すると、connections.xmlファイルに定義した<realm>要素が移入されます。例21-1に示すように、MAFは、connections.xmlファイルにこれらの定義が含まれているかどうかに関係なく、ヘッダーを追加します。

例21-1 connections.xmlファイルを使用した、基本認証ヘッダーの挿入

<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="connection1"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="connection1"
partial="false" manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className=
"oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://www.us.example.com/userInfo"/>
<logout url="http://www.us.example.com/userInfo"/>
<accessControl url="http://10.0.0.0/identity/authorize"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<cookieNames/>
<realm value="Secure Area"/>
<injectBasicAuthHeader value="true"/>
<userObjectFilter/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

21.4.15 Webサービス・セキュリティに関する必知事項

Webサービス用のログイン・ページはなく、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービス・コールのヘッダーに資格証明が挿入されます。Webサービスは、ローカルに格納されている資格証明(ユーザーによる認証サーバーへの最初のログインの成功後、MAFによって保持されている資格証明)を使用してアプリケーション・データにアクセスします。ローカル資格証明ストアの名前は、ログイン・サーバー接続のadfCredentialStoreKey属性によって示されます(例21-4ではadfCredentialStoreKey="Connection_1")。Webサービスがこの資格証明ストアを使用できるようにするには、SOAPまたはREST Webサービス接続のadfCredentialStoreKey属性に対して定義されている名前が、ログイン・サーバーのadfCredentialStoreKey属性に対して定義されている名前と一致する必要があります。

注意:

connections.xmlファイルの概要エディタはないため、「プロパティ」ウィンドウを使用して、<Reference>要素のadfcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新できます。または、「ソース」エディタを使用して属性を追加または更新できます。

詳細は、第8.5.3項「資格証明の挿入に関する必知事項」を参照してください。

21.4.16 アクセス制御の構成方法

図21-14に示すように、「MAFログイン接続の作成」ダイアログの「認可」ページを使用して、アクセス制御を構成できます。アプリケーション機能に保護されているコンポーネントが含まれている場合は、このページを使用します。たとえば、送信ボタンが含まれる経費レポート・アプリケーションは、disabledとして定義されたsecurityContextオブジェクトが含まれるEL式を使用して、管理者権限を持つユーザーがこのアプリケーションにログインした場合にのみ送信ボタンが表示されるように構成できます。「認可」ページのフィールドへの入力が完了すると、アクセス制御サービス、つまりRESTful Webサービスが構成され、これにより、アプリケーション機能によってチェックされた特定のユーザー・ロールを取得できるようになります。

図21-14 アクセス制御の構成

アプリケーション・ログイン・サーバーによって付与されるアクセス制御は、第15.2.4項「ユーザー制約とアクセス制御について」で説明されているとおり、そのアプリケーション機能用に構成されているuser.rolesおよびuser.privileges制約の評価に基づきます。たとえば、manager_roleロールを持つユーザーにのみアプリケーション機能へのアクセスを許可するには、maf-feature.xmlファイル内の<adfmf:constraints>要素を次のように定義する必要があります。

<adfmf:constraint property="user.roles"
operator="contains"
value="manager_role"/>
</adfmf:constraints>

アプリケーションの起動時、アプリケーション・ログイン・サーバー接続のために、アクセス制御サービス(ACS)として知られているRESTful Webサービスが呼び出され、そのユーザーに割り当てられているロールと権限がフェッチされます。その後、MAFは、アプリケーション・ログイン・サーバー接続に対してログインするようにユーザーに要求します。

MAFは、取得されたユーザー・ロールと権限に照らして各アプリケーション用に構成されている制約を評価し、関連付けられているすべての制約を満たすユーザーのみがアプリケーション機能を使用できるようにします。

アクセス制御を構成するには:

1. 「MAFログイン接続の作成」ダイアログで、「認可」タブをクリックします。
「MAFログイン接続の作成」ダイアログを開く方法の詳細は、第21.4.1項「MAFログイン接続の構成方法」を参照してください。

2. 「認可」ページで、図21-14に示すように、認可要件を入力します。

- アクセス制御サービスURL: アクセス制御サービス(ACS)のエンド・ポイントであるURLを入力します。

注意:

MAFは、ACSを呼び出すときに、認証サーバー(つまりログイン・サーバー)によって発行されたすべてのCookieをHTTPリクエスト・ヘッダーに挿入します。Cookieの挿入は、「RESTコールにログイン・サーバーのCookieを含める」を選択し、「アクセス制御URL」パラメータと「ログインURL」パラメータに同じドメインを入力した場合に発生します。MAFは、Cookieを挿入する前に、ACS URLとログインURLのドメインが同じであることを確認します。そうでない場合、ログイン・サーバーからのCookieがACSリクエストに挿入されないため、ACSに対する認証は失敗します。セキュアなアクセスのために、ユーザー認証を必須とし、ACS URLを保護することが理想的です。第21.4.12項「CookieをREST Webサービス・コールに追加することに関する必知事項」も参照してください。

- ユーザー・ロールのフィルタ・リスト: アプリケーション機能によってチェックされるユーザー・ロールを入力します。セキュリティ・システムには、数千もの定義済のユーザー・ロールおよび権限が存在する可能性があるため、アプリケーション機能に固有のロールが記載されているマニフェスト(これは、アプリケーション機能の開発者によって提供されます)を使用して、このリストを作成します。

- 権限のフィルタ・リスト: アプリケーション機能によってチェックされる権限を入力します。

21.4.17 アクセス制御サービスに関する必知事項

アクセス制御サービス(ACS)は、ユーザーが単一のHTTP POSTメッセージを介して自身のユーザー・ロールと権限をダウンロードできるようにする、JSONを使用したRESTful Webサービスです。これは、特定のユーザーのロールまたは権限(あるいはその両方)を戻すリクエスト・メッセージです。必要なロールと権限のリストを提供することで、特定のロールと権限を戻すこともできます。リクエスト・メッセージは、次のもので構成されています。

- リクエスト・ヘッダー・フィールド: If-Match、Accept-Language、User-Agent、Authorization、Content-Type、Content Length。

- リクエスト・メッセージ本文: ユーザー情報のリクエスト。

- 次のものが含まれている、リクエストされたJSONオブジェクト:

- userId: ユーザーID。

- filterMask: ユーザー・ロールと権限のいずれのフィルタを使用する必要があるのかを判断するために使用される"role"要素と"privilege"要素の組合せ。

- roleFilter: ユーザー情報をフィルタ処理するために使用されるロールのリスト。

- privilegeFilter: ユーザー情報をフィルタ処理するために使用される権限のリスト。

注意:

すべてのロールを戻す必要がある場合は、filterMask配列に"role"要素を含めないでください。

すべての権限を戻す必要がある場合は、filterMask配列に"privilege"要素を含めないでください。

例21-2は、HTTP POSTメッセージを示しています。この例では、JSONオブジェクトをペイロードとして識別し、John Smithというユーザーに割り当てられているすべてのフィルタとロールをリクエストします。

例21-2 ユーザー・ロールおよび権限のACSリクエスト

Protocol: POST
Authoization: Basic xxxxxxxxxxxx
Content-Type: application/json

{
"userId": "johnsmith",
"filterMask": ["role", "privilege"],
"roleFilter": [ "role1", "role2" ],
"privilegeFilter": ["priv1", "priv2", "priv3"]
}

レスポンスは、次のもので構成されています。

- 次のフィールドを持つレスポンス・ヘッダー: Last-Modified、Content-TypeおよびContent-Length。

- ユーザー情報の詳細を含むレスポンス・メッセージ本文。

- 戻されるJSONオブジェクト。これには次のものが含まれます。

- userId: ユーザーのID。

- roles: ユーザー・ロールのリスト。これは、リクエスト内のroleFilter配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられているロールのリスト全体が戻されます。

- privileges: ユーザーの権限のリスト。これは、リクエスト内のprivilegeFilter配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられている権限のリスト全体が戻されます。

例21-3は、戻されたJSONオブジェクトを示しています。これには、ユーザー名およびJohn Smithというユーザーに割り当てられているロールと権限が含まれています。

例21-3 戻されたJSONオブジェクト

Content-Type: application/json

{
"userId": "johnsmith",
"roles": [ "role1" ],
"privileges": ["priv1", "priv3"]
}

注意:

Webサービスでは、ログイン・ページはありませんが、かわりに、MAFによってユーザー・アクセスが有効化され、Webサービスのヘッダーに自動的に資格証明が追加されます。詳細は、第8.5.3項「資格証明の挿入に関する必知事項」を参照してください。

注意:

ACSサービスを実装してホストする必要があります(MAFモバイルでは、このサービスは提供されません)。

21.4.18 アプリケーションのロード順序の変更方法

MAFは、図21-14に示すように、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パラメータは、例21-1に示されているように、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして戻されます。appLoginパラメータをtrueに設定すると、ACSが機能アクセスを再評価できるようになります。OptionalExtraPayLoadパラメータは今後使用するために予約されており、使用されていません。

invokeACSメソッドまたはisAcsCalledAutomaticallyパラメータを使用してACSを呼び出すと、アプリケーションのロールベース制約が取得されます。

注意:

MAFは、<isAcsCalledAutomatically value = "false"/>がconnections.xmlファイルに含まれていない場合、ログインの成功後、ACSを自動的に呼び出します。

保護されているアプリケーション機能がinvokeACSメソッドをコールすると、MAFは、アプリケーション・ログイン接続に関連付けられたすべてのアプリケーション機能のユーザー制約(保護されているアプリケーション機能に構成されている制約を含む)をフェッチします。保護されていないアプリケーション機能がこのメソッドをコールすると、MAFはログイン接続に関連付けられた制約のみを取得します。

注意:

invokeACSメソッドに加え、AdfmfJavaUtilitiesクラスには次のライフサイクル・メソッドが含まれます。

- applicationLogout: アプリケーション・ログイン接続をログアウトします。

- featureLogout(<feature_ID>): アプリケーション機能に関連付けられたログイン接続をログアウトします。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

21.4.19 マルチテナント接続の定義時に行われる処理

「MAFログイン接続の作成」ダイアログへの入力が完了すると、MAFはtrueに設定された<isMultiTenantAware>要素をconnections.xmlファイルに移入します。マルチテナント接続では、ユーザー名はテナント名とユーザー名の組合せです。

ログイン・ページでは、JavaScriptユーティリティを使用して、接続がマルチテナント対応であるかどうかを識別します。ログイン・ページでそのような接続が検出されると、「MAFログイン接続の作成」で構成したテナント名をユーザーが入力する必要がある追加フィールドが表示されます。(正しいテナントIDの入力を含む)ログインに成功すると、MAFはテナントIDをローカル資格認証ストアに格納します。

21.4.20 モバイル・アプリケーションの接続の作成時に行われる処理

MAFでは、connections.xmlファイル内のすべての接続情報が集約されます(このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」パネルの「ディスクリプタ」および「ADF META-INF」ノードの下にあります)。このファイル(例21-4を参照)は、アプリケーションにバンドルすることも、構成サービス用にホスティングすることもできます。後者の場合、MAFは、アプリケーションが起動されるたびに、更新済の構成情報があるかどうかをチェックします。

例21-4 connections.xmlファイル内に定義されているMAF接続

<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="Connection_1"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="Connection_1"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://10.0.0.0/SecuredWebServicelogin/login.jsf"/>
<logout url="http://10.0.0.0/SecuredWebServicelogout/logout.jsf"/>
<accessControl url="http://10.0.0.0/Identity/Authorize"/>
<isAcsCalledAutomatically value="false"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<isMultiTenantAware value="true"/>
<multiTenantHeaderName value="Oracle_Multi_Tenant"/>
<injectCookiesToRESTHttpHeader value="true"/>
<userObjectFilter>
<role name="manager"/>
<privilege name="account manager"/>
<privilege name="supervisor"/>
<privilege name=""/>
</userObjectFilter>
<rememberCredentials>
<enableRememberUserName value="true"/>
<rememberUserNameDefault value="true"/>
<enableRememberPassword value="true"/>
<rememberPasswordDefault value="true"/>
<enableStayLoggedIn value="true"/>
<stayLoggedInDefault value="true"/>
</rememberCredentials>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

詳細は、Oracle Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発のconnections.xmlファイルで定義されている参照に関する項を参照してください。

21.5 モバイル・アプリケーションのセキュリティの構成

maf-feature.xmlとmaf-application.xmlファイルの概要エディタ、および「MAFログイン接続の作成」ダイアログを使用して、セキュリティを構成します。概要エディタを使用すると、認証を必要とするアプリケーション機能をユーザーが選択したときにMAFによって表示されるログイン・ページのタイプ(デフォルトまたはカスタム)を指定したり、ユーザー・ロールまたはユーザー権限ベースの制約を含めることができます。また、セキュリティが必要な埋込みアプリケーション機能を選択することもできます。

21.5.1 認証を要求するようにアプリケーション機能を設定する方法

セキュリティが適用されるように各アプリケーション機能を定義できます。残りのセキュリティ構成は、maf-application.xmlの概要エディタの「セキュリティ」ページを使用して実行します。アプリケーション機能のコンテンツがリモートURLから提供される場合に、この概要エディタを使用すると、リモートURLのコンテンツをMAFのWebビューに表示できるように、ドメインをホワイトリストできます。詳細は、第13章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

図21-15に示されているmaf-feature.xml概要エディタの「一般」タブでは、セキュリティを適用するアプリケーション機能と、それが要求する認証のタイプを指定できます。

図21-15 アプリケーション機能に対するユーザー資格証明オプションの指定

始める前に

機能のセキュリティを有効にすると、アプリケーションでは、ユーザーを認証するためにネットワークにアクセスする必要があります。ネットワーク・ソケットへのアプリケーション・アクセス権の付与の詳細は、第21.6.1項「デバイス機能へのアクセスの有効化方法」を参照してください。

アプリケーション機能に対するユーザー・アクセスを指定するには:

1. ナビゲータのユーザー・インタフェース・プロジェクトで、「アプリケーション・ソース」および「META-INF」フォルダ・ノードを開いてから、maf-feature.xmlをダブルクリックします。

2. maf-feature.xmlファイルの概要エディタで、「機能」表にリストされているアプリケーション機能を選択するか、または「追加」をクリックしてアプリケーション機能を追加します。

3. ログインが必要なすべてのアプリケーション機能に「セキュリティ有効化」を選択します。

ヒント:

このオプションをデフォルト・アプリケーションに適用しない場合、ユーザーは匿名でログインできます(つまり、ログイン資格証明を提示する必要がありません)。ユーザーは、保護されていないデータや機能にアクセスでき、必要に応じてログインできます(認証されたユーザーは保護されたデータと保護されていないデータの両方にアクセスできます)。モバイル・アプリケーション内に保護されていないアプリケーション機能を提供すると、ユーザーは保護されているアプリケーション機能からログアウトするが、モバイル・アプリケーション自体に残って、保護されていないアプリケーション機能とデータの両方に引き続きアクセスできます。

21.5.2 ログイン・ページの指定方法

アプリケーション機能のセキュリティを指定したら、図21-16に示されているmaf-application.xml概要エディタの「セキュリティ」ページを使用して、セキュリティが適用される各アプリケーション機能に対して、ログイン・ページの構成およびログイン・サーバーへの接続の作成と割当てを行います。このページにリストされているすべてのアプリケーション機能は、maf-feature.xmlファイルで、セキュリティが必要なものとして指定されています。

通常、アプリケーション機能のグループは、同じログイン・サーバー接続で保護され、ユーザーは、MAFから再度ログインを求められることなく、これらのアプリケーションをどれでも開くことが可能です。ただし、場合によっては、あるアプリケーション機能のセットを保護しているログイン・サーバーと、別のアプリケーション機能のセットを保護しているログイン・サーバーが異なるため、アプリケーション機能で要求される資格証明がそれぞれ異なる可能性があります。このような状況に対応するために、モバイル・アプリケーション用のログイン・サーバーへの接続をいくつも定義できます。maf-application.xmlファイルでは、機能参照に関連付けられている認証サーバー接続は、次のようにloginConnRefId属性を使用して指定されます。

<adfmf:featureReference id="feature1" loginConnRefId="Connection_1"/>
<adfmf:featureReference id="feature2" loginConnRefId="Connection2"/>

モバイル・アプリケーションは、HTTPまたはHTTPS経由のBasic認証をサポートしている標準のログイン・サーバーなら、どのログイン・サーバーに対しても認証を受けることが可能です。MAFはまた、Oracle Identity Managementに対する認証もサポートしています。特定のアプリケーション機能用のカスタム・ログイン・ページを選択することもできます。詳細は、第21.5.4項「ログイン・ページに関する必知事項」を参照してください。

注意:

デフォルトでは、保護されているすべてのアプリケーション機能が同じ接続を共有します。この接続は、図21-16に示されているように、<application login server>と表示されます。「機能参照」の「プロパティ・インスペクタ」では、このデフォルト・オプションが「ログイン・サーバー接続」ドロップダウン・メニューに<default> application login serverと表示されます。「MAFログイン接続の作成」ダイアログを使用して、モバイル・アプリケーション用に定義されている他の接続を選択できます。

図21-16 maf-application.xmlの概要エディタの「セキュリティ」ページ

始める前に

モバイル・アプリケーションでカスタム・ログイン・ページを使用する場合は、アプリケーション・コントローラ・プロジェクトのpublic_htmlディレクトリ(JDeveloper\mywork\Application\ApplicationController\public_html)にファイルを追加して、図21-17に示されているように「アプリケーション・ナビゲータ」の「Webコンテンツ」ノードからそれを使用できるようにします。第21.5.3項「カスタム・ログインHTMLページまたはカスタムKBAページの作成方法」および第4.10.2項「外部リソースの選択に関する必知事項」も参照してください。

第15.2.4項「ユーザー制約とアクセス制御について」の説明に従って、ユーザー権限とロール用の制約を追加します。

アクセス制御サービス(ACS)・サーバーをプロビジョニングします。詳細は、第21.4.17項「アクセス制御サービスに関する必知事項」を参照してください。

図21-17 カスタム・ログイン・ページの追加

ログイン・ページおよびKBAページを指定するには:

1. ナビゲータで、「アプリケーション・リソース」パネルを開き、「ディスクリプタ」および「ADF META-INF」フォルダ・ノードを開いて、maf-application.xmlをダブルクリックします。

2. maf-application.xmlファイルの概要エディタで、「セキュリティ」ナビゲーション・タブをクリックします。

3. 「セキュリティ」ページで、ログイン・ページのタイプを指定します。

- ユーザー名とパスワードを受け入れるビューの「ログイン・ページ」を選択します。

- 資格証明に対するチャレンジをユーザーに表示し、ユーザーの答えを受け入れるナレッジベース認証(KBA)ビューの場合は、「KBAページ」を選択します。ナレッジベース認証はOAAMサーバー上に構成でき、別のページで、母の旧姓などの追加の質問に対する入力をユーザーに求めることができます。この機能は、Mobile-Social認証タイプでのみ使用できます。

4. 次のように、選択したログイン・ページ、およびオプションで選択したKBAページのコンテンツ(またはユーザー・インタフェース)を選択します。

- デフォルト: 選択されたすべての埋込みアプリケーション機能で使用されるデフォルト・ログイン・ページまたはKBA画面。詳細は、第21.5.4.1項「デフォルト・ログイン・ページ」を参照してください。デフォルト・ログイン・ページおよびデフォルトKBAページは、MAFによって提供されているものです。

- カスタム: 「参照」をクリックして、アプリケーション・コントローラ・プロジェクト内のファイルのパスの場所を検索します。または、「新規」をクリックして、ログイン・ページまたはKBAページ用のカスタムHTMLページをアプリケーション・コントローラ・プロジェクト内に作成します。詳細は、第21.5.4.2項「カスタム・ログイン・ページ」および第21.5.3項「カスタム・ログインHTMLページまたはカスタムKBAページの作成方法」を参照してください。

ヒント:

「参照」機能を使用してログイン・ページの場所を検索するのではなく、「アプリケーション・ナビゲータ」からログイン・ページをフィールドにドラッグできます。

21.5.3 カスタム・ログインHTMLページまたはカスタムKBAページの作成方法

ログイン・ページ以外での認証が必要な場合、ナレッジベース認証(KBA)がOAMサーバー上に構成されていると、ナレッジベース認証ページを有効にできます。KBA画面では、母の旧姓などの追加情報を要求することで、追加のチャレンジがユーザーに表示されます。ログイン・ページと同様、KBA画面はカスタマイズできます。

MAFのデプロイメントによってwwwディレクトリ内に生成されるアーティファクトであるデフォルトのログイン・ページ(adf.login.htmlまたはadf.kba.html)を変更すると、カスタム・ログイン・ページを作成できます。

始める前に

wwwディレクトリ内のログイン・ページにアクセスするには、モバイル・アプリケーションをデプロイした後、deployディレクトリに移動します。iOSデプロイメントの場合、ページは次の場所にあります。

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/adf.login.html

および

application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/adf.kba.html

Androidデプロイメントの場合、ページは、次の場所にあるAndroidアプリケーション・パッケージ(.apk)ファイル内に配置されます。

application workspace directory/application name/deploy/deployment profile name/deployment profile name.apk/assets/www/adf.login.html

および

application workspace directory/application name/deploy/deployment profile name/deployment profile name.apk/assets/www/adf.kba.html

カスタム・ログイン・ページを作成するには:

1. デフォルト・ログイン・ページを、ユーザー・インタフェース・プロジェクトのpublic_htmlディレクトリ内の場所(JDeveloper\mywork\application name\ApplicationController\public_htmlなど)にコピーします。

2. ログイン・ページの名前を変更します。

3. ページを更新します。

4. maf-application.xmlファイルの概要エディタの「セキュリティ」ページで、「カスタム」を選択し、「参照」をクリックしてログイン・ページの場所を検索します。詳細は、第4.5項「Springboardとナビゲーション・バーの動作の構成」を参照してください。

21.5.4 ログイン・ページに関する必知事項

アプリケーション機能の認証プロセスのエントリ・ポイントは、activateライフサイクル・イベントです(第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」を参照)。アプリケーション機能がアクティブ化されるたびに(つまり、アプリケーション機能のactivateイベント・ハンドラがコールされるたびに)、アプリケーション機能ログイン・プロセスは実行されます。このプロセスは、ログイン・ページ(デフォルトまたはカスタムのログイン・ページのいずれか)に移動し、そこでユーザー認証が必要かどうかを判断します。ただし、プロセスがログイン・ページに移動する前に、本来意図されていたアプリケーション機能をMAFに登録する必要があります。認証が成功すると、ログイン・ページは、MAFから本来意図されていた宛先を取得し、そこに移動します。

21.5.4.1 デフォルト・ログイン・ページ

MAFによって提供されるデフォルトのログイン・ページ(図21-1「ログイン・ページ」を参照)は、ログイン・ボタンと、ユーザー名とパスワード用の入力テキスト・フィールド、マルチテナント名、およびエラー・メッセージ・セクションから構成されます。これは、HTMLで記述されたクロス・プラットフォーム・ページです。

21.5.4.2 カスタム・ログイン・ページ

maf-application.xmlファイルの概要エディタを使用して、選択したアプリケーション機能用のカスタム・ログイン・ページを追加すると、JDeveloperは、例21-5に示されているように、<adfmf:login>要素を追加し、その子要素<adfmf:LocalHTML>を設定します。すべての<adfmf:LocalHTML>要素と同様に、そのurl属性は、public_htmlディレクトリ内の場所を参照します。ユーザー認証メカニズムとナビゲーション・コントロールは、デフォルトのログイン・ページと同じものになります。

例21-5 ログイン要素

<adfmf:login defaultConnRefId="Connection_1">
<adfmf:localHTML url="newlogin.html"/>
</adfmf:login>

カスタム・ログイン・ページはHTMLで記述されています。ログイン・ページとナレッジベース(KBA)・ページの両方のフィールドには、具体的に定義された<input>要素および<label>要素を含める必要があります。

ヒント:

カスタム・ログイン・ページを作成するためのガイドとしてMAFアプリケーションのデプロイ時に生成されたデフォルトのログイン・ページを使用します。wwwディレクトリ内のログイン・ページにアクセスするには、モバイル・アプリケーションをデプロイした後、deployディレクトリに移動します(第21.5.3項「カスタム・ログインHTMLページまたはカスタムKBAページの作成方法」を参照)。

例21-6は、デフォルト・ログイン・ページに必要な<input>および<label>要素を示しています。

例21-6 デフォルト・ログイン・ページの必須要素

<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"/>

例21-7は、KBAログイン・ページの必須要素を示しています。

例21-7 KBAログイン・ページの必須要素

<input type="text"

<label id="oracle_access_kba_ques_id" >Question</label><br>

<input class="field-value"
name="oracle_access_kba_ans_id"
id="oracle_access_kba_ans_id">
</input>

<label id="oracle_access_error_id"
class="error-text">
</label>

<label id="message_id"
class="message-text">
</label>

<input type="button"
onclick="oracle_access_sendParams(this.id)"
value="Login"
id="oracle_access_submit_id"/>

21.5.5 ログイン・ページ要素に関する必知事項

各HTMLログイン・ページに、表21-2にリストされたユーザー・インタフェース要素が含まれている必要があります。

表21-2 ログイン・ページのフィールドおよび関連するID

ページ要素

ID

ユーザー名フィールド

oracle_access_user_id

パスワード・フィールド

oracle_access_pwd_id

ログイン・ボタン

oracle_access_submit_id

取消ボタン

oracle_access_cancel_id

アイデンティティ・ドメイン/テナント名フィールド

oracle_access_iddomain_id

KBA質問フィールド(読取り専用/ラベル)

oracle_access_kba_ques_id

KBA回答フィールド

oracle_access_ans_id

エラー・フィールド

oracle_access_error_id

自動ログイン・チェックボックス

oracle_access_auto_login_id

資格証明を記憶チェックボックス

oracle_access_remember_credentials_id

ユーザー名を記憶チェックボックス

oracle_access_remember_username_id

表21-3には、OnClickイベントで使用される、推奨のJavaScriptコードがリストされています。

表21-3 OnClickイベントで使用されるJavaScript

ボタン

JavaScript

ログイン・ボタン

oracle_access_sendParams(this.id)

取消ボタン

oracle_access_sendParams(this.id)

KBA送信ボタン

oracle_access_sendParams(this.id)

KBA取消ボタン

oracle_access_sendParams(this.id)

21.5.6 アプリケーション機能用セキュリティの構成時のJDeveloperでの処理

セキュリティが適用されるようにアプリケーション機能が指定されると、JDeveloperは、図21-16に示されているように、対応する機能参照で「セキュリティが有効な機能」の表を更新します。参照される各アプリケーション機能が、connections.xmlファイル内に定義されている同じログイン・サーバー接続に対して認証を行うと、JDeveloperは、defaultConnRefId属性を使用して定義されている単一の<adfmf:login>要素(<adfmf:login defaultConnRefId="Connection_1">など)でmaf-application.xmlファイルを更新します。

connections.xmlファイル内に定義されている別のログイン・サーバー接続を使用するように構成されているアプリケーション機能の場合は、JDeveloperは、参照される各アプリケーション機能をloginConnReference属性(<adfmf:featureReference id="feature2" loginConnRefId="Connection2"/)で更新します。詳細は、第21.5.1項「認証を要求するようにアプリケーション機能を設定する方法」を参照してください。また、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスも参照してください。

21.6 デバイス機能へのアクセスの許可

すべてのApache Cordova対応デバイス機能へのアクセスは、モバイル・アプリケーションの場合デフォルトでは有効になっていません。かわりに、MAFでは、特定の機能へのアクセスを許可することでセキュリティを確保しています。モバイル・アプリケーションのセキュリティとプライバシ要件を評価するときに、アプリケーションどのようなタイプのアクセス権を持っている必要があるかを選択できます。デフォルトでは、次の機能がモバイル・アプリケーションに対して有効になっていません。

- 位置情報: 細かい(GPS)位置情報サービスと大まかな(ネットワーク・ベース)位置情報サービスの両方が含まれます。

- カメラ: アプリケーションによるデバイスのカメラの使用を許可します。

- 連絡先: アプリケーションによるデバイス上の連絡先へのアクセスを許可します。

- 電子メール: アプリケーションによる電子メールへのアクセスおよび電子メール送信を許可します。

- SMS: アプリケーションによるSMSメッセージへのアクセスおよびその送信を許可します。

- 電話: アプリケーションによる音声サービスへのアクセスおよび電話を許可します。

- プッシュ通知: アプリケーションによるプッシュ通知の受信を許可します。第17.2項「モバイル・アプリケーションに対するプッシュ通知の有効化」も参照してください。

- ファイル: アプリケーションによるデバイスSDカード上のファイルへのアクセスを許可します。

モバイル・アプリケーションの大多数ではネットワーク・アクセスが必要なため、ネットワークにアクセスする権限はデフォルトで有効になっています(デフォルトで有効になっている唯一のデバイス機能)。

- ネットワーク: アプリケーションによるネットワーク・ソケットのオープンを許可します。少なくとも1つのデバイス機能のセキュリティが有効な場合、ネットワーク・アクセス権の付与は有効にしておく必要があります。

デバイス・サービスを許可または制限できるため、デプロイメント・フレームワークによって更新されるプラットフォーム固有の様々な構成ファイルやマニフェスト・ファイルでは、使用中のサービス(厳密には、モバイル・アプリケーションが使用を許可されているデバイス・サービス)のみがリストされます。これらのファイルにより、MAFはこれらのサービスの使用に関する情報を他のアプリケーションと共有できます。たとえば、モバイル・アプリケーションは、ロケーション・ベースのサービスを(モバイル・アプリケーションがこの機能を備えている場合でも)使用していないことをAppStoreまたはGoogle Playに報告できます。

21.6.1 デバイス機能へのアクセスの有効化方法

モバイル・アプリケーションのデバイス・アクセスは、アプリケーション・レベルおよびアプリケーション機能レベルの両方で構成され(アプリケーション・レベルの構成セットが優先される)、アプリケーション機能の構成でそのデバイス要件が示されますが、これらのアプリケーション機能を使用する権限はアプリケーション構成により付与されます。

maf-feature.xmlおよびmaf-application.xmlの概要エディタでは、<adfmf:deviceFeatureAccess>要素を作成することで、デバイス機能を指定および管理できます。両方の構成ファイルはこの要素およびそのデバイス固有の子要素を共有しますが、maf-feature.xmlファイルの要素はrequestAccess属性を使用して定義され、maf-application.xmlファイルの要素はallowAccess属性を使用して定義されます。

アプリケーション機能に必要なデバイス機能を指定するには:

1. ナビゲータのユーザー・インタフェース・プロジェクトで、「アプリケーション・ソース」および「META-INF」フォルダ・ノードを開いてから、maf-feature.xmlをダブルクリックします。

2. maf-feature.xmlファイルの概要エディタで、「機能」表にリストされているアプリケーション機能を選択し、「デバイス・アクセス」タブをクリックし、図21-18に示すように、アプリケーションで必要なデバイス機能を有効化します。

図21-18 デバイス・アクセス要件の指定

少なくとも1つのデバイス機能のセキュリティを有効にした場合は(第21.5.1項「認証を要求するようにアプリケーション機能を設定する方法」を参照)、ネットワークへのアクセスが必要になります。この場合、次のようにしてmaf-application.xmlファイルでネットワーク機能にアクセス権を付与してください。

デバイス機能に権限を付与するには:

1. ナビゲータで、「アプリケーション・リソース」パネルを開き、「ディスクリプタ」および「ADF META-INF」フォルダ・ノードを開いて、maf-application.xmlをダブルクリックします。

2. maf-application.xmlファイルの概要エディタで、「デバイス・アクセス」ナビゲーション・タブをクリックし、図21-19に示すように、アプリケーションで必要なデバイス機能に権限を付与します。

図21-19 デバイス・アクセスの付与

21.6.2 デバイス機能の定義時に行われる処理

MAFは、例21-8に示すように、<adfmf:feature>要素に<adfmf:deviceFeatureAccess>を移入します。

例21-8 maf-feature.xmlファイルでのデバイス機能の定義

<adfmf:feature id="feature3" name="feature3">
<adfmf:content id="feature3.1">
<adfmf:amx file="feature3/datapage.amx"/>
</adfmf:content>
<adfmf:deviceFeatureAccess>
<adfmf:deviceEmails id="de1" requestAccess="true"/>
</adfmf:deviceFeatureAccess>
</adfmf:feature>

maf-application.xmlファイルで、例21-9に示すように、MAFは<adfmf:deviceFeatureAccess>要素を設定します。

例21-9 maf-application.xmlファイルでのデバイス機能権限の追加

<adfmf:deviceFeatureAccess>
<adfmf:deviceCamera id="dc1" access="true"/>
<adfmf:deviceContacts id="dc2" access="true"/>
<adfmf:deviceEmails id="de1" access="true"/>
<adfmf:deviceFiles id="df1" access="true"/>
<adfmf:deviceLocation id="dl1"/>
<adfmf:deviceNetwork id="dn1" access="true"/>
<adfmf:devicePhone id="dp1"/>
<adfmf:deviceSMS id="dsms1" access="true"/>
</adfmf:deviceFeatureAccess>

詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

21.6.3 デバイス機能権限に関する必知事項

maf-application.xmlファイルで構成されている、関連のデバイス・アクセス権限を持たないDeviceFeaturesデータ・コントロール・メソッドからコンポーネントを作成する場合、図21-20に示すように、MAFはメソッドに関するダイアログを表示して確認を求めます。このダイアログのデフォルト・オプションでは、許可してmaf-application.xmlファイルを更新するか、または「デバイス・アクセス権限の編集」オプションを使用してファイルを開き、手動で更新できます。

図21-20 デバイス・アクセスの付与

「MAF AMXページ」内で、デバイス関連のmethodActionバインディングは存在するが、適用可能なデバイス・アクセス権限が削除されている(または定義されていない)場合、MAFは次の形式(および図21-21のアラートで示されているように)エラーを発行します。適切なデバイス・アクセスがadfmf:application.xmlファイルで付与されていない場合、メソッドは機能せず、ランタイム・エラーが発生します。

Application is not allowed to access device <deviceFeatureName>. Enable Device <deviceFeatureName> access in maf-application.xml for <bindingId> to work

図21-21 「MAF AMXページ」でのデバイス・アクセス権限の警告

21.6.4 デプロイ時のデバイス機能に関する必知事項

各デプロイ時に、MAFはiOSのcordova.plistファイルや、Androidのconfig.xml、AndroidManifest.xmlおよびAndroidManifest.template.xmlファイルをモバイル・アプリケーションにより許可されたデバイス機能で更新します。具体的には、MAFデプロイメント・プロセスがデフォルトのCordovaプラグイン情報をこれらのファイルから除外し、maf-application.xmlファイルの<adfmf:deviceFeatureAccess>要素で定義されている子要素をiOSおよびAndroidファイルで定義されている権限にマップします。表21-4に、<adfmf:deviceSMS>要素をプラットフォーム固有ファイルにマッピングする例を示します。MAFは、各デプロイメントでこれらのファイルを再生成します。

表21-4 プラットフォーム固有ファイルへの<adfmf:deviceSMS>のマッピング

のマッピング" width="100%">

cordova.plistファイル内の<key>へのマッピング

config.xmlファイル内の<plugin name>へのマッピング

AndroidManifest.xmlファイル内の権限へのマッピング

<key>Plugins</key>
<dict>
<key>AdfmfSMS</key>
<string>AdfmfSMSAdaptor</string>
</dict>

<plugin name="AdfmfSMS" value="oracle.adfmf.phonegap.AdfmfSMS"/>

<uses-permission android:name="android.permission.RECEIVE_SMS" />

表21-5に示すように、特定のプラグインがAndroidManifest.xmlファイル内の権限を共有します。デプロイメント・プロセスでは、これらの権限が存在しない場合、または即時利用可能なデバイス機能で権限が必要な場合、権限を追加します。

表21-5 共有されている権限

デバイス・アクセス

権限

- ネットワーク

- プッシュ通知

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

- 連絡先

- プッシュ通知

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

- カメラ

- ファイル

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

注意:

MAFは、指定のデプロイメント・プロファイルの最初のデプロイメント時にAndroidManifest.template.xmlファイルを抽出します。このファイルによって、AndroidManifest.xmlファイルの最初の内容が提供されます。

表21-4に示している<adfmf:deviceSMS>要素のマッピングと同様、MAFはデプロイメント時に次の要素をiOSおよびAndroid構成ファイルにマッピングします。

- <adfmf:deviceCamera>

- <adfmf:deviceContacts>

- <adfmf:deviceEmails>

- <adfmf:deviceNetwork>

- <adfmf:deviceFiles>

- <adfmf:deviceLocation>

- <adfmf:devicePushNotifications>

<adfmf:deviceCamera>

表21-6は、MAFが<adfmf:deviceCamera allowAccess="true" />をプラットフォーム固有ファイルにマッピングする方法を示しています。

表21-6 プラットフォーム固有ファイルへの<adfmf:deviceCamera>のマッピング

のマッピング" width="100%">

cordova.plistファイル内の<key>へのマッピング

config.xmlファイル内の<plugin name>へのマッピング

AndroidManifest.xmlファイル内の権限へのマッピング

<key>Plugins</key>
<dict>
<key>Camera</key>
<string>CDVCamera</string>
<key>Capture</key>
<string>CDVCapture</string>
</dict>

<plugin name="Camera" value="org.apache.cordova.CameraLauncher"/>
<plugin name="Capture" value="org.apache.cordova.Capture"/>

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<adfmf:deviceContacts>

表21-7は、MAFが<adfmf:deviceContacts allowAccess="true"/>をプラットフォーム固有ファイルにマッピングする方法を示しています。

表21-7 プラットフォーム固有ファイルへの<adfmf:deviceContacts>のマッピング

のマッピング" width="100%">

cordova.plistファイル内の<key>へのマッピング

config.xmlファイル内の<plugin name>へのマッピング

AndroidManifest.xmlファイル内の権限へのマッピング

<key>Plugins</key>
<dict>
<key>Contacts</key>
<string>CDVContacts</string>
</dict>

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>

<adfmf:deviceEmails>

表21-8は、MAFが<adfmf:deviceEmails allowAccess="true"/>をプラットフォーム固有ファイルにマッピングする方法を示しています。

表21-8 プラットフォーム固有ファイルへの<adfmf:deviceEmails>のマッピング

のマッピング" width="100%">

cordova.plistファイル内の<key>へのマッピング

config.xmlファイル内の<plugin name>へのマッピング

AndroidManifest.xmlファイル内の権限へのマッピング

<key>Plugins</key>
<dict>
<key>AdfmfEmail</key>

<plugin name="AdfmfEmail" value="oracle.adfmf.phonegap.AdfmfEmail"/>

AndroidManifest.xmlファイルに電子メール・エントリがないため、該当しません。

<adfmf:deviceNetwork>

表21-9は、MAFが<adfmf:deviceNetwork allowAccess="true"/>をプラットフォーム固有ファイルにマッピングする方法を示しています。

表21-9 プラットフォーム固有ファイルへの<adfmf:deviceNetwork>のマッピング

のマッピング" width="100%">

cordova.plistファイル内の<key>へのマッピング

config.xmlファイル内の<plugin name>へのマッピング

AndroidManifest.xmlファイル内の権限へのマッピング

<key>Plugins</key>
<dict>
<key>NetworkStatus</key>
<string>CDVConnection</string>
</dict>

<plugin name="NetworkStatus" value="org.apache.cordova.NetworkManager"/>

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<adfmf:deviceFiles>

表21-10は、MAFが<adfmf:deviceFiles allowAccess="true"/>をプラットフォーム固有ファイルにマッピングする方法を示しています。

表21-10 プラットフォーム固有ファイルへの<adfmf:deviceFiles>のマッピング

のマッピング" width="100%">

cordova.plistファイル内の<key>へのマッピング

config.xmlファイル内の<plugin name>へのマッピング

AndroidManifest.xmlファイル内の権限へのマッピング

<key>Plugins</key>
<dict>
<key>File</key>
<string>CDVFile</string>
</dict>

<key>Plugins</key>
<dict>
<key>FileTransfer</key>
<string>CDVFileTransfer</string>
</dict>

<plugin name="File" value="org.apache.cordova.FileUtils"/>
<plugin name="FileTransfer" value="org.apache.cordova.FileTransfer"/>
<plugin name="Storage" value="org.apache.cordova.Storage"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<adfmf:deviceLocation>

表21-11は、MAFが<adfmf:deviceLocation allowAccess="true"/>をプラットフォーム固有ファイルにマッピングする方法を示しています。

表21-11 プラットフォーム固有ファイルへの<adfmf:deviceLocation>のマッピング

のマッピング" width="100%">

cordova.plistファイル内の<key>へのマッピング

config.xmlファイル内の<plugin name>へのマッピング

AndroidManifest.xmlファイル内の権限へのマッピング

<dict>
<key>Plugins</key>
<dict>
<key>Geolocation</key>
<string>CDVLocation</string>
<key>Compass</key>
<string>CDVLocation</string>
</dict>
</dict>

<plugin name="Geolocation" value="org.apache.cordova.GeoBroker"/>
<plugin name="Compass" value="org.apache.cordova.CompassListener"/>

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>

<adfmf:devicePushNotifications>

表21-12は、MAFが<adfmf:deviceSMS allowAccess="true"/>をプラットフォーム固有ファイルにマッピングする方法を示しています。

表21-12 プラットフォーム固有ファイルへの<adfmf:devicePushNotifications>のマッピング

のマッピング" width="100%">

cordova.plistファイル内の<key>へのマッピング

config.xmlファイル内の<plugin name>へのマッピング

AndroidManifest.xmlファイル内の権限へのマッピング

<key>Plugins</key>
<dict>
<key>PushPlugin</key>
<string>PushPlugin</string>
</dict>

<plugin name="PushPlugin" value="com.plugin.gcm.PushPlugin"/>

該当なし。

21.7 アプリケーション機能からのユーザーのログアウトの有効化

MAFでは、保護された内容が含まれるか、制約により制限されているアプリケーション機能からユーザーがログアウトした場合、アプリケーション機能は終了されず、ユーザーはアプリケーション内に残り、匿名ユーザーとして保護されていない内容や機能にアクセスできます。MAFでは制約を再度初期化できるため、ユーザーは同じアイデンティティを使用してアプリケーションに繰り返しログインできます。また、ユーザーが異なるアイデンティティを使用してログインできることにより、複数のアイデンティティでアプリケーションへのアクセスを共有することもできます。

Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスで説明しているAdfmfJavaUtilitiesクラスのlogoutFeatureおよびlogoutメソッドにより、ユーザーはアプリケーションの起動後、認証サーバーに対する明示的なログインおよびログアウトを実行できます。また、これらにより、ユーザーは保護されたアプリケーション機能を呼び出した後に認証サーバーにログインできます。ユーザーは個々のアプリケーション機能からログアウトできますが、同じ接続によって保護されているアプリケーション機能からも同時にログアウトすることになります。

これらのメソッドを使用して、ユーザーは次のことを実行できます。

- アプリケーション機能からログアウトするが、保護されていない内容には引き続きアクセスします(つまり、MAFはアプリケーションを終了しません)。

- アプリケーション内で、保護されている内容やUIコンポーネントを使用するためにログイン・サーバーで認証します。

- モバイル・アプリケーションまたはアプリケーション機能からログアウトし、別のアイデンティティを使用して再びログインします。

- モバイル・アプリケーションまたはアプリケーション機能からログアウトし、ロールと権限が更新された同じアイデンティティを使用して再びログインします。

現在の認証サーバーからのログアウトを有効にするには、次のようにAdfmfJavaUtilitiesクラスのlogoutメソッドをコールします。次に例を示します。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.logout();

keyパラメータに関連付けられた認証サーバーからのログアウトを有効にするには、次のようにlogoutFeatureメソッドをコールします。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.logoutFeature(adfCrendentialStorykey);

adfCredentialStorykeyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringオブジェクトとして戻されます。AdfmfJavaUtiltiesクラスおよびkeyパラメータの使用方法の詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

21.8 SSLのサポート

MAFは、cacerts証明書ファイル(クライアント・アプリケーションとサーバー間のHTTPSハンドシェイクのJavaメカニズム)を提供します。第3.2.2.1項「アプリケーション・コントローラ・プロジェクト・レベルのリソースについて」に示されているように、JDeveloperは、アプリケーション・リソースのSecurityフォルダ内にこのファイルを作成します(JDeveloper\mywork\application name\resources\Security\cacertsにあります)。MAFのcacertsファイルにより、信頼できる既知のソースからの一連の証明書がJVM 1.4に対して識別され、デプロイメントが可能になります。カスタム証明書を必要とするアプリケーションでは(RSA暗号化が使用されていない場合など)、アプリケーションをデプロイする前にプライベート証明書を追加する必要があります。

始める前に

cacertsファイルおよびkeytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

プライベート証明書を追加するには:

1. プライベート証明書を作成します。たとえば、new_certという証明書ファイルを作成します。

2. 次のようにして、プライベート証明書をアプリケーションに追加します。

1. シードされたcacertsファイル(cp cacerts cacerts.org)のコピーを作成します。

2. Java SE keytoolユーティリティを使用して、cacertsファイルに証明書を追加します。例21-10は、new_certというcacertsファイルへの証明書の追加を示しています。

例21-10 keytoolユーティリティを使用した証明書の追加

keytool -importcert
-keystore cacerts
-file new_cert
-storepass changeit
-noprompt

例21-10は、単一の証明書の追加方法を示しています。各証明書に対して同じ手順を繰り返します。表21-13には、keytoolのオプションがリストされています。

表21-13 証明書の追加に関するオプション

オプション

説明

-importcert

証明書をインポートします。

-keystore cacerts file

インポートされた証明書のファイルの場所を特定します。

-file certificate file

新しい証明書を含むファイルを特定します。

-storepass changeit

cacertsファイルのパスワードを提供します。デフォルトでは、パスワードはchangeitです。

-noprompt

証明書を信頼するかどうかを(stdinを介して)ユーザーに確認しないように、keytoolに指示します。

3. 新しいcacertsファイルの内容を目で見て調べて、すべてのフィールドが正しいことを確認します。次のコマンドを使用します。

keytool -list -v -keystore cacerts | more

4. 証明書が指定のホスト名に対するものであることを確認します。

注意:

証明書の共通名(CN)は、ホスト名と正確に一致している必要があります。

5. JVM 1.4が読み取れるようにするために、カスタマイズされた証明書ファイルはSecurityディレクトリ(JDeveloper\mywork\application name\resources\Security)に確実に配置してください。

3. アプリケーションをデプロイします。

注意:

デプロイメント時、証明書ファイルがSecurityディレクトリに存在している場合、MAFは、それをAndroidまたはXcodeテンプレート・プロジェクトにコピーし、cacertsファイルのデフォルト・コピーを置き換えます。

4. 保護されているリソースにSSL経由でアクセスできることを確認します。

22 MAFアプリケーションのテストおよびデバッグ

この章では、iOSとAndroidの両方のプラットフォーム用に開発されたMAFアプリケーションのテストとデバッグに関する情報を行う方法について説明します。

この章の内容は次のとおりです。

- 第22.1項「MAFアプリケーションのテストおよびデバッグの概要」

- 第22.2項「MAFアプリケーションのテスト」

- 第22.3項「MAFアプリケーションのデバッグ」

- 第22.4項「ロギングの使用方法と構成」

22.1 MAFアプリケーションのテストおよびデバッグの概要

MAFアプリケーションのテストとデバッグを開始する前に、そのアプリケーションを次のいずれかにデプロイする必要があります。

- iOSデバイス

- iOSデバイス・シミュレータ

- Androidデバイス

- Androidデバイス・エミュレータ

MAFアプリケーションは、デプロイしないと実行できません。詳細は、第19章「モバイル・アプリケーションのデプロイ」を参照してください。

MAFアプリケーションのテストとデバッグを行うには、通常、次の手順を実行します。

1. スプラッシュ画面、アプリケーション機能のナビゲーション、認証、プリファレンスなど、アプリケーションのインフラストラクチャをテストして、うたわれているすべてのアプリケーション機能が使用可能であることを確認します。

2. アプリケーションにMAF AMXコンテンツが含まれている場合は、このアプリケーション機能のロジック、ページ・フロー、データ・コントロールおよびUIコンポーネントをテストします。

3. 必要に応じてアプリケーションに変更を加えます。

4. モバイル・デバイスを再接続するか、シミュレータを再起動し、さらなるテストおよびデバッグのためにアプリケーションをデプロイして実行します。

詳細は、次を参照してください。

- 第22.3項「MAFアプリケーションのデバッグ」

- 第22.2項「MAFアプリケーションのテスト」

22.2 MAFアプリケーションのテスト

MAFアプリケーションをテストするには、次の2つの方法があります。

1. モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。

2. モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。

通常、両方の方法を組み合せて使用することで、最良の結果が得られます。

22.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

iOSデバイス用に開発されたMAFアプリケーションのアクセシビリティをテストするには、次の方法を組み合せて使用してください。

- iOSデバイス・シミュレータ上でアクセシビリティ・インスペクタを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Testing the Accessibility of Your iPhone Application」を参照してください。

- iOSデバイス上でVoiceOverを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Using VoiceOver to Test Your Application」を参照してください。

22.3 MAFアプリケーションのデバッグ

JDeveloperには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してアプリケーションの実行をモニターおよび制御することを可能にするデバッグ・メカニズムが備わっています。詳細は、Oracle Fusion Middleware Oracle Jdeveloperによるアプリケーションの開発のアプリケーションのデバッグに関する項を参照してください。

MAFアプリケーションはJDeveloper内部で実行できないため、デバッグの方法が異なります。JDeveloperデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン(JVM) 1.4インスタンスに接続し、デプロイ済のMAFアプリケーションのJavaの部分を制御します。

MAFは、デバッグ用にプロジェクト・プロパティを自動的に構成します(第22.3.1項「デバッグ構成に関する必知事項」を参照)。JDeveloperを使用してMAFアプリケーション内のJavaコードをデバッグするために実行する必要のある手順は、次のとおりです。

アプリケーションをテストまたはデバッグするには:

1. JDeveloperのメイン・メニューから、「実行」→「アクティブな実行構成を選択」をクリックして、アクティブな実行構成を選択します。

2. 「アプリケーション」ウィンドウで、テストするファイルを右クリックし、「実行」を選択します。
あるいは、デバッグを有効にした状態でアプリケーションを実行する場合は、「デバッグ」を選択します。

ヒント:

「ソース」ビューでMAFアプリケーションのファイルを開き、右クリックして、「実行」または「デバッグ」を選択します。

注意:

事前定義済の実行構成セットを持たない既存のアプリケーションを使用する場合は、新しい実行構成を作成します(第22.3.1項「デバッグ構成に関する必知事項」を参照)。

詳細は、次を参照してください:

- 第19.1.1.2項「JVM 1.4ライブラリのデプロイメント」

- 第22.3.1項「デバッグ構成に関する必知事項」

22.3.1 デバッグ構成に関する必知事項

新しいMAFアプリケーションを作成する場合、作成ウィザードでは、デバッグ用にアプリケーション・プロパティが自動的に構成されます。これには、iOSシミュレータまたはAndroidエミュレータやデバイスでMAFアプリケーションの実行またはデバッグを行うために使用できるデフォルトの実行構成の作成が含まれます。これらの実行構成では、JDeveloperの「実行」または「デバッグ」ボタンをクリックすると、MAFアプリケーションの構築、デプロイ、実行またはデバッグができます。JDeveloperの「実行」または「デバッグ」ボタンをクリックし、MAF実行構成を選択すると、実行構成に関連付けられたデプロイメント・プロファイルが実行され、アプリケーションが構築されてターゲット・デバイスにデプロイされます。アプリケーションはデプロイされると、自動的に起動します。「デバッグ」ボタンを選択すると、アプリケーションがデバッガとともに起動します。

新しい構成を作成するか、既存の構成を変更するには、「実行構成の編集」ダイアログに入力します(図22-1を参照)。

1. JDeveloperのメイン・メニューで、「アプリケーション」→「プロジェクト・プロパティ」をクリックして、「プロジェクト・プロパティ」ダイアログを開きます。

2. 「プロジェクト・プロパティ」ダイアログで、「実行/デバッグ」ノードを選択します。
あるいは、「実行」→「アクティブな実行構成を選択」→「実行構成の管理」を選択します。

3. 新しい実行構成を作成するか、既存の実行構成を変更します。
共有設定を使用する場合、「共有設定の編集」をクリックして、新しいMAF実行構成の作成または編集ができるダイアログを開きます。プロジェクト設定を使用する場合は、「新規作成」または「編集」をクリックします。共有設定の場合、実行構成はすべてのプロジェクトで共有されます。「共有設定の使用」はデフォルトのオプションであり、この場合、プロジェクトの追加時に存在するMAF実行構成を使用できます。

4. 次のように、「実行構成の編集」ダイアログに入力します。

- プラットフォームを選択します。

- デプロイメント・プロファイルを選択します。

- 最大5桁の長さでポート番号を入力します。この数字は、当初はcvm.propertiesファイルに含まれているjava.debug.port propertyの値によってシードされ、ヒント・テキストとして表示されます。ポートに値が指定されていない場合は、シードされた値が使用されます。

- iOSの場合、次のオプションを設定します。

- 「アプリケーション引数」: アプリケーションの実行時の動作をカスタマイズするために、起動時のMAFアプリケーションに渡すことができる引数を入力します。たとえば、-consoleRedirect=/path/to/log.txtでは、指定されたファイルにログが出力されます。ログ・ファイルを取得するには、パスは絶対パスである必要があります。場所は、現在のユーザーにとって書込み可能である必要があります。

- 「シミュレータ」: アプリケーションをデプロイする先のシミュレータを選択します。オプションは、インストールされているiOS SDKのバージョンによって異なります。

- 「iOSバージョン」: シミュレータが使用するiOSのバージョンを選択します。ドロップダウン・メニューには、選択したデバイスがサポートしているiOSのバージョンが表示されます。

- Androidの場合、次のオプションを設定します。

- 「ターゲット」: デプロイメント・ターゲット(「エミュレータ」または「デバイス」)を選択します。

- 「最大試行回数」: 許可する接続試行の最大回数を選択します。

- 「間隔」(秒): 接続試行間の間隔の長さを秒単位で選択します。

ヒント:

Androidデバイスまたはエミュレータの動作が遅いか、またはタイムアウトになる場合、「最大試行回数」または「間隔」を増やして、Javaが初期化し、Androidスターターを強制的に長く待機させるために十分な時間を確保するか、終了する前に試行を増やしてください。

図22-1 「モバイル実行構成」ダイアログ

22.3.2 iOSプラットフォームでのデバッグ方法

iOSプラットフォームでJDeveloperを使用してMAFアプリケーションをデバッグするには、第22.3項「MAFアプリケーションのデバッグ」で説明されているデバッグ手順に従います。

iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、次を参照してください。

- 第19.4.1項「iOSシミュレータへのiOSアプリケーションのデプロイ方法」

- 第19.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」

- 第19.4.4.2項「テストおよびデバッグ用のAppleデバイスの登録」

22.3.3 Androidプラットフォームでのデバッグ方法

AndroidプラットフォームでJDeveloperを使用してMAFアプリケーションをデバッグするには、第22.3項「MAFアプリケーションのデバッグ」で説明されているデバッグ手順に従います。

Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、第19.3.1項「AndroidエミューレータへのAndroidアプリケーションのデプロイ方法」を参照してください。

Androidデバイスまたはエミュレータで実行中のMAFアプリケーションのデバッグを可能にするには、図22-2のように、maf-application.xmlファイルの「ネットワーク」デバイス・アクセスのオプションを有効にします。

図22-2 Androidでのデバッグの有効化

22.3.4 MAF AMXコンテンツのデバッグ方法

MAFアプリケーションにMAF AMXコンテンツが含まれている場合は、デバイスまたはエミュレータの構成後、JDeveloperの他のアプリケーションをデバッグするときと同じように、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックのインスペクトを行うことができます。

注意:

デバッグできるのは、JavaコードおよびJavaScriptのみです(第22.3.5項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。

22.3.5 JavaコードおよびJavaScriptのデバッグを有効にする方法

cvm.propertiesファイルでは、JVMの起動パラメータおよびMAFのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。cvm.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置されます(第22.4項「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>/src/META-INFの場所に対応しています。

cvm.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プロパティは必要ありません。

cvm.propertiesファイルの内容は、次のようなものです。

java.debug.enabled=true
java.debug.port=8000

javascript.debug.enabled=true

JDeveloperを使用してJavaコードをデバッグする方法については、第22.3項「MAFアプリケーションのデバッグ」を参照してください。

22.3.5.1 iOS 7およびiOS 8プラットフォーム上でのiOSデバイス・シミュレータを使用したJavaScriptのデバッグに関する必知事項

iOS 7またはiOS 8プラットフォームで作業している場合、Safariブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariのプリファレンスを開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします(図22-3を参照)。

図22-3 Safariブラウザ・オプションの有効化

「Develop」メニューが有効になったら、「iPhone Simulator」または「iPad Simulator」を選択し(図22-4および図22-5を参照)、デバッグするUIWebViewを選択します。「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。

図22-4 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ

図22-5 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ

22.4 ロギングの使用方法と構成

サポートされるすべてのプラットフォームでMAFアプリケーションのロギングを有効にするには、JavaScript (第22.4.2項「JavaScriptのロギングの使用方法」を参照)および埋込みコード(第22.4.3項「埋込みロギングの使用方法」)で、単一ファイルへのログ出力を含む単一構成を使用します。このログ出力には、System.out.printlnおよびSystem.err.println文によって生成された出力が含まれます。

デフォルトのMAFのロギング・プロセスは、次のとおりです。

- アプリケーションの起動時、ロギングが開始されます。

- アプリケーションの以前の実行で生成された既存のログ・ファイルが削除され、現在の実行の内容のみが使用可能になります。

- アプリケーションをiOSデバイス・シミュレータ上で実行している場合、すべてのログ出力は通常、開発用コンピュータのApplication/Utilitiesディレクトリを通じてアクセスできるコンソールに送信されます。ただし、開発用コンピュータでMac OS 10.8.nを実行している場合、Javaロギング出力へのアクセスに使用できるファイルは、出力のリダイレクションに伴って生成された直後に、その名前と場所が通知されるファイルのみです。このファイルの場所の1つとして、/Users/<userid>/Library/Application Support/iPhone Simulator/6.0/Applications/<AppID>/Documents/logs/application.logがあります。
iOSデバイス上でアプリケーションを実行している場合、コンソール出力は、アプリケーションのDocuments/logsディレクトリにあるapplication.logファイルにリダイレクトされます。

Androidでは、出力は、アプリケーションと同じ名前のテキスト・ファイルにフォワードされます。出力ファイルの場所は/sdcardです。この場所が存在していないか、読取り専用として構成されている場合、ログ出力は、アプリケーションの書込み可能データ・ディレクトリに再ルーティングされます。

- logging.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置されます(第22.4項「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>/src/META-INFの場所に対応しています。このファイルでは、すべてのロガーでcom.sun.util.logging.ConsoleHandlerおよびSimpleFormatterを使用することが定義され、ログ・レベルがSEVEREに設定されます。このファイルを編集して、別のロギング動作を指定できます(第22.4.1項「プロパティ・ファイルを使用したロギングの構成方法」を参照)。

注意:

MAFアプリケーションでは、java.util.loggingパッケージからのロガーを使用することはできません。

MAFのロガーは、次のとおりoracle.adfmf.util.Utilityクラスで宣言されます。

public static final String APP_LOGNAME = "oracle.adfmf.application";
public static final Logger ApplicationLogger = Logger.getLogger(APP_LOGNAME);

public static final String FRAMEWORK_LOGNAME = "oracle.adfmf.framework";
public static final Logger FrameworkLogger = Logger.getLogger(FRAMEWORK_LOGNAME);

MAFアプリケーションで使用するロガーは、ApplicationLoggerです。

oracle.adfmf.util.logging.Traceクラスのメソッドを使用することもできます。

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

22.4.1 プロパティ・ファイルを使用したロギングの構成方法

例22-1は、ロギングの構成で使用するlogging.propertiesファイルを示しています。

例22-1 logging.propertiesファイル

# default - all loggers to use the ConsoleHandler
.handlers=com.sun.util.logging.ConsoleHandler
# default - all loggers to use the SimpleFormatter
.formatter=com.sun.util.logging.SimpleFormatter

oracle.adfmf.util.logging.ConsoleHandler.formatter=
oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.PatternFormatter.pattern=
[%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

#configure the framework logger to only use the adfmf ConsoleHandler
oracle.adfmf.framework.useParentHandlers=false
oracle.adfmf.framework.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.framework.level=SEVERE

#configure the application logger to only use the adfmf ConsoleHandler
oracle.adfmf.application.useParentHandlers=false
oracle.adfmf.application.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.application.level=SEVERE

oracle.adfmf.util.logging.ConsoleHandlerは、カスタム・フォーマッタの受信者としての役割を果たします。

oracle.adfmf.util.logging.PatternFormatterでは、ログ・メッセージの出力を可能にする、次の高度なフォーマット・トークンが許可されています。

- %LEVEL%: ロギング・レベル。

- %LOGGER%: 出力が書き込まれるロガーの名前。

- %CLASS%: ログに記録されるクラス。

- %METHOD%: ログに記録されるメソッド。

- %TIME%: ロギング・メッセージが送信された時間。

- %MESSAGE%: 実際のメッセージ。

使用可能なロギング・レベルは、次のとおりです。

- SEVERE: 重大な障害を示すメッセージ・レベルです。

- WARNING: 潜在的な問題を示すメッセージ・レベルです。

- INFO: 情報メッセージのメッセージ・レベルです。

- FINE: トレース情報を提供するメッセージ・レベルです。

- FINER: このレベルは、かなり詳細なトレース・メッセージを示します。

- FINEST: このレベルは、非常に詳細なトレース・メッセージを示します。

注意:

ロギング・レベルの詳細度を選択するときは、SEVERE、WARNINGおよびINFOレベルで出力の詳細度を上げると、アプリケーションのパフォーマンスに悪影響を及ぼすことに留意してください。

logging.propertiesファイルで定義されているロガーは、oracle.adfmf.util.Utilityクラスから取得されるロガーと一致します(第22.4項「ロギングの使用方法と構成」を参照)。ロギング・レベルも一致します。INFOよりも詳細なロギング・レベルを使用する場合は、ConsoleHandlerのロギング・レベルを、例22-2に示されているものと同じレベルに変更する必要があります。

例22-2 非常に詳細なロギング・レベルの設定

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%

22.4.2 JavaScriptのロギングの使用方法

JavaScriptは、console.log or.error/.warn/.infoに出力を書き込みます。この出力は、System.outユーティリティによってファイルにリダイレクトされます。

メッセージを指定することで、ログの出力をカスタマイズできます。次のJavaScriptコードでは、"Message from JavaScript"出力が生成されます。

<script type="text/javascript" charset="utf-8">
function test_function() { console.log("Message from JavaScript"); }
</script>

ロギング・ファイルに定義されているプロパティを利用するには、adf.mf.logパッケージ、およびそれによって提供されるApplicationロガーを使用する必要があります。

使用可能なロギング・レベルは、次のとおりです。

- adf.mf.log.level.SEVERE

- adf.mf.log.level.WARNING

- adf.mf.log.level.INFO

- adf.mf.log.level.CONFIG

- adf.mf.log.level.FINE

- adf.mf.log.level.FINER

- adf.mf.log.level.FINEST

ロギングをトリガーするには、adf.mf.log.Applicationロガーのlogpメソッドを使用し、そのメソッドのパラメータで次のものを指定します。

- ロギング・レベル

- 文字列としての現在のクラス名

- 文字列としての現在のメソッド

- 文字列としてのメッセージ文字列

例22-3は、MAFアプリケーションでのlogpメソッドの使用方法を示しています。

例22-3 ロギング・メソッドの使用方法

adf.mf.log.Application.logp(adf.mf.log.level.WARNING,
"myClass",
"myMethod",
"My Message");

logpメソッドを実行すると、次の出力が生成されます。

[WARNING - oracle.adfmf.application - myClass - myMethod] My Message

22.4.3 埋込みロギングの使用方法

埋込みロギングでは、例22-4に示されているとおり、com.sun.util.logging.Loggerを使用します。EmbeddedClassはプロジェクトで定義されるJavaクラスを表します。

例22-4 埋込みロギングの使用方法

import com.sun.util.logging.Level;
import com.sun.util.logging.Logger;
import oracle.adfmf.util.logging.*;
...
Utility.ApplicationLogger.logp(Level.WARNING,
EmbeddedClass.class.getName(),
"onTestMessage",
"embedded warning message 1");
Logger.getLogger(Utility.APP_LOGNAME).logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 2");
Logger.getLogger("oracle.adfmf.application").logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 3");

このコードによって生成される出力は、次のとおりです。

[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 1
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 2
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 3

22.4.4 iOSプラットフォームでのデバッグおよびロギングにXcodeを使用する方法

MAFプロジェクトの操作にXcodeを使用することは、JDeveloperを使用した次回のデプロイメント中に一部またはすべての変更を失う可能性があるため推奨されませんが、例外的な状況ではこれを使用できます。

始める前に

アプリケーションをJDeveloperからiOSシミュレータにデプロイします。

生成されたプロジェクトを直接Xcodeで開く手順は次のとおりです。

1. workspace_directory\deploy\デプロイメント・プロファイル名\temporary_xcode_project\に移動します。

2. Oracle_ADFmc_Container_Template.xcodeprojというXcodeプロジェクトを開きます。

開発用コンピュータでMac OS 10.8.nを実行し、Xcodeを使用してMAFアプリケーションをデバッグしている場合、IDE内(JDeveloperコンソールまたはXcodeコンソール上)にはJavaを表示できません。この出力は、ファイルにリダイレクトされます(第22.4項「ロギングの使用方法と構成」を参照)。アプリケーションのスキーマに次の引数を追加すると、この動作を無効にし、iOSデバイスまたはそのシミュレータ上でデバッグを実行するときに、XcodeからJava、JavaScriptおよびObjective-Cのログ出力にリアルタイムでアクセスできるようになります。

-consoleRedirect=FALSE

22.4.5 アプリケーション・ログへのアクセス方法

次のAPIを使用して、アプリケーションのログ情報にアクセスできます。

- oracle.adfmf.framework.api.PerfMon

- oracle.adfmf.framework.api.LogEntry

- oracle.adfmf.util.HOTS

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

第VII部

付録

第VIII部には次の付録が含まれます。

- 付録A「トラブルシューティング」

- 付録B「ローカルHTMLおよびアプリケーション・コンテナAPI」

- 付録C「デプロイメントでのプリファレンスの変換」

- 付録D「MAFアプリケーションの使用方法」

- 付録E「XMLの解析」

- 付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」

A トラブルシューティング

この付録では、モバイル・アプリケーションの様々な側面の問題、およびそれらの問題の診断方法と解決方法について説明します。

この付録の構成は、次のとおりです。

- 第A.1項「iOSシミュレータでの入力コンポーネントの問題」

- 第A.3項「コード署名が原因でデプロイメントが失敗する」

- 第A.4項「credentials属性によりデプロイメントが失敗する」

A.1 iOSシミュレータでの入力コンポーネントの問題

問題:

iOSシミュレータにデプロイされたモバイル・アプリケーションでは、マウスを使用してあるフィールドから別のフィールドに移動すると、<amx:inputText>コンポーネント・フィールドに入力されたテキストが、その別のフィールドに入力されたテキストの先頭に添付されます。たとえば、名、ミドル・ネーム、姓を入力するテキスト・フィールドがあるページで、名のフィールドにJohnと入力し、ミドル・ネームのフィールドをクリックしてPと入力すると、テキストはJohnPと表示されます。同様に、姓のフィールドをクリックしてSmithと入力すると、そのフィールドのテキストは、図A-1に示されているように、JohnPSmithと表示されます。

図A-1 以降の<amx:inputText>フィールドにおけるテキスト値の連結

注意:

この動作は、iOSシミュレータとWebページでのみ発生し、実際のデバイスでは発生ません。

解決策:

シミュレータで、入力テキスト・フィールド間を移動する場合は、マウスではなく、キーボードを使用します。

A.2 アドレス・ポイント数を制限する地理マップ・コンポーネント

問題:

Googleマップがマップ・プロバイダとして使用されているときは、地理マップ・コンポーネントはすべてのアドレス・ポイントを解決できるわけではありません。この問題の原因には、ビジネス・ライセンスを持たないユーザーのみが、アドレス解決を可能にするジオコーディング・サービスに制限付きアクセスができるというライセンスがあります。

解決策:

MAFは、ジオコーディング・サービスによって生成されるエラー・メッセージ用のハンドラを提供します。アドレス・ポイントの最大許容数を超過する場合、実行時にこれらのメッセージは表示されます。1秒当たり10リクエストに制限されているリクエストの数、および冗長リクエストの数はジオコーディングAPIに送られません。

表A-1に示すエラー・メッセージは、モニタリングする必要があります。

表A-1

エラーID

メッセージ

説明

OVER_QUERY_LIMIT

GeoCoder割当て制限を超過しました。

割当て制限を超過していることを示しています。

REQUEST_DENIED

リクエストが拒否されました。APIキーおよびクライアントIDを確認します。

リクエストにはresult_typeまたはlocation_typeパラメータが入っていても、APIキーもクライアントIDも入っていないため、リクエストが拒否されたことを示しています。

A.3 コード署名が原因でデプロイメントが失敗する

問題:

iOS開発環境では、コード署名エラーにより、モバイル・アプリケーションのデプロイメントが失敗する場合があります。

解決策:

確実にモバイル・アプリケーションに署名するには、CODESIGN_ALLOCATEを使用して環境を構成することによって、コード署名データをMach-O (Machオブジェクト)ファイルに追加します。たとえば、ターミナルから次の文字列を入力します。

export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/usr/bin/codesign_allocate"

詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)で入手可能な『codesign_allocate(1) OS X Manual Page』および『OS X ABI Mach-O File Format Reference』を参照してください。

A.4 credentials属性によりデプロイメントが失敗する

問題:

maf-feature.xmlファイルのadfmf:feature要素に定義されたcredentials属性が存在すると、JDeveloperではデプロイメントが取り消され、デプロイメント・ログに次のようなエラーが書き込まれます。

XML validation failed for file
/Users/jsmith/jdeveloper/mywork/MobileApplication/ViewController/src/META-INF/maf-feature.xml.
[12:26:44 PM] The file contains the following errors:
Error (Line 3, Column 44): Attribute credentials not defined on element adfmf:feature
Error (Line 10, Column 49): Attribute credentials not defined on element adfmf:feature
Error (Line 19, Column 51): Attribute credentials not defined on element adfmf:feature
Error (Line 35, Column 69): Attribute credentials not defined on element adfmf:feature
Error (Line 50, Column 65): Attribute credentials not defined on element adfmf:feature
[12:26:50 PM] Deployment cancelled.
[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属性に移行するとデプロイメントが失敗するため、移行しないでください。詳細は、第21.3項「モバイル・アプリケーションの認証プロセスの概要」を参照してください。

B ローカルHTMLおよびアプリケーション・コンテナAPI

この章では、MAF JavaScript API拡張機能、MAFコンテナ・ユーティリティAPI、およびカスタムHTML SpringboardアプリケーションなどのHTMLアプリケーション機能を対象としたAdfmfJavaUtilities APIの使用方法について説明します。

この章の内容は次のとおりです。

- 第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」

- 第B.2項「MAFコンテナ・ユーティリティAPI」

- 第B.3項「getDirectoryPathRootメソッドを使用したファイル・アクセス」

B.1 MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成

JavaScriptを使用してJavaScript API拡張機能をコールすることで、HTMLで作成されたカスタムSpringboardページにナビゲーション機能を追加できます。第4.5.4項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」で説明したように、JavaScript <script>タグにメソッドを追加することで、コールバックを有効にしてApache Cordovaを活用できます。例B-1は、このタグを使用したCordovaのコール方法を示しています。

例B-1 HTML Springboardページへの<script>タグの埋込み

...
<script type="text/javascript">if (!window.adf) window.adf = {};
adf.wwwPath = "../../../www/";</script>
<script type="text/javascript" src="../../../www/js/base.js"></script>
...

www/jsディレクトリの場所への相対パスは、常にHTML Springboardページ(またはカスタムHTMLページ)の場所を反映します。HTML Springboardページは、ビュー・コントローラのpublic_htmlディレクトリのルートか、そのサブディレクトリに配置できます。例B-1で、src属性(../../../www/js/base.js)とadf.wwwPath変数によって定義されているパスは、次のように、HTML Springboardファイルがpublic_htmlディレクトリのルートに配置されているときの位置を基準にしています。

JDeveloper\mywork\application name\ViewController\public_html\customspringboard.html

つまり、adf.wwwPath変数には、base.jsと同じ数の../エントリが含まれている必要があります。

注意:

MAFでbase.jsライブラリ・ファイルの前にJQueryのカスタム・バージョンがロードされている場合、MAFではJQuery JavaScriptファイルはロードされません。

public_htmlのサブディレクトリ内にあるSpringboardファイルおよびカスタムHTMLファイルが、ホストされたJavaScriptファイルにアクセスできるようにするには、各サブディレクトリの場所に応じて../エントリを追加することで、相対パスの定義を調整する必要があります。../エントリの数は、デプロイしたwwwディレクトリの場所に対して相対的な、モバイル・アプリケーション内のHTMLページの場所に応じて異なります。HTMLファイルをより深いレベルのフォルダに移動する場合、適切な数の../エントリを<script>タグに追加する必要があります。

ヒント:

www/jsディレクトリにアクセス(およびその場所を確認)するには、まずモバイル・アプリケーションをデプロイした後、deployディレクトリに移動する必要があります。www/jsディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリはtemporary_xcode_projectディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(.apk)ファイルのassetsディレクトリ内にあります。第4.5.4項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」も参照してください。

注意:

デザインタイムにはパスが存在しないので、JavaScriptインクルードは、JDeveloperによってソース・エディタ内ではエラーとして赤い波型の下線で強調表示されます。このパスは実行時に解決されます。

Cordova APIに対するMAF拡張機能では、モバイル・デバイスのAPIによってmaf-feature.xmlおよびmaf-application.xmlファイルの構成メタデータにアクセスできるようになります。これにより、モバイル・デバイスとMAFのインフラストラクチャ間の通信が確立します。これらの拡張機能は、アプリケーション機能の表示動作も指示します。

注意:

MAFではCordova 2.2.0が必要になるため、インストールされているすべてのPhoneGapプラグインをCordova 2.2.0バージョンに移行する必要があります。詳細は、Apache Cordovaのドキュメント(http://docs.phonegap.com/en/2.2.0/index.html)から入手できるアップグレード・ガイドを参照してください。

デフォルトのMAF Springboardページ、springboard.amx、およびカスタマイズされたSpringboardの構築に使用できるApplicationFeaturesデータ・コントロールの詳細は、第4.5.5項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」を参照してください。

B.1.1 カスタムHTMLページ内のコードの実行について

例B-2は、handlePageShownコールバック関数のshowpagecompleteイベントを定義するスクリプトを示しています。カスタムHTMLページ(ログイン・ページなど)では、MAFによって初めてそのページがロードおよび表示された後、標準的なDOM (Document Object Model)イベント・リスニングを使用してこのイベントをリスニングすることによって、ページに含まれる独自のコードを呼び出すことができます。

例B-2 showpagecompleteイベントの使用方法

<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パッケージにあります。例B-3では、gotoSpringboardメソッドをコールしています。oracle.adfmf.framework.api.AdfmfContainerUtilitiesの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

例B-3 Javaでのコンテナ・ユーティリティAPIのコール

import oracle.adfmf.framework.api.AdfmfContainerUtilities;
...
AdfmfContainerUtilities.gotoSpringboard();
...

B.2.1 JavaScriptコールバックの使用方法

JavaとJavaScriptのシグネチャは一致します。Javaでは、シグネチャは同期化され、直接結果が戻されます。JavaScriptは非同期なので、結果を返すsuccessコールバックと、スローされた例外を戻すfailedコールバック2つのコールバック関数が各関数に追加されます。Javaメソッドでは、success値は関数またはメソッドから戻され、例外はメソッドから直接スローされます。例B-4の疑似コードは、引数を使用しないコールpublic static functionName() throwsが、Java内でtryおよびcatchブロックを使用してどのように実行されるかを示しています。

例B-4 Javaでの引数を使用しないコールの実行

...
try {
result = AdfmfContainerUtilities.functionName();
}
catch() {
...
}

...

JavaScriptのコールは非同期なので、関数の実行が完了した時点で、コールバック・メカニズムを通して戻す必要があります。例B-5の疑似コードは、JavaScriptコールのシグネチャを示しています。

例B-5 JavaScriptコールのシグネチャ

adf.mf.api.functionName(
function(req, res) { alert("functionName complete"); },
function(req, res) { alert("functionName failed with " +
adf.mf.util.stringify(res); }
);

例B-5に示されるように、このコールはfunction(request, response)として定義されます。request引数の値は、実際のリクエストです。responseはfunction(request, response)と定義され、この値は実際のリクエストです。レスポンスは関数の実行時にスローされます。

次の疑似コードは、public static <return value> <function name>(<arg0>, <arg1>, ...) throws <exceptions>など、1つ以上の引数を使用するコールが、Java内でtry-catchブロックを使用してどのように実行されるかを示しています。

例B-6 Javaでの複数の引数を使用するコールの実行

try {
result = AdfmfContainerUtilities.<function_name>(<arg0>, <arg1>, ...);
}
catch(<exception>) {
...
}

JavaScriptのコールは非同期なので、結果を戻すことができません。そのかわりに、関数の実行の完了時にコールバック・メカニズムが必要になります。成功および失敗のコールバックのシグネチャは、どちらもfunction(request, response)です。ここでrequest引数は実際のリクエストのJSON表現です。responseはメソッドから戻されたもののJSON表現です(successコールバック関数の場合)。failedコールバック関数の場合は、スローされた例外のJSON表現になります。

注意:

JavaScriptコールを呼び出して、スタックの深度や競合状態などの問題を回避するには、その前にコールバック関数を呼び出す必要があります。

B.2.2 コンテナ・ユーティリティAPIの使用方法

コンテナ・ユーティリティAPIでは、次のメソッドが提供されます。

- getApplicationInformation: モバイル・アプリケーションのメタデータを取得します。

- gotoDefaultFeature: デフォルトのアプリケーション機能を表示します。

- getFeatures: アプリケーション機能を取得します。

- gotoFeature: 特定のアプリケーション機能を表示します。

- getFeatureByName: アプリケーション機能の名前を使用して、アプリケーション機能に関する情報を取得します。

- getFeatureById: IDを使用してアプリケーション機能を取得します。

- resetFeature: アプリケーション機能をロード時の状態にリセットします。

- gotoSpringboard: Springboardを表示します。

- hideNavigationBar: ナビゲーション・バーを非表示にします。

- showNavigationBar: ナビゲーション・バーを表示します。

- invokeMethod: Javaメソッドを起動します。

- invokeContainerJavaScriptFunction: JavaScriptメソッドを起動します。

コンテナ・ユーティリティAPIには、アプリケーションにバッジおよびバッジ番号を設定するためのメソッドが含まれています。詳細は、第B.2.15項「アプリケーション・アイコンへのバッジ設定」を参照してください。

B.2.3 getApplicationInformation

このメソッドは、アプリケーションに関する情報を格納したApplicationInformationオブジェクトを戻します。このメソッドでは、アプリケーションID、アプリケーション名、バージョン、アプリケーションのベンダーといったメタデータが戻されます。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.ApplicationInformation
getApplicationInformation()
throws oracle.adfmf.framework.exception.AdfException

例B-7は、このメソッドのコール方法を示しています。

例B-7 Javaを使用したアプリケーション情報の取得

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にはエラーが格納されます。

例B-8は、これらのコールバック関数を使用してアプリケーション情報を取得する方法を示しています。

例B-8 JavaScriptでコールバック関数を使用してアプリケーション情報を戻す方法

adf.mf.api.getApplicationInformation(
function(req, res) { alert("getApplicationInformation complete"); },
function(req, res) { alert("getApplicationInformation failed with " +
adf.mf.util.stringify(res); }
);

B.2.4 gotoDefaultFeature

このメソッドは、MAFがデフォルトのアプリケーション機能を表示するようにリクエストします。デフォルトのアプリケーション機能とは、モバイル・アプリケーションの起動時に表示されるアプリケーション機能です。

注意:

認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoDefaultFeature(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数にはエラーが格納されます。

例B-9は、これらのコールバック関数を使用してデフォルトのアプリケーション機能をコールする方法を示しています。

例B-9 JavaScriptのコールバック関数を使用してデフォルトのアプリケーション機能をアクティブ化する方法

adf.mf.api.gotoDefaultFeature(
function(req, res) { alert("gotoDefaultFeature complete"); },
function(req, res) { alert("gotoDefaultFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.5 getFeatures

このメソッドは、使用可能なアプリケーション機能を表すFeatureInformationオブジェクトの配列を戻します。戻されるメタデータには、機能ID、アプリケーション機能名およびアプリケーション・アイコンに使用するイメージ・ファイルの場所が含まれます。このコールにより、カスタムSpringboardの実装は、制約の適用後に使用可能になるアプリケーション機能のリストにアクセスできるようになります。(これらのアプリケーション機能もデフォルトのSpringboardに表示されることがあります。)

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation[] getFeatures()
throws oracle.adfmf.framework.exception.AdfException

例B-10は、このメソッドの使用方法を示しています。

例B-10 Javaを使用したアプリケーション機能情報の取得

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)が格納されます。

例B-11 JavaScriptのコールバック関数を使用したアプリケーション機能情報の取得

adf.mf.api.getFeatures(
function(req, res) { alert("getFeatures complete"); },
function(req, res) { alert("getFeatures failed with " +
adf.mf.util.stringify(res); }
);

B.2.6 gotoFeature

このメソッドは、MAFが、IDによって識別されたアプリケーション機能を表示するようにリクエストします。

注意:

認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

Javaでは、このメソッドは次のようにコールされます。

public static void gotoFeature(java.lang.String featureId)
throws oracle.adfmf.framework.exception.AdfException

例B-12に示すように、このメソッドのパラメータはアプリケーション機能のIDです。

例B-12 アプリケーション機能のアクティブ化

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にはエラーが格納されます。

例B-13は、これらのコールバック関数を使用してアプリケーション機能をコールする方法を示しています。

例B-13 JavaScriptのコールバック関数を使用したアプリケーション機能のアクティブ化

adf.mf.api.gotoFeature("feature0",
function(req, res) { alert("gotoFeature complete"); },
function(req, res) { alert("gotoFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.7 getFeatureByName

このメソッドは、渡されたアプリケーション機能の名前を使用して、アプリケーション機能に関する情報を戻します。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation getFeatureByName(java.lang.String
featureName)
throws oracle.adfmf.framework.exception.AdfException

例B-14に示すように、このメソッドのパラメータはアプリケーション機能の名前です。

例B-14 アプリケーション機能名を使用したアプリケーション機能情報の取得

...
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にはエラーが格納されます。

例B-15は、これらのコールバック関数の使用方法を示しています。

例B-15 JavaScriptのコールバック関数を使用した、アプリケーション機能名によるアプリケーション機能情報の取得

adf.mf.api.getFeatureByName("feature.name",
function(req, res) { alert("getFeatureByName complete"); },
function(req, res) { alert("getFeatureByName failed with " +
adf.mf.util.stringify(res); }
);

B.2.8 getFeatureById

このメソッドは、アプリケーションIDを使用してアプリケーション機能を取得します。

Javaでは、このメソッドは次のようにコールされます。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

例B-16に示すように、このメソッドのパラメータはアプリケーション機能のIDです。

例B-16 Javaでの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にはエラーが格納されます。

例B-17は、これらのコールバック関数を使用してアプリケーション機能を取得する方法を示しています。

例B-17 JavaScriptのコールバック関数を使用した、IDによるアプリケーション機能の取得

adf.mf.api.getFeatureById("feature.id",
function(req, res) { alert("getFeatureById complete"); },
function(req, res) { alert("getFeatureById failed with " +
adf.mf.util.stringify(res); }
);

B.2.9 resetFeature

このメソッドは、アプリケーション機能の状態をリセットします。このメソッドでは、アプリケーション機能のJava側のモデルをリセットして、モバイル・アプリケーションがロードされ、最初にアプリケーション機能が表示されたときのようにユーザー・インタフェース・プレゼンテーションを再起動します。

Javaでは、このメソッドは次のようにコールされます。

public static void resetFeature(java.lang.String featureId)
throws oracle.adfmf.framework.exception.AdfException

例B-18に示すように、このメソッドのパラメータはリセットされるアプリケーション機能のIDです。

例B-18 Javaでのアプリケーション機能のリセット

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.resetFeature("feature.id");
}
catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void resetFeature(featureId, success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(アプリケーション機能のID)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例B-19は、これらのコールバック関数を使用してアプリケーション機能をコールする方法を示しています。

例B-19 JavaScriptのコールバック関数を使用してアプリケーション機能をリセットする方法

adf.mf.api.resetFeature("feature0",
function(req, res) { alert("resetFeature complete"); },
function(req, res) { alert("resetFeature failed with " +
adf.mf.util.stringify(res); }
);

B.2.10 gotoSpringboard

このメソッドは、MAFがSpringboardをアクティブ化するようにリクエストします。

注意:

maf-application.xmlファイルで機能参照として指定されていない場合や、認証関連または許可関連の問題が発生している場合、このメソッドではSpringboardを表示できないことがあります。第4.5項「Springboardとナビゲーション・バーの動作の構成」も参照してください。

Javaでは、このメソッドは次のようにコールされます。

public static void gotoSpringboard()

例B-20は、このメソッドの使用方法を示しています。

例B-20 JavaでのSpringboardのアクティブ化

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にはエラーが格納されます。

例B-21は、これらのコールバック関数の使用方法を示しています。

例B-21 JavaScriptのコールバック関数を使用してSpringboardをアクティブ化する方法

adf.mf.api.gotoSpringboard(
function(req, res) { alert("gotoSpringboard complete"); },
function(req, res) { alert("gotoSpringboard failed with " +
adf.mf.util.stringify(res); }
);

B.2.11 hideNavigationBar

このメソッドは、MAFがナビゲーション・バーを非表示にするようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void hideNavigationBar()

例B-22は、このメソッドの使用方法を示しています。

例B-22 Javaでのナビゲーション・バーの非表示化

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にはエラーが格納されます。

例B-23は、これらのコールバック関数の使用方法を示しています。

例B-23 JavaScriptのコールバック関数を使用してナビゲーション・バーを非表示にする方法

adf.mf.api.hideNavigationBar(
function(req, res) { alert("hideNavigationBar complete"); },
function(req, res) { alert("hideNavigationBar failed with " +                                   adf.mf.util.stringify(res); }
);

B.2.12 showNavigationBar

このメソッドは、MAFがナビゲーション・バーを表示するようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void showNavigationBar()

例B-24は、このメソッドの使用方法を示しています。

例B-24 Javaでのナビゲーション・バーの表示

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にはエラーが格納されます。

例B-25は、これらのコールバック関数の使用方法を示しています。

例B-25 JavaScriptのコールバック関数を使用してナビゲーション・バーを表示する方法

adf.mf.api.showNavigationBar(
function(req, res) { alert("showNavigationBar complete"); },
function(req, res) { alert("showNavigationBar failed with " +                                       adf.mf.util.stringify(res); }
);

B.2.13 invokeMethod

このメソッドは、Javaでは提供されません。例B-26は、JavaScriptのコールバック・メソッドを使用して、クラスパスに含まれる任意のクラスからJavaメソッドを起動する方法を示しています。

例B-26 JavaScriptのコールバック関数を使用してJavaメソッドをコールする方法

adf.mf.api.invokeMethod(classname,
methodname,
param1,
param2,
...
paramN,
successCallback,
failedCallback);

表B-1に、このメソッドによって取得されるパラメータを示します。

表B-1 invokeJavaMethodに渡されるパラメータ

パラメータ

説明

classname

Javaメソッドのコール時にMAFがインスタンスを作成するために使用するクラス名(パッケージ情報を含む)

methodname

classnameパラメータによって指定されたクラスのインスタンスで起動させるメソッドの名前

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

複数のパラメータによるこのメソッドの使用例は次のとおりです。

- adf.mf.api.invokeMethod("TestBean", "setStringProp", "foo", success, failed);

- adf.mf.api.invokeMethod("TestBean", "getStringProp", success, failed)

整数パラメータの使用例は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testSimpleIntMethod", "101", success, failed);

複合パラメータの使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testComplexMethod",
{"foo":"newfoo","baz":"newbaz",".type":"TestBeanComplexSubType"}, success, failed);

パラメータが存在しない場合の使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "getComplexColl", success, failed);

Stringパラメータの使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testMethodStringStringString", "Hello ",
"World", success, failed);

B.2.14 invokeContainerJavaScriptFunction

invokeContainerJavaScriptFunctionは、JavaScriptメソッドを起動します。表B-2に、このメソッドによって渡されるパラメータを示します。

表B-2 invokeContainerJavaScriptFunctionに渡されるパラメータ

パラメータ

説明

featureId

JavaScriptの起動コンテキストを決定するためにMAFによって使用されるアプリケーション機能のID。このIDによって、このメソッドがコールされるWebビューが決まります。

method

起動させるメソッドの名前。

args

メソッドに渡される引数の配列。この配列内で、これらの引数はメソッドが期待する順序で並べられます。

このメソッドは、JSONオブジェクトを戻します。

注意:

invokeContainerJavaScriptFunction APIは、アプリケーションがAndroidデバイスまたはエミュレータ上で実行される場合、JavaScript関数が15秒以内に完了することを予期します。完了しなかった場合は、タイムアウト・エラーを戻します。

例B-27 invokeContainerJavaScriptFunctionメソッド

public static java.lang.Object invokeContainerJavaScriptFunction(java.lang.String featureId,
java.lang.Object[] args)
throws oracle.adfmf.framework.exception.AdfException

例B-28の疑似コードは、feature1という名前のアプリケーション機能に含まれるappFunctions.jsという名前のJavaScriptファイルを示しています。このファイル内で記述されているJavaScriptメソッド、application.testFunctionは、invokeContainerJavaScriptFunction methodによってコールされます(例B-29を参照)。アプリケーションには、この関数をコールするアクション・リスナーで構成されるコマンド・ボタンが含まれているので、ユーザーがこのボタンをクリックすると、次のようなアラートが表示されます。

- APP ALERT 0

- APP ALERT 1

- APP ALERT 2

例B-28 appFunctions.js

(function()
{
if (!window.application) window.application = {};

application.testFunction = function()
{
var args = arguments;

alert("APP ALERT " + args.length + " ");
return "application.testFunction - passed";
};
})();

例B-29の疑似コードは、invokeApplicationJavaScriptFunctionメソッドによって、例B-28で記述されているJavaScriptメソッド(application.testFunction)をコールする方法を示しています。

例B-29 JavaでのJavaScript関数のコール

invokeApplicationJavaScriptFuntions
public void invokeApplicationJavaScriptFuntions(ActionEvent actionEvent) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {} );
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {"P1"} );
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {"P1", "P2"} );
}

詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスおよびAPIDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

B.2.15 アプリケーション・アイコンへのバッジ設定

AdfmfContainerUtilitiesクラスには、モバイル・アプリケーション・アイコンにバッジ番号を設定したり、その番号を取得するためのメソッドが含まれています。表B-3に、これらのメソッドを示します。

表B-3 アイコンへのバッジ設定メソッド

メソッド

説明

パラメータ

getApplicationIconBadgeNumber

モバイル・アプリケーションのアイコンに現在設定されているバッジの値を取得します。アプリケーション・アイコンにバッジが設定されていない場合は、ゼロ(0)を戻します。

なし

setApplicationIconBadgeNumber

モバイル・アプリケーションのアイコンにバッジ番号を設定します。

バッジの値(int badge)。

注意:

アプリケーション・アイコンへのバッジ設定は、Androidではサポートされていません。

B.3 getDirectoryPathRootメソッドを使用したファイル・アクセス

adfmfJavaUtilties APIには、getDirectoryPathRootメソッドが含まれています。このメソッドはJavaレイヤーからのみコールでき、iOSシステムとAndroidシステムの両方にあるファイルへのアクセスを可能にします。例B-30に示すように、このメソッドを使用すると、デバイス上の一時ファイル、アプリケーション・ファイル(iOS上)およびキャッシュ・ディレクトリの場所に、TemporaryDirectory、ApplicationDirectoryおよびDeviceOnlyDirectory定数を使用してそれぞれアクセスできます。DeviceOnlyDirectoryの場所に格納されたファイルは、デバイスの接続時には同期されません。

注意:

アプリケーションからディレクトリまたはファイルへのアクセスを試みる前に、それらのディレクトリまたはファイルが存在することを確認してください。

oracle.adfmf.framework.api.AdfmfJavaUtilitiesの詳細は、Oracle Fusion Middleware Oracle Mobile Application Framework Java APIリファレンスを参照してください。

例B-30 ファイルへのアクセス

import oracle.adfmf.framework.api.AdfmfJavaUtilities;

...

public void getDirectoryPathRoot() {
// returns the directory for storing temporary files
String tempDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.TemporaryDirectory);

// returns the directory for storing application files
String appDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.ApplicationDirectory);

// returns the directory for storing cache files
String deviceDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DeviceOnlyDirectory);

// returns the directory for storing downloaded files
String downloadDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory);
}

B.3.1 プラットフォームに依存しないダウンロード場所へのアクセス

ファイル記憶域の要件は、プラットフォームによって異なります。Androidプラットフォームでは、アプリケーションからファイルへのアクセス元となる単一の場所が規定されていません。そのかわり、アプリケーションでは、権限が付与された任意の場所にファイルを書き込むことができます。一方、iOSプラットフォームでは通常、アプリケーション・ディレクトリ内にファイルを格納します。このような違いにより、ApplicationDirectoryをgetDirectoryPathRootメソッドに渡すと、AndroidデバイスではなくiOSデバイス上で実行されているアプリケーションの添付ファイルを表示するために必要なファイルの場所を戻すことができます。アプリケーションをiOSデバイスとAndroidデバイスの両方で実行する場合、プラットフォーム固有のコードを記述してこれらの場所を取得するのではなく、getDirectoryPathRootメソッドにDownloadDirectoryを渡すことによって、外部記憶域の場所とデフォルトの添付ファイル・ディレクトリへのパスを両方戻すことができます。この定数(列挙型)には、DeviceManager APIのdisplayFileメソッドで使用する場所が反映されます。このメソッドでは、プラットフォーム固有の機能を使用してこれらの場所を検索することによって、添付ファイルを表示します。

Androidの場合、DownloadDirectoryでは、Environment.getExternalStorageDirectoryメソッド(SDカードなどのAndroid用外部記憶域ディレクトリを取得する)によって戻されるパスを参照します。iOSデバイス上で実行されるモバイル・アプリケーションの場合は、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がどのようにユーザー・プリファレンスを変換するかについて説明します。

このドキュメントには次の項が含まれます。

- 第C.1項「プリファレンスのネーミング・パターン」

- 第C.2項「Android用のプリファレンスの変換」

- 第C.3項「iOS用のプリファレンスの変換」

C.1 プリファレンスのネーミング・パターン

デプロイメント・ターゲットが呼び出されると、モバイル・アプリケーション・プリファレンスの、モバイル・プラットフォーム表現への変換が行われます。変換後、表C-1で説明されているネーミング・パターンにより、モバイル・プラットフォーム上で各プリファレンスを一意に識別できるようになります。maf-application.xmlおよびmaf-feature.xmlファイル内の各プリファレンス要素は、デプロイメントの前に、その兄弟要素の範囲内で一意に識別される必要があります。

識別子値の例は、次のとおりです。

- application.gen.gps.trackGPS

- feature.f0.gen.gps.trackGPS

表C-1は、完全修飾されたプリファレンス識別子の生成方法を示しています。

表C-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>

表C-1のコード例で引用されている<adfmf:preferences>要素にはid属性がなく、そのため、これはどのプリファレンス識別子でも表されません。

C.2 Android用のプリファレンスの変換

MAFのデプロイメントでは、XMLとXLSを使用して、アプリケーション機能とアプリケーション・レベルの両方で定義されているユーザー・プリファレンス・ページを、次の3つのXMLドキュメントに変換します。

- preferences.xml

- arrays.xml

- strings.xml

C.2.1 Preferences.xml

このファイルには、maf-feature.xmlとmaf-application.xmlの両方のファイルからの変換済のプリファレンスが含まれています。

C.2.1.1 プリファレンス要素のマッピング

表C-2は、MAFのプリファレンス定義の、Androidテンプレート・プリファレンスおよびAndroidネイティブ・プリファレンスへのマッピングを示しています。

表C-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

C.2.1.2 プリファレンス属性のマッピング

Preferences.xmlファイルには、strings.xmlおよびarrays.xmlファイルの両方に格納されている文字列リソースへの参照が含まれています。Android SDKでは、XMLファイル内のリソースの構文を@[<package_name>:]<resource_type>/<resource_name>と定義しています。このファイルには、文字列値への参照だけでなく、リスト・プリファレンスの名前と値のペアも含まれています。XSLは、文字列とリスト・プリファレンスに対して次のものを作成します。

- <package_name> は、リソースが存在するパッケージの名前です(同じパッケージのリソースを参照するときは必要ありません)。参照のこのコンポーネントは使用されません。

- <resource_type>は、リソース・タイプのRサブクラスです。このコンポーネントは、文字列参照の作成時はstring、リスト・プリファレンスの作成時はarrayの値を持ちます。

- <resource_name>は、XML要素内のandroid:name属性値です。android:title属性を指定する場合、このコンポーネントの値は、<PreferenceIdentifier>_titleになります(<PreferenceIdentifier>の定義については、第C.1項「プリファレンスのネーミング・パターン」を参照してください)。

表C-3と表C-4は、特定のMAFプリファレンスに対するMAF属性の、Androidプリファレンスへのマッピングを示しています。

この表では、

- {X}というフォームのエントリ(表C-3の{default}など)は、Xという名前のMAF属性の値を示しています。

- <PreferenceIdentifier>があるエントリは、第C.1項「プリファレンスのネーミング・パターン」で説明されているとおり、プリファレンス識別子の値を示しています。

- アスタリスク(*)が付いている属性は、MAFの名前空間で定義されているカスタムのテンプレート属性であり、preferences.xmlにadfmf:<attributeName>というフォームで存在している必要があります。それ以外の属性は、Androidの名前空間の一部であり、preferences.xmlにandroid:<attributeName>として存在している必要があります。

表C-3 MAFプリファレンス属性の、Androidプリファレンスへのマッピング

MAFの属性定義

テンプレート・カスタムまたはAndroidネイティブ・プリファレンス属性

Android属性値

適用対象

id

key

<PreferenceIdentifier>

AdfMFPreferenceBoolean、AdfMFPreferenceText、AdfMFPreferenceList、PreferenceScreen、PreferenceCategory

default

defaultValue

{default}

AdfMFPreferenceBoolean、AdfMFPreferenceText、AdfMFPreferenceList

label

title

指定された{label}値が文字列リソース・バンドルへの参照でない場合は、@string/<PreferenceIdentifier>___title。指定された{label}を持つ、strings.xml内の文字列を参照します。

AdfMFPreferenceBooleanAdfM、FPreferenceNumber、AdfMFPreferenceText、AdfMFPreferenceList、PreferenceScreen、PreferenceCategory

secret

password

{secret}

AdfMFPreferenceText

min

min*

{min}

AdfMFPreferenceText

max

max*

{max}

AdfMFPreferenceText

name

entryValues

@array/<PreferenceIdentifier>___entryValues

AdfMFPreferenceList

value

entries

@array/<PreferenceIdentifier>___entries

AdfMFPreferenceList

C.2.1.3 属性のデフォルト値

次の場合、maf-application.xmlおよびmaf-feature.xmlファイル用の概要エディタでは、XMLからの属性名と値は除外されます。

- 属性タイプがxsd:booleanである。

- 属性値に<default>値オプションがある。

- ユーザーが値として<default>を指定している。

XSLは、ブール・タイプのMAF属性と、対応するデフォルト値を認識している必要があります。XSLはその後、適切なAndroidまたはテンプレート・カスタム属性値を指定します(ユーザーによって選択された場合)。

表C-4は、変換されるMAFプリファレンスにdefault属性が含まれていない場合に、デプロイメントでandroid:defaultValue属性に対して指定されるものを示しています。

表C-4 デフォルト以外の値を持つ属性の変換

MAFプリファレンス要素

等価のAndroidプリファレンス

デフォルトの属性値

preferenceBoolean

AdfMFPreferenceBoolean

false

preferenceText

AdfMFPreferenceText

空の文字列

preferenceList

AdfMFPreferenceList

空の文字列

C.2.1.4 プリファレンス画面ルート要素

preferences.xmlファイルには、<PreferenceScreen>と呼ばれるルート要素があります。Androidテンプレートでは、この要素に次のXML名前空間定義が存在している必要があります。

xmlns:adfmf="http://schemas.android.com/apk/res/<Application Package Name>

ここで、<Application Package Name>要素は、AndroidManifest.xmlファイル内にあるものと同じアプリケーション・パッケージ名として定義されます。<Android Package Name>は、AndroidManifest.xmlファイルで指定されているAndroidパッケージ名を定義します。詳細は、第4.3.1項「モバイル・アプリケーションのIDおよび表示動作の設定方法」を参照してください。

デプロイメントでは、Androidデプロイメント・プロファイルのアプリケーション・バンドルID値が使用されます(存在する場合)。プロファイルにアプリケーション・バンドルID値が存在しない場合は、maf-application.xmlファイルに含まれているアプリケーションの表示名およびアプリケーションIDからこの値が取得されます。デプロイメントJavaコードは、この値をXSLドキュメントにパラメータとして渡します。

例C-1は、maf-feature.xmlファイルに含まれているMAFプリファレンスを示しています。

例C-1 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/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>

C.2.2 arrays.xml

arrays.xmlファイルは、preferences.xmlファイルから参照されるリスト・プリファレンスの名前と値を列挙する文字列配列要素で構成されています。maf-application.xmlおよびmaf-feature.xmlファイルに含まれている各<preferenceList>要素は、2つの文字列配列要素(1つは名前用、もう1つは値用)に変換されます。たとえば、例C-2に記載されているMAFのpreferenceList定義は、例C-3に示されているように、arrays.xmlファイル内の<string-array name="feature.oracle.hello.prefGroup.MyList___entry_values">および<string-array name="feature.oracle.hello.prefGroup.MyList___entries">に変換されます。

例C-2 maf-feature.xmlファイルにおける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>
...

例C-3は、arrays.xmlファイルに含まれている、<preferenceList>要素から変換された文字列配列要素のペアを示しています。

例C-3 arrays.xmlにおける、<string-array>要素に変換されたプリファレンス・リスト

<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>

例C-4は、preferences.xmlで参照されている<string-arrays>を示しています。

例C-4 preferences.xmlファイルからのPreferenceList参照

<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" />

C.2.3 Strings.xml

例C-5で示されているstrings.xmlファイルは、preferences.xmlファイルによって参照される文字列要素、およびmaf-application.xmlおよびmaf-feature.xmlファイルで定義されているリソース・バンドル参照で構成されています。各文字列要素には、文字列および文字列値を一意に識別するname属性があります。

例C-5 strings.xmlファイル

<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>です。

例C-6 maf-feature.xmlファイルで定義されているリソース・バンドル参照

<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>

C.3 iOS用のプリファレンスの変換

MAFデプロイメントは、表C-4に記載されているMAFプリファレンスを、iOS設定アプリケーションで必要なプリファレンス・リスト(.plist)ファイル表現に変換します。

表C-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』を参照してください。

例C-7 maf-application.xmlファイルに基づいたXML

<adfmf:preferences>
<adfmf:preferenceGroup id="gen"
label="Oracle Way Cool Mobile App">
<adfmf:preferenceGroup id="SubPage01"
label="Child Page">
</adfmf:preferenceGroup>
</adfmf:preferences>

D MAFアプリケーションの使用方法

この付録には、MAFのユーザーの操作性に関する初歩的な情報が記載されています。

この付録の構成は、次のとおりです。

- 第D.1項「MAFアプリケーションの使用方法の概要」

- 第D.2項「モバイル・デバイスへのMAFアプリケーションのインストール」

- 第D.3項「アプリケーション機能間の移動」

- 第D.4項「プリファレンスの設定」

- 第D.5項「ログ・ファイルの表示」

- 第D.6項「アプリケーションの使用方法の制限」

D.1 MAFアプリケーションの使用方法の概要

MAFアプリケーションをインストールしたら(第D.2項「モバイル・デバイスへのMAFアプリケーションのインストール」を参照)、エンド・ユーザーは、モバイル・デバイスのホーム画面でアプリケーション・アイコンを選択して(図D-1を参照)、MAFアプリケーションの使用を開始できます。アプリケーションの起動時、ホーム画面にはスプラッシュ画面が表示されます。起動が完了したら、エンド・ユーザーは、アプリケーション機能間を移動したり(第D.3項「アプリケーション機能間の移動」を参照)、プリファレンスを設定したり(第D.4項「プリファレンスの設定」を参照)、他のすべてのタスクを実行することが可能になります。

図D-1 iPhone上のアプリケーション・アイコン

D.2 モバイル・デバイスへのMAFアプリケーションのインストール

エンド・ユーザーは、通常のアプリケーション・プロビジョニング・メカニズムを通じてMAFアプリケーションをダウンロードおよびインストールできます。

インストール時、アプリケーションのプリファレンスにはデフォルト設定が移入されます。デフォルトの変更方法については、第D.4項「プリファレンスの設定」および第D.2.2項「AndroidデバイスへのMAFアプリケーションのインストール方法」を参照してください。

モバイル・デバイスからMAFアプリケーションを削除することは、他のアプリケーションのアンインストールと変わりません(第D.2.3項「MAFアプリケーションのアンインストール方法」を参照)。

D.2.1 iOSデバイスへのMAFアプリケーションのインストール方法

iOSデバイスのユーザーは、次のいずれかの方法でMAFアプリケーションをダウンロードおよびインストールします。

- エンタープライズ固有の配布メカニズムから

- iTunesを使用

- iPhone構成ユーティリティを通じてデプロイ

- Webサーバー上でワイヤレスにホスティング

- AppleのApp Storeから

D.2.2 AndroidデバイスへのMAFアプリケーションのインストール方法

アプリケーション・マーケットプレイスで利用可能なMAFアプリケーションをインストールすることに加えて、エンド・ユーザーは、アプリケーション・マーケットプレイスの外部で利用可能なアプリケーションをダウンロードできます。これを実行する方法については、Webで情報を検索することをお薦めします。

D.2.3 MAFアプリケーションのアンインストール方法

MAFアプリケーションは、他のアプリケーションと同様にモバイル・デバイスから削除されます。アンインストール・プロセスでは、アプリケーションとともにすべてのアプリケーション・データおよびすべての外部プリファレンスが削除されます。

D.3 アプリケーション機能間の移動

各アプリケーション機能へのアクセスを提供するために、MAFアプリケーションは、ナビゲーション・バーまたはSpringboardを使用して、有効なアプリケーション機能間の移動を可能にします。

アプリケーション開発時のナビゲーションの構成については、第4.5項「Springboardとナビゲーション・バーの動作の構成」を参照してください。

D.3.1 iOSデバイスでのアプリケーション機能間の移動方法

図D-2は、iPhone上に表示されるMAFのUI要素を示しています。

図D-2 iPhone上のUI要素

UIは、ナビゲーション・アイテム(アイコン)が移入されたナビゲーション・バーで構成されています。最初のナビゲーション・アイテムは強調表示されており、これが選択されていることを示しています。

注意:

アプリケーションに対してSpringboardが定義されている場合は、オーバーレイ形式で「ホーム」ナビゲーション・ボタンがナビゲーション・バーの上に表示されますが、このボタンはその一部ではありません。このボタンにより、エンド・ユーザーは、アプリケーション・コンテンツからSpringboardに戻ることができます。

アプリケーションに対してSpringboardが指定されていない場合、「ホーム」アイコンは表示されません。

詳細は、第4.5項「Springboardとナビゲーション・バーの動作の構成」を参照してください。

図D-2で示されている例のナビゲーション・バーには、6つのナビゲーション・アイテムが含まれていますが、iPhone上のスペースが限られているため、すべてのナビゲーション・アイテムを同時に表示することはできません。そのため、5つ目のアイコンは、「次へ」機能になっています。「次へ」機能がアクティブ化されると、ナビゲーション・バーが展開され、残りのナビゲーション・アイテムが表示されます。iPad上では、すべてのナビゲーション・アイテムが表示されます。ナビゲーション・バーの上のコンテンツ領域には、この特定のソリューションに固有のコンテンツが表示されます。前述の例では、アプリケーションにバンドルされている発注の承認ツールです。

注意:

ナビゲーション・バーに少なくとも1つのアプリケーション機能のアイコンが表示されている場合、エンド・ユーザーに対して、「非表示」ボタン(ナビゲーション・バーが表示されている場合にそれを非表示にするボタン)と「表示」ボタン(ナビゲーション・バーが非表示の場合にそれを表示するボタン)が表示されます。

アプリケーションXMLファイル(adfmf-application.xml)で1つのアプリケーション機能のみが定義されている場合、または制約(または条件)で1つのアプリケーション機能のみの表示が許可されている場合、ナビゲーション・バーは非表示になります。

adfmf-application.xmlファイルで、ナビゲーション・バーに表示されるアプリケーション機能が参照されていない場合、「非表示」と「表示」のボタンがエンド・ユーザーに表示されず、ナビゲーション・バーが最初は非表示になっている可能性があります。この場合、Springboardが定義されているときは、それがアプリケーションに対する唯一のナビゲーション・ツールになります。

詳細は、第D.3.1.2項「単一機能アプリケーションの使用」を参照してください。

図D-3は、「次へ」アイコンがアクティブ化され、残りのナビゲーション・アイテムがリストとして表示された後のiPhone画面を示しています。エンド・ユーザーは「次へ」リスト内でアイテムを再配置できます。

図D-3 iPhone上のすべてのナビゲーション・アイテムの表示

アプリケーションの起動時にナビゲーション・バーに表示されるナビゲーション・アイテムを変更するには、図D-4に示すとおり、「編集」を選択して「構成」モードにします。

図D-4 iPhone上の「構成」モード

「構成」モードでは、コンテンツ領域からアイコンをドラッグし、それをナビゲーション・バーにドロップできます。この例では、図D-5に示すとおり、ナビゲーション・バーで「送信」ナビゲーション・アイテムがGleナビゲーション・アイテムに置き換えられ、「送信」は「次へ」アイテムの下にリストされています。構成モードを終了するには、「終了」を選択して「次へ」画面に戻ります。

図D-5 iPhone上のナビゲーション・バー表示の変更

エンド・ユーザーがナビゲーション・バーで新たに再配置されたGleナビゲーション・アイテムを選択すると、図D-6に示すとおり、コンテンツ領域にGleページが表示されます。

図D-6 iPhone上の再配置されたナビゲーション・アイテムのアクティブ化

D.3.1.1 Springboardを使用した移動

MAFでは、デフォルトでSpringboardナビゲーションは無効になっています。これは、開発時にadfmf-application.xmlファイルを構成することで有効化されます(第4.5項「Springboardとナビゲーション・バーの動作の構成」を参照)。

Springboardを使用したナビゲーションに対してMAFアプリケーションが有効である場合、アプリケーションの起動時、エンド・ユーザーに、図D-7に示すような画面が表示されます。

図D-7 Springboard画面

上の図では、MAFで提供されているデフォルトのSpringboardがデフォルトの縦レイアウトでiPhone上に表示されています(開発時にカスタムSpringboardを作成する方法については、第4.5項「Springboardとナビゲーション・バーの動作の構成」を参照してください)。エンド・ユーザーが利用可能なアプリケーション・コンテンツ機能が3ページあり、画面の下部に3つのドットで示されています。エンド・ユーザーは、3つのページの最初のページを表示しています。最初のドットが明るく示されており、ユーザーが最初のページを表示していることがわかります。

機能の2番目のページを開く(図D-8を参照)には、iPhoneの画面を右から左にスワイプします。すると、最初のページが左に移動し、右から2番目のページが現れます。最初のページが左に移動してフェードアウトし、2番目のページが現れてフェードインします。

図D-8 Springboard: 2番目のページ

上の図では、エンド・ユーザーは3つのページの2番目のページを表示しています。2番目のドットが明るく示されていることで、それがわかります。

エンド・ユーザーがモバイル・デバイスを横方向に回転すると、それに応じてSpringboardアイコンの位置が変わります(図D-9を参照)。

図D-9 横表示のSpringboard画面

表示の方向が変わってもページは変わらず、ページ2が表示されていることに注意してください。

横方向の表示になっている間に機能の最初のページに戻る(図D-10を参照)には、iPhoneの画面を左から右にスワイプします。すると、2番目のページが右に移動し、左から最初のページが現れます。

図D-10 横表示のSpringboard: 最初のページ

1ページ目にある特定の機能(「コンタクト先」など)を表示するには、「コンタクト先」アイコンまたは該当するテキストをタッチします。

iOSデバイスでは、エンド・ユーザーは、デバイス・シェイク・ジェスチャーによって、どのアプリケーション機能からもSpringboardに戻ることができます。

Androidデバイスでは、エンド・ユーザーは、メニュー項目を使用していつでもSpringboardに戻ることができます。

D.3.1.2 単一機能アプリケーションの使用

アプリケーションには、単一の機能しか持たないものもあります。その機能は、Springboardまたはナビゲーション・バーに表示されるようには構成されません。この場合、その単一の機能のみがエンド・ユーザーに表示され、ナビゲーション・バーの表示を制御したり、Springboardに戻ったりするための特殊なボタンは表示されません。

D.3.2 Androidデバイス上での移動方法

Androidデバイスでのアプリケーション機能のナビゲーションは、「次へ」機能を除いて、iOSデバイスでのナビゲーションとほぼ同じです(第D.3.1項「iOSデバイスでのアプリケーション機能間の移動方法」を参照)。Androidデバイスでは、「次へ」機能がアクティブ化されると、残りのナビゲーション・アイテムのリストが表示されます。ナビゲーション・バーの外観は変わりません。

D.4 プリファレンスの設定

エンド・ユーザーは、モバイル・プラットフォームによって規定されている方法でアプリケーションのプリファレンスを構成できます。

アプリケーション開発時のプリファレンスの構成については、第14章「ユーザー・プリファレンスの有効化」を参照してください。

D.4.1 iOSデバイスでのプリファレンスの設定方法

エンド・ユーザーは、iOSデバイスで「設定」アプリケーションを開き、MAFアプリケーションの「設定」アイコンを選択して、そのアプリケーションで使用可能なすべての設定にアクセスできます。変更された設定は、「設定」アプリケーションを終了すると有効になります。これは、iOSデバイス上のすべてのアプリケーションの通常の動作です。

起動時、プリファレンスにはデフォルト値が移入されています。それらの値は、adf-feature.xmlファイルで定義されています。プリファレンスの値を設定するための標準的な方法に加えて、次の方法で値を定義できます。

- 値のリストから選択する。

- 読取り不可の値として(パスワードなどを入力する場合)。

- バイナリ値として。

プリファレンスは、カスケード・ページに表示されます。変更可能なプリファレンスと変更できないプリファレンスは、容易に区別できます。

プリファレンスを使用して、ユーザーの資格証明をグローバルに設定できます(第21章「モバイル・アプリケーションの保護」を参照)。

D.4.2 Androidデバイスでのプリファレンスの設定方法

Androidデバイスでのプリファレンスの設定は、iOSデバイスでのプリファレンスの設定と同じです(第D.4.1項「iOSデバイスでのプリファレンスの設定方法」を参照)。プリファレンスには、「プリファレンス」メニュー項目からアクセスできます。

注意:

そのアプリケーションに対して定義されているプリファレンスが存在しない場合は、メニューに「プリファレンス」メニュー項目が表示されることはありません。

D.5 ログ・ファイルの表示

診断とサポートの目的で、有効化されたアプリケーション機能のアプリケーション・ログ・ファイルをデバイス上に表示できます。

iOSデバイスの場合、ログ・ファイルは~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>にあります。ログ・ファイルにアクセスする前に、デバイスを同期する必要があることに注意してください。

Androidデバイスにおけるログ出力の検索および表示の詳細は、http://developer.android.com/tools/help/logcat.htmlを参照してください。

ロギングの詳細は、第22.4項「ロギングの使用方法と構成」を参照してください。

D.6 アプリケーションの使用方法の制限

一般的なMAFアプリケーションの様々なモジュールの使用方法には、多くの制限があります。

D.6.1 リスト・ビュー・コンポーネントの制限

MAF AMXリスト・ビュー・コンポーネントを使用する際に(第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- リスト・ビュー・コンポーネントが編集モードの場合、エンド・ユーザーが実行可能なのは、(リスト・アイテム・コンポーネントによって表示されている)行の並替えのみであり、行を選択またはハイライトすることはできません。

D.6.2 データ視覚化コンポーネントの制限

MAF AMXデータ視覚化コンポーネントを使用する際に(第6.5項「データ視覚化の指定」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- 地理マップ(第6.5.17項「地理マップ・コンポーネントの使用方法」を参照)を除いて、MAF AMXデータ視覚化コンポーネントは、Android 2.nプラットフォームで相互作用をサポートしていません。

- Androidでは、WAI-ARIAアクセシビリティ機能はデータ視覚化コンポーネントに対してサポートされません。

D.6.3 Androidプラットフォームでのデバイスの「戻る」ボタンの制限

Android 4.nでは、エンド・ユーザーは、デバイスの戻るボタンによって、前にアクセスしたアプリケーション機能に戻ります。エンド・ユーザーがアプリケーションの起動時に最初にアクセスしたアプリケーション機能に到達するまでデバイスの戻るボタンをアクティブ化し続けても、アプリケーションは存在しています。

ビュー間の移動の構成方法は、第6.3.5.7項「戻るボタン・ナビゲーションの有効化」を参照してください。

D.6.4 アクセシビリティ・サポートの制限

アクセシビリティが必要な際に(第6.8項「MAFのアクセシビリティのサポートの理解」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

- MAF AMX UIコンポーネントは、アプリケーションがAndroidスクリーン・リーダー・モードで実行された場合、正しく動作しない可能性があります。

- Androidでは、WAI-ARIAアクセシビリティ機能はDVTコンポーネントに対してサポートされません。

E XMLの解析

この付録では、XMLの解析で使用できるライブラリについて説明します。

この付録には次の項が含まれます:

- 第E.1項「kXMLライブラリを使用したXMLの解析」

E.1 kXMLライブラリを使用したXMLの解析

コアMAFライブラリの1つであるkXMLは、XMLの解析に使用できるAPIを提供します。このライブラリは、JDKプロファイラ・インタフェース(JVMPI)を通じてアプリケーションに公開されます。

詳細は、kXMLのドキュメントを参照してください。

- http://kxml.sourceforge.net/kxml2

- http://kxml.sourceforge.net/kxml2/javadoc

F サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション

この付録では、サンプルのモバイル・アプリケーション・フレームワーク・アプリケーションについて説明します。

この付録には次の項が含まれます:

- 第F.1項「サンプルのMAFアプリケーションの概要」

F.1 サンプルのMAFアプリケーションの概要

モバイル・アプリケーション・フレームワークには、基本的なアーティファクトの作成、デバイス・ネイティブな機能(SMS、電子メールなど)へのアクセス、ローカルのSQLiteデータベース上でのCRUD (作成、読取り、更新および削除)操作の実行など、様々な開発シナリオを提供するサンプル・アプリケーションのセットが付属しています。これらのアプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内の次の場所に存在するPublicSamples.zipファイルにあります。

jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

これらのアプリケーションを表示するには、PublicSamples.zipファイルをJDeveloper作業ディレクトリ(これは通常、User Home Directory/jdeveloper/myworkです)に抽出します。

注意:

サンプルのアプリケーションは、Samplesディレクトリに抽出する必要があり、このディレクトリから開く必要があります。これらのアプリケーションを正しく動作させるには、第4.5.1項「アプリケーションのナビゲーションの構成方法」の説明に従ってmaf-application.xmlファイルを更新することにより、Springboardをクラスパスに追加しておく必要があります。

Springboardをクラスパスに追加する手順は次のとおりです。

1. Samplesディレクトリからアプリケーションを開きます。

2. maf-application.xmlファイルの概要エディタの「アプリケーション」ページで、Springboardオプションを「デフォルト」から「なし」に変更します。

3. Springboardオプションとして「デフォルト」を選択します。

4. 「すべて保存」をクリックします。

5. アプリケーションをデプロイします。

これらのアプリケーションについては、すべて表F-1で説明されています。他に説明されていないかぎり、これらのアプリケーションは、第2章「開発環境の設定」の説明に従って開発環境を構成した後、シミュレータにデプロイできます。

表F-1 サンプルのMAFアプリケーション

アプリケーション名

説明

サンプル・アプリケーションの実行に必要な追加のリソース

HelloWorld

フレームワークの基本的な構造を示す、MAFのhello worldアプリケーション。この基本アプリケーションには、ローカルのHTMLファイルによって実装される単一のアプリケーション機能があります。このアプリケーションを使用して、開発環境が、アプリケーションのコンパイルとデプロイのために正しく設定されていることを確認します。第3.2.2項「MAFアプリケーションの作成時に行われる処理」も参照してください。

CompGallery

このアプリケーションは、これらのコンポーネントのすべてを示すことによって、MAF AMX UIコンポーネントを紹介する役割を果たします。このアプリケーションを使用して、これらのコンポーネントの属性を変更し、その変更の効果をリアルタイムで確認できます。変更を行うたびにアプリケーションを再コンパイルして再デプロイする必要はありません。一般的な情報については、第6章「MAF AMXユーザー・インタフェースの作成」を参照してください。

UIDemo

このアプリケーションは、ユーザー・インタフェース・レイアウトと、モバイル・アプリケーションで一般的に使用される様々なリストおよびボタン・スタイルの作成方法を示します。また、ポップアップ・コンポーネントのアクション・シート・スタイルの作成方法、および様々なチャートおよびゲージ・コンポーネントの使用方法も示します。第6.3項「UIコンポーネントの作成と使用方法」および第6.5項「データ視覚化の指定」を参照してください。

このアプリケーションは、Samplesディレクトリから開く必要があります。「デフォルト」のSpringboardオプションは、maf-application.xmlの概要エディタの「アプリケーション」ページでいったんクリアし、再度選択する必要があります。

FragmentDemo

このアプリケーションは、フラグメントを使用して、テンプレートとして使用できる再利用可能なアーティファクトを定義する方法を示します。各機能に対して複数のコンテンツ・タイプ(1つはタブレット用、もう1つは電話用)を含める方法、および毎回リスト/フォームをコード化する必要がないようにフラグメントを使用する方法を示します。

Navigation

このアプリケーションは、バインドされたタスク・フローやルーターを含む、MAFの様々なナビゲーション技術を示します。様々なページ遷移についても示します。第5.2項「タスク・フローの作成」も参照してください。

このアプリケーションは、Samplesディレクトリから開く必要があります。「デフォルト」のSpringboardオプションは、maf-application.xmlの概要エディタの「アプリケーション」ページでいったんクリアし、再度選択する必要があります。

LifecycleEvents

このアプリケーションは、モバイル・アプリケーション自体およびその埋込みアプリケーション機能にライフサイクル・イベント・ハンドラを実装します。このアプリケーションは、アプリケーションがライフサイクルの特定の時点で自身のロジックを実行できるようにするためのコードを挿入する場所を示します。第4.7項「モバイル・アプリケーションでのライフサイクル・リスナーの使用」も参照してください。

iOSの場合、LifecycleEventsサンプル・アプリケーションは、/Applications/Utilities/Console.appにあるコンソール・アプリケーションにデータを記録します。

DeviceDemo

このアプリケーションは、DeviceFeaturesデータ・コントロールを使用して、地理的位置、電子メール、SMS、コンタクト先などのデバイス機能を公開する方法、およびデバイスにそのプロパティを問い合せる方法を示します。この機能は、DeviceFeaturesデータ・コントロールからdisplayFileメソッドを使用して、.doc、.ppt、.xls、.pngなどの様々なタイプのファイルを表示する方法を示します。詳細は、第7.11項「DeviceFeaturesデータ・コントロールの使用方法」および第7.11.9項「displayFileメソッドを使用してファイルの表示を可能にする方法」を参照してください。

SMSおよび一部のデバイス・プロパティはiOSシミュレータまたはAndroidエミュレータ上で機能しないため、このアプリケーションを実際のデバイス上で実行することも必要です。

GestureDemo

このアプリケーションは、MAFアプリケーションにおいてジェスチャーをどのように実装および使用できるかを示します。第6.4項「ジェスチャーの有効化」も参照してください。

StockTracker

このサンプルは、SQLite DBとdeanデータ・コントロールを使用して、CRUD操作を構築する方法の簡単な例を示します。このサンプルでは在庫のリストが表示され、在庫の作成、更新、削除または並替えを行うことができます。これは、ローカルのSQLiteデータベースを使用して、そのデータを格納します。StockTrackerアプリケーションにより、CRUD操作中にデータが保持されます。このサンプルは、データ変更イベントがどのようにJavaを使用して、データ変更をユーザー・インタフェースに反映できるかも示します。また、様々なレイアウト・ユースケース、ジェスチャーおよび基本的なモバイル・アプリケーション・レイアウト・パターンもあります。このサンプルは、作成操作および削除操作を使用して、アイテムをコレクションに追加したり、コレクションから削除する方法も示します。詳細は、PortfolioパッケージにあるPortfolio.javaクラスのaddStockおよびdeleteStockメソッドを参照してください。また、第7.13項「データ変更イベントについて」も参照してください。

WorkBetter

この人事管理アプリケーションには個人と組織の2つの機能があり、個人機能には、個人の検索ができる検索コンポーネントが含まれます。また、カスタム・コンポーネントの作成機能、再利用可能なレイアウトをフラグメントとして構築する方法、および異なる機能間でこのフラグメントを使用する方法も示します。業績、報酬および時系列関連の情報を表示する各種のDVT視覚化コンポーネントの使用方法を示しています。Organizations: People機能と同様に、フラグメントとして再利用可能なレイアウトを構築する方法およびそれを様々な機能間で使用する方法を示しています。また、異なるフォーム・ファクタのビューを作成し、これらのビューを構成する方法も示します。

このアプリケーションは、様々なUI技術および使用可能なコンポーネントのエンドツーエンドのデモとして設計されています。様々なレイアウト・パターンを示し、一般的なコンポーネントとより複雑なコンポーネントの様々な使用方法について説明します。このアプリケーションは、アプリケーション全体のショーケースではなく、ユーザー・インタフェースに重点を置いています。データ・モデル、Webサービスなどについては、他のサンプルを参照してください。

SkinningDemo

このアプリケーションでは、提供されているスタイル・シートをオーバーライドするか、独自のスタイル・シートを使用して拡張することで、アプリケーションにスキンを適用し、固有のルック・アンド・フィールを追加する方法を示します。また、このアプリケーションは、スキンがどのようにして、デバイスのタイプに基づいてMAF AMX UIコンポーネントのスタイルを制御するかも示します。実行時にスキン・ファミリ(初期状態またはカスタム)を変更する機能も示します。第4.12項「モバイル・アプリケーションのスキニング」も参照してください。

PrefDemo

このアプリケーションは、アプリケーション全体のユーザー設定ページおよびアプリケーション機能固有のユーザー設定ページを示します。一般的な情報については、第14章「ユーザー・プリファレンスの有効化」を参照してください。

Weather1

Javaコードを使用しないこのアプリケーションでは、宣言的Webサービスの使用方法を示します。このアプリケーションで使用されているWebサービスはSOAP Webサービスで、具体的には、CDYNE Corporation社(http://www.cdyne.com/)によって提供されている、郵便番号による天気予報を提供する公開Webサービスです。このアプリケーションを実行する前に、このサービスが使用できることを確認してください。一般的な情報については、第8章「Webサービスの使用方法」を参照してください。

Weather2

このアプリケーションは、プログラムによるWebサービスの起動、および実際のJavaオブジェクトに戻されたGenericTypeオブジェクトの解析方法を示します。この場合、ユーザー・インタフェースは、直接Webサービスにバインドされるのではなく、Java Beanにバインドされます。詳細は、第8.6項「JavaからのWebサービスの起動」を参照してください。

Weather3

このアプリケーションはWeather2のサンプル・アプリケーションと同じですが、非ブロック化バックグラウンド・スレッドを使用してWebサービスを呼び出す方法、およびサービスが戻された場合にユーザー・インタフェースを更新する方法を示します。このアプリケーションは、スレッドからデータ変更イベントをフラッシュして、ユーザー・インタフェースを更新する方法を示します。

RESTDemo

このアプリケーションは、REST Webサービスの使用方法を示します。この2つのアプリケーション機能(REST-XMLおよびREST-JSON)は、一般に公開されている同じWebサービスを使用して任意のIPアドレスまたはドメインの地理座標を取得します。このサービスは、XML形式またはJSON形式を戻すことができます。REST-XMLアプリケーション機能はXSDを使用し、URLデータ・コントロールを作成して構造化データにアクセスします。ユーザー・インタフェースはそのデータ・コントロールにバインドされます。REST-JSONバージョンでは、URL接続はWebサービスを呼び出すためにRESTServiceAdapterヘルパー・クラスによって直接使用され、このレスポンスはJSONSerializationHelperクラスを使用して解析され、Beanデータ・コントロールに移入されます。ユーザー・インタフェースはこのBeanにバインドされます。いずれのアプリケーション機能でも、Webサービス・コールの結果としてフォームまたはマップが生成されます。後者は、戻された地理座標を使用してマーカーとともに中央に配置されます。詳細は、第8.2.3項「RESTを使用したWebサービス・データ・コントロールの作成方法」を参照してください。

APIDemo

このアプリケーションは、MAF AMXページ内からカスタムJavaScriptメソッドを起動する方法を示します。この方法を使用して、DeviceFeaturesデータ・コントロールには含まれていないApache Cordova APIを起動します。また、この方法を使用してカスタムJavaScriptメソッドをアプリケーションに追加し、これらのメソッドを起動することもできます。このアプリケーションは、JavaScriptメソッドからJavaへのコールバック方法も示します。詳細は、第4.9.1項「アプリケーション機能の基本情報の定義方法」および第B.2項「MAFコンテナ・ユーティリティAPI」を参照してください。

RangeChangeDemo

リスト・ビューが新しいデータを外部ソースからフェッチしてくる必要がある場合に、このアプリケーションは、RangeChangeEventを使用してJavaハンドラ メソッドを起動する方法を示しています。また、その属性を使用してリスト・ビューのスクロールとバッファの動作を構成する方法も示しています。詳細は、第6.3.15.1項「ページングおよび動的スクロールの構成」を参照してください。

BarcodeDemo

このアプリケーションは、バッキングBeanから起動される埋込みJavaScriptからBarcodeScannerプラグインをコールすることによって、Cordovaプラグインを活用する方法を示しています。AndroidバージョンおよびiOSバージョンのプラグインは、手動でアプリケーション・コントローラ・プロジェクトおよびビュー・コントローラ・プロジェクトに追加され、maf-application.xmlファイル内で登録されます。詳細は、第4.15項「モバイル・アプリケーションへのCordovaプラグインの統合」を参照してください。

ExpandCollapseComponent

このアプリケーションは、どのタイプのAMXコンポーネントのコンテナとしても機能するカスタム・コンポーネントの作成方法を示しています。また、展開機能と縮小機能の例も提供します。詳細は、jsフォルダ内のcardview.jsファイルを参照してください。このJavaScriptファイルには、コンポーネントのUIをレンダリングするメソッド(expandcollapse.prototype.render)が含まれています。さらに、カスタム・コンポーネントの子コンポーネントをレンダリングする方法を示すメソッドも含まれています。詳細は、第12.1項「カスタムUIコンポーネントの作成の概要」を参照してください。

SlidingWindows

このアプリケーションは、AdfmfSlidingWindowUtilities APIの使用方法を示しています。このAPIを使用すると、画面に複数の機能を同時に表示できます。この例は、AdfmfSlidingWindowUtilities APIを使用してカスタムSpringboardまたはグローバル・ナビゲーション・バーを作成する方法を示しています。

ConfigServiceDemo

このアプリケーションは、Configuration Serviceを使用して、MAFアプリケーションで使用されているエンド・ポイントを変更する方法を示しています。connections.xml内のエンド・ポイントの変更は、デバイス上のアプリケーションに伝播され、アプリケーションは再初期化されて新しいエンド・ポイントを消費します。詳細は、第9.1項「エンド・ポイントの構成の概要」を参照してください。

SecurityDemo

このアプリケーションは、MAFアプリケーションを保護する方法、認証およびログイン・サーバーを構成する方法、アクセス制御サービスを使用する方法、セキュアなWebサービスにアクセスする方法を示しています。詳細は、第21.1項「モバイル・アプリケーション・フレームワークのセキュリティについて」を参照してください。

このアプリケーションは、ACSサンプル・アプリケーションで使用され、ログイン・サーバーとアクセス制御サービスの構成に使用されるRESTサービスを提供します。

ACS

このアプリケーションは、SecurityDemoアプリケーション内で使用されてログイン・サーバーとアクセス制御サービスを構成するRESTサービスを提供します。

このWebアプリケーションは、Weblogic Serverにデプロイする必要があります。

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2014, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。