/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCWorkRestrictionCache
*   ソースファイル名：JCCWorkRestrictionCache.java
*   作成者          ：富士通
*   日付            ：2011年05月07日
*＜機能概要＞
*   規制定義ファイルキャッシュ部品です
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/05/07   FJ          新規作成
*
**********************************************************************/

package eo.web.webview.common;

import java.util.HashMap;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.ArrayList;

import com.fujitsu.futurity.common.JCMPropertyCache;

import eo.web.webview.common.JCCWebCommon;


/**
 * 規制定義ファイルの読み込みを行うクラス。<p>
 * <BR>
 * @author 富士通
 */
public class JCCWorkRestrictionCache extends JCMPropertyCache
{

	/** 機能モード 0:オンライン(デフォルト値) 1:API 2:サービス */
	public short funcMode = FUNC_MODE_ONLINE;
	
	/** 機能モード 0:オンライン */
	public static final short FUNC_MODE_ONLINE = 0;
	
	/** 機能モード 1:API */
	public static final short FUNC_MODE_API = 1;
	
	///** 機能モード 2:サービス */
	//public static final short FUNC_MODE_SERVICE = 2;
	
	/** 文字列の区切り文字(キー分割用) */
	public static final String KEY_DELIMITERS = ";";
	
	/** 文字列の区切り文字(値分割用) */
	public static final String VAL_DELIMITERS = ",";

	/** オンラインキー項目数(画面ID;イベントID;イベント番号) */
	public static final short KEY_LIST_COUNT_ONLINE = 3;

	/** 規制定義ファイル情報マップ(オンライン用)
	 *  キー:画面ID
	 *  値:定義ファイルのキー、値がセットになって格納されているマップ
	 */
	protected HashMap<String, Object> convMapConst = null;
	
	/** 規制定義ファイル情報マップ(上位クラスのマップバックアップ用) */
	protected HashMap<String, Object> backMapConst = null;
	
	/** インスタンス領域 */
	private static ArrayList<JCCWorkRestrictionCache> instanceList = null;
	

	/**
	 * アプリケーションプロパティファイルから、規制定義ファイルのパス
	 * 及び文字エンコード種別を取得し、シングルトンでインスタンス化します。
	 * <br>
	 * @param
	 * @return なし
	 */	
	public synchronized static void setPath(short funcMode)
	{
		String restFilePath = null;
		String restFileEncode = null;
		//-------------------------------------------------------------------------------------------
		//アプリケーションプロパティファイルから規制定義ファイルのパスと文字エンコード種別を取得
		//-------------------------------------------------------------------------------------------
		// インスタンスリスト取得
		ArrayList<JCCWorkRestrictionCache> instanceList = JCCWorkRestrictionCache.getInstanceList();

		// オンライン用
		restFilePath = JCCWebCommon.getApplicationConst("WORKRESTRICTION_FILE_PATH");
		restFileEncode = JCCWebCommon.getApplicationConst("WORKRESTRICTION_FILE_ENCODING");
		instanceList.get(0).PATH = restFilePath;
		instanceList.get(0).ENCODING = restFileEncode;
		instanceList.get(0).funcMode = FUNC_MODE_ONLINE;

		// API用
		//restFilePath = JCCWebCommon.getApplicationConst("WORKRESTRICTION_API_FILE_PATH");
		//restFileEncode = JCCWebCommon.getApplicationConst("WORKRESTRICTION_API_FILE_ENCODING");
		//instanceList.get(1).PATH = restFilePath;
		//instanceList.get(1).ENCODING = restFileEncode;
		//instanceList.get(1).funcMode = FUNC_MODE_API;

		// サービス用 サービスはJCCModelCommon
		//restFilePath = JCCWebCommon.getApplicationConst("WORKRESTRICTION_SERVICE_FILE_PATH");
		//restFileEncode = JCCWebCommon.getApplicationConst("WORKRESTRICTION_SERVICE_FILE_ENCODING");
		//instanceList.get(2).PATH = restFilePath;
		//instanceList.get(2).ENCODING = restFileEncode;
		//instanceList.get(2).funcMode = FUNC_MODE_SERVICE;
	}

	/**
	 * インスタンスリスト生成メソッド
	 * <br>
	 * @param
	 * @return prop
	 */	
	private static ArrayList<JCCWorkRestrictionCache> getInstanceList()
	{
		if(null == instanceList)
		{
			instanceList = new ArrayList<JCCWorkRestrictionCache>();
			JCCWorkRestrictionCache ins1 = new JCCWorkRestrictionCache();
			//JCCWorkRestrictionCache ins2 = new JCCWorkRestrictionCache();
			// オンライン用
			instanceList.add(ins1);
			// API用
			//instanceList.add(ins2);
			// サービス用
			//instanceList.add(new JCCWorkRestrictionCache());
		}
		
		return instanceList;
	}
	
	/**
	 * キーで指定された規制定義ファイル情報を取得します。
	 * <br>
	 * @param funcMode 機能モード
	 * @param key 定義ファイル設定値に対応するキー
	 * @return キーに紐付けられた定義ファイル内の設定値
	 * @throws Exception
	 */	
	public synchronized static String getValue(short funcMode, String key) throws Exception
	{
		short index = 0;
		switch(funcMode)
		{
	//		case FUNC_MODE_API:
	//			index = 1;
	//			break;
	//		case FUNC_MODE_SERVICE:
	//			index = 2;
	//			break;
			case FUNC_MODE_ONLINE:
			default:
				index = 0;
				break;
		}
		//親クラスのgetValuePropメソッドを呼び出して返却
		return JCCWorkRestrictionCache.getInstanceList().get(index).getValueProp(key);
	}

	/**
	 * 規制定義ファイル情報について画面IDをキーとした格納マップを取得します。(オンライン向け)
	 * <br>
	 * @param key 取得対象の画面ID
	 * @return 規制定義情報マップ
	 * @throws Exception
	 */	
	public synchronized static HashMap<String, String> getMap(String key) throws Exception
	{
		return (HashMap<String, String>)JCCWorkRestrictionCache.getInstanceList().get(0).getValueMap(key);
	}

	/**
	 * 指定されたキーを持つ値をマップで返します。(オンライン向け)<br>
	 * @param key キー
	 * @return 値。指定値が無ければnull。
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	protected synchronized HashMap<String, String> getValueMap(String key) throws Exception
	{
		this.onlineLoadProperties();
		
		return (HashMap<String, String>)convMapConst.get(key);
	}
	
	/**
	 * プロパティファイルの読み込みを行います。<br>
	 * 読み込んだファイルは画面IDをキーとしてMapに格納します。(オンライン用)<br>
	 * <br>
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	protected void onlineLoadProperties() throws Exception
	{
		super.loadProperties();
		// 規制定義ファイルのマップ情報のバックアップ(参照比較)
		if (this.backMapConst == super.mapConst) {
			return;
		}
		// 規制定義ファイルのマップ参照値が変更されているので更新あり
		this.backMapConst = super.mapConst;
		convMapConst = new HashMap<String, Object>();
		StringTokenizer stKeyToken = null;
		Iterator<String> itr = super.mapConst.keySet().iterator();
		
		while (itr.hasNext())
		{
			//---------------------------------------
			// キーの分割
			//---------------------------------------
			// 規制定義情報のキー取得
			String key = (String)itr.next();
// 2012/02/15 イベント番号がブランクの場合を考慮 start
			String[] keySplit = key.split(KEY_DELIMITERS);
			if(keySplit.length != 3){
				continue;
			}
//			stKeyToken = new StringTokenizer(key, KEY_DELIMITERS);
//			if (stKeyToken.countTokens() != KEY_LIST_COUNT_ONLINE)
//			{
//				continue;
//			}

			//---------------------------------------
			// 画面IDをキーとしたマップへの値設定
			//---------------------------------------
			// 画面ID取得
			String key1 = keySplit[0];
// 2012/02/15 イベント番号がブランクの場合を考慮 end
			//String key1 = stKeyToken.nextToken();
			// 値取得
			String value = (String)mapConst.get(key);
			// マップに存在しなければ画面IDをキーとした新規マップ生成、追加
			if (!convMapConst.containsKey(key1))
			{	
				HashMap<String, String> map = new HashMap<String, String>();
				map.put(key, value);
				convMapConst.put(key1, map);
			}
			else
			{
				// 存在する場合ば画面IDをキーとしたマップに追加
				HashMap<String, String> map = (HashMap<String, String>)convMapConst.get(key1);
				map.put(key, value);
			}	
		}
	}	
}
