/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：コード名称情報取得クラス
 *  ソースファイル名：JKKGetAdchgCdNameCC.java
 *  作成者          ：FJ
 *  日付            ：2011年11月24日
 *＜機能概要＞
 *  コード名称情報を取得するクラス
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2011/10/26  FJ          新規作成
 *
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgInitDspConstCC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import eo.ejb.cbs.cbsmsg.EZM0171B010CBSMsg1List;


/**
 * コード名称情報取得クラス.
 * <br>
 * @author FJ
 */
public class JKKAdchgGetCdNameCC {

	//--------------------------------------------------
	// ローカル変数
	//--------------------------------------------------
	/** コード名称マップ */
	private static HashMap<String, HashMap<String, Object>> cdNameMap = new HashMap<String, HashMap<String, Object>>();

	/** インスタンス生成時点の運用日付 */
	private static String creInsOpeDate = null;

	/** 唯一のインスタンス */
	private static JKKAdchgGetCdNameCC  myIns = null;


	/**
	 * コンストラクタ.
	 *   単一インスタンスにする為に非公開化
	 * <br>
	 */
	private JKKAdchgGetCdNameCC(){

		// 運用日付を取得し、ローカル変数に保持
		creInsOpeDate = JCCBPCommon.getOpeDate(null);
	}

	/**
	 * インスタンス取得.
	 * <br>
	 */
	public static JKKAdchgGetCdNameCC getInstance(){

		if( myIns == null ){
			myIns = new JKKAdchgGetCdNameCC();
		}

		return myIns;
	}

	/**
	 * リソース解放処理.
	 * <br>
	 */
	public synchronized void release(){

		// 運用日付を取得
		String opeDate = JCCBPCommon.getOpeDate(null);

		// ローカルに保持している運用日付と不一致であるかをチェック
		if(!opeDate.equals(creInsOpeDate)){
			// コード名称マップを再生成させる為にガベージさせる
			cdNameMap = new HashMap<String, HashMap<String, Object>>();
			// 運用日付をローカル変数に保持
			creInsOpeDate = opeDate;
		}
	}

	/**
	 * コード名称マップ取得処理
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Exception  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public synchronized HashMap<String, Object> getCdNameMap(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String cdSbtCdkey) throws Exception 
	{
		if(cdNameMap.isEmpty())
		{
			creaetCdNmMap(handle, param, fixedText);
		}
		
		HashMap<String, Object> childCdNameMap = cdNameMap.get(cdSbtCdkey);
		
		if(childCdNameMap == null)
		{
			childCdNameMap = new HashMap<String, Object>();
		}
		
		return childCdNameMap;
	}

	/**
	 * 住所変更申込一時保存一覧照会で取得したコードの名称を設定する
	 * <br>
	 * @param   param         モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   adchmTppvMap 住所変更申込一時保存一覧照会の結果
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Exception  例外が発生した場合
	 */
	private void creaetCdNmMap(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception 
	{
		HashMap<String, Object> requestMap = null;
		HashMap<String, String> condMap = new HashMap<String, String>();
		Map<?, ?> resultMap = null;
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		// 集合住宅入居階数コードのコード名マップを設定
		condMap.clear();
		condMap.put(JKKAdchgMapperCC.COND_KEY_CD_SBT_CD, JKKAdchgInitDspConstCC.CD_TYP_NYUKYO_FLR_CNT);
		requestMap = mapper.setEZM0171B010(param, fixedText, condMap);
		resultMap  = scCall.run( requestMap, handle );
		ArrayList<HashMap<String, Object>> zm0171a010List = mapper.getEZM0171B010( param, fixedText, resultMap );
		mapper.scResultCheck( param );
		setCdNmMap(JKKAdchgInitDspConstCC.CD_TYP_NYUKYO_FLR_CNT, zm0171a010List);
		// サービス契約ステータスのコード名マップを設定
		condMap.clear();
		condMap.put(JKKAdchgMapperCC.COND_KEY_CD_SBT_CD, JKKAdchgInitDspConstCC.CD_TYP_SVC_KEI_STAT);
		requestMap = mapper.setEZM0171B010(param, fixedText, condMap);
		resultMap  = scCall.run( requestMap, handle );
		zm0171a010List = mapper.getEZM0171B010( param, fixedText, resultMap );
		mapper.scResultCheck( param );
		setCdNmMap(JKKAdchgInitDspConstCC.CD_TYP_SVC_KEI_STAT, zm0171a010List);
		// 番ポ工事時間コードのコード名マップを設定
		condMap.clear();
		condMap.put(JKKAdchgMapperCC.COND_KEY_CD_SBT_CD, JKKAdchgInitDspConstCC.CD_TYP_BMP_KOJI_TIME);
		requestMap = mapper.setEZM0171B010(param, fixedText, condMap);
		resultMap  = scCall.run( requestMap, handle );
		zm0171a010List = mapper.getEZM0171B010( param, fixedText, resultMap );
		mapper.scResultCheck( param );
		setCdNmMap(JKKAdchgInitDspConstCC.CD_TYP_BMP_KOJI_TIME, zm0171a010List);
		// 機器提供種別コードのコード名マップを設定
		condMap.clear();
		condMap.put(JKKAdchgMapperCC.COND_KEY_CD_SBT_CD, JKKAdchgInitDspConstCC.CD_TYP_KKTK_SBT);
		requestMap = mapper.setEZM0171B010(param, fixedText, condMap);
		resultMap  = scCall.run( requestMap, handle );
		zm0171a010List = mapper.getEZM0171B010( param, fixedText, resultMap );
		mapper.scResultCheck( param );
		setCdNmMap(JKKAdchgInitDspConstCC.CD_TYP_KKTK_SBT, zm0171a010List);
// ●● 撤去タブの制御対応 START
		// 宅内機器種別コードのコード名マップを設定
		condMap.clear();
		condMap.put(JKKAdchgMapperCC.COND_KEY_CD_SBT_CD, JKKAdchgInitDspConstCC.CD_TN_KIKI_SBT);
		requestMap = mapper.setEZM0171B010(param, fixedText, condMap);
		resultMap  = scCall.run( requestMap, handle );
		zm0171a010List = mapper.getEZM0171B010( param, fixedText, resultMap );
		mapper.scResultCheck( param );
		setCdNmMap(JKKAdchgInitDspConstCC.CD_TN_KIKI_SBT, zm0171a010List);
// ●● 撤去タブの制御対応 START
	}
	
	/**
	 * EZM0171B010 コード名称管理一覧照会 .
	 * <br>
	 * @param   cdSbtCd         コード種別コード
	 * @param   zm0171a010Map   コード名称管理一覧照会結果
	 * @throws  Exception  例外が発生した場合
	 */
	@SuppressWarnings( "unchecked" )
	private void setCdNmMap(String cdSbtCd, ArrayList<HashMap<String, Object>> zm0171a010List) throws Exception {

		if(zm0171a010List != null)
		{
			
			if(zm0171a010List != null && 0 < zm0171a010List.size())
			{
				HashMap<String, Object> childMap = cdNameMap.get(cdSbtCd);
				if(childMap == null)
				{
					childMap = new HashMap<String, Object>();
					cdNameMap.put(cdSbtCd, childMap);
				}
				
				for(int i = 0; i < zm0171a010List.size() ; i++)
				{
					HashMap childZm0171a010 = (HashMap)zm0171a010List.get(i);
					// コード区分を取得
					String cdDiv = (String)childZm0171a010.get(EZM0171B010CBSMsg1List.CD_DIV);
					// コード区分名を取得
					String cdDivNm = (String)childZm0171a010.get(EZM0171B010CBSMsg1List.CD_DIV_NM);
					
					childMap.put(cdDiv, cdDivNm);
				}
			}
		}
	}
}
