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