/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUMobileUtil
*   ソースファイル名：JFUMobileUtil.java
*   作成者          ：富士通
*   日付            ：2012年05月08日
*＜機能概要＞
*   携帯共通処理部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v2.00      2012/05/08    FJ)福島     新規作成
*
**********************************************************************/

package eo.web.webview.common;

import javax.servlet.http.HttpServletRequest;

import eo.common.constant.JFUStrConst;

/**
 * クラス名：JFUMobileUtil<br>
 * クラス説明：携帯共通処理を行う。<br>
 * 備考：
 * @version v2.00 2012/05/08
 * @author 富士通
 */
public class JFUMobileUtil
{
	/** リターン値 */
	private static final String STR_BLANK = "";

	/**
	 * メソッド名：個体識別番号取得<br>
	 * メソッド説明：HTTPRequestヘッダ情報から携帯端末の個体識別番号となる文字列を取得し、呼出元へ返す。<br>
	 * 備考：
	 * @param request HttpServletRequest 
	 * @return String 個体識別番号
	 */
	public static String getTanmtSkbtCd(HttpServletRequest request)
	{

		String serialNo = "";
		// キャリア種別取得
		String carrierType = getCarrierType(request);

		// HTTPRequestヘッダからユーザーエージェントを取得
		String userAgent = request.getHeader("user-agent");

		// キャリア種別毎に適当な値を取得する
		// 1:「docomo」の場合
		if (carrierType.equals(JFUStrConst.CD00690_01))
		{
			// 「MOVA」の場合
			if (userAgent.startsWith("DoCoMo/1.0"))
			{
				int start = userAgent.indexOf("ser");
				if (!(start == -1))
				{
					serialNo = userAgent.substring(start, start + 14);
				}
				// 「FOMA」の場合
			}
			else if (userAgent.startsWith("DoCoMo/2.0"))
			{
				int start = userAgent.indexOf("icc");
				if (!(start == -1))
				{
					serialNo = userAgent.substring(start, start + 23);
				}
			}

			// 2:「au」の場合
		}
		else if (carrierType.equals(JFUStrConst.CD00690_02))
		{
			String subNo = request.getHeader("x-up-subno");

			if (subNo != null)
			{

				int end = subNo.indexOf(".ezweb");
				if (!(end == -1))
				{
					serialNo = subNo.substring((end - 17), end);
					serialNo = replaceString(serialNo, "_", "");
				}
			}

			// 3:「Softbank」の場合
		}
		else if (carrierType.equals(JFUStrConst.CD00690_03))
		{
			int start = userAgent.indexOf("SN");
			if (!(start == -1))
			{
				if (userAgent.startsWith("J-PHONE/4"))
				{
					serialNo = userAgent.substring(start, start + 13);
				}
				else
				{
					serialNo = userAgent.substring(start, start + 17);
				}
			}
			// null:「その他」の場合
		}
		else
		{
			// 処理なし
		}

		return serialNo;
	}

	/**
	 * メソッド名：キャリア種別取得<br>
	 * メソッド説明：HTTPRequestヘッダ情報から携帯端末のキャリア種別を判定し、<br>
	 *          定義された値を呼出元へ返す。<br>
	 * 備考：
	 * @param request HttpServletRequest
	 * @return String キャリア種別
	 */
	public static String getCarrierType(HttpServletRequest request)
	{

		String carrierType = "";
		// HTTPRequestヘッダからユーザーエージェントを取得
		String userAgent = request.getHeader("user-agent");

		// キャリア種別判定
		if (userAgent.startsWith("DoCoMo"))
		{
			// 01:「docomo」
			carrierType = JFUStrConst.CD00690_01;
		}
		else if (userAgent.startsWith("UP.Browser") || userAgent.startsWith("KDDI"))
		{
			// 02:「au」
			carrierType = JFUStrConst.CD00690_02;
		}
		else if (userAgent.startsWith("SoftBank") || userAgent.startsWith("Vodafone") || userAgent.startsWith("J-PHONE")
				|| userAgent.startsWith("MOT-"))
		{
			// 03:「Softbank」
			carrierType = JFUStrConst.CD00690_03;
			// TODO スタブ削除
		}
		else if (userAgent.startsWith("Semulator"))
		{
			// 03:「Softbank」
			carrierType = JFUStrConst.CD00690_03;
		}
		else
		{
			// null:「その他」
			carrierType = "";
		}

		return carrierType;

	}

	/**
	 * <dd>メソッド名  ：文字列置換
	 * <dd>メソッド説明：対象文字列中の置換前文字を置換後文字に置き換えて返す
	 * <dd>備考        ：
	 * @param base 対象文字列
	 * @param pre 置換前文字
	 * @param aft 置換後文字
	 * @return 置換後文字列
	 */
	public static String replaceString(String base, String pre, String aft)
	{

		// 対象文字列がnull、置換前文字がnull、または置換後文字がnullの場合
		if (base == null || pre == null || aft == null)
		{
			// 空文字を返す
			return STR_BLANK;
		}

		// 対象文字列と置換前文字が等しい場合
		if (base.equals(pre))
		{
			// 置換後文字を返す
			return aft;
		}

		StringBuffer sb = new StringBuffer(base);

		// 文字列置換処理
		for (int idx = sb.indexOf(pre); idx > 0; idx = sb.indexOf(pre))
		{
			sb.replace(idx, idx + pre.length(), aft);
		}

		// 置換後文字列を返す
		return sb.toString();
	}

}