/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：com.fujitsu.futurity.bp.custom.common
*   ソースファイル名：JCN050InitCompCC.java
*   作成者          ：富士通
*   日付            ：2013年01月31日
*＜機能概要＞
*   ０５０初期設定完了処理を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/01/31   FJ          新規作成
*   v5.00.01	2013/03/15   FJ)圓山   	【IT1-2013-0000XXX】サービス開始・終了年月日の登録タイミング変更対応。
*   v5.00.02	2013/04/12   FJ)木村   	 050アプリ設定状態コード変更対応。
*   v5.00.03	2013/05/02   FJ)木村   	 ソース静的解析指摘対応（static変数の使用箇所変更）
*               2013/03/28   FJ)木村     N_050APL_SHK_SETTE_RSLT_CDが"000"でない場合はエラーとする
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

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.bp.x21.cc.exception.SCCallException;
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.ECN0331A001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0331A001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0331C004CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0090001CBSMsg;

/**
 *  ０５０初期設定完了処理を行います。
 * <BR>
 * @author 富士通
 */
public class JCN050InitCompCC extends AbstractCommonComponent implements ICommonComponent
{
	/** 共通コンポーネント名 */
	public static String ccName = "JCN050InitCompCC";
	
	/** 空文字 */
	private static final String S_BLANK = "";
	
	/** SC実行結果格納用(リターンコード)*/
	private String rtnCode = "";
	
	/** SC実行結果格納用(ステータス)*/
	private int status = 0;
	
	/**
	 * 共通コンポーネント実行
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return 
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute050InitComp(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		// 入力パラメータ格納
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		
		// リターンコード格納用変数
		String rtnCd = JCNStrConst.API_RETURN_CD_00;
		
		// 返却パラメータ格納用マップ生成
		Map userResult = new HashMap();
		
		/***********************************************************/
		/** N_050APL_SHK_SETTE_RSLT_CD<>"000"の場合はエラーとする **/
		/***********************************************************/
		String setteRsltCd = (String)ccParam.get("N_050APL_SHK_SETTE_RSLT_CD");
		String sysId = (String)ccParam.get("SYSID");
		if (!"000".equals(setteRsltCd)) 
		{
			printErrorLog("コンテンツ契約050初期設定完了SCにてエラーが発生しました。" 
					+ " SYSID:" + sysId + " N_050APL_SHK_SETTE_RSLT_CD:" + setteRsltCd);
			userResult.put("RETRUN_CODE", JCNStrConst.API_RETURN_CD_99);
			setResultUserData(param, ccName, userResult);
			return param; 
		}		
		
		/******************************************/
		/** パラメータチェック                    
		 * コンテンツ契約050初期設定完了SC実行   */
		/******************************************/
		rtnCd = callECNA0090001(handle, param, ccParam);
		
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			userResult.put("RETRUN_CODE", rtnCd);
			setResultUserData(param, ccName, userResult);
			return param;
		}
		
		
		/****************************************************/
		/** 内訳ステータスチェック、内訳登録
		 * コンテンツ契約050電話番号内訳一意照会SC実行
		 * コンテンツ契約050電話番号内訳本契約登録SCの実行  */
		/****************************************************/
		rtnCd = callECN0331A001(handle, param, ccParam);
		
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			userResult.put("RETRUN_CODE", rtnCd);
			setResultUserData(param, ccName, userResult);
			return param;
		}

		userResult.put("RETRUN_CODE", rtnCd);
		setResultUserData(param, ccName, userResult);
		return param;
	}
	
	/**
	 * コンテンツ契約050初期設定完了SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @throws Throwable
	 */
	private String callECNA0090001(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		
		/****************************************************************/
		/** コンテンツ契約050初期設定完了SCへの上りマッピング           */
		/****************************************************************/
		String templateId = "ECNA0090001";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECNA0090001CBSMsg.IN_SYS_ID, (String) ccParam.get("SYSID"));
		param4serviceIf.put(ECNA0090001CBSMsg.CONT_KEI_NO, (String) ccParam.get("CONT_KEI_NO"));
		param4serviceIf.put(ECNA0090001CBSMsg.APL_HNIN_CFM_TELNO, (String) ccParam.get("N_050APL_HNIN_CFM_TELNO"));
		param4serviceIf.put(ECNA0090001CBSMsg.TANMT_USE_ENV_INFO, (String) ccParam.get("TANMT_USE_ENV_INFO"));
		param4serviceIf.put(ECNA0090001CBSMsg.APL_SHK_SETTE_RSLT_CD, (String) ccParam.get("N_050APL_SHK_SETTE_RSLT_CD"));

		HashMap<String, Object> paramMap = createScParam(param, templateId, ECNA0090001CBSMsg.class , param4serviceIf, "1");

		/***************************************************/
		/** SC呼出実行                                     */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map<?, ?> creListResult = scCall.run(paramMap, handle);
		
		// 処理結果判定
		String rtnCd = "";
		rtnCd = rtnCdEdit(creListResult);
		if(!("00".equals(rtnCd) && 0 == status)) 
		{
			printErrorLog("コンテンツ契約050初期設定完了SCにてエラーが発生しました。");
		}
		
		return rtnCd;
	}
	
	/**
	 * コンテンツ契約050電話番号内訳一意照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @return rtnCd
	 * @throws Throwable
	 */
	private String callECN0331A001(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		String rtnCd = JCNStrConst.API_RETURN_CD_00;
		/***************************************************************/
		/** コンテンツ契約050電話番号内訳一意照会SCへの上りマッピング  */
		/***************************************************************/
		String templateId = "ECN0331A001";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECN0331A001CBSMsg.KEY_SYSID, (String) ccParam.get("SYSID"));
		param4serviceIf.put(ECN0331A001CBSMsg.KEY_CONT_KEI_NO, (String) ccParam.get("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);
		// 検索エラーフラグの取得
		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		String serchErrFlg = msg.getString(ECN0331A001CBSMsg.SEARCH_ERR_FLG);
		// 該当データなしの場合は「52」該当契約番号なし
		if("1".equals(serchErrFlg))
		{
			return JCNStrConst.API_RETURN_CD_52;
		}
		
		CAANMsg[] cbsMsgList = getResultMsgList(result, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST); 
		
		if(!("0".equals(rtnCode) && 0 == status)
				|| cbsMsgList.length == 0) 
		{
			printErrorLog("コンテンツ契約050電話番号内訳一意照会SCにてエラーが発生しました。" + "(KEY:CRECARD_JIGYO_CD=" + JCNStrConst.S_CONT_JIGYO_CD + ")");
			return JCNStrConst.API_RETURN_CD_99;
		}
		
		
		for (int i = 0; i < cbsMsgList.length; i++) 
		{
			// コンテンツ契約内訳ステータス取得
			String contKeiUcwkSts = getResultString(result, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
					+  ECN0331A001CBSMsg1List.CONT_KEI_UCWK_STAT);
			
			// コンテンツ契約内訳ステータスが解約済みの場合は「52」該当契約番号なし
			if("910".equals(contKeiUcwkSts))
			{
				return JCNStrConst.API_RETURN_CD_52;
			}
			
		}
		
		/*****************************************************/
		/** コンテンツ契約050電話番号内訳内容変更の実行    */
		/*****************************************************/
		rtnCd = callECN0331C004(handle, param, ccParam, result, 0);
		
		return rtnCd;
	}
	
	/**
	 * コンテンツ契約050電話番号内訳内容変更SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @param resultList コンテンツ契約050電話番号内訳照会結果マップ
	 * @param rowNum 行番号
	 * @return rtnCd
	 * @throws Throwable
	 */
	private String callECN0331C004(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam,
			 Map<?, ?> resultList, int i) throws Throwable
	{
		String rtnCd = JCNStrConst.API_RETURN_CD_00;
		/****************************************************************/
		/** コンテンツ契約050電話番号内訳内容変更SCへの上りマッピング */
		/****************************************************************/
		String templateId = "ECN0331C004";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECN0331C004CBSMsg.CONT_KEI_UCWK_NO, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.CONT_KEI_UCWK_NO));
		param4serviceIf.put(ECN0331C004CBSMsg.CONT_KEI_UCWK_STAT, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.CONT_KEI_UCWK_STAT));
		param4serviceIf.put(ECN0331C004CBSMsg.CONT_KEI_NO, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.CONT_KEI_NO));
		param4serviceIf.put(ECN0331C004CBSMsg.SYSID, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.SYSID));
		param4serviceIf.put(ECN0331C004CBSMsg.N_050_TELNO, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050_TELNO));
		param4serviceIf.put(ECN0331C004CBSMsg.N_050APL_SIP_USER_ID, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050APL_SIP_USER_ID));
		param4serviceIf.put(ECN0331C004CBSMsg.N_050APL_SIP_USER_PWD, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050APL_SIP_USER_PWD));
		param4serviceIf.put(ECN0331C004CBSMsg.N_050APL_SETTE_STAT_CD, JCNStrConst.N_050APL_SETTE_STAT_CD_SUMI);
		param4serviceIf.put(ECN0331C004CBSMsg.N_050APL_HRADSI_REQ_CD, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050APL_HRADSI_REQ_CD));
		param4serviceIf.put(ECN0331C004CBSMsg.N_050_TELNO_HRADSI_SBT_CD, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.N_050_TELNO_HRADSI_SBT_CD));
		
		param4serviceIf.put(ECN0331C004CBSMsg.SVC_STA_DTM, JCCBPCommon.getOpeDateTimeStamp(null));
		param4serviceIf.put(ECN0331C004CBSMsg.SVC_END_DTM, JCNStrConst.S_MAX_DATE + JCNStrConst.CN_235959_TIMESTAMP );
		
		param4serviceIf.put(ECN0331C004CBSMsg.N_050APL_HNIN_CFM_TELNO, (String) ccParam.get("N_050APL_HNIN_CFM_TELNO"));
		param4serviceIf.put(ECN0331C004CBSMsg.N_050APL_HNCFM_TLN_STYMD, JCCBPCommon.getOpeDate(null));
		param4serviceIf.put(ECN0331C004CBSMsg.TANMT_USE_ENV_INFO, (String) ccParam.get("TANMT_USE_ENV_INFO"));
		param4serviceIf.put(ECN0331C004CBSMsg.TANMT_USE_ENV_INFO_STYMD, JCCBPCommon.getOpeDate(null));
		param4serviceIf.put(ECN0331C004CBSMsg.MK_FLG, getResultString(resultList, ECN0331A001CBSMsg.ECN0331A001CBSMSG1LIST + "[" + i + "]" + "." 
				+  ECN0331A001CBSMsg1List.MK_FLG));
		
		HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0331C004CBSMsg.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にてエラーが発生しました。");
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", String.valueOf(rtnCode), status);
			throw scCallEx;
		}
		
		return rtnCd;
	}
	
	/**
	 * 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);
	}
	
	/**
	 * リターンコード設定
	 * @param map サービスIF処理結果
	 * @return rtnCd リターンコード
	 */
	private String rtnCdEdit(Map<?, ?> result)
	{
		String rtnCd = JCNStrConst.API_RETURN_CD_00;
		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー項目の抽出
		String sysIdErr = msg.getString(ECNA0090001CBSMsg.IN_SYS_ID_ERR);
		String contKeiNoErr = msg.getString(ECNA0090001CBSMsg.CONT_KEI_NO_ERR);
		String telNoErr = msg.getString(ECNA0090001CBSMsg.APL_HNIN_CFM_TELNO_ERR);
		String envInfoErr = msg.getString(ECNA0090001CBSMsg.TANMT_USE_ENV_INFO_ERR);
		String setRtCdErr = msg.getString(ECNA0090001CBSMsg.APL_SHK_SETTE_RSLT_CD_ERR);
		
		// SYSIDエラーチェック
		if(!isNullOrBlank(sysIdErr))
		{
			if("E1".equals(sysIdErr))
			{
				return JCNStrConst.API_RETURN_CD_10;
			}
			if("E2".equals(sysIdErr))
			{
				return JCNStrConst.API_RETURN_CD_12;
			}
			if("E4".equals(sysIdErr))
			{
				return JCNStrConst.API_RETURN_CD_12;
			}
			if("E3".equals(sysIdErr))
			{
				return JCNStrConst.API_RETURN_CD_11;
			}
			if("EA".equals(sysIdErr))
			{
				return JCNStrConst.API_RETURN_CD_51;
			}
			if("EB".equals(sysIdErr))
			{
				return JCNStrConst.API_RETURN_CD_53;
			}
			
			if("EC".equals(sysIdErr))
			{
				return JCNStrConst.API_RETURN_CD_54;
			}
		}
		
		// コンテンツ契約番号エラーチェック
		if(!isNullOrBlank(contKeiNoErr))
		{
			if("E1".equals(contKeiNoErr))
			{
				return JCNStrConst.API_RETURN_CD_13;
			}
			if("E3".equals(contKeiNoErr))
			{
				return JCNStrConst.API_RETURN_CD_14;
			}
			if("E2".equals(contKeiNoErr))
			{
				return JCNStrConst.API_RETURN_CD_15;
			}
			if("E4".equals(contKeiNoErr))
			{
				return JCNStrConst.API_RETURN_CD_15;
			}
			if("EA".equals(contKeiNoErr))
			{
				return JCNStrConst.API_RETURN_CD_52;
			}
		}
		
		// 050アプリ本人確認用電話番号エラーチェック
		if(!isNullOrBlank(telNoErr))
		{
			if("E1".equals(telNoErr))
			{
				return JCNStrConst.API_RETURN_CD_16;
			}
			if("E3".equals(telNoErr))
			{
				return JCNStrConst.API_RETURN_CD_17;
			}
			if("E2".equals(telNoErr))
			{
				return JCNStrConst.API_RETURN_CD_18;
			}
			if("E4".equals(telNoErr))
			{
				return JCNStrConst.API_RETURN_CD_18;
			}
			if("EA".equals(telNoErr))
			{
				return JCNStrConst.API_RETURN_CD_52;
			}
		}
		
		// 端末利用環境情報エラーチェック
		if(!isNullOrBlank(envInfoErr))
		{
			if("E1".equals(envInfoErr))
			{
				return JCNStrConst.API_RETURN_CD_19;
			}
			if("E3".equals(envInfoErr))
			{
				return JCNStrConst.API_RETURN_CD_20;
			}
			if("E2".equals(envInfoErr))
			{
				return JCNStrConst.API_RETURN_CD_21;
			}
			if("E4".equals(envInfoErr))
			{
				return JCNStrConst.API_RETURN_CD_21;
			}
		}
		
		// 050初期設定結果コードエラーチェック
		if(!isNullOrBlank(setRtCdErr))
		{
			if("E1".equals(setRtCdErr))
			{
				return JCNStrConst.API_RETURN_CD_22;
			}
			if("E3".equals(setRtCdErr))
			{
				return JCNStrConst.API_RETURN_CD_23;
			}
			if("E2".equals(setRtCdErr))
			{
				return JCNStrConst.API_RETURN_CD_24;
			}
			if("E4".equals(setRtCdErr))
			{
				return JCNStrConst.API_RETURN_CD_24;
			}
		}
		
		return rtnCd;
	}
	
	
	/**
     * メソッド名  ：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 } , "");
	}
}
