    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 *     &lt;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 *     /&gt;
    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 *                 直近の親タグ、及びフルの親タグ名(親タグの階層を"&gt;[タグA]&gt;[タグB]&gt;[タグC]&gt;"で表現)を
    116 *                 取得することができます。
    117 * rtnKeys       : XMLのタグキーを指定して値を取り出します。取り出した値は、{&#064;XX}形式で処理することが可能です。
    118 * encode        : データの入出力を行うエンコードを指定します。
    119 *
    120 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    121 *         POSTデータを記述します。
    122 *
    123 * ●Tag定義：
    124 *   &lt;og:urlConnect
    125 *       url              ○【TAG】アクセスする ＵＲＬ を指定します(必須)(必須)。
    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 *   &gt;   ... Body ...
    160 *   &lt;/og:urlConnect&gt;
    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&amp;period=5000&amp;command=NEW&amp;timerTask=org.opengion.hayabusa.report.ReportDaemon&amp;name=ReportDaemon  デーモン起動
    175 * http://localhost:8823/gf/jsp/REP08/result.jsp?cmd=CANCEL&amp;period=5000&amp;command=NEW&amp;timerTask=org.opengion.hayabusa.report.ReportDaemon&amp;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】アクセスする接続先ＵＲＬを指定します。
    580         *
    581         * @og.tag
    582         * 接続するＵＲＬを指定します。(例：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         * アクセスする ＵＲＬに追加するパラメータのキーを指定します。
    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}