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 org.opengion.hayabusa.db.DBTableModel;
019import org.opengion.hayabusa.resource.ResourceManager;
020
021import java.io.BufferedReader;
022
023/**
024 * DBTableModel インターフェース のオブジェクトをReader を用いて入力する為の,共通インターフェースです。
025 *
026 * @og.group ファイル入力
027 *
028 * @version  4.0
029 * @author   Kazuhiko Hasegawa
030 * @since    JDK5.0,
031 */
032public interface TableReader {
033
034        /**
035         * ヘッダー情報の入力時の区切り文字
036         */
037        String TAB_SEPARATOR = "\t";            // 項目区切り文字
038
039        /**
040         * DBTableModel から 各形式のデータを作成して,Reader より読み取ります。
041         * このメソッドは、EXCEL 読み込み時に使用します。
042         *
043         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
044         *
045         * @see #isExcel()
046         */
047        void readDBTable() ;
048
049        /**
050         * DBTableModel から 各形式のデータを作成して,Reader より読み取ります。
051         *
052         * @og.rev 3.5.4.3 (2004/01/05) 引数に、BufferedReader を受け取ル要に変更します。
053         *
054         * @param   reader BufferedReaderオブジェクト
055         */
056        void readDBTable( final BufferedReader reader ) ;
057
058        /**
059         * リソースマネージャーをセットします。
060         * これは、言語(ロケール)に応じた DBColumn をあらかじめ設定しておく為に
061         * 必要です。
062         * リソースマネージャーが設定されていない、または、所定のキーの DBColumn が
063         * リソースに存在しない場合は、内部で DBColumn オブジェクトを作成します。
064         *
065         * @og.rev 4.0.0.0 (2005/01/31) lang ⇒ ResourceManager へ変更
066         *
067         * @param  resource リソースマネージャー
068         */
069        void setResourceManager( final ResourceManager resource ) ;
070
071        /**
072         * 内部の DBTableModel を返します。
073         *
074         * @return  DBTableModelオブジェクト
075         */
076        DBTableModel getDBTableModel() ;
077
078        /**
079         * データを読み込む場合の,区切り文字をセットします。
080         *
081         * なお,このメソッドは,サブクラスによっては,使用しない場合があります。
082         * もし,使用しないサブクラスを作成する場合は, UnsupportedOperationException
083         * を throw するように,サブクラスで実装して下さい。
084         *
085         * @param   separator 区切り文字
086         */
087        void setSeparator( final String separator ) ;
088
089        /**
090         * DBTableModelのデータとして登録する最大件数をこの値に設定します。
091         * サーバーのメモリ資源と応答時間の確保の為です。
092         *
093         * @return  最大検索件数
094         */
095        int getMaxRowCount() ;
096
097        /**
098         * DBTableModelのデータとして登録する最大件数をこの値に設定します。
099         * サーバーのメモリ資源と応答時間の確保の為です。
100         *
101         * @param   maxRowCount 最大検索件数
102         */
103        void setMaxRowCount( final int maxRowCount ) ;
104
105        /**
106         * DBTableModelのデータとしてEXCELファイルを読み込むときのシート名を設定します。
107         * これにより、複数の形式の異なるデータを順次読み込むことや、シートを指定して
108         * 読み取ることが可能になります。
109         * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。エラーにはならないのでご注意ください。
110         * のでご注意ください。
111         * このメソッドは、isExcel() == true の場合のみ利用されます。
112         *
113         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
114         *
115         * @param   sheetName シート名
116         * @see         #setSheetNos( String ) 
117         */
118        void setSheetName( final String sheetName ) ;
119
120        /**
121         * EXCELファイルを読み込むときのシート番号を指定します(初期値:0)。
122         *
123         * EXCEL読み込み時に複数シートをマージして取り込みます。
124         * シート番号は、0 から始まる数字で表します。
125         * ヘッダーは、最初のシートのカラム位置に合わせます。(ヘッダータイトルの自動認識はありません。)
126         * よって、指定するシートは、すべて同一レイアウトでないと取り込み時にカラムのずれが発生します。
127         * 
128         * シート番号の指定は、カンマ区切りで、複数指定できます。また、N-M の様にハイフンで繋げることで、
129         * N 番から、M 番のシート範囲を一括指定可能です。また、"*" による、全シート指定が可能です。
130         * これらの組み合わせも可能です。( 0,1,3,5-8,10-* )
131         * ただし、"*" に関しては例外的に、一文字だけで、すべてのシートを表すか、N-* を最後に指定するかの
132         * どちらかです。途中には、"*" は、現れません。
133         * シート番号は、重複(1,1,2,2)、逆転(3,2,1) での指定が可能です。これは、その指定順で、読み込まれます。
134         * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。エラーにはならないのでご注意ください。
135         * このメソッドは、isExcel() == true の場合のみ利用されます。
136         * 
137         * 初期値は、0(第一シート) です。
138         *
139         * @og.rev 5.5.7.2 (2012/10/09) 新規追加
140         *
141         * @param   sheetNos EXCELファイルのシート番号(0から始まる)
142         * @see         #setSheetName( String ) 
143         */
144        void setSheetNos( final String sheetNos ) ;
145
146        /**
147         * EXCELファイルを読み込むときのシート単位の固定値を設定するためのカラム名とアドレスを指定します。
148         * カラム名は、カンマ区切りで指定します。
149         * 対応するアドレスを、EXCEL上の行-列を0から始まる整数でカンマ区切りで指定します。
150         * これにより、シートの一か所に書かれている情報を、DBTableModel のカラムに固定値として
151         * 設定することができます。
152         * 例として、DB定義書で、テーブル名をシートの全レコードに設定したい場合などに使います。
153         * このメソッドは、isExcel() == true の場合のみ利用されます。
154         *
155         * @og.rev 5.5.8.2 (2012/11/09) 新規追加
156         *
157         * @param   constKeys 固定値となるカラム名(CSV形式)
158         * @param   constAdrs 固定値となるアドレス(行-列,行-列,・・・)
159         */
160        void setSheetConstData( final String constKeys,final String constAdrs ) ;
161
162        /**
163         * ここに指定されたカラム列に NULL が現れた時点で読み取りを中止します。
164         *
165         * これは、指定のカラムは必須という事を条件に、そのレコードだけを読み取る処理を行います。
166         * 複数Sheetの場合は、次のSheetを読みます。
167         * 現時点では、Excel の場合のみ有効です。
168         *
169         * @og.rev 5.5.8.2 (2012/11/09) 新規追加
170         *
171         * @param   clm カラム列
172         */
173        void setNullBreakClm( final String clm ) ;
174
175        /**
176         * このクラスが、EXCEL対応機能を持っているかどうかを返します。
177         *
178         * EXCEL対応機能とは、シート名のセット、読み込み元ファイルの
179         * Fileオブジェクト取得などの、特殊機能です。
180         * 本来は、インターフェースを分けるべきと考えますが、taglib クラス等の
181         * 関係があり、問い合わせによる条件分岐で対応します。
182         *
183         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
184         *
185         * @return      EXCEL対応機能を持っているかどうか
186         */
187        boolean isExcel() ;
188
189        /**
190         * 読み取り元ファイル名をセットします。(DIR + Filename)
191         * これは、EXCEL追加機能として実装されています。
192         *
193         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
194         *
195         * @param   filename 読み取り元ファイル名
196         */
197        void setFilename( final String filename ) ;
198
199        /**
200         * 読み取り元ファイルのカラム列を、外部(タグ)より指定します。
201         * ファイルに記述された #NAME より優先して使用されます。
202         *
203         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
204         *
205         * @param   clms 読み取り元ファイルのカラム列(カンマ区切り文字)
206         */
207        void setColumns( final String clms ) ;
208
209        /**
210         * 読み取り元ファイルのエンコード文字列を指定します。
211         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
212         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
213         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト)
214         *
215         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
216         *
217         * @param   enc ファイルのエンコード文字列
218         */
219        void setEncode( final String enc ) ;
220
221        /**
222         * 行番号情報を、使用している(true)/していない(false)を指定します。
223         *
224         * 通常のフォーマットでは、各行の先頭に行番号が出力されています。
225         * 読み取り時に、#NAME 属性を使用する場合は、この行番号を無視しています。
226         * #NAME 属性を使用せず、columns 属性でカラム名を指定する場合(他システムの
227         * 出力ファイルを読み取るケース等)では、行番号も存在しないケースがあり、
228         * その様な場合に、useNumber="false" を指定すれば、データの最初から読み取り始めます。
229         * この場合、出力データのカラムの並び順が変更された場合、columns 属性も
230         * 指定しなおす必要がありますので、できるだけ、#NAME 属性を使用するように
231         * してください。
232         * なお、EXCEL 入力には、この設定は適用されません。(暫定対応)
233         * 初期値は、true(使用する) です。
234         *
235         * @og.rev 3.7.0.5 (2005/04/11) 新規追加
236         *
237         * @param       useNumber       行番号情報 [true:使用している/false:していない]
238         */
239        void setUseNumber( final boolean useNumber ) ;
240
241        /**
242         * データの読み飛ばし件数を設定します。
243         *
244         * TAB区切りテキストやEXCEL等のデータの読み始めの初期値を指定します。
245         * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす
246         * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。)
247         * 読み飛ばしは、コメント行などは、無視しますので、実際の行数分読み飛ばします。
248         * #NAME属性や、columns 属性は、有効です。
249         *
250         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
251         *
252         * @param       count 読み始めの初期値
253         */
254        void setSkipRowCount( final int count ) ;
255
256        /**
257         * 読取処理でラベルをコードリソースに逆変換を行うかどうかを指定します。
258         *
259         * TableWriter_Renderer 系のクラスで出力した場合は、コードリソースがラベルで出力されます。
260         * そのファイルを読み取ると、当然、エラーになります。
261         * ここでは、コードリソースのカラムに対して、ラベルからコードを求める逆変換を行うことで、
262         * Renderer 系で出力したファイルを取り込むことができるようにします。
263         *
264         * ここでは、TableWriter 系と同様に、TableReader_Renderer 系のクラスを作るのではなく、
265         * 属性値のフラグで、制御します。
266         * 将来的には、TableWriter 系も廃止して、同様のフラグで制御するように変更する予定です。
267         *
268         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
269         *
270         * @param       useRenderer     コードリソースのラベル逆変換を行うかどうかを指定
271         */
272        void setUseRenderer( final boolean useRenderer ) ;
273
274        /**
275         * デバッグ情報を出力するかどうかを指定します。
276         *
277         * EXCELなどを読み取る場合、シートマージで読み取ると、エラー時の行番号が、連番になるため、
278         * どのシートなのか、判らなくなります。
279         * そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。
280         * 通常は使用しませんので、設定を無視します。
281         * 初期値は、false:デバッグ情報を出力しない です。
282         *
283         * @og.rev 5.5.7.2 (2012/10/09) 新規作成
284         *
285         * @param       useDebug        デバッグ情報を出力するかどうかを指定
286         */
287        void setDebug( final boolean useDebug ) ;
288}