package jp.terasoluna.batch.functionsample.b002;

import jp.terasoluna.fw.batch.blogic.AbstractTransactionBLogic;
import jp.terasoluna.fw.batch.blogic.vo.BLogicParam;
import jp.terasoluna.fw.batch.dao.support.BatchUpdateExecutor;
import jp.terasoluna.fw.dao.UpdateDAO;
import jp.terasoluna.fw.file.dao.FileLineIterator;
import jp.terasoluna.fw.file.dao.FileQueryDAO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

/**
 * ファイル-DB関連ジョブ（バッチ更新）のサンプル<br>
 * <br>
 * 事前準備：C:\tmp配下にinput.csvファイルを配置すること<br>
 * <br>
 * サンプル内容：ファイルを読み込み、DBにバッチ更新するサンプル。
 */
public class B002004BLogic extends AbstractTransactionBLogic {

    private Log log = LogFactory.getLog(B002004BLogic.class);

    private static final int BATCH_NORMAL_END = 0;

    @Autowired
    @Qualifier("csvFileQueryDAO")
    private FileQueryDAO csvFileQueryDAO = null;

    @Autowired
    @Qualifier("updateDAO")
    private UpdateDAO updateDAO = null;

    @Override
    public int doMain(BLogicParam arg0) {

        // EMPLOYEEテーブルの初期化
        updateDAO.execute("B002004.deleteEmployees", null);

        // バッチ更新サポートをフィールドに持っているBean
        JobBean jobBean = new JobBean();

        FileLineIterator<CsvRecord> recordIterator = csvFileQueryDAO.execute(
                "C:\\tmp\\input.csv", CsvRecord.class);

        try {

            while (recordIterator.hasNext()) {
                CsvRecord record = recordIterator.next();
                log.info("ID:" + record.getId() + " FIMILYNAME:"
                        + record.getFamilyName() + " FIRSTNAME:"
                        + record.getFirstName() + " AGE:" + record.getAge());

                // バッチ更新リストに登録
                jobBean.getBatchUpdate().addBatch("B002004.insertEmployees",
                        record);

                // 1000件ごとにバッチ更新を実行
                if (jobBean.getBatchUpdate().size() >= 1000) {
                    // バッチ更新実行
                    BatchUpdateExecutor.executeBatch(jobBean, updateDAO);
                }
            }
        } finally {
            // ファイルのクローズ
            recordIterator.closeFile();
        }

        // バッチ更新実行
        BatchUpdateExecutor.executeBatch(jobBean, updateDAO);

        // 正常終了
        return BATCH_NORMAL_END;
    }

}
