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