/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCAuthorityCtrl
*   ソースファイル名：JCCAuthorityCtrl.java
*   作成者          ：富士通
*   日付            ：2011年05月07日
*＜機能概要＞
* 共有フォームBeanに登録された権限リストと権限制御定義ファイルの内容を突き合わせ、
* 権限の有無を判定して共有フォームBeanにメッセージを設定する機能を提供します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*
**********************************************************************/

package eo.web.webview.common;

import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
import java.util.TreeMap;
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;
import eo.web.webview.common.JCCAuthorityCtrlCache;
import eo.web.webview.common.JCCAuthorityCtrlUtil;

public class JCCAuthorityCtrl
{

	/**
	 * 共有フォームBeanに登録された権限リストと権限制御定義ファイルを突き合わせ、 <br>
	 * 権限の有無を判定してエラーメッセージを共有フォームBeanに設定する。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @return 規制有無フラグ 権限制御あり:true なし:false
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	public static boolean judgeAuthorityCtrl(X31BWebBusinessLogic vl) throws JCCFrameworkException
	{
		String gamenId = null;								// 画面ID
		String eventId = null;								// イベントID
		boolean authorityUmuFlg = true;					// 権限有無フラグ
		HashMap<String, String> lstMap = null;				// 権限リストマップ
		HashMap<String, String> teigiMap = null;			// 権限制御定義ファイルの情報マップ
		TreeMap<String, String> treeTeigiMap = null;		// 権限制御定義ファイルの情報Treeマップ
		StringTokenizer stKeyToken = null;					// キー分割
		try
	    {
			//---------------------------------------
			// 入力パラメータチェック
			//---------------------------------------
			JCCAuthorityCtrlUtil.checkInputpParameter(vl);
	
			//---------------------------------------
			// リクエスト権限リストクリア
			//---------------------------------------
			crearRequestAuthority(vl);

			//---------------------------------------
			// 権限リスト取得
			//---------------------------------------
			lstMap = new HashMap<String, String>();
			JCCAuthorityCtrlUtil.setAuthorityList(vl, lstMap);
			if (0 == lstMap.size())
			{	
				return authorityUmuFlg;
			}
	
			//---------------------------------------
			// 権限制御定義ファイルキャッシュ情報取得
			//---------------------------------------
			// キー情報取得
			gamenId = vl.getGamenId();
			eventId = vl.getSession().getViewParamId().getComponentID();
	
			// 権限制御定義情報マップ取得
			teigiMap = (HashMap<String, String>)getCacheValue(gamenId);
			if (null == teigiMap || 0 == teigiMap.size())
			{
				return authorityUmuFlg;
			}

			treeTeigiMap = new TreeMap<String, String>();
			treeTeigiMap.putAll(teigiMap);
			
			//---------------------------------------
			// 画面ID;イベントIDと一致するキーを探して
			// 、権限コードリストを取得。
			// 権限制御されているか判定する。
			// 権限制御されていれば画面へメッセージを返す。
			//---------------------------------------
			// 権限制御定義ファイルの情報を読み、キー数分繰り返し
			Iterator<String> itr = treeTeigiMap.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) {
//					DEBUG_LOG.debug("judgeAuthorityCtrl:権限制御定義ファイルのキー項目数が3でないものは処理されませんでした。(" + key + ")");
//					continue;
//				}
	
				// 画面ID
				stKeyToken.nextToken();
				// イベントID
				String key2 = stKeyToken.nextToken();
				// キー2番目がイベントIDと一致するまで検索
				if (!eventId.equals(key2)) {
					continue;
				}
				
				// 権限コードリスト取得
				String value = (String)teigiMap.get(key);
				//---------------------------------------
				// 権限判定
				//---------------------------------------
				authorityUmuFlg = judgeStatus(vl, lstMap, value);
				break;
			}
			// 権限なしの場合、呼出画面へ戻す
			if (!authorityUmuFlg)
			{
				setNextScreenId(vl, gamenId);
			}
			return authorityUmuFlg;
	    }
	    finally
	    {
			lstMap = null;
			teigiMap = null;
			treeTeigiMap = 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(JCCAuthorityCtrlCache.FUNC_MODE_ONLINE);
			// 権限制御定義ファイル情報変換後マップ取得
			map = JCCAuthorityCtrlCache.getMap(gamenId);
			return map;
		}
	    catch (Exception e)
	    {
			throw new JCCFrameworkException("権限制御定義ファイルキャッシュ情報の取得に失敗しました。", e);
		}
	}

	/**
	 * 共有フォームBeanクリア処理<BR>
	 * 共有フォームBeanより リクエスト権限リストをクリアします。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 */
	protected static void crearRequestAuthority(X31BWebBusinessLogic vl)
	{
		
		X31SDataBeanAccess commonbean = null;
		X31SDataBeanAccessArray commonBeanArray = null;
		try
		{
			// ------------------------------
			// リクエスト権限リストクリア
			// ------------------------------
			// 共有フォームBeanを取得する。
			commonbean = vl.getCommonInfoBean();
			// 共有フォームBeanからREQUEST_AUTHORITY_LISTデータタイプBeanを取得する。
			commonBeanArray = commonbean.getDataBeanArray(CommonInfoCFConst.REQUEST_AUTHORITY_LIST);
			// データをクリアする。
			commonBeanArray.clearArray();

		}
		finally
		{
			commonbean = null;
			commonBeanArray = null;
		}	
	}
		
	/**
	 * 権限コードリストの権限コードを1件ずつ、権限リストマップから情報を取得して、<BR>
	 * 権限有無を判定します。権限なしの状態であればメッセージを共有フォームBeanに設定します。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @param lstMap 権限リストマップ
	 * @param authorityCdLst 権限コードリスト
	 * @return 権限有無 true:権限あり false:権限なし
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	private static boolean judgeStatus(X31BWebBusinessLogic vl, Map<String, String> lstMap, String authorityCdLst) throws JCCFrameworkException
	{
		JCCSetMessage msg = null;					// メッセージ設定部品
		StringTokenizer stToken = null;				// 権限コード分割
		StringTokenizer stTokenList = null;			// メッセージID;権限コードリスト分割用
		boolean authorityUmuFlg = true;			// 権限有無フラグ(デフォルト権限ありとする)
		String messageIdList = null;				// メッセージIDリスト
		String authorityCdList = null;				// 権限コードリスト
		String messageId = null;					// メッセージID
		try
		
		{
			//--------------------------------	 
			// 権限コードリストチェック
			//--------------------------------	
			authorityCdList = authorityCdLst;
			// 権限コード設定なしは権限ありで処理終了
			if (null == authorityCdList || JCCAuthorityCtrlUtil.STR_BLANK.equals(authorityCdList.trim())) 
			{
				return authorityUmuFlg;
			}
			//--------------------------------	 
			// 権限コードリスト分割
			// 入力引数の権限コードリストは
			// メッセージIDリスト;権限コードリスト
			// の形式になっている
			//--------------------------------	
			// 形式チェック
			JCCAuthorityCtrlUtil.checkAuthorityCdList(authorityCdList);

			// メッセージIDリスト/権限コードリスト取出し
			stTokenList = new StringTokenizer(authorityCdList, JCCAuthorityCtrlCache.KEY_DELIMITERS);
			messageIdList  = stTokenList.nextToken();
			authorityCdList = stTokenList.nextToken();

			//--------------------------------	 
			// 権限コード判定(繰り返し)
			//--------------------------------	 
			// 権限コード分割
			stToken = new StringTokenizer(authorityCdList, JCCAuthorityCtrlCache.VAL_DELIMITERS);

			while(stToken.hasMoreTokens())
			{
				// 権限コード存在チェック(権限リストマップ内)
				String target = stToken.nextToken();
				if (lstMap.containsKey(target))
				{
					authorityUmuFlg = true;
					break;
				}
				authorityUmuFlg = false;
			}
			
			//--------------------------------
			// メッセージ設定処理
			//--------------------------------
			if (!authorityUmuFlg)
			{
				// メッセージ設定用
				msg = new JCCSetMessage();

				// メッセーIDリスト分割
				stToken = new StringTokenizer(messageIdList, JCCAuthorityCtrlCache.VAL_DELIMITERS);
				while (stToken.hasMoreTokens())
				{
					messageId = stToken.nextToken();
					// メッセージ設定
					msg.setMessageInfo(vl, messageId);
				}
			}
			// 権限有無フラグ
			return authorityUmuFlg;
		}
		finally
		{
			msg = null;
			stToken = null;
		}	
	}

	/**
	 * 入力された画面IDを次画面として設定します。
	 * <br>
	 * @param v VIEWロジックインスタンス
	 * @param gamenId 画面ID
	 */
	private static void setNextScreenId(X31BWebBusinessLogic vl, String gamenId)
	{
		X31SDataBeanAccess commonbean = null;
		try
		{
			// 共有フォームBeanアクセスクラスを取得する。
			commonbean = vl.getCommonInfoBean();
			// 共有フォームBeanの遷移先画面IDに画面IDを設定する。
			commonbean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, gamenId);
		}	
		finally
		{
			commonbean = null;
		}	
	}
}
