/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCBusinessControlStatus
*   ソースファイル名：JCCBusinessControlStatus.java
*   作成者          ：富士通
*   日付            ：2011年05月07日
*＜機能概要＞
*  セッションに登録された業務規制一覧情報と規制定義ファイルを突き合わせ、規制状態を設定する機能を提供する。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*
**********************************************************************/

package eo.web.webview.common;

import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
import java.util.StringTokenizer;
import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.util.JCCFrameworkException;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;


public class JCCBusinessControlStatus
{
	/** 汎用フラグオン */
	public static final String FLG_ON = "1";

	/** ブランク文字　*/
	private static final String STR_BLANK = "";

	
	/**
	 * セッションに登録された業務規制一覧情報と業務規制定義ファイルを突き合わせ、 <br>
	 * 業務規制状態を共有Beanに設定する。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	public void setBusinessControl(X31BWebBusinessLogic vl) throws JCCFrameworkException
	{
		String gamenId = null;								// 画面ID
		boolean kiseiUmuFlg = false;						// 規制有無フラグ
		HashMap<String, Object> lstMap = null;				// 検索結果格納用マップ
		HashMap<String, String> teigiMap = null;			// 規制定義ファイルの情報マップ(画面IDで絞込み)
		StringTokenizer stKeyToken = null;					// キー分割
		try {
		
			//---------------------------------------
			// 入力パラメータチェック
			//---------------------------------------
			checkInputpParameter(vl);
			
// 2011/09/05 リクエスト業務規制リストの削除を行う
			crearRequestRestriction(vl);
// 2011/09/05 リクエスト業務規制リストの削除を行う

			//---------------------------------------
			// 業務規制一覧情報取得
			//---------------------------------------
			lstMap = getRestrictionList(vl);
			if (0 == lstMap.size())
			{	
				return;
			}

			//---------------------------------------
			// 規制定義ファイルキャッシュ情報取得
			//---------------------------------------
			// キー情報取得
// 2012/04/04 FST)arata 画面IDの取得方法変更 start
			gamenId = vl.getCommonInfoBean().sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);
			if(gamenId == null || "".equals(gamenId))
			{
				gamenId = vl.getGamenId();
			}
			else
			{
				if(gamenId.indexOf("0PJP") == -1)
				{
					gamenId = gamenId + "0PJP";
				}
			}
			//gamenId = vl.getGamenId();
// 2012/04/04 FST)arata 画面IDの取得方法変更 end
			// 規制定義情報マップ取得
			teigiMap = (HashMap<String, String>)getCacheValue(gamenId);
			if (null == teigiMap || 0 == teigiMap.size())
			{	
				return;
			}

			//---------------------------------------
			// 画面IDと一致するキーを探して、
			// イベントID、イベント番号、規制コードリストを取得。
			// 業務規制されているか判定する。
			// 業務規制されていれば画面へメッセージを返す。
			//---------------------------------------
			// 規制定義ファイルの情報を読み、キー数分繰り返し
// 2011/09/05 順序順とイベント番号が等しければ、業務規制判定を行う。 start
			for(int i = 0 ; i < teigiMap.size() ; i++){
// 2011/09/05 順序順とイベント番号が等しければ、業務規制判定を行う。 end
				Iterator<String> itr = teigiMap.keySet().iterator();
				while (itr.hasNext())
				{
					//---------------------------------------
					// キーの分割
					//---------------------------------------
					// 規制定義情報のキー取得
					String key = (String)itr.next();
// 2012/02/15 イベント番号がブランクの場合を考慮 start
					String[] keySplit = key.split(JCCWorkRestrictionCache.KEY_DELIMITERS);
					//stKeyToken = new StringTokenizer(key, JCCWorkRestrictionCache.KEY_DELIMITERS);
					// キャッシュ部品でチェックしているためtreeTeigiMapにはキー項目数のデータしかないためチェック不要
	//				if (stKeyToken.countTokens() != KEY_LIST_COUNT) {
	//					continue;
	//				}
					
					// 画面ID
					//stKeyToken.nextToken();
					// イベントID取得
					String key2 = keySplit[1];
					//String key2 = stKeyToken.nextToken();
					// イベント番号取得
					String key3 = keySplit[2];
					//String key3 = stKeyToken.nextToken();
// 2012/02/15 イベント番号がブランクの場合を考慮 end
					// 規制コードリスト取得
					String value = (String)teigiMap.get(key);
	
// 2011/09/05 順序順とイベント番号が等しければ、業務規制判定を行う。 start
					if(Integer.parseInt(key3) == i){
						//---------------------------------------
						// 規制状態判定
						//---------------------------------------
						kiseiUmuFlg = judgeStatus(vl, lstMap, value);
						// 規制ありの場合、イベントID、イベント番号を共有フォームBeanに設定する。
						if (kiseiUmuFlg)
						{
							setStatus(vl, key2, key3);
// 2011/09/05 業務規制なしの場合は明示的にイベント番号に"NG"を付与する start
						}else{
							setStatus(vl, key2, "NG");
						}
						break;
// 2011/09/05 業務規制なしの場合は明示的にイベント番号に"NG"を付与する end
					}
// 2011/09/05 順序順とイベント番号が等しければ、業務規制判定を行う。 end
				}
			}
		} 
		finally
		{
			//--------------------------------	 
			// セッション情報クリア処理
			//--------------------------------	 
			//crearSessionObject(vl);
			
			lstMap = null;
			teigiMap = null;
			stKeyToken = null;
			
		}

	}
	

	/**
	 * 入力パラメータチェックをする処理です。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	private void checkInputpParameter(X31BWebBusinessLogic vl) throws JCCFrameworkException
	{
	    if (null == vl)
	    {
			throw new JCCFrameworkException("VIEWロジックインスタンスが設定されていません。");
		}
	}

	/**
	 * 画面IDをキーに規制定義ファイルキャッシュされたマップ情報を取得します。
	 * <br>
	 * @param gamenID 画面I
	 * @return 規制定義ファイルマップ情報(オンライン用)
	 * @exception JCCFrameworkExceptionがスローされます。
	 */
	private Map<String, String> getCacheValue(String gamenId) throws JCCFrameworkException
	{
		try
	    {
			// 規制定義情報マップ値
			Map<String, String> map = null;
			// 規制定義ファイルキャッシュ情報パス設定
			// JCCRestrictionPropertyCache.setPath(JCCRestrictionPropertyCache.FUNC_MODE_ONLINE);
			// 規制定義ファイル情報変換後マップ取得
			map = JCCWorkRestrictionCache.getMap(gamenId);
			return map;
		}
	    catch (Exception e)
	    {
			throw new JCCFrameworkException("規制定義ファイルキャッシュ情報の取得に失敗しました。", e);
		}
	}


	/**
	 * 業務規制一覧情報を取得します。<br>
	 * セッションより業務規制一覧情報の検索結果格納用マップを取得する。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @return 業務規制検索結果格納マップ
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> getRestrictionList(X31BWebBusinessLogic vl) throws JCCFrameworkException
	{
		
		HashMap<String,  Object> slstMap = null;		// セッション格納マップ
		HashMap<String,  Object> lstMap = null;			// 検索結果格納用マップ
		try
		{
			// セッションより業務規制一覧情報の検索結果格納用マップを取得する。
			slstMap = (HashMap<String, Object>)vl.getSessionObject(JCCBusinessControl.KEY_SESSION);
			if (null == slstMap) {
				return  new HashMap<String, Object>();
			}
			lstMap = (HashMap<String, Object>)slstMap.get(true);
			return lstMap;
		}	
		finally
		{
			slstMap = null;
		}	
	}

	/**
	 * 規制状態判定をして規制状態であればメッセージを共有フォームBeanに設定します。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @param map 格納対象マップ
	 * @param kiseiCdLst 規制コードリスト
	 * @return 規制状態有無 true:規制あり false:規制なし
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	private boolean judgeStatus(X31BWebBusinessLogic vl, Map<String, Object> lstMap, String kiseiCdLst) throws JCCFrameworkException
	{
		StringTokenizer stToken = null;				// 業務規制コード分割
		HashMap<String, String> recMap = null;		// 業務規制一覧レコード情報
		boolean kiseiUmuFlg = false;				// 規制有無フラグ
		try
		{
			//--------------------------------	 
			// 業務規制コードリストチェック
			//--------------------------------	 
			// 業務規制コード設定なし
			if (null == kiseiCdLst || STR_BLANK.equals(kiseiCdLst.trim())) 
			{
				// 規制状態有無フラグ
				return kiseiUmuFlg;
			}
			
			//--------------------------------	 
			// 業務規制コード判定(繰り返し)
			//--------------------------------	 
			// 業務規制コード分割
			stToken = new StringTokenizer(kiseiCdLst, JCCWorkRestrictionCache.VAL_DELIMITERS);
	
			while(stToken.hasMoreTokens())
			{
				// 業務規制コード取得
				String target = stToken.nextToken();
	
				// 検索結果格納用マップの業務規制一覧情報より業務規制コードの情報(マップ)を取得する
				if (!lstMap.containsKey(target))
				{
					continue;
				}
				recMap = (HashMap<String, String>)lstMap.get(target);
				// 業務規制コードの規制フラグを取得する。
				String kiseiFlg = recMap.get(JCCBusinessControl.KEY_KISEI_FLG);
				if (null == kiseiFlg || STR_BLANK.equals(kiseiFlg.trim()))
				{
					continue;
				}
	
				// 規制フラグ = 1(規制中)の場合
				if (FLG_ON.equals(kiseiFlg))
				{
					kiseiUmuFlg = true;
					break;
				}
			}
			// 規制状態有無フラグ
			return kiseiUmuFlg;
		}	
		finally
		{
			stToken = null;
			recMap = null;
		}	
	}

	/**
	 * 規制状態を共有フォームBeanに設定します。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @param eventId イベントID
	 * @param eventNum イベント番号
	 */
	private void setStatus(X31BWebBusinessLogic vl, String eventId, String eventNum)
	{
		// 共有フォームBeanを取得する。
		X31SDataBeanAccess commonbean = null;
		// 共有フォームBeanからREQUEST_RESTRICTION_LISTデータタイプBeanを取得する。
		X31SDataBeanAccessArray commonBeanArray = null;
		// データを追加する。
		X31SDataBeanAccess commonSubbean = null;
		try
		{
			// 共有フォームBeanを取得する。
			commonbean = vl.getCommonInfoBean();
			// 共有フォームBeanからREQUEST_RESTRICTION_LISTデータタイプBeanを取得する。
			commonBeanArray = commonbean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);
			// データを追加する。
			commonSubbean = commonBeanArray.addDataBean();
			commonSubbean.sendMessageString(CommonInfoCFConst.REQUEST_RESTRICTION_04, X31CWebConst.DATABEAN_SET_VALUE, eventId);
			commonSubbean.sendMessageString(CommonInfoCFConst.REQUEST_RESTRICTION_FLG_04, X31CWebConst.DATABEAN_SET_VALUE, eventNum);
		}
		finally
		{
			commonbean = null;
			commonBeanArray = null;
			commonSubbean = null;
		}	
	}

	/**
	 * セッション情報クリア処理。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 */
	@SuppressWarnings("unchecked")
	private void crearSessionObject(X31BWebBusinessLogic vl)
	{
		HashMap<String, Object> sessionObj = null;
		try
		{
			sessionObj = (HashMap<String, Object>)vl.getSessionObject(JCCBusinessControl.KEY_SESSION);
			 // セッション情報クリアを行う。
			if (null != sessionObj) {
				sessionObj.clear();
			} 
		}
		finally
		{
			sessionObj = null;
		}	
	}
	
	/**
	 * 共有フォームBeanクリア処理<BR>
	 * 共有フォームBeanより リクエスト業務規制リストをクリアします。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 */
	private void crearRequestRestriction(X31BWebBusinessLogic vl)
	{
		
		X31SDataBeanAccess commonbean = null;
		X31SDataBeanAccessArray commonBeanArray = null;
		try
		{
			// ------------------------------
			// リクエスト業務規制リストクリア
			// ------------------------------
			// 共有フォームBeanを取得する。
			commonbean = vl.getCommonInfoBean();
			// 共有フォームBeanからREQUEST_RESTRICTION_LISTデータタイプBeanを取得する。
			commonBeanArray = commonbean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);
			// データをクリアする。
			commonBeanArray.clearArray();

		}
		finally
		{
			commonbean = null;
			commonBeanArray = null;
		}	
	}

}
