/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKAdEdit
*	ソースファイル名：JKKAdEdit.java
*	作成者			：FJ)藤本
*	日付			：2018年03月20日
*＜機能概要＞
*	住所編集部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v37.00.00   2018/03/20   FJ)藤本	【ANK-3366-00-00】eo光設備卸対応
*   v39.00.00   2018/11/07   FJ)中原	【ST-2018-0000046】入力住所の番地号の桁数チェック追加
*   v39.00.01   2018/11/09   FJ)中原	【OT-2018-0000006】番地号の未設定対応
*   v39.00.02   2018/11/16   FJ)中原	【ST-2018-0000046】入力住所登録桁数超対応
*   v39.00.03   2018/12/03   FJ)中原	【ANK-3477-00-00】eoマイページからのお客さま情報変更自動反映
*   v39.01.00   2018/12/12   FJ)中原	【OM-2018-0001249】卸契約の申込情報を画面で確認したら　利用場所住所の文字列が　番地号の情報が入力されていなかった。
*   v41.00.00   2019/04/16   FJ)岡井    【ANK-3612-00-00】eoマイページからのお客さま情報自動更新機能改善
*   v44.00.00   2019/06/17   FJ)澤田    【OM-2019-0000658】CKIFI008_会員情報照会受付（PMP）を実行したら、登録してない番地で登録された
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
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.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
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.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EZM0081B011CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0081B011CBSMsg1List;
import com.fujitsu.futurity.common.JCCSyslogFormat;

import java.sql.Date;
import java.text.SimpleDateFormat;
import com.fujitsu.futurity.common.JCCSuperComExecUtil;


/**
 * 住所編集部品です。
 * <br>
 * @author FJ
 */
public class JKKAdEdit extends AbstractCommonComponent
{
	/** 部品パラメータ：編集モード */
	public static final String EDIT_MODE = "edit_mode";
	/** 部品パラメータ：郵便番号 */
	public static final String PCD = "pcd";
	/** 部品パラメータ：都道府県名 */
	public static final String STATE_NM = "state_nm";
	/** 部品パラメータ：市区町村名 */
	public static final String CITY_NM = "city_nm";
	/** 部品パラメータ：大字通称名 */
	public static final String OAZTSU_NM = "oaztsu_nm";
	/** 部品パラメータ：字丁目名 */
	public static final String AZCHO_NM = "azcho_nm";
	/** 部品パラメータ：番地号 */
	public static final String BNCHIGO = "bnchigo";
	/** 部品パラメータ：建物名 */
	public static final String ADRTTM = "adrttm";
	/** 部品パラメータ：部屋番号 */
	public static final String ADRRM = "adrrm";
	/** 部品パラメータ：住所コード */
	public static final String AD_CD = "ad_cd";
	/** 部品パラメータ：手動入力フラグ */
	public static final String MAN_INPUT_FLG = "man_input_flg";

	/** 編集モード：登録用住所編集 */
	public static final String EDIT_MODE_ADD = "1";
	/** 編集モード：変更用住所編集 */
	public static final String EDIT_MODE_CHG = "2";

	/** テンプレートID：共通住所一覧照会 */
	private static final String TEMPLATE_ID_EZM0081B011 = "EZM0081B011";

	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";

	/** 番地号の最大文字数 */
	private static final int MAX_LEN_BNCHIGO = 61;
	/** 建物名の最大文字数 */
	private static final int MAX_LEN_ADRTTM = 45;
	/** 部屋番号の最大文字数 */
	private static final int MAX_LEN_ADRRM = 15;

	// ST-2018-0000046 ADD START
	/** 住所コードによる番地号最大桁数パターン */
	private final int PATTERN1 = 15;
	private final int PATTERN2 = 27;
	private final int PATTERN3 = 45;
	private final int PATTERN4 = 57;
	private final int PATTERN5 = 61;
	// ST-2018-0000046 ADD END
	// ST-2018-0000046 ADD START
	/** 住所登録時エラーメッセージ */
	private static final String MESLOG_ADDRESS = "設定された住所が最大桁数を超えています。住所を再登録してください。";
	/** 呼び出し元サービスID　KKSV0895 */
	private static final String KKSV0895 = "KKSV0895";
	/** 呼び出し元サービスID　CKSV0063 */
	private static final String CKSV0063 = "CKSV0063";
	// ST-2018-0000046 ADD END
	// ANK-3477-00-00 ADD START
	/** 呼び出し元サービスID　CKSV0064 */
	private static final String CKSV0064 = "CKSV0064";
	// ANK-3477-00-00 ADD END
	// ANK-3612-00-00 ADD START
	/** 呼び出し元サービスID　CKSV9010 */
	private static final String CKSV9010 = "CKSV9010";
	/** 呼び出し元サービスID　CKSV9022 */
	private static final String CKSV9022 = "CKSV9022";
	/** 呼び出し元サービスID　CKSV9023 */
	private static final String CKSV9023 = "CKSV9023";
	/** 呼び出し元サービスID　CKSV9024 */
	private static final String CKSV9024 = "CKSV9024";
	// ANK-3612-00-00 ADD END
	/**
	 * 住所コードの取得、住所情報の分割を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ定義文字列
	 * @return 住所編集結果
	 * @throws Throwable 例外が発生した場合
	 */
	public Map<String, Object> editAd(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> trgtData, String fixedText)
	throws Throwable
	{
		// 住所編集結果
		Map<String, Object> adEditRslt = new HashMap<String, Object>();

		// パラメータチェック
		if (!checkParameter(trgtData))
		{
			return adEditRslt;
		}

		// 共通住所一覧照会処理
		List<CAANMsg> ezm0081b011MsgList = searchAd(handle, param, fixedText, (String)trgtData.get(PCD));

		// 住所分割処理
		// ST-2018-0000046 ADD START
		//adEditRslt = separateAd(trgtData, ezm0081b011MsgList);
		adEditRslt = separateAd(param, trgtData, fixedText, ezm0081b011MsgList);
		// ST-2018-0000046 ADD END

		return adEditRslt;
	}

	/**
	 * パラメータチェックを行います。<br>
	 * <br>
	 * @param trgtData 対象データ
	 * @return チェックエラーの場合はfalse、チェックOKの場合はtrue
	 */
	private boolean checkParameter(Map<String, Object> trgtData)
	{
		// 編集モード、または郵便番号が設定されていない場合
		if (JKKStringUtil.isNullBlank((String)trgtData.get(EDIT_MODE))
			|| JKKStringUtil.isNullBlank((String)trgtData.get(PCD)))
		{
			return false;
		}

		return true;
	}

	/**
	 * 住所情報一覧を取得します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param pcd 郵便番号
	 * @return 住所情報一覧
	 * @throws Throwable 例外が発生した場合
	 */
	private List<CAANMsg> searchAd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String pcd) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		// 住所情報一覧
		CAANMsg[] tmpEzm0081b011MsgList = null;

		// 共通住所一覧照会
		Object[][] ezm0081b011In =
		{
			{EZM0081B011CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0081B011}
			// 機能コード
			, {EZM0081B011CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
			// KEY_郵便番号
			, {EZM0081B011CBSMsg.KEY_PCD, pcd}
			// KEY_基準日
			, {EZM0081B011CBSMsg.KEY_YMD, JPCBPCommon.getOpeDate(null)}
			// 検索処理パターン
			, {EZM0081B011CBSMsg.SEARCH_TYPE, "1"}
			// 最大検索件数
			, {EZM0081B011CBSMsg.MAX_SEARCH_NUM, "1000"}
			// 表示件数
			, {EZM0081B011CBSMsg.DISPLAY_NUM, "1000"}
			// 表示ページ番号
			, {EZM0081B011CBSMsg.DISPLAY_PAGE_NUM, "1"}
		};
		// サービスIF実行
		tmpEzm0081b011MsgList = callSC(handle, scCall, param, fixedText, ezm0081b011In)
				.getCAANMsgList(EZM0081B011CBSMsg.EZM0081B011CBSMSG1LIST);

		List<CAANMsg> ezm0081b011MsgList = new ArrayList<CAANMsg>();
		if (tmpEzm0081b011MsgList != null)
		{
			// 配列からListに変換
			ezm0081b011MsgList = Arrays.asList(tmpEzm0081b011MsgList);

			// 住所情報一覧の並び替え
			sortAdList(ezm0081b011MsgList);
		}

		return ezm0081b011MsgList;
	}

	/**
	 * 住所情報一覧を住所コードの昇順に並び替えます。
	 * <br>
	 * @param ezm0081b011MsgList 住所情報一覧
	 */
	private void sortAdList(List<CAANMsg> ezm0081b011MsgList)
	{
		if (ezm0081b011MsgList == null || ezm0081b011MsgList.isEmpty())
		{
			return;
		}

		Collections.sort(ezm0081b011MsgList, new Comparator<CAANMsg>()
		{

			/**
			 * 住所情報の比較を行います。
			 * <br>
			 * @param msg1 住所情報1
			 * @param msg2 住所情報2
			 * @return 比較結果
			 */
			@Override
			public int compare(CAANMsg msg1, CAANMsg msg2) 
			{
				String adCd1 = msg1.getString(EZM0081B011CBSMsg1List.AD_CD);
				String adCd2 = msg2.getString(EZM0081B011CBSMsg1List.AD_CD);
				if (!adCd1.equals(adCd2))
				{
					return adCd1.compareTo(adCd2);
				}

				return 0;
			}
		});

		return;
	}

	/**
	 * 住所分割処理を行い、住所編集結果として返します。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ定義文字列
	 * @param ezm0081b011MsgList 住所情報一覧
	 * @return 住所編集結果
	 * @throws Throwable
	 */
	// ST-2018-0000046 MOD START
	//private Map<String, Object> separateAd(Map<String, Object> trgtData, List<CAANMsg> ezm0081b011MsgList)
	private Map<String, Object> separateAd(IRequestParameterReadWrite param, Map<String, Object> trgtData, String fixedText, List<CAANMsg> ezm0081b011MsgList) throws Throwable
	// ST-2018-0000046 MOD END
	{
		// 住所マスタデータ
		CAANMsg mstAdMsg = null;
		// 編集後の番地号
		String editBnchigo = "";
		// 編集後の建物名
		String editTtm = "";
		// 編集後の部屋番号
		String editRm = "";
		// ANK-3612-00-00 ADD START
		// マイナーアラーム出力フラグ
		boolean alarmFlg = true;
		// ANK-3612-00-00 ADD END

		String stateNm = JKKStringUtil.nullToBlank((String)trgtData.get(STATE_NM));
		String cityNm = JKKStringUtil.nullToBlank((String)trgtData.get(CITY_NM));
		String oaztsuNm = JKKStringUtil.nullToBlank((String)trgtData.get(OAZTSU_NM));
		String azchoNm = JKKStringUtil.nullToBlank((String)trgtData.get(AZCHO_NM));
		String bnchigo = JKKStringUtil.nullToBlank((String)trgtData.get(BNCHIGO));
		String adrttm = JKKStringUtil.nullToBlank((String)trgtData.get(ADRTTM));
		String adrrm = JKKStringUtil.nullToBlank((String)trgtData.get(ADRRM));
		// ST-2018-0000046 ADD START
        //シスログ出力
        String proId = "";
        String msgId = "";
        String msg   = "";
        String keyCd = "";
		// ST-2018-0000046 ADD END
		if (ezm0081b011MsgList != null && !ezm0081b011MsgList.isEmpty())
		{
			// 入力パラメータの都道府県名、市区町村名、大字通称名、字丁目名、番地号、建物名、部屋番号を連結
			String adInf = getSepString(stateNm + cityNm + oaztsuNm + azchoNm + bnchigo + adrttm + adrrm, true);

			// 住所マスタデータの特定
			int maxLen = 0;
			for (CAANMsg ezm0081b011Msg : ezm0081b011MsgList)
			{
					// 住所情報一覧の都道府県名、市区町村名、大字通称名、字丁目名を連結（丁目及び、丁を削除）
				String mstAdInf = getSepString(JKKStringUtil.nullToBlank(ezm0081b011Msg.getString(EZM0081B011CBSMsg1List.STATE_NM))
							+ JKKStringUtil.nullToBlank(ezm0081b011Msg.getString(EZM0081B011CBSMsg1List.CITY_NM))
							+ JKKStringUtil.nullToBlank(ezm0081b011Msg.getString(EZM0081B011CBSMsg1List.OAZTSU_NM))
							+ JKKStringUtil.nullToBlank(ezm0081b011Msg.getString(EZM0081B011CBSMsg1List.AZCHO_NM)), false);
				// 入力パラメータの住所情報と前方一致となる場合
				if (adInf.startsWith(mstAdInf))
				{
					// 最も長いレコードを住所マスタデータとして取得
					if (maxLen < mstAdInf.length())
					{
						mstAdMsg = ezm0081b011Msg;
						maxLen = mstAdInf.length();
					}
				}
			}
	
			// 住所マスタデータが特定できた場合
			if (mstAdMsg != null)
			{
				String	mstAdInf = getSepString(JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.STATE_NM))
							+ JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.CITY_NM))
							+ JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.OAZTSU_NM))
							+ JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.AZCHO_NM)), false);
				// 編集後の番地号以降
				String editBnchigoAf = adInf.replaceAll("^" + mstAdInf, "");
				//OM-2019-0000658 ADD START
				String workMoji = "";
				//住所マスタデータの数だけ、〇を作成する。
				for (int i = 0; i < mstAdInf.length(); i++)
				{
					workMoji = workMoji + "〇";
				}
				//住所マスタデータを〇に置換する。
				String editBnchigoAfWorK = adInf.replaceAll("^" + mstAdInf, workMoji);
				//OM-2019-0000658 ADD END
				
				// 行頭の全角ハイフン(類似した記号を含む)を削除
				editBnchigoAf = removeHyphen(editBnchigoAf);
				// OM-2019-0000658 DEL START
//				// 入力パラメータの番地号、建物名、部屋番号を連結
//				String bnchigoAf = getSepString(bnchigo + adrttm + adrrm, true);
//
//				int startIndex = bnchigoAf.indexOf(editBnchigoAf);
				// OM-2019-0000658 DEL END
				//OM-2019-0000658 ADD START
				//入力パラメータの番地号、建物名、部屋番号を連結した値から正しい番地の位置を取得
				int startIndex = editBnchigoAfWorK.indexOf(editBnchigoAf);
				//入力パラメータの都道府県名、市区町村名、大字通称名、字丁目名を結合する。
				String stateNm_azchoNm = getSepString(stateNm + cityNm + oaztsuNm + azchoNm, true);
				int startBnchigoIndex = startIndex - stateNm_azchoNm.length();
				//OM-2019-0000658 ADD END
				String tmpBnchigo = "";
				String tmpTtm = "";
				String tmpRm = "";
				// OM-2018-0001249 MOD START
				//if (startIndex == -1)
				// 入力パラメータの番地号以降に番地号以降の情報が設定されていない場合（住所マスタで特定した都道府県名〜字丁目名のみが設定されている）
				if ("".equals(editBnchigoAf))
				{
					;
				}
				// 入力パラメータの都道府県名〜字丁目名に番地号以降の情報が設定されている場合
				//OM-2019-0000658 MOD START
				//else if (startIndex == -1)
				else if (startIndex == -1 || startBnchigoIndex < 0)
				//OM-2019-0000658 MOD END
				// OM-2018-0001249 MOD END
				{
					// 都道府県名〜字丁目名から番地号以降の情報を取得
					String bnchigoAf2 = substring(getSepString(stateNm + cityNm + oaztsuNm + azchoNm, true), mstAdInf.length());
					// 行頭の全角ハイフン(類似した記号を含む)を削除
					tmpBnchigo = removeHyphen(bnchigoAf2) + bnchigo;
					tmpTtm = adrttm;
					tmpRm = adrrm;
				}
				// OM-2018-0001249 DEL START
				// OT-2018-0000006 ADD START
				//// 入力パラメータの番地号に番地号が設定されていない場合（都道府県名〜字丁目名のみが設定されている）
				//else if ( startIndex == 0 )
				//{
				//	;
				//}
				// OT-2018-0000006 ADD END
				// OM-2018-0001249 DEL END
				// 入力パラメータの番地号以降に番地号以降の情報が設定されている場合
				else
				{
					int lenBnchigo = getSepString(bnchigo, true).length();
					int lenTtm = getSepString(adrttm, true).length();
					int lenRm = getSepString(adrrm, true).length();
					// 入力パラメータの番地号に番地号以降の情報が設定されている場合
					// OM-2019-0000658 MOD START
					//if (lenBnchigo > startIndex)
					if (lenBnchigo > startBnchigoIndex)
					// OM-2019-0000658 MOD END
					{
						// OM-2019-0000658 MOD START
						//tmpBnchigo = substring(getSepString(bnchigo, true), startIndex);
						tmpBnchigo = substring(getSepString(bnchigo, true), startBnchigoIndex);
						// OM-2019-0000658 MOD END
						tmpTtm = adrttm;
						tmpRm = adrrm;
					}
					// 入力パラメータの建物名に番地号以降の情報が設定されている場合
					// OM-2019-0000658 MOD START
					//else if (lenBnchigo + lenTtm > startIndex)
					else if (lenBnchigo + lenTtm > startBnchigoIndex)
					// OM-2019-0000658 MOD END
					{
						tmpBnchigo = "";
						// OM-2019-0000658 MOD START
						//tmpTtm = substring(getSepString(adrttm, true), startIndex - lenBnchigo);
						tmpTtm = substring(getSepString(adrttm, true), startBnchigoIndex - lenBnchigo);
						// OM-2019-0000658 MOD END
						tmpRm = adrrm;
					}
					// 入力パラメータの部屋番号に番地号以降の情報が設定されている場合
					// OM-2019-0000658 MOD START
					//else if (lenBnchigo + lenTtm + lenRm > startIndex)
					else if (lenBnchigo + lenTtm + lenRm > startBnchigoIndex)
					// OM-2019-0000658 MOD END
					{
						tmpBnchigo = "";
						tmpTtm = "";
						// OM-2019-0000658 MOD START
						//tmpRm = substring(getSepString(adrrm, true), startIndex - lenBnchigo - lenTtm);
						tmpRm = substring(getSepString(adrrm, true), startBnchigoIndex - lenBnchigo - lenTtm);
						// OM-2019-0000658 MOD END
					}
				}

				// ST-2018-0000046 MOD START
				// 住所コード
				String adCd = JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.AD_CD));
				int bnchiGoMax = patterAddCd(adCd);
				// 番地号が最大文字数を超えている場合
				//if (tmpBnchigo.length() > MAX_LEN_BNCHIGO)
				//{
				//	editBnchigo = tmpBnchigo.substring(0, MAX_LEN_BNCHIGO);
				//	editTtm = tmpBnchigo.substring(MAX_LEN_BNCHIGO) + tmpTtm;
				//}
				if (tmpBnchigo.length() > bnchiGoMax)
				{
					editBnchigo = tmpBnchigo.substring(0, bnchiGoMax);
					editTtm = tmpBnchigo.substring(bnchiGoMax) + tmpTtm;
				}
				// ST-2018-0000046 MOD END
				else
				{
					editBnchigo = tmpBnchigo;
					editTtm = tmpTtm;
				}

				// 建物名が最大文字数を超えている場合
				if (editTtm.length() > MAX_LEN_ADRTTM)
				{
					String tmpTtm2 = editTtm;
					editTtm = tmpTtm2.substring(0, MAX_LEN_ADRTTM);
					editRm = tmpTtm2.substring(MAX_LEN_ADRTTM) + tmpRm;
				}
				else
				{
					editRm = tmpRm;
				}

				// 部屋番号が最大文字数を超えている場合
				if (editRm.length() > MAX_LEN_ADRRM)
				{
					editRm = editRm.substring(0, MAX_LEN_ADRRM);
					// ST-2018-0000046 ADD START
					// 入力住所が登録最大桁数を超えた場合マイナーアラームを出力
					String sysdate = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis()));
					HashMap<String, Object> propMap = new HashMap<String, Object>();

					propMap.put(JCCSuperComExecUtil.EXEC_BUFF_SIZE, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_BUFF_SIZE));
					propMap.put(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY));
					propMap.put(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY));
					propMap.put(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY));
					propMap.put(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION));
					
					proId = param.getUsecaseID();
					if (proId != null && CKSV0063.equals(proId))
					{
				        Map<String, Object> ccMsg = (Map<String, Object>)param.getData("CKSV006301CC");
						keyCd = " 共通キー：" + JKKStringUtil.nullToBlank((String)ccMsg.get("commonKey"));
					}
					else if  (proId != null && KKSV0895.equals(proId))
					{
				        Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
						keyCd = " 受付番号：" + JKKStringUtil.nullToBlank((String)ccMsg.get("receivingNum"));
					}
					// ANK-3477-00-00 ADD START
					else if  (proId != null && CKSV0064.equals(proId))
					{
				        Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
						keyCd = " SYSID：" + JKKStringUtil.nullToBlank((String)ccMsg.get("sysid"));
					}
					// ANK-3477-00-00 ADD END
					// ANK-3612-00-00 ADD START
					else if (proId != null && CKSV9010.equals(proId))
					{
						alarmFlg = false;
					}
					else if (proId != null && (CKSV9022.equals(proId)  || CKSV9023.equals(proId) || CKSV9024.equals(proId)))
					{
						alarmFlg = false;
					}
					// ANK-3612-00-00 ADD END

					msg = MESLOG_ADDRESS + keyCd + " 住所："+ adInf;
					msgId = "EKKB1920KW";

					// ANK-3612-00-00 MOD START
					if (alarmFlg)
					{
	                    JCCSyslogFormat.logger(proId, msgId, sysdate, msg, null, propMap);
					}
					// ANK-3612-00-00 MOD END
					// ST-2018-0000046 ADD END
				}
			}
			// ANK-3477-00-00 ADD START
			else {
				proId = param.getUsecaseID();
				// CKIFE051_お客様住所情報更新受付(CMP)のみ以下の処理を実施
				if  (proId != null && CKSV0064.equals(proId))
				{
					if (bnchigo.length() > MAX_LEN_BNCHIGO)
					{
						editBnchigo = bnchigo.substring(0, MAX_LEN_BNCHIGO);
						editTtm = bnchigo.substring(MAX_LEN_BNCHIGO) + adrttm;
					}
					else
					{
						editBnchigo = bnchigo;
						editTtm = adrttm;
					}

					// 建物名が最大文字数を超えている場合
					if (editTtm.length() > MAX_LEN_ADRTTM)
					{
						String tmpTtm2 = editTtm;
						editTtm = tmpTtm2.substring(0, MAX_LEN_ADRTTM);
						editRm = tmpTtm2.substring(MAX_LEN_ADRTTM) + adrrm;
					}
					else
					{
						editRm = adrrm;
					}

					// 部屋番号が最大文字数を超えている場合
					if (editRm.length() > MAX_LEN_ADRRM)
					{
						editRm = editRm.substring(0, MAX_LEN_ADRRM);
						// 入力住所が登録最大桁数を超えた場合マイナーアラームを出力
						String sysdate = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis()));
						HashMap<String, Object> propMap = new HashMap<String, Object>();

						propMap.put(JCCSuperComExecUtil.EXEC_BUFF_SIZE, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_BUFF_SIZE));
						propMap.put(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY));
						propMap.put(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY));
						propMap.put(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY));
						propMap.put(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION));
						
				        Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
						keyCd = " SYSID：" + JKKStringUtil.nullToBlank((String)ccMsg.get("sysid"));
						msg = MESLOG_ADDRESS + keyCd + " 住所："+ adInf;
						msgId = "EKKB1920KW";
							
	                    JCCSyslogFormat.logger(proId, msgId, sysdate, msg, null, propMap);
					}
					// 番地号、建物名、部屋番号を再設定する
					trgtData.put(BNCHIGO, JKKStringUtil.nullToBlank(editBnchigo));
					trgtData.put(ADRTTM, JKKStringUtil.nullToBlank(editTtm));
					trgtData.put(ADRRM, JKKStringUtil.nullToBlank(editRm));
				}
				// ANK-3612-00-00 ADD START
				// CKIFE008_会員情報照会受付（PMP）のみ以下の処理を実施
				else if (proId != null && CKSV9010.equals(proId))
				{
					// 住所マスタに存在しない場合は、番地号に都道府県から番地号までを結合する
					editBnchigo = stateNm + cityNm + oaztsuNm + azchoNm + bnchigo;
					// 建物名
					editTtm = adrttm;
					// 部屋番号
					editRm = adrrm;

					// 都道府県、市区町村、大字通称名、字丁目、番地号、建物名、部屋番号を再設定する
					trgtData.put(STATE_NM, "");
					trgtData.put(CITY_NM, "");
					trgtData.put(OAZTSU_NM, "");
					trgtData.put(AZCHO_NM, "");
					trgtData.put(BNCHIGO, JKKStringUtil.nullToBlank(editBnchigo));
					trgtData.put(ADRTTM, JKKStringUtil.nullToBlank(editTtm));
					trgtData.put(ADRRM, JKKStringUtil.nullToBlank(editRm));
				}
				// CKIFE012_会員情報更新受付のみ以下の処理を実施
				else if (proId != null && (CKSV9022.equals(proId)  || CKSV9023.equals(proId) || CKSV9024.equals(proId)))
				{
					if (bnchigo.length() > MAX_LEN_BNCHIGO)
					{
						editBnchigo = bnchigo.substring(0, MAX_LEN_BNCHIGO);
						editTtm = bnchigo.substring(MAX_LEN_BNCHIGO) + adrttm;
					}
					else
					{
						editBnchigo = bnchigo;
						editTtm = adrttm;
					}

					// 建物名が最大文字数を超えている場合
					if (editTtm.length() > MAX_LEN_ADRTTM)
					{
						String tmpTtm2 = editTtm;
						editTtm = tmpTtm2.substring(0, MAX_LEN_ADRTTM);
						editRm = tmpTtm2.substring(MAX_LEN_ADRTTM) + adrrm;
					}
					else
					{
						editRm = adrrm;
					}

					// 部屋番号が最大文字数を超えている場合
					if (editRm.length() > MAX_LEN_ADRRM)
					{
						editRm = editRm.substring(0, MAX_LEN_ADRRM);
					}

					// 都道府県、市区町村、大字通称名、字丁目、番地号、建物名、部屋番号を再設定する
					trgtData.put(STATE_NM, "");
					trgtData.put(CITY_NM, "");
					trgtData.put(OAZTSU_NM, "");
					trgtData.put(AZCHO_NM, "");
					trgtData.put(BNCHIGO, JKKStringUtil.nullToBlank(editBnchigo));
					trgtData.put(ADRTTM, JKKStringUtil.nullToBlank(editTtm));
					trgtData.put(ADRRM, JKKStringUtil.nullToBlank(editRm));
				}
				// ANK-3612-00-00 ADD END
			}
			// ANK-3477-00-00 ADD END
		}
		// ANK-3612-00-00 ADD START
		else
		{
			proId = param.getUsecaseID();

			// CKIFE008_会員情報照会受付（PMP）のみ以下の処理を実施
			if (proId != null && CKSV9010.equals(proId))
			{
				// 住所マスタに存在しない場合は、番地号に都道府県から番地号までを結合する
				editBnchigo = stateNm + cityNm + oaztsuNm + azchoNm + bnchigo;
				// 建物名
				editTtm = adrttm;
				// 部屋番号
				editRm = adrrm;

				// 都道府県、市区町村、大字通称名、字丁目、番地号、建物名、部屋番号を再設定する
				trgtData.put(STATE_NM, "");
				trgtData.put(CITY_NM, "");
				trgtData.put(OAZTSU_NM, "");
				trgtData.put(AZCHO_NM, "");
				trgtData.put(BNCHIGO, JKKStringUtil.nullToBlank(editBnchigo));
				trgtData.put(ADRTTM, JKKStringUtil.nullToBlank(editTtm));
				trgtData.put(ADRRM, JKKStringUtil.nullToBlank(editRm));
			}

			// CKIFE012_会員情報更新受付のみ以下の処理を実施
			else if (proId != null && (CKSV9022.equals(proId) || CKSV9023.equals(proId) || CKSV9024.equals(proId)))
			{
				if (bnchigo.length() > MAX_LEN_BNCHIGO)
				{
					editBnchigo = bnchigo.substring(0, MAX_LEN_BNCHIGO);
					editTtm = bnchigo.substring(MAX_LEN_BNCHIGO) + adrttm;
				}
				else
				{
					editBnchigo = bnchigo;
					editTtm = adrttm;
				}

				// 建物名が最大文字数を超えている場合
				if (editTtm.length() > MAX_LEN_ADRTTM)
				{
					String tmpTtm2 = editTtm;
					editTtm = tmpTtm2.substring(0, MAX_LEN_ADRTTM);
					editRm = tmpTtm2.substring(MAX_LEN_ADRTTM) + adrrm;
				}
				else
				{
					editRm = adrrm;
				}

				// 部屋番号が最大文字数を超えている場合
				if (editRm.length() > MAX_LEN_ADRRM)
				{
					editRm = editRm.substring(0, MAX_LEN_ADRRM);
				}

				// 都道府県、市区町村、大字通称名、字丁目、番地号、建物名、部屋番号を再設定する
				trgtData.put(STATE_NM, "");
				trgtData.put(CITY_NM, "");
				trgtData.put(OAZTSU_NM, "");
				trgtData.put(AZCHO_NM, "");
				trgtData.put(BNCHIGO, JKKStringUtil.nullToBlank(editBnchigo));
				trgtData.put(ADRTTM, JKKStringUtil.nullToBlank(editTtm));
				trgtData.put(ADRRM, JKKStringUtil.nullToBlank(editRm));
			}
		}
		// ANK-3612-00-00 ADD END

		// 住所編集結果
		Map<String, Object> adEditRslt = createAdEditRslt(trgtData, ezm0081b011MsgList, mstAdMsg, editBnchigo, editTtm, editRm);

		return adEditRslt;
	}

	/**
	 * 住所分割用文字列を取得します。
	 * <br>
	 * @param adInf 住所情報
	 * @param isHyphen "丁"、"丁目"を"−"に置換するかどうか
	 * @return 住所分割用文字列
	 */
	private String getSepString(String adInf, boolean isHyphen)
	{
		String sepString = "";
		if (!adInf.isEmpty())
		{
			// 全角空白をすべて削除 ※各項目は単項目チェック済みの前提であるため半角空白は含まれていないものとする
			sepString = adInf.replaceAll("　", "");
			if (isHyphen)
			{
				// 数字の直後にある"丁"、"丁目"を"−"(全角マイナス)に置換 ※誤変換防止のため丁目、丁の順で行うこと
				sepString = sepString.replaceAll("([０-９])丁目", "$1−").replaceAll("([０-９])丁", "$1−");
			}
			else
			{
				// 数字の直後にある"丁"、"丁目"を削除 ※誤変換防止のため丁目、丁の順で行うこと
				sepString = sepString.replaceAll("([０-９])丁目", "$1").replaceAll("([０-９])丁", "$1");
			}
		}
		else
		{
			sepString = adInf;
		}

		return sepString;
	}

	/**
	 * 対象文字列からインデックス以降の文字列を切り出して返します。
	 * @param str 対象文字列
	 * @param startIndex インデックス
	 * @return 処理後の文字列
	 */
	private String substring(String str, int startIndex)
	{
		if (str != null && str.length() > startIndex)
		{
			return str.substring(startIndex);
		}

		return str;
	}

	/**
	 * 対象文字列の行頭にある全角ハイフン(類似した記号を含む)を削除した文字列を返します。
	 * @param str 対象文字列
	 * @return 処理後の文字列
	 */
	private String removeHyphen(String str)
	{
		// 長音、全角マイナス、全角ダッシュ、全角ハイフンを削除
		return str.replaceAll("^[ー|−|―|‐]", "");
	}

	/**
	 * 住所編集結果を生成して返します。
	 * <br>
	 * @param trgtData 対象データ
	 * @param ezm0081b011MsgList 住所情報一覧
	 * @param mstAdMsg 住所マスタデータ
	 * @param editBnchigo 編集後の番地号
	 * @param editTtm 編集後の建物名
	 * @param editRm 編集後の部屋番号
	 * @return 住所編集結果
	 */
	private Map<String, Object> createAdEditRslt(Map<String, Object> trgtData, List<CAANMsg> ezm0081b011MsgList, CAANMsg mstAdMsg,
			String editBnchigo, String editTtm, String editRm)
	{
		// 住所編集結果
		Map<String, Object> adEditRslt = new HashMap<String, Object>();

		if (mstAdMsg != null)
		{
			adEditRslt.put(PCD, JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.PCD)));
			adEditRslt.put(STATE_NM, JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.STATE_NM)));
			adEditRslt.put(CITY_NM, JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.CITY_NM)));
			adEditRslt.put(OAZTSU_NM, JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.OAZTSU_NM)));
			adEditRslt.put(AZCHO_NM, JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.AZCHO_NM)));
			adEditRslt.put(BNCHIGO, editBnchigo);
			adEditRslt.put(ADRTTM, editTtm);
			adEditRslt.put(ADRRM, editRm);
			adEditRslt.put(AD_CD, JKKStringUtil.nullToBlank(mstAdMsg.getString(EZM0081B011CBSMsg1List.AD_CD)));
			adEditRslt.put(MAN_INPUT_FLG, JKKStrConst.AD_MAN_INPUT_NO);
		}
		else
		{
			adEditRslt.put(PCD, JKKStringUtil.nullToBlank((String)trgtData.get(PCD)));
			adEditRslt.put(STATE_NM, JKKStringUtil.nullToBlank((String)trgtData.get(STATE_NM)));
			adEditRslt.put(CITY_NM, JKKStringUtil.nullToBlank((String)trgtData.get(CITY_NM)));
			adEditRslt.put(OAZTSU_NM, JKKStringUtil.nullToBlank((String)trgtData.get(OAZTSU_NM)));
			adEditRslt.put(AZCHO_NM, JKKStringUtil.nullToBlank((String)trgtData.get(AZCHO_NM)));
			adEditRslt.put(BNCHIGO, JKKStringUtil.nullToBlank((String)trgtData.get(BNCHIGO)));
			adEditRslt.put(ADRTTM, JKKStringUtil.nullToBlank((String)trgtData.get(ADRTTM)));
			adEditRslt.put(ADRRM, JKKStringUtil.nullToBlank((String)trgtData.get(ADRRM)));
			adEditRslt.put(AD_CD, getAdCd(trgtData, ezm0081b011MsgList));
			adEditRslt.put(MAN_INPUT_FLG, getManInputFlg(trgtData));
		}

		return adEditRslt;
	}

	/**
	 * 住所マスタデータが特定できなかった場合の住所コードを取得します。
	 * <br>
	 * @param trgtData 対象データ
	 * @param ezm0081b011MsgList 住所情報一覧
	 * @return 住所コード
	 */
	private String getAdCd(Map<String, Object> trgtData, List<CAANMsg> ezm0081b011MsgList)
	{
		String adCd = "";
		// 編集モードが「登録用住所編集」の場合
		if (EDIT_MODE_ADD.equals((String)trgtData.get(EDIT_MODE)))
		{
			adCd = "";
		}
		// 編集モードが「変更用住所編集」の場合
		else if (EDIT_MODE_CHG.equals((String)trgtData.get(EDIT_MODE)))
		{
			// 住所情報一覧が0件の場合
			if (ezm0081b011MsgList == null || ezm0081b011MsgList.isEmpty())
			{
				adCd = "";
			}
			// 住所情報一覧が1件以上の場合
			else
			{
				adCd = JKKStringUtil.nullToBlank(ezm0081b011MsgList.get(0).getString(EZM0081B011CBSMsg1List.AD_CD));
			}
		}

		return adCd;
	}

	/**
	 * 住所マスタデータが特定できなかった場合の手動入力フラグを取得します。
	 * <br>
	 * @param trgtData 対象データ
	 * @return 手動入力フラグ
	 */
	private String getManInputFlg(Map<String, Object> trgtData)
	{
		// 編集モードが「登録用住所編集」の場合
		if (EDIT_MODE_ADD.equals((String)trgtData.get(EDIT_MODE)))
		{
			// 手動入力でない
			return JKKStrConst.AD_MAN_INPUT_NO;
		}

		// 手動入力である
		return JKKStrConst.AD_MAN_INPUT_YES;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出します。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @return サービスインターフェイス実行結果
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData) throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);

		CAANMsg msg = templates[0];

		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);

		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));

		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}

		return msg;
	}

	/**
	 * 共通項目のメッセージを作成します。
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) 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));

		String svcIf = (String)mappingData[0][1];

		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));

		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				if ("".equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * エラー情報を取得します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_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(RETURN_MESSAGE_FORMAT, templateStatus);
			
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(dataMapKey);
		if (inMap == null)
		{
			inMap = new HashMap<String, Object>();
		}

		HashMap map = template.getHashMap();
		Iterator it = map.keySet().iterator();
		while (it.hasNext())
		{
			String key = (String)it.next();
			Object value = map.get(key);
			if (value instanceof HashMap[])
			{
				HashMap[] childMapList = (HashMap[])value;
				for (HashMap childMap : childMapList)
				{
					Iterator childIt = childMap.keySet().iterator();
					while (childIt.hasNext())
					{
						String childKey = (String)childIt.next();
						if (childKey.endsWith(ERRITEM_SUFFIX))
						{
							inMap.put(childKey, childMap.get(childKey));
						}
					}
				}
			}
			else
			{
				if (key.endsWith(ERRITEM_SUFFIX))
				{
					inMap.put(key, map.get(key));
				}
			}
		}

		return param;
	}
// ST-2018-0000046 ADD START
	/**
	 * 住所コードの入力パターンを返却します
	 * 
	 * @param ad_cd 住所コード
	 * @return int 1:xx-xxx-xxx-xxx 2：xx-xxx-xxx-000 3：xx-xxx-000-000 4：xx-000-000-000 5：00-000-000-000
	 */
	private int patterAddCd(String add_cd) {
		
		// xx-xxx-xxx-xxxに分割する
		String add01 = add_cd.substring(0, 2);
		String add02 = add_cd.substring(2, 5);
		String add03 = add_cd.substring(5, 8);
		String add04 = add_cd.substring(8, 11);
		
		if (add01.equals("00") && add02.equals("000") && add03.equals("000") && add04.equals("000"))
		{
			// 00-000-000-000の場合
			return PATTERN5;
		}
		else if (!add01.equals("00") && add02.equals("000") && add03.equals("000") && add04.equals("000"))
		{
			// xx-000-000-000の場合
			return PATTERN4;
		}
		else if (!add01.equals("00") && !add02.equals("000") && add03.equals("000") && add04.equals("000"))
		{
			// xx-xxx-000-000の場合
			return PATTERN3;
		}
		else if (!add01.equals("00") && !add02.equals("000") && !add03.equals("000") && add04.equals("000"))
		{
			// xx-xxx-xxx-000の場合
			return PATTERN2;
		}
		else
		{
			// xx-xxx-xxx-xxxの場合
			return PATTERN1;
		}
	}
// ST-2018-0000046 ADD END
}
