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