/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：com.fujitsu.futurity.bp.custom.common
*   ソースファイル名：JCNGet050OptionCC.java
*   作成者          ：富士通
*   日付            ：2013年02月28日
*＜機能概要＞
*   ０５０初期設定完了処理を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/02/28   FJ          新規作成
*   v5.00.01	2013/03/14	FJ)小林		【IT1-2013-0000487】050IP電話アプリサービスをコンテンツサービスコード、コンテンツコード双方にて判定するよう修正
*   v5.00.02	2013/03/18	FJ)小林		【IT1-2013-0000524】050IP電話アプリサービスの特定のコンテンツサービスコードをシスパラから取得するよう修正
*   v5.00.03	2013/05/02  FJ)木村   	 ソース静的解析指摘対応（static変数の使用箇所変更）
*   v5.00.04	2013/06/13  FJ)味岡   	【ANK-1549-00-00】050アプリ_各種事象改善対応
*	v8.00.00	2014/01/29	FJ)塚田		【ANK-1585-00-00】LaLaCall複数番号対応
*	v9.00.00	2014/06/09	FJ)味岡		【ANK-2077-00-00】コンテンツ詳細画面へのLC端末情報表示
*	v65.00.00	2023/11/06	FJ)北村		【ANK-4346-00-00】【eo定期】CCMG再構築対応
*	v65.00.01	2024/02/26	FJ)渋谷		【#84128】050番号VoIPのボタンが表示されない
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.ICommonComponent;
import com.fujitsu.futurity.bp.x21.values.MessageID;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYbpmLog;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JCNStrConst;
import eo.ejb.cbs.cbsmsg.ECN0021A002CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0021A002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0331A001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0331A001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0100001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0170001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0170001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0311B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0311B010CBSMsg1List;

/**
 *  ０５０アプリ利用情報取得処理を行います。
 * <BR>
 * @author 富士通
 */
public class JCNGet050OptionCC extends AbstractCommonComponent implements ICommonComponent
{
	/** 共通コンポーネント名 */
	public static String ccName = "CNSV001901CC";
	
	/** 画面制御フラグ(0:true(表示),1:false(非表示)) */
	public static final String DISP_FLG_0 = "0";
	
	/** 画面制御フラグ(0:true(表示),1:false(非表示)) */
	public static final String DISP_FLG_1 = "1";
	
	/** リターンコード(システムエラー) */
	public static final String RETURN_CD_OK = "000";
	
	/** リターンコード(システムエラー) */
	public static final String RETURN_CD_SYS_ERR = "ERR";
	
	/** 空文字 */
	private static final String S_BLANK = "";
	
	/** SC実行結果格納用(リターンコード)*/
	private String rtnCode = "0";
	
	/** SC実行結果格納用(ステータス)*/
	private int status = 0;
	
	// ANK-4346-00-00 ADD START
	/** CNSV001902CC コンテンツ契約リスト */
	private String CONT_KEI_LIST = "cont_kei_list";
	
	/** コンテンツサービスコード */
	private static final String PARAM_CONT_SVC_CD = "cont_svc_cd";
	
	/** コンテンツコード */
	private static final String PARAM_CONT_CD = "cont_cd";
	// ANK-4346-00-00 ADD END
	/**
	 * 共通コンポーネント実行
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return 
	 * @throws Throwable
	 */
	@SuppressWarnings({ "unchecked" })
	public IRequestParameterReadWrite executeJCNGet050Option(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// 入力パラメータ格納
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		
		// 返却パラメータ格納用マップ生成
		Map userResult = new HashMap();
		
		// コンテンツサービスコード取得
// ANK-4346-00-00 MOD START
//		Map<String, Object> scParam = (Map<String, Object>)param.getData("CNSV001902SC");
//		ArrayList contKeiList = new ArrayList();
//		contKeiList = (ArrayList)scParam.get(ECN0021A002CBSMsg.ECN0021A002CBSMSG1LIST);
//		HashMap utiwakeMap = new HashMap();
//		utiwakeMap = (HashMap) contKeiList.get(0);
//		String contSvcCd = (String) utiwakeMap.get(ECN0021A002CBSMsg1List.CONT_SVC_CD);
//		String contCd = (String) utiwakeMap.get(ECN0021A002CBSMsg1List.CONT_CD);
		Map<String, Object> scParam = (Map<String, Object>)param.getData("CNSV001902CC");
		ArrayList contKeiList = new ArrayList();
		contKeiList = (ArrayList)scParam.get(CONT_KEI_LIST);
		HashMap utiwakeMap = new HashMap();
		utiwakeMap = (HashMap) contKeiList.get(0);
		// #84128 MOD START
//		String contSvcCd = (String) utiwakeMap.get(PARAM_CONT_SVC_CD);
//		String contCd = (String) utiwakeMap.get(PARAM_CONT_CD);
		String contId = (String) utiwakeMap.get(PARAM_CONT_CD);
		// #84128 MOD END
// ANK-4346-00-00 MOD END
		// 050IP電話サービスのコンテンツサービスコード、コンテンツコードを連結して格納(固定値)
//		StringBuffer sbConst = new StringBuffer();
//		sbConst.append(JCNStrConst.CN0011_CONT_SVC_CD_050);
//		sbConst.append(JCNStrConst.S_CONT_CD_000000);
		
		// #84128 DEL START
//		// コンテンツ契約のコンテンツサービスコード、コンテンツコードを連結して格納
//		StringBuffer sbIn = new StringBuffer();
//		sbIn.append(contSvcCd);
//		sbIn.append(contCd);
		// #84128 DEL END
		
		/****************************************************/
		/** システムパラメータ管理一意照会SC実行
		/****************************************************/
		// #84128 MOD START
//		boolean svc050 = callGetSysParam050_01(handle, param, sbIn.toString());
		boolean svc050 = callGetSysParam050_01(handle, param, contId);
		// #84128 MOD END
		
		// コンテンツサービスコード判定
		if(!svc050)
		{
			userResult.put("n_050apl_disp_ctl", DISP_FLG_1);
			userResult.put("n_050apl_option_disp_ctl", DISP_FLG_1);
			userResult.put("return_code", RETURN_CD_OK);
			setResultUserData(param, ccName, userResult);
			return param;
		}
		
		// コンテンツ契約050電話番号内訳一意照会実行結果格納用
		Map utiwakeResult = new HashMap();
		/****************************************************/
		/** 050電話番号,050電話番号PASS取得
		 * コンテンツ契約050電話番号内訳一意照会SC実行      */
		/****************************************************/
		utiwakeResult = callECN0331A001(handle, param, ccParam);
		
		if (utiwakeResult == null)
		{
			userResult = new HashMap();
			userResult.put("n_050apl_disp_ctl", DISP_FLG_1);
			userResult.put("n_050apl_option_disp_ctl", DISP_FLG_1);
			userResult.put("return_code", RETURN_CD_SYS_ERR);
			setResultUserData(param, ccName, userResult);
			return param;
		}
		
		/*********************************************************/
		/** コンテンツ契約050電話番号内訳一意照会SC実行結果格納  */
		/*********************************************************/
		
		// 050電話番号
		userResult.put("n_050_telno",getResultString(utiwakeResult, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + 0 + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050_TELNO));
		// 050アプリ本人確認用電話番号
		userResult.put("n_050apl_hnin_cfm_telno",getResultString(utiwakeResult, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + 0 + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050APL_HNIN_CFM_TELNO));
		// アプリ利用端末情報(端末利用環境情報がカンマ区切りのため第一項目を切り出しする)
		userResult.put("apl_use_tanmt_info",JCNBPCommon.n_050apl_use_model_sbt_set(getResultString(utiwakeResult, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + 0 + "]" + "." 
				+  ECN0331A001CBSMsg1List.TANMT_USE_ENV_INFO)));
		
		/****************************************************/
		/** 050番号オプション設定照会SCの実行               */
		/****************************************************/
		userResult = callECNA0100001(handle, param, utiwakeResult, userResult);
		
		String ecna10Result = (String)userResult.get("return_code");
		if (ecna10Result == null || 
				!RETURN_CD_OK.equals(ecna10Result))
		{
			userResult.put("n_050apl_disp_ctl", DISP_FLG_0);
			userResult.put("n_050apl_option_disp_ctl", DISP_FLG_1);
			if("".equals(ecna10Result) || ecna10Result == null)
			{
				userResult.put("return_code", RETURN_CD_SYS_ERR);
			}
			else
			{
				userResult.put("return_code", ecna10Result);
			}
			setResultUserData(param, ccName, userResult);
			return param;
		}
		else
		{
			userResult.put("n_050apl_disp_ctl", DISP_FLG_0);
			userResult.put("n_050apl_option_disp_ctl", DISP_FLG_0);
			setResultUserData(param, ccName, userResult);
		}
		
		return param;
	}
	
	/**
	 * コンテンツ契約050電話番号内訳一意照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @return rtnCd
	 * @throws Throwable
	 */
	private Map<?,?> callECN0331A001(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		/***************************************************************/
		/** コンテンツ契約050電話番号内訳一意照会SCへの上りマッピング  */
		/***************************************************************/
		String templateId = "ECN0331A001";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECN0331A001CBSMsg.KEY_CONT_KEI_NO, (String) ccParam.get("key_cont_kei_no"));

		HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0331A001CBSMsg.class , param4serviceIf, "1");

		/***************************************************/
		/** SC呼出実行                                     */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// 処理結果判定
		resultChkSc(result);
		
		if(!("0".equals(rtnCode) && 0 == status)) 
		{
			printErrorLog("コンテンツ契約050電話番号内訳一意照会SCにてエラーが発生しました。" + "(KEY:CRECARD_JIGYO_CD=" + JCNStrConst.S_CONT_JIGYO_CD + ")");
			return null;
		}
		
		return result;
	}
	
	/**
	 * 050番号オプション設定照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param utiwakeResult コンテンツ契約050電話番号内訳一意照会実行結果
	 * @throws Throwable
	 */
	private Map<?, ?> callECNA0100001(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> utiwakeResult,
			Map<String, String> userResult) throws Throwable
	{
		
		/************************************************************/
		/** 050番号オプション設定照会SCへの上りマッピング           */
		/************************************************************/
		String templateId = "ECNA0100001";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECNA0100001CBSMsg.TELNUMBER, getResultString(utiwakeResult, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + 0 + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050_TELNO));
		param4serviceIf.put(ECNA0100001CBSMsg.SIP_PASSWORD, getResultString(utiwakeResult, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + 0 + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050APL_SIP_USER_PWD));
		
		
		for (int i = 1; i <= 3 ; i++) 
		{
			param4serviceIf.put(ECNA0100001CBSMsg.OPERATE_FLG, String.valueOf(i));
			
			HashMap<String, Object> paramMap = createScParam(param, templateId, ECNA0100001CBSMsg.class , param4serviceIf, "1");

			/***************************************************/
			/** SC呼出実行                                     */
			/***************************************************/
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
	
			Map<?, ?> result = scCall.run(paramMap, handle);
			
			// 処理結果判定
			resultChkSc(result);
			if(!("0".equals(rtnCode) && 0 == status)) 
			{
				printErrorLog("050番号オプション設定照会SCにてエラーが発生しました。");
				return userResult;
			}
			
			// 処理結果の格納
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.RETURN_CODE)))
			{
				userResult.put("return_code", getResultString(result, ECNA0100001CBSMsg.RETURN_CODE));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.ERROR_DESCRIPTION)))
			{
				userResult.put("error_description", getResultString(result, ECNA0100001CBSMsg.ERROR_DESCRIPTION));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CALLFWD_ACT_FLAG)))
			{
				userResult.put("callfwd_act_flag", getResultString(result, ECNA0100001CBSMsg.CALLFWD_ACT_FLAG));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CALLFWD_CONDITION)))
			{
				userResult.put("callfwd_condition", getResultString(result, ECNA0100001CBSMsg.CALLFWD_CONDITION));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CALLFWD_RINGS)))
			{
				userResult.put("callfwd_rings", getResultString(result, ECNA0100001CBSMsg.CALLFWD_RINGS));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CALLFWD_NUMBER)))
			{
				userResult.put("callfwd_number", getResultString(result, ECNA0100001CBSMsg.CALLFWD_NUMBER));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.VMAIL_NOTIFY_FLAG)))
			{
				userResult.put("vmail_notify_flag", getResultString(result, ECNA0100001CBSMsg.VMAIL_NOTIFY_FLAG));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.VMAIL_NOTIFY_ATTACH)))
			{
				userResult.put("vmail_notify_attach", getResultString(result, ECNA0100001CBSMsg.VMAIL_NOTIFY_ATTACH));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.VMAIL_PIN)))
			{
				userResult.put("vmail_pin", getResultString(result, ECNA0100001CBSMsg.VMAIL_PIN));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.INCALL_NOTIFY_COND)))
			{
				userResult.put("incall_notify_cond", getResultString(result, ECNA0100001CBSMsg.INCALL_NOTIFY_COND));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.EMAIL_ADDRESS)))
			{
				userResult.put("email_address", getResultString(result, ECNA0100001CBSMsg.EMAIL_ADDRESS));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.ANONYMOUS_CALL_REJECTION)))
			{
				userResult.put("anonymous_call_rejection", getResultString(result, ECNA0100001CBSMsg.ANONYMOUS_CALL_REJECTION));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.GLOBAL_CALL_SCREENING)))
			{
				userResult.put("global_call_screening", getResultString(result, ECNA0100001CBSMsg.GLOBAL_CALL_SCREENING));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CHAT_DISPLAY_NAME)))
			{
				userResult.put("chat_display_name", getResultString(result, ECNA0100001CBSMsg.CHAT_DISPLAY_NAME));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CHAT_DISPLAY_NAME_SETTING)))
			{
				userResult.put("chat_display_name_setting", getResultString(result, ECNA0100001CBSMsg.CHAT_DISPLAY_NAME_SETTING));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CHAT_DISPLAY_IMAGE_SETTING)))
			{
				userResult.put("chat_display_image_setting", getResultString(result, ECNA0100001CBSMsg.CHAT_DISPLAY_IMAGE_SETTING));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CHAT_PHONEBOOK_UPLOAD)))
			{
				userResult.put("chat_phonebook_upload", getResultString(result, ECNA0100001CBSMsg.CHAT_PHONEBOOK_UPLOAD));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CHAT_FREE_PAY_NUMBER_SETTING)))
			{
				userResult.put("chat_free_pay_number_setting", getResultString(result, ECNA0100001CBSMsg.CHAT_FREE_PAY_NUMBER_SETTING));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CHAT_PUBLIC_050_NUMBER)))
			{
				userResult.put("chat_public_050_number", getResultString(result, ECNA0100001CBSMsg.CHAT_PUBLIC_050_NUMBER));
			}
			
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.CHAT_STORAGE_SIZE)))
			{
				userResult.put("chat_storage_size", getResultString(result, ECNA0100001CBSMsg.CHAT_STORAGE_SIZE));
			}
			if(!isNullOrBlank(getResultString(result, ECNA0100001CBSMsg.VMAIL_PIN)))
			{
				userResult.put("vmail_pin", getResultString(result, ECNA0100001CBSMsg.VMAIL_PIN));
			}
		}
		return userResult;
	}
	
	/**
	 * システムパラメータ管理一覧照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param contId コンテンツID(コンテンツサービスコード＋コンテンツコード)
	 * @return boolean (true:050IP電話サービス,false:050IP電話サービス以外)
	 * @throws Throwable
	 */
	private boolean callGetSysParam050_01(SessionHandle handle, IRequestParameterReadWrite param, String contId) throws Throwable
	{
		/********************************************************/
		/** システムパラメータ管理一覧照会SCへの上りマッピング  */
		/********************************************************/
		String templateId = "EZM0311B010";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(EZM0311B010CBSMsg.KEY_SYS_PARAM_BUNRUI_CD, JCNStrConst.ZM0311_SYS_PARAM_BUNRUI_CD_CN_CD_02);
		param4serviceIf.put(EZM0311B010CBSMsg.KEY_STDARDYMD, JCCBPCommon.getOpeDate(null));

		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0311B010CBSMsg.class , param4serviceIf, "1");

		/***************************************************/
		/** SC呼出実行                                     */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map<?, ?> result = scCall.run(paramMap, handle);

		// 処理結果判定
		resultChkSc(result);

		if(!("0".equals(rtnCode) && 0 == status)) 
		{
			printErrorLog("システムパラメータ管理一覧照会SCにてエラーが発生しました。" + "(KEY:STDARDYMD=" + JCCBPCommon.getOpeDate(null) + ")");
			return false;
		}

		String sysParam1 = null;
		ArrayList<String> contId050List = new ArrayList<String>();
		for(int i = 0; i < EZM0311B010CBSMsg.EZM0311B010CBSMSG1LIST.length(); i ++)
		{
			if(JCNStrConst.SYS_PARAM_SETTE_VALUE_2_1.equals(getResultString(result, EZM0311B010CBSMsg.EZM0311B010CBSMSG1LIST + "[" + i + "]" + "." 
					+  EZM0311B010CBSMsg1List.SYS_PARAM_SETTE_VALUE_2)))
			{
				sysParam1 = getResultString(result, EZM0311B010CBSMsg.EZM0311B010CBSMSG1LIST + "[" + i + "]" + "." 
						+  EZM0311B010CBSMsg1List.SYS_PARAM_SETTE_VALUE_1);

				StringBuffer contId050 = new StringBuffer();
				contId050.append(JCNStrConst.CN0011_CONT_SVC_CD_050);
				contId050.append(sysParam1);
				contId050List.add(contId050.toString());
			}
		}

		for(int i = 0; i < contId050List.size(); i++)
		{
			if(contId050List.get(i).equals(contId))
			{
				return true;
			}
		}
		return false;
	}
	
	/**
	 * SC呼出用のパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param templateId テンプレートID
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private static HashMap<String, Object> createScParam(IRequestParameterReadOnly param,
			String templateId, Class<?> cbsMsgClass , Map param4serviceIf, String funcCode) throws RequestParameterException
	{

		// 受け取ったリクエストパラメータを元に、ＳＣ呼出用の上りマップを生成する。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		CAANMsg[] templates = new CAANMsg[1];

		CAANMsg template = new CAANMsg(cbsMsgClass.getName());

		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// **********************************************
		// 【取得元：ユーザエリア(コントロールマップ)】
		// **********************************************
		// 依頼先ホスト名
		Object clientHostName = param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME);
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, clientHostName);

		// 依頼元IPアドレス
		Object clientIPAddress = param.getControlMapData(SCControlMapKeys.REQ_HOSTIP);
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, clientIPAddress);

		// 依頼元画面ID
		Object clientViewId = param.getControlMapData(SCControlMapKeys.REQ_VIEWID);
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, clientViewId);

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// **********************************************
		// 【取得元：ユーザデータ
		// **********************************************

		// テンプレートIDのセット
		paramMap.put(JCMConstants.TEMPLATE_ID_KEY, templateId);
		template.set(JCMConstants.TEMPLATE_ID_KEY, templateId);
		template.set(JCMConstants.FUNC_CODE_KEY, funcCode);
		
		setNullOtherColumn(cbsMsgClass, param4serviceIf);
		
		// 入力パラメータのセット
		template.setMsgDataOfAll((HashMap)param4serviceIf);
		templates[0] = template;

		paramMap.put("templates", templates);

		return paramMap;
	}
	
	/**
	 * 入力パラメータ値の指定がない項目にnullをセットする。<br/>
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void setNullOtherColumn(Class<?> cbsMsgClass, Map param4serviceIf) 
	{

		try 
		{
			java.lang.reflect.Field fieldContents = cbsMsgClass.getDeclaredField("CONTENTS");
			fieldContents.setAccessible(true);
			Object[][] contents = (Object[][])fieldContents.get(cbsMsgClass);

			// サービスインターフェイスの列情報を取得
			Map<String, String> colInfo = new HashMap<String, String>();
			for (int i = 0; i < contents.length; i++) 
			{
				Object[] obj = contents[i];
				colInfo.put(obj[0].toString(), obj[1].toString());
			}

			/* エラーフィールド(項目末尾が"_err"の項目)の定義されている項目を入力項目と見なし
			   当該フィールドについて、パラメータ値の指定がない場合は項nullをセットする */
			for (int i = 0; i < contents.length; i++) 
			{
				Object[] obj = contents[i];
				String errFieldName = obj[0].toString();
				if (errFieldName.matches(".*_err$"))
				{
					String fieldName = errFieldName.replaceAll("_err$", "");
					String colDataType = colInfo.get(fieldName);
					if (("String".equals(colDataType))||("Long".equals(colDataType))) 
					{
						// 指定がない項目にnullをセット
						if (!param4serviceIf.containsKey(fieldName))
						{
							param4serviceIf.put(fieldName, null);
						}
					}
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * SCの返却情報からCAANMsgリストを取得する。
	 * @param result SCの返却情報
	 * @param listName リスト名
	 * @return CAANMsgリスト
	 */
	public static CAANMsg[] getResultMsgList(Map<?, ?> result, String listName)
	{
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = parentTemplate.getCAANMsgList(listName);
		if (templateArray == null)
		{
			templateArray = new CAANMsg[]{};
		}
		return templateArray;
	}
	
	/**
	 * SCの返却情報から任意の項目のデータを文字列で取得する。
	 * @param result SCの返却情報
	 * @param columnName 項目名
	 * @return 対象項目のデータ
	 */
	public static String getResultString(Map<?, ?> result, String columnName)
	{
		String strVal = null;

		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg caanMsg = templates[0];
		String[] colNames = columnName.split("\\.");
		for (int i = 0; i < colNames.length; i++) 
		{
			String tmpColName = colNames[i];
			if (tmpColName.matches(".+\\[[0-9]+\\]$")) 
			{
				String listName = tmpColName.replaceAll("\\[[0-9]+\\]", "");
				String indexStr = tmpColName.replace(listName, "").replaceAll("(\\[|\\])", "");
				int index = Integer.parseInt(indexStr);
				if (caanMsg != null)
				{
					CAANMsg[] listData = caanMsg.getCAANMsgList(listName);
					if (listData == null)
					{
						break;
					}
					else if ((listData.length - 1) >= index)
					{
						caanMsg = listData[index];
					}
					else
					{
						break;
					}
				}
			} 
			else
			{
				if (i == (colNames.length - 1))
				{
					if (caanMsg != null)
					{
						strVal = caanMsg.getString(tmpColName);
					}
				}
				else
				{
					if (caanMsg != null)
					{
						caanMsg = caanMsg.getCAANMsg(tmpColName);
					}
				}
			}
		}
		return strVal;
	}
	
	/**
	 * 下りユーザデータマップのセット。
	 * @param param リクエストパラメータ
	 * @param scMapkey SCのID
	 * @param userData 追加でセットするユーザデータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public static void setResultUserData(IRequestParameterReadWrite param, String scMapkey, Map userData) throws Throwable
	{

		// SCから取得したデータのセット
		if (userData != null)
		{
			Map<String, Object> userDataRef = (Map<String, Object>)param.getData(scMapkey);
			Iterator iterator = userData.keySet().iterator();
			while (iterator.hasNext()) 
			{
				String mapKey = (String)iterator.next();
				Object mapVal = userData.get(mapKey);
				userDataRef.put(mapKey, mapVal);
			}
		}
	}
	
	/**
	 * SC処理結果取得
	 * @param result オブジェクト名
	 */
	private void resultChkSc(Map<?, ?> result)
	{
		rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		status = msg.getInt(JCMConstants.STATUS_INT_KEY);
	}
	
	
	/**
     * メソッド名  ：null、空文字判定
     * メソッド説明：nullもしくは空文字の判定を行う
     * 備考：
     * @param strCheck 対象文字列
     * @return true :対象文字列がnullもしくは空文字
     *          false:上記以外
     */
	private static boolean isNullOrBlank(String strCheck) 
	{
		
		// 対象文字列が対象文字列がnullもしくは空文字の場合、trueを返す
		return strCheck == null || S_BLANK.equals(strCheck);
	}

	/**
	 * エラーログ出力
	 * @param errMsg エラーメッセージ
	 */
	private void printErrorLog(String errMsg)
	{
		StackTraceElement[] steAll = Thread.currentThread().getStackTrace();
		String errorInfo = "";
		if (steAll.length >= 3) 
		{
			StackTraceElement ste = steAll[2];
			errorInfo = JCNStrConst.S_LINE_SEPARAOR_LF + "	at " + ste.getClassName() + "." + ste.getMethodName() + 
			"(" + ste.getFileName() + ":" + ste.getLineNumber()+")"+ JCNStrConst.S_LINE_SEPARAOR_LF;
		}
		JSYbpmLog.println(JSYLogBase.ERROR, this.getClass() , errorInfo, MessageID.DEB_X21_DEBUG_MSG,  
				new String[]{"### CCでエラー発生 ###", errMsg } , "");
	}
}
