/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCChohyoMaskCache
*   ソースファイル名：JCCChohyoMaskCache.java
*   作成者          ：富士通
*   日付            ：2011年07月13日
*＜機能概要＞
*   帳票マスキング定義ファイルキャッシュ部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/13    FST        新規作成
*
**********************************************************************/

package eo.common.util;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMPropertyCache;

public class JCCChohyoMaskCache extends JCMPropertyCache {

	/**
	 * 本クラスのシングルトンインスタンス
	 */
	private static JCCChohyoMaskCache prop = null;

	private static HashMap<Integer, ArrayList<String>> propMap = new HashMap<Integer, ArrayList<String>>();

	/**
	 * 帳票マスキング定義ファイルのパスを設定します。
	 * @param propPath     帳票マスキング定義ファイルのパス
	 * @param propEncord   帳票マスキング定義ファイルの文字コード
	 * @return             void
	 */
	public synchronized static void setPath(String propPath, String propEncord)
	{
		// 本クラスのインスタンス生成
		JCCChohyoMaskCache cmc = JCCChohyoMaskCache.getInstance();
		
		// プロパティファイルパス設定
		cmc.PATH = propPath;
		// プロパティファイル文字コード設定
		cmc.ENCODING = propEncord;
	}
	
	/**
	 * 本クラスのシングルトンインスタンスを取得します。
	 * 
	 * @return JCCChohyoMaskCache シングルトンインスタンス
	 */
	private static JCCChohyoMaskCache getInstance()
	{
		if (null == prop)
		{
			prop = new JCCChohyoMaskCache();
		}
		return prop;
	}

	/**
	 * 指定されたキーに対応する値を返却します。
	 * 
	 * @param  key        帳票マスキング定義ファイルのキー
	 * @return HashMap    定義ファイルの値Map
	 * @throws Exception
	 */
	public synchronized static HashMap<Integer, ArrayList<String>> getValue(String key)
	{
		try{
			/*************************
			/ 定義ファイル情報取得
			**************************/
			
			// 親クラスのgetValuePropメソッドを値を取得
			String value = JCCChohyoMaskCache.getInstance().getValueProp(key);
			
			// 値が設定されていない場合は空のHashMapを返却
			if (null == value || 0 == value.trim().length())
			{
				return new HashMap<Integer, ArrayList<String>>();
			}
			
			
			/*************************
			/ 定義情報をMapへ格納
			**************************/
			
			// 置換え文字、表示桁数格納用
			ArrayList<String> alMask;
			
			// 取得したプロパティ値をカンマで分割
			// (=カラムごとのマスク情報へ分割)
			String[] column = value.split(",");
			
			// チェック用
			int chk = 0;
			
			// マスク指定されたカラム数分ループ
			for(int i=0; i < column.length; i++){
				alMask = new ArrayList<String>(2);
				
				/*************************
				/ カラム単位に分割
				**************************/
				
				// 1カラム分のマスク情報をセミコロンで分割
				// (=[カラム番号]、[置換え文字＋表示桁数]へ分割)
				String[] element = column[i].split(";");
				
				try{
					// カラム番号の数値形式チェック
					chk = Integer.parseInt(element[0]);
				}catch(NumberFormatException ne){
					throw new JCCFrameworkException(
							"カラム番号に数値でない値が設定されています。" +
							"（カラム:" + (i+1) + "番目）", ne);
				}
				// 要素数の過不足の場合
				if(2 != element.length){
					throw new JCCFrameworkException(
							"定義形式が不正です。カラム番号＋置き換え文字を１組と" +
							"して設定してください。（カラム:" + (i+1) + "番目）");
				}
				
				
				/*************************
				/ 置換え文字の分割
				**************************/
				
				// 置換え文字＋表示桁数を"%"で分割
				String[] maskInfo = element[1].split("%");
				
				// 要素数オーバーの場合
				if(2 < maskInfo.length){
					throw new JCCFrameworkException(
							"置き換え文字の定義形式が不正です。置換え文字＋" +
							"[表示桁数]を設定してください。（[]=オプション）" +
							"（カラム:" + (i+1) + "番目）");
				}
				try{
					// 表示桁数が設定されている場合
					if(2 == maskInfo.length){
						// 表示桁数の数値形式チェック
						chk = Integer.parseInt(maskInfo[1]);
					}
				}catch(NumberFormatException ne){
					throw new JCCFrameworkException(
							"表示形式に数値でない値が設定されています。" +
							"（カラム:" + (i+1) + "番目）", ne);
				}
				
				// 表示桁数設定無し
				if(1 == maskInfo.length){
					// 置換え文字追加
					alMask.add(maskInfo[0]);
					// 表示桁数は"0"固定
					alMask.add("0");
				}
				// 表示桁数設定有り
				else if(2 == maskInfo.length){
					// 置換え文字追加
					alMask.add(maskInfo[0]);
					// 表示桁数追加
					alMask.add(maskInfo[1]);
				}
				// 帳票マスキング定義ファイル情報設定
				propMap.put(Integer.parseInt(element[0]), (ArrayList<String>)alMask);
			}
			// 取得値を返却
			return propMap;
		}
		catch(Exception e){
			throw new JCCFrameworkException(e.getMessage());
		}
	}
}
