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