/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JECNA0300001CBSMsgTPMA
*	ソースファイル名：JECNA0300001CBSMsgTPMA.java
*	作成者			：FJ）張
*	日付			：2024年2月10日
*＜機能概要＞
*	身元確認状況取得独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v70.00.00	2024/02/10	FJ張	【ANK-4538-00-00】LaLaCall契約時の本人確認必須化
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.constant.JCNStrConst;
import eo.common.util.JCNStringUtil;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECNA0240001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg11List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg3List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg4List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg5List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg6List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg7List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg8List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg9List;
import eo.ejb.cbs.cbsmsg.ECNA0300001CBSMsg10List;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCNCtrlTrustDockConnectInfoImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 身元確認状況取得独自処理部品です。
 * <br>
 * @author FJ
 *
 */
public class JECNA0300001TPMA implements TemplateMainHandler
{	
	/** 接続モード **/
	private static final String TRUSTDOCK_CNIFE060_CONNECTION_MODE  = "TRUSTDOCK_CNIFE060_CONNECTION_MODE";
	/** 接続URL */
	private static final String TRUSTDOCK_CNIFE060_URL  = "TRUSTDOCK_CNIFE060_URL";
	/** 接続APIID */
	private static final String TRUSTDOCK_CNIFE060_APIID  = "CNIFE060";
	/** 接続メソッド */
	private static final String TRUSTDOCK_CNIFE060_METHOD  = "TRUSTDOCK_CNIFE060_METHOD";
	/** タイムアウト時間 */
	private static final String TRUSTDOCK_CNIFE060_TIMEOUT  = "TRUSTDOCK_CNIFE060_TIMEOUT";
	/** リトライカウント */
	private static final String TRUSTDOCK_CNIFE060_RETRYCOUNT  = "TRUSTDOCK_CNIFE060_RETRYCOUNT";
	/** リトライインターバル */
	private static final String TRUSTDOCK_CNIFE060_RETRYINTERVAL  = "TRUSTDOCK_CNIFE060_RETRYINTERVAL";
	/** HTTPステータス（正常） */
	private static final String HTTP_STAT_200  = "200";
	
	
	/** API受信 項目名 */
	private static final String[][] CNIFE060_RES_INFO = new String[][]{
		  {"id",							 	    ECNA0300001CBSMsg.RES_ID}                      // 身元確認ID
		, {"public_id",				                ECNA0300001CBSMsg.PUBLIC_ID}				   // 身元確認公開ID
		, {"state",				                    ECNA0300001CBSMsg.STATE}				       // 確認状況
		, {"result",				                ECNA0300001CBSMsg.RESULT}				       // 確認結果
		, {"accepted_at",				            ECNA0300001CBSMsg.ACCEPTED_AT}				   // 受付日時
		, {"plans_selected_at",				        ECNA0300001CBSMsg.PLANS_SELECTED_AT}	       // プラン選択日時
		, {"document_submitted_at",				    ECNA0300001CBSMsg.DOCUMENT_SUBMITTED_AT}       // 確認書類提出日時
		, {"prepared_at",				            ECNA0300001CBSMsg.PREPARED_AT}				   // 準備完了日時
		, {"verified_at",				            ECNA0300001CBSMsg.VERIFIED_AT}				   // 確認日時
		, {"external_id",				            ECNA0300001CBSMsg.EXTERNAL_ID}	               // 外部ID
		, {"comparing_data",				        ECNA0300001CBSMsg.ECNA0300001CBSMSG1LIST}	   // 比較データ
		, {"records",				                ECNA0300001CBSMsg.ECNA0300001CBSMSG2LIST}	   // 確認記録リスト
		
	};
	
	/** API受信 項目名（比較データ） */
	private static final String[][] CNIFE060_RES_LIST1_INFO = new String[][]{
		  {"submitted_at",					        ECNA0300001CBSMsg1List.SUBMITTED_AT}			     // 提出日時
		, {"data",				                    ECNA0300001CBSMsg1List.ECNA0300001CBSMSG11LIST}      // データ
	};
	
	/** API受信 項目名（データ） */
	private static final String[][] CNIFE060_RES_LIST11_INFO = new String[][]{
		  {"token",					                ECNA0300001CBSMsg11List.DATA_TOKEN}			// トークン
		, {"expired_at",				            ECNA0300001CBSMsg11List.DATA_EXPIRED_AT}    // 有効期限
		, {"url",				                    ECNA0300001CBSMsg11List.DATA_URL}           // URL
	};
	
	
	/** API受信 項目名（確認記録リスト） */
	private static final String[][] CNIFE060_RES_LIST2_INFO = new String[][]{
		  {"state",					                ECNA0300001CBSMsg2List.RECORDS_STATE}		         // 確認状況	
		 ,{"result",					            ECNA0300001CBSMsg2List.RECORDS_RESULT}		         // 確認結果	
		 ,{"verified_at",			    	        ECNA0300001CBSMsg2List.RECORDS_VERIFIED_AT}		     // 確認日時	
		 ,{"verified_by",		  	    	        ECNA0300001CBSMsg2List.RECORDS_VERIFIED_BY}		     // 身元確認を行ったオペレーターのID	
		 ,{"plan",				                    ECNA0300001CBSMsg2List.ECNA0300001CBSMSG3LIST}		 // プラン	
		 ,{"document",				                ECNA0300001CBSMsg2List.ECNA0300001CBSMSG4LIST}		 // 確認書類	
		 ,{"reasons",				                ECNA0300001CBSMsg2List.ECNA0300001CBSMSG9LIST}		 // 否認理由リスト
					
	};
	
	/** API受信 項目名（プラン） */
	private static final String[][] CNIFE060_RES_LIST3_INFO = new String[][]{
		  {"id",					                ECNA0300001CBSMsg3List.PLAN_ID}		                  // プランID
		 ,{"name",				    	            ECNA0300001CBSMsg3List.PLAN_NAME}		              // 名前
	};
	
	/** API受信 項目名（確認書類） */
	private static final String[][] CNIFE060_RES_LIST4_INFO = new String[][]{
		  {"id_document",			                ECNA0300001CBSMsg4List.ECNA0300001CBSMSG5LIST}		         // 公的身分証
		 ,{"individual_number_document",            ECNA0300001CBSMsg4List.ECNA0300001CBSMSG6LIST}		         // 番号確認書類
		 ,{"selfie",                                ECNA0300001CBSMsg4List.ECNA0300001CBSMSG7LIST}		         // セルフィー
		 ,{"data",                                  ECNA0300001CBSMsg4List.ECNA0300001CBSMSG8LIST}		         // データ
				
	};
	
	
	/** API受信 項目名（否認理由リスト） */
	private static final String[][] CNIFE060_RES_LIST9_INFO = new String[][]{
		  {"target",			                    ECNA0300001CBSMsg9List.TARGET}		                         // 対象 
		 ,{"code",                                  ECNA0300001CBSMsg9List.CODE}		                         // コード 
		 ,{"detail",                                ECNA0300001CBSMsg9List.ECNA0300001CBSMSG10LIST}		     // 詳細 		
	};
	
	/** API受信 項目名（公的身分証） */
	private static final String[][] CNIFE060_RES_LIST5_INFO = new String[][]{
		  {"type",			            ECNA0300001CBSMsg5List.ID_DOCUMENT_TYPE}		              // 種類 
		 ,{"submitted_at",              ECNA0300001CBSMsg5List.ID_DOCUMENT_SUBMITTED_AT}		      // 提出日時 	 
	};
	
	/** API受信 項目名（番号確認書類） */
	private static final String[][] CNIFE060_RES_LIST6_INFO = new String[][]{
		  {"type",			        ECNA0300001CBSMsg6List.NUMBER_DOCUMENT_TYPE}		          // 種類 
		 ,{"submitted_att",         ECNA0300001CBSMsg6List.NUMBER_DOCUMENT_SUBMITTED_AT}		  // 提出日時 	 
	};
	
	/** API受信 項目名（セルフィー） */
	private static final String[][] CNIFE060_RES_LIST7_INFO = new String[][]{
		 {"submitted_at",                    ECNA0300001CBSMsg7List.SELFIE_SUBMITTED_AT}		              // 提出日時 	 
	};
	
	/** API受信 項目名（データ） */
	private static final String[][] CNIFE060_RES_LIST8_INFO = new String[][]{
		 {"token",                                                         ECNA0300001CBSMsg8List.TOKEN}		                          // トークン 	 
	    ,{"expired_at",                                                    ECNA0300001CBSMsg8List.EXPIRED_AT}		                      //有効期限	 
	    ,{"image_urls",                                                    ECNA0300001CBSMsg8List.IMAGE_URLS}		                      //画像URL
	    ,{"video_urls",                                                    ECNA0300001CBSMsg8List.VIDEO_URLS}		                      //動画URL
	    ,{"text_urls",                                                     ECNA0300001CBSMsg8List.TEXT_URLS}		                      //テキストURL
	    ,{"individual_number_document_image_urls",                         ECNA0300001CBSMsg8List.INDIVIDUAL_NUMBER_DOCUMENT_IMAGE_URLS}  //個人番号取得書類画像URL
	    ,{"individual_number_url",                                         ECNA0300001CBSMsg8List.INDIVIDUAL_NUMBER_URL}		          //個人番号URL
		
	};
	
	/** API受信 項目名（詳細） */
	private static final String[][] CNIFE060_RES_LIST10_INFO = new String[][]{
		 {"fields",                    ECNA0300001CBSMsg10List.FIELDS}		                // 対象の比較データの項目 	 
	};
	
	
	
	/**
	 * 身元確認状況取得を行います。
	 * 
	 * @param inCBSMsg 身元確認状況取得メッセージ
	 * @param inContext AgentDispatchContext
	 */
	public static void call_CNIFE060(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		CAANMsg reqMsg = new CAANMsg();
		HashMap<String,Object> connect = new HashMap<String, Object>();
		HashMap<String,Object> reqInfo = new HashMap<String, Object>();
		Map<String, Object> body = new HashMap<String, Object>();
		
		// body部マッピング
		setBody(inCBSMsg,body);
		// 接続モード
		connect.put(JCNCtrlTrustDockConnectInfoImpl.CONNECTINFO_CONNECTMODE, JKKStringUtil.nullToBlank(JCCModelCommon.getApplicationConst(TRUSTDOCK_CNIFE060_CONNECTION_MODE)));
		//接続URL
		connect.put(JCNCtrlTrustDockConnectInfoImpl.CONNECTINFO_URL, JKKStringUtil.nullToBlank(setURL(JCCModelCommon.getApplicationConst(TRUSTDOCK_CNIFE060_URL),inCBSMsg)));
		//接続APIID
		connect.put(JCNCtrlTrustDockConnectInfoImpl.CONNECTINFO_APIID, TRUSTDOCK_CNIFE060_APIID);
		//接続メソッド
		connect.put(JCNCtrlTrustDockConnectInfoImpl.CONNECTINFO_CONNECTMETHOD, JKKStringUtil.nullToBlank(JCCModelCommon.getApplicationConst(TRUSTDOCK_CNIFE060_METHOD)));
		//タイムアウト時間
		connect.put(JCNCtrlTrustDockConnectInfoImpl.CONNECTINFO_TIMEOUT, JKKStringUtil.nullToBlank(JCCModelCommon.getApplicationConst(TRUSTDOCK_CNIFE060_TIMEOUT)));
		//リトライカウント
		connect.put(JCNCtrlTrustDockConnectInfoImpl.CONNECTINFO_RETRYCOUNT, JKKStringUtil.nullToBlank(JCCModelCommon.getApplicationConst(TRUSTDOCK_CNIFE060_RETRYCOUNT)));
		//リトライインターバル
		connect.put(JCNCtrlTrustDockConnectInfoImpl.CONNECTINFO_RETRYINTERVAL, JKKStringUtil.nullToBlank(JCCModelCommon.getApplicationConst(TRUSTDOCK_CNIFE060_RETRYINTERVAL)));
		//BODY
		reqInfo.put(JCNCtrlTrustDockConnectInfoImpl.RESINFO_BODY, body);
		
		reqMsg.setPrivate(JCNCtrlTrustDockConnectInfoImpl.CONNECTINFO, (Object)connect);
		reqMsg.setPrivate(JCNCtrlTrustDockConnectInfoImpl.REQINFO, (Object)reqInfo);
		
		// コマンド発行部品のインスタンスを取得
		JCNCtrlTrustDockConnectInfoImpl instance = new JCNCtrlTrustDockConnectInfoImpl();
		
		Hashtable<String, Object> jsonResult = new Hashtable<String, Object>();
		try
		{
			JSYejbLog.println(JSYejbLog.EXECUTION, JECNA0300001TPMA.class , "JECNA0300001TPMA#request postParameter=" + inCBSMsg);
			// 共通API連携
			Map<String, Object> resServiceMap = instance.ctrlTrustDockConnect(reqMsg);
			
			if(resServiceMap == null)
			{
				resServiceMap = new HashMap<String, Object>();
			}
			// 接続結果
			Map<String, Object> connectResult = (Map<String, Object>) resServiceMap.get(JCNCtrlTrustDockConnectInfoImpl.CONNECTRESULT);
			// レスポンス情報
			Map<String, Object> resInfo = (Map<String, Object>) resServiceMap.get(JCNCtrlTrustDockConnectInfoImpl.RESINFO);
			JsonNode resultBody = (JsonNode)resInfo.get(JCNCtrlTrustDockConnectInfoImpl.RESINFO_BODY);
			jsonResult = read(resultBody);
			
			// HTTPステータス
			String httpStatus = JKKStringUtil.nullToBlank((String) connectResult.get("httpStatus"));
			
			// 共通API連携実行結果判定
			// 正常終了の場合
			if (httpStatus.equals(HTTP_STAT_200))
			{
				// ステータス設定（0:正常終了）
				inCBSMsg.set(ECNA0300001CBSMsg.STATUS, StatusCodes.NORMAL_END);
			}
			// 上記以外の場合
			else
			{
				// 正常終了または異常終了のステータス以外で返却された場合
				inCBSMsg.set(ECNA0300001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
			}
			// レスポンス電文を設定　※異常が発生している場合でも空で作成する
			editOutMsg(inCBSMsg, jsonResult, httpStatus);
		}
		catch(Exception e)
		{
			printErrorLog(e);
			// ステータス設定（実行時エラー）
			inCBSMsg.set(ECNA0300001CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			inCBSMsg.set(ECNA0300001CBSMsg.ECNA0300001CBSMSG1LIST, new CAANMsg[0]);
			return;
		}
		
		// 終了ログ出力を実施。
		JSYejbLog.println(JSYejbLog.DEBUG, JECNA0300001TPMA.class, "JECNA0300001TPMA#call_CNIFE060 end");
	}
	
	/**
	 * 接続URLにIDを設定します。
	 * <br>
	 * @param connectUrl APLConstから取得した接続URL
	 * @param inCBSMsg 身元確認状況取得メッセージ
	 */
	private static String setURL(String connectUrl,CAANMsg inCBSMsg)
	{
		// SYSID
		String id = inCBSMsg.getString(ECNA0300001CBSMsg.KEY_ID);
		
		// 接続URLにSYSIDを埋め込む
		if(!JKKStringUtil.isNullBlank(id) && !JKKStringUtil.isNullBlank(connectUrl))
		{
			connectUrl = connectUrl.replace("{id}", id);
		}
		return connectUrl;
	}
	
	/**
	 * 共通APIのリクエスト電文を設定します。
	 * <br>
	 * @param inCBSMsg コンテンツ契約変更依頼メッセージ
	 * @param resServiceMap レスポンスサービスマップ
	 */
	private static void setBody(CAANMsg inCBSMsg, Map<String, Object> body)
	{
		// ID
		body.put(ECNA0300001CBSMsg.KEY_ID,objNullToBlank(inCBSMsg.getObject(ECNA0300001CBSMsg.KEY_ID)));
		
	}
	
	/**
	 * 共通APIのレスポンス電文を設定します。
	 * <br>
	 * @param inCBSMsg コンテンツ契約変更依頼メッセージ
	 * @param resServiceMap レスポンスサービスマップ
	 */
	private static void editOutMsg(CAANMsg inCBSMsg, Hashtable<String, Object> resultBody,String httpStat)
	{
	
		
		
		if(resultBody != null)
		{
			for(String[] item : CNIFE060_RES_INFO)
			{
				String itemName = item[1];
				Object itemValue = resultBody.get(item[0]);
				
				if(itemValue == null)
				{
					inCBSMsg.setNull(itemName);
				}
				
				else if(itemName.equals(ECNA0300001CBSMsg.ECNA0300001CBSMSG1LIST))
				{  
					List<CAANMsg> msg1List = new ArrayList<CAANMsg>();	
					Map<String, Object> list1 = (Map<String, Object>) itemValue;
					CAANMsg msg1 = new CAANMsg(ECNA0300001CBSMsg1List.class.getName());
						
						for(String[] item1 : CNIFE060_RES_LIST1_INFO)
						{
							String itemName1 = item1[1];
							Object itemValue1 = list1.get(item1[0]);
							
							if(itemValue1 == null)
							{
								msg1.setNull(itemName1);
							}
							else if(itemName1.equals(ECNA0300001CBSMsg1List.ECNA0300001CBSMSG11LIST))
							{ 
								List<CAANMsg> msg11List = new ArrayList<CAANMsg>();
								
								Map<String, Object> list11 = (Map<String, Object>) itemValue1;
													   
								CAANMsg msg11 = new CAANMsg(ECNA0300001CBSMsg11List.class.getName());
								
								for(String[] item11 : CNIFE060_RES_LIST11_INFO)
								{
									String itemName11 = item11[1];
									Object itemValue11 = list11.get(item11[0]);
									
									if(itemValue11 == null)
									{
										msg11.setNull(itemName11);
									}
									else {
										msg11.set(itemName11, (String) itemValue11);
									}
								}
								msg11List.add(msg11);
								msg1.set(itemName1, msg11List.toArray(new CAANMsg[msg11List.size()]));
							}
							
							else {
								msg1.set(itemName1, (String) itemValue1);
							}	
						}
				    msg1List.add(msg1);					
			        inCBSMsg.set(itemName, msg1List.toArray(new CAANMsg[msg1List.size()]));
				}
				else if(itemName.equals(ECNA0300001CBSMsg.ECNA0300001CBSMSG2LIST))
				{   
					List<CAANMsg> msg2List = new ArrayList<CAANMsg>();
					List<Map<String, Object>> list2 = (List<Map<String, Object>>) itemValue;
					
					for(Map<String, Object> record2 : list2)
					{   
						CAANMsg msg2 = new CAANMsg(ECNA0300001CBSMsg2List.class.getName());
						
						for(String[] item2 : CNIFE060_RES_LIST2_INFO)
						{
							String itemName2 = item2[1];
							Object itemValue2 = record2.get(item2[0]);
							
							if(itemValue2 == null)
							{
								msg2.setNull(itemName2);
							}
							else if(itemName2.equals(ECNA0300001CBSMsg2List.RECORDS_VERIFIED_BY)) 
							{
								// verified_by:身元確認を行ったオペレーターのIDはリストで来るためカンマ区切りにする。
								
								List<String> verifiedByList = (List<String>)itemValue2 ;
								String str = "";
								
								for (String verifiedBy : verifiedByList)
								{
									
									if(!"".equals(str))
									{
										str += ",";
									}
									str += verifiedBy;
								}
							    msg2.set(itemName2, str);
							}
							else if(itemName2.equals(ECNA0300001CBSMsg2List.ECNA0300001CBSMSG3LIST)) 
							{
								List<CAANMsg> msg3List = new ArrayList<CAANMsg>();
								Map<String, Object> list3 = (Map<String, Object>) itemValue2;
								CAANMsg msg3 = new CAANMsg(ECNA0300001CBSMsg3List.class.getName());
									
								for(String[] item3 : CNIFE060_RES_LIST3_INFO)
								{
									String itemName3 = item3[1];
									Object itemValue3 = list3.get(item3[0]);
										
									if(itemValue3 == null)
									{
										msg3.setNull(itemName3);
									}
									else
									{
										msg3.set(itemName3, (String) itemValue3);
									}
								}
								msg3List.add(msg3);			
							    msg2.set(itemName2, msg3List.toArray(new CAANMsg[msg3List.size()]));
							}
							else if(itemName2.equals(ECNA0300001CBSMsg2List.ECNA0300001CBSMSG4LIST)) 
							{
								List<CAANMsg> msg4List = new ArrayList<CAANMsg>();
								Map<String, Object> list4 = (Map<String, Object>) itemValue2;
								CAANMsg msg4 = new CAANMsg(ECNA0300001CBSMsg4List.class.getName());
									
								for(String[] item4 : CNIFE060_RES_LIST4_INFO)
								{
									String itemName4 = item4[1];
									Object itemValue4 = list4.get(item4[0]);
										
									if(itemValue4 == null)
									{
										msg4.setNull(itemName4);
									}
									else if(itemName4.equals(ECNA0300001CBSMsg4List.ECNA0300001CBSMSG5LIST)) 
									{
										List<CAANMsg> msg5List = new ArrayList<CAANMsg>();
										Map<String, Object> list5 = (Map<String, Object>) itemValue4;
										CAANMsg msg5 = new CAANMsg(ECNA0300001CBSMsg5List.class.getName());
												
										for(String[] item5 : CNIFE060_RES_LIST5_INFO)
										{
											String itemName5 = item5[1];
											Object itemValue5 = list5.get(item5[0]);
													
											if(itemValue5 == null)
											{
												msg5.setNull(itemName5);
											}
											else 
											{
												msg5.set(itemName5, (String) itemValue5);
											}
										 }
										msg5List.add(msg5);
										msg4.set(itemName4, msg5List.toArray(new CAANMsg[msg5List.size()]));
									}	
									else if(itemName4.equals(ECNA0300001CBSMsg4List.ECNA0300001CBSMSG7LIST)) 
									{
									    List<CAANMsg> msg7List = new ArrayList<CAANMsg>();
										Map<String, Object> list7 = (Map<String, Object>) itemValue4;
										CAANMsg msg7 = new CAANMsg(ECNA0300001CBSMsg7List.class.getName());
												
										for(String[] item7 : CNIFE060_RES_LIST7_INFO)
										{
											String itemName7 = item7[1];
											Object itemValue7 = list7.get(item7[0]);
													
											if(itemValue7 == null)
											{
												msg7.setNull(itemName7);
											}
											else 
											{
												msg7.set(itemName7, (String) itemValue7);
											}
										}
										msg7List.add(msg7);
										msg4.set(itemName4, msg7List.toArray(new CAANMsg[msg7List.size()]));
									}
									else if(itemName4.equals(ECNA0300001CBSMsg4List.ECNA0300001CBSMSG8LIST)) 
									{
										List<CAANMsg> msg8List = new ArrayList<CAANMsg>();
										Map<String, Object> list8 = (Map<String, Object>) itemValue4;
										CAANMsg msg8 = new CAANMsg(ECNA0300001CBSMsg8List.class.getName());
												
										for(String[] item8 : CNIFE060_RES_LIST8_INFO)
										{
											String itemName8 = item8[1];
											Object itemValue8 = list8.get(item8[0]);
													
											if(itemValue8 == null)
											{
												msg8.setNull(itemName8);
											}
											else if("image_urls".equals(itemName8))
											{
												// image_urls:画像URLはリストで来るためカンマ区切りにする。
												List<String> imageUrlsList = (List<String>)itemValue8;
												String str = "";
												for(String imageUrls : imageUrlsList)
												{
													if(!"".equals(str))
													{
														str += ",";
													}
													str += imageUrls;
												}
												msg8.set(itemName8, str);
											}
											else if("video_urls".equals(itemName8))
											{
												// video_urls:動画URLはリストで来るためカンマ区切りにする。
												List<String> videoUrlsList = (List<String>)itemValue8;
												String str = "";
												for(String videoUrls : videoUrlsList)
												{
													if(!"".equals(str))
													{
														str += ",";
													}
													str += videoUrls;
												}
												msg8.set(itemName8, str);
											}
											else if("text_urls".equals(itemName8))
											{
												// text_urls:テキストURLはリストで来るためカンマ区切りにする。
												List<String> textUrlsList = (List<String>)itemValue8;
												String str = "";
												for(String textUrls : textUrlsList)
												{
													if(!"".equals(str))
													{
														str += ",";
													}
													str += textUrls;
												}
												msg8.set(itemName8, str);
											}
											else 
											{
												msg8.set(itemName8, (String) itemValue8);
											}											
											
										}
										msg8List.add(msg8);
										msg4.set(itemName4, msg8List.toArray(new CAANMsg[msg8List.size()]));
									}
									else if(itemName4.equals(ECNA0300001CBSMsg4List.ECNA0300001CBSMSG6LIST)) 
									{
										List<CAANMsg> msg6List = new ArrayList<CAANMsg>();
										Map<String, Object> list6 = (Map<String, Object>) itemValue4;
										CAANMsg msg6 = new CAANMsg(ECNA0300001CBSMsg6List.class.getName());
												
										for(String[] item6 : CNIFE060_RES_LIST6_INFO)
										{
											String itemName6 = item6[1];
											Object itemValue6 = list6.get(item6[0]);
													
											if(itemValue6 == null)
											{
												msg6.setNull(itemName6);
											}
											else 
											{
												msg6.set(itemName6, (String) itemValue6);
											}
										}
										msg6List.add(msg6);
										msg4.set(itemName4, msg6List.toArray(new CAANMsg[msg6List.size()]));
									}
								    else {
										msg4.set(itemName4, (String) itemValue4);
									}
								}
								msg4List.add(msg4);								
								msg2.set(itemName2, msg4List.toArray(new CAANMsg[msg4List.size()]));
					     	}		
							else if(itemName2.equals(ECNA0300001CBSMsg2List.ECNA0300001CBSMSG9LIST)) 
							{
								List<CAANMsg> msg9List = new ArrayList<CAANMsg>();
								List<Map<String, Object>> list9 = (List<Map<String, Object>>) itemValue2;
								
								for(Map<String, Object> record9 : list9)
								{ 
									CAANMsg msg9 = new CAANMsg(ECNA0300001CBSMsg9List.class.getName());
									
									for(String[] item9 : CNIFE060_RES_LIST9_INFO)
									{
										String itemName9 = item9[1];
										Object itemValue9 = record9.get(item9[0]);
										
										if(itemValue9 == null)
										{
											msg9.setNull(itemName9);
										}
										else if(itemName9.equals(ECNA0300001CBSMsg9List.ECNA0300001CBSMSG10LIST)) 
										{
											List<CAANMsg> msg10List = new ArrayList<CAANMsg>();
											Map<String, Object> list10 = (Map<String, Object>) itemValue9;
											CAANMsg msg10 = new CAANMsg(ECNA0300001CBSMsg10List.class.getName());
												
											for(String[] item10 : CNIFE060_RES_LIST10_INFO)
											{
											    String itemName10 = item10[1];
												Object itemValue10 = list10.get(item10[0]);
													
												if(itemValue10 == null)
												{
													msg10.setNull(itemName10);
												}
												else
												{
													msg10.set(itemName10, (String) itemValue10);
												}
											}
											msg10List.add(msg10);
											msg9.set(itemName9, msg10List.toArray(new CAANMsg[msg10List.size()]));
										}
										else
										{
											msg9.set(itemName9, (String) itemValue9);
										}
									}
									msg9List.add(msg9);
								}
								msg2.set(itemName2, msg9List.toArray(new CAANMsg[msg9List.size()]));
							}
							else
							{
								msg2.set(itemName2, (String) itemValue2);
							}									    
						}
						msg2List.add(msg2);
					}
					inCBSMsg.set(itemName, msg2List.toArray(new CAANMsg[msg2List.size()]));
				}	
				else
				{
					inCBSMsg.set(itemName, (String) itemValue);
				}
			}
			
			inCBSMsg.set(ECNA0300001CBSMsg.HTTPSTATUS, httpStat);
		}
	}
	
		
	/**
	 * 電文読み込み処理
	 * @param jsonResponse
	 * @return json電文解析結果
	 */
	private static Hashtable<String, Object> read(JsonNode jsonResponse) 
	{
		if(jsonResponse == null)
		{
			return null;
		}
		Hashtable<String, Object> result = analyzeJson(jsonResponse);

		return result;
	}
	
	/**
	 * コマンド送信戻り電文解析処理
	 * @param elem コマンド解析電文rootjson要素
	 * @param rootflag ルートフラグ
	 * @return json解析結果
	 */
	private static Hashtable<String, Object> analyzeJson(JsonNode elem)
	{
		
		Hashtable<String, Object> resultMap = new Hashtable<String, Object>();
		
		Iterator<Map.Entry<String, JsonNode>> fields = elem.fields();
		while(fields.hasNext())
		{
			Map.Entry<String, JsonNode> field = fields.next();
			
			String fieldName = field.getKey();
			JsonNode fieldValue = field.getValue();
			
			
			if(fieldValue.isNull())
			{
				//何もしない
			}
			// Arrayの場合
			else if(fieldValue.isArray())
			{
				ArrayList<Object> Bodynodelist = new ArrayList<Object>();
				Iterator<JsonNode> itr = fieldValue.elements();
				while(itr.hasNext())
				{
					JsonNode node = itr.next();
					if(node.isValueNode())
					{
						Bodynodelist.add(node.textValue());
					}
					else
					{
						Hashtable<String, Object> resultinfo = analyzeJson(node);
						if (resultinfo != null && !resultinfo.isEmpty())
						{
							Bodynodelist.add(resultinfo);
						}
					}
				}
				
				resultMap.put( fieldName, Bodynodelist);
			}
			// 子要素を持つ場合は再帰処理
			else if( fieldValue.isObject() )
			{
				resultMap.put(fieldName, analyzeJson(fieldValue) );
			}
			// 以外は値を設定
			else
			{
				if(fieldValue.isInt())
				{
					resultMap.put(fieldName, fieldValue.bigIntegerValue().toString());
				}
				else if(fieldValue.isTextual())
				{
					resultMap.put(fieldName, fieldValue.textValue());
				}
				else
				{
					//何もしない
				}
			}
		}
		
		return resultMap;
	}
	

/**
	 * 引数で受け取った値がNULLの場合、空を設定し返却する。
	 * <br>
	 * @param Object 
	 */
	private static Object objNullToBlank(Object obj)
	{
		if(obj == null)
		{
			return JCNStrConst.S_BLANK;
		}
			return obj;
	}	
	/**
	 * エラーログ出力
	 * @param e 発生した例外
	 * @param params 指示書パラメータ(1〜50)
	 * @param errTitle エラータイトル
	 * @param sjishoNo 指示書番号
	 * @param sjishoNaiyoSeq 指示書内容枝番
	 */
	static private void printErrorLog(Exception e)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(e.getMessage()+ "\n");
		sb.append(e.getClass().getName()+ "\n");
		StackTraceElement[] steAll = e.getStackTrace();
		for (StackTraceElement ste : steAll) {
			sb.append("	at " + ste.getClassName() + "." + ste.getMethodName() + "(" + ste.getFileName() + ":" + ste.getLineNumber()+")"+ "\n");
		}
		JSYejbLog.println(JSYejbLog.ERROR, JECNA0300001TPMA.class, sb.toString());
	}

}
