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

package jp.sourceforge.livez;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.WebApplicationContext;

import jp.sourceforge.livez.ezweb.EZwebService;
import jp.sourceforge.livez.imode.ImodeService;
import jp.sourceforge.livez.vodafone.VodafoneService;

/**
 * HTTP リクエスト情報から携帯通信サービスを判定して適切な携帯端末情報や携帯端末リクエスト情報を返すファクトリークラスです。
 * 
 * @author 杉澤 浩二
 * @see Service
 */
public final class MobilePhoneFactory {

	/**
	 * サービス判定用プロバイダクラスの一覧を保持します。
	 */
	private static final Service[] services =
		new Service[] {
			new ImodeService(),
			new EZwebService(),
			new VodafoneService()
		};

	/**
	 * インスタンス化出来ない事を強制します。
	 */
	private MobilePhoneFactory() {}

	/**
	 * HTTP リクエスト情報から携帯通信サービスを判定して適切な携帯端末情報を返します。
	 * 
	 * @param request HTTP リクエスト情報
	 * @param context Spring Framework の WebApplicationContext
	 * @return 携帯端末情報
	 * @throws NullPointerException HTTP リクエスト情報が <code>null</code> の場合
	 * @throws ServiceNotFoundException 適切なサービスが見つからなかった場合
	 */
	@SuppressWarnings("unchecked")
	public static MobilePhone getMobilePhone(
		final HttpServletRequest request,
		final WebApplicationContext context)
		throws NullPointerException, ServiceNotFoundException {

		return getMobilePhoneGenerator(request, context).create();
	}

	/**
	 * HTTP リクエスト情報から通信サービスを判定して適切な携帯端末情報ジェネレータを返します。
	 * 
	 * @param request HTTP リクエスト情報
	 * @param context Spring Framework の WebApplicationContext
	 * @return 携帯端末情報ジェネレータ
	 * @throws NullPointerException HTTP リクエスト情報が <code>null</code> の場合
	 * @throws ServiceNotFoundException 適切なサービスが見つからなかった場合
	 */
	@SuppressWarnings("unchecked")
	private static MobilePhoneGenerator getMobilePhoneGenerator(
		final HttpServletRequest request,
		final WebApplicationContext context)
		throws NullPointerException, ServiceNotFoundException {

		for (int i = 0; i < services.length; i++) {
			Service service = services[i];
			try {
				MobilePhoneRequest r = service.getMobilePhoneRequest(request);
				MobilePhoneGenerator g = service.getMobilePhoneGenerator(context);
				g.setMobilePhoneRequest(r);
				return g;
			} catch (IllegalRequestException e) {}	// 無視する
		}

		// いづれの端末でもないと判断された場合(恐らくPCやエッジ)
		throw new ServiceNotFoundException();	// FIXME - 何かエラーメッセージを返すこと
	}

	/**
	 * HTTP リクエスト情報から通信サービスを判定して適切な携帯端末リクエスト情報を返します。
	 * 
	 * @param request HTTP リクエスト情報
	 * @return 携帯端末リクエスト情報
	 * @throws NullPointerException HTTP リクエスト情報が <code>null</code> の場合
	 * @throws ServiceNotFoundException 適切なサービスが見つからなかった場合
	 */
	public static MobilePhoneRequest getMobilePhoneRequest(
		final HttpServletRequest request)
		throws NullPointerException, ServiceNotFoundException {

		for (int i = 0; i < services.length; i++) {
			Service service = services[i];
			try {
				return service.getMobilePhoneRequest(request);
			} catch (IllegalRequestException e) {}	// 無視する
		}

		// いづれの端末でもないと判断された場合(恐らくPCやエッジ)
		throw new ServiceNotFoundException();	// FIXME - 何かエラーメッセージを返すこと
	}

}
