チェンジセット 303

差分発生行の前後
無視リスト:
コミット日時:
2008/07/21 02:20:00 (14 年前)
コミッタ:
shinomiya
ログメッセージ:

iWP ver7.0の変更を反映

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • trunk/im-jssp/src/main/java/org/intra_mart/jssp/script/api/SOAPClientObject.java

    r299 r303  
    33import java.beans.IntrospectionException; 
    44import java.beans.PropertyDescriptor; 
     5import java.io.ByteArrayInputStream; 
     6import java.io.ByteArrayOutputStream; 
    57import java.io.File; 
    68import java.io.FileNotFoundException; 
     
    1820import java.net.URL; 
    1921import java.util.ArrayList; 
     22import java.util.Collection; 
    2023import java.util.Date; 
     24import java.util.HashMap; 
    2125import java.util.Iterator; 
    2226import java.util.List; 
    2327import java.util.Map; 
    24 import java.util.WeakHashMap; 
     28import java.util.Properties; 
     29import java.util.SortedMap; 
     30import java.util.TreeMap; 
     31import java.util.jar.JarEntry; 
     32import java.util.jar.JarFile; 
    2533 
    2634import javax.xml.namespace.QName; 
     
    5866import org.mozilla.javascript.JavaScriptException; 
    5967import org.mozilla.javascript.ScriptableObject; 
     68import org.mozilla.javascript.Undefined; 
    6069import org.w3c.dom.Document; 
    6170import org.w3c.dom.Element; 
    6271import org.w3c.dom.NamedNodeMap; 
     72import org.w3c.dom.Node; 
    6373import org.w3c.dom.NodeList; 
    6474import org.xml.sax.SAXException; 
    6575 
    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:  /&#42;&#42; 
     212  8:   &#42; SOAPClientオブジェクトを利用してWebサービスを呼び出すサンプルです。 
     213  9:   &#42;/ 
     214 10:  function init(args){ 
     215 11:      add(); 
     216 12:      findAll(); 
     217 13:  } 
     218 14:   
     219 15:  /&#42;&#42; 
     220 16:   &#42; メンバー情報を追加します。 
     221 17:   &#42;/ 
     222 18:  function add(){ 
     223 19:       
     224 20:      //&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 
     225 21:      // ステップ1:WSDLを指定して SOAPClientオブジェクト のインスタンスを生成 
     226 22:      //&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 
     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:      //&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 
     237 33:      // ステップ2:Webサービスを呼び出すソースコードのサンプルを表示 
     238 34:      //&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 
     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:      //&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 
     248 44:      // ステップ3: Webサービスの呼び出し (ステップ2で出力された内容をカスタマイズ) 
     249 45:      //&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 
     250 46:      // ↓↓↓↓ コピー&ペースト (ここから) ↓↓↓↓ 
     251 47:      //------------------------------- 
     252 48:      // Sample Data : 'wsUserInfo' 
     253 49:      //------------------------------- 
     254 50:      var wsUserInfo = 
     255 51:      /&#42; Object &lt;WSUserInfo&gt; &#42;/ 
     256 52:      { 
     257 53:          /&#42; String &#42;/ 
     258 54:          "password" : WSAuthDigestGenerator4WSSE.getDigest(wsUserID, wsPassword) , 
     259 55:   
     260 56:          /&#42; String &#42;/ 
     261 57:          "authType" : WSAuthDigestGenerator4WSSE.getAuthType(), 
     262 58:   
     263 59:          /&#42; String &#42;/ 
     264 60:          "userID" : wsUserID, 
     265 61:   
     266 62:          /&#42; String &#42;/ 
     267 63:          "loginGroupID" : wsLoginGroupID 
     268 64:      }; 
     269 65:       
     270 66:      //------------------------------- 
     271 67:      // Sample Data : 'member' 
     272 68:      //------------------------------- 
     273 69:      var member = 
     274 70:      /&#42; Object &lt;Member&gt; &#42;/ 
     275 71:      { 
     276 72:          /&#42; Boolean &#42;/ 
     277 73:          "married" : true, 
     278 74:   
     279 75:          /&#42; Number &#42;/ 
     280 76:          "age" : 123, 
     281 77:   
     282 78:          /&#42; String &#42;/ 
     283 79:          "name" : "prop_name", 
     284 80:   
     285 81:          /&#42; String &#42;/ 
     286 82:          "id" : "prop_id", 
     287 83:   
     288 84:          /&#42; Array &lt;Member[]&gt; &#42;/ 
     289 85:          "children" : [ 
     290 86:   
     291 87:          ], 
     292 88:   
     293 89:          /&#42; Date (Thu Jun 19 2008 12:34:56 GMT+0900 (JST)) &#42;/ 
     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); 
     304100:      } 
     305101:      catch(soapFault){ 
     306102:          Debug.browse("エラーが発生しました。", soapFault); 
     307103:      } 
     308104:   
     309105:      Debug.browse("ステップ3 完了", 
     310106:                   "追加しました。", 
     311107:                   "結果:" + result); 
     312108:  } 
     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 */ 
    67327public class SOAPClientObject extends ScriptableObject implements Cloneable, java.io.Serializable { 
    68328 
     329        private static final String TARGET_AXIS2_VERSION = "1.4"; 
     330         
    69331        private static final Logger _logger = Logger.getLogger(); 
    70332        private static final String STUB_SUFFIX = "Stub"; 
     
    84346                initializeJavacEncoding(null); 
    85347                initializeJavacVerbose(null); 
     348                 
     349                try { 
     350                        initializeExcludeClass4getSampleCode(null); 
     351                } 
     352                catch (ClassNotFoundException e) { 
     353                        _logger.error(e.getMessage(), e); 
     354                } 
    86355        } 
    87356 
     
    90359                return "SOAPClient"; 
    91360        } 
    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         
    94462        public static Object jsConstructor(Context cx, Object[] args, Function ctorObj, boolean inNewExpr) {             
    95463                if (inNewExpr == false) { 
     
    97465                } 
    98466 
    99                 if (args.length == 0 || args[0] == null) { 
    100                         throw new IllegalArgumentException("Please set one or more arguments."); 
    101                 } 
    102          
    103                 String wsdlUri = getURI4WSDL(args[0]); 
    104                 String targetEndpoint = null; 
     467                String wsdlUri = null; 
    105468                String portName = null; 
    106469                String serviceName = null; 
    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);  
    119502                return instance; 
    120503        } 
     
    142525        } 
    143526 
     527 
    144528        public SOAPClientObject(){ 
    145529        } 
     
    147531        /** 
    148532         * @param wsdlUri 
     533         * @param serviceName 
     534         * @param portName 
    149535         * @param targetEndpoint 
    150          * @param portName 
    151          * @param serviceName 
    152536         */ 
    153537        public SOAPClientObject(String wsdlUri, 
    154                                                         String targetEndpoint
     538                                                        String serviceName
    155539                                                        String portName, 
    156                                                         String serviceName) { 
     540                                                        String targetEndpoint) { 
    157541 
    158542                ClassLoader origin = Thread.currentThread().getContextClassLoader(); 
     
    162546                        // 「JSの実行スレッドに紐づくクラスローダ」と「jsToJavaBean()実行時のクラスローダ」を同じにする 
    163547                        ClassLoader oldExtendedClassLoader = _soapClientClassLoaderThreadLocal.get(); 
    164                         if(oldExtendedClassLoader != null){ 
    165                                 Thread.currentThread().setContextClassLoader(oldExtendedClassLoader); 
    166                         } 
    167                         else{ 
     548                         
     549                        if(oldExtendedClassLoader == null || StubGenerationMode.Everytime.equals(_stubGenMode)){ 
    168550                                ExtendedClassLoader classLoader4WsStub = new ExtendedClassLoader(origin); 
    169551                                classLoader4WsStub.setLogLevel(Logger.Level.DEBUG); 
     
    173555                                _soapClientClassLoaderThreadLocal.set(classLoader4WsStub); 
    174556                        } 
     557                        else{ 
     558                                Thread.currentThread().setContextClassLoader(oldExtendedClassLoader); 
     559                        } 
    175560                } 
    176561 
    177562                try { 
    178563                        // コンフィグ生成 
    179                         CodeGenConfiguration config = getCodeGenConfiguration(wsdlUri, _soapClientWorkDir, portName, serviceName); 
     564                        CodeGenConfiguration config = getCodeGenConfiguration(wsdlUri, _soapClientWorkDir, serviceName, portName); 
    180565                         
    181566                        // Stubクラス名取得 
    182567                        String stubClassName = getStubClassName(config); 
    183568                         
    184                         if( StubGenerationMode.Everytime.equals(_stubGenMode) 
    185                             || 
    186                             ( StubGenerationMode.Once.equals(_stubGenMode) && ( isExistStubClass(stubClassName) == false) )  
    187                         ){ 
    188                                 // Stubソース生成 
    189                                 generateStub(wsdlUri, _soapClientWorkDir, portName, serviceName, stubClassName); 
    190  
    191                                 // Stubクラスコンパイル 
    192                                 int result = compileStub(stubClassName, _soapClientWorkDir, _soapClientWorkDir); 
    193                                 if (result != 0) { 
    194                                         throw new IllegalStateException("Compile Failed: " + stubClassName + " (result->" + result + ")"); 
     569                        if(isEnableStubGenAndCompile(stubClassName)){ 
     570                                synchronized(MONITOR_4_JavaStub){ 
     571                                        if(isEnableStubGenAndCompile(stubClassName)){ // ←もう一度チェック 
     572 
     573                                                // Stubソース生成 
     574                                                generateStub(wsdlUri, _soapClientWorkDir, serviceName, portName, stubClassName); 
     575                 
     576                                                // Stubクラスコンパイル 
     577                                                int result = compileStub(stubClassName, _soapClientWorkDir, _soapClientWorkDir); 
     578                                                if (result != 0) { 
     579                                                        throw new IllegalStateException("Compile Failed: " + stubClassName + " (result->" + result + ")"); 
     580                                                } 
     581                                                 
     582                                        } 
    195583                                } 
    196584                        } 
    197585 
    198                         if( StubGenerationMode.Everytime.equals(_stubGenMode) 
    199                                 || 
    200                                 ( StubGenerationMode.Once.equals(_stubGenMode) && ( isExistStubJS(stubClassName, _soapClientWorkDir) == false) )  
    201                         ){ 
    202                                 // Stubクラスを呼び出すJSソース生成 
    203                                 generateStubJS(wsdlUri, stubClassName, _soapClientWorkDir); 
     586                        if(isEnableJsStubGen(stubClassName)){ 
     587                                synchronized (MONITOR_4_JsStub){ 
     588                                        if(isEnableJsStubGen(stubClassName)){ // ←もう一度チェック 
     589                                                 
     590                                                // Stubクラスを呼び出すJSソース生成 
     591                                                generateStubJS(wsdlUri, stubClassName, _soapClientWorkDir); 
     592                                                 
     593                                        } 
     594                                } 
    204595                        } 
    205596 
     
    208599                } 
    209600                catch (Exception e) { 
     601                        _logger.error(e.getMessage(), e); 
    210602                        throw Context.throwAsScriptRuntimeEx(e); 
    211603                } 
     
    217609        } 
    218610 
     611        /** 
     612         * @param stubClassName 
     613         * @return 
     614         */ 
     615        private boolean isEnableStubGenAndCompile(String stubClassName){ 
     616                if( StubGenerationMode.Everytime.equals(_stubGenMode) 
     617                        || 
     618                    ( 
     619                        StubGenerationMode.Once.equals(_stubGenMode)  
     620                        && 
     621                        isExistStubClass(stubClassName) == false 
     622                    ) 
     623                ){ 
     624                        return true; 
     625                } 
     626                else{ 
     627                        return false; 
     628                } 
     629                 
     630        } 
     631        private static Object MONITOR_4_JavaStub = new Object(); 
     632         
     633        /** 
     634         * @param stubClassName 
     635         * @return 
     636         */ 
     637        private boolean isEnableJsStubGen(String stubClassName){ 
     638                if( StubGenerationMode.Everytime.equals(_stubGenMode) 
     639                        || 
     640                        ( 
     641                                StubGenerationMode.Once.equals(_stubGenMode) 
     642                                && 
     643                                isExistStubJS(stubClassName, _soapClientWorkDir) == false 
     644                        )  
     645                ){ 
     646                        return true; 
     647                } 
     648                else{ 
     649                        return false; 
     650                } 
     651        } 
     652        private static Object MONITOR_4_JsStub = new Object(); 
     653 
     654         
    219655        /** 
    220656         * @return 
     
    230666                } 
    231667        } 
    232          
     668                
    233669        /** 
    234670         * @param classLoader 
     
    264700        } 
    265701         
     702 
    266703        /** 
    267704         * @param arg 
     
    287724                } 
    288725                 
     726                if(_soapClientWorkDir == null){ 
     727                        _soapClientWorkDir = ScriptScopeBuilderManager.getBuilder().getOutputDirectory(); 
     728                } 
     729                 
    289730                _logger.debug("{} -> {}", tagName, _soapClientWorkDir); 
    290731        } 
     
    385826 
    386827        /** 
     828         * @param list 
     829         * @throws ClassNotFoundException  
     830         */ 
     831        protected static void initializeExcludeClass4getSampleCode(Collection<String> list) throws ClassNotFoundException { 
     832                 
     833                Collection<String> configValues = list; 
     834 
     835                if(configValues == null){ 
     836                        configValues = new ArrayList<String>(); 
     837                } 
     838                 
     839                // PLAN コンフィグファイルにて、インスタンス生成の対象外とするクラスを設定可能にする 
     840                // デフォルト値 
     841                configValues.add("org.apache.axis2.databinding.types.URI"); 
     842                 
     843                for(String className : configValues){ 
     844                        Class<?> clazz = Class.forName(className); 
     845                         
     846                        // サンプルデータ設定済みインスタンスの生成の対象外とする 
     847                        JavaScriptUtility.addExcludeClass4newInstanceFilledSampleData(clazz); 
     848 
     849                        _logger.debug("initializeExcludeClass4getSampleCode -> {}", clazz); 
     850                } 
     851        } 
     852 
     853        /** 
    387854         * @param wsdlLocationURI 
    388855         * @param outputLocation 
     856         * @param serviceName 
    389857         * @param portName 
    390          * @param serviceName 
    391858         * @return 
    392859         */ 
    393860        private CodeGenConfiguration getCodeGenConfiguration(String wsdlLocationURI,  
    394861                                                                                                                  File outputLocation, 
    395                                                                                                                   String portName, 
    396                                                                                                                   String serviceName) { 
     862                                                                                                                  String serviceName, 
     863                                                                                                                  String portName) { 
    397864                try{ 
    398                         CodeGenerationEngine engine = getCachedCodeGenEngine(wsdlLocationURI, outputLocation, portName, serviceName); 
     865                        CodeGenerationEngine engine = getCachedCodeGenEngine(wsdlLocationURI, outputLocation, serviceName, portName); 
    399866                        CodeGenConfiguration codeGenConfiguration = engine.getConfiguration(); 
    400867                        return codeGenConfiguration; 
     
    405872        } 
    406873 
    407          
    408874        /** 
    409875         * CodeGenerationEngineの取得。(キャッシュあり) 
     
    411877         * @param wsdlLocationURI 
    412878         * @param outputLocation 
     879         * @param serviceName 
    413880         * @param portName 
    414          * @param serviceName 
    415881         * @return 
    416882         * @throws CodeGenerationException 
     
    418884        private CodeGenerationEngine getCachedCodeGenEngine(String wsdlLocationURI,  
    419885                                                                                                                File outputLocation, 
    420                                                                                                                 String portName, 
    421                                                                                                                 String serviceName ) throws CodeGenerationException { 
    422                  
    423                 CodeGenerationEngine engine = cache4codeGenEngine.get(wsdlLocationURI); 
    424                  
    425                 if(engine == null){ 
     886                                                                                                                String serviceName, 
     887                                                                                                                String portName ) throws CodeGenerationException { 
     888                 
     889                String enginesKey = wsdlLocationURI + "|" + serviceName + "|" + portName; 
     890                 
     891                CodeGenerationEngine engine = cache4codeGenEngine.get(enginesKey); 
     892                 
     893                if(StubGenerationMode.Everytime.equals(_stubGenMode) || engine == null){ 
    426894                        synchronized(cache4codeGenEngine){ 
    427895                                // 引数を作成                                 
    428                                 String[] args = generateArgs(wsdlLocationURI, outputLocation, portName, serviceName); 
     896                                String[] args = generateArgs(wsdlLocationURI, outputLocation, serviceName, portName); 
    429897                                 
    430898                                // CodeGenerationEngineを生成 () 
     
    433901                                 
    434902                                // キャッシュ 
    435                                 cache4codeGenEngine.put(wsdlLocationURI, engine); 
     903                                cache4codeGenEngine.put(enginesKey, engine); 
    436904                        } 
    437905                } 
     
    439907                return engine; 
    440908        } 
    441         private static Map<String, CodeGenerationEngine> cache4codeGenEngine = new WeakHashMap<String, CodeGenerationEngine>(); 
     909        private static Map<String, CodeGenerationEngine> cache4codeGenEngine = new HashMap<String, CodeGenerationEngine>(); 
    442910 
    443911        /** 
     
    449917         */ 
    450918        private String[] generateArgs(String wsdlLocationURI, File outputLocation, 
    451                                                                   String portName, String serviceName) { 
     919                                                                  String serviceName, String portName) { 
    452920                 
    453921                List<String> argsList = new ArrayList<String>(); 
     
    461929                argsList.add("-" + CommandLineOptionConstants.WSDL2JavaConstants.NO_BUILD_XML_OPTION_LONG); 
    462930                argsList.add("-" + CommandLineOptionConstants.WSDL2JavaConstants.OVERRIDE_OPTION_LONG); 
    463                 argsList.add("-" + CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_SYNC_ONLY_OPTION); 
    464                  
    465                  
     931                argsList.add("-" + CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_SYNC_ONLY_OPTION_LONG); 
     932                 
     933                if(serviceName != null){ 
     934                        argsList.add("-" + CommandLineOptionConstants.WSDL2JavaConstants.SERVICE_NAME_OPTION_LONG); 
     935                        argsList.add(serviceName); 
     936                } 
     937 
    466938                if(portName != null){ 
    467                 argsList.add("-" + CommandLineOptionConstants.WSDL2JavaConstants.PORT_NAME_OPTION_LONG); 
    468                 argsList.add(portName); 
    469                 } 
    470                  
    471                 if(serviceName != null){ 
    472                 argsList.add("-" + CommandLineOptionConstants.WSDL2JavaConstants.SERVICE_NAME_OPTION_LONG); 
    473                 argsList.add(serviceName); 
     939                        argsList.add("-" + CommandLineOptionConstants.WSDL2JavaConstants.PORT_NAME_OPTION_LONG); 
     940                        argsList.add(portName); 
    474941                } 
    475942                 
     
    481948         
    482949        private String getStubClassName(CodeGenConfiguration codeGenConfiguration) { 
     950                // 【注意】  Webサービスを指定して呼び出す場合は、SOAPClientのコンストラクタ引数にてそのサービス名を指定してください。 
    483951                 
    484952                // スタブのクラス名を取得 
    485953                // AxisServiceが複数存在しても、特定の一つのWebサービスに対するスタブを対象とする。 
    486                 // (∵JSソースで「new SOAPClient()」とした際に呼び出せるWebサービスは一つとするため) 
     954                // (∵スタブソース生成、および、コンパイルの同期化を行うために、 
     955                //     JSソースで「new SOAPClient()」とした際に呼び出せるWebサービスは一つとしている) 
    487956                // なお、特定の一つのWebサービスとは、codeGenConfiguration.getAxisService()で取得可能なWebサービスとします。 
    488957                AxisService axisService = codeGenConfiguration.getAxisService(); 
     
    5481017                                                                                IllegalAccessException,  
    5491018                                                                                IOException, 
    550                                                                                 ClassNotFoundException { 
     1019                                                                                ClassNotFoundException,  
     1020                                                                                JavaScriptException { 
    5511021                 
    5521022                ScriptScopeBuilder builder = ScriptScopeBuilderManager.getBuilder(); 
     
    5581028        /** 
    5591029         * Javaスタブのソースコード生成 
    560          *  
    561          * @param wsdlUri 
     1030         * @param wsdlLocationURI 
     1031         * @param outputLocation 
     1032         * @param serviceName 
     1033         * @param portName 
    5621034         * @param stubClassName 
    5631035         * @throws CodeGenerationException 
    5641036         */ 
    565         protected synchronized void generateStub(String wsdlLocationURI,  
     1037        protected void generateStub(String wsdlLocationURI,  
    5661038                                                                                          File outputLocation, 
     1039                                                                                          String serviceName,    
    5671040                                                                                          String portName, 
    568                                                                                           String serviceName,    
    569                                                                                           String stubClassName) throws CodeGenerationException { 
     1041                                                                                          String stubClassName) throws CodeGenerationException  { 
    5701042                _logger.info("Generate Stub(Java): {}", stubClassName); 
    5711043                 
    572                 // エンジン生成 
    573                 CodeGenerationEngine engine = getCachedCodeGenEngine(wsdlLocationURI, outputLocation, portName, serviceName); 
     1044                // エンジン取得 
     1045                CodeGenerationEngine engine = getCachedCodeGenEngine(wsdlLocationURI, outputLocation, serviceName, portName); 
     1046                 
     1047                // Javaスタブのソースコード生成 
    5741048                engine.generate(); 
     1049                 
    5751050        } 
    5761051 
     
    5841059         * @throws IOException 
    5851060         */ 
    586         protected synchronized int compileStub(String className, File srcDir, File destDir) throws IOException{ 
     1061        protected int compileStub(String className, File srcDir, File destDir) throws IOException{ 
    5871062             
    5881063                if(destDir.exists() == false){ 
     
    7021177         * @throws SAXException 
    7031178         */ 
    704         protected synchronized void generateStubJS(String wsdlUri, String stubClassName, File destDir)  
     1179        protected void generateStubJS(String wsdlUri, String stubClassName, File destDir)  
    7051180                                                                        throws IOException, IntrospectionException, ClassNotFoundException,  
    7061181                                                                                   NoSuchFieldException, IllegalArgumentException,  
     
    7081183                                                                                   ParserConfigurationException, SAXException { 
    7091184 
    710                 Class<?> stubClass = Thread.currentThread().getContextClassLoader().loadClass(stubClassName); 
     1185                Class<?> stubClass = getCurrentThreadClassLoader4SOAPClient().loadClass(stubClassName); 
    7111186                 
    7121187                // PLAN CallBackHandlerの扱い 
     
    7331208                 
    7341209                // サンプルコード表示関数(全オペレーション) 
    735                 generateFunc4printUsageAll(strBuilder4source); 
     1210                generateFunc4getSampleCodeAll(strBuilder4source); 
    7361211 
    7371212                // Webサービス・オペレーション実行関数 
    738                 generateFunc4executeOperationFuncs(wsdlUri, strBuilder4source, strBuilder4usage, methods4operation); 
     1213                generateFunc4executeOperationFuncs(stubClass, wsdlUri, strBuilder4source, strBuilder4usage, methods4operation); 
    7391214                 
    7401215                // サンプルコードの表示 (各オペレーション) 
    741                 generateFunc4printUsage(strBuilder4source, strBuilder4usage); 
     1216                generateFunc4getSampleCode(strBuilder4source, strBuilder4usage); 
    7421217                 
    7431218                 
     
    8181293         * サンプルコード表示関数(全オペレーション) 
    8191294         */ 
    820         private void generateFunc4printUsageAll(StringBuilder source) { 
     1295        private void generateFunc4getSampleCodeAll(StringBuilder source) { 
    8211296                source.append(LINE_SEP); 
    822                 source.append("function printUsageAll(){")                                                                    .append(LINE_SEP); 
     1297                source.append("function getSampleCodeAll(){")                                                         .append(LINE_SEP); 
    8231298                source.append("    var names = getOperationNames();")                                           .append(LINE_SEP); 
    8241299                source.append(LINE_SEP); 
    8251300                source.append("    var str = '';")                                                                                      .append(LINE_SEP); 
     1301                source.append("    var sourceCode = '';")                                                                       .append(LINE_SEP); 
    8261302                source.append(     outerSeparator)                                                                                      .append(LINE_SEP); 
    8271303                source.append("        str += 'All oparation names:' + '\\n';")                         .append(LINE_SEP); 
     
    8301306                source.append("    for(var idx = 0; idx < max; idx++){")                                        .append(LINE_SEP); 
    8311307                source.append("        str += '  [' + idx + ']: ' + names[idx] + '()\\n';")     .append(LINE_SEP); 
    832                 source.append("        printUsage(names[idx]);")                                                      .append(LINE_SEP); 
     1308                source.append("        sourceCode += getSampleCode(names[idx]) + '\\n';")     .append(LINE_SEP); 
    8331309                source.append("    }")                                                                                                          .append(LINE_SEP); 
    8341310                source.append(LINE_SEP); 
    8351311                source.append(     outerSeparator)                                                                                      .append(LINE_SEP); 
    836                 source.append("    Debug.print(str);")                                                                        .append(LINE_SEP); 
     1312                source.append("    return sourceCode + str;")                                                         .append(LINE_SEP); 
    8371313 
    8381314                source.append("}")                                                                                                                      .append(LINE_SEP); 
     
    8421318         * Webサービス・オペレーション実行関数 
    8431319         */ 
    844         private void generateFunc4executeOperationFuncs(String wsdlUri, StringBuilder source, StringBuilder usage, List<Method> methods4operation) throws ParserConfigurationException, 
     1320        private void generateFunc4executeOperationFuncs(Class<?> stubClass, String wsdlUri, StringBuilder source, StringBuilder usage, List<Method> methods4operation) throws ParserConfigurationException, 
    8451321                        IOException, XPathExpressionException, SAXException, IntrospectionException { 
    8461322                Iterator<Method> it4operation = methods4operation.iterator(); 
     
    8531329                                                source.append(LINE_SEP); 
    8541330                                                source.append("function " + operatinoName + "() {")                                                                                                     .append(LINE_SEP); 
     1331                                                source.append("    try  {")                                                                                                                                                     .append(LINE_SEP); 
    8551332 
    8561333                        // ---------------- 
     
    8701347                                String paramTypeName = operationParamType.getName(); 
    8711348                                 
    872                                                 source.append("    var clazz          = classLoader.loadClass(\"" + paramTypeName + "\");")                   .append(LINE_SEP); 
    873                                                 source.append("    var operationParam = clazz.newInstance();")                                                                        .append(LINE_SEP); 
     1349                                                source.append("        var clazz          = classLoader.loadClass(\"" + paramTypeName + "\");")               .append(LINE_SEP); 
     1350                                                source.append("        var operationParam = clazz.newInstance();")                                                                    .append(LINE_SEP); 
    8741351                                                 
    875                                 // WSDLより、Webサービスのパラメータクラスのプロパティ順を取得。 
     1352                                // Webサービスのパラメータクラスのプロパティ順を取得。 
    8761353                                // (∵SOAPClient#オペレーション()に指定した引数の順序(=arguments オブジェクト)とあわせるため) 
    877                                 List<String> propNameList = getPropertyNameListFromWSDL(wsdlUri, operationParamType); 
     1354                                List<String> propNameList = getPropertyNameList(operationParamType, wsdlUri); 
    8781355                                Iterator<String> propNameIt = propNameList.iterator(); 
    8791356                                 
     
    9131390 
    9141391                                                source.append(LINE_SEP); 
    915                                                 source.append("    var jsArg_" + propName + "    = "); 
    916                                                 source.append(                  "(arguments[" + idx + "] == undefined)"); 
    917                                                 source.append(                          " ? null : arguments[" + idx + "];")                                                                  .append(LINE_SEP); 
     1392                                                source.append("        var jsArg_" + propName + "    = "); 
     1393                                                source.append(                         "(arguments[" + idx + "] == undefined)"); 
     1394                                                source.append(                                 " ? null : arguments[" + idx + "];")                                                           .append(LINE_SEP); 
    9181395                                         
    919                                                 source.append("    var beanType_" + propName + " = '"); 
    920                                                 source.append(                  setterParamTypeName + "';")                                                                                                   .append(LINE_SEP); 
     1396                                                source.append("        var beanType_" + propName + " = '"); 
     1397                                                source.append(                         setterParamTypeName + "';")                                                                                            .append(LINE_SEP); 
    9211398                                         
    922                                                 source.append("    var javaArg_" + propName + "  = "); 
    923                                                 source.append(                  name4JavaScriptUtility + ".jsToJavaBean"); 
    924                                                 source.append(                          "(jsArg_" + propName + ", beanType_" + propName + ", classLoader);")   .append(LINE_SEP); 
     1399                                                source.append("        var javaArg_" + propName + "  = "); 
     1400                                                source.append(                         name4JavaScriptUtility + ".jsToJavaBean"); 
     1401                                                source.append(                                 "(jsArg_" + propName + ", beanType_" + propName + ", classLoader);").append(LINE_SEP); 
    9251402                                         
    926                                                 source.append("    operationParam." + setter.getName() + "("); 
     1403                                                source.append("        operationParam." + setter.getName() + "("); 
    9271404 
    9281405                                        // Primitive型(∵JSの変数として保持すると、RhinoがWrapperクラスに変換するため、パラメータ型の相違で該当のsetterが呼び出せない) 
     
    10011478                        usage4Body.append(                 outerSeparator)                                                                                                              .append(LINE_SEP); 
    10021479                        usage4Body.append(                 LINE_SEP); 
    1003                         usage4Body.append("        Debug.print(str);")                                                                                                  .append(LINE_SEP); 
    1004                         usage4Body.append("        return;")                                                                                                                    .append(LINE_SEP); 
     1480                        usage4Body.append("        return str;")                                                                                                                .append(LINE_SEP); 
    10051481                        usage4Body.append("    }")                                                                                                                                              .append(LINE_SEP); 
    10061482                         
     
    10081484 
    10091485                                        source.append(LINE_SEP); 
    1010                                         source.append("    try  {")                                                                                                                                                             .append(LINE_SEP); 
    10111486 
    10121487                        if(returnType.equals(void.class)){ 
     
    10611536                                        source.append("    }")                                                                                                                                                                  .append(LINE_SEP); 
    10621537                                        source.append("    catch(e){")                                                                                                                                                  .append(LINE_SEP); 
     1538                                        source.append("        Logger.getLogger('" + stubClass.getName() + "').error(e.message, e);")                   .append(LINE_SEP); 
     1539                                        source.append(LINE_SEP); 
    10631540                                        source.append("        if(e.javaException == undefined ")                                                                                               .append(LINE_SEP); 
    10641541                                        source.append("           ||")                                                                                                                                                  .append(LINE_SEP); 
     
    10671544                                        source.append("        }")                                                                                                                                                              .append(LINE_SEP); 
    10681545                                        source.append("        else{")                                                                                                                                                  .append(LINE_SEP); 
    1069                                         source.append("            throw new SOAPFaultError(e);")                                                                                               .append(LINE_SEP); 
     1546                                        source.append("            var soapFault = new SOAPFault(e.javaException);")                                                    .append(LINE_SEP); 
     1547                                        source.append("            throw soapFault;")                                                                                                                   .append(LINE_SEP); 
    10701548                                        source.append("        }")                                                                                                                                                              .append(LINE_SEP); 
    10711549                                        source.append("    }")                                                                                                                                                                  .append(LINE_SEP); 
     
    10771555         * サンプルコードの表示 (各オペレーション) 
    10781556         */ 
    1079         private void generateFunc4printUsage(StringBuilder source, StringBuilder usage) { 
     1557        private void generateFunc4getSampleCode(StringBuilder source, StringBuilder usage) { 
    10801558                source.append(LINE_SEP); 
    1081                 source.append("function printUsage(operationName){")                                                                          .append(LINE_SEP); 
     1559                source.append("function getSampleCode(operationName){")                                                                               .append(LINE_SEP); 
    10821560                source.append(LINE_SEP); 
    1083                 source.append("    if(operationName == undefined){")                                                                            .append(LINE_SEP); 
    1084                 source.append("        printUsageAll();")                                                                                                       .append(LINE_SEP); 
    1085                 source.append("        return;")                                                                                                                        .append(LINE_SEP); 
     1561                source.append("    if( isBlank(operationName) ){")                                                                                      .append(LINE_SEP); 
     1562                source.append("        return getSampleCodeAll();")                                                                                     .append(LINE_SEP); 
    10861563                source.append("    }")                                                                                                                                          .append(LINE_SEP); 
    10871564                source.append(LINE_SEP); 
     
    10901567                source.append(     usage); // Usageを追加 
    10911568                source.append(LINE_SEP); 
    1092                 source.append("    Debug.print(\"Operation '\" + operationName + \"()' is not defined.\");").append(LINE_SEP); 
    1093                 source.append("    return;")                                                                                                                          .append(LINE_SEP); 
     1569                source.append("    str = \"Operation '\" + operationName + \"()' is not defined.\";")          .append(LINE_SEP); 
     1570                source.append("    return str;")                                                                                                                      .append(LINE_SEP); 
    10941571                source.append("}")                                                                                                                                                      .append(LINE_SEP); 
    10951572        } 
     
    11081585         * @throws ClassNotFoundException 
    11091586         */ 
    1110         protected void executeStubJS(String stubClassName, File srcDir, String targetEndpoint)  
     1587        protected void executeStubJS(String stubClassName, File srcDir, String targetEndpoint) 
    11111588                                                throws JavaScriptException, FileNotFoundException,  
    11121589                                                           InstantiationException, IllegalAccessException,  
    11131590                                                           IOException, ClassNotFoundException { 
     1591 
    11141592                ScriptScope scope = getScriptScope(stubClassName, srcDir); 
    11151593                this.setPrototype(scope); 
     
    11251603        protected String getAxis2ClassPath() {           
    11261604                if(classPath4Axis2 == null){ 
    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                                        } 
    11391634                                } 
    11401635                        } 
     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        } 
    11411706         
    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        } 
    11641746         
    11651747        private boolean _isDead4CompileProcess; 
     
    12331815         * @throws SAXException 
    12341816         */ 
    1235         private static List<String> getPropertyNameListFromWSDL(String wsdlUrl, Class<?> operationParamType)  
     1817        private static List<String> getPropertyNameList(Class<?> operationParamType, String wsdlUrl)  
    12361818                                                throws ParserConfigurationException, IOException, XPathExpressionException, SAXException{ 
    12371819 
    1238                 QName myQName; 
     1820                List<String> propertyNamesList = new ArrayList<String>(); 
     1821 
     1822                QName myQName = null; 
     1823                InputStream is = null; 
    12391824                try { 
    12401825                        Field field4MyQName = operationParamType.getField("MY_QNAME"); 
    12411826                        myQName = (QName) field4MyQName.get(null); 
    12421827                        _logger.trace("operationParamType:{}, myQName:{}", operationParamType.getName(), myQName); 
    1243                 } 
    1244                 catch (Exception e) { 
    1245                         throw new  IllegalStateException(e); 
    1246                 } 
    1247  
    1248                 List<String> list = new ArrayList<String>(); 
    1249                  
    1250                 StringBuilder exp = new StringBuilder();  
    1251                 exp.append("//definitions/types/schema[@targetNamespace=\"" + myQName.getNamespaceURI() + "\"]"); 
    1252                 exp.append("/element[@name=\"" + myQName.getLocalPart() + "\"]/*/sequence/*"); 
    1253                  
    1254                 URL url = new URL(wsdlUrl); 
    1255                 InputStream is = url.openStream(); 
    1256  
    1257                 try{ 
     1828         
     1829                        // 単独で定義されているElement 
     1830                        StringBuilder exp4standalone = new StringBuilder(); 
     1831                        exp4standalone.append("//definitions/types/schema[@targetNamespace=\"" + myQName.getNamespaceURI() + "\"]"); 
     1832                        exp4standalone.append("/element[@name=\"" + myQName.getLocalPart() + "\"]"); 
     1833         
     1834                        // ComplexTypeなど、シーケンスが指定された状態で定義されているElement 
     1835                        StringBuilder exp4sequence = new StringBuilder(); 
     1836                        exp4sequence.append(exp4standalone); 
     1837                        exp4sequence.append("/*/sequence/*"); 
     1838                         
     1839                        URL url = new URL(wsdlUrl); 
     1840                        is = url.openStream(); 
     1841 
    12581842                        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
    12591843                        Document doc = builder.parse(is); 
     
    12621846                        XPathFactory factory = XPathFactory.newInstance(); 
    12631847                        XPath xpath = factory.newXPath(); 
    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); 
    12861879                } 
    12871880                finally{ 
     
    12901883                        } 
    12911884                } 
    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: &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 
     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: /&#42; Object <b>&lt;<font color="red">WSUserInfo</font>&gt;</b> &#42;/ 
     198910: { 
     199011:     /&#42; String &#42;/ 
     199112:     "password" : "prop_password", 
     199213:  
     199314:     /&#42; String &#42;/ 
     199415:     "authType" : "prop_authType", 
     199516:  
     199617:     /&#42; String &#42;/ 
     199718:     "userID" : "prop_userID", 
     199819:  
     199920:     /&#42; String &#42;/ 
     200021:     "loginGroupID" : "prop_loginGroupID" 
     200122: }; 
     200223:  
     200324: //------------------------------- 
     200425: // Sample Data : 'member' 
     200526: //------------------------------- 
     200627: var member = 
     200728: /&#42; Object <b>&lt;<font color="blue">Member</font>&gt;</b> &#42;/ 
     200829: { 
     200930:     /&#42; Boolean &#42;/ 
     201031:     "married" : true, 
     201132:  
     201233:     /&#42; Number &#42;/ 
     201334:     "age" : 123, 
     201435:  
     201536:     /&#42; String &#42;/ 
     201637:     "name" : "prop_name", 
     201738:  
     201839:     /&#42; String &#42;/ 
     201940:     "id" : "prop_id", 
     202041:  
     202142:     /&#42; Array <b>&lt;<font color="blue">Member</font>[]&gt;</b> &#42;/ 
     202243:     "children" : [ 
     202344:  
     202445:     ], 
     202546:  
     202647:     /&#42; Date (Thu Jun 19 2008 12:34:56 GMT+0900 (JST)) &#42;/ 
     202748:     "birthDate" : new Date(1213846496000) 
     202849: }; 
     202950:  
     203051: &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 
     2031</pre> 
     2032 *                              </font> 
     2033 *                      </td> 
     2034 *              </tr> 
     2035 *      </table> 
     2036 *  
     2037        * <br/> 
     2038     * サンプルコードはJSON形式で出力されます。そのため、コピー&ペーストで利用することが可能です。<br/> 
     2039     * <br/> 
     2040     * また、コメントとしてJavaScriptの型情報が付与されています。<br/> 
     2041     * 9行目の「<b>&lt;<font color="red">WSUserInfo</font>&gt;</b>」 
     2042     * や 
     2043     * 28行目の「<b>&lt;<font color="blue">Member</font>&gt;</b>」など、 
     2044     * JavaScriptの型情報の右側に表示されている「<b>&lt;&gt;</b>」内の文字列は、そのオブジェクト構成を表す名称です。<br/> 
     2045     * <br/> 
     2046     * 例えば、42行目の「<b>&lt;<font color="blue">Member</font>[]&gt;</b>」は、 
     2047     * 「childrenプロパティには、28行目で示されている<b>&lt;<font color="blue">Member</font>&gt;</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 
    12942077    /** 
    12952078     * タイムアウト値を設定します。 
     
    13012084        // APIリスト用ダミー関数 
    13022085        // 実態は、以下に定義されています。 
    1303         // im-jssp/src/main/js/jssp/script/api/soap_client_helper.js 
     2086        // im_root/services/resource/pages/platform/src/system/common/parts/soap_client/soap_client_helper.js 
    13042087    } 
    13052088         
    1306         /** 
     2089    /** 
     2090     * SOAPClientの関連リソースをクリーンアップします。<br/> 
     2091         * このメソッドを呼び出すことは、Axis2のorg.apache.axis2.client.Stub#cleanup()メソッドを呼び出すことに相当します。 
     2092         *  
     2093     * @scope public 
     2094     */ 
     2095    public void cleanup() { 
     2096        // APIリスト用ダミー関数 
     2097        // 実態は、以下に定義されています。 
     2098        // im_root/services/resource/pages/platform/src/system/common/parts/soap_client/soap_client_helper.js 
     2099    } 
     2100         
     2101    /** 
     2102     * MTOM (Message Transmission Optimization Mechanism)の有効・無効を設定します。 
     2103         *  
     2104     * @scope public 
     2105     * @param bool Boolean MTOMを有効にする場合は trueを、無効にする場合は false を設定します。 
     2106     */ 
     2107    public void setEnableMTOM(boolean bool) { 
     2108        // APIリスト用ダミー関数 
     2109        // 実態は、以下に定義されています。 
     2110        // im_root/services/resource/pages/platform/src/system/common/parts/soap_client/soap_client_helper.js 
     2111    } 
     2112 
     2113    /** 
     2114         * 送信するSOAPメッセージの文字セットを設定します。<br/> 
     2115         * 設定しない場合の初期値は「UTF-8」です。 
     2116         *  
     2117     * @scope public 
     2118     * @param charset String 文字セット名 
     2119     */ 
     2120    public void setCharacterSetEncoding(String charset) { 
     2121        // APIリスト用ダミー関数 
     2122        // 実態は、以下に定義されています。 
     2123        // im_root/services/resource/pages/platform/src/system/common/parts/soap_client/soap_client_helper.js 
     2124    } 
     2125 
     2126    /** 
    13072127         * Webサービスのスタブ・ソース作成モード。 
    13082128         */ 
     
    13292149                 * Axis2によるのWebサービスのスタブ・ソース生成に関しては、以下を参照してください。<br/> 
    13302150                 * <ul> 
    1331                  *   <li><a href="http://ws.apache.org/axis2/tools/1_3/CodegenToolReference.html">Code Generator Tool Guide for Command Line and Ant Task</a></li> 
    1332                  *   <li><a href="http://ws.apache.org/axis2/tools/1_3/eclipse/wsdl2java-plugin.html">Code Generator Wizard Guide for Eclipse Plug-in</a></li> 
     2151                 *   <li><a href="http://ws.apache.org/axis2/tools/1_4/CodegenToolReference.html">Code Generator Tool Guide for Command Line and Ant Task</a></li> 
    13332152                 * </ul> 
    13342153                 */ 
    13352154                Never 
    13362155        } 
     2156         
    13372157}