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

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;

import jp.co.cybec.cb3.exception.DataFormatException;
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;

/**
 * XMLファイルの項目の属性を表すクラス。
 * @author Daisuke Suga
 */
public class XMLAttribute {

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

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

	/**
	 * 属性の名前。
	 */
	private String name = null;

	/**
	 * 属性の値。
	 */
	private String value = null;

	/**
	 * 属性の名前空間のURI。
	 */
	private String uri = "";

	/**
	 * 属性のQName。
	 */
	private String qName = "";

	/**
	 * 項目の名前。
	 */
	private String element = null;

	/**
	 * アクセッサのキー名。
	 */
	private String key = null;

	/**
	 * 検索パス。
	 */
	private String path = null;

	/**
	 * コンストラクタ。
	 *
	 * @param name 属性の名前
	 * @param value 属性の値
	 */
	public XMLAttribute(String name, Object value) {
		this(name, value, null, null, null);
	}

	/**
	 * コンストラクタ。
	 *
	 * @param name 属性の名前
	 * @param value 属性の値
	 * @param element 項目の名前
	 * @param key アクセッサのキー名
	 * @param path 検索パス
	 */
	protected XMLAttribute(String name, Object value, String element, String key, String path) {
		this.name = name;
		this.value = value != null ? value.toString() : null;
		this.element = element;
		this.key = key;
		this.path = path;
	}

	/**
	 * 属性の名前を取得します。
	 *
	 * @return 属性の名前
	 */
	public String getName() {
		return name;
	}

	/**
	 * 属性の値をStringで取得します。
	 *
	 * @return 属性の値
	 */
	public String getString() {
		return value;
	}

	/**
	 * 属性の値をIntegerで取得します。
	 *
	 * @return 属性の値
	 * @throws DataFormatException データ型の変換に失敗したときに発生します。
	 */
	public Integer getInteger() throws DataFormatException {
		try {
			return Integer.valueOf(value);
		} catch (NumberFormatException e) {
			String messageId = key == null ? LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_004
					: LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_005;
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_XML_001, messageId, name, value, element,
					key, path));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 属性の値をLongで取得します。
	 *
	 * @return 属性の値
	 * @throws DataFormatException データ型の変換に失敗したときに発生します。
	 */
	public Long getLong() throws DataFormatException {
		try {
			return Long.valueOf(value);
		} catch (NumberFormatException e) {
			String messageId = key == null ? LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_004
					: LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_005;
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_XML_002, messageId, name, value, element,
					key, path));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 属性の値をFloatで取得します。
	 *
	 * @return 属性の値
	 * @throws DataFormatException データ型の変換に失敗したときに発生します。
	 */
	public Float getFloat() throws DataFormatException {
		try {
			return Float.valueOf(value);
		} catch (NumberFormatException e) {
			String messageId = key == null ? LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_004
					: LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_005;
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_XML_003, messageId, name, value, element,
					key, path));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 属性の値をShortで取得します。
	 *
	 * @return 属性の値
	 * @throws DataFormatException データ型の変換に失敗したときに発生します。
	 */
	public Short getShort() throws DataFormatException {
		try {
			return Short.valueOf(value);
		} catch (NumberFormatException e) {
			String messageId = key == null ? LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_004
					: LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_005;
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_XML_004, messageId, name, value, element,
					key, path));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 属性の値をBigDecimalで取得します。
	 *
	 * @return 属性の値
	 * @throws DataFormatException データ型の変換に失敗したときに発生します。
	 */
	public BigDecimal getBigDecimal() throws DataFormatException {
		try {
			return new BigDecimal(value);
		} catch (NumberFormatException e) {
			String messageId = key == null ? LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_004
					: LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_005;
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_XML_005, messageId, name, value, element,
					key, path));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 属性の値をDateで取得します。
	 *
	 * @return 属性の値
	 * @throws DataFormatException データ型の変換に失敗したときに発生します。
	 */
	public Date getDate() throws DataFormatException {
		try {
			return DateFormat.getDateInstance().parse(value);
		} catch (ParseException e) {
			String messageId = key == null ? LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_004
					: LogMessageConstant.CB3_ACCESSOR_FILEACCESS_XML_005;
			DataFormatException ex = new DataFormatException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.ACCESSOR_FILEACCESS_XML_006, messageId, name, value, element,
					key, path));
			LOG.info(ex.getMessage(), ex);
			throw ex;
		}
	}

	/**
	 * 属性の名前空間のURIを取得します。
	 *
	 * @return 属性の名前空間のURI
	 */
	public String getURI() {
		return uri;
	}

	/**
	 * 属性の名前空間のURIを設定します。
	 *
	 * @param uri 属性の名前空間のURI
	 */
	public void setURI(String uri) {
		this.uri = uri;
	}

	/**
	 * 属性のQNameを取得します。
	 *
	 * @return 属性のQName
	 */
	public String getQName() {
		return qName;
	}

	/**
	 * 属性のQNameを設定します。
	 *
	 * @param qName 属性のQName
	 */
	public void setQName(String qName) {
		this.qName = qName;
	}

	/**
	 * 属性の値をStringで取得します。
	 * @return 項目の値
	 */
	public String toString() {
		return value;
	}

}
