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