/*
 * FlatFileRecordImpl.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.accessor.fileaccess.flat;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

import jp.co.cybec.cb3.exception.DataFormatException;
import jp.co.cybec.cb3.util.DateUtil;
import jp.co.cybec.cb3.util.logging.ErrorCodeConstant;
import jp.co.cybec.cb3.util.logging.LogMessageConstant;
import jp.co.cybec.cb3.util.logging.LogMessageFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ファイルのレコードの実装クラス。
 * @author Jianming Guo
 */
public class FlatFileRecordImpl implements FlatFileRecord {

	/** ログ */
	private static final Log LOG = LogFactory.getLog(FlatFileRecordImpl.class);

	/** メッセージ */
	private static final LogMessageFactory MESSAGE = new LogMessageFactory(
			LogMessageConstant.CB3_MESSAGE_FILENAME);

	/** レコードマップ */
	private LinkedHashMap<String, String> fileRecordMap = null;

	/**
	 * コンストラクタ
	 *
	 * @param recordMap レコードマップ
	 */
	public FlatFileRecordImpl(LinkedHashMap<String, String> recordMap){
		fileRecordMap = new LinkedHashMap<String, String>();
		this.fileRecordMap.putAll(recordMap);
	}

	/**
	 * 引数「key」に該当する値をString型で返却します。
	 *
	 * @param key 項目名
	 * @return String
	 */
	public String getString(String key){
		return this.fileRecordMap.get(key);
	}

	/**
	 * 引数「key」に該当する値をBigDecimal型で返却します。
	 *
	 * @param key 項目名
	 * @return BigDecimal型数字
	 * @throws DataFormatException データ型変換エラーが発生した場合に発生します。
	 */
	public BigDecimal getBigDecimal(String key) throws DataFormatException {
		String value = null;
		try {
			value =  this.fileRecordMap.get(key);
			if (value == null || value.length() == 0) {
				return null;
			} else {
				return new BigDecimal(value);
			}
		} catch (NumberFormatException e) {
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_FLAT_001,
					LogMessageConstant.CB3_ACCESSOR_FILEACCESS_005, key, value));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 引数「key」に該当する値をDouble型で返却します。
	 *
	 * @param key 項目名
	 * @return Double型数字
	 * @throws DataFormatException データ型変換エラーが発生した場合に発生します。
	 */
	public Double getDouble(String key) throws DataFormatException {
		String value = null;
		try {
			value =  this.fileRecordMap.get(key);
			if (value == null || value.length() == 0) {
				return null;
			} else {
				return Double.valueOf(value);
			}
		} catch (NumberFormatException e) {
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_FLAT_002,
					LogMessageConstant.CB3_ACCESSOR_FILEACCESS_005, key, value));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 引数「key」に該当する値をInteger型で返却します。
	 *
	 * @param key 項目名
	 * @return Integer型数字
	 * @throws DataFormatException データ型変換エラーが発生した場合に発生します。
	 */
	public Integer getInteger(String key) throws DataFormatException {
		String value = null;
		try {
			value =  this.fileRecordMap.get(key);
			if (value == null || value.length() == 0) {
				return null;
			} else {
				return Integer.valueOf(value);
			}
		} catch (NumberFormatException e) {
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_FLAT_003,
					LogMessageConstant.CB3_ACCESSOR_FILEACCESS_005, key, value));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 引数「key」に該当する値をLong型で返却します。
	 *
	 * @param key 項目名
	 * @return Long型数字
	 * @throws DataFormatException データ型変換エラーが発生した場合に発生します。
	 */
	public Long getLong(String key) throws DataFormatException {
		String value = null;
		try {
			value =  this.fileRecordMap.get(key);
			if (value == null || value.length() == 0) {
				return null;
			} else {
				return Long.valueOf(value);
			}
		} catch (NumberFormatException e) {
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_FLAT_004,
					LogMessageConstant.CB3_ACCESSOR_FILEACCESS_005, key, value));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 引数「key」に該当する値をFloat型で返却します。
	 *
	 * @param key 項目名
	 * @return Float型数字
	 * @throws DataFormatException データ型変換エラーが発生した場合に発生します。
	 */
	public Float getFloat(String key) throws DataFormatException {
		String value = null;
		try {
			value =  this.fileRecordMap.get(key);
			if (value == null || value.length() == 0) {
				return null;
			} else {
				return Float.valueOf(value);
			}
		} catch (NumberFormatException e) {
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_FLAT_005,
					LogMessageConstant.CB3_ACCESSOR_FILEACCESS_005, key, value));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 引数「key」に該当する値をShort型で返却します。
	 *
	 * @param key 項目名
	 * @return Short型数字
	 * @throws DataFormatException データ型変換エラーが発生した場合に発生します。
	 */
	public Short getShort(String key) throws DataFormatException {
		String value = null;
		try {
			value =  this.fileRecordMap.get(key);
			if (value == null || value.length() == 0) {
				return null;
			} else {
				return Short.valueOf(value);
			}
		} catch (NumberFormatException e) {
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_FLAT_006,
					LogMessageConstant.CB3_ACCESSOR_FILEACCESS_005, key, value));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 引数「key」に該当する値をDate型で返却します。
	 *
	 * @param key 項目名
	 * @return Date型日付
	 * @throws DataFormatException データ型変換エラーが発生した場合に発生します。
	 */
	public Date getDate(String key) throws DataFormatException {
		String value = null;
		try {
			value =  this.fileRecordMap.get(key);
			if (value == null || value.length() == 0) {
				return null;
			} else {
				return DateUtil.parseDate(value);
			}
		} catch (ParseException e) {
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_FLAT_007,
					LogMessageConstant.CB3_ACCESSOR_FILEACCESS_005, key, value));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * レコードマップを返却します。
	 *
	 * @return レコードマップ
	 */
	public Map<String, String> toMap() {
		return this.fileRecordMap;
	}
}
