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