/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*	モジュール名	：JCCBusinessControlApi
*	ソースファイル名：JCCBusinessControlApi.java
*	作成者			：富士通
*	日付			：2011年06月30日
*＜機能概要＞
*	他システムからAPIを呼び出された際に、Viewロジックの処理を実行すべきか
*	否かをプロパティファイルおよび業務規制テーブルのフラグで判定
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/30	FJ)藤田		新規作成
*
**********************************************************************/
package eo.web.webview.common;

import java.util.ArrayList;
import java.util.HashMap;

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;

/**
 * 業務規制判定処理(API連携)クラスです。
 * 
 * @author 富士通
 */
public class JCCBusinessControlApi extends JCCBusinessControl
{
	/** 業務規制一覧:API結果コードキー */
	public static final String KEY_API_RSLT_CD = "api_rslt_cd";
	
	
	/**
	 * 他システムからAPIを呼び出されたときにプロパティファイルおよび業務テーブルのフラグを <br>
	 * 参照し、業務規制情報を共有フォームビーンに設定します。 <br>
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @return 規制有無フラグ 業務規制あり:true なし:false
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	@Override
	public boolean searchBusinessControl(JCCWebBusinessLogic vl) throws JCCFrameworkException
	{
		// 入力パラメータチェック
		super.checkInputpParameter(vl);
		
		// 共有フォームBeanをクリア
		super.crearRequestRestriction(vl);
		
		// API-ID取得
		String gamenId = vl.getGamenId();
		// 業務規制定義取得
		String kiseiCd = null;
		try
		{
			// 業務規制コードを取得
			JCCWorkRestrictionCache.setPath(JCCWorkRestrictionCache.FUNC_MODE_ONLINE);
			kiseiCd = JCCWorkRestrictionCache.getValue(JCCWorkRestrictionCache.FUNC_MODE_ONLINE, gamenId);
			if(null == kiseiCd || 0 == kiseiCd.length())
			{
				return false;
			}
		}
		catch (Throwable e)
		{
			throw new JCCFrameworkException("規制定義ファイルキャッシュ情報の取得に失敗しました。", e);
		}

		// 規制状態取得
		HashMap<String, String> paramMap = new HashMap<String, String>();
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID);
		inputMap.put(KEY_RESULT, new HashMap().put(FUNC_CODE, "1"));

		vl.invokeService(paramMap, inputMap, outputMap);  // 業務規制一覧照会サービスIF起動
		
		// 規制コードを分断してリストに格納
		ArrayList<String> kiseiCdList = getSeparateList(kiseiCd, ",");
		
		// システム全機能の規制コードを追加(設定に関わらず必ず入る規制コード)
		kiseiCdList.add(vl.RESTRICTION_ALL_SELECT_UPDATE);
		kiseiCdList.add(vl.RESTRICTION_ALL_UPDATE);

		// 規制状態判定
		HashMap<String, Object> workMap = (HashMap<String, Object>)outputMap.get(KEY_RESULT);
		ArrayList<HashMap<String,String>> workList = (ArrayList<HashMap<String,String>>) workMap.get(KEY_LIST);
		if (0 == workList.size()) {
			return false;
		}
		
		for(int i=0; i<workList.size(); i++)
		{
			if(kiseiCdList.contains((String)workList.get(i).get(KEY_WORK_KISEI_CD)))
			{
				// 規制コードが一致したら共有フォームBeanに規制情報をセットする
				X31SDataBeanAccess bean = vl.getCommonInfoBean();
				X31SDataBeanAccessArray beanArray = bean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);
				X31SDataBeanAccess subbean = beanArray.addDataBean();
				subbean.sendMessageString(CommonInfoCFConst.REQUEST_RESTRICTION_04,
						X31CWebConst.DATABEAN_SET_VALUE,(String)workList.get(i).get(KEY_WORK_KISEI_CD));
				subbean.sendMessageString(CommonInfoCFConst.REQUEST_RESTRICTION_FLG_04, 
						X31CWebConst.DATABEAN_SET_VALUE, (String)workList.get(i).get(KEY_KISEI_FLG));
				subbean.sendMessageString(CommonInfoCFConst.REQUEST_RSLT_CD_04, 
						X31CWebConst.DATABEAN_SET_VALUE, (String)workList.get(i).get(KEY_API_RSLT_CD));
			}
		}
		if( 0!= getDataBeanCount(vl))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * 任意の文字列と区切り文字を指定して、区切り文字を除いたリストを作る。
	 * 
	 * @param arg1	    リストの元になる文字列
	 * @param kugiri	区切り文字
	 * @return 文字列リスト。
	 */	
	private static ArrayList<String> getSeparateList(String arg1, String kugiri)
	{
		ArrayList<String> list = new ArrayList<String>();
		if(arg1 == null || kugiri == null)
		{
			return list;
		}
		int offset = 0;
		int length = arg1.length();
		int extlen = 0;
		String tmpStr1 = arg1;
		String tmpStr2 = "";
		
		while(offset < length)
		{
			// 区切り文字を検出して、そこまでの文字列をリストに追加
			extlen = tmpStr1.indexOf(kugiri);
			if(extlen != -1)
			{
				tmpStr2 = tmpStr1.substring(0, extlen);
				// 前後のスペースは削除して登録
				list.add(tmpStr2.trim());
			}
			// 区切り文字が見つからない場合は残り文字列を全て格納してbreak
			else
			{
				// 前後のスペースは削除して登録
				list.add(tmpStr1.trim());
				break;
			}
			// offset値の加算と読み出した分の文字列をトリミング（
			offset += (extlen + 1);
			tmpStr1 = tmpStr1.substring(extlen + 1);
		}
		return list;
	}
	
	/**
	 * 登録されているデータタイプBeanの数を返します。<BR>
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 */
	private int getDataBeanCount(JCCWebBusinessLogic vl)
	{
		// 共有フォームBeanを取得する。
		X31SDataBeanAccess commonbean = vl.getCommonInfoBean();
		// 共有フォームBeanからデータタイプBeanを取得する。
		X31SDataBeanAccessArray commonBeanArray = commonbean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);

		return commonBeanArray.getCount();

	}
}
