/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：com.fujitsu.futurity.bp.custom.common
*   ソースファイル名：JCN050KariHakkoCC.java
*   作成者          ：富士通
*   日付            ：2013年01月31日
*＜機能概要＞
*   ０５０番号仮発行処理を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/01/31   FJ          新規作成
*   v5.00.01	2013/05/02   FJ)木村   	 ソース静的解析指摘対応（static変数の使用箇所変更）
*   v5.00.02	2013/10/16   FJ)味岡   	【 OM-2013-0003236】性能対応(サービス区分バインド変数削除)
*   v8.00.00	2014/01/07   FJ)味岡   	【  ANK-00-00-1585】LC複数契約化対応により電話番号を複数件払い出せるよう改修実施
*
**********************************************************************/

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.CNSV0044_CNSV0044OP_CNSV004401CC;
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.ECNA0060001CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0181B030CBSMSG1LIST;
import eo.ejb.cbs.cbsmsg.EZM0181B030CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0181E010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0331B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0331B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0111B070CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0111B070CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0121B050CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0121B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0181D010CBSMsg;


/**
 *  ０５０番号仮発行処理を行います。
 * <BR>
 * @author 富士通
 */
public class JCN050KariHakkoCC extends AbstractCommonComponent implements ICommonComponent
{
	/** 共通コンポーネント名 */
	public static String ccName = "JCN050KariHakkoCC";
	
	/** テンプレートID：050電話番号予約一覧照会 */
	private static final String TEMPLATE_050TEL_YOYAKU_ICHIRAN = "EZM0181B030";
	
	/** テンプレートID：電話番号予約削除 */
	private static final String TEMPLATE_TELNO_RSV_DEL = "EZM0181E010";

	/** 空文字 */
	private static final String S_BLANK = "";
	
	/** SC実行結果格納用(リターンコード)*/
	private String rtnCode = "";
	
	/** SC実行結果格納用(ステータス)*/
	private int status = 0;
	
	// 電話番号予約有効期限
	private String telnoRsvYkKigen = "";
	
	// 電話番号予約上限数
	private int telnoRsvMaxNo = 0;
	
	// 電話番号復活対象件数
	private int telnoReNo = 0;
	
	private String OPEDATE = "";
	private String n050TelNo = "";

	// 仮発行情報格納用List
	@SuppressWarnings("unchecked")
	private List dataList = new ArrayList();
	
	/**
	 * 共通コンポーネント実行
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return 
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute050KariHakko(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		n050TelNo = "";
		
		// 入力パラメータ格納
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);

		// リターンコード格納用変数
		String rtnCd = JCNStrConst.API_RETURN_CD_00;
		
		// 運用日付の取得
		OPEDATE = JCCBPCommon.getOpeDate(null);

		// 電話番号予約有効期限の取得
		rtnCd = getRsvYukoKigen(handle, param, ccParam);

		// 返却パラメータ格納用マップ生成
		Map userResult = new HashMap();
		userResult.put("N_050_TELNO_HRADSI_SBT_CD", "");
		userResult.put("N_050APL_HRADSI_REQ_CD", "");
		userResult.put("N_050_TELNO", "");
		
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			userResult.put(CNSV0044_CNSV0044OP_CNSV004401CC.RETURN_CODE, rtnCd);
			setResultUserData(param, ccName, userResult);
			return param;
		}

		// 電話番号予約上限数の取得
		rtnCd = getRsvYoyakuMax(handle, param, ccParam);
		
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			userResult.put(CNSV0044_CNSV0044OP_CNSV004401CC.RETURN_CODE, rtnCd);
			setResultUserData(param, ccName, userResult);
			return param;
		}

		/******************************************/
		/** パラメータチェック                    
		 * コンテンツ契約050番号仮発行SC実行      */
		/******************************************/
		rtnCd = callKariHakkoSc(handle, param, ccParam);
		
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			userResult.put(CNSV0044_CNSV0044OP_CNSV004401CC.RETURN_CODE, rtnCd);
			setResultUserData(param, ccName, userResult);
			return param;
		}
		
		// 新規払出実行フラグを落としておく。
		boolean sinkiFlag = false;
		
		// 050アプリ払出依頼コードが番号復活か？
		String hradsiReqCd = (String) ccParam.get("N_050APL_HRADSI_REQ_CD");
		if(JCNStrConst.N_050APL_HRADSI_REQ_CD_FUKKATU.equals(hradsiReqCd) || 
				JCNStrConst.N_050APL_HRADSI_REQ_CD_KONZAI.equals(hradsiReqCd))
		{
			/******************************************************************/
			/** 050電話番号の復活処理                                         */
			/******************************************************************/
			rtnCd = fukkatsu050Number(handle, param, ccParam);
			
			if(JCNStrConst.API_RETURN_CD_52.equals(rtnCd))
			{
				sinkiFlag = true;	// 新規払出実行フラグを上げる。
			}
			
			// 処理コード 3:新規復活混在のみ
			// 電話番号払出し上限数 - 復活対象件数の結果が0件より大きい場合は件数分の払出しを行う
			if( 0 < (telnoRsvMaxNo - telnoReNo) && JCNStrConst.N_050APL_HRADSI_REQ_CD_KONZAI.equals(hradsiReqCd) )
			{
				telnoRsvMaxNo = telnoRsvMaxNo - telnoReNo;
				sinkiFlag = true;	// 新規払出実行フラグを上げる。
			}
		}
		else
		{
			sinkiFlag = true;		// 新規払出実行フラグを上げる。
		}
		
		// 新規払出実行フラグtrue?
		if(sinkiFlag){
			/******************************************************************/
			/** 050電話番号の新規払出処理                                     */
			/******************************************************************/
			rtnCd = hakko050Number(handle, param, ccParam);
//			if(JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
//			{
//				userResult.put("N_050_TELNO_HRADSI_SBT_CD", JCNStrConst.N_050APL_HRADSI_SBT_CD_SINKI);
//			}
//		}else{
//			if(JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
//			{
//				userResult.put("N_050_TELNO_HRADSI_SBT_CD", JCNStrConst.N_050APL_HRADSI_SBT_CD_FUKKATU);
//			}
		}

		userResult.put(CNSV0044_CNSV0044OP_CNSV004401CC.RETURN_CODE, rtnCd);
		userResult.put(CNSV0044_CNSV0044OP_CNSV004401CC.N_050APL_HRADSI_REQ_CD_IN, hradsiReqCd);
		if(JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			userResult.put(CNSV0044_CNSV0044OP_CNSV004401CC.N_050_TELNO_KARIHAKKO_LIST, dataList);
		}
		setResultUserData(param, ccName, userResult);
		return param;
	}

	/**
	 * 050番号の復活処理
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @return 050番号の復活結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private String fukkatsu050Number(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		/******************************************************************/
		/** コンテンツ契約050電話番号内訳一覧照会のサービスI/Fを呼び出す。*/
		/******************************************************************/
		ArrayList<String> fukkatuNoList = new ArrayList();
		String rtnCd = callGetUcwkListSc(handle, param, ccParam, fukkatuNoList);

		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			return rtnCd;
		}
		
		// 復活可能番号が存在するか？
		if(fukkatuNoList.size() <= 0)
		{
			// コンテンツ契約内訳が存在しない旨のエラーを返す。
			return JCNStrConst.API_RETURN_CD_52;
		}

		// **************************************************
		// 050電話番号予約一覧照会SCの実行
		// **************************************************
		Map<?, ?> rsvListMap = callGetRsvListSc(handle, param, ccParam);
		boolean bRsvCheck = true;
		
		// 処理結果の判定を行う。
		if (rsvListMap == null)
		{
			// データなしの場合は呼び出し元へ返却
			rtnCd = JCNStrConst.API_RETURN_CD_99;
			return rtnCd;
		}
		else
		{
			// 処理結果判定
			resultChkSc(rsvListMap);
			// 検索エラーフラグの取得
			CAANMsg[] templates = (CAANMsg[]) rsvListMap.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg msg = templates[0];
			// 検索エラーフラグが存在するか？
			String serchErrFlg = msg.getString(EZM0121B050CBSMsg.SEARCH_ERR_FLG);
			if(("1".equals(serchErrFlg)))
			{
				// 電話番号の予約が存在しないことはエラーではない。
				// この場合は後続の既存予約の確認と削除処理は実行不要。
				bRsvCheck = false;
			}
			if(!("0".equals(rtnCode) && 0 == status))
			{
				printErrorLog("050電話番号予約一覧照会SCにてエラーが発生しました。" + "(rtnCode=" + rtnCode + ":status=" + status + ")");
				return JCNStrConst.API_RETURN_CD_99;
			}
		}
		// 復活対象の電話番号が、既に予約されているかを確認する。もし存在すれば削除してから再度予約する。
		if (bRsvCheck) {
			// 050電話番号予約一覧照会SCの戻り値から一覧を取得する。
			CAANMsg[] inList = getResultMsgList(rsvListMap, EZM0181B030CBSMsg.EZM0181B030CBSMSG1LIST); 
			// **************************************************
			// 取得した一覧の中に、復活対象の電話番号が存在するかチェック
			// **************************************************
			// 電話番号予約開始年月日時分秒が最も新しい情報
			CAANMsg telMap = null;
			for (int i = 0; i < inList.length; i++ )
			{
				String curTelNo = inList[i].getString(EZM0181B030CBSMSG1LIST.TELNO); 
				if (fukkatuNoList.contains(curTelNo))
				{
					// 復活対象の電話番号が存在したら、その情報を取得
					telMap = inList[i];
					
					if (telMap != null) {
						// 復活対象の電話番号予約を取得する。
						Map<?, ?> inMap = telMap.getHashMap(); 
						// **************************************************
						// 既に復活対象の電話番号予約が存在する場合は削除
						// **************************************************
						Map<?, ?> rsvRmvResultMap = callRmvRsvSc(handle, param, inMap);
						// 結果取得
						rtnCd = rsvRmvResultMap.get(JCMConstants.RET_CD_INT_KEY).toString();
						resultChkSc(rsvRmvResultMap);
						// リターンコード、ステータスの内容を見て処理結果の判定を行う。
						if (!("0".equals(rtnCd) && 0 == status)) 
						{
							// リターンコード、ステータスが0でない場合、ループを強制終了
							rtnCd = JCNStrConst.API_RETURN_CD_99;
							break;
						}
						else
						{
							rtnCd = JCNStrConst.API_RETURN_CD_00;
						}
					}
				}
			}
			
			if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
			{
				// リターンコードが00以外の場合は呼び出し元へ返却
				// Exception発生させてロールバック
				SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCd, status);
				throw scCallEx;
			}
		}
		
		// 電話番号予約登録SCの実行
		for(int i = 0; i < fukkatuNoList.size();  i++)
		{
			
			// 仮発行電話番号、050電話番号払出し種別コード格納用Map
			Map recMap = new HashMap();
			
			String[] telnoErr = new String[1];
			rtnCd = callRegNumberSc(handle, param, ccParam, JCNStrConst.N_050APL_HRADSI_SBT_CD_FUKKATU, fukkatuNoList.get(i) ,telnoErr);
			
			// リターンコードが0であっても
			if(JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
			{
				// 指定された「電話番号」が存在するエラー
				if("EA".equals(telnoErr[0]))
				{
					// 新規払出しとするため、コンテンツ契約内訳が存在しない旨のエラーを返す。
					return JCNStrConst.API_RETURN_CD_52;
				}
				n050TelNo =  fukkatuNoList.get(i);
				
				recMap.put(CNSV0044_CNSV0044OP_CNSV004401CC.N_050_TELNO, n050TelNo);
				recMap.put(CNSV0044_CNSV0044OP_CNSV004401CC.N_050_TELNO_HRADSI_SBT_CD, JCNStrConst.N_050APL_HRADSI_SBT_CD_FUKKATU);
				dataList.add(recMap);
			}
			
			// 予約登録実施毎に予約件数をカウントアップ
			telnoReNo++;
		}
		
		// リターンコードを呼び出し元へ返却
		return rtnCd;
	}

	/**
	 * 050番号の新規払出処理
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @return 050番号の新規払出結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private String hakko050Number(SessionHandle handle,
			IRequestParameterReadWrite param, Map<String, Object> ccParam)
			throws Throwable {
		String rtnCd = JCNStrConst.API_RETURN_CD_00;

		for (;;) {

			/******************************************************************/
			/** 050電話番号一覧照会SCの実行 */
			/******************************************************************/
			String[] n_050TelNo = new String[telnoRsvMaxNo];
			rtnCd = callGetRndNumberSc(handle, param, ccParam, n_050TelNo);
			
			// リターンコードが00以外の場合はそのまま呼び出し元へ返却(含電話番号枯渇)
			if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd)) {
				return rtnCd;
			}

			// 電話番号予約登録SCの実行
			String[] telnoErr = new String[telnoRsvMaxNo];
			for(int i = 0; i < telnoRsvMaxNo; i++)
			{
				rtnCd = callRegNumberSc(handle, param, ccParam, JCNStrConst.N_050APL_HRADSI_SBT_CD_SINKI, n_050TelNo[i], telnoErr);
				
				// エラー有?
				if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd)) {
					// 指定された「電話番号」が存在するエラー?
					if("EA".equals(telnoErr[i]))
					{
						continue;		// 他端末との競合が発生したとみなし、再試行。
					}
				}
				n050TelNo = n_050TelNo[i];
				// 新規払出し電話番号格納用Map
				Map recMap = new HashMap(); 
				recMap.put(CNSV0044_CNSV0044OP_CNSV004401CC.N_050_TELNO, n050TelNo);
				recMap.put(CNSV0044_CNSV0044OP_CNSV004401CC.N_050_TELNO_HRADSI_SBT_CD, JCNStrConst.N_050APL_HRADSI_SBT_CD_SINKI);
				dataList.add(recMap);
			}
			return rtnCd;		// それ以外のエラーはそのまま呼び出し元へ返却
		}
	}

	
	/**
	 * コンテンツ契約050電話番号内訳一覧照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @param fukkatuNo 復活させた050電話番号
	 * @return 処理結果
	 * @throws Throwable
	 */
	private String callGetUcwkListSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam, ArrayList<String> fukkatuNoList) throws Throwable
	{
		String rtnCd = JCNStrConst.API_RETURN_CD_00;
		
//		fukkatuNoList = null;
		/***************************************************************/
		/** コンテンツ契約050電話番号内訳一覧照会SCへの上りマッピング  */
		/***************************************************************/
		String templateId = "ECN0331B001";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECN0331B001CBSMsg.KEY_SYSID, (String) ccParam.get("SYSID"));

		
		HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0331B001CBSMsg.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];
		CAANMsg[] cbsMsgList = getResultMsgList(result, ECN0331B001CBSMsg.ECN0331B001CBSMSG1LIST); 

		// 検索エラーフラグが存在するか？
		String serchErrFlg = msg.getString(ECN0331B001CBSMsg.SEARCH_ERR_FLG);
		if(("1".equals(serchErrFlg)) || ("2".equals(serchErrFlg)) ||("3".equals(serchErrFlg))||(cbsMsgList.length == 0))
		{
			// 復活番号の元ネタがないことは、エラーではない。
			return JCNStrConst.API_RETURN_CD_52;
		}

		
		if(!("0".equals(rtnCode) && 0 == status)) 
		{
			printErrorLog("コンテンツ契約050電話番号内訳一覧照会SCにてエラーが発生しました。" + "(rtnCode=" + rtnCode + ":status=" + status + ")");
			return JCNStrConst.API_RETURN_CD_99;
		}
		

		// 050電話番号のエイジング回復可能期間を取得する。
		String[] gyoPara = new String[1];
		rtnCd = callGetGyoParaSc(handle, param, ccParam, JCNStrConst.ZM0321_050_KIHK_PSB_PRD, gyoPara);
		
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			return rtnCd;
		}
		int addDate = Integer.parseInt(gyoPara[0]) * -1;

		// 運用日付よりエイジング回復可能期間分前の日付を取得
		String strDate = JCCBPCommon.addDay(OPEDATE, addDate);

		// 数値に変換しておく※1
		int diffDate = Integer.parseInt(strDate);
		String[] agingStatus = new String[1];
		// コンテンツ契約050電話番号内訳一覧照会SCではコンテンツ契約番号が昇順にソートされてるので、一番大きいものから取る。
		for (int i = cbsMsgList.length - 1; i >= 0; i--) 
		{
			// コンテンツ契約内訳のサービス終了年月日時分秒を取得
			String svcEndDtm = getResultString(result, ECN0331B001CBSMsg.ECN0331B001CBSMSG1LIST + "[" + i + "]" + "." 
					+  ECN0331B001CBSMsg1List.SVC_END_DTM);
			
//			// サービス終了年月日時分秒が取得出来なければ、解約前のデータが存在しているためエラー終了する
//			// この制約は、１つの利用者（SYSID）につき、１つの050電話番号契約のみを許容するという前提による。
			if (svcEndDtm == null) {
//				return JCNStrConst.API_RETURN_CD_99;
				// 契約中のデータは復活処理対象外
				continue;
			}

			String svcEndDt2 = svcEndDtm.substring(0,8);	// 時間以下は切り捨て
			
			// サービス終了年月日を数値に変換
			int svEndDate = Integer.parseInt(svcEndDt2);
			
			// それが※１より、小さければ（日付が古ければ）処理対象外
			if(svEndDate < diffDate){
				continue;
			}

			// コンテンツ契約内訳の050電話番号取得
			String n_050TelNo = getResultString(result, ECN0331B001CBSMsg.ECN0331B001CBSMSG1LIST + "[" + i + "]" + "." 
					+  ECN0331B001CBSMsg1List.N_050_TELNO);

			// エイジング一覧照会を実行する
			rtnCd = callGetAgingSc(handle, param, ccParam, n_050TelNo, agingStatus);

			// リターンコードが00以外の場合はそのまま呼び出し元へ返却
			if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
			{
				return rtnCd;
			}

			// エイジングステータスが回復可能でなければ処理対象外
			if(!JCNStrConst.CN_050_AGING_STATUS_KAIHK.equals(agingStatus[0]))
			{
				continue;
			}
			
			// 復活リストに電話番号が含まれていれば、設定しない。
			if (!fukkatuNoList.contains(n_050TelNo))
			{
				fukkatuNoList.add(n_050TelNo);
			}
			//			break;
			
		}
		
		return rtnCd;
	}

	/**
	 * 050番号エイジング一覧照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @param n_050TelNo 050電話番号
	 * @param agingStatus エイジングステータス
	 * @throws Throwable
	 */
	private String callGetAgingSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam, String n_050TelNo, String[] agingStatus) throws Throwable
	{
		// リターンコード格納用変数
		String rtnCd = JCNStrConst.API_RETURN_CD_00;

		/****************************************************************/
		/** 050番号エイジング一覧照会SCへの上りマッピング           */
		/****************************************************************/
		String templateId = "EZM0111B070";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(EZM0111B070CBSMsg.KEY_N_050_TELNO,n_050TelNo);
		param4serviceIf.put(EZM0111B070CBSMsg.KEY_AGING_SBT_CD, JCNStrConst.CN_050_AGING_KIND_CD);

		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0111B070CBSMsg.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];
		CAANMsg[] cbsMsgList = getResultMsgList(result, EZM0111B070CBSMsg.EZM0111B070CBSMSG1LIST); 

		// エイジングのレコードの有無の判定
		String serchErrFlg = msg.getString(EZM0111B070CBSMsg.SEARCH_ERR_FLG);
		if("1".equals(serchErrFlg)||(cbsMsgList.length == 0))
		{
			agingStatus[0] = "";		// エイジングステータスを空白にする。
			return rtnCd;
		}

		if(!("0".equals(rtnCode) && 0 == status)) 
		{
			printErrorLog("050番号エイジング一覧照会SCにてエラーが発生しました。" + "(rtnCode=" + rtnCode + ":status=" + status + ")");
			return JCNStrConst.API_RETURN_CD_99;
		}
		
		// エイジングステータス取得
		agingStatus[0] = getResultString(result, EZM0111B070CBSMsg.EZM0111B070CBSMSG1LIST + "[0]" + "." 
				+  EZM0111B070CBSMsg1List.AGING_STAT);


		return rtnCd;
	}

	/**
	 * 050電話番号一覧照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @return n_050TelNo 照会した050電話番号
	 * @throws Throwable
	 */
	private String callGetRndNumberSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam, String[] n_050TelNo) throws Throwable
	{
		String rtnCd = JCNStrConst.API_RETURN_CD_00;

		/***************************************************************/
		/** 050電話番号一覧照会SCへの上りマッピング                    */
		/***************************************************************/
		String templateId = "EZM0121B050";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(EZM0121B050CBSMsg.KEY_N_050_TELNO_HRADSI_CNT, String.valueOf(telnoRsvMaxNo));
//		param4serviceIf.put(EZM0121B050CBSMsg.KEY_SVC_DIV,JCNStrConst.CN_TELNO_SERVICE_KND_050);
		
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0121B050CBSMsg.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(EZM0121B050CBSMsg.SEARCH_ERR_FLG);
		if(("1".equals(serchErrFlg)) || ("3".equals(serchErrFlg)))
		{
			printErrorLog("050電話番号一覧照会SCにてエラーが発生しました。" + "(serchErrFlg=" + serchErrFlg  + status + ")");
			return JCNStrConst.API_RETURN_CD_54;
		}

		if(!("0".equals(rtnCode) && 0 == status))
		{
			printErrorLog("050電話番号一覧照会SCにてエラーが発生しました。" + "(rtnCode=" + rtnCode + ":status=" + status + ")");
			return JCNStrConst.API_RETURN_CD_99;
		}

		// 戻り値から０５０電話番号を取得する。
		CAANMsg[] inMap = getResultMsgList(result, EZM0121B050CBSMsg.EZM0121B050CBSMSG1LIST);
		
		for( int i = 0; i < inMap.length; i++)
		{
			n_050TelNo[i] = getResultString(result, EZM0121B050CBSMsg.EZM0121B050CBSMSG1LIST + "[" + i + "]" + "." 
					+  EZM0121B050CBSMsg1List.N_050_TELNO);
		}
			// ０５０電話番号取得
	//		n_050TelNo[0] = msg.getString(EZM0121B050CBSMsg1List.N_050_TELNO);
		
		
		return rtnCd;
	}

	/**
	 * 電話番号予約有効期限の取得
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @throws Throwable
	 */
	private String getRsvYukoKigen(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		// リターンコード格納用変数
		String rtnCd = JCNStrConst.API_RETURN_CD_00;

		// 電話番号予約有効期限の日数を業務パラメータより取得する
		String[] ykKigenDays = new String[1];

		rtnCd = callGetGyoParaSc(handle, param, ccParam, JCNStrConst.ZM0321_050_RSV_YK_PRD, ykKigenDays);
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			return rtnCd;
		}

		// 運用日付に予約有効期限を足す。
		telnoRsvYkKigen = JCCBPCommon.addDay(OPEDATE, Integer.parseInt(ykKigenDays[0]));

		return rtnCd;
	}

	/**
	 * 電話番号予約上限数の取得
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @throws Throwable
	 */
	private String getRsvYoyakuMax(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		// リターンコード格納用変数
		String rtnCd = JCNStrConst.API_RETURN_CD_00;

		// 電話番号予約上限数を業務パラメータより取得する
		String[] yoyakuMaxNo = new String[1];

		rtnCd = callGetGyoParaSc(handle, param, ccParam, JCNStrConst.ZM0321_050_RSV_MAX_NO, yoyakuMaxNo);
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			return rtnCd;
		}

		// 電話番号予約払出し上限数を設定する
		telnoRsvMaxNo = Integer.parseInt(yoyakuMaxNo[0]);

		return rtnCd;
	}

	/**
	 * 050電話番号予約一覧照会SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callGetRsvListSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_050TEL_YOYAKU_ICHIRAN;;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// KEY_電話番号予約ステータス
		paramIf.put(EZM0181B030CBSMsg.KEY_TELNO_RSV_STAT, JCNStrConst.TELNO_RSV_STAT_RESERVED);

		// KEY_SYSID
		paramIf.put(EZM0181B030CBSMsg.KEY_SYSID, (String)ccParam.get("SYSID"));
		
		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0181B030CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		return result;
	}

	/**
	 * 電話番号予約削除SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param inMap パラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callRmvRsvSc(SessionHandle handle, IRequestParameterReadWrite param ,Map<?,?> inMap) throws Throwable
	{
		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_TELNO_RSV_DEL;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// 電話番号予約番号
		paramIf.put(EZM0181E010CBSMsg.TELNO_RSV_NO, (String)inMap.get(EZM0181B030CBSMSG1LIST.TELNO_RSV_NO));

		// 電話番号
		paramIf.put(EZM0181E010CBSMsg.TELNO, (String)inMap.get(EZM0181B030CBSMSG1LIST.TELNO));
	
		// 更新前最終更新年月日時分秒
		paramIf.put(EZM0181E010CBSMsg.LAST_UPD_DTM_BF, (String)inMap.get(EZM0181B030CBSMSG1LIST.UPD_DTM));

		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0181E010CBSMsg.class, paramIf, "1");

		// SC呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		return result;
	}
	

	
	/**
	 * 電話番号予約登録SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @param hradsiSbtCd 払い出し種別コード
	 * @param regTelno 050電話番号
	 * @param telnoErr 電話番号エラー
	 * @throws Throwable
	 */
	private String callRegNumberSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam, String hradsiSbtCd, String regTelno, String[] telnoErr) throws Throwable
	{
		// リターンコード格納用変数

		/****************************************************************/
		/** 電話番号予約登録SCへの上りマッピング                        */
		/****************************************************************/
		String templateId = "EZM0181D010";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(EZM0181D010CBSMsg.TELNO, regTelno);													// 050電話番号
		param4serviceIf.put(EZM0181D010CBSMsg.TELNO_RSV_YK_KIGEN, telnoRsvYkKigen);								// 電話番号予約有効期限
		param4serviceIf.put(EZM0181D010CBSMsg.TELNO_RSV_SBT_CD, JCNStrConst.CN_TELNO_RSV_KND_050);				// 電話番号予約種別コード=050IP電話アプリ用電話番号予約中
		param4serviceIf.put(EZM0181D010CBSMsg.RSV_MT_CONT_KEI_NO,  (String) ccParam.get("CONT_KEI_NO"));		// 予約元コンテンツ契約番号
		param4serviceIf.put(EZM0181D010CBSMsg.N_050APL_HRADSI_REQ_CD, (String) ccParam.get("N_050APL_HRADSI_REQ_CD"));	// ０５０アプリ払出依頼コード
		param4serviceIf.put(EZM0181D010CBSMsg.N_050_TELNO_HRADSI_SBT_CD,  hradsiSbtCd);							// ０５０電話番号払出種別コード
		param4serviceIf.put(EZM0181D010CBSMsg.YOYAKSHA_SYSID , (String) ccParam.get("SYSID"));					// 予約者SYSID
		
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0181D010CBSMsg.class , param4serviceIf, "1");

		/***************************************************/
		/** SC呼出実行                                     */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map<?, ?> result = scCall.run(paramMap, handle);

		// 処理結果判定
		resultChkSc(result);

		// リターンコードが00以外の場合はそのまま呼び出し元へ返却

		if("0".equals(rtnCode)){
			rtnCode = JCNStrConst.API_RETURN_CD_00;
		}
		if(!(JCNStrConst.API_RETURN_CD_00.equals(rtnCode) && 0 == status))
		{
			printErrorLog("電話番号予約登録にてエラーが発生しました。" + "(rtnCode=" + rtnCode + ":status=" + status + ")");

			// 他端末との競合か否かを判定する情報を設定する。
			CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg msg = templates[0];

			telnoErr[0] = msg.getString(EZM0181D010CBSMsg.TELNO_ERR);
			
			// 払い出し種別コードが新規で、競合エラーなら、エラーを戻す。
			if("EA".equals(telnoErr[0])){
				if((JCNStrConst.N_050APL_HRADSI_SBT_CD_SINKI.equals(hradsiSbtCd)))
				{
					return  JCNStrConst.API_RETURN_CD_99;
				} else if(JCNStrConst.N_050APL_HRADSI_SBT_CD_FUKKATU.equals(hradsiSbtCd)) {
					return  JCNStrConst.API_RETURN_CD_00;
				}
			}
			// それ以外のエラーはロールバック
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", String.valueOf(rtnCode), status);
			throw scCallEx;
		}

		telnoErr[0] = "";
		return JCNStrConst.API_RETURN_CD_00;
	}

	/**
	 * 業務パラメータ管理一意照会
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @param keyword 業務パラメータキーワード
	 * @param gyoPara 読み出した業務パラメータ値
	 * @throws Throwable
	 */
	private String callGetGyoParaSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam, String keyword, String[] gyoPara) throws Throwable
	{
		
		/****************************************************************/
		/** 業務パラメータ管理一意照会SCへの上りマッピング              */
		/****************************************************************/
		String templateId = "EZM0321A010";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, keyword);

		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0321A010CBSMsg.class , param4serviceIf, "1");

		/***************************************************/
		/** SC呼出実行                                     */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map<?, ?> result = scCall.run(paramMap, handle);

		// 処理結果判定
		resultChkSc(result);
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if(!("0".equals(rtnCode) && 0 == status)) 
		{
			printErrorLog("業務パラメータ管理一意照会にてエラーが発生しました。" + "(keyword=" + keyword + ")");
			return rtnCode;
		}

		CAANMsg[] cbsMsgList = getResultMsgList(result, EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST); 

		
		// 読み出した業務パラメータ値をセット
		gyoPara[0] = cbsMsgList[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
		
		return JCNStrConst.API_RETURN_CD_00;
	}

	/**
	 * コンテンツ契約050番号仮発行SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @throws Throwable
	 */
	private String callKariHakkoSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		
		/****************************************************************/
		/** コンテンツ契約050番号仮発行SCへの上りマッピング             */
		/****************************************************************/
		String templateId = "ECNA0060001";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECNA0060001CBSMsg.IN_SYS_ID, (String) ccParam.get("SYSID"));
		param4serviceIf.put(ECNA0060001CBSMsg.CONT_KEI_NO, (String) ccParam.get("CONT_KEI_NO"));
		param4serviceIf.put(ECNA0060001CBSMsg.APL_HRADSI_REQ_CD, (String) ccParam.get("N_050APL_HRADSI_REQ_CD"));

		HashMap<String, Object> paramMap = createScParam(param, templateId, ECNA0060001CBSMsg.class , param4serviceIf, "1");

		/***************************************************/
		/** SC呼出実行                                     */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map<?, ?> creListResult = scCall.run(paramMap, handle);
		
		// 処理結果判定
		String rtnCd = "";
		rtnCd = rtnCdEdit(creListResult);
		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			printErrorLog("コンテンツ契約050番号仮発行SCにてエラーが発生しました。");
		}
		
		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(ECNA0060001CBSMsg.IN_SYS_ID_ERR);
		String contKeiNoErr = msg.getString(ECNA0060001CBSMsg.CONT_KEI_NO_ERR);
		String aplHradsiReqCdErr = msg.getString(ECNA0060001CBSMsg.APL_HRADSI_REQ_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(!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;
			}
			if("EB".equals(contKeiNoErr))
			{
				return JCNStrConst.API_RETURN_CD_52;
			}
		}
		
		// 050アプリ払出依頼コードエラーチェック
		if(!isNullOrBlank(aplHradsiReqCdErr))
		{
			if("E1".equals(aplHradsiReqCdErr))
			{
				return JCNStrConst.API_RETURN_CD_16;
			}
			if("E3".equals(aplHradsiReqCdErr))
			{
				return JCNStrConst.API_RETURN_CD_17;
			}
			if("E2".equals(aplHradsiReqCdErr))
			{
				return JCNStrConst.API_RETURN_CD_18;
			}
			if("E4".equals(aplHradsiReqCdErr))
			{
				return JCNStrConst.API_RETURN_CD_18;
			}
			if("EA".equals(aplHradsiReqCdErr))
			{
				return JCNStrConst.API_RETURN_CD_54;
			}
		}
		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 } , "");
	}
}
