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データ・コントロールを作成するには、次の手順を実行します。
  1. 「アプリケーション」ウィンドウで既存のプロジェクトを選択し、メインメニューで「ファイル」、次に「新規」「ギャラリから」を選択します。
  2. 「新規ギャラリ」で、「ビジネス層」を展開し、「データ・コントロール」「Beanデータ・コントロール」の順に選択し、「OK」をクリックします。
  3. 「Beanクラスの選択」ダイアログで、検索アイコンをクリックして「クラス・ブラウザ」ダイアログを表示し、「クラス名を一致」入力フィールドにStorageObjectServiceと入力します。
    図7-1で示すように、JDeveloperにより、oracle.maf.api.cdm.mcs.storage.StorageObjectServiceクラスが取得されます。

    Figure 7-1 クラス・ブラウザでのStorageObjectService

    「Beanデータ・コントロールの作成」ダイアログから起動され、「クラス名を一致」入力フィールドにStorageObjectServiceが入力された「クラス・ブラウザ」ダイアログのビュー。
  4. 「OK」をクリックします。
    JDeveloperで、「Beanクラスの選択」ダイアログにデータ・コントロールの名前としてStorageObjectServiceが指定されます。
  5. 「次へ」および「終了」をクリックします。

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

JDeveloperでは、「データ・コントロール」パネルでStorageObjectServiceデータ・コントロールが生成されます。

図7-2 生成されたStorageObjectServiceデータ・コントロール

生成された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アプリケーションからのリスト・ビュー・ページを示します。写真の左側は、記憶域オブジェクトにアクセスするデータ・コントロールのビューです。右側に、画像をレンダリングするイメージ・ファイルを取得するfilePathメソッド属性を示します。

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への画像の追加

AMXページにドラッグ・アンド・ドロップされると、AMXページにイメージ・ファイルをレンダリングするfilePathプロパティを含む「データ・コントロール」パネルのビューを示します。

始めてDepartmentページに移動したときには、従業員の写真が表示されるまでに少し時間がかかります。部門内の従業員ごとに、MCSから写真をフェッチするためにバックグラウンドで並列RESTコールが行われます。次回のアプリケーション実行時には、画像はすぐに表示されます。

図7-6で示すようにRESTコールの結果が404 Not Foundレスポンスとなったために、従業員の写真がまだMCS内にない場合は、デフォルトではエラー・メッセージが表示されます。

図7-6 Webサービス・エラー・メッセージ

アプリケーションが接続しようとする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_URLdestinationTypeの値として使用することで、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以外のリポジトリに分析を送信することもできます。

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

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のコンテキスト・イベントを生成するクラスが決定されます。コンテキスト・イベントには、タイムゾーン・オフセット、地理的位置、デバイス情報などの情報が含まれます。recordUsernameTrueに設定されている場合は、ユーザー名が含まれることもあります。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ファイルでrecordUsernameTrueに設定する必要もあります。

定義したフィールドを含むコンテキスト・イベントを生成するには、logging.propertiesファイルで次のエントリを構成します。

oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.demo.CustomContextProvider

ここで、oracle.maf.demo.CustomContextProvideroracle.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

oracle.maf.api.analytics.custom.UpdateAuthenticationStatus.level= FINE

oracle.maf.api.analytics.custom.UpdateAuthenticationStatus.level= OFF

FeatureNavigation INFO

oracle.maf.api.analytics.custom.FeatureNavigation.level=INFO

oracle.maf.api.analytics.custom.FeatureNavigation.level=OFF

Login INFO

oracle.maf.api.analytics.custom.Login.level=INFO

oracle.maf.api.analytics.custom.Login.level=OFF

LoginCallback FINER

oracle.maf.api.analytics.custom.LoginCallback.level=FINER

oracle.maf.api.analytics.custom.LoginCallback.level=OFF

Timer

警告および期限切れ操作の場合はINFO

調整操作の場合はFINE

oracle.maf.api.analytics.custom.Timer.level=INFO

oracle.maf.api.analytics.custom.Timer.level=FINE

oracle.maf.api.analytics.custom.Timer.level=OFF

Logout INFO

oracle.maf.api.analytics.custom.Logout.level=INFO

oracle.maf.api.analytics.custom.Logout.level=OFF

LogoutCallback FINER

oracle.maf.api.analytics.custom.LogoutCallback.level=FINER

oracle.maf.api.analytics.custom.LogoutCallback.level=OFF

PageNavigation INFO

oracle.maf.api.analytics.custom.PageNavigation.level=INFO

oracle.maf.api.analytics.custom.PageNavigation.level=OFF

FeatureTransition INFO

oracle.maf.api.analytics.custom.FeatureTransition.level=INFO

oracle.maf.api.analytics.custom.FeatureTransition.level=OFF

ApplicationTransition INFO

oracle.maf.api.analytics.custom.ApplicationTransition.level=INFO

oracle.maf.api.analytics.custom.ApplicationTransition.level=OFF

RESTWebService INFO

oracle.maf.api.analytics.custom.RESTWebService.level=INFO

oracle.maf.api.analytics.custom.RESTWebService.level=OFF

表7-4に、アプリケーションからMCSに分析情報を送信するようにlogging.propertiesファイルで構成できる、MAFフレームワーク・イベント(システム・カテゴリ)を示します。

表7-4 MAFフレームワーク・イベント(システム・カテゴリ)

イベント名 ロギング・レベル 説明
sessionStart INFO このイベント名は、MAFアプリケーションがアクティブ化され、分析情報の記録を開始したときに開始されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。
sessionEnd INFO このイベント名は、MAFアプリケーションが非アクティブ化され、分析情報の記録を停止したときに停止されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。

MAFでは、batchSizeに達しているかどうかにかかわらず、sessionEndが発生したときにMCSにイベントをフラッシュします。

context INFO コンテキスト・イベント情報を送信します(たとえば、デバイスのタイムゾーン、キャリアおよびメーカー)。次のようにこのイベントを有効にします。
oracle.maf.api.analytics.McsAnalyticsHandler
    .contextProviderClassName=oracle.maf.api 
    .analytics.McsContextProvider

コンテキスト・イベント情報の詳細は、「Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法」を参照してください。

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

Oracle Mobile Cloud Service (MCS)によってホストされるREST WebサービスにアクセスするMAFアプリケーションからの診断情報を挿入する方法について説明します。

REST WebサービスにアクセスするMAFアプリケーションは、RestServiceAdapterを使用してこれらのサービスにアクセスします。アプリケーションがMCSによってホストされるRESTサービスにアクセスする場合に、MCS Diagnosticsを使用してMCSによってホストされるRESTサービスへのアプリケーションのコールをモニターまたはデバッグ(あるいはその両方)するには、McsRestServiceAdapterを作成して次の情報をMCSに送信します。

  • モバイル診断セッションID

    この属性は、特定のデバイスにアプリケーション・セッションをマップします。アプリケーションではこの情報を、Oracle-Mobile-DIAGNOSTIC-SESSION-ID HTTPリクエスト・ヘッダーを介して送信します。

  • モバイル・デバイスID

    MCSに送信されたREST APIリクエストを、リクエストを行った物理デバイスに関連付けます。モバイル・アプリケーションではこの情報を、Oracle-Mobile-Device-ID HTTPリクエスト・ヘッダーを介して提供します。

  • クライアント・リクエスト時間

    アプリケーションがリクエストを送信する直前に、クライアント側で取得されたAPIコールのタイム・スタンプを示します。モバイル・アプリケーションではこの情報を、HTTPリクエスト・ヘッダーのOracle-Mobile-CLIENT-REQUEST-TIME属性を使用して提供します。

次の例は、このタイプのアダプタを使用するMAFアプリケーションがHTTPリクエスト・ヘッダーに挿入する情報のタイプを示しています。
Oracle-Mobile-Diagnostic-Session-ID: 19975
Oracle-Mobile-Device-ID: d09379504b0a3247
Oracle-Mobile-Client-Request-Time: 2016-02-09T09:03:17.777Z

次の例は、McsRestServiceAdapterの作成方法を示しています。

...
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;

...
RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory();
RestServiceAdapter mcsRestServiceAdapter = factory.createMcsRestServiceAdapter();

アダプタの作成の詳細は、「WebサービスにアクセスするためのRESTサービス・アダプタの作成」を参照してください。