/*********************************************************************
 * All Rights reserved, Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUGetAddressCodeUtilFr
 *   ソースファイル名：JFUGetAddressCodeUtilFr.java
 *   作成者          ：富士通
 *   日付            ：2011年10月01日
 *＜機能概要＞
 *   住所コード取得処理部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/10/01   FJ）馬場    新規作成
 *   v10.00.00   2014/09/05   FJ) 清水    OM-2014-0002910
 *   v72.00.00   2024/10/16   FJ) 美濃原  ANK-4494-19-00_【双方向番ポ対応】 FRONTIERの利用場所住所連携内容変更 大字null対応
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
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.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EZM0081B011CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0081B011CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0081B050CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0081B050CBSMsg1List;

/**
 * 住所コード取得部品。
 *
 * @author FJ
 */
public class JFUGetAddressCodeUtilFr
{

	/** テンプレートID */
	public static final String TEMPLATE_ID = "EZM0081B050";
	/** テンプレートID */
	public static final String TEMPLATE_ID_EZM0081B011 = "EZM0081B011";

	/** 定数 "0" */
	public static final String ZERO = "0";

	/** ブランク */
	private static final String BLANK = "";

	/** エラーリスト */
	private static final String ERR_LIST = "err_list";

	/** RETURN_MESSAGE */
	private static final String RETURN_MESSAGE = "RETURN_MESSAGE_";

	/** Status Format */
	private static final String STATUS_FORMAT = "%1$04d";

	/** 機能コード1(都道府県名による検索) */
	private static final String func_code_key_1 = "1";

	/** 機能コード2(市区町村名による検索) */
	private static final String func_code_key_2 = "2";

	/** 機能コード3(大字通称名による検索) */
	private static final String func_code_key_3 = "3";

	/** 機能コード4(字丁目名による検索) */
	private static final String func_code_key_4 = "4";

	/** ステータスフラグ000(正常終了) */
	private static final String stat_flg_000 = "000";

	/** ステータスフラグ010(正常終了：大字名称なし) */
	private static final String stat_flg_010 = "010";

	/** ステータスフラグ101(都道府県名がマスタに存在しない) */
	private static final String stat_flg_101 = "101";

	/** ステータスフラグ201(市区町村名がマスタに存在しない) */
	private static final String stat_flg_201 = "201";

	/** ステータスフラグ301(大字通称名がマスタに存在しない) */
	private static final String stat_flg_301 = "301";

	/** ステータスフラグ401(字丁目名がマスタに存在しない) */
	private static final String stat_flg_401 = "401";


	/** 住所コード(都道府県名がマスタに存在しない場合) */
	private static final String ad_code_0 = "00000000000";

	/** 使用マップ確定フラグ（決定） */
	private static final String map_decide_flg_1 = "1";

	/** セパレータ */
	private static final String bnchi_separate_val = "−";

	/**
	 * 住所コード取得処理。
	 *
	 * @param handle
	 *            セッションマネージャなどを持ったハンドル
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText
	 *            ユーザ任意文字列
	 * @return IRequestParameterReadWrite パラメータオブジェクト
	 * @exception Exceptionがスローされます。
	 *
	 */
	public HashMap<?, ?> getAddressCode(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> inMap) throws Exception
	{

		// パラメータを取得します。
		IRequestParameterReadWrite useParam = param;

		// SC呼び出し部品のインスタンスを生成します。
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		String map_decide_flg = BLANK;
		String stat_flg = BLANK;
		HashMap<?, ?> outMap = null;

		// ■検索処理@（都道府県名による検索）
		HashMap<String, Object> paramMap = editInMsg(useParam, func_code_key_1, inMap); // 上りマッピング
		Map<?, ?> result_1 = scCall.run(paramMap, handle); // SC呼び出し

		// ■検索処理A（市区町村名による検索）
		paramMap = editInMsg(useParam, func_code_key_2, inMap); // 上りマッピング
		Map<?, ?> result_2 = scCall.run(paramMap, handle); // SC呼び出し

		// ■検索処理B（大字通称名による検索）
		paramMap = editInMsg(useParam, func_code_key_3, inMap); // 上りマッピング
		Map<?, ?> result_3 = scCall.run(paramMap, handle); // SC呼び出し


		// ■検索処理C（字丁目名による検索）
		Map<?, ?> result_4 = null;
		if (JFUBPCommon.isNull(inMap.get("key_oaztsu_nm")))
		{
			// 大字名称なし
			paramMap = editInMsgOazaNull(useParam, func_code_key_4, inMap); // 上りマッピング
			Map<?, ?> result_4_oazaNull = scCall.run(paramMap, handle); // SC呼び出し
			if (result_4_oazaNull != null && result_4_oazaNull.size() > 0)
			{
				// 検索結果がある場合
				outMap = editOutMsgOazaNull(useParam, stat_flg_010, result_4_oazaNull, inMap);
				if (outMap != null && outMap.containsKey("stat_flg") && !map_decide_flg_1.equals(map_decide_flg))
				{
					// ステータスフラグに"010"(正常終了) 大字名称なし を設定します。
					stat_flg = stat_flg_010;
					map_decide_flg = map_decide_flg_1;
				}
			}
		}
		else
		{
			// 大字名称あり
			paramMap = editInMsg(useParam, func_code_key_4, inMap); // 上りマッピング
			result_4 = scCall.run(paramMap, handle); // SC呼び出し
		}

		// 検索結果のリストを取得します。
		// □検索処理@の結果リスト
		CAANMsg[] templates1 = (CAANMsg[])result_1.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template1 = templates1[0];
		CAANMsg[] templateArray1 = template1.getCAANMsgList(EZM0081B050CBSMsg.EZM0081B050CBSMSG1LIST);

		// □検索処理Aの結果リスト
		CAANMsg[] templates2 = (CAANMsg[])result_2.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template2 = templates2[0];
		CAANMsg[] templateArray2 = template2.getCAANMsgList(EZM0081B050CBSMsg.EZM0081B050CBSMSG1LIST);

		// □検索処理Bの結果リスト
		CAANMsg[] templates3 = (CAANMsg[])result_3.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template3 = templates3[0];
		CAANMsg[] templateArray3 = template3.getCAANMsgList(EZM0081B050CBSMsg.EZM0081B050CBSMSG1LIST);

		// □検索処理Cの結果リスト
		CAANMsg[] templateArray4 = null;

		if (result_4 != null && result_4.size() > 0)
		{
			// 大字名称あり
			CAANMsg[] templates4 = (CAANMsg[])result_4.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg template4 = templates4[0];
			templateArray4 = template4.getCAANMsgList(EZM0081B050CBSMsg.EZM0081B050CBSMSG1LIST);
		}

		// ◆検索結果判定処理
		Map<?, ?> result_list = null;

		// 字丁目名による検索結果が0件でなかった場合 [注]大字名称なしの「stat_flg_010」は設定済。
		if (templateArray4 != null && 0 != templateArray4.length && !map_decide_flg_1.equals(map_decide_flg))
		{
			// ステータスフラグに"000"(正常終了)を設定します。
			stat_flg = stat_flg_000;
			map_decide_flg = map_decide_flg_1;
			result_list = result_4;

		}
		// 大字通称名による検索結が0件でなかった場合
		if (templateArray3 != null && 0 != templateArray3.length && !map_decide_flg_1.equals(map_decide_flg))
		{
			// ステータスフラグに"401"(字丁目名がマスタに存在しない)を設定します。
			stat_flg = stat_flg_401;
			map_decide_flg = map_decide_flg_1;
			result_list = result_3;

		}
		// 市区町村名による検索結果が0件でなかった場合
		if (templateArray2 != null && 0 != templateArray2.length && !map_decide_flg_1.equals(map_decide_flg))
		{
			// ステータスフラグに"301"(大字通称名がマスタに存在しない)を設定します。
			stat_flg = stat_flg_301;
			map_decide_flg = map_decide_flg_1;
			result_list = result_2;

		}
		// 都道府県名による検索結果が0件でなかった場合
		if (templateArray1 != null && 0 != templateArray1.length && !map_decide_flg_1.equals(map_decide_flg))
		{
			// ステータスフラグに"201"(市区町村名がマスタに存在しない)を設定します。
			stat_flg = stat_flg_201;
			map_decide_flg = map_decide_flg_1;
			result_list = result_1;

		}
		// 都道府県名による検索結果が0件だった場合
		if (templateArray1 != null && 0 == templateArray1.length && !map_decide_flg_1.equals(map_decide_flg))
		{
			// ステータスフラグに"101"(都道府県名がマスタに存在しない)を設定します。
			stat_flg = stat_flg_101;
			map_decide_flg = map_decide_flg_1;
			result_list = result_1;

		}

		// 入力チェックでエラーとなった場合
		if (!map_decide_flg_1.equals(map_decide_flg))
		{
			// ステータスフラグに"101"(都道府県名がマスタに存在しない)を設定します。
			stat_flg = stat_flg_101;
			map_decide_flg = map_decide_flg_1;
			result_list = result_1;
		}

		// ■下りマッピング処理を行います。[注]大字名称なしの「stat_flg_010」は設定済のためここでは処理しない。
		if (!stat_flg_010.equals(stat_flg))
		{
			outMap = editOutMsg(useParam, stat_flg, result_list, inMap);
		}

		return outMap;
	}

	/**
	 * 住所コード取得処理用メッセージ設定処理
	 *
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return HashMap 住所コード取得処理用メッセージ設定したパラメータオブジェクト
	 * @exception RequestParameterExceptionがスローされます。
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, String count, HashMap inMap) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>(10);

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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));

		// ユーザデータ情報
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = setTemplate(inMap, param, count);
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * 住所コード取得処理用メッセージ取得処理
	 *
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return IRequestParameterReadWrite 住所コード取得処理情報取得処理用メッセージ設定したパラメータオブジェクト
	 * @exception Exceptionがスローされます。
	 */
	private HashMap editOutMsg(IRequestParameterReadWrite param, String stat_flg, Map<?, ?> result_list, HashMap inMap) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得します。
		CAANMsg[] templates = (CAANMsg[])result_list.get(JCMConstants.TEMPLATE_LIST_KEY);

		// リターンコード取得
		Object return_code = result_list.get(JCMConstants.RET_CD_INT_KEY);

		// 結果を詰めるマップを取得。
		HashMap dataMap = new HashMap(10);

		// 住所情報を設定するマップを生成します。
		HashMap oupMap = getTemplate(templates, stat_flg, dataMap, inMap);
		// エラー情報の設定
		oupMap = setErrorList(param, templates, (Integer)return_code, oupMap);

		return oupMap;
	}

	/**
	 * エラー情報マッピング処理
	 *
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param templates
	 *            サービスインターフェイスの実行結果を格納しているテンプレート
	 * @param returnCode
	 *            サービスインターフェイスを実行後のリタンコード
	 * @return IRequestParameterReadWrite 住所コード取得処理用メッセージ設定したパラメータオブジェクト
	 * @exception RequestParameterExceptionがスローされます。
	 */
	public HashMap setErrorList(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, HashMap map) throws RequestParameterException
	{

		// エラーリストを設定します。
		ArrayList errlist = new ArrayList(10);

		// エラーマップを設定します。
		HashMap errMap = new HashMap(10);

		// ユーザデータ情報を取得します。
		HashMap inMap = map;

		for (int i = 0; i < templates.length; i++)
		{

			CAANMsg template = templates[i];
			int templateStatus = template.getInt(EZM0081B050CBSMsg.STATUS);
			if (0 != returnCode)
			{
				templateStatus = 9000;
			}
			if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE + String.format(STATUS_FORMAT, templateStatus)))
			{
				templateStatus = 0;
			}

			int bpStatus = 0;
			Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
			if (null == obj)
			{
				bpStatus = -1;
			}
			else
			{
				bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
			}

			if (templateStatus > bpStatus)
			{

				// BPにサービスコンポーネントのステータスを設定します。
				String formatStatus = String.format(STATUS_FORMAT, templateStatus);
				String message = JCMAPLConstMgr.getString(RETURN_MESSAGE + formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
			}

			// 住所コード取得マップ.ＫＥＹ＿都道府県名エラー → ＫＥＹ＿都道府県名のエラー情報返却
			if (!template.isNull(EZM0081B050CBSMsg.KEY_STATE_NM_ERR))
			{
				errMap.put(EZM0081B050CBSMsg.KEY_STATE_NM_ERR, template.getString(EZM0081B050CBSMsg.KEY_STATE_NM_ERR));
			}

			// 住所コード取得マップ.ＫＥＹ＿市区町村名エラー → ＫＥＹ＿市区町村名のエラー情報返却
			if (!template.isNull(EZM0081B050CBSMsg.KEY_CITY_NM_ERR))
			{
				errMap.put(EZM0081B050CBSMsg.KEY_CITY_NM_ERR, template.getString(EZM0081B050CBSMsg.KEY_CITY_NM_ERR));
			}

			// 住所コード取得マップ.ＫＥＹ＿大字通称名エラー → ＫＥＹ＿大字通称名のエラー情報返却
			if (!template.isNull(EZM0081B050CBSMsg.KEY_OAZTSU_NM_ERR))
			{
				errMap.put(EZM0081B050CBSMsg.KEY_OAZTSU_NM_ERR, template.getString(EZM0081B050CBSMsg.KEY_OAZTSU_NM_ERR));
			}

			// 住所コード取得マップ.ＫＥＹ＿字丁目名エラー → ＫＥＹ＿字丁目名のエラー情報返却
			if (!template.isNull(EZM0081B050CBSMsg.KEY_AZCHO_NM_ERR))
			{
				errMap.put(EZM0081B050CBSMsg.KEY_AZCHO_NM_ERR, template.getString(EZM0081B050CBSMsg.KEY_AZCHO_NM_ERR));
			}

			// エラー情報をリストに設定します。
			errlist.add(errMap);
		}

		inMap.put(ERR_LIST, errlist);
		return inMap;
	}

	/**
	 * 住所コード取得情報設定処理
	 *
	 * @param inMap
	 *            ユーザデータ情報
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return template 住所コード取得処理情報を設定したパラメータオブジェクト
	 * @exception RequestParameterExceptionがスローされます。
	 */
	private CAANMsg setTemplate(HashMap inMap, IRequestParameterReadWrite param, String count) throws RequestParameterException
	{

		CAANMsg template = new CAANMsg(EZM0081B050CBSMsg.class.getName());

		// テンプレートID
		template.set(EZM0081B050CBSMsg.TEMPLATEID, TEMPLATE_ID);

		// オペレータ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);

		// 機能コード
		template.set(EZM0081B050CBSMsg.FUNC_CODE, count);

		// ◇業務データの設定
		// 住所コード取得リスト.ＫＥＹ＿都道府県名 → ＫＥＹ＿都道府県名
		if (BLANK.equals(inMap.get("key_state_nm")))
		{
			template.setNull(EZM0081B050CBSMsg.KEY_STATE_NM);
		}
		else
		{
			template.set(EZM0081B050CBSMsg.KEY_STATE_NM, (String)inMap.get("key_state_nm"));
		}

		// 住所コード取得リスト.ＫＥＹ＿市区町村名 → ＫＥＹ＿市区町村名
		if (BLANK.equals(inMap.get("key_city_nm")))
		{
			template.setNull(EZM0081B050CBSMsg.KEY_CITY_NM);
		}
		else
		{
			template.set(EZM0081B050CBSMsg.KEY_CITY_NM, (String)inMap.get("key_city_nm"));
		}

		// 住所コード取得リスト.ＫＥＹ＿大字通称名 → ＫＥＹ＿大字通称名
		if (BLANK.equals(inMap.get("key_oaztsu_nm")))
		{
			template.setNull(EZM0081B050CBSMsg.KEY_OAZTSU_NM);
		}
		else
		{
			template.set(EZM0081B050CBSMsg.KEY_OAZTSU_NM, (String)inMap.get("key_oaztsu_nm"));
		}

		// 住所コード取得リスト.ＫＥＹ＿字丁目名 → ＫＥＹ＿字丁目名
		if (BLANK.equals(inMap.get("key_azcho_nm")))
		{
			template.setNull(EZM0081B050CBSMsg.KEY_AZCHO_NM);
		}
		else
		{
			template.set(EZM0081B050CBSMsg.KEY_AZCHO_NM, (String)inMap.get("key_azcho_nm"));
		}

		return template;

	}

	/**
	 * 住所コード取得情報返却情報設定処理
	 *
	 * @param templates
	 *            住所コード取得処理の返却情報が設定されているパラメータオブジェクト
	 * @param stat_flg
	 *            ステータスフラグ
	 * @param inMap
	 *            ユーザー情報
	 * @return map 住所コード取得処理の返却情報を設定したMap
	 * @exception Exceptionがスローされます。
	 */
	private HashMap getTemplate(CAANMsg[] templates, String stat_flg, HashMap dataMap, HashMap inMap) throws Exception
	{

		// 返却情報を詰めるマップを生成します。
		HashMap map = new HashMap(10);
		// ステータスフラグを設定します。
		map.put("stat_flg", stat_flg);

		String before_bnchi = BLANK;

		// 編集前番地を取得します。
		if (null == inMap.get("before_bnchi"))
		{
			before_bnchi = BLANK;
		}
		else
		{
			before_bnchi = (String)inMap.get("before_bnchi");
		}

		String before_chome_bnchi = BLANK;

		// 編集前番地を取得します。
		if (null != inMap.get("before_chome_bnchi"))
		{
			before_chome_bnchi = (String)inMap.get("before_chome_bnchi");
		}

		// 返却情報を取得します。
		CAANMsg template = templates[0];

		// ■以下、検索結果に応じた住所情報編集処理■
		// ＫＥＹ＿都道府県名
		String state_nm = template.getString(EZM0081B050CBSMsg.KEY_STATE_NM);
		// ＫＥＹ＿市区町村名
		String city_nm = template.getString(EZM0081B050CBSMsg.KEY_CITY_NM);
		// ＫＥＹ＿大字通称名
		String oaztsu_nm = template.getString(EZM0081B050CBSMsg.KEY_OAZTSU_NM);
		// ＫＥＹ＿字丁目名
		String azcho_nm = template.getString(EZM0081B050CBSMsg.KEY_AZCHO_NM);

		// 値がnullの場合に結合すると、nullという文字列で扱われてしまうため、""を設定します。
		if (null == state_nm)
		{
			state_nm = BLANK;
		}
		if (null == city_nm)
		{
			city_nm = BLANK;
		}
		if (null == oaztsu_nm)
		{
			oaztsu_nm = BLANK;
		}
		if (null == azcho_nm)
		{
			azcho_nm = BLANK;
		}

		String bnchi_separate = BLANK;
		String after_bnchi = BLANK;

		// OM-2014-0002910 字丁目を追加
		if ((BLANK.equals(before_bnchi) || null == before_bnchi) || BLANK.equals(azcho_nm))
		{
			// 番地もしくは字丁目が空の場合はセパレータを設定しません。
		}
		else
		{
			bnchi_separate = bnchi_separate_val;
		}

		// ステータスフラグの値に応じて、住所情報を編集します。
		if (stat_flg_000.equals(stat_flg))
		{
			// 処理結果が正常終了の場合、結合処理は実施しません。
			after_bnchi = before_bnchi;
		}

		if (stat_flg_401.equals(stat_flg))
		{
			// 字丁目名がマスタに存在しない場合、字丁目名以下の住所情報を番地に結合します。
			after_bnchi = azcho_nm + bnchi_separate + before_bnchi;
		}

		if (stat_flg_301.equals(stat_flg))
		{
			// 大字通称名がマスタに存在しない場合、大字通称名以下の住所情報を番地に結合します。
			if (!BLANK.equals(before_chome_bnchi))
			{
				after_bnchi = addSepalate(oaztsu_nm, before_chome_bnchi);
			}
			else
			{
				after_bnchi = oaztsu_nm + azcho_nm + bnchi_separate + before_bnchi;
			}
		}

		if (stat_flg_201.equals(stat_flg))
		{
			// 市区町村名がマスタに存在しない場合、市区町村名以下の住所情報を番地に結合します。
			if (!BLANK.equals(before_chome_bnchi))
			{
				after_bnchi = city_nm + addSepalate(oaztsu_nm, before_chome_bnchi);
			}
			else
			{
				after_bnchi = city_nm + oaztsu_nm + azcho_nm + bnchi_separate + before_bnchi;
			}
		}

		if (stat_flg_101.equals(stat_flg))
		{
			// 都道府県名がマスタに存在しない場合、都道府県名以下の住所情報を番地に結合します。
			if (!BLANK.equals(before_chome_bnchi))
			{
				after_bnchi = state_nm + city_nm + addSepalate(oaztsu_nm, before_chome_bnchi);
			}
			else
			{
				after_bnchi = state_nm + city_nm + oaztsu_nm + azcho_nm + bnchi_separate + before_bnchi;
			}
			// 都道府県名がマスタに存在しない場合、住所コードに"00000000000"を設定します。
			map.put("ad_cd", ad_code_0);
			map.put("pcd", BLANK);
			map.put("state_nm", BLANK);
			map.put("city_nm", BLANK);
			map.put("oaztsu_nm", BLANK);
			map.put("azcho_nm", BLANK);
			map.put("after_bnchi", after_bnchi);
			return map;
		}

		// ■以下、マスタに存在した住所情報の取得処理■
		CAANMsg[] templateArray = template.getCAANMsgList(EZM0081B050CBSMsg.EZM0081B050CBSMSG1LIST);

		CAANMsg childTemplateArray = templateArray[0];

		// 住所コード取得マップ.住所コード ← 住所コード
		if (childTemplateArray.isNull(EZM0081B050CBSMsg1List.AD_CD))
		{
			map.put("ad_cd", BLANK);
		}
		else
		{
			map.put("ad_cd", childTemplateArray.getString(EZM0081B050CBSMsg1List.AD_CD));
		}

		// 住所コード取得マップ.郵便番号 ← 郵便番号
		if (childTemplateArray.isNull(EZM0081B050CBSMsg1List.PCD))
		{
			map.put("pcd", BLANK);
		}
		else
		{
			map.put("pcd", childTemplateArray.getString(EZM0081B050CBSMsg1List.PCD));
		}

		// 住所コード取得マップ.都道府県名 ← 都道府県名
		if (childTemplateArray.isNull(EZM0081B050CBSMsg1List.STATE_NM))
		{
			map.put("state_nm", BLANK);
		}
		else
		{
			map.put("state_nm", childTemplateArray.getString(EZM0081B050CBSMsg1List.STATE_NM));
		}

		// 住所コード取得マップ.市区町村名 ← 市区町村名
		if (childTemplateArray.isNull(EZM0081B050CBSMsg1List.CITY_NM))
		{
			map.put("city_nm", BLANK);
		}
		else
		{
			map.put("city_nm", childTemplateArray.getString(EZM0081B050CBSMsg1List.CITY_NM));
		}

		// 住所コード取得マップ.大字通称名 ← 大字通称名
		if (childTemplateArray.isNull(EZM0081B050CBSMsg1List.OAZTSU_NM))
		{
			map.put("oaztsu_nm", BLANK);
		}
		else
		{
			map.put("oaztsu_nm", childTemplateArray.getString(EZM0081B050CBSMsg1List.OAZTSU_NM));
		}

		// 住所コード取得マップ.字丁目名 ← 字丁目名
		if (childTemplateArray.isNull(EZM0081B050CBSMsg1List.AZCHO_NM))
		{
			map.put("azcho_nm", BLANK);
		}
		else
		{
			map.put("azcho_nm", childTemplateArray.getString(EZM0081B050CBSMsg1List.AZCHO_NM));
		}

		// 編集後番地を設定する。
		map.put("after_bnchi", after_bnchi);

		return map;
	}

	/**
	 * 住所用セパレータ（全角マイナス）を設定。
	 * <br>
	 * 
	 * @param aza 字
	 * @param chome_bnchi 丁目・番地
	 * @return 編集後の文字列
	 */
	private String addSepalate(String aza, String chome_bnchi)
	{
		if (aza != null && aza.length() > 0 && aza.substring(aza.length() - 1, aza.length()).matches("[０-９]") && chome_bnchi != null
				&& chome_bnchi.length() > 0 && chome_bnchi.substring(0, 1).matches("[０-９]"))
		{
			// 字の最後1桁と丁目・番地の最初1桁が全角数字の場合にセパレータを設定する。
			return aza + bnchi_separate_val + chome_bnchi;
		}
		return aza + chome_bnchi;
	}

	/**
	 * 住所コード取得処理用メッセージ設定処理
	 *
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return HashMap 住所コード取得処理用メッセージ設定したパラメータオブジェクト
	 * @exception RequestParameterExceptionがスローされます。
	 */
	private HashMap<String, Object> editInMsgOazaNull(IRequestParameterReadWrite param, String count, HashMap inMap) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>(10);

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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));

		// ユーザデータ情報
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = setTemplateOazaNull(inMap, param);
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * 字丁目一覧照会情報設定処理<大字名称なし>
	 *
	 * @param inMap
	 *            ユーザデータ情報
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return template 字丁目一覧照会処理情報を設定したパラメータオブジェクト
	 * @exception RequestParameterExceptionがスローされます。
	 */
	private CAANMsg setTemplateOazaNull(HashMap inMap, IRequestParameterReadWrite param) throws RequestParameterException
	{

		CAANMsg template = new CAANMsg(EZM0081B011CBSMsg.class.getName());

		// テンプレートID
		template.set(EZM0081B011CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0081B011);

		// オペレータ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);

		// KEY_基準日
		template.set(EZM0081B011CBSMsg.KEY_YMD, operateDate);
		// 機能コード（固定）
		template.set(EZM0081B011CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);
		// 検索最大件数
		template.set(EZM0081B011CBSMsg.MAX_SEARCH_NUM, "1000");
		// 検索最大件数
		template.set(EZM0081B011CBSMsg.DISPLAY_NUM, "1000");
		// 検索最大件数
		template.set(EZM0081B011CBSMsg.DISPLAY_PAGE_NUM, "1");

		// 分割した都道府県、市区町村を取得します。
		String state = (String)inMap.get("key_state_nm");
		String city = (String)inMap.get("key_city_nm");
		String azcho = (String)inMap.get("key_azcho_nm");

		// ◇業務データの設定
		// 分割後の都道府県名 → ＫＥＹ＿都道府県名
		if (JFUBPCommon.isNull(state))
		{
			template.setNull(EZM0081B011CBSMsg.KEY_STATE_NM);
		}
		else
		{
			template.set(EZM0081B011CBSMsg.KEY_STATE_NM, state);
		}

		// 分割後の市区町村名 → ＫＥＹ＿市区町村名
		if (JFUBPCommon.isNull(city))
		{
			template.setNull(EZM0081B011CBSMsg.KEY_CITY_NM);
		}
		else
		{
			template.set(EZM0081B011CBSMsg.KEY_CITY_NM, city);
		}

		// 大字通称名 → 住所コード取得マップ.大字通称名
		template.setNull(EZM0081B011CBSMsg.KEY_OAZTSU_NM);

		// 字丁目名 → 住所コード取得マップ.字丁目名
		if (JFUBPCommon.isNull(azcho))
		{
			template.setNull(EZM0081B011CBSMsg.KEY_AZCHO_NM);
		}
		else
		{
			template.set(EZM0081B011CBSMsg.KEY_AZCHO_NM, azcho);
		}

		return template;

	}

	/**
	 * 住所コード取得処理用メッセージ取得処理
	 *
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return IRequestParameterReadWrite 住所コード取得処理情報取得処理用メッセージ設定したパラメータオブジェクト
	 * @exception Exceptionがスローされます。
	 */
	private HashMap editOutMsgOazaNull(IRequestParameterReadWrite param, String stat_flg, Map<?, ?> result_list, HashMap inMap) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得します。
		CAANMsg[] templates = (CAANMsg[])result_list.get(JCMConstants.TEMPLATE_LIST_KEY);

		// リターンコード取得
		Object return_code = result_list.get(JCMConstants.RET_CD_INT_KEY);

		// 結果を詰めるマップを取得。
		HashMap dataMap = new HashMap(10);

		// 住所情報を設定するマップを生成します。
		HashMap oupMap = getTemplateOazaNull(templates, stat_flg, dataMap, inMap);

		return oupMap;
	}

	/**
	 * 住所コード取得情報返却情報設定処理<br/>
	 * ※stat_flg_010 専用
	 *
	 * @param templates
	 *            住所コード取得処理の返却情報が設定されているパラメータオブジェクト
	 * @param stat_flg
	 *            ステータスフラグ
	 * @param inMap
	 *            ユーザー情報
	 * @return map 住所コード取得処理の返却情報を設定したMap
	 * @exception Exceptionがスローされます。
	 */
	private HashMap getTemplateOazaNull(CAANMsg[] templates, String stat_flg, HashMap dataMap, HashMap inMap) throws Exception
	{

		// 返却情報を詰めるマップを生成します。
		HashMap map = new HashMap(10);
		// ステータスフラグを設定します。
		map.put("stat_flg", stat_flg);

		String before_bnchi = BLANK;

		// 編集前番地を取得します。
		if (null == inMap.get("before_bnchi"))
		{
			before_bnchi = BLANK;
		}
		else
		{
			before_bnchi = (String)inMap.get("before_bnchi");
		}

		// 返却情報を取得します。
		CAANMsg template = templates[0];

		// ■以下、検索結果に応じた住所情報編集処理■
		// ＫＥＹ＿都道府県名
		String state_nm = template.getString(EZM0081B011CBSMsg.KEY_STATE_NM);
		// ＫＥＹ＿市区町村名
		String city_nm = template.getString(EZM0081B011CBSMsg.KEY_CITY_NM);
		// ＫＥＹ＿大字通称名
		String oaztsu_nm = template.getString(EZM0081B011CBSMsg.KEY_OAZTSU_NM);
		// ＫＥＹ＿字丁目名
		String azcho_nm = template.getString(EZM0081B011CBSMsg.KEY_AZCHO_NM);

		// 値がnullの場合に結合すると、nullという文字列で扱われてしまうため、""を設定します。
		if (null == state_nm)
		{
			state_nm = BLANK;
		}
		if (null == city_nm)
		{
			city_nm = BLANK;
		}
		if (null == oaztsu_nm)
		{
			oaztsu_nm = BLANK;
		}
		if (null == azcho_nm)
		{
			azcho_nm = BLANK;
		}

		String after_bnchi = BLANK;

		// ステータスフラグの値に応じて、住所情報を編集します。
		// 処理結果が正常終了の場合、結合処理は実施しません。
		after_bnchi = before_bnchi;

		// ■以下、マスタに存在した住所情報の取得処理■
		CAANMsg[] templateArray = template.getCAANMsgList(EZM0081B011CBSMsg.EZM0081B011CBSMSG1LIST);

		boolean existsFlg = false;
		if (templateArray != null && templateArray.length > 0)
		{
			for (CAANMsg childTemplateArray : templateArray)
			{
				if (!(state_nm.equals(childTemplateArray.getString(EZM0081B011CBSMsg1List.STATE_NM))
						&& city_nm.equals(childTemplateArray.getString(EZM0081B011CBSMsg1List.CITY_NM))
						&& JFUBPCommon.isNull(childTemplateArray.getString(EZM0081B011CBSMsg1List.OAZTSU_NM))
						&& azcho_nm.equals(childTemplateArray.getString(EZM0081B011CBSMsg1List.AZCHO_NM))))
				{
					continue;
				}
				existsFlg = true;
				// 住所コード取得マップ.住所コード ← 住所コード
				if (childTemplateArray.isNull(EZM0081B011CBSMsg1List.AD_CD))
				{
					map.put("ad_cd", BLANK);
				}
				else
				{
					map.put("ad_cd", childTemplateArray.getString(EZM0081B011CBSMsg1List.AD_CD));
				}

				// 住所コード取得マップ.郵便番号 ← 郵便番号
				if (childTemplateArray.isNull(EZM0081B011CBSMsg1List.PCD))
				{
					map.put("pcd", BLANK);
				}
				else
				{
					map.put("pcd", childTemplateArray.getString(EZM0081B011CBSMsg1List.PCD));
				}

				// 住所コード取得マップ.都道府県名 ← 都道府県名
				if (childTemplateArray.isNull(EZM0081B011CBSMsg1List.STATE_NM))
				{
					map.put("state_nm", BLANK);
				}
				else
				{
					map.put("state_nm", childTemplateArray.getString(EZM0081B011CBSMsg1List.STATE_NM));
				}

				// 住所コード取得マップ.市区町村名 ← 市区町村名
				if (childTemplateArray.isNull(EZM0081B011CBSMsg1List.CITY_NM))
				{
					map.put("city_nm", BLANK);
				}
				else
				{
					map.put("city_nm", childTemplateArray.getString(EZM0081B011CBSMsg1List.CITY_NM));
				}

				// 住所コード取得マップ.大字通称名 ← 大字通称名
				if (childTemplateArray.isNull(EZM0081B011CBSMsg1List.OAZTSU_NM))
				{
					map.put("oaztsu_nm", BLANK);
				}
				else
				{
					map.put("oaztsu_nm", childTemplateArray.getString(EZM0081B011CBSMsg1List.OAZTSU_NM));
				}

				// 住所コード取得マップ.字丁目名 ← 字丁目名
				if (childTemplateArray.isNull(EZM0081B011CBSMsg1List.AZCHO_NM))
				{
					map.put("azcho_nm", BLANK);
				}
				else
				{
					map.put("azcho_nm", childTemplateArray.getString(EZM0081B011CBSMsg1List.AZCHO_NM));
				}

				// 編集後番地を設定する。
				map.put("after_bnchi", after_bnchi);
			}
		}

		if (existsFlg)
		{
			// 対象データあり
			return map;
		}
		return new HashMap();
	}

}
