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

package jp.sourceforge.livez;

import javax.servlet.http.HttpServletRequest;

import org.springframework.dao.DataAccessException;

/**
 * 携帯端末情報を生成する携帯端末情報ジェネレータの基底クラスです。
 * 
 * @author 杉澤 浩二
 */
public abstract class MobilePhoneGenerator<R extends MobilePhoneRequest, M extends MobilePhone> {

	/**
	 * デフォルトの携帯端末リクエスト情報を保持します。
	 */
	private R mobilePhoneRequest = null;

	/**
	 * デフォルトの携帯端末リクエスト情報を設定します。
	 * 
	 * @param mobilePhoneRequest 携帯端末リクエスト情報
	 */
	final void setMobilePhoneRequest(final R mobilePhoneRequest) {
		this.mobilePhoneRequest = mobilePhoneRequest;
	}

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

	/**
	 * 携帯端末リクエスト情報から携帯端末情報を生成して返します。
	 * 
	 * @return 携帯端末情報
	 * @throws IllegalStateException デフォルトの携帯端末リクエスト情報が <code>null</code> の場合
	 */
	final M create() throws IllegalStateException, DataAccessException {
		if (mobilePhoneRequest == null)
			throw new IllegalStateException();

		return create(mobilePhoneRequest);
	}

	/**
	 * 携帯端末リクエスト情報から携帯端末情報を生成して返します。
	 * 
	 * @param request 携帯端末リクエスト情報
	 * @return 携帯端末情報
	 * @throws NullPointerException 携帯端末リクエスト情報が <code>null</code> の場合
	 * @throws DataAccessException DAO の操作で例外が発生した場合
	 */
	public abstract M create(R request) throws NullPointerException, DataAccessException;

	/**
	 * HTTPリクエスト情報から携帯端末情報を生成して返します。
	 * 
	 * @param request HTTPリクエスト情報
	 * @return 携帯端末情報
	 * @throws NullPointerException HTTPリクエスト情報が <code>null</code> の場合
	 * @throws IllegalRequestException HTTPリクエスト情報が不正な場合
	 * @throws DataAccessException DAO の操作で例外が発生した場合
	 */
	public abstract M create(HttpServletRequest request) throws NullPointerException, IllegalRequestException, DataAccessException;

}
