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 java.io.BufferedInputStream;
019import java.io.ByteArrayInputStream;
020import java.io.ByteArrayOutputStream;
021import java.io.File;
022import java.io.IOException;
023import java.io.InputStream;
024import java.io.StringReader;                                                                    // 6.9.0.0 (2018/01/31)
025import java.io.Writer;
026import java.util.Map;
027
028import org.opengion.fukurou.system.LogWriter;
029import org.opengion.fukurou.system.Closer;
030import org.opengion.fukurou.system.HybsConst;                                   // 6.4.5.2 (2016/05/06)
031import org.opengion.fukurou.util.FileUtil;
032import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
033import org.opengion.fukurou.util.ArraySet;                                              // 5.10.10.0 (2019/03/29)
034// import org.opengion.fukurou.util.SOAPConnect;                                // 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
035import org.opengion.fukurou.util.StringUtil;
036// import org.opengion.fukurou.util.URLConnect;                                 // 6.9.0.0 (2018/01/31) URLConnect 廃止
037import org.opengion.fukurou.util.HttpConnect;                                   // 6.9.0.0 (2018/01/31) 新規追加
038// import org.opengion.fukurou.util.XHTMLTag;
039import org.opengion.fukurou.xml.XML2TableParser;
040import org.opengion.fukurou.xml.XSLT;
041import org.opengion.hayabusa.common.HybsSystem;
042import org.opengion.hayabusa.common.HybsSystemException;
043import org.opengion.hayabusa.db.DBTableModel;
044import org.opengion.hayabusa.db.DBTableModelUtil;
045import org.opengion.hayabusa.io.HybsFileOperationFactory;               // 8.0.0.1 (2021/10/08)
046// import org.opengion.fukurou.model.FileOperation;                             // 8.0.0.1 (2021/10/08)
047
048import static org.opengion.fukurou.util.StringUtil.nval;
049
050import java.util.Set;                                                                                   // 5.10.10.0 (2019/03/29)
051
052/**
053 * 指定のURLに接続します。
054 *
055 * エンジンでは、URL にアクセスすることで、デーモンを起動したり、
056 * コマンドを実行(adminメニュー)することが出来ます。
057 * もちろん、検索条件を指定して、結果を取得することも可能です。
058 * このタグでは、URLにアクセスして、コマンドを実行したり結果を取得できます。
059 * さらに、ファイルを POST で転送したり、処理結果を XSLT変換したり出来ます。
060 *
061 * @og.formSample
062 * ●形式:
063 *     <og:urlConnect
064 *         url           = "http://・・・ "    必須
065 *         proxyHost     = "proxy.opengion.org"
066 *         proxyPort     = "8080"
067 *         timeout       = "1"
068 *         keys          = "command,SYSTEM_ID"
069 *         vals          = "NEW,GE"
070 *         useSystemUser = "true/false"     初期値:true
071 *         authUserPass  = "admin:******"   初期値:admin:******
072 *         display       = "false/true"     初期値:false
073 *         xslFile       = "filter.xsl"
074 *         saveFile      = "outdata.xml"
075 *    ×   soapNameSpace = "MyWebService"        6.9.0.0 (2018/01/31) 廃止
076 *    ×   soapMethodName= "test"                        6.9.0.0 (2018/01/31) 廃止
077 *         tableId       = "DEFAULT"
078 *         rowKey        = "item"
079 *         colKeys       = "person_id,person_name"
080 *         rtnKeys       = "version,summary"
081 *         encode        = "UTF-8"
082 *     />
083 *
084 * url           : 接続するURLを指定します。必須属性です。
085 * proxyHost     : proxy が存在する場合は、そのホスト名(例:proxy.opengion.org)
086 * proxyPort     : proxy が存在する場合は、そのポート番号(例:8080)
087 * timeout       : 通信リンクのオープン時に、指定された秒単位のタイム・アウト値を使用(例:1)
088 * keys,vals     : URLの指定時に、パラメータ(引数)を追加します。URLに含めても構いません。
089 *               : SOAPによる呼び出しの場合の詳細については、keysの属性定義を参照して下さい。
090 * postKey       : POST を使って、postFile属性のファイル内容を送信する時のキーです。
091 * postFile      : POST を使って、postFile属性のファイル内容を送信します。
092 *                 postFile を指定せず、postKey のみ指定して、BODY部に何か書き込めば、
093 *                 そのBODY部の文字列を POSTの内容として送信します。
094 * authUserPass  : Basic認証を使用する場合の接続ユーザー:パスワードを指定します。
095 *                 接続時のユーザーとパスワードを、USER:PASSWD 形式 で指定します。
096 *                 useSystemUser="false" で何も指定しない場合は、Basic認証を使用しません。
097 * useSystemUser : Basic認証の接続ユーザー:パスワードに、システムユーザーを使用
098 *                 するかどうかを指定します(初期値:true)。
099 *                 true の場合は、SYSTEM:***** を使用します。
100 * xslFile       : 接続先データを取得し、そのデータを XSLT変換する場合のXSLファイルを指定します。
101 * display       : 接続した結果のレスポンスを画面に表示するかどうかを指定します(初期値:false)。
102 *                 エンジンの場合、コマンドを投げるだけであれば、結果を取得する必要は
103 *                 ありません。イメージ的には、取得データが、このタグの位置に置き換わります。
104 *                 xslFile が指定されている場合、XSLT変換してセーブします。
105 * saveFile      : 接続先データを取得した結果を、ファイル出力します。
106 *                 display="true" と、saveFile を併用することはできません。
107 *                 xslFile が指定されている場合、XSLT変換してセーブします。
108 * X soapNameSpace : 廃止:SOAPによるWebサービスの呼び出しで、メソッド名及びパラメーターの名前空間を指定します。
109 *                 この名前空間は、通常WSDLファイルのdescriptionsタグのtargetNamespace属性の値により
110 *                 定義されます。  6.9.0.0 (2018/01/31) 廃止
111 * X soapMethodName: 廃止:SOAPによるWebサービスの呼び出しで、メソッド名を指定します。
112 *                 WSDLファイルで定義されるoperationタグのname属性の値に相当します。 6.9.0.0 (2018/01/31) 廃止
113 * tableId       : 結果のXMLファイルをDBTableModelに変換した際に、登録するTableIdを指定します。
114 * rowKey        : XMLをDBTableModelに変換する際の、行を表すタグキーを指定します。
115 * colKeys       : XMLをDBTableModelに変換する際の、項目を表すタグキーの一覧を指定します。
116 *                 キーにPARENT_TAG、PARENT_FULL_TAGを指定することで、rowKeyで指定されたタグの
117 *                 直近の親タグ、及びフルの親タグ名(親タグの階層を">[タグA]>[タグB]>[タグC]>"で表現)を
118 *                 取得することができます。
119 * rtnKeys       : XMLのタグキーを指定して値を取り出します。取り出した値は、{@XX}形式で処理することが可能です。
120 * encode        : データの入出力を行うエンコードを指定します。
121 * authJson      : JSONコードで認証する場合に使用します。8.0.0.0 (2021/08/31)
122 * authURL       : JSONコードで認証するURLを指定します。8.0.0.0 (2021/08/31)
123 * reqJson       : JSONコードでリクエストするパラメータを指定します。8.0.0.0 (2021/09/30)
124 *
125 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
126 *         POSTデータを記述します。
127 *
128 * ●Tag定義:
129 *   <og:urlConnect
130 *       url              ○【TAG】アクセスする URL を指定します(必須)(必須)。
131 *       proxyHost          【TAG】プロキシ経由で接続する場合の、プロキシホスト名を指定します
132 *       proxyPort          【TAG】プロキシ経由で接続する場合の、プロキシポート番号を指定します
133 *       timeout            【TAG】通信リンクのオープン時に、指定された秒単位のタイム・アウト値を使用
134 *                                  (初期値:URL_CONNECT_TIMEOUT[={@og.value SystemData#URL_CONNECT_TIMEOUT}])。)
135 *       keys               【TAG】アクセスパラメータキーをCSV形式で複数指定します
136 *       vals               【TAG】keys属性に対応する値をCSV形式で複数指定します
137 *       useSystemUser      【TAG】Basic認証で接続するユーザーにSYSTEMユーザーを使用するかどうか[true/false]を指定します(初期値:true)
138 *       authUserPass       【TAG】Basic認証を使用して接続する場合のユーザー:パスワードを指定します(初期値:null)
139 *       display            【TAG】接続の結果を表示するかどうかを指定します(初期値:false)
140 *       xslFile            【TAG】接続の結果を表示する場合にXSLT変換する場合のファイルを指定します
141 *       saveFile           【TAG】接続の結果をファイルに保存します
142 *       postKey            【TAG】POST を使って、postFile属性のファイル内容を送信する時のキーを指定します
143 *       postFile           【TAG】POST を使って、postFile属性のファイル内容を送信します
144 *       method             【TAG】送信メソッド[GET/POST/PUT/DELETE/SOAP]を指定します(初期値:GET)
145 *       errNeglect         【TAG】(通常は使いません) 接続エラーを無視する場合にtrueとします(初期値false)
146 *       tableId            【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
147 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session)
148 *       rowKey             【TAG】結果のXMLをDBTableModelに変換する際に、行のキーとなるタグ名を指定します
149 *       colKeys            【TAG】結果のXMLをDBTableModelに変換する際に、項目のキーとなるタグ名の一覧を指定します
150 *       rtnKeys            【TAG】結果のXMLを変換する際に、パラメータ(Attributes)として取り込むキーの一覧を指定します
151 *       encode             【TAG】データの入出力のエンコードを指定します(初期値:UTF-8)
152 *       mainTrans          【TAG】(通常は使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)
153 *       propKeys           【TAG】コネクションのrequestParameterに渡すキーをCSV形式で複数指定します。 5.10.16.0 (2019/10/04)
154 *       propVals           【TAG】コネクションのrequestParameterに渡す値をCSV形式で複数指定します。 5.10.16.0 (2019/10/04)
155 *       postDataOnly       【TAG】trueの場合はキ-=値から、値のみ送信に変更します。(jsonを送信する場合等に利用) 5.10.19.0 (2019/12/27)
156 *       authJson           【TAG】JSONコードで認証する場合に使用します。8.0.0.0 (2021/08/31)
157 *       authURL            【TAG】JSONコードで認証するURLを指定します。8.0.0.0 (2021/08/31)
158 *       reqJson            【TAG】JSONコードでリクエストするパラメータを指定します。8.0.0.0 (2021/09/30)
159 *       useLocal           【TAG】システム定数でクラウド設定されていても、クラウド環境を使用しない場合、trueを指定します(初期値:false) 8.0.1.0 (2021/10/29)
160 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20)
161 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20)
162 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20)
163 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20)
164 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
165 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
166 *   >   ... Body ...
167 *   </og:urlConnect>
168 *
169 * 【廃止】6.9.0.0 (2018/01/31) 物理削除
170 *   //  soapNameSpace      【廃止】SOAPによるWebサービスの呼び出しで、メソッド名及びパラメーターの名前空間を指定します ( 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正)
171 *   //  soapMethodName     【廃止】SOAPによるWebサービスの呼び出しで、メソッド名を指定します ( 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正)
172 *   //  storageType        【廃止】保存先ストレージタイプを指定します 5.10.9.0 (2019/03/01) 8.0.1.0 (2021/10/29) del
173 *   //  bucketName         【廃止】保存先バケット名を指定します 5.10.9.0 (2019/03/01) 8.0.1.0 (2021/10/29) del
174 *
175 * ●例:
176 * アドミン関連
177 * http://localhost:8823/gf/jsp/admin?COMMAND=infomation     [状況表示]
178 * http://localhost:8823/gf/jsp/admin?COMMAND=close          [プール削除]
179 * http://localhost:8823/gf/jsp/admin?COMMAND=loginUser      [ログインユーザー]
180 * http://localhost:8823/gf/jsp/admin?COMMAND=システムパラメータ [システムパラメータ]
181 *
182 * 帳票デーモン
183 * http://localhost:8823/gf/jsp/REP08/result.jsp?cmd=SET&period=5000&command=NEW&timerTask=org.opengion.hayabusa.report.ReportDaemon&name=ReportDaemon  デーモン起動
184 * http://localhost:8823/gf/jsp/REP08/result.jsp?cmd=CANCEL&period=5000&command=NEW&timerTask=org.opengion.hayabusa.report.ReportDaemon&name=ReportDaemon  デーモン停止
185 *
186 *Tomcat Manager 画面
187 * http://localhost:8823/manager/reload?path=/ver4 アプリケーションを再ロード
188 *
189 * ●その他:
190 * DB.ERR_CODEに、実行結果のHTTPステータスコードを設定します。
191 *
192 * @og.rev 3.6.0.0 (2004/09/17) 新規作成
193 * @og.rev 4.1.0.0 (2007/12/22) POSTメソッドで複数キーを登録できるように属性追加
194 * @og.rev 5.1.5.0 (2010/04/01) SOAP対応
195 * @og.rev 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
196 * @og.rev 8.0.0.0 (2021/08/31) httpclient5 対応のHttpConnectを使用
197 * @og.group その他部品
198 *
199 * @version  8.0
200 * @author   Kazuhiko Hasegawa
201 * @since    JDK11.0,
202 */
203public class URLConnectTag extends CommonTagSupport {
204        /** このプログラムのVERSION文字列を設定します。 {@value} */
205        private static final String VERSION = "8.0.1.0 (2021/10/29)" ;
206        private static final long serialVersionUID = 801020211029L ;
207
208//      private static final String DEFAULT_USER = "SYSTEM:MANAGER" ;
209        private static final String DEFAULT_USER = "admin:admin" ;                      // 6.9.0.1 (2018/02/05) この際、変更しておきます。
210
211//      private static final String[] POST_LIST = new String[] { "POST","PUT","DELETE" };               // 5.10.10.0 (2019/03/29)
212        private static final Set<String> POST_SET = new ArraySet<>( "POST","PUT","DELETE" );    // 5.10.10.0 (2019/03/29)
213
214        private transient DBTableModel table;                   // 5.1.5.0 (2010/04/01) DBTableModel出力対応
215
216        private String          urlStr                  ;
217        private String[]        keys                    ;
218        private String[]        vals                    ;
219        private String          xslFile                 ;
220        private String          saveFile                ;
221        private String          postKey                 ;
222        private String          postData                ;                       // postFile ファイルか、BODY部
223        private int                     timeout                 = HybsSystem.sysInt( "URL_CONNECT_TIMEOUT" );   // 6.2.5.0 (2015/06/05) 新規追加
224        private boolean         useSystemUser   = true;
225        private String          authUserPass    ;
226        private boolean         display                 ;
227        private String          proxyHost               ;                       // 4.0.0 (2007/07/25)
228        private int             proxyPort               = -1;           // 4.0.0 (2007/07/25)
229        private String          method                  = "GET";        // 4.1.0.0 (2007/12/22) POSTorGETorSOAP
230        private boolean         errNglctFlag    ;                       // 4.1.1.0 (2008/01/22) エラー無視フラグ
231//      private String          soapNameSpace   ;                       // 5.1.5.0 (2010/04/01) SOAP対応  // 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
232//      private String          soapMethodName  ;                       // 5.1.5.0 (2010/04/01) SOAP対応  // 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
233        private String          tableId                 = HybsSystem.TBL_MDL_KEY; // 5.1.5.0 (2010/04/01) DBTableModel出力対応
234        private String          rowKey                  ;                       // 5.1.5.0 (2010/04/01) DBTableModel出力対応
235        private String[]        colKeys                 ;                       // 5.1.5.0 (2010/04/01) DBTableModel出力対応
236        private String[]        rtnKeys                 ;                       // 5.1.5.0 (2010/04/01) DBTableModel出力対応
237        private String          encode                  = "UTF-8";      // 5.1.6.0 (2010/05/01) エンコード指定対応
238
239        private boolean         isTableOut              ;                       // 5.1.5.0 (2010/04/01) DBTableModel出力対応
240        private boolean         isOutParse              ;                       // 5.1.5.0 (2010/04/01) DBTableModel出力対応
241        private boolean         isMainTrans             = true;         // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
242
243//      private String          storageType             ;                       // 5.10.9.0 (2019/03/01) ADD 8.0.1.0 (2021/10/29) del
244//      private String          bucketName              ;                       // 5.10.9.0 (2019/03/01) ADD 8.0.1.0 (2021/10/29) del
245        private String          contentType             ;                       // 5.10.10.2 (2019/04/12)
246
247        private String          propKeys                ;                       // 5.10.16.0 (2019/10/04)
248        private String          propVals                ;                       // 5.10.16.0 (2019/10/04)
249        private boolean         postDataOnly    ;                       // 5.10.19.0 (2019/12/27) postDataOnly対応 ・・・・ Ver7では未対応
250        private String          authJson                ;                       // 8.0.0.0 (2021/08/31)
251        private String          authURL                 ;                       // 8.0.0.0 (2021/08/31)
252        private String          reqJson                 ;                       // 8.0.0.0 (2021/09/30)
253        private boolean         useLocal                ;                       // 8.0.1.0 (2021/10/29) クラウド設定を使用しない場合は、true
254
255        /**
256         * デフォルトコンストラクター
257         *
258         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
259         */
260        public URLConnectTag() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
261
262        /**
263         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
264         *
265         * @og.rev 5.1.5.0 (2010/04/01) SOAP・DBTableModel出力対応
266         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
267         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
268         *
269         * @return      後続処理の指示
270         */
271        @Override
272        public int doStartTag() {
273                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
274                if( !useTag() ) { return SKIP_BODY ; }
275
276                // 5.1.5.0 (2010/04/01) DBTableModel出力対応
277                if( rowKey != null || colKeys != null || rtnKeys != null ) {
278                        isOutParse = true;
279                        if( rowKey != null || colKeys != null ) {
280                                isTableOut = true;
281                                useMainTrans( isMainTrans );                    // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
282                                startQueryTransaction( tableId );
283                        }
284                }
285
286                // 5.1.5.0 (2010/04/01) SOAPの場合は、postKeyが指定されない。
287                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
288                return postData == null ? EVAL_BODY_BUFFERED : SKIP_BODY ;
289        }
290
291        /**
292         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
293         *
294         * @return      後続処理の指示(SKIP_BODY)
295         */
296        @Override
297        public int doAfterBody() {
298                postData = getBodyString();
299
300                return SKIP_BODY ;
301        }
302
303        /**
304         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
305         *
306         * @og.rev 4.0.1.0 (2007/12/12) PostKeys,PostVals処理を追加
307         * @og.rev 5.1.5.0 (2010/04/01) SOAP・DBTableModel出力対応
308         * @og.rev 5.2.0.0 (2010/09/01) エラー処理でNullPointerExceptionが発生するバグを修正
309         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
310         * @og.rev 6.3.8.0 (2015/09/11) FileUtil#getPrintWriter( OutputStream,String ) を使用。
311         * @og.rev 6.9.0.0 (2018/01/31) URLConnect 廃止、HttpConnect に置き換えます。
312         * @og.rev 6.9.0.1 (2018/02/05) IOException を、Throwable に変更して、すべてのエラーをキャッチするようにします。
313         * @og.rev 5.10.19.0 (2019/12/27) 結果コードをDB.ERR_CODEに設定
314         * @og.rev 8.0.0.2 (2021/10/15) ローカルファイルとクラウドファイル間の移動
315         *
316         * @return      後続処理の指示
317         */
318        @Override
319        public int doEndTag() {
320                debugPrint();           // 4.0.0 (2005/02/28)
321
322                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
323                if( !useTag() ) { return EVAL_PAGE ; }
324
325//              URLConnect conn = null;
326                HttpConnect conn = null;                                                // 6.9.0.0 (2018/01/31) URLConnect 廃止、HttpConnect に置き換えます。
327                ByteArrayOutputStream pipeOut = null;
328                Writer outWriter = null;                                                // 6.3.8.0 (2015/09/11) rty の外に移動
329                try {
330                        conn = connect();
331
332                        // 5.10.19.0 (2019/12/27) ADD
333                        setRequestAttribute( "DB.ERR_CODE", String.valueOf( conn.getCode() ) );
334
335                        // 出力先が、画面かファイルかを判断します。
336                        // 5.1.5.0 (2010/04/01) DBTableModel出力対応
337                        if( isOutParse ) {
338                                pipeOut = new ByteArrayOutputStream();
339                                        // 6.3.8.0 (2015/09/11) FileUtil#getPrintWriter( OutputStream,String ) を使用。
340                                        outWriter = FileUtil.getPrintWriter( pipeOut, "UTF-8" );                // 6.3.8.0 (2015/09/11)
341                        }
342                        else if( display ) {
343                                outWriter = FileUtil.getNonFlushPrintWriter( pageContext.getOut() ) ;   // JspWriter の取得
344                        }
345                        else if( saveFile != null ) {
346                                outWriter = FileUtil.getPrintWriter( new File( saveFile ),"UTF-8" );
347                        }
348
349                        final String rtnData = conn.readData();         // 6.9.0.1 (2018/02/05)
350
351                        // 出力先が存在する場合。
352                        if( outWriter != null ) {
353                                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
354                                if( xslFile == null ) {
355                                        outWriter.write( rtnData );
356                                }
357                                else {
358                                        final XSLT xslt = new XSLT();
359                                        xslt.setXslFile( xslFile );
360                                        xslt.setOutFile( outWriter );
361//                                      xslt.transform( conn.getReader() );
362                                        xslt.transform( new StringReader( rtnData ) );          // 6.9.0.0 (2018/01/31) リーダーが取り出せないので、文字列から作成します。
363                                        xslt.close();
364                                }
365
366                                // 8.0.0.2 (2021/10/15) ローカルファイルとクラウドファイル間の移動
367                                // 5.10.9.0 (2019/03/01) クラウドストレージ指定の場合は、アップロードする。
368                                if( saveFile != null) { // 5.10.10.0 (2019/03/29)
369                                        HybsFileOperationFactory.local2cloud( useLocal,() -> new File(saveFile) );
370
371//                                      final FileOperation cloudFile = HybsFileOperationFactory.create( saveFile );
372//                                      if( cloudFile.isCloud() ) {
373//                                              final File localFile = new File(saveFile);
374//                                              FileUtil.copy( localFile, cloudFile );
375//                                              localFile.delete();
376//                                      }
377                                }
378                        }
379                }
380//              catch( final IOException ex ) {
381                catch( final Throwable th ) {                                                   // 6.9.0.1 (2018/02/05)
382                        final String errMsg = "データ取得中にエラーが発生しました。"     + CR
383                                                + " url=[" + urlStr + "]"                                                       + CR
384                                                // 5.2.0.0 (2010/09/01) エラー処理でNullPointerExceptionが発生するバグを修正
385                                                + " message=[" + ( conn == null ? "NO_CONNECTION" : conn.getMessage() ) + "]" + CR
386                                                + " Exception=[" + th.getMessage() + "]" ;
387                        if( errNglctFlag ) { // 4.1.1.0 (2008/01/22) エラーを無視(標準エラー出力のみ)
388                                LogWriter.log( errMsg );
389                        }
390                        else { // 通常は無視しない
391                                throw new HybsSystemException( errMsg,th );
392                        }
393                }
394                finally {
395                        Closer.ioClose( outWriter );                                            // 6.3.8.0 (2015/09/11) finally に移動
396//                      if( conn != null ) { conn.disconnect(); }
397                }
398
399                // 5.1.5.0 (2010/04/01) DBTableModel出力対応
400                if( isOutParse ) {
401                        // 6.3.8.0 (2015/09/11) AutoCloseableを使用したtry-with-resources構築に対応
402                        try( InputStream strm = new BufferedInputStream( new ByteArrayInputStream( pipeOut.toByteArray() ) ) ) {
403                                parse( strm );
404                        }
405                        // 6.3.8.0 (2015/09/11) 今まで不要だった、IOException が発生。AutoCloseable のせい?。
406                        catch( final IOException ex ) {         // catch は、close() されてから呼ばれます。
407                                final String errMsg = "parse 処理中でエラーが発生しました。"   + CR
408                                                        + "\t close() エラーです。"                                                   + CR
409                                                        + "\t " + ex.getMessage()                                                       + CR ;
410                                System.err.println( errMsg );
411                        }
412
413                        if( isTableOut && table != null && !commitTableObject( tableId, table ) ) {
414                                jspPrint( "URLConnectTag Query処理が割り込まれました。DBTableModel は登録しません。" );
415                                return SKIP_PAGE ;
416                        }
417                }
418
419                return EVAL_PAGE ;
420        }
421
422        /**
423         * URLに対して接続を行います。
424         *
425         * @og.rev 5.1.6.0 (2010/05/01) エンコード指定対応
426         * @og.rev 6.2.5.0 (2015/06/05) timeout属性追加
427         * @og.rev 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
428         * @og.rev 6.9.0.0 (2018/01/31) URLConnect 廃止、HttpConnect に置き換えます。
429         * @og.rev 5.10.10.0 (2019/03/19) PUT.DELETE対応
430         * @og.rev 5.10.10.2 (2019/04/12) contentType
431         * @og.rev 5.10.16.0 (2019/10/04) propKeys,propVals指定追加
432         * @og.rev 5.10.19.0 (2019/12/27) postDataOnly対応 ・・・・ Ver7では未対応
433         * @og.rev 8.0.0.0 (2021/08/31) authJson,authURL 追加
434         *
435         * @return 接続オブジェクト
436         * @throws IOException 入出力エラーが発生したとき
437         */
438//      private URLConnect connect() throws IOException {
439        private HttpConnect connect() throws IOException {
440                if( useSystemUser ) { authUserPass = DEFAULT_USER; }
441
442                // 5.1.5.0 (2010/04/01) SOAP対応
443                // SOAPの場合、PostDataは、SOAPConnectタグの中で生成します。
444//              URLConnect conn = null;
445                HttpConnect conn = null;                                                                        // 6.9.0.0 (2018/01/31)
446                // 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
447//              if( "SOAP".equalsIgnoreCase( method ) ) {
448//                      if( soapNameSpace == null || soapNameSpace.isEmpty()
449//                                      || soapMethodName == null || soapMethodName.isEmpty() ) {
450//                              final String errMsg = "SOAP接続の場合、soapNameSpace及びsoapMethodNameは必ず指定して下さい。";
451//                              throw new HybsSystemException( errMsg );
452//                      }
453//
454//                      if( postData != null && postData.length() > 0 ) {
455//                              conn = new SOAPConnect( urlStr,authUserPass, soapNameSpace, soapMethodName, postData );
456//                      }
457//                      else {
458//                              conn = new SOAPConnect( urlStr,authUserPass, soapNameSpace, soapMethodName, keys, vals );
459//                      }
460//              }
461//              else {
462                        conn = new HttpConnect( urlStr,authUserPass );          // HttpConnect は、GET でも後付で引数を渡せます。
463
464                        conn.setDebug( isDebug() );
465
466                        if( keys != null ) {
467                                for( int i=0; i<keys.length; i++ ) {
468                                        conn.addRequestProperty( keys[i] , vals[i] );
469                                }
470                        }
471
472//                      if( "POST".equalsIgnoreCase( method ) ) { conn.usePost( true ); }               // 6.9.0.1 (2018/02/05)
473                        if( check( method,POST_SET ) ) { conn.usePost( true ); }                                // 5.10.10.0 (2019/03/29)
474
475//                      String urlEnc = XHTMLTag.urlEncode( keys,vals );
476                        if( postKey != null ) { // 4.1.0.0 (2007/12/22)
477//                              method = "POST";
478//                              urlEnc = urlEnc + "&" + postKey + "=" + postData;       // &連結
479                                conn.usePost( true );           // 6.9.0.1 (2018/02/05)
480                                conn.addRequestProperty( postKey , postData );
481                                if( check( method,POST_SET ) && !"POST".equalsIgnoreCase( method ) ) {
482                                        conn.addHeaderProperty( "X-HTTP-Method-Override" , method );            // 5.10.10.0 (2019/03/29)
483                                }
484                        }
485
486//                      if( ! "POST".equals( method ) ) { // 4.1.0.0 (2007/12/22)
487//                              // String urlEnc = XHTMLTag.urlEncode( keys,vals );
488//                              urlStr = XHTMLTag.addUrlEncode( urlStr,urlEnc );
489//                      }
490//                      conn = new URLConnect( urlStr,authUserPass );
491
492                        // if( postKey != null ) {
493                        //      conn.setPostData( postKey,postData );
494                        // }
495//                      if( "POST".equals( method ) && keys != null && vals != null ) { // 4.1.0.0 (2007/12/22)
496//                              conn.setPostData( urlEnc );
497//                      }
498//              }
499
500                // 4.0.0 (2007/07/25) プロキシの設定追加
501                if( proxyHost != null ) {
502                        conn.setProxy( proxyHost,proxyPort );
503                }
504
505                // 5.1.6.0 (2010/05/01) エンコード指定対応
506                if( encode != null && encode.length() > 0 ) {
507                        conn.setCharset( encode );
508                }
509
510                // 6.2.5.0 (2015/06/05) timeout属性追加
511                if( timeout >= 0 ) {
512                        conn.setTimeout( timeout );
513                }
514
515                // 5.10.10.2 (2019/04/12)
516                if( contentType != null && contentType.length() > 0 ){
517                        conn.addRequestProperty( "Content-Type", contentType );
518//                      conn.setConentType( contentType );
519                }
520
521                // 5.10.16.0 (2019/10/04)
522                if( propKeys != null && propVals != null ) {
523                        conn.setRequestProperty( propKeys,propVals );
524                }
525
526                // 8.0.0.0 (2021/08/31) authJson,authURL 追加
527                if( authJson != null && authURL != null ) {
528                        conn.setAuthJson( authJson,authURL );
529                }
530
531                // 8.0.0.0 (2021/09/30) reqJson 追加
532                if( reqJson != null ) {
533                        conn.setReqJson( reqJson );
534                }
535
536//              conn.connect();
537
538                return conn;
539        }
540
541        /**
542         * 出力データをパースし、DBTableModel及び属性パラメーターに分解します。
543         * 現時点では、XMLデータのみパースすることが可能です。
544         *
545         * @og.rev 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。
546         *
547         * @param input インプットストリーム
548         */
549        private void parse( final InputStream input ) {
550                final XML2TableParser parser = new XML2TableParser( input );
551                parser.setTableCols( rowKey, colKeys );
552                parser.setReturnCols( rtnKeys );
553                parser.parse();
554
555                // DBTableModelを生成します。
556                if( isTableOut ) {
557                        table = DBTableModelUtil.makeDBTable( parser.getCols(), parser.getData(), getResource() );
558                }
559
560                // 戻り値を取得し、Attributeに登録します。
561                if( rtnKeys != null ) {
562                        final Map<String,String> rtn = parser.getRtn();
563                        // 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。
564                        rtn.forEach( (k,v) -> setRequestAttribute( k,v ) );
565                }
566        }
567
568        /**
569         * タグリブオブジェクトをリリースします。
570         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
571         *
572         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
573         * @og.rev 6.2.5.0 (2015/06/05) timeout属性追加
574         * @og.rev 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
575         * @og.rev 5.10.9.0 (2019/03/01) storageType,bucketNameの初期を追加
576         * @og.rev 5.10.10.2 (2019/04/12) contentTypeを追加
577         * @og.rev 5.10.16.0 (2019/10/04) propKeys,propVals指定追加
578         * @og.rev 5.10.19.0 (2019/12/27) postDataOnly対応 ・・・・ Ver7では未対応
579         * @og.rev 8.0.0.0 (2021/08/31) authJson,authURL 追加
580         * @og.rev 8.0.1.0 (2021/10/29) useLocal 属性を追加。storageType , bucketName 削除
581         */
582        @Override
583        protected void release2() {
584                super.release2();
585                urlStr                  = null;
586                proxyHost               = null;         // 4.0.0 (2007/07/25)
587                proxyPort               = -1;           // 4.0.0 (2007/07/25)
588                keys                    = null;
589                vals                    = null;
590                xslFile                 = null;
591                saveFile                = null;
592                postKey                 = null;
593                postData                = null;
594                timeout                 = HybsSystem.sysInt( "URL_CONNECT_TIMEOUT" );   // 6.2.5.0 (2015/06/05) 新規追加
595                useSystemUser   = true;
596                authUserPass    = null;
597                display                 = false;
598                method                  = "GET";        // 4.1.0.0 (2007/12/22)
599                errNglctFlag    = false;        // 4.1.1.0 (2008/01/22)
600//              soapNameSpace   = null;         // 5.1.5.0 (2010/04/01) SOAP対応  // 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
601//              soapMethodName  = null;         // 5.1.5.0 (2010/04/01) SOAP対応  // 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
602                table                   = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
603                tableId                 = HybsSystem.TBL_MDL_KEY; // 5.1.5.0 (2010/04/01) DBTableModel出力対応
604                rowKey                  = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
605                colKeys                 = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
606                rtnKeys                 = null;         // 5.1.5.0 (2010/04/01) DBTableModel出力対応
607                isTableOut              = false;        // 5.1.5.0 (2010/04/01) DBTableModel出力対応
608                isOutParse              = false;        // 5.1.5.0 (2010/04/01) DBTableModel出力対応
609                encode                  = "UTF-8";      // 5.1.6.0 (2010/05/01) エンコード指定対応
610                isMainTrans             = true;         // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
611//              storageType             = null;         // 5.10.9.0 (2019/03/01) ADD
612//              bucketName              = null;         // 5.10.9.0 (2019/03/01) ADD
613                contentType             = null;         // 5.10.10.2 (2019/04/12)
614                propKeys                = null;         // 5.10.16.0 (2019/10/04)
615                propVals                = null;         // 5.10.16.0 (2019/10/04)
616                postDataOnly    = false;        // 5.10.19.0 (2019/12/27)
617                authJson                = null;         // 8.0.0.0 (2021/08/31)
618                authURL                 = null;         // 8.0.0.0 (2021/08/31)
619                reqJson                 = null;         // 8.0.0.0 (2021/09/30)
620                useLocal                = false;        // 8.0.1.0 (2021/10/29) クラウド設定を使用しない場合は、true
621        }
622
623        /**
624         * 【TAG】アクセスする接続先URLを指定します。
625         *
626         * @og.tag
627         * 接続するURLを指定します。(例:http:// ・・・・・・)
628         * ?以降のパラメータが含まれていても構いません。
629         * このURL に、keys,vals で指定されたパラメータも追加されます。
630         *
631         * @param       url     接続先
632         */
633        public void setUrl( final String url ) {
634                urlStr = nval( getRequestParameter( url ),urlStr );
635        }
636
637        /**
638         * 【TAG】プロキシ経由で接続する場合の、プロキシホスト名を指定します。
639         *
640         * @og.tag
641         * 接続先が、プロキシ経由の場合、プロキシのホスト名を指定します。
642         * 例:proxy.opengion.org
643         *
644         * @param       host    プロキシホスト名
645         */
646        public void setProxyHost( final String host ) {
647                proxyHost = nval( getRequestParameter( host ),proxyHost );
648                useSystemUser = false;  // プロキシ接続時は、システムユーザーは使えません。
649        }
650
651        /**
652         * 【TAG】プロキシ経由で接続する場合の、プロキシポート番号を指定します。
653         *
654         * @og.tag
655         * 接続先が、プロキシ経由の場合、プロキシのポート番号を指定します。
656         * 例:8080
657         *
658         * @param       port    プロキシポート番号
659         */
660        public void setProxyPort( final String port ) {
661                proxyPort = nval( getRequestParameter( port ),proxyPort );
662        }
663
664        /**
665         * 【TAG】アクセスパラメータキーをCSV形式で複数指定します。
666         *
667         * @og.tag
668         * アクセスする URLに追加するパラメータのキーを指定します。
669         * CSV形式で複数指定できます。
670         * vals 属性には、キーに対応する値を、設定してください。
671         * 例:<b>keys="command,SYSTEM_ID"</b> vals="NEW,GE"
672         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
673         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
674         *
675         * @og.rev 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
676//       * [SOAP対応]
677//       * SOAPによるWebサービスの呼び出しの場合、keys,valsに指定された値より、env:Envelopタグを
678//       * rootタグとするXMLデータを生成します。
679//       * (BODY部分に直接XMLデータを出力することも可能です。)
680//       * この際、項目名に'&gt;'を含めることで、階層的なXMLデータを表現することができます。
681//       * 例)
682//       *   [属性定義]
683//       *   keys="param0&gt;AAA,param0&gt;BBB,param1&gt;CCC,DDD"
684//       *   vals="v1,v2,v3,v4"
685//       *   [XMLデータ(※データ部のみ)]
686//       *   &lt;param0&gt;
687//       *     &lt;AAA&gt;v1&lt;/AAA&gt;
688//       *     &lt;BBB&gt;v2&lt;/BBB&gt;
689//       *   &lt;/param0&gt;
690//       *   &lt;param1&gt;
691//       *     &lt;CCC&gt;v3&lt;/CCC&gt;
692//       *   &lt;/param1&gt;
693//       *   &lt;DDD&gt;v4&lt;/DDD&gt;
694//       * 項目の値を"null"とすることで、XMLで言うところの「xsi:nil=\"true\"」のデータを表現すること
695//       * もできます。
696//       * また、キー名の先頭を'&#064;'にすることで、項目名に名前空間のPREFIXを付加することができます。
697//       * 一般的には、JavaやRubyで実装されたWebサービスを呼び出しする場合は、必要ありませんが、
698//       * .NETで実装されたWebサービスを呼び出しする場合は、各項目にPREFIXを付与しないと、正しく
699/        * パラメーターを渡すことができません。
700//       * ※現時点では、keysの階層定義は、2階層まで対応しています。
701//       *   3階層以上のXML構造を定義する場合は、postFile属性によるファイル指定又は、Body部分で直接
702//       *   XMLデータを記述して下さい。
703         *
704         * @param       key リンク先に渡すキー (CSV形式)
705         * @see         #setVals( String )
706         */
707        public void setKeys( final String key ) {
708                keys = getCSVParameter( key );
709        }
710
711        /**
712         * 【TAG】keys属性に対応する値をCSV形式で複数指定します。
713         *
714         * @og.tag
715         * キーに設定した値を、CSV形式で複数して出来ます。
716         * 指定順序は、キーと同じにしておいて下さい。
717         * 例:<b>keys="command,SYSTEM_ID"</b> vals="NEW,GE"
718         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
719         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
720         *
721         * @param       val 設定値 keys属性に対応する値(CSV形式)
722         * @see         #setKeys( String )
723         */
724        public void setVals( final String val ) {
725                vals = getCSVParameter( val );
726        }
727
728        /**
729         * 【TAG】送信メソッド[GET/POST]を指定します(初期値:GET)。
730//       * 【TAG】送信メソッド[GET/POST/SOAP]を指定します(初期値:GET)。
731         *
732         * @og.tag
733         * URLConnectTagのメソッドの初期設定はGETです。
734         * ここで"POST"(大文字)を指定するとkyes,valsの値セットをPOSTで送信します。
735         * (postKeyが設定されている場合はこの値に関係なくPOSTです)
736         *
737         * @og.rev 4.1.0.0 (2007/12/22) 新規作成
738         * @og.rev 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
739         *
740         * @param       post_get        送信メソッド [GET/POST]
741//       * @param       post_get        送信メソッド [GET/POST/SOAP]
742         */
743        public void setMethod ( final String post_get ) {
744                method = nval( getRequestParameter( post_get ), method );
745        }
746
747        /**
748         * 【TAG】Basic認証で接続するユーザーにSYSTEMユーザーを使用するかどうか[true/false]を指定します(初期値:true)。
749         *
750         * @og.tag
751         * useSystemUser="true"(初期値) の場合、URL接続時のコネクションに、Basic認証を
752         * 使用しますが、その時のユーザーにシステムユーザー(SYSTEM)を使用します。
753         * useSystemUser="false"の場合は、authUserPass で指定したユーザー:パスワードを
754         * 使用します。authUserPass で、何も指定されなかった場合は、Basic認証を使用しません。
755         * 初期値は、true(SYSTEMユーザー認証する) です。
756         *
757         * @param   flag SYSTEMユーザー認証 [true:SYSTEMユーザー認証する/false:この接続のユーザーで認証する]
758         * @see #setAuthUserPass( String )
759         */
760        public void setUseSystemUser( final String flag ) {
761                useSystemUser = nval( getRequestParameter( flag ),useSystemUser );
762        }
763
764        /**
765         * 【TAG】Basic認証を使用して接続する場合のユーザー:パスワードを指定します(初期値:null)。
766         *
767         * @og.tag
768         * 接続時のユーザーとパスワードを、USER:PASSWD 形式で指定します。
769         * useSystemUser="false"の場合は、ここで指定したユーザーとパスワードを使用します。
770         * その場合に、何も指定しない場合は、Basic認証を使用しません。
771         *
772         * @param       userPass        ユーザーとパスワード (USER:PASSWD形式)
773         * @see #setUseSystemUser( String )
774         */
775        public void setAuthUserPass( final String userPass ) {
776                authUserPass = nval( getRequestParameter( userPass ),authUserPass );
777        }
778
779        /**
780         * 【TAG】接続の結果を表示する場合にXSLT変換する場合のファイルを指定します。
781         *
782         * @og.tag
783         *
784         * 接続先のデータが、XML形式の場合、そのままでは、画面出力できない場合が
785         * あります。通常は、HTML形式に変換しますが、その変換に、 XSL ファイルを
786         * 指定することが可能です。
787         * display="true" の場合や、saveFile を指定した場合に、適用されます。
788         *
789         * @param       file    XSLTファイル
790         * @see #setSaveFile( String )
791         * @see #setDisplay( String )
792         */
793        public void setXslFile( final String file ) {
794                xslFile = HybsSystem.url2dir( nval( getRequestParameter( file ),xslFile ) );
795        }
796
797        /**
798         * 【TAG】接続の結果を表示するかどうかを指定します(初期値:false)。
799         *
800         * @og.tag
801         * true で、接続結果を表示します。 false では、何も表示しません(初期値:false)
802         * 接続結果を表示する使い方より、admin 画面に接続して、キャッシュクリアするような
803         * 使い方が多いと考え、初期値は、false になっています。
804         * xslFile が指定されている場合、XSLT変換して画面表示します。
805         * display="true" と、saveFile を併用することはできません。
806         *
807         * @param       flag    結果表示 [true:する/false:しない]
808         * @see #setSaveFile( String )
809         * @see #setXslFile( String )
810         */
811        public void setDisplay( final String flag ) {
812                display = nval( getRequestParameter( flag ),display );
813
814                if( display && saveFile != null ) {
815                        final String errMsg = "display=\"true\" と、saveFile を併用することはできません。";
816                        throw new HybsSystemException( errMsg );
817                }
818        }
819
820        /**
821         * 【TAG】接続の結果をファイルに保存します。
822         *
823         * @og.tag
824         * 接続先のデータを受け取って、ファイルに保存します。その場合、
825         * xslFile が指定されている場合、XSLT変換してセーブします。
826         * display="true" と、saveFile を併用することはできません。
827         *
828         * @param       file    保存先ファイル
829         * @see #setXslFile( String )
830         * @see #setDisplay( String )
831         */
832        public void setSaveFile( final String file ) {
833                saveFile = HybsSystem.url2dir( nval( getRequestParameter( file ),saveFile ) );
834
835                if( display ) {
836                        final String errMsg = "display=\"true\" と、saveFile を併用することはできません。";
837                        throw new HybsSystemException( errMsg );
838                }
839        }
840
841        /**
842         * 【TAG】POST を使って、postFile属性のファイル内容を送信する時のキーを指定します。
843         *
844         * @og.tag
845         * 接続先にパラメータ(引数)を投げる場合に、POST を使用できます。
846         * そのときの キーをここで指定します。
847         * POSTするデータは、postFileで指定されたファイルか、BODY部に記述された文字列です。
848         *
849         * @param       key     ファイル内容送信キー
850         * @see  #setPostFile( String )
851         */
852        public void setPostKey( final String key ) {
853                postKey = nval( getRequestParameter( key ),postKey );
854        }
855
856        /**
857         * 【TAG】接続タイムアウト時間を(秒)で指定します
858         *              (初期値:URL_CONNECT_TIMEOUT[={@og.value SystemData#URL_CONNECT_TIMEOUT}])。
859         *
860         * @og.tag
861         * 実際には、java.net.URLConnection#setConnectTimeout(int) に 1000倍して設定されます。
862         * 0 は、無限のタイムアウト、マイナスは、設定しません。(つまりJavaの初期値のまま)
863         * (初期値:システム定数のURL_CONNECT_TIMEOUT[={@og.value SystemData#URL_CONNECT_TIMEOUT}])。
864         *
865         * @og.rev 6.2.5.0 (2015/06/05) timeout属性追加
866         *
867         * @param       tout    タイムアウト時間(秒) (ゼロは、無制限)
868         * @see         org.opengion.fukurou.util.HttpConnect#setTimeout(int)
869         * @see         java.net.URLConnection#setConnectTimeout(int)
870         */
871        public void setTimeout( final String tout ) {
872                timeout = nval( getRequestParameter( tout ),timeout );
873        }
874
875        /**
876         * 【TAG】POST を使って、postFile属性のファイル内容を送信します。
877         *
878         * @og.tag
879         * 接続先にパラメータ(引数)を投げる場合に、POST を使用できます。
880         * そのときの 送信データのファイルをここで指定します。
881         * postKey のみ指定されて、postFile が指定されない場合は、BODY部を送信します。
882//       * SOAPによる呼び出しの場合は、ここ(BODY部での定義を含む)で、送信するXMLデータを
883//       * 定義することができます。
884         *
885         * @og.rev 6.4.5.1 (2016/04/28) FileStringのコンストラクター変更
886         * @og.rev 6.4.5.2 (2016/05/06) fukurou.util.FileString から、fukurou.util.FileUtil に移動。
887         * @og.rev 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
888         *
889         * @param       file    送信ファイル
890         * @see  #setPostKey( String )
891         */
892        public void setPostFile( final String file ) {
893                final String postFile = nval( getRequestParameter( file ),null );
894
895                if( postFile != null ) {
896                        // 6.4.5.1 (2016/04/28) FileStringのコンストラクター変更
897                        postData = FileUtil.getValue( HybsSystem.url2dir( postFile ) , HybsConst.UTF_8 );
898                }
899        }
900
901        /**
902         * 【TAG】(通常は使いません) 接続エラーを無視する場合にtrueとします(初期値false)。
903         *
904         * @og.tag
905         * trueにするとConnectで発生したエラーを投げずに処理を続行します。
906         * (標準エラー出力にエラー内容は出力されます)
907         * 接続エラーが発生しても処理を中断したくない場合に設定します。
908         *
909         * @og.rev 4.1.1.0 (2008/01/22) 新規追加
910         *
911         * @param       flag    エラーを無視するか [true:する/false:しない]
912         */
913        public void setErrNeglect( final String flag ) {
914                errNglctFlag = nval( getRequestParameter( flag ), errNglctFlag );
915        }
916
917//      /**
918//       * 【TAG】SOAPによるWebサービスの呼び出しで、メソッド名及びパラメーターの名前空間を指定します。
919//       *
920//       * @og.tag
921//       * SOAPによるWebサービスの呼び出しで、メソッド名及びパラメーターの名前空間を指定します。
922//       * この名前空間は、通常WSDLファイルのdescriptionsタグのtargetNamespace属性の値により
923//       * 定義されます。
924//       *
925//       * @og.rev 5.1.5.0 (2010/04/01) 新規追加
926//       * @og.rev 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
927//       *
928//       * @param       ns      名前空間
929//       */
930//      public void setSoapNameSpace( final String ns ) {
931//              soapNameSpace = nval( getRequestParameter( ns ), soapNameSpace );
932//      }
933//
934//      /**
935//       * 【TAG】SOAPによるWebサービスの呼び出しで、メソッド名を指定します。
936//       *
937//       * @og.tag
938//       * SOAPによるWebサービスの呼び出しで、メソッド名を指定します。
939//       * WSDLファイルで定義されるoperationタグのname属性の値に相当します。
940//       *
941//       * @og.rev 5.1.5.0 (2010/04/01) 新規追加
942//       * @og.rev 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
943//       *
944//       * @param       method  メソッド名
945//       */
946//      public void setSoapMethodName( final String method ) {
947//              soapMethodName = nval( getRequestParameter( method ), soapMethodName );
948//      }
949
950        /**
951         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
952         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。
953         *
954         * @og.tag
955         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
956         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
957         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
958         * この tableId 属性を利用して、メモリ空間を分けます。
959         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。
960         *
961         * @param       id テーブルID (sessionに登録する時のID)
962         */
963        public void setTableId( final String id ) {
964                tableId   = nval( getRequestParameter( id ),tableId );
965        }
966
967        /**
968         * 【TAG】結果のXMLをDBTableModelに変換する際に、行のキーとなるタグ名を指定します。
969         *
970         * @og.tag
971         * 結果のXMLを表形式に変換する際に、行のキーとなるタグ名を指定します。
972         * このキーのタグを基点として、colKeysで指定されたタグの値を各項目の値として取り込みます。
973         * (詳細は、colKeysのタグリブ属性マニュアルを参照して下さい。)
974         *
975         * @param       key 行のキーとなるタグ名
976         * @see #setColKeys( String )
977         */
978        public void setRowKey( final String key ) {
979                rowKey = nval( getRequestParameter( key ),rowKey );
980        }
981
982        /**
983         * 【TAG】結果のXMLをDBTableModelに変換する際に、項目のキーとなるタグ名の一覧を指定します。
984         *
985         * @og.tag
986         * 結果のXMLをDBTableModelに変換する際に、項目のキーとなるタグ名の一覧を指定します。
987         * rowKeyで行を、colKeysで項目を表現し、rowKeyのタグで囲われた固まりを1つの行とみなします。
988         * このため、colKeysに指定されたキーのタグでも、rowKeyの外にある場合は、取り込み対象となりません。
989         *
990         * また、キーにPARENT_TAG、PARENT_FULL_TAGを指定することで、rowKeyで指定されたタグの
991         * 直近の親タグ、及びフルの親タグ名(親タグの階層を"&gt;[タグA]&gt;[タグB]&gt;[タグC]&gt;"で表現)を
992         * 取得することができます。
993         *
994         * @param       keys 項目キー タグ名の一覧(CSV形式)
995         */
996        public void setColKeys( final String keys ) {
997                colKeys = StringUtil.csv2Array( getRequestParameter( keys ) );
998        }
999
1000        /**
1001         * 【TAG】結果のXMLを変換する際に、パラメータ(Attributes)として取り込むキーの一覧を指定します。
1002         *
1003         * @og.tag
1004         * 結果のXMLを変換する際に、パラメータ(Attributes)として取り込むキーの一覧を指定します。
1005         * ここで指定されたキーのタグの値を取り出し、{&#064;XX}形式(Attributes)として処理できるようにします。
1006         *
1007         * @param       keys 戻り値キー パラメーター(Attributes)のキーとなるタグ名の一覧(CSV形式)
1008         */
1009        public void setRtnKeys( final String keys ) {
1010                rtnKeys = StringUtil.csv2Array( getRequestParameter( keys ) );
1011        }
1012
1013        /**
1014         * 【TAG】データの入出力のエンコードを指定します(初期値:UTF-8)。
1015         *
1016         * @og.tag
1017         * データの入出力のエンコードを指定します。
1018         * 初期値は、"UTF-8"です。
1019         *
1020         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
1021         * @param       enc     エンコード
1022         */
1023        public void setEncode( final String enc ) {
1024                encode = nval( getRequestParameter( enc ), encode );
1025        }
1026
1027        /**
1028         * タグの名称を、返します。
1029         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
1030         *
1031         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
1032         *
1033         * @return  タグの名称
1034         * @og.rtnNotNull
1035         */
1036        @Override
1037        protected String getTagName() {
1038                return "urlConnect" ;
1039        }
1040
1041        /**
1042         * 【TAG】(通常は使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:true)。
1043         *
1044         * @og.tag
1045         * この値は、ファイルダウンロード処理に影響します。この値がtrueに指定された時にcommitされたDBTableModelが
1046         * ファイルダウンロードの対象の表になります。
1047         *
1048         * このパラメーターは、通常、各タグにより実装され、ユーザーが指定する必要はありません。
1049         * 但し、1つのJSP内でDBTableModelが複数生成される場合に、前に処理したDBTableModelについてファイルダウンロードをさせたい
1050         * 場合は、後ろでDBTableModelを生成するタグで、明示的にこの値をfalseに指定することで、ファイルダウンロード処理の対象から
1051         * 除外することができます。
1052         *
1053         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
1054         *
1055         * @param  flag メイントランザクションかどうか [true:メイン/false:その他]
1056         */
1057        public void setMainTrans( final String flag ) {
1058                isMainTrans = nval( getRequestParameter( flag ),isMainTrans );
1059        }
1060
1061//      /**
1062//       * 【TAG】保存先ストレージタイプを設定します。
1063//       *
1064//       * @og.tag
1065//       * ファイルを読み取り元の、ストレージタイプを設定します。
1066//       * 未設定の場合は、システムリソースの「CLOUD_TARGET」が参照されます。
1067//       * 自身のサーバを指定する場合は、「default」を設定してください。
1068//       *
1069//       * @og.rev 5.10.9.0 (2019/03/01) 新規追加
1070//       * @og.rev 8.0.1.0 (2021/10/29) 削除
1071//       *
1072//       * @param storage 保存先ストレージタイプ
1073//       */
1074//      public void setStorageType( final String storage ) {
1075//              storageType = nval( getRequestParameter( storage ), storageType );
1076//      }
1077
1078//      /**
1079//       * 【TAG】保存先バケット名を設定します。
1080//       *
1081//       * @og.tag
1082//       * ファイルを読み取り元の、バケット名を指定します。
1083//       * クラウドストレージ利用時のみ有効です。
1084//       * 未設定の場合は、システムリソースの「CLOUD_BUKET」が参照されます。
1085//       *
1086//       * @og.rev 5.10.9.0 (2019/03/01) 新規追加
1087//       * @og.rev 8.0.1.0 (2021/10/29) 削除
1088//       *
1089//       * @param bucket 保存先バケット名
1090//       */
1091//      public void setBucketName( final String bucket ) {
1092//              bucketName = nval( getRequestParameter( bucket ), bucketName );
1093//      }
1094
1095        /**
1096         * 【TAG】送信ヘッダのコンテントタイプを指定します。
1097         *
1098         * @og.tag
1099         * 通常は指定不要です。
1100         * API等でapplication/json等を指定された場合に設定してください。
1101         *
1102         * @og.rev 5.10.10.2 (2019/04/12) 追加
1103         *
1104         * @param ctype コンテントタイプ
1105         */
1106        public void setContentType( final String ctype ) {
1107                contentType = nval( getRequestParameter( ctype ), contentType );
1108        }
1109
1110        /**
1111         * 【TAG】コネクションのrequestParameterに渡すキーをCSV形式で複数指定します。
1112         *
1113         * @og.tag
1114         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
1115         *
1116         * @og.rev 5.10.16.0 (2019/10/04) propKeys,propVals指定追加
1117         *
1118         * @param       key キー(CSV形式)
1119         */
1120        public void setPropKeys( final String key ) {
1121                propKeys = nval( getRequestParameter( key ), propKeys );
1122        }
1123
1124        /**
1125         * 【TAG】コネクションのrequestParameterに渡す値をCSV形式で複数指定します。
1126         *
1127         * @og.tag
1128         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
1129         *
1130         * @og.rev 5.10.16.0 (2019/10/04) propKeys,propVals指定追加
1131         *
1132         * @param       val 値(CSV形式) 新規追加
1133         */
1134        public void setPropVals( final String val ) {
1135                propVals = nval( getRequestParameter( val ), propVals );
1136        }
1137
1138        /**
1139         * 【TAG】postDataのみ送信フラグ。
1140         *
1141         * @og.tag
1142         * trueを設定時、keyなしでpostDataをそのまま送信します。
1143         * 主にapplication/json形式で送信時に利用します。
1144         *
1145         * @og.rev 5.10.19.0 (2019/12/27) postDataOnly対応 ・・・・ Ver7では未対応
1146         * @param flg postDataのみ送信フラグ
1147         */
1148        public void setPostDataOnly( final String flg ) {
1149                postDataOnly = nval( getRequestParameter( flg ), postDataOnly);
1150        }
1151
1152        /**
1153         * 【TAG】JSONコードで認証する場合に使用します。
1154         *
1155         * @og.tag
1156         * JSONコードで認証する場合に使用します。
1157         *
1158         * @og.rev 8.0.0.0 (2021/08/31) authJson,authURL 追加
1159         *
1160         * @param       json JSONコードの文字列
1161         */
1162        public void setAuthJson( final String json ) {
1163                authJson = nval( getRequestParameter( json ), authJson );
1164        }
1165
1166        /**
1167         * 【TAG】JSONコードで認証するURLを指定します。
1168         *
1169         * @og.tag
1170         * JSONコードで認証するURLを指定します。
1171         *
1172         * @og.rev 8.0.0.0 (2021/08/31) authJson,authURL 追加
1173         *
1174         * @param       url JSONコードで認証するURL
1175         */
1176        public void setAuthURL( final String url ) {
1177                authURL = nval( getRequestParameter( url ), authURL );
1178        }
1179
1180        /**
1181         * 【TAG】JSONコードでリクエストするパラメータを指定します。
1182         *
1183         * @og.tag
1184         * JSONコードでリクエストするパラメータを指定します。
1185         *
1186         * @og.rev 8.0.0.0 (2021/09/30) reqJson 追加
1187         *
1188         * @param       json JSONコードの文字列
1189         */
1190        public void setReqJson( final String json ) {
1191                reqJson = nval( getRequestParameter( json ), reqJson );
1192        }
1193
1194        /**
1195         * 【TAG】システム定数でクラウド設定されていても、クラウド環境を使用しない場合、trueを指定します(初期値:false)。
1196         *
1197         * @og.tag
1198         * クラウド設定は、システム定数の『CLOUD_TARGET』と『CLOUD_BUCKET』の設定で自動的に使用しますが、
1199         * どうしてもローカルでのみ使いたい場合は、この属性を true に設定します。
1200         * 標準はfalse:設定どおりとなります。
1201         *
1202         * true/false以外を指定した場合はfalse扱いとします。
1203         *
1204         * @og.rev 8.0.1.0 (2021/10/29) useLocal 属性を追加。
1205         *
1206         * @param flag ローカル環境のみ [true:ローカルのみ/false:設定どおり]
1207         */
1208        public void setUseLocal( final String flag ) {
1209                useLocal = nval( getRequestParameter( flag ),useLocal );
1210        }
1211
1212        /**
1213         * このオブジェクトの文字列表現を返します。
1214         * 基本的にデバッグ目的に使用します。
1215         *
1216         * @og.rev 5.10.16.0 (2019/10/04) propKeys,propVals指定追加
1217         *
1218         * @return このクラスの文字列表現
1219         * @og.rtnNotNull
1220         */
1221        @Override
1222        public String toString() {
1223                return ToString.title( this.getClass().getName() )
1224                                .println( "VERSION"                     ,VERSION                )
1225                                .println( "method"                      ,method                 )
1226                                .println( "urlStr"                      ,urlStr                 )
1227                                .println( "keys"                        ,StringUtil.array2csv( keys ) )
1228                                .println( "vals"                        ,StringUtil.array2csv( vals ) )
1229                                .println( "proxyHost"           ,proxyHost              )
1230                                .println( "proxyPort"           ,proxyPort              )
1231                                .println( "timeout"                     ,timeout                )               // 6.2.5.0 (2015/06/05) 新規追加
1232                                .println( "useSystemUser"       ,useSystemUser  )
1233                                .println( "authUserPass"        ,authUserPass   )
1234                                .println( "display"                     ,display                )
1235                                .println( "postKey"                     ,postKey                )
1236                                .println( "postData"            ,postData               )
1237                                .println( "xslFile"                     ,xslFile                )
1238                                .println( "saveFile"            ,saveFile               )
1239                                .println( "errNglctFlag"        ,errNglctFlag   )
1240//                              .println( "soapNameSpace"       ,soapNameSpace  )               // 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
1241//                              .println( "soapMethodName"      ,soapMethodName )               // 6.9.0.0 (2018/01/31) SOAPConnect 廃止に伴う修正
1242                                .println( "tableId"                     ,tableId                )
1243                                .println( "rowKey"                      ,rowKey                 )
1244                                .println( "colKeys"                     ,StringUtil.array2csv( colKeys ) )
1245                                .println( "rtnKeys"                     ,StringUtil.array2csv( rtnKeys ) )
1246//                              .println( "storageType"         ,storageType    )               // 5.10.10.2 (2019/04/12) 追加
1247//                              .println( "bucketName"          ,bucketName             )               // 5.10.10.2 (2019/04/12) 追加
1248                                .println( "contentType"         ,contentType    )               // 5.10.10.2 (2019/04/12) 追加
1249                                .println( "propKeys"            ,propKeys               )               // 5.10.16.0 (2019/10/04) 追加
1250                                .println( "propVals"            ,propVals               )               // 5.10.16.0 (2019/10/04) 追加
1251                                .println( "Other..."            ,getAttributes().getAttribute() )
1252                                .fixForm().toString() ;
1253        }
1254}