7 MAFアプリケーションでのOracle Mobile Cloud ServiceプラットフォームAPIの使用
この章では、Storage APIなどのOracle Mobile Cloud Service (MCS)プラットフォームAPIの使用方法、ユーザー情報の更新方法、およびMCSの分析機能と診断機能によって分析のためにMCSに分析および診断イベントを送信する方法を説明します。
この章の内容は次のとおりです。
Oracle Mobile Cloud ServiceプラットフォームAPIの使用の概要
MAFでは、Storage APIおよびAnalytics APIなどのMCSプラットフォームAPIのサポートが提供されます。また、MAFでは、MCSユーザー情報の更新、およびMCS Diagnosticsへの診断情報の送信もサポートされています。
これらのプラットフォームAPIのいずれかを使用するための最初の手順は、MCSへのMAFアプリケーションの接続です。これを行うには、「MCS接続」チェック・ボックスを選択し、クライアント・データ・モデルを作成するためにサービスに接続するときのモバイル・バックエンドIDおよび無名アクセス・キーを指定します。この作業の詳細は、「RESTサービスへの接続によるクライアント・データ・モデルの作成」を参照してください。接続詳細を指定するウィザードを完了すると、JDeveloperによって、アプリケーションのmobile-persistence-config.properties
ファイルに次のエントリが書き込まれます。
# MCS connection details, applicationScope EL Expressions
# are allowed for backend ID and anonymous key
mcs.connection=MCS
mcs.mobile-backend-id=bcda8418-8c23-4d92-b656-9299d691e120
mcs.anonymous-key=c3RldmVuLmtpbmc6U3RhYWYyMDE1IQ==
アプリケーションがMCSで認証される前にMCSプラットフォームAPIまたはカスタムAPIにアクセスすると、アクセス・キーによってAuthorizationヘッダーが作成されます。MCSに対して認証されると、MAFによって、ユーザー・ログイン資格証明に基づいてすべてのRESTコールにAuthorizationヘッダーが自動的に挿入されます。つまり、mobile-persistence-config.properties
ファイル内で指定されている無名アクセス・キーは無視されます。このキーの詳細は、「MCS無名アクセス・キーに関する必知事項」を参照してください。
oracle.maf.api.cdm.persistence.manager.MCSPersistenceManager
クラスは、MCSプラットフォームAPIへのすべてのコールを処理します。デフォルトでは、mobile-persistence-config.properties
ファイル内の設定が使用されますが、カスタム・コードで次のメソッドを呼び出すことで、このファイル内の設定をオーバーライドできます。
-
setConnectionName(String connectionName)
-
setMobileBackendId(String mobileBackendId)
-
setAnonymousKey(String anonymousKey)
-
setAuthHeader(String authHeader)
-
login(String userName, String password)
アプリケーションで動的MCS接続をサポートする必要がある場合は、mobile-persistence-config.properties
ファイル内のmcs.mobile-backend-id
値およびmcs.anonymous-key
値のためにEL式を指定できます。MCS接続の実際のURLは、AdfmfJavaUtilities.overrideConnectionProperty
メソッドを使用して実行時に変更できます。次のサンプル・コードでは、ユーザー・プリファレンスに基づいてMCS接続URLを動的に設定する方法を示します。
String mcsHost = (String)AdfmfJavaUtilities.evaluateELExpression("#{preferenceScope.application.connection.host}");
AdfmfJavaUtilities.clearSecurityConfigOverrides("MCS");
AdfmfJavaUtilities.overrideConnectionProperty("MCS", "restconnection", "url", mcsHost+"/mobile");
「MAFアプリケーションでのライフサイクル・リスナーの使用方法」で説明しているように、通常は、アプリケーション・ライフサイクル・リスナーのstart()
メソッドにこのコードを含めます。AdfmfJavaUtilities.overrideConnectionProperty
メソッドの使用の詳細は、「実行時に名前付き接続の接続属性を更新する方法」を参照してください。
Oracle Mobile Cloud Serviceユーザー情報へのアクセス
MAFのMCSPersistenceManager
には、ユーザーをMCSでログインおよびログアウトさせるため、ならびにユーザー情報を取得および更新するためのメソッドが用意されています。
MCSにプログラムでログインするには、次のメソッドを使用します。
String response = new MCSPersistenceManager().login(userName, password);
これにより、MCSからレスポンス・ペイロードが返されます。ご参考までにこのメソッドを説明しますが、ユーザー認証には、MAFの宣言サポートを使用することをお薦めします。後者のオプションでは、基本認証またはOAuthを使用できます。安全な方法でユーザー名およびパスワードを思い出すためのオプションも用意されています。また、MAF機能を保護することで、保護されている機能にユーザーが初めてアクセスしたときに、ログイン画面が自動的に表示されます。
MCSからプログラムでログアウトするには、次のメソッドを使用します。
String response = new MCSPersistenceManager().logout();
この場合もやはり、アプリケーションを保護するためには、MAFの宣言サポートを使用することをお薦めします。MAFの宣言サポートを使用する場合は、次のMAF APIコールを使用してログアウトする必要があります。
AdfmfJavaUtilities.logout();
ユーザー認証のためのMAFの宣言サポートの詳細は、「MAFアプリケーションの保護」を参照してください。
MCSに格納されたユーザーのすべての属性を取得するには、次のメソッドを使用します。
String response = new MCSPersistenceManager().findUser(userName);
それにより、次のようなレスポンス・ペイロードが返されます。
{ "id": "a8acf41f-50a7-473e-8376-d6346cf188be", "username": "GEVANS", "email": "george.evans@ebsss.com", "firstName": "George", "lastName": "Evans", "jobTitle": "Cloud Solutions Architect", "links": [ { "rel": "canonical", "href": "/mobile/platform/users/GEVANS" }, { "rel": "self", "href": "/mobile/platform/users/GEVANS" } ] }
注意:
MCSでユーザー・レルムのために定義されているカスタム属性も返されます。上の例では、jobTitle
はカスタム属性の例です。
次のメソッドでユーザー属性を更新します。
String response = new MCSPersistenceManager().updateUser(userName, payload);
渡すペイロードは、変更する必要がある属性のリストです。たとえば、次のようになります。
{ "email" : "gevans@ebsss.com", "jobTitle": "Senior Cloud Solutions Architect" }
Oracle Mobile Cloud Service記憶域コレクション内のファイルへのアクセス
MAFアプリケーション内のMCS記憶域コレクションから記憶域オブジェクトを取得、ダウンロードおよびフィルタする方法を説明します。
MAFでは、MCS Storage APIへのプログラムによるアクセスと宣言によるアクセスが提供されます。宣言によるアクセスを使用するには、oracle.maf.api.cdm.mcs.storage.StorageObjectService
からBeanデータ・コントロールを作成します。生成されたデータ・コントロールには、記憶域コレクション内のファイルにアクセスするための幅広い操作が用意されています。StorageObjectService
クラスにプログラムでアクセスすることもできます。ファイルの取得に加えて、MCS記憶域コレクション内のファイルを作成および更新することや、MCS記憶域ファイルをデータ・オブジェクトに関連付けることができます。たとえば、MCSからの小さいサムネイル従業員画像とともに従業員を表示するリスト・ページを作成し、そこから、写真のある従業員フォーム・ページに移動できます。その写真は、エンド・ユーザーが新しい写真を撮ることで更新できます。オフライン・サポートは記憶域オブジェクト・メタデータとして十分に実装され、ファイルはデバイス上に格納されます。記憶域オブジェクトは、オフライン・モードで作成および更新できます。MAFアプリケーションからのオフライン・トランザクションの同期で説明されているように、MAFでは、デバイスがオンラインに戻るとこれらのオブジェクトをMCSと同期します。
ここで説明したユースケースの実装の詳細は、次を参照してください。
StorageObjectService Beanデータ・コントロールの作成方法
MCS記憶域コレクション内のオブジェクトを取得および管理するために使用できる、StorageObjectService
データ・コントロールを作成および使用する方法を説明します。
StorageObjectService
Beanデータ・コントロールを作成するには、次の手順を実行します。
StorageObject Beanデータ・コントロールの作成時の処理内容
JDeveloperでは、「データ・コントロール」パネルでStorageObjectService
データ・コントロールが生成されます。
図7-2 生成されたStorageObjectServiceデータ・コントロール

通常は、複数ファイルの集まりまたは単一ファイルをダウンロードおよび表示するために、このデータ・コントロールが公開するメソッドを使用します。次のpersistence-mapping.xml
ファイルからの例に示すように、StorageObject
マッピング・ディスクリプタのremoteReadInBackground
プロパティがtrue
に設定されている場合は、記憶域オブジェクトを取得するためにMAFアプリケーションがMCSに対して行うRESTコールは、バックグラウンドで実行されます。同様に、remoteWriteInBackground
プロパティがtrue
に設定されている場合は、MCS内の記憶域オブジェクトを作成または更新するための、MAFアプリケーションからのRESTコールは、バックグラウンドで実行されます。
永続性マッピングの編集ウィザードを使用してこれらのプロパティを変更することはできません。かわりに、persistence-mapping.xml
ファイル内で直接これらのプロパティを編集します。このファイルは、アプリケーションのワークスペースのApplicationController\src\META-INF
ディレクトリにあります。
<classMappingDescriptor className="oracle.maf.api.cdm.mcs.storage.StorageObject" persisted="true">
<crudServiceClass className="oracle.maf.api.cdm.mcs.storage.StorageObjectService" autoIncrementPrimaryKey="true"
localPersistenceManager="oracle.maf.api.cdm.persistence.manager.DBPersistenceManager"
remotePersistenceManager="oracle.maf.impl.cdm.persistence.manager.MCSStoragePersistenceManager"
remoteReadInBackground="true"
remoteWriteInBackground="true"
showWebServiceInvocationErrors="true"
autoQuery="false"
enableOfflineTransactions="true"/>
<table name="STORAGE_OBJECT">
<primaryKeyColumn name="ID"/>
<primaryKeyColumn name="COLLECTION_NAME"/>
</table>
<attributeMappings>
Oracle Mobile Cloud Service記憶域コレクションからのすべてのファイルの取得方法
MCSからすべての記憶域オブジェクトを取得するための、StorageObjectService
データ・コントロールで公開されるメソッドの使用方法を説明します。
図7-3には、従業員のコレクション内の各従業員のサムネイル画像をレンダリングするためにどのようにStorageObjectServiceデータ・コントロールからのfindAllStorageObjectsInCollection(String)
メソッドを使用できるかを示します。このメソッドをAMXページにドラッグ・アンド・ドロップし、表示されるコンテキスト・メニューで「MAFパラメータ・フォーム」を選択します。これにより、コレクション名のための入力フィールド、およびメソッドを実行するためのボタンが作成されます。メソッドを実行すると、データ・コントロールのstorageObjectsコレクションによってコレクションのコンテンツが移入されます。その後、たとえば「MAFリスト・ビュー」として、storageObjectsコレクションをAMXページにドラッグ・アンド・ドロップできます。
図7-3 リスト・ビュー内のMCS記憶域コレクションからの画像ファイル

別の方法としては、findAllStorageObjectsInCollectionメソッドをメソッド・アクティビティとしてタスク・フローにドラッグ・アンド・ドロップし、このアクティビティから、コレクションのコンテンツを表示するAMXページにコントロール・フロー・ルールを追加できます。このドラッグ・アンド・ドロップを実行する場合は、collectionName
パラメータの値を提供する必要があります。提供する値は、ハードコードするかEL式にできます。
storageObjectsコレクションには最初はSQLiteデータベースからのローカル記憶域オブジェクトが移入されており、MCSへのコールはバックグラウンドで実行され、MCSの結果が返されるとUIがリフレッシュされます。
図7-3には、リスト項目ごとに画像を表示するためにどのように記憶域ファイルを使用するかを示します。これを行うには、amx:image
要素のソース属性を、記憶域オブジェクトのfilePath
属性の値に設定します。filePath
属性には、モバイル・デバイス上のダウンロード済ファイルへの参照が保持されます。
<amx:image source="#{row.filePath}" inlineStyle="width:40px;height:40px;" id="i1"/>
findAllStorageObjectsInCollection
メソッドでは、各記憶域オブジェクトのメタデータが返されます。画像ファイルをダウンロードするには、記憶域オブジェクトのdownloadIfNeededInBackground
属性をoutputText
要素としてドラッグ・アンド・ドロップします。実行時に、MAFアプリケーションによって、StorageObject
クラスのgetDownloadIfNeedInBackground
メソッドが呼び出されます。このメソッドでは、空文字列が返され、画像ファイルのダウンロードがトリガーされます。事前にファイルがダウンロードされている場合は、MAFでは、MCS内の記憶域オブジェクトのETag
に、SQLiteデータベースに格納されているローカルETag
と同じ値があるかどうかを確認するために、最初にHEAD
コールが行われます。値が異なる場合は、MAFによってファイルがダウンロードされます。次のサンプルでは、図7-3で示すリスト・ビューをレンダリングする、listView
コンポーネントのコードを示します。
MAFですべての画像ファイルがダウンロードされるまでページを読み込まないようにする場合は、かわりにdownloadIfNeeded
属性をドラッグ・アンド・ドロップします。
<amx:listView var="row" value="#{bindings.storageObjects.collectionModel}"
fetchSize="#{bindings.storageObjects.rangeSize}"
selectedRowKeys="#{bindings.storageObjects.collectionModel.selectedRow}"
initialScrollRowKeys="#{bindings.storageObjects.collectionModel.selectedRow}"
selectionListener="#{bindings.storageObjects.collectionModel.makeCurrent}"
showMoreStrategy="autoScroll" bufferStrategy="viewport" id="lv1">
<amx:listItem id="li1" rendered="#{row.contentType=='image/jpeg'}">
<amx:tableLayout width="100%" id="tl1">
<amx:rowLayout id="rl2">
<amx:cellFormat width="40px" halign="center" rowSpan="2" id="cf6">
<amx:image source="#{row.filePath}" inlineStyle="width:40px;height:40px;" id="i1"/>
<amx:outputText value="#{row.downloadIfNeededInBackground}" id="ot6"/>
</amx:cellFormat>
<amx:cellFormat width="60%" height="#{deviceScope.device.os=='Android'?'36':'32'}px" id="cf4">
<amx:outputText value="#{row.name}" id="ot4"/>
</amx:cellFormat>
<amx:cellFormat width="10px" rowSpan="2" id="cf3"/>
<amx:cellFormat width="40%" halign="end" id="cf5">
<amx:outputText value="#{row.contentType}" styleClass="adfmf-listItem-highlightText" id="ot5"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl1">
<amx:cellFormat width="60%" height="#{deviceScope.device.os=='Android'?'22':'19'}px" id="cf1">
<amx:outputText value="#{row.createdOn}" styleClass="adfmf-listItem-captionText" id="ot2"/>
</amx:cellFormat>
<amx:cellFormat width="40%" halign="end" id="cf2">
<amx:outputText value="#{row.ETag}" styleClass="adfmf-listItem-captionText" id="ot3"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>
MCS記憶域コレクションからの記憶域オブジェクトのリストのフィルタ方法
StorageObjectServiceでMCS記憶域コレクションから取得する記憶域オブジェクトのリストをフィルタする方法を説明します。
StorageObjectService
APIでは、MCS記憶域コレクション内のすべてのオブジェクト、または1つのオブジェクトのみの取得がサポートされています。すべての記憶域オブジェクト・メタデータを格納するSQLiteデータベースを使用することで、デバイス上の結果をフィルタできます。これを行うには、oracle.maf.api.cdm.mcs.storage.StorageObjectService
から拡張する、サブクラスを作成します。フィルタされたエンティティ・リストの使用で説明されている、MAFアプリケーション内のデータ・オブジェクトをフィルタするためにサービス・オブジェクト・クラス内に記述するコードのように、取得した記憶域オブジェクトをフィルタするこのサブクラス内にコードを記述します。
oracle.maf.api.cdm.mcs.storage.StorageObjectService.
から拡張する、作成したサブクラスからデータ・コントロールを生成します。
Oracle Mobile Cloud Service記憶域コレクションからの単一ファイルの取得方法
MCSから単一の記憶域オブジェクトを取得およびダウンロードするためにStorageObjectServiceデータ・コントロールで公開される、findStorageObject
メソッドの使用方法を説明します。
findStorageObject
メソッドは、次の2つのパラメータを取ります。
-
MCS内のコレクションの名前
-
記憶域オブジェクトのID
findStorageObject
メソッドをMAFパラメータ・フォームとしてドラッグ・アンド・ドロップし、それら2つのパラメータのための入力フィールド、およびメソッドを実行するためのボタンを作成します。このメソッドの結果StorageObjects
要素をAMXページに、たとえばMAF読取り専用フォームとしてドラッグ・アンド・ドロップできます。
ダウンロードする記憶域オブジェクトが画像の場合は、次の例で示すように、filePath
属性をoutputText
コンポーネントとしてドラッグ・アンド・ドロップしてから、それをイメージ・コンポーネントに変更します。
<amx:image id="i1" source="#{bindings.filePath.inputValue}" inlineStyle="height:200px;"/>
図7-4には、MAFアプリケーションのUIにレンダリングする画像ファイルをfindStorageObject
メソッドによってダウンロードしたAMXページを示します。
図7-4 画像ファイルをダウンロードするfindStorageObjectメソッド

MAFアプリケーション内のデータと記憶域オブジェクトを関連付ける方法
MCS記憶域コレクションから記憶域オブジェクトを取得し、それをMAFアプリケーション内のデータ・オブジェクトと関連付けるために、StorageObjectService
およびStorageObject
クラスを使用するJavaコードを記述する方法を説明します。
カメラなど、MAFアプリケーションのデバイス機能を使用して取得できるデータによって、レコードのバックエンド・システムから既存データを強化することは、MAFアプリケーション構築時によくある要件です。次のコード例では、どのようにMCS記憶域コレクションから取得される写真と従業員データを関連付けることができるかを説明します。
デフォルト・コンストラクタを使用してStorageObjectService
クラスのインスタンスを作成するか、あるいは、アプリケーションのpersistence-mapping.xml
ファイル内で設定されているremoteReadInBackGround
およびremoteWriteInBackground
の値をオーバーライドできるようにするコンストラクタを使用できます。これはJavaコード内では簡単なため、RESTコールの結果を直接使用します。
次のコード例では、後者のコンストラクタを使用して、MCS記憶域コレクション内のすべての記憶域オブジェクトを取得する方法を示します。
StorageObjectService sos = new StorageObjectService(false,false);
sos.findAllStorageObjectsInCollection("HR");
List<StorageObject> storageObjects = sos.getStorageObjects();
次のコード例では、従業員の写真を従業員リスト・ビューおよびフォーム・ページに追加するJavaコードを示します。このページでは、従業員データはカスタムMCS APIで取得され、MCS記憶域コレクション(HR)で写真が格納されます。このサンプル・コードでは、デバイスのカメラを使用して新しい従業員のための写真を追加する方法も示します。
現在の従業員に写真を関連付けるために、従業員の写真に対して次のネーミング規則を使用します。
EmpImg[EmployeeID suffix]
// Example: EmpImg100
まず、次のゲッター・メソッドおよびセッター・メソッドを使用して、タイプStorageObject
の画像プロパティをEmployee
データ・オブジェクトに追加します。
private StorageObject picture;
public StorageObject getPicture() {
if (picture == null) {
StorageObjectService sos = new StorageObjectService(false, false);
picture = sos.findOrCreateStorageObject("HR", "EmpImg" + getId());
picture.setDownloadCallback(() -> {
refreshUI(Arrays.asList(new String[]{"picture"}));
});
picture.getDownloadIfNeededInBackground();
}
return picture;
}
public void setPicture(StorageObject picture) {
this.picture = picture;
}
ゲッター・メソッドでは、写真StorageObject
がまだnullかどうかを確認します。そのとおりの場合は、StorageObjectService
をインスタンス化し、findOrCreateStorageObject
メソッドを呼び出します。このメソッドには、MCSコレクションの名前、およびMCSコレクション内の従業員写真ファイルのIDを渡します。このメソッドは、ローカルのオンデバイス・データベースに照会し、STORAGE_OBJECT
テーブルに一致行がある場合に記憶域オブジェクトを返します。行が見つからない場合は、そのコレクション名とオブジェクトIDを設定して、新しいStorageObject
インスタンスが作成されます。次に、従業員の写真をダウンロードした後にUIをリフレッシュできるようになる、コールバック(setDownloadCallback(() ->
)を指定します。最後に、getDownloadIfNeededInBackground
メソッドを呼び出します。このメソッドは、MCSを呼び出して、ファイルをダウンロードし、必要な場合に記憶域オブジェクト・メタデータを更新します。
注意:
事前にファイルがダウンロードされている場合は、MAFでは、MCS内の記憶域オブジェクトのETag
に、SQLiteデータベースに格納されているローカルETag
と同じ値があるかどうかを確認するために、最初にHEAD
コールが行われます。値が変更されている場合は、ファイルがダウンロードされます。
デバイス上のファイルのダウンロード場所は、アプリケーション・ディレクトリ(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.ApplicationDirectory)によって返される値)
の下の/MCS/[collectionName]
という名前のサブディレクトリです。ファイルの名前は、MCS内の記憶域オブジェクトの名前、またはMCSで名前が設定されていない場合はIDとなります。StorageObjectのsetDirectoryPath(String directoryPath)
メソッドを呼び出すことで、デフォルトのダウンロード・ディレクトリをオーバーライドできます。
これで写真StorageObject
がEmployeeクラスに追加されたため、図7-5に示すように、写真filePath
プロパティをドラッグ・アンド・ドロップして、画像を部門内の従業員のリストに追加できます。
図7-5 ListViewへの画像の追加

始めてDepartmentページに移動したときには、従業員の写真が表示されるまでに少し時間がかかります。部門内の従業員ごとに、MCSから写真をフェッチするためにバックグラウンドで並列RESTコールが行われます。次回のアプリケーション実行時には、画像はすぐに表示されます。
図7-6で示すようにRESTコールの結果が404 Not Foundレスポンスとなったために、従業員の写真がまだMCS内にない場合は、デフォルトではエラー・メッセージが表示されます。
図7-6 Webサービス・エラー・メッセージ

図7-6で示すようなWebサービス起動エラー・メッセージがエンド・ユーザーに表示されないようにするには、次の例で示すように、StorageObject
ディスクリプタのためにpersistence-mapping.xml
内のshowWebServiceInvocationErrors
プロパティをfalse
に設定します。
<classMappingDescriptor className="oracle.maf.api.cdm.mcs.storage.StorageObject" persisted="true">
<crudServiceClass className="oracle.maf.api.cdm.mcs.storage.StorageObjectService"
autoIncrementPrimaryKey="true"
localPersistenceManager="oracle.maf.api.cdm.persistence.manager.DBPersistenceManager"
remotePersistenceManager="oracle.maf.impl.cdm.persistence.manager.MCSStoragePersistenceManager"
remoteReadInBackground="true" remoteWriteInBackground="true"
showWebServiceInvocationErrors="false"
autoQuery="false" enableOfflineTransactions="true"/>
従業員の新しい写真をアップロードするには、従業員フォーム・ページにcommandLink
コンポーネントを追加します。このページでは、カメラを使用して写真を撮るか写真ギャラリから既存の写真を選択するマネージドBeanメソッドが呼び出されます。次の例では、そのようなマネージドBeanメソッドについて、想定される実装を示します。
public void takePicture(ActionEvent actionEvent) {
DeviceManager device = DeviceManagerFactory.getDeviceManager();
int cameraType =
device.hasCamera() ? DeviceManager.CAMERA_SOURCETYPE_CAMERA: DeviceManager.CAMERA_SOURCETYPE_PHOTOLIBRARY;
String picture = device.getPicture(50, DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI, cameraType, false,
DeviceManager.CAMERA_ENCODINGTYPE_PNG, 520, 380);
Employee emp =
(Employee) AdfmfJavaUtilities.getELValue("#{bindings.employeesIterator.currentRow.dataProvider}");
// the camera returns an URI starting with file://, we remove this prefix to get proper file path
emp.addPicture(picture.substring(7));
}
写真を撮った後、従業員の現在のインスタンスを取得し、次の例で示すように、このインスタンス上でaddPicture
メソッドを呼び出します。
public void addPicture(String tempFilePath) {
StorageObjectService sos = new StorageObjectService();
StorageObject so = sos.findOrCreateStorageObject("HR", "EmpImg" + getId());
so.setContentType("image/png");
try {
so.setContentStream(new FileInputStream(tempFilePath));
sos.saveStorageObject(so);
setPicture(so);
// remove picture from temporary camera directory
new File(tempFilePath).delete();
}
catch (FileNotFoundException e) {
sLog.severe("Employee picture file not found");
}
}
getPicture
メソッドと同様に、addPicture
では、まずfindOrCreateStorageObject
メソッドを呼び出すことでStorageObject
インスタンスを取得します。次に、contentType
およびcontentStream
を設定し、StorageObjectService
上でsaveStorageObject
メソッドを呼び出します。このメソッドでは、SQLiteデータベース内に記憶域オブジェクト・メタデータを保存し、写真をファイル・システムにストリームし、MCSを呼び出してファイルをHR MCS記憶域コレクションに追加します。ファイルを保存した後、ディスク領域を解放するために、デバイス・カメラによって作成された一時ファイルを削除できます。
注意:
カメラでファイルURIを返すかわりに、DeviceManager.CAMERA_DESTINATIONTYPE_DATA_URL
をdestinationType
の値として使用することで、Base64でエンコードされた文字列として画像を取得することもできます。この場合は、高品質な写真を撮ると、写真全体がメモリーに読み込まれ、OutOfMemory
エラーでモバイル・アプリケーションがクラッシュする可能性か高いため、これはお薦めできません。
従業員の写真を削除するには、removePicture
メソッドをEmployeeクラスに追加し、このメソッドをEmployeeフォーム・ページにボタンまたはリンクとしてドラッグ・アンド・ドロップします。
public void removePicture() {
StorageObjectService sos = new StorageObjectService();
StorageObject so = sos.findOrCreateStorageObject("HR", "EmpImg" + getId());
sos.removeStorageObject(so);
// get new "empty" storageObject and refresh UI
so = sos.findOrCreateStorageObject("HR", "EmpImg" + getId());
setPicture(so);
refreshUI(Arrays.asList(new String[]{"picture"}));
}
removeStorageObject
メソッドで、SQLiteデータベース内の記憶域オブジェクト行が削除され、ファイル・システムからファイルが削除され、MCSを呼び出してMCSコレクションからファイルが削除されます。
StorageObject
およびStorageObjectService
の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
Oracle Mobile Cloud Serviceへの分析情報の送信
MCSでホストされる1つ以上のモバイル・バックエンド(MBE)を持つMAFアプリケーションは、アプリケーションの使用状況に関する分析情報をMCS Analyticsに送信できます。
MAFがMCSに送信するために生成する分析情報は、アプリケーションのライフサイクルとエンド・ユーザーのMAFアプリケーションとの相互作用に関する情報を提供します。MAFでは、分析イベントをMAFフレームワーク・イベントとビジネス・イベントに分類します。MAFフレームワーク・イベントのレスポンスとして取得された情報をMCSに送信するには、アプリケーションのlogging.properties
ファイルでプロパティを構成します。MAFフレームワーク・イベントの例には、アプリケーションの起動、アクティブ化や機能ナビゲーションなどの機能イベント、ユーザー認証イベントなどがあります。分析情報をMCSに送信するようにアプリケーションを構成している場合、MAFではこれらのイベントをデフォルトで記録します。
次の例は、エンド・ユーザーが保護されたアプリケーション機能(secure-feature-1
およびsecure-feature-2
)に移動する前に、ログイン・アプリケーション機能(LF1
)にリダイレクトされたときに発生するFeatureNavigation
MAFフレームワーク・イベントについて、MAFが生成し、MCSに転送するペイロードを示しています。MAFでは、分析情報を送信するように構成されているMAFアプリケーションがアクティブ化されたときに開始するセッション内のすべてのMAFフレームワーク・イベントを記録します。MAFアプリケーションが非アクティブ化されるとセッションが終了します。次の例では、sessionID
プロパティによってセッションが示されています。
MAFアプリケーションをデバッグ・モードでデバイスにデプロイしている場合、JDeveloperの「ログ」ウィンドウにこのペイロードが表示されます。
"name":"FeatureNavigation", "properties":{"SourceId":"null","DestinationId":"LF1"}, "type":"custom", "timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922" "name":"FeatureNavigation", "properties":{"SourceId":"LF1","DestinationId":"secure-feature-1"}, "type":"custom", "timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922" "name":"FeatureNavigation", "properties":{"SourceId":"secure-feature-1","DestinationId":"secure-feature-2"}, "type":"custom", "timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"
ビジネス・イベントは、ユーザー(アプリケーション開発者)がアプリケーションで定義するイベントです。ユーザーは、MAFのoracle.maf.api.analytics.AnalyticsUtilities
で提供されているAPIを使用して、イベントの分析情報を取得します。MAFでは、ApplicationFeaturesデータ・コントロールでデータ・コントロール・メソッド(fireEventListener
)も公開しています。このデータ・コントロール・メソッドをAMXページにドラッグ・アンド・ドロップして、定義したイベントをリスニングするようにメソッドを構成できます。これらのAPIを使用して、MAFフレームワーク・イベントからMCSに分析を送信することもできます。
MAFでは、コンテキスト・イベント情報(デバイス・モデル、国、タイムゾーンなど)をMCSまたはその他の希望するリポジトリに送信することもできます。
MCS以外のリポジトリに分析を送信することもできます。
詳細は、次を参照してください。
-
分析情報を取得するMAFフレームワーク・イベント(MAFで提供されるMAFフレームワーク・イベントについて説明します。)
-
拡張およびカスタマイズできる
oracle.maf.api.analytics
パッケージのクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
Oracle Mobile Cloud Serviceへの分析の転送を構成する方法
MAFでは、新しいMAFアプリケーションのlogging.properties
ファイルに、MAFアプリケーションからMCS Analyticsに分析情報を送信するように構成する必要があるプロパティを移入します。
次の例は、新しいMAFアプリケーションの作成時にlogging.properties
ファイルに含まれている、すぐに使用できるエントリを示しています。
# Configure the analytics logger # Analytics events are logged only if oracle.maf.api.analytics.level=ALL # Set to OFF or any level other than ALL to disable analytics oracle.maf.api.analytics.level=ALL oracle.maf.api.analytics.handlers=oracle.maf.api.analytics.LoggerAnalyticsHandler, oracle.maf.api.analytics.McsAnalyticsHandler oracle.maf.api.analytics.custom.level=INFO oracle.maf.api.analytics.LoggerAnalyticsHandler.level=INFO # Configure MCSHandler oracle.maf.api.analytics.McsAnalyticsHandler.level=INFO oracle.maf.api.analytics.McsAnalyticsHandler.connectionId=Mcs_Connection_Id oracle.maf.api.analytics.McsAnalyticsHandler.batchSize=25 oracle.maf.api.analytics.McsAnalyticsHandler.offlineWrite=false oracle.maf.api.analytics.McsAnalyticsHandler.recordUsername=false oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider
前述の例に示したプロパティの中で、connectionId
のみが必須です。表7-1では、オプション・プロパティについて説明しています。connectionId
プロパティでは、MCS MBEへの有効な接続を定義します。アプリケーションのconnection.xml
で定義したconnectionId
を、このプロパティの値として使用してください。有効なconnectionId
を指定しない場合、MAFからMCSにイベントが送信されません。かわりに、MAFでは、デバイスで許可されるイベントの最大数に達するまで、これらのイベントをディスクに追加します。
アプリケーションのconnection.xml
ファイルの有効なconnectionId
では、MAFアプリケーションのMBEへの登録時に生成されるMBEのID (oracle-mobile-backend-id
)とアプリケーション・キー(oracle-mobile-application-key
)が使用されます。MAFは、MCSへの接続を作成するHTTPヘッダーにこれら2つの値を追加します。これらの値は、MAFアプリケーションが分析イベントを送信するMBEと、分析イベントの発生元のアプリケーションを識別します。
注意:
3つすべてのプラットフォーム(Android、iOSおよびユニバーサルWindowsプラットフォーム)について、MCSでMAFアプリケーションをクライアントとして登録する必要はありません。1つのプラットフォームについてMAFアプリケーションを登録し、生成されたアプリケーション・キーをoracle-mobile-application-key
の値として使用します。
MCS MBEへの接続でHTTP基本認証タイプを使用している場合は、oracle/wss_http_token_client_policy
を接続に関連付けます。Oauthを使用する接続の場合は、oracle/http_oauth2_token_mobile_client_policy
を接続に関連付けます。正しいポリシーを接続に関連付けないと、MAFでMCSに分析イベントがフラッシュされません。セキュリティ・ポリシーの接続との関連付けの詳細は、「セキュアなWebサービスへのアクセス」を参照してください。
次の例は、前述のプロパティの値が設定されたアプリケーションのconnections.xml
ファイルの抜粋を示しています。
<References xmlns="http://xmlns.oracle.com/adf/jndi"> <Reference name="Mcs_Connection_Id" className="oracle.adf.model.connection.url.HttpURLConnection" adfCredentialStoreKey="McsLoginConn" xmlns=""> ... <RefAddresses> <XmlRefAddr addrType="Mcs_Connection_Id"> <Contents> <urlconnection name="Mcs_Connection_Id" url="http://mcs_instance.oracle.com:7201"/> ... </Reference> <Reference name="McsLoginConn" className="oracle.adf.model.connection.adfmf.LoginConnection" adfCredentialStoreKey="McsLoginConn" partial="false" manageInOracleEnterpriseManager="true" deployable="true" xmlns=""> <Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/> <RefAddresses> <XmlRefAddr addrType="adfmfLogin"> <Contents> <login url="http://mcs_instance.oracle.com:7201/mobile/platform/users/login"/> <logout url="http://mcs_instance.oracle.com:7201/mobile/platform/users/logout"/> <customAuthHeaders> <header name="oracle-mobile-backend-id" value="0e4a9dfa-046a-4aaa-b8dd-331044ad81f4"/> <header name="oracle-mobile-application-key" value="be53201a-8674-48d7-96d0-bb02f4cd06c5"/> </customAuthHeaders> ... </References>
logging.properties
ファイルで次のオプション・エントリを構成して、説明されている機能を実装します。
表7-1 MAFアプリケーションからの分析の転送を管理するためのオプション・プロパティ
プロパティ | 説明 |
---|---|
batchSize | MAFアプリケーションが関連付けられているMCSインスタンスにイベントを送信する前に、ローカルに保存されるイベントの数を決定するオプションのプロパティ。イベントはバッチでMCSにアップロードされます。最大バッチ・サイズの制限(65)があります。batchSize が指定されないか、上限の65を超えている場合は、デフォルトのbatchSize の25が適用されます。
|
offlineWrite | イベントのオフライン・バッファリングを有効にするかどうかを決定するオプションのプロパティ。デバイスがオフラインであるか、クライアントがMCSとの接続を確立できないときに、イベントが生成される場合があります。そのようなイベントが失われないようにするには、offlineWrite プロパティを構成します。接続が再確立されると、保存されたこれらのイベントがMAFによってMCSにフラッシュされます。offlineWrite プロパティは、そのようなイベントをディスクにキャッシュして、オフラインの間バッファリングできるようにします。MAFでは、最大250個のイベントがサポートされます。イベントはローリング方式で保存されます。つまり、MAFには最後の250個のイベントが保存されます。このため、常に最新のイベントがオフラインでバッファリングされます。MAFでは、batchSize に達しているかどうかにかかわらず、アプリケーションが非アクティブ化された場合にもMCSにイベントをフラッシュします。デフォルトでは、offlineWrite は無効になっています。有効にするには、True に設定してください。
|
recordUsername | ユーザー名を取得するかどうかを決定するオプションのプロパティ。True に設定すると、ユーザーが保護された機能にログインしたときに、MAFによってユーザー名が取得されます。アプリケーションに保護された機能が含まれていない場合、またはユーザーが保護された機能にログインしていない場合は、ユーザー名はnullのままになります。アプリケーションに保護された機能が複数含まれている場合は、その機能にログインするために使用された資格証明(ユーザー名)に基づいてユーザー名が更新されます。取得されたユーザー名は、コンテキスト・イベントのフィールドの1つとして送信されます。したがって、ユーザー名を取得する予定の場合は、recordUsername プロパティがTrue で、contextProviderClassName にコンテキスト・イベントを生成するための有効なクラス名が指定されるようにlogging.properties を構成してください。たとえば、oracle.maf.api.analytics.McsAnalyticsHandler.recordUsername=true です。
|
contextProviderClassName | オプション設定です。コンテキスト・イベントが生成されたときに、このプロパティの値を指定します。指定する値によって、MCSのコンテキスト・イベントを生成するクラスが決定されます。コンテキスト・イベントには、タイムゾーン・オフセット、地理的位置、デバイス情報などの情報が含まれます。recordUsername がTrue に設定されている場合は、ユーザー名が含まれることもあります。contextProviderClassName プロパティは、デフォルトでは無効になっています。次の例は、このプロパティを有効にする方法を示しています。oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider
|
Oracle Mobile Cloud Serviceにプログラムで分析を送信する方法
MAFでは、MCSにイベントを送信するために使用できるAPIをoracle.maf.api.analytics.AnalyticsUtilities
で提供しています。
AnalyticsUtilities
クラスは、次のAPIを提供します。
public static void fireEvent(Level level, String category, String eventName) // Send an event without a payload public static void fireEvent(Level level, String category, String eventName, JSONObject payload) // Send an event with a JSON payload level: The logging level of the event. Set to any standard level supported by Java logging. category: The category of the event. Set to 'custom' for all events except context, sessionStart(MAF Framework event) and sessionEnd(MAF Framework event). Set the latter events to 'system'. eventName: Provide your own event name if you do not use an event provided in the AnalyticsUtilities class. Throws an exception if null. payload: A JSONObject that contains key-value pairs for custom events. The JSONObject must be of type String. No other data type is supported.
このAPIを使用する前に、MCSに分析を転送するために必要な値をアプリケーションのlogging.properties
ファイルに構成します。たとえば、MCSのconnectionID
を指定します。
次の例は、このAPIを使用して、MAFアプリケーションからMCSに分析を送信する方法を示しています。
// Sending events from your application. // The following logs event when there is no payload to register for an event. AnalyticsUtilities.fireEvent(Level.WARNING, AnalyticsUtilities.CATEGORY_CUSTOM, "EVENT_VIDEO_ACTIONS"); // The following logs event when there is a JSON payload to send for a custom event. try { JSONObject payload = new JSONObject(); payload.put("PAYLOAD_VIDEONAME", getFileName()); payload.put("PAYLOAD_ACTION", getAction()); // Creating a custom event 'EVENT_VIDEO_ACTIONS' of level INFO AnalyticsUtilities.fireEvent(Level.INFO, AnalyticsUtilities.CATEGORY_CUSTOM, "EVENT_VIDEO_ACTIONS" , payload); } catch(Throwable t) { // log the error }
ユーザーとの相互作用に基づいて、イベントを取得する異なるログ・レベルを設定できます。たとえば、エンド・ユーザーが再生アクションを実行する場合、前述の例のEVENT_VIDEO_ACTIONS
イベントをINFO
レベルに設定できます。または、失敗した場合にイベントを取得するには、WARNING
レベルに設定できます。ロギング・レベルはlogging.properties
ファイルで管理します。たとえば、EVENT_VIDEO_ACTIONS
イベントのロギングを管理するには、logging.properties
ファイルを次のように構成します。
// Set to WARNING to log events for the play action. Set to INFO (or a lower level) // to log events for the play action plus failure events oracle.maf.api.analytics.custom.EVENT_VIDEO_ACTIONS.level=WARNING // Disable logging of EVENT_VIDEO_ACTIONS oracle.maf.api.analytics.custom.EVENT_VIDEO_ACTIONS.level=OFF
Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法
MAFアプリケーションでは、コンテキスト・イベントを取得して、収集された情報をMCSまたはMCS以外のリポジトリに送信できます。
コンテキスト・イベントは、別のコンテキスト・イベントが記録されるまでの、後続のイベントのコンテキストを定義します。イベントは、MAFフレームワーク・イベントから、またはアプリケーションで定義するイベントから記録できます。
表7-2に、MAFアプリケーションからコンテキスト・イベントを送信するJSONオブジェクトのキーと値のペアで、MCSが受け入れるキー名を示します。MCSでは、すべてのプロパティが文字列型である必要があります。次の表に示すすべてのプロパティはオプションです。
注意:
MCSでは、緯度および経度の情報が、市区町村、都道府県、国および郵便番号に変換されます。緯度および経度(latitudeおよびlongitude)の情報を指定するか、またはlocality、region、postalCodeおよびcountryを指定し、両方は指定しないでください。
表7-2 コンテキスト・イベント情報をMCSに送信するための有効なキー名
キー名 | 説明 |
---|---|
userName | コンテキスト・イベントが記録されたときに、保護された機能にログインしていたデバイスのユーザー。 |
timezone | UTCからのデバイスのオフセット(秒) |
model | デバイスのモデル名 |
osName | デバイスのオペレーティング・システム名 |
osVersion | デバイスのオペレーティング・システムのバージョン |
latitude | デバイスのGPS緯度 |
longitude | デバイスのGPS経度 |
locality | デバイスの地域 |
region | デバイスのリージョン |
postalCode | デバイスの郵便番号 |
country | デバイスの国 |
MAFアプリケーションからMCSにコンテキスト・イベント情報を送信するには、logging.properties
ファイルで次のエントリを構成します。
oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName= oracle.maf.api.analytics.McsContextProvider
このエントリがlogging.properties
ファイルに構成されている場合、表7-2に示されているコンテキスト・イベント情報がMAFからMCSに送信されます。MAFアプリケーションからMCSにユーザー名を送信する場合は、logging.properties
ファイルでrecordUsername
をTrue
に設定する必要もあります。
定義したフィールドを含むコンテキスト・イベントを生成するには、logging.properties
ファイルで次のエントリを構成します。
oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.demo.CustomContextProvider
ここで、oracle.maf.demo.CustomContextProvider
はoracle.maf.api.analytics.ContextProvider
を実装するクラスです(例7-1を参照)。生成されるコンテキスト・イベントには、タイムゾーン、キャリアおよびメーカーの情報が含まれます。
例7-1 コンテキスト情報を送信するカスタム・コンテキスト・プロバイダ
package oracle.maf.demo;
import java.util.Date;
import java.util.TimeZone;
import oracle.maf.api.analytics.ContextProvider;
import oracle.adfmf.json.JSONObject;
public class CustomContextProvider
implements ContextProvider
{
public CustomContextProvider()
{
super();
}
public JSONObject generateContext()
{
JSONObject myCustomCtx = new JSONObject();
//
// TimeZone - Mobile device's offset from UTC in seconds
//
Date date = new Date();
int offset = TimeZone.getDefault().getOffset(date.getTime()) / 1000;
try
{
myCustomCtx.put("timezone", new Integer(offset).toString());
myCustomCtx.put("carrier", "AT&T");
myCustomCtx.put("manufacturer", "Apple");
}
catch(Exception ex)
{
ex.printStackTrace();
}
return myCustomCtx;
}
}
他のリポジトリに分析を送信する方法
MAFアプリケーションでは、MCS以外のリポジトリに分析を送信できます。
これを行うには、次の例に示すように、oracle.maf.api.analytics.McsAnalyticsHandler
を拡張するカスタム・クラスを作成して、processEvent()
メソッドをオーバーライドします。
package oracle.maf.demo; import java.io.IOException; import oracle.adfmf.framework.exception.AdfException; import oracle.adfmf.json.JSONArray; import oracle.adfmf.resource.CDCErrorBundle; import oracle.adfmf.util.ResourceBundleHelper; import oracle.maf.api.analytics.McsAnalyticsHandler; import oracle.maf.api.dc.ws.rest.RestServiceAdapter; import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory; public class CustomHandler extends McsAnalyticsHandler { public CustomHandler() { super(); } // // Establish the connection to a different repository and flush the events. // protected void processEvents() throws AdfException { // Extract the events to be flushed _events = super.getEvents(); RestServiceAdapter restAdapter = RestServiceAdapterFactory.newFactory().createRestServiceAdapter(); restAdapter.clearRequestProperties(); // Get valid connectionId of the repository. restAdapter.setConnectionName(getConnectionId()); restAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_POST); restAdapter.addRequestProperty("Content-Type", "application/json"); restAdapter.setRequestURI(_ANOTHER_REPOSITORY_URI); restAdapter.setGenerateAnalyticsEvents(false); // make REST call to send events try { String responseMessage = restAdapter.send(_events.toString()); } catch (IOException ex) { throw new AdfException(AdfException.ERROR, ResourceBundleHelper.CDC_ERROR_BUNDLE, CDCErrorBundle.ERR_ANALYTICS_FLUSH_EVENTS, new Object[] { ex }); } } private JSONArray _events = new JSONArray(); private static final String _ANOTHER_REPOSITORY_URI = "_repository_uri"; }
logging.properties
ファイルでカスタム・クラスを登録する必要もあります。たとえば、CustomHandler
を登録するには、次の例に示すようにlogging.properties
を構成します。
# Configure the analytics logger oracle.maf.api.analytics.level=ALL oracle.maf.api.analytics.handlers=oracle.maf.demo.CustomHandler oracle.maf.api.analytics.custom.level=INFO # Configure CustomHandler oracle.maf.demo.CustomHandler.level=INFO oracle.maf.demo.CustomHandler.connectionId=RepositoryConn oracle.maf.demo.CustomHandler.batchSize=7 oracle.maf.demo.CustomHandler.offlineWrite=true oracle.maf.demo.CustomHandler.recordUsername=false oracle.maf.demo.CustomHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider
分析情報を取得するMAFフレームワーク・イベント
MAFでは、分析情報を取得する様々なMAFフレームワーク・イベントを提供しています。
これらのイベントは2つのカテゴリ(カスタムおよびシステム)にグループ化されます。アプリケーションのlogging.properties
ファイルを構成して、アプリケーションからMCSにこれらのイベントが送信されるようにします。まず、MCSのconnectionID
を指定して、分析情報の送信を有効にするようにアプリケーションのlogging.properties
ファイルを構成します。次に、送信するイベントを指定します。この後者のタスクには、次の表の情報を使用します。
表7-3に、分析情報をアプリケーションからMCSに送信するためにlogging.properties
ファイルで構成できるMAFフレームワーク・イベント(カスタム・カテゴリ)を示します。各イベントは、OFFに設定するか、そのイベントのロギングが有効になるレベルより高いロギング・レベルに設定することで無効にできます。
表7-3 MAFフレームワーク・イベント(カスタム・カテゴリ)
イベント名 | ロギング・レベル | ロギングの有効化または無効化 |
---|---|---|
UpdateAuthenticationStatus |
FINE |
|
FeatureNavigation |
INFO |
|
Login |
INFO |
|
LoginCallback |
FINER |
|
Timer |
警告および期限切れ操作の場合はINFO 調整操作の場合はFINE |
|
Logout |
INFO |
|
LogoutCallback |
FINER |
|
PageNavigation |
INFO |
|
FeatureTransition |
INFO |
|
ApplicationTransition |
INFO |
|
RESTWebService |
INFO |
|
表7-4に、アプリケーションからMCSに分析情報を送信するようにlogging.properties
ファイルで構成できる、MAFフレームワーク・イベント(システム・カテゴリ)を示します。
表7-4 MAFフレームワーク・イベント(システム・カテゴリ)
イベント名 | ロギング・レベル | 説明 |
---|---|---|
sessionStart |
INFO | このイベント名は、MAFアプリケーションがアクティブ化され、分析情報の記録を開始したときに開始されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。 |
sessionEnd |
INFO | このイベント名は、MAFアプリケーションが非アクティブ化され、分析情報の記録を停止したときに停止されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。
MAFでは、 |
context |
INFO | コンテキスト・イベント情報を送信します(たとえば、デバイスのタイムゾーン、キャリアおよびメーカー)。次のようにこのイベントを有効にします。
oracle.maf.api.analytics.McsAnalyticsHandler .contextProviderClassName=oracle.maf.api .analytics.McsContextProvider コンテキスト・イベント情報の詳細は、「Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法」を参照してください。 |
Oracle Mobile Cloud Serviceへの診断情報の送信
Oracle Mobile Cloud Service (MCS)によってホストされるREST WebサービスにアクセスするMAFアプリケーションからの診断情報を挿入する方法について説明します。
REST WebサービスにアクセスするMAFアプリケーションは、RestServiceAdapter
を使用してこれらのサービスにアクセスします。アプリケーションがMCSによってホストされるRESTサービスにアクセスする場合に、MCS Diagnosticsを使用してMCSによってホストされるRESTサービスへのアプリケーションのコールをモニターまたはデバッグ(あるいはその両方)するには、McsRestServiceAdapter
を作成して次の情報をMCSに送信します。
-
モバイル診断セッションID
この属性は、特定のデバイスにアプリケーション・セッションをマップします。アプリケーションではこの情報を、
Oracle-Mobile-DIAGNOSTIC-SESSION-ID
HTTPリクエスト・ヘッダーを介して送信します。 -
モバイル・デバイスID
MCSに送信されたREST APIリクエストを、リクエストを行った物理デバイスに関連付けます。モバイル・アプリケーションではこの情報を、
Oracle-Mobile-Device-ID
HTTPリクエスト・ヘッダーを介して提供します。 -
クライアント・リクエスト時間
アプリケーションがリクエストを送信する直前に、クライアント側で取得されたAPIコールのタイム・スタンプを示します。モバイル・アプリケーションではこの情報を、HTTPリクエスト・ヘッダーの
Oracle-Mobile-CLIENT-REQUEST-TIME
属性を使用して提供します。
Oracle-Mobile-Diagnostic-Session-ID: 19975
Oracle-Mobile-Device-ID: d09379504b0a3247
Oracle-Mobile-Client-Request-Time: 2016-02-09T09:03:17.777Z
次の例は、McsRestServiceAdapter
の作成方法を示しています。
...
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;
...
RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter mcsRestServiceAdapter = factory.createMcsRestServiceAdapter();
アダプタの作成の詳細は、「WebサービスにアクセスするためのRESTサービス・アダプタの作成」を参照してください。