/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JZMDataikttrRsltCC
 *   ソースファイル名：JZMDataikttrRsltCC.java
 *   作成者          ：富士通
 *   日付            ：2011年05月22日
 *＜機能概要＞
 *   データ一括登録結果一覧照会用 共通コンポーネントです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/04/01   FJ）□□    新規作成
 *
 **********************************************************************/
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.CCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.ejb.cbs.cbsmsg.ECN0021A001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0021A001CBSMsgList;
import eo.ejb.cbs.cbsmsg.ECN0071A001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0071A001CBSMsgList;
import eo.ejb.cbs.cbsmsg.ECN0071B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0071B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0081A001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0081A001CBSMsgList;
import eo.ejb.cbs.cbsmsg.ECN0081B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0081B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0091A002CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0091A002CBSMsgList;

public class JCNCheckExclusionCNPrcCC extends AbstractCommonComponent {

	public static final String TEMPLATE_ID_MAIN_CC = "CNSV000610CC";

	/**
	 * テンプレートID:コンテンツ契約一意照会
	 */
	public static final String TEMPLATE_ID_ECN0021A001 = "ECN0021A001";

	/**
	 * テンプレートID:コンテンツクレカ課金一意照会
	 */
	public static final String TEMPLATE_ID_ECN0071A001 = "ECN0071A001";

	/**
	 * テンプレートID:コンテンツISP課金一意照会
	 */
	public static final String TEMPLATE_ID_ECN0081A001 = "ECN0081A001";

	/**
	 * テンプレートID:コンテンツ課金訂正一意照会
	 */
	public static final String TEMPLATE_ID_ECN0091A002 = "ECN0091A002";

	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText)
			throws Exception {

		// 大元のマップ
		HashMap<String, Object> ccMap = (HashMap<String, Object>) param
				.getData(TEMPLATE_ID_MAIN_CC);

		// SVIF呼び出しクラス
		ServiceComponentRequestInvoker scCall = null;
		// SVIF結果格納用MAP
		Map<?, ?> result = null;

		// 各コンテンツの情報が格納されたマップを取得
		HashMap<String, Object> contentsMap = (HashMap<String, Object>) ccMap
				.get("contentsMap");

		// 上りマッピング コンテンツ契約一意照会
		HashMap ecn0021A001InMap = editInMsgECN0021A001(param, contentsMap);

		// コンテンツ契約一意照会SC呼び出し実行
		scCall = new ServiceComponentRequestInvoker();
		result = scCall.run(ecn0021A001InMap, handle);

		// 下りマッピング コンテンツ契約一意照会
		param = editOutMsgECN0021A001(result, param, contentsMap);

		// コンテンツ契約の更新年月日時分秒をチェック
		if (!checkUpdDtmECN0021A001(contentsMap)) {
			// throw new CCException("排他エラー：コンテンツ契約", new Exception(""));

			setErrorInfo(ccMap, "999");
			return param;
		}

		/*
		 * クレジット：ECN0071B002 ISP ：ECN0081B002
		 */
		// コンテンツクレカ課金一覧照会情報が設定されている場合
		if (contentsMap.containsKey(TEMPLATE_ID_ECN0071A001)) {
			// 上りマッピング コンテンツクレカ課金一覧照会
			HashMap ecn0071B001InMap = editInMsgECN0071B001(param, contentsMap);

			// コンテンツクレカ課金一覧照会SC呼び出し実行
			scCall = new ServiceComponentRequestInvoker();
			result = scCall.run(ecn0071B001InMap, handle);

			// 下りマッピング コンテンツクレカ課金一覧照会
			param = editOutMsgECN0071B001(result, param, contentsMap);

			// コンテンツクレカ課金一覧照会 更新年月日時分秒比較処理
			if (!checkUpdDtmECN0071B001(contentsMap)) {
				// throw new CCException("排他エラー：コンテンツクレカ課金", new Exception(""));

				setErrorInfo(ccMap, "999");
				return param;
			}
		}

		// コンテンツISP課金一覧照会情報が設定されている場合
		else if (contentsMap.containsKey(TEMPLATE_ID_ECN0081A001)) {
			// 上りマッピング コンテンツISP課金一覧照会
			HashMap ecn0081B001InMap = editInMsgECN0081A001(param, contentsMap);

			// コンテンツISP課金一覧照会SC呼び出し実行
			scCall = new ServiceComponentRequestInvoker();
			result = scCall.run(ecn0081B001InMap, handle);

			// 下りマッピング コンテンツISP課金一覧照会
			param = editOutMsgECN0081B001(result, param, contentsMap);

			// コンテンツISP課金一覧照会 更新年月日時分秒比較処理
			if (!checkUpdDtmECN0081B001(contentsMap)) {
				// throw new CCException("排他エラー：コンテンツISP課金", new Exception(""));

				setErrorInfo(ccMap, "999");
				return param;
			}
		}

		else {
			// 例外 システムエラー
			throw new CCException("マッピング不備", new Exception());
		}

		// 上りマッピング コンテンツ課金訂正一覧照会
		HashMap ecn0091A002InMap = editInMsgECN0091A002(param, contentsMap);

		// コンテンツ課金訂正一覧照会SC呼び出し実行
		scCall = new ServiceComponentRequestInvoker();
		result = scCall.run(ecn0091A002InMap, handle);

		// 下りマッピング コンテンツ課金訂正一覧照会
		param = editOutMsgECN0091A002(result, param, contentsMap);

		// コンテンツ課金訂正の通番をチェック
		if (!checkUpdDtmECN0091A002(contentsMap)) {
			// throw new CCException("排他エラー：コンテンツ課金訂正", new Exception(""));

			setErrorInfo(ccMap, "999");
			return param;
		}

		// 正常
		setErrorInfo(ccMap, "000");

		return param;
	}

	private void setErrorInfo(HashMap ccMap, String errLevel) {
		if (ccMap == null) {
			return;
		}

		ccMap.put("errLevel", errLevel);
	}

	/**
	 * コンテンツ契約の排他エラー判定処理
	 * 
	 * @param contentsMap
	 *            検索結果
	 * @return 判定結果
	 */
	private boolean checkUpdDtmECN0021A001(HashMap contentsMap) {

		// リクエストを取得
		HashMap requestMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0021A001);

		// 検索結果を取得
		ArrayList resultList = (ArrayList) requestMap
				.get("ECN0021A001CBSMsg1List");
		// 一意照会のため、先頭のみを取得
		HashMap detailMap = (HashMap) resultList.get(0);

		// 検索結果とリクエストの更新年月日時分秒を比較する。
		if (!requestMap.get("upd_dtm").equals(detailMap.get("upd_dtm"))) {

			// 排他エラー
			return false;
		}

		// 正常
		return true;
	}

	/**
	 * コンテンツクレカ課金の排他エラー判定処理
	 * 
	 * @param contentsMap
	 *            検索結果
	 * @return 判定結果
	 */
	@SuppressWarnings("unchecked")
	private boolean checkUpdDtmECN0071B001(HashMap contentsMap) {

		// リクエストを取得
		HashMap requestMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0071A001);
		
		
		// 検索結果を取得
		ArrayList resultList = (ArrayList) requestMap
				.get("ECN0071A001CBSMsgList");

		// 検索結果分繰り返す。
		Iterator ite = resultList.iterator();
		while (ite.hasNext()) {

			// 検索結果を取得
			HashMap detailMap = (HashMap) ite.next();
			
			// 検索結果とリクエストの更新年月日時分秒を比較する。
			if (requestMap.get("upd_dtm").equals(detailMap.get("upd_dtm"))) {
						// 正常
				return true;
			}
		}

		// 更新年月日時分秒が一致しなかった場合は排他エラー
		return false;
	}

	/**
	 * コンテンツISP課金の排他エラー判定処理
	 * 
	 * @param contentsMap
	 *            検索結果
	 * @return 判定結果
	 */
	@SuppressWarnings("unchecked")
	private boolean checkUpdDtmECN0081B001(HashMap contentsMap) {

		// リクエストを取得
		HashMap requestMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0081A001);
		
		// 検索結果を取得
		ArrayList resultList = (ArrayList) requestMap
				.get("ECN0081A001CBSMsgList");

		// 検索結果分繰り返す。
		Iterator ite = resultList.iterator();
		while (ite.hasNext()) {

			// 検索結果を取得
			HashMap detailMap = (HashMap) ite.next();
			
			// 検索結果とリクエストの更新年月日時分秒を比較する。
			if (requestMap.get("upd_dtm").equals(detailMap.get("upd_dtm"))) {

				// 正常
				return true;
			}
		}

		// 更新年月日時分秒が一致しなかった場合は排他エラー
		return false;
	}

	/**
	 * コンテンツ課金訂正の排他エラー判定処理
	 * 
	 * @param contentsMap
	 *            検索結果
	 * @return 判定結果
	 */
	private boolean checkUpdDtmECN0091A002(HashMap contentsMap) {

		// リクエストを取得
		HashMap requestMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0091A002);

		// 検索結果を取得
		ArrayList resultList = (ArrayList) requestMap
				.get("ECN0091A002CBSMsg1List");

		// 取れたらチェックを行う
		if (resultList.size() > 0) {
			
			HashMap resultMap = (HashMap) resultList.get(0);
			
			// 画面で持っている通番
			Integer requestTeiseSeq = Integer.parseInt((String) requestMap.get("cont_chrg_teise_seq"));
			
			// DBから取得した最大の通番
			Integer resultTeiseSeq = Integer.parseInt((String) resultMap.get("cont_chrg_teise_seq"));
			
			// 画面で持っている通番と、DBから取得した通番を比較し、画面で持っている通番の方が小さい場合排他エラーとする。
			if (requestTeiseSeq < resultTeiseSeq)
			{
				return false;
			}
		}

		// 正常
		return true;
	}

	/**
	 * 共通情報の上りマッピング
	 * 
	 * @param param
	 * @return
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param)
			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));

		return paramMap;
	}

	/**
	 * コンテンツ契約一意照会の上りマッピング
	 * 
	 * @param param
	 * @return
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgECN0021A001(
			IRequestParameterReadWrite param,
			HashMap<String, Object> contentsMap)
			throws RequestParameterException {

		// 共通情報をマッピング
		HashMap<String, Object> paramMap = editInMsg(param);

		/* ユーザデータ情報 */
		HashMap inMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0021A001);

		int cnt = 0;

		CAANMsg template = new CAANMsg(ECN0021A001CBSMsg.class.getName());
		// テンプレートID
		template.set(ECN0021A001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECN0021A001);

		// 機能コード
		template.set(ECN0021A001CBSMsg.FUNC_CODE, (String) inMap
				.get("func_code"));

		// オペレータID
		Object operatorId = param
				.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(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);

		// 検索処理パターン
		if ("".equals(inMap.get("search_type"))) {
			template.setNull(ECN0021A001CBSMsg.SEARCH_TYPE);
		} else {
			template.set(ECN0021A001CBSMsg.SEARCH_TYPE, (String) inMap
					.get("search_type"));
		}

		// 最大検索件数
		if ("".equals(inMap.get("max_search_num"))) {
			template.setNull(ECN0021A001CBSMsg.MAX_SEARCH_NUM);
		} else {
			template.set(ECN0021A001CBSMsg.MAX_SEARCH_NUM, (String) inMap
					.get("max_search_num"));
		}

		// 表示件数
		if ("".equals(inMap.get("display_num"))) {
			template.setNull(ECN0021A001CBSMsg.DISPLAY_NUM);
		} else {
			template.set(ECN0021A001CBSMsg.DISPLAY_NUM, (String) inMap
					.get("display_num"));
		}

		// 表示ページ番号
		if ("".equals(inMap.get("display_page_num"))) {
			template.setNull(ECN0021A001CBSMsg.DISPLAY_PAGE_NUM);
		} else {
			template.set(ECN0021A001CBSMsg.DISPLAY_PAGE_NUM, (String) inMap
					.get("display_page_num"));
		}

		// 検索エラーフラグ
		if ("".equals(inMap.get("search_err_flg"))) {
			template.setNull(ECN0021A001CBSMsg.SEARCH_ERR_FLG);
		} else {
			template.set(ECN0021A001CBSMsg.SEARCH_ERR_FLG, (String) inMap
					.get("search_err_flg"));
		}

		// ◇業務データの設定
		// コンテンツ契約番号 → コンテンツ契約一意照会.ＫＥＹ＿コンテンツ契約番号

		if ("".equals(inMap.get("key_cont_kei_no"))) {
			template.setNull(ECN0021A001CBSMsg.KEY_CONT_KEI_NO);
		} else {
			template.set(ECN0021A001CBSMsg.KEY_CONT_KEI_NO, (String) inMap
					.get("key_cont_kei_no"));
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * コンテンツクレカ課金一覧照会の上りマッピング
	 * 
	 * @param param
	 * @return
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgECN0071B001(
			IRequestParameterReadWrite param,
			HashMap<String, Object> contentsMap)
			throws RequestParameterException {

		// 共通情報をマッピング
		HashMap<String, Object> paramMap = editInMsg(param);

		/* ユーザデータ情報 */
		HashMap inMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0071A001);

		int cnt = 0;

		CAANMsg template = new CAANMsg(ECN0071A001CBSMsg.class.getName());
		// テンプレートID
		template.set(ECN0071A001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECN0071A001);

		// 機能コード
		template.set(ECN0071A001CBSMsg.FUNC_CODE, (String) inMap
				.get("func_code"));

		// オペレータID
		Object operatorId = param
				.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(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);

		// 検索処理パターン
		if ("".equals(inMap.get("search_type"))) {
			template.setNull(ECN0071A001CBSMsg.SEARCH_TYPE);
		} else {
			template.set(ECN0071A001CBSMsg.SEARCH_TYPE, (String) inMap
					.get("search_type"));
		}

		// 最大検索件数
		if ("".equals(inMap.get("max_search_num"))) {
			template.setNull(ECN0071A001CBSMsg.MAX_SEARCH_NUM);
		} else {
			template.set(ECN0071A001CBSMsg.MAX_SEARCH_NUM, (String) inMap
					.get("max_search_num"));
		}

		// 表示件数
		if ("".equals(inMap.get("display_num"))) {
			template.setNull(ECN0071A001CBSMsg.DISPLAY_NUM);
		} else {
			template.set(ECN0071A001CBSMsg.DISPLAY_NUM, (String) inMap
					.get("display_num"));
		}

		// 表示ページ番号
		if ("".equals(inMap.get("display_page_num"))) {
			template.setNull(ECN0071A001CBSMsg.DISPLAY_PAGE_NUM);
		} else {
			template.set(ECN0071A001CBSMsg.DISPLAY_PAGE_NUM, (String) inMap
					.get("display_page_num"));
		}

		// 検索エラーフラグ
		if ("".equals(inMap.get("search_err_flg"))) {
			template.setNull(ECN0071A001CBSMsg.SEARCH_ERR_FLG);
		} else {
			template.set(ECN0071A001CBSMsg.SEARCH_ERR_FLG, (String) inMap
					.get("search_err_flg"));
		}

		// ◇業務データの設定
		// コンテンツサービスコード → コンテンツクレカ課金一意照会.ＫＥＹ＿コンテンツ契約番号
		if ("".equals(inMap.get("key_cont_kei_no"))) {
			template.setNull(ECN0071A001CBSMsg.KEY_CONT_KEI_NO);
		} else {
			template.set(ECN0071A001CBSMsg.KEY_CONT_KEI_NO, (String) inMap
					.get("key_cont_kei_no"));
		}

//		// SYSID → コンテンツクレカ課金一覧照会.ＫＥＹ＿SYSID
//		if ("".equals(inMap.get("key_sysid"))) {
//			template.setNull(ECN0071A001CBSMsg.KEY_SYSID);
//		} else {
//			template.set(ECN0071A001CBSMsg.KEY_SYSID, (String) inMap
//					.get("key_sysid"));
//		}
//
//		// コンテンツ契約状態コード → "1"(契約中)固定
//		if ("".equals(inMap.get("key_cont_kei_stat_cd"))) {
//			template.setNull(ECN0071A001CBSMsg.KEY_CONT_KEI_STAT_CD);
//		} else {
//			template.set(ECN0071A001CBSMsg.KEY_CONT_KEI_STAT_CD, (String) inMap
//					.get("key_cont_kei_stat_cd"));
//		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * コンテンツISP課金一意照会の上りマッピング
	 * 
	 * @param param
	 * @return
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgECN0081A001(
			IRequestParameterReadWrite param, HashMap contentsMap)
			throws RequestParameterException {

		// 共通情報をマッピング
		HashMap<String, Object> paramMap = editInMsg(param);

		/* ユーザデータ情報 */
		HashMap inMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0081A001);

		int cnt = 0;

		CAANMsg template = new CAANMsg(ECN0081A001CBSMsg.class.getName());
		// テンプレートID
		template.set(ECN0081A001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECN0081A001);

		// 機能コード
		template.set(ECN0081A001CBSMsg.FUNC_CODE, (String) inMap
				.get("func_code"));

		// オペレータID
		Object operatorId = param
				.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(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);

		// 検索処理パターン
		if ("".equals(inMap.get("search_type"))) {
			template.setNull(ECN0081A001CBSMsg.SEARCH_TYPE);
		} else {
			template.set(ECN0081A001CBSMsg.SEARCH_TYPE, (String) inMap
					.get("search_type"));
		}

		// 最大検索件数
		if ("".equals(inMap.get("max_search_num"))) {
			template.setNull(ECN0081A001CBSMsg.MAX_SEARCH_NUM);
		} else {
			template.set(ECN0081A001CBSMsg.MAX_SEARCH_NUM, (String) inMap
					.get("max_search_num"));
		}

		// 表示件数
		if ("".equals(inMap.get("display_num"))) {
			template.setNull(ECN0081A001CBSMsg.DISPLAY_NUM);
		} else {
			template.set(ECN0081A001CBSMsg.DISPLAY_NUM, (String) inMap
					.get("display_num"));
		}

		// 表示ページ番号
		if ("".equals(inMap.get("display_page_num"))) {
			template.setNull(ECN0081A001CBSMsg.DISPLAY_PAGE_NUM);
		} else {
			template.set(ECN0081A001CBSMsg.DISPLAY_PAGE_NUM, (String) inMap
					.get("display_page_num"));
		}

		// 検索エラーフラグ
		if ("".equals(inMap.get("search_err_flg"))) {
			template.setNull(ECN0081A001CBSMsg.SEARCH_ERR_FLG);
		} else {
			template.set(ECN0081A001CBSMsg.SEARCH_ERR_FLG, (String) inMap
					.get("search_err_flg"));
		}

		// ◇業務データの設定
//		// key_sysid → コンテンツISP課金一覧照会.KEY_SYSID
//		if ("".equals(inMap.get("key_sysid"))) {
//			template.setNull(ECN0081A001CBSMsg.KEY_SYSID);
//		} else {
//			template.set(ECN0081A001CBSMsg.KEY_SYSID, (String) inMap
//					.get("key_sysid"));
//		}

		// key_コンテンツサービスコード → コンテンツISP課金一覧照会.KEY_コンテンツサービスコード
		if ("".equals(inMap.get("key_cont_kei_no"))) {
			template.setNull(ECN0081A001CBSMsg.KEY_CONT_KEI_NO);
		} else {
			template.set(ECN0081A001CBSMsg.KEY_CONT_KEI_NO, (String) inMap
					.get("key_cont_kei_no"));
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * コンテンツ課金訂正一覧照会の上りマッピング
	 * 
	 * @param param
	 * @return
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgECN0091A002(
			IRequestParameterReadWrite param, HashMap contentsMap)
			throws RequestParameterException {

		// 共通情報をマッピング
		HashMap<String, Object> paramMap = editInMsg(param);

		/* ユーザデータ情報 */
		HashMap inMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0091A002);

		int cnt = 0;

		CAANMsg template = new CAANMsg(ECN0091A002CBSMsg.class.getName());
		// テンプレートID
		template.set(ECN0091A002CBSMsg.TEMPLATEID, TEMPLATE_ID_ECN0091A002);

		// 機能コード
		template.set(ECN0091A002CBSMsg.FUNC_CODE, (String) inMap
				.get("func_code"));

		// オペレータID
		Object operatorId = param
				.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(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);

		// 検索処理パターン
		if ("".equals(inMap.get("search_type"))) {
			template.setNull(ECN0091A002CBSMsg.SEARCH_TYPE);
		} else {
			template.set(ECN0091A002CBSMsg.SEARCH_TYPE, (String) inMap
					.get("search_type"));
		}

		// 最大検索件数
		if ("".equals(inMap.get("max_search_num"))) {
			template.setNull(ECN0091A002CBSMsg.MAX_SEARCH_NUM);
		} else {
			template.set(ECN0091A002CBSMsg.MAX_SEARCH_NUM, (String) inMap
					.get("max_search_num"));
		}

		// 表示件数
		if ("".equals(inMap.get("display_num"))) {
			template.setNull(ECN0091A002CBSMsg.DISPLAY_NUM);
		} else {
			template.set(ECN0091A002CBSMsg.DISPLAY_NUM, (String) inMap
					.get("display_num"));
		}

		// 表示ページ番号
		if ("".equals(inMap.get("display_page_num"))) {
			template.setNull(ECN0091A002CBSMsg.DISPLAY_PAGE_NUM);
		} else {
			template.set(ECN0091A002CBSMsg.DISPLAY_PAGE_NUM, (String) inMap
					.get("display_page_num"));
		}

		// 検索エラーフラグ
		if ("".equals(inMap.get("search_err_flg"))) {
			template.setNull(ECN0091A002CBSMsg.SEARCH_ERR_FLG);
		} else {
			template.set(ECN0091A002CBSMsg.SEARCH_ERR_FLG, (String) inMap
					.get("search_err_flg"));
		}

		// ◇業務データの設定
		if ("".equals(inMap.get("key_cont_kei_no"))) {
			template.setNull(ECN0091A002CBSMsg.KEY_CONT_KEI_NO);
		} else {
			template.set(ECN0091A002CBSMsg.KEY_CONT_KEI_NO, (String) inMap
					.get("key_cont_kei_no"));
		}

		if ("".equals(inMap.get("key_cont_kei_no_seq"))) {
			template.setNull(ECN0091A002CBSMsg.KEY_CONT_KEI_NO_SEQ);
		} else {
			template.set(ECN0091A002CBSMsg.KEY_CONT_KEI_NO_SEQ, (String) inMap
					.get("key_cont_kei_no_seq"));
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * コンテンツ契約一意照会の下りマッピング
	 * 
	 * @param msgList
	 * @param param
	 * @return
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsgECN0021A001(Map<?, ?> msgList,
			IRequestParameterReadWrite param, HashMap contentsMap)
			throws Exception {

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList
				.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 結果を詰めるマップを取得。
		HashMap dataMap = null;
		ArrayList dataList = null;

		/* 業務データ設定 */
		if (contentsMap.containsKey(TEMPLATE_ID_ECN0021A001)) {
			dataMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0021A001);
		} else {

			dataMap = new HashMap();
			contentsMap.put(TEMPLATE_ID_ECN0021A001, dataMap);
		}

		// 検索系 共通部
		dataMap.put("total_search_num", parentTemplate
				.getString("total_search_num"));
		dataMap.put("total_page_num", parentTemplate
				.getString("total_page_num"));
		dataMap.put("search_err_flg", parentTemplate
				.getString("search_err_flg"));

		templateArray = parentTemplate
				.getCAANMsgList(ECN0021A001CBSMsg.ECN0021A001CBSMSGLIST);
		dataList = (ArrayList) dataMap.get("ECN0021A001CBSMsg1List");

		if (dataList == null) {
			dataList = new ArrayList();
		}

		if (templateArray != null) {
			for (int i = 0; i < templateArray.length; i++) {
				CAANMsg childTemplate = templateArray[i];
				if (i >= dataList.size()) {
					dataList.add(new HashMap());
				}
				HashMap childMap = (HashMap) dataList.get(i);
				// 更新年月日時分秒 ← コンテンツ契約一意照会照会.コンテンツ契約一意照会一覧.更新年月日時分秒
				if (childTemplate.isNull(ECN0021A001CBSMsgList.UPD_DTM)) {
					childMap.put("upd_dtm", new String());
				} else {
					childMap.put("upd_dtm", childTemplate
							.getString(ECN0021A001CBSMsgList.UPD_DTM));
				}
			}
		}

		dataMap.put("ECN0021A001CBSMsg1List", dataList);

		// エラー情報の設定
		param = editErrorInfo(param, templates, (Integer) return_code);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>) param
				.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null) {
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil
				.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * コンテンツクレカ課金一覧照会の下りマッピング
	 * 
	 * @param msgList
	 * @param param
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsgECN0071B001(Map<?, ?> msgList,
			IRequestParameterReadWrite param, HashMap contentsMap)
			throws Exception {

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList
				.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 結果を詰めるマップを取得。
		HashMap dataMap = null;
		ArrayList dataList = null;

		/* 業務データ設定 */
		if (contentsMap.containsKey(TEMPLATE_ID_ECN0071A001)) {
			dataMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0071A001);
		} else {

			dataMap = new HashMap();
			contentsMap.put(TEMPLATE_ID_ECN0071A001, dataMap);
		}

		// 検索系 共通部
		dataMap.put("total_search_num", parentTemplate
				.getString("total_search_num"));
		dataMap.put("total_page_num", parentTemplate
				.getString("total_page_num"));
		dataMap.put("search_err_flg", parentTemplate
				.getString("search_err_flg"));

		templateArray = parentTemplate
				.getCAANMsgList(ECN0071A001CBSMsg.ECN0071A001CBSMSGLIST);
		dataList = (ArrayList) dataMap.get("ECN0071A001CBSMsgList");

		if (dataList == null) {
			dataList = new ArrayList();
		}

		if (templateArray != null) {
			for (int i = 0; i < templateArray.length; i++) {
				CAANMsg childTemplate = templateArray[i];
				if (i >= dataList.size()) {
					dataList.add(new HashMap());
				}
				HashMap childMap = (HashMap) dataList.get(i);
				// コンテンツ契約番号 ← コンテンツクレカ課金一覧照会.コンテンツクレカ課金一覧照会明細.コンテンツ契約番号
				if (childTemplate.isNull(ECN0071A001CBSMsgList.CONT_KEI_NO_SEQ)) {
					childMap.put(ECN0071A001CBSMsgList.CONT_KEI_NO_SEQ, new String());
				} else {
					childMap.put(ECN0071A001CBSMsgList.CONT_KEI_NO_SEQ, childTemplate
							.getString(ECN0071A001CBSMsgList.CONT_KEI_NO_SEQ));
				}
				// 更新年月日時分秒 ← コンテンツクレカ課金一覧照会.コンテンツクレカ課金一覧照会明細.更新年月日時分秒
				if (childTemplate.isNull(ECN0071A001CBSMsgList.UPD_DTM)) {
					childMap.put("upd_dtm", new String());
				} else {
					childMap.put("upd_dtm", childTemplate
							.getString(ECN0071A001CBSMsgList.UPD_DTM));
				}
			}
		}

		dataMap.put("ECN0071A001CBSMsgList", dataList);

		// エラー情報の設定
		param = editErrorInfo(param, templates, (Integer) return_code);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>) param
				.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null) {
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil
				.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * コンテンツISP課金一覧照会の下りマッピング
	 * 
	 * @param msgList
	 * @param param
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsgECN0081B001(Map<?, ?> msgList,
			IRequestParameterReadWrite param, HashMap contentsMap)
			throws Exception {
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList
				.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 結果を詰めるマップを取得。
		HashMap dataMap = null;
		ArrayList dataList = null;

		/* 業務データ設定 */
		if (contentsMap.containsKey(TEMPLATE_ID_ECN0081A001)) {
			dataMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0081A001);
		} else {

			dataMap = new HashMap();
			contentsMap.put(TEMPLATE_ID_ECN0081A001, dataMap);
		}

		// 検索系 共通部
		dataMap.put("total_search_num", parentTemplate
				.getString("total_search_num"));
		dataMap.put("total_page_num", parentTemplate
				.getString("total_page_num"));
		dataMap.put("search_err_flg", parentTemplate
				.getString("search_err_flg"));

		templateArray = parentTemplate
				.getCAANMsgList(ECN0081A001CBSMsg.ECN0081A001CBSMSGLIST);
		dataList = (ArrayList) dataMap.get("ECN0081A001CBSMsgList");

		if (dataList == null) {
			dataList = new ArrayList();
		}

		if (templateArray != null) {
			for (int i = 0; i < templateArray.length; i++) {
				CAANMsg childTemplate = templateArray[i];
				if (i >= dataList.size()) {
					dataList.add(new HashMap());
				}
				HashMap childMap = (HashMap) dataList.get(i);
				// コンテンツ契約番号 ← コンテンツISP課金一覧照会.コンテンツISP課金一覧照会明細.コンテンツ契約番号
				if (childTemplate.isNull(ECN0081A001CBSMsgList.CONT_KEI_NO_SEQ)) {
					childMap.put(ECN0081A001CBSMsgList.CONT_KEI_NO_SEQ, new String());
				} else {
					childMap.put(ECN0081A001CBSMsgList.CONT_KEI_NO_SEQ, childTemplate
							.getString(ECN0081A001CBSMsgList.CONT_KEI_NO_SEQ));
				}
				// 更新年月日時分秒 ← コンテンツISP課金一覧照会.コンテンツISP課金一覧照会明細.更新年月日時分秒
				if (childTemplate.isNull(ECN0081A001CBSMsgList.UPD_DTM)) {
					childMap.put("upd_dtm", new String());
				} else {
					childMap.put("upd_dtm", childTemplate
							.getString(ECN0081A001CBSMsgList.UPD_DTM));
				}
			}
		}

		dataMap.put("ECN0081A001CBSMsgList", dataList);

		// エラー情報の設定
		param = editErrorInfo(param, templates, (Integer) return_code);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>) param
				.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null) {
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil
				.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * コンテンツ課金訂正一覧照会の下りマッピング
	 * 
	 * @param msgList
	 * @param param
	 * @return
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsgECN0091A002(Map<?, ?> msgList,
			IRequestParameterReadWrite param, HashMap contentsMap)
			throws Exception {

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList
				.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 結果を詰めるマップを取得。
		HashMap dataMap = null;
		ArrayList dataList = null;

		/* 業務データ設定 */
		if (contentsMap.containsKey(TEMPLATE_ID_ECN0091A002)) {
			dataMap = (HashMap) contentsMap.get(TEMPLATE_ID_ECN0091A002);
		} else {

			dataMap = new HashMap();
			contentsMap.put(TEMPLATE_ID_ECN0091A002, dataMap);
		}

		// 検索系 共通部
		dataMap.put("total_search_num", parentTemplate
				.getString("total_search_num"));
		dataMap.put("total_page_num", parentTemplate
				.getString("total_page_num"));
		dataMap.put("search_err_flg", parentTemplate
				.getString("search_err_flg"));

		templateArray = parentTemplate
				.getCAANMsgList(ECN0091A002CBSMsg.ECN0091A002CBSMSGLIST);
		dataList = (ArrayList) dataMap.get("ECN0091A002CBSMsg1List");

		if (dataList == null) {
			dataList = new ArrayList();
		}

		if (templateArray != null) {
			for (int i = 0; i < templateArray.length; i++) {
				CAANMsg childTemplate = templateArray[i];
				if (i >= dataList.size()) {
					dataList.add(new HashMap());
				}
				HashMap childMap = (HashMap) dataList.get(i);

				if (childTemplate
						.isNull(ECN0091A002CBSMsgList.CONT_CHRG_TEISE_SEQ)) {
					childMap.put("cont_chrg_teise_seq", new String());
				} else {
					childMap
							.put(
									"cont_chrg_teise_seq",
									childTemplate
											.getString(ECN0091A002CBSMsgList.CONT_CHRG_TEISE_SEQ));
				}
			}
		}

		dataMap.put("ECN0091A002CBSMsg1List", dataList);

		// エラー情報の設定
		param = editErrorInfo(param, templates, (Integer) return_code);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>) param
				.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null) {
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil
				.getErrorInfo(msgList, errList));

		return param;
	}

	public IRequestParameterReadWrite editErrorInfo(
			IRequestParameterReadWrite param, CAANMsg[] templates,
			int returnCode) throws RequestParameterException {
		/* 本来はサービスインターフェイス分の処理が必要。。 */
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = null;
		int templateStatus = template.getInt(ECN0091A002CBSMsg.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);
		}

		HashMap inMap = null;

		/* ユーザデータ情報 */
		inMap = (HashMap) param.getData(TEMPLATE_ID_ECN0091A002);

		return param;
	}

}
