001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.taglib;
017
018import static org.opengion.fukurou.util.StringUtil.nval;
019
020import java.io.BufferedInputStream;
021import java.io.BufferedWriter;
022import java.io.ByteArrayInputStream;
023import java.io.ByteArrayOutputStream;
024import java.io.File;
025import java.io.IOException;
026import java.io.InputStream;
027import java.io.OutputStreamWriter;
028import java.io.UnsupportedEncodingException;
029import java.io.Writer;
030import java.util.Map;
031
032import org.opengion.fukurou.model.FileOperation;
033import org.opengion.fukurou.util.Closer;
034import org.opengion.fukurou.util.FileString;
035import org.opengion.fukurou.util.FileUtil;
036import org.opengion.fukurou.util.LogWriter;
037import org.opengion.fukurou.util.SOAPConnect;
038import org.opengion.fukurou.util.StringUtil;
039import org.opengion.fukurou.util.URLConnect;
040import org.opengion.fukurou.util.XHTMLTag;
041import org.opengion.fukurou.xml.XML2TableParser;
042import org.opengion.fukurou.xml.XSLT;
043import org.opengion.hayabusa.common.HybsSystem;
044import org.opengion.hayabusa.common.HybsSystemException;
045import org.opengion.hayabusa.db.DBTableModel;
046import org.opengion.hayabusa.db.DBTableModelUtil;
047import org.opengion.hayabusa.io.HybsFileOperationFactory;
048
049/**
050 * 指定のURLに接続します。
051 *
052 * エンジンでは、URL にアクセスすることで、デーモンを起動したり、
053 * コマンドを実行(adminメニュー)することが出来ます。
054 * もちろん、検索条件を指定して、結果を取得することも可能です。
055 * このタグでは、URLにアクセスして、コマンドを実行したり結果を取得できます。
056 * さらに、ファイルを POST で転送したり、処理結果を XSLT変換したり出来ます。
057 *
058 * @og.formSample
059 * ●形式:
060 *     <og:urlConnect
061 *         url           = "http://・・・ "    必須
062 *         proxyHost     = "proxy.opengion.org"
063 *         proxyPort     = "8080"
064 *         timeout       = "1"
065 *         keys          = "command,SYSTEM_ID"
066 *         vals          = "NEW,GE"
067 *         useSystemUser = "true/false"     初期値:true
068 *         authUserPass  = "admin:******"   初期値:admin:******
069 *         display       = "false/true"     初期値:false
070 *         xslFile       = "filter.xsl"
071 *         saveFile      = "outdata.xml"
072 *         soapNameSpace = "MyWebService"
073 *         soapMethodName= "test"
074 *         tableId       = "DEFAULT"
075 *         rowKey        = "item"
076 *         colKeys       = "person_id,person_name"
077 *         rtnKeys       = "version,summary"
078 *         encode        = "UTF-8"
079 *     />
080 *
081 * url           : 接続するURLを指定します。必須属性です。
082 * proxyHost     : proxy が存在する場合は、そのホスト名(例:proxy.opengion.org)
083 * proxyPort     : proxy が存在する場合は、そのポート番号(例:8080)
084 * timeout       : 通信リンクのオープン時に、指定された秒単位のタイム・アウト値を使用(例:10)
085 * keys,vals     : URLの指定時に、パラメータ(引数)を追加します。URLに含めても構いません。
086 *               : SOAPによる呼び出しの場合の詳細については、keysの属性定義を参照して下さい。
087 * postKey       : POST を使って、postFile属性のファイル内容を送信する時のキーです。
088 * postFile      : POST を使って、postFile属性のファイル内容を送信します。
089 *                 postFile を指定せず、postKey のみ指定して、BODY部に何か書き込めば、
090 *                 そのBODY部の文字列を POSTの内容として送信します。
091 * authUserPass  : Basic認証を使用する場合の接続ユーザー:パスワードを指定します。
092 *                 接続時のユーザーとパスワードを、USER:PASSWD 形式 で指定します。
093 *                 useSystemUser="false" で何も指定しない場合は、Basic認証を使用しません。
094 * useSystemUser : Basic認証の接続ユーザー:パスワードに、システムユーザーを使用
095 *                 するかどうかを指定します(初期値:true)。
096 *                 true の場合は、SYSTEM:***** を使用します。
097 * xslFile       : 接続先データを取得し、そのデータを XSLT変換する場合のXSLファイルを指定します。
098 * display       : 接続した結果のレスポンスを画面に表示するかどうかを指定します(初期値:false)。
099 *                 エンジンの場合、コマンドを投げるだけであれば、結果を取得する必要は
100 *                 ありません。イメージ的には、取得データが、このタグの位置に置き換わります。
101 *                 xslFile が指定されている場合、XSLT変換してセーブします。
102 * saveFile      : 接続先データを取得した結果を、ファイル出力します。
103 *                 display="true" と、saveFile を併用することはできません。
104 *                 xslFile が指定されている場合、XSLT変換してセーブします。
105 * soapNameSpace : SOAPによるWebサービスの呼び出しで、メソッド名及びパラメーターの名前空間を指定します。
106 *                 この名前空間は、通常WSDLファイルのdescriptionsタグのtargetNamespace属性の値により
107 *                 定義されます。
108 * soapMethodName: SOAPによるWebサービスの呼び出しで、メソッド名を指定します。
109 *                 WSDLファイルで定義されるoperationタグのname属性の値に相当します。
110 * tableId       : 結果のXMLファイルをDBTableModelに変換した際に、登録するTableIdを指定します。
111 * rowKey        : XMLをDBTableModelに変換する際の、行を表すタグキーを指定します。
112 * colKeys       : XMLをDBTableModelに変換する際の、項目を表すタグキーの一覧を指定します。
113 *                 キーにPARENT_TAG、PARENT_FULL_TAGを指定することで、rowKeyで指定されたタグの
114 *                 直近の親タグ、及びフルの親タグ名(親タグの階層を">[タグA]>[タグB]>[タグC]>"で表現)を
115 *                 取得することができます。
116 * rtnKeys       : XMLのタグキーを指定して値を取り出します。取り出した値は、{@XX}形式で処理することが可能です。
117 * encode        : データの入出力を行うエンコードを指定します。
118 *
119 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
120 *         POSTデータを記述します。
121 *
122 * ●Tag定義:
123 *   <og:urlConnect
124 *       url              ○【TAG】アクセスする URL を指定します(必須)(必須)。
125 *       proxyHost          【TAG】プロキシ経由で接続する場合の、プロキシホスト名を指定します
126 *       proxyPort          【TAG】プロキシ経由で接続する場合の、プロキシポート番号を指定します
127 *       timeout            【TAG】通信リンクのオープン時に、指定された秒単位のタイム・アウト値を使用
128 *                                  (初期値:URL_CONNECT_TIMEOUT[={@og.value org.opengion.hayabusa.common.SystemData#URL_CONNECT_TIMEOUT}])。)
129 *       keys               【TAG】アクセスパラメータキーをCSV形式で複数指定します
130 *       vals               【TAG】keys属性に対応する値をCSV形式で複数指定します
131 *       useSystemUser      【TAG】Basic認証で接続するユーザーにSYSTEMユーザーを使用するかどうか[true/false]を指定します(初期値:true)
132 *       authUserPass       【TAG】Basic認証を使用して接続する場合のユーザー:パスワードを指定します(初期値:null)
133 *       display            【TAG】接続の結果を表示するかどうかを指定します(初期値:false)
134 *       xslFile            【TAG】接続の結果を表示する場合にXSLT変換する場合のファイルを指定します
135 *       saveFile           【TAG】接続の結果をファイルに保存します
136 *       postKey            【TAG】POST を使って、postFile属性のファイル内容を送信する時のキーを指定します
137 *       postFile           【TAG】POST を使って、postFile属性のファイル内容を送信します
138 *       method             【TAG】送信メソッドを指定します(GET/POST/PUT/DELETE/SOAP)
139 *       errNeglect         【TAG】(通常は使いません) 接続エラーを無視する場合にtrueとします(初期値false)
140 *       soapNameSpace      【TAG】SOAPによるWebサービスの呼び出しで、メソッド名及びパラメーターの名前空間を指定します
141 *       soapMethodName     【TAG】SOAPによるWebサービスの呼び出しで、メソッド名を指定します
142 *       tableId            【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
143 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
144 *       rowKey             【TAG】結果のXMLをDBTableModelに変換する際に、行のキーとなるタグ名を指定します
145 *       colKeys            【TAG】結果のXMLをDBTableModelに変換する際に、項目のキーとなるタグ名の一覧を指定します
146 *       rtnKeys            【TAG】結果のXMLを変換する際に、パラメータ(Attributes)として取り込むキーの一覧を指定します
147 *       encode             【TAG】データの入出力のエンコードを指定します
148 *       mainTrans          【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)
149 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20)
150 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20)
151 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20)
152 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20)
153 *       storageType            【TAG】保存先ストレージタイプを指定します
154 *       bucketName                     【TAG】保存先バケット名を指定します
155 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
156 *   >   ... Body ...
157 *   </og:urlConnect>
158 *
159 * ●例:
160 * アドミン関連
161 * http://localhost:8823/gf/jsp/admin?COMMAND=infomation     [状況表示]
162 * http://localhost:8823/gf/jsp/admin?COMMAND=close          [プール削除]
163 * http://localhost:8823/gf/jsp/admin?COMMAND=loginUser      [ログインユーザー]
164 * http://localhost:8823/gf/jsp/admin?COMMAND=システムパラメータ [システムパラメータ]
165 *
166 * 帳票デーモン
167 * http://localhost:8823/gf/jsp/REP08/result.jsp?cmd=SET&period=5000&command=NEW&timerTask=org.opengion.hayabusa.report.ReportDaemon&name=ReportDaemon  デーモン起動
168 * http://localhost:8823/gf/jsp/REP08/result.jsp?cmd=CANCEL&period=5000&command=NEW&timerTask=org.opengion.hayabusa.report.ReportDaemon&name=ReportDaemon  デーモン停止
169 *
170 *Tomcat Manager 画面
171 * http://localhost:8823/manager/reload?path=/ver4 アプリケーションを再ロード
172 *
173 * @og.rev 3.6.0.0 (2004/09/17) 新規作成
174 * @og.rev 4.1.0.0 (2007/12/22) POSTメソッドで複数キーを登録できるように属性追加
175 * @og.rev 5.1.5.0 (2010/04/01) SOAP対応
176 * @og.rev 5.10.9.0 (2019/03/01) oota クラウドストレージ対応を追加。(Fileクラスを拡張)
177 *  
178 * @og.group その他部品
179 *
180 * @version  4.0
181 * @author   Kazuhiko Hasegawa
182 * @since    JDK5.0,
183 */
184public class URLConnectTag extends CommonTagSupport {
185        //* このプログラムのVERSION文字列を設定します。   {@value} */
186        private static final String VERSION = "5.7.7.2 (2014/06/20)" ;
187
188        private static final long serialVersionUID = 577220140620L ;
189
190        private static final String DEFAULT_USER = "SYSTEM:MANAGER" ;
191        
192        private static final String[] POST_LIST = new String[] {
193                        "POST","PUT","DELETE" }; // 5.10.10.0 (2019/03/29)
194
195        private String          urlStr                  = null;
196        private String[]        keys                    = null;
197        private String[]        vals                    = null;
198        private String          xslFile                 = null;
199        private String          saveFile                = null;
200        private String          postKey                 = null;
201        private String          postData                = null;         // postFile ファイルか、BODY部
202        private int                     timeout                 = HybsSystem.sysInt( "URL_CONNECT_TIMEOUT" );   // 5.8.8.1 (2015/06/05) 新規追加
203        private boolean         useSystemUser   = true;
204        private String          authUserPass    = null;
205        private boolean         display                 = false;
206        private String          proxyHost               = null;         // 4.0.0 (2007/07/25)
207        private int             proxyPort               = -1;           // 4.0.0 (2007/07/25)
208        private String          method                  = "GET";        // 4.1.0.0 (2007/12/22) POSTorGETorSOAP
209        private boolean         errNglctFlag    = false;        // 4.1.1.0 (2008/01/22) エラー無視フラグ
210        private String          soapNameSpace   = null;         // 5.1.5.0 (2010/04/01) SOAP対応
211        private String          soapMethodName  = null;         // 5.1.5.0 (2010/04/01) SOAP対応
212        private transient DBTableModel table                    = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
213        private String          tableId                 = HybsSystem.TBL_MDL_KEY; // 5.1.5.0 (2010/04/01) DBTableModel出力対応
214        private String          rowKey                  = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
215        private String[]        colKeys                 = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
216        private String[]        rtnKeys                 = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
217        private String          encode                  = "UTF-8";      // 5.1.6.0 (2010/05/01) エンコード指定対応
218
219        private boolean         isTableOut              = false;        // 5.1.5.0 (2010/04/01) DBTableModel出力対応
220        private boolean         isOutParse              = false;        // 5.1.5.0 (2010/04/01) DBTableModel出力対応
221        private boolean         isMainTrans             = true;         // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
222        private String          storageType             = null;         // 5.10.9.0 (2019/03/01) ADD
223        private String          bucketName              = null;         // 5.10.9.0 (2019/03/01) ADD
224        private String          contentType             = null;         // 5.10.10.2 (2019/04/12)
225        
226        /**
227         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
228         *
229         * @og.rev 5.1.5.0 (2010/04/01) SOAP・DBTableModel出力対応
230         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
231         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
232         *
233         * @return      後続処理の指示
234         */
235        @Override
236        public int doStartTag() {
237                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
238                if( !useTag() ) { return SKIP_BODY ; }
239
240                // 5.1.5.0 (2010/04/01) DBTableModel出力対応
241                if( rowKey != null || colKeys != null || rtnKeys != null ) {
242                        isOutParse = true;
243                        if( rowKey != null || colKeys != null ) {
244                                isTableOut = true;
245                                useMainTrans( isMainTrans );                    // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
246                                startQueryTransaction( tableId );
247                        }
248                }
249
250                // 5.1.5.0 (2010/04/01) SOAPの場合は、postKeyが指定されない。
251                if( postData != null ) {
252                        return SKIP_BODY ;                      // Body を評価しない
253                }
254                else {
255                        return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
256                }
257        }
258
259        /**
260         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
261         *
262         * @return      後続処理の指示(SKIP_BODY)
263         */
264        @Override
265        public int doAfterBody() {
266                postData = getBodyString();
267
268                return SKIP_BODY ;
269        }
270
271        /**
272         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
273         *
274         * @og.rev 4.0.1.0 (2007/12/12) PostKeys,PostVals処理を追加
275         * @og.rev 5.1.5.0 (2010/04/01) SOAP・DBTableModel出力対応
276         * @og.rev 5.2.0.0 (2010/09/01) エラー処理でNullPointerExceptionが発生するバグを修正
277         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
278         * @og.rev 5.10.10.0 (2019/03/29) クラウド対応修正
279         *
280         * @return      後続処理の指示
281         */
282        @Override
283        public int doEndTag() {
284                debugPrint();           // 4.0.0 (2005/02/28)
285
286                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
287                if( !useTag() ) { return EVAL_PAGE ; }
288
289                URLConnect conn = null;
290                ByteArrayOutputStream pipeOut = null;
291                try {
292                        conn = connect();
293
294                        // 出力先が、画面かファイルかを判断します。
295                        Writer outWriter = null;
296                        // 5.1.5.0 (2010/04/01) DBTableModel出力対応
297                        if( isOutParse ) {
298                        pipeOut = new ByteArrayOutputStream();
299                                try {
300                                        outWriter = new BufferedWriter( new OutputStreamWriter( pipeOut, "UTF-8" ) );
301                                }
302                                catch( UnsupportedEncodingException ex ) {
303                                        throw new HybsSystemException( "不正なエンコードが指定されました。[UTF-8]",ex );
304                                }
305                        }
306                        else if( display ) {
307                                outWriter = FileUtil.getNonFlushPrintWriter( pageContext.getOut() ) ;           // JspWriter の取得
308
309                        }
310                        else if( saveFile != null ) {
311                                outWriter = FileUtil.getPrintWriter( new File( saveFile ),"UTF-8" );
312                        }
313
314                        // 出力先が存在する場合。
315                        if( outWriter != null ) {
316                                if( xslFile != null ) {
317                                        XSLT xslt = new XSLT();
318                                        xslt.setXslFile( xslFile );
319                                        xslt.setOutFile( outWriter );
320                                        xslt.transform( conn.getReader() );
321                                        xslt.close();
322                                }
323                                else {
324                                        outWriter.write( conn.readData() );
325                                }
326                                Closer.ioClose( outWriter );
327                                
328                                // 5.10.9.0 (2019/03/01) クラウドストレージ指定の場合は、アップロードする。
329                                if( saveFile != null) { // 5.10.10.0 (2019/03/29)
330                                        FileOperation cloudFile = HybsFileOperationFactory.create(storageType, bucketName, saveFile);
331                                        if(!cloudFile.isLocal()) {
332                                                File localFile = new File(saveFile);
333                                                FileUtil.copy(localFile, cloudFile);
334                                                localFile.delete();
335                                        }
336                                }
337                        }
338                }
339                catch( IOException ex ) {
340                        String errMsg = "データ取得中にエラーが発生しました。" + HybsSystem.CR
341                                                + " url=[" + urlStr + "]"
342                                                // 5.2.0.0 (2010/09/01) エラー処理でNullPointerExceptionが発生するバグを修正
343                                                + " message=[" + ( conn == null ? "NO_CONNECTION" : conn.getMessage() ) + "]";
344                        if( errNglctFlag ) { // 4.1.1.0 (2008/01/22) エラーを無視(標準エラー出力のみ)
345                                LogWriter.log( errMsg );
346                        }
347                        else { // 通常は無視しない
348                                throw new HybsSystemException( errMsg,ex );
349                        }
350                }
351                finally {
352                        if( conn != null ) { conn.disconnect(); }
353                }
354
355                // 5.1.5.0 (2010/04/01) DBTableModel出力対応
356                if( isOutParse ) {
357                        parse( new BufferedInputStream( new ByteArrayInputStream( pipeOut.toByteArray() ) ) );
358                        if( isTableOut && table != null && !commitTableObject( tableId, table ) ) {
359                                jspPrint( "URLConnectTag Query処理が割り込まれました。DBTableModel は登録しません。" );
360                                return SKIP_PAGE ;
361                        }
362                }
363
364                return EVAL_PAGE ;
365        }
366
367        /**
368         * URLに対して接続を行います。
369         *
370         * @og.rev 5.1.6.0 (2010/05/01) エンコード指定対応
371         * @og.rev 5.8.8.1 (2015/06/12) timeout追加
372         * @og.rev 5.10.10.0 (2019/03/19) PUT.DELETE対応
373         * @og.rev 5.10.10.2 (2019/04/12) contentType
374         *
375         * @return 接続オブジェクト
376         * @throws IOException 入出力エラーが発生したとき
377         */
378        private URLConnect connect() throws IOException {
379                if( useSystemUser ) { authUserPass = DEFAULT_USER; }
380
381                // 5.1.5.0 (2010/04/01) SOAP対応
382                // SOAPの場合、PostDataは、SOAPConnectタグの中で生成します。
383                URLConnect conn = null;
384                if( "SOAP".equalsIgnoreCase( method ) ) {
385                        if( soapNameSpace == null || soapNameSpace.length() == 0
386                                        || soapMethodName == null || soapMethodName.length() == 0 ) {
387                                String errMsg = "SOAP接続の場合、soapNameSpace及びsoapMethodNameは必ず指定して下さい。";
388                                throw new HybsSystemException( errMsg );
389                        }
390
391                        if( postData != null && postData.length() > 0 ) {
392                                conn = new SOAPConnect( urlStr,authUserPass, soapNameSpace, soapMethodName, postData );
393                        }
394                        else {
395                                conn = new SOAPConnect( urlStr,authUserPass, soapNameSpace, soapMethodName, keys, vals );
396                        }
397                }
398                else {
399                        String urlEnc = XHTMLTag.urlEncode( keys,vals );
400                        if( postKey != null ) { // 4.1.0.0 (2007/12/22)
401                                if( !check(method, POST_LIST) ) {
402                                        method = "POST";
403                                }
404                                String addEnc = postKey + "=" + postData;
405                                urlEnc = urlEnc + "&" + addEnc; // &連結
406                        }
407
408//                      if( ! "POST".equals( method ) ) { // 4.1.0.0 (2007/12/22)
409                        if( !check( method, POST_LIST) ) { // 5.10.10.0 (2019/03/29)
410                                // String urlEnc = XHTMLTag.urlEncode( keys,vals );
411                                urlStr = XHTMLTag.addUrlEncode( urlStr,urlEnc );
412                        }
413                        conn = new URLConnect( urlStr,authUserPass );
414
415                        // if( postKey != null ) {
416                        //      conn.setPostData( postKey,postData );
417                        // }
418//                      if( "POST".equals( method ) && keys != null && vals != null ) { // 4.1.0.0 (2007/12/22)
419                        if( check( method, POST_LIST ) && keys != null && vals != null ) { // 5.10.10.0 (2019/03/29)
420                                conn.setPostData( urlEnc );
421                                conn.setMethodOverride( method ); // 5.10.10.0 (2019/03/29)
422                        }
423                }
424
425                // 4.0.0 (2007/07/25) プロキシの設定追加
426                if( proxyHost != null ) {
427                        conn.setProxy( proxyHost,proxyPort );
428                }
429
430                // 5.1.6.0 (2010/05/01) エンコード指定対応
431                if( encode != null && encode.length() > 0 ) {
432                        conn.setCharset( encode );
433                }
434                
435                // 5.8.8.1 (2015/06/12) timeout属性追加
436                if( timeout >= 0 ) {
437                        conn.setTimeout( timeout );
438                }
439
440                // 5.10.10.2 (2019/04/12)
441                if( contentType != null && contentType.length() > 0 ){
442                        conn.setConentType( contentType );
443        }
444                conn.connect();
445
446                return conn;
447        }
448
449        /**
450         * 出力データをパースし、DBTableModel及び属性パラメーターに分解します。
451         * 現時点では、XMLデータのみパースすることが可能です。
452         *
453         * @param input インプットストリーム
454         */
455        private void parse( final InputStream input ) {
456                XML2TableParser parser = new XML2TableParser( input );
457                parser.setTableCols( rowKey, colKeys );
458                parser.setReturnCols( rtnKeys );
459                parser.parse();
460
461                // DBTableModelを生成します。
462                if( isTableOut ) {
463                        table = DBTableModelUtil.makeDBTable( parser.getCols(), parser.getData(), getResource() );
464                }
465
466                // 戻り値を取得し、Attributeに登録します。
467                if( rtnKeys != null ) {
468                        Map<String,String> rtn = parser.getRtn();
469                        for( Map.Entry<String, String> entry : rtn.entrySet() ) {
470                                setRequestAttribute( entry.getKey(), entry.getValue() );
471                        }
472                }
473        }
474
475        /**
476         * タグリブオブジェクトをリリースします。
477         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
478         *
479         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
480         * @og.rev 5.8.1.1 (2015/06/12) timeout追加
481         * @og.rev 5.10.9.0 (2019/03/01) storageType,bucketNameの初期を追加
482         *
483         */
484        @Override
485        protected void release2() {
486                super.release2();
487                urlStr                  = null;
488                proxyHost               = null;         // 4.0.0 (2007/07/25)
489                proxyPort               = -1;           // 4.0.0 (2007/07/25)
490                keys                    = null;
491                vals                    = null;
492                xslFile                 = null;
493                saveFile                = null;
494                postKey                 = null;
495                postData                = null;
496                timeout                 = HybsSystem.sysInt( "URL_CONNECT_TIMEOUT" );   // 5.8.1.1 (2015/06/05) 新規追加
497                useSystemUser   = true;
498                authUserPass    = null;
499                display                 = false;
500                method                  = "GET";        // 4.1.0.0 (2007/12/22)
501                errNglctFlag    = false;        // 4.1.1.0 (2008/01/22)
502                soapNameSpace   = null;         // 5.1.5.0 (2010/04/01) SOAP対応
503                soapMethodName  = null;         // 5.1.5.0 (2010/04/01) SOAP対応
504                table                   = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
505                tableId                 = HybsSystem.TBL_MDL_KEY; // 5.1.5.0 (2010/04/01) DBTableModel出力対応
506                rowKey                  = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
507                colKeys                 = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
508                rtnKeys                 = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
509                isTableOut              = false;        // 5.1.5.0 (2010/04/01) DBTableModel出力対応
510                isOutParse              = false;        // 5.1.5.0 (2010/04/01) DBTableModel出力対応
511                encode                  = "UTF-8";      // 5.1.6.0 (2010/05/01) エンコード指定対応
512                isMainTrans             = true;         // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
513                storageType             = null;         // 5.10.9.0 (2019/03/01) ADD
514                bucketName              = null;         // 5.10.9.0 (2019/03/01) ADD
515                contentType             = null;         // 5.10.10.2 (2019/04/12)
516        }
517
518        /**
519         * 【TAG】アクセスする URL を指定します(必須)。
520         *
521         * @og.tag
522         * 接続するURLを指定します。(例:http:// ・・・・・・)
523         * ?以降のパラメータが含まれていても構いません。
524         * このURL に、keys,vals で指定されたパラメータも追加されます。
525         *
526         * @param       url     アクセスする URL
527         */
528        public void setUrl( final String url ) {
529                urlStr = nval( getRequestParameter( url ),urlStr );
530        }
531
532        /**
533         * 【TAG】プロキシ経由で接続する場合の、プロキシホスト名を指定します。
534         *
535         * @og.tag
536         * 接続先が、プロキシ経由の場合、プロキシのホスト名を指定します。
537         * 例:proxy.opengion.org
538         *
539         * @param       host    プロキシホスト名
540         */
541        public void setProxyHost( final String host ) {
542                proxyHost = nval( getRequestParameter( host ),proxyHost );
543                useSystemUser = false;  // プロキシ接続時は、システムユーザーは使えません。
544        }
545
546        /**
547         * 【TAG】プロキシ経由で接続する場合の、プロキシポート番号を指定します。
548         *
549         * @og.tag
550         * 接続先が、プロキシ経由の場合、プロキシのポート番号を指定します。
551         * 例:8080
552         *
553         * @param       port    プロキシポート番号
554         */
555        public void setProxyPort( final String port ) {
556                proxyPort = nval( getRequestParameter( port ),proxyPort );
557        }
558
559        /**
560         * 【TAG】アクセスパラメータキーをCSV形式で複数指定します。
561         *
562         * @og.tag
563         * アクセスする URLに追加するパラメータのキーを指定します。
564         * カンマ区切りで複数指定できます。
565         * vals 属性には、キーに対応する値を、設定してください。
566         * 例:<b>keys="command,SYSTEM_ID"</b> vals="NEW,GE"
567         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
568         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
569         *
570         * [SOAP対応]
571         * SOAPによるWebサービスの呼び出しの場合、keys,valsに指定された値より、env:Envelopタグを
572         * rootタグとするXMLデータを生成します。
573         * (BODY部分に直接XMLデータを出力することも可能です。)
574         * この際、項目名に'&gt;'を含めることで、階層的なXMLデータを表現することができます。
575         * 例)
576         *   [属性定義]
577         *   keys="param0&gt;AAA,param0&gt;BBB,param1&gt;CCC,DDD"
578         *   vals="v1,v2,v3,v4"
579         *   [XMLデータ(※データ部のみ)]
580         *   &lt;param0&gt;
581         *     &lt;AAA&gt;v1&lt;/AAA&gt;
582         *     &lt;BBB&gt;v2&lt;/BBB&gt;
583         *   &lt;/param0&gt;
584         *   &lt;param1&gt;
585         *     &lt;CCC&gt;v3&lt;/CCC&gt;
586         *   &lt;/param1&gt;
587         *   &lt;DDD&gt;v4&lt;/DDD&gt;
588         * 項目の値を"null"とすることで、XMLで言うところの「xsi:nil=\"true\"」のデータを表現すること
589         * もできます。
590         * また、キー名の先頭を'&#064;'にすることで、項目名に名前空間のPREFIXを付加することができます。
591         * 一般的には、JavaやRubyで実装されたWebサービスを呼び出しする場合は、必要ありませんが、
592         * .NETで実装されたWebサービスを呼び出しする場合は、各項目にPREFIXを付与しないと、正しく
593         * パラメーターを渡すことができません。
594         * ※現時点では、keysの階層定義は、2階層まで対応しています。
595         *   3階層以上のXML構造を定義する場合は、postFile属性によるファイル指定又は、Body部分で直接
596         *   XMLデータを記述して下さい。
597         *
598         * @param       key リンク先に渡すキー
599         * @see         #setVals( String )
600         */
601        public void setKeys( final String key ) {
602                keys = getCSVParameter( key );
603        }
604
605        /**
606         * 【TAG】keys属性に対応する値をCSV形式で複数指定します。
607         *
608         * @og.tag
609         * キーに設定した値を、カンマ区切り文字で複数して出来ます。
610         * 指定順序は、キーと同じにしておいて下さい。
611         * 例:<b>keys="command,SYSTEM_ID"</b> vals="NEW,GE"
612         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
613         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
614         *
615         * @param       val names属性に対応する値
616         * @see         #setKeys( String )
617         */
618        public void setVals( final String val ) {
619                vals = getCSVParameter( val );
620        }
621
622        /**
623         * 【TAG】送信メソッドを指定します(GET/POST/SOAP)。
624         *
625         * @og.tag
626         * URLConnectTagのメソッドの初期設定はGETです。
627         * ここで"POST"(大文字)を指定するとkyes,valsの値セットをPOSTで送信します。
628         * postKeyが設定されている場合はこの値に関係なくPOSTです。
629         * (PUT,DELETEの場合もPOST同様の動作をしますがX-HTTP-Method-Overrideを付加します)
630         * 
631         *
632         * @og.rev 4.1.0.0 (2007/12/22) 新規作成
633         *
634         * @param       post_get        送信メソッド(GET/POST/SOAP)
635         */
636        public void setMethod ( final String post_get ) {
637                method = nval( getRequestParameter( post_get ), method );
638        }
639
640        /**
641         * 【TAG】Basic認証で接続するユーザーにSYSTEMユーザーを使用するかどうか[true/false]を指定します(初期値:true)。
642         *
643         * @og.tag
644         * useSystemUser="true"(初期値) の場合、URL接続時のコネクションに、Basic認証を
645         * 使用しますが、その時のユーザーにシステムユーザー(SYSTEM)を使用します。
646         * useSystemUser="false"の場合は、authUserPass で指定したユーザー:パスワードを
647         * 使用します。authUserPass で、何も指定されなかった場合は、Basic認証を使用しません。
648         * 初期値は、true(SYSTEMユーザー認証する) です。
649         *
650         * @param   flag [true:SYSTEMユーザー認証する/false:この接続のユーザーで認証する]
651         * @see #setAuthUserPass( String )
652         */
653        public void setUseSystemUser( final String flag ) {
654                useSystemUser = nval( getRequestParameter( flag ),useSystemUser );
655        }
656
657        /**
658         * 【TAG】Basic認証を使用して接続する場合のユーザー:パスワードを指定します(初期値:null)。
659         *
660         * @og.tag
661         * 接続時のユーザーとパスワードを、USER:PASSWD 形式で指定します。
662         * useSystemUser="false"の場合は、ここで指定したユーザーとパスワードを使用します。
663         * その場合に、何も指定しない場合は、Basic認証を使用しません。
664         *
665         * @param       userPass        接続のユーザーとパスワード(USER:PASSWD 形式)
666         * @see #setUseSystemUser( String )
667         */
668        public void setAuthUserPass( final String userPass ) {
669                authUserPass = nval( getRequestParameter( userPass ),authUserPass );
670        }
671
672        /**
673         * 【TAG】接続の結果を表示する場合にXSLT変換する場合のファイルを指定します。
674         *
675         * @og.tag
676         *
677         * 接続先のデータが、XML形式の場合、そのままでは、画面出力できない場合が
678         * あります。通常は、HTML形式に変換しますが、その変換に、 XSL ファイルを
679         * 指定することが可能です。
680         * display="true" の場合や、saveFile を指定した場合に、適用されます。
681         *
682         * @param       file    接続の結果を表示する場合にXSLT変換する場合のファイル
683         * @see #setSaveFile( String )
684         * @see #setDisplay( String )
685         */
686        public void setXslFile( final String file ) {
687                xslFile = HybsSystem.url2dir( nval( getRequestParameter( file ),xslFile ) );
688        }
689
690        /**
691         * 【TAG】接続の結果を表示するかどうかを指定します(初期値:false)。
692         *
693         * @og.tag
694         * true で、接続結果を表示します。 false では、何も表示しません(初期値:false)
695         * 接続結果を表示する使い方より、admin 画面に接続して、キャッシュクリアするような
696         * 使い方が多いと考え、初期値は、false になっています。
697         * xslFile が指定されている場合、XSLT変換して画面表示します。
698         * display="true" と、saveFile を併用することはできません。
699         *
700         * @param       flag    接続の結果を表示するかどうか(初期値:false)
701         * @see #setSaveFile( String )
702         * @see #setXslFile( String )
703         */
704        public void setDisplay( final String flag ) {
705                display = nval( getRequestParameter( flag ),display );
706
707                if( display && saveFile != null ) {
708                        String errMsg = "display=\"true\" と、saveFile を併用することはできません。";
709                        throw new HybsSystemException( errMsg );
710                }
711        }
712
713        /**
714         * 【TAG】接続の結果をファイルに保存します。
715         *
716         * @og.tag
717         * 接続先のデータを受け取って、ファイルに保存します。その場合、
718         * xslFile が指定されている場合、XSLT変換してセーブします。
719         * display="true" と、saveFile を併用することはできません。
720         *
721         * @param       file    接続の結果を表示する場合にXSLT変換する場合のファイル
722         * @see #setXslFile( String )
723         * @see #setDisplay( String )
724         */
725        public void setSaveFile( final String file ) {
726                saveFile = HybsSystem.url2dir( nval( getRequestParameter( file ),saveFile ) );
727
728                if( display ) {
729                        String errMsg = "display=\"true\" と、saveFile を併用することはできません。";
730                        throw new HybsSystemException( errMsg );
731                }
732        }
733
734        /**
735         * 【TAG】POST を使って、postFile属性のファイル内容を送信する時のキーを指定します。
736         *
737         * @og.tag
738         * 接続先にパラメータ(引数)を投げる場合に、POST を使用できます。
739         * そのときの キーをここで指定します。
740         * POSTするデータは、postFileで指定されたファイルか、BODY部に記述された文字列です。
741         *
742         * @param       key     POST を使って、postFile属性のファイル内容を送信する時のキー
743         * @see  #setPostFile( String )
744         */
745        public void setPostKey( final String key ) {
746                postKey = nval( getRequestParameter( key ),postKey );
747        }
748
749        /**
750         * 【TAG】POST を使って、postFile属性のファイル内容を送信します。
751         *
752         * @og.tag
753         * 接続先にパラメータ(引数)を投げる場合に、POST を使用できます。
754         * そのときの 送信データのファイルをここで指定します。
755         * postKey のみ指定されて、postFile が指定されない場合は、BODY部を送信します。
756         * SOAPによる呼び出しの場合は、ここ(BODY部での定義を含む)で、送信するXMLデータを
757         * 定義することができます。
758         *
759         * @param       file    接続の結果を表示する場合にXSLT変換する場合のファイル
760         * @see  #setPostKey( String )
761         */
762        public void setPostFile( final String file ) {
763                String postFile = nval( getRequestParameter( file ),null );
764
765                if( postFile != null ) {
766                        FileString fileStr = new FileString();
767                        fileStr.setFilename( HybsSystem.url2dir( postFile ) );
768                        postData = fileStr.getValue();
769                }
770        }
771        
772        /**
773         * 【TAG】接続タイムアウト時間を(秒)で指定します
774         *              (初期値:URL_CONNECT_TIMEOUT[={@og.value org.opengion.hayabusa.common.SystemData#URL_CONNECT_TIMEOUT}])。
775         *
776         * @og.tag
777         * 実際には、java.net.URLConnection#setConnectTimeout(int) に 1000倍して設定されます。
778         * 0 は、無限のタイムアウト、マイナスは、設定しません。(つまりJavaの初期値のまま)
779         * (初期値:システム定数のURL_CONNECT_TIMEOUT[={@og.value org.opengion.hayabusa.common.SystemData#URL_CONNECT_TIMEOUT}])。
780         *
781         * @og.rev 5.8.1.1 (2015/06/12) timeout属性追加
782         *
783         * @param       tout    タイムアウト時間(秒) (ゼロは、無制限)
784         * @see         org.opengion.fukurou.util.URLConnect#setTimeout(int)
785         * @see         java.net.URLConnection#setConnectTimeout(int)
786         */
787        public void setTimeout( final String tout ) {
788                timeout = nval( getRequestParameter( tout ),timeout );
789        }
790
791        /**
792         * 【TAG】(通常は使いません) 接続エラーを無視する場合にtrueとします(初期値false)。
793         *
794         * @og.tag
795         * trueにするとConnectで発生したエラーを投げずに処理を続行します。
796         * (標準エラー出力にエラー内容は出力されます)
797         * 接続エラーが発生しても処理を中断したくない場合に設定します。
798         *
799         * @og.rev 4.1.1.0 (2008/01/22) 新規追加
800         *
801         * @param       flag    エラーを無視する場合にtrue
802         */
803        public void setErrNeglect( final String flag ) {
804                errNglctFlag = nval( getRequestParameter( flag ), errNglctFlag );
805        }
806
807        /**
808         * 【TAG】SOAPによるWebサービスの呼び出しで、メソッド名及びパラメーターの名前空間を指定します。
809         *
810         * @og.tag
811         * SOAPによるWebサービスの呼び出しで、メソッド名及びパラメーターの名前空間を指定します。
812         * この名前空間は、通常WSDLファイルのdescriptionsタグのtargetNamespace属性の値により
813         * 定義されます。
814         *
815         * @og.rev 5.1.5.0 (2010/04/01) 新規追加
816         *
817         * @param       ns      名前空間
818         */
819        public void setSoapNameSpace( final String ns ) {
820                soapNameSpace = nval( getRequestParameter( ns ), soapNameSpace );
821        }
822
823        /**
824         * 【TAG】SOAPによるWebサービスの呼び出しで、メソッド名を指定します。
825         *
826         * @og.tag
827         * SOAPによるWebサービスの呼び出しで、メソッド名を指定します。
828         * WSDLファイルで定義されるoperationタグのname属性の値に相当します。
829         *
830         * @og.rev 5.1.5.0 (2010/04/01) 新規追加
831         *
832         * @param       method  メソッド名
833         */
834        public void setSoapMethodName( final String method ) {
835                soapMethodName = nval( getRequestParameter( method ), soapMethodName );
836        }
837
838        /**
839         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
840         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
841         *
842         * @og.tag
843         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
844         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
845         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
846         * この tableId 属性を利用して、メモリ空間を分けます。
847         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
848         *
849         * @param       id sessionに登録する時の ID
850         */
851        public void setTableId( final String id ) {
852                tableId   = nval( getRequestParameter( id ),tableId );
853        }
854
855        /**
856         * 【TAG】結果のXMLをDBTableModelに変換する際に、行のキーとなるタグ名を指定します。
857         *
858         * @og.tag
859         * 結果のXMLを表形式に変換する際に、行のキーとなるタグ名を指定します。
860         * このキーのタグを基点として、colKeysで指定されたタグの値を各項目の値として取り込みます。
861         * (詳細は、colKeysのタグリブ属性マニュアルを参照して下さい。)
862         *
863         * @param       key 行のキーとなるタグ名
864         * @see #setColKeys( String )
865         */
866        public void setRowKey( final String key ) {
867                rowKey = nval( getRequestParameter( key ),rowKey );
868        }
869
870        /**
871         * 【TAG】結果のXMLをDBTableModelに変換する際に、項目のキーとなるタグ名の一覧を指定します。
872         *
873         * @og.tag
874         * 結果のXMLをDBTableModelに変換する際に、項目のキーとなるタグ名の一覧を指定します。
875         * rowKeyで行を、colKeysで項目を表現し、rowKeyのタグで囲われた固まりを1つの行とみなします。
876         * このため、colKeysに指定されたキーのタグでも、rowKeyの外にある場合は、取り込み対象となりません。
877         *
878         * また、キーにPARENT_TAG、PARENT_FULL_TAGを指定することで、rowKeyで指定されたタグの
879         * 直近の親タグ、及びフルの親タグ名(親タグの階層を"&gt;[タグA]&gt;[タグB]&gt;[タグC]&gt;"で表現)を
880         * 取得することができます。
881         *
882         * @param       keys 項目のキーとなるタグ名の一覧
883         */
884        public void setColKeys( final String keys ) {
885                colKeys = StringUtil.csv2Array( getRequestParameter( keys ) );
886        }
887
888        /**
889         * 【TAG】結果のXMLを変換する際に、パラメータ(Attributes)として取り込むキーの一覧を指定します。
890         *
891         * @og.tag
892         * 結果のXMLを変換する際に、パラメータ(Attributes)として取り込むキーの一覧を指定します。
893         * ここで指定されたキーのタグの値を取り出し、{&#064;XX}形式(Attributes)として処理できるようにします。
894         *
895         * @param       keys パラメーター(Attributes)のキーとなるタグ名の一覧
896         */
897        public void setRtnKeys( final String keys ) {
898                rtnKeys = StringUtil.csv2Array( getRequestParameter( keys ) );
899        }
900
901        /**
902         * 【TAG】データの入出力のエンコードを指定します。
903         *
904         * @og.tag
905         * データの入出力のエンコードを指定します。
906         * 初期値は、"UTF-8"です。
907         *
908         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
909         * @param       enc     エンコード
910         */
911        public void setEncode( final String enc ) {
912                encode = nval( getRequestParameter( enc ), encode );
913        }
914
915        /**
916         * タグの名称を、返します。
917         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
918         *
919         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
920         *
921         * @return  タグの名称
922         */
923        @Override
924        protected String getTagName() {
925                return "urlConnect" ;
926        }
927
928        /**
929         * 【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)。
930         *
931         * @og.tag
932         * (通常使いません)タグで処理される処理が、メインとなるトランザクション処理かどうかを指定します。(初期値:false)
933         * この値は、ファイルダウンロード処理に影響します。この値がtrueに指定された時にcommitされたDBTableModelが
934         * ファイルダウンロードの対象の表になります。
935         *
936         * このパラメーターは、通常、各タグにより実装され、ユーザーが指定する必要はありません。
937         * 但し、1つのJSP内でDBTableModelが複数生成される場合に、前に処理したDBTableModelについてファイルダウンロードをさせたい
938         * 場合は、後ろでDBTableModelを生成するタグで、明示的にこの値をfalseに指定することで、ファイルダウンロード処理の対象から
939         * 除外することができます。
940         *
941         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
942         *
943         * @param  flag メイントランザクションかどうか
944         */
945        public void setMainTrans( final String flag ) {
946                isMainTrans = nval( getRequestParameter( flag ),isMainTrans );
947        }
948
949        /**
950         * 【TAG】保存先ストレージタイプを設定します。
951         *  
952         * @og.tag
953         * ファイルを読み取り元の、ストレージタイプを設定します。
954         * 未設定の場合は、システムリソースの「CLOUD_TARGET」が参照されます。
955         * 自身のサーバを指定する場合は、「default」を設定してください。
956         * 
957         * @og.rev 5.10.9.0 (2019/03/01) 新規追加
958         * 
959         * @param storage 保存先ストレージタイプ
960         */
961        public void setStorageType( final String storage ) {
962                storageType = nval( getRequestParameter( storage ), storageType );
963        }
964        
965        /**
966         * 【TAG】保存先バケット名を設定します。
967         * 
968         * @og.tag
969         * ファイルを読み取り元の、バケット名を指定します。
970         * クラウドストレージ利用時のみ有効です。
971         * 未設定の場合は、システムリソースの「CLOUD_BUKET」が参照されます。
972         * 
973         * @og.rev 5.10.9.0 (2019/03/01) 新規追加
974         * 
975         * @param bucket 保存先バケット名
976         */
977        public void setBucketName( final String bucket ) {
978                bucketName = nval( getRequestParameter( bucket ), bucketName );
979        }
980        
981        /**
982         * 【TAG】送信ヘッダのコンテントタイプを指定します。
983         * 
984         * 通常は指定不要です。
985         * API等でapplication/json等を指定された場合に設定してください。
986         * 
987         * @og.rev 5.10.10.2 (2019/04/12) 追加
988         * 
989         * @param ctype コンテントタイプ
990         */
991        public void setContentType( final String ctype ) {
992                contentType = nval( getRequestParameter( ctype ), contentType );
993        }
994        
995        /**
996         * このオブジェクトの文字列表現を返します。
997         * 基本的にデバッグ目的に使用します。
998         *
999         * @og.rev 5.10.9.0 (2019/03/01) storageType,bucketNameを出力対象に追加。
1000         * 
1001         * @return このクラスの文字列表現
1002         */
1003        @Override
1004        public String toString() {
1005                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
1006                                .println( "VERSION"                     ,VERSION                )
1007                                .println( "method"                      ,method                 )
1008                                .println( "urlStr"                      ,urlStr                 )
1009                                .println( "keys"                        ,StringUtil.array2csv( keys ) )
1010                                .println( "vals"                        ,StringUtil.array2csv( vals ) )
1011                                .println( "proxyHost"           ,proxyHost              )
1012                                .println( "proxyPort"           ,proxyPort              )
1013                                .println( "timeout"                     ,timeout                )               // 5.8.1.1 (2015/06/12) 新規追加
1014                                .println( "useSystemUser"       ,useSystemUser  )
1015                                .println( "authUserPass"        ,authUserPass   )
1016                                .println( "display"                     ,display                )
1017                                .println( "postData"            ,postData               )
1018                                .println( "xslFile"                     ,xslFile                )
1019                                .println( "saveFile"            ,saveFile               )
1020                                .println( "errNglctFlag"        ,errNglctFlag   )
1021                                .println( "soapNameSpace"       ,soapNameSpace  )
1022                                .println( "soapMethodName"      ,soapMethodName )
1023                                .println( "tableId"                     ,tableId                )
1024                                .println( "rowKey"                      ,rowKey                 )
1025                                .println( "colKeys"                     ,StringUtil.array2csv( colKeys ) )
1026                                .println( "rtnKeys"                     ,StringUtil.array2csv( rtnKeys ) )
1027                                .println( "storageType"         ,storageType    )
1028                                .println( "bucketName"          ,bucketName             )
1029                                .println( "contentType"         ,contentType    )
1030                                .println( "Other..."            ,getAttributes().getAttribute() )
1031                                .fixForm().toString() ;
1032        }
1033}