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 org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    import org.opengion.hayabusa.db.DBErrMsg;
021    import org.opengion.hayabusa.resource.GUIInfo;
022    import org.opengion.hayabusa.resource.ResourceManager;
023    import org.opengion.fukurou.db.Transaction;
024    import org.opengion.fukurou.db.TransactionReal;
025    import org.opengion.fukurou.util.ErrorMessage;
026    import org.opengion.fukurou.util.FileUtil;
027    import org.opengion.fukurou.util.StringUtil;
028    import org.opengion.fukurou.util.Closer ;
029    import static org.opengion.fukurou.util.StringUtil.nval ;
030    
031    import java.util.Locale ;
032    
033    import java.sql.Connection;
034    import java.sql.Statement;
035    import java.sql.ResultSet;
036    import java.sql.ResultSetMetaData;
037    import java.sql.SQLException;
038    import java.sql.Types;
039    import java.sql.CallableStatement;
040    import oracle.sql.ARRAY;
041    import oracle.sql.ArrayDescriptor;
042    import oracle.jdbc.OracleTypes;
043    import oracle.jdbc.OracleCallableStatement;
044    
045    import java.io.File;
046    import java.io.PrintWriter;
047    import java.io.FileOutputStream;
048    import java.io.IOException;
049    import java.io.ObjectOutputStream;
050    import java.io.ObjectInputStream;
051    import java.util.zip.ZipOutputStream;
052    import java.util.zip.ZipEntry;
053    
054    import java.util.Map;
055    
056    /**
057     * SELECTæ–?‚’直接実行して、指定ã?ファイルに出力するタグですã?
058     *
059     * 中間ã?、データ(DBTableModel)を作æ?しなã�?�Ÿめã?余計なメモリを取らずã€?
060     * 高é?にãƒ??タを抜きå?すことが可能ですã?
061     * ä¸?–¹、抜きå?すデータは生データのため、データの再利用等ã?シスãƒ?ƒ çš?�ª
062     * 使用を想定してã�?�¾すã?
063     * JDBCErrMsg 形式ã?PL/SQL をコールして、その検索結果(カーソル)を抜きこともできますã?
064     *
065     * ※ こã?タグは、Transaction タグの対象ですã?
066     *
067     * @og.formSample
068     * ●形式ï¼?lt;og:directWriteTable filename="[?¥?¥?¥]" ?¥?¥?¥ >SELECT * FROM ZYXX </og:directWriteTable >
069     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
070     *
071     * ●Tag定義??
072     *   <og:directWriteTable
073     *       fileURL            【TAG】保存å?ãƒ?‚£レクトリ名をæŒ?®šしまã�?(初期値:FILE_URL[=filetemp/])
074     *       filename           【TAG】ファイルを作æ?するときã?ファイル名をセãƒ?ƒˆしまã�?初期値:シスãƒ?ƒ パラメータのFILE_FILENAME)
075     *       zipFilename        【TAG】ZIPファイルを作æ?するときã?ZIPファイル名をセãƒ?ƒˆしまã�?初期値:filename + ".zip")
076     *       encode             【TAG】ファイルを作æ?するときã?ファイルエンコーãƒ?‚£ング名をセãƒ?ƒˆしまã�?(初期値:FILE_ENCODE[=UnicodeLittle])
077     *       fileAppend         【TAG】追åŠ?ƒ¢ードで書き込ã‚?�‹どã�?�‹[true/false]を指定しまã�?初期値:false[通常モード])
078     *       zip                【TAG】結果をファイルに出力するときに、ZIPで圧縮するかどã�?�‹[true/false]を指定しまã�?初期値:false)
079     *       separator          【TAG】可変長ファイルを作æ?するときã?é ?›®区åˆ?‚Šæ–?­—をセãƒ?ƒˆしまã�?(初期値:TAB_SEPARATOR[= ])
080     *       useHeader          【TAG】ã?ãƒ?ƒ€ーを書き込ã‚?�‹どã�?�‹[true/false]を指定しまã�?初期値:true)
081     *       displayMsg         【TAG】検索結果を画面上に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0033[ã€?»¶検索しました])
082     *       notfoundMsg        【TAG】検索結果がゼロ件の場合に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0077[対象ãƒ??タはありませんでした])
083     *       fetchSize          【TAGã€?通常は使ã�?�¾せん)ãƒ??タのフェãƒ?ƒ�サイズを指定しまã�?初期値:100)
084     *       names              【TAG】PL/SQLを利用する場合ã?引数にセãƒ?ƒˆすべã�?ãƒ??タの名称をCSV形式でè¤?•°æŒ?®šしまã�?
085     *       queryType          【TAG】Query を発行する為のクラスID(JDBC,JDBCErrMsg)を指定しまã�?{@og.doc03Link queryType 初期値:JDBC})
086     *       dbid               【TAGã€?通常は使ã�?�¾せん)検索時ã?DB接続IDを指定しまã�?初期値:DEFAULT)
087     *       useNumber          【TAG】行番号をå?力するかどã�?�‹(初期値:true)
088     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
089     *   >   ... Body ...
090     *   </og:directWriteTable>
091     *
092     * ●使用ä¾?
093     *     <og:directWriteTable
094     *         dbid        = "ORCL"               接続データベã?スID(初期値:DEFAULT)
095     *         separator   = ","                  ファイルの区åˆ?‚Šæ–?­?初期値:タãƒ?
096     *         fileURL     = "{@USER.ID}"    保存å?ãƒ?‚£レクトリå�?
097     *         filename    = "{@filename}"   保存ファイルå�?
098     *         encode      = "UnicodeLittle"      保存ファイルエンコード名
099     *         useHeader   = "true"               保存ファイルにヘッãƒ??をå?力するかどã�?�‹
100     *         zip         = "true"               ZIPファイルに圧縮するかどã�?�‹
101     *         zipFilename = "Sample.zip"         ZIPファイルのファイルå�?
102     *         fileAppend  = "true"               ファイルを追åŠ?ƒ¢ードで登録するかどã�?�‹
103     *         displayMsg  = "MSG0033"            実行後ã?表示メãƒ?‚»ージ
104     *         fetchSize   = "200"                DB検索する場合ã?フェãƒ?ƒ�するサイズ
105     *     >
106     *         SELECT * FROM ZYXX 
107     *     </og:directWriteTable >
108     *
109     *     <og:directWriteTable
110     *         fileURL     = "{@USER.ID}"    保存å?ãƒ?‚£レクトリå�?
111     *         filename    = "{@filename}"   保存ファイルå�?
112     *         names       = "AAA,BBB,CCC,?¥?¥?¥"    æŒ?®šã?キーに対応するリクエストå?ã‚?ARG_ARRAY にセãƒ?ƒˆしますã?
113     *         queryType   = "JDBCErrMsg"         JDBCErrMsg 形式ã?PL/SQL をコールしますã?
114     *     >
115     *        { call PL/SQL(?,?,?,? ) } 
116     *     </og:directWriteTable >
117     *
118     * @og.rev 3.5.6.0 (2004/06/18) 新規作æ?
119     * @og.rev 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?の実行を追åŠ?
120     * @og.group ファイル出åŠ?
121     *
122     * @version  4.0
123     * @author   Kazuhiko Hasegawa
124     * @since    JDK5.0,
125     */
126    public class DirectWriteTableTag extends CommonTagSupport {
127            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
128            private static final String VERSION = "5.6.1.0 (2013/02/01)" ;
129    
130            private static final long serialVersionUID = 561020130201L ;
131    
132            private static final String TAB_SEPARATOR       = "\t" ;
133            private static final String errMsgId            = HybsSystem.ERR_MSG_KEY;
134    
135            private final int DB_MAX_QUERY_TIMEOUT          = HybsSystem.sysInt( "DB_MAX_QUERY_TIMEOUT" ) ;
136    //      private static final String ARG_ARRAY           = HybsSystem.sys( "ARG_ARRAY" ) ;
137    //      private static final String ERR_MSG                     = HybsSystem.sys( "ERR_MSG" ) ;
138    //      private static final String ERR_MSG_ARRAY       = HybsSystem.sys( "ERR_MSG_ARRAY" ) ;
139            private static final String ARG_ARRAY           = "ARG_ARRAY" ;
140            private static final String ERR_MSG                     = "ERR_MSG" ;
141            private static final String ERR_MSG_ARRAY       = "ERR_MSG_ARRAY" ;
142    
143            // 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
144    //      private String  dbid            = "DEFAULT";
145            private String  dbid            = null;
146            private String  separator       = TAB_SEPARATOR;   // é ?›®区åˆ?‚Šæ–?­?
147            private boolean useHeader       = true;         // ヘッãƒ??の使用可否
148            private String  fileURL         = HybsSystem.sys( "FILE_URL" );
149            private String  filename        = HybsSystem.sys( "FILE_FILENAME" );   // ファイルå�?
150            private String  zipFilename     = null;         // ZIPファイルå�?
151            private String  sql                     = null;
152            private String  encode          = HybsSystem.sys( "FILE_ENCODE"   );   // ファイルエンコーãƒ?‚£ング  "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
153            private boolean fileAppend      = false;        // ファイルをAPPENDモードで出力するか
154            private boolean zip                     = false;        // ファイルをZIPするã�?
155    //      private String  displayMsg      = "MSG0033";    // ã€?»¶検索しましたã€?
156            private String  displayMsg      = HybsSystem.sys( "VIEW_DISPLAY_MSG" );
157            private String  notfoundMsg     = "MSG0077";    // 対象ãƒ??タはありませんでしたã€?
158            private long    dyStart         = 0;    // 実行時間測定用のDIV要ç´?‚’出力しますã?
159            private int             fetchSize       = 100 ; // フェãƒ?ƒ�する行数(初期値:100)
160            private boolean useNumber       = true;  // 5.5.7.1(2012/10/05) 行番号出åŠ?
161    
162            // 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?への対å¿?
163            private boolean queryType       = true; // ノã?マルは、true/ JDBCErrMsg の時ã?、false
164            private String  names           = null; // æŒ?®šã?リクエスト変数をã?ARG_ARRAY にセãƒ?ƒˆしますã?
165            private int             errCode         = ErrorMessage.OK;
166            private transient ErrorMessage errMessage = null;
167    
168            /**
169             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
170             *
171             * @return      後続å?ç�??æŒ?¤º( EVAL_BODY_BUFFERED )
172             */
173            @Override
174            public int doStartTag() {
175                    dyStart = System.currentTimeMillis();           // 時間測定用
176                    return( EVAL_BODY_BUFFERED );   // Body を評価するã€? extends BodyTagSupport æ™?
177            }
178    
179            /**
180             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
181             *
182             * @og.rev 3.8.6.3 (2006/11/30) SQL æ–??前後ã?スペã?スを取り除きますã?
183             *
184             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
185             */
186            @Override
187            public int doAfterBody() {
188                    sql = getBodyString();
189                    if( sql == null || sql.length() == 0 ) {
190                            String errMsg = "BODY 部の検索用 Selectæ–??、å¿??ですã?";
191                            throw new HybsSystemException( errMsg );
192                    }
193                    sql = sql.trim();
194                    return(SKIP_BODY);                              // Body を評価しなã�?
195            }
196    
197            /**
198             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
199             *
200             * @og.rev 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?への対å¿?
201             * @og.rev 4.0.0.0 (2007/10/18) メãƒ?‚»ージリソース統å�? getResource().getMessage > getResource().getLabel )
202             *
203             * @return      後続å?ç�??æŒ?¤º
204             */
205            @Override
206            public int doEndTag() {
207                    debugPrint();           // 4.0.0 (2005/02/28)
208    
209                    PrintWriter pw = null;
210                    final int executeCount;
211                    try {
212                            if( zip ) {
213                                    String directory = HybsSystem.url2dir( fileURL );
214    
215                                    if( zipFilename == null ) { zipFilename = filename + ".zip"; }
216                                    ZipOutputStream gzip = null;
217                                    try {
218                                            gzip = new ZipOutputStream(
219                                                                    new FileOutputStream(
220                                                                                    StringUtil.urlAppend( directory,zipFilename )));
221                                            gzip.putNextEntry( new ZipEntry( filename ) );
222                                            pw = new PrintWriter( gzip );
223                                            executeCount = create( pw ) ;
224    
225                                            pw.flush();
226                                            gzip.closeEntry();
227                                            gzip.finish() ;
228                                    }
229                                    finally {
230                                            Closer.ioClose( gzip );         // 4.0.0 (2006/01/31) close 処ç�?™‚の IOException を無è¦?
231                                    }
232                            }
233                            else {
234                                    pw = getPrintWriter();
235                                    executeCount = create( pw );
236                            }
237                    } catch( IOException ex ) {
238                            String errMsg = "Error in DirectWriteTableTag: " + toString();
239                            throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
240                    } finally {
241                            Closer.ioClose( pw );           // 4.0.0 (2006/01/31) close 処ç�?™‚の IOException を無è¦?
242                    }
243    
244                    // 3.6.1.0 (2005/01/05) 検索結果の件数をã?"DB.COUNT" キーでリクエストにセãƒ?ƒˆするã€?
245                    setRequestAttribute( "DB.COUNT"   , String.valueOf( executeCount ) );
246                    setRequestAttribute( "DB.ERR_CODE", String.valueOf( errCode ) );
247    
248                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
249    
250                    // 実行件数の表示
251    //              boolean useStatusBar = HybsSystem.sysBool( "VIEW_USE_DISPLAY_MSG" );
252    //              if( useStatusBar && executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) {
253                    if( executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) {
254                            buf.append( executeCount );
255    //                      buf.append( getResource().getMessage( displayMsg ) );
256                            buf.append( getResource().getLabel( displayMsg ) );
257                            buf.append( HybsSystem.BR );
258                    }
259                    else if( executeCount == 0 && notfoundMsg != null && notfoundMsg.length() > 0 ) {
260    //                      buf.append( getResource().getMessage( notfoundMsg ) );
261                            buf.append( getResource().getLabel( notfoundMsg ) );
262                            buf.append( HybsSystem.BR );
263                    }
264    
265                    // 3.6.1.0 (2005/01/05) TaglibUtil.makeHTMLErrorTable メソãƒ?ƒ‰を利用
266                    String err = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() );
267                    if( err != null && err.length() > 0 ) {
268                            buf.append( err );
269                            setSessionAttribute( errMsgId,errMessage );
270                    }
271                    else {
272                            removeSessionAttribute( errMsgId );
273                    }
274    
275                    jspPrint( buf.toString() );
276    
277                    // 時間測定用の DIV 要ç´?‚’出åŠ?
278                    long dyTime = System.currentTimeMillis()-dyStart;
279                    jspPrint( "<div id=\"queryTime\" value=\"" + (dyTime) + "\"></div>" );      // 3.5.6.3 (2004/07/12)
280    
281                    // 3.6.1.0 (2005/01/05) 警告時に停止してã�?�¾したがã?継続å?ç�?�•せますã?
282                    int rtnCode = EVAL_PAGE;
283                    if( errCode >= ErrorMessage.NG )  {  // 異常
284                            rtnCode = SKIP_PAGE;
285                    }
286    
287                    // 4.0.0 (2005/01/31) セキュリãƒ?‚£チェãƒ?‚¯(ãƒ??タアクセス件数登録)
288                    GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
289                    if( guiInfo != null ) { guiInfo.addReadCount( executeCount,dyTime,sql ); }
290    
291                    return( rtnCode );
292            }
293    
294            /**
295             * タグリブオブジェクトをリリースしますã?
296             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
297             *
298             * @og.rev 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?への対å¿?
299             * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
300             * @og.rev 5.5.7.1 (2012/10/05) useNumber追åŠ?
301             */
302            @Override
303            protected void release2() {
304                    super.release2();
305                    separator       = TAB_SEPARATOR;   // é ?›®区åˆ?‚Šæ–?­?
306                    fileURL         = HybsSystem.sys( "FILE_URL" );
307                    filename        = HybsSystem.sys( "FILE_FILENAME" );   // ファイルå�?
308                    zipFilename     = null;         // ZIPファイルå�?
309                    sql                     = null;
310                    encode          = HybsSystem.sys( "FILE_ENCODE" );   // ファイルエンコーãƒ?‚£ング  "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
311                    fileAppend      = false;        // ファイルをAPPENDモードで出力するか
312                    zip                     = false;        // ファイルをZIPするã�?
313    //              displayMsg      = "MSG0033";    // ã€?»¶検索しましたã€?
314                    displayMsg      = HybsSystem.sys( "VIEW_DISPLAY_MSG" );
315                    notfoundMsg     = "MSG0077";    // 対象ãƒ??タはありませんでしたã€?
316    //              dbid            = "DEFAULT";
317                    dbid            = null;
318                    fetchSize       = 100 ; // フェãƒ?ƒ�する行数(初期値:0 参è?にしなã�?
319                    dyStart         = 0;
320                    queryType       = true; // ノã?マルは、true/ JDBCErrMsg の時ã?、false
321                    names           = null; // æŒ?®šã?リクエスト変数をã?ARG_ARRAY にセãƒ?ƒˆしますã?
322                    errCode         = ErrorMessage.OK;
323                    errMessage      = null;
324                    useNumber       = true; // 5.5.7.1 (2012/10/05)
325            }
326    
327            /**
328             * 実オブジェクトを生æ?して??del>PrintWriter</del>OutputStream に書き込みますã?
329             *
330             * @og.rev 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?への対å¿?
331             * @og.rev 3.8.6.0 (2006/09/29) ヘッãƒ??にラベルをå?力するよã�?�«修正
332             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
333             * @og.rev 4.3.4.3 (2008/12/22) (Oracle11gDriver対å¿?PL/SQLコールの場合にã€?クローズされた文ですã?"のエラーが発生する問題に対å¿?
334             * @og.rev 5.1.9.0 (2010/08/01) Transaction 対å¿?
335             * @og.rev 5.2.2.0 (2010/11/01) 改行を含ã‚??合ã?、ダブルクオートを強制çš?�«前後に追åŠ?�™るã?
336             * @og.rev 5.2.2.0 (2010/11/01) ãƒ?ƒ–ルクオートを含ã‚??合ã?、その直前にãƒ?ƒ–ルクオートを強制çš?�«追åŠ?�™るã?
337             * @og.rev 5.3.0.0 (2010/12/01) executeCall メソãƒ?ƒ‰の引数見直ã�?
338             * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
339             * @og.rev 5.5.7.1 (2012/10/05) useNumberの追åŠ?
340             *
341             * @param   out PrintWriterオブジェクãƒ?
342             *
343             * @return      検索件数
344             */
345            private int create( final PrintWriter out )  {
346                    final int executeCount;
347                    Statement stmt = null;
348                    CallableStatement callStmt = null; // 4.3.4.3 (2008/12/22)
349                    ResultSet resultSet = null ;
350                    boolean errFlag = true;
351    //              Connection conn  = null;
352                    Transaction tran = null;        // 5.1.9.0 (2010/08/01) Transaction 対å¿?
353                    try {
354                            // 5.1.9.0 (2010/08/01) Transaction 対å¿?
355                            TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
356                            if( tranTag == null ) {
357    //                              tran = new TransactionReal( dbid,getApplicationInfo() );
358                                    tran = new TransactionReal( getApplicationInfo() );             // 5.3.7.0 (2011/07/01) 引数変更
359                            }
360                            else {
361                                    tran = tranTag.getTransaction();
362                            }
363    //                      conn = ConnectionFactory.connection( dbid,getApplicationInfo() );       // 3.8.7.0 (2006/12/15)
364    
365                            Connection conn = tran.getConnection( dbid );                   // 5.1.9.0 (2010/08/01) Transaction 対å¿?
366                            // 3.6.1.0 (2005/01/05)
367                            if( queryType ) {               // JDBC 通常の SELECT æ–?
368                                    stmt = conn.createStatement();
369                                    if( fetchSize > 0 ) { stmt.setFetchSize( fetchSize ); }
370                                    resultSet = stmt.executeQuery( sql );
371                            }
372                            else {                                  // PL/SQL Call æ–?
373                                    String[] values = null;
374                                    if( names != null ) {
375                                            String[] nameArray = StringUtil.csv2Array( names );
376                                            values = getRequest( nameArray );
377                                    }
378                                    callStmt  = conn.prepareCall( sql );
379    //                              resultSet = executeCall( conn,callStmt,sql,values );    // 4.3.4.3 (2008/12/22)
380                                    resultSet = executeCall( conn,callStmt,values );                // 5.3.0.0 (2010/12/01)
381                            }
382                            if( resultSet == null ) { return 0; }
383    
384                            ResultSetMetaData metaData  = resultSet.getMetaData();
385                            int numberOfColumns =  metaData.getColumnCount();
386    
387                            // ヘッãƒ??部の出åŠ?
388                            if( useHeader && numberOfColumns > 0 ) {
389                                    StringBuilder headName  = new StringBuilder();
390                                    StringBuilder headLabel = new StringBuilder();
391                                    headName.append( "#Name" );
392                                    headLabel.append( "#Label" );
393                                    String clm ;
394                                    ResourceManager resource = getResource();
395                                    for(int column = 1; column <= numberOfColumns; column++) {
396                                            clm = (metaData.getColumnLabel(column)).toUpperCase(Locale.JAPAN);
397                                            headName.append( TAB_SEPARATOR ).append( clm );
398                                            headLabel.append( TAB_SEPARATOR ).append( resource.getLabel( clm ) );
399                                    }
400                                    out.println( headName.toString() );
401                                    out.println( headLabel.toString() );
402                            }
403    
404                            int rowNo = 0;
405                            Object obj ;
406                            while( resultSet.next() ) {
407                                    if( useNumber ){ // 5.5.7.1 (2012/10/05)
408                                            out.print( rowNo );                             // 行番号
409                                    }
410                                    for(int column = 1; column <= numberOfColumns; column++) {
411                                            if( column == 1 && !useNumber && !useHeader ){ // 5.5.7.1 (2012/10/05)
412                                                    //こã?場合だけセパレータ出力しなã�?
413                                            }
414                                            else{
415                                                    out.print( separator );
416                                            }
417                                            obj = resultSet.getObject(column);
418                                            if( obj != null ) {
419    //                                              out.print( obj );
420                                                    // 5.2.2.0 (2010/11/01) 改行ã?ãƒ?ƒ–ルクオート等ã?処ç�?
421                                                    String sval = obj.toString();
422                                                    if( sval.indexOf( '"' ) >= 0 ) { sval = sval.replaceAll( "\"" ,"\"\"" ) ; }
423                                                    if( sval.indexOf( HybsSystem.CR ) >= 0 ) {
424                                                            sval = "\"" + sval + "\"" ;
425                                                    }
426                                                    out.print( sval );
427                                            }
428                                    }
429                                    out.println();
430                                    rowNo++ ;
431                            }
432                            executeCount = rowNo ;
433                            errFlag = false;                // エラーではなã�?
434                    }
435                    catch ( SQLException ex ) {             // 3.6.1.0 (2005/01/05)
436                            String errMsg = "ãƒ??タベã?ス処ç�?‚’実行できませんでしたã€?
437                                                     + HybsSystem.CR + stmt + HybsSystem.CR
438                                                     + "err=[" + ex.getSQLState() + "]"
439                                                     + ex.getMessage();
440                            throw new HybsSystemException( errMsg,ex );
441                    }
442                    finally {
443                            Closer.resultClose( resultSet );
444                            Closer.stmtClose( stmt );
445                            Closer.stmtClose( callStmt );   // 4.3.4.3 (2008/12/22)
446                            if( tran != null ) {                            // 5.5.2.6 (2012/05/25) findbugs対å¿?
447                                    tran.close( errFlag );                  // 5.1.9.0 (2010/08/01) Transaction 対å¿?
448                            }
449    //                      if( errFlag ) { ConnectionFactory.remove( conn,dbid ); }        // 削除
450    //                      else {                  ConnectionFactory.close( conn,dbid );  }        // 返却
451    //                      conn = null;
452                    }
453    
454                    return executeCount ;
455            }
456    
457            /**
458             * 引数配å?付ã?クエリーを実行しますã?
459             * 処ç�??体ã?, #execute() と同様に、各サブクラスの実è£?�«依存しますã?
460             * これは、CallableStatement を用ã�?�¦、データベã?ス検索処ç�?‚’行いますã?
461             * {call TYPE3B01.TYPE3B01(?,?,?,?)} でã€?¼”番目の引数にはã€?
462             * names でæŒ?®šしたリクエスト情報がã?ARG_ARRAY 配å?にé ?¬¡セãƒ?ƒˆされますã?
463             * 使用する場合ã?、ä¸?—¦わかりæ?ã�?¤‰数に受けて利用してくださいã€?
464             * 呼び出ã�?PL/SQL では、検索系PL/SQL ですã?
465             *
466             * @og.rev 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?への対å¿?
467             * @og.rev 4.3.4.3 (2008/12/22) (Oracle11gDriver対å¿?PL/SQLコールの場合にã€?クローズされた文ですã?"のエラーが発生する問題に対å¿?
468             * @og.rev 5.3.0.0 (2010/12/01) executeCall メソãƒ?ƒ‰の引数見直ã�?
469             *
470             * @param       conn            コネクション
471             * @param   callStmt    コーラブルスãƒ??トメンãƒ?
472             * @param   args                オブジェクトã?引数配å?
473             *
474             * @return      結果オブジェクãƒ?
475             */
476    //      private ResultSet executeCall( final Connection conn,final CallableStatement callStmt,final String sql,final String[] args ) throws SQLException {
477            private ResultSet executeCall( final Connection conn,final CallableStatement callStmt,final String[] args ) throws SQLException {
478    //              CallableStatement callStmt = null ; // 4.3.4.3 (2008/12/22)
479                    ResultSet resultSet = null;
480    //              try {
481    //                      callStmt  = conn.prepareCall( sql );
482                            callStmt.setQueryTimeout( DB_MAX_QUERY_TIMEOUT );
483                            if( fetchSize > 0 ) { callStmt.setFetchSize( fetchSize ); }
484                            Map<String,Class<?>> map = conn.getTypeMap();
485                            try {
486                                    map.put( ERR_MSG,Class.forName( "org.opengion.hayabusa.db.DBErrMsg" ) );
487                            }
488                            catch( ClassNotFoundException ex ) {
489                                    String errMsg = "org.opengion.hayabusa.db.DBErrMsg クラスが見つかりませんã€? + HybsSystem.CR
490                                                    + ex.getMessage();                      // // 5.1.8.0 (2010/07/01) errMsg 修正
491                                    throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
492                            }
493    
494                            ArrayDescriptor sd = ArrayDescriptor.createDescriptor( ARG_ARRAY, conn );
495                            ARRAY newArray = new ARRAY( sd,conn,StringUtil.rTrims( args ) );
496    
497                            callStmt.registerOutParameter(1, Types.INTEGER);
498                            callStmt.registerOutParameter(2, OracleTypes.ARRAY,ERR_MSG_ARRAY);
499                            callStmt.registerOutParameter(3, OracleTypes.CURSOR);
500                            ((OracleCallableStatement)callStmt).setARRAY( 4,newArray );
501    
502                            callStmt.execute();
503    
504                            errCode = callStmt.getInt(1);
505    
506                            if( errCode < ErrorMessage.NG ) {            // 異常以外ã?場å�?
507                                    resultSet = ((OracleCallableStatement)callStmt).getCursor(3);
508                            }
509                            if( errCode > ErrorMessage.OK ) {            // 正常以外ã?場å�?
510                                    ARRAY rtn3 = ((OracleCallableStatement)callStmt).getARRAY(2);
511                                    Object[] rtnval3 = (Object[])rtn3.getArray();
512                                    errMessage = new ErrorMessage( "Query_JDBCErrMsg Error!!" );
513                                    for( int i=0; i<rtnval3.length; i++ ) {
514                                            DBErrMsg er = (DBErrMsg)rtnval3[i];
515                                            if( er == null ) { break; }
516                                            errMessage.addMessage( er.getErrMsg() );
517                                    }
518                            }
519    //              }
520    //              finally {
521    //                      Closer.stmtClose( callStmt );
522    //                      callStmt = null;
523    //              }
524                    return resultSet;
525            }
526    
527            /**
528             * PrintWriter を取得しますã?
529             *
530             * ここでは、ä¸?ˆ¬çš?�ªファイル出力をè€??した PrintWriter を作æ?しますã?
531             *
532             * @og.rev 3.7.1.1 (2005/05/23) フォルãƒ?�Œなã�??合ã?、è¤?•°階層åˆ??フォルãƒ?‚’自動で作æ?しますã?
533             * @og.rev 3.8.0.0 (2005/06/07) FileUtil#getPrintWriter を利用ã€?
534             * @og.rev 5.6.1.0 (2013/02/01) 3.7.1.1のコメントに入ってã�?‚‹が対応されてã�?�ªã�??でフォルãƒ?½œæ?追åŠ?
535             *
536             * @return       出力用PrintWriterオブジェクãƒ?
537             */
538            private PrintWriter getPrintWriter() {
539                    if( filename == null ) {
540                            String errMsg = "ファイル名がセãƒ?ƒˆされてã�?�¾せんã€?;
541                            throw new HybsSystemException( errMsg );
542                    }
543                    String directory = HybsSystem.url2dir( fileURL );
544                    
545                    // 5.6.1.0 (2013/02/01) 
546                    File dir = new File(directory);
547                    if( ! dir.exists() && ! dir.mkdirs() ) {
548                            String errMsg = "ãƒ?‚£レクトリの作æ?に失敗しましたã€?" + directory + "]";
549                            throw new HybsSystemException( errMsg );
550                    }
551    
552    
553                    // ※ 注æ„?StringUtil.urlAppend をçµ?�¿込んでã�?‚‹意図が不æ?。ä¸?—¦削除してã�?�¾すが、注æ„?
554                    // 3.8.0.0 (2005/06/07) FileUtil#getPrintWriter を利用ã€?
555            //      out = FileUtil.getPrintWriter( StringUtil.urlAppend( directory,filename ),fileAppend,encode);
556    
557    //              処ç�?‚’簡ç´?Œ–しますã?
558    //              PrintWriter out = FileUtil.getPrintWriter( new File( directory,filename ),encode,fileAppend );
559    //              return out ;
560                    return FileUtil.getPrintWriter( new File( directory,filename ),encode,fileAppend );
561            }
562    
563            /**
564             * 名称配å?をå?に、リクエスト情報のãƒ??タを取得しますã?
565             *
566             * @og.rev 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?への対å¿?
567             *
568             * @param       nameArray       キーとなる名称の配å?
569             *
570             * @return      そã?リクエスト情報
571             */
572            private String[] getRequest( final String[] nameArray ) {
573                    String[] rtn = new String[nameArray.length];
574    
575                    for( int i=0; i<rtn.length; i++ ) {
576                            rtn[i] = getRequestValue( nameArray[i] );
577                    }
578    
579                    return rtn;
580            }
581    
582            /**
583             * 【TAGã€?通常は使ã�?�¾せん)検索時ã?DB接続IDを指定しまã�?初期値:DEFAULT)ã€?
584             *
585             * @og.tag
586             *   検索時ã?DB接続IDを指定しますã?初期値は、DEFAULT ですã?
587             *
588             * @param       id ãƒ??タベã?ス接続ID
589             */
590            public void setDbid( final String id ) {
591                    dbid = nval( getRequestParameter( id ),dbid );
592            }
593    
594            /**
595             * 【TAG】可変長ファイルを作æ?するときã?é ?›®区åˆ?‚Šæ–?­—をセãƒ?ƒˆしまã�?
596             *              (初期値:TAB_SEPARATOR[={@og.value #TAB_SEPARATOR}])ã€?
597             *
598             * @og.tag 可変長ファイルを作æ?するときã?é ?›®区åˆ?‚Šæ–?­—をセãƒ?ƒˆしますã?
599             * (初期値:ローカル定義のTAB_SEPARATOR[={@og.value #TAB_SEPARATOR}])ã€?
600             *
601             * @param   sep é ?›®区åˆ?‚Šæ–?­?
602             * @see         #TAB_SEPARATOR
603             */
604            public void setSeparator( final String sep ) {
605                    separator = nval( getRequestParameter( sep ),TAB_SEPARATOR );
606            }
607    
608            /**
609             * 【TAG】保存å?ãƒ?‚£レクトリ名をæŒ?®šしまã�?
610             *              (初期値:FILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])ã€?
611             *
612             * @og.tag
613             * こã?属æ?でæŒ?®šされるãƒ?‚£レクトリに、ファイルをセーブしますã?
614             * æŒ?®š方法ã?ã€??常の fileURL 属æ?と同様に、å?頭がã?'/' (UNIX) またã?ã€?¼’文字目がã?
615             * ":" (Windows)の場合ã?、指定ã?URLそã?ままのãƒ?‚£レクトリに、そã�?�§なã�??合ã?ã€?
616             * fileURL = "{&#064;USER.ID}" とæŒ?®šすると、FILE_URL 属æ?でæŒ?®šã?フォルãƒ??下にã€?
617             * さらに、各個人ID別のフォルãƒ?‚’作æ?して、そこにセーブしますã?
618             * (初期値:シスãƒ?ƒ 定数のFILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])ã€?
619             *
620             * @og.rev 3.5.4.3 (2004/01/05) å†?ƒ¨処ç�?‚’、makeFileURL に移動ã?
621             * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソãƒ?ƒ‰の利用
622             * @og.rev 4.0.0.0 (2007/11/20) æŒ?®šされたãƒ?‚£レクトリ名ã?æœ?¾Œが"\"or"/"で終わってã�?�ªã�??合にã€?/"を付加するã€?
623             *
624             * @param       url 保存å?ãƒ?‚£レクトリå�?
625             * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
626             */
627            public void setFileURL( final String url ) {
628                    String furl = nval( getRequestParameter( url ),null );
629                    if( furl != null ) {
630                            char ch = furl.charAt( furl.length()-1 );
631                            if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
632                            fileURL = StringUtil.urlAppend( fileURL,furl );
633                    }
634            }
635    
636            /**
637             * 【TAG】ファイルを作æ?するときã?ファイル名をセãƒ?ƒˆしまã�?初期値:シスãƒ?ƒ パラメータのFILE_FILENAME)ã€?
638             *
639             * @og.tag ファイルを作æ?するときã?ファイル名をセãƒ?ƒˆしますã?
640             *
641             * @param   fname ファイルå�?
642             */
643            public void setFilename( final String fname ) {
644                    filename = nval( getRequestParameter( fname ),filename );
645            }
646    
647            /**
648             * 【TAG】ZIPファイルを作æ?するときã?ZIPファイル名をセãƒ?ƒˆしまã�?初期値:filename + ".zip")ã€?
649             *
650             * @og.tag
651             * zip 属æ?に、true を指定したå?合に、ZIPファイル化しますã?そã?場合ã?ファイル名をæŒ?®šしますã?
652             * なにも指定しなã�??合ã?、filename + ".zip" になりますã?
653             *
654             * @param   zipFile ZIPファイルå�?
655             * @see #setZip( String )
656             */
657            public void setZipFilename( final String zipFile ) {
658                    zipFilename = nval( getRequestParameter( zipFile ),zipFilename );
659            }
660    
661            /**
662             * 【TAG】ファイルを作æ?するときã?ファイルエンコーãƒ?‚£ング名をセãƒ?ƒˆしまã�?
663             *              (初期値:FILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])ã€?
664             *
665             * @og.tag
666             * "DEFAULT","JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS"
667             * (初期値:シスãƒ?ƒ 定数のFILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])ã€?
668             *
669             * @og.rev 2.2.0.0 (2002/12/17) 中国èª?国際化)対å¿?エンコードã?取得方法変更
670             * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得するã?
671             *
672             * @param   enc ファイルエンコーãƒ?‚£ングå�?
673             * @see     <a href="http://www.iana.org/assignments/character-sets">IANA Charset Registry</a>
674             * @see         org.opengion.hayabusa.common.SystemData#FILE_ENCODE
675             */
676            public void setEncode( final String enc ) {
677                    encode = nval( getRequestParameter( enc ),encode );
678            }
679    
680            /**
681             * 【TAG】ã?ãƒ?ƒ€ーを書き込ã‚?�‹どã�?�‹[true/false]を指定しまã�?初期値:true)ã€?
682             *
683             * @og.tag
684             *  #Name ?¥?¥?¥?¥ ヘッãƒ??の書き込みを指定しますã?
685             * 通常は、書き込み(true)にしておき、使用側でコメントと解釈するよã�?�«
686             * 処ç�?‚’行うべきですã?コメントã?ため、append モードで途中に現れてã‚?
687             * 無視できますã?またã?エンジン標準でãƒ??タを取り込ã‚??合に、データの配置ã�?
688             * 変更されても取り込みプログラãƒ??そã?まま使用できますã?
689             * 初期値は、true(書き込ã‚?ですã?
690             *
691             * @param   flag ヘッãƒ??を書き込ã‚?�‹どã�?�‹ [true:書き込ã‚?false:書き込まない]
692             */
693            public void setUseHeader( final String flag ) {
694                    useHeader = nval( getRequestParameter( flag ),useHeader );
695            }
696    
697            /**
698             * 【TAG】追åŠ?ƒ¢ードで書き込ã‚?�‹どã�?�‹[true/false]を指定しまã�?初期値:false[通常モード])ã€?
699             *
700             * @og.tag
701             * ファイルを書き込ã‚??合ã?追åŠ?ƒ¢ードで書き込ã‚?�‹どã�?�‹をセãƒ?ƒˆしますã?
702             * 新規モーãƒ?true)の場合ã?既存ã?ファイルが存在しã?かつ書き込み許可があれã?ã€?
703             * 上書きで新規に作æ?しますã?
704             * 初期値は、false(新規モーãƒ?ですã?
705             *
706             * @param   flag [true:追åŠ?ƒ¢ーãƒ?false:新規モード]
707             */
708            public void setFileAppend( final String flag ) {
709                    fileAppend = nval( getRequestParameter( flag ),fileAppend );
710            }
711    
712            /**
713             * 【TAG】結果をファイルに出力するときに、ZIPで圧縮するかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
714             *
715             * @og.tag
716             * 大量に抜き出すå?合ã?そã?まま、サーバã?から取り出すだけでも大変ですã?
717             * zip 属æ?をã?true にすると、GZIP で圧縮したファイルを作æ?しますã?
718             * 初期値は、false(圧縮しなã�?ですã?
719             *
720             * @param  flag ZIPで圧縮 [true:する/それ以å¤?しない]
721             * @see    #setZipFilename( String )
722             */
723            public void setZip( final String flag ) {
724                    zip = nval( getRequestParameter( flag ),zip );
725            }
726    
727            /**
728             * 【TAG】検索結果を画面上に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0033[ã€?»¶検索しました])ã€?
729             *
730             * @og.tag
731             * ここでは、検索結果の件数ã‚?™»録された件数をまずå?力しã€?
732             * そã?次に、ここでæŒ?®šしたメãƒ?‚»ージをリソースから取得して
733             * 表示しますã?
734             * 表示させたくなã�??合ã?, displayMsg = "" をセãƒ?ƒˆしてくださいã€?
735             * 初期値は、検索件数を表示しますã?
736             *
737             * @param       id ãƒ?‚£スプレイに表示させるメãƒ?‚»ージ ID
738             */
739            public void setDisplayMsg( final String id ) {
740                    String ids = getRequestParameter( id );
741                    if( ids != null ) { displayMsg = ids; }
742            }
743    
744            /**
745             * 【TAG】検索結果がゼロ件の場合に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0077[対象ãƒ??タはありませんでした])ã€?
746             *
747             * @og.tag
748             * ここでは、検索結果がゼロ件の場合ã?み、特別なメãƒ?‚»ージを表示させますã?
749             * 従来は、displayMsg と兼用で、ã?0ã€?»¶検索しました』とã�?�†表示でしたがã?
750             * displayMsg の初期表示は、OFF になりましたので、ゼロ件の場合ã?み別に表示させますã?
751             * 表示させたくなã�??合ã?, notfoundMsg = "" をセãƒ?ƒˆしてくださいã€?
752             * 初期値は、MSG0077[対象ãƒ??タはありませんでした]ですã?
753             *
754             * @param       id ãƒ?‚£スプレイに表示させるメãƒ?‚»ージ ID
755             */
756            public void setNotfoundMsg( final String id ) {
757                    String ids = getRequestParameter( id );
758                    if( ids != null ) { notfoundMsg = ids; }
759            }
760    
761            /**
762             * 【TAGã€?通常は使ã�?�¾せん)ãƒ??タのフェãƒ?ƒ�サイズを指定しまã�?初期値:100)ã€?
763             *
764             * @og.tag
765             * より多くの行がå¿?¦�なときに、データベã?スから取り出すå¿?¦�がある行数に
766             * つã�?�¦のヒントを JDBC ドライバに提供しますã?
767             * æŒ?®šされた行数は、この Statement を使って作æ?された結果セãƒ?ƒˆにã�?�‘影響しますã?
768             * æŒ?®šされた値ã�?0 の場合ã?ヒントã?無視されますã?
769             * 初期値はã€?00 ですã?
770             *
771             * @param       size フェãƒ?ƒ�する行数(初期値:100)
772             */
773            public void setFetchSize( final String size ) {
774                    fetchSize = nval( getRequestParameter( size ),fetchSize );
775            }
776    
777            /**
778             * 【TAG】PL/SQLを利用する場合ã?引数にセãƒ?ƒˆすべã�?ãƒ??タの名称をCSV形式でè¤?•°æŒ?®šしますã?
779             *
780             * @og.tag
781             * è¤?•°ある場合ã?、カンマ区åˆ?‚Šæ–?­—で渡しますã?
782             * PL/SQL を使用しなã�??合ã?、無視されますã?
783             *
784             * @og.rev 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?への対å¿?
785             *
786             * @param       nm 引数の名称(è¤?•°ある場合ã?、カンマ区åˆ?‚Šæ–?­?
787             */
788            public void setNames( final String nm ) {
789                    names = nval( getRequestParameter( nm ),names );
790            }
791    
792            /**
793             * 【TAG】Query を発行する為のクラスID(JDBC,JDBCErrMsg)を指定しまã�?{@og.doc03Link queryType 初期値:JDBC})ã€?
794             *
795             * @og.tag
796             * ストアドã?ロシージャ等を実行するå?合に、queryType="JDBCErrMsg" ã‚?
797             * æŒ?®šするå¿?¦�がありますã?(それ以外ã?æŒ?®šã?、å?期å?の JDBC になりますã?)
798             * 初期値はã€?JDBC" ですã?
799             * {@og.doc03Link queryType Query_**** クラス}
800             *
801             * @og.rev 3.6.1.0 (2005/01/05) PL/SQLコール(JDBCErrMsg 形å¼?への対å¿?
802             *
803             * @param       id Query を発行する為の実クラス ID
804             */
805            public void setQueryType( final String id ) {
806                    // å†?ƒ¨çš?�«は、JDBCErrMsg:false / それ以å¤?true で管ç�?�—てã�?�¾すã?
807                    queryType = ! "JDBCErrMsg".equalsIgnoreCase( getRequestParameter( id ) );
808            }
809    
810            /**
811             * 【TAG】ファイルに行番号をå?力するかどã�?�‹(初期値:true)
812             *
813             * @og.tag
814             * ファイルに行番号をå?力するかどã�?�‹を指定しますã?
815             * 初期値は、true(出力すã‚?ですã?
816             * 
817             * @og.rev 5.5.7.1 (2012/10/05) 新規追åŠ?
818             * @param  flag 行番号出åŠ?[true:する/それ以å¤?しない]
819             */
820            public void setUseNumber( final String flag ) {
821                    useNumber = nval( getRequestParameter( flag ),useNumber );
822            }
823            
824            /**
825             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
826             *
827             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
828             * @serialData
829             *
830             * @param strm ObjectOutputStreamオブジェクãƒ?
831             */
832            private void writeObject( final ObjectOutputStream strm ) throws IOException {
833                    strm.defaultWriteObject();
834            }
835    
836            /**
837             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
838             *
839             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
840             *
841             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
842             * @serialData
843             *
844             * @param strm ObjectInputStreamオブジェクãƒ?
845             * @see #release2()
846             */
847            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
848                    strm.defaultReadObject();
849            }
850    
851            /**
852             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
853             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
854             *
855             * @return こã?クラスのæ–?­—å?表現
856             */
857            @Override
858            public String toString() {
859                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
860                                    .println( "VERSION"             ,VERSION        )
861                                    .println( "dbid"                ,dbid           )
862                                    .println( "separator"   ,separator      )
863                                    .println( "useHeader"   ,useHeader      )
864                                    .println( "fileURL"             ,fileURL        )
865                                    .println( "filename"    ,filename       )
866                                    .println( "zipFilename" ,zipFilename)
867                                    .println( "sql"                 ,sql            )
868                                    .println( "encode"              ,encode         )
869                                    .println( "fileAppend"  ,fileAppend     )
870                                    .println( "zip"                 ,zip            )
871                                    .println( "displayMsg"  ,displayMsg     )
872                                    .println( "dyStart"             ,dyStart        )
873                                    .println( "fetchSize"   ,fetchSize      )
874                                    .println( "queryType"   ,queryType      )
875                                    .println( "names"               ,names          )
876                                    .println( "errCode"             ,errCode        )
877                                    .println( "Other..."    ,getAttributes().getAttribute() )
878                                    .fixForm().toString() ;
879            }
880    }