/*********************************************************************
* All Rights reserved, Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム共通（共通マスタ）
*   モジュール名    ：ZMA001SFLogic
*   ソースファイル名：ZMA001SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年12月15日
*＜機能概要＞
*   住所マスタプルダウン情報提供のビューロジッククラスです。
*＜修正履歴＞
*   バージョン	修正日		修正者		修正内容
*   v3.00		2011/12/15	FJ）日野	新規作成
*   v41.00		2019/04/16	FJ) 岡井	【ANK-3612-00-00】eoマイページからのお客さま情報自動更新機能改善
*   v48.00		2020/01/15	FJ) 張本	【ANK-3795-03-00】見込顧客システム構築対応
*
**********************************************************************/

package eo.web.webview.ZMA001SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCEditString;
import eo.common.util.JZMCommonUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JZMWebCommon;
import eo.web.webview.mapping.ZMSV0088_ZMSV0088OPDBMapper;

/**
 * 住所マスタプルダウン情報提供のビューロジッククラスです。
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class ZMA001SFLogic extends JCCWebBusinessLogic
{
	
	/** 業務処理名 */
	private static final String BUSINESS_LOGIC_NM = "住所コードマスタプルダウン用参照";
	
	/** サービスID */
	private static final String SERVICE_ID = "ZMSV0088";
	
	/** ブランク */
	private static final String BLANK = "";
	
	/** 郵便番号 */
	public static final String YUBN_BNGU = "YUBN_BNGU";
	
	/** 返却データ */
	private static final String RETURN_DATA = "返却データ";
	
	// ANK-3612-00-00 MOD START
	///** 丁目 */
	//private static final String CHOME = "丁目";
	//
	///** 丁 */
	//private static final String CHO = "丁";
	//
	///** -（ハイフン） */
	//private static final String HYPHEN = "-";
	// ANK-3612-00-00 MOD END

// v48.00.00 ANK-3795-00-00 DEL START
//	/** 都道府県名 */
//	private static final String STATE_NM = "state_nm";
//	
//	/** 市区町村名 */
//	private static final String CITY_NM = "city_nm";
//	
//	/** 大字通称名 */
//	private static final String OAZTSU_NM = "oaztsu_nm";
//	
//	/** 字丁目名 */
//	private static final String AZCHO_NM = "azcho_nm";
// v48.00.00 ANK-3795-00-00 DEL END
	
	// ANK-3612-00-00 MOD START
	///** 字丁目カナ名 */
	//private static final String AZCHO_KANA = "azcho_kana";
	// ANK-3612-00-00 MOD END

// v48.00.00 ANK-3795-00-00 DEL START
//	/** 都道府県漢字数 */
//	private static final String STATE_KANJI_CNT = "state_kanji_cnt";
//	
//	/** 市区町村漢字数 */
//	private static final String CITY_KANJI_CNT = "city_kanji_cnt";
//	
//	/** 漢字数 */
//	private static final String KANJI_SUU = "KANJI_SUU";
//	
//	/** 住所 */
//	private static final String ADDRESS = "ADDRESS";
// v48.00.00 ANK-3795-00-00 DEL END
	
	/** 正常終了 */
	private static final String RSLT_CD_NOMAL = "000000";
	
	/** メンテナンス中エラー */
	private static final String RSLT_CD_MAINTE = "007001";
	
	/** 致命的なエラー */
	private static final String RSLT_CD_CRITICAL = "009003";
	
	/** 必須エラー */
	private static final String RSLT_CD_MUST = "009008";
	
	/** 最大桁数エラー */
	private static final String RSLT_CD_KETA = "009010";
	
	/** メンテナンス中エラーメッセージ */
	private static final String EX_MSG_MAINTE = "メンテナンス中です。";
	
	/** 必須エラーメッセージ */
	private static final String EX_MSG_MUST = "必須項目が設定されていません。";
	
	/** 最大桁数エラーメッセージ */
	private static final String EX_MSG_KETA = "最大桁数を超えています。";
	
	/** 致命的なエラーメッセージ */
	private static final String EX_MSG_CRITICAL = "処理中に致命的なエラーが発生しました。";
	
	/** 結果種別（共通セクタ） */
	private static final String WDA_COM_RTYPE = "WDA_COM_RTYPE";
	
	/** 処理結果（共通セクタ） */
	private static final String WDA_COM_RESULT = "WDA_COM_RESULT";
	
	/** 詳細情報１（共通セクタ） */
	private static final String WDA_COM_DETAIL1 = "WDA_COM_DETAIL1";
	
	/** 詳細情報２（共通セクタ） */
	private static final String WDA_COM_DETAIL2 = "WDA_COM_DETAIL2";
	
	/** 詳細情報３（共通セクタ） */
	private static final String WDA_COM_DETAIL3 = "WDA_COM_DETAIL3";
	
	/** 詳細情報４（共通セクタ） */
	private static final String WDA_COM_DETAIL4 = "WDA_COM_DETAIL4";
	
	/** 詳細情報５（共通セクタ） */
	private static final String WDA_COM_DETAIL5 = "WDA_COM_DETAIL5";
	
	/** 詳細情報６（共通セクタ） */
	private static final String WDA_COM_DETAIL6 = "WDA_COM_DETAIL6";
	
	/** =（イコール） */
	private static final String EQUAL = "=";
	
	/** ラインセパレータ */
	private static final String LINE_SEPARATOR = "line.separator";
	
	/** 共通セクタ */
	private static final String COMMON_SECTOR = "#!sector[CommonPart]!#";
	
	/** シンプルセクタ */
	private static final String SIMPLE_SECTOR = "#!sector[SimplePart]!#";
	
	/** マルチパートセクタ（始め） */
	private static final String MULTI_SECTOR_STA = "#!sector[MultiplePart[";
	
	/** マルチパートセクタ（終わり） */
	private static final String MULTI_SECTOR_END = "]]!#";
	
	/** マルチパートキー */
	private static final String KEY_MULTI_PART = "M1";
	
	/** フラグON */
	private static final String FLG_ON = "1";
	
	/** サーバー名（顧客サーバ） */
	private static final String SERVER_NM = "顧客サーバ";

	/** 改行コードCR */
	private static final String CD_CR = "\r";
	
	/** 改行コードLF */
	private static final String CD_LF = "\n";
	
	/** 結果コードマップ */
	private static HashMap<String, String> rtype_result_map = null;
	
	static
	{
		rtype_result_map = new HashMap<String, String>();
		rtype_result_map.put("000000", "N"); 	// 正常終了
		rtype_result_map.put("007001", "M"); 	// メンテナンス中です。
		rtype_result_map.put("009003", "E"); 	// 処理中に致命的なエラーが発生しました。
		rtype_result_map.put("009008", "E"); 	// 必須項目が設定されていません。
		rtype_result_map.put("009010", "E"); 	// 最大桁数を超えています。
	}
	
	/**
	 * 住所マスタプルダウン情報提供を行います。<BR/>
	 * @return boolean 処理結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{
		
		// サービス結果格納用サービスフォームBean
		X31SDataBeanAccess bean = null;
		StringBuffer rspData = new StringBuffer();
		
		try
		{
			
			// サービス結果格納用サービスフォームBean取得
			bean = getServiceFormBean();
			
			// 業務規制チェックと権限チェック
			// 共有フォームBean取得
			X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
			
			// ■ 権限チェック
			// ロードバランサにてIPアドレス変換しフレームワークでチェック
			
			// ■ 業務規制チェック
			X31SDataBeanAccessArray restrictionBeanArray =
					commonInfoBean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);
			for (int i = 0; i < restrictionBeanArray.getCount(); i++)
			{
				
				// 業務規制あり
				X31SDataBeanAccess commonSubbean = restrictionBeanArray.getDataBean(i);
				
				// 業務規制フラグが立っていた場合
				if(FLG_ON.equals(commonSubbean.sendMessageString(
						CommonInfoCFConst.REQUEST_RESTRICTION_FLG_04, X31CWebConst.DATABEAN_GET_VALUE)))
				{
					
					// "M" "007001" "メンテナンス中です。"
					DEBUG_LOG.debug(EX_MSG_MAINTE);
					
					// 処理応答電文（共通セクタ）の形式に変換
					rspData.append(getErrCommonSector(RSLT_CD_MAINTE, BLANK, SERVER_NM, EX_MSG_MAINTE));
					
					// 返却値の設定
					bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, rspData.toString());
					return true;
				}
			}
			
			// リクエスト情報取得(処理要求電文より、パラメータを取得)
			HashMap<String, Object> reqMap = super.getRequestParams();
			String pcd = (String)reqMap.get(YUBN_BNGU);		// 郵便番号
			
			// ■ 必須入力チェック
			if (isNull(pcd))
			{
				
				// "E" "009008" "必須項目が設定されていません。"
				DEBUG_LOG.debug(EX_MSG_MUST + YUBN_BNGU);
				
				// 処理応答電文（共通セクタ）の形式に変換
				rspData.append(getErrCommonSector(RSLT_CD_MUST, YUBN_BNGU, BLANK, EX_MSG_MUST));
				
				// 返却値の設定
				bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, rspData.toString());
				return true;
			}
			
			// ■ 最大桁数チェック（郵便番号が7桁を超えた場合）
			if (7 < pcd.length())
			{
				
				// "E" "009010" "最大桁数を超えています。"
				DEBUG_LOG.debug(EX_MSG_KETA + pcd);
				
				// 処理応答電文（共通セクタ）の形式に変換
				rspData.append(getErrCommonSector(RSLT_CD_KETA, YUBN_BNGU, pcd, EX_MSG_KETA));
				
				// 返却値の設定
				bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, rspData.toString());
				return true;
			}
			
			// ユースケースID格納用マップを生成
			HashMap paramMap = new HashMap();
			
			// サービスに渡すパラメータを格納するマップを生成
			HashMap inputMap = new HashMap();
			
			// サービス結果格納用マップを生成
			HashMap outputMap = new HashMap();
			
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID);
			
			ZMSV0088_ZMSV0088OPDBMapper mapper = new ZMSV0088_ZMSV0088OPDBMapper();
			mapper.setZMSV008801SC(reqMap, inputMap, JPCModelConstant.FUNC_CD_1, JZMWebCommon.getOpeDate(this, null));
			
			// ■ サービスの呼出
			try
			{
				invokeService(paramMap, inputMap, outputMap);
			}
			catch(Exception e)
			{
				
				// "E" "009003" "処理中に致命的なエラーが発生しました。"
				DEBUG_LOG.debug(EX_MSG_CRITICAL + pcd);
				
				// 処理応答電文（共通セクタ）の形式に変換
				rspData.append(getErrCommonSector(RSLT_CD_CRITICAL, BLANK, e.toString(), EX_MSG_CRITICAL));
				
				// 返却値の設定
				bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, rspData.toString());
				return true;
			}
			
			// ■ サービス結果取得
			ArrayList resMapList = new ArrayList();
			resMapList = mapper.getZMSV008801SC(outputMap);
			
			// 処理応答電文（共通セクタ）の形式に変換
			rspData.append(getNomalCommonSector(RSLT_CD_NOMAL));
			
			// 処理応答電文（シンプルセクタ）の形式に変換
			rspData.append(getSimpleSector(null));
			
			// 処理応答電文（マルチパートセクタ）の形式に変換
// v48.00.00 ANK-3795-00-00 MOD START
//			rspData.append(getMultipleSector(editRspDataList(resMapList), KEY_MULTI_PART));
			rspData.append(getMultipleSector(JZMCommonUtil.editRspDataList(resMapList), KEY_MULTI_PART));
// v48.00.00 ANK-3795-00-00 MOD END
			
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, rspData.toString());
		}
		catch (Exception e)
		{
			
			// "E" "009003" "処理中に致命的なエラーが発生しました。"
			DEBUG_LOG.debug(EX_MSG_CRITICAL);
			
			// 処理応答電文（共通セクタ）の形式に変換
			rspData.append(getErrCommonSector(RSLT_CD_CRITICAL, BLANK, e.toString(), EX_MSG_CRITICAL));
			
			// 返却値の設定
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, rspData.toString());
			return true;
		}
		return true;
	}

// v48.00.00 ANK-3795-00-00 DEL START
//	/**
//	 * サービス結果リストから返却項目内容を編集しリストを返却します。<BR/>
//	 * @param dataList サービス結果リスト
//	 * @return 編集済みサービス結果リスト
//	 */
//	@SuppressWarnings("unchecked")
//	private ArrayList editRspDataList(ArrayList dataList)
//	{
//		ArrayList rsList = new ArrayList();
//		HashMap dataMap = null;
//		
//		for (int i = 0; i < dataList.size(); i++)
//		{
//			
//			HashMap<String, Object> rsMap = new HashMap<String, Object>();
//			
//			dataMap = (HashMap)dataList.get(i);
//			
//			String stateNm = (String)dataMap.get(STATE_NM);
//			String cityNm = (String)dataMap.get(CITY_NM);
//			String oaztsuNm = (String)dataMap.get(OAZTSU_NM);
//			String azchoNm = (String)dataMap.get(AZCHO_NM);
//			// ANK-3612-00-00 MOD START
//			//String azchoKana = (String)dataMap.get(AZCHO_KANA);
//			// ANK-3612-00-00 MOD END
//			String stateKanjiCnt = (String)dataMap.get(STATE_KANJI_CNT);
//			String cityKanjiCnt = (String)dataMap.get(CITY_KANJI_CNT);
//			
//			// 漢字数の設定
//			String kanjiCnt = String.valueOf(Integer.parseInt(stateKanjiCnt) + Integer.parseInt(cityKanjiCnt));
//			
//			// 字町目の設定
//			if(azchoNm != null && azchoNm.length() != 0)
//			{
//				
//				// ANK-3612-00-00 MOD START
//				//// 字丁目名の最終2文字が（漢字）が"丁目"の場合
//				//if(azchoNm.length() > 1 && CHOME.equals(azchoNm.substring(azchoNm.length() - 2)))
//				//{
//				//	if(azchoNm.length() == 2)
//				//	{
//				//		azchoNm = BLANK;
//				//	}
//				//	else
//				//	{
//				//		
//				//		// 字丁目名の最終2文字の"丁目"を削った内容を設定
//				//		azchoNm = azchoNm.substring(0, azchoNm.length() - 2);
//				//	}
//				//}
//				//
//				//// 字丁目名の最終1文字が"丁"かつ、字丁目カナ名の最終1文字が"-"（半角ハイフン）かつ、"-"の直前が半角数字の場合
//				//else if(azchoKana.length() > 1 && CHO.equals(azchoNm.substring(azchoNm.length() - 1))
//				//		&& HYPHEN.equals(azchoKana.substring(azchoKana.length() - 1))
//				//		&& HalfCharCheck.isEnNumber1Check(azchoKana.substring(azchoKana.length() - 2, azchoKana.length() - 1)))
//				//{
//				//	if(azchoNm.length() == 1)
//				//	{
//				//		azchoNm = BLANK;
//				//	}
//				//	else
//				//	{
//				//		
//				//		// 字丁目名の最終1文字の"丁"を削った内容を設定
//				//		azchoNm = azchoNm.substring(0, azchoNm.length() - 1);
//				//	}
//				//}
//				// ANK-3612-00-00 MOD END
//				
//			}
//			
//			// 住所の設定
//			StringBuffer ad = new StringBuffer();
//			ad.append(stateNm).append(cityNm).append(oaztsuNm).append(azchoNm);
//			
//			rsMap.put(ADDRESS, ad.toString());
//			rsMap.put(KANJI_SUU, kanjiCnt);
//			
//			rsList.add(rsMap);
//		}
//		
//		return rsList;
//	}
// v48.00.00 ANK-3795-00-00 DEL END
	
	/**
	 * 結果コードに対応する結果種別を取得します。<BR/>
	 * @param result 処理応答電文の結果コード
	 * @return 結果コードに対応する結果種別（WDA_COM_RTYPE）
	 */
	private static String getRtype(String result)
	{
		if (result == null)
		{
			return BLANK;
		}
		
		String rtype = rtype_result_map.get(result);
		return rtype == null ? BLANK : rtype;
	}
	
	/**
	 * Mapから共通セクタ情報を取得し、処理応答電文（共通セクタ）の形式に変換します。<BR/>
	 * @param paramMap 共通セクタ情報が格納されているMap
	 * @return 処理応答電文（共通セクタ）の形式に変換された文字列
	 */
	private static String getCommonSector(HashMap<String, Object> paramMap)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(COMMON_SECTOR);
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_RTYPE);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_RTYPE));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_RESULT);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_RESULT));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL1);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL1));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL2);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL2));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL3);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL3));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL4);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL4));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL5);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL5));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL6);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL6));
		sb.append(System.getProperty(LINE_SEPARATOR));
		
		return sb.toString();
	}
	
	/**
	 * 正常時、処理応答電文(共通セクタ)の形式に変換された文字列を返却します。<BR/>
	 * @param rsltCd 処理応答電文の結果コード
	 * @return 処理応答電文（共通セクタ）の形式に変換された文字列
	 */
	private static String getNomalCommonSector(String rsltCd)
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 結果コードに対応する種別を取得する
		paramMap.put(WDA_COM_RTYPE, getRtype(rsltCd));
		paramMap.put(WDA_COM_RESULT, rsltCd);
		
		return getCommonSector(paramMap);
	}
	
	/**
	 * 異常時、処理応答電文(共通セクタ)の形式に変換された文字列を返却します。<BR/>
	 * @param rsltCd 処理応答電文の結果コード
	 * @param action アクション(key)
	 * @param dtail 詳細ステータス(value)
	 * @param msg エラーメッセージ
	 * @return 処理応答電文（共通セクタ）の形式に変換された文字列
	 */
	private String getErrCommonSector(String rsltCd, String action, String dtail, String msg)
	{
		Exception ex = new Exception(msg);
		
		// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
		String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
		
		HashMap<String, Object> commonMap = new HashMap<String, Object>();
		
		// 結果コードに対応する種別を取得する
		commonMap.put(WDA_COM_RTYPE,   getRtype(rsltCd));
		commonMap.put(WDA_COM_RESULT,  rsltCd);
		commonMap.put(WDA_COM_DETAIL1, this.getClass().getName());
		commonMap.put(WDA_COM_DETAIL2, line_num);
		commonMap.put(WDA_COM_DETAIL3, BUSINESS_LOGIC_NM);
		commonMap.put(WDA_COM_DETAIL4, action);
		commonMap.put(WDA_COM_DETAIL5, BLANK);
		commonMap.put(WDA_COM_DETAIL6, dtail);
		
		return getCommonSector(commonMap);
	}
	
	/**
	 * Mapからシンプルセクタ情報を取得し、処理応答電文（シンプルセクタ）の形式に変換します。<BR/>
	 * @param paramMap シンプルセクタ情報が格納されているMap
	 * @return 処理応答電文（シンプルセクタ）の形式に変換された文字列
	 */
	private static String getSimpleSector(HashMap<String, Object> paramMap)
	{
		StringBuffer sb = new StringBuffer(BLANK);
		
		if (paramMap == null)
		{
			sb.append(SIMPLE_SECTOR);
			sb.append(System.getProperty(LINE_SEPARATOR));
			return sb.toString();
		}
		
		Iterator<String> iterator = paramMap.keySet().iterator();
		
		// マップに格納されているキーを全て取得するまで処理を繰り返す
		for (int i = 0; iterator.hasNext(); i++)
		{
			if (i == 0)
			{
				sb.append(SIMPLE_SECTOR);
				sb.append(System.getProperty(LINE_SEPARATOR));
			}
			
			String key = (String)iterator.next();
			
			sb.append(key);
			sb.append(EQUAL);
			sb.append(getMapValue(paramMap, key));
			sb.append(System.getProperty(LINE_SEPARATOR));
		}
		
		return sb.toString();
	}
	
	/**
	 * Listからマルチセクタ情報Mapを取得し、処理応答電文（マルチセクタ）の形式に変換します。<BR/>
	 * @param paramList マルチセクタ情報が格納されているMapのリスト
	 * @param sector_nm マルチセクタ定義部のセクタ名称（キー名）
	 * @return 処理応答電文（マルチセクタ）の形式に変換された文字列
	 */
	private static String getMultipleSector(ArrayList<HashMap<String, Object>> paramList, String sector_nm)
	{
		
		if (paramList == null)
		{
			return BLANK;
		}
		
		StringBuffer sb = new StringBuffer(BLANK);
		
		for (int i = 0; i < paramList.size(); i++)
		{
			HashMap<String, Object> mltiMap = (HashMap<String, Object>)paramList.get(i);
			
			Iterator<String> iterator = mltiMap.keySet().iterator();
			
			// マップに格納されているキーを全て取得するまで処理を繰り返す
			for (int j = 0; iterator.hasNext(); j++)
			{
				if (j == 0)
				{
					sb.append(MULTI_SECTOR_STA);
					sb.append(sector_nm);
					sb.append(MULTI_SECTOR_END);
					sb.append(System.getProperty(LINE_SEPARATOR));
				}
				
				String key = (String)iterator.next();
				
				sb.append(key);
				sb.append(EQUAL);
				sb.append(getMapValue(mltiMap, key));
				sb.append(System.getProperty(LINE_SEPARATOR));
			}
		}
		
		return sb.toString();
	}
	
	/**
	 * 指定されたキーでマップの値を取得し返却します。<BR/>
	 * マップがnullの場合や値がnullの場合は空文字を返します。<BR/>
	 * 値に改行コード（CRまたはLF）がある場合は除去します。<BR/>
	 * @param map マップ
	 * @param key キー
	 * @return 値
	 */
	private static String getMapValue(HashMap<String, Object> map, String key)
	{
		if (map == null)
		{
			return BLANK;
		}
		
		String value = (String)map.get(key);
		
		if (value == null)
		{
			return BLANK;
		}
		
		// nullでなければ、改行コード（CRLF）の除去
		value = value.replace(CD_CR, BLANK);
		value = value.replace(CD_LF, BLANK);
		
		return value;
	}
	
	
	/**
	 * オブジェクトに値が設定されているか判定します。
	 * <br>
	 * @param arg0 判定するオブジェクト
	 * @return boolean true：設定済み、false：未設定
	 */
	private static boolean isNull(Object arg0) 
	{
		if (arg0 == null) 
		{
			return true;
		}
		
		return 0 == arg0.toString().length();
	}
}
