/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCAuthorityCtrlStatus
*   ソースファイル名：JCCAuthorityCtrlStatus.java
*   作成者          ：富士通
*   日付            ：2011年05月07日
*＜機能概要＞
*  共有フォームBeanに登録された権限リストと権限制御定義ファイルの内容を突き合わせ、
*  権限の有無を判定して状態を設定する機能を提供します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v18.00.00   2015/08/11   FJ) 阪口   【ANK-2631-00-00】ワンストップ案件（ＳＴＥＰ１）※koptWebBからkoptWebAへコピー
*
**********************************************************************/

package eo.web.webview.commonOneStop;

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.CommonInfoCF.CommonInfoCFConst;


public class JCCAuthorityCtrlStatus
{
	/**
	 * 権限設定処理. <br>
	 * 共有フォームBeanに登録された権限リストと権限制御定義ファイルを突き合わせ、 <br>
	 * 権限の有無を判定して権限制御情報を共有フォームBeanに設定します。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	public static void setAuthorityCtrl(X31BWebBusinessLogic vl) throws JCCFrameworkException
	{
		String gamenId = null;								// 画面ID
		boolean authorityUmuFlg = false;					// 権限有無フラグ
		HashMap<String, String> lstMap = null;				// 検索結果格納用マップ
		HashMap<String, String> teigiMap = null;			// 権限制御定義ファイルの情報マップ(画面IDで絞込み)
		StringTokenizer stKeyToken = null;					// キー分割
		try {
		
			//---------------------------------------
			// 入力パラメータチェック
			//---------------------------------------
			JCCAuthorityCtrlUtil.checkInputpParameter(vl);
			
// 2011/09/01 リクエスト権限リストの削除を行う
			JCCAuthorityCtrl.crearRequestAuthority(vl);
// 2011/09/01 リクエスト権限リストの削除を行う

			//---------------------------------------
			// 権限リスト取得
			//---------------------------------------
			lstMap = new HashMap<String, String>();
			JCCAuthorityCtrlUtil.setAuthorityList(vl, lstMap);
			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/01 順序順とイベント番号が等しければ、権限判定を行う。 start
			for(int i = 0 ; i < teigiMap.size() ; i++){
// 2011/09/01 順序順とイベント番号が等しければ、権限判定を行う。 end
				// 権限制御定義ファイルの情報を読み、キー数分繰り返し
				Iterator<String> itr = teigiMap.keySet().iterator();
				while (itr.hasNext())
				{
					//---------------------------------------
					// キーの分割
					//---------------------------------------
					// 規制定義情報のキー取得
					String key = (String)itr.next();
	
					stKeyToken = new StringTokenizer(key, JCCAuthorityCtrlCache.KEY_DELIMITERS);
					// キャッシュ部品でチェックしているためtreeTeigiMapにはキー項目数のデータしかないためチェック不要
	//				if (stKeyToken.countTokens() != JCCAuthorityCtrlCache.KEY_LIST_COUNT_ONLINE) {
	//					continue;
	//				}
					
					// 画面ID
					stKeyToken.nextToken();
					// イベントID取得
					String key2 = stKeyToken.nextToken();
					// イベント番号取得
					String key3 = stKeyToken.nextToken();
					// 権限コードリスト取得
					String value = (String)teigiMap.get(key);
	
// 2011/09/01 順序順とイベント番号が等しければ、権限判定を行う。 start
					if(Integer.parseInt(key3) == i){
						//---------------------------------------
						// 権限判定
						//---------------------------------------
						authorityUmuFlg = judgeStatus(vl, lstMap, value);
						// 権限ありの場合、イベントID、イベント番号を共有フォームBeanに設定する。
						if (authorityUmuFlg)
						{
							setStatus(vl, key2, key3);
// 2011/09/01 権限なしの場合は明示的にイベント番号に"NG"を付与する start
						}else{
							setStatus(vl, key2, "NG");
						}
						break;
// 2011/09/01 権限なしの場合は明示的にイベント番号に"NG"を付与する end
					}
// 2011/09/01 順序順とイベント番号が等しければ、権限判定を行う。 end
				}
			}
		} 
		finally
		{
			lstMap = null;
			teigiMap = null;
			stKeyToken = null;
		}

	}
	

	/**
	 * 画面IDをキーに権限制御定義ファイルキャッシュされたマップ情報を取得します。
	 * <br>
	 * @param gamenID 画面ID
	 * @return 権限制御定義ファイル情報マップ(オンライン用)
	 * @exception JCCFrameworkExceptionがスローされます。
	 */
	private static Map<String, String> getCacheValue(String gamenId) throws JCCFrameworkException
	{
		try
	    {
			// 規制定義情報マップ値
			Map<String, String> map = null;
			// 権限制御定義ファイルキャッシュ情報パス設定
//			JCCAuthorityCtrlCache.setPath(JCCRestrictionPropertyCache.FUNC_MODE_ONLINE);
			JCCAuthorityCtrlCache.setPath(JCCAuthorityCtrlCache.FUNC_MODE_ONLINE);
			// 権限制御定義ファイル情報変換後マップ取得
			map = JCCAuthorityCtrlCache.getMap(gamenId);
			return map;
		}
	    catch (Exception e)
	    {
			throw new JCCFrameworkException("権限制御定義ファイルキャッシュ情報の取得に失敗しました。", e);
		}
	}


	/**
	 * 権限コードリストの権限コードを1件ずつ、権限リストマップから情報を取得して、<BR>
	 * 権限有無を判定します。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @param lstMap 権限リストマップ
	 * @param iseiCdLst 権限コードリスト
	 * @return 権限有無 true:権限あり false:権限なし
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	public static boolean judgeStatus(X31BWebBusinessLogic vl, HashMap<String, String> lstMap, String authorityCdLst) throws JCCFrameworkException
	{
		StringTokenizer stToken = null;				// 権限制御コード分割
		boolean authorityUmuFlg = false;			// 権限有無フラグ
		StringTokenizer stTokenList = null;			// メッセージID;権限コードリスト分割用
		String authorityCdList = null;				// 権限コードリスト
		try
		{
			//--------------------------------	 
			// 権限コードリストチェック
			//--------------------------------	
			authorityCdList = authorityCdLst;
			// 権限コード設定なしは権限ありで処理終了
			if (null == authorityCdList || JCCAuthorityCtrlUtil.STR_BLANK.equals(authorityCdList.trim())) 
			{
				// 権限有無フラグ
				authorityUmuFlg = true;
				return authorityUmuFlg;
			}
			
			//--------------------------------	 
			// 権限コードリスト分割
			// 入力引数の権限コードリストは
			// メッセージIDリスト;権限コードリスト
			// の形式になっている
			//--------------------------------	
			// 形式チェック
			JCCAuthorityCtrlUtil.checkAuthorityCdList(authorityCdList);

			// メッセージIDリスト/権限コードリスト取出し
			stTokenList = new StringTokenizer(authorityCdList, JCCAuthorityCtrlCache.KEY_DELIMITERS);
			stTokenList.nextToken();
			authorityCdList = stTokenList.nextToken();

			//--------------------------------	 
			// 権限コード判定(繰り返し)
			//--------------------------------	 
			// 権限コード分割
			stToken = new StringTokenizer(authorityCdList, JCCAuthorityCtrlCache.VAL_DELIMITERS);
			while(stToken.hasMoreTokens())
			{
				//--------------------------------	 
				// 権限コードチェック
				//--------------------------------	 
				String target = stToken.nextToken();

				// 権限リストマップに権限コードがキーとしてあるかチェック
				if (!lstMap.containsKey(target))
				{
					continue;
				}
				// 権限あり
				authorityUmuFlg = true;
				break;
			}
			// 権限有無フラグ
			return authorityUmuFlg;
		}	
		finally
		{
			stToken = null;
			stTokenList = null;
		}	
	}

	/**
	 * 権限制御状態(権限あり)を共有フォームBeanに設定します。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @param eventId イベントID
	 * @param eventNum イベント番号
	 */
	private static void setStatus(X31BWebBusinessLogic vl, String eventId, String eventNum)
	{
		// 共有フォームBeanを取得する。
		X31SDataBeanAccess commonbean = null;
		// 共有フォームBeanからREQUEST_AUTHORITY_LISTデータタイプBeanを取得する。
		X31SDataBeanAccessArray commonBeanArray = null;
		// データを追加する。
		X31SDataBeanAccess commonSubbean = null;
		try
		{
			// 共有フォームBeanを取得する。
			commonbean = vl.getCommonInfoBean();
			// 共有フォームBeanからREQUEST_AUTHORITY_LISTデータタイプBeanを取得する。
			commonBeanArray = commonbean.getDataBeanArray(CommonInfoCFConst.REQUEST_AUTHORITY_LIST);
			// データを追加する。
			commonSubbean = commonBeanArray.addDataBean();
			commonSubbean.sendMessageString(CommonInfoCFConst.REQUEST_AUTHORITY_03, X31CWebConst.DATABEAN_SET_VALUE, eventId);
			commonSubbean.sendMessageString(CommonInfoCFConst.REQUEST_AUTHORITY_FLG_03, X31CWebConst.DATABEAN_SET_VALUE, eventNum);
		}
		finally
		{
			commonbean = null;
			commonBeanArray = null;
			commonSubbean = null;
		}	
	}
}
