/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKMultiCodeMeishoKanriUtil
*   ソースファイル名：JKKMultiCodeMeishoKanriUtil.java
*   作成者          ：富士通
*   日付            ：2011年10月18日
*＜機能概要＞
*   コード名称管理取得部品(複数一括取得)です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/18   FJ）眞方    新規作成
*   v5.00.00    2013/02/07   FJ) 中山    【ST2-2013-0000666】DB照会データがNULLの場合の空文字列変換
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
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.sc.exception.SCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbs.cbsmsg.EZM0171B012CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0171B012CBSMsg1List;

/**
 * コード名称管理部品です。<p>
 * <br>
 * @author 富士通
 */
public class JKKCodeMeishoKanriUtil
{
	/** 返却マップのキー名(検索結果リスト) */
	public static final String COLUMN_RESULT_MAP_CD_DIV = "cd_div";

	/** 返却マップのキー名(検索結果リスト) */
	public static final String COLUMN_RESULT_MAP_SHK_DSP_CD = "shk_dsp_cd";

	/** 返却マップのキー名(検索結果リスト) */
	public static final String COLUMN_RESULT_MAP_CD_DIV_NM = "cd_div_nm";
	
	/** 返却マップのキー名(検索結果リスト) */
	public static final String COLUMN_RESULT_MAP_CD_DIV_ALI = "cd_div_ali";

	/** 返却マップのキー名(エラー情報) */
	public static final String COLUMN_ERROR_LIST = "error_list";

	/**
	 * コード名称管理一覧取得処理です。<br>
	 * 指定されたコード種別をキーとして、コード名称管理一覧照会サービスインターフェイスにて<br>
	 * コード名称管理テーブルから情報を取得します。<br>
	 * (コード種別コードの単項目エラーは切り捨てられます。<br>
	 *  呼び出し元でデータの取得状態から例外/続行を判断して下さい。)<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param opeDate 運用年月日
	 * @param cdSbtCdList 入力データ
	 * @return リクエストパラメータ
	 * @throws RequestParameterException リクエストパラメータに関する例外
	 * @throws SCException SC実行時例外
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> getDataList(SessionHandle handle, IRequestParameterReadWrite param, String opeDate, List cdSbtCdList)
	throws RequestParameterException, SCException
	{
		Map resMap = new HashMap();

		// 入力データ0件の時は空のマップを返却(エラーにはしない)
		if ((cdSbtCdList == null) || (cdSbtCdList.size() == 0))
		{
			return resMap;
		}

		/*******************************************************************************
		 * コード名称管理一覧照会SCへの上りマッピング(複数件対応)
		 *******************************************************************************/
		HashMap<String, Object> paramMap = null;
		CAANMsg[] templates = new CAANMsg[cdSbtCdList.size()];
		for (int i = 0; i < cdSbtCdList.size(); i++)
		{
			Map map = (Map)cdSbtCdList.get(i);
			Map<Object, Object> recInMap = new HashMap<Object, Object>();
			recInMap.put(EZM0171B012CBSMsg.KEY_CD_SBT_CD, map.get("key_cd_sbt_cd"));  // ＫＥＹ＿コード種別コード
			recInMap.put(EZM0171B012CBSMsg.KEY_STDARDYMD, opeDate);                 // ＫＥＹ＿基準年月日
			paramMap = JKKBpCommon.createScParamForSearch(param, "EZM0171B012", EZM0171B012CBSMsg.class , recInMap, "1");
			CAANMsg[] recTemplates = (CAANMsg[])paramMap.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg tmp = recTemplates[0];
			templates[i] = tmp;
		}
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		/*******************************************************************************
		 * コード名称管理一覧照会SC呼出
		 *******************************************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(JKKCodeMeishoKanriUtil.class, "コード名称管理一覧照会SC呼び出し開始");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(JKKCodeMeishoKanriUtil.class, "コード名称管理一覧照会SC呼び出し完了" + result);

		/*******************************************************************************
		 * 取得データの結果編集
		 *******************************************************************************/
		if (JKKBpCommon.isSuccess(result))
		{
			CAANMsg[] resTemplates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			for (CAANMsg resMsg : resTemplates)
			{
				CAANMsg[] resDataList = resMsg.getCAANMsgList(EZM0171B012CBSMsg.EZM0171B012CBSMSG1LIST);
				List list = new ArrayList();
				String cdSbtCd = resMsg.getString(EZM0171B012CBSMsg.KEY_CD_SBT_CD);
				resMap.put(cdSbtCd, list);
				for (CAANMsg caanMsg : resDataList)
				{
					Map recMap = new HashMap();
					setDataMap(recMap, COLUMN_RESULT_MAP_CD_DIV, caanMsg.getString(EZM0171B012CBSMsg1List.CD_DIV));
					setDataMap(recMap, COLUMN_RESULT_MAP_CD_DIV_ALI, caanMsg.getString(EZM0171B012CBSMsg1List.CD_DIV_ALI));
					setDataMap(recMap, COLUMN_RESULT_MAP_CD_DIV_NM, caanMsg.getString(EZM0171B012CBSMsg1List.CD_DIV_NM));
					setDataMap(recMap, COLUMN_RESULT_MAP_SHK_DSP_CD, caanMsg.getString(EZM0171B012CBSMsg1List.SHK_DSP_CD));
					list.add(recMap);
				}
			}
		}
		else
		{
			// エラーは切り捨てる(呼び出し元で判断を行う)
//			String errMsg = "コード名称管理一覧取得処理で例外が発生しました";
//			JKKBPCommon.printBpDebugLog(JKKCodeMeishoKanriUtil.class, errMsg);
//			throw new CCException(errMsg, new Exception(errMsg));
		}

		return resMap;
	}

	/**
	 * ユーザデータ情報に値を設定します。<br>
	 * 　@getValueにデータが存在する場合、dataMapに設定します。<br>
	 * 　A上記以外の場合、空文字を設定します。<br>
	 * @param dataMap 値を設定するユーザデータ情報
	 * @param setKey ユーザデータ情報のキー名
	 * @param getValue メッセージキャリアからの取得値
	 */
	@SuppressWarnings("unchecked")
	private static void setDataMap(Map dataMap, String setKey, String getValue)
	{
		if (null == getValue)
		{
			dataMap.put(setKey, "");
		}
		else
		{
			dataMap.put(setKey, getValue);
		}
	}
}
