/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKPmpScParamHenshu
*   ソースファイル名：JCKPmpScParamHenshu.java
*   作成者          ：富士通
*   日付            ：2011年07月01日
*＜機能概要＞
*   サービスコンポーネント呼出用のパラメータ編集を行う。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/01   FJ）眞方    新規作成
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.ErrorInfoMapKeys;
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.base.CAANSchemaInfo;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

/**
 * PMP連携用サービスコンポーネント呼出用のパラメータ編集を行います。
 * <br />
 * @author 富士通
 */
public class JCKPmpScParamHenshu {

	/**
	 * SC呼出用のパラメータを作成します。<br/>
	 * @param param リクエストパラメータ
	 * @param templateId テンプレートID
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static HashMap<String, Object> createScParamForSearch(IRequestParameterReadOnly param, String templateId, Class<?> cbsMsgClass,
			Map param4serviceIf, String funcCode) throws RequestParameterException
	{
		return createScParam(param, templateId, cbsMsgClass, param4serviceIf, funcCode, true);
	}

	/**
	 * SC呼出用のパラメータを作成します。<br/>
	 * @param param リクエストパラメータ
	 * @param templateId テンプレートID
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static HashMap<String, Object> createScParam(IRequestParameterReadOnly param, String templateId, Class<?> cbsMsgClass,
			Map param4serviceIf, String funcCode) throws RequestParameterException
	{
		return createScParam(param, templateId, cbsMsgClass, param4serviceIf, funcCode, false);
	}

	/**
	 * SC呼出用のパラメータを作成します。<br/>
	 * @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, boolean defNullSet) throws RequestParameterException
	{
		// 受け取ったリクエストパラメータを元に、ＳＣ呼出用の上りマップを生成する。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		CAANMsg[] templates = new CAANMsg[1];

		CAANMsg template = new CAANMsg(cbsMsgClass.getName());

		// テンプレートIDがブランクの場合は、CBSMsgクラスから取得する。
		if ((templateId == null) || ("".equals(templateId)))
		{
			templateId = cbsMsgClass.getSimpleName().substring(0,11);
		}

		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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);

		// 値の指定がない項目にnullをセットする。
		if (defNullSet)
		{
			setNullOtherColumn(cbsMsgClass, param4serviceIf);
		}

		// 値がブランクのものをnullに置き換える
		setNullBlankColumn(param4serviceIf);

		// 入力パラメータのセット
		template.setMsgDataOfAll((HashMap)param4serviceIf);
		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * 入力パラメータ値の指定がない項目にnullをセットします。<br/>
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void setNullOtherColumn(Class<?> cbsMsgClass, Map param4serviceIf)
	{
		// TODO リスト対応
		// TODO リフレクション廃止の検討（リフレクション or インスタンス生成してgetContents)
		// TODO 対象データ型の検討（2011年末時点ではStringだけで全量カバーできているが、CAANMsgSchemaで定義されている基本データ型を全てを定義する？）
		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)
		{
		}
	}

	/**
	 * 入力パラメータ値の指定がない項目にnullをセットします。<br/>
	 * ※CCで行う場合は createScParamForSearch または setNullOtherColumn を使用して下さい。<br /><br />
	 * @param cbsMsgClass CBSMsgクラス
	 * @param template サービスIFへの入力パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void autoNullSetToMsg(Class cbsMsgClass, CAANMsg template)
	{
		// 自動Nullセット前のCAANMsgをマップに変換
		HashMap param4serviceIf = template.getMsgData();
		String[] bfCols = (String[])param4serviceIf.keySet().toArray(new String[]{});
		List bfList = Arrays.asList(bfCols);

		// 変換後のマップに対して自動Nullセット
		setNullOtherColumn(cbsMsgClass, param4serviceIf);

		// 自動Nullセット後のマップ状態を取得
		String[] afCols = (String[])param4serviceIf.keySet().toArray(new String[]{});
		List afList = Arrays.asList(afCols);

		// 差分(CAANMsgの未設定項目)にnullをセット
		for (Object afCol : afList)
		{
			String col = (String)afCol;
			if (!bfList.contains(col))
			{
				template.setNull(col);
			}
		}
	}

	/**
	 * 入力パラメータ値の指定がない項目にnullをセットします。<br/>
	 * BP-SCマッピングの呼び出し部品で使用します。<br />
	 * ※CCで行う場合は createScParamForSearch または setNullOtherColumn を使用して下さい。<br /><br />
	 * 【IMRCでの入力例】<br />
	 * <table border="1" cellspacing="0">
	 * <tr><td>呼び出し部品</td><td>com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.autoNullSetForImrc</td></tr>
	 * <tr><td>パラメタ</td><td>inMap.get("key_trn_cd"), ECK0151B020CBSMsg.class, template</td></tr>
	 * </table>
	 * @param colVal 対象の項目に設定する値
	 * @param cbsMsgClass CBSMsgクラス
	 * @param template サービスIFへの入力パラメータ
	 * @return BP項目IDで指定された項目の値
	 */
	@SuppressWarnings("unchecked")
	public static String autoNullSetForImrc(Object colVal, Class cbsMsgClass, CAANMsg template)
	{
		autoNullSetToMsg(cbsMsgClass, template);
		return (String)colVal;
	}

	/**
	 * 値がブランクのものをnullに置き換えます。<br/>
	 * @param param4serviceIf サービスインターフェイス用入力パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void setNullBlankColumn(Map param4serviceIf)
	{
		// TODO リスト対応
		Iterator it = param4serviceIf.keySet().iterator();
		while (it.hasNext())
		{
			String key = (String)it.next();
			Object valObj = param4serviceIf.get(key);
			if (valObj instanceof String)
			{
				if ("".equals((String)valObj))
				{
					param4serviceIf.put(key, null);
				}
			}
		}
	}

	/**
	 * メッセージキャリアクラスの各項目のデータをマップに変換します。<br />
	 * @param msgObj CAANMsg
	 * @param msgClassFrom コピー元のメッセージキャリアクラス
	 * @param msgClassTo コピー先のメッセージキャリアクラス
	 * @return Mapに変換されたCAANMsg
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> copyMsgToMap(CAANMsg msgObj, Class msgClassFrom, Class msgClassTo) throws InstantiationException,
			IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException
	{
		return copyMsgToMap(msgObj, msgClassFrom, msgClassTo, false);
	}

	/**
	 * メッセージキャリアクラスの各項目のデータをマップに変換します。<br />
	 * ≪補足≫<br />
	 * ・コピー先の入力項目以外はマップにセットされない。<br />
	 * <br />
	 * @param msgObj CAANMsg
	 * @param msgClassFrom コピー元のメッセージキャリアクラス
	 * @param msgClassTo コピー先のメッセージキャリアクラス
	 * @param inpOnly コピー先で入力項目として定義されている項目のみをマップに変換する場合はtrue
	 * @return Mapに変換されたCAANMsg
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> copyMsgToMap(CAANMsg msgObj, Class msgClassFrom, Class msgClassTo, boolean inputOnly)
			throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException,
			InvocationTargetException
	{

		Map<String, Object> map = new HashMap<String, Object>();

		Map<String, Object> colInfo1 = new HashMap<String, Object>();
		CAANSchemaInfo tmpSchemaInfo1 = (CAANSchemaInfo)msgClassFrom.newInstance();
		Method getContentsMethod1 = msgClassFrom.getMethod("getContents");
		getContentsMethod1.setAccessible(true);
		Object[][] contents1 = (Object[][])getContentsMethod1.invoke(tmpSchemaInfo1);
		for (Object[] recObj : contents1)
		{
			String columnName = (String)recObj[0];
			//String columnType = (String)recObj[1];
			String colValue   = msgObj.getString(columnName);
			colInfo1.put(columnName, colValue);
		}

		CAANSchemaInfo tmpSchemaInfo2 = (CAANSchemaInfo)msgClassTo.newInstance();
		Method getContentsMethod2 = msgClassTo.getMethod("getContents");
		getContentsMethod2.setAccessible(true);
		Object[][] contents2 = (Object[][])getContentsMethod2.invoke(tmpSchemaInfo2);
		for (Object[] recObj : contents2)
		{
			String columnName = (String)recObj[0];
			if (((inputOnly)&&(columnName.matches(".*_err$"))) || (!inputOnly))
			{
				String inpColumnName = (inputOnly) ? columnName.replaceAll("_err$", "") : columnName;
				if (colInfo1.containsKey(inpColumnName))
				{
					Object colValue = colInfo1.get(inpColumnName);
					map.put(inpColumnName, colValue);
				}
			}
		}

		return map;
	}

	/**
	 * 下り電文コントロールマップ、及び ユーザデータを設定します。<br />
	 * @param result サービスコンポーネントの実行結果
	 * @param param リクエストパラメータ
	 * @param scMapkey サービスコンポーネントID
	 * @param resUserData 追加でユーザデータに設定する情報
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public static void setResultAll(Map<?, ?> result, IRequestParameterReadWrite param, String scMapkey, Map resUserData) throws Throwable
	{

		// 下りユーザデータマップのセット
		setResultUserData(param, scMapkey, resUserData);

		// 下り電文コントロールマップのセット
		setResultCtrlData(param, result, scMapkey);
	}

	/**
	 * 下り電文コントロールマップのセットします。<br />
	 * @param param リクエストパラメータ
	 * @param result SCの実行結果
	 * @param scMapkey SCのID
	 * @param returnCd リターンコード
	 * @param status ステータス
	 */
	@SuppressWarnings("unchecked")
	public static void setResultCtrlData(IRequestParameterReadWrite param, Map<?, ?> result, String scMapkey, Object returnCd, Object status)
			throws Throwable
	{
		int returnCode = new Integer (returnCd.toString());
		int templateStatus = new Integer(status.toString());

		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);
		}

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));

	}

	/**
	 * 下り電文コントロールマップをセットします。<br />
	 * @param param リクエストパラメータ
	 * @param result SCの実行結果
	 * @param scMapkey SCのID
	 */
	public static void setResultCtrlData(IRequestParameterReadWrite param, Map<?, ?> result, String scMapkey) throws Throwable
	{
		Object returnCd = result.get(JCMConstants.RET_CD_INT_KEY);
		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg caanMsg = templates[0];
		Object status   = caanMsg.getInt(JCMConstants.STATUS_INT_KEY);

		setResultCtrlData(param, result, scMapkey, returnCd, status);
	}

	/**
	 * 下りユーザデータマップをセットします。<br />
	 * @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);
			if (userDataRef == null)
			{
				userDataRef = new HashMap();
				param.setData(scMapkey, userDataRef);
			}
			Iterator iterator = userData.keySet().iterator();
			while (iterator.hasNext())
			{
				String mapKey = (String)iterator.next();
				Object mapVal = userData.get(mapKey);
				userDataRef.put(mapKey, mapVal);
			}
		}
	}

	/**
	 * SCの返却情報からCAANMsgリストを取得します。<br />
	 * @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の返却情報から任意の項目のデータを文字列で取得します。<br />
	 * @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;
	}

	/**
	 * SCの返却情報から任意の項目のデータを数値で取得します。<br />
	 * @param result SCの返却情報
	 * @param columnName 項目名
	 * @return 対象項目のデータ
	 */
	public static Integer getResultInteger(Map<?, ?> result, String columnName)
	{
		Integer intVal = 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);
				CAANMsg[] listData = caanMsg.getCAANMsgList(listName);
				caanMsg = listData[index];
			}
			else
			{
				if (i == (colNames.length - 1))
				{
					intVal = caanMsg.getInt(tmpColName);
				}
				else
				{
					caanMsg = caanMsg.getCAANMsg(tmpColName);
				}
			}
		}
		return intVal;
	}

	/**
	 * サービスインターフェイスのエラー有無を判定します。<br />
	 * @param result サービスインターフェイス実行結果
	 * @return エラー有無(true:エラー有り、false:エラー無し)
	 */
	public static boolean isError(Map<?, ?> result)
	{
		return !isSuccess(result);
	}

	/**
	 * サービスインターフェイスのエラー有無を判定します。<br />
	 * @param result サービスインターフェイス実行結果
	 * @return エラー有無(true:エラー無し、false:エラー有り)
	 */
	public static boolean isSuccess(Map<?, ?> result)
	{
		Integer returnCd = getReturnCode(result);
		Integer status   = getStatus(result);
		
		return (returnCd.compareTo(0) == 0) && (status.compareTo(0) == 0);
	}

	/**
	 * SCの実行結果からリターンコードを取得します。<br />
	 * @param result SCの実行結果
	 * @return リターンコード
	 */
	public static Integer getReturnCode(Map<?, ?> result)
	{
		return (Integer) result.get(JCMConstants.RET_CD_INT_KEY);
	}

	/**
	 * SCの実行結果からステータスを取得します。<br />
	 * @param result SCの実行結果
	 * @return ステータス
	 */
	public static Integer getStatus(Map<?, ?> result)
	{
		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		return msg.getInt(JCMConstants.STATUS_INT_KEY);
	}

	/**
	 * BPチェックスキップ用のパラメータを作成します。<br />
	 * <br />
	 * @return パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static HashMap<String, Object> createBpNotCheckParam()
	{
		HashMap param4BpChek = new HashMap();
		param4BpChek.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{});
		return param4BpChek;
	}

	/**
	 * BPチェック結果編集。<br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs CAANメッセージリスト
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public static IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable
	{
		ArrayList<Object> allErrorInfo = new ArrayList<Object>();
		for (int i = 0; i < caanMsgs.length; i++)
		{
			HashMap result = new HashMap();
			CAANMsg[] tmpCaanMsgs2 = new CAANMsg[1];
			tmpCaanMsgs2[0] = caanMsgs[i];
			result.put(JCMConstants.RET_CD_INT_KEY, returnCode);
			result.put(JCMConstants.TEMPLATE_LIST_KEY, tmpCaanMsgs2);
			setResultCtrlData(param, result, null);
			ArrayList<Object> errorInfo = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
			for (Object errObj : errorInfo)
			{
				allErrorInfo.add(errObj);
			}
		}
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, allErrorInfo);
		return param;
	}

	/**
	 * 項目エラー判定。<br />
	 * <pre>指定された項目のエラー情報がリクエストパラメータに存在するかどうかを調べる。</pre>
	 * @param param リクエストパラメータ
	 * @param errFieldName エラーフィールド名 例) sysid_err
	 * @return true:エラーあり、false:エラーなし
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static boolean isErrorField(IRequestParameterReadWrite param, String errFieldName) throws RequestParameterException
	{
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		for (Object errObj : errList)
		{
			Map errorInfoMap = (Map)errObj;
			Map itemCheckErrorMap = (Map)errorInfoMap.get(ErrorInfoMapKeys.ITEM_CHECK_ERRORS);
			String errFlg = (String)itemCheckErrorMap.get(errFieldName);
			if ((errFlg != null)&&("".equals(errFlg)))
			{
				return true;
			}
		}
		return false;
	}

	/**
	 * リクエストパラメータのユーザデータ領域から指定されたマップキーのデータを取得します。<br />
	 * @param paramName パラメータ文字列
	 * @return ユーザデータ領域の指定されたパラメータ値
	 */
	@SuppressWarnings("unchecked")
	public static String getUserData(IRequestParameterReadOnly param, String paramName)
	{
		Object objVal = null;

		String[] valKeyNames = getColNames(paramName);

		try
		{
			String baseKey1 = valKeyNames[0];
			objVal = param.getData(baseKey1);
		}
		catch (RequestParameterException e)
		{
		}

		// 判定対象データの取得
		for (int i = 1; i < (valKeyNames.length); i++)
		{
			String nextKey = valKeyNames[i];
			if (objVal != null)
			{
				if (objVal instanceof Map)
				{
					Map objMap = (Map)objVal;
					objVal = objMap.get(nextKey);
				}
				else if (objVal instanceof List)
				{
					List objList = (List)objVal;
					objVal = objList.get(Integer.parseInt(nextKey));
				}
				else
				{
					objVal = null;
				}
			}
		}
		return (objVal != null) ? objVal.toString() : null;
	}

	/**
	 * リクエストパラメータの作業領域から指定されたマップキーのデータを取得します。<br />
	 * @param paramName パラメータ文字列
	 * @return 作業領域の指定されたパラメータ値
	 */
	@SuppressWarnings("unchecked")
	public static String getWorkData(IRequestParameterReadOnly param, String paramName)
	{
		Object objVal = null;

		String[] valKeyNames = getColNames(paramName);

		try
		{
			objVal = param.getMappingWorkArea();
		}
		catch (RequestParameterException e)
		{
		}

		// 判定対象データの取得
		for (int i = 0; i < (valKeyNames.length); i++)
		{
			String nextKey = valKeyNames[i];
			if (objVal != null)
			{
				if (objVal instanceof Map)
				{
					Map objMap = (Map)objVal;
					objVal = objMap.get(nextKey);
				}
				else if (objVal instanceof List)
				{
					List objList = (List)objVal;
					objVal = objList.get(Integer.parseInt(nextKey));
				}
				else
				{
					objVal = null;
				}
			}
		}
		return (objVal != null) ? objVal.toString() : null;
	}

	/**
	 * パラメータ文字列を配列に分解します。<br />
	 * @param str パラメータ文字列
	 * @return パラメータ文字列配列
	 */
	private static String[] getColNames(String str)
	{
		List<String> keyNameList = new ArrayList<String>();
		String[] tmpKeyNames = str.split("\\.");
		for (int i = 0; i < tmpKeyNames.length; i++)
		{
			String keyName = tmpKeyNames[i];
			if (keyName.matches(".+\\[[0-9]+\\]$"))
			{
				String listName = keyName.replaceAll("\\[[0-9]+\\]", "");
				String indexStr = keyName.replace(listName, "").replaceAll("(\\[|\\])", "");
				keyNameList.add(listName);
				keyNameList.add(indexStr);
			}
			else
			{
				keyNameList.add(keyName);
			}
		}

		String[] keyNames = new String[keyNameList.size()];
		for (int i = 0; i < keyNameList.size(); i++)
		{
			keyNames[i] = keyNameList.get(i);
		}
		return keyNames;
	}
}
