/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：com.fujitsu.futurity.bp.custom.common
*   ソースファイル名：JCNSmlnPpOpCheckCC.java
*   作成者          ：富士通
*   日付            ：2014年07月28日
*＜機能概要＞
*   スマートリンクプレミアムパックオプション保持チェック
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v10.00.00   2014/07/28   FJ)味岡     新規作成
*   v10.00.01   2014/08/29   FJ)味岡     ANK-2139-01-00:eoスマートリンクプレミアムパック解約簡易化改善案件
*
**********************************************************************/

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.custom.constant.CNSV0049_CNSV0049OP_CNSV004901CC;
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.cc.exception.SCCallException;
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.EKK0351B514CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B514CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0111B002CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0111B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B003CBSMsg1List;


/**
 *  ０５０番号仮発行処理を行います。
 * <BR>
 * @author 富士通
 */
public class JCNSmlnPpOpCheckCC extends AbstractCommonComponent implements ICommonComponent
{
	/** 共通コンポーネント名 */
	public static String ccName = "CNSV004901CC";
	
	/** テンプレートID：ファミリー会員グループ一覧照会（SYSID） */
	private static final String TEMPLATE_FAMILY_GL_ICHIRAN = "ECK0111B002";
	
	/** テンプレートID：サービス契約一覧照会（SYSID） */
	private static final String TEMPLATE_SVC_KEI_ICHIRAN = "EKK0081B003";
	
	/** テンプレートID：解約済以外サービス契約一覧照会（SYSID） */
	private static final String TEMPLATE_OP_SVC_KEI = "EKK0351B514";
	
	/** SC実行結果格納用(リターンコード)*/
	private String rtnCode = "";
	
	/** SC実行結果格納用(ステータス)*/
	private int status = 0;
	
	private String OPEDATE = "";
	
	/**
	 * 共通コンポーネント実行
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return 
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeSmlnPpOpCheckCC(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		// 入力パラメータ格納
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		
		// 運用日付の取得
		OPEDATE = JCCBPCommon.getOpeDate(null);

		// 返却パラメータ格納用マップ生成
		Map userResult = new HashMap();
		
		// INPUTパラメータを取得する
		String inSysid = (String) ccParam.get("SYSID");
		String inMemberSbtCd = (String) ccParam.get("MEMBER_SBT_CD");

		// ANK-2139-01-00 MOD START
		// 会員種別を判定し、ファミリー会員の場合は
		// ECK0111B002_ファミリー会員グループ一覧照会（SYSID）を実行
		if("11".equals(inMemberSbtCd) || "21".equals(inMemberSbtCd))
		{
		// ANK-2139-01-00 MOD END
			// グループリーダーSYSIDが取得できれば値を上書きする
			String glSysid = familyGLSysidGet(handle, param, ccParam);
			if(!"0".equals(glSysid))
			{
				inSysid = glSysid;
			}
		}
		
		// 取得したSYSIDを使用しプレミアムパックオプションの有無をチェック
		String ppOpFlg = ppOpCheck(handle, param, inSysid);
		
		userResult.put(CNSV0049_CNSV0049OP_CNSV004901CC.RETURN_CD, ppOpFlg);
		
		setResultUserData(param, ccName, userResult);
		return param;
	}

	/**
	 * ファミリー会員の親のSYSIDの取得を行う
	 * ※オープン会員の場合はスマートリンクコンテンツは解約済みのはずであるが、チェックは実施する
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @return 取得したSYSID
	 * @throws Throwable
	 */
	private String familyGLSysidGet(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		// **************************************************
		// _ECK0111B002:ファミリー会員グループ一覧照会（SYSID）
		// **************************************************
		Map<?, ?> rsvListMap = callfamlyGLSysidSc(handle, param, ccParam);
		boolean bRsvCheck = true;
		String rtnSysid = "0";
		
		// 処理結果の判定を行う。
		if (rsvListMap == null)
		{
			// データなしの場合は呼び出し元へ返却
			return rtnSysid;
		}
		else
		{
			// 処理結果判定
			resultChkSc(rsvListMap);
			// 検索エラーフラグの取得
			CAANMsg[] templates = (CAANMsg[]) rsvListMap.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg msg = templates[0];
			// 検索エラーフラグが存在するか？
			String serchErrFlg = msg.getString(ECK0111B002CBSMsg.SEARCH_ERR_FLG);
			if(("1".equals(serchErrFlg)))
			{
				// グループリーダーSYSIDが存在しないことはエラーではない。
				// この場合は後続処理は実行不要。
				bRsvCheck = false;
			}
			if(!("0".equals(rtnCode) && 0 == status))
			{
				printErrorLog("ファミリー会員グループ一覧照会（SYSID）SCにてエラーが発生しました。" + "(rtnCode=" + rtnCode + ":status=" + status + ")");
				return rtnSysid;
			}
		}
		// 返却Sysidが初期値の場合、値を取得する
		if (bRsvCheck)
		{
			// ファミリー会員グループ一覧照会（SYSID）SCの戻り値から一覧を取得する。
			CAANMsg[] inList = getResultMsgList(rsvListMap, ECK0111B002CBSMsg.ECK0111B002CBSMSG1LIST); 
			for (int i = 0; i < inList.length; i++ )
			{
				rtnSysid = inList[i].getString(ECK0111B002CBSMsg1List.GRP_LEADER_SYSID);
				
				// rtnSysidの値が取得できた場合処理をbreak
				if ("0".equals(rtnSysid))
				{
					break;
				}
			}
			
			if ("0".equals(rtnSysid))
			{
				// リターンコードが初期値の場合は呼び出し元へ返却
				// Exception発生させてロールバック
				SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnSysid, status);
				throw scCallEx;
			}
		}
		
		// リターンコードを呼び出し元へ返却
		return rtnSysid;
	}
	
	/**
	 * SYSIDをもとにeoスマートリンクプレミアムパックオプションの有無をチェックする
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param sysid 取得したSYSID
	 * @return オプションの有無(オプション有:1、オプション無:0)
	 * @throws Throwable
	 */
	private String ppOpCheck(SessionHandle handle, IRequestParameterReadWrite param, String sysid) throws Throwable
	{
		// リターンフラグはオプション無として初期化する
		String rtn_flg = "0";
		
		// **************************************************
		// EKK0081B003:サービス契約一覧照会（SYSID）
		// **************************************************
		Map<?, ?> svcKeiListMap = svcKeiInfoGetSc(handle, param, sysid);
		
		// 処理結果の判定を行う。
		if (svcKeiListMap == null)
		{
			// データなしの場合は契約データ無(オプションも存在無し)として呼び出し元へ返却
			rtn_flg = "0";
			return rtn_flg;
		}
		else
		{
			// 処理結果判定
			resultChkSc(svcKeiListMap);
			// 検索エラーフラグの取得
			CAANMsg[] templates = (CAANMsg[]) svcKeiListMap.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg msg = templates[0];
			// 検索エラーフラグが存在するか？
			String serchErrFlg = msg.getString(EKK0081B003CBSMsg.SEARCH_ERR_FLG);
			if(("1".equals(serchErrFlg)))
			{
				// サービス契約データが存在しないことはエラーではない。
				// この場合は後続処理は実行不要。
				rtn_flg = "0";
				return rtn_flg;
			}
			if(!("0".equals(rtnCode) && 0 == status))
			{
				printErrorLog("サービス契約一覧照会（SYSID）SCにてエラーが発生しました。" + "(rtnCode=" + rtnCode + ":status=" + status + ")");
				rtn_flg = "2";
				return rtn_flg;
			}
		}
		
		//EKK0081B003:サービス契約一覧照会（SYSID）SCの戻り値から一覧を取得する。
		CAANMsg[] inList = getResultMsgList(svcKeiListMap, EKK0081B003CBSMsg.EKK0081B003CBSMSG1LIST); 
		for (int i = 0; i < inList.length; i++ )
		{
			String strSvcCd   = inList[i].getString(EKK0081B003CBSMsg1List.SVC_CD);
			String strSvcKeiStat = inList[i].getString(EKK0081B003CBSMsg1List.SVC_KEI_STAT);
			String strSvcKeiNo = inList[i].getString(EKK0081B003CBSMsg1List.SVC_KEI_NO);
			
			// eo光ネットかつ解約以外の場合、オプションサービス契約のSIFを実行する
			if("01".equals(strSvcCd) && ("010".equals(strSvcKeiStat)
					|| "020".equals(strSvcKeiStat)
					|| "030".equals(strSvcKeiStat)
					|| "100".equals(strSvcKeiStat)
					|| "210".equals(strSvcKeiStat)
					|| "220".equals(strSvcKeiStat)))
			{
				// **************************************************
				// EKK0351B514:解約済以外サービス契約一覧照会（SYSID）
				// **************************************************
				Map<?, ?> opSvcKeiListMap = opSvcKeiInfoGetSc(handle, param, strSvcKeiNo);
				
				// 処理結果の判定を行う。
				if (opSvcKeiListMap == null)
				{
					// データなしの場合は契約データ無(オプションも存在無し)として呼び出し元へ返却
					rtn_flg = "0";
					return rtn_flg;
				}
				else
				{
					// 処理結果判定
					resultChkSc(opSvcKeiListMap);
					// 検索エラーフラグの取得
					CAANMsg[] templates = (CAANMsg[]) opSvcKeiListMap.get(JCMConstants.TEMPLATE_LIST_KEY);
					CAANMsg msg = templates[0];
					// 検索エラーフラグが存在するか？
					String serchErrFlg = msg.getString(EKK0351B514CBSMsg.SEARCH_ERR_FLG);
					if(("1".equals(serchErrFlg)))
					{
						// サービス契約データが存在しないことはエラーではない。
						// この場合は後続処理は実行不要。
						rtn_flg = "0";
						return rtn_flg;
					}
					if(!("0".equals(rtnCode) && 0 == status))
					{
						printErrorLog("解約済以外サービス契約一覧照会（SYSID）SCにてエラーが発生しました。" + "(rtnCode=" + rtnCode + ":status=" + status + ")");
						rtn_flg = "2";
						return rtn_flg;
					}
				}
				
				//EKK0081B003:サービス契約一覧照会（SYSID）SCの戻り値から一覧を取得する。
				CAANMsg[] inList2 = getResultMsgList(opSvcKeiListMap, EKK0351B514CBSMsg.EKK0351B514CBSMSG1LIST); 
				for (int i2 = 0; i2 < inList2.length; i2++ )
				{
					// ANK-2139-01-00 MOD START
					String strOpSvcKeiStat = inList2[i2].getString(EKK0351B514CBSMsg1List.OP_SVC_KEI_STAT);
					// ANK-2139-01-00 MOD END
					
					// オプションサービス契約ステータスのチェック
					if("010".equals(strOpSvcKeiStat)
						|| "020".equals(strOpSvcKeiStat)
						|| "030".equals(strOpSvcKeiStat)
						|| "100".equals(strOpSvcKeiStat)
						|| "210".equals(strOpSvcKeiStat)
						|| "220".equals(strOpSvcKeiStat))
					{
						// 契約中のデータである場合、データ有とみなし、フラグをONとして処理終了
						rtn_flg = "1";
						break;
					}
				}
			}
		}
		
		if ("2".equals(rtn_flg))
		{
			// リターンコードが初期値の場合は呼び出し元へ返却
			// Exception発生させてロールバック
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtn_flg, status);
			throw scCallEx;
		}
		
		return rtn_flg;
	}

	/**
	 * ECK0111B002_ファミリー会員グループ一覧照会（SYSID）SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callfamlyGLSysidSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_FAMILY_GL_ICHIRAN;;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// KEY_SYSID
		paramIf.put(ECK0111B002CBSMsg.KEY_SYSID, (String)ccParam.get("SYSID"));
		
		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, ECK0111B002CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		return result;
	}

	/**
	 * EKK0081B003_サービス契約一覧照会（SYSID）SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> svcKeiInfoGetSc(SessionHandle handle, IRequestParameterReadWrite param, String sysid) throws Throwable
	{
		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_SVC_KEI_ICHIRAN;;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// KEY_SYSID
		paramIf.put(EKK0081B003CBSMsg.KEY_SYSID, sysid);
		
		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EKK0081B003CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		return result;
	}

	/**
	 * EKK0351B514_解約済以外サービス契約一覧照会（SYSID）SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> opSvcKeiInfoGetSc(SessionHandle handle, IRequestParameterReadWrite param, String svcKeiNo) throws Throwable
	{
		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_OP_SVC_KEI;;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// KEY_SVC_KEI_NO
		paramIf.put(EKK0351B514CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		// KEY_OP_SVC_CD
		paramIf.put(EKK0351B514CBSMsg.KEY_OP_SVC_CD, "B077");
		// KEY_BASE_YMD
		paramIf.put(EKK0351B514CBSMsg.KEY_BASE_YMD, OPEDATE);
		
		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EKK0351B514CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		return result;
	}

	/**
	 * 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 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 } , "");
	}
}
