/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JWCCtrlTnInfoImpl
*   ソースファイル名：JWCCtrlTnInfoImpl.java
*   作成者          ：富士通
*   日付            ：2012年03月26日
*＜機能概要＞
*   宅内機器連携（本番向け）コマンド発行部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/03/26   FJ) 富士通  新規作成
*   v5.00.00    2013/06/30   FJ) 大山    LT-2013-0000080
*   v68.00.00   2023/11/22   FJ) 三角    ANK-4463-00-00_【eo定期】サービスサーバリプレース対応_ＳT工程まで
*   v68.00.00   2024/01/19   FJ) 広田    ANK-4463-00-00_【eo定期】サービスサーバリプレース対応_ＳT工程まで
*
**********************************************************************/
package eo.ejb.common;


import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;

import eo.common.constant.JWCStrConst;
import eo.ejb.cbs.cbsmsg.EWCA0010001CBSMsg;
import eo.ejb.cbs.cbsmsg.EWCA0010002CBSMsg;
import eo.ejb.cbs.cbsmsg.EWCA0010004CBSMsg;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;



/**
 * 宅内機器連携コマンド発行部品です。<p>
 * <br>
 * @author 富士通
 */
public class JWCCtrlTnInfoImpl extends JWCCtrlTnInfo 
{
	private static JWCCtrlTnInfoImpl instance = null;
	private Connection connection = null;
	private AgentDispatchContext inContext;
	
	
	public void setInContext(AgentDispatchContext inContext) {
		this.inContext = inContext;
	}

	
	private JWCCtrlTnInfoImpl() {
		super();
		instance = null;
	}

	public static JWCCtrlTnInfoImpl getInstance() {
		synchronized (JWCCtrlTnInfoImpl.class) {
			if(instance == null) 
			{
				JWCCtrlTnInfoImpl.instance = new JWCCtrlTnInfoImpl();
			}
		}
		
		return instance;
	}

	// 宅内連携用エンドポイント定数
	/**
	 * WCA0001
	 */
//ANK-4463-00-00 MOD START
	//private static final String ENDPOINT_WCA0001 = "taku_fsekikr0040";
	private static final String ENDPOINT_WCA0001 = "FSEKIKR0040";
//ANK-4463-00-00 MOD END

	/**
	 * WCA0002
	 */
//ANK-4463-00-00 MOD START
	//private static final String ENDPOINT_WCA0002 = "taku_fsekikr0070";
	private static final String ENDPOINT_WCA0002 = "FSEKIKR0070";
//ANK-4463-00-00 MOD END
	/**
	 * WCA0003
	 */
//ANK-4463-00-00 MOD START
	//private static final String ENDPOINT_WCA0003 = "taku_fsekiku0020";
	private static final String ENDPOINT_WCA0003 = "FSEKIKU0020";
//ANK-4463-00-00 MOD END

	/**
	 * WCA0004
	 */
//ANK-4463-00-00 MOD START
	//private static final String ENDPOINT_WCA0004 = "taku_fsekikr0050";
	private static final String ENDPOINT_WCA0004 = "FSEKIKR0050";
//ANK-4463-00-00 MOD END
	
	
	// HTTP関連定数定義
	/**
	 * HTTPヘッダ Content-TYPE
	 */
	private static final String CONTENT_TYPE = "Content-Type";
	
	/**
	 * HTTPヘッダ Conten-TYPE（値）
	 */
	private static final String CONTENT_TYPE_VALUE = "text/xml; charset=UTF-8";

	/**
	 * HTTPヘッダ リクエストメソッド定数
	 */
	private static final String HTTP_REQUEST_METHOD = "POST";
	

	//SOAP 関連定数定義
	/**
	 * SOAP1.2用Namespace
	 */
	private static final String SOAP12 = "http://schemas.xmlsoap.org/soap/envelope/";
	
	/**
	 * SOAPエンベロープのPrefix
	 */
	private static final String SOAP_PREFIX = "SOAP-ENV";
	
	
	// SAOP-ENV:body内部系
	/**
	 * SOAP-ENV BODY用のPrefix
	 */
	private static final String BODY_PREFIX = "";

	/**
	 * パッケージ用Namespace
	 */
	private static final String BODY_NAMESPACE = "";

	
	/**
	 * XSL用Prefix
	 */
	private static final String XSL_PREFIX = "xsl";
	
	/**
	 * XSL用Namespace
	 */
	private static final String XSL_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance";
	
	
	// CRLF定数定義
	/**
	 * CRLF定数定義
	 */
	private static final String CRLF = "\r\n";
	
	// XML要素情報定数定義（結果コード取得電文）
	/**
	 * SOALFAULT（処理例外）
	 */
	private static final String SOAP_FAULT = "fault";
	
	/**
	 * SOALFAULT（エラーコード）
	 */
	private static final String SOAP_FAULT_CODE = "reason";

	/**
	 * SOALFAULT（エラー詳細）
	 */
	private static final String SOAP_FAULT_STRING = "detail";

	/**
	 * 制御エラー応答コード
	 */
	private static final String ERRCODE = "ErrCode";


	
	// メッセージwriterから実装を移管

	/**
	 * XMLStreamWriterクラス
	 */
	private XMLStreamWriter writer = null;
		
	/**
	 * Writerクラス
	 */
	private Writer wt = null;
	
	// 文字化け対策
	/**
	 * StringWriterクラス
	 */
	private StringWriter sw = new StringWriter();

	/**
	 * 戻り電文がSoapメッセージ
	 */
	private boolean soapMessage = false;

	/**
	 * 戻り電文HTTPヘッダ
	 */
	private HashMap<Object, Object> header = new HashMap<Object, Object>();

	/**
	 * 呼び出し区分
	 */
	public String trace_kbn = "";

	/**
	 * 呼び出し区分：宅内機器一覧照会(3)
	 */
	private static final String TRACE_KBN_WCA0001 = "1";

	/**
	 * 呼び出し区分：宅内機器一意照会(2)
	 */
	private static final String TRACE_KBN_WCA0002 = "2";
	
	/**
	 * 呼び出し区分：STB情報更新
	 */
	private static final String TRACE_KBN_WCA0003 = "3";
	
	/**
	 * 呼び出し区分：宅内機器一覧照会(4)
	 */
	private static final String TRACE_KBN_WCA0004 = "4";
	
	/**
	 * 宅内向け外部IF-ID 宅内機器一覧照会(3)用　定数 
	 */
	private static final String WCA0001_IFID = "WCIFE002";
		
	/**
	 * 宅内向け外部IF-ID 宅内機器一意照会(2)用　定数　
	 */
	private static final String WCA0002_IFID = "WCIFE003";
	
	/**
	 * 宅内向け外部IF-ID STB情報更新　用　定数 
	 */
	private static final String WCA0003_IFID = "WCIFE004";
	
	/**
	 * 宅内向け外部IF-ID 宅内機器一覧照会(4)用　定数 
	 */
	private static final String WCA0004_IFID = "WCIFE005";
	
	/**
	 * 宅内向け外部IF-ID OTHER 
	 */
	private static final String WCA0000_IFID = "WCIFE000";
	
	/**
	 * データ定義、XML要素変換テーブル
	 */
	private static HashMap<String, String> elementToMap = new HashMap<String, String>() 
	{
		{
			//宅内機器型式コード
			put(JWCCtrlTnInfoImpl.KEY_TK_MDL_CD, JWCCtrlTnInfo.TK_MDL_CD);
			//機器製造番号
			put(JWCCtrlTnInfoImpl.KEY_KK_SEIZO_NO, JWCCtrlTnInfo.KK_SEIZO_NO);
			//STBID
			put(JWCCtrlTnInfoImpl.KEY_STBID, JWCCtrlTnInfo.STBID);
			//宅内機器種別コード
			put(JWCCtrlTnInfoImpl.KEY_TK_SBT_CD, JWCCtrlTnInfo.TK_SBT_CD);
			//STB松下用グループID1
			put(JWCCtrlTnInfoImpl.KEY_STB_MATSU_YO_GRPID1, JWCCtrlTnInfo.STB_MATSU_YO_GRPID1);
			//STB松下用グループID2
			put(JWCCtrlTnInfoImpl.KEY_STB_MATSU_YO_GRPID2, JWCCtrlTnInfo.STB_MATSU_YO_GRPID2);
			//STB松下用グループID3
			put(JWCCtrlTnInfoImpl.KEY_STB_MATSU_YO_GRPID3, JWCCtrlTnInfo.STB_MATSU_YO_GRPID3);
			//STB松下用グループID4
			put(JWCCtrlTnInfoImpl.KEY_STB_MATSU_YO_GRPID4, JWCCtrlTnInfo.STB_MATSU_YO_GRPID4);
			//STB松下用グループID5
			put(JWCCtrlTnInfoImpl.KEY_STB_MATSU_YO_GRPID5, JWCCtrlTnInfo.STB_MATSU_YO_GRPID5);
			//STB松下用グループID6
			put(JWCCtrlTnInfoImpl.KEY_STB_MATSU_YO_GRPID6, JWCCtrlTnInfo.STB_MATSU_YO_GRPID6);
			//宅内機器型式コード
			put(JWCCtrlTnInfoImpl.TK_MDL_CD, JWCCtrlTnInfo.TK_MDL_CD);
			//宅内機器型式コード(STB)
			put(JWCCtrlTnInfoImpl.STB_TK_MDL_CD, JWCCtrlTnInfo.STB_TK_MDL_CD);
			//機器製造番号(STB)
			put(JWCCtrlTnInfoImpl.KK_SEIZO_NO, JWCCtrlTnInfo.KK_SEIZO_NO);
			//STBID
			put(JWCCtrlTnInfoImpl.STBID, JWCCtrlTnInfo.STBID);
			//宅内機器種別コード
			put(JWCCtrlTnInfoImpl.TK_SBT_CD, JWCCtrlTnInfo.TK_SBT_CD);
			//STBステータスコード
			put(JWCCtrlTnInfoImpl.STB_STAT_CD, JWCCtrlTnInfo.STB_STAT_CD);
			//STB内蔵CASコード
			put(JWCCtrlTnInfoImpl.STB_NAIZOCAS_CD, JWCCtrlTnInfo.STB_NAIZOCAS_CD);
			//STB松下用グループID1
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID1, JWCCtrlTnInfo.STB_MATSU_YO_GRPID1);
			//STB松下用グループID2
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID2, JWCCtrlTnInfo.STB_MATSU_YO_GRPID2);
			//STB松下用グループID3
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID3, JWCCtrlTnInfo.STB_MATSU_YO_GRPID3);
			//STB松下用グループID4
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID4, JWCCtrlTnInfo.STB_MATSU_YO_GRPID4);
			//STB松下用グループID5
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID5, JWCCtrlTnInfo.STB_MATSU_YO_GRPID5);
			//STB松下用グループID6
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID6, JWCCtrlTnInfo.STB_MATSU_YO_GRPID6);
			//表示件数
			put(JWCCtrlTnInfoImpl.DSP_NUM, JWCCtrlTnInfo.DSP_NUM);
			//表示ページ
			put(JWCCtrlTnInfoImpl.PAGE_NO, JWCCtrlTnInfo.PAGE_NO);
			//最大取得件数 
			put(JWCCtrlTnInfoImpl.MAX_STKU_CNT,JWCCtrlTnInfo.MAX_STKU_CNT);
			//仮鍵開年月日
			put(JWCCtrlTnInfoImpl.KR_KEY_STA_YMD, JWCCtrlTnInfo.KR_KEY_STA_YMD);
			//制御エリアコード
			put(JWCCtrlTnInfoImpl.CTL_AREA_CD, JWCCtrlTnInfo.CTL_AREA_CD);
			//STBメーカ固有制御機種コード
			put(JWCCtrlTnInfoImpl.STB_MAKER_KOYU_CTL_MDL_CD, JWCCtrlTnInfo.STB_MAKER_KOYU_CTL_MDL_CD);
			//メーカ機器型番(STB)
			put(JWCCtrlTnInfoImpl.STB_MAKER_KK_MDL_NO, JWCCtrlTnInfo.STB_MAKER_KK_MDL_NO);
			//宅内機器型式名(STB)
			put(JWCCtrlTnInfoImpl.STB_MDL_NM, JWCCtrlTnInfo.STB_MDL_NM);
			//宅内機器型式コード(C-CAS)
			put(JWCCtrlTnInfoImpl.CCAS_TK_MDL_CD, JWCCtrlTnInfo.CCAS_TK_MDL_CD);
			//機器製造番号(C-CAS)
			put(JWCCtrlTnInfoImpl.CCAS_KK_SEIZO_NO, JWCCtrlTnInfo.CCAS_KK_SEIZO_NO);
			//C-CASカードステータスコード(C-CAS)
			put(JWCCtrlTnInfoImpl.CCAS_CARD_STAT_CD, JWCCtrlTnInfo.CCAS_CARD_STAT_CD);
			//CASカード種別コード(C-CAS)
			put(JWCCtrlTnInfoImpl.CCAS_CAS_CARD_SBT_CD, JWCCtrlTnInfo.CCAS_CAS_CARD_SBT_CD);
			//宅内機器型式コード(B-CAS)
			put(JWCCtrlTnInfoImpl.BCAS_TK_MDL_CD, JWCCtrlTnInfo.BCAS_TK_MDL_CD);
			//機器製造番号(B-CAS)
			put(JWCCtrlTnInfoImpl.BCAS_KK_SEIZO_NO, JWCCtrlTnInfo.BCAS_KK_SEIZO_NO);
			//CASカード種別コード(B-CAS)
			put(JWCCtrlTnInfoImpl.BCAS_CAS_CARD_SBT_CD, JWCCtrlTnInfo.BCAS_CAS_CARD_SBT_CD);
			//宅内機器STBT更新日付
			put(JWCCtrlTnInfoImpl.STB_UPD_DTTM, JWCCtrlTnInfo.STB_UPD_DTTM);
			//宅内機器CAST(C-CAS)更新日付
			put(JWCCtrlTnInfoImpl.C_CAS_UPD_DTTM, JWCCtrlTnInfo.C_CAS_UPD_DTTM);
			//宅内機器CAST(C-CAS)更新日付
			put(JWCCtrlTnInfoImpl.CCAS_CAST_UPD_DTTM, JWCCtrlTnInfo.CCAS_CAST_UPD_DTTM);
			//宅内機器CAST(B-CAS)更新日付
			put(JWCCtrlTnInfoImpl.BCAS_CAST_UPD_DTTM, JWCCtrlTnInfo.BCAS_CAST_UPD_DTTM);
			// operatorId
			put(JWCCtrlTnInfoImpl.OPERATORID, JWCCtrlTnInfo.OPERATORID);
			// operatorDateTime
			put(JWCCtrlTnInfoImpl.OPERATEDATETIME, JWCCtrlTnInfo.OPERATEDATETIME);
		}
	};

	/**
	 * データ定義、XML要素変換テーブル（戻り電文）
	 */
	private static HashMap<String, String> mapToElement = new HashMap<String, String>() 
	{
		{
//			//宅内機器型式コード(STB)
//			put(JWCCtrlTnInfoImpl.STB_TK_MDL_CD, JWCCtrlTnInfo.STB_TK_MDL_CD);
//			//機器製造番号(STB)
//			put(JWCCtrlTnInfoImpl.STB_KK_SEIZO_NO, JWCCtrlTnInfo.STB_KK_SEIZO_NO);
//			//STBID
//			put(JWCCtrlTnInfoImpl.STBID, JWCCtrlTnInfo.STBID);
//			//STBステータスコード
//			put(JWCCtrlTnInfoImpl.STB_STAT_CD, JWCCtrlTnInfo.STB_STAT_CD);
//			//STB内蔵CASコード
//			put(JWCCtrlTnInfoImpl.STB_NAIZOCAS_CD, JWCCtrlTnInfo.STB_NAIZOCAS_CD);
//			//STB松下用グループID1
//			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID1, JWCCtrlTnInfo.STB_MATSU_YO_GRPID1);
//			//STB松下用グループID2
//			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID2, JWCCtrlTnInfo.STB_MATSU_YO_GRPID2);
//			//STB松下用グループID3
//			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID3, JWCCtrlTnInfo.STB_MATSU_YO_GRPID3);
//			//STB松下用グループID4
//			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID4, JWCCtrlTnInfo.STB_MATSU_YO_GRPID4);
//			//STB松下用グループID5
//			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID5, JWCCtrlTnInfo.STB_MATSU_YO_GRPID5);
//			//STB松下用グループID6
//			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID6, JWCCtrlTnInfo.STB_MATSU_YO_GRPID6);
//			//仮鍵開年月日
//			put(JWCCtrlTnInfoImpl.KR_KEY_STA_YMD, JWCCtrlTnInfo.KR_KEY_STA_YMD);
//			//制御エリアコード
//			put(JWCCtrlTnInfoImpl.CTL_AREA_CD, JWCCtrlTnInfo.CTL_AREA_CD);
//			//STBメーカ固有制御機種コード
//			put(JWCCtrlTnInfoImpl.STB_MAKER_KOYU_CTL_MDL_CD, JWCCtrlTnInfo.STB_MAKER_KOYU_CTL_MDL_CD);
//			//メーカ機器型番(STB)
//			put(JWCCtrlTnInfoImpl.STB_MAKER_KK_MDL_NO, JWCCtrlTnInfo.STB_MAKER_KK_MDL_NO);
//			//宅内機器型式名(STB)
//			put(JWCCtrlTnInfoImpl.STB_MDL_NM, JWCCtrlTnInfo.STB_MDL_NM);
//			//宅内機器型式コード(C-CAS)
//			put(JWCCtrlTnInfoImpl.CCAS_TK_MDL_CD, JWCCtrlTnInfo.CCAS_TK_MDL_CD);
//			//機器製造番号(C-CAS)
//			put(JWCCtrlTnInfoImpl.CCAS_KK_SEIZO_NO, JWCCtrlTnInfo.CCAS_KK_SEIZO_NO);
//			//C-CASカードステータスコード(C-CAS)
//			put(JWCCtrlTnInfoImpl.CCAS_CARD_STAT_CD, JWCCtrlTnInfo.CCAS_CARD_STAT_CD);
//			//CASカード種別コード(C-CAS)
//			put(JWCCtrlTnInfoImpl.CCAS_CAS_CARD_SBT_CD, JWCCtrlTnInfo.CCAS_CAS_CARD_SBT_CD);
//			//宅内機器型式コード(B-CAS)
//			put(JWCCtrlTnInfoImpl.BCAS_TK_MDL_CD, JWCCtrlTnInfo.BCAS_TK_MDL_CD);
//			//機器製造番号(B-CAS)
//			put(JWCCtrlTnInfoImpl.BCAS_KK_SEIZO_NO, JWCCtrlTnInfo.BCAS_KK_SEIZO_NO);
//			//CASカード種別コード(B-CAS)
//			put(JWCCtrlTnInfoImpl.BCAS_CAS_CARD_SBT_CD, JWCCtrlTnInfo.BCAS_CAS_CARD_SBT_CD);
//			//宅内機器STBT更新日付
//			put(JWCCtrlTnInfoImpl.STB_UPD_DTTM, JWCCtrlTnInfo.STB_UPD_DTTM);
//			//宅内機器CAST(C-CAS)更新日付
//			put(JWCCtrlTnInfoImpl.CCAS_CAST_UPD_DTTM, JWCCtrlTnInfo.CCAS_CAST_UPD_DTTM);
//			//宅内機器CAST(B-CAS)更新日付
//			put(JWCCtrlTnInfoImpl.BCAS_CAST_UPD_DTTM, JWCCtrlTnInfo.BCAS_CAST_UPD_DTTM);
//			// operatorId
//			put(JWCCtrlTnInfoImpl.OPERATORID, JWCCtrlTnInfo.OPERATORID);
//			// operatorDateTime
//			put(JWCCtrlTnInfoImpl.OPERATEDATETIME, JWCCtrlTnInfo.OPERATEDATETIME);
			//宅内機器型式コード(STB)
			put(JWCCtrlTnInfoImpl.STB_TK_MDL_CD, "stb_tk_mdl_cd");
			//機器製造番号(STB)
			put(JWCCtrlTnInfoImpl.KK_SEIZO_NO, "stb_kk_seizo_no");
			//STBID
			put(JWCCtrlTnInfoImpl.STBID, "stbid");
			//STBステータスコード
			put(JWCCtrlTnInfoImpl.STB_STAT_CD, "stb_stat_cd");
			//STB内蔵CASコード
			put(JWCCtrlTnInfoImpl.STB_NAIZOCAS_CD, "stb_naizocas_cd");
			//STB松下用グループID1
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID1, "stb_matsu_yo_grpid1");
			//STB松下用グループID2
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID2, "stb_matsu_yo_grpid2");
			//STB松下用グループID3
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID3, "stb_matsu_yo_grpid3");
			//STB松下用グループID4
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID4, "stb_matsu_yo_grpid4");
			//STB松下用グループID5
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID5, "stb_matsu_yo_grpid5");
			//STB松下用グループID6
			put(JWCCtrlTnInfoImpl.STB_MATSU_YO_GRPID6, "stb_matsu_yo_grpid6");
			//仮鍵開年月日
			put(JWCCtrlTnInfoImpl.KR_KEY_STA_YMD, "kr_key_sta_ymd");
			//制御エリアコード
			put(JWCCtrlTnInfoImpl.CTL_AREA_CD, "ctl_area_cd");
			//STBメーカ固有制御機種コード
			put(JWCCtrlTnInfoImpl.STB_MAKER_KOYU_CTL_MDL_CD, "stb_maker_koyu_ctl_mdl_cd");
			//メーカ機器型番(STB)
			put(JWCCtrlTnInfoImpl.STB_MAKER_KK_MDL_NO, "stb_maker_kk_mdl_no");
			//宅内機器型式名(STB)
			put(JWCCtrlTnInfoImpl.STB_MDL_NM, "stb_mdl_nm");
			//宅内機器型式名(STB)
			put(JWCCtrlTnInfoImpl.CCAS_MDL_NM, "stb_mdl_nm");
			//宅内機器型式コード(C-CAS)
			put(JWCCtrlTnInfoImpl.CCAS_TK_MDL_CD, "ccas_tk_mdl_cd");
			//機器製造番号(C-CAS)
			put(JWCCtrlTnInfoImpl.CCAS_KK_SEIZO_NO, "ccas_kk_seizo_no");
			//C-CASカードステータスコード(C-CAS)
			put(JWCCtrlTnInfoImpl.CCAS_CARD_STAT_CD, "ccas_card_stat_cd");
			//CASカード種別コード(C-CAS)
			put(JWCCtrlTnInfoImpl.CCAS_CAS_CARD_SBT_CD, "ccas_cas_card_sbt_cd");
			//CASカード種別コード(C-CAS)
			put(JWCCtrlTnInfoImpl.CAS_CARD_SBT_CD, "cas_card_sbt_cd");
			//宅内機器型式コード(B-CAS)
			put(JWCCtrlTnInfoImpl.BCAS_TK_MDL_CD, "bcas_tk_mdl_cd");
			//機器製造番号(B-CAS)
			put(JWCCtrlTnInfoImpl.BCAS_KK_SEIZO_NO, "bcas_kk_seizo_no");
			//CASカード種別コード(B-CAS)
			put(JWCCtrlTnInfoImpl.BCAS_CAS_CARD_SBT_CD, "bcas_cas_card_sbt_cd");
			//宅内機器STBT更新日付
			put(JWCCtrlTnInfoImpl.STB_UPD_DTTM, "stb_upd_dttm");
			//宅内機器CAST(C-CAS)更新日付
			put(JWCCtrlTnInfoImpl.CCAS_CAST_UPD_DTTM, "ccas_cast_upd_dttm");
			//宅内機器CAST(C-CAS)更新日付
			put(JWCCtrlTnInfoImpl.CAST_UPD_DTTM, "cas_upd_dttm");
			//宅内機器CAST(B-CAS)更新日付
			put(JWCCtrlTnInfoImpl.BCAS_CAST_UPD_DTTM, "bcas_cast_upd_dttm");
			//全件数
			put(JWCCtrlTnInfoImpl.TTL_NUM, "ttl_num");
			//表示件数
			put(JWCCtrlTnInfoImpl.DSP_NUM, "dsp_num");
			//ページ数
			put(JWCCtrlTnInfoImpl.PAGE_NO, "page_no");
			//最大取得件数 
			put(JWCCtrlTnInfoImpl.MAX_STKU_CNT,"max_stku_cnt");
			// operatorId
			put(JWCCtrlTnInfoImpl.OPERATORID, JWCCtrlTnInfo.OPERATORID);
			// operatorDateTime
			put(JWCCtrlTnInfoImpl.OPERATEDATETIME, JWCCtrlTnInfo.OPERATEDATETIME);
			//上位機器製造番号
			put(JWCCtrlTnInfoImpl.JOI_KK_SEIZO_NO, "joi_kk_seizo_no");
			//上位機器型式
			put(JWCCtrlTnInfoImpl.JOI_TK_MDL_CD, "joi_tk_mdl_cd");
		}
	};
	

	/**
	 * SOAP電文送信処理を実行する。
	 * 
	 * @param serviceMap 視聴制御オーダ送信のインターフェイス情報
	 * @param resultFlg コマンド結果発行処理電文有無 true:コマンド結果発行処理 false：視聴制御コマンド実行処理
	 * @return 処理結果コード値　0：正常　1:異常
	 */
	private Hashtable<Object, Object>  execute(Map<Object, Object>serviceMap,String kbn) 
	{
		trace_kbn = kbn;
		Hashtable<Object, Object> result = new Hashtable<Object, Object>();
		HttpURLConnection connection = null;
		InputStream is = null;
		InetAddress inetaddress = null;
		String responseContentType = null;
		OutputStream os = null;
		try
		{
			URL url = null;
			
			
			String urlString = (String)JCCModelCommon.getApplicationConst(JWCStrConst.TN_URL);

			// URLをプロパティファイルから取得
			if(serviceMap.containsKey(JWCStrConst.CMD_URL)) {
				urlString = (String)serviceMap.get(JWCStrConst.CMD_URL);
			}

			//テスト用修正
//			urlString = urlString + "result.xml";
			if(trace_kbn.equals(TRACE_KBN_WCA0001))
			{
				urlString = urlString + ENDPOINT_WCA0001;
			}
			else if(trace_kbn.equals(TRACE_KBN_WCA0002))
			{
				urlString = urlString + ENDPOINT_WCA0002;
			}
			else if(trace_kbn.equals(TRACE_KBN_WCA0003))
			{
				urlString = urlString + ENDPOINT_WCA0003;
			}
			else if(trace_kbn.equals(TRACE_KBN_WCA0004))
			{
				urlString = urlString + ENDPOINT_WCA0004;
			}

			
			url = new URL(urlString);
			// 電文を送信
			connection = (HttpURLConnection)url.openConnection();
			connection.setDoInput(true);
			connection.setDoOutput(true);
			
			// 宅内機器管理システムとのSOAP通信におけるTIMEOUT設定
			Integer tk_Timeout =(Integer.parseInt(JCCModelCommon.getApplicationConst(JWCStrConst.TN_TIMEOUT)));
			connection.setReadTimeout(tk_Timeout);
			
			connection.setRequestMethod(JWCCtrlTnInfoImpl.HTTP_REQUEST_METHOD);
			connection.setRequestProperty(JWCCtrlTnInfoImpl.CONTENT_TYPE, JWCCtrlTnInfoImpl.CONTENT_TYPE_VALUE);
			
			os = connection.getOutputStream();
			
			this.write(serviceMap, os);
			
			connection.connect();
			
			inetaddress =  InetAddress.getLocalHost();

			// 電文の戻りを取得
			is = connection.getInputStream();

			responseContentType = connection.getHeaderField("Content-Type");
				
			result = this.read(inetaddress.getHostName(), inetaddress.getHostAddress(), responseContentType, is);
			
			return result;
		}
		catch(XMLStreamException e) 
		{
			result.put(JWCStrConst.CMD_RESULT_CD,"1");
			result.put(JWCStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());	
			return result;
		}
		catch(MalformedURLException e) 
		{
			result.put(JWCStrConst.CMD_RESULT_CD,"1");
			result.put(JWCStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());	
			return result;
		}
		catch (IOException e) 
		{
			
			result.put(JWCStrConst.CMD_RESULT_CD,"1");
			if(connection != null && inetaddress != null)
			{
				is = connection.getErrorStream();
				responseContentType = connection.getHeaderField("Content-Type");
				try 
				{
					if(is != null)
					{
						String msg = connection.getResponseMessage();
						result = this.read(inetaddress.getHostName(), inetaddress.getHostAddress(), responseContentType, is);
					}
					else 
					{
						result.put(JWCStrConst.CMD_RESULT_CD,"1");
						result.put(JWCStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());
					}
				}
				catch(Exception ex) 
				{
					result.put(JWCStrConst.CMD_RESULT_CD,"1");
					result.put(JWCStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + ex.getMessage());	
					return result;
				}
			}
			if(result != null && result.get(JWCStrConst.CMD_ERROR_MESSAGE) != null )
			{
				result.put(JWCStrConst.CMD_RESULT_CD,"1");
			}
			else 
			{
				result.put(JWCStrConst.CMD_RESULT_CD,"1");
				result.put(JWCStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());	
			}
			return result;
		}
		catch (ParserConfigurationException e) 
		{
			result.put(JWCStrConst.CMD_RESULT_CD,"1");
			result.put(JWCStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());	
			return result;
		}
		catch (SAXException e) 
		{
			result.put(JWCStrConst.CMD_RESULT_CD,"1");
			result.put(JWCStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());	
			return result;
		}
		catch(Exception e) 
		{
			result.put(JWCStrConst.CMD_RESULT_CD,"1");
			result.put(JWCStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());	
			return result;
			
		}
		finally
		{
			if(os != null)
			{
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(is != null)
			{
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	
	}

	
	/**
	 * 電文送信初期処理
	 * @param wt Writerオブジェクト
	 */
	private void init(Writer wt) 
	throws FactoryConfigurationError,XMLStreamException
	{
		this.wt = wt;
		
		XMLOutputFactory outfactory = XMLOutputFactory.newInstance();
		this.writer = outfactory.createXMLStreamWriter(this.sw);
		this.writer.setPrefix(SOAP_PREFIX, SOAP12);
			
	}
	/**
	 * クローズ処理
	 */
	private void close()
	throws XMLStreamException,IOException
	{
		
		writer.flush();
		writer.close();

		String xml = sw.toString();
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), xml);
		
		// 最後に全部出す。
		this.wt.write(xml);
	}
	
	
	/**
	 * XML属性書き込み処理
	 * 
	 * @param name 属性名
	 * @param value　値
	 * @throws XMLStreamException
	 */
	private void writeAttribute(String name, String value) 
	throws XMLStreamException
	{
		this.writer.writeAttribute(name, value);
	}

	
	/**
	 * XML名前空間書き込み処理
	 * 
	 * @param prefix Prefix
	 * @param uri 名前空間URL
	 * @throws XMLStreamException
	 */
	private void writeNamespace(String prefix, String uri) 
	throws XMLStreamException
	{
		this.writer.writeNamespace(prefix, uri);
	}

	/**
	 * XMLドキュメント開始タグ出力処理
	 * 
	 * @param encoding
	 * @throws XMLStreamException
	 */
	private void writeStartDocument(String encoding) 
	throws XMLStreamException
	{
		this.writer.writeStartDocument(encoding, "1.0");
	}
	
	/**
	 * XMLドキュメント終了タグ出力処理
	 * @throws XMLStreamException
	 * 
	 */
	private void writeEndDocument() 
	throws XMLStreamException
	{
		this.writer.writeEndDocument();
	}

	/**
	 * XML要素開始タグ出力処理
	 * 
	 * @param name
	 * @throws XMLStreamException
	 */
	private void writeStartElement(String name) 
	throws XMLStreamException
	{
		this.writer.writeStartElement(JWCCtrlTnInfoImpl.BODY_NAMESPACE , name);
	}

	/**
	 * XMLSoap要素開始タグ出力処理
	 * 
	 * @param name
	 * @throws XMLStreamException
	 */
	private void writeStartSOAPElement(String name) 
	throws XMLStreamException
	{
		this.writer.writeStartElement(SOAP_PREFIX, name, SOAP12);
	}
	

	/**
	 * XMLBody要素開始タグ出力処理
	 * 
	 * @param prefix
	 * @param name
	 * @param namespace
	 * @throws XMLStreamException
	 */
	private void writeStartBodyElement(String prefix, String name, String namespace) 
	throws XMLStreamException
	{
		this.writer.writeStartElement(prefix, name, namespace);
	}
	
	/**
	 * XML要素終了タグ出力処理
	 * 
	 * @param name
	 * @throws XMLStreamException
	 */
	private void writeEndElement(String name) 
	throws XMLStreamException
	{
		this.writer.writeEndElement();
	}

	/**
	 * XML要素終了タグ出力処理
	 * 
	 * @param name
	 * @throws XMLStreamException
	 */
	private void writeEndSOAPElement(String name) 
	throws XMLStreamException
	{
		this.writer.writeEndElement();
	}
	
	/**
	 * XMLデータ出力処理
	 * 
	 * @param str
	 * @throws XMLStreamException
	 */
	private void writeCharacters(String str) 
	throws XMLStreamException
	{
		if(str == null)
		{
			this.writer.writeCharacters("");
		}
		else
		{
			this.writer.writeCharacters(str);
		}
	}
	
	
	/**
	 * XML nullタグ出力処理
	 * 
	 * @param prefix
	 * @param name
	 * @param namespace
	 * @throws XMLStreamException
	 */
	private void writeEmptyElement(String prefix, String name, String namespace) 
	throws XMLStreamException
	{
		this.writer.writeEmptyElement(prefix, name, namespace);
	}

	/**
	 * XML出力処理
	 * 
	 * @param userData
	 * @param osw
	 * @throws XMLStreamException
	 */
	private int writeXML(Map<Object, Object> userData,OutputStreamWriter osw) 
	throws XMLStreamException,IOException
	{
		
		int result = 0;
		this.init(osw);

		this.writeStartDocument("UTF-8");
		this.writeStartSOAPElement("Envelope");
		this.writeNamespace(SOAP_PREFIX, SOAP12);

		result = this.writeUserData(userData);

		this.writeEndSOAPElement("Envelope");
		this.writeEndDocument();

		this.close();
		
		return result;
	}

	/**
	 * 書き込み
	 * 
	 * @param userData
	 * @param os
	 * @throws IOException
	 * @throws XMLStreamException
	 */
	public int write(Map<Object, Object> userData,OutputStream os) 
	throws IOException,XMLStreamException
	{
		OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
		try 
		{
				
			// 本文
			int result = this.writeXML(userData,osw);
			osw.write(JWCCtrlTnInfoImpl.CRLF);
			
			return result;
		}
		finally 
		{
			if(osw != null) {
				osw.flush();
				osw.close();
			}
			if(os != null) {
				os.flush();
				os.close();
			}

		}
			
	}
	

	/**
	 * Header 書き込み処理
	 * 
	 * @param userData ユーザーデータ
	 * @return int 0 正常終了
	 *              1 異常終了
	 * @throws XMLStreamException
	 */
	private int writeHeader(Map<Object, Object> userData)
	throws XMLStreamException
	{
		int result = 0;
		
		String wca000x_ifnm = null;
		// 外部IF-IDの設定　
		if(trace_kbn.equals(TRACE_KBN_WCA0001))
		{
			wca000x_ifnm = WCA0001_IFID;
		}
		else if(trace_kbn.equals(TRACE_KBN_WCA0002))
		{
			wca000x_ifnm = WCA0002_IFID;
		}
		else if(trace_kbn.equals(TRACE_KBN_WCA0003))
		{
			wca000x_ifnm = WCA0003_IFID;
		}
		else if(trace_kbn.equals(TRACE_KBN_WCA0004))
		{
			wca000x_ifnm = WCA0004_IFID;
		}
		else
		{
			wca000x_ifnm = WCA0000_IFID;
		}

		this.writeStartSOAPElement("Header");

		// リクエストＩＤ(外部ＩＦＩＤ＋年月日時分秒）
		this.writeStartElement("requestID");
		this.writeCharacters(wca000x_ifnm +"_reqId" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));
		this.writeEndElement("requestID");
	
		// サービスＩＤ
		this.writeStartElement("serviceID");
		this.writeCharacters("WCSV0056");
		this.writeEndElement("serviceID");

		// 依頼元区分
		this.writeStartElement("channel");
		this.writeCharacters("3");
		this.writeEndElement("channel");

		// ViewID
		this.writeStartElement("viewID");
		this.writeCharacters("CLA1");
		this.writeEndElement("viewID");

		// ipAdress
		this.writeStartElement("ipAddress");
		this.writeEndElement("ipAddress");
		
		// オペレータＩＤ
		if(userData.containsKey(JWCCtrlTnInfo.OPERATORID)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.OPERATORID));
			this.writeCharacters(convString(userData.get(JWCCtrlTnInfo.OPERATORID)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.OPERATORID));
		}

		// operateDateTime
		if(userData.containsKey(JWCCtrlTnInfo.OPERATEDATETIME)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.OPERATEDATETIME));
			this.writeCharacters(convString(userData.get(JWCCtrlTnInfo.OPERATEDATETIME)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.OPERATEDATETIME));
		}

		
		this.writeEndSOAPElement("Header");
		
		return result;
		
	}

	/**
	 * ユーザデータ部分のメッセージ生成
	 * @param writer
	 * @param userData
	 * @throws XMLStreamException
	 */
	private int writeUserData(Map<Object, Object> userData) 
	throws XMLStreamException
	{
		int result = 0;

		this.writeHeader(userData);

		this.writeStartSOAPElement("Body");
		
		result = this.trace(userData);
		
		this.writeEndSOAPElement("Body");
		
		return result;
		
	}
	
	/**
	 * UserData内をトレースする。
	 * @param writer
	 * @param map
	 * @param serviceIfFlag
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private int trace(Map<Object, Object> map) 
	throws XMLStreamException
	{
		if(trace_kbn.equals(TRACE_KBN_WCA0001))
		{
			this.traceWCA0001(map);
		}
		else if(trace_kbn.equals(TRACE_KBN_WCA0002))
		{
			this.traceWCA0002(map);
		}
		else if(trace_kbn.equals(TRACE_KBN_WCA0003))
		{
			this.traceWCA0003(map);
		}
		else if(trace_kbn.equals(TRACE_KBN_WCA0004))
		{
			this.traceWCA0004(map);
		}
		else
		{
			return -1;
		}
		
		return 0;
	}

	/**
	 *  オブジェクトを文字列に変換します。
	 *  
	 * @param obj 変換するオブジェクト
	 * @return 変換された文字列
	 */
	private String convString(Object obj)
	{
		if (obj == null) 
		{
			return "";
		}
		else if (obj instanceof Integer) 
		{
			return String.valueOf((Integer)obj);
		}
		else if (obj instanceof Long) 
		{
			return String.valueOf((Long)obj);
		}
		else if (obj instanceof Short) 
		{
			return String.valueOf((Short)obj);
		}
		else if (obj instanceof Double) 
		{
			return String.valueOf((Double)obj);
		}
		else if (obj instanceof Float) 
		{
			return String.valueOf((Float)obj);
		}
		else if (obj instanceof Byte) 
		{
			return String.valueOf((Byte)obj);
		}
		else if (obj instanceof Boolean) 
		{
			return String.valueOf((Boolean)obj);
		}
		else if (obj instanceof String) 
		{
			return (String)obj;
		}
		return obj.toString();
	}

	/**
	 * 項目名からSoapElement名を取得します。
	 * 
	 * @param obj 項目名
	 * @return XMLElement名
	 */
	private String getElementName(String obj) 
	{
		return elementToMap.get(obj);
	}
	
	/**
	 * Soap項目名から項目名を取得します。
	 * 
	 * @param obj　Soap項目名
	 * @return 項目名
	 */
	private String getMapName(String obj) 
	{
		return mapToElement.get(obj);
	}
	

	/**
	 * 宅内機器一覧照会(3)の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceWCA0001(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
//		this.writeStartBodyElement(JWCCtrlTnInfoImpl.BODY_PREFIX, new String(), JWCCtrlTnInfoImpl.BODY_NAMESPACE);		
//		this.writeNamespace(JWCCtrlTnInfoImpl.BODY_PREFIX, JWCCtrlTnInfoImpl.BODY_NAMESPACE);
		this.writer.setPrefix(JWCCtrlTnInfoImpl.BODY_PREFIX, JWCCtrlTnInfoImpl.BODY_NAMESPACE);

		this.writeStartElement("condition");
		//宅内機器型式コード
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_TK_MDL_CD)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_TK_MDL_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_TK_MDL_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_TK_MDL_CD));
		}
		//機器製造番号
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_KK_SEIZO_NO)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_KK_SEIZO_NO));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_KK_SEIZO_NO)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_KK_SEIZO_NO));
		}
		//ＳＴＢＩＤ
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STBID)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STBID));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STBID)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STBID));
		}
		//宅内機器種別コード
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_TK_SBT_CD)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_TK_SBT_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_TK_SBT_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_TK_SBT_CD));
		}
		
		this.writeEndElement("condition");
		
//		this.writeEndElement(new String());

	}

	/**
	 * 宅内機器一意照会(2)の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceWCA0002(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
//		this.writeStartBodyElement(JWCCtrlTnInfoImpl.BODY_PREFIX, new String(), JWCCtrlTnInfoImpl.BODY_NAMESPACE);
//		this.writeNamespace(JWCCtrlTnInfoImpl.BODY_PREFIX, JWCCtrlTnInfoImpl.BODY_NAMESPACE);
		this.writer.setPrefix(JWCCtrlTnInfoImpl.BODY_PREFIX, JWCCtrlTnInfoImpl.BODY_NAMESPACE);

		this.writeStartElement("condition");
		//宅内機器型式コード
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_TK_MDL_CD)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_TK_MDL_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_TK_MDL_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_TK_MDL_CD));
		}
		//機器製造番号
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_KK_SEIZO_NO)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_KK_SEIZO_NO));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_KK_SEIZO_NO)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_KK_SEIZO_NO));
		}
		//ＳＴＢＩＤ
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STBID)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STBID));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STBID)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STBID));
		}
		//宅内機器種別コード
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_TK_SBT_CD)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_TK_SBT_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_TK_SBT_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_TK_SBT_CD));
		}
		
		this.writeEndElement("condition");
//		this.writeEndElement(new String());
	}
	
	/**
	 * STB情報更新の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceWCA0003(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{

//		this.writeStartBodyElement(JWCCtrlTnInfoImpl.BODY_PREFIX, new String(), JWCCtrlTnInfoImpl.BODY_NAMESPACE);
//		this.writeNamespace(JWCCtrlTnInfoImpl.BODY_PREFIX, JWCCtrlTnInfoImpl.BODY_NAMESPACE);
		this.writer.setPrefix(JWCCtrlTnInfoImpl.BODY_PREFIX, JWCCtrlTnInfoImpl.BODY_NAMESPACE);

		this.writeStartElement("condition");
		//宅内機器型式コード
		if(serviceMap.containsKey(JWCCtrlTnInfo.TK_MDL_CD)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.TK_MDL_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.TK_MDL_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.TK_MDL_CD));
		}
		//機器製造番号
		if(serviceMap.containsKey(JWCCtrlTnInfo.KK_SEIZO_NO)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KK_SEIZO_NO));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KK_SEIZO_NO)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KK_SEIZO_NO));
		}
		//宅内機器種別コード
		if(serviceMap.containsKey(JWCCtrlTnInfo.TK_SBT_CD)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.TK_SBT_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.TK_SBT_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.TK_SBT_CD));
		}
		//宅内機器STBT更新日付
		if(serviceMap.containsKey(JWCCtrlTnInfo.STB_UPD_DTTM)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.STB_UPD_DTTM));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.STB_UPD_DTTM)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.STB_UPD_DTTM));
		}
		//宅内機器CAST更新日時
		if(serviceMap.containsKey(JWCCtrlTnInfo.C_CAS_UPD_DTTM)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.C_CAS_UPD_DTTM));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.C_CAS_UPD_DTTM)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.C_CAS_UPD_DTTM));
		}
		this.writeEndElement("condition");
		this.writeStartElement("update");
		//STBステータスコード
		if(serviceMap.containsKey(JWCCtrlTnInfo.STB_STAT_CD)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.STB_STAT_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.STB_STAT_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.STB_STAT_CD));
		}
		//STB松下用グループID1
		if(serviceMap.containsKey(JWCCtrlTnInfo.STB_MATSU_YO_GRPID1)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID1));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.STB_MATSU_YO_GRPID1)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID1));
		}
		//STB松下用グループID2
		if(serviceMap.containsKey(JWCCtrlTnInfo.STB_MATSU_YO_GRPID2)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID2));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.STB_MATSU_YO_GRPID2)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID2));
		}
		//STB松下用グループID3
		if(serviceMap.containsKey(JWCCtrlTnInfo.STB_MATSU_YO_GRPID3)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID3));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.STB_MATSU_YO_GRPID3)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID3));
		}
		//STB松下用グループID4
		if(serviceMap.containsKey(JWCCtrlTnInfo.STB_MATSU_YO_GRPID4)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID4));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.STB_MATSU_YO_GRPID4)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID4));
		}
		//STB松下用グループID5
		if(serviceMap.containsKey(JWCCtrlTnInfo.STB_MATSU_YO_GRPID5)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID5));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.STB_MATSU_YO_GRPID5)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID5));
		}
		//STB松下用グループID6
		if(serviceMap.containsKey(JWCCtrlTnInfo.STB_MATSU_YO_GRPID6)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID6));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.STB_MATSU_YO_GRPID6)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.STB_MATSU_YO_GRPID6));
		}
		//制御エリアコード
		if(serviceMap.containsKey(JWCCtrlTnInfo.CTL_AREA_CD)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.CTL_AREA_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.CTL_AREA_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.CTL_AREA_CD));
		}
		//C-CASカードステータスコード
		if(serviceMap.containsKey(JWCCtrlTnInfo.CCAS_CARD_STAT_CD)) 
		{	
			this.writeStartElement(getElementName(JWCCtrlTnInfo.CCAS_CARD_STAT_CD));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.CCAS_CARD_STAT_CD)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.CCAS_CARD_STAT_CD));
		}
		this.writeEndElement("update");
		
		
//		this.writeEndElement(new String());
				
	}
	/**
	 * 宅内機器一覧照会(4)の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceWCA0004(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
//		this.writeStartBodyElement(JWCCtrlTnInfoImpl.BODY_PREFIX, new String(), JWCCtrlTnInfoImpl.BODY_NAMESPACE);
//		this.writeNamespace(JWCCtrlTnInfoImpl.BODY_PREFIX, JWCCtrlTnInfoImpl.BODY_NAMESPACE);
		this.writer.setPrefix(JWCCtrlTnInfoImpl.BODY_PREFIX, JWCCtrlTnInfoImpl.BODY_NAMESPACE);


		this.writeStartElement("condition");
		//STB松下用グループID1
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID1)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID1));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID1)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID1));
		}
		//STB松下用グループID2
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID2)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID2));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID2)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID2));
		}
		//STB松下用グループID3
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID3)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID3));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID3)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID3));
		}
		//STB松下用グループID4
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID4)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID4));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID4)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID4));
		}
		//STB松下用グループID5
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID5)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID5));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID5)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID5));
		}
		//STB松下用グループID6
		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID6)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID6));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID6)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID6));
		}
		//表示件数
		if(serviceMap.containsKey(JWCCtrlTnInfo.DSP_NUM)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.DSP_NUM));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.DSP_NUM)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.DSP_NUM));
		}
		//ページ番号
		if(serviceMap.containsKey(JWCCtrlTnInfo.PAGE_NO)) 
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.PAGE_NO));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.PAGE_NO)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.PAGE_NO));
		}
		//最大取得件数
		if(serviceMap.containsKey(JWCCtrlTnInfo.MAX_STKU_CNT))
		{
			this.writeStartElement(getElementName(JWCCtrlTnInfo.MAX_STKU_CNT));
			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.MAX_STKU_CNT)));
			this.writeEndElement(getElementName(JWCCtrlTnInfo.MAX_STKU_CNT));
		}
//		//総件数
//		if(serviceMap.containsKey(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID1)) 
//		{
//			this.writeStartElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID1));
//			this.writeCharacters(convString(serviceMap.get(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID1)));
//			this.writeEndElement(getElementName(JWCCtrlTnInfo.KEY_STB_MATSU_YO_GRPID1));
//		}
		
		this.writeEndElement("condition");
		
//		this.writeEndElement(new String());
	}

	/**
	 * Int型配列の要素を設定する。
	 * 
	 * @param parent 親要素名
	 * @param key 配列要素名
	 * @param list XML子リスト
	 * @throws XMLStreamException
	 */
	private void traceArrayOfInt(String parent, String key, List<Map<Object, Object>> list)
	throws XMLStreamException
	{
		this.writeStartElement(parent);
		for(Map<Object, Object>map : list){
			if(map.containsKey(key)) {
				this.writeStartElement(getElementName(key));
				if(map.get(key) instanceof String) 
				{
					this.writeCharacters(convString(Integer.parseInt((String)map.get(key))));
				}
				else 
				{
					this.writeCharacters(convString(map.get(key)));
				}
				this.writeEndElement(getElementName(key));
			}
		}
		this.writeEndElement(getElementName(parent));
	}
	
	/**
	 * String型配列の要素を設定する。
	 * 
	 * @param parent 親要素名
	 * @param key 配列要素名
	 * @param list XML子リスト
	 * @throws XMLStreamException
	 */
	private void traceArrayOfString(String parent, String key, List<Map<Object, Object>> list)
	throws XMLStreamException
	{
		this.writeStartElement(parent);
		for(Map<Object, Object>map : list){
			if(map.containsKey(key)) {
				this.writeStartElement(getElementName(key));
				this.writeCharacters(convString(map.get(key)));
				this.writeEndElement(getElementName(key));
			}
		}
		this.writeEndElement(getElementName(parent));
	}

	/**
	 * 配列null時の要素を設定する。
	 * 
	 * @param parent 親要素名
	 * @throws XMLStreamException
	 */
	private void traceArrayOfNull(String parent) 
	throws XMLStreamException
	{
		this.writeEmptyElement(JWCCtrlTnInfoImpl.XSL_PREFIX, parent, JWCCtrlTnInfoImpl.XSL_PREFIX);
		this.writeAttribute("xsl:nil", "true");
		this.writeNamespace(JWCCtrlTnInfoImpl.XSL_PREFIX, JWCCtrlTnInfoImpl.XSL_NAMESPACE);
	}
	
	/**
	 * 電文読み込み処理
	 * 
	 * @param host
	 * @param ip
	 * @param contentType
	 * @param is
	 * @return XML電文解析結果
	 * @throws IOException
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 */
	private Hashtable<Object, Object> read(String host, String ip, String contentType, InputStream is) 
	throws IOException,ParserConfigurationException,SAXException
	{
		String charset = this.getEncoding(contentType);
		StringReader sr = readSingleResource(charset, is);
		Hashtable<Object, Object>result = null;
		
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setNamespaceAware(true);
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		Document doc = db.parse(new InputSource(sr));
		
		Element elem = doc.getDocumentElement();
		
		// XMLの実行結果を取得する。
		result = analyzeXml(elem,true);

		return result;
	}

	/**
	 * 電文読み取り処理（添付ファイルなし）
	 * 
	 * @param charSet
	 * @param is
	 * @return
	 * @throws IOException
	 */
	private StringReader readSingleResource(String charSet, InputStream is) 
	throws IOException
	{

		this.soapMessage = true;

		ByteArrayOutputStream baos = new ByteArrayOutputStream();

		byte[] buf = new byte[1024*8];

		int length = readLine(is, buf, 0, buf.length);

		while(length != -1){
			// ボディ部
			baos.write(buf, 0, length);
			length = readLine(is, buf, 0, buf.length);
		}

		byte[] contents = baos.toByteArray();
		
		String xml = new String(contents, charSet);
		JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), xml);
		
		// コンテントタイプから、encoding指定を得る。
		StringReader reader = new StringReader(new String(contents, charSet));
		
		return reader;
	}
	
	/**
	 * 行データ取得処理
	 * 
	 * @param is InputStream 
	 * @param abyte0 abyte0[]
	 * @param i i
	 * @param j j
	 * @return int 実行結果
	 * @throws IOException
	 */
	private int readLine(InputStream is, byte abyte0[], int i, int j) 
	throws IOException 
	{
		if (j <= 0) 
		{
			return 0;
		}
		int k = 0;
		int l;
		do 
		{
			if((l = is.read()) == -1) 
			{
				break;
			}
			abyte0[i++] = (byte)l;
			k++;
		}
		while(l != 10 && k != j);
		
		return k <= 0 ? -1 : k;
	}

	/**
	 * エンコーディングデータ取得処理
	 * 
	 * @param contentType HTTPContentType文字列
	 * @return エンコーディング
	 */
	private String getEncoding(String contentType)
	{

		if(contentType != null)
		{

			// 半角空白で切って、
			String[] contentTypes = contentType.split(" ");

			// 開始がcharsetで始まるものを探して、
			for(String ct : contentTypes){
				if(ct.startsWith("charset=")){
					ct = ct.trim();
					return ct.substring("charset=".length());
				}
			}
		}

		// 見つけられなかった場合
		return "UTF-8";

	}
	
	/**
	 * コマンド送信戻り電文解析処理
	 * 
	 * @param elem コマンド解析電文rootXML要素
	 * @return XML解析結果
	 */
	private Hashtable<Object, Object> analyzeXml(Node elem,boolean rootflag) 
	{

		Node node = elem.getFirstChild();
		Hashtable<Object, Object> resultMap = null;

		
		ArrayList<Map<Object, Object>>Bodynodelist = new ArrayList<Map<Object, Object>>();
		
		//電文の要素をすべて解析する。
		while(node != null)
		{
			if(node.getNodeType() == Node.ELEMENT_NODE) 
			{
				
				String nodename = node.getLocalName();
				String childname = "";
				NodeList nodelist = node.getChildNodes();
				if(nodelist != null)
				{
					for(int i = 0 ; i < nodelist.getLength() ; i++)
					{
						Node child = nodelist.item(i);

						if(child.getNodeType() == Node.ELEMENT_NODE)
						{
							childname = child.getLocalName();
							break;
						}
					}
				}

				// SOAP例外の場合
				if(JWCCtrlTnInfoImpl.SOAP_FAULT.equals(nodename.toLowerCase()) || JWCCtrlTnInfoImpl.SOAP_FAULT.equals(childname.toLowerCase()))
				{
					resultMap = new Hashtable<Object, Object>();
					String faultinfo = analyzeFaultXml(node);
					resultMap.put(JWCStrConst.CMD_RESULT_CD,"1");
					resultMap.put(JWCStrConst.CMD_ERROR_MESSAGE,faultinfo);	
					return resultMap;
				}
				else
				{
					if(resultMap == null) {
						resultMap = new Hashtable<Object, Object>();
					}

					Hashtable<Object, Object>resultinfo = analyzeResultXml(node);
					resultMap.put(JWCStrConst.CMD_RESULT_CD,"0");

					Node subnode = null;
					
					if(nodename.equals("Body") && childname.equals("TTL_NUM"))
					{
						NodeList subnodelist = node.getChildNodes();

						if(subnodelist != null)
						{
							JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "subnode確定" + subnodelist.getLength());

							for(int i = 0 ; i < subnodelist.getLength() ; i++)
							{
								Node child = subnodelist.item(i);
								

								if(child.getNodeType() == Node.ELEMENT_NODE)
								{
									if("TTL_NUM".equals(child.getNodeName()))
									{
										resultMap.put(child.getNodeName(), child.getTextContent());
									}
									else if("record".equals(child.getNodeName())) {
										subnode = child;
									}
								}
							}
						}

						

						if(subnode != null && subnode.getNodeName().equals("record"))
						{
							JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "recode 繰り返し2" + subnode.getNodeName());

							Hashtable<Object, Object> child = analyzeXml(node,false);
							Enumeration keys = child.keys();
							while(keys.hasMoreElements())
							{
								String key = (String)keys.nextElement();
								resultMap.put(key, child.get(key));
							}
						}
						else
						{
//							JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "recode 繰り返しなし2" + subnode.getNodeName());
							JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "recode 繰り返しなし2" );
							Bodynodelist.add(resultinfo);
							resultMap.put(EWCA0010004CBSMsg.EWCA0010004CBSMSG1LIST,Bodynodelist);
						}
					}
					else if((nodename.equals("Body") && !childname.equals("record")) || 
							nodename.equals("record"))
					{
						JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "recodeの子供解析");
						Bodynodelist.add(resultinfo);
						if(trace_kbn.equals(TRACE_KBN_WCA0001))
						{
							resultMap.put(EWCA0010001CBSMsg.EWCA0010001CBSMSG1LIST,Bodynodelist);
						}
						else if(trace_kbn.equals(TRACE_KBN_WCA0002))
						{
							resultMap.put(EWCA0010002CBSMsg.EWCA0010002CBSMSG1LIST,Bodynodelist);
						}
						else if(trace_kbn.equals(TRACE_KBN_WCA0004))
						{
							resultMap.put(EWCA0010004CBSMsg.EWCA0010004CBSMSG1LIST,Bodynodelist);
						}
						else
						{
							if(node.getFirstChild() != null)
							{
								Hashtable<Object, Object> child = analyzeXml(node,false);
								Enumeration keys = child.keys();
								while(keys.hasMoreElements())
								{
									String key = (String)keys.nextElement();
									resultMap.put(key, child.get(key));
								}
							}
						}
					}
					else if(nodename.equals("Body"))
					{
						JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "BODY");
						Hashtable<Object, Object> child = analyzeXml(node,false);
						Enumeration keys = child.keys();
						while(keys.hasMoreElements())
						{
							String key = (String)keys.nextElement();
							resultMap.put(key, child.get(key));
						}
					}
					else if(nodename.equals("Header"))
					{
						JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "Header");
						Hashtable<Object, Object> child = analyzeXml(node,false);
						Enumeration keys = child.keys();
						while(keys.hasMoreElements())
						{
							String key = (String)keys.nextElement();
							resultMap.put(key, child.get(key));
							JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "Header" + key);
						}
					}
					else if(nodename.equals("condition"))
					{
						Hashtable<Object, Object> child = analyzeXml(node,false);
						Enumeration keys = child.keys();
						while(keys.hasMoreElements())
						{
							String key = (String)keys.nextElement();
							resultMap.put(key, child.get(key));
						}
					}
					else
					{
						resultMap.put(nodename,node.getTextContent());
						
						if(node.getAttributes().getNamedItem("err") != null)
						{
							JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), "エラーチェック" + nodename);
							String StrErr = node.getAttributes().getNamedItem("err").getTextContent();
							int intErr = Integer.parseInt(StrErr.substring(1));
							if(intErr == 1)
							{
								resultMap.put(nodename + "_ERR", "E1");
							}
							else if(intErr <= 52)
							{
								resultMap.put(nodename + "_ERR", "E2");
							}
							else if(intErr <= 99)
							{
								resultMap.put(nodename + "_ERR", "E3");
							}
							else
							{
								resultMap.put(nodename + "_ERR", "EA");
							}
						}
					}
					
				}
			}
				node = node.getNextSibling();
		}
		
		if(rootflag && resultMap == null)
		{
			resultMap = new Hashtable<Object, Object>();
			resultMap.put(JWCStrConst.CMD_RESULT_CD,"0");
			return resultMap;
		}
		
		return resultMap;
	}

	
	/**
	 * XMLFAULT電文解析処理
	 * 
	 * @param elem XMLFAULT電文
	 * @return ArrayListエラー情報
	 */
	private String analyzeFaultXml(Node elem) 
	{
		Node node = elem.getFirstChild();
//		ArrayList<Object> list = new ArrayList<Object>();
		String errmsg = "";
		
		while(node != null) {
			
			if(node.getNodeType() == Node.ELEMENT_NODE) 
			{
				String nodename = node.getLocalName();

				if(JWCCtrlTnInfoImpl.SOAP_FAULT_CODE.equals(nodename.toLowerCase())) {
					
//					list.add(node.getTextContent());
					Node child = node.getFirstChild();
					if(child != null)
					{
						errmsg = errmsg + "エラーコード：" + child.getTextContent();
					}
				}
				if(JWCCtrlTnInfoImpl.SOAP_FAULT_STRING.equals(nodename.toLowerCase())) {
					
//					list.add(node.getTextContent());
					errmsg = errmsg + "エラー詳細：" + node.getTextContent();
				}
			}
			
			node = node.getNextSibling();
		}
		
		return errmsg;
	}

	/**
	 * コマンド結果発行戻り電文解析処理
	 * 
	 * @param elem XMLコマンド発行電文戻りNode
	 * @return コマンド結果発行戻値
	 */
	private Hashtable<Object, Object>analyzeResultXml(Node elem) 
	{
		
		Node node = elem.getFirstChild();
		Hashtable<Object, Object>result = new Hashtable<Object, Object>();
		
		while(node != null) {
			JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), node.getLocalName() + "：" + node.getTextContent());

			if(node.getNodeType() == Node.ELEMENT_NODE) 
			{
				String nodename = node.getLocalName();
				String elementString = this.getMapName(nodename);
				
				if(elementString != null) {
					result.put(elementString,node.getTextContent());
				}
			}
			
			node = node.getNextSibling();
		}
		return result;
	}



	@SuppressWarnings("unchecked")
	@Override
	public Hashtable ctrlTnInfo_WCA0001(Hashtable serviceMap, Connection con) throws Exception
	{

		JWCCtrlTnInfoImpl obj = new JWCCtrlTnInfoImpl();
		Hashtable result = null;
		
		// 電文送信処理の実行
		result = obj.execute(serviceMap, trace_kbn);
		
		return result;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public Hashtable ctrlTnInfo_WCA0002(Hashtable serviceMap, Connection con) throws Exception
	{
		JWCCtrlTnInfoImpl obj = new JWCCtrlTnInfoImpl();
		Hashtable result = null;
		
		// 電文送信処理の実行
		result = obj.execute(serviceMap, trace_kbn);
		
		return result;
	}
	@SuppressWarnings("unchecked")
	@Override
	public Hashtable ctrlTnInfo_WCA0003(Hashtable serviceMap, Connection con) throws Exception
	{
		JWCCtrlTnInfoImpl obj = new JWCCtrlTnInfoImpl();
		Hashtable result = null;
		
		// 電文送信処理の実行
		result = obj.execute(serviceMap, trace_kbn);
		
		return result;
	}
	@SuppressWarnings("unchecked")
	@Override
	public Hashtable ctrlTnInfo_WCA0004(Hashtable serviceMap, Connection con) throws Exception
	{
		JWCCtrlTnInfoImpl obj = new JWCCtrlTnInfoImpl();
		Hashtable result = null;
		
		// 電文送信処理の実行
		result = obj.execute(serviceMap, trace_kbn);
		
		return result;
	}
	
	
	@Override
	public void setConnection(Connection con) {
		// TODO 自動生成されたメソッドスタブ
		this.connection = con;
		
	}

	@Override
	public Hashtable ctrlTnInfo_WCA0001(Hashtable serviceMap) throws Exception {
		trace_kbn = TRACE_KBN_WCA0001;
		return this.ctrlTnInfo_WCA0001(serviceMap,null);
	}

	@Override
	public Hashtable ctrlTnInfo_WCA0002(Hashtable serviceMap) throws Exception {
		trace_kbn = TRACE_KBN_WCA0002;
		return this.ctrlTnInfo_WCA0002(serviceMap,null);
	}

	@Override
	public Hashtable ctrlTnInfo_WCA0003(Hashtable serviceMap) throws Exception {
		trace_kbn = TRACE_KBN_WCA0003;
		return this.ctrlTnInfo_WCA0003(serviceMap,null);
	}

	@Override
	public Hashtable ctrlTnInfo_WCA0004(Hashtable serviceMap) throws Exception {
		trace_kbn = TRACE_KBN_WCA0004;
		return this.ctrlTnInfo_WCA0004(serviceMap,null);
	}
}
