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