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.fukurou.system.HybsConst ;          // 6.1.0.0 (2014/12/26)
024import org.opengion.fukurou.util.StringUtil;
025import org.opengion.fukurou.util.HybsEntry;
026import org.opengion.hayabusa.common.HybsSystem;
027import org.opengion.hayabusa.common.HybsSystemException;
028import org.opengion.hayabusa.db.DBTableModel;
029import org.opengion.hayabusa.db.DBColumn;
030
031/**
032 * 区切り文字指定(初期値:タブ)ゼロカンマファイルの書き出しクラスです。
033 *
034 * ラベル,名前,データの出力部のみオーバーライドすれば,各種出力フォーマットに合わせた
035 * サブクラスを実現する事が可能です。
036 * ゼロカンマファイルとは、EXCELのゼロサプレス対策として、頭ゼロの文字型データを出力する
037 * 時に、先頭にカンマ(')を付けて、ゼロが削除(見えなくなる)現象を抑止しているファイルです。
038 *
039 * このクラスは,可変長タブ区切り文字ファイルの出力機能を実現しています。
040 *
041 * @og.group ファイル出力
042 *
043 * @version  4.0
044 * @author       Kazuhiko Hasegawa
045 * @since    JDK5.0,
046 */
047public abstract class AbstractTableWriter implements TableWriter {
048        /** このプログラムのVERSION文字列を設定します。   {@value} */
049        private static final String VERSION = "7.2.6.1 (2020/07/17)" ;
050
051        /** システムの改行コードを設定します。*/
052        protected static final String CR                 = HybsConst.CR;                        // 6.1.0.0 (2014/12/26) refactoring
053        /** StringBilderなどの初期値を設定します。   {@value} */
054        protected static final int BUFFER_MIDDLE = HybsConst.BUFFER_MIDDLE;     // 6.1.0.0 (2014/12/26) refactoring
055
056        /** dbType の簡易的な設定      {@value} */
057        public static final int STRING  = 0;
058        /** dbType の簡易的な設定      {@value} */
059        public static final int NVAR    = 1;
060        /** dbType の簡易的な設定      {@value} */
061        public static final int NUMBER  = 2;
062
063        /** 出力対象のカラム数  */
064        protected int   numberOfColumns         = -1;           // 4.0.0 (2005/01/31) 出力対象のカラム数
065        /** テーブルモデル  */
066        protected DBTableModel  table           ;
067        /** DBカラム  */
068        protected DBColumn[]    dbColumn        ;                       // table に対するカラムオブジェクト(キャッシュ)
069        /** カラム数  */
070        protected int[]                 clmNo           ;                       // 出力対象のカラム番号配列
071        /** DBタイプ  */
072        protected int[]                 dbType          ;                       // 5.1.6.0 (2010/05/01) dbType の簡易的な設定
073        /** KeyLabel出力  */
074        protected boolean[]             isKeyLbl        ;                       // 6.2.3.0 (2015/05/01) KeyLabel出力
075
076        private String  separator               = TAB_SEPARATOR;        // 項目区切り文字
077        private String  headerSequence  = HybsSystem.sys( "WRITER_HEADER_SEQUENCE" ) ;
078        private boolean append                  ;                               // 3.5.4.2 (2003/12/15)
079        private String  lang                    ;
080        private String  columns                 ;                               // 4.0.0 (2005/11/30) 外部指定のカラム名
081        // 6.1.0.0 (2014/12/26) 書き込み対象外のカラム列を、外部(タグ)より指定する。
082        private String  omitNames               ;                               // 6.1.0.0 (2014/12/26)
083        private String  encode                  ;                               // 3.5.4.5 (2004/01/23) エンコード文字列指定
084
085        private boolean useNumber               = true;                 // 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
086        private boolean useRenderer             ;                               // 5.2.1.0 (2010/10/01)
087
088        private boolean   useDebug              ;                               // 6.1.0.0 (2014/12/26) デバッグ情報の出力するかどうか
089
090        /**
091         * デフォルトコンストラクター
092         *
093         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
094         */
095        protected AbstractTableWriter() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
096
097        /**
098         * DBTableModel から 各形式のデータを作成して,PrintWriter に書き出します。
099         * このメソッドは、EXCEL 書き出し時に使用します。
100         *
101         * @see #isExcel()
102         */
103        @Override       // TableWriter
104        public abstract void writeDBTable();
105
106        /**
107         * DBTableModel から データを作成して,PrintWriter に書き出します。
108         *
109         * @param       writer PrintWriterオブジェクト
110         */
111        @Override       // TableWriter
112        public abstract void writeDBTable( final PrintWriter writer );
113
114        /**
115         * numberOfColumns と DBColumn を初期化します。
116         * 内部的に、DBTableModel、lang , columns を使用して、
117         * numberOfColumns 、dbColumn、clmNo、dbType の値を初期化します。
118         * カラムが1項目もない場合、言語(lnag)が未指定、DBTableModelが未指定(null)
119         * の場合は、false を返します。その場合は、以下の処理は正常に行えません。
120         * データが0件の場合は、処理を行います。通常、ヘッダーのみのファイルを
121         * 作成することになります。(これを雛形として、取込データを登録する事が可能)
122         *
123         * 6.0.1.2 (2014/08/08)
124         *  clmNo 配列に、-1 がセットされた場合、DBTableModel に存在しないカラムとして
125         *  そのカラム列は、書き込みしません。,,,, などを指定する事で、カラムを
126         *  飛ばして書き込むことが可能です。
127         *  refFileURL、refFilename、refSheetName とともに使用すれば、ある程度の
128         *  レイアウト設定が可能です。
129         *
130         * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用
131         * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値を設定
132         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
133         * @og.rev 6.0.2.0 (2014/09/19) EXCEL新機能対応(2回呼ばれない様にする)
134         * @og.rev 6.1.0.0 (2014/12/26) omitNames 属性を追加
135         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
136         *
137         * @return      初期化成功:true / 失敗:false
138         */
139        protected boolean createDBColumn() {
140                if( numberOfColumns >= 0 ) { return true; }             // 6.0.2.0 (2014/09/19) EXCEL新機能対応(2回呼ばれない様にする)
141
142                boolean rtnFlag = false;
143                if( lang != null && table != null ) {
144                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
145                        if( columns == null ) {
146                                numberOfColumns = table.getColumnCount();
147                                clmNo = new int[numberOfColumns];
148                                for( int i=0; i<numberOfColumns; i++ ) {
149                                        clmNo[i] = i;
150                                }
151                        }
152                        else {
153                                final String[] clms = StringUtil.csv2Array( columns );
154                                numberOfColumns = clms.length;
155                                clmNo = new int[numberOfColumns];
156                                for( int i=0; i<numberOfColumns; i++ ) {
157                                        final int no = table.getColumnNo( clms[i],false );      // 6.0.1.2 (2014/08/08) カラム飛ばし
158                                        clmNo[i] = no;
159                                }
160                        }
161
162                        // 6.1.0.0 (2014/12/26) 書き込み対象外のカラム列を、外部(タグ)より指定する。(omitNames属性)
163                        if( omitNames != null ) {
164                                final String[] omit = StringUtil.csv2Array( omitNames );
165                                for( int j=0; j<omit.length; j++ ) {
166                                        // omitNames は、カラム飛ばしの機能を利用
167                                        final int no = table.getColumnNo( omit[j],false );
168                                        if( no >= 0 ) {
169                                                for( int i=0; i<numberOfColumns; i++ ) {
170                                                        if( clmNo[i] == no ) { clmNo[i] = -1 ; break; }         // omitカラムは、-1 を設定する。
171                                                }
172                                        }
173                                }
174                        }
175
176                        dbColumn = table.getDBColumns();
177                        rtnFlag  = numberOfColumns > 0 ;        // カラムが1項目以上あれば成功
178
179                        // 5.1.6.0 (2010/05/01) DbType の初期値を設定する。
180                        dbType   = new int[numberOfColumns];
181                        isKeyLbl = new boolean[numberOfColumns];                // 6.2.3.0 (2015/05/01) KeyLabel出力
182                        for( int i=0; i<numberOfColumns; i++ ) {
183                                final int clm = clmNo[i];                                       // 6.2.3.0 (2015/05/01)
184                                // 6.0.1.2 (2014/08/08) カラム飛ばし の場合は、clmNo[i] には、-1 が設定されている。
185                                if( clm < 0 ) { continue; }
186
187                                final String type = dbColumn[clm].getDbType();
188                                if( "NVAR".equals( type ) ) {
189                                        dbType[i] = NVAR;
190                                }
191                                else if( "S9".equals( type ) || "R".equals( type )  ) {
192                                        dbType[i] = NUMBER;
193                                }
194                                else {
195                                        dbType[i] = STRING;
196                                }
197
198                                // 6.2.3.0 (2015/05/01) KeyLabel出力
199                                isKeyLbl[i] = dbColumn[clm].isWriteKeyLabel();          // 6.2.3.0 (2015/05/01) KeyLabel出力
200                        }
201                }
202                return rtnFlag;
203        }
204
205        /**
206         * PrintWriter に DBTableModelのヘッダー情報を書き込みます。
207         *
208         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
209         *
210         * @param       writer PrintWriterオブジェクト
211         */
212        protected void writeHeader( final PrintWriter writer ) {
213                // ここでは処理を行いません。
214        }
215
216        /**
217         * PrintWriter に DBTableModelのヘッダー情報を書き込みます。
218         * ここでは、ラベル情報と同じデータを出力しますが、# を外します。
219         * また、ラベルを文字列としてダブルコーテーションでくくります。
220         *
221         * @og.rev 7.2.6.1 (2020/07/17) H:Header(ヘッダー)属性追加。
222         *
223         * @param       table  DBTableModelオブジェクト
224         * @param       writer PrintWriterオブジェクト
225         */
226        protected void writeLabel2( final DBTableModel table,final PrintWriter writer ) {
227                if( useNumber ) {
228                        writer.print( separator );
229                }
230
231                for( int i=0; i<numberOfColumns; i++ ) {
232                        if( i != 0 ) { writer.print( separator ); }
233                        final int clm = clmNo[i];
234                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
235                        final String val = StringUtil.tagCut( dbColumn[clm].getLabel() );               // 6.2.4.2 (2015/05/29)
236                        writer.print( quotation( val ) );
237                        // keyLabelの場合は、後ろのカラムのラベルを付けません。
238                        if( isKeyLbl[i] ) { writer.print( separator ); }        // 6.2.3.0 (2015/05/01) writeKeyLabel 属性
239                }
240                writer.println();
241        }
242
243        /**
244         * PrintWriter に DBTableModelのラベル情報を書き込みます。
245         * 第一カラム目は、ラベル情報を示す "#Label" を書き込みます。
246         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
247         *
248         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
249         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
250         * @og.rev 4.0.0.0 (2005/12/31) 外部指定のカラム名を使用
251         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
252         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
253         * @og.rev 6.2.4.2 (2015/05/29) StringUtil#tagCut(String) をラベルに適用します。
254         *
255         * @param       table DBTableModelオブジェクト
256         * @param       writer PrintWriterオブジェクト
257         */
258        protected void writeLabel( final DBTableModel table,final PrintWriter writer ) {
259                if( useNumber ) {
260                        writer.print( "#Label" );
261                        writer.print( separator );
262                }
263                else {
264                        writer.print( "#" );
265                }
266
267                for( int i=0; i<numberOfColumns; i++ ) {
268                        if( i != 0 ) { writer.print( separator ); }
269                        final int clm = clmNo[i];
270                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
271                        final String val = StringUtil.tagCut( dbColumn[clm].getLabel() );               // 6.2.4.2 (2015/05/29)
272                        writer.print( val );
273                        // keyLabelの場合は、後ろのカラムのラベルを付けません。
274                        if( isKeyLbl[i] ) { writer.print( separator ); }        // 6.2.3.0 (2015/05/01) writeKeyLabel 属性
275                }
276                writer.println();
277        }
278
279        /**
280         * PrintWriter に DBTableModelの項目名情報を書き込みます。
281         * 第一カラム目は、項目名情報を示す "#Name" を書き込みます。
282         * useNumber=fale の場合は、最初のカラム名の先頭に、# が書き込まれます。
283         *
284         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
285         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
286         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
287         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
288         *
289         * @param       table DBTableModelオブジェクト
290         * @param       writer PrintWriterオブジェクト
291         */
292        protected void writeName( final DBTableModel table,final PrintWriter writer ) {
293                if( useNumber ) {
294                        writer.print( "#Name" );
295                        writer.print( separator );
296                }
297                else {
298                        writer.print( "#" );
299                }
300
301                for( int i=0; i<numberOfColumns; i++ ) {
302                        if( i != 0 ) { writer.print( separator ); }
303                        final int clm = clmNo[i];
304                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
305                        writer.print( table.getColumnName(clm) );
306                        // keyLabelの場合は、後ろのカラムの名前を付けません。
307                        if( isKeyLbl[i] ) { writer.print( separator ); }        // 6.2.3.0 (2015/05/01) writeKeyLabel 属性
308                }
309                writer.println();
310        }
311
312        /**
313         * PrintWriter に DBTableModelのサイズ情報を書き込みます。
314         * 第一カラム目は、サイズ情報を示す "#Size" を書き込みます。
315         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
316         *
317         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
318         * @og.rev 3.5.5.5 (2004/04/23) DBColumn の size と maxlength の 意味を変更
319         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
320         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
321         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
322         *
323         * @param       table DBTableModelオブジェクト
324         * @param       writer PrintWriterオブジェクト
325         */
326        protected void writeSize( final DBTableModel table,final PrintWriter writer ) {
327                if( useNumber ) {
328                        writer.print( "#Size" );
329                        writer.print( separator );
330                }
331                else {
332                        writer.print( "#" );
333                }
334
335                for( int i=0; i<numberOfColumns; i++ ) {
336                        if( i != 0 ) { writer.print( separator ); }
337                        final int clm = clmNo[i];
338                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
339                        writer.print( dbColumn[clm].getTotalSize() );   // 4.0.0 (2005/01/31) メソッド名変更
340                        // keyLabelの場合は、後ろのカラムのサイズを付けません。
341                        if( isKeyLbl[i] ) { writer.print( separator ); }        // 6.2.3.0 (2015/05/01) writeKeyLabel 属性
342                }
343                writer.println();
344        }
345
346        /**
347         * PrintWriter に DBTableModelのクラス名情報を書き込みます。
348         * 第一カラム目は、サイズ情報を示す "#Class" を書き込みます。
349         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
350         *
351         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
352         * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加
353         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
354         *
355         * @param       table DBTableModelオブジェクト
356         * @param       writer PrintWriterオブジェクト
357         */
358        protected void writeClass( final DBTableModel table,final PrintWriter writer ) {
359                if( useNumber ) {
360                        writer.print( "#Class" );
361                        writer.print( separator );
362                }
363                else {
364                        writer.print( "#" );
365                }
366
367                for( int i=0; i<numberOfColumns; i++ ) {
368                        if( i != 0 ) { writer.print( separator ); }
369                        final int clm = clmNo[i];
370                        if( clm < 0 ) { continue; }                     // 6.0.1.2 (2014/08/08) カラム飛ばし
371                        writer.print( dbColumn[clm].getClassName() );
372                        // keyLabelの場合は、後ろのカラムのクラスを付けません。
373                        if( isKeyLbl[i] ) { writer.print( separator ); }        // 6.2.3.0 (2015/05/01) writeKeyLabel 属性
374                }
375                writer.println();
376        }
377
378        /**
379         * PrintWriter に セパレーターを書き込みます。
380         * 第一カラム目は、サイズ情報を示す "#----" を書き込みます。
381         * この行は、出力形式に無関係に、TableWriter.TAB_SEPARATOR で区切られます。
382         *
383         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
384         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
385         * @og.rev 6.2.3.0 (2015/05/01) writeKeyLabel 属性を追加
386         *
387         * @param       table DBTableModelオブジェクト
388         * @param       writer PrintWriterオブジェクト
389         */
390        protected void writeSeparator( final DBTableModel table,final PrintWriter writer ) {
391                final String sep = "----" ;
392                if( useNumber ) {
393                        writer.print( "#----" );
394                        writer.print( separator );
395                }
396                else {
397                        writer.print( "#" );
398                }
399
400                for( int i=0; i<numberOfColumns; i++ ) {
401                        if( i != 0 ) { writer.print( separator ); }
402                        writer.print( sep );
403                        // keyLabelの場合は、後ろのカラムのセパレーターを付けません。
404                        if( isKeyLbl[i] ) { writer.print( separator ); }        // 6.2.3.0 (2015/05/01) writeKeyLabel 属性
405                }
406                writer.println();
407        }
408
409        /**
410         * PrintWriter に DBTableModelのテーブル情報を書き込みます。
411         * このクラスでは,データを ダブルコーテーション(")で囲みます。
412         * PrintWriter に DBTableModelのテーブル情報を書き込みます。
413         *
414         * @og.rev 2.0.0.5 (2002/09/30) 先頭が0 でかつ数字タイプ(S9 or R)でない場合に ' を出力するように修正。
415         * @og.rev 2.3.1.2 (2003/01/28) データ出力時に、改行が余分に出される箇所を修正。
416         * @og.rev 3.1.0.0 (2003/03/20) DBColumn から、getDbType() キーを直接取り出す
417         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
418         * @og.rev 3.3.3.1 (2003/07/18) ファイルリード/ライト時に後ろスペースの除去を行います。
419         * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定
420         * @og.rev 3.8.0.1 (2005/06/17) DBTypeが NVAR の場合は、元のUnicodeに戻します。
421         * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値(dbType)を利用する。
422         * @og.rev 5.2.1.0 (2010/10/01) このメソッドは、abstract 化します。
423         *
424         * @param       table DBTableModelオブジェクト
425         * @param       writer PrintWriterオブジェクト
426         */
427        protected abstract void writeData( final DBTableModel table,final PrintWriter writer ) ;
428
429        /**
430         * DBTableModel をセットします。
431         *
432         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
433         * @og.rev 3.5.4.2 (2003/12/15) lang 引数も同時に設定します。
434         *
435         * @param       table DBTableModelオブジェクト
436         * @param       lang 言語コード
437         */
438        @Override       // TableWriter
439        public void setDBTableModel( final DBTableModel table, final String lang ) {
440                this.table = table;
441                this.lang = lang;
442        }
443
444        /**
445         * 内部の DBTableModel を返します。
446         *
447         * @return      DBTableModelオブジェクト
448         */
449        @Override       // TableWriter
450        public DBTableModel getDBTableModel() {
451                return table;
452        }
453
454        /**
455         * DBTableModelの出力順をセットします。
456         * Name,Label,Size,Class,Data の各フィールドの頭文字のアルファベットで
457         * 出力順を設定します。
458         *
459         * ※ 7.2.6.1 (2020/07/17) H:Header(ヘッダー)属性追加
460         *
461         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
462         *
463         * @param       hs 出力順 (LNSCD など)
464         */
465        @Override       // TableWriter
466        public void setHeaderSequence( final String hs ) {
467                if( hs != null ) { headerSequence = hs ; }
468        }
469
470        /**
471         * DBTableModelの出力順を返します。
472         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
473         * 出力順を設定します。
474         *
475         * なお,出力順に指定しない項目は出力されません
476         *
477         * @return      出力順 (LNSCD など)
478         */
479        @Override       // TableWriter
480        public String getHeaderSequence() {
481                return headerSequence ;
482        }
483
484        /**
485         * データを書き込む場合の,区切り文字をセットします。
486         *
487         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
488         *
489         * @param       sep 区切り文字
490         */
491        @Override       // TableWriter
492        public void setSeparator( final String sep ) {
493                if( sep != null ) { this.separator = sep; }
494        }
495
496        /**
497         * データを書き込む場合の,区切り文字を返します。
498         *
499         * @return      区切り文字
500         */
501        public String getSeparator() {
502                return separator;
503        }
504
505        /**
506         * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを設定します。
507         * 初期値は、false(新規モード)です。
508         *
509         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
510         *
511         * @param       flag    [true:追加モード/false:新規モード]
512         */
513        @Override       // TableWriter
514        public void setAppend( final boolean flag ) {
515                append = flag;
516        }
517
518        /**
519         * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを取得します。
520         * 初期値は、false(新規モード)です。
521         *
522         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
523         *
524         * @return      true(追加モード)/false(新規モード)
525         */
526        @Override       // TableWriter
527        public boolean isAppend() {
528                return append ;
529        }
530
531        /**
532         * DBTableModelのデータとして読み込むときのシート名を設定します。
533         * 初期値は、"Sheet1" です。
534         * これは、EXCEL追加機能として実装されています。
535         * ※ このクラスでは実装されていません。
536         *
537         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
538         * @og.rev 3.5.4.3 (2004/01/05) 実装廃止(TableWriter_Excel へ移動)
539         * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。
540         *
541         * @param   sheetName シート名
542         */
543        @Override       // TableWriter
544        public void setSheetName( final String sheetName ) {
545                final String errMsg = "sheetName は、EXCEL専用機能なので使用できません。[" + sheetName + "]";
546                System.err.println( errMsg );
547        }
548
549        /**
550         * EXCEL雛型参考ファイルのシート名を設定します。
551         * これは、EXCEL追加機能として実装されています。
552         *
553         * EXCELファイルを書き出す時に、雛型として参照するシート名を指定します。
554         * これにより、複数の形式の異なるデータを順次書き出したり(appendモードを併用)する
555         * ことや、シートを指定して新規にEXCELを作成する場合にフォームを設定する事が可能になります。
556         * 初期値は、null(第一シート) です。
557         * ※ このクラスでは実装されていません。
558         *
559         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
560         * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。
561         *
562         * @param   sheetName シート名
563         */
564        @Override       // TableWriter
565        public void setRefSheetName( final String sheetName )  {
566                final String errMsg = "refSheetName は、EXCEL専用機能なので使用できません。[" + sheetName + "]";
567                System.err.println( errMsg );
568        }
569
570        /**
571         * このクラスが、EXCEL対応機能を持っているかどうかを返します。
572         *
573         * EXCEL対応機能とは、シート名のセット、雛型参照ファイル名のセット、
574         * 書き込み元ファイルのFileオブジェクト取得などの、特殊機能です。
575         * 本来は、インターフェースを分けるべきと考えますが、taglib クラス等の
576         * 関係があり、問い合わせによる条件分岐で対応します。
577         *
578         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
579         *
580         * @return      EXCEL対応機能を持っているかどうか(ここでは、false固定です)
581         */
582        @Override       // TableWriter
583        public boolean isExcel() {
584                return false;
585        }
586
587        /**
588         * 出力先ディレクトリとファイル名をセットします。
589         * これは、EXCEL追加機能として実装されています。
590         * ※ このクラスでは実装されていません。
591         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
592         *
593         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
594         * @og.rev 6.0.2.0 (2014/09/19) ディレクトリとファイルを分けて管理します。
595         *
596         * @param   directory 出力先ディレクトリ名
597         * @param   filename  出力先ファイル名
598         */
599        @Override       // TableWriter
600        public void setFilename( final String directory , final String filename ) {
601                final String errMsg = "filename は、メソッドは、EXCEL追加機能ですので、使用できません。";
602                throw new UnsupportedOperationException( errMsg );
603        }
604
605        /**
606         * EXCEL雛型参考ファイル名をセットします。(DIR + Filename)
607         * これは、EXCEL追加機能として実装されています。
608         * ※ このクラスでは実装されていません。
609         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
610         *
611         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
612         * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。
613         *
614         * @param   filename EXCEL雛型参考ファイル名
615         */
616        @Override       // TableWriter
617        public void setRefFilename( final String filename ) {
618                final String errMsg = "refFilename は、EXCEL専用機能なので使用できません。[" + filename + "]";
619                System.err.println( errMsg );
620        }
621
622        /**
623         * 雛形のシート名を、そのまま使用する(true)か、新規、または、外部指定のシート名を使用する(false)を指定します。(初期値:false[外部指定のシート名を使用])。
624         *
625         * ※ Ver5では、追記モード時に、指定シートが存在した場合は上書きします(初期値:false[上書きしない])。5.9.12.1 (2016/09/09)
626         *    Ver6では、追記モード時に、雛形を指定できないため、雛形のシート名を、そのまま使用する(true)か、
627         *    新規、または、外部指定のシート名を使用する(false)を指定する属性になります。
628         *
629         * @og.rev 6.5.0.0 (2016/09/30) sheetOverwrite で、雛形シートの使用時に、元のシート名を使用します。
630         *
631         * @param   flag 元のシート名を使用するかどうか[true:使用する/false:新規、または、外部指定のシート名を使用]
632         */
633        @Override       // TableWriter
634        public void setSheetOverwrite( final boolean flag ) {
635                final String errMsg = "sheetOverwrite は、このメソッドは、EXCEL追加機能ですので、使用できません。";
636                System.err.println( errMsg );
637        }
638
639        /**
640         * EXCELで、出力処理の最後にセルの計算式の再計算をさせるシート名をCSV形式で指定します。
641         *
642         * @og.rev 6.5.0.0 (2016/09/30) recalcSheetName で、セル内の計算式を再計算させるシート名を指定。5.9.12.1 (2016/09/09)
643         *
644         * @param  sheet 対象シート名をCSV形式で指定
645         */
646        @Override       // TableWriter
647        public void setRecalcSheetName( final String sheet ){
648                final String errMsg = "recalcSheetName は、メソッドは、EXCEL追加機能ですので、使用できません。";
649                System.err.println( errMsg );
650        }
651
652        /**
653         * EXCEL出力時のデフォルトフォント名を設定します。
654         * これは、EXCEL追加機能として実装されています。
655         *
656         * EXCELファイルを書き出す時に、デフォルトフォント名を指定します。
657         * フォント名は、EXCELのフォント名をそのまま使用してください。
658         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String )
659         * に設定されます。
660         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_NAME です。
661         *
662         * ※ このクラスでは実装されていません。
663         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
664         *
665         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
666         * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。
667         *
668         * @param   fontName フォント名
669         */
670        @Override       // TableWriter
671        public void setFontName( final String fontName ) {
672                final String errMsg = "fontName は、EXCEL専用機能なので使用できません。[" + fontName + "]";
673                System.err.println( errMsg );
674        }
675
676        /**
677         * EXCEL出力時のデフォルトフォントポイント数を設定します。
678         * これは、EXCEL追加機能として実装されています。
679         *
680         * EXCELファイルを書き出す時に、デフォルトポイント数を指定します。
681         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short )
682         * に設定されます。
683         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_POINTS です。
684         *
685         * ※ このクラスでは実装されていません。
686         * このメソッドでは、必ず、UnsupportedOperationException が、throw されます。
687         *
688         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
689         * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。
690         *
691         * @param       point   フォントポイント数
692         */
693        @Override       // TableWriter
694        public void setFontPoint( final short point ) {
695                final String errMsg = "fontPoint は、EXCEL専用機能なので使用できません。[" + point + "]";
696                System.err.println( errMsg );
697        }
698
699        /**
700         * 読み取り元ファイルのエンコード文字列を指定します。
701         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
702         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
703         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト)
704         *
705         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
706         *
707         * @param   enc ファイルのエンコード文字列
708         */
709        @Override       // TableWriter
710        public void setEncode( final String enc ) {
711                encode = enc;
712        }
713
714        /**
715         * 読み取り元ファイルのエンコード文字列を取得します。
716         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
717         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
718         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト)
719         *
720         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
721         *
722         * @return      ファイルのエンコード文字列
723         */
724        protected String getEncode() {
725                return encode;
726        }
727
728        /**
729         * 行番号情報を、出力する(true)/しない(false)を指定します。
730         *
731         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
732         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
733         * (#NAME 属性は、読み取り時には、必須です。)
734         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、
735         * このシステムでは、#NAME 属性が出力されないため、読み込みできません。)
736         * この行番号を出力しないようにできます。
737         * 初期値は、true(出力する) です。
738         *
739         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
740         *
741         * @param   useNumber 行番号情報を [true:出力する/false:しない]
742         */
743        @Override       // TableWriter
744        public void setUseNumber( final boolean useNumber ) {
745                this.useNumber = useNumber;
746        }
747
748        /**
749         * 行番号情報を、出力する(true)/しない(false)を返します。
750         *
751         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
752         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
753         * (#NAME 属性は、読み取り時には、必須です。)
754         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、
755         * このシステムでは、#NAME 属性が出力されないため、読み込みできません。)
756         * この行番号を出力しないようにできます。
757         * 初期値は、true(出力する) です。
758         *
759         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
760         *
761         * @return   行番号情報を、出力する(true)/しない(false)
762         */
763        protected boolean isUseNumber() {
764                return useNumber;
765        }
766
767        /**
768         * パラメーターリストをセットします。
769         * 内部は、HybsEntry クラスを持っています。
770         * 引数が、null の場合は、何もしません。
771         * ※ このクラスでは実装されていません。
772         *
773         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
774         *
775         * @param   listParam   パラメーターリスト
776         */
777        @Override       // TableWriter
778        public void setParam( final List<HybsEntry> listParam ) {
779                final String errMsg = "param は、XML追加機能ですので、使用できません。";
780                throw new UnsupportedOperationException( errMsg );
781        }
782
783        /**
784         * 出力先ファイルのカラム列を、外部(タグ)よりCSV形式の文字列で指定します。
785         * ただし、指定のカラム名は、DBTableModel上に存在している必要があります。
786         *
787         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
788         *
789         * @param   clms 出力先ファイルのカラム列(CSV形式)
790         */
791        @Override       // TableWriter
792        public void setColumns( final String clms ) {
793                columns = clms ;
794        }
795
796        /**
797         * 書き込み対象外のカラム列を、外部(タグ)よりCSV形式で指定します。
798         *
799         * 指定するカラム名に対して、書き込み処理を行いません。
800         * ここで指定するカラム名は、検索したDBTableModel上に含まれる必要はありません。
801         * その場合は、ここでの指定は無視されます。
802         *
803         * @og.rev 6.1.0.0 (2014/12/26) omitNames 属性を追加
804         *
805         * @param   clms 書き込み対象外のカラム列(CSV形式)
806         */
807        @Override       // TableWriter
808        public void setOmitNames( final String clms ) {
809                omitNames = clms;
810        }
811
812        /**
813         * データの書き込み開始行番号を設定します(初期値:0)。
814         *
815         * TAB区切りテキストやEXCEL等のデータの書き込みの開始行番号を指定します。
816         * 属性名は、行を飛ばす処理ということで、readTable タグと同じ名称です。
817         * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす
818         * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。)
819         * 行の読み飛ばしと、カラムの読み飛ばし(columns)、refFileURL、refFilename、
820         * refSheetName とともに使用すれば、ある程度のレイアウト設定が可能です。
821         * なお、この機能は、TableWriter_Excel のみに実装します。
822         *
823         * @og.rev 5.7.9.0 (2014/08/08) 新規作成
824         * @og.rev 6.0.2.0 (2014/09/19) isExcel() で判定しているので、Exception は投げない。
825         *
826         * @param       skipRowCount 書き込み開始行番号
827         */
828        @Override       // TableWriter
829        public void setSkipRowCount( final int skipRowCount ) {
830                if( skipRowCount != 0 ) {
831                        final String errMsg = "skipRowCount は、EXCEL専用機能なので使用できません。[" + skipRowCount + "]";
832                        System.err.println( errMsg );
833                }
834        }
835
836        /**
837         * EXCEL出力時に、データを書き込んだ範囲に罫線を入れるかどうかを指定します。
838         *
839         * データを書き込んでEXCELを作成しても、ノーマルのセルに値がセットされている
840         * だけなので、ある程度加工が必要です。
841         * そこで、データのセットされたセルに罫線を入れることで、それなりのデータが
842         * 出力された感じになります。
843         * この設定と、useAutoCellSize="true" で、セルの幅を自動調整すれば、見栄えが良くなります。
844         * なお、この機能は、TableWriter_Excel のみに実装します。
845         *
846         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
847         *
848         * @param       useCellStyle 罫線を入れるかどうか(true:入れる/false:入れない)
849         * @see         #setUseAutoCellSize( boolean )
850         */
851        @Override       // TableWriter
852        public void setUseCellStyle( final boolean useCellStyle ) {
853                final String errMsg = "useCellStyle は、EXCEL専用機能なので使用できません。[" + useCellStyle + "]";
854                System.err.println( errMsg );
855        }
856
857        /**
858         * EXCEL出力時に、セルの幅をデータの幅に自動的に合わせるかどうかを指定します。
859         *
860         * データを書き込んでEXCELを作成しても、ノーマルのセルに値がセットされている
861         * だけなので、ある程度加工が必要です。
862         * そこで、データのセットされたセルの幅を自動調整することで、それなりのデータが
863         * 出力された感じになります。
864         * この設定と、useCellStyle="true" で、セルの罫線を自動設定すれば、見栄えが良くなります。
865         * なお、この機能は、TableWriter_Excel のみに実装します。
866         *
867         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
868         *
869         * @param       useAutoCellSize データの幅に自動的に合わせるかどうか(true:自動調整/false:何もしない)
870         * @see         #setUseCellStyle( boolean )
871         */
872        @Override       // TableWriter
873        public void setUseAutoCellSize( final boolean useAutoCellSize ) {
874                final String errMsg = "useAutoCellSize は、EXCEL専用機能なので使用できません。[" + useAutoCellSize + "]";
875                System.err.println( errMsg );
876        }
877
878        /**
879         * EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します。
880         *
881         * セルの有効範囲というのは、EXCELでの 空行、空列の存在しない範囲を指します。
882         * 通常、空行でも、データとして残っている場合は、EXCELのセルオブジェクトは存在します。
883         * ここで、useActiveWorkbook="true" とすると、空行、空列を削除します。
884         *
885         * 雛形を使用した場合は、データより多めに設定した計算などは、この処理で
886         * 削除されますので、データサイズにフィットさせることができます。
887         * なお、この機能は、TableWriter_Excel のみに実装します。
888         *
889         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
890         *
891         * @param       useActiveWorkbook セルの有効範囲を設定するかどうか(true:設定する/false:そのまま)
892         */
893        @Override       // TableWriter
894        public void setUseActiveWorkbook( final boolean useActiveWorkbook ) {
895                final String errMsg = "useActiveWorkbook は、EXCEL専用機能なので使用できません。[" + useActiveWorkbook + "]";
896                System.err.println( errMsg );
897        }
898
899        /**
900         * EXCEL出力時に、シート変更するキーとなるカラム名を指定します(このカラムの値がシート名になります)。
901         *
902         * EXCEL帳票では、帳票雛形に、PAGE_BRAKE キーを設定しましたが、TableWriterでは、
903         * メモリ上のカラムの値が変更したときに、シート変更させることができます。
904         * このカラムの値がキーブレイクすると、新しいシートに書き出し始めます。
905         * シート名は、このカラムの値(キーブレイクする値)です。
906         *
907         * 雛形ファイルを使用する場合、雛形シートもキーブレイクに伴って、+1されます。
908         * つまり、雛形シートとデータシートは同時に変更されます。
909         * ただし、雛形シートは、最後の雛形シートで止まります。
910         * これは、雛形シートにヘッダー雛形とボディ雛形を用意しておき、最初のキーブレイクで
911         * ヘッダーからボディの書き込みにチェンジするイメージで使用できます。
912         * なお、この機能は、TableWriter_Excel のみに実装します。
913         *
914         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
915         *
916         * @param       pageBreakColumn シート変更するキーとなるカラム名を指定
917         * @see         #setFileBreakColumn( String )
918         */
919        @Override       // TableWriter
920        public void setPageBreakColumn( final String pageBreakColumn ) {
921                final String errMsg = "pageBreakColumn は、EXCEL専用機能なので使用できません。[" + pageBreakColumn + "]";
922                System.err.println( errMsg );
923        }
924
925        /**
926         * EXCEL出力時に、ファイル名を変更するキーとなるカラム名を指定します(このカラムの値がファイル名になります)。
927         *
928         * EXCEL帳票では、メモリ上のカラムの値が変更したときに、ファイル名を変更することができます。
929         * このカラムの値がキーブレイクすると、新しいファイルに書き出し始めます。
930         * ファイル名は、このカラムの値(キーブレイクする値)+ 元の出力ファイル名の拡張子(.xlsなど)です。
931         * この設定を使用する場合は、出力ファイル名は無視されますが、拡張子だけは使用されます。
932         *
933         * 雛形ファイルを使用する場合、雛形ファイルもキーブレイクに伴って、再利用されます。
934         * 例えば、pageBreakColumn と併用する場合、キーブレイクで雛形シートも最初から適用になります。
935         * なお、この機能は、TableWriter_Excel のみに実装します。
936         *
937         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
938         *
939         * @param       fileBreakColumn ファイル名を変更するキーとなるカラム名を指定
940         * @see         #setPageBreakColumn( String )
941         */
942        @Override       // TableWriter
943        public void setFileBreakColumn( final String fileBreakColumn ) {
944                final String errMsg = "fileBreakColumn は、EXCEL専用機能なので使用できません。[" + fileBreakColumn + "]";
945                System.err.println( errMsg );
946        }
947
948        /**
949         * EXCEL出力時に、Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定します。
950         *
951         * ここで、作成するハイパーリンクは、EXCELのシートに対するハイパーリンクです。
952         * それ以外のリンク(本当のURLやファイル等)のリンクは(今は)作成できません。
953         * ハイパーリンクを作成するには、①作成するカラム と ②作成する値 が必要です。
954         * このメソッドで設定するのは、「①:②」という形式でカラム名を指定します。
955         * ②がなければ、①と同じとします。
956         * ②の値のシートの存在有無は、無視します。ハイパーリンクを作成するシートを作成する前に
957         * ハイパーリンクを作成するケースが存在します。
958         * (例えば、各シートへのリンクを持った一覧を作成してから、明細の各シートを作成する様なケース)
959         * なお、この機能は、TableWriter_Excel のみに実装します。
960         *
961         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
962         *
963         * @param       hyperLinkColumn Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定
964         */
965        @Override       // TableWriter
966        public void setHyperLinkColumn( final String hyperLinkColumn ) {
967                final String errMsg = "hyperLinkColumn は、EXCEL専用機能なので使用できません。[" + hyperLinkColumn + "]";
968                System.err.println( errMsg );
969        }
970
971        /**
972         * EXCEL出力時に、Sheet一覧を先頭Sheetに作成する場合のSheet名を指定します。
973         *
974         * これは、Workbook に含まれる Sheet 一覧を作成する場合に、利用可能です。
975         * なお、この機能は、TableWriter_Excel のみに実装します。
976         *
977         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
978         *
979         * @param       sheetName EXCELファイルのシート名
980         */
981        @Override       // TableWriter
982        public void setAddTitleSheet( final String sheetName ) {
983                final String errMsg = "addTitleSheet は、EXCEL専用機能なので使用できません。[" + sheetName + "]";
984                System.err.println( errMsg );
985        }
986
987        /**
988         * 書込処理でコードリソースのラベル変換を行うかどうか[true/false]を指定します。
989         *
990         * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれているのか
991         * 不明になります。
992         * これは、コードリソースをラベルに変換して出力するかどうかを指定します。
993         * 当然、コードはユニークですが、ラベルはユニークになるかどうか保障はされていませんので
994         * TableReader 系で読み込む場合には、リスクが発生します。
995         * また、TableReader 系で読み込む場合にも、ラベルからコードを求める逆変換を行うように、
996         * setUseRenderer メソッドで指定する必要があります。
997         *
998         * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応していましたが、
999         * このメソッドの属性値のフラグで、制御します。
1000         *
1001         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
1002         *
1003         * @param       useRenderer     コードリソースのラベル変換を行うかどうか [true:行う/false:行わない]
1004         */
1005        @Override       // TableWriter
1006        public void setUseRenderer( final boolean useRenderer ) {
1007                this.useRenderer = useRenderer;
1008        }
1009
1010        /**
1011         * 書き出し処理でコードリソースのラベル変換を行うかどうかを返します。
1012         * 初期値は、false(行わない) です。
1013         *
1014         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
1015         *
1016         * @return      ラベル変換を行うかどうか(true:行う/false:行わない)
1017         */
1018        protected boolean isUseRenderer() {
1019                return useRenderer ;
1020        }
1021
1022        /**
1023         * データを ダブルコーテーション(")で囲みます。
1024         *
1025         * この処理では、前後をダブルクオートで囲うため、改行の有無は判定する
1026         * 必要はありません。
1027         * ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加します。
1028         *
1029         * @param        data 元のString文字列
1030         *
1031         * @return       ダブルコーテーションで囲まれた文字列
1032         * @og.rtnNotNull
1033         */
1034        protected String quotation( final String data ) {
1035                return "\"" + StringUtil.replace( data,"\"","\"\"" ) + "\"" ;
1036        }
1037
1038        /**
1039         * データに対して 改行、ダブルクオート等の処理を行います。
1040         *
1041         * これは、データの前後をダブルクオートで括る quotation(String)と異なり
1042         * 前後には、ダブルクオート を追加しません。
1043         * ただし、以下の2つの条件で処理を行います。
1044         * 1.改行を含む場合は、ダブルクオートを強制的に前後に追加する。
1045         * 2.ダブルクオートを含む場合は、その直前にダブルクオートを強制的に追加する。
1046         *
1047         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
1048         *
1049         * @param        data 元のString文字列
1050         *
1051         * @return       改行、ダブルクオート等の処理
1052         */
1053        protected String quotation2( final String data ) {
1054                String rtn = StringUtil.replace( data,"\"","\"\"" );
1055                if( rtn != null && rtn.indexOf( CR ) >= 0 ) {
1056                        rtn = "\"" + rtn + "\"" ;
1057                }
1058
1059                return rtn ;
1060        }
1061
1062        /**
1063         * keys の整合性チェックを行います。
1064         *
1065         * キーかkeysMapのどちらかが null の場合は、何もしません。
1066         * チェックするキーは、内部で大文字に変換しておきます。
1067         * keysMap に登録するキーは、大文字で登録しておいてください。
1068         * ここのチェックでは、キーマップに存在しなければ、エラーになります。
1069         *
1070         * @og.rev 5.6.6.1 (2013/07/12) keys の整合性チェックを行います。
1071         * @og.rev 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。
1072         * @og.rev 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。
1073         *
1074         * @param   key チェックするキー文字列(null の場合は、処理しない)
1075         * @param   keysMap 利用可能なキーのマップ(大文字に統一)
1076         */
1077        protected void checkParam( final String key,final Map<String,String> keysMap ) {
1078                // key か keysMap かどちらかが null の場合は、処理を行わない。
1079                if( key == null || keysMap == null ) { return; }
1080
1081                final String upKey = key.toUpperCase(Locale.JAPAN);
1082
1083                if( ! keysMap.containsKey( upKey ) ) {
1084//                      final String BR = "<br />" + CR ;
1085                        final String BR = "<br>" + CR ;                         // 7.0.1.0 (2018/10/15)
1086                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
1087                        // 6.0.2.5 (2014/10/31) char を append する。
1088                                .append( BR )
1089                                .append( "指定のキーは、この tableWriter では、使用できません。"  ).append( BR )
1090                                .append( "  class=[" ).append( getClass().getName() ).append( ']' ).append( BR )
1091                                .append( "  key  =[" ).append( key                                  ).append( ']' ).append( BR )
1092                                .append( "  ======== usage keys ======== "                                                ).append( BR ) ;
1093
1094                        // 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。
1095                        keysMap.forEach( (k,v) -> errMsg.append( ' ' ).append( k ).append( ':' ).append( v ).append( BR ) );
1096                        errMsg.append( "  ============================ " ).append( BR );
1097
1098                        throw new HybsSystemException( errMsg.toString() );
1099                }
1100        }
1101
1102        /**
1103         * デバッグ情報を出力するかどうか[true:する/false:しない]を指定します。
1104         *
1105         * EXCELなどを書き出す場合、シートブレイクやファイルブレイク時の行番号が、検索時の行番号と
1106         * 異なる為、エラー時の判定が難しくなります。
1107         * そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。
1108         * 通常は使用しませんので、設定を無視します。
1109         * 初期値は、false:デバッグ情報を出力しない です。
1110         *
1111         * @og.rev 6.1.0.0 (2014/12/26) デバッグ情報を出力するかどうかを指定
1112         *
1113         * @param       useDebug        デバッグ出力するか [true:する/false:しない]
1114         */
1115        @Override       // TableWriter
1116        public void setDebug( final boolean useDebug ) {
1117                this.useDebug = useDebug;
1118        }
1119
1120        /**
1121         * デバッグ情報を出力するかどうか[true:する/false:しない]を取得します。
1122         *
1123         * EXCELなどを書き出す場合、シートブレイクやファイルブレイク時の行番号が、検索時の行番号と
1124         * 異なる為、エラー時の判定が難しくなります。
1125         * そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。
1126         *
1127         * @og.rev 6.1.0.0 (2014/12/26) デバッグ情報を出力するかどうかを指定
1128         *
1129         * @return      デバッグ出力 [true:する/false:しない]
1130         */
1131        protected boolean isDebug() {
1132                return useDebug ;
1133        }
1134}