/*
 * このソースコードは blanco Frameworkによって自動生成されています。
 */
package blanco.nlpack.generator.csv.io;

import java.io.BufferedWriter;
import java.io.IOException;

import blanco.nlpack.generator.csv.record.BlancoNLpackGeneratorOmitPhraseListCsvRecord;

/**
 * ファイル定義[BlancoNLpackGeneratorOmitPhraseList/blancoNLpackGenerator が「処理しない」対象フレーズをあらわすCSVファイル。]のライタクラス
 *
 * このクラスはblancoCsvファイル定義書から自動生成されたライタクラスです。<br>
 * 　1.文字列長チェックには、デフォルトエンコーディングを利用します。<br>
 * 　2.クラスの利用した後は必ず close()を呼び出してください。<br>
 */
public class BlancoNLpackGeneratorOmitPhraseListCsvWriter {
    /**
     * ライタオブジェクト
     *
     * 内部的に実際に出力を行うのライタを記憶します。
     */
    private BufferedWriter fWriter;

    /**
     * 処理中の行カウンタ
     *
     * 現在処理を行っている行の位置を記憶します。
     */
    private long fLineCounter = 0;

    /**
     * CSVライタクラスのコンストラクタ
     *
     * 与えられたライタと連結します。
     *
     * @param arg 連結するライタ
     */
    public BlancoNLpackGeneratorOmitPhraseListCsvWriter(final BufferedWriter arg) {
        fWriter = arg;
    }

    /**
     * 与えられた一行を書き出します
     *
     * データはデリミタで区切られながらライタに出力され、最後に改行コードが付与されます。
     *
     * @param record レコードオブジェクト
     * @throws BlancoCsvIOException 与えられたレコード中の項目値が不正な場合など。
     * @throws IOException 連結されたライター出力の際に例外が発生した場合。
     */
    public void writeRecord(final BlancoNLpackGeneratorOmitPhraseListCsvRecord record) throws BlancoCsvIOException, IOException {
        String writeToken = null;

        // 項目番号[1] 項目名[Phrase/Phrase]
        if (record.getPhrase() == null) {
            throw new BlancoCsvIOException("出力" + (fLineCounter + 1) + "行目 1項目目。項目番号[1] 項目名[Phrase/Phrase]の処理中において必須項目にnullが与えられていることを検知しました。");
        }
        if (record.getPhrase().length() == 0) {
            throw new BlancoCsvIOException("出力" + (fLineCounter + 1) + "行目 1項目目。項目番号[1] 項目名[Phrase/Phrase]の処理中において必須項目に長さ0の文字列が与えられていることを検知しました。");
        }
        writeToken = record.getPhrase();
        if (writeToken == null) {
            throw new BlancoCsvIOException("出力" + (fLineCounter + 1) + "行目 1項目目。項目番号[1] 項目名[Phrase/Phrase]の処理中において必須項目にnullが与えられていることを検知しました。");
        }
        if (writeToken.indexOf("\t") >= 0) {
            throw new BlancoCsvIOException("出力" + (fLineCounter + 1) + "行目 1項目目。項目番号[1] 項目名[Phrase/Phrase]の処理中においてデータ中[" + writeToken + "]に項目のデリミタ[\t]が含まれることを検知しました。");
        }
        fWriter.write(writeToken);
        fWriter.write('\t');

        // 項目番号[2] 項目名[Reason/Reason]
        // 任意項目で文字列の項目に nullまたは長さ0の文字列が与えられた場合には、いずれも値が入っていないものとみなします。
        // この場合には長さチェックは行いません。
        writeToken = record.getReason() == null ? "" : record.getReason();
        if (writeToken.length() > 0) {
        }
        if (writeToken.indexOf("\t") >= 0) {
            throw new BlancoCsvIOException("出力" + (fLineCounter + 1) + "行目 2項目目。項目番号[2] 項目名[Reason/Reason]の処理中においてデータ中[" + writeToken + "]に項目のデリミタ[\t]が含まれることを検知しました。");
        }
        fWriter.write(writeToken);

        // 最後に改行コードが付与されます。
        fWriter.newLine();
        fLineCounter++;
    }

    /**
     * 内部的に保持しているライタを返します。
     *
     * @return 内部的に保持しているライタ。
     */
    public BufferedWriter getWriter() {
        return fWriter;
    }

    /**
     * 現在処理中の行カウンタを返します。
     *
     * @return 現在処理中の行カウンタ。
     */
    public long getLineCounter() {
        return fLineCounter;
    }

    /**
     * このライタをフラッシュします。
     *
     * 関連づけられていたライタに対してもflush()を呼び出します。
     *
     * @throws IOException 関連づけられていたライタのflush()に失敗した場合。
     */
    public void flush() throws IOException {
        fWriter.flush();
    }

    /**
     * このライタを閉じます。
     *
     * 関連づけられていたライタに対してもclose()を呼び出します。
     *
     * @throws IOException 関連づけられていたライタのclose()に失敗した場合。
     */
    public void close() throws IOException {
        fWriter.close();
    }
}
