/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUFrontIncludeHtml
*   ソースファイル名：JFUFrontIncludeHtml.java
*   作成者          ：富士通
*   日付            ：2015年04月01日
*＜機能概要＞30
*   フロントの共有フッター部表示用拡張タグクラスです
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v14.00.00    2015/04/30   FJ          新規作成
*   v47.00.00    2019/09/27   FJ)大島     ANK-3715-00-00_提供条件リリース対応
*
**********************************************************************/

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.Arrays;
import java.util.List;

import javax.servlet.jsp.JspException;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x33.X33VCustomTagBase;

import eo.common.constant.JFUStrConst;

/**
 * フロントの提供条件表示用拡張タグクラス
 * @author 富士通
 *
 */
@SuppressWarnings("serial")
public class JFUFrontIncludeHtml extends X33VCustomTagBase {

	/** フロント共有フォームビーンのテンプレートID */
	private static final String TEMPLATE_ID = "TagTemplate001";
	
	/** フロント共有フォームビーンのフロント区分の項目ID */
	private static final String FRONT_KBN = "FU_KBN";
	
	/** プロパティファイルのフロント区分の項目ID */
	private static final String APL_CONST_DEFAULT_FRONT_KBN = "DEFAULT_FRONT_KBN";
	
	/** プロパティファイルの項目IDの接尾辞("_FILE_PATH") */
	private static final String APL_CONST_SUFFIX_FILE_PATH = "_FILE_PATH";
	
	/** HTML拡張子 */
	private static final String EXTENSION_HTML = ".html";

	/** screenId属性 */
	private String screenId = "";
	
	/** パターン属性 */
	private String pattern = "";

	/** タイプ属性 */
	private String type = "";
	
	/** タイプ属性：head */
	private static final String TYPE_HEAD = "head";
	
	/** タイプ属性：body */
	private static final String TYPE_BODY = "body";
	
	/** タイプ属性リスト */
	private static final List<String> TYPES = Arrays.asList(TYPE_HEAD, TYPE_BODY);

	/** 削除対象文字：雛形 */
	private static final String KEY_WORD_STR_TEMPLATE = "<!--// ◆雛型◆ //-->";
	/** 削除対象文字：予約 */
	private static final String KEY_WORD_STR_RESV = "<!--// ◆予約◆ //-->";
	/**  削除対象文字リスト */
	private static final List<String> REMOVE_STR_LIST = Arrays.asList(KEY_WORD_STR_TEMPLATE, KEY_WORD_STR_RESV);
	
	/** インクルード項目タグ（head）：開始タグ */
	private static final String INCLUDE_HEAD_CONTENTS_TAG_START = "<includeHeadContents>";
	
	/** インクルード項目タグ（head）：終了タグ */
	private static final String INCLUDE_HEAD_CONTENTS_TAG_END = "</includeHeadContents>";
	
	/** インクルード項目タグ（body）：開始タグ */
	private static final String INCLUDE_BODY_CONTENTS_TAG_START = "<includeBodyContents>";
	
	/** インクルード項目タグ（body）：終了タグ */
	private static final String INCLUDE_BODY_CONTENTS_TAG_END = "</includeBodyContents>";
	
	/** 空文字 */
	public static final String EMPTY = "";
// ANK-3715-00-00 ADD START
	/** フロント共有フォームビーンのフロント区分の項目ID */
	private static final String FU_OPEDATE = "FU_OPEDATE";
	
	/** ファイル名接続詞 */
	private static final String FILENAME_NEW = "_new";
// ANK-3715-00-00 ADD END
	/**
	 * フロントの共通ヘッダー領域の生成を行う。
	 */
	@Override
	public int doStartTag() throws JspException
	{
		
		// パターンに含まれていない場合はタグを作成しない
		if (!TYPES.contains(type))
		{
			return SKIP_BODY;
		}
		
		StringWriter sw = null;
		FileReader fr = null;
		BufferedReader br = null;
		try {
			String path = getPathString();
			
			File file = new File(path);
			sw = new StringWriter(new Long(file.length()).intValue());
			fr = new FileReader(file);
			br = new BufferedReader(fr);
			
			boolean outFlg = false;
			String str = null;
			while ((str = br.readLine()) != null)
			{
				// タイプ属性で分岐
				if (TYPE_HEAD.equals(type)) {
					// ヘッドの場合
					
					// 開始タグの場合
					if (str.indexOf(INCLUDE_HEAD_CONTENTS_TAG_START) >= 0 && str.indexOf(KEY_WORD_STR_TEMPLATE) >= 0) {
						outFlg = true;
						continue;
					}
					
					// 終了タグの場合
					if (str.indexOf(INCLUDE_HEAD_CONTENTS_TAG_END) >= 0 && str.indexOf(KEY_WORD_STR_TEMPLATE) >= 0) {
						outFlg = false;
					}
					
				} else {
					// ボディの場合
					
					// 開始タグの場合
					if (str.indexOf(INCLUDE_BODY_CONTENTS_TAG_START) >= 0 && str.indexOf(KEY_WORD_STR_TEMPLATE) >= 0) {
						outFlg = true;
						continue;
					}
					
					// 終了タグの場合
					if (str.indexOf(INCLUDE_BODY_CONTENTS_TAG_END) >= 0 && str.indexOf(KEY_WORD_STR_TEMPLATE) >= 0) {
						outFlg = false;
					}
				}
				
				if (outFlg) {
					
					// 削除対象文字列を空文字で置換
					for (String removeStr : REMOVE_STR_LIST) {
						str = str.replace(removeStr, JFUStrConst.EMPTY);
					}
					
					// 改行コード付きで返却
					StringBuffer sb = new StringBuffer();
					sb.append(str);
					sb.append(JFUStrConst.RETURN_CODE);
					sw.write(sb.toString());
				}
				
			}
			
			outputHtml(sw.getBuffer().toString());
		} catch (FileNotFoundException e) {
			JSYwebLog.println(JSYwebLog.ERROR, getClass(), e, null, null, null);
			return SKIP_BODY;
		} catch (Exception e) {
			JSYwebLog.println(JSYwebLog.ERROR, getClass(), e, null, null, null);
			throw new JspException();
		}
		finally
		{
			try
			{
				if(sw != null)
				{
					sw.close();
				}
				if(fr != null)
				{
					fr.close();
				}
				if(br != null)
				{
					br.close();
				}
			}
			catch(IOException e)
			{
				JSYwebLog.println(JSYwebLog.ERROR, getClass(), e, null, null, null);
				throw new JspException();
			}
		}
		return SKIP_BODY;
	}
	
	/**
	 * 前後の空白部分を除去し、"/"終わりでない場合"/"を付けた形でpathを生成し返却する。
	 * @param frontKbn フロント区分
	 * @return 処理後のパス
	 */
	private String getPath(String frontKbn)
	{
		String path = JCCWebCommon.getApplicationConst(frontKbn + APL_CONST_SUFFIX_FILE_PATH);
		if (! path.substring(path.length() - 1).equals(JFUStrConst.SLASH))
		{
			return path + JFUStrConst.SLASH;
		}
		
		return path;
	}
	
	/**
	 * 画面IDを設定します。
	 * <br>
	 * @param arg0 画面ID
	 */
	public void setScreenId(String arg0)
	{
		this.screenId = arg0;
	}
	
	/**
	 * パターンを設定します。
	 * <br>
	 * @param arg0 パターン
	 */
	public void setPattern(String arg0)
	{
		this.pattern = arg0;
	}
	
	/**
	 * タイプを設定します。
	 * <br>
	 * @param arg0 タイプ
	 */
	public void setType(String arg0)
	{
		this.type = arg0;
	}


	/**
	 * APLConstに設定されているファイル名をパス付で取得するメソッド
	 * @return APLConstに設定されているパス+ファイル名の文字列
	 * @throws JspException JSP例外
	 */
	private String getPathString() throws JspException
	{
		
		String frontKbn = null;
		try{
			// フロント区分取得
			frontKbn = getSFBeanData_String(TEMPLATE_ID, FRONT_KBN);
			
		}catch(Exception e){
			frontKbn = JCCWebCommon.getApplicationConst(APL_CONST_DEFAULT_FRONT_KBN);
		}
		if (frontKbn == null || JFUStrConst.EMPTY.equals(frontKbn))
		{
			frontKbn = JCCWebCommon.getApplicationConst(APL_CONST_DEFAULT_FRONT_KBN);
		}

		
		// パス取得用
		String path = getPath(frontKbn);

		
		StringBuffer sbFilePath = new StringBuffer();
		sbFilePath.append(path);
		sbFilePath.append(screenId);
		sbFilePath.append(JFUStrConst.HALF_UNDER_BAR);
		sbFilePath.append(pattern);
// ANK-3715-00-00 ADD START
		// 切替日の取得
		String chgDate = JFUStrConst.EMPTY;
		try {
			JFUDispSettingExtraCache dispExtraProp = JFUDispSettingExtraCache.getInstance();
			chgDate = dispExtraProp.getDispChangeDate();
		} catch (Exception e) {
			// 取得できない場合は無視
			chgDate = JFUStrConst.EMPTY;
		}
		if (!JFUWebCommon.isNull(chgDate))
		{
			// 運用日付取得
			String opeDate = getSFBeanData_String(TEMPLATE_ID, FU_OPEDATE);
			// 切替日が運用日以降の場合は、ファイル名の末尾に「_new」をつける
			if (chgDate.length() == 8 && chgDate.matches("^[0-9]+$") && Integer.parseInt(opeDate) >= Integer.parseInt(chgDate))
			{
				sbFilePath.append(FILENAME_NEW);
			}
		}
// ANK-3715-00-00 ADD END
		sbFilePath.append(EXTENSION_HTML);
		
		return sbFilePath.toString();
	}
	
}
