プライマリ・コンテンツに移動

Oracle Enterprise Pack for Eclipse Oracle Mobile Application Framework (OEPE Edition)でのモバイル・アプリケーションの開発 リリース2.1.3 E67371-01 |
| 目次

前 | 次 |

# 15 MAF AMXでのSOAP Webサービスの使用

この章では、サード・パーティのSOAP WebサービスをMAF AMXアプリケーション機能の実装に統合する方法について説明します。

この章には次の項が含まれます:

- 第15.1項「MAFアプリケーションでのWebサービス使用の概要」

- 第15.2項「SOAPを使用したWebサービス・データ・コントロールの作成」

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

- 第15.4項「新しいWebサービス接続の作成」

- 第15.5項「Webサービス・データ・コントロールのエンドポイントの調整」

- 第15.6項「セキュアなWebサービスへのアクセス」

- 第15.7項「JavaからのWebサービスの起動」

- 第15.8項「ブラウザ・プロキシ情報の構成」

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

Webサービスでは、アプリケーションおよびその機能は、定義済のアプリケーション・プログラミング・インタフェースを使用してデータと情報を交換できます。Webサービスを使用すると、元のアプリケーションのプラットフォームや言語に関係なくビジネス機能を公開できます。これは、ビジネス機能が、他のアプリケーションで認識および使用可能な標準XMLコンストラクトで構成されるメッセージに抽象化されて公開されるためです。

MAFアプリケーションでは、Webサービスを使用してリモート・データ・ソースと対話します。具体的には、次のとおりです。

- リモート・データ・ソース内のデータの問合せ。

- リモート・データ・ソースとの双方向のデータ書込み。

MAFアプリケーションでWebサービスを使用する最も一般的なユース・ケースの一部を次に示します。

- Webサービスとしてはすぐに利用できるが、アプリケーション内で開発するには時間がかかる機能を追加するため

- 異なるアーキテクチャで実行されるアプリケーションへのアクセスを提供するため

MAFアプリケーションでWebサービスを使用すると、次のことが可能になります。

- Webサービス上で公開されている機能のサブセットからの選択。Webサービスによって提供されているエンタープライズ・データ以外はリクエストできないので、Webサービス・データ・コントロールで公開しているアプリケーション機能の数を減らすことにより、エンタープライズ・データに対するアクセス可能またはアクセス不可の制限設定に対応できます。

- モバイル・デバイスのリソースにとって計算の負荷が大きい機能を提供する。これは、デバイスが実行する必要のある実際の作業量、またはデバイスでローカルに使用できるデータ・セットよりもはるかに大規模なデータ・セットが機能のベースになっているという事実が理由になっている可能性があります。

注意: CPU負荷の高い機能はサービス(サーバー側)にアウトソースするよう検討することをお薦めします。

MAFでは、SOAP WebサービスとREST Webサービスの両方の消費をサポートしています。REST Webサービスの使用方法の詳細は、第16.7項「RESTサービス・アーティファクトの作成」を参照してください。

使用するタイプを決定する前に、次の点を考慮してください。

- 大規模なペイロードや冗長なXML Schemaを使用しているSOAPは、MAFアプリケーションのパフォーマンスに影響する可能性があります。REST Webサービス(利用可能な場合)を使用するか、Oracle Service Bus (`http://www.oracle.com/technetwork/middleware/service-bus/overview/index.html`を参照)のようなミドルウェア・ソリューションを挿入して、ペイロードをSOAPからREST JSONに変換することをお薦めします。

- MAFはETL (抽出、変換、ロード)ツールではないので、複雑なWebサービスのペイロードに対応するにはコードを記述する必要があり、その結果、コードが複雑になるだけでなく、パフォーマンスも低下する可能性があります。Oracle Service Busのようなミドルウェア・ソリューションを使用することで、モバイル環境に適したデータ・ペイロードの形成が可能になります。

次のWebサービスの使用例は、データ・アクセス(使用例1)と、計算およびデータ駆動機能(使用例2と3)を示しています。

- Webサービスを使用して、商談データのセットをエンタープライズ・データ・ストアからフェッチしてエンド・ユーザーがそのデータをデバイスで操作できるようにし、変更内容をエンタープライズ・データ・ストアにポストする。

- 一部のエンタープライズ・データに関するレポートの生成をリクエストし、そのレポートをフェッチする。

- 顧客施設への道順の地図イメージを取得する。

MAFを使用して開発されたアプリケーション機能でWebサービスを使用する場合、外部Webサービスのデータ・コントロールを作成するのが最も一般的な方法です。詳細は、次を参照してください。

- 第15.2項「SOAPを使用したWebサービス・データ・コントロールの作成」

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

- 第14.1項「バインディングおよびデータ・コントロールの概要」

## 15.2 SOAPを使用したWebサービス・データ・コントロールの作成

MAFを使用して開発されたアプリケーション機能でWebサービスを使用する場合、外部Webサービスのデータ・コントロールを作成するのが最も一般的な方法です。詳細は、第14.1項「バインディングとデータ・コントロールの概要」を参照してください。

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

OEPEでは、そのサービスのWeb Services Description Language (WSDL)ファイルのみを使用して、既存のSOAP Webサービスのデータ・コントロールを作成します。ローカル・ファイル・システムでWSDLファイルを参照するか、Universal Description, Discovery and Integration (UDDI)レジストリでWSDLファイルを検索するか、WSDL URLを直接入力することができます。

注意: ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、OEPEで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、第15.8項「ブラウザ・プロキシ情報の構成」を参照してください。

SOAP Webサービス・データ・コントロールを作成するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクトを右クリックして、OEPEのメイン・メニューから「ファイル」→「新」→「その他」を選択します。

2. 「新」ダイアログで、「Oracle」を展開し、「モバイル・アプリケーション・フレームワーク」を展開して「データ・コントロール」を選択します。「次へ」をクリックします。

   図15-1 新しいSOAP Webサービス・データ・コントロールの作成

3. ウィザードのデータ・コントロール・ソース・ページで、「Webサービス」を選択します。

4. をクリックし、データ・コントロール・ソース・ダイアログでローカルWSDLを使用可能なWSDLのリストから選択するか、リモートWSDLを入力します。「次へ」をクリックします。

注意: MAFでは、SOAP 1.1および1.2の両方のバージョンで次のエンコーディング・スタイルをサポートしています。 ドキュメント/リテラル ドキュメント/ラップ RPC

### 15.2.2 Webサービス・データ・コントロールにおけるSOAPヘッダーのカスタマイズ方法

MAFでは、`DataControls.dcx`ファイルにカスタム・プロバイダ・クラスを指定できます(この項の最後にある3つの例のうちの3番目の例を参照)。このカスタム・クラスは`oracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProvider`を拡張します。これは、`SoapHeader[] getAdditionalSoapHeaders()`メソッドの実装の指定に使用できます。

最初の例は、`SOAPProvider`を拡張して、2番目の例に示すカスタム・ヘッダーを作成する方法を示しています。

カスタム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;
       }
    }

この例は、新しいカスタム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

この例は、`SOAPProvider`を登録した`DataControls.dcx`ファイルのサンプル・エントリを示しています。

    <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ヘッダーを指定することはできません。

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

Webサービス・データ・コントロールの作成後は、図15-2のように、Webサービスの操作およびその操作の戻り値が「データ・コントロール」ウィンドウに表示されます。

図15-2 Webサービス・データ・コントロール

Webサービス・データ・コントロールは、「データ・コントロールの編集」をクリックすることで編集できます(図15-3を参照)。

他のデータ・コントロールと同様に、Webサービスの操作によって戻されたオブジェクトをドラッグ・アンド・ドロップして、MAF AMXページのユーザー・インタフェースを作成できます。詳細は、第12.3.2.3項「データ・コントロールのビューへの追加」を参照してください。Webサービスの操作から戻されたデータが表示されると、次のオブジェクト・タイプが処理されます。

- コレクション

- Webサービスの操作により戻された複合オブジェクト

- Webサービスの操作により戻された、ネストされた複合オブジェクト

Webサービスの操作を使用して、標準データ型と複合データ型の両方を更新および削除できます。

図15-2で示されているように、各データ・コントロール・オブジェクトはアイコンで表されます。表15-1は、各アイコンが表すデータ・コントロール・オブジェクト、「データ・コントロール」パレットの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。詳細は、第14.6項「「データ・コントロール」パレットでのデータバインドされたUIコンポーネントの作成」を参照してください。

表15-1 Webサービスの「データ・コントロール」パレットのアイコンおよびオブジェクト階層

アイコン | 名前 | 説明 | 作成する対象
--- | --- | --- | ---
| データ・コントロール | データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。通常、各Webサービスに対するデータ・コントロールは1つです。 | 他のオブジェクトのコンテナとして機能し、コンポーネント作成には使用されません。
| コレクション | サービスの操作から返されるデータ・コントロールを表現します。コレクションは、メソッド戻りオブジェクト、他のコレクション、または構造化属性の下の子としても表示されます。コレクションの下の子は、属性、他のコレクション、カスタム・メソッド、コレクションに対して実行できる組込み操作などです。 | フォーム、表、グラフ、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・コンポーネント。第13.5項「データ視覚化の指定」も参照してください。
| 属性 | オブジェクト内の個別のデータ要素(行の属性など)を表します。属性は、自分の属するコレクションまたはメソッド戻りの下に、子として表示されます。 | ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第13.2項「ページ・レイアウトの設計」も参照してください。
| 構造化属性 | 複合型でありコレクションではない、返されたオブジェクトを表します。たとえば、構造化属性は、現在のサービス・リクエストに割り当てられた単一のユーザーを表現します。 | ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第13.2項「ページ・レイアウトの設計」も参照してください。
| メソッド | データ・コントロールの操作またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはそれらのコレクションを戻すことができます。 | コマンド・コンポーネント。 パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。また、第13.3項「UIコンポーネントの作成と使用方法」も参照してください。
| メソッド戻り | Webサービス・メソッドによって戻されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。 メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッドの戻りオブジェクトの下の子として表示されるオブジェクトは、該当コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、および親コレクション上で実行可能な操作です。 単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するために、対応するメソッドをボタンとしてドロップする必要があります。また、タスク・フローを使用している場合は、メソッド・アクティビティを作成できます。 | コレクションと属性、および問合せフォームの場合と同じコンポーネント。
| 操作 | 親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションの下の「操作」ノードにあります。1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「パラメータ」ノードにリストされます。 現在行のナビゲーションと設定のために、`First`、`Last`、`Next`、`Previous`、`setCurrentRowWithKey`、および`SetCurrentRowWithKeyValue`の各操作がサポートされます。問合せをリフレッシュするために、`Execute`がサポートされます。Webサービス操作に応じて、`Create`および`Delete`が使用可能です。Webサービス・データ・コントロールはトランザクション方式ではないので、`Commit`および`Rollback`はサポートされません。 | ボタン、リンクおよびメニューなどのユーザー・インタフェース・コマンド・コンポーネント。詳しくは、第13.3項「UIコンポーネントの作成と使用方法」を参照してください。
| パラメータ | メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。 配列および構造化パラメータは、データ・コントロールの下の更新可能な構造化属性およびコレクションとして公開され、UI上にADFフォームまたは更新可能な表としてドロップできます。UIを使用して配列または複合オブジェクト(標準のJava型ではない)のパラメータを作成できます。 | ラベル、テキストおよび選択リストの各コンポーネント。詳細は、第13.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

## 15.4 新しいWebサービス接続の作成

Webサービスの接続情報は、アプリケーション内の他の接続とともに`connections.xml`ファイルに保存されます。このファイルは、Webサービス・データ・コントロールの作成時に新規Webサービス・データ・コントロール・ウィザードによって`.adf/META-INF`ディレクトリに生成されるため、明示的に作成する必要はありません(第15.2項「SOAPを使用したWebサービス・データ・コントロールの作成」を参照)。

接続設定を変更するには、`connections.xml`ファイルを編集します。

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

Webサービス・データ・コントロールを作成すると、URIのエンドポイントを変更できます。これは、アプリケーション機能をテスト環境から本番環境に移行する場合などに便利です。

エンドポイントを変更するには、`connections.xml`ファイルを編集します。

## 15.6 セキュアなWebサービスへのアクセス

MAFでは保護されたWebサービスと保護されていないWebサービスの両方がサポートされます。詳細は、第30章「MAFアプリケーションの保護」を参照してください。

SOAP Webサービスが保護されている場合、SOAP Webサービスをサポートする事前定義済のセキュリティ・ポリシーにSOAP接続を関連付ける必要があります。表15-2に、SOAP Webサービスに関連付けることができる事前定義済のセキュリティ・ポリシーを示します。

表15-2 SOAPベースのWebサービスでサポートされるセキュリティ・ポリシー

認証タイプ | SOAPポリシー | 説明
--- | --- | ---
HTTP基本 | `oracle/http_basic_auth_over_ssl_client_policy` | このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含めます。このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアント・エンドポイントで実行できます。
HTTP基本 | `oracle/wss_http_token_client_policy` | このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含めます。このポリシーは、HTTPベースのクライアントで実行できます。
HTTP基本 | `oracle/wss_http_token_over_ssl_client_policy` | このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含め、Oracle Platform Security Servicesアイデンティティ・ストアに対してユーザーを認証します。また、このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアントで実行できます。
HTTP基本 | `oracle/wss_username_token_client_policy` | このポリシーは、すべてのアウトバウンドSOAPリクエスト・メッセージにWS-Security UsernameToken SOAPヘッダーの資格証明を含めます。プレーン・テキストとダイジェストの両方のメカニズムがサポートされます。このポリシーは、SOAPベースのすべてのクライアントに添付できます。
HTTP基本 | `oracle/wss_username_token_over_ssl_client_policy` | このポリシーは、アウトバウンドSOAPリクエスト・メッセージにWS-Security UsernameTokenヘッダーの資格証明を含めます。このポリシーは、トランスポート・プロトコルでSSLメッセージの保護が提供されていることを検証します。プレーン・テキストとダイジェストの両方のメカニズムがサポートされます。このポリシーは、SOAPベースのすべてのクライアントに添付できます。

REST Webサービスが保護されている場合、REST Webサービスをサポートする事前定義済のセキュリティ・ポリシーにREST接続を関連付ける必要があります。表15-3に、REST Webサービスに関連付けることができる事前定義済のセキュリティ・ポリシーを示します。

表15-3 RESTベースのWebサービスでサポートされるセキュリティ・ポリシー

認証タイプ | RESTポリシー | 説明
--- | --- | ---
HTTP基本 | `oracle/http_basic_auth_over_ssl_client_policy` | このポリシーには、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明が組み込まれ、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアント・エンドポイントで実行できます。
HTTP基本 | `oracle/wss_http_token_client_policy` | このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含めます。このポリシーは、HTTPベースのクライアントで実行できます。
HTTP基本 | `oracle/wss_http_token_over_ssl_client_policy` | このポリシーは、アウトバウンド・クライアント・リクエストのHTTPヘッダーに資格証明を含め、Oracle Platform Security Servicesアイデンティティ・ストアに対してユーザーを認証します。また、このポリシーは、トランスポート・プロトコルがHTTPSであることを検証します。HTTPS以外のトランスポート・プロトコルを介するリクエストは拒否されます。このポリシーは、HTTPベースのクライアントで実行できます。
HTTP基本 Web SSOおよび Mobile&Social | `oracle/http_cookie_client_policy` | このポリシーは、認証後に取得されたCookieをHTTPリクエスト・ヘッダーに挿入します(例: OAM Webgateリソース)。このポリシーでは、レスポンスCookieも設定します。このポリシーは、RESTベースのクライアントで実行できます。
OAuth | `oracle/http_oauth2_token_mobile_client_policy` | このポリシーは、エンドポイントとの通信中にBearerトークン(OAuthアクセス・トークン)をHTTPリクエスト・ヘッダーに挿入します。このトークンは、任意のOAuth2サーバーから取得できます。このポリシーは、RESTベースのクライアントで実行できます。

これらのポリシーとその使用法の説明については、『Oracle Fusion Middleware Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理』の「使用する事前定義済ポリシーの決定」と「事前定義済ポリシー」の各章を参照してください。

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

Webサービスが保護されており、認証トークンが予想される場合、Webサービスをサポートする事前定義済のセキュリティ・ポリシーに接続を関連付ける必要があります。

SOAPベースおよびRESTベースのWebサービスに使用可能な認証タイプでサポートされる事前定義済のセキュリティ・ポリシーのリストは、第15.6項「セキュアなWebサービスへのアクセス」を参照してください。

始める前に:

新規Webサービス・データ・コントロール・ウィザードを実行して、Webサービス接続を作成します。ウィザードの実行の詳細は、第15.2項「SOAPを使用したWebサービス・データ・コントロールの作成」を参照してください。

該当するOracle Web Services Managerのポリシーが表示されるよう、SOAP Web サービス・データ・コントロールの作成時に確実にポートを選択してください。

SOAP Webサービスが保護されている場合は、`oracle/wss_http_token_over_ssl_client_policy`または`oracle/wss_http_token_client_policy`のいずれかでWebサービス・データ・コントロールを構成することでアクセスが可能になります。これを行うには、図15-3に示す「データ・コントロール・ポリシーの編集」ダイアログを使用します。このダイアログは次の方法で開くことができます。

- プロジェクト・エクスプローラで、アプリケーションのビュー・コントローラ・プロジェクト内にある`.dcx`ファイルを選択します。

- 「構造」ウィンドウで、構成が必要なWebサービス・データ・コントロールを右クリックし、ポップアップ・メニューから「Webサービス・セキュリティの定義」を選択します。

図15-3 Webサービス・データ・コントロール・ポリシーの編集

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

OEPEでは、Webサービス・ポリシーの定義は(アプリケーション・ワークスペースの`META-INF`ディレクトリにある) `wsm-assembly.xml`ファイルに格納されます。

### 15.6.3 Webサービスおよびコンテナ化されたMAFアプリケーションへのアクセスに関する必知事項

デプロイメント時にMAFアプリケーションがコンテナ化されると、企業ファイアウォールの背後にある保護されたWebサービスは、Oracle Mobile Security Suite (OMSS)のコンポーネントであるMobile Security Access Server (MSAS)を利用して、モバイル・デバイスから企業のリソースへのトラフィックを保護する集中アクセス・ポイントを提供します。この場合、ユーザーの最初の認証で使用するために認証エンドポイントを実行するようにMSASインスタンスが構成されます。

また、バックエンド・サービス・エンドポイントは、1.) MSASで実行されるアクセス・ポリシーによってリソースのURLが保護されるようにするMSASプロキシ・アプリケーション、2.)シングル・サインオン(SSO)などのプロキシされたリクエストにMSASで追加されるクライアント・ポリシーに関連付ける必要があります。

MAFアプリケーションがMSASと通信できるようにするには、MSASインスタンスに構成されている認証のタイプのSecure Workspaceアプリケーションをインストールおよび登録します。次に、保護されたリソースへのアクセスをユーザー試みると、MAFアプリケーションおよびSecure Workspaceは、MSASにより生成されたプロキシ自動構成ファイルを利用して、MSAS AppTunnelを使用するプロキシに対するリクエストを決定します。

コンテナ化されたMAFアプリケーションの認証プロセスでMSAS AppTunnelが果す役割の詳細は、第30.4項「コンテナ化されたMAFアプリケーションの認証プロセスの概要」を参照してください。

コンテナ化されたMAFアプリケーションのOMSSサポートの概要は、第2.4項「エンタープライズ配布のためのMAFアプリケーションのコンテナ化」を参照してください。

MSASの事前定義済のセキュリティおよび管理ポリシーの詳細は、OMSSドキュメント・ライブラリのOracle Mobile Security Access Serverのポリシーおよびアサーション・テンプレート・リファレンスを参照してください。

### 15.6.4 資格証明の挿入に関する必知事項

保護されたWebサービスにおけるユーザーの資格証明は、Webサービス・リクエストの起動時にそのリクエストに動的に挿入されます。

MAFではOracle Web Services Manager (OWSM) Mobile Agentを使用してWebサービス・リクエストによってユーザーIDを伝播させます。

Webサービスを起動する前に、ユーザーは、保護されたMAFアプリケーション機能の呼出しを試みるユーザーによってトリガーされた認証プロンプトに応答する必要があります。ユーザーの資格証明は、資格証明ストアに格納されます。この資格証明ストアは、認証プロバイダのサーバーURLおよびユーザーと関連付けられた資格証明の格納に使用される、デバイス・ネイティブかつローカルなリポジトリです。実行時に、MAFでは、すべての資格証明がその使用前にIDM Mobile資格証明ストアに格納されているものとみなします。

`connections.xml`ファイルには、Webサービスの接続参照の`adfCredentialStoreKey`属性に、ログイン・サーバー接続の`adfCredentialStoreKey`属性の値を指定して、ログイン・サーバーをWebサービスのセキュリティに関連付ける必要があります(次の2つの例を参照)。

次の例は、Webサービス接続を定義する方法を示しており、`adfCredentialStoreKey="MyAuth"`として参照されるWebサービス接続の定義を示しています(ここで、`MyAuth`とは、ログイン接続の参照名です)。

    <Reference name="URLConnection1"
               className="oracle.adf.model.connection.url.HttpURLConnection"
               adfCredentialStoreKey="MyAuth"
               xmlns="">
       <Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
       <RefAddresses>
          <XmlRefAddr addrType="URLConnection1">
             <Contents>
                <urlconnection name="URLConnection1"
                               url="http://myhost.us.example.com:7777/
                                    SecureRESTWebService1/Echo">
                   <authentication style="challange">
                      <type>basic</type>
                      <realm>myrealm</realm>
                   </authentication>
                </urlconnection>
             </Contents>
          </XmlRefAddr>
          <SecureRefAddr addrType="username"/>
          <SecureRefAddr addrType="password"/>
       </RefAddresses>
    </Reference>

次の例は、ログイン接続の定義を示しています(ここでの`MyAuth`は、ログイン・サーバー接続における資格証明ストア・キーの値として使用されます)。

    <Reference name="MyAuthName"
               className="oracle.adf.model.connection.adfmf.LoginConnection"
               adfCredentialStoreKey="MyAuth"
               partial="false"
               manageInOracleEnterpriseManager="true"
               deployable="true"
               xmlns="">
       <Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
       <RefAddresses>
          <XmlRefAddr addrType="adfmfLogin">
             <Contents>
                <login url="http://172.31.255.255:7777/
                            SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
                <logout url="http://172.31.255.255:7777/
                        /SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
                <accessControl url="http://myhost.us.example.com:7777/
                               UserObjects/jersey/getUserObjects" />
                <idleTimeout value="10"/>
                <sessionTimeout value="36000"/>
                <userObjectFilter>
                   <role name="testuser1_role1"/>
                   <role name="testuser2_role1"/>
                   <privilege name="testuser1_priv1"/>
                   <privilege name="testuser2_priv1"/>
                   <privilege name="testuser2_priv2"/>
                </userObjectFilter>
             </Contents>
          </XmlRefAddr>
       </RefAddresses>
    </Reference>

認証の失敗によってWebサービス・リクエストが拒否された場合は、MAFにより適切な例外が戻され、適切なアクションが起動されます(第31.4項「ロギングの使用方法と構成」を参照)。既存の例外で状況を適切に示せない場合は、新しい例外が追加されます。

`connections.xml`ファイルは構成サービスの下でデプロイされ、管理されています。詳細は、第18章「MAFアプリケーションで使用するエンド・ポイントの構成」を参照してください。

FAR内の`connections.xml`ファイルは、MAFアプリケーションのデプロイ時に集約されます。資格証明はデプロイメント固有のデータを表しており、FAR内に格納することは想定されていません。

### 15.6.5 Cookieの挿入に関する必知事項

Cookieベースの認可のためにMAFアプリケーションがREST Webサービスを要求するたびに、MAFのセキュリティ・フレームワークは、REST Webサービスのトランスポート・レイヤーが、REST WebサービスのURLエンド・ポイントに関連付けられているログイン接続に対してCookieを挿入できるようにします。これは実行時に処理され、MAF開発者によるMAFアプリケーションの構成は不要です。

### 15.6.6 セキュアなWSDLファイルの使用制限

MAFアプリケーションではWSDLファイルへのアクセスを実行時に認証なしに行えるようにする必要があるため、基本認証によって保護されたSOAP WebサービスでセキュアなWSDLファイルを使用することはできません。

WSDLの保護が目的の場合は次の点を考慮してください。WSDLファイルはWebサービスの`GET`メソッドによってフェッチされるため、`GET`メソッドを除く各Webサービス・メソッドを保護する場合は、セキュアなWSDLを使用できます。`GET`メソッドを保護する場合は、WSDLを保護しないようにします。

## 15.7 JavaからのWebサービスの起動

MAFアプリケーションでは、JavaコードからWebサービス層を起動して、その結果をJavaメソッドで使用できます。

MAFでは、使用可能な`GenericTypeBeanSerializationHandler`ユーティリティ・クラスが提供され、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サービスに送信しないでください)

次の例は、考えられる`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;
       }

次の例は、`Employee`クラスの`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名があります。OEPEの「データ・コントロール」ウィンドウで仮想タイプ上にカーソルを置くことによって仮想Bean名にアクセスできます。通常の名前フォーマットは、`<DCName>.Types.<methodName>.<argName>`です。

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

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

MAFを使用すると、プログラムからWebサービス・オブジェクトのイテレータにアクセスして、そのオブジェクトの行を挿入および削除できます。これを行うには、`oracle.adfmf.bindings.iterator.BasicIterator`クラスの`createRow`および`deleteRow`メソッドを使用します。

次の例は、行をWebサービス・オブジェクトに追加する方法を示しています。

    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)`では、どちらも新しい行を作成し、それをイテレータに挿入します。

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

`AdfmfJavaUtilities`の`invokeDataControlMethod`メソッドを使用することで、`PageDef`ファイルの`methodAction`として明示的に追加する必要がないデータ・コントロール操作を起動できます。

詳細および例は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

## 15.8 ブラウザ・プロキシ情報の構成

呼び出す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`によって定義されます。

いずれの場合でも、`maf.properties`ファイルに3つすべてのプロパティを定義することをお薦めしますが、そうすると次のようになります。

    java.commandline.argument=-Dcom.oracle.net.httpProxySource=user
    java.commandline.argument=-Dcom.sun.cdc.io.http.proxy=www-proxy.us.mycompany.com:80
    java.commandline.argument=-Dhttp.proxyHost=www-proxy.us.mycompany.com
    java.commandline.argument=-Dhttp.proxyPort=80

注意: これらのプロパティはネットワーク・コールのCVM側のみに影響します。