Validator for WS-Policy in Eclipse を使用する
この記事では、Validator for WS-Policy in Eclipse を使用して、無効な WS-Policy が原因で発生したエラーをデバッグする方法を説明します。説明のために使用するのは、記事に付属のサンプル・アプリケーションと、IBM Rational Application Developer 8.0.2 および IBM WebSphere Application Server 7.0.0.17 です。
IBM WebSphere Application Server および IBM Rational Application Developer のセットアップ
プロジェクトのリソースをテストする際に使用するランタイム環境を識別するためには、サーバーを IBM Rational Application Developer で作成する必要があります。そうすることによって、ワークベンチからアプリケーション・サーバーの既存のインストール済み環境またはサーバー・プロファイルへのポインターが作成されるためです。この記事では、IBM WebSphere Application Server 7.0.0.17 をサンプル・アプリケーションのアプリケーション・サーバーとして使用します。ただし、このサーバーを作成するには、あらかじめ適切なサーバー・ランタイム環境と IBM WebSphere Application Server のプロファイルが作成されていなければなりません。この 2 つが揃った上で IBM WebSphere Application Server を起動すると、アプリケーションをインストールして実行できる状態になります。
- 新しいワークスペースで IBM Rational Application Developer 8.0.2 を起動します。
- 「Welcome (ようこそ)」ページを閉じます。すると、Java EE パースペクティブが表示されます。
- サーバー・ランタイム環境を作成するために、「Window (ウィンドウ)」 > 「Preferences (設定)」の順に選択します。
- 「Server (サーバー)」 > 「Runtime Environments (ランタイム環境)」の順にナビゲートして、「Add (追加)」をクリックします。
図 1. サーバー・ランタイム環境の追加
- 「WebSphere Application Server v7.0」を選択して、「Next (次へ)」をクリックします。
図 2. ランタイム環境のタイプの選択
- 「Name (名前)」には「WebSphere Application Server v7.0.0.17」、「Installation directory (インストール・ディレクトリー)」には <WAS_HOME> (例えば、「C:\Program Files\IBM\WebSphere\AppServer」) を指定して、「Finish (完了)」をクリックします。
図 3. IBM WebSphere Application Server インストール・ディレクトリーの指定
- 「Window (ウィンドウ)」 > 「Preferences (設定)」の順に選択し、IBM WebSphere Application Server のプロファイルを作成します。
- 「Server (サーバー)」 > 「WebSphere Application Server」の順にナビゲートして、「Run Profile Management Tool (プロファイル管理ツールの実行)」をクリックします。
図 4. プロファイル管理ツールの実行
- プロファイル管理ツールが開いたら、「Launch Profile Management Tool (プロファイル管理ツールの起動)」をクリックします。
図 5. プロファイル管理ツールの起動
- 「Create… (作成…)」をクリックします。
図 6. 新規プロファイルの作成
- 「Application server (アプリケーション・サーバー)」が選択されていることを確認してから、「Next (次へ)」をクリックします。
図 7. 作成する環境のタイプの指定
- 「Typical profile creation (標準プロファイルの作成)」が選択されていることを確認してから、「Next (次へ)」をクリックします。
図 8. 標準プロファイル作成プロセスの選択
- 「Enable administrative security (管理セキュリティーの有効化)」チェック・ボックスの選択を解除して、「Next (次へ)」をクリックします。
図 9. 管理セキュリティーの無効化
- プロファイルの詳細を確認して、「Next (次へ)」をクリックします。
図 10. プロファイル作成サマリーの確認
- プロファイルの作成が完了したら、「Launch the First steps console. (最初のステップ・コンソールを起動)」チェック・ボックスの選択を解除し、「Finish (完了)」をクリックします。
図 11. プロファイル作成ウィザードの完了
- プロファイル管理ツールを閉じます。
- 新規プロファイルが下部のパネルに記載されていることを確認してください。「OK」をクリックして「Preferences (設定)」ウィンドウを閉じます。
- 「Servers (サーバー)」タブを右クリックして、「New (新規)」 > 「Server (サーバー)」の順に選択します。
図 12. 新規サーバーの作成
- 「WebSphere Application Server v7.0」を選択し、「Next (次へ)」をクリックします。
図 13. サーバー・タイプの選択
- 前の手順で作成したプロファイルの名前が選択されていることを確認して、「Finish (完了)」をクリックします。
図 14. IBM WebSphere Application Server の設定
- 「Servers (サーバー)」タブで「WebSphere Application Server v7.0.0.17 at localhost (ローカル・ホストの WebSphere Application Server v7.0.0.17)」を右クリックして、「Start (始動)」を選択します。
図 15. サーバーの起動
サンプル・アプリケーションが使用するポリシー・セットは、デフォルトでは IBM WebSphere Application Server と IBM Rational Application Developer にインストールされません。したがって、まず始めにこのポリシー・セットを両方の製品にインストールする必要があります。ポリシー・セットをインストールした後、サンプル・アプリケーションの EAR ファイルを IBM Rational Application Developer ワークスペースにインポートすると、前のセクションで作成したサーバーでサンプル・アプリケーションを実行できるようになります。サンプル・アプリケーションが立ち上がったら、このアプリケーションを使用して同期 Web サービス・リクエストを送信することができます。しかし、成功のレスポンス・メッセージの代わりに、例外が発生します。これは、サンプル・アプリケーションの WS-Policy が無効なためです。
- サンプル・アプリケーションに必要なプロバイダー・ポリシー・セットを IBM WebSphere Application Server にインポートします。それには、「Servers (サーバー)」タブを選択し、「WebSphere Application Server v7.0.0.17 at localhost (ローカル・ホストの WebSphere Application Server v7.0.0.17)」を右クリックして「Administration (管理)」 > 「Run Administrative Console (管理コンソールの実行)」の順に選択します。
図 16. 管理コンソールの実行
- 管理コンソールで、「Services (サービス)」 > 「Policy Sets (ポリシー・セット)」 > 「Application Policy Sets (アプリケーション・ポリシー・セット)」の順にナビゲートして、「Import (インポート)」 > 「From default repository… (デフォルト・リポジトリーから)」の順にクリックします。
図 17. ポリシー・セットのインポート
- ページの最下部までスクロールし、矢印をクリックして次のページに移動します。
- 「WS-Security default (WS-Security デフォルト)」の隣にあるチェック・ボックスを選択してから「OK」をクリックし、「Save (保存)」をクリックします。
図 18. WS-Security デフォルト・ポリシー・セットの選択
- ログアウトして管理コンソールを閉じます。
- サンプル・アプリケーションに必要なプロバイダー・ポリシー・セットを IBM Rational Application Developer にインポートし、この記事に付属の WSSecurity default.zip ファイルをダウンロードします。
- 「Enterprise Explorer (エンタープライズ・エクスプローラー)」ビューを右クリックして、「Import (インポート)」 > 「Import… (インポート…)」の順に選択します。
図 19 インポート・ウィザードのオープン
- 「Web services (Web サービス)」フォルダーを展開して「WebSphere Policy Sets (WebSphere ポリシー・セット)」を選択し、「Next (次へ)」をクリックします。
図 20. ポリシー・セットのインポート
- ダウンロードした WSSecurity default.zip ファイルを参照して、「Finish (完了)」をクリックします。
図 21. ダウンロードしたポリシー・セットのインポート
- 問題のあるサンプル・アプリケーションをインポートして、この記事に付属の InvalidPolicy.ear ファイルをダウンロードします。
- 「Enterprise Explorer (エンタープライズ・エクスプローラー)」ビューを右クリックして、「Import (インポート)」 > 「EAR file (EAR ファイル)」の順に選択します。
図 22. EAR ファイルのインポート
- ダウンロードした InvalidPolicy.ear ファイルを参照して、「Target runtime (ターゲット・ランタイム)」が「WebSphere Application Server v7.0.0.17」に設定されていることを確認したら、「Finish (完了)」をクリックします。
図 23. ダウンロードした EAR ファイルのインポート
- IBM Rational Application Developer に付属のデフォルト・プラグインを使用してサンプル・アプリケーションをコンパイルすると、エラーは発生しません。
図 24. インポートしたサンプル・アプリケーションはエラーなしでコンパイルされます
- 問題のあるサンプル・アプリケーションを実行して、「Servers (サーバー)」タブを選択します。このタブで、「WebSphere Application Server v7.0.0.17 at localhost (ローカル・ホストの WebSphere Application Server v7.0.0.17)」を右クリックして「Add and Remove... (追加および除去…)」を選択します。
図 25. 「Add and Remove... (追加および除去…)」ウィザードのオープン
- 「Available (使用可能)」列で「InvalidPolicy」を選択して「Add (追加)」をクリックし、「Finish (完了)」をクリックします。
図 26. 問題のあるサンプル・アプリケーションの追加
- アプリケーションが正常に公開されたら、サーバーのステータスが「[Started, Synchronized (始動済み、同期済み)]」に変わっていることを確認してください。
図 27. サーバーのステータスの確認
- Web ブラウザーを開き、http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo (例えば、http://localhost:9080/wssamplesei/demo) にナビゲートします。
- 「Message Type (メッセージ・タイプ)」には「Synchronous Echo (同期エコー出力)」を選択し、「Message String (メッセージ文字列)」に「hello」と入力したら、「Send Message (メッセージ送信)」をクリックします。すると、例外が発生するはずです。
図 28. 問題のあるサンプル・アプリケーション Web サービスの呼び出し
サーバー・ランタイム環境でエラーが発生すると、IBM Rational Application Developer のコンソール・ビューにエラー・ログが表示されます。このサンプル・アプリケーションの場合には、クライアント側の WS-Security 構成に問題があることを示すエラーが発生しています。この問題は、クライアントがプロバイダーの WSDL 文書の WS-Policy を使用して構成されていることであると判断されます。
- IBM Rational Application Developer のコンソールを調べて、以下のメッセージを確認します。
リスト 1. 問題のあるサンプル・アプリケーションを実行して発生したエラー
[23/05/11 14:40:12:906 BST] 0000001f SystemOut O >> CLIENT: ERROR: SEI Echo EXCEPTION.
[23/05/11 14:40:12:906 BST] 0000001f SystemErr R javax.xml.ws.WebServiceException:
com.ibm.wsspi.wssecurity.core.SoapSecurityException: CWWSS5400E: algorithm attribute is
required but found:
com.ibm.ws.wssecurity.confimpl.PrivateCommonConfig$AlgorithmConfImpl(algorithm=[null],
type=[null], properties=[{}]).
|
- エラーがクライアント・サイドでポリシー・セットの構成中に発生していることを確認します。
リスト 2. エラーのスタック・トレース
[23/05/11 14:40:12:921 BST] 0000001f SystemErr R at com.ibm.ws.wspolicy.runtime.handler.ClientWSPolicyHandlerImpl. generatePolicySetConfigurations(ClientWSPolicyHandlerImpl.java:282) |
- Web サービス・クライアントがプロバイダーのポリシーを使用するように構成されていることを確認します。
- 「Services (サービス)」ビューを選択して、「JAX-WS」 > 「Clients (クライアント)」 > 「SampleClientSei: {http://com/ibm/was/wssample/sei/echo/}EchoService」 > 「Manage Policy Set Attachment... (ポリシー・セット接続の管理)」の順に選択します。
図 29. クライアントのポリシー・セット接続の管理
- すべてのサービスが「Acquire Provider Policy (プロバイダー・ポリシーを取得)」に設定されていることを確認します。
図 30. 各サービスのポリシー取得の設定の確認
- 「Use Provider Policy... (プロバイダー・ポリシーの使用…)」をクリックし、ポリシーが HTTP GET によってデフォルトの WSDL URL から取得されていることを確認します。
- 両方のウィンドウで「Cancel (キャンセル)」をクリックします。
図 31. プロバイダー・ポリシーの WSDL URL の確認
- プロバイダー・ポリシーが含まれるプロバイダーの WSDL ファイルを見つけて、http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService?wsdl (例えば、http://localhost:9080/WSSampleSei/EchoService?wsdl) にナビゲートします。
- この URL は http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService/WEB-INF/wsdl/Echo.wsdl にリダイレクトされることに注意してください。これは、使用されている WSDL がプロバイダーの WAR (InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl) にパッケージ化されているためです。
図 32. Echo.wsdl ファイルの特定
Validator for WS-Policy in Eclipse プラグインのインストール
プロバイダーの WSDL 文書の WS-Policy に問題があることが明らかになりました。けれども、Eclipse の既存のバリデーターはいずれも、この原因を突き止めることができませんでした。そこで、Validator for WS-Policy in Eclipse プラグインをインストールしてみます。このプラグインをインストールするには、他の Eclipse プラグインでも使用する標準の更新メカニズムを使用します。
- alphaWorks から VWPE.zip をダウンロードします。この zip ファイルに、Validator for WS-Policy in Eclipse 1.0 が含まれています。
- VWPE.zip をローカル・ディレクトリーに解凍し、指定したディレクトリーにローカル更新サイトを作成します。
- 「Help (ヘルプ)」 > 「Install New Software... (新規ソフトウェアのインストール…)」の順に選択します。
- 「Add… (追加…)」をクリックします。
図 33. 新規リポジトリーの追加
- 「Local... (ローカル…)」をクリックし、前の手順で抽出した VWPE ディレクトリーを選択します。
図 34. VWPE ディレクトリーの選択
- 「Name (名前)」に「VWPE」と入力して「OK」をクリックします。
- Validator for WS-Policy in Eclipse プラグインを選択して「Next (次へ)」をクリックします。
図 35. インストールするプラグインの選択
- インストールの詳細を確認し、「Next (次へ)」をクリックします。
図 36. インストールされる項目の確認
- 使用条件を確認してから同意し、「Finish (完了)」をクリックします。
図 37. 使用条件の確認
- セキュリティー警告が表示されたら、「OK」をクリックして無視します。
図 38. セキュリティー警告を無視する選択
- インストールが完了したら、「Restart Now (今すぐ再起動)」をクリックして、新しいプラグインがインストールされた IBM Rational Application Developer を再起動します。
図 39. IBM Rational Application Developer の再起動
Validator for WS-Policy in Eclipse の構成
プラグインが正しくインストールされていることを検証するには、構成を調べて、バリデーターが有効になっていて WSDL 文書で動作することを確かめてください。
- IBM Rational Application Developer が再起動したら、「Window (ウィンドウ)」 > 「Preferences (設定)」の順に選択します。
- 「Validation (検証)」を選択し、WS-Policy バリデーターが有効になっていること (「Manual (手動)」および「Build (ビルド)」の両方のチェック・ボックスにチェック・マークが付いていること) を確認します。
図 40. WS-Policy バリデーターが有効になっていることの確認
- 「WS-Policy validator (WS-Policy バリデーター)」の隣にある「...」ボタンをクリックして「Settings (設定)」を開きます。
- WS-Policy バリデーターが wsdl 拡張子および xml 拡張子を持つすべてのファイルで動作することを確認したら、「Cancel (キャンセル)」をクリックします。
図 41. バリデーターが使用するファイルのタイプ
- 「Validation (検証)」 > 「WS Policy Validator (WS Policy バリデーター)」にナビゲートし、このサブページでカスタム・スキーマ・ファイルの使用が許可されていることを確認します。デフォルトでは、「Schema directory (スキーマ・ディレクトリー)」フィールドは空なっているので、プラグインに付属のスキーマが使用されることになります。これについては、「スキーマをテストする」セクションで詳しく説明します。
図 42. WS Policy バリデーターのスキーマ・ディレクトリー
問題のあるサンプル・アプリケーションの無効な WS-Policy の検証
プロジェクトのすべてのファイルを検証すると、前にクライアント構成エラーの原因として特定されたプロバイダーの WSDL 文書で、1 つのWS-Policy エラーが発生します。マーカーによって無効な WS-Policy アサーションが特定され、エラー・メッセージによって、問題の原因がアサーションの欠落であることが明らかになるはずです。このエラーを解決するために、仕様とプロバイダー構成を参考にして、欠落しているアサーションを追加します。
図 43. WS-Policy の検証
- 検証が完了したら、「OK」をクリックして「Validation Results (検証結果)」ダイアログを閉じます。
図 44. 検証結果
- 「Markers (マーカー)」タブに、新しい「Invalid WS-Policy (無効な WS-Policy)」エラーが表示されていることに注目してください。このエラーは、AlgorithmSuite アサーションが少なくとも 1 つは含まれていなければならないと通知しています。
図 45. 「Markers (マーカー)」タブに示された無効な WS-Policy のエラー
- エラーをダブルクリックします。すると、InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl ファイルが開き、エラーに該当する行が強調表示されます。これは、上記で特定したファイルと同じファイルです。このファイルには、Web サービス・プロバイダーによって公開されている WS-Policy が含まれます。クライアントは、このプロバイダー・ポリシーを使用してクライアント自身を構成しています。
- AsymmetricBinding アサーションにエラーがあることを確認します。
図 46. 無効な AsymmetricBinding アサーション
- WS-Security Policy 1.2 仕様で AsymmetricBinding アサーションの構文を調べると、このエラーが示しているように、必須であるはずの AlgorithmSuite が欠落しています。
リスト 3. AsymmetricBinding アサーションの構文
<sp:AsymmetricBinding xmlns:sp="..." ... >
<wsp:Policy xmlns:wsp="...">
(
<sp:InitiatorToken>
<wsp:Policy> ... </wsp:Policy>
</sp:InitiatorToken>
) | (
<sp:InitiatorSignatureToken>
<wsp:Policy> ... </wsp:Policy>
</sp:InitiatorSignatureToken>
<sp:InitiatorEncryptionToken>
<wsp:Policy> ... </wsp:Policy>
</sp:InitiatorEncryptionToken>
)
(
<sp:RecipientToken>
<wsp:Policy> ... </wsp:Policy>
</sp:RecipientToken>
) | (
<sp:RecipientSignatureToken>
<wsp:Policy> ... </wsp:Policy>
</sp:RecipientSignatureToken>
<sp:RecipientEncryptionToken>
<wsp:Policy> ... </wsp:Policy>
</sp:RecipientEncryptionToken>
)
<sp:AlgorithmSuite ... => ... </sp:AlgorithmSuite>
<sp:Layout ... => ... </sp:Layout> ?
<sp:IncludeTimestamp ... /> ?
<sp:EncryptBeforeSigning ... /> ?
<sp:EncryptSignature ... /> ?
<sp:ProtectTokens ... /> ?
<sp:OnlySignEntireHeadersAndBody ... /> ?
...
</wsp:Policy>
...
</sp:AsymmetricBinding>
|
- AlgorithmSuite アサーションの構文を調べます。
リスト 4. AlgorithmSuite アサーションの構文
<sp:AlgorithmSuite xmlns:sp="..." ... > <wsp:Policy xmlns:wsp="..."> (<sp:Basic256 ... /> | <sp:Basic192 ... /> | <sp:Basic128 ... /> | <sp:TripleDes ... /> | <sp:Basic256Rsa15 ... /> | <sp:Basic192Rsa15 ... /> | <sp:Basic128Rsa15 ... /> | <sp:TripleDesRsa15 ... /> | <sp:Basic256Sha256 ... /> | <sp:Basic192Sha256 ... /> | <sp:Basic128Sha256 ... /> | <sp:TripleDesSha256 ... /> | <sp:Basic256Sha256Rsa15 ... /> | <sp:Basic192Sha256Rsa15 ... /> | <sp:Basic128Sha256Rsa15 ... /> | <sp:TripleDesSha256Rsa15 ... /> | ...) <sp:InclusiveC14N ... /> ? <sp:SOAPNormalization10 ... /> ? <sp:STRTransform10 ... /> ? (<sp:XPath10 ... /> | <sp:XPathFilter20 ... /> | <sp:AbsXPath ... /> | ...)? ... </wsp:Policy> ... </sp:AlgorithmSuite> |
- 「Servers (サーバー)」タブで「WebSphere Application Server v7.0.0.17 at localhost (ローカル・ホストの WebSphere Application Server v7.0.0.17)」を右クリックして、「Administration (管理)」 > 「Run Administrative Console... (管理コンソールの実行...)」の順に選択します。
- 「Services (サービス)」 > 「Policy sets (ポリシー・セット)」 > 「Application policy sets (アプリケーション・ポリシー・セット)」 > 「WS-Security default (WS-Security デフォルト)」にナビゲートします。
図 47. WS-Security のデフォルト・ポリシー
- 「WS-Security」をクリックします。
図 48. WS-Security のポリシー
- 「Main policy (メイン・ポリシー)」をクリックします。
図 49. メイン・ポリシー
- 「Algorithms for asymmetric tokens (非対称トークンのアルゴリズム)」をクリックし、プロバイダーが Basic128Rsa15 を使用していることを確認します。
図 50. アルゴリズム
- ログアウトして管理コンソールを閉じます。
- Basic128Rsa15 アルゴリズムを使用するために、以下の WS-Policy アサーションを Echo.wsdl に追加します (AsymmetricBinding/Policy 内の Layout アサーションの上に追加)。
リスト 5. サンプル・アプリケーションのアルゴリズム・スイート・ポリシー
<ns2:AlgorithmSuite> <wsp:Policy> <ns2:Basic128Rsa15 /> </wsp:Policy> </ns2:AlgorithmSuite> |
- 変更内容を保存して、無効な WS-Policy エラーが表示されなくなったことを確認してください。
WS-Policy の変更内容をクライアント構成に適用するには、サーバーを再起動する必要があります。アプリケーションが再び実行中になったら、別の同期 Web サービス・リクエストを送信します。すると、今回は成功のレスポンス・メッセージを受信するはずです。コンソール・ログに、WS-Security 構成エラーは表示されなくなります。
- 「Servers (サーバー)」タブで「WebSphere Application Server v7.0.0.17 at localhost (ローカル・ホストの WebSphere Application Server v7.0.0.17)」を右クリックして、「Restart (再開)」を選択します。これにより、キャッシュに入れられた以前の無効な構成は使用されず、クライアント・ポリシー・セット構成が再作成されることが確実になります。
図 51. サーバーの再起動
- http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService?wsdl (例えば、http://localhost:9080/WSSampleSei/EchoService?wsdl) にナビゲートし、WSDL が最新の状態に更新されていること、そして AlgorithmSuite アサーションが含まれていることを確認します。
- http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo (例えば、http://localhost:9080/wssamplesei/demo) にナビゲートします。
- 「Message Type (メッセージ・タイプ)」には「Synchronous Echo (同期エコー出力)」を選択し、「Message String (メッセージ文字列)」に「hello」と入力して、「Send Message (メッセージ送信)」をクリックします。
- レスポンスが正常に返され、文字列「hello」が出力されます。
図 52. 修正後のサンプル・アプリケーション Web サービスの呼び出し
- コンソール・ログにエラーが出力されていないことを確認します。
サンプル・アプリケーションのプロバイダーの WSDL 文書には、無効な WS-Policy が含まれています。クライアントはこの WS-Policy を読み取り、その WS-Policy を使用してクライアント自身の WS-Security 設定を構成するように構成されていたため、Web サービス呼び出しは失敗しました。
この失敗をデバッグするために、コンソールに出力されたログでエラーを調べました。見つかったエラーが示していたのは、クライアント・ポリシー・セットの構成に問題があることです。クライアントは、WS-Policy が無効になるように意図されたプロバイダー・ポリシーを WSDL 文書から読み取って使用するように構成されていました。
Validator for WS-Policy in Eclipse プラグインをインストールして、プロジェクトのすべてのファイルを検証したところ、プロバイダーの WSDL ファイルでのみエラーが発生しました。このエラーが示していたのは、AlgorithmSuite アサーションが欠落していることです。このファイルを開くと、エラー・マーカーも Assymmetric バインディング・アサーションに AlgorithmSuite アサーションが含まれていないことを示していました。
エラーを修正するために、プロバイダーの構成に対応した AlgortithmSuite アサーションを追加しました。このプラグインに付属のドキュメントには、この他の WS-Policy 検証エラーの例とその修正方法が説明されています。
プロバイダーの WSDL 文書に含まれる WS-Policy は 100 行を超える長さがあり、標準の Eclipse バリデーターで、この中に含まれるエラーを特定できるものはありませんでした。さらに、WS-Security ポリシーは非常に複雑であるため、アサーションを手動で検証するとなると、かなりの時間がかかるだけでなく、手動での検証は間違いの元となります。Validator for WS-Policy in Eclipse を使わなかったとしたら、このありきたりなエラーを解決するのに、遥かに多くの作業が必要になっていたことは確かです。
Validator for WS-Policy in Eclipse には、IBM WebSphere Application Server 7.0 に対応する WS-Policy アサーションをすべて網羅するように作成されたスキーマが付属していますが、他の仕様を対象としたユーザー定義のスキーマによって拡張することもできます。例えば、別のプラットフォームのエンドポイントで使用できるように、WS-Policy アサーションを WSDL に含めることができます。このセクションでは WS-Eventing 仕様を例に、Validator for WS-Policy in Eclipse で使用する独自のスキーマを作成する方法を説明します。
WS-Eventing は、Web サービスが別の Web サービスやアプリケーションで発生するイベントへの関心を登録する方法に関する仕様です。この仕様では、サービスがイベントに関するサブスクリプションを管理するために使用できるサブスクリプション・マネージャーを規定しています。WS-Eventing をサポートすることを示すには、2 つの WS-Policy アサーションを指定します。1 つは、ある特定のサービスがサブスクリプションの作成リクエストを受け付けることを示す EventSource アサーション、もう 1 つは、そのサービスが他のサービスに代わってサブスクリプションの管理をサポートすることを示す SubscriptionManager アサーションです。この 2 つのアサーションは比較的単純な構造なので、スキーマの作成方法を説明するには適当な例となります。バリデーター用のスキーマ・ファイルのフォーマットはすでに作成されているため、正式な仕様に基づいてスキーマ・ファイルを作成するのは簡単なタスクです。したがって、フォーマットは主に WS-Security Policy などの OASIS 仕様で使用される構文規則に基づきます。ただし、バリデーターには、構文情報にさらに追加しなければならないメタデーターがあり、その構造にはいくつかの制約が課せられます。スキーマ・ファイルは複数のセクションに分かれていて、各セクションは角括弧で囲まれた見出しで始まります。
スキーマ・ファイルには、まず始めに、仕様に関連付けられた XML 名前空間に関する 2 つのセクションがあります。最初のセクションは、[Namespaces] です。このセクションには、スキーマで使用する名前空間接頭辞とそれぞれに対応する修飾名前空間を記載します。これは、基本的な XML 文書の xmlns 属性と似ていますが、xmlns とは異なる点として、使用するすべての名前空間を宣言し、スキーマの他の部分ではその名前空間を接頭辞で参照しなければならないことに注意してください。完全修飾アサーションの使用はサポートされていません。WS-Eventing の場合、ここで取り上げる名前空間は、この仕様のセクション 3.5 に記載されている WS-Eventing 名前空間だけです。この名前空間には、wse 接頭辞を使用します。以下に、この最初のセクションのコードを記載します。
リスト 6. スキーマの名前空間セクション
[Namespaces] < wse = "http://www.w3.org/2011/03/ws-evt" > |
仕様がサポートする WS-Policy 仕様のバージョンについても、[PolicyNamespaces] セクションに指定する必要があります。バージョンが指定されていれば、バリデーターはアサーションに組み込まれた WS-Policy が仕様の正しいバージョンを使用していることを確認して、WS-Policy アサーションの属性 (WS-Policy の 1.2 と 1.5 とでは異なります) に適切な検証を適用することができます。WS-Eventing 仕様で取り上げているのは WS-Policy 1.5 だけなので、このセクションのコードは以下のようになります。
リスト 7. スキーマの PolicyNamespace セクション
[PolicyNamespaces] < "http://www.w3.org/ns/ws-policy" > |
スキーマの残りの部分は、アサーション自体に関係します。最上位レベルのアサーションは、それぞれに個別の [Syntax]
セクションに記述します。これらのセクションの構文は、Web サービス仕様で使用されている構文と非常によく似ているため、通常は Web
サービス仕様の構文を難なく流用することができます。アサーションのフラグメントが複数の最上位レベルのアサーションで繰り返される仕様の場合、そのフラグメントを [Referenced] セクションに含めることもできますが、WS-Eventing 仕様では、その必要はありません。
EventSource アサーションの [Syntax]
セクションを作成するには、まず、仕様のセクション 9.1 に記載されている構文をコピーします。以下に、その構文を再現します。
リスト 8. 仕様に規定されている EventSource アサーションの構文
<wse:EventSource ...>
<wse:FilterDialect URI="xs:anyURI" ...>
xs:any*
</wse:FilterDialect> *
<wse:FormatName URI="xs:anyURI" ...>
xs:any*
</wse:FormatName> *
<wse:DateTimeSupported .../> ?
<wse:Expires min="xs:duration"? max="xs:duration"?.../> ?
<wse:EndToSupported .../> ?
<wse:NotificationPolicy ...>
xs:any
</wse:NotificationPolicy> ?
xs:any*
</wse:EventSource>
|
次に、構文をバリデーターがサポートするスキーマ・フォーマットに適合させるために、以下の変更を加えます。
<wse:EventSource ...>の後にカーディナリティー・インジケーター ? を追加して、最上位レベルのアサーションをポリシーに含める必要はないことを示します。このように変更しなければ、バリデーターは検証するすべてのポリシーに、このアサーションがあることを期待するためです。<wse:FilterDialect>、<wse:FormatName>および<wse:NotificationPolicy>のカーディナリティー・インジケーターが、終了タグではなく、開始タグの後に続くように移動します。- タグの本体から
xs:any*を削除します。仕様に記載されている説明を読むと、xs:any* は要素の拡張性を示すためのものであることがわかるので、代わりに省略記号 ... に置き換えます。 Expiresアサーションの属性タイプとして指定されているxs:durationは、バリデーターでサポートしていないため、タイプを置き換えます。これに代わるタイプとしては、xs:unsignedLongが適切です。
以上の変更を行うと、コードは以下のようになります。
リスト 9. スキーマに組み込むために変更した EventSource アサーションの構文
[Syntax] <wse:EventSource ...>? <wse:FilterDialect URI="xs:anyURI" ...>* ... </wse:FilterDialect> <wse:FormatName URI="xs:anyURI" ...>* ... </wse:FormatName> <wse:DateTimeSupported .../> ? <wse:Expires min="xs:unsignedLong"? max="xs:unsignedLong"?.../> ? <wse:EndToSupported .../> ? <wse:NotificationPolicy ...> ? ... </wse:NotificationPolicy> ... </wse:EventSource> |
SubscriptionManager アサーションにも [Syntax] セクションを作成する必要があります。それには、上記とまったく同じ規則を適用して作成します。通常、これらの規則は、この形で構文の詳細を指定するスキーマに適用することができます。これで、スキーマは完成しました。完全なファイルはこの記事にダウンロードとして提供されています。
WS-Eventing のスキーマを作成し終わったら、Validator for WS-Policy in Eclipse がインストールされたIBM Rational Application Developer を使用して、このスキーマのテストを行います。デフォルトでは、バリデーターは Eclipse プラグインの JAR ファイルに含まれるスキーマ・ファイルを使用します。独自に作成したスキーマ・ファイルを使用するためには、以下の手順に従って、これらのスキーマ・ファイルの読み取り先となるディレクトリーを指すようにバリデーターを構成する必要があります。
- 「Window (ウィンドウ)」 > 「Preferences (設定)」の順に選択します。
- リストから「WS-Policy Validator (WS-Policy バリデーター)」を選択します。
- 設定ページで「Browse (参照)」ボタンをクリックし、ディレクトリーを選択します。ディレクトリーを選択すると、バリデーターはそのディレクトリー内にある .schema 拡張子のファイルをすべて読み取ることになります。このフィールドを空にすると、バリデーターは再びデフォルトのロケーションを使用します。
- 独自のスキーマをバリデーターに付属のスキーマに追加したい場合には、新しく構成したディレクトリーに、バリデーターと一緒に配布されている .schema ファイルをコピーします。これらのファイルは、プラグインの JAR ファイルに含まれるスキーマ・フォルダーから取得することができます。
- IBM Rational Application Developer を再起動して変更内容を適用します。
図 53. バリデーターで使用するスキーマ・ディレクトリーの構成
続いて、検証する WS-Policy を作成します。
- 「Resource (リソース)」パースペクティブに切り替えます。
- 「File (ファイル)」 > 「New… (新規…)」 > 「Project (プロジェクト)」の順に選択します。
- 「New Project (新規プロジェクト)」ダイアログで「General (一般)」 > 「Project (プロジェクト)」の順に選択し、「Next (次へ)」をクリックします。
- プロジェクト名を入力して、「Finish (完了)」をクリックします。
- 「File (ファイル)」 > 「New… (新規…)」 > 「File (ファイル)」の順に選択します。
- 前の手順で作成したプロジェクトを選択し、適切なファイル名 (例えば、policy.xml) を入力します。
- ファイルにポリシーを追加します。以下のポリシーを追加すれば十分なはずです。
リスト 10. スキーマをテストするための基本的なポリシー
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wse="http://www.w3.org/2011/03/ws-evt" xmlns:test="http://www.ibm.com/websphere/policy/blueop/testing"> <wse:EventSource ...> <wse:FormatName URI="..."> <mex:Location Type="wsdl:definitions" URI="http://example.com/Notif_WSDL_Metadata" /> </wse:FormatName> </wse:EventSource> </wsp:Policy> |
スキーマが正しければ検証エラーは発生しないはずですが、mex:Location 要素に関する警告が表示されます。この要素は、スキーマに含まれていないためです。
図 54. WS-Eventing アサーションの正しい検証
検証が機能していることを確認するために、2 つの DateTimeSupported 要素を挿入してポリシーを無効にします。これにより、2 つの要素のうちのどちらかでエラーが発生します。
図 55. DateTimeSupported アサーションの重複による検証エラー
期待する検証結果にならない場合は、Eclipse エラー・ログを確認してください (「Window (ウィンドウ)」 > 「Show View (ビューの表示)」 > 「General (一般)」 > 「Error Log (エラー・ログ)」の順に選択します)。スキーマ・パーサーが生成する例外は、問題のトラブルシューティングに役立ちます。例えば、xs:Duration 属性タイプを変更し忘れたとすると、以下の例外が発生します。
com.ibm.alphaworks.wspolicy.validator.SchemaParsingException:
Unrecognised attribute key: duration
図 56. スキーマ・パーサーによって生成された例外
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Sample Policy Set | WSSecurity_default.zip | 2KB | HTTP |
| Sample Application | InvalidPolicy.ear | 598KB | HTTP |
- Validator
for WS-Policy in Eclipse グループにアクセスして、このソフトウェアをダウンロードしてください。
- Validator for WS-Policy in
Eclipse 仕様の詳細を学んでください。

Matthew Wilson は IBM Hursley に勤めるソフトウェア・エンジニアで、CICS Transaction Server の Architecture Enhancements 開発チームで働いています。彼は、サウサンプトン大学で分散システムおよびネットワークを専攻してコンピューター・サイエンスの工学修士号を取得し、卒業後、2008年に IBM に入社しました。彼は、Hursley Blue Opportunity プロジェクトの 1 つとして Validator for WS-Policy in Eclipse を開発した一員です。

Katherine Sanders は、英国ハーズリーにある IBM Software Group の EMEA Laboratory Services に勤務するコンサルタントです。以前は、WS-Addressing、WS-ReliableMessaging、および WS-Notification を重点的に、WebSphere Application Server の Web サービス機能の開発およびテストに取り組んでいました。彼女はノッティンガム大学でコンピューター・サイエンスの理学士号を取得しました。彼女は、Hursley Blue Opportunity プロジェクトの 1 つとして Validator for WS-Policy in Eclipse を開発した一員です。