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