/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JDKCtrlTnInfo
*   ソースファイル名：JDKCtrlTnInfo.java
*   作成者          ：富士通
*   日付            ：2012年02月17日
*＜機能概要＞
*   宅内機器連携（本番向け）コマンド発行部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/02/17   FJ) 富士通  新規作成
*   v7.00.00    2014/03/13   FJ) 富士通  エラー時のSOAPログ出力追加(OM-2014-0000487)
*   v68.00.00   2023/11/22   FJ) 三角    ANK-4463-00-00_【eo定期】サービスサーバリプレース対応_ＳT工程まで
*
**********************************************************************/
package eo.ejb.common;

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.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 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.AgentConstant;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.constant.JDKStrConst;
import eo.ejb.cbs.cbsmsg.EDKA0010001CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010001ConditionList;
import eo.ejb.cbs.cbsmsg.EDKA0010002CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010003CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDKA0010004CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDKA0010004CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EDKA0010005CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010005CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDKA0010005CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EDKA0010006CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010006CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDKA0010006CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EDKA0010007CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010007CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDKA0010008CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010008ConditionList;
import eo.ejb.cbs.cbsmsg.EDKA0010009CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010009ConditionList;
import eo.ejb.cbs.cbsmsg.EDKA0010010CBSMsg;


public class JDKCtrlTnInfoImpl extends JDKCtrlTnInfo {

	private static JDKCtrlTnInfoImpl instance = null;
	private AgentDispatchContext inContext;
	
	private JDKCtrlTnInfoImpl() {
		super();
	}

	public void setInContext(AgentDispatchContext inContext) {
		this.inContext = inContext;
	}
	
	public static JDKCtrlTnInfoImpl getInstance() {
		synchronized (JDKCtrlTnInfoImpl.class) {
			if(instance == null) 
			{
				JDKCtrlTnInfoImpl.instance = new JDKCtrlTnInfoImpl();
			}
		}

		return instance;
	}

	// 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 = "soapenv";
	
	
	// 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";

	/** レコードタグ */
	private static final String RECORD = "record";
	/** コンディションタグ */
	private static final String CONDITION = "condition";
	/** 更新タグ */
	private static final String UPDATE = "update";
	
	private static final int KB = 1024;

	private static final int SOCKET_SEND_SIZE = 10 * KB;
	
	// メッセージ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 = "";

	/**
	 * リクエストＸＭＬ情報
	 */
	private String requestXml = "";

	/**
	 * レスポンスＸＭＬ情報
	 */
	private String responseXml = "";
	
	/**
	 * エラーレベル
	 */
	private String errorLevel = "";

	/**
	 * リターンコード
	 */
	private String returnCode = "";
	
	private static final Map<String, String> URL_SUFIX = new HashMap<String, String>();
	private static final Map<String, String> EO_IFID = new HashMap<String, String>();
	static
	{
//ANK-4463-00-00 MOD START
		//URL_SUFIX.put(TRACE_KBN_DKA0001, "taku_fsekikr0010");
		//URL_SUFIX.put(TRACE_KBN_DKA0002, "taku_fsekikr0120");
		//URL_SUFIX.put(TRACE_KBN_DKA0003, "taku_fsekiku0010");
		//URL_SUFIX.put(TRACE_KBN_DKA0004, "taku_fsekiku0090");
		//URL_SUFIX.put(TRACE_KBN_DKA0005, "taku_fsekiku0100");
		//URL_SUFIX.put(TRACE_KBN_DKA0006, "taku_fsekiku0110");
		//URL_SUFIX.put(TRACE_KBN_DKA0007, "taku_fsekiku0120");
		//URL_SUFIX.put(TRACE_KBN_DKA0008, "taku_fsekikr0130");
		//URL_SUFIX.put(TRACE_KBN_DKA0009, "taku_fsekikr0140");
		URL_SUFIX.put(TRACE_KBN_DKA0001, "FSEKIKR0010");
		URL_SUFIX.put(TRACE_KBN_DKA0002, "FSEKIKR0120");
		URL_SUFIX.put(TRACE_KBN_DKA0003, "FSEKIKU0010");
		URL_SUFIX.put(TRACE_KBN_DKA0004, "FSEKIKU0090");
		URL_SUFIX.put(TRACE_KBN_DKA0005, "FSEKIKU0100");
		URL_SUFIX.put(TRACE_KBN_DKA0006, "FSEKIKU0110");
		URL_SUFIX.put(TRACE_KBN_DKA0007, "FSEKIKU0120");
		URL_SUFIX.put(TRACE_KBN_DKA0008, "FSEKIKR0130");
		URL_SUFIX.put(TRACE_KBN_DKA0009, "FSEKIKR0140");
//ANK-4463-00-00 MOD END

		EO_IFID.put(TRACE_KBN_DKA0001, "DKIFE017");
		EO_IFID.put(TRACE_KBN_DKA0002, "DKIFE018");
		EO_IFID.put(TRACE_KBN_DKA0003, "DKIFE019");
		EO_IFID.put(TRACE_KBN_DKA0004, "DKIFE020");
		EO_IFID.put(TRACE_KBN_DKA0005, "DKIFE021");
		EO_IFID.put(TRACE_KBN_DKA0006, "DKIFE022");
		EO_IFID.put(TRACE_KBN_DKA0007, "DKIFE023");
		EO_IFID.put(TRACE_KBN_DKA0008, "DKIFE024");
		EO_IFID.put(TRACE_KBN_DKA0009, "DKIFE025");
	}
	
	/**
	 * SOAP電文送信処理を実行する。
	 * 
	 * @param serviceMap 視聴制御オーダ送信のインターフェイス情報
	 * @param resultFlg コマンド結果発行処理電文有無 true:コマンド結果発行処理 false：視聴制御コマンド実行処理
	 * @return 処理結果コード値　0：正常　1:異常
	 */
	private Hashtable<Object, Object>  execute(Map<Object, Object>serviceMap,String kbn) 
	{
		// リクエストとレスポンスの情報を初期化
		requestXml = "";
		responseXml = "";
		
		trace_kbn = kbn;
		Hashtable<Object, Object> result = new Hashtable<Object, Object>();
		HttpURLConnection connection = null;
		InputStream is = null;
		InetAddress inetaddress = null;
		String responseContentType = null;
		try
		{
			String urlString = (String)JCCModelCommon.getApplicationConst(JDKStrConst.TN_URL);

			// URLをプロパティファイルから取得
			if(serviceMap.containsKey(JDKStrConst.CMD_URL)) {
				urlString = (String)serviceMap.get(JDKStrConst.CMD_URL);
			}

			urlString = urlString + URL_SUFIX.get(trace_kbn);

			// 電文を送信
			connection = tkConnectionFactory.getConnection(urlString);
			connection.setDoInput(true);
			connection.setDoOutput(true);
			connection.setReadTimeout(Integer.parseInt(JCCModelCommon.getApplicationConst("TN_SOAP_TIMEOUT")));

			connection.setRequestMethod(JDKCtrlTnInfoImpl.HTTP_REQUEST_METHOD);
			connection.setRequestProperty(JDKCtrlTnInfoImpl.CONTENT_TYPE, JDKCtrlTnInfoImpl.CONTENT_TYPE_VALUE);

			// chunkモードで送信するかどうかを判断するために、ダミーのストリームを生成する
			// あとで中身を取り出してサイズを確認後、ソケットにつながっているストリームに書き出す
			OutputStream os = new OutputStream () {
				private List<Integer> buffer = new ArrayList<Integer>();
				@Override
				public void write(int i) throws IOException {
					buffer.add(i);
				}
				public String toString() {
					byte bs [] = new byte[buffer.size()];
					int i = 0;
					for (Integer b : buffer) {
						bs[i++] = b.byteValue();
					}
					return new String(bs);
				}
				@Override
				public void close() throws IOException {
					super.close();
				}
			};

			this.write(serviceMap, os);
			String xml = os.toString();
//			if (xml.length() >= (32 * KB + 1))
//			{
//				connection.setRequestProperty("Transfer-Encoding", "chunked");
//				connection.setRequestProperty("chunk-size", String.valueOf(xml.length()) );
//			}

			byte [] bytes = xml.getBytes("UTF-8");
			OutputStream realOs = connection.getOutputStream();

//			realOs.write(bytes);
			
			int len=0;
			for (int i=0; i<bytes.length; i=i+SOCKET_SEND_SIZE) {
				len = (i+SOCKET_SEND_SIZE > bytes.length ? bytes.length-i: SOCKET_SEND_SIZE);
				realOs.write(bytes, i, len);
			}
			
//			for (byte data : bytes)
//			{
//				realOs.write(data);
//			}

			realOs.flush();
			realOs.close();
			
			connection.connect();

			// 電文の戻りを取得
			is = connection.getInputStream();

			inetaddress =  InetAddress.getLocalHost();
			responseContentType = connection.getHeaderField("Content-Type");
			
			// エラーレベルとリターンコードの情報を初期化
			errorLevel = "";
			returnCode = "";
			
			result = this.read(inetaddress.getHostName(), inetaddress.getHostAddress(), responseContentType, is);
			
			if (!"000".equals(errorLevel) || !"0000".equals(returnCode))
			{
				// エラーレベルもしくはリターンコードがオールゼロ以外の場合はエラーログに出力しておく
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーレベルもしくはリターンコードがオールゼロ以外");
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(13)：" + requestXml);
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(13)：" + responseXml);
			}
			
			return result;
		}
		catch(XMLStreamException e) 
		{
			result.put(JDKStrConst.CMD_RESULT_CD,"1");
			result.put(JDKStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(1)：" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(1)：" + requestXml);
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(1)：" + responseXml);
			return result;
		}
		catch(MalformedURLException e) 
		{
			result.put(JDKStrConst.CMD_RESULT_CD,"1");
			result.put(JDKStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(2)：" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(2)：" + requestXml);
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(2)：" + responseXml);
			return result;
		}
		catch (IOException e) 
		{
			result.put(JDKStrConst.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(JDKStrConst.CMD_RESULT_CD,"1");
						result.put(JDKStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());
						JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(3)：" + e.getMessage());
						JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(3)：" + requestXml);
						JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(3)：" + responseXml);
					}
				}
				catch(Exception ex) 
				{
					result.put(JDKStrConst.CMD_RESULT_CD,"1");
					result.put(JDKStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + ex.getMessage());
					JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(4)：" + e.getMessage());
					JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(4)：" + requestXml);
					JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(4)：" + responseXml);
					return result;
				}
			}
			if(result != null && result.get(JDKStrConst.CMD_ERROR_MESSAGE) != null )
			{
				result.put(JDKStrConst.CMD_RESULT_CD,"1");
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(5)：" + e.getMessage());
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(5)：" + requestXml);
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(5)：" + responseXml);
			}
			else 
			{
				result.put(JDKStrConst.CMD_RESULT_CD,"1");
				result.put(JDKStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(6)：" + e.getMessage());
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(6)：" + requestXml);
				JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(6)：" + responseXml);
			}
			return result;
		}
		catch (ParserConfigurationException e) 
		{
			result.put(JDKStrConst.CMD_RESULT_CD,"1");
			result.put(JDKStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(7)：" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(7)：" + requestXml);
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(7)：" + responseXml);
			return result;
		}
		catch (SAXException e) 
		{
			result.put(JDKStrConst.CMD_RESULT_CD,"1");
			result.put(JDKStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(8)：" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(8)：" + requestXml);
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(8)：" + responseXml);
			return result;
		}
		catch(Exception e) 
		{
			result.put(JDKStrConst.CMD_RESULT_CD,"1");
			result.put(JDKStrConst.CMD_ERROR_MESSAGE,"XML電文処理でエラーが発生しました。" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラーメッセージ(9)：" + e.getMessage());
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(9)：" + requestXml);
			JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(9)：" + responseXml);
			return result;
			
		}
	
	}
	

	
	/**
	 * 電文送信初期処理
	 * @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);
		
		// リクエストXML情報を退避させる
		requestXml = 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(JDKCtrlTnInfoImpl.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)
		{
			str = "";
		}
		
		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(JDKCtrlTnInfoImpl.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;
		
		this.writeStartSOAPElement("Header");
		
		// リクエストＩＤ
		this.writeStartElement("requestID");
		this.writeCharacters(EO_IFID.get(trace_kbn) + "_reqId" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));
		this.writeEndElement("requestID");
	
		// サービスＩＤ
		String serviceid = inContext == null ? 
				"DKSVTEST" : (String)inContext.getClientHashMapObjectByKey (AgentConstant.USECASE_ID_KEY);
		this.writeStartElement("serviceID");
		this.writeCharacters(serviceid);
		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(JDKCtrlTnInfo.OPERATORID)) 
		{
			this.writeStartElement(getSoapTagBySif(JDKCtrlTnInfo.OPERATORID));
			this.writeCharacters(convString(userData.get(JDKCtrlTnInfo.OPERATORID)));
			this.writeEndElement(getSoapTagBySif(JDKCtrlTnInfo.OPERATORID));
		}

		// operateDateTime
		if(userData.containsKey(JDKCtrlTnInfo.OPERATEDATETIME)) 
		{
			this.writeStartElement(getSoapTagBySif(JDKCtrlTnInfo.OPERATEDATETIME));
			this.writeCharacters(convString(userData.get(JDKCtrlTnInfo.OPERATEDATETIME)));
			this.writeEndElement(getSoapTagBySif(JDKCtrlTnInfo.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_DKA0001.equals(trace_kbn))
		{
			this.traceDKA0001(map);
		}
		else if(TRACE_KBN_DKA0002.equals(trace_kbn))
		{
			this.traceDKA0002(map);
		}
		else if(TRACE_KBN_DKA0003.equals(trace_kbn))
		{
			this.traceDKA0003(map);
		}
		else if(TRACE_KBN_DKA0004.equals(trace_kbn))
		{
			this.traceDKA0004(map);
		}
		else if(TRACE_KBN_DKA0005.equals(trace_kbn))
		{
			this.traceDKA0005(map);
		}
		else if(TRACE_KBN_DKA0006.equals(trace_kbn))
		{
			this.traceDKA0006(map);
		}
		else if(TRACE_KBN_DKA0007.equals(trace_kbn))
		{
			this.traceDKA0007(map);
		}
		else if(TRACE_KBN_DKA0008.equals(trace_kbn))
		{
			this.traceDKA0008(map);
		}
		else if(TRACE_KBN_DKA0009.equals(trace_kbn))
		{
			this.traceDKA0009(map);
		}
		else if(TRACE_KBN_DKA0010.equals(trace_kbn))
		{
			this.traceDKA0010(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 getSoapTagBySif(String obj) 
	{
		Map<String, String> translation = ifToTk.get(trace_kbn);
		if (translation.containsKey(obj.toString()))
		{
			return translation.get(obj.toString());
		}
		return obj.toString();
	}
	
	/**
	 * Soap項目名から項目名を取得します。
	 * 
	 * @param obj　Soap項目名
	 * @return 項目名
	 */
	private String getMapName(String obj) 
	{
		Map<String, String> translation = tkToIf.get(trace_kbn);
		if (translation.containsKey(obj.toString()))
		{
			return translation.get(obj.toString());
		}
		return obj.toString();
	}
	

	/**
	 * 宅内機器一覧照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	private void traceDKA0001(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);
		
		List<Map> maps = (List<Map>)serviceMap.get(EDKA0010001CBSMsg.EDKA0010001CONDITIONLIST);
		for (Map map : maps)
		{
			this.writeStartElement(CONDITION);
			writeTagsIfExists(map, EDKA0010001ConditionList.KEY_KRIPLACE_SKCD
								 , EDKA0010001ConditionList.KEY_KNRI_PLC_CD
								 , EDKA0010001ConditionList.KEY_KNRI_PLC_SLF_CD
								 , EDKA0010001ConditionList.KEY_TK_MDL_CD
								 , EDKA0010001ConditionList.KEY_KK_SEIZO_NO_FROM
								 , EDKA0010001ConditionList.KEY_KK_SEIZO_NO_TO
								 , EDKA0010001ConditionList.KEY_VER_FROM
								 , EDKA0010001ConditionList.KEY_VER_TO
								 , EDKA0010001ConditionList.KEY_MAX_STKU_CNT);
			
			this.writeEndElement(CONDITION);
		}

	}

	/**
	 * 宅内機器一意照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0002(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);

		this.writeStartElement(RECORD);
		this.writeStartElement(CONDITION);
		
		writeTagsIfExists(serviceMap, EDKA0010002CBSMsg.KEY_SHORI_DIV
									, EDKA0010002CBSMsg.KEY_KNRI_PLC_SKBT_CD
									, EDKA0010002CBSMsg.KEY_KNRI_PLC_CD
									, EDKA0010002CBSMsg.KEY_KNRI_PLC_SLF_CD
									, EDKA0010002CBSMsg.KEY_TK_MDL_CD
									, EDKA0010002CBSMsg.KEY_TAKNKIKI_SETHIN_MODEL_CD
									, EDKA0010002CBSMsg.KEY_TAKNKIKI_SETHIN_NO
									, EDKA0010002CBSMsg.KEY_KIKI_SEIZO_NO
									, EDKA0010002CBSMsg.KEY_GDS_STAT_CD
		);

		this.writeEndElement(CONDITION);
		this.writeEndElement(RECORD);
	}
	
	/**
	 * 機器出荷情報更新の電文を組み立てます。
	 * STB情報更新
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0003(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);

		List<Map> maps = (List<Map>)serviceMap.get(EDKA0010003CBSMsg.EDKA0010003CBSMSG1LIST);
		for (Map map : maps)
		{
			
			String seizoNo = (String) map.get(EDKA0010003CBSMsg1List.KEY_KK_SEIZO_NO);
			
			// 製番なし機器の場合は「機器」のタグを作らない
			if (!"".equals(seizoNo))
			{
				// 製番あり機器の場合
				writeStartElement(RECORD);
				writeStartElement(CONDITION);
				
				writeTag(RECORD_DIV, "1");
	
				writeTagsIfExists(map, EDKA0010003CBSMsg1List.KEY_TK_MDL_CD
									, EDKA0010003CBSMsg1List.KEY_KK_SEIZO_NO
									);
				writeEndElement(CONDITION);
				writeStartElement(UPDATE);
				
				writeTagsIfExists(map, EDKA0010003CBSMsg1List.SHOYU_CD);
				
				// 配送先工事会社コード
				String hisosKocompCd = (String) map.get(EDKA0010003CBSMsg1List.HISOS_KOCOMP_CD);
				if ("".equals(hisosKocompCd))
				{
					// お客様直送の場合
					writeTag("KNRI_PLC_SKBT_CD", "");
					writeTag("KNRI_PLC_CD", "");
					writeTag("KNRI_PLC_SLF_CD", "");
					writeTagsIfExists(map, EDKA0010003CBSMsg1List.JOI_TK_MDL_CD
							, EDKA0010003CBSMsg1List.JOI_KK_SEIZO_NO
					);
					
					writeTag("KJAK_NO", "");
					writeTag("TCASE_NO", "");
				}
				else
				{
					// 工事会社配送の場合
					writeTag("KNRI_PLC_SKBT_CD", "2");
					writeTag("KNRI_PLC_CD", hisosKocompCd);
					writeTag("KNRI_PLC_SLF_CD", "000");
					
					writeTagsIfExists(map, EDKA0010003CBSMsg1List.JOI_TK_MDL_CD
							, EDKA0010003CBSMsg1List.JOI_KK_SEIZO_NO
							, EDKA0010003CBSMsg1List.KJAK_NO
							, EDKA0010003CBSMsg1List.TCASE_NO
					);
				}
				
				writeTagsIfExists(map, EDKA0010003CBSMsg1List.KKTK_SBT_CD
						, EDKA0010003CBSMsg1List.SETPLACE_NO
						, EDKA0010003CBSMsg1List.SOKO_SHKA_YMD
						, EDKA0010003CBSMsg1List.SVC_KEI_NO
				);
				
				writeEndElement(UPDATE);
				writeEndElement(RECORD);
			}
			
			String jzaikoNum = ((String) map.get(EDKA0010003CBSMsg1List.JZAIKO_NUM)).replace("-", "");
			String haisoUkJuchuNum = ((String) map.get(EDKA0010003CBSMsg1List.HAISO_UK_JUCHU_NUM)).replace("-", "");
			String tjituHaisoShkaNum = (String) map.get(EDKA0010003CBSMsg1List.TJITU_HAISO_SHKA_NUM);
			
			if ("0".equals(jzaikoNum) && "0".equals(haisoUkJuchuNum) && "0".equals(tjituHaisoShkaNum))
			{
				continue;
			}
			else
			{
				writeStartElement(RECORD);
				writeStartElement(CONDITION);
				writeTag(RECORD_DIV, "2");
				writeTagsIfExists(map, EDKA0010003CBSMsg1List.KNRI_PLC_SKBT_CD
										, EDKA0010003CBSMsg1List.KNRI_PLC_CD
										, EDKA0010003CBSMsg1List.KNRI_PLC_SLF_CD
									);
				writeTag("TK_MDL_CD", map.get(EDKA0010003CBSMsg1List.KEY_TK_MDL_CD).toString());
				writeEndElement(CONDITION);
				writeStartElement(UPDATE);
				writeTagsIfExists(map, EDKA0010003CBSMsg1List.JZAIKO_NUM
									, EDKA0010003CBSMsg1List.HAISO_UK_JUCHU_NUM
									, EDKA0010003CBSMsg1List.TJITU_HAISO_SHKA_NUM
				);
				writeEndElement(UPDATE);
				writeEndElement(RECORD);
			}
		}
	}
	/**
	 * グループID一覧照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0004(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);

		List<Map> map1s = (List<Map>)serviceMap.get(EDKA0010004CBSMsg.EDKA0010004CBSMSG1LIST);
		List<Map> map2s = (List<Map>)serviceMap.get(EDKA0010004CBSMsg.EDKA0010004CBSMSG2LIST);
		for (int i = 0;i < map1s.size();i++)
		{
			Map map1 = map1s.get(i);
			
			writeStartElement(RECORD);
			writeStartElement(CONDITION);
			writeTag(RECORD_DIV, "1");

			writeTagsIfExists(map1, EDKA0010004CBSMsg1List.KEY_TRN_DIV
					, EDKA0010004CBSMsg1List.KEY_TRN_PTN
					, EDKA0010004CBSMsg1List.KEY_IDO_KBN
					, EDKA0010004CBSMsg1List.KEY_TRKS_KBN
					, EDKA0010004CBSMsg1List.KEY_TK_MDL_CD
					, EDKA0010004CBSMsg1List.KEY_KK_SEIZO_NO
					, EDKA0010004CBSMsg1List.KEY_KNRI_PLC_SKBT_CD
					, EDKA0010004CBSMsg1List.KEY_KNRI_PLC_CD
					, EDKA0010004CBSMsg1List.KEY_KNRI_PLC_SLF_CD
					, EDKA0010004CBSMsg1List.KEY_GDS_STAT_CD
					, EDKA0010004CBSMsg1List.KEY_NUM
					, EDKA0010004CBSMsg1List.KEY_SLF_MV_LOT_NO
					, EDKA0010004CBSMsg1List.KEY_KIHON_UPD_DTTM
								);
			writeEndElement(CONDITION);
			writeStartElement(UPDATE);
			writeTagsIfExists(map1, EDKA0010004CBSMsg1List.SLF_MV_RSV_FLG
								, EDKA0010004CBSMsg1List.SLF_MV_LOT_NO
								, EDKA0010004CBSMsg1List.KNRI_PLC_SKBT_CD
								, EDKA0010004CBSMsg1List.KNRI_PLC_CD
								, EDKA0010004CBSMsg1List.KNRI_PLC_SLF_CD
								, EDKA0010004CBSMsg1List.YOBI_GDS_FLG
								, EDKA0010004CBSMsg1List.SOKO_SHKA_YMD
								, EDKA0010004CBSMsg1List.GDS_STAT_CD
			);
			writeEndElement(UPDATE);
			writeEndElement(RECORD);

		}
		for (int i = 0;i < map2s.size();i++)
		{
			Map map2 = map2s.get(i);
			
			writeStartElement(RECORD);
			writeStartElement(CONDITION);
			writeTag(RECORD_DIV, "2");
			writeTagsIfExists(map2, EDKA0010004CBSMsg2List.KEY_KNRI_PLC_SKBT_CD_BTRY_ZIK
									, EDKA0010004CBSMsg2List.KEY_KNRI_PLC_CD_BTRY_ZIK
									, EDKA0010004CBSMsg2List.KEY_KNRI_PLC_SLF_CD_BTRY_ZIK
									, EDKA0010004CBSMsg2List.KEY_TK_MDL_CD_BTRY_ZIK
									, EDKA0010004CBSMsg2List.KEY_GDS_STAT_CD_BTRY_ZIK
								);
			writeEndElement(CONDITION);
			writeStartElement(UPDATE);
			writeTagsIfExists(map2, EDKA0010004CBSMsg2List.JZAIKO_NUM
					, EDKA0010004CBSMsg2List.YBKKHAI_SJI_NUM
					, EDKA0010004CBSMsg2List.SLF_MV_SJI_NUM
					, EDKA0010004CBSMsg2List.YBKKHAI_CHU_NUM
					, EDKA0010004CBSMsg2List.SLF_MV_NYUKA_FIN_NUM
					, EDKA0010004CBSMsg2List.SLF_MV_SHKA_FIN_NUM
					, EDKA0010004CBSMsg2List.YOBI_KKSHKA_FIN_NUM
			);
			writeEndElement(UPDATE);
			writeEndElement(RECORD);
		}
	}

	/**
	 * グループID一覧照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0005(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);

		List<Map> map1s = (List<Map>)serviceMap.get(EDKA0010005CBSMsg.EDKA0010005CBSMSG1LIST);
		List<Map> map2s = (List<Map>)serviceMap.get(EDKA0010005CBSMsg.EDKA0010005CBSMSG2LIST);
		for (Map map1 : map1s)
		{
			writeStartElement(RECORD);
			writeStartElement(CONDITION);
			writeTag(RECORD_DIV, "1");
			
			writeTagsIfExists(map1, EDKA0010005CBSMsg1List.KEY_TK_MDL_CD
								, EDKA0010005CBSMsg1List.KEY_KK_SEIZO_NO
								, EDKA0010005CBSMsg1List.KEY_KIHON_UPD_DTTM
					);
			
			writeEndElement(CONDITION);
			writeStartElement(UPDATE);
			
			writeTagsIfExists(map1, EDKA0010005CBSMsg1List.GDS_STAT_CD
								, EDKA0010005CBSMsg1List.SHOYU_CD
								, EDKA0010005CBSMsg1List.KNRI_PLC_SKBT_CD
								, EDKA0010005CBSMsg1List.KNRI_PLC_CD
								, EDKA0010005CBSMsg1List.KNRI_PLC_SLF_CD
								, EDKA0010005CBSMsg1List.KKTK_SBT_CD
			);
			
			writeEndElement(UPDATE);
			writeEndElement(RECORD);
		}
		for (Map map2 : map2s)
		{
			writeStartElement(RECORD);
			writeStartElement(CONDITION);
			writeTag(RECORD_DIV, "2");
			
			writeTagsIfExists(map2, EDKA0010005CBSMsg2List.KEY_GDS_STAT_CD
								, EDKA0010005CBSMsg2List.KEY_KNRI_PLC_SKBT_CD
								, EDKA0010005CBSMsg2List.KEY_KNRI_PLC_CD
								, EDKA0010005CBSMsg2List.KEY_KNRI_PLC_SLF_CD
								, EDKA0010005CBSMsg2List.KEY_TK_MDL_CD_BTRY_ZIK
			);
			
			writeEndElement(CONDITION);
			writeStartElement(UPDATE);
			
			writeTagsIfExists(map2, EDKA0010005CBSMsg2List.JZAIKO_NUM
								, EDKA0010005CBSMsg2List.TJITU_DSL_TK_HMPIN_NUM
								, EDKA0010005CBSMsg2List.TJITU_TRB_KOKAN_HMPIN_NUM
			);
			
			writeEndElement(UPDATE);
			writeEndElement(RECORD);
		}
	}

	/**
	 * グループID一覧照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0006(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);

		List<Map> map1s = (List<Map>)serviceMap.get(EDKA0010006CBSMsg.EDKA0010006CBSMSG1LIST);
		List<Map> map2s = (List<Map>)serviceMap.get(EDKA0010006CBSMsg.EDKA0010006CBSMSG2LIST);

		if (map1s.size() > 0)
		{
			for (Map map1 : map1s)
			{
				writeStartElement(RECORD);
				writeStartElement(CONDITION);
				writeTag(RECORD_DIV, "1");
				writeTagsIfExists(map1, EDKA0010006CBSMsg1List.KEY_TK_MDL_CD
									, EDKA0010006CBSMsg1List.KEY_KK_SEIZO_NO
									, EDKA0010006CBSMsg1List.KEY_KIHON_UPD_DTTM
				);

				writeEndElement(CONDITION);
				writeStartElement(UPDATE);

				writeTagsIfExists(map1, EDKA0010006CBSMsg1List.KNRI_PLC_SKBT_CD
										, EDKA0010006CBSMsg1List.KNRI_PLC_CD
										, EDKA0010006CBSMsg1List.KNRI_PLC_SLF_CD
										, EDKA0010006CBSMsg1List.GDS_STAT_CD
										, EDKA0010006CBSMsg1List.KKTK_SBT_CD
										, EDKA0010006CBSMsg1List.SHOYU_CD
										, EDKA0010006CBSMsg1List.SETPLACE_NO
										, EDKA0010006CBSMsg1List.SOKO_SHKA_YMD
										, EDKA0010006CBSMsg1List.SVC_KEI_NO
				);

				writeEndElement(UPDATE);
				writeEndElement(RECORD);
			}
		}

		for (Map map2 : map2s)
		{
			String jzaikoCnt = (String) map2.get(EDKA0010006CBSMsg2List.JZAIKO_CNT);
			String haisoUkJuchuCnt = (String) map2.get(EDKA0010006CBSMsg2List.HAISO_UK_JUCHU_CNT);
			String shelfMvSjiCnt = (String) map2.get(EDKA0010006CBSMsg2List.SHELF_MV_SJI_CNT);
			String tjituNyukaCnt = (String) map2.get(EDKA0010006CBSMsg2List.TJITU_NYUKA_CNT);
			String tjituHaisoShkaCnt = (String) map2.get(EDKA0010006CBSMsg2List.TJITU_HAISO_SHKA_CNT);
			String tjituTrbKokanHmpinCnt = (String) map2.get(EDKA0010006CBSMsg2List.TJITU_TRB_KOKAN_HMPIN_CNT);
			String shelfMvNykaFinCnt = (String) map2.get(EDKA0010006CBSMsg2List.SHELF_MV_NYKA_FIN_CNT);
			String shelfMvShkaFinCnt = (String) map2.get(EDKA0010006CBSMsg2List.SHELF_MV_SHKA_FIN_CNT);

			if ("0".equals(jzaikoCnt) && "0".equals(haisoUkJuchuCnt) && "0".equals(shelfMvSjiCnt) 
				&& "0".equals(tjituNyukaCnt) && "0".equals(tjituHaisoShkaCnt) && "0".equals(tjituTrbKokanHmpinCnt) 
				&& "0".equals(shelfMvNykaFinCnt) && "0".equals(shelfMvShkaFinCnt))
			{
				continue;
			}
			else
			{
				writeStartElement(RECORD);
				writeStartElement(CONDITION);
				writeTag(RECORD_DIV, "2");
				writeTagsIfExists(map2, EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SKBT_CD
									, EDKA0010006CBSMsg2List.KEY_KNRI_PLC_CD
									, EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SLF_CD
									, EDKA0010006CBSMsg2List.KEY_TK_MDL_CD_BTRY_ZIK
									, EDKA0010006CBSMsg2List.KEY_GDS_STAT_CD
				);

				writeEndElement(CONDITION);
				writeStartElement(UPDATE);

				writeTagsIfExists(map2, EDKA0010006CBSMsg2List.JZAIKO_CNT
										, EDKA0010006CBSMsg2List.HAISO_UK_JUCHU_CNT
										, EDKA0010006CBSMsg2List.SHELF_MV_SJI_CNT
										, EDKA0010006CBSMsg2List.TJITU_NYUKA_CNT
										, EDKA0010006CBSMsg2List.TJITU_HAISO_SHKA_CNT
										, EDKA0010006CBSMsg2List.TJITU_TRB_KOKAN_HMPIN_CNT
										, EDKA0010006CBSMsg2List.SHELF_MV_NYKA_FIN_CNT
										, EDKA0010006CBSMsg2List.SHELF_MV_SHKA_FIN_CNT
				);
				writeEndElement(UPDATE);
				writeEndElement(RECORD);
			}
		}
	}

	/**
	 * グループID一覧照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0007(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);
		List<Map> maps = (List<Map>)serviceMap.get(EDKA0010007CBSMsg.EDKA0010007CBSMSG1LIST);

		for (Map map : maps)
		{
			writeStartElement(RECORD);
			writeStartElement(CONDITION);
			writeTagsIfExists(map, EDKA0010007CBSMsg1List.KEY_TK_MDL_CD
								, EDKA0010007CBSMsg1List.KEY_KK_SEIZO_NO
								, EDKA0010007CBSMsg1List.KEY_KIHON_UPD_DTTM
			);
			writeEndElement(CONDITION);
	
			writeStartElement(UPDATE);
			writeTagsIfExists(map, EDKA0010007CBSMsg1List.VER);
			writeEndElement(UPDATE);
			writeEndElement(RECORD);
		}
	}

	/**
	 * グループID一覧照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0008(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);
		List<Map> maps = (List<Map>)serviceMap.get(EDKA0010008CBSMsg.EDKA0010008CONDITIONLIST);

		for (Map map : maps)
		{
			writeStartElement(RECORD);
			writeStartElement(CONDITION);
			writeTagsIfExists(map, EDKA0010008ConditionList.KEY_TRN_DIV
								 , EDKA0010008ConditionList.KEY_TK_MDL_CD
								 , EDKA0010008ConditionList.KEY_KK_SEIZO_NO
								 , EDKA0010008ConditionList.KEY_TAKNKIKI_SETHIN_MODEL_CD
								 , EDKA0010008ConditionList.KEY_TAKNKIKI_SETHIN_NO
			);
			writeEndElement(CONDITION);
			writeEndElement(RECORD);
		}
	}

	/**
	 * グループID一覧照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0009(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);
		List<Map> maps = (List<Map>)serviceMap.get(EDKA0010009CBSMsg.EDKA0010009CONDITIONLIST);

		for (Map map : maps)
		{
			writeStartElement(RECORD);
			writeStartElement(CONDITION);
			writeTagsIfExists(map, EDKA0010009ConditionList.KEY_TRN_DIV
								, EDKA0010009ConditionList.KEY_TK_MDL_CD
								, EDKA0010009ConditionList.KEY_KIKI_SEIZO_NO
								, EDKA0010009ConditionList.KEY_TAKNKIKI_SETHIN_MODEL_CD
								, EDKA0010009ConditionList.KEY_TAKNKIKI_SETHIN_NO
			);
			writeEndElement(CONDITION);
			writeEndElement(RECORD);
		}
	}

	/**
	 * グループID一覧照会の電文を組み立てます。
	 * 
	 * @param serviceMap
	 * @throws XMLStreamException
	 */
	@SuppressWarnings("unchecked")
	private void traceDKA0010(Map<Object, Object>serviceMap) 
	throws XMLStreamException
	{
		this.writer.setPrefix(JDKCtrlTnInfoImpl.BODY_PREFIX, JDKCtrlTnInfoImpl.BODY_NAMESPACE);

		writeStartElement(RECORD);
		writeStartElement(CONDITION);
		writeTagsIfExists(serviceMap, EDKA0010010CBSMsg.KEY_TK_MDL_CD
									, EDKA0010010CBSMsg.KEY_KK_SEIZO_NO
									, EDKA0010010CBSMsg.KEY_TAKNKIKI_SETHIN_MODEL_CD
									, EDKA0010010CBSMsg.KEY_TAKNKIKI_SETHIN_NO
									, EDKA0010010CBSMsg.KEY_STB_ID
									, EDKA0010010CBSMsg.SHOW_CNT
									, EDKA0010010CBSMsg.PAGE_NO
		);
		writeEndElement(CONDITION);
		writeEndElement(RECORD);
	}
	

	/**
	 * 値があればタグを出力します
	 * @param map 引数のマップ
	 * @param key map上のキー
	 */
	private void writeTagsIfExists(Map map, String...keies) throws XMLStreamException
	{
		for (String key: keies)
		{
			writeTagIfExists(map, key);
		}
	}
	/**
	 * 値があればタグを出力します
	 * @param map 引数のマップ
	 * @param key map上のキー
	 */
	private void writeTagIfExists(Map map, String key) throws XMLStreamException
	{
		if (!map.containsKey(key))
		{
			return;
		}

		writeTag(getSoapTagBySif(key), convString(map.get(key)));
	}
	
	/**
	 * 任意のタグを出力します
	 * @param nodeName ノード名
	 * @param text テキスト
	 * @throws XMLStreamException 例外
	 */
	private void writeTag(String nodeName, String text) throws XMLStreamException 
	{
		this.writeStartElement(nodeName);
		this.writeCharacters(text);
		this.writeEndElement(nodeName);
	}

	/**
	 * 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(getSoapTagBySif(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(getSoapTagBySif(key));
			}
		}
		this.writeEndElement(getSoapTagBySif(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(getSoapTagBySif(key));
				this.writeCharacters(convString(map.get(key)));
				this.writeEndElement(getSoapTagBySif(key));
			}
		}
		this.writeEndElement(getSoapTagBySif(parent));
	}

	/**
	 * 配列null時の要素を設定する。
	 * 
	 * @param parent 親要素名
	 * @throws XMLStreamException
	 */
	private void traceArrayOfNull(String parent) 
	throws XMLStreamException
	{
		this.writeEmptyElement(JDKCtrlTnInfoImpl.XSL_PREFIX, parent, JDKCtrlTnInfoImpl.XSL_PREFIX);
		this.writeAttribute("xsl:nil", "true");
		this.writeNamespace(JDKCtrlTnInfoImpl.XSL_PREFIX, JDKCtrlTnInfoImpl.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();
		
		
		// コンテントタイプから、encoding指定を得る。
		String xml = new String(contents, charSet);
		JSYejbLog.outlog(null, JSYejbLog.DEBUG, this.getClass(), xml);
		StringReader reader = new StringReader(xml);
		
		// レスポンスXML情報を退避させる
		responseXml = xml;
		
		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 rootNode,boolean rootflag) 
	{
		Node node = rootNode.getFirstChild();
		Hashtable<Object, Object> resultMap = null;
		
		
		ArrayList<Map<Object, Object>>Bodynodelist = new ArrayList<Map<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 childname = "";
				NodeList nodelist = node.getChildNodes();
				if(nodelist != null)
				{
					for(int i = 0; i < nodelist.getLength(); i++)
					{
						Node child = nodelist.item(i);
						
						// エラーレベルとリターンコードを退避させる
						if ("errorLevel".equals(nodename))
						{
							errorLevel = child.getNodeValue();
						}
						else if ("returnCode".equals(nodename))
						{
							returnCode = child.getNodeValue();
						}
						
						if(child.getNodeType() == Node.ELEMENT_NODE)
						{
							childname = child.getLocalName();
							break;
						}
					}
				}

				// SOAP例外の場合
				if(JDKCtrlTnInfoImpl.SOAP_FAULT.equals(nodename.toLowerCase()) || JDKCtrlTnInfoImpl.SOAP_FAULT.equals(childname.toLowerCase()))
				{
					resultMap = new Hashtable<Object, Object>();
					String faultinfo = analyzeFaultXml(node);
					resultMap.put(JDKStrConst.CMD_RESULT_CD,"1");
					resultMap.put(JDKStrConst.CMD_ERROR_MESSAGE,faultinfo);	
					JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "エラー情報(10)：" + faultinfo);
					JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(10)：" + requestXml);
					JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(10)：" + responseXml);
					return resultMap;
				}
				
				if(resultMap == null) {
					resultMap = new Hashtable<Object, Object>();
				}
				Hashtable<Object, Object>resultinfo = analyzeResultXml(node);
				List<Hashtable<Object, Object>> conditionOrUpdate = mapFromConditionOrUpdate(node);

				resultMap.put(JDKStrConst.CMD_RESULT_CD,"0");
				if((nodename.equals("Body") &&  !childname.equals("record"))
						|| nodename.equals("record"))
				{
					JSYejbLog.outlog(inContext, JSYejbLog.EXECUTION , this.getClass(), node.getLocalName() + "：" + resultinfo);
					if (resultinfo.size() > 0)
					{
						Bodynodelist.add(resultinfo);
					}
					if (conditionOrUpdate.size() > 0)
					{
						Bodynodelist.addAll(conditionOrUpdate);
					}
					
					if(trace_kbn.equals(TRACE_KBN_DKA0001))
					{
						resultMap.put(EDKA0010001CBSMsg.EDKA0010001CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0002))
					{
						resultMap.put(EDKA0010002CBSMsg.EDKA0010002CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0003))
					{
						resultMap.put(EDKA0010003CBSMsg.EDKA0010003CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0004))
					{
						resultMap.put(EDKA0010004CBSMsg.EDKA0010004CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0005))
					{
						resultMap.put(EDKA0010005CBSMsg.EDKA0010005CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0006))
					{
						resultMap.put(EDKA0010006CBSMsg.EDKA0010006CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0007))
					{
						resultMap.put(EDKA0010007CBSMsg.EDKA0010007CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0008))
					{
						resultMap.put(EDKA0010008CBSMsg.EDKA0010008CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0009))
					{
						resultMap.put(EDKA0010009CBSMsg.EDKA0010009CBSMSG1LIST,Bodynodelist);
					}
					if(trace_kbn.equals(TRACE_KBN_DKA0010))
					{
						resultMap.put(EDKA0010010CBSMsg.EDKA0010010CBSMSG1LIST,Bodynodelist);
					}
					else
					{
						if(node.getFirstChild() != null)
						{
							Hashtable<Object, Object> child = analyzeXml(node,false);
							if (child != null)
							{
								Enumeration keys = child.keys();
								while(keys.hasMoreElements())
								{
									String key = (String)keys.nextElement();
									resultMap.put(key, child.get(key));
								}
							}
						}
					}
				}
				else if(nodename.equals("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"))
				{
					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)
					{
						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");
						}
						JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(11)：" + requestXml);
						JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(11)：" + responseXml);
					}
				}
			}
			node = node.getNextSibling();
		}
		
		if(rootflag && resultMap == null)
		{
			resultMap = new Hashtable<Object, Object>();
			resultMap.put(JDKStrConst.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(JDKCtrlTnInfoImpl.SOAP_FAULT_CODE.equals(nodename.toLowerCase())) {
					
//					list.add(node.getTextContent());
					Node child = node.getFirstChild();
					if(child != null)
					{
						errmsg = errmsg + "エラーコード：" + child.getTextContent();
					}
				}
				if(JDKCtrlTnInfoImpl.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) {

			if(node.getNodeType() == Node.ELEMENT_NODE) 
			{
				String nodename = node.getLocalName();
				String elementString = this.getMapName(nodename);
				
				if (nodename.equals("condition") || nodename.equals("update"))
				{
					node = node.getNextSibling();
					continue;
				}

				if(elementString != null) {
					result.put(elementString,node.getTextContent());
				}
				
				if(node.getAttributes().getNamedItem("err") != null)
				{
					String strErr = node.getAttributes().getNamedItem("err").getTextContent();
					int intErr = Integer.parseInt(strErr.substring(1));
					if (ifErr.get(trace_kbn).containsKey(nodename) )
					{
						String ifNodename = ifErr.get(trace_kbn).get(nodename).toLowerCase() + "_err";
						if(intErr == 1)
						{
							result.put(ifNodename, "E1");
						}
						else if(intErr <= 52)
						{
							result.put(ifNodename, "E2");
						}
						else if(intErr <= 55)
						{
							result.put(ifNodename, "E3");
						}
						else
						{
							result.put(ifNodename, "EA");
						}
						JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "リクエストXML(12)：" + requestXml);
						JSYejbLog.outlog(null, JSYejbLog.ERROR, JDKModelCommon.class, "レスポンスXML(12)：" + responseXml);
					}
				}
			}
			
			node = node.getNextSibling();
		}
		return result;
	}
	
	/**
	 * conditionとupdateを取得します
	 */
	private List<Hashtable<Object, Object>> mapFromConditionOrUpdate(Node record)
	{
		List<Hashtable<Object, Object>> list = new ArrayList<Hashtable<Object,Object>>();
		
		Node node = record.getFirstChild();
		while(node != null)
		{
			String nodeName = node.getLocalName();
			if ("condition".equals(nodeName) || "update".equals(nodeName))
			{
				list.add(analyzeResultXml(node));
			}

			node = node.getNextSibling();
		}
		
		return list;
	}


	@SuppressWarnings("unchecked")
	@Override
	public Map ctrlTnInfo_DKA0001(Map serviceMap) throws Exception{
		return this.ctrlTnInfo_DKA0001(serviceMap,null);
	}

	@SuppressWarnings("unchecked")
	@Override
	public Map ctrlTnInfo_DKA0001(Map serviceMap, Connection con) throws Exception{
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0001);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0002(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0002(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0002(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0002);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0003(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0003(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0003(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0003);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0004(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0004(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0004(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0004);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0005(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0005(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0005(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0005);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0006(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0006(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0006(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0006);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0007(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0007(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0007(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0007);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0008(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0008(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0008(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0008);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0009(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0009(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0009(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0009);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0010(Map serviceMap) throws Exception {
		return this.ctrlTnInfo_DKA0010(serviceMap,null);
	}
	@Override
	@SuppressWarnings("unchecked")
	public Map ctrlTnInfo_DKA0010(Map serviceMap,Connection con) throws Exception {
		JDKCtrlTnInfoImpl me = new JDKCtrlTnInfoImpl();
		me.setInContext(inContext);
		return me.execute(serviceMap, TRACE_KBN_DKA0010);
	}

	@Override
	public void setConnection(Connection con) {
	}

}
