/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUIncludeFileEvent100
*   ソースファイルパス：JFUIncludeFileEvent100.java
*   作成者          ：富士通
*   日付            ：2015年04月13日
*＜機能概要＞
*   指定されたパスのファイルを読み込んでHTMLデータ内に書き出す拡張タグ用クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v14.00.00   2015/04/13   FJ)谷本     新規作成
*
**********************************************************************/

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 JFUIncludeFileSiteCatalyst extends X33VCustomTagBase
{

	/** 置換する開始位置を定義する記号 */
	private static final String REPLACE_START = "＜";

	/** 置換する終了位置を定義する記号 */
	private static final String REPLACE_END = "＞";

	/** pageName */
	private static final String PAGE_NAME = "pageName";

	/** eVar75 */
	private static final String EVAR_75 = "eVar75";

	/** taglibより渡されるキー */
	private String key = "";

	/** taglibより渡されるpageName */
	private String pageName = "";

	/** taglibより渡されるeVar75 */
	private String evar75 = "";

	/**
	 * キーを設定します。
	 * <br>
	 * @param arg0 キー
	 */
	public void setKey(String arg0)
	{
		this.key = arg0;
	}

	/** taglibより渡される出力フラグキー */
	private String outPutFlgKey = "";

	/**
	 * 出力フラグキーを設定します。
	 * <br>
	 * @param arg0 キー
	 */
	public void setOutPutFlgKey(String arg0)
	{
		this.outPutFlgKey = arg0;
	}

	/**
	 * ページ名を設定します。
	 * <br>
	 * @param arg0 キー
	 */
	public void setPageName(String arg0)
	{
		this.pageName = arg0;
	}

	/**
	 * eVar30を設定します。
	 * <br>
	 * @param arg0 キー
	 */
	public void setEvar75(String arg0)
	{
		this.evar75 = 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;
			}
		}

		// 置換文字列を設定
		HashMap<String, String> keyWordMap = new HashMap<String, String>();
		// ページ名
		keyWordMap.put(PAGE_NAME, pageName);
		// eVar75
		keyWordMap.put(EVAR_75, evar75);

		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(setReplaceData(str, keyWordMap));
				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 文字列
	 * @param keyWordMap キーワードマップ
	 * @return 文字列
	 */
	private String setReplaceData(String str, HashMap<String, String> keyWordMap)
	{
		// 戻り値用文字列
		StringBuffer sb = new StringBuffer();
		int separaterStartPoint = str.indexOf(REPLACE_START);
		int separaterEndPoint = str.indexOf(REPLACE_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);
			// 置換文字列を取得
			if (keyWordMap.containsKey(keyWordData))
			{
				keyWordData = keyWordMap.get(keyWordData);
			}
			// 置換後の文字列を戻り値用文字列に結合する
			sb.append(keyWordData);
			// 置換文字列より後ろの部分の文字列を切り出す
			strBufRemain = strBufRemain.substring(separaterEndPoint + 1);

			separaterStartPoint = strBufRemain.indexOf(REPLACE_START);
			separaterEndPoint = strBufRemain.indexOf(REPLACE_END);
		}
		// 置換文字列より後ろの部分の文字列を結合する
		sb.append(strBufRemain);
		return sb.toString();
	}

}
