/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*	モジュール名	：JCCAuthorityCtrlApi
*	ソースファイル名：JCCAuthorityCtrlApi.java
*	作成者			：富士通
*	日付			：2011年07月14日
*＜機能概要＞
*	他システムからAPIを呼び出された際に、プロパティファイルの情報を
*	参照し、権限情報を共有フォームBeanに設定します。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/14	FJ)藤田		新規作成
*   v18.00.00   2015/08/11  FJ) 阪口   【ANK-2631-00-00】ワンストップ案件（ＳＴＥＰ１）※koptWebBからkoptWebAへコピー
*
**********************************************************************/

package eo.web.webview.commonOneStop;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

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 com.fujitsu.futurity.web.x33.DispatchContext;
import com.fujitsu.futurity.web.x33.DispatchContextFactory;
import com.fujitsu.futurity.web.x33.HttpDispatchContext;

import eo.common.util.JCCFrameworkException;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * 権限判定処理(API連携)クラスです。
 * 
 * @author 富士通
 */
public class JCCAuthorityCtrlApi
{
	/** プロパティファイル名 */
	public static final String PROPERTIES_FILE_NAME = "権限制御定義プロパティ";
	
	/**
	 * プロパティファイルの情報を参照し、権限情報を共有フォームBeanに設定
	 * @param vl VIEWロジックインスタンス
	 * @return 権限有無フラグ 権限制御あり:true なし:false
	 * @exception 	JCCFrameworkExceptionがスローされます。
	 */
	public static boolean judgeAuthorityCtrl(JCCWebBusinessLogic vl) throws JCCFrameworkException
	{
		// 入力パラメータチェック
		checkInputpParameter(vl);
		
		// 共有フォームBeanをクリア
		crearRequestAuthority(vl);
		
		// アクセス元のIP取得
		// 2012/03/28 アクセス元IPアドレスの取得方法変更 start
		//String clientIp = vl.getClientIPAddress();
		DispatchContext context = DispatchContextFactory.getInstance().getHttpDispatchContext();
		HttpServletRequest req = ((HttpDispatchContext)context).getServletRequest();
		String clientIp = req.getRemoteAddr();
		// 2012/03/28 アクセス元IPアドレスの取得方法変更 end

		
// 2012/03/29 権限プロパティによる判定は削除してAPLConstから取得する start
		
		// APLConstから許可IPアドレスのリストを取得
		String acceptIp = JCCWebCommon.getApplicationConst("AUTHORITY_IP_ADDRESS");
		
		// 設定値無しは全許可
		if(null == acceptIp || "".equals(acceptIp))
		{
			return true;
		}
		
		// IPアドレスリストをセミコロンで分割
		ArrayList<String> acceptIpList = new ArrayList<String>();
		acceptIpList.addAll(new ArrayList<String>(Arrays.asList(acceptIp.split(";"))));
		
		// アクセス元IPの存在チェック
		if(acceptIpList.contains(clientIp) == true)
		{
			return true;
		}
		else
		{
			return false;
		}
		
//		// 権限定義取得
//		String apiId = null;
//		try
//		{
//			// API-IDを取得
//			JCCAuthorityCtrlCache.setPath(JCCAuthorityCtrlCache.FUNC_MODE_ONLINE);
//			apiId = JCCAuthorityCtrlCache.getValue(JCCWorkRestrictionCache.FUNC_MODE_ONLINE, clientIp);
//			if(null == apiId || 0 == apiId.length())
//			{
//				return false;
//			}
//		}
//		catch (Throwable e)
//		{
//			throw new JCCFrameworkException("権限定義ファイルキャッシュ情報の取得に失敗しました。", e);
//		}
//		
//		// API-IDを分断してリストに格納
//		ArrayList<String> apiIdList = getSeparateList(apiId, ",");
//		
//		
//		for(int i=0; i<apiIdList.size(); i++)
//		{
//			X31SDataBeanAccess bean = vl.getCommonInfoBean();
//			X31SDataBeanAccessArray beanArray = bean.getDataBeanArray(CommonInfoCFConst.REQUEST_AUTHORITY_LIST);
//			X31SDataBeanAccess subbean = beanArray.addDataBean();
//			subbean.sendMessageString(CommonInfoCFConst.REQUEST_AUTHORITY_03,
//					X31CWebConst.DATABEAN_SET_VALUE,(String)apiIdList.get(i));
//		}
//		if( 0!= getDataBeanCount(vl))
//		{
//			return true;
//		}
//		else
//		{
//			return false;
//		}
// 2012/03/29 権限プロパティによる判定は削除 end
	}
	
	/**
	 * 任意の文字列と区切り文字を指定して、区切り文字を除いたリストを作る。
	 * 
	 * @param arg1	    リストの元になる文字列
	 * @param kugiri	区切り文字
	 * @return 文字列リスト。
	 */	
	private static ArrayList<String> getSeparateList(String arg1, String kugiri)
	{
		ArrayList<String> list = new ArrayList<String>();
		if(null == arg1 || null == kugiri)
		{
			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(-1 != extlen)
			{
				tmpStr2 = tmpStr1.substring(0, extlen);
				// 前後のスペースは削除して登録
				if("".equals(tmpStr2.trim()))
				{
					throw new JCCFrameworkException(PROPERTIES_FILE_NAME + "に空白の情報があります。");
				}
				list.add(tmpStr2.trim());
			}
			// 区切り文字が見つからない場合は残り文字列を全て格納してbreak
			else
			{
				// 前後のスペースは削除して登録
				if("".equals(tmpStr1.trim()))
				{
					throw new JCCFrameworkException(PROPERTIES_FILE_NAME + "に空白の情報があります。");
				}
				list.add(tmpStr1.trim());
				break;
			}
			// offset値の加算と読み出した分の文字列をトリミング（
			offset += (extlen + 1);
			tmpStr1 = tmpStr1.substring(extlen + 1);
		}
		return list;
	}
	
	/**
	 * 登録されているデータタイプBeanの数を返します。<BR>
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 */
	private  static int getDataBeanCount(JCCWebBusinessLogic vl)
	{
		// 共有フォームBeanを取得する。
		X31SDataBeanAccess commonbean = vl.getCommonInfoBean();
		// 共有フォームBeanからデータタイプBeanを取得する。
		X31SDataBeanAccessArray commonBeanArray = commonbean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);

		return commonBeanArray.getCount();

	}
	/**
	 * 入力パラメータチェックをする処理です。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 * @exception JCCFrameworkExceptionがスローされます。
	 */
	public static void checkInputpParameter(JCCWebBusinessLogic vl) throws JCCFrameworkException
	{
	    if (null == vl)
	    {
			throw new JCCFrameworkException("VIEWロジックインスタンスが設定されていません。");
		}
	}
	
	/**
	 * 共有フォームBeanクリア処理<BR>
	 * 共有フォームBeanより リクエスト権限リストをクリアします。
	 * <br>
	 * @param vl VIEWロジックインスタンス
	 */
	private static void crearRequestAuthority(X31BWebBusinessLogic vl)
	{
		
		// 共有フォームBeanを取得する。
		X31SDataBeanAccess commonbean = vl.getCommonInfoBean();
		// 共有フォームBeanからREQUEST_AUTHORITY_LISTデータタイプBeanを取得する。
		X31SDataBeanAccessArray commonBeanArray = commonbean.getDataBeanArray(CommonInfoCFConst.REQUEST_AUTHORITY_LIST);
		// データをクリアする。
		commonBeanArray.clearArray();

	
	}
	
}
