001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.io;
017
018import java.io.PrintWriter;
019import java.util.List;
020import java.util.Locale;
021import java.util.Map;
022
023import org.opengion.hayabusa.common.HybsSystem;
024import org.opengion.hayabusa.common.HybsSystemException;
025import org.opengion.hayabusa.db.DBTableModel;
026import org.opengion.hayabusa.db.DBColumn;
027import org.opengion.fukurou.util.StringUtil;
028import org.opengion.fukurou.util.HybsEntry;
029
030/**
031 * 区切り文字指定(初期値:タブ)ゼロカンマファイルの書き出しクラスです。
032 *
033 * ラベル,名前,データの出力部のみオーバーライドすれば,各種出力フォーマットに合わせた
034 * サブクラスを実現する事が可能です。
035 * ゼロカンマファイルとは、EXCELのゼロサプレス対策として、頭ゼロの文字型データを出力する
036 * 時に、先頭にカンマ(')を付けて、ゼロが削除(見えなくなる)現象を抑止しているファイルです。
037 *
038 * このクラスは,可変長タブ区切り文字ファイルの出力機能を実現しています。
039 *
040 * @og.group ファイル出力
041 *
042 * @version  4.0
043 * @author       Kazuhiko Hasegawa
044 * @since    JDK5.0,
045 */
046public abstract class AbstractTableWriter implements TableWriter {
047        /** このプログラムのVERSION文字列を設定します。   {@value} */
048        private static final String VERSION = "6.0.1.2 (2014/08/08)" ;
049
050        /** dbType の簡易的な設定      {@value} */
051        public static final int STRING  = 0;
052        /** dbType の簡易的な設定      {@value} */
053        public static final int NVAR    = 1;
054        /** dbType の簡易的な設定      {@value} */
055        public static final int NUMBER  = 2;
056
057        protected DBTableModel  table           = null;
058        protected DBColumn[]    dbColumn        = null;                 // table に対するカラムオブジェクト(キャッシュ)
059        protected int   numberOfColumns         = -1;                   // 4.0.0 (2005/01/31) 出力対象のカラム数
060        protected int[]                 clmNo           = null;                 // 出力対象のカラム番号配列
061        protected int[]                 dbType          = null;                 // 5.1.6.0 (2010/05/01) dbType の簡易的な設定
062
063        private String  separator               = TAB_SEPARATOR;        // 項目区切り文字
064        private String  headerSequence  = HybsSystem.sys( "WRITER_HEADER_SEQUENCE" ) ;
065        private boolean append                  = false;                        // 3.5.4.2 (2003/12/15)
066        private String  lang                    = null;
067        private String  columns                 = null;                         // 4.0.0 (2005/11/30) 外部指定のカラム名
068        private String  encode                  = null;                         // 3.5.4.5 (2004/01/23) エンコード文字列指定
069
070        private boolean useNumber               = true;                         // 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
071        private boolean useRenderer             = false;                        // 5.2.1.0 (2010/10/01)
072
073        /**
074         * DBTableModel から 各形式のデータを作成して,PrintWriter に書き出します。
075         * このメソッドは、EXCEL 書き出し時に使用します。
076         *
077         * @see #isExcel()
078         */
079        abstract public void writeDBTable();
080
081        /**
082         * DBTableModel から データを作成して,PrintWriter に書き出します。
083         *
084         * @param       writer PrintWriterオブジェクト
085         */
086        abstract public void writeDBTable( final PrintWriter writer );
087
088        /**
089         * numberOfColumns と DBColumn を初期化します。
090         * 内部的に、DBTableModel、lang , columns を使用して、
091         * numberOfColumns 、dbColumn、clmNo、dbType の値を初期化します。
092         * カラムが1項目もない場合、言語(lnag)が未指定、DBTableModelが未指定(null)
093         * の場合は、false を返します。その場合は、以下の処理は正常に行えません。
094         * データが0件の場合は、処理を行います。通常、ヘッダーのみのファイルを
095         * 作成することになります。(これを雛形として、取込データを登録する事が可能)
096         *
097         * 6.0.1.2 (2014/08/08)
098         *  clmNo 配列に、-1 がセットされた場合、DBTableModel に存在しないカラムとして
099         *  そのカラム列は、書き込みしません。,,,, などを指定する事で、カラムを
100         *  飛ばして書き込むことが可能です。
101         *  refFileURL、refFilename、refSheetName とともに使用すれば、ある程度の
102         *  レイアウト設定が可能です。
103         *
104         * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用
105         * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値を設定
106         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
107         *
108         * @return      初期化成功:true / 失敗:false
109         */
110        protected boolean createDBColumn() {
111
112                boolean rtnFlag = false;
113                if( lang != null && table != null ) {
114                        if( columns != null ) {
115                                String[] clms = StringUtil.csv2Array( columns );
116                                numberOfColumns = clms.length;
117                                clmNo = new int[numberOfColumns];
118                                for( int i=0; i<numberOfColumns; i++ ) {
119//                                      int no = table.getColumnNo( clms[i] );
120                                        int no = table.getColumnNo( clms[i],false );    // 6.0.1.2 (2014/08/08) カラム飛ばし
121                                        clmNo[i] = no;
122                                }
123                        }
124                        else {
125                                numberOfColumns = table.getColumnCount();
126                                clmNo = new int[numberOfColumns];
127                                for( int i=0; i<numberOfColumns; i++ ) {
128                                        clmNo[i] = i;
129                                }
130                        }
131
132                        dbColumn = table.getDBColumns();
133                        rtnFlag  = numberOfColumns > 0 ;        // カラムが1項目以上あれば成功
134
135                        // 5.1.6.0 (2010/05/01) DbType の初期値を設定する。
136                        dbType = new int[numberOfColumns];
137                        for( int i=0; i<numberOfColumns; i++ ) {
138                                // 6.0.1.2 (2014/08/08) カラム飛ばし の場合は、clmNo[i] には、-1 が設定されている。
139                                if( clmNo[i] < 0 ) { continue; }
140
141                                String type = dbColumn[clmNo[i]].getDbType();
142                                if( "NVAR".equals( type ) ) {
143                                        dbType[i] = NVAR;
144                                }
145                                else if( "S9".equals( type ) || "R".equals( type )  ) {
146                                        dbType[i] = NUMBER;
147                                }
148                                else {
149                                        dbType[i] = STRING;
150                                }
151                        }
152                }
153                return rtnFlag;
154        }
155
156        /**
157         * PrintWriter に DBTableModelのヘッダー情報を書き込みます。
158         *
159         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
160         *
161         * @param       writer PrintWriterオブジェクト
162         */
163        protected void writeHeader( final PrintWriter writer ) {
164                // ここでは処理を行いません。
165        }
166
167        /**
168         * PrintWriter に DBTableModelのラベル情報を書き込みます。
169         * 第一カラム目は、ラベル情報を示す "#Label" を書き込みます。
170         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
171         *
172         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
173         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
174         * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用
175         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
176         *
177         * @param       table DBTableModelオブジェクト
178         * @param       writer PrintWriterオブジェクト
179         */
180        protected void writeLabel( final DBTableModel table,final PrintWriter writer ) {
181                if( useNumber ) {
182                        writer.print( "#Label" );
183                        writer.print( separator );
184                }
185                else {
186                        writer.print( "#" );
187                }
188
189                for( int i=0; i<numberOfColumns; i++ ) {
190                        if( i != 0 ) { writer.print( separator ); }
191                        int clm = clmNo[i];
192                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
193                        writer.print( dbColumn[clm].getLabel() );
194                }
195                writer.println();
196        }
197
198        /**
199         * PrintWriter に DBTableModelの項目名情報を書き込みます。
200         * 第一カラム目は、項目名情報を示す "#Name" を書き込みます。
201         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
202         *
203         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
204         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
205         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
206         *
207         * @param       table DBTableModelオブジェクト
208         * @param       writer PrintWriterオブジェクト
209         */
210        protected void writeName( final DBTableModel table,final PrintWriter writer ) {
211                if( useNumber ) {
212                        writer.print( "#Name" );
213                        writer.print( separator );
214                }
215                else {
216                        writer.print( "#" );
217                }
218
219                for( int i=0; i<numberOfColumns; i++ ) {
220                        if( i != 0 ) { writer.print( separator ); }
221                        int clm = clmNo[i];
222                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
223                        writer.print( table.getColumnName(clm) );
224                }
225                writer.println();
226        }
227
228        /**
229         * PrintWriter に DBTableModelのサイズ情報を書き込みます。
230         * 第一カラム目は、サイズ情報を示す "#Size" を書き込みます。
231         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
232         *
233         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
234         * @og.rev 3.5.5.5 (2004/04/23) DBColumn の size と maxlength の 意味を変更
235         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
236         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
237         *
238         * @param       table DBTableModelオブジェクト
239         * @param       writer PrintWriterオブジェクト
240         */
241        protected void writeSize( final DBTableModel table,final PrintWriter writer ) {
242                if( useNumber ) {
243                        writer.print( "#Size" );
244                        writer.print( separator );
245                }
246                else {
247                        writer.print( "#" );
248                }
249
250                for( int i=0; i<numberOfColumns; i++ ) {
251                        if( i != 0 ) { writer.print( separator ); }
252                        int clm = clmNo[i];
253                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
254                        writer.print( dbColumn[clm].getTotalSize() );   // 4.0.0 (2005/01/31) メソッド名変更
255                }
256                writer.println();
257        }
258
259        /**
260         * PrintWriter に DBTableModelのクラス名情報を書き込みます。
261         * 第一カラム目は、サイズ情報を示す "#Class" を書き込みます。
262         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
263         *
264         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
265         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
266         *
267         * @param       table DBTableModelオブジェクト
268         * @param       writer PrintWriterオブジェクト
269         */
270        protected void writeClass( final DBTableModel table,final PrintWriter writer ) {
271                if( useNumber ) {
272                        writer.print( "#Class" );
273                        writer.print( separator );
274                }
275                else {
276                        writer.print( "#" );
277                }
278
279                for( int i=0; i<numberOfColumns; i++ ) {
280                        if( i != 0 ) { writer.print( separator ); }
281                        int clm = clmNo[i];
282                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
283                        writer.print( dbColumn[clm].getClassName() );
284                }
285                writer.println();
286        }
287
288        /**
289         * PrintWriter に セパレーターを書き込みます。
290         * 第一カラム目は、サイズ情報を示す "#----" を書き込みます。
291         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
292         *
293         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
294         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
295         *
296         * @param       table DBTableModelオブジェクト
297         * @param       writer PrintWriterオブジェクト
298         */
299        protected void writeSeparator( final DBTableModel table,final PrintWriter writer ) {
300                String sep = "----" ;
301                if( useNumber ) {
302                        writer.print( "#----" );
303                        writer.print( separator );
304                }
305                else {
306                        writer.print( "#" );
307                }
308
309                for( int i=0; i<numberOfColumns; i++ ) {
310                        if( i != 0 ) { writer.print( separator ); }
311                        writer.print( sep );
312                }
313                writer.println();
314        }
315
316        /**
317         * PrintWriter に DBTableModelのテーブル情報を書き込みます。
318         * このクラスでは,データを ダブルコーテーション(")で囲みます。
319         * PrintWriter に DBTableModelのテーブル情報を書き込みます。
320         *
321         * @og.rev 2.0.0.5 (2002/09/30) 先頭が0 でかつ数字タイプ(S9 or R)でない場合に ' を出力するように修正。
322         * @og.rev 2.3.1.2 (2003/01/28) データ出力時に、改行が余分に出される箇所を修正。
323         * @og.rev 3.1.0.0 (2003/03/20) DBColumn から、getDbType() キーを直接取り出す
324         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
325         * @og.rev 3.3.3.1 (2003/07/18) ファイルリード/ライト時に後ろスペースの除去を行います。
326         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
327         * @og.rev 3.8.0.1 (2005/06/17) DBTypeが NVAR の場合は、元のUnicodeに戻します。
328         * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値(dbType)を利用する。
329         * @og.rev 5.2.1.0 (2010/10/01) このメソッドは、abstract 化します。
330         *
331         * @param       table DBTableModelオブジェクト
332         * @param       writer PrintWriterオブジェクト
333         */
334        abstract protected void writeData( final DBTableModel table,final PrintWriter writer ) ;
335
336        /**
337         * DBTableModel をセットします。
338         *
339         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
340         * @og.rev 3.5.4.2 (2003/12/15) lang 引数も同時に設定します。
341         *
342         * @param       table DBTableModelオブジェクト
343         * @param       lang 言語コード
344         */
345        public void setDBTableModel( final DBTableModel table, final String lang ) {
346                this.table = table;
347                this.lang = lang;
348        }
349
350        /**
351         * 内部の DBTableModel を返します。
352         *
353         * @return      DBTableModelオブジェクト
354         */
355        public DBTableModel getDBTableModel() {
356                return table;
357        }
358
359        /**
360         * DBTableModelの出力順をセットします。
361         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
362         * 出力順を設定します。
363         *
364         * なお,出力順に指定しない項目は出力されません
365         *
366         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
367         *
368         * @param       hs 出力順 (LNSCD など)
369         */
370        public void setHeaderSequence( final String hs ) {
371                if( hs != null ) { headerSequence = hs ; }
372        }
373
374        /**
375         * DBTableModelの出力順を返します。
376         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
377         * 出力順を設定します。
378         *
379         * なお,出力順に指定しない項目は出力されません
380         *
381         * @return      出力順 (LNSCD など)
382         */
383        public String getHeaderSequence() {
384                return headerSequence ;
385        }
386
387        /**
388         * データを書き込む場合の,区切り文字をセットします。
389         *
390         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
391         *
392         * @param       sep 区切り文字
393         */
394        public void setSeparator( final String sep ) {
395                if( sep != null ) { this.separator = sep; }
396        }
397
398        /**
399         * データを書き込む場合の,区切り文字を返します。
400         *
401         * @return      区切り文字
402         */
403        public String getSeparator() {
404                return separator;
405        }
406
407        /**
408         * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを設定します。
409         * 初期値は、false(新規モード)です。
410         *
411         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
412         *
413         * @param       flag    [true:追加モード/false:新規モード]
414         */
415        public void setAppend( final boolean flag ) {
416                append = flag;
417        }
418
419        /**
420         * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを取得します。
421         * 初期値は、false(新規モード)です。
422         *
423         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
424         *
425         * @return      true(追加モード)/false(新規モード)
426         */
427        public boolean isAppend() {
428                return append ;
429        }
430
431        /**
432         * DBTableModelのデータとして読み込むときのシート名を設定します。
433         * 初期値は、"Sheet1" です。
434         * これは、EXCEL追加機能として実装されています。
435         * ※ このクラスでは実装されていません。
436         *
437         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
438         * @og.rev 3.5.4.3 (2004/01/05) 実装廃止(TableWriter_Excel へ移動)
439         *
440         * @param   sheetName シート名
441         */
442        public void setSheetName( final String sheetName ) {
443                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
444                throw new UnsupportedOperationException( errMsg );
445        }
446
447        /**
448         * EXCEL雛型参考ファイルのシート名を設定します。
449         * これは、EXCEL追加機能として実装されています。
450         *
451         * EXCELファイルを書き出す時に、雛型として参照するシート名を指定します。
452         * これにより、複数の形式の異なるデータを順次書き出したり(appendモードを併用)する
453         * ことや、シートを指定して新規にEXCELを作成する場合にフォームを設定する事が可能になります。
454         * 初期値は、null(第一シート) です。
455         * ※ このクラスでは実装されていません。
456         *
457         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
458         *
459         * @param   sheetName シート名
460         */
461        public void setRefSheetName( final String sheetName )  {
462                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
463                throw new UnsupportedOperationException( errMsg );
464        }
465
466        /**
467         * このクラスが、EXCEL対応機能を持っているかどうかを返します。
468         *
469         * EXCEL対応機能とは、シート名のセット、雛型参照ファイル名のセット、
470         * 書き込み元ファイルのFileオブジェクト取得などの、特殊機能です。
471         * 本来は、インターフェースを分けるべきと考えますが、taglib クラス等の
472         * 関係があり、問い合わせによる条件分岐で対応します。
473         *
474         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
475         *
476         * @return      EXCEL対応機能を持っているかどうか(ここでは、false固定です)
477         */
478        public boolean isExcel() {
479                return false;
480        }
481
482        /**
483         * 出力先ファイル名をセットします。(DIR + Filename)
484         * これは、EXCEL追加機能として実装されています。
485         * ※ このクラスでは実装されていません。
486         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
487         *
488         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
489         *
490         * @param   filename EXCEL雛型参考ファイル名
491         */
492        public void setFilename( final String filename ) {
493                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
494                throw new UnsupportedOperationException( errMsg );
495        }
496
497        /**
498         * EXCEL雛型参考ファイル名をセットします。(DIR + Filename)
499         * これは、EXCEL追加機能として実装されています。
500         * ※ このクラスでは実装されていません。
501         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
502         *
503         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
504         *
505         * @param   filename EXCEL雛型参考ファイル名
506         */
507        public void setRefFilename( final String filename ) {
508                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
509                throw new UnsupportedOperationException( errMsg );
510        }
511
512        /**
513         * EXCEL出力時のデフォルトフォント名を設定します。
514         * これは、EXCEL追加機能として実装されています。
515         *
516         * EXCELファイルを書き出す時に、デフォルトフォント名を指定します。
517         * フォント名は、EXCELのフォント名をそのまま使用してください。
518         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String )
519         * に設定されます。
520         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_NAME です。
521         *
522         * ※ このクラスでは実装されていません。
523         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
524         *
525         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
526         *
527         * @param   fontName フォント名
528         */
529        public void setFontName( final String fontName ) {
530                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
531                throw new UnsupportedOperationException( errMsg );
532        }
533
534        /**
535         * EXCEL出力時のデフォルトフォントポイント数を設定します。
536         * これは、EXCEL追加機能として実装されています。
537         *
538         * EXCELファイルを書き出す時に、デフォルトポイント数を指定します。
539         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short )
540         * に設定されます。
541         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_POINTS です。
542         *
543         * ※ このクラスでは実装されていません。
544         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
545         *
546         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
547         *
548         * @param       point   フォントポイント数
549         */
550        public void setFontPoint( final short point ) {
551                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
552                throw new UnsupportedOperationException( errMsg );
553        }
554
555        /**
556         * 読み取り元ファイルのエンコード文字列を指定します。
557         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
558         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
559         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト)
560         *
561         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
562         *
563         * @param   enc ファイルのエンコード文字列
564         */
565        public void setEncode( final String enc ) {
566                encode = enc;
567        }
568
569        /**
570         * 読み取り元ファイルのエンコード文字列を取得します。
571         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
572         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
573         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト)
574         *
575         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
576         *
577         * @return      ファイルのエンコード文字列
578         */
579        protected String getEncode() {
580                return encode;
581        }
582
583        /**
584         * 行番号情報を、出力する(true)/しない(false)を指定します。
585         *
586         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
587         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
588         * (#NAME 属性は、読み取り時には、必須です。)
589         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、
590         * このシステムでは、#NAME 属性が出力されないため、読み込みできません。)
591         * この行番号を出力しないようにできます。
592         * 初期値は、true(出力する) です。
593         *
594         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
595         *
596         * @param   useNumber 行番号情報を [true:出力する/false:しない]
597         */
598        public void setUseNumber( final boolean useNumber ) {
599                this.useNumber = useNumber;
600        }
601
602        /**
603         * 行番号情報を、出力する(true)/しない(false)を返します。
604         *
605         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
606         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
607         * (#NAME 属性は、読み取り時には、必須です。)
608         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、
609         * このシステムでは、#NAME 属性が出力されないため、読み込みできません。)
610         * この行番号を出力しないようにできます。
611         * 初期値は、true(出力する) です。
612         *
613         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
614         *
615         * @return   行番号情報を、出力する(true)/しない(false)
616         */
617        protected boolean isUseNumber() {
618                return useNumber;
619        }
620
621        /**
622         * パラメーターリストをセットします。
623         * 内部は、HybsEntry クラスを持っています。
624         * 引数が、null の場合は、何もしません。
625         * ※ このクラスでは実装されていません。
626         *
627         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
628         *
629         * @param   listParam   パラメーターリスト
630         */
631        public void setParam( final List<HybsEntry> listParam ) {
632                String errMsg = "このメソッドは、XML追加機能ですので、使用できません。";
633                throw new UnsupportedOperationException( errMsg );
634        }
635
636        /**
637         * 出力先ファイルのカラム列を、外部(タグ)よりCSV形式の文字列で指定します。
638         * ただし、指定のカラム名は、DBTableModel上に存在している必要があります。
639         *
640         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
641         *
642         * @param   clms 出力先ファイルのカラム列(カンマ区切り文字)
643         */
644        public void setColumns( final String clms ) {
645                columns = clms ;
646        }
647
648        /**
649         * データの書き込み開始行番号を設定します(初期値:0)。
650         *
651         * TAB区切りテキストやEXCEL等のデータの書き込みの開始行番号を指定します。
652         * 属性名は、行を飛ばす処理ということで、readTable タグと同じ名称です。
653         * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす
654         * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。)
655         * 行の読み飛ばしと、カラムの読み飛ばし(columns)、refFileURL、refFilename、
656         * refSheetName とともに使用すれば、ある程度のレイアウト設定が可能です。
657         * なお、この機能は、TableWriter_Excel のみに実装します。
658         *
659         * @og.rev 5.7.9.0 (2014/08/08) 新規作成
660         *
661         * @param       skipRowCount 書き込み開始行番号
662         */
663        public void setSkipRowCount( final int skipRowCount ) {
664                if( skipRowCount != 0 ) {
665                        String errMsg = "このメソッドは、TableWriter_Excel のみの機能ですので、使用できません。";
666                        throw new UnsupportedOperationException( errMsg );
667                }
668        }
669
670        /**
671         * 書込処理でコードリソースのラベル変換を行うかどうか[true/false]を指定します。
672         *
673         * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれているのか
674         * 不明になります。
675         * これは、コードリソースをラベルに変換して出力するかどうかを指定します。
676         * 当然、コードはユニークですが、ラベルはユニークになるかどうか保障はされていませんので
677         * TableReader 系で読み込む場合には、リスクが発生します。
678         * また、TableReader 系で読み込む場合にも、ラベルからコードを求める逆変換を行うように、
679         * setUseRenderer メソッドで指定する必要があります。
680         *
681         * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応していましたが、
682         * このメソッドの属性値のフラグで、制御します。
683         *
684         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
685         *
686         * @param       useRenderer     コードリソースのラベル変換を行うかどうか [true:行う/false:行わない]
687         */
688        public void setUseRenderer( final boolean useRenderer ) {
689                this.useRenderer = useRenderer;
690        }
691
692        /**
693         * 書き出し処理でコードリソースのラベル変換を行うかどうかを返します。
694         * 初期値は、false(行わない) です。
695         *
696         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
697         *
698         * @return      ラベル変換を行うかどうか(true:行う/false:行わない)
699         */
700        protected boolean isUseRenderer() {
701                return useRenderer ;
702        }
703
704        /**
705         * データを ダブルコーテーション(")で囲みます。
706         *
707         * この処理では、前後をダブルクオートで囲うため、改行の有無は判定する
708         * 必要はありません。
709         * ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加します。
710         *
711         * @param        data 元のString文字列
712         *
713         * @return       ダブルコーテーションで囲まれた文字列
714         */
715        protected String quotation( final String data ) {
716                return "\"" + StringUtil.replace( data,"\"","\"\"" ) + "\"" ;
717        }
718
719        /**
720         * データに対して 改行、ダブルクオート等の処理を行います。
721         *
722         * これは、データの前後をダブルクオートで括る quotation(String)と異なり
723         * 前後には、ダブルクオート を追加しません。
724         * ただし、以下の2つの条件で処理を行います。
725         * 1.改行を含む場合は、ダブルクオートを強制的に前後に追加する。
726         * 2.ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加する。
727         *
728         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
729         *
730         * @param        data 元のString文字列
731         *
732         * @return       改行、ダブルクオート等の処理
733         */
734        protected String quotation2( final String data ) {
735                String rtn = StringUtil.replace( data,"\"","\"\"" );
736                if( rtn != null && rtn.indexOf( HybsSystem.CR ) >= 0 ) {
737                        rtn = "\"" + rtn + "\"" ;
738                }
739
740                return rtn ;
741        }
742
743        /**
744         * keys の整合性チェックを行います。
745         *
746         * キーかkeysMapのどちらかが null の場合は、何もしません。
747         * チェックするキーは、内部で大文字に変換しておきます。
748         * keysMap に登録するキーは、大文字で登録しておいてください。
749         * ここのチェックでは、キーマップに存在しなければ、エラーになります。
750         *
751         * @og.rev 5.6.6.1 (2013/07/12) keys の整合性チェックを行います。
752         *
753         * @param   key チェックするキー文字列(null の場合は、処理しない)
754         * @param   keysMap 利用可能なキーのマップ(大文字に統一)
755         */
756        protected void checkParam( final String key,final Map<String,String> keysMap ) {
757                // key か keysMap かどちらかが null の場合は、処理を行わない。
758                if( key == null || keysMap == null ) { return; }
759
760                String upKey = key.toUpperCase(Locale.JAPAN);
761
762                if( ! keysMap.containsKey( upKey ) ) {
763                        String BR = "<br />" + HybsSystem.CR ;
764                        StringBuilder errMsg = new StringBuilder();
765                        errMsg.append( BR )
766                                  .append( "指定のキーは、この tableWriter では、使用できません。" ).append( BR )
767                                  .append( "  class=[" ).append( getClass().getName() ).append( "]" ).append( BR )
768                                  .append( "  key  =[" ).append( key                              ).append( "]" ).append( BR )
769                                  .append( "  ======== usage keys ======== " ).append( BR ) ;
770                        for( Map.Entry<String, String> entry : keysMap.entrySet() ) {
771                                errMsg.append( "  " ).append( entry.getKey() ).append( " : " )
772                                                                         .append( entry.getValue() ).append( BR ) ;
773                        }
774                        errMsg.append( "  ============================ " ).append( BR );
775
776                        throw new HybsSystemException( errMsg.toString() );
777                }
778        }
779}