/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUTabletDifinitionCache
*   ソースファイル名：JFUTabletDifinitionCache.java
*   作成者          ：富士通
*   日付            ：2019年04月24日
*＜機能概要＞
*   フロント用タブレット情報定義ファイル読み込み部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v42.00.00   2019/04/24   FJ）大島    新規作成
*
**********************************************************************/
package eo.web.webview.common;

import java.io.File;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import eo.common.constant.JFUStrConst;

/**
 * XML形式プロパティファイル読み込み抽象部品です。
 * <br>
 * @author 富士通
 */
public class JFUTabletDifinitionCache extends JFUXMLPropertyCache
{

	/** インスタンス領域 */
	private static final JFUTabletDifinitionCache SINGLETON_INSTANCE = new JFUTabletDifinitionCache();

	/** 共通テキストノード接頭語 */
	private static final String COMMON_DISPSETTING_PRE = "DISPSETTING/COMMONSETTING/";

	/** テキストノード取得接尾辞 */
	private static final String TEXT_SUFFIX = "text()";

	/** アプリケーションプロパティファイルの定義ファイルのパスの項目ID */
	private static final String APL_CONST_FUTABLET_SETTING_FILE_PATH = "FUTABLET_SETTING_FILE_PATH";
	
	/**
	 * アプリケーションプロパティファイルから、定義ファイルのパスを取得しシングルトンでインスタンス化します。
	 */
	private JFUTabletDifinitionCache()
	{
    	// アプリケーションプロパティファイルから定義ファイルのパスを取得
		String restFilePath = JCCWebCommon.getApplicationConst(APL_CONST_FUTABLET_SETTING_FILE_PATH);
		super.setFilePath(restFilePath);
	}

	/**
	 * シングルトンインスタンスを返却します。
	 * <br>
	 * @return JFUTabletDifinitionCacheインスタンス
	 * @throws Exception 読込時に発生する例外
	 */
	public static JFUTabletDifinitionCache getInstance() throws Exception
	{
		JFUTabletDifinitionCache.SINGLETON_INSTANCE.loadProperties();

		return JFUTabletDifinitionCache.SINGLETON_INSTANCE;
	}

	/**
	 * 引数のクエリを使用し指定した要素を文字列として取得し返却します。
	 * <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);
			StringBuilder sb = new StringBuilder();
			sb = sb.append(COMMON_DISPSETTING_PRE);
			for (int i = 1; i < partsArray.length; i++) {
				if (i >= 2) {
					sb.append( partsArray[i]).append(JFUStrConst.SLASH);
				}
			}
			sb.append(TEXT_SUFFIX);
			result = super.getItem(sb.toString());
		}
		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);
			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;
	}
	
	
	public NodeList getItemAsNodeList(String query) throws Exception
	{
		NodeList list = super.getItemAsNodeList(query);
		return list;
	}
}
