/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：CNA00701SFLogic
*   ソースファイル名：CNA00701SFLogic.java
*   作成者          ：富士通
*   日付            ：2013年02月12日
*＜機能概要＞
*   ０５０情報参照更新を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/02/12   FJ)圓山     新規作成
*   v8.00.00    2013/12/17   FJ)味岡     ANK-1585-00-00:LC複数契約化 参照機能の仕様修正実施
*   v8.00.01    2014/02/10   FJ)高川     ANK-1585-01-00:L2-MVNO LC複数契約化 案件内部仕様変更
*
**********************************************************************/
package eo.web.webview.CNA00701SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JCNStrConst.*;
import static eo.common.util.JCKLcsCommonUtil.isNullOrEmpty;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JCNStrConst;
import eo.web.webview.common.JCNWebCommon;

/**
 * ０５０情報参照更新処理を行います。
 * <BR>
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class CNA00701SFLogic extends X31BWebBusinessLogic
{
	
	/** 空文字 */
	private static final String STR_BLANK = "";
	
	/** ０５０情報参照更新ID */
	private static final String SERVICE_ID = "CNSV0046";
	
	/** サービスコンポーネント名 */
	private static final String CC_NAME = "JCN050InfoRefUpdCC";

	// ------------------------------------------
	// マップ項目
	// ------------------------------------------
	// リクエスト
	/** リクエストマップ項目名：SYSID */
	private static final String REQMAP_SYSID = "SYSID";

	/** リクエストマップ項目名：コンテンツ契約番号 */
	private static final String REQMAP_CONT_KEI_NO = "CONT_KEI_NO";

	/** リクエストマップ項目名：処理区分 */
	private static final String REQMAP_TRAN_DIV = "TRAN_DIV";
	
	// レスポンス
	/** レスポンスマップ項目名：戻りコード */
	private static final String RESMAP_RETURN_CODE = "return_code";
	
	/** レスポンスマップ項目名：050アプリ設定状態コード */
//	private static final String RESMAP_050APL_SETTE_STAT_CD = "APL_SETTE_STAT_CD";

	/** レスポンスマップ項目名：050電話番号 */
//	private static final String RESMAP_050_TELNO = "TELNO";
	
	/** レスポンスマップ項目名：050アプリSIPユーザーID */
//	private static final String RESMAP_050APL_SIP_USER_ID = "APL_SIP_USER_ID";
	
	/** レスポンスマップ項目名：050アプリSIPユーザーパスワード */
//	private static final String RESMAP_050APL_SIP_USER_PWD = "APL_SIP_USER_PWD";

	// ------------------------------------------
	// 入力チェック用
	// ------------------------------------------
	/** 半角英数字の範囲の最初 */
	private static final char HALF_DIGIT_AND_ALPHABET_START = '\u0021';

	/** 半角英数字の範囲の最後 */
	private static final char HALF_DIGIT_AND_ALPHABET_END = '\u007E';

	/** 半角数字の範囲の最初 */
	private static final char HALF_DIGIT_AND_NO_START = '\u0030';

	/** 半角数字の範囲の最後 */
	private static final char HALF_DIGIT_AND_NO_END = '\u0039';

	/** 半角英字(小文字)の範囲の最初 */
	private static final char HALF_DIGIT_AND_S_ALPHABETON_START = '\u0041';

	/** 半角英字(小文字)の範囲の最後 */
	private static final char HALF_DIGIT_AND_S_ALPHABETON_END = '\u005A';

	/** 半角英字(大文字)の範囲の最初 */
	private static final char HALF_DIGIT_AND_B_ALPHABETON_START = '\u0061';
	
	/** 半角英字(大文字)の範囲の最後 */
	private static final char HALF_DIGIT_AND_B_ALPHABETON_END = '\u006A';

	/** 半角スペース */
	private static final char HALF_SPACE = '\u0020';

	/** 桁数：SYSID */
	private static final int LEN_SYSID = 10;
	
	/** 桁数：コンテンツ契約番号 */
	private static final int LEN_CONT_KEI_NO = 12;

	/** 桁数：コンテンツ契約番号 */
	private static final int LEN_INPUT_CONT_KEI_NO = 129;

	/** 桁数：処理区分 */
	private static final int LEN_TRAN_DIV = 1;
	
	/**
	 * APIリクエスト時の処理を行います。
	 * <BR>
	 * @return boolean 処理結果
	 * @throws Exception 処理中に発生した例外をスロー
	 */
	@SuppressWarnings("unchecked")
	public boolean action_Init() throws Exception
	{

		DEBUG_LOG.info("action_Init Start!");

		X31SDataBeanAccess bean = getServiceFormBean();

		// 出力用Map
		HashMap outMap = new HashMap();

		// 返却用マップの作成と初期化
		Map returnMap  = createReturnMap();

		// エラー出力用
		HashMap<String, Object> mapCc = new HashMap<String, Object>();
		String returnCd = S_API_RTN_CD_OK;
		String paramContKeiNo = "999999999999";

		try
		{
			// リクエストパラメータを取得・格納
			Map<String, String> requestMap = super.getRequestParams();
			
			DEBUG_LOG.info("テスト reqestMap= " + requestMap.toString());
			DEBUG_LOG.info("テスト(UTF-8) reqestMap= " + new String(requestMap.toString().getBytes(), "UTF-8"));
			DEBUG_LOG.info("テスト(Shift-JIS) reqestMap= " + new String(requestMap.toString().getBytes(), "Shift-JIS"));
			JSYwebLog.println(JSYLogBase.EXECUTION, this.getClass(), null, "BPCON0I002",  new String[]{"CNA007_050情報参照更新_reqestMap= " + requestMap.toString()}, "");
			
			// ******************************************************
			// パラメータチェック処理
			// ******************************************************
			String sysId = (String)requestMap.get(REQMAP_SYSID);
			String inputcontKeiNo = (String)requestMap.get(REQMAP_CONT_KEI_NO);
			String tranDiv = (String)requestMap.get(REQMAP_TRAN_DIV);
			
			// ----------------------------------
			// SYSID
			// ----------------------------------
			if ("".equals(nullOrBlankWithTrim(sysId)))
			{
				// 未入力
				returnCd = JCNStrConst.API_RETURN_CD_10;
			}
			else if (sysId.length() != LEN_SYSID)
			{
				// 桁数不備
				returnCd = JCNStrConst.API_RETURN_CD_11;
			}
			else if (!isNarrowEiSuji(sysId))
			{
				// 形式エラー
				returnCd = JCNStrConst.API_RETURN_CD_12;
			}
			
			// エラーの場合は終了
			if (!JCNStrConst.API_RETURN_CD_00.equals(returnCd))
			{
				DEBUG_LOG.info("０５０情報参照更新サービスにてエラーが発生しました。(SYSID=" + sysId + ")");
				mapCc.put(RESMAP_RETURN_CODE, returnCd);
				outMap.put(CC_NAME, mapCc);
				createResultParam(bean, returnMap, outMap);
				return true;
			}

			// ----------------------------------
			// コンテンツ契約番号
			// ----------------------------------
			
			// INPUTコンテンツ契約番号のチェック
			if ("".equals(nullOrBlankWithTrim(inputcontKeiNo)))
			{
				// 未入力
				returnCd = JCNStrConst.API_RETURN_CD_13;
			}
			else if (inputcontKeiNo.length() > LEN_INPUT_CONT_KEI_NO)
			{
				// 桁数不備
				returnCd = JCNStrConst.API_RETURN_CD_14;
			}
			else if (!isNarrowEiSuji(inputcontKeiNo))
			{
				// 形式エラー
				returnCd = JCNStrConst.API_RETURN_CD_15;
			}
			
			String SepCheck = ".*,{2}.*";
			if (inputcontKeiNo.matches(SepCheck))
			{
				// INPUTコンテンツ契約番号にカンマが連続していれば、分割後コンテンツ契約番号未入力とみなしてエラー
				returnCd = JCNStrConst.API_RETURN_CD_19;
			}
			
			// エラーの場合は終了
			if (!JCNStrConst.API_RETURN_CD_00.equals(returnCd))
			{
				DEBUG_LOG.info("０５０情報参照更新サービスにてエラーが発生しました。(CONT_KEI_NO=" + inputcontKeiNo + ")");
				mapCc.put(RESMAP_RETURN_CODE, returnCd);
				outMap.put(CC_NAME, mapCc);
				createResultParam(bean, returnMap, outMap);
				return true;
			}
			
			// INPUTコンテンツ契約番号をカンマごとに分割
			String contKeiNo[] = inputcontKeiNo.split(JCNStrConst.S_SEP_CAM);
			
			// 分割分の要素数ループする
			for(int i = 0; i < contKeiNo.length; i++)
			{
				// 分割後のコンテンツ契約番号チェック実施(エラー発生時は即時終了)
				if ("".equals(nullOrBlankWithTrim(contKeiNo[i])))
				{
					// 未入力
					returnCd = JCNStrConst.API_RETURN_CD_19;
					paramContKeiNo = contKeiNo[i];
					break;
				}
				else if (contKeiNo[i].length() != LEN_CONT_KEI_NO)
				{
					// 桁数不備
					returnCd = JCNStrConst.API_RETURN_CD_20;
					paramContKeiNo = contKeiNo[i];
					break;
				}
				else if (!isNarrowEiSujiOnly(contKeiNo[i]))
				{
					// 形式エラー
					returnCd = JCNStrConst.API_RETURN_CD_21;
					paramContKeiNo = contKeiNo[i];
					break;
				}
			}
			
			// エラーの場合は終了
			if (!JCNStrConst.API_RETURN_CD_00.equals(returnCd))
			{
				DEBUG_LOG.info("０５０情報参照更新サービスにてエラーが発生しました。(CONT_KEI_NO=" + paramContKeiNo + ")");
				mapCc.put(RESMAP_RETURN_CODE, returnCd);
				outMap.put(CC_NAME, mapCc);
				createResultParam(bean, returnMap, outMap);
				return true;
			}

			// ----------------------------------
			// 処理区分
			// ----------------------------------
			if ("".equals(nullOrBlankWithTrim(tranDiv)))
			{
				// 未入力
				returnCd = JCNStrConst.API_RETURN_CD_16;
			}
			else if (tranDiv.length() != LEN_TRAN_DIV)
			{
				// 桁数不備
				returnCd = JCNStrConst.API_RETURN_CD_17;
			}
			else if (!isNarrowEiSuji(tranDiv))
			{
				// 形式エラー
				returnCd = JCNStrConst.API_RETURN_CD_18;
			}
			
			// エラーの場合は終了
			if (!JCNStrConst.API_RETURN_CD_00.equals(returnCd))
			{
				DEBUG_LOG.info("０５０情報参照更新サービスにてエラーが発生しました。(TRAN_DIV=" + tranDiv + ")");
				mapCc.put(RESMAP_RETURN_CODE, returnCd);
				outMap.put(CC_NAME, mapCc);
				createResultParam(bean, returnMap, outMap);
				return true;
			}
			
			// 処理区分が「1:参照」以外で、コンテンツ契約番号が複数件存在するかチェック
			if(!"1".equals(tranDiv) && 1 < contKeiNo.length)
			{
				// コンテンツ契約番号不備エラー
				returnCd = JCNStrConst.API_RETURN_CD_52;
			}
			
			// エラーの場合は終了
			if (!JCNStrConst.API_RETURN_CD_00.equals(returnCd))
			{
				DEBUG_LOG.info("０５０情報参照更新サービスにてエラーが発生しました。(TRAN_DIV=" + tranDiv + ":コンテンツ契約番号が複数件存在します)");
				mapCc.put(RESMAP_RETURN_CODE, returnCd);
				outMap.put(CC_NAME, mapCc);
				createResultParam(bean, returnMap, outMap);
				return true;
			}
			
			// ******************************************************
			// ０５０情報参照更新CC呼出
			// ******************************************************
			// サービス呼び出しの際の引数を生成
			HashMap paramMap = new HashMap();
			HashMap inputMap = new HashMap();
			
			// サービスへのデータセット
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID);
			paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, SERVICE_ID + "OP");
			
			createServiceMap(requestMap, inputMap);

			// サービスの呼出(０５０情報参照更新)
			X31CMessageResult msgResult = invokeService(paramMap, inputMap, outMap);
			
			// エラー処理 
			//String errFlgAuth = (String)getParamFromMap(outMap, CC_NAME, RESMAP_RETURN_CODE);
			//returnCd = (String)getParamFromMap(outMap, CC_NAME, RESMAP_RETURN_CODE);
			returnCd = (String)JCNWebCommon.getObjFromMap(outMap, "JCN050InfoRefUpdCC.return_code");
			
			if (msgResult != null)
			{
				DEBUG_LOG.info("０５０情報参照更新サービスにてエラーが発生しました。");
				returnCd = JCNStrConst.API_RETURN_CD_99;

				outMap.put(RESMAP_RETURN_CODE, JCNStrConst.API_RETURN_CD_99);
				createResultParam(bean, returnMap, outMap);
				return true;
			}
			else if (!S_API_RTN_CD_OK.equals(returnCd))
			{
				DEBUG_LOG.info("０５０情報参照更新サービスにてエラーが発生しました。");
				createResultParam(bean, returnMap, outMap);
				return true;
			}
			
			// 返却パラメータ設定
			createResultParam(bean, returnMap, outMap);
			
		}
		catch (Exception e)
		{
			StringBuilder sb = new StringBuilder();
			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw);
			
			e.printStackTrace(pw);
			sb.append("\n" + sw.toString());
			DEBUG_LOG.info("０５０情報参照更新サービスにてエラー(Exception)発生" + sb.toString());

			if (S_API_RTN_CD_OK.equals(returnCd))
			{
				returnCd = JCNStrConst.API_RETURN_CD_99;
			}
			if (outMap.get(CC_NAME) != null)
			{
				mapCc = (HashMap<String, Object>)outMap.get(CC_NAME);
			}
			mapCc.put(RESMAP_RETURN_CODE, returnCd);
			outMap.put(CC_NAME, mapCc);
			createResultParam(bean, returnMap, outMap);
		}
		DEBUG_LOG.info("action_Init End!");
		return true;
	}

	/**
	 * 返却パラメータ編集処理を行います。
	 * <BR>
	 * @param bean データBeanアクセスクラス
	 * @param outMap 出力用Map
	 */
	@SuppressWarnings("unchecked")
	private void createResultParam(X31SDataBeanAccess bean, Map returnMap, Map<?, ?> outMap) throws Exception
	{
		// xml形式出力タグ情報とOUTPUT情報の編集
		List retList = (List)returnMap.get("INFO_LIST");
		List list = (List)JCNWebCommon.getObjFromMap(outMap, "JCN050InfoRefUpdCC.cont_kei_ucwk_list");
		
		String returnCd = (String)JCNWebCommon.getObjFromMap(outMap, "JCN050InfoRefUpdCC.return_code");
		returnMap.put("RETURN_CODE", returnCd);
		
		if (!isNullOrEmpty(list))
		{
			for (int i = 0; i < list.size(); i++)
			{
				Map listRecMap = (Map)list.get(i);
				Map retListRootMap = new HashMap();
				retList.add(retListRootMap);
				Map retBillMap = new LinkedHashMap();
				retListRootMap.put("INFO", retBillMap);
				retBillMap.put("APL_SETTE_STAT_CD", listRecMap.get("n_050apl_sette_stat_cd"));
				retBillMap.put("CONT_KEI_NO", listRecMap.get("cont_kei_no"));
				retBillMap.put("TELNO", listRecMap.get("n_050_telno"));
				retBillMap.put("APL_SIP_USER_ID", listRecMap.get("n_050apl_sip_user_id"));
				retBillMap.put("APL_SIP_USER_PWD", listRecMap.get("n_050apl_sip_user_pwd"));
				retBillMap.put("TANMT_DSP_MODEL_SBT", listRecMap.get("tanmt_dsp_model_sbt"));
			}
		}
		else
		{
			Map retListRootMap = new HashMap();
			retList.add(retListRootMap);
			Map retBillMap = new LinkedHashMap();
			retListRootMap.put("INFO", retBillMap);
			retBillMap.put("APL_SETTE_STAT_CD", null);
			retBillMap.put("CONT_KEI_NO", null);
			retBillMap.put("TELNO", null);
			retBillMap.put("APL_SIP_USER_ID", null);
			retBillMap.put("APL_SIP_USER_PWD", null);
			retBillMap.put("TANMT_DSP_MODEL_SBT", null);
		}
		
		String xml = JCNWebCommon.parseMapToXmlForPmp(returnMap, 1).replaceAll("\r\n", "\n");
		bean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, xml);
		JSYwebLog.println(JSYLogBase.EXECUTION, this.getClass(), null, "BPCON0I002",  new String[]{"CNA007_050情報参照更新_returnMap= " + returnMap.toString()}, "");
	}
	
	/**
	 * サービスへのパラメータを作成します。
	 * <BR>
	 * @param requestMap リクエストパラメータMap
	 * @param inputMap 入力Map
	 * @throws Exception 処理中に発生した例外をスロー
	 */
	private void createServiceMap(Map<String, String> requestMap, Map<String, Object> inputMap) throws Exception
	{
		
		HashMap<String, Object> mapCc = new HashMap<String, Object>();
		
		mapCc.put(REQMAP_SYSID, getParameterToString(requestMap, REQMAP_SYSID));
		mapCc.put(REQMAP_CONT_KEI_NO, getParameterToString(requestMap, REQMAP_CONT_KEI_NO));
		mapCc.put(REQMAP_TRAN_DIV, getParameterToString(requestMap, REQMAP_TRAN_DIV));

		inputMap.put(CC_NAME, mapCc);
	}

	/**
	 * パラメータマップを解析し、キーに一致する値を返却します。
	 * <BR>
	 * @param requestMap リクエストMap
	 * @param keyName キー名
	 * @return String キー値
	 * @throws 処理中に発生した例外をスロー
	 */
	private static String getParameterToString(Map<String, String> requestMap, String keyName) throws Exception
	{
		
		String value = "";
		Iterator<?> keyIterator = requestMap.keySet().iterator();
		
		while (keyIterator.hasNext())
		{
			String key = (String)keyIterator.next();
			
			if (key.equals(keyName) ||  key.matches(keyName + "\\[[0-9]*\\]"))
			{
				value = requestMap.get(key);
			}
			
		}
		return new String(value.getBytes());
	}
	
	/**
	 * マップから指定されたキーの値を取得します。<BR>
	 * (使用例） getParamFromXml("LKA11020_RECEIVE", "PROCESS_DIV");
	 * <BR>
	 * @param map マップ
	 * @param allKeys キー名
	 * @return 値
	 */
	@SuppressWarnings("unchecked")
	public static Object getParamFromMap(Map map, String...allKeys)
	{

		Map nowMap = map;
		Object returnVal = null;
		for (int i = 0; i < allKeys.length; i++)
		{
			String key = allKeys[i]; 
			int idx = -1; 
			if (key.matches("[a-zA-Z0-9_\\-]+\\[[0-9]+\\]"))
			{
				idx = new Integer(key.replaceFirst("^[a-zA-Z0-9_\\-]+\\[", "").replace("]", "")); 
				key = key.replaceFirst("\\[[0-9]+\\]", ""); 
			}
			if (nowMap.containsKey(key))
			{
				Object val = nowMap.get(key); 
				if ((val instanceof List) && (idx >= 0))
				{
					List nowList = (List)val; 
					val = nowList.get(idx); 
				}
				if (val instanceof Map)
				{
					nowMap = (Map)val; 
				}
				if (i == allKeys.length - 1)
				{
					returnVal = val; 
				}
			}
			else
			{
				return null; 
			}
		}

		return returnVal;
	}
	
	/**
	 * 対象文字列がnull以外の場合trimして返し、nullの場合は空白を返します。
	 * <BR>
	 * @param base 対象文字列
	 * @return 変換後文字列
	 */
	private static String nullOrBlankWithTrim(String base)
	{	
		
    	// 引数の対象文字列がnull以外の場合
        if (!isNullOrBlanks(base))
        {
        	// TRIMした値を返す
            return base.trim();
        }
        
        // 引数の対象文字列がnullの場合、空文字を返す
        return STR_BLANK;
    }
	/**
	 * null、空文字、空白文字（半角空白、全角空白）の判定を行います。
	 * <BR>
	 * @param strCheck　対象文字列
	 * @return true:対象文字列がnullもしくは空白文字（半角空白、全角空白）のみ、false:それ以外
	 */
    private static boolean isNullOrBlanks(String strCheck)
    {
    	
		// 対象文字列が対象文字列がnullもしくは空文字の場合
    	if (strCheck == null || STR_BLANK.equals(strCheck))
    	{
    		// trueを返す
        	return true;
        }
    	
    	// 全半角空白を空文字に置換
        String strRep = strCheck.replaceAll(" ", STR_BLANK).replaceAll("　", STR_BLANK);
        
        // 空文字以外が存在する場合
        if (strRep.length() > 0)
        {
        	// falseを返す
        	return false;
        }
        
        // 空文字のみの場合、trueを返す
        return true;
	}

	/**
	 * 文字列がすべて半角英数で構成されているか判定します。
	 * 備考：<br>
	 *           <p>半角文字の範囲：<br>
	 *           　半角英数字 &#92;u0021〜&#92;u007E 、半角空白とISO制御文字も許容されます。<br>
	 *           　半角空白 &#92;u0020<br>
	 *           　ISO制御文字 &#92;u0000 〜 &#92;u001F または &#92;u007F 〜 &#92;u009F
	 *           
	 * @param str 判定対象の文字列<br>
	 * @return boolean 文字列がすべて半角文字ならば true そうでないなら false
	 * @exception IllegalArgumentException 引数が空文字列またはnullの場合にスローされます
	 */
	private static boolean isNarrowEiSuji(String str) throws IllegalArgumentException {

		// 引数がnullか空文字の場合はfalse。
		if(str == null || "".equals(str)) 
		{
			return false;
		}

		// 引数の文字列を文字に分解します。
		char[] chars = str.toCharArray( );
		int length = chars.length;

		// 文字列を構成する文字が半角文字の範囲に入っているか調べます。
		for(int i = 0; i < length; i++) 
		{
			// 範囲に入っていない場合は false を返します。
			if(!(HALF_DIGIT_AND_ALPHABET_START <= chars[i] && chars[i] <= HALF_DIGIT_AND_ALPHABET_END 
					|| chars[i] == HALF_SPACE || Character.isISOControl(chars[i]))) 
			{
				return false;
			}
		}
		return true;
	}

	/**
	 * 文字列がすべて半角英数で構成されているか判定します。
	 * 備考：<br>
	 *           <p>半角文字の範囲：<br>
	 *           　半角英数字 &#92;u0021〜&#92;u007E 、半角空白とISO制御文字も許容されます。<br>
	 *           　半角空白 &#92;u0020<br>
	 *           
	 * @param str 判定対象の文字列<br>
	 * @return boolean 文字列がすべて半角文字ならば true そうでないなら false
	 * @exception IllegalArgumentException 引数が空文字列またはnullの場合にスローされます
	 */
	private static boolean isNarrowEiSujiOnly(String str) throws IllegalArgumentException {

		// 引数がnullか空文字の場合はfalse。
		if(str == null || "".equals(str)) 
		{
			return false;
		}

		// 引数の文字列を文字に分解します。
		char[] chars = str.toCharArray( );
		int length = chars.length;

		// 文字列を構成する文字が半角文字の範囲に入っているか調べます。
		for(int i = 0; i < length; i++) 
		{
			// 範囲に入っていない場合は false を返します。
			if(!(HALF_DIGIT_AND_NO_START <= chars[i] && chars[i] <= HALF_DIGIT_AND_NO_END
					|| HALF_DIGIT_AND_S_ALPHABETON_START <= chars[i] && chars[i] <= HALF_DIGIT_AND_S_ALPHABETON_END
					|| HALF_DIGIT_AND_B_ALPHABETON_START <= chars[i] && chars[i] <= HALF_DIGIT_AND_B_ALPHABETON_END)) 
			{
				return false;
			}
		}
		return true;
	}    
	/**
	 * 返却用マップの作成と初期化<br />
	 * @return 返却用マップ
	 */
	@SuppressWarnings("unchecked")
	private Map createReturnMap()
	{
		Map returnMap  = new LinkedHashMap();
		returnMap.put("RETURN_CODE", "");
		returnMap.put("INFO_LIST", new ArrayList());
		return returnMap;
	}
    
}
