jp.terasoluna.fw.file.dao.standard
クラス AbstractFileLineIterator<T>

java.lang.Object
  上位を拡張 jp.terasoluna.fw.file.dao.standard.AbstractFileLineIterator<T>
型パラメータ:
T - ファイル行オブジェクト。
すべての実装されたインタフェース:
java.util.Iterator, FileLineIterator<T>
直系の既知のサブクラス:
FixedFileLineIterator, PlainFileLineIterator, VariableFileLineIterator

public abstract class AbstractFileLineIterator<T>
extends java.lang.Object
implements FileLineIterator<T>

ファイルアクセス(データ取得)用の共通クラス。

ファイルアクセス(データ取得)を行う3つのクラス(CSV、固定長、可変長) に共通する処理をまとめた抽象クラス。 ファイルの種類に対応するサブクラスが処理を行う。
使用例はFileLineIteratorを参照のこと。

ファイル取得処理はデータを先頭から順番に読み込むため、下記の手順で呼び出されるように実装する必要があります。
もし、トレイラ部の取得を行うと内部で残っているデータ部を全部スキップするため、 処理途中にトレイラ部を取得するとデータ部の取得が出来なくなります。
トレイラ部の取得後データ部取得処理を実行するとIllegalStateExceptionが発生します。

関連項目:
FileLineIterator, CSVFileLineIterator, FixedFileLineIterator, VariableFileLineIterator, PlainFileLineIterator

フィールドの概要
private  boolean calledInit
          初期化処理確認用フラグ。
private  java.lang.Class<T> clazz
          結果クラス。
private  int[] columnBytes
          各カラムごとのバイト数を格納する変数。
private  char[] columnEncloseChar
          各カラムごとの囲み文字を格納する変数。
private  java.lang.String[] columnFormats
          各カラムごとのカラムのフォーマットを格納する変数。
private  int[] columnIndexs
          各カラムごとのカラムIndexを格納する変数。
private  java.util.Map<java.lang.String,ColumnParser> columnParserMap
          カラムパーサーを格納するマップ。
private  int currentLineCount
          ファイル入力処理済みのデータ部の行数。
private  boolean enclosed
          囲み文字確認用フラグ。
private  java.lang.reflect.Field[] fields
          ファイル行オブジェクトのField情報(Annotation)を格納する変数。
private  java.lang.String fileEncoding
          ファイルエンコーディング。
private  java.lang.String fileName
          ファイル名。
private  java.util.List<java.lang.String> header
          ヘッダ部の文字列リスト。
private  int headerLineCount
          ヘッダ行数。
private static int INITIAL_LINE_NO
          初期化処理をあらわす行番号。
private  InputFileColumn[] inputFileColumns
          ファイル行オブジェクトの入力設定アノテーションを格納する変数。
private  java.lang.String lineFeedChar
          行区切り文字。
private  LineReader lineReader
          1行分の文字列を読み込むオブジェクト
private  java.lang.reflect.Method[] methods
          ファイル行オブジェクトのFieldに対応するsetterメソッドを格納する。
private  char[] paddingChars
          各カラムごとのパディング文字を格納する変数。
private  PaddingType[] paddingTypes
          各カラムごとのパディング種別を格納する変数。
private  java.io.BufferedReader reader
          ファイルアクセス用の文字ストリーム。
private  boolean readTrailer
          トレイラ部処理確認用フラグ。
private static java.util.Map<java.lang.Class,StringConverter> stringConverterCacheMap
          ファイル行オブジェクトのストリングコンバータを格納するマップ。
private  StringConverter[] stringConverters
          ファイル行オブジェクトのストリングコンバータを格納する変数。
private  int totalBytes
          1行分のバイト数を格納する変数。
private  java.util.List<java.lang.String> trailer
          トレイラ部の文字列リスト。
private  int trailerLineCount
          トレイラ行数。
private  java.util.Queue<java.lang.String> trailerQueue
          トレイラ部の一時格納用のキュー。
private  char[] trimChars
          各カラムのトリム文字を格納する変数。
private  TrimType[] trimTypes
          各カラムごとのトリム種別を格納する変数。
 
コンストラクタの概要
AbstractFileLineIterator(java.lang.String fileName, java.lang.Class<T> clazz, java.util.Map<java.lang.String,ColumnParser> columnParserMap)
          コンストラクタ。
 
メソッドの概要
private  void buildFields()
          InputFileColumnアノテーションが設定されているファイル行オブジェクトの 属性の配列を生成する。
private  void buildHeader()
          ヘッダ部の取得を行う。
private  void buildLineReader()
          ファイルからデータを読込むためのLineReaderを生成する。
private  void buildMethods()
          ファイル行オブジェクトの属性のsetterメソッドのメソッドオブジェクトの配列を生成する。
private  void buildStringConverters()
          ファイル行オブジェクトの属性の文字変換種別オブジェクトの配列を生成する。
private  void buildTrailerQueue()
          トレイラキューの初期化を行う。
 void closeFile()
          ファイル閉塞処理を行う。
protected  int[] getColumnBytes()
          各カラムのバイト数を取得する。
protected  char[] getColumnEncloseChar()
          カラムの囲み文字を取得する。
 int getCurrentLineCount()
          現在ファイル入力処理済みのデータ部内の行数を取得する。
protected abstract  char getDelimiter()
          区切り文字を取得する。
protected abstract  char getEncloseChar()
          囲み文字を取得する。
protected  java.lang.reflect.Field[] getFields()
          ファイル行オブジェクトのField情報(Annotation)を格納する変数を取得する。
protected  java.lang.String getFileEncoding()
          ファイルエンコーディング取得する。
protected  java.lang.String getFileName()
          ファイル名を取得する。
 java.util.List<java.lang.String> getHeader()
          ヘッダ部のデータを取得する。
protected  int getHeaderLineCount()
          ヘッダ行数を取得する。
protected  java.lang.String getLineFeedChar()
          行区切り文字を取得する。
protected  int getTotalBytes()
          1行分のバイト数を取得する。
 java.util.List<java.lang.String> getTrailer()
          トレイラ部のデータを取得する。
protected  int getTrailerLineCount()
          トレイラ行数を取得する。
 boolean hasNext()
          次の行のレコードがあるかどうか確認する。
protected  void init()
          初期化処理を行う。
protected  boolean isCheckByte(InputFileColumn inputFileColumn)
          対象カラムに対するバイト数チェックを行うかを返す。
protected  boolean isCheckByte(int columnByte)
          対象カラムに対するバイト数チェックを行うかを返す。
protected  boolean isCheckColumnAnnotationCount()
          ファイル行オブジェクトにアノテーションが設定されている事をチェックするかどうかを返す。
protected  boolean isCheckEncloseChar()
          囲み文字が設定されていない事をチェックするかどうかを返す。
protected  boolean isEnclosed()
          囲み文字が設定されているかを返す。
 T next()
          繰り返し処理でファイル行オブジェクトを返却する。
protected  java.lang.String readLine()
          ファイルからデータ部のデータを1行分読み取り、文字列として呼出元に返却する。
 void remove()
          サポートしない。
protected abstract  java.lang.String[] separateColumns(java.lang.String fileLineString)
          データ部のデータ1行分をファイル行オブジェクトのアノテーションの記述に 従いカラムに分割する。
protected  void setLineFeedChar(java.lang.String lineFeedChar)
          行区切り文字を設定する。
 void skip(int skipLines)
          データ部のデータを読み飛ばす処理を行う。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

INITIAL_LINE_NO

private static final int INITIAL_LINE_NO
初期化処理をあらわす行番号。

関連項目:
定数フィールド値

fileName

private java.lang.String fileName
ファイル名。


clazz

private java.lang.Class<T> clazz
結果クラス。


lineFeedChar

private java.lang.String lineFeedChar
行区切り文字。


fileEncoding

private java.lang.String fileEncoding
ファイルエンコーディング。


headerLineCount

private int headerLineCount
ヘッダ行数。


trailerLineCount

private int trailerLineCount
トレイラ行数。


currentLineCount

private int currentLineCount
ファイル入力処理済みのデータ部の行数。


reader

private java.io.BufferedReader reader
ファイルアクセス用の文字ストリーム。


fields

private java.lang.reflect.Field[] fields
ファイル行オブジェクトのField情報(Annotation)を格納する変数。


inputFileColumns

private InputFileColumn[] inputFileColumns
ファイル行オブジェクトの入力設定アノテーションを格納する変数。


columnIndexs

private int[] columnIndexs
各カラムごとのカラムIndexを格納する変数。


columnFormats

private java.lang.String[] columnFormats
各カラムごとのカラムのフォーマットを格納する変数。


columnBytes

private int[] columnBytes
各カラムごとのバイト数を格納する変数。


totalBytes

private int totalBytes
1行分のバイト数を格納する変数。


paddingTypes

private PaddingType[] paddingTypes
各カラムごとのパディング種別を格納する変数。


paddingChars

private char[] paddingChars
各カラムごとのパディング文字を格納する変数。


trimTypes

private TrimType[] trimTypes
各カラムごとのトリム種別を格納する変数。


trimChars

private char[] trimChars
各カラムのトリム文字を格納する変数。


columnEncloseChar

private char[] columnEncloseChar
各カラムごとの囲み文字を格納する変数。


stringConverters

private StringConverter[] stringConverters
ファイル行オブジェクトのストリングコンバータを格納する変数。


stringConverterCacheMap

private static java.util.Map<java.lang.Class,StringConverter> stringConverterCacheMap
ファイル行オブジェクトのストリングコンバータを格納するマップ。


methods

private java.lang.reflect.Method[] methods
ファイル行オブジェクトのFieldに対応するsetterメソッドを格納する。


columnParserMap

private java.util.Map<java.lang.String,ColumnParser> columnParserMap
カラムパーサーを格納するマップ。


header

private java.util.List<java.lang.String> header
ヘッダ部の文字列リスト。


trailer

private java.util.List<java.lang.String> trailer
トレイラ部の文字列リスト。


readTrailer

private boolean readTrailer
トレイラ部処理確認用フラグ。


trailerQueue

private java.util.Queue<java.lang.String> trailerQueue
トレイラ部の一時格納用のキュー。


lineReader

private LineReader lineReader
1行分の文字列を読み込むオブジェクト


calledInit

private boolean calledInit
初期化処理確認用フラグ。


enclosed

private boolean enclosed
囲み文字確認用フラグ。

コンストラクタの詳細

AbstractFileLineIterator

public AbstractFileLineIterator(java.lang.String fileName,
                                java.lang.Class<T> clazz,
                                java.util.Map<java.lang.String,ColumnParser> columnParserMap)
コンストラクタ。
引数のチェック及び、ファイル行オブジェクトのFileFormatアノテーション 設定のチェックを行う。
チェック結果問題がある場合は例外を発生する。

パラメータ:
fileName - ファイル名最後に移動
clazz - ファイル行オブジェクトクラス
columnParserMap - フォーマット処理リスト
例外:
FileException - 初期化処理で失敗した場合。
メソッドの詳細

hasNext

public boolean hasNext()
次の行のレコードがあるかどうか確認する。
繰り返し処理でさらに要素がある場合に true を返します。

定義:
インタフェース java.util.Iterator 内の hasNext
定義:
インタフェース FileLineIterator<T> 内の hasNext
戻り値:
繰り返し処理でさらに要素がある場合に true
例外:
FileException - リーダからIOExceptionが発生した場合。

next

public T next()
繰り返し処理でファイル行オブジェクトを返却する。

次の行のレコードの情報をファイル行オブジェクトに格納して返却します。
繰り返し処理で次の要素を返します。

次の行のレコードの情報はファイル行オブジェクトのInputFileColumnの定義に 基づいて格納される。
もし、ファイル行オブジェクトのマッピングフィールドの数と合わない レコード情報が来た場合は例外を発生する。
また、InputFileColumnに設定されたバイト数と違う情報が来た場合も例外を発生する。
それではない場合は以下の順番でデータを処理し格納する。
      
  • トリム処理
  •   
  • パディング処理
  •   
  • 文字列変換処理
  •   
  • 型変換(マッピング)処理

定義:
インタフェース java.util.Iterator 内の next
定義:
インタフェース FileLineIterator<T> 内の next
戻り値:
ファイル行オブジェクト
例外:
FileException - ファイル行オブジェクトの生成に失敗した場合。
FileLineException - ファイル行オブジェクトの取得に失敗した場合。

remove

public void remove()
サポートしない。
Iteratorで定義されているメソッド。
FileQueryDAOでは実装しないので、他のクラスから呼び出した場合、 UnsupportedOperationExceptionをスローする。

定義:
インタフェース java.util.Iterator 内の remove
例外:
java.lang.UnsupportedOperationException - このメソッドはサポートしない。

init

protected void init()
初期化処理を行う。
初期化処理で行う処理は以下です。。
  • ファイル行オブジェクトの属性(Field)の取得
  • 文字変換種別オブジェクト(stringConverters)の生成
  • ファイル行オブジェクトの属性に対するセッタメソッド(methods)の取得
  • ファイルからデータを読込むためのLineReaderの生成
  • ヘッダ部の取得
  • トレイラキューの初期化
init()はAbstracFileLineIteratorを継承するクラスのコンストラクタで 呼ぶメソッドである。
下位互換性のため、2回以上実行できないようにしている。

例外:
FileException - 初期化処理で失敗した場合。
FileLineException - カラムに関連する初期化処理で失敗した場合。

buildLineReader

private void buildLineReader()
ファイルからデータを読込むためのLineReaderを生成する。
ファイルのReaderの生成および、利用すべきLineReaderの生成を行う。
行区切り文字が0,1,2桁ではない場合は例外を発生する。

例外:
FileException - LineReaderの生成に失敗した場合。

buildFields

private void buildFields()
InputFileColumnアノテーションが設定されているファイル行オブジェクトの 属性の配列を生成する。
取得対象属性はファイル行オブジェクトと継承元の全クラスの属性です。
取得した属性のInputFileColumn.columnIndex()が他属性と重複して いる場合は例外が発生する。
また、InputFileColumn.columnIndex()の最大値がカラムの数と合わない 場合も例外が発生する。
ファイル行オブジェクトの属性の設定に問題が無い場合は InputFileColumnアノテーション設定がある属性のみ整理し配列にする。

例外:
FileException - カラムインデックスが重複した場合。

buildStringConverters

private void buildStringConverters()
ファイル行オブジェクトの属性の文字変換種別オブジェクトの配列を生成する。
生成された文字変換種別オブジェクトインスタンスはキャッシュし、 同様の設定がある属性で利用する。
設定された文字変換種別オブジェクトがインスタンス化出来ないものの場合に 例外が発生する。

例外:
FileLineException - 文字変換種別オブジェクトの生成に失敗した場合。

buildMethods

private void buildMethods()
ファイル行オブジェクトの属性のsetterメソッドのメソッドオブジェクトの配列を生成する。
属性に対するsetterメソッドは以下のルールで検索する。
  • 属性名の最初の文字を大文字にした文字列の先頭に「set」をつけたもの。
setterメソッドが検索できない場合は例外が発生する。

例外:
FileException - setterメソッドが見つからなかった場合。

buildHeader

private void buildHeader()
ヘッダ部の取得を行う。
指定された行数分のデータが存在しない場合に例外を返す。

例外:
FileException - ヘッダ部の取得に失敗した場合。

buildTrailerQueue

private void buildTrailerQueue()
トレイラキューの初期化を行う。
トレイラ部はデータ部を全部読んだ後の部分で構成されますが、 ファイルは前から後に順調に読まれるため、
今取得したデータがデータ部の情報なのかトレイラ部の情報かが判断できない。
そのため、キューにデータを入れて取得する。
指定された行数分のデータが存在しない場合に例外を返す。

例外:
FileException - トレイラキューの初期化処理が失敗した場合。

closeFile

public void closeFile()
ファイル閉塞処理を行う。

定義:
インタフェース FileLineIterator<T> 内の closeFile
例外:
FileException - ファイル閉塞処理で失敗した場合。

getHeader

public java.util.List<java.lang.String> getHeader()
ヘッダ部のデータを取得する。
データ部とトレイラ部の取得処理の実行可否と関係なくヘッダ部を取得することが 出来る。

定義:
インタフェース FileLineIterator<T> 内の getHeader
戻り値:
header ヘッダ部の文字列リスト

getTrailer

public java.util.List<java.lang.String> getTrailer()
トレイラ部のデータを取得する。
トレイラ部のデータを取得するとデータ部のデータを取得することは出来ない。
理由はトレイラ部のデータ取得時に、データ部の情報を全部スキップするためです。
※注意事項
データ部のデータを全部取得する以前にトレイラ部を取得しないこと。

定義:
インタフェース FileLineIterator<T> 内の getTrailer
戻り値:
トレイラ部の文字列リスト
例外:
FileException - データ行取得処理で失敗した場合。

readLine

protected java.lang.String readLine()
ファイルからデータ部のデータを1行分読み取り、文字列として呼出元に返却する。
トレイラ部が存在する場合はトレイラキューからデータを取得して結果文字列に する。
その後LineReaderから1行分の文字列を取得しトレイラキューに格納する。
トレイラ部が存在しない場合はLineReaderから取得した1行分の文字列を結果文字列に する。
もし、次の1行分のデータがない場合はnullを返す。

戻り値:
データ部の1行分の文字列
例外:
FileException - データ行取得処理で失敗した場合。

skip

public void skip(int skipLines)
データ部のデータを読み飛ばす処理を行う。

定義:
インタフェース FileLineIterator<T> 内の skip
パラメータ:
skipLines - 読み飛ばす行数。

getDelimiter

protected abstract char getDelimiter()
区切り文字を取得する。

戻り値:
行区切り文字。

getEncloseChar

protected abstract char getEncloseChar()
囲み文字を取得する。

戻り値:
囲み文字。

separateColumns

protected abstract java.lang.String[] separateColumns(java.lang.String fileLineString)
データ部のデータ1行分をファイル行オブジェクトのアノテーションの記述に 従いカラムに分割する。
引数fileLineStringnullもしくは 空文字の場合は、要素を持たないString配列を返します。
サブクラスはこのメソッドをオーバーライドします。

パラメータ:
fileLineString - データ部のデータ1行分
戻り値:
データ部1行の文字列を分解した文字配列

isCheckByte

protected boolean isCheckByte(InputFileColumn inputFileColumn)
対象カラムに対するバイト数チェックを行うかを返す。

パラメータ:
inputFileColumn - 対象カラムのInputFileColumn情報
戻り値:
バイト数が設定されている(1バイト以上)場合はtrue。

isCheckByte

protected boolean isCheckByte(int columnByte)
対象カラムに対するバイト数チェックを行うかを返す。

パラメータ:
columnByte - 対象カラムのバイト数
戻り値:
バイト数が設定されている(1バイト以上)場合はtrue。

getLineFeedChar

protected java.lang.String getLineFeedChar()
行区切り文字を取得する。

戻り値:
行区切り文字

setLineFeedChar

protected void setLineFeedChar(java.lang.String lineFeedChar)
行区切り文字を設定する。

パラメータ:
行区切り文字 -

getFileEncoding

protected java.lang.String getFileEncoding()
ファイルエンコーディング取得する。

戻り値:
ファイルエンコーディング

getHeaderLineCount

protected int getHeaderLineCount()
ヘッダ行数を取得する。

戻り値:
ヘッダ行数

getTrailerLineCount

protected int getTrailerLineCount()
トレイラ行数を取得する。

戻り値:
トレイラ行数

getCurrentLineCount

public int getCurrentLineCount()
現在ファイル入力処理済みのデータ部内の行数を取得する。

戻り値:
ファイル入力処理済みのデータ部の行数。

getFields

protected java.lang.reflect.Field[] getFields()
ファイル行オブジェクトのField情報(Annotation)を格納する変数を取得する。

戻り値:
ファイル行オブジェクトのField情報(Annotation)を格納する変数

getFileName

protected java.lang.String getFileName()
ファイル名を取得する。

戻り値:
fileName ファイル名

getColumnEncloseChar

protected char[] getColumnEncloseChar()
カラムの囲み文字を取得する。

戻り値:
columnEncloseChar 囲み文字

isEnclosed

protected boolean isEnclosed()
囲み文字が設定されているかを返す。

戻り値:
enclosed 囲み文字

getColumnBytes

protected int[] getColumnBytes()
各カラムのバイト数を取得する。

戻り値:
columnBytes 各カラムのバイト数

getTotalBytes

protected int getTotalBytes()
1行分のバイト数を取得する。

戻り値:
totalBytes 1行分のバイト数

isCheckEncloseChar

protected boolean isCheckEncloseChar()
囲み文字が設定されていない事をチェックするかどうかを返す。

戻り値:
チェックを行う場合はtrue。

isCheckColumnAnnotationCount

protected boolean isCheckColumnAnnotationCount()
ファイル行オブジェクトにアノテーションが設定されている事をチェックするかどうかを返す。

戻り値:
チェックを行う場合はtrue。