/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCNContIcgMskmUpdCC
*	ソースファイル名：JCNContIcgMskmUpdCC.java
*	作成者			：FJ）上村
*	日付			：2021年07月14日
*＜機能概要＞
*	コンテンツ一時申込更新処理の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v54.00.00	2021/07/14  FJ)上村		【ANK-4092-00-00】CX戦略WG方針対応STEP2
**********************************************************************/
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.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 com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JACStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECN0131B009CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0131B009CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B529CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3291D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3291E010CBSMsg;


/**
 * コンテンツ一時申込更新処理の共通コンポーネントクラスです。
 * <BR>
 * @author FJ
 */
public class JCNContIcgMskmUpdCC extends AbstractCommonComponent
{
	
	/** テンプレートID　コンテンツ申込情報登録 */
	private static final String TEMPLATE_ID_EKK3291D010 = "EKK3291D010";
	
	/** テンプレートID　コンテンツ申込情報物理削除 */
	private static final String TEMPLATE_ID_EKK3291E010 = "EKK3291E010";
	
	/** テンプレートID(EKK1091D010) 進捗登録 */
	private static final String TEMPLATE_ID_EKK1091D010 = "EKK1091D010";
	
	/** 機能コード　[0]：登録*/
	private static final String FUNC_CD_ADD = "0";
	
	/** 機能コード　[1]：削除*/
	private static final String FUNC_CD_DEL = "1";
	
	/** 機能コード　[2]：削除・登録 */
	private static final String FUNC_CD_DEL_ADD = "2";
	
	/** 進捗特記事項1メッセージ　申込 */
	private static final String PRG_TKJK_1_MSKM = "：申込 ";
	
	/** 進捗特記事項1メッセージ　取消 */
	private static final String PRG_TKJK_1_CANCEL = "：取消 ";
	
	/** 進捗特記事項1メッセージ　MAXサイズ */
	private static final int PRG_TKJK_1_MAX = 128;
	
	/** 進捗／異動理由情報登録時の項目 */
	private static final String IDO_RSN_MEMO = "ido_rsn_memo";
	private static final String IDO_RSN_CD = "ido_rsn_cd";
	private static final String LIST_KEY_EKK1091D010 = "EKK1091D010CBSMsg1List";
	
	/**
	 * コンテンツ一時申込更新を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	public IRequestParameterReadWrite updContIcgMskm(SessionHandle handle, 
														IRequestParameterReadWrite param, 
														String fixedText) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		ArrayList<HashMap<String, String>> cont_mskm_info_list = (ArrayList<HashMap<String, String>>) ccMsg.get("cont_mskm_info_list");
		ArrayList<HashMap<String, String>> svc_kei_info_list = (ArrayList<HashMap<String, String>>) ccMsg.get("svc_kei_info_list");
		
		// 進捗特記事項1メッセージ格納用変数を作成
		StringBuilder prg_tkjk_1 = new StringBuilder();
		
		// コンテンツ申込の登録・削除処理を行う
		for(int i = 0; i < cont_mskm_info_list.size(); i++)
		{
			// 各コンテンツ申込の機能コードを取得
			String func_cd = (String) cont_mskm_info_list.get(i).get("func_code");
			
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			
			//機能コードが[1]：削除または[2]：削除・登録の場合、
			if(FUNC_CD_DEL.equals(func_cd) || FUNC_CD_DEL_ADD.equals(func_cd))
			{
				//機能コードが[1]：削除の場合、
				if(FUNC_CD_DEL.equals(func_cd))
				{
					// 進捗特記事項1メッセージにメッセージを追加
					prg_tkjk_1 = prg_tkjk_1.append((String) cont_mskm_info_list.get(i).get("cont_svc_nm") + PRG_TKJK_1_CANCEL);
				}
				
				// コンテンツ申込情報の物理削除を実行する
				Object[][] EKK3291E010In =
				{
					{EKK3291E010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3291E010},
					{EKK3291E010CBSMsg.FUNC_CODE, "1"},
					{EKK3291E010CBSMsg.CONT_MSKM_NO, (String) cont_mskm_info_list.get(i).get("cont_mskm_no")},
					{EKK3291E010CBSMsg.UPD_DTM_BF, (String) cont_mskm_info_list.get(i).get("upd_dtm")}
				};
				// サービスIF実行
				callSCEkk3291E010(handle, scCall, param, fixedText, EKK3291E010In, new EKK3291E010CBSMsg().getContents());
			}
			
			//機能コードが[0]：登録または[2]：削除・登録の場合、
			if(FUNC_CD_ADD.equals(func_cd) || FUNC_CD_DEL_ADD.equals(func_cd))
			{
				// 進捗特記事項1メッセージにメッセージを追加
				prg_tkjk_1 = prg_tkjk_1.append((String) cont_mskm_info_list.get(i).get("cont_svc_nm") + PRG_TKJK_1_MSKM);
				
				// コンテンツ申込情報登録を実行する
				Object[][] EKK3291D010In =
				{
					{EKK3291D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3291D010},
					{EKK3291D010CBSMsg.FUNC_CODE, "1"},
					{EKK3291D010CBSMsg.MSKM_NO, (String) cont_mskm_info_list.get(i).get("mskm_no")},
					{EKK3291D010CBSMsg.CONT_SVC_CD, (String) cont_mskm_info_list.get(i).get("cont_svc_cd")},
					{EKK3291D010CBSMsg.CONT_MKM_INF_STCD, "01"} // 受付済
				};
				// サービスIF実行
				callSCEkk3291D010(handle, scCall, param, fixedText, EKK3291D010In, new EKK3291D010CBSMsg().getContents());
			} 
		}
		
		// 進捗登録実行
		
		HashMap<String, String> childMap = new HashMap<String, String>();
		// 異動理由コード
		childMap.put(EKK1091D010CBSMsg1List.IDO_RSN_CD, JKKStrConst.CD00846_OTHER);
		// 異動理由メモ
		childMap.put(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, null);
		ArrayList<HashMap<String, String>> inList = new ArrayList<HashMap<String, String>>();
		inList.add(childMap);
		HashMap<String, ArrayList<HashMap<String, String>>> eKK1091D010Map = new HashMap<String, ArrayList<HashMap<String, String>>>();
		eKK1091D010Map.put(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, inList);

		// 進捗特記事項1メッセージ文字数判定
		String prgTkjk = prg_tkjk_1.toString();
		String prgTkjk1 = null;
		
		if (prgTkjk.length() > PRG_TKJK_1_MAX)
		{
			prgTkjk1 = prgTkjk.substring(0, PRG_TKJK_1_MAX);
		}
		else
		{
			prgTkjk1 = prgTkjk;
		}
		
		// サービス契約番号の件数分処理を行う
		for (int i = 0; i < svc_kei_info_list.size(); i++)
		{
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			
			// サービス契約番号を取得
			String svcKeiNo = (String) svc_kei_info_list.get(i).get("svc_kei_no");

			Object[][] ekk1091d010In =
					{ { EKK1091D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1091D010 }, { EKK1091D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 }, { EKK1091D010CBSMsg.MSKM_DTL_NO, JACStrConst.KARA_MOJI },
							{ EKK1091D010CBSMsg.SEIKY_KEI_NO, JACStrConst.KARA_MOJI }, { EKK1091D010CBSMsg.SVC_KEI_NO, svcKeiNo }, { EKK1091D010CBSMsg.IDO_DIV, JKKStrConst.CD00576_00034 },
							{ EKK1091D010CBSMsg.IDO_DTM, JCCBPCommon.getSysDateTimeStamp() }, { EKK1091D010CBSMsg.PRG_STAT, JKKStrConst.CD00647_MSKM_INF_TEISE_FIN },
							{ EKK1091D010CBSMsg.PRG_TKJK_1, prgTkjk1 }, { EKK1091D010CBSMsg.PRG_TKJK_2, JACStrConst.KARA_MOJI }, { EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, eKK1091D010Map } };

			// 請求契約番号に紐づくサービス契約番号に対して進捗登録する
			// 但しサービス契約ステータスが「920:キャンセル済」とサービスコード「04:ホスティング」のサービス契約番号は除く。
			callSCEkk1091D010(handle, scCall, param, fixedText, ekk1091d010In);
		}
		
		return param;
	}
	
	
	/**
	 * BPチェック用パラメータ作成。<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return BPチェック用パラメータ
	 */
	public HashMap<?, ?> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		// BPチェックはスキップする
		return JCKPmpScParamHenshu.createBpNotCheckParam();
	}
	
	
	/**
	 * ＢＰチェック結果を編集する。<br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable
	{
		return JCKPmpScParamHenshu.editErrorInfo(param, caanMsgs, returnCode);
	}
	
	
	/**
	 * EKK3291D010SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callSCEkk3291D010(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData,
							Object[][] contents) 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, contents);

		//エラー情報のマップを取得
		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))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}

		return msg;
	}

	/**
	 * EKK3291D010SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callSCEkk3291E010(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData,
							Object[][] contents) 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, contents);

		//エラー情報のマップを取得
		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))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}

		return msg;
	}
	
	/**
	 * 共通項目のメッセージを作成します。
	 * @param param リクエストパラメータ
	 * @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 CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey,
														Object[][] mappingData,
														Object[][] contents) 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; null != contents && i < contents.length ; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith("_err"))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JKKStringUtil.isNullBlank(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}

		return param;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 *
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	private CAANMsg callSCEkk1091D010(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey, Object[][] mappingData) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsgEkk1091D010(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];

		// リターンコード取得
		int returnCode = (Integer)result.get(JCMConstants.RET_CD_INT_KEY);

		int templateStatus = msg.getInt(EKK1091D010CBSMsg.STATUS);

		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);
		}

		setErrorInf(msg, (HashMap<String, Object>)param.getData(dataMapKey));

		String svcIf = (String)mappingData[0][1];

		if (TEMPLATE_ID_EKK1091D010.equals(svcIf))
		{
			HashMap eKK1091D010Map = (HashMap)mappingData[mappingData.length - 1][1];
			ArrayList<HashMap<String, String>> inList = (ArrayList)eKK1091D010Map.get(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);
			CAANMsg[] templateArray = msg.getCAANMsgList(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);

			if (templateArray != null)
			{
				for (int i = 0; i < templateArray.length; i++)
				{
					setErrorInf(templateArray[i], (HashMap)inList.get(i));
				}
			}
		}

		//エラー情報のマップを取得
		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));

		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		// 異常の場合、SCCallExceptionを生成してスローする
		if (!("0".equals(rtnCode) && 0 == status.intValue()))
		{
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		return msg;
	}
	
	/**
	 * 共通項目のメッセージを作成します。
	 *
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private HashMap<String, Object> editInMsgEkk1091D010(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));

		if (TEMPLATE_ID_EKK1091D010.equals(mappingData[0][1]))
		{
			for (int i = 0; i < mappingData.length - 1; i++)
			{
				if (JACStrConst.KARA_MOJI.equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}

			template = setEKK1091D010CBSMsg1List(template, (HashMap)mappingData[mappingData.length - 1][1]);
		}
		else
		{
			for (int i = 0; i < mappingData.length; i++)
			{
				if (JACStrConst.KARA_MOJI.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 template
	 * @param ccMsg
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	private CAANMsg setEKK1091D010CBSMsg1List(CAANMsg template, HashMap ccMsg) throws RequestParameterException
	{
		ArrayList inList = (ArrayList)ccMsg.get(LIST_KEY_EKK1091D010);
		CAANMsg[] templateArray = template.getCAANMsgList(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);
		if (templateArray == null)
		{
			templateArray = new CAANMsg[inList.size()];
		}

		if (inList != null)
		{
			for (int i = 0; i < inList.size(); i++)
			{
				HashMap childMap = (HashMap)inList.get(i);

				CAANMsg childTemplate = templateArray[i];
				if (childTemplate == null)
				{
					childTemplate = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
				}
				// 進捗登録マップ.異動理由明細.異動理由コード → 異動理由明細.異動理由コード
				if (JACStrConst.KARA_MOJI.equals(childMap.get(IDO_RSN_CD)))
				{
					childTemplate.setNull(EKK1091D010CBSMsg1List.IDO_RSN_CD);
				}
				else
				{
					childTemplate.set(EKK1091D010CBSMsg1List.IDO_RSN_CD, (String)childMap.get(IDO_RSN_CD));
				}

				// 異動理由明細.異動理由メモ
				if (JACStrConst.KARA_MOJI.equals(childMap.get(IDO_RSN_MEMO)))
				{
					childTemplate.setNull(EKK1091D010CBSMsg1List.IDO_RSN_MEMO);
				}
				else
				{
					childTemplate.set(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, (String)childMap.get(IDO_RSN_MEMO));
				}

				templateArray[i] = childTemplate;
			}
		}
		template.set(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, templateArray);
		return template;
	}
	
	/**
	 * エラー情報を設定します。
	 *
	 * @param msg
	 * @param map
	 *
	 */
	private void setErrorInf(CAANMsg msg, HashMap<String, Object> map)
	{
		Iterator<String> msgKey = msg.getSchema().getSchemaKeySet().iterator();

		while (msgKey.hasNext())
		{
			String key = msgKey.next();

			if (key.endsWith("_err"))
			{
				if (!msg.isNull(key))
				{
					if (!map.containsKey(key))
					{
						map.put(key, toStrVal(msg.getString(key)));
					}
				}
			}
		}
	}
	
	/**
	 * NULLの場合空文字に変換する。
	 *
	 * @param obj 値
	 * @return 空文字又は値
	 */
	private static String toStrVal(Object obj)
	{
		if (obj == null)
		{
			return JACStrConst.KARA_MOJI;
		}
		return (String)obj;
	}
	
	
}
