/*
 * Copyright (C) 2005-2006 Kouji Sugisawa. All rights reserved.
 */

package jp.sourceforge.livez.imode;

import javax.servlet.http.HttpServletRequest;

import org.springframework.dao.DataAccessException;
import org.springframework.web.context.WebApplicationContext;

import jp.sourceforge.livez.IllegalRequestException;
import jp.sourceforge.livez.MobilePhoneGenerator;
import jp.sourceforge.livez.dao.ImodeDAO;

/**
 * iモード端末情報を生成する携帯端末情報ジェネレータクラスです。
 * 
 * @author 杉澤 浩二
 */
public final class ImodeGenerator extends MobilePhoneGenerator<ImodeRequest, Imode> {

	/**
	 * iモードサービス検証クラスが設定ファイルを参照してこのクラスを生成する時に使用するキー名です。
	 * 
	 * @see ImodeService#getMobilePhoneGenerator(WebApplicationContext)
	 */
	public static final String BEAN_ID = "imodeGenerator";

	/**
	 * ImodeDAO を保持します。
	 */
	private ImodeDAO imodeDAO = null;

	/**
	 * ImodeDAO を設定します。
	 * 
	 * @param imodeDAO ImodeDAO
	 */
	public void setImodeDAO(final ImodeDAO imodeDAO) {
		this.imodeDAO = imodeDAO;
	}

	/**
	 * デフォルトコンストラクタです。
	 */
	public ImodeGenerator() {}

	/**
	 * iモード端末リクエスト情報からiモード端末情報を生成して返します。
	 * 
	 * @param r iモード端末リクエスト情報
	 * @return iモード端末情報
	 * @throws NullPointerException iモード端末リクエスト情報が <code>null</code> の場合
	 * @throws DataAccessException ImodeDAO の操作で例外が発生した場合
	 */
	@Override
	public Imode create(final ImodeRequest r) throws NullPointerException, DataAccessException {
		// これ以降の処理ブロックをメソッド化すること
		final ImodeImpl result = new ImodeImpl();

		if (imodeDAO != null) {
			jp.sourceforge.livez.dao.Imode imode = imodeDAO.load(r.getUserAgent().getName());
			if (imode != null)
				result.setup(imode);
		}

		result.setup(r);

		return result;
	}

	/**
	 * HTTP リクエスト情報からiモード端末情報を生成して返します。
	 * 
	 * @param request HTTPリクエスト情報
	 * @return iモード端末情報
	 * @throws NullPointerException HTTPリクエスト情報が <code>null</code> の場合
	 * @throws IllegalRequestException HTTPリクエスト情報が不正な場合
	 * @throws DataAccessException ImodeDAO の操作で例外が発生した場合
	 */
	@Override
	public Imode create(final HttpServletRequest request) throws NullPointerException, IllegalRequestException, DataAccessException {
		return create(new ImodeRequestImpl(request));
	}

}
