/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKSeikyKeiInfoAddCC
*   ソースファイル名：JKKSeikyKeiInfoAddCC.java
*   作成者          ：FJ
*   日付            ：2012年06月05日
*＜機能概要＞
*   請求契約情報登録サービスの共通コンポーネント
*＜修正履歴＞
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/06/06   FJ)赤穂       新規作成
*   v4.00.00    2013/02/18   FJ）野口   【ST3-2013-0000040】対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0011D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491C190CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491D010CBSMsg;

/**
 * 請求契約登録に関する登録処理を行います。
 * <br />
 * @author 富士通
 */
public class JKKSeikyKeiInfoAddCC extends AbstractCommonComponent
{
	
	/** 申込登録 */
	private static final String TEMPLATE_ID_EKK0011D010 = "EKK0011D010";
	/**  請求契約登録 */
	private static final String TEMPLATE_ID_EKK0491D010 = "EKK0491D010";
	/** 請求契約内容変更 */
	private static final String TEMPLATE_ID_EKK0491C060 = "EKK0491C060";
	/** 請求契約内容変更（SYSID更新用） */
	private static final String TEMPLATE_ID_EKK0491C190 = "EKK0491C190";
	/**  お客様一意照会(SYSID存在チェック用)  */
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	
	/** エラーフラグ（エラー）*/
	private static final String ERR_FLG_ERR = "E";
	/** エラーフラグ（ワーニング）*/
	private static final String ERR_FLG_WARNING = "W";
	
	/**
	 * 請求契約情報を登録する。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite addSeikyKeiInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// エラーフラグ
		ccMsg.put("err_flg", "");
		
		// メッセージ情報
		ArrayList<HashMap<String, Object>> messageInfo = new ArrayList<HashMap<String, Object>>();
		
		// メッセージコードリスト
		ccMsg.put("message_list", messageInfo);
		
		// SYSID存在チェック
		if(!isExistSysId(handle, param, fixedText))
		{
			
			// 機能コード取得
			String funcCode = (String)ccMsg.get("func_code");
			String compItem = "";
			
			// 請求契約登録画面(登録確認ボタン押下時)の場合
			if(JPCModelConstant.FUNC_CD_2.equals(funcCode))
			{
				
				compItem = "sysid";
				
			}
			
			// エラーメッセージを設定
			setMessageInfo(ccMsg, "EKB2190-KW", "SYSID", compItem, ERR_FLG_ERR);
			
			return param;
			
		}
		
		
		// 処理区分
		String tran_div = (String)ccMsg.get("tran_div");
		// 登録の場合
		if("1".equals(tran_div))
		{
			
			executeAdd(handle, param, fixedText);
			
		}
		else
		{
			
			executeUpd(handle, param, fixedText);
			
		}
		
		return param;
		
	}

	/**
	 * 請求契約一意照会ＣＣのチェック処理用サービスインターフェイス作成。<br>
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @exception RequestParameterExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	public  HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws RequestParameterException
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		List<CAANMsg> templates = new ArrayList<CAANMsg>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		Object[][] inParamData = null;
		
		// 処理区分
		String tran_div = (String)ccMsg.get("tran_div");
		// 登録の場合
		if("1".equals(tran_div))
		{
			// 請求契約登録
			inParamData = getArraysDataEKK0491D010(ccMsg, "");
		}
		else
		{
			inParamData = getArraysDataEKK0491C060(ccMsg);
		}
		
		templates.add(((CAANMsg[])editInMsg(param, inParamData).get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		
		// チェック用サービスインターフェイス
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates.toArray(new CAANMsg[0]));
		return paramMap;
	}

	/**
	 * IRequestParameterReadWriteにエラー情報をマッピングする。<br>
	 * <br>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @param fixedText (I) ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @exception RequestParameterExceptionがスローされます。
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
	throws RequestParameterException
	{
		for (int i = 0; i < templates.length; i++)
		{
			editErrorInfoCom(param, templates, returnCode, fixedText);
		}
		return param;
	}
	
	/**
	 * SYSIDの存在チェックを行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return 判定結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private boolean isExistSysId(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable 
	{
		boolean ret = false;
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		Object[][] inParamData = getArraysDataECK0011A010(ccMsg);
		
		CAANMsg[] eck0011a010CBSMsg1List = callSC(handle, scCall, param, fixedText, inParamData).getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
		
		if(eck0011a010CBSMsg1List != null && eck0011a010CBSMsg1List.length > 0)
		{
			
			CAANMsg eck0011a010Data = eck0011a010CBSMsg1List[0];
			
			// お客様名
			ccMsg.put("cust_nm", getNullToStr(eck0011a010Data.getString(ECK0011A010CBSMsg1List.CUST_NM)));
			
			ret = true;
			
		}
		
		
		return ret;
	}

	/**
	 * 登録処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void executeAdd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 申込登録
		Object[][] eKK0011d010IN = getArraysDataEKK0011D010(ccMsg);
		ArrayList<HashMap<String, Object>> inList = getArrayListEKK0011D010CBSMsg();
		
		CAANMsg ekk0011D010CBSMsg = callSCArray(handle, scCall, param, fixedText, eKK0011d010IN, "EKK0011D010CBSMsg1List", inList);
		
		CAANMsg ekk0011D010CBSMsg1List = ekk0011D010CBSMsg.getCAANMsgList(EKK0011D010CBSMsg.EKK0011D010CBSMSG1LIST)[0];
		
		String mskmDtlNo = getNullToStr(ekk0011D010CBSMsg1List.getString(EKK0011D010CBSMsg1List.MSKM_DTL_NO));
		
		// 請求契約登録
		Object[][] inParamData = getArraysDataEKK0491D010(ccMsg, mskmDtlNo);
		
		CAANMsg caanMsgData = callSC(handle, scCall, param, fixedText, inParamData);
		
		setMapAddData(ccMsg, caanMsgData);
		
	}

	/**
	 * 更新処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void executeUpd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		Object[][] inParamData = getArraysDataEKK0491C060(ccMsg);
		
		// 請求契約内容変更
		CAANMsg caanMsgData = callSC(handle, scCall, param, fixedText, inParamData);
		
		// 更新年月日時分秒取得
		String updDtm = getNullToStr(caanMsgData.getString(EKK0491C060CBSMsg.UPD_DTM));
		
		Object[][] inParamEKK0491C190Data = getArraysDataEKK0491C190(ccMsg, updDtm);
		
		// 請求契約内容変更（SYSID更新用）
		CAANMsg ekk0491c190Data = callSC(handle, scCall, param, fixedText, inParamEKK0491C190Data);
		
		setMapUpdData(ccMsg, caanMsgData);
		
	}

	/**
	 * サービスIF(ECK0011A010)に格納するデータ群の組み立て<br>
	 * <br>
	 * @param ccMsg
	 * @return Object[][]
	 */
	private Object[][] getArraysDataECK0011A010(HashMap<String, Object> ccMsg)
	{
		
		Object[][] arraysParam = {
				{ECK0011A010CBSMsg.TEMPLATEID,                 TEMPLATE_ID_ECK0011A010},
				{ECK0011A010CBSMsg.FUNC_CODE,                  "2"},
				{ECK0011A010CBSMsg.KEY_SYSID,                  (String)ccMsg.get("sysid")},
				{ECK0011A010CBSMsg.KEY_GENE_ADD_DTM,           ""},
				{ECK0011A010CBSMsg.KEY_RSV_APLY_YMD,           (String)ccMsg.get("key_rsv_aply_ymd")},
			};
		
		return arraysParam;
	}

	/**
	 * サービスIF(EKK0011D010)に格納するデータ群の組み立て(登録用)<br>
	 * <br>
	 * @param ccMsg
	 * @return Object[][]
	 */
	private Object[][] getArraysDataEKK0011D010(HashMap<String, Object> ccMsg)
	{
		
		String operateDateTime = JCCBPCommon.getOpeDateTimeStamp(null);
		
		Object[][] arraysParam = {
				{EKK0011D010CBSMsg.TEMPLATEID,                 TEMPLATE_ID_EKK0011D010},
				{EKK0011D010CBSMsg.FUNC_CODE,                  (String)ccMsg.get("func_code")},
				{EKK0011D010CBSMsg.SYSID,                      (String)ccMsg.get("sysid")},
				{EKK0011D010CBSMsg.MSKM_YMD,                   (String)ccMsg.get("key_rsv_aply_ymd")},
				{EKK0011D010CBSMsg.MSKM_UK_DTM,                operateDateTime},
				{EKK0011D010CBSMsg.MSKM_SBT_CD,                "00015"},
				{EKK0011D010CBSMsg.CONSMBSN_MSKM_STAT_SKBT_CD, "04"},
				{EKK0011D010CBSMsg.MSKMSHO_ARIV_YMD,           ""},
				{EKK0011D010CBSMsg.MSKM_UK_TNT_USER_ID,        ""},
				{EKK0011D010CBSMsg.TTL_BUSINESS_CENTER_UK_NO,  ""},
				{EKK0011D010CBSMsg.TTL_BUSINESS_MSKM_OPT_CD,   ""},
				{EKK0011D010CBSMsg.MSKM_RRKS_TELNO,            ""},
				{EKK0011D010CBSMsg.MSKM_JSSIS_SBT_CD,          ""},
				{EKK0011D010CBSMsg.CUST_YOBO_JIKO,             ""},
				{EKK0011D010CBSMsg.TEL_RRK_KIBOD_SBT_CD,       ""},
				{EKK0011D010CBSMsg.TEL_RRK_KIBO_TIME_CD,       ""},
				{EKK0011D010CBSMsg.TAKCHO_KIBOD_SBT_CD,        ""},
				{EKK0011D010CBSMsg.TAKCHO_KIBO_TIME_CD,        ""},
				{EKK0011D010CBSMsg.KARI_MSKM_FLG,              ""},
				{EKK0011D010CBSMsg.REFERER,                    ""},
				{EKK0011D010CBSMsg.KEPCO_CUSTINFO_JUJU_DOI_UM, ""},
				{EKK0011D010CBSMsg.SHOSA_BF_RRK_JIKO_YH,       ""},
				{EKK0011D010CBSMsg.SHOSA_BF_RRK_JIKO,          ""},
				{EKK0011D010CBSMsg.USE_SVC_KEIZK_SBT_CD,       ""},
				{EKK0011D010CBSMsg.UK_TNTSHA_SKBT_CD,          ""},
				{EKK0011D010CBSMsg.KOJI_REQ_INFO_RRK_JIKO,     ""},
				{EKK0011D010CBSMsg.MSKM_ROUTE_SKBT_CD,         ""},
			};
		
		return arraysParam;
	}

	/**
	 * サービスIF(EKK0011D010)に格納する申込明細の組み立て(登録用)<br>
	 * <br>
	 * @return ArrayList
	 */
	private ArrayList<HashMap<String, Object>> getArrayListEKK0011D010CBSMsg()
	{
		
		ArrayList<HashMap<String, Object>> inList = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> inMap = new HashMap<String, Object>();
		
		inMap.put(EKK0011D010CBSMsg1List.MSKMSHO_NO, "");
		inMap.put(EKK0011D010CBSMsg1List.WEB_UK_NO, "");
		inMap.put(EKK0011D010CBSMsg1List.MSKM_FORM_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.MSKM_DTL_SBT_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.RRKS_KTAI_TELNO, "");
		inMap.put(EKK0011D010CBSMsg1List.RRKS_OFFC_NM, "");
		inMap.put(EKK0011D010CBSMsg1List.DT_RRKS_TELNO, "");
		inMap.put(EKK0011D010CBSMsg1List.NEW_MSKM_SBT_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.MSKM_OPTNTY_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.TAKCHO_KIBO_APO_KIGEN_YMD, "");
		inMap.put(EKK0011D010CBSMsg1List.KOJI_APO_RRKS_SHITEI_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.KOJI_APO_RRKS_TELNO, "");
		inMap.put(EKK0011D010CBSMsg1List.RRK_JIKO_ADD_DTM, "");
		inMap.put(EKK0011D010CBSMsg1List.MSKM_RRKS_MLAD, "");
		inMap.put(EKK0011D010CBSMsg1List.KOJI_PRG_TCHI_MLAD, "");
		inMap.put(EKK0011D010CBSMsg1List.RRK_JIKO, "");
		inMap.put(EKK0011D010CBSMsg1List.KJSC_TCH_KTAI_MLAD, "");
		inMap.put(EKK0011D010CBSMsg1List.ML_SEND_JGI_FLG, "");
		inMap.put(EKK0011D010CBSMsg1List.ML_SEND_JGI_RSN_MEMO, "");
		inMap.put(EKK0011D010CBSMsg1List.BMP_MSKM_RRKS_TLN, "");
		inMap.put(EKK0011D010CBSMsg1List.OP_SVC_HKTGI_UM, "");
		inMap.put(EKK0011D010CBSMsg1List.DSL_ATICLE_SOHU_KIBO_UM, "");
		inMap.put(EKK0011D010CBSMsg1List.RRK_WAY_HOKI, "");
		inMap.put(EKK0011D010CBSMsg1List.NEWCONST_BUKKEN_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.HUKKAT_ANKEN_FLG, "");
		inMap.put(EKK0011D010CBSMsg1List.SAME_EQUIP_RE_MSKM_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.HNIN_CFM_ATICLE_SBT_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.MSKMSHO_SBT_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.KEI_HUKA_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.MAP_TEMP_UM, "");
		inMap.put(EKK0011D010CBSMsg1List.KCN_STB_MSKM_CNT, "");
		inMap.put(EKK0011D010CBSMsg1List.KCN_STB_KIND_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.MANSSBSYS_RNKI_YO_KIJIRAN, "");
		inMap.put(EKK0011D010CBSMsg1List.MANSION_ID, "");
		inMap.put(EKK0011D010CBSMsg1List.CATID, "");
		inMap.put(EKK0011D010CBSMsg1List.MKM_UK_SBT_CD, "");
		inMap.put(EKK0011D010CBSMsg1List.MSKMSHO_TRAT_IF_TNTSHA_NM, "");
		inMap.put(EKK0011D010CBSMsg1List.MSKMSHO_TRAT_IF_TELNO, "");
		
		inList.add(inMap);
		
		return inList;
		
	}

	/**
	 * サービスIFに格納するデータ群の組み立て(登録用)<br>
	 * <br>
	 * @param ccMsg
	 * @param mskmDtlNo
	 * @return Object[][]
	 */
	private Object[][] getArraysDataEKK0491D010(HashMap<String, Object> ccMsg, String mskmDtlNo)
	{
		
		Object[][] arraysParam = {
				{EKK0491D010CBSMsg.TEMPLATEID,       TEMPLATE_ID_EKK0491D010},
				{EKK0491D010CBSMsg.FUNC_CODE,        (String)ccMsg.get("func_code")},
				{EKK0491D010CBSMsg.SEIKY_WAY_CD,   (String)ccMsg.get("payway_cd")},
				{EKK0491D010CBSMsg.SHS_HOJIN_SBT_CD,   (String)ccMsg.get("shs_hojin_sbt_cd")},
				{EKK0491D010CBSMsg.SHS_HOJIN_ZENGO_SHITEI_CD,   (String)ccMsg.get("shs_hojin_zengo_shitei_cd")},
				{EKK0491D010CBSMsg.SHS_KANA,   (String)ccMsg.get("shs_kana")},
				{EKK0491D010CBSMsg.SOHUS_NM,   (String)ccMsg.get("sohus_nm")},
				{EKK0491D010CBSMsg.SOHUS_BKM,   (String)ccMsg.get("sohus_bkm")},
				{EKK0491D010CBSMsg.SOHUS_TNTSHA_NM,   (String)ccMsg.get("sohus_tntsha_nm")},
				{EKK0491D010CBSMsg.SOHUS_AD_CD,   (String)ccMsg.get("sohus_ad_cd")},
				{EKK0491D010CBSMsg.SOHUS_PCD,   (String)ccMsg.get("sohus_pcd")},
				{EKK0491D010CBSMsg.SOHUS_STATE_NM,   (String)ccMsg.get("sohus_state_nm")},
				{EKK0491D010CBSMsg.SOHUS_CITY_NM,   (String)ccMsg.get("sohus_city_nm")},
				{EKK0491D010CBSMsg.SOHUS_OAZTSU_NM,   (String)ccMsg.get("sohus_oaztsu_nm")},
				{EKK0491D010CBSMsg.SOHUS_AZCHO_NM,   (String)ccMsg.get("sohus_azcho_nm")},
				{EKK0491D010CBSMsg.SOHUS_ADRTTM,   (String)ccMsg.get("sohus_adrttm")},
				{EKK0491D010CBSMsg.SOHUS_ADRRM,   (String)ccMsg.get("sohus_adrrm")},
				{EKK0491D010CBSMsg.SOHUS_BNCHIGO,   (String)ccMsg.get("sohus_bnchigo")},
				{EKK0491D010CBSMsg.SOHUS_TELNO,   (String)ccMsg.get("sohus_telno")},
				{EKK0491D010CBSMsg.SYSID,   (String)ccMsg.get("sysid")},
				{EKK0491D010CBSMsg.SOHUS_AD_MAN_INPUT_FLG,  (String)ccMsg.get("shs_ad_man_input_chkbox")},
				{EKK0491D010CBSMsg.SOHUS_AD_CHK_LV,  (String)ccMsg.get("shs_ad_man_input_chkbox_lv")},
				{EKK0491D010CBSMsg.MSKM_DTL_NO,   mskmDtlNo},
				{EKK0491D010CBSMsg.IDO_DIV,   "00017"},
				{EKK0491D010CBSMsg.SEIKYUS_HAKKO_YH,   "0"},
				{EKK0491D010CBSMsg.MANSION_OWNR_ID,   ""},
				{EKK0491D010CBSMsg.KEI_CNC_YMD,   ""},
				{EKK0491D010CBSMsg.SEIKY_CYCLE_CD,   ""},
				{EKK0491D010CBSMsg.SEIKY_KEI_KANA,   ""},
				{EKK0491D010CBSMsg.SEIKY_WAY_NO_KOZA,   ""},
				{EKK0491D010CBSMsg.SEIKY_WAY_NO_CRECARD,   ""},
				{EKK0491D010CBSMsg.INFO_DSP_CD,   ""},
				{EKK0491D010CBSMsg.SKS_SHS_KSH_AD_SAI_FLG,   ""},
				{EKK0491D010CBSMsg.SKS_SHS_NM_CUST_NM_SAI_FLG,   ""},
				{EKK0491D010CBSMsg.SOHUS_FAX_NO,   ""},
				{EKK0491D010CBSMsg.SOHUS_MLAD,   ""},
				{EKK0491D010CBSMsg.SEIKYUS_SOHUS_CHGE_YMD,   ""},
				{EKK0491D010CBSMsg.RSV_TSTA_KIBO_YMD,   ""},
				{EKK0491D010CBSMsg.FIRST_SEIKY_YM,   ""},
				{EKK0491D010CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YH,   ""},
				{EKK0491D010CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YMD,   ""},
				{EKK0491D010CBSMsg.FIRST_PAY_MSKMSHO_RCP_YMD,   ""},
				{EKK0491D010CBSMsg.SEIKY_WAY_APLY_ADJ_YMD,   ""},
			};
		
		return arraysParam;
	}

	/**
	 * サービスIFに格納するデータ群の組み立て(更新用)<br>
	 * <br>
	 * @param ccMsg
	 * @return Object[][]
	 */
	private Object[][] getArraysDataEKK0491C060(HashMap<String, Object> ccMsg)
	{
		
		Object[][] arraysParam = {
				{EKK0491C060CBSMsg.TEMPLATEID,       TEMPLATE_ID_EKK0491C060},
				{EKK0491C060CBSMsg.FUNC_CODE,        (String)ccMsg.get("func_code")},
				{EKK0491C060CBSMsg.SEIKY_KEI_NO,   (String)ccMsg.get("key_seiky_kei_no")},
				{EKK0491C060CBSMsg.RSV_APLY_YMD,   (String)ccMsg.get("key_rsv_aply_ymd")},
				{EKK0491C060CBSMsg.SHS_HOJIN_SBT_CD,   (String)ccMsg.get("shs_hojin_sbt_cd")},
				{EKK0491C060CBSMsg.SHS_HOJIN_ZENGO_SHITEI_CD,   (String)ccMsg.get("shs_hojin_zengo_shitei_cd")},
				{EKK0491C060CBSMsg.SHS_KANA,   (String)ccMsg.get("shs_kana")},
				{EKK0491C060CBSMsg.SOHUS_NM,   (String)ccMsg.get("sohus_nm")},
				{EKK0491C060CBSMsg.SOHUS_BKM,   (String)ccMsg.get("sohus_bkm")},
				{EKK0491C060CBSMsg.SOHUS_TNTSHA_NM,   (String)ccMsg.get("sohus_tntsha_nm")},
				{EKK0491C060CBSMsg.SOHUS_AD_CD,   (String)ccMsg.get("sohus_ad_cd")},
				{EKK0491C060CBSMsg.SOHUS_PCD,   (String)ccMsg.get("sohus_pcd")},
				{EKK0491C060CBSMsg.SOHUS_STATE_NM,   (String)ccMsg.get("sohus_state_nm")},
				{EKK0491C060CBSMsg.SOHUS_CITY_NM,   (String)ccMsg.get("sohus_city_nm")},
				{EKK0491C060CBSMsg.SOHUS_OAZTSU_NM,   (String)ccMsg.get("sohus_oaztsu_nm")},
				{EKK0491C060CBSMsg.SOHUS_AZCHO_NM,   (String)ccMsg.get("sohus_azcho_nm")},
				{EKK0491C060CBSMsg.SOHUS_ADRTTM,   (String)ccMsg.get("sohus_adrttm")},
				{EKK0491C060CBSMsg.SOHUS_ADRRM,   (String)ccMsg.get("sohus_adrrm")},
				{EKK0491C060CBSMsg.SOHUS_BNCHIGO,   (String)ccMsg.get("sohus_bnchigo")},
				{EKK0491C060CBSMsg.SOHUS_TELNO,   (String)ccMsg.get("sohus_telno")},
				{EKK0491C060CBSMsg.MSKM_DTL_NO,   (String)ccMsg.get("mskm_dtl_no")},
				{EKK0491C060CBSMsg.IDO_DIV,   (String)ccMsg.get("ido_div")},
				{EKK0491C060CBSMsg.UPD_DTM_BF,   (String)ccMsg.get("upd_dtm_seiky_kei")},
				{EKK0491C060CBSMsg.SEIKYUS_HAKKO_YH,   (String)ccMsg.get("seikyus_hakko_yh")},
				{EKK0491C060CBSMsg.SOHUS_AD_MAN_INPUT_FLG,  (String)ccMsg.get("shs_ad_man_input_chkbox")},
				{EKK0491C060CBSMsg.SOHUS_AD_CHK_LV,  (String)ccMsg.get("shs_ad_man_input_chkbox_lv")},
				{EKK0491C060CBSMsg.SOHUS_MLAD,   ""},
				{EKK0491C060CBSMsg.RSV_TSTA_KIBO_YMD,   ""},
				{EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_RCP_YMD,   ""},
				{EKK0491C060CBSMsg.SEIKY_KEI_KANA,   ""},
				{EKK0491C060CBSMsg.SEIKYUS_SOHUS_CHGE_YMD,   ""},
				{EKK0491C060CBSMsg.FIRST_SEIKY_YM,   ""},
				{EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YMD,   ""},
				{EKK0491C060CBSMsg.SOHUS_FAX_NO,   ""},
				{EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YH,   ""},
				{EKK0491C060CBSMsg.SKS_SHS_NM_CUST_NM_SAI_FLG,   ""},
				{EKK0491C060CBSMsg.SKS_SHS_KSH_AD_SAI_FLG,   ""},
				{EKK0491C060CBSMsg.INFO_DSP_CD,   ""},
				{EKK0491C060CBSMsg.SEIKY_WAY_APLY_ADJ_YMD,   ""},
			};
		
		return arraysParam;
	}

	/**
	 * サービスIF(EKK0491C190)に格納するデータ群の組み立て<br>
	 * <br>
	 * @param ccMsg
	 * @param updDtm
	 * @return Object[][]
	 */
	private Object[][] getArraysDataEKK0491C190(HashMap<String, Object> ccMsg, String updDtm)
	{
		
		Object[][] arraysParam = {
				{EKK0491C190CBSMsg.TEMPLATEID,   TEMPLATE_ID_EKK0491C190},
				{EKK0491C190CBSMsg.FUNC_CODE,    (String)ccMsg.get("func_code")},
				{EKK0491C190CBSMsg.SEIKY_KEI_NO, (String)ccMsg.get("key_seiky_kei_no")},
				{EKK0491C190CBSMsg.SYSID,        (String)ccMsg.get("sysid")},
				{EKK0491C190CBSMsg.MSKM_DTL_NO,  (String)ccMsg.get("mskm_dtl_no")},
				{EKK0491C190CBSMsg.IDO_DIV,      (String)ccMsg.get("ido_div")},
				{EKK0491C190CBSMsg.UPD_DTM_BF,   updDtm},
			};
		
		return arraysParam;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出し後、値の格納(更新用)
	 * 
	 * @param ccMsg
	 * @param ekk0491d010Data
	 */
	private void setMapAddData(HashMap<String, Object> ccMsg, CAANMsg ekk0491d010Data)
	{
		
		// 請求契約番号
		ccMsg.put("seiky_kei_no", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SEIKY_KEI_NO)));
		// 法人格前後コード
		ccMsg.put("shs_hojin_zengo_shitei_cd", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SHS_HOJIN_ZENGO_SHITEI_CD)));
		// 法人格コード
		ccMsg.put("shs_hojin_sbt_cd", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SHS_HOJIN_SBT_CD)));
		// 送付先カナ名
		ccMsg.put("shs_kana", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SHS_KANA)));
		// 送付先名
		ccMsg.put("sohus_nm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_NM)));
		// 部課名
		ccMsg.put("sohus_bkm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_BKM)));
		// 担当者名
		ccMsg.put("sohus_tntsha_nm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_TNTSHA_NM)));
		// 電話番号
		ccMsg.put("sohus_telno", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_TELNO)));
		
		String strPcd = getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_PCD));
		// 郵便番号
		ccMsg.put("sohus_pcd", strPcd);
		
		// 送付先住所手動入力フラグ
		ccMsg.put("shs_ad_man_input_chkbox", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_AD_MAN_INPUT_FLG)));
		
		String strAd = getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_AD_CD));
		// 住所コード
		ccMsg.put("sohus_ad_cd", strAd);
		// 都道府県
		ccMsg.put("sohus_state_nm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_STATE_NM)));
		// 市区町村
		ccMsg.put("sohus_city_nm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_CITY_NM)));
		// 大字通称
		ccMsg.put("sohus_oaztsu_nm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_OAZTSU_NM)));
		// 字丁目
		ccMsg.put("sohus_azcho_nm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_AZCHO_NM)));
		// 番地号
		ccMsg.put("sohus_bnchigo", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_BNCHIGO)));
		// 建物名
		ccMsg.put("sohus_adrttm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_ADRTTM)));
		// 部屋番号
		ccMsg.put("sohus_adrrm", getNullToStr(ekk0491d010Data.getString(EKK0491D010CBSMsg.SOHUS_ADRRM)));
	}

	/**
	 * SC(サービスインターフェイス）を呼び出し後、値の格納(更新用)
	 * 
	 * @param ccMsg
	 * @param ekk0491c060Data
	 */
	private void setMapUpdData(HashMap<String, Object> ccMsg, CAANMsg ekk0491c060Data)
	{
		
		// 請求契約番号
		ccMsg.put("seiky_kei_no", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SEIKY_KEI_NO)));
		// 法人格前後コード
		ccMsg.put("shs_hojin_zengo_shitei_cd", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SHS_HOJIN_ZENGO_SHITEI_CD)));
		// 法人格コード
		ccMsg.put("shs_hojin_sbt_cd", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SHS_HOJIN_SBT_CD)));
		// 送付先カナ名
		ccMsg.put("shs_kana", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SHS_KANA)));
		// 送付先名
		ccMsg.put("sohus_nm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_NM)));
		// 部課名
		ccMsg.put("sohus_bkm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_BKM)));
		// 担当者名
		ccMsg.put("sohus_tntsha_nm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_TNTSHA_NM)));
		// 電話番号
		ccMsg.put("sohus_telno", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_TELNO)));
		
		String strPcd = getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_PCD));
		// 郵便番号
		ccMsg.put("sohus_pcd", strPcd);
		
		// 送付先住所手動入力フラグ
		ccMsg.put("shs_ad_man_input_chkbox", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_AD_MAN_INPUT_FLG)));
		
		String strAd = getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_AD_CD));
		// 住所コード
		ccMsg.put("sohus_ad_cd", strAd);
		// 都道府県
		ccMsg.put("sohus_state_nm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_STATE_NM)));
		// 市区町村
		ccMsg.put("sohus_city_nm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_CITY_NM)));
		// 大字通称
		ccMsg.put("sohus_oaztsu_nm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_OAZTSU_NM)));
		// 字丁目
		ccMsg.put("sohus_azcho_nm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_AZCHO_NM)));
		// 番地号
		ccMsg.put("sohus_bnchigo", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_BNCHIGO)));
		// 建物名
		ccMsg.put("sohus_adrttm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_ADRTTM)));
		// 部屋番号
		ccMsg.put("sohus_adrrm", getNullToStr(ekk0491c060Data.getString(EKK0491C060CBSMsg.SOHUS_ADRRM)));
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @param inListMsgName
	 * @param inList
	 * @return メッセージキャリア
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSCArray(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData,
							String inListMsgName, 
							ArrayList<HashMap<String, Object>> inList) throws Exception
	{
		HashMap<String, Object> paramMap = editInArrayMsg(param, mappingData, inListMsgName, inList);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoComArray(param, templates, (Integer)return_code, dataMapKey, mappingData, inListMsgName, inList);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}
		return msg;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData) throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
			if(!("0".equals(return_code.toString()) && 4 == status))
			{
/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
				throw new SCCallException("戻り値不正", return_code.toString(), status);
/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
			}
/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
		}
		return msg;
	}
	
	/**
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		HashMap<String, String> inMap = null;
		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		Iterator<String> it = inMap.keySet().iterator();
		while (it.hasNext())
		{
			String key = it.next();
			if (key.endsWith("_err"))
			{
				if (!template.isNull(key))
				{
					if (!inMap.containsKey(key))
					{
						inMap.put(key, template.getString(key));
					}
				}
			}
		}
		
		return param;
	}

	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey,
														Object[][] mappingData) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		for (int i = 0; i < mappingData.length; i++)
		{
/* ++++++++++ v4.00.00 削除開始 ++++++++++ */
//			if (((String)mappingData[i][0]).startsWith("key_"))
//			{
/* ++++++++++ v4.00.00 削除終了 ++++++++++ */
				if (!template.isNull(mappingData[i][0] + "_err"))
				{
					if (!inMap.containsKey(mappingData[i][0] + "_err"))
					{
						inMap.put(mappingData[i][0] + "_err", template.getString(mappingData[i][0] + "_err"));
					}
				}
/* ++++++++++ v4.00.00 削除開始 ++++++++++ */
//			}
/* ++++++++++ v4.00.00 削除終了 ++++++++++ */
		}
		return param;
	}

	/**
	 * @param param
	 * @param mappingData
	 * @param inListMsgName
	 * @param inList
	 * @return HashMap
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInArrayMsg(IRequestParameterReadWrite param,
													Object[][] mappingData, 
													String inListMsgName, 
													ArrayList<HashMap<String, Object>> inList) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));


		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		
		CAANMsg[] templateArray = template.getCAANMsgList(inListMsgName);
		
		if(templateArray == null)
		{
			templateArray = new CAANMsg[inList.size()];
		}
		
		for (int i = 0; i < inList.size(); i++)
		{
			HashMap childMap = (HashMap)inList.get(i);
			CAANMsg childTemplate = templateArray[i];
			if(childTemplate == null)
			{
				childTemplate = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg1List", svcIf));
			}
			
			Iterator it = childMap.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String)it.next();
				
				if ("".equals(childMap.get(key)))
				{
					childTemplate.setNull(key);
				}
				else
				{
					childTemplate.set(key, (String)childMap.get(key));
				}
			}

			templateArray[i] = childTemplate;
		}
		
		template.set(inListMsgName, templateArray);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @param inListMsgName
	 * @param inList
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoComArray(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey,
														Object[][] mappingData,
														String inListMsgName, 
														ArrayList<HashMap<String, Object>> inList) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, String> inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		CAANMsg[] templateArray = template.getCAANMsgList(inListMsgName);
		
		for (int i = 0; i < inList.size(); i++)
		{
			HashMap childMap = (HashMap)inList.get(i);
			CAANMsg childTemplate = templateArray[i];
			
			Iterator it = childMap.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String)it.next();
				
				if (!childTemplate.isNull(key + "_err"))
				{
					if (!inMap.containsKey(key + "_err"))
					{
						inMap.put(key + "_err", childTemplate.getString(key + "_err"));
					}
				}
			}
		}
		
		if(!template.isNull(inListMsgName + "_err"))
		{
			if(!inMap.containsKey(inListMsgName + "_err"))
			{
				inMap.put(inListMsgName + "_err", template.getString(inListMsgName + "_err"));
			}
		}

		return param;
	}
	
	/**
	 * パラメタがNullの場合空白を返却します。
	 * @param str 文字列
	 * @return str
	 */
	private String getNullToStr(String str)
	{
		if (str == null || "".equals(str.trim()))
		{
			return "";
		}
		return str;
	}
	
	/**
	 * メッセージIDを設定します。
	 * @param ccMsg パラメータMap
	 * @param pMessageId メッセージID
	 * @param pReplaceCha 置換文字列
	 * @param pErrItem エラー設定項目
	 * @param pErrFlg エラーフラグ
	 */
	@SuppressWarnings("unchecked")
	private void setMessageInfo(HashMap<String, Object> ccMsg, String pMessageId, String pReplaceCha, String pErrItem, String pErrFlg)
	{

		// エラーフラグの設定
		// エラーの場合はそのまま設定。　ワーニングの場合はエラーが設定されていない場合、設定
		String errFlg = (String)ccMsg.get("err_flg");

		if("".equals(errFlg) || ERR_FLG_WARNING.equals(errFlg))
		{
			ccMsg.put("err_flg", pErrFlg);
		}

		HashMap<String, Object> messageMap = new HashMap<String, Object>();
		// メッセージIDを設定
		messageMap.put("messageId", pMessageId);
		// 置換文字列
		messageMap.put("replaceCha", pReplaceCha);
		// エラー設定項目
		messageMap.put("errItem", pErrItem);

		ArrayList<HashMap<String, Object>> messageInfo = (ArrayList<HashMap<String, Object>>)ccMsg.get("message_list");
		messageInfo.add(messageMap);

	}
	

}
