パート2:MAF RESTインフラストラクチャの構築

優れたインフラストラクチャを利用することが重要です。MAFアプリケーション構築への適切な第一歩は、リモート・サービスにアクセスするクライアント・インフラストラクチャを開発することです。

このチュートリアルで使用するRESTサービスに関して考慮する必要があるのは、サービスに問い合わせたデータ情報の格納に必要なデータ・オブジェクト(エンティティ)と、開発を容易にするヘルパー・クラスです。これらのクラスを作成するには、MAFの仕組みとREST/JSONサービスの統合方法についての知識が少し必要です。Javaヘルパー・クラスを作成する前に、Javaヘルパー・クラスがどのようなもので、何をするのかについて確認しましょう。

次の項では、HR RESTサービスとやり取りするための使いやすいインフラストラクチャの構築方法を通じてこれらについて説明します。

    Javaヘルパー・クラス
    はじめに、以下の5つのカテゴリのJavaクラスを作成します。

    ヘルパー・クラス 目的
    データ・コントロール・クラス リモートRESTサービスに対する問合せメソッドと更新メソッドを提供するJava Bean。
    データ・オブジェクト Departments表とEmployees表のリソースを表すJavaオブジェクト。
    JSONヘルパー・クラス JSON構造(単一プロパティ名を持つ部門または従業員のコレクション)を表すJavaクラスと、更新および作成操作用のJSONオブジェクトを表すクラス。
    また、JavaからJSONへと、JSONからJavaへのペイロードおよびレスポンスの解析に役立つクラスも必要です。
    URIヘルパー RESTはUniform Resource Identifier(URI)を使用してリソースにアクセスします。保守しやすくするため、これらのURIを意味のある名前を付けて1箇所に保存して参照することを推奨します。たとえば、このサンプルですべての部門を要求するURIの名前は、<host>:port/jee_path/resources/hrappsrvc/departmentsです。覚えるのは簡単ですが、パラメータ化されたURIは構造が複雑になる場合があるため、RESTサービスの知識が必要になります。このため、このチュートリアルでは、簡単なシノニムを介してURIを返す次のメソッドを作成します。

    public static String getAllDepartmentsURI( ){};
    ユーティリティ・クラス MAF RESTアダプタのコールを簡素化するため、いわゆる"定型コード"をラップするユーティリティ・クラスを作成します。このクラスには、すべてのコールをREST/JSONサービスに組み込むために繰り返し必要になるセットアップ・コードが含まれます。
ステップ1:Javaヘルパー・クラスの作成

このステップでは、5つのカテゴリすべてのJavaヘルパー・クラスを作成します。このステップではおもにクラスを作成し、ステップ2でコードを追加してクラスを実装します。

  1. Departments表とEmployees表のデータ・オブジェクト(エンティティ)を作成するには、以下の手順に従います。
    ViewController」プロジェクトを右クリックして、メニューから「New」→「Java Class」を選択します。

  2. Departmentsのエンティティを作成し、ダイアログのフィールドに次の情報を入力します。
    他の値はデフォルト値のままにして、「OK」をクリックします。

    Name DepartmentsEntity
    Package maf.code.corner.hr.mobile.entities
    Extends java.lang.Object
    alt text

  3. Employeesのエンティティを作成し、ダイアログのフィールドに次の情報を入力します。
    他の値はデフォルト値のままにして、「OK」をクリックします。

    Name EmployeesEntity
    Package maf.code.corner.hr.mobile.entities
    Extends java.lang.Object
    alt text

  4. Javaファイルをダブルクリックして、DepartmentsEntityクラスを開きます。
    Javaクラス宣言の直後に、Javaクラスに次のプロパティを追加します。

    private Integer departmentId = null;
    private String departmentName = null;
    private Integer locationId = null;
    private Integer managerId = null;

    注:入力の手間を省くため、チュートリアルのDOC/CODE_TXTディレクトリには各種コード・スニペットが含まれており、コピー/貼付けに使用できます。
    ここでは、DepartmentsEntity.txtから上記プロパティをコピーできます。

  5. Javaクラス内のクラス・コストラクタの下を右クリックして、「Generate Accessors」を選択します。

    alt text
  6. 表示されたダイアログで、このクラスに含まれるすべてのプロパティに対してアクセッサを生成するように指定します。また、Scopeプロパティにpublicが指定されており、Notify listeners when property changesチェック・ボックスが選択されていることを確認します。このチェック・ボックスの設定により、エンティティの値が変更されるたびにMAFへの通知が行われるため、UIをリフレッシュして変更済みの値を表示できます。

    alt text
  7. ファイルの末尾にcloneメソッドを追加して、オブジェクトの物理コピーを簡単に作成できるようにします。データ・コントロール・クラスにcloneメソッドを追加することもできますが、ベスト・プラクティスとしてここに追加することを推奨します。
    cloneDepartment.txtからコードをコピーして、DepartmentEntity.javaクラスの末尾に貼り付けます。

    alt text
  8. 前述の3つのステップ(クラスの作成、プロパティの追加、アクセッサ通知リスナーの生成)を、今回はEmployeesEntityクラスに対して次のプロパティ(チュートリアルのDOC/CODE_TXTフォルダにあるEmployeesEntity.txtのプロパティ)を使用して繰り返します。
    重要なjava.util.Dateクラスの文が自動的に追加されます。追加されない場合は、Date型を選択して[Alt]キーを押しながら[Enter]キーを押します(Windowsの場合)。

    private Double commissionPct = null;
    private String email = null;
    private Integer employeeId = null;
    private String firstName = null;
    private Date hireDate = null;
    private String jobId = null;
    private String lastName = null;
    private Integer managerId = null;
    private String phoneNumber = null;
    private Integer salary = null;

    次に、アクセッサを生成してからすべての変更を保存します。

    alt text

    Departmentsと同様に、ファイルの末尾にcloneメソッドを追加して、Employeesオブジェクトの物理コピーを簡単に作成できるようにします。cloneEmployee.txtからコードをコピーして、EmployeeEntity.javaクラスの末尾に貼り付けます。

    alt text

  9. このチュートリアルでは、URIヘルパー・クラスは、使用するRESTサービスの形式に専用のクラスになります。以下のステップではクラスを作成し、チュートリアルのDOC/CODE_TXTフォルダにあるDeptEmpURIs.txtファイルの中身をコピーして貼り付けます。

    前述のステップと同様に、ViewControllerプロジェクトを右クリックして、メニューから「New」→「Java Class」を選択し、Java Classクラスを作成するダイアログに次の値を入力します。

    Name DeptEmpURIs
    Package maf.code.corner.hr.mobile.uri
    Extends java.lang.Object
    alt text
  10. パッケージ宣言を使用して、チュートリアルのDOC/CODE_TXTフォルダにあるDeptEmpURIs.txtファイルの内容で、Javaクラスの内容を置き換えます。

    少し時間を割いて、クラス内に定義されたURIを確認します。すべてのメソッドに、使用するHTTP動詞が指定されている点に注目します。このヘルパー・クラスはチュートリアル用に提案されているものですが、テンプレートや開発者ガイドラインとして役立つ場合があります。

    alt text

  11. JSONヘルパー・カテゴリには多数のクラスが含まれています。このコードもチュートリアルのDOC/CODE_TXTフォルダに含まれていますが、単純にコピーするのではなく、提供されているソース・コードを読んで理解することを推奨します。こうすることで、各自のREST/JSONプロジェクトに同じ原則を適用する際も、何を実行すべきかが分かるようになります。

    前述の手順を使用して、ViewControllerプロジェクト内に次のJavaクラスを作成し、DOC/CODE_TXTフォルダ内の該当ファイルからコードを追加します。

    DepartmentsエンティティをJSON文字列に変換するクラスを作成します。

    Name DepartmentEntityToJson
    Package maf.code.corner.hr.mobile.json.helper
    Extends java.lang.Object


    alt text
  12. EmployeesエンティティをJSON文字列に変換するクラスを作成します。

    Name EmployeesEntityToJson
    Package maf.code.corner.hr.mobile.json.helper
    Extends java.lang.Object

  13. JSON配列をDepartmentsArrayに変換するクラスを作成します。

    Name JsonArrayToDepartmentsArray
    Package maf.code.corner.hr.mobile.json.helper
    Extends java.lang.Object

  14. JSON配列をEmployeesArrayに変換するクラスを作成します。

    Name JsonArrayToEmployeesArray
    Package maf.code.corner.hr.mobile.json.helper
    Extends java.lang.Object

  15. JSONのDepartments配列構造を表すクラスを作成します。

    Name DepartmentsResultArray
    Package maf.code.corner.hr.mobile.json.dao
    Extends java.lang.Object

  16. JSONのEmployees配列構造を表すクラスを作成します。

    Name EmployeesResultArray
    Package maf.code.corner.hr.mobile.json.dao
    Extends java.lang.Object

  17. 変更を保存します。作成したクラスとパッケージの構成を次の図に示します。

    alt text
  18. XMLペイロードを持たないRESTサービスをコールするために、MAFのインフラストラクチャはRestServiceAdapterクラスを提供しています。

    RestServiceAdapterクラスは、RESTサービスに対するJavaコマンドライン・ブラウザと見なすことができ、パート1でRESTサービスのテストに使用したHTTP Analyzerと似ています。Javaでは、基本的に、RestServiceAdapterクラスに対して、コールするURIと、対応メディア・タイプ(ここではJSON)、httpメソッド(またはhttp動詞)、コンテンツ・タイプ(RESTリクエストに引数が含まれる場合のペイロード形式)を伝えます。

    次の値を使用してクラスを作成します。

    Name RestCallerUtil
    Package maf.code.corner.hr.mobile.util
    Extends java.lang.Object

  19. クライアント・インフラストラクチャの準備を完了するために、作成する必要のあるクラスがもう1つあります。このJavaクラスはデータ・コントロール・パネル上に表示されます。

    次の値を使用してクラスを作成します。

    クラス名の拡張子として"DC"を付けるだけで、このクラスが自動的にデータ・コントロールに変換される訳ではありません。後で追加の手順が必要です。"DC"という接尾辞は、Javaプロジェクト階層内でこのクラスがデータ・コントロールを表すことを分かりやすくするためのネーミング規則です。

    Name DeptEmpDC
    Package maf.code.corner.hr.mobile.datacontrol
    Extends java.lang.Object

    まとめ

    MAFになじみのない開発者は、ここまでのチュートリアル・ステップを進めてきた結果として、MAFアプリケーションには大量のJavaコードが必要になるという印象を抱いたかもしれません。

    MAFの立場から言えば、REST/JSONサービスは特別なケースであり、通常より多くのコードが必要になる点に注意する必要があります。REST/XMLやSOAPを使用する場合、ほとんどの開発は宣言的に実行できます。これは単純に、プロトコルとしてのJSONの特性が(相対的には)構造化されていないためです。

    ここまでに定義した内容はクリーンなクライアント・モデルであり、モバイル・アプリケーションの残りの部分を宣言的に構築するために後で使用します。このようにしっかりした基盤から始めることは、一体型の大きいJavaファイルを作成してREST/JSONサービスにアクセスするよりも、ずっと優れた方法です。ここまでに作成したJavaオブジェクト構造は、次の図に示すように適切に体系化されています。

    alt text

ステップ2:クライアント・インフラストラクチャの実装

この項では、作成したJavaヘルパー・クラスを実装します。

    RestCallerUtilクラスの作成

    RestCallerUtilクラスはMAFのRestServiceAdapterアダプタ・クラスをラップして、サービス・リクエストに簡素化されたURLを提供します。

  1. JDeveloperのアプリケーション・ナビゲータでファイル名をダブルクリックして、RestCallerUtilクラスを開きます。

  2. チュートリアルのDOC/CODE_TXTフォルダにあるRestCallerUtil.txtファイルからコードをコピーして、RestCallerUtilファイルに貼り付けます。パッケージ宣言はmaf.code.corner.hr.mobile.utilのままにして、それ以外の既存コードはすべて置き換えます。

    実装コードを調べて、どのように動作するかを確認してみましょう。

  3. RestCallerUtil

    alt text

    invokeRestRequestメソッドはMAFの RestServiceAdapterアダプタをラップして、リモートRESTサービスをコールするための簡素化されたAPIを提供します。メソッドに渡す引数は、
    httpMethod(GET、POST、PUT、DELETE)と、操作の対象となるRESTリソースを識別するrequestURI、さらに、PUTやPOST更新の際に必要になるペイロード(オプション)です。

    メソッドははじめに、MAFのRestServiceAdapterのインスタンスを取得して、RESTサービスの接続情報を読み取ろうとします。


    alt text

    接続が設定されたら、次のステップはリクエスト・パラメータの指定です。一部のパラメータは、サンプル・アプリケーション内で変更される予定がないため、ハードコードされています。たとえば、RESTのレスポンス形式はJSONであり、これは変更されません。

    値が変更される設定は、入力引数としてメソッドに渡されます。


    alt text

    以上でRESTサービスのコール準備がすべて整い、実行できる状態になりました。実行には次のコードを使用します。

    alt text

    JSONペイロードは文字列形式であるため、RESTコールから返されるレスポンスのタイプはjava.lang.Stringになります(レスポンスがある場合)。

    REST/JSONの組合せは非常に柔軟性が高く、多くの開発者がHTTPエラー・コードの代わりにこのレスポンスを使用してエラー・コードを送信しています。その場合は、レスポンス構造に反映されるため、レスポンスからデータ・オブジェクトへの解析時に留意する必要があります。

    次に、このチュートリアルで使用するRESTサービスのJSONペイロードを示します。


    alt text


    従業員に対しても同様のペイロードが返されます。

    alt text

    パブリック・メソッドの1つであるinvokeRead(…)はユーティリティ・クラス内に定義されており、MAFアプリケーションと連携するAPIでもあります。このメソッドは、リクエスト・タイプに応じた想定を立てることで、RESTアクセスをさらに簡素化します。たとえば、REST内のGETリクエストにはペイロードが含まれないため、invokeReadメソッドはこれをパブリック向けのAPIには公開しません。

    invokeReadメソッドはプライベートのinvokeRestRequestメソッドをコールする前に、内部的にすべての必須引数の値を設定します(getリクエストに対するGET、Payrollをnullにするなど)。

    このチュートリアルでは、このほかに3つのパブリックAPI(HTTPメソッドごとに1つ)があります。


    alt text

    注:カスタムRESTのコール元ユーティリティ・クラスは、複雑なRESTサービス・コールを単純なAPIでラップすることで、後続のアプリケーション開発を簡素化します。チームで作業する場合、このような抽象化による見返りは非常に素早く得られます。

    DeptEmpURIクラスの実装

    DeptEmpURIクラスは、このチュートリアルで使用するすべてのREST URIをラップして、記述的メソッドとして公開するヘルパー・クラスです。このようなクラスによるメリットは次のとおりです。
    • すべてのURIを1箇所に登録できます。
    • 開発チームは、実際のREST URI構成を把握することなく、RESTアクセスに基づいてMAFアプリケーションを構築できます。
    • RESTサービスAPIを文書化する場所が得られます。


  4. コードは、前述のステップでテキスト・ファイルからコピー済みです。ここでは実装コードを調べて、どのように動作するかを確認してみましょう。

  5. DeptEmpURI

    このチュートリアル内のREST/JSONサービスは、“hrappsrvc”という1つのルート・リソースを含んでおり、ここから、departmentsとemployeesという2つのサブリソースへと分かれます。これらの2つのURIは次のように登録されています。


    alt text

    このクラスのメソッドは上の情報を使用して、REST URIの各部分を構成します。完全なREST URLには、ホスト名、ポート、Java EEパス、ルート・リソース名が必要ですが、この情報はREST接続として登録されており、実際にRESTコール時を実行する際にアクセスできます。公開されるすべてのクラス内メソッドについて説明はしませんが、ここでは、このようなクラスが合理的である理由を示す例を紹介します。

    alt text

    RESTの処理対象は動的なURLであるため、サービスに対してクライアントが起動するアクションとリソースはURL内にエンコードされています。
    このチュートリアル内のサービスでは、すべての部門を問い合わせたとき、ドリルダウンして特定の部門に含まれる従業員を表示する必要があるかもしれません。このような場合のURIの形式は次のようになります。

    host:port(javaEE_path/htappsrvc/departments/<deptId>/employees

    このURLをパブリック・メソッドにラッピングすることで、部門IDをパラメータとして渡せる汎用関数を作成できます。



    JSONデータ・アクセス・オブジェクトの実装

    MAFアプリケーションがJSON文字列のレスポンスをJavaオブジェクトに解析できるようにするため、JSONレスポンス文字列の構造をBeanプロパティ内に"再現"するJava Beanクラスが必要になります。

  6. JDeveloperでDepartmentsResultArray.javaファイルを開き、クラス宣言の下(かつコンストラクタの上)の行にカーソルを置き、次を入力します。

  7. private DepartmentsEntity[] departments = null;

  8. [Alt]キーを押しながら]Enter]キーを押す(Windowsの場合)か、[Alt]キーを押しながら[alt text]キーと[i]キー(OS/Xの場合)を押して、DepartmentsEntityをインポートします。

  9. パブリック・コンストラクタの下の行にカーソルを置いて、右クリックします。メニューから「Generate Accessors」を選択します。

  10. 部門プロパティのチェック・ボックスを選択します(選択すると、set/getメソッドのチェック・ボックスが自動的に選択されます)。次の図に示すように、「Notify listeners when property changes」オプションの選択を解除します。

    alt text

    EmployeesResultArray.javaクラスも同じ機能を持ちますが、Employeesを使用する点のみが異なります。

  11. DepartmentsResultArrayを開き、実装コードの動作を確認します。

  12. DepartmentsResultArray

    MAFがJSON文字列をJavaオブジェクトに解析できるようにするには、JSONレスポンス構造と必要なsetter/getterメソッドをプロパティに組み込んだJavaクラスを使用できるようにする必要があります。このチュートリアルのdepartmentsコレクションに対するJSONレスポンスは次のようになります。

    alt text

    JSON形式で返された部門リストをJavaオブジェクトに解析するため、DepartmentsResultクラスには、DepartmentEntity[]型のプロパティであるdepartmentsが定義されています。DepartmentEntityオブジェクトは単一の部門オブジェクトを表し、各属性のgetterメソッドとsetterメソッドがペアで定義されています。

    注:JSONレスポンスに単純なデータ結果の構造だけでなく、エラー・コードや他のRESTリソースへのURL参照などの追加情報が含まれる場合、この情報をMAFで利用できるようにするには、DepartmentsResult構造内にこれをモデル化する必要もあります。

    alt text

    このチュートリアルでは、レスポンス文字列は"フラット"であり、データ・オブジェクトの単一コレクションのみが返されます。したがって、DepartmentEntity[]型の1つのプロパティのみで十分です。

    注:この時点で多少の不明な点があっても、心配ありません。これらのクラスを関連付けてまとめていくうちに、物事がより明確になっていきます。インフラストラクチャ・クラスの作成は、手織りのカーペットを作るようなものです。一つ一つの縫い目から美しい模様が現れるまでには、いくらか時間がかかります。

  13. EmployeesResultArray.javaクラスに対して、前述のステップを繰り返します。今回は、次のコードを入力します。

  14. private EmployeeEntity[] employees = null;


    従業員用のアクセッサを生成してからすべての作業を保存します。

    JSONヘルパー・クラスの実装

    必要なヘルパー・クラスは次の2種類です。
    1:POSTメソッドやPUTメソッドのコールに対して、データを作成または挿入するために、オブジェクトをJSON文字列に変換するクラス
    2:JSON配列レスポンスを、MAFが処理できるエンティティ配列に変換するクラス

    1:オブジェクトからJSON文字列への変換

    JSONは文字列を使用した表記法であるため、JSON内にエンコードするオブジェクトはすべて文字列表現に"変換"する必要があります。このチュートリアルでは、部門と従業員に加えて、これらのコレクションがJavaオブジェクトで表されています。

    サーバー側でのオブジェクトからJSONへの"変換"はJAX-Bによって処理されますが、これはMAFクライアントでは使用できません。そのために、カスタム・ソリューションが必要となりますが、このソリューションはチュートリアルの目的上、意図的に簡略化してあり、これから実装するヘルパー・クラスを使用します。

  15. JDeveloperで、DepartmentEntityToJson.javaファイルを開きます。

  16. ファイル・システムで、チュートリアルのDOC/CODE_TXTディレクトリからDepartmentEntityToJson.txtファイルを見つけて開きます。

  17. このテキスト・ファイルの中身をJavaクラスにコピーし、パッケージ宣言以外の既存の内容を置き換えます。

    DepartmentEntityToJson

    DepartmentEntityToJsonクラスは、部門オブジェクトをJSON文字列に変換します。部門を表すJSON文字列は、Oracle JDeveloperのHTTP Analyzerを使用して解析でき、次の形式を持ちます。


    alt text

    このクラスのgetJsonメソッドは部門オブジェクトを入力引数として受け取り、次に示すようにJSON文字列を生成します。

    alt text

    注:このコードは、必ずしも別個のヘルパー・クラスに保存する必要はありません。チュートリアル内で独立したヘルパー・クラスが使用されているのは、個々のステップをより明確にするためです。

  18. EmployeesEntityToJson.javaクラスに対して前述のステップを繰り返します。このクラスの実装コードは、チュートリアルのDOC/CODE_TXTフォルダ内のEmployeesEntityToJson.txtにあります。

    注:インポートを追加する必要のあるコード行には、JDeveloperによって赤い下線が付けられています。クラスをインポートするには、[Alt]キーを押しながら[Enter]キーを押します(またはこれに相当する処理を実行します)。クラス・リストに同じ名前を持つクラスが含まれており、どのクラスをインポートするか不明な場合は、“oracle.adfmf”パッケージに含まれるクラスを選択します。

    2:JSON文字列配列からエンティティ配列への変換
    ここまでに、REST問合せから返されたJSON結果オブジェクトを格納するために、DepartmentsResultArrayクラスとEmployeesResultArrayクラスを作成しました。ここでは、これらのクラスに実装コードを提供します。

  19. JDeveloperで、JsonArrayToDepartmentsArray.javaファイルを開きます。

  20. ファイル・システムで、チュートリアルのDOC/CODE_TXTディレクトリからJsonArrayToDepartmentsArray.txtファイルを見つけて開きます。

  21. このテキスト・ファイルの中身をJavaクラスにコピーし、パッケージ宣言以外の既存の内容を置き換えます。

  22. JsonArrayToEmployeesArray.javaファイルと該当するテキスト・ファイルを使用して、上記プロセスを繰り返します。

  23. JsonArrayファイルを確認します。

  24. コピー/貼付けする際は、再利用してきたコードを確認して、同様の処理をそれぞれのカスタム・プロジェクトで適用する方法について考えてみましょう。次に、JsonArrayToEmployeeArrayクラスのメソッドを1つ示します。このメソッドはJSON文字列を引数として受け取り、従業員の配列を返します。

    前述のステップで作成したEmployeesResultArrayクラスは、REST/JSONレスポンスをWebサービスから受け取ります。

    alt text

    JSONBeanSerializationHelperオブジェクトはMAFフレームワーク・クラスであり、Javaオブジェクト(ここではEmployeesResultArrayクラスとDepartmentsResultArrayクラス)に対してJSON構造をシリアライズします。繰り返しますが、これらの2つのクラスはJSONオブジェクトとRESTレスポンスのコレクション構造を"再現"したものです。

    alt text

    次の行は、JSON文字列をEmployeesResultArrayオブジェクトにシリアライズします。

    alt text

    残りのコード行は例外を捕捉してログ・ファイルに書き込みます。処理が正常に終了すると、コール元に従業員の配列が返されます。

    alt text

    まとめ

    ここまでに、クライアント・モデルの作成にかなりの時間をかけてきました。既述のとおり、モデルを正しく作成することが、のちの時間と労力の節約につながります。

    ここで中心となったのは、MAFからREST/JSON Webサービスを問い合わせるプロセスをラップするヘルパー・クラスの作成です。作成したクラスはチュートリアルで提供されたREST/JSONサービスに固有のものですが、概念はそれぞれのプロジェクトに適用可能です。

    多くのカスタム・モバイル・アプリケーション・プロジェクトでは、クライアント・モデルの作成者がモバイルUIを構築する開発者にもなります。ただし、コード編成の観点から見ると、MAFには興味深い代替案があります。MAFを使用すると、開発者はアプリケーション・アーカイブ・ファイルであるMobile Application Archive(MAA)ファイルをベースに、新しいモバイル・アプリケーションを構築できます。

    開発者はMAAファイルを使用して、アクセスに必要なサービスの共通モデルを作成し、MAAアーカイブ内にデプロイできます。その他の開発者はこれを拡張してモバイル・アプリケーションを構築できます。ここで注意すべき制限事項は、アプリケーションの拡張に使用できるのは1つのMAAファイルのみである点と、アーカイブ内のJavaリソースは言うまでもなくコンパイルされているため、設計時には編集できない点です。ただし、標準のJava手法で拡張することは当然可能です。

    追加の演習として、ここまで進めてきたインフラストラクチャ作成から一歩離れて、再利用可能なモバイル・クライアント・モデルを構築するための開発ガイドラインを提案するとしたら、どのようなものになるかについて考えてみましょう。一枚の紙を取り、どのようにコードを配置するか、また再利用可能なMAAファイルには何を格納するかを図に描きます。これが、大規模なモバイル・アプリケーション・プロジェクトを編成するための提案であると想定しましょう。

ステップ3:DeptEmpDCデータ・コントロール・クラスの実装

まだ手を付けていないクラスが1つだけ残っています。DeptEmpDC.javaクラスです。これは、データ・コントロールとして公開するJava Beanです。MAFに含まれるデータ・コントロールは、モバイル・クライアントの開発者に対してサービス・データ・モデルを提供します。このチュートリアルでデータ・コントロールが公開する必要のある機能は次のとおりです。

- すべての部門の問合せ
- 特定部門に含まれる従業員の問合せ
- 特定部門の新規従業員の作成
- 従業員の更新
- 従業員の削除

注:このチュートリアルはすべてのデータ・キャッシングを実装して、すべてのUIデータ問合せをリモートRESTサービスに送ります。キャッシングは実際のモバイル・アプリケーション・プロジェクトのすべてに推奨されるものであり、一時的なメモリ内キャッシングにはJavaオブジェクトを使用し、オフライン・キャッシングにはSQLiteを使用することで、データ・コントロール・レベルで実装できます。

    データ・コントロール・クラスの実装
  1. JDeveloperのソース・コード・エディタでDeptEmpDC.javaを開きます。

  2. ファイル・システムで、チュートリアルのDOC/CODE_TEXTからDeptEmpDC.txtファイルを見つけて開きます。中身をDeptEmpDC.javaファイルにコピーし、パッケージ名以外の既存の内容を置き換えます。

  3. ファイルのインポートが完了するまで待ちます。

  4. public DepartmentsEntity[] getAllDepartments()メソッドを見つけます。このメソッドはクラス内でまだ実装されていない唯一のメソッドです。このメソッドの実装を使用して、これまでの入念な準備から得られるすべてのメリットを示します。テキスト・ファイルに含まれるコードを読んで、コードの動作を理解しましょう。

  5. return文の上の行に、(allDepartments == null){ … }をチェックするif条件があります。このチュートリアルではキャッシング戦略については説明しませんが、DeptEmpDCはRESTサービスから問い合わせた部門データに対してメモリ内キャッシングを使用します。チュートリアル内で、部門データは読取り専用です。

  6. このif条件内で、RESTサービスに対してすべての部門データに関する問合せを実行します。最初に必要なコード行は、部門を問い合わせるためのREST URIの取得です。

    これを実行するのが次のコード行です。

  7. String restURI = DeptEmpURIs.GetAllDepartmentsURI();

    注:このヘルパー・クラスは"/departments"を文字列として返します。この処理は単純であり、手動で直接入力することも可能です。ただし、もっと複雑なメソッド(例:createEmployee(…))を見てみると、これらのラッパー・クラスをヘルパーとして作成するのが得策であることが分かるでしょう。

  8. 次の処理はRESTサービスへの問合せであり、ここでもヘルパーが役に立ちます。
    次の2行のコードはリモートRESTサービスを起動し、部門リストをJSON配列文字列として返します。

    実際のコードを次に示します。

  9. RestCallerUtil rcu = new RestCallerUtil();
    String jsonArrayAsString = rcu.invokeREAD(restURI);

  10. メソッドを完了するための最後のステップは、JSON文字列から従業員エンティティ配列への変換です。

  11. DepartmentsEntity[] departments = JsonArrayToDepartmentsArray.getDepartmentsArray(jsonArrayAsString);
    allDepartments = departments;

  12. allDepartments()メソッドを次に示すメソッドと比べてみましょう。まったく同じように見えます。

    alt text

  13. 少し時間を割いて、createEmployeeメソッドとupdateEmployeeメソッド、removeEmployeeメソッドの実装について確認します。これらのインフラストラクチャ・クラスを使用することで、データ・コントロール・メソッド内の実際のコード行を最小限に抑えています。

  14. DeptEmpDCクラスはデータ・コントロールとして、RESTサービスの機能をMAFに公開するPOJOオブジェクトです。このクラスには次のメソッドが含まれています。

    alt text

    allDepartmentsの問合せをMAFデータ・コントロール内のコレクションとして表示するため、DepartmentsEntity[]型を持つallDepartmentsプロパティに対するsetterメソッドとgetterメソッドが必要になります。setterは必須であり空のままになっています。ここで必要なのは、RESTサービスからデータを読み取るgetメソッドのみです。

    alt text

    allDepartments属性と同様に、allEmployees属性もsetterとgetterのペアによって公開され、MAFデータ・コントロール内のコレクションとして表示されます。実装では、getAllEmployeesメソッドは常に、現在選択されている部門の従業員リストを返します。選択されている部門の情報は、モバイル・アプリケーションによってprepareEmployeesForDepartmentメソッドが起動されることで提供されます。

    allEmployees情報がメソッド呼出しによって返される結果セットではなく、コレクションとして提供される理由は、プロバイダ変更イベントを起動することで、ページ上に表示する従業員データを即座に更新できるようにするためです(タブレット・デザインなど、部門データと従業員データが同じページに表示されている場合に有効)。

    alt text

    このメソッドは特定部門の従業員をリモートRESTサービスから問い合わせて、結果セットをallEmployeesプロパティに保存します。このタイプのマスター/ディテールは"遅延マスター/ディテール"と呼ばれます。ディテール行は親データ・オブジェクト内に組み込まれておらず、親オブジェクトが選択されるとオンデマンドで問い合わせられます。

    alt text

    いずれのメソッドもJSONオブジェクトをリモート・サービスに渡して、新しい従業員を作成するか、または既存の従業員を更新します。これらのコールに関連付けられたHTTPメソッドはPUTとPOSTです。

    alt text

    RESTサービスのURIをコールして、リソースを削除します。このコールに関連付けられたHTTPメソッドはDELETEです。

    alt text

    setEditableEmployeesメソッドは編集用に渡されたオブジェクトのコピーを作成します。従業員データをコピーしないと、既存オブジェクトのオブジェクト参照を直接操作することになり、ユーザー編集の取消しが難しくなります。

    これらの2つのメソッドはヘルパー・メソッドであり、MAFパターンを実装してフォームの取消しをサポートします。モバイル・アプリケーションでは、入力テキスト・フィールドに追加された変更は即座に基盤データ・オブジェクトに保存されます。データ変更を取り消すには、元のデータのコピーを使用してデータ・オブジェクトを再設定する必要があります。別の方法として、別個のコレクションに対して編集を実行することで、ユーザーが最後に送信ボタンを押したときのみ、データ変更がコレクションに永続化されるようにすることもできます。

    上記の2つのメソッドがサポートしているのは後者の方法です。編集フォームにナビゲートした場合、ユーザーはallEmployeesコレクションを編集する代わりに、editableEmployeeコレクションを編集します。編集を取り消すために必要なのは、編集フォーム・ページから別のページへのナビゲートだけです。

  15. すべての作業内容を保存します。

  16. データ・コントロールの作成
  17. 繰り返しますが、特定のクラスが自動的にデータ・コントロールになるのではなく、そのように構成する必要があります。この構成プロセスは、"データ・コントロールの作成"プロセスと呼ばれます。このチュートリアルでは、DeptEmpDCクラスをPOJOデータ・コントロールとして構成します。

    Applicationsウィンドウで「DeptEmpDC」ファイルを右クリックします。

  18. メニューから「Create Data Control」を選択して、MAFデータ・コントロールを生成します。

    alt text
  19. Next」をクリックしてデフォルトの名前とBeanクラス名を使用し、「Finish」をクリックしてデータ・コントロール作成プロセスを完了します。

  20. JDeveloperでData Controlsパネルを開きます。IDEでの以前の作業内容によっては、何も表示されない場合があります。パネルを更新して先ほど作成したデータ・コントロールを表示するには、「refresh」ボタン(2つの青い矢印が付いたアイコン)をクリックします。

    DeptEmpDCノードを開くと、パネルは次のように表示されます。UI開発者が使用できるAPIは以下のとおりです。

    alt text
  21. すべての作業内容を保存します。

 


ブックマーク 印刷 すべて表示 | すべて非表示
トップに戻る
Copyright © 2014, Oracle and/or its affiliates.All rights reserved.