/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JECNA0160001TPMA
*	ソースファイル名：JECNA0160001TPMA.java
*	作成者			：FJ）星野
*	日付			：2021年05月07日
*＜機能概要＞
*	コンテンツ契約登録独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v53.00.00	2021/05/07	FJ）星野	【ANK-4009-00-00】CX戦略WG方針対応
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
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 com.sun.org.apache.xerces.internal.parsers.DOMParser;

import eo.common.constant.JCKStrConst;
import eo.ejb.cbs.cbsmsg.ECNA0160001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0160001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0160001CBSMsg2List;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCKLcsRenkeiUtil;


/**
 * コンテンツ契約登録独自処理部品です。
 * <br>
 * @author FJ
 *
 */
public class JECNA0160001TPMA implements TemplateMainHandler
{
	/** 外部インターフェースID */
	private static final String IF_ID = "CNIFE044";

	/** エラーフラグ(EA：設定値取得エラー) */
	private static final String EA_ERR_FLAG = "EA";
	
	/** エラーフラグ(EB：応答コードエラー) */
	private static final String EB_ERR_FLAG = "EB";
	
	/** エラーフラグ(EC：実行時エラー) */
	private static final String EC_ERR_FLAG = "EC";
	
	/** CCMG文字コード */
	private static final String CCMG_ENCODING = "UTF-8";
	
	/** CCMGへのリクエストメソッド*/
	private static final String POST_METHOD = "POST";
		
	/** モード取得用キー */
	private static final String CCMG_MODE_KEY = "LCS_CCMG_API_TEST_MODE";
	
	/** CCMGのURL*/
	private static final String CCMG_API_CP_URL = "CCMG_API_CP_URL";
	
	/** CCMGのコンテンツ契約登録API*/
	private static final String CCMG_API_CONTENTS_CONTRACT_ACTION = "CCMG_API_CONTENTS_CONTRACT_ACTION";
	
	/** CCMGへのリクエストタイムアウト時間*/
	private static final String CCMG_API_TIMEOUT = "CCMG_API_TIMEOUT";
	
	/** CCMGへのリトライ回数*/
	private static final String CCMG_API_RETRY_CNT = "CCMG_API_RETRY_CNT";
	
	/** CCMGへのリトライ間隔*/
	private static final String CCMG_API_RETRY_INTERVAL = "CCMG_API_RETRY_INTERVAL";
	
	/** ダミーHTTPステータス取得用キー */
	private static final String STUB_HTTP_STATUS_KEY = "CN_CCMG_DUMMY_HTTP_STATUS";
	
	/**
	 * XML_PATH
	 */
	protected static final String CCMG_CONNECTION_MODE_TEST_DIR = "CCMG_CONNECTION_MODE_TEST_DIR";

	/** 応答コードOK */
	private static final String CODE_OK = "00000";
	
	/** 【パラメータ一覧】  */
	/** ダミーURL */
	private static final String DUMMY_URL = "DUMMY";
	
	/** CCMG実行結果 HTTPStatus */
	public static final String EXE_STATUS = "status";
	/** エラーコード */
	private static final String ERR_CD = "ERR_CD";
	/** API送信 項目名 */
	private static final String[][] CNIFE044_REQ_INFO = new String[][]{
		{"SERVICE_ID", ECNA0160001CBSMsg.SERVICE_ID}							// コンテンツサービスID
		, {"USE_CERTIFY_ID", ECNA0160001CBSMsg.USE_CERTIFY_ID}					// 利用認証ID
		, {"ACCESS_KEY", ECNA0160001CBSMsg.ACCESS_KEY}							// アクセスキー
		, {"ENCRYPTION_CLASS", ECNA0160001CBSMsg.ENCRYPTION_CLASS}				// 暗号化種別
		, {"CONTENTS_ID", ECNA0160001CBSMsg.TARGET_CONTENTS_ID}					// コンテンツID
		, {"CONTRACT_AMOUNT", ECNA0160001CBSMsg.TARGET_CONTRACT_AMOUNT}			// 契約数量
		, {"SETTLEMENT_WAY_NO", ECNA0160001CBSMsg.SETTLEMENT_WAY_NO}			// 決済方法番号
		, {"CREDIT_ID", ECNA0160001CBSMsg.CREDIT_ID}							// クレジットカードID
		, {"AMOUNT_LIMIT_CHK_FLG", ECNA0160001CBSMsg.AMOUNT_LIMIT_CHK_FLG}		// ご利用限度額チェック実行フラグ
		, {"NO_CONTRACT_MAIL_FLG", ECNA0160001CBSMsg.NO_CONTRACT_MAIL_FLG}		// コンテンツ契約メール非送信フラグ
		, {"APPLICATION_CHANNEL", ECNA0160001CBSMsg.APPLICATION_CHANNEL}		// 申込チャネル
		, {"APPLICATION_DATE", ECNA0160001CBSMsg.APPLICATION_DATE}				// 申込日時
		, {"CAMPAIGN_CD", ECNA0160001CBSMsg.CAMPAIGN_CD}						// キャンペーンコード
		, {"V", ECNA0160001CBSMsg.V}											// バージョン
	};
	
	/** API受信 項目名 */
	private static final String[][] CNIFE044_RES_INFO = new String[][]{
		{ERR_CD, ECNA0160001CBSMsg.ERR_CD}								// エラーコード
		, {"ERR_CONTENTS_ID", ECNA0160001CBSMsg.ERR_CONTENTS_ID}		// エラーコンテンツID
		, {"SYS_ID", ECNA0160001CBSMsg.SYS_ID}							// CPSYSID
		, {"CONTENTS_INFOS", ECNA0160001CBSMsg.ECNA0160001CBSMSG1LIST}	// コンテンツ情報配列
	};
	/** API受信 項目名(コンテンツ情報配列) */
	private static final String[][] CNIFE044_RES_LIST1_INFO = new String[][]{
		{"CONTRACT_NO", ECNA0160001CBSMsg1List.CONTRACT_NO}						// 契約番号
		, {"CONTENTS_ID", ECNA0160001CBSMsg1List.CONTENTS_ID}					// コンテンツID
		, {"CONTENTS_NAME", ECNA0160001CBSMsg1List.CONTENTS_NAME}				// コンテンツ名称
		, {"CONTRACT_START_DATE", ECNA0160001CBSMsg1List.CONTRACT_START_DATE}	// 契約開始日時
		, {"CONTRACT_END_DATE", ECNA0160001CBSMsg1List.CONTRACT_END_DATE}		// 契約終了日時
		, {"UNIT_PRICE", ECNA0160001CBSMsg1List.UNIT_PRICE}						// 単価
		, {"CONTRACT_AMOUNT", ECNA0160001CBSMsg1List.CONTRACT_AMOUNT}			// 契約数量
		, {"CHARGE_AMOUNT", ECNA0160001CBSMsg1List.CHARGE_AMOUNT}				// 料金
		, {"UNCONTINUE_FLG", ECNA0160001CBSMsg1List.UNCONTINUE_FLG}				// 非継続フラグ
		, {"CONTRACT_CLASS", ECNA0160001CBSMsg1List.CONTRACT_CLASS}				// 契約種別
		, {"FREE_MONTHS", ECNA0160001CBSMsg1List.FREE_MONTHS}					// 無料期間（Xカ月）
		, {"CANCEL_CHARGE_FLG", ECNA0160001CBSMsg1List.CANCEL_CHARGE_FLG}		// 解約時有料フラグ
		, {"RECONTRACT_FREE_FLG", ECNA0160001CBSMsg1List.RECONTRACT_FREE_FLG}	// 再契約時Xカ月無料即座適用フラグ
		, {"TAX_DIVISION", ECNA0160001CBSMsg1List.TAX_DIVISION}					// 税区分
		, {"PRICE_FLG", ECNA0160001CBSMsg1List.PRICE_FLG}						// 料金フラグ
		, {"GOODS_CLASS", ECNA0160001CBSMsg1List.GOODS_CLASS}					// 商品種別
		, {"GOODS_CLASS_TEXT", ECNA0160001CBSMsg1List.GOODS_CLASS_TEXT}			// 商品種別文言
		, {"CAMPAIGN_TEXT", ECNA0160001CBSMsg1List.CAMPAIGN_TEXT}				// キャンペーン文言
		, {"CONTRACT_ADD_INFOS", ECNA0160001CBSMsg1List.ECNA0160001CBSMSG2LIST}	// コンテンツ付加情報配列
	};
	
	/** API受信 項目名(コンテンツ付加情報配列) */
	private static final String[][] CNIFE044_RES_LIST2_INFO = new String[][]{
		{"ITEM_NAME", ECNA0160001CBSMsg2List.ITEM_NAME}	// 項目名
		, {"VALUE", ECNA0160001CBSMsg2List.VALUE}		// 値
	};
	/**
	 * コンテンツ契約登録を行います。
	 * 
	 * @param inCBSMsg コンテンツ契約登録メッセージ
	 * @param inContext AgentDispatchContext
	 */
	public static void call_CNIFE044(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力を実施。
		JSYejbLog.println(JSYejbLog.DEBUG, JECNA0160001TPMA.class, "JECNA0160001TPMA#invoke start");
		
		Hashtable<String, Object> response = new Hashtable<String, Object>();
		
		/** 接続先などの判定に使用
		*   OFF： 本番・検証、ON: 開発
		*/
		String mode = JCMAPLConstMgr.getString(CCMG_MODE_KEY);
		// アプリケーションプロパティ設定チェック
		if(isNullBlank(mode))
		{
			// ステータス設定（設定値取得エラー）
			inCBSMsg.set(ECNA0160001CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			inCBSMsg.set(ECNA0160001CBSMsg.SERVICE_ID_ERR, EA_ERR_FLAG);
			inCBSMsg.set(ECNA0160001CBSMsg.ECNA0160001CBSMSG1LIST, new CAANMsg[0]);
			return;
		}
		
		// eo顧客 ⇒ CCMGへの送信先URLを設定
		String strUrl = "";
		
		if (JCKStrConst.AXM_REQUEST_TEST_MODE_OFF.equals(mode))
		{
			// 本番・検証：propertiesに設定された値を使用
			strUrl = JCMAPLConstMgr.getString(CCMG_API_CP_URL);
		}
		else
		{
			// 開発：設定しない
			strUrl = DUMMY_URL;
		}
		
		String apiName = JCCModelCommon.getApplicationConst(CCMG_API_CONTENTS_CONTRACT_ACTION);
		// 接続タイムアウト
		String strConnectTimeout = JCMAPLConstMgr.getString(CCMG_API_TIMEOUT);
		// リトライ回数
		String strRetryCount = JCMAPLConstMgr.getString(CCMG_API_RETRY_CNT);
		// リトライインターバル
		String strRetryInterval = JCMAPLConstMgr.getString(CCMG_API_RETRY_INTERVAL);
		
		// アプリケーションプロパティ設定チェック
		if(isNullBlank(strUrl)
				|| isNullBlank(strConnectTimeout)
				|| isNullBlank(strRetryCount)
				|| isNullBlank(strRetryInterval))
		{
			// ステータス設定（設定値取得エラー）
			inCBSMsg.set(ECNA0160001CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			inCBSMsg.set(ECNA0160001CBSMsg.SERVICE_ID_ERR, EA_ERR_FLAG);
			inCBSMsg.set(ECNA0160001CBSMsg.ECNA0160001CBSMSG1LIST, new CAANMsg[0]);
			return;
		}
// IT1-2021-0000050対応 20210610 MOD START
//		JSYejbLog.println(JSYejbLog.EXECUTION, JECNA0160001TPMA.class , "JECNA0160001TPMA#URL=" + strUrl);
		JSYejbLog.println(JSYejbLog.EXECUTION, JECNA0160001TPMA.class , "JECNA0160001TPMA#URL=" + strUrl + apiName);
// IT1-2021-0000050対応 20210610 MOD END
		
		try
		{
			/*
			 * 送信パラメータ作成
			 */
			Map<String, Object> paramPost = requestParamMake(inCBSMsg);
// IT1-2021-0000050対応 20210610 ADD START
			JSYejbLog.println(JSYejbLog.EXECUTION, JECNA0160001TPMA.class , "JECNA0160001TPMA#request postParameter=" + paramPost);
// IT1-2021-0000050対応 20210610 ADD END
			
			if (JCKStrConst.AXM_REQUEST_TEST_MODE_OFF.equals(mode))
			{
				// CCMGに対してリクエストを送信する。
				response = callPost(strUrl, apiName, paramPost);
				

			}
			else
			{
				// ダミーXMLを呼ぶ。
				response = callDummyXml(inCBSMsg);
			}
			
			// 連携実行結果判定
			if(isNormal(response))
			{
				// ステータス設定（0:正常終了）
				inCBSMsg.set(ECNA0160001CBSMsg.STATUS, StatusCodes.NORMAL_END);
			}
			else
			{
				// ステータス設定（応答コードエラー）
				inCBSMsg.set(ECNA0160001CBSMsg.STATUS, StatusCodes.RELATION_ERR);
				inCBSMsg.set(ECNA0160001CBSMsg.SERVICE_ID_ERR, EB_ERR_FLAG);
			}

		}
		catch (Exception e)
		{
// IT1-2021-0000050対応 20210610 MOD START
//			e.printStackTrace();
			printErrorLog(e);
// IT1-2021-0000050対応 20210610 MOD END
			// ステータス設定（実行時エラー）
			inCBSMsg.set(ECNA0160001CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			inCBSMsg.set(ECNA0160001CBSMsg.SERVICE_ID_ERR, EC_ERR_FLAG);
			inCBSMsg.set(ECNA0160001CBSMsg.ECNA0160001CBSMSG1LIST, new CAANMsg[0]);
			return;
		}
		
		// SOAPレスポンス
		editOutMsg(inCBSMsg, response, mode);

		// 終了ログ出力を実施。
		JSYejbLog.println(JSYejbLog.DEBUG, JECNA0160001TPMA.class, "JECNA0160001TPMA#invoke end");
	}

// IT1-2021-0000050対応 20210610 ADD START
	/**
	 * エラーログ出力
	 * @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, JECNA0160001TPMA.class, sb.toString());
	}
// IT1-2021-0000050対応 20210610 ADD END
	
	/**
	 * 連携実行結果判定
	 */
	private static boolean isNormal(Hashtable<String, Object> response) 
	{
		if(response==null)
		{
			return false;
		}
		
		// HTTPステータスをログ出力
		JSYejbLog.println(JSYejbLog.EXECUTION, JECNA0160001TPMA.class, "JECNA0160001TPMA#http_status=" + response.get(EXE_STATUS) );
		
		// HTTPステータス確認
		if( !Integer.toString(HttpURLConnection.HTTP_OK).equals(response.get(EXE_STATUS)))
		{
			return false;
		}
		
		// 応答コード（00000:正常）の確認
		if (!CODE_OK.equals(response.get(ERR_CD)))
		{
			return false;
		}
		
		// ここまで来たら正常終了
		return true;
	}

	/**
	 * コンテンツ契約登録APIに対して送信するリクエストパラメータを作成する。
	 * @param inCBSMsg CAANメッセージ
	 * @param inContext コンテキスト
	 * @param mode 処理区分
	 * @return リクエストパラメータを返却する。
	 */
	private static Map<String, Object> requestParamMake(CAANMsg inCBSMsg)
	{
		// リクエストパラメータ作成
		Map<String, Object> paramPost = new HashMap<String, Object>();
		
		for(String[] item : CNIFE044_REQ_INFO)
		{
			String itemName = item[0];
			String itemValue = inCBSMsg.getString(item[1]);
			
			if( !isNullBlank(itemValue) )
			{
				paramPost.put(itemName, itemValue);
			}
		}
		return paramPost;
	}

	
	/**
	 * レスポンス電文を設定します。
	 */
	private static void editOutMsg(CAANMsg inCBSMsg, Hashtable<String, Object> response, String mode)
	{
		if (response != null)
		{
			for( String[] item : CNIFE044_RES_INFO )
			{
				String itemName = item[1];
				Object itemValue = response.get(item[0]);
				if( itemValue != null && itemName.equals(ECNA0160001CBSMsg.ECNA0160001CBSMSG1LIST) )
				{
					List<CAANMsg> msg1List = new ArrayList<CAANMsg>();
					
					@SuppressWarnings("unchecked")
					List<Map<String, Object>> list1 = (List<Map<String, Object>>) itemValue;
					for( Map<String, Object> record1 : list1)
					{
						CAANMsg msg1 = new CAANMsg(ECNA0160001CBSMsg1List.class.getName());
						
						for( String[] item1 : CNIFE044_RES_LIST1_INFO )
						{
							
							String itemName1 = item1[1];
							Object itemValue1 = record1.get(item1[0]);

							if( itemValue1 != null && itemName1.equals(ECNA0160001CBSMsg1List.ECNA0160001CBSMSG2LIST) )
							{
								List<CAANMsg> msg2List = new ArrayList<CAANMsg>();
								
								@SuppressWarnings("unchecked")
								List<Map<String, Object>> list2 = (List<Map<String, Object>>) itemValue1;
								for( Map<String, Object> record2 : list2)
								{
									CAANMsg msg2 = new CAANMsg(ECNA0160001CBSMsg2List.class.getName());
									
									for( String[] item2 : CNIFE044_RES_LIST2_INFO )
									{
										
										String itemName2 = item2[1];
										Object itemValue2 = record2.get(item2[0]);

										msg2.set(itemName2, itemValue2);
									}
									msg2List.add(msg2);
								}
								
								msg1.set(itemName1, msg2List.toArray(new CAANMsg[msg2List.size()]));

							}
							else
							{
								msg1.set(itemName1, itemValue1);
							}
						}
						msg1List.add(msg1);
					}
					
					inCBSMsg.set(itemName, msg1List.toArray(new CAANMsg[msg1List.size()]));
				}
				else
				{
					inCBSMsg.set(itemName, itemValue);
				}
			}
		}
	}
	
	/**
	 * コンテンツ契約登録APIに対して送信するリクエストパラメータを作成する。
	 * @param strPostUrl 送信先URL
	 * @param json 送信するJSON文字列
	 * @param connectTimeout 接続タイムアウト
	 * @param readTimeout 読取タイムアウト
	 * @param retryCount リトライ回数
	 * @param retryInterval リトライインターバル
	 * @return JSONレスポンスから取得したパラメータ
	 */
	private static Hashtable<String, Object> callPost(String strUrl, String apiName, Map<String, Object> paramPost) throws Exception
	
	{
		Hashtable<String, Object> ret = new Hashtable<String, Object>();
		
		String proxyHost   = null;
		Integer proxyPort  = null;
		StringReader reader = null;
		
		Long timeout       = new Long(JCCModelCommon.getApplicationConst(CCMG_API_TIMEOUT));
		int retryCnt       = Integer.parseInt(JCCModelCommon.getApplicationConst(CCMG_API_RETRY_CNT));
		int retryInterval  = Integer.parseInt(JCCModelCommon.getApplicationConst(CCMG_API_RETRY_INTERVAL));
		String methodType  = POST_METHOD;	// メソッドの設定(POST)
		String encoding    = CCMG_ENCODING;	// 文字コードの設定(UTF-8)

		String httpStatus = "500";
		
		try
		{

			// リクエスト送信
			String[] responseArray = JCKLcsRenkeiUtil.sendHttpRequest(strUrl + apiName, proxyHost, 
					proxyPort, timeout, retryCnt, retryInterval, methodType, encoding, paramPost);

			// 処理結果の取得
			httpStatus   = responseArray[0];
			String responseXml = responseArray[1];
			
			// 通信に成功したテキストを取得する
			Transformer transformer = null;

			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			transformer = transformerFactory.newTransformer();

			//XML形式
			transformer.setOutputProperty(OutputKeys.METHOD, "xml");
			reader = new StringReader(responseXml);
			DOMResult dr = new DOMResult();
			transformer.transform(new StreamSource(reader), dr);


			
			/**
			 * レスポンス読込処理
			 */
			ret.putAll( read((Document) dr.getNode()) );

			StringBuffer sb = new StringBuffer();
			sb.append("CCMG連携結果 HttpStatus=[");
			sb.append(httpStatus + "]   ");
			sb.append(ret.toString());
			// レスポンスをログ出力
// IT1-2021-0000050対応 20210610 ADD START
			JSYejbLog.println(JSYejbLog.EXECUTION, JECNA0160001TPMA.class , ("JECNA0160001TPMA#responseXml=" + 
					responseXml).replaceAll("\\s+", " "));
// IT1-2021-0000050対応 20210610 ADD END
			JSYejbLog.println(JSYejbLog.EXECUTION, JECNA0160001TPMA.class ,("JECNA0160001TPMA#response=" +
					sb.toString()).replaceAll("\\s+", " "));
			
		}
		finally
		{
			if (reader != null)
			{
				reader.close();
			}
		}
		
		/*
		 * HTTP 応答メッセージから状態コードを取得し設定する。 
		 * HTTP/1.0 200 OK
		 * HTTP/1.0 401 Unauthorized
		 */
		ret.put(EXE_STATUS, httpStatus);
		
		return ret;
	}

	/**
	 * ダミーXMLをコールする
	 * @param response レスポンス設定値
	 * @return レスポンス設定値
	 * @throws IOException 
	 * @throws SAXException 
	 */
	private static Hashtable<String, Object> callDummyXml(CAANMsg inCBSMsg) throws SAXException, IOException
	{
		Hashtable<String, Object> response = new Hashtable<String, Object>();
		
		// HTTPステータス
		String httpStatus = JCMAPLConstMgr.getString(STUB_HTTP_STATUS_KEY);
		response.put(EXE_STATUS, httpStatus);
		
		// オペレータ_ID
		String operatorId = inCBSMsg.getString(ECNA0160001CBSMsg.OPERATORID);
		if(operatorId == null)
		{
			operatorId = "";
		}

		// XML_PATHを取得
		String path = (String)JCCModelCommon.getApplicationConst(CCMG_CONNECTION_MODE_TEST_DIR) 
							+ "/" + operatorId;
		// フォルダが存在しない場合、該当フォルダを作成する
		File dir = new File(path);
		if(!dir.exists()){
			dir.mkdirs();
		}
		
		/**
		 * レスポンスXML読込
		 */		
		String receiveFilePath = path + "/" + IF_ID + "_receive.xml";
		File file = new File(receiveFilePath);
		if(!file.exists()){
			// ダミーXMLがなかった時のためのデフォルト設定
			response.put(ERR_CD, CODE_OK);
			response.put(ECNA0160001CBSMsg.ECNA0160001CBSMSG1LIST, new ECNA0160001CBSMsg1List[0]);
			
			return response;
		}
		
		DOMParser parser = new DOMParser();
		parser.parse(receiveFilePath);
		Document responseXml = parser.getDocument();
		response.putAll( read(responseXml) );

		StringBuffer sb = new StringBuffer();
		sb.append("CCMGダミーXML連携結果 HttpStatus=[");
		sb.append(httpStatus + "]   ");
		sb.append(response.toString());
		// レスポンスをログ出力
		JSYejbLog.println(JSYejbLog.EXECUTION, JECNA0160001TPMA.class ,("JECNA0160001TPMA#response=" +
				sb.toString()).replaceAll("\\s+", " "));
		
		return response;
	}
	
	/**
	 * 電文読み込み処理
	 * @param soapResponse
	 * @return XML電文解析結果
	 */
	private static Hashtable<String, Object> read(Document soapResponse) 
	{
		if (soapResponse == null)
		{
			return null;
		}
		// レスポンス解析
		Element root = soapResponse.getDocumentElement();//ルート要素(SOAP通信の例：<SOAP-ENV:Envelope>)	
		Hashtable<String, Object> result = analyzeXml(root, true);

		return result;
	}

	/**
	 * コマンド送信戻り電文解析処理
	 * @param elem コマンド解析電文rootXML要素
	 * @param rootflag ルートフラグ
	 * @return XML解析結果
	 */
	private static Hashtable<String, Object> analyzeXml(Node elem, boolean rootflag)
	{
		
		Hashtable<String, Object> resultMap = null;
		
		// elemがcount属性を持つ場合、各nodeはリスト要素
		if (elem.getAttributes().getNamedItem("count") != null)
		{
			
			Node node = elem.getFirstChild();
			List<Map<String, Object>> Bodynodelist = new ArrayList<Map<String, Object>>();
	
			//リスト内の要素をすべて解析する。
			while (node != null)
			{
				if (node.getNodeType() == Node.ELEMENT_NODE)
				{
					Hashtable<String, Object> resultinfo = analyzeXml(node, false);
					if (resultinfo != null && !resultinfo.isEmpty())
					{
						Bodynodelist.add(resultinfo);
					}
				}
				
				node = node.getNextSibling();
			}
			resultMap = new Hashtable<String, Object>();
			resultMap.put(elem.getLocalName(), Bodynodelist);
		}
		else
		{
			Node node = elem.getFirstChild();
			//電文内の要素をすべて解析する。
			while (node != null)
			{
				if (node.getNodeType() == Node.ELEMENT_NODE)
				{
					if (resultMap == null)
					{
						resultMap = new Hashtable<String, Object>();
					}
					
					String nodename = node.getLocalName();
					// nodeがcount属性を持つ場合、リスト要素のため再帰処理
					if(node.getAttributes().getNamedItem("count") != null)
					{
						resultMap.put( nodename, analyzeXml(node, false).get(nodename) );
					}
					// 子要素を持つ場合は再帰処理
					else if( hasChildElement(node) )
					{
						resultMap.put(nodename, analyzeXml(node, false) );
					}
					// 以外は値を設定
					else
					{
						resultMap.put(nodename, node.getTextContent());
					}
				}
				node = node.getNextSibling();
			}
		}
		
		if (rootflag)
		{
			if (resultMap == null)
			{
				resultMap = new Hashtable<String, Object>();
			}
		}
		
		return resultMap;
	}


	private static boolean hasChildElement(Node node) 
	{
		if(node.getNodeType() != Node.ELEMENT_NODE)
		{
			return false;
		}
		
		if(!node.hasChildNodes())
		{
			return false;
		}
		
		NodeList nodelist = node.getChildNodes();
		if(nodelist == null) 
		{
			return false;
		}
		
		for(int i = 0 ; i < nodelist.getLength() ; i++) {
			Node child = nodelist.item(i);
			
			if(child.getNodeType() == Node.ELEMENT_NODE) {
				return true;
			}
		}
		
		return false;
	}

//	/**
//	 * APIの返却結果をログに出力するため編集を行う
//	 * @param ret CASHPOSTからの返却結果
//	 * @return ログ出力用文字列
//	 */
//	@SuppressWarnings("unchecked")
//	private static String makeLogStr(Hashtable<String, Object> ret)
//	{
//
//		if (ret == null)
//		{
//			return "";
//		}
//		//ログ用文字列組み立て用の変数を宣言する
//		StringBuilder sb = new StringBuilder();
//
//		//返却結果よりkeyリストを取得する
//		Enumeration keys = ret.keys();
//
//		//取得したkeyの件数分ループを行う
//		while (keys.hasMoreElements())
//		{
//
//			//valueを取得するためkeyを取得する
//			String key = (String)keys.nextElement();
//			//keyを元にvalueを取得する
//			String value = ret.get(key);
//
//			//返却結果のそのまま出力する
//			sb.append(key + "=" + value + ",");
//
//		}
//
//		return sb.toString();
//	}


	/**
	 * null又は空文字の場合、trueを返却する
	 * 
	 * @param str 検査対象文字列
	 * @return true:null、又は空文字／false:左記以外
	 */
	public static boolean isNullBlank(String str)
	{
		if (str == null || "".equals(str))
		{
			return true;
		}
		return false;
	}
}
