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.BufferedReader;
019import java.util.Map;
020
021import org.opengion.fukurou.util.CSVTokenizer;
022import org.opengion.fukurou.util.ErrorMessage;
023import org.opengion.fukurou.util.StringUtil;
024import org.opengion.hayabusa.common.HybsSystem;
025import org.opengion.hayabusa.db.DBColumn;
026import org.opengion.hayabusa.db.DBTableModel;
027import org.opengion.hayabusa.resource.ResourceManager;
028import org.opengion.hayabusa.resource.CodeData;
029
030/**
031 * 指定の区切り記号(初期値:タブ区切り)ファイルの読み取りクラスです。
032 *
033 * 名前,データの入力部のみオーバーライドすれば,各種入力フォーマットに合わせた
034 * サブクラスを実現する事が可能です。
035 *
036 * @og.group ファイル入力
037 *
038 * @version  4.0
039 * @author   Kazuhiko Hasegawa
040 * @since    JDK5.0,
041 */
042public abstract class AbstractTableReader implements TableReader {
043        //* このプログラムのVERSION文字列を設定します。   {@value} */
044        private static final String VERSION = "5.5.8.5 (2012/11/27)" ;
045
046        private String  separator       = TAB_SEPARATOR;                // 項目区切り文字
047        private ResourceManager resource = null;                        // 4.0.0 (2005/01/31)
048        private int             maxRowCount     = HybsSystem.sysInt( "DB_MAX_ROW_COUNT" ) ;
049
050        protected DBTableModel  table           = null;
051        protected DBColumn[]    dbColumn        = null;
052
053        // 3.5.4.5 (2004/01/23) カラム名の外部指定を出来る様にする。
054//      private String    columns       = null;  // 外部指定のカラム名
055        protected String  columns       = null;  // 外部指定のカラム名 ( 4.3.4.7 (2009/01/22) protectedに変更 )
056        private String    encode        = null;
057        private boolean   useNumber     = true;                 // 3.7.0.5 (2005/04/11)
058
059        private int               skipRowCount  = 0;            // 5.1.6.0 (2010/05/01) データの読み飛ばし設定
060        private boolean   useRenderer   = false;        // 5.2.1.0 (2010/10/01)
061
062        // 5.2.1.0 (2010/10/01) コードリソース毎のラベル逆引きマップ
063        private Map<?,?>[] maps = null;                           // 5.5.1.7 (2012/04/16) ワイルドカードを指定
064
065        private boolean   useDebug      = false;                // 5.5.7.2 (2012/10/09) デバッグ情報の出力するかどうか
066        
067        // 5.9.8.1 (2016/05/13) match処理追加
068        private String[] matchKeys = null;
069        private String[] matchVals = null;
070        private int[] matchKeysIndex = null;
071
072        /**
073         * DBTableModel から 各形式のデータを作成して,BufferedReader より読み取ります。
074         * コメント/空行を除き、最初の行は、必ず項目名が必要です。
075         * それ以降は、コメント/空行を除き、データとして読み込んでいきます。
076         * このメソッドは、EXCEL 読み込み時に使用します。
077         *
078         * @see #isExcel()
079         */
080        abstract public void readDBTable();
081
082        /**
083         * DBTableModel から 各形式のデータを作成して,BufferedReader より読み取ります。
084         * コメント/空行を除き、最初の行は、必ず項目名が必要です。
085         * それ以降は、コメント/空行を除き、データとして読み込んでいきます。
086         *
087         * @param   reader BufferedReaderオブジェクト
088         */
089        abstract public void readDBTable( final BufferedReader reader );
090
091        /**
092         * リソースマネージャーをセットします。
093         * これは、言語(ロケール)に応じた DBColumn をあらかじめ設定しておく為に
094         * 必要です。
095         * リソースマネージャーが設定されていない、または、所定のキーの DBColumn が
096         * リソースに存在しない場合は、内部で DBColumn オブジェクトを作成します。
097         *
098         * @og.rev 4.0.0.0 (2005/01/31) lang ⇒ ResourceManager へ変更
099         *
100         * @param  resource リソースマネージャー
101         */
102        public void setResourceManager( final ResourceManager resource ) {
103                this.resource = resource;
104        }
105
106        /**
107         * DBColumn オブジェクトをDBTable に設定します。
108         *
109         * @og.rev 3.5.4.2 (2003/12/15) private を protected に変更。
110         * @og.rev 3.5.4.5 (2004/01/23) DBColumn 配列に値をセットします。
111         * @og.rev 5.2.1.0 (2010/10/01) useRenderer対応(コードリソース毎のラベル逆引き)
112         * @og.rev 5.9.0.0 (2015/09/04) XLSX対応でinitをここで行えるようにする。
113         *
114         * @param names カラム名配列
115         */
116        protected void setTableDBColumn( final String[] names ) {
117                dbColumn = new DBColumn[names.length] ;  // 3.5.4.5 追加
118                
119                // 5.9.0.0 (2015/09/04) サイズ0の場合はinitする
120                if( table.getColumnCount() == 0){
121                        table.init( names.length );
122                }
123                
124                for( int i=0; i<names.length; i++ ) {
125                        DBColumn clm = resource.makeDBColumn( names[i] );
126                        table.setDBColumn( i,clm );
127                        dbColumn[i] = clm;                // 3.5.4.5 追加
128                }
129                
130                if( useRenderer ) {
131                        maps = new Map<?,?>[names.length];                // 5.5.1.7 (2012/04/16) ワイルドカードを指定
132                        for( int i=0; i<names.length; i++ ) {
133                                CodeData cd = dbColumn[i].getCodeData();
134                                if( cd != null ) { maps[i] = cd.makeLabelMap(); }
135                                else             { maps[i] = null; }
136                        }
137                }
138        }
139
140        /**
141         * DBTableModelオブジェクトに、1行分のデータを追加します。
142         * これ自体は、メソッドの共通化による 拡張をしやすくするために用意しました。
143         *
144         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
145         *
146         * @param values 1行分のデータ配列
147         */
148        protected void setTableColumnValues( final String[] values ) {
149                if( useRenderer ) {
150                        int clmSize = values.length;
151                        for( int clmNo=0; clmNo<clmSize; clmNo++ ) {
152                                if( maps[clmNo] != null ) {
153                                        String val = values[clmNo];
154                                        if( val == null ) { val = ""; }
155                                        else {
156                                                String tmp = (String)maps[clmNo].get( val );
157                                                if( tmp != null ) { values[clmNo] = tmp; }
158                                                else {
159                                                        int sp = val.indexOf( ':' );
160                                                        if( sp >= 0 ) {
161                                                                values[clmNo] = val.substring( 0,sp );
162                                                        }
163                                                }
164                                        }
165                                }
166                        }
167                }
168
169                table.addColumnValues( values );
170        }
171
172        /**
173         * 1行のデータを テーブルモデルにセットするように分割します。
174         *
175         * なお、読込みは,NAME項目分を読み込みます。データ件数が少ない場合は、
176         * "" をセットしておきます。
177         * データの分割は、separator文字を使用します。
178         *
179         * @og.rev 3.3.3.1 (2003/07/18) ファイルリード/ライト時に後ろスペースの除去を行います。
180         * @og.rev 3.7.0.5 (2005/04/11) useNumber 属性を考慮します。
181         *
182         * @param       data    1行のデータ
183         * @param       clmSize カラム数
184         *
185         * @return      分割された文字列配列
186         */
187        protected String[] readData( final String data,final int clmSize ) {
188                String[] rtnData = new String[ clmSize ];
189                CSVTokenizer token = new CSVTokenizer( data,separator.charAt(0) );
190                // 超イレギュラー処理 最初の separator 以前の文字は無視する。
191                // 3.7.0.5 (2005/04/11)
192                if( useNumber ) { token.nextToken(); }    // 先頭は行番号のため無視する。
193
194                int clmNo = 0;
195                while( token.hasMoreTokens() ) {
196                        String val = StringUtil.csvOutQuote( token.nextToken() );
197                        if( val != null && val.startsWith( "'0" ) ) {
198                                rtnData[clmNo++] = StringUtil.rTrim( val.substring( 1 ) );
199                        }
200                        else {
201                                rtnData[clmNo++] = StringUtil.rTrim( val );
202                        }
203                        if( clmNo >= clmSize ) { break; }    // 3.7.0.5 (2005/04/11) 多い場合は、以降を無視する。
204                }
205                // EXCEL が、終端TABを削除してしまうため、少ない場合は埋める。
206                for( int i=clmNo; i<clmSize; i++ ) {
207                        rtnData[i] = "";
208                }
209
210                return rtnData;
211        }
212        
213        /**
214         * 正規表現チェックでの処理対象行判断
215         *
216         * ファイルから特定の行のみ取り込みたい場合に利用します。
217         * matchKey(カラム名)とmatchVals(正規表現)を利用して処理判定を行います
218         * なお、EXCEL 入力には、この設定は適用されません。
219         * 何も設定しない場合は全行取込みとなります。
220         *
221         * @og.rev 5.9.8.1 (2016/05/13) 新規追加
222         *
223         * @return      処理対象行かどうか(true:処理対象)
224         */
225        protected boolean matchCheck(final String[] data, final String[] names) {
226                boolean rtn = true;
227                
228                if( matchKeys == null || matchKeys.length == 0 ) { return true; }
229                else if( matchKeysIndex == null || matchKeysIndex.length == 0 ){
230                        //matchKeyのindexを初回呼び出し時に保持しておく
231                        matchKeysIndex = new int[matchKeys.length];
232                        for( int i=0; i<matchKeys.length; i++){
233                                matchKeysIndex[i] = -1;
234                                for( int j=0; j<names.length; j++){
235                                        if( matchKeys[i].equals( names[j] ) ){
236                                                matchKeysIndex[i] = j;
237                                        }
238                                }
239                        }
240                }
241                
242                // 全てマッチした場合のみtrue
243                if( matchKeysIndex != null && matchKeysIndex.length != 0 ) {
244                        for( int i=0; i<matchKeysIndex.length; i++ ) {
245                                if( matchKeysIndex[i] < 0 ){ continue; }
246                                
247                                String val  = data[ matchKeysIndex[i] ];
248                                if( val != null && val.matches( matchVals[i] ) ) {
249                                        rtn &= true; // 乗算
250                                }
251                                else if( val != null ){
252                                        rtn = false;
253                                }
254                        }
255                }
256                return rtn;
257        }
258
259        /**
260         * 内部の DBTableModel を返します。
261         *
262         * @return      テーブルモデル
263         */
264        public DBTableModel getDBTableModel() {
265                return table;
266        }
267
268        /**
269         * データを読み込む場合の,区切り文字をセットします。
270         *
271         * なお,このメソッドは,サブクラスによっては,使用しない場合があります。
272         * もし,使用しないサブクラスを作成する場合は, UnsupportedOperationException
273         * を throw するように,サブクラスで実装して下さい。
274         *
275         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
276         *
277         * @param   sep 区切り文字
278         */
279        public void setSeparator( final String sep ) {
280                if( sep != null ) { this.separator = sep; }
281        }
282
283        /**
284         * データを書き込む場合の,区切り文字を返します。
285         *
286         * @return      区切り文字
287         */
288        public String getSeparator() {
289                return separator;
290        }
291
292        /**
293         * DBTableModelのデータとして登録する最大件数をこの値に設定します
294         *              (初期値:DB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。
295         * サーバーのメモリ資源と応答時間の確保の為です。
296         *
297         * @return  最大検索件数
298         */
299        public int getMaxRowCount() {
300                return maxRowCount;
301        }
302
303        /**
304         * DBTableModelのデータとして登録する最大件数をこの値に設定します
305         *              (初期値:DB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。
306         * サーバーのメモリ資源と応答時間の確保の為です。
307         *
308         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
309         * @og.rev 5.5.8.5 (2012/11/27) 0を無制限として処理します。
310         *
311         * @param   maxRowCount 最大検索件数
312         */
313        public void setMaxRowCount( final int maxRowCount ) {
314//              this.maxRowCount = maxRowCount;
315                this.maxRowCount = ( maxRowCount > 0 ) ? maxRowCount : Integer.MAX_VALUE ;
316        }
317
318        /**
319         * DBTableModelのデータとしてEXCELファイルを読み込むときのシート名を設定します。
320         * これにより、複数の形式の異なるデータを順次読み込むことや、シートを指定して
321         * 読み取ることが可能になります。
322         * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。エラーにはならないのでご注意ください。
323         * のでご注意ください。
324         * このメソッドは、isExcel() == true の場合のみ利用されます。
325         *
326         * ※ このクラスでは実装されていません。
327         *
328         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
329         *
330         * @param   sheetName シート名
331         */
332        public void setSheetName( final String sheetName ) {
333                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
334                throw new UnsupportedOperationException( errMsg );
335        }
336
337        /**
338         * EXCELファイルを読み込むときのシート番号を指定します(初期値:0)。
339         *
340         * EXCEL読み込み時に複数シートをマージして取り込みます。
341         * シート番号は、0 から始まる数字で表します。
342         * ヘッダーは、最初のシートのカラム位置に合わせます。(ヘッダータイトルの自動認識はありません。)
343         * よって、指定するシートは、すべて同一レイアウトでないと取り込み時にカラムのずれが発生します。
344         * 
345         * シート番号の指定は、カンマ区切りで、複数指定できます。また、N-M の様にハイフンで繋げることで、
346         * N 番から、M 番のシート範囲を一括指定可能です。また、"*" による、全シート指定が可能です。
347         * これらの組み合わせも可能です。( 0,1,3,5-8,10-* )
348         * ただし、"*" に関しては例外的に、一文字だけで、すべてのシートを表すか、N-* を最後に指定するかの
349         * どちらかです。途中には、"*" は、現れません。
350         * シート番号は、重複(1,1,2,2)、逆転(3,2,1) での指定が可能です。これは、その指定順で、読み込まれます。
351         * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。エラーにはならないのでご注意ください。
352         * このメソッドは、isExcel() == true の場合のみ利用されます。
353         * 
354         * 初期値は、0(第一シート) です。
355         *
356         * ※ このクラスでは実装されていません。
357         *
358         * @og.rev 5.5.7.2 (2012/10/09) 新規追加
359         *
360         * @param   sheetNos EXCELファイルのシート番号(0から始まる)
361         * @see         #setSheetName( String ) 
362         */
363        public void setSheetNos( final String sheetNos ) {
364                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
365                throw new UnsupportedOperationException( errMsg );
366        }
367
368        /**
369         * EXCELファイルを読み込むときのシート単位の固定値を設定するためのカラム名とアドレスを指定します。
370         * カラム名は、カンマ区切りで指定します。
371         * 対応するアドレスを、EXCEL上の行-列を0から始まる整数でカンマ区切りで指定します。
372         * これにより、シートの一か所に書かれている情報を、DBTableModel のカラムに固定値として
373         * 設定することができます。
374         * 例として、DB定義書で、テーブル名をシートの全レコードに設定したい場合などに使います。
375         * このメソッドは、isExcel() == true の場合のみ利用されます。
376         *
377         * @og.rev 5.5.8.2 (2012/11/09) 新規追加
378         *
379         * @param   constKeys 固定値となるカラム名(CSV形式)
380         * @param   constAdrs 固定値となるアドレス(行-列,行-列,・・・)
381         */
382        public void setSheetConstData( final String constKeys,final String constAdrs ) {
383                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
384                throw new UnsupportedOperationException( errMsg );
385        }
386
387        /**
388         * ここに指定されたカラム列に NULL が現れた時点で読み取りを中止します。
389         *
390         * これは、指定のカラムは必須という事を条件に、そのレコードだけを読み取る処理を行います。
391         * 複数Sheetの場合は、次のSheetを読みます。
392         * 現時点では、Excel の場合のみ有効です。
393         *
394         * @og.rev 5.5.8.2 (2012/11/09) 新規追加
395         *
396         * @param   clm カラム列
397         */
398        public void setNullBreakClm( final String clm ) {
399                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
400                throw new UnsupportedOperationException( errMsg );
401        }
402
403        /**
404         * このクラスが、EXCEL対応機能を持っているかどうかを返します。
405         *
406         * EXCEL対応機能とは、シート名のセット、読み込み元ファイルの
407         * Fileオブジェクト取得などの、特殊機能です。
408         * 本来は、インターフェースを分けるべきと考えますが、taglib クラス等の
409         * 関係があり、問い合わせによる条件分岐で対応します。
410         *
411         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
412         *
413         * @return      EXCEL対応機能を持っているかどうか
414         */
415        public boolean isExcel() {
416                return false;
417        }
418
419        /**
420         * 読み取り元ファイル名をセットします。(DIR + Filename)
421         * これは、EXCEL追加機能として実装されています。
422         * ※ このクラスでは実装されていません。
423         *
424         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
425         *
426         * @param   filename 読み取り元ファイル名
427         */
428        public void setFilename( final String filename ) {
429                String errMsg = "このメソッドは、EXCEL追加機能ですので、使用できません。";
430                throw new UnsupportedOperationException( errMsg );
431        }
432
433        /**
434         * 読み取り元ファイルのカラム列を、外部(タグ)より指定します。
435         * ファイルに記述された #NAME より優先して使用されます。
436         *
437         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
438         *
439         * @param   clms 読み取り元ファイルのカラム列(カンマ区切り文字)
440         */
441        public void setColumns( final String clms ) {
442                columns = clms ;
443        }
444
445        /**
446         * 読み取り元ファイルのエンコード文字列を指定します。
447         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
448         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
449         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト)
450         *
451         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
452         *
453         * @param   enc ファイルのエンコード文字列
454         */
455        public void setEncode( final String enc ) {
456                encode = enc;
457        }
458
459        /**
460         * 読み取り元ファイルのエンコード文字列を取得します。
461         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
462         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
463         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト)
464         *
465         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
466         *
467         * @return      ファイルのエンコード文字列
468         */
469        protected String getEncode() {
470                return encode;
471        }
472
473        /**
474         * 行番号情報を指定[true:使用している/false:していない]します(初期値:true)。
475         *
476         * 通常のフォーマットでは、各行の先頭に行番号が出力されています。
477         * 読み取り時に、#NAME 属性を使用する場合は、この行番号を無視しています。
478         * #NAME 属性を使用せず、columns 属性でカラム名を指定する場合(他システムの
479         * 出力ファイルを読み取るケース等)では、行番号も存在しないケースがあり、
480         * その様な場合に、useNumber="false" を指定すれば、データの最初から読み取り始めます。
481         * この場合、出力データのカラムの並び順が変更された場合、columns 属性も
482         * 指定しなおす必要がありますので、できるだけ、#NAME 属性を使用するように
483         * してください。
484         * なお、EXCEL 入力には、この設定は適用されません。(暫定対応)
485         * 初期値は、true(使用する) です。
486         *
487         * @og.rev 3.7.0.5 (2005/04/11) 新規追加
488         *
489         * @param       useNumber       行番号情報  [true:使用する/false:使用しない]
490         */
491        public void setUseNumber( final boolean useNumber ) {
492                this.useNumber = useNumber ;
493        }
494
495        /**
496         * データの読み始めの初期値を取得します。
497         *
498         * TAB区切りテキストやEXCEL等のデータの読み始めの初期値を指定します。
499         * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす
500         * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。)
501         * 読み飛ばしは、コメント行などは、無視しますので、実際の行数分読み飛ばします。
502         * #NAME属性や、columns 属性は、有効です。
503         *
504         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
505         *
506         * @return      読み始めの初期値
507         */
508        public int getSkipRowCount() {
509                return skipRowCount ;
510        }
511
512        /**
513         * データの読み飛ばし件数を設定します。
514         *
515         * TAB区切りテキストやEXCEL等のデータの読み始めの初期値を指定します。
516         * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす
517         * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。)
518         * 読み飛ばしは、コメント行などは、無視しますので、実際の行数分読み飛ばします。
519         * #NAME属性や、columns 属性は、有効です。
520         *
521         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
522         *
523         * @param       count 読み始めの初期値
524         */
525        public void setSkipRowCount( final int count ) {
526                skipRowCount = count;
527        }
528
529        /**
530         * 読取処理でラベルをコードリソースに逆変換を行うかどうかを指定します。
531         *
532         * TableWriter_Renderer 系のクラスで出力した場合は、コードリソースがラベルで出力されます。
533         * そのファイルを読み取ると、当然、エラーになります。
534         * ここでは、コードリソースのカラムに対して、ラベルからコードを求める逆変換を行うことで、
535         * Renderer 系で出力したファイルを取り込むことができるようにします。
536         *
537         * ここでは、TableWriter 系と同様に、TableReader_Renderer 系のクラスを作るのではなく、
538         * 属性値のフラグで、制御します。
539         * 将来的には、TableWriter 系も廃止して、同様のフラグで制御するように変更する予定です。
540         *
541         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
542         *
543         * @param       useRenderer     コードリソースのラベル変換を行うかどうかを指定
544         */
545        public void setUseRenderer( final boolean useRenderer ) {
546                this.useRenderer = useRenderer;
547        }
548
549        /**
550         * 行番号情報を、使用している(true)/していない(false)を返します。
551         *
552         * 通常のフォーマットでは、各行の先頭に行番号が出力されています。
553         * 読み取り時に、#NAME 属性を使用する場合は、この行番号を無視しています。
554         * #NAME 属性を使用せず、columns 属性でカラム名を指定する場合(他システムの
555         * 出力ファイルを読み取るケース等)では、行番号も存在しないケースがあり、
556         * その様な場合に、useNumber="false" を指定すれば、データの最初から読み取り始めます。
557         * この場合、出力データのカラムの並び順が変更された場合、columns 属性も
558         * 指定しなおす必要がありますので、できるだけ、#NAME 属性を使用するように
559         * してください。
560         * なお、EXCEL 入力には、この設定は適用されません。(暫定対応)
561         * 初期値は、true(使用する) です。
562         *
563         * @og.rev 3.7.0.5 (2005/04/11) 新規追加
564         * @og.rev 4.0.0.0 (2007/07/20) メソッド名変更(getUseNumber() ⇒  isUseNumber())
565         *
566         * @return      行番号情報を、使用している(true)/していない(false)を指定
567         */
568        protected boolean isUseNumber() {
569                return useNumber ;
570        }
571        
572        /**
573         * 取込み対象判定を行うカラムを配列で指定します。
574         *
575         * @og.rev 5.9.8.1 (2016/05/13) 新規作成
576         *
577         * @param   keys 判定対象カラム名配列
578         */
579        public void setMatchKeys( final String[] keys ) {
580                matchKeys = keys;
581        }
582        
583        /**
584         * 取込み対象判定の正規表現を配列で指定します。
585         *
586         * @og.rev 5.9.8.1 (2016/05/13) 新規作成
587         *
588         * @param   vals 判定対象カラム名配列
589         */
590        public void setMatchVals( final String[] vals ) {
591                matchVals = vals;
592        }
593
594        /**
595         * デバッグ情報を出力するかどうかを指定します。
596         *
597         * EXCELなどを読み取る場合、シートマージで読み取ると、エラー時の行番号が、連番になるため、
598         * どのシートなのか、判らなくなります。
599         * そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。
600         * 通常は使用しませんので、設定を無視します。
601         * 初期値は、false:デバッグ情報を出力しない です。
602         *
603         * @og.rev 5.5.7.2 (2012/10/09) 新規作成
604         *
605         * @param       useDebug        デバッグ情報を出力するかどうかを指定
606         */
607        public void setDebug( final boolean useDebug ) {
608                this.useDebug = useDebug;
609        }
610
611        /**
612         * デバッグ情報を出力するかどうかを取得します。
613         *
614         * EXCELなどを読み取る場合、シートマージで読み取ると、エラー時の行番号が、連番になるため、
615         * どのシートなのか、判らなくなります。
616         * そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。
617         *
618         * @og.rev 5.5.7.2 (2012/10/09) 新規作成
619         *
620         * @return      デバッグ情報を出力するかどうか(true:する/false:しない)
621         */
622        protected boolean isDebug() {
623                return useDebug ;
624        }
625}