/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUIncludeFileEx
*   ソースファイルパス：JFUIncludeFileEx.java
*   作成者          ：富士通
*   日付            ：2014年07月10日
*＜機能概要＞
*   指定されたパスのファイルを読み込んでHTMLデータ内に書き出す拡張タグ用クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2014/07/10   FJ          新規作成
*   v27.00      2016/11/17   FJ          【ANK-2961-00-00】一般Webへの広告用タグ埋め込み
*   v45.00      2019/09/06   FJ          【ANK-3730-01-00】フロント申込完了画面へのアフィリエイトタグ(Launch)追加
*   v46.00      2019/10/21   FJ)西川     【ANK-3729-00-00】SaferiへのITP導入に伴うアフィリエイトタグの変更
*
**********************************************************************/

package eo.web.webview.common;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;

import javax.servlet.jsp.JspException;

import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.web.x33.X33VCustomTagBase;

import eo.common.constant.JFUStrConst;

/**
 * 指定されたキー情報を元にアプリケーションプロパティを参照し
 * ファイルパスと出力フラグ値を取得判定し
 * ファイル内容を読み込んで、共有フォームビーンの情報をセットし、
 * HTMLデータ内に書き出す。
 * 拡張タグ用クラス
 * @author 富士通
 *
 */
@SuppressWarnings("serial")
public class JFUIncludeFileEx extends X33VCustomTagBase
{

	/** 拡張タグテンプレートファイルのテンプレートID：変更系用 */
	private static final String TAG_TEMPLATE_CHG = "TagTemplate015";

	/** 拡張タグテンプレートファイルのテンプレートID：新規系用 */
	private static final String TAG_TEMPLATE_NEW = "TagTemplate016";

	/** 拡張タグテンプレートファイルのテンプレートID：共通 */
	private static final String TAG_TEMPLATE_COM = "TagTemplate017";

	/** タグに共有フォームBean情報を置換する開始位置を定義する記号 */
	private static final String COMMON_INFO_START = "＜";

	/** タグに共有フォームBean情報を置換する終了位置を定義する記号 */
	private static final String COMMON_INFO_END = "＞";

	/** taglibより渡されるキー */
	private String key = "";

	/** taglibより渡される出力フラグキー */
	private String outPutFlgKey = "";

	/** フロント区分 */
	private String fuKbn = "";

	/** キー：フロント区分 */
	private static final String KEY_FU_KBN = "fu_kbn";

	/** 置換文字列変換用MAP（変更系用） */
	private static final HashMap<String, String> KEYWORD_MAP_CHG = new HashMap<String, String>();
	static
	{
		KEYWORD_MAP_CHG.put("ＳＹＳＩＤ", "sysid");
		KEYWORD_MAP_CHG.put("お客様ステータス", "cust_stat");
		KEYWORD_MAP_CHG.put("契約者タイプコード", "keisha_type_cd");
		KEYWORD_MAP_CHG.put("お客様名", "cust_nm");
		KEYWORD_MAP_CHG.put("お客様カナ名", "cust_kana");
		KEYWORD_MAP_CHG.put("お客様性別コード", "cust_sex_cd");
		KEYWORD_MAP_CHG.put("お客様生年月日", "cust_birthd");
		KEYWORD_MAP_CHG.put("契約者住所コード", "keisha_ad_cd");
		KEYWORD_MAP_CHG.put("契約者郵便番号", "keisha_pcd");
		KEYWORD_MAP_CHG.put("契約者都道府県名", "keisha_state_nm");
		KEYWORD_MAP_CHG.put("契約者市区町村名", "keisha_city_nm");
		KEYWORD_MAP_CHG.put("契約者大字通称名", "keisha_oaztsu_nm");
		KEYWORD_MAP_CHG.put("契約者字丁目名", "keisha_azcho_nm");
		KEYWORD_MAP_CHG.put("契約者番地号", "keisha_bnchigo");
		KEYWORD_MAP_CHG.put("契約者住所補記・建物名", "keisha_adrttm");
		KEYWORD_MAP_CHG.put("契約者住所補記・部屋番号", "keisha_adrrm");
		KEYWORD_MAP_CHG.put("契約者電話番号", "keisha_telno");
		KEYWORD_MAP_CHG.put("ｅｏＩＤ", "eoid");
		KEYWORD_MAP_CHG.put("会員種別コード", "member_sbt_cd");
		KEYWORD_MAP_CHG.put("コンテンツＩＳＰ利用不可フラグ", "cont_isp_use_fail_flg");
		KEYWORD_MAP_CHG.put("勤務先名", "offc_nm");
		KEYWORD_MAP_CHG.put("不良顧客番号", "huryo_cust_no");
		KEYWORD_MAP_CHG.put("グループコード", "grp_cd");
		KEYWORD_MAP_CHG.put("グループリーダーＳＹＳＩＤ", "grp_leader_sysid");
		KEYWORD_MAP_CHG.put("連絡先番号", "rrks_no");
		KEYWORD_MAP_CHG.put("連絡先種別コード", "rrks_sbt_cd");
		KEYWORD_MAP_CHG.put("連絡先分類コード", "rrks_bunrui_cd");
		KEYWORD_MAP_CHG.put("連絡先自宅メールアドレス", "rrks_home_mlad");
		KEYWORD_MAP_CHG.put("電話番号", "telno");
	}

	/** 置換文字列変換用MAP（新規系用） */
	private static final HashMap<String, String> KEYWORD_MAP_NEW = new HashMap<String, String>();
	static
	{
		KEYWORD_MAP_NEW.put("申込書明細番号（ネット）", "mskmsho_dtl_no_net");
		KEYWORD_MAP_NEW.put("申込書明細番号（電話）", "mskmsho_dtl_no_tel");
		KEYWORD_MAP_NEW.put("申込書明細番号（テレビ）", "mskmsho_dtl_no_tv");
	}

	/**
	 * キーを設定します。
	 * <br>
	 * @param arg0 キー
	 */
	public void setKey(String arg0)
	{
		this.key = arg0;
	}

	/**
	 * 出力フラグキーを設定します。
	 * <br>
	 * @param arg0 キー
	 */
	public void setOutPutFlgKey(String arg0)
	{
		this.outPutFlgKey = arg0;
	}

	/**
	 * 指定されたパスのファイルを読み込んでHTMLデータ内に書き出す。
	 * <br>
	 * @return 処理結果
	 * @throws JspException JSPエラー。
	 */
	@Override
	public int doStartTag() throws JspException
	{

		if (this.key.length() == 0)
		{
			return SKIP_BODY;
		}

		// リアルパスの取得
		String path = JCMAPLConstMgr.getString(key);
		if (path == null || path.length() == 0)
		{
			return SKIP_BODY;
		}

		if (this.outPutFlgKey.length() != 0)
		{
			// 出力フラグ(0:出力しない、1:出力する)の取得
			String outPutFlg = JCMAPLConstMgr.getString(outPutFlgKey);
			if ("0".equals(outPutFlg))
			{
				return SKIP_BODY;
			}
		}

		// フロント区分の設定
		this.fuKbn = getDataString(TAG_TEMPLATE_COM, KEY_FU_KBN, 0);
		if (JFUWebCommon.isNull(this.fuKbn))
		{
			return SKIP_BODY;
		}

		StringWriter sw = null;
		FileReader fr = null;
		BufferedReader br = null;
		try
		{
			File file = new File(path);
			sw = new StringWriter(Long.valueOf(file.length()).intValue());
			fr = new FileReader(file);
			br = new BufferedReader(fr);

			String str = null;
			while ((str = br.readLine()) != null)
			{
				StringBuffer sb = new StringBuffer();
				sb.append(setCommonFormBeanData(str));
				sb.append(JFUStrConst.RETURN_CODE);
				sw.write(sb.toString());
			}

			outputHtml(sw.getBuffer().toString());
		}
		catch (FileNotFoundException e)
		{
			throw new JspException(e);
		}
		catch (IOException e)
		{
			throw new JspException(e);
		}
		finally
		{
			try
			{
				if (br != null)
				{
					br.close();
				}
				if (fr != null)
				{
					fr.close();
				}
				if (sw != null)
				{
					sw.close();
				}
			}
			catch (IOException e)
			{
				throw new JspException(e);
			}
		}
		return SKIP_BODY;
	}

	/**
	 * 文字列に共有フォームビーン情報をセットする。
	 * 共有フォームビーン情報からの置換対象文字列がない場合、引数の文字列をそのまま返す。
	 * <br>
	 * @param str 文字列
	 * @return 文字列
	 */
	private String setCommonFormBeanData(String str)
	{
		// タグテンプレートIDの設定
		String tagTemplateId = JFUStrConst.EMPTY;
		// キーワードマップの設定
		HashMap<String, String> keyWordMap = null;

		if (JFUStrConst.FU_KBN_N.equals(this.fuKbn))
		{
			// 新規系の場合
			tagTemplateId = TAG_TEMPLATE_NEW;
			keyWordMap = KEYWORD_MAP_NEW;
		}
		else if (JFUStrConst.FU_KBN_C.equals(this.fuKbn))
		{
			// 変更系の場合
			tagTemplateId = TAG_TEMPLATE_CHG;
			keyWordMap = KEYWORD_MAP_CHG;
		}

		// 戻り値用文字列
		StringBuffer sb = new StringBuffer();
		int separaterStartPoint = str.indexOf(COMMON_INFO_START);
		int separaterEndPoint = str.indexOf(COMMON_INFO_END);
		if (separaterStartPoint < 0 || separaterEndPoint < separaterStartPoint)
		{
			// 共有フォームビーン情報からの置換対象文字列がない場合、引数の文字列をそのまま返す。
			return str;
		}
		String strBufRemain = str;
		while(separaterStartPoint >= 0 && separaterEndPoint > separaterStartPoint)
		{
			if (separaterStartPoint > 0)
			{
				// 置換文字列より前の部分の文字列を戻り値用文字列に結合する
				String headStr = strBufRemain.substring(0, separaterStartPoint);
				sb.append(headStr);
			}
			// 置換前の文字列を切り出す
            String keyWordData = strBufRemain.substring(separaterStartPoint + 1, separaterEndPoint);
			// 共有フォームBean情報の項目名（英名）に変換する
            if (keyWordMap.containsKey(keyWordData))
            {
            	keyWordData = keyWordMap.get(keyWordData);
    			// 置換後の文字列を取得する
            	keyWordData = getDataString(tagTemplateId, keyWordData, 0);
            }
			// 置換後の文字列を戻り値用文字列に結合する
			sb.append(keyWordData);
			// 置換文字列より後ろの部分の文字列を切り出す
            strBufRemain = strBufRemain.substring(separaterEndPoint + 1);

    		separaterStartPoint = strBufRemain.indexOf(COMMON_INFO_START);
    		separaterEndPoint = strBufRemain.indexOf(COMMON_INFO_END);
		}
		// 置換文字列より後ろの部分の文字列を結合する
		sb.append(strBufRemain);
		return sb.toString();
	}

	/**
	 * 共有フォームBeanより項目を取得します。(階層構造型)
	 * <br>
	 * @param arg0
	 * @param idx
	 * @return 項目
	 */
	private String getDataString(String tagTemplate, String arg0, int idx)
	{
		String str = null;
		try
		{
			str = getSFBeanData_String(tagTemplate, arg0, idx);
			if (str == null || "null".equals(str))
			{
				str = JFUStrConst.EMPTY;
			}
		}
		catch (Exception e)
		{
			str = JFUStrConst.EMPTY;
		}
		return str;
	}
}
