/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKLcsApiCommonUtil
*   ソースファイル名：JCKLcsApiCommonUtil.java
*   作成者          ：富士通
*   日付            ：2011年12月16日
*＜機能概要＞
*   LCSデータ連携にかかる共通機能を提供します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/16   FJ）眞方    新規作成
*   v5.00.00    2013/03/06   FJ）関      【ST1-2013-0000241】文字コード変換処理（Shift_JIS→MS932）追加
*   v6.00.00    2014/01/14   FJ）山口    【OM-2014-0000195】エスケープ処理修正
*   v17.00.00   2015/07/15   FJ) 三原    【ANK-2557-00-00】PMP再構築対応
*   v47.00.00   2019/11/07   FJ) 三原    【ANK-3706-00-00】ｅｏＩＤログインのセキュリティ強化対応
*   v54.00.00   2021/08/03   FJ) 西窪    【ANK-4092-00-00】CX戦略WG方針対応STEP2
*
**********************************************************************/
package eo.web.webview.common;

import static eo.common.constant.JCKStrConst.*;

import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.ServletRequest;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;
import com.fujitsu.futurity.web.x33.HttpDispatchContext;
import com.fujitsu.futurity.web.x33.X33CUtil;
import com.fujitsu.futurity.web.x33.X33WSessionController;

import eo.common.util.JCKLcsDataConverter;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * LCSデータ連携にかかる共通機能を提供します。<br />
 * ※当部品のメソッドは、特定の業務要件に対する共通処理です。
 * @author FJ
 *
 */
public class JCKLcsApiCommonUtil
{
	/**
	 * サービスの呼出を行います。<br />
	 * @param bl ビジネスロジックインスタンス
	 * @param paramMap パラメータマップ
	 * @param inputMap 入力データマップ
	 * @param outputMap 実行結果マップ
	 * @return 返却メッセージ情報
	 */
	@SuppressWarnings("unchecked")
	public static X31CMessageResult callService(JCCWebBusinessLogic bl, Map paramMap, Map inputMap, Map outputMap)
	{
		X31CMessageResult result = null;
		try {
			result = bl.invokeService(paramMap, inputMap, outputMap);
		} catch (JCCWebServiceException e) {
			// PMPに必ず同形式の返却データを返す必要がある為、例外throwはせずに、ビューロジックで制御する。
			result = e.getMessageList();
		}
		return result;
	}

	/**
	 * リクエスト情報入力チェック(PMP連携用)。<br />
	 * @param requireMap 全チェック定義マップ
	 * @param receiveMap 受信データマップ
	 * @return PMP連携用の戻りコード(エラーがない時はNULL)
	 */
	public static String checkRequest(Map<String, String[]> requireMap, Map<?, ?> receiveMap)
	{
		// 戻りコードの初期化
		String returnCode = null;

		if (false)
		// リクエスト元のチェック
		{
			returnCode = PMP_ERR_REMOTE_ADDR;  // 次期ではリモートIPアドレスチェックは行えない
		}
		else
		// 必須入力チェック
		{
			// 処理区分のチェック
			String processDiv  = (String)receiveMap.get("PROCESS_DIV");
			if ((processDiv == null) || ("".equals(processDiv)))
			{
				return PMP_ERR_PARAM;  // 処理区分自体が未入力の場合は、パラメータ不正エラー
			}
			else
			{
				// 必須項目チェック定義を取得
				String businessDiv = (String)receiveMap.get("BUSINESS_DIV");
				String[] colNames = requireMap.get(processDiv+","+businessDiv);
				colNames = (colNames == null) ? requireMap.get(processDiv+",*") : colNames;

				// 必須項目チェック定義が取得できない時は想定外の処理区分、業務コードとしてパラメータ不正エラー
				if (colNames == null)
				{
					return PMP_ERR_PARAM;
				}

				// チェック定義の数だけ繰り返す
				for (int i = 0; i < colNames.length; i++)
				{
					String colNamePath = colNames[i];
					if (!requireCheck(receiveMap, colNamePath)){
						return PMP_ERR_PARAM;  // 項目が未入力時はパラメータ不正エラー
					}
				}
			}
		}
		return returnCode;
	}

	/**
	 * 必須チェック(PMP連携用)。<br />
	 * @param chkParentObj 親オブジェクト
	 * @param colNamePath 項目名
	 * @return エラー時はfalse
	 */
	@SuppressWarnings("unchecked")
	private static boolean requireCheck(Object chkParentObj, String colNamePath)
	{
		Object parentObj = chkParentObj;

		// パス文字列を配列に分割
		String[] colNameAry = colNamePath.split("\\.");

		Object checkVal = null;
		//Object preParent = null;
		for (int i = 0; i < colNameAry.length; i++)
		{
			//preParent = parentObj;

			String colName = colNameAry[i];
			String editColName = colName.replaceAll("\\[[\\*0-9]+\\]", "");
			if (parentObj instanceof Map)
			{
				Map parentMap = null;
				parentMap = (Map)parentObj;
				checkVal = parentMap.get(editColName);
				parentObj = checkVal;
			}
			else if (parentObj instanceof List)
			{
				StringBuffer sb = new StringBuffer();
				for (int j = i; j < colNameAry.length; j++)
				{
					if (sb.length() > 0)
					{
						sb.append(".");
					}
					sb.append(colNameAry[j]);
				}
				String sufColNamePath = sb.toString();
				List parentList = (List)parentObj;
				for (Object subObj : parentList)
				{
					if (!requireCheck(subObj, sufColNamePath))
					{
						return false;
					}
				}
				return true;
			}
		}

		if ((checkVal == null) || (checkVal.toString().length() == 0 ))
		{
//			if (preParent != null)
//			{
				return false;
//			}
		}

		return true;
	}

	/**
	 * サービス呼出エラー用戻りコード取得(PMP連携用)。<BR/>
	 * @param domainErrMap ドメインエラー定義
	 * @param processDiv 処理区分
	 * @param msgResult メッセージ情報
	 * @param defErrReturnCd 単項目、単関連以外のエラー時に返却するエラーコード
	 * @return PMP連携用の戻りコード
	 */
	public static String getReturnCdForSvcErr(Map<String, String> domainErrMap, String processDiv, X31CMessageResult msgResult, String defErrReturnCd)
	{
		String returnCode = null;
		X31CMessageMoreInfo[] messageMoreInfoAll  = msgResult.getMessageMoreInfoList();

		for (int i = 0; i < messageMoreInfoAll.length; i++)
		{

			X31CMessageMoreInfo messageMoreInfo = messageMoreInfoAll[i];
			String status = messageMoreInfo.getStatus();
			if (("1000".equals(status)) || ("1050".equals(status)))
			{
				returnCode = domainErrMap.get(processDiv);
				break;
			}
		}
		returnCode = (returnCode != null) ? returnCode : defErrReturnCd;

		return returnCode;
	}

	/**
	 * サービス呼出エラー用戻りコード取得(PMP連携用)。<BR/>
	 * @param domainErrMap ドメインエラー定義
	 * @param processDiv 処理区分
	 * @param msgResult メッセージ情報
	 * @return PMP連携用の戻りコード
	 */
	public static String getReturnCdForSvcErr(Map<String, String> domainErrMap, String processDiv, X31CMessageResult msgResult)
	{
		return getReturnCdForSvcErr(domainErrMap, processDiv, msgResult, PMP_ERR_SYSTEM);
	}

	/**
	 * XMLデータ受信(PMP連携専用).<br />
	 * <pre>
	 * ≪補足≫
	 *  ・リクエストからXMLの取得、および Mapに変換して返却します。
	 *  ・当処理はPMPからのXMLデータ受信時のみ使用可能です。
	 * </pre>
	 * @param セッションID
	 * @return PMPから受信したXML文字列
	 * @throws IOException 
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> getReceiveXmlFromPmp(String sessionId) throws IOException
	{
		ServletRequest request = getServletRequest(sessionId);
		Map receiveMap = getRequestParamMap(request, PMP_RENKEI_ENCODE);

		// ANK-2557-00-00 MOD START
//		DEBUG_LOG.info("----- PMP連携受信データ START -----");
//		DEBUG_LOG.info(receiveMap.toString());
//		DEBUG_LOG.info("----- PMP連携受信データ  END  -----");
		JSYwebLog.println(JSYLogBase.EXECUTION, JCKLcsApiCommonUtil.class, null, "BPCON0I002", new String[]{"----- PMP連携受信データ START -----"}, null);
		JSYwebLog.println(JSYLogBase.EXECUTION, JCKLcsApiCommonUtil.class, null, "BPCON0I002", new String[]{receiveMap.toString()}, null);
		JSYwebLog.println(JSYLogBase.EXECUTION, JCKLcsApiCommonUtil.class, null, "BPCON0I002", new String[]{"----- PMP連携受信データ END -----"}, null);
		// ANK-2557-00-00 MOD END

		String receiveXml = (String)receiveMap.get(PMP_RENKEI_XML_PARAMNAME);
		// エスケープ文字の退避処理
		receiveXml = sanitizingCdEscape(receiveXml);
		return JCKLcsDataConverter.parseXml(receiveXml, PMP_RENKEI_ENCODE);
	}
	
	
	/**
	 * ServletRequestオブジェクトを取得します。<br />
	 * @param sessionId セッションID
	 * @return リクエストオブジェクト
	 */
	public static ServletRequest getServletRequest(String sessionId)
	{
		ServletRequest servletRequest = null;
		try
		{
			X33WSessionController controller = X33CUtil.getSession(sessionId);
			HttpDispatchContext context = (HttpDispatchContext)controller.getContext();
			servletRequest = context.getServletRequest();
		}
		catch (SecurityException e)
		{
			e.printStackTrace();
		}
		catch (IllegalArgumentException e)
		{
			e.printStackTrace();
		}
		return servletRequest;
	}

	/**
	 * リクエストパラメータをマップに設定し返却します。<br />
	 * @param request リクエストオブジェクト
	 * @return Map リクエストデータマップ
	 * @throws IOException
	 */
	@SuppressWarnings("unchecked")
	public static Map getRequestParamMap(ServletRequest request) throws IOException
	{
		return getRequestParamMap(request, PMP_RENKEI_ENCODE);
	}

	/**
	 * リクエストパラメータをマップに設定し返却します。<br />
	 * @param request リクエストオブジェクト
	 * @param encoding 文字コード
	 * @return Map リクエストデータマップ
	 * @throws IOException
	 */
	@SuppressWarnings("unchecked")
	public static Map getRequestParamMap(ServletRequest request, String encoding) throws IOException
	{
		TreeMap requestParamMap = new TreeMap();

		String contentType = request.getContentType();
		String nowEncoding = request.getCharacterEncoding();
		nowEncoding = ((nowEncoding != null) ? nowEncoding : encoding);

		// 入力ストリームからの受信
		java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(request.getInputStream(), encoding));
		while (true)
		{
			String line = reader.readLine();
			if (line == null)
			{
				break;
			}

			String[] keyVals = line.split("&");
			for (int i = 0; i < keyVals.length; i++)
			{
				String[] keyVal = (keyVals[i]).split("=");
				if (keyVal.length == 2)
				{
					if (contentType == null)
					{
						// コンテンツタイプが不明の時は、コンテナによるデコードが行なわれていない状態の為、自力でデコードする
						keyVal[1] = URLDecoder.decode(keyVal[1], nowEncoding);
					}
					requestParamMap.put(keyVal[0], keyVal[1]);
				}
				else if (keyVal.length == 1)
				{
					requestParamMap.put(keyVal[0], "");
				}
			}
		}

		// パラメータ受信
		java.util.Enumeration params = request.getParameterNames();
		while (params.hasMoreElements())
		{
			String paramName = (String)params.nextElement();
			String paramValue = new String((request.getParameter(paramName)).getBytes(nowEncoding), encoding);
			paramValue = convMS932(paramValue);
			requestParamMap.put(paramName, paramValue);
		}

		return requestParamMap;
	}

	/**
	 * パラメータ文字列の特定文字コード(Shift_JIS)をMS932に変換します。
	 * @param param
	 * @return 変換後文字列
	 */
	private static String convMS932(String param){

		char[][] CONV_MS932 = { /* {Shift_JISコード, MS932コード} */
								 {0x301c, 0xff5e}
								,{0x2016, 0x2225}
								,{0x2212, 0xff0d}
								,{0x00a2, 0xffe0}
								,{0x00a3, 0xffe1}
								,{0x00ac, 0xffe2}
								,{0x2010, 0x2015}
								};

		char[] charArray = param.toCharArray();
		
		for (int i = 0; i < charArray.length; i++)
		{
			char value = charArray[i];

			for (int j = 0; j < CONV_MS932.length; j++)
			{
				char[] conv = CONV_MS932[j];
				
				if (conv[0] == value)
				{
					charArray[i] = conv[1];
					break;
				}
			}
		}
		
		return new String(charArray);
	}
	
//	private static void setRequestCharacterEncoding(ServletRequest request, String encoding)
//	{
//		try {
//			Object innerRequest = getInnerRequest(request);
//			java.lang.reflect.Method method = innerRequest.getClass().getDeclaredMethod("setCharacterEncoding", new Class[]{ String.class });
//			method.setAccessible(true);
//			method.invoke(innerRequest, encoding);
//			//request.setCharacterEncoding(encoding);
//		} catch (Exception e){
//			//e.getMessage();
//		}
//	}

//	private static Object getInnerRequest(Object request) throws Exception
//	{
//		Object innerRequest = null;
//
//		Class[] classes = { request.getClass(), request.getClass().getSuperclass()};
//		for (Class targetClass : classes)
//		{
//			java.lang.reflect.Field[] fields = targetClass.getDeclaredFields();
//			for (java.lang.reflect.Field f : fields)
//			{
//				String fieldName = f.getName();
//				String fieldClassName = f.getType().getSimpleName();
//				if ("request".equals(fieldName.toLowerCase()) || "request".equals(fieldClassName.toLowerCase()))
//				{
//					f.setAccessible(true);
//					innerRequest = f.get(request);
//				}
//				if ("requestparametersparsed".equals(fieldName.toLowerCase()) && "boolean".equals(fieldClassName.toLowerCase()))
//				{
//					f.setAccessible(true);
//					f.setBoolean(request, false);
//				}
//				if ("charencodingparsed".equals(fieldName.toLowerCase()) && "boolean".equals(fieldClassName.toLowerCase()))
//				{
//					f.setAccessible(true);
//					f.setBoolean(request, false);
//				}
//			}
//			if (innerRequest != null)
//			{
//				break;
//			}
//		}
//
//		if (innerRequest == null) {
//			return request;
//		} else {
//			return getInnerRequest(innerRequest);
//		}
//	}

	/**
	 * 業務規制チェック。<br />
	 * @param bl Webビジネスロジックのインスタンス
	 * @param 更新可否チェック有無(更新操作への規制をチェックする場合はtrue)
	 * @param 照会可否チェック有無(照会操作への規制をチェックする場合はtrue)
	 * @return 業務規制結果(false:業務規制中、true:利用可能)
	 */
	private static boolean checkRegulation(JCCWebBusinessLogic bl, boolean updateMode, boolean searchMode)
	{
		X31SDataBeanAccess comInfoBean = bl.getCommonInfoBean();
		X31SDataBeanAccessArray beanArray = comInfoBean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);
		for(int i=0; i < beanArray.getCount(); i++)	
		{	
			// システム全機能の参照/更新停止規制コードの場合
			if ((searchMode || updateMode) && ( bl.RESTRICTION_ALL_SELECT_UPDATE.equals(beanArray.getDataBean(i).sendMessageString(
					CommonInfoCFConst.REQUEST_RESTRICTION_04, X31CWebConst.DATABEAN_GET_VALUE))))
			{
				return false;
			}
			// システム全機能の更新停止規制コードの場合
			if ((updateMode) && ( bl.RESTRICTION_ALL_UPDATE.equals(beanArray.getDataBean(i).sendMessageString(
					CommonInfoCFConst.REQUEST_RESTRICTION_04, X31CWebConst.DATABEAN_GET_VALUE))))
			{
				return false;
			}
		}
		return true;
	}

	/**
	 * 業務規制チェック(更新系API用)。<br />
	 * @param bl Webビジネスロジックのインスタンス
	 * @return 業務規制結果(false:業務規制中、true:利用可能)
	 */
	public static boolean checkRegulationForUpdateApi(JCCWebBusinessLogic bl)
	{
		return checkRegulation(bl, true, false);
	}

	/**
	 * 業務規制チェック(照会系API用)。<br />
	 * @param bl Webビジネスロジックのインスタンス
	 * @return 業務規制結果(false:業務規制中、true:利用可能)
	 */
	public static boolean checkRegulationForSearchApi(JCCWebBusinessLogic bl)
	{
		return checkRegulation(bl, false, true);
	}

	/**
	 * エラーログを出力する。<br />
	 * @param errMsg エラーメッセージ
	 * @param e 発生した例外(nullを指定した時はエラーメッセージのみログ出力します)
	 */
	public static void printErrorLog(String errMsg, Throwable e){
		StackTraceElement[] steAll = (e == null) ? Thread.currentThread().getStackTrace() : e.getStackTrace();
		String errorInfo = errMsg + "\n";
		errorInfo += (e != null) ? e.getClass().getName() + ": " + ((e.getMessage() != null) ? e.getMessage() : "") : "";
		for (int i = 0; i < steAll.length; i++) {
			StackTraceElement ste = steAll[i];
			if (e == null) {
				ste = steAll[2];
				i = steAll.length + 1;
			}
			errorInfo += "\n	at " + ste.getClassName() + "." + ste.getMethodName() + "(" + ste.getFileName() + ":" + ste.getLineNumber()+")"+ "\n";
		}
		errorInfo = errorInfo.replaceAll("\r\n", "\n");
		errorInfo = errorInfo.replaceAll("\n\n", "\n");
		JSYwebLog.println(JSYwebLog.ERROR, getTargetClass(), errorInfo, null, null, null);
	}

	/**
	 * 呼出元のクラスを取得する。<br />
	 * @return クラスClass
	 */
	@SuppressWarnings("unchecked")
	private static Class getTargetClass(){
		StackTraceElement[] steAll = Thread.currentThread().getStackTrace();
		StackTraceElement ste = steAll[3];
		Class cls = null;
		try {
			cls = Class.forName(ste.getClassName());
		} catch (ClassNotFoundException e) {
			// スタックトレースからの参照の為、Classが存在しない事はありえない
		}
		return cls;
	}

	/**
	 * BILL要素用のマップオブジェクト生成(ISP決済用)。<br />
	 * BILL_LIST_ISP配下のBILL要素用のマップオブジェクトを初期化し、返却します。<br />
	 * @return マップオブジェクト
	 */
	@SuppressWarnings("unchecked")
	public static Map createBillMapForBillListIsp()
	{
		Map billMap = new LinkedHashMap();
		billMap.put("USER_DIV", null);
		billMap.put("NAME", null);
		billMap.put("SERVICE_NAME", null);
		billMap.put("CONTENTS_NAME", null);
		billMap.put("CAMPAIGN_NAME", null);
		billMap.put("UNIT_PRICE", null);
		billMap.put("QUANTITY", null);
		billMap.put("AMOUNT", null);
		billMap.put("TAX_RATE", null);
		billMap.put("ACCOUNT_FLG", null);
		billMap.put("TAX_DIV", null);
		billMap.put("MODIFIED_DIV", null);
		billMap.put("SYS_ID", null);
		return billMap;
	}

	/**
	 * BILL要素用のマップオブジェクト生成(クレカ用)。<br />
	 * BILL_LIST_CREDIT配下のBILL要素用のマップオブジェクトを初期化し、返却します。<br />
	 * @return マップオブジェクト
	 */
	@SuppressWarnings("unchecked")
	public static Map createBillMapForBillListCreca()
	{
		Map billMap = new LinkedHashMap();
		billMap.put("CREDIT_CARD_NAME", null);
		billMap.put("CREDIT_CARD_NO", null);
		billMap.put("SERVICE_NAME", null);
		billMap.put("CONTENTS_NAME", null);
		billMap.put("CAMPAIGN_NAME", null);
		billMap.put("UNIT_PRICE", null);
		billMap.put("QUANTITY", null);
		billMap.put("AMOUNT", null);
		billMap.put("TAX_RATE", null);
		billMap.put("ACCOUNT_FLG", null);
		billMap.put("TAX_DIV", null);
		billMap.put("MODIFIED_DIV", null);
		return billMap;
	}
	
	/**
	 * エスケープ文字を全角文字に変換する.<br />
	 * <pre>
	 * ≪補足≫
	 *  ・XMLデータのエスケープ文字を変換全角文字する。
	 *  ・後続処理でSAPパサーでエスケープ文字がロストしてしまう対策。
	 * </pre>
	 * @param receiveXml PMPから受信したXML文字列
	 * @return PMPから受信したXML文字列を全角文字変換した結果
	 */
	private static String sanitizingCdEscape(String receiveXml) 
	{
		if (receiveXml == null) {
			return null;
		}
		receiveXml = receiveXml.replaceAll("&lt;", "＆ｌｔ；");
		receiveXml = receiveXml.replaceAll("&gt;", "＆ｇｔ；");
		receiveXml = receiveXml.replaceAll("&amp;", "＆ａｍｐ；");
		return receiveXml;
	}
	
	/**
	 * エスケープ文字を記号に変換する.<br />
	 * <pre>
	 * ≪補足≫
	 *  ・退避したエスケープ文字を元の記号に変換する。
	 * </pre>
	 * @param str PMPから受信したXML文字列
	 * @return PMPから受信したXML文字列を元の記号に戻した結果
	 */
	public static String escapeCdChenge(String str) 
	{
		str = str.replaceAll("＆ｌｔ；", "<");
		str = str.replaceAll("＆ｇｔ；", ">");
		str = str.replaceAll("＆ａｍｐ；", "&");
		return str;
	}
	
	/**
	 * 指定された文字列にサニタイズ処理を行った文字列を返却します.<br />
	 * @param value サニタイズする文字列
	 * @return サニタイズ処理後の文字列
	 */
	public static String escapeString(String value) 
	{
		if (value == null) {
			return null;
		}
		value = value.replaceAll("&", "&amp;");
		value = value.replaceAll("<", "&lt;");
		value = value.replaceAll(">", "&gt;");
		return value;
	}

	// ANK-3706-00-00 ADD START
	/**
	 * パスワードリマインダ関連チェック(AxM連携用)。<br />
	 * @param checkMap チェックリスト
	 * @param receiveMap 受信データマップ
	 * @return PMP連携用の戻りコード
	 */
	public static String pwdReminderKnrnCheck(ArrayList<Object> checkList, Map<?, ?> receiveMap)
	{
		// 受信データマップより処理区分を取得
		String processDiv  = (String)receiveMap.get("PROCESS_DIV");
		// 処理区分のチェック
		if ((processDiv == null) || ("".equals(processDiv)))
		{
			// 処理区分自体が未入力の場合は、パラメータ不正エラー
			return PMP_ERR_PARAM;
		}
		else
		{
			// 受信データマップより業務区分を取得
			String businessDiv = (String)receiveMap.get("BUSINESS_DIV");
			
			// 業務区分のチェック
			if (businessDiv == null)
			{
				// 業務区分がない場合は、businessDivを"*"に置き換える
				businessDiv = "*";
			}
			
			if (checkList != null)
			{
				for (int i = 0; i < checkList.size(); i++)
				{
					// チェックリストから「,」で分割し、処理区分(chkLst[0])と業務区分(chkLst[1])を取得する
					String[] chkLst = ((String)checkList.get(i)).split(",", 0);
					
					if (chkLst[0] != null && chkLst[1] != null)
					{
						// チェックマップより処理対象であるか判定する(チェックマップに処理区分と業務区分が定義されているか判定する)
						if (chkLst[0].equals(processDiv) && chkLst[1].equals(businessDiv))
						{
							// パスワードリマインダ（質問）コードを取得する
							String pwdReminderQuestionCode = (String)receiveMap.get("PWD_REMINDER_QUESTION_CODE");
							// パスワードリマインダ（回答）を取得する
							String pwdReminderAnswer = (String)receiveMap.get("PWD_REMINDER_ANSWER");
							
							// パスワードリマインダ（質問）コードがnullまたは空ではない、かつ、パスワードリマインダ（回答）がnullまたは空である場合は、パラメータ不正エラー
							if (!(pwdReminderQuestionCode == null || "".equals(pwdReminderQuestionCode))
								&& (pwdReminderAnswer == null || "".equals(pwdReminderAnswer)))
							{
								return PMP_ERR_PARAM;
							}
							
							// パスワードリマインダ（質問）コードがnullまたは空である、かつ、パスワードリマインダ（回答）がnullまたは空ではない場合は、パラメータ不正エラー
							if ((pwdReminderQuestionCode == null || "".equals(pwdReminderQuestionCode))
								&& !(pwdReminderAnswer == null || "".equals(pwdReminderAnswer)))
							{
								return PMP_ERR_PARAM;
							}
						}
					}
				}
			}
		}
		
		// エラーではない場合は、正常終了としてnullを返却する。
		return null;
	}
	// ANK-3706-00-00 ADD END
// ----------------- ANK-4092-00-00 ADD START
	/**
	 * リクエストパラメータをマップに設定し返却します。<br />
	 * @param request リクエストオブジェクト
	 * @param encoding 文字コード
	 * @return Map リクエストデータマップ
	 * @throws IOException
	 */
	@SuppressWarnings("unchecked")
	public static String getRequestParamMapForJson(ServletRequest request) throws IOException
	{
		TreeMap requestParamMap = new TreeMap();

		String contentType = request.getContentType();
		String nowEncoding = request.getCharacterEncoding();

		StringBuilder sb = new StringBuilder();
		
		// 入力ストリームからの受信
		java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(request.getInputStream(), nowEncoding));
		while (true)
		{
			String line = reader.readLine();
			if (line == null)
			{
				break;
			}
			// コンテキストタイプに応じて処理する
			if ("application/json".equals(contentType))
			{
				// jsonの場合、そのまま文字を連結する
				sb.append(line);
			}
			else 
			{
				String[] keyVals = line.split("&");
				for (int i = 0; i < keyVals.length; i++)
				{
					String[] keyVal = (keyVals[i]).split("=");
					if (keyVal.length == 2)
					{
						if (contentType == null)
						{
							// コンテンツタイプが不明の時は、コンテナによるデコードが行なわれていない状態の為、自力でデコードする
							keyVal[1] = URLDecoder.decode(keyVal[1], nowEncoding);
						}
						requestParamMap.put(keyVal[0], keyVal[1]);
					}
					else if (keyVal.length == 1)
					{
						requestParamMap.put(keyVal[0], "");
					}
				}
			}
		}
		// JSONの場合は特殊キーに紐づけてマップに保存 
		if (sb.length() > 0)
		{
			return sb.toString();
		}
		
		// jsonでなければデータ取得しない
		return null;

	}

// ----------------- ANK-4092-00-00 ADD END
}
