66 | | // TODO APIリスト |
---|
| 76 | // PLAN [ns] エラーが発生しても再起動せずに反映できるようにしたい。 |
---|
| 77 | /** |
---|
| 78 | * SOAPClient オブジェクト。<br/> |
---|
| 79 | * |
---|
| 80 | * <h2><a name='summary'>概要</a></h2> |
---|
| 81 | * このオブジェクトは、SOAP/WSDLベースのWebサービスを呼び出すためのオブジェクトです。<br/> |
---|
| 82 | * このオブジェクトを利用することにより、XMLやJavaを意識することなく、Webサービスを呼び出すことが可能です。<br/> |
---|
| 83 | * <br/> |
---|
| 84 | * SOAPClientオブジェクトを利用したWebサービスの呼び出しは、以下の3ステップで実現できます。<br/> |
---|
| 85 | * <br/> |
---|
| 86 | * ●ステップ1 : WSDLを指定して SOAPClientオブジェクトのインスタンスを生成 ・・・ <a href="#APIListStart">「コンストラクタ」</a>参照<br/> |
---|
| 87 | * ●ステップ2 : Webサービスを呼び出すソースコードのサンプルを表示 ・・・ <a href="#getSampleCodeString">「getSampleCode() 関数」</a>参照<br/> |
---|
| 88 | * ●ステップ3 : Webサービスの呼び出し (ステップ2で出力されたコードをカスタマイズ)<br/> |
---|
| 89 | * <br/> |
---|
| 90 | * |
---|
| 91 | * 具体的なWebサービス実行方法は、<a href="#sampleCode">サンプルコード</a> 参照してください。<br/> |
---|
| 92 | * <br/> |
---|
| 93 | * なお、Webサービスの結果がSOAPフォルトとして返却された場合、{@link SOAPFault} オブジェクトが例外としてスローされます。<br/> |
---|
| 94 | * {@link SOAPFault} オブジェクトを捕捉する(=Webサービス・オペレーションの実行ロジック部分をtry/catchで囲む)ことで、 |
---|
| 95 | * {@link SOAPFault} オブジェクトを利用したエラー処理を行う事が可能です。<br/> |
---|
| 96 | * |
---|
| 97 | * <br/> |
---|
| 98 | * |
---|
| 99 | * <h2>注意事項</h2> |
---|
| 100 | * <ul> |
---|
| 101 | * <li>SOAPClientオブジェクトは、データバインディング方式に「ADB」を利用したAxis2のスタブを利用しています。 |
---|
| 102 | * そのため、Axis2が対応していないWebサービスを呼び出すことはできません。</li> |
---|
| 103 | * <li>SOAPClientオブジェクトは、document-literal スタイルの Web サービスに対応しています。</li> |
---|
| 104 | * <li>SOAPClientは、非同期型コールバック形式のWebサービスを実行することはできません。</li> |
---|
| 105 | * </ul> |
---|
| 106 | * |
---|
| 107 | * <br/> |
---|
| 108 | * |
---|
| 109 | * <h2><a name='setting'>設定</a></h2> |
---|
| 110 | * Application Runtime上の conf/imart.xml にて、SOAPClientオブジェクトの各種設定が可能です。<br/> |
---|
| 111 | * imart.xml の intra-mart/platform/service/application/jssp タグに以下の設定が可能です。 |
---|
| 112 | * |
---|
| 113 | * <table border="1"> |
---|
| 114 | * <tr> |
---|
| 115 | * <th>設定項目</th> |
---|
| 116 | * <th>概要</th> |
---|
| 117 | * <th>初期値</th> |
---|
| 118 | * </tr> |
---|
| 119 | * <tr> |
---|
| 120 | * <td>soap-client/mode</td> |
---|
| 121 | * <td> |
---|
| 122 | * SOAPClientのインスタンス生成時に行われるWebサービスのスタブ生成 |
---|
| 123 | * (=WSDLの解析、Javaスタブ・ソースの生成&コンパイル、および、JavaScriptソースの生成)に関する設定です。 |
---|
| 124 | * 以下の3つの設定が可能です。 |
---|
| 125 | * <ul> |
---|
| 126 | * <li> |
---|
| 127 | * Everytime: |
---|
| 128 | * Webサービスのスタブを毎回作成します。開発時に利用する設定です。 |
---|
| 129 | * </li> |
---|
| 130 | * <br/> |
---|
| 131 | * <li> |
---|
| 132 | * Once: |
---|
| 133 | * Webサービスのスタブが存在しない場合のみスタブを作成します。 |
---|
| 134 | * </li> |
---|
| 135 | * <br/> |
---|
| 136 | * <li> |
---|
| 137 | * Never: |
---|
| 138 | * Webサービスのスタブを自動生成しません。このモードの場合、別途、Webサービスのスタブを配備する必要があります。 |
---|
| 139 | * 具体的には、Axis2が生成するJavaのスタブ・クラスをクラスパスに追加し、 |
---|
| 140 | * SOAPClientオブジェクトで生成されたJavaScriptのスタブ・ソースを |
---|
| 141 | * ソースディレクトリ(通常は%IM_HOME%/pages/src/)に追加する必要があります。 |
---|
| 142 | * </li> |
---|
| 143 | * </ul> |
---|
| 144 | * </td> |
---|
| 145 | * <td>Once</td> |
---|
| 146 | * </tr> |
---|
| 147 | * <tr> |
---|
| 148 | * <td>soap-client/work-dir</td> |
---|
| 149 | * <td> |
---|
| 150 | * Webサービスのスタブ、および、WSDLファイルを展開するディレクトリです。 |
---|
| 151 | * Application Runtimeがインストールされているディレクトリからの相対パスで指定します。 |
---|
| 152 | * </td> |
---|
| 153 | * <td>ファンクションコンテナの自動コンパイル時のクラスファイル出力先ディレクトリ</td> |
---|
| 154 | * </tr> |
---|
| 155 | * <tr> |
---|
| 156 | * <td>soap-client/javac-encoding</td> |
---|
| 157 | * <td> |
---|
| 158 | * Webサービスのスタブをコンパイルする際のJavaソースの文字コード |
---|
| 159 | * </td> |
---|
| 160 | * <td>UTF-8</td> |
---|
| 161 | * </tr> |
---|
| 162 | * <tr> |
---|
| 163 | * <td>soap-client/javac-verbose</td> |
---|
| 164 | * <td> |
---|
| 165 | * Webサービスのスタブをコンパイルする際の詳細情報出力可否設定です。<br/> |
---|
| 166 | * trueの場合、詳細情報が出力され、falseの場合詳細情報は出力されません。 |
---|
| 167 | * </td> |
---|
| 168 | * <td>false</td> |
---|
| 169 | * </tr> |
---|
| 170 | * <tr> |
---|
| 171 | * <td>soap-client/wsdl/storage/import-location/suffixes/suffix</td> |
---|
| 172 | * <td> |
---|
| 173 | * スタブ生成に必要なファイルの拡張子を設定します。 |
---|
| 174 | * Storage Service上に保存されているWSDLファイルを利用する際に必要な設定です。 |
---|
| 175 | * 例えば、あるWSDLファイルで参照している要素が、別のファイルで定義されている場合、その定義ファイルの拡張子をここに設定します。 |
---|
| 176 | * </td> |
---|
| 177 | * <td>「.xsd」と「.wsdl」</td> |
---|
| 178 | * </tr> |
---|
| 179 | * <tr> |
---|
| 180 | * <td>soap-client/wsdl/storage/import-location/sub-dirs/sub-dir</td> |
---|
| 181 | * <td> |
---|
| 182 | * スタブ生成に必要なファイルが格納されているディレクトリ名の設定です。 |
---|
| 183 | * Storage Service上に保存されているWSDLファイルを利用する際に必要な設定です。 |
---|
| 184 | * 例えば、あるWSDLファイルで参照している要素が、別のファイルで定義されている場合、 |
---|
| 185 | * そのファイルが保存されているディレクトリ名をここに設定します。 |
---|
| 186 | * WSDLファイルが保存されているディレクトリのサブディレクトリ名として利用されます。 |
---|
| 187 | * </td> |
---|
| 188 | * <td>「xsd」</td> |
---|
| 189 | * </tr> |
---|
| 190 | * </table> |
---|
| 191 | * |
---|
| 192 | * <br/> |
---|
| 193 | * |
---|
| 194 | * <h2><a name='sampleCode'>サンプルコード</a></h2> |
---|
| 195 | * <table border="1"> |
---|
| 196 | * <tr> |
---|
| 197 | * <th> |
---|
| 198 | * サンプル |
---|
| 199 | * </th> |
---|
| 200 | * </tr> |
---|
| 201 | * <tr> |
---|
| 202 | * <td> |
---|
| 203 | * <font size="-1.5"> |
---|
| 204 | <pre> |
---|
| 205 | 1: var wsdlFileURL = "http://localhost:8080/imart/services/SampleMemberInfoOperatorService?wsdl"; |
---|
| 206 | 2: |
---|
| 207 | 3: var wsUserID = "ueda"; |
---|
| 208 | 4: var wsPassword = "ueda"; |
---|
| 209 | 5: var wsLoginGroupID = "default"; |
---|
| 210 | 6: |
---|
| 211 | 7: /** |
---|
| 212 | 8: * SOAPClientオブジェクトを利用してWebサービスを呼び出すサンプルです。 |
---|
| 213 | 9: */ |
---|
| 214 | 10: function init(args){ |
---|
| 215 | 11: add(); |
---|
| 216 | 12: findAll(); |
---|
| 217 | 13: } |
---|
| 218 | 14: |
---|
| 219 | 15: /** |
---|
| 220 | 16: * メンバー情報を追加します。 |
---|
| 221 | 17: */ |
---|
| 222 | 18: function add(){ |
---|
| 223 | 19: |
---|
| 224 | 20: //************************************************************** |
---|
| 225 | 21: // ステップ1:WSDLを指定して SOAPClientオブジェクト のインスタンスを生成 |
---|
| 226 | 22: //************************************************************** |
---|
| 227 | 23: try { |
---|
| 228 | 24: var soapClient = new SOAPClient(wsdlFileURL); |
---|
| 229 | 25: Debug.print("ステップ1 完了"); |
---|
| 230 | 26: } |
---|
| 231 | 27: catch(ex) { |
---|
| 232 | 28: Debug.browse("エラーが発生しました。", ex); |
---|
| 233 | 29: } |
---|
| 234 | 30: |
---|
| 235 | 31: |
---|
| 236 | 32: //************************************************************** |
---|
| 237 | 33: // ステップ2:Webサービスを呼び出すソースコードのサンプルを表示 |
---|
| 238 | 34: //************************************************************** |
---|
| 239 | 35: var sampleCode = soapClient.getSampleCode("add"); |
---|
| 240 | 36: var msg = "ステップ2 完了。" + "\n"; |
---|
| 241 | 37: msg += "Webサービスを呼び出すソースコードのサンプルが表示されました。" + "\n"; |
---|
| 242 | 38: msg += "pages/src/sample/web_service/client/member_info_operator_client.jsの35, 40行目を" + "\n"; |
---|
| 243 | 39: msg += "コメントアウトしてステップ3を実行してください"; |
---|
| 244 | 40: Debug.browse(msg, sampleCode); |
---|
| 245 | 41: |
---|
| 246 | 42: |
---|
| 247 | 43: //************************************************************** |
---|
| 248 | 44: // ステップ3: Webサービスの呼び出し (ステップ2で出力された内容をカスタマイズ) |
---|
| 249 | 45: //************************************************************** |
---|
| 250 | 46: // ↓↓↓↓ コピー&ペースト (ここから) ↓↓↓↓ |
---|
| 251 | 47: //------------------------------- |
---|
| 252 | 48: // Sample Data : 'wsUserInfo' |
---|
| 253 | 49: //------------------------------- |
---|
| 254 | 50: var wsUserInfo = |
---|
| 255 | 51: /* Object <WSUserInfo> */ |
---|
| 256 | 52: { |
---|
| 257 | 53: /* String */ |
---|
| 258 | 54: "password" : WSAuthDigestGenerator4WSSE.getDigest(wsUserID, wsPassword) , |
---|
| 259 | 55: |
---|
| 260 | 56: /* String */ |
---|
| 261 | 57: "authType" : WSAuthDigestGenerator4WSSE.getAuthType(), |
---|
| 262 | 58: |
---|
| 263 | 59: /* String */ |
---|
| 264 | 60: "userID" : wsUserID, |
---|
| 265 | 61: |
---|
| 266 | 62: /* String */ |
---|
| 267 | 63: "loginGroupID" : wsLoginGroupID |
---|
| 268 | 64: }; |
---|
| 269 | 65: |
---|
| 270 | 66: //------------------------------- |
---|
| 271 | 67: // Sample Data : 'member' |
---|
| 272 | 68: //------------------------------- |
---|
| 273 | 69: var member = |
---|
| 274 | 70: /* Object <Member> */ |
---|
| 275 | 71: { |
---|
| 276 | 72: /* Boolean */ |
---|
| 277 | 73: "married" : true, |
---|
| 278 | 74: |
---|
| 279 | 75: /* Number */ |
---|
| 280 | 76: "age" : 123, |
---|
| 281 | 77: |
---|
| 282 | 78: /* String */ |
---|
| 283 | 79: "name" : "prop_name", |
---|
| 284 | 80: |
---|
| 285 | 81: /* String */ |
---|
| 286 | 82: "id" : "prop_id", |
---|
| 287 | 83: |
---|
| 288 | 84: /* Array <Member[]> */ |
---|
| 289 | 85: "children" : [ |
---|
| 290 | 86: |
---|
| 291 | 87: ], |
---|
| 292 | 88: |
---|
| 293 | 89: /* Date (Thu Jun 19 2008 12:34:56 GMT+0900 (JST)) */ |
---|
| 294 | 90: "birthDate" : new Date(1213846496000) |
---|
| 295 | 91: }; |
---|
| 296 | 92: // ↑↑↑↑ コピー&ペースト (ここまで) ↑↑↑↑ |
---|
| 297 | 93: |
---|
| 298 | 94: |
---|
| 299 | 95: //------------------------------- |
---|
| 300 | 96: // Webサービスの呼び出し |
---|
| 301 | 97: //------------------------------- |
---|
| 302 | 98: try{ |
---|
| 303 | 99: var result = soapClient.add(wsUserInfo, member); |
---|
| 304 | 100: } |
---|
| 305 | 101: catch(soapFault){ |
---|
| 306 | 102: Debug.browse("エラーが発生しました。", soapFault); |
---|
| 307 | 103: } |
---|
| 308 | 104: |
---|
| 309 | 105: Debug.browse("ステップ3 完了", |
---|
| 310 | 106: "追加しました。", |
---|
| 311 | 107: "結果:" + result); |
---|
| 312 | 108: } |
---|
| 313 | </pre> |
---|
| 314 | * </font> |
---|
| 315 | * </td> |
---|
| 316 | * </tr> |
---|
| 317 | * </table> |
---|
| 318 | * |
---|
| 319 | * <br/> |
---|
| 320 | * |
---|
| 321 | * <a name="APIListStart"/> |
---|
| 322 | * |
---|
| 323 | * @scope public |
---|
| 324 | * @name SOAPClient |
---|
| 325 | * @since 7.0 |
---|
| 326 | */ |
---|
92 | | |
---|
93 | | |
---|
| 361 | |
---|
| 362 | /** |
---|
| 363 | * WSDLを URL文字列 で指定するコンストラクタ。<br/> |
---|
| 364 | * <br/> |
---|
| 365 | * SOAPClientは、インスタンス生成時に以下の処理を行います。 |
---|
| 366 | * <ol> |
---|
| 367 | * <li>WSDLの解析</li> |
---|
| 368 | * <li>Webサービス・クライアントとなるJavaスタブ・クラスのソース生成</li> |
---|
| 369 | * <li>Javaスタブ・クラスのコンパイル</li> |
---|
| 370 | * <li>Javaスタブ・クラスを呼び出すJavaScriptソースの生成</li> |
---|
| 371 | * </ol> |
---|
| 372 | * |
---|
| 373 | * 上記で示した一連の処理は、インスタンス生成時に一度だけ行われます。<br/> |
---|
| 374 | * 2回目以降のインスタンス生成では上記処理が省略され、1回目に作成されたスタブが利用されます。<br/> |
---|
| 375 | * なお、この動作は、初期設定時の動作です。設定を変更する方法は <a href="#setting">こちら</a> を参照してください。<br/> |
---|
| 376 | * <br/> |
---|
| 377 | * WSDL内に複数のWebサービスが定義されている場合は、第2引数「serviceName」に実行したいWebサービス名を指定します。<br/> |
---|
| 378 | * <br/> |
---|
| 379 | * WSDLのポート要素を指定したい場合は、第3引数「portName」に利用したいポート名を指定します。<br/> |
---|
| 380 | * <br/> |
---|
| 381 | * WSDL内に定義されているエンドポイントとは異なるエンドポイントを利用する場合は、第4引数「endpoint」に指定してください。<br/> |
---|
| 382 | * serviceNameやportNameを指定しない場合は、以下のようにエンドポイントを設定してください。 |
---|
| 383 | * |
---|
| 384 | * <table border="1"> |
---|
| 385 | * <tr><td> |
---|
| 386 | * <font size="-1.5"><pre> |
---|
| 387 | * var <font color="blue">wsdlUrl</font> = "http://localhost:8080/imart/services/SampleMemberInfoOperatorService?wsdl"; |
---|
| 388 | * var <font color="red">endpoint</font> = "http://localhost:9999/imart/services/SampleMemberInfoOperatorService"; |
---|
| 389 | * var soapClient = new SOAPClient(<font color="blue">wsdlUrl</font>, null, null, <font color="red">endpoint</font>);</pre></font> |
---|
| 390 | * </td></tr> |
---|
| 391 | * </table> |
---|
| 392 | * |
---|
| 393 | * <br/> |
---|
| 394 | * なお、WSDLファイルは、<b>Storage Service</b>上に存在するWSDLファイルを利用することも可能です。 |
---|
| 395 | * 詳しくは、<a href="#SOAPClientVirtualFileStringStringString">WSDLを VirtualFile オブジェクトで指定するコンストラクタ</a> |
---|
| 396 | * を参照してください。 |
---|
| 397 | * <br/> |
---|
| 398 | * |
---|
| 399 | * @scope public |
---|
| 400 | * |
---|
| 401 | * @param wsdlUrl String WSDLを示すURL |
---|
| 402 | * @param serviceName ?String Webサービス名 (WSDL内に複数のWebサービスが定義されている場合は必須) |
---|
| 403 | * @param portName ?String Webサービスのポート名 |
---|
| 404 | * @param endpoint ?String エンドポイントのURL |
---|
| 405 | */ |
---|
| 406 | public static Object jsConst_SOAPClient(String dummy1){ |
---|
| 407 | // 複数コンストラクタ用ダミー |
---|
| 408 | return null; |
---|
| 409 | } |
---|
| 410 | |
---|
| 411 | /** |
---|
| 412 | * WSDLを {@link File} オブジェクトで指定するコンストラクタ。<br/> |
---|
| 413 | * <br/> |
---|
| 414 | * このコンストラクタを利用すると、Application Runtime上に保存されているWSDLファイルを利用することが可能です。<br/> |
---|
| 415 | * 第1引数に、WSDLファイルを指し示している File オブジェクトを指定してください。 |
---|
| 416 | * |
---|
| 417 | * そのほかの動作は、<a href="#SOAPClientStringStringStringString">「WSDLをURLで指定するコンストラクタ」</a>と同等です。 |
---|
| 418 | * |
---|
| 419 | * @scope public |
---|
| 420 | * |
---|
| 421 | * @param wsdlOnAppRuntime File WSDLを示すFileオブジェクト |
---|
| 422 | * @param serviceName ?String Webサービス名 (WSDL内に複数のWebサービスが定義されている場合は必須) |
---|
| 423 | * @param portName ?String Webサービスのポート名 |
---|
| 424 | * @param endpoint ?String エンドポイントのURL |
---|
| 425 | */ |
---|
| 426 | public static Object jsConst_SOAPClient(String dummy1, String dummy2){ |
---|
| 427 | // 複数コンストラクタ用ダミー |
---|
| 428 | return null; |
---|
| 429 | } |
---|
| 430 | |
---|
| 431 | /** |
---|
| 432 | * WSDLを {@link VirtualFile} オブジェクトで指定するコンストラクタ。<br/> |
---|
| 433 | * <br/> |
---|
| 434 | * このコンストラクタを利用すると、Storage Service 上に保存されているWSDLファイルを利用することが可能です。<br/> |
---|
| 435 | * 第1引数に、WSDLファイルを指し示している VirtualFile オブジェクトを指定してください。<br/> |
---|
| 436 | * <br/> |
---|
| 437 | * なお、WSDLファイルの解析時に、別のWSDLファイル や 別のXMLスキーマファイル |
---|
| 438 | * (以降、「XSDファイル」と呼ぶ)が必要な場合は、 |
---|
| 439 | * コンストラクタに指定したWSDLファイルと同じディレクトリ(または、設定可能なサブディレクトリ)にそれらのファイルを保存してください。<br/> |
---|
| 440 | * <br/> |
---|
| 441 | * 上記は、SOAPメッセージの送受信時に使われる要素が、指定したWSDLファイル内ではなく、 |
---|
| 442 | * 別のXSDファイルで定義されている場合が当てはまります。<br/> |
---|
| 443 | * <br/> |
---|
| 444 | * WSDLファイルの解析時に必要なファイルの拡張子や、必要なファイルが格納されているディレクトリ名の設定方法は、 |
---|
| 445 | * <a href="#setting">こちら</a> を参照してください。<br/> |
---|
| 446 | * <br/> |
---|
| 447 | * そのほかの動作は、<a href="#SOAPClientStringStringStringString">「WSDLをURLで指定するコンストラクタ」</a>と同等です。 |
---|
| 448 | * |
---|
| 449 | * @scope public |
---|
| 450 | * |
---|
| 451 | * @param wsdlOnStorage VirtualFile WSDLを示す VirtualFile オブジェクト |
---|
| 452 | * @param serviceName ?String Webサービス名 (WSDL内に複数のWebサービスが定義されている場合は必須) |
---|
| 453 | * @param portName ?String Webサービスのポート名 |
---|
| 454 | * @param endpoint ?String エンドポイントのURL |
---|
| 455 | */ |
---|
| 456 | public static Object jsConst_SOAPClient(String dummy1, String dummy2, String dummy3){ |
---|
| 457 | // 複数コンストラクタ用ダミー |
---|
| 458 | return null; |
---|
| 459 | } |
---|
| 460 | |
---|
| 461 | |
---|
107 | | |
---|
108 | | if(args.length > 1 && args[1] != null){ |
---|
109 | | targetEndpoint = Context.toString(args[1]); |
---|
110 | | } |
---|
111 | | if(args.length > 2 && args[2] != null){ |
---|
112 | | portName = Context.toString(args[2]); |
---|
113 | | } |
---|
114 | | if(args.length > 3 && args[3] != null){ |
---|
115 | | serviceName = Context.toString(args[3]); |
---|
116 | | } |
---|
117 | | |
---|
118 | | SOAPClientObject instance = new SOAPClientObject(wsdlUri, targetEndpoint, portName, serviceName); |
---|
| 470 | String targetEndpoint = null; |
---|
| 471 | |
---|
| 472 | int idx = 0; |
---|
| 473 | if(args.length > idx && args[idx] != null){ |
---|
| 474 | wsdlUri = getURI4WSDL(args[idx]); |
---|
| 475 | } |
---|
| 476 | else{ |
---|
| 477 | throw new IllegalArgumentException("Please set one or more arguments."); |
---|
| 478 | } |
---|
| 479 | |
---|
| 480 | idx = 1; |
---|
| 481 | if(args.length > idx && args[idx] != null){ |
---|
| 482 | if(!(args[idx] instanceof Undefined) && Context.toString(args[idx]).length() != 0){ |
---|
| 483 | serviceName = Context.toString(args[idx]); |
---|
| 484 | } |
---|
| 485 | } |
---|
| 486 | |
---|
| 487 | idx = 2; |
---|
| 488 | if(args.length > idx && args[idx] != null){ |
---|
| 489 | if(!(args[idx] instanceof Undefined) && Context.toString(args[idx]).length() != 0){ |
---|
| 490 | portName = Context.toString(args[idx]); |
---|
| 491 | } |
---|
| 492 | } |
---|
| 493 | |
---|
| 494 | idx = 3; |
---|
| 495 | if(args.length > idx && args[idx] != null){ |
---|
| 496 | if(!(args[idx] instanceof Undefined) && Context.toString(args[idx]).length() != 0){ |
---|
| 497 | targetEndpoint = Context.toString(args[idx]); |
---|
| 498 | } |
---|
| 499 | } |
---|
| 500 | |
---|
| 501 | SOAPClientObject instance = new SOAPClientObject(wsdlUri, serviceName, portName, targetEndpoint); |
---|
1127 | | // デフォルト値 → 「./lib」 |
---|
1128 | | String axis2Home = "." + File.separator + "lib"; |
---|
1129 | | |
---|
1130 | | if(System.getenv("AXIS2_HOME") != null){ |
---|
1131 | | // 環境変数 |
---|
1132 | | axis2Home = System.getenv("AXIS2_HOME") + File.separator + "lib"; |
---|
1133 | | } |
---|
1134 | | else{ |
---|
1135 | | // WEB-INF/lib 配下のライブラリ |
---|
1136 | | HTTPContext context = HTTPContextManager.getInstance().getCurrentContext(); |
---|
1137 | | if(context != null && context.getServletContext() != null){ |
---|
1138 | | axis2Home = context.getServletContext().getRealPath("/WEB-INF/lib"); |
---|
| 1605 | synchronized (MONITOR_4_classPath4Axis2) { |
---|
| 1606 | |
---|
| 1607 | if(classPath4Axis2 == null){ // ←もう一度チェック |
---|
| 1608 | |
---|
| 1609 | // 環境変数 |
---|
| 1610 | String axis2HomeEnv = System.getenv("AXIS2_HOME"); |
---|
| 1611 | if(axis2HomeEnv != null){ |
---|
| 1612 | String axis2libDir = axis2HomeEnv + File.separator + "lib"; |
---|
| 1613 | classPath4Axis2 = getAxis2ClassPath(axis2libDir); |
---|
| 1614 | } |
---|
| 1615 | |
---|
| 1616 | // WEB-INF/lib 配下のライブラリ |
---|
| 1617 | if(classPath4Axis2 == null){ |
---|
| 1618 | HTTPContext context = HTTPContextManager.getInstance().getCurrentContext(); |
---|
| 1619 | if(context != null && context.getServletContext() != null){ |
---|
| 1620 | String axis2libDir = context.getServletContext().getRealPath("/WEB-INF/lib"); |
---|
| 1621 | classPath4Axis2 = getAxis2ClassPath(axis2libDir); |
---|
| 1622 | } |
---|
| 1623 | } |
---|
| 1624 | |
---|
| 1625 | // デフォルト値 → 「./lib」 |
---|
| 1626 | if(classPath4Axis2 == null){ |
---|
| 1627 | String axis2libDir = "." + File.separator + "lib"; |
---|
| 1628 | classPath4Axis2 = getAxis2ClassPath(axis2libDir); |
---|
| 1629 | } |
---|
| 1630 | |
---|
| 1631 | if(classPath4Axis2 == null){ |
---|
| 1632 | throw new IllegalStateException("Axis2 " + TARGET_AXIS2_VERSION + " library is not found. Please set 'AXIS2_HOME' environment variable."); |
---|
| 1633 | } |
---|
| 1636 | } |
---|
| 1637 | |
---|
| 1638 | return classPath4Axis2; |
---|
| 1639 | } |
---|
| 1640 | private static String classPath4Axis2; // ex-> "/usr/local/axis2/lib/foo.jar:/usr/local/axis2/lib/hoge.jar" |
---|
| 1641 | private static final Object MONITOR_4_classPath4Axis2 = new Object(); |
---|
| 1642 | |
---|
| 1643 | |
---|
| 1644 | /** |
---|
| 1645 | * @param axis2Home |
---|
| 1646 | * @return |
---|
| 1647 | */ |
---|
| 1648 | private String getAxis2ClassPath(String axis2Home) { |
---|
| 1649 | if(axis2Home == null){ |
---|
| 1650 | return null; |
---|
| 1651 | } |
---|
| 1652 | |
---|
| 1653 | String errMessage = ""; |
---|
| 1654 | |
---|
| 1655 | File libDir = new File(axis2Home); |
---|
| 1656 | File[] libFiles = libDir.listFiles(new FilenameFilter() { |
---|
| 1657 | public boolean accept(File dir, String name) { |
---|
| 1658 | return name.endsWith(".jar") || name.endsWith(".zip"); |
---|
| 1659 | } |
---|
| 1660 | }); |
---|
| 1661 | |
---|
| 1662 | String axisVersionRaw = null; |
---|
| 1663 | StringBuilder classpath = new StringBuilder(); |
---|
| 1664 | |
---|
| 1665 | for (File libFile : libFiles) { |
---|
| 1666 | if(libFile.getName().indexOf("axis2-kernel") != -1){ |
---|
| 1667 | Properties msgProp; |
---|
| 1668 | try { |
---|
| 1669 | JarFile jarFile = new JarFile(libFile); |
---|
| 1670 | msgProp = getPropertiesFromJarFile(jarFile, "org/apache/axis2/i18n/resource.properties"); |
---|
| 1671 | axisVersionRaw = msgProp.getProperty("axisVersionRaw"); |
---|
| 1672 | _logger.debug("axisVersionRaw: {}", axisVersionRaw); |
---|
| 1673 | |
---|
| 1674 | if(!TARGET_AXIS2_VERSION.equals(axisVersionRaw)){ |
---|
| 1675 | if(_logger.isDebugEnabled()){ |
---|
| 1676 | errMessage += "SOAPClient needs Apache Axis2 version " + TARGET_AXIS2_VERSION + ". "; |
---|
| 1677 | errMessage += "But you specified Axis2 of version " + axisVersionRaw + "."; |
---|
| 1678 | _logger.debug(errMessage); |
---|
| 1679 | } |
---|
| 1680 | classpath = null; |
---|
| 1681 | break; |
---|
| 1682 | } |
---|
| 1683 | } |
---|
| 1684 | catch (IOException e) { |
---|
| 1685 | _logger.debug(e.getMessage(), e); |
---|
| 1686 | |
---|
| 1687 | classpath = null; |
---|
| 1688 | break; |
---|
| 1689 | } |
---|
| 1690 | } |
---|
| 1691 | |
---|
| 1692 | classpath.append("\"" + libFile.getAbsolutePath() + "\"").append(File.pathSeparator); |
---|
| 1693 | } |
---|
| 1694 | |
---|
| 1695 | if(axisVersionRaw == null){ |
---|
| 1696 | _logger.debug("You must specify Axis2 version {} library directory.", TARGET_AXIS2_VERSION); |
---|
| 1697 | return null; |
---|
| 1698 | } |
---|
| 1699 | else if(classpath == null){ |
---|
| 1700 | return null; |
---|
| 1701 | } |
---|
| 1702 | else{ |
---|
| 1703 | return classpath.toString(); |
---|
| 1704 | } |
---|
| 1705 | } |
---|
1142 | | File libDir = new File(axis2Home); |
---|
1143 | | File[] libFiles = libDir.listFiles(new FilenameFilter() { |
---|
1144 | | public boolean accept(File dir, String name) { |
---|
1145 | | return name.endsWith(".jar") || name.endsWith(".zip"); |
---|
1146 | | } |
---|
1147 | | }); |
---|
1148 | | |
---|
1149 | | if(libFiles == null){ |
---|
1150 | | throw new IllegalStateException("Axis2 library is not found. Please set 'AXIS2_HOME' environment variable."); |
---|
1151 | | } |
---|
1152 | | |
---|
1153 | | StringBuilder classpath = new StringBuilder(); |
---|
1154 | | for (File libFile : libFiles) { |
---|
1155 | | classpath.append("\"" + libFile.getAbsolutePath() + "\"").append(File.pathSeparator); |
---|
1156 | | } |
---|
1157 | | |
---|
1158 | | classPath4Axis2 = classpath.toString(); |
---|
1159 | | } |
---|
1160 | | |
---|
1161 | | return classPath4Axis2; |
---|
1162 | | } |
---|
1163 | | private String classPath4Axis2; // ex-> "/usr/local/axis2/lib/foo.jar:/usr/local/axis2/lib/hoge.jar" |
---|
| 1707 | /** |
---|
| 1708 | * @param jarFile |
---|
| 1709 | * @param resourceName |
---|
| 1710 | * @return |
---|
| 1711 | * @throws IOException |
---|
| 1712 | */ |
---|
| 1713 | private static Properties getPropertiesFromJarFile(JarFile jarFile, String resourceName) throws IOException { |
---|
| 1714 | |
---|
| 1715 | JarEntry jarEntry = jarFile.getJarEntry(resourceName); |
---|
| 1716 | |
---|
| 1717 | InputStream in = jarFile.getInputStream(jarEntry); |
---|
| 1718 | ByteArrayOutputStream out = new ByteArrayOutputStream(); |
---|
| 1719 | try { |
---|
| 1720 | byte[] buf = new byte[1024]; |
---|
| 1721 | |
---|
| 1722 | while (in.available() > 0) { |
---|
| 1723 | int len = in.read(buf); |
---|
| 1724 | out.write(buf, 0, len); |
---|
| 1725 | } |
---|
| 1726 | } |
---|
| 1727 | finally { |
---|
| 1728 | if(out != null) out.flush(); |
---|
| 1729 | if(in != null) in.close(); |
---|
| 1730 | } |
---|
| 1731 | |
---|
| 1732 | byte[] bytes = out.toByteArray(); |
---|
| 1733 | |
---|
| 1734 | Properties properties = new Properties(); |
---|
| 1735 | ByteArrayInputStream bai = new ByteArrayInputStream(bytes); |
---|
| 1736 | |
---|
| 1737 | try{ |
---|
| 1738 | properties.load(bai); |
---|
| 1739 | } |
---|
| 1740 | finally{ |
---|
| 1741 | if(bai != null) bai.close(); |
---|
| 1742 | } |
---|
| 1743 | |
---|
| 1744 | return properties; |
---|
| 1745 | } |
---|
1264 | | XPathExpression expr = xpath.compile(exp.toString()); |
---|
1265 | | Object result = expr.evaluate(doc, XPathConstants.NODESET); |
---|
1266 | | |
---|
1267 | | NodeList nodeList = (NodeList) result; |
---|
1268 | | for (int i = 0; i < nodeList.getLength(); i++) { |
---|
1269 | | Element elem = (Element)nodeList.item(i); |
---|
1270 | | NamedNodeMap namedNodeMap = elem.getAttributes(); |
---|
1271 | | |
---|
1272 | | _logger.trace("{}", namedNodeMap.getNamedItem("name")); |
---|
1273 | | _logger.trace("{}", namedNodeMap.getNamedItem("type")); |
---|
1274 | | _logger.trace("{}", namedNodeMap.getNamedItem("minOccurs")); |
---|
1275 | | _logger.trace("{}", namedNodeMap.getNamedItem("nillable")); |
---|
1276 | | _logger.trace("{}", elem.getNodeName()); |
---|
1277 | | |
---|
1278 | | list.add(namedNodeMap.getNamedItem("name").getNodeValue()); |
---|
1279 | | } |
---|
1280 | | |
---|
1281 | | if(list.size() == 0){ |
---|
1282 | | throw new IllegalStateException("Not found '" + myQName + "' element in WSDL(='" + wsdlUrl + "')."); |
---|
1283 | | } |
---|
1284 | | |
---|
1285 | | return list; |
---|
| 1848 | |
---|
| 1849 | XPathExpression xpathExp = xpath.compile(exp4sequence.toString()); |
---|
| 1850 | Object result4sequence = xpathExp.evaluate(doc, XPathConstants.NODESET); |
---|
| 1851 | |
---|
| 1852 | // ComplexTypeなど、シーケンスが指定された状態で定義されているElement |
---|
| 1853 | if(result4sequence != null){ |
---|
| 1854 | NodeList nodeList4sequence = (NodeList) result4sequence; |
---|
| 1855 | addPropertyNameFromNodeList(propertyNamesList, nodeList4sequence); |
---|
| 1856 | } |
---|
| 1857 | |
---|
| 1858 | // 単独で定義されているElement |
---|
| 1859 | if(propertyNamesList.size() == 0){ |
---|
| 1860 | xpathExp = xpath.compile(exp4standalone.toString()); |
---|
| 1861 | Object result4standalone = xpathExp.evaluate(doc, XPathConstants.NODESET); |
---|
| 1862 | |
---|
| 1863 | if(result4standalone != null){ |
---|
| 1864 | NodeList nodeList4standalone = (NodeList) result4standalone; |
---|
| 1865 | addPropertyNameFromNodeList(propertyNamesList, nodeList4standalone); |
---|
| 1866 | } |
---|
| 1867 | } |
---|
| 1868 | |
---|
| 1869 | // 別ファイルでElementが定義されている場合 |
---|
| 1870 | if(propertyNamesList.size() == 0){ |
---|
| 1871 | propertyNamesList = getPropertyNameListFromBean(operationParamType); |
---|
| 1872 | } |
---|
| 1873 | } |
---|
| 1874 | catch (Exception e){ |
---|
| 1875 | IllegalStateException ise = new IllegalStateException("Not found '" + myQName + "' element in WSDL(='" + wsdlUrl + "').", e); |
---|
| 1876 | _logger.warn(ise.getMessage(), ise); // 警告 |
---|
| 1877 | |
---|
| 1878 | propertyNamesList = getPropertyNameListFromBean(operationParamType); |
---|
1292 | | } |
---|
1293 | | |
---|
| 1885 | |
---|
| 1886 | return propertyNamesList; |
---|
| 1887 | } |
---|
| 1888 | |
---|
| 1889 | private static List<String> getPropertyNameListFromBean(Class<?> beanType) { |
---|
| 1890 | _logger.trace("getPropertyNameListFromBean beanType: {}", beanType); |
---|
| 1891 | |
---|
| 1892 | List<String> list = new ArrayList<String>(); |
---|
| 1893 | |
---|
| 1894 | try { |
---|
| 1895 | Map<String, PropertyDescriptor> map = JavaScriptUtility.getBeanPropertyMap(beanType); |
---|
| 1896 | |
---|
| 1897 | // キーの「自然順序付け」でソート |
---|
| 1898 | // (∵Beanのプロパティ名の取得順は常に決まっている。(Class#getDeclaredMethods()利用) |
---|
| 1899 | // しかし、BeanであるJavaスタブクラスのソース生成方法がプロパティの順序を考慮しているかを保障できないため) |
---|
| 1900 | SortedMap<String, PropertyDescriptor> sortMap = new TreeMap<String, PropertyDescriptor>(map); |
---|
| 1901 | |
---|
| 1902 | Iterator<String> it = sortMap.keySet().iterator(); |
---|
| 1903 | while(it.hasNext()){ |
---|
| 1904 | String propName = it.next(); |
---|
| 1905 | list.add(propName); |
---|
| 1906 | |
---|
| 1907 | _logger.trace("getPropertyNameListFromBean propName: {}", propName); |
---|
| 1908 | } |
---|
| 1909 | } |
---|
| 1910 | catch (IntrospectionException e) { |
---|
| 1911 | throw new IllegalStateException(e); |
---|
| 1912 | } |
---|
| 1913 | |
---|
| 1914 | return list; |
---|
| 1915 | } |
---|
| 1916 | |
---|
| 1917 | /** |
---|
| 1918 | * @param list |
---|
| 1919 | * @param nodeList |
---|
| 1920 | */ |
---|
| 1921 | private static void addPropertyNameFromNodeList(List<String> list, NodeList nodeList) { |
---|
| 1922 | |
---|
| 1923 | for (int i = 0; i < nodeList.getLength(); i++) { |
---|
| 1924 | Element element = (Element)nodeList.item(i); |
---|
| 1925 | NamedNodeMap namedNodeMap = element.getAttributes(); |
---|
| 1926 | |
---|
| 1927 | _logger.trace("--------------[" + i + "]--------------"); |
---|
| 1928 | _logger.trace("{}", namedNodeMap.getNamedItem("name")); |
---|
| 1929 | _logger.trace("{}", namedNodeMap.getNamedItem("ref")); |
---|
| 1930 | _logger.trace("{}", namedNodeMap.getNamedItem("type")); |
---|
| 1931 | _logger.trace("{}", namedNodeMap.getNamedItem("minOccurs")); |
---|
| 1932 | _logger.trace("{}", namedNodeMap.getNamedItem("nillable")); |
---|
| 1933 | _logger.trace("{}", element.getNodeName()); |
---|
| 1934 | |
---|
| 1935 | String propertyName = null; |
---|
| 1936 | |
---|
| 1937 | Node propertyNameNode = namedNodeMap.getNamedItem("name"); |
---|
| 1938 | if(propertyNameNode != null){ |
---|
| 1939 | propertyName = propertyNameNode.getNodeValue(); |
---|
| 1940 | } |
---|
| 1941 | else{ |
---|
| 1942 | propertyNameNode = namedNodeMap.getNamedItem("ref"); |
---|
| 1943 | if(propertyNameNode != null){ |
---|
| 1944 | String nodeValue = propertyNameNode.getNodeValue(); |
---|
| 1945 | int pos = nodeValue.indexOf(":"); |
---|
| 1946 | propertyName = (pos == -1) ? nodeValue : nodeValue.substring(pos + 1); |
---|
| 1947 | } |
---|
| 1948 | else{ |
---|
| 1949 | // 属性「ref」も存在しない場合はエラー |
---|
| 1950 | throw new IllegalStateException("Property name is not defined: " + element); |
---|
| 1951 | } |
---|
| 1952 | } |
---|
| 1953 | |
---|
| 1954 | list.add(propertyName); |
---|
| 1955 | } |
---|
| 1956 | } |
---|
| 1957 | |
---|
| 1958 | /** |
---|
| 1959 | * Webサービスを呼び出すソースコードのサンプルを返却します。<br/> |
---|
| 1960 | * <br/> |
---|
| 1961 | * getSampleCode()の引数にはWebサービス・オペレーション名を指定します。<br/> |
---|
| 1962 | * オペレーション名は <a href="#getOperationNames">getOperationNames()</a> でも取得可能です。<br/> |
---|
| 1963 | * 引数を指定せずに getSampleCode() を実行すると、Webサービス内で利用可能なすべてのオペレーションに関するソースコードが返却されます。<br/> |
---|
| 1964 | * <br/> |
---|
| 1965 | * getSampleCode()関数の目的はサンプルコードの表示です。<br/> |
---|
| 1966 | * したがって、getSampleCode()関数の実行ロジックは、Webサービスを呼び出すコードの作成完了後に削除してください。<br/> |
---|
| 1967 | * <br/> |
---|
| 1968 | * 以下に、getSampleCode()関数で生成される、Webサービスを呼び出すソースコードのサンプルを示します。<br/> |
---|
| 1969 | * |
---|
| 1970 | * <table border="1"> |
---|
| 1971 | * <tr> |
---|
| 1972 | * <th> |
---|
| 1973 | * Webサービスを呼び出すソースコードのサンプル |
---|
| 1974 | * </th> |
---|
| 1975 | * </tr> |
---|
| 1976 | * <tr> |
---|
| 1977 | * <td> |
---|
| 1978 | * <font size="-1.5"> |
---|
| 1979 | <pre> |
---|
| 1980 | 1: ************************************************************ |
---|
| 1981 | 2: Usage: |
---|
| 1982 | 3: var result = soapClient.add(wsUserInfo, member); |
---|
| 1983 | 4: |
---|
| 1984 | 5: //------------------------------- |
---|
| 1985 | 6: // Sample Data : 'wsUserInfo' |
---|
| 1986 | 7: //------------------------------- |
---|
| 1987 | 8: var wsUserInfo = |
---|
| 1988 | 9: /* Object <b><<font color="red">WSUserInfo</font>></b> */ |
---|
| 1989 | 10: { |
---|
| 1990 | 11: /* String */ |
---|
| 1991 | 12: "password" : "prop_password", |
---|
| 1992 | 13: |
---|
| 1993 | 14: /* String */ |
---|
| 1994 | 15: "authType" : "prop_authType", |
---|
| 1995 | 16: |
---|
| 1996 | 17: /* String */ |
---|
| 1997 | 18: "userID" : "prop_userID", |
---|
| 1998 | 19: |
---|
| 1999 | 20: /* String */ |
---|
| 2000 | 21: "loginGroupID" : "prop_loginGroupID" |
---|
| 2001 | 22: }; |
---|
| 2002 | 23: |
---|
| 2003 | 24: //------------------------------- |
---|
| 2004 | 25: // Sample Data : 'member' |
---|
| 2005 | 26: //------------------------------- |
---|
| 2006 | 27: var member = |
---|
| 2007 | 28: /* Object <b><<font color="blue">Member</font>></b> */ |
---|
| 2008 | 29: { |
---|
| 2009 | 30: /* Boolean */ |
---|
| 2010 | 31: "married" : true, |
---|
| 2011 | 32: |
---|
| 2012 | 33: /* Number */ |
---|
| 2013 | 34: "age" : 123, |
---|
| 2014 | 35: |
---|
| 2015 | 36: /* String */ |
---|
| 2016 | 37: "name" : "prop_name", |
---|
| 2017 | 38: |
---|
| 2018 | 39: /* String */ |
---|
| 2019 | 40: "id" : "prop_id", |
---|
| 2020 | 41: |
---|
| 2021 | 42: /* Array <b><<font color="blue">Member</font>[]></b> */ |
---|
| 2022 | 43: "children" : [ |
---|
| 2023 | 44: |
---|
| 2024 | 45: ], |
---|
| 2025 | 46: |
---|
| 2026 | 47: /* Date (Thu Jun 19 2008 12:34:56 GMT+0900 (JST)) */ |
---|
| 2027 | 48: "birthDate" : new Date(1213846496000) |
---|
| 2028 | 49: }; |
---|
| 2029 | 50: |
---|
| 2030 | 51: ************************************************************ |
---|
| 2031 | </pre> |
---|
| 2032 | * </font> |
---|
| 2033 | * </td> |
---|
| 2034 | * </tr> |
---|
| 2035 | * </table> |
---|
| 2036 | * |
---|
| 2037 | * <br/> |
---|
| 2038 | * サンプルコードはJSON形式で出力されます。そのため、コピー&ペーストで利用することが可能です。<br/> |
---|
| 2039 | * <br/> |
---|
| 2040 | * また、コメントとしてJavaScriptの型情報が付与されています。<br/> |
---|
| 2041 | * 9行目の「<b><<font color="red">WSUserInfo</font>></b>」 |
---|
| 2042 | * や |
---|
| 2043 | * 28行目の「<b><<font color="blue">Member</font>></b>」など、 |
---|
| 2044 | * JavaScriptの型情報の右側に表示されている「<b><></b>」内の文字列は、そのオブジェクト構成を表す名称です。<br/> |
---|
| 2045 | * <br/> |
---|
| 2046 | * 例えば、42行目の「<b><<font color="blue">Member</font>[]></b>」は、 |
---|
| 2047 | * 「childrenプロパティには、28行目で示されている<b><<font color="blue">Member</font>></b>形式のオブジェクトが配列で格納される」 |
---|
| 2048 | * ことを意味しています。<br/> |
---|
| 2049 | * <br/> |
---|
| 2050 | * |
---|
| 2051 | * なお、XMLスキーマの restriction で定義されている型などは、サンプルデータが生成されません。 |
---|
| 2052 | * サンプルデータが生成されていない型については、WSDL、および、実行するWebサービスの仕様を確認してください。 |
---|
| 2053 | * |
---|
| 2054 | * @scope public |
---|
| 2055 | * @param operationName ?String Webサービス・オペレーション名 (省略時はWebサービス内で利用可能なすべてのオペレーションに関するソースコードが返却されます) |
---|
| 2056 | * @return String Webサービスを呼び出すソースコードのサンプル |
---|
| 2057 | */ |
---|
| 2058 | public void getSampleCode(String operationName){ |
---|
| 2059 | // APIリスト用ダミー関数 |
---|
| 2060 | // この関数は、自動生成されるJSファイル内で定義されています。 |
---|
| 2061 | } |
---|
| 2062 | |
---|
| 2063 | /** |
---|
| 2064 | * このWebサービスで利用可能なオペレーション名を返却します。 |
---|
| 2065 | * |
---|
| 2066 | * @scope public |
---|
| 2067 | * @return Array Webサービス・オペレーション名の配列 |
---|
| 2068 | */ |
---|
| 2069 | public Object getOperationNames() { |
---|
| 2070 | // APIリスト用ダミー関数 |
---|
| 2071 | // この関数は、自動生成されるJSファイル内で定義されています。 |
---|
| 2072 | return null; |
---|
| 2073 | } |
---|
| 2074 | |
---|
| 2075 | |
---|
| 2076 | |
---|