/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JZMCtrlCisInfoStubImpl
*   ソースファイル名：JZMCtrlCisInfoStubImpl.java
*   作成者          ：富士通
*   日付            ：2015年05月25日
*＜機能概要＞
*   CISシステム SOAP連携（試験向け）コマンド発行部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v16.00.00   2015/05/25	FJ)酒井		【ANK-2480-00-00】対応 新電力
*   
**********************************************************************/
package eo.ejb.common;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;


/**
 * CISシステム SOAP連携（試験向け）コマンド発行部品クラスです。
 * @author 富士通
 */
public class JCKCtrlCisInfoStubImpl extends JCKCtrlCisInfo
{
	
	/**
	 * インスタンス
	 */
	private static JCKCtrlCisInfo instance = null;
	
	/**
	 * XML_PATH
	 */
	protected static final String CIS_CONNECTION_MODE_TEST_DIR = "CIS_CONNECTION_MODE_TEST_DIR";

	/**
	 * コンストラクタです。
	 */
	private JCKCtrlCisInfoStubImpl()
	{
	}

	/**
	 * インスタンス取得用のメソッド
	 * 
	 * @return JCKCtrlCisInfoStubImpl
	 */
	public static synchronized JCKCtrlCisInfo getInstance()
	{
		if(instance == null) 
		{
			instance = new JCKCtrlCisInfoStubImpl();
		}
		return instance;
	}

	/**
	 * KKIFE253_eo電気契約お客様変更
	 * 
	 * @param serviceMap サービスマップハッシュテーブル
	 * @return サービスマップ戻り値
	 * @throws Exception
	 */
	@Override
	public Map<String, Object> call_KKIFE253(Map<String, Object> serviceMap)
	{
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "call_KKIFE253:START");
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "serviceMap:" + serviceMap.toString());
		
		Map<String, Object> resultMap = call_CIS(serviceMap, (String)JCCModelCommon.getApplicationConst(CIS_URL_KKIFE253));
		
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "resultMap:" + resultMap.toString());
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "call_KKIFE253:END");
		
		return resultMap;
	}
	/**
	 * KKIFE264_eo電気契約一覧照会
	 * 
	 * @param serviceMap サービスマップハッシュテーブル
	 * @return サービスマップ戻り値
	 * @throws Exception
	 */
	@Override
	public Map<String, Object> call_KKIFE264(Map<String, Object> serviceMap)
	{
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "call_KKIFE264:START");
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "serviceMap:" + serviceMap.toString());
		
		Map<String, Object> resultMap = call_CIS(serviceMap, (String)JCCModelCommon.getApplicationConst(CIS_URL_KKIFE264));
		
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "resultMap:" + resultMap.toString());
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "call_KKIFE264:END");

		return resultMap;
	}

	/**
	 * コマンド発行部品
	 * 
	 * @param serviceMap サービスマップハッシュテーブル
	 * @param url CISサーバ接続のURL
	 * @return サービスマップ戻り値
	 */
	private Map<String, Object> call_CIS(Map<String, Object> serviceMap, String url) {
		
		Document requestXml = null;
		Document responseXml = null;
		File file = null;
		Transformer transformer = null;
		StringWriter sw = null;
		String request = null;
		String response = null;
		Hashtable<String, Object> ret = new Hashtable<String, Object>();
		
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "URL "+url);
		
		try {

			/**
			 * リクエストXML出力
			 */
			requestXml = createXml(serviceMap);
		
			// XML_PATHを取得
			String path = (String)JCCModelCommon.getApplicationConst(CIS_CONNECTION_MODE_TEST_DIR) 
								+ "/" + (String)serviceMap.get(JCKCtrlCisInfo.OPERATORID);
			// フォルダが存在しない場合、該当フォルダを作成する
			file = new File(path);
			if(!file.exists()){
				file.mkdirs();
			}
		
			file = new File(path + "/" + (String)serviceMap.get(JCKCtrlCisInfo.SERVICEID) + "_send.xml");

			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			transformer = transformerFactory.newTransformer();
			// エンコーディング
			transformer.setOutputProperty(OutputKeys.ENCODING, ENCODING);
			// 改行指定
			transformer.setOutputProperty(OutputKeys.INDENT,"yes");
			// リクエストXML出力
			transformer.transform(new DOMSource(requestXml), new StreamResult(file));

			/**
			 * 上り電文のログ出力
			 */
			sw = new StringWriter();
			transformer.transform(new DOMSource(requestXml), new StreamResult(sw));
			request = sw.toString();

			/**
			 * レスポンスXML読込
			 */		
			file = new File(path + "/" + (String)serviceMap.get(JCKCtrlCisInfo.SERVICEID) + "_receive.xml");		
			if(!file.exists()){
				// requestID
				ret.put(JCKCtrlCisInfo.REQUESTID, (String)serviceMap.get(JCKCtrlCisInfo.OUT_IF_ID) + "_reqId" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));
				// serviceID
				ret.put(JCKCtrlCisInfo.SERVICEID, (String)serviceMap.get(JCKCtrlCisInfo.SERVICEID));
				// channel
				ret.put(JCKCtrlCisInfo.CHANNEL, "3");
				// viewID
				ret.put(JCKCtrlCisInfo.VIEWID, (String)JCCModelCommon.getApplicationConst(CIS_OUT_SYS_CD));
				// operatorID
				ret.put(JCKCtrlCisInfo.OPERATORID, (String)JCCModelCommon.getApplicationConst(CIS_OUT_SYS_CD));
				// ipAddress
				ret.put(JCKCtrlCisInfo.IPADDRESS, "");
				// operateDatetime
				ret.put(JCKCtrlCisInfo.OPERATEDATETIME, (String)serviceMap.get(JCKCtrlCisInfo.OPERATEDATETIME));
				// errorLevel
				ret.put(JCKCtrlCisInfo.ERROR_LEVEL, "000");
				// returnCode
				ret.put(JCKCtrlCisInfo.RETURN_CD, "0000");
				// returnMessage
				ret.put(JCKCtrlCisInfo.RETURN_MESSAGE, "");
				
				return ret;
			}
			
			DOMParser parser = new DOMParser();
			parser.parse(path + "/" + (String)serviceMap.get(JCKCtrlCisInfo.SERVICEID) + "_receive.xml");
			responseXml = parser.getDocument();
			ret = read(responseXml);

			/**
			 * 下り電文のログ出力
			 */
			sw = new StringWriter();
			transformer.transform(new DOMSource(responseXml), new StreamResult(sw));
			response = sw.toString();
			
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
			ret.put(JCKCtrlCisInfo.CMD_RESULT_CD, "1");
			ret.put(JCKCtrlCisInfo.CMD_ERROR_MESSAGE, "XML電文処理でエラーが発生しました。" + e.getMessage());
			return ret;
		} catch (SAXException e) {
			e.printStackTrace();
			ret.put(JCKCtrlCisInfo.CMD_RESULT_CD, "1");
			ret.put(JCKCtrlCisInfo.CMD_ERROR_MESSAGE, "XML電文処理でエラーが発生しました。" + e.getMessage());
			return ret;
		} catch (IOException e) {
			e.printStackTrace();
			ret.put(JCKCtrlCisInfo.CMD_RESULT_CD, "1");
			ret.put(JCKCtrlCisInfo.CMD_ERROR_MESSAGE, "XML電文処理でエラーが発生しました。" + e.getMessage());
			return ret;
		} catch (TransformerException e) {
			e.printStackTrace();
			ret.put(JCKCtrlCisInfo.CMD_RESULT_CD, "1");
			ret.put(JCKCtrlCisInfo.CMD_ERROR_MESSAGE, "XML電文処理でエラーが発生しました。" + e.getMessage());
			return ret;
		} catch (Exception e) {
			e.printStackTrace();
			ret.put(JCKCtrlCisInfo.CMD_RESULT_CD, "1");
			ret.put(JCKCtrlCisInfo.CMD_ERROR_MESSAGE, "XML電文処理でエラーが発生しました。" + e.getMessage());
			return ret;
		}
		finally
		{
			if("1".equals((String)ret.get(JCKCtrlCisInfo.CMD_RESULT_CD))
					|| !"000".equals((String)ret.get(JCKCtrlCisInfo.ERROR_LEVEL))
					|| !"0000".equals((String)ret.get(JCKCtrlCisInfo.RETURN_CD))){
				
				JSYejbLog.outlog(null, JSYejbLog.ERROR, this.getClass(), "リクエストXML：" + request);
				JSYejbLog.outlog(null, JSYejbLog.ERROR, this.getClass(), "レスポンスXML：" + response);
				
			}else{
				
				JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "リクエストXML：" + request);
				JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), "レスポンスXML：" + response);
			}
		}
		
		return ret;
	}
}
