/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUDispSettingCache
*   ソースファイル名：JFUDispSettingCache.java
*   作成者          ：富士通
*   日付            ：2011年06月02日
*＜機能概要＞
*   フロント用画面表示定義ファイル読み込み部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/06/02   FJ）和田    新規作成
*
**********************************************************************/
package eo.web.webview.common;

import java.util.Map;

import eo.common.constant.JFUStrConst;

/**
 * XML形式プロパティファイル読み込み抽象部品です。
 * <br>
 * @author 富士通
 */
public class JFUDispSettingCache extends JFUXMLPropertyCache
{

	/** インスタンス領域 */
	private static final JFUDispSettingCache SINGLETON_INSTANCE = new JFUDispSettingCache();

	/** 共通テキストノード */
	private static final String COMMON_DISPTEXT_PATH = "DISPSETTING/COMMONSETTING/DISPTEXT[@id='${textId}']/text()";

	/** 個別テキストノード */
	private static final String DISPTEXT_PATH = "DISPSETTING/SETTING[@screenId='${screenId}']/DISPTEXT[@id='${textId}']/text()";

	/** 共通テキストノード接頭語 */
	private static final String COMMON_DISPSETTING_PRE = "DISPSETTING/COMMONSETTING/";

	/** テキストノード取得接尾辞 */
	private static final String TEXT_SUFFIX = "text()";

	/**
	 * アプリケーションプロパティファイルから、定義ファイルのパスを取得しシングルトンでインスタンス化します。
	 */
	private JFUDispSettingCache()
	{
    	// アプリケーションプロパティファイルから定義ファイルのパスを取得
		String restFilePath = JCCWebCommon.getApplicationConst("FUDISP_SETTING_FILE_PATH");
		super.setFilePath(restFilePath);
	}

	/**
	 * シングルトンインスタンスを返却します。
	 * <br>
	 * @return JFUDispSettingCacheインスタンス
	 * @throws Exception 読込時に発生する例外
	 */
	public static JFUDispSettingCache getInstance() throws Exception
	{
		JFUDispSettingCache.SINGLETON_INSTANCE.loadProperties();

		return JFUDispSettingCache.SINGLETON_INSTANCE;
	}

	/**
	 * DISPTEXT要素のテキストを返却します。
	 * <br>
	 * @param screenId 画面ID
	 * @param textId TEXTID
	 * @return テキスト
	 * @throws Exception XML解析時に発生する例外
	 */
	public String getText(String screenId, String textId) throws Exception
	{
		String query = null;
		if (screenId == null || screenId.length() == 0)
		{
			query = COMMON_DISPTEXT_PATH.replace("${textId}", textId);
		}
		else
		{
			query = (DISPTEXT_PATH.replace("${screenId}", screenId)).replace("${textId}", textId);
			String item = super.getItem(query);
			if (!JFUWebCommon.isNull(item))
			{
				return item;
			}
			query = COMMON_DISPTEXT_PATH.replace("${textId}", textId);
		}

		return super.getItem(query);
	}

	/**
	 * 引数のクエリを使用し指定した要素を文字列として取得し返却します。
	 * <br>
	 * @param query クエリ
	 * @return アイテム
	 * @throws Exception XML解析時に発生する例外
	 */
	@Override
	public String getItem(String query) throws Exception
	{
		String result = super.getItem(query);
		if (JFUWebCommon.isNull(result))
		{
			String[] partsArray = query.split(JFUStrConst.SLASH);
			if (partsArray.length == 4)
			{
				result = super.getItem(COMMON_DISPSETTING_PRE + partsArray[2] + JFUStrConst.SLASH + TEXT_SUFFIX);
			}
		}
		return result;
	}

	/**
	 * 引数のクエリを使い取得したNodeListの属性値をキーに、要素をバリューとして保持したMapを返却します。
	 * <br>
	 * @param query クエリ
	 * @param attrName 属性名
	 * @return Mapオブジェクト
	 * @throws Exception XML解析時に発生する例外
	 */
	@Override
	public Map<String, String> getItemsAsMap(String query, String attrName) throws Exception
	{
		Map<String, String> resultMap = super.getItemsAsMap(query, attrName);
		if (resultMap == null || resultMap.size() == 0)
		{
			String[] partsArray = query.split(JFUStrConst.SLASH);
			if (partsArray.length == 3)
			{
				resultMap = super.getItemsAsMap(COMMON_DISPSETTING_PRE + partsArray[2], attrName);
			}
			else if (partsArray.length > 3)
			{
				StringBuilder rnktText = new StringBuilder();
				rnktText.append(partsArray[2]);
				for (int i = 3; i < partsArray.length; i++)
				{
					rnktText.append(JFUStrConst.SLASH);
					rnktText.append(partsArray[i]);
				}
				resultMap = super.getItemsAsMap(COMMON_DISPSETTING_PRE + rnktText, attrName);
			}
		}
		return resultMap;
	}
}
